end Bounty noncomputable section /- # Green 24: packed single-file candidate — full verification pending Riley Sturgill — rileysturgill1@gmail.com AI assistance: OpenAI ChatGPT/Codex assisted with the mathematics, certificate generation,Lean formalization,verification,and presentation. Original source attributions and licenses are retained below. This candidate inlines the exact Bounty.target and all its project dependencies. Its numerical data are decoded by ordinary total Lean functions and must pass the proved checker. No external certificate file is required. The packed checker has passed representative tests. See the accompanying reports for current size,policy,and verification results. Submission readiness requires a successful whole-file Lean check and the pinned validator checks. The original 300 MB file and its running check are preserved separately. -/ section namespace Green24Proof noncomputable def rho (x y:ℝ):ℝ := if max x y ≤ 3 * min x y then (x - y) ^ 2 / 4 else x * y - 2 * (min x y) ^ 2 theorem rho_comm (x y:ℝ):rho x y = rho y x:=by unfold rho rw [max_comm y x,min_comm y x] split_ifs <;> ring theorem rho_eq_balanced {x y:ℝ} (hyx:y ≤ x) (hxy:x ≤ 3 * y) : rho x y = (x - y) ^ 2 / 4:=by simp only [rho,max_eq_left hyx,min_eq_right hyx,if_pos hxy] theorem rho_eq_unbalanced {x y:ℝ} (hyx:y ≤ x) (hxy:3 * y ≤ x) : rho x y = x * y - 2 * y ^ 2:=by simp only [rho,max_eq_left hyx,min_eq_right hyx] split_ifs with h · have:x = 3 * y:=le_antisymm h hxy rw [this] ring · rfl private def zz1:"s0001"="s0001":=by decide+kernel theorem rho_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y):0 ≤ rho x y:=by unfold rho split_ifs with h · positivity · rcases le_total x y with hxy | hyx · rw [max_eq_right hxy,min_eq_left hxy] at h rw [min_eq_left hxy] have hprod:=mul_nonneg hx (by linarith:0 ≤ y - 2 * x) nlinarith · rw [max_eq_left hyx,min_eq_right hyx] at h rw [min_eq_right hyx] have hprod:=mul_nonneg hy (by linarith:0 ≤ x - 2 * y) nlinarith theorem rho_self {x:ℝ} (hx:0 ≤ x):rho x x = 0:=by rw [rho_eq_balanced (le_refl x) (by linarith)] ring theorem rho_zero {x:ℝ} (hx:0 ≤ x):rho x 0 = 0:=by rw [rho_eq_unbalanced hx (by simpa using hx)] ring theorem rho_zero_left {x:ℝ} (hx:0 ≤ x):rho 0 x = 0:=by rw [rho_comm,rho_zero hx] private def zz2:"s0002"="s0002":=by decide+kernel theorem rho_positive_part_identity {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 4 * rho x y = (x - y) ^ 2 - max (x - 3 * y) 0 ^ 2 - max (y - 3 * x) 0 ^ 2:=by rcases le_total y x with hyx | hxy · have hy3x:y - 3 * x ≤ 0:=by linarith rw [max_eq_right hy3x] by_cases h:x ≤ 3 * y · rw [rho_eq_balanced hyx h,max_eq_right (by linarith:x - 3 * y ≤ 0)] ring · rw [rho_eq_unbalanced hyx (le_of_not_ge h), max_eq_left (by linarith:0 ≤ x - 3 * y)] ring · have hx3y:x - 3 * y ≤ 0:=by linarith rw [rho_comm,max_eq_right hx3y] by_cases h:y ≤ 3 * x · rw [rho_eq_balanced hxy h,max_eq_right (by linarith:y - 3 * x ≤ 0)] ring · rw [rho_eq_unbalanced hxy (le_of_not_ge h), max_eq_left (by linarith:0 ≤ y - 3 * x)] ring noncomputable def energy {ι:Type*} [Fintype ι] (u:ι → ℝ):ℝ := (∑ i, ∑ j,rho (u i) (u j)) / 2 theorem energy_nonneg {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i):0 ≤ energy u:=by unfold energy exact div_nonneg (Finset.sum_nonneg fun i _ => Finset.sum_nonneg fun j _ => rho_nonneg (hu i) (hu j)) (by norm_num) theorem energy_sum_identity {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) : 4 * energy u = (Fintype.card ι:ℝ) * (∑ i,u i ^ 2) - (∑ i,u i) ^ 2 - ∑ i, ∑ j,max (u i - 3 * u j) 0 ^ 2:=by have hid:=Finset.sum_congr rfl (fun i (_:i ∈ (Finset.univ:Finset ι)) => Finset.sum_congr rfl (fun j (_:j ∈ (Finset.univ:Finset ι)) => rho_positive_part_identity (hu i) (hu j))) have hswap:(∑ i, ∑ j,max (u j - 3 * u i) 0 ^ 2) = ∑ i, ∑ j,max (u i - 3 * u j) 0 ^ 2:=Finset.sum_comm simp_rw [sub_sq] at hid simp only [Finset.sum_sub_distrib,Finset.sum_add_distrib,Finset.sum_const, Finset.card_univ,nsmul_eq_mul, ← Finset.mul_sum, ← Finset.sum_mul] at hid rw [hswap] at hid unfold energy nlinarith [hid] end Green24Proof end section namespace Green24Proof noncomputable def mass {ι:Type*} [Fintype ι] (u:ι → ℝ):ℝ:=∑ i,u i noncomputable def truncatedMass {ι:Type*} [Fintype ι] (u:ι → ℝ) (t:ℝ):ℝ := ∑ i,min (u i) t noncomputable def overlap {ι:Type*} [Fintype ι] (T:ι → ι) (u:ι → ℝ):ℝ := ∑ i,min (u (T i)) (3 * u i) theorem min_threshold (x y t:ℝ):min x y ≤ max (x - t) 0 + min t y:=by simp only [min_def,max_def] split_ifs <;> linarith private def zz3:"s0003"="s0003":=by decide+kernel theorem sum_comp_le_card {ι:Type*} [Fintype ι] [DecidableEq ι] (T:ι → ι) (N:ℕ) (hT:∀ j,(Finset.univ.filter fun i => T i = j).card ≤ N) (f:ι → ℝ) (hf:∀ i,0 ≤ f i) : ∑ i,f (T i) ≤ N * ∑ i,f i:=by calc ∑ i,f (T i) = ∑ i, ∑ j,if T i = j then f j else 0:=by simp _ = ∑ j, ∑ i,if T i = j then f j else 0:=Finset.sum_comm _ ≤ ∑ j,(N:ℝ) * f j:=by apply Finset.sum_le_sum intro j _ rw [← Finset.sum_filter] simp only [Finset.sum_const,nsmul_eq_mul] apply mul_le_mul_of_nonneg_right _ (hf j) exact_mod_cast hT j _ = N * ∑ j,f j:=(Finset.mul_sum _ _ _).symm theorem sum_comp_le_three {ι:Type*} [Fintype ι] [DecidableEq ι] (T:ι → ι) (hT:∀ j,(Finset.univ.filter fun i => T i = j).card ≤ 3) (f:ι → ℝ) (hf:∀ i,0 ≤ f i) : ∑ i,f (T i) ≤ 3 * ∑ i,f i:=by simpa only [Nat.cast_ofNat] using sum_comp_le_card T 3 hT f hf theorem overlap_le_truncation {ι:Type*} [Fintype ι] [DecidableEq ι] (T:ι → ι) (hT:∀ j,(Finset.univ.filter fun i => T i = j).card ≤ 3) (u:ι → ℝ) (t:ℝ) : overlap T u ≤ 3 * mass u - 3 * (truncatedMass u t - truncatedMass u (t / 3)):=by have hthreshold:=Finset.sum_le_sum (s:=Finset.univ) (fun i _ => min_threshold (u (T i)) (3 * u i) t) have hpreimages:=sum_comp_le_three T hT (fun i => max (u i - t) 0) (fun i => le_max_right _ _) have hmax (x:ℝ):max (x - t) 0 = x - min x t:=by simp only [max_def,min_def] split_ifs <;> linarith have hmin (x:ℝ):min t (3 * x) = 3 * min x (t / 3):=by simp only [min_def] split_ifs <;> linarith simp_rw [hmax] at hpreimages hthreshold simp_rw [hmin] at hthreshold simp only [Finset.sum_add_distrib,Finset.sum_sub_distrib, ← Finset.mul_sum] at hpreimages hthreshold unfold overlap mass truncatedMass linarith theorem truncation_difference_bounds {ι:Type*} [Fintype ι] (u:ι → ℝ) (hu:∀ i,0 ≤ u i) {t:ℝ} (ht:0 ≤ t) : 0 ≤ truncatedMass u t - truncatedMass u (t / 3) ∧ truncatedMass u t - truncatedMass u (t / 3) ≤ (2 / 3) * truncatedMass u t:=by have h₁:truncatedMass u (t / 3) ≤ truncatedMass u t:=by apply Finset.sum_le_sum intro i _ exact min_le_min_left _ (by linarith) have h₂:truncatedMass u t ≤ 3 * truncatedMass u (t / 3):=by unfold truncatedMass rw [Finset.mul_sum] apply Finset.sum_le_sum intro i _ have hi:=hu i simp only [min_def] split_ifs <;> linarith constructor <;> linarith end Green24Proof end section namespace Green24Proof noncomputable def Q12 (A B:ℝ):ℝ := -(97 / 0x64) * A ^ 2 + (61 / 25) * A * B - (79 / 50) * B ^ 2 noncomputable def Q18 (A B:ℝ):ℝ := -(17 / 25) * A ^ 2 + (0x6d / 50) * A * B - (93 / 50) * B ^ 2 private def zz4:"s0004"="s0004":=by decide+kernel theorem Q12_interval_identity (A B:ℝ) : Q12 A B + (9 / 0x100) * (A + B) ^ 2 = (0x175f / 0x1900) * (A - B) * ((8 / 5) * B - A) + (49 / 0x640) * B ^ 2 + (0x1de5 / 0x27100) * (5 / 3) * B * (A - B):=by unfold Q12 ring theorem Q12_lower {A B:ℝ} (hB:0 ≤ B) (hAB:B ≤ A) (hupper:A ≤ (8 / 5) * B) : -(9 / 0x100) * (A + B) ^ 2 ≤ Q12 A B:=by have h₁:=mul_nonneg (sub_nonneg.mpr hAB) (sub_nonneg.mpr hupper) have h₂:=mul_nonneg hB (sub_nonneg.mpr hAB) have hid:=Q12_interval_identity A B nlinarith [sq_nonneg B] theorem Q18_interval_identity (A B:ℝ) : Q18 A B + (9 / 0x100) * (A + B) ^ 2 = (0x101f / 0x1900) * (A - (8 / 5) * B) * ((0x83 / 61) * B - A) + (0x4e09 / 0x27100) * B * (((0x83 / 61) * B - A) / (0x83 / 61 - 8 / 5)) + (0xc4a / 0x16b61) * B * ((A - (8 / 5) * B) / (0x83 / 61 - 8 / 5)):=by unfold Q18 ring theorem Q18_lower {A B:ℝ} (hB:0 ≤ B) (hlower:(8 / 5) * B ≤ A) (hupper:A ≤ (0x83 / 61) * B) : -(9 / 0x100) * (A + B) ^ 2 ≤ Q18 A B:=by have h₁:=mul_nonneg (sub_nonneg.mpr hlower) (sub_nonneg.mpr hupper) have h₂:=mul_nonneg hB (sub_nonneg.mpr hupper) have h₃:=mul_nonneg hB (sub_nonneg.mpr hlower) have hid:=Q18_interval_identity A B norm_num at hid nlinarith private def zz5:"s0005"="s0005":=by decide+kernel theorem height_cover {A B H d:ℝ} (hB:0 ≤ B) (hAB:B ≤ A) (hupper:A ≤ (0x83 / 61) * B) (h12:(2 / 5) * H + Q12 A B ≤ d) (h18:(2 / 5) * H + Q18 A B ≤ d) : (2 / 5) * H - (9 / 0x100) * (A + B) ^ 2 ≤ d:=by by_cases hcut:A ≤ (8 / 5) * B · linarith [Q12_lower hB hAB hcut] · linarith [Q18_lower hB (le_of_not_ge hcut) hupper] theorem overlap_of_energy_estimate {U A H R:ℝ} (hH:(2 * U - 3 * A) ^ 2 ≤ 8 * H) (hR:R ≤ 3 * U - 3 * A) : R ≤ U + Real.sqrt (8 * H):=by have hnonneg:0 ≤ 8 * H:=(sq_nonneg _).trans hH have hsqrt:=Real.sq_sqrt hnonneg have hsqrt_nonneg:=Real.sqrt_nonneg (8 * H) have hle:2 * U - 3 * A ≤ Real.sqrt (8 * H):=by nlinarith linarith theorem weighted_overlap {U H R C:ℝ} (hU:0 ≤ U) (hH:0 ≤ H) (hC:0 < C) (hR:R ≤ U + Real.sqrt (8 * H)) : U * R ≤ (1 + 2 / C) * U ^ 2 + C * H:=by have hsqrt:=Real.sq_sqrt (mul_nonneg (by norm_num:(0:ℝ) ≤ 8) hH) have hmul:=mul_le_mul_of_nonneg_left hR hU have hsq:=sq_nonneg (C * Real.sqrt (8 * H) - 4 * U) have hyoung:C * U * Real.sqrt (8 * H) ≤ 2 * U ^ 2 + C ^ 2 * H:=by nlinarith [hsqrt] apply (mul_le_mul_iff_right₀ hC).mp have hmulC:=mul_le_mul_of_nonneg_right hmul hC.le have hdiv:(2 / C:ℝ) * C = 2:=div_mul_cancel₀ 2 (ne_of_gt hC) nlinarith [hdiv] theorem overlap_bound_of_height {U H R d:ℝ} (hU:0 ≤ U) (hH:0 ≤ H) (hoverlap:R ≤ U + Real.sqrt (8 * H)) (hheight:(2 / 5) * H - (9 / 0x100) * U ^ 2 ≤ d) : U * R ≤ (61 / 32) * U ^ 2 + 8 * d:=by have h:=weighted_overlap hU hH (by norm_num:(0:ℝ) < 16 / 5) hoverlap norm_num at h linarith private def zz6:"s0006"="s0006":=by decide+kernel theorem overlap_bound_of_mass_imbalance {A B R d:ℝ} (hA:0 ≤ A) (hB:0 ≤ B) (hratio:(0x83 / 61) * B ≤ A) (hR:R ≤ 6 * B) (hd:0 ≤ d) : (A + B) * R ≤ (61 / 32) * (A + B) ^ 2 + 8 * d:=by have hlinear:R ≤ (61 / 32) * (A + B):=by linarith have hmul:=mul_le_mul_of_nonneg_left hlinear (add_nonneg hA hB) nlinarith theorem overlap_bound {A B H R d:ℝ} (hB:0 ≤ B) (hAB:B ≤ A) (hH:0 ≤ H) (hd:0 ≤ d) (hoverlap:R ≤ A + B + Real.sqrt (8 * H)) (hparity:R ≤ 6 * B) (h12:(2 / 5) * H + Q12 A B ≤ d) (h18:(2 / 5) * H + Q18 A B ≤ d) : (A + B) * R ≤ (61 / 32) * (A + B) ^ 2 + 8 * d:=by by_cases hratio:A ≤ (0x83 / 61) * B · exact overlap_bound_of_height (by linarith) hH hoverlap (height_cover hB hAB hratio h12 h18) · exact overlap_bound_of_mass_imbalance (hB.trans hAB) hB (le_of_not_ge hratio) hparity hd theorem boundary_descent {U V R du dv dg:ℝ} (hU:0 < U) (hV:0 ≤ V) (hoverlap:U * R ≤ (61 / 32) * U ^ 2 + 8 * du) (hexpansion:du + dv + 4 * U * V - 3 * V ^ 2 - 2 * V * R ≤ dg) : (1 - 16 * V / U) * du + dv + V * ((3 / 16) * U - 3 * V) ≤ dg:=by have hscaled:=mul_le_mul_of_nonneg_left hoverlap (by positivity:0 ≤ 2 * V) apply (mul_le_mul_iff_right₀ hU).mp have hexpansionU:=mul_le_mul_of_nonneg_right hexpansion hU.le have hcancel:(16 * V / U) * U = 16 * V:=div_mul_cancel₀ _ (ne_of_gt hU) nlinarith [congrArg (fun x:ℝ => x * du) hcancel] theorem boundary_nonneg {U V R du dv dg:ℝ} (hU:0 < U) (hV:0 ≤ V) (hratio:16 * V ≤ U) (hdu:0 ≤ du) (hdv:0 ≤ dv) (hoverlap:U * R ≤ (61 / 32) * U ^ 2 + 8 * du) (hexpansion:du + dv + 4 * U * V - 3 * V ^ 2 - 2 * V * R ≤ dg) : 0 ≤ dg:=by have hdesc:=boundary_descent hU hV hoverlap hexpansion have hcoef:0 ≤ 1 - 16 * V / U:=by have hdiv:16 * V / U ≤ 1:=(div_le_one hU).mpr hratio linarith have h₁:=mul_nonneg hcoef hdu have h₂:0 ≤ V * ((3 / 16) * U - 3 * V) := mul_nonneg hV (by linarith) linarith end Green24Proof end section open Set Filter MeasureTheory open scoped Topology namespace Green24Proof noncomputable def tailCount {ι:Type*} [Fintype ι] (u:ι → ℝ) (t:ℝ):ℝ := ∑ i,if t < u i then 1 else 0 private def zz7:"s0007"="s0007":=by decide+kernel theorem tailCount_nonneg {ι:Type*} [Fintype ι] (u:ι → ℝ) (t:ℝ) : 0 ≤ tailCount u t:=by unfold tailCount exact Finset.sum_nonneg (fun _ _ => by split_ifs <;> norm_num) theorem tailCount_antitone {ι:Type*} [Fintype ι] (u:ι → ℝ) : Antitone (tailCount u):=by intro s t hst unfold tailCount apply Finset.sum_le_sum intro i _ split_ifs <;> norm_num at *; linarith theorem truncatedMass_continuous {ι:Type*} [Fintype ι] (u:ι → ℝ) : Continuous (truncatedMass u):=by unfold truncatedMass fun_prop theorem hasDerivWithinAt_min_right (a t:ℝ) : HasDerivWithinAt (fun s:ℝ => min a s) (if t < a then 1 else 0) (Ioi t) t:=by by_cases h:t < a · simp only [if_pos h] apply (hasDerivAt_id t).hasDerivWithinAt.congr_of_eventuallyEq · filter_upwards [nhdsWithin_le_nhds (Iio_mem_nhds h)] with s hs exact min_eq_right (le_of_lt hs) · exact min_eq_right h.le · simp only [if_neg h] apply (hasDerivWithinAt_const t (Ioi t) a).congr · intro s hs exact min_eq_left ((le_of_not_gt h).trans hs.le) · exact min_eq_left (le_of_not_gt h) private def zz8:"s0008"="s0008":=by decide+kernel theorem truncatedMass_hasDeriv_right {ι:Type*} [Fintype ι] (u:ι → ℝ) (t:ℝ) : HasDerivWithinAt (truncatedMass u) (tailCount u t) (Ioi t) t:=by unfold truncatedMass tailCount exact HasDerivWithinAt.fun_sum fun i _ => hasDerivWithinAt_min_right (u i) t theorem integral_tailCount {ι:Type*} [Fintype ι] (u:ι → ℝ) {a b:ℝ} (hab:a ≤ b) : (∫ t in a..b,tailCount u t) = truncatedMass u b - truncatedMass u a:=by exact intervalIntegral.integral_eq_sub_of_hasDeriv_right_of_le hab (truncatedMass_continuous u).continuousOn (fun t _ => truncatedMass_hasDeriv_right u t) (tailCount_antitone u).intervalIntegrable theorem integral_tailCount_mul_mass {ι:Type*} [Fintype ι] (u:ι → ℝ) {a b:ℝ} (hab:a ≤ b) : (∫ t in a..b,tailCount u t * truncatedMass u t) = (truncatedMass u b ^ 2 - truncatedMass u a ^ 2) / 2:=by have hderiv (t:ℝ):HasDerivWithinAt (fun s => truncatedMass u s ^ 2 / 2) (tailCount u t * truncatedMass u t) (Ioi t) t:=by convert ((truncatedMass_hasDeriv_right u t).pow 2).div_const 2 using 1 all_goals first | rfl | ring have h:=intervalIntegral.integral_eq_sub_of_hasDeriv_right_of_le hab (f:=fun s => truncatedMass u s ^ 2 / 2) (((truncatedMass_continuous u).pow 2).div_const 2).continuousOn (fun t _ => hderiv t) ((tailCount_antitone u).intervalIntegrable.mul_continuousOn (truncatedMass_continuous u).continuousOn) convert h using 1 ring theorem posSquare_hasDeriv_right (c t:ℝ) : HasDerivWithinAt (fun s:ℝ => max (s - c) 0 ^ 2) (2 * max (t - c) 0) (Ioi t) t:=by by_cases h:t < c · rw [max_eq_right (by linarith:t - c ≤ 0),mul_zero] apply (hasDerivWithinAt_const t (Ioi t) (0:ℝ)).congr_of_eventuallyEq · filter_upwards [nhdsWithin_le_nhds (Iio_mem_nhds h)] with s hs rw [max_eq_right (by linarith [show s < c from hs]:s - c ≤ 0)] norm_num · rw [max_eq_right (by linarith:t - c ≤ 0)] norm_num · rw [max_eq_left (by linarith:0 ≤ t - c)] have hpoly:=(((hasDerivAt_id t).sub_const c).pow 2).hasDerivWithinAt (s:=Ioi t) simp only [Nat.reduceSub,pow_one,mul_one,id_eq] at hpoly apply hpoly.congr · intro s hs rw [max_eq_left (by linarith [show t < s from hs]:0 ≤ s - c)] rfl · rw [max_eq_left (by linarith:0 ≤ t - c)] rfl private def zz9:"s0009"="s0009":=by decide+kernel theorem integral_min_linear {x c:ℝ} (hx:0 ≤ x) (hc:0 ≤ c) : (∫ t in (0:ℝ)..x,min t c) = (x ^ 2 - max (x - c) 0 ^ 2) / 2:=by have hderiv (t:ℝ):HasDerivWithinAt (fun s:ℝ => (s ^ 2 - max (s - c) 0 ^ 2) / 2) (min t c) (Ioi t) t:=by have h:=(((hasDerivAt_id t).pow 2).hasDerivWithinAt.sub (posSquare_hasDeriv_right c t)).div_const 2 convert h using 1 all_goals first | rfl | (simp only [id_eq,Nat.reduceSub,pow_one,mul_one,min_def,max_def]; split_ifs <;> linarith) have h:=intervalIntegral.integral_eq_sub_of_hasDeriv_right_of_le hx (f:=fun s:ℝ => (s ^ 2 - max (s - c) 0 ^ 2) / 2) (by fun_prop) (fun t _ => hderiv t) ((continuous_id.min continuous_const).intervalIntegrable 0 x) simpa [max_eq_right (neg_nonpos.mpr hc)] using h theorem indicator_lt_antitone (x:ℝ) : Antitone (fun t:ℝ => if t < x then (1:ℝ) else 0):=by intro s t hst dsimp only split_ifs <;> norm_num at *; linarith theorem integral_indicator_lt_mul {x M:ℝ} (hx:0 ≤ x) (hxM:x ≤ M) (f:ℝ → ℝ) : (∫ t in (0:ℝ)..M,(if t < x then 1 else 0) * f t) = ∫ t in (0:ℝ)..x,f t:=by rw [← intervalIntegral.integral_indicator (f:=f) ⟨hx,hxM⟩] apply intervalIntegral.integral_congr_ae filter_upwards [volume.ae_ne x] with t ht _ simp only [Set.indicator_apply,mem_ofPred_eq] by_cases h:t < x · simp [h,h.le] · have hnot:¬t ≤ x:=fun hle => h (lt_of_le_of_ne hle ht) simp [h,hnot] theorem mass_nonneg {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) : 0 ≤ mass u:=Finset.sum_nonneg (fun i _ => hu i) private def zz10:"s000a"="s000a":=by decide+kernel theorem height_le_mass {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) (i:ι) : u i ≤ mass u:=Finset.single_le_sum (fun j _ => hu j) (Finset.mem_univ i) theorem truncatedMass_zero {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) : truncatedMass u 0 = 0:=by simp [truncatedMass,min_eq_right (hu _)] theorem truncatedMass_mass {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) : truncatedMass u (mass u) = mass u:=by unfold truncatedMass mass apply Finset.sum_congr rfl intro i _ exact min_eq_left (height_le_mass hu i) theorem truncatedMass_le_mass {ι:Type*} [Fintype ι] (u:ι → ℝ) (t:ℝ) : truncatedMass u t ≤ mass u:=Finset.sum_le_sum (fun i _ => min_le_left (u i) t) private def zz11:"s000b"="s000b":=by decide+kernel theorem integral_tail_mul {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) (f:ℝ → ℝ) (hf:Continuous f) : (∫ t in (0:ℝ)..mass u,tailCount u t * f t) = ∑ i, ∫ t in (0:ℝ)..u i,f t:=by simp only [tailCount,Finset.sum_mul] rw [intervalIntegral.integral_finsetSum] · apply Finset.sum_congr rfl intro i _ exact integral_indicator_lt_mul (hu i) (height_le_mass hu i) f · intro i _ exact (indicator_lt_antitone (u i)).intervalIntegrable.mul_continuousOn hf.continuousOn theorem integral_min_third {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : (∫ t in (0:ℝ)..x,min y (t / 3)) = (x ^ 2 - max (x - 3 * y) 0 ^ 2) / 6:=by have hmin (t:ℝ):min y (t / 3) = min t (3 * y) / 3:=by simp only [min_def] split_ifs <;> linarith simp_rw [hmin] rw [intervalIntegral.integral_div,integral_min_linear hx (by linarith:0 ≤ 3 * y)] ring theorem integral_tail_mul_third {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) : (∫ t in (0:ℝ)..mass u,tailCount u t * truncatedMass u (t / 3)) = (4 * energy u + mass u ^ 2) / 6:=by rw [integral_tail_mul hu (fun t => truncatedMass u (t / 3)) ((truncatedMass_continuous u).comp (continuous_id.div_const 3))] have hscalar (i:ι):(∫ t in (0:ℝ)..u i,truncatedMass u (t / 3)) = ∑ j,(u i ^ 2 - max (u i - 3 * u j) 0 ^ 2) / 6:=by unfold truncatedMass rw [intervalIntegral.integral_finsetSum] · exact Finset.sum_congr rfl (fun j _ => integral_min_third (hu i) (hu j)) · intro j _ exact (continuous_const.min (continuous_id.div_const 3)).intervalIntegrable 0 (u i) simp_rw [hscalar] simp only [← Finset.sum_div,Finset.sum_sub_distrib,Finset.sum_const,Finset.card_univ, nsmul_eq_mul, ← Finset.mul_sum] have he:=energy_sum_identity hu unfold mass linarith theorem energy_integral_identity {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) : energy u = mass u ^ 2 / 2 - (3 / 2) * (∫ t in (0:ℝ)..mass u, tailCount u t * (truncatedMass u t - truncatedMass u (t / 3))):=by simp_rw [mul_sub] rw [intervalIntegral.integral_sub] · rw [integral_tailCount_mul_mass u (mass_nonneg hu),truncatedMass_mass hu, truncatedMass_zero hu,integral_tail_mul_third hu] ring · exact (tailCount_antitone u).intervalIntegrable.mul_continuousOn (truncatedMass_continuous u).continuousOn · exact (tailCount_antitone u).intervalIntegrable.mul_continuousOn ((truncatedMass_continuous u).comp (continuous_id.div_const 3)).continuousOn private def zz12:"s000c"="s000c":=by decide+kernel theorem energyIntegrand_intervalIntegrable {ι:Type*} [Fintype ι] (u:ι → ℝ) (a b:ℝ) : IntervalIntegrable (fun t => tailCount u t * (truncatedMass u t - truncatedMass u (t / 3))) volume a b := (tailCount_antitone u).intervalIntegrable.mul_continuousOn ((truncatedMass_continuous u).sub ((truncatedMass_continuous u).comp (continuous_id.div_const 3))).continuousOn theorem energy_integral_upper {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) {A:ℝ} (hA:0 ≤ A) (hAU:A ≤ (2 / 3) * mass u) (hbound:∀ t ∈ Icc (0:ℝ) (mass u), truncatedMass u t - truncatedMass u (t / 3) ≤ A) : (∫ t in (0:ℝ)..mass u, tailCount u t * (truncatedMass u t - truncatedMass u (t / 3))) ≤ A * mass u - (3 / 4) * A ^ 2:=by have hU:=mass_nonneg hu have hvalue:(3 / 2) * A ∈ Icc (truncatedMass u 0) (truncatedMass u (mass u)):=by rw [truncatedMass_zero hu,truncatedMass_mass hu] constructor <;> linarith obtain ⟨s,hs,hLs⟩ := (intermediate_value_Icc hU (truncatedMass_continuous u).continuousOn) hvalue have hleft:(∫ t in (0:ℝ)..s, tailCount u t * (truncatedMass u t - truncatedMass u (t / 3))) ≤ (2 / 3) * ((truncatedMass u s ^ 2 - truncatedMass u 0 ^ 2) / 2):=by have hmono:=intervalIntegral.integral_mono_on hs.1 (energyIntegrand_intervalIntegrable u 0 s) (((tailCount_antitone u).intervalIntegrable.mul_continuousOn (truncatedMass_continuous u).continuousOn).const_mul (2 / 3)) (fun t (ht:t ∈ Icc (0:ℝ) s) => ?_) · simpa only [intervalIntegral.integral_const_mul,integral_tailCount_mul_mass u hs.1] using hmono · have h:=mul_le_mul_of_nonneg_left (truncation_difference_bounds u hu ht.1).2 (tailCount_nonneg u t) nlinarith have hright:(∫ t in s..mass u, tailCount u t * (truncatedMass u t - truncatedMass u (t / 3))) ≤ A * (mass u - truncatedMass u s):=by have hmono:=intervalIntegral.integral_mono_on hs.2 (energyIntegrand_intervalIntegrable u s (mass u)) ((tailCount_antitone u).intervalIntegrable.const_mul A) (fun t (ht:t ∈ Icc s (mass u)) => ?_) · simpa only [intervalIntegral.integral_const_mul,integral_tailCount u hs.2, truncatedMass_mass hu] using hmono · have h:=mul_le_mul_of_nonneg_left (hbound t ⟨hs.1.trans ht.1,ht.2⟩) (tailCount_nonneg u t) nlinarith have hsplit:=intervalIntegral.integral_add_adjacent_intervals (energyIntegrand_intervalIntegrable u 0 s) (energyIntegrand_intervalIntegrable u s (mass u)) simp only [truncatedMass_zero hu,hLs] at hleft hright nlinarith theorem energy_ge_truncation_max {ι:Type*} [Fintype ι] {u:ι → ℝ} (hu:∀ i,0 ≤ u i) {A:ℝ} (hA:0 ≤ A) (hAU:A ≤ (2 / 3) * mass u) (hbound:∀ t ∈ Icc (0:ℝ) (mass u), truncatedMass u t - truncatedMass u (t / 3) ≤ A) : (2 * mass u - 3 * A) ^ 2 ≤ 8 * energy u:=by have henergy:=energy_integral_identity hu have hint:=energy_integral_upper hu hA hAU hbound nlinarith theorem sharp_overlap {ι:Type*} [Fintype ι] [DecidableEq ι] (T:ι → ι) (hT:∀ j,(Finset.univ.filter fun i => T i = j).card ≤ 3) (u:ι → ℝ) (hu:∀ i,0 ≤ u i) : overlap T u ≤ mass u + Real.sqrt (8 * energy u):=by have hU:=mass_nonneg hu have hcont:Continuous (fun t => truncatedMass u t - truncatedMass u (t / 3)) := (truncatedMass_continuous u).sub ((truncatedMass_continuous u).comp (continuous_id.div_const 3)) obtain ⟨t,ht,hmax⟩:=isCompact_Icc.exists_isMaxOn (nonempty_Icc.mpr hU) hcont.continuousOn have hA:=(truncation_difference_bounds u hu ht.1).1 have hAU:truncatedMass u t - truncatedMass u (t / 3) ≤ (2 / 3) * mass u:=by have h₁:=(truncation_difference_bounds u hu ht.1).2 have h₂:=truncatedMass_le_mass u t linarith exact overlap_of_energy_estimate (energy_ge_truncation_max hu hA hAU hmax) (overlap_le_truncation T hT u t) private def zz13:"s000d"="s000d":=by decide+kernel theorem sharp_weighted_overlap {ι:Type*} [Fintype ι] [DecidableEq ι] (T:ι → ι) (hT:∀ j,(Finset.univ.filter fun i => T i = j).card ≤ 3) (u:ι → ℝ) (hu:∀ i,0 ≤ u i) {C:ℝ} (hC:0 < C) : mass u * overlap T u ≤ (1 + 2 / C) * mass u ^ 2 + C * energy u := weighted_overlap (mass_nonneg hu) (energy_nonneg hu) hC (sharp_overlap T hT u hu) end Green24Proof end section namespace Green24Proof noncomputable def kernel (a b c:ℝ):ℝ := (2 * a * b + 2 * b * c + 2 * c * a - a ^ 2 - b ^ 2 - c ^ 2 + max (a - b - c) 0 ^ 2 + max (b - a - c) 0 ^ 2 + max (c - a - b) 0 ^ 2) / 4 theorem kernel_swap12 (a b c:ℝ):kernel a b c = kernel b a c:=by unfold kernel rw [show c - b - a = c - a - b by ring] ring theorem kernel_swap23 (a b c:ℝ):kernel a b c = kernel a c b:=by unfold kernel rw [show a - c - b = a - b - c by ring, show c - a - b = c - b - a by ring, show b - a - c = b - c - a by ring] ring theorem kernel_cycle (a b c:ℝ):kernel a b c = kernel b c a:=by rw [kernel_swap12 a b c,kernel_swap23 b a c] private def zz14:"s000e"="s000e":=by decide+kernel theorem kernel_eq_product {a b c:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:a + b ≤ c) : kernel a b c = a * b:=by unfold kernel rw [max_eq_right (by linarith:a - b - c ≤ 0), max_eq_right (by linarith:b - a - c ≤ 0), max_eq_left (by linarith:0 ≤ c - a - b)] ring theorem kernel_eq_triangle {a b c:ℝ} (ha:a ≤ b + c) (hb:b ≤ a + c) (hc:c ≤ a + b) : kernel a b c = a * b - (a + b - c) ^ 2 / 4:=by unfold kernel rw [max_eq_right (by linarith:a - b - c ≤ 0), max_eq_right (by linarith:b - a - c ≤ 0), max_eq_right (by linarith:c - a - b ≤ 0)] ring theorem kernel_eq_sorted {a b c:ℝ} (ha:0 ≤ a) (hab:a ≤ b) (hbc:b ≤ c) : kernel a b c = a * b - max (a + b - c) 0 ^ 2 / 4:=by by_cases h:a + b ≤ c · rw [kernel_eq_product ha (ha.trans hab) h, max_eq_right (by linarith:a + b - c ≤ 0)] ring · rw [kernel_eq_triangle (by linarith) (by linarith) (le_of_not_ge h), max_eq_left (by linarith:0 ≤ a + b - c)] theorem kernel_le_product {a b c:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) : kernel a b c ≤ a * b:=by by_cases hcmax:a + b ≤ c · exact (kernel_eq_product ha hb hcmax).le by_cases hamax:b + c ≤ a · rw [kernel_cycle,kernel_eq_product hb hc hamax] nlinarith [mul_nonneg hb (by linarith:0 ≤ a - c)] by_cases hbmax:a + c ≤ b · rw [kernel_swap23,kernel_eq_product ha hc hbmax] nlinarith [mul_nonneg ha (by linarith:0 ≤ b - c)] rw [kernel_eq_triangle (le_of_not_ge hamax) (le_of_not_ge hbmax) (le_of_not_ge hcmax)] linarith [sq_nonneg (a + b - c)] private def zz15:"s000f"="s000f":=by decide+kernel theorem kernel_nonneg {a b c:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) : 0 ≤ kernel a b c:=by by_cases hcmax:a + b ≤ c · rw [kernel_eq_product ha hb hcmax] exact mul_nonneg ha hb by_cases hamax:b + c ≤ a · rw [kernel_cycle,kernel_eq_product hb hc hamax] exact mul_nonneg hb hc by_cases hbmax:a + c ≤ b · rw [kernel_swap23,kernel_eq_product ha hc hbmax] exact mul_nonneg ha hc rw [kernel_eq_triangle (le_of_not_ge hamax) (le_of_not_ge hbmax) (le_of_not_ge hcmax)] rcases le_total a b with hab | hba · have h₁:=mul_nonneg (by linarith:0 ≤ 2 * a + (a + b - c)) (by linarith:0 ≤ 2 * a - (a + b - c)) have h₂:=mul_nonneg ha (by linarith:0 ≤ b - a) nlinarith · have h₁:=mul_nonneg (by linarith:0 ≤ 2 * b + (a + b - c)) (by linarith:0 ≤ 2 * b - (a + b - c)) have h₂:=mul_nonneg hb (by linarith:0 ≤ a - b) nlinarith noncomputable def profileFunctional {q:ℕ} [NeZero q] (g:ZMod q → ℝ):ℝ := ∑ j, ∑ k,kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k) noncomputable def deficit {q:ℕ} [NeZero q] (g:ZMod q → ℝ):ℝ := 2 * mass g ^ 2 - profileFunctional g theorem profileFunctional_nonneg {q:ℕ} [NeZero q] (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):0 ≤ profileFunctional g:=by apply Finset.sum_nonneg intro j _ apply Finset.sum_nonneg intro k _ exact kernel_nonneg (hg _) (mul_nonneg (by norm_num) (hg _)) (mul_nonneg (by norm_num) (hg _)) theorem profileFunctional_le_of_bijective {q:ℕ} [NeZero q] (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (hbij:∀ j:ZMod q,Function.Bijective (fun k:ZMod q => 3 * k - 2 * j)) : profileFunctional g ≤ 2 * mass g ^ 2:=by have hrow (j:ZMod q):(∑ k,g (3 * k - 2 * j) * (2 * g j)) = mass g * (2 * g j):=by rw [← Finset.sum_mul,(hbij j).sum_comp] rfl calc profileFunctional g ≤ ∑ j, ∑ k,g (3 * k - 2 * j) * (2 * g j):=by apply Finset.sum_le_sum intro j _ apply Finset.sum_le_sum intro k _ exact kernel_le_product (hg _) (mul_nonneg (by norm_num) (hg _)) (mul_nonneg (by norm_num) (hg _)) _ = ∑ j,mass g * (2 * g j):=Finset.sum_congr rfl (fun j _ => hrow j) _ = 2 * mass g ^ 2:=by simp only [← Finset.mul_sum] unfold mass ring theorem deficit_nonneg_of_three_not_dvd {q:ℕ} [NeZero q] (hq:¬3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):0 ≤ deficit g:=by have hu:IsUnit (3:ZMod q):=ZMod.isUnit_prime_of_not_dvd Nat.prime_three hq have hmul:=IsUnit.isUnit_iff_mulLeft_bijective.mp hu have hbij (j:ZMod q):Function.Bijective (fun k:ZMod q => 3 * k - 2 * j):=by exact (Equiv.subRight (2 * j)).bijective.comp hmul exact sub_nonneg.mpr (profileFunctional_le_of_bijective g hg hbij) private def zz16:"s0010"="s0010":=by decide+kernel theorem affine_preimages {q:ℕ} [NeZero q] (N:ℕ) (hN:0 < N) (c y:ZMod q) : (Finset.univ.filter fun x:ZMod q => N * x + c = y).card ≤ N:=by let s:=Finset.univ.filter (fun x:ZMod q => N * x + c = y) change s.card ≤ N rcases s.eq_empty_or_nonempty with h | ⟨x₀,hx₀⟩ · rw [h] simp · have hx₀eq:N * x₀ + c = y:=(Finset.mem_filter.mp hx₀).2 have hcard:s.card ≤ (Finset.univ.filter fun x:ZMod q => N • x = 0).card:=by apply Finset.card_le_card_of_injOn (fun x:ZMod q => x - x₀) · intro x hx have hxeq:N * x + c = y:=(Finset.mem_filter.mp hx).2 have heq:N * x = N * x₀:=add_right_cancel (hxeq.trans hx₀eq.symm) apply Finset.mem_filter.mpr refine ⟨Finset.mem_univ _, ?_⟩ simp only [nsmul_eq_mul,mul_sub,heq,sub_self] · intro x _ z _ hxz have h:=congrArg (fun a:ZMod q => a + x₀) hxz simpa using h exact hcard.trans (IsAddCyclic.card_nsmul_eq_zero_le hN) theorem affine_three_preimages {q:ℕ} [NeZero q] (c y:ZMod q) : (Finset.univ.filter fun x:ZMod q => 3 * x + c = y).card ≤ 3:=by simpa only [Nat.cast_ofNat] using affine_preimages 3 (by norm_num) c y def overlapMap {q:ℕ} (j k:ZMod q):ZMod q:=3 * k - 2 * j - 1 theorem overlapMap_preimages {q:ℕ} [NeZero q] (j y:ZMod q) : (Finset.univ.filter fun k => overlapMap j k = y).card ≤ 3:=by have heq:overlapMap j = fun k:ZMod q => 3 * k + (-2 * j - 1):=by funext k unfold overlapMap ring rw [heq] exact affine_three_preimages _ _ theorem cyclic_sharp_overlap {q:ℕ} [NeZero q] (u:ZMod q → ℝ) (hu:∀ k,0 ≤ u k) (j:ZMod q) : overlap (overlapMap j) u ≤ mass u + Real.sqrt (8 * energy u) := sharp_overlap (overlapMap j) (overlapMap_preimages j) u hu private def zz17:"s0011"="s0011":=by decide+kernel theorem cyclic_weighted_overlap {q:ℕ} [NeZero q] (u:ZMod q → ℝ) (hu:∀ k,0 ≤ u k) (j:ZMod q) {C:ℝ} (hC:0 < C) : mass u * overlap (overlapMap j) u ≤ (1 + 2 / C) * mass u ^ 2 + C * energy u := sharp_weighted_overlap (overlapMap j) (overlapMap_preimages j) u hu hC end Green24Proof end section namespace Green24Proof.KernelPairMajorant theorem gap_nonneg {A B C:ℝ} (hA:A ≤ B + C) (hB:B ≤ A + C) : 0 ≤ C ^ 2 - (A - B) ^ 2:=by have h:=mul_nonneg (by linarith:0 ≤ C - A + B) (by linarith:0 ≤ C + A - B) nlinarith only [h] theorem triangle_quadratic_bound {A B C:ℝ} (hA:0 < A) (hB:0 < B) (hC:0 < C) (hAB:A ≤ B + C) (hBC:B ≤ A + C) (hCA:C ≤ A + B) (a b c:ℝ) : 4 * A * B * C * (a * b - (a + b - c) ^ 2 / 4) ≤ (C * (C ^ 2 - (A - B) ^ 2)) * a * b + (B * (B ^ 2 - (A - C) ^ 2)) * a * c + (A * (A ^ 2 - (B - C) ^ 2)) * b * c:=by let P:=(C * (C ^ 2 - (A - B) ^ 2)) * a * b + (B * (B ^ 2 - (A - C) ^ 2)) * a * c + (A * (A ^ 2 - (B - C) ^ 2)) * b * c - 4 * A * B * C * (a * b - (a + b - c) ^ 2 / 4) have hD:0 ≤ (A + B + C) * (A + B - C) * (A + C - B) * (B + C - A):=by exact mul_nonneg (mul_nonneg (mul_nonneg (by positivity) (by linarith)) (by linarith)) (by linarith) have hid:(4 * A * B * C) * P = (2 * A * B * C * a - C * (A ^ 2 + B ^ 2 - C ^ 2) * b - B * (A ^ 2 + C ^ 2 - B ^ 2) * c) ^ 2 + ((A + B + C) * (A + B - C) * (A + C - B) * (B + C - A)) * (C * b - B * c) ^ 2:=by dsimp [P] ring have hp:0 ≤ (4 * A * B * C) * P:=by rw [hid] exact add_nonneg (sq_nonneg _) (mul_nonneg hD (sq_nonneg _)) have hP:0 ≤ P:=nonneg_of_mul_nonneg_right hp (by positivity:0 < 4 * A * B * C) dsimp [P] at hP linarith only [hP] theorem kernel_majorant {A B C:ℝ} (hA:0 < A) (hB:0 < B) (hC:0 < C) (hAB:A ≤ B + C) (hBC:B ≤ A + C) (hCA:C ≤ A + B) {a b c:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) : 4 * A * B * C * kernel a b c ≤ (C * (C ^ 2 - (A - B) ^ 2)) * a * b + (B * (B ^ 2 - (A - C) ^ 2)) * a * c + (A * (A ^ 2 - (B - C) ^ 2)) * b * c:=by let L:=C * (C ^ 2 - (A - B) ^ 2) let M:=B * (B ^ 2 - (A - C) ^ 2) let N:=A * (A ^ 2 - (B - C) ^ 2) have hL:0 ≤ L:=mul_nonneg hC.le (gap_nonneg hAB hBC) have hM:0 ≤ M:=mul_nonneg hB.le (gap_nonneg (by linarith) hCA) have hN:0 ≤ N:=mul_nonneg hA.le (gap_nonneg (by linarith) (by linarith)) have hq (x y z:ℝ):=triangle_quadratic_bound hA hB hC hAB hBC hCA x y z change 4 * A * B * C * kernel a b c ≤ L * a * b + M * a * c + N * b * c by_cases hcab:a + b ≤ c · rw [kernel_eq_product ha hb hcab] have h:=hq a b (a + b) change 4 * A * B * C * (a * b - (a + b - (a + b)) ^ 2 / 4) ≤ L * a * b + M * a * (a + b) + N * b * (a + b) at h nlinarith only [h,mul_nonneg (mul_nonneg hM ha) (sub_nonneg.mpr hcab), mul_nonneg (mul_nonneg hN hb) (sub_nonneg.mpr hcab)] by_cases habc:b + c ≤ a · rw [kernel_cycle,kernel_eq_product hb hc habc] have h:=hq (b + c) b c change 4 * A * B * C * ((b + c) * b - (b + c + b - c) ^ 2 / 4) ≤ L * (b + c) * b + M * (b + c) * c + N * b * c at h nlinarith only [h,mul_nonneg (mul_nonneg hL hb) (sub_nonneg.mpr habc), mul_nonneg (mul_nonneg hM hc) (sub_nonneg.mpr habc)] by_cases hbac:a + c ≤ b · rw [kernel_swap23,kernel_eq_product ha hc hbac] have h:=hq a (a + c) c change 4 * A * B * C * (a * (a + c) - (a + (a + c) - c) ^ 2 / 4) ≤ L * a * (a + c) + M * a * c + N * (a + c) * c at h nlinarith only [h,mul_nonneg (mul_nonneg hL ha) (sub_nonneg.mpr hbac), mul_nonneg (mul_nonneg hN hc) (sub_nonneg.mpr hbac)] rw [kernel_eq_triangle (le_of_not_ge habc) (le_of_not_ge hbac) (le_of_not_ge hcab)] exact hq a b c private def zz18:"s0012"="s0012":=by decide+kernel theorem exists_pair_majorant {A B C:ℝ} (hA:0 ≤ A) (hB:0 ≤ B) (hC:0 ≤ C) : ∃ L M N:ℝ, (∀ a b c:ℝ,0 ≤ a → 0 ≤ b → 0 ≤ c → kernel a b c ≤ L * a * b + M * a * c + N * b * c) ∧ kernel A B C = L * A * B + M * A * C + N * B * C:=by by_cases hcab:A + B ≤ C · refine ⟨1,0,0, ?_, ?_⟩ · intro a b c ha hb hc simpa using kernel_le_product ha hb hc · simp [kernel_eq_product hA hB hcab] by_cases habc:B + C ≤ A · refine ⟨0,0,1, ?_, ?_⟩ · intro a b c ha hb hc simpa only [zero_mul,zero_add,one_mul,kernel_cycle a b c] using kernel_le_product hb hc ha · rw [kernel_cycle,kernel_eq_product hB hC habc] simp by_cases hbac:A + C ≤ B · refine ⟨0,1,0, ?_, ?_⟩ · intro a b c ha hb hc simpa only [zero_mul,zero_add,add_zero,one_mul,kernel_swap23 a b c] using kernel_le_product ha hc hb · rw [kernel_swap23,kernel_eq_product hA hC hbac] simp have hA':0 < A:=by linarith have hB':0 < B:=by linarith have hC':0 < C:=by linarith let D:=4 * A * B * C have hD:0 < D:=by dsimp [D]; positivity refine ⟨C * (C ^ 2 - (A - B) ^ 2) / D, B * (B ^ 2 - (A - C) ^ 2) / D, A * (A ^ 2 - (B - C) ^ 2) / D, ?_, ?_⟩ · intro a b c ha hb hc have h:=kernel_majorant hA' hB' hC' (le_of_not_ge habc) (le_of_not_ge hbac) (le_of_not_ge hcab) ha hb hc calc kernel a b c ≤ ((C * (C ^ 2 - (A - B) ^ 2)) * a * b + (B * (B ^ 2 - (A - C) ^ 2)) * a * c + (A * (A ^ 2 - (B - C) ^ 2)) * b * c) / D:=by apply (le_div_iff₀ hD).mpr dsimp [D] nlinarith only [h] _ = _:=by ring · rw [kernel_eq_triangle (le_of_not_ge habc) (le_of_not_ge hbac) (le_of_not_ge hcab)] dsimp [D] field_simp ring end Green24Proof.KernelPairMajorant private def zz1994:"s07ca"="s07ca":=by decide+kernel end section namespace Green24Proof.FiniteKernelSum open scoped BigOperators theorem kernel_sum_of_bijective {κ:Type*} [Fintype κ] (r:κ → κ → κ) (hr:∀ j,Function.Bijective (r j)) (hc:∀ k,Function.Bijective (fun j => r j k)) (f g h:κ → ℝ) (hf:∀ i,0 ≤ f i) (hg:∀ i,0 ≤ g i) (hh:∀ i,0 ≤ h i) : (∑ j, ∑ k,kernel (f (r j k)) (g j) (h k)) ≤ kernel (∑ i,f i) (∑ i,g i) (∑ i,h i):=by have hrow (j:κ):(∑ k,f (r j k)) = ∑ i,f i:=(hr j).sum_comp f have hcol (k:κ):(∑ j,f (r j k)) = ∑ i,f i:=(hc k).sum_comp f have hfg:(∑ j, ∑ k,f (r j k) * g j) = (∑ i,f i) * ∑ i,g i:=by simp_rw [← Finset.sum_mul,hrow] rw [← Finset.mul_sum] have hfh:(∑ j, ∑ k,f (r j k) * h k) = (∑ i,f i) * ∑ i,h i:=by rw [Finset.sum_comm] simp_rw [← Finset.sum_mul,hcol] rw [← Finset.mul_sum] obtain ⟨L,M,N,hb,heq⟩:=KernelPairMajorant.exists_pair_majorant (A:=∑ i,f i) (B:=∑ i,g i) (C:=∑ i,h i) (Finset.sum_nonneg (fun i _ => hf i)) (Finset.sum_nonneg (fun i _ => hg i)) (Finset.sum_nonneg (fun i _ => hh i)) calc _ ≤ ∑ j, ∑ k,(L * (f (r j k) * g j) + M * (f (r j k) * h k) + N * (g j * h k)):=by apply Finset.sum_le_sum intro j _ apply Finset.sum_le_sum intro k _ simpa only [mul_assoc] using hb (f (r j k)) (g j) (h k) (hf _) (hg _) (hh _) _ = L * ((∑ i,f i) * ∑ i,g i) + M * ((∑ i,f i) * ∑ i,h i) + N * ((∑ i,g i) * ∑ i,h i):=by simp only [Finset.sum_add_distrib, ← Finset.mul_sum,hfg,hfh] rw [← Finset.sum_mul] _ = _:=by rw [heq]; ring theorem cyclic_kernel_sum {q:ℕ} [NeZero q] (f g h:ZMod q → ℝ) (hf:∀ i,0 ≤ f i) (hg:∀ i,0 ≤ g i) (hh:∀ i,0 ≤ h i) : (∑ j, ∑ k,kernel (f (k - j)) (g j) (h k)) ≤ kernel (∑ i,f i) (∑ i,g i) (∑ i,h i):=by apply kernel_sum_of_bijective (fun j k => k - j) (fun j => (Equiv.subRight j).bijective) _ f g h hf hg hh intro k exact (Equiv.subLeft k).bijective theorem coefficient_kernel_sum {q:ℕ} [NeZero q] (h2:Nat.Coprime 2 q) (h3:Nat.Coprime 3 q) (f g h:ZMod q → ℝ) (hf:∀ i,0 ≤ f i) (hg:∀ i,0 ≤ g i) (hh:∀ i,0 ≤ h i) : (∑ j, ∑ k,kernel (f (3 * k - 2 * j)) (g j) (h k)) ≤ kernel (∑ i,f i) (∑ i,g i) (∑ i,h i):=by have hmul2:Function.Bijective (fun x:ZMod q => 2 * x) := IsUnit.isUnit_iff_mulLeft_bijective.mp ((ZMod.isUnit_iff_coprime 2 q).mpr h2) have hmul3:Function.Bijective (fun x:ZMod q => 3 * x) := IsUnit.isUnit_iff_mulLeft_bijective.mp ((ZMod.isUnit_iff_coprime 3 q).mpr h3) exact kernel_sum_of_bijective (fun j k => 3 * k - 2 * j) (fun j => (Equiv.subRight (2 * j)).bijective.comp hmul3) (fun k => (Equiv.subLeft (3 * k)).bijective.comp hmul2) f g h hf hg hh end Green24Proof.FiniteKernelSum private def zz1995:"s07cb"="s07cb":=by decide+kernel end section namespace Green24Proof.ProfileCoprimeCollapse open scoped BigOperators variable {m n q:ℕ} [NeZero m] [NeZero n] [NeZero q] noncomputable def fiberMass (g:ZMod m × ZMod n → ℝ) (j:ZMod m):ℝ := ∑ u:ZMod n,g (j,u) private def zz19:"s0013"="s0013":=by decide+kernel omit [NeZero m] in theorem fiberMass_nonneg (g:ZMod m × ZMod n → ℝ) (hg:∀ i,0 ≤ g i) (j:ZMod m):0 ≤ fiberMass g j:=Finset.sum_nonneg (fun u _ => hg (j,u)) theorem mass_fiberMass (g:ZMod m × ZMod n → ℝ):mass (fiberMass g) = mass g:=by simp only [mass,fiberMass,Fintype.sum_prod_type] theorem product_profile_le (h2:Nat.Coprime 2 n) (h3:Nat.Coprime 3 n) (g:ZMod m × ZMod n → ℝ) (hg:∀ i,0 ≤ g i) : (∑ j:ZMod m × ZMod n, ∑ k:ZMod m × ZMod n, kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k)) ≤ profileFunctional (fiberMass g):=by simp only [Fintype.sum_prod_type] change (∑ j:ZMod m, ∑ u:ZMod n, ∑ k:ZMod m, ∑ v:ZMod n, kernel (g (3 * k - 2 * j,3 * v - 2 * u)) (2 * g (j,u)) (3 * g (k,v))) ≤ ∑ j:ZMod m, ∑ k:ZMod m, kernel (fiberMass g (3 * k - 2 * j)) (2 * fiberMass g j) (3 * fiberMass g k) apply Finset.sum_le_sum intro j _ rw [Finset.sum_comm] apply Finset.sum_le_sum intro k _ have h:=FiniteKernelSum.coefficient_kernel_sum h2 h3 (fun r => g (3 * k - 2 * j,r)) (fun u => 2 * g (j,u)) (fun v => 3 * g (k,v)) (fun _ => hg _) (fun _ => mul_nonneg (by norm_num) (hg _)) (fun _ => mul_nonneg (by norm_num) (hg _)) simpa only [fiberMass, ← Finset.mul_sum] using h theorem mass_equiv (e:ZMod q ≃+* ZMod m × ZMod n) (g:ZMod q → ℝ) : mass (fun x => g (e.symm x)) = mass g:=e.symm.toEquiv.sum_comp g private def zz20:"s0014"="s0014":=by decide+kernel theorem profile_equiv (e:ZMod q ≃+* ZMod m × ZMod n) (g:ZMod q → ℝ) : profileFunctional g = ∑ j:ZMod m × ZMod n, ∑ k:ZMod m × ZMod n, kernel (g (e.symm (3 * k - 2 * j))) (2 * g (e.symm j)) (3 * g (e.symm k)):=by have he (j k:ZMod m × ZMod n):e.symm (3 * k - 2 * j) = 3 * e.symm k - 2 * e.symm j:=by simp only [map_sub,map_mul,map_ofNat] unfold profileFunctional rw [← e.symm.toEquiv.sum_comp (fun j:ZMod q => ∑ k:ZMod q,kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k))] apply Finset.sum_congr rfl intro j _ change (∑ k:ZMod q,kernel (g (3 * k - 2 * e.symm j)) (2 * g (e.symm j)) (3 * g k)) = _ rw [← e.symm.toEquiv.sum_comp (fun k:ZMod q => kernel (g (3 * k - 2 * e.symm j)) (2 * g (e.symm j)) (3 * g k))] simp only [he] rfl theorem profileFunctional_le_fiber (e:ZMod q ≃+* ZMod m × ZMod n) (h2:Nat.Coprime 2 n) (h3:Nat.Coprime 3 n) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : profileFunctional g ≤ profileFunctional (fiberMass (fun x => g (e.symm x))):=by rw [profile_equiv e g] exact product_profile_le h2 h3 (fun x => g (e.symm x)) (fun _ => hg _) theorem bound_of_equiv (e:ZMod q ≃+* ZMod m × ZMod n) (h2:Nat.Coprime 2 n) (h3:Nat.Coprime 3 n) (hb:∀ f:ZMod m → ℝ,(∀ i,0 ≤ f i) → profileFunctional f ≤ 2 * mass f ^ 2) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):profileFunctional g ≤ 2 * mass g ^ 2:=by have h:=(profileFunctional_le_fiber e h2 h3 g hg).trans (hb _ (fiberMass_nonneg _ (fun _ => hg _))) rwa [mass_fiberMass,mass_equiv e g] at h end Green24Proof.ProfileCoprimeCollapse private def zz1996:"s07cc"="s07cc":=by decide+kernel end section namespace Green24Proof.QuadraticCertificates abbrev Linear:=Fin 4 → ℚ abbrev Quadratic:=Fin 4 → Fin 4 → ℚ abbrev Point:=Fin 4 → ℝ def linearEq (a b:Linear):Bool:=(List.finRange 4).all fun i => a i == b i theorem linearEq_eq_true (a b:Linear):linearEq a b = true ↔ a = b:=by simp only [linearEq,List.all_eq_true,List.mem_finRange,forall_true_left,beq_iff_eq] exact ⟨funext,fun h i => congrFun h i⟩ def quadraticEq (Q R:Quadratic):Bool:=(List.finRange 4).all fun i => linearEq (Q i) (R i) private def zz21:"s0015"="s0015":=by decide+kernel theorem quadraticEq_eq_true (Q R:Quadratic):quadraticEq Q R = true ↔ Q = R:=by simp only [quadraticEq,List.all_eq_true,List.mem_finRange,forall_true_left,linearEq_eq_true] exact ⟨funext,fun h i => congrFun h i⟩ def linearEval (a:Linear) (x:Point):ℝ:=∑ i,(a i:ℝ) * x i def quadraticEval (Q:Quadratic) (x:Point):ℝ := ∑ i, ∑ j,(Q i j:ℝ) * x i * x j def product (a b:Linear):Quadratic:=fun i j => a i * b j theorem linearEval_zero (x:Point):linearEval 0 x = 0:=by simp [linearEval] theorem linearEval_neg (a:Linear) (x:Point):linearEval (-a) x = -linearEval a x:=by simp [linearEval,Finset.sum_neg_distrib] theorem linearEval_add (a b:Linear) (x:Point) : linearEval (a + b) x = linearEval a x + linearEval b x:=by simp [linearEval,add_mul,Finset.sum_add_distrib] private def zz22:"s0016"="s0016":=by decide+kernel theorem linearEval_smul (c:ℚ) (a:Linear) (x:Point) : linearEval (c • a) x = (c:ℝ) * linearEval a x:=by simp [linearEval,mul_assoc,Finset.mul_sum] theorem quadraticEval_zero (x:Point):quadraticEval 0 x = 0:=by simp [quadraticEval] theorem quadraticEval_add (Q R:Quadratic) (x:Point) : quadraticEval (Q + R) x = quadraticEval Q x + quadraticEval R x:=by simp [quadraticEval,add_mul,Finset.sum_add_distrib] theorem quadraticEval_smul (c:ℚ) (Q:Quadratic) (x:Point) : quadraticEval (c • Q) x = (c:ℝ) * quadraticEval Q x:=by simp [quadraticEval,mul_assoc,Finset.mul_sum] private def zz23:"s0017"="s0017":=by decide+kernel theorem quadraticEval_product (a b:Linear) (x:Point) : quadraticEval (product a b) x = linearEval a x * linearEval b x:=by simp only [quadraticEval,product,Rat.cast_mul,linearEval,Finset.sum_mul,Finset.mul_sum] rw [Finset.sum_comm] apply Finset.sum_congr rfl intro i _ apply Finset.sum_congr rfl intro j _ ring abbrev Combination (n:ℕ):=List (ℚ × Fin n) def combine {n:ℕ} (C:Fin n → Linear) (w:Combination n):Linear := (w.map fun t => t.1 • C t.2).sum def nonnegativeWeights {n:ℕ} (w:Combination n):Bool := w.all fun t => decide (0 ≤ t.1) theorem combine_nonneg {n:ℕ} (C:Fin n → Linear) (w:Combination n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:nonnegativeWeights w = true) : 0 ≤ linearEval (combine C w) x:=by induction w with | nil => simp [combine,linearEval_zero] | cons t ts ih => simp only [nonnegativeWeights,List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [combine,List.map_cons,List.sum_cons,linearEval_add,linearEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (hC t.2)) (ih hw.2) inductive NonnegativeTerm (n:ℕ) where | square (a:Linear) | pair (i j:Fin n) def termMatrix {n:ℕ} (C:Fin n → Linear):NonnegativeTerm n → Quadratic | .square a => product a a | .pair i j => product (C i) (C j) theorem termMatrix_nonneg {n:ℕ} (C:Fin n → Linear) (t:NonnegativeTerm n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) : 0 ≤ quadraticEval (termMatrix C t) x:=by cases t with | square a => simpa only [termMatrix,quadraticEval_product, ← sq] using sq_nonneg (linearEval a x) | pair i j => simpa only [termMatrix,quadraticEval_product] using mul_nonneg (hC i) (hC j) abbrev Decomposition (n:ℕ):=List (ℚ × NonnegativeTerm n) def decompositionMatrix {n:ℕ} (C:Fin n → Linear) (d:Decomposition n):Quadratic := (d.map fun t => t.1 • termMatrix C t.2).sum def decompositionCheck {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (d:Decomposition n):Bool := (d.all fun t => decide (0 ≤ t.1)) && quadraticEq (decompositionMatrix C d) Q theorem decomposition_nonneg {n:ℕ} (C:Fin n → Linear) (d:Decomposition n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:(d.all fun t => decide (0 ≤ t.1)) = true) : 0 ≤ quadraticEval (decompositionMatrix C d) x:=by induction d with | nil => simp [decompositionMatrix,quadraticEval_zero] | cons t ts ih => simp only [List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [decompositionMatrix,List.map_cons,List.sum_cons,quadraticEval_add, quadraticEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (termMatrix_nonneg C t.2 x hC)) (ih hw.2) private def zz24:"s0018"="s0018":=by decide+kernel theorem decompositionCheck_sound {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (d:Decomposition n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:decompositionCheck C Q d = true):0 ≤ quadraticEval Q x:=by simp only [decompositionCheck,Bool.and_eq_true,quadraticEq_eq_true] at h rw [← h.2] exact decomposition_nonneg C d x hC h.1 abbrev Hinges:=List (ℚ × Linear) def hingeEval (hs:Hinges) (x:Point):ℝ := (hs.map fun t => (t.1:ℝ) * max (linearEval t.2 x) 0 ^ 2).sum inductive Certificate:ℕ → Type where | leaf {n:ℕ} (d:Decomposition n):Certificate n | split {n:ℕ} (positive negative:Certificate (n + 1)):Certificate n | positive {n:ℕ} (w:Combination n) (next:Certificate (n + 1)):Certificate n | negative {n:ℕ} (w:Combination n) (next:Certificate (n + 1)):Certificate n def check {n:ℕ} (cert:Certificate n) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges):Bool := match cert,hs with | .leaf d,[] => decompositionCheck C Q d | .split p m,(c,a) :: hs => check p (Fin.cons a C) (Q + c • product a a) hs && check m (Fin.cons (-a) C) Q hs | .positive w p,(c,a) :: hs => nonnegativeWeights w && linearEq (combine C w) a && check p (Fin.cons a C) (Q + c • product a a) hs | .negative w m,(_,a) :: hs => nonnegativeWeights w && linearEq (combine C w) (-a) && check m (Fin.cons (-a) C) Q hs | _,_ => false theorem check_split_valid {n:ℕ} (p m:Certificate (n + 1)) (C:Fin n → Linear) (Q:Quadratic) (c:ℚ) (a:Linear) (hs:Hinges) (hp:check p (Fin.cons a C) (Q + c • product a a) hs = true) (hm:check m (Fin.cons (-a) C) Q hs = true) : check (.split p m) C Q ((c,a) :: hs) = true:=by simp only [check,hp,hm,Bool.and_true] theorem check_positive_valid {n:ℕ} (w:Combination n) (p:Certificate (n + 1)) (C:Fin n → Linear) (Q:Quadratic) (c:ℚ) (a:Linear) (hs:Hinges) (hw:nonnegativeWeights w = true) (ha:combine C w = a) (hp:check p (Fin.cons a C) (Q + c • product a a) hs = true) : check (.positive w p) C Q ((c,a) :: hs) = true:=by simp only [check,Bool.and_eq_true,linearEq_eq_true] exact ⟨⟨hw,ha⟩,hp⟩ theorem check_negative_valid {n:ℕ} (w:Combination n) (m:Certificate (n + 1)) (C:Fin n → Linear) (Q:Quadratic) (c:ℚ) (a:Linear) (hs:Hinges) (hw:nonnegativeWeights w = true) (ha:combine C w = -a) (hm:check m (Fin.cons (-a) C) Q hs = true) : check (.negative w m) C Q ((c,a) :: hs) = true:=by simp only [check,Bool.and_eq_true,linearEq_eq_true] exact ⟨⟨hw,ha⟩,hm⟩ private def zz25:"s0019"="s0019":=by decide+kernel theorem cons_constraints {n:ℕ} (C:Fin n → Linear) (a:Linear) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (ha:0 ≤ linearEval a x) : ∀ i:Fin (n + 1),0 ≤ linearEval ((Fin.cons a C:Fin (n + 1) → Linear) i) x:=by intro i refine Fin.cases ?_ (fun j => ?_) i · simpa using ha · simpa using hC j theorem positive_step (Q:Quadratic) (c:ℚ) (a:Linear) (hs:Hinges) (x:Point) (ha:0 ≤ linearEval a x) (h:0 ≤ quadraticEval (Q + c • product a a) x + hingeEval hs x) : 0 ≤ quadraticEval Q x + hingeEval ((c,a) :: hs) x:=by simpa only [hingeEval,List.map_cons,List.sum_cons,max_eq_left ha,quadraticEval_add, quadraticEval_smul,quadraticEval_product,pow_two,add_assoc] using h theorem negative_step (Q:Quadratic) (c:ℚ) (a:Linear) (hs:Hinges) (x:Point) (ha:linearEval a x ≤ 0) (h:0 ≤ quadraticEval Q x + hingeEval hs x) : 0 ≤ quadraticEval Q x + hingeEval ((c,a) :: hs) x:=by simpa only [hingeEval,List.map_cons,List.sum_cons,max_eq_right ha,zero_pow (by decide:2 ≠ 0), mul_zero,zero_add] using h theorem check_sound {n:ℕ} (cert:Certificate n) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check cert C Q hs = true):0 ≤ quadraticEval Q x + hingeEval hs x:=by induction cert generalizing Q hs with | leaf d => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q d x hC h | cons t ts => simp [check] at h | split p m hp hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact positive_step Q c a ts x ha (hp (Fin.cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.1) · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact negative_step Q c a ts x (le_of_not_ge ha) (hm (Fin.cons (-a) C) Q ts (cons_constraints C (-a) x hC ha') h.2) | positive w p hp => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true,linearEq_eq_true] at h have ha:=combine_nonneg C w x hC h.1.1 rw [h.1.2] at ha exact positive_step Q c a ts x ha (hp (Fin.cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.2) | negative w m hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true,linearEq_eq_true] at h have ha:=combine_nonneg C w x hC h.1.1 rw [h.1.2] at ha have ha':linearEval a x ≤ 0:=by rw [linearEval_neg] at ha; linarith exact negative_step Q c a ts x ha' (hm (Fin.cons (-a) C) Q ts (cons_constraints C (-a) x hC ha) h.2) end Green24Proof.QuadraticCertificates private def zz1997:"s07cd"="s07cd":=by decide+kernel end section namespace Green24Proof.IntegerQuadraticCertificates abbrev Linear:=Fin 4 → ℤ abbrev Quadratic:=Fin 4 → Fin 4 → ℤ abbrev Point:=Fin 4 → ℝ def linearEq (a b:Linear):Bool:=(List.finRange 4).all fun i => a i == b i private def zz26:"s001a"="s001a":=by decide+kernel theorem linearEq_eq_true (a b:Linear):linearEq a b = true ↔ a = b:=by simp only [linearEq,List.all_eq_true,List.mem_finRange,forall_true_left,beq_iff_eq] exact ⟨funext,fun h i => congrFun h i⟩ def quadraticEq (Q R:Quadratic):Bool:=(List.finRange 4).all fun i => linearEq (Q i) (R i) theorem quadraticEq_eq_true (Q R:Quadratic):quadraticEq Q R = true ↔ Q = R:=by simp only [quadraticEq,List.all_eq_true,List.mem_finRange,forall_true_left,linearEq_eq_true] exact ⟨funext,fun h i => congrFun h i⟩ def linearEval (a:Linear) (x:Point):ℝ:=∑ i,(a i:ℝ) * x i def quadraticEval (Q:Quadratic) (x:Point):ℝ := ∑ i, ∑ j,(Q i j:ℝ) * x i * x j def product (a b:Linear):Quadratic:=fun i j => a i * b j theorem linearEval_zero (x:Point):linearEval 0 x = 0:=by simp [linearEval] theorem linearEval_neg (a:Linear) (x:Point):linearEval (-a) x = -linearEval a x:=by simp [linearEval,Finset.sum_neg_distrib] private def zz27:"s001b"="s001b":=by decide+kernel theorem linearEval_add (a b:Linear) (x:Point) : linearEval (a + b) x = linearEval a x + linearEval b x:=by simp [linearEval,add_mul,Finset.sum_add_distrib] theorem linearEval_smul (c:ℤ) (a:Linear) (x:Point) : linearEval (c • a) x = (c:ℝ) * linearEval a x:=by simp [linearEval,mul_assoc,Finset.mul_sum] theorem quadraticEval_zero (x:Point):quadraticEval 0 x = 0:=by simp [quadraticEval] theorem quadraticEval_add (Q R:Quadratic) (x:Point) : quadraticEval (Q + R) x = quadraticEval Q x + quadraticEval R x:=by simp [quadraticEval,add_mul,Finset.sum_add_distrib] private def zz28:"s001c"="s001c":=by decide+kernel theorem quadraticEval_smul (c:ℤ) (Q:Quadratic) (x:Point) : quadraticEval (c • Q) x = (c:ℝ) * quadraticEval Q x:=by simp [quadraticEval,mul_assoc,Finset.mul_sum] theorem quadraticEval_product (a b:Linear) (x:Point) : quadraticEval (product a b) x = linearEval a x * linearEval b x:=by simp only [quadraticEval,product,Int.cast_mul,linearEval,Finset.sum_mul,Finset.mul_sum] rw [Finset.sum_comm] apply Finset.sum_congr rfl intro i _ apply Finset.sum_congr rfl intro j _ ring abbrev Combination (n:ℕ):=List (ℤ × Fin n) def combine {n:ℕ} (C:Fin n → Linear) (w:Combination n):Linear := (w.map fun t => t.1 • C t.2).sum def nonnegativeWeights {n:ℕ} (w:Combination n):Bool := w.all fun t => decide (0 ≤ t.1) theorem combine_nonneg {n:ℕ} (C:Fin n → Linear) (w:Combination n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:nonnegativeWeights w = true) : 0 ≤ linearEval (combine C w) x:=by induction w with | nil => simp [combine,linearEval_zero] | cons t ts ih => simp only [nonnegativeWeights,List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [combine,List.map_cons,List.sum_cons,linearEval_add,linearEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (hC t.2)) (ih hw.2) inductive NonnegativeTerm (n:ℕ) where | square (a:Linear) | pair (i j:Fin n) def termMatrix {n:ℕ} (C:Fin n → Linear):NonnegativeTerm n → Quadratic | .square a => product a a | .pair i j => product (C i) (C j) theorem termMatrix_nonneg {n:ℕ} (C:Fin n → Linear) (t:NonnegativeTerm n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) : 0 ≤ quadraticEval (termMatrix C t) x:=by cases t with | square a => simpa only [termMatrix,quadraticEval_product, ← sq] using sq_nonneg (linearEval a x) | pair i j => simpa only [termMatrix,quadraticEval_product] using mul_nonneg (hC i) (hC j) abbrev Decomposition (n:ℕ):=List (ℤ × NonnegativeTerm n) def decompositionMatrix {n:ℕ} (C:Fin n → Linear) (d:Decomposition n):Quadratic := (d.map fun t => t.1 • termMatrix C t.2).sum def decompositionCheck {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition n):Bool := decide (0 < s) && (d.all fun t => decide (0 ≤ t.1)) && quadraticEq (decompositionMatrix C d) (s • Q) private def zz29:"s001d"="s001d":=by decide+kernel theorem decomposition_nonneg {n:ℕ} (C:Fin n → Linear) (d:Decomposition n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:(d.all fun t => decide (0 ≤ t.1)) = true) : 0 ≤ quadraticEval (decompositionMatrix C d) x:=by induction d with | nil => simp [decompositionMatrix,quadraticEval_zero] | cons t ts ih => simp only [List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [decompositionMatrix,List.map_cons,List.sum_cons,quadraticEval_add, quadraticEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (termMatrix_nonneg C t.2 x hC)) (ih hw.2) theorem decompositionCheck_sound {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:decompositionCheck C Q s d = true):0 ≤ quadraticEval Q x:=by simp only [decompositionCheck,Bool.and_eq_true,quadraticEq_eq_true,decide_eq_true_eq] at h have hd:=decomposition_nonneg C d x hC h.1.2 rw [h.2,quadraticEval_smul] at hd exact nonneg_of_mul_nonneg_right hd (by exact_mod_cast h.1.1:(0:ℝ) < s) def combinationCheck {n:ℕ} (C:Fin n → Linear) (s:ℤ) (w:Combination n) (a:Linear):Bool := decide (0 < s) && nonnegativeWeights w && linearEq (combine C w) (s • a) theorem combinationCheck_sound {n:ℕ} (C:Fin n → Linear) (s:ℤ) (w:Combination n) (a:Linear) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:combinationCheck C s w a = true):0 ≤ linearEval a x:=by simp only [combinationCheck,Bool.and_eq_true,linearEq_eq_true,decide_eq_true_eq] at h have ha:=combine_nonneg C w x hC h.1.2 rw [h.2,linearEval_smul] at ha exact nonneg_of_mul_nonneg_right ha (by exact_mod_cast h.1.1:(0:ℝ) < s) abbrev Hinges:=List (ℤ × Linear) def hingeEval (hs:Hinges) (x:Point):ℝ := (hs.map fun t => (t.1:ℝ) * max (linearEval t.2 x) 0 ^ 2).sum inductive Certificate:ℕ → Type where | leaf {n:ℕ} (scale:ℤ) (d:Decomposition n):Certificate n | split {n:ℕ} (positive negative:Certificate (n + 1)):Certificate n | cut {n:ℕ} (a:Linear) (positive negative:Certificate (n + 1)):Certificate n | positive {n:ℕ} (scale:ℤ) (w:Combination n) (next:Certificate (n + 1)):Certificate n | negative {n:ℕ} (scale:ℤ) (w:Combination n) (next:Certificate (n + 1)):Certificate n def check {n:ℕ} (cert:Certificate n) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges):Bool := match cert,hs with | .cut a p m,hs => check p (Fin.cons a C) Q hs && check m (Fin.cons (-a) C) Q hs | .leaf s d,[] => decompositionCheck C Q s d | .split p m,(c,a) :: hs => check p (Fin.cons a C) (Q + c • product a a) hs && check m (Fin.cons (-a) C) Q hs | .positive s w p,(c,a) :: hs => combinationCheck C s w a && check p (Fin.cons a C) (Q + c • product a a) hs | .negative s w m,(_,a) :: hs => combinationCheck C s w (-a) && check m (Fin.cons (-a) C) Q hs | _,_ => false theorem cons_constraints {n:ℕ} (C:Fin n → Linear) (a:Linear) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (ha:0 ≤ linearEval a x) : ∀ i:Fin (n + 1),0 ≤ linearEval ((Fin.cons a C:Fin (n + 1) → Linear) i) x:=by intro i refine Fin.cases ?_ (fun j => ?_) i · simpa using ha · simpa using hC j private def zz30:"s001e"="s001e":=by decide+kernel theorem positive_step (Q:Quadratic) (c:ℤ) (a:Linear) (hs:Hinges) (x:Point) (ha:0 ≤ linearEval a x) (h:0 ≤ quadraticEval (Q + c • product a a) x + hingeEval hs x) : 0 ≤ quadraticEval Q x + hingeEval ((c,a) :: hs) x:=by simpa only [hingeEval,List.map_cons,List.sum_cons,max_eq_left ha,quadraticEval_add, quadraticEval_smul,quadraticEval_product,pow_two,add_assoc] using h theorem negative_step (Q:Quadratic) (c:ℤ) (a:Linear) (hs:Hinges) (x:Point) (ha:linearEval a x ≤ 0) (h:0 ≤ quadraticEval Q x + hingeEval hs x) : 0 ≤ quadraticEval Q x + hingeEval ((c,a) :: hs) x:=by simpa only [hingeEval,List.map_cons,List.sum_cons,max_eq_right ha,zero_pow (by decide:2 ≠ 0), mul_zero,zero_add] using h theorem check_sound {n:ℕ} (cert:Certificate n) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check cert C Q hs = true):0 ≤ quadraticEval Q x + hingeEval hs x:=by induction cert generalizing Q hs with | leaf s d => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q s d x hC h | cons t ts => simp [check] at h | split p m hp hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact positive_step Q c a ts x ha (hp (Fin.cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.1) · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact negative_step Q c a ts x (le_of_not_ge ha) (hm (Fin.cons (-a) C) Q ts (cons_constraints C (-a) x hC ha') h.2) | cut a p m hp hm => simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact hp (Fin.cons a C) Q hs (cons_constraints C a x hC ha) h.1 · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact hm (Fin.cons (-a) C) Q hs (cons_constraints C (-a) x hC ha') h.2 | positive s w p hp => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w a x hC h.1 exact positive_step Q c a ts x ha (hp (Fin.cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.2) | negative s w m hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w (-a) x hC h.1 have ha':linearEval a x ≤ 0:=by rw [linearEval_neg] at ha; linarith exact negative_step Q c a ts x ha' (hm (Fin.cons (-a) C) Q ts (cons_constraints C (-a) x hC ha) h.2) end Green24Proof.IntegerQuadraticCertificates private def zz1998:"s07ce"="s07ce":=by decide+kernel end section open Set Filter MeasureTheory open scoped Topology namespace Green24Proof theorem kernel_eq_positive_parts (a b c:ℝ) : kernel a b c = a * b - max (a + b - c) 0 ^ 2 / 4 + max (a - b - c) 0 ^ 2 / 4 + max (b - a - c) 0 ^ 2 / 4:=by unfold kernel by_cases h:a + b ≤ c · rw [max_eq_right (by linarith:a + b - c ≤ 0), max_eq_left (by linarith:0 ≤ c - a - b)] ring · rw [max_eq_left (by linarith:0 ≤ a + b - c), max_eq_right (by linarith:c - a - b ≤ 0)] ring private def zz31:"s001f"="s001f":=by decide+kernel theorem negPosSquare_hasDeriv_right (c t:ℝ) : HasDerivWithinAt (fun s:ℝ => max (c - s) 0 ^ 2) (-2 * max (c - t) 0) (Ioi t) t:=by by_cases h:t < c · rw [max_eq_left (by linarith:0 ≤ c - t)] have hd:=(((hasDerivAt_id t).const_sub c).pow 2).hasDerivWithinAt (s:=Ioi t) simp only [Nat.reduceSub,pow_one,id_eq] at hd have hd':HasDerivWithinAt (fun s:ℝ => (c - s) ^ 2) (-2 * (c - t)) (Ioi t) t:=by convert hd using 1 <;> first | rfl | ring apply hd'.congr_of_eventuallyEq · filter_upwards [nhdsWithin_le_nhds (Iio_mem_nhds h)] with s hs rw [max_eq_left (by linarith [show s < c from hs]:0 ≤ c - s)] · rw [max_eq_left (by linarith:0 ≤ c - t)] · rw [max_eq_right (by linarith:c - t ≤ 0),mul_zero] apply (hasDerivWithinAt_const t (Ioi t) (0:ℝ)).congr · intro s hs rw [max_eq_right (by linarith [show t < s from hs]:c - s ≤ 0)] norm_num · rw [max_eq_right (by linarith:c - t ≤ 0)] norm_num noncomputable def kernelSlope (a b c:ℝ):ℝ := min b (min c (max ((b + c - a) / 2) 0)) theorem kernelSlope_eq {a b c:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) : kernelSlope a b c = b - max (a + b - c) 0 / 2 + max (a - b - c) 0 / 2 - max (b - a - c) 0 / 2:=by unfold kernelSlope simp only [min_def,max_def] split_ifs <;> linarith theorem kernel_hasDeriv_right {a b c:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) : HasDerivWithinAt (fun s:ℝ => kernel s b c) (kernelSlope a b c) (Ioi a) a:=by have hd:=(((((hasDerivAt_id a).mul_const b).hasDerivWithinAt.sub ((posSquare_hasDeriv_right (c - b) a).div_const 4)).add ((posSquare_hasDeriv_right (b + c) a).div_const 4)).add ((negPosSquare_hasDeriv_right (b - c) a).div_const 4)) convert hd using 1 <;> try rfl · funext s change kernel s b c = s * b - max (s - (c - b)) 0 ^ 2 / 4 + max (s - (b + c)) 0 ^ 2 / 4 + max (b - c - s) 0 ^ 2 / 4 rw [kernel_eq_positive_parts] rw [show s - (c - b) = s + b - c by ring, show s - (b + c) = s - b - c by ring, show b - c - s = b - s - c by ring] · rw [kernelSlope_eq ha hb hc] rw [show a - (c - b) = a + b - c by ring, show a - (b + c) = a - b - c by ring, show b - c - a = b - a - c by ring] ring theorem kernel_continuous:Continuous (fun p:ℝ × ℝ × ℝ => kernel p.1 p.2.1 p.2.2):=by unfold kernel fun_prop private def zz32:"s0020"="s0020":=by decide+kernel theorem kernelSlope_continuous (b c:ℝ):Continuous (fun a => kernelSlope a b c):=by unfold kernelSlope fun_prop theorem kernelSlope_mono_middle (a c:ℝ):Monotone (fun b => kernelSlope a b c):=by intro b d hbd unfold kernelSlope exact min_le_min hbd (min_le_min_left c (max_le_max_right 0 (by linarith))) theorem kernel_integral_slope {a d b c:ℝ} (ha:0 ≤ a) (had:a ≤ d) (hb:0 ≤ b) (hc:0 ≤ c) : (∫ t in a..d,kernelSlope t b c) = kernel d b c - kernel a b c:=by apply intervalIntegral.integral_eq_sub_of_hasDeriv_right_of_le had · unfold kernel fun_prop · intro t ht exact kernel_hasDeriv_right (ha.trans ht.1.le) hb hc · exact (kernelSlope_continuous b c).intervalIntegrable _ _ theorem kernel_supermodular {a b c d z:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hz:0 ≤ z) (hac:a ≤ c) (hbd:b ≤ d) : kernel a d z + kernel c b z ≤ kernel a b z + kernel c d z:=by have h:=intervalIntegral.integral_mono_on (μ:=volume) hac ((kernelSlope_continuous b z).intervalIntegrable a c) ((kernelSlope_continuous d z).intervalIntegrable a c) (fun t _ => kernelSlope_mono_middle t z hbd) rw [kernel_integral_slope ha hac hb hz, kernel_integral_slope ha hac (hb.trans hbd) hz] at h linarith end Green24Proof end section /- Copyright (c) 2022 Mantas Bakšys. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Mantas Bakšys The finite swap argument below adapts Mathlib's `MonovaryOn.sum_smul_comp_perm_le_sum_smul` to a supermodular kernel. -/ namespace Green24Proof open Finset Equiv Equiv.Perm Function open scoped NNReal private def zz33:"s0021"="s0021":=by decide+kernel theorem supermodular_rearrangement_on {ι α β:Type*} [LinearOrder α] [LinearOrder β] (F:α → β → ℝ) (hF:∀ a a' b b',a ≤ a' → b ≤ b' → F a b' + F a' b ≤ F a b + F a' b') {s:Finset ι} {σ:Equiv.Perm ι} {f:ι → α} {g:ι → β} (hfg:MonovaryOn f g s) (hσ:{x | σ x ≠ x} ⊆ s) : ∑ i ∈ s,F (f i) (g (σ i)) ≤ ∑ i ∈ s,F (f i) (g i):=by classical induction s using induction_on_max_value fun i => toLex (g i,f i) generalizing σ with | empty => simp only [le_rfl,Finset.sum_empty] | insert a s has hamax hind => ?_ set τ:Perm ι:=σ.trans (swap a (σ a)) with hτ have hτs:{x | τ x ≠ x} ⊆ s:=by intro x hx simp only [τ,Ne,Set.mem_ofPred_eq,Equiv.swap_comp_apply] at hx split_ifs at hx with h₁ h₂ · obtain rfl | hax:=eq_or_ne x a · contradiction · exact mem_of_mem_insert_of_ne (hσ fun h => hax <| h.symm.trans h₁) hax · exact (hx <| σ.injective h₂.symm).elim · exact mem_of_mem_insert_of_ne (hσ hx) (ne_of_apply_ne _ h₂) specialize hind (hfg.subset <| Finset.subset_insert _ _) hτs simp_rw [sum_insert has] grw [← hind] obtain hσa | hσa:=eq_or_ne a (σ a) · rw [hτ, ← hσa,swap_self,trans_refl] have h1s:σ.symm a ∈ s:=by rw [Ne, ← inv_eq_iff_eq] at hσa refine mem_of_mem_insert_of_ne (hσ fun h => hσa ?_) hσa rwa [apply_symm_apply,eq_comm] at h simp only [← s.sum_erase_add _ h1s,add_comm] rw [← add_assoc, ← add_assoc] simp only [hτ,swap_apply_left,Function.comp_apply,Equiv.coe_trans,apply_symm_apply] refine add_le_add ?_ (sum_congr rfl fun x hx => ?_).le · rw [add_comm (F (f a) _),add_comm (F (f a) _)] apply hF · specialize hamax (σ.symm a) h1s rw [Prod.Lex.toLex_le_toLex] at hamax rcases hamax with hamax | hamax · exact hfg (mem_insert_of_mem h1s) (mem_insert_self _ _) hamax · exact hamax.2 · specialize hamax (σ a) (mem_of_mem_insert_of_ne (hσ <| σ.injective.ne hσa.symm) hσa.symm) rw [Prod.Lex.toLex_le_toLex] at hamax rcases hamax with hamax | hamax · exact hamax.le · exact hamax.1.le · rw [mem_erase,Ne,eq_symm_apply] at hx rw [swap_apply_of_ne_of_ne hx.1 (σ.injective.ne _)] rintro rfl exact has hx.2 theorem supermodular_rearrangement {ι α β:Type*} [Fintype ι] [LinearOrder α] [LinearOrder β] (F:α → β → ℝ) (hF:∀ a a' b b',a ≤ a' → b ≤ b' → F a b' + F a' b ≤ F a b + F a' b') {f:ι → α} {g:ι → β} (hfg:Monovary f g) (σ:Equiv.Perm ι) : ∑ i,F (f i) (g (σ i)) ≤ ∑ i,F (f i) (g i) := supermodular_rearrangement_on F hF (hfg.monovaryOn _) (fun _ _ => mem_univ _) theorem kernel_rearrangement {ι:Type*} [Fintype ι] (u:ι → ℝ) (hu:∀ i,0 ≤ u i) (σ:Equiv.Perm ι) {z:ℝ} (hz:0 ≤ z) : (∑ i,kernel (u i) (2 * u (σ i)) z) ≤ ∑ i,kernel (u i) (2 * u i) z:=by let f:ι → ℝ≥0:=fun i => ⟨u i,hu i⟩ have hfg:Monovary f f:=fun _ _ h => le_of_lt h exact supermodular_rearrangement (fun a b:ℝ≥0 => kernel a (2 * b) z) (fun a a' b b' ha hb => kernel_supermodular a.coe_nonneg (mul_nonneg (by norm_num) b.coe_nonneg) hz ha (by exact_mod_cast mul_le_mul_of_nonneg_left hb (by norm_num:(0:ℝ≥0) ≤ 2))) hfg σ theorem exists_sorted_equiv {ι:Type*} [Fintype ι] (u:ι → ℝ) : ∃ e:Fin (Fintype.card ι) ≃ ι,Monotone (fun i => u (e i)):=by classical let idx:=Fintype.equivFin ι let:LinearOrder ι:=LinearOrder.lift' (fun i => toLex (u i,idx i)) (by intro i j h exact idx.injective (congrArg (fun p:ℝ ×ₗ Fin (Fintype.card ι) => (ofLex p).2) h)) let e:=monoEquivOfFin ι rfl refine ⟨e.toEquiv, ?_⟩ intro i j hij have h:=e.monotone hij change toLex (u (e i),idx (e i)) ≤ toLex (u (e j),idx (e j)) at h rw [Prod.Lex.toLex_le_toLex] at h exact h.elim (fun h => h.le) (fun h => h.1.le) private def zz34:"s0022"="s0022":=by decide+kernel theorem kernel_two_profiles_rearrangement {ι:Type*} [Fintype ι] (u v:ι → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (eu ev:Fin (Fintype.card ι) ≃ ι) (heu:Monotone (fun i => u (eu i))) (hev:Monotone (fun i => v (ev i))) (σ:Equiv.Perm ι) {z:ℝ} (hz:0 ≤ z) : (∑ i,kernel (u (σ i)) (2 * v i) z) ≤ ∑ i,kernel (u (eu i)) (2 * v (ev i)) z:=by let f:Fin (Fintype.card ι) → ℝ≥0:=fun i => ⟨u (eu i),hu _⟩ let g:Fin (Fintype.card ι) → ℝ≥0:=fun i => ⟨v (ev i),hv _⟩ have hf:Monotone f:=heu have hg:Monotone g:=hev have h:=supermodular_rearrangement (fun a b:ℝ≥0 => kernel a (2 * b) z) (fun a a' b b' ha hb => kernel_supermodular a.coe_nonneg (mul_nonneg (by norm_num) b.coe_nonneg) hz ha (by exact_mod_cast mul_le_mul_of_nonneg_left hb (by norm_num:(0:ℝ≥0) ≤ 2))) (hf.monovary hg) ((eu.trans σ.symm).trans ev.symm) have heq:=(eu.trans σ.symm).sum_comp (fun i => kernel (u (σ i)) (2 * v i) z) simp only [Equiv.trans_apply,Equiv.apply_symm_apply] at heq rw [← heq] change (∑ i,kernel (u (eu i)) (2 * v (ev (((eu.trans σ.symm).trans ev.symm) i))) z) ≤ ∑ i,kernel (u (eu i)) (2 * v (ev i)) z at h simpa only [Equiv.trans_apply,Equiv.apply_symm_apply] using h end Green24Proof end section namespace Green24Proof theorem kernel_zero_first {b c:ℝ} (hb:0 ≤ b) (hc:0 ≤ c):kernel 0 b c = 0:=by have h₁:=kernel_nonneg (le_refl 0) hb hc have h₂:=kernel_le_product (le_refl 0) hb hc linarith theorem kernel_zero_middle {a c:ℝ} (ha:0 ≤ a) (hc:0 ≤ c):kernel a 0 c = 0:=by rw [kernel_swap12,kernel_zero_first ha hc] theorem kernel_zero_last {a b:ℝ} (ha:0 ≤ a) (hb:0 ≤ b):kernel a b 0 = 0:=by rw [kernel_cycle,kernel_swap12,kernel_zero_first hb ha] private def zz35:"s0023"="s0023":=by decide+kernel theorem kernel_diagonal_pair_ordered {x y:ℝ} (hy:0 ≤ y) (hyx:y ≤ x) : kernel x (2 * x) (3 * y) + kernel y (2 * y) (3 * x) = 4 * x * y - rho x y:=by rw [kernel_eq_product hy (by positivity) (by linarith:y + 2 * y ≤ 3 * x)] by_cases h:x ≤ 3 * y · rw [rho_eq_balanced hyx h,kernel_eq_triangle (by linarith) (by linarith) (by linarith)] ring · rw [rho_eq_unbalanced hyx (le_of_not_ge h),kernel_swap23, kernel_eq_product (hy.trans hyx) (by positivity) (by linarith)] ring theorem kernel_diagonal_pair {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : kernel x (2 * x) (3 * y) + kernel y (2 * y) (3 * x) = 4 * x * y - rho x y:=by rcases le_total y x with h | h · exact kernel_diagonal_pair_ordered hy h · have heq:=kernel_diagonal_pair_ordered hx h rw [rho_comm y x] at heq nlinarith [heq] theorem kernel_mixed_linear {b s d:ℝ} (hb:0 ≤ b) (hs:0 ≤ s) (hd:0 ≤ d) : kernel b s (3 * d) ≤ 2 * d * s + d * max (b - 2 * d) 0:=by by_cases h:b ≤ 2 * d · rw [max_eq_right (by linarith:b - 2 * d ≤ 0)] have hk:=kernel_le_product hb hs (by positivity:0 ≤ 3 * d) nlinarith [mul_nonneg hs (by linarith:0 ≤ 2 * d - b)] rw [max_eq_left (by linarith:0 ≤ b - 2 * d)] by_cases h₁:b + s ≤ 3 * d · rw [kernel_eq_product hb hs h₁] nlinarith [mul_nonneg (by linarith:0 ≤ b - 2 * d) (by linarith:0 ≤ d - s)] by_cases h₂:b + 3 * d ≤ s · rw [kernel_swap23,kernel_eq_product hb (by positivity) h₂] nlinarith [mul_nonneg hd (by linarith:0 ≤ s - b - d)] by_cases h₃:s + 3 * d ≤ b · rw [kernel_cycle,kernel_eq_product hs (by positivity) h₃] nlinarith [mul_nonneg hd (by linarith:0 ≤ b - s - 2 * d)] rw [kernel_eq_triangle (le_of_not_ge h₃) (le_of_not_ge h₂) (le_of_not_ge h₁)] nlinarith [sq_nonneg (s - b + d)] theorem rho_ge_mixed_linear {b d:ℝ} (hb:0 ≤ b) (hd:0 ≤ d) : d * max (b - 2 * d) 0 ≤ rho b d:=by by_cases h:b ≤ 2 * d · rw [max_eq_right (by linarith:b - 2 * d ≤ 0),mul_zero] exact rho_nonneg hb hd rw [max_eq_left (by linarith:0 ≤ b - 2 * d)] have hdb:d ≤ b:=by linarith by_cases h':b ≤ 3 * d · rw [rho_eq_balanced hdb h'] nlinarith [sq_nonneg (b - 3 * d)] · rw [rho_eq_unbalanced hdb (le_of_not_ge h')] ring_nf exact le_refl _ private def zz36:"s0024"="s0024":=by decide+kernel theorem kernel_mixed_bound {a b d:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hd:0 ≤ d) : kernel b (2 * a) (3 * d) ≤ 4 * a * d + rho b d:=by have h₁:=kernel_mixed_linear hb (by positivity:0 ≤ 2 * a) hd have h₂:=rho_ge_mixed_linear hb hd nlinarith noncomputable def kernelError (a b c:ℝ):ℝ:=2 * a * b - kernel a (2 * b) (3 * c) theorem kernelError_identity (a b c:ℝ) : 4 * kernelError a b c = max (a + 2 * b - 3 * c) 0 ^ 2 - max (a - 2 * b - 3 * c) 0 ^ 2 - max (2 * b - a - 3 * c) 0 ^ 2:=by unfold kernelError rw [kernel_eq_positive_parts] ring theorem kernelError_common_add (a b c:ℝ) {t:ℝ} (ht:0 ≤ t) : kernelError a b c ≤ kernelError (a + t) (b + t) (c + t):=by have h₁:=kernelError_identity a b c have h₂:=kernelError_identity (a + t) (b + t) (c + t) rw [show a + t + 2 * (b + t) - 3 * (c + t) = a + 2 * b - 3 * c by ring] at h₂ have hleft:max (a + t - 2 * (b + t) - 3 * (c + t)) 0 ^ 2 ≤ max (a - 2 * b - 3 * c) 0 ^ 2:=by exact pow_le_pow_left₀ (le_max_right _ _) (max_le_max_right 0 (by linarith)) 2 have hright:max (2 * (b + t) - (a + t) - 3 * (c + t)) 0 ^ 2 ≤ max (2 * b - a - 3 * c) 0 ^ 2:=by exact pow_le_pow_left₀ (le_max_right _ _) (max_le_max_right 0 (by linarith)) 2 linarith noncomputable def mixedPair (a b c d:ℝ):ℝ := kernel a (2 * a) (3 * c) + kernel a (2 * b) (3 * c) + kernel b (2 * a) (3 * d) + kernel b (2 * b) (3 * d) noncomputable def eightSlack (a b c d:ℝ):ℝ := 4 * (a + b) * (c + d) - mixedPair a b c d - mixedPair c d a b theorem eightSlack_errors (a b c d:ℝ) : eightSlack a b c d = -2 * (a + b - c - d) ^ 2 + kernelError a a c + kernelError a b c + kernelError b a d + kernelError b b d + kernelError c c a + kernelError c d a + kernelError d c b + kernelError d d b:=by unfold eightSlack mixedPair kernelError ring private def zz37:"s0025"="s0025":=by decide+kernel theorem eightSlack_common_add (a b c d:ℝ) {t:ℝ} (ht:0 ≤ t) : eightSlack a b c d ≤ eightSlack (a + t) (b + t) (c + t) (d + t):=by rw [eightSlack_errors,eightSlack_errors] rw [show a + t + (b + t) - (c + t) - (d + t) = a + b - c - d by ring] linarith [kernelError_common_add a a c ht,kernelError_common_add a b c ht, kernelError_common_add b a d ht,kernelError_common_add b b d ht, kernelError_common_add c c a ht,kernelError_common_add c d a ht, kernelError_common_add d c b ht,kernelError_common_add d d b ht] theorem eightSlack_swap_pairs (a b c d:ℝ):eightSlack a b c d = eightSlack c d a b:=by unfold eightSlack ring theorem eightSlack_swap_both (a b c d:ℝ):eightSlack a b c d = eightSlack b a d c:=by unfold eightSlack mixedPair ring theorem eightSlack_boundary {a b d:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hd:0 ≤ d) : 0 ≤ eightSlack a b 0 d:=by unfold eightSlack mixedPair simp only [mul_zero,zero_add,kernel_zero_last ha (by positivity:0 ≤ 2 * a), kernel_zero_last ha (by positivity:0 ≤ 2 * b), kernel_zero_first (by positivity:0 ≤ 2 * d) (by positivity:0 ≤ 3 * a), kernel_zero_first (le_refl 0) (by positivity:0 ≤ 3 * a), kernel_zero_middle hd (by positivity:0 ≤ 3 * b)] have h₁:=kernel_diagonal_pair hb hd have h₂:=kernel_mixed_bound ha hb hd linarith private def zz38:"s0026"="s0026":=by decide+kernel theorem mixedPair_eight_term {a b c d:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) (hd:0 ≤ d) : mixedPair a b c d + mixedPair c d a b ≤ 4 * (a + b) * (c + d):=by suffices 0 ≤ eightSlack a b c d by unfold eightSlack at this; linarith have hmin (w x y z:ℝ) (hy:0 ≤ y) (hyx:y ≤ x) (hyw:y ≤ w) (hyz:y ≤ z) : 0 ≤ eightSlack w x y z:=by have h₁:=eightSlack_boundary (sub_nonneg.mpr hyw) (sub_nonneg.mpr hyx) (sub_nonneg.mpr hyz) have h₂:=eightSlack_common_add (w - y) (x - y) 0 (z - y) hy simp only [sub_add_cancel,zero_add] at h₂ exact h₁.trans h₂ rcases le_total a b with hab | hba <;> rcases le_total c d with hcd | hdc · rcases le_total a c with hac | hca · rw [eightSlack_swap_pairs] exact hmin c d a b ha (hac.trans hcd) hac hab · exact hmin a b c d hc (hca.trans hab) hca hcd · rcases le_total a d with had | hda · rw [eightSlack_swap_pairs] exact hmin c d a b ha had (had.trans hdc) hab · rw [eightSlack_swap_both] exact hmin b a d c hd hda (hda.trans hab) hdc · rcases le_total b c with hbc | hcb · rw [eightSlack_swap_both,eightSlack_swap_pairs] exact hmin d c b a hb hbc (hbc.trans hcd) hba · exact hmin a b c d hc hcb (hcb.trans hba) hcd · rcases le_total b d with hbd | hdb · rw [eightSlack_swap_both,eightSlack_swap_pairs] exact hmin d c b a hb (hbd.trans hdc) hbd hba · rw [eightSlack_swap_both] exact hmin b a d c hd (hdb.trans hba) hdb hdc end Green24Proof end section namespace Green24Proof theorem kernel_rearrangement_left {ι:Type*} [Fintype ι] (u:ι → ℝ) (hu:∀ i,0 ≤ u i) (σ:Equiv.Perm ι) {z:ℝ} (hz:0 ≤ z) : (∑ i,kernel (u (σ i)) (2 * u i) z) ≤ ∑ i,kernel (u i) (2 * u i) z:=by have hsum:=σ.symm.sum_comp (fun i => kernel (u (σ i)) (2 * u i) z) simp only [Equiv.apply_symm_apply] at hsum rw [← hsum] exact kernel_rearrangement u hu σ.symm hz theorem aligned_kernel_sum {ι:Type*} [Fintype ι] (u:ι → ℝ) (hu:∀ i,0 ≤ u i) : (∑ i, ∑ j,kernel (u i) (2 * u i) (3 * u j)) = 2 * mass u ^ 2 - energy u:=by have hswap:(∑ i, ∑ j,kernel (u j) (2 * u j) (3 * u i)) = ∑ i, ∑ j,kernel (u i) (2 * u i) (3 * u j):=Finset.sum_comm have hpair:(∑ i, ∑ j,(kernel (u i) (2 * u i) (3 * u j) + kernel (u j) (2 * u j) (3 * u i))) = ∑ i, ∑ j,(4 * u i * u j - rho (u i) (u j)):=by apply Finset.sum_congr rfl intro i _ exact Finset.sum_congr rfl (fun j _ => kernel_diagonal_pair (hu i) (hu j)) have hprod:(∑ i, ∑ j,4 * u i * u j) = 4 * mass u ^ 2:=by simp only [← Finset.mul_sum, ← Finset.sum_mul] unfold mass ring simp only [Finset.sum_add_distrib,Finset.sum_sub_distrib] at hpair rw [hswap,hprod] at hpair unfold energy linarith theorem profileFunctional_le_of_middle_bijective {q:ℕ} [NeZero q] (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (hbij:∀ k:ZMod q,Function.Bijective (fun j:ZMod q => 3 * k - 2 * j)) : profileFunctional g ≤ 2 * mass g ^ 2 - energy g:=by unfold profileFunctional rw [Finset.sum_comm] calc (∑ k, ∑ j,kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k)) ≤ ∑ k, ∑ j,kernel (g j) (2 * g j) (3 * g k):=by apply Finset.sum_le_sum intro k _ exact kernel_rearrangement_left g hg (Equiv.ofBijective _ (hbij k)) (mul_nonneg (by norm_num) (hg k)) _ = 2 * mass g ^ 2 - energy g:=by rw [Finset.sum_comm] exact aligned_kernel_sum g hg private def zz39:"s0027"="s0027":=by decide+kernel theorem energy_le_deficit_of_odd {q:ℕ} [NeZero q] (hq:Odd q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):energy g ≤ deficit g:=by have hu:IsUnit (2:ZMod q):=ZMod.isUnit_prime_of_not_dvd Nat.prime_two (by simpa only [← even_iff_two_dvd,Nat.not_even_iff_odd] using hq) have hmul:=IsUnit.isUnit_iff_mulLeft_bijective.mp hu have hbij (k:ZMod q):Function.Bijective (fun j:ZMod q => 3 * k - 2 * j) := (Equiv.subLeft (3 * k)).bijective.comp hmul have h:=profileFunctional_le_of_middle_bijective g hg hbij unfold deficit linarith theorem deficit_nonneg_of_odd {q:ℕ} [NeZero q] (hq:Odd q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):0 ≤ deficit g := (energy_nonneg hg).trans (energy_le_deficit_of_odd hq g hg) end Green24Proof end section namespace Green24Proof theorem sorted_pair_sum_bound {ι:Type*} [Fintype ι] (u v:ι → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (eu ev:Fin (Fintype.card ι) ≃ ι) (heu:Monotone (fun i => u (eu i))) (hev:Monotone (fun i => v (ev i))) (σ:ι → Equiv.Perm ι) : (∑ k, ∑ j,kernel (u (σ k j)) (2 * v j) (3 * u k)) ≤ ∑ k, ∑ i,kernel (u (eu i)) (2 * v (ev i)) (3 * u (eu k)):=by calc _ ≤ ∑ k, ∑ i,kernel (u (eu i)) (2 * v (ev i)) (3 * u k):=by exact Finset.sum_le_sum fun k _ => kernel_two_profiles_rearrangement u v hu hv eu ev heu hev (σ k) (mul_nonneg (by norm_num) (hu k)) _ = _:=(eu.sum_comp _).symm noncomputable def pairedFunctional {ι:Type*} [Fintype ι] (u v:ι → ℝ) (σ:ι → Equiv.Perm ι):ℝ := ∑ k, ∑ j,(kernel (u (σ k j)) (2 * u j) (3 * u k) + kernel (u (σ k j)) (2 * v j) (3 * u k) + kernel (v (σ k j)) (2 * u j) (3 * v k) + kernel (v (σ k j)) (2 * v j) (3 * v k)) theorem mixedPair_sum_bound {ι:Type*} [Fintype ι] (u v:ι → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (∑ i, ∑ k,mixedPair (u i) (v i) (u k) (v k)) ≤ 2 * (mass u + mass v) ^ 2:=by have h:=Finset.sum_le_sum (s:=Finset.univ) (fun i _ => Finset.sum_le_sum (s:=Finset.univ) (fun k _ => mixedPair_eight_term (hu i) (hv i) (hu k) (hv k))) have hswap:(∑ i, ∑ k,mixedPair (u k) (v k) (u i) (v i)) = ∑ i, ∑ k,mixedPair (u i) (v i) (u k) (v k):=Finset.sum_comm have hprod:(∑ i, ∑ k,4 * (u i + v i) * (u k + v k)) = 4 * (mass u + mass v) ^ 2:=by simp only [← Finset.mul_sum, ← Finset.sum_mul,Finset.sum_add_distrib] unfold mass ring simp only [Finset.sum_add_distrib] at h rw [hswap,hprod] at h linarith private def zz40:"s0028"="s0028":=by decide+kernel theorem pairedFunctional_le {ι:Type*} [Fintype ι] (u v:ι → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (σ:ι → Equiv.Perm ι) : pairedFunctional u v σ ≤ 2 * (mass u + mass v) ^ 2:=by obtain ⟨eu,heu⟩:=exists_sorted_equiv u obtain ⟨ev,hev⟩:=exists_sorted_equiv v have h₁:=sorted_pair_sum_bound u u hu hu eu eu heu heu σ have h₂:=sorted_pair_sum_bound u v hu hv eu ev heu hev σ have h₃:=sorted_pair_sum_bound v u hv hu ev eu hev heu σ have h₄:=sorted_pair_sum_bound v v hv hv ev ev hev hev σ have hsum:=mixedPair_sum_bound (fun i => u (eu i)) (fun i => v (ev i)) (fun i => hu _) (fun i => hv _) have hmu:mass (fun i => u (eu i)) = mass u:=eu.sum_comp u have hmv:mass (fun i => v (ev i)) = mass v:=ev.sum_comp v rw [hmu,hmv,Finset.sum_comm] at hsum unfold mixedPair at hsum unfold pairedFunctional simp only [Finset.sum_add_distrib] at hsum ⊢ linarith noncomputable def ringFunctional {R:Type*} [Fintype R] [CommRing R] (g:R → ℝ):ℝ := ∑ j, ∑ k,kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k) theorem ringFunctional_equiv {R S:Type*} [Fintype R] [Fintype S] [CommRing R] [CommRing S] (e:R ≃+* S) (g:R → ℝ) : ringFunctional g = ringFunctional (fun x => g (e.symm x)):=by unfold ringFunctional rw [← e.symm.toEquiv.sum_comp] apply Finset.sum_congr rfl intro j _ rw [← e.symm.toEquiv.sum_comp] simp only [map_sub,map_mul,map_ofNat,RingEquiv.toEquiv_eq_coe,RingEquiv.coe_toEquiv] theorem mass_ringEquiv {R S:Type*} [Fintype R] [Fintype S] [CommRing R] [CommRing S] (e:R ≃+* S) (g:R → ℝ) : mass g = mass (fun x => g (e.symm x)):=(e.symm.toEquiv.sum_comp g).symm theorem sum_zmod_two (f:ZMod 2 → ℝ):(∑ i,f i) = f 0 + f 1 := Fin.sum_univ_two f private def zz41:"s0029"="s0029":=by decide+kernel theorem productFunctional_eq {R:Type*} [Fintype R] [CommRing R] (g:ZMod 2 × R → ℝ) (σ:R → Equiv.Perm R) (hσ:∀ k j,σ k j = 3 * k - 2 * j) : ringFunctional g = pairedFunctional (fun i => g (0,i)) (fun i => g (1,i)) σ:=by have hp (j k:ZMod 2):3 * k - 2 * j = k:=by rw [show (3:ZMod 2) = 1 from rfl,show (2:ZMod 2) = 0 from rfl] simp only [one_mul,zero_mul,sub_zero] unfold ringFunctional pairedFunctional simp only [Fintype.sum_prod_type] change (∑ r:ZMod 2, ∑ j:R, ∑ s:ZMod 2, ∑ k:R, kernel (g (3 * s - 2 * r,3 * k - 2 * j)) (2 * g (r,j)) (3 * g (s,k))) = _ simp only [hp,sum_zmod_two,Finset.sum_add_distrib,hσ] rw [Finset.sum_comm (f:=fun j k:R => kernel (g (0,3 * k - 2 * j)) (2 * g (0,j)) (3 * g (0,k))), Finset.sum_comm (f:=fun j k:R => kernel (g (1,3 * k - 2 * j)) (2 * g (0,j)) (3 * g (1,k))), Finset.sum_comm (f:=fun j k:R => kernel (g (0,3 * k - 2 * j)) (2 * g (1,j)) (3 * g (0,k))), Finset.sum_comm (f:=fun j k:R => kernel (g (1,3 * k - 2 * j)) (2 * g (1,j)) (3 * g (1,k)))] ring theorem productFunctional_le {R:Type*} [Fintype R] [CommRing R] (g:ZMod 2 × R → ℝ) (hg:∀ i,0 ≤ g i) (hunit:IsUnit (2:R)) : ringFunctional g ≤ 2 * mass g ^ 2:=by have hmul:=IsUnit.isUnit_iff_mulLeft_bijective.mp hunit let σ (k:R):Equiv.Perm R:=Equiv.ofBijective (fun j => 3 * k - 2 * j) ((Equiv.subLeft (3 * k)).bijective.comp hmul) rw [productFunctional_eq g σ (fun _ _ => rfl)] have hm:mass g = mass (fun i => g (0,i)) + mass (fun i => g (1,i)):=by unfold mass rw [Fintype.sum_prod_type,sum_zmod_two] rw [hm] exact pairedFunctional_le _ _ (fun i => hg _) (fun i => hg _) σ theorem deficit_nonneg_of_twice_odd {m:ℕ} [NeZero m] (hm:Odd m) (g:ZMod (2 * m) → ℝ) (hg:∀ i,0 ≤ g i):0 ≤ deficit g:=by have hndvd:¬2 ∣ m:=by simpa only [← even_iff_two_dvd,Nat.not_even_iff_odd] using hm have hcop:Nat.Coprime 2 m:=(Nat.prime_two.coprime_iff_not_dvd).mpr hndvd let e:=ZMod.chineseRemainder hcop have h:=productFunctional_le (fun x => g (e.symm x)) (fun x => hg _) (ZMod.isUnit_prime_of_not_dvd Nat.prime_two hndvd) rw [← ringFunctional_equiv e g, ← mass_ringEquiv e g] at h exact sub_nonneg.mpr h theorem deficit_nonneg_of_twelve_not_dvd {q:ℕ} [NeZero q] (hq:¬12 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):0 ≤ deficit g:=by by_cases h3:3 ∣ q · have h4:¬4 ∣ q:=by intro h4 exact hq ((by decide:Nat.Coprime 3 4).mul_dvd_of_dvd_of_dvd h3 h4) by_cases h2:2 ∣ q · obtain ⟨m,rfl⟩:=h2 have hm0:m ≠ 0:=by intro hm exact NeZero.ne (2 * m) (by rw [hm,mul_zero]) have:NeZero m:=⟨hm0⟩ have hm:Odd m:=by rw [← Nat.not_even_iff_odd,even_iff_two_dvd] rintro ⟨k,hk⟩ apply h4 refine ⟨k, ?_⟩ omega exact deficit_nonneg_of_twice_odd hm g hg · exact deficit_nonneg_of_odd (by simpa only [← even_iff_two_dvd,Nat.not_even_iff_odd] using h2) g hg · exact deficit_nonneg_of_three_not_dvd h3 g hg end Green24Proof end section namespace Green24Proof noncomputable def doubleResidue (m:ℕ):ZMod m →+ ZMod (2 * m) := ZMod.lift m ⟨ { toFun:=fun z:ℤ => 2 * (z:ZMod (2 * m)) map_zero':=by simp map_add':=by intros; simp [mul_add] },by change 2 * ((m:ℤ):ZMod (2 * m)) = 0 simpa only [Int.cast_natCast,Nat.cast_mul,Nat.cast_ofNat] using (ZMod.natCast_self (2 * m))⟩ private def zz42:"s002a"="s002a":=by decide+kernel theorem doubleResidue_natCast (m n:ℕ):doubleResidue m (n:ZMod m) = 2 * (n:ZMod (2 * m)):=by unfold doubleResidue rw [← Int.cast_natCast n,ZMod.lift_coe] simp only [Int.cast_natCast,AddMonoidHom.coe_mk,ZeroHom.coe_mk] theorem doubleResidue_val {m:ℕ} [NeZero m] (x:ZMod m) : doubleResidue m x = 2 * (x.val:ZMod (2 * m)):=by conv_lhs => rw [← ZMod.natCast_zmod_val x] exact doubleResidue_natCast m x.val theorem doubleResidue_mul_nat (m n:ℕ) (x:ZMod m) : doubleResidue m (n * x) = n * doubleResidue m x:=by simpa only [nsmul_eq_mul] using (doubleResidue m).map_nsmul n x noncomputable def parityEquiv (m:ℕ) [NeZero m]:(ZMod 2 × ZMod m) ≃ ZMod (2 * m) where toFun p:=((2 * p.2.val + p.1.val:ℕ):ZMod (2 * m)) invFun x:=(((x.val % 2:ℕ):ZMod 2),((x.val / 2:ℕ):ZMod m)) left_inv:=by rintro ⟨r,i⟩ have hr:=r.val_lt have hi:=i.val_lt have hlt:2 * i.val + r.val < 2 * m:=by omega simp only [ZMod.val_natCast_of_lt hlt] apply Prod.ext · have hmod:(2 * i.val + r.val) % 2 = r.val:=by omega simp only [hmod,ZMod.natCast_zmod_val] · have hdiv:(2 * i.val + r.val) / 2 = i.val:=by omega simp only [hdiv,ZMod.natCast_zmod_val] right_inv:=by intro x have hx:=x.val_lt have hmod:x.val % 2 < 2:=Nat.mod_lt _ (by norm_num) have hdiv:x.val / 2 < m:=by omega simp only [ZMod.val_natCast_of_lt hmod,ZMod.val_natCast_of_lt hdiv] rw [show 2 * (x.val / 2) + x.val % 2 = x.val by omega] exact ZMod.natCast_zmod_val x theorem parityEquiv_apply {m:ℕ} [NeZero m] (r:ZMod 2) (i:ZMod m) : parityEquiv m (r,i) = doubleResidue m i + (r.val:ZMod (2 * m)):=by change ((2 * i.val + r.val:ℕ):ZMod (2 * m)) = _ rw [Nat.cast_add,Nat.cast_mul,Nat.cast_ofNat,doubleResidue_val] private def zz43:"s002b"="s002b":=by decide+kernel theorem parityEquiv_affine {m:ℕ} [NeZero m] (r s:ZMod 2) (j k:ZMod m) : 3 * parityEquiv m (s,k) - 2 * parityEquiv m (r,j) = parityEquiv m (s,3 * k - 2 * j + (s.val:ZMod m) - (r.val:ZMod m)):=by rw [parityEquiv_apply,parityEquiv_apply,parityEquiv_apply] have h3:doubleResidue m (3 * k) = 3 * doubleResidue m k:=by simpa only [Nat.cast_ofNat] using doubleResidue_mul_nat m 3 k have h2:doubleResidue m (2 * j) = 2 * doubleResidue m j:=by simpa only [Nat.cast_ofNat] using doubleResidue_mul_nat m 2 j rw [map_sub,map_add,map_sub,h3,h2,doubleResidue_natCast,doubleResidue_natCast] ring noncomputable def interleave {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (x:ZMod (2 * m)):ℝ := if ((parityEquiv m).symm x).1 = 0 then u ((parityEquiv m).symm x).2 else v ((parityEquiv m).symm x).2 theorem interleave_even {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (i:ZMod m) : interleave u v (parityEquiv m (0,i)) = u i:=by simp [interleave] theorem interleave_odd {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (i:ZMod m) : interleave u v (parityEquiv m (1,i)) = v i:=by simp [interleave] theorem interleave_nonneg {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i):∀ i,0 ≤ interleave u v i:=by intro i unfold interleave split_ifs <;> first | exact hu _ | exact hv _ private def zz44:"s002c"="s002c":=by decide+kernel theorem mass_interleave {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : mass (interleave u v) = mass u + mass v:=by unfold mass rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type,sum_zmod_two] simp only [interleave_even,interleave_odd] noncomputable def mixedFunctional {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (t:ZMod m):ℝ := ∑ j, ∑ k,kernel (u (3 * k - 2 * j + t)) (2 * v j) (3 * u k) theorem profileFunctional_interleave {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : profileFunctional (interleave u v) = profileFunctional u + profileFunctional v + mixedFunctional u v (-1) + mixedFunctional v u 1:=by unfold profileFunctional rw [← (parityEquiv m).sum_comp] simp only [Fintype.sum_prod_type,sum_zmod_two] have hrow (r:ZMod 2) (j:ZMod m) : (∑ k,kernel (interleave u v (3 * k - 2 * parityEquiv m (r,j))) (2 * interleave u v (parityEquiv m (r,j))) (3 * interleave u v k)) = ∑ s:ZMod 2, ∑ k:ZMod m, kernel (interleave u v (parityEquiv m (s,3 * k - 2 * j + (s.val:ZMod m) - (r.val:ZMod m)))) (2 * interleave u v (parityEquiv m (r,j))) (3 * interleave u v (parityEquiv m (s,k))):=by rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type] simp only [parityEquiv_affine] simp_rw [hrow] simp only [sum_zmod_two,ZMod.val_zero,ZMod.val_one,Nat.cast_zero,Nat.cast_one, sub_zero,add_zero,add_sub_cancel_right,interleave_even,interleave_odd, Finset.sum_add_distrib] unfold mixedFunctional simp only [sub_eq_add_neg] ring end Green24Proof end section namespace Green24Proof theorem kernel_le_middle_min {a b c:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) : kernel a b c ≤ b * min a c:=by have h₁:=kernel_le_product ha hb hc have h₂:=kernel_le_product hb hc ha rw [← kernel_cycle a b c] at h₂ rcases le_total a c with h | h · rw [min_eq_left h] nlinarith · rw [min_eq_right h] exact h₂ theorem mixedFunctional_le_overlap {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) {R:ℝ} (hR:∀ j,overlap (overlapMap j) u ≤ R) : mixedFunctional u v (-1) ≤ 2 * mass v * R:=by unfold mixedFunctional calc _ ≤ ∑ j, ∑ k,2 * v j * min (u (3 * k - 2 * j + -1)) (3 * u k):=by apply Finset.sum_le_sum intro j _ exact Finset.sum_le_sum fun k _ => kernel_le_middle_min (hu _) (mul_nonneg (by norm_num) (hv _)) (mul_nonneg (by norm_num) (hu _)) _ = ∑ j,2 * v j * overlap (overlapMap j) u:=by simp only [overlap,overlapMap,sub_eq_add_neg,Finset.mul_sum] _ ≤ ∑ j,2 * v j * R:=by exact Finset.sum_le_sum fun j _ => mul_le_mul_of_nonneg_left (hR j) (mul_nonneg (by norm_num) (hv j)) _ = 2 * mass v * R:=by unfold mass rw [← Finset.sum_mul, ← Finset.mul_sum] noncomputable def classMass {ι:Type*} [Fintype ι] (χ:ι → ZMod 2) (u:ι → ℝ) (r:ZMod 2):ℝ:=∑ i,if χ i = r then u i else 0 private def zz45:"s002d"="s002d":=by decide+kernel theorem classMass_nonneg {ι:Type*} [Fintype ι] (χ:ι → ZMod 2) (u:ι → ℝ) (hu:∀ i,0 ≤ u i) (r:ZMod 2):0 ≤ classMass χ u r:=by exact Finset.sum_nonneg fun i _ => by split_ifs <;> first | exact hu _ | rfl theorem classMass_sum {ι:Type*} [Fintype ι] (χ:ι → ZMod 2) (u:ι → ℝ) : classMass χ u 0 + classMass χ u 1 = mass u:=by rw [← sum_zmod_two] unfold classMass rw [Finset.sum_comm] simp only [Finset.sum_ite_eq,Finset.mem_univ,if_true,mass] theorem zmod_two_eq_zero_or_one (r:ZMod 2):r = 0 ∨ r = 1:=by have hr:=r.val_lt have h:r.val = 0 ∨ r.val = 1:=by omega rcases h with h | h · left apply ZMod.val_injective 2 simpa using h · right apply ZMod.val_injective 2 change r.val = 1 exact h theorem two_class_cross_sum {ι:Type*} [Fintype ι] (χ:ι → ZMod 2) (u:ι → ℝ) : (∑ i,u i * classMass χ u (χ i + 1)) = 2 * classMass χ u 0 * classMass χ u 1:=by have hpoint (i:ι):u i * classMass χ u (χ i + 1) = (if χ i = 0 then u i else 0) * classMass χ u 1 + (if χ i = 1 then u i else 0) * classMass χ u 0:=by rcases zmod_two_eq_zero_or_one (χ i) with h | h · simp [h] · simp [h,show (1:ZMod 2) + 1 = 0 from rfl] simp_rw [hpoint] rw [Finset.sum_add_distrib, ← Finset.sum_mul, ← Finset.sum_mul] change classMass χ u 0 * classMass χ u 1 + classMass χ u 1 * classMass χ u 0 = _ ring private def zz46:"s002e"="s002e":=by decide+kernel theorem odd_shift_correlation_le_parity {m:ℕ} [NeZero m] (h2:2 ∣ m) (u:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) : (∑ k, ∑ j,u (3 * k - 2 * j + 1) * u k) ≤ 4 * classMass (ZMod.castHom h2 (ZMod 2)) u 0 * classMass (ZMod.castHom h2 (ZMod 2)) u 1:=by let χ:=ZMod.castHom h2 (ZMod 2) have hrow (k:ZMod m):(∑ j,u (3 * k - 2 * j + 1)) ≤ 2 * classMass χ u (χ k + 1):=by let f (i:ZMod m):ℝ:=if χ i = χ k + 1 then u i else 0 have hχ (j:ZMod m):χ (2 * j + (3 * k + 1)) = χ k + 1:=by simp only [map_add,map_mul,map_ofNat,map_one, show (2:ZMod 2) = 0 from rfl,show (3:ZMod 2) = 1 from rfl, zero_mul,zero_add,one_mul] have hpre (y:ZMod m):(Finset.univ.filter fun j => 2 * j + (3 * k + 1) = y).card ≤ 2:=by simpa only [Nat.cast_ofNat] using affine_preimages 2 (by norm_num) (3 * k + 1) y have h:=sum_comp_le_card (fun j:ZMod m => 2 * j + (3 * k + 1)) 2 hpre f (fun i => by dsimp [f]; split_ifs <;> first | exact hu _ | rfl) simp only [f,hχ,if_true,Nat.cast_ofNat] at h change (∑ j,u (2 * j + (3 * k + 1))) ≤ 2 * classMass χ u (χ k + 1) at h have heq:=Equiv.sum_comp (Equiv.neg (ZMod m)) (fun j => u (3 * k - 2 * j + 1)) have hid (j:ZMod m):3 * k - 2 * (-j) + 1 = 2 * j + (3 * k + 1):=by ring simp only [Equiv.neg_apply,hid] at heq rw [← heq] exact h have hsum:=Finset.sum_le_sum (s:=Finset.univ) (fun k _ => mul_le_mul_of_nonneg_right (hrow k) (hu k)) have hcross:=two_class_cross_sum χ u simp only [Finset.sum_mul] at hsum have hid:(∑ k,2 * classMass χ u (χ k + 1) * u k) = 2 * (∑ k,u k * classMass χ u (χ k + 1)):=by rw [Finset.mul_sum] apply Finset.sum_congr rfl intro k _ ring rw [hid,hcross] at hsum nlinarith theorem odd_shift_correlation_le_even {m:ℕ} [NeZero m] (h2:2 ∣ m) (u:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) : (∑ k, ∑ j,u (3 * k - 2 * j + 1) * u k) ≤ mass u ^ 2:=by let χ:=ZMod.castHom h2 (ZMod 2) have hsum:=odd_shift_correlation_le_parity h2 u hu have hm:=classMass_sum χ u rw [← hm] nlinarith [sq_nonneg (classMass χ u 0 - classMass χ u 1)] theorem odd_shift_correlation_le {m:ℕ} [NeZero m] (u:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) : (∑ k, ∑ j,u (3 * k - 2 * j + 1) * u k) ≤ mass u ^ 2:=by by_cases h2:2 ∣ m · exact odd_shift_correlation_le_even h2 u hu · have hunit:=ZMod.isUnit_prime_of_not_dvd Nat.prime_two h2 have hmul:=IsUnit.isUnit_iff_mulLeft_bijective.mp hunit have hrow (k:ZMod m):(∑ j,u (3 * k - 2 * j + 1)) = mass u:=by have hbij:Function.Bijective (fun j:ZMod m => 3 * k - 2 * j + 1) := (Equiv.addRight (1:ZMod m)).bijective.comp ((Equiv.subLeft (3 * k)).bijective.comp hmul) exact hbij.sum_comp u simp only [← Finset.sum_mul,hrow, ← Finset.mul_sum] unfold mass nlinarith theorem mixedFunctional_le_three_mass_sq {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : mixedFunctional v u 1 ≤ 3 * mass v ^ 2:=by have hcorr:=odd_shift_correlation_le v hv unfold mixedFunctional calc _ ≤ ∑ j, ∑ k,3 * (v (3 * k - 2 * j + 1) * v k):=by apply Finset.sum_le_sum intro j _ apply Finset.sum_le_sum intro k _ have h:=kernel_le_product (hv (3 * k - 2 * j + 1)) (mul_nonneg (by norm_num:(0:ℝ) ≤ 3) (hv k)) (mul_nonneg (by norm_num:(0:ℝ) ≤ 2) (hu j)) rw [kernel_swap23] at h nlinarith _ = 3 * (∑ k, ∑ j,v (3 * k - 2 * j + 1) * v k):=by simp only [← Finset.mul_sum] rw [Finset.sum_comm] _ ≤ 3 * mass v ^ 2:=mul_le_mul_of_nonneg_left hcorr (by norm_num) private def zz47:"s002f"="s002f":=by decide+kernel theorem profileFunctional_interleave_le {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) {R:ℝ} (hR:∀ j,overlap (overlapMap j) u ≤ R) : profileFunctional (interleave u v) ≤ profileFunctional u + profileFunctional v + 3 * mass v ^ 2 + 2 * mass v * R:=by rw [profileFunctional_interleave] linarith [mixedFunctional_le_overlap u v hu hv hR,mixedFunctional_le_three_mass_sq u v hu hv] theorem deficit_interleave_expansion {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) {R:ℝ} (hR:∀ j,overlap (overlapMap j) u ≤ R) : deficit u + deficit v + 4 * mass u * mass v - 3 * mass v ^ 2 - 2 * mass v * R ≤ deficit (interleave u v):=by have h:=profileFunctional_interleave_le u v hu hv hR unfold deficit rw [mass_interleave] nlinarith end Green24Proof end section namespace Green24Proof structure HeightCoefficients where S:ℝ e:ℝ o:ℝ f:ℝ h:ℝ tau:ℝ omega:ℝ eta:ℝ noncomputable def HeightCoefficients.massBound (c:HeightCoefficients) (A B:ℝ):ℝ := c.eta * (A + B) ^ 2 - (1 / 4) * (A - c.S * B) * (c.e * A + c.o * B) - ((-c.f) * (c.S - 1) / 4) * A * B - (c.h * A - (c.h * c.S + c.tau) * B) ^ 2 / (16 * c.omega) def HeightCoefficients.Aggregate (c:HeightCoefficients) (A B dw dz H d:ℝ):Prop := -4 * d + (8 / 5) * H + 4 * c.eta * (A + B) ^ 2 ≤ (A - c.S * B) * (c.e * A + c.o * B + c.f * dw + c.h * dz) - c.tau * B * dz - c.omega * dz ^ 2 theorem even_error_bound {A B S f dw:ℝ} (hB:0 ≤ B) (hAB:B ≤ A) (hS:1 ≤ S) (hf:f ≤ 0) (hdw:0 ≤ dw) (hdwA:dw ≤ A) : f * (A - S * B) * dw ≤ (-f) * (S - 1) * A * B:=by have hA:0 ≤ A:=hB.trans hAB by_cases hs:0 ≤ A - S * B · have hleft:=mul_nonpos_of_nonpos_of_nonneg (mul_nonpos_of_nonpos_of_nonneg hf hs) hdw have hright:0 ≤ (-f) * (S - 1) * A * B := mul_nonneg (mul_nonneg (mul_nonneg (neg_nonneg.mpr hf) (sub_nonneg.mpr hS)) hA) hB exact hleft.trans hright · have h₁:=mul_le_mul_of_nonneg_left hdwA (mul_nonneg_of_nonpos_of_nonpos hf (le_of_not_ge hs)) have h₂:=mul_nonpos_of_nonpos_of_nonneg hf (mul_nonneg hA (sub_nonneg.mpr hAB)) nlinarith theorem completed_square_bound {p omega z:ℝ} (hw:0 < omega) : p * z - omega * z ^ 2 ≤ p ^ 2 / (4 * omega):=by apply (le_div_iff₀ (by positivity:0 < 4 * omega)).mpr nlinarith [sq_nonneg (p - 2 * omega * z)] private def zz48:"s0030"="s0030":=by decide+kernel theorem height_mass_bound {c:HeightCoefficients} {A B dw dz H d:ℝ} (hS:1 ≤ c.S) (hf:c.f ≤ 0) (hw:0 < c.omega) (hB:0 ≤ B) (hAB:B ≤ A) (hdw:0 ≤ dw) (hdwA:dw ≤ A) (hc:c.Aggregate A B dw dz H d) : (2 / 5) * H + c.massBound A B ≤ d:=by have heven:=even_error_bound hB hAB hS hf hdw hdwA have hodd:=completed_square_bound (p:=c.h * A - (c.h * c.S + c.tau) * B) (z:=dz) hw unfold HeightCoefficients.Aggregate at hc unfold HeightCoefficients.massBound have hdiv:(c.h * A - (c.h * c.S + c.tau) * B) ^ 2 / (16 * c.omega) = ((c.h * A - (c.h * c.S + c.tau) * B) ^ 2 / (4 * c.omega)) / 4:=by ring rw [hdiv] nlinarith end Green24Proof end section namespace Green24Proof noncomputable def height12:HeightCoefficients where S:=(6 / 5) e:=(0xbbb54f / 0x30d400) o:=(-0x7d055ec5 / 0x17d78400) f:=(-0x13295c7 / 0x77359400) h:=(-0x87af2f / 0x77359400) tau:=(0 / 1) omega:=(0x149a115b / 0xbebc200) eta:=(-0x1b0311 / 0x3b9aca00) theorem height12_massBound_ge {A B:ℝ} (hA:0 ≤ A) (hB:0 ≤ B) : Q12 A B ≤ height12.massBound A B:=by unfold HeightCoefficients.massBound height12 Q12 norm_num nlinarith only [sq_nonneg A,sq_nonneg B,mul_nonneg hA hB] theorem height12_of_aggregate {A B dw dz H d:ℝ} (hB:0 ≤ B) (hAB:B ≤ A) (hdw:0 ≤ dw) (hdwA:dw ≤ A) (hc:height12.Aggregate A B dw dz H d) : (2 / 5) * H + Q12 A B ≤ d:=by have h:=height_mass_bound (c:=height12) (by norm_num [height12]) (by norm_num [height12]) (by norm_num [height12]) hB hAB hdw hdwA hc linarith [height12_massBound_ge (hB.trans hAB) hB] noncomputable def height18:HeightCoefficients where S:=(9 / 5) e:=(0x13b983a43 / 0x77359400) o:=(-0x4df97f5 / 0x1312d00) f:=(-0x19b86e7 / 0x77359400) h:=(-0x585c71 / 0x3b9aca00) tau:=(0 / 1) omega:=(0x3919bbd / 0x17d7840) eta:=(-13 / 0x3e8) theorem height18_massBound_ge {A B:ℝ} : Q18 A B ≤ height18.massBound A B:=by unfold HeightCoefficients.massBound height18 Q18 norm_num nlinarith only [sq_nonneg A,sq_nonneg B,sq_nonneg (A + B)] private def zz49:"s0031"="s0031":=by decide+kernel theorem height18_of_aggregate {A B dw dz H d:ℝ} (hB:0 ≤ B) (hAB:B ≤ A) (hdw:0 ≤ dw) (hdwA:dw ≤ A) (hc:height18.Aggregate A B dw dz H d) : (2 / 5) * H + Q18 A B ≤ d:=by have h:=height_mass_bound (c:=height18) (by norm_num [height18]) (by norm_num [height18]) (by norm_num [height18]) hB hAB hdw hdwA hc linarith [height18_massBound_ge (A:=A) (B:=B)] end Green24Proof end section namespace Green24Proof theorem zmod_two_flip_of_ne {r s:ZMod 2} (h:s ≠ r):s + 1 = r:=by rcases zmod_two_eq_zero_or_one r with rfl | rfl <;> rcases zmod_two_eq_zero_or_one s with rfl | rfl · exact (h rfl).elim · rfl · rfl · exact (h rfl).elim theorem overlap_le_six_classMass {ι:Type*} [Fintype ι] [DecidableEq ι] (T:ι → ι) (hT:∀ j,(Finset.univ.filter fun i => T i = j).card ≤ 3) (χ:ι → ZMod 2) (hχ:∀ i,χ (T i) = χ i + 1) (u:ι → ℝ) (hu:∀ i,0 ≤ u i) (r:ZMod 2):overlap T u ≤ 6 * classMass χ u r:=by let f (i:ι):ℝ:=if χ i = r then u i else 0 have hf (i:ι):0 ≤ f i:=by dsimp [f]; split_ifs <;> first | exact hu _ | rfl have hpoint (i:ι):min (u (T i)) (3 * u i) ≤ f (T i) + 3 * f i:=by by_cases hi:χ i = r · have heq:f i = u i:=if_pos hi rw [heq] linarith [min_le_right (u (T i)) (3 * u i),hf (T i)] · have hi':χ (T i) = r:=(hχ i).trans (zmod_two_flip_of_ne hi) simp only [f,if_pos hi',if_neg hi,mul_zero,add_zero] exact min_le_left _ _ have hsum:=Finset.sum_le_sum (s:=Finset.univ) (fun i _ => hpoint i) have hpre:=sum_comp_le_three T hT f hf simp only [Finset.sum_add_distrib, ← Finset.mul_sum] at hsum change (∑ i,min (u (T i)) (3 * u i)) ≤ _ at hsum change (∑ i,min (u (T i)) (3 * u i)) ≤ 6 * ∑ i,f i linarith theorem parityCast_apply {m:ℕ} [NeZero m] (r:ZMod 2) (i:ZMod m) : ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) (parityEquiv m (r,i)) = r:=by rw [parityEquiv_apply,doubleResidue_val] simp only [map_add,map_mul,map_ofNat,map_natCast, show (2:ZMod 2) = 0 from rfl,zero_mul,zero_add,ZMod.natCast_zmod_val] private def zz50:"s0032"="s0032":=by decide+kernel theorem classMass_interleave_even {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : classMass (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2)) (interleave u v) 0 = mass u:=by unfold classMass mass rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type,sum_zmod_two] simp only [parityCast_apply,interleave_even,interleave_odd,if_true, one_ne_zero,if_false,Finset.sum_const_zero,add_zero] theorem classMass_interleave_odd {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : classMass (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2)) (interleave u v) 1 = mass v:=by unfold classMass mass rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type,sum_zmod_two] simp only [parityCast_apply,interleave_even,interleave_odd,if_true, zero_ne_one,if_false,Finset.sum_const_zero,zero_add] theorem cyclic_overlap_le_six_classMass {m:ℕ} [NeZero m] (h2:2 ∣ m) (u:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (j:ZMod m) (r:ZMod 2) : overlap (overlapMap j) u ≤ 6 * classMass (ZMod.castHom h2 (ZMod 2)) u r:=by apply overlap_le_six_classMass _ (overlapMap_preimages j) _ _ u hu r intro i change ZMod.castHom h2 (ZMod 2) (3 * i - 2 * j - 1) = ZMod.castHom h2 (ZMod 2) i + 1 rw [map_sub,map_sub,map_mul,map_mul,map_ofNat,map_ofNat,map_one] simp only [ show (2:ZMod 2) = 0 from rfl,show (3:ZMod 2) = 1 from rfl, zero_mul,one_mul,sub_eq_add_neg,neg_zero,add_zero, show -(1:ZMod 2) = 1 from rfl] noncomputable def overlapMaximum {m:ℕ} [NeZero m] (u:ZMod m → ℝ):ℝ := Finset.univ.sup' Finset.univ_nonempty (fun j => overlap (overlapMap j) u) theorem overlap_le_maximum {m:ℕ} [NeZero m] (u:ZMod m → ℝ) (j:ZMod m) : overlap (overlapMap j) u ≤ overlapMaximum u:=by unfold overlapMaximum exact Finset.le_sup' (fun j:ZMod m => overlap (overlapMap j) u) (Finset.mem_univ j) private def zz51:"s0033"="s0033":=by decide+kernel theorem overlapMaximum_sharp {m:ℕ} [NeZero m] (u:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) : overlapMaximum u ≤ mass u + Real.sqrt (8 * energy u):=by exact Finset.sup'_le Finset.univ_nonempty _ (fun j _ => cyclic_sharp_overlap u hu j) theorem overlapMaximum_parity {m:ℕ} [NeZero m] (h2:2 ∣ m) (u:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (r:ZMod 2) : overlapMaximum u ≤ 6 * classMass (ZMod.castHom h2 (ZMod 2)) u r:=by exact Finset.sup'_le Finset.univ_nonempty _ (fun j _ => cyclic_overlap_le_six_classMass h2 u hu j r) theorem profile_overlap_bound_of_height {m:ℕ} [NeZero m] (u:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hheight:(2 / 5) * energy u - (9 / 0x100) * mass u ^ 2 ≤ deficit u) : mass u * overlapMaximum u ≤ (61 / 32) * mass u ^ 2 + 8 * deficit u := overlap_bound_of_height (mass_nonneg hu) (energy_nonneg hu) (overlapMaximum_sharp u hu) hheight theorem profile_overlap_bound {m:ℕ} [NeZero m] (w z:ZMod m → ℝ) (hw:∀ i,0 ≤ w i) (hz:∀ i,0 ≤ z i) (horder:mass z ≤ mass w) (hd:0 ≤ deficit (interleave w z)) (h12:(2 / 5) * energy (interleave w z) + Q12 (mass w) (mass z) ≤ deficit (interleave w z)) (h18:(2 / 5) * energy (interleave w z) + Q18 (mass w) (mass z) ≤ deficit (interleave w z)) : mass (interleave w z) * overlapMaximum (interleave w z) ≤ (61 / 32) * mass (interleave w z) ^ 2 + 8 * deficit (interleave w z):=by have hg:=interleave_nonneg w z hw hz have hoverlap:=overlapMaximum_sharp (interleave w z) hg have hparity:=overlapMaximum_parity (dvd_mul_right 2 m) (interleave w z) hg 1 rw [classMass_interleave_odd] at hparity rw [mass_interleave] at hoverlap ⊢ exact overlap_bound (mass_nonneg hz) horder (energy_nonneg hg) hd hoverlap hparity h12 h18 private def zz52:"s0034"="s0034":=by decide+kernel theorem profile_boundary_descent {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hU:0 < mass u) (hheight:(2 / 5) * energy u - (9 / 0x100) * mass u ^ 2 ≤ deficit u) : (1 - 16 * mass v / mass u) * deficit u + deficit v + mass v * ((3 / 16) * mass u - 3 * mass v) ≤ deficit (interleave u v) := boundary_descent hU (mass_nonneg hv) (profile_overlap_bound_of_height u hu hheight) (deficit_interleave_expansion u v hu hv (overlap_le_maximum u)) theorem profile_boundary_nonneg {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hU:0 < mass u) (hratio:16 * mass v ≤ mass u) (hdu:0 ≤ deficit u) (hdv:0 ≤ deficit v) (hheight:(2 / 5) * energy u - (9 / 0x100) * mass u ^ 2 ≤ deficit u) : 0 ≤ deficit (interleave u v) := boundary_nonneg hU (mass_nonneg hv) hratio hdu hdv (profile_overlap_bound_of_height u hu hheight) (deficit_interleave_expansion u v hu hv (overlap_le_maximum u)) end Green24Proof end section namespace Green24Proof theorem mass_eq_zero_iff {ι:Type*} [Fintype ι] (u:ι → ℝ) (hu:∀ i,0 ≤ u i) : mass u = 0 ↔ ∀ i,u i = 0:=by unfold mass simpa only [Finset.mem_univ,forall_true_left] using Finset.sum_eq_zero_iff_of_nonneg (s:=Finset.univ) (fun i _ => hu i) theorem mass_translate {m:ℕ} [NeZero m] (g:ZMod m → ℝ) (t:ZMod m) : mass (fun i => g (i + t)) = mass g:=Equiv.sum_comp (Equiv.addRight t) g private def zz53:"s0035"="s0035":=by decide+kernel theorem profileFunctional_translate {m:ℕ} [NeZero m] (g:ZMod m → ℝ) (t:ZMod m) : profileFunctional (fun i => g (i + t)) = profileFunctional g:=by unfold profileFunctional have hrow (j:ZMod m) : (∑ k,kernel (g (3 * k - 2 * j + t)) (2 * g (j + t)) (3 * g (k + t))) = ∑ k,kernel (g (3 * k - 2 * (j + t))) (2 * g (j + t)) (3 * g k):=by have h:=Equiv.sum_comp (Equiv.addRight t) (fun k => kernel (g (3 * k - 2 * (j + t))) (2 * g (j + t)) (3 * g k)) simpa only [Equiv.coe_addRight,show ∀ k,3 * (k + t) - 2 * (j + t) = 3 * k - 2 * j + t by intro k; ring] using h simp_rw [hrow] exact Equiv.sum_comp (Equiv.addRight t) (fun j => ∑ k,kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k)) theorem deficit_translate {m:ℕ} [NeZero m] (g:ZMod m → ℝ) (t:ZMod m) : deficit (fun i => g (i + t)) = deficit g:=by unfold deficit rw [mass_translate,profileFunctional_translate] theorem mass_reflect {m:ℕ} [NeZero m] (g:ZMod m → ℝ) : mass (fun i => g (-i)) = mass g:=Equiv.sum_comp (Equiv.neg (ZMod m)) g theorem profileFunctional_reflect {m:ℕ} [NeZero m] (g:ZMod m → ℝ) : profileFunctional (fun i => g (-i)) = profileFunctional g:=by unfold profileFunctional have hrow (j:ZMod m) : (∑ k,kernel (g (-(3 * k - 2 * j))) (2 * g (-j)) (3 * g (-k))) = ∑ k,kernel (g (3 * k - 2 * (-j))) (2 * g (-j)) (3 * g k):=by have h:=Equiv.sum_comp (Equiv.neg (ZMod m)) (fun k => kernel (g (3 * k - 2 * (-j))) (2 * g (-j)) (3 * g k)) simpa only [Equiv.neg_apply,show ∀ k,3 * (-k) - 2 * (-j) = -(3 * k - 2 * j) by intro k; ring] using h simp_rw [hrow] exact Equiv.sum_comp (Equiv.neg (ZMod m)) (fun j => ∑ k,kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k)) private def zz54:"s0036"="s0036":=by decide+kernel theorem deficit_reflect {m:ℕ} [NeZero m] (g:ZMod m → ℝ) : deficit (fun i => g (-i)) = deficit g:=by unfold deficit rw [mass_reflect,profileFunctional_reflect] theorem kernel_scale (a b c:ℝ) {s:ℝ} (hs:0 ≤ s) : kernel (s * a) (s * b) (s * c) = s ^ 2 * kernel a b c:=by have hmax (x:ℝ):max (s * x) 0 = s * max x 0:=by rw [mul_max_of_nonneg _ _ hs,mul_zero] unfold kernel rw [show s * a - s * b - s * c = s * (a - b - c) by ring, show s * b - s * a - s * c = s * (b - a - c) by ring, show s * c - s * a - s * b = s * (c - a - b) by ring] simp only [hmax] ring theorem mass_scale {ι:Type*} [Fintype ι] (g:ι → ℝ) (s:ℝ) : mass (fun i => s * g i) = s * mass g:=(Finset.mul_sum _ _ _).symm theorem profileFunctional_scale {m:ℕ} [NeZero m] (g:ZMod m → ℝ) {s:ℝ} (hs:0 ≤ s) : profileFunctional (fun i => s * g i) = s ^ 2 * profileFunctional g:=by unfold profileFunctional have h (j k:ZMod m) : kernel (s * g (3 * k - 2 * j)) (2 * (s * g j)) (3 * (s * g k)) = s ^ 2 * kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k):=by rw [show 2 * (s * g j) = s * (2 * g j) by ring, show 3 * (s * g k) = s * (3 * g k) by ring] exact kernel_scale _ _ _ hs simp_rw [h] simp only [← Finset.mul_sum] private def zz55:"s0037"="s0037":=by decide+kernel theorem deficit_scale {m:ℕ} [NeZero m] (g:ZMod m → ℝ) {s:ℝ} (hs:0 ≤ s) : deficit (fun i => s * g i) = s ^ 2 * deficit g:=by unfold deficit rw [mass_scale,profileFunctional_scale g hs] ring theorem rho_scale {x y s:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) (hs:0 ≤ s) : rho (s * x) (s * y) = s ^ 2 * rho x y:=by have h₁:=rho_positive_part_identity hx hy have h₂:=rho_positive_part_identity (mul_nonneg hs hx) (mul_nonneg hs hy) have hmax (a:ℝ):max (s * a) 0 = s * max a 0:=by rw [mul_max_of_nonneg _ _ hs,mul_zero] rw [show s * x - 3 * (s * y) = s * (x - 3 * y) by ring, show s * y - 3 * (s * x) = s * (y - 3 * x) by ring,hmax,hmax] at h₂ linear_combination (h₂ - s ^ 2 * h₁) / 4 theorem energy_scale {ι:Type*} [Fintype ι] (g:ι → ℝ) (hg:∀ i,0 ≤ g i) {s:ℝ} (hs:0 ≤ s):energy (fun i => s * g i) = s ^ 2 * energy g:=by unfold energy simp_rw [rho_scale (hg _) (hg _) hs] simp only [← Finset.mul_sum] ring theorem sum_comp_eq_card {ι κ:Type*} [Fintype ι] [Fintype κ] [DecidableEq κ] (T:ι → κ) (N:ℕ) (hT:∀ j,(Finset.univ.filter fun i => T i = j).card = N) (f:κ → ℝ):(∑ i,f (T i)) = N * ∑ j,f j:=by calc (∑ i,f (T i)) = ∑ i, ∑ j,if T i = j then f j else 0:=by simp _ = ∑ j, ∑ i,if T i = j then f j else 0:=Finset.sum_comm _ = ∑ j,(N:ℝ) * f j:=by apply Finset.sum_congr rfl intro j _ rw [← Finset.sum_filter] simp only [Finset.sum_const,nsmul_eq_mul,hT] _ = _:=(Finset.mul_sum _ _ _).symm private def zz56:"s0038"="s0038":=by decide+kernel theorem double_quotient_fibers {m:ℕ} [NeZero m] (y:ZMod m) : (Finset.univ.filter fun x:ZMod (2 * m) => ZMod.castHom (dvd_mul_left m 2) (ZMod m) x = y).card = 2:=by let π:=ZMod.castHom (dvd_mul_left m 2) (ZMod m) have hsurj:=ZMod.castHom_surjective (dvd_mul_left m 2) have hsame (z:ZMod m):(Finset.univ.filter fun x => π x = z).card = (Finset.univ.filter fun x => π x = y).card := AddMonoidHom.card_fiber_eq_of_mem_range π (hsurj z) (hsurj y) have htotal:Fintype.card (ZMod (2 * m)) = ∑ z:ZMod m,(Finset.univ.filter fun x => π x = z).card := Finset.card_eq_sum_card_fiberwise (fun _ _ => Finset.mem_univ _) simp_rw [hsame] at htotal simp only [Finset.sum_const,Finset.card_univ,ZMod.card,nsmul_eq_mul] at htotal have h:=Nat.eq_of_mul_eq_mul_left (NeZero.pos m) (by simpa only [mul_comm 2 m,Nat.cast_id] using htotal) exact h.symm noncomputable def periodicLift {m:ℕ} [NeZero m] (g:ZMod m → ℝ) (x:ZMod (2 * m)):ℝ := (1 / 2) * g (ZMod.castHom (dvd_mul_left m 2) (ZMod m) x) theorem mass_periodicLift {m:ℕ} [NeZero m] (g:ZMod m → ℝ) : mass (periodicLift g) = mass g:=by unfold periodicLift mass rw [← Finset.mul_sum,sum_comp_eq_card _ 2 double_quotient_fibers] norm_num ring theorem profileFunctional_periodicLift {m:ℕ} [NeZero m] (g:ZMod m → ℝ) : profileFunctional (periodicLift g) = profileFunctional g:=by let π:=ZMod.castHom (dvd_mul_left m 2) (ZMod m) unfold periodicLift rw [profileFunctional_scale _ (by norm_num:(0:ℝ) ≤ 1 / 2)] unfold profileFunctional change (1 / 2:ℝ) ^ 2 * (∑ j, ∑ k,kernel (g (π (3 * k - 2 * j))) (2 * g (π j)) (3 * g (π k))) = _ simp only [map_sub,map_mul,map_ofNat] have hrow (j:ZMod (2 * m)) : (∑ k,kernel (g (3 * π k - 2 * π j)) (2 * g (π j)) (3 * g (π k))) = 2 * ∑ k:ZMod m,kernel (g (3 * k - 2 * π j)) (2 * g (π j)) (3 * g k):=by simpa only [Nat.cast_ofNat] using sum_comp_eq_card π 2 double_quotient_fibers (fun k => kernel (g (3 * k - 2 * π j)) (2 * g (π j)) (3 * g k)) simp_rw [hrow] rw [← Finset.mul_sum,sum_comp_eq_card π 2 double_quotient_fibers (fun j => ∑ k,kernel (g (3 * k - 2 * j)) (2 * g j) (3 * g k))] norm_num ring theorem deficit_periodicLift {m:ℕ} [NeZero m] (g:ZMod m → ℝ) : deficit (periodicLift g) = deficit g:=by unfold deficit rw [mass_periodicLift,profileFunctional_periodicLift] private def zz57:"s0039"="s0039":=by decide+kernel theorem energy_periodicLift {m:ℕ} [NeZero m] (g:ZMod m → ℝ) (hg:∀ i,0 ≤ g i) : energy (periodicLift g) = energy g:=by let π:=ZMod.castHom (dvd_mul_left m 2) (ZMod m) unfold periodicLift rw [energy_scale _ (fun i => hg _) (by norm_num:(0:ℝ) ≤ 1 / 2)] unfold energy change (1 / 2:ℝ) ^ 2 * ((∑ i, ∑ j,rho (g (π i)) (g (π j))) / 2) = _ have hrow (i:ZMod (2 * m)):(∑ j,rho (g (π i)) (g (π j))) = 2 * ∑ j:ZMod m,rho (g (π i)) (g j):=by simpa only [Nat.cast_ofNat] using sum_comp_eq_card π 2 double_quotient_fibers (fun j => rho (g (π i)) (g j)) simp_rw [hrow] rw [← Finset.mul_sum,sum_comp_eq_card π 2 double_quotient_fibers (fun i => ∑ j,rho (g i) (g j))] norm_num ring end Green24Proof end section namespace Green24Proof def companionMap {q:ℕ} (p:ZMod q × ZMod q):ZMod q × ZMod q := (3 * p.2 - 2 * p.1,3 * p.1 - 2 * p.2) theorem companionMap_bijective {q:ℕ} (h5:¬5 ∣ q):Function.Bijective (@companionMap q):=by have hu:IsUnit (5:ZMod q):=ZMod.isUnit_prime_of_not_dvd (by norm_num) h5 obtain ⟨s,hs⟩:=hu.exists_right_inv have hinj:=(IsUnit.isUnit_iff_mulLeft_bijective.mp hu).injective constructor · rintro ⟨j,k⟩ ⟨l,m⟩ h have h₁:3 * k - 2 * j = 3 * m - 2 * l:=congrArg Prod.fst h have h₂:3 * j - 2 * k = 3 * l - 2 * m:=congrArg Prod.snd h apply Prod.ext · apply hinj linear_combination 2 * h₁ + 3 * h₂ · apply hinj linear_combination 3 * h₁ + 2 * h₂ · rintro ⟨a,b⟩ refine ⟨(s * (2 * a + 3 * b),s * (3 * a + 2 * b)), ?_⟩ apply Prod.ext · change 3 * (s * (3 * a + 2 * b)) - 2 * (s * (2 * a + 3 * b)) = a linear_combination a * hs · change 3 * (s * (2 * a + 3 * b)) - 2 * (s * (3 * a + 2 * b)) = b linear_combination b * hs theorem companion_sum {q:ℕ} [NeZero q] (h5:¬5 ∣ q) (f:ZMod q → ZMod q → ℝ) : (∑ j, ∑ k,f (3 * k - 2 * j) (3 * j - 2 * k)) = ∑ i, ∑ l,f i l:=by have h:=(companionMap_bijective h5).sum_comp (fun p => f p.1 p.2) simpa only [Fintype.sum_prod_type,companionMap] using h theorem companion_symmetry {q:ℕ} (j k:ZMod q) : companionMap (k,j) = ((companionMap (j,k)).2,(companionMap (j,k)).1):=rfl private def zz58:"s003a"="s003a":=by decide+kernel theorem affine_preimages_exact {q N:ℕ} [NeZero q] (hN:0 < N) (hdiv:N ∣ q) (c y:ZMod q) (hex:∃ x,(N:ZMod q) * x + c = y) : (Finset.univ.filter fun x:ZMod q => N * x + c = y).card = N:=by apply le_antisymm (affine_preimages N hN c y) obtain ⟨m,rfl⟩:=hdiv obtain ⟨x₀,hx₀⟩:=hex have hm:0 < m:=by apply Nat.pos_of_ne_zero intro hm exact NeZero.ne (N * m) (by rw [hm,mul_zero]) have hnm:(N:ZMod (N * m)) * m = 0:=by simpa only [Nat.cast_mul] using ZMod.natCast_self (N * m) have hcard:(Finset.univ:Finset (Fin N)).card ≤ (Finset.univ.filter fun x:ZMod (N * m) => N * x + c = y).card:=by apply Finset.card_le_card_of_injOn (fun r:Fin N => x₀ + ((m * r.val:ℕ):ZMod (N * m))) · intro r _ apply Finset.mem_filter.mpr refine ⟨Finset.mem_univ _, ?_⟩ dsimp only rw [Nat.cast_mul] calc (N:ZMod (N * m)) * (x₀ + m * r.val) + c = N * x₀ + c + (N * m) * r.val:=by ring _ = y:=by rw [hnm,zero_mul,add_zero,hx₀] · intro r _ s _ h have heq:=add_left_cancel h have hr:m * r.val < N * m:=by simpa only [mul_comm N m] using Nat.mul_lt_mul_of_pos_left r.isLt hm have hs:m * s.val < N * m:=by simpa only [mul_comm N m] using Nat.mul_lt_mul_of_pos_left s.isLt hm have hv:=congrArg ZMod.val heq rw [ZMod.val_natCast_of_lt hr,ZMod.val_natCast_of_lt hs] at hv exact Fin.ext (Nat.eq_of_mul_eq_mul_left hm hv) simpa only [Finset.card_univ,Fintype.card_fin] using hcard theorem mul_fiber_card {q N:ℕ} [NeZero q] (hN:0 < N) (hdiv:N ∣ q) (y:ZMod q) : (Finset.univ.filter fun x:ZMod q => N * x = y).card = if ZMod.castHom hdiv (ZMod N) y = 0 then N else 0:=by classical let π:=ZMod.castHom hdiv (ZMod N) by_cases hy:π y = 0 · rw [if_pos hy] have hv:N ∣ y.val:=by apply (ZMod.natCast_eq_zero_iff y.val N).mp simpa only [π,ZMod.castHom_apply,ZMod.cast_eq_val] using hy obtain ⟨r,hr⟩:=hv have hex:∃ x:ZMod q,N * x + 0 = y:=by refine ⟨(r:ZMod q), ?_⟩ rw [add_zero, ← Nat.cast_mul, ← hr,ZMod.natCast_zmod_val] simpa only [add_zero] using affine_preimages_exact hN hdiv 0 y hex · rw [if_neg hy] apply Finset.card_eq_zero.mpr apply Finset.eq_empty_iff_forall_notMem.mpr intro x hx have heq:=congrArg π (Finset.mem_filter.mp hx).2 rw [map_mul,map_natCast,ZMod.natCast_self,zero_mul] at heq exact hy heq.symm theorem first_middle_fiber {q:ℕ} [NeZero q] (h3:3 ∣ q) (i j:ZMod q) : (Finset.univ.filter fun k:ZMod q => 3 * k - 2 * j = i).card = if ZMod.castHom h3 (ZMod 3) i = ZMod.castHom h3 (ZMod 3) j then 3 else 0:=by simp only [sub_eq_iff_eq_add] have h:=mul_fiber_card (by norm_num:0 < 3) h3 (i + 2 * j) simp only [Nat.cast_ofNat] at h have hcond:ZMod.castHom h3 (ZMod 3) (i + 2 * j) = 0 ↔ ZMod.castHom h3 (ZMod 3) i = ZMod.castHom h3 (ZMod 3) j:=by rw [map_add,map_mul,map_ofNat,show (2:ZMod 3) = -1 from rfl,neg_one_mul, ← sub_eq_add_neg,sub_eq_zero] simpa only [hcond] using h theorem first_last_fiber {q:ℕ} [NeZero q] (h2:2 ∣ q) (i k:ZMod q) : (Finset.univ.filter fun j:ZMod q => 3 * k - 2 * j = i).card = if ZMod.castHom h2 (ZMod 2) i = ZMod.castHom h2 (ZMod 2) k then 2 else 0:=by have hpred (j:ZMod q):3 * k - 2 * j = i ↔ 2 * j = 3 * k - i:=by constructor <;> intro h <;> linear_combination -h simp_rw [hpred] have h:=mul_fiber_card (by norm_num:0 < 2) h2 (3 * k - i) simp only [Nat.cast_ofNat] at h have hcond:ZMod.castHom h2 (ZMod 2) (3 * k - i) = 0 ↔ ZMod.castHom h2 (ZMod 2) i = ZMod.castHom h2 (ZMod 2) k:=by rw [map_sub,map_mul,map_ofNat,show (3:ZMod 2) = 1 from rfl, one_mul,sub_eq_zero,eq_comm] simpa only [hcond] using h private def zz59:"s003b"="s003b":=by decide+kernel theorem sum_comp_eq_fibers {ι κ:Type*} [Fintype ι] [Fintype κ] [DecidableEq κ] (T:ι → κ) (f:κ → ℝ) : (∑ i,f (T i)) = ∑ j,((Finset.univ.filter fun i => T i = j).card:ℝ) * f j:=by calc (∑ i,f (T i)) = ∑ i, ∑ j,if T i = j then f j else 0:=by simp _ = ∑ j, ∑ i,if T i = j then f j else 0:=Finset.sum_comm _ = _:=by apply Finset.sum_congr rfl intro j _ rw [← Finset.sum_filter] simp only [Finset.sum_const,nsmul_eq_mul] theorem first_middle_marginal {q:ℕ} [NeZero q] (h3:3 ∣ q) (f:ZMod q → ZMod q → ℝ) : (∑ j, ∑ k,f (3 * k - 2 * j) j) = 3 * ∑ i, ∑ j,if ZMod.castHom h3 (ZMod 3) i = ZMod.castHom h3 (ZMod 3) j then f i j else 0:=by have hrow (j:ZMod q):(∑ k,f (3 * k - 2 * j) j) = 3 * ∑ i,if ZMod.castHom h3 (ZMod 3) i = ZMod.castHom h3 (ZMod 3) j then f i j else 0:=by rw [sum_comp_eq_fibers (fun k:ZMod q => 3 * k - 2 * j) (fun i => f i j),Finset.mul_sum] apply Finset.sum_congr rfl intro i _ rw [first_middle_fiber h3] split_ifs <;> norm_num simp_rw [hrow] rw [← Finset.mul_sum,Finset.sum_comm] theorem first_last_marginal {q:ℕ} [NeZero q] (h2:2 ∣ q) (f:ZMod q → ZMod q → ℝ) : (∑ j, ∑ k,f (3 * k - 2 * j) k) = 2 * ∑ i, ∑ k,if ZMod.castHom h2 (ZMod 2) i = ZMod.castHom h2 (ZMod 2) k then f i k else 0:=by rw [Finset.sum_comm] have hrow (k:ZMod q):(∑ j,f (3 * k - 2 * j) k) = 2 * ∑ i,if ZMod.castHom h2 (ZMod 2) i = ZMod.castHom h2 (ZMod 2) k then f i k else 0:=by rw [sum_comp_eq_fibers (fun j:ZMod q => 3 * k - 2 * j) (fun i => f i k),Finset.mul_sum] apply Finset.sum_congr rfl intro i _ rw [first_last_fiber h2] split_ifs <;> norm_num simp_rw [hrow] rw [← Finset.mul_sum,Finset.sum_comm] end Green24Proof end section namespace Green24Proof noncomputable def squarePotential (r x y:ℝ):ℝ := (x ^ 2 - max (x - r * y) 0 ^ 2) / (2 * r) theorem sum_swap_average {ι:Type*} [Fintype ι] (f:ι → ι → ℝ) : (∑ i, ∑ j,(f i j + f j i) / 2) = ∑ i, ∑ j,f i j:=by have hswap:(∑ i, ∑ j,f j i) = ∑ i, ∑ j,f i j:=Finset.sum_comm simp only [add_div,Finset.sum_add_distrib, ← Finset.sum_div] rw [hswap] ring private def zz60:"s003c"="s003c":=by decide+kernel theorem first_middle_marginal_of_support {q:ℕ} [NeZero q] (h3:3 ∣ q) (f:ZMod q → ZMod q → ℝ) (hf:∀ i j,ZMod.castHom h3 (ZMod 3) i ≠ ZMod.castHom h3 (ZMod 3) j → f i j = 0) : (∑ j, ∑ k,f (3 * k - 2 * j) j) = 3 * ∑ i, ∑ j,f i j:=by rw [first_middle_marginal h3] congr 1 apply Finset.sum_congr rfl intro i _ apply Finset.sum_congr rfl intro j _ split_ifs with h · rfl · exact (hf i j h).symm theorem first_last_marginal_of_support {q:ℕ} [NeZero q] (h2:2 ∣ q) (f:ZMod q → ZMod q → ℝ) (hf:∀ i k,ZMod.castHom h2 (ZMod 2) i ≠ ZMod.castHom h2 (ZMod 2) k → f i k = 0) : (∑ j, ∑ k,f (3 * k - 2 * j) k) = 2 * ∑ i, ∑ k,f i k:=by rw [first_last_marginal h2] congr 1 apply Finset.sum_congr rfl intro i _ apply Finset.sum_congr rfl intro k _ split_ifs with h · rfl · exact (hf i k h).symm noncomputable def firstMiddlePotentialRow {q:ℕ} (f:ZMod q → ZMod q → ℝ) (j k:ZMod q):ℝ := (f (3 * k - 2 * j) j + f (3 * j - 2 * k) k) / 2 - 3 * ((f j k + f k j) / 2) noncomputable def firstLastPotentialRow {q:ℕ} (f:ZMod q → ZMod q → ℝ) (j k:ZMod q):ℝ := (f (3 * k - 2 * j) k + f (3 * j - 2 * k) j) / 2 - 2 * ((f j k + f k j) / 2) noncomputable def companionPotentialRow {q:ℕ} (f:ZMod q → ZMod q → ℝ) (j k:ZMod q):ℝ:=f (3 * k - 2 * j) (3 * j - 2 * k) - f j k theorem firstMiddlePotentialRow_sum {q:ℕ} [NeZero q] (h3:3 ∣ q) (f:ZMod q → ZMod q → ℝ) (hf:∀ i j,ZMod.castHom h3 (ZMod 3) i ≠ ZMod.castHom h3 (ZMod 3) j → f i j = 0) : (∑ j, ∑ k,firstMiddlePotentialRow f j k) = 0:=by unfold firstMiddlePotentialRow simp only [Finset.sum_sub_distrib, ← Finset.mul_sum] rw [sum_swap_average (fun j k => f (3 * k - 2 * j) j),sum_swap_average, first_middle_marginal_of_support h3 f hf,sub_self] theorem firstLastPotentialRow_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (f:ZMod q → ZMod q → ℝ) (hf:∀ i k,ZMod.castHom h2 (ZMod 2) i ≠ ZMod.castHom h2 (ZMod 2) k → f i k = 0) : (∑ j, ∑ k,firstLastPotentialRow f j k) = 0:=by unfold firstLastPotentialRow simp only [Finset.sum_sub_distrib, ← Finset.mul_sum] rw [sum_swap_average (fun j k => f (3 * k - 2 * j) k),sum_swap_average, first_last_marginal_of_support h2 f hf,sub_self] private def zz61:"s003d"="s003d":=by decide+kernel theorem companionPotentialRow_sum {q:ℕ} [NeZero q] (h5:¬5 ∣ q) (f:ZMod q → ZMod q → ℝ):(∑ j, ∑ k,companionPotentialRow f j k) = 0:=by simp only [companionPotentialRow,Finset.sum_sub_distrib,companion_sum h5,sub_self] end Green24Proof end section namespace Green24Proof.ExpressionCertificates open QuadraticCertificates abbrev NormalForm:=Quadratic × Hinges noncomputable def normalEval (f:NormalForm) (x:Point):ℝ := quadraticEval f.1 x + hingeEval f.2 x def normalAdd (f g:NormalForm):NormalForm:=(f.1 + g.1,f.2 ++ g.2) def normalScale (c:ℚ) (f:NormalForm):NormalForm := (c • f.1,f.2.map fun t => (c * t.1,t.2)) theorem hingeEval_append (hs ts:Hinges) (x:Point) : hingeEval (hs ++ ts) x = hingeEval hs x + hingeEval ts x:=by simp [hingeEval] theorem hingeEval_scale (c:ℚ) (hs:Hinges) (x:Point) : hingeEval (hs.map fun t => (c * t.1,t.2)) x = (c:ℝ) * hingeEval hs x:=by induction hs with | nil => simp [hingeEval] | cons t ts ih => simp only [List.map_cons,hingeEval,List.map_cons,List.sum_cons,Rat.cast_mul] at * rw [ih] ring theorem normalEval_add (f g:NormalForm) (x:Point) : normalEval (normalAdd f g) x = normalEval f x + normalEval g x:=by simp only [normalEval,normalAdd,quadraticEval_add,hingeEval_append] ring private def zz62:"s003e"="s003e":=by decide+kernel theorem normalEval_scale (c:ℚ) (f:NormalForm) (x:Point) : normalEval (normalScale c f) x = (c:ℝ) * normalEval f x:=by simp only [normalEval,normalScale,quadraticEval_smul,hingeEval_scale] ring def normalSum (fs:List NormalForm):NormalForm:=fs.foldr normalAdd (0,[]) theorem normalEval_sum (fs:List NormalForm) (x:Point) : normalEval (normalSum fs) x = (fs.map fun f => normalEval f x).sum:=by induction fs with | nil => simp [normalSum,normalEval,quadraticEval_zero,hingeEval] | cons f fs ih => simpa only [normalSum,List.foldr_cons,List.map_cons,List.sum_cons,normalEval_add] using congrArg (fun y => normalEval f x + y) ih def symmetricProduct (a b:Linear):Quadratic:=(1 / 2:ℚ) • (product a b + product b a) theorem symmetricProduct_eval (a b:Linear) (x:Point) : quadraticEval (symmetricProduct a b) x = linearEval a x * linearEval b x:=by simp only [symmetricProduct,quadraticEval_smul,quadraticEval_add,quadraticEval_product] norm_num ring theorem linearEval_sub (a b:Linear) (x:Point) : linearEval (a - b) x = linearEval a x - linearEval b x:=by rw [sub_eq_add_neg,linearEval_add,linearEval_neg] rfl inductive Atom where | prod (a b:Linear) | area (a b c:Linear) | potential (r:ℚ) (a b:Linear) noncomputable def atomEval (t:Atom) (x:Point):ℝ := match t with | .prod a b => linearEval a x * linearEval b x | .area a b c => 4 * kernel (linearEval a x) (linearEval b x) (linearEval c x) | .potential r a b => squarePotential (r:ℝ) (linearEval a x) (linearEval b x) def compileAtom:Atom → NormalForm | .prod a b => (symmetricProduct a b,[]) | .area a b c => ((2:ℚ) • symmetricProduct a b + (2:ℚ) • symmetricProduct b c + (2:ℚ) • symmetricProduct c a - product a a - product b b - product c c, [(1,a - b - c),(1,b - a - c),(1,c - a - b)]) | .potential r a b => ((1 / (2 * r):ℚ) • product a a,[(-1 / (2 * r),a - r • b)]) private def zz63:"s003f"="s003f":=by decide+kernel theorem quadraticEval_neg (Q:Quadratic) (x:Point) : quadraticEval (-Q) x = -quadraticEval Q x:=by simp [quadraticEval,Finset.sum_neg_distrib] theorem quadraticEval_sub (Q R:Quadratic) (x:Point) : quadraticEval (Q - R) x = quadraticEval Q x - quadraticEval R x:=by rw [sub_eq_add_neg,quadraticEval_add,quadraticEval_neg] rfl theorem compileAtom_sound (t:Atom) (x:Point) : normalEval (compileAtom t) x = atomEval t x:=by cases t with | prod a b => simp [compileAtom,normalEval,atomEval,hingeEval,symmetricProduct_eval] | area a b c => simp only [compileAtom,normalEval,quadraticEval_sub,quadraticEval_add, quadraticEval_smul,symmetricProduct_eval,quadraticEval_product, hingeEval,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, Rat.cast_one,Rat.cast_ofNat,one_mul,linearEval_sub,atomEval,kernel] ring | potential r a b => simp only [compileAtom,normalEval,quadraticEval_smul,quadraticEval_product, hingeEval,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, Rat.cast_div,Rat.cast_mul,Rat.cast_ofNat,Rat.cast_one,Rat.cast_neg, linearEval_sub,linearEval_smul,atomEval,squarePotential] ring abbrev Expression:=List (ℚ × Atom) noncomputable def expressionEval (e:Expression) (x:Point):ℝ := (e.map fun t => (t.1:ℝ) * atomEval t.2 x).sum def compile (e:Expression):NormalForm:=normalSum (e.map fun t => normalScale t.1 (compileAtom t.2)) theorem compile_sound (e:Expression) (x:Point) : normalEval (compile e) x = expressionEval e x:=by simp only [compile,normalEval_sum,List.map_map,normalEval_scale,compileAtom_sound, expressionEval,Function.comp_def] private def zz64:"s0040"="s0040":=by decide+kernel theorem max_mul_sq_of_nonneg (s a:ℝ) (hs:0 ≤ s) : max (s * a) 0 ^ 2 = s ^ 2 * max a 0 ^ 2:=by rw [show max (s * a) 0 = s * max a 0 by simpa using (mul_max_of_nonneg a 0 hs).symm] ring theorem max_neg_sq (a:ℝ):max (-a) 0 ^ 2 = a ^ 2 - max a 0 ^ 2:=by by_cases h:0 ≤ a · rw [max_eq_left h,max_eq_right (neg_nonpos.mpr h)] ring · have h':=le_of_not_ge h rw [max_eq_right h',max_eq_left (neg_nonneg.mpr h')] ring def rewriteHinge (c s:ℚ) (a:Linear):NormalForm := if 0 ≤ s then (0,[(c * s ^ 2,a)]) else ((c * s ^ 2) • product a a,[(-c * s ^ 2,a)]) theorem rewriteHinge_sound (c s:ℚ) (a:Linear) (x:Point) : normalEval (rewriteHinge c s a) x = (c:ℝ) * max (linearEval (s • a) x) 0 ^ 2:=by rw [linearEval_smul] by_cases hs:0 ≤ s · rw [rewriteHinge,if_pos hs,normalEval,quadraticEval_zero] simp only [hingeEval,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, Rat.cast_mul,Rat.cast_pow,add_zero,zero_add] rw [max_mul_sq_of_nonneg _ _ (by exact_mod_cast hs)] ring · have hs':0 ≤ -(s:ℝ):=by exact_mod_cast (neg_nonneg.mpr (le_of_not_ge hs)) rw [rewriteHinge,if_neg hs,normalEval,quadraticEval_smul,quadraticEval_product] simp only [hingeEval,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, Rat.cast_mul,Rat.cast_pow,Rat.cast_neg,add_zero] rw [show (s:ℝ) * linearEval a x = (-(s:ℝ)) * (-linearEval a x) by ring, max_mul_sq_of_nonneg _ _ hs',max_neg_sq] ring abbrev Rewrites:=List (ℚ × Linear) def rewriteCheck:Hinges → Rewrites → Bool | [],[] => true | (_,v) :: hs,(s,a) :: ws => linearEq v (s • a) && rewriteCheck hs ws | _,_ => false def rewriteAll:Hinges → Rewrites → NormalForm | (c,_) :: hs,(s,a) :: ws => normalAdd (rewriteHinge c s a) (rewriteAll hs ws) | _,_ => (0,[]) theorem rewriteAll_sound (hs:Hinges) (ws:Rewrites) (x:Point) (h:rewriteCheck hs ws = true):normalEval (rewriteAll hs ws) x = hingeEval hs x:=by induction hs generalizing ws with | nil => cases ws with | nil => simp [rewriteAll,normalEval,quadraticEval_zero,hingeEval] | cons w ws => simp [rewriteCheck] at h | cons t hs ih => cases ws with | nil => simp [rewriteCheck] at h | cons w ws => rcases t with ⟨c,v⟩ rcases w with ⟨s,a⟩ simp only [rewriteCheck,Bool.and_eq_true,linearEq_eq_true] at h simp only [rewriteAll,normalEval_add,rewriteHinge_sound,ih ws h.2,hingeEval, List.map_cons,List.sum_cons,h.1] def insertHinge (c:ℚ) (a:Linear):Hinges → Hinges | [] => [(c,a)] | (d,b) :: hs => if linearEq a b then (c + d,b) :: hs else (d,b) :: insertHinge c a hs private def zz65:"s0041"="s0041":=by decide+kernel theorem insertHinge_sound (c:ℚ) (a:Linear) (hs:Hinges) (x:Point) : hingeEval (insertHinge c a hs) x = (c:ℝ) * max (linearEval a x) 0 ^ 2 + hingeEval hs x:=by induction hs with | nil => simp [insertHinge,hingeEval] | cons t hs ih => rcases t with ⟨d,b⟩ by_cases h:linearEq a b = true · have hab:=(linearEq_eq_true a b).mp h rw [insertHinge,if_pos h] simp only [hingeEval,List.map_cons,List.sum_cons,Rat.cast_add,hab] ring · have h':linearEq a b = false:=Bool.eq_false_iff.mpr h simp only [insertHinge,h',Bool.false_eq_true,if_false,hingeEval, List.map_cons,List.sum_cons] at * rw [ih] ring def collect:Hinges → Hinges | [] => [] | (c,a) :: hs => insertHinge c a (collect hs) theorem collect_sound (hs:Hinges) (x:Point):hingeEval (collect hs) x = hingeEval hs x:=by induction hs with | nil => rfl | cons t hs ih => change hingeEval (insertHinge t.1 t.2 (collect hs)) x = hingeEval (t :: hs) x rw [insertHinge_sound,ih] rfl def zeroHinges (hs:Hinges):Bool:=hs.all fun t => t.1 == 0 theorem zeroHinges_sound (hs:Hinges) (x:Point) (h:zeroHinges hs = true) : hingeEval hs x = 0:=by induction hs with | nil => simp [hingeEval] | cons t hs ih => simp only [zeroHinges,List.all_cons,Bool.and_eq_true,beq_iff_eq] at h simpa [hingeEval,h.1] using ih h.2 def normalEqual (f g:NormalForm):Bool := quadraticEq f.1 g.1 && zeroHinges (collect (f.2 ++ (g.2.map fun t => (-t.1,t.2)))) theorem normalEqual_sound (f g:NormalForm) (x:Point) (h:normalEqual f g = true) : normalEval f x = normalEval g x:=by simp only [normalEqual,Bool.and_eq_true,quadraticEq_eq_true] at h have hz:=zeroHinges_sound _ x h.2 rw [collect_sound,hingeEval_append] at hz have hn:hingeEval (g.2.map fun t => (-t.1,t.2)) x = -hingeEval g.2 x:=by simpa only [neg_one_mul,Rat.cast_neg,Rat.cast_one] using hingeEval_scale (-1) g.2 x rw [hn] at hz simp only [normalEval,h.1] linarith def identityCheck (e:Expression) (ws:Rewrites) (target:NormalForm):Bool := rewriteCheck (compile e).2 ws && normalEqual (normalAdd ((compile e).1,[]) (rewriteAll (compile e).2 ws)) target private def zz66:"s0042"="s0042":=by decide+kernel theorem identityCheck_sound (e:Expression) (ws:Rewrites) (target:NormalForm) (x:Point) (h:identityCheck e ws target = true) : expressionEval e x = normalEval target x:=by simp only [identityCheck,Bool.and_eq_true] at h have he:=normalEqual_sound _ target x h.2 rw [normalEval_add,rewriteAll_sound _ _ x h.1] at he simpa only [normalEval,hingeEval,List.map_nil,List.sum_nil,add_zero, ← compile_sound e x] using he def rationalLinear (a:IntegerQuadraticCertificates.Linear):Linear:=fun i => a i def rationalQuadratic (Q:IntegerQuadraticCertificates.Quadratic):Quadratic:=fun i j => Q i j def rationalHinges (hs:IntegerQuadraticCertificates.Hinges):Hinges := hs.map fun t => (t.1,rationalLinear t.2) theorem rationalLinear_eval (a:IntegerQuadraticCertificates.Linear) (x:Point) : linearEval (rationalLinear a) x = IntegerQuadraticCertificates.linearEval a x:=by simp [linearEval,rationalLinear,IntegerQuadraticCertificates.linearEval] theorem rationalQuadratic_eval (Q:IntegerQuadraticCertificates.Quadratic) (x:Point) : quadraticEval (rationalQuadratic Q) x = IntegerQuadraticCertificates.quadraticEval Q x:=by simp [quadraticEval,rationalQuadratic,IntegerQuadraticCertificates.quadraticEval] theorem rationalHinges_eval (hs:IntegerQuadraticCertificates.Hinges) (x:Point) : hingeEval (rationalHinges hs) x = IntegerQuadraticCertificates.hingeEval hs x:=by simp [hingeEval,rationalHinges,IntegerQuadraticCertificates.hingeEval, Function.comp_def,rationalLinear_eval] def rationalNormal (Q:IntegerQuadraticCertificates.Quadratic) (hs:IntegerQuadraticCertificates.Hinges) (den:ℤ):NormalForm := normalScale (1 / (den:ℚ)) (rationalQuadratic Q,rationalHinges hs) private def zz67:"s0043"="s0043":=by decide+kernel theorem rationalNormal_eval (Q:IntegerQuadraticCertificates.Quadratic) (hs:IntegerQuadraticCertificates.Hinges) (den:ℤ) (x:Point) : normalEval (rationalNormal Q hs den) x = (IntegerQuadraticCertificates.quadraticEval Q x + IntegerQuadraticCertificates.hingeEval hs x) / den:=by rw [rationalNormal,normalEval_scale] simp only [normalEval,rationalQuadratic_eval, rationalHinges_eval,Rat.cast_div,Rat.cast_one,Rat.cast_intCast] ring end Green24Proof.ExpressionCertificates private def zz1999:"s07cf"="s07cf":=by decide+kernel end section namespace Green24Proof.FullPhaseRows open QuadraticCertificates ExpressionCertificates abbrev Phase:=ZMod 4 def coordinate (i:Fin 4) (s:ℚ:=1):Linear:=fun j => if j = i then s else 0 def scale (c:ℚ) (e:Expression):Expression:=e.map fun t => (c * t.1,t.2) theorem expressionEval_scale (c:ℚ) (e:Expression) (x:Point) : expressionEval (scale c e) x = (c:ℝ) * expressionEval e x:=by induction e with | nil => simp [scale,expressionEval] | cons t ts ih => simp only [scale,List.map_cons,expressionEval,List.map_cons,List.sum_cons,Rat.cast_mul] at * rw [ih] ring theorem expressionEval_append (e f:Expression) (x:Point) : expressionEval (e ++ f) x = expressionEval e x + expressionEval f x:=by simp [expressionEval] theorem coordinate_eval (i:Fin 4) (s:ℚ) (x:Point) : linearEval (coordinate i s) x = (s:ℝ) * x i:=by simp [linearEval,coordinate,apply_ite,ite_mul] def area:Expression := [(1 / 2, .area (coordinate 0) (coordinate 1 2) (coordinate 2 3)), (1 / 2, .area (coordinate 3) (coordinate 2 2) (coordinate 1 3))] private def zz68:"s0044"="s0044":=by decide+kernel theorem area_eval (x:Point):expressionEval area x = 2 * kernel (x 0) (2 * x 1) (3 * x 2) + 2 * kernel (x 3) (2 * x 2) (3 * x 1):=by simp only [area,expressionEval,List.map_cons,List.map_nil,List.sum_cons, List.sum_nil,atomEval,coordinate_eval,Rat.cast_div,Rat.cast_one,Rat.cast_ofNat,one_mul] ring def rhoExpression:Expression := [(4, .prod (coordinate 0) (coordinate 1)), (-1 / 4, .area (coordinate 0) (coordinate 0 2) (coordinate 1 3)), (-1 / 4, .area (coordinate 1) (coordinate 1 2) (coordinate 0 3))] inductive Position where | firstMiddle | firstLast | middleLast | companion def positionDecidableEq:DecidableEq Position:=by intro a b cases a <;> cases b <;> first | exact .isTrue rfl | exact .isFalse (by intro h; cases h) def Position.indices:Position → Fin 4 × Fin 4 | .firstMiddle => (0,1) | .firstLast => (0,2) | .middleLast => (1,2) | .companion => (0,3) def Position.unordered:Position → Bool | .middleLast | .companion => true | _ => false inductive Shape where | bilinear | potential (r:ℚ) structure Potential where position:Position left:Phase right:Phase same:Bool shape:Shape sign:ℚ def phi (l:Potential) (a b:Linear) (p q:Phase) (same:Bool) (w:ℚ):Expression := let (a,b,p,q):=if l.position.unordered ∧ q.val < p.val then (b,a,q,p) else (a,b,p,q) if p = l.left ∧ q = l.right ∧ same = l.same then match l.shape with | .bilinear => [(w, .prod a b)] | .potential r => if l.position.unordered ∧ p = q then [(w / 2, .potential r a b),(w / 2, .potential r b a)] else [(w, .potential r a b)] else [] def quadPhases (p q:Phase):Fin 4 → Phase:=![3 * q - 2 * p,p,q,3 * p - 2 * q] def quadSame (a b:Fin 4) (same:Bool):Bool:=if a.val / 2 = b.val / 2 then true else same def potentialQuad (l:Potential) (p q:Phase) (same:Bool):Expression := let (a,b):=l.position.indices let phases:=quadPhases p q if l.position.unordered then phi l (coordinate a) (coordinate b) (phases a) (phases b) (quadSame a b same) l.sign else phi l (coordinate a) (coordinate b) (phases a) (phases b) (quadSame a b same) (l.sign / 2) ++ phi l (coordinate (3 - a)) (coordinate (3 - b)) (phases (3 - a)) (phases (3 - b)) (quadSame (3 - a) (3 - b) same) (l.sign / 2) def potentialPair (l:Potential) (p q:Phase) (same:Bool):Expression := letI:=FullPhaseRows.positionDecidableEq if l.position.unordered then phi l (coordinate 0) (coordinate 1) p q same (-l.sign) else let fac:ℚ:=if l.position = .firstMiddle then 3 / 2 else 1 phi l (coordinate 0) (coordinate 1) p q same (-fac * l.sign) ++ phi l (coordinate 1) (coordinate 0) q p same (-fac * l.sign) inductive Label where | potential (l:Potential) | balance (phase:Phase) (sign:ℚ) | child (parity:Fin 2) | grandchild (phase:Phase) | heightChild (parity:Fin 2) | ordered (parity:Fin 2) | massSquare (coloured:Bool) (coefficients:Phase → ℚ) | normalization def pairProduct (w:ℚ):Expression:=[(w, .prod (coordinate 0) (coordinate 1))] def parity (p:Phase):Fin 2:=⟨p.val % 2,Nat.mod_lt _ (by decide)⟩ def rowQuad (l:Label) (p q:Phase) (same:Bool):Expression := match l with | .potential l => potentialQuad l p q same | .child r | .heightChild r => if parity p = r ∧ parity q = r then area else [] | .grandchild r => if p = r ∧ q = r then area else [] | _ => [] def rowPair (S:ℚ) (l:Label) (p q:Phase) (same:Bool):Expression := match l with | .potential l => potentialPair l p q same | .balance r s => let w (p:Phase):ℚ:=if parity p = 0 then 1 else -S pairProduct (s * ((if p = r then w q else 0) + (if q = r then w p else 0)) / 2) | .child r => if parity p = r ∧ parity q = r then pairProduct (-8) else [] | .grandchild r => if p = r ∧ q = r then pairProduct (-8) else [] | .heightChild r => if parity p = r ∧ parity q = r then pairProduct (-8 - (24 / 5:ℚ) * (-1) ^ (p.val / 2 + q.val / 2)) ++ scale (49 / 0x7d) rhoExpression else [] | .ordered r => if parity p = r ∧ parity q = r then let w (p:Phase):ℚ:=if p.val < 2 then -1 else 1 pairProduct ((w p + w q) / 2) else [] | .massSquare coloured v => let fac:ℚ:=if coloured then (if same then 2 / 3 else -1 / 3) else 1 pairProduct (-fac * v p * v q) | .normalization => pairProduct 1 def weightedQuad (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := rows.flatMap fun t => scale t.1 (rowQuad t.2 p q same) def weightedPair (S:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := rows.flatMap fun t => scale t.1 (rowPair S t.2 p q same) def quadSlack (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := weightedQuad rows p q same ++ scale (-1) area def pairSlack (S margin:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := weightedPair S rows p q same ++ pairProduct (8 - 4 * margin) end Green24Proof.FullPhaseRows private def zz2000:"s07d0"="s07d0":=by decide+kernel end section namespace Green24Proof.ParityPhaseRows open QuadraticCertificates ExpressionCertificates FullPhaseRows abbrev Phase:=ZMod 2 structure Potential where position:Position left:Phase right:Phase same:Bool shape:Shape sign:ℚ def phi (l:Potential) (a b:Linear) (p q:Phase) (same:Bool) (w:ℚ):Expression := let (a,b,p,q):=if l.position.unordered ∧ q.val < p.val then (b,a,q,p) else (a,b,p,q) if p = l.left ∧ q = l.right ∧ same = l.same then match l.shape with | .bilinear => [(w, .prod a b)] | .potential r => if l.position.unordered ∧ p = q then [(w / 2, .potential r a b),(w / 2, .potential r b a)] else [(w, .potential r a b)] else [] def quadPhases (p q:Phase):Fin 4 → Phase:=![q,p,q,p] def quadSame (a b:Fin 4) (same:Bool):Bool:=if a.val / 2 = b.val / 2 then true else same def potentialQuad (l:Potential) (p q:Phase) (same:Bool):Expression := let (a,b):=l.position.indices let phases:=quadPhases p q if l.position.unordered then phi l (coordinate a) (coordinate b) (phases a) (phases b) (quadSame a b same) l.sign else phi l (coordinate a) (coordinate b) (phases a) (phases b) (quadSame a b same) (l.sign / 2) ++ phi l (coordinate (3 - a)) (coordinate (3 - b)) (phases (3 - a)) (phases (3 - b)) (quadSame (3 - a) (3 - b) same) (l.sign / 2) def potentialPair (l:Potential) (p q:Phase) (same:Bool):Expression := letI:=FullPhaseRows.positionDecidableEq if l.position.unordered then phi l (coordinate 0) (coordinate 1) p q same (-l.sign) else let fac:ℚ:=if l.position = .firstMiddle then 3 / 2 else 1 phi l (coordinate 0) (coordinate 1) p q same (-fac * l.sign) ++ phi l (coordinate 1) (coordinate 0) q p same (-fac * l.sign) def weightedQuad (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool):Expression := rows.flatMap fun t => scale t.1 (potentialQuad t.2 p q same) def weightedPair (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool):Expression := rows.flatMap fun t => scale t.1 (potentialPair t.2 p q same) def quadSlack (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool):Expression := weightedQuad rows p q same ++ scale (-1) area def balanceCoefficient (μ:Phase → ℚ) (p q:Phase):ℚ := (μ p * (if q = 0 then 1 else -1) + μ q * (if p = 0 then 1 else -1)) / 2 def pairSlack (rows:List (ℚ × Potential)) (μ:Phase → ℚ) (lam:ℚ) (p q:Phase) (same:Bool):Expression := weightedPair rows p q same ++ pairProduct (balanceCoefficient μ p q + if p = 0 ∧ q = 0 then 32 else 0) ++ scale (-2 * lam) rhoExpression end Green24Proof.ParityPhaseRows private def zz2001:"s07d1"="s07d1":=by decide+kernel end section namespace Green24Proof.FullPhaseSemantics open QuadraticCertificates ExpressionCertificates FullPhaseRows noncomputable def potentialValue (l:Potential) (a b:ℝ) (p q:Phase) (same:Bool):ℝ := let (a,b,p,q):=if l.position.unordered ∧ q.val < p.val then (b,a,q,p) else (a,b,p,q) if p = l.left ∧ q = l.right ∧ same = l.same then match l.shape with | .bilinear => a * b | .potential r => if l.position.unordered ∧ p = q then (squarePotential (r:ℝ) a b + squarePotential (r:ℝ) b a) / 2 else squarePotential (r:ℝ) a b else 0 theorem phi_eval (l:Potential) (a b:Linear) (p q:Phase) (same:Bool) (w:ℚ) (x:Point) : expressionEval (phi l a b p q same w) x = (w:ℝ) * potentialValue l (linearEval a x) (linearEval b x) p q same:=by cases hs:l.shape <;> simp only [phi,potentialValue,hs] all_goals split_ifs <;> simp [expressionEval,atomEval] <;> ring theorem rhoExpression_eval (x:Point) (hx:0 ≤ x 0) (hy:0 ≤ x 1) : expressionEval rhoExpression x = rho (x 0) (x 1):=by simp only [rhoExpression,expressionEval,List.map_cons,List.map_nil, List.sum_cons,List.sum_nil,atomEval,coordinate_eval,Rat.cast_ofNat, Rat.cast_div,Rat.cast_neg,Rat.cast_one,one_mul] have h:=kernel_diagonal_pair hx hy linarith theorem pairProduct_eval (w:ℚ) (x:Point) : expressionEval (pairProduct w) x = (w:ℝ) * x 0 * x 1:=by simp [pairProduct,expressionEval,atomEval,coordinate_eval,mul_assoc] private def zz69:"s0045"="s0045":=by decide+kernel theorem weightedQuad_eval (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedQuad rows p q same) x = (rows.map fun t => (t.1:ℝ) * expressionEval (rowQuad t.2 p q same) x).sum:=by induction rows with | nil => simp [weightedQuad,expressionEval] | cons t ts ih => simp only [weightedQuad,List.flatMap_cons,expressionEval_append, expressionEval_scale,List.map_cons,List.sum_cons] at * rw [ih] theorem weightedPair_eval (S:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedPair S rows p q same) x = (rows.map fun t => (t.1:ℝ) * expressionEval (rowPair S t.2 p q same) x).sum:=by induction rows with | nil => simp [weightedPair,expressionEval] | cons t ts ih => simp only [weightedPair,List.flatMap_cons,expressionEval_append, expressionEval_scale,List.map_cons,List.sum_cons] at * rw [ih] theorem quadSlack_eval (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (quadSlack rows p q same) x = (rows.map fun t => (t.1:ℝ) * expressionEval (rowQuad t.2 p q same) x).sum - (2 * kernel (x 0) (2 * x 1) (3 * x 2) + 2 * kernel (x 3) (2 * x 2) (3 * x 1)):=by rw [quadSlack,expressionEval_append,weightedQuad_eval,expressionEval_scale,area_eval] norm_num ring theorem pairSlack_eval (S margin:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (pairSlack S margin rows p q same) x = (rows.map fun t => (t.1:ℝ) * expressionEval (rowPair S t.2 p q same) x).sum + (8 - 4 * (margin:ℝ)) * x 0 * x 1:=by rw [pairSlack,expressionEval_append,weightedPair_eval,pairProduct_eval] norm_cast noncomputable def potentialQuadValue (l:Potential) (p q:Phase) (same:Bool) (x:Point):ℝ := match l.position with | .firstMiddle => (l.sign:ℝ) / 2 * (potentialValue l (x 0) (x 1) (3 * q - 2 * p) p true + potentialValue l (x 3) (x 2) (3 * p - 2 * q) q true) | .firstLast => (l.sign:ℝ) / 2 * (potentialValue l (x 0) (x 2) (3 * q - 2 * p) q same + potentialValue l (x 3) (x 1) (3 * p - 2 * q) p same) | .middleLast => (l.sign:ℝ) * potentialValue l (x 1) (x 2) p q same | .companion => (l.sign:ℝ) * potentialValue l (x 0) (x 3) (3 * q - 2 * p) (3 * p - 2 * q) same private def zz70:"s0046"="s0046":=by decide+kernel theorem potentialQuad_eval (l:Potential) (p q:Phase) (same:Bool) (x:Point) : expressionEval (potentialQuad l p q same) x = potentialQuadValue l p q same x:=by cases h:l.position <;> simp [potentialQuad,potentialQuadValue,h,Position.indices,Position.unordered, quadSame,quadPhases,phi_eval,expressionEval_append,coordinate_eval, Matrix.cons_val_two,Matrix.cons_val_three] <;> ring noncomputable def potentialPairValue (l:Potential) (p q:Phase) (same:Bool) (x:Point):ℝ := match l.position with | .firstMiddle => -(3 / 2:ℝ) * (l.sign:ℝ) * (potentialValue l (x 0) (x 1) p q same + potentialValue l (x 1) (x 0) q p same) | .firstLast => -(l.sign:ℝ) * (potentialValue l (x 0) (x 1) p q same + potentialValue l (x 1) (x 0) q p same) | .middleLast | .companion => -(l.sign:ℝ) * potentialValue l (x 0) (x 1) p q same theorem potentialPair_eval (l:Potential) (p q:Phase) (same:Bool) (x:Point) : expressionEval (potentialPair l p q same) x = potentialPairValue l p q same x:=by cases h:l.position <;> simp [potentialPair,potentialPairValue,h,Position.unordered, phi_eval,expressionEval_append,coordinate_eval] <;> ring def quadPoint {q:ℕ} (g:ZMod q → ℝ) (j k:ZMod q):Point := ![g (3 * k - 2 * j),g j,g k,g (3 * j - 2 * k)] def pairPoint {q:ℕ} (g:ZMod q → ℝ) (j k:ZMod q):Point:=![g j,g k,0,0] def sameColour {q:ℕ} (h3:3 ∣ q) (j k:ZMod q):Bool := decide (ZMod.castHom h3 (ZMod 3) j = ZMod.castHom h3 (ZMod 3) k) theorem cast_three_affine {q:ℕ} (h3:3 ∣ q) (j k:ZMod q) : ZMod.castHom h3 (ZMod 3) (3 * k - 2 * j) = ZMod.castHom h3 (ZMod 3) j:=by simp only [map_sub,map_mul,map_ofNat] have h30:(3:ZMod 3) = 0:=by decide have h21:(2:ZMod 3) = -1:=by decide rw [h30,h21] ring theorem cast_four_affine {q:ℕ} (h4:4 ∣ q) (j k:ZMod q) : ZMod.castHom h4 (ZMod 4) (3 * k - 2 * j) = 3 * ZMod.castHom h4 (ZMod 4) k - 2 * ZMod.castHom h4 (ZMod 4) j:=by simp only [map_sub,map_mul,map_ofNat] private def zz71:"s0047"="s0047":=by decide+kernel theorem sameColour_refl {q:ℕ} (h3:3 ∣ q) (j:ZMod q):sameColour h3 j j = true:=by simp [sameColour] theorem sameColour_affine_left {q:ℕ} (h3:3 ∣ q) (j k t:ZMod q) : sameColour h3 (3 * k - 2 * j) t = sameColour h3 j t:=by simp only [sameColour,cast_three_affine] theorem sameColour_affine_right {q:ℕ} (h3:3 ∣ q) (j k t:ZMod q) : sameColour h3 t (3 * k - 2 * j) = sameColour h3 t j:=by simp only [sameColour,cast_three_affine] noncomputable def globalPotential {q:ℕ} (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (i j:ZMod q):ℝ := potentialValue l (g i) (g j) (ZMod.castHom h4 (ZMod 4) i) (ZMod.castHom h4 (ZMod 4) j) (sameColour h3 i j) noncomputable def potentialRow {q:ℕ} (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (j k:ZMod q):ℝ := expressionEval (potentialQuad l (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (potentialPair l (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) theorem potentialRow_eq {q:ℕ} (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (j k:ZMod q) : potentialRow h4 h3 g l j k = (l.sign:ℝ) * match l.position with | .firstMiddle => firstMiddlePotentialRow (globalPotential h4 h3 g l) j k | .firstLast => firstLastPotentialRow (globalPotential h4 h3 g l) j k | .middleLast => 0 | .companion => companionPotentialRow (globalPotential h4 h3 g l) j k:=by rw [potentialRow,potentialQuad_eval,potentialPair_eval] have hc:sameColour h3 k j = sameColour h3 j k:=by apply Bool.eq_iff_iff.mpr simp only [sameColour,decide_eq_true_eq] exact eq_comm cases h:l.position <;> simp only [potentialQuadValue,potentialPairValue,h,firstMiddlePotentialRow, firstLastPotentialRow,companionPotentialRow,globalPotential,cast_four_affine, sameColour_affine_left,sameColour_affine_right,sameColour_refl,hc] all_goals simp [quadPoint,pairPoint,Matrix.cons_val_two,Matrix.cons_val_three] <;> ring def admissible (l:Potential):Bool := match l.position with | .firstMiddle => l.same | .firstLast => decide (parity l.left = parity l.right) | _ => true private def zz72:"s0048"="s0048":=by decide+kernel theorem potentialValue_firstMiddle_offColour (l:Potential) (hpos:l.position = .firstMiddle) (hs:l.same = true) (a b:ℝ) (p q:Phase):potentialValue l a b p q false = 0:=by simp [potentialValue,hpos,Position.unordered,hs] theorem globalPotential_firstMiddle_support {q:ℕ} (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (hpos:l.position = .firstMiddle) (hs:l.same = true) (i j:ZMod q) (hij:ZMod.castHom h3 (ZMod 3) i ≠ ZMod.castHom h3 (ZMod 3) j) : globalPotential h4 h3 g l i j = 0:=by unfold globalPotential have hc:sameColour h3 i j = false:=by exact decide_eq_false hij rw [hc] exact potentialValue_firstMiddle_offColour l hpos hs _ _ _ _ theorem potentialValue_firstLast_offParity (l:Potential) (hpos:l.position = .firstLast) (hl:parity l.left = parity l.right) (a b:ℝ) (p q:Phase) (same:Bool) (hpq:parity p ≠ parity q):potentialValue l a b p q same = 0:=by simp only [potentialValue,hpos,Position.unordered,Bool.false_eq_true,false_and,if_false] split_ifs with h · exact False.elim (hpq (by rw [h.1,h.2.1]; exact hl)) · rfl theorem parity_cast_four (p:Phase) : (parity p:ZMod 2) = ZMod.castHom (by decide:2 ∣ 4) (ZMod 2) p:=by fin_cases p <;> rfl private def zz73:"s0049"="s0049":=by decide+kernel theorem parity_cast {q:ℕ} (h4:4 ∣ q) (h2:2 ∣ q) (i:ZMod q) : (parity (ZMod.castHom h4 (ZMod 4) i):ZMod 2) = ZMod.castHom h2 (ZMod 2) i:=by rw [parity_cast_four] exact congrArg (fun f:ZMod q →+* ZMod 2 => f i) (ZMod.castHom_comp (by decide:2 ∣ 4) h4) theorem globalPotential_firstLast_support {q:ℕ} (h4:4 ∣ q) (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (hpos:l.position = .firstLast) (hl:parity l.left = parity l.right) (i j:ZMod q) (hij:ZMod.castHom h2 (ZMod 2) i ≠ ZMod.castHom h2 (ZMod 2) j) : globalPotential h4 h3 g l i j = 0:=by apply potentialValue_firstLast_offParity l hpos hl intro he apply hij have he':(parity (ZMod.castHom h4 (ZMod 4) i):ZMod 2) = parity (ZMod.castHom h4 (ZMod 4) j):=he rw [parity_cast h4 h2,parity_cast h4 h2] at he' exact he' theorem potentialRow_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (l:Potential) (hl:admissible l = true) : (∑ j, ∑ k,potentialRow h4 h3 g l j k) = 0:=by simp_rw [potentialRow_eq] simp_rw [← Finset.mul_sum] cases hpos:l.position with | firstMiddle => have hs:l.same = true:=by simpa only [admissible,hpos] using hl rw [firstMiddlePotentialRow_sum h3 (globalPotential h4 h3 g l) (globalPotential_firstMiddle_support h4 h3 g l hpos hs)] ring | firstLast => have hp:parity l.left = parity l.right:=by simpa only [admissible,hpos,decide_eq_true_eq] using hl have h2:2 ∣ q:=dvd_trans (by decide:2 ∣ 4) h4 rw [firstLastPotentialRow_sum h2 (globalPotential h4 h3 g l) (globalPotential_firstLast_support h4 h2 h3 g l hpos hp)] ring | middleLast => simp | companion => rw [companionPotentialRow_sum h5]; ring end Green24Proof.FullPhaseSemantics private def zz2002:"s07d2"="s07d2":=by decide+kernel end section namespace Green24Proof.FullPhaseSymmetry open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics theorem potentialValue_swap (l:Potential) (hu:l.position.unordered = true) (a b:ℝ) (p q:Phase) (same:Bool) : potentialValue l b a q p same = potentialValue l a b p q same:=by rcases lt_trichotomy p.val q.val with h | h | h · simp [potentialValue,hu,h,not_lt_of_gt h] · have hpq:p = q:=ZMod.val_injective 4 h subst q cases hs:l.shape <;> simp only [potentialValue,hu,lt_self_iff_false, true_and,and_false,if_false,hs] all_goals split_ifs <;> ring · simp [potentialValue,hu,h,not_lt_of_gt h] def reversePoint (x:Point):Point:=![x 3,x 2,x 1,x 0] def swapPair (x:Point):Point:=![x 1,x 0,x 2,x 3] private def zz74:"s004a"="s004a":=by decide+kernel theorem reversePoint_nonneg (x:Point) (hx:∀ i,0 ≤ x i):∀ i,0 ≤ reversePoint x i:=by intro i fin_cases i <;> simpa [reversePoint] using hx _ theorem swapPair_nonneg (x:Point) (hx:∀ i,0 ≤ x i):∀ i,0 ≤ swapPair x i:=by intro i fin_cases i <;> simpa [swapPair] using hx _ theorem area_reverse (x:Point):expressionEval area (reversePoint x) = expressionEval area x:=by simp [area_eval,reversePoint,Matrix.cons_val_two,Matrix.cons_val_three] ring theorem potentialQuad_reverse (l:Potential) (p q:Phase) (same:Bool) (x:Point) : expressionEval (potentialQuad l q p same) (reversePoint x) = expressionEval (potentialQuad l p q same) x:=by rw [potentialQuad_eval,potentialQuad_eval] cases h:l.position with | firstMiddle => simp only [potentialQuadValue,h,reversePoint,Matrix.cons_val_zero,Matrix.cons_val_one, Matrix.cons_val_two,Matrix.cons_val_three,Matrix.head_cons,Matrix.tail_cons] ring | firstLast => simp only [potentialQuadValue,h,reversePoint,Matrix.cons_val_zero,Matrix.cons_val_one, Matrix.cons_val_two,Matrix.cons_val_three,Matrix.head_cons,Matrix.tail_cons] ring | middleLast => simp only [potentialQuadValue,h] have hu:l.position.unordered = true:=by simp [h,Position.unordered] simpa [reversePoint,Matrix.cons_val_two] using congrArg (fun y => (l.sign:ℝ) * y) (potentialValue_swap l hu (x 1) (x 2) p q same) | companion => simp only [potentialQuadValue,h] have hu:l.position.unordered = true:=by simp [h,Position.unordered] simpa [reversePoint,Matrix.cons_val_three] using congrArg (fun y => (l.sign:ℝ) * y) (potentialValue_swap l hu (x 0) (x 3) (3 * q - 2 * p) (3 * p - 2 * q) same) private def zz75:"s004b"="s004b":=by decide+kernel theorem potentialPair_swap (l:Potential) (p q:Phase) (same:Bool) (x:Point) : expressionEval (potentialPair l q p same) (swapPair x) = expressionEval (potentialPair l p q same) x:=by rw [potentialPair_eval,potentialPair_eval] cases h:l.position with | firstMiddle => simp only [potentialPairValue,h,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring | firstLast => simp only [potentialPairValue,h,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring | middleLast => simp only [potentialPairValue,h] have hu:l.position.unordered = true:=by simp [h,Position.unordered] simpa [swapPair] using congrArg (fun y => -(l.sign:ℝ) * y) (potentialValue_swap l hu (x 0) (x 1) p q same) | companion => simp only [potentialPairValue,h] have hu:l.position.unordered = true:=by simp [h,Position.unordered] simpa [swapPair] using congrArg (fun y => -(l.sign:ℝ) * y) (potentialValue_swap l hu (x 0) (x 1) p q same) theorem rhoExpression_swap (x:Point) : expressionEval rhoExpression (swapPair x) = expressionEval rhoExpression x:=by simp only [rhoExpression,expressionEval,List.map_cons,List.map_nil,List.sum_cons, List.sum_nil,atomEval,coordinate_eval,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring theorem rowQuad_reverse (l:Label) (p q:Phase) (same:Bool) (x:Point) : expressionEval (rowQuad l q p same) (reversePoint x) = expressionEval (rowQuad l p q same) x:=by cases l with | potential l => exact potentialQuad_reverse l p q same x | child r | heightChild r => simp only [rowQuad,and_comm] split_ifs · exact area_reverse x · rfl | grandchild r => simp only [rowQuad,and_comm] split_ifs · exact area_reverse x · rfl | balance r s => rfl | ordered r => rfl | massSquare c v => rfl | normalization => rfl theorem rowPair_swap (S:ℚ) (l:Label) (p q:Phase) (same:Bool) (x:Point) : expressionEval (rowPair S l q p same) (swapPair x) = expressionEval (rowPair S l p q same) x:=by cases l with | potential l => exact potentialPair_swap l p q same x | balance r s => simp only [rowPair,pairProduct_eval,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one, Rat.cast_div,Rat.cast_mul,Rat.cast_add] ring | child r | grandchild r | ordered r | heightChild r => simp only [rowPair,and_comm,Nat.add_comm] split_ifs all_goals try rfl all_goals simp only [expressionEval_append,expressionEval_scale,pairProduct_eval,rhoExpression_swap] simp only [swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] push_cast ring | massSquare c v => simp only [rowPair,pairProduct_eval,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one, Rat.cast_mul,Rat.cast_neg] ring | normalization => simp only [rowPair,pairProduct_eval,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring private def zz76:"s004c"="s004c":=by decide+kernel theorem weightedQuad_reverse (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedQuad rows q p same) (reversePoint x) = expressionEval (weightedQuad rows p q same) x:=by simp only [weightedQuad_eval,rowQuad_reverse] theorem weightedPair_swap (S:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedPair S rows q p same) (swapPair x) = expressionEval (weightedPair S rows p q same) x:=by simp only [weightedPair_eval,rowPair_swap] theorem quadSlack_reverse (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (quadSlack rows q p same) (reversePoint x) = expressionEval (quadSlack rows p q same) x:=by simp only [quadSlack,expressionEval_append,expressionEval_scale,weightedQuad_reverse,area_reverse] theorem pairSlack_swap (S margin:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (pairSlack S margin rows q p same) (swapPair x) = expressionEval (pairSlack S margin rows p q same) x:=by simp only [pairSlack,expressionEval_append] rw [weightedPair_swap] simp only [pairProduct_eval, swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring end Green24Proof.FullPhaseSymmetry private def zz2003:"s07d3"="s07d3":=by decide+kernel end section namespace Green24Proof.ExtendedFullPhaseRows open QuadraticCertificates ExpressionCertificates open FullPhaseRows (Phase parity area pairProduct scale expressionEval_append expressionEval_scale) open FullPhaseSemantics (pairProduct_eval) open FullPhaseSymmetry (reversePoint swapPair area_reverse) inductive Scope where | whole | parity (r:Fin 2) | phase (r:Phase) def scopeActive:Scope → Phase → Phase → Bool | .whole,_,_ => true | .parity r,p,q => decide (parity p = r ∧ parity q = r) | .phase r,p,q => decide (p = r ∧ q = r) private def zz77:"s004d"="s004d":=by decide+kernel theorem scopeActive_swap (s:Scope) (p q:Phase):scopeActive s q p = scopeActive s p q:=by cases s <;> simp only [scopeActive,and_comm] structure Correction where retained:ℚ even:ℚ mixed:ℚ odd:ℚ def correctionCoefficient (c:Correction) (a p q:Phase):ℚ := if p = q then (if p = a then c.even else c.odd) else c.mixed / 2 theorem correctionCoefficient_swap (c:Correction) (a p q:Phase) : correctionCoefficient c a q p = correctionCoefficient c a p q:=by by_cases h:p = q · subst q; rfl · simp only [correctionCoefficient,h,Ne.symm h,if_false] inductive Label where | base (l:FullPhaseRows.Label) | colourChild (scope:Scope) | massProduct (left right:Phase → ℚ) | massCorrection (r:Fin 2) (leading:Phase) (coefficients:Correction) | massCoercivity (coefficient:ℚ) def rowQuad (l:Label) (p q:Phase) (same:Bool):Expression := match l with | .base l => FullPhaseRows.rowQuad l p q same | .colourChild s => if scopeActive s p q && same then area else [] | .massProduct _ _ => [] | .massCorrection r a c => if parity p = r ∧ parity q = r then scale (1 - if p = q ∧ p = a then c.retained else 0) area else [] | .massCoercivity _ => if parity p = 0 ∧ parity q = 0 then area else [] def rowPair (S:ℚ) (l:Label) (p q:Phase) (same:Bool):Expression := match l with | .base l => FullPhaseRows.rowPair S l p q same | .colourChild s => if scopeActive s p q && same then pairProduct (-8) else [] | .massProduct a b => pairProduct (-(a p * b q + b p * a q) / 2) | .massCorrection r a c => if parity p = r ∧ parity q = r then pairProduct (-8 + (if p = q ∧ p = a then 8 * c.retained else 0) + 4 * correctionCoefficient c a p q) else [] | .massCoercivity c => if parity p = 0 ∧ parity q = 0 then pairProduct (-8 + 4 * c * (-1) ^ (p.val / 2 + q.val / 2)) else [] def weightedQuad (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := rows.flatMap fun v => scale v.1 (rowQuad v.2 p q same) def weightedPair (S:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := rows.flatMap fun v => scale v.1 (rowPair S v.2 p q same) def quadSlack (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := weightedQuad rows p q same ++ scale (-1) area def pairSlack (S margin:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := weightedPair S rows p q same ++ pairProduct (8 - 4 * margin) theorem expressionEval_nil (x:Point):expressionEval [] x = 0:=rfl theorem paritySelected_swap (r:Fin 2) (p q:Phase) : (parity q = r ∧ parity p = r) ↔ (parity p = r ∧ parity q = r):=and_comm private def zz78:"s004e"="s004e":=by decide+kernel theorem selected_swap (a p q:Phase):(q = p ∧ q = a) ↔ (p = q ∧ p = a):=by constructor <;> rintro ⟨h,h'⟩ <;> constructor <;> aesop theorem rowQuad_reverse (l:Label) (p q:Phase) (same:Bool) (x:Point) : expressionEval (rowQuad l q p same) (reversePoint x) = expressionEval (rowQuad l p q same) x:=by cases l with | base l => exact FullPhaseSymmetry.rowQuad_reverse l p q same x | colourChild s => simp only [rowQuad,scopeActive_swap] split_ifs <;> simp only [area_reverse,expressionEval_nil] | massProduct a b => simp only [rowQuad,expressionEval_nil] | massCorrection r a c => simp only [rowQuad,paritySelected_swap r p q,selected_swap] split_ifs <;> simp only [expressionEval_scale,area_reverse, expressionEval_nil] | massCoercivity c => simp only [rowQuad,paritySelected_swap 0 p q] split_ifs <;> simp only [area_reverse,expressionEval_nil] theorem pairProduct_swap (w:ℚ) (x:Point) : expressionEval (pairProduct w) (swapPair x) = expressionEval (pairProduct w) x:=by simp only [pairProduct_eval,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring theorem rowPair_swap (S:ℚ) (l:Label) (p q:Phase) (same:Bool) (x:Point) : expressionEval (rowPair S l q p same) (swapPair x) = expressionEval (rowPair S l p q same) x:=by cases l with | base l => exact FullPhaseSymmetry.rowPair_swap S l p q same x | colourChild s => simp only [rowPair,scopeActive_swap] split_ifs <;> simp only [pairProduct_swap,expressionEval_nil] | massProduct a b => simp only [rowPair,pairProduct_eval,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] push_cast ring | massCorrection r a c => simp only [rowPair,paritySelected_swap r p q,selected_swap,correctionCoefficient_swap] split_ifs <;> simp only [pairProduct_swap,expressionEval_nil] | massCoercivity c => simp only [rowPair,paritySelected_swap 0 p q,add_comm (q.val / 2) (p.val / 2)] split_ifs <;> simp only [pairProduct_swap,expressionEval_nil] private def zz79:"s004f"="s004f":=by decide+kernel theorem weightedQuad_reverse (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedQuad rows q p same) (reversePoint x) = expressionEval (weightedQuad rows p q same) x:=by induction rows with | nil => rfl | cons v vs ih => simp only [weightedQuad,List.flatMap_cons,expressionEval_append,expressionEval_scale, rowQuad_reverse] at * rw [ih] theorem weightedPair_swap (S:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedPair S rows q p same) (swapPair x) = expressionEval (weightedPair S rows p q same) x:=by induction rows with | nil => rfl | cons v vs ih => simp only [weightedPair,List.flatMap_cons,expressionEval_append,expressionEval_scale, rowPair_swap] at * rw [ih] theorem quadSlack_reverse (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (quadSlack rows q p same) (reversePoint x) = expressionEval (quadSlack rows p q same) x:=by simp only [quadSlack,expressionEval_append,weightedQuad_reverse,expressionEval_scale,area_reverse] theorem pairSlack_swap (S margin:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (pairSlack S margin rows q p same) (swapPair x) = expressionEval (pairSlack S margin rows p q same) x:=by simp only [pairSlack,expressionEval_append,weightedPair_swap,pairProduct_swap] end Green24Proof.ExtendedFullPhaseRows private def zz2004:"s07d4"="s07d4":=by decide+kernel end section /- Total decoding of rational coefficients and phase labels from bounded natural-number chunks. The identity checks remain the proof authority. -/ namespace Green24Proof.PackedPhaseRowsData open FullPhaseRows abbrev Reader (α:Type):=StateT (List Nat) Option α def fail {α:Type}:Reader α:=fun _ => none def readByte:Reader Nat | [] => none | n :: rest => if n < 0x100 then readByte rest else some (n % 0x100,n / 0x100 :: rest) def readPacked:Nat → Reader Nat | 0 => fail | fuel + 1 => do let b ← readByte if b < 0x80 then return b else return b % 0x80 + 0x80 * (← readPacked fuel) def readNat:Reader Nat:=readPacked 0x80 def unzig (n:Nat):Int:=if n % 2 = 0 then n / 2 else -((n / 2:Nat):Int) - 1 def readRat:Reader ℚ:=do let n ← readNat let d ← readNat return (unzig n:ℚ) / (d:ℚ) def position (n:Nat):Position := match n % 4 with | 0 => .firstMiddle | 1 => .firstLast | 2 => .middleLast | _ => .companion def smallShape (n:Nat):Shape := match n % 4 with | 0 => .bilinear | 1 => .potential (1 / 3) | 2 => .potential 1 | _ => .potential 3 def smallPotential (n:Nat):Potential := ⟨position n,((n / 4) % 4:Nat),((n / 16) % 4:Nat), n / 64 % 2 == 1,smallShape (n / 0x80),if n / 0x200 % 2 = 0 then 1 else -1⟩ def extendedShape (n:Nat):Shape := match n % 8 with | 0 => .bilinear | 1 => .potential (1 / 3) | 2 => .potential 1 | 3 => .potential 3 | 4 => .potential (1 / 2) | 5 => .potential (2 / 3) | 6 => .potential (3 / 2) | _ => .potential 2 def extendedPotential (n:Nat):Potential := ⟨position n,((n / 4) % 4:Nat),((n / 16) % 4:Nat), n / 64 % 2 == 1,extendedShape (n / 0x80),if n / 0x400 % 2 = 0 then 1 else -1⟩ def readLabel:Reader Label:=do let n ← readNat if n < 0x400 then return .potential (smallPotential n) else if n < 0x408 then return .balance ((n - 0x400) / 2:Nat) (if (n - 0x400) % 2 = 0 then 1 else -1) else if n < 0x40a then return .child ⟨(n - 0x408) % 2,Nat.mod_lt _ (by decide)⟩ else if n < 0x40e then return .grandchild (n - 0x40a:Nat) else if n < 0x410 then return .heightChild ⟨(n - 0x40e) % 2,Nat.mod_lt _ (by decide)⟩ else if n < 0x412 then return .ordered ⟨(n - 0x410) % 2,Nat.mod_lt _ (by decide)⟩ else if 0x800 ≤ n ∧ n < 0x1000 then return .potential (extendedPotential (n - 0x800)) else match n with | 0x412 | 0x413 => let a ← readRat let b ← readRat let c ← readRat let d ← readRat return .massSquare (n == 0x413) (fun p => (![a,b,c,d]:Fin 4 → ℚ) p) | 0x414 => return .normalization | _ => fail def readRows:Nat → Reader (List (ℚ × Label)) | 0 => pure [] | count + 1 => do let weight ← readRat let label ← readLabel return (weight,label) :: (← readRows count) def decode (chunks:List Nat):List (ℚ × Label) := match (do readRows (← readNat)) chunks with | some (rows,_) => rows | none => [] def parityPotential (n:Nat):ParityPhaseRows.Potential := ⟨position n,((n / 4) % 4:Nat),((n / 16) % 4:Nat), n / 64 % 2 == 1,smallShape (n / 0x80),if n / 0x200 % 2 = 0 then 1 else -1⟩ def extendedParityPotential (n:Nat):ParityPhaseRows.Potential := ⟨position n,((n / 4) % 4:Nat),((n / 16) % 4:Nat), n / 64 % 2 == 1,extendedShape (n / 0x80),if n / 0x400 % 2 = 0 then 1 else -1⟩ def readParityRows:Nat → Reader (List (ℚ × ParityPhaseRows.Potential)) | 0 => pure [] | count + 1 => do let weight ← readRat let tag ← readNat if tag < 0x400 then return (weight,parityPotential tag) :: (← readParityRows count) else if 0x800 ≤ tag ∧ tag < 0x1000 then return (weight,extendedParityPotential (tag - 0x800)) :: (← readParityRows count) else fail def decodeParity (chunks:List Nat):List (ℚ × ParityPhaseRows.Potential) := match (do readParityRows (← readNat)) chunks with | some (rows,_) => rows | none => [] def readPhaseVector:Reader (FullPhaseRows.Phase → ℚ):=do let a ← readRat let b ← readRat let c ← readRat let d ← readRat return fun p => (![a,b,c,d]:Fin 4 → ℚ) p def readExtendedLabel:Reader ExtendedFullPhaseRows.Label:=do match ← readNat with | 0 => return .base (← readLabel) | 1 => return .colourChild .whole | 2 => let r ← readNat return .colourChild (.parity ⟨r % 2,Nat.mod_lt _ (by decide)⟩) | 3 => return .colourChild (.phase (← readNat)) | 4 => return .massProduct (← readPhaseVector) (← readPhaseVector) | 5 => let r ← readNat let p ← readNat let a ← readRat let b ← readRat let c ← readRat let d ← readRat return .massCorrection ⟨r % 2,Nat.mod_lt _ (by decide)⟩ p ⟨a,b,c,d⟩ | 6 => return .massCoercivity (← readRat) | _ => fail def readExtendedRows:Nat → Reader (List (ℚ × ExtendedFullPhaseRows.Label)) | 0 => pure [] | count + 1 => do let weight ← readRat let label ← readExtendedLabel return (weight,label) :: (← readExtendedRows count) def decodeExtended (chunks:List Nat):List (ℚ × ExtendedFullPhaseRows.Label) := match (do readExtendedRows (← readNat)) chunks with | some (rows,_) => rows | none => [] end Green24Proof.PackedPhaseRowsData private def zz2005:"s07d5"="s07d5":=by decide+kernel end section namespace Green24Proof.RewriteAtoms open QuadraticCertificates def r0:ℚ × Linear:=(1, ![1, -1,0,0]) def r1:ℚ × Linear:=(-1, ![0,0,1, -1]) def r2:ℚ × Linear:=(1, ![1, -3,0,0]) def r3:ℚ × Linear:=(-1, ![0,0,3, -1]) def r4:ℚ × Linear:=((1 / 3), ![3,0, -1,0]) def r5:ℚ × Linear:=((-1 / 3), ![0,1,0, -3]) def r6:ℚ × Linear:=(1, ![1,0, -1,0]) def r7:ℚ × Linear:=(-1, ![0,1,0, -1]) def r8:ℚ × Linear:=(1, ![1,0, -3,0]) def r9:ℚ × Linear:=(-1, ![0,3,0, -1]) def r10:ℚ × Linear:=(1, ![1, -2, -3,0]) def r11:ℚ × Linear:=(-1, ![1, -2,3,0]) def r12:ℚ × Linear:=(-1, ![1,2, -3,0]) def r13:ℚ × Linear:=(-1, ![0,3,2, -1]) def r14:ℚ × Linear:=(-1, ![0,3, -2,1]) def r15:ℚ × Linear:=(1, ![0,3, -2, -1]) def r16:ℚ × Linear:=(1, ![1,0,0, -3]) def r17:ℚ × Linear:=(-1, ![3,0,0, -1]) def r18:ℚ × Linear:=((1 / 3), ![3, -1,0,0]) def r19:ℚ × Linear:=((-1 / 3), ![0,0,1, -3]) def r20:ℚ × Linear:=(1, ![0,1, -3,0]) def r21:ℚ × Linear:=(-1, ![0,3, -1,0]) def r22:ℚ × Linear:=((1 / 3), ![0,3, -1,0]) def r23:ℚ × Linear:=(-1, ![1,0,0, -1]) def r24:ℚ × Linear:=(1, ![0,1, -1,0]) def r25:ℚ × Linear:=((-1 / 3), ![1,0,0, -3]) def r26:ℚ × Linear:=((-1 / 3), ![1, -3,0,0]) def r27:ℚ × Linear:=(-1, ![1, -1,0,0]) def r28:ℚ × Linear:=(-1, ![3, -1,0,0]) def r29:ℚ × Linear:=((-1 / 3), ![0,1, -3,0]) def r30:ℚ × Linear:=((1 / 3), ![3,0,0, -1]) def r31:ℚ × Linear:=(-1, ![0,1, -1,0]) def r32:ℚ × Linear:=(1, ![1,0,0, -1]) def r33:ℚ × Linear:=(2, ![1, -2, -3,0]) def r34:ℚ × Linear:=(-2, ![1, -2,3,0]) def r35:ℚ × Linear:=(-2, ![1,2, -3,0]) def r36:ℚ × Linear:=(-2, ![0,3,2, -1]) def r37:ℚ × Linear:=(-2, ![0,3, -2,1]) def r38:ℚ × Linear:=(2, ![0,3, -2, -1]) def r39:ℚ × Linear:=(1, ![1, -4, -3,0]) def r40:ℚ × Linear:=(-1, ![1, -4,3,0]) def r41:ℚ × Linear:=(-1, ![1,4, -3,0]) def r42:ℚ × Linear:=(-2, ![0,3,1, -1]) def r43:ℚ × Linear:=(-2, ![0,3, -1,1]) def r44:ℚ × Linear:=(2, ![0,3, -1, -1]) def r45:ℚ × Linear:=(1, ![0,1, -2,0]) def r46:ℚ × Linear:=(-1, ![0,2, -1,0]) def r47:ℚ × Linear:=((1 / 2), ![2, -1,0,0]) def r48:ℚ × Linear:=((-1 / 2), ![0,0,1, -2]) def r49:ℚ × Linear:=((1 / 3), ![3, -2,0,0]) def r50:ℚ × Linear:=((-1 / 3), ![0,0,2, -3]) def r51:ℚ × Linear:=((1 / 2), ![2, -3,0,0]) def r52:ℚ × Linear:=((-1 / 2), ![0,0,3, -2]) def r53:ℚ × Linear:=(1, ![1, -2,0,0]) def r54:ℚ × Linear:=(-1, ![0,0,2, -1]) def r55:ℚ × Linear:=((1 / 2), ![2,0, -1,0]) def r56:ℚ × Linear:=((-1 / 2), ![0,1,0, -2]) def r57:ℚ × Linear:=(1, ![1,0, -2,0]) def r58:ℚ × Linear:=(-1, ![0,2,0, -1]) def r59:ℚ × Linear:=((1 / 2), ![0,2, -3,0]) def r60:ℚ × Linear:=((-1 / 2), ![0,3, -2,0]) def r61:ℚ × Linear:=((1 / 2), ![2,0,0, -3]) def r62:ℚ × Linear:=((-1 / 2), ![3,0,0, -2]) def r63:ℚ × Linear:=((1 / 2), ![2,0, -3,0]) def r64:ℚ × Linear:=((-1 / 2), ![0,3,0, -2]) def r65:ℚ × Linear:=((1 / 2), ![0,2, -1,0]) def r66:ℚ × Linear:=((1 / 3), ![0,3, -2,0]) def r67:ℚ × Linear:=((-1 / 3), ![2,0,0, -3]) def r68:ℚ × Linear:=(-1, ![2,0,0, -1]) def r69:ℚ × Linear:=(-1, ![2, -1,0,0]) def r70:ℚ × Linear:=((-1 / 2), ![1, -2,0,0]) def r71:ℚ × Linear:=((-1 / 2), ![3, -2,0,0]) def r72:ℚ × Linear:=((-1 / 3), ![2, -3,0,0]) def r73:ℚ × Linear:=(-1, ![1,3,0,0]) def r74:ℚ × Linear:=(-3, ![1, -1,0,0]) def r75:ℚ × Linear:=(-1, ![3,1,0,0]) def r76:ℚ × Linear:=(3, ![1, -1,0,0]) def r77:ℚ × Linear:=(1, ![1,0,0, -2]) def r78:ℚ × Linear:=((1 / 3), ![3,0, -2,0]) def r79:ℚ × Linear:=((-1 / 3), ![0,2,0, -3]) def r80:ℚ × Linear:=((-1 / 2), ![1,0,0, -2]) def r81:ℚ × Linear:=((1 / 2), ![2,0,0, -1]) def r82:ℚ × Linear:=((1 / 3), ![3,0,0, -2]) end Green24Proof.RewriteAtoms private def zz2006:"s07d6"="s07d6":=by decide+kernel end section namespace Green24Proof.ParityPhaseSemantics open QuadraticCertificates ExpressionCertificates ParityPhaseRows open FullPhaseRows (Position Shape coordinate coordinate_eval expressionEval_append expressionEval_scale) open FullPhaseSemantics (quadPoint pairPoint sameColour sameColour_refl sameColour_affine_left sameColour_affine_right) noncomputable def potentialValue (l:Potential) (a b:ℝ) (p q:Phase) (same:Bool):ℝ := let (a,b,p,q):=if l.position.unordered ∧ q.val < p.val then (b,a,q,p) else (a,b,p,q) if p = l.left ∧ q = l.right ∧ same = l.same then match l.shape with | .bilinear => a * b | .potential r => if l.position.unordered ∧ p = q then (squarePotential (r:ℝ) a b + squarePotential (r:ℝ) b a) / 2 else squarePotential (r:ℝ) a b else 0 private def zz80:"s0050"="s0050":=by decide+kernel theorem phi_eval (l:Potential) (a b:Linear) (p q:Phase) (same:Bool) (w:ℚ) (x:Point) : expressionEval (phi l a b p q same w) x = (w:ℝ) * potentialValue l (linearEval a x) (linearEval b x) p q same:=by cases hs:l.shape <;> simp only [phi,potentialValue,hs] all_goals split_ifs <;> simp [expressionEval,atomEval] <;> ring noncomputable def potentialQuadValue (l:Potential) (p q:Phase) (same:Bool) (x:Point):ℝ := match l.position with | .firstMiddle => (l.sign:ℝ) / 2 * (potentialValue l (x 0) (x 1) q p true + potentialValue l (x 3) (x 2) p q true) | .firstLast => (l.sign:ℝ) / 2 * (potentialValue l (x 0) (x 2) q q same + potentialValue l (x 3) (x 1) p p same) | .middleLast => (l.sign:ℝ) * potentialValue l (x 1) (x 2) p q same | .companion => (l.sign:ℝ) * potentialValue l (x 0) (x 3) q p same theorem potentialQuad_eval (l:Potential) (p q:Phase) (same:Bool) (x:Point) : expressionEval (potentialQuad l p q same) x = potentialQuadValue l p q same x:=by cases h:l.position <;> simp [potentialQuad,potentialQuadValue,h,Position.indices,Position.unordered, quadSame,quadPhases,phi_eval,expressionEval_append,coordinate_eval, Matrix.cons_val_two,Matrix.cons_val_three] <;> ring noncomputable def potentialPairValue (l:Potential) (p q:Phase) (same:Bool) (x:Point):ℝ := match l.position with | .firstMiddle => -(3 / 2:ℝ) * (l.sign:ℝ) * (potentialValue l (x 0) (x 1) p q same + potentialValue l (x 1) (x 0) q p same) | .firstLast => -(l.sign:ℝ) * (potentialValue l (x 0) (x 1) p q same + potentialValue l (x 1) (x 0) q p same) | .middleLast | .companion => -(l.sign:ℝ) * potentialValue l (x 0) (x 1) p q same theorem potentialPair_eval (l:Potential) (p q:Phase) (same:Bool) (x:Point) : expressionEval (potentialPair l p q same) x = potentialPairValue l p q same x:=by cases h:l.position <;> simp [potentialPair,potentialPairValue,h,Position.unordered, phi_eval,expressionEval_append,coordinate_eval] <;> ring theorem cast_two_affine {q:ℕ} (h2:2 ∣ q) (j k:ZMod q) : ZMod.castHom h2 (ZMod 2) (3 * k - 2 * j) = ZMod.castHom h2 (ZMod 2) k:=by simp only [map_sub,map_mul,map_ofNat] have h3:(3:ZMod 2) = 1:=by decide have h0:(2:ZMod 2) = 0:=by decide rw [h3,h0] ring noncomputable def globalPotential {q:ℕ} (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (i j:ZMod q):ℝ := potentialValue l (g i) (g j) (ZMod.castHom h2 (ZMod 2) i) (ZMod.castHom h2 (ZMod 2) j) (sameColour h3 i j) noncomputable def potentialRow {q:ℕ} (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (j k:ZMod q):ℝ := expressionEval (potentialQuad l (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (potentialPair l (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (pairPoint g j k) private def zz81:"s0051"="s0051":=by decide+kernel theorem potentialRow_eq {q:ℕ} (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (j k:ZMod q) : potentialRow h2 h3 g l j k = (l.sign:ℝ) * match l.position with | .firstMiddle => firstMiddlePotentialRow (globalPotential h2 h3 g l) j k | .firstLast => firstLastPotentialRow (globalPotential h2 h3 g l) j k | .middleLast => 0 | .companion => companionPotentialRow (globalPotential h2 h3 g l) j k:=by rw [potentialRow,potentialQuad_eval,potentialPair_eval] have hc:sameColour h3 k j = sameColour h3 j k:=by apply Bool.eq_iff_iff.mpr simp only [sameColour,decide_eq_true_eq] exact eq_comm cases h:l.position <;> simp only [potentialQuadValue,potentialPairValue,h,firstMiddlePotentialRow, firstLastPotentialRow,companionPotentialRow,globalPotential,cast_two_affine, sameColour_affine_left,sameColour_affine_right,sameColour_refl,hc] all_goals simp [quadPoint,pairPoint,Matrix.cons_val_two,Matrix.cons_val_three] <;> ring def admissible (l:Potential):Bool := match l.position with | .firstMiddle => l.same | .firstLast => decide (l.left = l.right) | _ => true theorem potentialValue_firstMiddle_offColour (l:Potential) (hpos:l.position = .firstMiddle) (hs:l.same = true) (a b:ℝ) (p q:Phase):potentialValue l a b p q false = 0:=by simp [potentialValue,hpos,Position.unordered,hs] theorem globalPotential_firstMiddle_support {q:ℕ} (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (hpos:l.position = .firstMiddle) (hs:l.same = true) (i j:ZMod q) (hij:ZMod.castHom h3 (ZMod 3) i ≠ ZMod.castHom h3 (ZMod 3) j) : globalPotential h2 h3 g l i j = 0:=by unfold globalPotential have hc:sameColour h3 i j = false:=by exact decide_eq_false hij rw [hc] exact potentialValue_firstMiddle_offColour l hpos hs _ _ _ _ theorem potentialValue_firstLast_offParity (l:Potential) (hpos:l.position = .firstLast) (hl:l.left = l.right) (a b:ℝ) (p q:Phase) (same:Bool) (hpq:p ≠ q):potentialValue l a b p q same = 0:=by simp only [potentialValue,hpos,Position.unordered,Bool.false_eq_true,false_and,if_false] split_ifs with h · exact False.elim (hpq (by rw [h.1,h.2.1]; exact hl)) · rfl private def zz82:"s0052"="s0052":=by decide+kernel theorem globalPotential_firstLast_support {q:ℕ} (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Potential) (hpos:l.position = .firstLast) (hl:l.left = l.right) (i j:ZMod q) (hij:ZMod.castHom h2 (ZMod 2) i ≠ ZMod.castHom h2 (ZMod 2) j) : globalPotential h2 h3 g l i j = 0:=by exact potentialValue_firstLast_offParity l hpos hl _ _ _ _ _ hij theorem potentialRow_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (l:Potential) (hl:admissible l = true) : (∑ j, ∑ k,potentialRow h2 h3 g l j k) = 0:=by simp_rw [potentialRow_eq] simp_rw [← Finset.mul_sum] cases hpos:l.position with | firstMiddle => have hs:l.same = true:=by simpa only [admissible,hpos] using hl rw [firstMiddlePotentialRow_sum h3 (globalPotential h2 h3 g l) (globalPotential_firstMiddle_support h2 h3 g l hpos hs)] ring | firstLast => have hp:l.left = l.right:=by simpa only [admissible,hpos,decide_eq_true_eq] using hl rw [firstLastPotentialRow_sum h2 (globalPotential h2 h3 g l) (globalPotential_firstLast_support h2 h3 g l hpos hp)] ring | middleLast => simp | companion => rw [companionPotentialRow_sum h5]; ring theorem weightedQuad_eval (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedQuad rows p q same) x = (rows.map fun t => (t.1:ℝ) * expressionEval (potentialQuad t.2 p q same) x).sum:=by induction rows with | nil => simp [weightedQuad,expressionEval] | cons t ts ih => simp only [weightedQuad,List.flatMap_cons,expressionEval_append, expressionEval_scale,List.map_cons,List.sum_cons] at * rw [ih] theorem weightedPair_eval (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedPair rows p q same) x = (rows.map fun t => (t.1:ℝ) * expressionEval (potentialPair t.2 p q same) x).sum:=by induction rows with | nil => simp [weightedPair,expressionEval] | cons t ts ih => simp only [weightedPair,List.flatMap_cons,expressionEval_append, expressionEval_scale,List.map_cons,List.sum_cons] at * rw [ih] end Green24Proof.ParityPhaseSemantics private def zz2007:"s07d7"="s07d7":=by decide+kernel end section namespace Green24Proof.ParityPhaseSymmetry open QuadraticCertificates ExpressionCertificates ParityPhaseRows ParityPhaseSemantics open FullPhaseRows (Position expressionEval_append expressionEval_scale) open FullPhaseSemantics (pairProduct_eval) open FullPhaseSymmetry (reversePoint swapPair area_reverse rhoExpression_swap) private def zz83:"s0053"="s0053":=by decide+kernel theorem potentialValue_swap (l:Potential) (hu:l.position.unordered = true) (a b:ℝ) (p q:Phase) (same:Bool) : potentialValue l b a q p same = potentialValue l a b p q same:=by rcases lt_trichotomy p.val q.val with h | h | h · simp [potentialValue,hu,h,not_lt_of_gt h] · have hpq:p = q:=ZMod.val_injective 2 h subst q cases hs:l.shape <;> simp only [potentialValue,hu,lt_self_iff_false, true_and,and_false,if_false,hs] all_goals split_ifs <;> ring · simp [potentialValue,hu,h,not_lt_of_gt h] theorem potentialQuad_reverse (l:Potential) (p q:Phase) (same:Bool) (x:Point) : expressionEval (potentialQuad l q p same) (reversePoint x) = expressionEval (potentialQuad l p q same) x:=by rw [potentialQuad_eval,potentialQuad_eval] cases h:l.position with | firstMiddle => simp only [potentialQuadValue,h,reversePoint,Matrix.cons_val_zero,Matrix.cons_val_one, Matrix.cons_val_two,Matrix.cons_val_three,Matrix.head_cons,Matrix.tail_cons] ring | firstLast => simp only [potentialQuadValue,h,reversePoint,Matrix.cons_val_zero,Matrix.cons_val_one, Matrix.cons_val_two,Matrix.cons_val_three,Matrix.head_cons,Matrix.tail_cons] ring | middleLast => simp only [potentialQuadValue,h] have hu:l.position.unordered = true:=by simp [h,Position.unordered] simpa [reversePoint,Matrix.cons_val_two] using congrArg (fun y => (l.sign:ℝ) * y) (potentialValue_swap l hu (x 1) (x 2) p q same) | companion => simp only [potentialQuadValue,h] have hu:l.position.unordered = true:=by simp [h,Position.unordered] simpa [reversePoint,Matrix.cons_val_three] using congrArg (fun y => (l.sign:ℝ) * y) (potentialValue_swap l hu (x 0) (x 3) q p same) theorem potentialPair_swap (l:Potential) (p q:Phase) (same:Bool) (x:Point) : expressionEval (potentialPair l q p same) (swapPair x) = expressionEval (potentialPair l p q same) x:=by rw [potentialPair_eval,potentialPair_eval] cases h:l.position with | firstMiddle => simp only [potentialPairValue,h,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring | firstLast => simp only [potentialPairValue,h,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring | middleLast => simp only [potentialPairValue,h] have hu:l.position.unordered = true:=by simp [h,Position.unordered] simpa [swapPair] using congrArg (fun y => -(l.sign:ℝ) * y) (potentialValue_swap l hu (x 0) (x 1) p q same) | companion => simp only [potentialPairValue,h] have hu:l.position.unordered = true:=by simp [h,Position.unordered] simpa [swapPair] using congrArg (fun y => -(l.sign:ℝ) * y) (potentialValue_swap l hu (x 0) (x 1) p q same) theorem weightedQuad_reverse (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedQuad rows q p same) (reversePoint x) = expressionEval (weightedQuad rows p q same) x:=by simp only [weightedQuad_eval,potentialQuad_reverse] private def zz84:"s0054"="s0054":=by decide+kernel theorem weightedPair_swap (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (weightedPair rows q p same) (swapPair x) = expressionEval (weightedPair rows p q same) x:=by simp only [weightedPair_eval,potentialPair_swap] theorem quadSlack_reverse (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (quadSlack rows q p same) (reversePoint x) = expressionEval (quadSlack rows p q same) x:=by simp only [quadSlack,expressionEval_append,expressionEval_scale,weightedQuad_reverse,area_reverse] theorem pairSlack_swap (rows:List (ℚ × Potential)) (μ:Phase → ℚ) (lam:ℚ) (p q:Phase) (same:Bool) (x:Point) : expressionEval (pairSlack rows μ lam q p same) (swapPair x) = expressionEval (pairSlack rows μ lam p q same) x:=by simp only [pairSlack,expressionEval_append,expressionEval_scale] rw [weightedPair_swap,rhoExpression_swap] simp only [pairProduct_eval,balanceCoefficient,and_comm, swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] push_cast ring end Green24Proof.ParityPhaseSymmetry private def zz2008:"s07d8"="s07d8":=by decide+kernel end section namespace Green24Proof.ParityCorrectionRows open QuadraticCertificates ExpressionCertificates open ParityPhaseRows (Phase Potential weightedQuad weightedPair) open FullPhaseRows (area pairProduct scale expressionEval_append expressionEval_scale) open FullPhaseSemantics (pairProduct_eval) open FullPhaseSymmetry (reversePoint swapPair area_reverse) open ParityPhaseSymmetry (weightedQuad_reverse weightedPair_swap) def areaWeight (r:ℚ) (p q:Phase):ℚ:=if p = 0 ∧ q = 0 then 2 * r - r ^ 2 else 1 def balanceCoefficient (r:ℚ) (μ:Phase → ℚ) (p q:Phase):ℚ := (μ p * (if q = 0 then r else -1) + μ q * (if p = 0 then r else -1)) / 2 def quadSlack (rows:List (ℚ × Potential)) (r:ℚ) (p q:Phase) (same:Bool):Expression := weightedQuad rows p q same ++ scale (-areaWeight r p q) area def pairSlack (rows:List (ℚ × Potential)) (r:ℚ) (μ:Phase → ℚ) (normalization:ℚ) (p q:Phase) (same:Bool):Expression := weightedPair rows p q same ++ pairProduct (balanceCoefficient r μ p q + normalization + if p ≠ q then 16 else 0) theorem quadSlack_reverse (rows:List (ℚ × Potential)) (r:ℚ) (p q:Phase) (same:Bool) (x:Point) : expressionEval (quadSlack rows r q p same) (reversePoint x) = expressionEval (quadSlack rows r p q same) x:=by simp only [quadSlack,expressionEval_append,expressionEval_scale, weightedQuad_reverse,area_reverse,areaWeight,and_comm] private def zz85:"s0055"="s0055":=by decide+kernel theorem pairSlack_swap (rows:List (ℚ × Potential)) (r:ℚ) (μ:Phase → ℚ) (normalization:ℚ) (p q:Phase) (same:Bool) (x:Point) : expressionEval (pairSlack rows r μ normalization q p same) (swapPair x) = expressionEval (pairSlack rows r μ normalization p q same) x:=by simp only [pairSlack,expressionEval_append] rw [weightedPair_swap] simp only [pairProduct_eval, balanceCoefficient,ne_comm,swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] push_cast ring end Green24Proof.ParityCorrectionRows private def zz2009:"s07d9"="s07d9":=by decide+kernel end section namespace Green24Proof theorem outer_product_sum {ι:Type*} [Fintype ι] (f g:ι → ℝ) : (∑ i, ∑ j,f i * g j) = (∑ i,f i) * ∑ j,g j:=by simp only [Finset.sum_mul,Finset.mul_sum] exact Finset.sum_comm theorem negative_symmetric_product_sum {ι:Type*} [Fintype ι] (f g:ι → ℝ) : (∑ i, ∑ j, -(f i * g j + g i * f j) / 2) = -(∑ i,f i) * ∑ j,g j:=by simp only [neg_div,add_div,Finset.sum_neg_distrib,Finset.sum_add_distrib, ← Finset.sum_div] rw [outer_product_sum,outer_product_sum] ring theorem negative_symmetric_product_sum_nonpos {ι:Type*} [Fintype ι] (f g:ι → ℝ) (hf:0 ≤ ∑ i,f i) (hg:0 ≤ ∑ j,g j) : (∑ i, ∑ j, -(f i * g j + g i * f j) / 2) ≤ 0:=by rw [negative_symmetric_product_sum] exact mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr hf) hg private def zz86:"s0056"="s0056":=by decide+kernel theorem negative_square_row_sum_nonpos {ι:Type*} [Fintype ι] (f:ι → ℝ) : (∑ i, ∑ j, -(f i * f j)) ≤ 0:=by simp only [Finset.sum_neg_distrib,outer_product_sum] nlinarith [sq_nonneg (∑ i,f i)] noncomputable def colourTotal {ι κ:Type*} [Fintype ι] [DecidableEq κ] (χ:ι → κ) (f:ι → ℝ) (c:κ):ℝ:=∑ i,if χ i = c then f i else 0 theorem sum_colourTotal {ι κ:Type*} [Fintype ι] [Fintype κ] [DecidableEq κ] (χ:ι → κ) (f:ι → ℝ):(∑ c,colourTotal χ f c) = ∑ i,f i:=by unfold colourTotal rw [Finset.sum_comm] simp theorem same_colour_product_sum {ι κ:Type*} [Fintype ι] [Fintype κ] [DecidableEq κ] (χ:ι → κ) (f:ι → ℝ) : (∑ i, ∑ j,if χ i = χ j then f i * f j else 0) = ∑ c,colourTotal χ f c ^ 2:=by let g (c:κ) (i:ι):ℝ:=if χ i = c then f i else 0 have hp (i j:ι):(if χ i = χ j then f i * f j else 0) = ∑ c,g c i * g c j:=by simp [g,ite_mul,mul_ite,eq_comm] simp_rw [hp] calc _ = ∑ i, ∑ c, ∑ j,g c i * g c j:=by apply Finset.sum_congr rfl intro i _ exact Finset.sum_comm _ = ∑ c, ∑ i, ∑ j,g c i * g c j:=Finset.sum_comm _ = _:=by apply Finset.sum_congr rfl intro c _ rw [outer_product_sum] change colourTotal χ f c * colourTotal χ f c = colourTotal χ f c ^ 2 ring noncomputable def colourVarianceRow {ι κ:Type*} [Fintype κ] [DecidableEq κ] (χ:ι → κ) (f:ι → ℝ) (i j:ι):ℝ := -((if χ i = χ j then 1 else 0) - 1 / (Fintype.card κ:ℝ)) * f i * f j theorem colourVarianceRow_sum {ι κ:Type*} [Fintype ι] [Fintype κ] [DecidableEq κ] (χ:ι → κ) (f:ι → ℝ) : (∑ i, ∑ j,colourVarianceRow χ f i j) = -(∑ c,colourTotal χ f c ^ 2) + (∑ i,f i) ^ 2 / (Fintype.card κ:ℝ):=by have hp (i j:ι):colourVarianceRow χ f i j = -(if χ i = χ j then f i * f j else 0) + (1 / (Fintype.card κ:ℝ)) * (f i * f j):=by unfold colourVarianceRow split_ifs <;> ring simp_rw [hp] simp only [Finset.sum_add_distrib,Finset.sum_neg_distrib, ← Finset.mul_sum] rw [same_colour_product_sum, ← Finset.sum_mul] ring private def zz87:"s0057"="s0057":=by decide+kernel theorem colourVarianceRow_sum_nonpos {ι κ:Type*} [Fintype ι] [Fintype κ] [Nonempty κ] [DecidableEq κ] (χ:ι → κ) (f:ι → ℝ) : (∑ i, ∑ j,colourVarianceRow χ f i j) ≤ 0:=by rw [colourVarianceRow_sum] have hcs:=sq_sum_le_card_mul_sum_sq (s:=Finset.univ) (f:=colourTotal χ f) rw [Finset.card_univ,sum_colourTotal] at hcs have hc:(0:ℝ) < Fintype.card κ:=by exact_mod_cast Fintype.card_pos have hdiv:(∑ i,f i) ^ 2 / (Fintype.card κ:ℝ) ≤ ∑ c,colourTotal χ f c ^ 2:=by apply (div_le_iff₀ hc).mpr nlinarith linarith end Green24Proof end section namespace Green24Proof.FullPhaseAggregation open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics FullPhaseSymmetry noncomputable def rowValue {q:ℕ} (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Label) (j k:ZMod q):ℝ := expressionEval (rowQuad l (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (rowPair S l (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) noncomputable def rowAggregate {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Label):ℝ:=∑ j, ∑ k,rowValue S h4 h3 g l j k noncomputable def weightedAggregate {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Label)):ℝ := (rows.map fun t => (t.1:ℝ) * rowAggregate S h4 h3 g t.2).sum theorem potential_aggregate {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (l:Potential) (hl:admissible l = true) : rowAggregate S h4 h3 g (.potential l) = 0 := potentialRow_sum h4 h3 h5 g l hl theorem quadPoint_nonneg {q:ℕ} (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (j k:ZMod q) : ∀ i,0 ≤ quadPoint g j k i:=by intro i fin_cases i <;> simpa [quadPoint] using hg _ theorem pairPoint_nonneg {q:ℕ} (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (j k:ZMod q) : ∀ i,0 ≤ pairPoint g j k i:=by intro i fin_cases i · exact hg j · exact hg k · exact le_refl 0 · exact le_refl 0 private def zz88:"s0058"="s0058":=by decide+kernel theorem area_sum {q:ℕ} [NeZero q] (g:ZMod q → ℝ) : (∑ j, ∑ k,expressionEval area (quadPoint g j k)) = 4 * profileFunctional g:=by simp only [area_eval,quadPoint,Matrix.cons_val_zero,Matrix.cons_val_one, Matrix.cons_val_two,Matrix.cons_val_three,Matrix.head_cons,Matrix.tail_cons] simp only [Finset.sum_add_distrib, ← Finset.mul_sum] have hswap:(∑ j, ∑ k,kernel (g (3 * j - 2 * k)) (2 * g k) (3 * g j)) = profileFunctional g:=Finset.sum_comm rw [hswap] change 2 * profileFunctional g + 2 * profileFunctional g = 4 * profileFunctional g ring theorem pairProduct_sum {q:ℕ} [NeZero q] (w:ℚ) (g:ZMod q → ℝ) : (∑ j, ∑ k,expressionEval (pairProduct w) (pairPoint g j k)) = (w:ℝ) * mass g ^ 2:=by simp only [pairProduct_eval,pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] simp only [← Finset.mul_sum, ← Finset.sum_mul] unfold mass ring theorem weightedRows_sum {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Label)) : (∑ j:ZMod q, ∑ k:ZMod q,( expressionEval (weightedQuad rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (weightedPair S rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k))) = weightedAggregate S h4 h3 g rows:=by induction rows with | nil => simp [weightedQuad,weightedPair,expressionEval,weightedAggregate] | cons t ts ih => simp only [weightedQuad,weightedPair,List.flatMap_cons,expressionEval_append, expressionEval_scale] at * have hdistrib (j k:ZMod q) : (t.1:ℝ) * expressionEval (rowQuad t.2 (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval ((ts.flatMap fun t => scale t.1 (rowQuad t.2 (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)))) (quadPoint g j k) + ((t.1:ℝ) * expressionEval (rowPair S t.2 (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) + expressionEval ((ts.flatMap fun t => scale t.1 (rowPair S t.2 (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)))) (pairPoint g j k)) = (t.1:ℝ) * rowValue S h4 h3 g t.2 j k + (expressionEval (weightedQuad ts (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (weightedPair S ts (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k)):=by unfold rowValue weightedQuad weightedPair ring simp_rw [hdistrib] simp only [Finset.sum_add_distrib] at ih simp only [Finset.sum_add_distrib, ← Finset.mul_sum,weightedQuad,weightedPair] rw [ih] rfl theorem local_slacks_sum {q:ℕ} [NeZero q] (S margin:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Label)) : (∑ j:ZMod q, ∑ k:ZMod q,( expressionEval (quadSlack rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack S margin rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k))) = weightedAggregate S h4 h3 g rows + 4 * deficit g - 4 * (margin:ℝ) * mass g ^ 2:=by have hw:=weightedRows_sum S h4 h3 g rows simp only [Finset.sum_add_distrib] at hw simp only [quadSlack,pairSlack,expressionEval_append,expressionEval_scale,Rat.cast_neg,Rat.cast_one] simp_rw [show ∀ a b c d:ℝ,a + -1 * b + (c + d) = (a + c) - b + d by intros; ring] simp only [Finset.sum_add_distrib,Finset.sum_sub_distrib, area_sum,pairProduct_sum] rw [← hw] push_cast unfold deficit ring def labelAdmissible:Label → Bool | .potential l => admissible l | _ => true def rowsAdmissible (rows:List (ℚ × Label)):Bool:=rows.all fun t => labelAdmissible t.2 def stripPotentials:List (ℚ × Label) → List (ℚ × Label) | [] => [] | (_, .potential _) :: ts => stripPotentials ts | t :: ts => t :: stripPotentials ts private def zz89:"s0059"="s0059":=by decide+kernel theorem weightedAggregate_cons {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (t:ℚ × Label) (ts:List (ℚ × Label)) : weightedAggregate S h4 h3 g (t :: ts) = (t.1:ℝ) * rowAggregate S h4 h3 g t.2 + weightedAggregate S h4 h3 g ts:=rfl theorem stripPotentials_sound {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Label)) (hrows:rowsAdmissible rows = true) : weightedAggregate S h4 h3 g rows = weightedAggregate S h4 h3 g (stripPotentials rows):=by induction rows with | nil => rfl | cons t ts ih => simp only [rowsAdmissible,List.all_cons,Bool.and_eq_true] at hrows rcases t with ⟨w,l⟩ cases l with | potential l => have hl:admissible l = true:=hrows.1 simp only [stripPotentials,weightedAggregate_cons,potential_aggregate S h4 h3 h5 g l hl, mul_zero,zero_add] exact ih hrows.2 | balance r s | child r | grandchild r | heightChild r | ordered r | massSquare c v | normalization => simp only [stripPotentials,weightedAggregate_cons] rw [ih hrows.2] end Green24Proof.FullPhaseAggregation private def zz2010:"s07da"="s07da":=by decide+kernel end section namespace Green24Proof.PhaseMassRows open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics FullPhaseAggregation theorem sum_phase (f:Phase → ℝ):(∑ r,f r) = f 0 + f 1 + f 2 + f 3 := Fin.sum_univ_four f noncomputable def phaseTotal {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (r:Phase):ℝ := colourTotal (ZMod.castHom h4 (ZMod 4)) g r noncomputable def massWeighted {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (w:Phase → ℝ):ℝ:=∑ i,w (ZMod.castHom h4 (ZMod 4) i) * g i theorem weighted_colourTotal {ι κ:Type*} [Fintype ι] [Fintype κ] [DecidableEq κ] (χ:ι → κ) (g:ι → ℝ) (w:κ → ℝ) : (∑ i,w (χ i) * g i) = ∑ r,w r * colourTotal χ g r:=by symm simp only [colourTotal,Finset.mul_sum] rw [Finset.sum_comm] apply Finset.sum_congr rfl intro i _ simp [mul_ite,eq_comm] private def zz90:"s005a"="s005a":=by decide+kernel theorem massWeighted_phaseTotal {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (w:Phase → ℝ):massWeighted h4 g w = ∑ r,w r * phaseTotal h4 g r := weighted_colourTotal _ g w theorem phaseTotal_nonneg {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (r:Phase):0 ≤ phaseTotal h4 g r:=by exact Finset.sum_nonneg fun i _ => by split_ifs <;> first | exact hg i | rfl theorem phaseTotal_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) : phaseTotal h4 g 0 + phaseTotal h4 g 1 + phaseTotal h4 g 2 + phaseTotal h4 g 3 = mass g:=by have h:=sum_colourTotal (ZMod.castHom h4 (ZMod 4)) g rw [sum_phase] at h exact h noncomputable def balanceWeight (S:ℚ) (p:Phase):ℝ:=if parity p = 0 then 1 else -(S:ℝ) theorem balanceWeight_sum {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (g:ZMod q → ℝ) : massWeighted h4 g (balanceWeight S) = phaseTotal h4 g 0 + phaseTotal h4 g 2 - (S:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3):=by rw [massWeighted_phaseTotal,sum_phase] norm_num [balanceWeight,parity,ZMod.val_ofNat,ZMod.val_one_eq_one_mod] ring private def zz91:"s005b"="s005b":=by decide+kernel theorem symmetric_product_sum {ι:Type*} [Fintype ι] (a b:ι → ℝ) : (∑ i, ∑ j,(a i * b j + a j * b i) / 2) = (∑ i,a i) * ∑ j,b j:=by rw [sum_swap_average,outer_product_sum] theorem rowAggregate_balance {q:ℕ} [NeZero q] (S s:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (r:Phase) : rowAggregate S h4 h3 g (.balance r s) = (s:ℝ) * phaseTotal h4 g r * (phaseTotal h4 g 0 + phaseTotal h4 g 2 - (S:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)):=by let a (i:ZMod q):ℝ:=if ZMod.castHom h4 (ZMod 4) i = r then g i else 0 let b (i:ZMod q):ℝ:=balanceWeight S (ZMod.castHom h4 (ZMod 4) i) * g i have hp (j k:ZMod q):rowValue S h4 h3 g (.balance r s) j k = (s:ℝ) * ((a j * b k + a k * b j) / 2):=by simp only [rowValue,rowQuad,rowPair] rw [pairProduct_eval] simp only [expressionEval,List.map_nil,List.sum_nil,zero_add, pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] dsimp only [a,b,balanceWeight] simp only [apply_ite] split_ifs <;> push_cast <;> ring unfold rowAggregate simp_rw [hp] simp only [← Finset.mul_sum,symmetric_product_sum] have ha:(∑ i,a i) = phaseTotal h4 g r:=rfl have hb:(∑ i,b i) = massWeighted h4 g (balanceWeight S):=rfl rw [ha,hb,balanceWeight_sum] ring theorem rowAggregate_normalization {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ):rowAggregate S h4 h3 g .normalization = mass g ^ 2:=by unfold rowAggregate simp only [rowValue,rowQuad,rowPair] simp only [expressionEval,List.map_nil,List.sum_nil,zero_add] change (∑ j, ∑ k,expressionEval (pairProduct 1) (pairPoint g j k)) = mass g ^ 2 rw [pairProduct_sum] norm_num theorem rowAggregate_massSquare {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (v:Phase → ℚ) : rowAggregate S h4 h3 g (.massSquare false v) = -massWeighted h4 g (fun p => (v p:ℝ)) ^ 2:=by have hp (j k:ZMod q):rowValue S h4 h3 g (.massSquare false v) j k = -(((v (ZMod.castHom h4 (ZMod 4) j):ℚ):ℝ) * g j * (((v (ZMod.castHom h4 (ZMod 4) k):ℚ):ℝ) * g k)):=by simp only [rowValue,rowQuad,rowPair,Bool.false_eq_true,if_false] rw [pairProduct_eval] simp only [expressionEval,List.map_nil,List.sum_nil,zero_add, pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] push_cast ring unfold rowAggregate simp_rw [hp] simp only [Finset.sum_neg_distrib,outer_product_sum] unfold massWeighted ring noncomputable def parityWeight (r:Fin 2) (p:Phase):ℝ:=if parity p = r then 1 else 0 noncomputable def orderedWeight (r:Fin 2) (p:Phase):ℝ := if parity p = r then (if p.val < 2 then -1 else 1) else 0 private def zz92:"s005c"="s005c":=by decide+kernel theorem parityWeight_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (r:Fin 2) : massWeighted h4 g (parityWeight r) = phaseTotal h4 g (r.val:Phase) + phaseTotal h4 g ((r.val:Phase) + 2):=by rw [massWeighted_phaseTotal,sum_phase] fin_cases r <;> norm_num [parityWeight,parity,ZMod.val_ofNat,ZMod.val_one_eq_one_mod] theorem orderedWeight_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (r:Fin 2) : massWeighted h4 g (orderedWeight r) = phaseTotal h4 g ((r.val:Phase) + 2) - phaseTotal h4 g (r.val:Phase):=by rw [massWeighted_phaseTotal,sum_phase] fin_cases r <;> norm_num [orderedWeight,parity,ZMod.val_ofNat,ZMod.val_one_eq_one_mod] <;> ring theorem rowPair_ordered_eval (S:ℚ) (r:Fin 2) (p q:Phase) (same:Bool) (x:Point) : expressionEval (rowPair S (.ordered r) p q same) x = ((orderedWeight r p * x 0) * (parityWeight r q * x 1) + (orderedWeight r q * x 1) * (parityWeight r p * x 0)) / 2:=by fin_cases r <;> fin_cases p <;> fin_cases q all_goals norm_num [rowPair,parity,orderedWeight,parityWeight,pairProduct,ZMod.val,expressionEval,atomEval,coordinate_eval] <;> ring theorem rowAggregate_ordered {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (r:Fin 2) : rowAggregate S h4 h3 g (.ordered r) = (phaseTotal h4 g ((r.val:Phase) + 2) - phaseTotal h4 g (r.val:Phase)) * (phaseTotal h4 g (r.val:Phase) + phaseTotal h4 g ((r.val:Phase) + 2)):=by let a (i:ZMod q):ℝ:=orderedWeight r (ZMod.castHom h4 (ZMod 4) i) * g i let b (i:ZMod q):ℝ:=parityWeight r (ZMod.castHom h4 (ZMod 4) i) * g i have hp (j k:ZMod q):rowValue S h4 h3 g (.ordered r) j k = (a j * b k + a k * b j) / 2:=by simp only [rowValue,rowQuad] rw [rowPair_ordered_eval] simp only [expressionEval,List.map_nil,List.sum_nil,zero_add, pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] rfl unfold rowAggregate simp_rw [hp] rw [symmetric_product_sum] have ha:(∑ i,a i) = massWeighted h4 g (orderedWeight r):=rfl have hb:(∑ i,b i) = massWeighted h4 g (parityWeight r):=rfl rw [ha,hb,orderedWeight_sum,parityWeight_sum] private def zz93:"s005d"="s005d":=by decide+kernel theorem rowAggregate_ordered_nonpos {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (r:Fin 2) (hr:phaseTotal h4 g ((r.val:Phase) + 2) ≤ phaseTotal h4 g (r.val:Phase)) : rowAggregate S h4 h3 g (.ordered r) ≤ 0:=by rw [rowAggregate_ordered] exact mul_nonpos_of_nonpos_of_nonneg (sub_nonpos.mpr hr) (add_nonneg (phaseTotal_nonneg h4 g hg _) (phaseTotal_nonneg h4 g hg _)) theorem rowAggregate_massSquare_nonpos {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (v:Phase → ℚ):rowAggregate S h4 h3 g (.massSquare false v) ≤ 0:=by rw [rowAggregate_massSquare] exact neg_nonpos.mpr (sq_nonneg _) end Green24Proof.PhaseMassRows private def zz2011:"s07db"="s07db":=by decide+kernel end section namespace Green24Proof.ParityPhaseAggregation open QuadraticCertificates ExpressionCertificates ParityPhaseRows ParityPhaseSemantics open FullPhaseRows (scale area pairProduct rhoExpression expressionEval_append expressionEval_scale) open FullPhaseSemantics (quadPoint pairPoint sameColour pairProduct_eval rhoExpression_eval) open FullPhaseAggregation (area_sum) open PhaseMassRows (weighted_colourTotal symmetric_product_sum) noncomputable def weightedAggregate {q:ℕ} [NeZero q] (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Potential)):ℝ := (rows.map fun t => (t.1:ℝ) * (∑ j, ∑ k,potentialRow h2 h3 g t.2 j k)).sum theorem weightedRows_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Potential)) : (∑ j:ZMod q, ∑ k:ZMod q,( expressionEval (weightedQuad rows (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (weightedPair rows (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (pairPoint g j k))) = weightedAggregate h2 h3 g rows:=by induction rows with | nil => simp [weightedQuad,weightedPair,expressionEval,weightedAggregate] | cons t ts ih => simp only [weightedQuad,weightedPair,List.flatMap_cons,expressionEval_append, expressionEval_scale] at * have hdistrib (j k:ZMod q) : (t.1:ℝ) * expressionEval (potentialQuad t.2 (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval ((ts.flatMap fun t => scale t.1 (potentialQuad t.2 (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)))) (quadPoint g j k) + ((t.1:ℝ) * expressionEval (potentialPair t.2 (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (pairPoint g j k) + expressionEval ((ts.flatMap fun t => scale t.1 (potentialPair t.2 (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)))) (pairPoint g j k)) = (t.1:ℝ) * potentialRow h2 h3 g t.2 j k + (expressionEval (weightedQuad ts (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (weightedPair ts (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (pairPoint g j k)):=by unfold potentialRow weightedQuad weightedPair ring simp_rw [hdistrib] simp only [Finset.sum_add_distrib] at ih simp only [Finset.sum_add_distrib, ← Finset.mul_sum,weightedQuad,weightedPair] rw [ih] rfl def rowsAdmissible (rows:List (ℚ × Potential)):Bool:=rows.all fun t => admissible t.2 theorem weightedAggregate_zero {q:ℕ} [NeZero q] (h2:2 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Potential)) (hr:rowsAdmissible rows = true):weightedAggregate h2 h3 g rows = 0:=by induction rows with | nil => rfl | cons t ts ih => simp only [rowsAdmissible,List.all_cons,Bool.and_eq_true] at hr simp only [weightedAggregate,List.map_cons,List.sum_cons] rw [potentialRow_sum h2 h3 h5 g t.2 hr.1,mul_zero,zero_add] exact ih hr.2 private def zz94:"s005e"="s005e":=by decide+kernel theorem weighted_classMass {ι:Type*} [Fintype ι] (χ:ι → ZMod 2) (g:ι → ℝ) (w:ZMod 2 → ℝ) : (∑ i,w (χ i) * g i) = w 0 * classMass χ g 0 + w 1 * classMass χ g 1:=by rw [weighted_colourTotal,sum_zmod_two] rfl theorem balance_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (g:ZMod q → ℝ) (μ:Phase → ℚ) : (∑ j:ZMod q, ∑ k:ZMod q,expressionEval (pairProduct (balanceCoefficient μ (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k))) (pairPoint g j k)) = ((μ 0:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 0 + (μ 1:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 1) * (classMass (ZMod.castHom h2 (ZMod 2)) g 0 - classMass (ZMod.castHom h2 (ZMod 2)) g 1):=by let a (i:ZMod q):ℝ:=(μ (ZMod.castHom h2 (ZMod 2) i):ℝ) * g i let b (i:ZMod q):ℝ:=(if ZMod.castHom h2 (ZMod 2) i = 0 then 1 else -1) * g i have hp (j k:ZMod q):expressionEval (pairProduct (balanceCoefficient μ (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k))) (pairPoint g j k) = (a j * b k + a k * b j) / 2:=by rw [pairProduct_eval] simp only [balanceCoefficient,pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one, Rat.cast_div,Rat.cast_add,Rat.cast_mul,Rat.cast_ofNat,apply_ite] dsimp only [a,b] split_ifs <;> push_cast <;> ring simp_rw [hp] rw [symmetric_product_sum] have ha:(∑ i,a i) = (μ 0:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 0 + (μ 1:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 1:=weighted_classMass (ZMod.castHom h2 (ZMod 2)) g (fun r => (μ r:ℝ)) have hb:(∑ i,b i) = classMass (ZMod.castHom h2 (ZMod 2)) g 0 - classMass (ZMod.castHom h2 (ZMod 2)) g 1:=by dsimp only [b] simpa [sub_eq_add_neg] using (weighted_classMass (ZMod.castHom h2 (ZMod 2)) g (fun r => if r = 0 then (1:ℝ) else -1)) rw [ha,hb] theorem selected_product_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (g:ZMod q → ℝ) : (∑ j:ZMod q, ∑ k:ZMod q,expressionEval (pairProduct (if ZMod.castHom h2 (ZMod 2) j = 0 ∧ ZMod.castHom h2 (ZMod 2) k = 0 then 32 else 0)) (pairPoint g j k)) = 32 * classMass (ZMod.castHom h2 (ZMod 2)) g 0 ^ 2:=by let a (i:ZMod q):=if ZMod.castHom h2 (ZMod 2) i = 0 then g i else 0 have hp (j k:ZMod q):expressionEval (pairProduct (if ZMod.castHom h2 (ZMod 2) j = 0 ∧ ZMod.castHom h2 (ZMod 2) k = 0 then 32 else 0)) (pairPoint g j k) = 32 * (a j * a k):=by by_cases hj:ZMod.castHom h2 (ZMod 2) j = 0 <;> by_cases hk:ZMod.castHom h2 (ZMod 2) k = 0 all_goals simp only [pairProduct_eval,pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one, a,hj,hk,and_self,false_and,and_false,if_true,if_false] norm_num <;> ring simp_rw [hp] simp only [← Finset.mul_sum, ← Finset.sum_mul] have ha:(∑ i,a i) = classMass (ZMod.castHom h2 (ZMod 2)) g 0:=by simp only [a,classMass,eq_comm] rw [ha] ring theorem rho_sum {q:ℕ} [NeZero q] (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (∑ j, ∑ k,expressionEval rhoExpression (pairPoint g j k)) = 2 * energy g:=by have hp (j k:ZMod q):expressionEval rhoExpression (pairPoint g j k) = rho (g j) (g k) := rhoExpression_eval (pairPoint g j k) (hg j) (hg k) simp_rw [hp] simp only [energy] ring private def zz95:"s005f"="s005f":=by decide+kernel theorem product_add (a b:ℚ) (x:Point) : expressionEval (pairProduct (a + b)) x = expressionEval (pairProduct a) x + expressionEval (pairProduct b) x:=by simp only [pairProduct_eval,Rat.cast_add] ring theorem local_slacks_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (rows:List (ℚ × Potential)) (μ:Phase → ℚ) (lam:ℚ) : (∑ j:ZMod q, ∑ k:ZMod q,( expressionEval (quadSlack rows (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack rows μ lam (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (pairPoint g j k))) = weightedAggregate h2 h3 g rows - 4 * profileFunctional g - 4 * (lam:ℝ) * energy g + 32 * classMass (ZMod.castHom h2 (ZMod 2)) g 0 ^ 2 + ((μ 0:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 0 + (μ 1:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 1) * (classMass (ZMod.castHom h2 (ZMod 2)) g 0 - classMass (ZMod.castHom h2 (ZMod 2)) g 1):=by have hw:=weightedRows_sum h2 h3 g rows simp only [Finset.sum_add_distrib] at hw simp only [quadSlack,pairSlack,expressionEval_append,expressionEval_scale,product_add] simp only [Finset.sum_add_distrib, ← Finset.mul_sum,area_sum,selected_product_sum, balance_sum,rho_sum g hg] rw [← hw] push_cast ring end Green24Proof.ParityPhaseAggregation private def zz2012:"s07dc"="s07dc":=by decide+kernel end section namespace Green24Proof.ChildRows open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseAggregation PhaseMassRows theorem phase_parity_even {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (i:ZMod m) : parity (ZMod.castHom h4 (ZMod 4) (parityEquiv m (0,i))) = (0:Fin 2):=by have h:=parity_cast h4 (dvd_mul_right 2 m) (parityEquiv m (0,i)) rw [parityCast_apply] at h exact h theorem phase_parity_odd {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (i:ZMod m) : parity (ZMod.castHom h4 (ZMod 4) (parityEquiv m (1,i))) = (1:Fin 2):=by have h:=parity_cast h4 (dvd_mul_right 2 m) (parityEquiv m (1,i)) rw [parityCast_apply] at h exact h private def zz96:"s0060"="s0060":=by decide+kernel theorem sum_parity_pairs {m:ℕ} [NeZero m] (f:ZMod (2 * m) → ZMod (2 * m) → ℝ) : (∑ j, ∑ k,f j k) = (∑ j:ZMod m, ∑ k:ZMod m,f (parityEquiv m (0,j)) (parityEquiv m (0,k))) + (∑ j:ZMod m, ∑ k:ZMod m,f (parityEquiv m (0,j)) (parityEquiv m (1,k))) + (∑ j:ZMod m, ∑ k:ZMod m,f (parityEquiv m (1,j)) (parityEquiv m (0,k))) + (∑ j:ZMod m, ∑ k:ZMod m,f (parityEquiv m (1,j)) (parityEquiv m (1,k))):=by have hk (j:ZMod (2 * m)):(∑ k,f j k) = ∑ r:ZMod 2, ∑ k:ZMod m,f j (parityEquiv m (r,k)):=by rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type] simp_rw [hk] rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type] simp only [sum_zmod_two,Finset.sum_add_distrib] ring theorem child_value_even {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (u v:ZMod m → ℝ) (j k:ZMod m) : rowValue S h4 h3 (interleave u v) (.child 0) (parityEquiv m (0,j)) (parityEquiv m (0,k)) = expressionEval area (quadPoint u j k) + expressionEval (pairProduct (-8)) (pairPoint u j k):=by simp only [rowValue,rowQuad,rowPair,phase_parity_even,and_self,if_true] rw [area_eval,area_eval,pairProduct_eval,pairProduct_eval] simp [quadPoint,pairPoint,Matrix.cons_val_two,Matrix.cons_val_three,parityEquiv_affine, interleave_even,ZMod.val_zero] theorem child_value_odd {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (u v:ZMod m → ℝ) (j k:ZMod m) : rowValue S h4 h3 (interleave u v) (.child 1) (parityEquiv m (1,j)) (parityEquiv m (1,k)) = expressionEval area (quadPoint v j k) + expressionEval (pairProduct (-8)) (pairPoint v j k):=by simp only [rowValue,rowQuad,rowPair,phase_parity_odd,and_self,if_true] rw [area_eval,area_eval,pairProduct_eval,pairProduct_eval] simp [quadPoint,pairPoint,Matrix.cons_val_two,Matrix.cons_val_three,parityEquiv_affine, interleave_odd] theorem child_value_off {q:ℕ} (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (r:Fin 2) (j k:ZMod q) (h:¬(parity (ZMod.castHom h4 (ZMod 4) j) = r ∧ parity (ZMod.castHom h4 (ZMod 4) k) = r)) : rowValue S h4 h3 g (.child r) j k = 0:=by simp only [rowValue,rowQuad,rowPair,if_neg h,expressionEval,List.map_nil,List.sum_nil,add_zero] private def zz97:"s0061"="s0061":=by decide+kernel theorem rowAggregate_child_even {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (u v:ZMod m → ℝ):rowAggregate S h4 h3 (interleave u v) (.child 0) = -4 * deficit u:=by unfold rowAggregate rw [sum_parity_pairs] simp only [child_value_even] have hoff (j k:ZMod (2 * m)) (h:parity (ZMod.castHom h4 (ZMod 4) j) ≠ 0 ∨ parity (ZMod.castHom h4 (ZMod 4) k) ≠ 0) : rowValue S h4 h3 (interleave u v) (.child 0) j k = 0:=by have hn:¬(parity (ZMod.castHom h4 (ZMod 4) j) = 0 ∧ parity (ZMod.castHom h4 (ZMod 4) k) = 0):=by tauto simp only [rowValue,rowQuad,rowPair,if_neg hn,expressionEval,List.map_nil,List.sum_nil,add_zero] have h01 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.child 0) (parityEquiv m (0,j)) (parityEquiv m (1,k)) = 0 := hoff _ _ (Or.inr (by rw [phase_parity_odd]; decide)) have h10 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.child 0) (parityEquiv m (1,j)) (parityEquiv m (0,k)) = 0 := hoff _ _ (Or.inl (by rw [phase_parity_odd]; decide)) have h11 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.child 0) (parityEquiv m (1,j)) (parityEquiv m (1,k)) = 0 := hoff _ _ (Or.inl (by rw [phase_parity_odd]; decide)) simp only [h01,h10,h11,Finset.sum_const_zero,add_zero,Finset.sum_add_distrib, area_sum,pairProduct_sum] unfold deficit norm_num ring theorem rowAggregate_child_odd {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (u v:ZMod m → ℝ):rowAggregate S h4 h3 (interleave u v) (.child 1) = -4 * deficit v:=by unfold rowAggregate rw [sum_parity_pairs] simp only [child_value_odd] have h00 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.child 1) (parityEquiv m (0,j)) (parityEquiv m (0,k)) = 0 := child_value_off S h4 h3 (interleave u v) 1 _ _ (by rw [phase_parity_even,phase_parity_even]; decide) have h01 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.child 1) (parityEquiv m (0,j)) (parityEquiv m (1,k)) = 0 := child_value_off S h4 h3 (interleave u v) 1 _ _ (by rw [phase_parity_even,phase_parity_odd]; decide) have h10 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.child 1) (parityEquiv m (1,j)) (parityEquiv m (0,k)) = 0 := child_value_off S h4 h3 (interleave u v) 1 _ _ (by rw [phase_parity_odd,phase_parity_even]; decide) simp only [h00,h01,h10,Finset.sum_const_zero,zero_add,Finset.sum_add_distrib, area_sum,pairProduct_sum] unfold deficit norm_num ring end Green24Proof.ChildRows private def zz2013:"s07dd"="s07dd":=by decide+kernel end section namespace Green24Proof.ParityCorrectionAggregation open QuadraticCertificates ExpressionCertificates open ParityPhaseRows (Phase Potential weightedQuad weightedPair) open FullPhaseRows (area pairProduct scale expressionEval_append expressionEval_scale area_eval) open FullPhaseSemantics (quadPoint pairPoint sameColour pairProduct_eval) open FullPhaseAggregation (area_sum pairProduct_sum) open ParityPhaseAggregation (weighted_classMass weightedRows_sum weightedAggregate) open ParityCorrectionRows theorem weighted_pair_classMass {ι:Type*} [Fintype ι] (χ:ι → ZMod 2) (g:ι → ℝ) (w:ZMod 2 → ZMod 2 → ℝ) : (∑ j, ∑ k,w (χ j) (χ k) * g j * g k) = (w 0 0 * classMass χ g 0 + w 1 0 * classMass χ g 1) * classMass χ g 0 + (w 0 1 * classMass χ g 0 + w 1 1 * classMass χ g 1) * classMass χ g 1:=by have hinner (j:ι):(∑ k,w (χ j) (χ k) * g j * g k) = (w (χ j) 0 * g j) * classMass χ g 0 + (w (χ j) 1 * g j) * classMass χ g 1:=by have h:=weighted_classMass χ g (w (χ j)) have he:(∑ k,w (χ j) (χ k) * g j * g k) = g j * ∑ k,w (χ j) (χ k) * g k:=by rw [Finset.mul_sum] congr 1 funext k ring rw [he,h] ring simp_rw [hinner] simp only [Finset.sum_add_distrib, ← Finset.sum_mul] rw [weighted_classMass χ g (fun p => w p 0),weighted_classMass χ g (fun p => w p 1)] theorem balance_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (g:ZMod q → ℝ) (r:ℚ) (μ:Phase → ℚ) : (∑ j:ZMod q, ∑ k:ZMod q,expressionEval (pairProduct (balanceCoefficient r μ (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k))) (pairPoint g j k)) = ((μ 0:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 0 + (μ 1:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 1) * ((r:ℝ) * classMass (ZMod.castHom h2 (ZMod 2)) g 0 - classMass (ZMod.castHom h2 (ZMod 2)) g 1):=by simp only [pairProduct_eval,pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] rw [weighted_pair_classMass (ZMod.castHom h2 (ZMod 2)) g (fun p q => (balanceCoefficient r μ p q:ℝ))] norm_num [balanceCoefficient] ring private def zz98:"s0062"="s0062":=by decide+kernel theorem cross_product_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (g:ZMod q → ℝ) : (∑ j:ZMod q, ∑ k:ZMod q,expressionEval (pairProduct (if ZMod.castHom h2 (ZMod 2) j ≠ ZMod.castHom h2 (ZMod 2) k then 16 else 0)) (pairPoint g j k)) = 32 * classMass (ZMod.castHom h2 (ZMod 2)) g 0 * classMass (ZMod.castHom h2 (ZMod 2)) g 1:=by simp only [pairProduct_eval,pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] rw [weighted_pair_classMass (ZMod.castHom h2 (ZMod 2)) g (fun p q => ((if p ≠ q then 16 else 0:ℚ):ℝ))] norm_num ring theorem classMass_interleave_zero {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : classMass (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2)) (interleave u v) 0 = mass u:=by unfold classMass rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type,sum_zmod_two] simp only [parityCast_apply,interleave_even,interleave_odd] norm_num rfl theorem classMass_interleave_one {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : classMass (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2)) (interleave u v) 1 = mass v:=by have h:=classMass_sum (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2)) (interleave u v) rw [classMass_interleave_zero,mass_interleave] at h linarith theorem selected_area_sum {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : (∑ j:ZMod (2 * m), ∑ k:ZMod (2 * m), if ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j = 0 ∧ ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k = 0 then expressionEval area (quadPoint (interleave u v) j k) else 0) = 4 * profileFunctional u:=by rw [ChildRows.sum_parity_pairs] simp only [parityCast_apply] norm_num have hp (j k:ZMod m) : expressionEval area (quadPoint (interleave u v) (parityEquiv m (0,j)) (parityEquiv m (0,k))) = expressionEval area (quadPoint u j k):=by rw [area_eval,area_eval] simp [quadPoint,Matrix.cons_val_two,Matrix.cons_val_three,parityEquiv_affine,interleave_even] simp_rw [hp] exact area_sum u private def zz99:"s0063"="s0063":=by decide+kernel theorem weighted_area_sum {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (r:ℚ) : (∑ j:ZMod (2 * m), ∑ k:ZMod (2 * m),expressionEval (scale (areaWeight r (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k)) area) (quadPoint (interleave u v) j k)) = 4 * profileFunctional (interleave u v) - 4 * (1 - (r:ℝ)) ^ 2 * profileFunctional u:=by have hp (p q:Phase) (x:Point):expressionEval (scale (areaWeight r p q) area) x = expressionEval area x - (1 - (r:ℝ)) ^ 2 * (if p = 0 ∧ q = 0 then expressionEval area x else 0):=by rw [expressionEval_scale] unfold areaWeight split_ifs <;> push_cast <;> ring simp_rw [hp] simp only [Finset.sum_sub_distrib, ← Finset.mul_sum,area_sum,selected_area_sum] ring theorem quadSlack_eval (rows:List (ℚ × Potential)) (r:ℚ) (p q:Phase) (same:Bool) (x:Point) : expressionEval (quadSlack rows r p q same) x = expressionEval (weightedQuad rows p q same) x - expressionEval (scale (areaWeight r p q) area) x:=by simp only [quadSlack,expressionEval_append,expressionEval_scale,Rat.cast_neg] ring theorem local_slacks_sum {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (u v:ZMod m → ℝ) (rows:List (ℚ × Potential)) (r:ℚ) (μ:Phase → ℚ) (normalization:ℚ) : (∑ j:ZMod (2 * m), ∑ k:ZMod (2 * m),( expressionEval (quadSlack rows r (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (quadPoint (interleave u v) j k) + expressionEval (pairSlack rows r μ normalization (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (pairPoint (interleave u v) j k))) = weightedAggregate (dvd_mul_right 2 m) h3 (interleave u v) rows - 4 * profileFunctional (interleave u v) + 4 * (1 - (r:ℝ)) ^ 2 * profileFunctional u + (normalization:ℝ) * (mass u + mass v) ^ 2 + 32 * mass u * mass v + ((μ 0:ℝ) * mass u + (μ 1:ℝ) * mass v) * ((r:ℝ) * mass u - mass v):=by have hw:=weightedRows_sum (dvd_mul_right 2 m) h3 (interleave u v) rows simp only [Finset.sum_add_distrib] at hw simp only [quadSlack_eval,pairSlack,expressionEval_append,ParityPhaseAggregation.product_add] simp only [Finset.sum_add_distrib,Finset.sum_sub_distrib,weighted_area_sum, balance_sum,cross_product_sum,pairProduct_sum,classMass_interleave_zero, classMass_interleave_one,mass_interleave] rw [← hw] ring theorem correction_of_local_rows {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (rows:List (ℚ × Potential)) (r:ℚ) (μ:Phase → ℚ) (normalization:ℚ) (hadmissible:ParityPhaseAggregation.rowsAdmissible rows = true) (hquad:∀ p q same x,(∀ i,0 ≤ x i) → 0 ≤ expressionEval (quadSlack rows r p q same) x) (hpair:∀ p q same x,(∀ i,0 ≤ x i) → 0 ≤ expressionEval (pairSlack rows r μ normalization p q same) x) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (1 - (r:ℝ)) ^ 2 * deficit u + ((r:ℝ) * mass u - mass v) * ((4 - 2 * (r:ℝ) - (μ 0:ℝ) / 4) * mass u + (-2 - (μ 1:ℝ) / 4) * mass v) - (normalization:ℝ) / 4 * (mass u + mass v) ^ 2 ≤ deficit (interleave u v):=by have hg:=interleave_nonneg u v hu hv have hl (j k:ZMod (2 * m)):0 ≤ expressionEval (quadSlack rows r (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (quadPoint (interleave u v) j k) + expressionEval (pairSlack rows r μ normalization (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (pairPoint (interleave u v) j k) := add_nonneg (hquad _ _ _ _ (FullPhaseAggregation.quadPoint_nonneg _ hg j k)) (hpair _ _ _ _ (FullPhaseAggregation.pairPoint_nonneg _ hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum, ParityPhaseAggregation.weightedAggregate_zero (dvd_mul_right 2 m) h3 h5 _ rows hadmissible] at hs unfold deficit rw [mass_interleave] nlinarith only [hs] end Green24Proof.ParityCorrectionAggregation private def zz2014:"s07de"="s07de":=by decide+kernel end section namespace Green24Proof def NearBalanceHypothesis (U V du dg:ℝ):Prop := ∀ h:ℝ,0 ≤ h → h ≤ 1 / 10 → h ^ 2 * du + ((1 - h) * U - V) * (-(1 + h) * U + (1 + 3 * h / 2) * V) - (3 / 0xfa) * h ^ 2 * (U + V) ^ 2 ≤ dg private def zz100:"s0064"="s0064":=by decide+kernel theorem near_balance_product_identity {U V h:ℝ} (hV:V = (1 - 3 * h / 4) * U) : ((1 - h) * U - V) * (-(1 + h) * U + (1 + 3 * h / 2) * V) = (h ^ 2 / 16 + 9 * h ^ 3 / 32) * U ^ 2:=by rw [hV] ring theorem near_balance_gain {U V h:ℝ} (hU:0 ≤ U) (hV0:0 ≤ V) (hVU:V ≤ U) (hh:0 ≤ h) (hV:V = (1 - 3 * h / 4) * U) : (29 / 0x7d0) * h ^ 2 * U ^ 2 ≤ ((1 - h) * U - V) * (-(1 + h) * U + (1 + 3 * h / 2) * V) - (3 / 0xfa) * h ^ 2 * (U + V) ^ 2:=by rw [near_balance_product_identity hV] have hsq:(U + V) ^ 2 ≤ 4 * U ^ 2:=by nlinarith [mul_nonneg (sub_nonneg.mpr hVU) (by linarith:0 ≤ 3 * U + V)] have hscaled:=mul_le_mul_of_nonneg_left hsq (sq_nonneg h) have hcubic:0 ≤ h ^ 3 * U ^ 2:=mul_nonneg (pow_nonneg hh 3) (sq_nonneg U) nlinarith theorem near_balance_descent {U V du dg:ℝ} (hV:0 < V) (hVU:V ≤ U) (hratio:U ≤ (40 / 37) * V) (hc:NearBalanceHypothesis U V du dg) : (16 * (U - V) ^ 2 / (9 * U ^ 2)) * du + (29 / 0x465) * (U - V) ^ 2 ≤ dg:=by have hU:0 < U:=hV.trans_le hVU let h:ℝ:=4 * (U - V) / (3 * U) have hh0:0 ≤ h:=div_nonneg (mul_nonneg (by norm_num) (sub_nonneg.mpr hVU)) (by positivity) have hh1:h ≤ 1 / 10:=by dsimp [h] apply (div_le_iff₀ (by positivity:0 < 3 * U)).mpr linarith have hhU:h * U = (4 / 3) * (U - V):=by dsimp [h] field_simp have hrel:V = (1 - 3 * h / 4) * U:=by nlinarith [hhU] have hgain:=near_balance_gain hU.le hV.le hVU hh0 hrel have hcert:=hc h hh0 hh1 have hcoef:h ^ 2 = 16 * (U - V) ^ 2 / (9 * U ^ 2):=by dsimp [h] ring have hmargin:(29 / 0x7d0) * h ^ 2 * U ^ 2 = (29 / 0x465) * (U - V) ^ 2:=by dsimp [h] field_simp ring have hlower:h ^ 2 * du + (29 / 0x7d0) * h ^ 2 * U ^ 2 ≤ dg:=by linarith rw [hmargin,hcoef] at hlower exact hlower theorem near_balance_nonneg {U V du dg:ℝ} (hV:0 ≤ V) (hVU:V ≤ U) (hratio:U ≤ (40 / 37) * V) (hdu:0 ≤ du) (hc:NearBalanceHypothesis U V du dg) : 0 ≤ dg:=by rcases hV.eq_or_lt with hzero | hpos · have hU:U = 0:=by linarith have h:=hc 0 (by norm_num) (by norm_num) simpa [hU, ← hzero] using h · have h:=near_balance_descent hpos hVU hratio hc have hcoef:0 ≤ (16 * (U - V) ^ 2 / (9 * U ^ 2)) * du:=by positivity nlinarith [sq_nonneg (U - V)] private def zz101:"s0065"="s0065":=by decide+kernel theorem profile_near_balance_nonneg {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hv:∀ i,0 ≤ v i) (horder:mass v ≤ mass u) (hratio:mass u ≤ (40 / 37) * mass v) (hdu:0 ≤ deficit u) (hc:NearBalanceHypothesis (mass u) (mass v) (deficit u) (deficit (interleave u v))) : 0 ≤ deficit (interleave u v) := near_balance_nonneg (mass_nonneg hv) horder hratio hdu hc end Green24Proof end section namespace Green24Proof.NearBalanceParameterRows open QuadraticCertificates ExpressionCertificates open ParityPhaseRows (Phase Potential weightedQuad weightedPair) open FullPhaseRows (area pairProduct scale expressionEval_append expressionEval_scale) open FullPhaseSemantics (quadPoint pairPoint sameColour pairProduct_eval) open FullPhaseSymmetry (reversePoint swapPair area_reverse) open ParityPhaseSymmetry (weightedQuad_reverse weightedPair_swap) abbrev Degree:=Fin 3 abbrev Rows:=Degree → List (ℚ × Potential) def areaConstant (d:Degree):ℚ:=if d = 0 then -1 else 0 def areaSelected (d:Degree):ℚ:=if d = 2 then 1 / 0x64 else 0 def pairEven (d:Degree):ℚ:=if d = 0 then 12 else if d = 1 then 0 else -0x2eb / 0x186a def pairOdd (d:Degree):ℚ:=if d = 0 then 12 else if d = 1 then 3 / 5 else 3 / 0x186a def pairMixed (d:Degree):ℚ:=if d = 0 then 4 else if d = 1 then -3 / 10 else 0x17d / 0x30d4 def pairCoefficient (d:Degree) (p q:Phase):ℚ := if p = 0 ∧ q = 0 then pairEven d else if p = 1 ∧ q = 1 then pairOdd d else pairMixed d def quadComponent (rows:Rows) (d:Degree) (p q:Phase) (same:Bool):Expression := weightedQuad (rows d) p q same ++ scale (areaConstant d + if p = 0 ∧ q = 0 then areaSelected d else 0) area def pairComponent (rows:Rows) (d:Degree) (p q:Phase) (same:Bool):Expression := weightedPair (rows d) p q same ++ pairProduct (pairCoefficient d p q) noncomputable def parameterEval (e:Degree → Expression) (t:ℝ) (x:Point):ℝ := expressionEval (e 0) x + t * expressionEval (e 1) x + t ^ 2 * expressionEval (e 2) x theorem quadComponent_reverse (rows:Rows) (d:Degree) (p q:Phase) (same:Bool) (x:Point) : expressionEval (quadComponent rows d q p same) (reversePoint x) = expressionEval (quadComponent rows d p q same) x:=by simp only [quadComponent,expressionEval_append,expressionEval_scale, weightedQuad_reverse,area_reverse,and_comm] theorem pairComponent_swap (rows:Rows) (d:Degree) (p q:Phase) (same:Bool) (x:Point) : expressionEval (pairComponent rows d q p same) (swapPair x) = expressionEval (pairComponent rows d p q same) x:=by simp only [pairComponent,expressionEval_append] rw [weightedPair_swap] simp only [pairProduct_eval,pairCoefficient,and_comm, swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] ring theorem parameterQuad_reverse (rows:Rows) (p q:Phase) (same:Bool) (t:ℝ) (x:Point) : parameterEval (fun d => quadComponent rows d q p same) t (reversePoint x) = parameterEval (fun d => quadComponent rows d p q same) t x:=by simp only [parameterEval,quadComponent_reverse] private def zz102:"s0066"="s0066":=by decide+kernel theorem parameterPair_swap (rows:Rows) (p q:Phase) (same:Bool) (t:ℝ) (x:Point) : parameterEval (fun d => pairComponent rows d q p same) t (swapPair x) = parameterEval (fun d => pairComponent rows d p q same) t x:=by simp only [parameterEval,pairComponent_swap] theorem area_part_sum {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (d:Degree) : (∑ j:ZMod (2 * m), ∑ k:ZMod (2 * m),expressionEval (scale (areaConstant d + if ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j = 0 ∧ ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k = 0 then areaSelected d else 0) area) (quadPoint (interleave u v) j k)) = 4 * (areaConstant d:ℝ) * profileFunctional (interleave u v) + 4 * (areaSelected d:ℝ) * profileFunctional u:=by have hp (p q:Phase) (x:Point) : expressionEval (scale (areaConstant d + if p = 0 ∧ q = 0 then areaSelected d else 0) area) x = (areaConstant d:ℝ) * expressionEval area x + (areaSelected d:ℝ) * (if p = 0 ∧ q = 0 then expressionEval area x else 0):=by rw [expressionEval_scale] split_ifs <;> push_cast <;> ring simp_rw [hp] simp only [Finset.sum_add_distrib, ← Finset.mul_sum,FullPhaseAggregation.area_sum, ParityCorrectionAggregation.selected_area_sum] ring theorem pair_part_sum {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (d:Degree) : (∑ j:ZMod (2 * m), ∑ k:ZMod (2 * m),expressionEval (pairProduct (pairCoefficient d (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k))) (pairPoint (interleave u v) j k)) = (pairEven d:ℝ) * mass u ^ 2 + 2 * (pairMixed d:ℝ) * mass u * mass v + (pairOdd d:ℝ) * mass v ^ 2:=by simp only [pairProduct_eval,pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] rw [ParityCorrectionAggregation.weighted_pair_classMass (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2)) (interleave u v) (fun p q => (pairCoefficient d p q:ℝ))] simp only [ParityCorrectionAggregation.classMass_interleave_zero, ParityCorrectionAggregation.classMass_interleave_one] norm_num [pairCoefficient] ring theorem component_sum {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (u v:ZMod m → ℝ) (rows:Rows) (d:Degree) : (∑ j:ZMod (2 * m), ∑ k:ZMod (2 * m),( expressionEval (quadComponent rows d (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (quadPoint (interleave u v) j k) + expressionEval (pairComponent rows d (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (pairPoint (interleave u v) j k))) = ParityPhaseAggregation.weightedAggregate (dvd_mul_right 2 m) h3 (interleave u v) (rows d) + 4 * (areaConstant d:ℝ) * profileFunctional (interleave u v) + 4 * (areaSelected d:ℝ) * profileFunctional u + (pairEven d:ℝ) * mass u ^ 2 + 2 * (pairMixed d:ℝ) * mass u * mass v + (pairOdd d:ℝ) * mass v ^ 2:=by have hw:=ParityPhaseAggregation.weightedRows_sum (dvd_mul_right 2 m) h3 (interleave u v) (rows d) simp only [Finset.sum_add_distrib] at hw simp only [quadComponent,pairComponent,expressionEval_append,Finset.sum_add_distrib, area_part_sum,pair_part_sum] rw [← hw] ring private def zz103:"s0067"="s0067":=by decide+kernel theorem parameter_bound_of_local_rows {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (rows:Rows) (hadmissible:∀ d,ParityPhaseAggregation.rowsAdmissible (rows d) = true) (hquad:∀ p q same t,0 ≤ t → t ≤ 1 → ∀ x,(∀ i,0 ≤ x i) → 0 ≤ parameterEval (fun d => quadComponent rows d p q same) t x) (hpair:∀ p q same t,0 ≤ t → t ≤ 1 → ∀ x,(∀ i,0 ≤ x i) → 0 ≤ parameterEval (fun d => pairComponent rows d p q same) t x) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : NearBalanceHypothesis (mass u) (mass v) (deficit u) (deficit (interleave u v)):=by intro h hh0 hh1 have ht0:0 ≤ 10 * h:=mul_nonneg (by norm_num) hh0 have ht1:10 * h ≤ 1:=by linarith have hg:=interleave_nonneg u v hu hv let X (j k:ZMod (2 * m)) (d:Degree) := expressionEval (quadComponent rows d (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (quadPoint (interleave u v) j k) let Y (j k:ZMod (2 * m)) (d:Degree) := expressionEval (pairComponent rows d (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (pairPoint (interleave u v) j k) have hp (j k:ZMod (2 * m)):0 ≤ (X j k 0 + Y j k 0) + (10 * h) * (X j k 1 + Y j k 1) + (10 * h) ^ 2 * (X j k 2 + Y j k 2):=by have ha:=hquad (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k) _ ht0 ht1 _ (FullPhaseAggregation.quadPoint_nonneg _ hg j k) have hb:=hpair (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k) _ ht0 ht1 _ (FullPhaseAggregation.pairPoint_nonneg _ hg j k) change 0 ≤ X j k 0 + (10 * h) * X j k 1 + (10 * h) ^ 2 * X j k 2 at ha change 0 ≤ Y j k 0 + (10 * h) * Y j k 1 + (10 * h) ^ 2 * Y j k 2 at hb linarith have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hp j k simp only [Finset.sum_add_distrib, ← Finset.mul_sum] at hs have hsum (d:Degree):(∑ j, ∑ k,(X j k d + Y j k d)) = 4 * (areaConstant d:ℝ) * profileFunctional (interleave u v) + 4 * (areaSelected d:ℝ) * profileFunctional u + (pairEven d:ℝ) * mass u ^ 2 + 2 * (pairMixed d:ℝ) * mass u * mass v + (pairOdd d:ℝ) * mass v ^ 2:=by dsimp only [X,Y] rw [component_sum,ParityPhaseAggregation.weightedAggregate_zero (dvd_mul_right 2 m) h3 h5 _ _ (hadmissible d),zero_add] simp only [Finset.sum_add_distrib] at hsum rw [hsum 0,hsum 1,hsum 2] at hs have h02:(0:Degree) ≠ 2:=by decide have h12:(1:Degree) ≠ 2:=by decide have h20:(2:Degree) ≠ 0:=by decide have h21:(2:Degree) ≠ 1:=by decide norm_num [areaConstant,areaSelected,pairEven,pairMixed,pairOdd,h02,h12,h20,h21] at hs unfold deficit rw [mass_interleave] nlinarith only [hs] end Green24Proof.NearBalanceParameterRows private def zz2015:"s07df"="s07df":=by decide+kernel end section namespace Green24Proof.NearBalancePairs theorem quadratic_nonnegative {A B C:ℝ} (hA:0 ≤ A) (hC:0 ≤ C) (hdet:0 ≤ A * C - B ^ 2) (x y:ℝ) : 0 ≤ A * x ^ 2 + 2 * B * x * y + C * y ^ 2:=by by_cases hz:A = 0 · have hB:B = 0:=by nlinarith [sq_nonneg B] simp only [hz,hB,zero_mul,mul_zero,zero_add] exact mul_nonneg hC (sq_nonneg y) · have hpos:0 < A:=lt_of_le_of_ne hA (Ne.symm hz) have h:0 ≤ A * (A * x ^ 2 + 2 * B * x * y + C * y ^ 2):=by calc _ = (A * x + B * y) ^ 2 + (A * C - B ^ 2) * y ^ 2:=by ring _ ≥ 0:=add_nonneg (sq_nonneg _) (mul_nonneg hdet (sq_nonneg y)) exact nonneg_of_mul_nonneg_right h hpos noncomputable def pair_6 (t x y:ℝ):ℝ := ((0:ℝ) * x ^ 2 + (0:ℝ) * x * y + (0:ℝ) * y ^ 2) + ((0:ℝ) * x ^ 2 + (0:ℝ) * x * y + (0:ℝ) * y ^ 2) * t + ((0:ℝ) * x ^ 2 + (3 / 0x2710:ℝ) * x * y + (0:ℝ) * y ^ 2) * t ^ 2 theorem pair_6_nonneg {t x y:ℝ} (_ht0:0 ≤ t) (_ht1:t ≤ 1) (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ pair_6 t x y:=by have hA:0 ≤ (0:ℝ):=by norm_num have hC:0 ≤ (0:ℝ):=by norm_num have hB:0 ≤ ((3 / 0x4e20:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hgram:0 ≤ (0:ℝ) * y ^ 2 + 2 * ((3 / 0x4e20:ℝ) * t ^ 2) * y * (x - (0:ℝ) * y) + (0:ℝ) * (x - (0:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_6 nlinarith only [hgram] noncomputable def pair_7 (t x y:ℝ):ℝ := ((0:ℝ) * x ^ 2 + (0:ℝ) * x * y + (0:ℝ) * y ^ 2) + ((-0x5d42cb / 0x1dcd6500:ℝ) * x ^ 2 + (0x5d42cb / 0x3b9aca00:ℝ) * x * y + (0:ℝ) * y ^ 2 + (-0x5d42cb / 0xee6b2800:ℝ) * max ((1:ℝ) * x + (-3:ℝ) * y) 0 ^ 2 + (0x5d42cb / 0xee6b2800:ℝ) * max ((3:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) * t + ((0x5d42cb / 0x1dcd6500:ℝ) * x ^ 2 + (-0x5b6e0b / 0x3b9aca00:ℝ) * x * y + (0:ℝ) * y ^ 2 + (0x5d42cb / 0xee6b2800:ℝ) * max ((1:ℝ) * x + (-3:ℝ) * y) 0 ^ 2 + (-0x5d42cb / 0xee6b2800:ℝ) * max ((3:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) * t ^ 2 theorem pair_7_nonneg {t x y:ℝ} (_ht0:0 ≤ t) (_ht1:t ≤ 1) (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ pair_7 t x y:=by by_cases h0:x ≤ (1 / 3:ℝ) * y · have hA:0 ≤ (0:ℝ):=by norm_num have hC:0 ≤ ((0x5d42cb / 0x218711a00:ℝ) * t + (-0x57c48b / 0x218711a00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x5d42cb / 0xaf8916:ℝ))] have hB:0 ≤ ((0x5d42cb / 0x165a0bc00:ℝ) * t + (-0x5b6e0b / 0x165a0bc00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x5d42cb / 0xb6dc16:ℝ))] have hgram:0 ≤ (0:ℝ) * ((1 / 3:ℝ) * y - x) ^ 2 + 2 * ((0x5d42cb / 0x165a0bc00:ℝ) * t + (-0x5b6e0b / 0x165a0bc00:ℝ) * t ^ 2) * ((1 / 3:ℝ) * y - x) * (x - (0:ℝ) * y) + ((0x5d42cb / 0x218711a00:ℝ) * t + (-0x57c48b / 0x218711a00:ℝ) * t ^ 2) * (x - (0:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_7 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_right (by linarith:((3:ℝ) * x + (-1:ℝ) * y) ≤ 0)] nlinarith only [hgram] by_cases h1:x ≤ (3:ℝ) * y · have hlow:(1 / 3:ℝ) * y ≤ x:=le_of_not_ge h0 have hA:0 ≤ ((0x5d42cb / 0x218711a00:ℝ) * t + (-0x57c48b / 0x218711a00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x5d42cb / 0xaf8916:ℝ))] have hC:0 ≤ ((0x5d42cb / 0x3b9aca00:ℝ) * t + (-0x57c48b / 0x3b9aca00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x5d42cb / 0xaf8916:ℝ))] by_cases ht:t ≤ (19 / 20:ℝ) · have hfac:0 ≤ ((0x5d42cb / 0x44364c5bb00:ℝ) - (0x5f178b / 0x44364c5bb00:ℝ) * t):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1)] have hdet:0 ≤ (((0x5d42cb / 0x218711a00:ℝ) * t + (-0x57c48b / 0x218711a00:ℝ) * t ^ 2) * ((0x5d42cb / 0x3b9aca00:ℝ) * t + (-0x57c48b / 0x3b9aca00:ℝ) * t ^ 2) - ((-0x5d42cb / 0xb2d05e00:ℝ) * t + (0x666a8b / 0xb2d05e00:ℝ) * t ^ 2) ^ 2):=by have hh:=mul_nonneg (pow_nonneg _ht0 3) hfac nlinarith only [hh] have hgram:=quadratic_nonnegative hA hC hdet ((3:ℝ) * y - x) (x - (1 / 3:ℝ) * y) unfold pair_7 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] · have hB:0 ≤ ((-0x5d42cb / 0xb2d05e00:ℝ) * t + (0x666a8b / 0xb2d05e00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x5d42cb / 0xccd516:ℝ))] have hgram:0 ≤ ((0x5d42cb / 0x218711a00:ℝ) * t + (-0x57c48b / 0x218711a00:ℝ) * t ^ 2) * ((3:ℝ) * y - x) ^ 2 + 2 * ((-0x5d42cb / 0xb2d05e00:ℝ) * t + (0x666a8b / 0xb2d05e00:ℝ) * t ^ 2) * ((3:ℝ) * y - x) * (x - (1 / 3:ℝ) * y) + ((0x5d42cb / 0x3b9aca00:ℝ) * t + (-0x57c48b / 0x3b9aca00:ℝ) * t ^ 2) * (x - (1 / 3:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_7 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] have hlow:(3:ℝ) * y ≤ x:=le_of_not_ge h1 have hA:0 ≤ ((0x5d42cb / 0x3b9aca00:ℝ) * t + (-0x57c48b / 0x3b9aca00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x5d42cb / 0xaf8916:ℝ))] have hC:0 ≤ (0:ℝ):=by norm_num have hB:0 ≤ ((0x5d42cb / 0x77359400:ℝ) * t + (-0x5b6e0b / 0x77359400:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x5d42cb / 0xb6dc16:ℝ))] have hgram:0 ≤ ((0x5d42cb / 0x3b9aca00:ℝ) * t + (-0x57c48b / 0x3b9aca00:ℝ) * t ^ 2) * y ^ 2 + 2 * ((0x5d42cb / 0x77359400:ℝ) * t + (-0x5b6e0b / 0x77359400:ℝ) * t ^ 2) * y * (x - (3:ℝ) * y) + (0:ℝ) * (x - (3:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_7 rw [max_eq_left (by linarith:0 ≤ ((1:ℝ) * x + (-3:ℝ) * y)), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] noncomputable def pair_8 (t x y:ℝ):ℝ := ((-0x920eef174c9 / 0x38d7ea4c6800:ℝ) * x ^ 2 + (0x920eef174c9 / 0x71afd498d000:ℝ) * x * y + (0:ℝ) * y ^ 2 + (-0x920eef174c9 / 0x1c6bf52634000:ℝ) * max ((1:ℝ) * x + (-1:ℝ) * y) 0 ^ 2 + (0x920eef174c9 / 0x1c6bf52634000:ℝ) * max ((3:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) + ((0x106f8927 / 0x4a817c80:ℝ) * x ^ 2 + (-0x106f8927 / 0x9502f900:ℝ) * x * y + (0:ℝ) * y ^ 2 + (0x106f8927 / 0x2540be400:ℝ) * max ((1:ℝ) * x + (-1:ℝ) * y) 0 ^ 2 + (-0x106f8927 / 0x2540be400:ℝ) * max ((3:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) * t + ((-3 / 50:ℝ) * x ^ 2 + (0x5f1 / 0xc350:ℝ) * x * y + (0:ℝ) * y ^ 2 + (-3 / 0x190:ℝ) * max ((1:ℝ) * x + (-1:ℝ) * y) 0 ^ 2 + (3 / 0x190:ℝ) * max ((3:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) * t ^ 2 private def zz104:"s0068"="s0068":=by decide+kernel theorem pair_8_nonneg {t x y:ℝ} (_ht0:0 ≤ t) (_ht1:t ≤ 1) (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ pair_8 t x y:=by by_cases h0:x ≤ (1 / 3:ℝ) * y · have hA:0 ≤ (0:ℝ):=by norm_num have hC:0 ≤ ((0x103a8c57ec1 / 0x71afd498d000:ℝ) + (-0x57a830d / 0x1bf08eb00:ℝ) * t + (0x209 / 0x249f0:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x57a830d / 0x31afba0:ℝ))] have hB:0 ≤ ((0x30afa507c43 / 0xe35fa931a000:ℝ) + (-0x57a830d / 0x12a05f200:ℝ) * t + (0x1fb / 0x186a0:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x57a830d / 0x3059ee0:ℝ))] have hgram:0 ≤ (0:ℝ) * ((1 / 3:ℝ) * y - x) ^ 2 + 2 * ((0x30afa507c43 / 0xe35fa931a000:ℝ) + (-0x57a830d / 0x12a05f200:ℝ) * t + (0x1fb / 0x186a0:ℝ) * t ^ 2) * ((1 / 3:ℝ) * y - x) * (x - (0:ℝ) * y) + ((0x103a8c57ec1 / 0x71afd498d000:ℝ) + (-0x57a830d / 0x1bf08eb00:ℝ) * t + (0x209 / 0x249f0:ℝ) * t ^ 2) * (x - (0:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_8 rw [max_eq_right (by linarith:((1:ℝ) * x + (-1:ℝ) * y) ≤ 0), max_eq_right (by linarith:((3:ℝ) * x + (-1:ℝ) * y) ≤ 0)] nlinarith only [hgram] by_cases h1:x ≤ (1:ℝ) * y · have hlow:(1 / 3:ℝ) * y ≤ x:=le_of_not_ge h0 have hA:0 ≤ ((0x103a8c57ec1 / 0x71afd498d000:ℝ) + (-0x57a830d / 0x1bf08eb00:ℝ) * t + (0x209 / 0x249f0:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x57a830d / 0x31afba0:ℝ))] have hC:0 ≤ ((21 / 0xc350:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hB:0 ≤ ((7 / 0x61a8:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hgram:0 ≤ ((0x103a8c57ec1 / 0x71afd498d000:ℝ) + (-0x57a830d / 0x1bf08eb00:ℝ) * t + (0x209 / 0x249f0:ℝ) * t ^ 2) * ((1:ℝ) * y - x) ^ 2 + 2 * ((7 / 0x61a8:ℝ) * t ^ 2) * ((1:ℝ) * y - x) * (x - (1 / 3:ℝ) * y) + ((21 / 0xc350:ℝ) * t ^ 2) * (x - (1 / 3:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_8 rw [max_eq_right (by linarith:((1:ℝ) * x + (-1:ℝ) * y) ≤ 0), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] have hlow:(1:ℝ) * y ≤ x:=le_of_not_ge h1 have hA:0 ≤ ((21 / 0xc350:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hC:0 ≤ (0:ℝ):=by norm_num have hB:0 ≤ ((21 / 0x186a0:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hgram:0 ≤ ((21 / 0xc350:ℝ) * t ^ 2) * y ^ 2 + 2 * ((21 / 0x186a0:ℝ) * t ^ 2) * y * (x - (1:ℝ) * y) + (0:ℝ) * (x - (1:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_8 rw [max_eq_left (by linarith:0 ≤ ((1:ℝ) * x + (-1:ℝ) * y)), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] noncomputable def pair_9 (t x y:ℝ):ℝ := ((0:ℝ) * x ^ 2 + (0:ℝ) * x * y + (0:ℝ) * y ^ 2) + ((0:ℝ) * x ^ 2 + (0:ℝ) * x * y + (0:ℝ) * y ^ 2 + (-0x28901bd / 0xee6b2800:ℝ) * max ((1:ℝ) * x + (-3:ℝ) * y) 0 ^ 2 + (0x28901bd / 0xee6b2800:ℝ) * max ((1:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) * t + ((-1 / 0x3b9aca00:ℝ) * x ^ 2 + (0xafc81 / 0xb2d05e00:ℝ) * x * y + (0:ℝ) * y ^ 2 + (0x79b0539 / 0x2cb417800:ℝ) * max ((1:ℝ) * x + (-3:ℝ) * y) 0 ^ 2 + (-0x1856773 / 0x8f0d1800:ℝ) * max ((1:ℝ) * x + (-1:ℝ) * y) 0 ^ 2 + (1 / 0x165a0bc00:ℝ) * max ((3:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) * t ^ 2 theorem pair_9_nonneg {t x y:ℝ} (_ht0:0 ≤ t) (_ht1:t ≤ 1) (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ pair_9 t x y:=by by_cases h0:x ≤ (1 / 3:ℝ) * y · have hA:0 ≤ (0:ℝ):=by norm_num have hC:0 ≤ ((1 / 0x30d4:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hB:0 ≤ ((0xafc81 / 0x430e23400:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hgram:0 ≤ (0:ℝ) * ((1 / 3:ℝ) * y - x) ^ 2 + 2 * ((0xafc81 / 0x430e23400:ℝ) * t ^ 2) * ((1 / 3:ℝ) * y - x) * (x - (0:ℝ) * y) + ((1 / 0x30d4:ℝ) * t ^ 2) * (x - (0:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_9 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_right (by linarith:((1:ℝ) * x + (-1:ℝ) * y) ≤ 0), max_eq_right (by linarith:((3:ℝ) * x + (-1:ℝ) * y) ≤ 0)] nlinarith only [hgram] by_cases h1:x ≤ (1:ℝ) * y · have hlow:(1 / 3:ℝ) * y ≤ x:=le_of_not_ge h0 have hA:0 ≤ ((1 / 0x30d4:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hC:0 ≤ ((3 / 0x30d4:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hB:0 ≤ ((0x15f8ff / 0x218711a00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hgram:0 ≤ ((1 / 0x30d4:ℝ) * t ^ 2) * ((1:ℝ) * y - x) ^ 2 + 2 * ((0x15f8ff / 0x218711a00:ℝ) * t ^ 2) * ((1:ℝ) * y - x) * (x - (1 / 3:ℝ) * y) + ((3 / 0x30d4:ℝ) * t ^ 2) * (x - (1 / 3:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_9 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_right (by linarith:((1:ℝ) * x + (-1:ℝ) * y) ≤ 0), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] by_cases h2:x ≤ (3:ℝ) * y · have hlow:(1:ℝ) * y ≤ x:=le_of_not_ge h1 have hA:0 ≤ ((3 / 0x30d4:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hC:0 ≤ ((0x28901bd / 0x3b9aca00:ℝ) * t + (-0x27e053d / 0x3b9aca00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x28901bd / 0x4fc0a7a:ℝ))] have hB:0 ≤ ((0x15f901 / 0xb2d05e00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hgram:0 ≤ ((3 / 0x30d4:ℝ) * t ^ 2) * ((3:ℝ) * y - x) ^ 2 + 2 * ((0x15f901 / 0xb2d05e00:ℝ) * t ^ 2) * ((3:ℝ) * y - x) * (x - (1:ℝ) * y) + ((0x28901bd / 0x3b9aca00:ℝ) * t + (-0x27e053d / 0x3b9aca00:ℝ) * t ^ 2) * (x - (1:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_9 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_left (by linarith:0 ≤ ((1:ℝ) * x + (-1:ℝ) * y)), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] have hlow:(3:ℝ) * y ≤ x:=le_of_not_ge h2 have hA:0 ≤ ((0x28901bd / 0x3b9aca00:ℝ) * t + (-0x27e053d / 0x3b9aca00:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x28901bd / 0x4fc0a7a:ℝ))] have hC:0 ≤ (0:ℝ):=by norm_num have hB:0 ≤ ((0x28901bd / 0x77359400:ℝ) * t + (-0xf20117 / 0x2cb41780:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0x1162551 / 0x2292710:ℝ))] have hgram:0 ≤ ((0x28901bd / 0x3b9aca00:ℝ) * t + (-0x27e053d / 0x3b9aca00:ℝ) * t ^ 2) * y ^ 2 + 2 * ((0x28901bd / 0x77359400:ℝ) * t + (-0xf20117 / 0x2cb41780:ℝ) * t ^ 2) * y * (x - (3:ℝ) * y) + (0:ℝ) * (x - (3:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_9 rw [max_eq_left (by linarith:0 ≤ ((1:ℝ) * x + (-3:ℝ) * y)), max_eq_left (by linarith:0 ≤ ((1:ℝ) * x + (-1:ℝ) * y)), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] noncomputable def pair_10 (t x y:ℝ):ℝ := ((-0x794822419fb / 0x38d7ea4c6800:ℝ) * x ^ 2 + (0x794822419fb / 0x71afd498d000:ℝ) * x * y + (0:ℝ) * y ^ 2 + (-0x794822419fb / 0x1c6bf52634000:ℝ) * max ((1:ℝ) * x + (-3:ℝ) * y) 0 ^ 2 + (0x794822419fb / 0x1c6bf52634000:ℝ) * max ((3:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) + ((0:ℝ) * x ^ 2 + (0:ℝ) * x * y + (0:ℝ) * y ^ 2) * t + ((0:ℝ) * x ^ 2 + (3 / 0x2710:ℝ) * x * y + (0:ℝ) * y ^ 2) * t ^ 2 theorem pair_10_nonneg {t x y:ℝ} (_ht0:0 ≤ t) (_ht1:t ≤ 1) (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ pair_10 t x y:=by by_cases h0:x ≤ (1 / 3:ℝ) * y · have hA:0 ≤ (0:ℝ):=by norm_num have hC:0 ≤ ((0x286d60c08a9 / 0x1550f7dca7000:ℝ) + (1 / 0x2710:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hB:0 ≤ ((0x286d60c08a9 / 0xe35fa931a000:ℝ) + (1 / 0x4e20:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hgram:0 ≤ (0:ℝ) * ((1 / 3:ℝ) * y - x) ^ 2 + 2 * ((0x286d60c08a9 / 0xe35fa931a000:ℝ) + (1 / 0x4e20:ℝ) * t ^ 2) * ((1 / 3:ℝ) * y - x) * (x - (0:ℝ) * y) + ((0x286d60c08a9 / 0x1550f7dca7000:ℝ) + (1 / 0x2710:ℝ) * t ^ 2) * (x - (0:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_10 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_right (by linarith:((3:ℝ) * x + (-1:ℝ) * y) ≤ 0)] nlinarith only [hgram] by_cases h1:x ≤ (3:ℝ) * y · have hlow:(1 / 3:ℝ) * y ≤ x:=le_of_not_ge h0 have hA:0 ≤ ((0x286d60c08a9 / 0x1550f7dca7000:ℝ) + (1 / 0x2710:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hC:0 ≤ ((0x794822419fb / 0x71afd498d000:ℝ) + (9 / 0x2710:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hfac:0 ≤ ((0x286d60c08a9 / 0x1158e460913d000:ℝ) - (1 / 0x5f5e10:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1)] have hdet:0 ≤ (((0x286d60c08a9 / 0x1550f7dca7000:ℝ) + (1 / 0x2710:ℝ) * t ^ 2) * ((0x794822419fb / 0x71afd498d000:ℝ) + (9 / 0x2710:ℝ) * t ^ 2) - ((-0x286d60c08a9 / 0x71afd498d000:ℝ) + (1 / 0x7d0:ℝ) * t ^ 2) ^ 2):=by have hh:=mul_nonneg (pow_nonneg _ht0 2) hfac nlinarith only [hh] have hgram:=quadratic_nonnegative hA hC hdet ((3:ℝ) * y - x) (x - (1 / 3:ℝ) * y) unfold pair_10 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] have hlow:(3:ℝ) * y ≤ x:=le_of_not_ge h1 have hA:0 ≤ ((0x794822419fb / 0x71afd498d000:ℝ) + (9 / 0x2710:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hC:0 ≤ (0:ℝ):=by norm_num have hB:0 ≤ ((0x794822419fb / 0xe35fa931a000:ℝ) + (3 / 0x4e20:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (0:ℝ))] have hgram:0 ≤ ((0x794822419fb / 0x71afd498d000:ℝ) + (9 / 0x2710:ℝ) * t ^ 2) * y ^ 2 + 2 * ((0x794822419fb / 0xe35fa931a000:ℝ) + (3 / 0x4e20:ℝ) * t ^ 2) * y * (x - (3:ℝ) * y) + (0:ℝ) * (x - (3:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_10 rw [max_eq_left (by linarith:0 ≤ ((1:ℝ) * x + (-3:ℝ) * y)), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] noncomputable def pair_11 (t x y:ℝ):ℝ := ((0:ℝ) * x ^ 2 + (0:ℝ) * x * y + (0:ℝ) * y ^ 2) + ((-0x50d21 / 0x12a05f20:ℝ) * x ^ 2 + (0x50d21 / 0x2540be40:ℝ) * x * y + (0:ℝ) * y ^ 2 + (-0x50d21 / 0x9502f900:ℝ) * max ((1:ℝ) * x + (-3:ℝ) * y) 0 ^ 2 + (0x50d21 / 0x9502f900:ℝ) * max ((3:ℝ) * x + (-1:ℝ) * y) 0 ^ 2) * t + ((0:ℝ) * x ^ 2 + (3 / 0x61a8:ℝ) * x * y + (0:ℝ) * y ^ 2) * t ^ 2 theorem pair_11_nonneg {t x y:ℝ} (_ht0:0 ≤ t) (_ht1:t ≤ 1) (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ pair_11 t x y:=by by_cases h0:x ≤ (1 / 3:ℝ) * y · have hA:0 ≤ (0:ℝ):=by norm_num have hC:0 ≤ ((0x1af0b / 0x6fc23ac0:ℝ) * t + (1 / 0x61a8:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (-0x1af0b / 0x249f0:ℝ))] have hB:0 ≤ ((0x1af0b / 0x4a817c80:ℝ) * t + (1 / 0xc350:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (-0x1af0b / 0xc350:ℝ))] have hgram:0 ≤ (0:ℝ) * ((1 / 3:ℝ) * y - x) ^ 2 + 2 * ((0x1af0b / 0x4a817c80:ℝ) * t + (1 / 0xc350:ℝ) * t ^ 2) * ((1 / 3:ℝ) * y - x) * (x - (0:ℝ) * y) + ((0x1af0b / 0x6fc23ac0:ℝ) * t + (1 / 0x61a8:ℝ) * t ^ 2) * (x - (0:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_11 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_right (by linarith:((3:ℝ) * x + (-1:ℝ) * y) ≤ 0)] nlinarith only [hgram] by_cases h1:x ≤ (3:ℝ) * y · have hlow:(1 / 3:ℝ) * y ≤ x:=le_of_not_ge h0 have hA:0 ≤ ((0x1af0b / 0x6fc23ac0:ℝ) * t + (1 / 0x61a8:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (-0x1af0b / 0x249f0:ℝ))] have hC:0 ≤ ((0x50d21 / 0x2540be40:ℝ) * t + (9 / 0x61a8:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (-0x1af0b / 0x249f0:ℝ))] have hfac:0 ≤ ((0x1af0b / 0xe35fa931a0:ℝ) - (1 / 0x2540be4:ℝ) * t):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1)] have hdet:0 ≤ (((0x1af0b / 0x6fc23ac0:ℝ) * t + (1 / 0x61a8:ℝ) * t ^ 2) * ((0x50d21 / 0x2540be40:ℝ) * t + (9 / 0x61a8:ℝ) * t ^ 2) - ((-0x1af0b / 0x2540be40:ℝ) * t + (1 / 0x1388:ℝ) * t ^ 2) ^ 2):=by have hh:=mul_nonneg (pow_nonneg _ht0 3) hfac nlinarith only [hh] have hgram:=quadratic_nonnegative hA hC hdet ((3:ℝ) * y - x) (x - (1 / 3:ℝ) * y) unfold pair_11 rw [max_eq_right (by linarith:((1:ℝ) * x + (-3:ℝ) * y) ≤ 0), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] have hlow:(3:ℝ) * y ≤ x:=le_of_not_ge h1 have hA:0 ≤ ((0x50d21 / 0x2540be40:ℝ) * t + (9 / 0x61a8:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (-0x1af0b / 0x249f0:ℝ))] have hC:0 ≤ (0:ℝ):=by norm_num have hB:0 ≤ ((0x50d21 / 0x4a817c80:ℝ) * t + (3 / 0xc350:ℝ) * t ^ 2):=by nlinarith [mul_nonneg _ht0 (sub_nonneg.mpr _ht1),sq_nonneg t,sq_nonneg (t - (-0x1af0b / 0xc350:ℝ))] have hgram:0 ≤ ((0x50d21 / 0x2540be40:ℝ) * t + (9 / 0x61a8:ℝ) * t ^ 2) * y ^ 2 + 2 * ((0x50d21 / 0x4a817c80:ℝ) * t + (3 / 0xc350:ℝ) * t ^ 2) * y * (x - (3:ℝ) * y) + (0:ℝ) * (x - (3:ℝ) * y) ^ 2 := add_nonneg (add_nonneg (mul_nonneg hA (sq_nonneg _)) (mul_nonneg (mul_nonneg (mul_nonneg (by norm_num) hB) (by linarith)) (by linarith))) (mul_nonneg hC (sq_nonneg _)) unfold pair_11 rw [max_eq_left (by linarith:0 ≤ ((1:ℝ) * x + (-3:ℝ) * y)), max_eq_left (by linarith:0 ≤ ((3:ℝ) * x + (-1:ℝ) * y))] nlinarith only [hgram] end Green24Proof.NearBalancePairs private def zz2016:"s07e0"="s07e0":=by decide+kernel end section namespace Green24Proof.NearBalanceCertificate open QuadraticCertificates ExpressionCertificates NearBalanceParameterRows open ParityPhaseRows (Phase Potential) def rows0Chunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x103d305d7cca0faa08012d7c1f8a0a902d302d587dfb9a78003cb93abcfd5531186e4e2eee08004f2bc938be39e029338ebfac9c6c08004c89def8bd391130e9afed2b1d08004eadd9ac7b49603c31cb5fda4e3a08007af83cef2cdcd43228dc9c5ddc0800acea1d48fccde030baf98c1f4c08002fa91b29d998e03d601b5f3889ec8804ac8e1bfbdf55603b4c7adafe0801ac4ff8e9584f603962dbce287d28012adaac4b0d2160e9afed2b1d0806bf2e9dcfddcf203d216deb183e9808006f998b99b81fd02d202d587dfb9a78080089ff1c501d202a384f3cac08069c9d6f2bcd25204a1d998dbd8801fecfeb4abbbb2019238ebfac9c6c0800dd8d9cda2f9b6121cb5fda4e3a08001d5929281ffc4c2422ad0fbf794f08002c9d1d6a3f093be020baf98c1f4c08057ffb2dd86e6f214] def rows0Chunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x101d505d7cca0faa08004f2bc938be39e03950baf98c1f4c08007849a9c9eb4ce02950baf98c1f4c08001a09c8ad5caf38e01950e9afed2b1d0800ec097cfd69cc203c10baf98c1f4c08009cdeeb78e85b202c102a384f3cac08020d8de9eede2da01c10e9afed2b1d0800bb68995b6ecc203810baf98c1f4c08008eeb496d7cbaa028105d7cca0faa080528b8ff8ccb4d601810baf98c1f4c08008eeb496d7cbaa03d405d7cca0faa0800194dee289a4c602d41186e4e2eee0800194dee289a4c503c40191c2b9e5a0802398c7d0e9c602c403b4c7adafe0802398c7d0e9c503d00baf98c1f4c08002c1a7c0a9abe202d0228dc9c5ddc08002c1a7c0a9abe103c002ebe690bd908015b39a95cbf202c008c3b2b1b7b08015b39a95cbf1571186e4e2eee08004f2bc938be39e170e9afed2b1d08004eadd9ac7b49614] def rows0Chunk2:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x103d50baf98c1f4c08008d0ff85f9d0c202d50baf98c1f4c08001a2dac087cdc58602] def rows0:List (ℚ × Potential) := rows0Chunk0 ++ rows0Chunk1 ++ rows0Chunk2 def rows1Chunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x102d00b96c1bc801584f0c903c003dceb948002ebc58102c00b96c1bc8002ebc5825702e5d0af806fd2aba11704d485f98001cccee4c902d33bcdb2c00b86cede01d32fd7c2800394b6c95325a0afc8800ad8c9979d029303dceb948044b9a3c6019303dceb948010b7b09a1303dceb948001a299bed55602e5d0af8002bdc1a6dd1604d485f98003fed1f9b503d203dceb94805cb3b3a502d22fd7c2802d01d203dceb9480018d9f81e15225a0afc88002d4999eb9029202aa82fcc009f4a1d1019209a88bf28003b3c4efb51212d097e4805dc9b9b514] def rows1Chunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x155050615050603c103dceb948004bde99d4107b9d6a88001bfa38a02d43bcdb2c00dbc9501d402aa82fcc028b4c203c401eeb5ca8039ceb6c102c401eeb5ca80139a929603d003dceb94801584f0ca09] def rows1:List (ℚ × Potential) := rows1Chunk0 ++ rows1Chunk1 def rows2Chunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x1171de6d9a00c96b602d31389b4804f9afa53068da00601931de6d9a001a6ccde13068da0064301bede8802eeb90383779ae58016f1d6b903068da0065601eeb5ca8001eaae1601eeb5ca80048d938603d203dceb94802eb4f58902d202e5d0af800101d201eeb5ca8002ce5205cba0de802afad1c2029201c80501921de6d9a001b0dcca12068da00603c217ebe1800142018f86c68009a3e79d02779ae58005dbc2ad14] def rows2Chunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x102d52fd7c280058fa18d5503dceb948013d3a1d2029501eeb5ca8004eaf1d5150386d00602c15faf848008838cf101c103dceb948014e7a6a541029e8d8c8034ff81018101eeb5ca8016f1d6b9010386d0065401bede880382440386d00603d003e8a480499caa02d003dceb948017eaee9901d001eeb5ca8001dd5001eeb5ca8003d5aa03c001eeb5ca800482dc9502c003dceb948002d7929a01c003dceb94804a400b96c1bc8015fbf65701eeb5ca800681eec614] def rows2:List (ℚ × Potential) := rows2Chunk0 ++ rows2Chunk1 def rows:Rows:=![rows0,rows1,rows2] def quad0Degree0:Expression:=quadComponent rows 0 0 0 false def quad0Degree0Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Degree0Target:NormalForm:=(![![(0x4a1ed77f5647 / 0x2d79883d2000), -1,(-3 / 2),(0x5e88b23a647 / 0x5af3107a4000)], ![-1,(-0x18871912b3647 / 0x2d79883d2000),(0xaffd95d0d9b9 / 0x5af3107a4000),(1 / 2)], ![(-3 / 2),(0xaffd95d0d9b9 / 0x5af3107a4000),(-0x6f2dd5b7b0f9 / 0x110d9316ec00),(0x448be5fe62f9 / 0x44364c5bb000)], ![(0x5e88b23a647 / 0x5af3107a4000),(1 / 2),(0x448be5fe62f9 / 0x44364c5bb000),(-1 / 2)]],[((-0x5599a2b2f9 / 0x886c98b76000), ![0,0,1, -1]),((0x5599a2b2f9 / 0x886c98b76000), ![0,0,3, -1]),((0x5e88b23a647 / 0xb5e620f48000), ![0,1,0, -3]),((0xa42c7f898d2b / 0x5af3107a4000), ![0,1,0, -1]),((-1 / 2), ![0,3, -2, -1]),((1 / 2), ![0,3, -2,1]),((0x5e88b23a647 / 0xb5e620f48000), ![0,3,0, -1]),((1 / 2), ![0,3,2, -1]),((-0x5599a2b2f9 / 0x886c98b76000), ![1, -3,0,0]),((-1 / 2), ![1, -2, -3,0]),((1 / 2), ![1, -2,3,0]),((0x5599a2b2f9 / 0x886c98b76000), ![1, -1,0,0]),((-0x5e88b23a647 / 0xb5e620f48000), ![1,0, -3,0]),((-0xa42c7f898d2b / 0x5af3107a4000), ![1,0, -1,0]),((1 / 2), ![1,2, -3,0]),((-0x5e88b23a647 / 0xb5e620f48000), ![3,0, -1,0])]) private def zz105:"s0069"="s0069":=by decide+kernel theorem quad0Degree0_identity:identityCheck quad0Degree0 quad0Degree0Rewrites quad0Degree0Target = true:=by decide +kernel def quad0Degree1:Expression:=quadComponent rows 1 0 0 false def quad0Degree1Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Degree1Target:NormalForm:=(![![0,0,0,0], ![0,0,0,0], ![0,0,(0x2d7141 / 0x59682f00),(-0x2d7141 / 0x165a0bc00)], ![0,0,(-0x2d7141 / 0x165a0bc00),0]],[((0x2d7141 / 0x2cb417800), ![0,0,1, -1]),((-0x2d7141 / 0x2cb417800), ![0,0,3, -1]),((0x2d7141 / 0x2cb417800), ![1, -3,0,0]),((-0x2d7141 / 0x2cb417800), ![1, -1,0,0])]) theorem quad0Degree1_identity:identityCheck quad0Degree1 quad0Degree1Rewrites quad0Degree1Target = true:=by decide +kernel def quad0Degree2:Expression:=quadComponent rows 2 0 0 false def quad0Degree2Rewrites:Rewrites:=[RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Degree2Target:NormalForm:=(![![(0x1f789df / 0x3b9aca00),(0x729ccfb / 0x2cb417800),(0xbbb / 0x30d40),(-0x16dfb05 / 0x3b9aca00)], ![(0x729ccfb / 0x2cb417800),(0x839b65f / 0x77359400),(-0x5b7097 / 0x1dcd6500),(0x5c0313 / 0x77359400)], ![(0xbbb / 0x30d40),(-0x5b7097 / 0x1dcd6500),(0x1941a5fd / 0x165a0bc00),(-0x1a1223d / 0x8f0d1800)], ![(-0x16dfb05 / 0x3b9aca00),(0x5c0313 / 0x77359400),(-0x1a1223d / 0x8f0d1800),(1 / 0xc8)]],[((37 / 0x2cb417800), ![0,0,1, -3]),((0x2ae48d / 0xee6b2800), ![0,0,1, -1]),((-0x157259 / 0x77359400), ![0,0,3, -1]),((-0x7a11df / 0x77359400), ![0,1,0, -3]),((1 / 0xc8), ![0,3, -2, -1]),((-1 / 0xc8), ![0,3, -2,1]),((-1 / 0xc8), ![0,3,2, -1]),((0x157259 / 0x77359400), ![1, -3,0,0]),((1 / 0xc8), ![1, -2, -3,0]),((-1 / 0xc8), ![1, -2,3,0]),((-0x2ae48d / 0xee6b2800), ![1, -1,0,0]),((0x7a11df / 0x3b9aca00), ![1,0,0, -3]),((-1 / 0xc8), ![1,2, -3,0]),((-37 / 0x2cb417800), ![3, -1,0,0]),((0x7a11df / 0x77359400), ![3,0, -1,0]),((-0x7a11df / 0x3b9aca00), ![3,0,0, -1])]) theorem quad0Degree2_identity:identityCheck quad0Degree2 quad0Degree2Rewrites quad0Degree2Target = true:=by decide +kernel noncomputable def quad0Polynomial (t:ℝ) (x:Point):ℝ := normalEval quad0Degree0Target x + t * normalEval quad0Degree1Target x + t ^ 2 * normalEval quad0Degree2Target x theorem quad0_eval (t:ℝ) (x:Point) : parameterEval (fun d => quadComponent rows d 0 0 false) t x = quad0Polynomial t x:=by change expressionEval quad0Degree0 x + t * expressionEval quad0Degree1 x + t ^ 2 * expressionEval quad0Degree2 x = _ rw [identityCheck_sound quad0Degree0 quad0Degree0Rewrites quad0Degree0Target x quad0Degree0_identity,identityCheck_sound quad0Degree1 quad0Degree1Rewrites quad0Degree1Target x quad0Degree1_identity,identityCheck_sound quad0Degree2 quad0Degree2Rewrites quad0Degree2Target x quad0Degree2_identity] rfl def quad1Degree0:Expression:=quadComponent rows 0 0 0 true def quad1Degree0Rewrites:Rewrites:=[RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Degree0Target:NormalForm:=(![![(0x24ac0093a051 / 0x1550f7dca700), -1,(-3 / 2),(0x1ef475bf62db / 0x2aa1efb94e000)], ![-1,(-0xb85685bc3c87b / 0x1550f7dca7000),(0x29346b23e04df / 0x1550f7dca7000),(0xe4f107d0be13 / 0x1c6bf52634000)], ![(-3 / 2),(0x29346b23e04df / 0x1550f7dca7000),(-0x6f2dd5b7b0f9 / 0x110d9316ec00),(0x448be5fe62f9 / 0x44364c5bb000)], ![(0x1ef475bf62db / 0x2aa1efb94e000),(0xe4f107d0be13 / 0x1c6bf52634000),(0x448be5fe62f9 / 0x44364c5bb000),(-1 / 2)]],[((-0x5599a2b2f9 / 0x886c98b76000), ![0,0,1, -1]),((0x5599a2b2f9 / 0x886c98b76000), ![0,0,3, -1]),((0x16d84956db21 / 0x2aa1efb94e000), ![0,1,0, -3]),((0x4162f1edb8ad / 0x246139ca8000), ![0,1,0, -1]),((-1 / 2), ![0,3, -2, -1]),((1 / 2), ![0,3, -2,1]),((0x13377371c159 / 0x221b262dd8000), ![0,3,0, -1]),((1 / 2), ![0,3,2, -1]),((-0x5599a2b2f9 / 0x886c98b76000), ![1, -3,0,0]),((-1 / 2), ![1, -2, -3,0]),((1 / 2), ![1, -2,3,0]),((0x5599a2b2f9 / 0x886c98b76000), ![1, -1,0,0]),((-0x13377371c159 / 0x221b262dd8000), ![1,0, -3,0]),((-0x4162f1edb8ad / 0x246139ca8000), ![1,0, -1,0]),((0x4e95efa1bcd / 0x1c6bf52634000), ![1,0,0, -3]),((1 / 2), ![1,2, -3,0]),((-0x16d84956db21 / 0x2aa1efb94e000), ![3,0, -1,0]),((-0x4e95efa1bcd / 0x1c6bf52634000), ![3,0,0, -1])]) private def zz106:"s006a"="s006a":=by decide+kernel theorem quad1Degree0_identity:identityCheck quad1Degree0 quad1Degree0Rewrites quad1Degree0Target = true:=by decide +kernel def quad1Degree1:Expression:=quadComponent rows 1 0 0 true def quad1Degree1Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Degree1Target:NormalForm:=(![![(-0x17e8c5 / 0xee6b2800),0,(0x17e8c5 / 0x1dcd65000),0], ![0,(0xd72eed / 0xee6b2800),0,(-0x17e8c5 / 0x5f5e1000)], ![(0x17e8c5 / 0x1dcd65000),0,(0x2d7141 / 0x59682f00),(-0x2d7141 / 0x165a0bc00)], ![0,(-0x17e8c5 / 0x5f5e1000),(-0x2d7141 / 0x165a0bc00),0]],[((0x2d7141 / 0x2cb417800), ![0,0,1, -1]),((-0x2d7141 / 0x2cb417800), ![0,0,3, -1]),((-0x17e8c5 / 0xee6b2800), ![0,3,0, -1]),((0x2d7141 / 0x2cb417800), ![1, -3,0,0]),((-0x2d7141 / 0x2cb417800), ![1, -1,0,0]),((0x17e8c5 / 0xee6b2800), ![1,0, -3,0])]) theorem quad1Degree1_identity:identityCheck quad1Degree1 quad1Degree1Rewrites quad1Degree1Target = true:=by decide +kernel def quad1Degree2:Expression:=quadComponent rows 2 0 0 true def quad1Degree2Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Degree2Target:NormalForm:=(![![(-0x14ddfe3 / 0x3b9aca00),(0x729ccfb / 0x2cb417800),(0x21eb13f / 0x8f0d1800),(-0x5b9d / 0x5f5e10)], ![(0x729ccfb / 0x2cb417800),(0x1ba84ac5 / 0x165a0bc00),(-0x4a3ce9 / 0x11e1a300),(-0xd316d5 / 0x2cb417800)], ![(0x21eb13f / 0x8f0d1800),(-0x4a3ce9 / 0x11e1a300),(0x1941a5fd / 0x165a0bc00),(-0x1a1223d / 0x8f0d1800)], ![(-0x5b9d / 0x5f5e10),(-0xd316d5 / 0x2cb417800),(-0x1a1223d / 0x8f0d1800),(1 / 0xc8)]],[((37 / 0x2cb417800), ![0,0,1, -3]),((0x2ae48d / 0xee6b2800), ![0,0,1, -1]),((-0x157259 / 0x77359400), ![0,0,3, -1]),((1 / 0x23c34600), ![0,1, -3,0]),((-0x14ce993 / 0x2cb417800), ![0,1,0, -3]),((-0x806339 / 0x2faf0800), ![0,1,0, -1]),((1 / 0xc8), ![0,3, -2, -1]),((-1 / 0xc8), ![0,3, -2,1]),((-1 / 0x23c34600), ![0,3, -1,0]),((-1 / 0xc8), ![0,3,2, -1]),((0x157259 / 0x77359400), ![1, -3,0,0]),((1 / 0xc8), ![1, -2, -3,0]),((-1 / 0xc8), ![1, -2,3,0]),((-0x2ae48d / 0xee6b2800), ![1, -1,0,0]),((0x806339 / 0x2faf0800), ![1,0, -1,0]),((-1 / 0xc8), ![1,2, -3,0]),((-37 / 0x2cb417800), ![3, -1,0,0]),((0x14ce993 / 0x2cb417800), ![3,0, -1,0])]) theorem quad1Degree2_identity:identityCheck quad1Degree2 quad1Degree2Rewrites quad1Degree2Target = true:=by decide +kernel noncomputable def quad1Polynomial (t:ℝ) (x:Point):ℝ := normalEval quad1Degree0Target x + t * normalEval quad1Degree1Target x + t ^ 2 * normalEval quad1Degree2Target x theorem quad1_eval (t:ℝ) (x:Point) : parameterEval (fun d => quadComponent rows d 0 0 true) t x = quad1Polynomial t x:=by change expressionEval quad1Degree0 x + t * expressionEval quad1Degree1 x + t ^ 2 * expressionEval quad1Degree2 x = _ rw [identityCheck_sound quad1Degree0 quad1Degree0Rewrites quad1Degree0Target x quad1Degree0_identity,identityCheck_sound quad1Degree1 quad1Degree1Rewrites quad1Degree1Target x quad1Degree1_identity,identityCheck_sound quad1Degree2 quad1Degree2Rewrites quad1Degree2Target x quad1Degree2_identity] rfl def quad2Degree0:Expression:=quadComponent rows 0 0 1 false def quad2Degree0Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r23,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Degree0Target:NormalForm:=(![![(0x3009737cdbd21 / 0x1c6bf52634000), -1,(-3 / 2),(0x5e88b23a647 / 0x5af3107a4000)], ![-1,(-0xf0247453303b5 / 0x1c6bf52634000),(0x1aa48901ff121 / 0xe35fa931a000),(1 / 2)], ![(-3 / 2),(0x1aa48901ff121 / 0xe35fa931a000),(-0x1c0662c5922f1 / 0x44364c5bb000),(0x115de6d73eaf1 / 0x110d9316ec000)], ![(0x5e88b23a647 / 0x5af3107a4000),(1 / 2),(0x115de6d73eaf1 / 0x110d9316ec000),(-1 / 2)]],[((-0x5053c052af1 / 0x221b262dd8000), ![0,0,1, -1]),((0x5053c052af1 / 0x221b262dd8000), ![0,0,3, -1]),((0x5e88b23a647 / 0xb5e620f48000), ![0,1,0, -3]),((0xa42c7f898d2b / 0x5af3107a4000), ![0,1,0, -1]),((-1 / 2), ![0,3, -2, -1]),((1 / 2), ![0,3, -2,1]),((-0x920eef174c9 / 0x1c6bf52634000), ![0,3, -1,0]),((0x5e88b23a647 / 0xb5e620f48000), ![0,3,0, -1]),((1 / 2), ![0,3,2, -1]),((-0x8cc47a1a63 / 0x3691d6afc000), ![1, -3,0,0]),((-1 / 2), ![1, -2, -3,0]),((1 / 2), ![1, -2,3,0]),((0x8cc47a1a63 / 0x3691d6afc000), ![1, -1,0,0]),((-0x4b045ebef0d / 0xb5e620f48000), ![1,0, -3,0]),((-0x1407055595cc7 / 0xb5e620f48000), ![1,0, -1,0]),((-0x920eef174c9 / 0x1c6bf52634000), ![1,0,0, -1]),((1 / 2), ![1,2, -3,0]),((-0x9aae9a8ed0b / 0xe35fa931a000), ![3,0, -1,0])]) private def zz107:"s006b"="s006b":=by decide+kernel theorem quad2Degree0_identity:identityCheck quad2Degree0 quad2Degree0Rewrites quad2Degree0Target = true:=by decide +kernel def quad2Degree1:Expression:=quadComponent rows 1 0 1 false def quad2Degree1Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Degree1Target:NormalForm:=(![![(-0x6ee335b / 0xb2d05e00),0,(3 / 20),(-0x9e597 / 0xf42400)], ![0,(-0x5423f535 / 0x12a05f200),(-0x5d92e5b / 0x2540be400),0], ![(3 / 20),(-0x5d92e5b / 0x2540be400),(-0x1509c25 / 0x59682f00),(0x1509c25 / 0x165a0bc00)], ![(-0x9e597 / 0xf42400),0,(0x1509c25 / 0x165a0bc00),0]],[((-0x1509c25 / 0x2cb417800), ![0,0,1, -1]),((0x1509c25 / 0x2cb417800), ![0,0,3, -1]),((0x9e8869 / 0x4a817c80), ![0,1, -1,0]),((0x1b389bdb / 0x37e11d600), ![0,3, -1,0]),((0x133448b / 0x77359400), ![1, -3,0,0]),((-0x133448b / 0x77359400), ![1, -1,0,0]),((0x106ec0d / 0x165a0bc00), ![1,0,0, -3]),((0x44728e3 / 0x77359400), ![1,0,0, -1])]) theorem quad2Degree1_identity:identityCheck quad2Degree1 quad2Degree1Rewrites quad2Degree1Target = true:=by decide +kernel def quad2Degree2:Expression:=quadComponent rows 2 0 1 false def quad2Degree2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r25,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Degree2Target:NormalForm:=(![![(-0x2354831 / 0x165a0bc00),(3 / 0x30d40),(3 / 0x30d40),(0xa6d41 / 0x3b9aca0)], ![(3 / 0x30d40),(0x3b9870f / 0x77359400),(3 / 0x30d40),(-0x16dc06d / 0x77359400)], ![(3 / 0x30d40),(3 / 0x30d40),(-0x2fab8fb / 0x3b9aca00),(0x5f747 / 0x1dcd650)], ![(0xa6d41 / 0x3b9aca0),(-0x16dc06d / 0x77359400),(0x5f747 / 0x1dcd650),0]],[((-37 / 0x77359400), ![0,0,1, -3]),((-0x17d5b8d / 0xee6b2800), ![0,0,1, -1]),((0x30d07 / 0x1e84800), ![0,0,3, -1]),((3 / 0x190), ![0,1, -1,0]),((-0x7a11df / 0x77359400), ![0,1,0, -3]),((-0x161725 / 0x165a0bc0), ![0,3, -1,0]),((0x4d5c6b / 0x77359400), ![1,0, -1,0]),((0x14d32f / 0x165a0bc0), ![1,0,0, -3])]) theorem quad2Degree2_identity:identityCheck quad2Degree2 quad2Degree2Rewrites quad2Degree2Target = true:=by decide +kernel noncomputable def quad2Polynomial (t:ℝ) (x:Point):ℝ := normalEval quad2Degree0Target x + t * normalEval quad2Degree1Target x + t ^ 2 * normalEval quad2Degree2Target x theorem quad2_eval (t:ℝ) (x:Point) : parameterEval (fun d => quadComponent rows d 0 1 false) t x = quad2Polynomial t x:=by change expressionEval quad2Degree0 x + t * expressionEval quad2Degree1 x + t ^ 2 * expressionEval quad2Degree2 x = _ rw [identityCheck_sound quad2Degree0 quad2Degree0Rewrites quad2Degree0Target x quad2Degree0_identity,identityCheck_sound quad2Degree1 quad2Degree1Rewrites quad2Degree1Target x quad2Degree1_identity,identityCheck_sound quad2Degree2 quad2Degree2Rewrites quad2Degree2Target x quad2Degree2_identity] rfl def quad3Degree0:Expression:=quadComponent rows 0 0 1 true def quad3Degree0Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Degree0Target:NormalForm:=(![![(0x46fff7d70f127 / 0x2aa1efb94e000), -1,(-3 / 2),(0x2ac53977657 / 0x2aa1efb94e00)], ![-1,(-0x166299a526ff29 / 0x2aa1efb94e000),(0x3fb3f3456ed9 / 0x221b262dd800),(0xe4f107d0be13 / 0x1c6bf52634000)], ![(-3 / 2),(0x3fb3f3456ed9 / 0x221b262dd800),(-0x1c0662c5922f1 / 0x44364c5bb000),(0x115de6d73eaf1 / 0x110d9316ec000)], ![(0x2ac53977657 / 0x2aa1efb94e00),(0xe4f107d0be13 / 0x1c6bf52634000),(0x115de6d73eaf1 / 0x110d9316ec000),(-1 / 2)]],[((-0x5053c052af1 / 0x221b262dd8000), ![0,0,1, -1]),((0x5053c052af1 / 0x221b262dd8000), ![0,0,3, -1]),((0xde4c393607f / 0x221b262dd8000), ![0,1, -3,0]),((0x83fc63 / 0xaa87bee538000), ![0,1, -1,0]),((0x16d84956db21 / 0x2aa1efb94e000), ![0,1,0, -3]),((0x4162f1edb8ad / 0x246139ca8000), ![0,1,0, -1]),((-1 / 2), ![0,3, -2, -1]),((1 / 2), ![0,3, -2,1]),((-0x8cc47a1a63 / 0x12309ce54000), ![0,3, -1,0]),((0x13377371c159 / 0x221b262dd8000), ![0,3,0, -1]),((1 / 2), ![0,3,2, -1]),((-0x8cc47a1a63 / 0x3691d6afc000), ![1, -3,0,0]),((-1 / 2), ![1, -2, -3,0]),((1 / 2), ![1, -2,3,0]),((0x8cc47a1a63 / 0x3691d6afc000), ![1, -1,0,0]),((-0x1143f85f3421 / 0x221b262dd8000), ![1,0, -3,0]),((-0x1456a0079b143 / 0xb5e620f48000), ![1,0, -1,0]),((-0xe593573eb / 0x1550f7dca700), ![1,0,0, -1]),((1 / 2), ![1,2, -3,0]),((-0x9c9e13178cf / 0x110d9316ec000), ![3,0, -1,0]),((-0x4abc1f0815 / 0x886c98b76000), ![3,0,0, -1])]) private def zz108:"s006c"="s006c":=by decide+kernel theorem quad3Degree0_identity:identityCheck quad3Degree0 quad3Degree0Rewrites quad3Degree0Target = true:=by decide +kernel def quad3Degree1:Expression:=quadComponent rows 1 0 1 true def quad3Degree1Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Degree1Target:NormalForm:=(![![(-0x74d27fb / 0xb2d05e00),0,(3 / 20),(-0x32065393 / 0x4a817c800)], ![0,(-0x37f9b367 / 0xee6b2800),(-0x1543279d / 0x4a817c800),(-0x17e8c5 / 0x5f5e1000)], ![(3 / 20),(-0x1543279d / 0x4a817c800),(-0x1509c25 / 0x59682f00),(0x1509c25 / 0x165a0bc00)], ![(-0x32065393 / 0x4a817c800),(-0x17e8c5 / 0x5f5e1000),(0x1509c25 / 0x165a0bc00),0]],[((-0x1509c25 / 0x2cb417800), ![0,0,1, -1]),((0x1509c25 / 0x2cb417800), ![0,0,3, -1]),((0x1eccef1 / 0x77359400), ![0,1, -3,0]),((23 / 0xbebc200), ![0,1, -1,0]),((0x8d3e071 / 0x165a0bc00), ![0,3, -1,0]),((-0x17e8c5 / 0xee6b2800), ![0,3,0, -1]),((0x133448b / 0x77359400), ![1, -3,0,0]),((-0x133448b / 0x77359400), ![1, -1,0,0]),((-0x328da5 / 0x23c34600), ![1,0,0, -3]),((0xb0d3af / 0xee6b280), ![1,0,0, -1])]) theorem quad3Degree1_identity:identityCheck quad3Degree1 quad3Degree1Rewrites quad3Degree1Target = true:=by decide +kernel def quad3Degree2:Expression:=quadComponent rows 2 0 1 true def quad3Degree2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r23,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r6,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Degree2Target:NormalForm:=(![![(-0x106d3f / 0x2faf080),(3 / 0x30d40),(0x13a6869 / 0xee6b2800),(0x9eb6d / 0x4c4b400)], ![(3 / 0x30d40),(0x26adf1 / 0x23c34600),(0x2af5461 / 0xb2d05e00),(-0xb8dabd5 / 0x2cb417800)], ![(0x13a6869 / 0xee6b2800),(0x2af5461 / 0xb2d05e00),(-0x2fab8fb / 0x3b9aca00),(0x5f747 / 0x1dcd650)], ![(0x9eb6d / 0x4c4b400),(-0xb8dabd5 / 0x2cb417800),(0x5f747 / 0x1dcd650),0]],[((-37 / 0x77359400), ![0,0,1, -3]),((-0x17d5b8d / 0xee6b2800), ![0,0,1, -1]),((0x30d07 / 0x1e84800), ![0,0,3, -1]),((0x2e69d45 / 0x165a0bc00), ![0,1, -3,0]),((1 / 0x59682f00), ![0,1, -1,0]),((-0x14ce993 / 0x2cb417800), ![0,1,0, -3]),((-0x806339 / 0x2faf0800), ![0,1,0, -1]),((-0xa7 / 0xb2d05e00), ![0,3, -1,0]),((0x51e847 / 0x17d78400), ![1,0, -1,0]),((0x9e6bd / 0x4c4b400), ![1,0,0, -1])]) theorem quad3Degree2_identity:identityCheck quad3Degree2 quad3Degree2Rewrites quad3Degree2Target = true:=by decide +kernel noncomputable def quad3Polynomial (t:ℝ) (x:Point):ℝ := normalEval quad3Degree0Target x + t * normalEval quad3Degree1Target x + t ^ 2 * normalEval quad3Degree2Target x theorem quad3_eval (t:ℝ) (x:Point) : parameterEval (fun d => quadComponent rows d 0 1 true) t x = quad3Polynomial t x:=by change expressionEval quad3Degree0 x + t * expressionEval quad3Degree1 x + t ^ 2 * expressionEval quad3Degree2 x = _ rw [identityCheck_sound quad3Degree0 quad3Degree0Rewrites quad3Degree0Target x quad3Degree0_identity,identityCheck_sound quad3Degree1 quad3Degree1Rewrites quad3Degree1Target x quad3Degree1_identity,identityCheck_sound quad3Degree2 quad3Degree2Rewrites quad3Degree2Target x quad3Degree2_identity] rfl def quad4Degree0:Expression:=quadComponent rows 0 1 1 false def quad4Degree0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Degree0Target:NormalForm:=(![![(0x5eeec91b890b / 0x38d7ea4c6800), -1,(-3 / 2),(0x9aae9a8ed0b / 0x71afd498d000)], ![-1,(-0x3d9bda724970b / 0x71afd498d000),(0xdd87a2faaa6d / 0x71afd498d000),(0xd42560299715 / 0x1c6bf52634000)], ![(-3 / 2),(0xdd87a2faaa6d / 0x71afd498d000),(-0xe0036e4b2523 / 0x221b262dd800),(0x8abf8ed88923 / 0x886c98b76000)], ![(0x9aae9a8ed0b / 0x71afd498d000),(0xd42560299715 / 0x1c6bf52634000),(0x8abf8ed88923 / 0x886c98b76000),(-1 / 2)]],[((-0x252f6212923 / 0x110d9316ec000), ![0,0,1, -1]),((0x252f6212923 / 0x110d9316ec000), ![0,0,3, -1]),((-0x1878e2d963 / 0x5af3107a400), ![0,1, -3,0]),((0x9aae9a8ed0b / 0xe35fa931a000), ![0,1,0, -3]),((0x1407055595cc7 / 0xb5e620f48000), ![0,1,0, -1]),((-1 / 2), ![0,3, -2, -1]),((1 / 2), ![0,3, -2,1]),((0x1878e2d963 / 0x5af3107a400), ![0,3, -1,0]),((0x4b045ebef0d / 0xb5e620f48000), ![0,3,0, -1]),((1 / 2), ![0,3,2, -1]),((-0x252f6212923 / 0x110d9316ec000), ![1, -3,0,0]),((-1 / 2), ![1, -2, -3,0]),((1 / 2), ![1, -2,3,0]),((0x252f6212923 / 0x110d9316ec000), ![1, -1,0,0]),((-0x4b045ebef0d / 0xb5e620f48000), ![1,0, -3,0]),((-0x1407055595cc7 / 0xb5e620f48000), ![1,0, -1,0]),((1 / 2), ![1,2, -3,0]),((-0x9aae9a8ed0b / 0xe35fa931a000), ![3,0, -1,0])]) private def zz109:"s006d"="s006d":=by decide+kernel theorem quad4Degree0_identity:identityCheck quad4Degree0 quad4Degree0Rewrites quad4Degree0Target = true:=by decide +kernel def quad4Degree1:Expression:=quadComponent rows 1 1 1 false def quad4Degree1Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Degree1Target:NormalForm:=(![![(0x1af0b / 0x2540be40),0,(3 / 20),(-0xcc9d925 / 0x9502f900)], ![0,0,(-0x1fea3e5b / 0x9502f900),(3 / 20)], ![(3 / 20),(-0x1fea3e5b / 0x9502f900),(0x1af0b / 0x2540be40),(-0x1af0b / 0x4a817c80)], ![(-0xcc9d925 / 0x9502f900),(3 / 20),(-0x1af0b / 0x4a817c80),0]],[((0x1af0b / 0x9502f900), ![0,0,1, -3]),((-0x1af0b / 0x1dcd6500), ![0,0,1, -1]),((0x1af0b / 0x1dcd6500), ![1, -1,0,0]),((-0x1af0b / 0x9502f900), ![3, -1,0,0])]) theorem quad4Degree1_identity:identityCheck quad4Degree1 quad4Degree1Rewrites quad4Degree1Target = true:=by decide +kernel def quad4Degree2:Expression:=quadComponent rows 2 1 1 false def quad4Degree2Rewrites:Rewrites:=[RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Degree2Target:NormalForm:=(![![(-0x4d5c6b / 0x77359400),(0xc1 / 0xbebc20),(3 / 0x30d40),(0x1859b / 0x7735940)], ![(0xc1 / 0xbebc20),(0x4d5c6b / 0x77359400),(0x41a4c3 / 0x3b9aca00),(-0x4ce73b / 0x77359400)], ![(3 / 0x30d40),(0x41a4c3 / 0x3b9aca00),0,(0xc1 / 0xbebc20)], ![(0x1859b / 0x7735940),(-0x4ce73b / 0x77359400),(0xc1 / 0xbebc20),0]],[((-0x4d5c6b / 0x77359400), ![0,1,0, -1]),((0x4d5c6b / 0x77359400), ![1,0, -1,0])]) theorem quad4Degree2_identity:identityCheck quad4Degree2 quad4Degree2Rewrites quad4Degree2Target = true:=by decide +kernel noncomputable def quad4Polynomial (t:ℝ) (x:Point):ℝ := normalEval quad4Degree0Target x + t * normalEval quad4Degree1Target x + t ^ 2 * normalEval quad4Degree2Target x theorem quad4_eval (t:ℝ) (x:Point) : parameterEval (fun d => quadComponent rows d 1 1 false) t x = quad4Polynomial t x:=by change expressionEval quad4Degree0 x + t * expressionEval quad4Degree1 x + t ^ 2 * expressionEval quad4Degree2 x = _ rw [identityCheck_sound quad4Degree0 quad4Degree0Rewrites quad4Degree0Target x quad4Degree0_identity,identityCheck_sound quad4Degree1 quad4Degree1Rewrites quad4Degree1Target x quad4Degree1_identity,identityCheck_sound quad4Degree2 quad4Degree2Rewrites quad4Degree2Target x quad4Degree2_identity] rfl def quad5Degree0:Expression:=quadComponent rows 0 1 1 true def quad5Degree0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Degree0Target:NormalForm:=(![![(0x701b53bb00cf / 0x44364c5bb000), -1,(-3 / 2),(0x9c9e13178cf / 0x886c98b76000)], ![-1,(-0x120fab7bccbbd / 0x221b262dd800),(0x1026637dd8945 / 0x886c98b76000),(0x8f0da94824d / 0x12309ce54000)], ![(-3 / 2),(0x1026637dd8945 / 0x886c98b76000),(-0xe0036e4b2523 / 0x221b262dd800),(0x8abf8ed88923 / 0x886c98b76000)], ![(0x9c9e13178cf / 0x886c98b76000),(0x8f0da94824d / 0x12309ce54000),(0x8abf8ed88923 / 0x886c98b76000),(-1 / 2)]],[((-0x252f6212923 / 0x110d9316ec000), ![0,0,1, -1]),((0x252f6212923 / 0x110d9316ec000), ![0,0,3, -1]),((0x636cb2a529 / 0x16bcc41e9000), ![0,1, -3,0]),((0x9c9e13178cf / 0x110d9316ec000), ![0,1,0, -3]),((0x1456a0079b143 / 0xb5e620f48000), ![0,1,0, -1]),((-1 / 2), ![0,3, -2, -1]),((1 / 2), ![0,3, -2,1]),((-0x636cb2a529 / 0x16bcc41e9000), ![0,3, -1,0]),((0x1143f85f3421 / 0x221b262dd8000), ![0,3,0, -1]),((1 / 2), ![0,3,2, -1]),((-0x252f6212923 / 0x110d9316ec000), ![1, -3,0,0]),((-1 / 2), ![1, -2, -3,0]),((1 / 2), ![1, -2,3,0]),((0x252f6212923 / 0x110d9316ec000), ![1, -1,0,0]),((-0x1143f85f3421 / 0x221b262dd8000), ![1,0, -3,0]),((-0x1456a0079b143 / 0xb5e620f48000), ![1,0, -1,0]),((1 / 2), ![1,2, -3,0]),((-0x9c9e13178cf / 0x110d9316ec000), ![3,0, -1,0])]) private def zz110:"s006e"="s006e":=by decide+kernel theorem quad5Degree0_identity:identityCheck quad5Degree0 quad5Degree0Rewrites quad5Degree0Target = true:=by decide +kernel def quad5Degree1:Expression:=quadComponent rows 1 1 1 true def quad5Degree1Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Degree1Target:NormalForm:=(![![(0x1af0b / 0x2540be40),0,(3 / 20),(-0x6fa4ad1 / 0x59682f00)], ![0,0,(-0x13d829af / 0x59682f00),(3 / 20)], ![(3 / 20),(-0x13d829af / 0x59682f00),(0x1af0b / 0x2540be40),(-0x1af0b / 0x4a817c80)], ![(-0x6fa4ad1 / 0x59682f00),(3 / 20),(-0x1af0b / 0x4a817c80),0]],[((0x1af0b / 0x9502f900), ![0,0,1, -3]),((-0x1af0b / 0x1dcd6500), ![0,0,1, -1]),((0x1af0b / 0x1dcd6500), ![1, -1,0,0]),((-0x1af0b / 0x9502f900), ![3, -1,0,0])]) theorem quad5Degree1_identity:identityCheck quad5Degree1 quad5Degree1Rewrites quad5Degree1Target = true:=by decide +kernel def quad5Degree2:Expression:=quadComponent rows 2 1 1 true def quad5Degree2Rewrites:Rewrites:=[RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Degree2Target:NormalForm:=(![![(-0x51e847 / 0x17d78400),(0xc1 / 0xbebc20),(0x13a6869 / 0xee6b2800),(0x603ba3 / 0x3b9aca00)], ![(0xc1 / 0xbebc20),(0x51e847 / 0x17d78400),(0x3a97 / 0x3b9aca00),(-0x1f8aa5d / 0xee6b2800)], ![(0x13a6869 / 0xee6b2800),(0x3a97 / 0x3b9aca00),0,(0xc1 / 0xbebc20)], ![(0x603ba3 / 0x3b9aca00),(-0x1f8aa5d / 0xee6b2800),(0xc1 / 0xbebc20),0]],[((-0x51e847 / 0x17d78400), ![0,1,0, -1]),((0x51e847 / 0x17d78400), ![1,0, -1,0])]) theorem quad5Degree2_identity:identityCheck quad5Degree2 quad5Degree2Rewrites quad5Degree2Target = true:=by decide +kernel noncomputable def quad5Polynomial (t:ℝ) (x:Point):ℝ := normalEval quad5Degree0Target x + t * normalEval quad5Degree1Target x + t ^ 2 * normalEval quad5Degree2Target x theorem quad5_eval (t:ℝ) (x:Point) : parameterEval (fun d => quadComponent rows d 1 1 true) t x = quad5Polynomial t x:=by change expressionEval quad5Degree0 x + t * expressionEval quad5Degree1 x + t ^ 2 * expressionEval quad5Degree2 x = _ rw [identityCheck_sound quad5Degree0 quad5Degree0Rewrites quad5Degree0Target x quad5Degree0_identity,identityCheck_sound quad5Degree1 quad5Degree1Rewrites quad5Degree1Target x quad5Degree1_identity,identityCheck_sound quad5Degree2 quad5Degree2Rewrites quad5Degree2Target x quad5Degree2_identity] rfl def pair6Degree0:Expression:=pairComponent rows 0 0 0 false def pair6Degree0Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair6Degree0Target:NormalForm:=(![![0,0,0,0], ![0,0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) private def zz111:"s006f"="s006f":=by decide+kernel theorem pair6Degree0_identity:identityCheck pair6Degree0 pair6Degree0Rewrites pair6Degree0Target = true:=by decide +kernel def pair6Degree1:Expression:=pairComponent rows 1 0 0 false def pair6Degree1Rewrites:Rewrites:=[] def pair6Degree1Target:NormalForm:=(![![0,0,0,0], ![0,0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) theorem pair6Degree1_identity:identityCheck pair6Degree1 pair6Degree1Rewrites pair6Degree1Target = true:=by decide +kernel def pair6Degree2:Expression:=pairComponent rows 2 0 0 false def pair6Degree2Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26] def pair6Degree2Target:NormalForm:=(![![0,(3 / 0x4e20),0,0], ![(3 / 0x4e20),0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) theorem pair6Degree2_identity:identityCheck pair6Degree2 pair6Degree2Rewrites pair6Degree2Target = true:=by decide +kernel theorem pair6_eval (t:ℝ) (x:Point) : parameterEval (fun d => pairComponent rows d 0 0 false) t x = NearBalancePairs.pair_6 t (x 0) (x 1):=by change expressionEval pair6Degree0 x + t * expressionEval pair6Degree1 x + t ^ 2 * expressionEval pair6Degree2 x = _ rw [identityCheck_sound pair6Degree0 pair6Degree0Rewrites pair6Degree0Target x pair6Degree0_identity,identityCheck_sound pair6Degree1 pair6Degree1Rewrites pair6Degree1Target x pair6Degree1_identity,identityCheck_sound pair6Degree2 pair6Degree2Rewrites pair6Degree2Target x pair6Degree2_identity] norm_num [pair6Degree0Target,pair6Degree1Target,pair6Degree2Target,normalEval,quadraticEval,hingeEval,linearEval,Fin.sum_univ_four,Matrix.cons_val_two,Matrix.cons_val_three,NearBalancePairs.pair_6] all_goals ring_nf private def zz112:"s0070"="s0070":=by decide+kernel theorem pair6_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => pairComponent rows d 0 0 false) t x:=by rw [pair6_eval] exact NearBalancePairs.pair_6_nonneg ht0 ht1 (hx 0) (hx 1) def pair7Degree0:Expression:=pairComponent rows 0 0 0 true def pair7Degree0Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair7Degree0Target:NormalForm:=(![![0,0,0,0], ![0,0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) theorem pair7Degree0_identity:identityCheck pair7Degree0 pair7Degree0Rewrites pair7Degree0Target = true:=by decide +kernel def pair7Degree1:Expression:=pairComponent rows 1 0 0 true def pair7Degree1Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28] def pair7Degree1Target:NormalForm:=(![![(-0x5d42cb / 0x1dcd6500),(0x5d42cb / 0x77359400),0,0], ![(0x5d42cb / 0x77359400),0,0,0], ![0,0,0,0], ![0,0,0,0]],[((-0x5d42cb / 0xee6b2800), ![1, -3,0,0]),((0x5d42cb / 0xee6b2800), ![3, -1,0,0])]) theorem pair7Degree1_identity:identityCheck pair7Degree1 pair7Degree1Rewrites pair7Degree1Target = true:=by decide +kernel def pair7Degree2:Expression:=pairComponent rows 2 0 0 true def pair7Degree2Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27] def pair7Degree2Target:NormalForm:=(![![(0x5d42cb / 0x1dcd6500),(-0x5b6e0b / 0x77359400),0,0], ![(-0x5b6e0b / 0x77359400),0,0,0], ![0,0,0,0], ![0,0,0,0]],[((0x5d42cb / 0xee6b2800), ![1, -3,0,0]),((-0x5d42cb / 0xee6b2800), ![3, -1,0,0])]) theorem pair7Degree2_identity:identityCheck pair7Degree2 pair7Degree2Rewrites pair7Degree2Target = true:=by decide +kernel private def zz113:"s0071"="s0071":=by decide+kernel theorem pair7_eval (t:ℝ) (x:Point) : parameterEval (fun d => pairComponent rows d 0 0 true) t x = NearBalancePairs.pair_7 t (x 0) (x 1):=by change expressionEval pair7Degree0 x + t * expressionEval pair7Degree1 x + t ^ 2 * expressionEval pair7Degree2 x = _ rw [identityCheck_sound pair7Degree0 pair7Degree0Rewrites pair7Degree0Target x pair7Degree0_identity,identityCheck_sound pair7Degree1 pair7Degree1Rewrites pair7Degree1Target x pair7Degree1_identity,identityCheck_sound pair7Degree2 pair7Degree2Rewrites pair7Degree2Target x pair7Degree2_identity] norm_num [pair7Degree0Target,pair7Degree1Target,pair7Degree2Target,normalEval,quadraticEval,hingeEval,linearEval,Fin.sum_univ_four,Matrix.cons_val_two,Matrix.cons_val_three,NearBalancePairs.pair_7] all_goals ring_nf theorem pair7_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => pairComponent rows d 0 0 true) t x:=by rw [pair7_eval] exact NearBalancePairs.pair_7_nonneg ht0 ht1 (hx 0) (hx 1) def pair8Degree0:Expression:=pairComponent rows 0 0 1 false def pair8Degree0Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0] def pair8Degree0Target:NormalForm:=(![![(-0x920eef174c9 / 0x38d7ea4c6800),(0x920eef174c9 / 0xe35fa931a000),0,0], ![(0x920eef174c9 / 0xe35fa931a000),0,0,0], ![0,0,0,0], ![0,0,0,0]],[((-0x920eef174c9 / 0x1c6bf52634000), ![1, -1,0,0]),((0x920eef174c9 / 0x1c6bf52634000), ![3, -1,0,0])]) theorem pair8Degree0_identity:identityCheck pair8Degree0 pair8Degree0Rewrites pair8Degree0Target = true:=by decide +kernel def pair8Degree1:Expression:=pairComponent rows 1 0 1 false def pair8Degree1Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r18,RewriteAtoms.r0] def pair8Degree1Target:NormalForm:=(![![(0x106f8927 / 0x4a817c80),(-0x106f8927 / 0x12a05f200),0,0], ![(-0x106f8927 / 0x12a05f200),0,0,0], ![0,0,0,0], ![0,0,0,0]],[((0x106f8927 / 0x2540be400), ![1, -1,0,0]),((-0x106f8927 / 0x2540be400), ![3, -1,0,0])]) theorem pair8Degree1_identity:identityCheck pair8Degree1 pair8Degree1Rewrites pair8Degree1Target = true:=by decide +kernel def pair8Degree2:Expression:=pairComponent rows 2 0 1 false def pair8Degree2Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r18] def pair8Degree2Target:NormalForm:=(![![(-3 / 50),(0x5f1 / 0x186a0),0,0], ![(0x5f1 / 0x186a0),0,0,0], ![0,0,0,0], ![0,0,0,0]],[((-3 / 0x190), ![1, -1,0,0]),((3 / 0x190), ![3, -1,0,0])]) private def zz114:"s0072"="s0072":=by decide+kernel theorem pair8Degree2_identity:identityCheck pair8Degree2 pair8Degree2Rewrites pair8Degree2Target = true:=by decide +kernel theorem pair8_eval (t:ℝ) (x:Point) : parameterEval (fun d => pairComponent rows d 0 1 false) t x = NearBalancePairs.pair_8 t (x 0) (x 1):=by change expressionEval pair8Degree0 x + t * expressionEval pair8Degree1 x + t ^ 2 * expressionEval pair8Degree2 x = _ rw [identityCheck_sound pair8Degree0 pair8Degree0Rewrites pair8Degree0Target x pair8Degree0_identity,identityCheck_sound pair8Degree1 pair8Degree1Rewrites pair8Degree1Target x pair8Degree1_identity,identityCheck_sound pair8Degree2 pair8Degree2Rewrites pair8Degree2Target x pair8Degree2_identity] norm_num [pair8Degree0Target,pair8Degree1Target,pair8Degree2Target,normalEval,quadraticEval,hingeEval,linearEval,Fin.sum_univ_four,Matrix.cons_val_two,Matrix.cons_val_three,NearBalancePairs.pair_8] all_goals ring_nf theorem pair8_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => pairComponent rows d 0 1 false) t x:=by rw [pair8_eval] exact NearBalancePairs.pair_8_nonneg ht0 ht1 (hx 0) (hx 1) def pair9Degree0:Expression:=pairComponent rows 0 0 1 true def pair9Degree0Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r27,RewriteAtoms.r28] def pair9Degree0Target:NormalForm:=(![![0,0,0,0], ![0,0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) theorem pair9Degree0_identity:identityCheck pair9Degree0 pair9Degree0Rewrites pair9Degree0Target = true:=by decide +kernel def pair9Degree1:Expression:=pairComponent rows 1 0 1 true def pair9Degree1Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r27,RewriteAtoms.r28] def pair9Degree1Target:NormalForm:=(![![0,0,0,0], ![0,0,0,0], ![0,0,0,0], ![0,0,0,0]],[((-0x28901bd / 0xee6b2800), ![1, -3,0,0]),((0x28901bd / 0xee6b2800), ![1, -1,0,0])]) private def zz115:"s0073"="s0073":=by decide+kernel theorem pair9Degree1_identity:identityCheck pair9Degree1 pair9Degree1Rewrites pair9Degree1Target = true:=by decide +kernel def pair9Degree2:Expression:=pairComponent rows 2 0 1 true def pair9Degree2Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair9Degree2Target:NormalForm:=(![![(-1 / 0x3b9aca00),(0xafc81 / 0x165a0bc00),0,0], ![(0xafc81 / 0x165a0bc00),0,0,0], ![0,0,0,0], ![0,0,0,0]],[((0x79b0539 / 0x2cb417800), ![1, -3,0,0]),((-0x1856773 / 0x8f0d1800), ![1, -1,0,0]),((1 / 0x165a0bc00), ![3, -1,0,0])]) theorem pair9Degree2_identity:identityCheck pair9Degree2 pair9Degree2Rewrites pair9Degree2Target = true:=by decide +kernel theorem pair9_eval (t:ℝ) (x:Point) : parameterEval (fun d => pairComponent rows d 0 1 true) t x = NearBalancePairs.pair_9 t (x 0) (x 1):=by change expressionEval pair9Degree0 x + t * expressionEval pair9Degree1 x + t ^ 2 * expressionEval pair9Degree2 x = _ rw [identityCheck_sound pair9Degree0 pair9Degree0Rewrites pair9Degree0Target x pair9Degree0_identity,identityCheck_sound pair9Degree1 pair9Degree1Rewrites pair9Degree1Target x pair9Degree1_identity,identityCheck_sound pair9Degree2 pair9Degree2Rewrites pair9Degree2Target x pair9Degree2_identity] norm_num [pair9Degree0Target,pair9Degree1Target,pair9Degree2Target,normalEval,quadraticEval,hingeEval,linearEval,Fin.sum_univ_four,Matrix.cons_val_two,Matrix.cons_val_three,NearBalancePairs.pair_9] all_goals ring_nf theorem pair9_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => pairComponent rows d 0 1 true) t x:=by rw [pair9_eval] exact NearBalancePairs.pair_9_nonneg ht0 ht1 (hx 0) (hx 1) def pair10Degree0:Expression:=pairComponent rows 0 1 1 false def pair10Degree0Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair10Degree0Target:NormalForm:=(![![(-0x794822419fb / 0x38d7ea4c6800),(0x794822419fb / 0xe35fa931a000),0,0], ![(0x794822419fb / 0xe35fa931a000),0,0,0], ![0,0,0,0], ![0,0,0,0]],[((-0x794822419fb / 0x1c6bf52634000), ![1, -3,0,0]),((0x794822419fb / 0x1c6bf52634000), ![3, -1,0,0])]) private def zz116:"s0074"="s0074":=by decide+kernel theorem pair10Degree0_identity:identityCheck pair10Degree0 pair10Degree0Rewrites pair10Degree0Target = true:=by decide +kernel def pair10Degree1:Expression:=pairComponent rows 1 1 1 false def pair10Degree1Rewrites:Rewrites:=[] def pair10Degree1Target:NormalForm:=(![![0,0,0,0], ![0,0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) theorem pair10Degree1_identity:identityCheck pair10Degree1 pair10Degree1Rewrites pair10Degree1Target = true:=by decide +kernel def pair10Degree2:Expression:=pairComponent rows 2 1 1 false def pair10Degree2Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r27] def pair10Degree2Target:NormalForm:=(![![0,(3 / 0x4e20),0,0], ![(3 / 0x4e20),0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) theorem pair10Degree2_identity:identityCheck pair10Degree2 pair10Degree2Rewrites pair10Degree2Target = true:=by decide +kernel theorem pair10_eval (t:ℝ) (x:Point) : parameterEval (fun d => pairComponent rows d 1 1 false) t x = NearBalancePairs.pair_10 t (x 0) (x 1):=by change expressionEval pair10Degree0 x + t * expressionEval pair10Degree1 x + t ^ 2 * expressionEval pair10Degree2 x = _ rw [identityCheck_sound pair10Degree0 pair10Degree0Rewrites pair10Degree0Target x pair10Degree0_identity,identityCheck_sound pair10Degree1 pair10Degree1Rewrites pair10Degree1Target x pair10Degree1_identity,identityCheck_sound pair10Degree2 pair10Degree2Rewrites pair10Degree2Target x pair10Degree2_identity] norm_num [pair10Degree0Target,pair10Degree1Target,pair10Degree2Target,normalEval,quadraticEval,hingeEval,linearEval,Fin.sum_univ_four,Matrix.cons_val_two,Matrix.cons_val_three,NearBalancePairs.pair_10] all_goals ring_nf private def zz117:"s0075"="s0075":=by decide+kernel theorem pair10_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => pairComponent rows d 1 1 false) t x:=by rw [pair10_eval] exact NearBalancePairs.pair_10_nonneg ht0 ht1 (hx 0) (hx 1) def pair11Degree0:Expression:=pairComponent rows 0 1 1 true def pair11Degree0Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair11Degree0Target:NormalForm:=(![![0,0,0,0], ![0,0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) theorem pair11Degree0_identity:identityCheck pair11Degree0 pair11Degree0Rewrites pair11Degree0Target = true:=by decide +kernel def pair11Degree1:Expression:=pairComponent rows 1 1 1 true def pair11Degree1Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27] def pair11Degree1Target:NormalForm:=(![![(-0x50d21 / 0x12a05f20),(0x50d21 / 0x4a817c80),0,0], ![(0x50d21 / 0x4a817c80),0,0,0], ![0,0,0,0], ![0,0,0,0]],[((-0x50d21 / 0x9502f900), ![1, -3,0,0]),((0x50d21 / 0x9502f900), ![3, -1,0,0])]) theorem pair11Degree1_identity:identityCheck pair11Degree1 pair11Degree1Rewrites pair11Degree1Target = true:=by decide +kernel def pair11Degree2:Expression:=pairComponent rows 2 1 1 true def pair11Degree2Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r27] def pair11Degree2Target:NormalForm:=(![![0,(3 / 0xc350),0,0], ![(3 / 0xc350),0,0,0], ![0,0,0,0], ![0,0,0,0]],[]) theorem pair11Degree2_identity:identityCheck pair11Degree2 pair11Degree2Rewrites pair11Degree2Target = true:=by decide +kernel private def zz118:"s0076"="s0076":=by decide+kernel theorem pair11_eval (t:ℝ) (x:Point) : parameterEval (fun d => pairComponent rows d 1 1 true) t x = NearBalancePairs.pair_11 t (x 0) (x 1):=by change expressionEval pair11Degree0 x + t * expressionEval pair11Degree1 x + t ^ 2 * expressionEval pair11Degree2 x = _ rw [identityCheck_sound pair11Degree0 pair11Degree0Rewrites pair11Degree0Target x pair11Degree0_identity,identityCheck_sound pair11Degree1 pair11Degree1Rewrites pair11Degree1Target x pair11Degree1_identity,identityCheck_sound pair11Degree2 pair11Degree2Rewrites pair11Degree2Target x pair11Degree2_identity] norm_num [pair11Degree0Target,pair11Degree1Target,pair11Degree2Target,normalEval,quadraticEval,hingeEval,linearEval,Fin.sum_univ_four,Matrix.cons_val_two,Matrix.cons_val_three,NearBalancePairs.pair_11] all_goals ring_nf theorem pair11_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => pairComponent rows d 1 1 true) t x:=by rw [pair11_eval] exact NearBalancePairs.pair_11_nonneg ht0 ht1 (hx 0) (hx 1) theorem pair_nonneg_sorted (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (t:ℝ) (ht0:0 ≤ t) (ht1:t ≤ 1) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => pairComponent rows d p q same) t x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair6_nonneg t x ht0 ht1 hx · exact pair7_nonneg t x ht0 ht1 hx · exact pair8_nonneg t x ht0 ht1 hx · exact pair9_nonneg t x ht0 ht1 hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair10_nonneg t x ht0 ht1 hx · exact pair11_nonneg t x ht0 ht1 hx theorem pair_nonneg (p q:Phase) (same:Bool) (t:ℝ) (ht0:0 ≤ t) (ht1:t ≤ 1) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => pairComponent rows d p q same) t x:=by rcases le_total p.val q.val with h | h · exact pair_nonneg_sorted p q h same t ht0 ht1 x hx · rw [← parameterPair_swap rows p q same t x] exact pair_nonneg_sorted q p h same t ht0 ht1 (FullPhaseSymmetry.swapPair x) (FullPhaseSymmetry.swapPair_nonneg x hx) private def zz119:"s0077"="s0077":=by decide+kernel theorem rows_admissible:∀ d,ParityPhaseAggregation.rowsAdmissible (rows d) = true:=by decide +kernel theorem parameter_bound_of_quad_rows {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (hquad:∀ p q same t,0 ≤ t → t ≤ 1 → ∀ x,(∀ i,0 ≤ x i) → 0 ≤ parameterEval (fun d => quadComponent rows d p q same) t x) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : NearBalanceHypothesis (mass u) (mass v) (deficit u) (deficit (interleave u v)) := parameter_bound_of_local_rows h3 h5 rows rows_admissible hquad pair_nonneg u v hu hv end Green24Proof.NearBalanceCertificate private def zz2017:"s07e1"="s07e1":=by decide+kernel end section namespace Green24Proof.ParametricQuadraticCertificates open IntegerQuadraticCertificates (Linear Point linearEval linearEval_neg product Combination combinationCheck combinationCheck_sound cons_constraints quadraticEq quadraticEq_eq_true) abbrev Coefficient:=Fin 3 → ℤ abbrev Quadratic:=Fin 3 → IntegerQuadraticCertificates.Quadratic def coefficientEval (c:Coefficient) (t:ℝ):ℝ:=c 0 + t * c 1 + t ^ 2 * c 2 def quadraticEval (Q:Quadratic) (t:ℝ) (x:Point):ℝ := IntegerQuadraticCertificates.quadraticEval (Q 0) x + t * IntegerQuadraticCertificates.quadraticEval (Q 1) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval (Q 2) x def polynomialEq (Q R:Quadratic):Bool := (List.finRange 3).all fun d => quadraticEq (Q d) (R d) theorem polynomialEq_eq_true (Q R:Quadratic):polynomialEq Q R = true ↔ Q = R:=by simp only [polynomialEq,List.all_eq_true,List.mem_finRange,forall_true_left, quadraticEq_eq_true] exact ⟨funext,fun h i => congrFun h i⟩ theorem quadraticEval_zero (t:ℝ) (x:Point):quadraticEval 0 t x = 0:=by simp [quadraticEval,IntegerQuadraticCertificates.quadraticEval_zero] private def zz120:"s0078"="s0078":=by decide+kernel theorem quadraticEval_add (Q R:Quadratic) (t:ℝ) (x:Point) : quadraticEval (Q + R) t x = quadraticEval Q t x + quadraticEval R t x:=by simp only [quadraticEval,Pi.add_apply,IntegerQuadraticCertificates.quadraticEval_add] ring theorem quadraticEval_smul (c:ℤ) (Q:Quadratic) (t:ℝ) (x:Point) : quadraticEval (c • Q) t x = (c:ℝ) * quadraticEval Q t x:=by simp only [quadraticEval,Pi.smul_apply,IntegerQuadraticCertificates.quadraticEval_smul] ring def coefficientProduct (c:Coefficient) (a b:Linear):Quadratic := fun d => c d • product a b theorem coefficientProduct_eval (c:Coefficient) (a b:Linear) (t:ℝ) (x:Point) : quadraticEval (coefficientProduct c a b) t x = coefficientEval c t * linearEval a x * linearEval b x:=by simp only [quadraticEval,coefficientProduct,coefficientEval, IntegerQuadraticCertificates.quadraticEval_smul, IntegerQuadraticCertificates.quadraticEval_product] ring inductive NonnegativeTerm (n:ℕ) where | square (a b:Linear) | middleSquare (a:Linear) | pair (degree:Fin 3) (i j:Fin n) def termPolynomial {n:ℕ} (C:Fin n → Linear):NonnegativeTerm n → Quadratic | .square a b => ![product a a,product a b + product b a,product b b] | .middleSquare a => ![0,product a a,(-1:ℤ) • product a a] | .pair d i j => let A:=product (C i) (C j) if d = 0 then ![A,(-2:ℤ) • A,A] else if d = 1 then ![0,(2:ℤ) • A,(-2:ℤ) • A] else ![0,0,A] theorem termPolynomial_nonneg {n:ℕ} (C:Fin n → Linear) (v:NonnegativeTerm n) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) : 0 ≤ quadraticEval (termPolynomial C v) t x:=by have h1:0 ≤ 1 - t:=sub_nonneg.mpr ht1 cases v with | square a b => change 0 ≤ IntegerQuadraticCertificates.quadraticEval (product a a) x + t * IntegerQuadraticCertificates.quadraticEval (product a b + product b a) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval (product b b) x simp only [IntegerQuadraticCertificates.quadraticEval_add, IntegerQuadraticCertificates.quadraticEval_product] nlinarith only [sq_nonneg (linearEval a x + t * linearEval b x)] | middleSquare a => change 0 ≤ IntegerQuadraticCertificates.quadraticEval 0 x + t * IntegerQuadraticCertificates.quadraticEval (product a a) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval ((-1:ℤ) • product a a) x simp only [IntegerQuadraticCertificates.quadraticEval_zero, IntegerQuadraticCertificates.quadraticEval_smul, IntegerQuadraticCertificates.quadraticEval_product,Int.cast_neg,Int.cast_one] nlinarith only [mul_nonneg (mul_nonneg ht0 h1) (sq_nonneg (linearEval a x))] | pair d i j => have h:=mul_nonneg (hC i) (hC j) by_cases hd0:d = 0 · simp only [termPolynomial,hd0, ↓reduceIte] change 0 ≤ IntegerQuadraticCertificates.quadraticEval (product (C i) (C j)) x + t * IntegerQuadraticCertificates.quadraticEval ((-2:ℤ) • product (C i) (C j)) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval (product (C i) (C j)) x simp only [IntegerQuadraticCertificates.quadraticEval_smul, IntegerQuadraticCertificates.quadraticEval_product,Int.cast_neg,Int.cast_ofNat] nlinarith only [mul_nonneg (sq_nonneg (1 - t)) h] · by_cases hd1:d = 1 · simp only [termPolynomial,hd1, ↓reduceIte] change 0 ≤ IntegerQuadraticCertificates.quadraticEval 0 x + t * IntegerQuadraticCertificates.quadraticEval ((2:ℤ) • product (C i) (C j)) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval ((-2:ℤ) • product (C i) (C j)) x simp only [IntegerQuadraticCertificates.quadraticEval_zero, IntegerQuadraticCertificates.quadraticEval_smul, IntegerQuadraticCertificates.quadraticEval_product,Int.cast_neg,Int.cast_ofNat] nlinarith only [mul_nonneg (mul_nonneg ht0 h1) h] · simp only [termPolynomial,hd0,hd1, ↓reduceIte] change 0 ≤ IntegerQuadraticCertificates.quadraticEval 0 x + t * IntegerQuadraticCertificates.quadraticEval 0 x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval (product (C i) (C j)) x simpa only [IntegerQuadraticCertificates.quadraticEval_zero, IntegerQuadraticCertificates.quadraticEval_product,mul_zero,zero_add] using mul_nonneg (sq_nonneg t) h abbrev Decomposition (n:ℕ):=List (ℤ × NonnegativeTerm n) def decompositionPolynomial {n:ℕ} (C:Fin n → Linear) (d:Decomposition n):Quadratic := (d.map fun v => v.1 • termPolynomial C v.2).sum def decompositionCheck {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition n):Bool := decide (0 < s) && (d.all fun v => decide (0 ≤ v.1)) && polynomialEq (decompositionPolynomial C d) (s • Q) private def zz121:"s0079"="s0079":=by decide+kernel theorem decomposition_nonneg {n:ℕ} (C:Fin n → Linear) (d:Decomposition n) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:(d.all fun v => decide (0 ≤ v.1)) = true) : 0 ≤ quadraticEval (decompositionPolynomial C d) t x:=by induction d with | nil => simp [decompositionPolynomial,quadraticEval_zero] | cons v vs ih => simp only [List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [decompositionPolynomial,List.map_cons,List.sum_cons,quadraticEval_add, quadraticEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (termPolynomial_nonneg C v.2 t x ht0 ht1 hC)) (ih hw.2) theorem decompositionCheck_sound {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition n) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) (h:decompositionCheck C Q s d = true) : 0 ≤ quadraticEval Q t x:=by simp only [decompositionCheck,Bool.and_eq_true,polynomialEq_eq_true,decide_eq_true_eq] at h have hd:=decomposition_nonneg C d t x ht0 ht1 hC h.1.2 rw [h.2,quadraticEval_smul] at hd exact nonneg_of_mul_nonneg_right hd (by exact_mod_cast h.1.1:(0:ℝ) < s) abbrev Hinges:=List (Coefficient × Linear) def hingeEval (hs:Hinges) (t:ℝ) (x:Point):ℝ := (hs.map fun v => coefficientEval v.1 t * max (linearEval v.2 x) 0 ^ 2).sum inductive Certificate:ℕ → Type where | leaf {n:ℕ} (scale:ℤ) (d:Decomposition n):Certificate n | split {n:ℕ} (positive negative:Certificate (n + 1)):Certificate n | cut {n:ℕ} (a:Linear) (positive negative:Certificate (n + 1)):Certificate n | positive {n:ℕ} (scale:ℤ) (w:Combination n) (next:Certificate (n + 1)):Certificate n | negative {n:ℕ} (scale:ℤ) (w:Combination n) (next:Certificate (n + 1)):Certificate n def check {n:ℕ} (cert:Certificate n) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges):Bool := match cert,hs with | .cut a p m,hs => check p (Fin.cons a C) Q hs && check m (Fin.cons (-a) C) Q hs | .leaf s d,[] => decompositionCheck C Q s d | .split p m,(c,a) :: hs => check p (Fin.cons a C) (Q + coefficientProduct c a a) hs && check m (Fin.cons (-a) C) Q hs | .positive s w p,(c,a) :: hs => combinationCheck C s w a && check p (Fin.cons a C) (Q + coefficientProduct c a a) hs | .negative s w m,(_,a) :: hs => combinationCheck C s w (-a) && check m (Fin.cons (-a) C) Q hs | _,_ => false theorem positive_step (Q:Quadratic) (c:Coefficient) (a:Linear) (hs:Hinges) (t:ℝ) (x:Point) (ha:0 ≤ linearEval a x) (h:0 ≤ quadraticEval (Q + coefficientProduct c a a) t x + hingeEval hs t x) : 0 ≤ quadraticEval Q t x + hingeEval ((c,a) :: hs) t x:=by simpa only [hingeEval,List.map_cons,List.sum_cons,max_eq_left ha,quadraticEval_add, coefficientProduct_eval,pow_two,mul_assoc,add_assoc] using h theorem negative_step (Q:Quadratic) (c:Coefficient) (a:Linear) (hs:Hinges) (t:ℝ) (x:Point) (ha:linearEval a x ≤ 0) (h:0 ≤ quadraticEval Q t x + hingeEval hs t x) : 0 ≤ quadraticEval Q t x + hingeEval ((c,a) :: hs) t x:=by simpa only [hingeEval,List.map_cons,List.sum_cons,max_eq_right ha, zero_pow (by decide:2 ≠ 0),mul_zero,zero_add] using h private def zz122:"s007a"="s007a":=by decide+kernel theorem check_sound {n:ℕ} (cert:Certificate n) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check cert C Q hs = true) : 0 ≤ quadraticEval Q t x + hingeEval hs t x:=by induction cert generalizing Q hs with | leaf s d => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q s d t x ht0 ht1 hC h | cons v vs => simp [check] at h | split p m hp hm => cases hs with | nil => simp [check] at h | cons v vs => rcases v with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact positive_step Q c a vs t x ha (hp (Fin.cons a C) (Q + coefficientProduct c a a) vs (cons_constraints C a x hC ha) h.1) · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact negative_step Q c a vs t x (le_of_not_ge ha) (hm (Fin.cons (-a) C) Q vs (cons_constraints C (-a) x hC ha') h.2) | cut a p m hp hm => simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact hp (Fin.cons a C) Q hs (cons_constraints C a x hC ha) h.1 · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact hm (Fin.cons (-a) C) Q hs (cons_constraints C (-a) x hC ha') h.2 | positive s w p hp => cases hs with | nil => simp [check] at h | cons v vs => rcases v with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w a x hC h.1 exact positive_step Q c a vs t x ha (hp (Fin.cons a C) (Q + coefficientProduct c a a) vs (cons_constraints C a x hC ha) h.2) | negative s w m hm => cases hs with | nil => simp [check] at h | cons v vs => rcases v with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w (-a) x hC h.1 have ha':linearEval a x ≤ 0:=by rw [linearEval_neg] at ha; linarith exact negative_step Q c a vs t x ha' (hm (Fin.cons (-a) C) Q vs (cons_constraints C (-a) x hC ha) h.2) end Green24Proof.ParametricQuadraticCertificates private def zz2018:"s07e2"="s07e2":=by decide+kernel end section namespace Green24Proof.ParametricQuadraticInterop open ParametricQuadraticCertificates open IntegerQuadraticCertificates (Point) open ExpressionCertificates (NormalForm rationalNormal normalEval rationalNormal_eval) def componentHinges (hs:Hinges) (d:Fin 3):IntegerQuadraticCertificates.Hinges := hs.map fun v => (v.1 d,v.2) theorem hingeEval_components (hs:Hinges) (t:ℝ) (x:Point) : hingeEval hs t x = IntegerQuadraticCertificates.hingeEval (componentHinges hs 0) x + t * IntegerQuadraticCertificates.hingeEval (componentHinges hs 1) x + t ^ 2 * IntegerQuadraticCertificates.hingeEval (componentHinges hs 2) x:=by induction hs with | nil => simp [hingeEval,componentHinges,IntegerQuadraticCertificates.hingeEval] | cons v vs ih => simp only [hingeEval,componentHinges,IntegerQuadraticCertificates.hingeEval, List.map_cons,List.sum_cons] at * rw [ih] simp only [coefficientEval] ring def componentNormal (Q:Quadratic) (hs:Hinges) (den:ℤ) (d:Fin 3):NormalForm := rationalNormal (Q d) (componentHinges hs d) den theorem componentNormal_eval (Q:Quadratic) (hs:Hinges) (den:ℤ) (t:ℝ) (x:Point) : normalEval (componentNormal Q hs den 0) x + t * normalEval (componentNormal Q hs den 1) x + t ^ 2 * normalEval (componentNormal Q hs den 2) x = (quadraticEval Q t x + hingeEval hs t x) / den:=by simp only [componentNormal,rationalNormal_eval,quadraticEval,hingeEval_components] ring end Green24Proof.ParametricQuadraticInterop private def zz2019:"s07e3"="s07e3":=by decide+kernel end section namespace Green24Proof.CompactPair structure Quadratic where xx:ℚ xy:ℚ yy:ℚ noncomputable def quadraticEval (q:Quadratic) (x y:ℝ):ℝ := (q.xx:ℝ) * x ^ 2 + (q.xy:ℝ) * x * y + (q.yy:ℝ) * y ^ 2 def boundedCheck (q:Quadratic) (lo hi:ℚ):Bool := decide (lo < hi ∧ 0 ≤ q.xx * lo ^ 2 + q.xy * lo + q.yy ∧ 0 ≤ 2 * q.xx * lo * hi + q.xy * (lo + hi) + 2 * q.yy ∧ 0 ≤ q.xx * hi ^ 2 + q.xy * hi + q.yy) def tailCheck (q:Quadratic) (lo:ℚ):Bool := decide (0 ≤ q.xx ∧ 0 ≤ 2 * q.xx * lo + q.xy ∧ 0 ≤ q.xx * lo ^ 2 + q.xy * lo + q.yy) theorem boundedCheck_sound {q:Quadratic} {lo hi:ℚ} (h:boundedCheck q lo hi = true) {x y:ℝ} (hlo:(lo:ℝ) * y ≤ x) (hhi:x ≤ (hi:ℝ) * y) : 0 ≤ quadraticEval q x y:=by have hh:lo < hi ∧ 0 ≤ q.xx * lo ^ 2 + q.xy * lo + q.yy ∧ 0 ≤ 2 * q.xx * lo * hi + q.xy * (lo + hi) + 2 * q.yy ∧ 0 ≤ q.xx * hi ^ 2 + q.xy * hi + q.yy:=of_decide_eq_true h rcases hh with ⟨hlt,hA,hB,hC⟩ have hltR:(lo:ℝ) < (hi:ℝ):=by exact_mod_cast hlt have hAR:0 ≤ (q.xx:ℝ) * (lo:ℝ) ^ 2 + (q.xy:ℝ) * (lo:ℝ) + q.yy:=by exact_mod_cast hA have hBR:0 ≤ 2 * (q.xx:ℝ) * (lo:ℝ) * (hi:ℝ) + (q.xy:ℝ) * ((lo:ℝ) + (hi:ℝ)) + 2 * (q.yy:ℝ):=by exact_mod_cast hB have hCR:0 ≤ (q.xx:ℝ) * (hi:ℝ) ^ 2 + (q.xy:ℝ) * (hi:ℝ) + q.yy:=by exact_mod_cast hC have hu:0 ≤ (hi:ℝ) * y - x:=sub_nonneg.mpr hhi have hv:0 ≤ x - (lo:ℝ) * y:=sub_nonneg.mpr hlo have hid:((hi:ℝ) - (lo:ℝ)) ^ 2 * quadraticEval q x y = ((q.xx:ℝ) * (lo:ℝ) ^ 2 + (q.xy:ℝ) * (lo:ℝ) + q.yy) * ((hi:ℝ) * y - x) ^ 2 + (2 * (q.xx:ℝ) * (lo:ℝ) * (hi:ℝ) + (q.xy:ℝ) * ((lo:ℝ) + (hi:ℝ)) + 2 * (q.yy:ℝ)) * ((hi:ℝ) * y - x) * (x - (lo:ℝ) * y) + ((q.xx:ℝ) * (hi:ℝ) ^ 2 + (q.xy:ℝ) * (hi:ℝ) + q.yy) * (x - (lo:ℝ) * y) ^ 2:=by unfold quadraticEval ring have hp:0 ≤ ((hi:ℝ) - (lo:ℝ)) ^ 2 * quadraticEval q x y:=by rw [hid] exact add_nonneg (add_nonneg (mul_nonneg hAR (sq_nonneg _)) (mul_nonneg (mul_nonneg hBR hu) hv)) (mul_nonneg hCR (sq_nonneg _)) exact nonneg_of_mul_nonneg_right hp (sq_pos_of_pos (sub_pos.mpr hltR)) private def zz123:"s007b"="s007b":=by decide+kernel theorem tailCheck_sound {q:Quadratic} {lo:ℚ} (h:tailCheck q lo = true) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x) : 0 ≤ quadraticEval q x y:=by have hh:0 ≤ q.xx ∧ 0 ≤ 2 * q.xx * lo + q.xy ∧ 0 ≤ q.xx * lo ^ 2 + q.xy * lo + q.yy:=of_decide_eq_true h rcases hh with ⟨hA,hB,hC⟩ have hAR:0 ≤ (q.xx:ℝ):=by exact_mod_cast hA have hBR:0 ≤ 2 * (q.xx:ℝ) * (lo:ℝ) + q.xy:=by exact_mod_cast hB have hCR:0 ≤ (q.xx:ℝ) * (lo:ℝ) ^ 2 + (q.xy:ℝ) * (lo:ℝ) + q.yy:=by exact_mod_cast hC have hu:0 ≤ x - (lo:ℝ) * y:=sub_nonneg.mpr hlo have hid:quadraticEval q x y = (q.xx:ℝ) * (x - (lo:ℝ) * y) ^ 2 + (2 * (q.xx:ℝ) * (lo:ℝ) + q.xy) * (x - (lo:ℝ) * y) * y + ((q.xx:ℝ) * (lo:ℝ) ^ 2 + (q.xy:ℝ) * (lo:ℝ) + q.yy) * y ^ 2:=by unfold quadraticEval ring rw [hid] exact add_nonneg (add_nonneg (mul_nonneg hAR (sq_nonneg _)) (mul_nonneg (mul_nonneg hBR hu) hy)) (mul_nonneg hCR (sq_nonneg _)) def check (lo:ℚ) (pieces:List (ℚ × Quadratic)) (tail:Quadratic):Bool := match pieces with | [] => tailCheck tail lo | (hi,q) :: rest => boundedCheck q lo hi && check hi rest tail noncomputable def piecewiseEval (pieces:List (ℚ × Quadratic)) (tail:Quadratic) (x y:ℝ):ℝ := match pieces with | [] => quadraticEval tail x y | (hi,q) :: rest => if x ≤ (hi:ℝ) * y then quadraticEval q x y else piecewiseEval rest tail x y theorem check_sound {lo:ℚ} {pieces:List (ℚ × Quadratic)} {tail:Quadratic} (h:check lo pieces tail = true) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x) : 0 ≤ piecewiseEval pieces tail x y:=by induction pieces generalizing lo with | nil => exact tailCheck_sound h hy hlo | cons piece rest ih => rcases piece with ⟨hi,q⟩ have hh:boundedCheck q lo hi = true ∧ check hi rest tail = true := Bool.and_eq_true_iff.mp h by_cases hhi:x ≤ (hi:ℝ) * y · simp only [piecewiseEval,if_pos hhi] exact boundedCheck_sound hh.1 hlo hhi · simp only [piecewiseEval,if_neg hhi] exact ih hh.2 (le_of_lt (lt_of_not_ge hhi)) end Green24Proof.CompactPair private def zz2020:"s07e4"="s07e4":=by decide+kernel end section namespace Green24Proof.CompactPair structure Hinge where weight:ℚ a:ℚ b:ℚ def addQuadratic (q r:Quadratic):Quadratic := ⟨q.xx + r.xx,q.xy + r.xy,q.yy + r.yy⟩ def squareQuadratic (h:Hinge):Quadratic := ⟨h.weight * h.a ^ 2,2 * h.weight * h.a * h.b,h.weight * h.b ^ 2⟩ noncomputable def hingesEval:List Hinge → ℝ → ℝ → ℝ | [],_,_ => 0 | h :: rest,x,y => (h.weight:ℝ) * max ((h.a:ℝ) * x + (h.b:ℝ) * y) 0 ^ 2 + hingesEval rest x y noncomputable def expressionEval (q:Quadratic) (hs:List Hinge) (x y:ℝ):ℝ := quadraticEval q x y + hingesEval hs x y theorem quadraticEval_add (q r:Quadratic) (x y:ℝ) : quadraticEval (addQuadratic q r) x y = quadraticEval q x y + quadraticEval r x y:=by simp only [addQuadratic,quadraticEval,Rat.cast_add] ring theorem quadraticEval_square (h:Hinge) (x y:ℝ) : quadraticEval (squareQuadratic h) x y = (h.weight:ℝ) * ((h.a:ℝ) * x + (h.b:ℝ) * y) ^ 2:=by simp only [squareQuadratic,quadraticEval,Rat.cast_mul,Rat.cast_pow,Rat.cast_ofNat] ring private def zz124:"s007c"="s007c":=by decide+kernel theorem bounded_linear_nonneg {a b lo hi:ℚ} (hlt:lo < hi) (hl:0 ≤ a * lo + b) (hh:0 ≤ a * hi + b) {x y:ℝ} (hlo:(lo:ℝ) * y ≤ x) (hhi:x ≤ (hi:ℝ) * y) : 0 ≤ (a:ℝ) * x + (b:ℝ) * y:=by have hlR:0 ≤ (a:ℝ) * (lo:ℝ) + b:=by exact_mod_cast hl have hhR:0 ≤ (a:ℝ) * (hi:ℝ) + b:=by exact_mod_cast hh have hltR:(lo:ℝ) < (hi:ℝ):=by exact_mod_cast hlt have hid:((hi:ℝ) - (lo:ℝ)) * ((a:ℝ) * x + (b:ℝ) * y) = ((a:ℝ) * (lo:ℝ) + b) * ((hi:ℝ) * y - x) + ((a:ℝ) * (hi:ℝ) + b) * (x - (lo:ℝ) * y):=by ring have hp:0 ≤ ((hi:ℝ) - (lo:ℝ)) * ((a:ℝ) * x + (b:ℝ) * y):=by rw [hid] exact add_nonneg (mul_nonneg hlR (sub_nonneg.mpr hhi)) (mul_nonneg hhR (sub_nonneg.mpr hlo)) exact nonneg_of_mul_nonneg_right hp (sub_pos.mpr hltR) theorem bounded_linear_nonpos {a b lo hi:ℚ} (hlt:lo < hi) (hl:a * lo + b ≤ 0) (hh:a * hi + b ≤ 0) {x y:ℝ} (hlo:(lo:ℝ) * y ≤ x) (hhi:x ≤ (hi:ℝ) * y) : (a:ℝ) * x + (b:ℝ) * y ≤ 0:=by have hn:=bounded_linear_nonneg (a:=-a) (b:=-b) hlt (by linarith) (by linarith) hlo hhi simpa only [Rat.cast_neg,neg_mul, ← neg_add,neg_nonneg] using hn theorem tail_linear_nonneg {a b lo:ℚ} (ha:0 ≤ a) (hl:0 ≤ a * lo + b) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x) : 0 ≤ (a:ℝ) * x + (b:ℝ) * y:=by have haR:0 ≤ (a:ℝ):=by exact_mod_cast ha have hlR:0 ≤ (a:ℝ) * (lo:ℝ) + b:=by exact_mod_cast hl have hid:(a:ℝ) * x + (b:ℝ) * y = (a:ℝ) * (x - (lo:ℝ) * y) + ((a:ℝ) * (lo:ℝ) + b) * y:=by ring rw [hid] exact add_nonneg (mul_nonneg haR (sub_nonneg.mpr hlo)) (mul_nonneg hlR hy) theorem tail_linear_nonpos {a b lo:ℚ} (ha:a ≤ 0) (hl:a * lo + b ≤ 0) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x) : (a:ℝ) * x + (b:ℝ) * y ≤ 0:=by have hn:=tail_linear_nonneg (a:=-a) (b:=-b) (by linarith) (by linarith) hy hlo simpa only [Rat.cast_neg,neg_mul, ← neg_add,neg_nonneg] using hn def boundedSigns (lo hi:ℚ):List Hinge → Bool | [] => true | h :: rest => decide ((0 ≤ h.a * lo + h.b ∧ 0 ≤ h.a * hi + h.b) ∨ (h.a * lo + h.b ≤ 0 ∧ h.a * hi + h.b ≤ 0)) && boundedSigns lo hi rest def boundedNormalize (lo hi:ℚ):List Hinge → Quadratic | [] => ⟨0,0,0⟩ | h :: rest => if 0 ≤ h.a * lo + h.b ∧ 0 ≤ h.a * hi + h.b then addQuadratic (squareQuadratic h) (boundedNormalize lo hi rest) else boundedNormalize lo hi rest def tailSigns (lo:ℚ):List Hinge → Bool | [] => true | h :: rest => decide ((0 ≤ h.a ∧ 0 ≤ h.a * lo + h.b) ∨ (h.a ≤ 0 ∧ h.a * lo + h.b ≤ 0)) && tailSigns lo rest def tailNormalize (lo:ℚ):List Hinge → Quadratic | [] => ⟨0,0,0⟩ | h :: rest => if 0 ≤ h.a ∧ 0 ≤ h.a * lo + h.b then addQuadratic (squareQuadratic h) (tailNormalize lo rest) else tailNormalize lo rest private def zz125:"s007d"="s007d":=by decide+kernel theorem boundedNormalize_sound {lo hi:ℚ} {hs:List Hinge} (hlt:lo < hi) (h:boundedSigns lo hi hs = true) {x y:ℝ} (hlo:(lo:ℝ) * y ≤ x) (hhi:x ≤ (hi:ℝ) * y) : hingesEval hs x y = quadraticEval (boundedNormalize lo hi hs) x y:=by induction hs with | nil => simp [hingesEval,boundedNormalize,quadraticEval] | cons head rest ih => have hh:=Bool.and_eq_true_iff.mp h have hs:(0 ≤ head.a * lo + head.b ∧ 0 ≤ head.a * hi + head.b) ∨ (head.a * lo + head.b ≤ 0 ∧ head.a * hi + head.b ≤ 0):=of_decide_eq_true hh.1 by_cases hp:0 ≤ head.a * lo + head.b ∧ 0 ≤ head.a * hi + head.b · have hn:=bounded_linear_nonneg hlt hp.1 hp.2 hlo hhi simp only [hingesEval,boundedNormalize,if_pos hp,quadraticEval_add, quadraticEval_square,max_eq_left hn,ih hh.2] · have hneg:=hs.resolve_left hp have hn:=bounded_linear_nonpos hlt hneg.1 hneg.2 hlo hhi simp only [hingesEval,boundedNormalize,if_neg hp,max_eq_right hn, zero_pow (by decide:2 ≠ 0),mul_zero,zero_add,ih hh.2] theorem tailNormalize_sound {lo:ℚ} {hs:List Hinge} (h:tailSigns lo hs = true) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x) : hingesEval hs x y = quadraticEval (tailNormalize lo hs) x y:=by induction hs with | nil => simp [hingesEval,tailNormalize,quadraticEval] | cons head rest ih => have hh:=Bool.and_eq_true_iff.mp h have hs:(0 ≤ head.a ∧ 0 ≤ head.a * lo + head.b) ∨ (head.a ≤ 0 ∧ head.a * lo + head.b ≤ 0):=of_decide_eq_true hh.1 by_cases hp:0 ≤ head.a ∧ 0 ≤ head.a * lo + head.b · have hn:=tail_linear_nonneg hp.1 hp.2 hy hlo simp only [hingesEval,tailNormalize,if_pos hp,quadraticEval_add, quadraticEval_square,max_eq_left hn,ih hh.2] · have hneg:=hs.resolve_left hp have hn:=tail_linear_nonpos hneg.1 hneg.2 hy hlo simp only [hingesEval,tailNormalize,if_neg hp,max_eq_right hn, zero_pow (by decide:2 ≠ 0),mul_zero,zero_add,ih hh.2] def boundedExpressionCheck (q:Quadratic) (hs:List Hinge) (lo hi:ℚ):Bool := boundedSigns lo hi hs && boundedCheck (addQuadratic q (boundedNormalize lo hi hs)) lo hi def tailExpressionCheck (q:Quadratic) (hs:List Hinge) (lo:ℚ):Bool := tailSigns lo hs && tailCheck (addQuadratic q (tailNormalize lo hs)) lo theorem boundedExpressionCheck_sound {q:Quadratic} {hs:List Hinge} {lo hi:ℚ} (h:boundedExpressionCheck q hs lo hi = true) {x y:ℝ} (hlo:(lo:ℝ) * y ≤ x) (hhi:x ≤ (hi:ℝ) * y) : 0 ≤ expressionEval q hs x y:=by have hh:=Bool.and_eq_true_iff.mp h have hlt:lo < hi:=(of_decide_eq_true hh.2).1 have hn:=boundedCheck_sound hh.2 hlo hhi rw [quadraticEval_add, ← boundedNormalize_sound hlt hh.1 hlo hhi] at hn exact hn theorem tailExpressionCheck_sound {q:Quadratic} {hs:List Hinge} {lo:ℚ} (h:tailExpressionCheck q hs lo = true) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x):0 ≤ expressionEval q hs x y:=by have hh:=Bool.and_eq_true_iff.mp h have hn:=tailCheck_sound hh.2 hy hlo rw [quadraticEval_add, ← tailNormalize_sound hh.1 hy hlo] at hn exact hn def expressionCheck (q:Quadratic) (hs:List Hinge) (lo:ℚ):List ℚ → Bool | [] => tailExpressionCheck q hs lo | hi :: rest => boundedExpressionCheck q hs lo hi && expressionCheck q hs hi rest private def zz126:"s007e"="s007e":=by decide+kernel theorem expressionCheck_sound {q:Quadratic} {hs:List Hinge} {lo:ℚ} {cuts:List ℚ} (h:expressionCheck q hs lo cuts = true) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x):0 ≤ expressionEval q hs x y:=by induction cuts generalizing lo with | nil => exact tailExpressionCheck_sound h hy hlo | cons hi rest ih => have hh:=Bool.and_eq_true_iff.mp h by_cases hhi:x ≤ (hi:ℝ) * y · exact boundedExpressionCheck_sound hh.1 hlo hhi · exact ih hh.2 (le_of_lt (lt_of_not_ge hhi)) end Green24Proof.CompactPair private def zz2021:"s07e5"="s07e5":=by decide+kernel end section namespace Green24Proof.CompactPair def toNormal (q:Quadratic) (hs:List Hinge):ExpressionCertificates.NormalForm := (![![q.xx,q.xy / 2,0,0], ![q.xy / 2,q.yy,0,0], ![0,0,0,0], ![0,0,0,0]], hs.map fun h => (h.weight, ![h.a,h.b,0,0])) theorem toNormal_eval (q:Quadratic) (hs:List Hinge) (x:QuadraticCertificates.Point) : ExpressionCertificates.normalEval (toNormal q hs) x = expressionEval q hs (x 0) (x 1):=by have hlinear (h:Hinge) : QuadraticCertificates.linearEval ![h.a,h.b,0,0] x = (h.a:ℝ) * x 0 + (h.b:ℝ) * x 1:=by norm_num [QuadraticCertificates.linearEval,Fin.sum_univ_four, Matrix.cons_val_two,Matrix.cons_val_three] have hhinges : QuadraticCertificates.hingeEval (hs.map fun h => (h.weight, ![h.a,h.b,0,0])) x = hingesEval hs (x 0) (x 1):=by induction hs with | nil => simp [QuadraticCertificates.hingeEval,hingesEval] | cons h hs ih => simp only [List.map_cons,QuadraticCertificates.hingeEval, List.map_cons,List.sum_cons,hingesEval] at * rw [hlinear,ih] unfold ExpressionCertificates.normalEval toNormal expressionEval rw [hhinges] congr 1 norm_num [QuadraticCertificates.quadraticEval,quadraticEval, Fin.sum_univ_four,Matrix.cons_val_two,Matrix.cons_val_three] ring end Green24Proof.CompactPair private def zz2022:"s07e6"="s07e6":=by decide+kernel end section namespace Green24Proof.CompactPair def psdCheck (q:Quadratic):Bool := decide (0 ≤ q.xx ∧ 0 ≤ q.yy ∧ q.xy ^ 2 ≤ 4 * q.xx * q.yy) theorem psdCheck_sound {q:Quadratic} (h:psdCheck q = true) (x y:ℝ) : 0 ≤ quadraticEval q x y:=by have hh:0 ≤ q.xx ∧ 0 ≤ q.yy ∧ q.xy ^ 2 ≤ 4 * q.xx * q.yy:=of_decide_eq_true h have hA:0 ≤ (q.xx:ℝ):=by exact_mod_cast hh.1 have hC:0 ≤ (q.yy:ℝ):=by exact_mod_cast hh.2.1 have hdet:(q.xy:ℝ) ^ 2 ≤ 4 * (q.xx:ℝ) * (q.yy:ℝ):=by exact_mod_cast hh.2.2 by_cases hz:(q.xx:ℝ) = 0 · have hB:(q.xy:ℝ) = 0:=by nlinarith [sq_nonneg (q.xy:ℝ)] simp only [quadraticEval,hz,hB,zero_mul,mul_zero,zero_add] exact mul_nonneg hC (sq_nonneg y) · have hpos:0 < (q.xx:ℝ):=lt_of_le_of_ne hA (Ne.symm hz) have hid:(4 * (q.xx:ℝ)) * quadraticEval q x y = (2 * (q.xx:ℝ) * x + (q.xy:ℝ) * y) ^ 2 + (4 * (q.xx:ℝ) * (q.yy:ℝ) - (q.xy:ℝ) ^ 2) * y ^ 2:=by unfold quadraticEval ring have hp:0 ≤ (4 * (q.xx:ℝ)) * quadraticEval q x y:=by rw [hid] exact add_nonneg (sq_nonneg _) (mul_nonneg (sub_nonneg.mpr hdet) (sq_nonneg y)) exact nonneg_of_mul_nonneg_right hp (mul_pos (by norm_num) hpos) def boundedExpressionCheckPSD (q:Quadratic) (hs:List Hinge) (lo hi:ℚ):Bool := decide (lo < hi) && (boundedSigns lo hi hs && (boundedCheck (addQuadratic q (boundedNormalize lo hi hs)) lo hi || psdCheck (addQuadratic q (boundedNormalize lo hi hs)))) def tailExpressionCheckPSD (q:Quadratic) (hs:List Hinge) (lo:ℚ):Bool := tailSigns lo hs && (tailCheck (addQuadratic q (tailNormalize lo hs)) lo || psdCheck (addQuadratic q (tailNormalize lo hs))) theorem boundedExpressionCheckPSD_sound {q:Quadratic} {hs:List Hinge} {lo hi:ℚ} (h:boundedExpressionCheckPSD q hs lo hi = true) {x y:ℝ} (hlo:(lo:ℝ) * y ≤ x) (hhi:x ≤ (hi:ℝ) * y) : 0 ≤ expressionEval q hs x y:=by have hh:=Bool.and_eq_true_iff.mp h have hlt:lo < hi:=of_decide_eq_true hh.1 have hr:=Bool.and_eq_true_iff.mp hh.2 have hn:0 ≤ quadraticEval (addQuadratic q (boundedNormalize lo hi hs)) x y:=by rcases Bool.or_eq_true_iff.mp hr.2 with hc | hc · exact boundedCheck_sound hc hlo hhi · exact psdCheck_sound hc x y rw [quadraticEval_add, ← boundedNormalize_sound hlt hr.1 hlo hhi] at hn exact hn private def zz127:"s007f"="s007f":=by decide+kernel theorem tailExpressionCheckPSD_sound {q:Quadratic} {hs:List Hinge} {lo:ℚ} (h:tailExpressionCheckPSD q hs lo = true) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x):0 ≤ expressionEval q hs x y:=by have hh:=Bool.and_eq_true_iff.mp h have hn:0 ≤ quadraticEval (addQuadratic q (tailNormalize lo hs)) x y:=by rcases Bool.or_eq_true_iff.mp hh.2 with hc | hc · exact tailCheck_sound hc hy hlo · exact psdCheck_sound hc x y rw [quadraticEval_add, ← tailNormalize_sound hh.1 hy hlo] at hn exact hn def expressionCheckPSD (q:Quadratic) (hs:List Hinge) (lo:ℚ):List ℚ → Bool | [] => tailExpressionCheckPSD q hs lo | hi :: rest => boundedExpressionCheckPSD q hs lo hi && expressionCheckPSD q hs hi rest theorem expressionCheckPSD_sound {q:Quadratic} {hs:List Hinge} {lo:ℚ} {cuts:List ℚ} (h:expressionCheckPSD q hs lo cuts = true) {x y:ℝ} (hy:0 ≤ y) (hlo:(lo:ℝ) * y ≤ x):0 ≤ expressionEval q hs x y:=by induction cuts generalizing lo with | nil => exact tailExpressionCheckPSD_sound h hy hlo | cons hi rest ih => have hh:=Bool.and_eq_true_iff.mp h by_cases hhi:x ≤ (hi:ℝ) * y · exact boundedExpressionCheckPSD_sound hh.1 hlo hhi · exact ih hh.2 (le_of_lt (lt_of_not_ge hhi)) end Green24Proof.CompactPair private def zz2023:"s07e7"="s07e7":=by decide+kernel end section namespace Green24Proof.LocalParityFourFifthsPairs def compact_parityFourFifths_pair_6_base:CompactPair.Quadratic:=⟨0,(0x1387 / 0x2faf080),0⟩ def compact_parityFourFifths_pair_6_hinges:List CompactPair.Hinge:=[] noncomputable def parityFourFifths_pair_6 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityFourFifths_pair_6_base compact_parityFourFifths_pair_6_hinges x y def compact_parityFourFifths_pair_6_cuts:List ℚ:=[] theorem compact_parityFourFifths_pair_6_check : CompactPair.expressionCheckPSD compact_parityFourFifths_pair_6_base compact_parityFourFifths_pair_6_hinges 0 compact_parityFourFifths_pair_6_cuts = true := by decide +kernel theorem compact_parityFourFifths_pair_6_representation (x y:ℝ) : parityFourFifths_pair_6 x y = CompactPair.expressionEval compact_parityFourFifths_pair_6_base compact_parityFourFifths_pair_6_hinges x y:=by rfl private def zz128:"s0080"="s0080":=by decide+kernel theorem parityFourFifths_pair_6_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityFourFifths_pair_6 x y:=by rw [compact_parityFourFifths_pair_6_representation] exact CompactPair.expressionCheckPSD_sound compact_parityFourFifths_pair_6_check hy (by simpa using hx) def compact_parityFourFifths_pair_7_base:CompactPair.Quadratic:=⟨(1 / 0xe4e1c0),(0xfa3 / 0x5f5e100),0⟩ def compact_parityFourFifths_pair_7_hinges:List CompactPair.Hinge:=[⟨(1 / 0x7270e00),1, -3⟩,⟨(-1 / 0x7270e00),3, -1⟩] noncomputable def parityFourFifths_pair_7 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityFourFifths_pair_7_base compact_parityFourFifths_pair_7_hinges x y def compact_parityFourFifths_pair_7_cuts:List ℚ:=[(1 / 3),3] theorem compact_parityFourFifths_pair_7_check : CompactPair.expressionCheckPSD compact_parityFourFifths_pair_7_base compact_parityFourFifths_pair_7_hinges 0 compact_parityFourFifths_pair_7_cuts = true := by decide +kernel theorem compact_parityFourFifths_pair_7_representation (x y:ℝ) : parityFourFifths_pair_7 x y = CompactPair.expressionEval compact_parityFourFifths_pair_7_base compact_parityFourFifths_pair_7_hinges x y:=by rfl theorem parityFourFifths_pair_7_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityFourFifths_pair_7 x y:=by rw [compact_parityFourFifths_pair_7_representation] exact CompactPair.expressionCheckPSD_sound compact_parityFourFifths_pair_7_check hy (by simpa using hx) def compact_parityFourFifths_pair_8_base:CompactPair.Quadratic:=⟨0,(0xdab / 0x17d7840),0⟩ def compact_parityFourFifths_pair_8_hinges:List CompactPair.Hinge:=[] noncomputable def parityFourFifths_pair_8 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityFourFifths_pair_8_base compact_parityFourFifths_pair_8_hinges x y def compact_parityFourFifths_pair_8_cuts:List ℚ:=[] private def zz129:"s0081"="s0081":=by decide+kernel theorem compact_parityFourFifths_pair_8_check : CompactPair.expressionCheckPSD compact_parityFourFifths_pair_8_base compact_parityFourFifths_pair_8_hinges 0 compact_parityFourFifths_pair_8_cuts = true := by decide +kernel theorem compact_parityFourFifths_pair_8_representation (x y:ℝ) : parityFourFifths_pair_8 x y = CompactPair.expressionEval compact_parityFourFifths_pair_8_base compact_parityFourFifths_pair_8_hinges x y:=by rfl theorem parityFourFifths_pair_8_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityFourFifths_pair_8 x y:=by rw [compact_parityFourFifths_pair_8_representation] exact CompactPair.expressionCheckPSD_sound compact_parityFourFifths_pair_8_check hy (by simpa using hx) def compact_parityFourFifths_pair_9_base:CompactPair.Quadratic:=⟨0,(0xf99 / 0x2faf080),0⟩ def compact_parityFourFifths_pair_9_hinges:List CompactPair.Hinge:=[] noncomputable def parityFourFifths_pair_9 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityFourFifths_pair_9_base compact_parityFourFifths_pair_9_hinges x y def compact_parityFourFifths_pair_9_cuts:List ℚ:=[] theorem compact_parityFourFifths_pair_9_check : CompactPair.expressionCheckPSD compact_parityFourFifths_pair_9_base compact_parityFourFifths_pair_9_hinges 0 compact_parityFourFifths_pair_9_cuts = true := by decide +kernel private def zz130:"s0082"="s0082":=by decide+kernel theorem compact_parityFourFifths_pair_9_representation (x y:ℝ) : parityFourFifths_pair_9 x y = CompactPair.expressionEval compact_parityFourFifths_pair_9_base compact_parityFourFifths_pair_9_hinges x y:=by rfl theorem parityFourFifths_pair_9_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityFourFifths_pair_9 x y:=by rw [compact_parityFourFifths_pair_9_representation] exact CompactPair.expressionCheckPSD_sound compact_parityFourFifths_pair_9_check hy (by simpa using hx) def compact_parityFourFifths_pair_10_base:CompactPair.Quadratic:=⟨0,(0x3e9 / 0x989680),0⟩ def compact_parityFourFifths_pair_10_hinges:List CompactPair.Hinge:=[] noncomputable def parityFourFifths_pair_10 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityFourFifths_pair_10_base compact_parityFourFifths_pair_10_hinges x y def compact_parityFourFifths_pair_10_cuts:List ℚ:=[] theorem compact_parityFourFifths_pair_10_check : CompactPair.expressionCheckPSD compact_parityFourFifths_pair_10_base compact_parityFourFifths_pair_10_hinges 0 compact_parityFourFifths_pair_10_cuts = true := by decide +kernel theorem compact_parityFourFifths_pair_10_representation (x y:ℝ) : parityFourFifths_pair_10 x y = CompactPair.expressionEval compact_parityFourFifths_pair_10_base compact_parityFourFifths_pair_10_hinges x y:=by rfl private def zz131:"s0083"="s0083":=by decide+kernel theorem parityFourFifths_pair_10_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityFourFifths_pair_10 x y:=by rw [compact_parityFourFifths_pair_10_representation] exact CompactPair.expressionCheckPSD_sound compact_parityFourFifths_pair_10_check hy (by simpa using hx) def compact_parityFourFifths_pair_11_base:CompactPair.Quadratic:=⟨(-1 / 0xe4e1c0),(0x31f / 0x1312d00),0⟩ def compact_parityFourFifths_pair_11_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x7270e00),1, -3⟩,⟨(1 / 0x7270e00),3, -1⟩] noncomputable def parityFourFifths_pair_11 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityFourFifths_pair_11_base compact_parityFourFifths_pair_11_hinges x y def compact_parityFourFifths_pair_11_cuts:List ℚ:=[(1 / 3),3] theorem compact_parityFourFifths_pair_11_check : CompactPair.expressionCheckPSD compact_parityFourFifths_pair_11_base compact_parityFourFifths_pair_11_hinges 0 compact_parityFourFifths_pair_11_cuts = true := by decide +kernel theorem compact_parityFourFifths_pair_11_representation (x y:ℝ) : parityFourFifths_pair_11 x y = CompactPair.expressionEval compact_parityFourFifths_pair_11_base compact_parityFourFifths_pair_11_hinges x y:=by rfl theorem parityFourFifths_pair_11_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityFourFifths_pair_11 x y:=by rw [compact_parityFourFifths_pair_11_representation] exact CompactPair.expressionCheckPSD_sound compact_parityFourFifths_pair_11_check hy (by simpa using hx) end Green24Proof.LocalParityFourFifthsPairs private def zz2024:"s07e8"="s07e8":=by decide+kernel end section namespace Green24Proof.LowerHingeQuadratic open IntegerQuadraticCertificates def lowerMatrix (hs:Hinges):Quadratic := (hs.map fun v => min v.1 0 • product v.2 v.2).sum private def zz132:"s0084"="s0084":=by decide+kernel theorem scalar_lower (c:Int) (z:ℝ) : (min c 0:Int) * z ^ 2 ≤ (c:ℝ) * (max z 0) ^ 2:=by by_cases hz:0 ≤ z · rw [max_eq_left hz] exact mul_le_mul_of_nonneg_right (by exact_mod_cast min_le_left c 0) (sq_nonneg z) · rw [max_eq_right (le_of_not_ge hz),zero_pow (by decide:2 ≠ 0),mul_zero] exact mul_nonpos_of_nonpos_of_nonneg (by exact_mod_cast min_le_right c 0) (sq_nonneg z) theorem lowerMatrix_le (hs:Hinges) (x:Point) : quadraticEval (lowerMatrix hs) x ≤ hingeEval hs x:=by induction hs with | nil => simp [lowerMatrix,hingeEval,quadraticEval_zero] | cons v vs ih => simpa only [lowerMatrix,hingeEval,List.map_cons,List.sum_cons, quadraticEval_add,quadraticEval_smul,quadraticEval_product, ← sq] using add_le_add (scalar_lower v.1 (linearEval v.2 x)) ih theorem nonnegative_of_lower (Q:Quadratic) (hs:Hinges) (x:Point) (h:0 ≤ quadraticEval (Q + lowerMatrix hs) x) : 0 ≤ quadraticEval Q x + hingeEval hs x:=by rw [quadraticEval_add] at h exact le_trans h (add_le_add (le_refl _) (lowerMatrix_le hs x)) end Green24Proof.LowerHingeQuadratic private def zz2025:"s07e9"="s07e9":=by decide+kernel end section namespace Green24Proof.OrthantHingeBounds open IntegerQuadraticCertificates def positivePart (a:Linear):Linear:=fun i => max (a i) 0 def negativePart (a:Linear):Linear:=fun i => max (-a i) 0 theorem eval_positive_nonneg (a:Linear) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ linearEval (positivePart a) x:=by apply Finset.sum_nonneg intro i _ exact mul_nonneg (by exact_mod_cast (le_max_right (a i) 0)) (hx i) private def zz133:"s0085"="s0085":=by decide+kernel theorem eval_negative_nonneg (a:Linear) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ linearEval (negativePart a) x:=by apply Finset.sum_nonneg intro i _ exact mul_nonneg (by exact_mod_cast (le_max_right (-a i) 0)) (hx i) theorem eval_difference (a:Linear) (x:Point) : linearEval a x = linearEval (positivePart a) x - linearEval (negativePart a) x:=by have ha:a = positivePart a + -(negativePart a):=by funext i change a i = max (a i) 0 + -max (-a i) 0 omega calc linearEval a x = linearEval (positivePart a + -(negativePart a)) x:=congrArg (fun b => linearEval b x) ha _ = _:=by rw [linearEval_add,linearEval_neg]; ring theorem hinge_lower (p n:ℝ) (hp:0 ≤ p) (_hn:0 ≤ n) : (p - n) ^ 2 - n ^ 2 ≤ max (p - n) 0 ^ 2:=by by_cases h:0 ≤ p - n · rw [max_eq_left h] nlinarith [sq_nonneg n] · rw [max_eq_right (le_of_not_ge h)] have hprod:=mul_nonneg hp (show 0 ≤ n - p by linarith) nlinarith [sq_nonneg p] theorem hinge_upper (p n:ℝ) (hp:0 ≤ p) (hn:0 ≤ n) : max (p - n) 0 ^ 2 ≤ p ^ 2:=by by_cases h:0 ≤ p - n · rw [max_eq_left h] have hprod:=mul_nonneg hn (show 0 ≤ 2 * p - n by linarith) nlinarith · rw [max_eq_right (le_of_not_ge h)] simpa using sq_nonneg p private def zz134:"s0086"="s0086":=by decide+kernel theorem hinge_upper_square (z:ℝ):max z 0 ^ 2 ≤ z ^ 2:=by by_cases h:0 ≤ z · rw [max_eq_left h] · rw [max_eq_right (le_of_not_ge h)] simpa using sq_nonneg z def squareDifference (a b:Linear):Quadratic := product a a + (-1:ℤ) • product b b theorem eval_squareDifference (a b:Linear) (x:Point) : quadraticEval (squareDifference a b) x = linearEval a x ^ 2 - linearEval b x ^ 2:=by simp only [squareDifference,quadraticEval_add,quadraticEval_smul,quadraticEval_product, Int.cast_neg,Int.cast_one] ring def singleLower (scale c t:ℤ) (a:Linear):Quadratic := if 0 ≤ c then t • squareDifference a (negativePart a) else (scale * c) • product a a + t • squareDifference a (positivePart a) theorem singleLower_le (scale c t:ℤ) (a:Linear) (x:Point) (hx:∀ i,0 ≤ x i) (ht:0 ≤ t) (htc:t ≤ scale * |c|) : quadraticEval (singleLower scale c t a) x ≤ (scale:ℝ) * (c:ℝ) * max (linearEval a x) 0 ^ 2:=by have hp:=eval_positive_nonneg a x hx have hn:=eval_negative_nonneg a x hx have htR:(0:ℝ) ≤ t:=by exact_mod_cast ht have hdiff:=eval_difference a x by_cases hc:0 ≤ c · rw [abs_of_nonneg hc] at htc have htcR:(t:ℝ) ≤ (scale:ℝ) * c:=by exact_mod_cast htc have hl:=hinge_lower (linearEval (positivePart a) x) (linearEval (negativePart a) x) hp hn rw [← hdiff] at hl have h1:=mul_le_mul_of_nonneg_left hl htR have h2:=mul_le_mul_of_nonneg_right htcR (sq_nonneg (max (linearEval a x) 0)) simp only [singleLower,if_pos hc,quadraticEval_smul,eval_squareDifference] exact le_trans h1 h2 · rw [abs_of_neg (lt_of_not_ge hc)] at htc have htcR:(t:ℝ) ≤ (scale:ℝ) * -(c:ℝ):=by exact_mod_cast htc rw [mul_neg] at htcR have hu:=hinge_upper (linearEval (positivePart a) x) (linearEval (negativePart a) x) hp hn rw [← hdiff] at hu have h1:=mul_le_mul_of_nonneg_left (hinge_upper_square (linearEval a x)) (sub_nonneg.mpr htcR) have h2:=mul_le_mul_of_nonneg_left hu htR simp only [singleLower,if_neg hc,quadraticEval_add,quadraticEval_smul, quadraticEval_product,eval_squareDifference,Int.cast_mul] nlinarith def weightsCheck (scale:ℤ):Hinges → List ℤ → Bool | [],[] => true | (c,_) :: hs,t :: ts => decide (0 ≤ t) && decide (t ≤ scale * |c|) && weightsCheck scale hs ts | _,_ => false def lowerMatrix (scale:ℤ):Hinges → List ℤ → Quadratic | (c,a) :: hs,t :: ts => singleLower scale c t a + lowerMatrix scale hs ts | _,_ => 0 theorem lowerMatrix_le (scale:ℤ) (hs:Hinges) (ts:List ℤ) (x:Point) (hx:∀ i,0 ≤ x i) (h:weightsCheck scale hs ts = true) : quadraticEval (lowerMatrix scale hs ts) x ≤ (scale:ℝ) * hingeEval hs x:=by induction hs generalizing ts with | nil => cases ts with | nil => simp [lowerMatrix,hingeEval,quadraticEval_zero] | cons t ts => simp [weightsCheck] at h | cons v vs ih => cases ts with | nil => simp [weightsCheck] at h | cons t ts => rcases v with ⟨c,a⟩ simp only [weightsCheck,Bool.and_eq_true,decide_eq_true_eq] at h have hl:=add_le_add (singleLower_le scale c t a x hx h.1.1 h.1.2) (ih ts h.2) simpa only [lowerMatrix,quadraticEval_add,hingeEval,List.map_cons,List.sum_cons, mul_add,mul_assoc] using hl private def zz135:"s0087"="s0087":=by decide+kernel theorem nonnegative_of_lower (scale:ℤ) (Q:Quadratic) (hs:Hinges) (ts:List ℤ) (x:Point) (hx:∀ i,0 ≤ x i) (hs0:0 < scale) (hw:weightsCheck scale hs ts = true) (h:0 ≤ quadraticEval (scale • Q + lowerMatrix scale hs ts) x) : 0 ≤ quadraticEval Q x + hingeEval hs x:=by have hl:=lowerMatrix_le scale hs ts x hx hw rw [quadraticEval_add,quadraticEval_smul] at h apply nonneg_of_mul_nonneg_right (a:=(scale:ℝ)) · nlinarith · exact_mod_cast hs0 end Green24Proof.OrthantHingeBounds private def zz2026:"s07ea"="s07ea":=by decide+kernel end section namespace Green24Proof.PureCertificateData open IntegerQuadraticCertificates abbrev Reader (α:Type):=StateT (List Nat) Option α def fail {α:Type}:Reader α:=fun _ => none def readNat:Reader Nat | [] => none | a :: rest => some (a,rest) def unzig (a:Nat):Int := if a % 2 = 0 then Int.ofNat (a / 2) else -(Int.ofNat (a / 2)) - 1 def readInt:Reader Int:=do return unzig (← readNat) def readIndex (n:Nat):Reader (Fin n):=do let i ← readNat if h:i < n then return ⟨i,h⟩ else fail def readLinear:Reader Linear:=do let a ← readInt let b ← readInt let c ← readInt let d ← readInt return ![a,b,c,d] def readCombination (n:Nat):Nat → Reader (Combination n) | 0 => pure [] | count + 1 => do let weight ← readInt let i ← readIndex n let rest ← readCombination n count return (weight,i) :: rest def readTerm (n:Nat):Reader (NonnegativeTerm n):=do match ← readNat with | 0 => return .square (← readLinear) | 1 => return .pair (← readIndex n) (← readIndex n) | _ => fail def readDecomposition (n:Nat):Nat → Reader (Decomposition n) | 0 => pure [] | count + 1 => do let weight ← readInt let term ← readTerm n let rest ← readDecomposition n count return (weight,term) :: rest def readTree:Nat → (n:Nat) → Reader (Certificate n) | 0,_ => fail | fuel + 1,n => do match ← readNat with | 0 => let scale ← readInt let count ← readNat return .leaf scale (← readDecomposition n count) | 1 => return .split (← readTree fuel (n + 1)) (← readTree fuel (n + 1)) | 2 => let a ← readLinear return .cut a (← readTree fuel (n + 1)) (← readTree fuel (n + 1)) | 3 => let scale ← readInt let count ← readNat let weights ← readCombination n count return .positive scale weights (← readTree fuel (n + 1)) | 4 => let scale ← readInt let count ← readNat let weights ← readCombination n count return .negative scale weights (← readTree fuel (n + 1)) | _ => fail def decode (fuel n:Nat) (text:String):Certificate n := match (do let data ← (text.splitOn ",").mapM String.toNat? readTree fuel n data:Option (Certificate n × List Nat)) with | some (certificate,[]) => certificate | _ => .leaf 0 [] def readPacked:Nat → Nat → Nat × Nat | 0,data => (0,data) | fuel + 1,data => let byte:=data % 256 if byte < 128 then (byte,data / 256) else let (next,rest):=readPacked fuel (data / 256) (byte % 128 + 128 * next,rest) def unpack:Nat → Nat → List Nat | 0,_ => [] | count + 1,data => let (value,rest):=readPacked 128 data value :: unpack count rest def decodeNumbers (fuel n:Nat) (data:List Nat):Certificate n := match readTree fuel n data with | some (certificate,[]) => certificate | _ => .leaf 0 [] theorem decoded_sound (fuel n:Nat) (text:String) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check (decode fuel n text) C Q hs = true) : 0 ≤ quadraticEval Q x + hingeEval hs x := check_sound (decode fuel n text) C Q hs x hC h end Green24Proof.PureCertificateData private def zz2027:"s07eb"="s07eb":=by decide+kernel end section namespace Green24Proof.IntegerPSDCheck abbrev IntMatrix (n:ℕ):=Fin n → Fin n → ℤ noncomputable def eval {n:ℕ} (Q:IntMatrix n) (x:Fin n → ℝ):ℝ := ∑ i, ∑ j,(Q i j:ℝ) * x i * x j def tail {n:ℕ} (Q:IntMatrix (n + 1)):IntMatrix n := fun i j => Q i.succ j.succ def schur {n:ℕ} (Q:IntMatrix (n + 1)):IntMatrix n := fun i j => Q 0 0 * Q i.succ j.succ - Q 0 i.succ * Q 0 j.succ theorem eval_succ {n:ℕ} (Q:IntMatrix (n + 1)) (x:Fin (n + 1) → ℝ) (hsym:∀ i:Fin n,Q i.succ 0 = Q 0 i.succ) : eval Q x = (Q 0 0:ℝ) * x 0 ^ 2 + 2 * x 0 * (∑ i:Fin n,(Q 0 i.succ:ℝ) * x i.succ) + eval (tail Q) (fun i => x i.succ):=by unfold eval tail rw [Fin.sum_univ_succ] simp_rw [Fin.sum_univ_succ,hsym,Finset.sum_add_distrib] simp_rw [show ∀ i:Fin n,(Q 0 i.succ:ℝ) * x 0 * x i.succ = x 0 * ((Q 0 i.succ:ℝ) * x i.succ) by intro i; ring, show ∀ i:Fin n,(Q 0 i.succ:ℝ) * x i.succ * x 0 = x 0 * ((Q 0 i.succ:ℝ) * x i.succ) by intro i; ring, ← Finset.mul_sum] ring theorem eval_schur {n:ℕ} (Q:IntMatrix (n + 1)) (x:Fin n → ℝ) : eval (schur Q) x = (Q 0 0:ℝ) * eval (tail Q) x - (∑ i,(Q 0 i.succ:ℝ) * x i) ^ 2:=by unfold eval schur tail simp only [Int.cast_sub,Int.cast_mul,sub_mul,Finset.sum_sub_distrib, pow_two,Finset.sum_mul,Finset.mul_sum] congr 1 · apply Finset.sum_congr rfl intro i _ apply Finset.sum_congr rfl intro j _ ring · apply Finset.sum_congr rfl intro i _ apply Finset.sum_congr rfl intro j _ ring def check:(n:ℕ) → IntMatrix n → Bool | 0,_ => true | n + 1,Q => ((List.finRange n).all fun i => Q i.succ 0 == Q 0 i.succ) && if Q 0 0 = 0 then ((List.finRange n).all fun i => Q 0 i.succ == 0) && check n (tail Q) else decide (0 < Q 0 0) && check n (schur Q) private def zz136:"s0088"="s0088":=by decide+kernel theorem check_sound (n:ℕ) (Q:IntMatrix n) (h:check n Q = true) (x:Fin n → ℝ):0 ≤ eval Q x:=by induction n with | zero => simp [eval] | succ n ih => simp only [check,Bool.and_eq_true] at h have hsym:∀ i:Fin n,Q i.succ 0 = Q 0 i.succ:=by simpa only [List.all_eq_true,List.mem_finRange,forall_true_left,beq_iff_eq] using h.1 by_cases hzero:Q 0 0 = 0 · simp only [hzero, ↓reduceIte,Bool.and_eq_true] at h have hrow:∀ i:Fin n,Q 0 i.succ = 0:=by simpa only [List.all_eq_true,List.mem_finRange,forall_true_left,beq_iff_eq] using h.2.1 rw [eval_succ Q x hsym] simpa [hzero,hrow] using ih (tail Q) h.2.2 (fun i => x i.succ) · simp only [hzero, ↓reduceIte,Bool.and_eq_true,decide_eq_true_eq] at h have hp:(0:ℝ) < Q 0 0:=by exact_mod_cast h.2.1 have hs:=ih (schur Q) h.2.2 (fun i => x i.succ) rw [eval_schur] at hs rw [eval_succ Q x hsym] have hsq:=sq_nonneg ((Q 0 0:ℝ) * x 0 + ∑ i:Fin n,(Q 0 i.succ:ℝ) * x i.succ) apply nonneg_of_mul_nonneg_left (b:=(Q 0 0:ℝ)) ?_ hp nlinarith end Green24Proof.IntegerPSDCheck private def zz2028:"s07ec"="s07ec":=by decide+kernel end section namespace Green24Proof.QuadraticCoefficientCheck open IntegerQuadraticCertificates def coefficientEq (Q R:Quadratic):Bool := [(Q 0 0,R 0 0),(Q 1 1,R 1 1),(Q 2 2,R 2 2),(Q 3 3,R 3 3), (Q 0 1 + Q 1 0,R 0 1 + R 1 0),(Q 0 2 + Q 2 0,R 0 2 + R 2 0), (Q 0 3 + Q 3 0,R 0 3 + R 3 0),(Q 1 2 + Q 2 1,R 1 2 + R 2 1), (Q 1 3 + Q 3 1,R 1 3 + R 3 1),(Q 2 3 + Q 3 2,R 2 3 + R 3 2)].all fun entry => entry.1 == entry.2 theorem quadraticEval_coefficients (Q:Quadratic) (x:Point) : quadraticEval Q x = (Q 0 0:ℝ) * x 0 ^ 2 + (Q 1 1:ℝ) * x 1 ^ 2 + (Q 2 2:ℝ) * x 2 ^ 2 + (Q 3 3:ℝ) * x 3 ^ 2 + ((Q 0 1 + Q 1 0:ℤ):ℝ) * x 0 * x 1 + ((Q 0 2 + Q 2 0:ℤ):ℝ) * x 0 * x 2 + ((Q 0 3 + Q 3 0:ℤ):ℝ) * x 0 * x 3 + ((Q 1 2 + Q 2 1:ℤ):ℝ) * x 1 * x 2 + ((Q 1 3 + Q 3 1:ℤ):ℝ) * x 1 * x 3 + ((Q 2 3 + Q 3 2:ℤ):ℝ) * x 2 * x 3:=by simp only [quadraticEval,Fin.sum_univ_four,Int.cast_add] ring theorem coefficientEq_eval_eq (Q R:Quadratic) (h:coefficientEq Q R = true) (x:Point):quadraticEval Q x = quadraticEval R x:=by simp only [coefficientEq,List.all_cons,List.all_nil,Bool.and_eq_true, Bool.and_true,beq_iff_eq] at h rcases h with ⟨h00,h11,h22,h33,h01,h02,h03,h12,h13,h23⟩ simp only [quadraticEval_coefficients,h00,h11,h22,h33, h01,h02,h03,h12,h13,h23] def decompositionCheck {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition n):Bool := decide (0 < s) && (d.all fun term => decide (0 ≤ term.1)) && coefficientEq (decompositionMatrix C d) (s • Q) theorem decompositionCheck_sound {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition n) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:decompositionCheck C Q s d = true) : 0 ≤ quadraticEval Q x:=by simp only [decompositionCheck,Bool.and_eq_true,decide_eq_true_eq] at h have hd:=decomposition_nonneg C d x hC h.1.2 rw [coefficientEq_eval_eq _ _ h.2,quadraticEval_smul] at hd exact nonneg_of_mul_nonneg_right hd (by exact_mod_cast h.1.1:(0:ℝ) < s) private def zz137:"s0089"="s0089":=by decide+kernel theorem of_matrix_check {n:ℕ} (C:Fin n → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition n) (h:IntegerQuadraticCertificates.decompositionCheck C Q s d = true) : decompositionCheck C Q s d = true:=by simp only [IntegerQuadraticCertificates.decompositionCheck,Bool.and_eq_true, quadraticEq_eq_true,decide_eq_true_eq] at h simp only [decompositionCheck,Bool.and_eq_true,decide_eq_true_eq] refine ⟨h.1, ?_⟩ rw [h.2] simp [coefficientEq] end Green24Proof.QuadraticCoefficientCheck private def zz2029:"s07ed"="s07ed":=by decide+kernel end section namespace Green24Proof.CoefficientPSDQuadraticCertificates open IntegerQuadraticCertificates inductive Certificate:ℕ → Type where | psd {n:ℕ}:Certificate n | leaf {n:ℕ} (scale:ℤ) (d:Decomposition n):Certificate n | split {n:ℕ} (positive negative:Certificate (n + 1)):Certificate n | cut {n:ℕ} (a:Linear) (positive negative:Certificate (n + 1)):Certificate n | positive {n:ℕ} (scale:ℤ) (w:Combination n) (next:Certificate (n + 1)):Certificate n | negative {n:ℕ} (scale:ℤ) (w:Combination n) (next:Certificate (n + 1)):Certificate n def check {n:ℕ} (cert:Certificate n) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges):Bool := match cert,hs with | .cut a p m,hs => check p (Fin.cons a C) Q hs && check m (Fin.cons (-a) C) Q hs | .psd,[] => IntegerPSDCheck.check 4 Q | .leaf s d,[] => QuadraticCoefficientCheck.decompositionCheck C Q s d | .split p m,(c,a) :: hs => check p (Fin.cons a C) (Q + c • product a a) hs && check m (Fin.cons (-a) C) Q hs | .positive s w p,(c,a) :: hs => combinationCheck C s w a && check p (Fin.cons a C) (Q + c • product a a) hs | .negative s w m,(_,a) :: hs => combinationCheck C s w (-a) && check m (Fin.cons (-a) C) Q hs | _,_ => false theorem cons_constraints {n:ℕ} (C:Fin n → Linear) (a:Linear) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (ha:0 ≤ linearEval a x) : ∀ i:Fin (n + 1),0 ≤ linearEval ((Fin.cons a C:Fin (n + 1) → Linear) i) x:=by intro i refine Fin.cases ?_ (fun j => ?_) i · simpa using ha · simpa using hC j theorem positive_step (Q:Quadratic) (c:ℤ) (a:Linear) (hs:Hinges) (x:Point) (ha:0 ≤ linearEval a x) (h:0 ≤ quadraticEval (Q + c • product a a) x + hingeEval hs x) : 0 ≤ quadraticEval Q x + hingeEval ((c,a) :: hs) x:=by simpa only [hingeEval,List.map_cons,List.sum_cons,max_eq_left ha,quadraticEval_add, quadraticEval_smul,quadraticEval_product,pow_two,add_assoc] using h theorem negative_step (Q:Quadratic) (c:ℤ) (a:Linear) (hs:Hinges) (x:Point) (ha:linearEval a x ≤ 0) (h:0 ≤ quadraticEval Q x + hingeEval hs x) : 0 ≤ quadraticEval Q x + hingeEval ((c,a) :: hs) x:=by simpa only [hingeEval,List.map_cons,List.sum_cons,max_eq_right ha,zero_pow (by decide:2 ≠ 0), mul_zero,zero_add] using h private def zz138:"s008a"="s008a":=by decide+kernel theorem check_sound {n:ℕ} (cert:Certificate n) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check cert C Q hs = true):0 ≤ quadraticEval Q x + hingeEval hs x:=by induction cert generalizing Q hs with | psd => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero, quadraticEval,IntegerPSDCheck.eval] using IntegerPSDCheck.check_sound 4 Q h x | cons t ts => simp [check] at h | leaf s d => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using QuadraticCoefficientCheck.decompositionCheck_sound C Q s d x hC h | cons t ts => simp [check] at h | split p m hp hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact positive_step Q c a ts x ha (hp (Fin.cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.1) · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact negative_step Q c a ts x (le_of_not_ge ha) (hm (Fin.cons (-a) C) Q ts (cons_constraints C (-a) x hC ha') h.2) | cut a p m hp hm => simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact hp (Fin.cons a C) Q hs (cons_constraints C a x hC ha) h.1 · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact hm (Fin.cons (-a) C) Q hs (cons_constraints C (-a) x hC ha') h.2 | positive s w p hp => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w a x hC h.1 exact positive_step Q c a ts x ha (hp (Fin.cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.2) | negative s w m hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w (-a) x hC h.1 have ha':linearEval a x ≤ 0:=by rw [linearEval_neg] at ha; linarith exact negative_step Q c a ts x ha' (hm (Fin.cons (-a) C) Q ts (cons_constraints C (-a) x hC ha) h.2) end Green24Proof.CoefficientPSDQuadraticCertificates private def zz2030:"s07ee"="s07ee":=by decide+kernel end section namespace Green24Proof.PureIntegerSupportCertificateData open IntegerQuadraticCertificates hiding Certificate check check_sound open CoefficientPSDQuadraticCertificates open PureCertificateData (Reader fail readNat readInt readIndex readLinear readCombination readDecomposition) def liftOption {α:Type} (value:Option α):Reader α := fun rest => value.map fun result => (result,rest) def solveScaled (columns:Array (Array Int)) (target:Array Int) : Option (Int × Array Int):=do let width:=columns.size let height:=target.size let mut rows:=(List.range height).toArray.map fun i => (columns.map fun column => column[i]!).push target[i]! let mut rank:=0 let mut pivots:Array Nat:=#[] let mut previous:Int:=1 for column in [:width] do let mut pivot:Option Nat:=none for i in [rank:height] do if (rows[i]!)[column]! != 0 then pivot:=some i break if let some i:=pivot then let old:=rows[rank]! rows:=(rows.set! rank rows[i]!).set! i old let pivotRow:=rows[rank]! let coefficient:=pivotRow[column]! for j in [:height] do if j != rank then let row:=rows[j]! let entry:=row[column]! rows:=rows.set! j ((List.range (width + 1)).toArray.map fun k => if k == column then 0 else (coefficient * row[k]! - entry * pivotRow[k]!) / previous) previous:=coefficient pivots:=pivots.push column rank:=rank + 1 let mut scale:Nat:=1 for i in [:pivots.size] do scale:=Nat.lcm scale (rows[i]!)[pivots[i]!]!.natAbs let mut solution:Array Int:=Array.replicate width 0 for i in [:pivots.size] do let denominator:=(rows[i]!)[pivots[i]!]! let numerator:=(rows[i]!)[width]! let weight:=numerator * Int.ofNat (scale / denominator.natAbs) solution:=solution.set! pivots[i]! (if denominator < 0 then -weight else weight) return (Int.ofNat scale,solution) def linearColumn (a:Linear):Array Int := (List.finRange 4).toArray.map fun i => a i def pairColumn (a b:Linear):Array Int := #[a 0 * b 0,a 1 * b 1,a 2 * b 2,a 3 * b 3, a 0 * b 1 + a 1 * b 0,a 0 * b 2 + a 2 * b 0, a 0 * b 3 + a 3 * b 0,a 1 * b 2 + a 2 * b 1, a 1 * b 3 + a 3 * b 1,a 2 * b 3 + a 3 * b 2].map fun value => value def matrixColumn (Q:Quadratic):Array Int := #[Q 0 0,Q 1 1,Q 2 2,Q 3 3, Q 0 1 + Q 1 0,Q 0 2 + Q 2 0,Q 0 3 + Q 3 0, Q 1 2 + Q 2 1,Q 1 3 + Q 3 1,Q 2 3 + Q 3 2].map fun value => value def readSupport (n:Nat):Nat → Reader (List (Fin n)) | 0 => pure [] | count + 1 => do let index ← readIndex n return index :: (← readSupport n count) def readPairs (n:Nat):Nat → Reader (List (Fin n × Fin n)) | 0 => pure [] | count + 1 => do let i ← readIndex n let j ← readIndex n return (i,j) :: (← readPairs n count) def recoverLinear {n:Nat} (C:Fin n → Linear) (a:Linear) (support:List (Fin n)):Option (Int × Combination n):=do let (scale,weights) ← solveScaled (support.toArray.map fun i => linearColumn (C i)) (linearColumn a) return (scale,weights.toList.zip support) def recoverLeaf {n:Nat} (C:Fin n → Linear) (Q:Quadratic) (support:List (Fin n × Fin n)):Option (Certificate n):=do let (scale,weights) ← solveScaled (support.toArray.map fun (i,j) => pairColumn (C i) (C j)) (matrixColumn Q) let terms:Decomposition n:=(weights.toList.zip support).map fun (weight,i,j) => (weight, .pair i j) return .leaf scale terms def readTree:Nat → (n:Nat) → (Fin n → Linear) → Quadratic → Hinges → Reader (Certificate n) | 0,_,_,_,_ => fail | fuel + 1,n,C,Q,hs => do match ← readNat with | 0 => let scale ← readInt let count ← readNat return .leaf scale (← readDecomposition n count) | 1 => match hs with | [] => fail | (c,a) :: rest => let p ← readTree fuel (n + 1) (Fin.cons a C) (Q + c • product a a) rest let m ← readTree fuel (n + 1) (Fin.cons (-a) C) Q rest return .split p m | 2 => let a ← readLinear let p ← readTree fuel (n + 1) (Fin.cons a C) Q hs let m ← readTree fuel (n + 1) (Fin.cons (-a) C) Q hs return .cut a p m | 3 => match hs with | [] => fail | (c,a) :: rest => let scale ← readInt let count ← readNat let weights ← readCombination n count return .positive scale weights (← readTree fuel (n + 1) (Fin.cons a C) (Q + c • product a a) rest) | 4 => match hs with | [] => fail | (_,a) :: rest => let scale ← readInt let count ← readNat let weights ← readCombination n count return .negative scale weights (← readTree fuel (n + 1) (Fin.cons (-a) C) Q rest) | 5 => return .psd | 6 => let count ← readNat let support ← readPairs n count liftOption (recoverLeaf C Q support) | 7 => match hs with | [] => fail | (c,a) :: rest => let count ← readNat let support ← readSupport n count let (scale,weights) ← liftOption (recoverLinear C a support) return .positive scale weights (← readTree fuel (n + 1) (Fin.cons a C) (Q + c • product a a) rest) | 8 => match hs with | [] => fail | (_,a) :: rest => let count ← readNat let support ← readSupport n count let (scale,weights) ← liftOption (recoverLinear C (-a) support) return .negative scale weights (← readTree fuel (n + 1) (Fin.cons (-a) C) Q rest) | _ => fail def decode (fuel n:Nat) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges) (data:List Nat):Certificate n := match readTree fuel n C Q hs data with | some (certificate,[]) => certificate | _ => .leaf 0 [] theorem decoded_sound (fuel n:Nat) (C:Fin n → Linear) (Q:Quadratic) (hs:Hinges) (data:List Nat) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check (decode fuel n C Q hs data) C Q hs = true) : 0 ≤ quadraticEval Q x + hingeEval hs x := CoefficientPSDQuadraticCertificates.check_sound (decode fuel n C Q hs data) C Q hs x hC h end Green24Proof.PureIntegerSupportCertificateData private def zz2031:"s07ef"="s07ef":=by decide+kernel end section namespace Green24Proof.ListIntegerElimination def selectPivot:List (List Int) → Option (List Int × List (List Int)) | [] => none | row :: rows => if row.headD 0 != 0 then some (row,rows) else do let (pivot,rest) ← selectPivot rows return (pivot,row :: rest) def normalize (scale:Int) (weights:List Int):Int × List Int := let g:=weights.foldl (fun d w => Nat.gcd d w.natAbs) scale.natAbs let divisor:Int:=if scale < 0 then -(g:Int) else (g:Int) (scale / divisor,weights.map fun w => w / divisor) def solveAux:Nat → Int → List (List Int) → Option (Int × List Int) | 0,_,_ => some (1,[]) | count + 1,previous,rows => do let (pivotRow,rest) ← selectPivot rows let pivot:=pivotRow.headD 0 let reduced:=rest.map fun row => List.zipWith (fun v p => (pivot * v - row.headD 0 * p) / previous) row.tail pivotRow.tail let (scale,weights) ← solveAux count pivot reduced let numerator:=pivotRow.getLastD 0 * scale - (List.zipWith (fun a w => a * w) pivotRow.tail weights).sum return normalize (pivot * scale) (numerator :: weights.map fun w => pivot * w) def solveScaled (columns:Array (Array Int)) (target:Array Int) : Option (Int × Array Int):=do let rows:=(List.range target.size).map fun i => (columns.toList.map fun column => column[i]!) ++ [target[i]!] let (scale,weights) ← solveAux columns.size 1 rows return (scale,weights.toArray) end Green24Proof.ListIntegerElimination private def zz2032:"s07f0"="s07f0":=by decide+kernel end section namespace FixedRowBacksubProbe structure Row where c0:Int c1:Int c2:Int c3:Int c4:Int c5:Int c6:Int c7:Int c8:Int c9:Int rhs:Int def selectPivot:List Row → Option (Row × List Row) | [] => none | row :: rows => if row.c0 != 0 then some (row,rows) else do let (pivot,rest) ← selectPivot rows return (pivot,row :: rest) def reduceRow (previous pivot:Int) (p row:Row):Row := ⟨(pivot * row.c1 - row.c0 * p.c1) / previous, (pivot * row.c2 - row.c0 * p.c2) / previous, (pivot * row.c3 - row.c0 * p.c3) / previous, (pivot * row.c4 - row.c0 * p.c4) / previous, (pivot * row.c5 - row.c0 * p.c5) / previous, (pivot * row.c6 - row.c0 * p.c6) / previous, (pivot * row.c7 - row.c0 * p.c7) / previous, (pivot * row.c8 - row.c0 * p.c8) / previous, (pivot * row.c9 - row.c0 * p.c9) / previous, 0,(pivot * row.rhs - row.c0 * p.rhs) / previous⟩ def dotTail (row:Row) (weights:List Int):Int := (match weights with | [] => 0 | w0 :: ws0 => row.c1 * w0 + (match ws0 with | [] => 0 | w1 :: ws1 => row.c2 * w1 + (match ws1 with | [] => 0 | w2 :: ws2 => row.c3 * w2 + (match ws2 with | [] => 0 | w3 :: ws3 => row.c4 * w3 + (match ws3 with | [] => 0 | w4 :: ws4 => row.c5 * w4 + (match ws4 with | [] => 0 | w5 :: ws5 => row.c6 * w5 + (match ws5 with | [] => 0 | w6 :: ws6 => row.c7 * w6 + (match ws6 with | [] => 0 | w7 :: ws7 => row.c8 * w7 + (match ws7 with | [] => 0 | w8 :: ws8 => row.c9 * w8 + 0))))))))) def solveAux:Nat → Int → List Row → Option (Int × List Int) | 0,_,_ => some (1,[]) | count + 1,previous,rows => do let (pivotRow,rest) ← selectPivot rows let pivot:=pivotRow.c0 if count == 0 then return (pivot.natAbs,[if pivot < 0 then -pivotRow.rhs else pivotRow.rhs]) else let reduced:=rest.map (reduceRow previous pivot pivotRow) let (scale,weights) ← solveAux count pivot reduced let numerator:=pivotRow.rhs * scale - dotTail pivotRow weights return (scale,numerator / pivot :: weights) def solveScaled (columns:Array (Array Int)) (target:Array Int) : Option (Int × Array Int):=do let rows:=(List.range target.size).map fun i => Row.mk ((columns[0]!)[i]!) ((columns[1]!)[i]!) ((columns[2]!)[i]!) ((columns[3]!)[i]!) ((columns[4]!)[i]!) ((columns[5]!)[i]!) ((columns[6]!)[i]!) ((columns[7]!)[i]!) ((columns[8]!)[i]!) ((columns[9]!)[i]!) (target[i]!) let (scale,weights) ← solveAux columns.size 1 rows let result:=Green24Proof.ListIntegerElimination.normalize scale weights return (result.1,result.2.toArray) end FixedRowBacksubProbe namespace Green24Proof.BacksubIntegerElimination open ListIntegerElimination (selectPivot normalize) def solveAux:Nat → Int → List (List Int) → Option (Int × List Int) | 0,_,_ => some (1,[]) | count + 1,previous,rows => do let (pivotRow,rest) ← selectPivot rows let pivot:=pivotRow.headD 0 if count == 0 then return (pivot.natAbs,[if pivot < 0 then -pivotRow.getLastD 0 else pivotRow.getLastD 0]) else let reduced:=rest.map fun row => List.zipWith (fun v p => (pivot * v - row.headD 0 * p) / previous) row.tail pivotRow.tail let (scale,weights) ← solveAux count pivot reduced let numerator:=pivotRow.getLastD 0 * scale - (List.zipWith (fun a w => a * w) pivotRow.tail weights).sum return (scale,numerator / pivot :: weights) def solveScaled:=FixedRowBacksubProbe.solveScaled end Green24Proof.BacksubIntegerElimination private def zz2033:"s07f1"="s07f1":=by decide+kernel end section namespace Green24Proof.OrthantQuadraticCertificates open IntegerQuadraticCertificates (Linear Quadratic Point linearEq linearEq_eq_true linearEval linearEval_zero linearEval_add linearEval_smul linearEval_neg product quadraticEval quadraticEval_zero quadraticEval_add quadraticEval_smul quadraticEval_product Hinges hingeEval positive_step negative_step) abbrev Combination:=List (ℤ × ℕ) def combine (C:ℕ → Linear) (w:Combination):Linear := (w.map fun t => t.1 • C t.2).sum def nonnegativeWeights (w:Combination):Bool := w.all fun t => decide (0 ≤ t.1) theorem combine_nonneg (C:ℕ → Linear) (w:Combination) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:nonnegativeWeights w = true) : 0 ≤ linearEval (combine C w) x:=by induction w with | nil => simp [combine,linearEval_zero] | cons t ts ih => simp only [nonnegativeWeights,List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [combine,List.map_cons,List.sum_cons,linearEval_add,linearEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (hC t.2)) (ih hw.2) inductive NonnegativeTerm where | square (a:Linear) | pair (i j:ℕ) def termMatrix (C:ℕ → Linear):NonnegativeTerm → Quadratic | .square a => product a a | .pair i j => product (C i) (C j) theorem termMatrix_nonneg (C:ℕ → Linear) (t:NonnegativeTerm) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) : 0 ≤ quadraticEval (termMatrix C t) x:=by cases t with | square a => simpa only [termMatrix,quadraticEval_product, ← sq] using sq_nonneg (linearEval a x) | pair i j => simpa only [termMatrix,quadraticEval_product] using mul_nonneg (hC i) (hC j) abbrev Decomposition:=List (ℤ × NonnegativeTerm) def decompositionMatrix (C:ℕ → Linear) (d:Decomposition):Quadratic := (d.map fun t => t.1 • termMatrix C t.2).sum def decompositionCheck (C:ℕ → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition):Bool := decide (0 < s) && (d.all fun t => decide (0 ≤ t.1)) && QuadraticCoefficientCheck.coefficientEq (decompositionMatrix C d) (s • Q) private def zz139:"s008b"="s008b":=by decide+kernel theorem decomposition_nonneg (C:ℕ → Linear) (d:Decomposition) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:(d.all fun t => decide (0 ≤ t.1)) = true) : 0 ≤ quadraticEval (decompositionMatrix C d) x:=by induction d with | nil => simp [decompositionMatrix,quadraticEval_zero] | cons t ts ih => simp only [List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [decompositionMatrix,List.map_cons,List.sum_cons,quadraticEval_add, quadraticEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (termMatrix_nonneg C t.2 x hC)) (ih hw.2) theorem decompositionCheck_sound (C:ℕ → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:decompositionCheck C Q s d = true):0 ≤ quadraticEval Q x:=by simp only [decompositionCheck,Bool.and_eq_true,decide_eq_true_eq] at h have hd:=decomposition_nonneg C d x hC h.1.2 rw [QuadraticCoefficientCheck.coefficientEq_eval_eq _ _ h.2,quadraticEval_smul] at hd exact nonneg_of_mul_nonneg_right hd (by exact_mod_cast h.1.1:(0:ℝ) < s) def combinationCheck (C:ℕ → Linear) (s:ℤ) (w:Combination) (a:Linear):Bool := decide (0 < s) && nonnegativeWeights w && linearEq (combine C w) (s • a) theorem combinationCheck_sound (C:ℕ → Linear) (s:ℤ) (w:Combination) (a:Linear) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:combinationCheck C s w a = true):0 ≤ linearEval a x:=by simp only [combinationCheck,Bool.and_eq_true,linearEq_eq_true,decide_eq_true_eq] at h have ha:=combine_nonneg C w x hC h.1.2 rw [h.2,linearEval_smul] at ha exact nonneg_of_mul_nonneg_right ha (by exact_mod_cast h.1.1:(0:ℝ) < s) abbrev WeightFormula:=List (Nat × Int) abbrev Plan:=List (Nat × Nat × WeightFormula) def coefficient (Q:Quadratic):Nat → Int | 0 => Q 0 0 | 1 => Q 1 1 | 2 => Q 2 2 | 3 => Q 3 3 | 4 => Q 0 1 + Q 1 0 | 5 => Q 0 2 + Q 2 0 | 6 => Q 0 3 + Q 3 0 | 7 => Q 1 2 + Q 2 1 | 8 => Q 1 3 + Q 3 1 | 9 => Q 2 3 + Q 3 2 | _ => 0 def planDecomposition (Q:Quadratic) (rows:Plan):Decomposition := rows.map fun (i,j,terms) => ((terms.map fun (k,multiplier) => multiplier * coefficient Q k).sum, .pair i j) namespace FourBasisRecovery open IntegerQuadraticCertificates (Linear Quadratic) structure Vec where a:Int b:Int c:Int d:Int structure Mat where a:Vec b:Vec c:Vec d:Vec def ofVec (a:Linear):Vec:=⟨a 0,a 1,a 2,a 3⟩ def ofMat (Q:Quadratic):Mat:=⟨ofVec (Q 0),ofVec (Q 1),ofVec (Q 2),ofVec (Q 3)⟩ def dot (a b:Vec):Int:=a.a*b.a+a.b*b.b+a.c*b.c+a.d*b.d def transpose (A:Mat):Mat:=⟨⟨A.a.a,A.b.a,A.c.a,A.d.a⟩,⟨A.a.b,A.b.b,A.c.b,A.d.b⟩,⟨A.a.c,A.b.c,A.c.c,A.d.c⟩,⟨A.a.d,A.b.d,A.c.d,A.d.d⟩⟩ def add (A B:Mat):Mat:=⟨⟨A.a.a+B.a.a,A.a.b+B.a.b,A.a.c+B.a.c,A.a.d+B.a.d⟩,⟨A.b.a+B.b.a,A.b.b+B.b.b,A.b.c+B.b.c,A.b.d+B.b.d⟩,⟨A.c.a+B.c.a,A.c.b+B.c.b,A.c.c+B.c.c,A.c.d+B.c.d⟩,⟨A.d.a+B.d.a,A.d.b+B.d.b,A.d.c+B.d.c,A.d.d+B.d.d⟩⟩ def mul (A B:Mat):Mat := let T:=transpose B ⟨⟨dot A.a T.a,dot A.a T.b,dot A.a T.c,dot A.a T.d⟩,⟨dot A.b T.a,dot A.b T.b,dot A.b T.c,dot A.b T.d⟩,⟨dot A.c T.a,dot A.c T.b,dot A.c T.c,dot A.c T.d⟩,⟨dot A.d T.a,dot A.d T.b,dot A.d T.c,dot A.d T.d⟩⟩ def det3 (a b c d e f g h i:Int):Int:=a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g) def adjugate (A:Mat):Mat:=⟨⟨(det3 A.b.b A.b.c A.b.d A.c.b A.c.c A.c.d A.d.b A.d.c A.d.d),(-(det3 A.a.b A.a.c A.a.d A.c.b A.c.c A.c.d A.d.b A.d.c A.d.d)),(det3 A.a.b A.a.c A.a.d A.b.b A.b.c A.b.d A.d.b A.d.c A.d.d),(-(det3 A.a.b A.a.c A.a.d A.b.b A.b.c A.b.d A.c.b A.c.c A.c.d))⟩,⟨(-(det3 A.b.a A.b.c A.b.d A.c.a A.c.c A.c.d A.d.a A.d.c A.d.d)),(det3 A.a.a A.a.c A.a.d A.c.a A.c.c A.c.d A.d.a A.d.c A.d.d),(-(det3 A.a.a A.a.c A.a.d A.b.a A.b.c A.b.d A.d.a A.d.c A.d.d)),(det3 A.a.a A.a.c A.a.d A.b.a A.b.c A.b.d A.c.a A.c.c A.c.d)⟩,⟨(det3 A.b.a A.b.b A.b.d A.c.a A.c.b A.c.d A.d.a A.d.b A.d.d),(-(det3 A.a.a A.a.b A.a.d A.c.a A.c.b A.c.d A.d.a A.d.b A.d.d)),(det3 A.a.a A.a.b A.a.d A.b.a A.b.b A.b.d A.d.a A.d.b A.d.d),(-(det3 A.a.a A.a.b A.a.d A.b.a A.b.b A.b.d A.c.a A.c.b A.c.d))⟩,⟨(-(det3 A.b.a A.b.b A.b.c A.c.a A.c.b A.c.c A.d.a A.d.b A.d.c)),(det3 A.a.a A.a.b A.a.c A.c.a A.c.b A.c.c A.d.a A.d.b A.d.c),(-(det3 A.a.a A.a.b A.a.c A.b.a A.b.b A.b.c A.d.a A.d.b A.d.c)),(det3 A.a.a A.a.b A.a.c A.b.a A.b.b A.b.c A.c.a A.c.b A.c.c)⟩⟩ def recover (C:Nat → Linear) (Q:Quadratic) (pairs:List (Nat × Nat)):Int × Decomposition := match pairs with | _ :: (i,j) :: (k,l) :: [] => let A:Mat:=⟨ofVec (C i),ofVec (C j),ofVec (C k),ofVec (C l)⟩ let B:=adjugate A let determinant:=dot A.a (transpose B).a let Q:=ofMat Q let R:=mul (transpose B) (mul (add Q (transpose Q)) B) (2*determinant*determinant, [(R.a.a, .pair i i),(R.b.b, .pair j j),(R.c.c, .pair k k),(R.d.d, .pair l l), (R.a.b+R.b.a, .pair i j),(R.a.c+R.c.a, .pair i k),(R.a.d+R.d.a, .pair i l), (R.b.c+R.c.b, .pair j k),(R.b.d+R.d.b, .pair j l),(R.c.d+R.d.c, .pair k l)]) | _ => (0,[]) end FourBasisRecovery def supportDecomposition (C:Nat → Linear) (Q:Quadratic) (pairs:List (Nat × Nat)):Int × Decomposition := if pairs.headD (0,0) == (64,3) then FourBasisRecovery.recover C Q pairs else match BacksubIntegerElimination.solveScaled (pairs.toArray.map fun (i,j) => PureIntegerSupportCertificateData.pairColumn (C i) (C j)) (PureIntegerSupportCertificateData.matrixColumn Q) with | none => (0,[]) | some (scale,weights) => (scale,(weights.toList.zip pairs).map fun (weight,i,j) => (weight, .pair i j)) def mixedSupportDecomposition (C:Nat → Linear) (Q:Quadratic) (pairs:List (Nat × Nat)) (squares:List Linear):Int × Decomposition := let terms:=(pairs.map fun (i,j) => NonnegativeTerm.pair i j) ++ (squares.map NonnegativeTerm.square) match BacksubIntegerElimination.solveScaled (terms.toArray.map fun term => PureIntegerSupportCertificateData.matrixColumn (termMatrix C term)) (PureIntegerSupportCertificateData.matrixColumn Q) with | none => (0,[]) | some (scale,weights) => (scale,weights.toList.zip terms) def expandWeights (scale:ℤ) (hs:Hinges) (weights:List ℤ):List ℤ := (hs.zip weights).map fun (v,t) => if t < 0 then scale * |v.1| else t def cons (a:Linear) (C:ℕ → Linear):ℕ → Linear | 0 => a | i + 1 => C i theorem cons_constraints (C:ℕ → Linear) (a:Linear) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (ha:0 ≤ linearEval a x) : ∀ i,0 ≤ linearEval (cons a C i) x:=by intro i cases i with | zero => exact ha | succ j => exact hC j inductive Certificate:Type where | orthantSupport (scale:ℤ) (weights:List ℤ) (pairs:List (Nat × Nat)):Certificate | mixedSupport (pairs:List (Nat × Nat)) (squares:List Linear):Certificate | lowerSupport (pairs:List (Nat × Nat)):Certificate | lowerPsd:Certificate | support (pairs:List (Nat × Nat)):Certificate | plan (scale:ℤ) (rows:Plan):Certificate | psd:Certificate | leaf (scale:ℤ) (d:Decomposition):Certificate | split (positive negative:Certificate):Certificate | cut (a:Linear) (positive negative:Certificate):Certificate | positive (scale:ℤ) (w:Combination) (next:Certificate):Certificate | negative (scale:ℤ) (w:Combination) (next:Certificate):Certificate def check (cert:Certificate) (C:ℕ → Linear) (Q:Quadratic) (hs:Hinges):Bool := match cert,hs with | .orthantSupport scale weights pairs,hs => let weights:=expandWeights scale hs weights let lower:=scale • Q + OrthantHingeBounds.lowerMatrix scale hs weights let (s,d):=supportDecomposition C lower pairs decide (0 < scale) && OrthantHingeBounds.weightsCheck scale hs weights && decompositionCheck C lower s d | .lowerSupport pairs,hs => let lower:=Q + LowerHingeQuadratic.lowerMatrix hs let (scale,d):=supportDecomposition C lower pairs decompositionCheck C lower scale d | .lowerPsd,hs => IntegerPSDCheck.check 4 (Q + LowerHingeQuadratic.lowerMatrix hs) | .cut a p m,hs => check p (cons a C) Q hs && check m (cons (-a) C) Q hs | .mixedSupport pairs squares,[] => let (scale,d):=mixedSupportDecomposition C Q pairs squares decompositionCheck C Q scale d | .support pairs,[] => let (scale,d):=supportDecomposition C Q pairs decompositionCheck C Q scale d | .plan scale rows,[] => decompositionCheck C Q scale (planDecomposition Q rows) | .psd,[] => IntegerPSDCheck.check 4 Q | .leaf s d,[] => decompositionCheck C Q s d | .split p m,(c,a) :: hs => check p (cons a C) (Q + c • product a a) hs && check m (cons (-a) C) Q hs | .positive s w p,(c,a) :: hs => combinationCheck C s w a && check p (cons a C) (Q + c • product a a) hs | .negative s w m,(_,a) :: hs => combinationCheck C s w (-a) && check m (cons (-a) C) Q hs | _,_ => false private def zz140:"s008c"="s008c":=by decide+kernel theorem check_sound (cert:Certificate) (C:ℕ → Linear) (Q:Quadratic) (hs:Hinges) (x:Point) (hx:∀ i,0 ≤ x i) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check cert C Q hs = true):0 ≤ quadraticEval Q x + hingeEval hs x:=by induction cert generalizing C Q hs with | orthantSupport scale weights pairs => simp only [check,Bool.and_eq_true,decide_eq_true_eq] at h apply OrthantHingeBounds.nonnegative_of_lower scale Q hs (expandWeights scale hs weights) x hx h.1.1 h.1.2 exact decompositionCheck_sound C (scale • Q + OrthantHingeBounds.lowerMatrix scale hs (expandWeights scale hs weights)) (supportDecomposition C (scale • Q + OrthantHingeBounds.lowerMatrix scale hs (expandWeights scale hs weights)) pairs).1 (supportDecomposition C (scale • Q + OrthantHingeBounds.lowerMatrix scale hs (expandWeights scale hs weights)) pairs).2 x hC h.2 | lowerSupport pairs => apply LowerHingeQuadratic.nonnegative_of_lower Q hs x exact decompositionCheck_sound C (Q + LowerHingeQuadratic.lowerMatrix hs) (supportDecomposition C (Q + LowerHingeQuadratic.lowerMatrix hs) pairs).1 (supportDecomposition C (Q + LowerHingeQuadratic.lowerMatrix hs) pairs).2 x hC h | lowerPsd => apply LowerHingeQuadratic.nonnegative_of_lower Q hs x exact IntegerPSDCheck.check_sound 4 (Q + LowerHingeQuadratic.lowerMatrix hs) h x | mixedSupport pairs squares => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q (mixedSupportDecomposition C Q pairs squares).1 (mixedSupportDecomposition C Q pairs squares).2 x hC h | cons t ts => simp [check] at h | support pairs => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q (supportDecomposition C Q pairs).1 (supportDecomposition C Q pairs).2 x hC h | cons t ts => simp [check] at h | plan scale rows => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q scale (planDecomposition Q rows) x hC h | cons t ts => simp [check] at h | psd => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero, quadraticEval,IntegerPSDCheck.eval] using IntegerPSDCheck.check_sound 4 Q h x | cons t ts => simp [check] at h | leaf s d => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q s d x hC h | cons t ts => simp [check] at h | split p m hp hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact positive_step Q c a ts x ha (hp (cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.1) · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact negative_step Q c a ts x (le_of_not_ge ha) (hm (cons (-a) C) Q ts (cons_constraints C (-a) x hC ha') h.2) | cut a p m hp hm => simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact hp (cons a C) Q hs (cons_constraints C a x hC ha) h.1 · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact hm (cons (-a) C) Q hs (cons_constraints C (-a) x hC ha') h.2 | positive s w p hp => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w a x hC h.1 exact positive_step Q c a ts x ha (hp (cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.2) | negative s w m hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w (-a) x hC h.1 have ha':linearEval a x ≤ 0:=by rw [linearEval_neg] at ha; linarith exact negative_step Q c a ts x ha' (hm (cons (-a) C) Q ts (cons_constraints C (-a) x hC ha) h.2) end Green24Proof.OrthantQuadraticCertificates private def zz2034:"s07f2"="s07f2":=by decide+kernel end section namespace Green24Proof.ScalarRowDefaults open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates def constraints:Fin 4 → Linear := ![![1,0,0,0], ![0,1,0,0], ![0,0,1,0], ![0,0,0,1]] def constraintsNat (i:Nat):Linear := constraints ⟨i % 4,Nat.mod_lt _ (by decide)⟩ theorem nonnegative (certificate:Certificate) (Q:Quadratic) (hs:Hinges) (D:Int) (valid:check certificate constraintsNat Q hs = true) (hD:0 ≤ D) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ (quadraticEval Q x + hingeEval hs x) / (D:ℝ):=by apply div_nonneg · apply check_sound certificate constraintsNat Q hs x hx _ valid intro i have hC (j:Fin 4):0 ≤ linearEval (constraints j) x:=by fin_cases j <;> simpa [constraints,linearEval,Fin.sum_univ_succ] using hx _ exact hC ⟨i % 4,Nat.mod_lt _ (by decide)⟩ · exact_mod_cast hD end Green24Proof.ScalarRowDefaults private def zz2035:"s07f3"="s07f3":=by decide+kernel end section namespace Green24Proof.CheckpointPathData open IntegerQuadraticCertificates (Linear Quadratic Hinges product) open OrthantQuadraticCertificates structure State where constraints:Nat → Linear quadratic:Quadratic hinges:Hinges def step (positive:Bool) (s:State):State := match s.hinges with | [] => s | (c,a) :: hs => if positive then ⟨cons a s.constraints,s.quadratic + c • product a a,hs⟩ else ⟨cons (-a) s.constraints,s.quadratic,hs⟩ def follow:Nat → Nat → State → State | 0,_,s => s | fuel + 1,bits,s => if bits < 2 then s else follow fuel (bits / 2) (step (bits % 2 == 1) s) def path (bits:Nat) (s:State):State:=follow 7 bits s def V (certificate:Certificate) (s:State):Prop := check certificate s.constraints s.quadratic s.hinges = true end Green24Proof.CheckpointPathData private def zz2036:"s07f4"="s07f4":=by decide+kernel end section namespace Green24Proof.BranchWitnessAtoms open OrthantQuadraticCertificates def bp (w:Int × Combination) (p:Certificate):Certificate:=.positive w.1 w.2 p def bm (w:Int × Combination) (p:Certificate):Certificate:=.negative w.1 w.2 p def w0:Int × Combination:=(1,[(1,0),(1,1)]) def w1:Int × Combination:=(1,[(1,0),(1,2)]) def w2:Int × Combination:=(1,[(1,0),(1,2),(1,7)]) def w3:Int × Combination:=(1,[(1,0),(1,3)]) def w4:Int × Combination:=(1,[(1,0),(1,3),(1,4)]) def w5:Int × Combination:=(1,[(1,0),(1,4)]) def w6:Int × Combination:=(1,[(1,0),(1,5)]) def w7:Int × Combination:=(1,[(1,0),(1,6)]) def w8:Int × Combination:=(1,[(1,0),(1,7)]) def w9:Int × Combination:=(1,[(1,0),(1,8)]) def w10:Int × Combination:=(1,[(1,0),(1,9)]) def w11:Int × Combination:=(1,[(1,0),(1,10)]) def w12:Int × Combination:=(1,[(1,0),(1,11)]) def w13:Int × Combination:=(1,[(1,0),(1,12)]) def w14:Int × Combination:=(1,[(1,0),(1,13)]) def w15:Int × Combination:=(1,[(1,0),(1,14)]) def w16:Int × Combination:=(1,[(1,0),(1,15)]) def w17:Int × Combination:=(1,[(1,0),(1,16)]) def w18:Int × Combination:=(1,[(1,0),(1,17)]) def w19:Int × Combination:=(1,[(1,0),(1,19)]) def w20:Int × Combination:=(1,[(1,0),(1,20)]) def w21:Int × Combination:=(1,[(1,0),(1,21)]) def w22:Int × Combination:=(1,[(1,0),(2,2)]) def w23:Int × Combination:=(1,[(1,0),(2,3)]) def w24:Int × Combination:=(1,[(1,0),(2,4)]) def w25:Int × Combination:=(1,[(1,0),(2,5)]) def w26:Int × Combination:=(1,[(1,0),(2,15)]) def w27:Int × Combination:=(1,[(1,0),(2,22)]) def w28:Int × Combination:=(1,[(1,0),(3,2)]) def w29:Int × Combination:=(1,[(1,0),(3,4)]) def w30:Int × Combination:=(1,[(1,0),(3,5)]) def w31:Int × Combination:=(1,[(1,0),(3,8)]) def w32:Int × Combination:=(1,[(1,1),(1,2)]) def w33:Int × Combination:=(1,[(1,1),(1,2),(1,8)]) def w34:Int × Combination:=(1,[(1,1),(1,2),(1,9)]) def w35:Int × Combination:=(1,[(1,1),(1,2),(1,10)]) def w36:Int × Combination:=(1,[(1,1),(1,2),(1,12)]) def w37:Int × Combination:=(1,[(1,1),(1,3)]) def w38:Int × Combination:=(1,[(1,1),(1,3),(1,8)]) def w39:Int × Combination:=(1,[(1,1),(1,3),(1,9)]) def w40:Int × Combination:=(1,[(1,1),(1,4)]) def w41:Int × Combination:=(1,[(1,1),(1,5)]) def w42:Int × Combination:=(1,[(1,1),(1,6)]) def w43:Int × Combination:=(1,[(1,1),(1,9)]) def w44:Int × Combination:=(1,[(1,1),(1,10)]) def w45:Int × Combination:=(1,[(1,1),(1,11)]) def w46:Int × Combination:=(1,[(1,1),(1,12)]) def w47:Int × Combination:=(1,[(1,1),(1,13)]) def w48:Int × Combination:=(1,[(1,1),(1,14)]) def w49:Int × Combination:=(1,[(1,1),(1,17)]) def w50:Int × Combination:=(1,[(1,1),(1,19)]) def w51:Int × Combination:=(1,[(1,1),(2,4)]) def w52:Int × Combination:=(1,[(1,1),(2,5)]) def w53:Int × Combination:=(1,[(1,1),(2,6)]) def w54:Int × Combination:=(1,[(1,1),(2,7)]) def w55:Int × Combination:=(1,[(1,1),(3,3)]) def w56:Int × Combination:=(1,[(1,1),(3,4)]) def w57:Int × Combination:=(1,[(1,1),(3,5)]) def w58:Int × Combination:=(1,[(1,1),(3,6)]) def w59:Int × Combination:=(1,[(1,1),(3,9)]) def w60:Int × Combination:=(1,[(1,1),(3,11)]) def w61:Int × Combination:=(1,[(1,1),(3,12)]) def w62:Int × Combination:=(1,[(1,2),(1,3)]) def w63:Int × Combination:=(1,[(1,2),(1,3),(1,11)]) def w64:Int × Combination:=(1,[(1,2),(1,4)]) def w65:Int × Combination:=(1,[(1,2),(1,4),(1,10)]) def w66:Int × Combination:=(1,[(1,2),(1,6)]) def w67:Int × Combination:=(1,[(1,2),(1,7)]) def w68:Int × Combination:=(1,[(1,2),(1,8)]) def w69:Int × Combination:=(1,[(1,2),(1,9)]) def w70:Int × Combination:=(1,[(1,2),(1,10)]) def w71:Int × Combination:=(1,[(1,2),(1,11)]) def w72:Int × Combination:=(1,[(1,2),(1,12)]) def w73:Int × Combination:=(1,[(1,2),(1,13)]) def w74:Int × Combination:=(1,[(1,2),(1,15)]) def w75:Int × Combination:=(1,[(1,2),(1,16)]) def w76:Int × Combination:=(1,[(1,2),(2,4)]) def w77:Int × Combination:=(1,[(1,2),(2,7)]) def w78:Int × Combination:=(1,[(1,2),(2,8)]) def w79:Int × Combination:=(1,[(1,2),(2,16)]) def w80:Int × Combination:=(1,[(1,2),(2,18)]) def w81:Int × Combination:=(1,[(1,2),(3,6)]) def w82:Int × Combination:=(1,[(1,2),(3,7)]) def w83:Int × Combination:=(1,[(1,3),(1,4)]) def w84:Int × Combination:=(1,[(1,3),(1,5)]) def w85:Int × Combination:=(1,[(1,3),(1,7)]) def w86:Int × Combination:=(1,[(1,3),(1,8)]) def w87:Int × Combination:=(1,[(1,3),(1,9)]) def w88:Int × Combination:=(1,[(1,3),(1,10)]) def w89:Int × Combination:=(1,[(1,3),(1,11)]) def w90:Int × Combination:=(1,[(1,3),(1,12)]) def w91:Int × Combination:=(1,[(1,3),(1,13)]) def w92:Int × Combination:=(1,[(1,3),(1,14)]) def w93:Int × Combination:=(1,[(1,3),(1,15)]) def w94:Int × Combination:=(1,[(1,3),(1,16)]) def w95:Int × Combination:=(1,[(1,3),(1,17)]) def w96:Int × Combination:=(1,[(1,3),(2,5)]) def w97:Int × Combination:=(1,[(1,3),(2,6)]) def w98:Int × Combination:=(1,[(1,4),(1,5)]) def w99:Int × Combination:=(1,[(1,4),(1,8)]) def w100:Int × Combination:=(1,[(1,4),(1,12)]) def w101:Int × Combination:=(1,[(1,4),(1,13)]) def w102:Int × Combination:=(1,[(1,4),(1,14)]) def w103:Int × Combination:=(1,[(1,4),(2,6)]) def w104:Int × Combination:=(1,[(1,4),(2,7)]) def w105:Int × Combination:=(1,[(1,5),(1,13)]) def w106:Int × Combination:=(1,[(1,7),(3,12)]) def w107:Int × Combination:=(1,[(1,7),(3,13)]) def w108:Int × Combination:=(1,[(1,8),(3,13)]) def w109:Int × Combination:=(1,[(1,9),(3,14)]) def w110:Int × Combination:=(1,[(1,9),(3,15)]) def w111:Int × Combination:=(1,[(1,10),(3,16)]) def w112:Int × Combination:=(1,[(1,11),(1,17)]) def w113:Int × Combination:=(1,[(1,11),(3,17)]) def w114:Int × Combination:=(1,[(1,12),(1,23)]) def w115:Int × Combination:=(1,[(1,12),(1,25)]) def w116:Int × Combination:=(1,[(1,12),(3,17)]) def w117:Int × Combination:=(1,[(1,12),(3,18)]) def w118:Int × Combination:=(1,[(1,13),(1,26)]) def w119:Int × Combination:=(1,[(1,13),(3,19)]) def w120:Int × Combination:=(1,[(1,14),(3,19)]) def w121:Int × Combination:=(1,[(2,0),(1,3)]) def w122:Int × Combination:=(1,[(2,0),(1,4)]) def w123:Int × Combination:=(1,[(2,0),(1,5)]) def w124:Int × Combination:=(1,[(2,0),(1,6)]) def w125:Int × Combination:=(1,[(2,0),(1,7)]) def w126:Int × Combination:=(1,[(2,0),(1,8)]) def w127:Int × Combination:=(1,[(2,0),(1,9)]) def w128:Int × Combination:=(1,[(2,0),(1,10)]) def w129:Int × Combination:=(1,[(2,0),(1,11)]) def w130:Int × Combination:=(1,[(2,1),(1,5)]) def w131:Int × Combination:=(1,[(2,1),(1,7)]) def w132:Int × Combination:=(1,[(2,1),(1,8)]) def w133:Int × Combination:=(1,[(2,1),(1,9)]) def w134:Int × Combination:=(1,[(2,1),(1,10)]) def w135:Int × Combination:=(1,[(2,1),(1,11)]) def w136:Int × Combination:=(1,[(2,1),(1,12)]) def w137:Int × Combination:=(1,[(2,1),(3,4)]) def w138:Int × Combination:=(1,[(2,1),(3,8)]) def w139:Int × Combination:=(1,[(2,2),(1,3)]) def w140:Int × Combination:=(1,[(2,2),(3,10)]) def w141:Int × Combination:=(1,[(2,2),(3,11)]) def w142:Int × Combination:=(1,[(2,4),(1,7),(1,9)]) def w143:Int × Combination:=(1,[(2,4),(1,10)]) def w144:Int × Combination:=(1,[(2,5),(1,10)]) def w145:Int × Combination:=(1,[(2,5),(1,11)]) def w146:Int × Combination:=(1,[(2,5),(3,8)]) def w147:Int × Combination:=(1,[(2,6),(1,11)]) def w148:Int × Combination:=(1,[(3,0),(2,4)]) def w149:Int × Combination:=(1,[(3,2),(2,8)]) def w150:Int × Combination:=(1,[(3,2),(2,9)]) def w151:Int × Combination:=(1,[(3,2),(2,11)]) def w152:Int × Combination:=(1,[(3,3),(1,11)]) def w153:Int × Combination:=(1,[(3,3),(2,10)]) def w154:Int × Combination:=(1,[(3,3),(2,12)]) def w155:Int × Combination:=(1,[(3,4),(1,10)]) def w156:Int × Combination:=(1,[(3,4),(1,12)]) def w157:Int × Combination:=(1,[(3,4),(2,11)]) def w158:Int × Combination:=(1,[(3,4),(2,13)]) def w159:Int × Combination:=(1,[(3,5),(1,14)]) def w160:Int × Combination:=(1,[(3,7),(1,16)]) def w161:Int × Combination:=(1,[(3,11),(1,15)]) def w162:Int × Combination:=(1,[(3,12),(1,15)]) def w163:Int × Combination:=(2,[(1,0),(1,1),(1,3)]) def w164:Int × Combination:=(2,[(1,0),(1,1),(1,7)]) def w165:Int × Combination:=(2,[(1,0),(1,1),(1,21)]) def w166:Int × Combination:=(2,[(1,0),(1,1),(2,4)]) def w167:Int × Combination:=(2,[(1,0),(1,1),(2,8)]) def w168:Int × Combination:=(2,[(1,0),(1,2),(1,3)]) def w169:Int × Combination:=(2,[(1,0),(1,2),(2,6)]) def w170:Int × Combination:=(2,[(1,0),(1,2),(2,9)]) def w171:Int × Combination:=(2,[(1,0),(1,2),(2,11)]) def w172:Int × Combination:=(2,[(1,0),(1,2),(2,12)]) def w173:Int × Combination:=(2,[(1,0),(1,2),(2,13)]) def w174:Int × Combination:=(2,[(1,0),(1,2),(2,14)]) def w175:Int × Combination:=(2,[(1,0),(1,3)]) def w176:Int × Combination:=(2,[(1,0),(1,3),(1,4)]) def w177:Int × Combination:=(2,[(1,0),(1,3),(2,11)]) def w178:Int × Combination:=(2,[(1,0),(1,3),(2,13)]) def w179:Int × Combination:=(2,[(1,0),(1,3),(2,14)]) def w180:Int × Combination:=(2,[(1,0),(1,4)]) def w181:Int × Combination:=(2,[(1,0),(1,5)]) def w182:Int × Combination:=(2,[(1,0),(1,6)]) def w183:Int × Combination:=(2,[(1,0),(1,7)]) def w184:Int × Combination:=(2,[(1,0),(1,9)]) def w185:Int × Combination:=(2,[(1,0),(1,10)]) def w186:Int × Combination:=(2,[(1,0),(1,12)]) def w187:Int × Combination:=(2,[(1,0),(2,2),(1,5)]) def w188:Int × Combination:=(2,[(1,0),(2,3),(1,13)]) def w189:Int × Combination:=(2,[(1,0),(2,8),(1,10)]) def w190:Int × Combination:=(2,[(1,0),(3,1),(3,2)]) def w191:Int × Combination:=(2,[(1,0),(3,3)]) def w192:Int × Combination:=(2,[(1,0),(3,4)]) def w193:Int × Combination:=(2,[(1,0),(3,8)]) def w194:Int × Combination:=(2,[(1,1),(2,3),(1,13)]) def w195:Int × Combination:=(2,[(1,1),(2,4),(3,6)]) def w196:Int × Combination:=(2,[(1,1),(2,5),(1,9)]) def w197:Int × Combination:=(2,[(1,1),(2,5),(3,7)]) def w198:Int × Combination:=(2,[(1,1),(2,6),(1,10)]) def w199:Int × Combination:=(2,[(1,1),(3,4)]) def w200:Int × Combination:=(2,[(1,1),(3,6),(1,9)]) def w201:Int × Combination:=(2,[(1,2),(1,3),(1,6)]) def w202:Int × Combination:=(2,[(1,2),(1,4),(1,10)]) def w203:Int × Combination:=(2,[(1,2),(2,4),(1,14)]) def w204:Int × Combination:=(2,[(1,2),(2,4),(1,15)]) def w205:Int × Combination:=(2,[(1,2),(3,8)]) def w206:Int × Combination:=(2,[(1,2),(3,10)]) def w207:Int × Combination:=(2,[(1,2),(3,12)]) def w208:Int × Combination:=(2,[(1,3),(3,6),(2,9)]) def w209:Int × Combination:=(2,[(1,3),(3,10)]) def w210:Int × Combination:=(2,[(1,4),(3,13)]) def w211:Int × Combination:=(2,[(2,0),(1,6),(1,8)]) def w212:Int × Combination:=(2,[(2,0),(3,5),(1,7)]) def w213:Int × Combination:=(2,[(2,1),(1,3),(1,11)]) def w214:Int × Combination:=(2,[(2,1),(1,3),(1,12)]) def w215:Int × Combination:=(2,[(3,0),(1,1)]) def w216:Int × Combination:=(2,[(3,0),(1,2)]) def w217:Int × Combination:=(2,[(3,0),(1,4)]) def w218:Int × Combination:=(2,[(3,0),(1,4),(1,8)]) def w219:Int × Combination:=(2,[(3,0),(1,5)]) def w220:Int × Combination:=(2,[(3,0),(1,6)]) def w221:Int × Combination:=(2,[(3,0),(1,6),(1,10)]) def w222:Int × Combination:=(2,[(3,0),(1,7)]) def w223:Int × Combination:=(2,[(3,0),(1,7),(1,12)]) def w224:Int × Combination:=(2,[(3,0),(1,8),(1,13)]) def w225:Int × Combination:=(2,[(3,0),(1,9),(1,13)]) def w226:Int × Combination:=(2,[(3,1),(1,2)]) def w227:Int × Combination:=(2,[(3,1),(1,3)]) def w228:Int × Combination:=(2,[(3,1),(1,3),(2,8)]) def w229:Int × Combination:=(2,[(3,1),(1,4)]) def w230:Int × Combination:=(2,[(3,1),(1,4),(2,9)]) def w231:Int × Combination:=(2,[(3,1),(1,6)]) def w232:Int × Combination:=(2,[(3,1),(1,7)]) def w233:Int × Combination:=(2,[(3,1),(1,7),(1,12)]) def w234:Int × Combination:=(2,[(3,1),(1,7),(2,9)]) def w235:Int × Combination:=(2,[(3,1),(1,7),(3,8)]) def w236:Int × Combination:=(2,[(3,1),(1,8)]) def w237:Int × Combination:=(2,[(3,1),(1,8),(1,12)]) def w238:Int × Combination:=(2,[(3,1),(1,8),(2,9)]) def w239:Int × Combination:=(2,[(3,1),(1,9),(1,12)]) def w240:Int × Combination:=(2,[(3,1),(1,9),(1,14)]) def w241:Int × Combination:=(2,[(3,1),(1,10),(1,14)]) def w242:Int × Combination:=(2,[(3,1),(1,11)]) def w243:Int × Combination:=(2,[(3,1),(3,8),(1,9)]) def w244:Int × Combination:=(2,[(3,2),(1,3)]) def w245:Int × Combination:=(2,[(3,2),(1,4)]) def w246:Int × Combination:=(2,[(3,2),(1,7)]) def w247:Int × Combination:=(2,[(3,2),(1,8)]) def w248:Int × Combination:=(2,[(3,2),(1,9)]) def w249:Int × Combination:=(2,[(3,2),(1,10)]) def w250:Int × Combination:=(2,[(3,2),(1,11)]) def w251:Int × Combination:=(2,[(3,2),(1,12)]) def w252:Int × Combination:=(2,[(3,2),(1,14)]) def w253:Int × Combination:=(2,[(3,2),(2,12),(1,14)]) def w254:Int × Combination:=(2,[(3,3),(1,5)]) def w255:Int × Combination:=(2,[(3,3),(1,11)]) def w256:Int × Combination:=(2,[(3,3),(1,12)]) def w257:Int × Combination:=(2,[(3,3),(1,13)]) def w258:Int × Combination:=(2,[(3,3),(1,15)]) def w259:Int × Combination:=(2,[(3,4),(1,11)]) def w260:Int × Combination:=(2,[(3,4),(1,13)]) def w261:Int × Combination:=(2,[(3,4),(1,14)]) def w262:Int × Combination:=(2,[(3,4),(1,17)]) def w263:Int × Combination:=(3,[(1,0),(1,1),(5,4)]) def w264:Int × Combination:=(3,[(1,0),(2,1),(1,7)]) def w265:Int × Combination:=(3,[(1,0),(2,1),(1,11)]) def w266:Int × Combination:=(3,[(1,0),(2,1),(1,12)]) def w267:Int × Combination:=(3,[(1,0),(2,1),(1,13)]) def w268:Int × Combination:=(3,[(1,0),(2,2),(3,5)]) def w269:Int × Combination:=(3,[(1,0),(2,3)]) def w270:Int × Combination:=(3,[(1,0),(2,4)]) def w271:Int × Combination:=(3,[(1,0),(2,5)]) def w272:Int × Combination:=(3,[(1,0),(2,6)]) def w273:Int × Combination:=(3,[(1,0),(2,7)]) def w274:Int × Combination:=(3,[(1,0),(2,8)]) def w275:Int × Combination:=(3,[(1,0),(2,9)]) def w276:Int × Combination:=(3,[(1,0),(2,10)]) def w277:Int × Combination:=(3,[(1,0),(2,11)]) def w278:Int × Combination:=(3,[(1,0),(3,1),(1,5)]) def w279:Int × Combination:=(3,[(1,0),(3,1),(1,6)]) def w280:Int × Combination:=(3,[(1,0),(3,2),(1,10)]) def w281:Int × Combination:=(3,[(1,0),(3,2),(1,11)]) def w282:Int × Combination:=(3,[(1,0),(3,2),(1,15)]) def w283:Int × Combination:=(3,[(1,0),(3,2),(2,10)]) def w284:Int × Combination:=(3,[(1,0),(3,2),(2,11)]) def w285:Int × Combination:=(3,[(1,0),(3,3),(1,15)]) def w286:Int × Combination:=(3,[(1,0),(3,3),(1,17)]) def w287:Int × Combination:=(3,[(1,0),(3,3),(1,18)]) def w288:Int × Combination:=(3,[(1,0),(3,4),(1,15)]) def w289:Int × Combination:=(3,[(1,0),(3,7),(2,9)]) def w290:Int × Combination:=(3,[(1,0),(4,3)]) def w291:Int × Combination:=(3,[(1,0),(4,4)]) def w292:Int × Combination:=(3,[(1,0),(4,5)]) def w293:Int × Combination:=(3,[(1,0),(4,6)]) def w294:Int × Combination:=(3,[(1,0),(4,7)]) def w295:Int × Combination:=(3,[(1,0),(4,8)]) def w296:Int × Combination:=(3,[(1,0),(4,9)]) def w297:Int × Combination:=(3,[(1,0),(4,10)]) def w298:Int × Combination:=(3,[(1,0),(4,11)]) def w299:Int × Combination:=(3,[(1,0),(4,12)]) def w300:Int × Combination:=(3,[(1,0),(4,13)]) def w301:Int × Combination:=(3,[(1,0),(4,14)]) def w302:Int × Combination:=(3,[(1,0),(8,3)]) def w303:Int × Combination:=(3,[(1,1),(1,2),(5,6)]) def w304:Int × Combination:=(3,[(1,1),(1,2),(5,7)]) def w305:Int × Combination:=(3,[(1,1),(2,3)]) def w306:Int × Combination:=(3,[(1,1),(2,4)]) def w307:Int × Combination:=(3,[(1,1),(2,7)]) def w308:Int × Combination:=(3,[(1,1),(2,9)]) def w309:Int × Combination:=(3,[(1,1),(2,10)]) def w310:Int × Combination:=(3,[(1,1),(2,12)]) def w311:Int × Combination:=(3,[(1,1),(3,2),(1,5)]) def w312:Int × Combination:=(3,[(1,1),(3,2),(1,6)]) def w313:Int × Combination:=(3,[(1,1),(3,2),(1,7)]) def w314:Int × Combination:=(3,[(1,1),(3,2),(1,8)]) def w315:Int × Combination:=(3,[(1,1),(3,7),(2,9)]) def w316:Int × Combination:=(3,[(1,1),(5,4)]) def w317:Int × Combination:=(3,[(1,1),(8,4)]) def w318:Int × Combination:=(3,[(1,4),(5,13)]) def w319:Int × Combination:=(3,[(1,5),(5,13)]) def w320:Int × Combination:=(3,[(1,9),(1,10),(9,17)]) def w321:Int × Combination:=(3,[(1,10),(1,11),(9,17)]) def w322:Int × Combination:=(3,[(1,11),(1,12),(9,19)]) def w323:Int × Combination:=(3,[(1,12),(1,13),(9,17)]) def w324:Int × Combination:=(3,[(1,12),(1,13),(9,19)]) def w325:Int × Combination:=(3,[(1,13),(1,14),(9,20)]) def w326:Int × Combination:=(3,[(1,14),(1,15),(9,22)]) def w327:Int × Combination:=(3,[(1,15),(1,16),(9,23)]) def w328:Int × Combination:=(3,[(1,16),(1,17),(9,23)]) def w329:Int × Combination:=(3,[(2,0),(1,1),(1,9)]) def w330:Int × Combination:=(3,[(2,0),(1,1),(1,11)]) def w331:Int × Combination:=(3,[(2,0),(1,2)]) def w332:Int × Combination:=(3,[(2,0),(1,2),(1,11)]) def w333:Int × Combination:=(3,[(2,0),(1,3)]) def w334:Int × Combination:=(3,[(2,0),(1,3),(4,11)]) def w335:Int × Combination:=(3,[(2,0),(1,5)]) def w336:Int × Combination:=(3,[(2,0),(1,6)]) def w337:Int × Combination:=(3,[(2,0),(1,7)]) def w338:Int × Combination:=(3,[(2,0),(1,8)]) def w339:Int × Combination:=(3,[(2,0),(1,9)]) def w340:Int × Combination:=(3,[(2,0),(1,11)]) def w341:Int × Combination:=(3,[(2,0),(2,1),(1,7)]) def w342:Int × Combination:=(3,[(2,0),(2,2),(1,7)]) def w343:Int × Combination:=(3,[(2,0),(2,2),(1,8)]) def w344:Int × Combination:=(3,[(2,0),(2,3),(1,4)]) def w345:Int × Combination:=(3,[(2,0),(2,3),(1,7)]) def w346:Int × Combination:=(3,[(2,0),(2,3),(1,9)]) def w347:Int × Combination:=(3,[(2,0),(2,3),(1,10)]) def w348:Int × Combination:=(3,[(2,0),(2,4),(1,10)]) def w349:Int × Combination:=(3,[(2,0),(2,4),(1,11)]) def w350:Int × Combination:=(3,[(2,0),(3,3),(1,8)]) def w351:Int × Combination:=(3,[(2,0),(3,4),(1,9)]) def w352:Int × Combination:=(3,[(2,0),(4,2),(1,8)]) def w353:Int × Combination:=(3,[(2,0),(5,3)]) def w354:Int × Combination:=(3,[(2,0),(5,4)]) def w355:Int × Combination:=(3,[(2,0),(5,5)]) def w356:Int × Combination:=(3,[(2,1),(3,5),(1,9)]) def w357:Int × Combination:=(3,[(2,1),(7,4)]) def w358:Int × Combination:=(3,[(2,2),(1,8),(1,12)]) def w359:Int × Combination:=(3,[(3,0),(1,1),(1,4)]) def w360:Int × Combination:=(3,[(3,0),(1,2),(4,4)]) def w361:Int × Combination:=(3,[(3,0),(2,3),(1,12)]) def w362:Int × Combination:=(3,[(4,0),(1,1)]) def w363:Int × Combination:=(3,[(4,0),(1,2)]) def w364:Int × Combination:=(3,[(4,0),(1,3),(1,4)]) def w365:Int × Combination:=(3,[(4,0),(1,4),(1,5)]) def w366:Int × Combination:=(3,[(4,0),(1,8),(1,9)]) def w367:Int × Combination:=(3,[(4,1),(1,3),(3,9)]) def w368:Int × Combination:=(3,[(4,1),(1,3),(3,10)]) def w369:Int × Combination:=(3,[(4,4),(1,8)]) def w370:Int × Combination:=(3,[(5,0),(1,3)]) def w371:Int × Combination:=(3,[(5,1),(1,4)]) def w372:Int × Combination:=(4,[(1,0),(3,1),(1,6)]) def w373:Int × Combination:=(4,[(1,0),(3,1),(1,7)]) def w374:Int × Combination:=(4,[(1,0),(3,1),(1,8)]) def w375:Int × Combination:=(4,[(1,0),(3,1),(1,9)]) def w376:Int × Combination:=(4,[(1,0),(3,1),(1,13)]) def w377:Int × Combination:=(4,[(1,0),(3,1),(1,14)]) def w378:Int × Combination:=(4,[(1,0),(3,1),(1,15)]) def w379:Int × Combination:=(4,[(1,0),(3,1),(1,16)]) def w380:Int × Combination:=(4,[(1,0),(3,1),(2,3)]) def w381:Int × Combination:=(4,[(1,0),(3,2),(1,6)]) def w382:Int × Combination:=(4,[(1,0),(3,2),(2,4)]) def w383:Int × Combination:=(4,[(1,0),(3,3),(2,5)]) def w384:Int × Combination:=(4,[(1,0),(5,1),(4,6)]) def w385:Int × Combination:=(4,[(1,0),(5,1),(4,7)]) def w386:Int × Combination:=(4,[(1,0),(5,1),(4,8)]) def w387:Int × Combination:=(4,[(1,2),(1,3),(8,4)]) def w388:Int × Combination:=(4,[(2,0),(3,3),(1,10)]) def w389:Int × Combination:=(4,[(2,0),(3,3),(1,16)]) def w390:Int × Combination:=(4,[(2,0),(3,4),(1,12)]) def w391:Int × Combination:=(4,[(3,0),(1,2),(6,8)]) def w392:Int × Combination:=(4,[(3,0),(2,2),(3,5)]) def w393:Int × Combination:=(4,[(3,0),(2,3),(1,6)]) def w394:Int × Combination:=(4,[(3,0),(2,3),(1,7)]) def w395:Int × Combination:=(4,[(3,0),(2,3),(1,10)]) def w396:Int × Combination:=(4,[(3,0),(2,3),(3,9)]) def w397:Int × Combination:=(4,[(3,0),(2,4),(3,12)]) def w398:Int × Combination:=(4,[(3,0),(5,1),(1,5)]) def w399:Int × Combination:=(4,[(3,0),(5,1),(1,6)]) def w400:Int × Combination:=(4,[(3,0),(5,2),(1,6)]) def w401:Int × Combination:=(4,[(3,0),(5,2),(1,7)]) def w402:Int × Combination:=(4,[(3,0),(5,3),(1,8)]) def w403:Int × Combination:=(4,[(3,1),(1,2),(2,10)]) def w404:Int × Combination:=(4,[(3,1),(2,2),(1,7)]) def w405:Int × Combination:=(4,[(3,1),(2,2),(1,9)]) def w406:Int × Combination:=(4,[(3,1),(2,3),(1,8)]) def w407:Int × Combination:=(4,[(3,1),(2,3),(1,9)]) def w408:Int × Combination:=(4,[(3,1),(2,3),(1,10)]) def w409:Int × Combination:=(4,[(3,1),(2,3),(3,7)]) def w410:Int × Combination:=(4,[(3,1),(2,4),(1,10)]) def w411:Int × Combination:=(4,[(3,1),(2,4),(1,11)]) def w412:Int × Combination:=(4,[(3,1),(2,4),(3,8)]) def w413:Int × Combination:=(4,[(3,1),(5,2),(2,9)]) def w414:Int × Combination:=(4,[(3,1),(5,3),(2,11)]) def w415:Int × Combination:=(4,[(3,2),(2,5),(1,12)]) def w416:Int × Combination:=(4,[(3,2),(2,9),(5,14)]) def w417:Int × Combination:=(4,[(3,3),(2,6),(1,12)]) def w418:Int × Combination:=(4,[(3,3),(3,8),(2,14)]) def w419:Int × Combination:=(4,[(4,0),(1,1),(3,12)]) def w420:Int × Combination:=(4,[(4,0),(3,1),(3,4)]) def w421:Int × Combination:=(4,[(4,0),(3,2),(3,3)]) def w422:Int × Combination:=(4,[(4,0),(3,9),(1,15)]) def w423:Int × Combination:=(4,[(4,0),(3,10),(1,15)]) def w424:Int × Combination:=(4,[(4,1),(3,2),(3,4)]) def w425:Int × Combination:=(4,[(4,1),(3,3),(3,5)]) def w426:Int × Combination:=(4,[(4,1),(3,3),(3,6)]) def w427:Int × Combination:=(4,[(5,0),(1,1)]) def w428:Int × Combination:=(4,[(5,0),(2,3),(1,5)]) def w429:Int × Combination:=(4,[(5,0),(2,3),(1,6)]) def w430:Int × Combination:=(4,[(5,0),(2,4),(1,6)]) def w431:Int × Combination:=(4,[(5,0),(3,3)]) def w432:Int × Combination:=(4,[(5,1),(1,2)]) def w433:Int × Combination:=(4,[(5,2),(1,3)]) def w434:Int × Combination:=(4,[(5,3),(1,4)]) def w435:Int × Combination:=(4,[(5,4),(1,5)]) def w436:Int × Combination:=(4,[(7,0),(1,1)]) def w437:Int × Combination:=(5,[(1,0),(4,1),(2,7)]) def w438:Int × Combination:=(5,[(1,0),(4,2),(3,8)]) def w439:Int × Combination:=(5,[(1,0),(4,3),(3,12)]) def w440:Int × Combination:=(5,[(1,0),(4,3),(3,13)]) def w441:Int × Combination:=(5,[(1,0),(4,3),(3,14)]) def w442:Int × Combination:=(5,[(1,0),(4,3),(3,15)]) def w443:Int × Combination:=(5,[(1,0),(6,1),(4,7)]) def w444:Int × Combination:=(5,[(1,0),(6,1),(4,8)]) def w445:Int × Combination:=(5,[(1,0),(6,2),(2,11)]) def w446:Int × Combination:=(5,[(1,0),(6,2),(2,14)]) def w447:Int × Combination:=(5,[(1,0),(6,2),(8,10)]) def w448:Int × Combination:=(5,[(1,0),(6,2),(8,11)]) def w449:Int × Combination:=(5,[(1,0),(6,3),(1,8)]) def w450:Int × Combination:=(5,[(1,0),(6,4),(1,11)]) def w451:Int × Combination:=(5,[(1,0),(6,5),(1,13)]) def w452:Int × Combination:=(5,[(1,0),(9,1),(6,4)]) def w453:Int × Combination:=(5,[(2,0),(3,1),(1,8)]) def w454:Int × Combination:=(5,[(2,0),(3,1),(1,9)]) def w455:Int × Combination:=(5,[(2,0),(3,1),(1,10)]) def w456:Int × Combination:=(5,[(2,0),(3,1),(1,12)]) def w457:Int × Combination:=(5,[(2,0),(3,1),(1,13)]) def w458:Int × Combination:=(5,[(2,0),(3,1),(1,14)]) def w459:Int × Combination:=(5,[(2,0),(3,1),(1,15)]) def w460:Int × Combination:=(5,[(2,0),(3,1),(2,3)]) def w461:Int × Combination:=(5,[(2,0),(3,1),(2,4)]) def w462:Int × Combination:=(5,[(2,0),(3,2),(1,5)]) def w463:Int × Combination:=(5,[(2,0),(3,2),(2,4)]) def w464:Int × Combination:=(5,[(2,0),(3,2),(2,5)]) def w465:Int × Combination:=(5,[(2,0),(6,1),(3,5)]) def w466:Int × Combination:=(5,[(2,0),(6,2),(1,9)]) def w467:Int × Combination:=(5,[(2,0),(6,3),(1,8)]) def w468:Int × Combination:=(5,[(2,0),(6,3),(1,10)]) def w469:Int × Combination:=(5,[(2,0),(6,3),(1,11)]) def w470:Int × Combination:=(5,[(2,2),(11,3),(2,9)]) def w471:Int × Combination:=(5,[(3,0),(3,1),(1,14)]) def w472:Int × Combination:=(5,[(3,0),(3,1),(2,9)]) def w473:Int × Combination:=(5,[(3,0),(3,1),(2,10)]) def w474:Int × Combination:=(5,[(3,0),(3,2),(1,13)]) def w475:Int × Combination:=(5,[(3,0),(3,2),(1,15)]) def w476:Int × Combination:=(5,[(3,0),(3,2),(4,16)]) def w477:Int × Combination:=(5,[(3,0),(3,3),(1,13)]) def w478:Int × Combination:=(5,[(3,0),(3,3),(1,14)]) def w479:Int × Combination:=(5,[(3,0),(3,3),(1,15)]) def w480:Int × Combination:=(5,[(3,0),(3,3),(1,16)]) def w481:Int × Combination:=(5,[(3,0),(3,3),(1,18)]) def w482:Int × Combination:=(5,[(3,0),(3,3),(1,19)]) def w483:Int × Combination:=(5,[(3,0),(3,4),(1,7)]) def w484:Int × Combination:=(5,[(3,0),(3,4),(1,11)]) def w485:Int × Combination:=(5,[(3,0),(3,4),(1,12)]) def w486:Int × Combination:=(5,[(3,0),(3,4),(1,13)]) def w487:Int × Combination:=(5,[(3,0),(3,4),(1,14)]) def w488:Int × Combination:=(5,[(3,0),(3,5),(1,12)]) def w489:Int × Combination:=(5,[(3,0),(3,5),(1,13)]) def w490:Int × Combination:=(5,[(3,0),(3,5),(1,14)]) def w491:Int × Combination:=(5,[(3,0),(4,2),(3,4)]) def w492:Int × Combination:=(5,[(3,0),(5,3),(1,6)]) def w493:Int × Combination:=(5,[(3,0),(7,2),(1,9)]) def w494:Int × Combination:=(5,[(3,0),(7,3),(1,11)]) def w495:Int × Combination:=(5,[(3,1),(3,5),(1,16)]) def w496:Int × Combination:=(5,[(3,1),(4,2),(1,6)]) def w497:Int × Combination:=(5,[(3,1),(4,3),(1,7)]) def w498:Int × Combination:=(5,[(3,1),(4,3),(1,9)]) def w499:Int × Combination:=(5,[(3,1),(4,4),(3,7)]) def w500:Int × Combination:=(5,[(3,1),(4,4),(3,8)]) def w501:Int × Combination:=(5,[(3,1),(5,3),(1,7)]) def w502:Int × Combination:=(5,[(4,0),(1,2),(2,11)]) def w503:Int × Combination:=(5,[(4,0),(1,2),(2,13)]) def w504:Int × Combination:=(5,[(4,0),(1,3),(2,14)]) def w505:Int × Combination:=(5,[(5,0),(1,1),(3,6)]) def w506:Int × Combination:=(5,[(5,0),(1,1),(7,4)]) def w507:Int × Combination:=(5,[(5,0),(1,7),(1,9)]) def w508:Int × Combination:=(5,[(5,0),(1,12),(3,17)]) def w509:Int × Combination:=(5,[(5,0),(2,3),(2,5)]) def w510:Int × Combination:=(5,[(5,0),(3,1),(3,3)]) def w511:Int × Combination:=(5,[(5,0),(3,2),(3,4)]) def w512:Int × Combination:=(5,[(5,1),(1,8),(1,10)]) def w513:Int × Combination:=(5,[(5,1),(1,9),(1,11)]) def w514:Int × Combination:=(5,[(5,1),(1,10),(1,12)]) def w515:Int × Combination:=(5,[(5,1),(3,3),(3,4)]) def w516:Int × Combination:=(5,[(5,1),(3,3),(3,5)]) def w517:Int × Combination:=(5,[(5,1),(3,6),(3,8)]) def w518:Int × Combination:=(5,[(5,2),(3,4),(3,6)]) def w519:Int × Combination:=(5,[(7,0),(1,2)]) def w520:Int × Combination:=(5,[(7,0),(1,3)]) def w521:Int × Combination:=(5,[(7,0),(3,1)]) def w522:Int × Combination:=(5,[(7,0),(3,2)]) def w523:Int × Combination:=(5,[(7,1),(1,4)]) def w524:Int × Combination:=(5,[(7,3),(1,9),(5,19)]) def w525:Int × Combination:=(5,[(8,0),(1,2)]) def w526:Int × Combination:=(5,[(8,0),(1,3)]) def w527:Int × Combination:=(5,[(8,0),(1,4)]) def w528:Int × Combination:=(5,[(8,1),(1,3)]) def w529:Int × Combination:=(5,[(8,1),(1,4)]) def w530:Int × Combination:=(5,[(8,1),(1,5)]) def w531:Int × Combination:=(5,[(8,4),(1,10)]) def w532:Int × Combination:=(5,[(8,5),(1,11)]) def w533:Int × Combination:=(5,[(9,0),(1,2),(3,5)]) def w534:Int × Combination:=(5,[(9,1),(1,2),(2,8)]) def w535:Int × Combination:=(6,[(5,0),(1,2),(2,9)]) def w536:Int × Combination:=(6,[(5,0),(1,2),(2,11)]) def w537:Int × Combination:=(6,[(7,0),(2,1),(5,11)]) def w538:Int × Combination:=(6,[(7,1),(2,2),(5,12)]) def w539:Int × Combination:=(6,[(9,2),(1,9),(1,11)]) def w540:Int × Combination:=(6,[(9,2),(1,11),(1,14)]) def w541:Int × Combination:=(6,[(9,3),(1,13),(1,16)]) def w542:Int × Combination:=(6,[(9,4),(1,12),(1,15)]) def w543:Int × Combination:=(6,[(9,4),(1,14),(1,17)]) def w544:Int × Combination:=(7,[(1,0),(6,1),(2,6)]) def w545:Int × Combination:=(7,[(1,0),(6,1),(2,7)]) def w546:Int × Combination:=(7,[(1,0),(6,1),(2,8)]) def w547:Int × Combination:=(7,[(1,0),(6,1),(2,9)]) def w548:Int × Combination:=(7,[(1,0),(6,1),(2,10)]) def w549:Int × Combination:=(7,[(1,0),(6,1),(4,3)]) def w550:Int × Combination:=(7,[(1,0),(12,1),(4,10)]) def w551:Int × Combination:=(7,[(1,0),(12,1),(4,12)]) def w552:Int × Combination:=(7,[(3,0),(6,1),(1,11)]) def w553:Int × Combination:=(7,[(3,0),(6,1),(8,9)]) def w554:Int × Combination:=(7,[(3,0),(6,2),(1,11)]) def w555:Int × Combination:=(7,[(3,0),(6,2),(1,12)]) def w556:Int × Combination:=(7,[(3,0),(6,3),(1,8)]) def w557:Int × Combination:=(7,[(3,0),(6,3),(1,11)]) def w558:Int × Combination:=(7,[(3,0),(6,3),(1,12)]) def w559:Int × Combination:=(7,[(3,0),(6,3),(1,13)]) def w560:Int × Combination:=(7,[(3,0),(6,3),(1,14)]) def w561:Int × Combination:=(7,[(3,0),(6,3),(1,16)]) def w562:Int × Combination:=(7,[(3,0),(6,3),(1,18)]) def w563:Int × Combination:=(7,[(3,0),(6,4),(1,12)]) def w564:Int × Combination:=(7,[(3,1),(6,5),(1,15)]) def w565:Int × Combination:=(7,[(4,0),(3,1),(1,5)]) def w566:Int × Combination:=(7,[(4,0),(3,1),(2,2)]) def w567:Int × Combination:=(7,[(4,0),(3,1),(2,3)]) def w568:Int × Combination:=(7,[(4,0),(3,1),(2,10)]) def w569:Int × Combination:=(7,[(4,0),(3,2),(2,4)]) def w570:Int × Combination:=(7,[(5,0),(3,3),(1,7)]) def w571:Int × Combination:=(7,[(5,0),(9,1),(6,3)]) def w572:Int × Combination:=(7,[(7,0),(2,11),(3,14)]) def w573:Int × Combination:=(7,[(7,0),(2,12),(3,15)]) def w574:Int × Combination:=(7,[(7,0),(3,1),(6,3)]) def w575:Int × Combination:=(7,[(7,0),(3,2),(5,5)]) def w576:Int × Combination:=(7,[(7,0),(3,3),(5,5)]) def w577:Int × Combination:=(7,[(7,0),(3,3),(5,7)]) def w578:Int × Combination:=(7,[(7,0),(4,3),(2,5)]) def w579:Int × Combination:=(7,[(7,0),(6,2),(3,6)]) def w580:Int × Combination:=(7,[(7,1),(1,7),(2,9)]) def w581:Int × Combination:=(7,[(7,1),(3,3),(5,6)]) def w582:Int × Combination:=(7,[(7,1),(6,3),(3,5)]) def w583:Int × Combination:=(7,[(7,1),(6,3),(3,7)]) def w584:Int × Combination:=(7,[(8,0),(3,2)]) def w585:Int × Combination:=(7,[(8,0),(3,3)]) def w586:Int × Combination:=(7,[(8,0),(3,4)]) def w587:Int × Combination:=(7,[(8,0),(3,5)]) def w588:Int × Combination:=(7,[(8,1),(3,10)]) def w589:Int × Combination:=(7,[(8,1),(3,11)]) def w590:Int × Combination:=(7,[(8,1),(3,12)]) def w591:Int × Combination:=(7,[(9,0),(5,2),(3,6)]) def w592:Int × Combination:=(7,[(12,0),(2,1),(3,3)]) def w593:Int × Combination:=(7,[(12,0),(2,1),(3,4)]) def w594:Int × Combination:=(8,[(2,0),(9,1),(1,9)]) def w595:Int × Combination:=(8,[(2,0),(9,2),(1,9)]) def w596:Int × Combination:=(8,[(2,0),(9,2),(1,10)]) def w597:Int × Combination:=(8,[(2,0),(9,3),(1,9)]) def w598:Int × Combination:=(8,[(2,0),(9,3),(1,10)]) def w599:Int × Combination:=(8,[(2,0),(9,3),(1,11)]) def w600:Int × Combination:=(8,[(2,0),(9,3),(1,12)]) def w601:Int × Combination:=(8,[(5,0),(3,1),(1,4)]) def w602:Int × Combination:=(8,[(7,1),(3,2),(4,4)]) def w603:Int × Combination:=(8,[(8,0),(1,7),(3,12)]) def w604:Int × Combination:=(8,[(8,0),(1,8),(3,14)]) def w605:Int × Combination:=(8,[(8,0),(1,9),(3,14)]) def w606:Int × Combination:=(8,[(8,0),(1,9),(3,15)]) def w607:Int × Combination:=(8,[(8,0),(1,10),(3,15)]) def w608:Int × Combination:=(8,[(8,0),(1,10),(3,16)]) def w609:Int × Combination:=(8,[(8,0),(1,11),(3,17)]) def w610:Int × Combination:=(8,[(9,0),(1,3),(6,12)]) def w611:Int × Combination:=(8,[(9,0),(1,3),(6,15)]) def w612:Int × Combination:=(8,[(15,0),(1,1),(3,7)]) def w613:Int × Combination:=(8,[(15,0),(1,1),(3,8)]) def w614:Int × Combination:=(9,[(2,1),(6,7),(7,9)]) def w615:Int × Combination:=(9,[(3,1),(8,2),(5,5)]) def w616:Int × Combination:=(9,[(3,1),(8,2),(5,6)]) def w617:Int × Combination:=(9,[(3,1),(8,2),(5,7)]) def w618:Int × Combination:=(9,[(4,1),(6,4),(5,9)]) def w619:Int × Combination:=(9,[(4,1),(6,5),(5,9)]) def w620:Int × Combination:=(9,[(7,0),(3,2),(4,14)]) def w621:Int × Combination:=(9,[(7,0),(3,2),(4,15)]) def w622:Int × Combination:=(9,[(7,0),(3,2),(4,17)]) def w623:Int × Combination:=(9,[(7,0),(6,2),(1,4)]) def w624:Int × Combination:=(9,[(11,0),(5,3),(1,5)]) def w625:Int × Combination:=(9,[(11,0),(5,4),(1,6)]) def w626:Int × Combination:=(9,[(13,1),(1,3),(15,8)]) def w627:Int × Combination:=(9,[(14,3),(1,6),(2,10)]) def w628:Int × Combination:=(9,[(14,3),(1,6),(2,13)]) def w629:Int × Combination:=(9,[(14,4),(1,8),(2,15)]) def w630:Int × Combination:=(10,[(3,0),(14,2),(1,8)]) def w631:Int × Combination:=(10,[(3,0),(14,3),(1,8)]) def w632:Int × Combination:=(10,[(3,0),(14,3),(1,9)]) def w633:Int × Combination:=(10,[(9,0),(2,3),(3,7)]) def w634:Int × Combination:=(10,[(11,0),(5,2),(3,3)]) def w635:Int × Combination:=(11,[(3,0),(16,3),(1,6)]) def w636:Int × Combination:=(11,[(3,0),(16,3),(1,7)]) def w637:Int × Combination:=(11,[(3,0),(16,3),(1,8)]) def w638:Int × Combination:=(11,[(7,0),(6,1),(8,10)]) def w639:Int × Combination:=(11,[(7,0),(6,1),(8,11)]) def w640:Int × Combination:=(11,[(7,0),(6,2),(1,6)]) def w641:Int × Combination:=(11,[(7,0),(6,2),(1,7)]) def w642:Int × Combination:=(11,[(7,0),(6,2),(1,9)]) def w643:Int × Combination:=(11,[(7,0),(6,2),(1,11)]) def w644:Int × Combination:=(11,[(7,0),(6,3),(1,8)]) def w645:Int × Combination:=(11,[(7,0),(6,3),(1,9)]) def w646:Int × Combination:=(11,[(7,0),(6,3),(1,10)]) def w647:Int × Combination:=(11,[(7,0),(6,3),(1,11)]) def w648:Int × Combination:=(11,[(7,0),(6,3),(1,12)]) def w649:Int × Combination:=(11,[(7,0),(6,3),(1,13)]) def w650:Int × Combination:=(11,[(9,0),(3,1),(4,11)]) def w651:Int × Combination:=(11,[(9,0),(3,1),(4,13)]) def w652:Int × Combination:=(11,[(9,0),(4,3),(3,6)]) def w653:Int × Combination:=(12,[(4,0),(9,1),(5,2)]) def w654:Int × Combination:=(12,[(4,1),(9,2),(5,3)]) def w655:Int × Combination:=(12,[(9,0),(1,1),(8,2)]) def w656:Int × Combination:=(12,[(9,0),(1,1),(8,3)]) def w657:Int × Combination:=(12,[(10,0),(3,4),(5,10)]) def w658:Int × Combination:=(12,[(10,0),(3,4),(5,15)]) def w659:Int × Combination:=(12,[(10,0),(3,5),(5,16)]) def w660:Int × Combination:=(12,[(10,0),(3,5),(5,17)]) def w661:Int × Combination:=(12,[(13,0),(3,7),(8,9)]) def w662:Int × Combination:=(13,[(8,0),(8,2),(1,9)]) def w663:Int × Combination:=(13,[(8,0),(8,3),(1,10)]) def w664:Int × Combination:=(13,[(8,0),(8,3),(1,11)]) def w665:Int × Combination:=(14,[(15,0),(3,11),(7,17)]) def w666:Int × Combination:=(14,[(17,0),(7,4),(2,5)]) def w667:Int × Combination:=(14,[(21,3),(1,8),(5,10)]) def w668:Int × Combination:=(14,[(21,3),(1,10),(5,13)]) def w669:Int × Combination:=(15,[(5,0),(12,1),(4,6)]) def w670:Int × Combination:=(15,[(5,0),(12,1),(4,7)]) def w671:Int × Combination:=(15,[(12,0),(10,1),(1,3)]) def w672:Int × Combination:=(15,[(12,0),(10,2),(1,4)]) def w673:Int × Combination:=(15,[(18,0),(5,3),(4,5)]) def w674:Int × Combination:=(15,[(18,1),(5,3),(4,5)]) def w675:Int × Combination:=(16,[(8,0),(13,1),(15,8)]) def w676:Int × Combination:=(16,[(8,0),(13,1),(15,13)]) def w677:Int × Combination:=(16,[(9,0),(14,1),(3,5)]) def w678:Int × Combination:=(16,[(9,0),(14,3),(3,7)]) def w679:Int × Combination:=(16,[(9,0),(14,3),(3,8)]) def w680:Int × Combination:=(16,[(9,0),(14,4),(3,8)]) def w681:Int × Combination:=(16,[(9,0),(14,4),(3,9)]) def w682:Int × Combination:=(16,[(15,0),(2,2),(5,6)]) def w683:Int × Combination:=(16,[(15,0),(2,3),(5,7)]) def w684:Int × Combination:=(16,[(19,0),(10,3),(1,6)]) def w685:Int × Combination:=(16,[(19,0),(10,3),(1,7)]) def w686:Int × Combination:=(16,[(19,0),(10,4),(1,7)]) def w687:Int × Combination:=(16,[(19,0),(10,4),(1,8)]) def w688:Int × Combination:=(17,[(9,0),(16,3),(3,5)]) def w689:Int × Combination:=(17,[(9,0),(16,3),(3,6)]) def w690:Int × Combination:=(17,[(9,0),(16,3),(3,7)]) def w691:Int × Combination:=(17,[(9,0),(16,4),(3,7)]) def w692:Int × Combination:=(17,[(9,0),(16,4),(3,8)]) def w693:Int × Combination:=(17,[(15,3),(3,4),(10,12)]) def w694:Int × Combination:=(17,[(20,0),(11,3),(1,9)]) def w695:Int × Combination:=(17,[(20,0),(11,3),(1,10)]) def w696:Int × Combination:=(17,[(20,0),(11,4),(1,10)]) def w697:Int × Combination:=(21,[(22,0),(3,9),(7,16)]) def w698:Int × Combination:=(21,[(22,0),(3,10),(7,17)]) def w699:Int × Combination:=(21,[(23,0),(6,11),(7,15)]) def w700:Int × Combination:=(21,[(24,0),(7,7),(2,10)]) def w701:Int × Combination:=(21,[(24,0),(7,8),(2,11)]) def w702:Int × Combination:=(23,[(15,0),(12,3),(5,8)]) def w703:Int × Combination:=(23,[(15,0),(12,4),(5,8)]) def w704:Int × Combination:=(23,[(15,0),(12,4),(5,9)]) def w705:Int × Combination:=(23,[(15,0),(12,4),(5,13)]) def w706:Int × Combination:=(23,[(15,0),(12,5),(5,10)]) def w707:Int × Combination:=(23,[(15,0),(12,5),(5,14)]) def w708:Int × Combination:=(23,[(15,0),(12,5),(5,15)]) def w709:Int × Combination:=(23,[(21,0),(3,3),(7,11)]) def w710:Int × Combination:=(23,[(21,0),(3,4),(7,10)]) def w711:Int × Combination:=(23,[(21,0),(3,4),(7,13)]) def w712:Int × Combination:=(23,[(21,0),(3,5),(7,11)]) def w713:Int × Combination:=(23,[(21,0),(3,5),(7,12)]) def w714:Int × Combination:=(23,[(21,0),(3,5),(7,13)]) def w715:Int × Combination:=(23,[(21,0),(3,5),(7,14)]) def w716:Int × Combination:=(24,[(15,0),(16,5),(5,12)]) def w717:Int × Combination:=(25,[(21,0),(6,4),(7,8)]) def w718:Int × Combination:=(25,[(21,0),(6,4),(7,12)]) def w719:Int × Combination:=(25,[(21,0),(6,5),(7,10)]) def w720:Int × Combination:=(25,[(21,0),(6,5),(7,12)]) def w721:Int × Combination:=(25,[(21,0),(6,5),(7,13)]) def w722:Int × Combination:=(25,[(21,0),(12,7),(7,10)]) def w723:Int × Combination:=(25,[(21,0),(12,8),(7,12)]) def w724:Int × Combination:=(25,[(28,0),(9,5),(2,7)]) def w725:Int × Combination:=(25,[(28,0),(9,7),(2,10)]) def w726:Int × Combination:=(25,[(28,0),(9,8),(2,11)]) def w727:Int × Combination:=(25,[(28,0),(9,8),(2,12)]) def w728:Int × Combination:=(29,[(25,0),(6,2),(7,9)]) def w729:Int × Combination:=(29,[(25,0),(6,3),(7,11)]) end Green24Proof.BranchWitnessAtoms private def zz2037:"s07f5"="s07f5":=by decide+kernel end section namespace Green24Proof.OrthantPackedCertificateData open IntegerQuadraticCertificates (Linear) open OrthantQuadraticCertificates abbrev Reader (α:Type):=StateT (List Nat) Option α def fail {α:Type}:Reader α:=fun _ => none def readByte:Reader Nat | [] => none | n :: rest => if n < 256 then readByte rest else some (n % 256,n / 256 :: rest) def readPacked:Nat → Reader Nat | 0 => fail | fuel + 1 => do let b ← readByte if b < 128 then return b else return b % 128 + 128 * (← readPacked fuel) def readNat:Reader Nat:=readPacked 128 def readInt:Reader Int:=do return PureCertificateData.unzig (← readNat) def readLinear:Reader Linear:=do let a ← readInt let b ← readInt let c ← readInt let d ← readInt return ![a,b,c,d] def readCombination:Nat → Reader Combination | 0 => pure [] | count + 1 => do let w ← readInt let i ← readNat return (w,i) :: (← readCombination count) def readTerm:Reader NonnegativeTerm:=do match ← readNat with | 0 => return .square (← readLinear) | 1 => return .pair (← readNat) (← readNat) | _ => fail def readDecomposition:Nat → Reader Decomposition | 0 => pure [] | count + 1 => do let w ← readInt let t ← readTerm return (w,t) :: (← readDecomposition count) def readPairs:Nat → Reader (List (Nat × Nat)) | 0 => pure [] | count + 1 => do let i ← readNat let j ← readNat return (i,j) :: (← readPairs count) def readSquares:Nat → Reader (List Linear) | 0 => pure [] | count + 1 => do let a ← readLinear return a :: (← readSquares count) def readIntegers:Nat → Reader (List ℤ) | 0 => pure [] | count + 1 => do let value ← readInt return value :: (← readIntegers count) def readTree:Nat → Reader Certificate | 0 => fail | fuel + 1 => do match ← readNat with | 0 => let scale ← readInt let count ← readNat return .leaf scale (← readDecomposition count) | 1 => return .split (← readTree fuel) (← readTree fuel) | 2 => let a ← readLinear return .cut a (← readTree fuel) (← readTree fuel) | 3 => let scale ← readInt let count ← readNat let w ← readCombination count return .positive scale w (← readTree fuel) | 4 => let scale ← readInt let count ← readNat let w ← readCombination count return .negative scale w (← readTree fuel) | 5 => return .psd | 6 => return .support (← readPairs (← readNat)) | 9 => return .lowerSupport (← readPairs (← readNat)) | 10 => return .lowerPsd | 12 => let scale ← readInt let weights ← readIntegers (← readNat) let pairs ← readPairs (← readNat) return .orthantSupport scale weights pairs | 11 => let pairs ← readPairs (← readNat) let squares ← readSquares (← readNat) return .mixedSupport pairs squares | _ => fail def decode (fuel:Nat) (chunks:List Nat):Certificate := match readTree fuel chunks with | some (cert,_) => cert | none => .leaf 0 [] end Green24Proof.OrthantPackedCertificateData private def zz2038:"s07f6"="s07f6":=by decide+kernel end section namespace Green24Proof.OrthantCheckSteps open IntegerQuadraticCertificates (Linear Quadratic Hinges product) open OrthantQuadraticCertificates theorem split_valid (p m:Certificate) (C:Nat → Linear) (Q:Quadratic) (c:Int) (a:Linear) (hs:Hinges) (hp:check p (cons a C) (Q + c • product a a) hs = true) (hm:check m (cons (-a) C) Q hs = true) : check (.split p m) C Q ((c,a) :: hs) = true:=by simpa only [check,Bool.and_eq_true] using And.intro hp hm theorem cut_valid (a:Linear) (p m:Certificate) (C:Nat → Linear) (Q:Quadratic) (hs:Hinges) (hp:check p (cons a C) Q hs = true) (hm:check m (cons (-a) C) Q hs = true) : check (.cut a p m) C Q hs = true:=by simpa only [check,Bool.and_eq_true] using And.intro hp hm private def zz141:"s008d"="s008d":=by decide+kernel theorem positive_valid (s:Int) (w:Combination) (p:Certificate) (C:Nat → Linear) (Q:Quadratic) (c:Int) (a:Linear) (hs:Hinges) (hw:combinationCheck C s w a = true) (hp:check p (cons a C) (Q + c • product a a) hs = true) : check (.positive s w p) C Q ((c,a) :: hs) = true:=by simpa only [check,Bool.and_eq_true] using And.intro hw hp theorem negative_valid (s:Int) (w:Combination) (m:Certificate) (C:Nat → Linear) (Q:Quadratic) (c:Int) (a:Linear) (hs:Hinges) (hw:combinationCheck C s w (-a) = true) (hm:check m (cons (-a) C) Q hs = true) : check (.negative s w m) C Q ((c,a) :: hs) = true:=by simpa only [check,Bool.and_eq_true] using And.intro hw hm end Green24Proof.OrthantCheckSteps private def zz2039:"s07f7"="s07f7":=by decide+kernel end section namespace Green24Proof.CheckpointStateProofTerms open IntegerQuadraticCertificates (Linear Quadratic Hinges product) open OrthantQuadraticCertificates open CheckpointPathData (State V step) def headVector (s:State):Linear:=(s.hinges.headD (0,0)).2 theorem K {p:Certificate} {s:State} (h:V p s:=by unfold V; decide +kernel):V p s:=h theorem S {p m:Certificate} {s:State} (hp:V p (step true s)) (hm:V m (step false s)) (hne:s.hinges.isEmpty = false:=by decide +kernel) : V (.split p m) s:=by cases s with | mk Cs Q hs => cases hs with | nil => cases hne | cons h hs => rcases h with ⟨c,a⟩ exact OrthantCheckSteps.split_valid p m Cs Q c a hs hp hm private def zz142:"s008e"="s008e":=by decide+kernel theorem P {scale:Int} {weights:Combination} {p:Certificate} {s:State} (hp:V p (step true s)) (hw:combinationCheck s.constraints scale weights (headVector s) = true:=by decide +kernel) (hne:s.hinges.isEmpty = false:=by decide +kernel) : V (.positive scale weights p) s:=by cases s with | mk Cs Q hs => cases hs with | nil => cases hne | cons h hs => rcases h with ⟨c,a⟩ exact OrthantCheckSteps.positive_valid scale weights p Cs Q c a hs hw hp theorem M {scale:Int} {weights:Combination} {p:Certificate} {s:State} (hp:V p (step false s)) (hw:combinationCheck s.constraints scale weights (-headVector s) = true:=by decide +kernel) (hne:s.hinges.isEmpty = false:=by decide +kernel) : V (.negative scale weights p) s:=by cases s with | mk Cs Q hs => cases hs with | nil => cases hne | cons h hs => rcases h with ⟨c,a⟩ exact OrthantCheckSteps.negative_valid scale weights p Cs Q c a hs hw hp end Green24Proof.CheckpointStateProofTerms private def zz2040:"s07f8"="s07f8":=by decide+kernel end section namespace Green24Proof.StateCompactData open IntegerQuadraticCertificates (Linear Quadratic product) open OrthantQuadraticCertificates (cons) def qs (Q:Quadratic) (c:Int) (a:Linear):Quadratic := Q + c • product a a def cn (a:Linear) (C:Nat → Linear):Nat → Linear := cons (-a) C end Green24Proof.StateCompactData private def zz2041:"s07f9"="s07f9":=by decide+kernel end section namespace Green24Proof.NumericLinearAtoms open IntegerQuadraticCertificates (Linear) def l0:Linear:=![-11999994000,-92854043966,29135465868,-7005711846] def l1:Linear:=![-12000000000,-23999998800,15169293600,1200] def l2:Linear:=![-12000000000,-23999998800,22473249000,1200] def l3:Linear:=![0,0,0,1] def l4:Linear:=![0,0,1,-1] def l5:Linear:=![0,0,1,-2] def l6:Linear:=![0,0,1,-3] def l7:Linear:=![0,0,1,0] def l8:Linear:=![0,0,2,-1] def l9:Linear:=![0,0,2,-3] def l10:Linear:=![0,0,3,-1] def l11:Linear:=![0,0,3,-2] def l12:Linear:=![0,1,-1,0] def l13:Linear:=![0,1,-2,0] def l14:Linear:=![0,1,-3,0] def l15:Linear:=![0,1,0,-1] def l16:Linear:=![0,1,0,-2] def l17:Linear:=![0,1,0,-3] def l18:Linear:=![0,1,0,0] def l19:Linear:=![0,1,1,1] def l20:Linear:=![0,2,-1,0] def l21:Linear:=![0,2,-3,0] def l22:Linear:=![0,2,0,-1] def l23:Linear:=![0,2,0,-3] def l24:Linear:=![0,3,-1,-1] def l25:Linear:=![0,3,-1,0] def l26:Linear:=![0,3,-1,1] def l27:Linear:=![0,3,-2,-1] def l28:Linear:=![0,3,-2,0] def l29:Linear:=![0,3,-2,1] def l30:Linear:=![0,3,0,-1] def l31:Linear:=![0,3,0,-2] def l32:Linear:=![0,3,1,-1] def l33:Linear:=![0,3,2,-1] def l34:Linear:=![1,-1,0,0] def l35:Linear:=![1,-2,-3,0] def l36:Linear:=![1,-2,0,0] def l37:Linear:=![1,-2,3,0] def l38:Linear:=![1,-3,0,0] def l39:Linear:=![1,-4,-3,0] def l40:Linear:=![1,-4,3,0] def l41:Linear:=![1,0,-1,0] def l42:Linear:=![1,0,-2,0] def l43:Linear:=![1,0,-3,0] def l44:Linear:=![1,0,0,-1] def l45:Linear:=![1,0,0,-2] def l46:Linear:=![1,0,0,-3] def l47:Linear:=![1,0,0,0] def l48:Linear:=![1,0,1,1] def l49:Linear:=![1,1,0,1] def l50:Linear:=![1,1,1,0] def l51:Linear:=![1,2,-3,0] def l52:Linear:=![1,4,-3,0] def l53:Linear:=![187966769,-119999400,-160267515,600] def l54:Linear:=![2,-1,0,0] def l55:Linear:=![2,-3,0,0] def l56:Linear:=![2,0,-1,0] def l57:Linear:=![2,0,-3,0] def l58:Linear:=![2,0,0,-1] def l59:Linear:=![2,0,0,-3] def l60:Linear:=![3,-1,0,0] def l61:Linear:=![3,-2,0,0] def l62:Linear:=![3,0,-1,0] def l63:Linear:=![3,0,-2,0] def l64:Linear:=![3,0,0,-1] def l65:Linear:=![3,0,0,-2] def l66:Linear:=![300,64131828,51517866,-25758783] def l67:Linear:=![30440989229,-23976000000,-11432037552,24000000] def l68:Linear:=![600,55422675,44521764,-22260582] end Green24Proof.NumericLinearAtoms private def zz2042:"s07fa"="s07fa":=by decide+kernel end section namespace Green24Proof.DictionaryOrthantPackedData open OrthantQuadraticCertificates open OrthantPackedCertificateData abbrev LinearWitness:=Int × Combination def readTable:Nat → Reader (List LinearWitness) | 0 => pure [] | n + 1 => do let scale ← readInt let weights ← readCombination (← readNat) return (scale,weights) :: (← readTable n) def decodeTable (chunks:List Nat):Array LinearWitness := match (do readTable (← readNat)) chunks with | some (entries,_) => entries.toArray | none => #[] def readTree (table:Array LinearWitness):Nat → Reader Certificate | 0 => fail | fuel + 1 => do match ← readNat with | 0 => let scale ← readInt let count ← readNat return .leaf scale (← readDecomposition count) | 1 => return .split (← readTree table fuel) (← readTree table fuel) | 2 => let a ← readLinear return .cut a (← readTree table fuel) (← readTree table fuel) | 3 => let scale ← readInt let count ← readNat let w ← readCombination count return .positive scale w (← readTree table fuel) | 4 => let scale ← readInt let count ← readNat let w ← readCombination count return .negative scale w (← readTree table fuel) | 5 => return .psd | 6 => return .support (← readPairs (← readNat)) | 9 => return .lowerSupport (← readPairs (← readNat)) | 10 => return .lowerPsd | 11 => let pairs ← readPairs (← readNat) let squares ← readSquares (← readNat) return .mixedSupport pairs squares | 12 => let scale ← readInt let weights ← readIntegers (← readNat) let pairs ← readPairs (← readNat) return .orthantSupport scale weights pairs | 13 => let (scale,weights):=table.getD (← readNat) (0,[]) return .positive scale weights (← readTree table fuel) | 14 => let (scale,weights):=table.getD (← readNat) (0,[]) return .negative scale weights (← readTree table fuel) | _ => fail def decode (fuel:Nat) (table:Array LinearWitness) (chunks:List Nat):Certificate := match readTree table fuel chunks with | some (cert,_) => cert | none => .leaf 0 [] end Green24Proof.DictionaryOrthantPackedData private def zz2043:"s07fb"="s07fb":=by decide+kernel end section namespace Green24Proof.DenseOrthantPackedData open OrthantQuadraticCertificates open OrthantPackedCertificateData open DictionaryOrthantPackedData (LinearWitness) def endpointWeights:Nat → Nat → List Int | 0,_ => [] | count + 1,mask => (if mask % 2 = 0 then 0 else -1) :: endpointWeights count (mask / 2) def readRadixWeights:Nat → Nat → Reader (List Int) | 0,_ => pure [] | count + 1,mask => do let value ← match mask % 4 with | 0 => pure 0 | 1 => pure (-1) | 2 => readInt | _ => fail return value :: (← readRadixWeights count (mask / 4)) def readPairDeltas:Nat → Nat → Reader (List (Nat × Nat)) | 0,_ => pure [] | count + 1,previous => do let rank:=previous + (← readNat) return (rank / 64,rank % 64) :: (← readPairDeltas count rank) def readTree (table:Array LinearWitness):Nat → Reader Certificate | 0 => fail | fuel + 1 => do match ← readNat with | 0 => let scale ← readInt let count ← readNat return .leaf scale (← readDecomposition count) | 1 => return .split (← readTree table fuel) (← readTree table fuel) | 2 => let a ← readLinear return .cut a (← readTree table fuel) (← readTree table fuel) | 3 => let scale ← readInt let count ← readNat let w ← readCombination count return .positive scale w (← readTree table fuel) | 4 => let scale ← readInt let count ← readNat let w ← readCombination count return .negative scale w (← readTree table fuel) | 5 => return .psd | 6 => return .support (← readPairs (← readNat)) | 9 => return .lowerSupport (← readPairs (← readNat)) | 10 => return .lowerPsd | 11 => let pairs ← readPairs (← readNat) let squares ← readSquares (← readNat) return .mixedSupport pairs squares | 12 => let scale ← readInt let weights ← readIntegers (← readNat) let pairs ← readPairs (← readNat) return .orthantSupport scale weights pairs | 13 => let (scale,weights):=table.getD (← readNat) (0,[]) return .positive scale weights (← readTree table fuel) | 14 => let (scale,weights):=table.getD (← readNat) (0,[]) return .negative scale weights (← readTree table fuel) | 15 => return .support (← readPairDeltas (← readNat) 0) | 16 => return .lowerSupport (← readPairDeltas (← readNat) 0) | 17 => let pairs ← readPairDeltas (← readNat) 0 let squares ← readSquares (← readNat) return .mixedSupport pairs squares | 18 => let scale ← readInt let count ← readNat let weights:=endpointWeights count (← readNat) let pairs ← readPairDeltas (← readNat) 0 return .orthantSupport scale weights pairs | 19 => let scale ← readInt let count ← readNat let weights ← readRadixWeights count (← readNat) let pairs ← readPairDeltas (← readNat) 0 return .orthantSupport scale weights pairs | _ => fail def decode (fuel:Nat) (table:Array LinearWitness) (chunks:List Nat):Certificate := match readTree table fuel chunks with | some (cert,_) => cert | none => .leaf 0 [] end Green24Proof.DenseOrthantPackedData private def zz2044:"s07fc"="s07fc":=by decide+kernel end section namespace Green24Proof.FiveBitDenseData open IntegerQuadraticCertificates (Linear) open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) abbrev Reader (α:Type):=StateT (List Nat) Option α def fail {α:Type}:Reader α:=fun _ => none def readGroup:Reader Nat | [] => none | n :: rest => if n < 32 then readGroup rest else some (n % 32,n / 32 :: rest) def readPacked:Nat → Reader Nat | 0 => fail | fuel + 1 => do let b ← readGroup if b < 16 then return b else return b % 16 + 16 * (← readPacked fuel) def readNat:Reader Nat:=readPacked 224 def readInt:Reader Int:=do return PureCertificateData.unzig (← readNat) def readLinear:Reader Linear:=do let a ← readInt let b ← readInt let c ← readInt let d ← readInt return ![a,b,c,d] def readCombination:Nat → Reader Combination | 0 => pure [] | count + 1 => do let w ← readInt let i ← readNat return (w,i) :: (← readCombination count) def readTerm:Reader NonnegativeTerm:=do match ← readNat with | 0 => return .square (← readLinear) | 1 => return .pair (← readNat) (← readNat) | _ => fail def readDecomposition:Nat → Reader Decomposition | 0 => pure [] | count + 1 => do let w ← readInt let t ← readTerm return (w,t) :: (← readDecomposition count) def readPairs:Nat → Reader (List (Nat × Nat)) | 0 => pure [] | count + 1 => do let i ← readNat let j ← readNat return (i,j) :: (← readPairs count) def readSquares:Nat → Reader (List Linear) | 0 => pure [] | count + 1 => do let a ← readLinear return a :: (← readSquares count) def readIntegers:Nat → Reader (List ℤ) | 0 => pure [] | count + 1 => do let value ← readInt return value :: (← readIntegers count) def readTable:Nat → Reader (List LinearWitness) | 0 => pure [] | n + 1 => do let scale ← readInt let weights ← readCombination (← readNat) return (scale,weights) :: (← readTable n) def decodeTable (data:List Nat):Array LinearWitness := match (do readTable (← readNat)) data with | some (entries,_) => entries.toArray | none => #[] def endpointWeights:Nat → Nat → List Int | 0,_ => [] | count + 1,mask => (if mask % 2 = 0 then 0 else -1) :: endpointWeights count (mask / 2) def readRadixWeights:Nat → Nat → Reader (List Int) | 0,_ => pure [] | count + 1,mask => do let value ← match mask % 4 with | 0 => pure 0 | 1 => pure (-1) | 2 => readInt | _ => fail return value :: (← readRadixWeights count (mask / 4)) def readPairDeltas:Nat → Nat → Reader (List (Nat × Nat)) | 0,_ => pure [] | count + 1,previous => do let rank:=previous + (← readNat) return (rank / 64,rank % 64) :: (← readPairDeltas count rank) def readTree (table:Array LinearWitness):Nat → Reader Certificate | 0 => fail | fuel + 1 => do match ← readNat with | 0 => let scale ← readInt let count ← readNat return .leaf scale (← readDecomposition count) | 1 => return .split (← readTree table fuel) (← readTree table fuel) | 2 => let a ← readLinear return .cut a (← readTree table fuel) (← readTree table fuel) | 3 => let scale ← readInt let count ← readNat let w ← readCombination count return .positive scale w (← readTree table fuel) | 4 => let scale ← readInt let count ← readNat let w ← readCombination count return .negative scale w (← readTree table fuel) | 5 => return .psd | 6 => return .support (← readPairs (← readNat)) | 9 => return .lowerSupport (← readPairs (← readNat)) | 10 => return .lowerPsd | 11 => let pairs ← readPairs (← readNat) let squares ← readSquares (← readNat) return .mixedSupport pairs squares | 12 => let scale ← readInt let weights ← readIntegers (← readNat) let pairs ← readPairs (← readNat) return .orthantSupport scale weights pairs | 13 => let (scale,weights):=table.getD (← readNat) (0,[]) return .positive scale weights (← readTree table fuel) | 14 => let (scale,weights):=table.getD (← readNat) (0,[]) return .negative scale weights (← readTree table fuel) | 15 => return .support (← readPairDeltas (← readNat) 0) | 16 => return .lowerSupport (← readPairDeltas (← readNat) 0) | 17 => let pairs ← readPairDeltas (← readNat) 0 let squares ← readSquares (← readNat) return .mixedSupport pairs squares | 18 => let scale ← readInt let count ← readNat let weights:=endpointWeights count (← readNat) let pairs ← readPairDeltas (← readNat) 0 return .orthantSupport scale weights pairs | 19 => let scale ← readInt let count ← readNat let weights ← readRadixWeights count (← readNat) let pairs ← readPairDeltas (← readNat) 0 return .orthantSupport scale weights pairs | _ => fail def decode (fuel:Nat) (table:Array LinearWitness) (data:List Nat):Certificate := match readTree table fuel data with | some (cert,_) => cert | none => .leaf 0 [] end Green24Proof.FiveBitDenseData private def zz2045:"s07fd"="s07fd":=by decide+kernel end section /- Fixed-field integer arithmetic for the existing certificate language. The fast check is proved equal to the already justified checker. -/ namespace Green24Proof.EndToEndTupleCheck open IntegerQuadraticCertificates (Linear Quadratic Point Hinges product linearEval quadraticEval hingeEval) open OrthantQuadraticCertificates (Certificate Combination NonnegativeTerm Decomposition) structure Vec where a:Int b:Int c:Int d:Int structure Mat where a:Vec b:Vec c:Vec d:Vec def vec (v:Vec):Linear:=![v.a,v.b,v.c,v.d] def mat (m:Mat):Quadratic:=![vec m.a,vec m.b,vec m.c,vec m.d] def ofVec (v:Linear):Vec:=⟨v 0,v 1,v 2,v 3⟩ def ofMat (m:Quadratic):Mat:=⟨ofVec (m 0),ofVec (m 1),ofVec (m 2),ofVec (m 3)⟩ def zeroV:Vec:=⟨0,0,0,0⟩ def zeroM:Mat:=⟨zeroV,zeroV,zeroV,zeroV⟩ def addV (v w:Vec):Vec:=⟨v.a + w.a,v.b + w.b,v.c + w.c,v.d + w.d⟩ def scaleV (k:Int) (v:Vec):Vec:=⟨k * v.a,k * v.b,k * v.c,k * v.d⟩ def addM (m n:Mat):Mat:=⟨addV m.a n.a,addV m.b n.b,addV m.c n.c,addV m.d n.d⟩ def scaleM (k:Int) (m:Mat):Mat:=⟨scaleV k m.a,scaleV k m.b,scaleV k m.c,scaleV k m.d⟩ def productM (v w:Vec):Mat:=⟨scaleV v.a w,scaleV v.b w,scaleV v.c w,scaleV v.d w⟩ theorem vec_ofVec (v:Linear):vec (ofVec v) = v:=by funext i fin_cases i <;> rfl theorem mat_ofMat (m:Quadratic):mat (ofMat m) = m:=by funext i j fin_cases i <;> fin_cases j <;> rfl private def zz143:"s008f"="s008f":=by decide+kernel theorem vec_zero:vec zeroV = 0:=by funext i fin_cases i <;> rfl theorem mat_zero:mat zeroM = 0:=by funext i j fin_cases i <;> fin_cases j <;> rfl theorem vec_add (v w:Vec):vec (addV v w) = vec v + vec w:=by funext i fin_cases i <;> rfl theorem vec_scale (k:Int) (v:Vec):vec (scaleV k v) = k • vec v:=by funext i fin_cases i <;> simp [vec,scaleV,Pi.smul_apply] private def zz144:"s0090"="s0090":=by decide+kernel theorem mat_add (m n:Mat):mat (addM m n) = mat m + mat n:=by funext i j fin_cases i <;> fin_cases j <;> rfl theorem mat_scale (k:Int) (m:Mat):mat (scaleM k m) = k • mat m:=by funext i j fin_cases i <;> fin_cases j <;> simp [mat,scaleM,vec,scaleV,Pi.smul_apply] theorem mat_product (v w:Vec):mat (productM v w) = product (vec v) (vec w):=by funext i j fin_cases i <;> fin_cases j <;> rfl def context (C:Nat → Vec):Nat → Linear:=fun i => vec (C i) def cons (v:Vec) (C:Nat → Vec):Nat → Vec | 0 => v | i + 1 => C i theorem context_cons (v:Linear) (C:Nat → Vec) : context (cons (ofVec v) C) = OrthantQuadraticCertificates.cons v (context C):=by funext i cases i with | zero => exact vec_ofVec v | succ i => rfl private def zz145:"s0091"="s0091":=by decide+kernel theorem context_of (C:Nat → Linear):context (fun i => ofVec (C i)) = C:=by funext i exact vec_ofVec (C i) def combine (C:Nat → Vec):Combination → Vec | [] => zeroV | (k,i) :: rest => addV (scaleV k (C i)) (combine C rest) theorem vec_combine (C:Nat → Vec) (w:Combination) : vec (combine C w) = OrthantQuadraticCertificates.combine (context C) w:=by induction w with | nil => exact vec_zero | cons t ts ih => simp only [combine,OrthantQuadraticCertificates.combine,List.map_cons,List.sum_cons, vec_add,vec_scale,ih,context] def term (C:Nat → Vec):NonnegativeTerm → Mat | .square v => productM (ofVec v) (ofVec v) | .pair i j => productM (C i) (C j) theorem mat_term (C:Nat → Vec) (t:NonnegativeTerm) : mat (term C t) = OrthantQuadraticCertificates.termMatrix (context C) t:=by cases t <;> simp only [term,OrthantQuadraticCertificates.termMatrix,mat_product,vec_ofVec,context] def decompose (C:Nat → Vec):Decomposition → Mat | [] => zeroM | (k,t) :: rest => addM (scaleM k (term C t)) (decompose C rest) theorem mat_decompose (C:Nat → Vec) (d:Decomposition) : mat (decompose C d) = OrthantQuadraticCertificates.decompositionMatrix (context C) d:=by induction d with | nil => exact mat_zero | cons t ts ih => simp only [decompose,OrthantQuadraticCertificates.decompositionMatrix,List.map_cons, List.sum_cons,mat_add,mat_scale,mat_term,ih] def vecEq (v w:Vec):Bool := [(v.a,w.a),(v.b,w.b),(v.c,w.c),(v.d,w.d)].all fun p => p.1 == p.2 private def zz146:"s0092"="s0092":=by decide+kernel theorem vecEq_eq (v w:Vec) : vecEq v w = IntegerQuadraticCertificates.linearEq (vec v) (vec w):=by rfl def coefficientEq (Q R:Mat):Bool := [(Q.a.a,R.a.a),(Q.b.b,R.b.b),(Q.c.c,R.c.c),(Q.d.d,R.d.d), (Q.a.b + Q.b.a,R.a.b + R.b.a),(Q.a.c + Q.c.a,R.a.c + R.c.a), (Q.a.d + Q.d.a,R.a.d + R.d.a),(Q.b.c + Q.c.b,R.b.c + R.c.b), (Q.b.d + Q.d.b,R.b.d + R.d.b),(Q.c.d + Q.d.c,R.c.d + R.d.c)].all fun p => p.1 == p.2 theorem coefficientEq_eq (Q R:Mat) : coefficientEq Q R = QuadraticCoefficientCheck.coefficientEq (mat Q) (mat R):=by rfl def combinationCheck (C:Nat → Vec) (s:Int) (w:Combination) (v:Linear):Bool := decide (0 < s) && OrthantQuadraticCertificates.nonnegativeWeights w && vecEq (combine C w) (scaleV s (ofVec v)) theorem combinationCheck_eq (C:Nat → Vec) (s:Int) (w:Combination) (v:Linear) : combinationCheck C s w v = OrthantQuadraticCertificates.combinationCheck (context C) s w v:=by simp only [combinationCheck,OrthantQuadraticCertificates.combinationCheck, vecEq_eq,vec_combine,vec_scale,vec_ofVec] def decompositionCheck (C:Nat → Vec) (Q:Mat) (s:Int) (d:Decomposition):Bool := decide (0 < s) && (d.all fun t => decide (0 ≤ t.1)) && coefficientEq (decompose C d) (scaleM s Q) theorem decompositionCheck_eq (C:Nat → Vec) (Q:Mat) (s:Int) (d:Decomposition) : decompositionCheck C Q s d = OrthantQuadraticCertificates.decompositionCheck (context C) (mat Q) s d:=by simp only [decompositionCheck,OrthantQuadraticCertificates.decompositionCheck, coefficientEq_eq,mat_decompose,mat_scale] def coefficients (Q:Mat):Array Int := #[Q.a.a,Q.b.b,Q.c.c,Q.d.d,Q.a.b + Q.b.a,Q.a.c + Q.c.a, Q.a.d + Q.d.a,Q.b.c + Q.c.b,Q.b.d + Q.d.b,Q.c.d + Q.d.c] private def zz147:"s0093"="s0093":=by decide+kernel theorem coefficients_eq (Q:Mat) : coefficients Q = PureIntegerSupportCertificateData.matrixColumn (mat Q):=by simp [coefficients,PureIntegerSupportCertificateData.matrixColumn,mat,vec] theorem pairColumn_eq (a b:Vec) : coefficients (productM a b) = PureIntegerSupportCertificateData.pairColumn (vec a) (vec b):=by simp [coefficients,productM,scaleV,PureIntegerSupportCertificateData.pairColumn,vec] def supportDecomposition (C:Nat → Vec) (Q:Mat) (pairs:List (Nat × Nat)) : Int × Decomposition := if pairs.headD (0,0) == (64,3) then OrthantQuadraticCertificates.FourBasisRecovery.recover (context C) (mat Q) pairs else match BacksubIntegerElimination.solveScaled (pairs.toArray.map fun (i,j) => coefficients (productM (C i) (C j))) (coefficients Q) with | none => (0,[]) | some (scale,weights) => (scale,(weights.toList.zip pairs).map fun (weight,i,j) => (weight, .pair i j)) theorem supportDecomposition_eq (C:Nat → Vec) (Q:Mat) (pairs:List (Nat × Nat)) : supportDecomposition C Q pairs = OrthantQuadraticCertificates.supportDecomposition (context C) (mat Q) pairs:=by unfold supportDecomposition OrthantQuadraticCertificates.supportDecomposition split · rfl · simp only [pairColumn_eq] simp only [coefficients_eq,context] <;> split <;> simp_all def mixedSupportDecomposition (C:Nat → Vec) (Q:Mat) (pairs:List (Nat × Nat)) (squares:List Linear):Int × Decomposition := let terms:=(pairs.map fun (i,j) => NonnegativeTerm.pair i j) ++ (squares.map NonnegativeTerm.square) match BacksubIntegerElimination.solveScaled (terms.toArray.map fun t => coefficients (term C t)) (coefficients Q) with | none => (0,[]) | some (scale,weights) => (scale,weights.toList.zip terms) theorem mixedSupportDecomposition_eq (C:Nat → Vec) (Q:Mat) (pairs:List (Nat × Nat)) (squares:List Linear) : mixedSupportDecomposition C Q pairs squares = OrthantQuadraticCertificates.mixedSupportDecomposition (context C) (mat Q) pairs squares:=by simp only [mixedSupportDecomposition,OrthantQuadraticCertificates.mixedSupportDecomposition, coefficients_eq,mat_term] <;> split <;> simp_all def lowerMatrix:Hinges → Mat | [] => zeroM | (c,a) :: hs => addM (scaleM (min c 0) (productM (ofVec a) (ofVec a))) (lowerMatrix hs) private def zz148:"s0094"="s0094":=by decide+kernel theorem mat_lowerMatrix (hs:Hinges) : mat (lowerMatrix hs) = LowerHingeQuadratic.lowerMatrix hs:=by induction hs with | nil => simp only [lowerMatrix,LowerHingeQuadratic.lowerMatrix,List.map_nil,List.sum_nil,mat_zero] | cons h hs ih => obtain ⟨c,a⟩:=h simp only [lowerMatrix,LowerHingeQuadratic.lowerMatrix,List.map_cons,List.sum_cons, mat_add,mat_scale,mat_product,vec_ofVec,ih] def positiveV (v:Vec):Vec:=⟨max v.a 0,max v.b 0,max v.c 0,max v.d 0⟩ def negativeV (v:Vec):Vec:=⟨max (-v.a) 0,max (-v.b) 0,max (-v.c) 0,max (-v.d) 0⟩ theorem vec_positiveV (v:Vec):vec (positiveV v) = OrthantHingeBounds.positivePart (vec v):=by funext i fin_cases i <;> rfl theorem vec_negativeV (v:Vec):vec (negativeV v) = OrthantHingeBounds.negativePart (vec v):=by funext i fin_cases i <;> rfl def squareDifference (a b:Vec):Mat:=addM (productM a a) (scaleM (-1) (productM b b)) theorem mat_squareDifference (a b:Vec) : mat (squareDifference a b) = OrthantHingeBounds.squareDifference (vec a) (vec b):=by simp only [squareDifference,OrthantHingeBounds.squareDifference,mat_add,mat_scale,mat_product] def singleLower (scale c t:Int) (a:Linear):Mat := let v:=ofVec a if 0 ≤ c then scaleM t (squareDifference v (negativeV v)) else addM (scaleM (scale * c) (productM v v)) (scaleM t (squareDifference v (positiveV v))) private def zz149:"s0095"="s0095":=by decide+kernel theorem mat_singleLower (scale c t:Int) (a:Linear) : mat (singleLower scale c t a) = OrthantHingeBounds.singleLower scale c t a:=by by_cases hc:0 ≤ c <;> simp only [singleLower,OrthantHingeBounds.singleLower,hc,if_true,if_false, mat_add,mat_scale,mat_product,mat_squareDifference,vec_positiveV,vec_negativeV,vec_ofVec] def orthantLowerMatrix (scale:Int):Hinges → List Int → Mat | (c,a) :: hs,t :: ts => addM (singleLower scale c t a) (orthantLowerMatrix scale hs ts) | _,_ => zeroM theorem mat_orthantLowerMatrix (scale:Int) (hs:Hinges) (ts:List Int) : mat (orthantLowerMatrix scale hs ts) = OrthantHingeBounds.lowerMatrix scale hs ts:=by induction hs generalizing ts with | nil => cases ts <;> simp only [orthantLowerMatrix,OrthantHingeBounds.lowerMatrix,mat_zero] | cons h hs ih => obtain ⟨c,a⟩:=h cases ts <;> simp only [orthantLowerMatrix,OrthantHingeBounds.lowerMatrix, mat_zero,mat_add,mat_singleLower,ih] def check (cert:Certificate) (C:Nat → Vec) (Q:Mat) (hs:Hinges):Bool := match cert,hs with | .orthantSupport scale weights pairs,hs => let weights:=OrthantQuadraticCertificates.expandWeights scale hs weights let lower:=addM (scaleM scale Q) (orthantLowerMatrix scale hs weights) let (s,d):=supportDecomposition C lower pairs decide (0 < scale) && OrthantHingeBounds.weightsCheck scale hs weights && decompositionCheck C lower s d | .lowerSupport pairs,hs => let lower:=addM Q (lowerMatrix hs) let (scale,d):=supportDecomposition C lower pairs decompositionCheck C lower scale d | .lowerPsd,hs => IntegerPSDCheck.check 4 (mat (addM Q (lowerMatrix hs))) | .cut a p m,hs => check p (cons (ofVec a) C) Q hs && check m (cons (ofVec (-a)) C) Q hs | .mixedSupport pairs squares,[] => let (scale,d):=mixedSupportDecomposition C Q pairs squares decompositionCheck C Q scale d | .support pairs,[] => let (scale,d):=supportDecomposition C Q pairs decompositionCheck C Q scale d | .plan scale rows,[] => decompositionCheck C Q scale (OrthantQuadraticCertificates.planDecomposition (mat Q) rows) | .psd,[] => IntegerPSDCheck.check 4 (mat Q) | .leaf s d,[] => decompositionCheck C Q s d | .split p m,(c,a) :: hs => check p (cons (ofVec a) C) (addM Q (scaleM c (productM (ofVec a) (ofVec a)))) hs && check m (cons (ofVec (-a)) C) Q hs | .positive s w p,(c,a) :: hs => combinationCheck C s w a && check p (cons (ofVec a) C) (addM Q (scaleM c (productM (ofVec a) (ofVec a)))) hs | .negative s w m,(_,a) :: hs => combinationCheck C s w (-a) && check m (cons (ofVec (-a)) C) Q hs | _,_ => false theorem check_eq (cert:Certificate) (C:Nat → Vec) (Q:Mat) (hs:Hinges) : check cert C Q hs = OrthantQuadraticCertificates.check cert (context C) (mat Q) hs:=by induction cert generalizing C Q hs <;> cases hs <;> simp only [check,OrthantQuadraticCertificates.check,combinationCheck_eq, decompositionCheck_eq,supportDecomposition_eq,mixedSupportDecomposition_eq, mat_add,mat_scale,mat_product,vec_ofVec,context_cons, mat_lowerMatrix,mat_orthantLowerMatrix, *] theorem K {p:Certificate} {s:CheckpointPathData.State} (h:check p (fun i => ofVec (s.constraints i)) (ofMat s.quadratic) s.hinges = true := by decide +kernel):CheckpointPathData.V p s:=by rw [check_eq,context_of,mat_ofMat] at h exact h end Green24Proof.EndToEndTupleCheck private def zz2046:"s07fe"="s07fe":=by decide+kernel namespace Green24Proof.EndToEndTupleState open IntegerQuadraticCertificates (Linear Quadratic Hinges) open OrthantQuadraticCertificates (Certificate Combination) open EndToEndTupleCheck hiding K structure State where constraints:Nat → Vec quadratic:Mat hinges:Hinges def initial (C:Nat → Linear) (Q:Quadratic) (hs:Hinges):State := ⟨fun i => ofVec (C i),ofMat Q,hs⟩ def step (positive:Bool) (s:State):State := match s.hinges with | [] => s | (c,a) :: hs => if positive then ⟨cons (ofVec a) s.constraints, addM s.quadratic (scaleM c (productM (ofVec a) (ofVec a))),hs⟩ else ⟨cons (ofVec (-a)) s.constraints,s.quadratic,hs⟩ def follow:Nat → Nat → State → State | 0,_,s => s | fuel + 1,bits,s => if bits < 2 then s else follow fuel (bits / 2) (step (bits % 2 == 1) s) def path (bits:Nat) (s:State):State:=follow 7 bits s def V (p:Certificate) (s:State):Prop := check p s.constraints s.quadratic s.hinges = true def headVector (s:State):Linear:=(s.hinges.headD (0,0)).2 private def zz150:"s0096"="s0096":=by decide+kernel theorem K {p:Certificate} {s:State} (h:V p s:=by unfold V; decide +kernel):V p s:=h theorem S {p m:Certificate} {s:State} (hp:V p (step true s)) (hm:V m (step false s)) (hne:s.hinges.isEmpty = false:=by decide +kernel) : V (.split p m) s:=by cases s with | mk Cs Q hs => cases hs with | nil => cases hne | cons h hs => rcases h with ⟨c,a⟩ simpa [V,step,check] using And.intro hp hm theorem P {scale:Int} {weights:Combination} {p:Certificate} {s:State} (hp:V p (step true s)) (hw:combinationCheck s.constraints scale weights (headVector s) = true:=by decide +kernel) (hne:s.hinges.isEmpty = false:=by decide +kernel) : V (.positive scale weights p) s:=by cases s with | mk Cs Q hs => cases hs with | nil => cases hne | cons h hs => rcases h with ⟨c,a⟩ simpa [V,step,check,headVector] using And.intro hw hp theorem M {scale:Int} {weights:Combination} {p:Certificate} {s:State} (hp:V p (step false s)) (hw:combinationCheck s.constraints scale weights (-headVector s) = true:=by decide +kernel) (hne:s.hinges.isEmpty = false:=by decide +kernel) : V (.negative scale weights p) s:=by cases s with | mk Cs Q hs => cases hs with | nil => cases hne | cons h hs => rcases h with ⟨c,a⟩ simpa [V,step,check,headVector] using And.intro hw hp private def zz151:"s0097"="s0097":=by decide+kernel theorem root {p:Certificate} {C:Nat → Linear} {Q:Quadratic} {hs:Hinges} (h:V p (initial C Q hs)):OrthantQuadraticCertificates.check p C Q hs = true:=by change check p (fun i => ofVec (C i)) (ofMat Q) hs = true at h rw [check_eq,context_of,mat_ofMat] at h exact h end Green24Proof.EndToEndTupleState namespace Green24Proof.EndToEndTupleState def unpackStateInt (w data i:Nat):Int := let n:=(data >>> (i*w)) % (2^w) if n % 2 = 0 then Int.ofNat (n/2) else -(Int.ofNat (n/2))-1 def unpackStateMat (n:Nat):EndToEndTupleCheck.Mat := let w:=n % 256 let d:=n / 256 let a:=unpackStateInt w d 0 let b:=unpackStateInt w d 1 let c:=unpackStateInt w d 2 let e:=unpackStateInt w d 3 let f:=unpackStateInt w d 4 let g:=unpackStateInt w d 5 let h:=unpackStateInt w d 6 let i:=unpackStateInt w d 7 let j:=unpackStateInt w d 8 let k:=unpackStateInt w d 9 ⟨⟨a,f,g,h⟩,⟨f,b,i,j⟩,⟨g,i,c,k⟩,⟨h,j,k,e⟩⟩ def qPath (packet:Nat) (s:State):State := let next:=path (packet % 256) s ⟨next.constraints,unpackStateMat (packet / 256),next.hinges⟩ end Green24Proof.EndToEndTupleState private def zz2047:"s07ff"="s07ff":=by decide+kernel namespace Green24Proof.ExistentialState open IntegerQuadraticCertificates (Linear Quadratic Hinges) open OrthantQuadraticCertificates (Certificate Combination) open EndToEndTupleState (State initial step headVector) structure V (s:State):Prop where checked:∃ p,EndToEndTupleState.V p s theorem K (p:Certificate) {s:State} (h:EndToEndTupleState.V p s:=by unfold EndToEndTupleState.V; decide +kernel):V s := ⟨p,h⟩ theorem S {s:State} (hp:V (step true s)) (hm:V (step false s)) (hne:s.hinges.isEmpty = false:=by decide +kernel):V s:=by obtain ⟨p,hp⟩:=hp.checked obtain ⟨m,hm⟩:=hm.checked exact ⟨.split p m,EndToEndTupleState.S hp hm hne⟩ theorem P (w:Int × Combination) {s:State} (hp:V (step true s)) (hw:EndToEndTupleCheck.combinationCheck s.constraints w.1 w.2 (headVector s) = true:=by decide +kernel) (hne:s.hinges.isEmpty = false:=by decide +kernel):V s:=by obtain ⟨p,hp⟩:=hp.checked exact ⟨.positive w.1 w.2 p,EndToEndTupleState.P hp hw hne⟩ theorem M (w:Int × Combination) {s:State} (hp:V (step false s)) (hw:EndToEndTupleCheck.combinationCheck s.constraints w.1 w.2 (-headVector s) = true:=by decide +kernel) (hne:s.hinges.isEmpty = false:=by decide +kernel):V s:=by obtain ⟨p,hp⟩:=hp.checked exact ⟨.negative w.1 w.2 p,EndToEndTupleState.M hp hw hne⟩ theorem root {C:Nat → Linear} {Q:Quadratic} {hs:Hinges} (h:V (initial C Q hs)) : ∃ p,OrthantQuadraticCertificates.check p C Q hs = true:=by obtain ⟨p,hp⟩:=h.checked exact ⟨p,EndToEndTupleState.root hp⟩ end Green24Proof.ExistentialState namespace Green24Proof.IndexedNatTreeCheck open DictionaryOrthantPackedData (LinearWitness) open EndToEndTupleState (State step headVector) open EndToEndTupleCheck (combinationCheck) open ExistentialState (V) structure Table where indexBits:Nat data:Array Nat def readPairs:Nat → Nat → OrthantQuadraticCertificates.Combination | 0,_ => [] | count + 1,code => (Int.ofNat (code % 256),(code >>> 8) % 64) :: readPairs count (code >>> 14) def witness (table:Table) (index:Nat):LinearWitness := let word:=table.data.getD (index / 64) 0 let code:=(word >>> (66 * (index % 64))) % (1 <<< 66) (Int.ofNat ((code >>> 2) % 256),readPairs (code % 4 + 1) (code >>> 10)) def check (table:Table):Nat → Nat → State → Bool | 0,_,_ => false | fuel + 1,code,s => if code % 8 = 1 then let width:=(code >>> 3) % 65536 let content:=code >>> 19 (!s.hinges.isEmpty) && check table fuel (content % (1 <<< width)) (step true s) && check table fuel (content >>> width) (step false s) else if code % 8 = 2 then let w:=witness table ((code >>> 3) % (1 <<< table.indexBits)) (!s.hinges.isEmpty) && combinationCheck s.constraints w.1 w.2 (headVector s) && check table fuel (code >>> (3 + table.indexBits)) (step true s) else if code % 8 = 3 then let w:=witness table ((code >>> 3) % (1 <<< table.indexBits)) (!s.hinges.isEmpty) && combinationCheck s.constraints w.1 w.2 (-headVector s) && check table fuel (code >>> (3 + table.indexBits)) (step false s) else if code % 8 = 0 then EndToEndTupleCheck.check (FiveBitDenseData.decode (fuel + 1) #[] [code >>> 3]) s.constraints s.quadratic s.hinges else false theorem check_sound (table:Table) (fuel code:Nat) (s:State) (h:check table fuel code s = true):V s:=by induction fuel generalizing code s with | zero => simp [check] at h | succ fuel ih => simp only [check] at h split at h · simp only [Bool.and_eq_true] at h exact ExistentialState.S (ih _ _ h.1.2) (ih _ _ h.2) (by simpa using h.1.1) · split at h · simp only [Bool.and_eq_true] at h exact ExistentialState.P _ (ih _ _ h.2) h.1.2 (by simpa using h.1.1) · split at h · simp only [Bool.and_eq_true] at h exact ExistentialState.M _ (ih _ _ h.2) h.1.2 (by simpa using h.1.1) · split at h · exact ⟨_,h⟩ · cases h theorem K (fuel:Nat) (table:Table) (code:Nat) {s:State} (h:check table fuel code s = true:=by decide +kernel):V s := check_sound table fuel code s h end Green24Proof.IndexedNatTreeCheck namespace Green24Proof.DynamicHingeCheck open IntegerQuadraticCertificates open EndToEndTupleCheck hiding check open OrthantQuadraticCertificates (Combination Decomposition) def pick : Nat → Hinges → (Int × Linear) × Hinges | _, [] => ((0, 0), []) | 0, h :: hs => (h, hs) | n+1, h :: hs => let selected := pick n hs (selected.1, h :: selected.2) theorem pick_eval (n : Nat) (hs : Hinges) (x : Point) : hingeEval ((pick n hs).1 :: (pick n hs).2) x = hingeEval hs x := by induction n generalizing hs with | zero => cases hs <;> simp [pick, hingeEval] | succ n ih => cases hs with | nil => simp [pick, hingeEval] | cons h hs => simp only [pick] have hi := ih hs simp only [hingeEval, List.map_cons, List.sum_cons] at hi ⊢ rw [← hi] ring inductive Tree where | raw (p : OrthantQuadraticCertificates.Certificate) | mixed (scale : Int) (weights : List Int) (d : Decomposition) | split (p m : Tree) | cut (a : Linear) (p m : Tree) | positive (scale : Int) (w : Combination) (p : Tree) | negative (scale : Int) (w : Combination) (m : Tree) | positiveAt (index : Nat) (scale : Int) (w : Combination) (p : Tree) | negativeAt (index : Nat) (scale : Int) (w : Combination) (m : Tree) def check (t : Tree) (C : Nat → Vec) (Q : Mat) (hs : Hinges) : Bool := match t, hs with | .raw p, hs => EndToEndTupleCheck.check p C Q hs | .mixed scale weights d, hs => let lower := addM (scaleM scale Q) (orthantLowerMatrix scale hs weights) let remainder := addM lower (scaleM (-1) (decompose C d)) decide (0 < scale) && OrthantHingeBounds.weightsCheck scale hs weights && ((d.all fun term => decide (0 ≤ term.1)) && IntegerPSDCheck.check 4 (mat remainder)) | .split p m, (c,a)::hs => check p (cons (ofVec a) C) (addM Q (scaleM c (productM (ofVec a) (ofVec a)))) hs && check m (cons (ofVec (-a)) C) Q hs | .cut a p m, hs => check p (cons (ofVec a) C) Q hs && check m (cons (ofVec (-a)) C) Q hs | .positive scale w p, (c,a)::hs => combinationCheck C scale w a && check p (cons (ofVec a) C) (addM Q (scaleM c (productM (ofVec a) (ofVec a)))) hs | .negative scale w m, (_,a)::hs => combinationCheck C scale w (-a) && check m (cons (ofVec (-a)) C) Q hs | .positiveAt index scale w p, hs => let selected := pick index hs combinationCheck C scale w selected.1.2 && check p C (addM Q (scaleM selected.1.1 (productM (ofVec selected.1.2) (ofVec selected.1.2)))) selected.2 | .negativeAt index scale w m, hs => let selected := pick index hs combinationCheck C scale w (-selected.1.2) && check m C Q selected.2 | _, _ => false theorem check_sound (t : Tree) (C : Nat → Vec) (Q : Mat) (hs : Hinges) (x : Point) (hx : ∀ i, 0 ≤ x i) (hC : ∀ i, 0 ≤ linearEval (context C i) x) (h : check t C Q hs = true) : 0 ≤ quadraticEval (mat Q) x + hingeEval hs x := by induction t generalizing C Q hs with | raw p => rw [check, EndToEndTupleCheck.check_eq] at h exact OrthantQuadraticCertificates.check_sound p (context C) (mat Q) hs x hx hC h | mixed scale weights d => simp only [check, Bool.and_eq_true, decide_eq_true_eq] at h apply OrthantHingeBounds.nonnegative_of_lower scale (mat Q) hs weights x hx h.1.1 h.1.2 have hp := OrthantQuadraticCertificates.decomposition_nonneg (context C) d x hC h.2.1 have hr := IntegerPSDCheck.check_sound 4 _ h.2.2 x change 0 ≤ quadraticEval (mat (addM (addM (scaleM scale Q) (orthantLowerMatrix scale hs weights)) (scaleM (-1) (decompose C d)))) x at hr simp only [mat_add, mat_scale, mat_decompose, mat_orthantLowerMatrix, quadraticEval_add, quadraticEval_smul, Int.cast_neg, Int.cast_one, neg_one_mul] at hr ⊢ linarith | split p m hp hm => cases hs with | nil => simp [check] at h | cons v hs => rcases v with ⟨c,a⟩ simp only [check, Bool.and_eq_true] at h by_cases ha : 0 ≤ linearEval a x · apply positive_step (mat Q) c a hs x ha have hc := OrthantQuadraticCertificates.cons_constraints (context C) a x hC ha rw [← context_cons] at hc simpa only [mat_add, mat_scale, mat_product, vec_ofVec] using hp _ _ _ hc h.1 · have ha' : 0 ≤ linearEval (-a) x := by rw [linearEval_neg]; linarith apply negative_step (mat Q) c a hs x (le_of_not_ge ha) have hc := OrthantQuadraticCertificates.cons_constraints (context C) (-a) x hC ha' rw [← context_cons] at hc exact hm _ _ _ hc h.2 | cut a p m hp hm => simp only [check, Bool.and_eq_true] at h by_cases ha : 0 ≤ linearEval a x · have hc := OrthantQuadraticCertificates.cons_constraints (context C) a x hC ha rw [← context_cons] at hc exact hp _ _ _ hc h.1 · have ha' : 0 ≤ linearEval (-a) x := by rw [linearEval_neg]; linarith have hc := OrthantQuadraticCertificates.cons_constraints (context C) (-a) x hC ha' rw [← context_cons] at hc exact hm _ _ _ hc h.2 | positive scale w p hp => cases hs with | nil => simp [check] at h | cons v hs => rcases v with ⟨c,a⟩ simp only [check, Bool.and_eq_true, combinationCheck_eq] at h have ha := OrthantQuadraticCertificates.combinationCheck_sound _ _ _ _ x hC h.1 apply positive_step (mat Q) c a hs x ha have hc := OrthantQuadraticCertificates.cons_constraints (context C) a x hC ha rw [← context_cons] at hc simpa only [mat_add, mat_scale, mat_product, vec_ofVec] using hp _ _ _ hc h.2 | negative scale w m hm => cases hs with | nil => simp [check] at h | cons v hs => rcases v with ⟨c,a⟩ simp only [check, Bool.and_eq_true, combinationCheck_eq] at h have ha := OrthantQuadraticCertificates.combinationCheck_sound _ _ _ _ x hC h.1 have ha' : linearEval a x ≤ 0 := by rw [linearEval_neg] at ha; linarith apply negative_step (mat Q) c a hs x ha' have hc := OrthantQuadraticCertificates.cons_constraints (context C) (-a) x hC ha rw [← context_cons] at hc exact hm _ _ _ hc h.2 | positiveAt index scale w p hp => simp only [check, Bool.and_eq_true, combinationCheck_eq] at h have ha := OrthantQuadraticCertificates.combinationCheck_sound _ _ _ _ x hC h.1 have hd := hp _ _ _ hC h.2 have he := positive_step (mat Q) (pick index hs).1.1 (pick index hs).1.2 (pick index hs).2 x ha (by simpa only [mat_add, mat_scale, mat_product, vec_ofVec] using hd) simpa only [Prod.mk.eta, pick_eval] using he | negativeAt index scale w m hm => simp only [check, Bool.and_eq_true, combinationCheck_eq] at h have ha := OrthantQuadraticCertificates.combinationCheck_sound _ _ _ _ x hC h.1 have ha' : linearEval (pick index hs).1.2 x ≤ 0 := by rw [linearEval_neg] at ha linarith have he := negative_step (mat Q) (pick index hs).1.1 (pick index hs).1.2 (pick index hs).2 x ha' (hm _ _ _ hC h.2) simpa only [Prod.mk.eta, pick_eval] using he end Green24Proof.DynamicHingeCheck namespace Green24Proof.DynamicPackedCheck open IntegerQuadraticCertificates (Linear Hinges) open EndToEndTupleCheck open OrthantQuadraticCertificates (Combination Decomposition) open DynamicHingeCheck (Tree pick) structure Tables where stride : Nat witnesses : Array Nat cuts : Array Linear def witnessCode (tables : Tables) (index : Nat) : Nat := let word := tables.witnesses.getD (index / 64) 0 (word >>> (tables.stride * (index % 64))) % (1 <<< tables.stride) def readPairs (width : Nat) : Nat → Nat → Combination | 0, _ => [] | n+1, code => (Int.ofNat (code % (1 <<< width)), (code >>> width) % 64) :: readPairs width n (code >>> (width + 6)) def witness (code : Nat) : Int × Combination := let width := code % 1024 let count := (code >>> 10) % 16 let body := code >>> 14 (Int.ofNat (body % (1 <<< width)), readPairs width count (body >>> width)) def readWeights : Nat → Nat → Nat → Int → Hinges → List Int × Nat | 0, _, code, _, _ => ([], code) | _+1, _, code, _, [] => ([], code) | n+1, width, code, scale, (c,_)::hs => let tag := code % 4 let value := if tag = 1 then scale * Int.ofNat c.natAbs else if tag = 2 then Int.ofNat ((code >>> 2) % (1 <<< width)) else 0 let next := if tag = 2 then code >>> (2 + width) else code >>> 2 let rest := readWeights n width next scale hs (value :: rest.1, rest.2) def readTerms (width : Nat) : Nat → Nat → Decomposition | 0, _ => [] | n+1, code => let weight := Int.ofNat (code % (1 <<< width)) let i := (code >>> width) % 64 let j := (code >>> (width+6)) % 64 let rest := readTerms width n (code >>> (width+12)) if i = j then (weight, .pair i j) :: rest else (weight, .pair i j) :: (weight, .pair j i) :: rest def leaf (code : Nat) (hs : Hinges) : Tree := let scaleWidth := code % 1024 let width := (code >>> 10) % 1024 let count := (code >>> 20) % 64 let terms := (code >>> 26) % 16 let body := code >>> 30 let scale := Int.ofNat (body % (1 <<< scaleWidth)) let weights := readWeights count width (body >>> scaleWidth) scale hs .mixed scale weights.1 (readTerms width terms weights.2) def readSupportPairs : Nat → Nat → List (Nat × Nat) × Nat | 0, code => ([], code) | n+1, code => let rest := readSupportPairs n (code >>> 12) (((code % 64, (code >>> 6) % 64) :: rest.1), rest.2) def signed (n : Nat) : Int := if n % 2 = 0 then Int.ofNat (n / 2) else -(Int.ofNat (n / 2) + 1) def readSquares : Nat → Nat → List Linear | 0, _ => [] | n+1, code => let width := code % 1024 let data := code >>> 10 let mask := 1 <<< width ![signed (data % mask), signed ((data >>> width) % mask), signed ((data >>> (2 * width)) % mask), signed ((data >>> (3 * width)) % mask)] :: readSquares n (data >>> (4 * width)) def symmetricTerms (d : Decomposition) : Decomposition := d.flatMap fun (w, t) => match t with | .pair i j => [(w, .pair i j), (w, .pair j i)] | .square a => [(2 * w, .square a)] def supportLeaf (code : Nat) (C : Nat → Vec) (Q : Mat) (hs : Hinges) : Tree := let scaleWidth := code % 1024 let width := (code >>> 10) % 1024 let count := (code >>> 20) % 64 let terms := (code >>> 26) % 16 let body := code >>> 30 let scale := Int.ofNat (body % (1 <<< scaleWidth)) let weights := readWeights count width (body >>> scaleWidth) scale hs let pairs := readSupportPairs terms weights.2 let squares := readSquares (pairs.2 % 16) (pairs.2 >>> 4) let lower := addM (scaleM scale Q) (orthantLowerMatrix scale hs weights.1) let recovered := mixedSupportDecomposition C lower pairs.1 squares .mixed (2 * scale * recovered.1) (weights.1.map fun t => 2 * t * recovered.1) (symmetricTerms recovered.2) def check (tables : Tables) : Nat → Nat → (Nat → Vec) → Mat → Hinges → Bool | 0, _, _, _, _ => false | fuel+1, code, C, Q, hs => if code % 8 = 0 ∨ code % 8 = 5 then DynamicHingeCheck.check (if code % 8 = 5 then supportLeaf (code >>> 3) C Q hs else leaf (code >>> 3) hs) C Q hs else if code % 8 = 1 then match hs with | [] => false | (c,a)::tail => let width := (code >>> 3) % (1 <<< 24) let data := code >>> 27 check tables fuel (data % (1 <<< width)) (cons (ofVec a) C) (addM Q (scaleM c (productM (ofVec a) (ofVec a)))) tail && check tables fuel (data >>> width) (cons (ofVec (-a)) C) Q tail else if code % 8 = 2 then let index := (code >>> 3) % 64 let w := witness (witnessCode tables ((code >>> 9) % 4096)) let selected := pick index hs combinationCheck C w.1 w.2 selected.1.2 && check tables fuel (code >>> 21) C (addM Q (scaleM selected.1.1 (productM (ofVec selected.1.2) (ofVec selected.1.2)))) selected.2 else if code % 8 = 3 then let index := (code >>> 3) % 64 let w := witness (witnessCode tables ((code >>> 9) % 4096)) let selected := pick index hs combinationCheck C w.1 w.2 (-selected.1.2) && check tables fuel (code >>> 21) C Q selected.2 else if code % 8 = 4 then let a := tables.cuts.getD ((code >>> 3) % 4096) 0 let width := (code >>> 15) % (1 <<< 24) let data := code >>> 39 check tables fuel (data % (1 <<< width)) (cons (ofVec a) C) Q hs && check tables fuel (data >>> width) (cons (ofVec (-a)) C) Q hs else false theorem check_exists (tables : Tables) (fuel code : Nat) (C : Nat → Vec) (Q : Mat) (hs : Hinges) (h : check tables fuel code C Q hs = true) : ∃ t, DynamicHingeCheck.check t C Q hs = true := by induction fuel generalizing code C Q hs with | zero => cases h | succ fuel ih => simp only [check] at h split at h · exact ⟨_, h⟩ · split at h · cases hs with | nil => cases h | cons head tail => rcases head with ⟨c,a⟩ simp only [Bool.and_eq_true] at h obtain ⟨p,hp⟩ := ih _ _ _ _ h.1 obtain ⟨m,hm⟩ := ih _ _ _ _ h.2 exact ⟨.split p m, by simpa only [DynamicHingeCheck.check, Bool.and_eq_true] using And.intro hp hm⟩ · split at h · simp only [Bool.and_eq_true] at h obtain ⟨p,hp⟩ := ih _ _ _ _ h.2 exact ⟨.positiveAt _ _ _ p, by simpa only [DynamicHingeCheck.check, Bool.and_eq_true] using And.intro h.1 hp⟩ · split at h · simp only [Bool.and_eq_true] at h obtain ⟨m,hm⟩ := ih _ _ _ _ h.2 exact ⟨.negativeAt _ _ _ m, by simpa only [DynamicHingeCheck.check, Bool.and_eq_true] using And.intro h.1 hm⟩ · split at h · simp only [Bool.and_eq_true] at h obtain ⟨p,hp⟩ := ih _ _ _ _ h.1 obtain ⟨m,hm⟩ := ih _ _ _ _ h.2 exact ⟨.cut _ p m, by simpa only [DynamicHingeCheck.check, Bool.and_eq_true] using And.intro hp hm⟩ · cases h theorem check_sound (tables : Tables) (fuel code : Nat) (C : Nat → Vec) (Q : Mat) (hs : Hinges) (x : IntegerQuadraticCertificates.Point) (hx : ∀ i, 0 ≤ x i) (hC : ∀ i, 0 ≤ IntegerQuadraticCertificates.linearEval (context C i) x) (h : check tables fuel code C Q hs = true) : 0 ≤ IntegerQuadraticCertificates.quadraticEval (mat Q) x + IntegerQuadraticCertificates.hingeEval hs x := by obtain ⟨t,ht⟩ := check_exists tables fuel code C Q hs h exact DynamicHingeCheck.check_sound t C Q hs x hx hC ht end Green24Proof.DynamicPackedCheck namespace Green24Proof.DynamicPackedCheck open IntegerQuadraticCertificates (Quadratic Hinges Point linearEval quadraticEval hingeEval) theorem scalar_nonnegative (tables : Tables) (fuel code : Nat) (Q : Quadratic) (hs : Hinges) (D : Int) (valid : check tables fuel code (fun i => EndToEndTupleCheck.ofVec (ScalarRowDefaults.constraintsNat i)) (EndToEndTupleCheck.ofMat Q) hs = true) (hD : 0 ≤ D) (x : Point) (hx : ∀ i, 0 ≤ x i) : 0 ≤ (quadraticEval Q x + hingeEval hs x) / (D : ℝ) := by apply div_nonneg · have hC : ∀ i, 0 ≤ linearEval (ScalarRowDefaults.constraintsNat i) x := by intro i have hc (j : Fin 4) : 0 ≤ linearEval (ScalarRowDefaults.constraints j) x := by fin_cases j <;> simpa [ScalarRowDefaults.constraints, linearEval, Fin.sum_univ_succ] using hx _ exact hc ⟨i % 4, Nat.mod_lt _ (by decide)⟩ have h := check_sound tables fuel code _ _ hs x hx (by simpa only [EndToEndTupleCheck.context_of] using hC) valid simpa only [EndToEndTupleCheck.mat_ofMat] using h · exact_mod_cast hD end Green24Proof.DynamicPackedCheck namespace Green24Proof.QuadParityFourFifthsCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l25 l27 l29 l30 l33 l34 l35 l37 l4 l41 l43 l51 l6 l60) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x9c5fc0d, -0x6dd746b, -0xa4cb5a8,0x703a88], ![-0x6dd746b, -0x34cf3bd5,0xb48304c,0x42c87d5], ![-0xa4cb5a8,0xb48304c, -0x2ca98588,0x6e37a41], ![0x703a88,0x42c87d5,0x6e37a41, -0x36ee800]] noncomputable def hinges:Hinges:=[(-0x1376e,l6),(0x8f4f6,l4),(0x1425b88,l14),(0xc95b431,l15),(-0x36ee800,l27),(0x36ee800,l29),(-0x1425b88,l25),(0xa12dc4,l30),(0x36ee800,l33),(-0x36ee800,l35),(0x36ee800,l37),(-0x8f4f6,l34),(-0xa12dc4,l43),(-0xc95b431,l41),(0x36ee800,l51),(0x1376e,l60)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x36ee800,l27),(0x36ee800,l29),(0x36ee800,l33),(-0x36ee800,l35),(0x36ee800,l37),(0x36ee800,l51),(0xc95b431,l15),(-0xc95b431,l41),(0x1425b88,l14),(-0x1425b88,l25),(0xa12dc4,l30),(-0xa12dc4,l43),(0x8f4f6,l4),(-0x8f4f6,l34),(-0x1376e,l6),(0x1376e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x1901880200000000b014802a20ca10805c100500000001a014802000000005018802000138110058c0400250982402d003000000078024803000001e09038c02000019894028c03000001b11018c0200000001601480200000161201cc020000000b00248030000000d80248030001a8110050c04000019024030c0300001a044038c03000001916038c0200321504c07900300000220d038c02000002a15038c02003c19828069003000001b06038c0200000001903880200000151103cc02000016084078c0300330d0480790030000001a0c0cc0100000002e014802000000026014802000001306038c02000000120c0cc0100000190701cc02000000022014802000001a0d038c02000000906018c02000000009018802000008828030c03000001505028c02000022084068c0300000001103880200000002a01480200000000903880200000110d03cc02000010870078c03000000032014802000000e09038c02000011854028c03000001309018c020560901602750040520a81200f500405c0a01c017500400000009802480300000000e01480200000110b018c02000000070024803000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x28a9c879b51248015ba80920007c63050ea37a08424706172cf94300054a40700028ab3013840e804002c17658c92edf1650df5663984a94b65996486f92b418137b23d38a0a9e27ba820f0664cf13820e0042cb58db85285947f635b58e2400027961849b422cc62c92e28886c604b11f0ce45076ed039c1c00006894c30021fb43e6524107c0500003527094c09f623055a35e7d2c30e11ce830275fd7d62c1747ce9a041bd70cb00c000006119c0070021c480003b6118496b625ec96480001194182e3fa133b9810472729a960e31b9ead8c086937f8c1c00004e6f9180136202c57a40080050000360403c1400063240018ccc93a64ee8081438a4bea82448e5c85e91118204a9e6f2050604cc258c18121bf149f030208099d4f8609bb280e86180b90b45820789082201c50e685c81b048e00002ee020818df7a605065604fce4604343c287c3021152428a1820037119648075a2773400123986d3014908200140000da103901000) <<< 16000) + 0x1d6195a360dbb9cde92c239b63e53e40e0775be03badefb8d8b1e07768033b70c1ec44fde6cda723d2a0b18e39429028e28a0020085817ddf6dd35663e32c607aebbb850da7c3f03b06cd14b788624c37448ee39e2ac94a82f9b9bd729852a093a0005ee6066a1c310830c3856164061447bef71922115659091c49c5d049830880fe1cb49048697b509001dd60d0414066283aa2200451be11c00314303e0280001de3042195743858e49954ba90380e12c5848c22e1c6390311234814286310a619061c4dc7a941801e055e60402408d61849041e00c58e1107d9b848c18381f6840c00001c2028619d62f661871ae5adc85840f50968648490d1ba1e5821c2ada344009e0f351464821000800006c481c02b8ffaca7c2865235619429c74b2481440a80c38be60a3f1408dd95b0160c190040000819915924bc112205c46021c4b1bf9ce308ed664788005562570a028b89e50805cb5ad0013880d80400004e881b8480d824000c3840d4472b46c1642d474901929493e0000dedc307b113f79b369c8f4a82c420838638420418210200077141aac3234df7941dc880c7c5f58464c0b515552ec4a096cace79c9b2062c4c0ff84f61be54b284d174a6c6247c18e8001571c108382d5b8e1840d91b368f0c0886eaa005a18228098fe2e0c00afafdb01c28115c7f1468080286cd507d08083a60b57fd07409fb503433e9ca0980b00003ce40d0460660a0320140d95fe3a84e1c278ced60390c13fc94df7a8508d1ff67604400501eba0a21c0600fe473f8a00d2d5bb50d10d2d65c4e54596b1057ab8c71c2502840ac6d0dc09ecc8c71411e321f01318102706b6643abacd1c4052c9c03b4cc020400548596227c00032edc94968436613a0a18660c0b2ac56b67bdb80b3dedbe0e09441029020e20810c00400200180c0100680007490140980982ecab15ad9ef6e02cf7b6f83825104884082042820823000000060500401b6558ad6cf7b70167bdb7c1c12462852451431821020c0000030180200db276d97f85ba6b5e50e74515de182cf92853a1ee3b6fc5c2122ca4f562e51883870c183a2d6390e9c3040c873b660a91218026586183a7cfb80e95482a7a0ec8e0d6931c30d41a000047640c4440006a840011708003a81a2057adba401839bd9836e63059c59dba347078ba201160c0a38d4541c14025abc4528200005e6ae6000182fc8c47191008460408197ddd8f27205073bc5c4071761f299171c28c579062860982c21c2b1c11653f6f4c6040175e4c20c02ea8b2660850084403800019820601202f090170480b4040580202b010001e8902a218148ec050660501ba203ecca6de79bd13c359768f0306408790022f50781b153724b9aec4b03422f0a58e02e781abb47368681ccb5999d3f873fd0a013989ecbb40c3506828f819b88a020c040108862d0b6fbc4de054d96304888a11a028546d885e0321e87822f5621377b0832456c5a02ae562605c6f7f958af26aa71235b28372b127414651289b7bfd89e3504475a9214df4317f4353fdc2963e0c428a2c94a03090df35a249aa38a82860d1353285006fa11850005ae0098406002182c54f42501558b6c38007a81c080a910a80481830010a140e8bd650245dd49141ee37ad9200122d9e4001900840000401000004460000200800b0100001b9d193ee63c70b0372fc90020cd745005aa2be4001800840000401000004460000200800b0100001b9000140200053e4000dbcd0e1033128e395878184862581e718095a0560183a4d493040e64d4e400036905f04e1034010a10d225af94186e51f418220f8fbe2045ee22c830a2f3aad9401574cb726041b008508014f1f102fe0ca206144df02c9820c80200002448000dc90250d007068000cb48138ae048018f1c03a68c0c031fe28c0050021000010040000111a2a802631c01bbebc3031c5be26082c0080000883000010045058e6858e00852f10c090f8111800b804000022480d82800036cc8600968ef142001e5f1041565d66203048758db92000e80424386103c060a32df6e1411f4b334305e96b4918021186f0200acce8200083b61427001a0080000959025050070080008d48108280801403e0a0004e620282301309c0a0b38fe030e40689212001e40ec18006fb50e280046a144400001ea993020d8042094885da0d0000871b0c00005750080003f87f2000d80420000200800002220001f240381602a0b00d0581300803007045b982b881147c16820824b5a21430ded389010f549a8900f79446280d06f5d009c40640216be9e891d6e607f2ca4b447a4eba35ca5c4481e0a02568d82c85a8e9203252927c0001b555a124b261861a98893e5585a638280c8c1c0000000000000c496565acc4ac0b42453032031c01800f01e54b9430b44846f2ae14dd7fb6733f7ce186bc81fb3b68d9ce8140a75595934748abfa254926204b47755a2dd8d11021f8d795f39d717f150ced366c0200401165d5251f071477b47a7883df6b52822ab7551e007d75f8a0113c82e4002ed71009c206402000025040005948002e71811dd76e8410064b685099ab1dc706517074a00de15943024e5730009850600200002064094640010904090770000100460c15e6a18733054282157b88c0029e02400150080000521a120731514131f16c5805c1de040262ef212020b80400002b8811848088140420a0200100f8080780603a0200023d2001ab44006a20edb36b24f6bfcaa3e5b22ce4ab4f36eb20742e1374000000000000000722c04785988d44a27a13)) <<< 16000) + 0xee00a62c618973240dc0800000000000001aabc23c2024909de43b3f34eb70bbd59d816cb2100000000000000000000000000000000000000009c6206182300280080a001d2ec831fd8d5f24ef506790755f7ac9d6deb4d3b02c7cd2c30371324821d3566d7a90eae3e5d14e29cf242d36cae77f1a2622009b769d43d6fd09928660235bfb0d3b4cbf7364953a3f4bfbb6119b615d5252a62a49d500060f2004afe400cc74f1e94cd578ab099ee07d14169070c241671cb3a5228b13fb8a587056ed11c4ec4b7006dabbfabc6062bf8067488ac17d5526742c4049c3abd867ceb952c568fa684006a5007a9709bef437dd59ec301ab925db76b6370b90d8398901310f4628bbc7e43d8d88f6e8b9df5179d9cecf8c9c71704214d2cd2b1b42eb29c9eb4dbca39ce718577102c000000000000000000000000000000000000002608a21010e10a10e08200000274ecbb7e663d9acf584aca95a8353c87a2a5b9e40426a28370dc6ad47b11f7beaa72b0c820aeac3eee31524ad9258f78c6041005d782080e669fd0460c1d7844c408131deb8200af661b9009850700214d2cd2b1b42eb29c9eb4dbca39ce718577102c000000000000000000000000000000000000002609451421220e21218e08a00600260400401ba38000119418396b625ec94380003b6118363fa133b9a1631b9ead8a106937f8c1808472729a980136202c51400004e6f97a4008005183a5f63f71832ceca6c9a187040eb1a13a075640415f5e3a3180bb6f5b680000044694e00380100001393638e813a38e38025f8c1830703ce0163438691496280064c51808d965d30c000809cd020017df6534020e004000058c80e02f885880621f6690ac2d0d844b20000317b81a38fc50ea821c3b1004f0ec6856ec3e9e98604933a6b948209123135242c00010573e19090023024710e24b3a8d21ba5b699a394a251e1c3e28dee2685d0c5a88604bd3b1c82095e90f0000001101d4000d8040000564f10404c8521348423cd971164000045468d1cc7c25e8070c5efc86511c3404c33191a14a140e648304de6c850e5800016e08a8d20042038e2070318a5b4114d20e78c4ad774f4d1caf1952390118e18a7147180369470ce0e24d750dccd0a00db9a97e620304c19487df78c00000020707b0bb3d0901000600a800021420007d4781dda1b8d8b10eeb7b8775be019a7a174b0459492c05e4870548c30c28b1cc18b18704504600c0200803406c140002d240023308006bf1000f61200212e4004ebc80180a8805f57ac50884762d0c0873d84f141d0e9c9620004aace65001b00851000164a0e100036e8142240d92a302004ce80507202a0a4a00360100000e320220301a0180800c0640722217853c3880db4638a19bca82c206b456130e16ab758a5830d04f58c0001cdb210058e3ea500034010910000022030600004461030daa9c40e106ea569c30a68588192800e80400003b880780c0600702804a329206145c01c236588053c9aec244163984aa8a26c8a7acd850e393ed40240400381f6c1028d39c5bb9000005265ea84801080e30a682ed34ecc4c59244341769a766262c8a2708caf8655af10850ed21d1973d552ac205690e8cb9eaa956f29a7ec0a00720f80001963c400784e4b4851047fb19215283024a87275080c45f6c5f62103a8ea45dd64409baa8918941c1002319fe10305ba1c299101c000118cff08fa12084c0580001ed3038008b96144469b04a406b74389840e4a248b88168d42fc241011e0493000d804207000e0d0288bc24c5080db8bcf2881493b5b52410606206380002f618200096d6b4e0036010000132202e0a00026d2000ff8603006af00184ae4cb6c20a1f30a708080308300c160e47335001b0047100c6f150e1807f3101421a969f8184ea0b8043073c52a28a0007dafe08036a5f3b3800d80400004c480b0280380402a0200026e2001a4840502602613a1866c81196208011bd7da0c300e489d90e1044ec5df060a7d2af41628410d4e53d24100ddeafa0a00027ee04b220008408143030dece18659aa230e102dbd62305eb6198920800355d2800d004000037c80900c0340601803b1c04c0321c3f5d9b4c40c0b6d040c2972d290901068021639a44b5f20383e3ef8386a0d4244b083728fa06103f55de2c02ae996e4c083601000010d34309605b64881032358821587c54384567ff10c169354481039935d30000da411413840d00400004bc805068000d0880888c0403704a9c9485835c36506000c0298401d34e990005c02100001004000011100f01d167ce2f0208eb2581c00a5eec180bec5164001700840000401000004460905422060011d55060113b99040128bb648082e0100000ae200036440381601a0300c01c010040100160b8000080238502e791230512a9028a043783e11200070ee690006c02000017a60000200891800c208484514106182f6baf5920012bfb64001900800005a90000f2200040e7060fd51a102d041fa58150ad9a300218f4c0807489c404a18300100000da3456b349e2871ff3ac38a01697c9102f6060e20001df0094405c0200001b04028540008ac4001dec8006f29001d9e345e34cf61850c66d41851415a14f8944040ebc9921000c52a8b43000e0751008010860c3509c307802185035a965d03948145951ca507719691810139f4e9595a0141287d569ec5684101000fd90c267740001976e4a4b486cc27450c340580000d710091100406801c2400c0a00501002008000e4c8018c8008640020200001001c9e1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityFourFifthsCase0" = "QuadParityFourFifthsCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityFourFifthsCase0 private def zz2048:"s0800"="s0800":=by decide+kernel end section namespace Green24Proof.QuadParityFourFifthsCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l25 l27 l29 l30 l33 l34 l35 l37 l4 l41 l43 l46 l51 l6 l60 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xa5a8144, -0x6dd746b, -0xa4cb5a8,0x59c241], ![-0x6dd746b, -0x346708f4,0xaf1de58,0x459eb38], ![-0xa4cb5a8,0xaf1de58, -0x2ca98588,0x6e37a41], ![0x59c241,0x459eb38,0x6e37a41, -0x36ee800]] noncomputable def hinges:Hinges:=[(-0x1376e,l6),(0x8f4f6,l4),(0x16a02dc,l14),(0xc6f4566,l15),(-0x36ee800,l27),(0x36ee800,l29),(-0x16a02dc,l25),(0xbd1e7e,l30),(0x36ee800,l33),(-0x36ee800,l35),(0x36ee800,l37),(-0x8f4f6,l34),(-0xbd1e7e,l43),(-0xc6f4566,l41),(0x13e069,l46),(0x36ee800,l51),(0x1376e,l60),(-0x13e069,l64)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x36ee800,l27),(0x36ee800,l29),(0x36ee800,l33),(-0x36ee800,l35),(0x36ee800,l37),(0x36ee800,l51),(0xc6f4566,l15),(-0xc6f4566,l41),(0x16a02dc,l14),(-0x16a02dc,l25),(0xbd1e7e,l30),(-0xbd1e7e,l43),(0x13e069,l46),(-0x13e069,l64),(0x8f4f6,l4),(-0x8f4f6,l34),(-0x1376e,l6),(0x1376e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x1601480200000161201cc020000000b00248030000000d80248030001a8110050c04000019024030c0300001a044038c03000000003c0c80100000001d024802003208830029003000001916038c0200000882c090c030510d01503990040002e190702900200321504c07900300000220d038c02000002a15038c0209421839037d004003c19828069003000001b06038c02000000019038802003c198280a900300000151103cc02000016084078c0300330d0480790030000001a0c0cc0100000003201480200000002a01480200000088004c804000001306038c020044118280a9003000000120c0cc0100000210f01cc0200000c84c090c03000000000c0c801000001a0d038c02000000906018c02000000009018802000008828030c0300000000140c801000001505028c02004c1482c049003000022084068c03000000011038802000009824090c0300000000903880200000110d03cc02000010870078c03000000001c0c80100000000240c801000000011024802000000e09038c0200290d024089003000011854028c03000001309018c0204d08c1200c90040560901602750040520a81200f500405c0a01c017500400000009802480300000000e01480200000110b018c02000000070024803000000012014802,0x2e0a03cc02000090130370c040027408c00a4c05000260130064c040000188a4058c0300000000901c802000000002c0c80100026043004cc0400000261301cc0200000098004c804000000019018802000002a1101cc0200000000b014802a20ca10805c100500000001a014802000000005018802000138110058c0400250982402d003000000078024803000001e09038c02f208a0b40631005000019894028c03000001b11018c02], #[]⟩ def dynamicCode : Nat := ((((((((((0x69b332d94dc41c60002ba8c1c6194ecb2309a1a54e0a07b4e661415df952a11a4800278e7085020250b0f6e1a027af1fde9c7d08042602c775be03badefafef0db386da032ecab068ed9b8e2f7914779e89df651e8057980800000000000000000000000000000000000000002791a69861a51851a494098002018040100680011c105605e981801e920de330084e2cae320e1a504f7671a41abd7cff67d8b9d53462e7c55941cc609a4705a0e79e4557f602407051ab626b939014ac0609aa3c1dfc542558a000000b47ad43bb416842f2c1a9e2010fc251a6198fc78020580003b611c5936d22621a588a1076d1c12cac26cf8e0c4617ab20608bac5e442000004e6f91c00c4420e29e904200140000d91e2ca867518e1d57eca94d142ce4138e0c832d7f4e0acde8288d0772d851400000165927001c00840b000076c238b2a829aae34b00002328387c1e270903820b730fbb341ceeb0b942010a84e6c64000009cdf238025fd58a9f4801000a00006c4812828000c688003d01b2808139f184c82c9ff2c951def5c60aba540d4b04c61c7) <<< 16000) + 0x494086addf02402fc1466ce0836010c31c4ef301a5662a9523468a6a17c58400c43f47080f0d279a0cab270328000545533800d8043489fbf5c83c1041831c06f01030d5b1f7832c200014cd1e10244f63cfa70c209335a39f08254b55108a3406fc6d104c0c000074e5b4d82400900a00003b24000c9882a8481441400093e649cdae66821838001d469ca1c848d5e9250a5e73362a2414717ea980208d4e6bf18c0009f415684802c9d211a18000000ed84d200420300540100780814c040a40204d010001119b2ec39daa309ad83fd4b25c99079305e18eca450e2a3ccc04162deb68900d18d3f27041a008694160e269433c708a849f09183842714b1d8d1ac1678568878a0010f2b2e30508ee17b2a9a09cefa2b8bc90003f7f1dba000473fc7b5abda400940a1a5067dcdf8cd1b220da5f460a14882e3b184001837429210091fdc4cd04eb83d0de202069425461c0038115b6000145d365ab6900210180000dd10003b720a203b2d8c18e6887122bb39e313090a0dafd81649c8f548d0e189df64f5e708d93288a2143983991141609fcbf5e90501c8f34e906c9042101c612292ee3a859200009ab060b5858c04a7095384981640607eb4d3a2873b93779430400b87e8e08251ea1fe0581efb45646429042001c0000da1050090001d0992604310546183833bd24032441856598724081f302d35cc083e2cac6112100000fd200c13595e9b521020c1fc67c4900619606696c9002301c02780803c0409c0204d01000110904c090005909ef5b59b7739bd2584736e08b5b01c03bd6d60000190923f92993244c8072031bf066428332140637c1531c72852051c50401001d0561a6c86cd116dbed1bd707e48aa6e97e1298c449bfe115b68431c1d097fd65f90fadaabc66a5af28e35d577ee181ec3fc43ae96ac3ac2acbafca394a47d0003943030b91dc8e18530315cec4883a2af98471223884bf8c20b9810c52410dcd75fe28087c035b84005260f340401113b9f80000a4900f80a00006dcc912b56c1c854143877eed2e40048e0cd5cb46140c243416d07700402609398f11d04087dfb35499408229d2ac44238c00b1a49cfea400057191b0732cf384801502000380609603d253ca70f405902abe91a428834b63f240e2948df9a04516fb627b4028845eb5325041114a75a40a0166d72668401a5b0f2a07120842030d2421d4a1e5cb20221cdf634a2000003a9807142ef021af051644d1554a8b115233495c8d0c4939045b810405eb7d9f8a012baf6a068c8904240200000ec90003b0324c2dc20c00610afc87d3b94381f2c6c3648e8c7fef550c220beaf3646042975c5bf080958aa9e2e20075c6a806860463fd2c087e9042201c6103221eb098381838cae48e00003840c210a8395c20912d2c62141d15dc00c6045793a0c0808c7310404813b229891a4107803000033c408c040007284128354320aa12e50a9e36400e2df4404a2811ce7fa02014a6476004a28340100000e93e61721d04dd2bec09ac40a47a19b66d7d016b548221346800002b13b60a99229220e20c20c10400010f43ab5cce03e8b00602b533d0d763068239b552eac32128f2f6c512dcc30fe33d00024d209222048090006b2104711f0967e9d392f995c94c3203a35e1a940dfdf8eb8b454b376531310274497da2f03ef012a3a719fc6e8bd9f0133c39ad3dfbe4765c204e185bc5ac59bdb759fc10c49e79b69c3d654aba988bf39e3c1000a6aa0f31c400546e694feaceab90706b0cbb3d003a48c03d68c012a8b773ed35e8765c0bad707f8a02088512bef22b968b122604a1e666520300811eeed67ef6a0bfc1f154b8ff446598c5680004e338212a6a1fd9143081827b61f7e18113ffcab812c3045eba4a26d6180197ec03b7b05027316f4337010059a85df66410050b3e20defe20f90551c7c086cca3981501e000084c82308c114140880281b2ddbd75b8384f6376e2b2182829a116800a1196347ffb8800a34ea02c4380c1f3cb17d1401a3a125eea286224bad30a2f2ad1e595c63901281428a5326f71585910d63183e4c1c02368164163f3ca322c728708c3f8590000651eb6110c860423020590dd49287229983803752a2c4058f5f041f4956943836c8d02c4050078b07baa8c8a000459a10a224e206042a03c0000ba1c24150013b2124db6260ba61c720d7f242850c961310a3881404ce4f380c28a0a3df8130004b6526e230033620e9903220208c0800003467badf1c578e9b386da032259241050a48a40a0825803000e0300401a0001ba68817044154c40adac08a32c813823f455f8818254662c81c126e6b26544804e971030460035b312c80200d50be43704c8810230200000d3901a0980c82fbadf1c578e9b386da032251038e48840820628208200008181801006e15ef9b6ebc01630fb504da8050d1c65e64000c28240d2f9b02081e83c666718181672187d638617e9a9a1e92114b92eb362200920bfbfb88bd42430980b18500cca8ce3cfc022a0c85458c4b15bcb923c23448e27494371320dbae533ad0a0f79248c1d441a83ad6e6bc4da9118282951781d6b05313fd7b820847dd2f234c0e2e3c29250e01a3838338bb6f87349e6e216f3a3cc0aa02dbc71495b0115c1dd32f19c31483700006807badf1c578e9b386da032259250a48a40a588388186300218100100680006f90431500032e100075a2001dd2410867440196bdd10c1a7ea651f8609d8393d66383064aa9441811a384cf08a00a93cc8804000065f89200071032d24537018420288)) <<< 16000) + 0x197f3d977c40a03e241c61c5dc881a120e14664149086098c7f925e3822a6ad614181005d793086017671d52d486030840600003264104440802203f0901f0080f404078020003bd20765303a2580d0cc0e437b27df29a9fa3f2c29630d4a3f86fb674d40000000000000000000000000000000000022c0637e0cc850664280c6f82a428840038028010080aa14116344ee9b82e9ed589f53593d5d76a48a28308daae54d671fd058fb1c598c1338605b61d80b1b10f19c4f82b963a113fea915048e4e907199af68f55e29af2606aa368592df928c1b6b120dcfa543967df2669f91d3ff8a17ac5c0de5b9b7ffb9d34f94d2a69a05b580400802208e1f3a00c026088f08820600200000da40e01606e03c173d69e280927ae91c00b72650406c50540090406002100c0100440200401001c1200003720000e8400051881b04f8e8314891218d2d98660235d7ae860e9317ac103aee1a490007fdb8a0000c6d65024e2034010a111130a7f149ff23a93c93a8ebfd8973046aa0625308182303b7903399ba0db289de99f6e028d69f6c009dd83c4095b4b9dfa5fcf70c234ff03e1deb02dde4fd929fe660c2d99391c8243ea78d8059acb184d3953a3a3e3b4dc24a017d2de434eda5adb7e8d3f45bbf5927fb1f8eb8310700d804c6d7b941f67cc1e45cbcf9c4fb74a2d9c312a9cf44d1b65f3ad5d2e2409dca9afcfcea33f128655122284000e33a20512076a8308bc84fb011860d80400002708002d29030150090a8001c7081a8ee01802008a1bba5892c045b0d2200160084000040100000446401774d31409af9ec220418008000035980000802240162b302810ad8fe4002e00800006620680a0000b820003f660200200800002232180043e8050800124ee10592a390820105f520d060909174625001d00800e80e439783dcc609dd98f914104d61f03062ba5c4180168e4142002c21ec26041a0080000839030090090280cc140004c840ac340520a02805000299901a1180c84e05066082e1872e595d8900350e0e0c003db93514000fba7212840d80420080200880000802003c0400006e40001d080904c06c260640b0110581880804007deb6b2e69cd09203252927c0001b0c72f50b9a7342480c94a3cafba06d44bc171b9d19586f50cf7802f6e414a0b4a4b400000000000003332082c420420224014000d86eeedc945df7523c888f5ba6adbc44b98636451367770bd12373e56a25a0588090014d02f9f48c2a695eddb6908ac318658590cfcaafa5869b2e1ebc9a60bce7d7b5b0d2634b7218bb7b117201c96ea89daa91d2c8f18e34ab37b07f6def09261b70e0124d56cf4f37e2311e128f3905fbb222c895e4075d604d6f915139169767608a08138f212ccaadb4ef755a2ab15af1808d9a069a2c021dd3cd5135e6ef7d9d7d57e47eb9bd2769d4a233c8d89510a30c52cc620ac7f225cd1183d900fc4e60104d7e4410c498c88c4bb057f4627e34f97d8f8335817de89ad997500f12a6a8b4c68e4da74c5efa06bd9f8df859219a543cd7d4422dabe442d2b952ccdcd8912527d723312328897d7f7a3b1547f8fcc3a0fc8caf79dae2aa002dfa395341326087ecdb5f607de96014222f22a6ffd1a87339be18b09ac4f87a24addb35772d40743bc21925553f5462ae6ae0808008022cbc2aa7f0e29dff964a0899a7ce780afa1562803473289000c8a07406610190080000839000144200148e604aa016a10419cfde14286b887102080a7e1c152a13b1c04f678f0c0385d11000271c180080000959030210007b3102f25c0000401005c03802008020000088e18865521c2c71af9c133ce8e2776f76a59d27bfc6d822b1c66e322a7ce1267c986f971bc213855196fd016e288515ce61141080853b5de87b74b53fb4c188183c25c4a578acb8b892ed1754c8cddce61569be611c3c227ada75ecdc529f312b432c360d64e1008172f928668c6088be89ce206d3d041b222f45e459296621bdb993cce4c3651b1833f8cd3466741af6684a4b77ea6ad1488087465ec26b1b4977008cc0edb0c6afbb78f3655eaea28661fc344d5e9c954d271229f6ec2a6621bb50425b6fea782c1de9a64ba86af48cded9b8ac1057f7e5052dc922cfa7bf72cad09ccf758406dbbf7030064a2b658648b988158abdddd62461316ba80007e7205a1a02c090158480a824052020280101380c0980400123c4006b108014f69b69f63d6f08af919da65d09bee9f34ec46eca80000000000000343375b4dff0d1d58d236604c9ed81aff038116500000000000000cd69df8437e48fe54b826be1cb7f069d70d4eab0000000000000000000000000000000000000004c31030c1180140040501008558ffe14d1667a926fed483f5bbfce783142d5b9c9fbdffbe138281f1febaca2a073962f54ba7a02d99b7c4623e2e173bbd6397c8fb8eeb058fde130b2cf584efac6dafa05f949e3df9b23f03d792d422eb3605e64fd9550f08e24a72ecaed0006342006ae84012ab8ea7007b27df29a9fa3f2c29630d4a3f86fb674d4000000000000000000000000000000000002290e18e08c088088006020298a5f10b6a441d0fee5eb00e582bd36a23a1eea415d748fc54963b08d39611e369f71cbe1cbd7b4af717ad178fd17b452fdfc01e73b857b78b19fc16dd3b1255125602000010527ed87fe76e6477876d5380f9953adf51edee12038489fb6cad0c056bfa96799990d0bb546925f0b166d14d4b45081cf5bffbb40d0b67cbf82d28f06a41938703416323df488600195462a62a832a423)) <<< 16000) + 0xb036fe1b1e95af504d607684c19f30400820cbbee334af7030dc8a379f16910ecd933f2e4fe25c00016754180bd2ffce9a9ec6659edfde997b395b5e2d7b2e34010023fe254ed7b3eafcdedb30fa702b77d790a580d3f41c2e4ef6d32258b4a9fb14476f7fc9cd79b2b807a65ec620bb27c4860a085ba407018520830615156d02040b86ef0180076113c10068851ca8004c3838010a100001d0677480ec02366364aefdef14f84d1b8a6696f0913e639804e132c4017db1b50dc75e5943f0639a837a16090f64f7a727c58858e85a8ce19b5ef2bd8f200c835e76f0705e669ecb4cdc088b37aabdc04aa2159f6f654381e786850081b00d70f67e36d46bbbfd2e1199914f315293d8e6f8300e74340d769f789ba7e650a6f173ecfe67ba8d4443e200197bc110ceb4b0dda6950aa53e2262f481c6bf40d26103189541b67ae50e50e272553875b56bb41f676b0c5812e2861e2f293942ec067464a1083863200821a318d0240000025810004ab1be000171750866141d00c710000046506905505355c5900000ed8468f83c4e1207059dd617283041509cd8c68216e61f766804bfab15258000139be5e900200147100020d54d20a78cf61a3aadb6723840ae781e6864225f04e0b721bb59a0da2576eb800d80200004c4e1034f31d641000e5be868e167126460f08200b2682b3281f438002504ec080014a0753800e00400900400029c409417b27df29a9fa3f2c29630d4a3f86fb674d4000000000000000000000000000000000002289e49c49849c41019c10e098060000401be4afb1395389717ab607106f1b5dc80efbdec91c171450c21c1276f84b3000d804000042cec9f7ca6a7e8fcb0a58c3528fe1bed9d350000000000000000000000000000000000008a279271261271078e40670460180001006f926ade30671262b2d1a71007ee93278e81ca4ba406d5ef2dc70518c18153000e00400004448001681c206f032079040047cb883470ea0188060f53a3a13480402658260e000b9189c28c083e0280240500009e900070d204602000bb72001a224004c18800a201001a8e200602c308343301c4000eda62881ea6df45085ef4240a0dec9d451401d7f2784c0836010a20001f7f1422d5aae628368717a23001b00800e8080002a880a82c088160280b0210181000e440245448710b1c4d61037c1712870a27d9861800156e3810004e2c7009840680216305392b248c4e14be0c2c1d1aec4891ce65e0608751a10400019b11880058867d3800d0042c600000480e2800006f861433e9aee4881a4bf3b144a5f549d4a003a0100000ee20260301f01d0e00649b78081c3c269c561a3007be3afa2c60eb876b2638d0cf6d62f470d64d7471314100081358a18258876aa96500000e430cf224008c081039020e37e2c62041c6fc38d4afa7c5470df7322a50c13ee6454aa2800f80a00003ecc8c007e455b7160718498640e587b98280b43ab05d3028512196f52d74630b46fcbb63a618609b194a9432581208011fc71a3f01416c41316d81804800023f8e347e0f42409042f0500001241a24001ffd8e3225956f2855b4d4b830b4637d5c60b6fb40a060801f6f098006c02144801dc071c6615bf8650ada927a860a4099ff060819d0d60c000cb6593000d804000042c80f0280009188003d41000a213832adca8430a10f49e1818ba6ddc7000671210800ab2544009450680200001d0786002fe30184bd4410a10591667b02020045972182bf199372800e004007407c4001d2ce38631b3a3050868bf47861385c8e30c1c65c11828006ac19c2005e0af913820d80400004cc80e048048140360a00b0500014f9000f0620341301909d0c96b90092200aaafa404cbe66c8e1002568a3053f9d2c92820d00428600a5504186459195860a0a8cb7c600360100180100005590170580b00c0440602003b1c024ff01c3f188a9c30a983d990230c1a008401947da293ba7e5715ea96bbbbe38886c4299b00000000000000691452edf1da051dcded3113814ba7a2afcc1c32e30b0cca0aa1639018e18611600f567c9ce72b22317d31c871c2d576978b0c7bdd01338de02c9457f904a3138968bc08ab9b9103a57d5a35a78445432f4aaa0006d468f55cce094143fc5b30cec4d2deddc68c9240000000000000c549c856e9390ae12b64c8400000001c3b9bda6227028b0cc50cb6bafcca2e9ec41542441041c218208118c11a030550c9e0c6cc76391a56bb7b9cb66e41f116bd9bc2391aa228293748b9562dab0e603ba13ce49d16912f24e70c00d7a9bfa886d18f4000f808060a80020b880a8cc0505700c0100440127c344004801100001004000011101301c81292244004801100001004000011181192bc0800d0bcc503e32e48c105002000010640004648000e2180800802000008880906c044060200380400802003c2700c010040000111816eb1e42c0a6820118002993504072686d4090406002000016e68bb78d641003fd71a11040c004201002008000022201c1200d01000069900c1900586800097880027b1000f7f200423e68b0e86d160a190cec91a282a72f0f1880817db2082002da0de2860016709041001d2151d224e203c010c300d87da14c9e93e0b16145cb7161852ecf91b41f0306005529cba290d1d1e3c60404da2922712aec077f8a09cd1ba195e3eac7f51010100164978a0902bc0d1c082c4942810975ad36f6bef22695ee1cc20961680002a820142a0091100406801c2400c0a005010020080012908018c80086400202000010022521)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityFourFifthsCase1" = "QuadParityFourFifthsCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityFourFifthsCase1 private def zz2049:"s0801"="s0801":=by decide+kernel end section namespace Green24Proof.QuadParityFourFifthsCase2 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l27 l29 l30 l33 l35 l37 l41 l43 l51 l6 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xafcd975, -0x7270ba8, -0x84c9222,0x258], ![-0x7270ba8, -0x40be2b15,0xd25c75a,0x3beaad5], ![-0x84c9222,0xd25c75a, -0x2ec9040e,0x73c9c1a], ![0x258,0x3beaad5,0x73c9c1a, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x20bca,l6),(0x89418,l10),(0xc95b431,l15),(-0x3938700,l27),(0x3938700,l29),(0xa12dc4,l30),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(-0x5b0094,l43),(-0xb025aad,l41),(0x3938700,l51),(-0x5b0094,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xc95b431,l15),(-0xb025aad,l41),(0xa12dc4,l30),(-0x5b0094,l43),(-0x5b0094,l62),(0x89418,l10),(-0x20bca,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1a014802000000000280c4010000000443c0530080004a1304805a0060000000078024803000150901603c801800000034240f3008000000003c02900400001a8110050c04000000d02201c601800000064580e300800861202803d20080000000022014802000000150a81c6010018c32088096401000003c320a02a004000000151103cc0200000000d060660080000003c1c0a30080000000241819802003c0841a0271004000000000480c401000000882101a300c000000221a07980400000000e140cc01a10520210019a803001582405809d401000a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x1453ef7e491649a507c2924c4645be143e57bb6a123884e6be94300cbfa5840000039b4e0038010926ae2c8b70a1c928c111891c3a5044d09103c76f710a0cbdb53fbca04550701acc00005df900a003f40fd4b2000800400003066881dcc40058c561cdb891b6309eb94282fe3ea244167f46038018351d0600bb18ee33820d80400004d0c8e058ed4e20e3e88dcf19850a7a286e9b902c9035378638a76b524eb04146dee4f6c2000290d02b8203af6a97d23910104404000019b3034a905f9c30c22203781228928593230a02d720a1221330825a38924050150c239384a8048226488441001316caec280e20aea60994183c0200001cd322974bf359c910161785dc38862eabc0318415de19ce0608c087f4d010655607bf23804349eab80401fe557270c9010420308195b72ac922d8c69b42447a55c0238856d56346122e7ccc9004b37674140a499844200026750068081b0080000ae90200500018f101f0de1b0345db0e194cdc2a1031cb93d63848f9d3e040936dff586083196ca08137551b8a0138c0d80400004f4e82b40ae7a98ae730703b60bb2e6c057756c00220000000000000000dc4608308604304600500400131d4bed6230b934f11547d1282ea8403d9b86ce3464826a02f29f98a7eee72b21c722870a0004cc40787403a0a01c0140d7d80357221c295dd58a930c13bdc2f4098508c870fe0744006437fa01a1c04884d91248a00c87156b351c8f7415e3466bb81e66b8c714250284937eddec4c1440eba5e68e50c329866da9230040bf66048824704238140a496d7de0082079e1ff8140666171c182800102a938489002201c4928eeb45428744616071434c86e77091812d76de48811ae5ce28106f8a540c000ce1df67001d0080000a01a18de81d00a8a1429bdb6bfca08d1d52b454708081594c005083b102fe606040) <<< 16000) + 0x2b20e40030452e2a6f281047af27bcb0a02bfce2535a0120048048c28f5e75a0c240239c18a1aa06d2849189339c44c042764f2c8000b8f9806007896abe7001c00800009c900032c3229f447b23a0c20058f3d6408205d5b955006182617eb2610115dbfce130a08059072c4060978ddfd4584084561c9459205771ebcd24224009009163089b2fe122cb23d781028215f4c9012b24155960a391b180e085634a18a017673b84e003801000013920320200034120160be206d4fc88308c0732d18a25a5a69dc386023f88e061d8e629a03052cebffe0a14581ad3a200b4abc1480028a2436949001e0146113cb47a474513490fca23830e4ffa94d7860ad47288434509f9ef579b06054c25b4cc04072ef471d885005683b4ed80012cf55a95a9448012016000076480d82c0680723011fc47030a8c893b58824698e2dc3066e8f04310080385034282224cd168a06e0dbaba181d294c82520007805164117c9c1adfdb3706908dacc35f6cb1956c33d388669780abb188e89fca50d20d7e192ad354831e221776a6202003218b6a44f5f8972b7022f7d9080c00fcf8d6d799028d0477c512c01c2767a2fb9f1fbb7605bd0280368a60000b3cc8c02cf6b1818528b27261082302c2869460cb8697d8a202176aea3a0411b1a55d78a0467665d9c302187679599200084071633edf706286f786dbe40810312d041067ac2618101386df20041f73c23007f541aa7001b00800009910002db20320a000769200167e40054c4f100000834028449878fab181012dc56c0a0d2eedae8460243e2da30280000041a004e869fd592f1860840500002bc406076016230170dd1023d37ada2ca4c109df68f44103c0eedc800f9a8a8cf082f300334fe117aaf1baed4700d9b736aa6f5f4b72d16fe69334137f385006493b13b30e82a67ba3720d2302d3490200653f5dd4323c580fc6cb9b539a737120458254edfd87f55ede6edcb58c184e41d8870d83110253c58c7aa716e77ae6dc14a30defbf94a235fc8a45c6cd37b523652b0c90259b019b0ea895d6d8bfca4100328b127b1c044024edca438029d234c60032010b28c0b938b10bd3e64b0a47c690b05b16ff2400180080000589a0644f47e38208f76a0c03097188200a3a7cc90106402000016e600802008e02edda30800a80420000200800002220000fe40002f0c86be70c114d18f9a61de714af56aa959414132499899f9e0fe9a6bb5286e66feed0060bb73f748ba977778ae7d0637f60eba28206bfc35f24f8c311a91266e3226325b5448092f46004322e62fa7209d89ecc5f8ac01722a7eee884375cd8caba3d86371ddd4e7d42ca829b3c3d053fed18a08fa32090c05a65d060c115bb108145ec00d1800d80400380400015640501400091440584763dabca22809cc0c8482058011010f37623041ede0f442000b3be50201db656584810360100000c1202a12010050000b7100b0dc0a1fab4f861f590ee86041a97a0960877f3ea200606a6f04a10340108020080228b97df598d0c27d17e9c002dc2988c006c0210000100400001110000d2200021e402417043fc6750e0d01e55050006934020145eb0d0902064021457884cf1228a02390410c9b8b1200ece2b5000600114533fd0828b742b8121fceebf1800b004000021cc93bf24043423a641d9a00971e208010e2cc24808320100000b72000448405024000618404c570040100470f7e73606181ddba1807ca44620059eef490105c02000015c4048140220a010010078080004fc80035c1001030367fd43a005e75ec7f91f933134d5cecf415b040000000000000338bd04185a5e838a5f8a3cc711ee17704d250ceca0000000000000000000000000000000000000000140000017f972970f78000001531030c1180140040442db3ffed13cd91ad53e0619feb14b992f84e620e284ad630dd4619a07f188a1bfef5c164693bf000c34fb01175bb5169e83b3e98dc164648a5d804864cf52c63623b13b253ad8ea13d7ba4f886a2909fa4d403804000ad04006a748019c81e199426b40c20413e4a3827527edc606bcb75a08095b915d1003b6dc44180e1c0988100f636c300140a0d8043042f36de7400d1b22dcb446f171d3925ce1eadea638200005ae8e7ef6935acb56b66ebfd5516a2fec0030399612e0ea0b4731cdd141562de320005154425a20200005ae8e7ef6935acb56b66ebfd5516a2fec003006ac0bdc0d0378817bd61d8f49fa3856bb60b800004d938be430d1a471d9f16d37c01351100a29384100003f22004028181fd93a1411b123342024257bdc5004c5a8b8806891c9f494206c02001a03e10e645a81030e865c820b9a15e0280b2d83d0502068011c21f9af7e3040a9e0f8204b12b758600c9c486080e0dc8ae12840d804000039c8000de900c0d00584e45118203c50754bde3100006707923081a00800480e860fb791860b51af75081d38b93d8c1068021433490bc8385b3b1c70c148ce62e10292dd2514012e05fe38023030293020d004000041c80402800073080508e0c465f59522183600800901c1419a77ac420600118521fbb840706ec72800b8c94502cf8781002a01d46508160080000671008050000a210001be20009024001e68d16054a71660a181b828131141237da261620200001770040006cfac11860000002ee008005aecd8fc947082301451786e90690a181604efd181000009602827711cc24404000025800000000396098207c02000024c401c1400c0a0050500200800c0400063440085400202000010008569)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 14 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityFourFifthsCase2" = "QuadParityFourFifthsCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 14 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityFourFifthsCase2 private def zz2050:"s0802"="s0802":=by decide+kernel end section namespace Green24Proof.QuadParityFourFifthsCase3 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l27 l29 l30 l33 l35 l37 l41 l43 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xce18fae, -0x7270ba8, -0x8a215be,0x3e1690], ![-0x7270ba8, -0x41a446ec,0xcda4c2a,0x3ec0e38], ![-0x8a215be,0xcda4c2a, -0x2ec9040e,0x73c9c1a], ![0x3e1690,0x3ec0e38,0x73c9c1a, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x20bca,l6),(0x89418,l10),(0x111418,l14),(0xc6f4566,l15),(-0x3938700,l27),(0x3938700,l29),(0xbd1e7e,l30),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(-0x71e955,l43),(-0xa5da709,l41),(0x6235e,l46),(0x3938700,l51),(-0x98a38e,l62),(-0x8a830,l64)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xc6f4566,l15),(-0xa5da709,l41),(0xbd1e7e,l30),(-0x98a38e,l62),(-0x71e955,l43),(0x111418,l14),(-0x8a830,l64),(0x89418,l10),(0x6235e,l46),(-0x20bca,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1900099008000000001a014802000000000280c4010000000443c05300800002702200b1808000250982402d003000000003c0124018001686229024400c1e41141680c6200a000000001601480200000a424002660200000005848073008000000016004900600000000d802480300000d4088028602000000681100e300c000000420a051804000000170a01cc020001904418014801800000064580e300800861202803d2008000000000f0148020000170c838148010000000005406200800000000440290040000002a15038c02003186411012c8020000f0660a02a400c000661a0900f200600001e19050150020000000a8881e601000000006830330040000001e0e0518040000000120c0cc01001e0420d0138802000000220a00c300c0000000012031004000000000b014802000260a41602480180000630a4022301000000441080d1806000210e038079003000000843803c601800000044340f30080000000002819002000000110a018c02000000000880c4010000a43409022400c00000001c2819802004d08c1200c9004002b0480b013a80250829010800cd401800a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x596eaf28586146ec207051501126605918d227f85101474e0458e032d5d01800000ef73800e00428ab9253f25869000044c838b208fa0296a14405e4e5e9a2c42fd6fe86e5061d08934e8b082d91d78f9a00008dcec42c00d8c4fb8d6a4008c07000039a40e407838623de282877747937c507562e24ecc08b15158a081023085fa281350c7c7a480c1d61be8800324bee30800bee09f8494840f80a00006acd8c4dac67c91b96c67414283e744224410494724842cda5e47003b5e100c016a259a4670c1b00800009c182307586fa163031210692462cdbc6e240c1925f71830c1fb1bbb84084f7a6480410c5b564648037e374101000905db501a4307c031442b9a7cd2c640441f448d5cc41f0910441a960e000276f81803e9c72a84c183601000011120005ae6067967ae848a4390a4461455df4612215f8bf21c4d07abe430906c2948904153b529001c8acc61408fa102c0252283601000018a3c7e22475e42861a1d38a3285032af18220524110e2b1c50eab7ace102137c4e8e0828986017a20105a25f562002bb6c2f603a43080041c710a077850d627dfb4a14f5fb70102b691cc710242c1e7a280751fc78098306c02000022060630ab52648b56eb7549121c3e1c0e215e76f81847ccc4a440101c9d2450296b2ae0800317aca01a0406c0200002c240e0140008e040dc4786b57f64870c5d241f10327d5358709ed0d6c102bcd4b6430493f0bd0816fddd6d01027201a00800009d1a9ab0ed9c3526cda724f69f7472cebde16990eb48000000000000001b88c10610c08608c00a00800887116fdf069d893522482a334198c0324bce1dc13355409200676a5ea86eb121ce491237d000268206c420351d81a0280cc0503616d459361c28d22a7474304fcef3b868508d8535dae10017998b9ac1c04938c6ba428036890a9e144dc3dfc1e717cf9bc6ab8dc708c081850e0e1c0c493564785614313266bec48c0be214d122056bb4e0502520a3420e08081549c082010970714036b34b59c800f0042499e5292c1439ff5dd38a1a0edfb3248c3ae0a5a2440aa4f8894084a557206000e8f7733800e804000050081900e8a93e2350182890417bcbe0307016bbdf6c2c7377d6bd1828502bf0a4c614502720a6ea1420539407832c13e7704d0a2c0814791aee874801201234b4d1f30534a01341752c7ba60a7e2871efd685342098fa201c01b0a37698007002000022270a5139e3cc0984a656f2d3b8c1c06156d11038e0775c2b58286d7910b0780c29cacc5bbf0c043ed1720a430082d9d11d97e84021281600006d08002699ab06ea87a54251fee4349c2b12052041c41021c1081080040130180200d0000ec202c1301509d5837543d2a128ff721a4e1588c30e21018e186102088000008060600401a0001e440028dc81890e88049b30720c1a855d7a86304eafdd7308e0c764f576030237d29d9e0a00a803340020000c1feea00023e5fb9c88e) <<< 16000) + 0xd01844030819824e5e7040a05a13b361c5d9c4352c8e1463554a746098b490a7e3824ec7011b181000026ac060172bd57051860308406000032640c00405e0202e010168080b00400076240aca602a2302a0dd10540b30623b4aca7bf0801eadf890eadb65529e8701a0f42073b214d95b94500cc1652909d9fbd26c4200c315a017e0a5eb94e85447e095fec6027d6e8faa427b157529e2b85f3c970ae0dfe00d1540e6abe96230f7e014b1202e162728b0467005688a29800676c40480181dfdc80034010b105dc110586554b442c288fde8960842c3ce4001900800005a902901d0365940e0c031139902010a5f6c23081900800004a18cc7cab113b983f493531cd259460f346ba7d7bc2013b839aa5004cb5cb067c0de0da2b719e26f7fad4b3b7a17431258b1ab67ea8fcf825f1517fccfd1d7e3e48ce3becc946224c555cc58d108d02e060273699b9cd97d8ab93207358ef2f69348a92e036c9475426c13028fa961ffe900006e3bf97c8b0d94ad0ad2244906e356ed79bc8002f612db30d92ebb168bf3eec0327dc6b0ff62c0bad2f82b071e8ed0b9e0c09870c1595a192b6ef45c44ae8572ecb4513103e49860667987bb02e913931852bdc2f508a742a80f9895204fc3a440ada6506155c1c901811891408a88b2000980400a00400016440013848003bc902711c8711df259210eaf522282984816060a961cc8103964afd920300fcf824c183401090ce772cb201300b7405044d56db0c1ab14fe82079f64131250c1a008000072902105000110102619d0420e209c107455b5916003a6999408c406c0210110e1b63041925c400200167dbc82019ad60b204820360100000c5204a1a01b050000d410161180a88e05195ca4030f44c0322c10404f74400e52dd10240c1a008402004011458a33ab8686018754870001283091820d8042000020080240100001b90000e9200024c408c4601e1300e09c10640036903dc59d2b7a3d78161e21740812d472337c5031150a11223282083e9e1ff993eb0127c25554a584df40ada04f5601002b3c027e31d947c5813194b92110a3e791198d7a5f439515f35ea3cfe4759b8a07e006ad97c2006b91fca16f167f249a6284bf69d84b95a48edd70b9c0572603ffa85e2008f57538010e17d8eaa71191bdd76a62cc3ad57f86c4f3fcf116b2ed8b6d84d5a3c2a603ef9bf1e71114458f8522cca57175920ac0fb920a7219828ae4e9331229b15de420811429070000bcd32c00cc95804a1032010b2fae7760f0177f62c88106002165cbe4b48f11239a02288cde8cd23041900800004910001182044039264c5dec34043b240480014867a008c40680200001364000b7081082800229481010f8f76a5c2070c4ba4929210aa8fd2141014f23692040d804386dcb21e1866198c030182669c2000bb20032040c00400002d080f8280781403a0b01c0100d8080680400041a40034f0800dc51a861c85ee655ae6d04562cc5ed033a325da83333f0000000000000001c13af0c75657f449ac81018d8d8ae0c95acdd14c000000000000006842061863002800800025c0ad860a9bdf74e0ffa43509d7752ec68a0ae5121a19b556020e92021343b5804f24f51d012506492136d582b8fe9357d9eef90949d4eafe1f0f942ad44e79d71e002b2010a1fa1abe1c837fd24afaf18d512ca59c865501901000270900237f20067a07863b8d9870b0bd260c205930a798cb0400e09e85da3206860f86062fc3481a13b27c2024ff918e8de28ae0c07ced61e6099d26820085259872de5ca85504900b7f8c834441ae08e761c80e41f1c405758ec208000096070c0000640c108a3b3b181aaa3c9a20200004b0600742e6908a05c806c0100002804008050303449762823fbb8e8404acabaf8805bacdf14090406c02003003e11d3bc582842dd8dd840a8884fe281ca0b9520482034010c117220e20814e8b9321803279554202fd8bff804820360100000c4200033e405c4402c1b0150dd106c40f5143212560640467d4248c14c7053a32040d0042c749619cc90d818aa41c392dee746081d1f422400df394c60006387826041a00858e05b6aa0e1ea4cbb2180057fddc600340100140100005410001ca20261b00f0580702ec7723749480de293101c37a2468830a441c541810232b70900a043851c00679a7c9c1068021844e65020408326f3a8a22bdbd3a202b7b7bc1400b63bde2806ad709cc0034010c20093e8f1023071e8c30304472c620716abf344040eac234a00360100000e4200040840482601603a1936a6001c2e53c5ec60a74d1d70814a66eaca0118cd5c009440680200001ce40240400091a40447700c01004402004011000010046088f2551001bc6da281ee62546002c0100000873004010040000111000101200027c40402401e0b00e05c0000401001a0380200802000008880600802c07420e9ab02808845f71402014cb10026d3c3519040600200001704028240120200019b20006e04002ca480070b1a2c9e015ba1430bbf6ae6282652f91d4404045a75e080036524350c00116941810011fbb40d427101f008618436306b9ec061481d80a2295ef20a2fb593c0bd9a4a750e74f1bf5551a183013e0338dfb8e6bb5b18cfc1ca2028604258da11a669c8ef30ab14a092c505145e1a897a624ee2b2bca6d8dca88080000559dd9ac1cc980a44e79a4010013748eb79d2e8d0f07e31faec05243cedd098df94f6ce6c308378a40000f2480404801c1400c0a0050500200800c04000b6e4008540020200001000c0d9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityFourFifthsCase3" = "QuadParityFourFifthsCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityFourFifthsCase3 private def zz2051:"s0803"="s0803":=by decide+kernel end section namespace Green24Proof.QuadParityFourFifthsCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l30 l33 l35 l37 l38 l41 l43 l51 l6 l60 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xad3bbdc, -0x71e4793, -0x84c9222,0x258], ![-0x71e4793, -0x3d0e3b75,0xaa2efb4,0x4d7cc03], ![-0x84c9222,0xaa2efb4, -0x2f23493f,0x7551fd2], ![0x258,0x4d7cc03,0x7551fd2, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x6b182,l6),(0x131ff9,l10),(0x5b0094,l17),(0xb025aad,l15),(-0x3938700,l27),(0x3938700,l29),(0x5b0094,l30),(0x3938700,l33),(-0x131ff9,l38),(-0x3938700,l35),(0x3938700,l37),(-0x5b0094,l43),(-0xb025aad,l41),(0x3938700,l51),(0x6b182,l60),(-0x5b0094,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xb025aad,l15),(-0xb025aad,l41),(0x5b0094,l17),(0x5b0094,l30),(-0x5b0094,l43),(-0x5b0094,l62),(0x131ff9,l10),(-0x131ff9,l38),(-0x6b182,l6),(0x6b182,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x2600132010000000000a031004000000110f014c020001284c12016801800000001e009200c000000150009900800010211c0940c05000000068301c6010000a8480b01e400c0000001a120798040000001e09038c02000000000f00a401000006a0440143010000340208013180a000001a044038c030000000e8300c601000000064580e30080000000345819802000000250d028c020001a0841805c8018010c2405007a401000c42904604b2008000000220d038c02000000150a81c601000000000a805200800078330500d200600630c822025900400000f0c8280a801000000054440f300800000003418198020000000f07028c0200000005c00264020000000005805200818c118158079200a0000000120c0cc010000000d0681c6010000000006805200800f81e04203c2008003c0841a0271004000000000480c40100000006c2c0a300800000441080d180600000000220148020000000682814601002605810c07a4010000421c0700f2006000000110d03cc020000000a8700c601000000038240e300800000001c28198020000011854028c03a10520210019a803001582405809d401000a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x30a2bd12652c89c0e47a288181703a2c7030d7d0200000017125041c00851557524244e0c5e144896380b8e9190a5905eaaa1180557214409f35cd41380ba202248dd2b30004884085e475c265fed668001559eabf85161600b1850991975e84ddc75c8043606c0001261a2b4ae3a18a241692220b21cf2ec2ca20a52e140b114308b1010019a45266001c008515b2bcdc984d840ea670a24a8327d5b80fbde4411644f7bb12a1498300fcd2880c96bc808292f755cc588eacaa16c9ef0d96744a0412cc96f8be7a98eff9a000c55412be72666d382c02b0af1c460c15296eb67cc05b3f18800470b4000172103a050002129b186a1855123647bd732065f563c2484cf1df7c70020c9660c0079ab4f1260c1b0080000889a53358000001dc79c32c3026066e23d2000008c66d76528c1521c72852051c508204000015b88008034000528c0d13e1f20910b602108e2537712b184a540bc64820a8d61c800ec3f5e0a02fa8e78080226b1f60a50283601000016320200ba53358000001dc79c32c3026066e23d2000008c66d76528c1522452441c41840c10411c0012e280200d81a81b320122552a2c71c441b7e1c308fecc340802085d018a014c6fc01004a5f59210032c8af014a0506c0200002c64058240005be40e4472c1e36523b7c7e16df743ca01c8e13f0e737ab3a6aba614054861870c60c708408304204440a87ebbdd81e41845d7bd78482238c919646086ea180ca6b6ace48d82bd00021533ec23ae1bf6c7d432a9b662b8f8eb52a76a9232ee8000000000000003810c21811410c1180140100504396a4015546c0c824d94a9f059c1f056763b0ea3115eca71ce08c067621085a4497288d1ce80013b10382101b8280d8050370136d74e070a85454056c304daa280c801423630f534b1001b185959d8700f411cb4c628037e4b316f4477e97ab89516cab1c48ae31c70940a1c596ad68d8a1650df6b76cc96479a1b94eb8618d2b3b06e0e101d2746e41c0847af636a1409a8bb4eac040fd6c72d380002371469fa79920048050c317694c7e01c2033d40c402813c0c7d0a02011146a4c10081ebfad209428010de47e61240078f22f2e20051167b89d000406bb6160d82400900a00003ae68a4509e3c0164b941f4be8a1c0566e98c10413826a692c1e92691f88c080acc2d38a00e4603fd2280370e82a1000019d15265b20042030035010000e79c2835cd158612185d9832498537c491439349ff08a19cb51ec248c36c407c18007aeaa684e103a010000144309893aad3393ab273a4ec0744b2491891481450c6043002000c060080340003acc90b634555e48d0d5497f638a22fe7a344047d1d5b52204173addbe2820d307b1a380461f5c18300b4adc74208115a932dfb4801000c2883b2007afca1d412e2ae828689a1d4d844100e8d74e6202019edfaa0408057415e60c2222fad52c504067ad5e81002233fe70a44801100e0000710d92365554a40e1868c2048b1eafa84404a26af0e582c680f4238201c1e8c2806470aa04e083801000013b20601202f01000288101305f1047a6733f061264a570e74513f26a0c2dc70c0cf6fd50030fb426b23c060b8a6c3918c50b0756ae6b4401ea3c09358001aed9866b3604801201600d00782b061c7d02040a40c0df2010c2b569966ce638741b77ff120c19bc2a685ae3025fa744f9f0e014a609ad2028019dac951c0002d93162961e612004c060e29b542b1a3e0c2bcd1465ac5882238815f0c00e1b66c70437e0c1a2cd774daa8e10a783c170c0a143d732271c0c0832153ca8d00012fc180d985b2120050070000200200081040cc160640b03101d0e0780b626038c72b5d920e28b063eb0410388) <<< 16000) + 0x4a8b8678418637b9f27f430377a84713e2039853088e83004b6c1a0f60001ffdf8fa1f448012014287040d2f29048c1f38c856c71848da4a190a2b7d1d48bc1c4189a88436303cdf2edb70407b09551530a0080fd20700c03cc0e72950e480118140000740d905b465ae58658c957640334850d3da759a55e4004c48b848a83003b9b7449344e20a085007000013334381ce694ad038c453cbfb3c8a2bef198718038854a64c4949410a2a4383e830392fc9d43a080df16a168f830018551add40000e6e83ed69e192004c060a1c1034bca412303791b09f1c6138bd4b1428aef466c3307107a68c8138c0f72731640101e625aa934280183fbb1a0300c3064e99439200460500001d036400305a71631c6995e14342bc64410202949b308206fc06a1000d98ffe8c00f8851c93820e00400004ec80029710300d017828002a148008781001e653c40000258142384206b18102e11d2141c0e4098180a470f9d14002e11d24050e93eaa5b100e00200004ec81710c04c4605a2302c0dc0082f7234ab2fbcf420a5cf259e43803cc09b380890fdf0ed52c0d62e280375b835f9846e12c5004bb38b210038b543f4f25095e66a4f3df9e4803071e84bb645dbc1e91e028412290de58c781a275a778329dbd9111ae5d61638c286d7f0c915b48045da70a7448b66a87b7936ae16d566d62b26e4f72f3b4010b1a04d1624f35781009e96aa9c01281959200a07cc048103001081a2fa5a59a29183e1e682133a7c1a05da8d932000d0043440760325066577ac602a48118801014cb90005c02000015a70583b04792108b1180f002890b03800dbd2124041900800005b9000254340dac6a504dd0f76b6fad2d8f4a74aaf7ca70b47de2a8a798094af5129d6abe33ec3655f9a350c02fc1bebfe8b5231333ce660c6753611000545c98bcdf4f868610e19cdb50387c38c90fecb6080c54db9ead802057a9d1883e7f204dfccdf0cb2050dfdf8000fd3457b9bfb741299bab601e048909c6594028bbf4e00ef6febc3236f4fb0297abb892e1eec938b0639ceeadd41ec256a43550b58395b2e568347e69d02a52efa604bb18dedcb674b91987b13d0cb0b6806b6aee30d274440002fb1c08057e4ae0d99bfa908c4548dad859aa6a3650f1657b1550842752eda6d4d464002fd47056e3397d761c80268d0af73f72ae9f00b07a6c00cd0abb6f0681d375c19688ddcdca0796f5ab7eea87cb583c4d8df060baf652b4cb7244c62a9a2302bb5a6b248f5059fff3ea19357626a3fa69d2ac4ea5a8393d95b191404411f2718b11578751015f66ccb03264c524012598490105802182c4caf02846eb64080b10fba4801d97dc8002c010c169bb288c080ef071010c4e751800b80400002288000a7100021420561300064c321b3b8e8514131ab8741820c5db2820709b409080080fa29194206c02121810bca424224f3948282118ea78305c9e1d0040c6fe1ef65041b00800e0080003ec8120680401400045040a8560520b8040080220000200880e66d9c2002a3ad62001600800003290280500005b980600802000008881384e890f5fb54a1038a1e31820fce18440a11b389680834008a138386271c3172e764608d518eb10228f482c9016c4a2c1400fa9c2498106802000020e6437d53e8c6083121e41420fac638504aab2c80c199dab8c600013a6609820680200002124090340200a00032a204c1a01e0900025a901311e1e8e878e2c12256eec48005961446001fa13e012060d804201002008a2ef2087e34303a746e480029e39050006eb2202001f89a925041b00848a04414c45176604a716209315b563041b00800004c100019820003aa4094360180b960f1b291dbe3f0b6fba1e500e1a3facdfa00cbe35a27ea3f9e3cb73c202d96089ef600000000000000072d994a4d836ce31e4bfe91941575780fd9d92140eec000000000000001c386992cd95ae15042cba982a5975470a81d9b2b9c34c60aa8820e18e088005695390a5cc72a785dd23df08b9cdcc4afb79da9324d72fc5476aaf757dcf57bcf6054048483fc966ae87fa43dddbca7061b4110f0ae2b33f26f4e5674df27636f0353aab94c0534853d7dc22ef97eb3963767d421bae54d035a153b4543660785141d5aa4308327f0424301dad31201158da4941064021456f3e7a09147315d258951d7c03833fa34c881b5fea799410640200001b8645d936ac6857301148038436e0c01c2174090205c0200001624000a7c812088040240011ee408c660440b9172826788046de5262041700848b44bdca30002706628080e79246083001000008f3027f28aa3008e9664381675dec500a6f06848102e0100000b13c3ee21c314001c4ed0620c1800800003710211101004807c2403c0a01d010001689000f032004c18747f59bf40197c6b44fd47f3c796e78405b2c113dec000000000000000e53ec23ae1bf6c7d432a9b662b8f8eb52a76a9232ee8000000000000003817f111ea9e66d08cf33f4695c44b6b2d296027abba000000000000000e137842e6b881bc8168ca11235764b3ff526c20852000000000000003641031801400405010f35ebaf26691cc4d3d70d643d5841b82ba140962aea1c6aab138b669445995740c1883621db2b931c3724f25c14b8f94a2cb5e76d30ded70d5a49f99a570c4743f17a7660c9db2c67055bdc11b0b230376d5b9aee1687c5f7300772649b45f0402c89a6f3da9d48b79cb040fa85b76d1501c010003bf90031b3200a7a07866c86bdc30803ae368e0b102ea0181b7a560220248b)) <<< 16000) + 0x9dfc4000d67d706041eecaf441271c1b0086bc764feaaf8000014ce3702d4b456c504a4824c11155feee0f82865491ec31f00000000000000000000000000000000000000002790a21010e10a10e0860000000dc600401b4403061b2208183ea1090cd78ed7901e6a327018318a74c41804891d481003f5e22204e2036010d78ec9fd55f00000299c6e05a968ad8a09490498222abfddc1f050ca923d863e00000000000000000000000000000000000000004f228a2842441c42431400c002e180200dc328c79cc7f1830f2f91eb82c65338018b858a9ce7744d0c1073a79ba79600a82d5ab424000db60a5190e0046040c3321f2b3183160a2822c66e3a31058ab80e5c8c1040aeff82003f1e76b000d802000042880d80f5e3b27f557c00000a671b8161347307306182141041300280c00008037473453c0330788623ff2020974ed81820102b9d1410a5bc6d0412443cec1c000000d89c007002000027274793e497774e4a4742d660fd67fd481e997ab73bcc1b69268afe736c7fca61a298d7793159a0a7b7bc182331ece69207abc303e083013c019b6d6dc0a860a000c0e43496a05f79d90400f837d7f36e9ac1a6bafda795a6cea0011c2e1a594a1fb918406de7909a38cf3d33983ca689fd82082bb3480e000001354c0038010000111200082240019a08004969000b70203412000cd92001e444064660040281813579910123f247828036f1c184030a9ccb24810360100110580800c0600704075118050e272d030e301fdaf8207b6865e8e14b1fa6a12840d00430b763f739225ef6602288c33b5b900013105f2000d00424620cb980c2cbec94c9125f64a7300190040000479a25ea583de79198912b9b4d403c05c4480ee6b161a9e8a96fb0e72fd1d95d492206be6c1cf604fc774843a48d7e9996a1c002147b0a917127895d7342fb3b60608001502014bbb4feb5eff233b0e4340c038e36370b76b56085c27f5db07cb7f347978582c3f984f2e28d2823a8b80000dd8800279980c60aa75866139152bca642b7a43e4309866b80941b83002115a76e932fe480408b375eabcb37948be87dc303b54606299dc4f105aa0fb07ba280a098402048446d2dc33d4861912dd096929200039862a57743e26670bd35df87b2ad72947d1dcf89fee5542ca18e02b800035838205d0e56102ddd5b64900250c9e060041e409080c33640a92840d804005c2402c0a0001112001520405446028220130dd0c6e93c7830ccb4760101130b03f1825f5a4a04831c724d85001c0b7604c1036010b1fd6c8a024365f62ac80c37d4f21c324a8388900ea52301008e6ee14981068021638d1b728208560ebe121ab37476387fa180b840034eee2ca08340100000e1200040640382601803a1824cfda1c24ccf54860bdc28ce281442683420639d41d65041a00800902e8672e45ce40498375f870aabbff48c10fd61242801a315564000f950bc30026c21da4e103601000013620141a0090500013890111580802e00802008a2d7b85f4b0c76f240380066c6d9800c8022000020080000222000196403c1700c01004000011100e0980684803017a25e488b1001600440a4f2b9103d43091208c8e645061aa8e400414f894005402000018c7881366a981a2464c184daf5e180687ee83000f87092820b004000033080580a04dbb3ce3ac4cc06594dd237cb431ca4ca6e569504f52f3a84291a666d030232a37b173828443206f7792c0abdd8a58c4e1fcb1256abb6ecb3768f273a82d5fa65d054fcfc37526713ffebe71c218347e69ccc07f010117c8e5c5880356afe3594dbc3ae2dfda401b16d3e32cc77ac3c5771278c3c95775cf30e5df19e2a7d8088e6b5058d30417a9b89ed6394cc5d3c0236d5cedaae6d250ba6b5807937a7a57f376e9bdc4c6b41c298fb266f0ba5edb8593675ac32977e08f056d332d70f49ba6dd3cff99233294e10ecf17d76765a30d4a4d0000351983680248480609b284edecbf5f236ba0eb5bf0877a6826659011368c7b8096920001c540581123acca950e388492c7a3ab20e8519fe59a14b3ff77aa85aa38f069c64b8bfb16f42e8555e76efd9ca5806a1cc9b9ce9817f95dd3ab879eef39b146861b5c0aeb2b1b227c936a34f0bc49b43eaf7b3f1c5e19b52ebe419ea6f891849c4f4c0f627658708137854c05b23368c01e7a60c50087f63026081800848859a2f4e0cc43a78a0550f270c014425d2000b80438b17ca144e188b793138209c7818e02f3183a900068020000172744cb09689018486a70a0081ea58380114b6124041900800005b900025320006d64001df88050a8024240021404004950800c3e1002480345b2372c4c28611c423b4504d59dc8c880805c285410004eaae26180000012c0200263c676204e203e010c3617299ec18405190292304726102f42040451be70e0004f9be914001d7b83e20000b850a809c307c0210453a6c6b871c2ececb838a75b4b2b20300002580e1df25db6c60c0b84748082025b2121000e230e300027d0540829081d0084926a12334a4208af815d75b12302665ff71881814f10caaa48814c3e09a32043c0ff4af9820809f6daa984000c00168d4644021281026f085cd71037902d1942246aec967fea4d8410a4000000000000006d4b456c504a4824c11155feee0f82865491ec31f00000000000000000000000000000000000000002791231031221021000e0020170401006800151900046f2000c404001e388040a801c2400c120050500200800c040012f84008640020200001001f8b9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityFourFifthsCase4" = "QuadParityFourFifthsCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityFourFifthsCase4 private def zz2052:"s0804"="s0804":=by decide+kernel end section namespace Green24Proof.QuadParityFourFifthsCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l30 l33 l35 l37 l38 l41 l43 l51 l6 l60 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xc70abc3, -0x71e4793, -0x8a215be,0x258], ![-0x71e4793, -0x3d755994,0xaa2a466,0x4db37f4], ![-0x8a215be,0xaa2a466, -0x2f23493f,0x7551fd2], ![0x258,0x4db37f4,0x7551fd2, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x6b182,l6),(0x131ff9,l10),(0x98a38e,l17),(0xa5da709,l15),(-0x3938700,l27),(0x3938700,l29),(0x71e955,l30),(0x3938700,l33),(-0x131ff9,l38),(-0x3938700,l35),(0x3938700,l37),(-0x71e955,l43),(-0xa5da709,l41),(0x3938700,l51),(0x6b182,l60),(-0x98a38e,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xa5da709,l15),(-0xa5da709,l41),(0x98a38e,l17),(-0x98a38e,l62),(0x71e955,l30),(-0x71e955,l43),(0x131ff9,l10),(-0x131ff9,l38),(-0x6b182,l6),(0x6b182,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x26001320138829e20804b5200c0000000005018802000000088780a601000094260900b400c00000000f00490060000000a8004c804000000a82c01e601800040847025030140000001a0c0718040002a1202c079003000000068481e601000000078240e3008000000003c02900400001a8110050c040000d0082004c602800000681100e300c21a3181400df200a000000210a018c020000000c8b01c6010000000068b0330040000004a1a05180400034108300b900300218480a00f4802001885208c0964010000000441a0718040000002a15038c02000000001500a4010000f0660a01a400c00c61904404b2008000000151103cc0200000f0c8280a801000000006830330040000001e0e0518040000000b8004c804000000000b00a40103182302b00f2401400000002418198020000001a0d038c02000000000d00a401001f03c084078401000781083404e200800000000090188020000000d85814601000000882101a300c00000000440290040000000d05028c02004c0b02180f4802000084380e01e400c000000221a079804000000150e018c02000190ac1401c801800000038240e300800000001c28198020000011854028c03002b0480b013a80250829010800cd401800a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x1850f957cf2c89bc9db651032f6690b1c0d003b10000000b92a0836008a2b0f689c8b12466144887ce3544cbadd2c830a3d9bd7ff3a85102432fdbddc8a344043dac8eecd0f0b86086f82a4a85894d34000aacf55fc28b05802b55d54ae74df09bb8eb88043707000012a9a2b99b0730a240e45f64b21e55d184a2097d54d4b111d536b8100167f3726001c008515c9568e668314484d5a23d6e059065d11bbdb89440565fb22d60588a9ba93b3321409575d7295346800156c701d01600a851aa86f53882000a80f00003bc40f81400063e649904b7c860c1c11352adf2872622c353491c42438fba1040489431e830415ab778808103b760b98104293707e408007fbd0c50709082201849391f9316c850e41e9e623448e2101d44f820808f511a20506bc27c04066040616f9c0e30201ab851d2600319b8649048032184f3741f9210480400001db200077a6851e6e59240bab931387147e62e1900b111b2e1800a319ec28031e58ec426101b0080000899b88f4800002319b5d94a3054481891071061060890480050020011c8a0080340003e880882ee23d2000008c66d76528c1512082c62462061430c3242240030180200db1d49c2772c6d510b3891bad76521806f757a8190306802000017e6e23d2000008c66d76528c1512082c62462062422410c12400c04008036c7cef7624b1a59720c246c0b700c30433e92d1807b8bc1465081a008000071903d090000fd9819b39d361224d5e9ed1c44b2b69e308fb3c54c801c5a0280a011b5ed810049e9e98100396679014a0506c0200002c6405c34000ada40f0572c1c2bdfab7c7e16e02b82a81c91afe0c0cdaabdfeb922e0558d5b35fb93dbba960f0578e24dbb85858077240a4000000000000003731861831c21020c10811032ba004699e5d86daff75f12caf9dc99d8137ec0e0952ab567384037f50191ba148cc919a690dd3c23764dacead5a7bd068f30531878f7eb127299d4000f7ce356cd7ee4f6eea583c15e38936ee161601dc9029000000000000000dd26fa9bbc1bf5b4c7eadc64430be994a8337189f2000000000000003620c21810c11801401005102482cb050b2f9d74ec10c82185842bd68bdbd1e5b67fc858e2c8d79e8c27c618fc706dd6bb8b19a49ed581eae950bf314d7b3b7a590d5e7ec412318a3d0daa00082c40ec840740a0390140dbe7aa271638541414cda4304de234eb7a2846bec23f904006beb9ef703807a0e0a85c28037a9cfdec8a6b765507145ba08d829719c7090091c59b46479cc16509317c78b96479f0ba66c8618d2b3b06e0e101d2746e41c082f98d4821409b8724ba6040fe1510da800028e2f04b479920048050c317694c7e01c2033d40c402813b7e5e2792011295ef557081eb7ef02782800f386ada124009176d344200514b26ef30004a1955800d82400900a00003ae68a656f7753164b7172b8cca1c0566e98c10413826a692c1edc9210a8c080acc2d38a00f74d6cd4280320bcc7d000010eb703db20042030038010000e79c2833dc06e6121366aa6249a055436143945fa1d8a19d0ec19248c3a0ebbc180077e8ab04e103a01000014434383a3fbf32290390ecb725399418fee5a8641901a82bfcf06a86197d53b796c1c096a08599801408cd999a3ac040f043eb379c0000cf188d6d87c5120050070a1c1d1fdf991481c8765b929cca0c7f72d4320c80d415fe7835430cbea9dbcb60e04b5042ccc00a0466cccd1d60207821f59bce00006e0c6b9803e28900280380001009b248537833860b1c3b46e2ae10818046dd1c5d8514134d962268908017a23dc4850821992e2b842080561e25990b07356ca09a60200495aa04c8a0d1200500680370100010a9c291e0dc80c241838480a1af01ffe09184da72acc041e6178480000de9e8600735ed8c27081c00800009e90007a53243d1a5239246b7dc483e38a2d0e75a08093863c6c081095aa77c14107d2c1703806374d4b8601f209c2102059c92f40924007c061443592e1ad8a50f123b617869437692ed489c2080ad03bf9910101682227202040160a68ef0611cc8b97f5a282059ff62080801e9077447df42400980b00003d86c91e9ee432070a2e9fa245950e07c2024e839932c15e86edb1c1028c3d7140309ae4b27041c00800009d9032090188080014bc80a04f8821ee30cb830931dde8c26289fc47a3722386067b7ea80187dcde4bb80305c24c798da285874dbf0a6200f1bae06f40010015e8b09b02400900b006c03c1557b2cfce08147120306c06157ea87125470e391a55e1060cc75ed401c604ae27cd458700967bb75c0500259bc77400013c5ce58036090024028715023470b30616415c3ea44411565bae50070e01898a41060d4e183d57c7086a93ebee050a725cdbd406041f8199f98000a9d9ebf0360900240280000ec10003cc206a0b0340581982e8703c05b1301c63deb613fd14582ea331f41c42552561660c31bcd8ccd2181b77925703101cc526802a18029554b3c90000e9ce4a58fa2400900a14381ccf884123078cf8bb8e308c57d1e8a2b05782a70e20abf67548c0e5776466080e93dc0b78a007afa7920601c762c15f9200400300001b13636d4fc4c286b5eaac03083205d30c08b68b12900501ca8d18013c1cec4c083601000010d34381344631e07185c60b188028aa5c1b) <<< 16000) + 0xccba1c41d5b11638941074dba203060619ca6ae80202fb8f0ebf71800634d03208000afec23e42824801281628702b374c60918106195d01c60e45030245153cbfbfd61c415209bfb060679457ba710198db2017050020c495760c020ae4027ed24008808000038a6c6cc6997a50d65234908101651af0c205035273024e176aa40104e6b8c600b8663813820d80400004d080028910320d01880800289080082990024a13c400003138050924edc00118103c7763a0507f839800f180d74f5b1d05000f1dd8e84114fc823f096a3101100e00005ac81810c0505605e2302e0dc00c673f962008382110cc574700b506328ce255ce6b3364f8a015c273bab3b5195258a1800802b7d638e890fd668273ee28036e2baa119535bf617a9e5432e690a40f93efbee1304ac8bfc3e2bdc388737ad0b6247d8d12a41bb7c479ad989420e0343ee029d790b15c3d162625d20202737382700d2765c900cac4d848102e010d18945f386881a035734305599e9a07a363ae4001900840b0c5bc8a105759a343f119f03021c8cb90005802000015470597f53224311dbf23005732c31c00e3e312404180080000599000248305c20eb0e007be8f92041700440100401000004440b41600017060555881d38003817512027aaf0c2308190084088e9f04b060eb7082057f44c86308180080000481924a8818102843b14e00ee4d52c096644c90064d162504160085147d486244091940a1eadd9c808098ae4805d78394005402182b3afe050ea27e2202054978c0054020000108400059481602c0009888001dd990dc9e74f1808ec391d1412c9be5610367ddea04004c77160ca1036010a10693e4e141866cf7c18210ba47a204a8a88b430ac83f0eca0036010a11ab865c1822a16dac4080734f70c29ca4dac9004e9462140054c102c0034008000104203a02000218204a1a011010001a2902b1581502e01002008800008022039bfb11001199de4002a00800006220520a0000b4300c01004000011102809d121ba26c892541712312151b54f61023f88de410221b003594106c021427204adc3046ec6370810f16cfa480c373350a0058ee7e4a08340100000e13c5031e86490e3fa70e141293a3683063289de09020680200001784094340220a0002e3204e1a0200d000235901415e1e796f93004fd77bfe00a479129caa871bca8e052d9be4c5db8f7883c3ead02800e5a42305eae28679efa7a6a15bdc62f9f7c5fa6f49d369114b2675bae2782000252b28e15352056c1317ca7481ac4f167637915226d8aa46c53365ebc7a00cfbaaf166cf6d36fa8da41329df08445dd3380d9b4c9842f02a1b75b82f5fe186c21ff96c9eaf787c444503faa40361f223a9a532a4f61bddc619e46c091802fdbc88269cb7bc3020fbc8a8500282a37c700183b2584a1036010a2ef1c3e224001be6d628002b2cdc2000c565792020d80428601259a848a08fc5285174572d2081044cf6b64041b00800005f9000198200053640983601a13960e15efd5be3f0b7015c1540e12b9afda812f444496d9133e4b6db0f259c482912900000000000000070e62e2b982be0596072f719cb816838e208386382200127e480426860c62c3371f1b8a3ebf432ebb61641423004d46422d4bce15a0192eb9a4aa14ccc6f9f98cdc979717a9c2ddf048e9a866c98768a4f24c061322af21218b47a924043435a50105c01165de5bb80a182835aa60b35f1ac1440ac3670c00af61ae500190086191e32b0e2e458972841259fe38048249e8002e0080000ab20003406836742ee143d719df342ae3866200d3381a090206002000016a4000ce081288804404000e7e4090660460ba243bbbe6249b5702c8914374e6c204114cadd90106802122efbeb9145047f502089a219450117dbc9404170040000571812a4d6c0c000c01447018c9b20500bb9e0424081800800005a9e1eefcb199f6b11d17eff7d5e37d431244818a51d7896d58aaa81e12036d4640d96caf03645974f5c1101dd7baa2de08231b2e04cab629c59a05388452ac046788545ce07b384cdc7646d2bfb48fae15f37d91c8b8144fb596ea3f48e51c6150fba460d0d623b3860bfdc4f3bf667d1c664867b3b59a5e1ef19b5e9f856a91ebe17207621b92c9899c0fb57a72bfe459d25fe5c02275f3d477edefb38ab1bf05efab47e71c8555e91c3f0451426bafb06597fd92fcb3d5d320d6f5600002f09022110108480801403e0a01e0100045c900181f200503867c0b2c1b92b190e3ee2523682a6cbc9d86e80e774000000000000001c12b9afda812f444496d9133e4b6db0f259c482912900000000000000070937d4dde0dfada63f56e322185f4ca5419b8c4f9000000000000001b225620fd0f02d12fc326c4c2dfe9ba12f92e70cac000000000000006c8206300280080a081c66080cdabdf52caf7b5c2d5fc1af3a01bb4e91a65d60dc5aee759b0dbc3972e8258ec5d38a9c0bb3e79626279c280295ce349578d01a1b294818ae82af095b87972d873f2c966dc5262486d37ad4bca40ba30580ed4dee300e7bb4cce4cd57d0078031a90ed6b16d92c50b6cd9aa03a02000762200661c4016e34f0c7545d272534131c27f430808a988f1370decb21287057a9bc8e789bd77594a060644b6324743ad8eda35040493ab0c55019f3d13bf0301b5a83b8c15aad9a01a010003b97a26579bda1d3191060f3ef04562b549f3884d7b514f83e721c71303210106bed8b7e72caf7bd74b4244d38f3490e028e95f71faf6623845a8d18fc73c65db877467)) <<< 16000) + 0xfb92aca8fa2494f4fb2b6a01038a1037bb2924daacb4944c503853fbd9e28a6b93878e24707c638241c613d1ca2552326b2617e20c9c8444063f257807fdc5782006bee7ce652d83e4dafb4ea3fdb39752430718ac5a614e1200122a644cf6b521ab95b292a5def7553556a4d8d42586a81b00019eee4b0425e2685f82b1d5693200d6d8aa576da6d66d5c39bffc979a4cd317f9cec9a115c4ed0050b9de8c8b0c5f1442880504bec4101e0df1101ebfcd941831d23fa04041d354c8300b2945182009fabc7409c406c021af1d93faabe000005338dc0b4f1aba8b7d1cc1d80c9aca01d347d79d639a61100000000000000000000000000000000000000009c451450848838848628018085c300401baf1d93faabe000005338dc0b4f1aba8b7d1cc1d80c9aca01d347d79d639a61100000000000000000000000000000000000000009c461461060c58c58a58048170001006e190afaee0c28cfaad4183192c5992c6e8d0e4858b48a7d9c1003a5fe84c003601000010b203803d1d0df8a78030791c272ca0c19b06b45651821e3378dc0504561a40080415327f6570c00a627e9ab28001b6c14a32200088081840b527739a3928d680183c7c8d040a0842bb7302089200cb0e000000734c00380100001113a397838457a10c1dd9484f670e60d1c73360f5a345082c66677e02098465d37038a00055b1c074010018624cb8c89c40e0052078d2c7fc7648c20367bcdcd1c63bc014c1e545a5ec104331fa60700000094e6001c00800008890002cd2000b56400247c8005af101b050006639001329203433002015103f75080c1816b27c142080dbca283b74f2e05004284e812820d80430a23c81a480c6491010c1848ade9182cb6f90a2021b8f114204ac5b2f9000e711759c006c021850540b30306438bbb460afecf6906081a6cdd08112cb7792800d804000038c80011790120580880c064070417f6a9450e48e1848e30269cbe207d18fa78e13f119dc12840d00430b7ae19e9226003544288fc7c30900010f1172000d0042467100a68c2f88bafc913c45d7f1800c8040000240d1213e4f272eb0e4a04c3b03980321939203827a66fa18822bb57b70196e22b4e8440d581f5784996951b4487c1a1df7a5511c0014e4de13a6e8ad86e6885eb9d9de9040006980f877136bbe40eac52ad4ed33200f0be521f7c0a709095fb377a029eab0ae4f3e4cee986a8f8148432823d0c20000e6480028b980cbdaa26edca7b52a2b822c90b60150184d0b13a9def0dfc060896361fdf04f2010d7bc72809d4412d9a6927fdb05ed0c0dc6955acc04aa01cf9b43d4dc578bc204b1270c0b261c0bf729aaec9e56880007e07ae3402f083e38bc6a5153781b78f37b4922635f326990ad9431d45c00006f660404d0d74306013a75440db8980c88162daca9081092a7bf2800d80420502b7f483060455d9440dd812998a1009d4a0102c450c103000273ec66001b0080000859a28c12dfe0e1906d98a0c252540d220218570e0306f39e7b92820d804000039880c04805c1400066a40033ec80b08c0544402823a1a127a6188200cc8fe0c32c1f344405e732d9024081b00858fd9a6f5121a1c12d44061fbc7c8e194b627c480740def080473bb3c4c0834010b104897a924322443a080c43bb8c1c3f94241c20b74aad865041a0080000709000203201e1300d05d8eca1279880e61228e0e1973fa6d2c2035a31448016d9728400548a8a4c0036010b1c9c86b2406de0a171c3d5e1de9610acf55c30a578f1b5001900400006c901305d0ce08b0a480a503c928e13ca9ccb18211410ea500429eb308001c61cc24c103601000010f20141a009010001b410121580882e00802008a2ce5edac5861edb118e00116d3f1800d004200002008000022200019e40401700c01004000011100f0980704803427a2296f1840ec581a2820ca228c00540210293333881dd7cd941011b90a10905c1000e80354005001000018070c090b906142f304601637c51201e25ca48082c0100000aa201802c26a4b311c108c7303008db12c09840c00220677d0f8d0a64486061254b6a26082e00881c63b0f0d08b7f0ee5000818d71c02e616a92020c80400002d88000ad90002043004010044166ae3e24022fde648105c0100000cc402c05231253af181d6bb6c8c18918238e1161be39803dbe9c1201540ad06026865284e1030010b201d50e92203f6b23838110d42801e27b0300eca5a4a002e010e14947d247081a143e383054b5c1c07a34cde4001900800005a9d13a80ba05006701241c011e18c91820c8040000248800126900038920008b84028540120a0008f9200156240046088011301a2fc132540286379f3258a0b06f673a20202e142a080098684b4180000025804007dded5a813880f00430dc6391a0d0c203ac923343048d27b8bb04080acc5c183800151415d8a001ad2926e20000e664d201470c220144117c48d781c750231810e2998533ac80c00009603878ca4cfd18302e11d20208096c848400316bebc0009e114340a4207402124a90e3c34411d322c5012302771bd840c0ce673b12206ef4eda4089d8316c82081179f04200077efed14020f004225620fd0f02d12fc326c4c2dfe9ba12f92e70cac000000000000006d3c6aea2df4730760326b28074d1f5e758e698440000000000000000000000000000000000000002711231031221020e210002017040100680014f900042d2000bbc4001d908040a801c2400c120050500200800c0400129640087400202000010021501)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityFourFifthsCase5" = "QuadParityFourFifthsCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityFourFifthsCase5 private def zz2053:"s0805"="s0805":=by decide+kernel end section namespace Green24Proof.ParityFourFifthsRows open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) def rowsChunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x105c002b196c004eeee407a898018b657068da00217068da00207d34ca5d004aa8601d37a898004f4c6537a898012c99a13068da00201c304e2ad80019f81d24304e2ad80289682030198cba025b4b65604e2ad801cae98a21602b196c00e97a59e07d20198cba0118a865204e2ad8022a3888e1204e2ad802387da9e01c20198cba005d482ee4202b196c008f7f1f601824ca5d002c2ade2023d84c00280938614] def rowsChunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x101d502b196c004e2c78e5502b196c005cbaa9603950198cba001b680ca029504e2ad803adbce9e01950198cba001b680ca1502b196c006bdacca03c13d84c00197a5e602c102b196c02194aea2410386d00203810198cba002c2ade202817a89800db69efe010386d00203d404e2ad800198fff205d402b196c01ae382547a898004d786440386d00203d00386d02bf605d03d84c001d1c2502692e829e202c002b196c00bf8d214] def rowsChunk2:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x103d504e2ad80078fa5aa02d504e2ad8037a4b48602] def rows:List (ℚ × Potential) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 def mu:Phase → ℚ:=![(0x43c7773 / 0x4c4b40),(-0x3e2f8fb / 0x4c4b40)] def parameter:ℚ:=(4 / 5) def normalization:ℚ:=(1 / 0x186a) def quad0:Expression:=quadSlack rows parameter 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r29,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadParityFourFifthsCase0.base QuadParityFourFifthsCase0.hinges QuadParityFourFifthsCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel private def zz158:"s009e"="s009e":=by decide+kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadParityFourFifthsCase0.base QuadParityFourFifthsCase0.hinges QuadParityFourFifthsCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityFourFifthsCase0.nonnegative x hx def quad1:Expression:=quadSlack rows parameter 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r29,RewriteAtoms.r30,RewriteAtoms.r25,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadParityFourFifthsCase1.base QuadParityFourFifthsCase1.hinges QuadParityFourFifthsCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadParityFourFifthsCase1.base QuadParityFourFifthsCase1.hinges QuadParityFourFifthsCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityFourFifthsCase1.nonnegative x hx def quad2:Expression:=quadSlack rows parameter 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r19,RewriteAtoms.r3,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadParityFourFifthsCase2.base QuadParityFourFifthsCase2.hinges QuadParityFourFifthsCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel private def zz159:"s009f"="s009f":=by decide+kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadParityFourFifthsCase2.base QuadParityFourFifthsCase2.hinges QuadParityFourFifthsCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityFourFifthsCase2.nonnegative x hx def quad3:Expression:=quadSlack rows parameter 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r3,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadParityFourFifthsCase3.base QuadParityFourFifthsCase3.hinges QuadParityFourFifthsCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadParityFourFifthsCase3.base QuadParityFourFifthsCase3.hinges QuadParityFourFifthsCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityFourFifthsCase3.nonnegative x hx def quad4:Expression:=quadSlack rows parameter 1 1 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadParityFourFifthsCase4.base QuadParityFourFifthsCase4.hinges QuadParityFourFifthsCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel private def zz160:"s00a0"="s00a0":=by decide+kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadParityFourFifthsCase4.base QuadParityFourFifthsCase4.hinges QuadParityFourFifthsCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityFourFifthsCase4.nonnegative x hx def quad5:Expression:=quadSlack rows parameter 1 1 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadParityFourFifthsCase5.base QuadParityFourFifthsCase5.hinges QuadParityFourFifthsCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadParityFourFifthsCase5.base QuadParityFourFifthsCase5.hinges QuadParityFourFifthsCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityFourFifthsCase5.nonnegative x hx def pair6:Expression:=pairSlack rows parameter mu normalization 0 0 false def pair6Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair6Target:NormalForm:=CompactPair.toNormal LocalParityFourFifthsPairs.compact_parityFourFifths_pair_6_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_6_hinges theorem pair6_identity:identityCheck pair6 pair6Rewrites pair6Target = true:=by decide +kernel private def zz161:"s00a1"="s00a1":=by decide+kernel theorem pair6_target_eval (x:Point):normalEval pair6Target x = LocalParityFourFifthsPairs.parityFourFifths_pair_6 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityFourFifthsPairs.compact_parityFourFifths_pair_6_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_6_hinges x theorem pair6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair6 x:=by rw [identityCheck_sound _ _ _ x pair6_identity,pair6_target_eval] exact LocalParityFourFifthsPairs.parityFourFifths_pair_6_nonneg (hx 0) (hx 1) def pair7:Expression:=pairSlack rows parameter mu normalization 0 0 true def pair7Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair7Target:NormalForm:=CompactPair.toNormal LocalParityFourFifthsPairs.compact_parityFourFifths_pair_7_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_7_hinges theorem pair7_identity:identityCheck pair7 pair7Rewrites pair7Target = true:=by decide +kernel theorem pair7_target_eval (x:Point):normalEval pair7Target x = LocalParityFourFifthsPairs.parityFourFifths_pair_7 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityFourFifthsPairs.compact_parityFourFifths_pair_7_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_7_hinges x private def zz162:"s00a2"="s00a2":=by decide+kernel theorem pair7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair7 x:=by rw [identityCheck_sound _ _ _ x pair7_identity,pair7_target_eval] exact LocalParityFourFifthsPairs.parityFourFifths_pair_7_nonneg (hx 0) (hx 1) def pair8:Expression:=pairSlack rows parameter mu normalization 0 1 false def pair8Rewrites:Rewrites:=[] def pair8Target:NormalForm:=CompactPair.toNormal LocalParityFourFifthsPairs.compact_parityFourFifths_pair_8_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_8_hinges theorem pair8_identity:identityCheck pair8 pair8Rewrites pair8Target = true:=by decide +kernel theorem pair8_target_eval (x:Point):normalEval pair8Target x = LocalParityFourFifthsPairs.parityFourFifths_pair_8 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityFourFifthsPairs.compact_parityFourFifths_pair_8_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_8_hinges x theorem pair8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair8 x:=by rw [identityCheck_sound _ _ _ x pair8_identity,pair8_target_eval] exact LocalParityFourFifthsPairs.parityFourFifths_pair_8_nonneg (hx 0) (hx 1) def pair9:Expression:=pairSlack rows parameter mu normalization 0 1 true def pair9Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2] def pair9Target:NormalForm:=CompactPair.toNormal LocalParityFourFifthsPairs.compact_parityFourFifths_pair_9_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_9_hinges private def zz163:"s00a3"="s00a3":=by decide+kernel theorem pair9_identity:identityCheck pair9 pair9Rewrites pair9Target = true:=by decide +kernel theorem pair9_target_eval (x:Point):normalEval pair9Target x = LocalParityFourFifthsPairs.parityFourFifths_pair_9 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityFourFifthsPairs.compact_parityFourFifths_pair_9_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_9_hinges x theorem pair9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair9 x:=by rw [identityCheck_sound _ _ _ x pair9_identity,pair9_target_eval] exact LocalParityFourFifthsPairs.parityFourFifths_pair_9_nonneg (hx 0) (hx 1) def pair10:Expression:=pairSlack rows parameter mu normalization 1 1 false def pair10Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair10Target:NormalForm:=CompactPair.toNormal LocalParityFourFifthsPairs.compact_parityFourFifths_pair_10_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_10_hinges theorem pair10_identity:identityCheck pair10 pair10Rewrites pair10Target = true:=by decide +kernel private def zz164:"s00a4"="s00a4":=by decide+kernel theorem pair10_target_eval (x:Point):normalEval pair10Target x = LocalParityFourFifthsPairs.parityFourFifths_pair_10 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityFourFifthsPairs.compact_parityFourFifths_pair_10_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_10_hinges x theorem pair10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair10 x:=by rw [identityCheck_sound _ _ _ x pair10_identity,pair10_target_eval] exact LocalParityFourFifthsPairs.parityFourFifths_pair_10_nonneg (hx 0) (hx 1) def pair11:Expression:=pairSlack rows parameter mu normalization 1 1 true def pair11Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair11Target:NormalForm:=CompactPair.toNormal LocalParityFourFifthsPairs.compact_parityFourFifths_pair_11_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_11_hinges theorem pair11_identity:identityCheck pair11 pair11Rewrites pair11Target = true:=by decide +kernel theorem pair11_target_eval (x:Point):normalEval pair11Target x = LocalParityFourFifthsPairs.parityFourFifths_pair_11 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityFourFifthsPairs.compact_parityFourFifths_pair_11_base LocalParityFourFifthsPairs.compact_parityFourFifths_pair_11_hinges x private def zz165:"s00a5"="s00a5":=by decide+kernel theorem pair11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair11 x:=by rw [identityCheck_sound _ _ _ x pair11_identity,pair11_target_eval] exact LocalParityFourFifthsPairs.parityFourFifths_pair_11_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows parameter p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad4_nonneg x hx · exact quad5_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack rows parameter mu normalization p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair6_nonneg x hx · exact pair7_nonneg x hx · exact pair8_nonneg x hx · exact pair9_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair10_nonneg x hx · exact pair11_nonneg x hx end Green24Proof.ParityFourFifthsRows private def zz2054:"s0806"="s0806":=by decide+kernel end section namespace Green24Proof.ParityFourFifths open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ParityPhaseAggregation (rowsAdmissible) theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack ParityFourFifthsRows.rows ParityFourFifthsRows.parameter p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityFourFifthsRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse ParityFourFifthsRows.rows ParityFourFifthsRows.parameter p q same x] exact ParityFourFifthsRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) private def zz166:"s00a6"="s00a6":=by decide+kernel theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack ParityFourFifthsRows.rows ParityFourFifthsRows.parameter ParityFourFifthsRows.mu ParityFourFifthsRows.normalization p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityFourFifthsRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap ParityFourFifthsRows.rows ParityFourFifthsRows.parameter ParityFourFifthsRows.mu ParityFourFifthsRows.normalization p q same x] exact ParityFourFifthsRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible ParityFourFifthsRows.rows = true:=by decide +kernel noncomputable def massCorrection (U V:ℝ):ℝ := ((4 / 5:ℝ) * U - V) * ((-0x1600b73 / 0x1312d00:ℝ) * U + (0x1809efb / 0x1312d00:ℝ) * V) - (1 / 0x61a8:ℝ) * (U + V) ^ 2 theorem correction {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (1 / 25:ℝ) * deficit u + massCorrection (mass u) (mass v) ≤ deficit (interleave u v):=by have hc:=ParityCorrectionAggregation.correction_of_local_rows h3 h5 ParityFourFifthsRows.rows ParityFourFifthsRows.parameter ParityFourFifthsRows.mu ParityFourFifthsRows.normalization rows_admissible quad_nonneg pair_nonneg u v hu hv have hmu0:ParityFourFifthsRows.mu 0 = (0x43c7773 / 0x4c4b40:ℚ):=by decide +kernel have hmu1:ParityFourFifthsRows.mu 1 = (-0x3e2f8fb / 0x4c4b40:ℚ):=by decide +kernel rw [hmu0,hmu1] at hc norm_num [ParityFourFifthsRows.parameter,ParityFourFifthsRows.normalization] at hc unfold massCorrection nlinarith only [hc] theorem massCorrection_lower_bound {U V:ℝ} (hV:0 ≤ V) (hlow:(11 / 10:ℝ) * V ≤ U) (hhigh:U ≤ (31 / 25:ℝ) * V) : (0x416319 / 0x12a05f200:ℝ) * V ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith private def zz167:"s00a7"="s00a7":=by decide+kernel theorem interval_nonneg {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(11 / 10:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (31 / 25:ℝ) * mass v):0 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_lower_bound hV hlow hhigh nlinarith [sq_nonneg (mass v)] theorem massCorrection_coercivity {U V:ℝ} (hV:0 ≤ V) (hlow:(11 / 10:ℝ) * V ≤ U) (hhigh:U ≤ (31 / 25:ℝ) * V) : (1 / 0x12c:ℝ) * (U - V) ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [sq_nonneg V] theorem coercivity {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(11 / 10:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (31 / 25:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_coercivity hV hlow hhigh linarith end Green24Proof.ParityFourFifths private def zz2055:"s0807"="s0807":=by decide+kernel end section namespace Green24Proof.LocalParityTwoThirdsPairs def compact_parityTwoThirds_pair_6_base:CompactPair.Quadratic:=⟨(-1 / 0xe4e1c0),(0x7d1 / 0x1312d00),0⟩ def compact_parityTwoThirds_pair_6_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x7270e00),1, -3⟩,⟨(1 / 0x7270e00),3, -1⟩] noncomputable def parityTwoThirds_pair_6 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoThirds_pair_6_base compact_parityTwoThirds_pair_6_hinges x y def compact_parityTwoThirds_pair_6_cuts:List ℚ:=[(1 / 3),3] theorem compact_parityTwoThirds_pair_6_check : CompactPair.expressionCheckPSD compact_parityTwoThirds_pair_6_base compact_parityTwoThirds_pair_6_hinges 0 compact_parityTwoThirds_pair_6_cuts = true := by decide +kernel private def zz168:"s00a8"="s00a8":=by decide+kernel theorem compact_parityTwoThirds_pair_6_representation (x y:ℝ) : parityTwoThirds_pair_6 x y = CompactPair.expressionEval compact_parityTwoThirds_pair_6_base compact_parityTwoThirds_pair_6_hinges x y:=by rfl theorem parityTwoThirds_pair_6_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoThirds_pair_6 x y:=by rw [compact_parityTwoThirds_pair_6_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoThirds_pair_6_check hy (by simpa using hx) def compact_parityTwoThirds_pair_7_base:CompactPair.Quadratic:=⟨(-1 / 0xe4e1c0),(0x191 / 0x989680),0⟩ def compact_parityTwoThirds_pair_7_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x7270e00),1, -3⟩,⟨(1 / 0x7270e00),3, -1⟩] noncomputable def parityTwoThirds_pair_7 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoThirds_pair_7_base compact_parityTwoThirds_pair_7_hinges x y def compact_parityTwoThirds_pair_7_cuts:List ℚ:=[(1 / 3),3] theorem compact_parityTwoThirds_pair_7_check : CompactPair.expressionCheckPSD compact_parityTwoThirds_pair_7_base compact_parityTwoThirds_pair_7_hinges 0 compact_parityTwoThirds_pair_7_cuts = true := by decide +kernel theorem compact_parityTwoThirds_pair_7_representation (x y:ℝ) : parityTwoThirds_pair_7 x y = CompactPair.expressionEval compact_parityTwoThirds_pair_7_base compact_parityTwoThirds_pair_7_hinges x y:=by rfl private def zz169:"s00a9"="s00a9":=by decide+kernel theorem parityTwoThirds_pair_7_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoThirds_pair_7 x y:=by rw [compact_parityTwoThirds_pair_7_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoThirds_pair_7_check hy (by simpa using hx) def compact_parityTwoThirds_pair_8_base:CompactPair.Quadratic:=⟨0,(0x1069 / 0x1c9c380),0⟩ def compact_parityTwoThirds_pair_8_hinges:List CompactPair.Hinge:=[] noncomputable def parityTwoThirds_pair_8 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoThirds_pair_8_base compact_parityTwoThirds_pair_8_hinges x y def compact_parityTwoThirds_pair_8_cuts:List ℚ:=[] theorem compact_parityTwoThirds_pair_8_check : CompactPair.expressionCheckPSD compact_parityTwoThirds_pair_8_base compact_parityTwoThirds_pair_8_hinges 0 compact_parityTwoThirds_pair_8_cuts = true := by decide +kernel theorem compact_parityTwoThirds_pair_8_representation (x y:ℝ) : parityTwoThirds_pair_8 x y = CompactPair.expressionEval compact_parityTwoThirds_pair_8_base compact_parityTwoThirds_pair_8_hinges x y:=by rfl theorem parityTwoThirds_pair_8_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoThirds_pair_8 x y:=by rw [compact_parityTwoThirds_pair_8_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoThirds_pair_8_check hy (by simpa using hx) def compact_parityTwoThirds_pair_9_base:CompactPair.Quadratic:=⟨(-1 / 0x3938700),(0x961 / 0x1c9c380),0⟩ def compact_parityTwoThirds_pair_9_hinges:List CompactPair.Hinge:=[⟨(1 / 0x3938700),1, -3⟩] noncomputable def parityTwoThirds_pair_9 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoThirds_pair_9_base compact_parityTwoThirds_pair_9_hinges x y def compact_parityTwoThirds_pair_9_cuts:List ℚ:=[3] private def zz170:"s00aa"="s00aa":=by decide+kernel theorem compact_parityTwoThirds_pair_9_check : CompactPair.expressionCheckPSD compact_parityTwoThirds_pair_9_base compact_parityTwoThirds_pair_9_hinges 0 compact_parityTwoThirds_pair_9_cuts = true := by decide +kernel theorem compact_parityTwoThirds_pair_9_representation (x y:ℝ) : parityTwoThirds_pair_9 x y = CompactPair.expressionEval compact_parityTwoThirds_pair_9_base compact_parityTwoThirds_pair_9_hinges x y:=by rfl theorem parityTwoThirds_pair_9_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoThirds_pair_9 x y:=by rw [compact_parityTwoThirds_pair_9_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoThirds_pair_9_check hy (by simpa using hx) def compact_parityTwoThirds_pair_10_base:CompactPair.Quadratic:=⟨0,(1 / 0x2710),0⟩ def compact_parityTwoThirds_pair_10_hinges:List CompactPair.Hinge:=[] noncomputable def parityTwoThirds_pair_10 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoThirds_pair_10_base compact_parityTwoThirds_pair_10_hinges x y def compact_parityTwoThirds_pair_10_cuts:List ℚ:=[] theorem compact_parityTwoThirds_pair_10_check : CompactPair.expressionCheckPSD compact_parityTwoThirds_pair_10_base compact_parityTwoThirds_pair_10_hinges 0 compact_parityTwoThirds_pair_10_cuts = true := by decide +kernel private def zz171:"s00ab"="s00ab":=by decide+kernel theorem compact_parityTwoThirds_pair_10_representation (x y:ℝ) : parityTwoThirds_pair_10 x y = CompactPair.expressionEval compact_parityTwoThirds_pair_10_base compact_parityTwoThirds_pair_10_hinges x y:=by rfl theorem parityTwoThirds_pair_10_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoThirds_pair_10 x y:=by rw [compact_parityTwoThirds_pair_10_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoThirds_pair_10_check hy (by simpa using hx) def compact_parityTwoThirds_pair_11_base:CompactPair.Quadratic:=⟨(1 / 0xe4e1c0),(0x191 / 0x989680),0⟩ def compact_parityTwoThirds_pair_11_hinges:List CompactPair.Hinge:=[⟨(1 / 0x7270e00),1, -3⟩,⟨(-1 / 0x7270e00),3, -1⟩] noncomputable def parityTwoThirds_pair_11 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoThirds_pair_11_base compact_parityTwoThirds_pair_11_hinges x y def compact_parityTwoThirds_pair_11_cuts:List ℚ:=[(1 / 3),3] theorem compact_parityTwoThirds_pair_11_check : CompactPair.expressionCheckPSD compact_parityTwoThirds_pair_11_base compact_parityTwoThirds_pair_11_hinges 0 compact_parityTwoThirds_pair_11_cuts = true := by decide +kernel theorem compact_parityTwoThirds_pair_11_representation (x y:ℝ) : parityTwoThirds_pair_11 x y = CompactPair.expressionEval compact_parityTwoThirds_pair_11_base compact_parityTwoThirds_pair_11_hinges x y:=by rfl private def zz172:"s00ac"="s00ac":=by decide+kernel theorem parityTwoThirds_pair_11_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoThirds_pair_11 x y:=by rw [compact_parityTwoThirds_pair_11_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoThirds_pair_11_check hy (by simpa using hx) end Green24Proof.LocalParityTwoThirdsPairs private def zz2056:"s0808"="s0808":=by decide+kernel end section namespace Green24Proof.QuadParityTwoThirdsCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1ea34645, -0x12fb4de2, -0x1c9c30f8,0x1e12dc5], ![-0x12fb4de2, -0x81289b88,0x15ea185a,0xefa81e4], ![-0x1c9c30f8,0x15ea185a, -0x7c0fae45,0x133fbd1f], ![0x1e12dc5,0xefa81e4,0x133fbd1f, -0x9896800]] noncomputable def hinges:Hinges:=[(-0x1a899e,l6),(0x7f93d7,l4),(-0x8d954,l10),(0x85b01b0,l14),(0x75b54a,l17),(0x1b88069e,l15),(-0x9896800,l27),(0x9896800,l29),(-0x85b01b0,l25),(0x4e48420,l30),(0x9896800,l33),(0x8d954,l38),(-0x9896800,l35),(0x9896800,l37),(-0x7f93d7,l34),(-0x4e48420,l43),(-0x1b88069e,l41),(0x829bff,l46),(0x9896800,l51),(0x1a899e,l60),(-0x75b54a,l62),(-0x829bff,l64)] def normalizationDenominator:ℤ:=0x15752a00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x9896800,l27),(0x9896800,l29),(0x9896800,l33),(-0x9896800,l35),(0x9896800,l37),(0x9896800,l51),(0x85b01b0,l14),(-0x85b01b0,l25),(0x1b88069e,l15),(-0x1b88069e,l41),(0x4e48420,l30),(-0x4e48420,l43),(0x829bff,l46),(-0x829bff,l64),(0x75b54a,l17),(-0x75b54a,l62),(0x7f93d7,l4),(-0x7f93d7,l34),(-0x1a899e,l6),(0x1a899e,l60),(-0x8d954,l10),(0x8d954,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x190e81c601002d0a61640df4010000b45315012a0060004c21868069003000000118701c601000000000840e200800004c421a02a0040004c218680a9003000000c41403860180000000887033004000000000a0490040000000036014802000000001900a4010000000220013201018c118158079200a0000022084068c03000000098301c601000000000440e2008000000004402900400044118280a900300000000906066008000000a42c073008000000522e039804000002484c050c030000000d0681c601000000000240e2008000000120c031804000000001a0148020001486812044801801f03c084078401000781083404e200800000000090188020000004414018601800000982901a300c000000002a071004000000190902cc0200540d02980f4802000000000340e200800000290900e1806000000120d038c020000000090e066008000c44409022400c00000000018190020000000001c0c801000000050280a60100000000005032004000001506009980600430a011014d0040000000004812401000000028140b3008000000005402900400000000260148020000008c2a01460180000004c2406300a841480840066a00c004d08c1200c9004002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x3a01480200000480981b86020000000981c0730080004e8118014980a0000260130064c04000000c45202c601800000280900c300c00000000120390040000002109028c02000000000780a40100000980cc01330100000004c1e039804000000098004c804000000000c80c4010000000a8340730081ce30c37816ba00a000000150b034c02000000000580a401000000098140530081842143100b8200a000000001e014802000000000281a40100000000034092008000000000a031004000000110f014c02000009c08802c602000094260900b400c00000000f00490060f208a0b40631005000000cc4a01460180000006c44063008000029090009980800000000160148020000000b0900e601000000002c009200c00000001b004900600001a8110050c04000000c812018601800068041002630140000034088071806000000000240c8010000000c8b00a6010000000000b0320040000034168099806006116013014d004000000000a812401000000064580b30080000423c0e0520040000002e19038c02000000001700a4010000000c4240b30080000004c22071804006111015039900400298681200f4802000000000740e200800000290500e180600a118c3902ad004000000088300c6010021061078056401000000310d00e18060000002a15038c02], #[]⟩ def dynamicCode : Nat := (((((((((((((0x1c604c93f39a57ee29469851f9a5d794004f390382482038010e34701132a79821ca8fb38c3525d9f1e187546974f0a195fa32182d642b69081372f1f600000005e48a01074021c699d2bec4513000a78548798228a2ce038c0f9051d89e3cedd0c698f08a2e52b061830bd489cc3c0476211ad8a00040669e0a24108406000037841f027e606fdf8667180001e949e3956d5ff878637118ff9e125193cc270344de2799008783ded80000000bc914020f0042260007da3f6798175660cf9c600000d2f078ee5264fe91e18082288dc70330918f62100870c78d1c8800121cdc71e00cb6e) <<< 16000) + 0xe61c7a4108805000038a40d0140006d04001b68f124b9fc42613050fd2e50011a25ec4805c172ea084828380100000cb3a536c73801a2d0fbd461610ad27cc94103963f31a0987f16d1400cd11ac13020e00434de00fab71b0d3092271051938b0cce7b574cc0c01afd2a2a38133b061c51040402cfd8a9018028bc256d4c2007f38f995c040025c89397f7290026028714d7979c030e266cb558da18200347a80b2c40035c91b2606006a2873050d276aeb83861b7d55ab3a1006ab8f5860180a8c584fa641200460480001cf20007aa405405c4acf4e28309f02be4650041e6fc490156e1dd092060d804000030c83d8681d424000c4068af6cb6dd20d24013d5c95289000017bb0b207183a2262c606e804298d080b7271d02820cafdd36c20848290d352c0467246d03720044028d2443ffd00d206c69930b21c3fc3d8b1834ea2f4b0e8d201b08008f2ec0e6001c008000088907a0503c828048140f00a07705038008000db0d931da58cc80c96e3ce8819ac17bc240597ab1a480836010c2924fd32e330488dd17b40397204017ba3d5fa9419b0f1d0b93880c3300af57f8202c3d7697e341007edf36716b06011fa2734530003b9a58c6a89db52400a40f1222dc9d24c8364080cff4a6d6b941991b102246840600e603908e1210cfbc6fb1f8202a9624b287d1400582b8dbc4c380b39141640e000621ab4a7af9762920054080000215200087641d8260ea0307401e160477ca186144f05884078f1c74115030ce89e7ec048847f94802288255595fa70429b7a69020080ef348c081242046e038908200146140c2aed1643c737a1528700c318f2750c40d141a2303bf04882607c1f8f14421e9aee3d860861549b820c030472bebc8300d443d80d20cc484128120000794f13a864b7c80c8f5b2d0209d1bd1e2406583f2424818360100000c320a81a0004a734545b689d9950a2400004005d8690081da7c21c34608850b075a0e10249799a7d8208360d630f625021b0821b47a081058dd0c0e884009c4742ad2246e400a40c1a450e9d0d2c3c13755438407037b0a01a250cd90036d6c7394006c0200001c841cc140e40a012050388281c0040006e041bc34001b6c69bfda276c2600000210ea882e238c50a40a38a504480300280180002064900401a000212403047658ed8798e8c0a2560702a6eb058e1330ea48601c48eb81c3c100410365c7fe334b043ba4ca72a03822728d080d004136174acfdb9201ee6b96df13cd920052068a253fa2df94b1d4771b2c8b106e31d05470447079a68104a6e93a80b02b7b85840700172fd2d81001e4f47dc000c228205b24008004000035e4050160dc0b06d05f96480a3104c285ee3a151a4842824f73465460eeee48c2f896ab861ace119271a28fd016451801b3c41080805ee330d092083e018f2c1f1dbb993ca063549e90d198be411bd246091c4b99861b63e1e3c63457e11f8e18c01eb2eaa822c00000189c020013ae357639208440280001c43c4c3b76882052355276506489abf840d4789dd8412893410240625bed213040d804000043ce10e13c9f24c08142aad9235012187024f4475242193060ed9e6034a44944a60505d3459860810006d6b209701402646003810000820676d6825824009c0c1864daca50874102d90b3a07c19218da15db4d80e199b2325c7c84100afe1f07410084fc8e002e020b5a0c7aa8a0c022c88b48248002763daddf75a4a400a00d00004004048060d80300043b200120c41ac5765c1f127f0a0b2016e1856585860ba8639d4203169f8aee406185b97f7bb4a088842f5a0240026d981b6a0401ac14648b00006f8a3ec5e232004a048b2ec1befca0b2800007e90c1d07572cb0b0c386b3e6030c8fc73234a08008d0cb4b003c404240200dec06ba0000e95fc44e64008004000035e7498fca39d34809a23011c461d6fd21022d800de2001eaeb1c080276d85b26041c008000089906a0500a82b8a28cfe71b964920bfc3e8c204a2e926a60ba779e7432051ad73c451821b50727fc5090afae8ae2803f9dc2e8040482f9c9a06242084051e58624961518500000a8c1a48047bdca1a344290a9a1230400e1f01a2b4e469e00c1920a251b980b6ca99860c001a2b1eb69002000c619ad01edae030b00002c7ea1e5378c611e14d244b1908b3448c935aa91dc30410a131ed6861a897801d6cc015668fd3fa000578b29304cac80128120000784825808000efce932270f226900973528388ae06e162047cdbf1440041743e410043904f204c18380100001172000d9240c8040017f8610dfb056fa745b36963e406490e5e81ee449f3c912bbe941430605106492043b8dc83fab8e79a23f8872dc01549e88872dc01549e43331c51c32821011400c02aed9d7bc09e1b8144d1c967bdf409bdae643e640960e1aed33a0dfe102b8ca12b75103e55e10daa9971ef87a0cb0d27de77d757b919987370c8a0007a2419c640d22a06805000ec51a16747b4d90286d1cf41c5a48acfc2859c3d4cc2025f845c8084a3036010a14be0f85240b0c12c6f1c51c1e8ca8e188a3fd24a047520d92300ddd9d8514026882650084e303a01000014c20ce2b00c0dd0ced7dd50a16c0ec200e2cc766ee142bf0ecb61010b6e22000025201b00850c98e6e85285376a557102accb7964714cbf362a301267441c1400733a4000204c403a010000127200046c4050640cc120004fc20ca23e144e73921d6266c2ca98e00acd0836db110df6e257bfd3380fdd2be013d440a7cece08f086e051f79c901ce)) <<< 16000) + 0x8413ea443893db48fd32863a868c4ef47810299721c17828b4285769fcca1252a7c8135b978cbcf632e868a431ed6e300000fe13f3692042f25db46041fdc218ae57715471b13c054ea31a1190e67d4993ca7b3d9e1972f86f020fdac6e411492b0a9d762f1c000890c0c418ab7e2d0d8ef4aea535150106fb623b99e1a10a496f988726429daccd83c4122ded968fda1c7b1b509f882cb147bb87a101afbb1fd532af0f8ce3a4cf0000d467042938330a1c18404ae3ed03230233933ac8de202002e63be42182257152a07e3003b1b194d6028117af11c89c20080d45fb88ca000a8a517b510540f0283c2802c00010790643d03184c188140c20281a4cfadbcc51c24259559900609da3da020f1422308e8848080056ce2f5c21c052082ea1f45004c8ade1f11415bfa16c0b88084fa4bd50b8ce584c04881a63d24f3e1a60076755de7140a87739a1a500711140a812009e4e37144000559914708442b9a3f0811416572287016af27c69624008805103466694d138b4f21c644e2a45119b534a1ac6d388408238e60d14103e1ba5810451664ca2800b17e8ce8001e0080000b9181a64833a061a6009c0da867140a52605e1a50096a98b2812009e4e37144000559914708425f9e37081148dc26987016b15de916240088051034554a6a138b524c746ce2a444032d34a1d1c54c040827f385304117c46998a002bcad149c00780200002904000c9881984fcd47473714c69219961e734c24345429de1a189c68481f203005d0f2be602fc5e6e5c4704271fa2831a05ee7f632a20000080659e6d20846030f3422030b13cc0c1e0080d296e7d16b3499062742cc245bd65ec3018cbc87d09002ac468f27041e0080000a4904b010001a39b21cce4a988307019456170b1f74f47b0028710ea9bed030d03fd98d42c137d63fe205003879020d0c003e4c06e80006880e9f21092440880600003966bcc872f2f502c4c28c2492471ca18814614c0060000c8a008034000340d92fc12334324663378d41142893f790209169c2f88864026fb5391c0c11da7bce914030da77a7070043aa6fb41801ebbfa37105948c1080a0000714c099d1e6309c638806c679d3ea3843b9897418c2040f6d72d326382276d3b0d7450009a3c0641c2802291e717261803ba9715a402021d2f5aae215e881c2802c00010010200980f80f946428f1b3abd2d42b6708d8200000010875449db09a9bfda05c871070c60c30410440020050402e500200d00015e20024ee4180674402cace4060e1b25307182d66450ac7071b5807718139e08ea4500c062ebb1000077cda8000f08871a5528141e00840ca79c34cf90280f5b6e6038bd68a9bcd8e14420696c8304ddaca0dd8e0823bd83fa30201ee3055060168c49c7caa5a0508805000033c417c440bc2205d1102e04816c240b402059010001e310582d82b94c158960403305515d105118bad863db912af9c4bd91080210c30a7d8b95ece2c973d6088702ed3a5be21ec959588edd2265450103047e0917864d90dec913c24200afe69d6ae9a0364ba4d599de8101e3d7f0b43d93c631ab2eeec8000d80d6be1f4a0ef4ac16499c256543e464a8cbcae7b3a1ced72a01cf66f9ce0062d58ede492043aa3421622726375469e2a232092201002008b2c7e5f368924bafb000b029d73570a00184ac1c24081c0080000629d280482ca1455152c4034008b32fe046183601000009c384efd21c0eaf23ebc57173820ba8444e049ac49c6ad9eeaa22969722e219e3f7deca1f05609f34b8239b382363e1a468a7550e31cbee958092d9adee766475a3795896600e688d680d1123215e475798925a9711ad223b47f34e320dcd92b0bccbdbb2aef026ad33403424fa2ca4bac2c872cc81cad169494840a3204189b627e13df68322d6499e4ef9a7a5d6a78cca8dfc2eb17ddcf7d59614dc4c55680f25a1b8d46220275000053930121b7d2825c29c57668c412298f567f3564733638ecf92e090122b97dfc7670a5f2032b83e8bd2725b4a2167a5595bece2c0ca35bf9b69c9933bca33d3194c067684e9c0758aa752a768a691b1fd93d966c129ce88c563fc98962f6604b2ee024348100943073b6ad95ebd80ba756b6100599ee71e0ad45cecc6fb8374deeca49800bd0588e643c649dbc06ddb2339299b9e24c403c0acf597b17b32176b0636aa377ca9d713dd9f9ce86c4661645b3b1a21787038262a4d1cbf6246923476afc57924745fa68d3a6fe74f99fe63a4b648afb85f53c069c0a073361f7fd99f7e4f5d58eb10c18b003671404913f9c04edc62afeb200007ad20a82a0531182906c144260a00b04f0582700e8044527e88aab7408eef9886152991240e398d2015ecdbf2041cea8286ef7430a058e09f04c388958616fcb787ed7040c0ba5e292f4b973e63a8771630d17b17ae9be5680ba9f70f263b86289227aced079608764cad7c63abd2fe5a5fa2d401007640afe7502d43a473426ffa3da37bd33a1606fb3ab304770dabfe3507205d90bcc6875a49627eeda9c626588afd68ff0aa829cb5820630a78a8b701df67be4b16460b4be073a7fc2b3f3943fe937b590fbf7d0922e552a16d30432e8ad880a008022020020080140d00001b900007420243b04d05d126a331ee50891144686832580dea6026241180482b8f8732500aaf7b423802579124004e2838010a101257e6c9040fd726c40689001742049305c0c009050700200001964124440342200c0d000134104c1d82588e02802008806008023c7013e467491c00007f81459ebbf7)) <<< 16000) + 0xd040c046c94b14201443db525081e008025048000430c040040100000444000618c06004010000044404877218277096e302052ba4e020c0a2297018043bb6ad8848203c0100490d00d048030240900a000125208e4204615022828000e5080068790201180f80f6901c23bea07912cb56e4a3f7cab40f31d782cce5215bb48404702a8c91a4af49ae81169b03f86aa3c28591f458d4257c000000000000001c15e6439797a816830c3041043801800000ba2bf03e0e8b43d7f6c5a87c9830f1e5879d217991acb001eca1c5460ef2ffe5015069ad5fed730bd10734d1e225e3a3c8e44c3ed0cf2ab6af8a5dca18d4e3f0e3be12dc5393861ef4bed37878db0b2281f2f5cf241e886dd7ad9dd85e0c49d7d8184dcc0935000000000000000dcaf321cbcbd40b5853643c21e2e5ecec3d705510e5b802a93cc4396e00aa4f407f571cf3447e83249021dc6e433528714520018002088e3304bc0d91a2022cc48d2099ddd167255a1fc07110c3b486cb7a5891a32a5ff14275600cc3249f7ce35ee8c33bc4fbb4c0a685fad2cf9b1cc3fcd7fa98d17e6d5cb9738fa6f1408b90d3d427119cd673c589a08ada8d601802008802008020050040880200004c200011240485605c1b0430d82102c104178e8d0655d38db6d655db6b2b0328c91a4af49ae81169b03f86aa3c28591f458d4257c000000000000001c17ae7920f4436ebd6ceec2f0624ebec0c26e6049a8000000000000006ebdb2eb222ba0591e761ff1ef7066859ce282aa7024003803000014a00c1496dd521d39b26ac5165af7b717822c9ffa4a84672a9e3ea0823d1c3cd52f575f157cb8f615ba3b35223bd19c526a8469166d128c71bc1eddf82ad19ec1e202999883fe7f20df3f185b2191075152cb018010045743d355adc02d1923495e935d022d3607f0d547850b23e8b1a84af800000000000000385ed9759115d02caf321cbcbd40b42cb3463c028020000617dd628bace3ff622ac7719450329000e2e07e408d05bbd47257f613ae79a120a9ac8d07cc9a0dfdce0cff98a3176525000357200072841006401a2200097d207e4303315c0100401007c0303d01c03004010000044649ad06cfc388232ef24b044a3df10c0299e2b80090406c02000018a4048440782203b0d01d0680e434070120370101b0080008448009651c10e7958cb08f6dfe89754b43782e0e12d406fc18ab797ce560455a2894908eae86fe335ed36e5bb99dc228051e1f63abbc13c891da6912d974b6aec20c045fa409b55d7858f6fa1ff2d537139b778feab6c244f110800d3861092316e7523f9b6d867bfb4dd4adb7666e2d89e7ba266d24526939734f1c7ce0ce9ba3e746fb8000002716ceb4cf111fdb8b442a2b9991726d742eb9ee6a96557ee7c8ab296eeffe70b2f61704645874999701afce56744ac4aba5ba1226504ee8adaf153257375c566a0cbe0749002069f92a1d3f2b60685d78fad57bd7dc020397e382011413b4d1a9b8f93252532d61625cc33b99b5d36e21c96ef78b35edb52e5ac735010870e7e9fb5b4e8239de26e620c98698d06181bbc8ec4d582ebde4647143bca8b5d891ba345633d4a4c40004a690020a62007afa6f1a6a3f970ccd79fd85c7a10bdd74fde0a95fd29000000000000000dd264fdc6a36e2b5e7f6171e842f7546c4936b066040000000000000037517ca0807169c4d6f6074990b9c7130f825e27b2abd200000000000000000000000000000000000000000000160c40c60050010114006dbbbb17e22b3477b547fb4cf356df77b04f780b3690563b0f577a639a34210dd5a2f86ec155aa934438517aac4843fc009daffb2b83bfd550a7e22222fcf661c8a7b5bf763ed512f2d34b13c90c26cec0b5527ec1117fb0122fcb8016b579b439f2244af52e5b55bc77f8e64fdf6f07abf42db2c5fb5aa9fff314f6d455647605224a470f3606892d4a8d0007d2200939c4018b08c0c503802e4052b4368a3841a9a0242847ff38ea102c714800201414703620224c483801080b7df7150e10194bc7142987a02610392835441023b6eae080812920d80400003d880a8ec0d4271dc4dd072b1e192899a5456dd536ace5bb366c000000000000000000000000000000000000002639127cd42e2efa53912782940cb863f4d7ce9574e30c746820d19010e10a10a00800200802b1a020e25cee3b374128e74b4765935cf1e2a9903c130ed288d6cb1b9d2e3a0c6210eeaf7e65806a992f74c8613ec0a21b45a16be195d8359295254e59458b3fce8be900d27872958fb9b53b14e3321ad08c2d3804000000000000000000000000000000000000002647713741cac7864a2669515b754dab396ecd9b0000000000000000000000000000000000000009844864063044022000800000208172801006fa40349e1ca563ee6d4ec538cc86b4230b4e01000000000000000000000000000000000000000991dc4dd072b1e192899a5456dd536ace5bb366c000000000000000000000000000000000000002611421220e19210208a004000885c800401b430570223142d2383f38208892156920000012c10004c713f0400450f0c000fada508961c1c00458d0953d449189d7d188c0190161d0c00952cf42050506c011e480000d2f0712175660cf9848007da3f670ee5264fe91c18082288dc78530918f620c1070c78d1c70032dbb98718000487371c7a41088051e4800181807121bb7cc59c3956319ec706371be1d9e151373f4c3041e02a3a9c0a55384c04e083c0100001493a48a6663ace2082ea01c)) <<< 16000) + 0x690db42f7738184a5d2d10002227b8c10060237ec33040e804000046c81a02e0516a6d09513ca1238d2932694003459a68f2047c97d0110183b9304a8103532889db478501de831c87045bbb270b9a00078c0684c92004603881471a3a9a3ca1a07df69e40dd6b85880c17da79e206d741fe43c298112820e08e77bdbe7001d0080000a09814ace32c94f28451459c1a50014f0a93c85ce6ab9480e0e40310840e17a91399e144fb3750340018267b41804df0b61ea4007c0410290f634e47942152f523c80e92ffe203a2a866f840dac83df678543b4ca70c21c84a344e003a010000141200060678c077a21d3490310e7338842f9cb8348fa6c3372000a51c7249420700200001da40cc34000eca4002fcc8190080033a480071f1024110008b61001489200322840c4d600602818458a328c09084fe0080a1b2b138806977926212060e00400c02605e1302e0981682c0b00605603e203fb06f8a181dc4da081e1cee570e1455b55c8c00ad6ee884000469b58004c30380109200b01464714123c5dc6162e185dc91385b29d080024e8d00025101c00860e426e2f0246006c713903113e8410a1620552ec306120509410026a427f33020e80400a806052039216c0fada60e6c5b595202ef9480d0a104241ec0706e7b882230218d052766041d0087627245c79e1e0c0b0aed055614d90f0878b97b3b0f5c1522c82882483873072021c128030080200d0001433e12dc5393861ef4bed37876d09b2681f7627245c79e1e0c0b0aed0548b2881cd18b18704400100001c020080340a0140002f840010388002b61a146997588511fb7430c80f6106bd870029eae5c009050700200001964001d78e14d60400181d948fa23803552e382003d5df0800141c1b0040000641a208bf1748e12c5a45c8a1173dcfd84087bd5370600f6c9f384062367dd213060e004009c3404c120250901204808c140002fe4002c4881114c084a40401301f01d0c541d4b8607e0d6198a00baad3c040231c1b00800c80ec703e50671c2a0ad6df10213a33ef0023141c00858e90fc9985886a504fa484626394c405255f616204b8f3638580ab0561630025754d2004e28380100001432030220170d000115901e1980e8ac0304701401004592326f468412fff6041018295f840c21662baa848183601001c09c040040100000444000454c06004010000044406c760342b01901c040040100241b80a008020000088d808181dbf5789fcd2404f7b950b7a6b1bfe2f7159ac964b8bb758e55d637037d39c1818945c2cb541df075d97297fd6dccbcc89a1d42f3d489d37d0d57a0b86553833b0200eff79ebc24f21475633331a6e6f0ec164ddd9767fb2393f59f75490203ce5155d2b365673e928f6da470b55240ca4d8452b73680ac2e9641afec456da25086410eb000087440606402e1a01609000284101529000383191509f088480c90a4a046039110418500d66830420051832084194507002143ab6596eff192500e27091620c7f60065f0189fc45f63c7dec21433c752efb1981156d0f38a710489000dbe3ea852081d96fcf1dda0b22d4b4e76e64d6b31881d8f12ef1049eb42d4e47942499c500e01e0e45e712f022c510b340e753f0a0a4167b699ed2169d301bbe501897c2d2c06e4c8970e02100280c84498799076e98831f1ea23f295cbe1db1bca073a89a0ee6429e9a7210f4cc5988e5e058766c46895e3ecf532115ae68645a62ee2a10066f470bbdba4f611dbbb40ceaf253b2b1a0622648d0b2e815b5816400bcf8f20008777a40461836010c31352ad918041e19668a0027c6ec046103801080400802000008880006c90001902000fb04050660262a012110088680402401e0a00e050004bc90013f320041a67916a85c6703e5e511da08fdf6a21b97bdd26a00000000000000068bc68f1850183347f6c1aba5936e1d59f50c41e49000000000000001b10a18c10c08a0880860200c748565a72a8251e99a4b775838a04bbf2b0384b323c811765a2f5b4bc6af0d692d02bd2e4673af513daa20be433d9e8edeceff400b8659b0e7599f70925efaec8c164defbde28420e1ae40209ef12fd028063309fc8800784b714180458135aa20ce303c010814ed50f2038af34395010406d2b200e1f2e6568460dabb7e4628021936bd0c015b9c4680138a0e80428be504038b4e26b7b03a4c85ce38987c12f13d955e9000000000000000000000000000000000000000000000b0241040c4081862044803803008181001006d1024e25e416303c25b8a50d37d370e1230059da3e10402755218a0095cc2b6d8107801186587705c461201165179648682103e60e7d797d7163ee2c534e40402f6c4c0e004c52fe93800f0042324692bd26ba045a6c0fe1aa8f0a1647d1635095f00000000000000070261259260e58e50e604202581800010068000b790002d1201a03c31500c148430901baa5aa8b241afba05230725d24afa8b1e2c6c51600410300ed20070017d9ef83a3801100a2324692bd26ba045a6c0fe1aa8f0a1647d1635095f00000000000000070261259260e58e50e588204581800010068000b79c248a9e50b2c90029efa0c1c72814d02c7e932d7745045508ea71c0098a5fce6001e0084648d257a4d7408b4d81fc3551e142c8fa2c6a12be000000000000000e04c24b24c1cb1ca1cb10408b030000200d00016f200054e403014000b8e40028048006099000d782001dca402c640142a0091100406801c2400c1200501002008004e608018c80084400202000010028561)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 23 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoThirdsCase0" = "QuadParityTwoThirdsCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 23 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoThirdsCase0 private def zz2057:"s0809"="s0809":=by decide+kernel end section namespace Green24Proof.QuadParityTwoThirdsCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l6 l60 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x14927d0e, -0x12fb4de2, -0x1c9c30f8,0x18de80a], ![-0x12fb4de2, -0x74b0f3c9,0x15ac7ff7,0xedc5f2b], ![-0x1c9c30f8,0x15ac7ff7, -0x7c0fae45,0x133fbd1f], ![0x18de80a,0xedc5f2b,0x133fbd1f, -0x9896800]] noncomputable def hinges:Hinges:=[(-0x1a899e,l6),(0x7f93d7,l4),(-0x8d954,l10),(0x9424473,l14),(-0xf5d6de,l17),(0x23a7cbfc,l15),(-0x9896800,l27),(0x9896800,l29),(-0x9424473,l25),(0x390c2eb,l30),(0x9896800,l33),(0x8d954,l38),(-0x9896800,l35),(0x9896800,l37),(-0x7f93d7,l34),(-0x390c2eb,l43),(-0x23a7cbfc,l41),(0x9896800,l51),(0x1a899e,l60),(0xf5d6de,l62)] def normalizationDenominator:ℤ:=0x15752a00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x9896800,l27),(0x9896800,l29),(0x9896800,l33),(-0x9896800,l35),(0x9896800,l37),(0x9896800,l51),(0x9424473,l14),(-0x9424473,l25),(0x23a7cbfc,l15),(-0x23a7cbfc,l41),(0x390c2eb,l30),(-0x390c2eb,l43),(-0xf5d6de,l17),(0xf5d6de,l62),(0x7f93d7,l4),(-0x7f93d7,l34),(-0x1a899e,l6),(0x1a899e,l60),(-0x8d954,l10),(0x8d954,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xe81c401000000520a01c300c000000220c0318040000018868070c03000000150a81c601000000000a8052008000000643a0718040004c21868069003000000118701c601000000000840e200800004c421a02a0040000018828070c030000000110e06600800000000140920080000000064029004000000002e01480206304605601e4802800000882101a300c000000260c071804000000001103880200000000906066008000000842c073008000000421e039804000001c84c050c030000000d0681c601000000000240e2008000000120c031804000000001a014802003e0781080f0802000f02106809c401000000000120310040000008828030c030000000c82814601000000982901a300c000000002a0710040000001105028c0200540d02980f4802000000000340e200800000290900e1806000000250701cc020000000e8580e601000000048340e300800000002438198020000000000c0c8010000000c8a81e60100000000007032004000000140a029804000000000140c801000000541802660180000000024092008000000140a0598040000000026014802000000001100a401000000461500a300c0000002612031805420a404200335006002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x640620081842143100b8200a000000001e014802000000000281a40100000000034092008000000000a031004000000110f014c02000009c08802c602000094260900b400c00000000f004900600001a8110050c04000000c812018601800068041002630140000034088071806000000211d03cc020000000001206400800000064580530080000000005819002000001a0b404cc03000000000a812401000000064580b300800000410980a18060000002d0701cc02000000170c81c6010000000a4340a30080000004c2207180400530d02401e9004], #[]⟩ def dynamicCode : Nat := ((((((((((0x2cb14f72802ca13fc43328a7e8ecc42c8f724758288291abed287019b0232000a0b080459c40700218582c390718550980581a2c4f95519a16988060860c58ed33040dc28518020b13ad0513820e00434c8f77b8c1334b5244283773895cbd91418145033883fe62827bba8e479401039da35d4381b13d79ed428008eb720710006248f3cfc9da400900a1c5061ed34061c4ce2e31bd80a28178ebe201411da7e0c6320081a7261c01c0cdea590801600ed4057b18a0182775b71800377e61b6a481200480500001d9200079a40c42785014001ccd153bb281668698ded01342b4dc777980f4116094604434f8040821284d9227041d00840b001f68fd838b03b182dc534b27741aeff38333ccfd3d0342962bdddda1c23ec4b385f4010121cdc703811d34174bc1804ee7cc67ef090024020698000034bc2058007da3f67125d4405628416d7548d548020121cdc71c08b53dbd46800175063da1a000cd4980210007365090fa400880500003844000ed481802800149c80053d1c1d15af72143ee86af724074b6d9c400012f8ac701771edc82128a0d80400003b8c58988000004ed84e9bfda0584a20d144107083083002001001c06008036c91d47a1c6094bd8f2080c2b4775881b91847238200b1dee480c46154898106c0218675842cdda41e506bcffd443184a8bd09885512209d8349e978824a60d1e3ca0c19230188062880804689870a06060d6e0f1d7020195fad998850d120050070f280d2b3d479a2fba00bd2524403968a9b47860aee3da40c0af452a0f49a08bf204341301000062700300a902d135384001180e00006788001dd103a0500027b9c1f99ec398c09bf3b4724046bfb2438088fd6a8124101b008000062905a0500037a1a147005d08714aa3698870ce411148a09a4318c8602fca62a0500aad13c4300c1bdf901049c707002000028e403027162620000013b613a6ff681613492882c41c41042c31000400c040080378a06d0780b2c9055dbbc230530410199205046ba28a1458d60db5a304293d06122c1325af4261400729b9601000abb5b64920040018b2400004f1a061013cbea69f3070dca2c08a9028cc180033060c5f487230018630708f9300c201dcf772a1608103071d501069fd1a6dd9692004a0400001e02074020003be384401eb881839583e14182a20981b8c1c13d4129200818c9f8e00451926813060e004000045ce922acb51a243eb7aafeca2052c48d7b871c6debd96271b90b22dbfbd0b3ee1c40e026ac06fde1d36ac586c2b69681d3c1eb0e884088a8ec8eb4be651f2e880093c495b558a92027104029620c1914df67cb8c10ae462ae59a0211c2b1c50aa7d3832c9126a2e7460ae9fd2b6481437d9a6d0a2e31fed32304150454a4582aab0f4d8500438c144080126a125492003e018e245f195fa059200004650387586507db1029c33310fc80c3f62770a1864d79b24c2c131d02fde820da33e789000066ff70a94900210140000dc903a010001c71c21694058983d138e8a30) <<< 16000) + 0x5b93bf2e307e55fa74900c874878e00b4976c0260c1b00800008890007bb342b1aa3ce100fa2d76908091db21d0a039677b78604c0ef8900928a0e00400003cc82b888164340b00a000f19342bdb260f1c5bab432a285ba905f480131dee184052864c00094406c02142b95dc1e102dbd84f28e1a5236618a10cc6b91940a4aab790c077278f90a0227aeb50600d13a6600d0203801000016920ae1b00c05d0c2fe4adc50b08e196a38a7e6b082284c9da69010087075a400128c0e00428648a8c11142a8fb41bc814c9d7f5a38a4f566461420922226920003110f46025003320180326cde0004a060740200002ea4000a1480908815824000ac8415447c2564a1f9ae58b3263a005670fe3a034fcf6c1c868e74204e43863f185ccd3dee4d6384888064a93d1e2830a580204a35789f8ea9702ffd509f6c8b49df02f6fa9b04f2b0201a82dd90a2e81347b416052b9f0fc5361d04bfef2ca0d406def70955bcf9e94d0b95f9945cd2d0d18c48050c055b05cdc15f749c7c9a17a84e51f743446bddc1f930f4aaa31a62e3a275343d6b43d6c85d4daf7a81f154fe33ea29d0f88c051f63fe12faeeea31ece3a313be0b07b2fc75902eaafa5efa8281080a7e7e3b8330ab2400003211c204efa26ff1811ea7596471010ae0b43ad0c10e1382952180135722e6d14088d858cc61003a30432aa50032120128114a0daff04a074b9a1200e000075882a1a814c260a40a0510140d2cef1a2d987091184676d70c13893245ea2142216773496c4002cc19a84f87015c9c8a17e8a0088e935ba114585d6764675010d598feaeb8c7282702879ac351573a0c2c1ce8054e9a48bffb1efb3091ae92b3f479000ed7552891c004032cf14109dfab21b0812d29d7950681f2111db0a44801180e3cc1f9c77b0d29379ccd634994249500c24571a96310113d1d1e890024cab5f140006f5eba7001e0080000a39f34a4b0c2160c2c25bc0f5c4d242029cd16cc242d20d1098f2000ed7552891c002019678a08361533c6c3085d2032d40d0211f0263ca44801200e3cd038369809e6052a00270d29bb735254693739b3e67309289fb5438208d7dac63090027ef06fc280041a4a42a4001080a00006308001be903009f1879addc08ece590145200e9dc060423de91a925648401b6bba2bc03840101a8a2da0582859a1b724523020c8462d516e20202df4e8aaf66012ed7c836ff24e209042c03c503c03091973d2e5df8fa0a4517770c4f83aba2f6efce80000000000000001e9458d9758179fad24daba82a471861261059058230240020060100401a0003c440e804000874687a5cc614e8a1b89f9f7ba2460d7660fd0610021b1d7424206b7d5e10208ba332690100024421bb4200749325ea00024be1ddd8424910220180000e59b25b7eca1ff1233cb1bd249245904d2f4922880f917e71080529662f1a0608c2a7500428090f8377803802b8bcf25040182deb145220508c0700003966441304f51a890256f6e87d3471020a408d203841a1a96b661c11ceb6da0514001158f86585003fb7e4ac61803b2a92c38100c00e8fa715440c12810000078081084c0800764d861da5810a1478f622f5048a8e4ccf20814401167003d86181b2e332386082b356909618060436889a10006db8a8f481ed15f48ac871c2502048bbef3e9c902cb893926808143b08915c8b0e46338480c204169692cfafcbe2932814305f731b38498f9d6b6301863d3634efa75a891062ac600a409c0016b1229ee1000801e2c712d912c79a035085cb5f578ccbfc71867844094ca5861f4061c4f0cc0001901a23304b13e24611063f64911247c09d20464ddcf3471043670b5183046a8284208dd201ec14021ff20244018d4c2580a0807802000033e4001b2c800c041c36168c739860c60c4e8c428489e8dee9141a3f194c68e003e2c4190602c84d432c28001c143365442747a30c40b4e584202000019420a04b04f218270ec0846609a2b8143ef32c5d2ee3052aed3a38a2118ede4eaaac08fad1bdf2200671545474c10d4b8d35f7a381a24fcd1f2af3c8a487eea0500bfad11f0a52930296159704011a875e2312d3916aa255704055a37b31d8b47a50d3294b2b00ce2ac60e880f993b2efa7e93dc3a9de86fdd463c570f06036c425000aacdc51000b80420000200800002220980ba039d5f584800eb87108820640200000de6018020080000223020b2c0ec10111974011607a7e59708009d477d84026c4f4608ca20380100000f120962204a0d82484c1201608e0b04601e12f61bc2501da26530606aadec420462834010e10dc37acb0d1cfc908086ff5d8e059780148036fd8b0025101800860c6a6e31141e48c778b00398db204024319909010680210040100400001118020080201140400006e6010020080440500001b900019b200052640406744854046a942380cf86980cbfe2131209850aab0c08a1d4cc040edb72f814019a61b90e0087d73f814060e00428400115a3101abe3af4081e7c68fd0230c1c00800004f90410900d048030140004c0410c560601381ba51250702281b6a044183201080000802280d12c670800b8040000110c0000401140681a4110016004000021100007f208412000130324c2d116272daabf33ed62487c83f8702d2f1c93824b08b4c6936a9d4c3ee19c6e076f92b21a1c85c0c74b0769460c241905bfe2d72ea2ef5007d61bc19026d78b367625209285c28fc23973637152a559fe90651127c858365cd4252380c5d5b823baa25ac81bc5571c79027ea002d37)) <<< 16000) + 0x188260045d9dd2969880d1ac9d724ed9c0cca521a9a170be3ecd4083b9a60dd35781764a8e285dbca1eb5526346f1d0bd7bfffda44f56310604119b34bc92fc282a416b50f9047c7534b5e40b70c5e92d307921ed0a56e83d5782a8d51ceb50c99236901b3ec05d00f4cc87c2e7af51378933116753c00039b101015e1860f9b4282e5113b02848daa1c420400296594041b00458a26ac2184069629cda3863879af22850a6e0a24001c4a5a4181326a86a4c083801000011334235e9b371c2975a77a3048e8db584078f8f3d0e020d6e09094206c0200001d04104240340a00c0500019610401901f8680f81400194e4004b1481088c08007822a06774c2057f187de1b8429ad87843a134ac52060df738533f6af379e3ce2229fbe18c81365038095b909ce45c904ea6db03353ccb1a94fea1342a3d07c35ad17afdd6e5d190a6a2e24fa8d84b60300e0006fe6462c6d20ffa5d3a2dd6e4012cd8a2ff179a29907ee3e6aa1232375cb03ed7037ac6802829f4076c96d5b23d3c475488a52aac36645ed0877f96fc376eab3512f75834289ab50ef66ac6bd8cf553bb56aac804c1108f77fb11ca1e4bba9742e8225e91674da353c8cb9103dd5a4afbf4f16f17ca18fee714ae01e6027648ad47b9f76ca28cf6989e8ac4c1872cc156c52fbe9408688331334645175cd3b40d05daa6560b022b11ba88002a8f42c090307002186811ad401c10092276480023f047211840e80438f07b5f6e240044477e91020e804200802008000022200016240005ac80808c0b02607a1303c05e37a028edc5f2b4b2d5b929808eac03c9b4659faf6bac845166e0a1458d9758179fad24daba82a7f53e653d2d265421ad460aa1e64f6f3243ee1e64f6f3243f07782316eca4092fe196a142d2686aa48a70240030001221f484e4365efe77d349b32fe8e3d75dc359860f596d25fe53e85126f6876c6e8145b1556768bc628ba7c9cd4e8efbeeeaac15b4789170bcbf0721602099247e833f6d8d0b1906661054bd16b01001004596ef262b1a313946de48c5eb62a1e0220716a5014439f99002988624013080d00400004348000a5103b1101d048001a9481c8cc0c437004010045978161f04d0d58b18f12002f7f9326083600800009734572dbaad18124d6c1590007d62d4846103801000009d324b95d235160d5881b71a03cd66418e001ab23c8c005e8e72012860e00400003bc8080680e03406e120360901a8480d00406602000329200199c7042bae6cc388709d1ccabafdf340841506d2aa8410da2c132ba2ed23309579f613caf822f5a4582803d79fe935dc27ef2060027bc743ee9d680140200fdb90743d6222e210f776146dc9918d6197e08090e843c6ab6a502855658601329b2a6cab502827510472a016cf3ac3f59d095c6d04f797d0c434c5ee022a431718a657f64b62569d1e408314c1fb60d6f1cc4aadb48f25d9c96190d2487700009ba400654c8017c01818734e8f9342c92787188bdcf7cc870dde657b7c500af734a2f74a1830130760e094a4e808cd5968b8c377500fe7bf282c5fead7d8170b6990a00cb71988127a7c4f1021d411b0a4cceb49a3112b5f95cbedfd004100800c7ced07d260ed0b230f06f8d9dbf2cbc454f3c3364b8fd382cd3e228281f72004368ce7b7aa4f1f06ede2cb25c136624ea11665c2330de17065b032596da4a23070524e414e4dc8261fd43579639b6316358d790b92384e2394589a567d4045d886e6b0eaefecfbbc4148471aff1ab00b5060b3cfacc732a81b30e516561bd74d029aca4c346faa8440da2f40003909003a50200ad2c60427bedb52025e89a641424a313570816643724100d49a63808002f2cc9105261c1c0084050c6010050acea041040ede9e5e1c07265d1c08169b815441094706c0200001e44050560641381026d9e5c809b931b3c7081285de85097602eac500412f780403356fde8100c384ee040509c907002121000023280c122fa5ff1900c9d9aa77880060d41bb020166a51e5800677a7a52808053101000828400006ddd04881cbd33878710728c68b70e1cc0880a8a1402293478d21012613d40b0443e98608c0818603bce9050bbca0cc08151649751603b21c3e1405d19a7610001333c84098506c021c4000015f90164000d1669a1a319c417b809a1a1a14050d9c13a81741778a109b7003781a0cc10c7bee1600078c068419100848040e200a000e668c9b1ea0a3434dccb811c16f261c1c508434f80668369b8ef026041d00800008c9c20670a3a8d1cc87c050c1f700e73cd062b1c448700299664c100456d75866081c00800008a903105f92c0ef38401848014f0a9070e20d2419914185e26420e386c5c3fd3d881a3418e3ee705c04465bf0c0934c28c666000304cf68509002201c7929aaf20b3890191c269c388e335a870da08d1542065b303e2382a5a75bd8c08f4a112a7001d0080000a01f263753aace1f102f5f0a0c99335e840e7842a14e0b0bade40e004bbee70c000bc10f0300c3fa7368001c008792a127d643c64d4810f141842752a070d3a7f61a20667341e8382b414b0c06104ac50d42000000d614000e80400005a48001729d367ccbc58d2c03f4720d2010b401cc2010bab84d1ca413390c1fce2dfbc700272108127081c00800009e90300d0003c61000bc920019f0409024001cea4003f2c800898902f2d80180a8809b85dd14218164958a0c2d4191070060771862800e5952b25041d00861408b0874306385077c182800d76704087e4dbb45000ca7b112800e80430a00a)) <<< 16000) + 0x364640601c02b43069d668de305b410e4810201b96bb2800e00400003a08000f8102e0581682c0b0160160302b01f108837e7840d687519870a31fd0d49006b6cd24600138f390025101c00858cdc1e59838abd8d29048947aab78182fd7e31e40006406d02007d96b293000e0042c6003a60649182225a79205002377f8614130e7711452fe7fd28513f9fba0c0c10024c61e7001e0080000a3902a0181480e870018d9be11aae2071dddb509867d4346024248c5de0642c63131ec8c6b1191c63d3c25c480ffd1c38f85d939b61242820091d8ed5496f182d1a4bf22d18852800053ab2923250ca65249003406050e000ac8620731ad1dd9a3000ac85cb18c69ee6a38c9fee52c1c3e23822b0c1711c115a7001d0080000a01e30f4a86e860a05108401428a1c408430a46fc2ea0c14085b78c48201bdffb0a0ae13198448000d3fa894020f00400005c8d10000ed0f143802ad03638c49873c5182801978c450a4968ae10c1459634e13000f00434a021448d4718951db5d305049d4f94a148a947e818287ad0b4c3040ce9b762c000d74a7a7001e0080000a390280500014a100080e200158c6030c0e54818315959570c28c06cfa201945676b1816d06f00140161e17e0026141c00800008d9e3000cbb0c48800da39c0e203c7863e206868e3a1861df7787c028400464628811a03fb013800f00438c15271ad84885a6768b230604c8de5c206a8f3ed782844df14d702052424961640006466bfc1804a7f6fd94800200140000c19c285af4fb101a0bb19b8c187d5f048a100de88a06131bf965880974a170860f6c66a08a0047c39514020e00400005888138480981404a0a0240500025a90011d72046430222101084c08007639ebeb0e1c2fc2ce0e2042e70bb060581ef808c01103c91094206c0218406951b4901c90ac098e106ba9300e006f1fb612020e0043080037a2914500c7014203a4c2b5914300b79c72c20013a6125041c00800007590001c920361b01f0580c80e020004da11c299550dd081c1449350230c1c00858ee004a92588154cf864847936b1c40558f4fd8384276b35a204be90f8658066c62fc30021e8dc60501838010000167202c1201505000125901e1180e86c0302745080bed040ac6bf171c04d2f94423081a00871e3519121840496ac890027801f9800d0022000020080000223c78d2e1846101325b324009dfad66003400880000802000008880006710001b7203813c1f125df6480dbb66bc6003974048046203601000009c20362b01a0d80c80e0100200801805c0100401002e0380200802286045b497143055b497182a32722b2800355f0424041c008000061900010020002a464437cf991c3121ad430253744e24165a3421c0dc89c3009440600200001ba708e91b770c1391f008b039df6ec0c0dc5e7444090506802000018240585402a120003a220284200074532383eecdac914962c648406431df9d1c033e8b108c041355ad450073b5c94a33080e804201802008b0278c2166bf892c595a0621bf995eff7bf0e87fe83aae451fe66a0af515ea58f8e500a9ca92523924f6b1b0c15d6ec32936d3c7708010004912a3ad168483dbbb020fcb44391f8287812d762ba979694ee56228b985831040c62b5888219e4dc493d4ee4b0deeb22e531188003c4dc3d0573143ef7127f6f6eddf1fcd092934a80f981edddeb1df06cfce9289840e72df7f44f996536fbd8d757df5c7e30a0b1069a2c76b12092ceb50f7c5ddfa6116cab360f2b84e7268216154afbae0c598644649ff31f67957b2d56b90495c4d36e12570104d331a200002008c0a351a0000824164002a00800006020260a0000b22000f0e4001f108090ac044440201a00f09007028034140012f84005a9c80163599bce086945cc64df650089f961a1d59f50c41e49000000000000001b407cec1e3b368000fc5cb3d3c893b51820554d5661ac00000000000000000000000000000000000000000000ae428630430228220218080ef3689b459a4b4a8411f0d2fded982f89c210fe88a382e9539865371197f27384db21b7b03a2d6745f159660fd6a9c45f73589dcb2dac7da4d50675bb94b7f49c63eba08682c9113f4c32608a5c24654ee743059e35b8e0a106eb54a4082c07667b0a01a4632f620018de80a06014e439f488ce283c010e3cf911f11e838a288da20958e1b9c903b0da306021db755106080d50448924001bd7c89738a001163f9d668990e204c040a2898a90bb8927dc47eaa091c1b2c5d64a140c6f405091540985bf4814016768f820802755218400203eaf29a0108002165946ad6481457927f938164009c6ff2144010ba3b0163055fb6419431bbe29a18c001511d0cce0040010e0e58238b72d3cd1707718d96c0bb081289e6eec148000000000000001c89441631231610a110094002060000401a0002e64000b8c80600ecb2950d4c828af1e34c462c8012e27e0288021f45b72c60ae0bf2828637608f1518002a070219c0080021443c0790f5cb19070c1c7a50c11331bce24601c1433610104621806ca03ff55048410052e78d5aa3801080a000057cd15228a68c9c5900a1ea09e85100024cd8ec58c06db9861650c461076c22202065d6ee483000321f551b470024014510efda608d2c6427c031114304233371c91807050cd84041203b2bd280ff915dd704014f78ca768e004202800015f20005dc402c14000bda4002a788006229000db020142a0091100406801c2400c1200501002008004d888018c8008440020200001002a119)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoThirdsCase1" = "QuadParityTwoThirdsCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoThirdsCase1 private def zz2058:"s080a"="s080a":=by decide+kernel end section namespace Green24Proof.QuadParityTwoThirdsCase2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l41 l43 l44 l46 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x57e65eb, -0x39385d4, -0x3d40e8c,0xadb977], ![-0x39385d4, -0x23530d2f,0x6a3a6f7,0x1e67f26], ![-0x3d40e8c,0x6a3a6f7, -0x17beff90,0x3b38cb0], ![0xadb977,0x1e67f26,0x3b38cb0, -0x1c9c380]] noncomputable def hinges:Hinges:=[(-0x100242,l4),(0x100242,l10),(0xfb0caf,l12),(0x139e37,l17),(0x496abc5,l15),(-0x1c9c380,l27),(0x1c9c380,l29),(-0x19c6cc,l25),(0xd0c0b0,l30),(0x1c9c380,l33),(-0x1c9c380,l35),(0x1c9c380,l37),(-0x54a009,l43),(-0x4db2ef4,l41),(-0x19c6cc,l46),(0xfb0caf,l44),(0x1c9c380,l51),(-0x54a009,l62)] def normalizationDenominator:ℤ:=0x3938700 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1c9c380,l27),(0x1c9c380,l29),(0x1c9c380,l33),(-0x1c9c380,l35),(0x1c9c380,l37),(0x1c9c380,l51),(-0x4db2ef4,l41),(0x496abc5,l15),(0xd0c0b0,l30),(-0x54a009,l43),(-0x54a009,l62),(0xfb0caf,l12),(0xfb0caf,l44),(-0x19c6cc,l25),(-0x19c6cc,l46),(0x139e37,l17),(0x100242,l10),(-0x100242,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x290a44204880183c82282d018c40140000003c120298040000000d0a03cc0200000a4240026602000000000580520080000002c2403980400000000b0024803000000006c012401800000640900c300c000340208013180a000001a044038c0300000000026064008000000742806300800092420980b20060000000121c0cc0100000000f1a066008000c82209022400c00000004c88198020000000f0b028c020000000d0381c60100000a86414054008000a8320581520060002a1102c079003000000c8160546018000000068303300400000005ca81980200000000090348020000000000e0640080000003c140d3008000000003a0710040073108320259004000000d05203c601800000074180e3008000000003a031004000000191503cc02000000000f00a40100000003c1c0a30080000000034029004000310c844035003001e0420d01388020000000002406200800098290500d20060000001506038c02000000001700a401000084380b036400c000000000a0310040000000d0903cc0200000c60c8044602000000000540e2008000000004c0290040000000015018802000000001900a401000000044180630080000000141819803420a404200335006002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802,0x110f014c02000000881201c601800094260900b400c00000000f00490060000000003c0c8010000000e8d01e601000000000a805200800054240580f20060000000d06018c02], #[]⟩ def dynamicCode : Nat := (((((((0xd70b16f18e828296746b8a3980643c0d61e07aa02275b879415230a28a2892c82882c50c0000c000080368ae4a8b161449cef26dcb23701d4d851007267e92c521fd4db04080002ee0b00e460e314e003a0200001422016039260f304462015f8724829edf8442e9e930c1c00007ff3f5f2942879626a8e5be87110a10f8a0feadd84aea2403dd20389d42c5b4028023f2d2a35f2da5f819e6083a080000110981c4cfe161630594b4b2468e4c91c40c4430f1890cbdcde20e0037453f180082b34ca4e1836010000138201813e3db00928589653d36e90d34c46050a4877075ace02242982704672a902c69c431bcf59c3340ea689e9ba38a73a45adc3f0bb265699d90f08080025ea38d86169afb3e96b23452100747db3a0c0cd135d574d1e6a78a32d231b92acaf599eda861466134000190900d15e198f1d60c6b185e712280000e8b2d92d3018500c8e0300eca7343891b29f3ed5662b3c610955ea787d3cfdb0e097366894073275a011034a94aa35636716348e5321870ec21000046478a38bb24c00a21c29634ce40646bbdc168c1d7834412e2866105422b8a08d2a182183807693cd16080235dbe95400097d513408016ff225144820220240000f590110de11aca1ae1570d8b01667eb22b953e78862fe936054861870c40c708408205025ccf83b35470b8f3592b28afb97e4228ab7688fac47471bf2834986cf8310a4a2a31d5ba53f700b098a1c058a0004c470416a025e41e1840c24e5717e3023f36b738d6182455e4238363003939c5c0282811b5d813860200f489dff68c0088523903fc3435c345b73d4d994e58500700001fe20905a0471d8230281140503779783ff58e1739a4933f0c16ec60db728a11a90ac79f100276bd27970e03b3bcf76f8a00bdaaa1eda20d98aae4064c0747dbe55527202402c596bd398538612939539c66112486b5fa59033dcb1f858c5674bc306063e2959c8186120484806004cf3b5f03800300888124801000c38c18a3d8e716974cd04b2dd3c0e91849d85b6e249089fb20611e84042cb20d0f84b900065adc4a0006c0200002b26899420cb5982061bd74f4981c6359ae03b01c5221779b280827826ab65834000d73aada2006b42a03d51c0dbefd422108041dd6cf689489002403002200c0007c0c915788a2512300614cb438a471722d8c2a958b1fa282415ae8b8209578adbc4002a26b1f0e045bca44e3017050ef1d24007805008603042010000e41c2516992e5f4308cef28d818091c1da3e014e1860ddc7d41f0a0c3c668619d2030018069d3430c6582485040c117f587c010c01d4e916570e10900260307184f4b4c4e2d49ae8b98467d05472c8246e2e07061197f84a0004c95b1000ae9a3c9c006c020000264708d650d70ab86c580b09a59a51449639438e29a01003804010068000699c2a47b6c1502480207b9280b18beb39c91286a6a5f78249187df15e1a301002362da8c008ccddf851c00f7642b4932202088080000336400177881f84e882312d785013bb12669029e4f7c68c47b2f89689106d193b2ee70a1e7f84092db179ec15a033d311c124d6dc3f268289a850c00b83cb47afc0807cf01001f3c511e425584e8c00015154237a491a2cea1efb9c74d238a228560000b4080b02f880028a6d8308e773dc66289d9d087023868a4c8540186e844e3403055da1793a285de153e462008b57acd40010c48f0098120040040c228788398e2897c26e5ca861ce200bec0304ef8946fd8a14223cc8d2104440f7bca080b495d11602804dcb0af40001a80aa7992048011014000071882082c1001407e0b0110500800f0a325b4056a6fe088f608a1cd6829fb4c05f8289b72c61a3892dd73d9e560ac0a1a7fac506410c105ba7f24609921142da859971dd070c1c9322d4ab42d4ef501003df76c7538f321bcff002516355a5d0dc71e78a64af79c98e91c312830164035bb7e240e07fafb6f9630bdcc1f8a8f763c0aec94342ae0ca49dab870630c123045054a7c662a9535d81828870ff3943304b1b5f8082055984aeef96ea3e8a40e0299f3f40c5f738a827c20fd23ba8a16e43a38ac513b503a96ed4386260640000c2ce153572f316959d13497b2872d63c4cc374a9478991633af933a6a25c67cf130a1ba55d07b9d80f01a15e48c06478a11ea42b8d3243032468f017ad24c656b20804d80dee7bf90ba3195001ef7c5815b6748ffc545b0555abeb3386248602c661768052d3da9dda6b394361bb136c198b8609956491836f8d108e92e78e77e060a358fbeaede6aee51b401043530fa14518ab55f778180291d4cf1acaa2437ec687018d1fe728fbe26c0685a86a822e1c9dc216c8ba0bb434f95e6518386268660000c50800310101b050006379001086200418440f88723a2a78e932461ce6a25a38c098b84dc8143231fe11024b2c5b982433afa74ba38406902e043042332eb780020830bcca9001f0104) <<< 16000) + 0x8ebdae870a48865de0ed04860cf2f0b6407103ad7cc384313bc5e83821b24fa982801e20faf008042bc30614800200140000c2103d0580682e47088e15d1032f21e0b8814d9148363885604b40104026260e101bd20903c70ab7071f40815b8344a40000321120307403000031a647341a28d00918199b28bc2067f0499cc0814bfb7cff520397396c9ec70a7705202010125257f0c060042af5e7c0409dc120301889042202040d8d68f07c8150d49256882017d651c2032a3873423876e255f7880a21479ac8e100005dc01016293e6ec28000005dc0a4820f80a00006a481e04c0641400076a40ec04074020390101c0080dc040012a040d8b606a530161181a08e8889364e763cf7ed893a840c0fff2e93e66103036b100269827a95682be4ce6c1c05cb94eba396958b0ba22809ba78e8948429d8393820063967a2e7015fc175100802546bfe3c276443368523e1e3d5f0023f5c0bf5c6b53d6a69c7e67099b29090d945210218d12c3218190040066030885eb1802e314051800d00400cc0543802b48cd16c79e965082ac1e728321a4baa0011a564a5001900850e006ac7344e8b95314180bcd9c5041c2a2c20215f2149400640200001b4400073cd8619004c58527227a4046b409c40229055e12040c00400002d4d03e35bf6382129cda10069bae604c30600100001244074460641380000802200e8f13e100160080000219024014044492681050294e0c035b7824230818008000048103105c045672a8204375b3088205c0200480ac1b29d1e48a6480f1022d7229e026ff68a010f3032800a804306f5287923008d786008ec651800a804000021081182c0c00600031e40008a480e868000eb88178ac0b857012318b2285570310a039340e22011900b0040070040001586435dfb20d5f98904ae62a7b2e6103a7d203023f7eeec85c2c99eb38c75194c9caa7382c287e7be7a6b57c142402c5298822fe9ae14203855191219f1c1fa41c593d97c91344300014e38421e5c0657c58e80cc6fedcc2c240555af6dda00b7f3208bb74d141a052f01421aa241b96dcdc1ecb3b38afb1e8fcd1ad9079f26136a44ce932b52e5e30a400ce2841d7280440d232ea10c096c3cb48c106802005a03d3ceb5c0000001369335662c47fc0e5097b1e668b032df2d34402b0447c2e530fcc5097e415a58ee6f4a99a84b22d9c000000000000001bc00ba6ab56f42258c59ebe4ef0237ddfcc0000000000005a8911ee68911ee5e6cd72ca2860cde0ea9420818c008015b9a688adbf7611b99cead43676c81fac912a1cd00e064c5e13b7070513315a367ecfe16cffe69e7772e8bd826b2c9cc3bc8b8e77dd24caaae2da5d781155f3f6fb712220754cd3d11e9f9939a74de08fb76d5b650256947a000be640b02403a0a0006e220262380a3aab6628a743bb4556da8347f6abf24d96b46cf9c24758348cd5803180b5d1b288094824c35d7934c90f6003b828c8d8ba6edcd09bf24327a958f052cf53f9cee7940813d7ad2acb4d0ed97cc9410349d36e7a3f777c8c20af2b46f9e8293027540a054e2803c522cd01f7a73e8589f5aa7359ed5ab7b0cf87cf839b2e515af3f1f8bdd41ed0411066200c60756053103e0c96e83ea73b361e6450341381fda95e885aa5121fd503145984ad174b0c1a22b58d4b123dfddc4c3b680c560f8abcf01e22bb0f81740aaa05b66d7f158bec1dbb1c8df2976aa92998e7da2f0211086379ec00e3c8320675801c010003b690110980d848004c7080b06e87b90c9e8413c29d00b001c934e20037b6260c0352cd204a1032010802008022097362e93030676f010001a7c9660032008800008020000088800065900010820561b02a0981484c0a02404e130110900802c09807816723538041076cd8d07a95321fe89ba02142f7b280646c79f479b1d8e128b02e1f00b4c73c89b21ce9bb939a4751810edfebf1446e25991175df51a59e480384cad46386ce48f46d3d7056cc95fb9f2b1dcbb46c3245e06760c5f1c51005e43c1334a7115ed0f94ef85480c0ebc8186d4ba13f79bc6ca653479a2202100a7d60aaf50660672243a71c024a585239a95698a47f6e794888e203aa0f6bf6d2d3f58e2f6579e8c244b8fafc54c11033a144e128e09e9f20e769aa2cb121088050c071a63440600b59f0a01526f3224041b00801280ecb93d7b707041715b93c004b0034400911cad190206802000017a4090258670a59e04101d54bc2048c73bf181a6295d960054add06000f7b873000c80430c45c99f163010f5586066d614b1800c8040000240d972c18c61a089df6ca7800dd4e60800ab83d2c808340100000bb2046130220580015519261c207924476bc7aa4e989ee13a566e50e7c37095ffa7ad3993199de651e4d13405b0dcd7887cec7f0c7e90c68cff6af3c361db26f72fee59de153bfa09271f548000aa517c1c5e12b1b8f9430ea8c79a2d94aa48965fd2ea9468276f85dfcc41600ed68924b32f8ab0e0913a1298a83e77b31fbfb2e76b7b7203701c8d639ca1a49982b161818c13f02034625da788ce7cf30a5626212bd0c97f9416914c53e8e20000a2e40743400139a404c670298fb436f66e4066e0d0d5c71cd71532de8d38a46881e19132bbdee6d5374b48da2ade5f60bff3f601474702050099f61db530c78f29a0d7af9fd06f96565e3942be0c4d18e1e2e7cc9981f7be9c04cd742134a1fd04f4d080d0bb295237bf3a3bd245f02ba49833bda1d948e87c6bb18fcd03ee09414a9b542128c990822276ca6c92ab60b1d42b76c153)) <<< 16000) + 0xbc37a683e1a7c839c5b2937fa8291502918000cdc33f8609adfaff45ba70929358eada9d6177daab66f2588b03128601c004ddff081b02fa15ee8867736cd0315a79ad84c61b0b5736ae6edfd1e222801797fa1d00932ce0001a7d38a8a06cf8e70aa1aa4b83d434b117820670c019152883dc3534f21522d1fbd6b83fba582053db566e382725c251d98d428e71aa03027af4810de8db021d20139b48aae70c13f4df1f32a408eb34c0002de90210d01006807c1403c0a01d0580e00800290c80d86800690c800e83900396130917d47df1a174b6f9f874b492bde87ba800000000000017ac90e5ed921cbe4e1c03f00000000391a8335462f04cb2f200fdf07b95b6141c106b567000000000000000000000000000000000000000002898818608c00a002020095ced79c92fccafb8411351cbabc11338a70787424f7819ae1ed4af4aed9fa5cf7c2666a87b25f5bf9a0068aa6e1935780198249ecc9ec1d4658f1e7e4fdae5ff030ff6a1a2e67c714519cd8436aed5eaea6a8e98d01a010002c9100427e200de386040fb288e13e5dfda464658080a4547255ed8a3cd5e8298c1c29227be07f92352c1f0989850a90c84d7d3a15ce351c8440c1051ad370a1ba0ee93d29f04015a006a8bd6832d62ab53208098c346ed569cc6c19497b85144b54b14c4cd8fe4057864d1f25418dadd74b1c61583e133c72780ec33269ceae7a6fae6049161100000000000000000000000000000000002189041010e10a10208e0020024d64e32ffbc85a1dec89236366245e015eaf5d35dc616444a0004704064170418652d68dd2e840c00d0984f38391017063c8bff2380385fb6792737a480a1235c1f0baa600200b1100b2112750403f89603c59b96081d95e98890fa58a24821ca91dde85c1f44840c19034202000022119cdafb688fdc497a51eed2aeb893219e689360e14d2c5029cbd99ff01e93b071415cfe254fbe282c570d4450800008846736beda23f7125e947bb4abae24c8679a24d83804bc55ecd6cb3d112afc8d25ac24f2bdde1dab3c15c936040000e32015b3e163bf11e9da22382737792a357563d691c8263d329f6157fb86d113a425a166e96d041511c229a05d769a07ca70c1342e27155a3c8a0b20327fbcb2892ddd12715eb466e12934760879e027de5b6b31d789062d49b0000bd24000240011004060440040281154301e203d21fc10c11aae3c88012c93a4100907064021023b36a86bc44262a5cae90520a10aa805ffce5d141f7a62cf7d1ad99ad0788b78e421db7f1adee40202e4d548d5983b15b1b869057e8e99cf1879f5288027063d9ed9e9018794f9ae70e09b2f564c0001840184ae58613b95d81d9d0f0389183088b0d2921040211aa7327cacc9ade0cdab7c64e8ecb1fd7373577b82e213d83c68a971cab298f6775251c971fc00023910171d00b04e86a17ceb20133d00d181b42be323041800858f618a1a1c202bb318810635e8c20481c14848027dbcb1007262214c0032010b1c576936385229e600c0040416c60032010000090200035440382601a0b0150580a02f0e0b624e3d4e3a5d7f3c202af70c4f9fdb3da64bad42d325876518baef2b3f292aaf93db892bf000b541757a41229f49cde27345666cdce9b44482f7792756de16091bbf73feb4a89ce7aa3f9d78e3e599b3376769f05801d905b7f1c2e69ccceb19141a05f3f2d82de2e95a3dbb7252b80911113447840200401002603a0c3fdc1720007a1bd820265f65f0630c1a00800004c90000eb2024220004d220221201005e08149f731034b43c3900e6a3ed0c0013b0325000cefb614009ccd74c0032010c1008cea62864534da10344b165100dbe7b4e4001900800005a98089eca3420465362a0c23b5eb00a003c6f64203c09dd0ca08320100000dc201e0be092c01c045667dd019794f128bae683c345a2d28e18f4ef645546055265ef98ed42ac201e1865fffd63ad1658c6aa50752028ef8c102ca0a56d8b034bd02dee696cbb171b3a1e852d72f19d3e46a592806417b1896bf05454f98655838dc4e2ed19fefcd6fef9a726ca8c2ea3b5c4b6e61e9513cddd63ccfed51b4b2bfa7249936b1d0ab13cd44c81730f58abdc9434178d9693062ecca473b12066496200013c880708c034360180ae30448d7b40abaa5dac705bb772048f9489101f04c0c95eb0623f02eb65fb6f54296205696ddddd484abfdc4b1cdb6ce3eb50cf7791ad4deea8741e8be6456458e8e190050488d5d5c2313aa7ce800a04cdbc4369b45f283dbba02e52641a4b367ccd89a02112221a5a07d9379b8d7899f42e039e9881a0f8862b29f2aa40fbf03deda00fd7a34c768082a9984291184d3d1e0213683c042c0359defbedf3c76b18a3110039c480afb9a8403c77fd844102e01000b01c02004011001c4c422010850e844102c010000069200014c400050480508ac38137f72c1701492181217b48200c1915e009040600218157220a38537d90011060b0042481638a080c2bf552c2b7f16c806ffc81140a31788650816008716bd285204a32fdc804c12041c126cdd0802a1d1a094205802000019c40006e080011f100a0500019390009e420121200123b200342a4007ea8d17dc7509a143003b9d94604000025814142c5bb5c40400002580800a94f0b50166181e00861800c013a2705174160e68e5860c00002db07c50c1399d9feb4504f223696acc40400001b8d84100000009117c117e838c14016000068480402801c1400c0200501002008000d3480192800854002020000100190d9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoThirdsCase2" = "QuadParityTwoThirdsCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoThirdsCase2 private def zz2059:"s080b"="s080b":=by decide+kernel end section namespace Green24Proof.QuadParityTwoThirdsCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l41 l43 l44 l46 l51 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xc2bb3dc, -0x7270ba8, -0x7ce990f,0xe8a5b0], ![-0x7270ba8, -0x45c74a71,0xd474dee,0x3c2f2b9], ![-0x7ce990f,0xd474dee, -0x2f7dff20,0x7671960], ![0xe8a5b0,0x3c2f2b9,0x7671960, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x200484,l4),(0x200484,l10),(0x679368,l14),(0x5b902c,l12),(-0x51f24a,l17),(0xbe29954,l15),(-0x3938700,l27),(0x3938700,l29),(0x77c02,l25),(0x13040f9,l30),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(-0x9fba23,l43),(-0x9d50cd5,l41),(0x77c02,l46),(0xbb9db8,l44),(0x3938700,l51),(-0xb3b20c,l62),(0x785de,l64)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xbe29954,l15),(-0x9d50cd5,l41),(0x13040f9,l30),(-0xb3b20c,l62),(-0x9fba23,l43),(0x679368,l14),(-0x51f24a,l17),(0xbb9db8,l44),(0x200484,l10),(0x5b902c,l12),(-0x200484,l4),(0x785de,l64),(0x77c02,l25),(0x77c02,l46)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x6c012401800000640900c300c000340208013180a000001a044038c03000000000480e401000000084140a30080000003a0c031804000492106c0590030000000001a064008000c8220c00a400c0000001e0e05180400000001a2c0cc0100218480a00f480200000b8641c0a4008000642a0980f20060000000906018c02000000048301c601000000000e80520080000002a240398040000000015018802000000000e80c401000000000a8052008000002c1080f18060003c198280a9003000000000c81c4010000000006406200800c61904404b200800000198280a8c03000198682403c801800007864140540080000002a2207980400000001a0c0cc01000188642201a8018000000048303300400781083404e20080000008828030c03000260a4160248018000000541c0a3008000000001e0290040000000000c0c80100000c6148044602000000000440e20080000000044029004000000110b028c02000000000480c401000084380e01e400c00000210e00f1806000000110d03cc020000000000e06400800000822900d300c0000000022031004000000110a018c02000148681204480180000000385033004009a1182401920080056090160275004a10520210019a803001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802,0x1900a4010288328420170401400000000340290040000011024038c03000000088780a601000004e04401630100004a1304805a0060000000078024803000000001700a4010001686229024400c00003184207b9808000000000b014802000000068300c60102884202302a64014000000000a0310040002a1202c079003000290a442048801800000321401e300c0000001a12079804000000000d0188020000000e8a814601000000000050320040000002c1c0398040000014864058c0300000e8328072602001c4681640394010000000003c0290040f208a0b40631005000000000b00a401000005212001330100000002c2403980400000000b0024803], #[]⟩ def dynamicCode : Nat := ((((((((((0xf3158799327dd696f3c505638b1e5ccd2cb138b572b148b572b1441f230a28a2c82882c72c40c000030080200da2a1c7cd160a245ecada74b21ae5e0048a201614e0f4b104a87a3e82040000bb80b007f04b5e8a3821000a000056882f84e49eed9b0804906e7d368cc1c0cc509b943eb97801228364c62ce85800cc44e3890109c31a501470c1f0140000ab981c443b480b18364661c91a223666c8184d88c68908956ebac70018646286003bad348127101c0080000a0902c11f1ef9bcbd13cadf2377df0c1b05fac14290cec0e9f1e71aadc8d1648cbac92056ceaa4d84b2ea48edaccd8ff936238a5e993b9e45ebdf10de478d3ba1108041e36f7bcb89e7108e84b8fe01b4020219d5be2e3db02740dde8b670ad21018181b4bc697ca30b1008430c378aa0000d84c0c7ff8a19818528ebde5d9220e15cbb847122891d0e83088116d83d2411c2b97709001041582e0500eb679e5220005061a27080073f6f1a080922870840700003ec40543786cb88f78) <<< 16000) + 0x786dee1519e28476523f81220d23a160a5f21f28631b52650963c71295fca47589aee626483275b87fe63087aa22b57c78a5b4fed88579a00700c11184b66130ac89d293ea3e18bd050e0550bded87b7967a9066a5780db3f04069f8c19ad3450a87eb377030c388ae206d21bd710914daee959244d6cf8750711a472b461849f35fd5860850b19a8200259ccc405032d8b296101a40c0f00a000060082f08817414000a6841444786ab9fce9ea281b24c6a25047ce8017116040cfffed3b03c5753c78506a66dc2efc8141c2695c2e59240ba8da85edc929e11f49d64409728fcabedda9e823e95e4b5556d21b8e0814b0e2a88a40cb1cafc95d51c9f00fbe8044045942edbe16d7eb77c91dfad00930be4282409c977aad7d5abd84e2636254a59043480003e5382004be595ae1841b469cbb40604ad3b3d236860955a5f7be81801d11b695d028179d67f4da8402a421b7efc22220198fe58aaa38654305943ddce604e0600001f520b84b05b2502d0ec164140b00281a0bb2b53570e13366d388be1826b238a2fc42844a0b46dcc88008c9e71b7d0e01c3796a9e914012b7f1b58222893956550c9a274af4978d552394138182cb807a206c184a1f41c18cc2227121a1259023b7d5402c624f1d76618195abba86030c24090900604684c87981c2018044404920042030b297394ee60b659013a9e6a90124713e1fbd0111030690db0f5e830d7ae9784dc03845d8c7d9d342005b42bce2f2060146743b16602021a3eb5ef19b122400a40f00004166895c8d5ce160a1c68301771824601d9bfac5c71813f690ddd182116f441008208a8b76ee9418153d017f5f070199ec62770040a1c9fd2783d848013016015c0400040270a08be62618490027728925566d6b850e47002d02868261ca01230878372c600160cad213840e804000051082b04f094b30b61468c23313221ebe24705d55e774061831b5228642830a76db79c060c0caa23f1d0c319f9d331f8c09d18a36d500c01b6c1b866b84480130162471eea366e441863dc20d8ea924408698fe3fc2034fd930c3f01833beb19a3150c331d87538511c27462174d9020098549fe8fa080c30c8f128eb88120050078000202323071c4491131c60c28b6fdf24840f6b6633a4708ba1c525df8a10cdafe724a082181d20fc48302c9193603b07017ff1f2fa00206e5b4689009d84801381a01540400041841501785143bfea1849d8c10e143647572f92311a958c18084f4a5410000d1ae50c00b9e767093860e00400004fc8003cf904f05e126fc416746110cf1a48c30c3178d99c5082f9fc7003080895a07e28827c3539c60406250344384128b110060227c016dd09002001459573a9a49480c316a2ff548c5083fe7734bd8e2147dc8472e3850df1235459003f4f27fed0180245ba139604046114b89fa08082766e3cadb22400980d00003dc68906f475df98bb98b1d1ca587e158830246014082fbd41c60718cd8398e9cc33c2840cb7f0500c7b80b0a245c83c34a0f8282563c07326ffa08808292c9a8382601240193268e820b6bc8be2eec904360700001479c300f36b653ad58444906042db3b177a81286aaf5d4ad8c55308c28058ac3e452202490c30c9039130a4542840421d8ff54b0571c11c8aa16fb31ec3040ace8dde0ad4ae68600b272688dd912be30ad0e86a420e41f000055e6cb837291440e8729620916ca0c820a22a1a62c2023e01c022809345468201638a570b3860d80400004e082884c1140400155440702602613e200b34b13418441c0d494e289056f47cc470c6b277fc0061a92d56740182615423fde284f5a7fba74400afd6bf2400026bdc87d0d848011812308b188dcb69144d94abba5d861d7c6b98b0060a6063015022851724687431810ae15c780080d22ffb352050085a9498400007e5f99430a50900250300000f190530502902c144140a00b04f0582702c1341784826c2f13e51266ef708698411dbeaa00410f860b4b8163a60ca1e3c50f2d94d56d121df10abc68386854e528812088b152c5120900220245126a1b751061930844fdf3e5ebd1041461f92dea60c1cddfaf6aeaf258e0d5feff02622411872351679e2000c5d98d21740a003f0428d63181818b555be5980ec4012005a0980002333a49bda37fe96406b1ac540e380cf34a31a15e5a842c94103b11c781c08add8c781e0006c76960600325b52414804200140000c31c2cd64eff801441112e784524867033c1c238ebb71ac140f18979ddf9910110ed0ac271828d8c151f640035b7dbefc60037aad36fec24008c0916765e42189ea7270ba7c2bc521038279871669259038e60668450410390001006800083104b050001829c24d88e260c1c236eb24b1e557cdf880c24389f4a04605a6c09002644744700b5f733c49c307002000027e6c86db722a638e3f17d260b192e09fb114356bbfe581851407a1f03844039ecd4c00193a8f08c0146aaf7b10a4080f80a000061082600f4c4099e7fc8289edaf18c8630819bdc689c208c9ce92d582c78425a054f2874b0b974092438fac21dbf1c3ed83730782412f5d650efea120048058d326de8341cd98a260a7c11a1eccc207cbd97f822c82131a6a536720b1d040d8c78dd8904779194cfed0b021512face7a0a02bf8e165fab0100b736306d38322804801602600008a8d1462585cb0e2585722969a4e39dc0842c8212db00c490197d1520a183929930142828231a0284016ef7e0100405930f4a4820f80a00006a4d108f8ab67bd248db099889b9639770a3)) <<< 16000) + 0xf20071e900dda46058c6440d6bd2286a1405e15892341a03e18a4800dddd974c03005549eb128bd090025030683b0edbadb32e738539c15128a3893492c8248285284281080c800080340003b4825828000c0482500f096757cbe20834db7d430740340d22c7a0256d31c60e8422820203a2c0124014f1d5f1c005b100f10a040700200002d2689571017cc00d183d4d08a0a2464137b1f74071a5e9b50676145a12c8d89c091104ae1c927204aa223bf6046016562be34c1004eeb67f3d2be12004c068c252225704820b4b1618b1e2dbfffc7187a61f10d004be4f6090001ffef47002f673f67001c00800009c90490502400811c0608c030003962001c924114040034b84007b58801c8f90442dd100000a8c0306c85532ad182a22935eb8e0df6ab9730604931f83c0280498e7060100018044400002d75dfe6110648182101840ca8ac9b8e90280001356038be35994450e146ef50976304d9adf4f60e09132d8db830200004d5806016f4fb9528830a06088070000344410c0408402041010200080fc0400077c40f8a607a3b0131181e06e884d311368deba53e2a21002895a56602367ca799c380be7ef4991faee75e1a8a0167555ed8830a635fea10039e9a5142cb28bbf670a006695a7efe6a0ae15792214d8e609429010e2c0163ac02a6108f2a802350784482c7987db1a1ad51e971b9f0a00a7894180b12e4d13c20215124a48040ddd0d3802674e5524081a008616665e3a18301add786080571349806eb36eb2000d00430385e206090c089f5c140072a7ec30022870f90006802000017240ec0600034440e827a083e789d198480bae59eaaff6d5a3f9feb5ac1309ea28e1f75e1c2888db5d3b074503da0c6f1f56c2f399c4b20b0f2d632c647a3a06ea8ef91cbd639549837bb3d5180c08158ce8ecfe3ca11f70b00ed9f977010d95da3726b2863bafb8dcf5d3ca8dcf7218085ae6db9e38a8a5ab9384fb93c1eaaeaab5b525e983b4bf3f0119b95636b08c10002d517bdea5f7ff5873044bcd7482e2a814bcae8dc25f8a9773bdc69147a8a895327f1dff9b970af17f34e12db539f60d6c5cdf28e010f0e540212f5d6d208811d4000192c81586c0e417c0551812044305801100401004481288b5e280f1e88044083001000006b30080100400001110000e5207003910c1bdc450995fe40f0240580508c306002102f0c6d0300492878a0187b891800b004309060bd8202e6c979000b0020000190d90046cba58c6f86363887d44f0501b59222301b40258ca08300100000d7383d04f0a58027c4e71000c0042c82e176860909b808024e8251800a804000021081b80c00046c800197181540e38b551c32682f1bdf643e420f0565b0b0200597b4382bd3f36f3efc20306baf738b486e292e2ae234c1d4db37916e18f9452935ec9c4f5b61284cb03644da5515540e89708b768cacd7ae2c20bccf1af75ac0c026bcf82fda61806c4690b28fb170dedd81fd8024dfee26b25cc29a2d0b2845e83ccc0e58d067f536b15fab293691fa7ffee53f5d694c11684e5c8b1d7d0ad810fd5a2df955404dfb0c130f98af1490bd704c683e5b86cc74cef6af1122410ea3500002de90009b4205632000b41206c4390dcff0a3a3eb52c3ebcc2bc22cf5d04c30163f94b32a2f9c03bacbf14d7e94ff64b065bd9fd3e52d9b5a539195ef37680f008109524919d41bb71ed7c62f9a7f98290c002eca749edc8fc2822612fb760c90372404214c2fe7cc92cbd0936d58c3a6428411244fc9a7618015f0bf8a10171cc0556ddffc6068cacf6db8ba26d9e6187a180486ac27ed2606143dde8dedb3214da5f29de532ba53eb7e665eeb604a3847569d050486d76d38428a76c185453b7f9554f2afae2662e20c4db2bdc3879d0b9361a80608215d7acbc2ff60bf5ac69cc9a200950978d5ec4e1967b4d5aeb7e3d8491af8081960ab0c55ad25e5dd12e1327374ea877c579b9e4387aa41661e97760dee2df400712296c2d0c68ff3ac8d4672993ec25d2046f7a03e61366edcdc0aa69841390b28bf04ae6ff9f13f6b447e77a4790d7b1bfb38edca2cdf9bff63c1e20a7d9c200d414000c6c404c3602a0a000aa420681bb1e15da98282a4154e112428320089a8d86955fc05ce9ed1e7deb60868e75e95fefdb037ac5729fbb9389fd437a709b13eeba6000000000000000000000a0af6bba482ed88a5a914e7c6db8c72fa36e7150c69c000000000000001c3c6b4ad60f6816882fc794417e3c7988f56b4421565e0f29010a0880040090ed0d0e70caf31b518c751109ae3e3a8ebb82863c2d3a4e1bdcbbbb818db085e6467c4eb8de734ef63e62f7742de708de1d1e733f47ec6c205a09ec3f9d184a36eadd20961ffde0246fb8e50b11a3648447fa1f93ef139e9c905b5fd055e562a000cb640a45404e220261181988808414000ea64070460262381473caea0c3a671ab0b0416294a14014e0270400b910530250c1a008402004011459e99190686084dba0900193a2691820d80430d24695f88000acb79c40036010800008020000088800055900015d200033440c846062220300d8098680bc260221301009f299c47cef07b2e87dfdb81bda3de783906e0a7f709e783906e0a7f70a03b02cecbc84313d4e4e174f8578a4207137e9fa963e5819c8b6f84154ca505d829dfffa4616270550704b0060040010314ae9b4161d4e34bb214cb2537b390038be23947f18b088158b2f9449d67760f46e263f00443659792d6b161b68807d033b99f75a219e7a76a2aa111d81ad9bcd)) <<< 16000) + 0xd82eeaaa2ce85fc51250d7df0971611ae0671284554e4ba1d59d422beb07c91a486a12861eb6cbaa3cd1030c4771521014da0d24a006d2a0a490206802165c061fe8f11b2f318288d134bc10156c3f8a4810320100000b9205c1b02d09d153a28a7122826167638028447608318a0d004000027481600e49f19c7834061fb742004309981800ce6a21012838300080000be20563a000376202a0a00094320542ba1d120eaa1c31fd4c9850819ce04241f6fc60464081a00871ec6de6624102a6b80b0105d0d418000775c92810340080000bb205212028090138480982604a120240901182c0880404202020010001329000f202006c6e61e25741de3156dfea126af53ebe5bd67cfe1f70900000000000000070c1deb1dc1deb1e34358a7000000000ebd34279e34a6878e8b183eee0bebae33b6b323857840000000000000000000000000000000000000000000aa6206182300280080aa0a1452c82a6556e86b4686dcaff40be34f0212916941908e22bcc672fde63bb6605081bed048cb1c88af9b59182016161e10d72f7984253be8b190a642f89fa9907ee26d36f2a8614cad13714a3060d3f642b743dd1491f35415f52a8002f59003f9a200fe4675dc62b23ba302f584d4802b38dca70820bb77156d1b80a90e38e18e08c088086002028a353e4798148c4b112392629cc29706abfd45dd2a6aa6ee8c31dca1b055bc40000953e0c02bc603439c0218fa413bb198a97f3580948300303f85e807b2cda27a7a8c657bc6303491714bbb59d2cd88c9644040000dfdd12041a904e56a03257761d98a64fe3ed040dec480c01945a01a2b83489609e2e80e1252b57096b9b71d7d49c34fe4059ce91cf74996ab33fbdfed68e20939ec5c311b4786f94440800012a7c180578c0687380431f48277633152fe6b0129060908d3f341c072d13cc0a4832595460772a87319bfcd9110e5f05f83deba1229172f3348add9a63a4dc9570223dcfb10a30ca90000cc0407c84004028181acff914132a2f422023d4315840369ab7e8804830360100150580f00f882ff9739019a006fc2040274038617744cdc303453fd80c000201b000330c0d0042442cd14dc810e3ad06103df0cb7470acc30171024141a0084886e739c902084c5ec207531dde9212a5212038528f0e606171435403001f9b6988938a0d00400004d48001099c1762bee6103857ac58606bd850810174ed87880920e0d004000031880020f901d1500e06c04c374417b472450c73ac879011533c1630507c21d80001060a812840d0042c7372ea9480cce05b31c38cd9434304380412240150d3184004513b326041a008610375fcb90250bd34c2042d31c80608467ec2500136f4dca0034010c200c9f82204b922ab44001140d58c00680200001264000634800157901b0d80d02c044160200ba105f860820408ee3f05103b7bcc3030f98b9c90e0fa14f201ea77dbca002c2944140218c4e8a010680212204d090b2044ba19de60618f0ebc40e323ccf90085c15d894006c020032020000f9321996eb577c3ec1a48e320500f33b8b102870c0a24b432d30c1c0ec37cc1610b487c0e20654e5bd08f7ebe4636316bc8f5a7e81b0140043a0b85bf11e8db51ea653eec41d9b60605a0227b6f85dcfa9c84991b991e1d1074033c1933422f3d727c631126c8108d71483b64855aad1191af4a0ce70f282408d00060040007c0405c3601a03a18b94e2be67bed883bac3406253ae23ed7ff20209f930bbc08a71f8cff00dfe2537556b8f470a256bcac34e73d4ec8f565fd9f65408a230182260464208c50ca1a4e4bdebdb47c73887a8a00b8f1daef6acfbcba0b659c4e10fc923c3d1042d9c971bf6c9fdda3971224a229c327e88d0925a6671af671461b24691439e5148a1c0000208900a010005669016198068c805447c951b052df8f2253e2b3eb5124996ec1c9bc71389ed05d2290129799e70e4079b8251f8f6da7be64a9d854a85b391a24cae3c39c6558fca1756c2ccddef0d9c8121b62d7a2e0942196f87ebd9af6b982f8ce8adc05565441a2c20bb40900187cbf20019004400004010000044704a0ab2c400c1006588105c0200000d26c38cdae0120314404522081900800003790140dd0534724e120059b6c230018afa50046203401000009b2000500404c340241a0110580802f02c6c2121041600800780c03805419404a330085233e2802118e108c20600210040100448036499e18091e79891020c80400001b4800055100015532011f99f61c3281e0ed31f1f99b17346a12c8e8efe50c7a7e1784128af1d52bd3b94b071c01be67e79e4d0c00e04aa392257999780ea65da44e2f1df92abd65713223ffcf1503b8cfa9c41a969b182d51b940330aef0128128b0720aebc349f1b9b86b0c514df7ccc85adffa1f39cbc478a3309379d84f1d62dae2abf0b0469371a5bb8c919a5d8c6d0d1ca8116546383609194766a19a8fc4c647c726f8524638aa4a4ae01c6108a6268000155c8060480340760fa31750c09e7c4504016ee4482019ccd402120a0c004284b405085800c36623017261048846283001000009620181200018120163a00a0100049f9000f092003c984008f48d1722fad090a1842c08991413a95241a2020000258040014ebcbb060000004b008009dacbcca0a4e383e010c30201d60c28bba69a2a8c18000070828608abe548a09f4ba154202000009602000000258888033c504571c1e0040000b890091d00402801c1400c0a00501002008000d948019c80085400202000010018379)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoThirdsCase3" = "QuadParityTwoThirdsCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoThirdsCase3 private def zz2060:"s080c"="s080c":=by decide+kernel end section namespace Green24Proof.QuadParityTwoThirdsCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xcbf579c, -0x7270ba8, -0x7a81d18,0x258], ![-0x7270ba8, -0x3ed0b99c,0x8f3664c,0x605c13c], ![-0x7a81d18,0x8f3664c, -0x2ee85a88,0x741b03a], ![0x258,0x605c13c,0x741b03a, -0x3938700]] noncomputable def hinges:Hinges:=[(-0xd4ff1,l4),(0xd4ff1,l10),(0xa94012,l17),(0x9b65de8,l15),(-0x3938700,l27),(0x3938700,l29),(0xa94012,l30),(0x3938700,l33),(-0xd4ff1,l38),(-0x3938700,l35),(0x3938700,l37),(0xd4ff1,l34),(-0xa94012,l43),(-0x9b65de8,l41),(0x3938700,l51),(-0xa94012,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0x9b65de8,l15),(-0x9b65de8,l41),(0xa94012,l17),(0xa94012,l30),(-0xa94012,l43),(-0xa94012,l62),(0xd4ff1,l10),(-0xd4ff1,l38),(-0xd4ff1,l4),(0xd4ff1,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x5106508402e080280000000068052008000000000a031004000000110f014c020001284c12016801800000001e009200c00000000540390040000144230138c04000000000281c401000000034180e300800054240580f20060000000d0903cc02000000a43601a60180000000034062008000000003c0290040000019024030c030000d0082004c602800000681100e300c000000003a0310040000020824058c030000000e8300c6010000000068b033004000682106017200600430901401e9004000000000481c4010000000241806300800c42904604b2008000000002a0148020000000d8301c601000000000640e200800c61904404b200800001e19050150020000000a8881e601000000006830330040000001e0e051804000000001601480206304605601e48028000000048303300400f81e04203c2008003c0841a0271004000000000480c401000000000440e2008000000004402900400981604301e9004000108701c03c801800000044340f30080000002a1c0318040000014828038c03000190ac1401c8018000000005406200800000001c28198020000001309018c02a10520210019a803001582405809d401000a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x28ab226dfff4ebd14480de857184098b21030d0594b9e851032728bc37a892831070bf88f25a020844912f983f588000001ad2748007a1201c10c415145777ba330289030574d069000002a30b20c3e26f514411940b50343000015185062871bc682042492eb102005f4f6e6264107c040000350649daa4939618400000546092020685bda60e0000151828732600a3f12389c61018ca0cf174736860016e466d6240251fba38049210420300001be30388953b32c619a821c48daea4bc49088469008e00b9e6a21801d84e462cc18360100001113046581d2672c60dfa872e48c4d3e84d48186e98dca06188b1bb6908105a40cc80802ca1aec8005d13eb4b840f8082c62a9c3da48d63e6408700460d468c0151f33c190206c0200001824028240004c86398d75654597ef3cbf7a02a240c48a30a4883883084002802000a64500401a0001f24044170461a15802163825b047e96303a368021230cda95be903093767b80a18162aa94861c0ce7ae306107d4cb3392010026f5a06484100082c72924e3258c570f274919f388721034076a8b1802105fa032840d80400003a0c1124e408060b182c6a403f9230583b59d12060dd31b9404843b2f76c5030826890df88a080b2d23250c11c2fd344a4801e29ac528244841180e2c73a3824e58c07265ec91a20a79b1033fb985d0c145abe743003ec3ea466081b00800008790002fb322234d30e1c479fc4d63099e078441074505191002d566750805569e2a293080d804000044c81d8880e824000e4840e4472c40a0106e18d78b0f31c481b764af8489dfdbae73b371039c937d8acbea793e22000000000000000dc870c60c40c7084082044c4185b8a029895e3a112cfdb4226f00a256db95fc721506c383b5896901ba883f55edabf470d79287381a759df1f20220268f918dcdf37ffef8c62ec90be3d4b22a18b49c71624bd29a8001f51ec95f0913bfb75ce766e2073926fb1597d4f27c44000000000000001b88610c08a08608c00a0080202112ea6a70a8ed7e0b9f2dcbaa10b87d0c24af0ff55c39da552fc234103d3b8f7caf5ca24075a0004ee40e08406e0a0360140dee1f77ff63854a7a412cc304ea3ad7e8a2846f24ebf484006f2466f283806989db114280388e5f09888f24c0f291459d76f2d1719c7090091c5a9e961f82ca0451f0f6590e294666430c1dfbc740e1009fcd5c381011cac88502414b7a7020699b23d00602b59667894800f80a38c4fba4a16308650da3592c817d34f533870000145020600e6befc302b660f2d438118b9bd0f2c0a9c6446f1802b1c18bad4801000a00006c0d15334998e82c97abde6891438063fab7820812bd5c88583f93458ae18100c7c0b31401c4be56d85006ddda01400006b69ca0b64008406006a020001cf324d29c2d35a143a3520e443143398b2702512311f7c338592201d29694e1408353774f59200bb0061910c0011fd1ad30644041201000006acf0e20170e960a1c011f31d09038bbc69983283262bc09da406964543dfc30d0db60b641c086ce52660281253793b80103f2947e323a920046048e30e014e60518440598e1fd2c827c838fc2706046a79dc8c0a9f2a69270e100e00bad23812ca793dea5809cd220dfc60128401c7475480118100000738d9261573987658e12e60314e40c0176944c228a0d08cb748484007cf965628416dff4afe2040028307ae583fd023c95810027f1b53cd2c9002402401a0080007b4e14a7d54d66121acda2e50d8cc3a5648c23b22f660216df5244000070c5a3003a0a4ae13840e00400004f480038c19235b74221248e14ee9b6e246d60bed18901241) <<< 16000) + 0xdd0828408805d421c2823665c6461c09cd915a50c0771a6f7e01016568e6956920042040a20f744dfeca1d672234d8a1a5032e30c4101855be7080803bfcd4840810206cf0308881c470850403bf2488400839dfd6a5200400280001b036496c6079103863590d122cd25f3310127a3855160b0ec1be0e0004cc208a0191e43e93820e00400004ec8198480b404000a0e404c17c40803f0bcc1845422c997f14486ed85df51c300eff35200c37cba00b6018274ad61ea11426d776987f10037566c60200044a652374d82400900a1846e133c3860a271c20c783430e7a8a8f7e03059415d17f4142975ba74298c0a60e9bcea0406dfd8e69a028028347ebfe000455dd060852848012818000078c81982c0c8160620b03001d9004bebfcf238719dc02db910395b2a0a330619d23c8839440a59f43486c1c2da245d1fe0a1780663a2901048d9de55f2001134653a0388b9002503059003ddcbb241c392ab77d2f040e6a73c5ea38c317f485822840a4173ab2bc8e147ce07cd522858f095296382098e1ee91e83008d30f94ef6f64801301800007b4d0e02edd860424608d99a7ab8e304dfdfb4a4a14180663f6028a9ba73f4a01c40fe6ffd990c0cf673c2250406802923fdc18058ed3ca76a8d2004a05802f010000fc1c241d8b418b20be79cc8a1a2ea18dc91802acb88708075b77480022243e4600cf539e827081c00800009e9a1c0667a95b07181a6c6199ca140c18fa2a8515a0d609f607109d7e6350ca08685ea0d08606ed6e246d440663f629c7400013a5a8c4ae29002402850e0257e04d091803870bb28e30438ceffb28507c7b44f028a80b0131307104be0dbc70c0c24ca39a410179c8d022418028cb9a18a1d200460480001cf34345d31e0102031608b0820b9c43218107a8d3d90002036e30c01ed771413020e004000044c81704800141881682800323480086910024793c40000189c028452a6fc594604045e9d840a0c34805a4b18069d1482e0280022f4ec2101313edf1112d46202301c0000b9102c2180988c0ac460541b8011213a091e3ed86b278ffc9e2a139d60a42351d2fdd00ef2f51b221c01865e6280c58b6c682fb6689cfb998f2edcee6a17056153905764c500738379c5ba0a2a2f5bd0ab8d9e47a94f0c8ab5376281c9e2ed77908022d5bbab07b504734b44022539caabcd15b54e38319d9274bd95090031de66ee29f337b5258ca5843fffc012ad25b94084206e871960914996d8b8f988314d1ec2ce4db04f96a8373fc2783330914915411b22ec091d2caf91b1e4c0a66888c7f908aeb9f2b21c9c4e6c13ef40234451aaf68202556966549972337687da07f59e0222a024a185a1abac693292232807767e3c51ffb3bf230756e68ce6427440859ac5d8b129b78304041f7ddc2011824d41c008a3a3480020b84c12840c8042ca0074d69621a10f24b0b7c60825820c3d95190206402000017268126724953b6f6ee01644d9b831a952b0ff9a9df0ab41b5551c1328eb4041f0a7d8aebfced28ed88c81f62a99a189f2a7d10c09a7828d776f750b6bb372ca0faaae444548da661935458d0091cc64d0babd43b84419f0197237f67d128058070a0300a7d393816a2fc9fdcbd0e2704763f410bb3508f84e619785280003de20521bc1437329c076d6c48810540210000100461810c9c8408aad384402acff723001800800004610000c9205013924fb568080c2b206380112a025801ecbf0900aa22004a102e010f085e1278a106375e080d64a6a46082e010c15633be8a115567a140ffd46446082e01000008c2000266400088881384c000eb8c86e17559c9083c4914980c4473d91412ee5b241020dda050900e0fdea033060d80429a965ea1acd9b56764aea455ceaec320f42b740000000000000068ec2a6c0239a0596c79b6e1b78168c3cc9464fd1c9c1338120aa1219210a08608409dbd555d04d8ee831365be562a9dab80e628a7db19d6ad7f35323c3fe0c460bf7779b118fe6229f864d6ce2315c2865e1554000dc08118880441400098c40981700c0100401284e070ace3d82020cead7a041940b6aa2c02ff19691c01527f7e0802de63ab109840700200002324078440481a01b090000d5101311c0a028041030f1b4b3912115312151800baca1c12040d80438603679d430f6c01db1210a1577848c206c020000132408c360441b0210d80702e343123ee22b86d70bf9d3a318171658113a3cc058000000000000006e83ddd2bbe7ead501b1705f680b72ede216ce22ad000000000000001b384b72ee8b38165a1dcdba70605a0820810e08a008000543b8d2f0835a2b3ed1cc775fbd3651234fabf2aac44083e0ec66a91d17ac8b8128c1f590696f66af48baf61a4cd3f4d64c8a3554ecc70340bf151f10db9c545414eeb022033d08a1df9f191a103c31d02cc4060011621c6f1d450e472db04003d10961802e643c804820320100000bd20002d8404424000c5a408017027063d81c3766bcac8105c011023e07b318062706a0e0402c5c0a014c42f92020c00400002ccd0ecf29841c3943a1a8a0040051d63081900800004a101f0d00f068074240381201b0500d00800098c8005521001b1830310f95e2484860f0cb0ed1bd81c03c7af6002a179facaa0fed6c96fb4cef124e560390b925043bf2487180f19b7644ae7ba0aff410d0537c5e533196a3e9b98ef0fca7295d375831fb0ea650f9b4a9974c45c7b914002b56d82eefc582e48b1339685a8cdded7cf25faaac429980802677429278adc3f380550a08301fa9c)) <<< 16000) + 0x04010f9212f2c0dc150a24c3f389e8f21292ee2848c69cf22aaef2451b24e2679035725f59d4fb595b7b740104a9876626c40389d29da58b66ef69f5682a7c5600bb9b3b41ef4ad0b1c40cf546164d6bbed701eff1f874048fc2d1b18ac6b570347131f0cdc2a80b939c94c27a93ba08f66f819b564012bc96a9191c85a90968019010004071002b2c200a7146169c4ed8100aa818c34d7e454d092d6b464cd3c4afde747138000000000000000000000000000000000000012f2fde997ef3d59512398d41531c31c11811011000c004937ffc794d150333a4f9dd880e8eec93e5c831018600f767c67f0e6786e4a8c2d411122557f8fc3fa2ac4be8a3e8327bd85bb9e952cf88ae8c39d469d8084b3e4059596932a68d883b027babe8af3072e6c0b5f701c2215b0fc183c0d7ccdb63b13fbe5531ddd09b20d3ce125c508259f92fb2d8d7217f1f0b577f7e03c1abcb0c98d1abd81c11816c7b16f370f19d8543db36c78992879318e34cb5b481004b3eb327da420b6b38b4d2f935b6307254ea3ced75b9000089bff13388c1b86c577b14dd5f446d4f7f8b4652837a40001e558d17d3a5858d9e38d68f3397467ac153a7acbb6359c3efcad51260b6e91ea87e5ca36f2d2b3dbd031862d89a1228e8686b1440363cb2407ac7700460c53c513060126b5c10401d2fb76093080d8042a0630d35f9153424b5ad19334f12bf79d1c4e000000000000000000000000000000000000004b12862842441c42820821400c0070180200da818c34d7e454d092d6b464cd3c4afde747138000000000000000000000000000000000000012c4b1cb14a14814a10b0c80c80030100200dc283e0e166458e095f2e0d30613e4745b9631e10f82f09180000546058a3ef4451e30093614e9508009f27975c92010840615031869afc8a9a125ad68c99a7895fbce8e27000000000000000000000000000000000000002589a49a39839439a294288098060000401ba5864712b9a48bd56db9840179a1e1a3875f7e5183c26e1db0e00000a9d4c003801000011120005d04001248800336900084a20301200098d2001f5e405c660040281873cfa41410f9a36a20235f148c501c1d2b708061113900094406c02002c03a1147fcde1032946eb8a04a51bae011880d0043041ab7c37d183ee7581947ba74b10baeffdfc40403f223cc7bcc994bf151c5f068d796f739040b4707b7ea76d0d3d86c5690c556a6d77ddf24034580274797b7229489edbb2eee22e1603810169d867289a1fc4d015e41c53168b923b14c0007f40b80e09c436c379ccc1b09d1ca41a47aa0709f7979a14890ed3713bcaf94422c71000082a400132880a88c050440261b9616b17385c9c2e9f7cc93e81c4686247dc4570dae17f3a746302e2cb022747980b000000000000000dd192127d053dc20baea7618f604ce794db5661d80000000000000347096e5dd16702d0914704604504400792bf6a5bd90da43380174c02545a46f4294d72c37c1ba59511ad73862f2834ef14ed91e67dc1f246f45bb68738fe3c98e73a481057effb2e7d8fac030831d44404efa01c038d0c48fb88ae1b5c2fe74e8c605c596044e8f3016000000000000001ba32424fa0a7b84175d4ec31ec099cf29b6acc3b00000000000000687b4dc7fed6d0a189cf99a0a99431010e10c11408e08f10aba62599e6c6ce19d1ad9ae8381a514b3af3d9b603b4d70ed0b00a7e46d7b042c1db51190acfb8b219d2a0626be3984bff1757cc18c1753339e5e002dd376d83424f6b433f4447d2026f3bd363854ff48086083955619400b9e8f3200224ea7224c183601000011120120a0005d020242b01105c040040100201300f0900702f442d5248206e60d549040e2141a0145bb1100a004f64a082e010a231f8ff140ee650d1000b8042c4197fb85104cd02100d9b1326002c008000086200020e70aac94d1801778be2401629063001907d0240817008000057900d0140d397df5e9a6f1f1eb1e1a7c4b4accfd4dd15061a49ed62809142c062f7b4ac25778b1e38645d3d74873aec9064ae3958d77e43a52300615ecbefd4919c36629c6f5df1fae885a1ad8a67a0eb1be7df403d6c584ea503fbb6be6805b1f68efcf1719f62b57d102230a0c5d4539bd432925e0c11fb6b9fdae96324150492ed9d0d1886596800010a4d0c11049c30eda6af850283999a3001800840000401000004460a357d709006418848810600200000d240301401602c32cb1ce00c31ef3e9830359ee7d630606c7dfca00421d6d0e01114caa098206c021a3013433cd10c7ffce6860aec6a342dd64a48e10003870941064021a267f970880c7b4fd640410755c2801347289000481d289410640200001b8400074c805068000c488002521009090005f59000c672002ec64007688d17c19eab0c050c5aa3116d850548255a6e8404029a12420400317a59dc430000003a9802003481232380323881200e30d44f153cd00c202ca5723923045d88be68b840803e6e0cb0280058c7f9a28800014d0921008000425f78d8190e184c040e3e43e19618714b55dc11640600002ee01c37a2bee128c180852b22040028f86cee0002b61b90c0a3841080a208b6afdfdc48c0b0c03b08180454d861021abfaa15101019705020820f7c2a7840002ee92593820f8042460ecf17fe40d5d91bbb09110c7dd449024a2c40ff20065218b9a3800852b22010147b8bd4147041f0140000a990002be200087640017808040a801c2400c120050500200800c04000fec4008640020200001001cff9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoThirdsCase4" = "QuadParityTwoThirdsCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoThirdsCase4 private def zz2061:"s080d"="s080d":=by decide+kernel end section namespace Green24Proof.QuadParityTwoThirdsCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xd328264, -0x7270ba8, -0x7ce990f,0x258], ![-0x7270ba8, -0x3ea4251c,0x8fa9060,0x600b853], ![-0x7ce990f,0x8fa9060, -0x2ee85a88,0x741b03a], ![0x258,0x600b853,0x741b03a, -0x3938700]] noncomputable def hinges:Hinges:=[(-0xd4ff1,l4),(0xd4ff1,l10),(0xb3b20c,l17),(0x9d50cd5,l15),(-0x3938700,l27),(0x3938700,l29),(0x9fba23,l30),(0x3938700,l33),(-0xd4ff1,l38),(-0x3938700,l35),(0x3938700,l37),(0xd4ff1,l34),(-0x9fba23,l43),(-0x9d50cd5,l41),(0x3938700,l51),(-0xb3b20c,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0x9d50cd5,l15),(-0x9d50cd5,l41),(0xb3b20c,l17),(-0xb3b20c,l62),(0x9fba23,l30),(-0x9fba23,l43),(0xd4ff1,l10),(-0xd4ff1,l38),(-0xd4ff1,l4),(0xd4ff1,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x5106508402e080280000000068052008000000000a031004000000110f014c020001284c12016801800000001e009200c00000000540390040000144230138c04000000000281c401000000034180e300800054240580f20060000000d0903cc02000000a43601a60180000000034062008000000003c0290040000019024030c030000d0082004c602800000681100e300c00000000420310040000020828038c030868c6050037c80280000008428063008000000034581980200034108300b900300218480a00f4802000000000240e2008000000120c0318040062148230259004000000001500a40100000006c180e3008000000003207100400630c82202590040000000a8881e601000007864140540080000000341819802000000001601480206304605601e48028000000048303300400f81e04203c2008003c0841a0271004000000000480c401000000000440e2008000000004402900400981604301e9004000108701c03c801800000044340f30080000002a1c0318040000014828038c03000190ac1401c8018000000005406200800000001c28198020000001309018c02002b0480b013a80250829010800cd401800a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x1455d1f132eba59084e4eac121440d43002bf050a06eb8704194107d60b091208211a007ec3900000036ee807d0e084c050a2a8f405e614480b49ab734800000e1059040992870a205d3e8641a1000007082820dc363161820c7d7308100208c94b1a4107c03000034e649960b70d049009b4be40c1c0000384143909e19952470cad8886506528cbc58c04000038418003e9a2c3240194ea04a1a4207c030000352608e0dbee2fa70b183b1fc6ce652462ac5bc8819c81872222176100c3105090eb2e0904048ce785d408004a43766ed810063adf8e614027104061501e0000790f183bbe171428cb2793205d871674402610b00c6005661680a00e104e01498406c0200002246398d756545b6ec7db76402a240c48a30a48838830840028020008e4500401a0001f240441704645458b216381e6b18596303b22c579230d08aab010308c3f3d30a18136d5e3861c2539f74061078d2bff920109c5f3606484100082c72a6f5d258c537f2ac919f824081034003eff180210fe5832840d80400003a0c11783c4c9b82c60d71b4e95923070211ee4481841bda4ae848448b5a0ac80c20b359d9418a080defba8ec3048fba37a524802860793e20b4484128122c73dcd63648d114f80c819f744f3860a3afe9c1801fe187e32840d80400003a080017419111637458e23d2dc8e184cc15c920839bea570801461e630402c70bb51498406c02000022640ec440741a00071120722b96108627a9c31af170cd048c0e27f06f15d092314e9910e692dec34e0ab4653ba2a0000000000000006e438630620638420410220803b0d8a52a4384330c9e981db9c4e329449ffe395eb3f343888c0893dfb06062339f6abf911b6f2a8e4459fc9a374c06f9f2500a6dae114e7f7f2f894ad756b898902156b125e1494000fa8cfe0de2ba124629d3221cd25bd869c1568ca77454000000000000000dc4308604504304600500401040cdf2a0b5eb126eb651ab8cb626a1c883f6286ea34ca6ff11fa359004018efc3d17288c1ca80013810382101b8280d805037b9395bba8e152b79c6980c13a2add15c8a11bd1945c91001bd1731c10e01a700ea998a00e27c4721a29cf774875d166d826bd5c671c2402471703e7881c2ca02f73e2c96454705cc3c30c2cf9aae038403bed02838101e71a9a14098396f2a0207e64770c01810c3168e0d920042038e316a7e310118437be0ae852c819f636b1e70e00002db40818040e5b6e1816832ce9ee3811af9722565818f34875e4600b9e2db3075480118100000738d154582a9482c97892a2131438063fab7820812bd5c88583fca850a518100c7c0b31401cfd5d944500695b192200007b2d724b64008406006a020001cf324ece7bab0a1d680d90650d25b96fb2462d901c6122020e16cca04223debe4803a0c11418002e706f050103a01000016d3c387bfb454c2870077cc71e40e2f933b8fca0c991c959c901a572a080d0c343f70d4c07021f17b65a0a04914352d2040fbf393accea4801181238c36736d584610ff24145d4b209ea33d1b9c1813414488302a88f2181c38403a221210e04b43fcf6d96028051292118049a469eb9d5200460400001ce364953bcb0f2316383ee52d5ef1030051f070a70a282d06e0052121001b568e2d0a1050afa9b268410006f26e7d160ef7277867c04008be2f70cb41a2400a00d00680200021538529d4192984874) <<< 16000) + 0x7c40943628a5b212308ed1961808581e86100000e89f8c00ea50c284e103801000013d2000e80648e52767e923856e863891b86ca7d24049f5302e1022071e3c0a08ef10e887029a3e774301f8d452c0406083cfd64800e80828854835ddea50efa776c334a1b37c59b8308204563ab1a202014d43b902040c1e8b7e8308bf3942088a080a6849081002d3566c6d91200460400001ce364978873590384a541a922cc68d93901293d995960b2414f68e000748fc0a0195455c13820e00400004ec8198480b4040009fa404c27c40e12dbb418495af6229144ef77258b1c301aa94200c3dda3cf30182cf8e82a7142c2012da1100626e256e0007ed17edcc120040038c22c0649f24144b5a75fd1e186fd5c5f3a060a875984e20a13c4d516211813d414adf020325e5e0c4050040b11c610001c16396b88424008c0a000039e40cc160640b0310581802ec80194ea9a60e1c43217900c2071bf20252dc61939768f7642051dd6a2f27c70a4a95706b41429ff499ea801045b72eb8080005a24e90d02d92400980c16400a4f7486070e30ab67474103913d1612fe30c42081373e1028adf19ac1a384c23ea34f38a14273b345a208240ab19d600c01720dcd8652912004c0600001ed34380de2d26091828dda4aa38c163069ba285072ceb680a2ae5459de07104bf9c58a30379673628101bd48e29d06019c00b92b24801080e00bc040003a070907873b52c82d39f112868a7e27724600c8a341c201dca082000907b14180340e10509c207002000027a68702228dc9038c0e24d9b70a1409478d0d0a2c6a5bf6781c434805f34050448d1c9528607ecf95b4c880e5d7336ad0000462943d9ec9002302450e03e7cb2b048c037d33d9e38c1afd93e3050a1980f9b7028ad708b6d683883e63e66c2303ba0c78c10203963c9692c1804425149ddc2480120140000764d0d15ecb384080bf89242082ce3eac6041e048b040009114ca3007a957ca4c0838010000113205c12000506205a02000c6e20020f040090c4f10000083402846e5c66a91810174df2c0a0d988039ac602350029a828002e9be584110b2699892f1880840500002c440b0860262b02b1181506e0062a8528f54344956f0253c6c0109d8a05058160b9ca1cb40bd44ee61c023269f780fe7ec6039cfd6faa578c165265b0d53ad5df4306e13339140296aefac105d9119a8ddbf6b79b91b059532c754255c49b1c224113080322a819b82b4a845d02dbc951043610f1a94b4988e6002e6fd740364017606b49239bd4dc869db582ed1adf003792237f0139450808c866950dea6b593931124cb979b067f852f687c11b2245ba3ad9d3da456442917411c512fa6774608fcdd9124e58515766ed0fc16c4c363bb49b424b5a8752bbbb6c7cf97517c81985b72f21dfe231f7c3cfb982fa448a18729e649b31940f2477fdb5c4e14fcae401aba6ef7b526042cdc30858939701920214f2b4100876c1bce0042183c400109d38094206402124808b54162182e3c160e93b678cc206001000012040a427c07727f48410540210000100440c529f2830c5861e04022c344e3001800800004610000c9205013027058000a91c183092afe94b7f4c34e10ca6ff7da60b9c3dccb91fda8169d0eb14010a061653ca872597711a065f39e9bb548e77180ddfdb9d54b747009c167a85b65791483ccd159db97a20c481bbc74d660e1379b9a0051214d9704ba22ec06785c4f69f5f6de71b4636a0c31000aa228530956e7d32d193f12a90c56cf5c713809e9e42fcc54cc4334b61249ebb1e10291f0f4700245128b0065ffb920124d6c094205c021e18a276814326b63a181728f188c105c02182aa614b14340502e281aa46388c105c02000011840004cc81302c0008dc800342990f7637dc24218ef53cc07a103d21416419bec204cfc71a24068893c060001aade0670c1a008574d0211c21f65beb7c2edb75e3df7f9bf8f23e8000000000000000d8b83cdb6cdcc0b75e2650de3df7fb0793c10551799d27c11a401526941c1542432421410c10813c30683221af9b6b45f02c3f4ffe5d443d0d084c7dc9ff8394c986fe783506cfc5b5ebe63c049e4dd2552974d0cfda5c83a0131356a50cdc32a8001f010221100880800155881282e0180200802409c0e15eaa4440420d7d8008334f8ce4580718cc843802b5ae1c10055e92c2213080e004000046480e88808c340361a0001aa20262be18239c09ac1b8fe430062840046c9d7ec97c40008c2f41e62ace1876b8c7b3232f9fb2889d6c085a60dca601ddf7cf4444f7915c58a0038f552448b3be9c23d5629a8163953e52612580f269e19d012088e7703654f7e655f6ffb7debde971c8599a59be211c2f97d76f88ad977c99af29c0dc50715df5477bb560e87be0849846516024600d6a94209903b258a0cb3ba1b8e0058995b24041b00840802a22484136878c81418a994c763041b00800004c100017220441b0210d81006c03827718f289a913b9beb7c2edb75e3d3671c745bdbd00000000000000352f0889a64e1a147f6681d11a765749b1ec3a31b000000000000000d5c35b77785ac0b2d8eeedc38502d041040870450040003ef917183263dc29210b73dd67428b6d1640d1a34145360113ee0cd2d6cbf62d3f6da3c131e4a59df9cb6218f45a8295adf4d38f65003ceed6fa978f78199ca2a0a77581103757228779697a34202abe402c62032010b10df24ec287258e302002364ec8c01537e7c024101900800005e9000170202202000625203e0b813829a4870dd4)) <<< 16000) + 0xccd5881060021023d1e2b9806565d88e04000738a011b9c992020c00400002ccd0ee9ba271c388e7f68a002eefe963081900800004a101e0d00e868070240360a01a0500c80800099880076a9001ffb30315e285486100995bfc604c9b48e4301685616214001aa9420200af12fe54000166301d0080000971002966200a2d86124e33a30500bdf091682649e0526523778516318b391e7a8a2000000000000000000000000000000000000001336dd91b6ec7d59512398d41531c31c11811011000c00613c3b7356b8c6f5035257637831b11d3d481f5a98b791dd3f079276528842508ae4e7b5c9b6e97b54770a80026bde8c1678d3f80f875bae337ab0e779b160220bf8ac703877c3ed7bbf56a050ad55d07eb27e7dd06003847e195f4b5b35ecce9bb3d05fe9ba1bcf8c32dad1bcf82c508417fe7b54c891dd9189cfb83d62530cc96951efd728c00e0953629940d9aa21255f1348fba8fd4a3f52f24d32230ea04020bfbf50d4e60595b2053995f80eb6e1a99adbb34b2600001fa4e1fc57c4925225b728af8d793fc5ee2f70a6902040000cfe9ed4e5a838f9dce44358db1e2fdec1020fc291efb30d9aa5b156545b8cef60d9117b0abbe9c815b30030c5b9382451f24728288066cd7880f5573778c18a6ce750c02427cd20803950fc4126101b0086f848b41324f0293291bbc28b18c59c8f3d45100000000000000000000000000000000000000098250c5084883885041042801800e0300401bbe122d04c93c0a4ca46ef0a2c6316723cf514400000000000000000000000000000000000000260963962942902942161901900060200401b85070b700f8b1c1634850e60c2680d6d32c63c430f7512300000a8c0b1477f7153c6012edb9f3a1001340e9f9924021080c349264a7e41cd1c9e8bf009307a495c59e4a1c0000ea6034527a371324a140000ea60101300e3db7cc011ed9a72fc880022020696254467469227d53ca610060c10268e1e384e060f0a1b4c438000029df3000e0040000444800161900046d2000c9840020b480c0280025c08007cd90171980100a061d191c45043c384c0808d4bbf2140731447020187593e4025101b00800b00e84546631840c9385ce28124e17380462034010c1063881f558ecfe9f45aa42e2ec68615fda65b880805d3e9852450e01563e70c614e9d42e696e9840ad61bc825c8a4cf6607b58bc073208b70b853120183104e6e860d4a9ad12b3f3d74d0c0677b6b8404fdc622af6d0244aacd7f74fe5cdaa8758bc6800118810d3a5201a0311d47ba9480eeebfd0946b91e63d4806a975329a0665317d8c4a21283d00004542000a124054460282201311cb05b382eab9385d3f82137e00e978444d3270d0a3fb340e88d3b2ba4d8f61d18d8000000000000006b090df5ecd2891f116a06a80786c3147ee22688400000000000001a386b6eef0b5816848a3823022822003afe38528aa42f58de73d9d61a9dfbc637d6b2f3742f252c0975da154983655b337c62c40552c7f2e80fbe1d067e25635463b512aed7df7c3954e3884c2b7ef762288851f140381778444d3270d0a3fb340e88d3b2ba4d8f61d18d8000000000000006b090df5ecd2891f116a06a80786c3147ee22688400000000000001a1e4f09f7faf4379075e2682a650c40438430450238233935244a5badf9f548d5cec4b1bcc1f8a6a7ecf2b1994fccea277a5016120e2be95e5e367517526ad05fd89e8728192d68f2fb9b39f62c7ed7a6045bec2bb60d033c2d0cf3259748092cd4b78e1594e1af1821b08d5450019e1fcc800a39bdb0a00012dd31270c1b00800009c1009010002f110121580882e020020080100980784803827039c3d5e4820079f0d005b4620803733ca24041700870a79ef8051133bec8a0722a938c005c0216201bf171445759282010b94ee30017008000045100012f385209d5cc00596f192009ccb81c004ef303000d6564250817008000069100d0140de06b272efcc32c7ce9b28c5f5fc59324d6de90e9c754345ce303c805322c057526aa44bdb7679fc1574b815a8d945669d1e3d3a61641152c538aa2fa3006ac77fb210a22ac01fe573b06aa01b05bcc7371753547e6f4a57fa8072003fbe128e265d8a92682a9c304af16f871a0d04ce43014f560d388a84ac4662fcd758e3ccc026b8d471c626d2c3351d3a4ae7a650c1937b4b188759a80001324e1dc69ed0a058a58cc40030010800008020000088c144afc02401b029248105c0100000cc40301401602c32c69b400c31efe2a63035515004306069a6c8a0042ccb18e0104fae3098206c021a301e07e8d10a9d57a6860ba41b342ccce2992020c804344b4aa3f9018cf15888081eadae50018aeed2000a38e012820c80400003708000d7100a0d000176900045720120a000c6520019c24005ff4800f3d9a2dec57455050c499bc77c28282832180101008536da08005378067c30000002ee0100150aa27000a7102101061b400f06e0c2038735a81823bdec9fc102013fa4185000edd149880001aa492040000b69d204e183e010e3db368c3c71489b2f9040600002581c3636dac58c1806a88e84001f2c7b2000213cb3c0b840e802208bd77fe2048c0a6b1620818045ddec9021b3c4a8f10101300cca0820d8b282840002f711313820f8042460dd8b2ee40d5d00c4c49110015a2f9024a06c4e6200711cef063800852b2201013776f7b147041f0140000a990002be200083640016248040a801c2400c120050500200800c04000f0e4008740020200001001d339)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoThirdsCase5" = "QuadParityTwoThirdsCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoThirdsCase5 private def zz2062:"s080e"="s080e":=by decide+kernel end section namespace Green24Proof.ParityTwoThirdsRows open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) def rowsChunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x153068da002029304e2ad80059dbbca05930198cba033c6e613068da0024304e2ad8001b0ecba07837a898045d4a20304e2ad80038480b2562692e801bfc6821602b196c00bf7cce207d20198cba067c9da06d202b196c03d85b205d204e2ad801df8825204e2ad8023b4b3fa069204e2ad80059dbbca01920198cba033c6e61204e2ad8023b4b3fa07c204e2ad8031b0dba2424ca5d005bfa5da07822692e802e4c0920204e2ad8029e1b19a14] def rowsChunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x103811389b468b096028102b196c018bcbaae018102b196c0019cf8ee010386d00203d404e2ad806abfe206d404e2ad8023bff6540386d002440386d00203d00198cba04084c206d00198cba015ac96500386d00207c00198cba005f38e02c004e2ad8071b3be05c002b196c023b18a4002b196c00ab9ae57068da00217068da00203d304e2ad801e8bde02d30198cba03ec4fa01d304e2ad801df88214] def rowsChunk2:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x103d504f1800a9cbe02d504e2ad8034b8918e01d50198cba002e7b2865504e2ad800fcacff6039502b196c005a5809202954ca5d006bce4fe019502b196c005a58092154ca5d0028693fe03c104e2ad80138283f202c10198cba00fecb38e05c102b196c002c7e4ca410386d0020c] def rows:List (ℚ × Potential) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 def mu:Phase → ℚ:=![(0x24fd89f / 0x2625a0),(-0x40cbf3d / 0x4c4b40)] def parameter:ℚ:=(2 / 3) def normalization:ℚ:=(1 / 0x186a) def quad0:Expression:=quadSlack rows parameter 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadParityTwoThirdsCase0.base QuadParityTwoThirdsCase0.hinges QuadParityTwoThirdsCase0.normalizationDenominator private def zz181:"s00b5"="s00b5":=by decide+kernel theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoThirdsCase0.base QuadParityTwoThirdsCase0.hinges QuadParityTwoThirdsCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoThirdsCase0.nonnegative x hx def quad1:Expression:=quadSlack rows parameter 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadParityTwoThirdsCase1.base QuadParityTwoThirdsCase1.hinges QuadParityTwoThirdsCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoThirdsCase1.base QuadParityTwoThirdsCase1.hinges QuadParityTwoThirdsCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoThirdsCase1.nonnegative x hx def quad2:Expression:=quadSlack rows parameter 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadParityTwoThirdsCase2.base QuadParityTwoThirdsCase2.hinges QuadParityTwoThirdsCase2.normalizationDenominator private def zz182:"s00b6"="s00b6":=by decide+kernel theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoThirdsCase2.base QuadParityTwoThirdsCase2.hinges QuadParityTwoThirdsCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoThirdsCase2.nonnegative x hx def quad3:Expression:=quadSlack rows parameter 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadParityTwoThirdsCase3.base QuadParityTwoThirdsCase3.hinges QuadParityTwoThirdsCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoThirdsCase3.base QuadParityTwoThirdsCase3.hinges QuadParityTwoThirdsCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoThirdsCase3.nonnegative x hx def quad4:Expression:=quadSlack rows parameter 1 1 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadParityTwoThirdsCase4.base QuadParityTwoThirdsCase4.hinges QuadParityTwoThirdsCase4.normalizationDenominator private def zz183:"s00b7"="s00b7":=by decide+kernel theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoThirdsCase4.base QuadParityTwoThirdsCase4.hinges QuadParityTwoThirdsCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoThirdsCase4.nonnegative x hx def quad5:Expression:=quadSlack rows parameter 1 1 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadParityTwoThirdsCase5.base QuadParityTwoThirdsCase5.hinges QuadParityTwoThirdsCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoThirdsCase5.base QuadParityTwoThirdsCase5.hinges QuadParityTwoThirdsCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoThirdsCase5.nonnegative x hx def pair6:Expression:=pairSlack rows parameter mu normalization 0 0 false def pair6Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair6Target:NormalForm:=CompactPair.toNormal LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_6_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_6_hinges private def zz184:"s00b8"="s00b8":=by decide+kernel theorem pair6_identity:identityCheck pair6 pair6Rewrites pair6Target = true:=by decide +kernel theorem pair6_target_eval (x:Point):normalEval pair6Target x = LocalParityTwoThirdsPairs.parityTwoThirds_pair_6 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_6_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_6_hinges x theorem pair6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair6 x:=by rw [identityCheck_sound _ _ _ x pair6_identity,pair6_target_eval] exact LocalParityTwoThirdsPairs.parityTwoThirds_pair_6_nonneg (hx 0) (hx 1) def pair7:Expression:=pairSlack rows parameter mu normalization 0 0 true def pair7Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair7Target:NormalForm:=CompactPair.toNormal LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_7_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_7_hinges theorem pair7_identity:identityCheck pair7 pair7Rewrites pair7Target = true:=by decide +kernel private def zz185:"s00b9"="s00b9":=by decide+kernel theorem pair7_target_eval (x:Point):normalEval pair7Target x = LocalParityTwoThirdsPairs.parityTwoThirds_pair_7 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_7_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_7_hinges x theorem pair7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair7 x:=by rw [identityCheck_sound _ _ _ x pair7_identity,pair7_target_eval] exact LocalParityTwoThirdsPairs.parityTwoThirds_pair_7_nonneg (hx 0) (hx 1) def pair8:Expression:=pairSlack rows parameter mu normalization 0 1 false def pair8Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r18,RewriteAtoms.r0] def pair8Target:NormalForm:=CompactPair.toNormal LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_8_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_8_hinges theorem pair8_identity:identityCheck pair8 pair8Rewrites pair8Target = true:=by decide +kernel theorem pair8_target_eval (x:Point):normalEval pair8Target x = LocalParityTwoThirdsPairs.parityTwoThirds_pair_8 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_8_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_8_hinges x private def zz186:"s00ba"="s00ba":=by decide+kernel theorem pair8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair8 x:=by rw [identityCheck_sound _ _ _ x pair8_identity,pair8_target_eval] exact LocalParityTwoThirdsPairs.parityTwoThirds_pair_8_nonneg (hx 0) (hx 1) def pair9:Expression:=pairSlack rows parameter mu normalization 0 1 true def pair9Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2] def pair9Target:NormalForm:=CompactPair.toNormal LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_9_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_9_hinges theorem pair9_identity:identityCheck pair9 pair9Rewrites pair9Target = true:=by decide +kernel theorem pair9_target_eval (x:Point):normalEval pair9Target x = LocalParityTwoThirdsPairs.parityTwoThirds_pair_9 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_9_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_9_hinges x theorem pair9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair9 x:=by rw [identityCheck_sound _ _ _ x pair9_identity,pair9_target_eval] exact LocalParityTwoThirdsPairs.parityTwoThirds_pair_9_nonneg (hx 0) (hx 1) def pair10:Expression:=pairSlack rows parameter mu normalization 1 1 false def pair10Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair10Target:NormalForm:=CompactPair.toNormal LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_10_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_10_hinges private def zz187:"s00bb"="s00bb":=by decide+kernel theorem pair10_identity:identityCheck pair10 pair10Rewrites pair10Target = true:=by decide +kernel theorem pair10_target_eval (x:Point):normalEval pair10Target x = LocalParityTwoThirdsPairs.parityTwoThirds_pair_10 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_10_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_10_hinges x theorem pair10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair10 x:=by rw [identityCheck_sound _ _ _ x pair10_identity,pair10_target_eval] exact LocalParityTwoThirdsPairs.parityTwoThirds_pair_10_nonneg (hx 0) (hx 1) def pair11:Expression:=pairSlack rows parameter mu normalization 1 1 true def pair11Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair11Target:NormalForm:=CompactPair.toNormal LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_11_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_11_hinges theorem pair11_identity:identityCheck pair11 pair11Rewrites pair11Target = true:=by decide +kernel private def zz188:"s00bc"="s00bc":=by decide+kernel theorem pair11_target_eval (x:Point):normalEval pair11Target x = LocalParityTwoThirdsPairs.parityTwoThirds_pair_11 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_11_base LocalParityTwoThirdsPairs.compact_parityTwoThirds_pair_11_hinges x theorem pair11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair11 x:=by rw [identityCheck_sound _ _ _ x pair11_identity,pair11_target_eval] exact LocalParityTwoThirdsPairs.parityTwoThirds_pair_11_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows parameter p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad4_nonneg x hx · exact quad5_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack rows parameter mu normalization p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair6_nonneg x hx · exact pair7_nonneg x hx · exact pair8_nonneg x hx · exact pair9_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair10_nonneg x hx · exact pair11_nonneg x hx end Green24Proof.ParityTwoThirdsRows private def zz2063:"s080f"="s080f":=by decide+kernel end section namespace Green24Proof.ParityTwoThirds open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ParityPhaseAggregation (rowsAdmissible) private def zz189:"s00bd"="s00bd":=by decide+kernel theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack ParityTwoThirdsRows.rows ParityTwoThirdsRows.parameter p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityTwoThirdsRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse ParityTwoThirdsRows.rows ParityTwoThirdsRows.parameter p q same x] exact ParityTwoThirdsRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack ParityTwoThirdsRows.rows ParityTwoThirdsRows.parameter ParityTwoThirdsRows.mu ParityTwoThirdsRows.normalization p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityTwoThirdsRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap ParityTwoThirdsRows.rows ParityTwoThirdsRows.parameter ParityTwoThirdsRows.mu ParityTwoThirdsRows.normalization p q same x] exact ParityTwoThirdsRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible ParityTwoThirdsRows.rows = true:=by decide +kernel noncomputable def massCorrection (U V:ℝ):ℝ := ((2 / 3:ℝ) * U - V) * ((-0x22ad5dd / 0x1c9c380:ℝ) * U + (0x1aa653d / 0x1312d00:ℝ) * V) - (1 / 0x61a8:ℝ) * (U + V) ^ 2 theorem correction {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (1 / 9:ℝ) * deficit u + massCorrection (mass u) (mass v) ≤ deficit (interleave u v):=by have hc:=ParityCorrectionAggregation.correction_of_local_rows h3 h5 ParityTwoThirdsRows.rows ParityTwoThirdsRows.parameter ParityTwoThirdsRows.mu ParityTwoThirdsRows.normalization rows_admissible quad_nonneg pair_nonneg u v hu hv have hmu0:ParityTwoThirdsRows.mu 0 = (0x24fd89f / 0x2625a0:ℚ):=by decide +kernel have hmu1:ParityTwoThirdsRows.mu 1 = (-0x40cbf3d / 0x4c4b40:ℚ):=by decide +kernel rw [hmu0,hmu1] at hc norm_num [ParityTwoThirdsRows.parameter,ParityTwoThirdsRows.normalization] at hc unfold massCorrection nlinarith only [hc] private def zz190:"s00be"="s00be":=by decide+kernel theorem massCorrection_lower_bound {U V:ℝ} (hV:0 ≤ V) (hlow:(6 / 5:ℝ) * V ≤ U) (hhigh:U ≤ (0x95 / 0x64:ℝ) * V) : (0x42703f5b / 0x68c6171400:ℝ) * V ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [mul_nonneg hV (sub_nonneg.mpr hhigh)] theorem interval_nonneg {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(6 / 5:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (0x95 / 0x64:ℝ) * mass v):0 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_lower_bound hV hlow hhigh nlinarith [sq_nonneg (mass v)] theorem massCorrection_coercivity {U V:ℝ} (hV:0 ≤ V) (hlow:(6 / 5:ℝ) * V ≤ U) (hhigh:U ≤ (0x95 / 0x64:ℝ) * V) : (1 / 0x12c:ℝ) * (U - V) ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [sq_nonneg V,mul_nonneg hV (sub_nonneg.mpr hhigh)] theorem coercivity {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(6 / 5:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (0x95 / 0x64:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_coercivity hV hlow hhigh linarith end Green24Proof.ParityTwoThirds private def zz2064:"s0810"="s0810":=by decide+kernel end section namespace Green24Proof.ScaleTwoRows open QuadraticCertificates ExpressionCertificates open ParityPhaseRows (Phase Potential weightedQuad weightedPair balanceCoefficient) open FullPhaseRows (area pairProduct scale coordinate expressionEval_append expressionEval_scale coordinate_eval area_eval) open FullPhaseSemantics (pairProduct_eval) open FullPhaseSymmetry (reversePoint swapPair area_reverse) open ParityPhaseSymmetry (weightedQuad_reverse weightedPair_swap) def stretchFactor (p:Phase):ℚ:=if p = 0 then 2 else 1 def stretchedArea (p q:Phase):Expression := [(1 / 2, .area (coordinate 0 (stretchFactor q)) (coordinate 1 (2 * stretchFactor p)) (coordinate 2 (3 * stretchFactor q))), (1 / 2, .area (coordinate 3 (stretchFactor p)) (coordinate 2 (2 * stretchFactor q)) (coordinate 1 (3 * stretchFactor p)))] def cost (p q:Phase):Expression := stretchedArea p q ++ scale (if p = 0 ∧ q = 0 then -1 else 0) area def quadSlack (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool):Expression := weightedQuad rows p q same ++ scale (-1) (cost p q) def pairSlack (rows:List (ℚ × Potential)) (μ:Phase → ℚ) (p q:Phase) (same:Bool):Expression := weightedPair rows p q same ++ pairProduct (balanceCoefficient μ p q + if p = 0 ∧ q = 0 then 64 else 0) private def zz191:"s00bf"="s00bf":=by decide+kernel theorem stretchedArea_eval (p q:Phase) (x:Point) : expressionEval (stretchedArea p q) x = 2 * kernel ((stretchFactor q:ℝ) * x 0) (2 * ((stretchFactor p:ℝ) * x 1)) (3 * ((stretchFactor q:ℝ) * x 2)) + 2 * kernel ((stretchFactor p:ℝ) * x 3) (2 * ((stretchFactor q:ℝ) * x 2)) (3 * ((stretchFactor p:ℝ) * x 1)):=by simp only [stretchedArea,expressionEval,List.map_cons,List.map_nil,List.sum_cons, List.sum_nil,atomEval,coordinate_eval,Rat.cast_div,Rat.cast_one, Rat.cast_ofNat,Rat.cast_mul,mul_assoc] ring theorem cost_eval (p q:Phase) (x:Point) : expressionEval (cost p q) x = expressionEval (stretchedArea p q) x - (if p = 0 ∧ q = 0 then expressionEval area x else 0):=by simp only [cost,expressionEval_append,expressionEval_scale] split_ifs <;> simp [sub_eq_add_neg] theorem stretchedArea_reverse (p q:Phase) (x:Point) : expressionEval (stretchedArea q p) (reversePoint x) = expressionEval (stretchedArea p q) x:=by rw [stretchedArea_eval,stretchedArea_eval] simp only [reversePoint,Matrix.cons_val_zero,Matrix.cons_val_one, Matrix.cons_val_two,Matrix.cons_val_three,Matrix.head_cons,Matrix.tail_cons] ring theorem quadSlack_reverse (rows:List (ℚ × Potential)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (quadSlack rows q p same) (reversePoint x) = expressionEval (quadSlack rows p q same) x:=by simp only [quadSlack,expressionEval_append,expressionEval_scale, weightedQuad_reverse,cost_eval,stretchedArea_reverse,area_reverse,and_comm] private def zz192:"s00c0"="s00c0":=by decide+kernel theorem pairSlack_swap (rows:List (ℚ × Potential)) (μ:Phase → ℚ) (p q:Phase) (same:Bool) (x:Point) : expressionEval (pairSlack rows μ q p same) (swapPair x) = expressionEval (pairSlack rows μ p q same) x:=by simp only [pairSlack,expressionEval_append] rw [weightedPair_swap] simp only [pairProduct_eval,balanceCoefficient,and_comm, swapPair,Matrix.cons_val_zero,Matrix.cons_val_one] push_cast ring end Green24Proof.ScaleTwoRows private def zz2065:"s0811"="s0811":=by decide+kernel end section namespace Green24Proof.LocalScaleTwoPairs def compact_scaleTwo_pair_6_base:CompactPair.Quadratic:=⟨0,0,0⟩ def compact_scaleTwo_pair_6_hinges:List CompactPair.Hinge:=[] noncomputable def scaleTwo_pair_6 (x y:ℝ):ℝ := CompactPair.expressionEval compact_scaleTwo_pair_6_base compact_scaleTwo_pair_6_hinges x y def compact_scaleTwo_pair_6_cuts:List ℚ:=[] theorem compact_scaleTwo_pair_6_check : CompactPair.expressionCheckPSD compact_scaleTwo_pair_6_base compact_scaleTwo_pair_6_hinges 0 compact_scaleTwo_pair_6_cuts = true := by decide +kernel theorem compact_scaleTwo_pair_6_representation (x y:ℝ) : scaleTwo_pair_6 x y = CompactPair.expressionEval compact_scaleTwo_pair_6_base compact_scaleTwo_pair_6_hinges x y:=by rfl theorem scaleTwo_pair_6_nonneg {x y:ℝ} (_hx:0 ≤ x) (_hy:0 ≤ y) : 0 ≤ scaleTwo_pair_6 x y:=by rw [compact_scaleTwo_pair_6_representation] exact CompactPair.expressionCheckPSD_sound compact_scaleTwo_pair_6_check _hy (by simpa using _hx) def compact_scaleTwo_pair_7_base:CompactPair.Quadratic:=⟨0,0,0⟩ def compact_scaleTwo_pair_7_hinges:List CompactPair.Hinge:=[] noncomputable def scaleTwo_pair_7 (x y:ℝ):ℝ := CompactPair.expressionEval compact_scaleTwo_pair_7_base compact_scaleTwo_pair_7_hinges x y def compact_scaleTwo_pair_7_cuts:List ℚ:=[] private def zz193:"s00c1"="s00c1":=by decide+kernel theorem compact_scaleTwo_pair_7_check : CompactPair.expressionCheckPSD compact_scaleTwo_pair_7_base compact_scaleTwo_pair_7_hinges 0 compact_scaleTwo_pair_7_cuts = true := by decide +kernel theorem compact_scaleTwo_pair_7_representation (x y:ℝ) : scaleTwo_pair_7 x y = CompactPair.expressionEval compact_scaleTwo_pair_7_base compact_scaleTwo_pair_7_hinges x y:=by rfl theorem scaleTwo_pair_7_nonneg {x y:ℝ} (_hx:0 ≤ x) (_hy:0 ≤ y) : 0 ≤ scaleTwo_pair_7 x y:=by rw [compact_scaleTwo_pair_7_representation] exact CompactPair.expressionCheckPSD_sound compact_scaleTwo_pair_7_check _hy (by simpa using _hx) def compact_scaleTwo_pair_8_base:CompactPair.Quadratic:=⟨0,0,0⟩ def compact_scaleTwo_pair_8_hinges:List CompactPair.Hinge:=[] noncomputable def scaleTwo_pair_8 (x y:ℝ):ℝ := CompactPair.expressionEval compact_scaleTwo_pair_8_base compact_scaleTwo_pair_8_hinges x y def compact_scaleTwo_pair_8_cuts:List ℚ:=[] theorem compact_scaleTwo_pair_8_check : CompactPair.expressionCheckPSD compact_scaleTwo_pair_8_base compact_scaleTwo_pair_8_hinges 0 compact_scaleTwo_pair_8_cuts = true := by decide +kernel private def zz194:"s00c2"="s00c2":=by decide+kernel theorem compact_scaleTwo_pair_8_representation (x y:ℝ) : scaleTwo_pair_8 x y = CompactPair.expressionEval compact_scaleTwo_pair_8_base compact_scaleTwo_pair_8_hinges x y:=by rfl theorem scaleTwo_pair_8_nonneg {x y:ℝ} (_hx:0 ≤ x) (_hy:0 ≤ y) : 0 ≤ scaleTwo_pair_8 x y:=by rw [compact_scaleTwo_pair_8_representation] exact CompactPair.expressionCheckPSD_sound compact_scaleTwo_pair_8_check _hy (by simpa using _hx) def compact_scaleTwo_pair_9_base:CompactPair.Quadratic:=⟨0,0,0⟩ def compact_scaleTwo_pair_9_hinges:List CompactPair.Hinge:=[] noncomputable def scaleTwo_pair_9 (x y:ℝ):ℝ := CompactPair.expressionEval compact_scaleTwo_pair_9_base compact_scaleTwo_pair_9_hinges x y def compact_scaleTwo_pair_9_cuts:List ℚ:=[] theorem compact_scaleTwo_pair_9_check : CompactPair.expressionCheckPSD compact_scaleTwo_pair_9_base compact_scaleTwo_pair_9_hinges 0 compact_scaleTwo_pair_9_cuts = true := by decide +kernel theorem compact_scaleTwo_pair_9_representation (x y:ℝ) : scaleTwo_pair_9 x y = CompactPair.expressionEval compact_scaleTwo_pair_9_base compact_scaleTwo_pair_9_hinges x y:=by rfl private def zz195:"s00c3"="s00c3":=by decide+kernel theorem scaleTwo_pair_9_nonneg {x y:ℝ} (_hx:0 ≤ x) (_hy:0 ≤ y) : 0 ≤ scaleTwo_pair_9 x y:=by rw [compact_scaleTwo_pair_9_representation] exact CompactPair.expressionCheckPSD_sound compact_scaleTwo_pair_9_check _hy (by simpa using _hx) def compact_scaleTwo_pair_10_base:CompactPair.Quadratic:=⟨(-11 / 50),(11 / 0x64),0⟩ def compact_scaleTwo_pair_10_hinges:List CompactPair.Hinge:=[⟨(-11 / 0x190),1, -3⟩,⟨(11 / 0x190),3, -1⟩] noncomputable def scaleTwo_pair_10 (x y:ℝ):ℝ := CompactPair.expressionEval compact_scaleTwo_pair_10_base compact_scaleTwo_pair_10_hinges x y def compact_scaleTwo_pair_10_cuts:List ℚ:=[(1 / 3),3] theorem compact_scaleTwo_pair_10_check : CompactPair.expressionCheckPSD compact_scaleTwo_pair_10_base compact_scaleTwo_pair_10_hinges 0 compact_scaleTwo_pair_10_cuts = true := by decide +kernel theorem compact_scaleTwo_pair_10_representation (x y:ℝ) : scaleTwo_pair_10 x y = CompactPair.expressionEval compact_scaleTwo_pair_10_base compact_scaleTwo_pair_10_hinges x y:=by rfl theorem scaleTwo_pair_10_nonneg {x y:ℝ} (_hx:0 ≤ x) (_hy:0 ≤ y) : 0 ≤ scaleTwo_pair_10 x y:=by rw [compact_scaleTwo_pair_10_representation] exact CompactPair.expressionCheckPSD_sound compact_scaleTwo_pair_10_check _hy (by simpa using _hx) def compact_scaleTwo_pair_11_base:CompactPair.Quadratic:=⟨0,0,0⟩ def compact_scaleTwo_pair_11_hinges:List CompactPair.Hinge:=[] noncomputable def scaleTwo_pair_11 (x y:ℝ):ℝ := CompactPair.expressionEval compact_scaleTwo_pair_11_base compact_scaleTwo_pair_11_hinges x y def compact_scaleTwo_pair_11_cuts:List ℚ:=[] private def zz196:"s00c4"="s00c4":=by decide+kernel theorem compact_scaleTwo_pair_11_check : CompactPair.expressionCheckPSD compact_scaleTwo_pair_11_base compact_scaleTwo_pair_11_hinges 0 compact_scaleTwo_pair_11_cuts = true := by decide +kernel theorem compact_scaleTwo_pair_11_representation (x y:ℝ) : scaleTwo_pair_11 x y = CompactPair.expressionEval compact_scaleTwo_pair_11_base compact_scaleTwo_pair_11_hinges x y:=by rfl theorem scaleTwo_pair_11_nonneg {x y:ℝ} (_hx:0 ≤ x) (_hy:0 ≤ y) : 0 ≤ scaleTwo_pair_11 x y:=by rw [compact_scaleTwo_pair_11_representation] exact CompactPair.expressionCheckPSD_sound compact_scaleTwo_pair_11_check _hy (by simpa using _hx) end Green24Proof.LocalScaleTwoPairs private def zz2066:"s0812"="s0812":=by decide+kernel end section namespace Green24Proof.QuadScaleTwoCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x4d95, -0x8c8e, -0xd2f0,0x19b6], ![-0x8c8e, -0x22c59,0x5910,0x6a23], ![-0xd2f0,0x5910, -0x3774c,0x8ca0], ![0x19b6,0x6a23,0x8ca0, -0x4650]] noncomputable def hinges:Hinges:=[(-0x198,l6),(0x13a7,l4),(-0x4fb,l10),(0x7988,l14),(-0x1460,l17),(0xf9d8,l15),(-0x4650,l27),(0x4650,l29),(-0x7988,l25),(0x2ac9,l30),(0x4650,l33),(0x4fb,l38),(-0x4650,l35),(0x4650,l37),(-0x13a7,l34),(-0x2ac9,l43),(-0xf9d8,l41),(0x4ca,l46),(0x4650,l51),(0x198,l60),(0x1460,l62),(-0x4ca,l64)] def normalizationDenominator:ℤ:=0x2ee0 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x4650,l27),(0x4650,l29),(0x4650,l33),(-0x4650,l35),(0x4650,l37),(0x4650,l51),(0x7988,l14),(-0x7988,l25),(0xf9d8,l15),(-0xf9d8,l41),(0x2ac9,l30),(-0x2ac9,l43),(-0x1460,l17),(0x1460,l62),(-0x4fb,l10),(0x4fb,l38),(0x13a7,l4),(-0x13a7,l34),(0x4ca,l46),(-0x4ca,l64),(-0x198,l6),(0x198,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x88703300400000000050248020000000004406200800001cc4102a4c04000000000440720080000000c8004c804000000000c80720080000000036014802000000000340d20080000002609014c0203182302b00f240140000022084068c03000110460a02a400c0000001306038c02000000000440e20080000000022014802000000004830330040000001a0d038c020000a43409022400c000000000903880200000002418063008000000001a014802001f03c0840784010003c0841a0271004000000000240620080000008828030c03000150320a01a400c0000001905028c02000000982901a300c0000000015038802000000000980520080000001105028c020000000441c0a3008000000000d038802002a06814c07a40100000014848070c0300000000054062008000000120d038c020000c44409022400c0000000121c0cc0100000000003032004000000012140cc010000000281405300800430a011014d004000000000050320040000000001c0c8010000002a0c013300c0000000009024802000000028140b3008000000098004c8040000000009807200800001f150d029002000000461500a300c004d08c1200c900400000004c24063009420a404200335006001582405809d401000520a81200f5004001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x440d20080000003609014c0200000002a00132010000000002a01c80281c71c60c09644018000001c824058c03000000000640620080c210a18805c10050000000007805200800000000050348020000000003409200800000000050188020000000443c0530080000138110058c04000094260900b400c00000000780248030001047431024400c000010c2202f0c04000000000240720080f208a0b40631005000006a04401430100000019024030c0300006804100263014000001a044038c03000000007850330040000001916014c02001845804c05340100000000002c0c80100000000009032004000001a0b404cc0300000000054092008000000191602cc02000000000840620080000211e070290020000000b8640e3008000000002e014802000000098440e30080061110150399004000000000740e200800530d02401e9004000000520a01c300c00841841e0159004000000044180630080000018868070c030000000a8540e3008000000002a0148020000000c8740e30080000000032014802000130861a01a400c0004c218680a900300000008c380e30080000000021038802000009884340540080000018828070c03], #[]⟩ def dynamicCode : Nat := (((((((0x34b0821c48758b2635e58e02c2404b70950c0d00400982f4c0a265c9d9a58b5f0a444d141100e9e81844ff68b16381a2c0b7120808908476081064631dab458000aa4ef43ca6e8042104869807f40984ae38623eabde4eb1c11bfb6e54a00e057b58e73bc810200c03acf15041986489bfda200000b9ebc4203001e4fb0748e52a1ac9008520d00001e320ea03e108cad213e2a6ecc4a1d8e3030606718869c03eb7f57e37810c3031c09fb2adccd03239de99c17ae7692c336943113da3b14d080ce310d3807d6feafc6f022829fb9ff81b05b185052fc3300139481d6679959cfd9325a1b57c88a21cd152199811644b1c20b0f69d01a8e3061bdfe49f5c188188949b71859a70576731cfcdec8e0a48ae2b2a9902825518eb5552216002976e198f700711ec73ffb5b2f3c562e085c100000205208c12000558200124241d027c48dc48f15f956c7f44088bfaf825204f52c9d484baea299770eec35288465ee4ea0e605cd428c1c6878cdb20f53e9c3d0bc72b4504e348b11f68f0ccf1011cd7b4af4bb7b92039c1dbd37a75c21e0e710b985b8008cf503c4067dbfb061e0db7370a99488c1b57dbc9d2e48296178bdd09cf33d6ea50c7f1cc609f781816e5e283726820afd8601e00801924a181c0100000b720e6220720500026518133197b5524ca15254eaec797101085de846dd01f9dbcac1e1db281f592c4f48495a4f250d0e81a4028d37b713ead28911918494a0801f9c37c920c3092de32497470e004554b156cf606985266db01404411f00e53fe8250205f0035472a332608db03a2549a4c20be2a0d21b504d0d4c340dd3cb2091b5d414a24e261c90469cfcc7dcc977c40804be89b1f0f5b062d84015b3cf1e1309d956c2030fcbf9ecd1d0725c101167af95a61bed3b10857688fd2542f942bc71f2a8769a79c410034000055e41c4540e012000650361ada41620156a0904870318a7e4103000eee4bafcef914000c025d26c458202cf826a76d654002b8c854a94bcc82afc5ee05442003fcbe218c30e1884601bc2400040878a00645047c7040aeef1809768280400830115a0800931207804000035081084e86004ec2dd0ec1928205d61e506f06e201bc6769980ce5d041480cee2598dde20039304f990d1000400666c9f30fc00003b98fffa0808402db21a9f41870d024100da189d7ffcc1422b43cb1ead4da5250643b4efb2ea01200bcd91577024f3750ca2624bb0bfef4ff6c758f63200a003f872bd6d7cbfb8f873b012b73adf0a44e9455e7a00600adf0e9991af288101887f37c49fa6d3eba5456b620006ca5ddd131e42a73051cb632cd347446aa476fb4ec0097b3f3115670649363910063c9f74d8514e08d00839584e000045520d83a06e11036828001ad0d0a33c9ad8f082f734eef452a074ef91af238acfd62c6ca82c8ae5e385fa158ed977cc28570a9bd7e70ad905398734948a79320e0100723d554d5a99e60bcb4047e27b7c7fe680058d503417edef97a2ac1433a19c4490d4a47e2e0d074131b2fa95af681f8906200731429e941029d888e185858a10cd91409f1d0c0433a8a0110d800ce30200100000f120d83302105d0b00c354c6022cb9cf6e1b374e8e29075b99a25583d60227cd13642849fc9e1f772529e5801cf6bdd8e0953939ec29632def7c64a2e6220250146333276916ec523adb018401f01837b7b3306acc5e15e0b88000f663ceed6fb2d6fa0ce4368443ac19e48a75390546c0e0d357146013b70a60617fb488c40c42a0d79bf4a278ed249c7a9aefdd934bc97410468426ce26e18cb9472000000032450a40a284202480300280001f181c0053efaf6bfd311abc5cb19d191f3791207d17ef744c6385bc6e40e834500025c2000ca44048540d612000b1b20d423e158df7dc4d69f609142431ce37a809017e2051757b6a23452608204882262934773ef0a1fa0e4386d012a20147cdd2900c4756940784d31d795028a5e29b1b9017562404103985dd2e08707617000027038133bed7101332a330c111f32e180249846140e6f5ec10035d98a5053c049151096dc8d0f97a406acc783004800016520d24a0680983382819805035f2053c1c22c9466c3059385b30508c43ad5100076e1121c0a34123628040583dd415c9d25c501515d86aa91cb06c0c1a5a3cca945373051641b4d71438e766141a060e8a18232082081e211607340981280c14014696b1e4d293ee1040cea2c78f3a50eeccc701d0c0600b870270c0f00800007210650de9688b52c82e969438cdb0a0ce8322860a052811586820888a0b03288894040880434b9eb4820ad42c7ecc4a1e38834109a0703d5b0c06ab927080e00800006d90640d0318480008b4d924a8e71235626c248aec67c8a2073b304026415a060898d8850044ed40e015b190208a4b41488181601c0000ac19106c9c82048d7bfc710484fe1c1241b00a00591b114004e05c3004c96b1041360491753dad71c160180000a690270981300f889c21b470ef5dcb8c187aee40c10329e408228fba84000ca790400693211051b61b101b1ca05c07000028a40023ac83114f061893c20605fcc284685562833464e38008314301269dc28011f64a8a859c0902d39a0a00800004c08309ac180a60be3b0271982f0ae88641f4f726c96103041c9a7ba3ae9000f2a87305b3487022b5) <<< 16000) + 0x4e21594e4280555e3bf1a1860800108959de6ae28002a67fdc4eaff9e97f23828c13ad00316ae24d12a6a7238889a644310884030040100ba13808008020000088f0461096059900807f40a0c6281e01000007b20b82b05b1182d06c164240b00b0570582b00e071c3160b09c20253a90008302011c3004a201c01081dbd88046aa202e55040d6ba048201a01000008c20aa1381b20011359ecac00a75c41b6d5e82e0746f28dffc5f0fc8d289003a074b57dbbc42f21bd5d626e158f08e1e05866cb95a4d9bd81019c07e5ae4367e22f15e16442a9dc14952c3d89e8781c1796c1730479adfa09681c58cb8a460bf65315a4e357a024ccf72ca029c1f7407b94f7816d710a5d1a55f31636588797755eaaa314c52e8405a68044502001000007c40011c882a0ac04c3744a3fce38d061dbc56e5424137ff68a08c456acc6afa803a97a19a01f72c404005fe6e0f6c593ee402b2fd6ed6241ffc8c9973aa73ca8efd13a082aa14012b385b60428fa89ef2890d52f10700bb3abec6d36a7d5910f207647b0040b9afcc47a949842bdd35c12c602861364cf4dff886ced0c6491851b460142061c18102082030a4820698480120a07804000025c8288c8078440420a0004bd20a64b05209d804bf24002c9004331008c5034021a2816cc80c0dca1879eaa1c20097a8120a08804000027cf034289fa2cb82ef2f95b44c5441c5c7d360e29872c063f4d38c3da403fa28edf7e7e0035c6e273efde4b5f635344950b42a5f86e95e2a32adb3042b1e84110a9926688e93a0ad4d60e63e235b493149bd98a4a13659ac4441500b3fdf23a03c272433a43308c851fe0000d2480984e84091e8e10272420a8ee8302038110125af212860880428462a0708377182b8d0406b981c0452c09430380200001524144440a01a01e090108280007408278881383409a0a0006d3200241a409c4604c03b085fab2cf4b893bea38163a687e92c245a331025d64190fb8a4701ddbdd87257b6528f7e150c15cb3027d8f88dd1e0a669bca583019f0e744b3001a5589cc9a74fd782c4100997e09af586210d0540232d6d6a6b7b187e203cafae037dbd2db0921af8303084a2ea6ae7e2c608111b67172ad73ed2ac194fceb2c96e4441c1a63a0380307bb55f6c68edc131dbb27796c5f8cb2a83ab29c0519c6216e28706f828b4f88b0302390009ae1c002b2012880780430def84805ce400bae04c303001186e794808188424181c00800005920001c24130360621b04b0d80986c12817c0cb6503c539088977d636f5b1e1fc402858228699ca49604807bd8b7eed99bc9b589a01719f8bb5695c6e403eebd237dd69a825808a560a401aab3f9e449f57e0310bdb190013aecf54ff2737cee6a6aca11c01770430085f3d2b6bf60d8fc74d105763f3b77b000401be2ac7bfbd1d022e4a3e3273a9e755954a8dd3cb04a03ce31dd2142429871f8711018010046061b99e05d184800e810019a400120c0700400002548000691049210240480015bc82394c11837a52e28809d0a1054ae4230c0d0084007e87033ea120c0b00400002a1a2450a1a06d9718010ce011880780400001e88228a8110440861a0420d009848104240800203f0100010f1000a023c6203bebb1b9fb7e618552d045f85a3d658176ada74000416ebd91389e25070e4e7881c7a7e8a35d60eb48ce5f00500c04e3567358dd7cb9e4e0ee740ebd131f0011d74580080f53c3cc996f21468d7c60ab73d17448e6ec571dfb405500519d4785812d527b0f36fde08d90ff42185f21f464e6b012c11e139f686ec460302eb458a43656fc326e5808795a50000046d200271e4009e64c0c5a4b51c76d3cff90ba5bdbf370f48c0235f460602e2feaf8bbc7ef8d95db4e3aed9169bdd826e34501043332ba320431105a86cdb68177aa39b271c0100038f9634073b99e09c2eecb69b21fdeefa7921441142fa34eede0d10774f9e2e8fee4ad2f7246c726102cdca1be0ffc0cbc84ff8132f4d0499c645080175f9747ee2fd0ed1a24c092bd8fede0dae112260880000914400baf0801d97180941c4cd011bde4d02f08005092ec74b6d537676af0c6fc205760330606b5986628c120402b7201c447b8254486fe8020095768071575615f231049006646b5d33e83d42686b2412f482f8cc9ef829e83c5e8dfd6d164f1fed16639491504612192fc0c635e7026e999a4b860ca41817522f456122db4fe1848fadcc7510c5711cf87ec08101a0b0ddbce587b8833558801b258e72230573bfdebac00022a9182895db885bd5854c2001bda02787784cb2a2213ca04935c088cbe91ae730e2a88e2434dcc1c0fb4cce3235a2d2c3cd8492ab33bb5000c2840c9e962324760e015269c8518c30906541be081083486f5a8119bf4ba82c3aa6acfb780e74c1750018dcdc22b36eb7ed74a7c3606e996288d48f26d87abd635b4540625f19863a00cb983584cc62608a00540a00034e202e1a00068d202e3303e09c0442b7ea988797ce8ae56af0e7c4acb0782828477e859ae2961d00ce88ce0b7f90cd4bca8300b47adb2937062f29b62a0972a8c9f221bc2800b536dfabeea74c94404104631d9ae6b9c2018fec8aacb1f6acd368ab72336c09f2ecb88202b89d5fde82f42c37aa99138a85ab396cc704f2a51fc79bb8b2cab5c2f599b5983652c881ec60be5a8f4402c585262008c478c080172573410272388000091bb5610400fa0c5032058a18358816d3c509d1440838860441d0025180c00840b2fa8cf6b4478b07c30796a5a08200186b84df87ed)) <<< 16000) + 0xab099eb45a430726876654266f0a9b51eed873041c637a8f25a0fdadb8c575b58ca00d8805a39d69cab410500ab6404001eb35adb2ca47f6a0694827c00296598ecc39d1d26c42908c30c42a8000313207a1bb1d127542b73e358eeac3066ece4e4d014e102a4181239e477ac22ee56768608ca4bd78e3fa01a4f43021fc01f29ff4dacc6c100594b190f5ff3db5b00403f680900bcfe203e2208f86f4b5d2fd1066ca17a7cdf859b2a8e208a1c8c1d897761fc4462b8c6c61820993517be2b852e820660389826ae1c8b77fefc80a0409aa89d47300039cc00c09eafc08f0622cc061ba1c00b2885aef9de36767a2300ceedccd702e5e126d750128840858199c96bc0d45fcbc89bb25b24d388258800000c4881e08c0ec1782f9bc6042b09a0a414202daa1802da200340881543038011a3f8487107d2686282302d0e8809bf8701e148cc181a0100000bd20741b03901cb96214016f2c19030d9980000000000000000000000afe5b1eef7b76c400000001b50ec1a23c91c3103142381240bb4ec3f85e753907c8c35bbb783080b32b857fe60ff420c32d029a73d919b6d98e7b116048f21ef92086d8542e30a0105204f420610db0a85c2846ce3ed19c703212df96ec0016e36017a120141090150000294788942cb203a8381735450468f2004365941038020024020000ba20701381441ed92e7d3f2a4b5704637a6091c00f6363b7c798de34acded060e30047cfd159a3740cf5d16521c2c320f6c973e9f9525ab8231bd30785a7791049aabc6dd42e606b81c704753a7cfd608ac771487dda861e00d91440bc214dad5e9a61fa35dadadf8b16b702ed28d2b380318aa205209d2c330002862440f0ac488e08e0028000b5300078040000310c0a61e0891c01681c600d20b0d20aa3c2e43f430521513c015a9c300cdb0a4000900a2050c644092b0480e6adcb0c9881e16b8128000b53000780400003108000fa1e390ac7113a32c80fc06081008010e695080d00400005090370500039e90360d0006341000e49200292e40a82400315e4006794800f0e10351d80180a8813705094e80a0da011c07af81204078042881390e1150c285a1b0a0fe4e920407004000023081a04c0cc160640b0310581800c0bc0743a09824453ac286c5b090bf4e8e15a001801b5800130c0780438a0af0711b97861e7482c23e5ca0120c078040000260e0c2dba204195520197c28c085904700057e2800f44100067d800138e0880400003e4c061f5060da18841012a101069618300a125080f00861430d901d7200c2777820305e0305fb80a0093a10019ea13840780400003848170680b4240580a02b0501502800084480026110291181408809c2604c03b1d1035d8129f3301b704cb293f76adfdd098d04d97583a1c2a034caea7e33c0761f88b1bdf6eee1f0b9106d9ff375440bc0970c2ee215b84b3e5e89ed96f3dea3e1ca745824821812c9ed27ec029b872d1ca4a891aad7bfd4317eaf40a29060160fe3be8bf2f5024d9bc9dde8db987a3095ea347430208c6052e52fc04ebf354cac34af99e3c6fc138031fe1e8b0c1667acda4c5dc9f9a28be8e52229e801f5d66a9432c8a6163815810400503851c6ca040472120607804000024c81284c0902603a1301c01d8e059c709d84840f2ed0023140f0085885ff392acc3856bdc2d2731fa0b0102aa82d0a904219cb1429015be2e61609059e6eacd4b7abe8f330180bd00504007fdd7c0f5362d2c91b7cc0d8858031e1b16c6658791fe010b1a6fc41801f3286ad43fd634c18025893fb202b309d7c274e2d4255d5f1a317600d75a144fb4dc55889a157ab0c28da2f80003cb203432018050002461023218110ac08427c09e50221818008a2141628a3880c3ec916102b840b03a84a181a0100000a420401b01f09e061b31400b1e200061430056440024180f00800004c101e0d80e84c07007c3e08044501c011835abc97ed085518eb69913766010f32043d2a90f20816ac701cb550c853a8872e74392c3fd4ded1268da6155a309b65020325309c7340d69abee793e3f14c6301a12d9349284f32f0bc8306a92a093e8cac543de49a0f6a12ce2c8332d290b4051d45cbaeb406447d74e5800f1e9be83a0393ed266918a5b9580000f4cc0a83a3822ff1018a00206599024100d00840a0b13015494404a291c00d2840293000944038020000154406c340002cc40687403232018090002f5101711000419180c5b2820455c07000e186021ea4500becd419450400210100100440300401002c1200003720000e84054640282a0131100906c044240200a00f050000ec900155c20038ba6a32fff4defd4466111e8000000000000000000002811431821811411010c00801119b42bccee675a279635af79ef431ca283f666d941fcf39b8e318a97090ec0182b5b30a10cdb0104f3c428098cf10019b606008bd54467181100851470f8064452328600000001807e0388e0e51898375e979de0000000000000000000000000c11648cff3bde08aa0e8d600000000000000000000002a31c31830c11c0140000512c280200da1e9bc247b9d0a17d3b245fa3c503b6c100229a6000e00850e1296247533b94288358a100338481d3af94004402000016440381601a0ba1d4672475974a15dfe2458bdc501d5510013842c101c008a1c215248ea6772851161942015d4903a75e12840880400002d88000c8900c0d0001ba90005eb2000dfa402c840143a0091900406801c2400c12005010020080026a08018c80084400202000010027609)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 23 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadScaleTwoCase0" = "QuadScaleTwoCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 23 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadScaleTwoCase0 private def zz2067:"s0813"="s0813":=by decide+kernel end section namespace Green24Proof.QuadScaleTwoCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x233e, -0x8c8e, -0xd2f0,0x1c68], ![-0x8c8e, -0x1e80a,0x4626,0x7224], ![-0xd2f0,0x4626, -0x3774c,0x8ca0], ![0x1c68,0x7224,0x8ca0, -0x4650]] noncomputable def hinges:Hinges:=[(-0x198,l6),(0x13a7,l4),(-0x4fb,l10),(0x8613,l14),(-0x227a,l17),(0x12e3d,l15),(-0x4650,l27),(0x4650,l29),(-0x8613,l25),(0x2a17,l30),(0x4650,l33),(0x4fb,l38),(-0x4650,l35),(0x4650,l37),(-0x13a7,l34),(-0x2a17,l43),(-0x12e3d,l41),(0x8e6,l46),(0x4650,l51),(0x198,l60),(0x227a,l62),(-0x8e6,l64)] def normalizationDenominator:ℤ:=0x2ee0 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x4650,l27),(0x4650,l29),(0x4650,l33),(-0x4650,l35),(0x4650,l37),(0x4650,l51),(0x8613,l14),(-0x8613,l25),(0x12e3d,l15),(-0x12e3d,l41),(0x2a17,l30),(-0x2a17,l43),(-0x227a,l17),(0x227a,l62),(0x8e6,l46),(-0x8e6,l64),(-0x4fb,l10),(0x4fb,l38),(0x13a7,l4),(-0x13a7,l34),(-0x198,l6),(0x198,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0xd8072008000000003a01480203182302b00f240140000022084068c0300000004c180e30080000000011038802000110460a02a400c000000002201480200000000483033004000000291301cc020000000a45c073008000002488c050c03000000068340e3008000000000903880200000002418063008000290d02408900300000000068052008007c0f02101e1004000f02106809c40100000000009018802000000220a00c300c000000000b014802000000064140a3008000540c828069003000000982901a300c0000000015038802000000000980520080000001105028c020000000441c0a3008000000000d038802002a06814c07a40100000014848070c0300000006418073008000000270a01cc0200000000054062008000000120d038c020000c44409022400c0000000121c0cc0100000000003032004000018c2102a4c0400000000024072008000000012140cc0100000002814053008000000000140c8010000000000703200400430a011014d0040000002a0c013300c0000000009024802000000028140b3008000000098004c8040000000009807200800001f150d029002000000461500a300c0000001309018c0200134230480324011420a404200335006001582405809d401000520a81200f5004001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x3084286201704014000000001e0148020000000241c05300800000000050348020000000003409200800000000050188020000000443c0530080000138110058c04000094260900b400c00000000780248030001047431024400c0f208a0b40631005000006a04401430100000019024030c0300006804100263014000001a044038c0300000000785033004000010c2202f0c04000000064580530080000000002c0c80100000000009032004006116013014d004000000682d013300c0000000015024802000000064580b300800000000210188020000000b4180730080000001b0a01cc020000084781c0a40080000002e19038c02000000000b8052008000000290d028c020000000a43c0a30080000002611038c0200184440540e64010000000001d0388020014c3409007a40100000014828070c030000000c4180730080000001106018c02002106107805640100000018868070c030000000a8540e3008000000002a0148020000000c8740e300800000000320148020000000003c0520080004c2186806900300000008c380e30080000000021038802000130861a02a400c000026210d015002000000620a01c300c0000000221c0cc01000000024140d30080000000005024802000000000240d20080000010868078c0300000000044062008000000130d034c020000000981405300800001cc4102a4c04000000000440720080000000d8004c804,0x360e03cc0200000003200132010000000003201c802000003404c0dc3010000000000d01c802000000280b01c300e071c7183025910060000007209016300c00000000190188020000000a8240530080000000a8004c804], #[]⟩ def dynamicCode : Nat := ((((((((((0x2058e81a5d259a23101603e825020300101140bf343d350202d210094ca9006bd0cc0404303044df420003789c1040021e683f1f3590ae1018050dd8d1ce2012da72b8907da00fb0b4e0daf8020bbf1015e1992000150bed5dcc8a00004bea2d09020078e4a82285194e0f038042c0740000ff180c3120c190080c3157c8051ddca049bf8e0c76f18001113800780430a002ee02880027386060445a44063825048055527107840b3290383bb174a78039f241f44000c014000052081f0280009588002b89d2f4ce58e0d834518c1c21844d08a9e38317d2c0678b38206804386868a4d7d63843d9ce46c54020078418e91c15dfc894ab0413d2f6c88038003290656500110c400ad7600604240580000bd908909044028000a48e963fd9c244a2688979921012e38458c0c1032a5801160c0006f400070042070cc20ce18ab9901c5113c80e12669481c22350786082e0a110200f398106acf300402562561d2002c04800015a3830b568d16b6c0686d5d0382001b080889203040024301208b10001ee80032990890411010000095108709043028050140007d46cbcf95a48ae3c9d08c16386cabca332167bf8ca08d08aee763d269e48484002843d13688e6d40823d210d04bc5f4fc8160ba51aaa554a259c1d0423ca811407e9a30c2086600008b0c8a25b2c2bfd1210d889049ee4803f31003101302068040214160280bb1fb9d009040d085e0b025e24000c00869aec458ed308015c31800600400001a482202ec7d793443c340238b1c1e543c05b92c06d166040c00869b6ec2c73d98e0b0b90001241800d965040d008000050100016e2000546644cea2882f49083794016e1090402c02000010a4210541062200046b3c310dc5ce7740c502c7a5054f19e8604015e286cb38820d91295703b9c280679b3d7f18700805e29826673c540054dd053564161b721451860bc2118395e273881534b0841c70edf8660e80b8f40628206a9a88b09adcdf2eae181388d83ade499fba3a04b700533fa6b8620a402b5889b7debc89b20c2287600007bc841088000fecd04fb479899a53ed5e0849656a7232918b07a22d2f3412050303a99703904254cafc334a49a0164ba4c8038f818054ce3a75fd5aa868c3b33131e1ee7a1d3028cdc5fe18099eeb037b0b45eefb413edfbd85e3f0ecdea6acee14072c70dffec7872565154bfcd1426fb4c1a6a5e7ef009ad355414bedf0d3dbc40a1acf717dd4ebf1c86424a726400021e102509d969136757ae5c2f2114589331cb408b21276d425822c3d9811484cbdeb0502036ca558696e733b02020a37f6a66e9350c803800124371d787a2669080073b35c1cc50b68e58d7cc18639e1184110331451ba9a89de1c20008954400c1096858122c6040e0f47e832c20769b05e6900013c480fbc5027f32994fbe8480700250546181da729f7b4d6e184014a53db8703fa60b671d11a750e82141804c9390aa35cc60432b4307231ea88a101c6e90007bd380002245e7563afa640b0384e88e006c13000021321020a01405040008000fdce103384a382a0373e84b01bdbca6e3d6c134cdbfe50d0cf41c080775ac5794a1aad62fe95c34e9c93b2c3090d0e87dae995a027f97ec049c3c80fb38cc999bbbc13bd674861676cbf0a4b85ed6ae19408c5508096ee8f72a6e6410fb591438fcc9d38b04626ff55471a347351d9ae034f4e311fba5c9637942a90214bf2dc0001fa1b2d9634870e87ea458c0589fff52fd49feb81f402c122d790eb72f488af6940817624a9181eb92ac440422e6b837b09472b2638001f2db8c2028f6e3b40082fa21267902d6814f7f59e7a52d018411435182c3152d87080018ae1820b6ea4e60426d1dc96100f8238400014ada0a01bda07c0001856c4a57d01034050e34121e9215dc8706100385af4749856305c1b7ae5360d021820089a360cf0504c08633ecea927cfa28408fcfb8d394d60001149e07bcf716241138611a5c20d425000041e42000400073870706694f8e29854b86a30a804ab7538db6f70978283fd2153a8b2d48f7bf8517bce44a25d2324af820156e29379461ce777269cd624bb1490e8af6880002a3506368bb229902ba30e293b1e3927f10e3ddd01703a17f4305c0fb0ccb6dca27c7f0852608800006524002608c03091ef772e2b882206dfa327dcddf864ed9511200d4c9b07873b3eb97bfb84d4dd43cc316cce01801cb0ee4ab2c242efabe48b4b18201eccd9c7a00804380368f73c8bc2f5950327e92ca7ff69616db7238fd4891c68060afbc629e300d1cc724881000063441f0740fe3207e05000bd81b1922510302051837086482101830673b1203b152000df284e181e010b1871f18389f0304bf618012f80a0607002000023880a04c1f417429fbe0e286948a117c7140ac86120045e8c050b80a0022b860013e800d0302001000010d20f83302505e0f192071189a0815c9130010e05003b109008068c003f04027140f00860e3cbe38898fc507) <<< 16000) + 0x52080046282001000007f363084783d776f7fece9460c9d51b30c27ca756c85821aa6bf94d939270d70c1610bd47a73a517135920457f450e3410c8c78901adc722ce3f1f36e4006540bf3b88919f192d528aa1c2806b94611436000050040504742c89c8e287630a1119788095d712055f98c020a10a01d9220024e40200100000f52000a84404c740f61200089020f423e14d0d7eec0ee0cb1628498c00bfa16633fa881394f1c66e8204dec1023713fb9d7ac2a6e0055a05ed15d8ec120059fac91b505f7110bb8261d9dd2dce52e209996102f755c50e513df3659048e481c8d46ca041c48707c1800002c83811c5bf1fc404aa8e2730c10a246c2060050d348614096bfffb840079b511851411f11e6945c17b16882d769e901d3f98f0780e000034041e4b40f0130770503b00a06c331b907089a3aa0182d37af10508ca8a302000cda380702be9c5b14022c8745055ede4db202a6a442aa4e5834058d2cdf27541448a07c9e2c80684d8850e0f5bf8850c0b59629607f936d403e83060d81634b64e2694aa44820302163bde42878e80380ea3030050d0138607804000039083a80f8c25bf3792c40f5f207441c58a4c102e5ffc20918280c2477526bbbf99b6868edc59007ff92d247488adaba81860336215172e3c1cbba4041041311933dddf0c235b8c035777c5d00b3435cfb1c6ed1b41065e363b5c11343d1c62f50610b111640ae24010fa8801d9a54103801000014870788e491859b1c6ac0cd02b1e1c0a83865080e008000053906e0d00b8680011e0d9200990246dccde922b8538c5103fea0402e136c2c02e7dc14028b42070005c70029286c2920605406000029c60477f74408e20380cbc450c016fbae2041588b161c10c60ea01400eac9c60600101e75e82b0b2c5fea73ce383a06800017620581302b01f11a2cfd9738af8d27c387ac6f6c28ff48d3c218311e67cf784318117060827df1266ba630fa41044ea4f2f07821999248009f7c499ae98c3e901483049b326d8c8d0111772547bc33a570203ec9a8d8bcc80c50821880002b3200196641d0778661b0860c0a44142250f8505fcc21c000db06021ebb45541adb60598d04802000020041ccd60e4630711d8160cc1c057444d8481d265681030c81adc4bb80200292be685347a1c0b26cbd71d9e31403996f0a889a95000773b5337e12854e1795651677285b5572e2fdc80172a60ff91d8b0f5db994a8860108c2425890265c6001bd08c30300200de03802008023409691040900400001b906e0900b848000278e1006a96061a810050b41004c3d0590503c02000012c41b4560d82306b0d03504c1a4160d00b06701c0d73cd7e7fdf717d14948df474a8b6bb0412105a101285979f3b9fff0f2d181a75999b1d95b6d965acb0028a372d50f3910e2f52de2682ccc5943844c5720017c66e80df0a4e1a2f79dc7bffff451d612198440295148803118e8bdaf6906ca6ce4390b5344ce3403081f5cda8206780dd510bf7e9f3fde46997ccaf579a73fb998f72fd966fba4e665718c664a213446881ced8804266203b90040a35a048201a01000008c20cc1b8193a4b03335200169c1000d44024140e00840400401100a8e1084058040194240c8020000652000144400053880a08c18c2744ac9d3808d843618bdc415debf6abbe9809d878e819b0180b0ffce380546431c920d2349c867ddfdfde36e3142f683ab0840b269fc83ebad62a5b555a5c6c2a7d40e0141a785d61b69127845366932be194000121353a838d736237caefa1d0e1ab5cf4133f8f3fd393498f84f7f7328a3c0d428227ec30215e4406382840f2950024140f00800004b905e190110c8094140009204188960c213c0e82858199924029410040b500905034021000010045025c2c0cbc4001201000004b3000010045816584002402000006c40001ccc020040100000444180340be0a00017d3811aea60f2ec619272f136143f6f72ca7f31b7ec4eb4135ed4ad934701a58b114d1e27b7479e8edb3a6585980c62a6db701d731247f84a180279052bd0e019febe429add9345d1ba09689b3c9878dc26fa99b040aee34f7a6c3419da66fb8db287edb8bfbd9bdac8d8602b1cb2e828352cf6ad04e6ac9492659f2926d109aa399c60939d9dc1b18c6348c600008b840504762860d30313e23841df050a09484000bf94003c0200280305101d8a1fec50a21710001110c015921204078040000244d083b08c15ab4203f2a8e02c4a3001b2012860700400002a482f088088340ba120250500014b105c1902d8a81681400134640055b481608c0ac076107ddf739b6d11b36c63af676c23ba9a656eae047015175c6352468f43c97bb54c802be90fe29e7701808349461ab1c284f0d279c1d3073597d2cb8ccb10048f09844e0c8d0015e56eb2d28920f81c5eb35141dd3015527c3f71b8ce115bcfccf1cd1a2bc925d8466be4b7410c0176563d79911c0301a6202901072ed000e40c7144e5dbfe450767952625c67132460a2a5ea8187adf0e9fa8f53e450dfefe2a0dc1f94d6080a88898d14e0ff7069b70d40f2c9fa6a093c4970d16047d43fd9241099facbdd01175cceb08c0f558fca900088c4f4373577a68256a47b28c1bb84e5730d348a034fe2bdedc64315b4bd0a79e3729dc20790ead5d59b823909e666ede4648cd6de1fa1bcfc067282140490c33dba382a3724804a5c800244a120607804201002008b1c068471e1238d101bb840015a64001000802c8081440400017640003e08000d2903a1182c08c050460ae13)) <<< 16000) + 0x05605f020daf73bbd192240f044ce225ba1208157d2a49c658f1cfae839decce6800575a75ca138f06d7ae83417389602e9a5f5a45921094171627246b840038186d2d28a275d83e04ac09358c00f047ac728035caccd4c32710640010842ba788455af435f48d82d145dd10d94d8eff769b466255cc38d42e0b1cd8e60617f3c28f080046301a010f0222a566aba77f696274b9f6cab86ebc15f37ee356bc2ebb63d1107a940072e8f87d8b47d03abe2d2ce4e792a0f5eb1e926b17eb515626609c2002e33aeeabb772ac132c861565423ec55d4f471e6fb8db26f7aa3fd80004bec1d4955eb310dce8cb41f3e842f9b614a9be2c9d114c81bbfeaaed7a1a06cf4828a1615ad348c0e1dbdedb46957ae703b3ed693318db338000244900051c20aa420540900048c10532982906ec7bd268c9dc60292c6001601001f0182880e0100200800002234529506053fec9081028e0175e4240c0f0080000491b050e7a264a383068468f910eb4ad61e064ea89db0cbcb0668142f8dcd4d6551191c18be299f0a948d7067c9edc4fe3e1801d620773680e58f0b919fba44347ef009465b7e39e34da083298add867a95376fd998428e9847d8fd5a1c1a144b8bb985db4a3a3a8eb382c1450e6c5ff5eeaf0683a8d1885a94e0000f188280a813c4409c220140d026868130240960204a0100030190015ac3c6062f5a99fe35d2117a20611a9b5b93082009ce1fd689240075e4d6cbbb534c21403c1d09b5f07bd499e4bdc1a0e57e430408945bdbb7ff8067283bf243e8e29c050031850f43340e13937bc56b4843174c952cebcf053bb6ea7f4a7640786c0870202e7bd94e6438e5bd206c11b0f3321e3c0d60000e9c800f05100365830315a84e0c231bce5c35d9a7d786ec48a35d0f903ea301a0ae754efbc3abdc015f2fde684b07fe95c352168500d483b8428c63cb6c87a7941a90888aad977594e304001f954adf65f14099545d86aa81b1e8a72e2e1eb34042d132a32f0a0173dfae90e0e084f964d09a88b4082a20d7e29d8267873e3a5ae034ce033f2957293f9ca1ef3b0dafbd121ccacd6ac890f5ff58ae703e061d002f36102ad32de51612b2ee7293e48c2c01eca9448a324c0002bd1003e552009caa7857015d75a2177459c30284679ca593b80c4e8a581025056efb812fd0ed26e3003daa194edf797cff622017fa5df5c770f9476ba1008e7c63e4876dfadfa6800aff5e8497d4e2257fe46aaf7387c13d73cc48901d0e2696308ac6f1681a6cd0d8bf23684978d777d2f70103dfa0c29c9478d8d279ec65be4b55196d17ee08e0283d1802e3e6dc06d1739c810b1d22eb93e48f3d9c040030c60e0615c2d68dd9805e1aab78d2e73a5a7bc0805b786bbd7eb3753d1152ae3ebf3247df487aea0ed44d803d4f3710d4a2260e0e577a78e9de2c10627c921c4b0b2206cac4309b828a0cd6a081297850013289026638a00210500a0603c020000208788628840e17206129e31000336848181e010a101028e2244a1037086484101830a73b14006f9240762a84e181e0100000e4208e220490901782800074080c8a8001c9880c90c12027421a0ad6a52f14789f9ba908194821ac79297e6287e79d051d7239008e719f78355edd343178576c84027d7f190f228117f5ed179fd86030073446e4c734532221888583e1e05ab71fbeb7f5fa1545d5fe2007fd63899726105473f575b61d2abf7caf50a14c2e2566c9e6b6500143f97273c1e8eab736ccd7796410ed03c9a257493af15d2c32ca128755590586c2c45b5c8f4185fc4ca4a53cb48f79413f8990b334bf1c404ee5d1a34685166ee0a751e700656c01ce3e2b184836ce97ca5a6592afc898c3a6807376ab9a549a15a802a4f57b0a95b6737052115e2caf57a43be9665e40007ab2b75f93abd3bde0a71f3bc0688eb49f26e63edbb0d565e113e8d77533e1cb7265c3ce08ae843146498e30009f956a04840c647b352120e15586a91a480361b149b60200019a161e0829e84805182605400009c90471d8230cc0e00742d27e8b213796d82835be50018caf0ed1024bc059eff04478e3d19cc14afeff55e181525288a9ae078adca22c594bc346e354189ddd9ade0877a989b6d18c557643a000141730745a32dd6fbf110588340fda9735195336ed7b0a1e2a6d5f4e578c61f0721025b57058a05c8328e1810c545ac1074431922805ad57d010166bbf05009c430c0d01a000046c8228ae44a543862d4488302c021233c32450ae10148d8c102c021232ef0c0c8ec3033012801419201390300984cc081a0100000b932345f3008e21000c26001600891be34c0d288a0422090271e4000c00800004090440500008b100026d3638e51231e98c1dfc94097e0c091b0c0449930206004010c140320a00e0100007910421182086f057b98688df20610012081aab93029d48128407804346f3990e10ce84343b14b050865e50c2000d89040051140beef04002d8e00097cb0c4820900a209e7d52b531a1e9db9c00030416cc5b5c0610c456f890102429f724e12001201b6b2180cea571273e8480704220540000bb90002c62026130190980b84f469bf66866cf4b080018a0b24e3404628003294103c021c45878e1d4c46864b93821e592101c850696c400d0767040d00800006910400581f80f59b3f9063703189980e000000000000000000000052281448e38c40638430478278180001006c0a0e7078a67b4608da99e0d10d14001112800780400002a4f92e243092521e2229c906cfa2026992409c03302068040000)) <<< 16000) + 0x2e481f02e258a0946066c772016929058216c610093c9e8006d761c0002d147001201444b19a860642e040d1f2a014e4a2c10a1a402097c2000664e001e0100000df3134da238d12cf67bd0c0deab85900a797d450019b43f8e00023280300a5f197e83800c016225948f4480e388075524c0c4a6081a700402a60c100032e7000f00800006f90002213e4e4e4c247187887c93c10cf9408524901e3ab3040680400002ec80028190007fe201c020009fe2001bca4004850817848005aec800de51002109207a4b003015100078a12b27141bada3818afc60020e24a101e010c20a072032358306859060ab2d120207804308095460d5af901177b182af4520007804005004000142400052881e04c0ec26074130390581c00c0dc07c517521c400ce1031a27242a6621c231e6240460e18001954009c60400212383657375aba0f630b1d8311f1999e9b12c60b8d5804a92ff794679c3c2ad2a0028648d6fe7213c137a963cffa35670c5ce05a04006b0ad62be2ed02a76ad6d3c12f3314f02006d7017927c0e5b5d11435c90702e31c00c0f8868dd892c9c9ff31107e4fe5354502367c0a94c7091da6f63c51414f9441fc7316480c05916de9a3070c58c0ff10086665000874c001c010d200392c8b868b181d1241032880434d94003802000014640d80606a03a24750c690361824393d990149278c00027440004e108003304e0022010d2a6bd28927c4d209f1243cad880b2b69400380200001466481a211838e98480a3c5c3833bb42c000c990001afc20011004e08220100000ee385003661364f924096c404b8818086cc282069cc001c010f3051805d57da5061216a856bcd1422481f0a7cc837639c3932eed334b070c1c05ddb663d5ba4055f264944daf21411fc0498330540600213967ebb45aba64440c8003108800011490340500018b10005e42000f486c813d08181ce2851bc4816bf52400b24400b0a0026140e0080000639000c71323003465ab288610052fc468623061f7113737f0c205b38852c5900e558ca2b048900ebf4438be828008d016684540203e4b0a100033723a6f32939cad1c70a41a000041864407d4388ab585084ee08155df90003c02002803e300e0244353a388416440d5cd8a12b71102c27c4001c589c103c0200001be70a2b80f04894880e2c40257e0f12107cf68a05a8142252cbac376e184cc9d5d15f5040508920c1c4b060a68bae533be14018204c6424200a8627e7222b639d71010560e800022220661a032090188480c02405e0a000442200280040b86605a3202c0981580ec717779d08082a403e1c209ec0d84093501f42819489a3c6043d35372400e07dfc60051ac7643e84060d01630813ee4070ad0700159046101e010c201c8101c57a1c2056a18033ae4000f0080098080a80400016e400052081486c084360500b02001c0456c870a72316092a908193700048281e010b114649faece1e70dd6ad777ed288698808d7fbca768cc5a009d827535c4e3fc40ac53e326225c5f67d697b6834794702042cc60b6449ac04406ca9cf86cd650600930a186781050646dce0380402e600021090d51595572706d9f422ed5368d3c5168bb522f5f5002e66ffa9451d06600007064070640340a00045f204e430261d81284ec2a9bf2400c561c00fe44230c1000840200401104220838b0301400473180070042000020080000223044618717efe5002328c00340210000100400001110000a920002e040006b481206c08c1781a7e2c3a8b5bbecbed8f77040f26e0aa1624b00af08d1929e123287f04c75cb75020d6e2328014a0b5ae5f9958e36b8d0c0421a2a67efec600bca6f97c659289c7f00cf68ace9729db1a1009340d1a353ac940265e3935a4fafd0471bb8cd08806206a2ac0d906f90d7279129062287c00007104088560422302001e10e80c0882110405804007c2603c03808008020000088e0c9d260199a8e00b5008006a20120a070040000244c0a76c382133101dc802051ad024100d008409694959c5c1c0118e278b7ad2a1a0977f94ee1012735506f71e82cb0454f6a5a540e242d76b44c00277d31b2e6bba3705767f6aa06c77a4ec9d51c0171a47f5fd15f7929dbadb601f7d00b5f534c4028261cab0612fa8081ee739884616b1d19fb9402f21e7846c0619bc1bb9d1d02a60c0449f86ae00cf0316b26671fb3b14496c601553eca2124428000453203a2200050f20383a01b0d00d048001b3480c8c8003530c0822c1c0cdfa301e410500e7b20b20a07804200dec8410280210040100400001110180980b84e8709628099714006f4230c0c00800b00800021080009f90151900a0a804c460241a0110900802803c140005044005f508017761c40df89f736c7d7246607cc000000000000000000000001708a18c10c08a0880860040022f720f2aaf4d99502da1e15a3ba946b6217000873ab764386915615c71c462b8487ef8c15e92450871a008241c214070838800e34030028c088b38c08804203019db8e1e5964060c158463802e9a11400561180007ea3111a30a0a80a2875e8e48eb974a16423122ba0b140754a2001df66000f00850e1a4c24753709430353ca143d0830203ed240f1a3cc00220100000cf201c0b00d05d0eb73891d67f142c79d245830a280e73040043104c101e010a1c3bcc48e9b19286076a94286ba8903de1e92840880400002d88000cc100c010001cf90004ae2000b80402c840143a0091100406801c2400c12005010020080022788018c80084400202000010031bb9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 23 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadScaleTwoCase1" = "QuadScaleTwoCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 23 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadScaleTwoCase1 private def zz2068:"s0814"="s0814":=by decide+kernel end section namespace Green24Proof.QuadScaleTwoCase2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l24 l25 l26 l30 l32 l39 l4 l40 l41 l43 l44 l46 l52 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x38a2, -0x5dc0, -0x3c4e,0x2f52], ![-0x5dc0, -0x73fdf,0xd689,0x23d3], ![-0x3c4e,0xd689, -0x15668,0x6f7e], ![0x2f52,0x23d3,0x6f7e, -0x5dc0]] noncomputable def hinges:Hinges:=[(-0x214,l6),(0x1011,l4),(0x2a3,l10),(0x436,l14),(0x2ad8,l12),(-0x1460,l17),(0xf9d8,l15),(-0x5dc0,l24),(-0x2b8,l25),(0x5dc0,l26),(0x2ac9,l30),(0x5dc0,l32),(-0x1770,l39),(0x1770,l40),(-0xc6e,l43),(-0x24ed,l41),(-0x2b8,l46),(0x2ad8,l44),(0x1770,l52),(-0xc15,l62),(0x436,l64)] def normalizationDenominator:ℤ:=0x2ee0 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x5dc0,l24),(0x5dc0,l26),(0x5dc0,l32),(-0x1770,l39),(0x1770,l40),(0x1770,l52),(0xf9d8,l15),(0x2ac9,l30),(-0x1460,l17),(-0xc6e,l43),(-0xc15,l62),(0x2ad8,l12),(0x2ad8,l44),(-0x24ed,l41),(0x436,l14),(0x436,l64),(0x1011,l4),(-0x2b8,l25),(-0x2b8,l46),(0x2a3,l10),(-0x214,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xd16066008248238270054401410410c11812a200a000000151103cc020000000d0380c60100000000b95033004010232888026200800b21c46a015100400590e62900708020000000000303200400000000460290041241c613407cd005000000000681a401000000000a805200818c194228126200a0c60c210409310050001e8cc12054801801983509406c4010000000340a04980400039198240a900300330621080d880200000786814094008000001904812180600000000d8024803000000000f00a40100000410c803c30100000000d0009900800041118240a50030000000902812601018422023031840140f011c18009c200a000008c140060c0400004104800f06028000000002406200800e23084c04ca00800001e1509029002000000078481a6010000e85609032400c00000001481090060000010868030c03000000108881a6010000000008805200800000032220698058114a0e4021910060001488828018801800000522200c300c0004c1d0a0062006000220c8500310030001106418018801824838824002c4014000000221a03980400460d414007100400000090380166018013429050034401000a81502801ea008004d0841400d1004a20520220019a803001702407009d40101701201c0056a00a0000000098024803000000000120640080000000007032004000000001c0290040000000012014802,0x5c02900400001043100a0c04a0866840811a08030000000483c053008000000001e0290040001200840098c05000000901201c601800094260a013400c00000000f0049006000000001e01c80200000003c00264020000025074066301000001884a0631808000000001a014802000000b0440166018000054120013301000000001600490060000000580044804000000d01201460180000000014062008000340208013180a000001a044038c030000000e8c81e6010000e82609016400c00000340d80618060000001d1b028c02000228fc2c02c80180000510c40283010000000000a069004000000026440cc010000000b8280a6010000000006c0520081c828c1680f9a00a00560cc2300a1004], #[]⟩ def dynamicCode : Nat := ((((((((((0xc2c1bf5d695b5345eef0e0a24062b98921829a12f244b231532a96e0ff7fde0e40a180b9ff266b5d6811bb34a14c194f42cef8b482749c00003d5636d5ac2b860e22165c3cef113ff78c00981e8a29e06c05121e0602c886aa2163093b1ca14dfe005866bdb32c04dd3260e002a03000010c383825878143e19458143037ebe8818fb7ba06181b1541412ac7c09800cbcf01600258781200dd310168904180240000b7106105c11c43802c61684812348e2809111773e584cde882417f585960101e6080076af02800f0301244860a80e000055483002e8520f6558c8c0b02e4fc3e06913d205c425bb197dcde5687bc6e776131c50763a00f7c193297b8e38f732f283023294e1926ebde3c5121e3d2e1400aadf949dfb46f6e28056594710c008c6baa769dee17ecf7c45dab6405431ea449652fb4ec75606f82534c2ec3952a6a851293df5ab60b42ea7f0b041dd646ebb4c0c28d02c800040a3c745b94c1429fc274081685a83038a16a3281c301b33c0415f4f2b840432cd4e0820d3a7a040196aed889a448a0c8142857e2b0a21491491b3bee77df714313640be17fe27f80745dbfb849b7b3ab2d40a0877afa704d4dc921b0aff3c2816b75920870278575ddf1b6c515c1fae0b4f5c14015115d1d4ddcd5aac71784f225a4e2180200f5abd6edc5f67186cf3e2d1f418154ab6e7a5d1cabb88a1bb6540dc85756c03509b5be9f992bc45b76342614771a400020d90005b5202c0be39bcaf0a1aa14b250a0a5af2054f5260e286e160408d73b21) <<< 16000) + 0x0454db82002a29c0400609f412c9101501850ddbc8890063d9748468e901a8815b3c1d22961a8b27bc6165128e2965c8a5ff9209f7be314a8241024d8f405b9121e3d4c838e42c10406c410a956eb67c624d9bb9850023d056caabe77d254f6128e060016a0dffbe021792619630b714f14f1da907c9f2ebccf5f445da77a05665dc34da7ad0e20be2800003c33c7a1b40286a99201c528080283ca3ce2037f2dc102394951013a99720033eac0804d07c048122028038a18cbd7fdf9d00dbe519c3901205229d431b7b8175bbba9688ca0e470d9a8473e55a85efe7b7203354a579d9cf451cd566a02c404acd839a79fb8fac9ab8c4e14002bf7acafddf34fa054dc4c3004d5ddb50b4959762ee923414b658efa2087de9aae7fb72a94e2367af292883d599c41684c000072e40013fc82f8c8150040014ee413837c28db18e2edc72135588fe883040516a81eeb0d685d44b1b4409a2cdd424b14d32f5a4fee84096c288e18b5701485e7e1d557d78d7673a6227bd410f8d095a72b0f8c9741a6ded8201413edcc1ae1166afa546c3c093e5dd2670e229911a20ca489657bc241f9c442142b8920000d8ce0729484f0c1489db606012276d81408853660403676488052d04e14da36024475b77f8e83838877214b0680c00002cc4178b409c5305d2902e12c16c760b40a0590140d0ed739040a0c2ecf028476719241025141fba40044923f03802bcbeec28005e1e80200038bb6a88288b8158056508281c03448e178f6e395a01c466baf19934d8e1ebebed0b446460ca50b0552aa8184071facf4914180125a68a5c882012cfc7746c9100a2df95892e516398263101683c007807025484dbb0f07e03886f3e53bf33f01418b6d22a20c6e62061cbafbe6f3a08410468722f17440502015e3597e29a8a08e3748a9d0d3e3802392f17724b3020057ad1bbb08203208c48cdc4f248bfeb4640ab6b505883f35428825138584443ac30405710202258c0180977e80849228280308151f7ac6816214abfcc71443ad19c2a1865247b3d0b083f227281605848352a1802695034408005f2040401d758364312148141f0440000d890580902b808000d148002d110007cf20ac5391ff04c48c1a8820511be101336287094acc4037bd118111b30e02080060055b023488088042479e9410287ae44104980406f84120211190e133af8804c8dc080cebe01a04044020000222409c1723e36d3648c1c3081029a9b1a406cf5ae1010af0b2384d43c38808ff5d43002d858020350f0ea4490c1601c48ea197205a9ef1220498070d9c80404a61d241699790012b4c49c30440200001e44154460a81a00029520a612052010288081400405002000588209e6b04e2982686c078360981b812961f1d8f403c54c0a7788513e23f5ed8dfa77dce7fce040c7bf7a1c500562a8f03534802d4f3376ddbe9a7dea2008701ffb4a84a830e70bcf5cf0501986ce442db79010299f11504981434365d94e511ecd429986ceb85f46c504c718fa05022f7b9af5767b07321f32a916b0fcbc1c482ba33202a08e2c490c92bed7770e8537dc782e55ad475542faaae1a99583ecec961f09e347545ec02c7199d83f542ce774a6b362e5d339c0bcf64e020b4670061dd15b3a8754ef3562f148392e6b547b6bbe6bc72892e26123184d83ddedcac6862e80fabc85c98df72051bc3ca8f05c1c1eb61fb1309b0ec7af6b9bb1d9a3be11c18aa65184629722c47bbcb0e41820200e63000e00802580800806000132682a1a8a002cd090606802000016082386c1180609403a0ad15007d9e789fc77d1cd65a605592f7a18ae270424091142015b27c6f796934b51cd5044a03fb9ae2f5a8a251849a0308590ff0a993c6e7e1c7c2db7cfe775f11bc9c34a260c551010a3352bc684157b870bb344071a31c3a7705479acb660c10088a5027e0abd273c23b23dd5e6427062857605c707cda41a475e98d8c44b74bd5967c9c712e51e37f338cddef20eaa35e034755eaf6449cda7aa5c3a2ac5284f5b71a7d28a5b152282a2ff09929320c9130a4a998ca6e8828d8628426bfee0a571abda45000a774dc424729484043e2a86f323349c03b8fc31de6ea1593e58a00ae65f46df8a6f46a77eba44f52326240c10010a4cde3977f1b3eba267878d4165189e202b1041c467e72e1d1ab557d6735e2e959c2c8a7ee15d3e0e1fd16582e610440df94521c7a0000812412464001316412087e62f868e7dcf59a068672f56ac722ea6a477b3833b790810739dcc1e78c3120c2afa40f3e476e46c4dc0dca23e7819a2cc454c8321cc3e137f834483cd7a3c58c4a2a7d080166228c45f4af8cde0e4a61e8ef025480e7f7021138faaf9eeeef19a9b60b13d2395a53cb596fef80465e201a0b23abcdc37be1baa7f8321b7549f0f0229b2045493e20000200889d0510394c1431922800f32000580400001f8f9b5772205b85d5d7aae8b3bb67c875f99a31a42cf98b2462e14d0d1393fd579120194caec2b0f84dc58611eba508deec8927365afc9953bceea946c4e8618f3ab595bb52c78e806680b0e93e23c14c77e57db669b18d63cfda10cd72951005eea3a5c7dd328a80c4e1babba30c90e3d5b7858b678a7534a4425c496fc409ec76000040720009ba7401557e16e4249c437f71ee2e8df4cb3687335d339cbcf5747ee99105390d83612c0c30802f0473535904b03b65d75d8a7f6815eb4efd9862d52fde2c6bc8c68dfc2216e9a1d3fed63252a910b90215f4a7ef3551fd132b2a2cc42c514cc8241328200bd51aaa1)) <<< 16000) + 0x92c9f1a74f199b5606535fa4f50aadc6e1e7382c64a0fdd3ba20cfc3c8000211980800802000008882388c11817424033814b7081a2b0630c0c0085080ba9c0a0e214019520810488190303c0200001244114460882381194b5a00ae0e227dd0f4aff61a2f1ff600d5f7d182564f8e9644d603e8ea8f98074693f17382e7bbb94c516568eba22ebddcbf39c7dbe3b9c8ceaeae9d03512c05ff69e04c9e35b2ca38a89e2bba4750507efb366048190662510de770a4a65ecc6031882241bd6aca5972463c6c5195429fe49d7b0d28974f3fa35a4e208f93b460d78eb1ba410ff6ef3d2e858571959d9aa67f0f528db24e402da7f05533a10c1884d259205afd31b9273d3a31896f3fac1c9be083df5dca089f96cf285aa538d2ea05ceb60efc1ffadc8080b752fed50f0fcf73f713968d163d2c2ed2e3e3b73b96ece722066ead2929fdad86e9cbbc48ba47f81fcca171d4409dc720043018001fe10360160c3c5ecf04badd5eff49234dc27047584109880bc18103115cc1849e10e844c3125ab90b861c64d70f00502deb743ee69d6436ed3e28048737c6f825f709cf04a47cdbb39a2164e2a7e3d179b61bd0018c331e0615c153ca17751a6a2385937f74b56791cb9de23818e940546eec04e95cbd565c406fbe0f5c8c3278901c40b787094f40c19618800a370902038021c4523115fe713e9344532b0ead004743c30521867172fc1ec81dd8e14b63aa13eafa78bdcb3fddfd26542a14d9da919e61d262a564d0304be77cda6af72e6b6ddb9533bd696cf0cbbc2c715e09093cc3ce792ccbcb1a4f5687ef98e367b93bf36c8a1f7e82ee0014ac177b45fa2f6907bfc58c78df9bd697a09167978ed534879259da304cd30802102c00113c80027b10008ff20820a00116c20025984100740041b040fc1742141dcb5d6410b97ea5f1eae27f206b1128e8f7269ce76cdba82f8d2baba299895fd9f403360e8408b44ec5712c41a52208c9c5f52ec928a0870dc1b6ac1775a2e91bc329829ffe24ddd55f3686e21853490a70ee7a68d04cce91be75cd3c550c5e04aa4ab318b189c119174285085f2a98789ee7f84581a38e06090961758e9f609e7f8e301058a4e802677364cbce81d8a60c87757b9484f1cd388e6c40c0078b14c152c266bb6da8f98ed9dc77611fa772ca6e8bd50086298853abdd520b672858f651efe1ef741308f004617c9abdb68234f73e38d7b921d0b4e97553cdba64f170aa318b92a80001ee1809cf135d40f6f4f718066c3a8b012d6053ea3726146101539634fec73bb4ed2ea0b431774e9316abf00ef04440059ba8f4b5fb8d4fec21c9a427aad8fe3dbdd9755d010c3dc2804a77711e64cacca0e8dba826dbd7596122ba97e2d6b19ae10bc5093634185f038ca8c9fec8de316cf5d5842f4777cf969263b080a764964db7c6394c4c8000428207c3a03d1501e008002f9c8100cc07c4603c1bc102418812a2d90058750c061800a026b8840460f282032c1014c582002003b2dc093f9b69df927ac633060458b12ca9d1ca36fe354c274c205aa6f2547a1bc9b5a920c38e5003d8181808426517af0d1ba29efc13ea4b9890eeec490c1494acbdd242c42b3f2971e6a1df2eb2bb657ff9ec843315124e99e17db222bbc8742d51fa6eb29000b01905a58a7de9a844e1d168fd4427478a16042894edd17fd7bfb7887f28f5049414fa1430d58c034aa3002fd080087a248201a01003a0d81c86a007dd0008a0d9020700200e00606e02036014406f101030e95220c0e0086929740d06cb462ea8a7af83cce17d5b7ec9f9a74b53968e7e26506119cc04f089aadfc15b1043996bb10166a5f9fbceb5b242b21b7cf873c07356df8f314075e2d80530a19986fea244ee8151199158c5043f5e50cbed58207bea27606960bde4d52d7b173645978c1d597932eaad279d5b0811dc0711f8410554e29036c6e367e92523a84ada24b0bb528457eaa0eb69c0d05da0abe308eb38440000401180788800380200000cc81a82c0002148002ba10005eb20680a0006ae206632a185eb22fe570b25365638141bd0c88cc069d843429ab8d0d7d2468416889693e74040b3c5c150c2cded0db8647fe1dbd6a0c05476240a5d319285c18b1b70cc13a0b78cb9151b7706eca75d7c7b6bba00e04d7b6598012f2c0914fd043e4029bd862341ee32124e2b20467055e192a443aed1dabb54ae748baf4a9915ddb92335f8fb059aaac15881de72be0f78820cf38ba7c088ad4454c2d4748c8324bb00009f640032ac80908e040b64c02d522c014e45000c950104242c0e00800004f90011db20640b8060080238eab50a145aa58052892006c628029d812860700400002a0e1960b498ff3047f81e1e49fc13e05742c133c85e181b906c070080f950b7aaf71dd3b16b38a4f30da0e36e54e5981436755a40202002b63a8cd8dd827f3226a697390bbf07f558bc183ba01a930602014df3b40847296d35342e8c2e363af2dca2e915cb3e4892ec4008fb600c4f06287c4d77b73943daaa1e4f846a892266320f5cf7746e190208f606b948eb49cdf4fe5e09e317f864aed8b02086397800013d48188880c02405e1202e098168480b0240561302a09014808001ac8800cee9005676386bf781810e1e0c10cd6180787840104041a200800200a0040001884016cc880357a1e0b2f594eafaf349210a5db8ff0c0de9d86513a5d8a824e4ac92388082a3d59610f9c4923723b1908807cc94eb288041f38ca2da7c802078ba11a222bc621fdea601350137af8eab38b142e2f8d92692)) <<< 16000) + 0x2085cc7b541735878cc374cc1d41063b6f448c2a8dde53004e35bb49fc1255105e17440514b18053004e03913a185a582a0b97b255d74621fca8d20239abd94ea571c43183a918766295399434b0eb458f5711fb2fa7e528c90d067594493ca876724ce8c49a756ace461138023fd0102069b2d69cff0714ce67b06b11611796ce8570b43498038ee147f5cf3f738d66c529dda260aad57f953eef201060ae0484a2f21cb19805137fcede7b4d74b24dfa424aa27850ac102aaf4fe72be79bb610e2c1dec8e2590287828683c4282d511d425af7351fe756830406ead7073a1509549423c13c02e66dbf080416414e8c77be5b7404be0a42cc102bdc20833a28c63266eb5aeb8588a2740a9ed9d0e6d6ed6b94193bdae1209592340589295c38766d0983b7e9e1f8e156bd4c34841043a0a1578f4e3a6995c3085e9070f801dc40a1657ab74f0250e04f5af78306471430dc53140ce7dcfdc7c8360f2f318c102ee880319c55b0b811cfd6d80e420809e52b1b3682ddd837b595910980061f84896dfac86610409ee07290420179c244e717712589ec53245f140217f119522c7e77c7eecfd290368c00000f188003e0190c10c901b0ff183008c405343430418e120005f2001b5c08001fc41068200f00801300809404000266784e603375e327f44a5b6cbfdc96f470465de8869422f771e398ff938ca0e04b519322c94ea9422321b24cd68105140cc688265fb4d22bc3a83f16f7f79bc8c149a33de5c2eb7c640cb1ac5d00004c24003fd880080a04d98c20601f87049df8a096c21014eee28058f41098503c020048230230980b00e8852d4e27bf95f79c36e60ab9d0bbc9a182845336d9e560e10052583ae0b03d400a1285e8131817e49cf63dab1771b21fd8204609fbe9c86335cbe58bfd4558f0034081ee341df34e68fe50c214ff536401a3935889d7371f0b33618f0ff5d88abc6933d8ecd62a0a561e7c352b7aa20c3c8d8205554f2af73042ff84142ec82fd5060a963577d46077ccf19c250a1900142264e2e51f40be768cb67bd079a08078be9042fcc22ec91f8614a423c0811030cf52d46e5e95fd79c6abf80802abebe7b796c7ff7f6afc0e983406d05ecc0acb4bfe678e1a95767b936e5ecc0b1c79c43c7f87590c30d42e80003b620442a0007822042420201580f86c07827430516629c5a627bce99206c499ed0910f1f26026e3c8561b72f21578344208073aeb50a700d1aef2eb37b654c283f282677167740e43c3baa38d98f0e107e06613336412346af7c52b81a05003ec5e6b05da679bdc2fbe2013ec200c0e47ff41cb001c0d459bd351e03107edcac8131e109b6c48a51871b46018461c628a051060834a480df81005010892880700434941b648a084c61457f9201614200091408015800039d524e101e010e2902233389ba3fc3613100a19a825e4c8301bbdebf4007180de07efd5d8931826100a149806ac8a7f7e6c594c806064766ea0bbec1e3f183804006dd31b1800a313449000102647cc279686911960100505e0a498a5868afeb1ea95e3c4a0726ab9807045011040f590b184b9607de980058023c8097881c1d1286032470d51b1c256a8406ebe1009b4e7000e00800006b90001572000956407414000b7a407055863850c07c110a082e20410c0440090642006dd93020780428829f8e180da18601608101fe6036698805dda4c081c0100000be20360b0020580d028064140003e0400228c80c08e837f1a52926914c3ec0be9a80204ad0bac3d5c27f82bec36fe1203a53eb645a2796b2779709f200370cfd3f9680d3f6adb2c1620010846a8e8092395e7d26a1410293e0dd69bec2aec16d77e32027f4794cbf5813b7ce6bfa104298e92119e0e66d350433122d89e0000d1080b94c0580701c0100440481375a7047e5c35ec9fde6407efdabe2cbee73c66ae545c33137ee75521fcf98c02d451d1c0332e5bd93de58ce26d339f3896ebb7911ea5be8e798a48eada5ea018e12cbb40fe6b2d2e20d393bfcdc163eadefa5470034491012706505f66ea9761790f5dfa8a9d9313f5032069798434a91f100c0100400001110030940400401002a0200003720281a00045b20263a01211e101483068572819e20c086c0802014204a281a010815bc0c1b462020be303304601dc88128a058040000278808848034140200a00b010000da1a1597120f938e09588a0c41000106202084a5018010c1c744608b8e5828a028189f1002354101090213080680438819033a14fb0313dea89db5998078c0a02c67c818a386f227ae171339ed60606cfd119de2a0145111507de604db2876d035d1d2ab1abb2af7d35ef94aa9a5b4a70383940cbdf074591996a3cc3a7491773b567e8c78f0448079c3c0ba8811cba134d85d8b9e6d98d91bb0146ca04915881d9d65553f73cf3eba3755d943a383c4d345dd1f6ee1c2d4d57cdcc45c3fe04b2a3d0c23a943290991d6c2722375bd1d51dcbceac000000000000000000000001708e39230c31618e08e00160c0100680009b1000622201e1a00e09006828030140160200076420010564003b5c800f8f1002836345c190741431417b61820047d31414a060a100181e890801e9e704007218706008145fbe74abff942c60dfdc62865c8a0a18320d96c62110096e81e9f8ec4d4505393b17a26977475143cfe9929162804783245d653da191ea10efcfe244052ceced13a7478f60b102d790838da2e800026d2014220090d00406801c2400c120050100200800109c8019a80084400202000010020729)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadScaleTwoCase2" = "QuadScaleTwoCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadScaleTwoCase2 private def zz2069:"s0815"="s0815":=by decide+kernel end section namespace Green24Proof.QuadScaleTwoCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l24 l25 l26 l30 l32 l39 l4 l40 l41 l43 l44 l46 l52 l6 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x369e, -0x5dc0, -0x3324,0x279c], ![-0x5dc0, -0x78c12,0xd689,0x2bd4], ![-0x3324,0xd689, -0x15668,0x6f7e], ![0x279c,0x2bd4,0x6f7e, -0x5dc0]] noncomputable def hinges:Hinges:=[(-0x214,l6),(0x1011,l4),(0x2a3,l10),(0x7e9,l14),(0x4a3d,l12),(-0x227a,l17),(0x12e3d,l15),(-0x5dc0,l24),(-0x1b6,l25),(0x5dc0,l26),(0x2a17,l30),(0x5dc0,l32),(-0x1770,l39),(0x1770,l40),(-0xaaf,l43),(-0x405c,l41),(0x486,l46),(0x1a0a,l44),(0x1770,l52),(-0x3bb,l62)] def normalizationDenominator:ℤ:=0x2ee0 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x5dc0,l24),(0x5dc0,l26),(0x5dc0,l32),(-0x1770,l39),(0x1770,l40),(0x1770,l52),(0x12e3d,l15),(0x2a17,l30),(-0x227a,l17),(0x4a3d,l12),(-0x405c,l41),(-0xaaf,l43),(0x7e9,l14),(0x1a0a,l44),(0x486,l46),(0x1011,l4),(-0x3bb,l62),(0x2a3,l10),(-0x214,l6),(-0x1b6,l25)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x3f0660d00b08020000000746c0a30080000000016029004000000026440cc01002b0661180508020000000068b03300412411c13802a200a08208608c095100500000c222809060200208410e8014401001042087402a20080000000005034802000000001500a401031832845024c401400003c340a04a0040c60c210409310050001c8cc12054801801983509406c4010000000340a04980400660c42101b1004000000641204860180000000098052008000000003c02900400041118240a50030000000902812601018422023031840140f011c18009c200a000008c140060c04000000000480c40100002082400783014000a4190a00d20060000000121c0cc010530810c2048c802800000044340f3008000001a0881098060000000064084803000000108881a60100000000088052008000000322a079804000000016240cc01000000a4380386018000054442c0f40080000000002819002000000151103cc02000000000280e4010000c4541c00c400c00000311500618060000000000c0c801000000088481a6010000004419021300c000000220a0698040000120d0503d0020000000042042401801643104c0c44012881480880066a00c004d0841400d1004002e0480e013a802001502a05003d40101701201c0056a00a0000000098024803000000000120640080000000007032004000000001c0290040000000012014802,0x1700a40150433420408d040180000000034029004000000120f014c02000000000780a401000048021002630140000024048071806000250982804d003000000003c0124018000025074066301000002a090009980800000000b0024803000000b0440166018000000160011201000000001b0049006000001a024028c03000000000280c4010000680410026301400000340880718060000001d1903cc02], #[]⟩ def dynamicCode : Nat := (((((((0x165ee8dc5144e0e16432c5e510132c14285cb8508239a4c0024010a29d454289199fcb22c95228803224a1093b22c354348b00ed12ce00240180000f432484b0d1838d329143c715798280ebf1428641692282fff0e0047f78a001ff33480414014000093105301c10f084b1869f92376e32060bda5846910808c58920dfa62801a7e40014c84c86078020000464d0a468d0e01ade223a75e8a2205b130eec14fc01db4f9b0c8e2806b88ff091f100859cbe070c72e1dce53d95326d8e0dc2800e8def8ecc5691062e1ab0c0112b88d94296a0fe6c2fc020010945b9b76f42086091c002c5f6e42a496fcbb8ec3416d1b2625c26b665e63882a88c0000da4f1d419f1ce02b94a152052491ec92481641dd8253dd7071453682cf59eec70c0f2d52af12cca082900590dd5942092a2b55d8602c1012052491ec924435cd91d7f02060108a15faf88161278a0c128870c6ad850052c83007fa44261010008000068900031320340be38b1ec2860fdb450a26bc081491c50e284cb010202eaa105665f08008e680400d3cb4248609806285ac862053cac28333761c317861400a660c026014260c100080000679e39e7b1f0a1933311850a745d9c2051ffafa0e2814047870c189f6c2021db7f72009cd7af040009f9e508c2430640a142f1399029f508e18ad088083958a00e9d8600f792130608004000033c80013290521502880800134882188e06581e808b756e3e1c29dd108bd37b2488812f7410030a4830c204c746273cf329628282fa5b4319dc8204bde9a61ab9d3ce9859b4d14218193c4ec706d2e6c7051af3bb99efece359b2f36764a121c8560000a30e06fd2d2440424ed24304ff0f0c600ff0f0c501f7b5cc402fd2d24156522cc8fd604a4eea0a8712628180280000ae10432d82814813c9409c3b04d1582602812c050367cee081534490284ba9c70814920590020b8f8700a8014280112851110e72c118302296e482a03891c5a2b91fce7521c44c4d93a1834dc70eadc42b34978f1832206da29b8e603080fd9c0e68f781800f299fd71eaa0013e33f77371241333c11b200885385565d666203208870e4913d01832c87c209084d7e340c213e5db8104569e262401337ac040030fb2208007be4fc00f932a200a9104034058000183200078e412877036a75e0e208df00c1381420e0bbe698c0837c68e077e9c8a0037c682907141401440c55c0a1c52476a0e24984d46096282a38285148200849f4829a6141501400007a10491102402811c1408c020450100014310442d82192c108360461b0410dc088f7e0071154d00a26102eeb2e1b468206643df9f77c84e1002eab2619c31568380b9d9c932b35528a0237bf53dc8f31a28055bdeac4a3224435264054b2420d42014011349f37935cdc2abd018c786c140b10926961cbbe3802c6e2c6181e010b0e67c960862162040f00800102c10014000106743266db4a06584977293407eedd83215b95a37be0282971c156e71513183ea182782429e5692a49851814) <<< 16000) + 0x005fe61beb45f4f00ec1bcfc688625a992cceab410000e365c8a5f7499728844e4f2642e197fd6e8f4100def0ded2c77d83ec4b8638b864d6a9cd03b1468d4babe5e1bb656140cfb9e11828c1db9bb0821384780003f2207e0b90d09546c9148b217d5875323edab96834244838b70bf2da03f71137ca20895511b5dba42c0dde1a201b0ff5a7ea22d5bfba2d40bbd906000a378eb1332ecab3396ab53cc1199ca482005b468921fc3063d607794b473fb47b4fe2003e2ca9f5bb563d6f5607006c905883549d583cfc57bfba62408b5fa82b3b932518851e00001fe903e19d8a0454b0837996094621008d34248181e010a22a2683721102050042401042011b488102c0200000a270603f30236608097e23040c00801e80c0002008000aa903c01c02004011e3e8668f5e910205004344846488174900a506078624040b00800003f90000e9362b0638589160534080e1812060500400001fc808028000754d6c64de907460c0b0adcdbd1f400000000089f04b90c70591bb02334ec1539b8483133f74d34aaea5054ebbd743b89c026426b0ce172d07501cb1c42342843011013400402c7ffae7e7be51baca4730d9d72685040108f6aa31a54aa26963c1ca9b9d21450324df2613f67b979ab06e8d3980add1220fd865d4433ccbb421cc6301812220201a840019a8048201e01000009520541a0004ab20762a0008e320740b8103b4486bd91429179200704500100004a281a01090e8eae600f4f7d885745198368d680801667a09e955a142561a6525b440de3a6cd09544931f096dba2d393ecf0b00a5bc0a3d4b7a189130fea25b8590c78143dba328481401c824535582846ed1535e98b345c7eb2d13772714c80387b02336b557e4f1347471586b63c417df69ebab51a61611fac84480d1da8a7ca2971c3709f1428f34414aa278000224980a242001d1e673bf828bd01118d601e1de3d420c64baeb2ade1e8c101688907a94f9b8f7ebf99f78ecb30ffbd37ef28083d3f805007a78400b22f2389a37fd63b0453e46658bfc2312a2e8088c54bf5e12800006eabcd658b552b3dbede9f1c1737577e8699fb51d9a6207d980626b505b7c5b4d813e44a1efaca739aaef4825e8706cfee6dafc87eed942f622f551da405c53088765502ec383e00b65c6547d6e18c6918a00014b881c8a80e04402802000a942048230231181106f042ad259d5240fdf7c2343598dedd307683353e4b01c882584f2531e73a49287be7eacf718479dbe1403f56a214cb4b366bbb20534debcc2e8f25ee2620087b2a2af29d46043cbf37e02305a952e6cd16e1804263529299d751e2d14cecc5b3b6d7f0944ccc401169261244e9a1895beb4bf6f15662ccbcca869d105979ec332f7c76697a807f7ee20a1513694b25c8b1c054a8442030011004010040080080000dc81b8680d83606a0b01901d8e0cde1a1366bc8b904e4dffed9ae8e390634b4649ba226358fb04ea33c6eea1e1621871744cd6413de32cb399b17da40f1ae3c73eb27e41394d63190923dbf0600b1cd92fab3e62ffbc83a887d14a04222d74b654e81b6d34b276c3590fb3e88402cfca5d4d1416724f551e21e80f1c4aeb9f5fc415d8478f67efb41d111c43e05ac0ecdad3c778de38180c9c4fef584e09ccc761c0dcad0a3a4fdf5c42a5d05155fa28766ee71e60bda0bb2231dda3a30b378c7f44d2ca260c1a8ff94821ec750c3371c4035330d0c2c108c20380200040b8060080200000888000629914683c474c2262644e0a8c48d0a273c2906c93968638a0f88225bdfd352c2ba5dcdd119e6dd6a49d22d51380fcdb770ae9f5768b21b9b04c2acd335bf97c66df0e00e413526cf20f3c7327042953de33e20207aec268017beb7c46b98d8041eb49b48b7a9cf7eda72108b4c6afd41f49294b244f09590cf9dd4077a429c4829424b0000414206622000b3320683201409c08355a789088f0dc7f26efdd3958bf82017a7d20a3386c38702c2817eab489cf7ac51b9f988b5dd06d1d86965d80f0fb00020c12b5a88fb4600af4a904521a6784ff446571315c7fcd843730acbf8591f787d70bec74bad96d6894469ad49948dde10ae2f7eaa4397cc7925c752ef9e9ba21885f53c228b72a40001e8100104520660be1c1a240279d880ba300318807004203ca95aa2d349773eb7c4a836641f185c8ea1b111d8de8b4964525adfc7ea8516f0bce864b393307cc4027403d5acc18a2eb4044c35742a46362313885696fccd33966fd2630c90f074e0fbee93129351e48012622ec1e81df28eb8d10f30b98d44eabbca89cbaa560cb6462afb17178360679bc12d1cb60556d7aaf83ddd024340894af9817e1dcdcd85a4ac4d87aafbc24c68cce5c853055169a8bb80e4607a2a2113f4d000029790320d0188680c03405e1202e098168280b0160560200066820036fa400e3f8e1a1a8860c40dc306da10603f63040500416440100080000581003c7720089b87823698286ec43dd42a4605232ac826d4a33b28880862b958501f06f0f11400a9892c24e6ae2e5c2017f19ab9f43a85959810262eea870d1311ff18801498f8e86d5226e0907160bc2e536b80cc41c260976154098628430d401480e037b8bbd038bc6d855a8c18ded5b7aa23355a5287021cb5ff5eb0d18bae23009c18994a8354bf4fb0802e18768e32fb4e03082b58095214c3ab982404e79546d3bb981f00412a648957ea6e6918220e29212401c38149114381221faac080598382a7b7a420c78408592043485228015359685d386003b953bfd6e0016d32)) <<< 16000) + 0xa7b7212019dbc0b8299086a5ae01214064c311860a81d005403b1a24a24613186101331c101785040591800190500812419c4038021863819ed06c038e0246879261632dc913437648c273a89a048c2049a3b2d004861ccb967f50e085d46480264802306669f7014aa06a1c050c05904081303400007dce0c0754643b82c6d970db5bc12312b6ffb1a871806ebd37a238a07d181bb81406edfb7960040009823fa401011396959a8805c166e489ed1ca4408128322c663409a6e1669d3d9f04b92300f257f6d483da937288cb1633eed63548ed33f9c74a30841d1207a8a684f7799c22c0389fa547b74d7101ff7f88008c10dc5981a66957ce0c01d9a5975eaf69d7201b05a42ce47265c1ab24c3c99fe595a93f3e669033082888a0000cf08002a2102915000432901021800545180ce6135388c6c60c155a6c1f83c80847b0eb7fd98804cdc833e0bb0404269c86ecc786002b394640c78202027041e83a04000c6ddba08a50a673c322ce8974ab581c90b01e101924da73089d729b8acf22d2318900c24b13e4b7e93f1abae9141f410835c82db06572c6193c771fd4ad2a033bb906cc0dcb0d6aeaef717f125756af37ef9e50b2c2e51112340b4000090c800246900121a2002028146ce0a11c1014114d6380780050220884a101e010a1983628477f8810302282c710405bf8128407004000029880d86c0a01604e0301a01c06700870c3139000b8918098340120807804203490c70cd110c22afc4003000c0c73c025100e0080000559814a64e0e963d1b67e5c5701825461527c239a02b6031405083d95a702b80883a3bf002018a828f7c69f49ee024cc08014763a865422760970a8000d6d432f8534064262bc8927e984867c711a18152dad4db8a6c81dcdb641451484400005ce4098440008e44094740481b0230d81104ec753d440d04e1c087246003ad09020380216384aa38749b081868a38232b86009784a081c0100100100005d10210580a00f084319829dac511e9e604e95102fc4900554070054c280bb80a02034021c65be4b102871849ebc808336182369ca045302c0259c7004d5a00038021430f351c620f058805786122a40c10828281037d30007804000030cd0a5d9e91272f22931fca18c2cc823802dbc8da7c797c286d175a94001a7d14cacb0a0873cdfa579d55e7bf536380040f4009af147cc9c6f1dc9272a3ba531696ee148ee09a97ab36c79ca089c21000027320008b86c73f024060d7070c0d788198690c19e78500152480019a8c005100680c0f00800007f902011000349901f1900f04f852262bf0df69ca82fb5d6a18213ac7e2259e884860563e940fb0eaa5f24e753acfa548c204d0865697f87df8526a830083e923e9dd8c6aae3706edc0000aad2f954c440d3493d20016d64ef00530204ffd4f20e40fc3cf411cbfa2c2e6116a9c99f696d37a06e184154471c27c249aeecf44e5080933edb8abe948a3643e30459b450767bf7e9dff824343eb680966b6e50a0672b45e407c664ec321c6ef5bc7c2d9a0842140101038ec4cb134518977f4e5953c06db739a14004624a5be2638a6729722d99a73057aa367c039d3edf1ef0d7979cf2f7d5867acc33b85c936945881488974499a2c3c626464bfe9ca211e40800043d203a220101180e008001fd080d92c06807c1066300c5e024181800880200802200002008a1d589420131c3aba181d7e4000b00800003e90000ba30080100400001110001342032038000080200540700001004581378800480200000d48000391e2101a03958af3365ee001c8a485ffb35b932a655ef8e440206e7e8457726f59fe6e4c93b85b8b26b265f1a8b80943503803919d54e10cda51c62d1ec958c6dbfceee3037180ed80019c403f66714cc66858920404047fbb79e1569fd2dc9355fcbcb1caff7721b5f0d3b406ab4b0166af01a5bc0c22d4a9000078640602402e0a0004cc202c2a0151100a04e05402301848303d9c60016010800008020000088c000040100260200003720241201101c04d29408a8500678405b050102801101ae4405b6940ab2400360201084a081401000009120061291804830d0201c43f698009e47006500ca181a0100000a420003f440405601c2200f09005808000e20d08242ee8d383cbf8df61616c3311a4831d05cf4ab354645fbec135674db14113f9cc469ca862332a27a86f3a58e01d9a4ecc59ebb7d8fa1db2d9ee301001825ac175e96729f27c91b5fe480655b2b2ca3514418f1923d21a890505412059e50979a0e6ad232c4af913329f142b661eb49879b98a4a48da300c1961182df200105c0262016008e22681c3e34384b98c05a492023712a1816008b2417e373f6a28fb3b72a6fd882624605fc575d5b7b14e10f5242aa50618f8916b3dd7eda94908df64c432c39a04813757a68d171a22fb8c407085fc575d5b7b14e10f5242aa50026ce1a63c69699757539f30a18cc2c80002b820006d640383401a1200c0900580800111880041410012c520046fa400a8e8d16da930a62e487e993050c1878fca8b43dd8b3c504df3ef7d8a66ac67444003890b54c6475b960c20052fa5c1330ca3cd310423069bb7019d7cdb09fa1d84eb6c2e0a3888198e2ade38e1c07f0c190638e02f1f0a01063804a2020010e3c8fce1c5004b03863ecd01040af1020030894194404c02000018670d4eed9e308075a623045bb04e30016611082e44141801c00005f900a0d00014090091900408801c3400c1a005010020080015348019e800844002020000100229b9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadScaleTwoCase3" = "QuadScaleTwoCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadScaleTwoCase3 private def zz2070:"s0816"="s0816":=by decide+kernel end section namespace Green24Proof.QuadScaleTwoCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x86a8, -0x2ee0, -0x3c4e,0], ![-0x2ee0, -0x1c1b0,0x3a7a,0x3228], ![-0x3c4e,0x3a7a, -0x13148,0x2f06], ![0,0x3228,0x2f06, -0x1770]] noncomputable def hinges:Hinges:=[(-19,l4),(19,l10),(0x1fc,l14),(0xc15,l17),(0x24ed,l15),(-0x1770,l27),(0x1770,l29),(-0x1fc,l25),(0xc6e,l30),(0x1770,l33),(-19,l38),(-0x1770,l35),(0x1770,l37),(19,l34),(-0xc6e,l43),(-0x24ed,l41),(0x1770,l51),(-0xc15,l62)] def normalizationDenominator:ℤ:=0x2ee0 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1770,l27),(0x1770,l29),(0x1770,l33),(-0x1770,l35),(0x1770,l37),(0x1770,l51),(0xc6e,l30),(-0xc6e,l43),(0xc15,l17),(-0xc15,l62),(0x24ed,l15),(-0x24ed,l41),(0x1fc,l14),(-0x1fc,l25),(19,l10),(-19,l38),(-19,l4),(19,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x6210805060200000000088072008000000110009900800001043100a0c04000000001201840180000000034062008000000221e0298040000138110058c040001284c12016801800000001e009200c0000188220141808000000001e01c80200000003c002640200000006c440630080000002c24039804000014848004cc04000000000b00a401000000002c009200c00000001b00490060000019024030c03000000d02201c60180006804100263014000000000681900200001042100a0c040000000c8a80e601000000682c00b300c0000288620141808000000002503880200398a82200f480200000000054062008000000000a031004000000001201c802000000024002640203182302b00f2401400f81e04203c2008003c0841a027100400000044140186018000000000b03200400000210880b18060000000009018802000000048280e601000000280c00b300c000000261203180400520a81200f5004a10520210019a803001582405809d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x927c4b977da9084901749876c6d928749161c160631238e1153d7a66ca101a4ae3147404882122e7315700c02ea5d0f4808697992c37002d07c5920564050e4b53a48e0042650a16e0c48a0a8a40820047460000426481331afe8001401400009219276e109202a64a1d09f091c6694a1018109103c30300a9db700100085920707450e698fa50a1fdfa48a0f2bc50200426481ae5cb53000a00c00003948000f29e3e6ca908180093638c0961e20525efd8e282587880c2ca483805ab440f1c205406000021e40cc07851f744cffd280e24d50aa4733a0610ccd0a0ebdb03822086e39826818113bfdb3b2440a007f362af88404003f9b157c4200e8ccb909c94edbabad107102d080000101102e0981902c0c40765f68f5c6124939216491260e48c07d6f10302b44c1860b6e01c10c085c2004aa3f644000b01034b08cc02cb2e8f438902d2530929a2a2c90bdd42060bdd4383170513821df322c0e9be4d24005006000028a68ac32c013decbc1a4006e18acb5ca4b2088d909f57e80510111bec2665491c503814eb8853d1a1838821714e3fcd0406ed1a50703a5002cff77bc107536b4cf8498043108800011599248d0c1f5b4a1c26461017470357825080c00800004e992657668742871b8dc86c91c186ee202850044447430c0c1e1303020bd6e5b0a080e8aa4718103f24c9027104040f01e3087fc307e8a28761b2c60e71c098c094203002000013a40008e881802e851ef081630c1c5580841006410204ac6004671400fa8149c50380200001c278f250e6d75a246c20526b8537406a370e28444677facac2080c0f6b0851ad5d220203aa77209275304118d9d31e37dc0140083f8c094987ac80014edca987c4800bb49ee01844081a84c2862862f9d25b020c3cf7e0c19627dbff5205353a8149c473897b07d2d0bcffbb2f01c50bfb4fd8c0b227af7e576ee6ff4e6611401fd888743d4d3ac7bff3d3ae8ad0bfc0672529bde63b1d180177ed006d7212028fd0bb34bba59693554e87bc7374820f8378000332205e0a0005b6205c32000ee1202a0be1a64f1e58c1f451585041e16fed22c1c25b6675779cda3d05631b7f1dcef2620504046afd83bc374fa37ff4026d658205d261b427a67834cbcd1cbd199cf9007415de7f60fba679911a3d26bf276804d63c7f0137fd077170a625fa7f3d481b31153868279a326da389d8e04a270ef746e8a4994d8e60ba18910a1cc6800007de7040d5ea8b42a918bbbfbec308670a7639cf240e3516b0c084dda4a228908e9c8dc50c127122cb9dc016e13d9b43001a9f1e56d070d50d2810502f68e7de9e6d1b73ce9208061954f9cc288ddf4b4704039bf1544ffe8eebc7ab9008c886e54c8102f5120e589e210000342205a4a02c218158280a80503525ddac384baad790c12eaffec2843e5b851000f96e143804dda498a007e07fe082cd4e2508f84bdd5523920d01830a4f7bcaae54927142009f9e286432ed1beac9180076ef84c2821a52bd1188904317860e6028087e4279be05000076ef84c0963c068082606061401682498a10143975fca19214e48c0128282119512084734600003e1404088040000434d9296cec8683a1296400099be1003ac50a3a50e056794e122c09253461ff9228800266f8400eb0208c1d880cc22525803a0c1d9b4479013602271a4e18641200001fb205203a2066c7ba8a128deb7640ac9504ea221950f02204cd13846e9a0ef0d58e2001170349bae1791050c008b81a4dd70bc880802223d32c95edd597002877d75438998b715606ff157d9709851043300004d6403c2601803815f6faedee4d50409e5da65fbf1b21c4002bca1d2c300c182fbc43ad510850431c4ab0231bc2020afa988da5f31800c22b8aee177840003f85f88daf8000dd40936610386211891962edc86343050a009cb6fc0e8245999491135620a200c3264f174460806193278ba22020dc06984d4b0c001547718aca000080645f11e20083f868790185a0f8b27ec931b45dc5428565d0801593ab4915f95e668afc3b144010ece3abee6030c761027c8b8f12c2010ece3abee6040411631b5c735e18021c47b0fb0ee40dcbac795b80c3209000011c900c1101400809c040009) <<< 16000) + 0x3e4001bc880076d9c1d60ed182eaa22383ac14860502ba0a020172100002ac000a25a00db860980a20675f221c5c69f81c27122f1825ce931c131d80181004e60c0259c302170c14018000085902611012808090040460202201010808000a9881014c07c5603c2300c0dc0a8c34db7dc29005aa15b015363809c1d447f0a0a014fcf7b93521009200ccc07a800342bc590ed900acad8c65da13d1baa1aa314373b194a68540f092768e3070afc71c9d22422810608112180109866080e00800e80a425303051b4c019a8b1860580400001b080e00f0c04773183412cb6aff0101000f9032e552ab0aa204023c3dcad28ee5546df80a085a04f7d726e32351c01000f579ae66ddb856410020097361d0b5a78017d40019fdda3a7f6354b2bccd6a332c1ec9bb2606144a0f400015990161580d82c068070140100400c82e040a220865830847840cde0190402c02162817041046c2847da380d2f0e0006c025100d0080000531804008022c5a150e0a7bc700db411840680400001c080c04805c140001ae40008e0f0c002bfdc4b5be01cc6e03fd75ba3c52dc327e0d880a11032a038568a0d8fafb74380e6a6cf530d557c5001a4aaa909e8f132dc0627b5c4e0d859a2d561180003c24f2f079c6757e697486f49e79490d085675016836dab6f566d905f21573eb10fe3630816613e60aff712d6f80731b80ff5d6e8f14b70c9f83641c9c2400001fc101611000359100f1580602e821b315f3f0f4072bf5e86465faad4002835483fc92055fc2f5b5211a7f8aefc18ee18587cf2dbca413820020693e36f6e2ec1c5075775ba566939089bdd2d840107b20355db67b09d171500ac431118fe89e018a0003e2a0b41eed8e7d46b11183c2eeb2ec9c6e458a1047b871b9e07f1c945f82d7c0fb46a1fa713acab176be7c6f9caa13a3ba3d3e38680d1a5726e548593c490812008023865dc4c06cd4fcd4f9dcc4cd244bd7b9c37ab205ddae8c0092464b776843c66bd889b99aab5bd8c4757d6b331228053f1b3b6f61aaafe14e966e28149ea3fd625c7435388019f3ec3e4eeac881a76c1d0fee8bf31de3bf47826c2006742e891814d89ac35db664d49a03f703a21fe0e4b901bf1eb43e611887c88206cd1e5219837df6cc8d39092a89f00008a240586400094640025a0800a7c9818b5def2797b2988aa62be6454a8563ec15d7d708dd61a0c5fa180c65ad4ed6d6cbb85dcf28a06d82bcb186ecc7c214b0620bf1e28000e58ed3d7b97c873a4e8b734a95f1172d6ec836858e3a92601005aef793cbd94c455315f322a542b1f60aebeb846eb0d062fd200000c6e504e8ad5d2fa35d6694935f11e7721f088e5bd5116be2381a62a0e31e55a4f7e3ac6693a2451ec057c30fa6587cbc0de4b829fb5a13865f139c7a77ece75cbf12418e5694cb9a604438c72e40002e69001cdf2006100602661470a6f01420de04042020c1042040029808009a01127180e0084202f7920001ce401f3aa16a3eda91ec5413400000000000000000001311041010e10a10608208a00a25c600401a0002dc405477020c040708180eb0110107a8390e15c90a9100a2e4db86080ffde080040d110400a79a802005b8e982fd09101802c40808abafdef9f72093f10fe10710749fed35662aee1b72907b10110915dcac264d079c0356b31c2bbe0c8ff494e05006586dc84024245772b099341e700d5acc70470d67863dadbcabc9b6dfe02febea507cc13e6d9b1f2c20b62700002df202a12014090098280012bc8090ec008054404ea4f44b5b86f34c3a5794e4b5d4ad780893c5aa284e3f65c56f9bccb9cf538addc23d1fdbe8790a9ee850718d1f1c740bf260075aa44ca4ba5359e644e3e4a0a0413a1be9be81a80f3909811cd35979631f5481c7604702090c169fca44cb84ccb88170fba97631f6094d1011239ce99b8107b5134f32e3bd27ad16c0f1410a326450a62a28258c0802b70200790024100d008000046181851d58f2a20584c49ec7f8141ad9aafd7a999be2afca93c2026163436c7e5c7d69490dc43002c85c322b8f1169ec6b388200be29f7b2adc8fcd18d6fa04a1ce8518c32f18b7bd289255dbdd8cb9048266bd65145712c00015c90111180808803c4601803a188ffbae4da464913dc0bbce958234c9d8a7315a0f18f1b5b5ed5a99dc6d4de30245329d4e1e4ed8b241ed54a5b3c132b3f6f03eb54b0e82873eb62fddb1f5700047a46febbbb5daa14c8fd4f61f6f3ea548039f3d444b8fd07fae694c2610c021191f720450b557bdb97ab647379f40dc7f395f1eccc9e4f80ae9cc4b54582b3166ae8471a47c22c9cc2a5865f04069e5105e019e1bcd648821377314631ea748c36543852c8801e48e07b0040ad0004a2816010c1a0430d4820517081788602dc109450240200001264000528c0600401001a0a000037201823914007c81972a955855100c3023b98c1a0965b57f80904787b95a51dcaa8dbf01010b409efae4dc646a3805001eaf35ccdbb70ac82004012e6c3a16b4f002fa80033fbb474fec6a965799ad466583d93764c0c28941e8a09600a14681c066a2c61816010a1e0dc710a2c4127a0a087e05081dc5015c066080c00800702c0003288068080005988060c802c240140a00047420016ce4004dbcd176d5ec00a18a5d49114160ea9de202004a3804001091aa040017106f007e830a0d81630c4c091459aa78c20280850c129c2826f2a101001300b6141100400006b90091900404801c1400c0200501002008000a34801928008340020200001000efd9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadScaleTwoCase4" = "QuadScaleTwoCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadScaleTwoCase4 private def zz2071:"s0817"="s0817":=by decide+kernel end section namespace Green24Proof.QuadScaleTwoCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x5386, -0x2ee0, -0x3324,0x6a], ![-0x2ee0, -0x1623e,0x1d42,0x3876], ![-0x3324,0x1d42, -0x13148,0x2f06], ![0x6a,0x3876,0x2f06, -0x1770]] noncomputable def hinges:Hinges:=[(-19,l4),(19,l10),(0xe56,l14),(0x3bb,l17),(0x405c,l15),(-0x1770,l27),(0x1770,l29),(-0xe56,l25),(0xaaf,l30),(0x1770,l33),(-19,l38),(-0x1770,l35),(0x1770,l37),(19,l34),(-0xaaf,l43),(-0x405c,l41),(-53,l46),(0x1770,l51),(-0x3bb,l62),(53,l64)] def normalizationDenominator:ℤ:=0x2ee0 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1770,l27),(0x1770,l29),(0x1770,l33),(-0x1770,l35),(0x1770,l37),(0x1770,l51),(0x405c,l15),(-0x405c,l41),(0xe56,l14),(-0xe56,l25),(0xaaf,l30),(-0xaaf,l43),(0x3bb,l17),(-0x3bb,l62),(-53,l46),(53,l64),(19,l10),(-19,l38),(-19,l4),(19,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xb0900e601000000002c009200c00000001b00490060000019024030c030000d0082004c602800000681100e300c0000000007819002000000000340c801000000000e81240100000000003032004000641106005200600000001a2c0cc0100000012878146010000d0420c02e400c00861202803d20080000000906018c0200310a411812c80200000b8641c0a4008000642a0980f2006000000002a0148020000000d8301c601000000000640e200800c61904404b20080003c198280a900300000f0c8280a801000000054440f3008000002c1080f1806000330d04807900300000000d0606600800000321201e300c000000003c029004000000000d024802000000000b00a40103182302b00f240140000000241819802007c0f02101e1004001e0420d01388020000000002406200800000110500618060000000011038802000000001100a4010000000341c0a3008000000001207100400981604301e9004000108701c03c801800000044340f300800000210e00f1806000000000140c80100000000012064008000000000b0320040000000022049004000290d0240890030000000070a0660080000004c24063008009a118240192009420a404200335006002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x540920081441942100b8200a000000001a014802000000000280c4010000000443c05300800002702200b1808000250982402d003000000003c0124018001047431024400c1e41141680c6200a0000000001c0c801000006812807260200000001a001320100000003622031804000014848004cc04], #[]⟩ def dynamicCode : Nat := (((((((0x71d0050f306ed1c6038838907e470e36a81040098a0018e000431d8000f00471a098a0f3073c69c60811b38a053bc7903bc5810400e41c052e4a2400c9c788001301400008e1e3a00a0f304214e307fa4e241f90e1836a8500392c1002cbe7001000871a126a9e60b67e) <<< 16000) + 0x7181d839e40b24e7820a779c042e5a4800d2b53800900800003d48000fa9c3288770c2c24c74d284b558c28317ecd1870a70f0010718c009cc2024708140180000849b28296d0e245005cc26db720b24c5cdca005005c600a76980c860c140200000769a24d21f676279a40f415f00892c87c9275d40a510608e3d1988a17e4553ccc09622cca4f4b9234002c2921a443800d8f70e40802e4f187408138360000768d102aa2481f21838608a1e10848fb4328214f900088070018a28d0281a0100000f330445bd8b2b4e2c764818b54282e1a78d5c1861b29419d75be692c12e1a52b3b111170c004aa2fba239bab42006dc64f2c8a89a80001cb1f6451b8b5e04597457c75625718390b000011d1a146772050b6871638b1402cf01002e100594603802009c020000c43221131708e243d4f48c229a0e11002dc7ab8a023bcb1880083f190400b33e8020a3c998473e7201802c0000a710170df14bb39b00808c58bf5c40842a639420b0cbe5f8805737e644a00c7f2abc01271030c0e01e2852d0c7160cb082dd80500bad00490603802000012a644e841c498d184f46200b2e140a9f10023608026c1042e38180080000d6209a3a04c0900017a104b11e0c7f6d10b6f8c1569b6072118121283847a64980658cdafdaf31e92f44bfb102a3c8606d8e3df9126a1e8283795e040acd2f9a07b6de2273108b85bb2cd00504d5685a244dfa2ec4a3efe5fab9451df1716fd258e6c340cc6a4d79548f8a0153b112259992c0c9759707147944952422fa9ca6e6ba97cbc90c1c46500007c47040e5d94c3084da0120c085547c90c11dc18e830017ca5a05029fc9d00804a054704101088a2890ae8bcb21eee39a0d81a0000630825168124460900a0470140d617edf1c25b20210c131cdbf4508778f9c4003ce1c81c030f24a0a007768981441e80e6910122c2aa4e5032058d2d8767606f6515643e5215a2c727bf165f89438096b58000a08a922c3700582039bd7e1e2c0b8292604a0c0001016400028a4004041282e38c034338b13712cbcd5c30901a7308839d2c81580201009624024c4280410008718603628b2e231fa1848983ee3082291d459043441880401d2816005e2840401e5f96644020b810000050480012f904601e1432237aa1331c123143b6e94d5fd201524258c016202a14bf0d78143558d0abca5d2244240000aa918ee11947408001f66db34b66f80608001f81090f8dc4f2004d3d153a75b63881f0600000974d92db5d04104c5e050a448f848b5ff5028602968082214165804b6580064e282803000010f3cf112ea396b6e2a8f16b80744a2081481040c9003001000b2412e30120250000f120341301905f3c44ba8e5adb8aa3c5ae01d12882442041031410411800000000c100080379e225d472d6dc551e2d700e89231228a20c10810808600164825c602404b64e1007dfdca122a0248c52854b4dcd10e379d5c734c648ab93a7e55d3b354c245d881405166f177b0f4e5854916200e50f877d8ba7ddc7fc0c32aee20e1931391c2d8c83003588c541d8d8bf1f2564040545ce6f4678b7d114e45001fbd723ea5a409c613c4100006704084340008b240015a480075690451dd92f78c0285031f09425a3b70912c43364069fb0b0c259d33120b2f8e880400b2e20001bf3364820a80e2468d2e43296142ad3ef96484915bc397589250818ed2a71d2445a7df2c9086105c79d18e430077e305a96474c007042505c0000c7991e5e2e8b2f15825e067a488a042aa0160b0f9d9f224326295136633e8e626a901a2301bc42e49598fb98904857bbb3c93bebd607810226b86c9d545731e8e718000b230ccb17d59dc1e0200b01a0a82ce262b316875cb1bfb9e98b66808490e80001829a215ac081429e2809245dd739c508b4f4c891103bbb901a2a3911823973a04020051fc4000333de324005c0914441b9dfa8b850aac15089e1922d35c6b415e50854bf564f2922164bbaedaa30452e61ce770600753e9764f34f400e004c0c00001953239f748a2809f1221591902441a9219bb190197a80e116440a091b18c0006a348208004000047c82204c00118881b08a88b328f048c3d9ae89122275a9020e1a9920352a8bc284354d94704006d50600044520801c84bc4224105c09144272170fd2c91e85358c072488abc02194520441b12282f121859448df9c80c0168fffc02843903e08772b9200704250580000c7191db649a40dedfee1040147f101c2c4ec70d8a150404198761c202de408094eca4500036a830a420540700002a6410c26084020004a62082320400900f8480fc0407c0203d010007f6103c3181d8ec068660741ba2052235fcc775f472031aa838daea22005e6288d6bed5185f2b860328faaf03807d0766017cb8774874da080927bf05008c99a47151e4ae439fe3191f75e8040137d57661b2fac6067244fb0f43aa005050af1ff8cea62aa0302cedb66f602411c4e7d75d4bb27474314c0efc7a6c909279d6adf9a57485ce45a869649d388de71585e2fec84bd3c436a29e398cc249753183809871e4e04843f71c2079120756c600100233880680400e4360701203701e0a9644cf005c1b9022cdc9e0207c15fb800a0355fa693d18746247d376d6e6850edf4003801cfdb34bdeb86598d7e84110f7f54d68004020a2c6822bec6f6919869046861d64160020d7c81b04bd22a4cc05527e08a3f9a7916ab999a2b9fa3a4d428e26de52da0201052147a10100100450748480570620c0900868a8660b6848a2e2802e0d0302001000)) <<< 16000) + 0x00ec400038480008f10361180025c10350df1c5ef485dcdee990e28290841ad4567624335fdb22bc7ecb2485afd6540e01823850544893b9041d1e8608458976192e41508152d60c8498db2c02803e53a715b392ae7aa07bc6b38c1b856284614141fb3cd0b25e30424e10269514007b87009b40ace281a010a11a2d2bf3d567538eafde703b9af2a5cfbfa5186140ece6a8fa87c6854fd38eba10eb02badc20099470da7420326bd48bab53d40c2a041821f313efd75699511f2c18c1babc9df9eb903151e2ef8ff314724881187c459b7324166684537a14388cee758fbb0efba7c7957f1c2ec002c235165688a44f740d91b23802d6baa3a84cc3c7d2f7f19e492dd999691c95954cb24f6f3c23f8196f59a62e588e57955292905344c50000a6640018a080a8e805c2400119c40d03700c01004401004011023e901ec90046918204004000017c8198280002c4c0400401000004440c84701219c20202c160445c20016b8401a3c0a128c0700400002bc8150c80c45404c0a0250500012f101a1180c84e05226861e49890091230040a1001058128606804386021861d3a848405a88103eca48181c01000008e202a230301181788c0b8260240b02d0100880e08a01121efe5a48b0f3923ed428a91d15f1e547f38ece633780a0c118101836308291e7813e48a1ab65ee9843d087cc99d87602026f22af29569f2f62c68f3a2280c69e749bda3466ae5d1cf68016b22ef79eea519c0ac44529439d3b08b9879e07d0bcb7ba9421e6b93964cc1d5ba26205b1405d562ca1aad5da92f84a00000000d9ce78f73192816430c5883084864003803000031b9dd264a7cdb765a891ee3561ce120ace8b0c6e38a623de2f071e20c3942550802c63018010d1a1b638b2c43c4cee9400e0080072e00b28c0680400002a880009c900031f304f4147d629a17573190b2f0b1f101b6a3c410286ae93e0440a73e1fabde821046123f4cc1c107f9376667ea5125ccf5b9f4224300a2fd1c0713d80e36eebe3f26181fd5cc8146c8621180073044841e0453c53ac5a8f948020b2f760004b0136a3bb2e848df46075f786513aa962a3c9877d55caaef499c37e2a262a4e0f8da2a4e14b13de4801ec6c034cfa1e2d4f4a49103e80004a1202e22000baa20582be3e25070ca0648452a5230c0d00870c4488072d1220c0b00800002a102b110150880a4340501a027090130080940404803023010000ce9000f72200425a6063c19862753b328f5205e13e0c09704ca98ee1cbd8b427031ac182031700ff3abe05e09387baa8c069dd530b67e0eb2f50af1bec280081496b7a26b8a83ca49b980200e6c6623b67f643e4205ce888088000c8f9070b1938c936c3e85342dcf8644c555f64d831563202f0a00000da08014a09004a073c305e02ece9f71e9ee38381ee1a526781e388607ef1bc0195580d96880a4998342dc64ab291004bfff8f1c693f81018175850b32528c80340418fac682ab0cff9fb1251f65d572065778e0ecae72c214ac507e19890e0711832d0440415d041bde8300baf0019460380218503877dbbe486492288c00809040d96720808ba62be0e0418816b6d0830048046c9fc007d0900c30460a800015920443b02105c877382033488c1a1f040802a180a570804fd8084c301a01002001c86efc407bb440431c482fd048086002254703001000014c407c3400035c400105880f12c00c050312406044fd101155850262910099481425180e00800e80e851201034aa2816e00a118c060043040ee040b3384802cd86002201013fa8284a301c0100000ae200027a4070660363201a0980c84e453968706a591411c7880085f0049060380200240301101d8eb9bce1d7d01a16e47672f0e836949892e907bcbf86333b64af824377c146d3433e761fe7a694f23ec850385770948912f9260f845901c78fb5aa29cfc1bd990bd805087a5083cdee6e137d42c0da9e0470c7e22156d3704dada36b69cf5a7c3185d2087f385cbfd73047a8002ab2421bd26dd38504fdd98a6b497f7ffb7d3dbb9f81c6e6ea0668846165dca7ebba2bcfacb59bdbce74b5005f6c5f43921c8299a608b1ddfc486d9c203ced0e1aabcb0b98658019e18027408b38a068040000368d0c68df35bc2a47dbaac0e55958f0821147459b292ee4ecc99c1496204052bff6cac9021e9e83ff62bca88e11a132f9ccd9eb72410e2da67a43042428a602969bc756f233fb9c8140b0510cd0d35ff449d9eb21d4f82283a4d448315b0114e59491c40d752c3a5ca3ff486447f2fb98619859000072c402c240013ac40608602e1b804008022c3b1d1c00a922040c008401004010000044400024080b02e02002008000022202a2b014118098880480602203d120c4085a1001c83186048042038b2002b81106048040000140c04004010000044605712be4226337fc20757c750160774cdb458246712e788c0da0180139e17bc5f0150e6719915680806bb5dffafdd5463e434f721010916346ee5429c1832b118ebdb3852e2aed61e63216fd0828be2a000028620201a824c38a0494e20210c280e108a0020c465100d0080078880383601a020000e420182200b0d0002769000690200230a400503cd164a32afc0a18b1e28f91810020abba2826e480f1c40400dce1188003d688900c0002006c61001050997000271040c0f81e28be9e90c20112a30600900a18040030404dc8a09f7180800026002ce30240100000fe20143a0091100406801c2400c0a00501002008000cf48018c8008640020200001000f6b1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadScaleTwoCase5" = "QuadScaleTwoCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadScaleTwoCase5 private def zz2072:"s0818"="s0818":=by decide+kernel end section namespace Green24Proof.ScaleTwoCertificate open QuadraticCertificates ExpressionCertificates ScaleTwoRows open ParityPhaseRows (Phase Potential) def rowsChunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x104d62ef03d92039607e81bc6019607e823be1603f403de07d25001a206d2039013e601d207e803b6520fd0029e86079207e808b6069201fa0792019201fa01ae120fd0029e8607c207e801f8a606c203f423ba01c27d2480420fd07cde078203f4019ac2028207e801fad6018203f458c6020fd00214] def rowsChunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x14003f40603d701fa1605d707e812572ef00202d307e811ae01d307e80986039307e808b6029301fa0792059301fa01ae07c3192e02c37d028001c303f40ace4307e807c207837d019202837d03d2018303f40582037d2207d607e809c202d607e8158a01d607e82fea14] def rowsChunk2:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x101d501c802fe5501fa06b2039503f418ee029507e8319e019507e830aa1503f406d603c12806de02c107e80392fe05c103f444fa038107e801ab9202811908aa05817d0a9803d407e82606d417b82603d0283602d007e815b605d001fa028a07c0286602c007e81a9a05c07d6614] def rowsChunk3:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x103d501c808c602d501fa15ba02] def rows:List (ℚ × Potential) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 def mu:Phase → ℚ:=![(-0x3e97 / 0x1f4),(-0x35ab / 0x3e8)] def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r29,RewriteAtoms.r24,RewriteAtoms.r31,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r30,RewriteAtoms.r25,RewriteAtoms.r32,RewriteAtoms.r23,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r33,RewriteAtoms.r34,RewriteAtoms.r35,RewriteAtoms.r36,RewriteAtoms.r37,RewriteAtoms.r38,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadScaleTwoCase0.base QuadScaleTwoCase0.hinges QuadScaleTwoCase0.normalizationDenominator private def zz207:"s00cf"="s00cf":=by decide+kernel theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadScaleTwoCase0.base QuadScaleTwoCase0.hinges QuadScaleTwoCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadScaleTwoCase0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r29,RewriteAtoms.r24,RewriteAtoms.r31,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r30,RewriteAtoms.r25,RewriteAtoms.r32,RewriteAtoms.r23,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r33,RewriteAtoms.r34,RewriteAtoms.r35,RewriteAtoms.r36,RewriteAtoms.r37,RewriteAtoms.r38,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadScaleTwoCase1.base QuadScaleTwoCase1.hinges QuadScaleTwoCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadScaleTwoCase1.base QuadScaleTwoCase1.hinges QuadScaleTwoCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadScaleTwoCase1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r39,RewriteAtoms.r40,RewriteAtoms.r41,RewriteAtoms.r42,RewriteAtoms.r43,RewriteAtoms.r44,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadScaleTwoCase2.base QuadScaleTwoCase2.hinges QuadScaleTwoCase2.normalizationDenominator private def zz208:"s00d0"="s00d0":=by decide+kernel theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadScaleTwoCase2.base QuadScaleTwoCase2.hinges QuadScaleTwoCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadScaleTwoCase2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r39,RewriteAtoms.r40,RewriteAtoms.r41,RewriteAtoms.r42,RewriteAtoms.r43,RewriteAtoms.r44,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadScaleTwoCase3.base QuadScaleTwoCase3.hinges QuadScaleTwoCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadScaleTwoCase3.base QuadScaleTwoCase3.hinges QuadScaleTwoCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadScaleTwoCase3.nonnegative x hx def quad4:Expression:=quadSlack rows 1 1 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r29,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadScaleTwoCase4.base QuadScaleTwoCase4.hinges QuadScaleTwoCase4.normalizationDenominator private def zz209:"s00d1"="s00d1":=by decide+kernel theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadScaleTwoCase4.base QuadScaleTwoCase4.hinges QuadScaleTwoCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadScaleTwoCase4.nonnegative x hx def quad5:Expression:=quadSlack rows 1 1 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r29,RewriteAtoms.r24,RewriteAtoms.r31,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r30,RewriteAtoms.r25,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadScaleTwoCase5.base QuadScaleTwoCase5.hinges QuadScaleTwoCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadScaleTwoCase5.base QuadScaleTwoCase5.hinges QuadScaleTwoCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadScaleTwoCase5.nonnegative x hx def pair6:Expression:=pairSlack rows mu 0 0 false def pair6Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair6Target:NormalForm:=CompactPair.toNormal LocalScaleTwoPairs.compact_scaleTwo_pair_6_base LocalScaleTwoPairs.compact_scaleTwo_pair_6_hinges private def zz210:"s00d2"="s00d2":=by decide+kernel theorem pair6_identity:identityCheck pair6 pair6Rewrites pair6Target = true:=by decide +kernel theorem pair6_target_eval (x:Point):normalEval pair6Target x = LocalScaleTwoPairs.scaleTwo_pair_6 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalScaleTwoPairs.compact_scaleTwo_pair_6_base LocalScaleTwoPairs.compact_scaleTwo_pair_6_hinges x theorem pair6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair6 x:=by rw [identityCheck_sound _ _ _ x pair6_identity,pair6_target_eval] exact LocalScaleTwoPairs.scaleTwo_pair_6_nonneg (hx 0) (hx 1) def pair7:Expression:=pairSlack rows mu 0 0 true def pair7Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair7Target:NormalForm:=CompactPair.toNormal LocalScaleTwoPairs.compact_scaleTwo_pair_7_base LocalScaleTwoPairs.compact_scaleTwo_pair_7_hinges theorem pair7_identity:identityCheck pair7 pair7Rewrites pair7Target = true:=by decide +kernel private def zz211:"s00d3"="s00d3":=by decide+kernel theorem pair7_target_eval (x:Point):normalEval pair7Target x = LocalScaleTwoPairs.scaleTwo_pair_7 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalScaleTwoPairs.compact_scaleTwo_pair_7_base LocalScaleTwoPairs.compact_scaleTwo_pair_7_hinges x theorem pair7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair7 x:=by rw [identityCheck_sound _ _ _ x pair7_identity,pair7_target_eval] exact LocalScaleTwoPairs.scaleTwo_pair_7_nonneg (hx 0) (hx 1) def pair8:Expression:=pairSlack rows mu 0 1 false def pair8Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair8Target:NormalForm:=CompactPair.toNormal LocalScaleTwoPairs.compact_scaleTwo_pair_8_base LocalScaleTwoPairs.compact_scaleTwo_pair_8_hinges theorem pair8_identity:identityCheck pair8 pair8Rewrites pair8Target = true:=by decide +kernel theorem pair8_target_eval (x:Point):normalEval pair8Target x = LocalScaleTwoPairs.scaleTwo_pair_8 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalScaleTwoPairs.compact_scaleTwo_pair_8_base LocalScaleTwoPairs.compact_scaleTwo_pair_8_hinges x private def zz212:"s00d4"="s00d4":=by decide+kernel theorem pair8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair8 x:=by rw [identityCheck_sound _ _ _ x pair8_identity,pair8_target_eval] exact LocalScaleTwoPairs.scaleTwo_pair_8_nonneg (hx 0) (hx 1) def pair9:Expression:=pairSlack rows mu 0 1 true def pair9Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair9Target:NormalForm:=CompactPair.toNormal LocalScaleTwoPairs.compact_scaleTwo_pair_9_base LocalScaleTwoPairs.compact_scaleTwo_pair_9_hinges theorem pair9_identity:identityCheck pair9 pair9Rewrites pair9Target = true:=by decide +kernel theorem pair9_target_eval (x:Point):normalEval pair9Target x = LocalScaleTwoPairs.scaleTwo_pair_9 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalScaleTwoPairs.compact_scaleTwo_pair_9_base LocalScaleTwoPairs.compact_scaleTwo_pair_9_hinges x theorem pair9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair9 x:=by rw [identityCheck_sound _ _ _ x pair9_identity,pair9_target_eval] exact LocalScaleTwoPairs.scaleTwo_pair_9_nonneg (hx 0) (hx 1) def pair10:Expression:=pairSlack rows mu 1 1 false def pair10Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair10Target:NormalForm:=CompactPair.toNormal LocalScaleTwoPairs.compact_scaleTwo_pair_10_base LocalScaleTwoPairs.compact_scaleTwo_pair_10_hinges private def zz213:"s00d5"="s00d5":=by decide+kernel theorem pair10_identity:identityCheck pair10 pair10Rewrites pair10Target = true:=by decide +kernel theorem pair10_target_eval (x:Point):normalEval pair10Target x = LocalScaleTwoPairs.scaleTwo_pair_10 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalScaleTwoPairs.compact_scaleTwo_pair_10_base LocalScaleTwoPairs.compact_scaleTwo_pair_10_hinges x theorem pair10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair10 x:=by rw [identityCheck_sound _ _ _ x pair10_identity,pair10_target_eval] exact LocalScaleTwoPairs.scaleTwo_pair_10_nonneg (hx 0) (hx 1) def pair11:Expression:=pairSlack rows mu 1 1 true def pair11Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair11Target:NormalForm:=CompactPair.toNormal LocalScaleTwoPairs.compact_scaleTwo_pair_11_base LocalScaleTwoPairs.compact_scaleTwo_pair_11_hinges theorem pair11_identity:identityCheck pair11 pair11Rewrites pair11Target = true:=by decide +kernel private def zz214:"s00d6"="s00d6":=by decide+kernel theorem pair11_target_eval (x:Point):normalEval pair11Target x = LocalScaleTwoPairs.scaleTwo_pair_11 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalScaleTwoPairs.compact_scaleTwo_pair_11_base LocalScaleTwoPairs.compact_scaleTwo_pair_11_hinges x theorem pair11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair11 x:=by rw [identityCheck_sound _ _ _ x pair11_identity,pair11_target_eval] exact LocalScaleTwoPairs.scaleTwo_pair_11_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad4_nonneg x hx · exact quad5_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack rows mu p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair6_nonneg x hx · exact pair7_nonneg x hx · exact pair8_nonneg x hx · exact pair9_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair10_nonneg x hx · exact pair11_nonneg x hx end Green24Proof.ScaleTwoCertificate private def zz2073:"s0819"="s0819":=by decide+kernel end section namespace Green24Proof.ScaleTwoAggregation open QuadraticCertificates ExpressionCertificates ScaleTwoRows open ParityPhaseRows (Phase Potential weightedQuad weightedPair) open FullPhaseRows (area pairProduct scale expressionEval_append expressionEval_scale area_eval) open FullPhaseSemantics (quadPoint pairPoint sameColour pairProduct_eval) open FullPhaseAggregation (area_sum) open ParityPhaseAggregation (weightedRows_sum weightedAggregate product_add) open ParityCorrectionAggregation (classMass_interleave_zero classMass_interleave_one selected_area_sum) noncomputable def stretch {q:ℕ} (h2:2 ∣ q) (g:ZMod q → ℝ) (i:ZMod q):ℝ := (stretchFactor (ZMod.castHom h2 (ZMod 2) i):ℝ) * g i private def zz215:"s00d7"="s00d7":=by decide+kernel theorem stretch_interleave {m:ℕ} [NeZero m] (a b:ZMod m → ℝ) : stretch (dvd_mul_right 2 m) (interleave a b) = interleave (fun i => 2 * a i) b:=by funext i obtain ⟨⟨r,j⟩,rfl⟩:=(parityEquiv m).surjective i have hr:r = 0 ∨ r = 1:=by fin_cases r · exact Or.inl rfl · exact Or.inr rfl rcases hr with rfl | rfl · simp only [stretch,parityCast_apply,interleave_even] norm_num [stretchFactor] · simp only [stretch,parityCast_apply,interleave_odd] norm_num [stretchFactor] theorem stretchedArea_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (g:ZMod q → ℝ) : (∑ j:ZMod q, ∑ k:ZMod q,expressionEval (stretchedArea (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k)) (quadPoint g j k)) = 4 * profileFunctional (stretch h2 g):=by have hp (j k:ZMod q):expressionEval (stretchedArea (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k)) (quadPoint g j k) = expressionEval area (quadPoint (stretch h2 g) j k):=by rw [stretchedArea_eval,area_eval] simp only [quadPoint,Matrix.cons_val_zero,Matrix.cons_val_one,Matrix.cons_val_two, Matrix.cons_val_three,Matrix.head_cons,Matrix.tail_cons,stretch,ParityPhaseSemantics.cast_two_affine] simp_rw [hp] exact area_sum _ theorem cost_sum {m:ℕ} [NeZero m] (a b:ZMod m → ℝ) : (∑ j:ZMod (2 * m), ∑ k:ZMod (2 * m),expressionEval (cost (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k)) (quadPoint (interleave a b) j k)) = 4 * profileFunctional (interleave (fun i => 2 * a i) b) - 4 * profileFunctional a:=by simp_rw [cost_eval] simp only [Finset.sum_sub_distrib,stretchedArea_sum,selected_area_sum,stretch_interleave] theorem selected_product_sum {q:ℕ} [NeZero q] (h2:2 ∣ q) (g:ZMod q → ℝ) : (∑ j:ZMod q, ∑ k:ZMod q,expressionEval (pairProduct (if ZMod.castHom h2 (ZMod 2) j = 0 ∧ ZMod.castHom h2 (ZMod 2) k = 0 then 64 else 0)) (pairPoint g j k)) = 64 * classMass (ZMod.castHom h2 (ZMod 2)) g 0 ^ 2:=by simp only [pairProduct_eval,pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] rw [ParityCorrectionAggregation.weighted_pair_classMass (ZMod.castHom h2 (ZMod 2)) g (fun p q => ((if p = 0 ∧ q = 0 then 64 else 0:ℚ):ℝ))] norm_num ring private def zz216:"s00d8"="s00d8":=by decide+kernel theorem local_slacks_sum {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (a b:ZMod m → ℝ) (rows:List (ℚ × Potential)) (μ:Phase → ℚ) : (∑ j:ZMod (2 * m), ∑ k:ZMod (2 * m),( expressionEval (quadSlack rows (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (quadPoint (interleave a b) j k) + expressionEval (pairSlack rows μ (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k)) (pairPoint (interleave a b) j k))) = weightedAggregate (dvd_mul_right 2 m) h3 (interleave a b) rows - 4 * profileFunctional (interleave (fun i => 2 * a i) b) + 4 * profileFunctional a + 64 * mass a ^ 2 + ((μ 0:ℝ) * mass a + (μ 1:ℝ) * mass b) * (mass a - mass b):=by have hw:=weightedRows_sum (dvd_mul_right 2 m) h3 (interleave a b) rows simp only [Finset.sum_add_distrib] at hw simp only [quadSlack,pairSlack,expressionEval_append,expressionEval_scale,product_add] simp only [Finset.sum_add_distrib, ← Finset.mul_sum,cost_sum, ParityPhaseAggregation.balance_sum,selected_product_sum,classMass_interleave_zero, classMass_interleave_one] rw [← hw] push_cast ring theorem correction_of_local_rows {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (rows:List (ℚ × Potential)) (μ:Phase → ℚ) (hadmissible:ParityPhaseAggregation.rowsAdmissible rows = true) (hquad:∀ p q same x,(∀ i,0 ≤ x i) → 0 ≤ expressionEval (quadSlack rows p q same) x) (hpair:∀ p q same x,(∀ i,0 ≤ x i) → 0 ≤ expressionEval (pairSlack rows μ p q same) x) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (1 / 4:ℝ) * deficit u - (5 / 2 + (μ 0:ℝ) / 16) * (mass u) ^ 2 + (4 + (μ 0:ℝ) / 8 - (μ 1:ℝ) / 8) * mass u * mass v + (2 + (μ 1:ℝ) / 4) * mass v ^ 2 ≤ deficit (interleave u v):=by let a:ZMod m → ℝ:=fun i => (1 / 2:ℝ) * u i have ha:∀ i,0 ≤ a i:=fun i => mul_nonneg (by norm_num) (hu i) have hg:=interleave_nonneg a v ha hv have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => add_nonneg (hquad (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k) _ (FullPhaseAggregation.quadPoint_nonneg _ hg j k)) (hpair (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) j) (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2) k) (sameColour h3 j k) _ (FullPhaseAggregation.pairPoint_nonneg _ hg j k)) rw [local_slacks_sum, ParityPhaseAggregation.weightedAggregate_zero (dvd_mul_right 2 m) h3 h5 _ rows hadmissible] at hs have hdouble:(fun i => 2 * a i) = u:=by funext i; dsimp [a]; ring have hmass:mass a = (1 / 2:ℝ) * mass u:=mass_scale u _ have hfunctional:profileFunctional a = (1 / 2:ℝ) ^ 2 * profileFunctional u := profileFunctional_scale u (by norm_num) rw [hdouble,hmass,hfunctional] at hs unfold deficit rw [mass_interleave] nlinarith only [hs] end Green24Proof.ScaleTwoAggregation private def zz2074:"s081a"="s081a":=by decide+kernel end section namespace Green24Proof.ScaleTwo open QuadraticCertificates ExpressionCertificates ScaleTwoRows open ParityPhaseRows (Phase Potential) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ParityPhaseAggregation (rowsAdmissible) theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack ScaleTwoCertificate.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact ScaleTwoCertificate.quad_nonneg p q h same x hx · rw [← quadSlack_reverse ScaleTwoCertificate.rows p q same x] exact ScaleTwoCertificate.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack ScaleTwoCertificate.rows ScaleTwoCertificate.mu p q same) x:=by rcases le_total p.val q.val with h | h · exact ScaleTwoCertificate.pair_nonneg p q h same x hx · rw [← pairSlack_swap ScaleTwoCertificate.rows ScaleTwoCertificate.mu p q same x] exact ScaleTwoCertificate.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) private def zz217:"s00d9"="s00d9":=by decide+kernel theorem rows_admissible:rowsAdmissible ScaleTwoCertificate.rows = true:=by decide +kernel noncomputable def massCorrection (U V:ℝ):ℝ := -(0xf89 / 0x1f40:ℝ) * (U - 2 * V) * (U - (0x166b / 0xf89:ℝ) * V) theorem correction {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (1 / 4:ℝ) * deficit u + massCorrection (mass u) (mass v) ≤ deficit (interleave u v):=by have hc:=ScaleTwoAggregation.correction_of_local_rows h3 h5 ScaleTwoCertificate.rows ScaleTwoCertificate.mu rows_admissible quad_nonneg pair_nonneg u v hu hv have hmu0:ScaleTwoCertificate.mu 0 = (-0x3e97 / 0x1f4:ℚ):=by decide +kernel have hmu1:ScaleTwoCertificate.mu 1 = (-0x35ab / 0x3e8:ℚ):=by decide +kernel rw [hmu0,hmu1] at hc norm_num at hc unfold massCorrection nlinarith only [hc] theorem massCorrection_nonneg {U V:ℝ} (hV:0 ≤ V) (hlow:(37 / 25:ℝ) * V ≤ U) (hhigh:U ≤ 2 * V):0 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hhigh) (show 0 ≤ U - (0x166b / 0xf89:ℝ) * V by linarith) unfold massCorrection nlinarith only [hp] theorem interval_nonneg {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(37 / 25:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ 2 * mass v):0 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_nonneg hV hlow hhigh linarith private def zz218:"s00da"="s00da":=by decide+kernel theorem massCorrection_coercivity {U V:ℝ} (hV:0 ≤ V) (hlow:(37 / 25:ℝ) * V ≤ U) (hhigh:U ≤ (0x18d / 0xc8:ℝ) * V) : (1 / 0x12c:ℝ) * (U - V) ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) have hh:=mul_nonneg hV (sub_nonneg.mpr hhigh) unfold massCorrection nlinarith [sq_nonneg V] theorem coercivity {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(37 / 25:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (0x18d / 0xc8:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_coercivity hV hlow hhigh linarith end Green24Proof.ScaleTwo private def zz2075:"s081b"="s081b":=by decide+kernel end section namespace Green24Proof.ParityIntervals theorem coercivity_eleven_tenths_to_149_100 {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(11 / 10:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (0x95 / 0x64:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by by_cases h:mass u ≤ (31 / 25:ℝ) * mass v · exact ParityFourFifths.coercivity h3 h5 u v hu hv hd hlow h · have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i exact ParityTwoThirds.coercivity h3 h5 u v hu hv hd (by linarith) hhigh theorem interval_eleven_tenths_to_149_100 {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(11 / 10:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (0x95 / 0x64:ℝ) * mass v):0 ≤ deficit (interleave u v):=by exact (mul_nonneg (by norm_num) (sq_nonneg (mass u - mass v))).trans (coercivity_eleven_tenths_to_149_100 h3 h5 u v hu hv hd hlow hhigh) private def zz219:"s00db"="s00db":=by decide+kernel theorem coercivity_eleven_tenths_to_397_200 {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(11 / 10:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (0x18d / 0xc8:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by by_cases h:mass u ≤ (0x95 / 0x64:ℝ) * mass v · exact coercivity_eleven_tenths_to_149_100 h3 h5 u v hu hv hd hlow h · have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i exact ScaleTwo.coercivity h3 h5 u v hu hv hd (by linarith) hhigh theorem interval_eleven_tenths_to_two {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(11 / 10:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ 2 * mass v):0 ≤ deficit (interleave u v):=by by_cases h:mass u ≤ (0x95 / 0x64:ℝ) * mass v · exact interval_eleven_tenths_to_149_100 h3 h5 u v hu hv hd hlow h · have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i exact ScaleTwo.interval_nonneg h3 h5 u v hu hv hd (by linarith) hhigh end Green24Proof.ParityIntervals private def zz2076:"s081c"="s081c":=by decide+kernel end section namespace Green24Proof.LocalParityTwoFifthsPairs def compact_parityTwoFifths_pair_6_base:CompactPair.Quadratic:=⟨(7 / 0xe4e1c00),(0x9c5 / 0x17d7840),0⟩ def compact_parityTwoFifths_pair_6_hinges:List CompactPair.Hinge:=[⟨(1 / 0x7270e00),1, -3⟩,⟨(-1 / 0x4c4b400),1, -2⟩,⟨(1 / 0x4c4b400),2, -1⟩,⟨(-1 / 0x7270e00),3, -1⟩] noncomputable def parityTwoFifths_pair_6 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoFifths_pair_6_base compact_parityTwoFifths_pair_6_hinges x y def compact_parityTwoFifths_pair_6_cuts:List ℚ:=[(1 / 3),(1 / 2),2,3] theorem compact_parityTwoFifths_pair_6_check : CompactPair.expressionCheckPSD compact_parityTwoFifths_pair_6_base compact_parityTwoFifths_pair_6_hinges 0 compact_parityTwoFifths_pair_6_cuts = true := by decide +kernel theorem compact_parityTwoFifths_pair_6_representation (x y:ℝ) : parityTwoFifths_pair_6 x y = CompactPair.expressionEval compact_parityTwoFifths_pair_6_base compact_parityTwoFifths_pair_6_hinges x y:=by rfl private def zz220:"s00dc"="s00dc":=by decide+kernel theorem parityTwoFifths_pair_6_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoFifths_pair_6 x y:=by rw [compact_parityTwoFifths_pair_6_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoFifths_pair_6_check hy (by simpa using hx) def compact_parityTwoFifths_pair_7_base:CompactPair.Quadratic:=⟨(-11 / 0x3938700),(0x7d7 / 0x2faf080),0⟩ def compact_parityTwoFifths_pair_7_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2625a00),1, -3⟩,⟨(1 / 0x4c4b400),1, -2⟩,⟨(-1 / 0xe4e1c00),2, -3⟩,⟨(-1 / 0x4c4b400),2, -1⟩,⟨(1 / 0xe4e1c00),3, -2⟩,⟨(1 / 0x2625a00),3, -1⟩] noncomputable def parityTwoFifths_pair_7 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoFifths_pair_7_base compact_parityTwoFifths_pair_7_hinges x y def compact_parityTwoFifths_pair_7_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_parityTwoFifths_pair_7_check : CompactPair.expressionCheckPSD compact_parityTwoFifths_pair_7_base compact_parityTwoFifths_pair_7_hinges 0 compact_parityTwoFifths_pair_7_cuts = true := by decide +kernel theorem compact_parityTwoFifths_pair_7_representation (x y:ℝ) : parityTwoFifths_pair_7 x y = CompactPair.expressionEval compact_parityTwoFifths_pair_7_base compact_parityTwoFifths_pair_7_hinges x y:=by rfl theorem parityTwoFifths_pair_7_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoFifths_pair_7 x y:=by rw [compact_parityTwoFifths_pair_7_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoFifths_pair_7_check hy (by simpa using hx) def compact_parityTwoFifths_pair_8_base:CompactPair.Quadratic:=⟨(0x261239 / 0xb71b00),(0x36ad / 0x5f5e100),0⟩ def compact_parityTwoFifths_pair_8_hinges:List CompactPair.Hinge:=[⟨(0xb43541 / 0x1312d00),1, -1⟩,⟨(-0x29f197 / 0x16e3600),2, -3⟩,⟨(0x262e21 / 0x2625a00),2, -1⟩,⟨(-0xf047 / 0xe4e1c),3, -1⟩] noncomputable def parityTwoFifths_pair_8 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoFifths_pair_8_base compact_parityTwoFifths_pair_8_hinges x y def compact_parityTwoFifths_pair_8_cuts:List ℚ:=[(1 / 3),(1 / 2),1,(3 / 2)] private def zz221:"s00dd"="s00dd":=by decide+kernel theorem compact_parityTwoFifths_pair_8_check : CompactPair.expressionCheckPSD compact_parityTwoFifths_pair_8_base compact_parityTwoFifths_pair_8_hinges 0 compact_parityTwoFifths_pair_8_cuts = true := by decide +kernel theorem compact_parityTwoFifths_pair_8_representation (x y:ℝ) : parityTwoFifths_pair_8 x y = CompactPair.expressionEval compact_parityTwoFifths_pair_8_base compact_parityTwoFifths_pair_8_hinges x y:=by rfl theorem parityTwoFifths_pair_8_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoFifths_pair_8 x y:=by rw [compact_parityTwoFifths_pair_8_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoFifths_pair_8_check hy (by simpa using hx) def compact_parityTwoFifths_pair_9_base:CompactPair.Quadratic:=⟨(7 / 0xe4e1c00),(0x1f3d / 0x5f5e100),0⟩ def compact_parityTwoFifths_pair_9_hinges:List CompactPair.Hinge:=[⟨(-0x859dd / 0x2625a0),1, -3⟩,⟨(0x859ddd / 0x2625a00),1, -2⟩,⟨(-11 / 0x7270e00),2, -3⟩,⟨(-1 / 0x2625a00),2, -1⟩,⟨(1 / 0x4c4b400),3, -2⟩] noncomputable def parityTwoFifths_pair_9 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoFifths_pair_9_base compact_parityTwoFifths_pair_9_hinges x y def compact_parityTwoFifths_pair_9_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_parityTwoFifths_pair_9_check : CompactPair.expressionCheckPSD compact_parityTwoFifths_pair_9_base compact_parityTwoFifths_pair_9_hinges 0 compact_parityTwoFifths_pair_9_cuts = true := by decide +kernel private def zz222:"s00de"="s00de":=by decide+kernel theorem compact_parityTwoFifths_pair_9_representation (x y:ℝ) : parityTwoFifths_pair_9 x y = CompactPair.expressionEval compact_parityTwoFifths_pair_9_base compact_parityTwoFifths_pair_9_hinges x y:=by rfl theorem parityTwoFifths_pair_9_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoFifths_pair_9 x y:=by rw [compact_parityTwoFifths_pair_9_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoFifths_pair_9_check hy (by simpa using hx) def compact_parityTwoFifths_pair_10_base:CompactPair.Quadratic:=⟨(0x16da5d / 0x4c4b40),(0x3e9 / 0x989680),0⟩ def compact_parityTwoFifths_pair_10_hinges:List CompactPair.Hinge:=[⟨(0x79e1f / 0x4c4b40),1, -2⟩,⟨(-0x79e1f / 0x4c4b40),2, -1⟩] noncomputable def parityTwoFifths_pair_10 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoFifths_pair_10_base compact_parityTwoFifths_pair_10_hinges x y def compact_parityTwoFifths_pair_10_cuts:List ℚ:=[(1 / 2),2] theorem compact_parityTwoFifths_pair_10_check : CompactPair.expressionCheckPSD compact_parityTwoFifths_pair_10_base compact_parityTwoFifths_pair_10_hinges 0 compact_parityTwoFifths_pair_10_cuts = true := by decide +kernel theorem compact_parityTwoFifths_pair_10_representation (x y:ℝ) : parityTwoFifths_pair_10 x y = CompactPair.expressionEval compact_parityTwoFifths_pair_10_base compact_parityTwoFifths_pair_10_hinges x y:=by rfl private def zz223:"s00df"="s00df":=by decide+kernel theorem parityTwoFifths_pair_10_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoFifths_pair_10 x y:=by rw [compact_parityTwoFifths_pair_10_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoFifths_pair_10_check hy (by simpa using hx) def compact_parityTwoFifths_pair_11_base:CompactPair.Quadratic:=⟨0,(0x18f / 0x989680),0⟩ def compact_parityTwoFifths_pair_11_hinges:List CompactPair.Hinge:=[] noncomputable def parityTwoFifths_pair_11 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityTwoFifths_pair_11_base compact_parityTwoFifths_pair_11_hinges x y def compact_parityTwoFifths_pair_11_cuts:List ℚ:=[] theorem compact_parityTwoFifths_pair_11_check : CompactPair.expressionCheckPSD compact_parityTwoFifths_pair_11_base compact_parityTwoFifths_pair_11_hinges 0 compact_parityTwoFifths_pair_11_cuts = true := by decide +kernel theorem compact_parityTwoFifths_pair_11_representation (x y:ℝ) : parityTwoFifths_pair_11 x y = CompactPair.expressionEval compact_parityTwoFifths_pair_11_base compact_parityTwoFifths_pair_11_hinges x y:=by rfl theorem parityTwoFifths_pair_11_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityTwoFifths_pair_11 x y:=by rw [compact_parityTwoFifths_pair_11_representation] exact CompactPair.expressionCheckPSD_sound compact_parityTwoFifths_pair_11_check hy (by simpa using hx) end Green24Proof.LocalParityTwoFifthsPairs private def zz2077:"s081d"="s081d":=by decide+kernel end section namespace Green24Proof.QuadParityTwoFifthsCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l16 l17 l20 l22 l25 l27 l29 l33 l34 l35 l36 l37 l38 l4 l42 l46 l5 l51 l54 l55 l56 l6 l60 l61 l62 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3baabfb, -0x927bb50, -0xdbb9b50,0x1b8dc2a], ![-0x927bb50, -0x1c528b76,0x47c110e,0x61c55c4], ![-0xdbb9b50,0x47c110e, -0x3a975601,0x927c4aa], ![0x1b8dc2a,0x61c55c4,0x927c4aa, -0x493e000]] noncomputable def hinges:Hinges:=[(0x1a5dc,l6),(-0x1856739,l5),(0x1479e9a,l4),(0xa42cc5,l9),(-0x3473c94,l8),(0x634b98,l11),(0xb54c68,l10),(0x3f96b84,l14),(0xda83bc9,l13),(-0x2600bea,l17),(0x353f643,l16),(-0xda83bc9,l20),(0xa281426,l22),(-0x493e000,l27),(0x493e000,l29),(-0x3f96b84,l25),(0x493e000,l33),(-0xb54c68,l38),(-0x493e000,l35),(0x3473c94,l36),(0x493e000,l37),(-0x1479e9a,l34),(-0xa281426,l42),(0xc6ac4e,l46),(0x493e000,l51),(-0x634b98,l55),(0x1856739,l54),(-0x353f643,l56),(-0xa42cc5,l61),(-0x1a5dc,l60),(0x2600bea,l62),(-0xc6ac4e,l64)] def normalizationDenominator:ℤ:=0xe4e1c00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x493e000,l27),(0x493e000,l29),(0x493e000,l33),(-0x493e000,l35),(0x493e000,l37),(0x493e000,l51),(0xda83bc9,l13),(-0xda83bc9,l20),(0xa281426,l22),(-0xa281426,l42),(0x3f96b84,l14),(-0x3f96b84,l25),(-0x2600bea,l17),(0x2600bea,l62),(0x353f643,l16),(-0x353f643,l56),(-0x3473c94,l8),(0x3473c94,l36),(0xa42cc5,l9),(-0xa42cc5,l61),(-0x1856739,l5),(0x1856739,l54),(0xc6ac4e,l46),(-0xc6ac4e,l64),(0xb54c68,l10),(-0xb54c68,l38),(0x634b98,l11),(-0x634b98,l55),(0x1479e9a,l4),(-0x1479e9a,l34),(0x1a5dc,l6),(-0x1a5dc,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x2a0b00e98060000005111c06c301000000014482048601800000000015018802000000000016049004000000000007032004000519241080d080200000411c8480510030001023884c0362008000000831080ba3010000001022200f46020000000000e140cc01000004848080c9180a000000000009032004000000104620486018000039188300990030000003a320a03a00400000e4620a016400c00000000000a0640080000000000f0248020000000492081b1806000000830440a930100000000000280e4010000020609006c8c050000040c150139180a0000000a249036300c00001412420324602800002824840348c05000005149280c9180a00000008239036300c000000000d060660080000000006407480300000000000581900200000000000d0320040003409a1881508020000000128640d0c030000000150481918060000000000280d200800000004c12044601800000000a05024c0200000000005e0310040000000000b40620080000000000320640080000000002403080300000000006806100600000000001303200400000118c888148010000000000440748030000000230a8051806000000004c240630080000009210806460200004d08c1200c9004000000002616031804000000004c280530080000000000980a401000a20ae08801b500502841480840066a00c0001502705006d40100002e0500e00ba80200000000009802480300000000221603180400000000442406300800000000038012401800000000012014802,0x6a0310040000009120402830100000012a428050602000000000007c0c801071251248c04b1a00c0e0ca0c908062340180000000001881c40100000000260d014c020000000000360310040000000003500a200c006304605601e480280000000000501880200000000001c029004070c41830408bc401800000000884814601000000001909028c02000000002c16031804000000004c180630080003e0781080f080200003c0841a02710040000000110500618060001d03408407840100001e0420a00788020000000841400f0c04000000588c6037180800000000000f0320041618c30a081178803000000002109028c02002862984080ea200a00000000683c0930081418a3080811788030000002845301b8c040000000000220310040001c4670d80cc401000738cd0cc033080281c118a061012910060000e2318640242008000000810cc06e30100c20a6829019ec803014110704600c910060000a422826034a008053444c118032440180a388682300648803000000000262c0cc0100000000221403180400000007231036300c00000000e8281460100000001c8a4090c0300000000001a03100400000c4521e036400c0000190a83603c80180000311486c0790030000002886204618080000003b09c0683010000000000006064008000580f42102a10040000001b846034180800000003a11034300c00000006c2602860180000000e854050c030000000190881b1806000000710d007a3010000000a415810a60200000001605c034c03,0x7582400a18080000000000ec0620080000000001d00a4010000001d0310258c0400000000221205980400000808eb03d83014000001023980d060200000001883807cc030000000230880a980600000000004c0920080000000cc3205a60180000018c3102bcc040000003988207d18080000000380900c300c0000000ac2205a6018000001043501b0c04000000238760361808003a45104203fc4014000000000b06066008000039148440bd003001c62a82501de200a000000007c1c0a300800000000a89814601000000000907024c02000000003a0e05180400000000001c0920080000000158281c60100000411e82c0cd0030001023a83803320080000000048140930081479250628094080302892460c302281006000000001a120798040a0c90830402a040181419210708054080302832420c1016810060000000026120698040000000078240d300800a0901084055e802800000002a11014c02000000398220549808000007182401b2301400000e305404e4602800000000c8004c804070650648404ac200c000000670c40fa3010000001023880506020000002147500a0c040000004a421c0520040d24924818096340181a192190100c468030000000001940288030000000000620310040000000000cc0620080000000001900a401000000000084034803b1250808181e67200f424910083011f1401e9692a011e03ee28038000002925120290020000000000c806900746c93008903cf1401e84922010604ee2803800000000037018802,0x2e8051006000000b110c06e30101038e0843006488030000851c82301a5004042639a10c0192200c083c6101d404ba40181068e384300648803000001822040540c05000000618b20271808000000c114c06e3010000539222301988020014d24e2180661005a2a4020e180925200e00028c911080484010000001a634809c602000004a1902c0750030000000612c81b180600000007231034300c000000006848146010000000148840d8c030000000671d00e18060000000c63a01c300c0000000188f01c60100000003488c058c030000006908c03c980800000000068b033004000001a23180dc6020000003c46301b8c0400000e2510f806a0060000000e269036300c000001c868380e80100000002c9440d8c030000000531500e180600000000a4580e30080000000001580c4010000000001540288030000000311481b1806000000003c1c0a30080000000441a06c60180000000903006cc0300000000000c0690040000020831030630140000008210812e602000000084150318c04000005844180cb180a0050c53061035a40140000000000c80c4010000028218c0658c0500000000220a07180408243b010c06b4401810187002080d688030000001cc4202e8c040000003888803d1808000204610600694010000410c40b80728020000811841500e5004000003886380f9180a0000000024140f30080000000e46403c6018000611542603310040000000003a80510060000000000e40620080000000001c81c401000000038838070c03,0x2882402c1808000005182e02f83014007904505a03188028000000108740d8c030000002882c04b98080000003509c06c30100000000cc4a014601800000001b11018c02000000348820191808000000006c4c06300800000000d8900a60100000000001b01480200000002a1280598060000005212001330100000000b0420266018000000000b00248030000000001b00490060000006a04401430100000000c81201860180000001902c070c030000000360480618060000000680900a300c000000d410802c602000001a01040098c0500000000321203980400000c096100d2301400001852ca0324602800003025840648c050000000004c1819802000000630480bc3010000000c20900b0602000001860b80be0c0500000000000881900200000b09410192301400920e318603a4802800001c60f009f8c050000003983a02798080000007105803a301000000e114202a060280000206144044cc0500000404260099980a00510818e301d24014000000c62201bc602000000184460278c040000000391a81a1806000000510d809e3010000188420b0108802000001908828091003000000338a203618080000000622d032300c0000000000b01a4010000000188ac088c0300000000322c0498040000050861015030140000208e43c06c80180000421d06c0790030000082390d80f200600410618a301d240140000000068300c6010000000148840d0c0300000005f1900e18060001b04109c0c8401000000016c64038601800000002d1a038c02,0x40e38e30604b2200c0000000007830330040000001047204c6018000811cc320221004000000005e160518040040c6b0a3028b401400000000582812601000000002d0b028c0200000000004e0310040000000004d00a200c00000000d8481a601000000003219014c020001443604604ba008000000cb04801430100000001841c03860182c124d20102575006002c64a881818ea00b29080608103350401e4e1024106042a0803800000018868074c03000000001d00099008000000771040fa301000000000090a0660080000000004403480300000000005a07100400000b8842002630140000000168500c60100000000002e014802000000000012039004083473013c0fba40180000000048380e6010000049208480d9003048839e30804b5200c00001247431027400c00000e118202a06028000001444301fcc040000048c488089980a00000000441c0630080000121118026660282c3146101022f1006000000508a60449808000000000074062008000489023181b880202161c311e035d100600000004920813180600304440610173401400638920ce05268028000510e02102e100400000521c0881520060000000000380d20080a086c040811908030000001442102e0c04001421a0208134200a00000000443c0530080000000000780a401000000138110058c040000002402200b18080000094260900b400c0000000003c012401800000000006c0c80100000000006a05900400001248439024400c0007112641819080200000014c1202f0c04,0x48140f300800b1143122049480280000000003d0388020000000000880610060000000001500c200f02142410606d94803800000003611014c020028448c388125200a0b24a188240a6b401800a310908a05b080282c328220301cad0060606584486052e200d63892a1930374e401c0000000842403a60180000001d86c030c03000000001b000990080b0ca0880c03eb4018167945107810568030000000000290188020000000000520710040000000000a805200800000000b8481a60100009320c2202a9004058448618201d4200c090c80c3c80430401800a09210880624802800000002609034c02000004042181a9180a00000098241c0e400800000001d0a80a601000000001605024c0200000000660a0718040b1892430c09a8401816112186080d508030000b224c3101a100405844861d201d4200c0002047114c0dc40100000208e41406c801800001822840540c05], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((0x40ce11403c1943c93ded552c2cfb00e86e370a8000096117c4b8f447e09b03a24bd03814086be1a7e716c562c40d99c69c41819e1180140115771526f155ee2942567509a9a188c187d9c5bd578deb0fbadb64482faaac4407adc1256089921af9ab536ad0a2c9ab9cc6884d78d3a0184d873660604eceb1a005914ca4c0834010f3706f17a90c0f9d8d145d248171a21a5a87861031353860606319e26041900800008090002233b8dc2a000012c1555582db955508c0f092f40e05021af869f9c5b158b1036471828860640208260050132029b1dbdfea442996bac5ee478e2d29dad679b00241fe839da5c8be2618a704861c6f185211a98825b2910c6065687710a180443cc58404e8c318090801160836d5b5113820d00400004b4860848000f0c8d186c6882634c0bdc6e15000012c22f8971e88fc136074b48be44710d01fd392f5c1523c53851043032021822803336fc42da2cad4ea95e0cbb533a3c5aa53070937b4a7f8e149e1b386398c16096bad8e30360b80394180387f0d081866fe6047e40011820be0f8813060c8040000410c0b554342283143e612c2af2c2c1c131fdba4000769f11c02d114a100e0cb0f0270c180080d28080004e48a20a850c0400098e4678763380bd2ce98beb861fa44178382280b5fe7022e886d8a040e239f82087b403c0260c1b00879c1562982048a2e89c0890b88085555d64940a1828527ab9a8041a1297df90a1098e3bddec8023401e2659840001f3ad7ea7d08042602c40c04fdf9ca28a002a58c84070586fbba34607cb40701868f96f61240510a82a081840de395c14c1000070801811e6f0b58c4801000a28a002ca9a2f0d182b55053981869e4b2e6ccc4100cd1626414c1000076a7006048e725b520380095108151050000991a64404003c5a870a32a4801301600007b08001dc1f340ef5a245173ebf989010fef3748c0c024a19100823d9b809046ba8598104e4c9bd820000ffd628001c008492005f47c2182864c4fb1628b2e973d179e203ad43bca1862ec7c7a39a086e3ef9bc9000000fd200a013043d04208005fe4af06c9002201c0000e211a4050001aa90008ff2346131a20980f04f8c2bfe8c078a0741250b1000d55c0a204ccbd7104bde6878786449e34426081b00870a6feda808245758f48822e789c1a0817ba2260021da418a0121c3e813040d00400004248d086e27807f7db8e3e02adf924321ae1b1a02815480096287665949c080d64cd100859a026880001f48850003801091c22990a51290d075ff034a70a023c08cdc40a179e39a88586008af3504384c9c054f2a104f4fe13668a000002e24801002d7a0cf6b3b2400900b00003b66278408b191c3801bded0e3c9aeec72431d976c00a2839c20b1c101257349609db9bfb880001f487d0003801091c22990a51290d075ff034a70a0183bf97240a19c7154c6586008af350438501e6a397610493172e618a000002e24801002d7a0cf6b3b2400900b00003b64000d60e8c05a76e2c61addd0373222a960d95b3c401c5f8b25082324de5c4100bad06e140818c5af30c0004e353348001f014514015a45f8cd186102f0f6222b3221759618551c7fa9cc7082e2839550804bef66fa9020c038eca094c00001cbf6020001956163311900230280000e81083010001be1b1436f5ea921034a5288d0c1a8f01080c05f318d207560dca0e040f489ecf0017ed8504000f339528001c0085923cfea3434823c531007a9c4351c180e492a568a480c7ec0ced72ca306095ceffcab2382168760e33d20c12541d74e367020a751feb6df40a001fd5b91cec2af3209002d05000011a181c0dc29125e407039946ca2a2287301432c530c1639ddb128062bdbac0c838200b792f1a18100afcf4b2cd04254cd36cc501328f4be8f724904250280000f2980d06c18a8b8f1852f6c7e69828cc32839b4043b8bab7904860dcaf13012084a7a73d616083141eecb18100243d8964815141c0ca92d0908230280000ea90007a0200243a4510542860a0014aa232c2a19511000fac9193158d008f71b85400004b08be25c7a23f04d81d13883863c5104303382400300a6dd15a5e50bdb531a134dc2d6bfab0de988044f0eef1821249f4714030375670a02731c0408036f0e420906da4fc60615302de4c08380100001133b8dc2a000025845f12e3d11f826c0e892f40e05021af869f9c5b158b10365244e6c47460599c41e2981a001801404c661afb972bcbb15334926eac21f2b213629b1b4de79cefe2354a0db7b1cb34f1d812347abc6142c8783850217e2a2093ec4c98c0c5553250a1802ad87341014cff64c083601000010d2000788771b85400004b08be25c7a23f04d81d4cb511fad6715f92cee980548d24924c20c0ca04600302534a3ced216db822e163b46c3d654638f62258adaec2eff032e47bd193dc21f86aa33e0a000252233c2319d018ce00f4b1296c6238408a0c963430995d6a0c3bc24bb638218a037325041c00870833cb218d10465b80061d12a52040109d0eca5800f76d8040049556593020d80400004348cd84c6680703c135ea421c744703a6e64473ca184a05c973421868fd03ee5cf111471db56a74c1c10372a1f25c050409a1b7bf831000027098de3e7104001501e2068504aec8540c01c9d009678c0e6e5db01014317e139a0410026607541c127692079008360b836ef030000010fe0020119e5ff90ae480118120000740c97a0702810d7c34fce2d8ac5881b2) <<< 16000) + 0x422233f42902c903d029018a186191146004030000200d81e000258044c1ecbd880c360372f21114663d3081040070ecc4011671aff8c08fde126c3044a5348810000012c092003a01800019420005bc7cf470ec8a879610432de4f1620b138e902401e6b0810466e379307846d643f202040001c200a000003840040069deab8989081f0140000d598180003f4803891fd8710a9a385050ec78e120fd8d1a238785919fc60c34bb18d7e1c103ab045b04000003f4800004a939724d920042038199010cc00865c040003f64002a7c8cb08865444001a424370843283a1931906e84864814002dd2460007068777589e8e0eda6d915e7089722bce113024092f40e2600a594a04d219091fd2070b48be44710d01fd392f5c1532860c32413002800c008eced4e74ef5fca70a2e60a8a0df0c2712eb52c4bbfb09e871ce37bf9f27476230577bc16b15611c7d6af8ca8c197453d18501d0c93d7661843f62e5061ce955902084a818c780977e7c0404086b284c103201018f090c70280004b48c88ac630343161b18909c97a07130052ca502690c848fe90382608588604384104582580500180064300401b63c158d1b278208efa9f9220061bb6263be443848729eaf6704168ebf56f2c782145ca03e7960a4e1e184be08035c83790204e208082603c01602800075c8c308c6400630a03a180ca5c03094483060c34288a90411996db0604b1772c780b8bc9b0098406402031e1a1840d0c70480005188c68c80012d4c97a072600a59acdc8a3deee4881b2d22f911c43407f4e4bd70548e24914b04a04904900400dee7af2bc46c68b396370a78326523a6c83728322492a0188382b86390b74630143160b18a050c482c6201725e81c4c014b29409a432123fa40e06e370a8000096117c4b8f447e09b03a5a45f22388680fe9c97ae0a99e19a18411609400001d0683933009d74921be5e567d85d01b7ed7d4ee518af56f7962969c400d9fd0b040fdbc3f0951ab0652923771b85400004b08be25c7a23f04d81d2d22f911c43407f4e4bd70549010d1080c30cc09104207c2f0643cd28f01cec297e20d8d3fe80bd5f8ffc2f28d25db09ec2e08e82fd187016884c95cc43860b3e31b234fd06d01874f2142dbd47c8eceb5e07b0ee0604475d3693c6b51ea017f67313701021a022f456b950f2ed369dc4be06804a35281448e08f00676a7501d01803ab577292f3e1ccfa36a5b74e0077bda2b921cdd04b83d48393ed23cf0914e5f3859cca41821a04f000072440017a08c308c07c0630a03a18685c4fd1ebbb5a68704f4b18d325d71112a3021e97bdb6d969d26a1412340192cae6371e70f078de471d518afc584302526636e931257afe3c04e0ee38ae3bc4c4c8c016cfb6c4cf312dca8a418264b4f4ea4c14071f6da8a56a051042903081a183090001929000c7d205a3a000f3323045a029290be888604340032d0707584130b792185dc43e30705354463b828261fce1e72407600b4820e01c884bf381020145cda2022190e404204018001c1a1ddd627a383b69b64579c225c8af3844c09024bd038980296528134864247f481c2b340b89802966502690eb51ae806ccd20a10808708308d04205ee774a2ac74736bf575645eece4493d6fcbb16b8d1f1cda9ca90386eb3ce54c232f0064ffb5aaab610ad256e90ad60261014d8529218412238b0808b8eac648045db551000a301aa200b01190004e203401000013322fe2a17e090be8485f0240009c445ec9603c4217a1d0bc8ac5e0460761b000702342ae7cda548040ac4bf793e00e0cec9c96f78481875ece29308000dd567382181372bb25288000e87e41b8481c9bf6ff645677ab14648c6e572d840098c0c884c06000021122ee1b17609c8c0ab03ca3861ad7a9e1521e20c35b696c342191f34c8c6040d7eab0d4608218adb4114000db0ea7e240011b952a63005d8989e7840042724a08c08164031b4bc1e320891721171f430a0c6d6f1dcc51414ea6aff49c20a26c56f951420adc8c25b24005887c7ce984005134aaf7280014c203beb2a419002703059027ea3bb2641125f981e8070829bacb55a4082ef083fc02880dd6af00c30229b97d59a28214d32408e280624a7ac4000158203b9251d480120140000764e149c53248995145234d8713550e1059d38f6baa2c10d06dccf91c8048e587ffef42c0137e0347b404000c3b615dcf04011765de7f7400394fa02a64a81cc9002a04044b00d50984f1e5825bc5bee48239d5e35d8078862d1d45d9384000054600102054e161428d0c081d63f981861b9d96b9400025a91db004812004a0500001e320008244230242ea1208b0903c8485d01411402173010448080022fcf96000031380610031df7e5e30d152a814b0684422296b2460404abe278408231e08b82048004ac77e8a300039c61b000801046d6e1000295124048040a1c2824ea84fd8510d5c0970a61841153281e88910d0c37f9d173d7c40c0b797b48028a085c8a43904b4a0012a7fa79cd470037226bcd7480024a7995b954336a92005808881e082b839871403f6eaae38f04c05a98608008d51e070637f1169e68600005dc03860b7b11181045266c29200029d859e15200400200001b021180a08b0503c8285c8042e20208a010448080012188b81085bc24000d64457417c39c1ee8f8a1c02adbbe38f16b1b9e0c3038c01916100c1000050823569d258005980700027141d008497a07130052ca502690c848fe9038566817130052cca04d21d6a35d00da2ab9e2ee601e98166bb4ddc)) <<< 16000) + 0x7e1bcc336c460071cf000000000000000705a45f22388680fe9c97ae0aa1c38e39610208400059d6aa404384bab0cfb0d21fef48b3805dd2412abacca92ad6d2a3921d684165a3cb429a156a5983d59d67d0383e0cf913dec1e670aeb20a8a731a94001164ccb511fad6715f92cee98055155cf177300f4c0b35da6ee3f0de619b6230038e7800000000000000382d22f911c43407f4e4bd7054cd18404f00c00b003000099001c810f319e5134ebb43168b7517057b63500cb4c0c1be852cf5d5361108045a24bc9347893412eca68d573500c318457d00038f30305dc3e4d0558dd5d041d7ea5a8f01ef6aad0190406802186a5cb62b2017281b290958bebf956cf92bea5d7f31f893ad78700bd1c0c058606bd210b7ab97f05188b7f6d64c44b5a2f614a350912134c32bc17b26801047076ab1b09899a091a4540a8f897f71c51832f321f22abce07a61ba0b614006f5d598202f3c97926a1fdfef624f8dbb442f10a842a7155a7982a8f0100557bf7391a7b67cdaef0048674825960460c4191dc90e628da99ff78685bb18eb7a1642b5a5133473e657f01e218629e01b90aef5587454821d66800005bd22dc2a16d090003611155210b18e8550542a6221600d0008571f2c0b3688630030908689ffa40092611b32025b42440166df8e20890c407b3117761030a2f05f2038d04042a7602c718105b2c750874504194dda3372b402400a80e02d803d282cd8aa8c00a2a7edd8ea870a1423624eba18a10786bc8218851019a8eb5ea8e08063776de547081d034d105c60826055ec0d860410d1cc9483c02400a00c1a503cae73f5993145473b084de7b21428957ce2899631a202e02bcf2e4914205ed4a974edb1c101e578ded8598e102d4f128a9d39c004b3c8f276110c0007ca1f0db6a6b74248018028000093c800234991a037746fd0612166c55460493275aac1b090c0689491e890a3c56fe78078a00008ca004882149920d24863afda055a2060a7e5c571e12004804091a13a83fee688309068d4a247d8124e0390ad133c0c10123eeca7dfe4886c9d74eb09818408b639be4881818531bc6df4dcd00443b48544d028003394427bd4a6682400b412000046645ac040008766c80b94039a1710455aabcefd7080c0f94ffcc14584079705cac22020ef775bbb906107935201818c042dbbfe58806000b941bc5971400673d76784fbc2400a40d1130371fc76cc2c8092fd59ca08232b22f1b3a2c3068c2f148480c7dec99a7c1430bd703b1a0b081ab3b46950c213b4a642ccc044fb9460b0a8d2004c0580001ed21820a16a0500021d90140d80986e8701dd3d0d7db0e3d80c9e2219d0a102048cd6a6f8504264af355b591c222a84adfa4c0a08dc7b35c2258304011e1a641a25801a13f812d1510003e32f3d2b1d46012005a090032018b480e2601431c35db4e302c716dcd42590035d64fd9e208a365bd381d1e291704fac0c0e10112573ec006040e40e5bcd52c00b8b674a301000fe8b99c1849882410a40e113090af37f2772c8065bb715248823e07ad8ac102c505eb1b1c1e0814254513f72d2c3114b41bff0c50c1fe3c577e2102114b6d5430c001076082c93cdf212005407816801000115100045222881a01e050a1808001c2080a88f0801a9e7d51512305fa9f901ec6192dd83cc20030638f0e901163c223e0485ad898107b53ae36109001b34d8652c18061d19ba3b0000a53c54d260769920052070f280b8424343c8012f6fb9491803e7d1cd18694e514570f0c2281fef83421eb4602e8c080000ce401820662505c00005c0f2c20b24008806000038643fc1402c0a167050b30085940402e021640100023d915d01f1211e881ac64227bb799642246173034eab7d37473d395c2d931d71fd93ed9d87c2f61a04e382143b51be4e3e36571a868a78d7f16cc7bc57c9c37882165601b22c2b7e85a3928af653039812b72695ef181c21c88d8621e0f00a36765b8acd79193392e054ba27578e3a7136daf758ecb0848f06d97b1e60193691c1eb108b2cf3b8d66b3a3483cfc66fd2d4580b71f73becf6da69414b88b00dac14f261757df66dccc7e5bf00f2fb2360e34f6afd6f87f2ff23aa21fb5ca690bc5ef4338d0c0197ecb87d40fda5a8ff8a737b8481f66d784183fcb0e2444a8fd720690a0e38904724650a2d5b69f58e0823c54246040917a3a2c00778378120037996ec098307402000023a4554442c622162090b084854c242c0120008b722be5215e110100280091d881d8aab340b80a0435e502690a4527e406c4b10410808408804c00a00800010deeed814195a197e60cc0065be0e43f2f6fa0d13435a2ba0be3be44da0b02730bce40118a8860402c0f7b848103201015c01f1f4681501409ea680c3003356c10230c1a00800004c1032098ad84c568262b2038041ee7f5302b7dfcc1806b4ee6808c30640202b0038230c2eb82010a101f730229ee49e7802cc24c4601280a81804a20360100000ec22ae1bb1573a30128546fe330b09c10a052c178b778420394186f0009460680200001d64558640005c6786b5637f63ae453e3c63f2d890c991b507340c05d203e83e2032a7fb3cd15874537500a949043088ae61e385ff858f55330080e2f43791fe7b96fbe0f050289fd9d3c19c19def3f6af00040257aee80fa836efa26ce2fbab02710b5ce96624560f00001879155290aa0c854c5403e22000850332d447eb59c57e4b3ba60152d22f911c43407f4e4bd70548c1c604204c00a006000007f487173a4b0246d4a01ab2fe6fe910)) <<< 16000) + 0x2b391f04a6687beccf0dcdedcce9aaafcf0a0fdf2b092892eb6c78e02bd00027d200195a68593462c42317b81ff11f56062b17a128fe94c37000900070b75fe3c907ad8728dc1461c58e876cb5ceb00100241a6904b019302c28cdd3e940cdfbde1e35dd000301b40efea1b508f1c33262bf52151fe7e3c060e100000099d033708f9d70796e88a67435194c8b8d88c9d1800218181a233cd3ce68cc09a91bd5b154ddff95a4c8506a646f1e89645b55d7a92cb109186d991f02ae0882cc2c9b87231413676c6b66b96630ae00444a22200002b391523d0a89c8016604f11ace1e43eb3ae18853ee20408081d34abc1040f455460d4863438f9c159718b67c835d040c17bd6f8da6b88987a1914e8e34b66150c10166da7930eaca18624e16cad49b1a326854304a9ba57cf25d30c26d6fcb7aec78cf957f041f99087d6b1299937eb3cd1f514414cec380009b536e949d64c0d6953c33ba3c995ce581006cfeef3e3da3286fece46b030ca634861a84156e77b49a1c34e13b2d1a0690e83897b5e1dee8fceb551253a2465f2d53a2f87eea115a1b76715d00d96ae1c91220c208086092006000012bd92f03ccbd799f91d7888ba7f9b19496e6cc1b492dcf993480f5cedb01265373e5e387acfc0055a57a740f7aef1bf254bd5b0cd4881a4813f317999f68eab19c4686eca47cc5c32b218d324b1a0008644540b429e5214e190a68a8530040920314b010004ba1e12ae03487bec99ecfb80f80a13b6fda18bca76345bdcdf0810a8310479f1e574257e0604089938c92af72745b6793e0c030fa347c68bc715a11744020063f2a1b802714e50ba28000828a5f97ade6636d69b61b1400280c3890c304bea8557ddd945564532de515987ecb11c5e34dd0aca52ea19615039000077e702181fb75c080a74a18b7c3000baeb7e80a040e07cecc022000018e04054a58e84a820a073fad11b105e0aa07032afa8d13022e1100c00006d08a5228524a42902b147098a302851405032d35a288860b0cd02f9c2844b56b97c2000afa08330e03fbc6fba0500a7438c9602a81c3f1a0584155981fe3c12052b30efb221080a2278b0a5c14c44e152ee55d4798075101e68e2c8240c5bd9a480000a7e82490160730286063cff1f2541046dfbb6d01e05a93a3c70364821180e22797fb3fe44e2680e407978584ae4e2e5c94001602942b34140056d1504c083601000010e313c5852e0a62270a9772aea3cc03a880f34716412062decd24000053f412480b0398143031e7f8f92a082600fbe6b0f02d49d1e386c9002301c44f3ed4c8a89c3b99bb8f2f04aaa01c5c8b6fc30413c42734580ab0b74e6001b00800008610c10500018510140980984e0707d82dcabd1034503dea9dbc6941c17582c3328800000e97ea16108f87d5b9a4804043358d06008202e3cf73a038086b1f41abd04b1a020a40d103850eb7ea069c86eba38ae7d5ae6694ee66fcca0135f82a88007133ea098206c0200002204510342860200032e202a1bc27322a08acd20000187c8c2350b29ba4b2090a83dc850409d62324104122093f46006fdb41244006a7f5d28000fb5a696c004ac8e1000a00006f88a106c3e007a51705dda259c481ca807071a4c0ef42d3292382c3ae8230a292345a5ed0e1802cf87761e10a156e3b4020aa12ae5e514016097da83019921848040d2b98fba909a4fb00355f30929547ea048e00004aa0208ed7e1d402089d623241c01787191028075106bc0000d091a880192183e0200001ac22820bc2627bffdb2611c41c18bf2c8072c74ce10301b3b101020931cd7dd0700124c63f8280010fa0160a003fa1d78004920508406000032e4500640523213f0909f0480016fce225a7225407bc8aed0ff2fa47bfe4f324e9f5f27be4e70f453175194f258ee3fa05912862461842423001c00088bb7d9e2f118f31075177c98074c80f0364eede5f587aeb9a3c56de2b99c6c20571aaf9f411939319316388b34000b44d93ade29502465e0e5aa942986775e8916d32874e2860d8ab80201b38afac1601147a3f8a010bf0caa200614dd53001404e4c074020000354604bde6a8a507105f23f2a71430049a7ac84083b4032d11c1247d2ff205041d3f9af62805340575a060058e90ff30054049adb56ed291068440380001d220d61306801c8e82aeec060e2079cbb93440624a061eb0e1c8aca3aec1820e8fa9a38208323cab40480189ff03908000894284e00280811cc7e2bd061080440300001d7200347a44f4c7bde8d6667ea05dd69a27726302112852452842442030822402001c0400803606569232e1e36833271c8eea79c0a35678e61124000000000000006c251030c50a5084884064e166b119e502952094e21897a4a35b5802f7f3a1224377d2819067fa6a315d336f206e9bf4a4720b3bc28c10f23150002a63441f2ad674a14e44b7dc48b248f3ba284890c82c1221e6415d880cb97cffe302722529a200092f40e34020e80421cbc5c2b871b0ce7f267a7934d8fe85ae4c00000000000000000000000000000000000047128818628524528424420392f40eae083000d0001ba2064130003553bde8d6667ea05dd69a27726302112882472442042432031411c070080200d872f170ae1c6c339fc99e9e4d363fa16b9300000000000000000000000000000000000011c491c51491081090c80c70a4bd03ab820c00340006e889e04c198040005e844ec540cc0bdef46b333f502eeb4d13b93181089441239221021219018a10e0380401006c3978b8570e3619cfe4cf4f269)) <<< 16000) + 0xb1fd0b5c980000000000000000000000000000000000008e248c38c28a4884084063837358bd41e655045c8c1e6182c28b96d829c0c85f2e77045f132800126102d096f7a35999fa81775a689dc98c084491c918910810508800703012b2f316d1b681ef2df84d42b255d14271ffbb842b881647d5f4d56c246cfe382d31c622713348204b336f7bb2437207f7542036753f7201410a99bc570a3841000a000057080017c113a0d83b0281dc04000d8644e484270421372109b0884d44426822133110990884c4242600212f01000913112e4d896a4c4b1162566312a2d83a14c4a4962504312715e115fa11b80144a3e2fa6b840c5ad8f1412001eadec8807037379eafb140c526f356c4003af1596a0044000d219556401e1dfc7320504020de14dd2eaed844038c074482bf9dfa6561df706868a62705788e04be623668417c205f2a09ec3c0242d7f387ff954afcf451d0d7f526b9aa7f14967e2cacabeff08a6644a0189c4b393855fbe38867abc736ad2d0f1abccf668095071092717ae8e1459d9b63f07abb8c2e5ab659b4190f76ab3707640ec582670d182831f22318d07cd3034921de285125d0cb4b542eb98a55b2c5dd5ba1291907119638c0f47a2bc0e18bcd4149d5a415ec9927724cb003b258e77d922de1332635d0571353ee2070800b281d6cdd982859d629bfde75f8c456fe6b96849553b4f7f0d2e971ff687de0e1cc64e0276b3e6937066484d22c9343cadd0bc1f8dd999077b12959740b777225b092e5d7d85b50010c8c7d7143aed46c2030a9890e15ffc4305898bad1cb636b9a625e83373b08e1fc86830a079083aac318efa95fbee23c6714779ddad463fa519a6f647fba43490efaa91868da0604982624a1380857401200da16690816f055646082e010c3e3793a1004d94d933c00918a00800438cef24041a00800005c980200802345007ae6a60a05ae49030e00b7101e0068e74e24041b00800005f90000fc21de1a1240100015090e009ee370a8000096117c4b8f447e09b03b4aa777abcc889ec4d307d89a6100d94b885f47d56e41b73181d80f4f4792bf8edaa62c360000000000000007240990ef828a05a1c594112118000000153ba3f027d4d41e92e8abbdb4cc98e3484e0f03ddb97199078bacab2efc0af2c533d87daa81ee9a97b1156fd3d41e81ec2a755175bbe4e5395f15a28b8a39fc7350004672001a6a448c462320382bd4c06f17761f6742c064469476654f840c0bbdf0d8d9c8f0e6b03e20017d354c9c677f155885d5e4c5b0896b0f7c31b483e3a0a09edff971420092e39a97e635e4bc23c0064e6b8581218f2204c2c9e504b4630297202e534cc3d87188c9247bf099598252e47a456794d11b880e51b39bfa21a6134b022d1c02068aadb4eeefd90873334770fbc3f7aabc629ba62882213959303b14d248105401100001004400915ed8800a002000010480003f18343a8504801e7bd51e02d8e86c8c1064020058020000a421de0bdc6e151c67a50f616cc16f5f38ca2078497a072600a59acdc8a3deee4881b29710be8faadc836e6303b01e9e8f257f1db54c586c000000000000000e4f41eedde76ef499e75dcafaee9fc1c430b0813402400000300d1429266ee0445c029f1bdac90e9c3dd4b32ee6be2ab266ce8f19e0c587429e0ef6c347a6c05388a4b21556b779228977030276e86edcaba848f5c2182f3a09e6f442665d4c94449910a0009f64001b98c01b76163a8694e43590e141b712ae360e4843e00a57441e4d55432f724b6924e5ed002ab73620cc17ced84d8d67cb44ccadd3a0005dbd95e172814b6a43f62553a3c1632b1f8cfa195bf30467ddabd96dee409ba698b7501cac3474bfeea4bed471a1239a6a82c63f6fd0926a247a2731b6047428d005a054111c373ff0816518ccc4b078fa94e5ca21418727bf3213e68ba78189b973b111236242b410548eae8c96f2c99cfa023bbf449f5f5882b0448545cb63a3e2cb959950344002fe15f07c7c268b131fb108c6aec3ccee99e04910856b3c44273ae6c0608fa6bd31810dded1425081a00807782e9710be8faadc836e6303b01e9e8f257f1db54c586c000000000000000e481321df05140b3d07bb779dbbd2679d772bebba7f070cf30e18608604d000002a46773ac7db6c55a025fc32965078a00346e26846c318fcfad38967ca43c8411aca45c5b3da41fe1ba266cb058ef6bb06639654000e2080024d902d1500059411221d0148e8484342401a00171c223e530661d7850ad220141129e4f4602ed2c9e9209dfe0a67812bc6e9802928e0d004205830950a5971e19d91a28bcf28e806db594114024aa5dc180201162004c203401001f05c858d6c9e0c108a0cba1c219b5f9cc04107632480220554cc001144cf26041a008485b2a8c49821b914c45055459644608320100000933132335f405871c3d1234056f1da8c01a09a9830039da0a4a08320100340100007910e00d08f008000bb488e8680011008148ec470662362b11a0588c80e4bd038980296528134864247f481c1a0690ea709d96a0047dda6e37a080757fdc2514e1c0b3d07bb779dbbd2679d772bebba7f071100cb0d000d00b00033a8e3423fddfe21c7b5fb9c54363692330e0fbf52a03a0f5613e4659de121e7a93684e4ccdb6604d06053e0bafa8a5f95574d8e9f009214958a6334534f2b352002b3813340061b9b4c0001750826041a00869ba3d9c2485582b9291020c80400001b481d02f0caf4c6811108bfcad180259490823081a00801d8080002b088b028000a)) <<< 16000) + 0x0081688c4603622e0b806f6df02dbcc12c66063cdc2c2ad26ace596180f5b0401054d3871ce96c32b8755dd7e56d2228be213a1ff80a0d7802164a844d5b0a195423ec2d6e7582943841d810027cbb9afe83ea99cbc374b7c44d57396a4a2728d00580f54bf47dab869afb4251dd62cb0f1aa1d01ed3ce0001aa932a6c59d35e1034efce3baf5519ea35da0ebdf1a3f6c928d372b6f41ef67f72a6bdcf109e051ca523448d0a2ac88d358d12444839ea1efcc003c870b0240c1a0084ce5e9322a62400abc08071d520a98056b6ee34002577b84a1032010e3a91da124c439d42a0812a207b7201022dc4824081a00800005e90001b721de0b8343bbac4f47076d36c8af3844b915e70898121a05046aa31dfdd79c1e302a40990ef828a0599861c32221820c1120004e79315cb4231b8d05d909e9e4c145e432d51117ee1d0e57453f31dd8eb7c966c29103a50002a0222c12000577207842000a7c222a521140d0190680044a0800b7a1d034875384ecb50023eed371bd0403a40990ef828a0591838e29208c09800a00600003017eea41b2d0383fcf823c75a8a40122a449af9e6a58b8cce3fdcf1ac54a00040e4408862263380b833dc3906d297f8947e7197b7fff6d4bcb9800000000000001a49c0ae3ac81b5e645f0df563f84a48ae27cdffc0000000000000000000000000000000000000009a40990ef828a05d3d08cffa41aa8c340a08297d774fecf3aee4f3b77a47a0f76e0e28e104114004002800469a66f9dfec25d7d972a9f40d1a7efbcb2864e3922a4160df4d784c604bec155ee1d55e8787859085893141391b36add605675a1630909b9b3e16a712abbd53bd5cd9b731dc46f203c0aa05bd9a549aec8568ba14f4bfb49a367650085af8b25e10286ee884159b9753008011120e0040448340741a0000ac3219a03c9aabc7a0930901a5d95d49691163f8181290d517123cefc576a7749b53c9c8753e28083354002b5c72d485b6f0113092fdd6ed7a585024154a6b379d8ef41f28cc0013de740adef8601357296e6da28cd4d55d95bfe7bfea34c920009bd0126494d06255b6eedc37b227ab057c4803c9388b960355c26dc6ab925cb7be5308b1c400021310492d0889483b4942201a10f050005ee910e4988692c430462161bc0a8318b7547a4852f85d710162aa644f37c10eddacd224195a7d4d47202cc7783b2102a291cf73288f5cc4dd8090302faa824878c0cac4098c01de38143e2763a1cebb00805f865c76c53f6e1e4b4e043b64bf93fc00d8d82e21455918b403f7b7af99cac01f4b76fe027d6bb962786c042807c483bbe3440a7dae149c23fe3e165091de2b1081ad19766184bc19a71c06d6c4a800138c0d0043890566e80e11ae7c40284ee15878b0e38366a2031d909c83084a97b320139163dc009c506802020c1a00014a209e33109198840ac41c17029a605b60508c365e7a121886d64a42075445ffc94086d9838418367344021c05dbc0b0200351d751068bfe3b006dc9078051c20106a2a509f1a39190190295d6185437e21860a725bf60204a38340101060d08284800045c882148000b7c8002f511033182496c408662022b1001180b82c3fc0783163fe21201ac6c24f0e897617b932c9d61aa6a9495c5a542217615d3f4ad96048c2491a695ddabe75ab65e06f6f2257fac799fe645012e3b2e1d0174ae18b4e110210a602dd343a964c3f369efbc3113b3d05666da0aff2e1b66dbc657fbe3978e505ad117d16b74c586c5b81734f305d7485cf44004d7a6b9274397fbdbccf6d94001ad138dde89c323c7ef8846ca19f71c9103610ae841f87d1321714a37762ab44af72302844b3c91d96fae5dd73ab84590ec4a534882eedf3c73a1a857d6c02470aea2fa18f9d19bd52b3fc14779139ee1733dbe7ccc5f3243d58df04841f4710918dfaa35388dc60739816d67c987d2de109eb396ee31c1ca29f04a5b0264e8de94b272fb382fe66ee861a22e34335ba50cd9c55152ce01a048a2b87750991db28d73858654048c529223935b929db7af122f4ae77f4ec2fe706050b87e25fb3f29496e21f59764abd94381743b7b9c00225975b98bd83035e50016522064d3838dcc937b660c2a7a31b6e3984fc5216b097354a3b9de8914629c8e01fc0391a8820be0cbd59b5dc70327948471806a7766d3aa565327ac624b68b0e878340dce6eaed1226161d7d0a0cec64a1d68a2936d267457368ca00f5915138fd09976bedceb5dd45001e87247b1082bcf0dd015f3c0049a1adf8e3914d69023948ec088c963a6e112f9b524c6a61c641300001be900088c322869c89053b13d83881d9106dfa50501c0882cf6f8985708602c9175930259b7120b66ca04e523fe4400856513be092cb0003c7d08681250d80a5009d8f071f2bf091cd1c423921b03c000094c87e90c3f0761f6330fa1581d06c3e4261f00be1c20d6e2137d259e54535be88e1663e4af4d164f25e11acd81a0cf59d59f871d4980a4e1414c2c71ceff9a27d891d8f53edab35c5ed444e71ca87b272f40b3db7e7c5918fa7b9ebd240bc08230b050da1a67da33c5a040a6f49787a45a0928518d1b498faf694be11a1ffa41e6e6d0a4f3bd499000fe68d994ee9405b75c61b7959cc33e0380ca207ffe58ffab8354cea7c8e7a03b2e550401a560a26ccea31d1412677aedaca41c62723d968fe14c23f25fd5a0632646695faad36184464a54898b2100779034330228ac80833e627381189b1a4b00608d150c0b8dde8800985068021641013e0090668c43e9a18409cd4405)) <<< 16000) + 0x96cf0e804820340100600100006b10f71587b02e879a50950a0868b87b2c0427cc206016aeb0001009080680200001924000c3881e10c3d4761e8330f31587902e0396a8206f2cfe458146402cf3a0e1e4424114cfa1547aa6e375731868ee1fd8579a73d2c97bac27e2d42c704735311381e487f2ff16b358040480ac1a48ccc034ae2fb842d10000e1af9b042571e18a6876e6af40182c02e8fff2c8fc7f191a27b90398f9326256482c367a14d1944c1c540472c1849d4f179626f93249425d5478940ac0eed1804d03678004c3030010a269566947880a29bb2431caa4b001314190040338080002b88788ec3c0261ca0bb20a2a80aeb3cdb723d6778bb70c46dc48104380922f80f9aef20e306d1c64382474211ce9276870c014b5512add0eb47220afc1099b1ea9a0ef09407000af279845c03a663d7f55a970e29f922f3898010eb09d68ae1a7d07c11975a64f35ed446a706782c8f2118cefdccb2095f25a1a9d8ce510a2507c000078643bc6703dfc01d2200cb59aa06048add8410017d1580004244f7c0000812980d00400003dc80038910ee390005639e2a0fa92474e73b7b3922a213184944509c8314112f44eaacbc85ee840062c1dd52f8c4b0280019851521aa44156300639b4b080016be22101613f8bd53721a304001d9e9cf0b92a01f84c0000968800b7c990c2bbd99633b0521de22070c595ff4caf6e0e4b4e805080e7be1881d8bb8e7a403094765b44442164c4df10c0307d6bda1779fe9d1d40500f76bd3432caa46acc4000209b9e6ff90eae31594805668f4de5233c56ec2d90006f68e63942444324260660000c7887698800b49c87602812416006f3e41ac360d003b0a886b2f316aa96991981c880a11f7d0b529c886cd830bc10810017d7caf39d032756494f11418143ea3f1a21021f77ba80de0004418c9c0ac5b74d0f34e5f5911c7252e1cb7170da08b6b128f979d2310e825e53875cfe4000a02ce85972527b56f0c1cfb189973233cb6d749ff76257456117e98a65d0cfd845c5b1046886fbac48bae1bab2b5bbfb7ab66b9584ae14ccd88241e08ca77dca14d2713528738254d75e37c78cc503f9ad407411fc023105eec4b8c42d16e794b5778e0cda910b83daafc1cbb268ece1fa6623260d1e7a302c4f0f8bb0c83bb37e0d9ea2f1c638e818ee6e2800f2e2c903d4e486b213118565fb2545b6fe8555008032a0d88f6b33f8db96aaf7c9032caaff129c4d104281ed6708a46db94ceebdb29fb5b418e040382e7e3edcf21093bb5a0de4b649ee99748d038ac556a32ae54bed20b4975c7bafc8710002da2d6cd682152ee50a74708b7395ce1807d91721c95b06a51cf3f97da6414ec10004d5503b5878506f23f83de6c04908732409683acc6ee583bdf8578468994a891132bf07bb5ba759ae39fcc62c8f60c519801e80030e1155c9562658057c4914e1fc6600009aa43ace60926b0ea198748ac228261180bd89a611b134c1ebcc889d2a9dde06d9dd718afeb3f60ca656001536e01942f25b5b43d021001de46786e6426e6c5712000000000000000e193923066b9789b78d1365c52e2bdeea0b2d2a68fc0000000000000037371bd044008fbb5384ecb4340d21d0754618c009007000022951ed20615df89bcf52af09342d3aa5b7f8f0e1cb281e86b413064e4162d9489fbda44001c936f499c7d7f900f48f00a0016a949c4334a503ce8bdad5dfb15436ac3712b6c33882a93160be957f21f1a2c8061bb6b73c3eedd9a1755c99224bcac56531e2e79882016c4be1001575ad91e5e0028f16ea2482033a74f399e33612095e985b0bcb6b91c20000000000000003a36e01942f25b5b43d021001de46786e6426e6c5712000000000000000e17fdc2514e1c0b52082802400000004036d382722cecc12581cb547c6c5c72869914635a0a61086647fbdb59105e433606d03fff8255c01eb8dd90a224806e9401a785b425ac46c1c573ae4118980158c1f66065e3241d69d9ee1104bd17b20358f03318b82f50ff02f3e09ebd19d6e8dd405ee8d80a0db2f1b5da182ee0094ecccc8c61184595eb0680b7a5a7fcec22ebb682feafecfc6ec386ae91d67bb0dc6b0cc7855503e30f32fce9265b2bedc37859200076fac4b092b8345176312e10083a594e04a531bc3091af8c1fd6b442d24b534058b2e49e1f466b3b540658c6eecabdfb39a0d5444333d565e1494bcdec2402697ae8cdb33c312178ebf4335090403af389ab62ffe7fa1f3eceb6b319e8bc6343adcdbc4f2d2d74911a4aa1223d7bc7c4476d6d12c6a46e2084628a9680e80587380c398078675d70f0e007af13600110c0c8042028020080e50100001b90660987202ecb66c608a4732f93d80f64e9247d4ddc7d60ca897831ef5533e80e00133e11f3070ae91853f80f49bd6d09fa3be8ac0b0d055919923001a785af7fafb9b0b3bf7d86de44720f8e60d2bdf694d52334c80023a8bc05f9384b9c54505ab8b893f23cb560b81ad43baeba6a783306e910f720369e70a45177d0c8e818fd895f0dad5f86499458800042e21c6530e219d14ce25620d532d0a6bbe93a260b393b9274d2fedac90b8b878f42d7aff5409bed594b29da7bdf0b54ae2a08d4b29911986621002ffc22b9fac1d4e0fee9bcadf9c7a00e76b08de27186780ef7668c25e7063234634d17644864443ca21946905b056c202df96007492815aefa9347c4f854e39afb30d1265acd2c74c0f4829cfd48619ec98601105b700e1aa068e91817541dd38ea6e970f000051be14d2c96eb78a0635f42f)) <<< 16000) + 0x31da106c7193ed93af894a0fbf738d0352d2356b871373f25bd47d3f6bbc2c738cb7e4327a441985e4557fc690949d042aa858d1dd0d38bc4b2c78f69c143b1251d3fb20254c7384bd566d42dc8e6f487e4c1b655198c5ae40001fe48709a838074001b48400523ce124fe6e6b3289e8d94ded4a747aac7f64945da42a90db8e698c2a23b0f1e5952e9428d5b40e5004f002b76ede35497c4cde7caa8786cffa11b5f29815ea975754f72a15465686d558b1e904000212dfcf9242a31b79fedbe084f875a9e73cde7769c67ad2587bf801a19592966b2fbe7ef6910004300e451631c30a96ade103955a4b1eb184243a4ffead7548637c90922d34ca1b53122922180001344800f799819c228719e943d85b305b9fedbc981ea553bbd5e6444f626983ec4d30806c6e370a98715712d1e8235524b1a01c2b340b92efc35de1456cce386c006cdb80650bc96d6d0f40840077919e1b9909b9b15c48000000000000003851453802401c0000205345775407bd2ca85389f31aa53e9f7d4b84a772c6c7b197ac267735b776ce9b5b81ec7b28402b873a05000737bdd84a41e107d771352d8ead69194a3bc1184417dd880fa3fc8a895fc84b19a06e644ece78d1353134a000b966b340b80a0435e502690a4527e406d032b491970f1b419938e47753ce051ab3c730892000000000000003684800e0ab73bda4d0e1a709d968d0348741c43492893402801800002e6404be10360206b2f839760228d570ed2f51c81fc162bc745d8b7f320401d4c813fb46f48e9e99772d88b19ffb5fa467686d1e3659b044ed50390cea1be320de1506e848370140008da400bfc886d84800e89482186f8d44359798b554b4c8cc0e44060cfbe85a94e44366c185e0840a050fa8fc6884087ddeea037810017d7caf39d032756494f114008831938158b6e9a1e69cbeb220f979d2310e825e53875cfe471c94b872dc5c36822dac4a00050265cc8cf2db5d27fdd895d102ce85972527b56f0c1cfb18b08bf4c532e867ec2322d8820000fd080212a900c97c349c5a27b008fe9c6fab27490c540432e09bb4f85b2000000000000000000000000000000000000000000055d4800c850c40c70060050000005410140a272613b2842c581db56bfefe03dd55a01442abaa4a4d72665229b9bd2ab0422deb9c8902c028cf3bba05dc614e2d1941726070b8f6c6a3f9f08d2352bc20004315009c115ba31654ad98e56d0da0100022d100d00f201fe987840e3aa8950f246b65d2b1ccce28549142fe338ba36e6179f5c28302b8d3310431fa510084bdbf38202a4531b5f5e0e039a3a517c60103492a5e9f3356fbff166dd5c61001df8426c9c960cbed12c98c20081daba1b4827531224efe0628400f59f5fd1de2843ff04c68c0230808fed0e4051ee3f98fd1b600b2cc5244975804eb120a145215d93ce5c0065aecf20740be4d5bfa0dc4c3f41018a9d72e93ca5440e27c02ae4d05600328dae0a6f81033dfd17ca521eb8abc71969a0d3a118e92524c96e8802d39460c3fb69195dbe8054b89d4bef64932068aa0013a07c0e4aca0e7864d43de2a545f7a2f8e01ac78810104e9110f78ae9323aca6bf84feb647793927bdb1cfcf614cd3505f8b4547d0d730ef23491d914d28c890000ae64364c61b05b0d71d86b0cc354061a80303a016c4d308d89a60f5e6444e954eef036238428440230028020000839b3ea4a561fb3f0d0682579e3ddfdb572c3d769bca00297ef36df8b81fe6d61422b6f8eb0600bc0c8ca0a21cdceeb8c57f59fb06532b000ae81416aa30c0cf000000274f4233fe906aa30d02820a19231410c10811200e0000a10747703301a44a11cec307c6a37019396e5b9f0ab14c26c1aa94dc1ea57f0c8258a23474b6506f25151458de618c4088574d3c8046d634b12016b7b3c000726a92c00a4c3836010c372aaf4c48a64a51e8e2d7a10ba484a8f84a920c38f812081a8877a0004c3034010b1c7c0b8d28344dc620f009c92b91809978f90024101a00858e132873283a654e294075d29dc08c30640201a6020000ab21a41a00019c200058e434477640d913550a2dc7099d10207eb7718c20c85a749c185f84cd9200f83de600028af95900b38a0e0042860e76e3230da6f2c80f106e01bf882002f132380079160450006bce205014e1be4013860d80428606f0b5e30d335b79041045a94c1202024667090206c0201a0020000d6219e1200023e2074220ce11066828000f6c80040310cc298620cc32c5606423c20195cdba573d9c15402460381a349de3f988c0070c10fe6276af914f3c0102351de839a6cf141f00c0455ad9ef2e57b3a4800810956e79b1834820300b02c614e574e5ce80fc0240596ed2563c9702c00001451067f297b27962758244fdcc1fc02091182c10338451bef72878c1760b6f69d79303c2586384304184582182102300005ccb73b721af0d60c652f80962e0df4cbbf59b048a61dd0001a52052420ca21064908320240400a00055c34385300b42520405cc055e4209d0cff9df0c045983f61114083194a52034007c054a505800a886bda47001840d7e4019101846040e935e8ad2c405e4db91bd164576088d717f0f62e2d3e79cc234fdc000000000000006d6247834907704b7bebd3d9970d476180e963a75f000000000000001b392f6f407ec447182d23182a850e20810460250214cc91a452abab6e3d758f87706f2f228a9d0da7f7a67c6219794c0d500f0ca1e86ed9259c1994c1e727414bc29c6d8a4aec9e8ec94407f777ee43b59b8226071)) <<< 16000) + 0x4342cf2a000976431c4618c130c50981002e06708a37dee50f182ec16ded3af26079c97b7a03f62238c16918c1523041040c13402c0180040002ea4aacb79d70c3dee4b367e25a4792aef7efcdba20720e57b8e358a9771b854df7b943c000096082f8f1481e75ad91e5e002b26dc8de8b22bb0446b8bf87b17169f3ce611a7ee0000000000000036b123c1a483b825bdf5e9eccb86a3b0c074b1d3af800000000000000d9051430c80840800100caf9fbc2d0bdf27c1a104a8978f7dfd0a308101bae5ebbf30844d7e72cedb931ad65052aad8dd67684a491235c34195fa44309141a2044dc05502ed51c2ece71802ca26aca8c8f20b7860ba347214300f2f55c61a38177102081a127ea241041e6b382003542b34009850740214306017258c378a47360820af004f0a08bc95fd12003f42ce0c01615f9e00130a0e004000046c80012b9000776200136a425c86052430c41584b08c254472ef0d0df8b6ece5d3c5c4425417a53eeff173c100000000000000000000000000000000000000000a0218660258218248038080217bc287fcdfd257901c6f00c9e994b0684c1d0bc2bb6edc9b09e32d5afbe4d55486154bf63cf942f4a1fd4d4a4c9a91f81d13bce52c3ed517dd8a0face3f51f69a80b358c2e09fb430166f9a14861ad2cace394788000083d60184203af690016180323c8aac50c0e0e8a6302060fd7f8f930c319adfbcee0000eb60f98c3852004a048f2c183cfcef1f10788137335cd141a18403756e8456620a193e57aa83236030d0c83018d355050439f57fdb75210c105d0eb1f367894006f9b9b8fd2e40022992684eec598421e4801882c000096886182c308161820b0c00185f80c2f80617a03c208bbd00557f1c55ba8fa6dc78516959e0859fe3043346d6276dcc0d77c1c5a2a81c2072d006982060806507706901c050cf4f686105000595e4f47ceda89002a040610163e9cf5af208bb7f411d300e28e2db50f0785154b118ccdd85842a78ebc6c83010a78801e9d180128b645c984800760fa5f41c0001264dc921a891d2005207800020b20640b82228e13126a81c51312e3d29c05148fac58afe03040e4e10167d0c0c8b6b3d2d3520313b89c0a8587085cf2b79b4e1420438523a5b42080304a9c6b0b6d120054078822abc626e6a838a21cd61bf2c1452101ae8cfa182065674f01c4c0c8708fe5b523843507cd929014205dd684eac04102008192580c00180d94209f6da4801481c000082881600800113885a86c0780616803b1c5cd1637815e38f4053c4a8cb2304027b01210060c20403aad21818410647cc89def458210458122d721c11c3724dce5202087c830d46c78a0030d0dcc20e730fb4801682402cc0617803d2451ed071fa1924dba76cb33c438602f30c66a2440c099cf464d306185f6470df6b1a1849c6a1070b2431d0e1e34ba4186056eb80a4c0c0024e38cf045cd58480158203490d389a642124c8b3b57c80e180cf746cb840c05c73c0d81860f1b4766d1a182d96b2c7890c58e8eef482060632ab0df30105b2e155770a400940900003c262680000e30d01840c380cb97d1044a74dd09ba1a281694d514c0e283e9840dea0a28b7bfa0cf51010c19296c5e0610c92e99d5e8a001d31332a448aa400a00d0176020002162000c96405024026120b20900048090b11100091490ba2585c86e3c7c2987de119882d9f8c632b433707ca2a600000000000000000000000000000000000000096268a48a28a706686080804b13151c3bb46c46fb3f52e4fd034e4f4d5b66bb00221a23f0ffaf860226b82aa72abcc2333e60773f6f88a7244a34f9c933652035a8d8af3c60d66bf817da8628ad25ec112f6e0e223e428a350694e81203883c6f1940eb0606696208d9b7e4060a60332af563843759ab5673e304017a1d3bcb66001424dd4fd100000032dba928db9689002c04405c00c2dc0616c03e2841e49cc46ca2b7dd11bbea091c2221ec073c81c2044cc45f4e1483b5fadc9481057cf954738704814a8b79501055b60982d50a00436825423a616900280387141011a7851513d26009904503a6c68c14980f250a2ffb55468801b023668006aa7ef3800e00400004e484180fcb1d19d264c8b2f183513d3e2881b6910afc8a1435dc9b6e2245083cb2b248f08411ac4b5f2c2461bff5114208a0f1bffec2c01806c5524aaaa400980c10338451bef72878c1760b6f69d79303c2596a1289270e888784584502701900010068000891d0282d5460000007ac904c503d334e28a28d18514e00a01c0200803400037880020990007983c79a386c480a7d9fdec30c1389ba04134a521c28101b324e012880d80400003ac85a88c0781616803e286d52ad1580a2b0dd3092740f1c0bb1c3de40d1c12e6886320e1407159afa3ce10262400434ca108b47bfa8404104d2958a480d0c3cc13ca012f4120050068e2822cb4c1456e0336634612fe4e450a3f6dbf5210722de69a18d5f5db34008655ab3800d80400004c8f1436a9568ac0515ab94d1f92078e05d8e1ef2068e097344319070a038acd7d1e70813120021a650820f8926ea02084b3ff9b7c06861e609e50097a0900280347140537efd28a81d224506181a8bcd13081ee34ea68009119669400740200001dc4000c24c11196715420803ae0c4186bc7742c8042ad15be5821e3c7e212840e00400003b485984e258e0f049e98408ab43e61046ff2f8741620455b003181836636a90618f2be60c2010287da6b181038d909c90110338db021890c20014410ad51a72231e3)) <<< 16000) + 0x7a4e187ad489b2015d4a5b604818340100000bf20005224050340261a0b20d00053c90b115000b0410019ca2006278408014006a90429866008d0042c0f615e73919641bd71829cfa1c44082aa06e2402b9c708501cd97720c04fc4fcc026101a00848caabb5f30318ffb68c146bed40408cae7ee1823ebd9904129ed460258406401000020c42b85615a130ac0985584f6269846c4d307af322274aa77781b12052c21421410c12c01801400400110c900080340800400025a42a8a40644b0a9218540c829c5414c228144e4bf13a28c35bf48e085bc26719648f61c70c096f0efc14ddd74b298808d380ee5b39af9d790b06aa69d4771c6887a105047b8fabf6a8f59fd10b00ea2b4818d94cdfa0450088de13265e8bd133c7b110ee597570d15080aaf21e70dd4814440b005086c274179dd718afeb3f60ca6560015d382433ba8f4c5851f38f5359b864680ecc4574472000000000000000e08e10d1030ca09000d00300cc7a99bc95b434aaa028ea13db6a1b6fb8cb39139dfca3e3b4d8c7087417af081795cca50be14b304051910f1bcccfe0e1803fd5c41ab1d5030ecb46de6ea3e3e05041fa18bc04fc3383411192f607b5380b840813923d4f145c9cb00026718b3dd0c50086f908af59aaab48692044021c83e02940600056c646012f999d697678747459addaee0d0da81d7deda7b9e110037a420ce02413653c38f977e500053a41e01fd4094a790c5ed11a71733061782c0000730850088078141380200078d3438551b444594892299e547129ced79b7d423b320f58582d4fc5aaca9f92b799ae18176cafb53304770f13b4880946e05ea0e1680ec0530800345d719c2281a337f7e380e1ad6afb3b29d02137d0e25c9292e36e031c8e5106af132680bae70c4d0d405202c264141300a0a305851028000dfc8168cfa4d7a2b4b1017936e46f45915d82235c5fc3d8b8b4f9e7308d3f7000000000000001b5891e0d241dc12defaf4f665c351d8603a58e9d7c000000000000006ce4bdbd01fb111c60b48c60aa1028e286196096001e93b3f45aed68725feac467ccc5ea4ffb5e9ae26d71cdef86d71b8086baf571f71d3371ad441417d2125edb45e08ecf79d626795a1701ca70d38e3bba1a9faf82f550511143fe84f06c2843613a0b918c8053e209d606201825c97d50410a91100904f6f0fe6002bc9fc0401c1f3884e103201002c05f25ede80fd888e305a4630544f10d10910608208904204a003000c860080340003d4850088078141380200028c213e2bc3f1c62bf41c0daf719cb8d4bdb7ed1a08cebed8db51f9ca8f1fb4e8506d22807c0888d9aef7b4469a160289708e2ec990a202a800ca8b50025c6b742fc4a5f72ef533776eba57eb4125007e5a3eb1e73bedb81015a83106337b20bed55c2cbbdc68c0ebb56d29d1fd0cf7953ccc1b46ef6440aab6550112da85741ec135dbe807a9f5e801bca89c87d845e6ceb9324f978880c1f7be949cab331aeb9ee1e61503b306edb68d487adc2ef3c1437f0c6f7707cc70502c1c02c3353db70b1850e1d957752f57502de8f9a90c25052a013c1309d05c0a43704238338d739061a783cb41067b9bea40067490d0c0081e2d8160c1900404e00800046484d8a8268461321a0980d000412900100e212e530292584b06c2542714ee2ab6f1a4336d3273dd463262bd6e86758a0000000000000000000000000000000000000004d478f8530fbc233105b3f18c656866e0f9454c0000000000000000000000000000000000000012c8e28e1060ce08c046004010b860080362500009604484436c3680c17bd538814901331a0244c966738000012c13000d80421567d10e4880bae6b72bb01eef58092e029f57e97c76b63fa200000000000000000000000000000000000001289129025120814515010b003030000200d0001ee313421f23eb44c0872ff1cd1416954a744408e30ef020801368b118127cd50e0106dc6628b3800000ce40100950e8f4b9001e01044a0e540b888b08900873dc3f3d50180066d7c136102843dcdb5263145ac451b516f8808327f529699840419b9ebaa12160000010eb4f80c0002871a903146592005608000021f20007b0425004000e3a7c43c735a440602db97030f5ad383120058ac3910006a98504a0836010f244a5b188e102283258f0c26575a830ef092ed8e086280dcc9410700200001d6424c241240a00021621222309011f141645bf1c1bfb305e284737b178415ba4c3c4025403f48a0175398218007326b04e103401008f05c0a26f784280a04f856471016871408251e37c6283150bd9228602047ac7040b7de613820d80420502a74493880c384a2a8f0e2047b39f9e2096ef722361418acbab0fa68200efb1b41c00367c0b04580047a553a1400260ea79864482110100000720c0c0181c1340a109245d4050139d971c401b3ed61048359ebe2830a97b0926041c00840a047a786ebd01c3b05ad6b01c409b6bb440c412f95f508da2830f9597fd35008095cf653838001f0ea8d94c000945e6ccc200009145d350fa12084c0580001ef200063c400194484708807c1411a020007ef21183b08b1983c8ac228161120380a1804d2c82c42bb4f3518823edcf3a0870d26fc928830611eadfa53c1940b9a171a088175c214a0010ea3adc2800f70b829422243084081a320a9cfac98291c8f55ea221e842aca0c206991b890410054b190020c404e34c2200bf4f4181e00000e1000c01c2f08cc609002001c48c07a03ea76763460666a9e4ea6186bff07e22d6524)) <<< 16000) + 0x513e6997a84014506a6f0e4703444592d51caea42410835269faf8300000063084900c00059f392980b9fa2400b0120000454422007a314a0f9720c30fc08cc4262a0b1267d8c28d92aa178618069ddf41c12a8227a704148da9706200000119400403247352c789002001c4cd0c433155c021c7c18c3f8793d186096f4ea747b4854cc57a5325738204ccac81869202018a654b15c2814750a780c2834000005ac79841000052749bb60aa7aa400b012000045466681505152e481a438f24424a17c1fdf943068f0620a3e0e030c06b0a8fa792a4a4299a6482ef1e5107040081c02fedf5b1c0810f54ea4bd1cc8000000e2850da8060a5ff08003606c48e005a35a6f4299a05139fdd7a871e34e78428b994306c41909dc01860707e815a4a90a666af6bbb80e0803c523524a9a000001a689c0100002ff95f4018cc12005608000021f200090a400225c80065f180a1f12e7104bc8fec0c1a96394cc043c920c5000cc7301405bd32784c103201081458152f4f140e9b7b962002a17e14409cd4982097a63e90f0887e8ea84c1036010000110210e1a000244210c230850de129327eaa107078820035f46ffe50606fe3232eae3048f6af1bc2222843b0a5f0af4e4834eea24b2b9430066948e014be2018160520e8bc07a1202030b01501080b8181cbb0660a57b8105893af11068602d962587723ab0402319bc84c0830010a2d284aaa2040b1b89a38811b7730b0c7e780198100bcd8d20105bffa86800e2b93c9c106c020000266420c170301f421a03fa3020fc3e3e5101123f4a3ce9f5c4145a6b1895e5092c54576d85222796d02eca2911a8b10f4aea5ed2a91915e58508130a406be613a48513430067d370b2cc217e99558598edbfa085e7cf7c8b0d203e55ff43d25d2eafcd17a4a8e54d77d1d92901b7b54ced67e2331c32b729f6f2acfd58f0fa2313d5d784fea102fb3c6378eb65612ac65089a20840600c85e88516a850f68204105cf0287102f0c63c2c3286952205048475e813c0066ac4ecd00199f9e10a4040f00a00005e4800309100088c21042a0810100057010801d83f82e258192e5218603f90a2d42fc0a13f7fdc182008642a4ca6b1b2019860aa0ee726c49010a253d7a7d7fda84113a5ee729c494b2008504ea9d3b673d1c000003a664d855063ab2efa000e01d112c0dbbcc69b6e28b6bfee827a0030400cf06ba56ca019becbff4cf048085a066e20de2104661a7fec4c840107b2c70bab9160000017438d5010000de7121909c0b94801682400008ccc0a45c6ac8209b39f988b0c30a9f71e107a867f1c105d985608326037a898106c02000021c41f0172480253807c83461dd8ce10ee30d641f6611b8d1411ae6703f8a28970e7fb2a30113369bdf1878000018b8200600c2143da48020033e3b6e90a8c4801381a2460012d96ea20c61b2414532b740888710c21c5a910c30616111609ba2107e1ab9012b0b04026a61f4ae44821ec4bc6f40e300000030a4849040001d11b17a2baa3d9002d048000119991c10a3eb4c492008d27f090e126c9c6c68c2ec382a030d4027c0ac30a515e95269083785e1707800001770030055dba4f144801000c246093de0080602458178299ea828c365e721f924e1a280bd0f44e4fa220eaaaac259c86181ac53a5fa18c10e83af25ecf980000017438d5040001bce24321702e6400b01100004524000fd8c0a41cab8c209d1fd8c8b0c2626e61e10c9df2110109c273408245a679826081b008000088100098120fc1307d09c0a381b670d0c17feaf2822af65aca044ed150041b16aff094106802187aeec605058c2e6e50322c5de082f546b45804f5722500a95a9a4c08300100000f920f813896ae3a319c5848824a28b54f8ff20208d27a85862d35180c184549f688003d27493820d004225aaa44f628b9a2a512020a30d285865366951c102fa68658000f34693020d0040000420c0a1b6009d0246b80c61049cb0c28f0d7db8632822f4da7cb0026936a28016c877427081a008000098100039c20f62207a050002f61014110098680c834002bea41e4540f02a0032842040020047ad200cdbe41dc340ec12006b6c201858e403146483aa0c1d0960e6029100a0ab73bda4d0e1a709d968d0348741c6dd9c5740365abd3a2f87eea115a154494e89197cb497b5e1dee8fceb0e4c51070850870060000019d273ea26836c17413d2a34c1d62a6dac9249dcc02c3e7af00353399b552b1bf600056817c4d3d729bf568a055716cd4763af88f1863be1e3d0d715c61dfc238093b95b75ce3a9e5f94f687318ede3f54ea276ec9a10dcff69b1e0737b25980c8541ed373019ecc76018e2b4605c0a73d5ee2376aa00e0ffff3b4fdfba573969623709ef7c6a80921f49122c3b691a043123d1d3f923146555b2dc772f38fbf5efc6cc23d6bb16d1a43892545c4b8b27a132e91d4675b7e0b4f5145a5b088403d53eb4b1a7bb696cc000067d9e5b67404c40f0bb6aae01e13cdf5d6ea4dcd8aa2b8f7828a652076b2c1a6d927ba855cfbce9644a0df97b1fd9395981550199ee4a8168d8c859e26c0b2206e6d0e7c7eae0505210725d482463bb0ea7c12a59bcf8aa82c7ff97dce7b240e0ffc6ed1dc8d64edb3de95524c733b6dfcf84af9ce28347de84c39083ab033285a3910e164067f86f77b371410dbd76e03a12d1aaa82f8d98db09c16d57365f102a2829cf8b4a2eadfae49011abc13f17ef7d15c8bc33067ada5e2563f68764d00007e1ea2a978c31037704d0e044b4f9e74be46b51303fe3361cfba)) <<< 16000) + 0x81cc9bf0471714f88f8486aa7f6ad3bb478daa817e586604ba34fa7a435bc6cfa09083e4df00e40bd89a611b134c1ebcc889d2a9dde06d180284800db76715d00d96af4e8be1fba84568551253a2465f2d25ed7877ba3f3ac3942c82072852051c000087076c7932f4ec6eca1e1c14b6d548e3210edcf2c99f57274161ddeb354cd39fcb7265b5dd22ffa0e62d40f3e6bd524c12a68001b49071290004e490702dc8ccfa0d2105a22cd93d4efd783572fa15c0d8c284d86e83345aa565937df6ddd54cf0db7284076e29ed800b0f620bcfec5b5fc50db8e88e0c191bcc645229e10b027194440a08fb00f18802202e26d0f022605a5b6238099cc2cf904410c00686f7683b0d785cc8e26fe0dd49b5279b448601070b1a0189f8728727afc6921a450e000010548378480050c083708eb340b92efc35de1456cce386c006cd034876709d969a4d0e1a0ab73bc1c21c41031811012000c00800000b2a6ac0bdd338f7e6725a8e0c770f833a90006664d5b3b363409ccf9e5cf8506dd12106ca0004f241b4c60d86206b0183500c1a4040d003e299eec26f4ae41ee275e0c5d0808563d03e476227639ce3c4a12035ac161d776989167b1b109100625904bab8207391f6939090c00005cb8d7568ae076159dd30006ccb220085f7a981498471c00a69f6efb45cef4cce6bb65a4000b1522d6405e7ec3ab1595753e54e1c409d2ac2315117043123b24bf5e7279c2ca1b58fbe46188fe848252b86bf1463a8181037b9515779f390022ddcf9c7dbd94002bd5af45fdfa5c03ca908a9d71e210020ef0987396b410059835ff18e0d41d1433e3cce7d0da9510f585f8ee41236f629fb71450e314e365ba57eaa24120ccc148cf05355c700cd0079b465530b71238f982351e92182d34400948d39ff83846d930ac433c79b22519da982026067bd26ee676435216ad7553ed4b328a7000b96c7312d2f062e35df6c8c44c9bbfdb3c0000008e1f4fa3a3eb2fd648cb401ae1b99409f240ade7c3cf269645f6a68d574b9d6998d22c721e4e6d456069258d82194298d603c880dddde19800ce1c880204a3834010d272954e468a48b480242ccb4b61a002a34ac0024181900803380800035883304c1941784303325280dee43d102c5840233bcbb3b21ade0029c84080e2c7e29a8339c3619d9ea7007933340f51c92059038a1a0109c6fa1e7a1ace4761445804dbbd186354b342c545080009751dc19fd4acae000680004c25de65220a03fdb4c6704458823708cb8c8e50a41d00003513e5adfe580a51210d41addd3a63d05dbe4359c5eb367d680afbe4e8652e3def9d5bdf37696285d963b97ce311faa34552ce0a07510e704030d235caa4b057616ad842609fc9a130780016de458b9304c3fcfb8afcdededb0396391c46a82194cc3204385bce88c5cbafdd4412068901b0dfc8568d3eb85cf334859083600003e920563a00098d2001cd04190e7638d42db891d071bd038216e1a4200c08f0e8007f8928814042528190087115f699796409d08a258e0e78f69420c6dc3040431c6ea0c0a3ea3a05802d3ff7813860d00438893274a8b1c17177b2840efc15c809202b4818140f76a425081a0080300080003e083186c1882603c1306105f10c54c52f11e402c82d8bc4fe2cc0163838bcdc09d900a10ef233bd79d00582300e1efde880101bdff4082bce01600dc142082030001dcd4bc3621bc078d98038e18830388060f07913402c82cf6495d9002c70aec735cfc028444df23aaa4020256313b161802c11bae05ac0c0101dae06af2c80004659b22af1e08b3807182c0500300280008208002221d281d2e0d8dd57973e1caf6fad66d34250706c0aa1e2a0f1d0069ddc68a44663f065a26f24c4528819ba0842b5db741e6d22a7707c81f37f10aec9370d8f057f1f27b0e5f48ce2dbd5b90839fa8808efb81c7bf66fe38ea7f29baa3272de76c1f8830f69025bee961ac6b8b39afd33f7d4addb7b00388b743d45e2459729ae273c5eb96948ab1ea3c3bef424b56388c9546381d362633960b89c2809066b0be17ad6672220ea6bd015e23108554e6fbf1763f247f65e8056fedd5a098d6464a548980006102001a44417c840bc3a05d1d02e0e816c14001d284007e3ce775c62bfacfd83299580055b76715d00d96af4e8be1fba84568551253a2465f2d25ed7877ba3f3ac3922431c31410c1081240200010791c45147b7520d274c8d151356e664457480a7412970140db75bdaf7305bef4f018377601c4f8047fc72cad256c0c1c3f0d397df9ad034360127de10049feb48e99444c096d4487082bf884071a43527e82f8669e08042384076f67b9406e93c00c13ce785a8155dbf5e438666891ea15802ce92a5270e4708b641c03f15929da490488b89e69156dbb470fcab8c5b2c630aadd900a157dcd2e964b9877fae070c623702f300f167d7891c91e6cae487cf2954674ab7d6f77e36793da5c2ac9b386b1a81884986558c1a593fa61b8fbce8b793d56d809187a6a9745c1ec2f8b87b886009105d8863ddea93343c1af842008111a5a778c67b324d043624500900130329b79f770436c26cc680002d995d97d131918b5233bb981080c1a4421b40815dc448f8298d39df95a6db7e880a38c0238c1a503a044d0b14b7f3f06bd3c6624616bf5277f9d0609619376483c0b100aa162ea4a6335b600c14bab024413d300bd73655990b080335d408111f1cf86aba584d9f0c98d057c00390bfa9056acf2e2f4033ee028489cfb8a8bf6991b77c958cce69b187989557d7a0f48e2)) <<< 16000) + 0x8c3309a01681400072673bae315fd67ec194cac002a681a43b384ecb4d26870d055b9de0e36ece2ba01b2d5e9d17c3f7508ad0aa24a7448cbe5a4bdaf0ef747e7587297b5e1dee8fceb551253a2465f2d53a2f87eea115a1b76715d00d96ae1ca1a49620e18a1800beec49a9aee290205cca4f9d688457197684b38e2d507765e674224b01897a257b46fa198162180bbfb623c59ef85d4efca72ce118cc9b98b618add96b0c676437e3680083c40d04416869823e0e623fb96f71bbb806a66dfae541c9ced008e1c548ec31d8ec5c4411529b834dc0ccf523fb0f4784a429d7de421494c680036d9000df420b2320012ff20b04a0572102b1080b4340aa1204b05000b5a105435c88648186b74a3a9c3b4288af5e0b33a66d0c4f838608ed7201f20328a6220608886299a2d28f60218312df0e4556f0cc7da600e05488da9b6f9c11c1003aaad6fbb87cedf5e020830ba1921fe6fcdc9072f5c802108e4888150c2e646b76608ad373c902136330628809bead0c1229ab12205c15b4980130a0d00400c4260a60b92093d9e8d28510fcc57c6156cbe14e1444bb73b289080702abd1820474266040a7d72a8128087dd67b8000a40e0f00a0000608829088000ba882894e44ae2408451318bb11303a2ac3fcb0ee9d2761c30da508470416042818133eac04009c50680200a01b81ce42812e48c02d7cf62449ce8feb0a2427f6ae440f570298228476ac09d0c22708cbb1207f28bed000290303a028000178209e3204e1502688813004000662785418c5baa3d24297c2eb830b15532279be0876ed669140cad3ea6a3901663bc1d90815148e7b99447ae626ec0501817d541243c60656204c500ef1c0a1f13b1d0e75d80402fc32e3b629fb70f25a700876c97f27f801b1b05c4a2ac8c5a01fbdbd7cce5600fa5bb7f013eb5dcb13c3600960200039a20946a049310240e811c6408c2a045090220280035f482182c0c80522913d13b2c8efc3088ce5e3b6436b9038105c4f00761a8b29af9c3deb446be50c0139e307be93ec7c64986067021ab54280084b16dadc89a6624e9b3c1670d42800b30352add7f8e55fd55205e24ff442201662a921c2f9c82d3cb540cce5984800821efec44a6ebe95516ecd9fc7d6505e723937d9b4f9b6f7ad3592243b0b430d8de00e6137dd22cd87728521fab7a1dcf445bba12f83f722197133c10450e8f54b074a3c2703020dc223fc48c9dfd067dbcd57f4036a81fcd38e8e86ecc72b0452c8eec8da395a321ff4b27730419ffe19481856490224e3624e4ca3ee4e23709eb7b188572ebc2c99eb59a52f1ff98142b508d00257852067a7ead2965eb30e4e302c582aae9e8fce83959a6ee8242640bade5357d808d8ba2b800aa54a2329519b0c1e7f2d35fa8e714e8a4575c3050195bfce08d0dbf764375b128eae64a5a8980420d81d04f02259e5229b4789728cb82f08cdd6e8aa0ab583c570ef30bf20be929901070fc4d86a4082203b24a5a878537f55dc28b9def93bed1fd90cb76dc3ed1579cc41aa33d70093a794581049657412e6f5d201d9372c62de0e43d4c242f3b725a3bc428b211702867014745780800dd1df20433cc1905419e1a328d578a04880b9b043de280ebc57d87e3a8f57fa84800a0002ffc85693994910514c83fc8364e068a68bc216e4e5cceb8081fd9422653561da70341760a262bdee1819a8123aa4372875989c65f13e6593a19f1600be214f27485a207b00006aa205a5b0412982012c0fc3607c03e200052995284b0c5223531fd880d2ccc20463440c6b32f061ac804195e413f344052654cb5af4e0250a50bac507005864d8760c002845180bba0040cf1a470a00e1e2ed8389902d7426c1011ed83e2408c1022140418004798bd26453c580157810163aa414f00ad6ddc68004aef725041900800006e1f156ec2d040b28a42420207621e1304190047986c2ad43c5a500ea10162c3ed0f00aaeafa68006f6aa25041900800006e10001883a50de564a51442cb5e2019900d546872b160916009f994604a18340100000e5207a0bdc6e1530e2ae25a3d046aa4963403851b7bb22202059b8de8220047dda9c2765a1a0690e83b7d774fecf3aee4f3b77a47a0f76e0e21821810a10209800071e1f36ef17ef531a964983b83cde565618791dc6ae3f95b93bfda8da498d73ca849a280cdec0f08fb3386bd9452eca4a0006de40ac2400100040f07724c6a1a5c60854c0858a014b407811840d00400ec074535c7700d163bee482089a54602c1015eae860aa8f004941064021e504a3b7c68a5eed71142d5293c48081c62bf08202edb005802ac0a293020d004000041c81d04800084c81c82e5b0c78e71f35389a54f5cbfcf0d2603c7980819160000000000000000000000000000000000000000005370ea2ae12ff02cdc6f4110023eed4e13b2d0d0348741dbebba7f679d77279dbbd23d07bb70710b0c80c208e00b000272a814094d20fc85e2199f4ea102fd08fec867c672f61c7e7e8507892b5f97b3177fe22c9d6ea621790a95a1b173d980829765ab6879c5672951ba47b6ba9aea6013c553ed5418d5152944e800295902d0d01c0480dc040010e840d8a606a1b0320de130638ed28393a0cc90033338205005c12f818022808f25041900801a00f45b2a3219621b90b9c505546bca460832010d1761dca85885c97011822d4fcf16086cd7bc504c665b66807c3cc626041900800008090001ae20561b03301d900b31a4104429a6d47084193a8961b5954864808cf4ea8600bac11a013080d00400c)) <<< 16000) + 0x81400024440c4374142f9d4a384568d521a0b9cdd324027bb2129a0020c63a5012e4aae002930e0d004000044c8148c80c05405e2202e01010008001734d1b7bb222020580224baf4ea1aab0af88b0b547bd8397d774fecf3aee4f3b77a47a0f76e0e19a41241c20808e00000711155a6fad5ed8b6929c2046dabf542d6ecc5ceabb7d73cba547b2c7cfc6389e6ded842407dba447540e624803b7f5c60606a7efc70c56a2729609517c491013e31de804c183601002b09000093102d11ef7a35999fa81775a689dc98c086c48f06920ee096f7d7a7b32e1a8ec301d2c74ebe00000000000000360044975e9d4355615f11616a8f7b070c920808408904700000098414e4c3a80d1208699401e3794b7dd57fd8cd92d690446f8547603b42c7d2214de402c4e822cf0d595c865b8d121a15e87fe614044226858c29da6b5f28484bc220813499e082a1255d20020e6120d009dccd44a083201002c05c0b7138de8a2ff910104041ca188500b5a4c224041900840000401186db30fd04114430d63c006f7554d0017aab790006802000017040003d48000e41c38f80790b06e9a2f82648272ada4e05bff74e73e7054e78f9440af5f3d7a525feb0834b0ec8180033fa5a137e1f6c01481abb561dd7a4151db1c992181086039d9e0bfbf4a680ac40c80851803000a8657b2299b00d52438ec7761cf00216441d34212f52e1fcd43fd64d85c8b58921c0a839007108dd623d6fa866a95eb62cd219527ec19e0b7be4028746ed7d29f555cbce7dee8f875f25adafd31f79799f455f0a84e58fefc998e49dbbbd262883960431ead399adf34af3840c34a5100000bf640ac240011fe40034748150ec0a4760501b0270de0e3c326a5cdcb10fe1225e38626bda8595c711c5b2ad573157de30767094d12010f479745fa024c5a3927c243bdba1d19f3336ff7d450d593597a957272420c00e128e3ca451d646aee5effad99ec8263c2a7dedb568d3afc5379b6ecbee400376f7e00526681de91fdf13758bcbcbc348952fd81db28bc6590bd62b4cec00182dc294a4170a4d8d2c9ec297bfa4b500fdd1b5172d2fd52f6d99e70bd6a0d2f61c2bacd7f11f5bbd44e86d6eb085d5e8e77064817e24a705fc841e26b8f28e3a1111c209db7c62c403ce91e1874ff43a89004c44980c007d0523098206c021004010047083644f22032a6c908093fc0046082e01000008b200019040983604a03f2445d8a478a0112a93c4005c839e067b026c090306402004812023050000729e103dd4110a32fead91c0f989458d7b43ca47b380e50ef652a668a8e3c382a7ba8c02bf76c2c9492ccaf4f3c84317fc136561471fbe6be0a4f4d4b00cffadc2b6e1b5831f95487e0eb4e1eb9ed5d6fb9994ab856facfac71169fcb553267b564b900001783fd8c9ae5d5ba86e9615042b70e4b88eb190201593f8fcd2c1f21635f253ee1af485dba66b2b5e623718c6f18e0001238811068001f6881088808004001c14407cb403c43001fdb203a4201c19001c8a90046a220369a01a2900c8a8060440096304024c888057669c112912d53d1812194c533028384fe27090404db31de8f060301d093a60801fe2dab42022809950fcfa11a91d0b9d4db4b60a4a718d08c081e9b3399159425e2695df1ed8d14f8e323e99f80000000000000344db3a08b2a1b369184ea0e12f2c818b4f4b9511400000000000000d4861070c6085085004000050ec1f0b2afd9e5e34c9f856a50df854c2cc956a80ff6596552d9c40792466a2ba21b3c25d26433403e56b2a70f3192051e4898b24bb22c61be655b133e37e718b2745a040d530645521b9b3fad245000000000000000384db3a08b2a1b369184ea0e12f2c818b4f4b9511400000000000000d4b1b9ba8fe40865084787df5ee0d1dad93fbee00000000000003232031c3183141140001ea8a474a6bce4d9d261f3bdb194676eb910d3fb57e1d73f68bffe179b160208850e14f6e8c49b1dece0191490efc2273d872bc61a0e9f8d7692ac468a3a24664ba9a7d78ae9d561ba20a9e4e7ad2cca352d464c2c8f4c4be5a998e9184ea0e12f2d4a6bd6584602400000000000000d49778686fc5b7672e9e2e2212a0bd29f77f8b9e0800000000000000000000000000000000000000005022062041021c01800800014ad5e3b084df51d8f4861cfdd36235684ec0572fae768a3cb84004d1d36e1970e721931146d14e543aa55e25db966da33afe7f6c262629282b6aa650867af8bdfe84a0b5956291d40ec8e00b478b14286e370a848b3ccae39102800012a810044162fd800128e0f004309328b0485925036408c1e134303963e74e2c51c0545ea442000ea008426081b00861219ee3db2c9467e7b294480002550c1c3a5a8f230200114162c0f700e1184c103a01000011b202e1b01601e943d6c648c28f1bc1a1a452511e9308bc100c0082c2cc7a880151180e4c0036010d2840f6185be15cc28f2211d208e6cd202825dd6398a4b2000011cabfa0071c2a69681481a830d37d79d19b0101041697d578e3d0c03c9070a375597d0902000c0140000426405417a50f5b19230a3c6f06869149447a4c22f04030020800637820054460384c0836010d28223e98e61495912ab34812fe1c696400002550d1c039b3ae601e56d8dd26041d00800008c9000241202812013090002ea10120900043990110d0080080026e480074e10014382003068403ce401c6a00d3100612802c840143a009190040a801c4400c1200501002008006c388018e800844002020000100ccaf9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 33 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoFifthsCase0" = "QuadParityTwoFifthsCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 33 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoFifthsCase0 private def zz2078:"s081e"="s081e":=by decide+kernel end section namespace Green24Proof.QuadParityTwoFifthsCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l21 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l43 l46 l5 l51 l54 l55 l56 l57 l59 l6 l60 l61 l62 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x4096609, -0x927bb50, -0xdbb9b50,0x1a9bab8], ![-0x927bb50, -0x1d648947,0x4f71e52,0x5e65fde], ![-0xdbb9b50,0x4f71e52, -0x3a975601,0x927c4aa], ![0x1a9bab8,0x5e65fde,0x927c4aa, -0x493e000]] noncomputable def hinges:Hinges:=[(0x1a5dc,l6),(-0x1856739,l5),(0x1479e9a,l4),(0xa42cc5,l9),(-0x3473c94,l8),(0x634b98,l11),(0xb54c68,l10),(0x83187c6,l14),(0x8b152,l13),(-0x127d20c,l17),(-0x2a718b3,l16),(0xd812fc0,l15),(0x13f1b4c,l21),(-0x8b152,l20),(-0x493e000,l27),(-0x13f1b4c,l28),(0x493e000,l29),(-0x83187c6,l25),(0x1674a00,l31),(0x228e7a8,l30),(0x493e000,l33),(-0xb54c68,l38),(-0x493e000,l35),(0x3473c94,l36),(0x493e000,l37),(-0x1479e9a,l34),(-0x228e7a8,l43),(-0xd812fc0,l41),(0x8adf4c,l46),(0x493e000,l51),(-0x634b98,l55),(0x1856739,l54),(-0x1674a00,l57),(0x2a718b3,l56),(0xccd52e,l59),(-0xa42cc5,l61),(-0x1a5dc,l60),(0x127d20c,l62),(-0xccd52e,l65),(-0x8adf4c,l64)] def normalizationDenominator:ℤ:=0xe4e1c00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x493e000,l27),(0x493e000,l29),(0x493e000,l33),(-0x493e000,l35),(0x493e000,l37),(0x493e000,l51),(0x83187c6,l14),(-0x83187c6,l25),(0xd812fc0,l15),(-0xd812fc0,l41),(0x1674a00,l31),(-0x1674a00,l57),(0x228e7a8,l30),(-0x228e7a8,l43),(0x13f1b4c,l21),(-0x13f1b4c,l28),(-0x3473c94,l8),(0x3473c94,l36),(-0x2a718b3,l16),(0x2a718b3,l56),(0xccd52e,l59),(-0xccd52e,l65),(-0x127d20c,l17),(0x127d20c,l62),(0xa42cc5,l9),(-0xa42cc5,l61),(-0x1856739,l5),(0x1856739,l54),(0xb54c68,l10),(-0xb54c68,l38),(0x634b98,l11),(-0x634b98,l55),(0x8adf4c,l46),(-0x8adf4c,l64),(0x1479e9a,l4),(-0x1479e9a,l34),(0x8b152,l13),(-0x8b152,l20),(0x1a5dc,l6),(-0x1a5dc,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x14a21c1281b9200a000000711440c830100000000000780c40100006214422026500400000000002a039004000184520840694010000308aa1081328020000000249040d8c03000004848080c9180a000009090100d23014000012520a03246028000000001e2c0cc01000000001c0e02980400000005221034300c0000000a44206c601800000011050064c03000003a1106011200600014c410c409640100000000050280a6010000000c4110230c0400000000000281900200010c28044053401000000000000e06400800000000b05028c0200000001504811180600000002a0c013300c00000005c1a04c60180000000c824090c0300000000001204900400000002609022300c00000000502816601000000000000c0c80100000000005e0310040000000000b4062008000000000032064008000000000640308030000000000e806100600014436070097401000000000001e0640080006910423018900400000000341a07180400000006211027300c0000000cc2605e601800000011854028c030000000026120318040001342304803240100000009210806460200000000130b018c02000000002614029804050829010800cd40180000009a090062602000a20ae08801b50050000000000260290040001582405809d4010005305104c025a8028000520a81200f50040000b81403802ea00800000000026009200c0000000088480c60100000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x94230881a200600000009239024300c00000010432058601800081170310151004000000408e2036180800000000002406200800b1923058022080280000000001f0148020030250422008c200a00001845612024400c142902844012308030000a12042403310040502402120048c200c000000a12040c8301000c496606a046880280000000431501cc0200000000862c059804000020ca42a01c400c000001a62101b8602000000001a07034c0200000000420a0518040000098220a01a400c000408e22600d8802000000028904090c030000000003a80510060000000000e40620080000000001c81c40100000000003b01880200000000007402900400000000ec680e300800000001c8d01c6010018128209004610050582492090048c200c00001243209036400c009086704204988028000002c4910320c0400000a2210881b20060000000000440b20080000001a4c206c601800003426040648c0500000000004a03900400000000b4540a300800000000002206400800000002909018c020000000491081618060000000000280d20080000000000c80c401000000000002c0c801000000002a140298040000000048340e3008000018888120448018000000000110388020000000002438198020000000044340a300800001b8a44c0688018000731482f02990040000000002a80510060000000000a40620080000000001481c40100000000002b01880200000000005402900407045241200918401800508850420264802800052104120265004,0x681900200000053064024301000000013052034601800000000015038802000000004c2a0718040000000094540d30080000000001300a401000000000004c0c80100000604418098180a0000000000240e20080000000090481c601001081c22840e4100504143821220409200c0000000054240a30080000000841203c60180000000000a01480200000404708126180a07145141200918401800001c84c1406880180007114414033100403822820a0048c200c070429c138079440180000000000380a40100000000001101880200000000001a07100400000000a464093008000540d02980f48020000a619851026900400000000220c0318040000000521201c300c000000a21101f0602001231c60b0044100500000000561c03980409047441900230401800a188b08c0572802800002824840648c0500000000001a039004004a0808c10390401400000102308190602001011c2098066100500000003204807180600000000002c0520080000000070580a6010000711843c01b10040001ae3a04404c2008000288741240af40100000248ac1c04880180000000019404c803048a38a110048c200c0048832847024c4014000488e212019880202411c109002461006000000488e206418080000108320e027400c0000017108981480100000000000501880200000003a0681f1806005bc778c300f140140000000c43402a60182c1251064008c100600012c2a03803fa00800000c0961019230141409048240123080300000001c844078c03,0x2e1c0398040001844604c038401000000011042034601800000001306038c02000008823050152006000000844c180940080000000110881c601000000002111034c020000000000440290040000104460a029400c0000011098300c80100000421183002900300000000024181980200000002a0a015300c0000000000b00a4010000000a8110194c0400000504418098180a0001882905806d40100060858046041a80281c518505e018910060000052210e01a200600000608a1024c30140e08c68a0814ae803018a141051020490060384306284048ba00c0028442063019840140000000128a8126010000961584102690040000000210881a1806000000009c3807300800002488816018801824120d1c10295d0060484406384048ba00c0000000024180630080000148681204480180000000c8440c8c0300000321106019200600000002209022300c000188480981988020000430c42102590040000001082801e18080001f03c08407840100001e0420d0138802000000008828030c0300000b23b0700d200600000b0843013030140000000000b80a4010000911981300e10040000000000340290040000090901024c30140000000ac16028601800000001905028c0200000a8190500d2006000000a434180d4008000588f23301ac802000000002d1f038c0200010238848034200800000000003c05200800000188a8700a80100000000230f028c020031e43c718078a00a000000830e402230100000000e462028601800000002713028c02,0x6a2a079804000000d11440693010000001823880b06020000001482100f0c040000002d04a01e18080000000094140f30080000000000a80c401000000001916018c0200000000003c02900400028c530980de4010000498860b00f680200000000001b014802000000004c120498040000000ba0b013300c0000000170381660100000002c83808cc030000000230d80698060002849109806a4010000519261401148020000b128428021900400000000000f8190020002448105804a401000002590c1602a801830f2ca045012810060000000006418198020000000005f00b200c000000000ba0264018000000001940288030000000000620310040000000000cc0620080000000001900a40100000411e83806d003000000003a120518040000068240e01b400c1250e10608113a80300003109c1c018d0040496390188062ea00c090c8103080c1f40180000000110580a6010014320820808e100505064282140638200c0000000001900d200c0000001847207a601e092c4020c047c5007c5a5a804780fb8a00e0000000001100d200f0d9660112079e2803e092c4020c09dc500700000000007e0310040000000000f4062008000001625080506020000002d4a500a0c04000000000011819002000000b318c0783010000001623080b060200000000151103cc0200000004d0900d98060000000000c40e2008000000124280666018000000000060348020014420c310115200a00000007219027300c006304605601e48028000020210c04c0c05,0x416310108062ea00c080c7102080c1f40180000001041806660180000000000d01880200000000120a06980400000000241c0a3008000000000028124010000410d41c031900400108194190033200a0000008804401330100000000110280e60100000420c84408900300000000044181980200000008a0900b300c00000011c1402660180000000210602cc020000000610981a18060000000aa0a00a300c0000001441c034601800000002a06014c020404386304048ba00c00000000442c05300800610a709e0498802800000011858034c030000064260980ea006000000003418063008000000184220686018000000000090348020000000210d00f18060000000481d01e300c000000821a818c6020000000000210248020000000002e8051006000000b904803430100000000001700a401000000002f06038c02001c232c250188200a00000005a0900d300c00000001b8900c601000000000037018802000000006a240318040000000084280530080000000001681c4010000001444300a0c040000002a88e014180800000000009c062008000498860b01bc802506242029c05505007a2448c05a00f60a00e00001244a1e012400c0000000198301c601000000284510160c0400000a21c0700da00609448083040ddf401800908e60c603fa80280000411d0440d10030001424883004320080000000ec2100b300c0000000000880e401000000003b1101cc020000000076240598040058c920a20238401416192a0a5018e0803689304020c09dc5007,0x411500a98060002906204801b4010000001461c80486020000a618c1301ed0040001423207601220080002886c04406b4010000000104720286018000002c81301e4c040000000000320390040002d87104c05b401000b90e306803d6802800000029088034c030000003183201218080000000a623025300c000520c20d804880200000002b084074c030000000410d00a980600000000a8540e300800000000002a0640080000000321d038c0200000000003a071004005046302f0074401400000168d0280c8010000049150240f500300000002309812980600000009624011300c0000000982203a6018000002481301e4c0400000000663c049804000000009c1c0a3008000001260c8044602000004c2186806900300000000003a0310040000000821200c300c0000000118701c6010000000000210388020000098430d0152006000000830880b430100000013118701c80100000025230e0350020000004c421a02a0040000124861a029400c00000009910e068008000000208480b0c030000000430900e18060000000620a01c300c000000c20901f0602000000000221c0cc0100000000140c079804000000003c1c0a3008000490660b012880200000471484404d003000000422a1205a0040000000054240930080000220a42202680180000451504808d00300000321305019200600000000ac380e30080000000148701c6010000001042203e0c04000000005e2407180400000005424019300c0000000168901c601020a18208102275006,0x21832011180800000a44409014400c0000000e43402a601800000002e19038c02000000000032071004000000000017032004000000e411819a602000001c212009b4c05001c2268240136a00a000184510480aa40100000000e4620686018000039188900d1003000000005a2205180400504908e303d540140000000000281c401000000000a05038c02002463846081eaa00a00510608a1020e4014000508c429016e802000000000006014802000000003a0a05180400000005219034300c0000000078500a6010000c11581300e100400000584a080c9180a0058c9090103d5401400000010c260286018000511142c0191004000000004c22071804000184440540e640100000000843206460180000210c8300c900300000001908811180600014c3409007a401000028866118134802000000014828070c030000002882407c1808000000b11cc089301000000001b11812601000000001707028c02000000298320111808006188082f0074401400000190e8280c801000005a1c8240f50030000000330580a18060000000a82b011300c00002a0c412028801800000010848030c030001083083c02b2008000000430880b430100000208841a0148018000041108340a90030000000210901618060000000461201c300c0000000c4340386018000001843203e0c040000006102603c98080000000941100e300c0000000c84401a6018000a11981500ed004054e4120da0235a00c00000006623025300c00a18d205e051680280000001b084074c03,0x1182605718080000000000540920080000000c45604460180000000191602cc020000000793881b180600000000e4540a300800001450c2045a602800000288330334c0400000504340136980a00000b0941024c30140000000000701a401000000003b1e038c0200000000723c0718040000078220a01a400c0000000001280c401000003c27040648c050000058c420119180a00618948350234401400d314415603ae802e922860ae0083150070036050c57016ba00a00000000002c06200818314483380be88030000024a10408b4c050000004904606698080000090848026d3014000001b968481c801000000352d09039002000000004a0a0518040000000b21902c300c000588981880a88020000028211c05dcc0500000c4230881a200600000e09a1019230140000288a41601a8018000a316019023d0040000000492081a180600604b092303d5401400a21031c603a48028000002043901a8c0400000000420c0298040000168320e027400c0000018970b81480100000000150f01cc0200000414208116980a0818334224091a40180000010411819a6020000020212009b4c05002c25048181eaa00a00031ca40880984010000318a60d00d48020000020209c05dcc05002c622c23015ca00a0a1882419c05f4401800000000f8700e6010000001c42901a8c04000000423c0e052004000000006c3c0a30081338e4836808d68030000002849101b0c040000040c1380f8980a000000930e402430100000000098381460101c614f10f00e89006,0x164318a606220080000003105809a3010007904505a03188028000000941d0318c040000000002202c1008000000000540182010000000000980f04020000000001700e08040000000431d80a18060000000000240720080000000ec6602860180000000003003c8030000000000680f90060000000003500b200c0000000000c8164010000000d02500e4c040000000001b8099006000000001a001320100000000cc4a014601800000001b11018c02000000348820191808000000006c4c06300800000000d8900a60100000014848004cc0400000002a12805980600000000584405300800000000b0900e6010000000000b00248030000000001b00490060000006a04401430100000000c81201860180000001902c070c030000000360480618060000000680900a300c00000d0082004c6028000001a8210058c040000000034120318040000000681100e300c0000000070281a6010000000208e40d0c030000a218834042200800000b094100d23014000016528a032460280000002c9440d8c03000000000545819802000000731480bc3010000000e22900b0602000001c62b80be0c050000031c408168980a00000608850111301400000c410603e26028000018a2200bc4c050000000411c81b18060000000841c019300c00002893c4c068801800001c23040930c050000072350601120060000000064580530080000004208811c60200006116013014d00400000000322e0518040000000622d022300c0000000d05a02660180000001a8bc098c03,0x621c02980400000000c8140f3008000000e898780c80100000000390e018c020000004c82401a1808080c63450c02e340180000218d85604e801800000231d15025002000000002a260298040000000920b034300c0000000008a01440180000000002101880200000004509005180600000000008c0620080000188a42406c801800c210a18805c10050000064230d01620060000000000740920080000000843202c60182492091c4030b90060490410382046ba00c0000000c20c033300c0000000e848032601c2a1c184a00baf5007000000004e24071804000000009c180e30080000000128901c601000000000907014c020000003c2a1202a00400000074582809400800000000a828146010000000000050348020482402386048ba00c000210711280b740101208c0881810ac80302411cd181025750060000000044140298040000000821601a300c0000000108701c6010000000108640d0c030000fc308a2023200800000e86229026400c0003d0a20980488020000000188a4088c030000f0308a2023200800000f46229023400c00001e0a41602480180007214c190191004030421a1840468200c003043082302cb40140051876086051680280000000000d0248020000002402200b180800000000443c05300800000009412016601800000138110058c04000004a1304805a0060000000001e009200c0000000000360640080000000003502c802000006419048112006000244841cc0c840100000000009a014401800000000025038802,0x69260c5120535a00c0d0cc08a0c072b40180000000002281c40100000000008403080300000000322a0798040000000002500c200f82182410606d9480380000000002101c80200000000007a0590040d0cc08a0c03eb40181a798514781056803000000002a0b014c020000000592881318060000164a419036400c0096101062024c80283c9386309029ad00607867046060395a00c100cf08d0c0a5c40181e19c1181807d680303cf38a30f020ad0060001c46182203420080000000260b02d300c18116183000fac80302c228309b013a100600000000001081900200598a48550234401684123011a0138280380000000019c02c803a384aa046808a0a00e0000000361300d300c000000019068126016842c3060c06535007060c51214e03ba200d62891e0c101a49401c1c19a116180e56803000000504810258c040000003106201e18080000006a0d403c30100000000248c81e6010000004846101a4c040001825a8a40662008000000b444180a40080000001984201660180000000331101cc0200000000662405980400000000f81c0b30080000001e41c046601d0b2459028094b900700000e21c0700da00600504928620198401412a90304881e4c8030289249204030b90060510490402046ba00c0000000da1201b300c00000001a8281e6010000000348500ccc0300000b2250f009200741090c0a701541401e86124816803d82803e04283040c06535007b0c489053811e4a00e0a0490480c091740180000000158301c6010000931f06302ad004,0x2081c401000002a09024075003], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0x6a6eae02515c66d1e8235dc850401c0d4dd5c00002588be25c746f3da2070a88b0d6ced40b340e407383441380300342e3d6e5c6b6c327f4fa3bd44dbc275d5df68a84391dd597d5743960e48a654b88a608901f2c0e613a90461af195143832977238d080d26b04c104d74ad10056852d09820680200002147537570128ae3368f411aee428200e06a6eae000012c45f12e3a379ed1038481c30870650208270060149b9da6926ab7bc9262bad1932891baeee0011ac5655ee7ce91829fd2807047f1b2c0e570513061ad73892383293c1f0d08155619041b2a47d91004531cf4000d79e449c106802000025c4c042400076a4bf036600132fa09f9b3169f04033511fb1e1dac4ddcd0a19da7c3020656f34405eec981e00d2f4c010069d29e094080c804227a98e90471eb666587885417b848213880f0502064011e5821d3d111653e3b4788bb029a3c3202e969019217ab4b00b9032a50054f0bf09c2064020000250627d123b0ce1c1eaa0e38f344f563c4531d34a41138d248b043a831a4c083201091443d7114854ab413222bb2c780f115ba0ba7860eba042032345ea960cf1da64a011105b850083201000014c22241200027e200092a44ac545ee0200062b25fe3b2fe05f9a483d65502022992d8a2fe3b88c40271867548029a7c96000115be92013060d804227886c4ac9a4501d8711e14380523a368e3c88b38d60e20803f265a410e5a95f80208224b62a0400010b164148042001448e088d2484920070eccf2012782d1045d9c57f48605f067498a5fb54cc81057f5ca2a080004b020111bd1d19001b00449200595345e1e40671ce78384111f63e3a29882029e05ca62a820000ed4e0100925f2eb38880014964056a0a00034a0ad600800774ebd206549002602c0000f61000387313c27eef8ca1c498b37071f69d7af12105eaa21d209218bf64b0477f4988104c919c1820000d5aba8001c008410007719b2870e1f0418df838f5bb4e7eca90826851830c1864047a078e782272421a8ca0000013c6803804f085302808007c2a9b310e48012014000076497e828000dac80045792fc0997d84cbe82713c740dcbdf558071f1b18cd299c2521196504c09a28090c1d6202930f8080c35362f0d3f3030c44fdda193eac2096d1cc89f1450a043b956578d5608461c9008600b8c04063c041dfca7d912d00a8a229e1901a811612409c09e0140190401006800078989e497642c0f214392204e9111a38f14ea57df2f0e305829d624d69088756d04fae0412a54f5de80888210a9291ffb16095ede6fec59eb2900054080c04063c041dfca7d912d00a8a451c38e3a229e1a811611e014064000401a0001de4448140005fe4be43734430efc609272cb8be1418fa85c20d1454274bc5140c193e141020f212cc045d5f08c40000d5aba8001c008510015d2a209a010c02418a2801286d7a8325398ab31c50725a8f4a060fcff7b460c2e906c2061c0bcc7cd5800000c4e159001f0140000d419a2181d7b249372a3af8a0c7a4b18c28a015b450606170fd746827e4d550200006c18f3800e004288013f9b8126805922c329450034eefa283352da1920e2858434cda818afeaf318c18850a598061d4877ab12c000008ca079200400300001b2200060e6484ede9e932c937d1890d0a05c23c21ab9db160a0d28550003ca6e41806c5cbd9c006402144997d09ace151102567f185388085d30e1c9363448a7ad015181e1266754f5b98509b5ebbb0b7e1047e9ab6b6363811067fb68422a0189d891ad32aaa92005208800020d25f00200036232402ed8190a658afe5c072c81621bb8c4116665aab131503bf4c908200a9a2c630225d3df52180008794b690003e028f209ae8b7c44c5a035a7cb8814a226bbb440420e0ad1384100a59f41a2822bb68978420a5968d5ee04100cf52a8950000089b20eb480110120000718c903156d0a65fa3efe131ec38f3090ceb4d6040107db3516094c70403012712f33800c8042a802fd5c63fc790c6050cb202a2a5a1305bc040abe58a515d1222a9f30fc9c50541111ae58841039ac5d6ec8027b4c4ac6802013952800b988a4801301c00007c080019811120500035f100109d22562a2f705000b9b12f61517a868008654d0c1fb32f141c4879d25059db2208a1173e2567003ffd089401440b780004c38340102f405179828254165e40a000167322a43f2bc28209384ca4842d5c468904692879080c09c3d72c06caf6dc5000a9acd89002158428005030360102f101166008478065960211c0196100800078c96510c114662080b2c805ea6eae06eee2e746f608d5b0148203a1a9bab800004b117c4b8e8de7b440e11638e3a41a219e12601e0171de0e02ff2f226dcf633abfb57cf435f08497fd6fc5fd7ca3f2d3801c21f065b2404c26958c20167338c8221a1268900c2930f18f08004d1c8b080d4402d30415710e89c1070021240653b) <<< 16000) + 0xec996b07a784c713a1afa424781d3900d57ab4e5806a40f8140126acc13820c804000049c80013f1d4dd5c0dddc5ce8dec11ab602904074353757000009622f8971d1bcf6881c23cb2c71c74834433c24c02906af8b353fed61200a0b168db0cbdcaa5b3c13a9cf95f786e7e34bebb843f0cf62780ecee955a95e0178549142c0a1d36bd4cd0e75f8e3f9f2ba19160dc9afe909067ec0de5a878bf5bd68a2189de8e8f98acebd10887841e206c5c45dbc9dd30061004c9ad938403fd8be85825da75ccfbe7c9093b802d363bece299c07a2956e6461a456910109418000034e2000b7e4bc0465de03920208ba3f7ccafa98c91020a6574dc655d3e66105aa6a050404a57e0411427293701feff550986360b9ab94ff2a908104552e72885c510f645822a3aa243a75752c9ee28d213a7004009449004375e36916062e3dec8233f73e0824398c7a7a62c20069c8cc304073763f4508003c6a2a0002da1c8ca4000f80a00005f4c8a29e7496f22871fab0074bc8f483a6706f854e110c227d8409ce4822781b398021108303a491c9b04169d466ac414b018f9d405ae2665f3008540880001e325dc139a219e17b4a200127faa692889caf2493ca1f3c0a084c20db260436173f01800065d453800e004269813fc399fd3402ac9580509120811c1baa4c40b15cc4e28a110a377824020a2684f075008200796a8d71c0000035c280400e863044da26c80128160000790ccb250629fc9308b1bd11262208cda5ca0284c44a09b33f5542072e30dca4820fee363983c10c7c7f05240000ff4970c2c0052ecb0b26d0904240280000ee19a20194aeaa18791310499248cfd706926591cac4937ceef54a085f6ea78a06010af48180006ad5d4000e0042690000fa050f84b454099368aaae9411dae45a2614c78d6f2c26bbe224485ab508b41040387660e00000640920036018000182332ddcae09839045721fddc44c432c410f9a9861f28b89e95080003f480180aea74d2f8300096c3ea9c58000007e900500053186af344904230240000e910004ec200146e4bb4345d8120010803e5d86dddde974409ee8858cbe6836c906a6cfff13e6f58e9b0c6bfb7c4e73403c28b33354cbe00dc60fff2ca4e76a15f3d8b7b746078eb87c9bb76714b49bc0981618d8a6905218b49958e06be8cd7a780ac260ccfd2ebc5e50c2bd0596e3000f9753344ea4f382cbc062ff8f0f96a87b0346277f1c507796e28cf87c89cfd1cd3c4db8a47be5be7a41ff485f63101e9b6070396bb5120ed67e19c832ba5bb32f57962a2789cebffae7de43a4c51b8947ac1df8337292dc0308f337079617a343d65d1c863673e9d7e5a78baf321b3cf73421541d858e513699b2285549615cd4846e7e0ae353d3317719bc6ac5c38f33cd041275b087331710cbf0843a959cdac59ac856c17b07841e21ecd7cbe25a28d98480a077871b95b6ec01878a0752e02daf7d934e15a451cdb4ca4f772edf30a701d77746b96903f52b2ba1b8c18152a70f6eb3dfcf509166cb1177c15105baf2db873f8387eac16c59f40affeb8c6f16e9f32045e1440001574f96aa442f0fbd42d630f92064ea0fb12f177f6216ffc9f7b6c4792218cbbe79d838f31bddc2c1255d3570942e57bc4b58b882e8a82a65cc58f2de6924f38102580785c748b8b3f55bbc3515db4cb84683d44f06a02b89cbdac442df6c6b131067409817eee2627f846af9cb4229267ab2e3112f313152ce60e19bd1fef319a20a7d84713b0c6441c0ee892fef53cff0b233141bb6e9da6a9a6ab5392c501cfdab3ddad7004ac184503b175c710f24b446137813bf7e52a829c8a7359218408f838450f2cd66de47ad50c1d18f8adcffbddc150d7ed1c52f15ea31ecae74920904be0b1fbbb582d4c53544950f0e6316c2e79ac8daebbfdd4750e145c2b31cdb3cc843c274d1886d40557d678bb64c732f3103f959eb00b98a1213145d9a8493b5ff1850012ffb447de3338f5e975789126db3b9462ba61630444627ea3ccd1014d3f6093b24725e6968ec677b9dfcede7d4fb39652a9e2d58b46e5da35c5969d8f9b361156ce0ef52981bf0e2f455db6ed2b23b8c5db8e72da4f68488422047b1be00018048006141806008020bac1400006e4ba8560400b0018193842e36df0c510922de0d3c395f296450080000c80382011682648040e94d0b08108e74714f0023c4cff3800000fa010890c1e01017480b5375703777173a37b046ad80a4101d12451453041034822423400800f14eee9c762dd67274e8ea40760e6d50266f2031483ebe316f750dc9021d8ee265e3c3c4811405e085a06dfcf3af00608131c4dc3f552b16b6e96d0f0d1d69c8b486577817f6ea21214b8716fec26693be222fea1c20fdd3bc12b907566a01f4c180d4f24c96341ad6274835540b786d0326cd08529e930bda3d84caa83830648e18ae2000003712000a424ba0445ce222e611000399110f19c074e9e1ee861c601ce24270ceb4195805392570f028c14000135cd9f9876cf500a18014d9b175c3f7a672710391908405eb87a7d3560701a515ebc77d1339f9498d000004d7367e61db3d400a00e68457585ae9500a10bb1733fdf87044b0c860a27a4218ee5fc3011927fe80f2036b36ad40f36a09a50468892822f28d370ecfa2cfe6a7dd9acd4121a1cdb43b4e12804111df53b3786d34086aebfb0c2cc816ec4f7c85e8e49870517609524f009324d8098224cd28bc92fa44b09d5d85de59b3891ec7dcdd79211e461fc7c268372e8c79cf0c2c94a50ee8c6ee2954798aa50)) <<< 16000) + 0xc56e74ca3737764a52025a13800011c4810048b94245c8122e305171028b181458a0a0900100041a1d4dd5c23168b65bc1cecbb0c738207435375703777173a37b046ad80a4101d23082041044033833011c19f9a8427dba1946b26cdf93c850a9c67a30c3d0a2423e30e13d7f93bf2c52e110436d2e1016a6eae118b45b2de0e765d8639c103a1a9bab8462d16cc93ded56a8e7ed00e90821c19a19819809c0100064f6fb7d8805155f00f1b46c27bc0e55fff02e87c3424e5bbf9f16cdcb863e0cd400096487900c3c00784188a8fd2f81bea81ff7702688fc96aa428e887eb91fc6e43cf45ec80438f902520f6caa25ae52a4dd75b5389f8d4eed37fe0e0be61b8480102a44074b9e18004c7f90f7dbcebee6b5cefbf6eb585018eb8e655a586768f08a4af490bfb02023d8cc15f3119c40d2089ae4d1f512c7502551bd5aec0ffeb07caf0d3f2dab160d1289bc1c541c3641ed5473fc6449218e8f3c3f8535efcd8bef63be45654929a65ffb301f557e91ae82391a0258676c864ded739f39629204781b00b8007a283452ee004745a6002fe9a233fe4fcbcac06344a982a4fdbae2c8b2ed864567af456d5c001ff879e48a9018bf3d7a25d159a1c2dbfea51b077367987d2798684032c1308f2df9c4aa2184a16c8eebb6f7179bb768543bee8984acdaf404d5b512e604f9f5866fe88141f84c7fd9754c21a64583eb8528a9dfb82c819404400003fd25be1a1340d00051910201d9618ae86aa83e22c3b430613c06b8f440405e4ff4104241c18008078808b78040001d24b082400214e411cc408c5a045210220c810c5400a93478c2024f612474c2420b1496cf507072ea91838139f33d98013c8d001003096e20024e38320102dd05c0e18ec7a8955deb39ac5934a71ef148b7e362c79093e0665d2958b4ff1b9e3e8124ab086bd9f56c6b42f7e049634caedb4d18952e43289380d1e1e34814bf1c61b6303e87d33534ae5dd565bf12720f40bf75d19e622bf7e5f71845a47e2e40085c95f2891b1ebad1577fc144cd6930a760f9bd8d0e6d29e69944aaac7a16e2350506409bb013afc2b51136a2f98cb08bdb88373539c6258781188799b234c498b4390452d04a92126fde70904a14db94001f1b2904007d7a98981064021c5b0e03b033a8147b7affb4b8e39ae89e2d82b0a16cd40875262800063dda050a3593abc0b1424326103c4a208377fe5946ac08a3fc7190754e900260347177374ca0264b2c51546461a205305b7622332852d0d0619d8808439ee43990a117bce0eab2882364e8a4e8a58108cc8da63e880656f2de39a27d4801381e00007e4800201128001f1a4e0fa45831e4358a61dceebbd100bbb74e1800fca1094006402164416aab526c48e2e893a8404a5902948612b6c4c96141529470e914a14c878642174901065079d34400a1131cc053bee8412c2862351839108e3534f309a3b76f4801602600008acc4d2284a14c55441ec583804bd7442add0a34405601609400600216442dc70d58444e2e4ad20934a5102945b8194f129614237f7e01664a14b38013a19fd0104c0e5642ee0a120f48fdeeab8411d11c758a159108ab226f91a1bb76f4801602600008ac80018e12dc090003361000bba25b61b2da09e8e01a836d11a781376a028e8f7b04030d908c270222760384000a2f0c804c2036010e351fc6d0493328bd64c5853c10a61a174bb11008415c018021f264980064021c5bd3abb00af5028c1f2fdf1a650a751c6bc46644415017b84249c207676dda359008177677e8d828443a0d8b764082f5440ad77d2c008d4e8907af8a1a400a4100000418415c07e70e38aa6a2584e1eae2e303b9fb5a8301639a424283281f8aa0c21a08ca400208dd54e0038010f334b4ac8b0708969f899cd3c02c672d567eb281e2dcc27b2a74110cb1768bcc4c58731428205371834896201691861e6182bb4969700bd619eb6e1f2c0900290440001069c04063c041dfca7d912d00aa79185bc93b816479c896a0eb88a0888678290180001006f999f76c02ef4225a67c11bc80058cea198929081e2dd48db379e0886647784c351161d90939d8b7a30681250208e0861bb449814d3cb80631f88ae287cb012005409000021720006964001b1cea7232000000da88171125940604c2ce20e1d110f09104b009010c060080340003d480059692d91516c028003214800ec8181dad983dd436be1b2d065cc1235e7a01e5e1fd34f06d0c1420bbacf35f5f307268c4dc5d8b7c158500fbb969bd78aa2c11ce235ccc1f5846074e3e68240afdee8e4b710e504778102300c3daa792d6380c9748cf17efbb6cd5bcc3098a28d0b00347850a5d35ca256f387cb17af20dc5755aac7d6167b00120a5db9be17329adba9ebe6fb7aa574ace3af777b2fee3b88c62218d68a3f713c0a19aff538abd6faa2451cb326801002cb5c14000abe7087d268f96e06439e845141975bf91cbc88fca99a0206f9c462e5ba4cd532ac200c0cc8e5f5e3745094dc382b1fec0c7db7feeb5ce1c04069036630a58b69034681185414464270a8c05820fa55ed0898d2156acb7834a1b56b9b1c31283105ac02f88bae18aa40b340a08d5463bfbb0a7a11054892051110d00ce0d108c002000c0600803701018f01077f29f644b402a9e4616f24ee0591841831620a22211012200800180c0100680008f900025825aa2a14511091088b50345a6120005ea3434a905ba6866b8e8e1218b56e6a603144b138a01dc6d952800d0040b48065a203b1ce8283a2c53574768e13b0218b283)) <<< 16000) + 0x13bf734d0925f4b22c005b5a481008ca76a9c006802058803b1507614a28329ef66040c167ebe3425135ac420aa1827c40124ed0d07018735dd0c02830810a010680200002a64000ab8968068b3c3659c1a2cd0d05f868b3034596122c20500023d12ca219648ecb20174202a166acd20610dcd275bdb02870bf5ff04800c37b7a46bcf416084dc9d0f8aca0404e52079e820202d52748733402e3d623ff220068ba2f136ab91018520782c701694b138900131942a45c7c0485c401d0d4dd5c0dddc5ce8dec11ab6029040749114f14810410b0c508c00227e0a189bab188b5834351fb85166576d45720f4a57cedefde9c8bb1d286b86418dd7cff6f9cc32d0fa9403560c93178b73208e5a48eab220481fd8643060a60cd964934264fe00bde1ca1f088fa12ce56df525143e2131849fc624a067ffb31a961c98079d4888e2308ee29c888555ed0f0801e66a246a80739697069659b63f9f33a76a11fd9c24468d631014533f092a2d9156778a78eff6183011fdd62d7aaef45c6616a229227a1bb747d632f405f594374bc2ca3602eceb9d903320b000009da4001dc488788f8ee4c489b880ae92764e3a2de50800622352a4781611d003cc850c19c7dc942c42b7b171ee8f2000049b9fa3f026520192ac1638040fa4bf38fa3c48b46e9c5c68000007df10ea1524af49fa001954310185338cae80687246b785e67871396b86085b0fc60a1fed16df8402579617a22ee94619b3c107f153fbfdf445160e2f1d0183d4ad10576d3d2a429657324369094b1ca10a1ce72d2081e1d726c7cbdf6c156a33376226d83f87ed044023e64585d23a2b9558850d058b39301332e18b5bfffb16b675a0ce35eab72eb3dd557b797075a72263e62a17ada239287b0ceb2b9c46cc929ab02e1ddd021a7fca9022cc9c00008dc40803458c0a2c5050003f79e3aed81961628a232473846ca7bde387f7c7968f0014463f1a007044d72c00828f6c4e08360102c401d8a6452fa1c26e8dbca3861ecfc882010874da12040d00400002f481006cb0c3762251d970a5fab272da393687802d656c122ba5afa017e9ce1e05f6c0c06afd7b452844a5cf7cbc074327b7e5b43a1b8bcfd1177d6ed4755ec8cbe1967a733531b9926d0c94b88e4831a94fae39b973de87a3c92e0f7bd0242ec91e9aaefd520c980f0853157c4521c2b04e2d71086c98203c4040007404b0814000c36411c8408c3a2c11d0228c8110540862210409000c47119f35160148012060e8a74c996c07ca2ae07964061097fe770c5873454da8e4020811404bede1c2b2a270e090409d9d112b5077ba7c1035a8295dd50e16251f7e94034cb06016343822a972c10014641394b69326dc33e88080064f831f10a1258a00ede156174331338e509c1a081757b0480098cf0b660b7d4856be0758080c78083bf94fb225a0157426bad739102cc810510b087042040000048ca42eaed3a9a8d17ccacfda0b30ce8c6932a99aaf62955e0b551fb71e16310410db4a7c145500a0002a8257e3b2be19e141a48e364c024409781ee061082444a30b4da030c505c90cb004820ea79e9e0110126a28e26591e000ee662705cc0046b961ea0c2000afdfccd8aa3e2400a40e057a02d3773e7d2143120570d3444853ee030710bc268e045b229b12820d804000039883202caf017a6c42218c8688015440b88200e9c49078000004b01a013dc794860000004b024c103c010a00c03234002765e38881060021606dde2c40050011a44c9c0b0800b004000010c80004f100012420401a0002753819d027a6a9127a27cd68b93ddf5cd39891aef69c77c6358e730c850a036dc4e52ec553ef92f265e8978cd6c60a2949d2d21a465f748680185e977ab3b1a5ac1238dddef65f9ff5576877f9891b482ca5a0241c3e170f8ef22eb9a1fe949a5876ed07fd07855cab1f2b08f1049526e501e6b322d6982f23817bef977ded420432050c3334b31203eaab000117e1e8482058011405269e91041400440100401000004440001fc800081129f050002b11281191188a8aec54500221520d05c868a98240017d44ae8b4572420291905f8a87e80400250c4a601721b0d01c5818235465e38383f03bf9005043ca1eea880894ff86f0817f9e4038300d28c4f0044436ed95400436bc1a0f766431187281f0146081a2b6d607e334e8a0c282e8c2604153fe3307050d019f7a567b61b81410ed1ac0efd09937fc4040fd4a7f7e20e11470810bfa08094558abcc0b001aac0b372606bde608012c1e8cf966ede9d8440042d49489eb56905a4f34ac4f6120a1082600006144a5cb452c522b82514a1080ac745263a2921909b8a8064345621a0005b92172430b815c12e672e286538a764fc41c211d5e509b2af6da957840b02718a54aea44c6b360411d9002950298efc8094d000001ff8fd8405187502c01c74f05a39adef367e8a00b27d6052d980ec11e200100bd91e9074fd8321d8836910cd3a91fb942505e384930cb0412fb7abb228b5d0d4be829efaa3ef5a87416a303a3066a1f0d4717a1052031a797ce19fb77f1fd1549a811620ba4923944f685543fcc467cfa00ec0c0064304a3d6c8e3bb2cf6c66f0f71fd86bac9c7ee984930b130965936e0e808545341bc2622f437f10097ce0d62436e14f2b42ff71f5e7a9a5458143510e7c1c00a7c0453c022b701000225901d0dd064f14c0846040000a8c05026243a974482048b7a263021dcab5ec1832348fd80500b85f3b640020772bb8b40de04905012730200140000d810b821e19ba584b230)) <<< 16000) + 0x57d4e4898411cd5e8a0e0000012c06009ee3ca42c000004b024c103a010c38fc7b489001dd87d22041a00840000401026802000037200017e6008020088000080203440400006e4a7c04000112407417a6c5f0966868c563f7b386188b06b3078000004b01a013dc794860000004b013020f004243e15492104140080000219d37db4754b96aacd198fff46ef662cf04116737ba15f0f0000011e1a3000d012f0ee99ae200c0000011e1a3000f42406043005068dea50b21e1045ef6a7824db1b69a0bf0e5ca0801afe2e12820d004000038480014c9b1268897d4d0f61ea04e31fc729d4c4a4a8ccb24cb6d5dff68281090245bbd31293d37202eba6a735a3290ca1c8ab9a5bf4d070406d7f62f103afa8818f134b121cb88b5e102ca389021224200009c73826430330e8da01bf87b4e87c5ee3b07d59536ae5001298f0c6f3271578e230f840fcf92509fceadc02f7f5deee01e5a84707e45796144b97c5807a12233a8e98b08117c51829f0500026092b61100049112b51915a0c8acc643382a2b21107b888a6c2453412000c93253003d4dd5c000012c28dec11a950eade0757f9be1b60eda01419f3841521c21822011012401400c00004601e3e7a13f2a141d39f07c5dc7805809009cc09cd14380cf0139faee68ec2fd2900900c848ac4140004fe4a81045607a2af31026148a3c9426e122ae05000ca812ad5df949d4108cc2848a501943bc6901d1c592214126846a6006cd00e8481b98001bb6e90109c606c021a9bab8462d16cb7839d97618e7040eb01018f01077f29f644b402be259bee241ee241e259a0a40990c0e44cee63c3b923d795f24ce4784be0a772067874df862879450e38a1845000742067004ec1d7ed4444744eb19d4dc38b8b3f20c6ca938e603d68e3ea2f6c8e0a0c59d48ded158e65744e471437b5218e11439fc544e7d86f3657fb6f28c7e9cb400113cf122122bbc91a79669112285b32f2184204935a602a3f10c4b064db2d010080f64291404d093da02050383601000016720a02bd29627120026328548b8f8090b8803a855b33cab160591a41028e29020e0860880001fac34827ed92ce7e1944d057618653d180cbd03aae30b42452ac09155848a7c1400042e4aa817a52c4e24004c650a9171f01217100750ab6679562c0b23072041c41441c31022413000040c10008034a9c145520a2a5010000c310291de909ed9ff120db5bc79f93c5902e45372fa54c7119691e2562860d57be70de5228a4e3b9b0e101471e26e3fceb7e6f854c184542759ec3eabaad0895c384095a513c63728dc4e525d42501c871cba4e31b3e34b175f802011eb11ed038dc23aa654b414993db84c90008a728560f4690a89c4390eb313dba84aa57abbcb3b6378a0324a860a190fb9a38e2da6ed93a5e134fee1e643081984c840b10579204a0d727bb7934355c2d133a2cf5e74ce038a04e48ca5bf4641ee39b2f4608844b948e42a0978384054a3e8c0152b0eb951c049193804b6604c9c54000808bddff976f60a23cdfb08e8f7749235e15b38bc1e69a03be6969add3e2b48fb1272beef4c2905010c0a7c145500a0004db383d58747a389e6a5108c208a230020466b7ed80204840340102a705153028a940400021042fc540013444a90b60565329805d8c7d570eff0c19e0395c0c3046836c15714098d1503c83835ac1c15708084b5807ac4002b842c1b001db794b9005507e61042d1abe3108e3044040966d2434c89185aee0ad6a93d63c8d0784b1860c808708608a0470440402859b4fd82f8c9f21fe1b10a2a5d6ff5c68f9030a21e50001a0252e3a2961d1518e8a50645262a2921109b868a8834032122a10900023412a04585422c2e47617023815548b7f8b1207652605105959b9c4128c3aaa0804086c964c000b8748ca009f7c0240004427301c0086901b77f6683ba4a309c721e1585d80a6ed41102b14b7fec1a805100b156c945d44161f392c589acc4517908d37c424fa6f22d250b84cc90101011dc4b22fc53d46242a36ba927ddc3c34040215ab8800e40f3516cc2f3bcc47803822d08200250a9621865df52d04fa34505822873a9d2142fb67a5fe684c8e424c41dd3a34a511438029f0514f02800111494e86f48008bd056e2af70503bc268c815a7ff5034a24995f3ea87ea1430b8d73fd12143838e3a825840a489b12e8b27e729a65c08d2c1890f36446ec78def1301ca0a002b8f83993cd05aeaf167221c0079ee8bee140f5b56444bb80011238657caef39ad513ed04f60a3aac455b246ae0e7305a100690416842b1d81ee51626c45ce5bd1dd08154e735fd6ec0cf19c66fbab318cd880e10a44218d63c5760ce8f83df5f247e92c1cf717f2e88e2cc5114558d410dfd0800083369800bcfe15d163788ad9c17e7ea214d9fd5148099f97a477acd81e51b009085189d35e8dbf4b9f2c04b6fc9a961f622867b5ab817e1f4b52183b8ba000101494e188001f40d8c21d4f463068b3871048574668464004a8c27c0002248583801019d0914d828a68145320a00012b20564b29801e81106981ca01738c9ff2fdd814c817ff19d0812c245d7635278000000000000019cb971a3cb971a44c17ff54c17ff4838658c30628450238230206d5a58a6a7d922997a323aaaeb2c87a9fb660dd2d3d79f4cec06766ebbfbd1c4d7fed573e5e12ffad94e2dddf250656c3988575b1a325947860c8ab7d9c5089a0ab40704fb46b1c6045d124d4a004b6f69c400632c7040409c707002000028e4a5c8452c322951914a0a8a4c4452422137)) <<< 16000) + 0x11148868a40340321a0005a720985228f25147028005488814a68a350451822002f8b2110338132181c899dcc7877247af2be499c8f097c14ee40cf0e9bf0c44708408204700600400100010af64163e396f929a6960de5330cca0a422028bf65cb69bd39a9e9b01c804cd75b91ad60440c3a54a64649bf0af4373b4ecc1dc1fc66a0005c6702308868c36c1012f19f0d4d30608578f6975b86002605c11bc428129139ebfac1000ca1a295c200022a82817016ebe1a55056ccdffcd4800ef53b7b280660ace85206800021e2516db28a51063128220965124b28809943828a18050324718d2d50c151f6a4e3b0a10f69a4350100049a668900e039eeeca8a8a017d74fad50020a2a2515f81c302ae765c8294049c1b9e976832c120102278dabbfb4c044e12d73450967980e2819fbd0e2c9da86b8d31a480000c256024901837c499860a408ac40744f033f34784e51f420109c0b113cacbc6fa271dfa7eb3cbb8cb09a716f93ad80b017433118e0021f72126041b008000087189e2473cd4a44e09de5e269e6036c738a4e2c68d15c2a69200001f1824900ee934c18289b8bcc68f02117973c348002101444f2e6103689c5d1a724f2f77df931c5b39dc340411666708580ae6e9fa6001b008000086106505000164901c0980d84e070a0a039c103433db6efc7160ae1690934a13907b29184000007c6082003ef8d705881fcc36883808b032b7f8520208405103858b81ca06a2cb70438adc33e8a694c987a3ca0159a4c50c00611d7e098206c0200002204a1434508020002e6384a2c2a6bc186114ebeca3ef16409cb97f01440c0f3e596dc8a204cc2f931848483bda4722020974b849880700216a3dc01120031409a852001202460980b00003f06c8a54b710d0163eb59486ea0a1c91af05ac038a0d7e8363e1430676cc2cd8818551068c2c804b3edfcc64680287ab14aa0003d67a362a00017448e1281400007c09418cc6b45784d5d84a121a4000029fa1845ad9b4bc1640ef790780c10c2fb5320810b97da34041122f209d0600272560382001afaaec04a4208005184d3a6d7c1348000053f4611742c9c34b2077bc83c0c10ab968fc1021ff57dac1043a1d885810434a2b798000c160d58099081f0100000d512820dd9117e2d620258fd0742147e50e21fc4467838a040dfe31818677b90570828200efa42600831c639c5b06800c294bad80003ed6f9f48812c910240240000f01281151188a8a00442a4120b9090002f9127f0987180e46603942a6922d9517382c8145d20813028600002b882010b404ad8020b26cf88e030070cdc8201004e91111804005ed179c020229c92c2101402a8289f8140003f24914d647e13b2407775aaf9428b1c4e5e424591fa32ad640a42484f6d8b0488a1f1470c005f80d8660100c14da56d0a1b2b61e6a10d113cfbd666382301c50a310a491f122ccf1f5d4440a3049efee0c201433e4f85824030bb950600132f94c810043fed96200822a0555adad7061ed6de168e70440300001c720084b0003bc21ae7b0880d83d06c35007aeb8572e79ea6e3e9910853102111c41c31830c1100080004045718e60fa8667c13c1449d50fd12fe3de00a18520b14ca87611d00019d200373a49f5264f85bb20850a598091b2651b5cca1400017520a13f29c16e8913809c8d0c30848b8e1bc904fec4bfdd28e1040028a2259f37e430c27770d8285acb4ff21421b693df491208815e2380130552204006a1f7cace103a010000144208813ed318e4c9c56e8bbe5452cbc4d74740447a8bb6a000000000000003611452442432031c22411801254cd89005debab4d74463a2fb97853d12b2cc77b40bea550ad2e047f52f75c42106ea0004a649ec564f42b2790193c00f4b569a7d521a50850a5980a284c2e788c60e101106812c755a0838498340ca8b200b189724754e4081010a9391a4041080a34b76ae8661853b3b04e482029be5a860f25b1cbf30632d198f16367ad095ca04400d2e84802b1200c1a020740200002da49dc17ad04e7a42460372228a67a94717315909e89100000000000001909648e3963143142922020031bd1d2b880b80340005acebae15cb9e7a9b8fa644214c40844d2cd28a28c1cb1cc18b18205c020080374b862d8e498535f6a9e0c1dccee9e458e3af34593064d63adb1635bf21a84a04430cc2848026aa32968041d0080000b5927705eb4139e909180dc88a299ea51c5cc56427a244000000000000064259238e58c50c58a50a48831bd1d2b860b80340005a493b0880010a493b0af5d70ae5cf3d4dc7d32210a62042261461249258c50c58a50a386380801006e14f011fe32c97f45e910e38187d3e0b1a65183b658a3ba5c5a285dd3b1b3120883dd20480059a812e34040e80400005b493a82f5a09cf4848c06e44514cf528e2e62b213d12200000000000003212881862852452842442030637a3a5710170068000b592741513980800111081488c0036008100ca8893a076b0f28714c99dfc0244350031f78204501ddfc2924340af610db2034c4ec3ac414211aaa7e385c870824020510e9c901124730e9cc192247095940811137d6164072421d9d18002124f88200500d7c967081d0080000a2115209e98c1dff4e112f33d8f8882e61dba831d99d93c00000000000000d0481881461480c70c808708500430200200d00016724e42a2711513804c9bc0417e0226e01000277926d311361489ac844d432269191340c899c44268220f109133048994244c80226301000cae926265930acc9813)) <<< 16000) + 0x64be8325e3d92e9cc970b61105307a1d92d8cc968574ee40cf0e9bff926723c25f04c7877247af2a04c8607226761888c20a20819000e00a00400021510fc1380cb0244d596515edc98f3ac8441054e33a5f4ca42086b12fa9fa3c1d23eb372008801874a94c8c937e15e86e769d983c43f8cd43c405a083631a1506e18816d2087b865e09dc20947044e140c87722a309fd9a5f171c55124192064faa09dab10082fca9727813fcbd7a4d0d50cfe6ea950efed81020e927ab64e542deb59b106108301abc76660806f8a91cefa6128c997a6444af6fe796aa62e15afd95c10726c81d70b19b6ddd4db4206083caa68b88591529998a25e933078398954b606a319405072708304b22b24b11e8226c27857fb39fde3b1fb9fa2656eb378082194441c6640857a983633676dd1d1540480143d79801e1db59ade529543bcfb05921806ce9805f81c5d84a240e389b664475400016d9bb7117e5474d89fc842dc1a2c34bc02ba706c2e6710e0728644c7c3c729507020981274e723ac126b6a98d8cf6b2109dc5d8bc10fe44f4441fc7bba66dca490033000045324b03325709c4e080e31ca709b8fd97c0aaeadf440623a2e82db6620d196cf9d2082afc8effbf20908432380aa0d626aacfc1db05ce3d98fefca8319a85ca7c271b85e922e976ae6692e4b6f49e650700dda835a3f46f6453f227c023b69f243be59dde8d43f3dcc91034758d84b61225689fc8c903e745f17d8ceed6838710bf574424213a1eb58cb24859fc726ad9b7a04513e2091c4104020040100000444958264aa13f0473500840ca0e9b220417008516fc8d043c11950174e002dad6d26083400800009330000100478166b6b0800a0040000104d169201f416180e71683800cd8f3246083601000009720002604950343ce0200028c24a623e2d9a33f0d079494ed00101f7e08c10600204540b8000080228b8a76864800d19ea14006a15e6300190080000479827bc0cfc7ba2325c5b081e22dc82a1a95c0fff877a4fc40b04d17a5813b0b6f0c90903dd7779ae633040203ffee6ce25ffc11d72b92c65ef8021bb0ed20755f55197318b14dc4ad0064335b39cb5bafb839681a010473d51ab98e6a35454ee9976a67a2867e28756fea36f1be48bacfc97cbdb46cfbd67d90d723ae6804f1ab9fb6d949830be2145547c8f71ba4c01d8ee5d948866b6ff4a68caf291c422aa5b27da3cf2dd9489bcbb43628b2ea46e0bf25391017f339834d4391c3ae63a3b2fb4cfb3f3a0b51d2047d8305424a400033a900075c24a41a03b0d128808940040010de74a25375b082b94bee2401a63e2230418008401004010000044493c2449c1200405126808930044900200014a24962324a05e44214c479ea6e3eebae15cb8000000001089849249408c08808209000406c4cddd809e0406c06a49203d2962709001319b0b660b75d7a9fd03c1a9bab8462d16cb7839d97618e7040e8d29627120026328548b8f8090b8803a44bb0932110c0cef115997f32b87e3d79f5e53a584000000000000001c21a50e1041120060166d26e9b93a77cad858e059205a8d25e58ae4c3817e5682b98e62c666a462667fe259d11e238825c34c8e3e2d3995771a109c8b896d78adaa99eacba9a5e1a314341cf4ba52c4e24004c650a9171f0121710074d2962724004c661522e3f047b4a81c289e7756c718da6dceed77ed8a39cbb9eed2cd82a6000000000000000e10ab6679562c0b434a1c50823c0140291927a3ac6f5607b834068678b23d1165ee6f1ecf69ee1262944af2b88e592fe1cbfc35acd8fbc3ee9a526fb05e3cfd8cdbd15b695af2867119b40010ac9240280024888238c81186408a2a0440d021868002bd4800e7012470d87180e469d71fa54e18517ae42c1620142a002552141050ad342e0c121b7c71a62c0e7915d66210018db207e40802e3e3237c00009f3b8a0844036644f96103a90784804800020e248c7b2453d8281cc910d6008522432592110c904764802323f0991f04c8f4164780381cb4b0f22ad3d927eeb2041ed4e4bc819137da752086f2a012a4c2ec70b83c233382ae401650622f8d09920fba55d03d132c83000b9e1f69723224c9708028e65dd7162d145fce007eb9fba009af0ef0681e32679fba2c5ace86827f067c337e8e488c16881d47f971050f624fc3e37926080f7dc0070fef9454305d32044974846910e1b9f0a921fa412b395b23287df2196a6d24d0ae47b543f963ac58c6f65c3034d4b6be12f99dfe9ca7601006d29abf4e81f041991cd80000f6d379e120d5f2b8e00920a0dab710812380c07a1f14a9614955de32bd9c91543d000077e74a589c90013198548b8fc11ed2a070511c718b14715104c04e0090000373e8d97bc36eac0a8ba3c27d2b567fd1ce35c828530ee8000cf92221991084e899c3640d11b593bdd2861947038a054434e2340171deb000043231200984068021654470e4ee121d4e121d967841b26d2e92c2466148cd8810e2e0d7cc10408f1103080030fcb1203c003c4f6a064400108102ca8db7b5d21d290d752c7213ed14f085e6e992c260336ea5001a00800006f923b0501002c8c004000590415c364741ba272d2c8c70ca61899286014a350e0b94afb8605d12fce401bbd1ba00984064021a9bab8462d16cb7839d97618e7040ea131692b476264788c171e2306034459459078e206384a80800780060300401b642c30480b1dcb2bc2586552ec51c2c109d9812060c80400002ec800127122f1502d028000e6882a88e4886e021246cb3fc6345ac2)) <<< 16000) + 0x960181389b9d1417c38a44c02e214d38097a39f009c40600212323b407cd1512fd5648ae763a72019c5709804820320100000bd24722a2380111b8088d8040004a248d417a52c4e480098cc2a45c7e08f695038238c38a28218270048030000000093869a0c4564546f5ab5a838394e820aef20913438a4680a233010000df1219190006299f0431dc9f869042cf2655c334f4ea768c94e03b7a019522dc55b3f89d9ea6036f924d0916166da75b5ef041bdfe3247234f8f813b6c8366537dc5d2728123fb86edd88f379577068549e531c0c5050ac7daa9c350fe62adbf4140804d982bd9d7d7ce00ecfe3ada8430f55f02356ef3a98e4c81e48cc284fc00014a3167ea3bcd702111fbe71fd6788ae42479e011635feb76216343f90225b0bbc30d09c9f4675c41e7121e65d29a204a5449bf77f078872405a2241c34fe473f4297f44c79ca6236b541b569c5c1dfad530d7e90b394cc04640b2180181000c001b3891898e06111bf949e9877f0392f9f73c223e1a8cf797181217758a01821ec68f72ffe496eba4d79b38118ffe5d230ce6001aac4233c092d586d03ef6029a2528513802b48477027f826616b5a3d1800e02fdac17bc0a417a8c73009abbd67e2a239201f253160b9a2041b511db6147185810040dfadebd3c235007e9c0b0e3a345012fa298012080c80401b004460020000e720ae2b9045aa2f47061a0730e00f91060008c5060021e2645eb11c3bba370a804c2f70e00aea800048202e010f12c9ed40e218510a1c39baea2011880b80400002488000b1122f1902d0280008f8e81a43b384ecb5fc7f7fad4de8800e4b971a3cb971a44c17ff54c17ff4838478e104602480280180080014b78819ea8cc9195b7eedc6f2e7ca4f68281ee70a8a9f8bd653f0adba267147f1b29170088b4044580222b0100015a101915cc088da18cc8b260d282d10e42620aba7e41804269a6f6133ce9e1a27e7f41d1f14ae27de7fd27007547e7a4bb8accdd07ddf4bb4cd38a715a78bfd929dc4f5029e4005f4e4b73e13789e2c674d00af9d4dd2d64bc362027db59a47078a670cbb186c05074bc998d3e946d708bff686a0ab0f60082a3c32202c124b8b1ea3a7b7ea02bdffe91d54cf67de7cdae0d8f99f524ba2f9dea4830623167d862489071dc9eb6be8f921adafa6c507d4d4508d2516a03c11a060c5eec5241c62a4e888806008022204aa62b30025b10e044182e01000006e24540a0000c03018189d58b18069954606acf1942308180084061fc1a12c605fc862016a3d481819880a82c01d884009420600200001b440ec244520a134010000e312281d113828898144340a00090b3c59f1837e5921741a01a19129d90184aa44339804aadf14400426bab8005b4541c00024e483401022501029008890040002f8488c640400284c5a4ad1d8991e2305c788c180d361e153bb71015c59e6f302be259bee241ee241e259a0a53b9033c3a6ffe499c8f097c131e1dc91ebca8132181c899d8628590286882600580001bfb9e9ed31cc162de7eed59d25d7a39bbf81b16806695458bab98258dc2006e908a8633459ede54e904b8c554c6a62cbdbcbfdae60cd32d9d0cfc46651cfb392d9023655fe8df2ee856e87b30c9d3c11230975516bcf93fbb2618cfe8f2d0a1a1a3764814819178043a842e6189d30a7aed41db5ee7e9c8b271a924ee88317af54286ac32fb03dcb06980186d4284e59b8b93dceeef84193d07c60c0806fcdbd9320fe04c6d78dc7342c8048510757c33ae10ee26544b2f39c00051f75f779e683b93705ea0f46bbeac74741087fc8e862f6c41b499ee35c33a1eda3f479f65766e74c0f8464b47fb7ac29e097b9fbef6c839cc6600005a724442b22105d041f489954def84e38ce9edaed978d805ca72100a147627a1dee1542ea651a2962222d1aaff162607008474019a520832464ee6b4d267a11a1a260001602f962838eabf10d5bef76ba07a0e06bd22f5401806cd19d6da4c7f4c7378c1156b8ef55c840f10000047846f4e13ce4b0c0bb576f0458c9a8a0fe6d964144aadfedd0e4dfa5c4acaac48a0518961f41100ac87c07a9bab8462d16cb7839d97618e7040ecb971a3cb971a44c17ff54c17ff4838469470c3883047022026003800181001006f8e42f457205c628530e289d52e0f08802f1ea006df0dd0942064021029899188e2f327c41e100c5570a103f36b0411d848404a10300100000d9243c020001e73c32eb7da183675aed1437b67d71416f824a3800c10d7140a4c61209820600202680221d0110e0080004ec90d8c886814000a0848645400138c4810a40f44b0032190c02c00519880149d90551d90b8ae063fb5229dadd3bdc6277d91973ff1c6100fcf007109a051bca64bbb6ae9c1781c18258e37466f48166eb5969512ab74b9314dd0f7e364b8c27474415e56d81a902526817143c86aab0563167eb0429d91dd11ed50d5c297ab1c4759527a45445f41d6e05002b29f4930926112d3dc29aaae45fcb1bde641c6d208e4ba681cd26a5da4657ee000d32c6de2f942da8c53734b3d92d06cef561c885a6d482c0e2912fb8eb067aeb00697c21ee1042147f297b47bdb2ffef86dcebccdba031777e55b812f7dc84a007302161590a80e010020082140187800e01002008c02824d1084205802000008e6018020080000222000182602802008000022242632212111088688403441e120001ce3c058e5f1101a901901558d6b6512bd74fb80b50a37959e106c5b6da4f2cec35318e1e7b200464b20ec8b4b7d3e27055)) <<< 16000) + 0xd1300109f7b6fc51e06f48ee986fa60b32e6cf286331ecb75cc79ccbb0bf1bec01255539725a7770743b304de42b33764acffb2822ba0ab3bd1cb97ef14a7138f57705136b823ddd58b9c385829088e7b827ccbe440ba4c030465d74753fbe6f7684b60168041c020004bd21105220d21484563ce8a00a4de2ce683934b66160a3380045029804be000128e0d0043a135d6b9c8817036656ca18448151b9ff20a91e11210811a0940920080000496dbc904f1e2248985a5d46777fba679d0b32ee38ac2150001b224183bc15c967dc1070505c0a0174f304503b93b54100b3fa38025101800868c1ce7869054d6c641053b876c50042c61a381801d884a0830010c20f05bc520807bebe6840e0f89082c4739512020c80400002d8905828208040003a4426c57019836108038a44644082a010a1d0a3083024381e44082a010000064241402209010eb0083c40400027047d4743e40a00045c228a4a0b01986306c7a416410030007af24004a0b8050fe8080055909039ec0acd63d40b9183975e70a29623ba7edd9961dcfa01f00797832b043b3103f06ff8353e3e164025ce860025d1f29568b43307240f8a00086f45da8c31239038a79201ec91e2c8839aca50425f0006f7efc31ce312d7d2a09285bc334e6dcd00da4dddc8012d9f5bcb0bc7f45d943d429592a295a0020c60a61d0a180508d6019c4fc27863b8b22593820b92c3bb31ae2ca13b748e18a405df46c72ea040efb24b648086d8478405fc82f8d360ae30284704a5f3cc934000d13aeaab9457880638c4c9cd3a3120055f3a66a3961c84008185400057e4814a762b0705140245228892bc504e6c2eaf8b059aa443410099a86e3c380c4bee0b03800555315c6000a853c88a01aced072000500089167825549c0f80c000078c82a8efc31de512f38351ba0ef103b86ea813002cc84590024141c00803d08800c45e48194ced24681414b238d01de4708c106c021e48a6609c70d0c934d8c091839ee9000abcb814001f190238003d4bc96041a0040000831e2008ace62236a7d6ba34592e718c4800c292e424081b0080000609d034876709d96bf8feff5a9bd1001c602031e020efe53ec8968057bfbb0a7a111aa8c1a0504158f118323c460b5a3b131098b490690d1cc10510c008003a5c944e47c8bb8f063e95ea7581fc81a9fcf233fbe3b022eb151525d517040e3411f828048b69905bd715060f7b24f5a86649694000e2890208880c26016130006792404338432612c10cae4b4e3e57c71a066274d4d6522406a45beedd82518c66d22827937b00000000000000003793caab6927028cb14a083087005000235778348abbd1e9e25ef79fc2bb04fc03c1b9c4305ca8743a029de4b66a02cdb85f644c51bd1d155b834e2860bbafb5febe08738eb649474c598a752b61848892d266ccad0a36c42926215b40010b885f108804644002a1ff110ff0487f4140018ca478d1414e8204c250f09282e484170320015a423f8bb1fb358ae94c7e877a0690ece13b2d7f1fdfeb537a20038ff04e2de91d65ad5ab4300ab45e8fd03d61da4c458309c45ee9a126e3640370000000000000069a27f9c1d954aadbd9efc6f1a00878ae53b98b8000000000000001a60f748c30a6816a4884086004800014efb1538018fc6cd1886f536ccdad0568e356d108a8d8648cdb3dc4790c5e4f5a0512c8df2661d8b1cc810d26f405e7187432b0cd68722a9e6f501fa71232eef2c4ef154534e9cafcfbebeeb5d5fc093a48a18a6a6b644ea62133825b5cdd1c243266d00008c80600203f2121f8050f90287dc140001e247bc3700d1ac5053ff3d99c12d88a7e347e729d95ad05bac3431d5e021ab2165fce090e03b8101c28ab7d1eb132d4f6609a6600c0338cafbdfc19f512dcd8f592bb535b48ae7be0393c037e9b047cff95e7e995ccfae2abe9cd665e2f3af3f675b1201b52513d4172b68c92d3c745b0e2f9b2103b83b500b2dfc905230057a27f491ca801a1f33185f18cbd28139a9cbe0022e4c2d902e52d30bbaaa15ac6f2239b3949e8b49c3a18290c9bf393e0b30364ef28f99872647489b9280404656e7c14c49168264df0aa33f39d996cae3b2d6313b3b92d1ba64c3a84b2d653449b6a14d8cbee45cca64642adb7196b72ac24176ea667a7574a478f4598ee1b8a725e557f7e9f645383f0f88bdc7c934f29d78ff4efafc2943107cc15abe3475d53016c3926201171a9a832f50d60fe953b63d53db5bfb12127fbab2d65f7aaf1a784aa307dd3786f2204e8e500f2bc8a45916fdf51fb7f935b002bbf890c28b453bc00014592857766733804d0c3b151975a2702d7621eac224e7a36bc87aa412e4ccda4438fa2e773a46252261427af38b0ddea5cecf52892de890a26c235a684de3f8cbfe1f3ae19bb738af48d0cf1ed423df95e355c19c08ce40289988b6517c0000d0a47c4b43ec32000e31212c32f2caaae0b32e81679224c705eb12b8779104c0d580d352807858216bc66da658f54d037d4f005dbe990180137910b7cac6782402c3d14c9da24c0040715af425b9248043f4053707283707858cb365b0a2044722a400045dfe90846203401080400802079c17804c5ae804430580100000904000268d0836294724405fcb39a07c4e5481006cb2b2004828320100000bf23ea321f4150f98a87c8240004fc47c4a63e0431ef0de94b138bccbfbd68f411a97c9a380e301018f01077f29f644b402be259bee241ee241e259a0a19219409209009801200000c2577c2dd36c87f344a9a20e75537f92e0d5c)) <<< 16000) + 0xa1d60932d8978a2b3f1c9ec9702f25504dc235918b2848ab019463ddc7b8d6c1624e3b78d938a4153b34d6709094966157de12f93576162b0da88048aaa939a09068009aeb69b08a4c7e5fe870f5a95f50113df760e6ff0f3b7571970825e00fb2d1b910981f94ec0035c48e36b7124d76bcef8257b3eed21b7050fa7a730277c55cf5eb9d19884ee326ef2e565ab4a61ad4a43b78513d29ef05d493e22786302db1d4e66254a3eeb8623d3eee0f0992bee6487475f5b74145a81c95a87a850e04ad56fe318dfa31e8c3c8420b4775b9b6b198dcde92380dd169e6c22d3547400031f11ee190f68a80025848f614c003b1881596c7ac163d403a140ed5ef3c4930f5ccd094f702d141a7fda6806820340089153ccb8878890ae811c49f9884960a159a88a02bd2fc0480e7ba020098406402000020e701018f01077f29f644b402b38c9ff2fdd814c817ff19d0812c245d763527800000000000001991221021808609600e0000015f248bf037388d5117706656c65a1b23bede594d19087490c1218ae9a108e8b5b9354d48467714a022680016f90b0110630687a425c406b144640bf14f9d0a003c3474460834010134018f400c3c407e491f810648d975ea118080fb2ba11840d004079c072355711947807c0c0d0c00fc701a0800d5205012060d00400002fc8000c310b6158f302f4a589c5e65fdeb47a08d4be4d1c07118c8347ddd52a59a45195b36681a602031e020efe53ec8968055d09aeb5ce440b4347304141280240012ddfba98f80f8562026e16ea8f507d846253abc337ac9b189f874dc63967e450e77ac4926884181f4284ddc5051cba2928001a59c04063c041dfca7d912d00acb36921a6448c2d77056b549eb1e4683d02643039133b98f0ee48f5e57c93391e12f829dc819e1d37e1899831020c19e01800e00009a1eb488dfd03e46006fd80a64376dcf089c8fd8c49881b563fe2fa9d7ded515e5d5a6fbc794ae3f2fc8f36b4ecd61efb012f4c41aa5ed0003bc20013b8479477427db0b0c1c24fd1b9e5002114d0c700641ecb0c000c21481403c887c400084c48360101e40900202800051c8f198829cb43c45a04c210f08e82e4643c02a0b81100089890514d0d5a4877cf43bc721dd0d0ee04876c14006c604029fb886bb6c220660f4330d401d8a082c9306e2f0454d74aab532cbbb503e58981615599fbc2ddb13e7fb3026ee45abcf4277db10284af3c20bfe70318c890a98c5bebcaacc95284060574c612f5b80605941ebac4c033196548c850000002a0a5ffbe0b9b18d07552c29bcacfd76f05f289fc43a0b602ef2227a38fdd9c6b303194bb73b0ca4c731d8d01292407937f4e454b9bb018b4ce400b80f53ab959deb03e842ddab9c423959c021089f4498e05d28a7c3bb66572194adc1416d90046fe501d9df313920dce303fad2603120248791e302a5b170cab5ca8a14f8dec21c65b0b60f78f838296e17ef1229d446cb0b1e736bde5330334dc9860006c92478352074602b16dec809e96c58663b9c90031baf248f445a8ce84451999ca1cd5b9d5c718e006438e9a33e9ec89df2c0c9369caca3c6c5d9400113ca638bf74a839402edeb743b882643020900124a35e3256ab6fb13045a17ae6f5dbdadea280efbb9bdb934bb0a40b317407d138ceca492e3d8924637f43d21209e15273c18e74f909a8d27d5d2bc0965474432f4f9ebcda67f21db31249d165cfe83904c6096d97232c5af460a66184459a5c29bd294439a6eb39a33f17a6a521b00e35b92042b7af0d5c4a2f3ef9382b123ae6e35791d616684057dc8fa4516126985c1c10b00c584f3bf7e378e17bbb0224315d51a4d46f8218a656a3b8d3d317b24c41f476e428611d29dc568fae9f2b87841e25dd5cfa24b9a80008d3d70685ddd4345cf145b2abe37fded30217e1aa591495a5c0ef7b423a8ed0607c9192e327972172b438ce3234ec7b7d80c80c6fb3d464d5f0a889f628270e81fad38a2c819e8c0a21a69419db589ed43b19e26628426534614d48b7401859818590f892b4a0c66998c124d8143c43b6114262077fe1aa3e9f967bec2b77cc3847fe2343deca7a07d901f4fccfe28586da9545efe9117dcd0eee2222dd5340f62b0f1399585ce254c77ca9df83f01c922457612ff715c6589d888541e5a7663c683002292460ff279be256f0e9b674a930b9fbb0be1bd6472006d93e99763dced5a2baa6f0b48650fb85b5000d8792a137681b683231c36dc96fa302fd0791bf2ffe98717d8077980095b0f02be60ae3794d0678e25155f502fa32b27163e69762ef4de917c90e98bc3734694179ae68bedce14454d6d22ab600cce0d18ca6a680001adce9a035f4deab34eb2f633a52682b688d4b3d76f936aa19859bf1a23a423fe5a964af4926cf8c90d21fb057dbb6b65f932ad52bc2df600a4fc49e972f245ece6cc4a3f27a01602925f1a950c48600cac2c3ef6c12157d68b44cfc8ca004f7e1c4ae210b8bcd223c0083e8d4c976442ea4f00aea193549d230fab918c6db48c1331f4b570826dd9ebcc1621f30b4299f94b0601c6f961830fabad8e66c8b92756d7b8dab1c5b226988839dc3491b64f80926757121145d826ca12106232162c4123a8b402a20340080000e623b41a1d9050003401d29627120026328548b8f8090b8803a3537570bccbfbd68f411aa9258d00e23190694e355a88ccda09eb13c034678680448440470058000444556ab5aee762c545fb8174447aca46d5a8feaf63e4112ff4c6f8365dc5888d18207befdc959153cf1620b0266800)) <<< 16000) + 0x196900192823b0431d711e1bd130ac16a65c17a665d9a789e58a3a6b4b309bae4b35105827a122559aea379d9d3cb611eb39713bd809e8ac246382740186b75338e48641cb8c9fa9353532794da303382f14186f851ec83cc57e01c2e0cd2dceb3119221de385570e09010b45a1a1c7372f37d1509ce6cfd5ed25a06b4fe67d2685c6359d545463160f18c1864ab59c0aece6de5b224da89015b45052dc5126eacc7534838a13f74b66098fde96ed6680dae78eb461c4ac88a7234f18bd72608a1d24a418cc59807bdacfe5baadcb067ef0c9420c714bd3099b4b9c2a483513d8e92531d30228ced0374756ca48234608f6b98b412ae37224e45c16174d969f1a147f2a9b80f080bbe9c44f6d3e206e2b108493770143163cbf27e959ec729d18cb72aa208a24eb54808ad2b6dca0404dfad940099d52c0240c1b00840200401010402000037300401004063008758043aa0200006123a82a0001a623a6221d2090d68087440635e02000af323a0621393182618c28cc639e5b1ce2d81594c734763982b1cb118e5068724263900bd29627120026328548b8f8090b8803a681a43b384ecb5fc7f7fad4de8800e08de8e898aa4ba1199b41cb26ca0368c641a538d56a23336827ac4f00d20e39411a0140100000148236f10d49a113692975099df95d9d5b0162d8808f11b74c7d15895c1e61f836b92626679b2d42bdf4b602ae1afc9134f2d087925d42947119574a589c480098ca1522e3e0242e200e8d4dd5c2f32fef5a3d046aa49634038694b138bccbfbd68f411a97c9a380e23190694e355a88ccda09eb13c034849268a680480280004966b6835b7005ca1088b5d988f1066791d6cb840110a05c07a020078bc199f6017fe5d0c901c13e950434a773b1fd528c6396774a589c90013198548b8fc11ed2a0706a6eae17997f7ad1e8235524b1a01c46320d29c6ab51199b413d6278068cd24925214614f104000336142225ad965c6d5d37254bf06fb611f43b081cfffd73769cb07ea27679fc85afbf32d20f6ea8f24dd852bc9ba38e0a00033a238c3b00b09694b138900131942a45c7c0485c401d1a9bab85e65fdeb47a08d5492c6807118c834a71aad44666d04f589e01a42ad99e558b02d0820c10e0cc00400000cd8829c1a002432567bbb6ecaf55e169c8f1d4a883b71c0bc5d022c2a4333ae8acbea77f3376a3e15dd3f0f6c578524c12ae8001be1000ade238a5a1c4258e190c708663821b0bf0d8e00486fc1700702c7a86f46add923c56009047dd322d414d62369cfa00d007625f2b47bb3e8c8997d0a01db664b8352561c5fd7da880164872d848992451ddf240000001ae0aa6e5d54db000032085d06d6c16599939914de2bacf0aed761c64c4160380174d331dcc8c0e81182302e3b4b70796600e4a88a81d8d034876709d96bf8feff5a9bd1001c0c10b0097682de235f9d3cb8f71d16aac2bfa800000000000000cc8e0cb0c90d108c08a080000211c71e6d7e639e3e7d8ff99a5e179108a85cbcf2607389ba8c40fff5b179f4cbf2049d5a35fc596c6235701f61c802336d672ac593ea2cdde32bbfadff36ef0830f0c6c816c50de0d5dd39fb08358be7a8011b56b6f232250e48637b225d02a6c0d0c9820efd77e7272c68440c6250e5bad198a986d408a573c6ecb57918045cd038f4bcfb073115870dd0dea2ceb5ca0282167a854f4584bc686c3e84bbe3cd76200003723f8baf45756880977728a7850bc08221dd72707c0efe0ae14b6328f22d326c65526be2033884c428919030d1bf8e6016828032c5791979f2310b0e68b19fe678a810a36800051020012264064840019e042e097040daaffa384cdcf3a26088f1920510074ef2494001b5ac70094406c021248850fe03c51f1acda68a5ffb170f000edf909a007f6a321408a92a3204c1836010a290d9a2c38d79f5b13c102adf10461032010f2c2a5d3728a6b90198b1cbeabd22c00f24c7c702e7f6ab09420680200001c6400064880015f1812ed136b3402870e48008850680200000ee46f86437a231bc098dd84c2fc06374021b901e94b138bccbfbd68f411a97c9a380e319a012e2ae12f040f174abf3a8ffe1a140f511f4000000000000006cee56f937b721bce95e59ae77bcd492238439100000000000001930cb3f1e036817305ffd3305ffd52e5c6912e5c68e0e2922a21181120000193e374528b9f31a827df6d6ca7928c0f4944a80fec0e4e534f43545ef3cbfba76f47e458346edf4729c09f31caa8c470194874359297ae99efa663c456ef109bcae68823f482407de856b229dc365a2f49b0966aa4255c516c6320d29c6ab52ce6eb8d02d9a0698cd009715709782078ba55f9d47ff0d0a07a88fa00000000000000366a6f440fe3fbfd9c2765a340d21d070cf1861520cd0c90030002c604ccbd23f18c084e0285ed3851afaa6b56c51a3e925505095b53d35c52c83f9aed35b86222dda8438aca2a78e707616f9d17368c29b66451b805f8d24ffce8647cde8c487da761b76596384bd98a6583d781216c91213b7b5a82707b3805a3a591ae2116ce436c95a2ba5bb500cd6251ec84f121167798acc5a67c119ac9940280ee8a6aeaef24233298e57e0b91218e9bd495322fdec7977329fa0cf994598a460204173a592bace6c452bb23df069c45d97eb6744ccd39e9162cb7510b36d8226a2000a3b6d246b33535ee2f4c549d4931c4da07db32f280b1e9ecb4751a668c24e31ceb2c02882b53136991db29813fa48b7ac3161e20b53489deade245805e22419053b000033011b)) <<< 16000) + 0x71d06884c002a84c0109aec91a1ac08a15cee59f4b9a0bb96f67ab9322c74e4cd9dab474fd144a9ad36e48400adbe3d72c9d7dced4320274ec916b50bcb46d312d9d31ce3ada9ffb9950970e41d902c00ba7d0d6c599ad967b3486433d8963f897ebe547494732c4954112ad2f9aa5a71d0824035e475ccfb8d407436e3e504106c35e21cc6f0527e899cdd98898e63b0f4430fe4d80000f1aac097294b5530a307c4d9c4708fc8c9baaa25c132d8213c594bcc1ada77b630a60a5aceea918a1a09961ff02a0563ff4be7c2f709a7636a64a01c933466526a0852207b80006ab236c521b511000bc811b4358d99686c8743623a1ad0d0d804c6bc14003a5046b96417862043290d690800e9588d634c6acf62426301d25c0100401018c031aa018d480e0100200803701d01718348110c16004000024100009a23502ba190b554230216bc212400f0da48e04d475e00424181900800006091a7118d304c0100634a0208501e866d415c090ce41d591e12d129a430204886205040ddb87ce027d995e80084c4036010d034876709d96bf8feff5a9bd1001c602031e020efe53ec89680573f97a32ce9791bad71b317b09145a41aa9187decc000000000000003750d4638de4dbe94bb9fe375ce668279f1bc11900000000000000cddcadf26f6e4379d2bcb35cef79a924470872200000000000003253494443843040e187e92f1c47b024489302e4b14e844ddd8371d89ff9efdacd983d8611eef5a686d49e13924a1403425590dc4efb30f1bd3e3be280faac0fec65b3a133ecd93f224815b3eb3612550163145574e1f2bc4d9f18a786412c9ffbcc9a2224720b78ee45881b882334c2dc105cb8aca02cc824c024203000800007023481b1a305c83bef81b347287b17dfb2ab662210db6d9de6628398c7b32da1f136402a15cb2d95115b3808c0657c040c4b4fe4b9204a68921bd71ee65e3e61f33bfedcb5d77be07e98d5002fb4977a546aef40cdcff33012a27999634e562b71a9d5cbe9cfb186b9228b2fbcc5c275994fd985f28f2450059ea25f8365d3165e60075d4939c1c04df5163050cd1f4d5dcc0ebbfedad51007220a4ac9648dc1406f771d449589d6ef4f82651a398f4bf32ef1916efbfe78a264aa743d0101a4675c8527d4fa2d117b2ae408cb0a7d7ce8468760516050cf69ca00b18d1000310c0c80400001dc8003841000eb830112788ef96eab6b9dbdcb29c3d550908727982da0ac184c8e99d25bbb145dd157fbf3ebdbe79ecac128e219152e2577a95848e56d4b67c6087017c82c9ceb084ffc095b19b02b09f116f3c9eff7db98237f872c4fd4e5b7480d2908cad43a3fd7c633dd728d5cc5ef670f6d1eba2a3f2a650e015bf788e1551154cafcc467faed367e6610202e502279867039a5eb00ce63bba84f80066162e7e125eb68712e8c7b09239ee0f70c4cc9d700287e0df9fc8c8f9c572f0e97ea69f2b87e350cebb0ef00c6d83022ce5d7e6e919837c06b461954e779c2e37cc43153f477d6eb02fe7ac53c0b26953dfcd9382ad9596bbc8baf9b5a95718b3fb2790f0210a30087ee41c9ac9c52a31f758613bfa059d2e819457b13e47fcd114f4a6ef2c051566c4e78dca9f3a5800c464be3e27e4b9beee6a2ef22273a69915157225d35743b507d7b6e85f6312c16482d377880cb5b5c3530c96f9a5000156046888434222001ae323406a19f310cf18c674c43386219b310cd1480ac943324a198210cb8e86586432a2a1940d0c984c648143220219001000f74100845d3c681a55988f7d8672d42e291464306871bba7a653ab49e6feb105d0908b120dca96be26f0ac4aca71b0a046d779c95d91f9629b6309a02000004505164bab030864494fa2877ed6313c63539f293a7eeb51ac1e529429a289aa35c5cbf698344dbc9001a097f39b215be19ea5c4826201dc4a48362b287370bbdae1a106b1197200b073b4f4dd2118c4900008a84023c4480b0991e53a98c12d4114df48d6851a25157b2753365800000000000001a1ad31e02be8d9e3d029f6cbd125aa5bf14667740000000000000000000000000000000000000009a4206182380300280000200a0a2a892390058018952550f3cb3c0dbb2f225cb30161d8a59bed6fb972a54ec164f4b63ebe800205accd84c073747b4d5bc0882fbc8d0cd244b9df5151043bc5c113bffdc058e3fe0cfc0524796768fb0208de31a73439ae0f2971a00fcb172bdeefe19da472b63edec8d6245cfda31e0218e010003069016a7920345686842741808488a16b5b8712c7fa22881a554c2a141715e1f0300c563da804098706c021420bdfdc8de102cfc69c71c49ac4219120486f5dc82206a7c00e534e6545039bc80ae156485ea7a0115a140c109bd8a79534a8fde9501025de0d647d8cda011dd2282c64e3a604dd04ced8a401903ba5ec24750221b1020c073e1f255ae92f48354954502b018e3896188000355214e23161118c686c610172208041db8e2203279d88192864740811484084940a238c60040c632d73900009fb498c0150c4f28a0503038010e228bad4db9c8d32dcf4581c40c9b0e6640c2c34b1a485c45043d6c14b8301c8c01abb1d20241683ff622aea28330ac888121dbd87871912c821c5258a046120b2ff95a1178f2b74c103ce32ea440f22dbb686e10011a4ea00b8bec0ce45f72414c8570a2ad1a3596dfec8379e66d01bdf73c718550e80001da91641d0be0e833c3417e12166098002d3118c318c596c5d0a631453189218c40ec3dc6630e2b05511f104fea46040d1335db)) <<< 16000) + 0x830806e22589070c675fca007c1254c0004494b07002030c0b16d058b602c614070291421278a224d63641417ebbb3b0a083f7b9900008848603801016b098b482e05112a47049f5d9def9e3b6288a46d18b1bd4aa6b74c0f8608c03eb73279c3bb75ed51040ed1ae78b543a3ed93ba552803b2bb30dd5277c664403c3001fe7de348bad6928ef4cc0004149b55afe54e50a7179d50b2c0c4248aad750af9848080160bbac87e1131c298720000d5080023910a7258b090c61007912e57f2ab3c063b00ee015cfe5e8cb3a5e46eb5c6cc5ec24516906aa461f7b3000000000000000df44ff383b2a955b7b3df8de34010f15ca7731700000000000000034c1ee918614d02dc8dae35ce840b520524414408000830c738c00f020ce5c69abfe5f174249b143bf95a2db7bd8ab9ff08d2ca202370b6ad094f9364258e88a5dfa7091e94b8ed6f33cad40e0fab27398ef769d08b214d27a80910c9753d122109722f460c162b80318101c8cb2441a0a1459bc138e2804344b1858aaa6f03841019be8604143da880084c40360100df058ad80e4645fc1e36e0955dc087f40c2d87ce831323a0f89058e851015a955cbd47889f769d8384034820a5166cd908940210229c5151b071d98bc889184093726f564b4b83f003600c03223fa595e5143d359c9a00203c4f68ab187f189396f20914bf669f81de6728510e00001a390004a7200833815415287b1c4260ee438511bf3f8111039887f18c5092bd14a710216282ab8b0459edf77200382b5c18010290403c028183058c100c604072334fc0e7eee88a764142a2e2e5a24e87d18d0c2f68b23f90a6325e60a20bcaffc22fac67630c19ed01fdf4ab4237608098abebcbcb5e4cd4060498ec1ec41e4d2b700005bf0ecfd03ee7396ad11573e37184009c0c004c5fc162fc0ba1c52d86301c6c5e7bda4614a1f7dfc1c40f6c1720d06d4526b9301644c54e48040f31bad1005edbf96c040a40e0f00a2c859be3aaef991cf664d3bfc2e969333921bb9f99c0dca74768eb2ce329d31193103e23f42dfba94d5f47e3299d56e980b1e8d9da9e3d707955d04165f897e67c45c71a13a8c27301aae0abf16060b5716dfaf55282931eebca3ea2850d874aaaa54b240027b879bb52186b15c34aad659a901faedba5c2f286331e688b2d15a3e4840b801fa151cc636b993c6bee0b197ee1c8ba8dd769237834a37c6bf1d767f1d8680905d48e1906ed44b2f0af2b751b7871e8d57ddf19408de6b1897d855e9120c7e9c83881b1b20e59086ce0fc81dfa9d311a30e8da8c1c6820629a7001093100d012262598084e303601000013e2000f1241405400127645f4240018a040a484001c864590e42f86a17b310678c82fc340032204080d42060a001f732040a317a458bc88f82919a4b01390fc144d3e0b26811391fade8a084c63eb50cb2602e3c376d0de5524e5d22182280191af5c49622247108511e3940b8359004dea5c19e77bbd82d1beb67b1d2149353e2201b4707760ce5c8205ecec6fc7569af42920fe2f53b52b21e18ec164e3b6e064f438402f5d821feacd4045fa41db10291116e95882a0dde3c80d74f8d2ac69fc7212430d405e0262ee130f7058b002e3190694e355a967375c6816cd0347daddbd1e9f1114df48d6851a22c39a1b34106800000000000001a397d7c2f8b88166506202102400300028b15cbe42fd5c872f3f53f5a1c8d068facd18e0be389b17d75e9c85a5546704008ca45189b6b610831799a8df3068f41b810a18347f48b8900b116e300676a30d56eeb8a14a2e8a3b48a232bdc9b63eb5c6cc5ec2451b62fc83a3e67000000000000001a894110108114088084088ed30371b13ae77eec607803f6f424be5c3a59eeca4d172a5fe67a6594709e4427049e6ca0ba4f0ecc955d2c60f52e9d2f244820f05b3eabff1479bcb2e23318a20069a000690433c5417e1a00079a22ec6b175318ba16c5cca604053172258b890c3dc760aa2317011e041d36e11949489ac7dbde382771b0c005b1ee7e639f5452d1fdf15746870b019bf9ed0f24e17aaec23388941ea87001e5bd1929c36c7c21196caedba4088dca9f6fcf8c179e805944dfbc224071b29859076c1f1ca2861690968b79ed99a4eb952dffd76c40c70160400004010016038020080200000888aa8080002248b582f41121c81d91c7a2973dfab481783327980c74758c8a01ce93e8f4f29fa81e74af399efc856a1eb8df9ccc59980d6d8da66966f6c7de1fdd30f97c814a25a8507f7a381bcff15954d3cb925402e897d3e8e667a9ef5e84e8068fcab9b93397d93a992d76c89e63d0c1c19facd463b3e2f432bc365b016a258107b0a46770a7620128545115992d671bd3e363ff4c363edba1b7622b8b1b6945288dc00f76fe246a03d0e8710627262db3e2209554f46192d074b9317b198220fad4ac13d0a68000005a6c2a7818017f20339e365450000005a6c2a78003aab697af9bd34a46a841902c00006848b786e000020080d101c1460c2a8900292e724810640100000d470cdd2c2591823ea7244c104e6af45068000009603004f71e521400000258126081d00800008d915505000103900096a208e33046198b70ac1145608823043118b684c5b02741644ab43b5363609915eb5b7e0c68904a418a35b43b9a3e8070d9957060417d634f0d2775907dc783ec30d9e05892e6e22f81d72b0b06fbff9c10249d98c31f9627196906320b76c8fd0e9f6532342f0753bbde1a47460005d2577415a452ae771e0b2fe27534ffaca0bae1184da7d)) <<< 16000) + 0x252a81be3004c8233e9c1b87265db980cfdb506d4a5cbca315715e6d4a5a9a17e8f62e875076d658c5807c6d1304343fa6af163a5e8e71c14a1926e98205ac162d40b16905d8668dc53dcc58402b53df143841d9dc8b92185252b7a80e1040567d81ec4822e18001103800b85de9e40020406d1da6413beb258d0723961201028542aed38e2c93885c900184bbe0461832010892ca6d440b800000353919030270e60e50a30a28a708186780060300401a0001e643c8161e00ba143e2f67185ff1a2a830d9d6ed22c11beb1c4490306802112594da88170000006a72320604e1cc1ca14614514e1030cf004c060080340003cc8b4068344340003ee4080762b02b892ca6d440b800000353919030251268e60a2862061866040820018180100680000859c042cc0200013822ca1a0005722000ec4411484001a704590f62c6731622d85392c584861ee0316001c01004011a065bd448820a802000010cc8163eab422102e0080000473593948262a92ec80f95ccbddb3a81c644b95fcaacf018ec03b8055b9beb88910e7fa31316417d4c570e7d2f2620ab0000000000000035553c305d1f102d0710c0c408d04900a3bea99d004e04fd5fa8db05d4c909f8c62fa342d645221c7072881189451aafa77b335d093543a498f1585ec478cd3cd89286b21af00fe4d433a4d5a000820437c17a3fc8b5018388405ec80060011c0475d8784005c0200000886809b829e42082e0100000463a6c42218c8688015440b88200e9c49070000004b01a013dc794858000004b024c103c01000012120401bd5852c43200e7878f12e7c40e49ff0146c657d59e40000000000000000000000000000000000000000002a09018811a09809a01601402192c394b4cea91ded30b707bafde6088f35eb4ad9c4be83e15c9c4f8042e5e030313f2d6753ded2e5e8e18e88d62b88601594000d188002ed115f1580f0ac578462aa2301f0d8ae86c5701783dd5468850dd38d531c21f8dd647055d99f90813b2ba14c00d73e9a000cbaaf4800427201a00806f82c56c0703479a9814291676f14252dc4388230e6bb50006001185869a7137998488dcacc570a2e017ed54014226624a5be0a22ac998676101146ef4a4c1e00f784fb781c0087513c3c1800355d505dc149002402c0000ed102b058ad02c34417c5125d39a48c6b5f7f10371faff250a233dfc14227c6f3c2898aa78992081000bc04e18340108142ca668cbcd247161b7958bc16302c35847b78b14b6e8665f4228a16b2cd77224040ef0271bfca008fef2d316bc7021e5d1b6ec493882020a40f10287235462a8321ca1c234a2249287743da6e9429020b7c45002ab212c0e43c83ff9a25aac2c9ab390b184490b1fc96f6869ad4044ec51813269da2f510b00b5cf303722387c79318095498e4f7dea7717812c42c45891c50108c1680002e120009ae400188c8ac88c560362ae1300009e117cc8d408a16a7477de24406574ccf74f62c880482b220221f34def9d9b32ebdbfe061346ace3b6a82f09e1f2f8208c42a1b66832c5760bc866038ddab339b61c94eeabce2c027b4a1a43ffc5fd5bafda0007caee6c87a1936bb8b638c9f97c93c12c8c724510e00001a21000cd522ac421551900073f1154318a992c0a4760083315201c08f860fd36c3458b1cda8c0006488fc784fca754cff89f9984c5f01c094287100bc173bc75b05ddcc6485bbcdd87213bd0a5b5b4647868c2ac965e11e4783b209c10ad58454a993001398f148396375ee1b079967e078cc7e3a7b002283275e1b04a99b3443792e760e10869178033c07229325400c1a83afed80f1255ec13ab2f26ce886c58e70777827a2627e537f8086e140264f34286da65796328a269f0fe7ed144bf0785d83bbf618f258c1d53a4209198534136b376ac8f0d27ab129bdfd7cd2ed4078607a7ad8e1a6493032e3f34e288f707d2da75ce80202ae5e5c2a93f3de42cacf8db8f1521bd334c6d46cffe61b1c0a288ab380de28dc5ae7e7c81a21f0f35a13ee12ee99922c6f0749022bf486fcedbac4a8b5ed9e2089370f31d7a3232a9aac6a97ef11924e48dfe3ded71f90fb88d07bf6809906943d3077e16f6365b4bec6812afcfe801cb0941c4c18928bf00beeb2305d483a0f3b95486e316eccb62be2cffd3eb98887ffcd53111ae053a883099e61c60f748c30a6816a7a11efeec0d5460d02820a91c71229420a18809e01401201804010068a60080004c48100685443400137844681702c13bc6d0528ea26d7c67903c435d31e697db7caefc59c5af303a4c052d23e018126a37f91cecb156b1f6e26d72e6983b9cd91ba2ccadead4724c1e53959b08041e906eb7e1ed3701fc0faed12a73a28e14b7cb97431a58595126c5c61dbfdc66aff64c98b47e5e84795d740729f888b8dd6376981161484301bd600823e0e1112594da88170000006a72320604ee9fb39ca90a8023bb78543f8bfa2dce074800000000000000000000000000000000000004a238e2841041433c03803004b8400803400085c81006c5401629e0bf3f8316c49cf297f12921ba098bca03fa7af75546551f1c0845435b197050c221a2f0051d6a6ebaace9308546f02e7d81a1179c963ee1d21f736dc184f4764431376c66cfd5f65420a221b56273c29f99fb9d088bae6acee904018daa11b55c4d532ceee7a2cf6c35896164e61acd5194092213d91f3008a87416b87c0a0597d2263b95b9c515250b49ba60f6829192ee1f7476e694c649b33f2daccae4da17944d2571d94f01514007993fb103384c91)) <<< 16000) + 0xa29c590cea97316715d3a9458a0803aa7baaee7fdf7b930e271f00548ab6c9790f1354209011018a8e69198ba6fee1c1908e261f519851ded875e28406fabe1e5c737ca1910d940085959e95e04feb6db63a0099489ca034b736a9a09500965ad26017cce18a41c000034133f7e71002025dd5c0d9202ecfcbfd5dbb740000000000000000000000000000000000004712841c41432812413c03804998ca9ba7fa8f92e3363ddbf409b942d11ace5a37451d093fccdd11d24c540b114448d6d25bb8f7370ca92568a700c000bdc80f88800301880094b11241d8918ec5346620c331221189086c4101722a5023825068a71e49e1503521660216ab70980108195c3008e40828600d889a04e083401091a072d1528417fa7dca0c9993843c24e974e09002aab45040257eba66001a0080a6008000468c0aa6ea458e2c564bd24867428261c0d8835863008fff8eca0034010131010980080004248a5868528362921b1480d85f86c474262360b11a05e44b95fcaacf018ec03b80553bef21849e40b22472862c41443421c2340100030180200daa7860ba3e205a9e847bfbb035518340a082a448e288806706686684500100060300401a00023e78891192dbd1e015d87935a95ee2833ccbb1c701e355a3709b8c6818098eaed2ffff094cdc4173dda86068cc1c3dba9714f221bffdb98780f332ff525336f96094d4f1603806f490e19178c256a530a1a0f21223acbe6d35600b4cb82ab5ee671fba94f1be89e7460c611200a380c000dc08a308c514460c823144098a182e06b96062f15305cca3faa6ddecef65a50879a0c20cff9707c81c2f51ca586f890480ebd031c17ed7744556a8f4108804096810865f406fc0c33d28fd8da3713401eb60bfbb126a91c0cb443a73d89e48000cbcf9b070fa59cbccdf222c913c0001c79ca315d6c8d48dcce3b5b72f5512013376c75a7533266faa6187316c0100285081628203c14202f9e28185584fda308516494096f84420f181fa84a04015622651c109421cb4d001b17ebe1d40000075302c871422020590c478392882d10911831cfb9e4c14f5faba88500abba2c1335cfa16016abae802710190080a000800050489f8ac4f81712c0001c1addca88aa2a0030616c67e66e234d88f1680516b15827ebf02dd9dbc284011b5ea6f6e0e4032d7670604b229f46a110dceaf22c40032c19c192075b5acb380e003b35d7e7e374771d4bb401fe5e361820775c1ae58bfdcf455907c07144e0d044baf9c4b0069af9643021fc7aeffe4c182c8db84604a660a1930e4bf5765145904d9f009d5c1601033a650afe8890051b2d279053210014d380ef604b03160cd9e35a0d7e5ab22040c419027a0a00026f22782213b0d0002eb100090c2001ab24004f048839284e87420a120018492272731382dd8d058a179e6ac10f52fcb323b1e7ba1e03862b78eac67f44fcd421e965bebb2a763b2463bc3ff19ac807f456a0501d7a020f60297ecc29f67704942fb26f96f634d4a99231224aa8d06ffd5203231489c8417ed1128f4dd433ae7eab487e028ef64b0d75079cb08405121bc60ee9a155200dbc2456063fe06ab41b61a347511717c46165d670ad7aa304536e9cfc2d42dfcfdf5864fa3b05cb066fa1ce98492f87bfa2c7bbb2f7d6315093cc09b80e8540c59e628179d03c1d29d7ba72d18d87123bf495a72bbec6b54d27f7dca065504030bc0c7d6c2c84e689e3796a18c02954d0c4593c93d58095648229c0ce416d8e704054dd9fcc3d27ce496409dc5c21e98d69d56ee2695a969c2c82a5a183df7f483b4ec4201724779772183f59a50c7a18850f0a50d9adf884e8ec0aa03b4a1484360906357bab391fc8192c7ae8b9ed4418928a2d86784d3b88e3b2c8605a6a5cd13ef8ad45c70741400320993eabe5bd4cc4b1e63dd2c9183a32f46ac7138f09722182555bfe86cb2bf202b0652ef6897354b7080cf1e13bbc417c74e94a181014ac951cc9d607ce358dd07e75edb09902475ead8478d9e7fb0fdcdbc0c45ba5abc9bd8bf25442ffb463549ceb22db3620d7e95de9f452e29678bc88912f3681bdb7757b1a972fa0d4a80fa7e10825c209252ea34ae4f897f29a5cb8d3ee129ff624534564620fefeee4850b1555d1cd7248b2272e8f0797a57a96926732ed08f2d66b72637aa99808fa841fbb24cda936b67c633df2745671df3afa08b2ee0c26b9970212020008ab2056221360d00064791351189a08e9144657b936c7d6b8d98bd848a36c5f90747cce0000000000000035d13fce0ecaa556decf7e378d0043c5729dcc5c000000000000000d0891830cd08908a049046002efce83f4d2877d491aa64090ed19a01769779e47fd15c63c0decf6a2a5206e9ddff2dac64e379c6e1f6052289f2aa94a2bb4b514879f19b86739a5744ff383b2a955b7b3df8de34010f15ca773170000000000000003472faf85f17102c891860c30cd08904704a025f465e337814906534b69fab2ae38b9b612214c9f4b6b312d4b29e5fa48211b84dc223078a266030002a62264221260d0988084c00424a0200071a223413ac9ca413154976407cae65eed9d40e53f6e47171879800a40aa02b48a232bdc9b63eb5c6cc5ec2451b62fc83a3e67000000000000001aa77de43093c816860e80a70a686501034d21f1c5ae0f57682bb8aca07a2367c622ae1229994fa5a61e3d1556ac397386c524a682a2af9d123499c4794c7c6b946b3fd9a6cf119504e934ae90000173c38c508e92601a397960f592db9fc68646388004c5daad24d7765270a)) <<< 16000) + 0x22bb1aaba99004453c327871a4a0b32bd858eaba620000005cf0e31423a49807806f81e18639fe8c175e060089bfd80edf4fe014f4f437affb2382250600000bd481584c4bc1625c0b12d05e44b95fcaacf018ec03b8055cbebe17c5c40b24462054443042033020800a321ce5b076007355c52f660cab141a652e5270c530fee7f2f4659d2f2375ae3662f61228b48355230fbd98000000000000006f4ee40cf0e9bff926723c25f04c7877247af2a04c8607226761891028a29c21821019600600569d0742a199a4a44ddc02649c9e8ea148bcf23bcfdfd6afc156bd0af9b7b0befd82a393627766359bc00710498832959b68c4b9187011670ce734a8001f61e222a9c57d1443ba67e427872be5b9287080e92d67200808aa42a2c100004b0010211ce9788f0023c3b6b04000004b004212183e02812c018000e0912b110003ce112a198320ac4a45700c0100409402f090596295786cd0f1be3e186bb1858aab2c3ccfe2583021b4bd83a5023b4e55fa4810023c73132ee941f1402411d6d233fe7a1ceb839a3c00add163fbbc8304d9f8018db60b032d88a9d426b99ebf5ed0e78c1098198c2418f1ef531c3e22d603ec9182df3174f1d7f396b1e6461aa1e31b0dc71dec78f060c085cbe7ca29c1b3472249500022c790b44f766b8b8468d000e1e8afd84b47ee2a91c0af472a1e17a1718ff18aeafb44be5b772608500d80001689d88e04db81c02f07ba46185340b72faf85f17102e9dc819e1d37ff24ce4784be098f0ee48f5e540990c0e44cec31430924618630234132a896f484a7b847b7bf34ae43af25d63bfd522b514d6cebc040a23782f9fa3f642ace9a7b6b95412a845592d7090e3a5a949a06028c31d889180738fffb2baa0918b1ee186cdf2633dc279ddfd38738c083effab6ff184467570fe4000dd9755b2ca25c20f61a0c00058c65b81be422ec492f02eae93c6e1b6615094dea4b126d1c02c465821483800005c240018488005e591271501002a45b7fd33cf071fa16a93d890cf9fa8a1f4821f28b89ea010000a8c00a05f1a337505800000a8c02800c90538d0a000dd96729d920842038a1c00017704ccdcd534d964445bda7530eb362d6498007171e7440000177053000e80828700bde494cc88dced6590cc12bd5311028ead261977b6d40c0006c7713000d80400004308001209a1e8e3602a1c7d4d33961219989ee6b4842017b4393080ef687c482076388dd0082601f14381101dc970d0012ff36a724107804112594da88170000006a7232063bece1d1984536ecf7fefe0865e4c0a11e73cf20000000000000000000000000000000000000004d250e4cc34b2c82084c4302b800080368705c0aea266050b5b31641f5491f9047360ef826214380831810afd3cd860001b1dc4e003801000013a20006e840014b8c4a29e7496f22861bab0074bc8f483089f610273910e99c1be15384820c0e924726d1089e06ce600804169d466ac4149018f9d405ae2665f3008540889962ef5e8038f57d779898827f04f45040b23fbc28403eb2d66800a369a0580003711d3800e004266855c562a458bb47d6943959d5628e3eb6378f2419464dde841160bf7c16085683c04e003801000013a200051e4454240009444434362181391803b93255ff8f3c71ac44a15f8bbbcc456e6c6900c379e309ab56c089c065d20c4eef2d3b507ccf5c988867ea8cb76aec82324183020f0ecd33c96dee532c061004c58893ff83ef04c0904bb213f81a0860f93400b4be16e8f5e045fe02b7194df4dee101092178918dd87b75e34ddab186956d9563774dd38d100b2c9a3e2edde548309b8d14786a682d10c8dfd02ebe7b09030209da3d51c117cc0e000cd8c2008d6ea13000227b8bdf143d2809b7e73437ef082de9359dd010740f80002ac3334043a07cb2cc522d16e64c5f6930a1ccc8f83f36b6471fc51966a781b13109125c10e3b49210123e2f75da70d0c41f69a3682f8b000ae708eed750a0026ecf961a330d1f112410c016133451725bca1c141c97871e5bd7ab8d0c2b269ace0803ce8cd20412af170981070020000228646427f4b4287b31bf186ed0c3cee86993c6344037d913de6f92e148311eb01a0a77b7af4431ecdb85e6385f503020ab5408741c070038002b4e71d16bef8d30005c26babb4ff7d202bf2495872c79c28b1c1829a020f0220000582400197c8850884240400195e4006c508930c849404004f40400dc7889216c48ca620c3b1221589088f888d68250e198296404842f9faf9009f8d1b238271c6219a0648c84a38065def680138a0d00404800623e0311e0108e80c470042360311a01c0811bd45901c43c58448422dafc101666d33a40076a6238a00f26e340004c38340101190984a8284601622e0399a4c99f904e1d25bb7fe8e3b777dda048575fdc5cc9841a8fca2120903c864320109807c50281a7e6f98c68012ff36a1c24107c06112594da88170000006a7232063bece1d1984536ecf7fefe0865e4c0a11e73cf20000000000000000000000000000000000000004d250e4cc34b3082084c42c2b800080368704d860d266084ffb8184092ca1390447cee7126219e4f219610f36221860001b1dc4e003801000013a20006e844581733499faba6c871f2b0dd6570d100ff23177ca10c1cb4d2b08104ddbb032d20a6aabb5cd1008281748d98e0482f52c6d0f000d5b7268921c48412016224b29b5102e000000d4e4640c77d9c3a3308a6dd9effdfc10cbc981423ce79e4000000000000000000000000000000000000)) <<< 16000) + 0x0009a4a9e718492a0aa0868660370001006d4f0c2cf5a249b9ad6625053c89cc850400d82ba3430ba8d543013f54bc510000363b89c00700200002746a786329ee4c5bf924d96d0f515a9c18308469e6903e3a829e916a778ebe282023bef349b8520086327b217fbfa40000047868c007a1201c00c015153c35b82f4926e3191d8c1844e5345414fb7b9d941015527b100433a7adc40000d8ee27001c00800009d100032e2000d7a40022dce44b95fcaacf018ec03b8054522ce1c71d314d11008a08d00b032000200d99a25e092d22cbc912c963884f68b1c7f441550906c279c6c20960bf7c14094fd1259c006c020000266445817912e57f2ab3c063b00ee015148b4c53443044022823813402c032080200d99a16a38ce38f4c4065c5081cbba1e90677afe68104582fdf05820ba2fdc4c0838010000114200044044543400094444504622613e1d386cb1dac0ee38f3e686d35e9ec4c507cce699807f242d64ee6c39ebe0c109b4869aa996c408014ac5c0c20b3432e97c94316d29414f1f6f2b0c8acb00685c6c8fef044decaea410c419133688672ce1c2fec5c71ec3f988d0d4df2bca081a7d11204a5d8ecb020c00200003ece1b701b118d04841a6eebbe191107be8c60443440467a86dc470c16639e1cb302115190ffa8904e573bebfa40005ad26f16cc00337b414d90283b33dd0b52a420980c000042c4448273364ef3b56f11ba81a4221be0e06a94c5b11e6ebcc5371824e485e5a2f2588106775629833a868758ff5bafbcde38287d00c7bc4d216022815fb0e8788a01ac347ee3e2fa10d3d3c2420c41b133694839e38fca608a3435352989c103c401070877dd2a90251e705098206402000020869dc819e1d37ff24ce4784be098f0ee48f5e540990c0e44cec3113091863032c33023414003000c0072180200d0001662000a0844445422002000b04221e3b10e05ccd0a45beac038f46f68f848e100db205702419b46ba5ed2821456b7b0a10462ed4946120005541c5b20000003a980c8800230204cd0d68ef41c7cd8f4e8384043903a4834351a6a282198257b0823f29484481050633d04000363b8a000700200002c46460625844a23177c0b36450c04c1ef6c90a8a07f190c34a74937d2c14d721346686031a67b4114af832dd2211a7966eb2116cfaf2d64821cd8c2f6cc0fac3fb582095877bd9b49de7755980004cc8a8110460b3118f1bdcb7eb03612011282f0000602442c1743825b33141bd7434822a2fb9f65330210f140c90c28d8274fd310be973e132385d030c0cde6496fc7cb93083f712dd14d3be0b043425437c025e691000001d3326c2a831d5977d000700e8a1c17ba500411a77cd7078a076a2d09887bd0da618619e133c98423d0b5c58222031f8100006c7714000e0040000588d0e0bf0e8d0b60bceea162dcfbcde48bca94822ca7de81c3b5cd21e2816f627f461c7f24c4322a0457a5f40681860341f348c26f1491000001d8818a7c7010003545ec4e011462c99a41ea8003b08050e139cca550b125b28b208e017da63c502a93db4c4332df2a0c30a50e4220215c659d08000363b8a000700200002c44000fd4c8c1343d13186ad1ab3c44314536dd3430070b094423f5797a0001e1c6b4098207002000022c400246c88684c4302723147a582830dc0e88682831898c6518119fcf364c046e27aaa083944ccbe48005f5f4f2200fe06e60a4020e80a30d1713d48c086f7528180845d690041030e3287000002ae4c001f9bf394005aa4b627041b008000099910b09c8c5e53018d180ea176186c2aa0c8d0c06f7483022990b4cf043616b04401140e2827081a00848c0cd8fc522429583b186984148910e322d243023051428c0070709a280087ea6027081a008000098100027b221422109050002c9101c1108408806c34002b34400d018801ac41107250830c8414142080a0037be201122440309c48678e82fc4401bac4440c1401f354440974020e524405261103b0291900180b4a589c90013198548b8fc11ed2a073c4b37dc483dc483c4b341422051c21421c0180140020378a2b5b557f7c94f397b5560f83df0981756f5361af3e9747e7deb0a4aaab28c43d47ea72e8cc943241a3fda3123e8cb74a589c90013198548b8fc11ed2a070491861480c304a007004002000048ec2671bbbfea2bdd458eb806a55e7552a44102907368798820c367ba91b524130b6c388b5ba2c69fa46ac35390c6604094a812aa788de6355333393120291dac1e7278cdf43a4fc2318029561cd3990e1f50ab47ca01004450c4c88ea299d8cd9c0fc03e4079c1bfd106bdc9da3e476c8d2c7ecb4cfd238ea56e10ac009779cb969b897616714b999ae68041850e8c38b621091d1d3458242f3937d7afced1c8c5163faafdde92d56622812371e834448ee748e3ce748d454e7528285f6a299cdc604c184a1bdf9c967e56fb37cd1f965d1d670e7727c99ffbbb8ce40067c5a2e8a1ce9b029d1ec96cf52d63ef48946577b24da4101b372042de7b75dba262665d8468f71255b2cc9ccec40082f86534cf30657e28dca40f3383200c3a6e15cf16528062ce695b10f9047fc7ad21b425bca65bbe5f5194f2865b93e309628daf491c50f032246b7c24cc611e1b9823410892ad010464b30609820680202000200011e303145453e40b562a509420fd69184090cc5850a1a4cd87c4a08340100ff0107f0080000400024040c8541d40a0007e820017da400368087e92c3f0960984b0fb2187d10c3e4661f02b0f71187b06c154261ea130f405)) <<< 16000) + 0x87980ec1bdfc06fd07cf970023ea2e786701de89f58e863b9d6f02a1426c948d65723921d380000000000000cac5bca6cc8540b81b32b650c2240a8dcff90550a1c714710900800038fb8975ade6fbf00781272f64b16a86d40b230a8d89cc223e990c2a00c82118df7580cfce8e2d974678bd72514750cf9d06f216714c85fbbca59ce685c252c41cc2c64a6d84491b53e96624423d9b58100a89120000326edb809830680201e4030f10187800f8b0122ec0d20b4b5d22c8e117e6491c5a4efd2c61e7c134a00505f8418028f1fd009c3068021648a90c6e6903d13769646aef72840222a43b96002a109012840d00403bc040001f040dc172e5c68f2e5c691305ffd5305ffd20e09c59a41641239631a08e09400c00190c01006d92259269164626f0e248e59cc531038f7f90a68c73f94e9a09d0dc443829cf6ec84e10340100ef050000a210360d00014310004fa3030a9300450a4f4249902ebeaeb23081acf7c941932de8e48068b32300029e3f9804e18340100ee0507680800c041d8020001852064420eb190750480020f887496c3a0861ce1be294dd79720454f012ae920910f1e5af9e3b737c7d611838863fb6f290f111560799e2425efadb478d34b8242ce30614c42e025e3d5dd77f72b0604a6ebcb9022a7809574904810a17369908945df1e26e000df785781d056b0c988af128fce6ec4655af765712050e18bc97c7d28b0e68a21b8e299401ce489b0f2e00e2538aa1c3043d083a061203f93658217aebd8c0c00175c0020284e683401000014421cc5a00051021ca530e40187180ec64c1ea3491b0181931c40b53fd86124ad3c624347c70c49410680201c4030e10180000f07a974e04a1eaca5cc20519594a0a122cb2552c10f84b3825081a00801b80f0726bbfe450e28760f4818552f198e31ae62052846ae21a23865c7ca78b043a28338c07bb56d60280c1b0080000af900027221c02b0df05d0bc5de9eb6e80d354498a7481746f1b58dc4c66f1394240e201befea22f4663a36a16e20280c3f6d26f518cb6ee9f8204fc352170f9a029dca5ef0702250add9baa373c2cf5a680c919ddbbc025e795afb8a25ac8c59fffa09b629aa43bae6637115199015a340896a8b955f8cb2c0c38a61d800039b3e259bee241ee241e259a0a09438e29220c18e0860960100040000864800401a0001f86460c8fc7b1c45033af010c2063110487f398b2118c80ea88721c4debec8cb9c28443e9389c07335dacbb2805cce82ada66f7f5ec80a00105622b2c56a1b077c4001d5b887b8dfe2cf3041806625cfd30c32827a01001e23e2d7b0688503ed08104700be6b042091242f00006a2405ca416c4a0de2506e92829c741b8320cf1506d8882fc3400199a4368d41b2120d805000f9d90d75986b20c355041102307a1186a00ec7ff4daf4302a6cae1cb008f70df1207dec78e000424241b00806984c06417a52c4e3eaa010d82ec16ebec83781c644b95fcaacf018ec03b80553d63c8dee0ad6a8c89185a966d24341e33492442033402801800012df9d8b9e01b5616924e766e539beca8e48259ead7b4e2f331ed2c1671a38eb61505ee0df792dc01882a491bc5195af1408c0cb4cafa7c4f97d388b239b2ea6bfe63577e555038b92c3edfc1fde2054b523b9cc418725231319073220c07be03880cb8809c446affcd0856e36be0d7ec7127854e2532c8d7c032e480e6d735270c230b08fdf8ab797ed686dd05b7d77465117d8a180e837a6f41cbbd63f3b1469a8343aaa10782198db9f11e3e6042caf8a1a06771ca900baeb478ecc839920a7ad298b532ec0090ca68147aad28e1edadc46e6e61c9a73ce6255b0bb4ee2ff2965637d5a3b8c663cb08c73670181516f3d2c1917a0c907318ad1838938a95247388fc9e58c3b49ffd0008037de8c05d975830400f8604c04c18360108183ee54d183b10df1848f0c044fa0090f540408244b9f404a10340100d20100007c9f2c3ba21e58da17b6114218d9119304190040688083400419e020000d0216c2a0ce0500019d10009c93a52c4e24004c650a9171f0121710075b0f0a9ddb880ae2cf379815644b95fcaacf018ec03b8054fb5bb7a3d3e2229be91ad0a34458734366820d00000000000000344203341101340180023108d9a6b3550248e530dc0f69a3f7fd06024b902c32cc15439b3decd8b751c6e5bfd52d3f74c6fdabe5f7ea701dc24ede910d47846b69e9c90c5ee9514fb38ec6320d29c6ab51199b413d6278069b0f0a9ddb880ae2cf379815644b95fcaacf018ec03b8055a9bd103f8feff6709d968d0348741c42c51c52441012400206442be122a4e9edfda6f3d23027c7d4aacac2990b8eff82b1da243fb5d198058b2f57ba56254ef8fff72179926c7e30510cb2d6e0bc07b739228eadee668894c2978c25fb3608705a039c000ca20340100000e72000924400c4612c1b095098004a310cd1d000b3510a82d86616c32ca614c530a52586508c290361440b0a105e1044b9fcc80e45df8598120795240c2c2102aa502e555fe40100094b06c02018203a5953b5e8c49a8caaf61d0e2155a7442dc3523fa00000000000000000000000000000000000000001404c2050ca04904504c0070001cbdf10278e36c74b5d9fb8c8a0002f4e2e895555f232ca00165a39d446b7bf360794ea3f99767c25a0ea4142c19fd8a9b9da33da4243d6b6b9c4d1560605ba170813a85cc2d8a0a0007ce4324a61904b0190de94b138900131942a45c7c0485c401d4262d2568ec4c8f1182e3c460c06918c834a)) <<< 16000) + 0x71aad44666d04f589e01a644b95fcaacf018ec03b8054fb5bb7a3d3e2229be91ad0a34458734366820d0000000000000034538a1c51441c00f65d06fc868537080f5e64f1d6482de5a6e3a7eab287dee4d0f151a87047193888a28d030d2e9dafec8700f364c905c9269ce61bcad592712eaf54a41cacf5fcbca9cebff66e5e1dca1034b91ab6308871eb20684b349260bd12c658d001487e9940015d2da094206c0210304531e4123c8c16051c117c0eca7000cdea8cd00214a9292001b37a926041b00840c02487aa60f1308fb4719b2914f91820d80400002648000e110002c520f6230c70906304a848d6f8a41031c63a181020c27c1034034ade6c0c0031779b0025141c00804408c0004600023a431466188330c31586104c140261820391c03d3aceed7d4503404624a34406ae02ddede95d339e38090a10b17192de0f9183dbad9b5a1849968726ce82f69f774ea2c440ced751fac6af3d054a35a433415c43fbc61663b8533b1e47c00088ad422b4ca3d8595e902040b668b6d90404ee0d93024006fdbf0cef647064205c8203a4e2cdd15caa6b418b16840018033cfe5e8cb3a5e46eb5c6cc5ec24516906aa461f7b3000000000000000dc492061040cd0080070006ec6d5ffe9de42045b707197dbeacf9c44294c031c203d6adb1a4cf5e3795e59555ea83c868b0c8936bf7caac0b2da91299d6c337412dbe70a462a2a27ea77cd27ec630851be8001b490bf190003ca90be350008ea104e4502612812c8409432001793217aab0bc4d85d98c2e8b6172530b81dc00c779eaf62e574616614e418376f01b6a2f02a178401c67a0d91f660bcb0459876eef083edd65db5ac6e2f3f493a66cd1ab91c000dc69de1e8b1bb16405bdb9e06efa2055055520dcf4de3379c8be85379c5ebabc1b4d555dadfcd87d8617d9acba9c9bd52008487ce5ba8fee5cc2a615216abef32269d8acb3ab3996fefc993001a458fa1f377edbf899ddd2680c6eb560f997ee754a02d2085411373858befb484c0d29dbddf0fbc39ce00aeb15e8ad1612342e23d80826cf3c3f3f5bc8e263e078c18fcbba71112c6aea2862074ea9e07a1481c3007bfa22011880c804203fbd2ee2464ce24a6016bf26c23081700840100401016e020000373c4868d7d9e324373b0416474c11602509da0940c1800400005b10001b2363852e1e4689c3948b12210edf3a5812d399a00037e8098204a28340100000e9216c320b515057848000ea085a12c2cc761643303e0dc0d2b4404ed1034e8fabe9ea2d95791f4c5c408690fd3a585d8adbdaff2d87542398d114d05ddbb2c6c7c7f88ad81d71241ade8a9c40804c53301973e48be2dcd05794f82bd04f3080186ca6bce4228b4781658643f76ceb40180205acaf83dd3ef5cefa5f794253ecf3cf635cee4b2a24b71d460661d0dd125967c98143df90255149cb656039b2ebebcf298420d624701b10048d7e4143051f0122696c4c0c5aeeeb3ce5a240664dfe61de49f0c3c47a07b4b0541a092b1118d9afc080473c6c13c5ef238210983341747500031c35e1380c50285326bc8303105c00013390b12d00038810b02960770096590010f081000248706801181b5870c080d20392e5844e5232182b185b58004830320100af0500006b10ae1d8568ac2b0361561b03e0985502f4a589c480098ca1522e3e0242e200ea3190694e355a88ccda09eb13c03446f4743eeea952cd228a5f69780d19610e10611409800e000003827d196225bcedcfe7e8e91aa564e5ca8fb2d218010406899229d6a74254094da4cb68d70c1d2a41e96b1a5713140108400068242a476000ab442a0f614e7b0a63185296c290161460a0a20185080f890719710088d9e44002a010e21d93d610355ca19803bdaad1800b0040000218e0c242226301cf350f22041900800003610a00184f80c2780600003e20956538a083bd37e1051f306823041900868433c07a0820a1cc812009d8fcc602685e284808320100000b7213a0b09c01c8c60a2b118303e8ff020ac62268a00a79596301b0cfea040339d99004c20320100001072136220002c421343b09905e0445f1b7f84f0294471b09b8dfe94be92420cbe6dffa8ac52f9e393da7a371f558a1153ac7a4d770402a58c084e597c8698e06a224574be7d7adbdb3f1fd21be0eaa4827898cc522e71cff3a8ff0478fb6bdf1402db72feb77c0c0416eec851f10bdef80006365aa4e3dacb6d6ec77766866719a950c8bcd837093e6081ab6ea61c791804844f1d998a12a7b33870336d1fd120b6eac92402722b44800128e0d00400003b484c0c800150484b92c00c5412c220950904a00b4095ca8e060116fc8f00104222c1a00804980e02002008806008022061284c85814fcc1024102e00880400802000008880005390000e43008010040490082440412002000061211e3308e1184686c2302611613a18d523a6e159a98fda45a7883ca794fdc3d8d66f0c569e580e0609b5535999e1c3bd86d7127e30ba24f4412af22337b8af70a81c067f1b81fbbead5151db43640ae2ea1b12fb7addbcdc0e28ac1200b067ac63ef27b9ef8d95a5c44a60574e3d3279fafe67a81400048452d996fa96a5cbfeb04d8f318d2e30660b8793f9aba39c01cba5e892a3cbeecbfe6be63908bc12202bb43c92c4212621540228541120a0005082000e524220b610e4b000806210c4b0040984280f8687fb143066ee58028714d0c42829b8bfc4800628d228162aac013040c00401e0061080308301f1a01158648a46644a40a4c224038b7e3c1c)) <<< 16000) + 0x60418ec502845006c613040c00430745c6ee245e451f2205df5a2c1c33d462d3420b93063020c61763c05ecd0609c206002000024242080763036d11e4081d691c8c1222647858239ac4b98001053b840192016282007d3944013880d00400004cc8001ce10811983902f020eb087e30506ca420f00ccbdbb94022d2e4f00090606c0201002a07f01000079907e15d9439c7ef712e7a0166fee0a15e4d6d22c45c0b02a4205531867aeebb6cec92f940a5baabab0460031838cf0f843b795d52d4ce9c50b0c30e3c179b95d173c71a11bcb075d7673cf10dd87dc2f0cbf840c180fbf32d8911a355242412cc7f5ab95b05e0e76c6d362b86c2367122661cd7aad81d8f8db01ccd1e00012bb1e99c2d5356fb734117677b466102f45b98bcec43adb611f4e64808c35e47736833c3e5860b68532bcd09c9e27584dfeb18c07b60efff127ac5dfbb562805955223befcacc00701a4a518e9ca40279bcb015c64eedbb61e2015f12cdf7120f7120f12cd0523c460c8f1182d68ec4c4262d241a8132181c899dcc7877247af2be499c8f097c14ee40cf0e9bf0c50b2860cc04a009000031bf693404aab4cf8725b4c03fc0a92641b1020075a42ba16df026595d506da01ed7de6ea6c69f941a07ad55cd859365a2bb5725a93a0f4f9aca3d28e7b1bf40010f083e8a81f0140015ac41eca60f4520001d03480ac1bdfc06fd07cf970023ea2e786701db16f29b321502e06ccad94308902a373fe41533830c23801c01000000036c8a86fbea6e1cb2d12ec95c55eada13092d9d8bb7a3cf4e07e9ebe5df01a624811b683100c148060c203e099cd3e181965ede88131448826102e00888c1688a0606a938f048205c0100000d640ec160f20b07805e183f4264819dec96120817004780ec2c41a04ef2de600af93b046102c01000008b20ee0b07605c04004011e05161f53402c0864011080b80400001bc80005610001ff20ea3b0740583982c1c817f6b76f47a7c44537d235a14688b0e686cd041a0000000000000068d4de881fc7f7fb384ecb4681a43a0e4c17ff4cc17ff54b971a44b971a383861045826002801800800151d9862683df9e8c693fe64674645f5523b93706df9824c57955f2a15449aa5ad21c60b395e5db247a7b7d216f5d293745557814caeb0a7019941c4060e00306f0183700f84a82112388d4973c70e21d6d0046202e010e13222638e1d9b8cb4409fa00c800494484024101700800005a9d084d7e69414f9bde18217953a382e4a140d01baeac80128a0b80400003688368cc16817237759890c0897b7f8682cb0ee2140653b1c8048203201006c0182c00e4610b5516ce9e5adcfe6d38744cc088c297b51af06875f74e1f3d51821e0de8111e9ed13867cc844f0d0461a799ad2d4a0049df69e202440fd9b826ffe30a7f74934de0acc015dc410c53e24e0699fde10a72801b5dd769e29cd0799433d0a1c025c6dbddcd49af2579a9486220b5483802ad3703cf881c61884a00007b2415c440009e04001e3080c888002ffc8007ec906b1981002c004b70e02031e020efe53ec8968056c9baa302f180bcfe5e8cb3a5e46eb5c6cc5ec24516906aa461f7b3000000000000000de04c86072267731e1dc91ebcaf926723c25f053b9033c3a6fc3143412811c10c00000985eebb985979b86e91a5d84496f48d8cfd464596bae93262bca95581af29cd26b9d10534d196ad8b6b9e2c506d5b462e912ee5dcbbdfed362b4a0684a4cdaeecb87cb8fabac8a9a58b8a51ca20b9b56d6bc0c441e5cbd6d0bc8ca95129bd26fa8d47f266081285a2e7fd06a050100081a405b2176b52fdbc437adbe03ee5b59a2f1d287a049b958000000000000001cd012b5610f5816438c38a786782282082180191322a76795096a17495310ce36190179962f6d06feb0b0a41d51291649ee1dc05e1e53e70c9a21683402e4956d53c7d40b7b1d1775a12c969c2765a340d21d0708c1ca18714f04104f00c00900070200200d00013e20ce2b050150330ac194360c8130630983104c18417445be920e68c4e96a08c1098a764903a80efb8481034010a22ad1fcc68c4e882d48180e86984095810492001f27ec60051765008000cfb685c206401000024e418027443dd724cd19509ff250ca6a179202d970680c11aecd580943064021445f33d30d1993676c405ae82a01825451a21e005aef34c0129549804c18320100001052000400417c560bc0305d0182e00ec98345ed2c7baa3502c304d8a71c2b343d00281830008b2674fac2cae8a838705bf241974c78b1c466369a50b3238305a8393667b4c50c35ec6ef2b2541c2a4916953c2cf900007b47bdd294e38004ff2ff2b3898d0107280d853897028f0cc890c320680001369a2397f6e068cae362034201c9800e0acb9728605dd691c481791bfb0098406402000020e416c560b40bb2636db374c74a438c0b1c84fbd4382179b290b0980d0d194006802164d83527298ea1976e9c1117d3b2584c1ab1924009a4e1a8000c59359a00d98cef3800d00400004ac82c82c080140b003a227e12c1486dec8a34d040bb1f028175c0510d0000cb272407381408026101a00800008690570d02b068000ed882a8680021c082a08f3f97a32ce9791bad71b317b09145a41aa9187decc0000000000000037966d2434c89185aee0ad6a93d63c8d0788b1c814810d04a044001000023b08c19516ef2086cddb137f7448ada95bd13a6c6f5d85cc10eae088b43d810cb07735d29162c2f4c634454d08a724bf2a6c0a504c6da46862b0f9a081)) <<< 16000) + 0x0541ee406791868fb7200a223f72b2f3e0e5162341250bc27153a8859f5e5030c03de26feceefc628b003def8c622ecc6323a1006d0f4762267038d2aa00a8f15ee5d35542e3141421668f6770b62240a0d4fd13b1ed51c911c2e0000664414c64000d7a414824002820400640c8289a8007d4482810813c6400882241394409a8204c310259281286400af4240810405c0a006fbf301c5aac6d3c6961031a17743b4cea4825dc729f25230705d6ae14bc8be0408188caa2780c1c00d9c2a38d398301c7a0ba32caf050119db19a41ba0001b5fbef3ca20441036da420f0bc14183ca93d6e8695cc73fb1fb83ad34626455b3ee118514b4ba860895246e69d666a0d6175d2cd19fa187d59921b47ed81c7b7604dfa9ba69770e22bb8508c57b5fa26e49b578431498e7108b6bc671da940126494e3a31d3a769853e5ced4c2dea5f9ef70146d528dd5aa1c522ea3a6d8ab6e3dee655e4442de62ab89fe40e596636ada5767794324c79183c2f383c306b60499861e28b78c1002b5c51012060d00400002fc81f02f5d70ae5cf3d4dc7d32210a62042258c30c404284204104380081b1337760278101b01a8248080004c0c04d953a3edfba04a8c3d94f9cb68f820cc01a9547b3bf7bc4b79a9cf213787fac475cb7df739eb8163f847860fd3a0505b3fdd5db5d397522530987545ae816b2f17268f7e1ec6d557be0bf43b9582b9cf7c62152eae9b4796dda308b6d4e3e521f8a6d589022bae7223a7491e4d6ff1c355d436e9451aa872f496af5d5b697ad2b01f1ac88beb1817959d79f52420b9a29dffacb77ea5f3f237fbd77aa4f00ae1ad8ae9e10d0486cf3e80dc98bf08d962ce4ea84ad7e8d5acbda4b2a96dfa0c84a1f72cf8a9c44aae778cb4007b3d584a3428d4442aa69d80480500036e10471d8230ec114560882304311c01004011aeb8572e79ea6e3e991085310216e6fae224439fe8c4c5905f5315c39f4bc9882ac00000000000000d744ff383b2a955b7b3df8de34010f15ca7731700000000000000034299bd59210102f07ba46185340b50c3281200040b24b86c4ef5692a67e28ebc9462be489f90427cc18e605f18836f8f77920487c211de5643652e8c5b1543165c730a1589d84492bc5512bdee59a601074f2763b7f305da0d1760f550d775248d280a7a94500054d2084130410980200c1000607e0303e01d166a0730201183064c6002dbf1f260834008a2fdbfbb0c08ba27364025df0c528009b86c04013625b09410640200001b670d3632dc680aa0ae31000c0042000020080000223e154917e3026f1eb06010914063001700801e80800027c8000af903c0d81d86c0e80607203e24b958bd8a2cecdc223420b9c2645040b9df2c800530ae184a1036010a03dfbd88009002200002008000022300016ffe84057bbbb220417008000035100010020701b03701f01c167f828cd0eff715d7ec210cb11ff369379a14861fc1a0abd73ba571f75a90c000632773ebe6c742ef07b7271d0ea6a4af14fd9e5317726ab56693eb848538001ee960003271812824d8041721542a1753e35a1048bdc20b6ce99ed467b346ad7ce901e7c5d7dc2f2e4e472e4d7490edf0adc943990f90b8ba336d8833e4e2006c120350500021a1034110003489000a03360404ca88047e98103f8024b212834191fc504c3c01127395d4a05f200033e802424cb2e0d8d24c355a67154d9d16e08cea170ed4b5a0e4280086041ef389ea2e7103958683d1537cbeb9a2c223275dbd732bb054948b5e97c7d5dd02b85f9768aa460f9199187709da21dd7cce8940e19b1dc15c4a995af56ef84b3c7c5417ee82cde7b76c68d4a4e229a1a578ceb3f29de68d50f1fbff05da0009dd9627cae6a31cd32e80198a80c854000aa840c454060120015bf205e2202e010011f5102d410161e80acf4054720292d81414809c9404c420251501204808c2404412021050013b7100c7ca201f26a70822f302ba3843bde41e03059c2bda62284568e5c9c202568db4b41806e590de80202b56cd810a824da302d0653f0855263820014708d11465d03059c2bda621421ac460e9080988d02bc84005957e2100801e543dfc01016bf030f4286be8670a053eb3b833231c1080c00006c481014b08195503018290657d70a106a6fd8850091e3a642001a9bab80c0117c1ea02022a96341d00471ed76c8e2080c0d4dd5c070c9d0ffef060c0000255040000e884b0200208c96ac10004d25aa410102728200084885e24180f08123ce469560e22a13a2943181adcc712c4300a84da11cc000c851c2302050a21cbbfd2459ab42881028ee76e5c7093ed7aac3803b9d243000946074021849934d7b2c941fe7f460ede7d108b1e8ff4080e032f51b0180001859013040d8043090d05f69164a29954aca2400012a860e1b2b69e2c0f4ed54884a103a0100000f2203e1b01e01e943961204c290d77c19a44787781308b014cda0827998a7880166c1e44c0036010d281cb738661494395ab2ca00004aa1a409b6eeb410456a4c64601e006a1198007402000022e407417a50fe0e1230a4001f1e691289bc70c22d3359f1002c2b7b125041b0086940e4ff9f30a49f0c2d1a409b9d744b2000012a8601e05e76225041d00800007810001f120381201b0900024410006e92000ffc406864032220009632030120170100058810163500a84800321080a22804cf4024720113500814803c9401c4200d1d0060c802c540141a0090d00404801c0400c02001162200afa00429001908008440020200001011f059)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 41 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoFifthsCase1" = "QuadParityTwoFifthsCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 41 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoFifthsCase1 private def zz2079:"s081f"="s081f":=by decide+kernel end section namespace Green24Proof.QuadParityTwoFifthsCase2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l16 l17 l20 l21 l22 l27 l29 l33 l35 l37 l42 l44 l46 l51 l56 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x128d84da, -0xe4e1750, -0xdad6d26,0x5a1aebc], ![-0xe4e1750, -0x89895d71,0x24894ed0, -0x19d343c], ![-0xdad6d26,0x24894ed0, -0x63dcc8d8,0x115d4c1e], ![0x5a1aebc, -0x19d343c,0x115d4c1e, -0x7270e00]] noncomputable def hinges:Hinges:=[(-0x620085,l9),(0x604f1a,l8),(0xc46d64,l11),(-0x2600bea,l17),(0x353f643,l16),(0x1a36fe6,l21),(-0xe514c6,l20),(0xa281426,l22),(-0x7270e00,l27),(0x7270e00,l29),(0x7270e00,l33),(-0x7270e00,l35),(0x7270e00,l37),(-0x736d14e,l42),(-0xf04700,l46),(0x8727f0c,l44),(0x7270e00,l51),(-0x67ffe66,l56)] def normalizationDenominator:ℤ:=0xe4e1c00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x7270e00,l27),(0x7270e00,l29),(0x7270e00,l33),(-0x7270e00,l35),(0x7270e00,l37),(0x7270e00,l51),(0xa281426,l22),(-0x736d14e,l42),(-0x67ffe66,l56),(0x1a36fe6,l21),(-0x2600bea,l17),(0x8727f0c,l44),(0x353f643,l16),(0xc46d64,l11),(-0xf04700,l46),(-0x620085,l9),(-0xe514c6,l20),(0x604f1a,l8)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x6143780ed180a00000099218025301000918e205a04a880280000510c83003d003000005943780ed180a0000004206406b3010000000841900726020000010c0c003acc0500000000421c07180400000000008c0620080000000008a01440180004f0841100e500400008611024034a0080000000028180f300800000000783814601000a510e0980c6100550220b04f00624200e000144450980cc401000000000000a0640080000291083007500300008214824043a0080028c3502a03bc40140000000000b80c401000000000001c0c80100000000001c0290040000090220d014400c0000000000280c4010000740d02101e10040000781082801e2008000000a124406c3010009190205a03e280282852050d40189100600000a2330d00e20060002082206009b4010000000b870481e80100000000000240c801002063881680f8a00a0028437822020b4014000198440a807280200000002886c050c030000e41103004da0080000f0210480c9401000001906c1605e8018000002448101b0c04000000001c120798040000000001901d200c005588708c023080280000000d84c050c0300000000321407180400000006a1201a300c000000ca13012860200000000001b0188020000000001a80510060000000621602c300c0000000050281e601000000000044074803000000002e0a029804002882b822006d40140002a04e0a00da80200005c0a01c017500400000000013004900600000000442406300800000000038012401800000000012014802,0x2e0148020000002086601418080029c39047029340140000000000780a40100000001282402cc03000004a1304805a0060000000001e009200c007904505a03188028000000000d002c80300000002a12805980600000005821013300c000000000580124018000000000d80248030000000340480518060000000640b01c300c000000d410802c602000001a01040098c050000000032120398040040c73846011040140000000c45a0686018000611741802a10040000000331580a180600000006a2d014300e0a8c08148043948038000028a13c0768c0500000a21204812200600000000a4580e30080000000001580c40100000000015402880300011a3c068013a008000000b468140a400800a190205a04a88028000b31881500a9004], #[]⟩ def dynamicCode : Nat := ((((((((((0x2c931dddfd124e9e45208920b60e28c50f325a010247302162b0e008071ddc40002ddb10ce083a010a2a054cb362891c43f04cb2143587b52880cb1c1d0b180bf28182c11f7f193c00006d617a9c0078021455d2e945641a48000043cc9448e1a064b21a40000044239641420e78631630a2f047521428650131e6161934c7e376160152b31877749002401c0000eb100033820c00b8236bb55baa207158ddd574b183d9be7e1246468af3c84b0ca3cadbdc2423d732e6b49054c70a1442003a92301cc50029125f3616690c220180000e49b5d1202c76cb34cb91bee8b24b6f4eb91bee883d46a799984ef51b9c8039d06b1c567c33be580cb3789390073a0d638aa1c99429029018e18c00a02918d58b5fdedaed78ef9127f77dca0f11b4d7250031cfcb02abbcaf9d209c79bd4a78e44b299b55788a190e508f1eee85bbd610d32e28001c699109c72158bde48504ca4f7bc07139d07f3c4f67f8d954b99ed0611b7847626cec4b55837b7fb050011453e5a11628c440d1fa00200fc2517ef5e237fe87951bb01fb93274e63d60d148332fa4123e71219e354eb5e839f0696ae14984804a515c050ed29b53769c09316119428a2e0820000e1882f8cc0d83606a13910c03e04451c4968011218610d210eafe0418eafdb538100c03d85b54047d6e99e1a419ffbc878bd71c79d94708806122428123f60ae085a824a6d561d1402d398d6307646a2a992c1684e455a1e51c4826c1590b4335538afed39c416fe00755bea137bfdc26b82972b233c75ba308deb6d80dd50ebef6ea6c31aa06432a45770d16b44403c1c56a136898da842012823478ce281f570ebbb98f964230452ecc23f6ef7061f714e46e89bef50242461c764a5243aa012c42e06354c4028285260abfd5998748fef254b78689c7dd9bc852e520a4d00175d3e9e2741e0c05086b02c4a0a4f760c3f0694dba73b8d6df1658c198f828375a6cd6e22ee6fef7f116e5a0093320e779a80001b2c82f0a80021e8f09e7625c882d0c970008ecb951423518bcdb3a517caac42b31ac40a46b7d4ed2920701be38bc830812ef509a3f32789f1aad3a57450a0e275004903874e6c0a876238bcaf47993977cc62fffdea899a40af5431597ff10699aa0f572ef862fc70f27c850bc218000337381591591318f62025424b9f3e8c304c6a153adff0c010cea1a1002140d98d6eb2fb020129f29afb2680156480861a40921ed0db79c8404eefafc848c32f31615820000083c82e988170560b60a05a0170a084c7043ec1828e24a4b40b050886593a94502011689f66c60c800cc1f7281071c0685f0c766605003259dca6ea1e8522ed0fa81427a371f3cae941c60a80e1239ed2d783b0710998d79e26387b802e3ee11832c0e09dc40608775054920601143d5c4500bb2438782145f0ba8613d461425024710d1040c1dc8e1dff0a055271830c2acf0d903043) <<< 16000) + 0x3f17322c05040f48c858f06087fa83a0f61000866be68980b3d7f498880b28e284e0580001bf20006f84164670306652b0a8388cfce76ba9018dc4588703869560d10d9011f9e1b57038562ed03840c09fb1acfe8300655e49380c90104403091c4adeb4479034b881ac422056a8f0b16038843ce1e7144100002ebcc101fcb73c9fe1c2d24cc95d8080d24c8b418000014b416a8082301c0000e2991c97174b66c819ee7d2fee881540da6bd74710b8dc1308480f3074ecca470ba9d26e690601199420b80101481d50ec9c88042402040d9ab7c7c308162a8b592f8820000388802030e4c7d90a387414612ba080b648ffada0e100007080010126bd3ff18280000070800c1208460380001cf20b0120003a820ae020560102a80815004000f204094960a6430521d8288ec1406609e1b862cea1fe019af138a2eaeda37c0f514be47643412000000000000000e164e761948312acd73139c18ea3d68a029e3f4a5000000000000003522041442001c014010005012eb6241b9407e33eaf59e8a9212bb116575c4983e8ffc83750b9b32692ab912a8878f82d36ddf1dd738fcf6bee83275f802e72dbf03b8b9326d5a01a3a6a2f817b691a210415847524c5285dee9840f6e21f7dcb9241adcc69dc6adc2e57464d305defc98cf0196f8140803639d7a4001a008619f96ab50c2d4efdeb9838edf84030182a06ad2000d80400002f4e1675d7b9182d931fdc7805913f7040128a5e34001a004616488e654c1679c1448a083b2eb30c1144c4692000d80400002f48000c81a2bb0b46e8a140499f58a0ede9d08470029a2450000dbd381825081c008000076904e01c86fd6405cc0836b98a12176fbeaf300136d2c8400ac61b90300408639004c20360100001133014c5db4b3791292870d4c3ec2bebddae32243696201728060dec053c74a659124bb8d1bc6a4e58c81e5808c40eb69ac717d35878a7840568e9577ee0182840064d13a476c7dff26a34a5421708bdb595b063b04008427c8a085b405c66e69e1732ec28aa791b3ce0060b576ca430adeb217a7709cb351943382e38e56e4920a2a0a84a450f87bb42e4ad80a328a4d900000121c82688c130460961b04a09c020040100760380200802280b14de444105c01000008a40502400012e60200200800002230140100400001110490dc1029c95c68106e91c4600845c50828118e0d8040000284e0cf8c63b0c1df0cdfa1823edeae846103401004801e0de5436a0608745acb3005c82fa64800cefb4470018382f8005c13bda0660c1b008000088103d0582380f851ba4a70ff5e3455fc3f1fb6b20deeaa31f6a15315aaa030466519ab458bbacb0ab2c5cf27c11fa93b3df2f255f5634d1719b485c343a56af8043994d52c74ed30b449ae000259b039506dd4ea9f3bb727d377044f7f42b2d73ba0975c4c82647505e4373f0e000b9955183ce5d2ce202303c723fcc3efdc0fd188171090df84a31a26002b722e6fa0c79d3fe5fee92171a4e906ce206cd372dd95e4fc3d05e3300d6d272498f8c6420ee0000aba684d9d79c5a24b2e5da87cb5cc060b1a109e938b04aed1c32d2f7774ca78ca0ca8d36761188945e7c05733b1e434047c1fe3c7c1237508ab7798a2fb576434c0d96d7122000868c2a3c115014966b8d08c56e71d43fb8258af1a1802143ef52e7e8b7acbaa41560668d2c5ba8ed63cf5305051ec41cd9b734cc7bcb6262c162cc84b32119a22d6af7feef31f1c85f8873d7286c94fdb611ac651ca82380002739000c7b30158e43af415d3653072cb2b926bd9b9b2be4940c802080c07b6d72a62eac9e76c20897dcffafce1c147b0801e361cf3eb0e875b33974fa317da40eb13694ccd808095af7a66cff1dc6baa064de726a072385a57edc6dae26254fc8d0509b943fbf2c755b86d2e324a02140001ad100123f204a1bb06928fc2201f74fbd0306171ae7040231c1a0085569959ec9a5bfd2213b9b5d4fd5d417db634728f338000000000000000000000000000000000000000000015c4a6578fc21c0b6d57858825302cb4c7f04ce1c7a080d49ac1542072c12012c010004cc5c9dd2e93504f0f44bb189baea41d62530905133589a04d3b076e73d37b6ba1907aafeaac820d76383aef550bce6a607e362c4cc1a7040a59318e60c01b5ea3a0e775000493208c330451182206f86576a8f861e422e1e280346e468005bd06362805070680100860bc002c8ce84002ccc75822001c00840000401000004460080200800002220840b0410582000e0000200803f0180f80e00002008a280999a58822149d2c8c00218db763001c00800004c9f0eb518989012305603c03078e2980142f28d90106402000016e40006a0f1e300808700c32b2d2c05b68de011860c804000025480e088000b50f01c625afcc0fd5eaabf5fd2585fedb62044300455726631acdf9f316f636895405225401f7ee22826a44ac6ba28e009c502fb5c0b5ae2e31c40abc883ca479277489ce3b02e0c65538d15686da7a44a85b9e76c6d4e5fb25261d38283c624ed9b0382449b2faae5f998987fe49235f890fb8296f88b748e11f112e3d34509c7cb4d5ca01fac04338551bd3c0948e88daae7c7bc500a9594a4f29f316a288b6d0b23e39039bdce121914eaa84abe4fe06bbe886589490000b6470917aadf491673d4e72007a97d3c5023181a00801f00c0002d080055a902d2148645b2e40cf45de286ddff6f8d0bf6f31eba743365ab13f0ae636144a21fb4b00b490fde801effee35baf28438776c03032a076fdb1217)) <<< 16000) + 0x6067ab5786711a0604462fb8610175bc81006dea4dae9fc3e4abc1c3128f374c3abbfd3cada8200d6c8cacdc57843eadee5539957f70d054facf4b747a0588f673653861f947eb67387c2792891d9f161ffd63c0bbfd9d6ad6fdbf73a92776a8c33bcd5007a0301a0181e00f4c5fcd82501615e5f5345064a068a14097b0f400087a4701a860d00200ec178420435be4058d2031868a90825ec8001e529384075133560594406c0200001d86010beed79006da765c008850640200000ea4000a40f0c34272f8a0805693f340e0e0fda30052b817814190706c020000194648a8f94db3010e9a1651411546a831c04a505f20c0034dd7600047108ca05019880700200002424040040013f44005750800dbe90038843dc8437fca72a3a696553013200000000084430c8087083086003000002d883ba3d0e2f3221f017cf01f7143c092c06812bd5f103289a5d6900c033a46c70166d325818086ae2e465041d0087185877109b1218d76b906b103161dcfdec2820fc29163c90252ae675a800007d00bc5042301800009a103a0981c8480e0160004fc40dc4606c1303505deedd9abcfbcdfccc8548053bd1fb55731c7a1f3c4000000000000001c2c9cec329062559ae6273831d47ad14053c7e94a000000000000006ace7ed222444b850cc301de05a873a5b76463628900000000000000000000000000000000000000000288ee421bfe53951d34b2a98099000000000428288402382302280080a54900401a00082c40d0140660a0320101880800232c802342900547b37899ae0db5587a58396014a353cccc277a8dce401ce8358e2b3e19df2c0659bc49c8039d06b1c550e4870460440470040030050f67f9383ab33e2dc269c830ddf93ebc73595256e8a98932ff4de5c5af9a8ca43f1c09ba3d3bdc8cc46560ad68eb1f77529beda2ccbfcc5203dd4cd3fc147a9c1892c096b640d561df45f00ed9a9c9e725ba1004a1cc3671a9d2b6dfcba441a1c3db12650abdeb0b6e65632d8ed500770e16452053f617b07a0aeb97764955abc87fa84155e49a8d4b72db73899679702ce70500c43457ce34ef78ac7e8402123e14a18309ba3c4ea01e037e6dc74aa42bc54cb2f5a4bcb8238a0ae60c7115850ea4d513050b69da19040a61195a83063160bda1058d8c958082368294824c183801000011720601302f01c8cb1cc18198e22c44bfd804871ba7a1940a0924cbea90083361b57e614000003cf004806ff850c38400f56481c028688142201c0090280006d4d912113888b1ad90b4512340891d12416310eca60034ade106018c5528293060d8042c844d97302c6b3ab2e224638db92d1c4144032c14409f42f33020e702f708211f0d821270c1c00800009f9bc4cd706daac3d2c1cb00a6027bac84300171db2cd32e46fba2c92dbd3ae46fba20f19429028c18a08e0000011b1f8314f4c88a80a870a7fc33b82b953dd33def3b1ed0e53469f9cbd98c8610861b680013c902e0dc8ca3fed2d5244513de5770e236a9db490508cc881dc41845a1cc3442800000a4101204bc8084942006917dbb828468142101c0090280006b480036e1a1f033a9d0e30321cea285e808d9040a68c8eec80757b40e0a029df6c90c06ecf2913800d8042156592125f00bc3dcfcc1d3ddf402115fc77ea97095a1ad99c800000000000000cc8a1ca14814b08508308804a030000200d000192205a0b02c0581582f013dd6421800ba353cccc277a8dce401ce8358e2b3e19df2c0659bc49c8039d06b1c550e48a1ca14a10604504500300ada391e94eaeb7934ff59a90fa3f3a9e266e7b1465521a22a65fefef0d55af74f642bec70c97206e1ee7e60e9eefa0108afe3bf54b84ad0d6cce4000000000000006702105ddd2bb848f71db1ca7a0a0d11431429421610a10610a09400180c010068000ea10004aa20542391302c4b47f21c40000a17fc090f0f72cb88608210364909d0907329a2cf281c0a716a4ddb0300000142ff8020b25577192275c40980c122946791cc942000023281225f31fc3d8e200002328121ad45885604100004650120e9b089c800905851d00002328479c408005000034040201400070e40a40400175e400671c81406809c0579c4f44a47ed21af389e8748fda4403cbc4cd706daac3d2c1cb00a34808091db2cd32e46fba2c92dbd3ae46fba20f20e10a10e08a08a015006ea21b2022980a41ff1364886678e16f1c6847d66640a7903e0793795150e38de6f2833120249985b0128c5993b6f389e8948fda435e713d0e91fb4880797899ae0db5587a583960148ed966997237dd16496de9d7237dd1078c51060c50850490030053f2cce891bfc050ac41bd92e85995a92eda15759457f7c604cf4af810f22dfc47b7aa81dc8f6f89cb968ec31664d500032234425c4dba1c22954d6d1829ecf0471423ab11680c11663a81140024b0685026141c0085101bdec1307a6d343afc508d97f8bab5753ffc1e4305265727b8c9982f7984206e9f372cb79f0751ad8902973b41e38fd00b4504300a69b6ca7bef5606e9820013a1bfafe693d5bb014472da4274182c1a26e8d52cd38c6b09c51202e00005d440986400086840941604803023014097700bb97eaae8a18ecd3b2aedcf42061568f18190600e117aa3f45c0810400b84dc1aa78578c066d305eb58d5a281aee8a88030f60a02079d65ce261275cc2c95ca0c8171842605046511f8d42c84117e45c428118c0d00420b2e51d3f414264e5372d0a7dedc9ebb0c03b901169da110f305c783770131e36d85160c7)) <<< 16000) + 0xf6ddb27f7f73054d0b6adb3a40e37df1cb65c72ef4c485a1974c2187c18800010b9c0830a6f05818a0b59120655de82280c638340100000a036507bab2e5851cf04791020d00400800721aa802c430635e0a51608f7db723839e93641200bcbaff2800d00438e276e0b1218ffbc8460f700e485834b605b1c142be400e054320b26001900800007f9022050001071e384e07aa160c5b862b0220c1b00800003a902109c000040100400301f01c0000401184084315c820c3436c7011cd1cd8c00640200001206c1071540a005f8f8b4e01468e826803d991f2c005461d32820c80400003708000e2191410befe300cf4bc741015f63620230c1a00800004c901c1100017a1e38165adce8668c7d0c78cdd06d44ea77a28ef0624870c2d106defdd89a620729b3ac14478ef26bcad37b86018617cba36c029e8c1de1b7b62ee5e4846d8a81f3019803b45db71cb01d069a73334e812785bf7275f21ff733376465570ca2bc62b63c7d9eff484d9e3d0ab8abf2df3642dc94dcd18ff551a63ff5d18c5090e0000fe8d03b9bc630c1438315844103201001305c0a22ada44b067bd0c2011060d80400001d480f04e008020080130580e82ec15e93c9bac3a2c2962c3b2f608e7b081979aeb44450b2f7feed67ff0457c89e96990b051f1683c3fd317e4620216d0c1be726b927256388495938683f2bd78276903e5b4fb0e0ee6fcad0678c4e501db1758296baab8879cc033f09d3752eba5285a5f9a741d0e2b50ca384c59ff47fbc0c61237b08ff6c903951187b4f46d5a8ae574aa0f783259cf805c61faa534ecf1dafd8f510b3d509b3679749457267dcecce9d1f77091d6a95d48ab04b31e835f3a756b7f92460a9ce5f76ddaee839dc21433ae59508798f548766ac10363f0f07a8975631c6f7186aba7e0001b9080e088001d80d8629506e65d23306f7705f3b02e018305f55c9e8952cc1ad6000ce52618052da5656240a5f15af9d6f4409090012f37144e1e533f9a98e9f7298287060ee6ab2b97181cc0714eac36a27fc03470f7934796e8830d22780002b720016ec400581ce06121761c802c799b95330ddd200b29d981210525a016f4a9d085cd7ddaabef99eed4e182703bc45e71d0c7f5fdbfa1809642f12d0a01ab2abe3ed6637bfb2806d5426741dbec181c16c5339d613310b9399d720cf5834d8832906e3d7f52d27979ee2033d3f267d152ce6e90af906fd5dd0f4748106508821a400d80c0680603203b281cf6f23c600c0d50e0e1e822e14380cfc28600d5fa6b25041a0085940084659c1c9975d64868c4bff8a1dd7c1ba5007e9f2392820d004000038480c02fc6c0e8efecec753428805a0369d22670521890c3dcb2eae1d8512f0b0e0475061c968b0114356b206185e7316784398233cb396738488a046217cb53a475b23cbe9f940ce63b96ca60c1f2f72b995b510d8993cb7f9567178fc1683db50ce780abdd92f0ff8c71d9941a562b4c77ade0aa30640f51a7484d6c4a090c368e0e856f06a8d18a33ca93f30ad6124320e982fd43f102c2661cdcd73050da21810fe134e717d85fa4e50c281038ffb42f4ec1c8de34cfab2d4a009e5ca397785380efcbdf970d608fadda923fa0f61ec0c439eaa96adba77f83bd1ffbf52823309a0000c3880a048001cb0d0635a363100a86d8201831113139001dff508012080d004000030480050a9e30e56d951830b5fbaa402ec5e128b03cfe6b28c011955481400f396e808330c0d8040000458e06ca3f220900cb61008606d9614718c206c02002e030160180a80fc66dc3eb283ed09b5180404358230418008506ba0b1f0c2ede0f3900827fec8604995bf0500f6f30025041900800006e1a0f03125c602553fae20018008506a860d230254c8f48615d09280a0226b3692000c80400002d480a02800053880984f8f0ab4e42058124e24039bb64a40106d340212080c00400002e08001eb981851b6f0902902d96b1458fdbc7c3061c9f8dcb00003da28c023070471404acd916213880d804004804022020001642000c94404004002bdc400bedc8019001003d193ca7a0cd151176f594a400000001a6bd7459726502c87146106085084003002020dd90bae2db8e918c541dcfabdd394e4d036d58e5cb82300937860e40c2e51826a9ea6f60610000465006051ef2acba283125a9c4a180f5780cde02000005dc00a3821080a000058080784c0382601a0b00c0580580c02805ca7a0cd151176f594a400000001a670909c6741268b2813d2e59f7bd46ae5a94c5f6e00000000000000000000000000000000000000000000154861070c708608508404400006e300200da21af0bcb650d5c565c62462483b400c287c7dc308003e93a063002b0c1e108007c655913820e80428af5e88da228802746b782863955b2e8185000009602c202d8018224200f3c4d9202000009602800aa09a242804200080000c19e53d0668a88bb7aca5200000000d685f759d564bb57dfbf9d92941bc41a13504cc00000000000000000000000000000000000000963b9086ff94e5474d2caa60264000000001099239429229028e08e0058200401a00054e40242787b9f983a7bbe80422bf8efd52e12b435b339000000000000001989041031221020e20408209000860400401a0002c878f2bb127a0b30e2817b32f767e4060000249f000e18fb5db14d2240000005265c00e0036cd012bc428000000927c0087d0e2054050008010000df9000910200e12000b95200c0a0050500200800c04001f904008d4002020000100358f1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoFifthsCase2" = "QuadParityTwoFifthsCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoFifthsCase2 private def zz2080:"s0820"="s0820":=by decide+kernel end section namespace Green24Proof.QuadParityTwoFifthsCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l14 l15 l16 l17 l20 l21 l25 l27 l28 l29 l30 l31 l33 l35 l37 l41 l42 l46 l51 l56 l58 l59 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x12c3b839, -0xe4e1750, -0x10203906,0x6f1b18c], ![-0xe4e1750, -0x86bfb9db,0x24894ed0, -0x1d32a22], ![-0x10203906,0x24894ed0, -0x63dcc8d8,0x115d4c1e], ![0x6f1b18c, -0x1d32a22,0x115d4c1e, -0x7270e00]] noncomputable def hinges:Hinges:=[(-0x620085,l9),(0x604f1a,l8),(0xc46d64,l11),(0x321b2e0,l14),(-0x127d20c,l17),(-0x2a718b3,l16),(0xd812fc0,l15),(0x24d4842,l21),(6,l20),(-0x7270e00,l27),(0xdadae,l28),(0x7270e00,l29),(-0x16ca8cc,l25),(0x1674a00,l31),(0x228e7a8,l30),(0x7270e00,l33),(-0x7270e00,l35),(0x7270e00,l37),(-0x68a39b7,l42),(-0xc29f2c2,l41),(-0x16ca8cc,l46),(0x7270e00,l51),(-0x4a6f15d,l56),(0x133af40,l59),(0x200c5e0,l58)] def normalizationDenominator:ℤ:=0xe4e1c00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x7270e00,l27),(0x7270e00,l29),(0x7270e00,l33),(-0x7270e00,l35),(0x7270e00,l37),(0x7270e00,l51),(-0x68a39b7,l42),(0x24d4842,l21),(0xd812fc0,l15),(0x321b2e0,l14),(-0xc29f2c2,l41),(-0x4a6f15d,l56),(0x1674a00,l31),(0x228e7a8,l30),(0x133af40,l59),(-0x2a718b3,l16),(-0x16ca8cc,l25),(-0x16ca8cc,l46),(0xc46d64,l11),(-0x127d20c,l17),(0x200c5e0,l58),(-0x620085,l9),(0x604f1a,l8),(0xdadae,l28),(6,l20)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x11032004000550982808d0030028426050083401000721501103250040488230250377401400811c41603310040000000541806300800000000060148020000000641c0a3008000000003301880204045788b0310401400711844600e5004038460898019240140000001506038c02000000054440a300800000c42701b0c040000000a4640d3008000000002f018802002c4540d8058401000001c4510320c0400144410580cc40100002c0d8340710030000004219014300c0cd14224804410050000000641c053008000002a82808cc03000000000a8052008000000000540c801000006454480a4008006714c46022100400000644c180b40080000001915028c0203345089202184016011811100246100600000811840c83010000000000140c8010000000088703300400028a4940930c05000006448280640080063144410259004000000260b014300c0000008824050c0300000910d80493010000000090701cc020000007a0a023300c000000001e014802000000000140920080000000003c0c8010000000055013200c0089184430191004001a44108c06240100000001a0d038c02001342104803240100a20ae08801b5005001482a04803d4010005409c1401b5004001702807005d4010000000009802480300000004424063008000000000240c8010000000442c063008000000000e014802000000001c009200c0000000012014802,0x638a700d2301400001f4670128c040000798c1018a3014000001e0c4054c030000000007c062008000000001d018802000003208803930100000ca1140648c0500000490c40ca30100001261ac0628c0500000490d802530100000120320254c0400003384700d230140000134370128c04000049861018a30140000012064054c0300110350740c84010004f0841100e50040011821044039401000430881201a5004000000028180f30080000000f07028c0200000005424093008c708b04602431006000000000130320040e10c40a408c5005000000004400b200c0c113610807550050000000b4140a300a422031c20245d006000104240a025400c008b088120115004000110260b035400c000420c84408900300014c3c0c01c400c00031158480d1003000000440c00b300c0000190b060290020000000ac38063008000000002b018802000072844026b3016021c31820245d0060000000000b03200400000001b404c803000000003c00b200c0a210618808a90050000000004c0620080000000011018802000000000070320040000002111034c020000000008805200800044118280a9003000104460a029400c0000000120c0cc0100184510580cc401000310901303310040000002209022300c00430c4210259004000000220a00c300c0000000005018802001d034084078401000002d11060350020000000b43c0630080000291909035002,0x240620080000001a09018c02000000681100e300c005413437012900449c33c128069240180ac12618406290050000a84819015400c00000000160148020000000a428063008000000000601c8029183cc21005f6401800000000290188020000828e5024c3016c42060b701be90060000094882c0a4008000000250a014c020000003a0d01f300c0000311b120290020018455048048401000002548100a0c040000e8320c00a400c00000001e340cc010000000006406200800510cc2302690040000003211022300c000001a0a4078c03000000064540f30080000184510318c0400244540ac0ec4010000029160901500200000006c2c0a30080000000005c0c801000000a249014300c000411c8980d9003000104420d00a400c00841841e0159004000104420d02a400c000000026240cc0105b0710d4016f40140000001d19028c020000000a4180530080000024904050c030000000088f033004000000211d028c02000000074640f300800001c4610318c040000004c8870340041091c20b00a290050000628a501923014000002c8f00d4c0300000bb1d0065301000002f0730094c0400000b41d8095301000bb1d0150195004000000be3b015300c00b71e01a031500400000b11e40653010000002d0ec054c030000000000303200400029108380d90030000008239014300c0000000032014802000000000190320040fb1862280d29005,0x3b0188020000000008406200800a32307302ad004000000000980520098210d0c2023410060000c8461a02c400c000000001d0248020000000003c0520080000138110058c040000004a0900b300c000250982402d003000000001e009200c0f208a0b4063100500000250740c630100000000027018802000000003400b200c00000000d404c803000000003700b200c000001509402cc0300000005848073008000001608404cc03000000002c009200c00000000d8024803000000680900a300c0001a01040098c05000000640b01c300c00001a8210058c04], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((0xe30b1ed4818c33dac37428c2cca403820d2ad64ac888c28d03630b0d1411c06994a00588a472420004887db12901040028e382b6699071a503f0a83cc9ab96fb9c42723d0f4f1c183097a78494d589b980074021c7749797c68e344274725a7987d4d86f038c07611fce9e3b4cce2670e146a8094cc88000002a303c030f63cc94a0008405000031860580001c20038bc8ea632446967ff69770101c0a43b9219c32c3b7fda840309f52bbea70301b7be57000001d4f012181008460400001a220008f6436807a58b068307fa1c496a) <<< 16000) + 0x8e9b4d6984b0559d436a98395f5101e01982780b92afe69800517fe45bb16006e2cb94571000509137645027bc40814018000074c86c82f0a356a13ad034837c8fd32f2c8bce051ef3288194723af03410ad72c8701011843a75ac1c00f3daa6390c041d89fd3305271028480480d80d0000e39c1d1925d4241fca1e1f61a68f94491c0caa7b4562891457c7455c210a082fe6a216d84600331ed85e0202007fc8cc25b9c100fe12c181890d89071c2c0400000f89b189c2028bf4c8c5bd4715c48d16c0cfdf5789770509602440bb4909071e2c4304b780e00c34c998f0bad4aaf2f4860070f81997e40a98ba8d1080a31b88b2af64108af9794351178caaadee3fe15fb071dc446ee282f1481443500005ae78c019766efaa27cc6ff8a50a348d18d2bd3bc1eeaea40b415ad70ea8275759b8838a2863876f53a1e05890a38630f9b63b682b6077cb230057fe1704eaed85d9a9c28034177d2488ca738ddd48bd47d7eefefa334d3fc280f4502d31a2b7392260600000c5082814c35c860ce2ba189afee2c0718691e1bc8a16fd5d47dc815f36bdcec71496cf1318405962550bc8029bef40f01026e46a1040107104040028a16a93d802e7220554cfb6deca8714b75e7309861c31cf036bfdb860186cc12445a1401241e61051021bbb7ab48e141a348c40540780001ac21ac420d5190090483502400075e603495f4c77bb8c1c0ac4e4f15c50d6a1b3f3aa82006dcd6750c40400aef66a73a0a8839cba7e1ca04499d1d5e41b8eeb2386846ad9616c10624d6b66bd920075382903800010f9e1686b75e3f5a153eaafdb840b0274e73d6a6dd9855a181027f9b492a1cef74200ebc151244d89344effd015cb2243416d49167044a0d71c984548b403b2045dc425b11b7b4492f22fa895393021d27f40f968fad9e74bcc412ba3bec45b1140cf14437000063e606210c90a9683025ec232a1da20250f0f556de18242eb0e9e703002ff1727e782811331af01a6200a7b4f807882a0194d4bf22428079bbb6366f0b3cee80500600002062088830d34106908c344361a00a0cf0140ce8b86255e838503282c1c4c305ab8a36d270284a01ecdafa44002f3020de643812d5a77c96e2807b6827b992087f93b5ccad20a789b0cee753387282803448e4a6b404f071074303e919018f4bf09601c382124ee02306619e1dde0600c6f701d00052878224821faca4c120d06242301c47b994cb6ad569e4babfa015b8b535a5d5fd00adc5a9b07823884063863063042822000801e7efa8e9c906c02a0002cc4000c6486710c334770340620a3640630f301e1013b1635e0385373fbc10c08a97758a082545b6230e01a2d55283000fab7440250203c0100cc05c8e03a679fd3081a1d53dd1481029c402040b9104000058794040712daf2db3c70c16c5226da0e126cdbed76014000000ecb8008026cd83a96003289102702806584800084483d80e8801bb9d15c4247832729c9b824647e560b80324485c336a0cf203552ac33fb014203478740221c00646260ba0080139485ed5c7344021401601600723ffe20302385140002f4d804899941004e92049c26d59ad121945f975fe080d427fc217c2846ce0d43431c1509ef365f0c000000fd200d848212812014c140003f064796fab0d9c848cd5bfc652a891226da49b6d901b02ee78ee814203144154d628209289eeb787001ca5708500400b11a668aa7a88042702802c00e47838575751232c2fd5068514000150604089f8ebb692436bc1ada31018000384005083ab289922821153c3bd18000000e101920842020053050000e790003c22196220ca1106484800204086404831c2418c020c50106200800318c82218c30cc61845b0c12d86012c2fc8617c430bd15d109c04a1df364b4edd3d6d88085dbfe501cc1c7551825b2000c9df4f65eabb13acaa4a300a04dda2772cb18160b2645018ef16cffa28e82fe208c8883d0e60d4581d0a79d26091025617e51f300c21944eff43bb9455a201a5394e14c3701782b0bb1585d08c2e4160aa0a0b80168b4cad5acd08fbff8f900023cc16008c406c021e21bf96433c3d6b482e18401730412001155080481036010f3d8fa76b1e707bec013c42275e36787f8dab8424081b0080000609e34722f8f9c181f8884382b65c72818213cb65c2042158bf94006ac2c00260c1b00800008890002c9216e13e22eeb7362042ca94f4405c70ae91820c80438daef2fe7111012acc084145d0a16cc05d24041700800005790b60905a80e02b7513e18390376248069aa6e011880c004000025085a00800092883388e010020080b30185900e01002008a1c90caa941074c0f2c0c9a84a11840b8040000238d872eb74850258ba245003d61a840060e3f20c818300100000b7200033a409034158020960100012190b109e0d725a3e8b0825f08e8813d9f1e43c01b94da26013d45c4c0025181b00860d399e61161223035e3046d265e9e084bcde4102881f680004a30340100000eb20ce230b005e8f65f5a78e1b16720650405b028811860d00402bc17c44d444a8408ac51a396180df74e582260acc0800b9696812840d00402b807e4a3678306123c094e18103851a21039021ef8481034010f268cd0023466b18a48c1031f76f300269d1b824081a00800005e9000195200055070649fc9d07874d90b68a0d6682fd92083edddc0024141b00800006390ad11056028258040009244001b348558aecaadef5026a9e85900b1616bd538714cd7203824b0aae440350a1e0d0876e710ad1924f102)) <<< 16000) + 0x82c189fbc44918e3e0e01cd80190e0b55b2801657e16b65513eb780fd4ffcfb061c3e09058ae2c6d4028484a23ea204108a2f2185600c66e0004838380100000cf207e2b01b0dd0931ba4482882d0248668261ce416182e5e50b81031683870000591d84402084c48380100830100009c10670100026390aa2184c0ae48f8980e490c4a2204183302ed28607cdd8e514128054500502a4034008920d32925490eedfea6060599e04185046eb3eb4c01456c86005025201c00800007c90a92505410829c5414c220a509052048000a00f18cff4b703e4fe6c260c657eb0000e0d1f0455693994cf99e5f3b96c002805811b00134332238c6d508150001802725cbdbc8aa7fb8d686e7c000020041a57bf75a31e51ef9aa328a000000f817dd94212535745c9accf6991098b202b2ed350adca8717157404007d5e66e45d6d3ae63ee86c969f2281df633eda576676a001501ac5000008444114260880bb1cbbd2f9207ba16e24082e008802008020000088c0100401013e020000372146130a209f9829683ed2d444284288e53fc1da3fd527b3090e4922b7781bbd74f9d9605a9f5a504c39e04536a3275c8fe9dd6128f44dce324a1d2cd00ff83f8b999a6603c8e4d231f4382d7a66400694a1dd941bea30507c79a998549001fd0410ba3f23d2eeec2b8fa4982d0ae28e9966e0ab9ca8b310d789fae6387cf284428d838f351a650051e4f710094b5db09840b802000023085082e010020080a00904f808000130800286109e1904e8ac270361361bf08b717bc4d01dcd2821d69927aa382acf01f53b76fa41f243806877704189711c700b7b921c7c576c0c445fd5dccb9de0c98983528a1b03a3c21ace02065bd575aef356449e12a9ec1f0e87e850840d43ae29fb9b5d2509cd19d0257d02b4cebc0c2b7a48e5cc07891f124a7ebc425f74f63bcbe98c0415bfab68787308b98cca50b000d834d61ff5e1c118f5063d9b055f7ccedb266616e247420587280175ba250b7c165b3daa08e5c76e536567c6c982856c81bc41abe47cb1c7c505fc9eab8a292c3e800046620ce2309a09e04eee70c5050f758412081800404c82c260078036fa87dee6f3db197f9abeb7c899a15159dda3f3c1f58f2a625ea4044af1e9672759eea5c431f1db4422a17d28615c23d7c3f2c58153e127365d2c5953755607acd0269e3b1baa0a79427083419d7688b91cd19825cec69b837b3854c717e569180894de4c71d6e67d55f43aa73ddce09d118ae3cb52adae3131e0208b1e43d19d23b06481b3a6b83ba371e07f6ce749362285c9a55059e93e6b088d031000013ec81208825c3412c020005eb204802000c8c212a3b09415c098875c9601ba60c1d23a1d4daad468c31536d34de64ddc9d773a818608edcb01e46821056dabe7ef4f079ef977d9167462809bfb4928300e602735217082df24bb47e154d20fc75b7fdee4b4af1a7d103b8280a0e77f711ee763dd9481f6b49908e8f6037efe138931f55a42a60046651e158f919e03f518f6257da66115456a6e3d1ef03a7d7174a97294cd61c2a767345b7b68b1917bc92ededf238b31ad12106816c004434126020920104880806c04000b1c74a62f46d18656e7381c0f5561b8c0060021000010040000111d2b2d5daa340809ec84b01976fb9180460309e4001a00840000401000004440003d884804e011487e34f74059822e27cbc616446807c00b60b9d8fe762bc07c8e84e86009c18cb91c71147e86a8bad23a40a00feb6c82d09e1fc31ce0b99dd21a2becf2fefadec96d32468762095c95acd6ac9ccf4402e64808d6290c261e32824247748dc3a659c4686c0289060f453e0a6c5ef39e76419304d4808faa7083190f5dbe5920112a0821341a56899c0d4d61ab89fedf7c5aa394da383d3e9441c5c69e1cd59533a18df18b1b1326d93211564046e1580001669067010002db908f1104708c234461181b08b0d84506c224361101b0870984300c0022508429e82108406013e1387961657ccf4145612215cb73dffff3b71281c46bb95a16657b96b9c700fd2756928bfc88bf0d01c74ec80087b941be1603e59dec7ba8273ff2180bf6d1caa585cc375c02223681f05af2a6a5f5a8d7b148186390218562ca425b678e126529af1c47700d4440b2739e12814253c5c04425201a008000077903f19d124ff5a48686438022c3063be8842183001260030009a25aa02884a48380100830100008810821984086f0267f01387d428a5cbc1d4ba8d7a00798c60d6049940b76afc5a6cc5482609bf75054c920810c08708508a000144cff361c39fad0e10d14109eeea464407d984ac0cc0820feac4ddd86d58a9f8d88c691039d00029620520bb3bf267fb76933825742ac8f6f4bef00b9fd1707ab8000000000000001c95b0008b2372a361c60599639038e18c08808c008eb24cc1f0551509f96864d910706165d82af8919900ba10a3cc9c272b6316332ff21491087b016289f22284006c1fc340fc1b07d0583e00c000d3883d8681e834001726400b6c88024ae1ad80043f73074c78dc1ef9065eecfed1f3893350d6df8c2000000000000000000000000000000000000000001488208704204500100000052101d60d8a07acfb56eb0f302d615658830848b64c5329568500b97cd89efc844dcd4be8552ce0859931552d06483b1c5f14b70c6756df0513ab99d8121861488a1434649c744010abc598401b118adb3020d804350e8409f546f6db8790f7a7a888f9d818ddaa5e8ea0000000000000007256c00211441421220a2101140)) <<< 16000) + 0x7e8015463bd585a44852950ac5c9bb681f4533722f664d7cf6b8b7cee83565d1bfd812307ba0004fa70c6e01f588140703578a2662f2b0143734ea7e400eb42e00401e0237a33020d804350e8409f546f6db8790f7a7a888f9d818ddaa5e8ea0000000000000007256c00211441421220a2101140627a1b1a4b1fd9b45ef61fa6202599f9071c533722f664d7cf6b8b7cee83565d1bfd812407ba0005024000ea0e19216eb8102806589c144e93a3a8284301b45c8020921d48803032c1e66041b0086a1d0813ea8dedb70f21ef4f5111f3b031bb54bd1d4000000000000000e4ad80042288207284144182280c816c0816015000183386463597c40a1a35520512effb278a1206aed10c132fac02400e087760401b71ac333820d804288bf19c9b0dc81c4c2f2fc6a28426f9417d0c5104c2f6a5ea1822f5ae1ebcca00873a4cf1f0000138802961810980a00002fa4000b2c8002c810791103c0881dc460ec230751183a08c1cc340e41b0710583800c0037908379681b8340da1a06c010358081a8040023a64017b548038b818084acde84003844eb41bacf1425d46f89978c00509c8df08503dc8752d682001ff25f1c90809ee03399888434de308a00cc9c70940a009a230691182f08c0fc460d023a1e93094d0e228986831442b95d3c404185486820b8256340e00bab3ee0126141b00850f1450d3b0319813edcbe02edd061ee1c40c11934cf5af42de0aba33b8f1b7c0a24f78880317cb2f60e1548866cbac848084268227dd89ad3f19da85698dc93a10589bcecf28462935357b7870b197e22000a6a118d2f9339f0c8b75930d4ee3802b7dcdf64edb05a9ec2f430a23d68482e5e42a16bcac2052d4fdcc28ea2d80003ff20ce0bc180643195dbe123566ad211f2b1830a635c33c0c207672258f38f0704436b32f2ed820e11d9d7564a2404143bd0bbec011a81ebaa948115ab92497511e3e71c2b04400010a9d1c658913943c9c3d1c1c4561000e40631f4de0700a0d63c08928a0d804287cd1d3ee38870686045126adfa6901a00607f0824cad9706018b99cc0800121d5b80938a0d80400004f083302f061de3f6a2f1ee8865614b59f92e6068a9236d6899414ec21d000c7aee92265109fc60cc30514d1d339162fc57ba74ae0ea8122074552c3eddbf326c90b9846dc99528c11c22a24521a928285d9bc083128453e1f1920390060a341b0c0db2be5fba62104a648042023d4a4af13455679493a382aa684a4724a55888f316d710467e4ed261c7d18c00022190006b832315e972d68023e505ff0cb54b1f48047f8e746f209f61208bb1e7923e9c0087035bf8c22fb532bb70239f717c5220c67143f00ae5edae561841498fa82c052ae717757b78b8c1cc06cffce4447d567e86d398d781cf611fc7d3f2c3edf698406f1babf9bf2776c0e8c11143f62cea57b7a9c6b92f34df69051da849a7de3b37d310baa1ce0c03553b27bb70912b67683fb14df0a4c5a6e9c1d2f4ed696c58a090af8c7d4ad884ed06ff374115d15713ae3f0c9d41b4dc5cf57cd4553a6f8a87f423e06aa230edffcdc078c3206861e4018817830da191d7c723e373c1ec9199cb53aa6909a1032e383064a06cdded574a36a24b103a3d1994ad3dbae3cd98160473a33960e1626fab74890153bb0c352f893c56daa2ebfa7fccdfb0c228042284713cd38499432a444633a82f4fe4246104d0cc00018510381181702ec5082199632eed8149e7b205777ea1ee986bb1533df103f04e8fa6d113a90481714203975a551faf2a425ed0c22af8045da450e0143f124006703252f46a6e42a66200603b798917e7d30903d002429834d7f04c220bbe331b85deb0ce4e28981880650d032048000ce080800800353cd12078887c30598c0ecd942829894b8a10a68ee3e186e8fb5c00c22d8c35b0e0004dd610409c507402143847f3c30046183c7e537d460a7e1d8004e28402077843f861cf0936d670d0000007530060009daa26f018014044bb80881910284a0400001b9206c0b920071e30ac61b8f77a306073458987f2bba4601428cc2059b96243235f241de5c4bd9abd60cc30e08516b1be5c75d9731dd60e44104c462983b878d5477afba0fe48010daa5124644c5a47f66d1b0000004e3b0f2b8f7c994b961013ad76791364688d38ef85f8c845458e3c2040c1b0e2e8820000e78fbf5959b3bcff776b2982056400743f54d458eddadd5c15230528528430320310210012ec50a8dfa9f820ff91b3a988887c4f5cc8b763c9dc516846b313bc1264499e200000004cc377503a230c60a5084063846806003002060500401a000218418c17313bc1264499e200000004cc377503a248c588606486384480380004fdeec2d4d43f94de4cca636c267c5af76652ae38aa1ed00019520009946468f71ced7b52f61cb6f33838a5368ae9892409fadd4ad0511ddfb8b8a1338303e70a5921a39477d0134391834db371803bc88e9bd356d3166830c33680864b0fe05a03a869a8ead56d5e18dc6508530e803100c13c07230d3997674ff38120d44c638a06be23b0c7701b268d458a2a86b75cb58141bf48b9b8588865aba4622a86625e8c00a21713f1a594d7a12dbf7e06000000ad429d5d4e0289e01604937644a9652faca6b728120e3bc872acfc93478a1049eca2b72b8634710520dc0001a110381181f82ec5061512094815d9387b061844364bb4b040ec138c6e82c26390a2010801498739ae180129f04e340ce378f788052e5069089071c220200000dd901001000413900141320a41a)) <<< 16000) + 0x002ff4321909f28708060cc1f0f7e742041ce4cc410241184c2e2200e0d189a299a0304b5605ec781035321f7a460c010539a46204008fbca713882870f1d705a12184a05090c36377d2108265130080c196c0cec5200ca7362b510207f0e93ab387221ca06383a00afb659505e8c8ee03051625ad95160a9be500040d834bc18a4ab06b5f202403756b23a9e7994c8010805f7615acaceac59392fc8fdf13c4e870c4b0c000018090611183008c134360be1b05e0d81f86e8499df2a65062ad77504066c1bb188003c4af50c04690658212880d8040174260b00bb16484634b90285bd59da26f061404777cd8e2834343a6e3d0708de91fc344142182f8644544084edb413cd041173a972b8801b65e1cf8859c041301a0158160b803e300ac524a20a1559fe07f182841daaf04971020b77032a986127f37f86a8a02a79aa08e24003664e07381801a866672201342f89b283de810250280000ee905b1500020e905a1540e028fde2c163152b7385048c2e55c20c182854b9728c5894ec978b21210f8a8a58e30222e3b66a0a09df7939f848077c8083e92120844040c184213b4392c64930c474c918506ff4932c4adf7985fc9088ef7c7eb1810760193d8504692eb3180c1348726ee4cc804220200000cc90560180e00e86064b48c2250a2215fbafc8140000d2f00820468ef1902831c5a18b90582013425d80804367dafa80c08000054602809e4b184f021b24408c0700003aa4164460b00b81c0609ac30629b918cb1bd9170e2460468380606c9beb825041a00860c3e1bcc4b1a5821af162181f9c71813cbafb43801c8c7c894106c0200001cc415c160ac0b01c05e9224ab5706909b6da2668c12b7d4a687bd72ec610447eb7304000984bc84c0838010d247b0393f9c400001c20348287c0dca59000007080d0f377d4101c100889fe8082223043a038201133a10d0109c3ffc192083e0200001a83a3d9c56561823cc30e126fe30706be7ec4660903e982c8e50e00490d51243d114b850a8618d32c1ea848f45dde1209982a73c40e06fd02a3994a902c100484bce0247d865a08882819e598e5867105b2703b781223f24e7dbe54e13ef595290b25425ee08dc214c390000690415427a482aa02c9a428921bb1a31326e9e9a1dbb0dae1210066f898c1003fa7310003297e293820e004349142e0079c4000012c0d207184da259000004b0343894d1de041000025807040002a30680543685428041d0080000b5905405e8e29ea77166796367212711838b0208ed77c9109c916da50e0000528ce681f7a7d1b01828d9a7f7d560f8ddc142fc6054ec57911b0640df410a2100053d518521adbf4ad744228001e92c113f8e9f5fc33500051989d7751647cb4c394671688a3651c470c520dc0001a010006312001934414c44001dd6400531482902800696082884814024004088413c14004028185d5f460c092741bc0a0c1487998809d9dc1e8803db647400128a0e00401384609a1b04c0981f84c12c2609403a17c7f0c68e211d9283184c3f50f4407c14a6d8a088000fb032860d804285e7dca3a309e01ad1080fb2246e0e010134510640c1b008000061903f05c88f8436337a8b6f086114e13b2287319abe71554e60d4f63beeae38570b59ef42aaaca4adce60f88400bf5ee7696a828135f45738860461e1c855c3cc81cfe69652d0e635bf30966391e71dc8c58453719cba604618271c828c02300002df342ce9542e0e212a8b628c20a8065c901d24c555881ac0bfbb832860e0042857c020619c76e9f67e652cb8c21199e1a742377efdeedc3185108a3ff66c9f5b2f870e2c4a506de0cf88173ce854df765d8203e5f951ab8706288c6fa0940e00fbaac6bf8f49e4c865e3140a52310207087a9837b35bd4eef73e8ef53bb9e60c590fc00018d904905c89e6639a500582bbe273e0994d04b04cdce45bb30a1854c3541b500ec23b8d229f9f5de207f0bdaf78385f62ca71ea0357b6c8f89a80538ebb5c02464a11001664922d09e59ac29bdafbef78b595eef2a524e280666228bbebcc2ca8af4bf57bd539270a0b8712812e7a1517b0c13a0773aa4401d726c8c2c4a1dd1251be5ecbe6c95c7e2cd9cf4624565641e2b69182e2ba0c58b31d62fc6a2c1974e3cd5ca293440000051b20012e0784806d90c7defdac60a35c9e45b190a8100968fefc318a123101454bb2c611278a102b309c70e92f2f08005ecc527c7ea2906023070c0741a1b505006f01b5324a95f5a4c0a438e1b838000095082410811c5408c12001110208a0b0440182180e822300f0c4053dfd0fc5086d8b950000943ab60090406c021a4c88c3ca50111c8559203065da40808a6736812060d0043cb4ce40f16053969bc20136bbe4460832010f2c4bb44858b5ac56b2c10c9be011820c8040000248c8629739c0c1c1ad6f8a069a23dc3013fe2b814081900400005c100021220005d8410827dad64ba8e0d265c7faaf4e10d379e023acc0de1df0000000000000007084342b2e40e05b18c1ac09328169c32ab3eb727d00000000b30d2660e218404092010002015267ba8006a316cb72a60beaa842cf80b8746ef4b1ec8f9a727a5c186d4cea398639acba847fb0adf67e30215013cdf09cb205c510d6306d12052cf9c202198a3393400b4bcba98002a1da889010740214492dbd641830aeb25f22041c008000039191803871a2450106a50712e80bdc103e83c114900bc9b101801e4b8e09810680200820200011c302956be453435524e5a5868f82b3c60c2a9bec06164536a728)) <<< 16000) + 0x03a8cb0024c1836010000111200076c40fc04000f6840bc6604a2b0401181208e440274942136a889ce00538fe2bf34eea21d0f76bfa4e902b6c1a580fbc90863cc5654e559bbc5c04fdf2b9de003c299686cd6637287c174f50945082e1096f876b03d58cd583269831510ca27107b57fbb28e889bb0c27c202a106dd9dcbbd546b2b0b7de417360f7cf57d73a4f4061cd95d3ebca875edc759e4553006e7ae12228cc2545674ccdd2c67597bda738c3388c810596ffa40e00832ec3920110d4184630c1b00800004d102405c14eb32c0804d94cb629dfaabe577f5b08e40d14fe64707b55ae050486c501a8e79d761b9bcf8b6abca7e78977bd1ecf481c0f394dc4c7787d5726c18590946700b1705a0984786eabb55b9bd3d98f7133979d4d5d481b1dd101ae29c272fcb4f4af7445cc8f134b9c94d4002ec3f7882f3c48538ccb000076474532919d4f02732d6562041a008400004011045ebb88c78ecbf65d9601126a751800d004000024c800068103b01e8698a0472439a4e9c9c053a932c902073e3a8c818320100000bb20740bc0b7f1ba44808229de68a0092c8168800012b3ac149050700200001964000d00e09087ad49422e6eaa840662314c460034010a1268c6c028652a4943406411369003101c2810055210b2800c804000036881c02c0dc160400ba12306bfb001938120d1c3fd90c0710986b6b130dd3734e02e4e0a90a05ca6b15a31d13a0425ffaf52507049d9de2f9f6b8a787504e61bd012630d573b2066cd32945f759a2d06c3ff64c2512bfe20432096007417029fffba5cadbbcae5880c76e56bba3eee942280c07155255ad04082e4cfc75d2a9e8940acab53416a792f840114b532735a2c1f890c6372b11a307d6b14bbbc9830e821000044840013988190880fc04000de440ac840222a018090009eb9a086068c2563c00875137d6d0eecf7f3addd0e72fa21f1b8a555e181aeb5f461212c3a0d9d271cf4695fe4f22d5dfb56bfe9084adf3d36643824f25ec548034202acb400f8641fe7217188b7ceaadf942f209fde1ca781a0146fb7b1496ccd438000ef8a8eea7a7d6d46272a6ac98196b9936587dbf642bf7a6bbfed9bedabc0061307f3a30ef36e0023c8457362de21cf9f05a5c48a283646aeec5758f554decd9d00f097bb7fdb717df0ad1e1ce045623f197129ae806613f206799b43494f0ccc46880698d78304b3efbc94047594ca240186e67612840d80434415504a890c882c05103bbfea90808b7e2330807a9297c25081a00800007190001e63dad64ba8e0d265c7faaf4e10d379e023acc0de1df0000000000000007056c002210d0acb9038169c32ab3eb727d00000000b30d2660e218410104092002013c03b6cc7263fde6e3853ebbe2343490524a40ca294a11b91b2dfe85db80ead12b2e8d50a51744eff17958c5c5d76508c52bae1605f0fa14012214fe82000b53c691820e00428319b88683025cf77b22041a00800003790001232062020004dd204c230250d80886c0f8360481b03d0de085379bb35f2f2e1880600b3b2fc7a2ff7e4e5145bbcb3771d3933bd0cb8688ab8b335c76fd64692e2c90a12d993cbdc5c4ffc0ec2d3afb79ad41e6478ae34ecd9cdb356b034bf7e30eecc349ab5cd9b6194db27573d20a8ef21fc19f0000ec6b76470abaf0cd9ac3aa52b4392347334106ec45aa7e917aabc8990684b9e1c4b0f1e269c502c2763eb13fc30071a0a6e661f5feb8eab44daeb665f8d59c4a333a85e211434b0608eecedf380e9ae129202203181123101900800004c102405d161e4b22201052d710a00a462c14448c606802000013c7046956bd243e375960c1c867dc08c20600200781303b05e875af9854e00f6b6bd18017e0a222400b8810a892080d804000031481d02ec4003a13d3029102f612801120db304498c0e00200002908001379039217814b929c9001b9c3a31000d00420000200800002232004f9d9200187a7e112041a0040000371b0cec0d58b00f2fa88803ac879423081800800004890380981b84c0d817028727934145e24c2ac5023b2e08c8c106c02003a0303501c0a405d0b85735d46ca0291b1a537ff7145096ba0b23d217798e4f54817a5eed1606bf67bab2e58198c0f7cab66c50cb02bab979267657f73c99a5168bce0145715351336db966a6dcf7a306bd0eb1741f8b1555e945450cc191863a8b60000bb481a0880cc240007e840c85406202000657203012000fdb2003ab640c027638c9462e8a637e3c2c341e1dfd8e41f94830640cb26da4754880809a538a293bf2426080cc5df95d7af90ec0c1392faa083fced204004e25d88e9f880b0101490d1751b5a8b63b3235e1c40ec2116188e025748948b429a060c682b9ca47175b85e04046df73465acfe2b0482013af704effef293180060dde7484e1d8f79db400a4529633a97901baf1024ad2e9141441142b000045840bc4604a2302409d87bdc866c60c1c1a0690167135031813cdd3d61801cefdc065081b00801700c0b407820aa6a357a7165e94571e34e74f4401e2a24874305d0bf6bb0dd6e9562f93ae2a6cbcb58c18a6effc9a11d15c7d6c9a07008a75e11e24820210480da99e662cbc1c69a4512ef2c0e8c0a8c7f6d8cb5506b0ee822ac46ac23a04a02ce430384af8131466390ab616b248bdcf46278cf926760897687a941bb919422186d00580b90e1645aea37945b185ea19eb10e11944d0ac135d147385b1b4321812789014be2751baf473f3f92380df0be0a633242e82c0acd3f804949c8d85cd6c112)) <<< 16000) + 0xc991c410fd6e7b7625607e80d96c0baa00187c31055723a3640c5f11800016a90006f520562a0110d00c0080021848150e80a417c4418dc0d8359346608d90a20c102de75ba9d2e6c13c6134c68e12405b9543b2c643a96455471eb42002c8393cc9d81b9e66baac1c21001b34aabb81ed9bab75db52861d9d2f9ba1a30e24218b370964f8d42fdd6e4226114944180461a501c8c5650e352a13141f8ead0e30006727c8a05c103904a083401002401e8613481b51564dd2d142cd40db95b13cb287ab283b94328ccacb8abd12f7c13dba237077c32e2180356abcf4234c5c3f8590ea453908602784574700113cfc2c314691e1aa37c3b7a9de7364d8800a10723872f152748454ced62caf09531b1a6b7686f2f005730a36d425b1e6c2114811223b800039f2050120004c538412cd6e4881e99058d9c8dcea9e9a571823fb16f5419613238817a876664922510122df435c9f8d80204a0f13cd785ea19809efcd162d766f84814bfe9f58fa959a1967afff02c00d3f88df68083607458c1a3f2746184c83b40e212830e4242ccca8aa205edf4378304b3c2a6a4c103601000010f20281b027098001ed10261581288c044460481be204847ba20159f0b384410340100230581102c0800603e03b0cd63c5e30723d6bf088206402161f0065703091d763c4810e935708c206402000012840782603a13a08dc72542cf37cb5fa040939e98840dbef6eba2c005bceb9f39cb0a9044018650310782104d6dc4aea94c854cc5d76340339085ef87adf42cb243c741342414430a800010a900037838628271a754506c7979f9bae817b850de935f02a1f113e80d603047304fc33eeb2ca2ad195b6e07d53734b4fa9d9edfc5f12a92402bcc80c3e039f716135d2a3d344c144a113f08bc8101432504035190bf5f377531d97e0ecfb1b393fd6eab3f2be0938c557f0cf61b6914412d5a95c3e24761dcfe86a12c0bf04962950f2b736c35018b52484da1376d7e88fd6e8cc7119dced2408c22a801100c084060400301f01c010040118653c5e44814794d2440830010000069203c0b01d0580e02f01558cda28183026a0811197091230c1800800d82f4a06da424a299438da2c60763e74b0e587bd8340096d168941068021f6ecf8d928387c000000054fdcc1d31e3707be4197bb3fb47ce24cd435b7e308000000000000000000000000000000000000000005223cb2cb28a2c62824003c02c030080200d00023520340b924f14f04faeccc688cd4d97bd8638243164ddae0c5a193996a1059037f98a04b2827bad12fd8ecfe99be752d9930020e9aefff61250ed9b2b7d13d7d09020c071e53c93758615014ac5724803b91f36b42246a89ccc76d7d77a8af9caf1d9e50630cedbc9a976e0a0b0a854916c1292c4bbe4a18dc2a80003b82000e324001f7080046e1000e11203232018050009569001ed9202e1a0160d00165f1006a5a200fa9e608e66390b7296950408fabba78947ff0a36f87a00000000000000000000000000000000000000004f11431820c21811411010c00414a0a4a4e88c3386254172c33b24cc5d33ef911b574c24ae227dcd0d2df6957fd8cf73d4ef09ee7f6cac022b2fb945d14768709191858d8733923ce6722ca05fda081c4e03d0647bdf048b1664021d6fdfc20572393bf32a5be0e00dfa8fab9445e460020ea4f9a2d8e028009ed8f42e853a10005cd4a1cf65bf3be988490435064514336dde4058a1c0001936b0123e022781a8d245e95b10006240b20475ff03880d3c027f4df0e118d299713e0802f3f0c1d7056140213818000071480a84e4410937b908120ad4b531c425ea0504604fb1b827240123915fc6002126ac20660c1e0080000919a1c26b11a7c923f6e7520d32073b80fdebe48bb0940653081769abd3fe0e01e84ddf6f1800edd653102800fe7e662dc88042302048f3a3a00b17c91784d409c5090280005ec1d02830fdb3b54fc2048563bb2458805b5dad31bf8e0800012f390240834e28b49840b402138180000714d0e4243985247504408e922c6f5b3d481581bab66486bbf8eac1c0202d3840a008acf78d9c107402122dc698b508a0c8cfd34ec486f24282dc20355d23efb0e180007530020924f00bd02820000bb802406afc962394804210140000c710002eb20281b00069c2026230121180888c04037c537ce1ac90bfeb7f690fc1207240643812d322f6f0268c0d0ab92c70e17ed34f61360fa81c587e7cf0c18ef2a94c712e28e3b2f24897814121c069d8db313e02dba6d29962807f4b1f63020e99317993c130c01bc62279ff4b8e189ddf0897404c5ffa1183be5335c86186311c4111c1d6ef891000004b01024fc273c81c4000012c040007f53fe40000e6b2cb08130a0f80428ac4c76450288008390b32c6000009602864f3ee315246000009602820116377a0c0003ba55a270420008515b9670c4dda8a2005c322703816300000249f00286258129ec9a048c00000927c00b000000d9f71494004081b3c1683e83821581600006b480782e49ce26090cb8b540c8de836298287000007ba1cf9c8d717f6b500247093de7616919e81c9e97812e245387f4451a63270ef9b4c2092205000007ba1cf9c8d717f6b50008200001718402932f1cff189702401705348d18e388277e3a1323000146765ad4542eedc002bc234bfeb5ab06709fe0e18c02080003ba201c0200071e20010cc4034140180a000c1920031ea402c940141a0090d00400801c0400c02001cbe200a9200449001988008a400202000010076ba9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 26 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoFifthsCase3" = "QuadParityTwoFifthsCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 26 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoFifthsCase3 private def zz2081:"s0821"="s0821":=by decide+kernel end section namespace Green24Proof.QuadParityTwoFifthsCase4 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l16 l22 l27 l29 l33 l35 l37 l42 l51 l56) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x457f4d1, -0x2625938, -0x2479231,0x12ad94], ![-0x2625938, -0x1563d445,0x2b652b4,0x24ab30b], ![-0x2479231,0x2b652b4, -0xf7f4900,0x2625ac8], ![0x12ad94,0x24ab30b,0x2625ac8, -0x1312d00]] noncomputable def hinges:Hinges:=[(0x1155511,l16),(0x133cd8d,l22),(-0x1312d00,l27),(0x1312d00,l29),(0x1312d00,l33),(-0x1312d00,l35),(0x1312d00,l37),(-0x133cd8d,l42),(0x1312d00,l51),(-0x1155511,l56)] def normalizationDenominator:ℤ:=0x2625a00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1312d00,l27),(0x1312d00,l29),(0x1312d00,l33),(-0x1312d00,l35),(0x1312d00,l37),(0x1312d00,l51),(0x133cd8d,l22),(-0x133cd8d,l42),(0x1155511,l16),(-0x1155511,l56)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x2301880200250982402d0030000000780248030000000d80248030001a8210058c0400000190901cc020000198ac050c0300000000e0148020740d02101e100403c0841400f100400000d84c050c03a20ae08801b500505409c1401b500405c0a01c0175004000000098024803000000070024803000000012014802], #[]⟩ def dynamicCode : Nat := ((((0xc949a0000096c515ca8041500000000001e4961a7ecd054891c718a14814714810806e000200d91cf51bb11c6302e1f8a141c423820586d995c7152543c82401153ad860052553814005702d68001a0080000a89c29774591491016217303894ae254c18481e43580c0a140519880196af1802800638eb50c004e71480400bb7ae65a4820e80a000065880802e883742ae4e2c6233c8e50246c8bfcdf0206660a49b5143177d80200c33453416a041234693a8c8700200205107d737f2c6aac5ac12327a7f1881a49d6bc380ec20d61800e805c4c00320100000ff392934000012d8a2b950082a00000000003c92c34fd9a0a91441639231030a18a0820dc000401b442503c54b1a73871648cacdafd206772da79401416a507009b89be300a37a359c006402000024840009ccc88cab61d48a9edb6ef4c7a91e3b3795ca8e224e951e915dc4ae1a6b06e7813d346e430966e87dc8bb084c13fc947c00f3d7aab92015840396fa38c697420a863f07c31786180125d83ff2cc2d6bee981e45f346ba8784024795f3f7a586f8273192399346cb5bd3966f754f611ca0a8837091f9a207a04590c2440c3f6145502935054bcc10fc33000044320012c2725268000025b14572a0105400000000000000a5b47d2a191a9b80561fa8ca2016201587ea32880543921c31031c21020815644679facf9dd61dcb3cb5f783614873bede297cd0ba0db21a0361a059eca4ac2f022baacc7df93203596df59a4ef9f23fee02d29d21d5f0dee5a6738f58d53a7ce30cabf65dbf69fe07b00c137beda34e9de4cef22c1288591374001190c1721aa3e678ab10f2a2c33c75f0df412c6c610000000000000000d44308604504304600500402120253c576bf6063ac8d24a7f768a6f584798e091a751528721a8fa0ddc9adee290438d000253201e0a00e0140de5e4d2eaa0e14884b97474304def0eab8c0a11afa23b7bc40060b0cf3bf0e016a4b55ef228035f45b7479c188ee1f524b600fd71533870c260344e42ca2b6b741500000000001e4961a7ecd05400000000000000a5b47d2a191a9b80561fa8ca2016201587ea32880543932882052041c41021) <<< 16000) + 0xc16c080200d9c859456d6e82a0000000000000052da3e950c8d4dc02b0fd465100b100ac3f5194402a1c91441029020e20810e08601704010068000d09e23aa38e22030e02610387d264a406080aadcd06101f7c95041040a5d42001135ef427081b00800009a90004ff3868d1cab20c180e02610504c072a66380012ad941802ef1d058a0000003201b060e8020034040002604030460161b81479ebd259b8c2af86fb20901004ebdc0a8b561c8ba83e4ef61c03765ff2e2e80d64803156ba2805d558b38a9b4a4ad48a4cec20141a7611688bc93f900d85b04aceecf3b68d58d384769a85cff8ad3a4ad4fd130df4f24f56b5f51fb6d7b0d7f5262aa604e7f1e2d7478b0a28b621892015953460e05c7f928200b56e92156ebd886080bdcb12800c8042433a655392147f7e0460824b534600b9834e20000c1b40600475a426001900800007f9809ab1d2ce1e46d5dd052e7b047aee79b7e70afabd383c900c827333d334470e51ff10d25f8e461b403d2644c0484141088241cc11c9f9ab66db96276aaa7d249db861146516580d20d39d8233656d8a51f3ee9376920ba14f0f2fa3f58400c764946b9423d7c4ccd08eba268e4f90381e238df6a47f412592e38dfa380a88dd2d361029b44886dd090ceb3d974a2086a0969e6cee9f4c2415669551aa52825792e000143880502e00002008a11764eb861d229ea1004ec67210084b678101c871f4a002e0100000d0321b096594209a7142c28030a2ec00092d53c12020c80400002dcdaae420827ac0b6316c3602b8c82f803d10c79b66c568dd75a7550e7c3a0c00000000000000000000000000000000000000258a0e6e28c681500a8bbf83920580000000009c859456d6e82aa404082580201ed08ebb18d030b6745e088de1566b8993320df72d4ec7415a146589e7401d0548c6a653176c1c65f5802d62773f1e0beff671f8d6b5551cdea7cdfdc24b185e77c6f38bca2048e20d40013548003679903947aa9df42347e80097da1f6b52b59665eb70dc0dae01ff7ae416809c1ca4f5fe994004000df9952ff2f0ac1f72fe86965692f4303455703b414d65f78f1cf2da9f97b0eebb618020079886a4680a0685ba9cd7983b5cb00aa98ed5ef0bc47641a969e0395559de78990eec000d9340fcb2ee90ebf03efc06b6f5c4f01b7d971159f09091965d447d8d84d4482eaafa6d9989a74544c07994ce001bfdb1314dc2c9d4f0bcb95a97c4ebbdfe0a41b5c9bafdea8035a793c77eedc18d3c42730605b627750c8e8bca613c51193a7d9fc2d0b6d01868c202201002008b016c1931805029bc403b898508c205802000011640003208003d290015dc30315fee060f3febdbde4dabe4b783cee5bdd2bb202b0b9f840d086758624dda98081f2601e9a2cb623fcf841809a2ad201908dad96cb206b6c4b750cab229547a2db4377cf028cde4a91b2461e219e7227932d2035a48b61400b5aa1dd81fcbfabb1492a08cd08568dc618945d111c7e428b4d4ad05e7c1f040c2b442cb4daec4cedbe004012360d43c3df0dbd027baccce5102aba6546b7f8d2933c4a6fb5ffae158f80288602ea6e0ef7fd11d7424022e5b365cf0ce09f213cba0df51cd304838ed2a6e67b3741cc97e4d44cf2320a0a27329ee5e448860e6d185cf7a97a23bb367477894dec2cb113f8d90a117d8870737992548a6c0b31f350ec838b46a43027e1065513a000107040087288015281e0ca768418e8cbbe64e1ae7bfffcf181a63b72868c3481c48ddd96d551a202418c669197119d3bf027179fc70500603932bf030affc48b3de0fdff08020ef7da6d8a0d741996519c63b00c04b9757b6f08868bc4649e5b4cd83b852fc36da4d63e72b1029e8589904403db4f6df6b323049777d2d597e8274c25087db42a91831ac5312192ee34480e70bba2306e5ae611404c00200601bd98549410640212395425f830c21966c0c2835f48c4867b75a8901ccacae4202143b50820afe02284e083401000012d3c303fe0388094bf4cf1c2a06a3545080000c81c1092c744801714a3619820680200002104000d1c80480b875dce9c27f5eb5afe815d04bc8990c202c97ce4814eaaae0d23297eb9a08057eab5b4b71dffb5cdccfd967b683015ba02a504aab5f623f3e957c6440de59fb5a178dfa3e77e22f3c90287d0cba1f6c205f6dc00d9021b456001003007014089c2ea220660c28ce628fc8986d9ef24fc820be3144025f119ce2a4d770d177344f2743e368f2a92cf4c763013154e63aa3dfd56226c2f3c0a5866f1c7053d850228069916726ce180c04a6c0535f8bf7a31ae5d5eff34093b4aee5faac8f95fb626f2048b97a61c82c255513d50e6e5f3f2b3ab2b9840bfbe8af49e00eb4745472ea5058d14410f5ec7fc758f4c1e2ffd646b84c745cd363b466de2c5064d4e9ed24159b44e720652118286587532282202598702d488b0c037cf8d0c02281464a082e010802008020000088d0c74caa72818fefc08a08496a6870173069c30011d6900c000c1b44c0032010a1c1496d630a0036691c402fcf0940d9bfa885040bbac12800c804000036880302800082480019990008ab2001772747623fda686357361a8b6ad91d6eeeee89c9f0000000000000000d4450c608604504404400202623f157deaf96e37a0016a8e4d61d7554576c444c8efcc6d33710634737047f1a6d1630b5192184050ce2c460c0255bf01430092c5ec6080718f001412e5f0a6c10000000c867041e0080000a410050900202800c04004020003f620020200001000bce9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 11 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoFifthsCase4" = "QuadParityTwoFifthsCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 11 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoFifthsCase4 private def zz2082:"s0822"="s0822":=by decide+kernel end section namespace Green24Proof.QuadParityTwoFifthsCase5 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l13 l15 l16 l20 l22 l27 l29 l33 l35 l37 l41 l42 l51 l56) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xa0da14f, -0x4c4b270, -0x5601302,0x190], ![-0x4c4b270, -0x298b44f5,0x4169ddc,0x624054c], ![-0x5601302,0x4169ddc, -0x1efe9200,0x4c4b590], ![0x190,0x624054c,0x4c4b590, -0x2625a00]] noncomputable def hinges:Hinges:=[(0x142303c,l13),(0x18cfb1f,l16),(0x40dfb96,l15),(-0x142303c,l20),(0x22e133d,l22),(-0x2625a00,l27),(0x2625a00,l29),(0x2625a00,l33),(-0x2625a00,l35),(0x2625a00,l37),(-0x22e133d,l42),(-0x40dfb96,l41),(0x2625a00,l51),(-0x18cfb1f,l56)] def normalizationDenominator:ℤ:=0x4c4b400 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2625a00,l27),(0x2625a00,l29),(0x2625a00,l33),(-0x2625a00,l35),(0x2625a00,l37),(0x2625a00,l51),(0x22e133d,l22),(-0x22e133d,l42),(0x40dfb96,l15),(-0x40dfb96,l41),(0x18cfb1f,l16),(-0x18cfb1f,l56),(0x142303c,l13),(-0x142303c,l20)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x1043300a0c0400000002301880200000002101880200000000540c801000120110058c0400250982402d0030000000780248030001a8210058c0400001a044038c0300000190901cc020000198ac050c030000188a4050c0300000211d028c0200000001d01880200000000340c801000000011018802000000003c0c80108110424012d00400000001701880200000000e0148020000841400f0c040740d02101e100403c0841400f100400000001501880200000000440c80100000d84c050c0300000c844050c03a20ae08801b50050520a81200f500405409c1401b500405c0a01c0175004000000098024803000001109018c02000000070024803000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x48e35ddd543a74c5d3903977cce0c559fc21448d7a013afe3ee4549903177c5fec39a9401458a00006e201bf6820122000ef22f24bc66e84866e302d34445cc3e69b86cc3b1c00f82510436f567c48e2eee3f163038ccc648d721c171034371fce486bff1dd8e01a9ad803001539ca5000340100001513d8291ab6a90544718814714708408900600501c020080340002ecf1224915f55b71287c461282feaa60fadcdc94704acc29ace912bf8e4606830210dc8cd838d4801f188a8e53dcabc684000001222930a91ec0200695186e02159cf0e3094cb21c1a4893a6e6cfd8bb33842004e0000a7481106c084260400bde81000003cabb34ef2a0a89649241839439238c218104160000401b839e8e1de50f2e04bb923bd0a8a63081e56189602e6a3ca3804cb8afcc00340100001053632ea041c48ca857319036f8317a582cbed639402802116380d6be3133020d004000041c80584c07c17a590f1b6ad35e7071e05964d18c34b67ee073a1c50a6214020efbd3aba612c19276a833ead7f6964a41dcfe08d32356b44089078791ca5aee19d04149041efcad63f27187015e5a04dfea14136a645a61914ba00108291c4b7c66c461375b4f084103ad2804802eff3d06039ec7992800d004000037ce90ba8488c5f56e588127d950d8a421647002905e8718b396d16350dffcf438603febdf6d132e0b7cfcf3cbe469980277cf88d14840097837eed299fda400df23f3cf0feb53d3dd4b561a73a05b4c8fe1f70e4e262d5743a468d4615410c8703537964d40ca08dc2b00003473bd02000007957669de541500000000001d8291ab6a90548c28a28d20b20a20704105b82008037484c959ffdd83ba3a327f4c5ef72785916fbfde970a2bce185fbabddabbe010) <<< 16000) + 0x6bb08771551a168328a6183b53e818020884013e4a02faaaca627dad3cd2005be7cba332f1d380efe2c5b1c100143c82b79204be3ef05b0791551ae68b5b88aa27947299d129411bc56000069a400126cd8cc36a311235132e7640d95dde11405af5b963802f8d3b0c02b1a70c24c183401000010b20019e07408441d0e07167a9c59f01585c00e496560c53f8f27685cdee800000001def49151f109020ab7c38f50a212041570810910710610300200809af636021dc82b20e12726443bf533287ff8ad6c787c267a1ed6437e21ca002de247dfefc585701eedbf9452d49da0006724004ea8e7ea594fc97e6ac93ce9d881e7cf61529088b869660e0df340421c31831031c210208100363161b758c6da1ffbc6076deea83a24531da937994fd61b76a9a92212f59a4668d48d2d3ba3587526fe65f037916e9b33f8d58d461c921ea8001721b24760c6920c4b48b0fbdf885f7ab672d64a226a000000000000001b08c10610c08608c00a00800105983123b1d6999b82c7c9bf0aa1239404233954bfc0968b49712366cc322c7720861b680012e901e2180e8280700503476d4242960e123462980d70c120cc1983000a10bc217d81d1000bc208d45d0e00f41cb37f18a005e10e6cae8008d3ae36f4a2c9beffa8d4ce1c60a00d1648487cb7c48c8e4a0ba922c23e4bfa40a000064010104bd50504801dd42ca0c000000c8028453f84c7081e00c592cdb3996c0918db3d36a7922d755bcf61144000027100500166116dcc70000013880060070e3ffa308019672acfe191010460400001a339fa9653f25f9ab24f3a762079f3d854a4222e1a5983812882052041c41431c10c0040030180200d00013d201c1bcfd4b29f92fcd59279d3b103cf9ec2a5211170d2cc1c08e21018e18c106102088000408eb43216763d0488e0f4af1e97e9c2d7541ba1af7ea92208a38a535e8bb0e290c3750002282000db070dac2ebaf0183000025800a10da8ec38c504d1c2b85a38000000c8018048158e6c04000000190000f59d73902e38e10808000063080d8ac068460321ba203c732535107442b608027dff9ab926f518c3c380adee7fe11b9dc87d114036afbb01b1c20751d84025bdb646b12d0ea8580380cf595f6db8793a90353c09b176072bd025796f89e7098484bb554a1358553b4a488a160b288b033c71257c84f205011bb81624f266508103d83564006c0eb898006402102829e77481188ab024020e16be380a882ccc800320100000b53a424ff3587102c49e050783c87b1c343722e1a0624f9803006a7f604c0832010000101383805038b854558216458d6524860f376bcdeafa3bed16505492177cdaef0e1f44f68876bd2c30458d2824aa5118c884cb4a118041153f31c2496b4d212d72e400362e1f5b8f8703e43d2a6306015ebf6bc2d2c63f2fda08ac73305ed1a61e525d1f5607b4c08f41f42dc261e4e10b42100003893630ea4527ca4552d433341dec80904b3389703ab6a7754f5364032a63e2ee012036d54a91a4141169b42d15a0790ea214ee31601b461e20c274eb59b06e1a04006d9d18ac30080743ccc1f41003c9798ee35583fa101569e02978bb9c533eb02bbf4031371d899e1007d1bbce18b220000038120301301705c010040112382585538052b20630111bdd0201e736c92020b80400002bcd12c068f54b365000a1017cfdf97faa00140c316cc2ef9d8001805bee26daf9d80020132794a06399000103f908469de7e00121538334fbdb9eae3a980060837080000106101605c000040114533082890ce988e2409b4174700f29bf9000580200001506008020080000223423f3ea0030b04480c08393a6af85048f1a017f0417cc488260c02beedd3546ee580805ebf0ef6640f2884063fb1552676213eaf1d0547219bb4482d453b4c1070110000215202a1a00036739fa9653f25f9ab24f3a762079f3d854a4222e1a59838d3b9b3cae14000000df50055f44d38389740b31842022c010008001c2e712b51408bd02ae0de3b8d1f81594f8deec703d3e6a7c97432b9600a07a8df6050705407b47f85289e8ed6e0b7309def8fab0ba275a62878dbbb01b315796f1badf3a659642014531caea0007d84002ac48070cf3f52ca7e4bf35649e74ec40f3e7b0a948445c34b3070909ebda02459088bc0b854fff8f3a67ccfbb8ac7758000000000000001ca0728afdfb0e1b54d81b1d19c36f0bc18216ccb4000000000000006a6154f541820520a088006004000154e173c64d6de2e1382cc275888174de424c55624eb090aa7b0d0bf54907e635f188e9037fe01adca318400f55aef1afffea3d91ed41823bbea675998f6a61f08d0998a6113290b178e8c4318ce45fcd9ad9d208a31cd4f2ce49f6a86ff2c9477d306a34361cbb535a27928b9271ffa2aeb0861ee1c8ec6f994df2468de3cc65b9b7abf8f20eb4aa1602802008cfd4b29f92fcd59279d3b103cf9ec2a5211170d2cc1c6810883a1c0e2cf538b3e02a909ebda02459088bc0b854fff8f3a67ccfbb8ac7758000000000000001cac91d831a48312d22c3ef7e217dead9cb592889a8000000000000006c830c386300280200073f51ef78d7208f9997b7b44f635e35454d6f34a32aa566e4a80903d4f2bd982ad632a32f30dc1ca8c1d0a7878da918e51c7cc3d04b201e6b6245ffcfcef5731799b7244d89ca1c0811ecfd01a69b067aaabf8494019a47a606d9b01a739621515885be8003209014158003499000de220046666427af6809164222f02e153ffe3ce99f33eee2b1dd60000)) <<< 16000) + 0x000000000007281ca2bf7ec386d53606c74670dbc2f06085b32d000000000000001ab44758fd6522272113feb85a426f8b43e9ea0f40000000000000000000000000000000000000009a62063002800800017d0d199c650705b33d8f96fb683d1d249b7b2e5b1fd0fa445dfbfa713e5984f8f3ebeda09fd218a056820502dc6ed50064efb85bd41c81a56e4bf7f64479e0e53a2cc2c442cfccc75788f35fcd8c4bb337da8c092da1a110ff7f96d47008635d81f574f54fdea47515a08f26814af6bf6263f91e0981e319f67873a8529e9b50007462005ade400e15cf0d62c16137b2b021c1dd7c865986f6d8607d5870596533a410130ea4ce5a3e218501dfc18b08f15cc100238fd1474580d03015ff5c332b34800057231dce61f121c2c4a73847b83685092741c60d81e121c4d0bd581d19dc657db255101c07d1eddeca3e9861de9f50c1962c84017d2991a7459df18e00d8bad34f9a978f7d4d1f00a01bfd5c3cba789ae631c314860122e23d8bcefa53bfd0be48303c711080e4295ead816c25676909d7cc3842a610580fc58b1ec6d471eead3a674dd4ba527f957623296b92d52a50af9f253f81b7be28752faed5c5ab5afd6cc56d435e240ab4e4c3291c58934db60ea2e3bfee65917495858aa04807e3ce0ea159dba4be09ae11b4408cd00f1bcc1e3222804497a30ef7582c3692f2927a83f86b171a9e2ba934aaab92437a8d90b66cba8db076646ae3fa48cf6465197ee91d09814a928e33fca0afd911d64f809422a08f1831c6fafe2c66c8b6fa48c592193870049da1706003d1c62000c9eae70cc0836010d2c71df882c80977a00d1c6d551d307c55e070a1e06d5ed1008900d366001a00869dcd9e570a0000006fa802a269669268e60e60840608250180001006800072100020420006586c93b697c0b173b4c142858490b28814c88cb0183126f3c0900be2834140209531e7001a0085923ee32b01629baf367850b0a5cf6d1028796aafe3061e5a2ef9008ed16182082dd29f3e51c0078050000294404c140240a0002ba20015f464508485a890f28a6f2203c3d7d4c90483ff251011eb6538600400ee1140574209810072db8968041a008486e37d7f101f330f34482e388c8900b26c1922020000c81001f46588cc083401000010720221201009005828000ad080087d100f015fb6d53e360c40a120415684810560752f41b9a8f9c0b6600258177deeed46ac6d054c40c5044046005004003b8ce4e5eb74dd33942bb95c51d537dc8a55e40f4aabda2813b70516400b166d8322471b420353709149861e3f7e83238258840cb2d1798499b790673014f97a14502568ea41692bd8fb18b2eeb3c9001c47f7b9f3f92483f95da91708df590f80adfb062ec3923086914040c316b5da91bade7ce0715dd661802aa37bb3542819cd7aab103604036604cf072ad88e0cb3d824b20ff882ce9c60f033ae0bc0ba418d86d0c34b6838cd6284bb952bfe6972bba07edf6e3086212400013c10004cd201c2300d0180600a0488bf6544212d6a1ce8a509725ae4112278e310ef7770927b1a93b201066cdeaec84d05450207ecbd0f9b18b2854d9c1c1595d6d36063b180c374a0674cfb2058764368f880d2c95bc46c17b238fad55e08bbc1404e2905d62ca8ae8673dceb643489f0d820540ca019085e5c1f51700e4a4b1dece1f3a8d8ddc61d6cb08f69438de9982f7bf650d79a73a3c146277f4c4c3a06781121862633460b563bf8582cf5076e2926ad01dc5cfd295ddb3949138ade0eec8eae861279d830d64831a85d89e10bbbfc1405a427af6809164222f02e153ffe3ce99f33eee2b1dd60000000000000007281ca2bf7ec386d53606c74670dbc2f06085b32d000000000000001aa5e837351f381600000000003b052356d520aa9430e00c004004e3483eabdb9c805f927da99ec0deb66ecd3a34eae3edd9f2a1c092f12602854d51a27e5ccdb133217135dbb216ce530cb17d042117f79b4d6737637bf46b986f669e620d90c105b0a08225c8c5e0cdf5465016f7390e024e60a46082c01080200802000008880584f0dc076d1404f56cc240cf9316081648b9890105c02100401004000011100a0500007f90001f434302af115b2d0c3c07549943195c5d7f0a0630b1a5fb8838e064147461d8d29d14282325b890476f8a4095bbb6667b527d81c04c9db0b6fbcf28de9339774b481d668c00d190c4dd05773f82dda66c50740ca030034bd9abe4ecd37f2ec8cb9f765f1dc40bcf41f104441b0829be558d5b161aad556d5827ec6373c7592f566087918040a5a0ead161587a9b230433a7778c083eaf2a400b4cbda04001df9f24c083401081c06f8f26074f6b8e1c31af7408e080c8e48900f996635001900448c53750630510a731181e1183b460c09c34e380aff1f09400640200001b44000738800178100909004028001d3c80075890014da20039346427af6809164222f02e153ffe3ce99f33eee2b1dd60000000000000007281ca2bf7ec386d53606c74670dbc2f06085b32d000000000000001a90a18c10a088088006007de9046c5d6ac4e291f07120682c8df1f2add6605d50b46e1ddf6ed06e0d51279555a0cf67f9c423dbcdadbf2fcf2da020d69f88893f47cc38c19d86c5c2687c71d182d86985e2840000c8050211fab788000001900c014e604216081b00461aa91854f1c5071bb930710000032018404213b48608c42c47a080000006416c103c00800011f200048e401c3400c120050500200800c04000d9a4008a40020200001001bc41)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 15 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityTwoFifthsCase5" = "QuadParityTwoFifthsCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 15 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityTwoFifthsCase5 private def zz2083:"s0823"="s0823":=by decide+kernel end section namespace Green24Proof.ParityTwoFifthsRows open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) def rowsChunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x10304e2ad8005b3a0ae1fd61ec2a00180f0865604e2ad801ab5feaa1602b196c00aecd2da07d24ca5d001c8b6ae1ed204e2ad8012b590c21dd27a89800af8d61cd204e2ad800201d204e2ad8005d9a8e6520198cba00c96f19e1e927a898002cfc6ae149204e2ad8002b1b8c2120198cba00c96f19e07c27d800db6a61fc202b196c00bcbc61ec20198cba004fe9ba6420198cba00caecfd6078202b196c00ff2ebc21f8204e2ad8048eba5860204e2ad803aa5eeb214] def rowsChunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x11fc00198cba004afbeee16c04ca5d063a5e602c004e2ad8003b4e9de15c07a89800286d7821cc004e2ad80088eb4a601c002b196c003a5ee400386d00257068da0021702b196c025adca17d32692e82addca15d31389b426bafa05d304e2ad8005d9a8e653068da002029304e2ad800ba1d582059309c4da07c18e13068da00207c302b196c00295dfa61ec302b196c006b3aaae430198cba002d99cd2078304e2ad80069ad8ce14] def rowsChunk2:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x1179502b196c0139eb69a149502b196c011aad4a21504e2ad8014dfd39e03c10198cba004a8f3ea16c104e2ad16baa802c11389b4019086aa1cc104e2ad800e92f6a205c102b196c004cfd286410386d002178102b196c01b8ae2e2148104e2ad8011dff382058104e2ad80138097ea010386d002540386d002440386d00217d002b196c00180b4de16d01ec2a04ec98a1dd004e2ad800690828a500386d00203c00198cba001b5a69a14] def rowsChunk3:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x117d504e2ad8022f0ccfa02d504e2ad8020b7f79614d504e2ad8018e7ecbe5504e2ad800e9bf5fe04] def rows:List (ℚ × Potential) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 def mu:Phase → ℚ:=![(0x98fa941 / 0x989680),(-0x88eaca7 / 0x989680)] def parameter:ℚ:=(2 / 5) def normalization:ℚ:=(1 / 0x186a) def quad0:Expression:=quadSlack rows parameter 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadParityTwoFifthsCase0.base QuadParityTwoFifthsCase0.hinges QuadParityTwoFifthsCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoFifthsCase0.base QuadParityTwoFifthsCase0.hinges QuadParityTwoFifthsCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoFifthsCase0.nonnegative x hx def quad1:Expression:=quadSlack rows parameter 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadParityTwoFifthsCase1.base QuadParityTwoFifthsCase1.hinges QuadParityTwoFifthsCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel private def zz257:"s0101"="s0101":=by decide+kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoFifthsCase1.base QuadParityTwoFifthsCase1.hinges QuadParityTwoFifthsCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoFifthsCase1.nonnegative x hx def quad2:Expression:=quadSlack rows parameter 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r58,RewriteAtoms.r55,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadParityTwoFifthsCase2.base QuadParityTwoFifthsCase2.hinges QuadParityTwoFifthsCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoFifthsCase2.base QuadParityTwoFifthsCase2.hinges QuadParityTwoFifthsCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoFifthsCase2.nonnegative x hx def quad3:Expression:=quadSlack rows parameter 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r59,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r67,RewriteAtoms.r68,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadParityTwoFifthsCase3.base QuadParityTwoFifthsCase3.hinges QuadParityTwoFifthsCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel private def zz258:"s0102"="s0102":=by decide+kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoFifthsCase3.base QuadParityTwoFifthsCase3.hinges QuadParityTwoFifthsCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoFifthsCase3.nonnegative x hx def quad4:Expression:=quadSlack rows parameter 1 1 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadParityTwoFifthsCase4.base QuadParityTwoFifthsCase4.hinges QuadParityTwoFifthsCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoFifthsCase4.base QuadParityTwoFifthsCase4.hinges QuadParityTwoFifthsCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoFifthsCase4.nonnegative x hx def quad5:Expression:=quadSlack rows parameter 1 1 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadParityTwoFifthsCase5.base QuadParityTwoFifthsCase5.hinges QuadParityTwoFifthsCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel private def zz259:"s0103"="s0103":=by decide+kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadParityTwoFifthsCase5.base QuadParityTwoFifthsCase5.hinges QuadParityTwoFifthsCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityTwoFifthsCase5.nonnegative x hx def pair6:Expression:=pairSlack rows parameter mu normalization 0 0 false def pair6Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r53,RewriteAtoms.r69] def pair6Target:NormalForm:=CompactPair.toNormal LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_6_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_6_hinges theorem pair6_identity:identityCheck pair6 pair6Rewrites pair6Target = true:=by decide +kernel theorem pair6_target_eval (x:Point):normalEval pair6Target x = LocalParityTwoFifthsPairs.parityTwoFifths_pair_6 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_6_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_6_hinges x theorem pair6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair6 x:=by rw [identityCheck_sound _ _ _ x pair6_identity,pair6_target_eval] exact LocalParityTwoFifthsPairs.parityTwoFifths_pair_6_nonneg (hx 0) (hx 1) def pair7:Expression:=pairSlack rows parameter mu normalization 0 0 true def pair7Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28] def pair7Target:NormalForm:=CompactPair.toNormal LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_7_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_7_hinges private def zz260:"s0104"="s0104":=by decide+kernel theorem pair7_identity:identityCheck pair7 pair7Rewrites pair7Target = true:=by decide +kernel theorem pair7_target_eval (x:Point):normalEval pair7Target x = LocalParityTwoFifthsPairs.parityTwoFifths_pair_7 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_7_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_7_hinges x theorem pair7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair7 x:=by rw [identityCheck_sound _ _ _ x pair7_identity,pair7_target_eval] exact LocalParityTwoFifthsPairs.parityTwoFifths_pair_7_nonneg (hx 0) (hx 1) def pair8:Expression:=pairSlack rows parameter mu normalization 0 1 false def pair8Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r18,RewriteAtoms.r0] def pair8Target:NormalForm:=CompactPair.toNormal LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_8_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_8_hinges theorem pair8_identity:identityCheck pair8 pair8Rewrites pair8Target = true:=by decide +kernel private def zz261:"s0105"="s0105":=by decide+kernel theorem pair8_target_eval (x:Point):normalEval pair8Target x = LocalParityTwoFifthsPairs.parityTwoFifths_pair_8 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_8_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_8_hinges x theorem pair8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair8 x:=by rw [identityCheck_sound _ _ _ x pair8_identity,pair8_target_eval] exact LocalParityTwoFifthsPairs.parityTwoFifths_pair_8_nonneg (hx 0) (hx 1) def pair9:Expression:=pairSlack rows parameter mu normalization 0 1 true def pair9Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53] def pair9Target:NormalForm:=CompactPair.toNormal LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_9_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_9_hinges theorem pair9_identity:identityCheck pair9 pair9Rewrites pair9Target = true:=by decide +kernel theorem pair9_target_eval (x:Point):normalEval pair9Target x = LocalParityTwoFifthsPairs.parityTwoFifths_pair_9 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_9_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_9_hinges x private def zz262:"s0106"="s0106":=by decide+kernel theorem pair9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair9 x:=by rw [identityCheck_sound _ _ _ x pair9_identity,pair9_target_eval] exact LocalParityTwoFifthsPairs.parityTwoFifths_pair_9_nonneg (hx 0) (hx 1) def pair10:Expression:=pairSlack rows parameter mu normalization 1 1 false def pair10Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r53,RewriteAtoms.r69] def pair10Target:NormalForm:=CompactPair.toNormal LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_10_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_10_hinges theorem pair10_identity:identityCheck pair10 pair10Rewrites pair10Target = true:=by decide +kernel theorem pair10_target_eval (x:Point):normalEval pair10Target x = LocalParityTwoFifthsPairs.parityTwoFifths_pair_10 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_10_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_10_hinges x theorem pair10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair10 x:=by rw [identityCheck_sound _ _ _ x pair10_identity,pair10_target_eval] exact LocalParityTwoFifthsPairs.parityTwoFifths_pair_10_nonneg (hx 0) (hx 1) def pair11:Expression:=pairSlack rows parameter mu normalization 1 1 true def pair11Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69] def pair11Target:NormalForm:=CompactPair.toNormal LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_11_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_11_hinges private def zz263:"s0107"="s0107":=by decide+kernel theorem pair11_identity:identityCheck pair11 pair11Rewrites pair11Target = true:=by decide +kernel theorem pair11_target_eval (x:Point):normalEval pair11Target x = LocalParityTwoFifthsPairs.parityTwoFifths_pair_11 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_11_base LocalParityTwoFifthsPairs.compact_parityTwoFifths_pair_11_hinges x theorem pair11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair11 x:=by rw [identityCheck_sound _ _ _ x pair11_identity,pair11_target_eval] exact LocalParityTwoFifthsPairs.parityTwoFifths_pair_11_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows parameter p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad4_nonneg x hx · exact quad5_nonneg x hx private def zz264:"s0108"="s0108":=by decide+kernel theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack rows parameter mu normalization p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair6_nonneg x hx · exact pair7_nonneg x hx · exact pair8_nonneg x hx · exact pair9_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair10_nonneg x hx · exact pair11_nonneg x hx end Green24Proof.ParityTwoFifthsRows private def zz2084:"s0824"="s0824":=by decide+kernel end section namespace Green24Proof.ParityTwoFifths open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ParityPhaseAggregation (rowsAdmissible) theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack ParityTwoFifthsRows.rows ParityTwoFifthsRows.parameter p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityTwoFifthsRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse ParityTwoFifthsRows.rows ParityTwoFifthsRows.parameter p q same x] exact ParityTwoFifthsRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack ParityTwoFifthsRows.rows ParityTwoFifthsRows.parameter ParityTwoFifthsRows.mu ParityTwoFifthsRows.normalization p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityTwoFifthsRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap ParityTwoFifthsRows.rows ParityTwoFifthsRows.parameter ParityTwoFifthsRows.mu ParityTwoFifthsRows.normalization p q same x] exact ParityTwoFifthsRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible ParityTwoFifthsRows.rows = true:=by decide +kernel noncomputable def massCorrection (U V:ℝ):ℝ := ((2 / 5:ℝ) * U - V) * ((-0x1ee8941 / 0x2625a00:ℝ) * U + (0x3c9f8a7 / 0x2625a00:ℝ) * V) - (1 / 0x61a8:ℝ) * (U + V) ^ 2 private def zz265:"s0109"="s0109":=by decide+kernel theorem correction {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (9 / 25:ℝ) * deficit u + massCorrection (mass u) (mass v) ≤ deficit (interleave u v):=by have hc:=ParityCorrectionAggregation.correction_of_local_rows h3 h5 ParityTwoFifthsRows.rows ParityTwoFifthsRows.parameter ParityTwoFifthsRows.mu ParityTwoFifthsRows.normalization rows_admissible quad_nonneg pair_nonneg u v hu hv have hmu0:ParityTwoFifthsRows.mu 0 = (0x98fa941 / 0x989680:ℚ):=by decide +kernel have hmu1:ParityTwoFifthsRows.mu 1 = (-0x88eaca7 / 0x989680:ℚ):=by decide +kernel rw [hmu0,hmu1] at hc norm_num [ParityTwoFifthsRows.parameter,ParityTwoFifthsRows.normalization] at hc unfold massCorrection nlinarith only [hc] theorem massCorrection_lower_bound {U V:ℝ} (hV:0 ≤ V) (hlow:(2:ℝ) * V ≤ U) (hhigh:U ≤ (0xf9 / 0x64:ℝ) * V) : (0x49143a5d / 0xe8d4a51000:ℝ) * V ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [mul_nonneg hV (sub_nonneg.mpr hhigh)] theorem interval_nonneg {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(2:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (0xf9 / 0x64:ℝ) * mass v):0 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_lower_bound hV hlow hhigh nlinarith [sq_nonneg (mass v)] theorem massCorrection_coercivity {U V:ℝ} (hV:0 ≤ V) (hlow:(0x18d / 0xc8:ℝ) * V ≤ U) (hhigh:U ≤ (11 / 5:ℝ) * V) : (1 / 0x12c:ℝ) * (U - V) ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [sq_nonneg V,mul_nonneg hV (sub_nonneg.mpr hhigh)] private def zz266:"s010a"="s010a":=by decide+kernel theorem coercivity {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(0x18d / 0xc8:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (11 / 5:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_coercivity hV hlow hhigh linarith end Green24Proof.ParityTwoFifths private def zz2085:"s0825"="s0825":=by decide+kernel end section namespace Green24Proof.LocalParityNineTenthsPairs def compact_parityNineTenths_pair_6_base:CompactPair.Quadratic:=⟨(-1 / 0xe4e1c0),(0x270f / 0x5f5e100),0⟩ def compact_parityNineTenths_pair_6_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x7270e00),1, -3⟩,⟨(1 / 0x7270e00),3, -1⟩] noncomputable def parityNineTenths_pair_6 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineTenths_pair_6_base compact_parityNineTenths_pair_6_hinges x y def compact_parityNineTenths_pair_6_cuts:List ℚ:=[(1 / 3),3] theorem compact_parityNineTenths_pair_6_check : CompactPair.expressionCheckPSD compact_parityNineTenths_pair_6_base compact_parityNineTenths_pair_6_hinges 0 compact_parityNineTenths_pair_6_cuts = true := by decide +kernel theorem compact_parityNineTenths_pair_6_representation (x y:ℝ) : parityNineTenths_pair_6 x y = CompactPair.expressionEval compact_parityNineTenths_pair_6_base compact_parityNineTenths_pair_6_hinges x y:=by rfl theorem parityNineTenths_pair_6_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineTenths_pair_6 x y:=by rw [compact_parityNineTenths_pair_6_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineTenths_pair_6_check hy (by simpa using hx) def compact_parityNineTenths_pair_7_base:CompactPair.Quadratic:=⟨0,(0x3e9 / 0x17d7840),0⟩ def compact_parityNineTenths_pair_7_hinges:List CompactPair.Hinge:=[] noncomputable def parityNineTenths_pair_7 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineTenths_pair_7_base compact_parityNineTenths_pair_7_hinges x y def compact_parityNineTenths_pair_7_cuts:List ℚ:=[] private def zz267:"s010b"="s010b":=by decide+kernel theorem compact_parityNineTenths_pair_7_check : CompactPair.expressionCheckPSD compact_parityNineTenths_pair_7_base compact_parityNineTenths_pair_7_hinges 0 compact_parityNineTenths_pair_7_cuts = true := by decide +kernel theorem compact_parityNineTenths_pair_7_representation (x y:ℝ) : parityNineTenths_pair_7 x y = CompactPair.expressionEval compact_parityNineTenths_pair_7_base compact_parityNineTenths_pair_7_hinges x y:=by rfl theorem parityNineTenths_pair_7_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineTenths_pair_7 x y:=by rw [compact_parityNineTenths_pair_7_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineTenths_pair_7_check hy (by simpa using hx) def compact_parityNineTenths_pair_8_base:CompactPair.Quadratic:=⟨0,(0x36b3 / 0x5f5e100),0⟩ def compact_parityNineTenths_pair_8_hinges:List CompactPair.Hinge:=[] noncomputable def parityNineTenths_pair_8 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineTenths_pair_8_base compact_parityNineTenths_pair_8_hinges x y def compact_parityNineTenths_pair_8_cuts:List ℚ:=[] theorem compact_parityNineTenths_pair_8_check : CompactPair.expressionCheckPSD compact_parityNineTenths_pair_8_base compact_parityNineTenths_pair_8_hinges 0 compact_parityNineTenths_pair_8_cuts = true := by decide +kernel private def zz268:"s010c"="s010c":=by decide+kernel theorem compact_parityNineTenths_pair_8_representation (x y:ℝ) : parityNineTenths_pair_8 x y = CompactPair.expressionEval compact_parityNineTenths_pair_8_base compact_parityNineTenths_pair_8_hinges x y:=by rfl theorem parityNineTenths_pair_8_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineTenths_pair_8 x y:=by rw [compact_parityNineTenths_pair_8_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineTenths_pair_8_check hy (by simpa using hx) def compact_parityNineTenths_pair_9_base:CompactPair.Quadratic:=⟨(-1 / 0x1c9c380),(0x7cd / 0x17d7840),0⟩ def compact_parityNineTenths_pair_9_hinges:List CompactPair.Hinge:=[⟨(1 / 0x7270e00),1, -3⟩,⟨(-1 / 0x1312d00),1, -1⟩,⟨(1 / 0x7270e00),3, -1⟩] noncomputable def parityNineTenths_pair_9 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineTenths_pair_9_base compact_parityNineTenths_pair_9_hinges x y def compact_parityNineTenths_pair_9_cuts:List ℚ:=[(1 / 3),1,3] theorem compact_parityNineTenths_pair_9_check : CompactPair.expressionCheckPSD compact_parityNineTenths_pair_9_base compact_parityNineTenths_pair_9_hinges 0 compact_parityNineTenths_pair_9_cuts = true := by decide +kernel theorem compact_parityNineTenths_pair_9_representation (x y:ℝ) : parityNineTenths_pair_9 x y = CompactPair.expressionEval compact_parityNineTenths_pair_9_base compact_parityNineTenths_pair_9_hinges x y:=by rfl private def zz269:"s010d"="s010d":=by decide+kernel theorem parityNineTenths_pair_9_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineTenths_pair_9 x y:=by rw [compact_parityNineTenths_pair_9_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineTenths_pair_9_check hy (by simpa using hx) def compact_parityNineTenths_pair_10_base:CompactPair.Quadratic:=⟨0,(1 / 0x2710),0⟩ def compact_parityNineTenths_pair_10_hinges:List CompactPair.Hinge:=[] noncomputable def parityNineTenths_pair_10 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineTenths_pair_10_base compact_parityNineTenths_pair_10_hinges x y def compact_parityNineTenths_pair_10_cuts:List ℚ:=[] theorem compact_parityNineTenths_pair_10_check : CompactPair.expressionCheckPSD compact_parityNineTenths_pair_10_base compact_parityNineTenths_pair_10_hinges 0 compact_parityNineTenths_pair_10_cuts = true := by decide +kernel theorem compact_parityNineTenths_pair_10_representation (x y:ℝ) : parityNineTenths_pair_10 x y = CompactPair.expressionEval compact_parityNineTenths_pair_10_base compact_parityNineTenths_pair_10_hinges x y:=by rfl theorem parityNineTenths_pair_10_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineTenths_pair_10 x y:=by rw [compact_parityNineTenths_pair_10_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineTenths_pair_10_check hy (by simpa using hx) def compact_parityNineTenths_pair_11_base:CompactPair.Quadratic:=⟨(1 / 0xe4e1c0),(0x31f / 0x1312d00),0⟩ def compact_parityNineTenths_pair_11_hinges:List CompactPair.Hinge:=[⟨(1 / 0x7270e00),1, -3⟩,⟨(-1 / 0x7270e00),3, -1⟩] noncomputable def parityNineTenths_pair_11 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineTenths_pair_11_base compact_parityNineTenths_pair_11_hinges x y def compact_parityNineTenths_pair_11_cuts:List ℚ:=[(1 / 3),3] private def zz270:"s010e"="s010e":=by decide+kernel theorem compact_parityNineTenths_pair_11_check : CompactPair.expressionCheckPSD compact_parityNineTenths_pair_11_base compact_parityNineTenths_pair_11_hinges 0 compact_parityNineTenths_pair_11_cuts = true := by decide +kernel theorem compact_parityNineTenths_pair_11_representation (x y:ℝ) : parityNineTenths_pair_11 x y = CompactPair.expressionEval compact_parityNineTenths_pair_11_base compact_parityNineTenths_pair_11_hinges x y:=by rfl theorem parityNineTenths_pair_11_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineTenths_pair_11 x y:=by rw [compact_parityNineTenths_pair_11_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineTenths_pair_11_check hy (by simpa using hx) end Green24Proof.LocalParityNineTenthsPairs private def zz2086:"s0826"="s0826":=by decide+kernel end section namespace Green24Proof.QuadParityNineTenthsCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xa7a5f38, -0x714bc28, -0xa9f1b68,0x5bb42c], ![-0x714bc28, -0x3b6b8c31,0xda9535f,0x3877e15], ![-0xa9f1b68,0xda9535f, -0x2e2f5e47,0x71ee2d9], ![0x5bb42c,0x3877e15,0x71ee2d9, -0x38a5f40]] noncomputable def hinges:Hinges:=[(-0x51102,l4),(0x51101,l10),(0x280221,l14),(0x189c7,l17),(0xde15ba3,l15),(-0x38a5f40,l27),(0x38a5f40,l29),(-0x280221,l25),(0x158ad7,l30),(0x38a5f40,l33),(-0x51101,l38),(-0x38a5f40,l35),(0x38a5f40,l37),(0x51102,l34),(-0x158ad7,l43),(-0xde15ba3,l41),(0x38a5f40,l51),(-0x189c7,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x38a5f40,l27),(0x38a5f40,l29),(0x38a5f40,l33),(-0x38a5f40,l35),(0x38a5f40,l37),(0x38a5f40,l51),(0xde15ba3,l15),(-0xde15ba3,l41),(0x280221,l14),(-0x280221,l25),(0x158ad7,l30),(-0x158ad7,l43),(0x51101,l10),(-0x51101,l38),(0x189c7,l17),(-0x189c7,l62),(-0x51102,l4),(0x51102,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1441942100b8200a000000001a014802000000000280c4010000000443c05300800002702200b1808000250982402d003000000003c012401800000640900c300c000340208013180a000001a044038c030000000001e064008000000000d032004000000003a0490040000000000c0c80100000009858146010000000068b033004000682106017200600430901401e9004000000000481c4010000000241806300800c42904604b2008000321504c079003000000001500a40100000006c180e3008000000003207100400001e1905015002003186411012c802000000054440f3008000002c1080f1806000330d04807900300000000d060660080000003c1c0a3008000000002c0290040c608c0ac03c90050000000090606600801f03c084078401000781083404e200800000000090188020000004414018601800000054140a30080000003e1e0518040000000011038802000000001100a401002605810c07a4010000421c0700f2006000000110d03cc02000000843803c6018000000000503200400000000048190020000000002c0c8010000000008812401000000003850330040000002612031805420a404200335006002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x61989e331234b023c02d16582c163f8c25a466c06592053f4dc2c8004a107120000041549c107402165ec69641f0e280000543c59426eb15bf38900001521184a82e21d30b241a40d2be2840c357fe90812df06ac9980577ad8eb091208420380001bd3a41f2d1892c8bd3596e202d072d98a00e7bf0a120072a22520013ad23013040d804000043cc931a582b1486d88a398380000a42671ae49850ed28ed449642d0df12380000a42671ae498506394a26d881668859200f3fe0aed24a62a62000ca0812d9625d9f00013a69c04a83fc2de0c609937d980c3e08c00014c1b288800000aea03b6dfd501712082462060c32422c114008004c080080340003b8f1f3479358e300d950f2851e93d3040ab53a170714a904fe8a2004d4af0403b8431800dc506c01000027476f4e0adcc77ab50a6853068b2de5c1d11852441c4184241200140100080054c8c00803400047080988eca22000002ba80edb7f5405c461891491071061030410470041c0a008036459a87d2c9122b6fe71c444c2b24610a3bf10140a682674201526440012c283400800010e207a2a03c09000121903b11dbb42c3877e15719cd29b8f70410384e4c9bb1d2c05a4f9f1c832f8dd47d42fc23ea17d838630c3863842041821022001a28cc97b55e3c307d09d5bd4a87dc250e73121121dd921d47e05cd233f604aa793cd202c51304050002bf3c9989f2177d9ea7a0db0daede1bc1b6e389f6d9e0000000000000003711820c21810c11801401004010ae982f69b3b1ff115c187702eca65a88e5e1b1a77bfba2825fd8f5525e82dc1872c8a1c2800137103a1d01c88c0e01406e0281b2152490fc70a28c8be450609b2c74ec7c508e1aaa10e0800b9023f8c07015040b150450072b4aff6c050f4e4a3aa08aeaee555ae33921201229e9b8416511ecb3dc818130a249286246282241280140030180200dc28007c2dc61204f805c2493f0a484143a274eff8a1a2c3999648c2044e1218000af543893860e8040000518d922c08de4410c6edcbc50a86a950648b88b98b240a2b4c3ec582145f33c5809c4c2ea033880e0040000504d10249bf4d2053fbf85512202b2cb808123d9131220600f7f1518006373b684000638e0810092f20e40050283a01000017320301301705f119d5fef142254a0d47b504061873052cd15dc9059b911c3c4ad266a65b73e6792410c181ffd6aa320df08c7021410428818cb7fd987c5487b048006dc6c2d9a4a8045c552100005b79345c67a2bf14d4800056f2a5cd29df40e40a21b00002ef20010ba7880b768582845cf084c30201448b228367e2f5e30153b5b0828001448b28081a426e64b6281c00400009f90362981a92c060660681ba20407315d850cb94d1e2d72cd6f7fe36f01002e2fe5c96512ce76fa16667c2925afe4f8e032df9342479d5b819bcbda372dbcfa4480a01976a1c7a97c59db59e11ca3af1e52b31040161e6186af36a4b248ea7e3e021f91b02002a87ab0cdea62ed17eaeb7b68d30925eeebe4b30f9028fca7ee139da8a2a3b474710212ba0827679f698278a1d6ef2fe3b23f9053c30ef1cecd91455d0ad0bc40829a420d438e1df76f634e44ecc5a035904b32b4adadcd03b64698306396121073fae23a4da51fee558f334a17bb9a8eb00770c98abb6c1c4833d867c306f7051d8ff3659e03ea6323df5606f955e245dff08779a0a41980fd755ecabf2cf701f1de2f07e8723a299d8e37ddedc5bb82537947df573df0d78fd7cc4fb5fddd7a1866115800cc260640203101e0cb954dfdf4987282d8793cc9faa20b454f8c9f6157395c046abdc6ca0141cb2c65554ede2d8cc94d03a1af5d20c91a8bf54b7d3fcdc6b7fe38046ea25d4f25b36ade63074bbc21181b8c6b28a163fa23a4cfe7e210053926e6622246e33f27a2861621bbe172a49a6515c110b9272d371468ddb0512192a03116d093a4fea38367e69ed45feb2ae5138c4364c51624c1d099c09f39c51c024d660011860c0042034f7150c102aff811060a80400001a080008b1030098002dc1e38bd7dd848659611f0a08876e7c183b72528040fcb09104000b1029080050645e013880d0042841cdb45e3041774b0c409987a12861428372920103a9f8c2800f6d798098306c0216281fe0d22c404fb33a7061ff6bc050e0d1da7081abd4e2b25041b00858a6a55919c19bee5fa287bf2d01081dd8b176484122bbc94002768cc30015503013820d00400004b481780800090c8001b7902b150098880013988170ae0180200802d01c8602410c4c041f425e860ce5dc3f08000dd7a448083601090ee0196d1413536c183056dc45c20044ddd984002bb62a25041a008000070902b090098480007948128880b0140440a0210500014590181180b84f8e0b9af1870c016b41861df9e00418002e3662200013251c25081b0084100f27630412f01cc8140001) <<< 16000) + 0x91b120004d208a48083601081009c88e104bbf0c74a0c35b02c26083400800009420002dc40ac360541b0290980802c0a00401e039265e0f708210f4f905143d2138808e46808500e49c0c0025181800851577fa68c318e89a486f27780c043e6fe00505058011865deed70e3822b0d1618633639600e00828a0094fe2812860c00434dc0567e308046dd420817b28e24725951930613186d0942060021a6d8da6320801ee906080c232cd0009b309200a360500002246416081700400007b10001ea365dfb3201451450930e2823e039a00742ae980101eb19400d746a80cc203001000010120007f84001324c10fb5bd438fadcbec4084bd362208b9b2903815198d81809573f60004c38300100001072026320006fc204e3b8135cb08303fa32c9020a00238f038b4201274064810500100000c2607076878c36eede850283a1a2000e39b090205402000015240983404a1a0240d01182808804042020200180f80800092880063f9001e8e3e098431c683311e8e8ed245d966ffbc296157266c000000000000001c0115204d40cd0aa51be1a2b8474cda0706daaa80000000000000669a92edde83548d5b8a15351ea0090992f9ba80000000000001898c30818c00a002020000466c22897bfd1d6e62ccfb4a01e3d64e4e640ca6b442460d328719514270eb322e32f5e51800739d61c3ed90e6b42726de5f84ee654f9c0d84babd0a82d44e919b8c204ce6eb1cdb4f126df0d128a6a8293d01e010002c110029442006aae6c5a985a1a41a641cf5d40781711c71c51c30c21c11811010c00400154c90008036b56f8bcae24d1a33e93a45dba8fa796dcde5af80000000000000000000000000000000000000004e12082021c21421c10c004000001070380200d925641e300a20503b1d24342cf91a4070e67c2060d1564ff120830d49f0c008e3200100e675bb405a0506c0215ab7c5e571268d19f49d22edd47d3cb6e6f2d7c0000000000000000000000000000000000000002709451421220e21218e08a00600260400401b6592650b452c50c2e288e8431628000124f8050b49a3160261028000124f80508663f91a4606005a24fc94e0fd070c2602c71c0fe3be82c6d42e49c09194f7229214172c83008a0069893e618025ad1724400ac5ddc60a3840f00a347190c2bf060f8c2d1878a1c0000bb81010b8e1b9108103df8bdc6818e4d70a830041705d300042ec3a26290083e028e20ebeb302690d64b5f12c800000019a3b003afd8e19197581e58a0000e0a0817025f3c1a06beca9f0300173ccf5a40074031c704eea721c6031a3429c48018b019a490697769c40286f6c1a458b038b100000082ace003801000013920005ce40012008002f4100079120012f840744400161e400340080e0ac00c0503012677028400069ec5040547200808fb74b11400adc5d2201a59a080026101b00800d80f0c0005030a1118678a1030631990a04189596012080d004304050e1b840401cc15840a9ed55d0c003f3106101c9d7ef4025101b00800007590001c62034130190900c04c05c2743490ef2a40449d3b30e10084c6e30504d0b410001386d8300851e7286000fbfba4e0834010a181b99538619b619101828e6c54410015fb85890106c02000017e4058260240b0100180780f083ade660910adaa22204d3fa730c0c2bba6f103c2fba88a0009c7c320016534ec9c1068021840392b93244148d13240908a3ad4c0c0eefcd081a5b2d2625041b008000073101505d8e614a12901c2fbd84387d923488612a008722820af10c9600d582da04c183401000010b34320e5e9620835e8220e1476cfdc305bfa549840ad533e25002d625a06003e7966013880d00400004cc80508800133080a0cc04c570100100400900c044040200300f01c043641418342c090220c150084825898f080de4c5a1826077798006e30c4809d539812860b0040000344c0cf1374307555772bd179860782193cdd848f8e39f8769d697cafd2580aa862d4cc54148efe014b810a85e5c12b296aba15a329b6d7bff28c01263cfee274aaf5fde4e6a6c17d4819acda472e5dcd1f122b3c7b600b1c84c95b3787e36343fde19579d2d4743514f256f6613f28ff9949c9fa398471e72732ac3e46f047c38916edcb5a0c32fa1d6621ac610000463201c0a82071fdd3d55ddcc754c75105bb2767eaf14146cdeaa8a2260c505356e53abad1de81674c4d143479dd7b59f4a4a62423a82529408772a16fd7599c9c75c7c69e9f58481d4afe5f3a1b864b1ca21cfa845feacf27bd826c94b86d60a4cdef8f981c82e91c485ee9180253fbcf16e3f6cec19343cb182f512a013b446198456000d0d00602c02c040008764028540014a44002b8c80093510015e1345eefd60aa050c16e82e8018101ca84dc0505041bfe241010032b5bd040021135a2d0800b873fff800a38a1100a38e56eb9e09cc103085984a3b1934e38415dd27d18c003057b1c5866bdfc284861b84dd2f9220083b080610e9201e848061030054410a51a3340e3d23b659c38a0df8ab4901816ed0b0386d4711208c1802891640800b786c70000e80c910000601a914060f0042491f7a2810411219b079891803d135c1220157b46a20434aebdf608215ed6ef0400012e3348ce103e0109181e57df2a920662243aaa649101362d9c67204887fc0898c9080f1c5511f200cf928a8c5030004f3bf7500fa0e104c05800018c20005f240012a48003339009190040a801c2400c0a005010020080021bc8018c80086400202000010016939)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineTenthsCase0" = "QuadParityNineTenthsCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineTenthsCase0 private def zz2087:"s0827"="s0827":=by decide+kernel end section namespace Green24Proof.QuadParityNineTenthsCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xa8dd015, -0x714bc28, -0xa9f1b68,0x368c1c], ![-0x714bc28, -0x3a548e3e,0xd566117,0x3b4583e], ![-0xa9f1b68,0xd566117, -0x2e2f5e47,0x71ee2d9], ![0x368c1c,0x3b4583e,0x71ee2d9, -0x38a5f40]] noncomputable def hinges:Hinges:=[(-0x51102,l4),(0x51101,l10),(0x636ad3,l14),(0x63ce0,l17),(0xdafb2ae,l15),(-0x38a5f40,l27),(0x38a5f40,l29),(-0x636ad3,l25),(0x3058c8,l30),(0x38a5f40,l33),(-0x51101,l38),(-0x38a5f40,l35),(0x38a5f40,l37),(0x51102,l34),(-0x3058c8,l43),(-0xdafb2ae,l41),(0x38a5f40,l51),(-0x63ce0,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x38a5f40,l27),(0x38a5f40,l29),(0x38a5f40,l33),(-0x38a5f40,l35),(0x38a5f40,l37),(0x38a5f40,l51),(0xdafb2ae,l15),(-0xdafb2ae,l41),(0x636ad3,l14),(-0x636ad3,l25),(0x3058c8,l30),(-0x3058c8,l43),(0x63ce0,l17),(-0x63ce0,l62),(0x51101,l10),(-0x51101,l38),(-0x51102,l4),(0x51102,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x280c4010000000443c05300800002702200b1808000250982402d003000000003c012401800000000780520080000003622031804000014848004cc040000000b0900e601000000002c009200c00000001b00490060000019024030c030000d0082004c602800000681100e300c0000000007819002000000000340c801000000000e81240100000000003032004000000261605180400000001a2c0cc010001a0841805c8018010c2405007a401000000000120710040000000906018c0200310a411812c8020000c8541301e400c00000000540290040000001b06038c02000000000c81c4010018c32088096401000003c320a02a004000000151103cc02000000b04203c6018000cc341201e400c0000000341819802000000001601480206304605601e4802801f03c084078401000781083404e200800000000090188020000004414018601800000054140a30080000003e1e0518040000000011038802000000001100a401002605810c07a4010000421c0700f2006000000110d03cc02000000843803c6018000000000503200400000000048190020000000002c0c8010000000008812401000000003850330040000002612031805420a404200335006002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x1441942100b8200a000000001a014802], #[]⟩ def dynamicCode : Nat := ((((0x18633460c7a1a580000cce965a8212a24184c03413d2164822183b902089b305f012000004b189470420014597b7e7038871400002a1e59421e3e0b871200002a4261293a49fe8592128c78d82820d967c781025b498de86015e61ef8849208400300001b33452c3e1331a400000009646470899944000012c163842c54c1a080002570a0036944d0001b2b545050103801000016538394edb9a287b9e37fc5066b3ea8490140785d900099c7161c02ccd50804c183601000011131ad85916c7e53e8ae1a6b0861809041231030619611211608a000e0400401a0001f078f2be444c38c01bf1b650a2c7e36440a853a27038a4f298ae2801eebb6a0803d1ac6e02ce283801000014230369a6b2711860c2c2fb04889a38ede4712f656c3b0c245706ea22414d1c76ce400bcad0a9c502c675cf40800bb2975605052a2def5248c0f80c000074c80986e35b0b22d8fca7d15c34d610c3011862441c41840c10412401c00470280200d8f3dc0cddd6c10faab85a054481891491071061010480050040051c8a0080340003e88208a81002400047240fc47b460e1da2c1f38ce694dc7b82081c77c29f07b2402c00000000000000000000000235b0b22d8fca7d15c34d610c3031861c31031c21020811100c4ffd121d95a95c7bd4dde78aa5c981dced490079e152add22c811cdaac6473ec10b4aa392db52a621cb03473fc9628c22aa8001b11e5597e8a4efb3d27f92fd9f6b2fde55cec9b8427a000000000000001b88c10610c08608c00a008020084e3eac2ac6bc126308cf4e9a00ce787e07dc34b3513dd1884eec62f827010f63cb96460e540009c881f1280f4460780a03b0140d91db04e5c1c28ce44a0170c137a2c01720508d4c9813644005e4d316621c0564df35178a00d8884015c110de438a71145dc80296ab8c7242502846b61645b1f94fa2b869ac21860269651258e50e68c504580300180801006e9600d94ae34a004ca8f945140e4748b212a6fd7c58f164dec72870db23310e000648dc027081d0080000a218d6c2c8b63f29f4570d358430c04a1ca189186109041048001000c060080340003d8c6b61645b1f94fa2b869ac21860259250a48a588286404580300018100100680007c18153a7ecce48804083032049697aca8e20103779c2040dedad208217cfd002800161d28820207d8a1c00a050740200002e640602602e0b8d6c2c8b63f29f4570d358430c04814910810710208504104a00000c0e0080370ae1b5b89d60b184f6cb7110286932f05cac061421ad787761041450342a28c0c1a9c89fad1c307ffbdd224908a555f8d6b100475647a74c07a848813016235b0b22d8fca7d15c34d610c3012862461c51841041c014000000c080080340003e0c6b61645b1f94fa2b869ac21860259250a48a40a58818630007e40f154a3b49925f1a2c2ae454e93c3ee28921ad00016b20741a0004a22000b764003014d100b818de8306a2b6a7a3182703908a40e0c5ef07330604645d83e22801fda97b2100002da39080022892c0300dc061080a20664c31a32c8140e101f381c5ca8b7aa4470a320c8ccf18258ff67848704875680eb18100a757bc8300ba7a649f0214061100e000067081c8880e024038120370101b0080d40400078c40d0a60663b0181981906e7a618b001a79f3e9f6a3059e934b0d2e948000000000000000000000000000000000004612051442001c014008004050d70d308657413409465a3d6b4b1006e41836ba4174044c7c9dc2710211df1f49cb9b58418dafec596e0ac18a98ac85b933a3a18623a55d4c0412387c46ccb4bbc59e1b819df181b3b9daa3c2c6c31fc031a52919600802008b2f034f9080038ad20002c790e4c105c0100001166c8519f703018d2050008ffca02308160080000459031098180280bc0782655359402d52100816d23b0046202c010803b0470610c120087941a604c50649c0c9e030300b08c205c0210080100400001110000cb200025640b8360003d0768c1c3b4583e719cd29b8f7041039012cbb5632205872f5372a0e0fba30ff5828638e4866021821024001b73026280477b499051bc08c3cb1be138dd0384e2b80b26148ec3aa30d17ec210237da1085081318217b329040b33c18c0c2ee9d6fca00777a520250c1a00858a00cc271a180662cc5066ccfba8a1fc3b224206b81a3712820d0042c50c270e070c036347143efaa10040f7b4f6a28003dce5c60006bcfb10007daf509c106802000025a40b40400047c4000cf88148a804c24000bda40b03700c0100401584e8400200968c1800f9ee830eee20bd42044a77f56900074021420d0347c8e18aa96e9861f75dafc0c101957bc08116e33860a001f920f4c0038010000111321afce1fe304f6313f8a0847482c183867e2a0c00ca590400093276213020d004000041c81484804c1400067a408c440541a0200500f828000f8c80c08c05c27873ed78d8b043162fd920003ea6f18002075d4200055180025081b008401004011248034c32145aa5b78858003668ae3001b008400004010000044400034c80008810290d81406c09c360200b0260100780e08aecc7c40909e7184106d8aa0a19956822404829e6280d76c8c002618170086d1838768b07ce339a5371ee082070657ab4eb367ff26bca8d90d2ffe605a24248f2ce8000000000000000385d3eee4c013904b93f4d7e76a3bf5c01cd9c5be166000) <<< 16000) + 0x000000000000e197ed583a216ad630781bc15428a1452431c018000fc0c4c6085c1d4770c8161f36ae29559f35875a00de81a0f093886f8dde2849eb84e26cbe2597cab85300a3416fac1c7d0527f405394503136df5057765bc92d0f7d0e2431520e1aa8a94a2d70ca172f02c72cfcde1c70bd8022c00c3217140616a2d0250c18008402004011a6e6151d1a4814bf690424d7100410536e6120171ae38001b18b404c10300100000fd20002746cb8c9cd016381c2c1871461c45878063ae87300044cde14002008ec02610190080000839000352200117c604d91bde2080fd09070ffcfea8e00be16a0c0ecb9880004a382e0100000de202622000ae6204a2b8000080220c2b060a05a23bc800500100000ba6008020080000223863390616030ca6850063d662016d51109020540200001504090340461a022090108480800403e0201e0180e8080009088008011001e12335207f36d6e133566cddfc897e5f2993a54f11d000000000000000dd9d87f74b49eaf9895878a1601bf7f20b92a2c20000000000000000000000000000000000000004d21861030c118014004050000a5d0e4ce929eec3b9ecb806cc17cf342b81711fdcb85be1da9dd0bdae4a2f72b4e7cdc12ad44bb0bc64ddedf02d9f1e251058e33cb7a0008584009a60801c721e2a3f3c721c321e03b4382814f1546076f1ce108092f208210006ddc181814096a2c11127201b008404000016e3600708a2d10fa5348a10210f2400911c1289352353d8180062ef669a441000852eecc8000043de4fbbfa0004671038e1581e2080999f9880f6b6cd00c197e131f102126a3f428003c694c3002614df040269beaa0027141b0084fc63e78bd0704d98ed648e8355040bf43d0000000000000000000000000000000000008d3e8ae1a6b0871ad85916c7e40000000000000000000000001811421220e21218e08a006000dc400401b42ea140cf2052340cd25092c33b9cb011d963a0a00a77434080153b56c0000a908d009c306c021638d573704d30600001d4c058d0482d1e7c9180000003216285f8a847c2c1079e7cb48482000074fe04001551ee14064404118103881b1783493484cd127832c8000000102c500004ae01c23512a1900c2011c1a02381a96d15da18121e906c93406e9da1248240080061248000751707104b8dbf249a477d23ee8a484363e19d49c0f4b35b61c4000002be5802004ae8923390e00440400001693c41e61e338d2189b6ffc590000070834760fed241c31f1c34fcb180000e0a182e182f55340cf458260400462d0df4800e80638e197f7cc86924f6023dc9240002ed61c404432110348d91e0b52400000231e28c003e02800012620005a840018908003f11000935200177c407034001a524003c0480d8ec00c0503002f024282007799c4071d9b810801d73b48080006d19a08159f250c00b0a0d80228600224dc38400519fe284154c1721024e068ba0838af7274081909684a013080e004288004898e30400f9776102b86dbaa0838d28bbc180001ae28100c7b3b1a013080e0040000460800125901a1180c8880602602e13a19f4d6cd1042fe3c4830c99e0682027f2b1e87080b25c9182a7013d85002f53280400c37dc0a0106802163b6ef5a84862594190e1cf1ff0830605bc2c9200149a263805231aa88004da14d3800d0042c7005981020852baa0870e42ecb8840009c5a390006c02000017a400080c80b04c048260200300f01e103aff3f122142e212409d02d7d881db6b6c0480058e4e0a00225ec21800813b693820d00430800014bc813d22dff1444e82c9040d1e760c24041a00800005d901505d8e5e8195901bb1df0a387b6275a06140a83205803606a21000159be804c183401000010b34303c4c3e20824193c0e10ac0c0a305f43641040df3e8be18003a3f08000117178013880d00400004cc80504800128480a0cc04c370100100400904c044240200300f01c020040110286b9d868885d8f14218950868107725848102c0100000ad3c08971e69c9848152b96033db474df4aff82fe1079d66902e67dc701aa6a1a170f33e280402166146817b710820fe25547ffd23e591c9dc8618618cdc90a737107ad7810bf5f1cd803d79894d49919694687a4905f5bce8b3d078e81fb1b2d27382e0bcc864030e095d576ec63fbc75816ab31da6f2ad685370c0b6bfdb951671fc4163a05a060005320316041a2c818000481302610b79602b7a2a08171de10046202c01000008d201c12a2e6ee01003df7180077b060461028010b2e2b404621028008000044201a1a00c09805808000488805068001e5480041310010ec20029a868b48a5a8d8a183716b5428264d602a080808160ea20008bfb79860006d183810012966870017141e004610614f7207084a766cc60afdc6520509196e36c4042f305ec401438c690026101c00871e1cf8bc366f07141d380f14eac70cfa960974054308033dd120dc01041378c736b88800142a6a4278c60005097c398045000277bb3694009c41018580789247ae57521044fbc749220601cdce2648801b460e0810de002748e2001448b2041000025741000369b53828081f0085142887c240927332fa8d1438019eae3285030bcd6e48a6b7e89d450000cccf313020f804247831699a3ca152e62c4ac2459ed2dad0c704427a3360240e78f9c0e880007ec65880403052c6db0c8704220200000b590002ab200088640019448003c210091900406801c2400c0a005010020080025b08018c80086400202000010017a89)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineTenthsCase1" = "QuadParityNineTenthsCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineTenthsCase1 private def zz2088:"s0828"="s0828":=by decide+kernel end section namespace Green24Proof.QuadParityNineTenthsCase2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l53 l6 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l53, ![-0x7270ba8, -0x3d22a1f9,0xd838736,0x36c06d5], ![-0x98d7cfb,0xd838736, -0x2f2683a1,0x7527351], ![0x258,0x36c06d5,0x7527351, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x258dc,l6),(-0xeeaa0,l4),(0x14a875,l10),(0x189c7,l17),(0xde15ba3,l15),(-0x3938700,l27),(0x3938700,l29),(0x158ad7,l30),(0x3938700,l33),(-0x4cc69,l38),(-0x3938700,l35),(0x3938700,l37),(0x4cc68,l34),(-0x3801d0,l43),(-0xc979a10,l41),(0x3938700,l51),(-0x3801d0,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xde15ba3,l15),(-0xc979a10,l41),(-0x3801d0,l43),(-0x3801d0,l62),(0x158ad7,l30),(0x14a875,l10),(-0x4cc69,l38),(-0xeeaa0,l4),(-0x258dc,l6),(0x189c7,l17),(0x4cc68,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1500e401000005108c04e3010000000000a0710040000000d06038c02000150901603c801800000034240f300800000290d8069806000000000d018802000000000f00a40100000006c44063008000029090009980800000000160148020000000b0900e601000000002c009200c00000001b00490060001a01040098c0500000d4088028602000000640900c300c00000340880718060000020828038c030868c6050037c8028000000008406200800000042140318040000000f07028c0200000000d1606600800000064580e300800861202803d20080000000009038802000000048300c601001885208c096401000000000540290040000002a15038c020000000d8301c601000000000640e200800c61904404b2008000000151103cc0200000f0c8280a8010000000068303300418c118158079200a0000000120c0cc01003e0781080f0802000f02106809c401000000000120310040000001505028c020000000d858146010000000008805200800000441080d18060000000011038802004c0b02180f4802000084380e01e400c000000221a0798040000000032014802000000088500c6010000000004406200800000001c28198020000001309018c02a10520210019a803001582405809d401000a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802,0x1b00a401000000000980720081441942100b8200a000000001a014802000000000280c4010000000443c0530080004a1304805a0060000000078024803], #[]⟩ def dynamicCode : Nat := (((((((0x59767a4fee2ca02d72619451bfeb6b0b218d25a085102231b9728700987a11000018aee89c107402008e03b2e661c00d8b2830a98e38c24c39b983cb2430a9835450808c27a2c4085bcb76c8c0582fba2c8a3821000a2cb8a2e76962ca0af378d93890008cf613092bee54eb2c90af34ea914201fbe4c810214a5f9e2301577d3bf8380002b35ea25208400280001b2200064e68ac7e581ee2c848014ff528818070c032c433c494ff28125b231900410ece953a0c0005ad5730401896be7fa4001000a011c0765c78874a0b2812d1a7e6124f0af912c904b467d1829df76608b08bad3ac660299fe51b9c007402165d0728cdf0b28152c04ba61258c2fd8c2c9054ad6fe982a1ac02000b08d24a0344702002c0ce53015) <<< 16000) + 0x72480401c00013671ce4900210180000dd1000315208c120004de30458913eb016302d70101923156b979d9030387480f061810734b5960810932801209255332c04006a2ed9f00004cbc2ed8064881000800006dcf1f2b49650a145b76e30815920b6ec81005a705c804719393c600164adf850067b3838409c5070020000284606883a61f861820016102442ea532ac71191d2295184504dee249046a3065720021096fd05017d78bd01000f0fe35c046a46078040000352404867c7ec2dfc80a180f5ae5d2850a61a838814b7fe3891c50968c02840825a396a082eb8e26b8804c347a362002f2cbd48024880f00638f8c8def0a19d096e994289f2ead205e0ea62a2043734b3c500718699804c20360100001123034fdd7661860ccd5a048ac3b61b4911f3d69a8e22363e1e184859ae68400de2ff90502625ac8080097d9ac0169141b0080000c510450d02204800127c82184e583b222857270ba7bcb88d103844383665465b14d6d8a6c0aa7937bc10825c8a6495e8b12fa061c3bf75eb3dcf6a400000000000000074d748178886cb9ed9818ea033031d3e0f20c30e18e1081040800279a81c588afc851241d978759ee27b1da15398d09b65115df67b81357dc27c494089546c2a476b7e3f5cfb440168e71a7bb4a70233a21ce653f2a86278fc32ae595d354a450fda00098267937bc10825c8a6495e8b12fa061c3bf75eb3dcf6a40000000000000007512d4d4e7faee554bab734a0e8649e7f7b66dc40ef48000000000000001c90610c08608c00a00802000da26f4251fa93844a32fb62c7eec5419cff65adc57aa304090472582eef07d0d12497fe74689bbaaf2295af3622c859e5e10125f96d2ffd98e3273b167b1b940010d08210e8104140800281b04091472038532e7f56fa18268d87e1c00a119eb51e158800cf598506c38094f0f5d411401a5cd3b58823ac8216b428c5225cefd718e384a050e2c9b7f599859411d103082c87ab4dfb60618672e2da07080822ff30502341b2681201033bfab1840c5954ac10301155582612240084071c60735484e71843249827a616413ebb96459c380060066a90300cd8d84398158eb89ccb9c094b3243ae96058aa82d610c0138caf08c752400900900003b068a3861872e164a3568b25cb1c0027c59a50e0209142c0820672e2da160dafb96be060404117f985007d49119c1400d2ac476492004203003f010000e79c2821a67874cb5e612065fe9a1d4d52498834718c5d5314392c46e546bc1c71c001c030c570c50cd23998f985cb2461e5f1e6ebb400c002dc92c9fd6d43d0901010620a80002203c383b42f4adc247198521b48850601c7869de480ddbf11f3638c18a02d09d8e0c35abdbc5cb838416533cab40805320350850040f783c198b092424009c0e1c6043a4483d308682e3963659059d10ee4081802b85269981536c5ad021c200f9073b6702593aa0860b023164d4a80c017a4a000dea900230200000e71b2453d4e6358163877fb8332420600d59a830c28a05c7197790908011cf70810a1028bbd93bb082042868743c5832835bca3c020040db2c1396909002702c01f008000828e144715b1250d4c9baf248c2494dec60220af79c40004323a23004032ee613040e004000045480039b1920d374b18be2466aadc7deb87144352f917b1c3068600486480918330f6ec1410289c7cf40600c31cef02c0409aeb8c87200002ac100140b4090026030510c9e08ba67943bac34236b250db4e6a83cc08200bfd9d11c404054cf9dd408100dcd80e1418479ed5236d8a0815319d8502007bd0770057d09002602c0000f6181ca10e2d89161f933588086223968b047478c50704534575c2045505064500bcea7f49c107002000027640f42406e02000574202a0be20683a35bc18457f82c3ae289378083a7470c082450b0061cb5f11ce01828c9b173a2284e438643fc40160df052d00023a4fc2249024008c0a1844f04fad6785133144c75c50c3883456fa4060af3e80e9961426f686bbe5c60564ae95c98101dd3151e640500602adac9a00055edc04dc29412004c0680001ed207a0b03c0581d82c0e8076401b7a90520e1c2e2ba2f9840e7f70c25631865d8874c24102936be3a57c70a3579da7662855cb66b27b041576157a2500018d1759a1bcc480128162c802cc7bbc80e1c3d05dbda02073a586e55dc618ed25f4d9c2051e3d4549c47099ba79bef11428f7a7f45dc1053ae241b38180196336711b182400980c00003da68702b6c59012306f78bfec7184124516c28a7bc633a81c414ea5fe48c0c6792615c4064e270e3e280391a95320c01f95fbfd609002101c01c808000740d905747d3cb1a684ae394364b09bb185004c34a20801020108014bd02a0c01a30ed609c206c02000026c6870306618881c62fcc4f7b5145626f1a4a21c4250bd7af42820ab23a8841818efb06d7d10196b59a7f6180078be7b63000396a0faa8d62400900a1438209142c048c1e6ce9b88e30ca6d2e4428ac429a47c0e211a7d83b6303b0773442880ecaf425ba2805067b44b06013c05c5dd20900220240000e31b200b142d96349a151a286d0823b64080c90ef841041c0b4100259294f1803c410fa4e083601000013420701200051e206e0a000c7520021764009678e14ead3946b8c2197e6701c2037ecbfd8f430640ff8048c8094346d8ee0c1002796624142001759d30204509e95c38102da5f2a7e4224008c0912300001518103214c028690181868fd90e195f71c6110116241f538e1005674830)) <<< 16000) + 0xe0e9645e1c100504a82c34a000800500003087293c7b8e38c856495e8b12fa061b6a5c1e4bcef1700000000000000070238a38828838230228020008060100401a0002e240d82406a02034010198080c8040620200057720604302f2181710c0546605a1b814a72f20e69a4ad050f0b05102aa2c3163c3f6dd8c05080235f7d8dcd957c74bb048702654fe83768bafa53077c500a7be1ab9dba2443fa6ac20114e84f234fe1351606480151f6e459eff3e9474e2eee991b4af2003a53d2f0f028081760e42a2c031127aba884581fddb40630500d859734a916a677741fa5bd50510310e76b0f14438056d509fe9956e82c73a1881f251318b111e6e548779327ff4f9b1b19fcd50a54d59576dea41c1b2fe0fde4c066a1bb39bb9c1c04ef66110002ef7d936c92fc3a8888f64077e3b2c93eac4c692883078dee1d2175111032d5971c842e575278b4dc74ea72fd6676119046f2729a10e6390bd0d7c33c3f038d9f73384f4f80b66baeec8735aa73b372ed57108f74b60573c5db52452093663090f3e44010040118656aa840c1c17a56c60a17f3b32850f8ed31e00bc88c09410640200001b8400046481504ecba6f7ba104673da0e011abe313041700440100401000004440b0260560b0000f2362582d9a08107b4cc160882d8e9c01b40ec92005f50684a10300108144416458246bf5900889242102510b40c8102c0100000ac20541381743a9a7016c096844102c010816b54c860f8b0b044102801000006420520b0000fc2000598643215a4dc50436687b0c1dedde202077909cc300034377c800038c67100099d4d809c30680212188f179e2820e4922860fa937761035c08e80c81034010028010000691024110090080009208138cc09867412cff1d920f952db82910a0c00438e49711908082e5ebd1208d42fcf10001bc0f4101187d3581494506c0200001da40783404a1201c090000dd101509c02004011049dce4506043443040d001d6d5d98000336c6140018e7424a0836010a2d0513403431d757907000d3e9fe3001b00840000401000004440003488000e910240d81186c0883601a03927b66fa8410151998808955b4cd007e3f105008313ec025101800851533d3a4245007f1c1c1837a4f41043f5d48480279afa0250c190085147d459438318baf2881def4f1418c306402000012c4000644c11ef5250408f6bd8820803b95c506c0481a3815c83ae004a28300100000df20240a00039820423b0201dd0e82437f1c79cfb351210546db4907a74f322c8183201081fb4fab061a76c8c2c000ea123014534b840014aa1012860b804000035880f8880782403a0a01c0500d828068040004544002214800be8188d83fe889e6b38e1a41ac2c6cd93bfd0000000000000018a88f1b5292a894cad1df32eb586e8a03cba9bf500000000000000000000000000000000000000009c430c2061823002800808a06f833519cf75a196bfa93375920aba0ee2fc2ad6b210a53805b4acfbd9703b348623e11952dd7b4b3a9e4dd76ab18d2eca6a0007d64007dd880268e9e3b52cd121c586986f8382ef88178606e7754b88092ab1221009010d54180ae738b810175e4da88205040360108519ca848c00003ba9e04eb46437c0c4eb9c99ca66b9dc4dd31751ae65509000000000000000000000000000000000000000005021c71c31821c11811011801000b900080340008a880c8ac0080541082c4982027c22004402560bd882118a0d804006007c21d42198207ca754d1408876a90103514f950424141a0084a20d5d6e7c02e470ef544864bd4cdccc3300b8c6084600edf062f986e0c3c274cb9951b406000000000000000000000528696b57b18b02cbe37fb2cfac0b41821010810c0080008a59687211e608e7744b48b569a137c1030c4be1e7bc9ce18c54e6a5bb79b4e2c0a1c0262475d53c9d6371133f1b56dd78480ba5f0b6b29228a739b1400107480027d10170d80b06805427430809f9048810ec80901096f694305e337328000334edc4a0834010b1d6e22f81c3adb2dc09003601291c0070e414401169540940068021638016908387016d890c101a55b33001a004000049100018c20281300f0980680ec71b6abe470f8cd6ee2c23b8494830ad3870d24009d235440076ce3c26041a0084860a0d641c3f2292008182f3ab430bd4b48650106401000016c404c17c239ac84060be3574b2810f89a6820628bfcc280269b0d849430680200001c84024140006024048560222b01015c0350e28211141300400782c0381401a03804008020030070080100468886ef96402ce2b0e283ff3cbc400002e46280bf85f212840c004000036480008b1a2aed388b0394d00400e2151008c4054020000116402c0563193eb9b1c6022f0ea30c126e4f0514e42e580a10285e272c0d7bccce813080d8042464e9e24c0bc16dc1c25d039840427d890240c1600848c055c30606cfe3ee58734c38a6048ede1a4807aa22204a18300100000db200034a4028540005d0402414000a76400177480060d100123d345f1f292980a19103e34e0505d31e6bd820200c04e3c1002a51cd6406000000bb8020060a71bc62851c50840518623bc8fb74759354630786e28bff80489da75bbfe749376460c0000345f7bc5abeeebd100a1813836a98b775853bad2bd14151cf66243f94652d76d9fe202006b540b812d6063e5271000223b28fe05501aabf2940165886babd695a630a2b8740000c2c8040c801c1400c0a0050500200800c04000a184008740020200001000dca9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 18 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineTenthsCase2" = "QuadParityNineTenthsCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 18 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineTenthsCase2 private def zz2089:"s0829"="s0829":=by decide+kernel end section namespace Green24Proof.QuadParityNineTenthsCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l46 l51 l6 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xaf0ddfe, -0x7270ba8, -0x98214f0,0x258], ![-0x7270ba8, -0x3cac5cc4,0xd298bf2,0x398e0fe], ![-0x98214f0,0xd298bf2, -0x2f2683a1,0x7527351], ![0x258,0x398e0fe,0x7527351, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x258dc,l6),(-0xeeaa0,l4),(0x14a875,l10),(0x3df95e,l14),(-0x1e5aa2,l12),(0x63ce0,l17),(0xdafb2ae,l15),(-0x3938700,l27),(0x3938700,l29),(-0x26769e,l25),(0x3058c8,l30),(0x3938700,l33),(-0x4cc69,l38),(-0x3938700,l35),(0x3938700,l37),(0x4cc68,l34),(-0xd0328ee,l41),(-0x1106ce,l46),(0x3938700,l51),(-0x28e979,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xdafb2ae,l15),(-0xd0328ee,l41),(0x3df95e,l14),(0x3058c8,l30),(-0x28e979,l62),(-0x26769e,l25),(0x14a875,l10),(-0x1106ce,l46),(-0x1e5aa2,l12),(0x63ce0,l17),(-0x4cc69,l38),(-0xeeaa0,l4),(-0x258dc,l6),(0x4cc68,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xe8300c6010000c8220c00a400c0000001e0e051804000000001d0188020000000c8b01c6010000000068b033004000682106017200600430901401e900400310a411812c80200000b8641c0a4008000642a0980f2006000000000340c801000000001080c4010000000a8540e300800000000540290040000001b06038c02000000000c81c4010000000006406200800c61904404b20080000016084078c0300000f0c8280a801000000054440f3008000661a0900f200600000001a0c0cc01000000001b00a4010000000005805200818c118158079200a000310c8440350030002208c1405480180000000483033004000000120c031804000000001a014802003e0781080f0802000f02106809c401000000110500618060000001505028c02000260a416024801800000882101a300c00000000220710040000000022014802000000000880c401000000054140b3008000000001207100400981604301e9004000000000480c401000084380e01e400c00000210e00f1806000000000f0148020000000000a064008000000000903200400000000058190020000014864058c030000000070a0660080000003428053008000003a0d00798060000001309018c02a10520210019a803001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802,0x2e0a03cc02000000001500e401000000000540620081441942100b8200a0000011024038c03000000088780a601000004e04401630100004a1304805a006000000007802480300000a60a01be602000000421900f300c000000000a0710040000000d06038c02000000000280c4010000a8480b01e400c0000001a0c031804000000c850078c03000000842801a601800000000b807200800000210880b180600001905500e4c04000000090500e601000000000780520081e41141680c6200a0000000024030803000000000060640080000006c440630080000290900099808000000161201cc0200000000580124018000000036009200c00003502200a18080000019024030c030000d0082004c602800000681100e300c0000031148079806000000000501c80200000e60a01be6020000000001103200400000000038190020000020824058c03], #[]⟩ def dynamicCode : Nat := ((((((((((0x110e10221c1ed8de4db1bca05ca172c7d8e7a6ea0d0e45415230c34b2cb3092c930804124030080200d06801e19db4206861627156ae694977eec8614272942430404054202044a4bed66832fa1c324e0838010c3216a1116430b0b00acaf4f2800233d8434a2a8b854c0c282c0209fd1820124567ac40853941b0934155b8b4b50f0000acd7a8244821100e000071880018e1d27330d2732f2cd0dbe553a0067c6544a35554933431ff4769b69d97042f28000000000000000000000000000000000004622cb3092c93052c10410c0040c000080341a0078645437670c2c13811f06944c8c32730a04e53d99a31d2b42c0c08bb7c33a68297042569c0074021864de3330a0c2c15f9558069455fd5e4e30a057e2b301a320c73fdc8c08d311676c782002c0ce5341555ff8fd1e00013671ce4900210180000dd100031520ce1200056c324db6e3aa2d124001b1d49018384d722fd71438ecc7f00a92382121f6de141a3e1d86b718102cd76a2f9408ff63b7ca0c001110a51c006348812010000077cc117d4553458c275c2e248cc6cda8840c219d1364843e8419438004b92003002ef3ffa20ce283801000014320cc0b926b4bb5550a1c6313363891c1d4c01804100448d7a870800f2b94430872a21a04c041c71e2aca04540d2b4cc0058b7e1000724408004124fea84661838f2e8d5943a47441f9239fc86a49418e23c9d0e002e658b0601343dc608ce203801000014130478db5561630e929bb1232d3844990306f49a3121104864704087108330c00c1797708b38a0e004000050c833088001218c0d0baa70d4cb2442eece6a9310e232e5075315c6114df858f0ec48240e20fd18c20030a423e27a8a0307431b5880400167a90d2d410000bb709e8001149c412405207800021b20302be3e505fc711430424880d14284685b4110293a811a30e28445c03808105ab5f860415d0b9c9f1008d18334290016b85e83800f48c1000838f0824cc850c3eac1e850a23f737440ac288f3e2803620f4e00328c0e00400003d0c0c42b95767a922ac08ecbd8848839ece3d6f0e2163281c2e4308a756d2369100465df813442806992496f5040027b77a3de080fd081c2602c0000e4106519010028001358e62d847f7a0d2e57b01f730a6d207088707665462da211b688481676dac0de39ee5d2ecb1a6054c61870c40c7084082045004d23e5e431010504e31df449817080a41932cb1312f36a232d76070056084586c5467145abb16) <<< 16000) + 0x4d90d4000b64c5c8231ea7bbd34e64b4d77b4fd3ad67bdfa96eef8000000000000006e982ef2ec714e297f977293419cf02b22c2078c68000000000000001b10610c08608c00a0080200019937b859ade002dbe1ebfa2ec607149e3101d6beeb294a9483f351e9ef8435deef9dac2aee948c26215940f25b52882fc5c985cb520dfc1c46c61dc6a500040f20c8430631d03108c184140c00281a48de65ce91c271431849e0609487ba367b1422645043cb08009913496fc1c03a80df244c5004bfb6ce0b0102960615274894667ef3eaa9392130163cc2852ef8a1858428c0a60c25efcc02d820819cb8b682020208bfcc1608d78098cc90405b3c1ba1031c62b3b010043c1b566489002101c79a2626d5fc7120bdbdb52692eb94e3b061267b6dd58790001d8bd2685beb863ce7826798a8c6601a8da5d483806270951124801000c00006c4d96cd7dcaa03093133b5b49846750eb2dcb200412285858c16eab2000c30672e2da0e080822ff3060007e76ee0000934fa2c092400840600ac020001cf3a583d85adcd2810f906c5150868aba2c82b18161163b87517d0a1c798298a3800b61ce509c20740200002884178174491ea7f4ce02061bbcb8c1a438c6457455c989140c664b1488e2937d4000070827d35e70ec04030ab680987070755c5c68e2040b471c811749b424009c0e144922b97aa4a2061bf658d13038c64494795ec9140ad0c84850e2938828923f0827d35e70ec040309e6c453c0707560a127aa040b45e92b6f09b424009c0e00003f04110160be0b034018002251e1c0637deab2123919c3ec3bc20707cecf00f05061c41fb846c80dace5f850e861b5358056500c20b29239e88400979fca3ee0103cea67b36c49212004e070c25b3a7e2a3a0c23111c602df091c0858091e786181ce5053980a0c02c869942860c324f56efac30c2d9ec68248c0682d5e96b00300a28b3d492a0d0900280380001009d2c9805bfcb1e8e4df14a1c4f1d208d083af1678900085ef9c70082a39989810700200002264110240bc0b91c71704aeba903a5f91a432f1860e8749e43c40685fc0ba7b460c970fbb34f061a5b194fe8624254ccc2242e4052a6993f90090182ac95bb1c6512004e07091c42e5843faa40e97e8025abc1860e8aa99d5c1221d123c89fec80cc918aad1083063270eec6d42427cd099a8c51014a954bcfc00301f75f874fd119412005208000020c303022c351a0647192f4b9c3d3828a1b8e68b62820378aecdf5a38e12179cb56150508980fd7ebd0104969ba4864820184e24dadd90e0cab7cccb3023282400a410008203000221201e0b034018003429000c0c34390d9be51828665b7fdc2038a038f80dd041055c7377b10100e3f8d341021a28d13a0184485de16cc204a1d07a2514050eed94a0a8900230205940d2d8afcf31131fef2a9d00644920c1cb18a1890cc088083086032000200d0000ff209e0a9217166f0af8c0e28064ba99766185512ff51cd862081c6323d83308098503ca62268610f85695c4261818a02734743c380d7416225ef0000d501fd35f87dc42400ac11124108a453b07149fc9159430a3d98619718404afe961101107d396cc308f9d127b83825b6e38e81818b7690370802006769f304801080e00006ec80680c00102882e86816c260a402000761203a0be209fbbcee20c242b77ef518a2763a0cdac8e18186cf210061ef588f2b80c169186483a8a1584e93a9588041a28a201000346eaa2f26c09002402c611426a41de6144ce95a56bec30e19bf65de8182bbd52c7478509cfb5835611815743f82fa040771f642e081401790cb61b800162f2678e8a504801301a00007b482e82c170160b60a05a0582c82816007c60867bb4338e280bdfa056051576b01d28838878acb43951041b4502d45061a3270550485046b50641dc3016a36cfce91007fb1500f1e909002502c612a28d600c1c70b845163db306bf18100dac263806a3a60c102375096cc003601000010b20ae0a00f0502802e073c43af7c9050c1dbbcf5964818b599cccb78c331345361101450f5f9e0a705882286f42b7090a068d468321016dc7be583c0007770abfde12484801381c38701c3000d0a1c1238edf12073ee8d3a0ca18f29ef69920608931663c90aba1f2cb2202e2999fdb86010ac12772100564ef9efaa1200440480001c620820ab202001e9d1e49071cbe785d24740e726c960e3c086186f2861837392475c5072b80d4608243e24eea274020965e48e9a0100c68f273c93b12004a060b200c280b1671248210fc422cac91c9068b64cdc1c74a54fa42f486182394ec2a762834f426f9bd9090e07b1f6d34c04139deb4bcc4050026970795d8af389002a04000010a9e1c096b14dc287039b666c481cfd0f8e1b2863ce472ea48182159847f242ae5a4339880b8b1c9f3a18041cca21d84015cca86baa8480110120158040003b6400182881a00c0028a0c0aa6744a0c0c239d204f46289481a01d5861c7cb66fc830492ef0beb8a13d80044be10417e5e964020b60bce6683009e4ff95c482400880900820200e0182a808150060a60200022f20a40a000fe920028c6400ce008288ee08017695b4040c0000672009146156c7d99226709aa39f2033ff2dbf86386027c78a4040cafc60da68612750b1e87240615c3a0ff612004604081c06632340a140ad95440a10d397501491104a4206480cef13ebe4a089735989430814e3dfb890794dd7f80b0006628d421200400280001b031993e241b2dca5e11c2107b355806d92b57)) <<< 16000) + 0xfd7000000000000003411c62442432031c21000408f73b5a9466672ce148273aa847ac4555a11ad2083c92359c558edc5e977047f1ae80011f105009c1006963c5a0101ab50945174386b79524916081dd59e65bdc304c0ff86e5f8a1486fc40516204c8876b51b08080001356001021111fac4f63048013018208029956d7e0101a220fbb8cfc70d21bec8954820726e12f80791824b7a989dc80a138d093711c44093e50e8054220200003d090008107310a33ccce209002903c00010599136a4c52b83a409c18ddac0122434f21f9e46c901dc6c5e5683470a7ffa11fbda2827bb3785d3918007cba8fa2013881c10a40f0000346410406000bcc413c45033182be19a40a00004d580e2e9eb3ee803852288808f8c12cef1b3e03823dd616e90c0804f4022c1805efad05f8210a0508807000034041386409a0a04c0102580812804001c824124b60905b047298098ac118371adc47ee39bbccd57f9ac0af580f6d697849ca5b25e5778c3be5230000000000000000000000000000000007e4288400380280100020a0977b7435eae19606f8dfe9010f06646ff2a18619cea58fbe24643f5ff67478895a22f30539bd16bf73b4ee62323e9720094882e0740f0aba4182d43ce9f8409c9376435b2cb64c796b1dfb83d6dc119ec2bda0b89cec919d12fc6930b30a0d4f308a7bc5aaa4d965a82d4164d7f6f8cc205001008a03042016189037f8305ae25981e080bfaa0f00fada7e480832010c0f7426e10521a1a1413f5ca860c8069d90105402000014e411026086130001a3301b7114a2357b35197e533f7fca4b1876a14e86dc92a1b97f3c462552c9c7449118196d0d96a8815cefe1c01a8f9c63a9b05f168835cda9893c9bd378ff217aa599c2245ca8a6b176c5a0c6ca0c159e20327de91f18008d54ccd5a98c779f714cd2f73f8ce0fb7a6fcd7d2fdc92753c7049667af1c8e3a9e7dd8d22a1bdb6905e859182a666a0ac1a7e18952bb215e79f596840a1de05a40c8f6db6192dc2b10089d58ddee7c302b6ac1397140e1f4e3c393a82f393215cc74ceb850c4743236f07fcffff36d41f25b48f4b80ec1fd186a426601080581d9f8e8142fa430878113c5bc23081700860711f04486d81922853b1ea18573db03408140040000521041098000b1100082d20782b924d97a1020a79bce380a2857e11840b80420100200800002220801b808e893e7013915716004958a400512f4012060b004200802008800227508081dbfeab2204190080000369d0243d6610840a804000011880008590001d4207e1b03c0500017c903e11cb07f7a0d2e57b01f752b46e07165034b62bf3cc44c7fbcaa740197a5725a018902cc90c5043042049004001b3b483cbda26324654e6d860341307cce5b135f4eb5ce8ab9b104f2ef3a87fbf518522c77b4203ffae11034a3a7fa48484019144096498cf8615732d5c0800954d8233040d8042841fdee0c40baf1f840c29ccf6e470403316818005d0b8040024185b098206802000021240f4040780200025d202a320131180c0280014f481d92c0e87701001004608032f1e470c07e287861f947bb2080034d5562481836010e00b65af0c0bfdda0048305c0100000d6400052481c86e0806ef185f12180de358706080120ec2e10503b6f17a2010efd024b060870bf69941000727d290a51c308405121c336e303045f5a7e8a0963ca08183483c810c0089c9c21013195a3013060d004000042c80a8880600400056a40bc5405c1b038090160480a8140009a840742787d2ed5416091266f22002c7ca184610340108020080228bf2f0a71a1841072c7001fc45d960026981b2000d00420000200800002220001ea40004c880a86c0843606e1b0130d01b06c0d4240220392621d2dc20800651c34008fcfe8c002f339c5006fc9860084a3832010a2afcacbc48a00abf104119cdc01200f8d6b801905064021014232dda4614bbde788800031fe9c602188f9ec1903070021a6e3d56fa232332f08200a730f13041800469b87b91a2400548f68e0100d6588c106402000012440d0160002a06cbd412fe143006ee1870c0b64667804a0d3f0090406402000017a4000c2c819808000fe8c1190dc501a56844dd1ea2884de3f8a9cd9ca3be513342e76b0408056f110966675b39be5b7857e6ce4f82aaf4f65ab23614dc20865b373a9eebdf75e5a107657fbb641d6e4b8a739f9a48890380691d20cf01cf92907a3dd8f0c90099acb76e183afd3162cc1804a7dce7160e5ff11ecf8d58dc01002de36f66240a085e7b800010234a1ce9772b64f006ebf9dacc3e3760ec8a091c4b82b01b7b84e40d28edbbdc18d8759395da98d51506cf08c520c02a40002ca10180900056090322981890e0707a143c1c74b0d41c1c3026981e14202188e814103a05510419158f8c5260c1c00840ecdc1d050085c9e8204b62b80230c170080000481030110178680b81605a0202c010158080a804052030280100013f9001015200515067b1c04748a37e9cc969aef69fa68dc761e2cd7158000000000000006e982ef2ec714e297f977293419cf02b22c2078c68000000000000001b09cd7d1354f95c41f19aa1ea20c6242cf080000000000005c6206186300280080a00001c7ec4d3937cdc223a86b46d86a1f5f800f6c094d75dcc71301038fde627d99ab7bead7d3e61a91085c49e99ed1e6ebd7733be3e31c8a7b83ff5b8b75b2123b779972415126d4c4192a021712b4d504f526a000ada400cc6c803bc89e3dfe017b01ef887147bbe8feb7290386560)) <<< 16000) + 0xd99fafa581c1672d4b4891320c0d2d5350153d14404c8886e1723ce2001bcde357daea0c0962890ea9b948200c2e787eabdb804448007a092431060428ce5424600001dd4f027d603db5a5e127296c9795de30ef948c000000000000000000000000000000001f90a21010e10a10e08600000080dc800401b24d75c0dd0a2001abeb121a737a1d901841a5c90c18a2012a8600de489b8400899b8b808ce30380109146e7da1ca100000960912a43d40490c5b39660208000000870400012c0200198bf70049c507002162813043dca166d5e5c618416cf3c818108c36058808ab7fec09002d9d4d00000441b3c018e203a0188d6e23f71cdde66abfcd60544c3071cc18b18918508c006004000c86008037881b2a6dfcd211b8eb012c600000010b1400012c01c4318ae7444081326a6d3819951c470604863518f3406f66bf922400780412480006f3e42d762348388212b66d4e231e40b2691c38659049d1fd22d49105ed075b14e918d049c0dfb821f3cd6a9263e20000014dd27ed3eb3a00800be396d10fe3862d2f6c9b89390e0086148000271204e03f24b7714623352839ab3894710959632d6e015cc240000a2f3ba4402e0388203f75d534c8861a88145062124d9a01e7390c2479fcd0456f1a197470446654bab014948f138091d134eb8ac3850022c35aefca200108281c50cfb884ca2800025887921fca195389a4d87b414104c0f4b41044847c684800001c288e003a0180001413e48f8316df8c4aded99c4a726a5247874695d184800018715bf09a081c42cb7a63ead448d551e393ac7b3404e5d09f9e30faef67ffdd294a50612eb4f35c5e871e481c065899fb6398004a1536e73d91900080130e2863a8883d14500003aa483c90579463ea71306335dac4a0801ef4ad28408a6a817762400000affa190e00460400001702000860400217880065b9000dc82001e5840042288130280047fc800a0010251d8120c800805c4045adb2204029a1884076ca62e06081235a9041fa0d0d02004cc1d14498306c0200320b0180580b82808c1604403e3913cf74eb149961d4bf0abf1f932b67a996b109f791a946188365c7cd899b92075460c297693e05e0c87eed989cd6b7f54391d7047e28f9a849c09d94676cbf57507885e42e30320024a65fded7a9f1bfafd0e08a0575fa0be4e9799fc60bfffd541e9571a299d01006001ee20ee828dcdc187423856337586f781e2dbef5aee577e8c638636596ebf2bcfe880009312b32d9710970ce5d0c509b612923d8ce83e6cef4eccd42fd9b88b160d961ab9ec0575dec54017a12cd8b8ee7371b3cd25005c04b7856b5325d9dc8f127b1690643cf6122174c7f0711783910207d197221c2f62f5388120a0c8042441b460b050c3a5e50103ac8c9a470b41141c20002b6ebc6000af1bd0c01366428019c506802000026a400083cc060d4a12870c3efdab061227930710110a97f0183c7d978525081b0087101d057b8e187638fd0c258bcc26183c20b9705000ecf3484a10360100000e7202a1a0210900982c0800400047c4002c7880f8cc0783403a13e38b82cec50c403efd12200f4c8c40471fdfa8c16c3afd04a0834010b1ea0bd4624394c672c70d7938862400cfa4687004098e8100362f90a6001a00858e068eeb1218418a2c387e8cb398c1004e7ab2000d00400002e48000ec901c0980a04c06c2602203b1cad357020333e392070f5bb62d0c2bd3a96c90035ff8a1c007360004000127691670c1a00850a1f2bff122f546b4a68824efdd0a2768d6bc48204929b92820d0042c5b6a45c8914a9dcbe1855b9c9e87084b44c924141c1b88a00afc54b26041a0080000839a133aba7724496c90605116ede613030423370c0022736518000c5104402a18c5019c206802000025e4000d34d0c556cca082048f03c384ad0f848c16f8b07c1033683f60600470006293080d004000043480582800175880d0cc064660302b017154040040110040100400b02e010020080000223411ffd48802c275c1801b22b026182a00800008920002304054560281b01309009028044078780d5404014382c012101600400786c0402702a3182040e48c480044302a01000006d201e02b2f8faf55e77f4dc11941daa875b03b5dadfb0e794a114512bd7f6c896487185e048f6c6655e19b402f7b4bd04005739663e67094706d58abdcb012dc81592a7dd8f004506ee79406c649f243e00197c712fdbc01b35bf7234416401e37d6a049e55e3cb21fe4be920db3310a6248403004011c75904c34090d88280530fc09840a002201002008000022200018040003f48070a803436018120004cc20160a00062d200100c4004638800f4d1a1aa516c30a0cb61bf188081e58f688014d50140600198b610401214718a0005880700118423679be1c20c94a1c182c2484a71424b6088d1010631c98100505eecf000261c1c00841090d3b7a1c7eedc8890e281a7156c80c0662d84386e4ca00e183004cd958200199301400082b10c400018cdf630283a0088125835c6f850e2043de055881030304baac9a1045653a097906046a70a90e112003b92cee281800aea62d7ca07d070c2702c5142c1f0f58926f692585143801698e328502c60d6248a6ef28ab82081f306f90a00019776709c207c02123ae9ae971428786166922b3821f01418db36478e10454aa49207c4b4f49000099b2b04e103801000013d20005544028040008de402424000c5c4001d9c80412801c2400c0a005010020080024288018e8008640020200001001f7a9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineTenthsCase3" = "QuadParityNineTenthsCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineTenthsCase3 private def zz2090:"s082a"="s082a":=by decide+kernel end section namespace Green24Proof.QuadParityNineTenthsCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l53 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l53, ![-0x7270ba8, -0x3d458730,0xc5d13b0,0x45a27f5], ![-0x98d7cfb,0xc5d13b0, -0x2f580d89,0x75d9cfb], ![0x258,0x45a27f5,0x75d9cfb, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x1b4650,l4),(0x1b4651,l10),(0x3801d0,l17),(0xc979a10,l15),(-0x3938700,l27),(0x3938700,l29),(0x3801d0,l30),(0x3938700,l33),(-0x1b4651,l38),(-0x3938700,l35),(0x3938700,l37),(0x1b4650,l34),(-0x3801d0,l43),(-0xc979a10,l41),(0x3938700,l51),(-0x3801d0,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xc979a10,l15),(-0xc979a10,l41),(0x3801d0,l17),(0x3801d0,l30),(-0x3801d0,l43),(-0x3801d0,l62),(0x1b4651,l10),(-0x1b4651,l38),(-0x1b4650,l4),(0x1b4650,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x288328420170401400000000340290040000000005018802000000088780a601000094260900b400c00000000f0049006000000002a01c80200000a211809c602000000000140e20080000001a0c0718040002a1202c079003000000068481e601000000521b00d300c000000001a031004000000001e014802000000c812018601800068041002630140000034088071806000000001d0188020000000e8300c6010000000068b033004000682106017200600430901401e9004000000000481c4010000000241806300800c42904604b2008000000002a0148020000000d8301c601000000000640e200800c61904404b200800001e19050150020000000a8881e601000000006830330040000001e0e051804000000001601480206304605601e48028000000048303300400f81e04203c2008003c0841a0271004000000000480c401000000054140a300800000036160518040000000011038802000000001100a401002605810c07a4010000421c0700f2006000000110d03cc020000000a8700c6010000000005406200800000001c28198020000001309018c02a10520210019a803001582405809d401000a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x6961f78b1fc596ac756324612ef7908065920f94a9986100000332a104355cdaa448200015f780013483eda94800200146d3ed1b4fb38ec51e3b1480b34e96df803e9435f5a4672235f4ca482fae1f500000000000000000000000000000000000000009a4596612592404104482580081800010068001121a2bfd7966555d7ea69828912838bd07a27fb8dcb2148c84ffaf1119ddb288168604470ebf28f502049b9a2df19e12821b34000004de4141c046c0b01d6207029cf6916a60400416309fc5804b64484ef1140e2804420a000015c9927e0db655030700001d4c0a1dccfd2e502470eb3ac3e8a0d3a6154202402f40599084003aecd763000173568fd8324041100e0000668c110ff8f0c58c30bad1a48cb9cd87a484371c46a40018be43438011d0e343003657d5404e183801000013f3cbcf9ec0000000b1fd1e89f849b701d056f650000009cf5d9ad440c060871ca1481471480440010006e200200d000169303682a45141860814bc0048a2febebcc910e9d6ace8e258ae0920184a4d5f0c048244ff6af08018162f100a055d4c42010006d2eec00a494283e0300001dd201e0be5e7cf6000000058fe8f44fc24db80e82b7b28000004e7aecd6a206030430c48a3883081820823800971001006c0c8822b50915ac4f9192272fb18f1c40fbabca3088388c1c608170ff00a0668752508024c0370294080d804000058481d0880e42400061e40e0472c1d91142b783f825e5c46801c9cf5da8ca7a7a7d4a5a2654006111891757a200b31861c31c21020c10811502247a66d98e731fc43dbdf3cffd2c534dcc6c4501f0f52af39481e092bcbf6d58eeb12478f14000a3cf2eb144989aa5aad8831e787787bf3a800c8942ad00000000000000000e44608308604304600500401010e2b3efb1af8917031a5ad915d5f731eb7d61d0bd5f61e74f31582535a77ea7f87288a1c280013a10372101b0280d405036a2089a208e14d2dcd3210c1375fee3188a11a3b01c0b1001a3ae08030e02421b39040a00d9e82f73223bd89e645117800561a5c671c240247168ac7d3b82ca0ccae4069645f4729e4c30c5c19331838407ac1b4c381034e205a140962b824802077505c230180c4f73520d920042038e30a960a5f98445aa60d92c8363e922670e00003e948180b5d4c79817fff65093813915683a581e7fb8748600d6f4b9c524007c05000034e68a2dd9c422c945e6cc4287012320108206d27592c1a91f0df1810122fa928032f89571400cb765d00001dae63c800e00200d00400033a70a20342e53090665d28249f43d5d62874c6a264286e61e1362463654bcf1800d128c409c207002000027a787047a553b1091c90cfcec702830ae948b04480dd3bd7c617183068fca267030d8edbd9aa01c20721217c3080550b737e60081fb8c1394624912004c068e3062ecc1c91843495c069c2c82cea5fcf840c02062df7cc0ac21d602e0e100886d89b3812cdc572a05811affb1720600bdad4d4ef5480118100000738d9232cad093e8b1c333bd4cdd103008645c9e214502ddc6b1c848400b31c39d850814333ac488410237581bc22c19da2bb6ab01001fb2045a9b484801381600cc0400041470a39cb09b286a9a8b082461da95f2301078255820002c1fed1801e228c00982070020) <<< 16000) + 0x00022a4001cb0c906b5a45ba712337ed3bb1dc38a302db7dcf8e18065562aaa4048d51891060a080ef37a4a03007711eaa3e0204af38439100001d475b9a05a0480130182884a56f5ee9943af1eb172c0a1a97c9f3a3a20803da21d06202026617a1c08100f0ac8a08308adcfe228e28204cbc5cb81002b122b6615a12004a0500001e23038cd6d939630577f7b922c978f4210117a9939960a01ffe78e0833e1f0040884ee240a01721b0a94020e004000058c8190480b004000b24404c17c414cab6794184925e6dab1144f3dcd758b1c303d68c3600c3dda574da0182ddbd8e84f142b972dde21100823ba27be0006cd35ec4cd8120048058c22d9ef59838289a9519269d861c40c6c592030586fa3f3ea0a13d59cf3aca302a7104a82c080ee8ae9cf202802e29e89e90002afb7532e14a0900260340000f690320581882c0c01605e03b20136e25d161c388ae6aef5c2073b4ba8ce9e30cd25a484110814ae5df14538e15bb8a53be2142d3a7638db40829cd2fb10480012f1eb38cb44592004e070b200fd5025ec0e1c5edf6fd98081ceb4d9121bc618e80c60e4b081484d905392470a058f55b69450abb10592bec10530c96fd760600a61f749d5b7b0900280380001009a1c1330bd0e12307afbf0391c613c8cd07c28accac5ba487106d8808560c0eeddb90fa101e0b62a09228029ecd7c60300dfcf1a7fc392004605002e010000f29b20e15bb79633cbd170286f18051e408038efbc41002885910020798ba18036c757413840d80400004d8d0e088e433860e31514a0490228aee586400f0e215044e13b8504233ee7cca0c0dd730a75282036d80499268c007cecc90c6000480532d607864801301828704cc2f43848c1414a3b24718526b4f4f0a2b5a12b4d21c41f1320ab8303c47d2f02840774142dcc8a009402bbf80c030918973f0e480118140000740d901ee0ab4b19ce9f6c9437ba5ec9204074ea7c2082134408800ea83a80c01f1a25a27041b00800009a102d0900029e102c05000668900112120049a4788000062700a1230269b8630208f3752e0a0fb5756542301b3981ee80a0023cdd4b880aa8f7f3a92d46202201c0000b5902b2180988c0a8460521b801072314607fdbd10298add5a4e1ba1c034fe92dfd9b6ce71eecb568e6ea1c50061dce564a3c67bc40629f46919f508021d9bccbcad11a2f952e8b1d9360900a5cd53c6d94667b975667a096e891490f47c224e1c88f87a1c4e91360a23f6bfe1f492015f222c992036698239f69ce749afef918da28c9c8e462cc4b4ec6c11467028da4a0858e42b8b1236068100c469af3803ee86c4800abd582408170084894a786d57dda6b1493c62b51451a6f1f50fafe0f6d75424dc71d5e7616d5edb04c00e0b0a16c2aaf372382a23074933d6d4720e310b3a4a41117008a4876a8ba6525cc2ec8339900bedd3649fc7b8431f4454bf187137982a4f40eb68598dc297bc1615e256b10a1210e224e9ca4e284e6f880702211e7066903956a518264deed538bd8726164c3c1a658fef55052cb3c945deaec9a7db2f98af27de3f923ebea9204c28168c4e670e202a89b8c244cff0000b246038642a07000e1e7a580c383744807cde7012040c0042c28cb9d90128ca0440693aa2102f4aff0a040a80200002a08000bb90280de0478f86707ab9012a3d3c553128e5561114c0cf0acae932a8feee2384132414ff161a154ee7a1d0c0061ef711e9e7e860d69e7e3c1eacab14fa5265a93a5e2bce29da2874a7fa6600ff3e0e0fdc2b4080cf3f86a2994ded220e71398fa3ab3d56e3e6a71d238a8ee8d352dacd858790e544488551818de112e58001aeaf19eefbd67f387b087e0e2e1aba9ce926e3af05f994100e088fcdfa52f9ba61226a1c15c48a32499ec34917fb65d52acd0a1ccc6d0cdf555a01fcf8799a59307a86f8b414cc34cd1e1249842e0203b13589c03af32258150f5d848102c0108194ddc850b3152c500f310123041500860a34ddc9140c58c7d91020c80400001b480008690001d5204e13000837321a6901304842b75a10a09846ec8183335532840fd8b894480271b41080066ae9a0ce1834010a0c30663d8c102080af10283095bc184a0083ac90106c02104052cd3c5087c1f3c0c10cde9222057c489a86165feb52480050e710a00628dbc4e083401000012d20320200021c20462200f050001c9102605c0300401004a13a2412d88b14204a533e18208c58e82050099f2e4001b008509ed04088e18b0852e3048064690810d07c4648098545b8a00cf42df3000d0040000414c867afc228c11182d04183ecc02a8c0078cef24808340100000bb20461200f0500016e901e1101206806c240006dc404c4702811ac560c3a4cb4b858208213b06000dbb2d08002bf463094206c02100401004516d2acea1a18368ac5240059844d1800d80424500baca028bbe91b68b1029adaac60036010000096200028c400060c81186c088360421b00c05c105e25042087905603837aa3e420175f41e08482830010a2838dc11866101785144435324316ca7890301a9a02a182c008b2eae3f58a18899a3861a4f05b07154877d4240818008597d3da6c38e895b0430c53884c50800018838097f4ee12840c00400003648000d4992690f5d448a10ec991450bc6c71620671988b005516da400784107180008425804e203201000012c20007b6403c2400098c40801724f959fa1229c9ae710206a97288015b552480030010c2695f11c4110b7e385017a20263001800800004698122696a8e0)) <<< 16000) + 0x6e03691401814ec46082e01000008c343dba0e310810970bd3c606372dfbb2eebf3031560807703a440d7c4695dbc262b2c5568acd6fa21686c7e1161b5a0b13141e7ec49fe44345f9960b8e86c5070c7b6e1bd868e881ca1e54f43e38cbcd63e9f437d92b4b19e53b72e845a2de5df5a27b6575e1e6005142f42a063855c10b8e74b7303809369df898213392a2806bc6360135ef386e4e51a41ad52926523a4d2793527d15d727bb2e0437f5827ec3b06cb29d33fd057f841556a2809ac32d3753f2ec0fce60123dd5865ce1c1840a3d05fcacfb61af78816728d8decf92ee91fe9d8bc47b90fc4b76cccbf7694197bbda84fe663ca657246a80a6d19bee140c824cd59b05bc7c53f7c66a96f698997c91066e09e0739420b82516bf80c8f2147aae9b4db0ccdb3ff1b4783b29ae6c49fcfc743dd080d9e3eac60da79bb95ce00b2da28f4613daeb00009d1203e1a01e0d00e848070240360a01a010006351001455200584e74984e59b274bd5e118319dc9d9fac8e11fb085980000000000000006e291e384b3e116e2d5f3c43c6f7e1bd80049d320000000000000001ab0f3582c6d5eeb899c3452b89e96ce114e3f580000000000000067400ef2368cbc989634f89552dcf10752ed61000000000000000000000000000000000000002520818c00a0020200041adffca65c04ed4ed11914332cc19e32e403b4364a28b27ebc01c4e55e105ef195e04b6263af4c9752edafefd38d8d26b67a06163d85f08c5d14c33ad4d802770660dbb0ad0af799289ab238b308cfe9a208d8eb4bc191b98cb5717c49e2234697eb350b39c4967de9c534a85211f8102180216ea375406404000fb2400e2088030991a26540a7d4a58ca7a79cf5da060471c71470c308704604404300101114c8e008037f0936e58fe8f440000000e5e7cf6076b5103273d76400000015bd941822081442021c21c10c0000001b8c008036b51031299d81a7d4a5cd1f138198578490ca6a8bc40c791d98bf5c8a02b6c49983b317eb914056d893301d98bf5c8a02b6c4997130892451041090c80c60c300100030200200dfc24db963fa3d100000003979f3d81df0d0be7582b3d5ff0edde0d67934bc0200000000000000000000000000000000000001148a28a1091071090c5003000b86008036cb86443b364a18055578122c50eb3ac3e8a15c7a7b63e20500001d4c0a113a6154200c00ebb35d8c323841100e3062d8f01682c695616f3624600002a30082000054841c1114e8a391410cbd93a80c1016bfa02300faf38b641001c40cb8f24904200186923345594651200004b0068e6a556b7060eec7ac30060c54b2703e68a6a56977050a00000030202fd91e0d260177ad8af184801000c34d109c9b834b192d6da308181347320800009623470c75de0307a77fcb11c00000e149c00700200002724000c14800269900065a200111e4060240015ea40031f080b8cc008050301c0f7428202c65f440483abef0a008e02ac100c9cad64012880d804005807426ed571081cb204e140cb204e009880c002273e5709202b39f2b8490167abe86bb24fbd5f435d92802dad440c9cf5d9a7d4a5a26540063443ab12288c0b8394f37e045bf0250729d05506084042043002003565931829c803b3a807b77765d807535dd1c55d865585c454ad6ed62cd83da9f63764e273b0ed28d2cec66bb6a216e5550003862000868405446028220130dd0cf96eea84106be10406191b29fc202bee3574304356ce005001a016c93020d8042c785fd66248734097b080c1a8b7192007581921002f580f72800d8042c7091e2002085b4104870e0f221b860084035c90006c02000017a40006f080904c0382601803b1db5bb01243153becc80f333d6d1c3b9a6288b083e8f3b2400f126bc70013106f27041a00858e36f85f101b00a74c387f66e39961137c55a18499e50892820d004000038480882e8671ababc8083655da1c2fb2503860ada0ea528113fd784a004171f62001d7aaf049c306802000026240241400073e40405601e0b8080080200382601a1200c05e8839b63d10304592b06006a280c003c52644480832010e142cfacb181100eb7c7000fce66140969d1164001a00851202b26028823f69630391ab4a4002992bf2000c00400002c48000c29e22c14e40c20496b44823705d8c03504f612010dfd3094205c0200001a6402c05860261640c2752fe7300f62ef008c20600210390c370e583870197f47cd051a718122d52c694908f1a2e6ddbf7b37d5ba4bedceaeeefb6f26959957e579d850dd36a5571f4ee750a723943578abdaf5e34d09059acea5e141ac3944b66cb32d4eb683f234339445cf533d18789f322f10a1568aa9537c0961497c189a185d364c243836d1041d78e02422d537cffba88a41c752f2a2c8f62947eb0f45c605702379d1084c2ae0000129c80506800159ce0f1f3ee083be2801001ce3f20b1880b0042461b6e04180b522a10c0201e29e18057c1bb090206402143b0d72a38876dd0901bc93b06852c2b712020b00428791db0080ff95dc280732d348c1058020000112400053c8050680008e08001701009090005f61000c68200271440064ccd16df08b780a183766a6914135661f0220201b48a9840011fc241060000004b0080096f4050813880f80430c176ff3d35a145caf558ac1b0c20176d6a45dc60c03549eb0e028600f9fcbb8c1413a6c03bf42020006a8f423c007e83881481600006908040a801c2400c120050500200800c0400072440086400202000010015829)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineTenthsCase4" = "QuadParityNineTenthsCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineTenthsCase4 private def zz2091:"s082b"="s082b":=by decide+kernel end section namespace Green24Proof.QuadParityNineTenthsCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l33 l34 l35 l37 l38 l4 l41 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xadfd730, -0x7270ba8, -0x98214f0,0x258], ![-0x7270ba8, -0x3ba9ed67,0xc5f4ccc,0x3fbd069], ![-0x98214f0,0xc5f4ccc, -0x2f580d89,0x75d9cfb], ![0x258,0x3fbd069,0x75d9cfb, -0x3938700]] noncomputable def hinges:Hinges:=[(-0x1b4650,l4),(0x1b4651,l10),(0x28e979,l17),(0xd0328ee,l15),(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x1b4651,l38),(-0x3938700,l35),(0x3938700,l37),(0x1b4650,l34),(-0xd0328ee,l41),(0x3938700,l51),(-0x28e979,l62)] def normalizationDenominator:ℤ:=0x7270e00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3938700,l27),(0x3938700,l29),(0x3938700,l33),(-0x3938700,l35),(0x3938700,l37),(0x3938700,l51),(0xd0328ee,l15),(-0xd0328ee,l41),(0x28e979,l17),(-0x28e979,l62),(0x1b4651,l10),(-0x1b4651,l38),(-0x1b4650,l4),(0x1b4650,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x2883284201704014000000221e029804000250982402d003000000003c012401800000000a807200800002884602718080000000005038802000000068301c6010000a8480b01e400c000000004c039004000000001e014802000000c81201860180006804100263014000003408807180600000001a2c0cc010001a0841805c8018010c2405007a401000000000120710040000000906018c0200310a411812c802000000000a8052008000000360c0718040000000019038802003186411012c802000007864140540080000000341819802000000001601480206304605601e4802800000000380520080000000241819802007c0f02101e1004001e0420d0138802000000054140a300800000000220710040000000022014802004c0b02180f4802000084380e01e400c00e63582404da0080000001d0d034c020000000070a0660080000004c2406300a841480840066a00c00520a81200f5004002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x145470708d0a24248e1ce4925d5cac62875a0691612388ee65c891802374a8380000156c67041d008493f23f402d7a15cdd41240612f6e3915bc9ade50e914f720c2cad6f4b1238d675af17d00287704881d731a9c1e4fd86484092d204f19922c449c60000009aa37360c0001404af61b91bf86537d441faa54800402210500000ae4c113dbd03e30cfc34fc2c6000013546e6c18001232882ab307516fc30081828453d71072a400048454126d5599d2ce802001bf882b8f6569d1f060050aca6ef38375e80000556a43b08c95137e107ea952004042084c0000ac4f1ed7c387142940aaf4205dee7be638a513b90c804eaf8ad0c005d5f47140160d83c04e1836010000137303725e8913fc0c09113d28027cea203892ba4512be970184903b6e4c1420120a3a330b0e5300801316da12b27f428147da84b198111000e57d1b4e1fc84002438852159f41621e402440c41800004c840301786326932e848a34c1928071138b460c8c2061a80500c11195cbe0083964566287009959afb0253880f808206b4f575848a5d22ff4911a5a4220e2321285118481153c64008589200502a964148400525b6d14a0406c0200002c240b8440005d070d7ef52c43861f2ed923843850c4a2044d6b6081023606bea2204a38380100000f63d9c897073619eabd60912bb77f47d5db80e33f12a900000000000000039413c2a734a2694e3a7d77671ee78115f2e6312e8800000000000000d8830860430460050040100db037b7fc2070f803edcc108d2a12243051092ac509137a56f2c1bd63ab86e7ca4379419edc3907efebfeaf643fb95fcc79a2e060e67f8ce4620ec34a800205102d190160280ac050367bdb91d5070a7210d4544304cf40444ec142352e3711b1001a96fa48587011aa2e771a28037323f6d144ea023b2df45c8fae65eb8c718250286b712b4ee91dc98320b160704e30b28c20b20c087089003030000200de304a8614c06900b1490f53085085993916412f529080e1c0000515a6055342066f38125ea00c99604cb191a006008f6cdd01a4801080c00006e8d14677673a0b254e18a6d14380b5f40a082088712f45839fc4a03060405aee4d1401f4e229314010314a3800005dab112a4007c040054020001bb385044fe36cc2411c8f7649313bf42e2872a64bf09433884900091878aa6283000c9633809c20740200002887870484c3a5048e3234c61c8a0c1b4f456c901ae7b262a31830702db03c1869fcff01e07081f3072971009dc5beec2081ca670ec15d4900230247182bc0a4563480532b6901843f074d4bcb20f3ca81f2605e81acf1c1c20109b08f1c09df44a42cb03087d5d263007b6444069d200420380001bb3648e2a3ef5838b1c3c1708bcec40c029f5cf16a14503929dfce41210037f8d213850818ce1eb2721040bdd21bfde2c1c366d2b6fc04009f169a20fa0d09002903801480800087ce143acc2ac612215ab2050d52934e448c213fe706022237ae440001e89b4300410af2613840e00400004f480039b9a20434c660040ab07ff250204b8e97f100818110d69f09000a7ee6b43000443b83c08000a15405820193cd2e78028810210180000ca9e20681e1c141845f71d52262893dd87902470c0a3c2090061caac2667018293e35c3da284e9e03308c40161f694050002250597b49024008c0a1843fb4586182892ea814c8430d8aaaef940c147af7364414252f898bfe30280d5fb320406869a05140a008da123e60003fb49c2d1e0900230240000e710280581382c09817438228aede60d1834395d16838c5236025eb1456090164880e20e23e33d5c60aadc4cd8c62058203ec0530411985080c202017cb4aca0bcc4801281628705c1d2510d18879f27e41c6716fb58ac516030076d820430c5e63887118438b22d18299769047040a54e3a238041a98ed8eb289200440480001c6302999ce3a5e30a17ae7a0290200f5a30d82083625a0dc0e19c648c374306acd8596f0a0c4bc2dc7c1826ed2a6570802982ea649b120044040025010000ed1a1c7a67ee142c1ac7ec245d140f56288072af9870c0e56148e0278082b140362ca6213840d80400004d8812008001c7c8005989001a3b3c4000031381424416da291810479ba97141f0df7774180dc33cb511400479ba974058c2864c96ac384002800015920463b0221181086e88066bf51b4bd4e3e013798dcdf9e7e1f90030e531c3de97964e1adcf5223cedf714380a21169dbde07f8869c15de357d867610a01542c264a023c57be6579bcee83df932100611a81c255748798bc30b65ccdd5a7fa28761f65cf1d9bc3b13d2d0252000e25d933cc62252df5bf3f00c9d95eac1c19192a7ea2b08ace548dc3252fb66c) <<< 16000) + 0x23dbc14c5c51973ebf379215d85a8922923f0c828a1efed8283f1d5f104128ec6a340632f210240c18008619508f10d28075ed9828583a72810196d648082e010f3c36f3c4a2805dc68c1481db4430c8837286023d8830a820c0020000358f3fb88dd44cbb95536c554f538d4dbbc1d57080000000000000c84b2c924820910804e00b0070060032100200d00016720006447075f35b340788f9ca0021ae420032a9740a060b00228a01523050e2d9e928058ad8830019a6b24041600850c4f2840b00787dac5029863089820c0020000234c0a195f4041251d102c0b70d1e11840b80400002348000fd90002c23c7154517890d0e810814114dd4a43071cbec6081d3bc018c0021c0251400a1919427081a00850625a084060813d2d688143e5e390c24d083184808360108203ee6de284428dd386086fc9ab102c3d6b7430b6c43321400fa1e7098106802000020e400078480e868030040006a840801700c0100400f84e8900645886081852401028e48e3a60034008a13b239ee182544404040881cd290410cb1a50900e6447914011687a26001a008000082990e9d99fa14148b1a3c305db07e718004bfe2420014722a25041a008000070901d09006028000b6080c088078340006a86008020088255fa7e230211e93f66800951f508000a6fb24800360108100ce1da8826811b6428313527531800d80400002588000b6901d0980e04c06c270441583070ccb746181058a8070289fb3028182c0089276dcad204515ffc41045d2d143c182f428102c008a2dd5980404bf2c28a0792b1211840b00400002288000a8900c01000117101a05c093b57c8a0dabb6f8602d973f8c005c0210245510c04188309858196c81c5004008548002e0100000ad30040100400001110190900c04805c1402c0a015010000fc100065a200287270c806ffdda30630967d5c206024a70d218207cd4014301137fce502800443b83c080024a41f2a080b4e504002000016a2003532400e24ce0a59ac8f3b3455266e68ad02e238e38a38618438230220218008088991801006f6fa48a989368000001b8304c0cf066de182ded274404336cf028193dcc78b755b00000000000000000000000000000000000000009c441028840438438218000000dc500401b24f66cad8144015a64620819a852880f9b873c8c192092420c02886b7808022c789409c306c02145341d8672450bb0b585082710020912463159121a8b7c10082000000238200009602004e24b4060206c011628f1da31982856dbc2fb5040a00003a9806043950f49004080a4c84702c09d09b31941801fdb04d2c000a5dca27b19100846040c2056893e7924000012c03063a41101858cd2c12670b14a7a0d719821d20d30c24400000018182f5a21814b03698ff80624007c051862bde4b418501a978518381fdec89638bd68179830fdede61634e300fc8c00000ab64e003801000013920005f640012dc8003171014050003cb10009e320262b0120140c07a21e0a0809968f101204576a280289202840334304f804a203601001101d09d9afc2103736d4f140b9b6a78046203201089c8e2461bb6272389186ee6bea91218345afaa44860d20bb4270d5cd159c8f3b382966817d10ea443a2d02e12accdceb56e75b4255941541821010810c00800d0987ec4c6933f7af3d3bf09f06e73ae46260ad41a369822863d9bf6f427a23bcfb2a61e9dc277a98bae64e9d25442e8aca00071640010f480808c03c45431dfbb8820886931d0619303a54305e68fbc0a008e5de608047eb2013020d0042c75dca6a870ec1debe24019caf6c7003dd71b1003e93b765001a00858e134344c410cf40630e1c61d2b80c0125cc6a100095ed3a5001b00800007210001de201c1300b09d0d0033e40e15e39f043055abca5140aff73e21022e8ab310009c41b018058d5698ce1034010b1c422080101953350a1c390688d2584129ed8830807aa6612820d8042c76704ca080efa3d861c3cc6463430862a08614110f3f7c8003043e918008a2eb49c106802000025a40008b8803808000e3480688c030170100100400584c02825035d2f9cb01ce9ae1203ab22f100285838048182e0108185ef62c300159d72001e72941260832008e149249ea281e2b35588006402144251d9124104101c181eabf911000f534790006002000016040004d8e17adeca601578a79203776e411840b00400002248001429960fef41a5d0947deebb35440e09658e30c30a28a11601201000c0064200401a01203800008020020050411b3068610354e482080c6614181ad5d8b080b82f6e4a029db1113000c80438ead88206900a39ace142c18110080be6f90005c02000015a400071ce18dc5ea030c214afc6070ba11a10441a388480787e5a12840c0040000364800186900043c200e0a0007bd20010484003cec800a6c1a2c20ab41d450c3e35f36c2827404fc641010110d69f0800bbe0977830000002ee01001668d92d40a7102101061bf44f07d9c3080ac3029f218256927880b04080ffc1e2107001517e13b628003a0b428310000aa862360190e184a040e3c250ed4c71432f534a40600002581c368f5de20c180da3bec10400012c620006835a30b840e802208f303f8a12301c95e58818249b4b448841d468e20499cda39880032013749810740210329f0d7326488040914d0102395c2bd7230204089fa0100519478df03800aa7ed061918108807000027840009c08001e6900056b200c2a0050900202800c0400402000754200202000010013dc1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 15 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineTenthsCase5" = "QuadParityNineTenthsCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 15 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineTenthsCase5 private def zz2092:"s082c"="s082c":=by decide+kernel end section namespace Green24Proof.ParityNineTenthsRows open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) def rowsChunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x106c002b196c006e0d6400386d00257068da00217068da00205d304e2ad80448dce5304e2ad80448f9613068da0024302b196c024aeda030c9ac002b9825602b196c010bfc4a2160fa19069c0aa07d204e2ad8001f7f2de02d204e2ad8028bcb601d204e2ad800199ed9e527a89800782c5ee1204e2ad802484da9207c204e2ad80069baba6424ca5d004eae2e607827a89804081da027a898007c4d09e14] def rowsChunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x1157a898001a0cad603c14ca5d030acb202c10c9ac001baeeca01c161d407fe410386d002038104e2ad8001acabae028104e2ad804a83cfc2018104e2ad800ca78e010386d00203d404e2ad8001da99a206d42692e804c5ee540386d00203c404e2ad8026b1d206c44ca5d001ccde440386d00203d07a89802186e206d01389b4019f8e05d01ec2a078965002b196c004c0e203c004e2ad8028c48214] def rowsChunk2:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x102d502b196c022d9c5fa01d504e2ad8002c7a5f2552692e8348ad6039507d0c805ccf202952692e80499a296019507d0c805ccf206] def rows:List (ℚ × Potential) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 def mu:Phase → ℚ:=![(0x3eb2ae9 / 0x4c4b40),(-0x3bd6429 / 0x4c4b40)] def parameter:ℚ:=(9 / 10) def normalization:ℚ:=(1 / 0x186a) def quad0:Expression:=quadSlack rows parameter 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadParityNineTenthsCase0.base QuadParityNineTenthsCase0.hinges QuadParityNineTenthsCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineTenthsCase0.base QuadParityNineTenthsCase0.hinges QuadParityNineTenthsCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineTenthsCase0.nonnegative x hx def quad1:Expression:=quadSlack rows parameter 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadParityNineTenthsCase1.base QuadParityNineTenthsCase1.hinges QuadParityNineTenthsCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel private def zz280:"s0118"="s0118":=by decide+kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineTenthsCase1.base QuadParityNineTenthsCase1.hinges QuadParityNineTenthsCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineTenthsCase1.nonnegative x hx def quad2:Expression:=quadSlack rows parameter 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadParityNineTenthsCase2.base QuadParityNineTenthsCase2.hinges QuadParityNineTenthsCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineTenthsCase2.base QuadParityNineTenthsCase2.hinges QuadParityNineTenthsCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineTenthsCase2.nonnegative x hx def quad3:Expression:=quadSlack rows parameter 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadParityNineTenthsCase3.base QuadParityNineTenthsCase3.hinges QuadParityNineTenthsCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel private def zz281:"s0119"="s0119":=by decide+kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineTenthsCase3.base QuadParityNineTenthsCase3.hinges QuadParityNineTenthsCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineTenthsCase3.nonnegative x hx def quad4:Expression:=quadSlack rows parameter 1 1 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadParityNineTenthsCase4.base QuadParityNineTenthsCase4.hinges QuadParityNineTenthsCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineTenthsCase4.base QuadParityNineTenthsCase4.hinges QuadParityNineTenthsCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineTenthsCase4.nonnegative x hx def quad5:Expression:=quadSlack rows parameter 1 1 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadParityNineTenthsCase5.base QuadParityNineTenthsCase5.hinges QuadParityNineTenthsCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel private def zz282:"s011a"="s011a":=by decide+kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineTenthsCase5.base QuadParityNineTenthsCase5.hinges QuadParityNineTenthsCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineTenthsCase5.nonnegative x hx def pair6:Expression:=pairSlack rows parameter mu normalization 0 0 false def pair6Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair6Target:NormalForm:=CompactPair.toNormal LocalParityNineTenthsPairs.compact_parityNineTenths_pair_6_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_6_hinges theorem pair6_identity:identityCheck pair6 pair6Rewrites pair6Target = true:=by decide +kernel theorem pair6_target_eval (x:Point):normalEval pair6Target x = LocalParityNineTenthsPairs.parityNineTenths_pair_6 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineTenthsPairs.compact_parityNineTenths_pair_6_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_6_hinges x theorem pair6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair6 x:=by rw [identityCheck_sound _ _ _ x pair6_identity,pair6_target_eval] exact LocalParityNineTenthsPairs.parityNineTenths_pair_6_nonneg (hx 0) (hx 1) def pair7:Expression:=pairSlack rows parameter mu normalization 0 0 true def pair7Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair7Target:NormalForm:=CompactPair.toNormal LocalParityNineTenthsPairs.compact_parityNineTenths_pair_7_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_7_hinges private def zz283:"s011b"="s011b":=by decide+kernel theorem pair7_identity:identityCheck pair7 pair7Rewrites pair7Target = true:=by decide +kernel theorem pair7_target_eval (x:Point):normalEval pair7Target x = LocalParityNineTenthsPairs.parityNineTenths_pair_7 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineTenthsPairs.compact_parityNineTenths_pair_7_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_7_hinges x theorem pair7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair7 x:=by rw [identityCheck_sound _ _ _ x pair7_identity,pair7_target_eval] exact LocalParityNineTenthsPairs.parityNineTenths_pair_7_nonneg (hx 0) (hx 1) def pair8:Expression:=pairSlack rows parameter mu normalization 0 1 false def pair8Rewrites:Rewrites:=[] def pair8Target:NormalForm:=CompactPair.toNormal LocalParityNineTenthsPairs.compact_parityNineTenths_pair_8_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_8_hinges theorem pair8_identity:identityCheck pair8 pair8Rewrites pair8Target = true:=by decide +kernel private def zz284:"s011c"="s011c":=by decide+kernel theorem pair8_target_eval (x:Point):normalEval pair8Target x = LocalParityNineTenthsPairs.parityNineTenths_pair_8 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineTenthsPairs.compact_parityNineTenths_pair_8_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_8_hinges x theorem pair8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair8 x:=by rw [identityCheck_sound _ _ _ x pair8_identity,pair8_target_eval] exact LocalParityNineTenthsPairs.parityNineTenths_pair_8_nonneg (hx 0) (hx 1) def pair9:Expression:=pairSlack rows parameter mu normalization 0 1 true def pair9Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r27,RewriteAtoms.r28] def pair9Target:NormalForm:=CompactPair.toNormal LocalParityNineTenthsPairs.compact_parityNineTenths_pair_9_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_9_hinges theorem pair9_identity:identityCheck pair9 pair9Rewrites pair9Target = true:=by decide +kernel theorem pair9_target_eval (x:Point):normalEval pair9Target x = LocalParityNineTenthsPairs.parityNineTenths_pair_9 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineTenthsPairs.compact_parityNineTenths_pair_9_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_9_hinges x private def zz285:"s011d"="s011d":=by decide+kernel theorem pair9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair9 x:=by rw [identityCheck_sound _ _ _ x pair9_identity,pair9_target_eval] exact LocalParityNineTenthsPairs.parityNineTenths_pair_9_nonneg (hx 0) (hx 1) def pair10:Expression:=pairSlack rows parameter mu normalization 1 1 false def pair10Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair10Target:NormalForm:=CompactPair.toNormal LocalParityNineTenthsPairs.compact_parityNineTenths_pair_10_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_10_hinges theorem pair10_identity:identityCheck pair10 pair10Rewrites pair10Target = true:=by decide +kernel theorem pair10_target_eval (x:Point):normalEval pair10Target x = LocalParityNineTenthsPairs.parityNineTenths_pair_10 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineTenthsPairs.compact_parityNineTenths_pair_10_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_10_hinges x theorem pair10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair10 x:=by rw [identityCheck_sound _ _ _ x pair10_identity,pair10_target_eval] exact LocalParityNineTenthsPairs.parityNineTenths_pair_10_nonneg (hx 0) (hx 1) def pair11:Expression:=pairSlack rows parameter mu normalization 1 1 true def pair11Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27] def pair11Target:NormalForm:=CompactPair.toNormal LocalParityNineTenthsPairs.compact_parityNineTenths_pair_11_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_11_hinges private def zz286:"s011e"="s011e":=by decide+kernel theorem pair11_identity:identityCheck pair11 pair11Rewrites pair11Target = true:=by decide +kernel theorem pair11_target_eval (x:Point):normalEval pair11Target x = LocalParityNineTenthsPairs.parityNineTenths_pair_11 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineTenthsPairs.compact_parityNineTenths_pair_11_base LocalParityNineTenthsPairs.compact_parityNineTenths_pair_11_hinges x theorem pair11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair11 x:=by rw [identityCheck_sound _ _ _ x pair11_identity,pair11_target_eval] exact LocalParityNineTenthsPairs.parityNineTenths_pair_11_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows parameter p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad4_nonneg x hx · exact quad5_nonneg x hx private def zz287:"s011f"="s011f":=by decide+kernel theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack rows parameter mu normalization p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair6_nonneg x hx · exact pair7_nonneg x hx · exact pair8_nonneg x hx · exact pair9_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair10_nonneg x hx · exact pair11_nonneg x hx end Green24Proof.ParityNineTenthsRows private def zz2093:"s082d"="s082d":=by decide+kernel end section namespace Green24Proof.ParityNineTenths open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ParityPhaseAggregation (rowsAdmissible) theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack ParityNineTenthsRows.rows ParityNineTenthsRows.parameter p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityNineTenthsRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse ParityNineTenthsRows.rows ParityNineTenthsRows.parameter p q same x] exact ParityNineTenthsRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack ParityNineTenthsRows.rows ParityNineTenthsRows.parameter ParityNineTenthsRows.mu ParityNineTenthsRows.normalization p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityNineTenthsRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap ParityNineTenthsRows.rows ParityNineTenthsRows.parameter ParityNineTenthsRows.mu ParityNineTenthsRows.normalization p q same x] exact ParityNineTenthsRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible ParityNineTenthsRows.rows = true:=by decide +kernel noncomputable def massCorrection (U V:ℝ):ℝ := ((9 / 10:ℝ) * U - V) * ((-0x14bc7e9 / 0x1312d00:ℝ) * U + (0x15b0a29 / 0x1312d00:ℝ) * V) - (1 / 0x61a8:ℝ) * (U + V) ^ 2 private def zz288:"s0120"="s0120":=by decide+kernel theorem correction {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (1 / 0x64:ℝ) * deficit u + massCorrection (mass u) (mass v) ≤ deficit (interleave u v):=by have hc:=ParityCorrectionAggregation.correction_of_local_rows h3 h5 ParityNineTenthsRows.rows ParityNineTenthsRows.parameter ParityNineTenthsRows.mu ParityNineTenthsRows.normalization rows_admissible quad_nonneg pair_nonneg u v hu hv have hmu0:ParityNineTenthsRows.mu 0 = (0x3eb2ae9 / 0x4c4b40:ℚ):=by decide +kernel have hmu1:ParityNineTenthsRows.mu 1 = (-0x3bd6429 / 0x4c4b40:ℚ):=by decide +kernel rw [hmu0,hmu1] at hc norm_num [ParityNineTenthsRows.parameter,ParityNineTenthsRows.normalization] at hc unfold massCorrection nlinarith only [hc] theorem massCorrection_lower_bound {U V:ℝ} (hV:0 ≤ V) (hlow:(21 / 20:ℝ) * V ≤ U) (hhigh:U ≤ (11 / 10:ℝ) * V) : (0x5774c3 / 0x12a05f2000:ℝ) * V ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [mul_nonneg hV (sub_nonneg.mpr hhigh)] theorem interval_nonneg {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(21 / 20:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (11 / 10:ℝ) * mass v):0 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_lower_bound hV hlow hhigh nlinarith [sq_nonneg (mass v)] theorem massCorrection_coercivity {U V:ℝ} (hV:0 ≤ V) (hlow:(21 / 20:ℝ) * V ≤ U) (hhigh:U ≤ (11 / 10:ℝ) * V) : (1 / 0x12c:ℝ) * (U - V) ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [sq_nonneg V,mul_nonneg hV (sub_nonneg.mpr hhigh)] private def zz289:"s0121"="s0121":=by decide+kernel theorem coercivity {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(21 / 20:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (11 / 10:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_coercivity hV hlow hhigh linarith end Green24Proof.ParityNineTenths private def zz2094:"s082e"="s082e":=by decide+kernel end section namespace Green24Proof.LocalParityNineteenTwentiethsPairs def compact_parityNineteenTwentieths_pair_6_base:CompactPair.Quadratic:=⟨0,(0x18699 / 0x2540be400),0⟩ def compact_parityNineteenTwentieths_pair_6_hinges:List CompactPair.Hinge:=[] noncomputable def parityNineteenTwentieths_pair_6 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineteenTwentieths_pair_6_base compact_parityNineteenTwentieths_pair_6_hinges x y def compact_parityNineteenTwentieths_pair_6_cuts:List ℚ:=[] theorem compact_parityNineteenTwentieths_pair_6_check : CompactPair.expressionCheckPSD compact_parityNineteenTwentieths_pair_6_base compact_parityNineteenTwentieths_pair_6_hinges 0 compact_parityNineteenTwentieths_pair_6_cuts = true := by decide +kernel theorem compact_parityNineteenTwentieths_pair_6_representation (x y:ℝ) : parityNineteenTwentieths_pair_6 x y = CompactPair.expressionEval compact_parityNineteenTwentieths_pair_6_base compact_parityNineteenTwentieths_pair_6_hinges x y:=by rfl theorem parityNineteenTwentieths_pair_6_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineteenTwentieths_pair_6 x y:=by rw [compact_parityNineteenTwentieths_pair_6_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineteenTwentieths_pair_6_check hy (by simpa using hx) def compact_parityNineteenTwentieths_pair_7_base:CompactPair.Quadratic:=⟨0,(0x4e1f / 0x12a05f200),0⟩ def compact_parityNineteenTwentieths_pair_7_hinges:List CompactPair.Hinge:=[] noncomputable def parityNineteenTwentieths_pair_7 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineteenTwentieths_pair_7_base compact_parityNineteenTwentieths_pair_7_hinges x y def compact_parityNineteenTwentieths_pair_7_cuts:List ℚ:=[] private def zz290:"s0122"="s0122":=by decide+kernel theorem compact_parityNineteenTwentieths_pair_7_check : CompactPair.expressionCheckPSD compact_parityNineteenTwentieths_pair_7_base compact_parityNineteenTwentieths_pair_7_hinges 0 compact_parityNineteenTwentieths_pair_7_cuts = true := by decide +kernel theorem compact_parityNineteenTwentieths_pair_7_representation (x y:ℝ) : parityNineteenTwentieths_pair_7 x y = CompactPair.expressionEval compact_parityNineteenTwentieths_pair_7_base compact_parityNineteenTwentieths_pair_7_hinges x y:=by rfl theorem parityNineteenTwentieths_pair_7_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineteenTwentieths_pair_7 x y:=by rw [compact_parityNineteenTwentieths_pair_7_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineteenTwentieths_pair_7_check hy (by simpa using hx) def compact_parityNineteenTwentieths_pair_8_base:CompactPair.Quadratic:=⟨0,(0x445c7 / 0x4a817c800),0⟩ def compact_parityNineteenTwentieths_pair_8_hinges:List CompactPair.Hinge:=[] noncomputable def parityNineteenTwentieths_pair_8 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineteenTwentieths_pair_8_base compact_parityNineteenTwentieths_pair_8_hinges x y def compact_parityNineteenTwentieths_pair_8_cuts:List ℚ:=[] theorem compact_parityNineteenTwentieths_pair_8_check : CompactPair.expressionCheckPSD compact_parityNineteenTwentieths_pair_8_base compact_parityNineteenTwentieths_pair_8_hinges 0 compact_parityNineteenTwentieths_pair_8_cuts = true := by decide +kernel private def zz291:"s0123"="s0123":=by decide+kernel theorem compact_parityNineteenTwentieths_pair_8_representation (x y:ℝ) : parityNineteenTwentieths_pair_8 x y = CompactPair.expressionEval compact_parityNineteenTwentieths_pair_8_base compact_parityNineteenTwentieths_pair_8_hinges x y:=by rfl theorem parityNineteenTwentieths_pair_8_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineteenTwentieths_pair_8 x y:=by rw [compact_parityNineteenTwentieths_pair_8_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineteenTwentieths_pair_8_check hy (by simpa using hx) def compact_parityNineteenTwentieths_pair_9_base:CompactPair.Quadratic:=⟨(-3 / 0xee6b2800),(0x2711b / 0x4a817c800),0⟩ def compact_parityNineteenTwentieths_pair_9_hinges:List CompactPair.Hinge:=[⟨(-1 / 0xee6b2800),1, -3⟩,⟨(-1 / 0x77359400),1, -1⟩,⟨(1 / 0x165a0bc00),3, -1⟩] noncomputable def parityNineteenTwentieths_pair_9 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineteenTwentieths_pair_9_base compact_parityNineteenTwentieths_pair_9_hinges x y def compact_parityNineteenTwentieths_pair_9_cuts:List ℚ:=[(1 / 3),1,3] theorem compact_parityNineteenTwentieths_pair_9_check : CompactPair.expressionCheckPSD compact_parityNineteenTwentieths_pair_9_base compact_parityNineteenTwentieths_pair_9_hinges 0 compact_parityNineteenTwentieths_pair_9_cuts = true := by decide +kernel theorem compact_parityNineteenTwentieths_pair_9_representation (x y:ℝ) : parityNineteenTwentieths_pair_9 x y = CompactPair.expressionEval compact_parityNineteenTwentieths_pair_9_base compact_parityNineteenTwentieths_pair_9_hinges x y:=by rfl private def zz292:"s0124"="s0124":=by decide+kernel theorem parityNineteenTwentieths_pair_9_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineteenTwentieths_pair_9 x y:=by rw [compact_parityNineteenTwentieths_pair_9_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineteenTwentieths_pair_9_check hy (by simpa using hx) def compact_parityNineteenTwentieths_pair_10_base:CompactPair.Quadratic:=⟨0,(0x270f / 0x3b9aca00),0⟩ def compact_parityNineteenTwentieths_pair_10_hinges:List CompactPair.Hinge:=[] noncomputable def parityNineteenTwentieths_pair_10 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineteenTwentieths_pair_10_base compact_parityNineteenTwentieths_pair_10_hinges x y def compact_parityNineteenTwentieths_pair_10_cuts:List ℚ:=[] theorem compact_parityNineteenTwentieths_pair_10_check : CompactPair.expressionCheckPSD compact_parityNineteenTwentieths_pair_10_base compact_parityNineteenTwentieths_pair_10_hinges 0 compact_parityNineteenTwentieths_pair_10_cuts = true := by decide +kernel theorem compact_parityNineteenTwentieths_pair_10_representation (x y:ℝ) : parityNineteenTwentieths_pair_10 x y = CompactPair.expressionEval compact_parityNineteenTwentieths_pair_10_base compact_parityNineteenTwentieths_pair_10_hinges x y:=by rfl theorem parityNineteenTwentieths_pair_10_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineteenTwentieths_pair_10 x y:=by rw [compact_parityNineteenTwentieths_pair_10_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineteenTwentieths_pair_10_check hy (by simpa using hx) def compact_parityNineteenTwentieths_pair_11_base:CompactPair.Quadratic:=⟨(-1 / 0x59682f00),(0x1f3d / 0x77359400),0⟩ def compact_parityNineteenTwentieths_pair_11_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def parityNineteenTwentieths_pair_11 (x y:ℝ):ℝ := CompactPair.expressionEval compact_parityNineteenTwentieths_pair_11_base compact_parityNineteenTwentieths_pair_11_hinges x y def compact_parityNineteenTwentieths_pair_11_cuts:List ℚ:=[(1 / 3),3] private def zz293:"s0125"="s0125":=by decide+kernel theorem compact_parityNineteenTwentieths_pair_11_check : CompactPair.expressionCheckPSD compact_parityNineteenTwentieths_pair_11_base compact_parityNineteenTwentieths_pair_11_hinges 0 compact_parityNineteenTwentieths_pair_11_cuts = true := by decide +kernel theorem compact_parityNineteenTwentieths_pair_11_representation (x y:ℝ) : parityNineteenTwentieths_pair_11 x y = CompactPair.expressionEval compact_parityNineteenTwentieths_pair_11_base compact_parityNineteenTwentieths_pair_11_hinges x y:=by rfl theorem parityNineteenTwentieths_pair_11_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ parityNineteenTwentieths_pair_11 x y:=by rw [compact_parityNineteenTwentieths_pair_11_representation] exact CompactPair.expressionCheckPSD_sound compact_parityNineteenTwentieths_pair_11_check hy (by simpa using hx) end Green24Proof.LocalParityNineteenTwentiethsPairs private def zz2095:"s082f"="s082f":=by decide+kernel end section namespace Green24Proof.QuadParityNineteenTwentiethsCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x42835246d, -0x2c9779d10, -0x42e337750,0x2055a16a], ![-0x2c9779d10, -0x17aa7b13ee,0x57e8bd0ce,0x1590944ca], ![-0x42e337750,0x57e8bd0ce, -0x1228c4a8df,0x2cc4670d7], ![0x2055a16a,0x1590944ca,0x2cc4670d7, -0x164bbda40]] noncomputable def hinges:Hinges:=[(-0x1675275,l4),(0x1675274,l10),(0x16d10a5,l17),(0x57eae583c,l15),(-0x164bbda40,l27),(0x164bbda40,l29),(0x16d10a5,l30),(0x164bbda40,l33),(-0x1675274,l38),(-0x164bbda40,l35),(0x164bbda40,l37),(0x1675275,l34),(-0x16d10a5,l43),(-0x57eae583c,l41),(0x164bbda40,l51),(-0x16d10a5,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x164bbda40,l27),(0x164bbda40,l29),(0x164bbda40,l33),(-0x164bbda40,l35),(0x164bbda40,l37),(0x164bbda40,l51),(0x57eae583c,l15),(-0x57eae583c,l41),(0x16d10a5,l17),(0x16d10a5,l30),(-0x16d10a5,l43),(-0x16d10a5,l62),(0x1675274,l10),(-0x1675274,l38),(-0x1675275,l4),(0x1675275,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1441942100b8200a000000001a014802000000000280c4010000000443c0530080004a1304805a0060000000078024803000000c812018601800068041002630140000034088071806000000001d0188020000000e8300c6010000000068b033004000682106017200600430901401e9004000000000481c4010000000241806300800c42904604b2008000000002a0148020000000d8301c601000000000640e200800c61904404b200800001e19050150020000000a8881e601000000006830330040000001e0e051804000000001601480206304605601e48028000000048303300400f81e04203c2008003c0841a0271004000000000480c401000000054140a300800000036160518040000000011038802000000001100a401002605810c07a4010000421c0700f2006000000110d03cc020000000a8700c6010000000005406200800000001c28198020000001309018c02a10520210019a803001582405809d401000a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x2cb98389ea0a30a029c7dd5128a05e8297462c8552c115aa288016e1a88f041012f7568620000000a01f270424008515cf60dd06834900000232694489fa438ebcd20000008ca6590b19e1fd5c28807d46a95b880840825d594204be063bc4e5816e417d44c32410940400003bc7fba1080000001109d3e5c72408640f0924983943923941920080000060200401a00020a649878ab195858c26f0c32c491973f115b9122849094f851c003465f0e83002e8b94e5010021aa252f80010e884f7e0280c230080000cf9fee842000000044274f971c9021903c238e50a40a38a10440220008003810010068000849e58b0821de3607543c3094ca016ed3dc7d708c461491071061090480050040020014c8a0080340004c880782ffba1080000001109d3e5c72408640f08c31229220e20c20608208e00260400401b22fdc71c7a49139b1c7106388cc93bcff184395904e48a07d8def22c2023ba8cd46093081080400004dc8188880c02400050a40bc4702ad0b5154c212db595bddf0959e40f5641194b302ec74b016b28dd01c2100a26a595a6a311f8ad35188fa1272c58410ef1b03aa1e184a6500b769ee3eb846830c384204182102020578bc9074cf3d9ee550f8e179ecd877af948d6ae4604208360819b1160a17bf58dbf30edfdf5935772216e87329880d84050f3ce37a65600870cdc891524ff3828002251ecc86ef34094d2f75398e8b53389ab26e505b3c537899f27000000000000000002088c10610c08608c00a0080200138a39decbbf3964bd771accccc327330d034bfdd6c3845b876961610dd31e448e74585ef360a728a6216800162902e210168280b005034e6051f22260e13795c3f57390c12953fdeaddc0a1162a04ced591001294870ab5d0e02037ce250b08a00b36334ea228238088d87f0051145bf774b95c638e1601430a248eac92de87924e891421281ec0a1895475af8e20648c0a273ef5d2e024402d35654aa0c140a030c16057d20a0237245e8b37dc28000491d1359a009c4101062078c2800b032fb98481deb3a20249587ef287c50ed88bcc41ca1b76db24d49230afce1ccd18000d0a099613841180400005b8cdf5152725c326f57f0601597cc7b84dc637ae166282d4d07e261450c504302202082500280180801006e14ab1623af0e380e65647050deef3801a12325c5e884260228feafd902094a3a4a9c40009282a9d8c015e439758140411004000065480018019bea2a4e4b864deafe0c02b2f98f709b8c6f5c2cc505a9a0fc4a20814910810710704a00100030200200d00015420260be234ca2b32bc5d2678b2e8d447203009f67cab0719c9c8dc3e256387a099bf1ce01b882ad48838ec60c1caf725258a49ca1dd897710208116715f7c792a7a5dd4534c08000a6c1c89c6cb43f8aeec496000d76e102587108b233ddb84bb8c6f5c2cc505a9ac30be1e8000348200174a7880e25769e61423f83477dd8c0804e9c9984507d8481b216301d640d0dbb140009d39330a0094e9cbb0b97b101280600005f081590c04c46054230290dc72408648551e6631894807e1d3edbb03f5e3f81a2bc7f03382cf6061059ec0c40f90a21000e00a0040020a68ed3825ed2d92a0342a2fc5bee5a2453ae825dc9e2a53dde021188f1680526d70107fbc67af93924ec5a7a9575ebbac0c0fe7067f42143ceb8efa5539cd8973b44d68675d8de2de2c18cd4b2707bb65b5813be071242edf429626b937ccc700a7b6c9b048103c010e2c11ca62a592631648f24904cdb15161d3e08a58b0605970d2b2840e80400003c8e02d3790e040954eb42044183601000007320501bd05f861f36102a891d971c01ecaad98c0139c67e000264ecf8804a183a010e092338a1310188729f6c10453a8564380698f070c24081e00850f04cc7c8404c1f97422041b00860a17bf3e9a580cf9431822813a12ca3a4608400100000a72000264400086881384c000cf8f1c0d66c06c48620bb1bc324201da65980a0848f937f0306e2e6a1a210368e28ea810003422aa983386108042080015f3441418773acc1460810102fb8205a5999a0a0c2857e339712821080420807afc2c022841773a76fc283017694d0418209a103386102e6ebb7aec0c2da392315514004b95091a28e08480280001762032020002aa20462200f05000228102605c0300401004a13a100f0d4e1a30408b6174d102e8f30dca460042010a1271c3c0803045a557aed1023d071e968208afc71038900ee36649428017a7605598008402000025e78e685b520a243885b61208a093aeef364305baa3d3c230021b7640b0000ef3f1fe13021080400004c081184803c140006ce4078440481a01b090001fc101311f1c05b99f3a0c3898662878908179a4738180001707e744000507e0ff094208802104010ef80ac20912bb61fc14182ed568143000112464904001884cc6a4a08440109240ab75d9a145899097d88b100a93cd452400209d357a4002200848a013443678a2c4c020e44308073e49b6c600440100000ab200033e4000b0c81186c088360421b00c05c11e31da301c70196f410e1b0352a5830c6f7a910205030692f1002ecaf45) <<< 16000) + 0x00130a0e80428aa6f8c4d124b57ab7c091462e49ea3086257f842404cb0ecb012860e80428a00442732864a46ee91c58ce0c1309840e0022cb8fb5f381450ce28f54a18367ebdc30c148e9c41c528a49f28e0096df08c2c103a00800011a20003a2608873e4cc14363c65f128031400722004d8d7fb00a080e00200003208001e1900f0900028a102005c8bd7c72e8e251c9b992001a004710b4a61e082b446e745023445be9800d0020000244e0c117491820f88449e1406beadee4608360100000973420fbf299c50003af2ca0408c56e1c863081e008000051101f0d00f068074240381201b0500d008000c148006501001b3939964785f24390e3abbbe68b36d698158dbd4e265d6ea46a2f28800000000000000000118078284fb5abc47394e93b8568004154da383f5951e563d500000000000000000041718deb8598a0b5357f0601597cc7b84d37d4549c970c9bd00000000000000000fcc61840c700600501000254d3df0a81884c98080318c93ba19cef162b49b2a10bfd1957b34b353636042b3fe4eabe6303e7a43c91c352c6611f9a56324c3334acdcf76f5b21c43111b0163582addae45254fa7573f0bb14d9131d196bf8b6e6bc3b38b7be9539ed952b7f775914b65d77a032020006cd2004c1c400d7acc52637dd1894807c12a96cb109d3e603c238e38a38618438230220218008000264700401b6611ed1591dddddac000000005946e80e208e95877bc7e8a82c82b47c52a233d12d7e9121e31f1f426bd6860000000000000000000000000000000000000000000000000006522082021c21421c10c0000001b8c008036392043242a8f3318c4a403f0e9f6dd81faf1fc0d15e3f819c167b03082cf606207c881041080c60c808900300100030200200db308f68ac8eeeeed6000000002ca3740710474ac3bde3f45416415a3e295119e896bf4890f18f8fa135eb430000000000000000000000000000000000000000000000000003291451421220e21218a00600170c01006d964ce1106f52d850c306e91e6977258a000007270e0050b4eef60df533640a000007270e005085bc0f0a5e63018013c048ca688c13881c20c00f11c9021944274f96000000000fee8420f09831631230e0860980040000180401006e8e77c91c628c1dd9a5aa3a143800002ee0306625f6d4e868a981ebdcc8a140000176f0c10107bc95110175b997806601e85745f9a4801180634d0a98191b6a6961051aadc80c20a62223c93904000009278e3470478a6c6e860fc142b1997c70000006dd9e64e004e03000018a20006dc400124c8003421000950203012000b1a2001bd8405c660040281808a13ef4282033994a00808bf6e4bb828011da69c488053a24838e012881100400580742ce252f9c207a8369eb140ea0da7ac026203c008c100fad740c20200740c4c840a06108a0e180069a2fa08405a51d15ca012881100400004388000e710151180a08804c37433fc09f33c410c2a67f0018647cd5fa820293ae5a580c1387724b24500309992dc0801bc9520927042100858fc3f9c4604867b24e0604060be0c9a2387a37b9d4c480057f2ab8380c3fad1b22000fbf191b380100042c704d9133f0a28003f6bc041121bc22dc387cd7f5a900c00b5e85cb84001334a1ee60021008000097900029f20241300e0980600ec713e61cdd901943e879d070ef7cca50858439a033350c276e8026f92000a4d95e04001d0cca2c4e0842010b1c0a6aa83428a003c9a20203154a495f8e1eb085e274b083c692c6c184dd15a7de260421008000098901105d0c36bc71ef104056865850e1211383e1460af2f37740102db172a7a2800878ec2786000dc89c6c49c30840200002c44024140008a240405601e0b8080080200382601a1200c05c08043425ea06000325e27b0008c7d86994460846010e1431764cf870206ce782c5021f3b641e30020008510395d5c98c0f3ecbcd110004a536a71800f80400002848000b09c292ae900920a358aa2490188b897211840e804000027880580a056630830204b047c70088406c0200000ea7026c91dc90c1be50669820b71367688014d25598181770b9dd009440740218648b64e4a8c1cce74f9bc40e0fc794c718623e800450c10d2d9617ca0102a2486a38027261ea509c2084021a52072945cd1c50f98ea38e064fd42343b4e996392020e80434d18a9d498a1c8ea97c53448b5f8f28a00dfe477024041e00800006590001ad20141a00033d200089a40242400100c40022088008c510014f0345bd8254c2a5da828606f348d4de934604005ba53aed9d0a0994184cbb02f3101014045d4d55cc1800249b5db2781820028136d57eb9a804e207103303c61b56a31c7ad430801e146012d1c2005fcea90e8c11b2bdea166c508019faf9f0a2000097b118b90000029e8426e01470c290144107eb18810c38f1d2b0105238a09ea8cc58406040ab42d4386a6fd0dabc3060059d78ae08200000bb7a20002b1da2520003822f84be19082400449226fb1f27a10440751251c448c012c9c06292200fffc1f4e40853b28ecef02083219fb1342000049527f413821300438c6f5c2cc505a9abf8300acbe63dc269bea2a4e4b864de800000000000000007f4ac3bde3f45416415a3e295119e896bf4890f18f8fa135eb430000000000000000000000000000000000000000000000000003291231031221021000e002017040100680018f90004bb2000d5440021848040a801c2400c120050500200800c040015d040086400202000010017d01)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineteenTwentiethsCase0" = "QuadParityNineteenTwentiethsCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineteenTwentiethsCase0 private def zz2096:"s0830"="s0830":=by decide+kernel end section namespace Green24Proof.QuadParityNineteenTwentiethsCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x42af09cea, -0x2c9779d10, -0x42e337750,0xf7d369a], ![-0x2c9779d10, -0x176fffa6eb,0x578b65cb4,0x1602a3ce3], ![-0x42e337750,0x578b65cb4, -0x1228c4a8df,0x2cc4670d7], ![0xf7d369a,0x1602a3ce3,0x2cc4670d7, -0x164bbda40]] noncomputable def hinges:Hinges:=[(-0x1675275,l4),(0x1675274,l10),(0xb17c204,l14),(0x20c2368,l17),(0x577c22fc7,l15),(-0x164bbda40,l27),(0x164bbda40,l29),(-0xb17c204,l25),(0x57d08bc,l30),(0x164bbda40,l33),(-0x1675274,l38),(-0x164bbda40,l35),(0x164bbda40,l37),(0x1675275,l34),(-0x57d08bc,l43),(-0x577c22fc7,l41),(0x164bbda40,l51),(-0x20c2368,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x164bbda40,l27),(0x164bbda40,l29),(0x164bbda40,l33),(-0x164bbda40,l35),(0x164bbda40,l37),(0x164bbda40,l51),(0x577c22fc7,l15),(-0x577c22fc7,l41),(0xb17c204,l14),(-0xb17c204,l25),(0x57d08bc,l30),(-0x57d08bc,l43),(0x20c2368,l17),(-0x20c2368,l62),(0x1675274,l10),(-0x1675274,l38),(-0x1675275,l4),(0x1675275,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x3c012401800000000780520080000003622031804000014848004cc040000000b0900e601000000002c009200c00000001b00490060000019024030c030000d0082004c602800000681100e300c0000000007819002000000000340c801000000000e812401000000000840620080000000001819002000000130b028c0200000000d16066008000d0420c02e400c00861202803d20080000000009038802000000048300c601001885208c0964010000642a0980f2006000000002a0148020000000d8301c601000000000640e200800c61904404b200800001e19050150020000000a8881e601000000582101e300c000661a0900f200600000001a0c0cc01000000001900e4010000000005805200818c118158079200a007c0f02101e1004001e0420d01388020000000002406200800000110500618060000001505028c020000000f87814601000000000440e2008000000004402900400981604301e9004000108701c03c801800000044340f300800000210e00f1806000000000901c802000000000a80c4010000000000503200400000000048190020000000002c0c8010000000008812401000000003850330040000002612031805420a404200335006002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0xa80720081441942100b8200a000000001a014802000000000280c4010000000443c05300800002702200b1808000250982402d003], #[]⟩ def dynamicCode : Nat := (((((((0x186052497b7234b0000044525970e2c56610c26aaad151496481efa657c041321334c7c480000026e009c108c02165d7c9076cc61c5000000d2e7165066d9b6aeb9c4800000d2f91849feec16a02164843fffbd438a083edfe31a4840916d34d2f9980450a892772122410a00700003f86cb55eb1b2ac6133889e00dcb240f7dabb398402666a26b0412868c7dd40800e675255260023008597bab9ae7790e28000006973965000001a5e0389000001a5f261280c8837ef0b18116cd03e4182bfce3998202c15985d52428601131ca6c6e24900270180000f81046050001ad9c1c6421302b287b893c3790900c7478893200132084a607007ca9b5b50250c220080000869a1eaa676b480c46ab97b965a0c9d650f0482091881830cb08908b04500070200200d0001103efa6d350b8cddd3d64bbce87ef468516a08f9832f76b6eed6dcc19413000000000000000000000000000000a1eaa676b480c46ab97b965a0c9d650f0c71ca1481471450010003d474da1e3b2471e68249181f7014bdfb9d9dad58545b996b9439b488257cd4d976abaae29df090cc5834edb0a5c9414000ebce10511d98569444716dd105448189107106109048005004002001472300200d0000fb202a1ba1eaa676b480c46ab97b965a0c9d650f0461891071061030410490070011c0a0080360680f7d11f37a928914d05dccfad6af424431e3b74f28157c71181e4c86ef81971845ad957f6585f506081372f0a0bf1062003059a4d3b599c85024551c36672d8b143d09010286c0a800024e208a2a044090001d2904311fbe9b4d1602a3ce3595bddf095988cb2d011e5d75ba1adddadb2eba826430c2083863842041821020201c9936d6613fd13a341a09db66e0b95b8648bb54e035493aac7f48715715976e511235d000267367a8b6c7570ee758cf036e424ee4433efe57dfb7adc7f1ee6a8000000000000000004411820c21810c1180140100401088d142cf8e26d14baa7e1b63212837f0ca969a2bf0d672afda6f3c75c332fab01b139d19ef2e59464150002cd20844a041118200280fc05034e0e48a4af31c272c0331ec84304a4fb0145d7c508a726795abe100132d4e3e0601c0410f9db55802802a4e61f38d0110af41a49f9d9128af51ac96b8ce4856048a1eaa676b480c46ab97b965a0c9d650f04d2ca24b1ca1cd18a08b0060030100200dd2c020bb01d1a5006a25d8928a2470c863c590e4f47120cb1f7fd7f50d94386e86a58d1c00112ff1a813841180400005b8d0f5533b5a406) <<< 16000) + 0x2355cbdcb2d064eb2878250e50c48c308482202082400060300401a00021c687aa99dad20311aae5ee59683275943c12c92852452c41432022c018000c08008034000440c0aeb439d8de5624402df86e2ece90272d00bb82c6871006600fb3a66102061d25793300411c8993a09de140011806f3d7b4101b009950d466007d08142d02c0000fe101a0980c82e87aa99dad20311aae5ee59683275943c12052442041c408214104128000030380200dc2aab3fb78335058c168529f0e902867236433c4800c2841dc07ee90841042941928ffc6060ded864ae5f1c304cedad2901921102372af68e4400dfe0b44db6201d42440b40b143d54ced690188d572f72cb4193aca1e09431230e28a28820c18e00000060400401a000220687aa99dad20311aae5ee59683275943c12c92852452052c40c32c01800130280200d000112207c1a0004a02000ba24003458d100d11a611f0c1bea3b4bf54182aef2e8b3d8383c5b75abc64604826d1730d8a00b1b36c2341000032893e1e000e8e13194200dc061380a2064f71fcb3ec20501ff2409da1c59a1492a2661c26d746727e6182438ada41321c11d45849d9d181005ca647370c0245d404ae502180c280180000e5903d1101e048078240760203a0101c80800109481c14c0dc76034330360df5912128746db3228700ab90c3aec5158a0a5176cc500000000000000000000000000000000000000000000adcc197bb5b776b6e60ca0990a21000e00a00400202860912efacd191be1034cf62ac6e9836cb7aa3ec4a73384f73ae88a72a7a64640d27d7e4c440c804c7945f3ddd41157602306376af16600c18156ab68b0748b6f9a4cc82908840c0fb36509f444a4ebadeb7f9f9fa8a1c081929698341a7d7c7b9273318588ff11468c7762d99e43142516495d3362aee214d3d4d4b00401004493450d1b9401215258001a424d413041a00400004a18235e5d70502152f2d0c08b905884c206401000012640d4260680a03301c884acf4c8786e774c02287df0401e48227a6800781917e54b2800e0043c3e9ccde4482dc3f6fc8041f4e20c6003601000009620200b91042532783c302f22ba880c0686d73141a91460e8f01057333f14041a460c8981078021e1995c243081cd404f6440836010000071200035640c827c0f03e3eac800027b75a380b3a84540008e0f6d1012060e8043c2688d6ac88118c6487050585b708078108b1466090207402100801004000011100010620003d840c436000b4c7df4da68b0151e71acadeef84acc46596808df85b16985f40b1fbe83cb55ee7decc092305453f3d5e9c5e7250a6f73208bca5024aff4d6142642431410c10811000da68c1c60dc6f2a4640d0e3653a9dfd233c4458cd8f049959c9a5443540720684f30a602d74399db1665955c5a7a8d170ee826a21aa5f5f7d369a2c05479c6b2b7bbe12b311965a0237e16c5a617d02c7efa0f2d57b9f7b30248c1514fcf57a7179c9429bdcc822f294092bfd35850990a10608408308500234674bab8e98095f3e1e3669c160b9917443474aa3a42b7b059ede964f5e9c06369eb16cd077fb51a95dfd3b9923ee4edb19113a866c18b6c5000edd17941a4b72fc9070c001646b228776c517341031a49bcbb9282108042c50f977ab08e181f3925e450eec6bc12620755f954d0280033e8f828c000e9b996c98108402000026240c0040004ca40019288160a8054240014a240bc3700c0100401704e840008473710c39153aa2441021d46712310c0000f8daf19000900214264665c3c8e1e0d351bb0c116a7113b8817fb2b251820c57264440a023dea250cc0040010000129321e768bdd20c1603273f30a09da87eee860f40584fa0c021ada8de0007715e81d13021000400004ac8160480541400072a40984405a1a023050110280010ec80d08c06427c300146c62c30e13b4c6a2240024c0a1ac60000543eef100007160e8c2508220084010040114585cfd87a0d0c07d37e6f38000fc8c714b00034a77fa240003abe62e50022008400004010000044400050c8000c0102c0d81586c0a8360240b0290100880e0872edc49041398c9c56143784cd898505e22d916240daa20a905030d38b15000986078021efa6d34580a8f38d656f77c2566232cb4046f15ffdedff4570bb6f07452896583ac6f7bbe238301f4d3fc2a800000000000000000228c362ccf1908a22b2442573a44a9e0ef2f12ecfc47db08ec600000000000000000820df807e496de42e9674220a8fdf41e5aaf73ef66049182aa51448a28a300010ace9cad9822991b47caa9e5d22b82df9b4480e4db8078b2426464f40b6cdb3184fe7569e534f4c15a912a2ea8a32cf53a2cc309bb4fc3b70d999a324e6304e0c90704fb784700aa1c67c50e3d7ba0e31767c65b506126d11ba57f18c69e79514158b5d2e19574018b0b1c0183f118e3893c008408201be95605801ba925c05001532ce0813060f804201002008d36a334da31a48004d7102080e5e84981041370edb89002eb59e30e0023527d5098207c02000024e4000590d97606b5be0b1c2d603ca14010dd4f9118000106298012080f80400003548001cc1000a893044e07bdc02040cc75c36386166d21547001c256e50600c5e3a8b000251c1f008000083101511000681902815c0000401105499eec14066aa5e788006c0200000d86008020080000223038e1ceba4005595a10a073b075a11840d004000025c8138680983404a120240901180808804042030200100012010012b120052986a2e8400779fc1)) <<< 16000) + 0xde04dabd487c27fd9ad29b6f2fe2540000000000000001e308311ccc7529f134e2083596d1851e13cee490cd7384c4fc0000000000000000000000000000000000000000000000000c2430c306206182300280080a00000b7380100680018b900327f2008ce072ebaf76b6ba1ad975d41311c71c51c31c11811011000c00400044c90008037ac890943a36d991438055c861d7628ac50528bb662800000000000000000000000000000000000000000005612082021c21421c10c004000000470380200da200946abf44860ffba895901d22121020306343b31198810a818a240180205c46d584013c7db22e004e2844010a291b988708284000005dc0913847713cc1c40b61b395890e5977f97e1c10a7d313e85003303d7110c007bea1290068102200861811437977ec50b738dcfe611205084115c04714220a8ed316c4b005740559b842800fda31c92c0c0039c315f3f00000b96f91ce00c880c2902075912128746db3228700ab90c3aec5158a0a5176cc500000000000000000000000000000000000000000000ac269a51268e60e50e60c68a60180001006e102f16a9ff8d1c0f7dabaa983c25ccd9ae3060e667cb5c0800e6751e4650023008000086101f01f1282e83fc3a3880ebb7b0f81640000034bc0410000034b9c40429bb7af440c287667bb5694082b2f135c09051265cb85610111437e1e594801280a24900000ea5b0e205b6042f813489f532e61749084803a16b93819039dce7ec800000057e1804002655f4cee8e004c0280001823c416e0339c29a42a93ac8d59640000023281a3a8ef6a8b91c31884aebf0963000002326860ac7d63b951a058450cb430400142ff1a069002400c71c11c4c4120d246efa4e08924800005dbe38803df538286911dd91818c8000000464e4c004601000013b20006504001af48004fe1000beb2001b3e407834001e76400453080e8ec00c0586c599e321144564884ae748953c1de5e25d9f88fb611d8c000000000000000010447de6564742c51aab0d61b888e5737fe68f9a00512d55a7800000000000000004060da05d0aa5e34d03f347054c40c5044044003001000290fd6c67281331f14fbd49111aa8aebfc1b112df7018aa33fdce5931a1e01d8f6e130cb1a66cb0d9f1f2100db28caa99fbcfd4da3d241a699818bd8c9b652584a4fe24ec2c6326152244af080000127b8a103ef3c603101000006ce41023ec3b4a28106743b05830204e90143480098408c021440009b3d6a304003c294242051428e4b0820c7c38a390080501d3eb140128811804000044c800138101c1180d8880682603213a1a6c7d90d0405b17819071c20cc0fbe50c11f7a161745002dce99cc0804aaeef0426042100858f5c90dbca486275af534387fb7d33223040815860248005b188b63809d17164e2000823d60d380100042c70087c93108222e082e0870fab35a78e1800072d2f30800048eace4a004201000010220004e4406026028130120180880f0810a8aeb3922069871c00812f599f2ee2073c26c4d5280016a4361100019a2d74c500088edad64e084201091000072f92409628fca1c1445b5acca80818a97d0fb09010840200001ae405c17e2bffbdbfe8ae176de0e8a512cb0758def77c470603e9a7f855000000000000000000452fcd2ed93ef02d83681742a978d340fcd1c152ee2a442acec076cb0a9f0550b1c80c70c308b00b9dacfed116670b6cf66e3d932200287718dcca526980a620369021ce55118caef6279a924989dfb8b52d52ddfbfa2805d14f4798a67a4ceccc802867a1bb400111cd0c16e6b5b11c21cac2cfc8c161dd335582062adc455250003c87c831094408402000021440282400100240586602a1b80800802005026026120120180880e01002008a1cd61bde902db306133409843f7c50169fc6482810360080000c0320bec936ac700a62ee2e201d53e17a0230c1d00800005118144d098e081ae629fe3428e0d628102d7cfccc90106c02143a15b99488163215a5c68122d5caa2804d7b67b92020e804000031cd07d7a4a48805f53a890a09391b258c006c02141f4aa97e100b6671f08a0dc61c891401a9cbde4800380100000c120200a000187201e1a000358201c12b04e04093080b37bb5022081a00848c80c42f8c353bfa20280d9315691820d00420080200800002220001a44034340181300b010000ce900a0d00038790007a0200282640070acd1714f719e902861ce93e79b1414a713d7d588080925f978840058ab783c618001efa6d340800e27c474680138a128043086054655fcb1c206e3780e3a0c178b597bf7ac50963bd22861420201ad1d7424041a5b7061a690802c568ae4cd80321c40a4081c7aad1647d8e9838a10c97f09033470d39aee825451861005d67cc65180410595db5c20cc4000c99733db70460006f41bc98ad8a0004778acfd6803e8406178162492dbfba7f0208fb18c623b2060210163c824400f7d369a20456d5c67db1c4002cebc57041000005dbd08001efb9ddb0c041200228a129d0f188892649122a210287002d8a6f34a140605ffcfd2452a7e439d44500008a6a6d526042600852f98a7d2b0babccc978a18b31ac0e4ccfa2227ef36d800000000000000077d64484a1d1b6cc8a1c02ae430ebb1456282945db31400000000000000000000000000000000000000000002b11239429228e092010002017040100680016a100043e2000bfa400207c8004ed90091900406801c2400c0a00501002008002fd48018c8008640020200001001d999)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineteenTwentiethsCase1" = "QuadParityNineteenTwentiethsCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineteenTwentiethsCase1 private def zz2097:"s0831"="s0831":=by decide+kernel end section namespace Green24Proof.QuadParityNineteenTwentiethsCase2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x42cc500c5, -0x2cb416090, -0x3e8984dfd,0x1758], ![-0x2cb416090, -0x17d2977366,0x56f4d6830,0x1565a9f8a], ![-0x3e8984dfd,0x56f4d6830, -0x12445e2c7e,0x2d22605a5], ![0x1758,0x1565a9f8a,0x2d22605a5, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x2aa2f1,l6),(-0x2f3af36,l4),(0x35e8cbd,l10),(-0x38f9d20,l14),(0x16d10a5,l17),(0x57eae583c,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x38f9d18,l25),(0x16d10a5,l30),(0x165a0bc00,l33),(-0x77e97b,l38),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x77e97a,l34),(-0x43a59ef,l43),(-0x54ba15066,l41),(0x38f9d18,l46),(0x165a0bc00,l51),(-0x43a59ef,l62),(-0x38f9d20,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0x57eae583c,l15),(-0x54ba15066,l41),(-0x43a59ef,l43),(-0x43a59ef,l62),(-0x38f9d20,l14),(-0x38f9d20,l64),(0x38f9d18,l25),(0x38f9d18,l46),(0x35e8cbd,l10),(0x16d10a5,l17),(0x16d10a5,l30),(-0x2f3af36,l4),(-0x77e97b,l38),(-0x2aa2f1,l6),(0x77e97a,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xc8b01c6010000000068b03300400861202803d2008000010c290088c0400310a411812c8020000000241806300800005c320e052004000321504c079003000000150a81c601000000000a8052008000000360c07180400000000190388020000000a8881e6010018c320880964010000002c1080f18060003c198280a9003000198682403c8018000078641405400800000003418198020c608c0ac03c90050000000090606600801f03c084078401000781083404e20080000008828030c03000000000480c4010000000002c0520080000002a0a0518040004c1482c0490030000000d8581460100000630a4022301000000441080d18060000000011038802000000001100a401000000064140b3008000000001207100400981604301e9004000108701c03c801800000421c01e300c000000221a079804000000000140c8010000000f8300e60100000000003032004000000000a039004000000110a018c02000000000980a401000000000240720080000003212051804000000290701cc020000000000e064008000000000d0320040000000022031004000290d0240890030000000070a0660080000004c24063008009a118240192009420a404200335006002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x3a014802000000001900e40100000002e001320101441942100b8200a000000001a014802000000000280c4010000000443c05300800002702200b1808000250982402d003000000003c01240180000530500df3010000b4311481220060000000003c0c801000000000380a401000000000140e20080000001a0c0718040002a1202c079003000000068300c60102884202302a6401400000190a00f18060000000d0903cc02000000a43801a601800000000b807200800074340d807a006000018c3501a0c04000218ec2601e8018000000000b03200400003a0ca01c9808000000160e01cc02000000000680c401000000000780520081e41141680c6200a000240d04c03d00300000000012064008000000260013201000001a04a01c9808000000068004c8040000000d8880c60100000521200133010000000002c029004000000161201cc0200000000580124018000000036009200c00003502200a18080000019024030c030000d0082004c602800000681100e300c00000000098190020000000025024802000000001680c40100000000011032004000000420a0598040003208830029003], #[]⟩ def dynamicCode : Nat := ((((((((((0x6193402a606c6160dc26e89859625467a688612a53174ee85921146be6285900043eafc2480000de3fce13841200401d017a6d57e3054c34c0d4a6f56071678c93d648d2c34b475de9c13d1e833491c106077511e30239cefe3649c108c021a6f85f1270fb1a60951a3760aa058001838f4c1c5aa76b8477d1a589519f5b929c155ee92235d0e08443185fa30c0944e6fd51020000079b495316a410a00700003f874dcdf898558698091d6c860e2cf2325a3e1a58238ad93438768a4ded50704f42a2bda8d052cff4507ce0046010d379fc60b50c1a6028a9aba4b38b441e1e66f46960a2a5dc7ace1dd6e6149572010003071e983828958035a3c682a93b1a42f1000002bd6712492004e0300001f020e60a00038a2000e5068a9523018a7c2891969fadd0e3482f4b39c5282c8a8d851cfa82c4975ea782a00825ed477e42c34144a521754c100730fd2733d0c0300138ecb300b4910280200001019926da023bbd124012c5eccf30713b58cf2850e6f8dad15891cc3b529888e003402f6040c01c9913ff8004e284601000017420e40b92649889cf0058c0477fa9ef2464b885959786191207dbd10905b737435845801e5fe4c7e24011790ad4010016884a44b0500060628804200691c2500c0000f49e3f912d251050a42ea7339902d15c5ef5e38006fbaee00c0076f2892228042cfd48308024c404401000014433ba1598c66a800000b024fe0b89031229220e20c21209000a00400002392401006800085101f15f1ddf25728670142830b6b11e0820518dd8bc44d438a063659c442040810399b49f38414264f266a602011e66cb34e94500000576485d4800696224fbd680096123856040e395bd1ba4850ceb717c31902d6dcb72c6204632c12f584128984e94028020933a93000930e110040000508c8acbbf2d2b922069ec59583890b52aab48c226c968d6a3041457b2ca900308627ba8100cb9b71408008ce404401000017320e2320701900029c106f09d57775c2df70206d65dca504acd86c4a41105866acbf2e017089f7bdb76005cee8566319aa000002c093f82e830c386384204102000227de9ebb10aeb019c4db92b5f7463224cd34314a11f9af1234b8fa65c34b9ffc1e3081c3dc0728b57884a69644a500031f35e3bef244860596866fe1a238e29c7418f8dc5805afbc428b6d0000000000000000004511820c21810c11801401004004068448b6d50c2b2796f7194a043401ee94ac4134a65cf86ede85f3d79fa1ffc2e3ab250c5eeb5f36f2e715c46d0002ed20dc4a06d198360281ac05034c6913812871c27937d6d8bd03049f3e17b63f4508a29326c1d610014526241d9c1c03c270d9695e2802957d27bbec) <<< 16000) + 0x1546a1eeeddaed44da8748c3dae3394158123cc421c78ffb861407f230d940c270ed0b0e5608203fae1e300202014ada8ef05825331ac24249040eca64a47840ed99b35d0810079c8e40979224009c071e6819053dc989a4b26300256d184972fc4f8931e400013027c792380586b09999a15dc07117ad9e09786fc4bfd1805954017a328e0135be0af9a4e9002801c0000fd1b2e4a8e5e2283092e0739cb0cc2369de70a8d2c8006e4d3ad0b1816ae60e080c302a741420070401b923694180015b8761a00014b7fc55a8c9002601002f0080007e8e960427853a0d28123fa1849450c5ba18f82c864b2819da58fb45419898a1c242122a18e001a9113ec09c208c0200002dc648121bd5dd3c1071452aee46d68218522bfdb0037108100bea339926518422553f80297410580756be11901c06963012ff7b0602a28415bf11c040529c7ba2c3526d09002e03800a80c1a80601c0300027620d2039209f0d5b917a701c70cceca5bfa6e8b1043c477e615eb28439b40745cbb289109f47f2b5277b104118fdb21090b890082b054d35ef40c08582e18edfa7010225cc1f1e3590b3282400c8121a4996c5da0fa00164001eff5d8fb59240024dac159428e381ada22de47816200169ed68fa80e204ffe69028b70820c4c569df00e1a1a5be8acd4b021a0d16b6004cf8e6901200600700002493c60d5c955f038b0689ac8e87120498e6790c2214286e1596405238315b3830a4b6903a40032615e8109c108c0200002d840482503d1a8448ff4106188c19b75960a5066dd003eebc220311735bd8687061e0bc297d5b6c708d705b4158d848373bf2ea1662201cbd173c7272040d95efbb3e96b0609002d03840ece1382a069846186161d7f402fef2141914fc34a5710c880c2c1814ad38b1c186f4362a7298d5c1c221e6cbac97c7d120ba9f58e710546c8060226ef5656840102e1a1bcdb07a45f42404801a82a00009f480780c1a0060009e06fc2a3c5ffec2f2cd68ab0544c28c24c1c71ca18614104c00600132200200d0000f620018f668768d7944bc1a50db284e606d8c61404715e57110820d4c0fb3e2a202011c5f1ba0428480e263c57bc408e1aaa6e4a0140c1e131d8a14100096dd06406d4a4801581400600544d86e7cd966c0e36ab6bf80ea68a29f0fecdd35e121ce2628cdc5d0c18299d4dd2f71209c237ac5b33900dae69a97779040f594e3f5b920e03bddd3f52e2e3c2400b00d144a3dd4410388071b92a814c7acc28af2e0b7408742439cef9e4e4630c192b6db31e50890564c397f720640344ca8c666da1c13c2963447f9840e7bf3b124732d909002d038000117100046d20ce0bb250e6267be891631d21ef226d524568a3e43371a5883634a18f2445125506835f908e01e04bdca555140247498ea1e41007ab9e25cbec4fa1018560580001e820cc220560100047b90280981382f881e7d78bf18308b6a6817f4a2893f4bf87e9e38601b934eb401873513d6af60305295f184906284e957c88cba200be8240869c00087fd5f7ab98120050040c21ea0953a15a85127ab1ef608f2186cbf914e4e4818296243cecb890a12b019b7978ac6051e44d31133020368f3136e46814012727cbee3500024ccc82061a29412005a06800022c20cc0b0650583202c18c140c40b0610583000f46349b7a246e70e33ab3153c42d8914032694be11028b1e8956b19d024426126d76761902406014b5475c7105c78fcd600430292ab0aa6d9c101349cbeab2be57c2400b40d00be0200f0149098a1f154a042c744668ce26f21e305f9bd2136a0a18b3080b99cf0406024f30165af28268c656eb75a12140650032e11030873047f00ada1825f46cfa7a51c004801681a2485f65f9b04a6858eab0c33fd5e50f183bf6515afc41431bf96ec796182030170218f6e4650505e1e9eab89090a83cbd52873a06111f48d7fa6490c13ba05ac261bbe002400bc0f00004826ca503637a02160e2078b2e508e0b587286193ae719e757f186860aa11fc1ea824557e05ff67965e1c2362312b17446424198146dcea7a48201a3defdd4f307c08143f6074307560967804801a02a0178040005124001cb482e82f8ef47dc1642868f77608c1029282641f86164146a11e6005e0dc4421803bc05822004c204201000013620ae03b2807c16e22a048e77a6996485207a7e99d9a518c3582a420f440a143a386c9e8c48b2a6ce3c9a920556f0d544688e0a3e1071ede0504bb65398c21b09002902402e00a4860da089a726858eaa95d2273a50b182126ec20be21431fd66c52cedc20200c920af0dc6503053328bacc909067c70fe0b5ba040925d31b181890803b9e3d956a3be002400bc0f124468012d773253963a086a38b6a3e30e3c302efbd4a854163148c3e64e0f139432c1526197414f1011aa7e779cadf2140cbd3a5ce9f3a4120d0c90f4b7167e040a27dd0dfd5bb04b3c02400d01500004e8400134082d82f09104bce89f20897e66c1f02c7b53fd582424629ba0e2e71c6b489ffa3e3403c36c5c191c04a3aee5e6028e184802800017a34480c9a52f844068c42cd9b978be1230a30979ec3e238cdaff6a8a9938a2c7672bc65e104886339686d966102423b25d54ed8300a01eef438d60801dd877d861d15f04801701c3098530310d0b8c29043e2356ef139660b1edab5b624d2e8648c4a9005dacc1b51c66cf2db0dbf3839009e300417903c54d00cfe496c3105d638061660849f8374f42404001a82a00008f082d02c164160b00a0004cd20ae2a000dac20ac0a00)) <<< 16000) + 0x18f62003bca400f87082a90f8e1086c66c6c040b44224c53a56409fccfcdd48f2406f98e78a6940384be0115767501845f002c0f56018200000d8a8c01009338eb3166808003ffbcc9da9292400b00b1c70d95ca9fabb000e12ad3e7fb6f3d08609453ababa0b232204088f6eb2ec92f0c2ae447b08033bf06080000590ca18005019cdd88e8d14a02012c848dccc57480c056ca24eda89c07a1204801a82800009ec82a02c148172336fb409edec50abea0902cca922c0fa6585b0e5082495404b679222ed2369cfe41843957e0236c8608db69a820ec10000adeef7f099100854040951d070a419e796b2b452b5d0a7e31b178f40ad996406a83722e80000000000000000008e27d294e0f32d650dd01609513a588096d6d7a65a30bef21850c000000000000000002211441439429220610e002017040100680015c9a1c08af20d6142da46d32ed24591e9109ee488ff5540b4c3089d3460030c09a7cf8735080006f5142b380118043073930b25fa65b6dbcb0107b6b73a6da7d4de6aabbd0700000000000000001f09438c31429229220610c08e060000401a00030a414c1600063e4001f9c80b08b8a7e4423b57c92206d98441fb4388a9b37a6b24921a599b70516828407adcfcc810a013486cd3906200d7c809d8de840409d1ba5b68080030dd233d1512400a8091c70803218a4048c23fa51588c816840d37e148e28000034860244ca6c3595ca40948658c1a8c80e2209292e00a10db45db9d00812d6a4c059924801380c00007bc82900e884c31946a024791be9c170244675d137b72043f6765fd32431f0bab47820304f05e094142208f43d280400038189ce280424008510861e20b58d2479f2614de160a281d616102c0911bada00fe764088c648ef2bc2431c3058a96d101800f7b23cb850888a37f7ab63000000060ae0214821480e00008148001e19051098280280020d08278c81380409a0204c0102580812804002b8a4124c60905b0272d82396c118374406517161de47a8396cdd6400d0dcb1268f3f451aad350701d6ce000e4e86a01f47a18a015d4c8bce703483ee9acc0803442eefa699a7d2a954ee008aa8f95c09704cec9a330beae9582561d1357d8f6c1d464c9a4798bc5cb64ed119eae4e0b0c7697b15014c321004010046195b85a30c1e401538182912b9112850bf236a7808892540500d0b62393020d804000043482280c1100608402c32355f616182bd66471c3c103c09126780408a94ac50081c14df04a103e01080000802010c0700401004000011100007420241b0410d8000da9c0970bb7b42072d24f20280643e7fa0c0dbfae2e80248303a0100000d0302e42b5b48013cbd9f0801aa920408c306802008402c31df32078287a4cca393c045810f78a03c6bc56c24081d00861c47c888782e02b3a8a09a2fa5611840d004000025482084c00063880b06e03449bf425816f8e704011080e0042c269e6a7c50aca5e970805b0bdd423081a00850a0158c4900001437110073d396011840d804000026480784c00058081302800082080024710400dc86162c33c92c1db2080d6900c0a66e2287000d0873ba080ac974ec70009460840217705bee040dacbb94a095a94bfda8227b96eda718302cbf0a8f17ffb0bcb35a2ac1531821020c210124014003f2b22c60bc2ce7314189006bd652fc71a4e2244c706aea25a128d70d8c3d8bc177ec62c292e3f5a20235189f4b10da50603461346bd2e3c60d0bd44708a0435bbe860404eb7f6e0010090a63a3009c3080021828f05d8b1c716373e750038829f9fa97142285929fc90001a9b8c2425082100871798c931d9bd0f2e61840a6d0d43564fb69df66219258913d7e0615c02fa82fdf9950ced98eb6e5b602d25680cb40c3c3fc55e9a07102755384c6b4eb2403ef96e78bef129524e9ac92a16911c2fa05084d8b2091a8e15d45cea2b099f97f7f7dbb35c22f01788b4420014d1c3c528f94ddf9a492c91ab6050c8de2bb11b205e50ce626a6e824f653e457646c4b5fd525045ff71621f4260811905480004e32000c0878e03fa76d71c200ff3ff44d0c241081d25062cbe6e191438e23f8f20a10b45b8b6c50045cf16960338810804000059080047c9000bb1203a3a01f01000682103f2581f0cec703ba0da08a10091dc6e810692658fb02804638420108081a0394220a080b0b378c041abff9a9cc200048569838200d2e8c36e8a0128e11804000046881a0a80cc5407a220310d00011f90280d81384f0e42297d465820d4d269330000a1f75d8130c2100441242246fd2302094fd4094d00065006d908c20880210000100401e00809804000098400045480e88c0ec46074230390981c0480681603203927bac372c10125521e0f180032852c000846383e010a1859c540c619565bd88c0e9df4904a00f806cbc602e5924580025181c00858fd06959cb029b5a8580442036010c224bdf8acc0cd31b1bc901751af0808c3070021a6fee2b43c38c03458300c10b10897824c30780100001484000578e2ec676733907e46fac2b4e6d74738dda5055fda131eec0bafb36c7e17da60f4000017705bee040dacbb94a095a94bfda8227e7220235e897de5fadcaaf58bc3303dfce1ee6e244fd0500000000000000000fc60022fc2a3c5ffec2f2cd68ab0554b2cb1ca1871402146944fb696f1b88f49057aa85951f84a4023355cfdb94bd43a79aa2d85bccc71d83a77bc5b845644283f4ec0650d3243e9a1c810b3b9d91ff873ad287b6696b11082056ed487d0bea41d1349175f62a)) <<< 16000) + 0xe9046d8d0223498a0ab5aa54001884800416100093c201a038221c9ceda0e3819b37b41020defb2f4500449520cc70051002ba000012920f804000042880f828002d5881b96c0d88703d156ffa8a10c458c48a0939ae49a84c4070011038a112580c32e8cf80581943521c4009ce49f004820360100000c5206a2a0340d0198680c8240620a0300501782c0b81405a0200023d20020c2400a52cda029560fc303aa112759c87a9c84786463e54cf7b991c380b84700000000000000000011ddd0b6e6e77e11619bb6451f7605e6a4845d237e97628682da2000000000000000000441839c98592fd32db6de58083db5b9d36d3ea6f3555de8380000000000000000f92d1a87f6779ae1ab69ca36f645fd8e0dfd4f879550c8fb880000000000000000000000000000000000000000000000006041031801400404001402039f07788c03ff35df8b4e03a7fb847e613326c4b45d7c4d2c62f7d44a49399a6ea0162fe9d77d69c9b8f696c1ca9a7e8dca4f54bc01f510c79f596b56d16c0b984a37858f37b8d7919ffe8973dda7eec06e7cbfe9dc879dc99e13ca4e69f5033cae05eca0a29f6336f5bad03cb7d03d6f63f7e73a2f8c531726174dea0829e2ec82e164461a7f28004ac100361d20119c078f6d2537b2c3d308e2e10879d80e1a943834ad7423385a2c0c0f40ea02529fc4020292a0d2fb8c9b0080207d2ac399384818171e6ead7a5a2502023e8019362a5a802a0547ad3fff440481c20004161b02c3043431dc57470400000bb80c0c982e744d101000002ee0300032bc14f00400e3e169d00000465280252c230080000b3902c2980180a060053c88b8ab3da935f7e866170aec5040edeb78baf8206eff7061ec20b1e0808ad82f190513e19220333faa2c5a914000210116cbc9bd3febd04dddb468620109268dffc93bd65cfccad5e1ce82000034170cff1ccd312370c13471850018d65d45670d2c5301c7928e398a400ac073680b78b9980b9b28512ad4602e113ef7b6ec00b7e02deffb0202e380c5e2ffbda6e75b5405ae30fde0afb553eecb103c59800000000000000000000000000000000000000000000005c51c21420811402a3e1546dac35ca0f3088ad1c969c054e0a6b7e9d867f3f59ea4a9d385b5fecdf298900196543c74bdcf32ef13c22707af0e5c35729bd097b87c293a4e5fb25b15954da83a227e5e103f1701843040263047f040966a284a61800bf684ca0406110aaac22004a38440100001142000be040a8760522a0280d81384e8609f043ed90109384fdfc60b14d3638c28000a7f01d09020840216387fe137a490c3f986b68387856c91c6180013f467c1202108043879c1096e51820347736506001155cd46300210080130080002f08000d710250d80e06c090260340b01901d8e30ea50381c3b58c4831961103491b78308c9b8857e48002cd54a91c00edfbfe004c1042010c20061602d04099608e3f83030fe40570081c4a160b2040408fc219a5000643dda114003453468938210804204cb8cd1dd18184336143840e864f63c020206adb49d24042100800006b90002502046130220580680ff391011af44bef2fd6e557ac5e1981efe70f7371227e82800000000000000007e5d9b0dae7ca0597e151e2fff617966b45582a650c384304184102500014965cc9ce390b1bae0c81cf0cb428f851f4dfcdd9fad87146ce2dddd892bd219c4add5f5e51f243d7b069eb099961250618cb2ca8001c7900b050003ce1021218100ec07c77014010044040040110040100400f02e01002008000022300c0100400001110000b120001dc4074660382b01b0d00d02c0640700c0100400c04c05c27004010045068fd472050b3f5942820cd3b43c28068ffd824808360100000bf202c1290906632dd1022ddbf7507002f69f66100d1543c58090307802000019e40541400042040501401a03c0af33e1e101affed42408320080130180900c04407210006258d5182000a6255020002ea5767c1000b9d259b8004ce684bda65042300800802e440587ec89418326f954707e0352581820bc86f924041d00860822a0c070706f27e2df83045ef4e9bcc0016fecbc09010800200001a440006d0f0a1c18da9001dcde191402a213ee246183601000009b2000750403c15860531284281efe17260c05b5ef650804837dd100904070021c1acc929d0004b060b4da587cf26c3eb6fa6cc3c148c0510c8c1feea2537aa211a16d39990bee375171a78a9410fc288d86e1df2f7e108c0096b8eed0cb5da4fee2b133be8a466ea627cf95aac0ed883b3262aa43ea256bd1752d8a115acf4a05efb606ebd59e952348df0e551b91cb5a6672a8a85a3622cc62945ab2e0a4c896ca48fccf5fd73335d7f196863c07d164c4894110ece3af6bff37005095a8e73305d3ced3b6b1bb22a6325e445c846981505121d390df63719fd86b6179900d2af77cf36782db61fbb925bb56e85eb12891740d0daa0b24235aca00006d9201c230007d1201a3a000c8420181200b050007b51001119200386a40098c0d0dfc6cf4fc0a0f61b8ba0e101003c0075c200dec31d80c30000001770040197744b77001261c230086184d9b336eb299f6baaa52614582f214c44af308a711e1c860c000002bbd87ea3a89e5a014300222ca8723e0b390f46d8504a8fa8dde273174fb4eb2c1010006fef9a3b29776f353e80000aa3ddd7679a42fe900e13bb85cb9ff5ecc38ac1880002ff2014420090900402801c1400c0a005010020080013d48019880089400202000010017f59)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineteenTwentiethsCase2" = "QuadParityNineteenTwentiethsCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineteenTwentiethsCase2 private def zz2098:"s0832"="s0832":=by decide+kernel end section namespace Green24Proof.QuadParityNineteenTwentiethsCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x42caa2ff3, -0x2cb416090, -0x3eca47712,0x35d4ce], ![-0x2cb416090, -0x17c11c200f,0x5630ed64c,0x15d7b97a3], ![-0x3eca47712,0x5630ed64c, -0x12445e2c7e,0x2d22605a5], ![0x35d4ce,0x15d7b97a3,0x2d22605a5, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x2aa2f1,l6),(-0x2f3af36,l4),(0x35e8cbd,l10),(0x782ab52,l14),(-0x773512e,l12),(0x20c2368,l17),(0x577c22fc7,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x22560e0,l25),(0x57d08bc,l30),(0x165a0bc00,l33),(-0x77e97b,l38),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x77e97a,l34),(-0x55bc5dd35,l41),(-0x3dbb9a,l46),(0x165a0bc00,l51),(-0x36ef1e3,l62),(-0x298fae8,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0x577c22fc7,l15),(-0x55bc5dd35,l41),(0x782ab52,l14),(0x57d08bc,l30),(-0x36ef1e3,l62),(0x35e8cbd,l10),(-0x298fae8,l64),(-0x22560e0,l25),(0x20c2368,l17),(-0x773512e,l12),(-0x2f3af36,l4),(-0x77e97b,l38),(-0x3dbb9a,l46),(-0x2aa2f1,l6),(0x77e97a,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1904418014801800000064580e3008000000034581980200034108300b9003000000000c81c40100000000064062008000002c1080f180600430901401e90040000170c83814801001885208c0964010000000120c031804000321504c079003000000000780a40100000000084062008000000542a07180400630c822025900400000f0c8280a801000000054440f3008000661a0900f200600000001a0c0cc010000000783814601000000000c8052008000000002c0290040c608c0ac03c9005000188642201a801800110460a02a400c0000000241819802007c0f02101e1004001e0420d0138802000000220a00c300c0000002a0a0518040004c1482c049003000000000580a401000000882101a300c00000000220710040000000011018802000000001100a401000000054340a30080000002a1e0518040000000009038802004c0b02180f480200000000024062008000421c0700f20060000010870078c0300000000006064008000000000503200400000000048190020000000002c0c801000000a43202c6018000a43409022400c00000001c2819802000000002a014802000000068500a601000000741a00f300c0000002612031804004d08c1200c9004a10520210019a803001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802,0x1b00a401000000000b80720080000001900099008000000001501880205106508402e0802800000000680520080000022048071806000000110f014c02000009c08802c602000094260900b400c00000000f00490060005a188a4091003000000000f00a40103c82282d018c40140000003622031804000014848004cc040000000b0900e601000000002c009200c00000001b004900600001a8110050c04000000c8120186018000680410026301400000340880718060000002105028c02000000000480e401000000000340720080000003a0c031804000000001d018802], #[]⟩ def dynamicCode : Nat := (((((((0x2cb9ea08d13230a0031ad3ba28a18b69272c2c851e1b7a0c2880870730c92000006c43d609820900200b60bc32a70e98c0185868252ff334a3baa2656061419b3c99e4d09e4bd00b58c082ba3ec3c1011d4b7ca2c4e0846010c327d6659af186161856da5af13ca000204bf101a51bf7bce44b0c28307b3d34c2684e32d09400c181052502cc038808db87ef0c34f000028918710789042901c0001029c333243ccba185822a53b9f34a3bd21ed466140853cc894d19a05fd7ff9a13c83a3d783014bf04cf013801180430cfffac656418582ae9e0164f28000ac3fb0694958d31fd830a054c698269a34113060c18d0a5d0593884602bdbca36563c0000d85d7b548012808000077082d028000dd880038e905909e0e0b3deacf050f7c18849fc50770b81b21c20441b64522e1043203f7814502fa25b1eac480e9b368c904000b5f9f7d02004531c548028448a120080000774c11085a4f3a0b183f3825ce123289da7ad120000c16c55e3800d0199e4860047326e270a04c304601000014720b01382317ad8f651167458c3f70f39b333b4246606e527acc1f610304bce9d3a5b1c030c63f79d0473da010268eb6375ce0cd0410abc0d0c492c102005753a5e0c28ac11238c42060d4141045298a37c82c613306c62448c97f6551d0908057867388408431f4e4c1c002376966030029a725578012718230080000bb10580d0001f699dd0acc633540000058127f05c48189149107106106088005002000004c9200803400042880d8af0c203dff94e3eac48ad67c8b6b0c80c488299eb2eec9828388ac23c0c80c00030815300a25860c8182557b8469cc60608392850077afa24080ff9e5e4d9958e00233def2080d013122c083c176e488c8f104a70e212ddd6b2a30875afbde50c10c387e8ac4007604ed480a0376d859aa100690392ed0000d040440100001a120ae2a056050002139d75338bcb71de62cbb94a09afb6e667a08dc16643fcebb8d47b651a0154e4007873202a7742b318cd50000016049fc1741861c31c210208100404a65614dec44d099750a1f0576bca7cd107d96229953de3165c7c1186ca0000875e5fba4b15aaba704171ff27a082a618a53500036430e34e99ab319aa63569848b6485c316cee199820fb7eedb2000000000000000002088c10610c08608c00a0080200004eefedb6e7db599de5da01de9a6329fbdb2b3e974c369534d87d987a7d44e9537842bdb93771cd29083a0005904154960a8320531182902814405034cd40b8c6260e13c1ec0bf0af0c12882472afda0a1142ea0d3bdd1001428a95d6890e01eba027f74b8a00a201c6072f8028550f70671b944da7abad385718e50580509e8cd8f455fe96eb0ec15c95bcc1209851249431231221409400a00260400401b850129a962730903bd0de1a4925c0602f70a1d936be5679436c96acafc2460db1545b83000669c3c4416710230080000b9105005cf466c7a2aff4b758760ae4ade60904c28a18a08604404104a0050011c0a0080370a2dc2c0250c243ef156c0286fdeb20ebc9186f291a303011750d83ec80010803a6018034b609598019c50880200002da400) <<< 16000) + 0x0a34c0ae2878f240813c2344ae810180c88e7c814300e34c4e620001e18303c20018cdf488020201c56f8c00000f01ce840885038460100001a720440ba21620c596761220b7e85590d20469aa3a1a303880c60d81a9c5043822aebae02086d603970c1801430ae7bd60010bfa14b188010290404e028a1891333f7c0123003228506430501165c2b7c38a0077bea6d060c03d9507930808292153db50410ff09895f45016ac171703001a40a1380a2c81a9d0e594b1985146f002869f3998224614005656dc2003c82885a4600ccafa5700026142200800009f99e8cd8f455fe96eb0ec15c95bcc1209649439429229620e18618c000260600401a00020e413c140008ae40018f88006be904e29d10001e47b3e183515fe6bb54609dbe0022d51c19c996583386043ff028c4f1400fc39773d8400014ada8ef00051e7f24bf101260609804103347e0717ee40a00128126d0e2e9c67ca88a385281c5b4880c12d438cdb6e3824b71b3cbf8c080149e24da18061e9ee329a025c0c1300800006fc8268e8130140960204a0102480800100482418c11ca608c4b0161582286e88108f337ef33d616b3c0a4732d3d1002591c010b5ad483f38adeab12bf038085486b87fea159b0700b5aa4b060a010a70696f2019b1d6a2b0a4b40181003c1f44ea4121ca76e700ff8195400002895182ab1e485ed4a57b8839286d1c958f0fc2f41ccec7e0aa6831d7f4765ed7ff3995c6a68214939f568d1d2e9b2988429c37b405406e134596e9b5f619630558b73058974e9f681c0272ca208014101e004401004011a6f8908e41a33f82051900023954d8c0211acc412020e004000030cc175d7b08302730b443208190040000361043058000ce104405c0a118b21c772a2c079844934032952bfd68e4d162f3dab4ae88800b47a7c1aa6080f2c21f3fc02e7682f585d20b3596b41527c82984e0d488c9565484b7273c0d27014d939f4fca5bc3330d8218f522bf7e04f59bc90d0b6a4c7e4e5d886344d04200021c2b99a1459ae0b7c12f0ba2bdad16df1b260a574dd76cad7da3009c4d9c156cede4d1649bceac18daebadc511c86fcbd5baa0b7397f30dbf494c629f46f0a0c5f42310c2c162158488306802181dc483580a0299b964891060e00400001dc82184c000468800324104015e827699d57020412aa7040e0192110d70401cba090c0014c14ff281194507c021c086b6a54c407df00a84701e9bb46e018c4074021000010044040ba975e2004b5e25400402d2f1e271800f804000028482102c048170040100458c0957a620800032ab6aa4800a1f733e40115613fc84808400100000d334380062ea8602101ea8e11040e80400001dc8000d110002c520007084104560801a0004cb207e4390c3dc219602820fbaaa7b0c1beb4adf8840d7d90470040019162ddc80128c108042430c1b2b260a08422e048c307302b6d34103017d98fc502414210080158080003d080c0e8058460360a00025c207c5303d19d8e43a0c15c5040c2a62a820ed5814cc1408c607c0200781b81c0513586c10101d69e9d8041c4b2855c82000525f9af8200d86d87f78a8128e11804000046881d8880e8460721a0380901702800098481104f0e064e1fd22c1196a4599480005decebe10002816a9040903088021008010045160903b096343113d1cdc8e0006657ff42400036f955c90108802100401004000011100011720002a840604606e230361181a88c058440682201401c05315a08e6803275fee480138ca5a281222f54400012100e0042453fda53b041701333024097de7b70008c607002143199aa92c38115274fc0a48407801162dbf9ac30c420700116288ad32f38159bbb506017ef17308007fd2be8c0438a6bc094206c0200001d04040060002c840cc0400042040c8240005ca60886f336b040810a64fc441000a27ff14004e9db51000024241f00800006f901b0900027010312d8060ee4690c75df06087baee4a101181c8da8400ecfdf2f150028483c008030010178080b80405a0302c010000a19000962200397c6b797630f738c9e85130866922c77531eee6ac7b95fc36e07140000000000000000022002fb4f196cac274831351404f4e50c2fdddbbc77f27e2d000000000000000007e9a7ed50d37a2372cc4e65b4c5b848b2ea17734ace7b60000000000000001daa14b05e66f5fb72bbed1dd3996f346bcc6735c5bf34e1a4000000000000000000000000000000000000000000000000be8206300280080800000519befe2f664b95339fef074e24700d59640cd03e0cb325762707113f59618f52f231138aae1219d6b603f627143b53ba7a80bbab367039339c3e0073a62ffc4b4bb3a6d011b188fbc32359fdc8d35c488d7096ba3ab87c23670090f5db3c12a6e07f1bd8bad5bf5ae8031e1f8bb14f577f5ebe3d0fa5dde013261477cdc385a5b3a8ea4eb798bc73844fbc199e88848912502b010004c59002ab62007e4078efafc06b50e2acd66997638611f17ee00e0acc9642ca30305f1e30e88095445624c2004b62ab440603461dd10408051119d55802a2525044010c0828dfd2ed2aeb363795e939ef73e173c99d08e692000000000000000000000000000000000000000000015848208087085087043001000000101c12008036499fb3fb2384866f00ba47480c74b167e88c189406f52a0c00de8e95a610031cb35e6801198708c021228cfe26148284000002ee04891aaa3339471000000bb812183fbe33ee080022e8643200930c118042cb2be611c00a1613)) <<< 16000) + 0xf5760e2052818258fc404b9416e432c0435386948500ade8883d0c00c09151e8027102200868e09c714084cc1e8cf5293b6943892662aa8a20305449dcee6306884030755c308a3a8c53928a0b8e4442f9c2c024997ef2280004970d0ef50812084e038e205694cf1cb3483eb2325544b180000000082c5000005dc00710a7dbe34e0103015368ded8e0a0f5e6a8ae18217d3b1dc2cd015d5c211dc84801300a3881fee986b4d23fb1af2b82441b916e2c8e0b71f929d7200000023290200055a0df098008802000026a4000cd881502f47138f0c719183d257336df051400b932d105090fe65a8201837dbdc70690c0f80f08dd2c205446e0654e580768873d5a240198fa096106242094051c7000000012018300000d2f000a14a3d9c003da48b439fcc13461445333db906296080bf39ebe4090578774101f0082f5e2d0b732140596452155ac8120052050f24492900ab9c4c21a130462850a3695fdc5060bcaef05070400001ae50208ab56a142240000013d713801180400005a8f926073fb24a712a4a6af688612000008ca0710a457ced7078e5751f18b460e000008ca6206b13a60dce70135e79c0d02800fad83d87a40090031e580000406a3c90dde177a47130b5b41f34a142ebfa0bc86086a1cbe8d0410c883afb848000002731e700230080000b510003572000df840023e0800736101f01000803900116920520a0012e220029ee40a08604e3a0020140c0239610014104803e3dc404729931d714000fff950c402993dce5a1094408802004c1301d0980e04806c2604a0380c215fba3460cc9e9c47430b399412186074fa847e82003ac664300000c16ab200009870800212204fb93af0e217be7f8a081ebdd7b558e16aaa56c40a0828a464e8c000cad0da0004c3040010919285ee120d1024c16ab8913f2d24ecc503db289b543005c413664525102000858c107c27502461be5c1990c2c220586644038cd0e7e02481842010025058000781a1445c0eee10295b2f6eb144d9e8dbd4407ca5ab0f8700067e0c580004ccb97e002c283e00800012c20006ae400129ce082312c189081400532e783001b94021c080b644a90bc50024202200800007410006fc20483b0230d01104e8606358c8910104a283fa860b1ab7899628206ca50bf1400025acb004a1042010b1ec137741890c49e4c50870fe8291dbc9001d880438700feb49b34400964d6aec981080021218153774c470f2c828510304028a706023042100800005510001f020421b0200d80b86c0500763868b548c870ee77fabc058429d830800c2aa0c49b992001b306bcc700176b6a9620007c9e5f9149c408402102658f53cb0c0c3257d2d6207407a90961010244d9c28c81042010c20760070e648846a933f0204b2581d1c881c9dfa842c6041c9099aa4801077d7f11c00198f7fc0ce1042010000160203e02000269343064840816808204b87533aa0e10c3545fe0e8c14a92c178e2840b9145f1481140033ccbbfac86001af1405ff88190e285004000019d201a0a0005b5203c3b01d1580e0a806c57014010044040040110040100400d02c0641700c010040000111000089200018c40606602e230160d00a82805007819e693e971c307fd88164812058e924548c507c021c799e841a300e9fdfdc9020d8023082562b5a88158873f3a50007371580a00253cbc448083c0100000ca361aaaa607050e0fb0f8c70266023732c079ae1b4048103a0100000c934100d86d7a0e152c90ac998000005d770c003b51b7d1202100043080f734494384e6437c4e105c553d5f42800205bb9e1000ba72f624a08400100000fe3c18bd86059619e0a8c08a1cd4088a9603bcb3e285020700100001884000b2c80986c0014ccc02e08fd9840f1660063005d294d00046303401000009f202402b02cd6e5440159f7a30188406402180a7a73420012b09f7c04418380109b1f3c678bb1398236939779bd467250e666282fcdb57b07003c610bb17767ac23c844088003f838af12e21b6b4c29bee2b52ebb8ee0bc4549f8f12bbe9df9cc3a618a67d823314eea0f63fd1a90d3ef4ed068f55aac9fe89ac9664891737665c85c765dcf5434309806d532a0000d988001fb10111500806c03c2400098640382401a0a000bd12001ab04005bf0800ff21a2d8cc6fcd528a182663a58d00a099ed57d62c0808030516da70800393d6ee2c060002ba1d9a4040048a09a5f5208053901400830834c3fa6f8e10244014aa305329cf0c68a11d6c8170c20204b30900820b72ba761020079ed1990000171c2200441029420933a1c78c5130e900e2804562f62880c01173f0a8386598f7b24218300077f5338200045d4858400004178b4b5c5094011024cea2721531c405ddab7fbe2060877433fec2089df5ac72a0c08c216088df24007818efdac30013e7a0ff380a3861380a2cb157ec3f978a2a5357fc5002c6010c5fede0a18b10debcc720300045f9c8060000294c202040008461475e7002600879f78af92bf89977930f41394a49bd5d0e34a9666478dc0000000000000000f44a20b18a1891880cb04404a030000200d00018320180bb2c378c90ea85154568cf4852c8000794ecf963006e4c6a74a18b1e3485aa3000014a9c952c084a008a212cd4324d96308fd667a5286623b7c7ee48c0077f533880c0f3f31ee94046df5320f0c00bfc826404e084601000016c200059e4001870805868001f6c8050480026c480059d90092500406801c2400c0a005010020080035c88019280086400202000010022819)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineteenTwentiethsCase3" = "QuadParityNineteenTwentiethsCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineteenTwentiethsCase3 private def zz2099:"s0833"="s0833":=by decide+kernel end section namespace Green24Proof.QuadParityNineteenTwentiethsCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x4104817bd, -0x2cb416090, -0x3e8984dfd,0x1770], ![-0x2cb416090, -0x179f125fbc,0x5379edd9e,0x17c671e03], ![-0x3e8984dfd,0x5379edd9e, -0x123b7940b9,0x2cfd57c9f], ![0x1770,0x17c671e03,0x2cfd57c9f, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x249f696,l4),(0x249f697,l10),(0x43a59ef,l17),(0x54ba15066,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x43a59ef,l30),(0x165a0bc00,l33),(-0x249f697,l38),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x249f696,l34),(-0x43a59ef,l43),(-0x54ba15066,l41),(0x165a0bc00,l51),(-0x43a59ef,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0x54ba15066,l15),(-0x54ba15066,l41),(0x43a59ef,l17),(0x43a59ef,l30),(-0x43a59ef,l43),(-0x43a59ef,l62),(0x249f697,l10),(-0x249f697,l38),(-0x249f696,l4),(0x249f696,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x288328420170401400000000340290040000000005018802000000088780a601000094260900b400c00000000f0049006000000002a01c80200000a211809c602000000000140e20080000001a0c0718040002a1202c079003000000068481e601000000521b00d300c000000001a031004000000001e014802000000c812018601800068041002630140000034088071806000000001d0188020000000e8300c6010000000068b033004000682106017200600430901401e9004000000000481c4010000000241806300800c42904604b2008000000002a0148020000000d8301c601000000000640e200800c61904404b200800001e19050150020000000a8881e601000000006830330040000001e0e051804000000001601480206304605601e48028000000048303300400f81e04203c2008003c0841a0271004000000000480c401000000054140a300800000036160518040000000011038802000000001100a401002605810c07a4010000421c0700f2006000000110d03cc020000000a8700c6010000000005406200800000001c28198020000001309018c02a10520210019a803001582405809d401000a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x597718728db8c2816f3a8a194520bbd5b902c8a0c8eec0c51018ab42970104493aaacb100000009955270423008515e9ee90e7c34900000232994489cc1818a0d20000008c9a590aebd1a778288139827674080838bb9d588204b0b615134581589f1ba8432410940400003bc6c7bf480000003731a49bca3ba0c0744924c1ca1c91ca0c90040000030100200d000102324b6820cad30b18dcc32e6a448d76271b24b2450e54ab14b1212c8cb765a070047c90d14a30077802f6800004e499cf2b01480c250140000d91b2f1d26840000000038300556896e72179008c0b1efd20000000dcc6926f28ee8301d21c72852051c520110004001b88008034000658c0d1262f51550b4d0910bd1b62fd7737f8e22dab6f499aa59d1844a084a7ddebe7c4824745bb9035f220800a82db55967aa60a03073f7e998b0a41000fae16d42c6a6410001767dbf425d3014c89f82450dc160000534403c178643746f011df412282b151e7a88f091015b89f3d4f463887b4d41d7b8f31840583e3546a98060839aedf1a07a81073e44e263725438075bbb05ee01c049c410206207881802db471e2458adde474891279ddf7ff1c40de51b028610272373ec18229df5c4f0800f020592b140c3e32006852810220080000cc903a1101c848000fec81c08fe81ea4ac049d9c8f795789e5ca504280c5abbbd0c05acbc749a0845e5b435568f570742b47ab839848630c3863842041821022205303a44ce2e93a8d2e03b7bce2bd570bc0d8b87f463f58d896ee1eb654bc2cd5511f79077601a83af55624b32528001879db05fc6b09be96bba7f2fb553803c3d937b05ee5a15e3b6ae000000000000000002108c10610c08608c00a0080202124c39380c5c083aeb9bc6be6007309c87b5541c18386b0d963bfb38e20f47e1d744d92aa35b911ca2a488a00059e40dc8406c0a0350140d40ff9992e0c709e89b37ead30c127f23556e7314228e2e9ed89c40051c5c976eb8700eca47cdc750a00a6eda81028046ab8a21e05344c1bba256d2e338e158122b421c0505a93c0f5caf51a4f0d048271859461059060438448018180001006f180d9d817ef9a400b71d0f3a610c74bc52d796418ae89fc1c70e000004e2298163cd91661270262ba14684960592bc280ec30050e0d536452400980500003cc68a4449f8dc98b24d454fb974287003d0e91c820805b94060a2c1ad84201a1860400f42ba122803d8598b90450014774b84e00003fac02ae2a40098040068020001fa3850005fcd2) <<< 16000) + 0xb309049f0e664492c9ed1c718a1da1209aca1436fedf78f9246142c8c7ac300025c1e2782708230080000b71e1c046d8fd2d9848e368eecd36f828301157415b0d901af684337631460c27fb598a4281869f4f9a9c7f81c20473a9045621009f46d3ff69002070136db204b12489002d03471808d531cd4d2002770689184284e6fe152c8282e940306053bd88d1e070800b454b21c09400bc7d42c08893524c03004362c3a32900230080000e41b24859fe3358a62c7099b191b5b58818012c73aff46145032159c4a5f090800642be72c214205ce77a4e9ec2081ae853a5e562c1ccc3fc034b202005941ef03162af09002e030019808000928e1432dbe2c34c240baff18414340c04afdd2460d75465d260220e968a9c80003e7c6a98c00d006f00109c208c0200002dc4001ff8d1007250f4b8881523e1874899024b073ac3ff1c4003d0e91c8286007a15d09020008c46f5fa020145abcd62e00a3881380a000064480982f881fb7237318308bed58e196e2894393ce5c5a386012512bbc01873328129c4030530fe39fc92284effd56588e200be9641946400083673147a98120050040c220853eaa9ad05128367860f2a2186ca75a49b7901829922939724e0a12ca8973ee93c6051aaabbd4b502036b1bbd1c53014012091e46ccb00023b3b37985429412005a06800022c20640b0310581802c0bc0764008b18641ba1c3868f6b76ac2103a217cbb339f8c33597c12990c10297583002e338e158f1ff309d10a169b5f64b425020b368a905aa500017cdb1ffd2f5b2480160182c8013148d8e8387160a07e66d2075337d4a0621865f85566b622053164e913af1c2b32f10c27b142e9dacdac330417aa7c989901802127e8e9dec8900280200000fd9a1c044b06401048c2aa82f75331c611299979f50a2aac22c356f071084b8416c66303b303158135101ddbe7a84cb8a016005569418300a1d0bab8516890029024017008000868d903e66257296333603dd4450d3bb0f4e58c28002246c640800a882981001e7874d0230062c67bc404e1044010000167343807a7ed47941c63cb8ce40d3a28ae378f6ad878710a076e74a0e14102abea2651c181a78ac7358202037661d9592f460059616543f78001c44e732d28a0920056058a1c044b06401048c28828dc9d51c61153e0fd4b0a2ab4102bf71071087b148a872303b4d42825e7101dd0038b5c88a015c0ea244083009bdeac403968900290240001029b2060dc939458cc0e174892869ec8f80a8c2808bb0ec0810091155d640077d072c01803273c1901704210040000ae902d090002e3102c050006f31001296200464a788000005dc014226aa2085d8c080494049f05063bfc26ea23010b0634aa014000928093e200604c1fd6c963101280600005f081590c04c46054230290dd10058684d711bf5644ee40730cf0df859910580800e4151451b016620fa8016a201c763392ef280700d9cff1c0fc0950b4791b4f5329167da7c43f85006c1b6cc195ee2e78f9d9a799f650067dde0b020072944299e51f329829d796bfc66a2cea88f48145237c67cb840d8bef0783371a675b5aa45ea62e3891a0f5f557a8cc24cb73647d458051889d08d47300b8bf7d34f58e170450b26dd39f642baee3f6cdd9110c7ec2e3dba4b3a0314b25072165c6e9ee8038904a85fa25891062fd1880c4d22b739c01d601161094207c02165636ee6724431a9ae6585146b86c90473648484810360100000c1302c445b25eb4b2d31fbc37e5d6375fb609010b6450ac9b58135c929889a0defba2e0b31c14c744deb1f69865e0cf8f079e3afe997cf5c4fc971910a13406ff55e00be2efe504c989b2e8032473b4bf74f1ad180265e6da10ff6ca5c89cd13eb8c0b4de4276b52b154e922ab36334285a7ecd3df51ac9b8a32e2c816b9fd8e328612aa36f7c5779db8dc2c43460fe00008e840a03700c010047048e4a29d080c07e8a920821ffb4d21c03556c97c12040f0042877fe61f8200a3a9fa91020d80428413d6f2c4b02040f99e0a077ab508223041f008000051900012e200042c409c260004d078e05c50b1e24315893db00a08534f2eb8306d05d712810356c120402400029362f08002765599c19c30840214184c6f22186080ae75822205a7835a300c2781ab8d392021080420804b554281420b001141c60816dde7762056d8676b00c2a1790e010a001c330bf84000f15dca64e084201000015e20320200026520462200f05000205902605c0300401004a13a240e20616a30406de86b5102d5a2190e460042010a134d65ba063047d42948a1020c2241fd0208eb1e63089012d729a742801ffe7a4a98008402000025e6431a70c7808a08835e56ac3076729f790300074561740001014bc75128210804000041081184803c140006764078440481a01b090001e6101311e1c3ebc439858208dc2b8392001615ff42280006134ef04810440108020080228b106c2b0f1a1827507d8e7000240b1bc920001118bb12001100424500b9195185162df955b61000310831ac3000008b9709000880200001b2400073080010490230d81106c084360180b822395e88c1c1457baf8cc0071d52cc140029e53904008c566ed0025141e00851520b4b9506180fc92e612182c40dfe2400cf66042048183e010b2fa4a216050c34ca1bb1c5367512684c207401165e7f02ff838e0b18c870c3029df9d878037dae6a8a0018f5d7412840f00400003dc8000d8992779f73d62c40181cd408104319e701430c68c5788007b0d0af1c0032)) <<< 16000) + 0xc1fe8026101e00800009290003df201e1200050c20400b917582df41c4caae87040288df0f8c00680210557f68e0600c3aebaa3004c921c71800e004000025cc196d3de638063189685010b04f693041b00400004a181c1d4a142040cf58077c0000d59a7418c2078020000146407c3403c1a01d0900e04806c140340200033020017b440074ace911b2063fa14e094f0455ae67fb9e67c6f5897c1bae4a588a2a000000000000000000460a1a901f505113756aabcd681aa78f36a39e4ef06f4cf5ac500000000000000000001117a8d2786ad49e07ae55a10e0280000000000246f85a01437dda5912bff978f97dda831738e247fabfb7a080000000000000000000000000000000000000000000000017d040c6005001010002e5e9c106814856056d15a4bfe84786d10a8e6deef7577982eeb23e02c98fea693ff799d0bed2c715b73781526649d99eb218006a9ae79cc65160b33b6c476ab7a6a8273d13869f238bb78e7a6ba19570fc551515bd12d715b9c8ab6278ec031c5f8b52c09e5b6a4fbb62bc6ac91bf02fe2b9e0ff8f23c5696d7679826786344a311a5cf7d80d1442e2a82a80c8080024348015f810053433bf1ca38e256110ea37aa3f731a49c0e88e38e28e18610e08c0880860020020991c01006c1094a9d03828808169717e0f0e120b1648406142054f3d3472382869993a268300153ced7ec8005ee08d6448001a38c1380a20818b5a3dc101e81e5484230629d96f7c101214c643c84804e3c4d470600a5bb5f740800ef02102004e2044010b7390bc870600aad100000000165e3a4d0823a63eb44f3fe7d3f8af88ec09acfee6c2dd35eb98540dbc95990000000000000000000000000000000000000000000000000001948a28a1091071090c5003000b86008036cb49338ba557202861455f61ed66e2c50b07c6a8d5302859de1f54889e420500000393870028433298493171c0c00b0a1b56f45f09c40e1060078e51dd066e6349340000000058f7e90744c18b18918704304c00200000c02008037492ac7e63b58d20bac40be323477e6d9693b8a1c0000232800c300001194c0708e8fc467381023b4f19b97c40606c28b47b08072df9983a309002601869a42a671abb1a583960ffb886103dd0990c4904000007532868e1ed5fe79c183d5095af49e38000002bf3451c00980500003044000e10800252900069620012c64060240015fa40032b480b8cc008050300981728450402918568101196a5b174500166529e2100a35130df0025102200800b00e84c3a6139810305434a6a28105434a6a011881000420d75879794c60c1aeb0f2f298c26727a6a1eee356ce4f4d43ddc6b037e51dd066e6349378958443bf1ca380762860d9e6299e6262861014cccf1415a6702d060840420430020024324fcc78262c257fdf79a9367b05ab73472b31cbfd9e9040ad7e231344bda0c77b006e94a5cb401ce138dfb08f02770f82df3510d430a8001f990004ba202a230141100986e8654e3f1fa08216513743830c852bca944048aff302f18297328b420a0056d840f01003051bb5e4e0842010b1d3cd7318a3870b252d3c0410359e1f412003304eec8700738f44a42002b5a10fd98008402163839a7dbc4410e22145a4387b20bc0300c00b9dc84784001449258650021008000081100024c20241300e0980600ec70e4e390d1c3bd11f1a72c2096362bf0c29f51d108240027453c11c009d1d4282c0840008b1c1324f2c2406256466e51c3d82f6e5916103d42c580309754a01e24a084201000010420220b82019319a707084c272b463059b8be5fd08180dc768d14005494111830000d6d61424c184201000013420120a0003c220202b00f05c0400401001c1300d0900602f074c29548421036010c2dd47f844824cde318902184b4284c206c01000012e402c05026bb79d0627ef5627525e7648273803e3acb2469785fe953fa3d462699dc58e301e7b2eecd7953d1eedc08a20b8c5a653d5801aafa602ea8d02e0aca1654c18bf13ea1a373216b7cf1dabf121bbc075cef16bf4a10d234f5abd03ebabf99fcb9845c1711ee141bd37a03b39ad000b9405e6f2285db37e0947bab250feb4a58a0a7dba8817782d1b775d7fb3f5ded279c4821f4bbdb1abfd94a56c60b0951e1d1a8eb193a1114c4c80002a31c0858a7a243064c6655c0820b7c0be200561a3e0860127ad8cc165101d008619ff27ee7460efe3f906e40e2233fea230cad3e570c30478ad5d84501212853883805d5bafcc1384100043469aa339068975efe4c710c82caf9a123438f924041b0084905835c4650e7e2ec6240a34085f8689a4609665013ad36484a08380100000eb200038a40283400069c4001178804848002c008005be10013a220033e868ba5e3983381430dd9d513f8a0a67d60061c40401250703c20031d50962b0c000000177004007549d8d80027102500861a1b05d849818401be85617c608aeaf14ba70810036f095347000be82462b14000f86df618400004941c0f0270c2600841051831d12a1c7eecd2268e0e282d519281480c000005dc0386aa54c5a0118300494049f020800002ee18400060643d901404128042491261824a9082226a84dde224600d3a06274910031406c062042a6795e2a440000f6ea87126042600848c02783e9a881949e214c8922023bbd90920472fbc5aca401298697d5c7000494049f02002d9ca4932704230080000b610002d6200093c40018f48040a801c2400c120050500200800c040010aa40086400202000010018671)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineteenTwentiethsCase4" = "QuadParityNineteenTwentiethsCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineteenTwentiethsCase4 private def zz2100:"s0834"="s0834":=by decide+kernel end section namespace Green24Proof.QuadParityNineteenTwentiethsCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l17 l27 l29 l33 l34 l35 l37 l38 l4 l41 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x4150ba231, -0x2cb416090, -0x3eca47712,0x1770], ![-0x2cb416090, -0x17885e5b18,0x537ed2cac,0x1796e3bcc], ![-0x3eca47712,0x537ed2cac, -0x123b7940b9,0x2cfd57c9f], ![0x1770,0x1796e3bcc,0x2cfd57c9f, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x249f696,l4),(0x249f697,l10),(0x36ef1e3,l17),(0x55bc5dd35,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x249f697,l38),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x249f696,l34),(-0x55bc5dd35,l41),(0x165a0bc00,l51),(-0x36ef1e3,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0x55bc5dd35,l15),(-0x55bc5dd35,l41),(0x36ef1e3,l17),(-0x36ef1e3,l62),(0x249f697,l10),(-0x249f697,l38),(-0x249f696,l4),(0x249f696,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x5106508402e08028000000443c0530080004a1304805a0060000000078024803000000001500e401000005108c04e3010000000000a0710040000000d06038c02000150901603c80180000000098072008000000003c0290040000019024030c030000d0082004c602800000681100e300c000000034581980200034108300b900300218480a00f4802000000000240e2008000000120c0318040062148230259004000000001500a40100000006c180e3008000000003207100400630c822025900400000f0c8280a801000000006830330040000001e0e051804000000001601480206304605601e4802800000000380520080000000241819802007c0f02101e1004001e0420d0138802000000054140a300800000000220710040000000022014802004c0b02180f4802000084380e01e400c00e63582404da0080000001d0d034c020000000070a0660080000004c2406300a841480840066a00c00520a81200f5004002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x14547c01fd5e14482d1bfa1f92485beab7d3143a80782ea0123836f81cd29230046c3c970e000000539f138212004249b807dc00586100000034be492039bff74c9183800000d2e7287407679b52048e1cdfee774830414deaf62504090ab70910628083221a3640492084e0300001f234e8df200000004b4b10d73cdaead03c241058c48c40c4844001800001808010068000831e3ef55058e850a3778d7f7902ce80ebbd038a183b281f900894bf74c230005bc25b48a014be1e84404e18440100001683035f0f9eade874669222119d9310295ac8e23da8cfd402a3228c2322edc3516cef512097f424565db3121001cf96dbec00d968a0429ddbc16344e10800ad4d186fc40dc040012a5a1564cc2d02c4d3674881c0300000a8c80602e9d1be40000000969621ae79b5d5a0) <<< 16000) + 0x784618914910710610304104700130200200d818eaa3bf902458da15f22091239c2f57a1c40cc1e1574610dd420c71200396c83894502734f82420801fe5d289852810220080000cc902f110001699a05084be44bce3c15312d0000ea6b04af0f330167f8baede88052c55edc72829c1c60656ee734e22b7739a70848830c3863842041022264e6675389f16b12812b17fc6a8f596ff4903eeefe8ca564462d921237fb05fdec4017fe177c5400ebf1c4d6a39784f500033434d90f4aed5ace200b3d0cb5204f879e9e1642288b7b7030e1e000000000000000000004611820c21810c1180140100402b9d6ce64828135eba5227d88b8efde0c257364b1e6ee1c882dea28102c357891885a8eafeb85e51b0e416047d0002e9205c3202d0501600a06a06fc17bd7a384f4d95911f486093c74d5db738a1147d1a0e7b220028fa2eeae24380763288ce0d850053a56866ed0256c89902e00897da4b8d285c67182b02456d98a6eeb5d2172f75ef88cc0a0904e30b28c20b20c087089003030000200de3015502295c1842c9de2b26a2c82c04c26fd670e000004652481801b778f159815a6d60ea2b3812c7297e21a58143163385c8600901e28a46492004e0300001f03451b99190d12c929f29372850e0061b0e9420804943380960c57ae7bce1810030d586a500629bc93245000fb2be1a00001b05ec5bc801180200ac040003b870a0070a56f861207b8439ac9256e1cabc9143b50269e1a286dde55468448c27ddddfbc600062ea3a704e104601000016e3c38084f713d11091c6c9a429b46850601ea9ccfd752035ebe84332b38c184f9a947212030d41c46104b00384092a9937b642013dbf42d72ec040e04b2e1605824912005a068e300e42766c5661091cf3a2df72c82468a4543c903001be81af24c0a468bbf73cc3840042ec4870381247ef90ad11603f5d1f48584600791441897bd6400a40700004066c918dcc68eb2922c706e51936d8d2206003855b0fdd214502529b8c092c2420012c83b5846142045456b952a5082053835ea05822c199b1e42cceb808010c2208cb2be8342400c00e00540200025e3850c81abfbe1c7012c2468050d0343b553891832ce60a61808896e2a18200013ffef6e300343005ce02708230080000b7100084d344027ef5e97102ba9c0825e90277cd64dce8e20030d874a0a18030d586a0400218a02d9020209825c8b0047102400c0000bd1e208e26ada0941846b4b9e14c822896b02a8e512c70c02936a2670061d65fa415fc0182abc88ca113e2850c48e9ae684401adf3f8ba8f00025166f284ecd8120056058c220737e40fc7051281d4b4ac696186ca09cf8708018299708c034b20a12c4b1b2b6fd46051c5e12e6bb02036ba367120d0140122453b7ed1000241c60feca829412005a06800022c20520b0280581382e8700b975dacf80d182404c4afba41c6249aa1d16cc451520d89c009601c419643d3a4274609fb58b69033b102925458abfe4c1047ddb0451d5c04021077092ef4bcc12005c068a1c03dd1f39a83461631e800d9871959e13feaa81456048340032081079c83347a51c447a405b2054609e50c78c41e1027ee00aaf1281060de9440d70a22400a80a000041e6054c9fd0012c18511489ed2af20400a4da899c10427f8fc96c41c34d5b7390fe1837db44b8cfb141d4a95967890c166dd425a4f10082e351049ed890028020013008000840d0e2d1b09c2942b483b4ff048b284ee4370a20002d856238600b12fa58e0216ad478628068fd8d2004e1044010000167204a0200082220019b640075e4f1000000f6180284655d04d31318100c048c2160a0dda157f6f74602bb9e120508280018091842c403f09add6364b51870a4070000334409076046230220dc0a19a7d3b3976200575a3051006c2339c92f9c10d1ee10025e2a59183f71a1f4aa21c0400331278bacb828c4762802e5899c6194708dfe7ac2008428c70510e8b3f045902044a6fc714b0f634007a293684341c60862fd6ab0479088c52cfe4c9375afa8c65823956a18913c2e10403620004507bd0abd78209a98228868067369278e002093d0c04a183c010c28f21849ca281c3a0c0c13fdc61a0c0d932b65cc04a4c270594107002145018fca3c08186de7d9706181d6956f0c05cd7c804860078cd02112821000400003fcd975a67518e249244a99661640762f28b090863b7e30e40231f8d15d20007db29928202222898242708210080000b01000380304015e76503061071af4082651b23e3401168c798e00d57cafc0943074021433b564c90c0b54f00c22041c00860a1a7e3f54580e7a9149a281356878e84608400100000a732480e02128b10dd291702051b5d0a208233b5cc80c015ea360c25081d008000079100024120006a078e1163f36e243163fdbe10a0834054ffc306e432c68a1034185ebeb300047bc0e60a0011bc8890270821008410004417ac28311da18ba8c102502216040b44d49c48184f88326092504210084100e95d1a05082214d36e50605017bfc3040ceffaf42057a3b900a1853f66db5a28009a6f2b45c10800100002ac40009d480f0680300400083240841700c0100401004e8905a5d0d68c102c3e706840bd95bf89b18010804284db271f320c12092205884082227b45e0823c2b8c222404e72d18a8a0081872c46600210080000979e3814df369850405ad1cee183efc377da1800368181000005fd2faa09410840200002064078240180a00033a20322201f0d0001db180200802208054cfd5f1020)) <<< 16000) + 0x00b5bc9c4121efe062440004d687ee10000e6565e020006c01e4ec0042008820002f064620401569ea804122a5a81fa28300ac6f6f43001276710a94008802000020e400094080f04c0742603813823b4fe3c01c753f4999081038ce6b81c3000281e07044f14a1d1c03cb4d58809830780210400370f590227eb80d08243c1c408a1d0d1313050207001124e34d85c4410274fa781020aefad002081b315eb0a19e1a627c28026be7a984c103c01000012120004004030040006a6406c17027c33d73183a3f6c3c180ac395d63001b00860c1d198ac1072c580a85007a217e0401406b0624001c008000060180200802000008880d048064240300a0170500b00800085c80044090018b533355b7f532b22f7aaf6afdf0122692e5cfd903b86834062800000000000000000021af7c466055ae90b97bab6cc5377000000000048430c2061863002800808094a3d1314870f8576c231ff199bbde7eb3d4b0e1b7a293f21bb5e4c50e3b5f5cc388b2932b2129f01b02894fb125d93b4054040007304007fc48020cf999333d9a6f4165f8ebecdf65a5886c078471c71470c3087046044043001001132300200daeed2dcd6e898147f00000000162af6e39823edfc0a6bf7e3a3ab486a5d653b9ccc7131147b1e6cf0c9c438000000000000000000000000000000000000000000000000018c882080870850870430000001b8a00803679b5d5a969621ae6f4165f99333d981eb04ee3bc315af54e6619e054892451041090c80c60c3001000c06008037b7f029afdf8e8ead21a97594ee7331c4c451ec79b3c32710e00000000000000000000000000000000000000000000000000639e6d756a5a5886b000000000a746f90788a28914a1091071090c2002e100200d9e6d756a5a5886b000000000a746f90784b14a14814604204b00300000c020080370809d1462c492000000fa03063e6a40428b19ca66efb32c55579718ccc10f9a93f8a244000000004305e0a5d24b2c0e920385d29002200861829891f490c280d44b5c2983811fc267d2c717eab546e60c16fd04cb4b1a20cd59850c000000a73e9c008c0200002d44000d10800234900071a20280a0008b620016fe404c56024028180527e46220236ce28090a00408bd9562013b56e6460048204401001101d0b3e2d0d7840f6bd380c140ed7a7018011880f80430404987435327f6da67737a638ecfdbbd62882542451cfacf9e77f7c01cc6e7fef9c4081601a4c9cc98f6c87573ae4d7ab5f9d446ea966276c4fa447dc85406c2aa1dfb2bdc060024848bf49bebf3ba4432984434c8caa7fc8ee405a6af493a16be8acead1adb4da70203e936a6086f5f2abc3e7b0448847e554249dafa86f1fbb0574275bf3b8ea96416a480000b61e3449ba501f5550945cd33fdde2c7c7c5957dbb851752ff35bdef246c2a278b3fdc7f40cfa427573eb67be13650e7d77eb9f1312544f734b06d5ff47c208869da0001a108003a410101180788a86e3a5865062208aaebd6130030c790a4819410130b89ddf49182ac99f6f37e284542666af7c50053ba8a2258200bcf8ea3ce3220109c08163faafaf3d121b22fce7610182fb35d70e1e04852959200259e90c0e02dc62e9c88009c2ab74ce0040010b1c27855fd420895ac2b041c3e560cfb2060077b927fc20010f6656d280108040000408800139100e0980584e861971b65c8e10e895ed6460ae81430265021d9af135081816e0fe8100015a05a0c600263702563384108042c70555ff900a2800d2caa080c6752e966387af9ca1cb2c20e7efc2a0612d22700749810840216395c43b91480d3693e23638766d2f52f0c2589f1cec0a0834ff0df4800176fe85430004c2ab5a2704210080000af10002aa200e0200043a201a2300c05c040040100161300a0958280d275440230ae528103e6f4b78481d6c916e2000b78aba04a18380108184f0327f9a00f8a189e0c00e36625f8006bc1fba11202100043850d59a6103809efd7964502b46c678cc007c011443abe15e181182b08a100b67b8058c00700200001304000550e1491be434208985c9c458027976e3240330745b0e0006fb2c025081d008000078100034c36590928f531634934c7200e30857f3130a2aac5d1c80a098ce5af9120443debca8c01572288904e104001000901d0e131512e47100cd8b7c1a064cdd8151803d5320cb2000f804002005c2bf78fc3c410d9b67e0202da13091280b6b8f8788008a3afea5001d0084100c619f8e146d0d3a1c2612764024100cc8e27010008382a00360080000e320003d870c87945aa8c0d71aeb5308200f155ac9007948ec00a040f00200003308001e81000559200e0a0009df200148c4004d60800dfa9a2d7a0cbeeec28601d1fb8898c08000005dc028258d30b742880801250127c20001861f99b040042b2c5e64013881300430d691c0d5fc0c20025840b223045a0ef6d038a100125031bc280006f73a918800000001f401800015b5fdb81386130042083c3bd00db1c789b6ff34b1c5051bf2cb32030000017701c355891431918300494049f041000005dc3100016bfac5d0001e221739d0c84120022492d02034881046f7c94c8109180532acdae4880499e5c5920454591f63e82089265fe06040001e2612144e084a01091803f7a9acd2040ca06aaf317892440866238c6b110235c700ed060c8022894c470bbc380023c4641a300400964083ec791f41c10b40b00003764000d4080029f90006de200c2a0050900202800c04004020008e8200202000010019109)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 15 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadParityNineteenTwentiethsCase5" = "QuadParityNineteenTwentiethsCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 15 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadParityNineteenTwentiethsCase5 private def zz2101:"s0835"="s0835":=by decide+kernel end section namespace Green24Proof.ParityNineteenTwentiethsRows open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) def rowsChunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x107d3779ae5800598fdba05d303dceb948001f6f79a532fd7c28002a9eeb6079305faf8a02dcaaa0193779ae580078fcec6133d84c0024303dceb948029a6f9de0303dceb9480569cebce5601eeb5ca800df59e8ef21603dceb94801be9d3e98a07d21389b48002b3d0a202d203dceb948013ef8bba01d21de6d9a00189ac8e5201eeb5ca800eaedf9ce2039205faf8a02dcaaa0592779ae580078fcec61202b196c012c6bed207c2779ae5802cafc282424ca5d004e3eb820203dceb94801da6e58b9a14] def rowsChunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x1411ec2a002038103dceb948016e8c2ca0281779ae5800ed3c9c88a018103dceb948016e8c2ca011ec2a00203d403dceb948024cfdaae06d401eeb5ca80068da4b2541ec2a00203c45faf848001bfedfe06c401eeb5ca80019ff0fe441ec2a00203d003dceb948035f4b2fa06d001eeb5ca8007efca9205d01389b4800dd2b25003dceb948001a1a9fa03c0779ae58005ced2ba06c003dceb948007be98ce401ec2a002573d84c002173d84c00214] def rowsChunk2:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x102d503dceb948039948fd1ce01d503dceb948036f7c7c65501f4928001baac8203951389b48002daad8e029501eeb5ca801c9f81e0a201951389b48002daad8e1503dceb94800381c5888203c1779ae58015fa88de02c103dceb94803aa9b0bfda01c13bcdb2c0048c91da0a] def rows:List (ℚ × Potential) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 def mu:Phase → ℚ:=![(0x1768138df / 0x1dcd6500),(-0x16d90675f / 0x1dcd6500)] def parameter:ℚ:=(19 / 20) def normalization:ℚ:=(1 / 0xf424) def quad0:Expression:=quadSlack rows parameter 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadParityNineteenTwentiethsCase0.base QuadParityNineteenTwentiethsCase0.hinges QuadParityNineteenTwentiethsCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineteenTwentiethsCase0.base QuadParityNineteenTwentiethsCase0.hinges QuadParityNineteenTwentiethsCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineteenTwentiethsCase0.nonnegative x hx def quad1:Expression:=quadSlack rows parameter 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadParityNineteenTwentiethsCase1.base QuadParityNineteenTwentiethsCase1.hinges QuadParityNineteenTwentiethsCase1.normalizationDenominator private def zz303:"s012f"="s012f":=by decide+kernel theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineteenTwentiethsCase1.base QuadParityNineteenTwentiethsCase1.hinges QuadParityNineteenTwentiethsCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineteenTwentiethsCase1.nonnegative x hx def quad2:Expression:=quadSlack rows parameter 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadParityNineteenTwentiethsCase2.base QuadParityNineteenTwentiethsCase2.hinges QuadParityNineteenTwentiethsCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineteenTwentiethsCase2.base QuadParityNineteenTwentiethsCase2.hinges QuadParityNineteenTwentiethsCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineteenTwentiethsCase2.nonnegative x hx def quad3:Expression:=quadSlack rows parameter 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadParityNineteenTwentiethsCase3.base QuadParityNineteenTwentiethsCase3.hinges QuadParityNineteenTwentiethsCase3.normalizationDenominator private def zz304:"s0130"="s0130":=by decide+kernel theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineteenTwentiethsCase3.base QuadParityNineteenTwentiethsCase3.hinges QuadParityNineteenTwentiethsCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineteenTwentiethsCase3.nonnegative x hx def quad4:Expression:=quadSlack rows parameter 1 1 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadParityNineteenTwentiethsCase4.base QuadParityNineteenTwentiethsCase4.hinges QuadParityNineteenTwentiethsCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineteenTwentiethsCase4.base QuadParityNineteenTwentiethsCase4.hinges QuadParityNineteenTwentiethsCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineteenTwentiethsCase4.nonnegative x hx def quad5:Expression:=quadSlack rows parameter 1 1 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadParityNineteenTwentiethsCase5.base QuadParityNineteenTwentiethsCase5.hinges QuadParityNineteenTwentiethsCase5.normalizationDenominator private def zz305:"s0131"="s0131":=by decide+kernel theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadParityNineteenTwentiethsCase5.base QuadParityNineteenTwentiethsCase5.hinges QuadParityNineteenTwentiethsCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadParityNineteenTwentiethsCase5.nonnegative x hx def pair6:Expression:=pairSlack rows parameter mu normalization 0 0 false def pair6Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair6Target:NormalForm:=CompactPair.toNormal LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_6_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_6_hinges theorem pair6_identity:identityCheck pair6 pair6Rewrites pair6Target = true:=by decide +kernel theorem pair6_target_eval (x:Point):normalEval pair6Target x = LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_6 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_6_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_6_hinges x private def zz306:"s0132"="s0132":=by decide+kernel theorem pair6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair6 x:=by rw [identityCheck_sound _ _ _ x pair6_identity,pair6_target_eval] exact LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_6_nonneg (hx 0) (hx 1) def pair7:Expression:=pairSlack rows parameter mu normalization 0 0 true def pair7Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair7Target:NormalForm:=CompactPair.toNormal LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_7_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_7_hinges theorem pair7_identity:identityCheck pair7 pair7Rewrites pair7Target = true:=by decide +kernel theorem pair7_target_eval (x:Point):normalEval pair7Target x = LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_7 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_7_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_7_hinges x theorem pair7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair7 x:=by rw [identityCheck_sound _ _ _ x pair7_identity,pair7_target_eval] exact LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_7_nonneg (hx 0) (hx 1) def pair8:Expression:=pairSlack rows parameter mu normalization 0 1 false def pair8Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2] def pair8Target:NormalForm:=CompactPair.toNormal LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_8_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_8_hinges private def zz307:"s0133"="s0133":=by decide+kernel theorem pair8_identity:identityCheck pair8 pair8Rewrites pair8Target = true:=by decide +kernel theorem pair8_target_eval (x:Point):normalEval pair8Target x = LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_8 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_8_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_8_hinges x theorem pair8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair8 x:=by rw [identityCheck_sound _ _ _ x pair8_identity,pair8_target_eval] exact LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_8_nonneg (hx 0) (hx 1) def pair9:Expression:=pairSlack rows parameter mu normalization 0 1 true def pair9Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r27,RewriteAtoms.r28] def pair9Target:NormalForm:=CompactPair.toNormal LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_9_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_9_hinges theorem pair9_identity:identityCheck pair9 pair9Rewrites pair9Target = true:=by decide +kernel private def zz308:"s0134"="s0134":=by decide+kernel theorem pair9_target_eval (x:Point):normalEval pair9Target x = LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_9 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_9_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_9_hinges x theorem pair9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair9 x:=by rw [identityCheck_sound _ _ _ x pair9_identity,pair9_target_eval] exact LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_9_nonneg (hx 0) (hx 1) def pair10:Expression:=pairSlack rows parameter mu normalization 1 1 false def pair10Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair10Target:NormalForm:=CompactPair.toNormal LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_10_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_10_hinges theorem pair10_identity:identityCheck pair10 pair10Rewrites pair10Target = true:=by decide +kernel theorem pair10_target_eval (x:Point):normalEval pair10Target x = LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_10 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_10_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_10_hinges x private def zz309:"s0135"="s0135":=by decide+kernel theorem pair10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair10 x:=by rw [identityCheck_sound _ _ _ x pair10_identity,pair10_target_eval] exact LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_10_nonneg (hx 0) (hx 1) def pair11:Expression:=pairSlack rows parameter mu normalization 1 1 true def pair11Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27] def pair11Target:NormalForm:=CompactPair.toNormal LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_11_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_11_hinges theorem pair11_identity:identityCheck pair11 pair11Rewrites pair11Target = true:=by decide +kernel theorem pair11_target_eval (x:Point):normalEval pair11Target x = LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_11 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_11_base LocalParityNineteenTwentiethsPairs.compact_parityNineteenTwentieths_pair_11_hinges x theorem pair11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair11 x:=by rw [identityCheck_sound _ _ _ x pair11_identity,pair11_target_eval] exact LocalParityNineteenTwentiethsPairs.parityNineteenTwentieths_pair_11_nonneg (hx 0) (hx 1) private def zz310:"s0136"="s0136":=by decide+kernel theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows parameter p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad4_nonneg x hx · exact quad5_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack rows parameter mu normalization p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair6_nonneg x hx · exact pair7_nonneg x hx · exact pair8_nonneg x hx · exact pair9_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair10_nonneg x hx · exact pair11_nonneg x hx end Green24Proof.ParityNineteenTwentiethsRows private def zz2102:"s0836"="s0836":=by decide+kernel end section namespace Green24Proof.ParityNineteenTwentieths open QuadraticCertificates ExpressionCertificates ParityCorrectionRows open ParityPhaseRows (Phase Potential) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ParityPhaseAggregation (rowsAdmissible) theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack ParityNineteenTwentiethsRows.rows ParityNineteenTwentiethsRows.parameter p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityNineteenTwentiethsRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse ParityNineteenTwentiethsRows.rows ParityNineteenTwentiethsRows.parameter p q same x] exact ParityNineteenTwentiethsRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack ParityNineteenTwentiethsRows.rows ParityNineteenTwentiethsRows.parameter ParityNineteenTwentiethsRows.mu ParityNineteenTwentiethsRows.normalization p q same) x:=by rcases le_total p.val q.val with h | h · exact ParityNineteenTwentiethsRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap ParityNineteenTwentiethsRows.rows ParityNineteenTwentiethsRows.parameter ParityNineteenTwentiethsRows.mu ParityNineteenTwentiethsRows.normalization p q same x] exact ParityNineteenTwentiethsRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) private def zz311:"s0137"="s0137":=by decide+kernel theorem rows_admissible:rowsAdmissible ParityNineteenTwentiethsRows.rows = true:=by decide +kernel noncomputable def massCorrection (U V:ℝ):ℝ := ((19 / 20:ℝ) * U - V) * ((-0x7c2a4edf / 0x77359400:ℝ) * U + (0x7f253f5f / 0x77359400:ℝ) * V) - (1 / 0x3d090:ℝ) * (U + V) ^ 2 theorem correction {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : (1 / 0x190:ℝ) * deficit u + massCorrection (mass u) (mass v) ≤ deficit (interleave u v):=by have hc:=ParityCorrectionAggregation.correction_of_local_rows h3 h5 ParityNineteenTwentiethsRows.rows ParityNineteenTwentiethsRows.parameter ParityNineteenTwentiethsRows.mu ParityNineteenTwentiethsRows.normalization rows_admissible quad_nonneg pair_nonneg u v hu hv have hmu0:ParityNineteenTwentiethsRows.mu 0 = (0x1768138df / 0x1dcd6500:ℚ):=by decide +kernel have hmu1:ParityNineteenTwentiethsRows.mu 1 = (-0x16d90675f / 0x1dcd6500:ℚ):=by decide +kernel rw [hmu0,hmu1] at hc norm_num [ParityNineteenTwentiethsRows.parameter,ParityNineteenTwentiethsRows.normalization] at hc unfold massCorrection nlinarith only [hc] theorem massCorrection_lower_bound {U V:ℝ} (hV:0 ≤ V) (hlow:(0x67 / 0x64:ℝ) * V ≤ U) (hhigh:U ≤ (21 / 20:ℝ) * V) : (0x308783df / 0xe8d4a510000:ℝ) * V ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [mul_nonneg hV (sub_nonneg.mpr hhigh)] theorem interval_nonneg {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(0x67 / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (21 / 20:ℝ) * mass v):0 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_lower_bound hV hlow hhigh nlinarith [sq_nonneg (mass v)] private def zz312:"s0138"="s0138":=by decide+kernel theorem massCorrection_coercivity {U V:ℝ} (hV:0 ≤ V) (hlow:(0x67 / 0x64:ℝ) * V ≤ U) (hhigh:U ≤ (21 / 20:ℝ) * V) : (1 / 0x12c:ℝ) * (U - V) ^ 2 ≤ massCorrection U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massCorrection nlinarith [sq_nonneg V,mul_nonneg hV (sub_nonneg.mpr hhigh)] theorem coercivity {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(0x67 / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (21 / 20:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by have hc:=correction h3 h5 u v hu hv have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hm:=massCorrection_coercivity hV hlow hhigh linarith end Green24Proof.ParityNineteenTwentieths private def zz2103:"s0837"="s0837":=by decide+kernel end section namespace Green24Proof.PackedPhaseRowsEquality open FullPhaseRows def positionEq:Position → Position → Bool | .firstMiddle, .firstMiddle => true | .firstLast, .firstLast => true | .middleLast, .middleLast => true | .companion, .companion => true | _,_ => false theorem positionEq_iff (a b:Position):positionEq a b = true ↔ a = b:=by cases a <;> cases b <;> simp [positionEq] def shapeEq:Shape → Shape → Bool | .bilinear, .bilinear => true | .potential a, .potential b => a == b | _,_ => false theorem shapeEq_iff (a b:Shape):shapeEq a b = true ↔ a = b:=by cases a <;> cases b <;> simp [shapeEq] def potentialEq (a b:Potential):Bool := positionEq a.position b.position && (a.left == b.left && (a.right == b.right && (a.same == b.same && (shapeEq a.shape b.shape && a.sign == b.sign)))) private def zz313:"s0139"="s0139":=by decide+kernel theorem potentialEq_iff (a b:Potential):potentialEq a b = true ↔ a = b:=by cases a; cases b simp [potentialEq,positionEq_iff,shapeEq_iff] def labelEq:Label → Label → Bool | .potential a, .potential b => potentialEq a b | .balance a s, .balance b t => a == b && s == t | .child a, .child b => a == b | .grandchild a, .grandchild b => a == b | .heightChild a, .heightChild b => a == b | .ordered a, .ordered b => a == b | .massSquare a v, .massSquare b w => a == b && (List.finRange 4).all (fun i => v i == w i) | .normalization, .normalization => true | _,_ => false theorem labelEq_iff (a b:Label):labelEq a b = true ↔ a = b:=by cases a <;> cases b <;> simp [labelEq,potentialEq_iff,funext_iff] intro _ constructor · intro h x have hx:(⟨x.val,x.val_lt⟩:Fin 4) = x:=by apply Fin.ext rfl simpa only [hx] using h ⟨x.val,x.val_lt⟩ · intro h x exact h _ def rowsEq:List (ℚ × Label) → List (ℚ × Label) → Bool | [],[] => true | (q,a) :: xs,(r,b) :: ys => q == r && (labelEq a b && rowsEq xs ys) | _,_ => false theorem rowsEq_iff (xs ys:List (ℚ × Label)):rowsEq xs ys = true ↔ xs = ys:=by induction xs generalizing ys with | nil => cases ys <;> simp [rowsEq] | cons x xs ih => rcases x with ⟨q,a⟩ cases ys with | nil => simp [rowsEq] | cons y ys => rcases y with ⟨r,b⟩ simp [rowsEq,labelEq_iff,ih,and_assoc] end Green24Proof.PackedPhaseRowsEquality private def zz2104:"s0838"="s0838":=by decide+kernel end section namespace Green24Proof.CombinedPolicyPackedRowsEquality open PackedPhaseRowsEquality def parityEq (a b:ParityPhaseRows.Potential):Bool := positionEq a.position b.position && (a.left == b.left && (a.right == b.right && (a.same == b.same && (shapeEq a.shape b.shape && a.sign == b.sign)))) theorem parityEq_iff (a b:ParityPhaseRows.Potential):parityEq a b = true ↔ a = b:=by cases a; cases b simp [parityEq,positionEq_iff,shapeEq_iff] def scopeEq:ExtendedFullPhaseRows.Scope → ExtendedFullPhaseRows.Scope → Bool | .whole, .whole => true | .parity a, .parity b => a == b | .phase a, .phase b => a == b | _,_ => false private def zz314:"s013a"="s013a":=by decide+kernel theorem scopeEq_iff (a b:ExtendedFullPhaseRows.Scope):scopeEq a b = true ↔ a = b:=by cases a <;> cases b <;> simp [scopeEq] def vectorEq (a b:FullPhaseRows.Phase → ℚ):Bool := (List.finRange 4).all (fun i => a i == b i) theorem vectorEq_iff (a b:FullPhaseRows.Phase → ℚ):vectorEq a b = true ↔ a = b:=by simp [vectorEq,funext_iff] constructor · intro h x have hx:(⟨x.val,x.val_lt⟩:Fin 4) = x:=by apply Fin.ext rfl simpa only [hx] using h ⟨x.val,x.val_lt⟩ · intro h x exact h _ def correctionEq (a b:ExtendedFullPhaseRows.Correction):Bool := a.retained == b.retained && (a.even == b.even && (a.mixed == b.mixed && a.odd == b.odd)) theorem correctionEq_iff (a b:ExtendedFullPhaseRows.Correction):correctionEq a b = true ↔ a = b:=by cases a; cases b simp [correctionEq] def extendedEq:ExtendedFullPhaseRows.Label → ExtendedFullPhaseRows.Label → Bool | .base a, .base b => labelEq a b | .colourChild a, .colourChild b => scopeEq a b | .massProduct a b, .massProduct c d => vectorEq a c && vectorEq b d | .massCorrection a b c, .massCorrection d e f => a == d && (b == e && correctionEq c f) | .massCoercivity a, .massCoercivity b => a == b | _,_ => false theorem extendedEq_iff (a b:ExtendedFullPhaseRows.Label):extendedEq a b = true ↔ a = b:=by cases a <;> cases b <;> simp [extendedEq,labelEq_iff,scopeEq_iff,vectorEq_iff,correctionEq_iff] def rowsEqWith {α:Type} (eq:α → α → Bool):List (ℚ × α) → List (ℚ × α) → Bool | [],[] => true | (q,a) :: xs,(r,b) :: ys => q == r && (eq a b && rowsEqWith eq xs ys) | _,_ => false private def zz315:"s013b"="s013b":=by decide+kernel theorem rowsEqWith_iff {α:Type} (eq:α → α → Bool) (h:∀ a b,eq a b = true ↔ a = b) (xs ys:List (ℚ × α)) : rowsEqWith eq xs ys = true ↔ xs = ys:=by induction xs generalizing ys with | nil => cases ys <;> simp [rowsEqWith] | cons x xs ih => rcases x with ⟨q,a⟩ cases ys with | nil => simp [rowsEqWith] | cons y ys => rcases y with ⟨r,b⟩ simp [rowsEqWith,h,ih,and_assoc] end Green24Proof.CombinedPolicyPackedRowsEquality private def zz2105:"s0839"="s0839":=by decide+kernel end section namespace Green24Proof.LocalFull27Pairs def compact_full27_pair_20_base:CompactPair.Quadratic:=⟨(-1 / 0x59682f00),(0xfa1 / 0x17d78400),0⟩ def compact_full27_pair_20_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def full27_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_20_base compact_full27_pair_20_hinges x y def compact_full27_pair_20_cuts:List ℚ:=[(1 / 3),3] theorem compact_full27_pair_20_check : CompactPair.expressionCheckPSD compact_full27_pair_20_base compact_full27_pair_20_hinges 0 compact_full27_pair_20_cuts = true := by decide +kernel theorem compact_full27_pair_20_representation (x y:ℝ) : full27_pair_20 x y = CompactPair.expressionEval compact_full27_pair_20_base compact_full27_pair_20_hinges x y:=by rfl theorem full27_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_20 x y:=by rw [compact_full27_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_20_check hy (by simpa using hx) def compact_full27_pair_21_base:CompactPair.Quadratic:=⟨0,(0x1f3f / 0x77359400),0⟩ def compact_full27_pair_21_hinges:List CompactPair.Hinge:=[] noncomputable def full27_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_21_base compact_full27_pair_21_hinges x y def compact_full27_pair_21_cuts:List ℚ:=[] private def zz316:"s013c"="s013c":=by decide+kernel theorem compact_full27_pair_21_check : CompactPair.expressionCheckPSD compact_full27_pair_21_base compact_full27_pair_21_hinges 0 compact_full27_pair_21_cuts = true := by decide +kernel theorem compact_full27_pair_21_representation (x y:ℝ) : full27_pair_21 x y = CompactPair.expressionEval compact_full27_pair_21_base compact_full27_pair_21_hinges x y:=by rfl theorem full27_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_21 x y:=by rw [compact_full27_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_21_check hy (by simpa using hx) def compact_full27_pair_22_base:CompactPair.Quadratic:=⟨0,(0xdac3 / 0xee6b2800),0⟩ def compact_full27_pair_22_hinges:List CompactPair.Hinge:=[] noncomputable def full27_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_22_base compact_full27_pair_22_hinges x y def compact_full27_pair_22_cuts:List ℚ:=[] theorem compact_full27_pair_22_check : CompactPair.expressionCheckPSD compact_full27_pair_22_base compact_full27_pair_22_hinges 0 compact_full27_pair_22_cuts = true := by decide +kernel private def zz317:"s013d"="s013d":=by decide+kernel theorem compact_full27_pair_22_representation (x y:ℝ) : full27_pair_22 x y = CompactPair.expressionEval compact_full27_pair_22_base compact_full27_pair_22_hinges x y:=by rfl theorem full27_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_22 x y:=by rw [compact_full27_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_22_check hy (by simpa using hx) def compact_full27_pair_23_base:CompactPair.Quadratic:=⟨(13 / 0x2cb417800),(0x7d01 / 0xee6b2800),0⟩ def compact_full27_pair_23_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0xee6b2800),1, -1⟩,⟨(-1 / 0x2cb417800),3, -1⟩] noncomputable def full27_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_23_base compact_full27_pair_23_hinges x y def compact_full27_pair_23_cuts:List ℚ:=[(1 / 3),1,3] theorem compact_full27_pair_23_check : CompactPair.expressionCheckPSD compact_full27_pair_23_base compact_full27_pair_23_hinges 0 compact_full27_pair_23_cuts = true := by decide +kernel theorem compact_full27_pair_23_representation (x y:ℝ) : full27_pair_23 x y = CompactPair.expressionEval compact_full27_pair_23_base compact_full27_pair_23_hinges x y:=by rfl private def zz318:"s013e"="s013e":=by decide+kernel theorem full27_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_23 x y:=by rw [compact_full27_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_23_check hy (by simpa using hx) def compact_full27_pair_24_base:CompactPair.Quadratic:=⟨0,(0x4e23 / 0x77359400),0⟩ def compact_full27_pair_24_hinges:List CompactPair.Hinge:=[] noncomputable def full27_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_24_base compact_full27_pair_24_hinges x y def compact_full27_pair_24_cuts:List ℚ:=[] theorem compact_full27_pair_24_check : CompactPair.expressionCheckPSD compact_full27_pair_24_base compact_full27_pair_24_hinges 0 compact_full27_pair_24_cuts = true := by decide +kernel theorem compact_full27_pair_24_representation (x y:ℝ) : full27_pair_24 x y = CompactPair.expressionEval compact_full27_pair_24_base compact_full27_pair_24_hinges x y:=by rfl theorem full27_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_24 x y:=by rw [compact_full27_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_24_check hy (by simpa using hx) def compact_full27_pair_25_base:CompactPair.Quadratic:=⟨(-1 / 0x77359400),(0x1f41 / 0x77359400),0⟩ def compact_full27_pair_25_hinges:List CompactPair.Hinge:=[⟨(-1 / 0xee6b2800),1, -3⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def full27_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_25_base compact_full27_pair_25_hinges x y def compact_full27_pair_25_cuts:List ℚ:=[(1 / 3),3] private def zz319:"s013f"="s013f":=by decide+kernel theorem compact_full27_pair_25_check : CompactPair.expressionCheckPSD compact_full27_pair_25_base compact_full27_pair_25_hinges 0 compact_full27_pair_25_cuts = true := by decide +kernel theorem compact_full27_pair_25_representation (x y:ℝ) : full27_pair_25 x y = CompactPair.expressionEval compact_full27_pair_25_base compact_full27_pair_25_hinges x y:=by rfl theorem full27_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_25 x y:=by rw [compact_full27_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_25_check hy (by simpa using hx) def compact_full27_pair_26_base:CompactPair.Quadratic:=⟨0,(0xdac3 / 0xee6b2800),0⟩ def compact_full27_pair_26_hinges:List CompactPair.Hinge:=[] noncomputable def full27_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_26_base compact_full27_pair_26_hinges x y def compact_full27_pair_26_cuts:List ℚ:=[] theorem compact_full27_pair_26_check : CompactPair.expressionCheckPSD compact_full27_pair_26_base compact_full27_pair_26_hinges 0 compact_full27_pair_26_cuts = true := by decide +kernel private def zz320:"s0140"="s0140":=by decide+kernel theorem compact_full27_pair_26_representation (x y:ℝ) : full27_pair_26 x y = CompactPair.expressionEval compact_full27_pair_26_base compact_full27_pair_26_hinges x y:=by rfl theorem full27_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_26 x y:=by rw [compact_full27_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_26_check hy (by simpa using hx) def compact_full27_pair_27_base:CompactPair.Quadratic:=⟨(13 / 0x2cb417800),(0x7cff / 0xee6b2800),0⟩ def compact_full27_pair_27_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0xee6b2800),1, -1⟩,⟨(-1 / 0x2cb417800),3, -1⟩] noncomputable def full27_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_27_base compact_full27_pair_27_hinges x y def compact_full27_pair_27_cuts:List ℚ:=[(1 / 3),1,3] theorem compact_full27_pair_27_check : CompactPair.expressionCheckPSD compact_full27_pair_27_base compact_full27_pair_27_hinges 0 compact_full27_pair_27_cuts = true := by decide +kernel theorem compact_full27_pair_27_representation (x y:ℝ) : full27_pair_27 x y = CompactPair.expressionEval compact_full27_pair_27_base compact_full27_pair_27_hinges x y:=by rfl private def zz321:"s0141"="s0141":=by decide+kernel theorem full27_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_27 x y:=by rw [compact_full27_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_27_check hy (by simpa using hx) def compact_full27_pair_28_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x1d34b615f / 0x2540be400),(-49 / 50)⟩ def compact_full27_pair_28_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full27_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_28_base compact_full27_pair_28_hinges x y def compact_full27_pair_28_cuts:List ℚ:=[(1 / 3),3] theorem compact_full27_pair_28_check : CompactPair.expressionCheckPSD compact_full27_pair_28_base compact_full27_pair_28_hinges 0 compact_full27_pair_28_cuts = true := by decide +kernel theorem compact_full27_pair_28_representation (x y:ℝ) : full27_pair_28 x y = CompactPair.expressionEval compact_full27_pair_28_base compact_full27_pair_28_hinges x y:=by rfl theorem full27_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_28 x y:=by rw [compact_full27_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_28_check hy (by simpa using hx) def compact_full27_pair_29_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x1d34c4bbf / 0x2540be400),(-49 / 50)⟩ def compact_full27_pair_29_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full27_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_29_base compact_full27_pair_29_hinges x y def compact_full27_pair_29_cuts:List ℚ:=[(1 / 3),3] private def zz322:"s0142"="s0142":=by decide+kernel theorem compact_full27_pair_29_check : CompactPair.expressionCheckPSD compact_full27_pair_29_base compact_full27_pair_29_hinges 0 compact_full27_pair_29_cuts = true := by decide +kernel theorem compact_full27_pair_29_representation (x y:ℝ) : full27_pair_29 x y = CompactPair.expressionEval compact_full27_pair_29_base compact_full27_pair_29_hinges x y:=by rfl theorem full27_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_29 x y:=by rw [compact_full27_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_29_check hy (by simpa using hx) def compact_full27_pair_30_base:CompactPair.Quadratic:=⟨0,(0x222e7 / 0x2540be400),0⟩ def compact_full27_pair_30_hinges:List CompactPair.Hinge:=[] noncomputable def full27_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_30_base compact_full27_pair_30_hinges x y def compact_full27_pair_30_cuts:List ℚ:=[] theorem compact_full27_pair_30_check : CompactPair.expressionCheckPSD compact_full27_pair_30_base compact_full27_pair_30_hinges 0 compact_full27_pair_30_cuts = true := by decide +kernel private def zz323:"s0143"="s0143":=by decide+kernel theorem compact_full27_pair_30_representation (x y:ℝ) : full27_pair_30 x y = CompactPair.expressionEval compact_full27_pair_30_base compact_full27_pair_30_hinges x y:=by rfl theorem full27_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_30 x y:=by rw [compact_full27_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_30_check hy (by simpa using hx) def compact_full27_pair_31_base:CompactPair.Quadratic:=⟨(-1 / 0x59682f00),(0x13891 / 0x2540be400),0⟩ def compact_full27_pair_31_hinges:List CompactPair.Hinge:=[⟨(1 / 0x165a0bc00),1, -3⟩,⟨(-1 / 0xee6b2800),1, -1⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def full27_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_31_base compact_full27_pair_31_hinges x y def compact_full27_pair_31_cuts:List ℚ:=[(1 / 3),1,3] theorem compact_full27_pair_31_check : CompactPair.expressionCheckPSD compact_full27_pair_31_base compact_full27_pair_31_hinges 0 compact_full27_pair_31_cuts = true := by decide +kernel theorem compact_full27_pair_31_representation (x y:ℝ) : full27_pair_31 x y = CompactPair.expressionEval compact_full27_pair_31_base compact_full27_pair_31_hinges x y:=by rfl private def zz324:"s0144"="s0144":=by decide+kernel theorem full27_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_31 x y:=by rw [compact_full27_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_31_check hy (by simpa using hx) def compact_full27_pair_32_base:CompactPair.Quadratic:=⟨(-0x3aa08530f / 0x77359400),(0x7edcb54eb / 0x2540be400),(-49 / 50)⟩ def compact_full27_pair_32_hinges:List CompactPair.Hinge:=[⟨(-0xa386abd / 0xbebc200),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(0x6699eb29 / 0x77359400),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full27_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_32_base compact_full27_pair_32_hinges x y def compact_full27_pair_32_cuts:List ℚ:=[(1 / 3),3] theorem compact_full27_pair_32_check : CompactPair.expressionCheckPSD compact_full27_pair_32_base compact_full27_pair_32_hinges 0 compact_full27_pair_32_cuts = true := by decide +kernel theorem compact_full27_pair_32_representation (x y:ℝ) : full27_pair_32 x y = CompactPair.expressionEval compact_full27_pair_32_base compact_full27_pair_32_hinges x y:=by rfl theorem full27_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_32 x y:=by rw [compact_full27_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_32_check hy (by simpa using hx) def compact_full27_pair_33_base:CompactPair.Quadratic:=⟨(-0x9b97a1de5 / 0x165a0bc00),(0x439ea510f / 0x2540be400),(-49 / 50)⟩ def compact_full27_pair_33_hinges:List CompactPair.Hinge:=[⟨(-0x10b73c811 / 0x165a0bc00),1, -3⟩,⟨(0x30429d / 0x77359400),1, -1⟩,⟨(49 / 0x1f4),1,3⟩,⟨(0x3576d4fb / 0x47868c00),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full27_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_33_base compact_full27_pair_33_hinges x y def compact_full27_pair_33_cuts:List ℚ:=[(1 / 3),1,3] private def zz325:"s0145"="s0145":=by decide+kernel theorem compact_full27_pair_33_check : CompactPair.expressionCheckPSD compact_full27_pair_33_base compact_full27_pair_33_hinges 0 compact_full27_pair_33_cuts = true := by decide +kernel theorem compact_full27_pair_33_representation (x y:ℝ) : full27_pair_33 x y = CompactPair.expressionEval compact_full27_pair_33_base compact_full27_pair_33_hinges x y:=by rfl theorem full27_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_33 x y:=by rw [compact_full27_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_33_check hy (by simpa using hx) def compact_full27_pair_34_base:CompactPair.Quadratic:=⟨(-1 / 0x59682f00),(0x4e1d / 0x77359400),0⟩ def compact_full27_pair_34_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def full27_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_34_base compact_full27_pair_34_hinges x y def compact_full27_pair_34_cuts:List ℚ:=[(1 / 3),3] theorem compact_full27_pair_34_check : CompactPair.expressionCheckPSD compact_full27_pair_34_base compact_full27_pair_34_hinges 0 compact_full27_pair_34_cuts = true := by decide +kernel private def zz326:"s0146"="s0146":=by decide+kernel theorem compact_full27_pair_34_representation (x y:ℝ) : full27_pair_34 x y = CompactPair.expressionEval compact_full27_pair_34_base compact_full27_pair_34_hinges x y:=by rfl theorem full27_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_34 x y:=by rw [compact_full27_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_34_check hy (by simpa using hx) def compact_full27_pair_35_base:CompactPair.Quadratic:=⟨(-1 / 0x59682f00),(0x7cf / 0x1dcd6500),0⟩ def compact_full27_pair_35_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def full27_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_35_base compact_full27_pair_35_hinges x y def compact_full27_pair_35_cuts:List ℚ:=[(1 / 3),3] theorem compact_full27_pair_35_check : CompactPair.expressionCheckPSD compact_full27_pair_35_base compact_full27_pair_35_hinges 0 compact_full27_pair_35_cuts = true := by decide +kernel theorem compact_full27_pair_35_representation (x y:ℝ) : full27_pair_35 x y = CompactPair.expressionEval compact_full27_pair_35_base compact_full27_pair_35_hinges x y:=by rfl private def zz327:"s0147"="s0147":=by decide+kernel theorem full27_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_35 x y:=by rw [compact_full27_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_35_check hy (by simpa using hx) def compact_full27_pair_36_base:CompactPair.Quadratic:=⟨0,(0x222dd / 0x2540be400),0⟩ def compact_full27_pair_36_hinges:List CompactPair.Hinge:=[] noncomputable def full27_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_36_base compact_full27_pair_36_hinges x y def compact_full27_pair_36_cuts:List ℚ:=[] theorem compact_full27_pair_36_check : CompactPair.expressionCheckPSD compact_full27_pair_36_base compact_full27_pair_36_hinges 0 compact_full27_pair_36_cuts = true := by decide +kernel theorem compact_full27_pair_36_representation (x y:ℝ) : full27_pair_36 x y = CompactPair.expressionEval compact_full27_pair_36_base compact_full27_pair_36_hinges x y:=by rfl theorem full27_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_36 x y:=by rw [compact_full27_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_36_check hy (by simpa using hx) def compact_full27_pair_37_base:CompactPair.Quadratic:=⟨(1 / 0x1c9c3800),(0x1387d / 0x2540be400),0⟩ def compact_full27_pair_37_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0x77359400),1, -1⟩,⟨(-1 / 0x165a0bc00),3, -1⟩] noncomputable def full27_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_37_base compact_full27_pair_37_hinges x y def compact_full27_pair_37_cuts:List ℚ:=[(1 / 3),1,3] private def zz328:"s0148"="s0148":=by decide+kernel theorem compact_full27_pair_37_check : CompactPair.expressionCheckPSD compact_full27_pair_37_base compact_full27_pair_37_hinges 0 compact_full27_pair_37_cuts = true := by decide +kernel theorem compact_full27_pair_37_representation (x y:ℝ) : full27_pair_37 x y = CompactPair.expressionEval compact_full27_pair_37_base compact_full27_pair_37_hinges x y:=by rfl theorem full27_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_37 x y:=by rw [compact_full27_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_37_check hy (by simpa using hx) def compact_full27_pair_38_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x1d34b615f / 0x2540be400),(-49 / 50)⟩ def compact_full27_pair_38_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full27_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_38_base compact_full27_pair_38_hinges x y def compact_full27_pair_38_cuts:List ℚ:=[(1 / 3),3] theorem compact_full27_pair_38_check : CompactPair.expressionCheckPSD compact_full27_pair_38_base compact_full27_pair_38_hinges 0 compact_full27_pair_38_cuts = true := by decide +kernel private def zz329:"s0149"="s0149":=by decide+kernel theorem compact_full27_pair_38_representation (x y:ℝ) : full27_pair_38 x y = CompactPair.expressionEval compact_full27_pair_38_base compact_full27_pair_38_hinges x y:=by rfl theorem full27_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_38 x y:=by rw [compact_full27_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_38_check hy (by simpa using hx) def compact_full27_pair_39_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x1d34c4bbf / 0x2540be400),(-49 / 50)⟩ def compact_full27_pair_39_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full27_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full27_pair_39_base compact_full27_pair_39_hinges x y def compact_full27_pair_39_cuts:List ℚ:=[(1 / 3),3] theorem compact_full27_pair_39_check : CompactPair.expressionCheckPSD compact_full27_pair_39_base compact_full27_pair_39_hinges 0 compact_full27_pair_39_cuts = true := by decide +kernel theorem compact_full27_pair_39_representation (x y:ℝ) : full27_pair_39 x y = CompactPair.expressionEval compact_full27_pair_39_base compact_full27_pair_39_hinges x y:=by rfl private def zz330:"s014a"="s014a":=by decide+kernel theorem full27_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full27_pair_39 x y:=by rw [compact_full27_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_full27_pair_39_check hy (by simpa using hx) end Green24Proof.LocalFull27Pairs private def zz2106:"s083a"="s083a":=by decide+kernel end section namespace Green24Proof.QuadFull27Case0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x144ba752c, -0xde2c256c, -0x14d424545,0x888579c], ![-0xde2c256c, -0x3dffaf5cd,0x10e63ed,0x143aa3218], ![-0x14d424545,0x10e63ed, -0x5a34b0cf9,0xde2c544f], ![0x888579c,0x143aa3218,0xde2c544f, -0x6f161e6e]] noncomputable def hinges:Hinges:=[(-0x51d29,l6),(0x7eb3f7,l4),(-0x251ed3,l10),(0xdd6ad0c9,l14),(-0xe46eb7,l17),(0x1495b75a8,l15),(-0x6f161e6e,l27),(0x6f161e6e,l29),(-0xdd6ad0c9,l25),(0x6e14c49e,l30),(0x6f161e6e,l33),(0x251ed3,l38),(-0x6f161e6e,l35),(0x6f161e6e,l37),(-0x7eb3f7,l34),(-0x6e14c49e,l43),(-0x1495b75a8,l41),(0x8795e2,l46),(0x6f161e6e,l51),(0x51d29,l60),(0xe46eb7,l62),(-0x8795e2,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6f161e6e,l27),(0x6f161e6e,l29),(0x6f161e6e,l33),(-0x6f161e6e,l35),(0x6f161e6e,l37),(0x6f161e6e,l51),(0xdd6ad0c9,l14),(-0xdd6ad0c9,l25),(0x6e14c49e,l30),(-0x6e14c49e,l43),(0x1495b75a8,l15),(-0x1495b75a8,l41),(-0xe46eb7,l17),(0xe46eb7,l62),(0x8795e2,l46),(-0x8795e2,l64),(-0x251ed3,l10),(0x251ed3,l38),(0x7eb3f7,l4),(-0x7eb3f7,l34),(-0x51d29,l6),(0x51d29,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0xb8052008000000088004c80400000001600132010000000001601c80203182302b00f240140000022084068c0300000004c180e300800044118280a900300000000483033004000000291301cc020000000a45c073008000002488c050c03000000068340e3008000000000903880200000002418063008000290d02408900300000000068052008007c0f02101e1004000f02106809c40100000000009018802000000220a00c300c0000001d05028c02000000a83101a300c000000001903880200000006c180e3008000018c120248c04000000000a80520080000001505028c020000000541c0a30080000000011038802002e07818c07a4010000000190601cc0200000009c480730080000002215038c020000e45409022400c000000002201480200000003c28063008000000000d018802001583b0880564010000000e05002cc0300000003424073008000000012140cc0100000002814053008000000000140c8010000000000703200400430a011014d0040000002a0c013300c0000000a0502cc0200000000024092008000000098004c8040000000009807200800001f150d029002000000461500a300c0000001309018c0200134230480324011420a404200335006001482a04803d40100056090160275004001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x6804100263014000001a044038c03000000007850330040000001916014c020000000000b032004006116013014d004000000682d013300c000000191602cc0200000000054092008000002e0c4028c030000000006406200800001b110903900200000002e00132010000000002e01c8020000000b4180730080000001b1201cc0200210610780564010000000211e038c020000000088f0330040000002d0d028c020000000b43c0a30080000002a15038c0200000a854180e400800000000210388020018c440d007a40100000001906018c020000000a4340a300800002d2a070290020000000078d0330040000003a25038c02000000000e80520080005c298a80690030000000ac580e30080000000029038802000000000090320040005c298a80a900300000b8a45405400800000002a2c0cc010000000001409200800003202800e4c0400000c20880393010000000360e03cc020000006613024300c0000014824090c030000000a85c0730080000000a8004c804000000280b01c300c000000c84c070c030000000004c052008000000001501c802000005d04c04c3010000000150701cc02000000000340d200a4920608e033d5006000000380900c300c000000000f01480200000000044072008000000261301cc02000000000780520080000000000c0c801000000000340720080000000c8004c804000000000c80720080000000036014802,0xc8380f30080000110130370c0400009d06300293014006114412022100400000980cc019301000000188a4058c030000000983c0730080000016024030c03000000000240d20080000000011018802000000000140d200800000000260148020000000003409200800000000050188020000000443c0530080000138110058c04000094260900b400c00000000780248030001047431024400c0f208a0b40631005000006a04401430100000019024030c03], #[![7, 0, -15, 8],![39, -25, 0, 4]]⟩ def dynamicCode : Nat := ((((((((((0x3ca0773c0c2abd62f280ebabc026102c00809505f18070712f0808050867c083d897f0718000031f621000029d8592820f00420681309519800347000034bc00038e084de919240d1409818355000e28e725646f0c145ebe61376e2238007edad8bef05007b03610a1a80001e9bc9a369a2009002b0405163ad7ee94e10080aed51c5005080b0686c5c1005151f8911a4504fa74ea96c42000000b71b03e83001401600005840064080320880a0828be1bc5b860400000fa01010032b499c900029fee390400010ebd6c00006c5bc709c00880200002c44001490e9600208347c182000f7816f8a100087eb6d500400003a980702008f3bcc83400b4ebd4ef0e00146117138002b3bce9d0414808250140000d810007ff3858086d39e509fa83985587ad39e08f29541401fd9feb2820c00434be962fa604050810b000f147cc005c011a6c81084a7c34c0000229fe714008731f68d1005d8f01486180108a3f23424a2aba73a20401995c3302089685850e060000008ca0d200460180001c920004da41cc240e40a0003893857c22b42c20690a4304cf71366002e008b18019735620186e109e4cc8060c0c3318ee80c3000f5c4834b08019662720182dc31fbc8e03080e2900aa3082d8222609744040984c2520904801301200007a8e15eb52ae5840e3324304ce7a931800c0043490160121c980c361feed4a728b0c00005a2b0218602c436d4002c2000015d9818c160ed8c4ae6c30807521fd29810579b16ff6f40c10373bad832fd09002902c00010390002af2128120470500a02800165cc93586e4183121a0d604bea40600002cbf8618c950dbf8502010f706a1200a336314038000000b0286003ed79ec0000055efbb452004401009301049008244041200208f010070080008f4c442bce0055a6c3fde2c312276ee0748c08822215e700d283783de2c2568ee957186021018692540862fd9720ed7a626052560782314a32483d2f6b84ff11b321d2401d42c62021821c0080102fe7e73467083e21f9ea842751d6462be205b45dafabbb667f9e023c7b073a25a1b399206bd3c894c2d913034b06a8065859c02e72a4c091f832ccd473d0e0a0008bc78c508efbb4a1446888ca8e292d41be01c33387fb4a481f11af72c600531ab2b06042d9491900009c807c0200002ba40381601a03a16ad8da8e2b6a5b420002e1902000b1b4490105c02160da980000000a3a0c9cc98b45581d02c1b53000000019b3f5ab1113356075b16f1c40000000b84ff11a5fa15081d32461861c50413403002c080200d0001e5209c0308e01e0e31a9a248f62e9fc8061474dc7062cb5226000647f52800c004208d763ad2a48e00005dc030c04445671e0856452ed2c100b4523e700043a458ac003e0080001223a580165912287002d8d0038fa1c025908180223578041048638dd1010059383e30023de82acb820f802000053cd836a6000000028e83273262d156075b16f1c40000000b84ff11a5fa15081d22461860c22810411400000b840080340005d482e868001484d1000002c0a58e0168853c209afc3d6c868400005dc050005b15e0a00002880b98004c284001000013330200f5aa47094046ba480716cd1000ac7da10004830320100000c1324b28873f00c17cfc8c2e501875f7b60600020e7d08805fe81a2d000651c1f008000083102505d9200001605308005a214f0a2a37496cc0c13f94a8d2e70600002ee00001c8c2b1c004c2042010b2400002c0a61000b4429e14546e92d981827f2951a5ce0c00005dc00003a2781fc0098408402000026e602802008000022364800002c0a610005a214f0a291ae14300609006f86959c1800005dc00001bf50d8c004c2044010b2400001605308002d10a785148d70a1803048037c34ace0c00002ee00000e3e51b70026102200800009e980a00802000008880016918101a566341402a2752fb100e83f4f6600246383e0100000b0211a3a00069321183a0012383c505a19da414287cb179b080017aede80008c60800214308277df6942ab87d47c8e29c1389240a120d617e7140c147905c0c0674e6b528a00be9d9398004e304001000016121163308a05d0a960bdebc50b4b47a478808ef1f03908098df97c200012100f8042866bf5fe342857e0399771c51e34233e1422cabce972403ec97276180bc258d6614034d71bbe00009c80800200002ca40009748098e8224040009f0422027c31979407d95a58a821637f08e13ba446af96c812db39280c0508772ca745b6ee2a4ae4d226205295534c67b1f29769855620812a3b77c93c211bcec014350000084e38d75d949af516260208cdf96aaaab084615c02f805c2bacdd397423447ae84848942267603bc6b20a70b21d800037935053d5cef75a505856779d0d8bb041a20c906040ee532637f6b8995020a0d801e00000000000000000000002b88c10c08808608c00a008020229a8f4aa8b4da25b01faddfc46e4df0851ea2c90e46f1eb396181ed2b9e3a8b34000b2c843968218) <<< 16000) + 0x2610a0a0840140da785450c0ec38471caa67f0f4305766102cc63c284314785a131440025ee2d1a334380f85c6e368ae2801920d86106e02a75a789c69452062a228a34c55523961601834b4790b52f2fa850a2b3749a4822778a2c8222bedb99dd158a1c10465c429ea80283074d8e0c388c54b04e7073cd78dc592c0cf8241a58a065860000000ee89ac8003d09010186c0a8d28002ad9c828a0969ca6d0b228b4355e328801535ecb8b1e6d37720f2870b590c4b870001aebeec0270c220080000b4908301d0f445ddeee963000005dcc50d4c8eae73923022215e7020005927d4184004698abaa0001d3bd4a500b38a1100400005b4d9302f100c73248d1623a1af2648bdc07cceb5828806aa96c3b85800f82dfaf1e380047cbff85a200455aeb42a61000cd7d88a0602b91030500400001d3320f4bdae13fc4697e854207400000000000000000000032637f6b8995020a0d801e4362ec1068832418103b955053d5cef75a505856779c5722041c41431c1280180014a719c1bebd25bb19c60af4409696067c796118625fd10c8f8dab058d793b90073d31c6e71e6ad9a957c83a7a492bcff90a3f4d6ab2b902647f2b83733cb61d05396800215102c0581580e41e97b5c27f88d2fd0a840e89238e21018e182092008000a1e64f7832a38cb2c3bbf3620c46697ce6b76f0b942b87340005f08006af90821de0c0000232c840c0a6a60f10508feed58d50506da757b3e0601d451113105001f3f45ff91553cbf430e78546aa6ece05cc68480180001a321026b0803183f8ec1f8660582ba829eae77bad282c2b3bce86c5d820d1064830207729931bfb5c4ca810506c00f000000000000000000000015c481051040c800700500000149d4f603474cbb89275da0529019226686dac9b61886bc0cd54f938d3953265f681470ed81676bbd0162eb2bfbc8552222a1297e3f602cbf0840f9b0305911f860b00c0100403e80f05120bea601a764c4011080c00400001c0c0e380296a230d88f4fb1c40465728a5e50187e06e183803b6c885a200184dfec010007348ec400ce284001000015f20f82b07b1182e8681e8260f20b0780183b80f8e4c7a00d44820313a77610328545f4a80118c100042481d3c7f0b3071b7161ed24337dcf07218305b618e51813fa1d10e3004e96ec142009cdf16ca0019c60800200002c241d8660ea2b0740983982c1c8070001fc18a0c0f12d1748048506c011010010044020040100e21207001000026100008920261b06f05d0800fd50a22810250e0de0c000585d30c400f0b830540810c14f73a400251c2100801280800049483710c1b41765d13ded81c30064fd21e000cc78f10002727b48014141c004400004011c754466258c00048a6dc3002ab632b8c0074020000138600002008e3aa2c9ccc6000245ce5180156001946003a01000009c20001b260100200800002220d81a06b0500011a1a2a632a540204038b6212000e5057700046303a0100000a8202623b280e7be13945021058403410a1b6e44283c1aa3f1d090307c02162e107fa8c38439e4cbf1c0b92bbeac38277ff1968a0f12f95f63801c61632833060f004000048c835088088340d212025050001329068190338a8001a6c8004b31000c1620581302b01cbf42a1000000008a3bf4d7e79cffc81f08c528c920f4bdae13fc46cc874900751fe0c6117f67008e242fb48c1f34accdcf694186089ff3ec1f8000000000000000004432c81821c00c000051b263d21ea84213a75a47b44e64e4725a2d044e3085b688e56c2068ba4c38af16cab3be443fd3d3f369b67b81005eb2aab8cd1e621b3385f886cc5009f456f2665471d6704a09b10a8a82239cff39d4b3fc092d79bd314561849543248b3324bceb19ee3e6915e0f54e740811341af2b1564d7238c87b98c050dee6d8963ed95fc056f573f6a54a3af0f2d4ed0e474ffb18a519241e97b5c27f88d990e9200e9b3c700bdcd390735f4bcd9d4bfdd5c60b24593ba5b820000000000000000789489db22d4e05b321d242e13fc46483d2f608c528c83a82083864803002000000214f7cec71e0d4106467534f0bef79a17fb69c66b931dadc6abfe6b151d65fe972015745de6a62bd74a876c14bb01f7f5954b17f7b2ca2190ab969953f24e6cafaceec3d4d468fbb040e72095e1638cfc22fe8e3d101690a1400352fb7c12001ce6f5e01286100042c70102506638fde37f068d08169bb6694080098efe4240c1f00800006990280d83306c194360c80bd8b78e200000005c27f88d2fd0a840ebad30ce2edb016018e9e4b19c9ff1f24533dd3858b88d51c853c0284e74c4f920000000000000000021db6716619d6817e9a73e6e7de6e7de9a720a29639809e00205be1370c59cee860402806271b11faf331c5143dcb8732d8734a57fe2796ec2813938002a13b65a766b318f0554fd29f2a645089c750290a7839c206ff578ba1622120e83a1e7ed0630100026e90622183082ecbeded03ec58e0792dfa0a180b75f9d90080d9056b4240c1f0085973534df8458e308fe30a48012c56dbe04618400100000ab20c02205f0d02f068174240b81205b0502d0080008b0c8a2730826c5153fce6c21a0426c3c852000615f380300f9d90ad00001025301f0080000881000ad92001f587cf39ff9451dfa6b0000000025fa15081f3678e017b9a720e6be979b3a97fbab8c1648b2774b7040000000000000000f1990e921709fe23241e97b046294641d3287182082140040000542dbdfde9214f49f393c2d19c483f2839a)) <<< 16000) + 0x4dff3d651995fcb474febeb70fe47455d0c17692201f0e1230f05345e5eb8f5ae90549201b70cd65c4d6bf904e6f9754e14f8ab89175afaca6c8299beb8eb3ae8fa45c6e98c4fb1db13ee650bb224ab94738a7a1a77d0005862003894400ae3ce108686eb55bf9c931cfd853b1475d6e4094bfc952f8fef200000000000000000424bf42a15c27f88c907a5ec0000000074840c30460050010101056200f07c79b1a2d093f5a516e24f6daa6e15f1df62d168d0dcc0876407c2ad44249d2ef307b52af592d2d9c3b5da9725a260bed755f86a1e05ef87e6774525bac0d198186b6203ce64ffbaf73f7cde210a91b65dd00047f20068264011814f0b7c81c6fc508a3f38de02042170d7286016a3e2ea04016d5e0cec2023395579c00009890800218345c92fbc185a7ec799c2066d067e1080116d325a000241c1f0084860af358741850ecf62da10202d860ee80118c1000400bc1400018c4110540003a04110860b20390c40bf9e00c1968317641c0fc981f0228144ae660430036c8b7e000292920f804203002008c2c043ab73038e1036cb0a1c33cdee100881808752fe030c29d5b8786043f3d23b00821f982ca9160000003ab80024c3b4a35480108040160060ae03d30004986154010412c274d999720423b23a0d68e2086bc57bc0d1cc0c00494cf4400619e072d771802c100526272360202824bfddbdc0107e14e86880075048015818015807c6800004e201249d80c09b51229cd8ce6db8a287c16b3af181001fb091f8a101c7162c5841457b2bd74160000a927bd8001643561d15240090051c680043de3b004930b5fecb00d922850818a370628a2696dc1e5d9a200043a97f00604004c0c1aa8120012cd713a2010039eb07e7640000a969475321b048015014000083c8001ff10006483c7699cc60914180656933870e000cd28018405c2e35c1c16895449c88080cad64f0104485d78e8400010e81c20002cd8fdaf520042010e3fb70f547c21c31a9b00f87248401db5d2168404027a0255e0208ebae2857e28000d33e1128380687fd1b44010014be37a6680021d881b72ac8900270200000f890140102a808000face9200001083c05120043aa8f4028b95f37d9f5e28400cacaf1c02822ff5ea2e760822c2fc670ee2806dbfed82b808001a21556180006cf4289201209002802402a008138040a602052010001281a1c013d000f58e394d6c640fa203003503f4b41867a0d906468208b7ecc0c3714080000899f40810954ecf962180a30ff2f01000331031a3f5644801381020300875eb606184a74f358308615a379810429c4d8862810043ab730e0a494f58cc2041dc5840e200010e81c2000c3799d475200420100001b620a20b01405f1ca9d3525a1c52ded2b8e0510032b85460c30a19d5560a04008748b11c100d070dc0800010ebd6c0c000943736c0035d774244a400880200a0038216edc713881b3b9975e430c88c72fb050800003e80208966be4e0b0406569338807a83da714900043a0708000e5d24aa29002000841115672dbe2c600cad2a390310d305230910021d0568208296eb4d6283000003ab861968656a10800c1b1901000005b07e10a4008402000036c4000df8827808001604e92000016efe05176323268b20a1c11b6885f80c20279cc82f868202f412a254604034d4182a0208fe81fc4e61404c2765c0ba00097531be73b224009c0800260204e010268081300400048c4002fa8800d5c904b1dd05372f562021fab892c045182f0005b01880002418190085168154e740486005a7ace14200875eb6060c99c6309c1045f4034104000000160514000a24ca4820120cf476000001f1ac8d480108040128060920304801c8c021d7ad861aa9756880e2010eec4c0825acac5c840000005814402c3f9fbc84c103e010820db717ade24600000bb80808008cdf2d1420043a4588208006d3ae42410043af5b060414c918361010045f137c107502401d8a4008802164015d254a1851b82648c9d917f2811b52000c0d0913c65001900800006d1c24043a0ad124f07be2bc287021d808488a613bba04f1400007570a2a0e616f80c01117038200005f5a1d28001f008492cb0c0f61285151c704c1841216c8a5626730c202568e7bae4820119a816e05040046aff0f080801a70c6721400076814d1a000003748f29b224009c0800003e400128618e52c246b16b6b4041640ac3840a3fbf2800322ab9400600200001aa40012088003a8900089320281bc34bd30464dbf94bbc242000e1e5975f8ed9c3045a49201267aa0a08208aba566c5828566696000218deb4b65cf90180005f42374ae80a9808000388760d93d1b6bcf39ff93801f83e204aed134388cd56c4a00135400a00010f590005c02000015a6c90023e54ab38800000c62d246003a200cd186b0f7b5c2a1823211f96ed0823013849f61810467f715f081033346e9f100002c8fe2494801200a204ab6650388da8b90a000b9360a002c25190005c02000015a4000a708238081180401c0200060820021b4411414002394400b3c081610e454367f6e64860a549de860c2529d52120823bf6251c0b7d25b223001bbf9f6c502a48955c000ace403e01089814959dda10d3082116bc1928f8e07a4c5a2ad4741939000000002c1b5301daf564c0081c02f3ef4adb034670f420c2874f263b9a7fcea725ad338000000000000000000000000000000000000000000546643a485c27f88c907a5ec118a5190754710a08408701002cd8d30b489c197df54865469baa4c5d2fc)) <<< 16000) + 0x125d0ae0592c2e4db529754c81720c352bb42628a22927fdcb1bcdb17ef52e5b97cf6d5fc1b1b541b03a5793477a5fd042a55ee710c81f911685edf3b4dbb7e99d90b486d0757d4bbc478146eed0869800000003251f1c0ec98b455a8e83272000000005836a603b8bb9efe4ac3151515a189bcf584cd8fa3d10dfe50400000000000000000000000000000000000000000002a99429619019000e07b1e035100d00a82204c10c27a380002c0a6060d614171a0c9bca6c050211d3d6b98000e13f5800007d052820f004347ac75b728713c0b128117a79a1c03f86b564041800800005990420582080f8801041a3e0a100861adf040803ec8a307034296e85118128c22e269a0023cef320b000003a98051c10840518ec308f8429738101565323a6d5b390af221d6f49ea7b00000000000000003d89814959c83b5e90218bf64061a4950788e20b2090ce04804604104800c0200803400081c82002e810001d5c8069fc9863c08735a20d00002ee090006802102a047fa2586339bc88800640200000d87c39995f15b3c1114206f040000002c0a3c0021cc7da34000002ee0940080021028408ff44b0c0ce6f203060ad28b63001c00800004d10001b23c468f6892c80864be401c93ebc8c105c02007e0a0000a120007924001df081f0080026dc8006671001304207a1203c05000a5390042ec20764b003015100b1321b4508f2245238506641b9d487000ef3698c500126729982508200085100108c540509010387fc7040d7e32dc5066b8bb64d24082000800006a103a0981c84c088260700b01c0181b80e44048f75c47136549e261430ac735a040ee598e891c2cf410f3890024dc54e000986078021236e930fb438a0ac668d0c2df64ec9c4898541d628048203c010c1c013d5db143bdba471c1c6af7ac81e100058f342190107c02006c0303501f94001a368a34a041283671449c9721e6cd20b894915848770af34c42028e1a26c2980001f7196a70021008694eac6fa40a24f2e67ee9a41e3e0841243de182778405ba6bcf365001f00800007c1c24109464664905bac753a307393e16b390146ccd4134706e39c49ba580006a06e3200005739df1382108040000578d920040a2d9643d86b3a458d530ddec96085a4ec58200055140e35041e00401a02800042480028610006203428079199640bb65eb378a263052bec4078eb020c8000163afac004a283c0100000fd2001048707af002a4081003c110418596305ca9009454b5e430394fe89b120055bbba428001ec978000138e0f0040000550c06020396c230680588b02202034c37d8183342a75b492041000430a026e6b1e4060c94f4923066e16251418435d33cfc202073fbf1a1832c3a8f5a28000e8394213841000400005608198680c8240621203009017828000ac48006d1902e198168c80b00605603c21f6f6a8e9414a89ba4d24266267bf2404b4253eac704567dd278e0040da0390260c1f00860a0845e3e85140e2282e14105255f61202dfd2a164848183e0100000d320541b8040b8d5688e0bc4f9f292c00458d71a081d864adb1028203e00801c0100007490291581408c09c4604c1302505e1abb59d10284087fe3f20004ee16a011860e804201002008926ca26a98208028297a2c0008f93c8a000dc031e4001d008400004010000044649b2627e2082009fdf20b00023c61a280036b285900074021000010040000111000102200043e400097081206c08c17459e74e3a1010d889522800413d2124019c795e000a0c0e002000032c8110ac084470080100401004c07c07010010040000111e00237791060696eed1a0110a0e00400001e880f0c8074240380a00015d20282a0005df3431bee78390c282db0c728e20db8b0f69418e9e3f858a09fd0e8870e0274b760a0604e6f8b65000ce30400108217130c36140813869c2840c9774e210004630400100000b020363a01a1900c8680602402e0a000295322995ca297861e23d3ec71210e00a5a88e0722c1aaf8c00819ff950a007e0a36084006c1228180338a10004284a2409b1c08640260048406401100c0100400b0080000dc80006190151900a0a804c460241a0110900802803c040005a04003cb8800fe41defc201a7d968e2bb475f3e8429568542297af443b54b00000000000000000000000000000000000000000000002d88a18c10c08a0880860040022d8d4f537198588684608209b675b84b9519d6a63ffa7e5cabfcabf6e98028ce3f8fdcddb0d29575fdee2b729a61ea24fa8460b8e6c97370932bc94648c1578bfe3f628408886f0f020ac007fd04280aca35754880022215e701801945108c822ce3044010e3efc1ed653681c505dd04b79ca38674942a2deac20810547371f1060803555db3b420004a840195ee300025ffeece1450001aaa5b0ee0239102856040ae413aad9b0651c032aa05176285010fc832e2bcea76f18f760a2a9abf24bbbad48b568b600000000000000000000000000000000000000000000000000065228a249247285245140080040c000080368700da3392491db37392152850369f83bc9036e6588af20000000bb9a50022008000083900e0580682e8a03f658e2e124f96a653a10a1c002d812b250a02db227bc24527cf2fd788a000068a1f9826082500850e01b076df2476cde36f214281b5f82f49036e603efc400000017730a84108020000414800135900c01000332900086820013e2402c840143a0091100406801c2400c0a00501002008003908801888008440020200001003a8a1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 24 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case0" = "QuadFull27Case0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 24 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case0 private def zz2107:"s083b"="s083b":=by decide+kernel end section namespace Green24Proof.QuadFull27Case1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l6 l60) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x14352498a, -0xde2c256c, -0x14d424545,0x898d36a], ![-0xde2c256c, -0x3dce09eeb,0x1f2d68,0x144198f78], ![-0x14d424545,0x1f2d68, -0x5a34b0cf9,0xde2c544f], ![0x898d36a,0x144198f78,0xde2c544f, -0x6f161e6e]] noncomputable def hinges:Hinges:=[(-0x51d29,l6),(0x7eb3f7,l4),(-0x251ed3,l10),(0xdebef67a,l14),(0x142ad5b89,l15),(-0x6f161e6e,l27),(0x6f161e6e,l29),(-0xdebef67a,l25),(0x6f8f7dbc,l30),(0x6f161e6e,l33),(0x251ed3,l38),(-0x6f161e6e,l35),(0x6f161e6e,l37),(-0x7eb3f7,l34),(-0x6f8f7dbc,l43),(-0x142ad5b89,l41),(0x6f161e6e,l51),(0x51d29,l60)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6f161e6e,l27),(0x6f161e6e,l29),(0x6f161e6e,l33),(-0x6f161e6e,l35),(0x6f161e6e,l37),(0x6f161e6e,l51),(0xdebef67a,l14),(-0xdebef67a,l25),(0x6f8f7dbc,l30),(-0x6f8f7dbc,l43),(0x142ad5b89,l15),(-0x142ad5b89,l41),(-0x251ed3,l10),(0x251ed3,l38),(0x7eb3f7,l4),(-0x7eb3f7,l34),(-0x51d29,l6),(0x51d29,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x631103401e9004000001906018c0200000290d028c02000001e19038c02000003a25038c02005c298a8069003000002b16038c0200000002903880200000000240c8010000002a2c0cc01000000009034802000000000c0c801000000005024802000000b8004c80400000002e01c80200000000d034802000000a8004c80400000002a01c80200000002e01480200000002601480200000001601c802c608c0ac03c9005000022084068c03000001306038c02000000120c0cc0100000002a01480200000190701cc02000000022014802000001a0d038c02000000009038802000000906018c0207c0f02101e100403c0841a0271004000000009018802000008828030c03000001d05028c0200002a0c4068c03000000019038802000001b06038c020000000320148020000000110388020b81e06301e9004000000036014802000002215038c02000000f0a018c0200000000d018802000000d0901cc02000000a05014c0200000000140c801000000001c0c801000000a0502cc0200000000902480200000088004c80400000002201c802000011854028c03000001309018c020520a81200f500405609016027500405c0a01c017500400000009802480300000000e01480200000110b018c02000000070024803000000012014802,0x2601c80200000001101880200000000503480200000000d02480200000000501880200000110f014c02000138110058c0400250982402d0030000000780248030001a8110050c04000019024030c0300001a044038c03000001916014c02000000002c0c80100000191602cc0200000001502480200002e0c4028c0300000001901880200000130a038c0200000211e038c02000002a15038c02000000021038802], #[]⟩ def dynamicCode : Nat := ((((((((((0x3864c6ddc52fd92f04a8a242a3fc1688a15d0be7132862fb729973eabcb18089e80d7b37af8ecec13c70217327f906801c64ce9480af06b204b5f68cd5f2527f8496af809ab74ee57e0dec54dbe9bb75d74841161a1a06e220b7248f28e3831a1db974d45be8cd76ff0a7ef0f3ea7ec24266a5e05384636035882dd7bd5fac0f65a366c79073cf861bdf4fe4cd7061c052e129ba479a1635dfa999a223088824ed2600) <<< 16000) + 0x300bc079cfe319c27585900a1b8deda65b071701e4c45df3ad181d7a4ed0eae6b6238d0cae44a2800d01c7a67179bb5c710b64c6599ec097783cd207bb2acf78dd43e959eba5be0cdce1e5220201a2a87ee8bcf20b30311ae1e0810fee7981aaef509cd5db26cb878b9a8997df46562f6c2f5098bb1e16c4dc4f74e000cbc5da8780f356f37927e6f5144fe91141631028ca0c30a0014874dc806180028ba7cf0104a506fcfd10cf040086c865003010ee782d24c04043bc3a4d6801006ceb1c36c94001e311afc27fb806100054098c3000187f98408f4c3a048105cdb35c9c3c1000927c008082491cfd46000038e0260800311e29f000149801c6644001081000006388001c598000080238b0022058ca0e14000f9ff28285000006978051400428c71c38102c21706a8a040011d63ff14101d2c890e4107d0b5638080c00008debd2a4900260180000f390260500011c9000a843848bd12c092603ae484020d75101c100784f82081e4b58700b36c38cc08320108000080234d002b77431a502c59d6cca2af2c4956c6920000177028900000b029638005323c0a0991fd34d8204061b1b1c0822c8d197d5200420100001b620003e6402c240140a0003393c63b9a381e50a1884706c70448935760a08207a8852407a6075943000173fe74302fe7eb7280138a0f804000055c82a80f05b8a518766fb5ba95001f87af1c3c12420504efbec803fed9f545c72e636c213b63012a0685daecc04fa054956a1ac02da0e2011c601fe8d350fdc8f488e5fb99749320ab95c3825270692be3d8a354c6587ba9d061d2c362e32e3d4e78e7a44047c19859200370c8c2005a79a10284183640825cfe6786035590bbce00632f76146041b0140000881b10009903a03880006f28a1043b697fb314004328421c80000002c0a001b42831984000e04554c1042010000154323800581460c14d8902041f73b824025e84b0401fa449c0026201e004c1832010000105382b5e2e1505013ec1178a3002d9f97f02008bdfa9b40120810004000035cd960045b2f6103000002c0a40200283b700a08002991e00834211bb911600007d136004c1844010a03bdbe70b8c0250ff4f6100a571765c046183e0100000a8206a1a00021320a81a000a123428b5ed11d080000802c14220c2000850ab99f57b838a7171b02e28482482d32502d493ee923017bb0814c28054f7e7cc04c184001000012f20a61ba15d5f82ef142b5f2d6f44045eca2dc080e5ba085c028203c008a15661db5e0714ef1863f050916477b949001998fe046028b3e8e9c500d1853de40261020008000098900021c201c1a0520100021f105109f0c52671deec26984c461f1aca93ca3e01c283090ca68c61d91944ccb3a6ade694040a1c4e9e65398179abd79333de552890081237061440876ab24b67d354f3909440003078489125499cfb06e6a8b9fd03dde2f9d38e78d863da54caa660384a4e5fba0c77bb0b5ce6259f1d2faf16755808867da5bb681a4c09cbae0604287a17000020a1c10dec425d168c08e00b888d28809ae917e8670608e4df72c340c012892f3a600a07e1cd809c40802ae9f10f3620210625e06e10afc01b948243f8e58500400001f820a03a04f09827028134050369d1ed8dcee3847043a6c13b0c15e0dd6f47d228430db1d0d69900095af5f6bb2380f95ef0f00e8a0062ba1c8dc0026e9652c880c818b49d10d85552e4854050a88ac482045965fd88b960784c28c24924a1c91861030ca000c060080370a00032a2d0c240134b84a2490a862c328a1e8c0388202869ac2d00189182f773dc9180007aaf7c009c30880200002d26a22b1208116597f622e581e12c92462451442010c12c028001c080080340003b0d4456241022cb2fec45cb03c2408388506286204382500035c09f69796987f8a8894642db68230c093e8bd3a2e28c220d000183203c0b01d01f1178e15cbe9f5946e8470f1f1fd4e7b04e688ac60c102707f9905a9f6a04080ec3e0087ef2e191410430d4144d960aa66d83000ec3d158f5e5bb934200096abae68f36cd094042436b04916752791883c1f5c73c390220460000b1480040e9c1800005dcc2060898d36a0a12ac564956283e646586c8c04bb3df11428019ca91b122a2e68f905107ab61e102cc504401000018c20985304b258250cc07857020e5a955c88740ae1d4503c00f058a2291b51be6b748c2ceae3bf8083e1003157508e957a51028b47d5ab1580e077335b6bf604f52dae0eef247680a01795f90eaa92606c538dd6c441b000125a729d9c96909287d4b65a83642efe555d831d83b08bfb10fed40901eb85b03b91cde5621b7c4635e054d07d364ff8f52a8bca5346c13440800d4344001bc24238002098c08117d34d2000c0042000020080000223c302345e8d00540c6b280cb48b84800d9521364041a00800005d1804008020000088d9046c4013881c2a5a8c5960563471b228032899efc3808fd736d840126fb9ae013060f80400004a482486c1202606e0a0470182300e41002296fc0819429f2cf40884080021240fd860599030181b5cd0c186cf9bcf0c09e4d99c698005cf4b641005b156703804c2040010000131208a230440d81880f075d3dc1c002ba78024182e008c20c180b00809c9453e160022cca2820622c3f0c80038010c2020847980e8082ec4003001000006830040005c442021c5d3c634000017110804fc742864001d00800a80800036ce105ff80d8404de14e18b001142e341030b284a64001c00861000199fe961002544)) <<< 16000) + 0x91082ea8b6f8c60203ed21564001f0080000661b0c00394644025ef14ba400380080150100004290002472000936403817420025d95e880426c75a882023a23d0e84610400100410900b84810c040001d04108570302591159865b2c4b324002df5dd3001b0044000040100000446cbf90c1c8240413a5f90c02c3819b23041c00800004d9800008022cbf9977082404122ee70c02d8dd5f8c007002000013240b4140001d64038078300a10ae6243003719685841524cd5460b36b3da148003e010c1833f09fb121837d0f3c182bd3745ec4800f26e4c43002188ae54a003e0100000f83628f4a9377202187737922836303c488e00926f3000c0014e756b25041f00800007d10410900b828000c7c8200480fc14000c1040031c080074b901e0980e80f0cf2182f6adf336dae5decdd8d1a5b8f2a3cdeb3969a8ea1821915af7c195abc13d5cc656be233be1087d21121bbfd18e0067586f8e046f2ad8584154844cad56012a405b3decce43011c9e4da0dc720842844434b3b9a87d717a9bd1b3cc06400012e961e64ee7571dbf16a39cd7ba5062ee66c8cb568cf68f19106a0a8fa3eada937ddd60238088ff0d3f90a2d49618199eef5c9d8ffbe6b46c8ea566550bc0038f26676514cdadd6cd2f913d23b12018b92c6f6ead45097e22cb5998dc065c39d580e107e9939af72b14d086b58c02c197409fa55d2c4c8a15818fe6cfa8c651052516a775cdfc4bdf4e2c32f8801c8f8d882eb7d09ae179a925a7243ce4b21013933423d79961e21f082756800072578972c3a83b48bc5e4d252f5deb16314636ad3504073e978227d3167a55fb80452e112dd2aa1d8fde92ec5fe437c05e5b231934e8eebf8a12781a4200802008d3409b5dde882361ddb51090c011973eca000033768640020008400004010000044400043880d02c0f81607a0b8080080200f04400006e40ec5700001004619a795c9a871c0f01c5d14000b08d909800f8020000284c0100401000004440e8240720a0380501b8080d8040003086c40e0b28facb985815c1e6191668d3dd93570944685236baa356d47fa8468019e614e8efe60209beb0f5608207f754831505be531563a07792b23fc800cc0b300ca29d6c27c9e8d4e03620bad1c3ff01a23c493bb24bebef5e0c020bce1f9f050a0c52748f629bb1cc3e5afb349d4898adffdbf2e80cca000a9f0a5dc209e1941e3fafdc43cfd5364d09945b34df2b4efd0a9de259135f5964c72a70c579c66a687f1f74079919d3fc622b162156420e33140002c9900093e2001e787042b819a82ffe3c6262a76aa48b8f4390d3af0eb3954355952dbd3dc209549af7550d3708736ab4557a93c83e13649e072d65c64cdabe4850a01fa63b145d94a93a66c9b71322d060a5c449af9739ac41df5232670400b8c38d462e64c9d635cdc8386aa94d9368e337768d4b2ce838044000043262152b32f396e0931a61f4d1e6daa0d849b1a6fac045f4db6828d662b7d3deee268ab45c311d907b17c81fd2453b322a6a42cd72e00002a7900194220057cc67ce73aa3671cf35f20115cb73aad46dd284882d2e8d0b00000000000000000080177487a25dfd248da4e3e241597ced6b05439a000000000000019a54b0322c92e385007df371796c24226f2f6678facb9ccd4000000000000000000000000000000000000000000000000be6206300280080808106f141a92e80a7689286879785e4169a7a1614329ebd1d21b0665fc8f4e397166b1f3142e91363ea14d8108e839d4d4cf8b80c53e66396d1758a49de0a205e7823fe597708fa203de107e795b9692cec3229e5f5c17fed14ebddc9238f09fb64b3e58cc25ae0f8eeff6cfa3f0140b2b420ca7a95aec444cd9e2f9b36b10ed5747db8ae155531669f2a06df484cf90421216b1b7316be321785f6c185d461a8bd14a1cda32d4002340801c8710045653012d72dadd0a1185f73bc040a6c4de898c061b18e92080176a00bf840308f6daf00130a10004306135c3d9e185058f4db22007c5cf1b60461840010c28c418a1508100053110488208002006a1200009020680a00016a20682303301c8a3936718024306ad88e4020a4c7903e07024cf1f15e1801e481c47002514210085969bd3196c70b200e87ca7561638000018c5a2070001796ca030600046262a030cc3c060826820c327c8acb32c02acbb96310000276164bc5b69002701801900c0c40784826bf7139092530b6dbfa061000000841e2480001f73b80e200017620e04109a1b316fc20481a05e9d904102c2d4ef700078b546194a52004a02801801d12000009c4014345d9084b1061c1e7983270208bf7726d30402001d417311410550e84ab840867753fac86000027144840002bf989a3ea4801280a28a3365bd65f069200000c62d0a24000bcb65010280023131501457a5d136a64187817904475850009afdc4e40400e6f1757b3000157b01554db24009c0700003e24000fa48002fb10300dd972c3585860c4ed1418619360ccc10127a338c28000370c810290989401460c1b0145880053b8b21c4000535e78821daf3dad8c0021942bb830000001605000da149f2c0001c08aa66082100871001605246554820e2066d20b027cb412000a8042000020080000223a3801605305b04b7440a3e89b070c7dcee1404ed83525041700800006910001cf200067c40011b4800664101e11c8a19cb818c60c3f7d01f1208a6af0970c10bf30348300319eccb8503abd3ccb00130a0f8042c500581481401770201f97af8a03e5ad024041600840)) <<< 16000) + 0xa41a5f0b0e22fe9100c951e61802aa36e280a90cf594105c0200001a440bc1605c03ed007cf7c2bd5e4000000016ae5dc0759e5bcb651bd9dd94b18dcbabaadd3ffd8f2b90f48000000000000000000000000000000000000000005271757fe9de1121e987a5b4f8e85c466a9d4ce1580000000000000000000000000000000000000000142bad9600006c0b4347103342300280a800080360000200800002232300307e80e1fb0cb5ead14db60601f0c06d4973029d60c561c10e5fc02557b82029b94f367af45b642fd794fbdcfb541c0004e832b3c868bb1879b37dc774980c0007f497fb0d1010e113880765725c0005261253799b31c873cda72ab6d75053f5060397fcb27f05521411d45900006e840b417008007422bf769d3800019470f7da486813e763daac8128b0001de76f22c3051a87054800660f0800008020000088f1000174c14300717c860c20bdb4e0001c0d66803d77d72c00017704c003201081d4de03412f3df1000980400001788000bc1c21265a6612fae85b942da875c6c7dcaa9a3d42b58bac2c483db7c4f0d715572cbea18033642b10a23ad58210be22117dfc344c529abcd6242730c04b357a0679c8c450c1a6bc1d03b83deda57497e551a20533b46b85f16bac861be30e2121cd6de0f6132641b4b1a9addbf057a1d0aef077726c030f2502f41b65313253f988e7973acbcb5ac4071ff1700b244999fcd41e30105974a8d39a98a42b394645aadfae3d5e8e0b0978b6f0f93dfbd17098134c07a0504c88241f593ef0938d7d750ba07324953f921b398508722e041f7478d6f6032b0911a28f79b51b5c5d57e788f13e1081721b300580a00075820014f840048a8800a03902b05000ab2100238320542b003015100000375850920328b205060a392acc40025987b7e40020008510005bfc98a15556fb73141c91a92231800f804000028481480c0a00602e0302701c88043b8640e26d7f8c38207944981c0e16577f8ce58223a3a370c0004134053000f004388445bad541830009105606145c64ee2cb0400067d7120010804000035081300c09407c500a172c88c29e7849540b10051bdb4a48876edb465143a34de88b8814f82f013c8000004fba73801080438a013c48621853cf37b38162009e2430c910eddb75e828746a2916f1029f15d6214c004201000012e38400a17cdb0a21d6a966d0a0c04fdd4d24067b25c7f11029f0afc3e860d1a972afc90000283a6a4e084201000015d30282fdad3a86100273832e28869f92cd828300cca928101a2bf6c36440a6cc454ba4820093afea9c00840210282fd9ea24610028fdb8c28869ea20ad28300d48446101a2c005bec40a6c9b556a48200aaf8eb24000041d94d0004201000018920480a0003152000e9860300097a4e1831aef312b0c2adad0a4110100071bbe0c1a2b574489400800218502f1e64e057901c3756aa8d04c508eae6a0502b2184ee2376aa64b1018b4b0106930060c21c67efd188700641a23f5358100312ff8962f39c410005a0780001f520460a02201010808000d3080068210200980f8480780603a03c20ec02ec294120e2a05820291adb24a500066b6c1050051c904e12820f80434900ecdc07243618ce82314200a0050d08288f7d86e2000007e665940080021a480604fcc121b102d6ab8a10017e59384149db20c24800400100000d120003d240701763800eb0e21c1833ccfea080499775fc26103e0080140900005d101b0d80d04c06427868f7c4b8100008067d420019a614f1800e804200002008000022203003e3c7a14b189000405bc61800cd502e8c0074021000010040000111c347ea3dd900009acc892041c0040000389000164202e0b01601f0c0033cf838400030cb08094c176f91820e80400541785000667fa48403ed2154a04012a248820f545b7c690007c02185139240d14231aa108280043565608091aacb090007002000018070a010540c90862ea6b92082d137b041df965592000d80430a26ff02e2846677c24500087815a10121510b52000e00400003008000cb9000359385eaa01248014ac24044183001000006d2028220004c3201e0a0007893850d9f379e2831fb0c0b314303036b9a1413c9b338d1c00b9e96c80c0b62ace07009840800214080114b7e040ca14f967a044204001000008120262a0121100882800082cc8c100d64b848a01eced3240606a03d4a38109b7b6ce3012946318228037ee598204c1840010840300401000004e40404401e1a00e09806828030040003b44003f98800faa1e2eaffd3bc2243d30f4b69f1d0b88cd53a99c2b000000000000000000000000000000000000000002808a18c10c08a08808600400254b25e3a81cc8cbed53b8d103eb9c48259c17422c9338c33cd9ba79754c1585fbcd545af20bd99dc0e031538ceee2988525c25060b8c1a3054fd907bb8a102263ab743820bbc6a070a03881ab1aa2000898d36a060020a3b84609388110042490e7ccb65f10460d1472020818055349f3c48802d7fa66d20423c5c15d08800009f28ba410004ab8fbf93801280424602ad6308c819aee94a9a1c600000bb98910067c1ab1200dcf3a2baa50022008000083900b0580502e4906a7fa378104728213431091800ec9ebea488013a069a320427e375a378800008ceec5426082500848c0553c1a210335de6a18638c0000177312200d144720401b9e2426084a104401000010b20004e2400154080036a9009190040a801c2400c0a00501002008002a888018880084400202000010028951)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case1" = "QuadFull27Case1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case1 private def zz2108:"s083c"="s083c":=by decide+kernel end section namespace Green24Proof.QuadFull27Case2 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l0 l10 l15 l17 l27 l29 l30 l33 l35 l37 l4 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x821397f8e, -0x2cb416090, -0x1bc0c90d8,0x14668c8],l0, ![-0x1bc0c90d8,0x6c89bed8c, -0x14fc37665e,0x4200a24ce], ![0x14668c8, -0x1a192ade6,0x4200a24ce, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x65575028,l6),(0x1aaa197bd,l4),(0x2c322cc1,l10),(-0x6c7df020,l17),(0x3ce3f89e0,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x22de70e,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0xce377c,l46),(0x165a0bc00,l51),(-0x10f905726,l62),(0xab7324,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x10f905726,l62),(0x3ce3f89e0,l15),(-0x6c7df020,l17),(0x1aaa197bd,l4),(-0x65575028,l6),(0x2c322cc1,l10),(0x22de70e,l30),(-0xce377c,l46),(0xab7324,l64)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x88780a601000094260900b400c00000000f00490060f208a0b4063100500000a4240026602000000002c009200c00000001b0049006000000000901880200000d4088028602000000640900c300c000340208013180a000001a044038c03000000000b00a4010000000000503200400ee3402401b20080000001d1a038c0200000000f1a066008000000b8640e3008000000005c0290040000000f07028c02053063082062c802800000000a8052008000000004c02900400033118780510030000000e8380e60100134230480324012841480840066a00c005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x1c629d5f38608161d82d34a1c548b5bc2b4501d859b1f2040168b04df8465102200840e2d0cacf0891a29e739789030615dac082431887e513e4056680f6cd8904b36a0dcc00000000694e1270c230086728f120000000622861f6c8d386c1d12882462062442c12412012c0170180200d00010720005244024079ca3c48000000188a187db234e1b07448186189149107106109083000530300200d00010d337650c0351bf7e4abb310159a90ee1e95802ddc95) <<< 16000) + 0x60d5cc0a7e3229a61d46084272bc92d8b95e496c5085080c60c400300100474b5600ab8854a06e8a572caa5de117135c7a7ec3c4a4bb03c73515a6d2d495f49fe482c0bea556f51cac23280017d1e16e0da75314ff02c5a6fd0774596bf36e01be8c6a048e7717299ca6d9be210249743dd01cba3e3bfd094ea87cd59c9b28aa4ac0df51283e0b046d14a661024f177d07724817eb514a34f01518c174d4087a6a6ff0ecccb8244edb218042683cfdfc28287ad398b7d63c8226f990fbb0c305a31663cbe295fcf9b10388cb92991273c559185136381e2986d3e523ec9fe374a503513000b952ae27f50563de43502ed8a55f2481d779488f38f26687bae3024641d66580005b434df8c248cf209dd3813af62edd53fa7a194a2a4666c48d4020000000000000000004361ff2f658d8ec59efe2aa92034387227a496634d99a13c800000000000000000fc860430460050040104306aaf0a544f6d0d3dcb028f07e4c8760d9f633164a2b91b55cc00cc74f476e0f506903225603968e682f54dab5442fd415ede8f7c18dfc82e6c5e92f173bb9506aaa9929986f32d9cf7fe9071c67b8bd27d3efdbb06a204b89d144a820a4757c83de43070558c93149478fea000b90407c7403c0a01d0140c45d4ba5dfa88144c23ad0e870e1549672d514a182320d6abff4428427c8d4d51688009c708b6c100e016c991f9f3b14009e1181340aa228c9e2caeebfd0205604891c4066aa8f4d4471103fc30cc349c80e1ccb7439e78070ecb89173340a060c0205fbc76200104502b94f2a878602240942e305c8088b9f5b40902cb20e1860078a21bb9186e42e48931923df6b22048bfedd4ca588184d0a280afc20985ba4c01ee2821463f8ec1704153e79fa5f600027632a3a54c38e020a408164007c82d08972c69bd37ddff8a50c9d03616ed706140be970b6da0823ec4a40df0c0c3436fdca8b985033413d68e5c0a0140c761767a12001cc8d117d4f92400ac0a177e146b9523a4d59682c11eb33779be044017eed9058b7e9b8034760a91641631431028c20619408e0e0000401a0002d86875f2970684a1641daabf3245ad3c91478814199867561c300f897b9860841bcad551c00875d81709c10880200002ca400147c800386900093020382392705c49e7b9448e08a842ca712460c1d7b205610286d3049b56890cb8946d3e96406388245e59e0c100015da9f290004bd5aef268300001d82c4c329002901448c79defcbc0408474b6a8ea48700437a8204060194c50d04045b172324c48021d5c341b300120040000504c0c5df4ee529240b49d3760bde3862cf5caa5664050f423f70803840000072420382996793df32202006ef41d1c48000833b65604004a9bd99bdacf208500300001fb31cde69cfcbb136f12e3bc0de81a4acc03ae63315368449b0712700000000000000000011c451030c80870870460450040130100200d0001ad20360201a0100c808001de880c0ac05c4602c230151180a08e0078e9e0f58a04db27f0ec2002d8ecc7a00884648420100130168180952e990820f004200802008000022202413e382d8173ae45298ae986a92cefba398e1cebe7dd3bf50b6319a4e3819d9645ede218800bfe2ea4c398f1f832486a9e13db7ebb53020cf8a74ca72a1693d2c0b438cb886780051e4f7791b167898482523110c9c6f0cb705f3a8119ab6c3eb8a688bf403cbf3d380944f2019aedaa630611fff6316cf5c1c9b5ff1bce224a011d47bf0496d9db333c5568b7baebd538eb1d61570ac23d4ef6f7963ac93a730d504f9f5807a7e61a1074000055020221b0100580780e081a0e453f8370d77aee69ae27b475b126e7236c248772283221cc2e02625040ab3908274e1470a9c48cfd4b2eff5c8903c7759ef8709f0fea10326aa068d81dd016f2c421de1a837123a43956993ae79f4dd294554a373814272ca73d013682800788cd11ba71c9708a5cac08ca3a77270c1094eabbdd5a18d8d984b2149bbbbc2ab63a549b2833da92beaf12809a1000d200738d073726894e6376a97f6477f87532791c8a9ef58c5add23c0c906d145c5c0b8bb1e7c40207824fee8ae16c02e4d083d67b496327da7f55ce6298eb16a49ce676a35cc4523929a8c34e9b3c01fc537c957844b4669f50a1252a1aef33c690c1fbed50f7114c29d089254576fd0d9aa02e3e6e5c2624987efda8f430f1c1c2e505aedfcad2c63aeaa980008ea3030a952b4ccfb7bbcd14c997e48200440d95d0f0f4c753f53b501b3cee1aa5bf5c28af00d10106d88fc15fdff3b7a6c520805dbf844267320f852c33132a42ea96edef1283ec1c2cf07bca382dc10309556c79bde275067565dcc4278fa6041c74c0208ca138a10c7fb191e69860391389775719334303f0a27fc820f00bc0dae23b9aa8b06d041a3be18c0d77af5f94492063d987763a629f1ec0180ac97f443247afc655b537ac37e82ce69aa167bf32ffb766bd74ae7cce0a1c3dadfc855f15d001c0b00d01c7c8f83dc6136f77359017bb9aca000401617f61f79805b0ff97b2c6c762cf7f1554901a1c3913d24b31a6ccd09e4000000000000000007ea42a314e86b4a0000002c98efe0d21010809200a009aa73bd310bdd3caa5f370a5d15333565ec1c8d60fce50f2f222205090c9480a830c92965d945f5026b529ecbc19261e58c74092058dd7a3ca8d31c4ec547cf72aa1ff5d6ec0b2a1f70ea077b0cac5cfb1efcfea820d5b38aa59d5ceccd7102102a20e851dd40016548005f51839df50dc60011d8ce2b420892202000471)) <<< 16000) + 0xe886c2f0209a848bb44124303800800d01c101a0811c0b52e90a858d049be0f110800e634063b385472647c1067ad74e83f4ccf2d3fd8133bf0c9dce98d83c5ec89593551d6e4d1d783b7e0a1ec678efd79d88093ae8bb24eade3ba383c591ad7737a06e3e78355ea993ae1c15eb7190f30b9187d7f9d5e4fec8288257d89e5106d0212d88d20f57174baa0b2161a64cdf3cf1c8daf64bb052a7bfc671c68c52e3673a95adb8224c74f33d99e27c655e74ce3760641fa6ea344df943a53371e19985a92c88440c750af43eead2160d324447809e30000c3c4001b248003b490022d731da198224c6e51e66c60adc3d7dfb7af8dd907b84ae19aee00000000000000000827b2b93f59370eb1e54c9c336feaad575bd92f7c699d2b02dd5d0000000000000000000000000000000000000000000000000000338f8ac344784d4c15263f5cb9a13f8c947c248d07eb0a640000000000000000000000000000000000000000000000b66206186300280080808966993f40514132c361158186211c5aefe800388592bd320e3dd54fd792cca922f9567960303814a9fde417ce0620a944a81ec95152c90d97603dc60eeab205345e3792658ef2ae01f82265a8e6b91566b342c7294ad279403004000e90400ac90801f5818104be40e4e385f433d7d114238f6fb328608105b9008107fc7afb08200c3686f57080ceb0f7d3088ce3042010e20e77c14890438404497123108a107ab111375e1820a2a1e1752820930ea5089403811dc91321170200007a674b0028720231694100000023280520e30540400002003c26eeec8e08508bbfa7a9e1001854500c02022b04a2b804020ab52f6d0465182200862696cccf77c4989989a5b333ddf12625d68fb36500ae9f7435a3ecd9402ba7dd1084261060e50e60a20820630460050190001006e10415dfc838c1e1cad818c98083c6245a31010004aa68b200118040000374d8e24c0923fcb1a53f5bdc99230004f53ed183000f24faa186066e45a10308024d13c38c00011f53c86704230080000b61a18101ace4928587e1ff4f88147afde8fb14207bbf6380204bd646efc18018af36bb43019e37749f49c20880200002ce646138e8ecb1e1714502f48b91046624412695e0fd9131c4226d9d9f38422424522e3d205e020108795578180c10112cc8bf1526d080b4a1f8906368467104061801e000085080582f08081c5823e3f30728e6b6030dd2870000093e748305f565b98bec01830006d55820614100000001a5e3001ded126dea9280002c0ebd5032000000024eca3caa400b00a18439f8e0e1735e49b983e033e94324a8a6a9a20000056457e13f01825b2b665121629201420000056457e13f018087b389976cd33b00000000177f9fcbbbc75ca0f27003c06c0001191b1c344c5a9f2c6a138d66b4c0c00005dc02c3558f213d060000000bb8040006bb63e1b021100200004d8d8a5ad9e6829a50b4e211c358640a000009e34050693f68e8c5450467ef9dbaa4202031230a656300530ec48e981800f963021840090a6f3e11b2020a00700003e440280743003c9450601229982150b2c942246f94d2ea12255d479173d8e200000278d0121460ee631600a024ca70d2aa002429bcf8402dfaab12596c7102801c0000f510009e620023d44004c5c80100aefc28c9d3568ca165a0b623e633851f4824b71a8d6f54174cfb91336f95fdbf763e8ffd63ea25d900000000000000000f02402a2b2108b4487d8e164e970554854629d0d6940000005931dfc1a51c30c21000c0032be63da1cb3b0029adf9385c526cc04db7ddc13d217392169739f60300dee36cecf287d5f42308441c5c5d470bf82af373a442d324ee019422370272ee7043606b8619fa8745b1dcc704213144ec09a8037ae2a2a1b19102b11c95e7d46f2ff8fa59575df653297085a69fcab707ccd3a4fec0eb32ae27e3228ef04edbbd7facce68416ee116cf5a3b6a734ece6925fab53f86003d5f441db059dba99aba6dd04d85b3a3267e00c9d529b47622dcb4e5809e037701558b91250d105fbbb35abb836fd78695be1783746f36dc85184c98e13441897575d400133eeb3cd3593aec201eeed529182180e4f7628060c6a79fead10baba0fe98d7e5fbf58b5f2ee71533b4236b0df71b48d71d315d554ef807ef0863cd0c9fe472bc0ab1d888b82f4b44487e3c6d09ed7571579cbe804bdd16beff9f5a9c2ca24cc0f3df57a5954530c5d65e4355943b4b39afac9f89606521dc78560d858f3e8bfd82eb2f93b3e909d56c394194484ff63500b7a8fd6f7fc4ded246fb7ee29567eae5379d34444b246bd0705573c6a549d046b4da3b4d698718aa68629bcda622d7276d911e444e7731e1a7ec48a83899e3828191a513b6100b2e4e7fe2246284001000901c010040100100a9026433def484207802000009e401c074075ab18d64400593af5058c008b3c23fe811881100400002ccf1003ae4da710404c53fd4050401040b8828001af582d89026c08b1781400195fcaf10498508802000027c4000b748001de1000e8b200277268651a2689dcc506e2ef5824a8808021a80900140349d53824620035e2734a20300010d31a2004009be8426970468e284e028c2016e7822be1c2002a16220a305bd603425285080021ac594880000433b66900008696cd038094610270146100e50c825070800d75ae8060ac3728c28050800000bb8070001af58d84600896b177fc12610240080000a410002c0200c320050100200800c0400098240089400202000010017dc9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 16 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case2" = "QuadFull27Case2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 16 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case2 private def zz2109:"s083d"="s083d":=by decide+kernel end section namespace Green24Proof.QuadFull27Case3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l41 l43 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x8049fd1e7, -0x2cb416090, -0x3847bf66c,0x17a43d802], ![-0x2cb416090, -0xf91acc3f4,0x598a0782e, -0x1a1cdf8b4], ![-0x3847bf66c,0x598a0782e, -0x14fc37665e,0x4200a24ce], ![0x17a43d802, -0x1a1cdf8b4,0x4200a24ce, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x65575028,l6),(0x1aaa197bd,l4),(0x2c322cc1,l10),(0x1275c701a,l14),(0x4bed4d064,l12),(-0x6c20b97a,l17),(0x3caf389ae,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x15439e882,l25),(0x2d64234,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x4babc17a,l43),(-0x350a2ecd7,l41),(-0x211c8d88,l46),(0x165a0bc00,l51),(-0x136f85870,l62),(0x958b4f52,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x15439e882,l25),(-0x136f85870,l62),(0x4bed4d064,l12),(0x1275c701a,l14),(0x3caf389ae,l15),(-0x350a2ecd7,l41),(0x958b4f52,l64),(-0x6c20b97a,l17),(0x1aaa197bd,l4),(-0x65575028,l6),(-0x4babc17a,l43),(0x2c322cc1,l10),(-0x211c8d88,l46),(0x2d64234,l30)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x4a0661080d480200000004c340d300800000002c38198020e61462040c59005000000048281a6010001284219022400c00004c0220099808000000260501cc02000000170880a6010000000d834053008000000170009900800002e013004cc04000000170380e6010000000741806300820c30c50818b200a000000001101c802000000001b00a4010000c4321100d400c000000321407180400000c41100a0c040000000a8281a6010000000005409200800000541880d18060000000019038802000000001500a4010000000002409200800781083404e200800000000090188020000004414018601800000000980520080124118320342008000000120b018c02000006812007260200000310840393010000190268039180a0000c209c0140c05000320a41403480180000005c3c0530080000005c12029804000000000140c801006c0e62c814c802000000005850330040000000005819002000001c848070c03000000000380a40100000000009032004000032220c0520040000000000c0c801000000001700a40100000830840a930100000000012039004000000001102480200320921080c88020000004211014300c00ac1202c04ea008004d08c1200c9004002905409007a80250829010800cd401800b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0xf00e401000000000880520080000002c24039804000014848004cc0400000000580124018000000036009200c00003502200a18080000019024030c030000d0082004c602800000681100e300c14c184208069200a0a60ce11c0349005000000000b00a401001845804c0534010000000322c029804000001a0b404cc030000000c8b016601000000220900f300c012e4404401b2008000451e02406d003000000108281a6010000041084028301000094290600520060000002522038c020000000132206600801cc5411007a401000000001418198020000011838024c03000210e432052801802e87208c0144010000b43a09806200600be1d02300590040002d0e82605880180000410c40393010000b43c0980720060001081b401c8c0500000460880326020000000d8840e3008000000001a049004000000151103cc0200000c60c80446020001d0a42b02a400c00000390500e1806000030c490044c04000000110e81a601000000000840d2008000000443a0498040000000021024802002606a0e819080200118210440394010130104108034a00a0000000a0603cc02000000078381460100250330a406a40100000398620549808000000000d01c80200000005400264020000000a8440f30080000004c1a0298040000000001c0c801000000078481a60100000001a0013201000000000340390041380c61040329005,0x6402900400000c42100a0c04000000000280c4010000000443c05300800002702200b18080000011024038c030001284c12016801800000001e009200c1e41141680c6200a000000078004c804], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x12407813e37e50e1420b9729238380a40d050a1db059168e041578c1dc20035f4568993021100402240745368a62d0451283b73ba69642cf5ddabc58c5c59e4e21418c928e48a58356ddc6f633021100428aef2037b5094486bbfe67c8d2004848eeba5900b44ca6712832da29cf0c160e775c8a220d002c74f1b485800b516e37c2c021280600006b080017f103509c8df69bb5f130b152ded6d74a2319424524b9ff82e0e7b83fe1aea1ca8ef9211e1464b029c726191d8bc2f858bc3044d76d6505c1cbdc64a58a024de8580fd75135b6b9549a175b244b300c14008bd2c55f5e816cead0d47e1800087a645d0d9d044060bff42d06c12e99495d09a33dd0fc0060c6d13000c008000f2481382f8f9838d219c28615de0f5cd8e3056331eca0a1485b35118a40a12b4c5700203077e86b8808016fb48e76000fcbe23c4a11c6094030000352422017b51f5b89f8aa388f8da8fadc4fc551c47bf3c32da1a835c181d79e196d0d41ae0c0ec22af487b0046f474983e15a03eba58feda29844458c48c3843041844802e211825e269d63192528896593d5061a6059417a4aabad173864cbb39c78ef250a47803b4e2717a6f1dd1a30b443ad2d044a24e3ab1f6c1c409b295e8aca8aa81b6583fd79cabed55b1c5e78da02c2a1f399694f0d853accbbe4baef8f10f1f891cd5014a84e862e90b02e5baaf31be9346b733bf24155e90f6008de8e9307c2b407d74b1fdb4530890b1881070060040052c076fecfd8412f3cd475e2ecb5707fdb4f424c638bd858f1d4bce08bf5f09eea9f8c28832543c55b152fa5f1b65514c529e8001ab102709d0c18a30f5e2ba1f38267936652aaf7d8f66d72c98a179574586f6e36bdb0186baffa81c15add639a260a098415050898e0ec04e0459a042dd626b0ce5ea90c1365760806c0519cfba42676d93c9c63b01aad2e200d3ab13e982795c2a4e075f6572096d103886d2054466458ba6c73b2164a37e9a73c030685694976935a013d0a469d3399e9601498e166f294726c7b000090c40033bce14e6fe988a4889988b7741844be0b82e080e5b9751203044ee26650a8928c1080424488) <<< 16000) + 0x7889d6e3e4146a79623f60c20c127ea1ccf182b2c8a7b9044065950a256a437faad8473b04280ab2681f5f66619b94da3b751003e15da5e0bf8c203e529623aad6f8fef66fe5548764e02c2850062550f1149f780ba9c049db22fc84ee0f4925185d0f400019790591d0220a800120484390f859dbba7d1e64640ccf0e24973d576fa4b873d62154bfd89611423940af33ffc0787745c138831c3547ea1ec49bd02f6b51a8881536b1e16858bcc89b688a55024b2d36762dae73e961f55bc0204baf06374100e1cb1486696863b02a18b2d8276e28405e67422139eee536691bd8c5a0b2181d1cb7708506939b146cee9f6257832217526373d4157f78b8a4851aa23522ae7a3a75717741a91729e805b0d2bcdc8c68904a4647e0214e4820835080908f3428482178d661f4c70c327612f172f5029d2b50dd7515157cd37017dfae58f868a504af2fe68ed2562d4cd10b304a10000e1a79a4ab1bf8fa1e82ef19544df832b6c74b03f9fd543d5f00000000000000003d11811010c1180140100052b5820524f51729db8ce8e247c7a876d55b1ebca52167175999682a79d7fbd70fa4d3a850df01e866888ccfe9a2d3571c80821f551ccbcc612e3cd00032a210c5a0851184208c20c1410402818190f63750f838558fa5dfa0f21828eb8c0125780a10582bbcba14880089ae029014438117cfe97a3d914001d732e8334ab2785884715a801a0e8388d01d55239216818247753ad4ec03a407339986b6d0070f06b514e2398c1ad9719c9eaa180beda40b78d8054afc703e2475cbff417d4812737696bf28f31480ac0a1445dd9b6325b3c8108e6216ffcba20678c59051b720820c8ec7c6a3f0a089a451b316f82022aabadf87bc327f9b451c684039abc954082d2b161c2d034590c1e89348a4e2854b9b64afce8922cba8ef7afa647100807bf24fa6286103b447eef50821a56c4390d18c0869036da68640006da86921f4a0045c40a168182c6394ee52fadb28685c34b7697330504e933b292018512e6627b1e81c20d6d403f8a72405487e23b00610051fa77817020cceb31404690ad4e2058058b192b479dba819433b936ed18471c50435bebc50230a0adac9e0704411225f3e8caf0e00a6ec33790d1402063f910648001e8cf4bdd8c021df60fbac507ca040ac09000042640010508090cc0019048004231000a2e210253e2547f33d21ac80f883247705a386fae652f7d320257a9715f028e12b95a2e9fb8806053e8d0006300b3c4cfecc10802530629a4ba564041481028827a8a1a8828760a1f57d72848160d717b24408473f4911c30586f39072821dded0b9d24150dfd74689c0090021438794bbcbc4a17c71809f0a4880720bb3b928370bf173a40e18500e83c48a0ad3d184b6c38400cabe2b1241c09a62fc19600306e3b4362400940400003b8650144ef0fb825d57dc83cddbca15281e5f745b18b4e63e39fc50000000000000000002309230a29219019208c00404d3edc657041c0068000db900053a21000307f01d0e0172c4e214c489af3aaf26afa4096f10f78b53648658037fc583c4065af5714f7302842a1d785be3638089d52d264c818043952818b6cc608042c02c51145e498c6650e01a6f57f830c00000812450adf0e4496648a0fcd20208488cff5c27043061053e2e741023fcd29c6140012004288a5e40a7c4c3c6180dd8d4f8ebc2856f2a9788f338a100271890ea39244843de2bb00f060c25d134f90f00812b3fbb5246f8b000c8033293c21c000d4e48587da2fa400b80c000046a4000fc483f00e870c80487ffd8a171547ece91f2455389f8021cc91233c306e25a1831fb9e752114800ffe5ca865610018ae73fee2820060b7dfad127c2010a8081642c3066d782c6f1daaa06450c03a890b3ca16f3f3e7470e20c29dde272420b1b23fd21026b8d06b381000000028b500046010b20c3102dc69e91c70373d503b9c0b1a0c0dc369e9328565b9a76994807101cfc71756e61c30e05aa9bb3f82048306c4e9c8830002cb5f41ce20800049b6b612588b89002e03000011a90003e9343ad3094076c4a15f5cdc9cd2648a51fd0eb8bc244d67e06a3100c192de1f0cf708011382edf810200278e5644e808026e3d280903e2010a4071644fc9a0c8c1431402a85e6962bcebfb21d94284239fa488e187c875a118e1045a604b196096ccfe1c54e0048010b22b7e2829bf601c7018b37aac040a188187aeb4ba82c583c05f77fc00a142e2a9e28e001c21218d8bd0640b04c8489f62880201001d2708c43c8000e05b17ded38809002e03000011a90003c12000b584002e9080c06c0047848398881f4340f80a07b0103d0080066d881218c1e4960f04b0772583b0ef6a3eb713f154711f03cb16543c37b9c83923b78d38fd3b7d85289cf0cb686a0d70607611df33f797eaf00b2b1beca3c58c1ce37c89e5316715bed6d64dd95e48d443674d3800000000000000000000000000000000000000000000000000019cc51041080050030045157902f63fadc745889cfed502b8287fe006c2fb3de86ac6b2d527a8fef835565b9307deb2e422c73541eb7fe242d5c8ae125f1cb22ccb171f8a23e69b6e5d4d3179340f7242a9401ece9009f1fcf6b7974d439ced7099011c2db423fa428a1e98352e87f4e597d34ad4c94442b3c0c24fa23033010ed1ef96de8182e8f2b5941c2c454c58944a0ea0a0740103980a8a05fd26bc101946031b804040d22d1fe8e0812960ad40832002ac660ca1044010a28a95aa5922f18a80114631c4e0e09eafd9)) <<< 16000) + 0x773f22d5f948b09da85820ec025e29d3677e04dfc37d8ce0402779f18deb2adce2e4cc891370201ecc968b8bd29aeaaae6e958b42b7fb5a8443e20a095f622f4cc1c91f21238dd4aa3d421904500005f640a8360e41b0120d03886c054360e01b06f0583702f480cc741c41a2515bcbd883006cbb4a02460842010e3a51b73d438587d95c58e11cadd420380cb572b2e8003c008e142f47fc12c5068422805030d5aefb8c007802000013e4000608f9826b16964c1f68251a79412981ad4b180083a277a1809be9d7bd65081f00800007e190c722c717382a5cb03c809060f00200001e883686c1a0260ce0bd066a9ec5af7879aa17baa6f0181702d86da8f0093b946ec3e36edf68947621ebd594b30e32fbdddbe972ecd9617e289b6d98294070085e71a1357b17997c7fa51084484d4d088adac7633d3edab7cb1a06847526eda9886002cd527036ddec5e89f98f9e258a150f46002aa84611c7961214bd012094c684f5ebd32bb9bce42df352b44d1bb732a5c50e7d897b2f13f106fa056534c04b00269f79c27c40ac4d2ce1637c3f88a0e77c28045f2a5efae21e5bc9ebfbc57c91d9a9a31e81bdaa46d5cd13f60715cdda7c07309a84c86bdb244af5b220263690e384735b61b40c896643fafde1ae4ac7243f294560582f58aa1b6636667653acfbfbf9cdea3daaa6da0819178b9d2fb09635dc2c03817d2be91f7bdd2836604710c9fa40bbf6ebcff79d03068d42a94d7974e9983046a638c6831fd31d985e00004e09b06e32cf8b4680089deb0d2000e52aee09182108042000020080130100001b906c0582980c148060a20306b0182800c0005e883504f44eeb120c605110480c314143189dc8414d0856be57721421b32edb6c504163756ae40004ff281689c1088021a25b7fd6f122888f727f060a1851aae11868422d658de0a10a0939d9a2821c24512193021100400004dc80900f03d575eb56103d25f13bf1c003432e4502618400080000aa20d21bda8fadc4fc551c47c0f2c5950f0dee720e48ede34e3f4edf614a273c32da1a835c181d847a6ae524a04c02f9a4ab1bf8fa1e82ef19544df832b6c74b03f9fd543d5f00000000000000003d33033c13810c1280040189782f06899541b996c8ae92538f4a756fe8efb71603dd899a33aac63820fe2d59a038b4d5dc3104a6ea6403ea1ff887ae1052470ee719cbc4c176a48debdb9926674a13fba6b48a3b01844cd17b8408bb2e356607068d0b400e04f76ee718060aad4beb402000041876da30004859a6f042610230080000a1100067420d01b06709ed47d6e27e2a8e23e07962ca8786f739072476f1a71fa76fb0a5139e196d0d41ae0c0ec23d38fbd57ba070b12914fc02bcd2558dfc7d0f41778caa26fc195b63a581fcfeaa1eaf80000000000000001eaf487b0052c693584ac7f6d15058feda298448502102580180018e6b500d23ccb3d72a7852f92eb7ae11df712a8ea7ce2e46fb5e22ba83d329d0d15ebce5596362ec8b02252e9ab56a3cade51c1fd34d5e8d51aa67331d785ffe4400a13fa307b4b91b7b77af72c765761ea1adb6b2e4c55f6931c40101ec9e00df561efeb9c4c4be5b1f356ee59f9c496e039765a4484b8be0130c1840baed551ef331988dd7634c476d3048b51190561965a0cc1a01009032828002084d8ae2bfae9c182d0f8e84c103007d93b87003e01d436480840010b15fae04570a1b8b3bd870c1be7fd31c10210d662b890107c02000019e684df72291638885d2bda088107c0200c80200008e20c6130530582902c144160b20305001800172100159a2004ada4090960461bda8fadc4fc551c47c0f2c5950f0dee720e48ede34e3f4edf614a273c32da1a835c181d8470e3156cf33d02d0e7f591575614db246214155e90f600a58d26b0958feda2a0b1fdb4530890514700600000411675d4823edf4649875fbc14be0942c9988fa2c9a67ee1c78c54787d9aac0f9b9385a196000244053307b0d9c2f325a39406a8ec880a3da5ebb388fcc0ee8b72636830a25dfb04cebbe740d6beae7be9e6ad38cd73c537908cb4a6f4e425c5c7944ad5363c088886a307bdc108c3859821055cc398c8080006cf413a23188110040188060c2030600182f80c178060ba0305c0182d80b850fbdccaec40a09ee4c378e0c1559023d9a153ba280be08133094eb3c28002e36240430049ea307d88938a11804305046a9011440a0085b1e607140eaedbe49a14184a46a7182122109cf2102503d987a4700098f071f88938a1180400005d082d04c0bc17c409cfcd1cc603e8c475f08a04ff17dace8a081710f5e22c05470c9fae1803a297a9155516620230080000a510590502c00ec70081b314cb1036bed86720214ebf4b40d0407767b3014106e4c201870056f5163a100bfac8f0389c1088021860728a07c1c717d99d5440428d28048d07a369f9214080076a64080018d8c424c083e01000012530000100402b80804c040000984158260aa0bda8fadc4fc551c47c0f2c5950f0dee720e48ede34e3f4edf614a273c32da1a835c181d8472795a737dbe442aaf9de489ef77196272fed9edb8f8116b278a000000000000000001100f5b1a5854c0b0e3156cf33d02d0e7f591575614db2462141552cb3c130010012fefd9f684a7e9d9060f9dbcb295ce9e55d654c38f2517561f8f383d6a8cbbcb3ed8c62feb568ae27de7be9bd9e3d01145cf722072b7ffca48ccb71610f336887e6f73a2bc57c6f823b5a73d44d2710790453930b8659829db590097b69d33c68472637a47302)) <<< 16000) + 0x04a517f0101046deedbc25082100802a02f0c9aa089091c256de5d0bc9040c544142800516a1f8c2401438820b0928610804000042080011f100083c324f8c5a810a707fccc789d158a74874013a791214ad52dbe78ef90dd8a7bd698cd87800317574048835d351e6e9973b3f3b2b607606f871c131dc870ddd38262e691769739c7c385ed6ef2079e5e1c4ba72275d7eed8b80a06180b2585b36142118485815aa33b2414f99da6d840091284228c016dff47704e9d1a4bff92e97319e785dba2b2e6545b6f3d84a7ed1161c0263e9bafb323407923071e0bbd16beadbe233104cafb8f35a336d08d9f2f9901ae669f535dea5e5b94b4f4f289ddbd32142620fdd6ede7cb0e40d956267345d0390a18a62511daa3155f1b4238f5ff1fd203adf846961357f809dcd37f853d84e69013b3e5b9a22d76dcc7a2f5416eaf2658073c28914f350dfc463352c5000087d20a61b0520d82886c140160028f24006540800d6290020c020096aa70d866f214a82c0c205ba6d6c317a20201256f808de020803dd0661ad4300843d87fefb586000495bbb8478002d42e15541022092c31617014013c4409c2204d0502600812c0400046240155f0803e2a990cf63d54e2782feb286a424803aeee786691859250075fd29053bc0a3c5224eaa4d6066c960182d8c50c518d3d2e8fee3678b1ab3bfd414d969ae651d90bcd993570144fa16799b5d1f09d01407dc89f90bf3c694d856c201b8c06a58a5d7c03728b85c3ce6ff691c21556661a12feeb916060433058113ce062bf0973ccc122fd9ef2ba5528da6ada158ae90a21db29141f1a6fbf94d64112cbdd51c6343225e48cfde6d6ab248a0ed88985c8475c8a481c4d4eb367aea500e22c0ebc95e32b1f38230744bfb8e5ddb6cbfbc5ed3c5e9e806ead9a6708e8547f8fd3c24720892a0c00880609403a1e56a7aafe28608309f01f1dba979b5dcb56c00269c3e76843706a164e3ad005b0569af7afc9368be842c3090d71f170ab351845dec4a92ab8ef273d64aea574760ad331c299d32e931d9d175009629996ab93ad6982802d5eee3c8f7abe462f7c0dac60711d618af7a183dae23896875a961ed9724f751d5675400e8a7957659cab60379ce6fe7e7e6d738fd6f977a33c9ad4bbc6d9085deb858526889f36f9986d591176e0252f148344dd87ecc584014644793b80d735a3ab1920b5a94d19f6f250f182a7acf6964fe8f3a48907f863094d4bc61000c655311431b2c91af8a0ae7508d790c2256c95798b000ef15da32802cdfd21e86000d22e25849c20880200002cc411c37433720fb4008e3af70ef1ada8623def3e2aa3de13d547f53c665987555ba3f6146ed20fe47230a91897f1406cf46988c3c2e8b61ee8d6840a22ab7a069e78ef11ac0968a1e203e39c4b5984e3f26b7b7d625a62e99161c68e91a00f8aa8fcfe528f0875c95bbea49a194c5158b81081e046cc911c27fff88f55c088d61aeca3e6093b63814cceea1a4d5cd5a08c88061366acdfc17c1cb686fae4957f3c969b776a01ac00754d01fb7d9479a87b98265df3b583d1dbf91ddea9654e226c63ef1692cc6ba33728bb531bd8a9d1b3dcdc74a7c16c64c81846463b8fc2afb7b2143fd2c42e342e82c760c10da71878cd77bca293849e421fc90b9e222b7179c2f74574d42c62c10ef159e79a8ae86d46235cc780008912020220011003020344fad0c700aa3cf27e2813c04ac604448c60840212418b973b11038ed8729c9014e52dbc311821000401240609003a29f9130bddd6b7502885d2f8b5d5438d0c81816e82251e2e1aa204d5d8ab52e40104cb0000000b3fbcd46028026771c151d487604000f456876ada4fc13d6f353861d02e000089882388e8ae8ce8a8c2b8850c166e815bef48610aacd1f53c61882273a9197c1b81c107f4e02895d43023d87f0f292101041e534b81af90600e3bc3c89b820000cee0dd4c415cd49002f03402300ecbed684b91812c737bfd4b0d12c5392e579ae414581441559d92020000013c682c197249929422000000013c68140042de59a54040051dc55130a320050038b2f4a0b04ed2610000005dc02c7318e126449629a11e9b280515d161394824040000017703011377211d4160c2499a1218c0020968dc2932004a0200001dc20007e2411414088020430100034f90009e1200156041086608213da8fadc4fc551c47c6d47d6e27e2a8e23df9e196d0d41ae0c0ebcf0cb686a0d7060761144a10910710804604404304800fd581ba7f6f07d0435b23269600208a910d61324d5995a4aff78d71fbfe81bbf128cac23fbf0c04529156c516c8bc8cc814032ef27014313c85bfbc9087fedbdee1c205a8941a0509a1d649f22c12fc76ee44206437137b42006aa6160b5a4108802165821ecf9570b14f834f902a30a017cab5cf143173238889921276a20572050a144f53ff84021c1ad8a4d08172e6fac91b4804250140000d7100038a20741b0400981f84c08827a0ff3520d2b8003d2e6fb37a766629bda40000000000000000145fc028693aa9b9d844e692ac6fe3e87a0bbc655137e0cadb1d2c0fe7f550f57c0000000000000000f648cf6564b7c0b32051430c22802001806015fd7faf07083b34d58e68827603d3a79347662049048f53764fa0e8de70cb42b71ad60c0494c5778db07827891f3d472885c550a9e8c79c1664dbbc62253b0da9452935672ce35ba60b069ba3140f807230640c961830841abeebf8818b94c59381052360b96c0c0056e30e7e92841100400c4172303596ac671840a5)) <<< 16000) + 0x4157cc5860772925d440c9a3abb07041536592c3e2c0311e77bd84800ede4962549c308c0200002e04000aacd0f1741b7b4308c3cadd885002e34f1a88c108002007a0b03c05f35988bf8d7e617679be051901e66d18040b21432820c2201280200180eb544e3740e95038d55fc1c9b6b5efab022c11f70c590f68000d2103b0100015210101500055f102619e83fcd4834ae000f4b9becde9d998a6f6900000000000000000517f00a1a4eaa6e76111a4ec01d87cc0b22842822011811012401402c19436fa763ee602a1bf638757cf6d0c11d712047d999a975a7e80b3e24086d4b4657382d6bc06dbcf55c22d898b6382038fc7cb149523b1e03850d89c191142111e9c679003908822f8102038c92e04c0842010b1454e0814cb0cc32e3dbc90ad1d51dc4709e700598c50b05bbba7c205de3426b498108002000025640009dc81d06c04036072130380981104f0a15bee59496165030de0018432e6c0fb16080dd68068482529344310000668ed8f44c0844010afad3f624316fc26ac0261b4dc70a79d91e7c66466c40cab58a00000000000000000000000000000000000000000000000000006712cb1852c32c21413002c008030080200d00022c206a130370580902e444860c2b5a72655e42ea05df7eec11e46c144ffd114119127a2edfabd598abcd1ab0e737d8850f0a2d633b97bc4bd2f4a379610761e3ca32b208746efc2e860835b3cf58408fdd120bdcfaab51768279f16574049f58598e408446ed9ebab53e45c215870e875fc7827011d6768370154346e6a2d08f31aba7117a4c1aa5255b65a310bb3cb3b157bba77ae290025a758ef111f4b9cbda57a8180aa1a393ad2a266383eb1ceea091fcde2029a6159a59e55cf0210902dbab2ec71b250aa714f9e662153450eaa738f3c50fe744ec2c98ec385981709f2d7f19ea4d073bdb0630476790a6bedbd9afd952239e6d03cb22e7d980cde83906f6ba0303c844cc7cf9080c492b8502990c32cfed9eed588082125352fee08215647b43670c04a590e3fdec0c1193720f6af0204101c21931e1401499a87afebc2400a808006c0302f01e83fcd4834ae000f4b9becde9d998a6f6900000000000000000517f00a1a4eaa6e761104d1cc10a1080c208c00803e248ca588fbdb4b24a6adb9361ef31e51c68f19c4e7bc867b15c6021e45fed5a02f1e17f01aefdc22a08ca000594400147080986800348081108e890dda3a699619c6ddcb10c09d0934d1448300851db21411ec4b093180004ff4ef00003ff530984e0842010afad3f624316fc26ac0261b4dc70a79d91e7c66466c40cab58a00000000000000000000000000000000000000000000000000006712cb2c73021022411413002c030080200d00022c206a130130981a02c0cc17011dca2379c03dfcbe388076fc572460038010c240c0bbb0800d004000011881902f894f64a389c1051da73ce07e591d96182512c284900074021c359146d893809620ce825002ef2a7ee3001f00800005119022d6d830800c804243117d578c6071a8ab8f2805491727410158f257f90007802000019240004a880016390310181800fc9011d800746b0b200987c0d85f4207086fc4fd23b04102c5ee8c0bfc203326eb66fdb6440c08eb6e6245828122b2889b96883061d6105297a7000d12918f3ae531c84801701e3c9008ec003a3585900261f03617d081c10df89fa47608202c5ee8c0bfc2031a0d6d91243650222b2889b96883050b58392fe32860008eb6e624580008af5138976498e42400bc0f0000482404c17e7ae69a0e18808000017701e2581904408688000017701e01100f81b3280110043cfef5af2c111e5905d34b0cd0100000ea60078935936fbc2400121ac4f799e01b5c65cafcb0000001d4c14700250140000bd9cf77e4c6912577963380aeeece78b5130a65d2dca65d55d1f540000000000000000000000000000000000000000000000000003309e19c19819210c00806100c72b37ddebbda9f67cebdd85ba0e11b2f03c5025ae87ceca4ac807369f774ef98aa1088036e17ec475eb6c05c89d71d5bddb0ae92c2c09d46750003c82000d0040bc07a384f25184ccc109ef68d14850800000d2f030127954207c1804c2d18014080027927ef761000d319d864402fc55e0934b8812808000069c80068d90011512002aca4009a3080165e1003e94205c0a0030148a4216855bcc2e2e66286cefe201d0b65dc49ad612a45e0980d524f8f1c07568b2e7bde6b8d5bfb956777ad794749f5bd281c5fb982c773f65f798d1e860930f05085179b387c5fb5d68b7df1edf303db109c33dc57d96b76f5eced8a2eb66fef995ee65fe408a66154fa74743e47845136fced9f75dde9a44478ffb17f5d484188e0454b6c444f210f36ddc0ebd8dbf9512c092839dfc770c3c258765fac154030d559f65d1237933c32345cd20353f1b859140e31b1edcc397e97e6ef855f562d75104077f490bcbd9ac9f458c458d0dc5db27a60780916233d33aaf9e2d8a76c31a21f666031dbf50085226ab71f413bb6a2106b3a5fb8ce92332cc69054e659815647d34d0679e42f7228444087d6ea978d17884daba532878dcd96a4de105ceba50ce58c11da431b18824666a71c63eff4af952226bc0d4f9ec5062319fb76440618b46d1290101a65a4901027ebc9c8a0c044419b9400802bf103ca2928611004009c0605a0380e28dd96d62803fb68f560c0a55ae06c28918a1080400002c8800102102c09d38fbd57ba070b12914fc02bcd2558dfc7d0f41778caa2)) <<< 16000) + 0x6fc195b63a581fcfeaa1eaf80000000000000001ed90a6a6cc20816648a40a288284380080a31548b9d8d3750d31782eed013169b858d4d3d3c10a88492e71d316ccbc20da18a1417303162b908a0cffb34417f40614ca2a68158280a8058509407567c80c0d1e4a7b1c3dc5a8ed0840803df62850c20300e64cc601816a1a13040a00cb2d9127082200801482c0a01604e0b912a8aa7d0c7f62046545d4dcde1040cc52f8b4be1b1814dd4f62e5c544056015dc1df202401569c6ced3b48000b1dc2e60801c05d7cfab74379467104081701e36a3eb713f154711f1b51f5b89f8aa388f7e7865b43506b8303af3c32da1a835c181d84508cbc2be7040da25c859682c11fa4617efb209182f5e0b7eb12ea04c92e38bf9465c717f29024a71f7aaf740e1625229f80579a4ab1bf8fa1e82ef19544df832b6c74b03f9fd543d5f00000000000000003d5285144142181b8084b81199233d54e685791baaabc57bed259c52a8dfa324819b8d4e1c266f8ecc8bdc31b3b1f00cf9adf9e431f77bc267c0bb8a2d0141d2392e3334334010aada841d868ee259e35cf0def6cab5b046b157d82e7f37155d089c0ccd2d290b6bb1f15b8a326016ad3d42344ef99f0a06e4357705ebc16fd625d409925c717f28cb8e2fe52048c80f3368c020591429228a20e10a10c08e0706092447b4be100d5f1bb77926a5c905da0fcfa67a73b6bf29fee18e82c500021a20013624002f4881302c00369c8008b410252101210c08c2722aa0465a9121079a73b9841295c8d660c013dd36550a050f774b4a9286100040088060420380c74e8090101baddd1a5448850780200000fe40805403e2b01e0580e80c07005229c5ea1d1a00e9c094838645104f8bddaa73cfd4a3081384844cf6992e198f20e06e1691020399a0e1c878043426d478e06008fb1965bab148009a94603b9f7428b1e251fb029bde200a7886ac6b5698cf7465f45512e1454f7dfb8a5a9e1f70405f88457d6f4f03942a86838ab457457f1838af10a003014a4b26fb2c146d7557e28127c68f5f1c098539c48140a7b8ab919c0080021c52da21ffe0c18df3051a180a435e2fc96093cb0894140c580879484017389cf24c00400100001293a480983b3c92148af479c1008161ff400400167f6a3c8004001001301000073101b0980a02e1cfeb22aeac29b648c4282a269238658448468250048028093137ff2d955ddd72639b1bc292e07b4c062685f7cb02c1deb52c46176a4b13c34fafb2c41039c16872210260905bd63c02496ce4a98008002162185dfa0648102d7840ce786194b0ad4103a93f08ab88106a417a5650021008000081101a05dbd7fd752e302d0e7f591575614db24621415238a2830c22411010c13802404c040080340004748001c990005122032130180980784ec2117cbee42047bc6e7a4a0352ff6941000c2a4f28528183e00801701c0100401002c0b01505f1cee90e2c040b8a3c2b54e02efd536f0c015a906b3949030800200001ac40004f480a08e86b0bb5803080103f20604f3d8b38c006c02002603c227ef745d181b64d5af60802c81261e3001f00868d967ba2ea58a32fb10b82061be03d9a580896aead92001000400003448000c69873fac8abab0a6d92310a0aa62295cbd2f6a14c584cc82abd21ec014b1a4d612b1fdb454163fb68a611196210208104092006049b3762f4334c66c313496ce3f54835f806fe75b5be6983737fbce4554dd715d2e15d16cc0ff162c115246d0002f420240bda8fadc4fc551c47c0f2c5950f0dee720e48ede34e3f4edf614a273c32da1a835c181d8475bd7fd752e302c38c55b3ccf40b439fd6455d58536c918850557a43d80296349ac2563fb68a82c7f6d14c2252832023402006451feaa47f5b2dc0deac99caa339f61cde426a343d68633479fc4c4ebf559be3042c3f0b8ab25cf7bebec502a1587d958e49c576e868bee74e7bdbac30742f84a43e8dcc24f11e6ed4112d44e80028e9011010005619010190006a39a1784ca3394b0c18350924b04c906072c4045170c18c2046501787c701c2680f28301f74ed7ed127102000800780e089fd3baa20a08e3e5a0fc6000338bc80080054253859000840210467a630c7120077f4581c800800100000f0600002008823334ef2596087a9597c2401c521e0f3001f00400005090000de201c0300d01d8c5fa6295c92306201edda30d16118fa00e086a591f4060039fb6c8f96020209a74a380167053b8824e204401000016b20008224030440160a00a050002ee9001c8a2004010400894c80203c1a1c166c81577b5235f719d9c8dcff7b8d7ac99c537a4cfb00000000000000000fc450c60860450440440030011bd2e4aaf60c8d428f2bf531c1f8477325d4ec0e38ae1e5cf77e4c6912577963380aeeece78b5130a65d2dca65d55d1f540000000000000000000000000000000000000000000000000003308c20e18c10a10e08a08804d3edc64225c607001bc79862aceea2570e281512555cc8d880c019dfd45098e3863d4a28638e1a1830009a81f1bbc82080ac69b30ed6050000269f0e38f2200055653692a24047e840a18816208aa3f34e03481806e17f5fa2440073de4a90810816dd822f1c40000005dc000001b72495f04b0813002208d5e12176b908180bdf89b6952440090d5dd3408109e83a3ac9f1c4000000753009000486c6b7602000252107e698128e20540280001a6200062a400152c8003d490091900406801c3400c02005010020080029888019e80083400202000010056c69)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case3" = "QuadFull27Case3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case3 private def zz2110:"s083e"="s083e":=by decide+kernel end section namespace Green24Proof.QuadFull27Case4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1580e4316, -0xde2c256c, -0x14d424542,0x9012e40], ![-0xde2c256c, -0x3f42c0b31,0x101aa4a,0x143aa3218], ![-0x14d424542,0x101aa4a, -0x5a340ef48,0xde2c544c], ![0x9012e40,0x143aa3218,0xde2c544c, -0x6f161e6e]] noncomputable def hinges:Hinges:=[(-0x8c115,l6),(0x92527b,l4),(-0x280514,l10),(0xda75b09a,l14),(-0xe46eb7,l17),(0x1495b75a8,l15),(-0x6f161e6e,l27),(0x6f161e6e,l29),(-0xdad8590e,l25),(0x6e14c49e,l30),(0x6f161e6e,l33),(0x443360,l38),(-0x6f161e6e,l35),(0x6f161e6e,l37),(-0xe8c239,l34),(-0x6d5fb7ee,l43),(-0x148c8f6bd,l41),(0x28704f8,l46),(0x6f161e6e,l51),(0x962b3,l60),(0x1051919,l62),(-0x3272b04,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6f161e6e,l27),(0x6f161e6e,l29),(0x6f161e6e,l33),(-0x6f161e6e,l35),(0x6f161e6e,l37),(0x6f161e6e,l51),(-0xdad8590e,l25),(0xda75b09a,l14),(0x6e14c49e,l30),(-0x6d5fb7ee,l43),(0x1495b75a8,l15),(-0x148c8f6bd,l41),(-0x3272b04,l64),(0x28704f8,l46),(0x1051919,l62),(-0xe46eb7,l17),(0x443360,l38),(-0xe8c239,l34),(-0x280514,l10),(0x92527b,l4),(0x962b3,l60),(-0x8c115,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x170380e6010000000001c0520080000001700099008000000001e01480200000680981b8602000000000340720080000006c1c079804000000058004c804000000000b00e40103182302b00f240140000002a0e0518040000022084068c03000000098301c601000110460a02a400c00000002418198020000000d07028c020000000d0681c601000000024180630080000000012071004000000001a0148020001486812044801800f02106809c401000f81e04203c200800000000090188020000004414018601803085309808940100000003a0a051804000002a0c4068c03000000000c81c40100000006c180e30080000000054029004000018c120248c040000001084816601000000000440e200801703c0c603d20080000000000c0c801000000118700e601000000088540e300800000000440290040003915024089003000000078500c60100000000034062008000001c0a005980600560ec220159004000000068480e6010000000281405300800000000028190020000000001c0c80100000054180266018010c280440534010000000140a05980400000000090248020000008c2a01460180000004c2406300a841480840066a00c004d08c1200c9004002905409007a802001582405809d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x48380a601000000000140d2008000000004c029004000000000d024802000000000280c4010000000443c05300800002702200b1808000250982402d003000000003c012401800000000c80520081e41141680c6200a00001a8110050c04000000c8120186018000680410026301400000340880718060000001916014c020000000001606400800000000090320040000034168099806006116013014d0040000000c8b01660100000000054092008000005c188051806000000001901880200000d888481c801000000000b80720080000002e1c03980400841841e01590040000086110124602000000084780e30080000000447819802000000310902cc0200518c20c81568020000000a8540e30080000542a0c072004000000002103880200318881a00f4802002c4730a40ab4010000000320c031804000000290d028c0200001695038148010000000078d033004000000744a071804000000003a0148020002d8e46604a801800170a62a01a400c00000000520710040000001905028c02000000158b01c60100000b8a454054008000b85315015200600000002a2c0cc01000000048281a601000000000140920080000001d00099008000000003a01c802000000001f00a4010000000c8140530080000003216069804000000d844070c03000000000880e4010000e46413036400c000000001a06900400002e013004cc04,0x1700a40100000002a0013201000000000540390040000002e0903cc02000000000480e40100000002600132010000000004c039004000000320f01cc020000000e868146010000000320013201000000000120690040000000011018802], #[]⟩ def dynamicCode : Nat := ((((((((((0x3ca1d6e4fa3f770e0356c4a0d0fa739c401fb84df065d126c2bf49930aeceeb2804195bac8412aa3f1d03073ecf671ad3f6a192c0ee1fc30600bdeb1cf3d5917d5b47e890bd94c017f48185ab14fb138a8e3a28066bf77b1c80cf87c8938cfda9ff668a9894606fce31c4c359de90b87b124578a64e96ac9a2c65b492555f58f92de1b2506b1809caf934f31cb11142535298d9c69d698a3d4db2bc7d1cd106404d02e802382f8c3014681c15369784e05e2eed51800c8043860e5d07fce140002c103c376eac4d4e060346c954400000bb80f00203549498007802000023a701ddf0566000791ce2001700871800377e6ff1e19bc28cf444286006e732de061f206652e7c40205f6515eda200000249f0078005dbf520a6438013010000061480010390003ea3e5000344886a4930d3ffba204000160936d33c45c39d0610015497e9878e579ed8e602230638e807b02f7b9f20c082517d7f43c18e16767408377aa091011e534f2dd41400009e952163a35c5a5240001df41bac6ed4c3745077c42216a83822705c30a003b78cd6028400cae25a5c3080045780449809eb552744218106c5e4fc14083f8054ce4c0d0000b8b22380000061a80b21c109c08000036a422c140009f06ca5bdab871232eee0b276b38a9c0a7efc0240933524ca082e010b1454b797c604203d8c43811380326960d6c00eb8a040002c10083639036400007d053020e80400004d88450282240400049a70737c6371620c4fd44810094d3e58635d321240c7827a20128a0c804000039081e80f0a3409b8cb102313a5184c4324e0a0003a6c890006802163002b1fe3186beeaab8058800ac21cc6131346ec4882603d67f4183061e80d62060d43e75830c0081a3c040810206a2a4007c020000348704609fdbc383247040428300016081438752b2d2c0f2884380003d90b2820e006000042080882b481f548ccc100a185d284593cf00d086b9494102b866a949002c11324260c1a0080000859c32a6c17c091c0005820c180003e8090f465cceca0880d5250000be33cc8426101c00800008c9088110438680018d0f18e5c8ed20a14198c9e947146d01d0e89025a1e418860016cc0360500029cae20300ee9e06bc0006720200080000b210861184280e88000016081c40055eb3e104d5c831c01430101f09a0410143e09e3400397c89d26042000848a0123a48a2ec26908286dc8e5d8c0087aa172000d00428babb5fff02080dd8aeb9c0000017703000203549458000005822a003e0080000f6200039440e806108030830184100ec811f3880e1706dea7181397b52c305d095d4300072840e5001a008411a60c52148042470861220000017703c00203549470000005822a003e0080000f73a5800b65e6943801f9abc8e3e71a27ff103001ac656882033aa0880610016b5c50c012471ca0938210004000055cf0f6f6b8000000020312644d921b6d982003820940000000a63ddc59bb7c0a0708c2891861830c2045000002e100200d00017f30281df15a05169cacfec3081c9d0f22c0125e8a38400682d33909430740200001e8688000016082c700abd67c104d29e90f814300002ee00400086555b000044767ae00984080020000262404444000eda608b52e26c060c2f27a7d280a734198c201a169901c01190707c0200001b240844703000002c1091400abc6dc104677b167a0810318794a820cd53a2ae4b0000002ee0000587084011021f7801dd14072db4a220c00d1ca0668800b1baf64002120e10004000037c84090800092c8401080039c0d8c008bdf7830717e5e4fa580000020040000039fcb08481840010818049ae32460e2e110d5060004de3fac40000efe04409030800200001ae4044260fe0be3036a8623142ab984a0a0e29f2c4e700a121c35787940cbe785998c0638ec9300a00aabf1ff8004e304001000016020fc3b07d11d0b3291593c71443861880a1516b48241012036a9be101de63d4a000025201f00850af0b325c438a78d12e0c28475101a8e4802b84e11c3014edd267c2807259f13e00013101000400004e480012e10102103e0080018e483d84f862619bec6237037532d87310e141f62ef32ee27963fbb060a2051a199d505d5308bb979ca8040931f2d589586dbfd11a427c000025779422550dcebb939997f17bb76d7315e0dfb3a1c1f8dcd9385ec7d90751746eef6444f990f24fe2d2721c2d0780000c70e084ff0b67caac6046123a0ad12c4048eba99c5188304555b2186850600757d6f2dd50502f40936556a04010011a9ca4f0411408ca457e75085282c4d9bdd21bd073c2c030000114107a3503c86c1e0140ee0281b4dcb8575af0708e68badb90f860aec077463ee050864cd49284a88004cd925200a8701ebe6e73c70c5003592fab51bc414f42e7d4404a40c4ab2e6a01aaa472c2c03040e2fcb5a957640d23bbbda2c034a0f431bc218208000a6f53a82440000034bc02c2079250f2bf2c107a1374c6d1011ffece56ec380a70171fccc364821400e206801d7590a69a2aff64ec1c5d131dbfa869601057ac29c54d7f1d54c69419c9098c140003ad92c44e084401000016630) <<< 16000) + 0x39747082580934a119b65b1fac71c0031469944244000003e4180b082ba8b29bb110202351e9e168d0598292a0e6a201048287024c0e030acf18f452ff48015012305223195d7439007b4830545038e2ce28d28b08d04804a006032000200d0000ee20ec0a00032d37e9c19ecc1140ec07c4f34d28c24d0c80c808704d030000200dd2a639873b2349868241a3cc2438600e2a34309fddc048900012209b8080002d2fea41002539d59a9c00880200002c640f4140cc020002753647f8040fec298380000927c0163ffb447933614383847611001608167dea84f94002c64513710a000176d4730086438814010000066ce15a9b2484c4931f0e1e1850d51082d6040a1248d0f230a8d8ad5926004fa8fc123005f1a5fb0004e284001000015f3c3dbdaec126e59dcb65248c82112c92462451442010c12801c0101c0c0080340003ecf0f6f6bb049b96772d9492320844910810710a0c50c704a004176a5e59b287d3800da50f25abc2ddf9899cbcb0971c5e0fa8000c610280581382f87b7b5d824dcb3b96ca4919042248e38838630620408248020a446e3c920006e5551e6e9064e83bcab68dd2787710adca18c44a00033a400449483a8ee06016c1f580a1292916db6302000017700a0fb120c7d230154f0b1b00a001111d5e0a2ab770a103f075bc9bc702cc684401000019220e8730733583914c1c4660502ba13c62403ce3f825430fd94ff435c0664995a1600000000000000d0481051040c800700500001412f7c2d216ffb8d30fb076942c735367242943d4cf04f17560dc047a319ace3597792530f60672d7f14be6ed12725bb8b7a79b47cf82f9554f308df16dcf8695677c2a57d1819123c71b228050af6a408cfc8d66ae216f777924681955f7d29959ddc903c85210e14534810ab02b4f6bbe9c6cf5ee03868d414a58fd3ef78638de919982f7a4666935c21264e3edd772668d69203cd0b5c60655fcac5de73f0422a0c2b02156430aa0fb36f3f9ab33e848ba2f464cbd535292819fecb3778cef8ac9d1e6b7a802ab871bcef5d2f21151507a3ae9e95f24180fc3fc080ff5a074c842a29bbe904e29bdf31623f84a81d49e2b6c0fb7366c4246a0cedd2146bde51571428322059ca7b3dd8106047c45716faab8b7d3942f16896c7cc06903474f398b0d843e47b10157410053296c718b509d16054c8a3a774dbdff3b83273f3ee0a2943c9397f543fd4467686240000000000000000043305223195d7439007b4830554814908c0070299e9f5856fe92fc4649a3b3c5f038af9db3990291f4e5466c82cd10dc4071aca79be1cc80876a8596cdc7f254b0a88def3ba3f62f875d61c280dc4ca06f128a5d27b191da9ef625c8affd014c920a000a9460100200800002238300c415748c9d4e49f691b06fc92d749add18c59c6b7b462b45a71b9224b3f3afc826923966bdcd40efcc44c499b53400243bdd55dc3c6eca271c6516fc348f195694582dfcf5fd3609a71201b49d94ce830ab04b5ddf73b7647a65cfb07000af2bc75faa2b589954f17051620330294953009854d3f762032916c9e81aa3442535882b4e3e0d1ef7a8a7b5ac920287c2aacaba7d4c94acb891078dedf5767e95c03a1df8b4151f3684f52b70b8b15d00d308e8b4b49d5a41cabaa082a25ecf6cb248d2e2fe23e236326acc446cc0a9364f74d651fea24e42dd90b262246b914a6dbecacace24c8c35c1580000ec068713f062d102010ffb9300092828b08089ee893409040700200001926c8b07a16a440e0a4e8c9c80c2621f2c9605764faeb280b3c2f5be3805f1e0478400c109b3680b38a0f80400005608380cc1bc560dc2a06d0d83604c1ac060d403a080a9b5cc0617eeb5b170c0077107a2811880f80434305973f2c3841072b3bc30a56d32c71200048eb850807d25d16e812880f804000040080884e482924584e307164d649b2430eab3ee718303dafda8181411937c6200b9399e3800598608002000026a41a4760d03303d0d83384c19807008010046891f85fc048109bdb481a0a37dc880d005e9a6a458000930ed940074021000010040000111d124e4e86e48221713ee3000102cc48e00ce7560e4001d0084000040100000444000408800124180200802303f9c19261426ad345a2c029c41a38c00700210000100400001110000d620380b00012820740bb04615e2ca02f47170401d5182423081800860ddf16822102a00800004320221a0650900008c90100983202e492015986814200bf66e70a041d454cca30005483f5410034e533508205de3a87250026182100801082818c040002ca4188960c22380c0080230c77f2149284e157fb52803db1783009880e002200002008e04595d0538706fbcb6708d00241ff7a47010b54af1e400200080000689e3815c202c1c07ecda74962041f00800003c9b011079c92140abd3e6a422081e00800003c906009000125980a0080200000888001a1901011d1429b180542c503a7eb1e901002e2313420b244a928c2828a98143e040058930a024c104201005f01d8b035c88c48082b384fb8a0b94fa6e92003f047a4838004ce9e50094307c0200001fc41783403c1a0210502e808000ad482e0e816c74000d1e400363c80089e90280981382eb8b7d55c5be9ca178b44b63e6034851f286dcdc058dfc61742317c71c5f0ed19d8f03fe1a7047fe728160000000000000007260a44632bae87200f69060aa0c10a08c0040000229815d9663f16e20a27fd569668ee0629bd51158a8a8f3b8dde55d7010f5fa160b6df7985ba)) <<< 16000) + 0x1c152259e81e13af46140bcceab90d2f2e1d71ed75b2629f18aba104d6d5137192f231c5855fbb9a3c2e7e7a6a9424a3b264cd5e890348143cfd37ec80b5701f72afed50b35b6e49a9dd93c0ba3c56a0eeab0761ed7541ed5cbd0c96f47402837c18038295f6453e049b5a846e3b6e36ed7c8aceadeaff1cef85e718e4f2214133df22bfe0eb80800d7094173533469ede391555b88b9e8ab5e1790ec67be610880bd42dc3333ffb0dccb055000004af5c912ae8f546786d0773a228ef0a157fd9f3386128a826f9eb59078d713dfa57121f00172e5b163f4b499857f888e58d011100e29e593cc5e847e7fa775e930796a80a083e9dbecbf7ac6202fd4bcd14f777643c90c61d15db7b39cf456bbc190f08ddd0d315a1b8335214084030040118400269d8f8e3c685250904002a78bd1246104001005a0100005f10590d81184c160260ae0bb1c2db94e09e009a84639040bcf7ffca80046383e0100560900006290552582a08ecbc8b1fa7a2c7095f809c20105fa274918005023db049020800200a603806008020000088829068144340a01a04f0d02702813404098020001ba324996694cc1809f7f00ce0002011180f804000023c80026c1e38a53cf1fd71c0f34d9c0848595723d0a38890b9884a1843863815ea7f91b498b60429d67f7d3778875b1c3be3ab1f28c02644232a81baaf52ffb108e9cfca587b14c45432a1377410021d6347a0bc0c2edb9db3a1026778afa5b13aa1b6ffe28000a80d701057031bc31e0593f04ccfd515f6ef72ec90ce3490713cf15a26530b7188a27077c8b56eaf5626ff03b78b4f54286d5f071c580d7e4b28104220625fe16e9921c5b13000015188008ac10016b22007cf865c6dfc18268ac3a685762a84f9b812f1bff6035e1f645a40000000000000000082a11ff5bea6ce192b8e5fafb78000000001097395daf9d49a4f65eafd7a4189099b71bea5641e10292ae9400000000000000000000000000000000000000000000000000c66206300280080202a9918bf1d040804459f94e175589710175238c6595abba73a1de1a8885d5e4e06708994cb1db6dd3ce44a2b71617f501160f40504a07faa4780a748291367a225c10b9340f06b2d5259fa5cd316dfad10ba2b22cbcc421df8c3f83318dcce05f5deda084836d604a58302dbdc433c7d8c44ad6dec22e3fcf40950989b74fa8a40f661ffd14cb4250e20920c91ae8eb3043f757e7dfbe93970bdf9224cfb01400219080254e90060443015c2da8841425682f9a210340341628602ac9bf7e080639ee7520806f01e82400004c483e010c19e833e8f0c2d8d95658102f4e8e2084006f99690800120e0f80424303786e3e0c28bbc62c708101b08da95023142000801602812c040001b24070540003c640706609403810976286dc60c5386135040426ede5d870208f147085014de3838030006935a54014098908002100c0100471d446e2e5c340b2802dc181dd01c480000323b682460018e39458830c04f3066fa1c6088e869dfae98410265323cb0708100a669da990000a7a4d38d082484801581601240609003f3ebd6b54bc0616000009c401c7051b967e50e19229257cb030c1b4d1045018203fa33c9808100ad0a057020ad0f909518a00015a2f91349002501402380f4c000011940020862efa9254820468364c4968104215160f3082c200e99422bc10206730c806c082f99342e1b13000033ed88f8000505c3fbc67902400a00a103000002ddfc1a600301532b02c800902d489041087f1e23b188112003e61150820bab34a4c010204d0ab8dca1055c8b7a9bc0000de357ee19644801381000007cc800205900061820010ec600802008e3b9fa9417ec11230032b2a6b2d18601dddfd633c48600001580e2060c6ee91e65d28618fccfc4ae721c20043b60045c100578cecd935c002771e6b79dd7d09002b02c71d65c5b52147066eb4c141a486015a34732306b30740ea8704b2563996238402b47c6e410408b96f24808002b431d9c001e2b8672854900240140000ea1000408208c1301c09800237903d01e1a02f2682f090c081c5e80c60dfaa133a1430c538eec260904081c4af8c6067805c9328204131543b04700056863b38000e4dd9a54a920048028c34bcef513316283004398fbce4186235744ad03080804c093edc08c088a507d57e8240010e54e80e03003ef7deb056c30009e05766c18001567f42a8b8fa12005605800021820220204501402004011c722d73a834da38a45d5946bff0a1000966451b004104129c505031c100254c50a4028201788148c80800012cec6b8004000c8fe8b3a0000adea3755981a048015814011007041bdff230b103423870b050a28b956de2208207e567a390a1000004e201608103895f1900c4f750b3c12000ad0c7670001495e305f5240090051045428140bd16301038984e90315da4b8de9420000024b308219a46da0f12180ad0cc210618cfe19bff1001d7d29c6a000041ae599852400900500003a84000f0c80030510006473a4800b8e56100814019f3abc8028b8c9cb526bf2420017146a400a09b754304120104e18df4f180280329863e57304001e18d41540000aeeaa5c45e409002902869200000eae145863d696c10180cfa04c450d4f27cd6a2825e5d5aa30c10691693e020990fc5e186000453762c0002a65af64a4008402000036c4044140860a0420500020b103e0d00076c104119c000040118635f60e051841189a6e1abc605e7fa862cc1820056ab857980a42e9d5fb45040000370c8102)) <<< 16000) + 0x3747722a504110faa41d508000568f8dca92004a0280001dd20800b0110581f82c0f81607a0391404e4148061002e22f884134aac6468c00072bad88a0000003ab89000177a8dd409850800218280001605122809c7b390c2001b6fdb0826f3bad0a0818081ac2c08000fc586da8130a1000400004cc800140903c0900029a10021a920503391441bcb21121a15c915018304ae43344821a2b82e470176dcd528c002dc8fe1140cee48166002b3900f80438f9f5275c2840000b02941265821249048a68e983820002ee00000a2ca58002130e0e804246399e82c90419568a101b8ce7786019c7a584240c1a008400482a8441dc37e80000000041940d70416305dede0a000002e4900a6faed46077def793da7b4e6f294d824a645b242d470000000000000000000000000000000000000000000a86608482402202581ec78d4203402a038030002c720762303a0dc8db650a87047e6361000fc87b18028bfa22050505c011c40000160534108a68e9870105e47918b001872222000003e82240c1f00879205433d8c38205d9406e06082a130ad0f0304929492380aebb9769000013881514208405112c6a79863021a98e050077e804a381000bb80903f9737494006802100b39fe51451040000b029004114d1d30e040000bb81000912b163e5002000800007f1815df8f7e3c345198791020c80400001b880014110003c73a3d5b68b183ace80b1439908dc8e04e3499a12060c00400e42400019840016ec8003461000a72200176240e03406e0a000d54200610640d88600602a20130ae6f0a11eeaa3670a0cae5673a8a0019e8abd0481040010a2018cb1cdd960783423588ad1edfdfc14ae2df7c5099bc5253e21d03cff37adb00223a5b1178c8564283ecc942045d888d3cea0522f7d527228c756cf9080027a9d2899d729269667667f32e8d06d17c361820065f135803d13bdc7c8c696c9ccfdd5ce8e80540043bb914657b1a976ec905ff172486a90a0fd69bcab4232582166b5879eaa6103ffa504991ec01a80800120881a06c07826066130190981902c0c40783d800a8c040883797a50c2ac6e893c607241789428000218ad4500013b878000261c1e00840b9d5a9468c2098593f42898c38637901f016c7c4500174ddc10e00081e624004c283c01091c00d454b246e3b6ee70616b909cc5244b541c495424101e00848dad25e1b8e2823e731430b9aec1e6922634bc5cc40003d9dc8004a203c0100000fb20003ce6440b6659f0e26a58542840f0d6f106385aac2d6104004315e68005460740100001f240010f4c06019aded43065cd515c21844ad3e41820202c1b32c183699699baca084001003001e142e49c430101dcda2a2fd1422f01a9d8c184a972adddc40613ee2b7c860c3796ae131c0033b2828c2800df541004290104602800019f205e1202e090168480b0140560200033720011a840a874052330280181380f087396435a5057b69b83c80980811338e00335b194040047aac1204a183e010c20459320e8a287c0b39c202d1c42d2810036b22c2524081f00801300800039881284ec70bad67ee2012567b19d1c16f3a0f942c00b5eb1f4040a9fa8b69409440800200320a00011a2048330231581106c084360401380c0080238f38bbef4240090c1d98044203a0109256f696f848115cf8f70c015df3eab1820e80428aa32824718002ffe67e2001d00840000401000004440002c080f84e08879547c140030636c85006c44422046183a0100000a22000476602802008000022200061a40784603a238040080220003bb6ec4037a635e09040d00200001c080e06c06c1701401004000011101a1500c828060040002a64044740009ee70a0914407238830ec9b1250645169b5c5021a1a08922827f4d30043800cbf4df6181881f41c400b38c1000438400b80d0e103142d56f400110c10004000021080b8c80584402a12014050098280009a0c8e1d8264b848c9431b4a630c6d4a602c48a0c17d7363814d5dfb5c30108e1b2a82801b2716ae02ce28400109118f70509011b6a8221c01e231322001e30ecc2028378c0004a203601080600802201002008c1e4edf5a50e4ecf2b34047a1d80c012a4789901064021000010046927d7b626918af966590c483722827a41a0280abe91f2800c004000035480008910001e4200044240009788001b29012150088680403601e1200e0500682803004000ae440043508010109838d104b4237898b123f2d79e1ad4325f668da0bee11d800000000000000000000000000000000000000000000016c450c6086045044043002000570278a04b231e38d80e8ce08bdff780251eb4a8cb03c8151f6afc16e4a1667e2bfefb4bb5c13b904ea6e7331b741b9258e4d771cd82e2e12f7ded91d8305b55fb706414206cd12e48020baf88eac985016fdd579462000d9a087d00c014a1bb2bf00ad1c60940510463a0fc4387169d76f44020821a5167c1c38e8d7ed18c1b8de989f88004cc1bdf6280282326690c0110eea6d80140a1080420888903e7361030211277dcc81092ecfe62a18605cc352ea10200570f35a1200193a280f07000313199b830000ae1b7d401a0409402145042158daf8927a480751cc50e003e815a528501ce632ec122937be0530450000693dd8804c184a010a1c0aefedb248ed6fdb40f28502b4d4c59206db6cd4d480000002ee0054308401000020e40009bc80021d90005e92000f14402c740142a0090d00404801c2400c0a00501002008002f688018880083400202000010030551)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 23 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case4" = "QuadFull27Case4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 23 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case4 private def zz2111:"s083f"="s083f":=by decide+kernel end section namespace Green24Proof.QuadFull27Case5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x146954882, -0xde2c256c, -0x14d424545,0x82d8ac4], ![-0xde2c256c, -0x3e11fc1bd,0xc751ec,0x144198f78], ![-0x14d424545,0xc751ec, -0x5a340ef48,0xde2c544c], ![0x82d8ac4,0x144198f78,0xde2c544c, -0x6f161e6e]] noncomputable def hinges:Hinges:=[(-0x8c115,l6),(0x92527b,l4),(-0x280514,l10),(0xde6c7a30,l14),(0x142ad5b89,l15),(-0x6f161e6e,l27),(0x6f161e6e,l29),(-0xde3d013e,l25),(0x6f8f7dbc,l30),(0x6f161e6e,l33),(0x443360,l38),(-0x6f161e6e,l35),(0x6f161e6e,l37),(-0xe8c239,l34),(-0x6e89c95c,l43),(-0x142a375e5,l41),(-0x98db74,l46),(0x6f161e6e,l51),(0x962b3,l60),(0x22e6e7,l62),(-0x88d06c,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6f161e6e,l27),(0x6f161e6e,l29),(0x6f161e6e,l33),(-0x6f161e6e,l35),(0x6f161e6e,l37),(0x6f161e6e,l51),(0xde6c7a30,l14),(-0xde3d013e,l25),(0x6f8f7dbc,l30),(-0x6e89c95c,l43),(0x142ad5b89,l15),(-0x142a375e5,l41),(-0x98db74,l46),(-0x88d06c,l64),(0x443360,l38),(-0xe8c239,l34),(-0x280514,l10),(0x92527b,l4),(0x22e6e7,l62),(0x962b3,l60),(-0x8c115,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xf0481e60100000000024072008000000006c029004000000078004c80400000002c00264020000000005807200818c118158079200a0000001507028c02000001104203460180000004c180e300800088230501520060000000120c0cc010000006c22048601800000220b024300c01081182a0642008000000151301cc020000000d0681c60100000000068052008000000120c03180400000000090388020001486812044801800f02106809c401000f81e04203c20080000000009018802000000441401860180308530980894010000000000e0290040000001d05028c020000015062034601800000000640e2008000000360c071804000018c120248c040000004c12048601800000000440e200801703c0c603d20080000000000c0c801000000118700e601000000088540e300800000000440290040003915024089003000000078500c601000000381400b300c000000001a03100400560ec220159004000000068480e601000000028140530080000015060099806000000000140c8010000000000e064008010c280440534010000000140a05980400000000090248020000008c2a014601d0829010800cd40180000002612031804004d08c1200c9004002905409007a802001582405809d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x9c08802c602000094260900b400c00000000f0049006000000002e0148020000000540026402000000000a80720081e41141680c6200a00001a8110050c04000000c812018601800000681100e300c00000000220690040000001916014c020000000001606400801845804c0534010000000322c05980400000000150248020000017062014601800000000640620080000362212072004000000002e01c802000000148281c60100000005c3807300801083083c02b2008000000130a038c020000086110124602000000084780e30080000006a120598040000002d05038c02000000150a81c601000000000a80520080000542a0c072004000000002103880200318881a00f4802002c4730a40ab4010000000320c031804000000290d028c020000169503814801000000078640e300800000003c68198020000003a25038c02005b0e43581be802000170a62a01a400c00005c522a02a004000000002903880200000000012064008000000ac580e3008000b85315015200600000002a2c0cc01000000000481a401000000024140d3008000000000a04900400002a02800e4c0400001441100726020000000b8380f3008000000001a069004000000a024030c03000000000580a401000002304404c3010000000001a039004000000220f01cc02000000044002640200000000078052008000001c0480618060073188210139004,0x321203cc02000000128481c601000003404c0dc3010000000004c0390040000002111028c02000000000880e401000000480900c300c00000000220310040000000907014c02000000000281a40100000000034092008000000000a031004000000110f014c02], #[]⟩ def dynamicCode : Nat := ((((((((((0x40b016a14e6961d2ffb0608338c571608484a5a080ab797692800d80420597d1b534b5352005833531fa30017008000045908c05f18f427b4704787b8c18339ebcb1800c00438700016051c289de3e54f0ee0a96de7028ba8d2144000017701e0063a8f626001d00800008b9a1d3ed6c38299bbb0602e43e80200070f5c8002e010f0ec6cbda83c201054818d04000075720103df93f91000002ee03c0053582026001e00800008e90001e4200077c422c17850018d95e5c4640b044c86ceea00dcffe9b8d670c041cab4a5590afeb2109688919e328cbccddfb7c302094a468b293b7d3b40e175ccee6b863956441c041a6aac26f08003d959ddeb489559d58214a517f140000c54d4643aa645dfa6d27bd28567586fdda3c000a955760dead88db57f297d95f476092eb9112bc51d4c5a8e3b60fa8523a1c22dee508991e4696011422946841f5dbae2584037c499810535d9c924580000ba4ce3000000581b300100042359a457214bb5303c070412800000005fb423c6d388af40e91a58c19a10e10412001c05c000401a00027a403c0600052c41f024000e686c9f5026a7023c70a4902b035da46102e010b240005814b1450eb44cc1063a8f60b06f771c945046fe735810632b34980003e8226081c008000098907b0903d008000810d936f5ca2729353f52d698747c46e66df021506e9c36b31b041d8cd8a085898237b053164e7f7fb3f15496cd328eb935c9f2ef16875377f0a1598a1fe28d6b4c19719a2944cd9ad7fbb4811b4092581337153722407a8746b4a97467174cfe6be6252460a6a8569c2ef8a77684376e42c2daab0a2e016911e3c9541368476ffa487531c8428634bac96e2b8e5f5d0e416c64f7041047fc33753821a2b0d1a17b7988811a65e8d2fdb62518210dddb1c491954e3064bee7c3044656c4a002e0108ea712800000004a3f2e1b900923a40f81c104a000000017ed08f1b4e22bd03a050150000052b3eace3660a99a59820e20c1860a0058000401a00039670a9b9cbd84dd33138723d0f06599e46831a2eac6074dd26647bb8ca7dabe2f8c181bae43193de72c3d4d59155337abe971f94d22452a7f51919fe0acdcdea92c314aeb42e89eb8ebe51761551d08690e3dabb7a72eec76118e85bbb402490460d6e8a82a3cf8c131cb65f92a81819c78ab782ec9f94051583965b0ec2702911a465249df62326d5b4c66f408fb5235e2be727991b487440e685fe4c3ce8f8a8e5fa162ef699580772c0ab80649fea204849a40bce7014d1c9404f23700002f390008b8361a55f5c41a09b7dd379208000b029a0105189c14076c9d7c0001ec74394307003000021842283408a0a000f533038003f4fd5a92c170a2ea128c22f2d934b8a6092a28e58a000b3b424984930d1d4c80654c437ca22d8786def010163e84cff02d94fe2937205de1b42a03d0a0a51238b24831e8c5e6ea5820a4d6b02cd66c7e09a92b8caff28e416065e5482ef8da8c77fe0a26f392d8ebb9cf43e8d7fd60200b297ba6fcd675a8d252c60d803f5698fb9d0afa87570087c192959be1e45aec214ed2318427fdb28e5512400013dcf18783869a8a140aa228c87144b16401870c789a0dc89029299b3ac6000971d0c0300d86271300016720200080000b2108901d920000b02982874d63d840a0213c3a0a2e87ac1e4488031e60f020ef5d6e1010004985ad13820f004346c71d71246301f5428534a6c11026682272800589999400600211acd22b90a5da981e32a0039a29102c8d18918618714208a04f02e000200d0000f520003ca42200610e0308601d880171aa388cf150e200588245be11a0209109b8b622d6cc101806a65d3550a18600000055fd763f314009ed880f69d91000149fed4584a9578011b1c511c715005db9629c50d819000048c6c90000581450c0213c3a0a0d4e9f783061d8d1db8c10200005dc0480616c55f40026181f0080000979924ca299ba860431da7118305175179d4a027ca815ec600323188cc4013758040400098708002000026e68800000b02963800002ee09140084e1481043537122124112d64d9c820c498b8418002c30420088183893cbc2809e7b26dc601e2ff08a10085de1ac80028303c0080000d4209e3a00023e210a32000af3342893220ac10000f67d950090a0f80202100742a770eebd102d34d3dc18a107d8f14d940af7c7fcb0c05b9ebb310a02df27b480004c304001000013521063ba15b83c58d8e28918c9fd142b387e3382023616d500203865bed5800128e0f80428569ed1770205b845009c1420201ab7724006a8179c180a9e50c9f140743adbfc000261c2000800009b9000258201e320820100024b108109f0c19a09b77845095aa7ac96b3c10c2550cc22c1c2493f05fc5634a196704f2c99d2b378ec32a505081de223bd6604e811d00fd3661209524b888c1024f62bdb675ad3d1c62efb3e5b593b91451810204573603e6021c06e762cb0898e7db6571d3a80000072ea7919cd861adb38f9bdb8132fe39d52b128a3a728ebd8cc869616f333e2fd915e8bd1fe2851579ccfbaa1e56bb6d7372bf2429a490e60001394e0854209e28e8c6045d89639c82c40495c5456e12830453b469c0f9060075e13640490502f3d0626d860400fb1d8279ab050401c5c) <<< 16000) + 0x8d990c214a4a1a71e5486f41ce0b00c000044c4200b40fe1307e0503e80a06d37c50c09d41c238616496e06182bc18d773cf0142183b65de65220012cb1c558c21c07ca9ba484531400c3777777f3141361cf7c1df290317167063ceaa91cb0b00c11acd22b90a5da981e13cd3cc3091c720328228134030080200df3000e6760834aa359c7b54d26697d5ddd3090c3b67348a08003fa92624000758042098108802000026e41d4171acd22b90a5da981e13cd3091862032820c21c134030080200df34020135ace299a54e11347934e4349a9271eecdfb86122e235badb4dca0846663bfbd87980bdcd84c991e41c103295e759c3c48000a77598ea0850000d440b13e112a0a410bc0f000048641f0240006806359a457214bb5303c271861259028a60438430260060100401b84cc34b3b6661111441fcd9640785cad5e60411b69b879000037e43ac0801012015193021100400004dc83d8481e80400049270ae1c29ca250cb52ead808148d4653e0c2d5a998d230096695756300fcd62c240098507c02000025a64f948f54d5cffe6de71250c1009649231228a21008609400e0020e0600401a0001f264f948f54d5cffe6de71250c1009221020e21418a18e0940020d1fb63b3941a561a4db2f839a9b12cb8c915eeacb8e2f87f400063081402c09c0727ca47aa6ae7ff36f389286080491c71070c60c408104300504e0bf2494fdafaab5055ba0273dca0fc21a0002a8400363c83c8cf060000119402060622281302847ffe3e2362836d06b1ee2300e4d8d89cc280126689cd0a8a9afb9c6fcc2f1cd951b02e6342400c0000d190783983b98c1d8660502bdfdec382a1e7b7170e803828a066d83fd57e9180b7caf27fdc03f239aae9e3a098684b09b864136d7638000000000000000e4c81051080070050010014e50034482d1357d1b76c060107303d12e68823ed15cae7be65c9850bfbe0c7c6cc2ff4412488df3c5ab6b79e7caef13f37bf33276a80a3d75458f807c3f681409a113bb07397ac2a58817fe6d02a06a16f7ca777d99248252b0a204938440352a13100e0d0e4a002a01080000802000008883a80f890323b60c24705d712c03a42be800260f46e490206802000017a601802008000022343a0f4dd8c001a2754380ccaa9508096aec4804820320100000bd3645007898b204042772dc4061bb0453cb02c64f04294057713fd41c03090a278200586a4468019c507c0200002b041d0660e6230531103902c1c4060e003c08003c52b020629eca384002218200084900ef4b10860e360a7b184864fb774263061289892030283aad0fe40165c25e2c00130c1000400004d48378ec1b8560da0b06c01c05004011c2043d0e28210f438402dd5cfc6002e0100100160299417f1001900460b2dcb0c0a1e8734043d0f1800980400001f480006e1a0c00035e4a080193b0cc00007ea283034288ac89010700200d60a0000d820201a06a05000159100f0583480ec50024506f1418e270dd2081206d40ea08c208002162be3019de5039133643840847d21f03803bee0cd0502078010000198418c340c41a0680900f04819c140003f24198970100100469ab04b637162f051a64060314f1c729601b536d9e12040f004200002008e38329581610331b0b70634295daacde60034e9f2b24001f00800006690650100008f98000080234d02679a5838b4eba8b0cd061fb128516011e169f990007c02000019a40c8040c80200013420006ac605943d48a2c0368c8c99000b5e4cd820307eb31e0050507401000019a403c2745057b2fb60b1400ae3a70204007d0353082fa2205b30a0a0322a3a25002100800e00c11c0762b697fc8d2020bde8f2a28303737b30800d0fb8a4048103e0100000d120c6120620900f048184140004d84180540be2a000741200193c4003b8881404c09c07c2dd844e42ad045bece4015472e5736af959d5308ea887853ac47d44fd69b28c101c4d59a200000000000000000110c5327d687bc0b31c31820821c00c000004380ca78fc49e3bff6c687b5f0290563d577ac4bccb490b789e6074e4555d78fd136dad904044c2491b6d563a79804a4331b2a36579565695ec8f06835a0fb76fd52680138ebe546d22e966ca68173d1a0e37534e3312c806a0adeaa1e84e6879faa2829b996aaeb7adcc8c41fd395c008e6f31802666df6d1e14a15f0f252ac9a4f0d4b5393a1db3cf672d15424e578a00a2439be87facece9be810b0bf7aa7187a9343b731e016eea366944400145cf147d5376c807608eb5dc80879741073dc4fde3a157a40acfc00008487ec93a60c9e5be737a15410011a37bf6bb1e5bea86ac22a22c35ac5a4d323bca3858c9bda122a8c3708a0b15a85e7b71ce790c364ba100c010044000040100200205e0101280800018482e84c088160b80b05b01c0500401184453de02438f81a7f4a14026a8a29a0046283c0100000a920b43205919000088105825c000040100ae0302501d9757848d4cb1c0b2d5850c3024189fa240116c87c414081f00400006810560902a848150240a6120520902882814004000394649590c50886816fa807e4601c9656570000011960f80400002e08002751000a633438c9550b67d81fc7aa700fd27576967b6f2893dc27db0728100304189782921b1a1cd931a51d30e1b2583a691c058e217588fe00a04df4d9d5c74a97a4b09987f4ae9e3832d49633ef46c074c2800802a054895fd85bb10a96c5efe155c6ef2034c6d1f9a7c40600000086ec3df4daf8b8338f75ad4272042f38c95)) <<< 16000) + 0x6dcd1f6d51f4c75f1af79171357d8108744b8ffe783bfe4d0e39787c9960e89cddc64f3dc6b1dc1e53bc99fb1959be89dabb53223552021c6315000016dc800a81100293a30fcbd5f8d4fd0288fd24c5782fa3e94e2feb26ad2e3e8ff6000000000000000004214e588712870d683fe54f97f145041abbbed9df800000000000000d54c3ad8210675f987dd354de6a1547f50a9b93a5f1a48a86000000000000000000000000000000000000000000000000060310318014004014040197df2b5a29010e87f0a8f05d8c3dba138a5f02285a54e13f37320e3dda4c1c6930961c9fd98ba0b6df7060b782ffad32323ab0c7949c657d4e57c4ffe158fba7129357cdabb7739f137f17effc3b4a33080e518917bb5bb2f446eb4f0fa9b9132d8c432fa4b4a23379fb333e1be62c4a05e49c9bc18b95bfdb6fcbbe505a7e32c5c7f22faecf862f8fea06cb9dd29ae8db8e2f8e939eefb572fede05fb6e61aa291c525b3b445bf68280048510036ec20091f26024f8fa8ac1422a42812f0815123bf8c1808dca4ad010040fb7205080523f667900009880800218316d7c136185e9381994204e5c6ddc080266bc2be00090607c0212180270384861449e721e040803995bda118610004013c2405c1204e05000075101c0d0000f9101c1182680e45237f9f56243088981651830284fff11c092a77862140070302b80000a90100022ca000abca4100918004003f8c01860d21f14a4ccb0ce90c5ca24028300000420f0030cd697990fc0041f9f1af06a006019b14fef6ef00013100239e6f6048015016246000d0cf8298861889035fcc0b60c324716fe80798908000035c23500c207109c9008381067ecab2c11301c00008d7ba9e30100fd4818e6f5b0002ef3de1fc5727104801701e00008e082602c12c07858001f688b600e393fac47a8f39620001ef649600821e488512fb01410008ab345a00417c45f8a57b00e011374312b0184020c383fff500001b6388e6697f502400b00d104177ca8585bdc506001e48fcbcd070c6f09471d7e6961000508471d880c22abf4c56fe901059be6fde95f904045534e87d566900000f28a173680001e7e0b6569390f212005e08000024120940bc2c00002710070caa8a33eac30c8174ddaf87082e9557000308b8209c41c20b6b9c15b90a0400d57e18c800008e78c38000aab78ef0a920048028c2c0007da22d80e3cc1041e2d542c40001ef649603861c5265ac8b030c486dc33e421410004559a2d01c0194ed603f701001799e62f39c00088f4ff15a97509002b02c00010c90100180020e90008cd3451dbef897cc0a20003b460c4050cad34c95ee23040001e2edc92410000ee98e88408177a5c81c81041f7a417c9010003df8210f8000a77783166c6448014810007c0603802e3e08c39ca060b0c0000130b001863e9f4bf89e282004e1279830e161374b60e14704ae18a9ceac202126d58f1a920000341e7ece0002a59c3e5f4ba89002902871e6c7c03134c122000fa3b36b12c30006f5f73a41862598cfdcf787044171227d88140000de46adf01c0216b72edba81800798fe0f52c000a9c6d5db1e7d09002b02c00010c1e39d532c0290e2bf79b4d310820b6fa68bb0618b82a0498141001ab36c98e14ad91e97f900800004e201000011d1897000116e9bdb45240090051c7aee6166b428500356242d1c52ad8205c524400000496610438552da862010023a3aa20411907b69081c03c6885ecd00003eb34146a4801200a000074c8001e09000814208e02000a7138400000420f00920001c96b300388001556a840104cc1be6f6a28809b9fc0a3fe0104d637f20e802002f42d2ee9904000e29b81cc0000b41082f3f6409002902861000000eae1048b86ed6b0e10015599644094f1c8b7e202623889cf0412f9aa791180012cf3bac5000071fd0c0002743b172a4008402000036c40701408a02044010218080010ac8248ae4800065cd308250ff2f8a840c004bdec828200000eae08194d3f93c8208bf3dabe04000326436e08048db074c0000086620052004201000f0182400c11c07864c92e7d209282000396f750061019fbaa490c2082f08820e8250200073e72600c10a3ec411cc040972872273a0106d8e55ab000300004068a7a0902400a40a100001004000011104601f1cddba4c3a205000c82d2c70800a957ce2010001d90a850412ee3e80101000751a7810762685fd41c0000c771ac20000073820a40088021000010040000111e3ddd4e577ca408100045e355e28208a8a0cfc85c01030026934bca58e0fef4ac9f9b64300001798128b8100005c9d732409c40e005a0788000080200000888000fc900040f2000d0040704745c0ea96a0723eff41422b85f218766f7cd08228419c71b7191d82810019295aa80339314100190a6d8560ce3040000009af6203acba8e61d6b001e03a288000468f5ea3470000094a1c2050009d1354f1458693868f2a14225daa8b3d008222e028e6d80c1000ae4454a14002ebe4e5a408002a5298dc8d8900280200000fd9802008020000088822808110040860200047d208422000d52200539240a047229d75dd1712180f7d85e8c181a5edb5920820b027e8e051edc6c30c0021b1f8e8a01bd60cb1000b38e1000428700555aa10040e00005c550080c25cb29360061f3d94893802010959a9e5d03820000160500307788ab7d00020ec6da17c9b000025cb9029b20480138140040060820304001e8e001605287000bb81809c738b0a03998774480832010a180039fc1500c3)) <<< 16000) + 0x73629b7100284000e5bdd40309be006ec8a04136c606ca928c1819f3128181030373d3a4fe1860054730eb410002035ec304812004e0508000080200000888001189918f45e40914c84a7cc11024b7890a352898a00e286a080107e62526081800800007e900041b207e2303e0de0c005814b078e716120802ee0240de0c9a048182e010e200047988a1000f258381e6e77803021a69004d00377b921600002ee098006c02100001004000011103d05f0000b029a071ce2c58000bb8130416004401004010000044400031480011e98140288fb747988374053172cf36f403d22d69d2638ff2a36a1efb73032cac066c5dda9900baf7201491367c7a7c9644ee839a286940e9cf501fda88e8fc04d54a50cb78268734260dbf37dd283b8cfda06a5c5b3937bfed1716930865154ccc1fc1dd9aa75d140e064c1342333230b3e28202924e361827b722da796bea5d4a5d2c66e046e08d4302a0d7e39680e5b414624c79f294306e870a253eaf75e49d9d211661fb4c10a893b4608b30ccce0c65955c2e4b716ff54178c74626f328716ced926596033b3ae2667608095ae30def133c3bc6c05aef0683ead508237a660a8245842e839e9a2d551bd88a982fd79b1136b6e60d7ec2a501a30d8d5e000c84800202881e008002d148008f9903b1901d028004e6c801f5d90391980180a882279f28238467e073be284590597002834a499fec48002f710a63802dafb4161304100042880019dfd070800c61f90a155152409141ca47e8092000f804007004070020000f6206e1b01e0581b02c0d40606803910115ee81c71046cb6fd450c2136346840dfc20b28870a044311b8100039058d800985080021838eb238e0081856b341b838c27d7c9092854ac9dcaf8a1505199458404af05535e48007be2fd99c00840218380065b95943933b764690300065b958e30d863804942c368e8b20a16d4907ef08080065b95ce004001000015520660b0100160e03d2559f2060d1fdaa40e3171ce6fb4a14f79f52d8285389828c21819753165e180034b3d2882708210086900947e6c6247053a6bad1039995dc938b18f94139b63073bea82261c29bfc56198a001a3c1e0c9c10840214400096c6c49211e06c50c60e6f0ab6551c471589e708c20009accd480eb6317ac0286009455c09c0084021c480b88a3c36184802ec62d799440297d3116d9241421968e4218397a942ca430e240ae7a1009901bad800ee7d8a001481f3020e440014010000071c80019f10004b72000c646460b2abdec061408a3d3e724402de647845124746c715900088021238035d9ba923069ddcc80e2892801948c2c2e95d069224224ea468408088ac4390000025e108a009c4270cd0004001000018120640203101018008000ad08006091c186c44fa60810889054786144b934690c0c349d4770e0004b01f18a0002a09f384008d8f68e8004e304001000016038500011cc09018002399f860c0b61ed8618504114dc310100023489060ae79c607a6002100800e00f0a0d19adc240714112f183060cca383c28456c621dc184822defc6202c30d3ef6182d1efd7ac2800d007ebe500840010000182205e0a02e050168280b0140560a000349200247e40a854052230280181380f08603a7d7640519eff950a009644b498e0098ed4720240c1f00861001382c04514911d5a3101760056068c007c020020020260101280800038481202ec7001ddaee1c181a7acb004048276a450230c2000800d068064340001aa408c66044230210981002e02002008820fdb61687090455fb52807e6aa03c6003a01080000802000008880f82c0700504552842c1c21c10ae9120efe39de940755779b048103801092607304c078bc839954282a36ceba960318fb19c90107402100001004514d2bf0922c38d607609c076b95d363001d00800004e10000d920003764000a6c8001dc9a2886dc06c5834d766461204ecb851e0046283c0100000a8203c1301d09c020040100381301b01f000d951f8c0527267b0c01ced646811880d804000027480d088064440300a00014320202a000656343123681020c28481f1528e20c79f4f694186b9811b8a0a043b5fa860589496d000330a100043840031748a10318c0630e80442840010000082202e2a0161500a868050240260a000239323951229ed3a4c919269bb6fb1ca30c74cfae47e9e242074877000f28e062ad43171ca0602763885baaf2280186b9afb0e008004894728f4480ce208102d03c61f05dfd5022203200800004b2024220111100804803c2601c1200d05006008000bdc80077f900246e3aa0c8c47ddfb5a6786e38fd03ef5a110840e6a156f18600000000000000000000000000000000000000000000005b11431821811411010c00800123319a2369af7182c4ea0af91c1199736add9193e38cf4ed3c0dd2eaefc21a705ecf9566410b844d0d9981eda29303dbab276718d82e2e132adda09b23059bdf6fcdb142073ba7a480e084f99acd40502401ad49ac2000e7731fd00c001d31751b009471425014716b8fa4c92208247e7be81c3860aebfc8c1bc585e9b0500809290fc1801be8c262009840840210463d0c23ca0918014b87b7840c005ff0936244013f8419d10212ed2d1098400009da8b5a04c184a010918095abdd7d20640b1b652b0910051c7425320102153f6c1c8022632692011c000000753000a3061300a000055880015f100040f2000b5c402c64014320091100406801c2400c0a005010020080027ec8018880084400202000010038b19)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case5" = "QuadFull27Case5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case5 private def zz2112:"s0840"="s0840":=by decide+kernel end section namespace Green24Proof.QuadFull27Case6 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l0 l10 l15 l17 l27 l29 l30 l33 l35 l37 l4 l44 l46 l51 l6 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x8308d3ca7, -0x2cb416090, -0x1bedffee5,0x5a7cb0],l0, ![-0x1bedffee5,0x6c89bed8c, -0x150180157b,0x4214e9497], ![0x5a7cb0, -0x1a192ade6,0x4214e9497, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x638d2970,l6),(0x1a6da661a,l4),(0x2d010889,l10),(-0x6c7df020,l17),(0x3ce3f89e0,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x22de70e,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0xeeaa58,l46),(0x18efc04,l44),(0x165a0bc00,l51),(-0x110c1967b,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x110c1967b,l62),(0x3ce3f89e0,l15),(-0x6c7df020,l17),(0x1a6da661a,l4),(-0x638d2970,l6),(0x2d010889,l10),(0x22de70e,l30),(-0xeeaa58,l46),(0x18efc04,l44)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x110f014c020001284c12016801800000001e009200c1e41141680c6200a000014848004cc0400000000580124018000000036009200c000000001203100400001a8110050c04000000c81201860180006804100263014000003408807180600000000160148020001c8c81403c801801dc6804803640100000003a3407180400000001e340cc01000000170c81c601000000000b80520080000001e0e0518040a60c61040c590050000164290072602000000000a8052008000000004c029004000000190e014c020000000e8380e601000005c34140a400a841480840066a00c005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x91c9ef2557a38c7eb5399d2059723e8770e2856d7aa2c501e6a8691c23510210044112) <<< 16000) + 0xa02ca78420706022236312308345c33f48183c4dc5e7a488100461e872411de53ca961008111163b1c59c3094021044b20dc8f344ec81c2fd089c3d25848c220977ade1972060bed3b1da716122004b27cb6d90cb04054267058378482c1637e0a46c92c005015f62b7b2093884061881c000086c8001da100901e1a04ccb91b033d56342450b84ac297682879f49102d9144fce8b11bde1c409036187da7c9c2e461043a783931c473e3e1c2061c48ce6eea588403004ca4877d6101619a014dd5524d1c61081e00004d47f02c2e14744339ade5d5dd61260bea185044eea55c1d5ca05da7cb0f7dc6bdf71b1753e82c6406306304200180080233734778f1c9a6de423b8fa719dd06798fb26a3fff266627ce4963e137b08493c7273cf690c3b0e521094000b30f0be585aa4c09647dc8ab1ea35fdd39538eeab3acf1b851240cc7417efbf1dda945350b2f0f0220483c55181f6782df0002f6cfa0b96a356b4391334e165ecbf3049572f07408f69e8bdd7880808117b7397955da51543d0cb390038b1a7cf64e2848911dfa087892f24bf8a77a7fe1bfc90d52088498466cb5f43478bc57a3f8cced65a0ecab250e689be406a03ea81df8e58cd26e75c9de6c68139db83d463ed3d8bfd46d407d5a356ee4648467e8cf2e2691af5b71e284db590891530aed55d99639189ed342608b156b1c7742deea726e3d0dcfbaa8996d177b1549887055e32129424000394191b0f129792d1a3b81273450b62606ae303cf585ea6716cc800000000000000000211ea7c7208a5eb0c6d3d9aa4593790a0232394afc10b55b1a0000000000000000008243021823002802008222ae1a383e3079d361b9edc1dff8198255d273e791900ef663ab74f49ae478a077dbbbd11abbb3ec09ccb182cd49dd85b79e0e1321c836b660ea1ed891b9bc6c4ec051d1fce2ea4fcca14dce1ddaf9d6f916e63370802f250d63dceb7bf5fb69a70b03272c7eb6e945251e3fe8002e690201d00f8280780503115d28d171e2051309e685938385525cde7c178608c82d1808e50a109ef40e297e20027353affee43805b13507c6d4500276dc8df3fa88a38e6ebecaff4081581224722cb08620263887207b32b3fc80e3cc20db6c20e1dbd580c80c60c10025ff5be803011afd5cae480087998447245ae306158142472082f579d22a5845d5591018a87dba1029401828fe7870e1cc0d415af264d269b1c2840a87fcdc979d8645e9fb0c1055b20180aaeea9c3bfd80005914ed799f0a9dedc45c482e25aa59ea060c510c00001419000442203a2391d0f8ddfbddc246430394a49e0810ea88aefe76243d5e83ad8f9080915d286aa95200000a137b9143000046b16980c87002a02048e2786bf2e00cea812340c67ed7fde06ca4895e09424d3b5f7b9020d67b30747a35f8404b7cd6d1460096e100801301ec96616a0481e48fbc1d93a04800000003bcb9d708a173caa9000740c00002673031542ede7bbf440a54377a6aa580e192460c8f4b964050b8f9c0f3e30e10000016e36003825677f3d6b2a88080091058ca0048000637cad7203f42010b80b00003f86886ad6005dd101863b4367212e4384bccddb4dcc23043033e2bb1d23826c4576b7e7030340820b7d9b02806a21553f8302001583e3474a69c64041601400007b080e00806c040340200088020322b0181180b88c0584602a238018e8331d95d8d965602e321b07715b804f6315f6f2e3aa61e1a326e196534a7035496b8dfe36fc7836a336fd4432431408f9595ea97bb9d2c0a14cc95aea115e17c1e963949b3e387302470f05e606c0796c09850e3da05ac92b07a501efbc820088ed91c43bc77e997d8a2fe2913d9b98a398802a63c8daceb0c824941e8518e181302a49591864a28bdaba1fc619b00677fb32ce7e315e2c7d2a0832a4bffb8e54e1846885b191d6fa30e0b2f21b1b4f958a18f0966ed6bca2ea061b693e21089b6401a4de378078b46ab1f3952b9630b1ce7dd2fbdd2215cd400b5b601912236bc15e60d976261c0fdec64aecab8014015156d0e739418619b2f6bc6804a9abf684c1080011004010040000111807ca7bd29dd1a226e449d37c8ead5cc71e6b2876c3b85a45eb4d55e5359fccb9a893d4b194f63d3b70d2a05e888ff59ff3d263dada184099214e650d02a4ca492fcd02f8fa45f28561302a99a032c9accd49ff5b3dd030bfde9da0330a2f26609ef0cb59e6a2434a9413ac59d3b92f7278e186c6dc53eb44930319d0212a29a000040420261b0120d80882c040072052019ec7d8889928d00435deb86c9d635f0043c82061aade34ac7268a108ab579c51800927dbc8e3c1d13ce4a362b0242800fd66d1b8919571e954119b847946b90eb2d199edca028741cf0229cf0c545fb14b4e23d38e35b8d6486b7ea48cd65688201b631675aca3b89b31be2ac3dac8263e4de534eca5f903a80179f2714382c2ff11fccdea74ed0fd2f9226b4e9a4a7257cc3f88ff1c7a6e08285f3d74aaada59d49a279adee08575461ed10915e4ad4c29f66c62336fe35047919e310ebf2b8000186cc0d6c592b10200c5ff27e88110a10004003c1601c0380ad709f40120de76d97060d113001028511904152b490c10fa9df2e30a6f24ba5bbc742b7ed29c5663134eedb490362e2a9b850aab46edaec1aeb13a3b43acb55e472421407b230e98c3d5253772894ba5e64398391b0522a5b5c408533e0f5c9c0997792087b7e0386c6fd0ae1aedec24031c544a028bf14e1588b66cfe27d2530dc95dec3daac9703312b6d4f7b1)) <<< 16000) + 0xc80c1cacb2aec14d69072a88a00009c640016a4d042251e5f4083b26e80d828001387b1c88224640420108240600401001c03a1c142074dd0eeaa77d4dfd0404a5950a5516eb3c41d0ebd68f40cb84ac787263accb06a5a0db0037c3518f75bb8133ec4cce2bb998fd29b64215040e180214fa98b3e171161c6f1a85c16293548078e4b2a52a57c22df820628aef4990837ced68976fdef78ddcabb02238b57fe709182866a200b33f4f0048c2c76214aa5f57679d05c7edb7009e23e658d4a8c9f329747f676ed347d2ea8120158a1832dbb05681e7398002670d811a15a29fc870450c30b962a84c0d1d1c9ce5003b4bbac6f841c8e86ece8b412b60cfa4136745a56b3f4d62a178a21a5a01fc63ea2a9ed6f6806c231fdc53be85910ee9b680001dc88003e6900089f2003414602000001c5cc4e02d7d5090ab1ab5d0ae47ac6e77d0db6958acb517ce5698606641b3d8933d59eafb570cd86dde801c0002e3be7fbf7dcfd9182eddd8fca9f2fec0beeca7edacb6d4504122f6cd0df523a687abba0653e9154bbd5462100c047d34573f97ce5ee54d1ee815b0ec25221ba125b20f5506014351e37e0a2cf7bcb4ac6c7b42a76bb9399cba7c42501101aef9aff5fa32a56195928e58348d3a26c8eac6fe76b3a4ba63a397a2ac68821e3a914e9e8f6a63e2dc37d2743b3d0b070a6c057137fafca19a4c100cbad8e640eef25ad61c792daa5e9df574940b82685d2a550b1b104194b6a94003404000ed2400a508801c7318106177de60a380e23eb8690769740c30d7cd251cf94384cd8054a981b4508506b9b0fd818608ecd347b6cd30418e6671ef235c200200516840c70202918976e68e0088dbec9182f03c710737801059e1c20222555e90c5083d0b12548d0c105142557b3c104995983dbb01c08f2abff18081000010dd15c01500000046500a41c60a80800003ac70c1a6cfbbc1c2777c76548508bed88e2f1000f6dcbce420234382f1d040299b9cb544466182200860e40ae0866e60b09c5c8a442081012dad0420600049ef685040002a68a86006ea95fd6a50000140a358200000005dc14001200430821410746660f0d7d4bbc4c041e089d1c080800009f1b000000400ba5280118040000430d8e23b2116b4b1a578ba6af9230001f864b183002830d4a1860927918b86000087ea7133021180400004f4d0c2f46dac3942cd578e3dc40a24afb0a48a107674f1be10221fa16b30c00156f4b18180a4fca7d684e104401000016734506205f3a4488693713c8071044a8cb011211049acaf018103e8572e62021217382b02020c7d0348033861180400005bc80602f071f496f05c182f9346e8d4cd10000000064608294302c85284000008c870c10000570308c0190dfc4512500001e13b3b20000000231be9002500c610fc6e9a49983e8da2585668800001770182623b6333850800001770180879dbac6400000103fb14e00440100001633638719b8adb2c69ff9ca79260600002ee00b0d57320ee80c00000017700400065e8b7130011804002c040002a06c528520c835942ca2ebca564814000011940506847cee3d62822e54deaa308080abee5abc600938d3c41c1800dbae437a009595b784640412808000075080500e860098dd128122a1f12b4f64a1182f87cab2489ca218039e1c40000069781215dd55fe4a0501868d90bc201c0c12688077d82214149c409405000039a40022c08008061001166200402b4f96027202351b2cb416c47e658b7e29c12b7346cc4da92763a123dbb1571acbc81e95704956260242fd07fc9e2f4c58fce94c8dd00e94c8dcf84683861842802001802227f968eac5b3747b6f045abf7ca881e71100acbcdc10e4ff496b7429aeccdfebb2611f35c010e6e93497ae7f8b2f787d49e469a7f6400db419ead7520f736ad176c32e1998af22ed14001a032a503bcaa4ab8c77a5adc61024cd906cd98955e3ea9084d4dd4d7535e6ef0366cb6b19d0000de1116a78106a5887f45e3ce102322bf45023198afb5c222b1f12c2176bf2342f48a9c0ffbffcf18eafe1b689a955e84dbabc043f2891eaab5ddce84ce0ead1aaa3a31cb726048aa9b6ae3e28184e4dd641007ca3529a080187581b62248284001000901c010040100100a9023edac5e90840e804000013880380e008d2ee9be30590bd1d65720b41008a725fe1249876c2343796563acc7a87df360ebc363331a9aa63a0ac44b8786021df3e4b5dc8fc23fa8d132f8239df51f0605b46c4e69453bc42575ac2fafd596a263bbfdecbd2e6815c10e6c140852af3f7f9deab5a08cd88e71c9b378f4084f67c27ffa13bb41bb5a38048c5e8fdcfd05e35e420c3a8e563c1804b4f94d36339dea1bcdfa1bce0bce6bd27f97eb84773a14906b3e0e77d3b3b004cec5c13a0c0ea82fc16c9566ad179abd2f7ed8a977aaf5ea9d6b85a81cd856e0942847d31029f598f2f644da77dad397f8cfa78043116251000038b9a2800565c3c3880086109c0a0807191264500032f535592050e1680ec2000073be1ea0930a1100400004f88004a01000a4b2001c544004988d0c80904980c506519332c5440400cbcb9204009b81b10c030000cbbfda02002a384ddb10466182400862469c4c111fb62862469c5000000000400d193e81b000000000000a358800863083843042842000000961001006e100d8664dec70800cbbfda060ac49d1767450800000bb807000198220506008bc031ed412610240080000a410061500017410050100200800c0400091c400894002020000100169c9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 16 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case6" = "QuadFull27Case6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 16 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case6 private def zz2113:"s0841"="s0841":=by decide+kernel end section namespace Green24Proof.QuadFull27Case7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l41 l43 l44 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x7e57f524c, -0x2cb416090, -0x383f1fa02,0x17cd3dfec], ![-0x2cb416090, -0xfc490722a,0x5a3570f4e, -0x1a1cdf8b4], ![-0x383f1fa02,0x5a3570f4e, -0x150180157b,0x4214e9497], ![0x17cd3dfec, -0x1a1cdf8b4,0x4214e9497, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x638d2970,l6),(0x1a6da661a,l4),(0x2d010889,l10),(0x12a6a1838,l14),(0x4a9eec99c,l12),(-0x6c20b97a,l17),(0x3caf389ae,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x14c96caa2,l25),(0x2d64234,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x4e90bb5f,l43),(-0x35133b4ae,l41),(-0x1ecf2048,l46),(-0x332a198,l44),(0x165a0bc00,l51),(-0x133f1bf61,l62),(0x9675fc3a,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x14c96caa2,l25),(-0x133f1bf61,l62),(0x4a9eec99c,l12),(0x12a6a1838,l14),(0x3caf389ae,l15),(-0x35133b4ae,l41),(0x9675fc3a,l64),(-0x6c20b97a,l17),(0x1a6da661a,l4),(-0x638d2970,l6),(-0x4e90bb5f,l43),(0x2d010889,l10),(-0x1ecf2048,l46),(0x2d64234,l30),(-0x332a198,l44)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x130088026602000000098140730080000005c22029804000000360d014c02000000001700e40100000002e0013201000005c02600998080000002e0701cc020000000e8300c6010418618a10316401400000000220390040000000036014802000188642201a801800000064280e300800001882201418080000001505034c02000000000a812401000000a83101a300c0000000032071004000000002a0148020000000004812401000f02106809c401000000000120310040000008828030c03000000001300a40100248230640684010000000241603180400000d02400e4c04000006210807260200003204d00723014000184138028180a0000001506038c02000320a41403480180000005c3c0530080000005c12029804000000000140c801006c0e62c814c8020000000000703200400000002c28198020000000002c0c801000000e4240386018000000001c0520080000004a24031804000000000240c80100000c888301480100000000003032004000000005c029004000020c2102a4c04000000000480e40100000000583033004000000002204900400641242101910040000008422028601800007c54340a400800ac1202c04ea008004d08c1200c9004002905409007a80250829010800cd401800b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x308b00980a6802000000064580530080000034168099806000000191602cc02000000441201e601800124841201e400c012e4404401b20080000221d0503d002000228f012036801800000084140d300800002084201418080000002d2901cc02000250a418014801800000094880e300800000004c881980200731504401e90040000000050606600800000460e009300c00000410c8149806000421c8640a5003005d0e4118028802000168741300c400c017c3a04600b20080005a1d04c0b10030000082188072602000168781300e400c000210368039180a000008c110064c040000001b1081c601000000000340920080000002a22079804000018c190088c0400000148560546018001d0a42b02a400c00000390500e1806000030c490044c04000000110e81a601000000000840d2008000000443a0498040000000021024802002606a0e819080200118210440394010130104108034a00a0000000a0603cc02000000078381460100250330a406a40100000398620549808000000000d01c802000000001500e40100000002a0013201000000054220798040000000044030803000000130680a60100000003c240d30080000000d00099008000000001a01c802000000007060660084e03184100ca40140128198420352008000000130d034c0200000000b0e0660083985188103164014000000120a0698040004a10864089003,0xc805200800001884201418080000000005018802000000088780a601000004e04401630100000022048071806000250982402d003000000003c01240183c82282d018c40140000000f00099008000000001e01c802000000001100a40100000005848073008000029090009980800000000b0024803000000006c012401800006a044014301000000320480618060001a01040098c05000000d02201c60182983084100d2401414c19c238069200a0000000016014802], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x2482b1303650a1c32b2b177247017edfe80a141f10a0071c088084e5fc4005e772acd26042200804b00e8a5862616d8a2504e42a5b2c85deef5048b18bb4447cc2831dd545364b06a3046f7a660422008515601eceaae82890a221365e21a4006767594e8b2014a2f0e04050644fd81af8c2c19aae5a91ed9a0040bcbc7510b00109183245a79008520300001cf200064240ec360741391a9740ab28f022505acf400ff6243c245184fc3d9de91d29e6eb19635d38b490896c4ed96e8522f6cdec1031c733d0c10d44e347e20dff35e3ca164f59ff0b01452e30e446db9c7eb1ac1f40090414005b60c389e7c364c314a2f9d1d9011097ec8b05b9c39ddd8b6182bf90b2982cbddc93c2ae4625f0308390a20070040007e640b017c7ed954e35dc8a186a598bfb641c60cd5d44dda0a149b9100088d2050c2658fc50480c23f00770b41003654bc3d798004be2ebdc694261c70a80800003b0425417b024a420952047a50d81252104a9023d27f3a3c9071b4cac89379d1e4838da656449c22a7f3f3bc19156b24d34f885192462970840458c48c3843041844808baab87700984fa3626da0e5f332fd57a7558bc64e5bf8ac86ecc01453ec78a873a30c3c247b14fe9d4728fd3e294b0630650ad5d3e4ca91329505ef7ff58d141bf85c5f1af5cfd9194e4ba75d09166062acfb6b0c7318d6c6fb52e252678a90e66e6b9720f9c4dfd1c43f8ef843108105940c9c189d858df907249a0fcd016a590db81c8c3410261d05ab0b8d04b7d73a69fd1d275fa385360c69919f07037434dbf771d6815d671542c0a29ef7329e9219f55a605ba615f114a26304e939f63a51f506fd145910c00348e3755c7a0b0da324fd0a9eb0733967f28f731f91c7bfed57abbe14b50b17d71b543459f2b0862d4b1062b88e00009fa40b0272a0165a557805d4474b164888169fcfcef0ad6e525704257b824918a5c21019431428c08a086088002a7113d2b8f62f5e26b19ea305da7c4c7755a744a1ee4bd6834256c5c3ee65b7620891aa8001331000c613853c6bd1ae9222598282b061128831e0e2039563460c0c1122120782a8928e10804244b9c41be43430a0511d1f1e88c2138cdb77ccc8133eae772ac04072dda5e3885aef827412919e280e5492ffebbe6aa0826d5d2910051f9e6f9a006111d0c479c78af7f1c4f7faf609426d8a2c4ae5944ea4aa7b359b8e4657925099aefbb613cac4a38ba1f000033220c43a01a15000243109421f0b0bf6e9d5b444dbc7d58fded8c12814ee1b44f5c4295ceb48a11b8acc023ae14ec2e4708d46c65224c7c5411cb8c1809be51029bf266fceeb3b00f437d690801582abd5dfc93398f24e340102568ea0c72834310ea6f47253a180343308e4b82a31fe2c78110968ebda131eb352a8ebfd02b19fa84587028782589ff9b04a6b629937eb9dfe15a4e01642d11bf7b860c7c32cfdd9afa06f959d4d9f46ceeb585be44f04c4b014c10acf38656d53d099a37bde28fd9170d305207a4541cb83fedbabd3e6c2a7eca98016750d6560282c220b572e16fdec8d1f72912185f93e0001bf4f166009fb85773d5f56bb56b8cb50b0e026bd217c0420e00000000000000007a2302202182300280200029243fa45ae298466e832a46fd7e5c66c32468cca4200c0ff6489696232ba1232480a155fc531970c11ccb1db86b6d802a211129b10e4cb1a4b0f14000ca484996824846122230900504780a06064582b348c1c2ad72a280ec61828dd1ce027181420b682619f3620022de24c0f5a1c08ace0c10d271400249df2583b5592839b5b824801a062d2721eaaa4e505805891cec62923f0de387285cffb35a1183131da3070e70608cf4c5d5c9e06017e628c4232880927eebaf0243c757640d3d20219063dc2f68f30a485a058a23d9335236129021a9e43d753b1035022b511d481041d02e66365050464bf369cf70405caa403a83e48764ffdb1cc20277663fd8feb1db10158162c86d9411a1ee86285719ce00d4bda24597e946518e7320509347be0bb5f1c4020d7bf7cb450821dbbd3f511f71810eecff1944e10001d9d2366a7e94009cf103060078b18e80a74fb45943421f6b5b2963050470be4fcb630a26de2aecb3c708378fa312a31202bfbd42119f10050ec3d83b6c85ffb1419ab90ad5c50ac0a163252112642a450cef5abfab290e2821413cb21a30a0b193a0717082240d2dbcb46380286784c4120a010f2a78805a001f1aad148902110d36f77db07cc0a15010000082c8002029014198003279000844200147e4238a7c47e57a061caa40752699ad84d470d783a8c2660901210a3698f2d1c24478c787c0c402b99315898cc601111a32b65e8400dd66a9eaf3520480c2b02850f48399aacca154723c2001425cfdd60e82440f67a5f14386147080d18a09bab215d3920d06010fe527042300850f2a9035378694266d3cdcbd1648804d76e5daa9418ec411bfdae3860f6f0476f11412a27917d55a3840089b5d4b6920d0431d3aafe58008f66ec7449b12085404) <<< 16000) + 0x000020f3a94fde59a58a2d1588f3f85938d93207fc4640ca6c427946e00000000000000000002289231219019208c008004010b69e755c207001a000368400159484680c2300743809a1366785e244f2ed7cbb25a24099bb99b7ac69c90cc9c254c50cb10199b38d77767814217d9fe145fce3809bfcbdeceed030097ce9d79c372cec10105e070a228d265ae80a1c020a93b74a15c1bebfad091420b8c90449119dab8bacc60c2147b84f42047f9ed33789c10900214452953f95ed3e30c0592d4dbf12142b76973a4e7cc508027358d2cdb922423f2a39297c30613f75fa368304095a4ef701b7c5800518dd7552c0e000701e1a599845f4821701800008dc8001e2908b01d0e106f0d4c0cca1653ca5f06ca1229fd0304ff812446879fce17ec3062f7e150f77c800c15d3354f5080094cf8c39f6080117cf143b5cb688082b024590ab9dfa460b1bcc3e61199430197c128a285bc12ac70438831529bd3c908379cff710409a75fb42d2704230085909040c013a8c471c10ad04c21981636285999d068728598fda38fa3b038817040bc0005070c533147f1546040988f03120a30300033e4b192d3040003c25d90e260d144821781a00009048001e41a1d668eb3ab3250afbf81dbb4624529d9cded849226ace9e5a4d860c96ee8521ce4008ad152b12a10013d8ff22bb040131705323397c4041480e2c89fb9765e9286287e3331d2c57a5dcacf828507b3d2f8a1c404066b2c91c20c7a3ba9e2c12d8b9bcf62704240085915aae33b9f300e380fd4d28622050c442b2c5c594162c1fc9569e00050a13fa4fa06800e1090e37b9d32058264bf386e4001008005d8644abe40006629e6eb7191012085c060000237200078a40016c88005ca101c0d8008e1108011045068224141100208701000ceb10293184312c214961084b0831dec092908254811e94072eb54a916dd3a9164648a718f300d6eec939d1e4838da656449c23be67ef3055f0166f55efddc963a6eecab01d56da80f2da2d19bac3a28a3195000000000000000000000000000000000000000000000000003118a20821000a00602228b0cd867e469c5437e7a016bb32d13c373fe94007aa2798e24e283102d20985e4b4a5fc08f5e52485ac14ece421373d507e2fa1bbe9c83fb1b94919a406b377b887040850f3b2408718040e41dddff6d5fd51a7074c841bd61e12015a496d4bbcfe361c2258852390de7e9949a1cf60a45ec2f446212fa5ef3732192ca1c505535594ee8410282040410002a2821eb07fa616fd64d81cede4749263c12badf258515e797eb2c57f0406043d7547612f87d8ecb37233a349d2fc464a424f70e89bf32f9ffc8e081035650a1014dc316f33abe291904b81ac41730ee5752f3e3a07a0083e36b0891f7afb66085759bab20b4f76e128ac4af48e3bfc826853d249a96313fe0c773431444b950e09edfe29445645e37a74aca90a224fd0a2fe9f73729384475f601b8aa49a76a14797722f68fc819b45d0914181927843827a4f736f041c4e7645c0e0029faa758200ffd034940807c6c5e3a5660c2100800009a902f0d83f86c050340fc1b0180d83e86c1f0160f60bd21cafabc01c2321dc368344bae4eb8e180fd4b116890107c021c7619530d238d3460f6a8708996ee554e033643a0848003e010e1431c1aa72000872d110502839a6ad8c007802000013e400061ce0f64dd70845043e61200e4801946e8944000cd5ed5000062eb5e38b284100040000404c863973e0b79a7f9d7366a02f05338c63d61dcd5efa280d0afda81d2ce069f996d899c426009f4798aacf1b922cd86c72859a9fcb4960c0f5cc7d5577caa05e88a13b638286d6564b9105f9eb500b494f16c4f72d3f2434a58624949030ebef6f6836a545be73daee5ab6858d63d0509cb33303b39f22ae5c32ed248b5f3b5f4b058ad1c9fa58436915782ba5b6c6224ec061f08392631a48668d12b9a0c97da3ed9e564da8c16bd9fd6ef02eae0fbc436097e6f3c04965b23161ec2fe13d41aeb36fb490a7dbde38fe431075fdfd2ae3fbac6e607e3293637f487fc33e11674ad2dbaff48dda7d54617fc13355678c9e6ae6e6c7bcd3c21560a6318e0e6ecd3dad13d25bf6d241c1af7800085320f4230790d83904c1c417b024a420952047a50d81252104a9023d27f3a3c9071b4cac89379d1e4838da656449c228be69eff6056781cff2cb416c47ca59007260494c37754a021c00a24d6f40aca80596955e017c598027ee15dcf57d5aed5ae32d42c3809af485f0108380000000000000001e8ca60e6d7678a44ca429a857c6530736bb3c52265214d42bda5f22b486369ece5ec7cf9075eda801769e7c347b02a63beb8c4c6823803002cb0fae1a9c5cd52e9c2024f0b908bbdd0b3a25ffba456765eb6204335f26f73d627fbc3f51be9394c4e6cf17ec052cd368cba5c8094be7afe6e590ca7ffa7296e49ef01bd150708b1c8e244b3bb10362c824cfc53a55ed389efe6a2c52a51f6670ee068c690f78f8d163823ac6d937f6dcac9268ca80f1645b7d02dbd4cefa07ff76a7d3526225160bbc4ef354e0f121d0e0cc894636a0013786c1c3d811c51a000aee943c8003fc3b53846084201080200802000008883c04c1dc160b60305a0182c80c1d8060b00300017a20ea13d1c4b88c266305184091e84d13083f38d5144117d103285086750c66f141069dd703500012ffe06427042200868e207efc1618284897763e68912379ec90a21c04ca85e28422ced3710a087de3d0864c084401000013720e813014)) <<< 16000) + 0x01e07b88e8d0a2079c1f314a38007e44abe813102000400005610730dec092908254811e94072eb54a916dd3a9164648a718f300d6eec939d1e4838da656449c23e74d067b62400587fa4cab7faff2f7a52d1f69d20bc615fe8500000000000000000087c598027ee15dcf57d5aed5ae32d42c3809af485f0108380000000000000001e99819c0960860940020034eab313c57344bf5ab58eea22d9d77baa4a78f9427ff36c4a1dd14ad81b1b185e817d93173b222faa56372ffe4f2a243cb420829e21b87c47d7afce881ce2815013638316a5e11ec5baa49f65dbb77906c99eb06e01e1a70e1e589723fcade2100a2b63c0fdb0ad1b0f703a5ac767e87025fb953f5860465b67c1186098254657718002a76580a084a2846010000116200101441c8360e213a0738ea960be042479063fd4027946667ee4faaa10d329f4acec48f35e8ba8aa672d47c1e047505e4ec149ba6323a25e48aeebc74803db88fd11c7db0fde3a49fdcd404099554bb6fd2f1919844ef11fb4ead44550f451265e0dde960e13c87bfcf2b9eecc35174852b8f42df9ad97077f7a44536f92bee7ae1062d02adb4b3a7c02bc25bf52c052985c374c9220bab2ba5e7cd8620c10832b9cd6bccea46d968b1d0fd3b0be82677cf3c51d37fd1fff92b44678e967555694b56a285b1ff25b4848e051dee3fd9102abf7595f94d886bfc0354ae0eab0093d97f1b80d72d2563aa0a625cc2848d74ba244b4e8aaac89f3c439c7e13011f88b143b21a45f1941b25f9a51634e3bcaba036fa1ffe1d164a2134578e61f2254b381b17c10b83582a0804ab3c39b33fe2b97549e2dae7f9fe14f1b32e2dede83ee6613ac7042a804e112e33acfa64169231a0b7a8038068048240de0a000aa4362f98dd9510c1cfe3235c103e892c86ce00fd016c792020f8042c5a0b644365060968231c50d6501329860e1bc12c408114c2063c4a083e0100000fa3a2196c179294249eed79a0e2062a83160a00d552f6a92021000401b8040001d041b4360d81305b0582d02c164160c403058018001bd1001a60200649640a4960501ba28e41a2c57b44f06f570256497fe6fb9ecb9cafe38e615e7976660d6201ac71c01341e7f459f0b3ca825145e235dd191aa04d5beacfe499e3dd47e218cd4f2300c01aa1bc36f550aef6675a080d286dbcd57985c1d674ac0201b4efcabbbe00008c17b08c955ba19413aca2e25621ce9fb169f6a7ebc4eae7829ee321bfa90208be0315a05d9556398628fe66bbf24174d42002826940d11e099919d626c83e001cd8b91d52f590fb738ed5be97eb4b5d86cc65815fb0222af9aa356983f0d2840caef9e4527193afd5cbd497097e8987ede3b29da10e23a08d0e3ccd31821051e71f420ab6ebf89410001c293939118c50880200d60306a0183480c1a0060ce030660183280c19005c2874d12ebe20505bfa3c367060a680ccd4d0aadc64926840968b6855814000a5db080180262f272091127182300860a0aba7c2b07140fbc2fc29a140bd844ac1821371cbfa61025464f5f4470008b27214a224c304601000014720c61303405f1027970782980fa04e71922813f41d3c242820532c034cb00fd6a0a930601275eb2d715516624230080000a610620503080ec70018eb4c080c00689198202021ee661cd047172f2c41c0144b8fa70402cbf8fa3626042200858e01f8f86238e8bff79f06830af3e40e50202b4b0804808400100000d330000100403000805804000098417c360bc1305d05ec092908254811e94072eb54a916dd3a9164648a718f300d6eec939d1e4838da656449c239165a1806bdb307577fd9aabb24b8fa7383a4e042023fc0800000000000000007e1ce27da267a058059cab839b4d74826dd482a87eb6c8363b0b921261720aa9659e09800802252512c5952468c48c84df8ff2f53f95868300efeb38eea07a00dce659e93e42627defe5ec2011e42756ca03df7140c014b2681cb112de5c1a943c1db6b0ee5a97394e63997259a15c03c29707f1c1897f4154f4cae9b2b4ca7844432ed6d1a89818943de014c002d2671c42806acc9abc0942084021a6de4dd3281c72aad40148c7772ce4e48697bbc9440ecaea1ee257302df639ea32eeb15f4e7c1f6a61b850657840c60a942f49ca02c630343f272a2c76429f6df5145d49bd0150483bb28409d6463613a9a9bd9bd7334a34a19cee221fa0ed96f2e7d3f506b375fcb8e73522404f0c888a280db4ea03556b4fbd19c5f5a5fc620b956bddbb1d08a6deb5c79a609bab63ba67e02bef65a1ba7e93c4ae7d87ca36f462b522f29c47ffca1e74fd39d04daaf04237ca01ae0722f929c6f499b6968b68b418a6a4c7c1d89b91b751aa16c9b6aa39c48269d880000d704170178649ff79fa0e1329ee9dc44820428773b4002ceec2929200a6ad7540125102100800008510009132001e54649aac297a00e38599a20b8a181252d74e400765dfbc7041241c21008000071905b0d82d06c164360b00b0013622003020400661c8010489005a8432c78f0ccccc38654deb18a9d91b1a64ffd7f84dfb2ac351c53000000000000000000887171e44cb2e270a2909567c36e4d9dfd4dc9b6624f27b82ec000000000000000000000000000000000000000000000000003190c30c20808208c006006447d5fa044136301d00a82b888158440aa0a05401029808000eec8033041008d0a301bd947530c13537220e03e21fecc1e7a7d70cb42cf6ab843c6108f7353ffeed5539e166aa37ac0c1259e455e6a001f41ba526e2f7e907a38)) <<< 16000) + 0x24c0efb3da973ab628c5324f2d3721b88cc80f613b1a280b1d73e4caa2e03165cfdb162ebec2543caa0a2937fa61e25a9ef978ee4b8056ba02316d0db703021d8775472ac66180bb604b75b97b0574e3c129642045007bc73637c5e8aeb140164363b06a6a85a3b248a2da1a501cb2da662ad0524ff5bd327a71cf13eb029095cb402266c4705560aef58a93dbd96a948f02b9c3c3a91748d0762cf1cbc4fe61b1bb014d91c3a123d5f61b35c6920a97a1e009c060a403d52e66c31f2e8a0d2e551c3ebaeb3c08e800000000000000004ebd3d995c15ab1d4218be69eff63da6a1700800000bb84a5900726048028f4ce082aaf2620000000170f7234c10300d80923e7b2b45ca05a9038a18610a068a2a972fcc4658d761155a0af47da2f05fdb8f593157550a017526fae0db9b6affa7b0c90c7f714543431575cc0264bd0714a49c8315becb3d9af5c9988e79dc9b90cba9a4334c8644f48126c8c5c2000c3171628637aa5b871415c000dd161844a66c23516001f49bab85005ae77d650c0018b431fa938411004000059882786c13837432e717a6f2ed2064d739f4e09530dc860f51d327e5bf5835bb55c260b62987d33168c3052c3048e8c072098bed958d29218d9fed0850813b3d9bc812f211b552a7fd4c88e3141fc47ee95aa2db2c99c308d0f182c143e924a82b5b24e819a077ebfa31d5166b21d98bf7d1fe8206fae2cf0749bbddd55da748486bfa78b76d5bcf02a8bcc164c2dba67dc244bda413dac80aee09457b2e67bc6f8943cb5f8aa2e54d302965c2962b5858113dde4ef3224ac8d01528a4453b4ab5fb053f301fa3fd6c8a7a83b2c267f4381a011ce397d3976d51681160bf87d5b638c05dc59f7561e4cb2bac5c69e88d8a0a4518d8ae441d87557481cd4a07e6d2d8b82cfa3fe04fb28a91d433b34aca37c315a962800043d1012110007c29e01cf246e34502363b444818023c13cb5111231c21008490aa54636903ae7486584059a33cda93041e00402880c14007453f17c49ee7404a28a217a414d3228f6ef240c0b8add889bcf9f8204d8633cdeb7f78509401330b2f57ad436c04000f63c30bd3f9aa00800000059fde6a30013d6f35070c3d06800011f104f1182708e8aec73c1d9e7f82860b27eee005f21842ab660c939b51044de84c717e4c1c10809938225e61811ea80467391c041077a6894883e0c01c79983411ce0000cdf3c0e134ee6a2400c00e006a0304d01e10a452b2c5344000017701825dcdd5158a1000005dc06857e720a90180d1e41f86cc0042010c33c6051b84046106f5a6b67f03063a127d999b0c3403b2a638f890c000004f1a06052e251d916c2410000013c680c0820142a32b420413b3ae02174520052040000204365eafa13f044610000005dc016398bec288e058a69b52a5480a2b9cd10a9d8404000001770180898a644a2a5830968bb10d98003868685b92900260140260080007ec8002b2104b0500d008128040010624002e6480063490491982404f604948412a408f4a1b024a420952047a4fe747920e369959126f3a3c9071b4cac89384512841c41022011811010c12003115e5c85b411a2077cc212763ddc1b6846492bf1ed317c8102a02a34005af3fa322ea94d28c970114e465b1407ffee5c2853cc0527b4814057d0f912421ef059ab470818a408ce1427c7123cd8b04ba2162e208192147034c801aaea1ad569042200859608d23ec28160b14970a2f71ed3942a2f1af99f28818500a1ba0960f84849c5acaa860e850a64749f560c8100864e69ab70a70816c5de330b40cce208042f03c00010410003e4208e1b0400d82304c1142604e13d52e66c31f2e8a0d2e551c3ebaeb3c08e800000000000000004ebd3d995c15ab1d421f166009fb85773d5f56bb56b8cb50b0e026bd217c0420e00000000000000007b23e7b2b45ca0599028a18611401000c00fce3c446e68308a35773bfd2badffd884e3fb88c94789f12616e578c8c3b22045049182bb02c715d195901bf5f24ec78c91ae237d51e01a1e5c3046326c6cfc26dfadbcf4f9b1c5da7ac22648a504401c8c1c619c158c210346a18220633c2a41504148a00f0b430014d5435d092861100400d817230318bcdb61840a94c708e58613868dbac40c9335e1b4041543537d522c031b31293a4800d696a6b052710230080000b910002af343c7a1762c1845c1f839c5002f24ede84c207c0100860b04205f370346f255f25e2ce1fc055deba8d2f1e3a30857b5141521432820c2201280200180381cba3c9e048b5acf14a3272b8c9c6472f2a8f02463ed75dc41ac4fa0003ec4104040005e840485400160e40ac67aa5ccd863e5d141a5caa387d75d67811d000000000000000009d7a7b32b82b563a84368bb08751f502c8a0870880460440490050035b3718fe10ed0102b63471c0532a8e67767bc7daac676d9278de47de58a459674f7330884695eb21cb2570cb7266ea9733618f974506972a8e1f5d759e04740000000000000000275e9eccae0ad58ea10dd4b0fc81b663ab2d800cc776cf4b392c3220570f39c7e79f1fa00000000000000000000000000000000000000000000000000006768bb08751f502ccb1cb14708508400102ae8635eaede76b9b4bf9bbf35d7148d1499d04bac22baaabc8f26d89d1e805259942b12deaad6b875fd28b6c9a19ab1986da29e89a1d248af64a64a8c82d842c7756766c57bc269fc9490766489f80ded7a1edf9e77029f64c2397ab04bcac56c5125559552c333eb0147242b0bf07341c27a0a65c)) <<< 16000) + 0xa142c28629dc0817b46cca6098208002000025a4001e1482006c0483607e1303e0981384f0a15a2b81496164fedb2ba184314a4c5b16080b14c6ae48255b0d82d00006f49c7ec4c0844010e2e3c89965c4e145212acf86dc9b3bfa9b936cc49e4f705d8000000000000000000000000000000000000000000000000006312cb2c71852c21413002c008030080200d00021c20761303a0981e82c0501761136e6c577b1780e114022b85bbfb4511e3c819c564fdc1697edc5dfd11bb99c55e1ff214003a027076bad6096cea192ea430c139cedd2e56fbf597aac309c4f16e8b89aaae3a68015564303f1fd5b0e4648af049da6821a5bbac500bafd9ca90fd6c644104748a4ae96190fb0b0195543a6694aa43688c62a3108f35547a984d0ad2ac307ffdb34ae239755961fe88e61666efd8ca589251a7ba187c14f31d7ebf869dd7164ce4594b74b994911bc2c3211fc89f87e674b0f1dd0ebddc8d01ebc43b187e22118b5b8607aff65928a10189bbeaaf621865ffa3e507101046bfe838c1042de82747218095f56ce3481823652fa554040822c3544442802c10d4e5742400980500340303c0181a00f4715ae9380d8214215474b104be080c551d20cf7f81861b945c69852082037bec4553118042ff5787752480056ba4291b080fd070c2d02c0000df90003ff202c1a000a7d204e23a242d5427845866e484ba23027d3b3953920c4f12fd4c5046f83810e6000736f99a0000defe63a13821080438b8f22659713851484ab3e1b726cefea6e4db312793dc1760000000000000000000000000000000000000000000000000018c4b2cb1cc08408904504c00b00c0200803400087081d84c0e82602c130390581c02f083e6522d2021675dc41c06a9c0f288c10740218488ee969010fb88389020c80200001ac81b82f893c149f11c11a28e4d4e06b7a28101829a9a39224041d00870d1e34e304e028c1cfa294008cf2f4823041f00800005219031d24af0800c80424302b6eb9c3860d2cf180604664c0a19c04d873a31280112b80cd2800f80400003e08090280005b880018790360181a80fc900fa371acb1e16400d40e9c7a48081c2318e5a47998208147e1c3a42442032bf0428ccfb688180fa27272cde0a047a08cfcc5eac182ebc9bc000987000b7b446b98ee6571e12006209001201c0a00fa371acb1e18480d40e9c7a4809202318e5a4799828a147e1c3a42442442bf0428ccfb68a200fa27272cde0b087a08cfcc5eac204ebc9bc000987041f4f6c6cfcb1e571e120062090d52e66c31f2e8a0d2e551c3ebaeb3c08e800000000000000004ebd3d995c15ab1d421ba961f9036cc7565b00198eed9e9672586440ae1e738fcf3e3f40000000000000000000000000000000000000000000000000000ce48087886884065845826817000100680019a90005a7202c0bf3fb757af2640400000bb80f12bfdcb9e034400000bb80f00873c179d25042200879f59c01cb29c3cb12b8265b88a020000124f800f1190233e5abc80013960e93933c020be30030496000000249f00c8704290200000ce1ea587e40db31d596c00663bb67a59c9619102b879ce3f3cf8fd00000000000000000000000000000000000000000000000000003389e19c19819210c00801ccb38878f5298c51f84b9b8f2549a899e6ecff4ed3bdd8e264a8e2e6a03434545dbc454bdc2588c65609f5daf0626e0dc908866a82a89a45823b0d1a0007a64001ab881a00f4708d8bc59f060850a6466494a1000001a5e0180947b3a6a6b3009926bb13bc40011b1721c6020019423e00c0805c873e120a4714270180000dd90010f62002b3a40066d880141f900337d2008c2240cc14006029148961d571a39ce106fcaa1222a3dbe6d9ddbabc63d7644b031932ea9e2ec32a536c520a8d695c84b09af9613d05acd04d756e48455b4e2ebb634410552e3198a10b71ff7f02fbdab1f5f970a1db5feea926de6fe589c7f6acd3ef9a3652ebef2bf333ae6d3b0ae9b7ed4159a24bb1b4a821f23d1cbdb58e7d32d2544795264d1c090c27a0050a6ff6e3cbadec7b8019077467cdb7f3c60a91b58c07f2d580c76ccc7f4995659960d1bed6bbcfee39ff0ecf108bae006eb90b06c5a33e240505ea88228cd865e2c5cc268acb4f0ace0cac95747f0ed0b0dd9ae7306fe3efe1ff3a6aeaf4366dbc4844a9e65d21ba2b1144f013081a433fa17313d8a74cbc7df062c18b8875b90e0f8a15a586eb5036ab116d79fe891ef54916bd3d56842ea11a59e31f26ec46f5ced83d199ec84e8c59ff9d17c7f8c9a762d46aedb18efbbaa3880a7c96f2203195d3b068c18410a75706088a9a1abc301e9862f8704056d14a3eaa4c204201002c0181900e037a591bed8408a80a900050052aa7fb218144e4b2d15449060840200001c2400097081884e986eea94043801449ade815e2cc013f70aee7abead76ad7196a161c04d7a42f80841c0000000000000000f6ca53136610c0b4fe7e7788212bdc14918a5c4248c52e1081081451050870010051c5eae705d801cc7b75414d3cdff7bd840fa718569d0ac029d2ed3db33e617022d33b5417cc39d86dfd1e76086740eb3b5f1f866b16667019528728f704eb7a28c861d740c01405e02c284fab9dfa4060bea27718e1ee396f30420403fb247f06100ee8812e300bb7214058205303edd70a4e184401002e0581682c0b017b024a420952047a50d81252104a9023d27f3a3c9071b4cac89379d1e4838da656449c22f166009fb85773d5f56bb56b8cb50b0e026bd217c0)) <<< 16000) + 0x420e00000000000000007a4488408206302202380180100a8e0500401bb024a420952047a50d81252104a9023d27f3a3c9071b4cac89379d1e4838da656449c228468e14c1817e344212cb41608fd2766eded0494c37754a021c00a24d6f40af166009fb85773d5f56bb56b8cb50b0e026bd217c0420e00000000000000007a850a48a28828430276f3a0e52be968cce5fdb7f8e95755bf92aa6a95d62e369e3524e25e8a549e9c68b1a77bf8a882ac156f62a89213c852f6ac90265950ac4db25c4b33e6756e3644fd4913cfdc87f7ff9c3c39dd8d15bbbe40d514d887349b11b5d090353810a82a2318b85a1605872629144c1c2a4ba8914a6eb2560b96f71459350b0944437de0c17a4d8bb548708b9acdf1d26f978d194945086aafd4ed2d3862fb69506050832c0bb38e322b5f318700751028fd8a44be5ac78c0be709d1ea16604611ba9284c507a7f231c414030000065640026fc800643102b0580072e90013222054420292181404e45576edfcf2420a78f08308238fdd8a8180208a1f621409910054e5494408002004e0302601c0554b2fbd0e04886c31954488607c0200001044094540482b0230581100c084052294b31c4ff1c7456afcc1440e5d7e453755855b31e48436cc46ff9eff4bc093c4080a23d21728845c3fd00e041870ebcae0d05cc671180ad66681e8b3fdba4be22007b9dd861fb6f8fde5a85512108561703c11c6cd1d01110f224890b962585438ab63094921838d6be4aa3014d803f182c148895ae428125fdaa3a1c096a218c4140ac96dd279c0080021c52e406a5c8c18e9f1e47980a4bb7e58960957e6ea0140c4d0aed4040182893fecc00400100001293a48095e9379214876d5e310081572f428400197b2af4800400100160100007310200980f84c05c17a48f3192998b88a855b063860f4b5b0cf08801e29516107e44b5338efbc7bee24842f2c043908e3f09b4a9a0fad7c84517d0b8a592c50160bdc6fadb3317cd221201381052ab8b0fcb42ec28007bf6babe1cf37e8d4285d4c7383a4490b5afd5d225ed8afd408250543cb0222f6bb2c46076e64e3c34d360a1d1039c2d250010262c5eb453c025be06d66604200085886235cb792040b427b621e187fe3019440e821d448a2041de865cb650421008000082101e05f14243c72565066cfc0a10184ace02d1a4820a3489ec202339f69b018361e0b09e70067d05fb848049204a92250184001000018720008024001d9c80e84c0702602213814526faf314073c9f7e31000abfe3188a46204001001b01c000040100340380200802000008880c82c06017c73fdb6408102c754ea22380c1773cfb30048c2cff3149040800200001b0400064480b88e021f224ef3c43ae0f3058812b9ac4402b0fe53c8003601081179ca931001c004000022901601e10d07748e181ded44dbc1003316ad99800f002346d15ec4a61031f5f29162c043f241998c008002000014a4054140002e47604948412a408f4a03975aa548b6e9d48b2324538c79806b77649ce8f241c6d32b224e11d0fd6d906c76172424c2e41553d91bcf3bec67149d12b0553f9f9de2084af7052462971092314b842041841020812400c03137e7883a1a3c9912a336447ddfaadc8265c10aeeed5785fa3ceac7befc75014c9103fe2d8cffbc6cec20e14f7c4e55df7fd30d12b97c0812b40089c4ac8ec4f8b0c3e60f0855662a1a5689500050e20280bd81252104a9023d280e5d6a9522dba7522c8c914e31e601addd9273a3c9071b4cac8938475c57ed762e702c39c4fb44cf40b43f5b641b1d85c90930b90553f9f9de2084af7052462971092314b842052832023402001a76d4e51e9f8c5baba2cb93f782942e1324dd7878b4b5b3cd1139f3d1570dc1d32eff61dd9b93fff921ddc161dbda2c4ee20f5ce78d9d82cd9dd65244129db96036d3f7a947bb54ce82a5888d000514202602000d42202432000ff4342f694753a960a2b8506f0808323d887100510fee008e0346163ac86023cb625da8930a100040044070451e81fa48504c51d5f4a300024ea3c004001a82d7248004201082338be82b44801b40840f8800840200000f660000200882392cb150c48018d5a9798800840200000f640002e080800c03c0763161d8668648c15dea6500c3489e0d5d83821b8b384e9800c891651e580a13f416b0e0040d12f7c093881100400005ac8070a800100c806888030140160a0005a520042d2400923c80136f9004704343e424c8d3b85d0f131a97a5898c11aba494d28d32b120cccf8b0c604136a8aab3e0872e19a6b1f68282e37feaf8add46cc8cb5b90cd1015085222461a8ba71ee03bac40802882f5ba4540894087bf32be83014214766aa9135613bac037d002203eaea3cf4e24e57d44296d38c644299fe6e95b6ce40c21f8c2095e638401f870cb2808b36836304fa40ce1af86142819713408ca0e08bfd0d4a0abc505a0e9e1f7170201032e1b0f694008292b5ea41089f41c70b40b1c7c0db0ba5ea87140dc92602e22030055ecdb8b470c9ca83d678e18300276d3e0ac1040667f3163a14000276cc8dac4000d4cb0fe87011a40c1500a208ab8a92189840c03228c012c91001911edae1021042b3bd8d1c40000005dc000000e94d12a8126102700841161168577110301109f40d248800c88f6d71020ffab77d06388000000bb812000644a181840004b8d8ee3025c409801000030c402854000622400142c80038c90091900406801c3400c0200501002008002dec8019e8008340020200001005e951)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case7" = "QuadFull27Case7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case7 private def zz2114:"s0842"="s0842":=by decide+kernel end section namespace Green24Proof.QuadFull27Case8 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull27Case8 private def zz2115:"s0843"="s0843":=by decide+kernel end section namespace Green24Proof.QuadFull27Case9 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ private def zz344:"s0158"="s0158":=by decide+kernel theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull27Case9 private def zz2116:"s0844"="s0844":=by decide+kernel end section namespace Green24Proof.QuadFull27Case10 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l14 l17 l27 l29 l33 l34 l35 l37 l38 l41 l43 l51 l60 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x3412c6a33, -0x26deb9ac7, -0x430e21c90,0x1770], ![-0x26deb9ac7, -0x133819917a,0x6e9c24dea,0x172a4749a], ![-0x430e21c90,0x6e9c24dea, -0x1229298c00,0x2cb418f70], ![0x1770,0x172a4749a,0x2cb418f70, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(0xeeaa58,l14),(-0x18efc04,l12),(0x10f905726,l17),(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x2fbe0d5f,l38),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x194f19acb,l34),(-0x2507daf,l43),(-0x3ce3f89e0,l41),(0x165a0bc00,l51),(0x67230997,l60),(0x6c81c7f5,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0x10f905726,l17),(-0x3ce3f89e0,l41),(0x6c81c7f5,l62),(0x67230997,l60),(-0x194f19acb,l34),(-0x2fbe0d5f,l38),(-0x2507daf,l43),(0xeeaa58,l14),(-0x18efc04,l12)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x5018802000000090024803000011024038c03000138110058c0400250982402d00300000007802480300000001101c802000001b11018c02000019894028c0300014848004cc0400000161201cc020000000b00248030000000d8024803001a01040098c05000000022014802000008828030c03000000009018802000000a0603cc02000000f07028c02000010864034c0300000001601480200310c844035003c608c0ac03c900500000000e014802000000e09038c020000000e140cc0105c0a01c0175004000000098024803000000070024803000000012014802], #[![-111, -675, 112, 0],![3, -45, 4, 0],![3, -17, -1, 0]]⟩ def dynamicCode : Nat := ((((0x14280000177040b5f1697200e1000000dd24020003c46d9002dac0d11e38000000bb80360c2200450a000006f10816bddfc7331400000ec16d0630c2300800005a192abf63c11028af8f5869757c7ac34c2eb219c04e6a26a31ac42622452441c41c218214010008005c08008034000588c8a00000d2f003884ce5c31b52386118299ab1e3822833cf97ca18200000232800824c609594b0381236b4c1a5201d01d880690000008ca0523881400c245aaa2e2078e2438d3e644709a53114f8304080433d50c10f2ce346820e96924c3050226a5eefe2016a3f37de05a040840200003224000e5480e8cf0d99ade2f518058c745a10e181b5cd1c8e3a5ff2199018692475730faebacdad290e11f1475b253a18a3985b620480187a8ef4098e3995e0409f66bcfb5eb3d2b3c01802a6da4bfee9e4a09b22521a6a3319d91b30e2705c0000b10e74c003c750d94c8f575aa5659c5d5d5ddd2e5f66635d0876a48000000000000000002288c08a08608c00a0080238ebb954629481d3c7fa95233fe8341f9027d8d287a216feb5658a95b0250bc7347436fc0f89d11ca46c615a1457f67484db9807c473338a865f3640d73db761caf23e80e008000e6480d92c068960320a0180140d73142c5f8b0e12b6c5979e7830499207509180a10e7974e3fe840039e5c92bd20e02bfaa5f64fe280357d0ed234020a6d61c7d0a143394a5b5985c6e4854040919d55466f1a1245a49b3331abc8140000493e002c000000493e009011d5f51cf7020000002932e010721840a8081851b03a27b6302879cbb1e001bc50dc47b0f9d6cc918ece495ff968c20000013c6800c303c28c7739060018ce5c93d887001d5a1ceb568a000f6054d2b4028890c2b0286964c64f65be42c849db7259e9963c8200b5b914a1cc0c1a7a3f838a0000034bc0082168f4acb5602084e8df81630d0001f862a4504005f649be8540d921052038c24adb9bffa526115a5a6c183a2c833d9b5d8ab90300000101d0051405b52cd0781861e43d1c7382c13f3ad318611c0088fac8fec09008ae962c64f0920052040c20a20514a10510104c00b00a032000200db28c08b08208104d00b001000032000200dc1877767446c59a2a58d9e28cb9a45429f186e82a93f25704e016280002b99cc78a00b0bb3c911161af3281048d3bc26fde8cbab296ba4c00720d80001d8000800051600334a6a33ef77440024cd2642b9b5bd17cdbd24800000209661e700a10000008259879c01040b5d07d048548304000efd2c4b048e5c0c00000104ac922862c7e221c00e8180000442005000161880b82c001ee88004ee1000c15302b4574eb6c6383c204ef7b3c34bf9988388000007735940004080000077359400020842eed996eb7d20c009c5e72a7459f808056c03128fa874c05f424038a1b82a000084c8070ac03457c4116748a4ec1d4cd080c000037c6cdd72001c3a704be414ca796b050807a5b489cd62f3f0c205a8c6dfdeab1d541041f48097b5f70c7a1000792377ebee14c500005e23b6332b93cf60014984ea788203e07000014d10012b030291d8da4b4d0a2835b5cf0ae0c18d142bfe568e1000001a5e00c119c3e0a93d0a10309a06ba88e08a686262020c0d50beee0a806014e279111584921050030a1c00001a5e0102e0a3e714472440000069780409a96c22858490ca63b56df6101e2c41103c424226b83be5f0100d0427a2b5248002701851181ea150ad143800003a980489586cf8d379022af74a89fe406cf8f521981216672d663b05008ac51fc570a03369f29a034800260140000da191e3239294f091800000bb8080d17f9e1ccc70c4236e3a1c808494fbbda8708a60c41ae0804fe86256484005d53475c4a0109002000034640015288048280580402a020140100980804804022020007f520201b92abf63c11028af8f5869757c7ac34c2eb219c04e6a26a31ac42622050822001c01400800414ba6aea8d3c713f3931be6664065e8afdd56509dd5c143bb4c38f3a1cf0d1936c3a289ca218caecce4a51786d8e6288118af1c0d2e818a1c50002a83d0604002a80c5280b666cf6889000002bab61c00002b32a5066102200860e000233238fa329148380000e0d000146f19f8832080e0040000324c044c5207d2080847504cd020043b587fc0631021008007808000314c0a63b3c6e71430367796f0e0d300812403002ea3f48e001935487a401494608402000021c40386601a339084d387826c9d2ac0fa5c6c405c1a29f) <<< 16000) + 0xca4948e3d7f1414b0da563ce8cb1019597767bc109be5e78f19d8d49145bf0ebafbbff31e73e54def0e15addd1820bb0749c4ca000aec14f060c6a38facb8c0a15170586d7b42a3ed3ccfcd3a0e9c80d50e19632c702ba0a467b3b816b8bd03da86b7534ef585da3b299cf00052f2c4d02e9e8fba9572d7fd6c6b54c060cc4595fec06e1cc7d60d6973c23ca4314371e329e6bcaab40e40db3b2e62404492fb3611b2b8f76c2a95d796d3c3de27c4204a6fd8ea85c593c2de6bdf8aacd3974fb1b2d0ffa1a3df22bd1829c299bb24819f19e178c445bc944408454d4c8800c1db74421de47104156f3f8500188c0d8020010040000cc70dd0890ef43040d125afa3800122274000187eab38e00294202000400006f90009302001b3c75e5c3233b0a0d62e3b0efe779e9f6d9f2391365d81796126b0ac0000000000000000004733a6001e3a86ca647abad52b2ce2eaeaeee972fb331ae843b5240000000000000000011462603c7a45422afa32eafe7beec2b9d80785919b5737680fd480000000000000000044b80090404700600500005e6ec1b0baf490be47ac47864f0e4842ddaab2f6eba591d5f3b5254f8bd46cbf339e1c4d0c2e60a3973fe2f38e3c7f9b07a3e1997a0ec639c370592b18eebbf1179087e2919c90823078d00447630cf3a77959dc43e3b18ae65442f6be61a97ecaff375bfa798d796dd425b264a80600802c04000e824005f38801a701cc687282b9824bfd4e1e06be9764e344f022aca23470ae32f1ef8ca93c5e23bc50f5a02af09d8f8bb5f80000000000000000000000000000000000000000000000017d79416978e940b31831811011400c004048c98a3f2629b5eea9ba1b9557adac39ecf9adbeb0ac5600ab2213e48ac815b28820103a34272536d9d8fc42442df3331d2cec516a2b507945539f4773e2f4529451cc3f4fbeec96acd864b910b82c30017fb5b3e77eec17c8f8748772b92b999695988ae1d000000000000000000000000000000000000000000000000030d6511a38571978f7c6549e2f11de287ad015784ec7c5dafc000000000000000000000000000000000000000000000000be440c3883842841800808b554b50354b0a100096479d3568ca040acf4bf4b6881015e49d808c1810e4b370241000005dc0400f07a29cf06004c7129c924e104601000a01d103801889e4a18490a525d123107f647ff28430e0b850e4887b435a84410400004e9f12043977f04159c208c021230560e2dda508377d2d749225b0ac31f8504f1670402080361f814341005896eaaf04c104401000013920005844024040008ea40020fc8040e801c5600c02e1c008a3899b6ceb9b9f8d0f69c26f4acd77c7ac1c1ec8184025a5f06776a2f2f5072e4ce67f7d1d9a5c5b494b3288025a82f8bf5e5a631de4fdd63c90d7d75e4ad83b8405e180674a967ea35cf78857274a3e5e185dd34080157bc64800a0cedd80e6e07c1c30b47656ffd9ead322e8f6b5b65296befb66bcd9a1ba4418406326f801255a469092b88d18f3e1cd4e1d70e175c1e259d47903c4879f8a62d1717bbe759239fe0fe87f70cf18088b6e2c08b7bec1ab70a0705765d103f1791cc25b8986fa0a5b7e80000000000000000022c7eebe86677f416189c297c52faa7e9b53b1391e3bed06400000000000000007d70012f282d2f1d2816a48a38240020000355a1b1e041f5e18d679c0c1c9614c012dded789bf3743e23c70da48990c5bcfeb1d38e5a0f12e47aaf2ec1c3b957540c675b3687a21f77a2e744687b047cf44e6a29578f7b3c830a32fa9ef208776fbb91fde2ca228cee28d683ae0ab591439a8d9d46044c47d280506a08099c410045826bdc0090508002000a020040100008298022cadf1b92576fc9c241c482a7754729c595f2f79c5f274b3a9fd0718c71855a7d2172c57162b1c8bd532ec2578bbef40a6163576d04f94a59e1000261766614ec416561140a74705f6ba00a929df43bd686368523019c312aa620c299f87098db89c94285467bfdea424e20fa7ce7e03b2e74d300041943c8bcbaf493983c9324ea0ac24b82eaa58fe388dabb991cbd451cee053006a5ff4349ff2cc3feb9326a238261f5a8accaee97806dec7e43b956170bb1085ac2eb569fd3f86710f757524263a9b4eb42f6c59a914b0d145f19f833a23d89be80f012afe1b123a1065b11f8f04f087729a810050597d9e564ba5d503de3be546b7c01a8cf5e242c267af0a4dc036e14308e70ff49f8f20f18a0066e7932539583ee25f0e7c98900979310423a85b87cdeec56ff14ac18cf11fb5c2d750f2d807c9d91daeac3acc501662ce94b2cff458880fde603d35c0ed68cefe0bdad94421dae9573e96c09d6a10a0656c458f9666017179ca44f160aba1e5aa988647d163ed479d6da558844a109100c01004401b130b5d022183a00800004f20001184014040080200059120019ee400536c800ca49a0bb7a52e8d6ab888e115f642da6ce89bf1991b5810a6443655c372ea3c850000002cee25eebc1313b7b0a0fa888a13212eea694968916f02dd6b22020193d0ac48d725510456f449646ba73c58240ff3f63730074c624d433ad0c09f28b055223b2c16fff3788f1fde4c99e97ccc7c8d7ce8714d4bb2662020ad9ff94e6ce809c089f5638b596d3b83f80fd8c539bd16414ae113e69a8e4e9404fe6523052a7617232484560a7fa9a40689041c8918fd44ecd97ab088596330adfdc9bd0a54c214d57e1024481cdba33019ba1272988000c04004020006ac200202000010016f89)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case10" = "QuadFull27Case10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case10 private def zz2117:"s0845"="s0845":=by decide+kernel end section namespace Green24Proof.QuadFull27Case11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l41 l43 l46 l51 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x3e7ff2af1, -0x26deb9ac7, -0x430e21c90,0x20d944a0], ![-0x26deb9ac7, -0xbb880f345,0x16eef2a8e,0x454134429], ![-0x430e21c90,0x16eef2a8e, -0x1229298c00,0x2cb418f70], ![0x20d944a0,0x454134429,0x2cb418f70, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(0x14ed510be,l14),(-0x4fcb2259c,l12),(0x136f85870,l17),(0x350a2ecd7,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x11b0c827e,l25),(0x4babc17a,l30),(0x165a0bc00,l33),(-0x2fbe0d5f,l38),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x194f19acb,l34),(-0x387df64,l43),(-0x3cb75314b,l41),(-0x9a089cea,l46),(0x165a0bc00,l51),(0x67230997,l60),(0x6c54fc21,l62),(0x23a69e5c,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0x14ed510be,l14),(-0x4fcb2259c,l12),(0x136f85870,l17),(-0x11b0c827e,l25),(-0x3cb75314b,l41),(0x350a2ecd7,l15),(-0x9a089cea,l46),(0x6c54fc21,l62),(0x67230997,l60),(-0x194f19acb,l34),(0x4babc17a,l30),(-0x2fbe0d5f,l38),(0x23a69e5c,l64),(-0x387df64,l43)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x6c2806300800001905400e4c040000061144039301000019a29001c8c050000073164011301000002cc190088c040000000001c05200800002e150f015002000000820a01c300c00001c46100e4c040000768c4007230140000002611038c0200000000098052008000000001d024802000000064540f30080000002e1d024c02000000028180f30080000000f07028c020000000000303200400000188a4034c0300000001e00132010000000001a01480202884186200b240140c608c0ac03c90050000c4321100d400c0000001e11038c020000000007805200800000000a0c0cc01000000000440920080000000907014c02000000000140d2008000000000502480200000000024062008007c0f02101e1004000000220a00c300c000001d858024c030000000002c0520080000000d07014c020000a43212029400c0000000009034802000000034280d30080000000d0a024c0200000000054092008007c194140279004000000044180e300800001a1507029002001604704803640100000002215038c02000000000880520080000014864058c030000000002409200800430a011014d00400000000007032004000000000140c80100000002814053008000000a83004cc03000000028140b3008000000c824058c03001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x2506018c0200000000044072008000000260701cc02000009804c0133010000000098004c804000000000090320040000002611014c02000008c745409400800000001e1c0cc0181c71c60c096440180000000905034c02002448118c0dc4010000000130d034c02000007854140540080003a188a4099003001f8611440464010000000088004c804001d0530a406a401000000000050188020000000024009200c0000011024038c03000004e0440163010000250982402d003000000001e009200c0f208a0b4063100500000001a00132010000000001a01c802000000000580520080000001b11018c02000000662500a300c000014848004cc040000000584807300800000000b00248030000000036009200c000001a044038c0300006804100263014000000000901c80200000630880bc301000790d01101910040000007209014300c0000000002c0c801000009434180a4008000000310b028c020000000c4240a300800c828c49029900400000730e4022301000002e1907029002000000821201c300c0000002a15038c02000000000a805200800831041b0269004], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x184241a4af1ea9820b25984b869218000046500181014f9f81a0160b66fc7a3ee1c00943413a801804452bcf0df100060c6a89fe20604081401030b36c32235334504ca099c8304310e18531243000001f40342375027b8a2811a64c066c340ee058ef2a240594b8fcba032030900418300000383c7c0f125ba18466e5670815ff0d08e1f302090d26a30f696004d9a0f492cc500055bca4995a0008d98bbdf78c0aece24fbbe53327042d0344108851980b6206031b2daf750152462e21b278a00002ee000410791c35d02000466201120f0020d94c700600000003e8088002501041088e636f0c81a00485c5f921400001770202adb9b72203c5000005dc080027c4b7dac0000002a4c94e004601000016b200066460d98af000000006a44194511164d683c238a308706686282700500000980801006800085900065d20010426c800d152242860d34a188d088f936ee8c094da8e26380e86267e25001472ee4e6001f0086975f32dc1619830d3b2001a0040000361e185eee221b0c2301de3160304ddc760d638096a57a684d0055e2a1b12c000394aae0a004a37dbdea3801100a3872a4) <<< 16000) + 0x1fa7a186103d5590e0829f5bf61c0cc57a0910c000586c392800f80400003e080013c9a13caef6a8c229de45f2412cf0fb11800d80428203de7c3a482034ca66840202c2b43c6003e0100000a220e40a00016820e202067010002f59a2e65acb26ce8c53000000000000000005c619dc307628dfe967500e207b5dd5d3c2189659639410811a08a0960140180401006e98000c70122c70badbfab96194e1f3520a0a8b3ad1486837ba88abc1410bc2eff080005d00d7889c10840200002bc41b8240721207005037828000da8d1732d6593674629800000000000000002e30cee183b146ff4b3a807103daeeae9e10d06cc578000000035220ca2888b26b41e22c21c20821c10c104128046e180200db08efa38cc2faacbf6e6da110aa971881e9e26c4fb82cdd41058ba8bfc955c9af1999a7d9b51844d9f2aebee8c7420fe0c10f1dddab339c3b8209b1de1458ddd409f9a14b53e2b03126ac9b62af6d026c5c9f51be4f9ac9c9f20fd9f6a610e18709db7e6928b622b0ff7e050a5d145b919998c32d496000076640e43745ccb5964d9d18a600000000000000000b8c33b860ec51bfd2cea01c40f6bbaba784312cb2c72052c21412c028008030080200d8142ccf542b2c2d8712380030845ed40f83411b507269cb0485c78bb01400710c2e4c00022d7ac982704220080000b2906e090368281b0140006b840cc4400130c6474698853a2c2797481a6202afd169f91c2ef68ebc024042000848e684f4398245116d82ec12184af77c6880ab35a68e82843cf90cc51c1582122b8880188baa6c0100e58abf8050084201000018b345ccb5964d9d18a600000000000000000b8c33b860ec51bfd2cea01c40f6bbaba78433e23d35d35502c8818808a047046044049009683a8121f130f3bbef942865a293ded2c86863265b7b43afe2bfdb530a1c171bd37c47013e0c5d2e09c22cc95a00062041ac3405a1a0640903184809424000c1a707fe80946a9af7e9f07318e60598e6a8c304702aa2add15382ba6ff70a316ee6b2800105afdc529174b9cda6f15b02a63865041846005003019fc51e50215ff35b60ceee0aa4df267a493ef4361287435e6187debe0bfc9329a4ab401735ad06a71c8d123406eac198653de1e304fdff0c20f1ef1b038010cc694c9820f80201a8140d2020000cc20d003d2427525eec1020479739c3103281ec2df2105296b37950d0034e59d8e16017c7b2d194660c2300869048ae57e92043fe04a6b8819455bd8c020ab84d1a2840022b0213449420840200ce0200011b383ff404a144fedcf2cd9a494c0bfebb1e0e048b4d5350491e058295dd052fc816660e38618460050030091f9a19fa3c60c4a6929ea140f13ddec1c05873b80d2e5974f8c58b95e65795832286ba0cc020002812000a2640b45723b3a0edd2070c8ad876de4840f872cf42027c31d62e0e149c487dd4c046dd87ff8cc084201092087e2b08f7a1530722b0c497627c891c7f3b02bbc4d11c31cbabc7be30288095cb9a9f086101c2a89bef21c1048905557cf31d52cc081b37da1a685400c031d1b889b910a7f8049043204800013098155156e8a9c15d37fb8518b773594000804b18918818614704404304500af95d9d1f04f0cf6c780e52a11b2baa4f3c3aeac042d08340006b8832868190240c612025090002e51023190007c99a2e65acb26ce8c53000000000000000005c619dc307628dfe967500e207b5dd5d3c21a0d98af000000006a44194511164d683c4492286186482380000830259e3674ec3d239d4d04c512db0c5c84f087cb0d969cd4826d28b42631075a3efb3e864b1d9ae98c609ad43833bbc2ef8e46c29b05d5a2e65acb26ce8c53000000000000000005c619dc307628dfe967500e207b5dd5d3c2189451841431420821401200800380c01006d0588062975cc3a24e06e6aca731439565d7081d5145eb9ffc4fc0000000000000000008c3bb8d2f9985ef19a3b2ca0a91451849841431420821200000380c010068001061062110001ee9a2e65acb26ce8c53000000000000000005c619dc307628dfe967500e207b5dd5d3c21b07fe80946a9af7e9f07318e60598e6a8c3046bcc28eb6f58de11d9de9a7a09d026ee65cbfb10ba4e70c97a571e00000000000000000023d0588062975cc3a24e06e6aca731439565d7081d5145eb9ffc4fc0000000000000000008c7c47a6ba6aa05a90108104106020b4d70e8438cf817e8bd0a832ef94adbd65fd2b8f8e7fb3254e066df6974d73f220b8f8e1ef91df02913b4ed4d93d8f446ce8453e8c483f2d7b12bb56ea4960c2dd5d8bd4619316688dcb6f1608b0a37d29e45035b9f493a861279377b4687cd6d2f996620082f3116b9ddef58824a35fa561ecd4190f9b002ddd06b08833fcf05000868345ccb5964d9d18a600000000000000000b8c33b860ec51bfd2cea01c40f6bbaba7843b10601169aa6a0923c0b052bba0a5f902d050c30c6082047011c71699a2c3f315cdda9d77c73290ce668a0838a60c1c28b986f4029190a845b014118fe84d4bef30d4f456256db51894432cadb84240d2455ca11d86eeaf6209996a480c1c33a7788c186140445e27ca00c6166d1a480850f45d119c208402145ccb5964d9d18a600000000000000000b8c33b860ec51bfd2cea01c40f6bbaba7843b10601282c40314bae61d1270373565398a1cab2eb840ea8a2f5cffe27e000000000000000000465a6a9a8248f02d0c20a1041070c308fd0479594118d01bda07643a2c2ca70847b4a48c2f59c776b5c869631)) <<< 16000) + 0xc0c25e485c0fe10f134deb0ef05e77b24b65cc211f8ffa156a23f9b24056f3837d09926ff2b0037ebaa099577dd35093846a80029f10620d000367102d11d3797f6b9c73bfc3b819bd32a79322695413d604d02aa2add15382ba6ff70a316ee6b28001011431028e28810410c00a006020e0400401a04a02061010000f21000c7920b23205809000e6c90602df7455218df6a4099c93f55a66930a1097c900f35b495272c8c68e0d117c3e41a5cc8822a547cd0374f78f0977a7502aac265bef7d40598e10c10810610e0088a0d430db13509302e9e8d06f7fd48199a39dc37fee0f14c1e6dd4ee9f21201110910881b06091349eeb7bd757b9f64d50c6a8b3e56d12438b3d4fe3cbb240822469cd85eba0cde7ad1f934367080b41aff694c380c1a0009546d558cb1e8ec3dd8605e58dcd1205f9e7b7cb8ea4e0a2b99400000000000000000822282182102280200217ec2432ea4faea8f4219d2dcbd5f9b1803e315acb857ea089ffe5340355f7620f2a5e32b7a37484daf9c116c790664de53e219e8699e999f24970a201c72987e0d44e0c662df106784e0eda7bd047264d82a614e43d05f0100020b905e0982e84c170140b60281b48de79d736c7091e111cbf1b0609cef9290742c50838c338cd2c88040689df4946c80065e4e36bc7c701491e5c1b89c5001f2c7532245414104f9ca7488eab2a0b0b00a1a586a718f158591a51018d1c963dc8be41e0e50e0c51941a0141038d813c50680000008ca01601bb16d22505000a6d2c0cc00e4081300834b064e2f5f73c969bb78b225c8aaca8f76d656752c7a8a915f59bf45af9cca1c13a5897851cb84d603410000038121c9c5fe8000d31ec04fbc180358a991c4b656510460900001159a1e677f49224963000001a5e028698d2b29d3248c093d1b4d00904396793fb30208101c98c9a0c016bc90950a08004b4e67d4005940a1380a0000718d0b1686f751e72922e9f971caa65640a2efdadac9d316206027776544c4045ea7a25e845100c7b29c7aefa4581255857eb4260c00e530a248d9602965c8182e03400010419108747d9a33e29022340d1da48961c422a6f296d95250636d32b0f7cc850c130577744df8e083d4cfc66a842808252cdbdc73001019cd948620573676dce3f911f20e385e060000234203e4301d01e143e1b13360a1fee5b167d94377ff423732460836531c060a0b4d4724c60c169a867986191794fbec10020dcfdb3005018460109242b9da4c03aac58c01d5486149ed28688c0be72201c1230a3d747895880c141f72964916d040a0fcf4d2d445810400c7573a7a2c0e0181bc2a739074092ef0186207800021c20300a0170500b0280341564c007a7992302457ec231f093e40a10c7fa4c51cb1033ccc17c580e20474b1948c0143133ec7722525807f0324043e8600ef41eb38a880073391e492890b441015812000086cd111c585591670918125d8d05e69021f9f856e8121c4099882c9d96506256030994c060c235506a198081042fb4e31f5140256c8e79f88200beed9423a2408441215812000087480044c100133120b433a1dffa0929c3bb2c609f384eeea68a1a43d4a3ebc512c5325a6da321c8a14528be78ff8c0c3c89e9ff5c0d83084020a1dd6bf241003b1e1702d85000d44ad6dfdefa12005c058a1e6b3a444a5df5fbcc58c35435078c704c0b328647381aa53e1ea9b196282c7b8f7841ba7c5ca15e8df021544a42b02184113813d648048fe70c01233925c272376398000000064a38d855c43c894edc800410780001529a209ea0c78c48e4a1cd58193c9356ca161dcacd715bcc911d023d79b2de0808cc54304dca94b00d9c6a547abbc7001309e5b57ec59c41c10c00e00003a670a0a1b422e4a8b24982a3ce6562c63a715166ca4a1a8d3013f8cd2c513f736c1d50a145f17f43b5c1c22efa9365fdc904011069e2de14003d23e3c59a42400a80818548008d2dc4592d22fa004b963362a0f40be50de6b60bf7a1629af65a9e7c50b6568f13f58e12b061b5a420000000427f8520009805000036868d74ae62f33a543b0a69831e304af407dfcdb0a05222cd8cfd840000000000000000008c251050e40e50a488404580280e0100401a0003524001680d930c295545170a158bfc4230649229336877b09d244442677dde14304362a6b537a480400e302e7b904088abde5fe3c100032f33dcf5410014aa0c9a0bbc2400ac08164d9337122c928831676e286450afb2948e2a491477a33da829223bba88638e18218203325041023c35a8ee8c0000000427f8520009c05000037868d74ae62f33a543b0a69831e304af407dfcdb0a05222cd8cfd840000000000000000008c250e48e38c488406500300200e0100401a000352409404000b8c40b435447b02ebbd9014382d2abe5c01230600d2a6c89222bbc0609e99022fd5e506f0101845a1e948c0a11094478f06060051de5ec710400db4805b57164821400c2c9d2e8c14351050e120277f4598a14e108ada4b1122983ce0e2aa82442acf28eedc03062b8242e946080800f9b6654b940aa5966218202000380b90ca77089002b0245930edb9d6ad7db01d60287072091ed88dd6e0d39429101cfcdd7895fd03491452c841e2896fb59704885cf7ecfb2e26271b81830bc82b7faf7a4ee7e14094ae7e19332f9543400000000229838a5d7b614cf331ba400228440000b2480027d9a35d2b98bcce950ec29a60c78c12bd01f7f36c281488b3633f610000000000000000002309031028c29018e11200a00602e02004)) <<< 16000) + 0x01a0003564164040b00200090120ae320561102a888150440a61a0520102880800710880f96c1407609e2b800b16c8f1e1d6de994cb3483ae63b3dad1eca1c03bc3aeeaf148ee30b9d2505bf1670e1c20d850049060b1db6e6a2c5a8f2aaf14f4cf16e6d2080113f7de17f3a54f21e074474fa52394bc791545182112ae2c67cbf53829eab1fabf34500d2a6cd36e4c20c133f3bc7c450c3171793758be02baf6717cb09c0a4bdba5ccaabeff12454c081f546eeda620ce3cad966f71b7bbf8f1dc72a8bd0027be7c17a4dc891ad202843c8e1b06d8042bcc5b815e62dbf8db787496c262250788c24924c2091c804b00900800070200200da108e5d0f4a039489b2f1000e804200002008000022342144c1b49407f5334aa2001d00871c7c368a060c1acb4a8807ff286d050006bbbce4001c008000060100014d209c0204d010001209b20a56f6094a1006a2ccc0a046428341c504ad3b1800401c6070a942021ec87231066102000802080800051881908c130160960bee8aa431bed48133927eab4cd2614212f9201e6b692a4e5918d1c1a22f87c834b991045662c78e8320296a2e3c18b640b4792a3020ef2618c87b67054af316e05798b6fe36de1d25b0988941e53c32423002406e9d0e7b1f175824ab6243581e10c6175464b71d0af5590020accadb8e9839ecfc3e2b9e18112571684a540e2667be845e7746824d0b482bb32111a7d00686b35bfa93235ba088e20b6046cdf19a80bb33571708a93b5d2a33754eb22cf944bb9397dafd86a215792a7241b09b2b855460c92019ac0c00769bb64ee93e73c17541ae1f76a963649fcda23e052f620ad0e0541092b9c5e45f624a90c0bf79a07d7a65aaa962f588c7405a2b40122637a6c16c745662df7c295acc448b9f88b8918effe501be9ff1b727845eebde3fed4943f683e9b7bcc30ac16d01463d00e7c37b8f23474460c433a9e39a21562d6d6dc1da2307e0513a5ca349a45a7ade7b89f263aa0f08ce2ef170a4845a7609b115040f9403357401bdf3da29cddb67d0de02c20ce86e20d9848c5a1cb3c8dca48c7eed021b4b563093b46c486a96df9f010327cad14d3003c9df2618c008002184053c1396303ecc3cd44100036d4ee46003e0100000a130000100401c8080000dc8000da104a010004b5904901e8117f39aae50006df94204005399d90e8c618400108020080201201408e0200004c3e06db370a920015202cda8c8307c01008c020000912086220001d3205a33b5171e0c5b205a3c95181077930c643db382a468e386184502202182680500980801006e1400087d3c34406860f1c90218ff47964e0c219052142075584c2d21020e48d647cc0042010e20216f46644085db6e54838314219a83081c23a6042c408722986e24801483f88998008402000025e41141400051c63c95181077930c643db382a260c40430460238240030020090284e40b229d245f9f62c341e1d230189015500015a38300a2e5ec0c14728bfe19008135e89584000c160c6c8004001003901e8eb27c785a606015bd4ac2862fd5689c482351ca82e38308aa4c862821daa687810071f59b4d3801000434731c8d7d3c50c9bc087a124223e3500cc70407561f921410747a120c8001a599cfb1809a1931f92700220080000b190002d3208812043050001ff100b090210481042400132640068b8f1d0ffae7b0604bb3c35b8107a517f748b0065459e4514905080021243dd0e65a92186e0d8db8c084c66d4e820e88e793506061db8623a32861000400cc040800200012d207e2b03e1501e8280f0040004ec78c3eea8c00995a4e206102ddc0a0c36debba8e091fae1ca8517b31810133fd7060036bb30c501811bcec50fa116b8802205d63527cf75c9060783503286480035445d7fb98b1e0623d48a923fb8b7917146da00975f5250e587e0f80002de203e6301d01e1862f545cf30d8b2d0016eaa9fb58b2b98b5c7efa2c04edcbc06c208af0eab83af75aa3495c39af1c9bc004f2439d87c4fbb859097ace5859a231c004a14598ed60c8394a3773131049d528e8fb25e73de0a46a608d37b7ab07e9a09c4d90b624fb4c92a25bada6c1b77d3c60d5c254d2a794ee059ad052991e90d3664da55ea24c13c72ce6419a6cc3d5e8e7c85352c501484786d364548fb163fa6b8fc313ca67d58771726e197db41bb1861a89bd128e02717d5272687bcda7ff89453007e6de5a2eeb780a9fb5368fba7e1cef3ee719e39bd5fdf437e10418cf973e4256662adfe9732c43c494d60a365f34ae26c76dc4bd530032ffb9c56a255358ed385092ada620112c9e71380d88a69fd39745bb688c4e2f3afe33e290d9a090732abbda47bfd101bb32c6519e0c80a5238e276116be584cfb43718b817694c352af7ee8ea6a8d41c684bb55b21db3849bf06429ebc6542519228e110d31443c242b61470d531a3685871f137dd688684d5db85d628200df88219400b67ec1604903084021045a272bac8e0dbb33c086440842010822953fc4f09181051caf090cd9c8b550900221a1c28a0210002000034881d8280005fcf7455218df6a4099c93f55a66930a1097c900f35b495272c8c68e0d117c3e41a5cc8822951b1ff12f596588d4c69142bcd0ca8b9c60a6cdd5ce4922f000000000000000000841f26ce1c04205952a476f0118168f2546041de4c3190f6ce0aa8c31809e00600902eee6ef6a07ab3560a8c43b1afc6f50b68497d0289eddd7e009cdecb2aa1b4dfc0846a93b83f7c9a52f77db91fef5c56c8c6f2be92a7d60c9bfe6aa)) <<< 16000) + 0xde8838689dbc9b2076c3a48f9eecd8174e428228c9450005c330000100401d00c0e40784017b6821401eacd7d42202125c8c7c8c107c021840e6fa3780809af859ec9000d04790b0a06f292c7c920210004000034c8000c910380901b82800088c8005481b22b53bfd9230009b3d21c1122142100801b0080d40400015e40604402e220161100684bba2a90c6fb5204ce49faad334985084be48079ada4a9396463470688be1f20d2e644114250d4b39ebaf088795d1aa5bc5fc9ab08e1824662c78e8320296a2e3c18b640b42053012812c014055168f7e3befe29cc3d0c73f6352d0b5b4c735647eb7638e7aa19ce9df1cb091362f83a214234136f43a312b73a211c2c3971088b69f6e19273406bfa6588ccee290851d764703848b76248c03510d884b0a3300c7b1901084e10e180811e75ce190380046cd87644498508c021a501a9541d03092e6b31a1448a06cc4c470b0b8e0fb82384085d53b3dc3401ed25ed06480292ecec00449c508c0200002e840d0140660a0002fe20640b0310101800c001f70f184d7784d49e6f1c92d14454ff092a134121665cac8c5b059afef76ecfd1c12651f19bdb1db34b53c680d99a7ec24921092ed2cbc61878be784c8a000c2ef1eb3c73da9443b4bfa3281c663bdba6b3a4d2a740e8701606e1cf63c98663d502473c9664d1171a8f74d7ce07d683949ed7939a36394b0409c41eaee17ca46640577b87d4ed5820e4a107d9706dfaf44e8fb320bbea7a3dc37a3d55a722a389f6a03164d2be44449bca016460fd46cdb100202b48a14fd6d25d4bef27611bc95c67d4a1eed98b7c4009a0a5844537d8ace5c970ef9bc41e191cdff85432141ebb6391acabaed4c46c16c31f76204b3431357538d12a81f9d2234d36145227ed5be96b471f7e9200d8019891d1ce59f9f7814e11538f83f48d9c8b58158defddf7065110827a6b51a3ebfe9f53dcd9d64403d77076b871ff1370bd8ee024d08927c653c7c54c4b1179c4dc572893cdea5bd75906ba51506efe64c1f7be8cd72dab00015fc400a8548027a6186255ea0fe8af2f0c939c46fe82ad4598fc5872fdba9176f07e80000000000000000022951b1ff12f596588d4c69142bcd0ca8b9c60a6cdd5ce4922f000000000000000000844202300280080a1059a9fa16e88f26eb7378f2c33841f77c1b21f617d658ca0452d00996c21cd8e3e619886bf7a7e3c08cba3ece7887361ace2a5187be7e444fe058bc2cac2c4e2ad7d14d49102fd34470a98c54ad6e5220d0c920c8c7e21dabd7340a12d64f7a6744be8597f745fa4a01864ca0736ef803d3b3c9fcaa481d159b390b97381a322e5419c313988aa7af1ab515f735e3ac3c8a1c92a0f40bc0405c02000740200b8164023938c08d6127d4813860ab00e9a384f7e77c70c560a2a5e968284e37cde84d8e99990e116103587d91e05150e0975772200bbd955d723d7b789e9681007666ee32b411c58cda00af136cecad8d9ccb9386936561ec09db29dacea82492e0e326828ba618500c4408c2482aa12023dcbd2378a11f8de96204043761ca6410381e8cbaf54494608402000021c40807605a338149a9d50aba1c3c20d77c80e4060583b51bcc7b0da0f9768e183c12984812b6b3a81b146490a0a20858699666f288f69f32030473befb342b0254d8e416a2200c2bc9e9798e91fbe3f9e5a15139ef412830f7b69389f98476dd6df4c7fc558c311fc09a12f3a629e613830e2c8722547cd0374f78f0977a7502aac265bef7d40591441220e20c10c00800200ad26cbbfd50af9becf871ee3f5b28254558e98d1d38a2f081707fe8095aa6bdfa7bf947a51da4a26d90212bcc5b82e60f8b232adfeb16c2622507889107106084082049006613fd59c3fc1977ba319446db5ebe2b8c3daff6e41ee1d8d140bf010fbfd11af65c453cf4b238a186a7131c88661f3dbe2249a45f87853cc0614a02028001a3902a090002959c96bb5be8e8b15a153b5244ea98819999268214393d381f28000000000000000000000000000000000000000000000000186a760ee080c82058db4b3a16f1f9c63f0576ea851abf1dbe3800000000000000000000000000000000000000000000000006222472072051831000401597381eb16181b006d837c4b26d4276375fe3f00ec4ae7e6ca65fd50cc9c4234c99dd00000000000000000000000000000000000000000000000000000d10adb84fb25282f81a76d38d597e9f25bdef6a345c2872f92000000000000000000000000000000000000000000000000030d7b70d2317326f0686a055966cb44afa56a4000000000000000001bfaf9643d8ea75da388e648a48818240038035b7f5def74cef4746c9fffbfa39d86a65e86089eb94318444a0140bb24d099b3f1944fd0fa5a9c205021c966e05848bb26e98ca01e7ca781c100080c004a9040030449dd24e084601002c01d8d71ff37373039d1a9f59981474f63b50c054aee96f45819a016e482a0842008c285298d24061062e785ec2c8186d14fa9630e0fc0cd460375356660280e165ddcd660421008000098900024f20561200040020540a0009af20520a000d942002cd640a08604e0a003015902980663d10389204db7a406609b40989417b431e97c40417b6336c1401767474ec38009cb30682338611004307fe8095aa6bdfa7bf947a51da4a26d90216b977898906e5502e6cf805677494fda780a8c7a10e44030945e96427986c28df7ed682194a8a230ce12efd800000000000000000000000000000000000000000000000000019)) <<< 16000) + 0xc14aee8297e40b52c82072032024c864784e238c127f020bb51a1f1cbc85c6dd7d0d01bd513bf4fbae3b88c3a8a063979c69d4b23d8fa82db63a257dec3ca16864ce26dc219a2742d28076df57e85a157f6c4020f3cf9c2b69585ec0f8dee43a3cb1dd82a06b3a914001810e0ffd01295d78443cae8d52de2fbe535d3641208e30e11208e08c08c00a006004022e4400401a00026470a4e3534e91c348401b9a8c0c44d0815030193322ea4101cb9233700402c008e0e213061080400981404a0a00015e3234075705a0c28f65097d040d8a9e4b81006fb264328c07bc353d922928a1000430a0c28881b1831d34d113040917926748303a29ad99a100457bbcba4650c2100801280809004000262400094c81184a4201763702fde431079c9d1d5fbca4c708ebcd3b87944983c4ae2951ffc926201abb967a5f9639376595ccd9ffb8744040de2623e66a6ac0bf9e59d93657e08110ec3cf9e977d85f0806d28a3f7e410168ec286d9b1484c1d47dc828b60455b3decb686114325a997dbd5d62a6b64ed7464af19cf25dd99841c85000440b8155156e8a9c15d37fb8518b77359400083bc1db96dac60ec344fab27ccbdd25bc02113b90143a37c6d1db80000000000000000000000000000000000000000000000000000685a8b8f062d902d69aa6a0923c0b052bba0a5f902d45084043002018fd016b4cc81cdab0e76e668bc6e1b1fc2da9306fc2ecf4fae103a8ac303593215648ca225d742e26d8c3a54391b95d5c721cd6e179a0b44f3c499a01fcfb5366c66c7fece2dcd57789592c5634bf0bca48f768bd135a0ab228b40017788108ac0801600142a407c9603c4301d01d8fb54a906e40e6ae9daae44084001001c01e114ea68be90132b976da182a94b1d4840dba395565010780118478b2bc9b0c1f086228e103ac4f9044900f96870f92020f804000033c8000da180000802006c07414dad4be8c1041a49b28840058d58083230421008000055101a0100008890190d00c04805c2402c120150500682a50d4b39ebaf088795d1aa5bc5fc9ab08e1824b06f8964da84ec6ebfc7e01d895cfcd94cbfaa199388469933ba00000000000000000000000000000000000000000000000000001a298d444aa3b40b052bba0a5f902caf316e05798b6fe36de1d25b0988941e52c208118000055d3b360fc0281d5a7d242ab53345fe849d6975bdd6bb331f90546cd81dc3c2a0f5c0dda484f1a5a51bf045fe99844a2cafb63f3e073fa2e091431e3419019bc5a7988d44210803bb6023056d3234fd2dda56c86e7af18225895fcccd3cd20ac22c74050360141b01305e89131fca94490c2364ca759609f361df7010155bdb4a9c48003cc209144251023008689776569724b049290a437080a679d0d120810b6d45f483800359f22d03000561caac8201b76e9481109c408c0200002e4744de4db483881f234f132c0883084021c50fb4961d070b4ca5a2870e207defcef02883ec214d308107fc1523c2021a3c765893021100438a3a8157d34e163340effb1c41b0b3d4f05101f4d5c931021403256fc40411022b7a2c00834a95d89c10880200002ca402c040005984048340006fa40402401e1200066336142971e9110c1d7609bc587cd6dc022418b086f34b641664202f44e20b814a942a56f6b8d3f4c13c5274391981e53a1bc4300554b2eda009191d59522f31a34ef4f4cb9cafb8bc153f38486fb5da4bcdf071d32b2e9668c2e5c9f5130d97c781fdc430a6e96b112abea85bdc0ca1c380bd647842ee072e48de2e29df7a6e6540b30cfc5968f6d3ebd2ae60350538c72ec9c10317034cb05879dfdc7f921bcf11334046183c010a1c250efbc9a27de6ecde3424933640838446d4db10800c7e0d778d4207c011e35c6e8c4f4b000128dce828000a4372f8c0084021e7a2c9aea61e41470300d1e214976a209e054c445cfc800400100000d13c605c2eb234e16f979bf9c3820c7351b2141064698a814000570b90c3007a64e15a4c084201000013120005c04000fd88088680401401e0a0004f5201c0a0009b92002e0a707fe80946a9af7e9f07318e60598e6a8c3046231d0d4f8cc058c6b07cdf6e8ea5b093885e78890261b14f3e485d908b994000000000000000000000000000000000000000000000000beb5171e0c5b205a1208408208a00205a3b16dca646f087d34025b926f077c81c2c61cb783967d398a1e0c1af0c5bdaf05e64feb433ebd395fde241ff151f2194ee5f99eea7d21bdafc37bbd2da72c0d67f2fe51e2bdb57cba7405424e91bb228589fc41c208024e7a001211abaf16da10202fce797020c5b5585f0328411004000042c806868030340161b00a0d0048680203400e0a006010003879002253200735c6830cfb815720eeb383a8ca7fc68801c971423901d934424903a6f8e1161404729ac5784aa79b5c3908f27bdbc7e5eae5c8fec913de745aa217df40804ec7fb8fb7015d5ec2cc0eff92998d45eaea8acc00b10a4f470b5cbf4301d3bcb7b77de1602ac77763b0479d81b6c74adc899f355b5dcb37a07020a2ba2f9a17f60af8d96cb9c18b787e835920f5c5ce0fff9c3b97093a4949cb0f779900b10a995e82f6bb71e89aa571bcc326275f43ce276a45c555c9e9e4d0204ba7fb6a25ab5b2dfe9180840e3b8a3f86fc2b62af280adb06ef130555b441d94afb561708e782db5a9225a33104802dbf675688f91ec8b21cf431ed0b5623c9830aeb25bf38f24536944861c260000501002008002160801988008640020200001002ee61)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case11" = "QuadFull27Case11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case11 private def zz2118:"s0846"="s0846":=by decide+kernel end section namespace Green24Proof.QuadFull27Case12 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) private def zz348:"s015c"="s015c":=by decide+kernel theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull27Case12 private def zz2119:"s0847"="s0847":=by decide+kernel end section namespace Green24Proof.QuadFull27Case13 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz349:"s015d"="s015d":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull27Case13 private def zz2120:"s0848"="s0848":=by decide+kernel end section namespace Green24Proof.QuadFull27Case14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1434f7a54, -0xdca1fe88, -0x14af30aec,0x7a26df7], ![-0xdca1fe88, -0x3d875189e,0x18011a,0x142e5c850], ![-0x14af30aec,0x18011a, -0x599768102,0xdca22d68], ![0x7a26df7,0x142e5c850,0xdca22d68, -0x6e510afc]] noncomputable def hinges:Hinges:=[(-0x3fb41,l6),(0x6373e9,l4),(-0x1d2b62,l10),(0xdc393966,l14),(-0x1051919,l17),(0x148c8f6bd,l15),(-0x6e510afc,l27),(0x6e510afc,l29),(-0xdc393966,l25),(0x6d5fb7ee,l30),(0x6e510afc,l33),(0x1d2b62,l38),(-0x6e510afc,l35),(0x6e510afc,l37),(-0x6373e9,l34),(-0x6d5fb7ee,l43),(-0x148c8f6bd,l41),(0x9068a9,l46),(0x6e510afc,l51),(0x3fb41,l60),(0x1051919,l62),(-0x9068a9,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges def s1:=qPath 0x1b8955684285cb90a000030023400f44dbee295e615d71b943fd0f0dc22d8b7b322e10b37b0ea313b2869ef4a82407 s0 def s2:=qPath 0x1b9445ad0285cb90a000030023400f44dbee295e615d71b943fd0f0dca215f7b32ed02037b0ea313b2869ef4a82402 s0 def s3:=qPath 0x1b92c774a285cb90a000030023400f44dbee295e615d71b943fd0f0dc1584e9b343327157b0ea313b2869ef4a8240b s2 def s4:=qPath 0x1b9445ad0285cb90a000030023400f44dbee295e615d71b943fd0f0dca215f7b32ed02037b0ea313b2869ef4a82402 s2 def s5:=qPath 0x1b9f35f1c285cb90a000030023400f44dbee295e615d71b943fd0f0dcdc6cbbb34fa0ee77b0ea313b2869ef4a82411 s4 open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨8, #[0x2004601041800208c0004c04a03200c060000c031c0c504048f01180c4030004130000b1824047050880000000b01140c050000701040c0010480000000b01180c055008a01040c00407ca06081010300082700000002c0c5010140000000701080c050000602040c001028000140420100140a0000708140c00d0c80000000a020c0405200c703081c0040bc000200460100101200007011404004048000380ca030c04063408c03240480302c000180420100040a0000402082400e0b8000000070110040500006030c042030480003408606002c26000000028204010348031c0c304080c1f343890a180c5030ecd183004a0d18406300005040c0c00d0e800000012021004052c04a01100410504c0000000302040c0500000003808201034000340890304040e4838e0a2c0ca030ed2063814a0300041f3808b02280810707c000000100100040500012040c0c00c0d8000000140810040d00000004c084010140000000c0108040500000002c040010140000000a01000405280830304180040bcc01240410900606f00005030c04002028a01200420204040f0001102400c101038000000100200040d3c108031c0c2090dc0003808101000412000100228080010190033404a0304080f0000000200400101400000007010404050000604100c00c0d8000140410100080e000000028080010140001c10202000c0e00000001808001034000140830300040e,0x3c58c01080c10909c0000000c020004050000b08100c0080980002418101000412000080618100050780000000b060804053410a040c0c01011cd0c281c6071004330000b01040c0090a8000180c204000416000090208081010380003420907100c220000f0220081030380003404601040c0e0000c011404301018d0628106030c041b000120118082010180003c08a01140406000120134040030380000000402000c0500010033804303018d02283080400141f3410a09200c10509c000000020104040500000004804403014000200460110080a0000b06200470102800024047030010120000d012c04002028000000070100040500000001804001014901200410600041f0000e012404103038c03200c20200141f3804c01140c00102c0004008b02040c0e3004a010c1800608c00034048010c04063418b01280c60406c0001804303000c120000501080c004059301340c50300181f00000003c04101014d01300430300181f000130214042030280000000f01080c054008a01041400207c000140820300040a000050110040010180004408d020404060000f012c04101018000140810200040600000004c0400101400000014020c040500000003c0c101014000300830104040a4408c04100430104c000300ca090010123420c09286c11018c000180c4010010120000000080c0010140002c103030430363004a01041801214c0003004a0114180a,0x1820501003c3200008181804405088000180c10100101200005030810001048000100c10400101e00006070c0c00b0a80000c0c10300101200000000c04002014000000090810040d0000816180c3050980000000b020804050000a020404001028f1220042030420230000b020c0c0020380000000f06000405]⟩ theorem v0:V s1:=(P w317 (S (K 19 nt 0x866f0c82324069036a1786c219203481a400826488473d922458c7447d218019430801d0c35b479c0d795bcc0685645be4b9900391220214f42840c5892470c40ba16550104002843906a0c4027c61ad799a06bcd6aa8e78bbf691f97ee8cdbb70e2dad55b7b7ac5be8b98803a1a242bf8902749077d3938620450821541c851062134034a6a02083d0720d41884d092005637d29f8fece872579fc39f7217c235484ae117f8648e2658a1838620450820f41c8350620b414825009f1894d0c46480c21084200dbfc9dab89f0082e9802103a00b020c81502203404805002) (S (K 15 nt 0x8f0cc0433c85412203087edc442a7106624886143f0a15f0e6f06890c014327600f248d03b9581a006480d22060688192034800363524601920348003123a8714080c08324060084211425de465eaeac100521bee4c0015c4066893225521f64884c7ebf662914299c4190af873f490648271e8e90f2bceca5d9f830918760cc12300b424681dcfb240985d4291f8830a9354883210203028c901802108404dfe76972d29dec00a5779698002cc809c10640a80aacc3090fe11f830a9264812c80ef11bd758c0691fdf7de4bc194a8814741982240ee12a0c32406008401023579f2b7bf80148a8c1015061920300421081d7843b2e6af0b00291ef3a6000a9202a241902a21405146f7144324069040a17944324069040800f0c320d9e519203481f4308014489b127648900cfec832c8240772a1418080a19046480d2000d8c30907fe332281cd83c150a0c04012886480d2000c48056188a19106480d20790c2004c226e481241e4423d12e3f84a5506022706c01920348903238c6480d2000d88c2008a31864f38c9018021189803906a0c400e04062081bd10772243300c901a440478c6480c0101754b7bf5ac2f79007b87e3aa7a75b19bda418003448ea1c53fc92107971c8249b501b7714b467595fc1ad3082dfb20cc0e200cd2042041902a0440681bb080a) (S (K 12 nt 0x2a59c2324060000709f7d4004c193017b9223fb2a480f865f0e892430050c9d803c92340ee55b00324069102d88192034800313524601920348003123a8714074106480c010842cbfadebd6d6080296f980025480bb931460a1a48ff244260dfc310494504c20c817b89018006480d220624a32406900062491804292340eeff9227f98925f0649112daa44190a0e500c90180210840f9c3b7e6311c780148a9a93000549012e20c8b90143986104597a45cf8308644a21de7715c5890c9c320cc4910c203f92ebd0fe4c1fe8493be94670f5bfe2c6475e7419800c724481dc256186480c0108020242ba952ff942c00a43f8498202b0c324060084210277da6e14ac80148acc0012a405448322e45a80c78d0e5006480c0100a7bf437e800013864c108610245145f1ff78f0142830058c01cc95a077099881920300420080000a44c1019881920300421080579425bce35ab002955a4c001484047c8322a4088a501401) (K 17 nt 0x9a1588035e56f40d6d1e6c39017322df22441110f20b14208448e18842682e684ea00d79684035b467f0e405cc8b7c883c833630ce49522470c41c340601e24398a33f65ee70d540192033080356286480cc000d89f31541ccf59e3276018248d03b94320c0e32406dd7639b000edc00513040181c23240690006c607986324069000624750e281cc18c901802108401005226000682033e4ed434b3204a1201840a19f845486028e6e9ab003df5e59d6c3ede39985821a64f714208cb0060c455ea57c00c2ffc676fec693f0434c9eecc86774cc403862002f49d301a226cc519cb2f70e6203ce82ccc2c81287ba57c1983cba031070a1cc4479d059b8463c24f758a7c6122148620dd004d91546ccd5943276030048d03b94eb00c901a440182c23240690006c607a86324069000624750e2806c38c901802108455ef279dee72080291674c0013e4061898a059b268ccd993))))) theorem v1:V s3:=(S (K 18 nt 0xb9e510c901a41021870fb77e43560fb5cffe571ee71a7d56ecaf20a4f8504fe2061438621450825243ea1952f390715e43e4f5fc1f7f7067eb2d225dd69dea7f81af339897961fe22ddc52f1374142c2fc0b1e903098a9046c289061430620450825243e807508177113624e19b83200c901a44ae0c843240690006c461d98e6248d4ed54565d57bb3246ff677550d6d3a6435e43547fefaa071296607b763734f1fc96fa2e6291488a240921d121860c1885142094127296fe2e3a70f8cb17282e444185054c922baa891232680c408a104a09390074902cb226e8dc2c58c721ae354906b9dfb65bf8b8e9c3e1079067423f0cfe0861740620450824f49c85126a8613ceac1cced999699c4051cde2fefafa2661ed06b2bf22ec5f10173c4c173f26a45e4af48fe45b5656f62e2eef1855bb2bc482840993d947b063230620450820f41c9210620230206f241c1083b892d08c90180211e27ac72f8b58200010a9300e2852d50c901802108402d53fbfca5d873c042b75d300e200b4202ce41902a0448893100a) (S (S (K 16 nt 0x862e2886480d20810c387d0b4b9bb07dae7ff2b8156ecaf208a7f0a0f568ec4c861840621550825243e9218086913624e2e550393863a1323101418085c1a006480d221fd83f887f10fec5a6839d873c2d32224474e9f07f849d448e18855401c2404a8c2193c03240691501040028401748c3a80825043c851801a91372d301ce439e16992eabfafb45cded6c6cb9bdad8d9755fd7da10e9d3e0ff0b3e50c42aa5642a8798c39755fd7da2d3d9ceea5cded6c6cb5ecb31a043080a906bf0a640a70c42aa544a6aa02093d000f985819006480d22a02093d000f900682036665b5656f6305b5656f62e1fd2f7ad956ecaf109058c8ec141eea0c3080c408a1041e83924a0c402624114c83679077225e019203489d8e30c901a407249418801488ea1c509d89192030042108097d6336d5a9cd01018eecc038802bc80b7106454811222) (K 16 nt 0x56182443240690c0cbdc7f1f06125c37c05c7e95418080304946480d2000d892300b724681dc3089227f18925f06490c2a4d5220c84076146480c01084200d75d8421fcdb000a474f3000521013320c9611a2b8336806480d22d7b8032406915000092009a5718c35f6bcea0ba8552e31872eec3c6438b0f5d2d3d9ceec1ec7dbd9634af27d00830812a284107fa263b23e80c42aa5b4a6aa02093d000f980315986480d2000d880d715a6040256503b8fc4915fb10c7f1102a645220c84076186480c01084206777dac79d90029249800254808a9064b095d021a9)) (M w148 (K 16 nt 0x4a109a0b941c3406003e4398c33f65ee51006ac08c90198001b180335a46480d2000d88aa0e630d9993b00d224681dca193c30192036ee5fad80076e0028982079c232406900062607186324069000624750e281cb18c9018021084010052260006820334595540e597ba8143276003e48d03ba84070c103240690006c6940c0324069000624750e2806c20c901802108401005226000682024e59100d61adcc00c901a443f9f2e4ce721c575e80654c5b21af6dbbbe1de4910afb8ce62f414bc2ddc7f897962c7a2fc050b13742120216343a93a030622ab765793e7dc07f0bcede987d5ee31ed049010b9058f2801c31001a26ab76579003ed73ff95c3e85a5cdd823d12c184837f30239b9018863401c240dc49b3186c0cbdc31b06bb0fee2f502cb8f481f9f90e2a2392e90c431a3a42a8d98c3816928c901a400189246025448d03b877f25821240fc192430a995488321010e51920300421080200a44c000d0403c88326240c9e6c0c9c0192034887a82e3c5bf45c88b9459841a40a488e1c244730b5018886bebc031857818cf5cf073287ea1aeff8f06b6a6aacb7fe48c2a69f33b3db1588712dd70ff6e5214545cc8b7c9030a3f82e4096684c18801bc3500009205465718c35f6bcea0808552e31872066f48c901a42da5351066f48c901a40824f400984d5805b15a6021256503b910e00c901a440e50c6480d2000c48ea1c501567192030042108073bc7bbfce120052187980027c809e9064c498502dd9)))) theorem v2:V s5:=(S (K 16 nt 0x24806921f043ea8fa1944a0c0441834a32406903e9218026113624ee6980324069113c60192033096bd966342e6f6b6365a7b39dd4baafebed0434a07fc6a203b922cf9c31001de5b5009f1b4317006480d2227866019203308f5d0e2c3c64bbb00b1a5793e87b1f6f65a7b39dd841a50900f32891e010c59340620044888201662035e461c8193cc3240690209412e214600c444dcce7946480d204127a5c492d7d461834e32406008062600e46ac310038100eb2099a41dc474046480c01012f19ce1cfc64001b96e7772958087c1807140651c6480c01084201633fbcafed00290f980025480b8106454811222) (S (S (K 14 nt 0x5618a803240691143d2a167fb54399e7d40c2799dddffdec1ad635e9270bf9f4fd24ab765788bbbc60b6acadec5cbc95e91fc868804588922a1d1a70c431baadd95e21fd2f7ad8b6acadec5cb6acadec6028b9222c41411cc2d40620e1807a902c52e6c61b935e7120e0192034881c728c901a40018971601005c103b867f3f9013e8831fc64928d240832038a022863240600842100fffe5b91e4f7a0052eed9800290809c906572ce01920348a8320806480d221ae73cd86b8e67c59eba7ffec1ea0b8f16fd10710444e2be4b1178ce406212dd400024808d984316806480d22a02080050802e91872064e30c901a40825043c851803115e7504042a8798c390334886480d216d29a96f66e9b92dea10c2828410b99201805747a4310de84127a00c0292c04a8c61830e32406901c9b98620057203b84113883b90ce00c901a45aa2006480c0101af4a66d6bf6400f334d5f12968c1bf18002f48ea1c55a46019203004210819f8f73d956c00a4ba6000952037e419033d1) (K 14 nt 0x146a9095c39f7217c3a1c95e7f7d29f8fec142f0325462865123862045bbb8634c429f1cfb887e01d77f89f321d77f89f3415ec95187f638d28920310f2ce98082975630ce5bb3818418c90185b0c5e540000109c4c000ee5e103b94327186480c2000005130401938c3240690006c606946324069000624750e281ca10c90180210843f9c25b852720802934980026880d49942137772863674c007cbab18672dd9ca18dc0d6246480d2000c48aa75630ca193b008f2e881dca64806480d379ebda95000000a19698204a02324069000626041c6324069000624750e2804520c901802108401005226000682033440b88b13)) (K 15 nt 0x977ed239e0d79ad5435af3346deded0716d6be8cdb9747e5eb87402e625be861e49164503fe0d2891c31084d05cbf87c5ac86bcb43c1ada3399e5efe9dc9cee1946b1a0654e52ccfc7700da918ed75fe62be6fff0e805cc4b7d103cb1061a54f471831096d0180e410e630cfd97b9c347286480cc12dc019b523240690006c455073186ccc9d806092340ee50c9e919203766dcac7c0017f887ec028a4c103d21192034800313039031920348003123a87140e5946480c0108420080291300034101ae2f4989b0b))) private def zz350:"s015e"="s015e":=by decide+kernel theorem v3:V s4:=(S (S (K 19 nt 0x1501b490e2cdcf3a0839884911f454a2363a1227f3516486219d252a80820014232921807b994320c0c3240690209ad07214618801c8cc191c63240690208550728c320c0e324069020855072005c21884d006e19c310c8632406902083d072a80820f41c800a886213424802e8c2b4886480c01084202e711ac773d0108f30352009b31296919203004210809aa765384ac04064c0d281d0053106454811222024d0a489222c419d1cdc6f8831486006d0c38b333ce800e6212447f1c3c39097f6a2c80c433a4a550104002846524b00e832062200c90180221304250c063240690208010487288310c803240600884c1501040028439004090c40290660c83338c901a40821541c85106213400fa6a02083d0724841884d092005630ad82192030042108ab9dc7d600104604640118624ad83240600842101354ecf11d58080c9811503a00a620c8150224440480502b39) (M w28 (S (K 17 nt 0x92210ff840b22911be19a830040861c5ea07f70d7618d822a482844823aafaf4552188554209490fa48601ac44d893864d3006480d225a6839d873a2d2e5d57f5f68b9bdad8d9737b5b1b2eabfafb421d3a7c1fe167ca188554da804a0cce0c803240691501040028401748c3a8082504b8851801a9137501049e97124b5f52bc3118c901a40820f41ca30cc3148c901a40820f41c8017086200d12024840dd883b890c08c90180217e3deadff2bd80067336e77d20205d8300e2850c50c901802108404d53b3c475602032601c40136405d88322a408911362) v2))) (K 14 nt 0xb12300c90184200042101f90b4fded502a0c98240c5a0192030842000b30a4b78d58c26081a718c901842000051c7e30e7a7230f4c001164750e281ca20c90184210851b9da9fd4a0100522930004a901e220cc15c3488cf80920349cd6ffe5dece3a47ef3cda59e70b6952aa152c198848200c901842014e718e3169f0000802944982022443240610842125b93eeab3840200a433930004f9014c372880192034895110cfa93e923e92a817edefc6b28c839c7f98ad3520da54406b60cc00729077087972447a19477520969fa1bc77c5fc7b685bda2e2514868198804a18c901802108401005226000682029840a4cdca3806480d225620032406008059f4f7dd6bba0261fbc27effe8138bd260b2c1850fc48ee8a20081eb1be5f1dcc85ddfafc842522e2470c6819800e02036a41dc235006480c0100a31afef0b4ec003e3ecebbbfc8014960c100d4619203004210805687a95873c00a54c0012040594c720387210f46355cb5006480c010040014a30efe76f010660850c00c90180203c21c8e29980004942b68dbb23864c10c2e20dfa43fd01020949e65e94b5c5caf2a5bb5b13123aa419800d12032e41dc054a06480c01084201633fbcafed0020507cc0013463145a8a51280c64b438875198019203084210ae7ddeef8a4b01004b5e6b9fac68115fb8f66b8fc189d305882806480c010840000001a6e93a46d0f289c60804828c90180210840395713e6752005d58679dac941a30005e987402f461942ab52700c901802075eb99f733a0000007999fa34e4922a3040f3846480c01084003679cb72b38ea0066636e76b5a62c93dfd26000db3021c6192030042108058cfef2bfb4008141f30004d17e508a0d3da028436a90019203004210fffcbcfda9005f8e3dbd667600efebea52bf1288e98220f2211e427392404af3ec6ef6af835a6106e06620100579a2a4a1fafd8fe1512c80d216b5b7cf4835a6103e06620903a00c42fca053e27b40480afcde18b003240600802dde3b1b015bf627f81c4c1240224543ff0f6580501e7376cf035efb5e978b691c819800bd30256119203004210800040980018ccac9877e1e82e1c83002495de374cc835b41040cc40200af31243058c90180210843d95a599f2c2fe21ac56b60218c0fe81d006717e4fa9f13da0240280f1485f11)) theorem v4:V s2:=(S (P w24 (S (K 19 nt 0x124433f0a1c18e4e09be19a430036861dfd8d27e0c2ffc676057a95f05c788626f88b1248e1884b494aa020800508ca87dbc7330b07bebcb3ad811cdd3560a20237c49888c18817494aa020800508ca01002041c61ada34806bcaffe0342762df45cc401d089124073f861012622386205d252a8082001421c925062013e30d6d19e435e5a1a16a25fc66195a93e0652e4f4ecd7353c696b2f56be973d5ec1b57f193610b4cb7d1731007442445c81204e3201860c188114208550721441884d01071a80820f41c9210621342480158c3aeff13e683aeff13e6473ee21f80634c429f08e101247512c379a6a80c408a1041e83923a0c416829232015731298d192030042108054853d4ec31b90109bf9811503a00b520c8150224440480521a) v1)) v3) theorem v5:V s0:=(S (P w269 v0) v4) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v5 private def zz351:"s015f"="s015f":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull27Case14 private def zz2121:"s0849"="s0849":=by decide+kernel end section namespace Green24Proof.QuadFull27Case15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1432efa14, -0xdca1fe88, -0x14af30aef,0x7a3e66e], ![-0xdca1fe88, -0x3d8722196,0x17f4a2,0x142e51255], ![-0x14af30aef,0x17f4a2, -0x599768102,0xdca22d68], ![0x7a3e66e,0x142e51255,0xdca22d68, -0x6e510afc]] noncomputable def hinges:Hinges:=[(-0x3fb41,l6),(0x6373e9,l4),(-0x1d2b62,l10),(0xdce0820e,l14),(-0x22e6e7,l17),(0x142a375e5,l15),(-0x6e510afc,l27),(0x6e510afc,l29),(-0xdce0820e,l25),(0x6e89c95c,l30),(0x6e510afc,l33),(0x1d2b62,l38),(-0x6e510afc,l35),(0x6e510afc,l37),(-0x6373e9,l34),(-0x6e89c95c,l43),(-0x142a375e5,l41),(0x2d4e16,l46),(0x6e510afc,l51),(0x3fb41,l60),(0x22e6e7,l62),(-0x2d4e16,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges def s1:=qPath 0x1b8955684285ca24aa0002fe94400f47ccdc295e615dd1b943fd0f0dc22d8b7b322e10b37b0e4432b2865df4282407 s0 def s2:=qPath 0x1b9445ad0285ca24aa0002fe94400f47ccdc295e615dd1b943fd0f0dca215f7b32ed02037b0e4432b2865df4282402 s0 def s3:=qPath 0x1b92c774a285ca24aa0002fe94400f47ccdc295e615dd1b943fd0f0dc1584e9b343327157b0e4432b2865df4282413 s2 def s4:=qPath 0x1b9445ad0285ca24aa0002fe94400f47ccdc295e615dd1b943fd0f0dca215f7b32ed02037b0e4432b2865df4282402 s2 def s5:=qPath 0x1b9f35f1c285ca24aa0002fe94400f47ccdc295e615dd1b943fd0f0dcdc6cbbb34fa0ee77b0e4432b2865df4282411 s4 open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨8, #[0x3004a01041801214c0003004a0114180a2004601041800208cf01180c4030004130000b1824047050880000000b01140c050000701040c0010480000000b01180c055008a01040c00407ca06081010300082700000002c0c5010140000000701080c050000602040c001028000140420100140a0000708140c00d0c80000000a020c0405200c703081c0040bc000200460100101200007011404004048000380ca030c04063408c03240480302c000180420100040a0000402082400e0b8000000070110040500006030c042030480003408606002c26000000028204010348031c0c304080c1f343890a180c5030ecd183004a0d18406300005040c0c00d0e800000012021004052c04a01100410504c0000000302040c0500000003808201034000340890304040e4838e0a2c0ca030ed2063814a0300041f3808b02280810707c000000100100040500012040c0c00c0d8000000140810040d00000004c084010140000000c0108040500000002c040010140000000a01000405280830304180040bcc01240410900606f00005030c04002028a01200420204040f0001102400c101038000000100200040d3c108031c0c2090dc0003808101000412000100228080010190033404a0304080f0000000200400101400000007010404050000604100c00c0d8000140410100080e000000028080010140001c10202000c0e00000001808001034000140830300040e,0x3c48801080c10808c0002c0830300080e00000003c18001014f163004203042427000000030080010140002c2040300202600009060404001048000201860400141e00000002c18201014d0428103030040473430a07181c4010cc0002c0410300242a00006030810001058000240820204040e0000d08241c4030880003c08802040c0e0000d01180410303800030045010c04063418a04180c30106c0003c08a011404064808e03181810305c0004804d01000c0e00000001008003014d02283080400141f3410a09200c10509c000000020104040500000004804403014000200460110080a0000b06200470102800024047030010120000d012c04002028000000070100040500000001804001014901200410600041f0000e012404103038c03200c20200141f3804c01140c00102c0004008b02040c0e3004a010c1800608c00034048010c04063418b01280c60406c0001804303000c120000501080c004059301340c50300181f3404c010c0c00607c0004c08501080c0a00000003c041010140000000f01080c054008a01041400207c000140820300040a000050110040010180004408d020404060000f012c04101018000140810200040600000004c0400101400000014020c040500000003c0c101014000300830104040a4408c04100430104c000300ca090010123420c09286c11018c000180c4010010120000000080c0010140002c10303043036,0x608140400f0c8000206060110142200006030404004048000140c20400041200004030410004078000181c303002c2a0000303040c00404800000003010008050000000242040103400020586030c142600000002c08201014000280810100040a]⟩ theorem v0:V s1:=(P w317 (S (K 19 nt 0x10cde19046480d206d42f0d8432406903480104c9108e7b2448b18e88fa430032861003a186b6943c1af2b3980d0ae8b7d173100742440429e850818b1248e1881742ca1ada3fe86bcacf89c1a52f8655f62e18f275a96b2d75fcfff85be4b9900391dae3bc4578173f2220217fc20df45c983102284100cd90e41a8310162986b5e6fc1af357da3bc2efda5eff5f2eba9d036def5a64adae96fa2e6200e86890afe2409d241df4e4e188114208550721441884d00d299f31b483a9c61d6563ea1a15ddc38f429e1421ebbf18ac51397ecffe79a7e2ded0655ce6c9f6a150fe06dcc72c071922202e404b37c39c983102284107a0e41a83109a124044661f63fcaf241e4773fd7639f710fc031a6214f845fe192389962860e1881142083d0720d41882d052094029a6253431192030042108038e76f4fc680419802103a00a620c81502203404805002) (S (K 15 nt 0x8f0cc9033a85412203085e3a454e60cc4910c287e142be1cde0d121802864ec01e491a0772b03400c901a440c0d103240690006c6a48c0324069000624750e281018106480c01084238f3319d718e040148b526000a42032049912a90fb244263f5fb3148a14ce20c84935f4c7e861209c7a3a517c661a856023064198246015448d03b8cfb240985d923f1061522a910642040605192030042108116edf9bac7bda00290d2ba6000ae2026641902a029c30c243f847e0c2a499204b21d7ec711ce9b3ff391a4f8194a8814741982240ee224c7b25d7e1e49a20525acebacd3b9d16128a436c066202a0c3240600842103af3dd6d78775c00523de74c00152405d08320544280a8cdee2886480d208142f2886480d2081001e18641b3ca32406903e8610028913624ec91201ffc2caa0901dca8506020286411920348003630c241ff8cc8a07360f054283010043610c901a4001b100b131143220c901a40f2184009844dc902483c8847a25c7f094aa0c044e0d8032406912064718c901a4001b11840114630c9e719203480e41a831002b9016f206c241dc890cc03240691011e31920300001f4b96ef778bd3c0546d8d5e32f68c4cf20c001984750e29fe49083cb8e4124da83e79496b9cfea81ad3080f6960cc0e200c82040c41902a0440681b2480a) (S (K 12 nt 0x2488fec886790a82440e12a7bc8a9c320cc4911fd952407c32f8744921802864ec01e491a0772ad801920348816c40c901a400189a92300c901a4001891d438a03a08324060084211d7dde66f7e04014934c0012a405dc98a3050d247f9221306fe18824a282610640bdc480c0032406910312519203480031248c021491a0777fc913fcc492f83248896d5220c85072806480c01084200e698bff339e21c00523ec3cc0015c404cc8322e40518618407f25d7a7fcc21912186e74d66dff1219387c1989221841165e87f41207fa12ea7a968dfdc2c647148330016648903b92218407f25d7a24c9420526c6a7bae2f4ac0b0945239ebc19880ac30c90180210840994eb18dbd0e002914f4c0013e405f88322e45a80cf0d0e5006480c0101bb2fcef1e000138ecc108610245145f1ff78f0142830058c01cc95a077099881920300420080000a44c101988192030042108056f4f56b531dc002955a4c001484047c8322a4088a501401) (K 17 nt 0x26857200d7959d035b4a1d0e405cc8b7c89104443c82c508211238621019fb9a13f8035e5a9a0d6d0fcc39017322df220f20cd8c339254891c31070cf9807890e628cf597b88303946480c34cf2f00000028980f193b008824681dca190607192030d33cbc00076bc02898200c0e119203480036303cc31920348003123a87140e60c6480c01084200802913000341019f276a1a5990250900c2050cfc22a4301477dedf001efad5ffba1f6219dc7410d327b8a104658030622194a13dc001efad5ffba1e7295e4fc10d327bb3219dd33100e18800d6274c06ec9b314672cbdc39980f3b0b1f0b204a1ee95f0660f2e80c41c2873301e761662118f093dd629f184885218837401364551b335650c9d80c012340ee53ac032406910060b08c901a4001b181ea18c901a4001891d438a01b0e3240600842154ff496ff6904014b7cc0012a405f098a05aa268ccd993))))) theorem v1:V s3:=(S (S (K 16 nt 0x4317144324069040861cf9de79491f7efff3100a769d60120a7f0a0f569fe18610188514209410fa46601fc44d8938b9509c9018e84c8c405060217068019203488800084910c20488a1c440f829308924310a280258806f984327806480d22a02080050802e91870faf8a6a960fe15edf15023b8ed20164c57e91239b4760d6280c428a1049c8790a3010d226e67068419203485442a8798c391c310c901a429a5250d6d1de035e4f751fe554ffd82df05cc5e2d07d7c5354b07f0af6f8aa3b8ed200376b4bc2f9a7606ed69785f34e7d55c5315a7218f6555c5315a7218f687aa538046ffeaf91d9d65128f1045563eb2e50c428a1049a80abcc2c0c803240691501049a8007c803410384316e969e75616e969e7556d2b3f4096e5b3f09058c8ec141eea0c3080c408a1041e83923a0c40258414e084209077225e019203489d8e30c901a407247418801488ea1c509d89192030042108097efa508635ce01018eecc038802bc80b7106454811212) (K 16 nt 0x56182443240690bccbdc7f1fc24b86f80b8f7315418080304946480d2000d892300b724681dc3089227f18925f06490c2a455220c84076146480c01084203cef5856d0850014863a60009f2025c4192b23457066d00c901a45e1a3803240691500009200a45698c35d6b8ea0b68552d31874dbbddbb73ce5d48c43984afa0cedca22f29d3c3d529c46730ed44185091142080c24890e61820310a2965292a80824d4003e600c56619203480036203c0561811995740ee18487e248afe92422120250600714076186480c010842067a96dcbdda0029249800254808d9064ac95502391)) (M w148 (S (K 15 nt 0x2c0c9c019203489443594f4bdde818fab4d071ae5be2c8605cd0b7b87990f3a5960b4d0c38b0e901047c704e188012b34771da4001fc2bdbe2a1f5f14d52c114201a41053cc30a3c9140621250073102402b4c61aeb5c71ee50a8edf9f035b6e7c0d65587c21a54910ef4d648716ae61a24310928f90aa5a630e1bdff326e90e8712d56018ff37ca339876a8bca74f23d6dfac8ce61da883480a102a03092e2188d0188494b29495404126a001f26ac06b0ac302e12ae81dc887006480d2207286324069000624750e280ab38c90180210840fefabfb465200525d30004a9013320c9812fa) (K 15 nt 0x134a5f4e035e567a0d6d1ff4febebe2d667c47a3d9265fb6839017322df25d4056f8ef21db040f24a0feca422460c42033f734a734f035e579c0d6d1b6439017322df24b4437f12be2630314307c320a18695448e1883867cc04dc8731867acbdc911634bf143480fa3aad4053c401ab023240660006c600cd691920348003622a8398c36464ec04c491a0772864f0c06480c34fea70001daf00a26081e708c901a40018981c618c901a4001891d438a072c632406008421004014898001a080cd16355066b00c901a454000249b318672cbdd40551b318650c9d802012340eea101c3040c901a4001b1a50300c901a4001891d438a01b0832406008421004014898001a08093962404586b73003240691147de88611e4c39bd7160c359d65f5c4e03d5a976e230886d5ede2185eb1906d4bf727aeaf655f9b90a7416f63fdcbbf109013fe1c6d120183114771da41baf483f857b7c543ebd779d40248085c82c79400e18800d1314ed3ac007dfbffcc4f9de7949047a25830906fe60473720310c28035c81cf136630d7997b8a7616f63fdcbbf05971e903f3f21c544725d2188614748551b318702d2519203480031248c04a891a0773fc9611207e0c2488c2a655220c84043946480c0108420080291300034100ed20c981033b9)))) theorem v2:V s5:=(S (K 16 nt 0x12403490f821f547d0ca25060220c1a519203481f48cc013089b127734c0192034885cf10c901a4352003c36862e00c901a444f0cc032406610e3fdbddd4b59dd9ff09a625446730ed47aa5388bca74f0676e5041a4c2286510248710c5934062004fc8820193203b8461c31fe6dd0e25aae09ba4661bdfff46730ed51eb6fd645e53a7919cc3b510690207fc2a1784061740621950824e4b485180c0113715a978eed9ad691157f294b9f86e960fe13c66f4cf61c887f0c771ff523adf91d9d65147adbf591eb6fd64767594441a4082ff03164ca1886b4209352d2476baa30c1a719203480e46ac31002b9026d20d3041dc474046480c010075ad4211d6e8000ab3afabedd8082e9807140651c6480c01084203e7b0a47b8a00292e980025480b8106454811212) (S (S (K 14 nt 0x5618a8032406910ce33d0bbcc4d9accb07f7b7f6db1c8069a9e324fc7d20c6ba9c855906771c7c6d649aa17512605cc11111622a24474698310c2e4b72d9fb6959fa02dd2d3ceaa2dd2d3ceac145c911620a08e616a031070c03c08151170630dbdae3890700c901a440e3946480d2000c4b7300802da81dc3bea023d120418fe32494692041901c50114319203004210807fcfb73ad633a0029776cc00148404e4832b96700c901a4541904032406912849728aa12c8ff5c06bc9f381ada39f8b21817322dee04771da403f857b7c543ebe29aa5955c5315a7218f6955c5315a7218f64ddad2f0be69cf9bb5a5e17cd3b0476759451bffabe00f54a70a2860a1e5060286200a388155102d130862d00c901a454041000a1005d230ea0209390f2146006a571c3f863b8ffa91d6fc1fc31dc7fd48eb7d157f294b9f86e96157f294b9f86e95476759451bffabe47adbf591ae5f391061025450820fd0d3460c41c23e42a8798c387f0c771ff523adf83f84f19bd33d87222afe52973f0dd2c2b52f1ddb35ad228eceb28a3d6dfac8f5b7eb23b3aca22142080c202654a188384b29495404126a001f28ec0868c61830e32406901c9b186200572093c4226483b90ce00c901a45aa2006480c0101adfcff99b42c00ee97dd33f958c1bf18002f48ea1c55a4601920300421081b2dea3cec3800a4ba6000952037e41905629) (K 14 nt 0x8634c429f1cfb887e01e4773fd761f63fcaf24142f0325462865123862045ba38a598433f35f708fa03af23fc5623af23fc56415ec95187f638d28920310ecce98082972630ce5b9b818418c901840000021389800178baa0772864e30c9018400000a26080327186480d2000d8c0d28c6480d2000c48ea1c5039421920300421087d2eea9887b8100526930004d101a93342bbc32b1f4c3a9c61e3e635fa272fd9f8c5622843d70e3d0a793ed460195738ebf16f65ffcf321c6872b9b740fbe43e11814204422460c42037472861674c007cb9318672dcdcee5046480cc185c0d6246480d2000c48aa72630ca193b00b72e281dca64806480cfe8c3be000002a18204a02324069000626041c6324069000624750e2804520c901802108401005226000682030c412ccb03)) (K 15 nt 0x25dfb28eec35e6afc0d6bcdf592b6641b6f778aebabed7bfeaa1d00b9896fa18792459140ff834a2470c42033f72fe91156e1af2bee06b68d6a9dcf100cbfe9fdf5fee8fbfbd20e805cc4b7d0d160d2830ce6191e8e38621259f3016921cc619eb2f713d25192030fbd2b4b000067c8d60028bcc0c8c9d805312340ee50c9e9192030dbb3ee70001a1ee7b0028a4c103d21192034800313039031920348003123a87140e5946480c0108420080291300034101ae2ee981afb))) private def zz352:"s0160"="s0160":=by decide+kernel theorem v3:V s4:=(S (S (K 19 nt 0x5406d2338b313cec00e6612447d15288d8e8489fcd459218865490aa020800508ca46601ee630c1c41920300499af73618ecc01c851862008e32060508c9018024cd7b9b0c76600e50860e28c9018024cd7b9b0c76600e400f043109a011932bc3008c9018024cd7b9b0c76600e52bdc61920300499af73618ecc01c801cc862134248047cc2b4886480c01084200c3fec7776ee0080eb4c0d080294c4a5a46480c01084200de90ddbd4dd0082e9819d03a00ab20c8a90224240499949124458833a39b8df106290c00da187163e79d801ccc2488fe38787212fed459018865490aa020800508ca47601d0640c440192030044260808f10c90180f7f625ff4043bc98001c887288310c803240600884c10c8e200c9018022130002510e4016e43100d7990300c4a32406009335ee6c31d980390a20c42680278cae0c4c32406008670d6f38f0d9df300724641884d09200b330ad821920300421080d4e57b00204c0888021cc495b06480c01084200de90df6fc9d0082e9810d03a00ab20c8150224240480503261) (M w28 (S (K 17 nt 0x248843fe102c8a446f866a0c01021872efc3fdc5bd8a7608a920a11208eabebd1548621450825043e919806b113624e1934c0192034885e19886480d21a90020999c19006480d22a02080050802e91875667c9ab77ce03aee301e7f5908690287971d1ac8120bb86090c428a1049c9690a3010d226e2afe52973f0dd2a2afe52973f0dd2c1fc31dc7fd48eb7d0fe18ee3fea475bf235cbe728f5b7eb237ff57c8eceb28883088a9c7cda464cc188514209352d2476baa36bc232406008f76b6e36187d6600e50862f38c9018023ddadb8d861f598039004110c4023a40ce082bd90773b43130c901a4072354189610ea1c50a18a192030042108037a437dbf274020ba601c40140404ac8322a40890934a) v2))) (K 14 nt 0x1624601920308400004203f2169fbdaa05419304818b40324061084001627fbeedfb184c1034e3192030800000a368ea95bc2c61e980022c8ea1c50394419203084210a67086792840200a452600095203c441982b869119f012406938a5bdfb5aaf782e66f5bd2dd816d2a554c9066212080324061080f0c52f6d6bc0004014874c101122192030842108730843d4a420100526b30004d10142372880192034895110cfa93e923e92a81c2f0fc33ed7831e7eb4ffef20da54406b60cc007290770f2e488f4328ee62203f9ee79bfab0d0b579cb52f735e2e2514a67c0cc40250c6480c010842008029130003410165205586e51c032406912b1001920300004be2768f69a03e98deadde58272c9821850fc48ee73f50040617f7b358fab8572ba85653970b891c9dd0660038080d3107708d40192030040196310df65d9580044a97eea91a480148bb060806a30c901802108404a5fb4a727400521930004a9017931680e30844498a572d401920300401000d3fc715b5e404064c10a1801920300406efb77a5e5a00079b4abdd73070c982185c41bf487fa0204125cf63fc8c307b537db7a922624754833001a24065c83b80a940c901802108407cf6148f7140040a2e9800268c4a8850ea19018f16670aea33003240610842157b38c7b5cdd82009adaa5f38b5022c6779ace309313a60b10500c90180210800000154dc6f39c7ca159820120a3240600842100bb4c4a31d480167a9a9431a5064c0017a61100ba983504ad49c0324060001baecbf5af3d0000000eb57ecb54f59228f182079c23240600842000a5fcee379cad001259af6ba86f3a48affb30006d9810e30c901802108407cf6148f7140040a2e9800268bda815009e101499b54800c90180210800b8ce5d9c809a7e5f8244c11079108f2139c92024bef439dac601ad3081d8330fa802bcd15250fd7ec7f0a89640712b5ad4ec7c1ad308260330fe81d006217b4fc9e53c202404de6f0c580192030040116b5ff4001ae23ef72472304018b023240600842bdf3bca00b6ceef8878e183000521812b08c9018021084000204c000c66564c3bf0f4170e418012bd467c9d035a61020cc3ea00aa31243058c901802108401e6794e63bc020cc0f881d005317b4f49e53c20240280e1085ad9)) theorem v4:V s2:=(S (P w24 (S (K 19 nt 0x92219f850e0c72704df0cd21801b430e1e7295e4fc1efad5ffba00ca509ee0171e2189be22c4923862125242a80820014232a1f6219dc741efad5ffba0477dedf028808df12622306205d242a80820014232804008113986b687e81af2d4c80d0a40b7d173100742244901cfe184049888e18817490a1ada36e86bcaf309e1a53996f92e6400e498b92bd0dfa4b4864892038402c24438b1c31022841009b90e48e8310130986b68d7a1af2beb0a9b2fe957e61ed3ef1a5832f5f5b4eadce16fa2e6200e86489202ffda482201860e188114208550721441884d00d29a80820f41c9190621342480158c75e47f8ac875e47f8ac4d7dc23e80a598433f08e101247512c379a6a80c408a1041e83922a0c416829222015731298d19203004210805487a92bef90e0109bf9810d03a00b520c8150224240480520a) (S (K 18 nt 0x2e7944324069040861c3ebff32ef83efeffea5cbbafe28ee3b480527c2447f1030a1c3109e8412821f50c33ece839bee997739614f35d0691efa0bec7b23ee37f0651d66e79c69a27a7682b3dbccdae4e85df87fb8b7b14e8417268822290871730620450825043e807dc8186113624e19b83200c901a44ae0c843240690006c461c38d67dc0c7d8efd7aaf4358cf65be0b99bc5a2d3459603ce87991932488ec882893650e1884f420939262a80824e498800a880ca1137501049a9310a24b57f79ca0735bdb25d6e1015657c8635c528584ed60d35484db6a4246d6871e867815622e60982ea24d508185054c9e63440319183102284107a0e48c83100f51023d2092241dc496846480c01087f3eca3c96281000082e980714296a86480c010842074a11bdeb295f8040f31f300e200af202c441902a0448492900a) v1))) v3) theorem v5:V s0:=(S (P w269 v0) v4) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v5 private def zz353:"s0161"="s0161":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull27Case15 private def zz2122:"s084a"="s084a":=by decide+kernel end section namespace Green24Proof.QuadFull27Case16 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l51 l6 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x8312d8e53, -0x2cb416090, -0x1bedffee5,0x1770], ![-0x2cb416090, -0x15992738da,0x6e86e14d0, -0x1a1367182], ![-0x1bedffee5,0x6e86e14d0, -0x15054d87ad,0x4177bb205], ![0x1770, -0x1a1367182,0x4177bb205, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x62fab96d,l6),(0x18dfa4333,l4),(0x30207e6f,l10),(0xab7324,l14),(-0x6c81c7f5,l17),(0x3ce3f89e0,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0xce377c,l25),(0x2507daf,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x110c1967b,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x110c1967b,l62),(0x3ce3f89e0,l15),(-0x6c81c7f5,l17),(0x18dfa4333,l4),(-0x62fab96d,l6),(0x30207e6f,l10),(0x2507daf,l30),(-0xce377c,l25),(0xab7324,l14)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1300a401000004e0440163010000000221e029804000250982402d003000000003c01240180003204d007230140001a4178028180a005311413006100400000a82200726020000000002406200800003502200a18080000019024030c030000d0082004c602800000681100e300c000000002c0290040000001d1a038c0200000000f1a066008000000b8640e30080000011050061806000000002e014802000000078381460150829010800cd401800b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[![207, 1500, -2069, 0],![8, -169, 279, 0],![-27, -15, 68, 0],![33, 150, -211, 0]]⟩ def dynamicCode : Nat := ((((0x71e0b9dd082838c0d5b80ccf205123175ea30e287b26c23845003625f4110080011ebf87b4660c2500851006db254cae41173ab16677c40e0bbba4610848c25ca482c6c40c28870edcfc488150aa5569e4825582813d720000000011404b480828014411364480374c40e187417e7ce48c20fcc368b040c1874143e4e488038031fe8058202f955b3d2482c7d71673a05800a96f4840e94808280140000e410003ab203603c3564d409ceb02450b01c91376448822750390a587102955ad2b960c20b0109eef9824202d5171053e384136f9618404300635cb2509ba029c08700a89242050ac0800004267afe4f49c6f26cb0ddd9dd592a617b24030449afc05dfc8e0b0cd5763c0aba89770557781664063063802001800808cbb4a0a8141a19b45e89c3fdecdb153e7f0c6dd925717e254a63fb9839a094385739a2230c4d8f74000ad0d23cfd593fdadbe02f06f99a98465be66a611a098000007d01a156ce127735920bf992261b88234d7e02efe4705866abb1e05409e3235cf9290278c900000001904609015440c7084082041325aa7edce17fa1088a24796b3e46f3f31aa2cbd66540d2d25b999136c5d348d55cb0433965cf69b4d08403c6a647decfe603e0bf1cd11858a751ee88a7f096e220e869e14001204fc29474353f615b1a01cc17a5d5970cc5f7558e533f15d60790000000000000000010d4d67c5348564bb4fc4ec5d1fac5c646338813eed0000000000000003721810c118014010004455a0bbede8e9ca51ce7bc732f3ca563e1e6f2629c699c6ac4a48b4951c16cc21ac36b8d55df5bc068dbc0fa214fa0d0a38147ceedf4c8571c5694bdb3b8bfa27ce6765358d5d99299b3e8baca4e9c1d3bad3d46572b303baf94bfe066df8c2f82fe1ab3e1f1a908c1f3400165480d12c064740300a0170140c5cbba159be8814718aaf7a5a0e174e3e478c1a18246072b3efac284376c5e3cfe8800e0634b45270e02037de49a1f1400ddb18ebe1a08c1f02f6679ab2a050ac0a124527ac8d0a94850db6ee0e08a741221251e5e1e0542086586f3905528e10f7e5775cc7210579f925d9255940bdfc390ee6fc2828ffee6e429c8801325ca8f0fcf7ca4801701c2487f12c85b86f030a69d9507cb81091073f21a1fe3408229d745ff18fb082d6ff79f74cca282944c1892f7d0600640af8a47a30402a5a5d0d4dee0404b295db98e75b122400bc0f000048270c1b478b7c122df7bea8a0288259ec64c020816f1b37428022e194f19282110040000420d0dd115d40fe86146ea335b938825c25b75cc42022262a7121a30418ab25f3b43087adcf47bb140f062949d0a141707fc6578e1009fc3d6849e424009c081854bc998945b988233714fe2b780c0c3a497cda4e4386412d6e869751823d7966331f506142fd13376000209378badb32402827af2d81ed640409eea9403d0040212005a07000022d33988d11edc546f3151b41512cb2072c628524514420208114032080200d0000ed2000a84402437c617b228f1eb6050c892b33e841d1036d9dbf47278c60861f54641594082a1b31fd99900504f4bc588e203101228a0afcee44300cce4205512600098f5486c23f2a009002e03800b00c054040280381530371c40f80c2ba18eadb810104fdb7f6fc1a03047aa3985f60820879edf128d80a0c6e1f5bf0db0c1960e4651aaa2015ed4b5c21e020015064f645b5e848015818004c07641241628a082096012002000064000401b241629228a29020818a082080064000401a0001180052c82482451452411c1081200000c8000803689249245282082281081080000c8000803689249186245281181280240000c8000803400023000200009f800c0001f20039c6594f72f877230c370742490e0517ac01cabb028e1a1071fe5d0e0c30c821c984d6304d9b667aaec42055b08326fff1000f8a1906a6) <<< 16000) + 0xa100656bfb1ed1b0c9200560600002192000b18687a6e7e7c1c61816b30dae28556dc57bcc916bd4fe1ef1431a85a8fdc6084c6828d2082062ad8f107004ad7337e0a0208802000032a400261880060b10017593868c173363c860c7c95f01fe1413d781ea0d0700000005dc0180875ef6b264200000002ee000000a42c259730c1300600005fc8090ac044460202300f1180708f0c1d5c2e78400c6db4e0818009bcd2660a0425058778200803a433600884a484201000d015152f9c6b0106183b8b1f04680272235de8461044010804008020000088c111dcdf96af4bc7459a760a96aa4055b086986f3b4de2d0ac9ac90400c520138137b92bf53a64b0d8df9dbc0add57e9eae97c6d7da42200161128bf9278359d18169b3301c7a5d4d00414c8c71c141821ba802ee41f93c5d60f76b3cef15fe2da895107f25d7bfdd7ba3fc6abd0c6542bbecb15f493c8f14cf055ab328ad5ed8a250f29866896400010f480602c02c07040de7e94e57a86e3cdbf2dc89e13ef664594a630b18fda221bc3b94fadd38cfdf9fe04817a58d0d15e1062db7136d1c7b4d420a73e863b8c0cb0c53ffddbc7aadc0ac026dff20027786131883136c32648366cdccdbfc6fc79c5eca6fda155f8b94bc5b3db8a81051f00b16f52686fd363886aec3ae722abe18742f43fc5f78776c50c74c753bcd2e5f1dcbaf960e262cefad00e860677b0175321c1363a4dee7c982db8e930d23e3fe10c889de00015ccc040df1a834206bd882c0c1003c85ca48023102000800502c020070168e2946ad71f88076e40d7f987407b477c3cfac64cc150000c1143a51ebf55558bc09d1100583f18664b0ac5e41c84f1800481cbd1a2d813a195b8cf0c5f0f1bffa1dd2d2f1eb5af94200050262e0b7ed81408ef3deef8061a4363834a43aaba546a76000017e5e327c4b7d3fa6bb18a7e03af0b27f277df54454e3c9900d209a59ca4f922c1178758a666dbc880a59df6de27bff9d8fa7817c2284c5123bc3593e2e1a25ea024ce001062fc9f0000ae8400199480490e82146c2ad5041d76118cd000481297e7801123202100871c29c51423863f7b1420828979f5c8024c607401001003a1c334a438f248300dc7c7e1d4ad95de86baaae2b80a318bd342669ddb2b5bf3429ef123693c330daa973b8aa0136bc0b25b90ddd318495ce6847d429814bb8e1842ecea383631190dbfdc29cd4f9f909351551b815edc96f576deee6bcc2431b29246d43007a6ab178642a3b29cce34c19cca04fc1a267ead4b997c7399208209cf9524ddde3a308b4cde2d1508d29c311409e25a269445a709169eaccf54b65cbd51949897c388ecc6a4d3510e941bf02a3f2919d0eaa119b3502b9e9400901e45ed882470cb40b239d42611b8995ad7ee5e6a82418291438afa0d3d3d32f0ba14a5228faf00ddcce0482b7c813fde4d5bf164ecc8505fd30d4a10e8ebea82af2cf9139e5deedca8f54b8e54d6dbd817247ef48c94c87ec5db833f737e67242d79cb080155bd8cb8f1cfacad79d5dda4fcba2ca2c7d7a31def7400004ee9000ab3200170a40074c4c25065db4c0a78d745d30d0360dcab28401bf56000000000000001aaa238d259a38cbebbbd2c380c2fd90fd8dd1d96a7cbdb277bafab000000000000000000000000000000000000000000000000000000d432eb18605c30b7b2e6e86fda9b23b255f8456fb0e37240000000000000000000000000000000000000000000002d18c18818618c00a000225c828acabbf737d6cc32f3359a5f6af2c1b04c0bd9dbb05b4a497664300dc58663b817eeb729f738ecdc65aea46655d59d692f265002cf14510f797e3f0fe7c81879b10cca4506490db50a526c8c50070100036c1002566200821c6040d4ed44d371c4a184de63671c253a7501a7914221ebc9fb6d0c11ef6f9d9470419e0b2223721001d6eeb28ec080ae94afea7a04722050a0081c42d64f5f36b02828800002dd2ade8050856b33c1aaa4d860839cd284440190413560650ebbd283818708e040da14908a9550f99af12000000c3b1a80b2190c28660880002193860b98f13e0e13763b947a28464ef27a588002d1b33b01013e533aac82017caf3c5608cc28440108107a57eb44101c8619e6d718300000325a1000000211951241023008408d7c5f450901f96d7e1ae30600000bb8121000001f40480000017701005b77a2180893081100400004f480011e9000395200402e1a5518da73dfa73fddb56145f6f56389184308877451606708cfaa4604f2b1e96200096280195678a26d36c8f35b01e5181ba728f0c100c3c1e3f31c0cd5353f601979c5d6b83558604697c3ecb4a5d18c92a04fe405faef21b81640c3f86b4093d1088140689f14bf6c1d0876f6da3f486dde9d9cbf112ec9472146510254b375fb4300719393f400116a75e320448c6084021228188fdfa851000b128b228149b6b7d50463142100841000137380015b44cb9449080e80228a8c5d8648104908617f01400000afddc500f3e33dec20079f1bb1b44944084020000212400067480013510003392000e7e6862fc6ed022283394ad120e20200000bb8020055223dca2180000005dc010013431524808cc2848010c200103578b0343840000033e72b8c158169f72db4c2840000068c4f188000000034ddc60000bae1b80a88227d06102e02c61000bb6148870800000bb8060ad1681afd850800000bb807000000afddc600b573e900d12610240080000a410002f0200c0200501002008001250801928008940020200001000a139)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case16" = "QuadFull27Case16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case16 private def zz2123:"s084b"="s084b":=by decide+kernel end section namespace Green24Proof.QuadFull27Case17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l41 l43 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x7d33fb258, -0x2cb416090, -0x383f1fa02,0x183eeb030], ![-0x2cb416090, -0x100f49de6a,0x5d4a032b6, -0x19fd4417c], ![-0x383f1fa02,0x5d4a032b6, -0x15054d87ad,0x4177bb205], ![0x183eeb030, -0x19fd4417c,0x4177bb205, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x62fab96d,l6),(0x18dfa4333,l4),(0x30207e6f,l10),(0x11c8e68ee,l14),(0x4f48f3254,l12),(-0x6c54fc21,l17),(0x3cb75314b,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x14bc409d6,l25),(0x387df64,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x4e90bb5f,l43),(-0x35133b4ae,l41),(-0x1ed0cbbe,l46),(0x165a0bc00,l51),(-0x133f1bf61,l62),(0x982247fc,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x14bc409d6,l25),(0x4f48f3254,l12),(-0x133f1bf61,l62),(0x11c8e68ee,l14),(0x3cb75314b,l15),(-0x35133b4ae,l41),(0x982247fc,l64),(-0x6c54fc21,l17),(0x18dfa4333,l4),(-0x62fab96d,l6),(-0x4e90bb5f,l43),(0x30207e6f,l10),(-0x1ed0cbbe,l46),(0x387df64,l30)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x4a0661080d480200000004c340d300800000002c38198020e61462040c59005000000048281a6010000000002409200800094210c8112006000026011004cc04000000130280e6010000000b8440530080000000004819002000000360d014c02000000001300a40100000002e0013201000005c02600998080000002e0701cc020000000e8300c6010418618a10316401400000000220390040000000036014802000188642201a8018000000541c053008000000002206900400000000a0c0cc01000000150480a60100000000005032004000000000a049004003c0841a0271004000000000480c401000000220a00c300c000000005402900400a20cc1901a10040000000b0780c60100000440d0039301000002086201c98080001081b401c8c05000320a41403480180000006c3c0530080000005c1a0298040000000001c0c801006c0e624814c8020000000742c0a30080000003a12051804000001c848070c03000000000380a4010000000000b0320040000321a0c0520040000000000c0c801000000001700a40100000830840a930100000000012039004000000001102480200320920880c88020000004209014300c00ac1202c04ea008004d08c1200c9004002905409007a80250829010800cd401800b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x9c08802c602000000440900e300c0004a1304805a006000000007802480307904505a031880280000001e00132010000000003c03900400000000220148020000000b0900e60100000521200133010000000016004900600000000d802480300000d4088028602000000640900c300c000340208013180a000001a044038c0305306108201a480282983384700d24014000000002c029004000000001502480200308b00980a6802000000064580530080000034168099806000000191602cc02000000441201e6018025c88048036401000002886201418080004a14830029003000000129101c6010000000099103300400e62a08803d2008000000000b014802000000108380a6010000004616009300c000b43908814a0060000002e1d034c02000000170e8126010000000c8740e30080000000064029004000000110d03cc02000000110481260100000511040393010000290468039180a000018c190088c040003a14856054801800000720a01c300c0000618b200898080000001e19034c02000000000e81a40100000007864093008000000003a049004004c0d41d0321004002304208807280202602082100694014000000140c0798040000000f07028c02004a0661480d480200000002a001320100000005422079804000000260d014c02000000078481a60100000001a0013201000000000340390041380c61040329005,0x6210805060200000000034092008000000000a031004000000110f014c02], #[]⟩ def dynamicCode : Nat := (((((((((((((0x49034f134ed9438811a346450a21e7e18c0e04b9de1efcc8084401005901e132f476f7118292bec945e58976bcee12981776d3115c582a09558909603be446cdd3001100434b0957874a45940e91471a4c1c3bfb075e18162cb77b9d20001d49823c1004ac6bd99a6002300800009d9a2ba405cff9c14486c16243ec348013088ae5459011478e0aa0a0cbc6a1bfea160eadb5316973400b2f38db385800475a76944a4021380a00006f8800232103209c8d8c05575ea524b39f29cef65a85f21228fba4faebb1c36d0cc46b06d699764840e9f6951905161092b769ce505c586085daaf1d577df3dbcf2795da210085809cfc442f279ba1871f56ce7dc7be0a00320d24213ca482a260d7f39a0f002178cc0bef656c102c3861a86a6ea54d689655a2c6a5d29e4060c72144013008000fc481082f8fdca0e57aff1430db5906462c38c19aba89bb414293269c88ca240a16b79803a3901860915b0bc82006c6bc8e9f9002d72014994a130e30540400001d621060bf99f6ccb56c05b07dd60607e0b2edae5d3972e6574bd5c6844458c48c3843042044802c96e01923059cbbb27b5913245151627169ba1ebecc6835d1b60eb5b492d522370ce01b174c8123f261475156f7812de69410141494c500569e39f8e23840b99584cc1e34cccd4cae7b05583eeb0303f05976d72e9cb9732ba5eae342242c61021c018010014e5ca6545a845463dbdbf7db9c6966068e2e50f76abd03d5929589b5ae626eae95654ac7485ade412310eb53adf20d4531ca9a0006bc408427f33ed996ad80ba4de28f04202983eeb0303f05976d72e9cb9732ba5eae342232862852031410c110015200c02bff0d6235da2b3e69ead858194d33ece6a08ea41b2e6cd863af5b0e408c5400095c80043e9c2aa15a77f49110f9f6c383086484beea101cef0808b8608667f3e315125182100848963ce18f6c7002936d31f7c0c209031079b6b64234eb434e020386e18ed1a874f082e432880a035c57d76d155d5e630db450200a9483a9a0ace289ee7d8c02ba17b658dedf5c546cd6427578d3157396cc9c3af8c20924c32ccb35e1f7105185a0ec00018c10821d00c0a80011a884090f8560579fc59c1a84a738fc002644792d31cb95edf1b78e9b994508d34bba7425908607477ecad01d9a123036041872fed305e588148ab0e716e52fd70c4a9a42e1306e2619b47e0564daab87b408129efaf55954d75d46ae41325f8b702a628f9497ad85b92cfe2211655b92f30f113f9cdd66318cf4d742953da245e86c2aa359357115b1b839ae8cc5e04f9e53a3683dc7e32b5259c6665640ad887b13e4c68d9382b31ba8d58b408b17f6a8f4942a8c3a13aa0b9238d2747391081bb513272d024829a3c2883e6c48e34c19c8c092ff8cead5290751fd46fc185d152603342cc328c00038f9e42529088210ffdd844d2ce7fff0e804703125b038ee722a0000000000000000100460440430460050040014d67f848cff341f2bcb4f5523c763869bbe044484494bd954c506154ebada96752afb5e90cc6fb58cbb1086db8a5ec763ed197103b196f1c0a676b6b630a421a8001ae90802d03f88c1f8360fa0a07c0140c06ca8852f6070a994a82c2e60c148ec85761141420bda45de370400453d742e8707023513386f640a001415fd338a565f80af8901c00cf4ccaee1faaa5c90ac0a123b9f4c8c15df901cb116e2d2b40e1e1f7468b7508c1af61fe964630c05f3982b687a0141cbb281848ee44c9309f4853525cc8aad07985202c02c51123ff874e6fc810953078f372881977731b718e08207440ddfd842821ddf7bb2768201b966f234c009e0761a487840c4fa6ae217477ac3856050a14fa42ad36b909165b98ec017c0b101437a901a7051052c10acc1d06043b89375e8008017e9d620cd6c3016524536b3f03b5aab1d51240c08e2858058a15273e2825ee245780895c0b186100fb460a31d144056aa40c73030d2224a37d9d180150d960d730400854bde9ce3000f960110d150228ed7844ce03e6050a808000041640d4660008464001854800403107b29f11fa4e3428101d184e7e371c35b021b1ac40483c05b3287093e89a687900a7adda3741804652964a210035522b83d2808230085110ef41f96250e889fa6e98508f638d0d6e4880f68a048a50646bcc1bde386092e9e1f84829d9333f4f38012004287098b70967e50b6effb58b44910000011940141aea59472b01c3059a557390584006ff3126ca0a216ad7bb0120c600cee9b82c003d6fe8a7f8900270140000f799120ed867af490c356cd8ebc80c00000bb80908aea42247890559cd9cd8c60002842258020073907d30003ff09e929c109002000032e40014b483d00c1e4074380f7c3713b0c4893ef7e32c486902456ac01d2c1648645d2e1803df101909bd4048a302841efd60fb2a58e01a2ae8c1ef881803292357705b3a410085c060a2291877b920618000010228a15c1057ca5091426b8d8e20a10007b14a089119728a24bc60c1ff667d0c2047d729d5a280024008511b8192d71ea630c06cbe1be4e850b25361f0dd2c50803ed75ddade48961acd11641430619a8256921410272e18350bb458005b9269fe5) <<< 16000) + 0x03800302bf88d69754801601400008848001ee907801d0e0d5bcc0d0e2858257c23f949229c72d96b28491179d682377c3062acc4f29272002c2f9e11110800836d6bb37820039b57cf5ccd08042901c5908aae46028b0e380000326c2458d7b842fb0a7943010aedcacbe50b256ffe7bbd0e20994f849940484115089462e040950107446ef9100054040b2159d95cc5491c70484cfbe5c0b1ba10577b8e7285b581bd5d4a071033a6ffb2001c31be0f3a7860204e8c8347e50300038014f61a0800093a15c1e8f89002a02000010690003ff3439c59773c2e285542ec4ba1648a3b24b6859891236cd13e588c18ca11940752002f55dc3a5e2001a8ede9a442005f8066e56b4804270145930efd853c259110c4d002e50c511738e2c58af62f6b30e50a0f68a048a388027b3ae42384297e70075380120042c8abe7114b138071c0853fa844b028622c1fc6b0de0b1611b40a70180285098db6cde40070848c76bfcbf02c13251c2bbfe00804001958b1d45200031c39604cc6202400b80c000046a4000f048002cd1000b9f204c1b0011d920da220770d03b0481d4040e80200196b2046630732583912c1c4960e03bdfbf1182760b9def00f9c676737c6782f2c92e9194622def1351277810c2e2b9e32b5f84777812de69410141494c50055f33ed996ad80b31441041801400c01144357376fd77fd09a648c7528b26c3177aaa908f628fc13ee8908209852eafbc8679f676ba87431d72368ff406600e1a0248ea5957efd85e505e374d2364b04282bd5d41f5c15ca618451d06f010370081b40545019894e5080cb46db0752021bb5d3f9470413edba7504188aba4fb86508220085140d04f15838265534149041c81713240e01214e3a2c2006cddfe8a080b3e2169f598208402000026441b0360d61b0350d03506c048360d21b0680583380f4818a55a031a2ccc2e227450445bcefb01803a31c1be24042100871c2da362887123321f8d270884e7c6047017454509520010004386ae5d4f718c00050d9f2450003f287b91801080400002a08000ca1d09549d2b9d14b03caf44aefcc4fa03e3a440000000000000000017d74edabddd3a2d120246fdf88c13b05cef7837efc4609d82e77bbfde0430b8ae78cad7def02185c573c656bf08ab7303ae65aa0595c7cc40064e65c8d233582a860e608504400380df8a21913346757c2ff8663684fd2eed97f98dd4383d11a904951c2b94d373bd48c741b4140062ce967dbc24513a4ca5095aacca4ea6a8b818871ad3de2cb578085abbc46209824c5f016e23bfd183f7aca322cc0a1585b5096b53a8002fc99140d5607be31ccaa10f8a740cb6a0798d96d78f86049ce12e7919ddaa13862713e0806318794cea7e81bfabff4f768a84790ee42f0f62d46edc1d19c1c22a9af5f7c19e1f42d58ad8c10f09e54448cd85254741ab17f0b59ae5be6a6dbc9a287084007fae4b9ef484f39209b9d7982283e4d4deb085ea20919909599591997294a4eea3b60cd1ed10dbeb6d1c1d90dc38154872ce14dc48ae89969ba850c4a1138455422294e0e1729f3dc7169364812fe8c0d0e95b2beb5564d22db27932412f653d26bc7760640dad0e3225af079d955eab40755f6f5a88d72dc08a2f9bbe07acbae05e9c762aeb3338f2decee07a5b39a7e988d3c92cfbbbdece27eb07a8140cb287f423a28c3881834a96cb679eee391f8b1baebf4622c45396ee962eb6eacdc4620dd36d000049e90660d83184c18817a17b99df7b07006bffeeea2a244384201000008920ca0bd1ceac87d453458c921ac48c106c2ff4a414406bc9df8c4084f1cab9210104005120100021b3f20b27042200868e4016caaa1a2dc8d4c152608218c5c698a20b86d150420426e1c93b080857a9a35a4c0844010000137203003c12773e8eab103665e0b1040883088020000106419037bf7e2304ec173bde01f38cece6f8cf05e5925d2328c45bde26a24ef02185c573c656bf08f4b5c64a605005f212948441087feec2269673fff87402381892d81c7739150000000000000000080660820678270250008037fccc19cd47f21ec3a8af4dd60b44bafeff6cc7c2e9c0e7a27ab07b5b203af02d0083ca9dffc702477dfb75337d8c16dac373f282d53d1c69318105a5f2a16cfa75c2132954b39a7d844b911b830b02a44e040e500df099381715858bec60444f9c9c918004c043e3c4251022008000087100064120c61b06209efdf88c13b05cef7807ce33b39be33c179649748ca3116f789a893bc0861715cf195afc23d2f265635506ea5c915e302bc84a52110421ffbb089a59cfffe1d008e0624b6071dce4540000000000000000203a7ba06abf3be9849136a9ffabaea1f484b569977fe32a00000000000000007ac1f758185000a1bcaae97ab8e15d2f571a1129410808408e00ad9681751dd635e570a4de1b77c22a989405b8d3d81573153fb25e25ed4b669449d7d6933d81313ba6901f35606cd0be2b282efb6db1e51958627594f67648b7d7df5ed1d4d005927fe0ac2078bea70722765201e0bb713de35fe7ec122fd9f1b79e2881903e3a09761d7103560e4e8b3456393c48b75d14050fbe4d057f1dba0c21a02609014028002244800958982031a95630b0ad5454afc40022aae3f72304210084000040100c00200003720be03b17c44b96b860f61ef98b081d377e30a7007e2341e890107c02162cb185152284d529ff9860a583b95a1036e7ddf094041e0040000651d1034ccb404a1324b2ed107105c5217e08c10800200bc020000bc20005)) <<< 16000) + 0x164174360b81304f0982d84c0e81609a0b000434200540a408c960441bdfbf1182760b9def00f9c676737c6782f2c92e9194622def1351277810c2e2b9e32b5f8475b181d762d502c31c71b20cbc0b43b3764d9ad817b48e2370550514a04700600000411408801173db675868974444b06af67c17abd5c46e03ce15091ee4d87c24360491aabb00091e99e175d1d1e3ec305a75462a414c5b230b1ac31868e54d3dcd7ba5061ae39782c4250b00b42408097c7cffcc0b61dc1ff584090e5109c42801c4b0ab9c2002a76686a0449c508c021c401e2f270e308069944de8c0a2d5da1d70a1087c2621608120d75f906300049e386d04498508c0200002884168260b20bc184914d2f730102a4a396c583dc0581b18904fc5a429994014a5f60700802d042cebaaa8b31011804000052881d028160060ae02e188f1c3424187614d0b2d0a000cde0dfa224628440100560182a80ec7016ffccdcb142b83e557202169d714d0d040b7bbb1110107277cbcc70058d8951b140bc6262d089c1088021861078c3c22c7010772ea404139d5cb4d07ab51a4d0808204a9d625041f00800007d1800008020150040260200004c20a61305205efdf88c13b05cef7807ce33b39be33c179649748ca3116f789a893bc0861715cf195afc2392621c9695d25e919ddb206e284ef863ceb7d22b3f943c4800000000000000007e095bb4914e050638e3641978168766ec9b35b02f691c46e0aa9659e0980060094afa677fe66617211e1b8ffca7c7d96b08b6ac06ce85aa17afa9d7a63b75156330ffeabc8c7814d3590f2a20d8a63d94971f931c3e004d89f73f7cc86ac33bc07a3e13fba11d80d73558dfcf1682284925d360a2505cc6100306db312440ce3180b221844726e9cc0c7dacba746002b19282a26042100869b0d181a7044313a33e6d181934d9f4048c10840200001544144178657a9a1a70c2017612cd470ae83d17c640250db0d241200d16fe5b449430840200002104000cb880047e192694f6dd5471c2d30a1bca1813469e20800f8cefd90412830400080000dc2001a3241404609e2304e1182684c003998800991100177420089b07151a655771433cd602ab1d0d95d6e4c7baf6c41f2f0298336000000000000000002198a5e64e83d49d8878edcdcdc406674bfc9e284203a7000000000000000000000000000000000000000000000b0430c3082020823001805fe90d1a0441362c1d00a82608812c440941204901024008000e20802696900717f321afd18ab4c94a2a8654beacf9777fa229000b51e6be8f1d434de0af466f0d1a0b380f268b9d30c1ad1bcce1efd19ce845ced6b551b9775d98bff64dd7c4f86a94bcac396ba65ec2610265769ee281945fd27588c891280737c80241d244fd5fc6fed0eabe20b15b7b93833b2877babba806099c8303467cad013345134d74b56dd3ab82cd48a780bd45db41ee8a1eff0dd899a9d28deaa83d81742258b9e144c811197322e556225611d1d3f4a0837380bd4bb233e75e45ad26335fdaa6eb14ba48bd9c61c1a2cf38d8a09193a05a565e7672f1e6c85d4890cb5484129c868f03e0a520895a1a00cc0608e03a1c927a345b280d48686238182cc1ce99980138f790de1ffb5447e2d72b23cb1faf03e0c96b2ccc54308bd53aeaf8a7c635fc723f8f418bd928e72c55818cef7f1857d93d70b4123218774d47a3e27d1b2280237458f98aa779961cec7c5f35f882c67f56079f0cc7067a80b0dceef3ee2d5dabe5ff7d899c8592460205d0f7e5b308ae54d17fbf8c150b73aae322ae58c28c5e92ddc1e1ab5d3daa12e175e840c73ef17859299622c255c063b22070750fd6990abd01bf3306b222f1dc76a20c2a439ae4612728d0a18ceaa13705058d3faec78611211b3b905800568356a94014f55dd60300081d343aa4c1044010000138208c1bcfb876da0e94891e5cd05467233ef9462000000000000000028e236b09f99d6fec21001804c4cc32b200000039264b1037c84a52110421ffbb089a59cfffe1d008e0624b6071dce454000000000000000020300d80922e832a65b205a8a18810408c02912388c64a4c8afb5f2dfc8557b44c81a73b1f1763371785d7a6404b5d0630b767c20e44634200979c728027c358ea01dd7ddccd6fdb7992b7f90bf1dc7e01b1cb5971f3fe1630efef5aa8f0a3054ca270f9de2d8a710459145a000bce404044001b866813ef31a340c00de2c2d4a2244304201081ceb79cf4102d9a53ac71220c1f0085151526d80508221c1028058d7efaf5e242508181d2765c94f0e9008c493d03612f6ac50035c1bec85f5249080003b3974bb1a22c080000003812d6de009323c91c30e817000044c411847456c4e2e3f24cc143065db8ad877b0c2155624fa1c2d88226fa254055880e083f9c724acd90c08f5f7ab3b50802083b7ff0aaeef0600e396f285dc9000063048e59d7773512006007004501d97a7f3835831639c91e5be0858a7134e98988a2bf66c9d230404000002710160ca8f4000964000000027100a0020907ae100800a28aad5f524009805165def62e9f8c610000005dc016399b681f7d458a686ad5c090a2b9cd10a9d840400000177018089fc4cd4a25830942310c9980035f3175d92900260140000f310003e720880a01801021808001a7c8004c69000a2e20843304109efdf88c13b05cef7837efc4609d82e77bbfde0430b8ae78cad7def02185c573c656bf08a25084883884023022021824007d7621e4eb00ebbdde8009ed98f70697ef659c96a7519ac109956c6)) <<< 16000) + 0x4d013d85db5c1d1da2912dc04531196c51ba4f2ba410282fba72e1450c5695d35244844af9e520e1c20706cc6430a1427b0dcb38b04edd7fac7810379a12726320085c54c736b4904250146fdf88c13b05cef7837efc4609d82e77bbfde0430b8ae78cad7def02185c573c656bf08bc84a52110421ffbb089a59cfffe1d008e0624b6071dce45400000000000000002011659628c28a19210a1160840b8040100680015810004aa20721b0400981f84c0cc279f70edb41d29123cb9a0a8ce467df28c4000000000000000051c46d613f33adfd842e42529088210ffdd844d2ce7fff0e804703125b038ee722a000000000000000010245d0654cb640b32051430c228020018075494b8f6f141f74e5c0b6a009541c99d4cea66730b38d17c74cad4b38a5e8eb4dc70ecf22719c896a4192747b389fc62e86b60dd0b75a761267b4c9040ce0f7e8e3064c5004c9308d94f60d3646281f00e461f4287038c21edd62b8440cc2644526105f38281e60c100ffa4768c00a2524a5126082100801702e46110ce001e3080d3886054b0c380186fe08199aff72ad08290eed1a8c58034b681d907001bf3bed2293861180400005c08001699a1e41179e2061090d35838a004dea38291821000400f4160780bdfbf1182760b9def06fdf88c13b05cef77fbc0861715cf195afbde0430b8ae78cad7e114481450ca08308804a0080060344b520245c4f619da9f5c6219cb4e58f0c31f9c52f2688e6260276e2f0af52fe1777c9213f0fbee032a48da0005be40ec040007be40405400184840e8679f70edb41d29123cb9a0a8ce467df28c4000000000000000051c46d613f33adfd8426a3ae8791f302c8a08708804604404900500da7438291d64d90a8c82a644462aeb0cae5ec1a1eefe4583f72fd6e5f683865563740ae977a1e8450bedc22d497b63807618964b14b8e8809e3850544a82b142155d8525840859dceaa8400e8abf76e08092dae1f727042100858a1d4d160858687abb39248594374ba8384c8fc9b6a285b0fa29a61031b154b7a4c084001000012b200054840e4360201b0380981b84c0cc27850c421e90cb0b166683810c2236446614b0408d729c82412c0a005600003454eca22604220086297993a0f527621e3b7373710199d2ff278a1080e9c000000000000000000000000000000000000000000002c09659638c29610a09801600401804010068000f810320981b02c0d41722033a51debde56310831830138979bb945fc1d9fcd29bc67847767eed744081507284169be6627a5698467a7ea72e9e7cd433ffadef794a81921e4e79649a3ce1215809f060861545dda1c0fc7c7281a397fc06f6bbba0158904471e8010f3f169de1a97497410b0da170f93fa6293d771c6174e9b2c7b4d0e5b86bee719d3fbb99863b5e994a6d4904e09cf8313ac14f9dd28e61f05c10f278f9fa390aced284e77a3af7be30d083a4607642ff56c221018a6e08039da1867e704ac17b101046208e34dc104264b5c463a18094b10f25da8182318a8ea73c0408250d5b41d42802c53a8e763784801501000d00605803cfb876da0e94891e5cd05467233ef9462000000000000000028e236b09f99d6fec2109a39821421018411801004942497902693dab8f37db02f3539cfda2ea9ecd94c7bbe217a0eb04572c7bbd3cfb6a8c8646b84521114000ae880028610130d000547103311d120f6a8b3c2c350f9735f1814671e3934906743a49642822c934b113000002adff80008ac3cb189c10840218a5e64e83d49d8878edcdcdc406674bfc9e284203a7000000000000000000000000000000000000000000000b0259658e60420448228260058060100401a0003e040c826026130310581802e02171b000ce0036389ed10086a4f0ce3001e008611474d557241138102d010653e1c7e8c007802000013c40bc17c48ae0024c0c3085cdf507043fd7acb8e0680b62a306000397fdd94007c021c35992602f0c201e1ff601822aaf2ffce0279a175514008f4a9b994007c0200001f0643ba4642620034008e181520eb6184463fd081c06ab63be85005f704c748003c0100000c820002524000d3c81700c0b407a12a93a573a2960795e895df989f407c7488000000000000000002fae9db57bba745a24048676335c54639bd64a5f77807f09877a130010f05823a8ffb80000000000000000000000000000000000000000000000001859e1c4e03b428a16edb8023bdd6db228d32cc37537ae0ce000000000000000000000000000000000000000000000005d31843c3383303281140b00008037c901f6b4b7796a164013bc7f647f0081c1e104bd42cc8208130c6b73752c2032dd5752c51049408fcafd76cc948305dc5247cad2c618007da930f6ca8000ef82fc40c46a571e12006209000025620260bf3f6f08764ce08f2c0c21fc5a7cd01000002dc6c00f12b1fb76d9ce8d1000002dc6c00f008a5a1ccc4680000000bf462dbe838016016314bcc9d07a93b10f1db9b9b880cce97f93c5084074e0000000000000000000000000000000000000000000016183f136f2a003c6bec000000002ba5b62742223cf3cb4043c44003c02c0b800080340009d0f9c8f23b1c6edb8f5d6aa7a7f49e41e958992a9b511c925a0000000000000000000000000000000000000000000000001804f0ce0cc0c908600402bf0351779849c1342be63eba05807b7305f16280bd076fbb7ed0ae762b4115f1582c74512529db4da975b7b36ab25bf6c0bba3f981374c1a00072c4001fc881600f470928)) <<< 16000) + 0xcf254060852c696e9b4a1000001a5e01809592925bbb3008d54d9779c400125197b30020019ad01ba820182591e88291c409c060000372400447c800b1d9001a1320050d8400bafc802190102b0100180a84883f5ebe8e0d576a1a5c3803a7e42502a318a11004297932b1aa83752e48af1815e42529088210ffdd844d2ce7fff0e804703125b038ee722a0000000000000000102d051f37a1040b60fbac0c280050de5574bd5c70ae97ab8d08908145105087041015e45b08ddf3c158f23d3b7780a2e79d5645e1bd884bd525dc793f930ffb9e6302f62df4d7f291618203b443b3c0726d4b12f2dd6da8ead31b499ef9ab76e1996a221a76502a0500025390291100602a031371b12a460443fafa581808479113e420093a118e55240c2200801080c0a00701bfc70ebf82045a05366a280271e5eab0c09f26d80528920a10804000037cd0c04ffe1940c28416bc390387d42eaba7880800acbbcc300be54c6300405226275c6930411004009c1604c0b02105efdf88c13b05cef7837efc4609d82e77bbfde0430b8ae78cad7def02185c573c656bf08bc84a52110421ffbb089a59cfffe1d008e0624b6071dce45400000000000000002011221020810c08809000e006028e0400401b221f952722240877a32664081032d5e8f4282b8d37c0b020c149e23142004ffdc4a228cc204401000013d200081c400168481284c001f5081210808c8604413810938b8ca7be10cbca56040c3dc899ab177011475308046f009de270ae7330710304062f3ccee5315d6240c6025061ae0f249f87b9dd45026b15f29e0b78f51033c300e618257c24ccc50138554484fd0f04869ac412ea20084509b3d730e5898158a193c19c458a0c3615a83430d4a97f370602af89e87549030800200420302001d04cd069020202811ad9c544885080020000104407c5403c2b01d0580e00f8ab491c4a314389b750cb301470c61942c14e39601a28128570f981c09de7d695180a970a74b9c0080021c52d2fabe58a18d6c67d11809f6d2d029609bd3fc56140c60ec8de04017d13a70cc00400100001293a480b475b32428f80a9024020473b0b820008872a5d0007c010026020000e120361301405c3b3764d9ad817b48e2370544d2470cb08908d04a009004013d23c7764ae6145b54474a69bb9be5c7c06268617cb03302f732c45e78f31b3c34876d9c81039225ddcf1026529968f3c028367c159800800216218e01d1688101f4fcfbe78610dc1f23103ac5f500c88106e54b2e250021008000081101a05db181d762d502d0ecdd9366b605ed2388dc15238a2830c22411010c13802404c040080340004748001c990005132032130180980784ec010d65fa6501eb9c35c08002ba6b112930c1f00400b80e008020080160580a82f8e6e609484205d9dad244701775ed972600adf97a5aa4818400100000d6200027a4050470000100400980f08104800d4607f4896cf02000e528618c007c021a35b3c02ca881909e7a101601e2f28894600400100000a520002c277efc4609d82e77bc03e719d9cdf19e0bcb24ba465188b7bc4d449de0430b8ae78cad7e11c31c71b20cbc0b43b3764d9ad817b48e23705583eeb030a001437955d2f571c2ba5eae342242c42040812400c08f3ebc90ba64862ff8a812379ceb8daae98a975806056034cdc1a61678828991bc4d914f9a754ec3c22b406aa3579b2aa7352f4ef4daa9fe18445c14a4a254ea46727fdf5ea124081d0004d220240bdfbf1182760b9def00f9c676737c6782f2c92e9194622def1351277810c2e2b9e32b5f8475b181d762d502c31c71b20cbc0b43b3764d9ad817b48e23705583eeb030a001437955d2f571c2ba5eae3422528320234020063b23dd8bad5fc05daae6d12127664e0f1268bc031a5cafd07d2e21477ee2b0362e9076ba96764a38cf536febea687752a9efe68dfafcee6e5670d87994bfdb92380782f807b5254d6e1044c116a000a46404404001810404064001cc2685d712145a2c20a5fb8bc2c13a68ad7f101128d8e9d0c13456db8e1c06e2938b7080819e13aa449c408002001e03d2036230320411a0fc8cc83030479b5e80c08ff0e1924500037a95f128010804208fe78307b0a1003749d0490035be14e51801080400002a0c00004011047cdcce80960852f877f12005f82b3ecc0080010000148400038480700c034076315c26dde648c15bd7fdf0c3493b126003821db9369f9800bfd3da0c580b09095960e0037100238093881100400005ac800238900c1100582802814000c7a4007800801006900233c200624a72b4a1ddfc43577f5e438dfa40cc5025d10e6e1eda7b0a2572000000000000000004211431821811411011000c004736eae633d46dd9ebe492640c6bc2d9c6ff749816a71c5f10ef9c8f23b1c6edb8f5d6aa7a7f49e41e958992a9b511c925a000000000000000000000000000000000000000000000000180461070c608508704104403ff09e94225c606c01b8a5e64e83d49d8878edcdcdc406674bfc9e284203a7000000000000000000000000000000000000000000000b0238e38a40638630608228020008e0500401b0455da54e51c206018d72366a48800bfd1dbb08108224ed1518e20000002ee00000072aaf6b00930813804208b34debade040c04294a1b88910017fa3b7610210010436f61c40000005dc0480017fad3ce08000ab2b5ddf824e204e01000018e2000608400145c8003ae10091900406801c3400c0a005010020080028c08019e8008340020200001004f7d1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull27Case17" = "QuadFull27Case17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull27Case17 private def zz2124:"s084c"="s084c":=by decide+kernel end section namespace Green24Proof.QuadFull27Case18 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz356:"s0164"="s0164":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull27Case18 private def zz2125:"s084d"="s084d":=by decide+kernel end section namespace Green24Proof.QuadFull27Case19 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull27Case19 private def zz2126:"s084e"="s084e":=by decide+kernel end section namespace Green24Proof.Full27Rows open QuadraticCertificates ExpressionCertificates FullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decode [0x107f2779ae58004d4ea8c8e06f201eeb5ca800cb7f4c39a01f203dceb948014e4db95a27203dceb94801e88f48a9a3201eeb5ca80128bbda4c207e20bf5f0c02cbe868e01e203dceb94800df1f482be6201eeb5ca800184f0d207a25faf848002ddc4c6d201a203dceb94800dd6e1b28e2203dceb948002d7c6ee07d25faf848003d8c9f9d206d201eeb5ca800cd3e39ae601d203dceb948015a1e7d1825203dceb94801decaba5ba1201eeb5ca80128bbda4c207c22fd7c28002e4b2afb2425faf848002e4bad7ca078203dceb94801bd6d6c39202779ae58003bbc4f98614] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decode [0x101fa5faf84800492e9d0de7a03dceb94801f8caaf79207ba01eeb5ca8002d6f39201ba2fd7c28052bea63a3bcdb2c004cdbd81de07ea01eeb5ca800de782848e6a01eeb5ca8006f3d0fea207aa01eeb5ca800de1e4f2e62a01eeb5ca8006f182b9e2763d84c002363d84c00207e603dceb948014f6d4a1be02e601eeb5ca800da6a1b79a01e603dceb948011d8b284fe6603dceb948007d2bef1da07a6779ae58001eed59602a601eeb5ca800289fed62603dceb948024efaddece563d84c002163d84c00214] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decode [0x105f301eeb5ca80018ecd9eae731de6d9a005bce2ee333d84c00207e301eeb5ca800291d0b605e301eeb5ca8002b1dbba6301eeb5ca800fb784e607a301eeb5ca800cceab8201a3779ae580058782be232fd7c28002f3b5ae03d301eeb5ca8004e0c4c7fe05d303dceb948001f6c397be535faf84800ce4eeaa133d84c0024303dceb948016f6b7ce07832fd7c2806cbbfa0303dceb94801afee6967e3d84c0023e3d84c00207fa03dceb948011e4b9d1ee06fa2fd7c28002d2a494b614] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decode [0x17b2fd7c28007dcdf8e03bb01eeb5ca8002d6f39205bb2fd7c28052bea63b3bcdb2c047e4be07eb2fd7c280249f9e6b02b196c00df98207ab03dceb94800983a2d22b03dceb948018efc5a6773d84c002373d84c00203e7779ae5803dcf909202e7779ae5800290f0a205e703dceb948009b3d7f8ba6730ea8067fef203a7779ae58001eed59606a701eeb5ca800289fed6270bf5f0c003828a573d84c002173d84c00203f303dceb948009d0a2b9ea14] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decode [0x103f003dceb9480068283f9de02f05faf848003a8c19aba05f003dceb94800cafd5e5da70779ae58073df8da207e017ebe18010818202e003dceb9480038698d205e003dceb94804684aa601ec2a00203d05faf84800198e3a4a602d003dceb948010efd9ceb205d003dceb94800cf298a6ae5003dceb948003f1e4fca607c003dceb948002a8fba602c003dceb948002d1effa05c05faf84800897aa401ec2a0027f3d84c0023f3d84c00203fb03dceb948009acad9ed205fb779ae580429cc6e214] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decode [0x103f803dceb948005d088a29202f801eeb5ca8008e7cdeede05f81de6d9a063c6caae7801eeb5ca8001dcf490e607e809c4da8004d5b202e803dceb948002899ac605e803dceb94801fed82681ec2a00203d803dceb948005c391b38202d803dceb948011e3aef4fe05d83bcdb2c001cad7a88a5801eeb5ca8001e49dffc207c84ca5d057a602c803dceb948004ecd8a605c803dceb94804b8ae6481ec2a002741ec2a002641ec2a002541ec2a002441ec2a00214] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1151ec2a00203e1779ae5800e8fdfb202e103dceb948028bd8decb205e103dceb94800dc5a7f0c2611ec2a00203a103dceb94802583f6de02a10ef3acd001a2affb8a05a103dceb94800dc88e9fea211ec2a00203c1779ae58003be9efdde02c103dceb94800db8f8fa864103dceb94801dae038101eeb5ca8006f0d3899e02810bf5f0c02bf583f6058103dceb94800ea3baee0103dceb94801dae7c1ec2a0026c1ec2a0025c1ec2a0024c1ec2a00214] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decode [0x16903dceb94801dae03a909c4da8022fffa9e02a903dceb94800dd9c2c8fe05a903dceb948010a8e4b2290bf5f0c05e03c9779ae5800bacc29a02c901eeb5ca80149d9a86ba05c901eeb5ca8006e182f2fa491ec2a002038901eeb5ca8011b7ce8e02890ef3acd001a2affb8a05894ca5d00295ded2091ec2a00203f503dceb948009e985edbe02f501eeb5ca8011d8c4f8ba01f503dceb948026bf8dfdc27501eeb5ca8003cd95d1aa01b503dceb9480228c8cd9f63503dceb94801a8adb9c92551ec2a00214] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decode [0x10101010001020100089204e2ad801db1d3ca08900bf5f0c061fc92088c5faf848034c6ee088f0102088803dceb94800591b8e986088703dceb948015dff096d608843bcdb2c0018cbcd7c2088303dceb948015dff096d608805faf848001edffa2da7d1ec2a0023d1ec2a00203dd01eeb5ca8004ddaf82fa02dd03dceb948023ae87e6ba01dd1de6d9a002b6fc968e5d779ae58001e5eee9ee019d2fd7c28003b2c0a2ee1d3bcdb2c003a39cc5ee03e917ebe18058b78ed602e903dceb94800db8dec7ee05e95faf848037ebf614] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1089403e8a40201] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadFull27Case0.base QuadFull27Case0.hinges QuadFull27Case0.normalizationDenominator private def zz357:"s0165"="s0165":=by decide+kernel theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case0.base QuadFull27Case0.hinges QuadFull27Case0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadFull27Case1.base QuadFull27Case1.hinges QuadFull27Case1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case1.base QuadFull27Case1.hinges QuadFull27Case1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadFull27Case2.base QuadFull27Case2.hinges QuadFull27Case2.normalizationDenominator private def zz358:"s0166"="s0166":=by decide+kernel theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case2.base QuadFull27Case2.hinges QuadFull27Case2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadFull27Case3.base QuadFull27Case3.hinges QuadFull27Case3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case3.base QuadFull27Case3.hinges QuadFull27Case3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadFull27Case4.base QuadFull27Case4.hinges QuadFull27Case4.normalizationDenominator private def zz359:"s0167"="s0167":=by decide+kernel theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case4.base QuadFull27Case4.hinges QuadFull27Case4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadFull27Case5.base QuadFull27Case5.hinges QuadFull27Case5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case5.base QuadFull27Case5.hinges QuadFull27Case5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadFull27Case6.base QuadFull27Case6.hinges QuadFull27Case6.normalizationDenominator private def zz360:"s0168"="s0168":=by decide+kernel theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case6.base QuadFull27Case6.hinges QuadFull27Case6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadFull27Case7.base QuadFull27Case7.hinges QuadFull27Case7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case7.base QuadFull27Case7.hinges QuadFull27Case7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadFull27Case8.base QuadFull27Case8.hinges QuadFull27Case8.normalizationDenominator private def zz361:"s0169"="s0169":=by decide+kernel theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case8.base QuadFull27Case8.hinges QuadFull27Case8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadFull27Case9.base QuadFull27Case9.hinges QuadFull27Case9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case9.base QuadFull27Case9.hinges QuadFull27Case9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadFull27Case10.base QuadFull27Case10.hinges QuadFull27Case10.normalizationDenominator private def zz362:"s016a"="s016a":=by decide+kernel theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case10.base QuadFull27Case10.hinges QuadFull27Case10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r16,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadFull27Case11.base QuadFull27Case11.hinges QuadFull27Case11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case11.base QuadFull27Case11.hinges QuadFull27Case11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadFull27Case12.base QuadFull27Case12.hinges QuadFull27Case12.normalizationDenominator private def zz363:"s016b"="s016b":=by decide+kernel theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case12.base QuadFull27Case12.hinges QuadFull27Case12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadFull27Case13.base QuadFull27Case13.hinges QuadFull27Case13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case13.base QuadFull27Case13.hinges QuadFull27Case13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadFull27Case14.base QuadFull27Case14.hinges QuadFull27Case14.normalizationDenominator private def zz364:"s016c"="s016c":=by decide+kernel theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case14.base QuadFull27Case14.hinges QuadFull27Case14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadFull27Case15.base QuadFull27Case15.hinges QuadFull27Case15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case15.base QuadFull27Case15.hinges QuadFull27Case15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadFull27Case16.base QuadFull27Case16.hinges QuadFull27Case16.normalizationDenominator private def zz365:"s016d"="s016d":=by decide+kernel theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case16.base QuadFull27Case16.hinges QuadFull27Case16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadFull27Case17.base QuadFull27Case17.hinges QuadFull27Case17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case17.base QuadFull27Case17.hinges QuadFull27Case17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadFull27Case18.base QuadFull27Case18.hinges QuadFull27Case18.normalizationDenominator private def zz366:"s016e"="s016e":=by decide+kernel theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case18.base QuadFull27Case18.hinges QuadFull27Case18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadFull27Case19.base QuadFull27Case19.hinges QuadFull27Case19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadFull27Case19.base QuadFull27Case19.hinges QuadFull27Case19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull27Case19.nonnegative x hx def pair20:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair20Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_20_base LocalFull27Pairs.compact_full27_pair_20_hinges private def zz367:"s016f"="s016f":=by decide+kernel theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalFull27Pairs.full27_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_20_base LocalFull27Pairs.compact_full27_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalFull27Pairs.full27_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair21Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_21_base LocalFull27Pairs.compact_full27_pair_21_hinges theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel private def zz368:"s0170"="s0170":=by decide+kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalFull27Pairs.full27_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_21_base LocalFull27Pairs.compact_full27_pair_21_hinges x theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalFull27Pairs.full27_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 0 1 false def pair22Rewrites:Rewrites:=[] def pair22Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_22_base LocalFull27Pairs.compact_full27_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalFull27Pairs.full27_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_22_base LocalFull27Pairs.compact_full27_pair_22_hinges x private def zz369:"s0171"="s0171":=by decide+kernel theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalFull27Pairs.full27_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair23Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_23_base LocalFull27Pairs.compact_full27_pair_23_hinges theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalFull27Pairs.full27_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_23_base LocalFull27Pairs.compact_full27_pair_23_hinges x theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalFull27Pairs.full27_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28] def pair24Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_24_base LocalFull27Pairs.compact_full27_pair_24_hinges private def zz370:"s0172"="s0172":=by decide+kernel theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalFull27Pairs.full27_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_24_base LocalFull27Pairs.compact_full27_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalFull27Pairs.full27_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28] def pair25Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_25_base LocalFull27Pairs.compact_full27_pair_25_hinges theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel private def zz371:"s0173"="s0173":=by decide+kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalFull27Pairs.full27_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_25_base LocalFull27Pairs.compact_full27_pair_25_hinges x theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalFull27Pairs.full27_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 0 3 false def pair26Rewrites:Rewrites:=[] def pair26Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_26_base LocalFull27Pairs.compact_full27_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalFull27Pairs.full27_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_26_base LocalFull27Pairs.compact_full27_pair_26_hinges x private def zz372:"s0174"="s0174":=by decide+kernel theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalFull27Pairs.full27_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair27Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_27_base LocalFull27Pairs.compact_full27_pair_27_hinges theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalFull27Pairs.full27_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_27_base LocalFull27Pairs.compact_full27_pair_27_hinges x theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalFull27Pairs.full27_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_28_base LocalFull27Pairs.compact_full27_pair_28_hinges private def zz373:"s0175"="s0175":=by decide+kernel theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalFull27Pairs.full27_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_28_base LocalFull27Pairs.compact_full27_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalFull27Pairs.full27_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_29_base LocalFull27Pairs.compact_full27_pair_29_hinges theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel private def zz374:"s0176"="s0176":=by decide+kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalFull27Pairs.full27_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_29_base LocalFull27Pairs.compact_full27_pair_29_hinges x theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalFull27Pairs.full27_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2] def pair30Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_30_base LocalFull27Pairs.compact_full27_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalFull27Pairs.full27_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_30_base LocalFull27Pairs.compact_full27_pair_30_hinges x private def zz375:"s0177"="s0177":=by decide+kernel theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalFull27Pairs.full27_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28] def pair31Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_31_base LocalFull27Pairs.compact_full27_pair_31_hinges theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalFull27Pairs.full27_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_31_base LocalFull27Pairs.compact_full27_pair_31_hinges x theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalFull27Pairs.full27_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_32_base LocalFull27Pairs.compact_full27_pair_32_hinges private def zz376:"s0178"="s0178":=by decide+kernel theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalFull27Pairs.full27_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_32_base LocalFull27Pairs.compact_full27_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalFull27Pairs.full27_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_33_base LocalFull27Pairs.compact_full27_pair_33_hinges theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel private def zz377:"s0179"="s0179":=by decide+kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalFull27Pairs.full27_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_33_base LocalFull27Pairs.compact_full27_pair_33_hinges x theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalFull27Pairs.full27_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair34Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_34_base LocalFull27Pairs.compact_full27_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalFull27Pairs.full27_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_34_base LocalFull27Pairs.compact_full27_pair_34_hinges x private def zz378:"s017a"="s017a":=by decide+kernel theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalFull27Pairs.full27_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair35Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_35_base LocalFull27Pairs.compact_full27_pair_35_hinges theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalFull27Pairs.full27_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_35_base LocalFull27Pairs.compact_full27_pair_35_hinges x theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalFull27Pairs.full27_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2] def pair36Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_36_base LocalFull27Pairs.compact_full27_pair_36_hinges private def zz379:"s017b"="s017b":=by decide+kernel theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalFull27Pairs.full27_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_36_base LocalFull27Pairs.compact_full27_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalFull27Pairs.full27_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair37Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_37_base LocalFull27Pairs.compact_full27_pair_37_hinges theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel private def zz380:"s017c"="s017c":=by decide+kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalFull27Pairs.full27_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_37_base LocalFull27Pairs.compact_full27_pair_37_hinges x theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalFull27Pairs.full27_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_38_base LocalFull27Pairs.compact_full27_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalFull27Pairs.full27_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_38_base LocalFull27Pairs.compact_full27_pair_38_hinges x private def zz381:"s017d"="s017d":=by decide+kernel theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalFull27Pairs.full27_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=pairSlack ((27 / 10)) (1 / 0x186a0) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalFull27Pairs.compact_full27_pair_39_base LocalFull27Pairs.compact_full27_pair_39_hinges theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalFull27Pairs.full27_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull27Pairs.compact_full27_pair_39_base LocalFull27Pairs.compact_full27_pair_39_hinges x theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalFull27Pairs.full27_pair_39_nonneg (hx 0) (hx 1) private def zz382:"s017e"="s017e":=by decide+kernel theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack ((27 / 10)) (1 / 0x186a0) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.Full27Rows private def zz2127:"s084f"="s084f":=by decide+kernel end section namespace Green24Proof.Full27Cyclic open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseSymmetry FullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack Full27Rows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact Full27Rows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse Full27Rows.rows p q same x] exact Full27Rows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack (27 / 10) (1 / 0x186a0) Full27Rows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact Full27Rows.pair_nonneg p q h same x hx · rw [← pairSlack_swap (27 / 10) (1 / 0x186a0) Full27Rows.rows p q same x] exact Full27Rows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) private def zz383:"s017f"="s017f":=by decide+kernel theorem rows_admissible:rowsAdmissible Full27Rows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials Full27Rows.rows theorem remaining_rows_count:remainingRows.length = 10:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (1 / 0x61a8:ℝ) * mass g ^ 2 ≤ weightedAggregate (27 / 10) h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack Full27Rows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack (27 / 10) (1 / 0x186a0) Full27Rows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum,stripPotentials_sound (27 / 10) h4 h3 h5 g Full27Rows.rows rows_admissible] at hs norm_num at hs change (1 / 0x61a8:ℝ) * mass g ^ 2 ≤ weightedAggregate (27 / 10) h4 h3 g (stripPotentials Full27Rows.rows) + 4 * deficit g linarith end Green24Proof.Full27Cyclic private def zz2128:"s0850"="s0850":=by decide+kernel end section namespace Green24Proof.Full27Mass open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseAggregation PhaseMassRows theorem remainingRows_eq:Full27Cyclic.remainingRows = [ ((0xedfe8ad / 0xbebc200), .balance 0 (1)), ((0xadfe05ab / 0x3b9aca00), .balance 1 (-1)), ((0x8c795e1 / 0x7735940), .balance 2 (1)), ((0xadfe05ab / 0x3b9aca00), .balance 3 (-1)), ((0x29171a43 / 0x3b9aca00), .child 0), (1, .heightChild 1), ((0x691b7 / 0xbebc200), .grandchild 2), ((0xc3f09 / 0x17d7840), .ordered 0), ((0x1d634e5 / 0x989680), .massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)), ((1 / 0xf424), .normalization)]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff PackedPhaseRowsEquality.labelEq PackedPhaseRowsEquality.labelEq_iff _ _).mp decide +kernel def oddDifference:Phase → ℚ:=fun p => (![0,1,0, -1]:Fin 4 → ℚ) p noncomputable def balanceMass {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := ((0xedfe8ad / 0xbebc200:ℝ) * phaseTotal h4 g 0 + (0x8c795e1 / 0x7735940:ℝ) * phaseTotal h4 g 2 - (0xadfe05ab / 0x3b9aca00:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) * (phaseTotal h4 g 0 + phaseTotal h4 g 2 - (27 / 10:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) private def zz384:"s0180"="s0180":=by decide+kernel theorem weighted_remaining_eq {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) : weightedAggregate (27 / 10) h4 h3 g Full27Cyclic.remainingRows = balanceMass h4 g + (0x29171a43 / 0x3b9aca00:ℝ) * rowAggregate (27 / 10) h4 h3 g (.child 0) + rowAggregate (27 / 10) h4 h3 g (.heightChild 1) + (0x691b7 / 0xbebc200:ℝ) * rowAggregate (27 / 10) h4 h3 g (.grandchild 2) + (0xc3f09 / 0x17d7840:ℝ) * rowAggregate (27 / 10) h4 h3 g (.ordered 0) + (0x1d634e5 / 0x989680:ℝ) * rowAggregate (27 / 10) h4 h3 g (.massSquare false oddDifference) + (1 / 0xf424:ℝ) * mass g ^ 2:=by rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_balance,rowAggregate_normalization] norm_num unfold balanceMass oddDifference ring theorem balanceMass_nonpos {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (horder:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hlow:(49 / 20:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ phaseTotal h4 g 0 + phaseTotal h4 g 2) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ (27 / 10:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)):balanceMass h4 g ≤ 0:=by have hv:=add_nonneg (phaseTotal_nonneg h4 g hg 1) (phaseTotal_nonneg h4 g hg 3) have hp:0 ≤ (0xedfe8ad / 0xbebc200:ℝ) * phaseTotal h4 g 0 + (0x8c795e1 / 0x7735940:ℝ) * phaseTotal h4 g 2 - (0xadfe05ab / 0x3b9aca00:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3):=by linarith exact mul_nonpos_of_nonneg_of_nonpos hp (sub_nonpos.mpr hhigh) theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (horder:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hlow:(49 / 20:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ phaseTotal h4 g 0 + phaseTotal h4 g 2) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ (27 / 10:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hchild:rowAggregate (27 / 10) h4 h3 g (.child 0) ≤ 0) (hheight:rowAggregate (27 / 10) h4 h3 g (.heightChild 1) ≤ 0) (hgrandchild:rowAggregate (27 / 10) h4 h3 g (.grandchild 2) ≤ 0) : weightedAggregate (27 / 10) h4 h3 g Full27Cyclic.remainingRows ≤ (1 / 0xf424:ℝ) * mass g ^ 2:=by rw [weighted_remaining_eq] have hb:=balanceMass_nonpos h4 g hg horder hlow hhigh have ho:rowAggregate (27 / 10) h4 h3 g (.ordered 0) ≤ 0 := rowAggregate_ordered_nonpos (27 / 10) h4 h3 g hg 0 (by simpa using horder) have hm:=rowAggregate_massSquare_nonpos (27 / 10) h4 h3 g oddDifference linarith theorem deficit_lower_bound_of_child_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (horder:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hlow:(49 / 20:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ phaseTotal h4 g 0 + phaseTotal h4 g 2) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ (27 / 10:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hchild:rowAggregate (27 / 10) h4 h3 g (.child 0) ≤ 0) (hheight:rowAggregate (27 / 10) h4 h3 g (.heightChild 1) ≤ 0) (hgrandchild:rowAggregate (27 / 10) h4 h3 g (.grandchild 2) ≤ 0) : (3 / 0x7a120:ℝ) * mass g ^ 2 ≤ deficit g:=by have hc:=Full27Cyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g hg horder hlow hhigh hchild hheight hgrandchild linarith end Green24Proof.Full27Mass private def zz2129:"s0851"="s0851":=by decide+kernel end section namespace Green24Proof.GrandchildRows open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics FullPhaseAggregation noncomputable def quadResidue (m:ℕ):ZMod m →+ ZMod (4 * m) := ZMod.lift m ⟨ { toFun:=fun z:ℤ => 4 * (z:ZMod (4 * m)) map_zero':=by simp map_add':=by intros; simp [mul_add] },by change 4 * ((m:ℤ):ZMod (4 * m)) = 0 simpa only [Int.cast_natCast,Nat.cast_mul,Nat.cast_ofNat] using (ZMod.natCast_self (4 * m))⟩ private def zz385:"s0181"="s0181":=by decide+kernel theorem quadResidue_natCast (m n:ℕ):quadResidue m (n:ZMod m) = 4 * (n:ZMod (4 * m)):=by unfold quadResidue rw [← Int.cast_natCast n,ZMod.lift_coe] simp only [Int.cast_natCast,AddMonoidHom.coe_mk,ZeroHom.coe_mk] theorem quadResidue_val {m:ℕ} [NeZero m] (x:ZMod m) : quadResidue m x = 4 * (x.val:ZMod (4 * m)):=by conv_lhs => rw [← ZMod.natCast_zmod_val x] exact quadResidue_natCast m x.val theorem quadResidue_mul_nat (m n:ℕ) (x:ZMod m) : quadResidue m (n * x) = n * quadResidue m x:=by simpa only [nsmul_eq_mul] using (quadResidue m).map_nsmul n x noncomputable def phaseEquiv (m:ℕ) [NeZero m]:(ZMod 4 × ZMod m) ≃ ZMod (4 * m) where toFun p:=((4 * p.2.val + p.1.val:ℕ):ZMod (4 * m)) invFun x:=(((x.val % 4:ℕ):ZMod 4),((x.val / 4:ℕ):ZMod m)) left_inv:=by rintro ⟨r,i⟩ have hr:=r.val_lt have hi:=i.val_lt have hlt:4 * i.val + r.val < 4 * m:=by omega simp only [ZMod.val_natCast_of_lt hlt] apply Prod.ext · have hmod:(4 * i.val + r.val) % 4 = r.val:=by omega simp only [hmod,ZMod.natCast_zmod_val] · have hdiv:(4 * i.val + r.val) / 4 = i.val:=by omega simp only [hdiv,ZMod.natCast_zmod_val] right_inv:=by intro x have hx:=x.val_lt have hmod:x.val % 4 < 4:=Nat.mod_lt _ (by norm_num) have hdiv:x.val / 4 < m:=by omega simp only [ZMod.val_natCast_of_lt hmod,ZMod.val_natCast_of_lt hdiv] rw [show 4 * (x.val / 4) + x.val % 4 = x.val by omega] exact ZMod.natCast_zmod_val x theorem phaseEquiv_apply {m:ℕ} [NeZero m] (r:ZMod 4) (i:ZMod m) : phaseEquiv m (r,i) = quadResidue m i + (r.val:ZMod (4 * m)):=by change ((4 * i.val + r.val:ℕ):ZMod (4 * m)) = _ rw [Nat.cast_add,Nat.cast_mul,Nat.cast_ofNat,quadResidue_val] private def zz386:"s0182"="s0182":=by decide+kernel theorem phaseCast_apply {m:ℕ} [NeZero m] (r:Phase) (i:ZMod m) : ZMod.castHom (dvd_mul_right 4 m) (ZMod 4) (phaseEquiv m (r,i)) = r:=by rw [phaseEquiv_apply,quadResidue_val] simp only [map_add,map_mul,map_ofNat,map_natCast, show (4:ZMod 4) = 0 from rfl,zero_mul,zero_add,ZMod.natCast_zmod_val] theorem phaseEquiv_affine_same {m:ℕ} [NeZero m] (r:Phase) (j k:ZMod m) : 3 * phaseEquiv m (r,k) - 2 * phaseEquiv m (r,j) = phaseEquiv m (r,3 * k - 2 * j):=by rw [phaseEquiv_apply,phaseEquiv_apply,phaseEquiv_apply] have h3:quadResidue m (3 * k) = 3 * quadResidue m k:=by simpa only [Nat.cast_ofNat] using quadResidue_mul_nat m 3 k have h2:quadResidue m (2 * j) = 2 * quadResidue m j:=by simpa only [Nat.cast_ofNat] using quadResidue_mul_nat m 2 j rw [map_sub,h3,h2] ring noncomputable def grandchild {m:ℕ} [NeZero m] (g:ZMod (4 * m) → ℝ) (r:Phase):ZMod m → ℝ := fun i => g (phaseEquiv m (r,i)) theorem grandchild_nonneg {m:ℕ} [NeZero m] (g:ZMod (4 * m) → ℝ) (hg:∀ i,0 ≤ g i) (r:Phase) : ∀ i,0 ≤ grandchild g r i:=fun i => hg (phaseEquiv m (r,i)) theorem grandchild_value {m:ℕ} [NeZero m] (S:ℚ) (h3:3 ∣ 4 * m) (g:ZMod (4 * m) → ℝ) (r a b:Phase) (j k:ZMod m) : rowValue S (dvd_mul_right 4 m) h3 g (.grandchild r) (phaseEquiv m (a,j)) (phaseEquiv m (b,k)) = if a = r ∧ b = r then expressionEval area (quadPoint (grandchild g r) j k) + expressionEval (pairProduct (-8)) (pairPoint (grandchild g r) j k) else 0:=by by_cases h:a = r ∧ b = r · rcases h with ⟨rfl,rfl⟩ simp only [rowValue,rowQuad,rowPair,phaseCast_apply,and_self,if_true] rw [area_eval,area_eval,pairProduct_eval,pairProduct_eval] simp [quadPoint,pairPoint,Matrix.cons_val_two,Matrix.cons_val_three,phaseEquiv_affine_same,grandchild] · simp only [rowValue,rowQuad,rowPair,phaseCast_apply,if_neg h, expressionEval,List.map_nil,List.sum_nil,add_zero] private def zz387:"s0183"="s0183":=by decide+kernel theorem rowAggregate_grandchild {m:ℕ} [NeZero m] (S:ℚ) (h3:3 ∣ 4 * m) (g:ZMod (4 * m) → ℝ) (r:Phase) : rowAggregate S (dvd_mul_right 4 m) h3 g (.grandchild r) = -4 * deficit (grandchild g r):=by unfold rowAggregate have hk (a:Phase) (j:ZMod m) : (∑ k,rowValue S (dvd_mul_right 4 m) h3 g (.grandchild r) (phaseEquiv m (a,j)) k) = ∑ b:Phase, ∑ k:ZMod m, rowValue S (dvd_mul_right 4 m) h3 g (.grandchild r) (phaseEquiv m (a,j)) (phaseEquiv m (b,k)):=by rw [← (phaseEquiv m).sum_comp,Fintype.sum_prod_type] rw [← (phaseEquiv m).sum_comp,Fintype.sum_prod_type] simp_rw [hk,grandchild_value] simp only [ite_and,Finset.sum_ite_irrel,Finset.sum_const_zero, Finset.sum_ite_eq',Finset.mem_univ,if_true] simp only [Finset.sum_add_distrib,area_sum,pairProduct_sum] unfold deficit norm_num ring theorem grandchild_mass {m:ℕ} [NeZero m] (g:ZMod (4 * m) → ℝ) (r:Phase) : mass (grandchild g r) = PhaseMassRows.phaseTotal (dvd_mul_right 4 m) g r:=by unfold PhaseMassRows.phaseTotal colourTotal rw [← (phaseEquiv m).sum_comp,Fintype.sum_prod_type] simp only [phaseCast_apply,Finset.sum_ite_irrel,Finset.sum_const_zero, Finset.sum_ite_eq',Finset.mem_univ,if_true] rfl end Green24Proof.GrandchildRows private def zz2130:"s0852"="s0852":=by decide+kernel end section namespace Green24Proof.HeightChildRows open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseAggregation PhaseMassRows ChildRows def heightDifference (r:Fin 2) (p:Phase):ℚ := if parity p = r then (if p.val < 2 then 1 else -1) else 0 private theorem expressionEval_nil (x:Point):expressionEval [] x = 0:=rfl theorem height_pair_decomposition (S:ℚ) (r:Fin 2) (p q:Phase) (same:Bool) (x:Point) : expressionEval (rowPair S (.heightChild r) p q same) x = expressionEval (rowPair S (.child r) p q same) x + (24 / 5:ℝ) * expressionEval (rowPair S (.massSquare false (heightDifference r)) p q same) x + if parity p = r ∧ parity q = r then (49 / 0x7d:ℝ) * expressionEval rhoExpression x else 0:=by fin_cases r <;> fin_cases p <;> fin_cases q all_goals norm_num [rowPair,parity,ZMod.val,heightDifference,expressionEval_append, expressionEval_scale,pairProduct_eval,expressionEval_nil] <;> ring noncomputable def selectedRho {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (r:Fin 2):ℝ := ∑ j, ∑ k,if parity (ZMod.castHom h4 (ZMod 4) j) = r ∧ parity (ZMod.castHom h4 (ZMod 4) k) = r then rho (g j) (g k) else 0 private def zz388:"s0184"="s0184":=by decide+kernel theorem height_value_decomposition {q:ℕ} (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (r:Fin 2) (j k:ZMod q) : rowValue S h4 h3 g (.heightChild r) j k = rowValue S h4 h3 g (.child r) j k + (24 / 5:ℝ) * rowValue S h4 h3 g (.massSquare false (heightDifference r)) j k + (49 / 0x7d:ℝ) * (if parity (ZMod.castHom h4 (ZMod 4) j) = r ∧ parity (ZMod.castHom h4 (ZMod 4) k) = r then rho (g j) (g k) else 0):=by unfold rowValue rw [height_pair_decomposition] have hrho:expressionEval rhoExpression (pairPoint g j k) = rho (g j) (g k) := rhoExpression_eval _ (hg j) (hg k) rw [hrho] simp only [rowQuad,expressionEval_nil] split_ifs <;> ring theorem rowAggregate_height_decomposition {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (r:Fin 2) : rowAggregate S h4 h3 g (.heightChild r) = rowAggregate S h4 h3 g (.child r) + (24 / 5:ℝ) * rowAggregate S h4 h3 g (.massSquare false (heightDifference r)) + (49 / 0x7d:ℝ) * selectedRho h4 g r:=by unfold rowAggregate simp_rw [height_value_decomposition S h4 h3 g hg r] simp only [Finset.sum_add_distrib, ← Finset.mul_sum] rfl theorem selectedRho_even {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (u v:ZMod m → ℝ) : selectedRho h4 (interleave u v) 0 = 2 * energy u:=by unfold selectedRho rw [sum_parity_pairs] simp only [phase_parity_even,phase_parity_odd,interleave_even,interleave_odd] norm_num unfold energy ring theorem selectedRho_odd {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (u v:ZMod m → ℝ) : selectedRho h4 (interleave u v) 1 = 2 * energy v:=by unfold selectedRho rw [sum_parity_pairs] simp only [phase_parity_even,phase_parity_odd,interleave_even,interleave_odd] norm_num unfold energy ring private def zz389:"s0185"="s0185":=by decide+kernel theorem heightDifference_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (r:Fin 2) : massWeighted h4 g (fun p => (heightDifference r p:ℝ)) = phaseTotal h4 g (r.val:Phase) - phaseTotal h4 g ((r.val:Phase) + 2):=by rw [massWeighted_phaseTotal,sum_phase] fin_cases r <;> norm_num [heightDifference,parity,ZMod.val_ofNat,ZMod.val_one_eq_one_mod] <;> ring theorem rowAggregate_height_odd {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : rowAggregate S h4 h3 (interleave u v) (.heightChild 1) = -4 * deficit v + (98 / 0x7d:ℝ) * energy v - (24 / 5:ℝ) * (phaseTotal h4 (interleave u v) 1 - phaseTotal h4 (interleave u v) 3) ^ 2:=by rw [rowAggregate_height_decomposition S h4 h3 (interleave u v) (interleave_nonneg u v hu hv), rowAggregate_child_odd,rowAggregate_massSquare,selectedRho_odd,heightDifference_sum] norm_num ring theorem cast_four_double {m:ℕ} (h4:4 ∣ 2 * m) (h2:2 ∣ m) (x:ZMod m) : ZMod.castHom h4 (ZMod 4) (doubleResidue m x) = doubleResidue 2 (ZMod.castHom h2 (ZMod 2) x):=by obtain ⟨z,rfl⟩:=ZMod.intCast_surjective x simp only [map_intCast,doubleResidue,ZMod.lift_coe,AddMonoidHom.coe_mk,ZeroHom.coe_mk, map_mul,map_ofNat] theorem cast_four_even {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h2:2 ∣ m) (x:ZMod m) : ZMod.castHom h4 (ZMod 4) (parityEquiv m (0,x)) = doubleResidue 2 (ZMod.castHom h2 (ZMod 2) x):=by rw [parityEquiv_apply] simp only [ZMod.val_zero,Nat.cast_zero,add_zero,cast_four_double h4 h2] private def zz390:"s0186"="s0186":=by decide+kernel theorem cast_four_odd {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h2:2 ∣ m) (x:ZMod m) : ZMod.castHom h4 (ZMod 4) (parityEquiv m (1,x)) = doubleResidue 2 (ZMod.castHom h2 (ZMod 2) x) + 1:=by rw [parityEquiv_apply,map_add,cast_four_double h4 h2,map_natCast] norm_num [ZMod.val_one_eq_one_mod] theorem doubleResidue_two_one:doubleResidue 2 (1:ZMod 2) = (2:ZMod 4):=by simpa using doubleResidue_natCast 2 1 theorem phaseTotal_interleave_one {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) : phaseTotal h4 (interleave u v) 1 = classMass (ZMod.castHom h2 (ZMod 2)) v 0:=by unfold phaseTotal colourTotal rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type,sum_zmod_two] simp only [cast_four_even h4 h2,cast_four_odd h4 h2,interleave_even,interleave_odd] have he (i:ZMod m) : (if doubleResidue 2 (ZMod.castHom h2 (ZMod 2) i) = (1:ZMod 4) then u i else 0) = 0:=by rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero,if_neg (by decide:(0:ZMod 4) ≠ 1)] · rw [h,doubleResidue_two_one,if_neg (by decide:(2:ZMod 4) ≠ 1)] have ho (i:ZMod m) : (if doubleResidue 2 (ZMod.castHom h2 (ZMod 2) i) + 1 = (1:ZMod 4) then v i else 0) = if ZMod.castHom h2 (ZMod 2) i = 0 then v i else 0:=by rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero]; norm_num · rw [h,doubleResidue_two_one]; norm_num [show (3:ZMod 4) ≠ 1 by decide] simp only [he,ho,Finset.sum_const_zero,zero_add] rfl theorem phaseTotal_interleave_three {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) : phaseTotal h4 (interleave u v) 3 = classMass (ZMod.castHom h2 (ZMod 2)) v 1:=by unfold phaseTotal colourTotal rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type,sum_zmod_two] simp only [cast_four_even h4 h2,cast_four_odd h4 h2,interleave_even,interleave_odd] have he (i:ZMod m) : (if doubleResidue 2 (ZMod.castHom h2 (ZMod 2) i) = (3:ZMod 4) then u i else 0) = 0:=by rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero,if_neg (by decide:(0:ZMod 4) ≠ 3)] · rw [h,doubleResidue_two_one,if_neg (by decide:(2:ZMod 4) ≠ 3)] have ho (i:ZMod m) : (if doubleResidue 2 (ZMod.castHom h2 (ZMod 2) i) + 1 = (3:ZMod 4) then v i else 0) = if ZMod.castHom h2 (ZMod 2) i = 1 then v i else 0:=by rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero]; norm_num [show (1:ZMod 4) ≠ 3 by decide] · rw [h,doubleResidue_two_one]; norm_num simp only [he,ho,Finset.sum_const_zero,zero_add] rfl private def zz391:"s0187"="s0187":=by decide+kernel theorem rowAggregate_height_odd_nonpos {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hh:(49 / 0xfa:ℝ) * energy v - (6 / 5:ℝ) * (classMass (ZMod.castHom h2 (ZMod 2)) v 0 - classMass (ZMod.castHom h2 (ZMod 2)) v 1) ^ 2 ≤ deficit v) : rowAggregate S h4 h3 (interleave u v) (.heightChild 1) ≤ 0:=by rw [rowAggregate_height_odd S h4 h3 u v hu hv, phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2] linarith end Green24Proof.HeightChildRows private def zz2131:"s0853"="s0853":=by decide+kernel end section namespace Green24Proof.LocalHeightStrongPairs def compact_heightStrong_pair_6_base:CompactPair.Quadratic:=⟨(49 / 50),(0x93 / 0x7d),(49 / 50)⟩ def compact_heightStrong_pair_6_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1,3⟩,⟨(-49 / 0x1f4),3,1⟩] noncomputable def heightStrong_pair_6 (x y:ℝ):ℝ := CompactPair.expressionEval compact_heightStrong_pair_6_base compact_heightStrong_pair_6_hinges x y def compact_heightStrong_pair_6_cuts:List ℚ:=[] theorem compact_heightStrong_pair_6_check : CompactPair.expressionCheckPSD compact_heightStrong_pair_6_base compact_heightStrong_pair_6_hinges 0 compact_heightStrong_pair_6_cuts = true := by decide +kernel theorem compact_heightStrong_pair_6_representation (x y:ℝ) : heightStrong_pair_6 x y = CompactPair.expressionEval compact_heightStrong_pair_6_base compact_heightStrong_pair_6_hinges x y:=by rfl theorem heightStrong_pair_6_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ heightStrong_pair_6 x y:=by rw [compact_heightStrong_pair_6_representation] exact CompactPair.expressionCheckPSD_sound compact_heightStrong_pair_6_check hy (by simpa using hx) def compact_heightStrong_pair_7_base:CompactPair.Quadratic:=⟨(49 / 50),(0x93 / 0x7d),(49 / 50)⟩ def compact_heightStrong_pair_7_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1,3⟩,⟨(-49 / 0x1f4),3,1⟩] noncomputable def heightStrong_pair_7 (x y:ℝ):ℝ := CompactPair.expressionEval compact_heightStrong_pair_7_base compact_heightStrong_pair_7_hinges x y def compact_heightStrong_pair_7_cuts:List ℚ:=[] private def zz392:"s0188"="s0188":=by decide+kernel theorem compact_heightStrong_pair_7_check : CompactPair.expressionCheckPSD compact_heightStrong_pair_7_base compact_heightStrong_pair_7_hinges 0 compact_heightStrong_pair_7_cuts = true := by decide +kernel theorem compact_heightStrong_pair_7_representation (x y:ℝ) : heightStrong_pair_7 x y = CompactPair.expressionEval compact_heightStrong_pair_7_base compact_heightStrong_pair_7_hinges x y:=by rfl theorem heightStrong_pair_7_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ heightStrong_pair_7 x y:=by rw [compact_heightStrong_pair_7_representation] exact CompactPair.expressionCheckPSD_sound compact_heightStrong_pair_7_check hy (by simpa using hx) def compact_heightStrong_pair_8_base:CompactPair.Quadratic:=⟨(49 / 50),(0x93 / 0x7d),(49 / 50)⟩ def compact_heightStrong_pair_8_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1,3⟩,⟨(-49 / 0x1f4),3,1⟩] noncomputable def heightStrong_pair_8 (x y:ℝ):ℝ := CompactPair.expressionEval compact_heightStrong_pair_8_base compact_heightStrong_pair_8_hinges x y def compact_heightStrong_pair_8_cuts:List ℚ:=[] theorem compact_heightStrong_pair_8_check : CompactPair.expressionCheckPSD compact_heightStrong_pair_8_base compact_heightStrong_pair_8_hinges 0 compact_heightStrong_pair_8_cuts = true := by decide +kernel private def zz393:"s0189"="s0189":=by decide+kernel theorem compact_heightStrong_pair_8_representation (x y:ℝ) : heightStrong_pair_8 x y = CompactPair.expressionEval compact_heightStrong_pair_8_base compact_heightStrong_pair_8_hinges x y:=by rfl theorem heightStrong_pair_8_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ heightStrong_pair_8 x y:=by rw [compact_heightStrong_pair_8_representation] exact CompactPair.expressionCheckPSD_sound compact_heightStrong_pair_8_check hy (by simpa using hx) def compact_heightStrong_pair_9_base:CompactPair.Quadratic:=⟨(49 / 50),(0x93 / 0x7d),(49 / 50)⟩ def compact_heightStrong_pair_9_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1,3⟩,⟨(-49 / 0x1f4),3,1⟩] noncomputable def heightStrong_pair_9 (x y:ℝ):ℝ := CompactPair.expressionEval compact_heightStrong_pair_9_base compact_heightStrong_pair_9_hinges x y def compact_heightStrong_pair_9_cuts:List ℚ:=[] theorem compact_heightStrong_pair_9_check : CompactPair.expressionCheckPSD compact_heightStrong_pair_9_base compact_heightStrong_pair_9_hinges 0 compact_heightStrong_pair_9_cuts = true := by decide +kernel theorem compact_heightStrong_pair_9_representation (x y:ℝ) : heightStrong_pair_9 x y = CompactPair.expressionEval compact_heightStrong_pair_9_base compact_heightStrong_pair_9_hinges x y:=by rfl private def zz394:"s018a"="s018a":=by decide+kernel theorem heightStrong_pair_9_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ heightStrong_pair_9 x y:=by rw [compact_heightStrong_pair_9_representation] exact CompactPair.expressionCheckPSD_sound compact_heightStrong_pair_9_check hy (by simpa using hx) def compact_heightStrong_pair_10_base:CompactPair.Quadratic:=⟨(49 / 50),(0x93 / 0x7d),(49 / 50)⟩ def compact_heightStrong_pair_10_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1,3⟩,⟨(-49 / 0x1f4),3,1⟩] noncomputable def heightStrong_pair_10 (x y:ℝ):ℝ := CompactPair.expressionEval compact_heightStrong_pair_10_base compact_heightStrong_pair_10_hinges x y def compact_heightStrong_pair_10_cuts:List ℚ:=[] theorem compact_heightStrong_pair_10_check : CompactPair.expressionCheckPSD compact_heightStrong_pair_10_base compact_heightStrong_pair_10_hinges 0 compact_heightStrong_pair_10_cuts = true := by decide +kernel theorem compact_heightStrong_pair_10_representation (x y:ℝ) : heightStrong_pair_10 x y = CompactPair.expressionEval compact_heightStrong_pair_10_base compact_heightStrong_pair_10_hinges x y:=by rfl theorem heightStrong_pair_10_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ heightStrong_pair_10 x y:=by rw [compact_heightStrong_pair_10_representation] exact CompactPair.expressionCheckPSD_sound compact_heightStrong_pair_10_check hy (by simpa using hx) def compact_heightStrong_pair_11_base:CompactPair.Quadratic:=⟨(49 / 50),(0x93 / 0x7d),(49 / 50)⟩ def compact_heightStrong_pair_11_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1,3⟩,⟨(-49 / 0x1f4),3,1⟩] noncomputable def heightStrong_pair_11 (x y:ℝ):ℝ := CompactPair.expressionEval compact_heightStrong_pair_11_base compact_heightStrong_pair_11_hinges x y def compact_heightStrong_pair_11_cuts:List ℚ:=[] private def zz395:"s018b"="s018b":=by decide+kernel theorem compact_heightStrong_pair_11_check : CompactPair.expressionCheckPSD compact_heightStrong_pair_11_base compact_heightStrong_pair_11_hinges 0 compact_heightStrong_pair_11_cuts = true := by decide +kernel theorem compact_heightStrong_pair_11_representation (x y:ℝ) : heightStrong_pair_11 x y = CompactPair.expressionEval compact_heightStrong_pair_11_base compact_heightStrong_pair_11_hinges x y:=by rfl theorem heightStrong_pair_11_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ heightStrong_pair_11 x y:=by rw [compact_heightStrong_pair_11_representation] exact CompactPair.expressionCheckPSD_sound compact_heightStrong_pair_11_check hy (by simpa using hx) end Green24Proof.LocalHeightStrongPairs private def zz2132:"s0854"="s0854":=by decide+kernel end section namespace Green24Proof.QuadHeightStrongCase0 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x176d004aa36, -0x8bb2c97000, -0xd18c2e2800,0], ![-0x8bb2c97000, -0x4d713f6eb4e,0xc2e0afba7a,0x7df663e9cc], ![-0xd18c2e2800,0xc2e0afba7a, -0x38c0a1d5800,0x8bb2c97000], ![0,0x7df663e9cc,0x8bb2c97000, -0x45d964b800]] noncomputable def hinges:Hinges:=[(0xeb72327ba,l14),(0x1b8b4e6b09,l17),(0xa8b52805ff,l15),(-0x45d964b800,l27),(0x45d964b800,l29),(-0xeb72327ba,l25),(0x1c0e7f98e6,l30),(0x45d964b800,l33),(-0x45d964b800,l35),(0x45d964b800,l37),(-0x1c0e7f98e6,l43),(-0xa8b52805ff,l41),(0x45d964b800,l51),(-0x1b8b4e6b09,l62)] def normalizationDenominator:ℤ:=0x8bb2c97000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x45d964b800,l27),(0x45d964b800,l29),(0x45d964b800,l33),(-0x45d964b800,l35),(0x45d964b800,l37),(0x45d964b800,l51),(0xa8b52805ff,l15),(-0xa8b52805ff,l41),(0x1c0e7f98e6,l30),(-0x1c0e7f98e6,l43),(0x1b8b4e6b09,l17),(-0x1b8b4e6b09,l62),(0xeb72327ba,l14),(-0xeb72327ba,l25)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x5406200800000000340290040000000005018802000009c08802c602000094260900b400c00000000f00490060001a01040098c05000000d02201c6018000000068b033004000642a0980f20060000010870078c03000000000e80c401000000000a8052008000002c1080f1806000330d04807900300000f0c8280a801000000054440f30080000000341819802000000001e014802000000000680c4010000000005805200800000110500618060000000009018802000000001100a401000000044340f300800000001c2819803420a404200335006002b0480b013a802001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x208393cf79a57f848d0534180262809140ea7ffa2fbc92110267d6b5fa5c84002f02058c0e2ff1112c48d09c06a3bb840c50735aa43c4849839c1f02658205cc6169ae3801e817b654330014004000056481102e080076469ecc58c0064713ea891b09281771f861872842e62a0810064713ea8082545badd445b02138022c6452a6f29fe48df306dbd34030eda248e51a0a08934a772f2081292bacbe803802a1325b22c60088e4edda8938213804000062080017b9d0d4000003b8cab541460a89220e20c21209000a008013343ce47d806fc78bf0349ca9bf2b448279e9eab8c36543af9351593862a86140006c880584ec70a0e015950c5904b582658c0b951f09421b61015214918d9b49cfedff4ed016760a185483049fb466aeeab100c38fbd38dc6c6f9165fcd8484126f26993d52e467a4209000575a0a80e6eef2069038d0daa11e1c113c2710402195e44062c6bb9844a5da48d174c01e03050cc8941cecf0c021b7a008d36504270080000911b1cfbbd1624d512340d54141e692441d8a238bc3a2865bd0500aaf4b082f67b3f67192100c2e7cba280c1a41fa68142ad1c10ac05163b633b22d1d2c62abe48e97e48d434e291ecc50cc228d9fed060ce0868f3151803fc008c96acc084e010000155200062e6244622c4409a85bc3ab2a957d8a26ee94e5728f8d05395ca3e330a48910710610304800500400a0a1a3ae452ab870bd31ab0fb5fa9e1b918608459a261d8cde4c5613eb86418bd40008f081082800268081006f85b63b7bb8fdfa01e1538d3dfac67c98946567e04364b4205c124ee5ad4e0c1df813281159a4e2f68d803a1382cce1031af02f5eba33eb793f91a18e5daf2ccf7c070b6a673c023f51400a386f53bbb453e00140ca72024d655fd286e54e3c8f0a60f90b9f8718f04a5f479c2b4dae29f754c1606ad0b1b112516122ef007dc6380a045d45cf5d72ea444f27653d8728d) <<< 16000) + 0xb5a80dc6da82402cabf8718e5811800013f0e084735a8e8638830850722a6ad7a06044735a8e86388304af6460f607006005ef2368b2f60503910b66164160402ff83a2229be0040dbb69a6b1e24ccae0ff7c228772e406004800023b203e4301e0500e80a0694e41b3ab4f81c25a21858d45e01825886534239ac1421e0b2c846ca02001e0b2c846ca01c03034bb73fc581400f0596423650015ebcf90dda7687f925f2aed82e3718300205100c22dd138640ac13d1bb6f0409d1a52b59224001f247c5518b408280045395ca3e35176592dffec3cfc8a1cc1409441029020e082015f38944e12d7a9a0d21494de70062c119876da8a1c9ddc31ca84398a340006a480684c03017c452fb7ed9d4ba1c3b0f5c153444a102008b307c3397041068c1d9829ca0c0008b307c3397080088063c5f25600321850c00800003304001254d08b99be049342bfcf47ebcb60c67b89e3522c40cc387106450679eb7b4c5147cfb6a3dd56e08aaf7b6f2f507bd8b700ac601de931c9c74a5339b4eb6a3db27fd1f7d30c0bc07810c6004875b919ffecfea9806035b128caf6e9a64779de575ab1a59c5423e4b7d992c059a83ddbcf27f621276b31cb82400001e0101c1580608c06c3750b78756552afb144ddd29cae51f1a0a72b947c661489029000e00a004000316683b0d7b6b940695eadd50354eb42d08aef60164aa36556a485a045b2e5d1e18bdc4882fb56b1ce2420d16c419a90024f179a81a4002500858802595a27e585013fa9d4e404629d02e2c40212b134c1e2008baf4739b500240040000881a0753ba1274a3825133d8efe0c082d17e26f8202ea43c7fec9010940200001ce601002008000022321ad45a958f02423202f4e3666033bfc0dde4050434b47c725060988e130fc82404995af05c030017927d5cec9c109c021045bd752c4603060d43ce1d4040cf7bbe320b23042700800005d100b05000139101a09c0200401106668ef95cd07007f3105a1642004e8ac740982610500080000bd202a1a01205000092100d1580606e05082b3e8d50187c45eacbe28b046aba07fd29203b74d08d6b180061185086a4a084e01080200802000008880c848060260140b92df7700f64f549d8ab6c861006deebb8eb27c8d8e4409e49a1f6026000000000000000000025a2e81b34a0881642084846025804803002001ed36a378142e0fab01f6e592fab3e7d7df64c4b43484341f742822f93453a19be59217d41e3b729a878078916a2c170ccb2a2c01004011041f36872c38685065aa69229a00b32d73c484009e2adf5268c00e4c55e0744a084c01000011d202e1200016f2016120004fc202c1b802008022c089c8459abc60093d96f93e100157e063ef88c10980200001724054240281301309009008044040002be40021108007dc9f0a5835b2268e1600f0526c86b3d37e3d0480000000000000000008ea72b947c669cae51f1a0e15c9e10700000000001390818608c00200000b39e6e0034f3a596fbcb02fee8ec0b91c1ef7a83165a3ee56f039c0a9cc31b3603cefc7d79512924bcb0e1c83af2ae93b93ec90f2141ca3efcc3c38743187fc2ca9c1a25450cb973198754d626608266dbf0537213a0528edf3ac0d0a3f8d9a0009864005a3c8010d59c42d891488005dedc760e253be66e3a0000000000000000004643823022022802000801e0fc6e2443b9b2069a8c8c55585ba9b129d1c1d5c9f8f32479d664ed70ab7fe25b16469b5ccc63954b84ec98ea18520c5fb850ff686f19c4071b02b7557060e50a97ce5a860239dead180490209c02101a3054fcf47060c31cddbae184043bc9054ca410106f25776ac84085811f74d981073dbdeae364930414804000058c80800ea636d7f290177b71d83894ef99b8e80000000000000000011a9cae51f19d395ca3e342afb144ddd62232092e485065084883881823002010b282f0cbc05de273060d39461248a9588a372feaf9c0021d5286bd3092f23c0393bf133daa32accf5c47809bbea3604cb2a2c897c4d10710b6b1c4000da12131cf84106d828d8721c450400368484c73e0825237ff0b79ff7e8504310280000ae1bdb8ec1c4a77ccdc740000000000000000008d4e5728f8ce9cae51f1a157d8a26eeb11190497242821851452842441c4243100080c000080364504042a9fba489464ed3b95c90cdda8d9f094c009c010000172403c1400055e403824000f52400291c80100a0315690059f820030c5afa7ec0808e6556e832046185001081144a2ed14c140144a2ed14c0409c2f49fc4d09841400220504790274942021522bb75e02208280080000459000164201a2300c09d05ca7955ead0408f259073cb000978d8ffac411841380400280782fdffcb40a040fe1c942b6c9021280228667f5ce7c30404c8b47378a070a58b1e964e8c10f035850d4281351354cad45009f2c4a43f850026a461cb213821380400006208048280008ec80584e0180200800a01c0200401183071993c4f160bc2e076940604b6cb66e8a1009647ccd49040870ee31fc128212804302aa20db65d1c26f798ff2e1c10f55b7e8d0c09685b1ad790009002123289d0d3b7183428bcc2983835e3814f64701e1bf0b16c800460100000dd20003b24000c2c804848000d748001d79000707200131a6870df99190ed141c885c949558801ecbbafbf9c200901f4b68c812041480428b03bc863f71050c06ed46cf848a0941a80472c3598415802000032080404801c1400c0a00501002008000910801928008540020200001000cbc9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 15 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightStrongCase0" = "QuadHeightStrongCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 15 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightStrongCase0 private def zz2133:"s0855"="s0855":=by decide+kernel end section namespace Green24Proof.QuadHeightStrongCase1 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x18fccd1c6a, -0x9502f9000, -0xdf8475800,0], ![-0x9502f9000, -0x566818345a,0xee47e852a,0x77277ecd2], ![-0xdf8475800,0xee47e852a, -0x3c89352800,0x9502f9000], ![0,0x77277ecd2,0x9502f9000, -0x4a817c800]] noncomputable def hinges:Hinges:=[(0x7da0204,l14),(0x1d6164b67,l17),(0xbb8ec2b62,l15),(-0x4a817c800,l27),(0x4a817c800,l29),(-0x7da0204,l25),(0x165301269,l30),(0x4a817c800,l33),(-0x4a817c800,l35),(0x4a817c800,l37),(-0x165301269,l43),(-0xbb8ec2b62,l41),(0x4a817c800,l51),(-0x1d6164b67,l62)] def normalizationDenominator:ℤ:=0x9502f9000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x4a817c800,l27),(0x4a817c800,l29),(0x4a817c800,l33),(-0x4a817c800,l35),(0x4a817c800,l37),(0x4a817c800,l51),(0xbb8ec2b62,l15),(-0xbb8ec2b62,l41),(0x1d6164b67,l17),(-0x1d6164b67,l62),(0x165301269,l30),(-0x165301269,l43),(0x7da0204,l14),(-0x7da0204,l25)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1a014802000000000280c401000004e04401630100004a1304805a00600000000780248030000d0082004c602800000681100e300c0000000345819802000321504c079003000000843803c6018000000007406200800000000540290040000016084078c03000198682403c801800000054440f300800003c320a02a00400000001a0c0cc01000000000f00a4010000000005805200800000110500618060000000009018802000000001100a401000000044340f300800000001c28198020056090160275004a10520210019a803001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x1c72a5497047c1993c3d652f8888c816f54c30ff66b61b3758cfc60002040d82300004c1e5a62fa114e000804345b4e7d60f1c363443eeb8004e834304075c32a000810cc218a1429a2bcb4c8168ac7328107146fd6a5c60804c133f87d860049a2619ec5001eba87b892608240080000a2991124e852220bf863fe868b57801c4aa5555535212e6c3be35473dc6127cedf84647906ab336c617fe2413ffdc26581763a0eefa1dc0a08002c490c6843d9ecce5da1696b1409672c8718efafb8c01e0f48442c3c38107744be4ebb725091a5ab4a2a84bc758084509e067ad2192d9346d5681a60c621000001de900b05d8e7bbdc5aeeba567ff4a048cb9f8fafc17f42a40f1c28655c97fa9bbb61e7b86c18731b055cc829f495ec3a4842e8dcf496fe391d2e24082046bee22a86e04498e658009e0f39f5bd78b74004dac3ce5d721c113029163b3585d2a858ce1575a4b923500cdc82e286cc8d57450c022662b1f0d41088010000210605424750758177eeac859667f201824e838a3c1d25fca0270fc2001a044210e7f7eef795eb3570805734dda8ad7d5357d84abdf58d349b6bd9fc64a042e07200007f0c507c3d89813859378f8d263e4a702342e7b5970d0b9ed65a1291220e20c20608209000801622fc8518853f46e7df8c01a5758ffe3299047003349e33463726e70c7b16a80011010200d00041e101f15f09d6290f061dc618d090038150f8889e1d3514be8d8bbeea4eb8204fa7cb8fade185c3fe858164ca2ce66e57ae73182bd1cce3631081549c36e04b935afeab6e71263ebd1c49807036227b5cccb5348009cf60987e6ec7765320a0b6166c454b2d582c1df90ab9a038e3b797394e7e2ddc74cce1c3eae19ac6b3fc52f1760d4d34570554556aba54668e30efc8f9834c997615a23e0c57b7399fcd162484a3e871ee5f08b10c0a67321a5d525efefa10048c7324a80000b5c7b31983e18b42a03b51f46855a271a183c77c69a3a5765db42d20000000000000000008a23041843021823002802002062c70515d98f01a75917e06ab325fdb31c4e46152cf70ee855250d78962eb7d79d1db22bc0b99a59b90571194000b8080f10c074140380281a6270bef059c7099260baeae5860950b8aaf49ac50886203e4e4c880086203e4e4c8700b646c0a9f4c50043101f2726411be6362661f62088c1d1eceb8dc60b008144019bc6bda6c815019d5209a040925192d64fd2000c09a1dd712d1020a40514407dace94abdc5c18a6bd6090dff7902053b6d2348827dcfc74203bcb48fdb984090701cd8fd89860fddd9691a9f982d07041877e7938372a05bbddf0400572848200c99028184d235b53278636aa6efeb00827f7dbd673e6e6aac2c6f3c2568534bf911af6a37bd006721421dc5300006f840342601813d0b9ed65d2a05f1fff60d47da6904a0000000000000000235a2ce899bb812a8c3d44a20567d5522c000000000000000002190e20e18810208600400016140100680010290006dd3424439cacaf2ceb2a6230acafc6240bef42080a126b2283d8aac89ee9f2c151b225a8f126184cf00c25b1399c602f6ab8999b96c38a3fd63ce0f28baec133f81f984c821baf1695d51c8d1422927b4df81591c60856ac5e87978e1c02622abc9c366b2749c66b2486f018e539060000dbc8060ac06c460341bfb19c663d4ed0c6aa620bfff9ef23a57f620edf41d5e1ce20000000000000000000000000000000000000000000000001830b26f1f1a4c7c94e04685cf6b2e1a173dacb42522052001c014008004f1969dddfd4c9b70e9dd6d4b8222754f52093a0540ac2ac97051755b1eea7f2960c6889006837b0513a312566923c61971eafa07b07b68cb279262eee1fd7e540e5248819af7359) <<< 16000) + 0x3fff7b71d8388237a371d21e8dc747e220fad44c45f15607da173dacb742e7b5970b50403644000000000241c7fe86c71ffa1ae92598fb550fdd6d07d0b2c9109048028000200db107036ef5c40411b173a52c1836366a79008ca52fd644003ecc89cf280108040000408c01004010000044704d4b4448a280a20ce442470008458a500401cacce040901088021004010040000111000116321b086f34602422e75db2b02827e52a169030427de2e88040c6717b6a8240541f0434230005117a61c9c108c02104096395c90306461fe414840d45c681ff230423008000057100b01000125101905c020040110681cb52768380438fbe7a5080167c2b02e046104a0100000b520281a0120d00008e100d158060aed8b363f243016687165b10a2d08f89526aeeac22528703c6e13a54ff7f1d13169000000000000000000231f4fed18fa81411fec00000391f7b5e4a60aa8e510d4c97e53851327eabcc9f9789502f8fff84ea386186300281230adfa5d1445ab39e7be09ece2778e3e9b6816cf8a1fbe13b01a8ea8890255f99fde0e6885bcd746f03c015ed2f2ae52e2f68bc39bad105e1aef9b669e39491c056970e2c565ce5215eec1014f11db04850b68da45008f29220424004600880000802000008880005d10180900b84c02827e8dc7487a371d1f8883eb513117c5581f3438b2d88516847c4a935775611294381e3709d2a7fbf8e898b4800000000000000000119cf5dd6f04dc0b3e9fda31f50290410908c04500400260b0c1326076561be03d910d6bc4cc9042eb66add0a84bb065fd9e1d83c91f3953463ee8456132b844c534a3b9c80f5e1a5fcd405931460033b26d040bce6a1a1275580200802208455a224b8b1055541183342962e20370801bb9941a81800aaa823049410880200002124058240002b6402c04000be840541700001004601f3eb7ed6380b8990b302801c845c67300200040000521e202507a0d7fccb5de8ebcf7b3197ae1c85708a25ba1d79c87eb7c656e3fabd5ea98a2a6671a4608eca2e5a87d01f3626cda0a5750828d38dc22375d5bc49554152fa2d8edc4b3efe775d1948e067b46946275346ef443a70394f1b74c9422d6f0c8101c31480dbbf2c0812da05510077bafd4e7e89c2992541b9c0c03b70defb0ab26771fdd8327528e61f0245d4569d2e56491400e252c9c80684b5d865823e0347fbc9b6579214126d21bc3be50cefedbc1f4a56d03f4effb1170e5ada94645fe47b737c475f9b906c2abd997e9d34945eaf9978c7314fd4f2ba86bb5c98f6461bc32ed530a9cc5816ac23e0a4f850d9606cad3471c75085f3a065c866d2d89182cdaf400020a880a04804c260240a0110500800800263c800b0f9001eeb3f5dad56da961d7f30d9e07c180e61e38000000000000000020342e7b596e85cf6b2e16a0806c88000000000484206182300080073390017c30c5fa5241dc07944f7b4035c0e3db60ed6587b707da436804cc9f3fb613deba5990f92978d2bc0d1397c3a9a38717ba1931cac4088f00b4aca9e44dae73c99314bf74f6a7ab83ff15570a4eb4c6d4e14851d0645000465200503e400d438f058e10d70492dfbd8b6f073ca48c0be8ca6f36da0d3165f10bb5f91011b3a5e1bdf3825a1403143a84280395521bca627c9cda8cb0d25040256a3d881d9d2bdf02b3a330102029ae659a5bcbd7f6473d48335053247fdcaa57fac8db8bfae041a16f31ef88305f32ec0c3e66881a07dd5f58b37ef30a3188230a50b5398e080f890aaf2d0c19e4131424202a2e8e4b44202b1b69c2c4300d18eb47424c104601080cd3b3917dd8860c26ab0c1df50808f3e37aca99040421598fe36cc2040aa2f8751081069a12cb58549321820b00800002f6403c27932b6ab9400bbdb8ec1c4a77ccdc740000000000000000008c851041090c80c60c40830010130100200d810229be269101e4097a65c2023b1bf5d9c930823004000058900e05000119100053620040280d76efec9e080113407ab982039389d31901186120042044939084fe280249c8427f040ad453fb4c046104a0108144ece579f08089663de3a0882090020000106400055080688c0304741947c552aa00074fd69f5822082300800502f051a2795ee0206296ecdef91021180428680981fe004052cf41a34870a558533de0c10a7176647281163c4e40050095d609c5c50011fbf36913821180400005b080480800087080582e0180200800a09c010040118303562a9182047991c1a12c08c60320346000d831f9f0402a092c7b8941088020000210600802008e13272481e301159028743832b9b65743010d03d00c8003e010c1c735cc9df6f470da986302dd3d994dfe2bbb133a899a05e4a4f4ed7ba9772788a06d4e9771b676dceb9ac6351ffd7587835042070a165b6bd7efe98764741d7aca4c69451798d52eda6908f0ddfc7d2d94adcd1f3f022fc6032d8bc009079143868920a1858be9f63812e80af03bfaec32289095984c695cd65916e0267184bb6b62968d512f4d2aca5825291b9f6edd6e2d90d8fe5bb5b5b79548d15e74e79b550c466a39f732e8a78c2bf5a7737efa15f8a85e951e786f0e5620ea916fef61b619e6d71df38433101cb4a060332bd80006882000ede4001eb08048280024848004b99000c712001db66870ccc1c5fe141d045e61d30801ce25de614200a640c185012041280428b0e7841aaac50c07637ebb38a0947e4f6d6b59841380200002f080404801c2400c0a005010020080008a0801928008740020200001000d5e1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 15 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightStrongCase1" = "QuadHeightStrongCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 15 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightStrongCase1 private def zz2134:"s0856"="s0856":=by decide+kernel end section namespace Green24Proof.QuadHeightStrongCase2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l44 l46 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x16f7f9c20de, -0x8bb2c97000, -0xcfb81405aa,0], ![-0x8bb2c97000, -0x4baa22e5eee,0xbbc43d9762,0x7df663e9cc], ![-0xcfb81405aa,0xbbc43d9762, -0x38efe933dd0,0x8c6fe6e974], ![0,0x7df663e9cc,0x8c6fe6e974, -0x45d964b800]] noncomputable def hinges:Hinges:=[(-0x5e8ebcba,l4),(0x5e8ebcba,l10),(0xdb0c0cc00,l14),(0x4949b6d46,l12),(0x1b8b4e6b09,l17),(0xa8b52805ff,l15),(-0x45d964b800,l27),(0x45d964b800,l29),(-0x12455c3946,l25),(0x1c0e7f98e6,l30),(0x45d964b800,l33),(-0x10f4ee77,l38),(-0x45d964b800,l35),(0x45d964b800,l37),(0x10f4ee77,l34),(-0x13c8e0f3de,l43),(-0xb1e4d3bc32,l41),(-0x4949b6d46,l46),(0x4949b6d46,l44),(0x45d964b800,l51),(-0x1aa14159de,l62)] def normalizationDenominator:ℤ:=0x8bb2c97000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x45d964b800,l27),(0x45d964b800,l29),(0x45d964b800,l33),(-0x45d964b800,l35),(0x45d964b800,l37),(0x45d964b800,l51),(-0xb1e4d3bc32,l41),(0xa8b52805ff,l15),(0x1c0e7f98e6,l30),(0x1b8b4e6b09,l17),(-0x1aa14159de,l62),(-0x13c8e0f3de,l43),(-0x12455c3946,l25),(0xdb0c0cc00,l14),(-0x4949b6d46,l46),(0x4949b6d46,l12),(0x4949b6d46,l44),(0x5e8ebcba,l10),(-0x5e8ebcba,l4),(-0x10f4ee77,l38),(0x10f4ee77,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x780a40100000007418063008000000003a07100400731083202590040000000e8301c6010000000007406200800076220d00f2006000001a0a4078c030000000c8a81e6010000000007805200800000110500f1806000000001a014802000000001100e40103182302b00f24014000621908806a0060000001207038c020000008816054601800000000580520080000000241819802007c0f02101e1004001e0420d0138802000000220a00c300c00000000120310040000001506038c02000260a4140348018000000342c0a3008000421c0581b2006000000000503880200440901980f48020000000001406200800000190a00f18060000000d0903cc02000000000060640080000006c1c0a300800003183201118080000000011018802000000000a81c40100000000098052008000000460c039804000000000140c801000000000280e401000000064540730080000002a140318040000014828038c03000190ac1401c8018000000000f03200400000391480b180600000000150188020000000a8300c6010000883213016400c0000000141819802000002108803cc0300000d8884814801000005c34140a400800000026120318040056090160275004a10520210019a803001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802,0x3084286201704014000000221e0298040000011024038c03000009c08802c602000094260900b400c00000000f0049006000001086403cc03000290a44204880183c82282d018c401400002c02604d9808000000001e01c80200000003c0026402000000000900c200c0000003622031804000014848004cc040000000b0900e601000000002c009200c00000001b00490060000019024030c030000d0082004c602800000681100e300c000000000881900200000188a403cc03000001041202c6018001248413016400c00000002438198020000001d0a018c0200019044120448018000000078d03300400068210681320060000000f0b028c02000000000580a4010014c3409007a401000a42102604b20080000001a07038c02000000c816054601800150640b02a400c00054220580f200600002a190501500200000000d0606600800000074580730080000000005819002000000000d0348020000000000e06400800000000240d20080000000004819002000000002e014802], #[]⟩ def dynamicCode : Nat := ((((((((((0x79a185394a1557559a6c619c7bdc24e00698079afd01d6b6a9c5b30306d940235c696079f945eb31d40a00c93530dee3024001e5874b6be023f4e207003603c4599aee91666bb981625c9a058972703c269a7166965020826801017000100680007e1c32452558db1c6944e197bd73230a00ea0d112b1a386853de07f010400bd1d7974600402a3ac3a404000ea0d112b00004983a7d63cc02148020000728e9b588f195a281a60612abd2e50716974c0883771a58ec4c82afda68c22c87160629c118dd558dc94280a13f51881367002a00c71666226a64fecd2c07c0462d0a9c418749a6ab1c3821e948380720402041811e85e8d0362a3c7bded0e000f808c5a1587002b0100000d21c3289acc9293e86160083a759a8334a1c6c9041dab9850020e9d66a0cd1c78b642813ca682252f630245130029c6aa34c52927042d0140000da900052b345723cc1ea7120d20020e9d66a0c59038d92083b5734305aee926b8a94181ca1fd135b0b08c3150885c6c68007c2ec2ca9930001074eb35061400504a6931bc4094861680a00008acc9311413eb6e8b830700de2a674bd114387fe88928583cc0808ee2576b21248404489b438ce42811b6ef532cff318001507e6093cfc9000155c97ec2723000062bd833e2400a29103102000012a181c1b64908940b1813dc36d60491a0b88cdbe3481883dc4f219c90cf675b29efc7002442d2c2b860014e759c3dc019c50a002000032e404017867a93cd47e800c288e70f0a381030c247006f15e02850ad9b8e731b922836fc01d40b471472f2efb97b628a0454943c8d23c3470eae6c468080223d288f1fc309002d0186942779a99e2b3a30a00bb38ddce911a388c55a02f55809141bc0942ef47e38a0860358078973c318d33a87fb000c084ee8c6de06e040400b53d6de2a8601327ea4ab53c8b448018812000093482080ecbaa1054e0bb61650041d3acd418c241301526362a70a125bbf3378c1841623ef84a0798187d79a4884bc40c12ae4870b94704359f03419d92c0273de4a04af84a420b405000045268ab05451a6d030690058e204e64c0b200e40fdca89f8a1878f93b5a1992c21ab8d4d4cec668217c2f060a694b001ceba5b771514001aec249e87b1c00041d3acd41806d2185e03000023e3838f6a374d75287a2875f389248e61fb9e6b90700c081005e800c8204e0100000f532526db51801d41a22568bb2c96fffed5640363782962e691c92fea48070bfc0056331ef9a2f500b6eca66c9b5702d0b1891881870060007cff44d96e9c1d329063fc3188768dd59d27d15b954ef30b56e1deb823a9e78dda4763af1b46ad96fb9fbf0a297a4d5000335202022000db520340b926890d28bbb18050e0c309550e79e2470057c4e67020142067f8efd664c860c16808a46ca3a18674a7a4959340301000b0f9ac68f9408e2cbe0bfc6ecc00435560694470018122062040c202aae08605983d22a56f6670c38098d7f68c380a71d1b01a4024102700800007a992936da8a01d41a22568bb2c96fffee7b6711890298cc7be68bd402dbb299b26d5c0b32c624614208220018000b6c5e7bfe2b5942e2d38f22bdbfab04b59ca2584a2b4b282290c2d07d296692d6c2c292a3a500029430479b277a331482c60be2a673a6c648c22d810d276d4818020e9d66a0c12188c9e57790240c2007afdff6eb2282052cf5171514204a722d8e3910920167a0ca0c0da006448a1780e24a4db6a3003a83444ad176592dfffdaac806c6f053198f7cd17a805c8033f3c5d9016dd94cd936ae05a1639631230408c00050e946ba9a6438af395fd296a07557a3c43f0827d8db9a9a0f11c20774110c916ac62ed73598514a8216800171900054120dc2a036010005cc980dbedbbce9a5019ab6b888137ba5f4cf0cfe8183e79c1c3e5d11e557e0ecb78a2702822d1c7050f0b29b040288abfbfcc1af3da92490e81f391c033964a50d67aa5aa585a1224bc1e61724220403135c524d1b835da229de458f8c72a20b25a000253e4e45eafdf611c817f59e0dfacd4adbe1cebcb5ad39894c1cb302244a5fe4bf3bec18568d150ede57753cf975ceb5aff483aac9fa23b5d2bd7c26e1cf1e540557334a511c34800054820442be1385c514517076bb3db4aab4a4abb52d5237cb9f6339ae4a91953800842a8fe14168dc963bc040af70b87124e05358749e7dc6def54dba1a886643113a4bfdc2d195be49be4bd670b032bdae8102de16a2ba5b8ee69d43ce9feb7eab859e16f21f0e1d1a08f6cd22a51c43ec290b5b72aec1dc004120bd2641a3f80e4e587c63578a279259ccc45735991267aff3f9b63de10e66dd3e7907217d11b81ff73a2a153c31d2d9df7261ecad6e22) <<< 16000) + 0xdc14b2841174a0847746454fc90712e6530b52184978cbd5758ec72684685fe82807b404950acb09d489646c2a9aa692c9d06ce3730e1d6ca758a5c7c5adfbd79f1b85841b25680772b84d6cf948121bcd83acbd5c959b74c3b0662528200008543820085f689db7806109c74d101a59860468abd6dd8e7e18233e8371999d418011cb482b7f650a052bbc77952be040222c949f18bc8820801f1e97f640fe10a05e43e7e5d33eb9a18814000093c8369681b0a60d64b06a0503480a06dc7e083fdec9c70a2f7c994d6aa6182842fdb9537ad4508a2c7ebfbcc522002ec9a3b9caaf870128fa1d1451a01401263e611d767814047f08e89cb7682321ebf5f62ddaaa4e5864058ea0d112b45d964b7fff6ab201b1bc1489a59a51839638e30411600c0060200401ba5864409ec204d280015a7840851402a2d453342c875897340bf963e399d3f5c2c700031d75f16a130414804000058c83400fa83444ad176592dfffdaac806c6f052261461258c50c30a08260038001810010068000859919dc5948821048bb0d87fe29020500bd1d79741209d7cf38a22c60402f475e5d010010e6375be7002614290080000b490670de421078845176592dffeb3448b57bc1409441029221020e08200005286fc88313cc78d9a4589b17f95b5550af8605cd17264bcc5871c851a00037c40a83605213c8420f108a2ecb25bffd668916af7828000000000000000000325cbe94a8df6ae74a9c0153d1699e20c21000000000000000000000128871070c60c40810430020000002e500200d000240200136e419877034c0a379f000711bd67b983f6406017a3af2e81c3e028a3b0ce901537172c4de07080087a773b8130414804206efb7b0e391901c66913418f070e153acaecdc404734a743ccb1c22575829e990a004949b6d4601000d1ff042b43384148040000660832868190160c603910cd2d814e74812df5f260d4490d3d6610c8a480d4004bd907c508ca390b68a47053f7d161cc42c1050008a28038f9e7950912069502e780408e6f672708f24316bc714f13101bc20302c3685088ad14d3bca382b945a3d7b6180092936da8c25010520100001cc20301a91dfcc3dbefb82491903568d27dfcc81281197377993c90de8010d00735c80c0069fad267c050878a285be76f05042d7703c49f74321c20c008123ce68fc470211235241e85a0218a28896a36ce341025a49a32a32f921ed7e1424a4710191427903db40a10c021950c0f8a08615ed5aac60c005b9c2489780d2420b005000044041881400083e406046000f4e41847405c020600102f808178040ba02000b9520b86305b1181488c16847198f7cd17a805febeaa9df505dbe4140bcbffd06adba2ee703893c2689ff90000000000000000000000000000000000000000000000000c0440a4003802801000088207c3b49d174a8d2d201fc9d0628d74a975bd5c25b13d3aff7474c291efd7720608a0d9a2a1564f64a1169bf7aad0ff513f8a64fd5595bcac4ae53e09eec8df577a4cc73969c1419e1665e14f61cd100676ef79cabd9081900bcb82a567435e1fd6ba46b4dbcaefb513f47798e1d42f72f9cc4dacb7d445a66c275b19082a0809b76cb6251b1cd07123c873b910c0d2f691ccc161e6a6ffeed202678b7ae561284118040164040b003b0b7ae65cc6880911e0fd9dc8043abab0f183011fd1083a82019e87bec34525102400800008c9a05b31cf93503825e8908d2008057f115f2c020439ff14c0c109050940200001de40e8460a81b802008020108050080100400001110570d82b02e018020080420540a3ca30076280ad3ab5e1e200220084000040100000444104160860b0550180007c100014a20a82b03a0500011690530d82902f859faaf8a510210c25008402004011a243d357a98881067083e2724004e54534bc08c209402000017040003d4c0400401000004441444607a2204e1101d06c0e02406e02000222321a89b6129ac14233e6036490184330ec6b70c904b401fc03f840c2e27aef112405bb2c5ec10300138ace1500152718270085101658982db4a0c49e09874e050c1f423e9d40403847ea8cd724002800800c00c10407c600a283b65838a622cce0e2470bc05978cb646004e010d1dd92af856e1c6421c8c84b070a917c1afb30c138379c6a80c00fbb280fb82000ecec5d55a600260080000a69c3110b96db1642a0718681ea4e43e63c70b31378a0dd02706042a32ed179bbc0207607b18a4739b27102801a01e3472ce612e52838c142a49b06c709c0dfbb611840c59843a13b3001ae7c125204000a8c768736600270080000a990002dc2000a30684721371f5d03065c27488b4840c31a4a2e16861463a0ed6591c103c631ccda30017722353b8198309c0200002b2414024074020007eb20800b81afe3e6ab7184176af939f2044005001004f01d08f16d22ffc881ea6a8700283847aae3cb0a0c00ccbbbe47a48084c0100000eb32191c1ab50e50c28942b7a1783022057f44618100a9842985f8001935ed33f4094209c02000024840f42409c1203b0901c0280dc040006964090940442b0360d0006a9102a198148af8806da6dbcdc20bac04847781003e18c87ef3140081a878ede1204138042008020088243daa155f41000198e040cdc40050010800008020000088800062900010220481b04d0d82606c12c260441204a0981084c12424040130480582380e4d819943582419de2dd04f954ebee2117d726a98c5901d33bb8280000000000000000008ee6af6b6226e05a32)) <<< 16000) + 0x8173420b816304529f32dd28fc1404ee0aa1810e11208a008000221c0022b70bcaf1f0f0eb961d15ba6b597155fd213fbda028c92580163bc8109a407a109ae5425b628548486b24d3b485ad7dd07bdc157252043c02947c9af6000020080410182300e00002008e39fa0e78956124846a1a0c28287004459cbfa8865492bcc65c80705e35229714001ed560f0f98009c0200002a6600002008e3b23f243d04492a8fa27b3a2801def14621c6004a0100000b420001e24000a7082286811015a6d01038a1704101c7d3aab61800223baf57238013111a0971202130042008020080000223004010040218080000dc82104c1042600034864a4db6a30c8420f108a2ecb25bffd668916af7828302eab91fb4f9a2f6eca852380a2ec2d1f4c6e9e66035588645e18a29870000000000000000000013d26c0cca1ac120cef16e827caa75f7108beb9354c62c80e99ddc140000000000000000004769f5a3c4352cf979437ab5efa15b705af7d0adb70a0b77feb19f44ee80f2b24b77feb19f44ee80f2b23899ff053773b2e0b605b23a929ea7b6e46e25f65c51528a14518338000ee0281c63e0fa5f1dc91dc29333a7a6620f6a65eaf5a33b177fe21f79c61361e1cf63722a9a5459ac4160e8b6bd38531d8e5727a21a4f7cc3a0b96ba1fa777e513ce3e031b322c36a1ef4b74210bd6b561e74ccc2861b27bf1380301bfb708bab1b4ffc35106efb3986df5e6d8a73561ae9a78b343f7ef0c9f493fbdf17bdbffad23ae8e7f57d60d41a2e83a8004d3901001c8a427b930259a1dcd7c0c9ce284a19511cfb9a0117832151c4007f22ae6ea0c007a2e6835a008931013004000057481d02800414082002e0000200803f01d0d4bf2addba28aad16bd87c400676cecf464608480100000b3322b51513a551a1c3c8061049a029cd019fa9003e6acfc6f0c040c026b7f0ca104801000011530416963ac3ff0f82e75f288dc4c2843a8edf38fdd244cc7b845bd669b7cf226ae3a2166e5d832421514266c36170bb843e63ef80a783869020b5e9447f5ba790091dca03321f3ee80689402dea7569b3e225c88ee50febd97044524197bc8089f4cd6a9146df7cc97246e2a955d97020413e7f50f0cd9ea1767e25b42424e24981d32d5fdfeaf60d3800a56009fdd01271d3cb116baa554c512bc010b92c66c8105f5ad593488151d3e1ea8a2f21eb62ac40a5088d3419e17f21ebc907630cfdaa0738769ba2c58ecf132d2f0d5f0628b93d7cc6e42ea5f7fb3269ce551a239f4f3a5043976e89db4e65f632c73141d07925497404258cd017738db0806f5d63742355aaed3eaa23a118432e5702cc36c18b000112840f84407a1a03c0d01d8680e836072130380901b808002e3081b0680081c08011bf90039823c079c86a53517b9e649926308c470a4b94cd6559131247a37dfdbed21000000000000000000004d1a2158c37b3f711f54bcb76d019d173937eb57defa583d21fae4d2000000000000000000121f667c13c631a4fd6720f3644fec7c71478eeb9be919eaa87d7066a570bc800000000000000000000000000000000000000000000000000000000000078310318014004040401703fd53d2815f0c3cec46b839bae6c900a9ba8270876a7f4972545168102b53cb339ddcd1c187cbcc85a24dbf3e07bbc038e1514d666b7b6e6630c56cc34f59ab9f9058648d2f90433a2f6c1df6daeed7b3e7aea84a77a0eba26d9b77c57a9ed4eeef8c39dedf5787da33fdaf415909fd940a7af01651b0c11efc72d3aec9c743be7450711736054a2b0ed493de3da05c851e9ba6c4f5b886307a2ffc0c0076776b3e5e177c9bd72ede6175303d45881f36bd81c41f0a40e79c9e68e782b967e40ea2f438ba394c52a5e9eb2169bf846f2501446398528005a71004b25200c70264a4db6a31ff513fe03a2ecb25bffc2e1c65a04050c6ad790487c05a9cae51f19a72b947c68868c936fe1a80a35ee084e64043842843002001002014486e2197e79957e92c240f3e03a4274d377f7cb195f832fce1568f87c77a9233642a2376b57cf0c63c983c8526dd2b0e67155603a97301a202307286d9f3cb44083ec3265f306020697c13d710490609c021fafaaa77d4176f90502f2fff41ab6e8bb9c0e24f09a27fe40000000000000000000000000000000000000000000000003009249018c18810411008408225c600401a0004204000c9081a90c0d037013432625154906ae4c1c2916aeb3efe3b8ffe22844ccf6d2d2addf9164600d398e47c090766af080116c4e0621647375b0802da267af50cd19546081140112631cb87c97410076ed691541132314460dfcb48460493b3aa543bf4b902183a31ab5e4121f017fafaaa77d4176f90502f2fff41ab6e8bb9c0e24f09a27fe40000000000000000000000000000000000000000000000003029cae51f19a72b947c68868c936fe1a80a35ee084e6288486406306180100023d8196800d24c141a08b7e1e581534e2def3070ff426a95acdc5f4bfb21112934ff555c6e0ee718d7765ea1735dc1af3bde6243a94aa232b8f9d659b6c3ec9564f73f6422ef8b8822b2accecfa861d4448efebeaa9df505dbe4140bcbffd06adba2ee703893c2689ff90000000000000000000000000000000000000000000000000c024883885061862800800000a371801006d960926d23ec6943093b43e112050ba1ea03e05014192bd47dc1d82020b7384912f16005b9c248978034c2054020c31adebc67dead42c68de3054d98800b119366f34d4f602400c2f20e1c)) <<< 16000) + 0xd91450016d579042f7b0fa0a1064058c20018f4890cb1a383aea72dc8f307335d4e73d0e402091b6d8eb48504167cbca1bd1a049c2fdcdac618009ae80b820a67042b00c7145c98ce43ca98894e2006c7598a65dc839a4717c78069c5e48338724a41eb2aa25e0e2831c91c455c5a61f4d026bf53cfa1ca6befa1201800ec151c7479b53bf6ddf0e301a04f7f7132069217bed84275d3348b12fd897251e9c385b1a0928a543e8500310280000ad10003532000a2640cc04000d4e40700400108c40029c48007e990000900097f1032298188e80080541d053586bc82818ec942eb7c0088509c02004e0b01a01c949b6d4633ee05016a5176592dffffb326590de0a6331ef9a2f500bc48ce61b407d60af5d4d5395ca3e349ac200fc250a0a72b947c66a72b947c6823dea22ac5509fa8c40942942081c31421020c2018f76bdeafe8df628236ed21ee85de94fea5d53279631f4f9a4c99cd0d2e8f905b15778df24da888f9cb35c6cd52b319e8363d612ebea3d30b4af6962596ec1b25a25545464f7b0284d41440bac81015c9447280207032c8048880c30eca6c428e00482052010a140d1ceaf0b1420ad744c5052047d3a5f71a23063dbdbdeee450d46bf6a1c7881ee3b6cbbc21c0064c0051e403388138040000638800153180c1d96d47fb101106d3d50d41828bc45d9c582022923dd8ae0305ef88bf8a78002577f42f0801098609c0200002be40023b4e0d2f5f85ee30c2aec7255c464004c008c28bc4fac4343875e38220fd8c1a0803e6680184142baa1cc0409f9a41128e20016afcc46586009f5af227b700260040000be9c187bf76bd231c259c305408e2841d2a2311bc2078b5e9ef8084005e998e7ff2504270080000909024090180480bc240441302e05016808000f5481610c0ac740542302911d0d18beef3b28908627b83959900bd101af3b01811160ac0cba48084e010b1f96a0a109d242852de89400708d65963d342402087166adc401c9dd3101d940098021c281d29d91ba2004c008000051200030e406c260500b0270580d00e0180200802605c040040100000444094440001124090760463b0221101086c080378435926a8202488361373559941b729d86d744062256e03dc900e597020d645001429940f00a014a10eac9a4e084c010a2204d01e4e620312360a4d9c40350e2ab5a048c109c0200001767844116be9c78408430e7c71c84078fdc65ab323042700800f80800034080f04c0740603803a19b9d5e10eb900c44315248e1c1956b3886a83022513386ac0a016ce7008898a0007cb562cd01498609c0200002be406c560201a01a01d00de560afea201b79e328250220c2500840fa0925c7b088412002201002008000022200011c4064370206352400d0a1d210f6e86100971b8635c9404248a56249202120042042a431fa0060e472f516c102e97a91c2860579f71e0ac808440100000da2030120170500b02800085c80a8680400782958ad4c8f2c0fd71741d20c00329441388101b312917a422a12101280400003cce14682f24204208eff84a8e43820af228386300e5eb3fa860001ee64bc2e01943094021872aa393f78202027515bb008083dfe3a958a006a81bf464140825004402004010000044400048c80a04804c2402003c077873eb2647043d204dd0c400123fcd870101b7d6fe66d164102400848c00b92a123ebc628f63121b536f51c1a605f28c8150366146c86b37648c1b31a3682fd86d40d71ba217af2d84f540000304cfa98180088814659a64310a06fa36895310d11f015299076efa21a0ce010779996393824e22718088695ba743e0000180bfa46a85a5127ab63229a04d0eeb69253be19e40a56b29bf8487f0dfc39a1d033fbf94a32e30d7523388ecda87a00000119f9727cbf79c1353bb5ccdf76eacb8d6b8ec15ca4f9e5361aecc0116aed83b053e8d9c757b0a9718d2d6080213c89d9440fac3780e581a34c9ba3338ebdcb20593917701d178d77fcd0d28baa524ed7839158b95b6aa0fa200000c25f55b002413011010003e01010150078280023b8807088002ed4800840100d09000af510019f7200503068704c05b9911141bc9726fb3388084a5905bbd0400426ec410f418012526db5180802de8e429ce00804c4052010c356cc6e5b85c1840bd7f65f4d230487cbbda543c20404c77a38ab0a0023b83fa41910001296416ef408001b2abe1d4c0427182b00871506a739640b0feaa4061179242808576001c3883846eea91635d8c1911d418d80317140204039d6fa19592600082372b4d65b0a8748140221a2b6f8a796a8007a1201c40f415124aacbcadcf5441119ff8d681b103034086c177848804949b6d46102249e63d78003880010f4ee77020024a4db6a3000020a3d429d106020a8011452c4501a798c493cfd6dccc2a14281a04360bbc48a99b65422e310280043d3b9dc38201ec7215a902086c761eeff21000d021b05de18042a0045963c36affdfb4515096088ad7b059001f16f5f89c58c015141c973050c4e9802c033a1040bf92be6140300000b47034ad380160043e37a837ff048a44abd54d479d8885c1665cbc95cf03204fa0000000000000000083fafaaa77d4176f90502f2fff41ab6e8bb9c0e24f09a27fe40000000000000000000000000000000000000000000000003011641441631431401200405c000401a0006224001354800361100c01000463100b05000598100a1100068690092500404801c2400c0200501002008003c508019080085400202000010028f59)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightStrongCase2" = "QuadHeightStrongCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightStrongCase2 private def zz2135:"s0857"="s0857":=by decide+kernel end section namespace Green24Proof.QuadHeightStrongCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l44 l46 l51 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x14cbd04fb16, -0x8bb2c97000, -0xd18c2e2800,0xa84bfebc8], ![-0x8bb2c97000, -0x480ffd4e51e,0xbb9d04426c,0x6fb506e04e], ![-0xd18c2e2800,0xbb9d04426c, -0x38efe933dd0,0x8c6fe6e974], ![0xa84bfebc8,0x6fb506e04e,0x8c6fe6e974, -0x45d964b800]] noncomputable def hinges:Hinges:=[(-0x5e8ebcba,l4),(0x5e8ebcba,l10),(0x140eccf812,l14),(-0x1b5d41451,l12),(0x1b8b4e6b09,l17),(0xafd5d68abe,l15),(-0x45d964b800,l27),(0x45d964b800,l29),(-0x1258f8e3c1,l25),(0x14edd11427,l30),(0x45d964b800,l33),(-0x10f4ee77,l38),(-0x45d964b800,l35),(0x45d964b800,l37),(0x10f4ee77,l34),(-0x16f49e5297,l43),(-0xadcf094c4e,l41),(-0x475594c5c,l46),(-0xcd06a988,l44),(0x45d964b800,l51),(-0x1b8b4e6b09,l62),(0x5425ff5e4,l64)] def normalizationDenominator:ℤ:=0x8bb2c97000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x45d964b800,l27),(0x45d964b800,l29),(0x45d964b800,l33),(-0x45d964b800,l35),(0x45d964b800,l37),(0x45d964b800,l51),(0xafd5d68abe,l15),(-0xadcf094c4e,l41),(0x1b8b4e6b09,l17),(-0x1b8b4e6b09,l62),(-0x16f49e5297,l43),(0x14edd11427,l30),(0x140eccf812,l14),(-0x1258f8e3c1,l25),(0x5425ff5e4,l64),(-0x475594c5c,l46),(-0x1b5d41451,l12),(0x5e8ebcba,l10),(-0xcd06a988,l44),(-0x5e8ebcba,l4),(-0x10f4ee77,l38),(0x10f4ee77,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xcc140546018018c32088096401000000000320310040003c198280a9003000000b04203c6018000cc341201e400c0000002a2207980400001e190501500200000000d0606600800000321201e300c000000003c0290040000000024030803000000000b00a40103182302b00f24014000621908806a0060000001306038c020000008c14054601800110460a02a400c00000002418198020000000906018c02000000048301c6010000000006805200800f81e04203c2008003c0841a027100400000044140186018000000002c0520080000002a0a0518040000001507028c02000260a41602480180000006c2c0a300800003185201118080000000011038802000000000880c401000000000880520080000001a0e0518040000000009038802004c0b02180f4802000084380e01e400c00000000120310040000010870078c03000000088681e60100000008c180730080000002a1c0318040000000003c0c801000000e45202c601800000000540620080000002a0c031804000220c82c059003000148681204480180000000385033004000004211007980600001b110902900200000b868281480100000004c24063008009a1182401920080056090160275004a10520210019a803001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802,0x640390040000000c8004c80405106508402e080280000000014062008000000221e0298040000011024038c03000009c08802c602000094260900b400c00000000f0049006000001086403cc030002d0c4520488018001485221024400c000000001a0310040f208a0b406310050000000000606400800003409403930100000000034039004000000068004c8040000000d8880c601000005212001330100000002c2403980400000000b0024803000000006c012401800000640900c300c000340208013180a000001a044038c030000000002206400800000622900f300c000000420c0318040000020828038c030868c6050037c8028001047413016400c0000000012069004000000000501c802000000001d00e40100000005c18073008000000421403180400032088300290030000000000a06400800000000070320040000001e0e05180400000cc190088c04000000000e80c4010000000068b0330040000004a1e05180400034108300b900300288680a81cc8020010c2405007a401000c42904604b200800002e1907029002000190a82603c80180000000009032004000000423c0398040000000002c0c801000000000681a401000000000440d200800000000068190020000000021018802000000001500a4010000000003c052008000000360c0718040000000019038802], #[]⟩ def dynamicCode : Nat := (((((((((((((0x38c032a5f0f5830c89c14e74c030b0273759ed034a59c5dcfaba041039b0b629d0005504c8373eb001400230c2ef920da021a52328c6556b0c2844036ac4504820452bc838804110c957ab1818053a48813e642006e0f01f4c9380148040000650c6ac33e91ab0cf981625c9a058972703c259659461259260a5800805c100401a0001fc70cd9d1e6bfb06161e8ec22464d29469cf4bc29851a56057089304146bce86521024c04b6403c5018791f319adc009c011a516e38df5cb930a045e3287a9e68c415908a9330d0894b463a2a40c0845e3287a9e300c0974a4172c3801dc5e4e6e3e1c00ac0400003486cbfff75bfd14184947686fe9bcb182a12ffaf2060a61b19dfb0530138ea194a7a96024a38631e2c9810a40200002c2400130083e80c1f00743c924e9b997b091d28341446d6171cc18c0821a271343f4a9528c0006782453ac714c12008497eb00ca770e017d0901450ec14000034040f407c0caa74b00000000005d21db9fff95f9431d5e0a00be398cba0000000000174876e7ffe50e1e1d8482822871041810c130002be810bcdbb2b740f307566929fe0d48e49d0356bef158f44d18d4dfd88647e8afb90dfdab39170321514b2242e0e3452b4c4f4a1f598331dae1238dc359eb0d18106177904923804932a998a40494509c02000025440f4440008a86f8e632e82a4e164cf6ae90edcfffd8df041cf705005f1cc65d00000000000ba43b73fff2870f0ec24142c08ad4724014650a40a38a30028002917e5f68930699c8b506c2c7dbd798775af497e55b9e494b422554e62df3830cba073511f283a34825f7de059b8223d81ffcd68834ced3b698cfe8ddcf251309a539f52bb082a3520c728e8002119911a05128b2c0b36a8c71319f179540117aac4612d6808cc00c94f3589050d3f60afa081cd1050333414cd174132188002fd23f555b2fc5420c1386113d75b3d883bc7a4de7e6d79da9933d19cb6b2a65c285d8a70a48800d80002c8203c0bb1c1c6f0157094b184a8eeaf3c50919635407a863850c3d2bc9d1d6c30f66a3cb8033030816787b20184900156d2d65b880068e305802893c3dc256aaee4c66569232b94cc0eb85514515a80a64d18b9beed00b6000ae8ed1302f034123f629258575d71561d72747b247f25aacd842942c62461430c3180002452daa6f86747443fd9be31e9a6264967515839f571bc6f468c09d087a2647eb89b0f665eb8be567ff2865bfe730603fb4074cba3e518e630a8001ee9e06553a580000000002e90edcfffcafca18eaf05005f1cc65d00000000000ba43b73fff2870f0ec241411639631230a1921060800d8600401b6392f77954d32c63fb7b257cc48d8f92953ffc306a3c5e6c108c01e1304193900194609c0200002584000c38c23701451e739d3dacb712922ed78e25245dae84c24883883081820822802000020e0108043a9ca3b67843996078c110779dfa72435cde74af4eff634e5313519ed481765f5a053f9c81d04fa0004c441ec740541a000b8020f423e128b34d11d41824d6f78d0688c2a286afad5f079d686bd66585dfbb000d3e1025de854f767484703288098488cff1645a6e4fcc82b98fd495a741e4d9f981026eb41e94bb7021efd329de833da04791740e6a7918b80dcbdc291757d24c010e871c3f2f7adbd49f6a58db5803fa23cfd1e9fdec87039b32588017fa5506bb245c06ea07b2e37979427c3eb5f7f8bf96dd27fbd761610c9483ed56a00ab928894b2933bedfbe0867f31af2621e8b538193ca49f999ad2f46b1ac493d627ac6ffcc3dda69220cae4a674b564d2d38064b4525f07d13478db98d368e5a4cb8a0df8f64e891971d0d4550036854989fed3840919a779920001eb8c6adddae4c9ec291dffe7b51df547432310) <<< 16000) + 0xd5f1646109cd2443dfd56ecd0000000000000000000013c4308604304600500401000699e2d991571f05cf07323baf427ca42cf74d9b04a32ab996890425a7ba54d5d477983fd484786029ab71eece8cfacf119da7eb2486e817574057955eb6b0b80ecdd25fc9ec2c7a589f658e338a8a00082441e4b40f05b0772183b0281d405036943dfdf2131e385207b4bc4c7a00c13c2344bc2c46a284527f608dd54a100181f3c74bc3383808f2570398b428a0095c4e43b57760a208f77d0ccf69784633dcbd206185549cc0c80b1a58d72ee6a8a594548fac26af6516387ac729f7a69438204b5d3ccc1610ab3be2406b0410046eb0d8b814084bab749764160270535385b60c0000bd1d7974069082c00c7160cf3cce4b52cbdb3d7d2903184a26fbbc0498c22e7e73ca376590385977e90b201009da2274192009b1c6c7b209c10a4021c6112e78e751cb2dad6c8fe3c0612c2812f8ca1308b0f14df3d096408f0adc9fb080403eb71843a3001095aa6d2e2704290080000cb100034720e803a1adcfb15150dc192309e4fb3fba0b52441cb56fcd1b8b8308310c02ae242f4410604fe9ad88930e0854a371272da60412c67a1489a5046008e8a9007c98f87002ffc73ac2a2f804c84881981800009a883982f0a01a6c5c2dae8a1ed23d62bf9752c600f836af6840a1bbdbddca09692460dce3be5768090464205302cb010108cada67965090161768ce298410002649adbbaa000a92285c038b18507391de37489434ab79134d0f0d2462e91a0bb9ce002080abcda16387d8c0890dbcf3e10000808a5dae6a44c9e041027e82e8c5acc6003b11d6c2947f870068430f88e589801f82450cc0b00004d640013008390ae0559b366e6dd81220046eb0d8b808125cf6037d7403880fc71fe1ac01c11cd26c6fa8504083bf0edceefc2006663c4758d80804ce49c22dae00053568883bab020062480b405000046a409c2603213e3c35e8ef1f23308151217b4c3f1e64092008e156d7811c41edcbdac49ca0810371912e01ae020852031369b7d050212cc2efe68821410f741370d1281401b3baf43faef8100031925062048c2bc63172814126184804ee9a0aa2482c803f592ec7bf1258c4a4a61a5c913ca1a7bfd8986b3fe082084df3b9c7fb01c30d5fbe03c73b048431b6955fed260401009968fadd3e02055248c19818286bd460ebe80d624613da77737a7a1840180cd624f7c1041ba81f04a16e10205b2efb7d84908207b138d2ee803010b7ed0e8be761c0264d8f3f4d16000156d32d59660040f091830020000127907101e973adfa845d03e0c1c76138ce649e0163a67f9dbb850101c609fef70126e2c28a21a19ed61bbc8d104660ba4ca8c890201020fedc0c0528303eb906c0c48e28056a6b6bd87ebc40ea122866058b1e7b8a968983fc50e131c3c07197420605762d2902028e281f596ab07504514694b25b9d6bc30405c6d68bd5a708102a2347418e81000dca0104d74680003d3dad66e7802061a450c40900004ae70adbc68e57c724458c91d47968f5eeca1a23350e69f2ea98286e19c93cc1981841218a2a4e3938208791f6d106d250c004d0d6d71493b0e0124bad09984df1002f64f9319149141d0306606000026220e23a00076f206a02000c8c2001e0e4007aec83810e47f9e7a07c45e1df2f3b41c4a48bb5e0a84a20a1c81491081090c7003011c06008037072a55df09e8c2c641cd574965024500ce540b4211c50c603a459133030f9fcbfd99014315e6a2a13b82c1e838d375d2400003f1c7f86b0c8002c0106147165783f8c1839e615d823ea58c46c506f424142860722b12fe48a0643ca229f160c63f9b361da2802e86925276800011d5653171400150040000744d92140ddfa6832c541093fa3ab142c9350561df091070baf4714c308128122e51c081084d0a05210c017ce77d55a89c10a402000032c63a93ff34a79f11da8ea27469176d4ebad56ce9b6526505747edefd0ac000000000000000000001384b24a1ca1491491030470020030100200d0001ca2000eca40d02723fcf3d03e22f0ef979da0e25245daf054238c4884084864063842823808e0300401b8548294099618060ea3d632e53d5163bc983ffc2d8860c4f9431606679633768c70ef99240858b2e15a9e1860927323079f3e00009884dedad4750005c030d2cf175a99abf179853ecf4e461fdca3092bfe4a86bc86a60f5272c2eb1a0a8b1b00c5e1f63e7b1020a37518bef889040c0105a1bcf32c00008b5326923b03e8400198160000888e967c6aab7caf30a80b341fbae1849666b808f48c1eb56d58c4ca58d897aeeccdc20414d01b4027820624dc6c4c0000015097fd7914001480430a41402dc556b183cf33e91df5e8b1e627ae010a9858cb46c027fab6285354acc790c710217a60c82e8605009320ee6bcf40000932082d7dc86000b40600003da4000f44d0e11f316178848c3078606b0db4050b12a9128be78122a57e33345c62488da51ae99100101933759848a2c3042ccd9b5868d8608801e87a69843800f0c0d61b6806d2105c03000023320014d841583600176041bc6523dce2fcf765f424602b6397ac99040a3004bc1c862480f84a93f6238b8e1ab8fb3c92a5c1c226be008e5b102025b0f0ac7dbe0200208ab1c172c0200e91d8561da01612430bc08164bef1f4d58eeca1d494b4b2112a50b1566d0f569c245015f7f3262912221ed795d948060c16fe5eda706180878b812228800003497bf9ae8148042d014592c063a6a58865118694efcee4e50a)) <<< 16000) + 0xf05be864fec48aa98e0cfbe3250838b76d883a6488002ea18fc743064fc7f549ffc00006215ac8fe85c02160080000794c8f7eb1ba52a6924477b06d95b3d9022a384811c6bc90c034c152c0de406219a8210db81420f5d784f5d70c002c957cfb98028e105a0280001b72000b8041b8260da1206c0100042d106b210198081a8040d202068010338080075f08331ac064660ca230640dc88a8e8d564017b7680cff15fc7d82d0d81e26562eef27d3126d6b3fdc05c374000000000000000000000000000000000000000000000000000003391000e00a0040008a8140bd33e3d16f7d9455aef5b1f203bc3de76904e2c19ebb1bb936cf27488b38080ec85299aae365aeebbbef58c90caabab610b214e1e5d4aa0897774b3c8d040f45dbf38441710795f7d018796a4572bf21aa58a273599b0e71417850287dcee668503a00ce32d03d6d10d9e00d841dae58ef539211a888afedba6adec16032e393419ad3187f085feec027e2068d67a1c06decd33c374059f15c4a471fa9eccbf64d3f404450c396d94204a685e4b1387148b7b96119a0d55e12c0092b071c2320411804018c040c403b07c5a8560a040023cf772881027c457a3ec563102400800005c90440d83082e0080200805d0161fe16dfd538f00535330110680dcd348f2b08c209402000016c7090065243cb201005a3c026cb0272090b2da00010a532157059030980200001da4180460be2304401000127905e15e0ace7d00084a02881cb3044380211084312040860efa01200a048404a010a1d9918d5962042c7d6f0a060c49adaa4c1039ee4d51a48004401005d0148837e58a11c50f0894d2ef92099e75daff3c0d4c6ba54650108c0100001bc4170260ae1305b09c02004011c015cac20b6281d6e2ce67022082300800004118073a74e44e042184401000005420b40a00014320b22b044010001d690004bb20b02390d2fe664de11210fa7bb8f4f30181d3d04d882822f397ab08c304d2c0177459203091f56d3e1800083c076220aa4e384e010a20bcdaf57cb8a184467c658786066de4178c5c600500100570182b00f0c33df7a7ce860c543c74f37c7148871aca250e15c0fd4dbd090009c021a3c50bfc2ebb0714d74ab24b524844497fbf4361c2d3142296d50c0c793c1130cc3051bae47ee72600631a3e66c020006925efb0852000a405000039870c358f1374e460c236d05b0d870b140f9225b8a09726087f4e08191738813032801380422c0d2b3ec900b26cd66f839d02c8d1c714908708204c008006030000200d0000f2200045a4001470d08c80ea9c6386088e6cc8e0f0810f1b7a1e790c29aa33ce55238200aac65b7c60026b14e8930130613804000056482a828150040a6020007d02038420191180f0080026f882902f871a677c85af200667649ccc19a201de78af60fc5a27c103d3ba59c6851d55675f49b82385c405d1726b1e9e965b430d33ac2e6e000d088c8609efac05a98413a654659792d06f600f30a70a35d95d90a8d5b1801104a398dc1b1df46961cc9da9bf6607acb07931280cf7b4b1cffe8a291784ce3113a3ed757cf4c378bb414c619315cccf39356947d5fec886ebe848b5df2d8b2cdb35013e91ae242212391f7499cec1cfb33e8487634735f0b8a1e5d2bfbb61ff59b930e41371526af1eae36dea0aee1444a9a1cb4c049211995d8402004011a1c700a6358c800901528f6a110412804000021c828808000364e058ab8f40fe100231f82ca9000c96631a5600918a1280400002f48280ae42056d6b879c20583753ff72e2002700802100e847afed8146470c7c5c5a05618320054eb87840b3abc8d4eb180185e8c75c894109802000023a6435886afc958608a4c3f786b0c1fce59729d820131a842ece000595288c58825082600800008f901c0d01584813c1403c0a00036220803204e1501e8ac0ec340721a000c46204e2b01911f0c24ca13a076e43c960dfae16e225a241fcd10fbdf765cf1bd4f9e78899a76dd9efde2ac0463a20f639ffa1879cfa0d92a6cb1b6adb6d4ad599f03f81953e266e7893f6fcdf5c42268949261742c334c2bc626402595c140059db1464916f1a03e6ea0035e383502fcd50f9f0afeadd6a491507c8c9a5c29534dc31de02e72afa48e00f638b46fb956c3aff239bced9053719b9045929c4dfbb271e78014982c2fbecf89d4f5f9ad651871828ac9f7fbd6ee3566b61ae466806b47135ea3c3956701ff2f03aba2c5c644d4793af5bd2f0c92461aa295891806ef3360988277e1f88502280614bbbeb2a38006f149c93064082700851723880f07f1a18301931d75200081aaed13a46084e0108000080201080400006e400043480010c901c1182688c0b046056230190d02606c12c240301301705e12b09612d10702d88acd258b27c40d5e650f86ac3de6dd1849cd96e48ca0cb0e4233c430f4fc0c2de220b7dea36dc1afd479103ec24c042428750e0044ec167534826df77a0f2bfad4ef4c168c0c48b47b2a20811d13dcc18001052e9eb7476cc063786fa1fb6969bc099393a7ae8d7915b40e0e1e28176496402f6c15466e0c23f00172e57082fda48007a16d3ae46dc18c400139264a2e39d50f6ce59d3fd24b4ee3de98dec39a5be015e8656121e517d1ede580926282172497e8818d9c1f800b77ce8f2b11494937cbb143733bea6031c1c63e971ab160258876ff99001f2ab7650800320e1200420000200804a0182480e00002008f3cf1f7ce1f628a297e324c48b24712122b1c3881254c950c080676996d6582c009)) <<< 16000) + 0xf54a59ae600260080000a698000080228a8b03547ba593adcfcc69cb01b66eb7cacc008c01000015a40003a880014790480d02380a083109e8e29123c3970c8294c00fba8907c03000cdd0066309020940210080100400001110460982284c000540d9708f2e41c6186033bb1ea90e29f2bffed90f00fe64294c60014182500400007810005962088020006b5203e0b811bea26161a4857695a52e9102b76fa1e9b9805231b496d47010c037a67c300b223ae46114018a1e47f880028139612804000063880f008003c1482182e0000200804201c8b10615160c3803a9165f7c30036938a50a4608480100000b3302142f74c9646013bffbbed60e0089763a9a22801c4b6c1278c8104c0100000ed3c31f368cac0c16d383448de1ea22acac6a921a46dd589b211333d5a3a1b09eefeee8edf791b494026838a79c2ba3bd6f6e98eab2e7a994d2984819f029d4fa1d193d3e2c3b55b1e5d358c16d4a8204047684586a6710be1577ec5f4ff37e39fc7faee6a87e563ab4b0f3609e907a0206a912fb5a4fee55deb361e4e41bd8e205bfc48d0e1603e6b88e2edbd24e9ad97b54c95f358962ae4aba70d00de317be726b86244bf7752dd1b08c00235bdcf0856ce08ad818d535827d961e4dde452face019edfdc14dc495271df0c1116fa1673c050891c95d7d96b8fc1612c23a4687830afa7c8229d99462137605eeed7b2f104344bc73702e36076d77b81671e627788e5a4bc233ec1226e3b5cd153552d863288dc5ed9307bb0cf066fbfe8f6481e62c83bf0e3ea0cde899690d133a5f10730c78000266c8208881003407e1a03e0d01e86c0f0240761203a0981c8480e01406e02000caa2004b4440116a4d7ac02bea5b1746b4b620b7e2c3ca51a59ab1212b338850839521ff7928000000000000000000013843d2bdd8e071f0cac2171333f9808e2b822500a5be21e9eb54cd88000000000000000000486ca4181ed9191f3e4e09a73bf578d3af738e10efbe7f15b9dbfe50a20000000000000000000000000000000000000000000000000000000001c4c40c600500201000421a7d1c6cefa92622d28e4cf59d3245fabfef4f70b58489d16eda978750a4383614d261018a9958087789434527eb417e5345da4636ec81c9119e7bada70d9b1e4eed65d96d9de4210a2ad370837f6dc77f50bc98ec7a9cfeca47d1a5223e2cb4e2dd2f4630a15396c2194f3ee2f688e9a0b72f6aa203022023e6a11af887ad47b34d5325e5d6592db189180176cd379e5481373776ad878b7930aa2d394435a0a82e5f7954f49a1c613e60cc8a38ead5e1b6292bac09bd216b0950dcb0c1ad83effce4d25d2cdec4afa93e04148945502d000b0b200b0a44025e6cf05d608798e242bf4784bbd34181afe4393352b7174eed2bae440489490f8bb08a445336b5bb100505802326d5ab1045e5e8b030108c33de0227dc1549b45de040320bab94c4d3c4ef84394280018a85e0007721b157340b490ab42ec29bbd85c25ff028c8408e48e87a3f62cc0064c8a2ddccf16c8c4598b168341c0caa74baa4e164cf6ae90edcfffda9fcec44305007032a9d308bb2c96ffe5d21db9fff3af5344764143ec9ae7d624017b7680cff15fc7d82d0d81e26562eef27d3126d6b3fdc05c3740000000000000000000000000000000000000000000000000000033a1249018c18808600218a476c28ae78f957e9d7637b3847867ad631ac874e067674cc3a696b637d658cc7952a3bc85c43095ab18ba935f1427bbbb26aa9c9a8551593d46416b4c45a934dcacbb8cfa69d251d2e42eedda033fc57f1f60b4360789958bbbc9f4c49b5acff70170dd000000000000000000000000000000000000000000000000000000ce24924063064042021020820025c700401a00045c40d88606a1386f0754c034db886c47fe055f64d73eb1200bdbb4067f8afe3ec1686c0f132b177793e98936b59fee02e1ba0000000000000000000000000000000000000000000000000000019cc90c80c60c3001000465d10cc17729890bd17b6c28def80f445d847d9b449e535d4d513afd646e22842e448395c32a2b43637e53ac8092ff5069ce6eea6fcbc47cd143f9910bc45e13f615a544179d82708f39bc4acb1b0889bb0e20d0ae2e8433180087ea914fff3de1518e449a30dbd48dcda22a8d484b108b628d011f70e2285a6abc1a53440a53d7cc1a88500cd78cc59e80320a1380436ed019fe2bf8fb05a1b03c4cac5dde4fa624dad67fb80b86e8000000000000000000000000000000000000000000000000000006712cb28528418110120000b5f70c5035c1118380379ac3de5f9f8b391558f2df673665743b557644a1a21d8523c6da000632407c6765e2764b5d6a24a17295a55b309a50955da29ee24e2c334848feddbc1400f1fe06cd7a4800629c874273000646142d01c6181cad6e90fcb1c337ca5a5a9634e6f457d652c51ce74f6b2c20408eab298b8c0023aaca62e0058409c011a6c0a575a03bc307a797a481a9060cfa983a7a4e0a004d719f10ec8a001772b5cc870a2841580a3880acb72de87534847396b32ebb24106baebb37521c107be716eca214100629ce75a4380dd5e2194f021800e189016e1324e0858028f2caddce60269e4812f5ea71d389e27c161d9e78e4c130f62346061c8c9c7909c04a550e86d598009c021e7cb67c292bd40c79a0d35cc2bcb901c504b69c724d6fe7134e4b100343009e38567bf5e30cc1f41400c80b00002c04000b3880024b9034050003011000777203e0200092d2001)) <<< 16000) + 0xb1040cc14002786400708c81916c0c48400402c372f04de08614415877b85263060afc6ddf705086823289cf0a0f1d55f954d1400e12672b344c084e010c2912fff00e9203398311c41430622bed4aa9860b1f37046888409e59e664872001520c2dcf83002e08c750c27002700860cf4a64559b8c16b05618a3988009c02000010c400089881804c0802605e1301f0901704c0780605a03be398cba1176592dffcba43b73ffeae03bd7848287d935cfac4802e4d18b9beed00bc0d048fd8a49615d75c55875c9d1ec91fc96ab3610a5082050c40c708000022bfe4bb5048b4f8ce20cf72795301230e274a771802d88afb1913cf149bab9844cb5c38bf56b5cb1fbba274b710c34f13cbff7e518dd2f6df1cc65d0549c2c99ed5d21db9fffb1be0839ee0a1f64d73eb1200b91151d1aac802f034123f629258575d71561d72747b247f25aacd842941c414420310330000f8ad17c46f7d0d76ad3f7b8ed27bf005e620bab6e27e6413c062a9ba312d055613e479b40b3e4d4c0f08a4a9dda924839c167c4a29b85ed9184b468150b8c29b3a78c6dd244ba54c49d5a01188138042c60a333646ae38a2c8db6f6946155c4ae44ae922614672a6c504100956031f44000a293bb82c5000b008656580ce204e01000018e20004d64001924f032a9d2ea9385933daba43b73fff6a7f3b110c143ec9ae7d624017b7680cff15fc7d82d0d81e26562eef27d3126d6b3fdc05c3740000000000000000000000000000000000000000000000000000033e068247ec524b0aebae2ac3ae4e8f648fe4b559b085284061844023020000601c679045168e9d5be18fa6397ff5727957f7230ae0f1d90768be451efb69457cba207cffb204121691ed7944f496ea9d8a5c8080bfdd9a1ed2eeb9e0ebf917c8dfde272386eb6c7b979108a388a12ded240420bbdf19f75d31b3ae0d777aae1d558b51d975e2800356181b6f3d99d360c384373531b6204d462b4c41a6004e0088104c2d966510c184616a0647103c739bb4fb02841fbcae031440ae0cfee3508c0028516dfaf98009c0200002a670a09ae1ffa9080c78cc129ac8a101987650b40c2ab64c9e6521839319e683d800134846d62f130213804000055080e0480b02405612019098078280a814000826400547881492c0a07404e2301911d0d33be951c2c80aa221476988c105694232092413ce6c90dea00002a2de795825082700858f6f2a780ec901a0a1939c9a3873c828bb1f0c119ba2296e83004b6e7b4b0128213004387175fc64946100270080130080001a08000d010250d80d86c09036046130180580b82ec770a8f6692a40769cf1b129070cea9e4cb0d8c080bd3a6e3d240221ac2e65630003ea87440c498309c0218445a2aa6a7a408df248261e8a20eb1329a1c202d55df603c14002593996e028034629d76e84c104c010811fdd9d8f96103e569674c5024104c00800008820003e84088360420b01f01d0cc1f22c338080a0f94ac4818e13e1ff3cc4f182253732fc5650234bc7574aca0173626011a8a001e14a4db2045271c270080000ca100e010002b590202180f8c80781700c010045176371bd6d838044f0b110108820940210080100400001110000c3203a13e06553a5d5270b267b574876e7ffed4fe762218287d935cfac4802c2427bd830c309fffcbc8338ff43b661ff52d8199096b7d92e400000000000000000437cd4260221302f034123f629258575d71561d72747b247f25aacd842950c324108000003316264f3bc0a37e6209e4f15049f5be439a140e39b2b8beb6c4a6f0c7f2a19841309f2a329b189045e0c5231aa717fc6237be7fc4139ee04b0e1ca59f2cccdcc3c6ac9782825d52947415324528002bc901c1980d8cc06844032220180980b84e020020080160de14dbd6a724101019ad2ea0205318c4d8e204628440100000b3202a1201201c0aed035a4a4b027cc34f9b030033f121a30040824bb99d1800048404a0100000f33063cb7d5784220447094011c2049475271301cfd7a35601c122edb517b0c047342860704066fe46476449440900218292edff442607458e6a2c98111825c0c0603326dfdee8d02088010028130130100008310121500882800098c8080a8000bbc80786803814000ae240032cc800af81002fc034386d55a8f0e0a0df3cba7b100404243271d69820019540e784f0c008eab298b80401853c27461000026202900861b81024cd78ba1840fb8baef5c3460957bf97a908b081017491876c505001613a0912441000169f87261f01000526e76e528000a38c1700a2050deeb70e9f8038a7e46f2ee572470f3fde76864030c1a7a280e5d3fb04100ffc6f9acc42809e2008c4e82c0321840bc08124aad39b652fc4113d2ee69a63103032842faf404880475594c5c102258196f5b1c3880010f4ee77020023aaca62e000021019a8c8f06020a8011452c3fde1ebd8493ee057890851428194217d7a048a9d15e1c5f310280043d3b9dc38201db2ca98c02086ebc798c461000ca10bebd018042a0045963bcffd4da985151b575f2447c59001e08bf04b258c01571a73c3050c5027d5668201040b9d9c23084300000b65d98db380160042c8082c5bf1d19f6ca219cc27cd0b55022c60757c642dad684a195215d738c8ec7280c37fb5bbf38a0c90000a597e8c21c008004a1a3313fd9f27103801b01e00007f08001e010005ad201a020007b120180a00097220162a000b6720144a0090d00404801c2400c0a0050100200800360c801928008840020200001002f121)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 23 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightStrongCase3" = "QuadHeightStrongCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 23 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightStrongCase3 private def zz2136:"s0858"="s0858":=by decide+kernel end section namespace Green24Proof.QuadHeightStrongCase4 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l15 l17 l27 l29 l30 l33 l35 l37 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xb7bfce106f, -0x45d964b800, -0x67dc0a02d5,0], ![-0x45d964b800, -0x285500d806f,0x70277b04f7,0x36b5934fde], ![-0x67dc0a02d5,0x70277b04f7, -0x1c6050eac00,0x45d964b800], ![0,0x36b5934fde,0x45d964b800, -0x22ecb25c00]] noncomputable def hinges:Hinges:=[(0xd50a0acef,l17),(0x58f269de19,l15),(-0x22ecb25c00,l27),(0x22ecb25c00,l29),(0x9e47079ef,l30),(0x22ecb25c00,l33),(-0x22ecb25c00,l35),(0x22ecb25c00,l37),(-0x9e47079ef,l43),(-0x58f269de19,l41),(0x22ecb25c00,l51),(-0xd50a0acef,l62)] def normalizationDenominator:ℤ:=0x45d964b800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x22ecb25c00,l27),(0x22ecb25c00,l29),(0x22ecb25c00,l33),(-0x22ecb25c00,l35),(0x22ecb25c00,l37),(0x22ecb25c00,l51),(0x58f269de19,l15),(-0x58f269de19,l41),(0xd50a0acef,l17),(-0xd50a0acef,l62),(0x9e47079ef,l30),(-0x9e47079ef,l43)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x3402900400000000050188020001284c12016801800000001e009200c00000001b00490060001a01040098c05000000d02201c6018000000068b0330040000000054029004000000151103cc0200000f0c8280a80100000000683033004000000003c0290040000000016014802000000000480c40100000000088052008000000221a07980400000000e140cc01002b0480b013a80250829010800cd401800a41502401ea008005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x1c7f086b575c8908a39e25e38c017e84db25ccc225e31c816909a6654929401cac8c0e2805fa136c973308978c7201264b706d0c74469b27b800565812ad69dc457542d1320d21aa282278522850e03447ea040b399fdea6247142e4aadced900aeabd711751800d346fc7722800b97521c2098109c0200002aa7a83444ad176592dfffdaac806c6f0530fe6619da41882adb1055c0b11220e20c21209000a01fe3ed255bc1dff6186ffa76c09fd1b6c84edbf3528feb48e11ff9a333d790b0faf4246124f6f931e3ad5e470bee7cae62914b42c55af2c2c724608a520680018d900a05de4000010b5e8cc49682a241058e48c40c28618648458180001006d8f5df4f4ba41631bb74f316a48d512b78bda0a1ba4f7a45ea3006c1e8e14bca004c01000011b34280737474532056c4d3aa85438a03a83444ac80798d693c7a04080e6e8e8a62002e64690578101242a9bb7599c109c02000031064415609343ef1c42c008d9a9a18429585850870c101639618be041d407c4f98414028202eae5310005404ddbcd49c20a0020000322406434000ae4406057c2895b06dd0b7e422b29b9b03cb3d3adf9477732d3b28f502f11f06d1a40010286494e97ed2308b142c9c7f2565bfd4c98e227acc964e07b9c5bb24700008157a58e52af7074f729d84f26114a24e5b0c562578d7d562bea7b302540012d3fa07ee38e47f02d9cb08d5a6d0da32335e7fffcbfd43d50ef5c1a0020d23c49b566fb8dfd718c47ae6b2a7c8b757ea8cfab95c92ada4a51d691860f6f0fc0f003b3e57ebacd882921d3a99b972af37f45f5f9a863fb504d8b1f95e49ccf5c2313298967759fd64ba57d540dd4e8aa8e800318ec32000034f1c56a3c7a4242f59501e7a72af6cad59c8cd8233fdcebe6ef9cbe6284400000000000000000002608c10610c08608c00a00802065bfbfa00f87cc8ab0c6749e959eec5906dee3be036a476ec3d7621aead84111b7b2a286961a1f7ab8c775b15c73009ba000636405c1402c0281a384ee75f56547097af7e48e2de86093661164ba48c5087e52a184b9f88007e52a184b9f8700a91e7298f3645003f2950c25cfd1a88cec1d74ca1e5b1bedf982b8ce2060048b2430c33e5c37a330abc3d9043b7c0b5dbeea860ff88c24666c0f5e939fd28e12fb048ba0d24a1979fe0cdc342480c0278b96ade0bb0f101140e172048c94013c291648d5e6545779232aecb6e021122e7308e3e4586002e519c65684000ad59c7fbca00500100001253441fb90d79df1029db8b2b70c9026209ea32f28e0804f8907298600397802912020127a48552b930214004000056c80584f88b2c9a6c06c70f6db6efe918a1008df10f410c2016d4f3cce200051262b6a00a8613802000049080030c9c36e494d4495c5053ef754c7bc3009f7baa63de01988148020054040001b6402c56028230130de7c3289bee31e799d5c2c8631183b05687920158128010d67fcc0000000000000000000000000000000000000000000000000000cf9900191029000e00a004028832e39269130304114ca2f9014b60173fcfe5c29ac1f0e248c44da2a2db5f829f8de355c6d109e14e33ab9285f6a8baa42276633208788859832cd64bd43d1537537fd8493f142f9057d58eef24675d36ec52cfdea4c895d4d2dfeaf9733bcefb8178b12f7f687864d8bdea1b00bb82fa1750aba9e93255ff9473e4d4b5d76b4a211ac7a353ccabaed69442358f46a79a418641de635056e9fb66d6823aed6cd21c1442880a098dbd4c6de6879dc2165f40b0cc9e0cc9df364b0bac3082a70277b04f6b813bd827b81a07285239447a511e3f61521018e09401000e054000401b000010040000111c12cd45d8ce1404d85208a4410063ef2a0b11801280420000200800002220001de6435acb0e60d8908a928ffc453018136a923605046eb5c554f0c12a733bbc509013cef6c6da1800102ab3e267002600860c4bbef197a1033e6bca82344004c01000008320140200023220240b80400802380d1f6fe0af080) <<< 16000) + 0xf71455a88044104a01000008620201a0000d820162bc3be12b0a7a395ee024a9b62b11a294f3e2e76c499a5dc0eedc32cd5362014eb3d8afcb954f1e09d1664ca85ece0103508b5c122a7ce51fac365014009d0d18be1108d17d8b16d7456bf6ca867962376704e5b031df0efa641ad18c597643dd2a804fd9e4745fc0c07ec136341fdf189ae55b5af9770402aadcb236ecd9f449cb57ba61bee0aa637eb5ca4513790ec11cb898c4d10a5f793a3755bcdedeea6283e2694ea9606beef06df2da53392476e713ffd792142900c8275edf376d0bf7bdf5a25ce34e4e10aaea5541635f6f63daf4b6e84a9c2a7b450a78709fc003a2851e87aab5a3969c0dbdfbcf26282404da398963f91ec0a49ecc8f22b6fb9d9c02f7cd71b8b18b18fb8d6d4945dffca13e85041f93c459ea558e85ca12d8d59182e634e209cd1991629140336492e56830004c351ce3c6004c010800008020000088800079900909d814f35bf054ffee9c18cb23b6d2f33ccba9367a71f4d9c4f84b067140e0b72156416a2fa4b3a0c0032a87ace042cefd7bdb58d8721297b083eea35d8504a518e1db0773f469f1e1675ced94bb2200f558a5cb99c6e9f851b822f3da1495a070511d17c05d51f4335eb0495e12bb74bea4e5745fb9886a7a247523518082ca13b2de700c388509b254e1bf8aa2dc9d13206b53d7ca56ac8ecc95fc8aedd1c7048d97164dd62f0adaef2d6f0c96dbc0036a2130b1c7d791a5e8bca3052a41c400004011623467a94519a1493a237569a00628d1d831002856238518c01375039c1ca0048010000111200029c402804000ee4404417000010046017f72cf96038092f85be66280262c3bfbd1801200400002c4f102fb3eb0aad82aa1b78c8576a69c7729b29c8033e165efcbe2fd4c35e43d63b559cc9fdb81c64ed4b9a69d2c873cbf19288d371d60103d09a29d2b22ff5d85f93c1e11caf1187770f2c2ff4e95ec07144186a42dcce55ac5095af6f9bf9e8b09190ccddcafc06273e33b84000d92f7963b69154d53ac73a0d024f237a1bc453f077c7a3c178a959f1477d7d31b278c4be6d565b60bb780bc5ebe11a2658d8a0ac11e2f9cf096bed1827b9bb74480087c473f2677ad5a98fb2ea5abcd4de63b257c1cec6fba24c746874d9e63adb0bb52b1250d587d2feb1653fcb55654ea905b674dbfee015ac0d9ea59c346eab6e754e2da38bc5c6db0b80ba206eb65de1a5408630fa7efa305a460000042a101005007828038040013384006e588011bf1d61207ab040104356aca99101287bbac2d70cfcfc369a4924000000000000000000000476386b625cd2df004dd72154395d4ffb800000000000a9cafccd2b6267b3b0ecc3bbdbf4d546ee3a62bc37fbc43b15f7499c9ddd480000000000000000000000000000000000000000000000000000000000007831030c11800408a54c93167ce684595d39eb2db379903e32f7240e6dffe7c2f4bd4e9527f2500e573e14bd0807b49800899c6a6e52e960537fe577aea45a732756401717eea1e16e654020f9630dae38c70a10d1f42b7e1874bafb4bbb98811ee19eb06a5240838ff5f6fbf298e5e1dc9c17affb710e6c04da10e935f4001e888018a01003af83503d363d299350a32cb5e800000000000000000000015b813bd827b7813bd827b8340e50a472c9c28f8ccb8524382302202280200080e3ef2c8508be1614aedd7fc7572fdf7eb173052cffc85273a5a479e6ac2a2402dfe1c8be74ef0a33598137b56fd31b01a5e00cf1125db7dbc8e9a09ab9207e21edc920494be9aad02f9584338abbcafccd2b6267b3b0ecc3bbdbf4d546ee3a62bc37fbc43b15f7499c9ddd480000000000000000000000000000000000000000000000000000000000007897fe5c2f7a0cfea6ed03f0a451bcdcd0148e1fc35243444ea4ffe4cec600000000000000000000000000000000000000000000000000000000001d088087085087043001000006e100200d00d09d1006c3b275feea2080488bdfc341624302adec28c27b901c598ac13fd87c60c35fe94cbefd42040cd4b3c728050c01c7a2ed37d500200d34e2b4bbd9cfa1008620588102ee609e4b92180ea0d112b203bc888c975a40460339be5989040750688959282138040000488806028000d948003eb100201406a98c572201001d2448595c1020b454f831026184c008815e7a7b9a48501e0eb01926040e81763794c23082600840e54d2288be101912a8c320844104c01000008720002b6402c474189515ad3791042500400482f05166a16bba040aad6a36aef1001300428679f939e12c80a54b3053451c2895901575860849ba0180b281129c8126b0a01183f91f0314002f9a8331e700260080000bf900801000119900a05c020040100121380000802204ab981bfd258130e3178141800132b2fbe0200b927fb2f24002500800007198000080221fccc33b4831055b620ab816cf865137dc63cf33ab8590c6230760ad0f2402b0250021acff9800000000000000000000000000000000000000000000000000019ea07a6c7a5326a146596bd00000000000000000000002ba05fade800b39ef856ed77bf5039f43bdfa81cf90a10508604b00a00602a000200d0003ca200080e402014000aae40016a48004471000aef34372bf1a91c7141cc383a35f510024c533a448080287beaf66d240428008517fe7786e7c01840075068895850c0c06737cb31414cbc3852c259010a80200001f4401c2400c120050500200800c040004e04008740020200001000cfd1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 13 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightStrongCase4" = "QuadHeightStrongCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 13 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightStrongCase4 private def zz2137:"s0859"="s0859":=by decide+kernel end section namespace Green24Proof.QuadHeightStrongCase5 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l41 l43 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x7cf0018e12, -0x2e90edd000, -0x45d964b800,0], ![-0x2e90edd000, -0x1aaa1005f42,0x47c2bc4692,0x269635c9ba], ![-0x45d964b800,0x47c2bc4692, -0x12eae09c800,0x2e90edd000], ![0,0x269635c9ba,0x2e90edd000, -0x174876e800]] noncomputable def hinges:Hinges:=[(0x1812033b4,l14),(0x92e6f7903,l17),(0x39efadc41a,l15),(-0x174876e800,l27),(0x174876e800,l29),(-0x1812033b4,l25),(0x7a6df70dd,l30),(0x174876e800,l33),(-0x174876e800,l35),(0x174876e800,l37),(-0x7a6df70dd,l43),(-0x39efadc41a,l41),(0x174876e800,l51),(-0x92e6f7903,l62)] def normalizationDenominator:ℤ:=0x2e90edd000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x174876e800,l27),(0x174876e800,l29),(0x174876e800,l33),(-0x174876e800,l35),(0x174876e800,l37),(0x174876e800,l51),(0x39efadc41a,l15),(-0x39efadc41a,l41),(0x92e6f7903,l17),(-0x92e6f7903,l62),(0x7a6df70dd,l30),(-0x7a6df70dd,l43),(0x1812033b4,l14),(-0x1812033b4,l25)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1a014802000000000280c401000004e04401630100004a1304805a00600000000780248030000d0082004c602800000681100e300c0000000345819802000321504c079003000000843803c6018000000007406200800000000540290040000016084078c03000198682403c801800000054440f300800003c320a02a00400000001a0c0cc01000000000f00a4010000000005805200800000110500618060000000009018802000000001100a401000000044340f300800000001c28198020056090160275004a10520210019a803001482a04803d401000b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0xe3ac1c7d8412fa3628521f5c58ed205ecc6e3b0134289c7545a97c0004060e846c6a1f5bd232fb108da000804c0b2eef25fab4045346a6d4002792e7aa33aa32a000810ce210a14184ffa0150f41ebd64391c084274081640ed41d7f7bb09e49562f5afc5fc07149fd50fd3227ae158bcb831f13cb60804a4f0d51bf603777e52449fbe379306003cada2d1de9121e7399db34013c8050004efa14c5c924e05646dd83e58a31008de5d5f53bc70599cb42d7392f5aba0c78e8117a5ee12d43043a09e0000f98c88cb8de358b4af6eb8d91abd601c4e50235831ba300391a4d55800c2689670e594ed99203d3ffd0c09058117ba45d6ace3bbdddb4d0040015ef6dcc1ffbcb0973a8c0c0140ce08d5ed6d8b9cc811832dc0086fbe9caaf06cf43dc3486139df4d5459b3e8e76e64aef5d17089fe68c0eb6e81831843d0000764402c17080c0000039dd3b5b3de0a89639631230a1861921160370401006d8eb11b290192c6ac7e7e4e1123626871117850db96543ece300ae34818c365042500800008c18168c79940ab3b8807a9925387eb10800d063e7172aa820303fb7366f3157e8204180160000478d62284506b0817dc2965ea14ca06657da3e865ddc8c3e865ddc8a1391220e20c206082090008019f11383ae619f46aeedd06cacc54502c3c5ef3a9e1795e90c603ae22e6170c8618e80012210200d0002db101f15f0a623176d06d6cdc9036362ff0fcf7f870b9e6909e0a4a9f102e5f0cb2b92d683410353521a92c22f204715f13a74e8b482061bd980ca4b1cd06dcdc8763ab9a365cd9c3001ddc2fae20743ecaee02994389d8574c068a0cbdecb1deea6ed6ae1897985dd0a096fbc47668eecdb23b31beecd2daaebf6e7a683b4885e6eb200f11af9e4748ea2eba7a7784d08608eac148b969f89b1c4f5ac5dfef6586547dc5512f0a54639744b8000543327f7f9367b84d212955430b990eb0220499f484157fbc41788dda0000000000000000002388c10610c08608c00a00800815a3df4753c88fbeb2b29ee5f004228792a2d0ae91297f868ee27df0f66c3c8d4b6f746c4106dbef7876e416a48d0002f5203c4301d0500e00a06c0f7f86b134c709f0a3a84280e1826cddee38a19c508a58be2c0d5a2002962f8b03568700ec29b084b2f14014b17c581ab4121eff4261e018a4c8343aaa6b8dc60b80814401b4582797b7f02f32920814fd54fab3e14a6f9fd29a409251d3274bbc4d80947eb2000b59745f290bf3d99ff82fde42647180810a2150a205ba3a45425703d6d9763333f4f6f6902a602b2b07c65dedf3bcb82f42f62f6204aad140b8b81d60c885a5a177dabce23821089cc790dd57d6ad9a8ef03af58a410081001ac9aab149e9972888f5ac7c700583442859cef51acc7c2b84ef53129f354ae7090498352b592843b8a20000de880684c03027f432eee46ba43b73ffef77ab2c6e82700000000000000001a49e3fb289cb80e5726774a933236d3520000000000000000010c871070c40810430020000b0a00803400082c8003d31a117f13d16f56a8dc4f2cebbfef4644625ce7f8e7c009141a52ea16c72f98905693e52124dc432d6e07ab76a20e30104883b80984575acec58b51b78484ebddce3234b4941096c7df9f7250a5cc887cbb4343de087e6e8f5d6529cbf7044e90248347035c7300b36fe473c506395642000038020182b01b1180d06f2a40ab43d636ae2a5f9897fff012094e8d5302412ab2698d92000000000000000000000000000000000000000000000000000) <<< 16000) + 0x65ee14b2f50a650332bed1f432eee461f432eee4509c8814800700500200143c1609fe86fe8c7fcbe03c811c70bbd6b89048d659fa2d75b35ee4b49a4cec17fea887a889172f87b1ad4f94f1ebb81d8adc171a7c3874e3271344e4191dbc7e6827ddde5248f1aef73593fff7b71d838823768978b9da25e2de1e46a444e1fbfaa07df432eee45fa19777230cca721a390000000000261d988d207662347e9c7665f53b9bd8907d0b2c9109048028000200db102a4bee8c9010311eed0f2c1a95c5fd2840252e68a814400aed8a8cfca004601000010c3004010040000111c1428d24279280b061b07f01c00a0a06b8b0402ea914ad12404240084010040100000444000478c86f2d5db9562423bc6daf09980dd140a7f9850478246461a182757f11e052406765b727e0c00356fc37149c1094021042c9111a0818367ba2409e103a6f7aba2c4c1090010000160402c040004b44064170080100441c9e5afd62438054a730cde82006e0de1ecd846104e0100000bb20281a0120d000091100d158060aee8b4641239016828dbf1d4cb84b36b595af51a943a9d792671321928bf6f18c5bb400000000000000000024204803411fb8161080c0000039dd3b5b3de0a9963eebfca29c8e882e51cc2bcc3f5ec2e90edcfff854a386186300281a6e568d5aa77f5e576c34e53993bc0793537d995c794645b9e3505134e729d964b737c022f1795fa453e863134c45211cad30ba8d5b2715f40add6b72103cd38acf07eb6a3fa2014ca86be81f6e311f50153d2eb2300d17150da2093eff0f8f61402cd97fad1f1801300420000200800002220001e840602402e1300a09f68978b9da25e2de1e46a444e1fbfaa07d051b7e3a9970966d6b2b5ea3528753af24ce26432517ede318b76800000000000000000048745775b913502d02401a08fdc0b41042423012c01000db2ae504efe763de25857d43310b7e532e3c1c91dbc87219373509713e6e283a01a5a15e12cba31c05f6c96ca6ae611d7d98fadc99d7a93214a202ba5f293d95286881df600802008820172e73f24588111be83cf3428cb258c1210111b1bf63588010d7df99bc3000a57001b22604250080000a49016090000cd900b01000326101505c000040118050e7b4bd70e01b43201d78a007be9a89fc600480100000b137b71d83894ef99b8e80000000000000000011ba2bbadc89a816fe281c0240605f70a597a853281995f68fa19777230fa197772284e658fbaff28a723a20b94730af30fd7b0ba43b73ffe1529438410a00205b649494583b050e6c9d38231893681e2e59daa80e2a81eab9b3a8737cd19786c3c2bf40a809ef079ac3bce69514713f763863acacc61115481d8faee61f5cc6dae3fd9680a3e7ed0004cd20281201309809028044140200200063f200273a4007264e4bf234c244819c3a5b300456ea270098b800000000000000000115f432eee45fa19777230cca721a3900000000002621030c118004002520eb9651bad55a4a9fecaf0cf30a344621a0811c29d9d8b16d7ef58f06de120d753caf1237656e01623744591d943f829f62f943b4ed07ed28096aeb442e01670cb80d96d0fd82c6e4ac755cf58bb198285421535ded27f61082428f935a800256100264a200684a782e012445d9a6824fb340cd06b8f18193750b405814fe299cee1e59f50808f0b83be5d61d38541af43eec9850089f52d4a127a4cc5238e98bdf820154cd94b27a767eea95ff7a8659040607b9599076c87d7150f50ef2e8360303063271e24f165f577dd483a48a958baa34987281824d7cd476ecce00408a5ca1530a3488830a1218830d0101c0e62e533a3068010b211990138156276b02025a4063489060107e05466a9304130042f6e3b07129df3371d00000000000000000023d6cf739dd440000010809054880c60c8084042041052c100200d000166201e1390c6bc8c9f49203caf47a8f5460c297c3bc571020c4eb52b703007ec48676a04022e3a2048126082600840801c61143a203f9366ed0610124f179a81926104a0080000b7201c0a0002382000a7240080501d04ed5de28801412b19fe8102020078c3a04c309401102301a5950345006034b2a068206b1fedc1d208c209c02102acb50dfd784056b9c250b0110413004000021c8000af100d1180608e836eeb1d9c2000925d0229e12082400400502f055c8c38935081abbfe636b1102128042869b761ca699015424150e1870b0687f2b843043d253db83281240fdb8f09402fcfe729085002069e94644e084a01000017a20120200022e20160b806008020028270040100460c0ef932f8c204a303ff174b025473ef05c6002cea87374100ff52e9e40941090020000224600802008e1380d5c240c075c449492383953117750c0b19bc8a8480042010a01623606ab03bb581de053852b92cda4664d27fda02b8b7ffc16971245b4ac4d4e9a1abe203c800000000000000000000000000000000000000000000000000000006e8927e8ff578b3b24a21300b3ffbeb8b6b37dcc4b733bf15c6801800000000000000000000000000000000000000000000000000001a7cbf5404721e4ffd33159a1aa9bbb1e286aa6eec742941861831c21c0a000080340013388002de90005fa20120a0007792000f964002b708006a91a1aae069957e8a0c18f30ec3b88012bbc0b1b30400cb77cbf700481050010a2d51f60a114850c093c5e6a0628267d16b4cb7598414802000030880404801c2400c0a005010020080008e8801928008740020200001000cbd9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 15 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightStrongCase5" = "QuadHeightStrongCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 15 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightStrongCase5 private def zz2138:"s085a"="s085a":=by decide+kernel end section namespace Green24Proof.HeightStrongRows open QuadraticCertificates ExpressionCertificates ParityPhaseRows def rowsChunk0:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x105d35d90f6f48023d5b2ccae532ec8bbba800bf1e699ba029301baa1ede88018b6f9f3c2059301baa1ede88049a4eddac6135d90f6f48018b6f9f3c207d62ec8bbba80248dc19b8e5601baa1ede88009c4b0f3c3ae1607b9d6a8802fed8eea8a07d201baa1ede88002c0f6b3f09202d20ef3acd0805db3d1a601d202f4c3dbd08004cb8fc78f82525d90f6f48003f4a6d89692079201fa02a6069201baa1ede88018b6f9f3c2019201baa1ede88002a4aaf0f2c61201baa1ede88007e9b5fce4f607c209a88bf2805e9c86864225a0afc88001efe0b296b607825d90f6f48001ebb98ccfba02018bd9b2ae8007bc8c9998ea14] def rowsChunk1:List (ℚ × Potential):=PackedPhaseRowsData.decodeParity [0x103d501baa1ede88005dec9f2caae02d55d90f6f480079efdb7889a01d507b9d6a88023a0eb81e203955d90f6f48002bcc783e7de02950297b2e4dc80169ea6cef8b201955d90f6f48003aa8a85b3de150297b2e4dc801da0e8c4d603c125a0afc8800185f981dcf602c112d097e48001bbc7b0d6e201c107b9d6a88023a0eb81e203815d90f6f48003c0f3feb1e6028104aee5c9b8802a96d2c097fe018107b9d6a88023a0eb81e203c401baa1ede880028fa7b9ee06c404aee5c9b880028fa7b9ee03d012d097e4800197a5b1f206d037f0c7ac800197a5b1f203d35d90f6f4802a89bff5f206d32ec8bbba800188d7c6f613] def rows:List (ℚ × Potential) := rowsChunk0 ++ rowsChunk1 def mu:Phase → ℚ:=![(-0x8f22b1a85 / 0x77359400),(-0x5f487657b / 0x77359400)] def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadHeightStrongCase0.base QuadHeightStrongCase0.hinges QuadHeightStrongCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadHeightStrongCase0.base QuadHeightStrongCase0.hinges QuadHeightStrongCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightStrongCase0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadHeightStrongCase1.base QuadHeightStrongCase1.hinges QuadHeightStrongCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel private def zz404:"s0194"="s0194":=by decide+kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadHeightStrongCase1.base QuadHeightStrongCase1.hinges QuadHeightStrongCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightStrongCase1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadHeightStrongCase2.base QuadHeightStrongCase2.hinges QuadHeightStrongCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadHeightStrongCase2.base QuadHeightStrongCase2.hinges QuadHeightStrongCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightStrongCase2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadHeightStrongCase3.base QuadHeightStrongCase3.hinges QuadHeightStrongCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel private def zz405:"s0195"="s0195":=by decide+kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadHeightStrongCase3.base QuadHeightStrongCase3.hinges QuadHeightStrongCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightStrongCase3.nonnegative x hx def quad4:Expression:=quadSlack rows 1 1 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadHeightStrongCase4.base QuadHeightStrongCase4.hinges QuadHeightStrongCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadHeightStrongCase4.base QuadHeightStrongCase4.hinges QuadHeightStrongCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightStrongCase4.nonnegative x hx def quad5:Expression:=quadSlack rows 1 1 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadHeightStrongCase5.base QuadHeightStrongCase5.hinges QuadHeightStrongCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel private def zz406:"s0196"="s0196":=by decide+kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadHeightStrongCase5.base QuadHeightStrongCase5.hinges QuadHeightStrongCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightStrongCase5.nonnegative x hx def pair6:Expression:=pairSlack rows mu (49 / 0xfa) 0 0 false def pair6Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair6Target:NormalForm:=CompactPair.toNormal LocalHeightStrongPairs.compact_heightStrong_pair_6_base LocalHeightStrongPairs.compact_heightStrong_pair_6_hinges theorem pair6_identity:identityCheck pair6 pair6Rewrites pair6Target = true:=by decide +kernel theorem pair6_target_eval (x:Point):normalEval pair6Target x = LocalHeightStrongPairs.heightStrong_pair_6 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalHeightStrongPairs.compact_heightStrong_pair_6_base LocalHeightStrongPairs.compact_heightStrong_pair_6_hinges x theorem pair6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair6 x:=by rw [identityCheck_sound _ _ _ x pair6_identity,pair6_target_eval] exact LocalHeightStrongPairs.heightStrong_pair_6_nonneg (hx 0) (hx 1) def pair7:Expression:=pairSlack rows mu (49 / 0xfa) 0 0 true def pair7Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair7Target:NormalForm:=CompactPair.toNormal LocalHeightStrongPairs.compact_heightStrong_pair_7_base LocalHeightStrongPairs.compact_heightStrong_pair_7_hinges private def zz407:"s0197"="s0197":=by decide+kernel theorem pair7_identity:identityCheck pair7 pair7Rewrites pair7Target = true:=by decide +kernel theorem pair7_target_eval (x:Point):normalEval pair7Target x = LocalHeightStrongPairs.heightStrong_pair_7 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalHeightStrongPairs.compact_heightStrong_pair_7_base LocalHeightStrongPairs.compact_heightStrong_pair_7_hinges x theorem pair7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair7 x:=by rw [identityCheck_sound _ _ _ x pair7_identity,pair7_target_eval] exact LocalHeightStrongPairs.heightStrong_pair_7_nonneg (hx 0) (hx 1) def pair8:Expression:=pairSlack rows mu (49 / 0xfa) 0 1 false def pair8Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair8Target:NormalForm:=CompactPair.toNormal LocalHeightStrongPairs.compact_heightStrong_pair_8_base LocalHeightStrongPairs.compact_heightStrong_pair_8_hinges theorem pair8_identity:identityCheck pair8 pair8Rewrites pair8Target = true:=by decide +kernel private def zz408:"s0198"="s0198":=by decide+kernel theorem pair8_target_eval (x:Point):normalEval pair8Target x = LocalHeightStrongPairs.heightStrong_pair_8 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalHeightStrongPairs.compact_heightStrong_pair_8_base LocalHeightStrongPairs.compact_heightStrong_pair_8_hinges x theorem pair8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair8 x:=by rw [identityCheck_sound _ _ _ x pair8_identity,pair8_target_eval] exact LocalHeightStrongPairs.heightStrong_pair_8_nonneg (hx 0) (hx 1) def pair9:Expression:=pairSlack rows mu (49 / 0xfa) 0 1 true def pair9Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r27,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair9Target:NormalForm:=CompactPair.toNormal LocalHeightStrongPairs.compact_heightStrong_pair_9_base LocalHeightStrongPairs.compact_heightStrong_pair_9_hinges theorem pair9_identity:identityCheck pair9 pair9Rewrites pair9Target = true:=by decide +kernel theorem pair9_target_eval (x:Point):normalEval pair9Target x = LocalHeightStrongPairs.heightStrong_pair_9 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalHeightStrongPairs.compact_heightStrong_pair_9_base LocalHeightStrongPairs.compact_heightStrong_pair_9_hinges x private def zz409:"s0199"="s0199":=by decide+kernel theorem pair9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair9 x:=by rw [identityCheck_sound _ _ _ x pair9_identity,pair9_target_eval] exact LocalHeightStrongPairs.heightStrong_pair_9_nonneg (hx 0) (hx 1) def pair10:Expression:=pairSlack rows mu (49 / 0xfa) 1 1 false def pair10Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair10Target:NormalForm:=CompactPair.toNormal LocalHeightStrongPairs.compact_heightStrong_pair_10_base LocalHeightStrongPairs.compact_heightStrong_pair_10_hinges theorem pair10_identity:identityCheck pair10 pair10Rewrites pair10Target = true:=by decide +kernel theorem pair10_target_eval (x:Point):normalEval pair10Target x = LocalHeightStrongPairs.heightStrong_pair_10 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalHeightStrongPairs.compact_heightStrong_pair_10_base LocalHeightStrongPairs.compact_heightStrong_pair_10_hinges x theorem pair10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair10 x:=by rw [identityCheck_sound _ _ _ x pair10_identity,pair10_target_eval] exact LocalHeightStrongPairs.heightStrong_pair_10_nonneg (hx 0) (hx 1) def pair11:Expression:=pairSlack rows mu (49 / 0xfa) 1 1 true def pair11Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair11Target:NormalForm:=CompactPair.toNormal LocalHeightStrongPairs.compact_heightStrong_pair_11_base LocalHeightStrongPairs.compact_heightStrong_pair_11_hinges private def zz410:"s019a"="s019a":=by decide+kernel theorem pair11_identity:identityCheck pair11 pair11Rewrites pair11Target = true:=by decide +kernel theorem pair11_target_eval (x:Point):normalEval pair11Target x = LocalHeightStrongPairs.heightStrong_pair_11 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalHeightStrongPairs.compact_heightStrong_pair_11_base LocalHeightStrongPairs.compact_heightStrong_pair_11_hinges x theorem pair11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair11 x:=by rw [identityCheck_sound _ _ _ x pair11_identity,pair11_target_eval] exact LocalHeightStrongPairs.heightStrong_pair_11_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad4_nonneg x hx · exact quad5_nonneg x hx private def zz411:"s019b"="s019b":=by decide+kernel theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack rows mu (49 / 0xfa) p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair6_nonneg x hx · exact pair7_nonneg x hx · exact pair8_nonneg x hx · exact pair9_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair10_nonneg x hx · exact pair11_nonneg x hx end Green24Proof.HeightStrongRows private def zz2139:"s085b"="s085b":=by decide+kernel end section namespace Green24Proof.HeightStrong open QuadraticCertificates ExpressionCertificates ParityPhaseRows ParityPhaseSemantics open ParityPhaseSymmetry ParityPhaseAggregation open FullPhaseSemantics (quadPoint pairPoint sameColour) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open FullPhaseAggregation (quadPoint_nonneg pairPoint_nonneg) theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack HeightStrongRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact HeightStrongRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse HeightStrongRows.rows p q same x] exact HeightStrongRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack HeightStrongRows.rows HeightStrongRows.mu (49 / 0xfa) p q same) x:=by rcases le_total p.val q.val with h | h · exact HeightStrongRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap HeightStrongRows.rows HeightStrongRows.mu (49 / 0xfa) p q same x] exact HeightStrongRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible HeightStrongRows.rows = true:=by decide +kernel private def zz412:"s019c"="s019c":=by decide+kernel theorem certificate_bound {q:ℕ} [NeZero q] (h2:2 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (49 / 0xfa:ℝ) * energy g - (0x23adac57b / 0x1dcd65000:ℝ) * (classMass (ZMod.castHom h2 (ZMod 2)) g 0 - classMass (ZMod.castHom h2 (ZMod 2)) g 1) ^ 2 ≤ deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack HeightStrongRows.rows (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack HeightStrongRows.rows HeightStrongRows.mu (49 / 0xfa) (ZMod.castHom h2 (ZMod 2) j) (ZMod.castHom h2 (ZMod 2) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum h2 h3 g hg,weightedAggregate_zero h2 h3 h5 g HeightStrongRows.rows rows_admissible] at hs have hmu0:HeightStrongRows.mu 0 = (-0x8f22b1a85 / 0x77359400:ℚ):=by decide +kernel have hmu1:HeightStrongRows.mu 1 = (-0x5f487657b / 0x77359400:ℚ):=by decide +kernel rw [hmu0,hmu1] at hs norm_num at hs have hm:=classMass_sum (ZMod.castHom h2 (ZMod 2)) g unfold deficit rw [← hm] nlinarith theorem strong_height_bound {q:ℕ} [NeZero q] (h2:2 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (49 / 0xfa:ℝ) * energy g - (6 / 5:ℝ) * (classMass (ZMod.castHom h2 (ZMod 2)) g 0 - classMass (ZMod.castHom h2 (ZMod 2)) g 1) ^ 2 ≤ deficit g:=by have hc:=certificate_bound h2 h3 h5 g hg nlinarith [sq_nonneg (classMass (ZMod.castHom h2 (ZMod 2)) g 0 - classMass (ZMod.castHom h2 (ZMod 2)) g 1)] end Green24Proof.HeightStrong private def zz2140:"s085c"="s085c":=by decide+kernel end section namespace Green24Proof.ProfileOrientation open FullPhaseRows (Phase) open PhaseMassRows theorem phaseTotal_translate {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (t:ZMod q) (r:Phase) : phaseTotal h4 (fun i => g (i + t)) r = phaseTotal h4 g (r + ZMod.castHom h4 (ZMod 4) t):=by unfold phaseTotal colourTotal have h:=Equiv.sum_comp (Equiv.addRight t) (fun i => if ZMod.castHom h4 (ZMod 4) i = r + ZMod.castHom h4 (ZMod 4) t then g i else 0) simpa only [Equiv.coe_addRight,map_add,add_left_inj] using h theorem parityEquiv_add {m:ℕ} [NeZero m] (r:ZMod 2) (i t:ZMod m) : parityEquiv m (r,i) + doubleResidue m t = parityEquiv m (r,i + t):=by simp only [parityEquiv_apply,map_add] ring private def zz413:"s019d"="s019d":=by decide+kernel theorem interleave_translate {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (t:ZMod m) : interleave (fun i => u (i + t)) (fun i => v (i + t)) = fun i => interleave u v (i + doubleResidue m t):=by funext x obtain ⟨⟨r,i⟩,rfl⟩:=(parityEquiv m).surjective x rw [parityEquiv_add] rcases zmod_two_eq_zero_or_one r with rfl | rfl · rw [interleave_even,interleave_even] · rw [interleave_odd,interleave_odd] theorem phaseTotal_shift_children {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (u v:ZMod m → ℝ) (r:Phase) : phaseTotal h4 (interleave (fun i => u (i + 1)) (fun i => v (i + 1))) r = phaseTotal h4 (interleave u v) (r + 2):=by rw [interleave_translate,phaseTotal_translate] have ht:doubleResidue m 1 = 2:=by simpa using doubleResidue_natCast m 1 rw [ht,map_ofNat] theorem orient_even_child {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : ∃ u' v':ZMod m → ℝ,(∀ i,0 ≤ u' i) ∧ (∀ i,0 ≤ v' i) ∧ mass u' = mass u ∧ mass v' = mass v ∧ deficit (interleave u' v') = deficit (interleave u v) ∧ phaseTotal h4 (interleave u' v') 2 ≤ phaseTotal h4 (interleave u' v') 0:=by rcases le_total (phaseTotal h4 (interleave u v) 2) (phaseTotal h4 (interleave u v) 0) with h | h · exact ⟨u,v,hu,hv,rfl,rfl,rfl,h⟩ · refine ⟨(fun i => u (i + 1)),(fun i => v (i + 1)),(fun i => hu _),(fun i => hv _), mass_translate u 1,mass_translate v 1, ?_, ?_⟩ · rw [interleave_translate,deficit_translate] · rw [phaseTotal_shift_children,phaseTotal_shift_children] simpa only [zero_add,show (2 + 2:Phase) = 0 from rfl] using h end Green24Proof.ProfileOrientation private def zz2141:"s085d"="s085d":=by decide+kernel end section namespace Green24Proof.Full27ProfileInterval open FullPhaseRows FullPhaseAggregation PhaseMassRows ChildRows GrandchildRows HeightChildRows theorem grandchild_nonpos_of_induction {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (r:Phase) (ih:∀ (n:ℕ) [NeZero n],n < q → n ∣ q → ∀ u:ZMod n → ℝ,(∀ i,0 ≤ u i) → 0 ≤ deficit u) : rowAggregate S h4 h3 g (.grandchild r) ≤ 0:=by rcases h4 with ⟨n,rfl⟩ have hn:0 < n:=by have hp:=NeZero.pos (4 * n); omega let:NeZero n:=⟨by omega⟩ rw [rowAggregate_grandchild] have hd:=ih n (by omega) (dvd_mul_left n 4) (grandchild g r) (grandchild_nonneg g hg r) linarith private def zz414:"s019e"="s019e":=by decide+kernel theorem interval_bound_of_height {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hh:(49 / 0xfa:ℝ) * energy v - (6 / 5:ℝ) * (classMass (ZMod.castHom h2 (ZMod 2)) v 0 - classMass (ZMod.castHom h2 (ZMod 2)) v 1) ^ 2 ≤ deficit v) (horder:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hlow:(49 / 20:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (27 / 10:ℝ) * mass v) : (3 / 0x7a120:ℝ) * (mass u + mass v) ^ 2 ≤ deficit (interleave u v):=by have hg:=interleave_nonneg u v hu hv have hV:phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3 = mass v:=by rw [phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2,classMass_sum] have hU:phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 = mass u:=by have ht:=phaseTotal_sum h4 (interleave u v) rw [mass_interleave] at ht linarith have hchild:rowAggregate (27 / 10) h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even] have hd:=ih m (by have hp:=NeZero.pos m; omega) (dvd_mul_left m 2) u hu linarith have hheight:=rowAggregate_height_odd_nonpos (27 / 10) h4 h3 h2 u v hu hv hh have hgrandchild:=grandchild_nonpos_of_induction (27 / 10) h4 h3 (interleave u v) hg 2 ih have hc:=Full27Mass.deficit_lower_bound_of_child_rows h4 h3 h5 (interleave u v) hg horder (by rw [hU,hV]; exact hlow) (by rw [hU,hV]; exact hhigh) hchild hheight hgrandchild simpa only [mass_interleave] using hc theorem interval_bound_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (horder:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hlow:(49 / 20:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (27 / 10:ℝ) * mass v) : (3 / 0x7a120:ℝ) * (mass u + mass v) ^ 2 ≤ deficit (interleave u v):=by have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) exact interval_bound_of_height h4 h3 h5 h2 u v hu hv ih (HeightStrong.strong_height_bound h2 h3m h5m v hv) horder hlow hhigh theorem interval_bound {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(49 / 20:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (27 / 10:ℝ) * mass v) : (3 / 0x7a120:ℝ) * (mass u + mass v) ^ 2 ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,horder⟩:=ProfileOrientation.orient_even_child h4 u v hu hv have hb:=interval_bound_ordered h4 h3 h5 h2 u' v' hu' hv' ih horder (by simpa only [hU,hV] using hlow) (by simpa only [hU,hV] using hhigh) simpa only [hU,hV,hd] using hb end Green24Proof.Full27ProfileInterval private def zz2142:"s085e"="s085e":=by decide+kernel end section namespace Green24Proof.LocalFull30Pairs def compact_full30_pair_20_base:CompactPair.Quadratic:=⟨0,(0x2713 / 0x3b9aca00),0⟩ def compact_full30_pair_20_hinges:List CompactPair.Hinge:=[] noncomputable def full30_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_20_base compact_full30_pair_20_hinges x y def compact_full30_pair_20_cuts:List ℚ:=[] theorem compact_full30_pair_20_check : CompactPair.expressionCheckPSD compact_full30_pair_20_base compact_full30_pair_20_hinges 0 compact_full30_pair_20_cuts = true := by decide +kernel private def zz415:"s019f"="s019f":=by decide+kernel theorem compact_full30_pair_20_representation (x y:ℝ) : full30_pair_20 x y = CompactPair.expressionEval compact_full30_pair_20_base compact_full30_pair_20_hinges x y:=by rfl theorem full30_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_20 x y:=by rw [compact_full30_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_20_check hy (by simpa using hx) def compact_full30_pair_21_base:CompactPair.Quadratic:=⟨(-1 / 0x2cb41780),(0xfa3 / 0x3b9aca00),0⟩ def compact_full30_pair_21_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x165a0bc00),1, -3⟩,⟨(1 / 0x165a0bc00),3, -1⟩] noncomputable def full30_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_21_base compact_full30_pair_21_hinges x y def compact_full30_pair_21_cuts:List ℚ:=[(1 / 3),3] theorem compact_full30_pair_21_check : CompactPair.expressionCheckPSD compact_full30_pair_21_base compact_full30_pair_21_hinges 0 compact_full30_pair_21_cuts = true := by decide +kernel theorem compact_full30_pair_21_representation (x y:ℝ) : full30_pair_21 x y = CompactPair.expressionEval compact_full30_pair_21_base compact_full30_pair_21_hinges x y:=by rfl private def zz416:"s01a0"="s01a0":=by decide+kernel theorem full30_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_21 x y:=by rw [compact_full30_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_21_check hy (by simpa using hx) def compact_full30_pair_22_base:CompactPair.Quadratic:=⟨0,(0x6d5f / 0x77359400),0⟩ def compact_full30_pair_22_hinges:List CompactPair.Hinge:=[] noncomputable def full30_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_22_base compact_full30_pair_22_hinges x y def compact_full30_pair_22_cuts:List ℚ:=[] theorem compact_full30_pair_22_check : CompactPair.expressionCheckPSD compact_full30_pair_22_base compact_full30_pair_22_hinges 0 compact_full30_pair_22_cuts = true := by decide +kernel theorem compact_full30_pair_22_representation (x y:ℝ) : full30_pair_22 x y = CompactPair.expressionEval compact_full30_pair_22_base compact_full30_pair_22_hinges x y:=by rfl theorem full30_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_22 x y:=by rw [compact_full30_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_22_check hy (by simpa using hx) def compact_full30_pair_23_base:CompactPair.Quadratic:=⟨(-3 / 0xee6b2800),(1 / 0x1e848),0⟩ def compact_full30_pair_23_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def full30_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_23_base compact_full30_pair_23_hinges x y def compact_full30_pair_23_cuts:List ℚ:=[(1 / 3)] private def zz417:"s01a1"="s01a1":=by decide+kernel theorem compact_full30_pair_23_check : CompactPair.expressionCheckPSD compact_full30_pair_23_base compact_full30_pair_23_hinges 0 compact_full30_pair_23_cuts = true := by decide +kernel theorem compact_full30_pair_23_representation (x y:ℝ) : full30_pair_23 x y = CompactPair.expressionEval compact_full30_pair_23_base compact_full30_pair_23_hinges x y:=by rfl theorem full30_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_23 x y:=by rw [compact_full30_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_23_check hy (by simpa using hx) def compact_full30_pair_24_base:CompactPair.Quadratic:=⟨0,(0x4e27 / 0x77359400),0⟩ def compact_full30_pair_24_hinges:List CompactPair.Hinge:=[] noncomputable def full30_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_24_base compact_full30_pair_24_hinges x y def compact_full30_pair_24_cuts:List ℚ:=[] theorem compact_full30_pair_24_check : CompactPair.expressionCheckPSD compact_full30_pair_24_base compact_full30_pair_24_hinges 0 compact_full30_pair_24_cuts = true := by decide +kernel private def zz418:"s01a2"="s01a2":=by decide+kernel theorem compact_full30_pair_24_representation (x y:ℝ) : full30_pair_24 x y = CompactPair.expressionEval compact_full30_pair_24_base compact_full30_pair_24_hinges x y:=by rfl theorem full30_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_24 x y:=by rw [compact_full30_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_24_check hy (by simpa using hx) def compact_full30_pair_25_base:CompactPair.Quadratic:=⟨(-1 / 0xee6b2800),(0xfa3 / 0x3b9aca00),0⟩ def compact_full30_pair_25_hinges:List CompactPair.Hinge:=[⟨(1 / 0xee6b2800),1, -1⟩] noncomputable def full30_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_25_base compact_full30_pair_25_hinges x y def compact_full30_pair_25_cuts:List ℚ:=[1] theorem compact_full30_pair_25_check : CompactPair.expressionCheckPSD compact_full30_pair_25_base compact_full30_pair_25_hinges 0 compact_full30_pair_25_cuts = true := by decide +kernel theorem compact_full30_pair_25_representation (x y:ℝ) : full30_pair_25 x y = CompactPair.expressionEval compact_full30_pair_25_base compact_full30_pair_25_hinges x y:=by rfl private def zz419:"s01a3"="s01a3":=by decide+kernel theorem full30_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_25 x y:=by rw [compact_full30_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_25_check hy (by simpa using hx) def compact_full30_pair_26_base:CompactPair.Quadratic:=⟨0,(0x6d61 / 0x77359400),0⟩ def compact_full30_pair_26_hinges:List CompactPair.Hinge:=[] noncomputable def full30_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_26_base compact_full30_pair_26_hinges x y def compact_full30_pair_26_cuts:List ℚ:=[] theorem compact_full30_pair_26_check : CompactPair.expressionCheckPSD compact_full30_pair_26_base compact_full30_pair_26_hinges 0 compact_full30_pair_26_cuts = true := by decide +kernel theorem compact_full30_pair_26_representation (x y:ℝ) : full30_pair_26 x y = CompactPair.expressionEval compact_full30_pair_26_base compact_full30_pair_26_hinges x y:=by rfl theorem full30_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_26 x y:=by rw [compact_full30_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_26_check hy (by simpa using hx) def compact_full30_pair_27_base:CompactPair.Quadratic:=⟨(1 / 0x47868c00),(0x3e7f / 0x77359400),0⟩ def compact_full30_pair_27_hinges:List CompactPair.Hinge:=[⟨(1 / 0x165a0bc00),1, -3⟩,⟨(-1 / 0xee6b2800),1, -1⟩,⟨(-1 / 0x2cb417800),3, -1⟩] noncomputable def full30_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_27_base compact_full30_pair_27_hinges x y def compact_full30_pair_27_cuts:List ℚ:=[(1 / 3),1,3] private def zz420:"s01a4"="s01a4":=by decide+kernel theorem compact_full30_pair_27_check : CompactPair.expressionCheckPSD compact_full30_pair_27_base compact_full30_pair_27_hinges 0 compact_full30_pair_27_cuts = true := by decide +kernel theorem compact_full30_pair_27_representation (x y:ℝ) : full30_pair_27 x y = CompactPair.expressionEval compact_full30_pair_27_base compact_full30_pair_27_hinges x y:=by rfl theorem full30_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_27 x y:=by rw [compact_full30_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_27_check hy (by simpa using hx) def compact_full30_pair_28_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x1323f / 0x186a0),(-49 / 50)⟩ def compact_full30_pair_28_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full30_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_28_base compact_full30_pair_28_hinges x y def compact_full30_pair_28_cuts:List ℚ:=[(1 / 3),3] theorem compact_full30_pair_28_check : CompactPair.expressionCheckPSD compact_full30_pair_28_base compact_full30_pair_28_hinges 0 compact_full30_pair_28_cuts = true := by decide +kernel private def zz421:"s01a5"="s01a5":=by decide+kernel theorem compact_full30_pair_28_representation (x y:ℝ) : full30_pair_28 x y = CompactPair.expressionEval compact_full30_pair_28_base compact_full30_pair_28_hinges x y:=by rfl theorem full30_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_28 x y:=by rw [compact_full30_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_28_check hy (by simpa using hx) def compact_full30_pair_29_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x2fd9f / 0x3d090),(-49 / 50)⟩ def compact_full30_pair_29_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full30_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_29_base compact_full30_pair_29_hinges x y def compact_full30_pair_29_cuts:List ℚ:=[(1 / 3),3] theorem compact_full30_pair_29_check : CompactPair.expressionCheckPSD compact_full30_pair_29_base compact_full30_pair_29_hinges 0 compact_full30_pair_29_cuts = true := by decide +kernel theorem compact_full30_pair_29_representation (x y:ℝ) : full30_pair_29 x y = CompactPair.expressionEval compact_full30_pair_29_base compact_full30_pair_29_hinges x y:=by rfl private def zz422:"s01a6"="s01a6":=by decide+kernel theorem full30_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_29 x y:=by rw [compact_full30_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_29_check hy (by simpa using hx) def compact_full30_pair_30_base:CompactPair.Quadratic:=⟨0,(7 / 0x7a120),0⟩ def compact_full30_pair_30_hinges:List CompactPair.Hinge:=[] noncomputable def full30_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_30_base compact_full30_pair_30_hinges x y def compact_full30_pair_30_cuts:List ℚ:=[] theorem compact_full30_pair_30_check : CompactPair.expressionCheckPSD compact_full30_pair_30_base compact_full30_pair_30_hinges 0 compact_full30_pair_30_cuts = true := by decide +kernel theorem compact_full30_pair_30_representation (x y:ℝ) : full30_pair_30 x y = CompactPair.expressionEval compact_full30_pair_30_base compact_full30_pair_30_hinges x y:=by rfl theorem full30_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_30 x y:=by rw [compact_full30_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_30_check hy (by simpa using hx) def compact_full30_pair_31_base:CompactPair.Quadratic:=⟨(-1 / 0x2cb417800),(0x3e81 / 0x77359400),0⟩ def compact_full30_pair_31_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),1, -3⟩,⟨(3 / 0xee6b2800),1, -1⟩,⟨(-1 / 0x2cb417800),3, -1⟩] noncomputable def full30_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_31_base compact_full30_pair_31_hinges x y def compact_full30_pair_31_cuts:List ℚ:=[(1 / 3),1,3] private def zz423:"s01a7"="s01a7":=by decide+kernel theorem compact_full30_pair_31_check : CompactPair.expressionCheckPSD compact_full30_pair_31_base compact_full30_pair_31_hinges 0 compact_full30_pair_31_cuts = true := by decide +kernel theorem compact_full30_pair_31_representation (x y:ℝ) : full30_pair_31 x y = CompactPair.expressionEval compact_full30_pair_31_base compact_full30_pair_31_hinges x y:=by rfl theorem full30_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_31 x y:=by rw [compact_full30_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_31_check hy (by simpa using hx) def compact_full30_pair_32_base:CompactPair.Quadratic:=⟨(-0x38b44ccc1 / 0x77359400),(0x21fae293 / 0x7735940),(-49 / 50)⟩ def compact_full30_pair_32_hinges:List CompactPair.Hinge:=[⟨(-0x13c59ed / 0x17d7840),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(0x1286f399b / 0x165a0bc00),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full30_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_32_base compact_full30_pair_32_hinges x y def compact_full30_pair_32_cuts:List ℚ:=[(1 / 3),3] theorem compact_full30_pair_32_check : CompactPair.expressionCheckPSD compact_full30_pair_32_base compact_full30_pair_32_hinges 0 compact_full30_pair_32_cuts = true := by decide +kernel private def zz424:"s01a8"="s01a8":=by decide+kernel theorem compact_full30_pair_32_representation (x y:ℝ) : full30_pair_32 x y = CompactPair.expressionEval compact_full30_pair_32_base compact_full30_pair_32_hinges x y:=by rfl theorem full30_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_32 x y:=by rw [compact_full30_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_32_check hy (by simpa using hx) def compact_full30_pair_33_base:CompactPair.Quadratic:=⟨(-0x305a086e7 / 0xb2d05e00),(0x17a7f97 / 0x2faf080),(-49 / 50)⟩ def compact_full30_pair_33_hinges:List CompactPair.Hinge:=[⟨(-0x52f845c7 / 0xb2d05e00),1, -3⟩,⟨(0x83c43d / 0xbebc200),1, -1⟩,⟨(49 / 0x1f4),1,3⟩,⟨(0x4ad94603 / 0xb2d05e00),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full30_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_33_base compact_full30_pair_33_hinges x y def compact_full30_pair_33_cuts:List ℚ:=[(1 / 3),1,3] theorem compact_full30_pair_33_check : CompactPair.expressionCheckPSD compact_full30_pair_33_base compact_full30_pair_33_hinges 0 compact_full30_pair_33_cuts = true := by decide +kernel theorem compact_full30_pair_33_representation (x y:ℝ) : full30_pair_33 x y = CompactPair.expressionEval compact_full30_pair_33_base compact_full30_pair_33_hinges x y:=by rfl private def zz425:"s01a9"="s01a9":=by decide+kernel theorem full30_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_33 x y:=by rw [compact_full30_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_33_check hy (by simpa using hx) def compact_full30_pair_34_base:CompactPair.Quadratic:=⟨0,(0x9c5 / 0xee6b280),0⟩ def compact_full30_pair_34_hinges:List CompactPair.Hinge:=[] noncomputable def full30_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_34_base compact_full30_pair_34_hinges x y def compact_full30_pair_34_cuts:List ℚ:=[] theorem compact_full30_pair_34_check : CompactPair.expressionCheckPSD compact_full30_pair_34_base compact_full30_pair_34_hinges 0 compact_full30_pair_34_cuts = true := by decide +kernel theorem compact_full30_pair_34_representation (x y:ℝ) : full30_pair_34 x y = CompactPair.expressionEval compact_full30_pair_34_base compact_full30_pair_34_hinges x y:=by rfl theorem full30_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_34 x y:=by rw [compact_full30_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_34_check hy (by simpa using hx) def compact_full30_pair_35_base:CompactPair.Quadratic:=⟨(1 / 0x59682f00),(1 / 0x3d090),0⟩ def compact_full30_pair_35_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0x2cb417800),3, -1⟩] noncomputable def full30_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_35_base compact_full30_pair_35_hinges x y def compact_full30_pair_35_cuts:List ℚ:=[(1 / 3),3] private def zz426:"s01aa"="s01aa":=by decide+kernel theorem compact_full30_pair_35_check : CompactPair.expressionCheckPSD compact_full30_pair_35_base compact_full30_pair_35_hinges 0 compact_full30_pair_35_cuts = true := by decide +kernel theorem compact_full30_pair_35_representation (x y:ℝ) : full30_pair_35 x y = CompactPair.expressionEval compact_full30_pair_35_base compact_full30_pair_35_hinges x y:=by rfl theorem full30_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_35 x y:=by rw [compact_full30_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_35_check hy (by simpa using hx) def compact_full30_pair_36_base:CompactPair.Quadratic:=⟨0,(7 / 0x7a120),0⟩ def compact_full30_pair_36_hinges:List CompactPair.Hinge:=[] noncomputable def full30_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_36_base compact_full30_pair_36_hinges x y def compact_full30_pair_36_cuts:List ℚ:=[] theorem compact_full30_pair_36_check : CompactPair.expressionCheckPSD compact_full30_pair_36_base compact_full30_pair_36_hinges 0 compact_full30_pair_36_cuts = true := by decide +kernel private def zz427:"s01ab"="s01ab":=by decide+kernel theorem compact_full30_pair_36_representation (x y:ℝ) : full30_pair_36 x y = CompactPair.expressionEval compact_full30_pair_36_base compact_full30_pair_36_hinges x y:=by rfl theorem full30_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_36 x y:=by rw [compact_full30_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_36_check hy (by simpa using hx) def compact_full30_pair_37_base:CompactPair.Quadratic:=⟨0,(0x3e81 / 0x77359400),0⟩ def compact_full30_pair_37_hinges:List CompactPair.Hinge:=[] noncomputable def full30_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_37_base compact_full30_pair_37_hinges x y def compact_full30_pair_37_cuts:List ℚ:=[] theorem compact_full30_pair_37_check : CompactPair.expressionCheckPSD compact_full30_pair_37_base compact_full30_pair_37_hinges 0 compact_full30_pair_37_cuts = true := by decide +kernel theorem compact_full30_pair_37_representation (x y:ℝ) : full30_pair_37 x y = CompactPair.expressionEval compact_full30_pair_37_base compact_full30_pair_37_hinges x y:=by rfl private def zz428:"s01ac"="s01ac":=by decide+kernel theorem full30_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_37 x y:=by rw [compact_full30_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_37_check hy (by simpa using hx) def compact_full30_pair_38_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x1323f / 0x186a0),(-49 / 50)⟩ def compact_full30_pair_38_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full30_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_38_base compact_full30_pair_38_hinges x y def compact_full30_pair_38_cuts:List ℚ:=[(1 / 3),3] theorem compact_full30_pair_38_check : CompactPair.expressionCheckPSD compact_full30_pair_38_base compact_full30_pair_38_hinges 0 compact_full30_pair_38_cuts = true := by decide +kernel theorem compact_full30_pair_38_representation (x y:ℝ) : full30_pair_38 x y = CompactPair.expressionEval compact_full30_pair_38_base compact_full30_pair_38_hinges x y:=by rfl theorem full30_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_38 x y:=by rw [compact_full30_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_38_check hy (by simpa using hx) def compact_full30_pair_39_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x2fd9f / 0x3d090),(-49 / 50)⟩ def compact_full30_pair_39_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def full30_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_full30_pair_39_base compact_full30_pair_39_hinges x y def compact_full30_pair_39_cuts:List ℚ:=[(1 / 3),3] private def zz429:"s01ad"="s01ad":=by decide+kernel theorem compact_full30_pair_39_check : CompactPair.expressionCheckPSD compact_full30_pair_39_base compact_full30_pair_39_hinges 0 compact_full30_pair_39_cuts = true := by decide +kernel theorem compact_full30_pair_39_representation (x y:ℝ) : full30_pair_39 x y = CompactPair.expressionEval compact_full30_pair_39_base compact_full30_pair_39_hinges x y:=by rfl theorem full30_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ full30_pair_39 x y:=by rw [compact_full30_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_full30_pair_39_check hy (by simpa using hx) end Green24Proof.LocalFull30Pairs private def zz2143:"s085f"="s085f":=by decide+kernel end section namespace Green24Proof.QuadFull30Case0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l6 l60 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x11a6f6d0c, -0xd5c8eff8, -0x140ad74f3,0xd7d4e54], ![-0xd5c8eff8, -0x39965e0fc,0x317a168,0x12f05dee5], ![-0x140ad74f3,0x317a168, -0x56b280d4c,0xd5c91ed8], ![0xd7d4e54,0x12f05dee5,0xd5c91ed8, -0x6ae483b4]] noncomputable def hinges:Hinges:=[(-0xef7f8,l6),(0x175314c,l4),(-0x6d6dcc,l10),(0xd641ed08,l14),(-0x527a076,l17),(0x14d3e3310,l15),(-0x6ae483b4,l27),(0x6ae483b4,l29),(-0xd641ed08,l25),(0x65f9560e,l30),(0x6ae483b4,l33),(0x6d6dcc,l38),(-0x6ae483b4,l35),(0x6ae483b4,l37),(-0x175314c,l34),(-0x65f9560e,l43),(-0x14d3e3310,l41),(0x6ae483b4,l51),(0xef7f8,l60),(0x527a076,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6ae483b4,l27),(0x6ae483b4,l29),(0x6ae483b4,l33),(-0x6ae483b4,l35),(0x6ae483b4,l37),(0x6ae483b4,l51),(0xd641ed08,l14),(-0xd641ed08,l25),(0x65f9560e,l30),(-0x65f9560e,l43),(0x14d3e3310,l15),(-0x14d3e3310,l41),(-0x527a076,l17),(0x527a076,l62),(-0x6d6dcc,l10),(0x6d6dcc,l38),(0x175314c,l4),(-0x175314c,l34),(-0xef7f8,l6),(0xef7f8,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x17148a80a80100000000a8b0330040000000001819002000000000502480200000006c0026402000000000d80720080000000074029004000000000d034802000000098281a6010000000320013201000000000640390040000000036014802000000000f00a40100000002e00132010000000005c039004000000003201480200000002c00264020000000005807200818c118158079200a0000022084068c03000000098301c60100000000483033004000000341a0718040000000009038802000000048300c6010000000006805200800f81e04203c2008003c0841a0271004000000000480c401000000220a00c300c0000003a0a051804000002a0c4068c03000000000c81c40100000006c180e300800000000540290040000001505028c02000000000881c401002e07818c07a4010000000421e0398040000002215038c02000000001100a40100000003c28063008000000001a031004000000e05002cc03000000068480e6010000000281405300800000000028190020000000001c0c8010000005418026601800000028140b30080000000012049004000000098004c804000000001300e401000000461500a300c0000002612031805420a404200335006002905409007a802001582405809d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x481a40100000000044062008000000000a0690040000000026014802000000000681240100000000014062008000000221e0298040000138110058c040001284c12016801800000001e009200c00003502200a18080000019024030c030000d0082004c602800000681100e300c000000322c0298040000000002c0c801000000d05a026601800000064580b3008000000002a049004000002e0c4028c03000000000c80c4010000000c42c073008000000423c0718040000000223c0cc0100000016868146010000000a8540e3008000000004207100400631103401e90040000000c8300c6010000000a4340a300800000003c68198020000003a25038c020002e14c540348018000000ac580e30080000000052071004000000000240c801], #[]⟩ def dynamicCode : Nat := ((((((((((0xd20356820510d09131200b2fc35046103201003405e147e33014c082844ec9a0fd9f1d308004cefdc48083601082452383af48020000ea601a08293e89282020a4ec4b01a020b3bd768200866b4f0dd18008805102152cc3210c082b04b7964404010000124f8010100e7ee73791c002971d0b20040004d55412b0000764ebce20c8700280200000c910002e4364800717c4804080028406641840024823da3010199d137e16000fd0fb2c0500191aca156001bcf900fb2000001388151c209405000034840015f4d10c2a9512c7080cb4080981a81480226327c080333cb565041900859314215a308315541960d298834100367bf12000c80438e00c16e840e2c2da0815f2cbea73b4798e28000046502ca0000109ecc20062f42d02c290576cacc508234f121e0823c19c9a13480110060000700800148100c09005828000ec4d8c4d7be18c152a34444003a59b70004f41c88204828340100000c3342822ae579204009aef122820c99bd8490373fe8c70c03c0b203d1405b9607de1807531a4584467181f0080000ad100c0580580e06000013f26cf21c3967dd2f0b6ef0b0c06f301e6a24bd289a79f37d67e0142001ff8a930faf7d17893ffce5bac20ad01874c97e89a961896867d894c080017b21bda40f3eeace0bd41705fc000a2725b2719b85bc62464f1e820399bb20bc7c9effe5d5c28a3709e20bdd5af51060817e8c0d280fbfc7c6c3005508e7484025fda59580328a0f804000040080e82e060000058a4914020fc0f00822e2b13a68904614a7ecf04192) <<< 16000) + 0x87a7058b0000002ee0002614220084939fd4a4505004e5c509a200df30524e024628400100000af20c62a00021e20c42a0006c63c50e18f52e1428633ca3d08006f6affb408c4080021c60882f569285556629f61c53c949d1a1423f87b2ba281935fb5052400781f212180bf8deccc140202482c700a040800200003104184460c00ba15d34378a8e2858c5bed142b7293296202697d9604202c80d3130004a303e010a181ac65b54a1503cf7eb47151d90b658509238babc4900c0d965f06027e7c212850091d0d718002718200080000b0900028020202a05f0100029f105e09f09782ed7ca96bc9ff4d08dbdf2114214f51c14faea7024c25927c17c409ba4856c856d9e35f80ae35b060811b3b306cf97d62855ac27be5b000005ecd71696316aa25a4dfd59a0f748e3a11872b615f28e81455885d0dd29c40312ad4ed106f466999bfbdf5d96121678df4d657235491291980af04d362183308e0000f74e08344c655ac23023d1abf8fe3101210e7c0ef30608962232d12060072e724b8a02816f6253b1c2100384ce45c1c20281ac5023924852507455fe10de9cd0a409000040c4174940b81305b0502d00a06c9c78f3945c3846523a3ca58860acd2c01efbc0a10ce9eb0e2be20010db40c4fac380f267165b1145003525a93c1580a96afc73896a40b49807adcd5549ca0ac0b13057ac4cd276a3ab179baed2adaf7581220ea058645403c134b28a2c82872832c12c0180030180200dd2800eda65f28a18b030750b22614a8d102c78bf942dc4a1c4b27cebf1c0013fd15b00983088020000276687bf07af20907858c00001c9c3800a1af696494a2f2123041ddd8762800821c7e16039ef82000366e6183afc2005f131942e308000dcf15be1012019c410205e07800020e33057ac4cd276a3ab179baed2adaf7581220ea058645403c12c92462852452011c00c00800170280200d00014d33057ac4cd276a3ab179baed2adaf7581220ea058645403c12442041c41431c1280040016cbb70f795e21f688c4e0d53f882fb3bf0a00aeab343810ea189dd00da61a3955f0d2d557189e1fa80012f10230581100e60af5899a4ed47562f375da55b5eeb02441d40b0c8a8078248e388386306182082200029792d066d015f2c30eb36c460a3724040ee4d09bb922d87b4000780800567181835f539505094fd2ca9430200001770141e3e5025b8c044d7f9d9450050f004d88a9772ef57a25ecdc1940b62c210040000c290592d82c14c15c760ac3302315c081d6d31b5fbbaa2a444851e01443b8240d0c601def0665d1201001c4c274c419878c563f08ac8702d3f1695bbfa0302b38276862804023470b8053aaf513cd5d708001ebaebad60d654a68509f1000292acfd78c5fe9827438001da1569d7be5a6753bdd489fcbe4056ddc27d1e28fbe3150c9b6bf44600476ac1e88c78ba1e880200802280002d599708008406a98c0037c35629c4608420100000aa3008010040000111806008020000088e102f7c3a69008c77ebaa0c1011279bc5016493cf807019791d9504032fa9c170198407c0200002544154460a81b0400902982c148060a203e3a058091d18101ecf7b692085b1c2be840c41f2311a0120a100042483078702630708b63e5d206010b3fee1830882fad5302088df7d51813914e861200a9d1d40d006714200080000af90501582788c0c81606203b003949ce86072736ab0088406c021210bb987c40b05d2560441832010c1427a9b4b03746edd24103000881237a8e9802395548805c7aa511820c00401381400014640004a88000db101009e822f4c8a90902396cb590c0032604bc1006c5c7ffe08088a3943d0094507c02003a02000117209a3304c05f810aad1b1005c71b160483068011000010045833190b18580b8b75331000e00400001c4e1003366ff9807d15afa8200029d1ff2c6083e0100000a32096120001813004c0d515c021101d008000029101009d9402dfcc2d082aa4f002c0e080da4cee0504cfb6bb029204108042c53570a1a040452f1a8e870900400630e0823b45f714191c33b9c40023c64da826081f008000093904a0d00d848074140004b44124440901a00052f20012064002f1881184c088073057ac4cd276a3ab179baed2adaf7581220ea058645403c2cceb36a0206ac9c9724e59590256bc3f8f7624f72204fc5200000000000000000108ebfd13a28e6e46f18d5001e9ee220ab5453147111055aa298a343431c31821c00c0000024aef2fd608d364cd63129dafb854c22c7210fccba6da160c81884a60a76a6db40fcdec04e4df3c28b257b9e6c3ed792afb459aba7f15bebb97dae186ad38417cac4f377a68f54493dbbde7094ec9c8de6a1900a729611c9c4bb37d5a3a3f9922c8ae44304d970cf8d0f967324c587b3873300536fb6c11200f5c822890c3ab0d33cf82273c3e4a6d1cc603ed7300f964535943ee43e72123c874985b9cfdb25fe2e27a7571a86aa1dfd3c1c15e7f60b141433ab0e1f0eb128d40e8d0d0c5fd61b3057ac4cd276a3ab179baed2adaf7581220ea058645403c604883a81619150ac5e6ebb4ab6bdd4c15eb13349da8e0000000000000000f111055aa298a36220ab545314706f18d5001e9ecebfd13a28e6e43431041c32401801401001005096651664bbf6862a0c0c24d8539051cc9f341717996979e60b836a59d20168f5596423bf6f4d6dfc0797971987641562795a4217784e59d472cc399e9e3d8b11fbd21878743c0329995b169aa2d78f4cce83ec7824bfc48e048009272)) <<< 16000) + 0x9e21184100042c700c25ebd1c7b09ca54220203fa81523c10034201749020800200001aa407c2608e1304609e1b2396e383c12d23ceecc00a0c00520023141e0080228080002f48220cc0e417638391566248c04a7882120803899d40836008828248103c010d06551d2c32401268a23c22081e00800003c90430d021048104240800a03f0501f00800077cf10a130229d854f9b18c2d35584c77bcf9130818d3f4841194e06558b714ef4385c8ca13c833b1f14e0e808214ec3d88cff1647d7ba28b4da270e7b117edb45569f24a4680741372b4985cd56f65447ec951a9cbb87bf28b80f8ea819af1d843b10b2355838d209d98dfb62da744cbd3d10ca445e11535dd536ed990343f5b743fe47bdbfb4cda1808fe84335b741123d0e054fbd0fdbba6d9f1ba0a7ac1c1b422b4bf4154acd0f95d7f0a588d729555634399c1129058fbb64c302cd68839010623fa995b3ec3d8c39e20002152b2dfeedffe31f7ae4018124fee75c7e377904d44ce6b722ae3d6f20a1e7590d660d14e06d64fd6efc74047be6e864486829a6600b89769bf4645fa79cd41a976d62b62fe4eacddc1d7d2d4ef53842dce0ec827cd380453dd3410cc52c0c0a002fd7e782847803c8276928258fb3c886fbdbb5cb9f1895113303ff8296ac654a4ca845f4000151c4003df0800a7b1d7d4e544bc177b94d480a6939a9dc57a011302441d40b0c8a8562f375da55b5eea60af5899a4ed4700000000000000007843041042822800800008413f2a7a8da37b1b0549a93507695097d02675476b3a39df7f80b43fc575f38f5445fe0d6ca97816bf7336e95f470c81e71c278462f1061ee0174d918021b0d6afbc4d5de26fe8a9b759fa0aea8072ec47f4532d91dda59e0fc2735c0a6571d7c3022f4ae5fb0832d12a69b05d500054420046c8400cab8ea945a4df22c0b2ec5a02d963ab779b052cb09aa58a6400000000000000000f981220ea05864542b179baed2adaf753057ac4cd276a380000000000000003c32d71bca245eff251484637a998591fd3f546cf0fa80000000000000000e8c40c600500101011431fdc843340b8a6a08d5421e5a396a89fc32376bf64fb9a750be1f81ece51692ae08e4e4f89dffe5e5d3a4cdb560241fc4db7aaa2120d74bd145e1eae57e58807b4d6dc7e6d6ad69d151a97313adc558b0940a1b7c5b54b48176fcea4be165370585c691087ca270371c5246bec3a42d91478909e1004bd4acb8a418fbf6e92d0311057940a000eb4400f9148026b39c80798acc72d35b65aad9c39c5de0724eb3c165b00a794d2a0646702e100f144b91097b01ff0eddbecdc58b71c88382733bb1f5440716bac298333143f41c214208110008000c44ce3bf7cf4c8c3a113094a069224551c0297a057fa3bf231dd6aa1c79829ceed1bcfd8c96de7c782ff93f32837f7c962ccd8d01d945d73428e761a7706ac179a6430b3d58cda040bf0aa6841003356c1ac0048283e01090c401635c030a15e751642041d90dba9423102000801302800030881e86800072081e8cc0f007830296100f1010acf19680417b9fbfca1c0a18d9cf11403cb268930c01d94a075005261c20008404004011a6c6b86b002401448087c1f0bc01a400000328d881028010df7f0b40a282914410c028a09133e2e31fa840807c800c64802080912db25a28002827b84a9404904801601800ec0607403e3bb328e28362165000003d09001860e19483a92c304693d8cf643c208166476380e06080c14a50e6808104a493c0b120830ae2c3eaa289000305548bae7d09002b02c01c80f0b00000f4240071ceb098c89661c35f0d9c11dd030c3a5e2da0a62820121ea105747086963878968082b9ec054bfb09000182aa45d70003ff21dbfd23e8480150163cb00000b14830b0083fbf4028700c5e85a01c7bb30ea18b1c3191943d580c31b2f49b3d1c214bff1720080300e2119c00020d9e9da8c4801200a00007508001ff90006483a6bb26a5ba0d1c00002c5240a0128df75145ab977c9e04080317e7b810474e0194068102feb82204005a814b280005c370b029002100801d80c0e807862d20939da0c21ca51ab35c7080000138801041906bfb2c0c100f76bce502084171e461080001eef34fe10005f15e85a000e4c4a7197524009405007203e2f4bd565e1420300000c35001862f86035fc8408073f85eb48412ed580b4581c11513ca63401025080408604800026ab023d800178fba77c4c89002702079600000ec61c78466de461428128df7507149ed60a8c4060317b8d80c3185cccd50e0023f8d0e020080a9a98e0002ba13926a4008402000036c4000f088002e710007c9200212840e05787b2e1daf0a0815b350e20209824969600606c61e28015ac6ea0001b7a391e816101e00461952f01b9a1046148f0e8121014c5c3b480802101c222020317fb53300514cdcfe92004aeae30080000001d8c000718257e6a4008402006e030360181a80f0c603e3f740e2000005dc0208002ef6c10c100609c37a184018be7808e08062ff6a620205edb1d5020dd4437a21400110043460053a536186a7f95ec838108b0d143200007781ef9000800200001a240d007230037487c6d1869ab25a0fc038801ba8d216830412a112d4b10000635df1c53214109c081c400000b1492300c5ee360c340891d610e2018bf3dc160085c4c6392821000400003fc80012110004ee2000dfc40cc140010a040065448118cf0604539d2248206964d2230002e5acb028101c8e7a408008305f8480128c100043886762f9)) <<< 16000) + 0x102a3e87814037065890098a0c802306000058a4b085d1372c301cb804c2c9046d388f52c001782e900000fa0a5041e00860dd60b982461f90ed92097fddb86017c1430c808320100000b720640b03101e8e01c5f12020400495f861840340c786283728bf0f6600333a26fc00009c4152821000834704887a98a1c04f955714189aae0307000e40d5864041e008000065903005f9212b7ee414184ac405c38398764d49c07258b788600000ea6051400780518101ef4389064d57801001973e58c00640200001207c90003698c1c1c427b35a0a0c000d79de70218569cf93800310e47918000000bb826002100879345bf1f18084241de10005dc8b46003401000009320003ba747b07e791438c6d5e47021c4d9e46083201001d05000053900045b2000d2440022f08004b7902f09017028002af08012c7102d1d80180a88067c2426284749a75283020124295a2832a401d363801fd4ad50280072132f64c0840010a200d187453794c3dcf1cfbd77ae899d09cf903638402ea473e7f36d1855366022cd8b85c62e3ac40a130348747c5b6acba27f85840ca2477bc1c2664283c8c0dd3daf922ea6247d3ca5be1aa6dcf373c820049f088ad49cd481eaddd911dec23fa4eb1066003908e0d5e7bb4f3ccf10e9f124d4265df6a5921d7fddfbe967ff603e0363f7b404a092c3c000045820580b02b0580d82c05c06054039104f8d59b1c4cb79eba850cf8581cc1036c1766e4908501d2a81c2dd88e3a4900d6d65c9009c407802142807f518f205a1dcc340208d9e80dd840c2aeba8d040030c4ef15250c1f00860e00159270a1e633a3958e3001f31b51821c3f4f5428236cd619d94107c02143821c020b8718ad8c5a6450a692a0b6b1828fe3333c8a0da0412f00900020a32503000194df172704210080000af191a20f59b29222829d26610454316cf848245da0a2820013fdc7a2ca103e0100000fc2000714400128ce0f3101c360c2b8198890807bba95e6181b0a0863c901137636914003e5b8700098507802000024c603033452d21833d54dade1020167fdef08202d5f03a24108ddd9770c1907df1266604200084060f07a69c3066e839bfe284104e7b861842e01941e202061b526c18318500bbc280055921c24e084001000015720521202805013828098140005e2400296881288c090440460302201e1052b8923c80a3c96d900a111f614341c151a78ad43801be2fb8c25081f00861007960788c1400018769410e14da0b202b7c4193828403c13b9525081f00800007e102109c023545c18269ce30cf66ff6b60594a251007ebbffb55f269f4a919a63c5b75e1c1556d1ddf0540e91d1058c251929bc62a8472b9a72bb60d830a9368c3c6199880e8690a2bb8c2b4421936784c2d6766bfde0ca85ee5292c176cf4166cae4b68800567583a7adcf224c9dd4df2818f38f5c00d0df5980de4e6c99adf2b52abe20807a891f431988d073af6d2e070091ca34e103aa7cdf36537a93944d2ffecca001d09da1f8776099feb47f1a64d2b2277ca3302de3598ccb02b3afcc3162411748ad7ee1a2acb758d4d8ad07a1661104b1cf4eb89e139d2103a4a19ea6c00170100038610201180f86c0783603a0b802819517421081c008700151902047023e67bc031020f80438804ccacc503835562850050bfa571800e00420000200800002220001aa40005a480e04ec1190fa7904076b65d5c1c01c12b69c023101e008000053901b0d80d04f8313cfd9c701c135af522081b00840d1aceb05042fda5c8013050b8402d521024001800800c80e060a788b240d553f464083000800006a20002946031b74a4881dfec63c08830640200000e270813e21d9800b638c30c0dbe9390011880d804000027080c0a805c1400068a404434000c8e70a1105f5aa388116c7cba50660f0e04c28602167fdc384111befaa2827229d0c218153a3a81a00ce2840010821f4d461f1c2031bc9905021354bd242062202732a014141f00400006a90161900a8a8050240260a0002a23018deecda78c188b75404861d532696c120854812858e02ae2d0790a01bd0045404014d7274000ce204001080600802201002008c3417499f10a000dbb630080014ed89591821000420080200800002220001c640004808000ae9012150088880403601e1200e05006808000d4c800b18100271a3e7192697f7596ec62a6a03e080e7362abfcaea52c64e200000000000000000000000000000000000000000000005b11431821811411010c0080046024d368a8c028b23ed3c15e349ef9e1423cca487e0db52705a2e5949cb60baea350996f3096a614cdc4d3008ad65444ec3735c6364b9b8495c15744460a886176f114206beb2e201051ffbe52814059c94fa744001afa9ca80c008f09a698119c508802118ef1cb8449d2d193789d8ff53b0fb86009f05fceb7317a80000000000000000000000000000000000000000000000006011c71c51c30820c120018014004c0800803649c3721cf18247083bc79b2285074bff08424532f3fe0c51400015ff5d504005f6613fa9800900214381716129891d97c2f44c50a07b7c9ae240d1e8f7ed900000005dc2a004200800010120180b00b05c93ae347729650e00204afa450a048c6a76e48a492a6ab36280004d52d1815082400450e05b42015923b2fbcd5e450a07c92e3e92068f10d2204000000177004a104401000010b20004744001370800387100089520143a0091900406801c2400c0a0050100200800333c8018880084400202000010030349)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case0" = "QuadFull30Case0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case0 private def zz2144:"s0860"="s0860":=by decide+kernel end section namespace Green24Proof.QuadFull30Case1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x116742afb, -0xd5c8eff8, -0x140ad74f6,0xdf3098c], ![-0xd5c8eff8, -0x391657403,0x59edb2,0x13029db27], ![-0x140ad74f6,0x59edb2, -0x56b280d4c,0xd5c91ed8], ![0xdf3098c,0x13029db27,0xd5c91ed8, -0x6ae483b4]] noncomputable def hinges:Hinges:=[(-0xef7f8,l6),(0x175314c,l4),(-0x6d6dcc,l10),(0xd9463334,l14),(-0x3d238b0,l17),(0x1418dac2c,l15),(-0x6ae483b4,l27),(0x6ae483b4,l29),(-0xd9463334,l25),(0x68eac4ab,l30),(0x6ae483b4,l33),(0x6d6dcc,l38),(-0x6ae483b4,l35),(0x6ae483b4,l37),(-0x175314c,l34),(-0x68eac4ab,l43),(-0x1418dac2c,l41),(-0xe799f8,l46),(0x6ae483b4,l51),(0xef7f8,l60),(0x3d238b0,l62),(0xe799f8,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6ae483b4,l27),(0x6ae483b4,l29),(0x6ae483b4,l33),(-0x6ae483b4,l35),(0x6ae483b4,l37),(0x6ae483b4,l51),(0xd9463334,l14),(-0xd9463334,l25),(0x68eac4ab,l30),(-0x68eac4ab,l43),(0x1418dac2c,l15),(-0x1418dac2c,l41),(-0x3d238b0,l17),(0x3d238b0,l62),(-0xe799f8,l46),(0xe799f8,l64),(-0x6d6dcc,l10),(0x6d6dcc,l38),(0x175314c,l4),(-0x175314c,l34),(-0xef7f8,l6),(0xef7f8,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x12446028601800000068340e300800000000120710040000000906018c0200014868120448018000000006805200800f81e04203c2008003c0841a0271004000000000480c401000000220a00c300c0000003a0a051804000002a0c4068c03000000000c81c40100000006c180e30080000318240491808000000002a0148020000000a828146010000000541c0a3008000000002207100400b81e06301e90040000000c8300e60100000009c4807300800000000018190020004b21028075003000000000880e401000000088540e3008000722a04811200600000000220148020000000a8300e6010000000002c0520080000002216039804000000000d01c8020000000a8481460100000003c28063008000000001a03100400560ec2201590040000007028016601800000034240730080000318420549808000000000901c802000000001900a40100000000485033004000000140a029804000000000140c8010000000000e064008010c28044053401000000150600998060000000a0502cc02000000000481240100000002600132010000000004c03900400001f150d0290020000008c2a01460180000004c24063008009a118240192009420a404200335006002905409007a802001582405809d401000b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0x780a4010000000a8540e30080000542a0c072004000000002103880200318881a00f48020000000d418073008000000320c031804000000290d028c020000169503814801000000078640e300800000003c68198020000003a25038c02000000001d00a40100000007418073008000b8531500d20060000002b16038c02000000001481c40100000000009032004000b85315015200600002e291501500200000001516066008018c410440ba401000000002438198020000000009034802000000048281a6010000000001409200800006405001c980800003082200e4c040000001b0701e6010000006613024300c00000290481218060000002a1701cc020000000540026402000000280b01c300c00000190980e18060000000013014802000000000a80e401000005d04c04c30100000002a0e039804000000000d03480200000e6208152602000000054340a3008000000361a069804000008c110130c04000000130980e601000000000780520080000002e1a0698040000002205014c0200000c6188152602000000088340f30080000001900099008000000003201c802000000001b00a401000000000b80520080000001100099008000000058004c804000000000b00e40103182302b00f2401400000441080d18060000001306038c020002208c14054801800000004830330040000005226039804000000291701cc02,0x320e03cc0200000880981b86020000006211016300c000002c04806180600811c45303710040000000e868146010000000004406200800e23088606e200800000001a1c0cc01000000048380a601000000000140d2008000000004c029004000000000d024802000000000280c4010000000443c05300800002702200b1808000250982402d003000000003c0124018001047431024400c1e41141680c6200a00001a8110050c04000000c81201860180006804100263014000003408807180600000001e140cc010000086110178602000000064580530080000000005819002006116013014d004000000d05a026601800000064580b3008000000002a0490040000002109028c0200318640c8058802000000b83100a300c000000003203100400001b110903900200000005c0026402000000000b807200800094330500ea0060000002d0601cc020000000d8900e601002106107805640100000002614071804000010c220248c04000000108f01c6010000000088f0330040000005a1a0518040000002d0f028c02], #[]⟩ def dynamicCode : Nat := (((((((((((((0x898119d2e6106084927043441166056d92c458005e8952800c00422600335b9841ade329815d19e31000051ffc800300100000b2302c00587258e30b27c2830018fc960ae1ea74d00409cfe381ef73909800640200960200011521600bf34297aa8049d664041026742007acc8a40015008413450d02d53900070020000144c0e017f7038ed34b333c055c9441400007d00c001617a2a08300080000d73c600c4c43813b71066037b056a300170087180037e4640cb0e180194e475b587033b026263f3590084246e55ca72880000b2d05e001e00a6c7b8c8ef9e8480c005c0a000018f20960a00024920008ce7ca23e7cd28602cfda2c127f1a6300b1b1a1280c905bf650418008699861a1981305e571000b00434dae7a0a31c69800006804ce280086e48b1a201de0c4d60c30091cb750684cd2b843bc4080841d7fa8411de2ff7610c000001a5e13200460200001ca2000494422c241140a0003663000010047041e022e95f5f5359d95932bd6711238b430298049c985a794a6729931d1529c8dde18a09652feeb870293920167c6ceef2d7e4e0f003d8f34b33aa1b462a42c1d58b5a94aa8681e99a8f462d2d63bca8c85f1c9b54aa8486c5cffa19b291e9236bbfc5206500811b00001a61c12cf6d90d04003b10b064f97fce0323dc7800523290106002000019642bc2404e0a014050002571c24a6e7b752490cc8a1d8920000dd7c3070003a980a1804c21a02821888b420c020910fe9010a38c0f00a0000558c0907d9f086000056a044083401005e0580a02e85001030122db86e9cb0c06f2c4182476bbd24041900802882f890e5fee4e2e368b27fdeb9c619af8500391e64e74adbc364291787c9b9f1ac21557994b0e623a287c4cd0c7b2abfb1a58e97184843f4a31e7a6abf5e694c5fe2de2f1a9a6c7802807b287ea2721d731ec883f6bc948b8b61774d95c410ca2bcd896e93d8b174c567a588d5e193a62a6dad6de6e9649388e321009fe8f4975e3ffb603afaa1b6229e8e894b7af69fad567d457e607506eba6edf0d474697745782120d84ebd81c3b3f91546ab184891f200016208003379e1b039c484835410589806648ace4000365ad084820340100000c021522a0ae110004141abd615b91048b9868c2837d31f01d40241518ae780405b3096d07345054c718a1471470c90060040a65e0a315291091d43bcba61039e347969c7e0ea679f3f750dc3a4a5d83103e0cf400092880702c03407c3831bc5781059693e9716080137e9a282014ebde0a00117cf9a10000c13dbcc003c010800008020000088e540073c4fa0580000000055eb0adc8824448c30c38a2020827806005c100401a000204416c0615a038000080232a0039e27d02c000000002af5856e441222c82082470c32c1440380b80008034000400c0000401195001cf13e81600000000157ac2b7220911641041238a2061a201c05c000401a00020040004f4f18000162618601212b3c69201e01b60c352937a5038a0001770020ecb1a6402800d0670e84e103c01000014b20dc1a00041034554df2f008710003c2fb82082e0fc73c143002d7dac16000e59453ca00429cbe5c38000000ec4002714210080000b318000080238abf1399e1c183a3943e607a9a46741e00a9d07c448005fe7704a003c0100000f2365949a093a3084e514531612e81c4ec2014b51a3014041e0040000651a1c34ddf70503ba9a268100807f950e680042a0fc9400f239b54380040eab304c103c01000012021581a02709055828000e38e0ac3f13c894045ce311f8802b920160000318e1000400002c481802e8800001626104482ab6b18b1c00002ee048a003bf3cc0820a74c58e0409bae39a841068ae2e23c0004e384201081840babea94024977f54100e47e8c9200246383e0100000b020d03a00024a21543a000f513a424f74df92888c48b2c840b4691cb9050fcd7d3cf820885d219e0c070b2fce93000f804348012c85c840bede3bbe050c091ace80a112282c7f1c1001f21552800f80400003e0e0e01883474713dd23b5308100d6473b3010069cbec20246b781425001f00800980800043481002ec600c97af2307eceef52c3040524b610c00c3ea53724041f0080548282a0040001f240502614e0ba15567f0c747153b305b9c508fe3919bca0638291dd86031539ed5c5006352fdf80026182000800009a90a61985282e8595ba384c2855b01ba0c40555a0841040618d7683000090807c02142eb1b5b8610287c9d96b8e1809810a28a1113f73ce8c0615d7a3f0a027d72dd900024c40400100001392000462404c74148020008a121) <<< 16000) + 0x4613e18124917a914eb3cc8ace384b1539cb9b0d271c7c2b8a10adbefd567fbb4be4854204cd6021db05827b8a6ea0408cd6fcb73bc8bde3f8e800000214b16390e1b728a0106186623d919921425f04419d75e5af642c11a4b149a213c4a828148d5b39192379f1250614e1382f00006c67042543e0199d18128093da7f6880973343b0a38304639c3f7eb83004d449a8afc140f4ae5c9e14080255aa358a5101440ac23f838842c477e628c487f0e785204800020a21445a0a10985002827c050342f147b2ed61c2220daefd87c304f0e25abfde8508415457e6ad10005acf0c43aa1c0515de24ebb2280108ff5cdd54054a6822eb029480f6cf53a856b8c72c2b028696b4fb91079452b9a21fc051208da04359638b0a2041050e05190d2696063ecd125e300000007d0013861100434a00e731d00a28a027225e2c8967488e44b1e2dcffd4f28713ece789c700055a95120c000048be5809c30880200002d242780743cb0e48de658c04a66ff4143512790b262040716298b98001299621048009a0acad88001cce5bc2024e284401000016d364b139f6786c91a4ddb53cf048b0fc7d2cf9144045bfa4ec10095e283f9583045d321464c500782368f601c00d13e046406009bd68b09804292304a0280001e932200106f83651eba5bf55e40948df02dfbdaeb29ef4d0e2089a563cf000417d925650604c3395a3d20abff38f0a1843d33b5ace551fdf81a3820a00d651fc0b6b7e76e140105a70533cf92ee8d8600231f0de1cc877a97dbf545d1df76c988071c4e0b400018f10370581b00e472522cd7b4309cdd1c455adf871e6639d220300000c6fbb83cc01c3d0bd3752731cf0d1830766df094ee20f00410e57c1c154aeb0c010051764d752517220b4949f4896006f2087d6d946283c07000013b9000c83213a3b81821b4b2ec0a11ede56f8c8c08000046500a0d64a0c33c8c034bab8f7c0a00651e5f1422aa4c99e84cd0db03341640b98d0900300003464270d61366309a1d84c8cc0dc5702079c6afa2dd892edb20a219ef2e4ec9d2f0b9241001db71da2e76495be3f0e055c11a6f262bff0d978a00f7f3ccd6202701a978400255abf232d7c64f5b0802a92214e1a3c905013d342b6d96c42c751cecd55016e4870d3a228bf30d5f33ec45bacc8890140f30475526957325a241187cb9806fac909002c6e92800a8043cc058ee9a543a30c920005d241000386145061cc12083fe16600150080000739e2428f883092d5c6c80807efb2800db0b04024289a940058020094020000e03a508ec9d8d200073604110104c01c10002061200222de425081900800006f109801c0200401012e12018090000261b2cd9d88a22c305906773cdafdd32070d55c546c9290205b7fd4b06e080c0bc7e66a244581276b9d4cba4280d7c6a16166a0e006d174f3f90c059c410285a078000200212c2b09511837068250261260b0920184880eca484c3046712ed2824bc81528339fc1420ae13ab52035fcdd57820440e6a020e02e514c7013820f8043c57e9bea84608cc5b9e7c9107492ed38a24eee173d2000dfb69272800f8043c5003639c060800fbc37c513d2978300a11480c4cc90007c02000019a400078081002c24007e533dafbf82464b15684c488ba05ae3c708a96517b0a0987af9593c0a285ef9e13040f80428a524481b478a0077f3a491000794580a25d6be1b53020071eed0502a9f863c85047c0907313820f8040084140002ca649348aa04c708006d265080c0069a84881e7c63e2c2800008067418066fb186a6001f00804780808004044020001622000848405037240a5e2a9e98389af16068c18338549f120847b41318c09e8bcf379800338959890064105735802ce3040010000161211c3308d1584604c22c16114038162f87738286f329e0e58342343f680107d2c9c12040e0042c70d34cc468789a41c4304395220a4004774ff340343273f2800d8042c7000bb41210003ddd343f1dad4830612b087a000d00200002e0d900b74d34d0fc0aef098092170fb2811fcaba490021264565001b008590017296e90604daf5e68715e0ac46020956e072000e00400003048000e010003923e501652a810203190ba503611d9b490426f4d616003a9f3894006c020026020290104480800048c81386e020ca5f82102aa2af9f2c120a045240098e601b24041c00850c0152c2302cec23ca20059793a3001900850c00ccf54420189b598164e79da30019008000048100013b204e0b02905e053798442040010110120870100003410002c620261b08605d8a00099b482c20062ecec0a099fc2e890206f8a8d80a08000753c93094208402163002f981e2c5869e77b06822edcb5b0a073058f688e00ac0c7c4094207c0200001f841f83405a1a085050420280c00400050c420c861040ba1e91b4a785007325a7312006117dce0246283c010800008022062b2e70e46830545a1ccc001c768e3c6003e0100000a230000100440c04749284708002d8876703443e8dd4600009a96eb2001000400003448000871d1e5597f5ca00d5d543824103800800007421021a080050001609802832b97202308c0e804000015880988f0b00004a400c3dd67c1c42c2bb0248711822e557668080000349be9400800200280307f01e0df09b918921841bf43c305fe6bbf512031f6518812040f0040000334d8b1a82f1a480946479718a0be7888bc2002d99dcba048183e0100000d320fc2202d0d03e8480c0140006a241f0640f62a0007a020026ae400748081b84c0d807b)) <<< 16000) + 0xe613189814ed939a9014d27353b8af4022472a540567454e9b8376c0556702ab3f2880b4634c5efeddfa4ce913c1912a5aa4c8be177d168872cd91a0000000000000000100b98a0c2871d31e81d3f3c1552c81821c00c0000110c23daa6558759cc3ca8d5b8dd06d3f5b81041ffdc0e6f038e3dda62b9e87ef137cff1f4b49661a7713f852372a8725ae1e545fd86d7115e08f09ac1f3c9d0ace8b778c1f6541e09df0dfa90744393f486c80468e992ef3a4ba3ba0e8778a402b1bdf44d83734296a711d9c3034af98acfbabd36d2c3fd61894d67fa9e7503fff6ff675f22592518048dd2c114e969474274aed96f57696af0f730a268c900a60d3b38f5067975cfdbbc658478368c32703fcc7f9227f40bf05ed791bf8800fdea12c46c15d23a040d4ae66775bbe89dd47d6f4651da12532b1164cb27fa5d13ba55514f9a996653197435553677c69ffb15c68000442d3060734f9f0599e132f9c0d4a834a4d6c583753333f505c696715c190b1ddb1ad7d5e953809f23eab2f2e0a77150036e1b471dbd41bcc51bc6199a3921183a6ecdd539be0c0a1a5cb7cebfab4a6bf8fbf02e049f358666cdebb5b1d7847e4bea33bdbc79a2335a561c61003305a2e58e06f3c7ca38f678f486048016c7a2120481840010c20267beab4822a6dc19e0a002619c84c2308200084000040100f40202201000026100011020661b0790d83c06c1dc1784561f60d2780a8980d4960104c2a84011880f0042020020080000223842b10a5071c7846c6a8c78058f48c789003f9a3df80320a0f804000035c83b0c81d40400040041d0860e60b8000080201c80604403c22afc58f8a01f872f1422081c00800003a9b1ce087cb4a1867653a4902d7fe91408c307002000013e41c4440e01a06f0d0370481b4240d80a06b010001149914020c8b39a048d9f67b18075c05ffa0008811980f80400002e88003da10010473be613189814ed939a9014d27353b8af402294567c152ce02ce9f99a63cd6143a1731441532871451821411400400004402a8dd3a957cace1730ac7b692b22e11ec0fa5af889081718f81c1f46bfc5f20aeaefdb763c9a1f2800161100189920079fe6061ae0e7f23b895c96387c50982240199436b15ec01fdabb0f4eaad1538b7b904724b2f33418090e82d43823c6b561778c63e26290161b9c6e22e8cc0df536050f8b803506f686421f0fd8a008a9d19c53d85cbcdeaf83043013cf235c8482cf44b4bf93ce78483c52e623a277238d1801001ea7adde89250acf05a3c718f74c6515b6a8d6b2dc903f4d805afb7faa92da6a905259288088a02fba8ae28db245601c76a6160f00e45c1e56c209f0cd87468215b83f4b3fba2a0717385f873fa695be710bd2d9c2762928160384b6bd68e788b0c99d741c677fff011526952edf4f102e9fe2cfd8e26c74ffa267f0234ef9d97ea58b4cdbd8efc1964245f9e7e0b121c22490a0000020e080245310059b1301312b7d4f0a118ecb6c8840a62520680c043079c9e08029d0c76604020788b2600201312100042430c36e8f03070c131e4430abf5271f840df832e391005f6fe2d80004a383e010e200657314103f602e27c1840298b038400621db0692020f80401a8160d2038140315a400a27b6998eb10301ad44f240200cfa4a44048c748994a003e01001401c8c0257d8a4617da4992d0a201224d6e14223d480b048200cb7b065001f00860c95ba2f58919b3260918c2d13df8f4144f86d794e2008bba50c65001f00800007c100020b20400a00034820d0220670901d0280012688148a800174081490c198072996211ab92000b000007d04039727282148a901a678d5f42598623bea49f2519e977977a41ee0000000000000000e945e70023240a8bcf6a322cd02d091460c104700500013cbc309beb734246bfb6efec0164b183a00f5499416dae199fd25b408d4f24b3faeeb1efebc9938e2dc4764ad047e07b511df6e9e93275043c292769a9603002008c2c01c317c40e3871853c551c349780281420600e1785a030c1f6830b418113ac7c2f908222b5a6f0c580000012750002c6db0d3a5480118080194060c803d300018a62ac041057bd75e265204239a70276f88215e3248bfb4c0c00186d09c01866a006344e42c1001b666c3c0809ebb9709370107bc80e6e3e9d448014814018c07c6800004e201249d912dc921229aee93b100a2858532ce0181000a8ab858a102e7fb41c841445bc9f90160000385e1680013b4346e25240090051c680016c0c500493087040e83d92284c2007da0628a1e2ed11f1d9a2000168c090060400194ada1012001f412dec4010035bcd34bfa0000973248b951b048015014000083c8001ff10006343c7cebb6a342830086f3861c3fe7bd5ce0c20a88d9e91c1d2e737be101010df6ac0411c0b23ba200005a0ba800053bd6962a40080021c7cdfb9a7696438628865818454908010b444a6208080164ad92d80411545a7b3ef05000076bbd5040700b1e413e37a02002f362e8280000334fb50ce5152120056060000219202802062010002051a240015d64d6068e0012956fe814585732e17c38a1000b3db64005043c4918d6280821855de41c9200000316233c0a011c26a682400008072e4e501809002902403080816c040c00205f0100012c9a1c0087117c71cf2f4d2a080c005afb5830d2355c5d8208cccd4bb8a04000058982042fd7da38301917a5a20003ee5cce3290020008406005a47940c3074317400610ab43e3dc2084a990038502002d1bfa1c1483aa0180408)) <<< 16000) + 0x285ded3c40000b4175000180f45ee2a4008402000036c4178160280be38e3d3fb6004714d862723ad8388001c63bda01440002502b0006184618a4a23ca04000b0831e0382096c23dbb020000058dc99000055df32be28382400a40800ba03821750227590362f4913f0c32193a38828400001f40208940c530960804379c3201e9b6394248000b41750000c77a69c64007c01104677ad7924a58c00ba71a9810318153cb238488008712c600820f1ea61616506001007578061a0ca6cb340580000ffc44810023997e610182400980700003d04000e9882e0080017b8e8e0000229b605175e54f1aee1018034b5da2c1437c56c04496302008ca805201047dff63b9f0a0251e96ca8304000063e8ac200085cd03c3e3224009c0800260205b0102d0081640400048c4003048800d8490581df101548bdc14298b2d464c0769cfbb930017ba66d0900074443c1c0053ec9b026081e00860cd43af2f3426a77acec30203449f426083c008c30a49305c388cc3f9a89c1fd47869c700687339c920003e25a72800f004200002008000022200025e40007a482b84c09c260ac0381402d23ca145a0c8dbb860c05afb58341097d246c1074bee5f82c00000b130a0028b6b760270c1e00860c00cb210d00208866e434744a0400169d9d0020408b627c1dc1042c08abcb44a000016bed60020022fce72c00100b13c8da100002c75610b60241200500480550182a00fd1ff86338ef9350fdde8ebebe16025e4c5e207ff1a8f0000000000000000000000000000000000000000000000b49f79e00032a0591641041230820a1a001a05c000401b000010040000111b20020583ee08144112f6304ba1f0824600642ab26a25082686f1916b80bcb040013fccc0c8e80000154ec1620e340009f4a14f7e57a120380188282000020080000222000436400125080036a10140dfa3ff0c671df26a1fbbd1d7d7c2c04bc98bc40ffe351e0000000000000000000000000000000000000000000001693ef3c0006540b22461861c41420823802c0b80008036000020080000223a380001b0963018280f8593bb219028036f1a20080a2af98b90b83a0e180370e3e388020c03b2dd433314000794e6ad78820002ec9a14b393882010b00f00003e0409c040a60200e010002541000d1420a40a0010a7200583a40dc87229b482a7b1830f9adc5848223f380a87028e429e88c0099fb944140abd0164c802b3100f804284f706110a01395953240d23b93048c306802143884a84ac0c70f472bf9a692aefbeb10c93ac65995e736ebcd2bd2c8d54fcd861840df2d924cde9352d417455ef32a7b8733089f8a7fd746226435a21e2650a8296043223c4fe3f3a0e198696965fba4659862976db2e4f0135d3a920180b4df6c485bb38beeebe314719969ab59f1b10eebc884cf9b5df5f48c87fe1e765f4bf546aa54e3708a34468ce88bcba692e735532c7421110d5cc57e7ed6dd1847d1c02450022fe4714b5a07734300a604830a74896f24041a0080288280003408002fd18147d5a2e2879667342c1c66cc80401a24b8800191a41c4a08320100500501482812404000236413c460401b9180059e22c32cf6d90c00d76f3d240a1e54f87000016260942068021a380077d9822cf6d90608003e814043f312940418004606001d88d02cf6d9160001ed29800b802200002008000022200018c400064c82704c0a42604013d1c00589940d7f620300b3db64001f429820b8022872ae20f34543c56e2818fb1552003a092b1c087e03b65041800800006b904d0582600fc900e4f425460c067a984a1c243d950140e02ab2135c2300002dc6c03e82801101620205267a58e14c83f724f0400749cd1800e8040000270c860157af1c0b85934030386179b9200001dde400702cb44a003401004a0100007a104b05f02048d22041051f31a341e0440c6fbe34000249f001800d622f4f214007c08140c431c2002001000003d3038180d5020b0083e3c0ae045c680005dc0300175c254005c01102830470783aca6d1010c968c6002a01000008520002e064735cbe528100120b241babd0f1c00099730400064fa94006002184823d3c12398d8bd9e0847aa5920dcbde914002577dca00300100000d520940a0001da20009ac4001f7082480800272880065a90014de20901204705000b2b10046d5208c4b003015101c11d9b0708213fbb00508d94a2bf05064e60091870033621c4450022d2ecbc26082000861416af497480c1e0961dc60cea76fcf460a2caf3b808000fa3fe506001c6c957c981080021839521a2a8305b674a5ee2001f00800a00800022c8000e810450982204c0b4260860b0240182100e8703ce59183884dc5c9a850c1f1b2e4081f4e4884c24235aad894385ebd3e15460017004d30004e303e010c2407287f9e1230d783f88118595f2c79e05881488ceb409124482352502080071917c20000a78296801471023014590570e5ab491c08ec7ae103f670017534604c9d69a58dd6da7ae850400d03199400007e3d59c007c021a4000311054b20468d939e40e2ba5a5bc2c619b3dc420e35edf89bbc5040033503f3001080400004bc82080c1000744a4f368e051a42329f5052121ebf66c0d89015a73a6cd00e08005c284b98000052adac900000d176df04000133d034d200090051a501529b372052893ac6ca1d8ca69069da7812f1090e450a887a3c1012b8915908abfa0a005605800013d3241d830c754c1ce17412904055850d68b1c19145419b9600003d06ac8000062c67e10000)) <<< 16000) + 0x3ee5bd2704210080000af1c280020c758612028c589b24842e82a621c3800fbd290c1d14efc770405354c35ee141001b7e87ce0042010c240d2fa6de51000954f41248418ba6b59c38038025fcc1cffe8c5b24050d084930141001e840e9600001e727e800210080000c4903f0500018a90007a5200150464dceb49499f92933f26e758176a45297944cd96539f5f60574170867b3535636b39ab41532c820514428320324000e91e12afccdeab7dc825d69b52fb77c9431ca82717029b5d2ad2f8d7901b77a0cbe1b0a490fb4000aa080076a9c19530cf281020f6f8db4185c8b53e0c8047be680b0c0f485ebfb24003cdc8fc2800b826c080019c707c0200002b678860e488ea20654f139c2205350a7b9d18010004005007c6034069cb2442281cb87103a19b731214229ea04a1102ace1299220006942ddb2604200080000951c28452d3249019c4253d38614cc18713880955de61a060cef9a9bf8a001abf94e84c104001000012c207c1a03d0901e0480ec240740a0003ae2002b1240e466070320370181b00f0865d2d27a5058ffc21ac7002e156430130c1f004692b7bc513a58736efe9524860e81a1103060f7f897c40018dda9521284100043490031767868c004ac6cc61adc46593121cc8cdd86183d80b688018001e76e766001f0080098080880400029a40009a481a86f08910e47e25046eabd0b050aea7875e9401fe3fa731c004b4b63812840f8043080005a1ac145256010f620233fafd61301005ec015081be0d3b38080003acfdf0b041000200004b0813068090040004da40d056066230321181884c0c01786b050f5220356ae87f200b161d481c01e8679b0240c1c00871ef961d78912d4076009029071b7c302a5d8c2024081c00849210451b0040a0eb82fba48600085be6483452766e658000a53b0a2800a68b3fb30010004200002008000022324a4428a4440aafd4e68940fe186cf45801d95f8648003c010800008020000088800083100028720006cc40bc3605c0ba2a5173ca858357873b0880cb1732c2580e1ecaef8e004406c8000128c0f00400003f88168ac0b047014de611081000401584c0a8078500a4bb92164f139a20019008485a3375e30007b22d120000e716300190080000481c2dd4776d20110e2ea32c0d0dbcf323041c00800004c9029050138280007ccd0e059502840c0c659810084de8c71c1b08ecd23000ea77865001b00800a00c0a40605003d280057500d0c00196f8a0e0a44fc4e0401236864001c00869412af2cca0ffd284a1c0ac904d434009058032000d80400002f4f18002fdce506b296a43281a1e17a1c6003a010a0d66cfef250342a812f340007b5d79400000112e4001d008000062900017b36413a85710a2547f86a900c365600960652d80884810380100000c5200081e409c24000ac440986404a120240500041910141500070b1c2833851038e209af17199418a5e1078940847b4c348a09e8bd1980e00338900006064106ab3002ce304001091001682ef8e1801686cb103cc5779b228000473070300dd7265e4a003e0100230181000c0880742801e0f87204001e789c2897289e578d0801c0c300e0aa02cea214120c8af504c083e01002105c909aaec328a1ddfd2dfb8c287687b0320458c64c543041328583050481aed17140506851d009c207c0200002a44000a9cd0a006d9a4cd10020430f0a27a48e186142291e6df32000f804285a74424e86885ea0a16c810b2e02620a24056fa37200187d85a43804c471cce6001f008000091981d53908f512342a8857a3050a2c2f68386cb848e644092e29775880864141c9240afcb19ba4e083e01000015020400a01f010001d01014090003e4901e1d00e8c8070340361201a050004d6991ca145dcf324848c7e18dee88ab1863673deeebd8122843ecbfac13c908080e2796362381af8d12f4e1f18093b4709c9d304006d1a32ba9ec059c410285a0788040080200642603013b237312050bbcd1f1822e1ee0c08178f84016245c12840a8042c6ae2fb8e1021bac5008c516201a125b90005402002e03d281bef860f08e1f20108a8894000a2aa4001500869418e533475e3de1839f80908048e4e0681d462a200015854c002a0100000e7200034e40009f080b008000dd88001ee90151900a0a804c460241a0110900802803c04000d164009340801f3c18076953c72f323771e5ea9d5e0d7ac847cbca70b93b200000000000000000000000000000000000000000000160450c6086045044043002001070df4bb30a544af055d4ed9c6ec24716cf69be120628d34af6bd45710a8e77ba64c52923f4921ecded1aa73c88621926623dc7354b5b84996321c7060a7c22456a14206f9907e0501b5f3ecbb10006f984c6030000ef46f6041986088021c761c3c1e21090e288d970425f8470e1b66d7ca71e1041982d49e3b60c101b3f37f9b0100071ddbe878446000ab47cf17762800367db8d860043e840a16816249f2bb9b1b0247050813dbd28505a8a4c892453961df4ac1400056cc31e04004c30387d98009002143819a927d448eccdac05a94281e22fe5c481a3fca5e8900000005dc128011004000041c80702c0341724e5d618f910a1c008bf0ba650a04d673905245243d311340a00015c45a1425082500850e065ebd772476671379314281e51305490347e9ee3a400000017700a8410802000041480011d100c0100027b900070d20010d0402c840143a0091100406801c2400c0a00501002008003298801888008440020200001004d091)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 23 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case1" = "QuadFull30Case1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 23 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case1 private def zz2145:"s0861"="s0861":=by decide+kernel end section namespace Green24Proof.QuadFull30Case2 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x7cb6d384c, -0x2cb416090, -0x196dc8fa4,0x2afef4], ![-0x2cb416090, -0x157f399118,0x6c67e1ba8, -0x1c2b46132], ![-0x196dc8fa4,0x6c67e1ba8, -0x14d5c876a3,0x4298f3199], ![0x2afef4, -0x1c2b46132,0x4298f3199, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x980af6c3,l6),(0x22af59e27,l4),(0x1f4ceb07,l10),(0xd9b40,l14),(-0x661b2126,l17),(0x3922eafd1,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x1cb750,l25),(0x4c57a55,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x30e392,l46),(0x165a0bc00,l51),(-0x105882330,l62),(0x1a3dc6,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x105882330,l62),(0x3922eafd1,l15),(-0x980af6c3,l6),(0x22af59e27,l4),(-0x661b2126,l17),(0x1f4ceb07,l10),(0x4c57a55,l30),(-0x30e392,l46),(-0x1cb750,l25),(0x1a3dc6,l64),(0xd9b40,l14)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x82188440442009c614410600b95006000000001300a401000004e0440163010000000221e029804000250982402d003000000003c01240183c82282d018c40140000001300099008000014848004cc0400000000580124018000000036009200c00000000120310040001a01040098c05000000c812018601800006a0440143010000003408807180600000000160148020000000000a06400801dc68048036401000000003c68198020000001d1a038c020000004414018601800000000b80520080000005c320718040000000f07028c0200000000012064008000000001c052008000004c1480d18060003b15898051003002684609006480250829010800cd401800b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x207167dd511c91a3eea629320615bc947489105ae0709e1807e93eb63c200a05307970660c2200848d0cf67ada48186fa524279218c11978c620300cd9b3ec405e770b0b4010400001f671200f50eccdc1270c230080000b8102509cc51e8000000304c76a7cd2fb068491c718a1471481080ca00800430200200d02401000088102309c0d55b27045cabcd5f7a9ba0911885abbd972d484dad6900e23964b0ede527bb49162a21842b5ed0b7645729e0d2bf84848167937d69330c3b027649040f483a50497cff33f33e860498ae513e525f6406bd541012407e79a65f0ab39f04996302902026810e38a619000034b338f80c819dbda27ab55881596d1362496002de048f842c0c0b8fd9f1c5925075dbfd3c84f0074f213c01089080c60c4003001000187226de3f06869948a0036bb0e8b5eb3d2e354676a064f40bca6b93c421074208953b073a53aeb2d2905711b4000c1cd5b9c11545c0a44f455b9c11545c0a44f3ddeccd5f953bc3ffeddeccd5f953bc3fff088a199d895d7c99b1383131162e2cf9622c5c59f41380127d647de948a5dcd6405ddcd650003e9c7c0640ceded13d5aac40a837d6e7380d62837d6e8000000034a2063842041020171e2f4dd1641749f4b8375e164a256e554909693ebd7d7e8e001dfd83312834f23e5bf04f87165cc3065c6d25c215629cc212e423543fa0abe258fb58545d13671284d8c50b84dca3132152742036a7a82027cf2cc22a499efe2b62e04211f425865a68003361c62b5e3bcd613d9588038fae4ec9bb4d30f6034087e856758b13000000000000000000231e208ff388c571500a758d4cb48a812ea3c88a101d76bafef8b0000000000000000008843021823002802008059de3684569f0ea257dd47b7312d96b12d21db8321a6175bfe7697ebbffd147455a606784a53827) <<< 16000) + 0x7c096589dbca6796474d40dbf8b705fc37db55fb80923a8b9e9e1ebe877699699cf38bb3187162d453f665c7e59b9e513d595b6a8a2cab84942cc707544ac2c48d4a474fda000bce4088b60423a0200500f80a061e104bccd3110287465598eaa070a5a37026c68830454c42a38cbc142110c78c2a261000fc7e2cb6e80700a29cead9f3c2801127af0a73a010f3b83729da16f98182d02c48e2be5e500030e220df8482be64073fbd2484c20e1e268216ed7e18200274d0b080208d9d7f290a03013954b99672001292e957ff9751c50a809144334eadcf85c2449b88a5e4df840913e3d72216040c2323e9b3e284132252026d9214108dc0a7626a082aa6cb25be140012ca07ea57e8071902056050b21f19308b32c632c21a9fca19fc375e7024600157f7a0410c216a5d80820796df808a06e024472c100423c8e098280822008612258c1d235b260f4fb9359ac1e58e690b846418050e02dcfe28b7028ac1f2e28b188208511118c23181025f758a42bd05806f137de6d9030002b9e4038306889042c02c612d047a9aa983c18b70bd858ef151ad9d94382ee9342648c07b775e108206fe62564102707e39cb8e000189c2f050084401000019320007a4687d6197aadd8c3025cf43d60a1773506705648b1f7437c582052144d8f4c8c10b5856fd38208227e9608c3802e902e4510290184a0280001b22000e9e400254c8005a2101e11d11268071590b207000184cf4e142969402765c8914495931e7205084f763b0095244000491735a1219eeecdd9630a06521777d8e040000080c1c4c8520052038a1e469f8d601425554032bf2443561cb1544873714f6440a05996c8fc210088e5776dc2803a0f8f94d3801180400005a880e82e885d984350238a1d88903d34ec2846c625b215e89127951c693c01020000c6d2bc46044b79d9b1d80410fee223a4c04000014e962bd040119b42ce340b49042a02058d6512dd2794317fe4433a58bce519707142d25abde84204c47c20a21002b442157c0806dccff31ce0044010b235522cad39431c0e845722c5f8e5b471050a0001fd05c4086940a41f16092f4a7eab1c0147cf75c33801180400005a8800174100051230312c3692cc102c55507d258e188e8304319013822296378e10000017700e09de585bb788080070d0f71200006ef0581000fc44e4e88948612004000075cca8f73a352f2714656e30b1eb93f8c4131e547edc5ef05879c880000000000000000004611440c32021c21c118114010010c080080340006b480e00806c0403402000cc320322b0181180b88c0584602a2380203741d56b7bc19916c792feaa5d8613d36e466db29d3a0e6b21c8d7166f735168dd7d619951cfee1d6d0cd554f439ad55911821a5d923411bf4b22813ebc5aaad965437bdd63a295c854d8f280cfe93dcaa5a2df371996e95450c816ca6802e11e5476949008800c64adb78c2e56c652f3fced058ea0a080152dee60db0fdae1bc6054aa142b60637dfa342927d70da4c1f542296e9186c39dec9bc1919be971bd65ae115af4c7bd2b9242f567b83cf93f8fa000253817d323cf9d6935892a2fe7b7e64fe43c4f556bd1877c806e77a630951e8269feda0da958f28d03d2dc59c6f4a90f6a3b0ce67886e7bceeeb36208f21d6c17bf14753827ff0b4b36c60bb467d9a3aec935c574da38ac78d6c270a8c60c5adcaa71260a4f912667022e63b2721c3d00d48b8cb755b6002802a2b39834a16680148eba4609041080220100200800002220261b80800802000008880906c044160200390349ab7ff542e51b5b9815bcc67712c051a9d43005adc639da693fe8c5ec15be09b7a3c1f61f29209caf1c5df3f4d1d352313be82bb035a42049b2e2510000c9659ce6480d8085f678e20a6611f0246a81404728a65f0cfd49f225c0491077b2c78c7be5d0779a77c0633ac5a7c15d4fa9099a179ad90360f542ae04c5eb5eea57d522230cbfe948220927cfa98347b8832ad51fc147aede75ac46e79f31e480dba0cdd90b2d437a0d8c0444d45013e1da30942fe09b23658f3aac2d6c697b17d15013af5789b02f8cabe09cf9479f5fa98fa79b3504ba4f76ef97c38d2a48739dfd58db243f24ff0f0de096f54d4936121e37040003d2981b815d16e08244707c01001a03a199d895d7c99b1383131162e2cf9622c5c59f41380127d647de948a5dcd6405ddcd650003e2116c6397780599011408608409200a000402fc5888ea893282396855797e10ecbdbca6149d64f740fd7a7ca314bc1c2045faba98bb30faceeda1f6b105a1314000ca88001d8900f29d042c6aeaae0418b067b3d030001f5e58f00026292cf40041124282200840700401001c0b00d01d0e607f583ca5b229c692841badbfcc2376fd8cc8d1ac8f9811171d51e9b59ab556b2161d8fc9f4b3935d2a2532c2e2ffea9371cd9838fff370cfcf74f33e7b32ba38600f3abe2f1c6fad2943f5bb33aa594981c432b7941fce1854b71e5ed073776b393cbfd99f752d12638ddfdbd87eca2e84b3343b166938c1158f30d1ce7da54b4104080c97d5d738e7fe5dfa0e40e40253792a3c0fe1d3461126854d3ba2a4ce3a04d4569a2d878930d5d83fbfeedb3730eaead1ea053167226f1b23a9b254ad4ac8001242c3c78ffdccc13eb2e54974b3e8d17a268e62d2c11c291717275e6b1e6dee1715a54e5d30f2e69b3ed5b4963bf624b7184cb534de60a3a99f70a72b841c2750ea9bf2a4b11457f8df9f53cc2359ec00447d7ffc21dbb916e48d2eee920125a1b84ab9a654758)) <<< 16000) + 0xd51e04778fbc12f26e108b688c08302d2be7b9aa3818c9801e1000146c4002a748005d210018ac339ef567fdbc7e39b39a6edb319122f73e6d8eb7b20d5f565000000000000000000849cdd9eab496ba19da75d3a59ddc08d8b6b12191bb5d0c3510c000000000000000000000000000000000000000000000000000328dedf99f7cb1add4cfd8fe3ef12724ed36db1dcaa4ca6d400000000000000000000000000000000000000000000000ba63062061863002802008961977251151641560d1296fd2e0747dae90d249423165c3c313c21c9a3886623bde3cc93646d285e04b90e99cffd8325d5553871a68c284359ee18d96e4345f1f50e1a6d0c412e0bfbad82b8533b8488474e75b4a62ba9fd00c010003ab10029b020089626040b25cb38d861838b17007870a614315c2e2844f86c80090c100d026ed4820cbd974dcf0400ce1675c3010118facc988044690384a028e217476749e761c2051d90a82ee2842cb9aa699e43041dcb09d6d98209b9318bb7a01c0c918100e71408000060f23d01000293970304800000d2f008760e385604800020c386006a750e0e12ac5844f82846aa1aa6e0800d18e58661012791071f0200ed1bdb48028cc3844010a00f9dd0fd463965ba803e774427084c87908c4d28d20b20d1871040c30cd00b032000200dd24915ecefb9a442c2bd56a34103ebbe43018200003c53e4002300800006e9c20608edabd30792a915bb87080031fb8708201ab35340700002117dd6a0844008000108201612b1c31d45b272c68dd5e75509186b9147361810839e32c4204a75646371c014f62e85040199474bf01270c220080000b49d285a0a9e9bb9a4025936480e2c8000005d80068d17d13bcbfcb080005ebe300c080000000803401b649a5f8c5800007ccb480900000005d60424009c051a4b2f0146c25cd228de1300b027060000124f8034392ea0dfa4816180000493e00d041923e5c0900000000889fc4c8700290200000cd1c205814bdb7e460ff204c0808d3420000249f0018143c5ec29f087000000124f800800056c73c00721810a40800002ce7063a23720878b1b82bab19b02460000069780b11d60660aff1420177cbba7cb04f033e528d1c035fa7a6f844002147880ba000ec1486224808260180000ef900a0d00039a9914d3ad4fbca4a11370c5d38389128a187151e4710000013c68090a459d37bc003040014d0ba0010467bb8d97f0501370c4971b9000b10f64880d9028500380001f830230a4983679901e1f5a9ec7e8c180000278d0100b329edf97c1200fdc5a998f0e000211d22460c00aac7fa81f0800ab44d1aef2001621ec91026c8182801c0000fd10010542002360400805c34ebf6c047a9ee7a1fb0c1bfc63e14141ec6177735d2b93154db37c9ed897e7926b1b6a48950c206bd96e5846add25e580c7404bde021850f684a1db06be18ebeb2daca9788f806fd162cdcf100a36599b754d53ec7c20600ef2afc24c9b4589d541cd8cc8258efa41d4edde046a23105be870c04182f78cf24724caa0d350082a616c18fae805b12dccaeec5846d931d8d32e33dab5b717090044d788be62a5515540b4f05ab3e7710a4d1e546bf49f04562d966b11652e0234e7572c901c8821effd72cccec7e776161df1b0dd31c4e636bf9a526d2bbda33f857678412a38e49094a1081024a4476df33b09696b82a4f35b888b3344a46a7770e561510b4f2923c445f032d9dab1018ba5a1c470cbe81a2c238dfabb1f2ffc521b73b8ec22057ef5eba45bb0d29cba81801b241420c0ce8761674be88b7356cc09123341e92465f8b1fe665da527fb1ee3525c5970ab18434046c58b8048cd8f3ccc300161d3154cd6dd5f73c88ae027357820f8400050771bd7cbfec120a83938b9b47444d699dc8ce25e5812cd24d075049119cb1d1452261d2f7568aa6a1998da487ae1f918aa3303e312c39c1496205873c8a9e69c7c63100889cc043a39f47d24c6e6860a59590fcce15d7b2f95493077cdcea743d5ec0c40823d6f4654f17570deafb56f06f61dbb4f78b6207feb5daefd2fd6435d740d585664929d76e28cc62a53e5c03ff3715ea2bd7c512e800427ea389b766b50666c654d94bcb6f58cbf541c51ffaa81be0f960477e70ca5717a60ecd90a26935fdea2403aa506443cff0a04f196bf50a244608001001203e3fb00a522102a0080080571c1a86cd60833dbc65c2800e2cab0100428ad08c4a060e8020000324c8c0790bab4618fd81c2f0e1810b777d300037c70dc381c6f0f9d460377fc3bba84c203e01000012b34309930dfe0c11cb57b744404004ef5b230090d98c301407f651891000597fe2ca14098508402000027078850db9cda20802c51bfc282a199c588501ba6626dc40133ed035c38031a1d53aa0930c1000400004d080029290005ac20021204005f6cd0c9ef64226d8a0dd7590d195101001159374028091a61f4e6840000e11bc920600008aac6e008017b094298402347182701440c02b37e04a4880013b765040967f4057663880002b21703000002ac3b00000b73c6e4484c184801081807e8eab409100037782c0812cd661c42071000000bb80900006f8e1b88009c5a01d2d098309002000028e605000dde0b01c51586758b51c39fcd4c323183000002ee0101000001a0b409440900200002327082b0c03680384001bbc1603053f9b80130284000005dc03803df55c1c600034f601000049fd6044a28480100001622000ab4401c6400c0200501002008001d74801948008940020200001001ac19)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 18 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case2" = "QuadFull30Case2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 18 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case2 private def zz2146:"s0862"="s0862":=by decide+kernel end section namespace Green24Proof.QuadFull30Case3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l41 l43 l44 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3af94f204, -0x2cb416090, -0x1b15b768a,0x14b236696], ![-0x2cb416090, -0xb8cf2e6ba,0x4c9098c0c, -0x1c80372f3], ![-0x1b15b768a,0x4c9098c0c, -0x14d5c876a3,0x4298f3199], ![0x14b236696, -0x1c80372f3,0x4298f3199, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x980af6c3,l6),(0x22af59e27,l4),(0x1f4ceb07,l10),(0xee34faec,l14),(0x64e6884d0,l12),(-0x6c8da953,l17),(0x3a4801a75,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x1e63e6a22,l25),(0xd3041e,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x2ffefe6d,l43),(-0x35696e78e,l41),(-0x1dabd196,l46),(-0x2483a83a,l44),(0x165a0bc00,l51),(-0xb20f1b1d,l62),(0x8d1f126c,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x1e63e6a22,l25),(0x64e6884d0,l12),(0xee34faec,l14),(0x3a4801a75,l15),(-0x35696e78e,l41),(-0xb20f1b1d,l62),(-0x980af6c3,l6),(0x8d1f126c,l64),(0x22af59e27,l4),(-0x6c8da953,l17),(-0x2ffefe6d,l43),(0x1f4ceb07,l10),(-0x1dabd196,l46),(-0x2483a83a,l44),(0xd3041e,l30)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x24140d3008000420c84408900300000008814073008000022011004cc04000000000c8052008000000000501c802000000000c80720080000000c8004c80400000002a0013201000001cc410268c04000000320900c300c00000000190348020000000003c052008000000002a01c8020000000a81c07300800002881200e4c0400000a806003930100000009824030c0300000008418063008000000001a0148020000c4321100d400c0000000011024802000000000980520080000002605014c0200000000014092008003c0841a0271004000000000240620080000008828030c030000000002c05200800000000e0c0cc0100000b83414054008000024c390088c04000000005890330040000002a09014c0200010c2a0c036400c000000000240c801000009444240e4008000000000140c801000000621201c300c00000000070148020000000844806300800000000110348020000e45409022400c000000002201480200000000003032004000000002a0148020000000a81407300800002a011004cc0400000000483033004000000000d0248020014c380840534010000000e85004cc03000000038240b300800001f150d029002001582405809d4010004d08c1200c900450829010800cd401800520a81200f5004001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x14062008000000110f014c02000004e04401630100000011024038c03000094260900b400c000000007802480303c82282d018c4014000000078004c80400000000078072008000014848004cc040000000584807300800000000b00248030000000036009200c0001a01040098c05000000640900c300c00001a8110050c04000000681100e300c0a61221b403290050000a84819015400c0a60c2104034900502983384700d24014000000001601480200000000054092008006116013014d004000000682d013300c0000000002c0c80100000006458053008000000191602cc02000000220900f300c000722484c059003002106107805640100000000223c0cc01000000084780e300800631103401e9004000000000840e20080000002107014c020000007211029300c0005a1c8440a50030000000b8740930080000002e1d034c020000000c8740e30080000002209024c0200000000024092008000000110d03cc0200000630a40223010000000250b014c020000098842c0540080000018828070c0300000b312401130100000001e19024c02000000000740d20080000001e19034c0200000000074092008004c0d41d03210040260208210069401400460841100e5004000000028180f30080000000f07028c0200000000283033004000021150902d00200011c5211013400c00611081403750040000000542c0d30080000001512034c02,0x184510480884012461c418600b95006000000000140d20080000000001c0c801], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x1657ac1522bce2425a98e12481cfdcee5323042100861217df0bc4858c3204cf3c658b0259f5bac60606072d07e582282aac5086008ea16576c4c0848010000143370e742b6193476b34b2d05823f4b9986f2c1214b236696362b6ed12b2d05823f3d6b3502046c39506f89d5bf70de9b177d3414adba0f99641619008a098010015afe5ff1285ce4f5fadf0899dabbf721b57aa76f3cc89bb73abcfab82e990f558a45b47f05c90e855cc70763324dac084c4dd82506f2c11ce63d0003d120741308309e5bbad70180000000013133085062bb8564c321309649249241839431411801400a60400401a1040a00014336375949d08f5549063498c034e276ab000106ce48a5ae0e8f09db931f61575a6a1ee3705b467f6120a9173684f86e1430ffb984c72142b2f4b9baa38133023ef77a616df3ad6281c0c9c9d1e6bff10c01297b1b4c2bc01140b0ae3981ed5f7f3d294a2e77d0fe02b9c2d8aefcb464bade2e0268dc191dcf2de2442f7b336d5cfc02bb63808261a95309066aa84bc6c35d80d8097598559462487300009b07c88702b39d7815f6151602ac39506f96daeadfc490c09f3414adba0f91428e28e18408c00a00600a45e34670e046081370e820c9a372c08b04fcb5175b64580600d5d6fbe72aa37571c8c1b6800131902915e5bbad70180000000013133085062bb8564c321309229220c20e18c10e006000338cc5cec75ecf1c98b717f196676563d40a744cced48e74ce5c91bc50a0003d47c88702b39d7815f6151602af51ffcd355405d117752207b016c39506f96daeadfc490c09f3414adba0fa1220c20c1080860ae0158c95eb70dbf3718ee44250d92d94c0a2d771ec6cf95e99b33d8087005db9664c05a998bbc7dcb226518b325284084e453cc4fea7c9110a353c8c184a32951d1c6083ba126001015ae3a94e8301f3fcfb42015661c220080000a1900e210400a800128083f90e06493dfa224fd9389909731c28fe2c68cd085a4a9e55e0a10550c6ec442cdaddf337c409a0033a1555e2f01891781025e54483502ba3564182b1410c15ac3a5edbefc02c8c171c3223004636f8dda32557a70f482027b9804c06443a973db4dbfab3710926dd9428170306530510c00001bd9c09de6c6866d30e202778e340adf82860886cc32b029343002d67f280ae910a048b45543469cc20065192f6e3f1700023a252e90d921c9eb33fd44f42896fe7dc114b120e6d531a19020000094883f1681f4360f81b07b0503d00b852087e262af8304f27386afc304002d0a46b09f8380f4db7b9b4e0080007dfb5089a82f3bca4f8c492a0f2551fa42e1efecbc97402ff32a196f351414a0b00b123940597e10df070e6e49a425a683063df03bff4a224201759d17755081000ff4c1852c304514d17871f6300d4736296844542ee6c7dc5e10e1706dbb752408347242d030510d81d8) <<< 16000) + 0x1afd988151369fc81f00c186bca919df51033539354d9022821f430869ec82023b6fee9ba621b2daa6a49a143bbbda3571011b9880ac0b14299ea7130844a448b7bd428fa2a9d162051e4ef38c16a2884d0c96f00dfd8c08673bd25bba7440146f025c04bd38603ec01b6df87b481bf20162def12043ad0e3064090b18fa810ff6772865bc29227c407140a3bae7173104211b852c0fc70427005df8071411fd16800598107016135389610011ecd7c354c13ee98b298e0b18102a02058d91b538aee414335c5b97ab0448c105931dd841828c18c07e99040a366c63864008260dceb438d03822d8b707f8a8e01c03ece427221e08102a0240000f0101f1580020c901c19800335100085f200154041e4a723b41dc0cfcd1c41b717ce370406dd75cbee1070c0829412ef9011db8be4b98201afe2d5228430042268f6a202004aa90149829480c2701450e540ef4530a179e530adc122076aef274283226eb3624386324d7bf20a0aba0d3547920e4e87607627042300851155155fb38792871ef90610bb21422dfd20f4e00c91000000b546405067acb8cbb8001c30b5c7e8d325120b650f38e0c90b000c7c00f864801ce8e55280bde8042d028000110191237b553b9480c00000bb809083647d62c860827fbe045c9056a0bfd9b06000862e17c42008a7198bbc016338834a708240080000cc900055b20f00307701c89828427624112049b13f7707c0121892318bef42080cd981df54172284243994f806a1c13e18d2caff78e018f03736e03c30078a2fff7032bef2020b40b1444ffff2db214381d0ac5c9142b1d8d99a912283b6b68809223697ff7288c183a36d4f784090f62d9d3938212004288ccbcb4224480a1c18ecfc2a46f285805f49caaca49128cd40a686781830b264c5a2b00204d193ad5fa202c00257ae11d5a0700080850d4d88014263339802ac88042e03000011590003b9202803a1c8cfcfc1241942c3aed16df0124522c68a638a84890a6ced9d84060c5f0041c75610014d0f028230100109358b8180100471e3b4cdc16d101056048b21a2957ec396370ae26dd2285bd592ba0638824f23b21870c331654048619997587e20813a2bc470a4e0846010b216134998df318e383d1acd6e6002c6bac287562e4a50b295006b48560710191feb32bb40e19030300d764808131418a8cfe806000d04a2b3e8a0800012f2936f041a289042f03400012090003c8343a499fcf353942a8d7836b2a1228404b9671a9224efa8c68df0c18c2bcdf47190013d24b31d1080060c78d1e704013c23574632d101050030b2471beef032164354487b8cc2c6a15651758a50c6189220608a142516a24ae8e10f1aae8ef92c163977dc68c51c109c051647be3eff2a601c7009764ea7a050c51b24df3a20b16ddbb140e00142895dbfa87001c21a782273da05828cebd273c00804019ab0ca6190002853cdb6b730120856048000219200077e400168c8005c2901a0d8008ca106a1103b0681d4340e80207301000cbd10253583912c1c4960e04306f19c2f605e6b5b3f2cd70a1ad79994e100c2b731f12065e5b5cf07fe99fbdf721d0da19e6a11e214d7d88809505e989fa9211a1b5a84bfb65e77e9579f28f867d8dea184a000000000000000000000000000000000000000000000000000191c26314229cc0b41441041400c014505389026a2bc74e44ebe615ccb37f23553a3d3375a2e4415807911be828aa5812e57fe10795035dc72bd0724f28db09085faa906a450bb6e494d74e997445fda0eebe9c7dff0daa6481dae9bea3ef0bf11a8ac0a387708acf20eb97d93f6f84b8e3aa441f7df68b33dad8d5af794192cc04d3e4a35fc9cac16172b52d92b6630936bafa88583950b5b950a0dc1b06d058360081ac040d402e4f8d13e930c906c24280a42ccf3263f231a5516a1502a6685891068decb90004380ab39dde9199dc44c174a6316b4c673e69bbdb5df7e01b2c82601b400000000000000000000000000000000000000000000000000000d2273512f2c1f4f1b8bf78a0aa903901901020b47081b80d08f8b24886c14be37e30d2599ba2037d16445b8512ee4055c4cf8986fc563eac4ffa781c72fdc90c67df627ecd34b3553102f304211195669ae7c4cc90d88a80a3317ba9f8e9199a90e23f0207a3ce1a4a3681acea4db0096d70646500597974331c004cfde1d0405a53ec08159030840200001b641a4460d01b01c0d03386c198360ca130640183180f891568374f270d60930488860437ab5fd78a004463188824042300879c76f7f4e91e3c6d28ba9a788131890629e04a0b4e99240000012e484a0044010f2805d2c74c9e3fa841f6a0140000052b251801180400002b88000e8185ec0bcd6b67e59ae217b02f35ad9f966b767ef7dc874368679a59fbdf721d0da19e6a1182e1ce856c3268ed66965a0b047e97330de5824ab13011872a0df4490c09f68295b7868295b741f43482c41832c128029ffa05735b0509d4f4644846dc891ac48a8ec1003f2e9b3b13b87220ed8aa1baa8899ad89bfd14f99d2e57b1daaf6c43d30727932ef9b3061d85ab6ab4d322e4d6ece84a01c6a0b91424bd13a000a067c42bd29c68622a41dd487d6258be71a777d11ab7c28b9bd68c875c5d7da9a688bfca978273caa7651589d10dd4bc76d17e78d4ebd5e4b570727764f6980c12c566150f5febad3851abe9f648828d192b1e26ee35f2033d0b1050e1a48e005c09413eeadd21de900aef62f42676b70e17fbe6509fa20efed5656ec1022a96ba61f8185524)) <<< 16000) + 0x231e0faa41f6b1ec9c1cecf64f1e4e4310776cc6944040f0e725fc82f37d482b12f2619079343964b7bd281fb521240ceb32c0002db90620df060772202f65c8f665402b2d282f412c39d578dedc6b9b2f10bbcb04e28049a002af0cf907398b144e0fde4b41f9ca000c612431b5cb944d795a0cb96f4c1800e1f4330a49dd47da244a4140f730400876b58a88961f853ce061ef73ce0801f8c82219f1f3cfcedb3131328f2b5ea2f825ece24f36d7cc28e22780003d720c223a1032f34309aa75481a100c92ee6801309c2828f611d48ff9c72010220c8ab910ade960d003f4cf058b6f68c0c001c57521ace6df9100194edaeef31e50228057bf229438d0b0807495c280c8db2530ce3c71c3b06400015690601182f84f4206f6310974488b5c068ed245c53c1ea1fe47a320edcd285fcc461b007116e74505dd37fe489866dd30dddfd5a40acbcb4f1a40d7cdc8c17b013820ceeb05ccaa070411c93d630ed644d38bad00f70655fac94ce4a18fcef0edb289e9c9224a75db0c0810c8e03548794ff57bb67d6c420c1016e9bbdeda975ddf795ee3472990f2f81437a97848f4d7f6a6083abba021d69faae9c36c18c049a0b44661fc74e685a1c9c46516dd499d62ff9451e7017eeffb114113ed58ee5238f42c888c418fb3646f6c50e6d41c4d100002ee0ed5e8cb03da89b5890e0212746f15f190c8321a778dc056138ead8286c0000000000000000200a97bb601f581665043826003002d0f79e205d72cac7c362e718041aba0f756be9031863450a9b3af60347dabbcacd9cddbed9dd9877b33f8da9a8c70390504d1a543f4a93f15b962e92c2a1e9ef41472832ad301b8ca1ac42a00955232969492bc49b9f963b5a3acb4624d5a32d0521eed94a45f236364d1f09e4a90f41f642209418ed33a8002dc10191d02f0a81744400185a6c2bc4339d900264b8e5c881074021000010040118080000dc82e00e17b02f35ad9f966b850d6bccca7080615b98f89032f2dae783ff4cfdefb90e86d0cf3508ee4f8d13e930c906c24280a006d34e2a812d5f5b0fc3e605996eeb5c060000000004c4cc21418aee15930c84ca48608240018016810ded609d06ece2bc63efbef564c5a2c0a3ee11ec7bff9867e04c9ccbe01f4a19bce87ebbc6b658933e9c513bfe93005f0f1e53441271967827555a48914a4e16156494c189a9034a510a000a32416c360b41b0590982684c160160aa0304b0180035190027ce204a4b02409d14a18eddc98e922e02961a235b5a15bfde86e0f6c77b0e3ae8d1b260ed607864e6c6f94086c3c1808e318b75e57e91e401e39c51bc3b7380de46fa9821c04fbd676ec2f45e753fb5c0c5884767bc001e7c526dbfdd5b499273d91990d7d57f266095f3ae987f060ac10087cd295501aef0d5a54eda141162dd71ad863c7a7592c68d646e7eff029c826b9bbcf7f1912508280baebcdb1da54d128943e5803e2ed4fd8d214e74b6a96c13afe238bf3ec32a52511c862fb4c2fc31fa8b462075023392e43842f605e6b5b3f2cd70a1ad79994e100c2b731f12065e5b5cf07fe99fbdf721d0da19e6a11e40cc887402c0b22863442c4204302081280100144c0c008037880207d98b34297cc2c8e1817ef94b044a086400386230014fa561414494608402000021a40ec260ae03d44dac48701093a378af8c864190d3bc6e02b09c756c14360000000000000000101560c044f99357229b02c54bddb00fac0b41833012c12410801667211f18889052db7d2fca1451eedf2f6f6f01cf409ca7328b48611ef91d7ea2d337cb238baba2cb226b243c18a497a50500036020ac0a0550502a00e01802008b1c0a59330058a141d3f5c08109f6f6e50e02c949e9cc502b9e91f584a0842010a048c6a79210364ea7f40408280e2a91820e8040000278c000040100a60202301000026100022420a41b0510d82804e17b02f35ad9f966b850d6bccca7080615b98f89032f2dae783ff4cfdefb90e86d0cf3508e3bd6223cbc5baa3bdcc651d094918024681604130f004eb9e2ae28769769956627a6e04b1772f1901290473d590000000000000000008603b0fcd410a059eb6832c51ec29e2478f982aa702482580080298359ed2f30eda5914c8eb42d31928e6ac58141da3469aaa7b7cf696c4eda7bf260bf97222d56d58e0a781ce181b3f72e902ee37d1e87ebba76b8ddc5970dea0fd9106a00b89670a6f71a4a910319d6d1fb4d5d9c877b489ff3227306c2499adbbc9e35d5e7f410569d8ab8662d70fcf0e38062fb1f161a2a11fd0960032d5f190a04fc1b98a0ca1040010c30bddc0ab1619e4ade65143d89deb8e33081f004000052904f05d96dfce5c303448ccd810f9010b7c36724a0073d50108400011b9ed9149440840200002144000bec80f8080028b0c11f3797ab430c935389cc589cb3435a8408335e6f6e381a9e6e308000a5988aac08213101000400004e482708c134460981b04b0580074790015a320037c44012f68e1afc65d840940c2025154a814518100bae5e77b22020000007530010407f0ac98260c01d80b8e77330005341524b102209e3181580c0128540922204811023808118040004344015934803e9d9a1873650f2838946633a1518257851cfd8816389ea5c524082100858e12effc64d27172c50c6acf9acdbfb1429ac80681cd89a8815b7d457e5d0f16387288a67d3a1c281435c69b41333c201002a263c6fd94ab0600206b776d44ab87a1202010d415170e742b7e6082c994000017707918abf9608e3709a13b97c0b521aa)) <<< 16000) + 0xb06ba9815d571e29054cb14a1481490c50c60b5f9da0321aaff6cf4fe42a190774193586186eb587936c17567c2c1b3c513cebee94c3024c0fb4000aac8002821a28d10842ce21421255b26d471c412a1593ddc2061cd19d71188081d05a9fe60c10ce4014e8e102a756c8e6f2502d81da7fa642076c08d952d8e04e2b80ff14765021380e2845b4f7ece8a20056fa6d040c4ab80f84504660942d02023d01b84388171f4dd7a0206c7a63f38ce084201000015e2058020003b4208a2303e1180a06c1103608613a24d30b05c250e6b685e2e1c6147b1a6a8c2c90abec08405859b144c6804141977d98008402006803d7d7f90ffd37cc800000008329df940faadc78321e4816de6861ea8e60599a39438c28808a00804737551752b7d9fab1d2a1fcf2a2944d20e21959e70fa0509eef28ab023e0bd40008d8ebebfc87fe9be6400000004194efca07e8c87e45d5e80bd44dac48701093a378af8c864190d3bc6e02b09c756c14360000000000000000101bcd0c3d51cc0b43061851441c20c2a706838ff19e0fb5a2aac83d427f9d96f1ffde6ebdd9da7a6497cc6720300a9e37dc535578777428c0db467771eece63f19f4ca3c8e481eb471862832847f1bf40010e481d06c10837039d36af390a247c393ff141d74f95800c11599ced31605ae40e598c02be74eb02a130a1000400004ccc8d5826aa8630aa13e4120289644730903863efa7256082113170704812cffcf403802212ddc84e08400100410180d00f47717868ac50e4660edfc71b74adb9d8c2f73c12af24041f00801a00f5f5fe43ff4df32000000020ca77e503eab71e0c879205c6e1342772f816668e50e38c30a4002806d17016c72e30a68d239f4d83b5dc74c1ddb1a3da75e2a5b6cb54fa5f30b04420cd40009208001a3901a0dc0b98e9007b53eb2fdbb36900a22063b2902d9c6e5e637b902079d55a0eb5ce6fa22acecb8c146918ac4f931ee6eb04db85812e8b76ef8daca0d7f6f441201b2099932e520834dc8f6e30093acdecf9e7099b3b690a2a2a556dabe2bc48d7cc3f717653a30c97f32e714560dc0001b2100087736288ebc1e48a252a135108819faaf5b591821000401000602c0381c026603f2232c5f858a61313e3c809cca82050032054006197e308190726d2104946da080805df3a3af4d62a81020ee8d63a8789dbb180040a5f8fe800c698605b78c09972c3e1684561443313b7d409463780e4061e8380000b18f1000b631fc103106cfc92890b20f744580c22390ec7d4a006e1b1ad62002dd6c20687004676042414007a93e38452810220080000cc103f0501600800163c8098c8005ec88138ee4304b1229443553b19824bd9fde22ac908abcac12d97e60f554d8c1e53e1571414a9cb0acb54ffaf30bf871281c7403046cc2a066363130bb1e00c6d5e707200dcbcc76ad95ec74903572c563b9f009ebeba437dad03246a9392aa56082c94526fcaa7da10cf66d4d5761f228c851c879857c7804a925107214850c2374380b1827d0c5add8810f5455260a057877d7c420209abddae1c0a1f0f88302019e435c0d2708210085064357aaddf05c5401abae5296887e4b931ac14933231119adca5f5d99503618e0e9d3250e6fadc03a3053efe899c20249aaa272e6c7ee9569f0641d8936e0305569919f34a0a57635502c05e5b4bde1fa9f6204b6c8a911dc1443b765a15731c91fc29646901bb34b076efd3c8fc81d9adfcf9a83ce22d38d43678c102502b6806c952e5e3ef98a435c6722586e184231ec1d00b66b53c6abe27203153c5d700dd87eb7df801fb00ee373cd9057924c9d677198766b179c73fc30be9149398dc917c485b54f071f03cf8823e89181e7ec3e7292ffad147709fe1f90e65844762d57624daa58f5145f471a9d1d27a9dc60e6409404840003da102c010004a2103e1180988c0503607a1b03c09d903c36fac058db795a88a58931f37adc460840010d359dce4c3a30b18dcc46acd17ce21b384104126eb36f8e00078e96373403fd296a8c5006372fa3b2e08440080001643860e2ed0ad1f85120000030d4018406d04a1a35420989831d7b510618330299ff383042b81ab814504105e33bf38b44003fc8a7eb298600576c3ef0e9912005404003b0101a0080008dcd89dec2f4a5fcfb35e01e3915ad01b54c7e4c225ff07111df9ebd305af39976707f21881c235467a958081efa75113a58d6ebcd42d43045b13266aa03cad3500aae88a767e33979401d472eb160d33e1d3519acf8bf126ece2138bfc04bd74ec172516988a3d2b6b33d4c4900b2b3d3c3c4453fcb955c0183212a83c79e94c2edc064992f28f202399165aa77c7ee2005ffd3ecd2ccc70c7f0a528aa4f5817087afc6f3a843ce18118badf820c28d5cc5dbd097e4b7c74ba6828c7da50a8a0d4d8fba5f609f0808a85e27e15afdbaff61344029071f3497b17e343adbb2e063b3365e1c45a5c0b830593fd971b01260d8c1cbd50d113c40003dc103a1180d08ecb0b4f6741d461000b55e15289200000046501638c78a7fbce0c3a588c2ba7e10403e09e9c04c04383f9f0ea960a0ec280ecb040052c8db99929002701401c80c0e0078203c74b1b8b12cce96d644895f0621ea2c31348087e8e1abe0be614c071cd4a292582aaa3fb2e19c20840200002c040dc1406c0a032050001e99c200416bcb9304ad669c6548100ccd6c3c1c3088d2e984a048652c25d080007a096d40001af05198270422008505e989fa9211a1b5a84bfb65e77e9579f28f867d8dea184a000000000000000)) <<< 16000) + 0x0000000000000000000000000000000000001904c30c20c1070c304d00c00400c0200803400088481a84c068070000100468b0996ae2fe848a202d20160228a5ad966537c4840d66f060ec104200e38dae83821da3591678082103b562f386805240bf6e30280100f594f8584801400c00007e480e02f4db04d3e638150d24114021be56c245163a2c40d0247103b45d444a86104011461c82ee470c8273f66d7c20c312f3e4b8746c20862e9991609d2412fd72f14d39e4912005c068d3638fc900e130d240ee9b7853d0914449fba3a39c7102dbfd8a04684100b265e3468c70c68eb2d0145830c3a253bb914420844485df199c90499ec98dac57a89002c028000110903401000243903309000381101a11ebebfc87fe9be6400000004194efca07d6ca94f293b5e09c5746a3f6e2c12836b201e0f507b01e800000000000000000000000000000000000000000000005c22832032821822c028018011b880080340c804062020002a72001b7e405057448c708c990b107d29bee01841f5fad1624197b7b2748609d6b200b820001f0d9c60000f9e02d8270421008597b35c7bac8b1c192e5e5c8a1800002ee00c20adfb9b744825475d57883041fbb070e98000f1d2c6e2c04c182be5450084601000019b20601302f0981184c0b807408e4a49c030195b9668860210a1f3446083c01080200802000008881682fca180c6bc18375e986c88106c021e413e6398e182bf68b929e052fc19605806b3d6cd12020f004000032cc0000401141805c86343c0a2e5738a58027728c6e3001f00800005110130500007a100026633fb3d1a2c0cc559613d95bd6796ffaf9d3cf01fd289ee72b5000000000000000000000000000000000000000000000000000644f096d3edd1c448375380e73e7fe822e518927bd75800000000000000000000000000000000000000000015594a9c0049a1765500000000682842341f33461833813412c124012c180200d821f49254a4e20602a13e4158808c8ac630000c2005fbecea21040f56f8a74080803766c26a58001cfa3fff84001ce05963a00025be6422152400980510429df06c550a4044548fa935c061000bcf3892f4010837e28c3304040236c84c0dc85002a02000009b1f3f333f6c2e7963c414d4540303c76e439e1ba8eae9501044e22b144800214db5c63c02b61f067960000002ee0c02108020000628db2a53ca4ed782715d1a8fdb8b04a0dac80783d41ec07a0000000000000000000000000000000000000000000000170490cf08e08c08700400e44494b11b7eeee6d1cdf70ecf60ac5722f00b1019ac892f973f5b85e27a293bc3c1307c5f060984d51b2fc58f89d1cc56fd82350b8a0006ec40021b880063d1c143c3fee6fa9621d7e68ef5d303197c33dd3c3040b17af85187040000042681606836ab49311002e552831560003fce925a889c509c060000376400477cc8e0f25ec0f51cd11c500000b2d05e00121769785a3e51000a016d4bb46bc8808400804834b71f3221c024335bdb096d48a0093ecc780b5fbc411f424038e1a82a0000824816008005e6c801b0410043be2056020030170704784d83e6b62fe4010529c6d020dad7bfd6b17807b9433b5d542aafb5eb57530f8a9be7503b177778c9cbfa11405bbe1b70711218c41ffb64be0cf53b22bc2996be7e5718ef117b195bc109671c913905bf0e189392b4c588b86850b00963cf07012dc685bbc7bd263d3ca705f779028cd95845ea70cff1f85311d8030dfc8c02a104e7b0aee7bd21b648d4994a77dcc77099240b915bd9fb10e79346383840559aab573b490a20a85210f70d0f337e7aa8cdc33d63189ee58330e8ad4a3cd8363c1971c1e26a9c9babe1ce5b486d232767061712a6f37cc737f275a61dc865994418207275d343f1612ef8b32571140736f6b4706696cc1a48a34f6e2ebd2c1734131a3372403eabd1e64521cf7ea0274431738f31064200135dc4ea4c454abbc3e81c483ffa31ef040d2a9fe38ffa07cfe44fd95c039a2e70dc545a136d98630445586818f986fc63b7588a129cc994f4e2cb6dc403f46518821800001e910161101500a17b02f35ad9f966b885ec0bcd6b67e59add9fbdf721d0da19e6967ef7dc874368679a846727c689f498648361214052ebe4e6caebe4e6c62215793400000000205eb86b67631cdc053f03905594a9c0049a1765500000000682842341f5144182140040534b38d027dd19a8c745f45eb54a26abea54c7998351879b63e365f7f80d263d94011a0d356a7452a3aae26eb15059f04f80de56e96bdcc4fabb2955d2245a2e9bfed24f1c30ed7078d992c9002cf2cac9d93f22bef6d0458d47a052130130981402f882542722f203958998a20a097515661830665784d5630016e5bec1080603be0a50000effe2559506718210084883c8a74a0902677b4beee3041c0fc0920811bf1c9f24282175a94d80a128a110042445103765f0812ddca9bcd18229639edd8408889446081410639c18f4b00b7052dda1800a1171f49509c50880200002da4000a6480020d90270580053d90262101290c0901702135097b99c7839827e230818409115d5129c878753210090b7865650e39be50aa706082918b45a4b3221f851a8c067430d6fc77f37c21b0f8a0709b225b3c44821e694b860131f4d9c38ad840a5219a8a100b23baf7b81995889f4804e39f3ae6554112145904f7af04c55fa730500bc61102ae25425043785242c485dc585944404fc6a8c7a3802fb6a90812841000438a8d85c8bd24307962)) <<< 16000) + 0xc0c1025ce7c8953011325ef0a2c1338a69902813b81cda51c0ed7726869c0080021c5242519e688103902740980988de9021608cdbec5d940c6df823a860184ae493cc0040010000129321fdc581ee202046223e81800e01df563001f0080118080002dc8001b590220d81086c0642770e742b625b2ded12cb41608f34fa06ba0118ef5888f2f16ea8ef7319474252460091a058104c7ada0cb147b0a7891e3e60a99841011809201000202978065991f025ea6b1d7ec15a9e05380d5bf1d5f8754c57041f34ae47ad481713d40b09d96ef5e92a7022234134f9e21b086616178a04bb171f284508e424838306c6b92f103bee1189c102522b0a5538023c6eb361800b7bbe6d67042000858a68e6c67b3c40256c9b00a251c01784450c0d1c1dbe58001cd4fb69400840214483f30618cd147866b3a860aec832b2720509d828471e20c9d45e68f0068f2d21628109ed6c8b9c00840200002b840009e481002f491033dd6e243280b545220102afbc6c101157b27990c1b7e7d6573403c3727e02000fd54ea01270c200080000ad9000576203e0200092920241b01a0d80f04f88d011769450fbe2d48a9009d8ea02b5423141f00861ab298fbc0710e63ba700d0332cdcf088016e0df6fd509050800200001b474311001893203d88b4baa300442305002c093ef954624042000800e80c068070000100400e00c06c070432bb11499ad4e4ecdd3d28feb478c4f48b858f4e03fa1a879e589bab5d0c501807234e0a903e947da34ace92a8ebdb17de9862e4a7fb5a87ca6997622c9206641faceef9c3d92eff005eb658143ad4b1751ab9c50623c1c0e972d778a02e2edc2cfd341995def4a8a9157d11509a259fc15f064a84fd9d87be6ed4c0274ead9c89431ed144fe833b6e394799cdfeddc2bf5d679fe308ee33c000267100053520341b85ec0bcd6b67e59ae1435af3329c201856e63e240cbcb6b9e0ffd33f7bee43a1b433cd4238ef5888f2f16ea8ef7319474252460091a058104ce4f8d13e930c906c24280a0a97bb601f58167ada0cb147b0a7891e3e60aa8e21811a01002a57d6db85a31d4efceee3cabe901dd70ea8d748653cc9c1b0e2e25eff92c7130379e47e1a43caa32e5bfbcb42637291f9f1ccee1d738d48dcccf66563ec5f06166e3242863e0c6455aa7008f4370a2a20cc682aa69ad00059c20018324064570000100448c9ef79102800aaadbd820511f83363001d00800004e101801c92140a353891826896650c246c901b41812c23450a080532a4cca5001f00860d4333d24a48c0a048dae5007f6d3c2f18010004000029480b82800073480b00f4207e0ebe708080af53f9210224ad22d0880129c103a51c08fce94af83006305f6171498408802000027a643b8ad4bfd18318ef891a1c25154e5353009abab7ec2808aa6576e2401eb19d491c0378f977a112714200080000af90150500a00800179c8098e8005000ef6c50e712d96f68965a0b0479834c8d9608d417a627ea484686d6a12fed979dfa55e7ca3e19f637a86128000000000000000000000000000000000000000000000000000643e3db6e128d440f8350bd054f5b419628f614f123c7cc1542442810411c0180a80fbe0a991e23a8ac22158c0ec56ee46503fba227999eca0a82cf01cf7f5b8448d8050abf64488f3cf9144d3cf251dfacae4c39679fe9221d7c79cef7898eda8b63fc4ab0a7bbfe1e65cec965c9a9858a9b0d18e334a75d50d6b53e80900c0440602003e241070c5cb24981b2af3a83041b5154a73000035491c2400220084931973296f0c203833687940036a1947a600420080000a73000010044932101a6630610174c8e765000cc61e09c600440100000ab20001d070a229bbe4a0a1c19e4234d1c7a09559ec080c18a8407a3402514c36b4800411eedfe1c0097e93c1c2708220080000b39ded8a1ce25b2ded12cb41608f306991b2c11aac1808c39506fa248604fb414adbc3414adba0f99230e18e11601200c024104bf87a042b4129edf1b664dca97211c7cd719b8a8412336e5f7101ea1c92c30c19203a50002a8342928f4b10cc814371cbca1228b87d8aec5c1811b8fce13c96016673a29d890026184008e4004ff5ee608180133037128225204094050000368403c5400118e40384401a1200c05005828003df48018fe10035a1200978c6872d96064f83044383292883020853531382828a183963e2026763c291220092de53ee81806763bcb520221390120043086a5308d68e198332ec0e3050d6516530a13b33aa66a38210cca94f020da7806ee6200ecce9de28058ce20d4225c7088011417a627ea484686d6a12fed979dfa55e7ca3e19f637a861280000000000000000000000000000000000000000000000000006411c71c52031c3183041100040011c0c0080368ab1d11cf9d8510033c296a54b180214d4c4e14310298588af2460000005dc00000093bef880260827008515127f178e5dc14400f278e3f73658c00d0231ce781430c4fb78595ea48c000000927c01600073e2109db05000260b866eec864384170100000704c931bd23a8c6891c0cd2552379228f5e453ed52050000005dc0186000002ee0040400284dcbd120029dee6f2e002c67106904e184e0100001b33045f0711af4640c042263809122013e1a65c24083d83286e48e20000002ee0104000002ee01200086f6aaf2300023cb39e3a2604098010000370402854000dd240024bc80056d90091900408801c3400c1a005010020080033d0801a08008340020200001005fac9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case3" = "QuadFull30Case3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case3 private def zz2147:"s0863"="s0863":=by decide+kernel end section namespace Green24Proof.QuadFull30Case4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x121a41275, -0xd5c8eff8, -0x140ad74f0,0xcdf4478], ![-0xd5c8eff8, -0x3a548f62e,0x4f72d7c,0x12f05dee5], ![-0x140ad74f0,0x4f72d7c, -0x56b606988,0xd5c91ed8], ![0xcdf4478,0x12f05dee5,0xd5c91ed8, -0x6ae483b4]] noncomputable def hinges:Hinges:=[(-0x15be2a,l6),(0x1741bf6,l4),(-0x664b28,l10),(0xd550ec4c,l14),(-0x527a076,l17),(0x14d3e3310,l15),(-0x6ae483b4,l27),(0x6ae483b4,l29),(-0xd4d5070a,l25),(0x65f9560e,l30),(0x6ae483b4,l33),(0x7ae0f8,l38),(-0x6ae483b4,l35),(0x6ae483b4,l37),(-0x1b0f96f,l34),(-0x6601a546,l43),(-0x14df5ea9a,l41),(0x105576e,l46),(0x6ae483b4,l51),(0x15722e,l60),(0x5a4510c,l62),(-0x152ae7a,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6ae483b4,l27),(0x6ae483b4,l29),(0x6ae483b4,l33),(-0x6ae483b4,l35),(0x6ae483b4,l37),(0x6ae483b4,l51),(0xd550ec4c,l14),(-0xd4d5070a,l25),(-0x6601a546,l43),(0x65f9560e,l30),(-0x14df5ea9a,l41),(0x14d3e3310,l15),(0x5a4510c,l62),(-0x527a076,l17),(-0x152ae7a,l64),(0x105576e,l46),(0x7ae0f8,l38),(-0x1b0f96f,l34),(-0x664b28,l10),(0x1741bf6,l4),(-0x15be2a,l6),(0x15722e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x7246181380cf540180002f418c00a4c0500000b80cc01930100000002e0f01cc0273062010403f540180000000b8004c8040000000d8280f3008000000058004c804000000000580720080c608c0ac03c9005000000982901a300c0000000015038802000000054180630080004c14828069003000000000980520080000001609038c020000000481c0e30080000000005038802000088240902a400c000000001601480200000000483033004003c0841a0271004001f03c08407840100000000009018802000000220a00c300c000002e0e4068c03000000000740e20080005c1c828069003000000064340a3008000000190f028c02000000000340e200800a81a05301e9004000000000b8052008000000190601cc0200000009c480730080000161107029002000000078440e3008000000001e01480200000003c28063008000000000d018802001583b0880564010000000e05002cc0300000003424073008000000012140cc0100000002814053008000000000140c8010000000000703200400430a011014d0040000002a0c013300c0000000a0502cc020000000002409200800001f150d029002000000461500a300c0000001309018c0200134230480324011420a404200335006001482a04803d40100056090160275004001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x6a04401430100000019024030c0300006804100263014000001a044038c03000000007850330040000001916014c02001845804c0534010000001a0b404cc03000000064580b30080000000015024802000000b83100a300c0000000019018802000006c44240e4008000000002e01c8020000000b4180730080000001b1201cc02000000094880e300800841841503990040000000a4140a30080000002907028c02000000000940e200800731504401e9004000000009910330040000001105028c02000000098440e30080000000f06038c020000033048092301000074290ac0690030000000a85c0e300800074290ac0a900300000e8a45405400800000002a2c0cc0100000000b95033004000000002d038802000000074340a30080000002d06018c020000078641c0a40080000002e19038c02000000000140d20080000000000c0c801000000000140920080000000e8004c804000000000e8072008000000003e0148020000006219024300c000001584c090c030000000d8240530080000000d8004c804000000420b01c300c0000000002c0c801000000000640720080000000013014802000000000240d200a091c604e033d500600000c80cc0133010000000320f01cc020000000003c0520080000000c8004c80400000006c340d30080000084130130c0400000000009032004000000001501c802000000580900c300c000000001a014802,0x1c46108808840100000012024030c030000000c8340f3008000000000d01c80200000002600132010000000002601c80200000000044072008000000361301cc0200000000044062008000000002a0148020000000003409200800000000050188020000000443c0530080000138110058c04000094260900b400c000000007802480300000002a00132010000000002a01c8020001047431024400c0f208a0b40631005], #[]⟩ def dynamicCode : Nat := (((((((((((((0xf2812974061502afb12805e5dd293041900402a00f4bdb48854e0a9974e83414cb5ea41001ba6b124041a00871a0ce62f6c8209798691aa4282000124f80202140da9dbe20130638b0ec08001e8bafa600099e6ff95991c009007104002556fa050c0e72728e20653f507b00c39998897f22080000bb804040772cf504000afd6d15040009eee0000007ab93602900210080000db1000347200083a7ca01178c04c282626ea214200391d046063bc81c9280043ae489941078021a580dc17fbcd0801e5c7be40400b282ab1c200eedb8104176aebe500d0401f8da7e0800021a1789c008402104004aadf408182bf5b45430c3d5c9b0068462be90b1302013e10bc0e10545e91f420bd7aa104c20000002ee00c0027bc4fc5200420100001b52000658407c240008a278908f5d9cb260d8164308091bd6c5044d070d041083112890107b13e66041a0086153c17e99a48bf3f6260315111602002dfb1d2000d00430cb0f6f7dc30b00002e3e34801a7b9d430607dbbe690c3004aadf43c205e28ebd302525f995708233bd39310c000001770c801000200006b0800140108309041008000f3082300f0aa3fde80b0c58707c18322a2484504fa1b2b28005debd65001a00858c03502ca061b1b1fa7a16180d3f3b8183b1ea10ec1874b49c988608015ad1086101500e63082001c223420213de27e29001f0080000d21f2859ac3630a7018d30d17525f732c318badec60c714c83940068021a48296125b4030d3a2c9d142161800008c8d430729a22b5e5861c2f145578c5840000242070c1004931515e18200701d773040816febe6b1912004c0400001e920005c67490000b3e858c0d3dcea0d1017812f6882677a726234102ff5dea2037a975328106ab6bf4904000002c58000031207994800f804024c04124020001ce21221a05809048048001f10d8c2edcc7a7036726d) <<< 16000) + 0x26542978dbb89f855ef6425d55c4adadbfe1ebdfe4691511e651348c3859f5ef523b7a4aefe971c71845b8d28b99d7e3ba2b76430812834995fa3023729e4bb1d681fbb65b53f7ce8d5204357dc938f9d7684b74798a9f28c14fbfcca4a5d69ba9232ee803a7fb671b633298389b0853556bf66a260e76c1a94a4f1dab1ffbabdd4efc38ea6d05dc1000827b466f796979c3aa21be23619bbaf32b82ef9b88734718427d12b3e068c265444e08e4861eeda01332f3527535165a310114e0bd17f54b8d1443502fe51b144b075f7a8c0ce5053a0712a1e68bd53a4a8229f26bbce6ce064cc63aeeaf000078b358f5a0051880e2abbda607775e8f3013de40da89ce603b010820cbe2e2a32989fc886127606cc62fe65471c77c73ccefc1532851c51412401800c01008fc34736248a978e5bf43f846774a4954a67fec4094f9d6318fe4e05980c78da0f1b5b582e748eaeb996fedd1b9d2a48a64adb52737620e03228001d9108f0984702f051a70c0e8814018ed7b145b9f6dc7060c3b38afc041bd10baf090001c575d26041e00840a0c0114e19b380c188114689477e070202be4217533f88080efe2881bec008353d64dba9d5b16002cffc2c8c8407a1201810c81500003544234061180305001e961cd494312870242552c902834c7d2ecf0c097565901879f81faec10023ebc2a5346042101469605fd2b96a0450035bf0b14381b3e6266aab6deee6f94186ef529b2153bdf531528988101b404598068c8c21c7142020528eef3f83db9ab4b091a045df616ba783c8b4f331418127c2f76a203f7634877d1eeca18681de6c704520d40001741c280680da90e61a483360ca9e38246033f48778301059c4191f4ff83040cfe530b0c0800a895ff4abf09c40c105607800017c36480002c586101a7b9d41c200005dc00835763d1e02002fd758200004c594f013060f004000048c809088001c84d06149eb88430eff7d8a10e0828aaa8a240020fa590380181813f000101aadab0004c303e01000012f203e0b8180000162c48a01a7b9d408220639f1f160800005dc09006f89c986001291322850000b101080200004f8e083de775b410476fb7490902434699f050053bd10043014899b6b8001494908002000021c422c84001caa78a286e5ff2285040fe89610214366ad6a0118c10004022817429b175f9b1c52eb89c8c2859da19da42054d3b3d9900333ea997000251c1f008000083105815c8886d37d48308b4e9b7b82028f76d6d64004d49a65c2815ca9f0922002ba6f0b200004c484001000013b202242089010001bd908805f09d9e8c1453c4cc64faa3859842880508569e897ca156603075bd44c8096040a19a2da7d1fcd1bd99ef8c24ef98020486e7b15b335dd4ccbd03ddc41b7000000a6f8f5dcea192cc63dcb4131fea141d904b70c5001e43098e6d81ecebf33fceb8c4fcf28cda38e2693d8a940e2598d36cd20b9a5e22dffe3e20be36dbff4bdc4622b104387014800021e1c1067ddd156698c08f837297d51880903172b27e10608967ad745a20c00e7dbe207020a05bdb65170d40801c371102cae20282065d17888b84932d2424969237a0e7858060000228210e6a08609842828210050364b36796acd1c2339186ff8b830566028f9737450866ffe1afa210008983e918d41c078ab7a3c0262801b1fe5051dc415282ef3e0734816bb3add802aa9396158163cd5633a7cf0511a4f3012360325afcb5309149118f9023cd891c00000ee6b280028204ca6b7bf671e0a0438c38eb08fb73340b6a394a63afcf0f42403821b02a3cc00ba715f4c300fdfcdd234a97f085fe0d2633934354309111f9dac490004cab21926042200800009b9f356e4b7472261231dee94592c80000046500c30011cf46e0f0815b1089e8504188b2f255301669c3a2320e0844a71d760d0338b1e22cd290025014518b9ea41a86bbf0a8c16c071fc9259f05af421d5630ee2400000000000000002009e69a51a49849411808e09200a064000401a000334407c1400074e78c652963f38c2469183ad02c8066fa6240b04a7a5636b181032ea64b4c02e1a8ea241c0000003e827002200871856a09728309f926a66d9846300332b4b210e8d58f440000ef29a7100007d69fc02014668b4ca700210080000ae108305041008000c1084080eb1eb400a3101c5577b4c0eeebd1e6027bc81b5139cc076250e58c50c48c10420010000020e0500401a0002926c93ddbd017f90248d461159241e389164fb5c3c2e888a201f6d4f61680201293ccbdca8be18214e7f578f2aca0167e63b787ba8e005e477bb35801059c410305e078000212358f5a0051880e2abbda607775e8f3013de40da89ce603b12442041c41431c12800401058998b9566602d6125071bb0700e68f68cb10b96a1fffa8ee345d8f806b35751442b5adc72687aa0004a840a01604e03ac7ad0028c407155ded303bbaf479809ef206d44e7301d89238e20e18c1881020920282978bbb4a52dd1fa77978eb670473693bc10a029052bf840f53dd4e538c05c3de8bfc676e51303d500025820025d2420087030310c36e60508cd5d0afbe18100000753005063e43398561805b9adcf25850024c94674c5154a36a022ed84ad1f921f8168c684c0280001b520fe6b07e3583e90c1f0760503381051a065061fc18fb8f24975a2eee5a5325928288a786a3c670e07e822b456ac0eb1b2cea927a20049fbd2e5c1acf82710d5be95c9f53bf0c62f0e078458fb52329b02e4b7a5bd1a1bdd1a2d5818500b5836b3a51b7e9)) <<< 16000) + 0x489984bf06cd7c3a05820e8000a1a9c682f914081d74df24135398d0a9e2490e6f1f498576f01139919b647174d284dc8a5b481b235322566ad2f4a5ade20da83963e92ab06a5db41157649d403851132e68586951244721004010045000011e6022003836f06000160655a1c4608400100000a7300801004000011107b01c0400401000004460701f6d35048c81bb2b206101aaf5318608ed9f1d32800673b906380de1d4c34202750f91b00b38a0f804000056083d0ac138560862a0790d83c04c1dc160ec03c08692464124142bbee00207795f83608009433ba50028303c008f273930d665257939c986b32937b0ddf3642726fd86ef9b2139381ad01f5821f33f91407d6087ccfe3b2842302238634ca108c088e18c86c449040c30660430260040000d55ba0418329c7c6acfecb1ba48e123632a0533d8fb73e3165474288f59613718871ba80019c90751983a0cc1cc360741307205e1014314c200000bbec2004994d0c3038bedaa20120a0d80420200200881089dff0c05425bee60161176d8c00640210202aa85298080043fe0504059edb20831bb382410011137f2ca003a0100000ed3a1834e7fe860800dbff18009bddaf0007c9b15494041c004000061107109038028000a7880016d906f1583704c1a41700d17a1e0381db0d1080048606801100001004600b00b83628136b1f6b1000e00400001c4f1002a8c9a4d0266462ca090002808a798c108002000014c60100200800002232013766b6c202ba1fc84044183a01000007920da2206c05000135106b150350a8000c9c8090af020797d1b2202afb3c86c48005992cfc280127bfe9808189278c16812881000401a40765004426110a14769eac38400174d337a1186100042c531e8a38c2855ca296c880083c75f4811860f80400002a083406800060c8338c8198440422206509018828000c808005461000f3820500b02701e189844add6b38fae1b8ecd8129913916c0b1b9013491309526317e94813c111169869983022c201f8468259f3f6098369603a9967e63ef29d53b574680b587631e99a2e9c6cd0065c2d4943040849a94bcdc5af6224e0accd8b760fa6161e18925e364820c76add5dc185c572cabc836d83017c57e33bde960c774002184d677a039d2b111a5ff5408a1eef0ea210148d79a1a8c0e7868002a017b4e1aa08fac96e7726b6be5e6031cb23251c11552bd7c4b1d5f9cf70d1fffafb41469432a051a7cadf31e05ea20efb3e2f40c3a58b26335f27c8445be5fddd86488ab2cd521c91a0a3c9ce4c3599495e4e7261acca4dec377cd909c9bf61bbe6c84e4e06ae9b8e6e874f1efabb6740fc7733c5ca1b145c54ddaac0000000000000001d9e6d7ac80bd816b96bfc4aede8dcb5fe2576f48016c1fcc97392e79570e72bee1921848821400e00a0000024cfa590a522c8d819295f125d80f988acc10729c0062b384106519e8aeee07422b20017ee82824887c3494c26369d6e9d619c63a055b28307b6b4c50465140202caa9e1bf09b4ebb0d5cb98d149d017a69c5bc6dbbca62c2a2dc35f5bb80210003981f1581106100042c70327dfa050c0676058461b26428079c0809700c4428183e0080000d220c81b0630d81a04c044260c4130610583000e863f56a2838165a346500088706c0200be03d32145d3848e09f5c7080c1308aa11860c804308d98f2e3940185500ac08830740200000f24178340ba1a05c0d02d8280005f882d12807c140004aa40011b8e5ba6a57c5c5465313f9ac7250c0d80841065f1715194c4fe443093b036e9b8e6e874f1efabb6740fc7733c5ca1b145c54ddaac0000000000000001d98c5fcca8e38ef8e799df82b407d6087ccfe4501f5821f33f8eca108c088e18d328423022386321b29021800c00a02000287a270c7ac9606d8be823e07539b6137fcfa9f61ec35fe09fb5d90b9583161ac5bc5e54d8920efb51627ac999a523579d82af4af9ee407611f2d164fad18dcf2a62e7530110edcdcf302403424626726a25ccfbc9191b7c6ca1ab72a140019348008759a1c8f4292366561f0194834361366d1ae5d55ed39461fa8913c86ce8edf08304101d36cc8012ef9fe480bb69f9717724dffd6ea1404acb7ab7a5eb6a281405281675a8450447baed868524f6c12c56fbad66d4144243bdb1d1b57500200ef720f5c4aa0d33e8424e1cbf515fcfc6641a764372808c5f55e144a1000140c330e1baf51c83d7d167d0d27b633b4dbf55284623119b56818ccefc720064c441b781049ee779b39003273e22626e9c6882803047a88b9fdcc1eb10cec9cb1d567e5bb2c3102a88e9e40cdca4786e8c3a23083d1f70b8bc13761c4af212fac180c101263ca0b8eaba440ad5004bda06c4a10f3a4cb0000f2e4007f548019731cc696088fab260c44f431b7a0df3188f0437462a2e24bdd500000000000000000213a6e39ba1d3c7beaed9d03f1dccf17286c51715376ab0000000000000000766aaf536a072c3a131866e0cb24693e418052cd456d3040000000000000001e18818c00a0020200a285d6154e2072bc7b3fbdac9fcf47f0e91af934f410f429b1c2817c17847c214cc60095828fc7f0670164a20570e7ff65f1568fc8a83c6264812acdcca82354de936218231d426e43fe92fd1b4443be41281ce019f060a6a6e41e4ab7dd729505a5102e1699f21a3258e8810d7742680a8a36acd17687ef0921fc21de830517811a72397c8af14845dfaadfd1922242a24c12c94001f7880203890057f5321971941fd0c1b3cc6f15061201a3d5b8e04)) <<< 16000) + 0xf2287bb0a015b2553a0603979966800024c4040010c1ac2e031b0c2ccebb29a2026c534d9c2021968513000048403e0100000dc321d363cd0d1834350233818542773740702a0b2a418a051fffe650c08106cc22080bbc1c1600027181f0084862da8f80818502492e2e10016ad999880118c1000400002c482c8e80b0140004a04160660ae038024bc39edc600e9c64b1c400a9271d580048c70800210140100471d1acd220ed802ca010d38c13401c480000328d88091800b6d70bea030c08f0ce59b3d183226d3ec37a486180d1ec218a1430803baec7fb40000a0b36b1c0809204801681a0158060aa03f3ef33eef0d88c2c0000186a0071c2c61058108710a8555243e041014883592a04040e52e9826c304057d970c70105a9a2e751d0a0002beee264b22400a00800a803d3000003d09002085252f1244d08155dc43ae773145129c9bf9d80b080525a7f79f14207f39254e8020b53eebda53a300004938cea78000f48a03c25efa12005405881800001d8c698018fe5585900257a924410a58cb8b840ab18f37f228a26f2ffc428411aefd12105b82ab3740007c082e514801000400006b88001ec900060420a003e3c3f46fdcdc850806f57dc0d30e24eb77117dda50401e42f2d4b0e14087e2a2d481840a22b1c8500410a5c3e3989c40004a3c38d0e00019a90d8be85522400a80b1c7956c6446a2c3881faf9becc983080525ca4caf0410712115925624101ee206b11a500036e68c3bc07007706c8778a04001027a9bc77000264d72b399df42400ac0b000043078a001903dfc01868257696ab71830ffcab28ab0c30b43be050f18200e0df6d802810018fe558018022a0d85ad00c0005f52cd900002114df7480c09002802002980800084080902814814000d2e4003cf4c05004011c763788bca61024600a4b921ab238600dbdc0c8d830c16ddab337b1208000056902818120b218829fe08229c257e48c83008fdf9560df8004ff1d80993cfa120056058e3a98029f960e0d17f2287e470c08c99b12830c0d9285630e048d0692f789040464ba0146055c01b03b020008c905358003af591c49a9200480280001d420a20b0120582800f8e5766febb6cc7193199d68b0208206990e5781d1c30078cf84ac030603249e5b280a08015cc962800e1024a5effc8020000ae733c280001fc1204e0e02a048015816013c07041bf58ba09103c1186cc7d881800004e200618be31be2b04106fe3026516081a5a79c3900c184fa60a920011920a6b00012ab511d45240090051045390c911d16381a5a7be49039289259fa122811920ead0a28d992e2481410000024ef04119cf889a71001d51bb8ea000011e849b352400900500003a84000f0cf14000016290061b23926417a922814e144060185743203133838605455fb90030c81337cb3d8a10157cdb600180465dc84b0000084537dd203024009c08009c0204d0100010e104c0500042b9000cb920019ec400722c82590e84261a8230182b1074cc440100b342ea300a39ce6cc20013e36718000ca3840010a0c27ed0aa861e46ffcf410209ab27585801cf6c93450026e8f40a004a303e010c316b8929b9c208bf0fd326c303e503cb2bf8c180465ae54c4040464cd89460087dd7d5f914000000dd9a0600e2a3bb72800041101d33d49002501402500c12406090030470182300f060383d7a12820032005c84104baccc18204092103160823c010368280003207bf8401336b6af41001e43c28a0013259afeea4008402008a0304401c1061133cb5123800005dc038e003894401010072ee59a28401c1d5a792080707af423820ae604c4020dd1a55eb5400110043c80529238c8232ee88e42470ab3bca500c6bbeb4f0c3adca1800a0408c9a6e280003d420a7001e0080000a398211f9bf10e70c1c0204c6867c90c060dea1b7470c0742b08ac830cb767ac23a08080052c43308806585ad6a618504104f03439020001da57564e4120050048f20106ba57208cff5c8b891c27b13334031af20c8030eb010836280005e12566001e00800008e90003342000c84410c27c7ab00692e18071007c97467a028200f09b6a670708ba3782a9e40c20062b98386420895652c6ffa0410c1ca726e80300001700d97804001e329e0f82404801501638715bb35c871f76bdea424603f7180040810fe1da082a91c78a890002a7c0798007802000023a7cb00420e3ad70a1c04a39bfa4c1c7fb29b50a99ca0c018bfd9aa41c30da5747ad0c30c0ef3b4d3c71c13e5c696cf2c3044845e0c7cb0414af3cfee2dff6480150162870363534238f563df3b88184ca9a728a08d9d6f93240023005872800f80400003e0800191904201020808001abc80078d900117c20025364100140027aa40a067218a3ed50418302c2fd1e4821f8c12ec702d4a658d0c00273bdf0140c5c4cb22802b3100f80438928be9b10283891b9402c60aa0702b1c044800483832010b2f119552c108b0d399ce70bc050c000071cd6c30c822d4edd78a0408e7810538b005c33bd63f850000001c0be4300263ea49c240000e39060aca8a400a008007e0303e0181e80c0f0060760303a01d85f989322ff90089012dcf95f118e290000005890d04b3100172d0e5000f0c0005c64fbf48e023f83534103306800900f870000b148e1814d01583441c1bedb0e035d18cbc2c0204bdc740000fa08250c1e00879202f014207047af58ee830201dae13e2820401d09a78088eef244381bf02cb0e00013881146082001444b0bbaa40604176fbdc906b3d483a00)) <<< 16000) + 0x64b7d7e3800005dc12800d804384045c91960d3fec144002dd3531800c8040000240c02b9808538b4410362684c4401147baa52344000001bb3440004645d23838000001d4c0a3001200a225ddc124030209bf9388000a8b071800d00400002508000fa100039f2000a147888cf8eacb2047e96520135d62a0b0067845e0902068021e48a8c28d8908242a0ba3818ff1e9323041d008792ba373f30929f41b92144ee8c48c1064020000124400052c81c8680008e08004479000a2f2001986400368081c0280dc04001e30401029881b10c00c058400b0b1e51833464f7e220211180fa018220cac5001819438843b14003f19fc10982080021129b0a0e1119ab747586cd5dc7e292682177a6b9c2da402feaf6fdffe00a3184183202182201181faaf6e26ad56e201bc2cbaae9112d6c536e7c9aa1e35c8731ecd06932c10f2335000241206a130340981984c0c8260620bc1dded2560305e8936f2080bbb17fd2182ec5d76110028369ec0280037087c800130e0f0042c801fdda5081786bbe082049bb5837c60c2e764bc143911c065000945078021a4002572bf2c8987d01a858e0e2f504c700903160204001d0dfea594207c021e6000d7cbd30995e45b4061005eee924808de8af3b0e09e46c89165041f008612083b75ab30833cde68e9239619539c480ac6cb12e6383222b625e2c000b45cf68e000880b62c9c10840200002bc40009cce9400358a24a1e1cbff49143269f236c1c50366cc882000773bdd9494307c0200001fc6c6044e284c91b7a1ed65245a2b8edc86127c62189000013ec830025101e00800007d90005b932208086b96389c44538492180fc71ec38706e09388a11b6a9e2a2050814db88c00546927600138c0f004000054c80041f900098434400ac4c201c205f1ccfb1423ca4e6c42010a595d4e0818fd91202040012b807a4982080021820d3a567c1423d5f02ac0818805a9091000325e6630c002a73ca80800367e2a1098208002000025840c03405e1202e090168280b004056020002f120543a0291981400c09c07843e5f54561c20d1a9780503d0058d2c8054cb04680e006614c6b0250c1f0087939c986b3292bc9ce4c359949bd86ef9b213937ec377cd909c9c0d41129b0a0e1119ab747586cd5dc7e292682177a6b9c2da402d72d7f895dbd1b96bfc4aede9002d83f992e725cf2ae1ce57dc32430830514528120187c877845526a59210da94e2495050864d83a26d40da6bbf842977e519fdf311f985784f64e541fd911303b2eb14fbf3571713de3f0f2ee49f095c5c2967b9cfdfd98e4979b54e23b6d45a8698a3d40014a481306c094360481301f05c082673ae906758aa068f92fa94ef21f62b1e8f99e43dd8b904b004d8decffea40ad0b80f065ca0c02c8864f4c9e688e5f2c3ffbf198f846d80653c9b49bc07ba225a9e87cb17d425cfa2529648cf470044720780fdafca4a0e8d7268baec5c3d5df203298dde0d2cc94536ddad410bba8c6219a986a0001c2c7422ec78ae63245686c8c2b31b1ae629191dfa54ef2036cf60aab7d13fc0ec1ff2381c6cb080765a76adce3d7c9247f0890fef2fbf481dc5c7747a4df6581619ece500ec78452c632608a8804008023c01f0ec3848034ef8fbb62041e00849315a67602c004646cc0c019bdb9d63001d00840000401000004440003648000b590230981102ec288b1922500c69109c8010d6f0d00118a0d80400002808001469011110004701021158100aec70f246e9e5822103ff0c800df027570e05f509b1a040ba7a9cb48004a383e01001f01e04f302408840b80200782603a03808008020000088e0812f8f61009017018180892ad25008c506c02000013c4044440380a00018f20364a01a050001779f273930d665257939c986b32937b0ddf3642726fd86ef9b2139381ad01f5821f33f91407d6087ccfe3b2842302238634ca108c088e18c86c430a38850628628238018000ff00978eeae395b1ca6d235c9f3939b0a4fa0aea4d93211381111a2264d5ec1c7188b1caf081690b134a0438cf2aa02060c337b2d0023182000800005810191d00c08805c2402c0a0150100023a991c5ff0ff0c91927a90b4491414047c98702bb243ed0601a8fb75505002e09cd6c20011557258059c508002101001004402004011637cbe10c9189daf66280395bc51008f7813b2020c804200002008c1c81799ca1e18698c401dc22a23001800800004690000ca20003384050040003dc40008ac8098c8048340221b010090078280380401a020004382003750400b2cce4b114d4f6071350558504ca1de94bbdf86269744e16800000000000000000000000000000000000000000000164450c6086045044043002000574cf64f30ad08a5295509d7b3d82c7d09064186014ed7ba10f9033a01d2da338a239461f12261992f1596b9e2459ebda0233b8e6b16f7092a12b8388c1513ed14ee2840dc76109020a46d4da74280b018b18c8800371d267018012f3330c00ace3044010e3c748b01d3f110e28aec6d7fc3e38e1d425a4fcbf5c84107e9fee84cb5060810d21b249981000936af10b5c78c0019573c340028a0010d1e1f37c800b3882050c00f10464d812dd609180143c888e40c00161e4e4244030af5099102116b182b884000113b8d4a04c184a0109180772d28c20667149a824910141bc0ac200d0726437c70000002eda0250c22008000086900c0100014510004bc2000c8a402c840142a0090d00404801c1400c0a00501002008002a248018a8008440020200001003ebb1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 23 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case4" = "QuadFull30Case4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 23 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case4 private def zz2148:"s0864"="s0864":=by decide+kernel end section namespace Green24Proof.QuadFull30Case5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x10cf38a04, -0xd5c8eff8, -0x140ad74f0,0xd1bde62], ![-0xd5c8eff8, -0x389afefd7,0x1b35c9a,0x13029db27], ![-0x140ad74f0,0x1b35c9a, -0x56b606988,0xd5c91ed8], ![0xd1bde62,0x13029db27,0xd5c91ed8, -0x6ae483b4]] noncomputable def hinges:Hinges:=[(-0x15be2a,l6),(0x1741bf6,l4),(-0x664b28,l10),(0xd98cde98,l14),(0x3ac8792,l12),(-0x3d238b0,l17),(0x1418dac2c,l15),(-0x6ae483b4,l27),(0x6ae483b4,l29),(-0xda91d5c6,l25),(0x68eac4ab,l30),(0x6ae483b4,l33),(0x7ae0f8,l38),(-0x6ae483b4,l35),(0x6ae483b4,l37),(-0x1b0f96f,l34),(-0x683418d5,l43),(-0x1454e2de0,l41),(-0x1db6a1e,l46),(0x6ae483b4,l51),(0x15722e,l60),(0x4d43674,l62),(0x16416e0,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges def s1:=qPath 0x1ac14b2ac26053b64e00366b93401a37bcc42815ae9df1ab91dfef0d750665bad6ec4f637135fdfad219e714082403 s0 def s2:=qPath 0x1ab923db026053b64e00366b93401a37bcc42815ae9df1ab91dfef0d534c4bfadb3560477135fdfad219e71408240b s1 def s3:=qPath 0x1a8aa05c426053b64e00366b93401a37bcc42815ae9df1ab91dfef0d2e0cf7bad3d89b237135fdfad219e714082406 s0 def s4:=qPath 0x1ab0fc8b426053b64e00366b93401a37bcc42815ae9df1ab91dfef0d3ad65cbadb09e3f37135fdfad219e714082409 s3 def s5:=qPath 0x1adf800a026053b64e00366b93401a37bcc42815ae9df1ab91dfef0d6959db7addf21bdf7135fdfad219e71408240c s0 def s6:=qPath 0x1adf800a026053b64e00366b93401a37bcc42815ae9df1ab91dfef0d6959db7addf21bdf7135fdfad219e714082404 s5 open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨8, #[0x1401280c803018000300c7031410120000c1828048050880001c0410300041200000002c04603015502280410300101f00000002c0c5010140000000801080c050000702040c0010280000000b020c0405200c703081c0040bc00020046010010120000708140400f0c800024047010010120000502082400e0b8000000070110040500006030c042030480000000f0208040d0000e021c1800b0980000000b0810040d200c7030c1020307ce0e2828603140c3b00007030404004048e14340ca0d18245300006040c0c00d0e80000000b030c04050000e02280490302800000013021004052c04a01100410504c0000000e02040405000000030041010140003808a0304040e0000706080400908800000002020004050000000100400101530e3c28b03280c3b4c18f05280c00107cf022c08a02041c1f00013040c0c00c0d8000000150810040d0001202440c1010380000001402100405000000030042010140000000c0100040500000002c04001014a020c0c10600102f300490104240181bc000140440100040600009020808101038000000110100040500000004408001035004200c7030824370000f0204040010480004408b02000406440ce012c0c10203c0000000901000405000080208040010280001c10403003036000060104040020380000000b0200040500008020818101038000000070200040d0000602100c101038000000050200040d,0x9061c100050780000000c060804053410a040c0c01011ce0c2c1c6071004330000b01040c0090a8000180c2040004160000e08281c4030880003804601040c0e0001002200810303800034045010c04063818b04180c30106c00000008010404053808b01240460102c0000000701140c050000601100c00102800024107010c140e4c08e03181810305c0004c04d01000c0e0000c020c04101028000440ce010c0c063808b0c201000507ce042c248030414270000808140c00d0c8000000030108040500000004c044030140004c10503000c120000c0624048010280000000b01140c052818204040c00209c0003004a0114180a00000005004001014000000080100040500000001c04001014901200410600041f0000f012404103038d03200c20200141f3804c01140c00102c0004408b02040c0e3004a010c1800608c00038048010c04063818c012c0c60406c0001c04303000c120000601080c004059401340c50300181f3404c010c0c00607c000000100100040500000003c041010140004008a0114040600007010804001028000000040104040500000004004203014000140820300040a0000a011c240100d9002280410500081f0000000540830101400000010030404050000d032c24004048e083424b1b0440630000a01200c0040480001c0c50100101200000000c0c1010140002c103030430363004a01041801214d401280c50b040413,0x24607011414220000301040c0010480000000a0210040500006030810001048000140c10400101e0000707100c00b0a8000100c20304101200000000c040020140000000a0814040d00009161c0c4050980000000c020804050000b02040400102901220042030420230000c020c0c00203800000010060004054058d01080c10909c0000000d020004050000c08100c0080980002c08203000c12]⟩ theorem v0:V s2:=(S (K 16 nt 0x10c1c510c901a412284302886480d2091002098661b86051920309e36f4f14cd8030df4c0468390050914626e1a3c3300c901a44050cc23240690006c61786e019203488021b886480d2000d8803f988a19906480cb8fefdb8634100c92b301120e4012e451c8f0cc632406108062602241c88546198607192030842313007a0e41a801d4807c102d6210e253823240610855dc4bbc8ef7cf0001c5b38962f98d8080fa7c602053fd1211201c6071096280da9eaeed0a68b586105d066081005f101b223e81902a0443c8090ea) (S (K 13 nt 0x1448e184033c85612203295398a0710a9c41989321a44941f0cb9a10892430060cbd803c92a410e5606a019203488181aa06480d2000d8d491806480d2000c49722050203120c90184210803be6b96bd255a0401486fb93000571019a25a8b14a7d122139fa1844a44a71eb62960e21538833164cfd2409044ce3d1d04c5e5cb763e0d6d5d7fb396a46a48c2c6033056c03ac95208721f448132ba1c8491121e55220c84080c4a32406108420012f1d4bd885e52d00295de5a6000b3202704a5032030f30c20490fe3f861624444812c97d791fc0b6851020cc142087095061920308420000d8f5658e42800a43e6080a830c901842108007d7353aff7a900290df4c0013e4051c8fa0644e808fcc3080fc444c3898fc498c4251a2710642ff8492240619f030f8f052283004cc01e092a0870c2049107b25033cb87c3243c8a4419081018a46480c21084003def38c7be84801486fa6000a42027047d0320540880a64812) (S (K 12 nt 0x21bfd0bf86f90ac2442733feab40c255398331086912507c32e68422490c01832f600e84a9043956c00c901a440b6206480d2000c4d491806480d2000c497220501d04192030842102ab39f75ff40200a5be600095202ee4cd1b2871109fc48a0780d3222122a144c20c81ab89018806480d22c5a40324069000624ad804292a410e489fe72497c18fe32243caa44190808828c901842108004bc7b4cd3d88cb400a5779698002b8809993346480a58c34822ebca307b9c4740ad3b5b37f48ffb5fb7ee3d60e619386720cc4910d208baf23fa4903fd090dbf5dc29fb4ac1ac2471e6c19800c7250821c256986480c21080001529fdc3d78e8014aa4c1015a6192030842100030d7ab9cdf93b00291cecc001484054499a3246880d54d0f5006480c210000009c4c12457f444230cf8187c78291418026600f049504384cd40c901842100000005226080cd40c90184210800cbf77a866d8b0029167cc0013e4046899a3240a8c5012c1) (K 17 nt 0x28acf200da31950358cbbf3ff15006b18d7c1b465bb08f6606f43fc90240373862109a0b865addfb000b188d2f6a8ab08c7ffb043c833830ce2a522470c41db40601ce43d8ab3c66ae70d94019203309213ee65601b59be69490bf99daf8b8434d1ec284148830070c4006893f62c83d9f33065ec05709520872866189c6480c00022b0c0a1dcc299a14326080313846480d2000d8c0181863240690006c4b910281ed18c901842108a1dcce77a00200a432600090203c04f5422a5c94241f461512407b596b1dfd8450c241983c66ae58d67300779ef3cbfced364bd6881338ef41d5bb6d0834d220264c3389384d1c31076a1c7d079e058c847750ec483053e30910a431074802808b20f672cc197b0202254821ca75806480d2200c5611920348003630060a18c901a4001b12e440a01b4e324061084206e2f4e57ddf04014ab8c0012a4060499a047f270cdd8f3)))) theorem v1:V s1:=(P w269 (P w317 (S (K 20 nt 0x10d0300cc2324069038a10c03710c901a40da0046324873da2ac104731f0b4498620c80d20e4011061a6b5ad06d78f220577d85cf5392ab48f805852a24597a17686e22c9908e18819430a1a5ffff86d9bf3c8dd19aef435f5a990cf389745c84727e4b5c2e79699a31b4d59e4241ddab0896592f7821d479c8bf91c725bc0a881853d07900c7450c4092114041243d0ba0d406a261a4af9d06debcb2cec97fec1f8df7adaee110cf3ca5d748df85964bde087518e9024044e0bc18c918386204908a1641e85506a144034a67a4b7c0eadebd591eea85e4bb10e21ae785cfd6e184ff5fa615f5831adab077ef6a0637b664a8dbb334b0bb92591560465c57eb45f2403dd18310248450820f41c8350a2134045a63d42f8e6f83ad212fdbedb5e759c897bef96a8473e194381982860e1881242284107a0e41a83105a0a4029a625b832192030842100094c57368f7c04064c012821005590740c81502203404805002) v0))) private def zz439:"s01b7"="s01b7":=by decide+kernel theorem v2:V s4:=(M w5 (S (K 17 nt 0x2b0c52219203485e66ae3f8f8309301bdc2f3f4aa0c04018a4a3240690006c4ad805b92a410e13b4a32406108400004014898203b4a3240610842000696dd211ffa3200523a79800290808f9334ac8e15c1a3403240691786ae00c901a44a145000a1005d2b4c39aeb5c728514b68592d30e71ebcb356e2dc916afac7ace50807338ee48affbcd8834812c1fe9c1849121cc3040621452ca16528514228410015180325986480d2000d880df1586043855d043b208922067f0249088492830040a03b4c3240610842000a93cf271ef7400a4fe60009a202364cd2b255408cc6d0d03000c901a442e0d403240691786c191c6480cc14500231008f244c3990b1473bc3628c9019828a5442c88987395e418c9019828a5342ca5c5cb881644996a4916fb2e3819ef5e8c6b0a4bd624a13deedbb6e72c6c59fd2baed6dcaf3be0dbb3dcb14d7b32e60399c7724de16f7ec6a6bf4d4c72efa13b903480a9358f0beb6460c428a11420809e0c2c0cc032406912df25c70b82cc23871931f487e84775fc32486204908a10401804042481fc9266090849504388ee50c9018421000029f398f663ac010187980814066a46480c210840015279e4e3dee80149fcc001344054899a4f40a91103a39) (M w22 (S (K 15 nt 0xb0337006480d22d0d1e019203489430a0014200ba5698735d6b8e50c29890b25a61ce7d87742fea4de838deebcd8f59cc201cf311ce092ffbd510f10321f20c1700c8680c430a5942ca50c2845082002a272c0600ac301de2ae821c887a86480d2207a86324069000624b910280ac38c90184210800ca77ffd6f9200522d30004a901332669812fa) (K 15 nt 0x55ecedb3a06bd9c241ad6508871ad7512cf1599eecaf43560f256d5974fd3a2deb9a0f7bbf0be22f785964b6a9210163038d8ad1cc3c82201b9431084d05d928ec38ef036cd6da0d312f6431ede1b36b5183f5fc4031fda3617c45ef0b2c969a1fe62d6473c916c80675712a491831076d8980d010f61ccf19ab8001bdf3dac201b6bbdbcb26081621720cc04a1bf49a01c31165f1316a520db7cdf034adbfb0a20144c53a12271ac090c4006118b21d17702d7218fc56a961c2d7024487726cfc0f24b244080c430a00dc22c83d8733065ec0b08952087286618806480c0003b980944c10060708c901a4001b181e618c901a4001892e440a07b0632406108421fd63da6200080290c980024080d716554064918c901a40733c66ae1ccc479f857b8053c5fbc8d85494b52ad91edea76cdc569ff389337fef6a68dbdeaf3c68dbdeaf3a34404c986f15089a38620ed4398a0f3c0b1916f25887d43c602b4ff9c4937e4651b1a36f7abcf2214bc6b988c914403ff920c1d1a70c430a016322c83d8733065ec0d3095208729c3100c901a44070c503240690006c68b12088228fd0ce3b246a0c0003192e440a01b483240610842014b33cf75f9f0200a45f930004f901bd2668169cd2c50c6480d2039af335714b42ec47ef977c2ca62ee850b137c66ffded802cfb14ffec2d6e94ef3600a0241e521a54fa7fc9e3062185322164c6c39c0b4946480d2000c495b01d9254821c243946480c2108000080291304043946480c2108400080291300034100e326698101b01))))) theorem v3:V s3:=(P w24 (S (K 20 nt 0x1444219f491143a3abc9124521801c41ce30cc40192033cf97ee29a088b66088330d48324066094845002891a51068400c9019e7cbf714d0445b30481986c6192033012422801448d200e1203aa62ec75fae8728475ff803a94fd20a2211dfc184045912470c40ca49554e319aeb9a40dff1b1bd8653ed62fdebdd35e3098639ccfc596cbdd08751f36395c70a9690212215f8588083da183102484500cb10f490835015398692ece81b7a5289a5064e9447e5fa9f528dcbad52e7f5a102cb65ee843a8c91240708938c82208c1c310248450b20f42a8350a201a03281242284107a1541a85109a006131cbbcc439a1cbbcc43996daf3ace44bdf7cb5423a404a1d04c0de49b20310248450820f42a8350620b48e8055cc4b6b86480c21084005df58a73b1be8081cb4c08c821005814540c8152220340490d002) (S (S (K 18 nt 0x2e0c0a219203482441ce50c43340c901982521149a88d481b066819203301242293511a0067201c245189b868e0cc032406912b83310c901a4001b10e72a03120c90198252114988894880d8e32406602484526222400c44035c8a39c310d8c3240660248450822242a88545dc0a05cfc99f32d4842469ce7cdc80295e3badc41e5c794647559eac816680c40921142083d0aa0d402944076881b89087125c1192030842aee29def315ec8000e2d8b5657d6a40407d3e30102852e58c901842108001aeef0f5af985f4041777d3010200b42035052d0320548880d012) (K 18 nt 0x21938a219203482441ce50d43140c9019828a1149a88d0ab0072228c4dc5c9ac7521c7728fa72a83010c8350c463240660a2949002b184337806480d2250a2845000f9006821ce50a28452622242ac01008a39428a11420889435e86d40d0331ef19952daaf9bba7e35cdc33efb3c9c27726e5df7e121224488fa43d5210c2e80c40921142088900b81215156c6d1775272c01f715c72d1c7259d6a7a163348671797f97fef01ad754a5675ac39bc6aa20df84db243a88fe58618406204908a1041e92106a01d12074e415948439de19386480c2100c4c01e94106a2645c88142a6a46480c210840067bda84ed38e24040eb293010200af202a64cd27a05488879272)) v2))) theorem v4:V s6:=(M w5 (M w40 (M w22 (S (S (K 14 nt 0x5619280324069126785d443c176ccf4f3dd80548fa33b1f56ac7420dfe4a12611724a1d1a80c430b93b02ef27c0a7415fd0b7bf5bf21886a593f3b79cb79d571bd4e06ff67dcee9dceff6a53c0106ff3a221a5038c0e616a031076c0668815b17761cde1ae3939e2ef27b0a7815fd0b7bf5bf21886a593f3b79cb79d571bd4e02a5e98d6fbfbce56b6bf60f6f7a7652d6736bc2dab8838b0f04c8b9c1cc8a0203111d611d1677cdc37ffb1c0c7b0ecdf69c341aebd0b8fd7b49d7bef428415d1c6c6eec9d8177b3e8538111144c33e8691600c18801992c88593bb0e703ce519203004000944c000a85d98214975410e7e86123f9213e444a92a9769020c8102808b18c901842108004e6af6ec2ba00521930004a9012a2e8aa0cc3000c901a442b0d0032406912ccd02e2c5bfcb8897142ecb82d6f3d5a720cfbce4af7bddf4b7f7aefc7bbcb15dfe961922284102fdced09c31128000920310407449130e642d71ca0ed31216444c39d76c5e5196eb4b6a0bae296b7314aca7347bb4af399a57d6923fdbc6f2e56b2e745dfeaf088bd2beedc0e7988e701cdbf08ec487c9c2654a1883b4b28594a0ed08a1040054541811a126605245cd04390cf00c901a440f60c6480d2000c497220500d89192030842100194efffadf2400a45a600095202664cd032b9) (K 14 nt 0x127a1eef5da9733a24774ed624afb53960295dc64b0c50ca2470c40937b74f23ddec3da5733a1ff3a539d3fe74a73c15e896187f540d28920310fad91807b10f61ccf1bd381a418c9018030ed6f5c0401084e260007c2f8821ca19bcc324060000012898200cde6192034800363038a31920348003125c88140f5886480c210842196b3ed46bfe040149a4c00134406a4cbcd460c8f6110eadd978f496e68fdf120c29ce545daf3a1c42d5f27fb9e031bfabb77f3ab8635e5f22de89688fb325e240f2092445bb311b3062109bdba8000490f61ccf1bd3979bf599285361d5b9be1e7daec37e0e3937281ee454e125b5ecd2b0c30a2ea7386fc512270c430ba8000491641ec399832f603265e504394c900c901800000fd3bf63da68a28f18203250324069000626041c6324069000624b9102804520c901842108404c6699a6efa8e8014ba5e6000a4203b641774b03)) (K 15 nt 0x572f7c36c86debfb41a4af3dae78ed033e76956cf9bbbeddec45f117bc2cb230847e664509851a3862109a0baebdf92920dbd3e583496fb317c45ef0b2c882185d94186790ad124062185b13010021ec399e33577f7f7473fc0db17d6034c77550ca578797ca766df5e750c2dec5c48ba28be08a19e494269018861775fdf5ee960da52cc034fe7f10da5ae54318fe163e2d9926fefd04882281ff09012c7752031154ebb3fb360da37d48358677f0daf78d432942963523aa1f5db584145d1415322e25614062004ac813711641ec399832f607f04a904394330c12324060000d5b6b10e0a5494abdad8a19798200c12119203480036303d031920348003125c88140f6146480c2108420080291300034101cc2fc981afb))))) theorem v5:V s5:=(S (K 20 nt 0x5407136b8b1b3cf060e621244fd152a8d9ea7eac68b24310ce9254b5c77ee8463815762ee6dd0eedbfd515fdf21e5314553b6f1252ac4b7fffa1b6677d0675c73e19f437e97d426fe2ffad9ae677901fdfff34963e4b6b3cdf22544c5bfb8f30c6650c428a11404bc46936b033c32d6a5dd03416c5b98b150c2cbe099314fc4c12a7ab47c6610188514229b107a1561a8044cc34f7e3f0da709f8f1fd17fec4fb9e246952f40ca3495836c5b9b13262c647749eeb3f918406214508a1641ea2d505dfa43a0afc514f653f84945030a24310248450b20f401824350a2024b3285142284107a940921142083d001a90d42884d004f1858910c90184210800fb53bb87f560203ad3035a00a0312d891920308421000f6feb799eac0407cc0d4821005316949e8152221e4d0a3fbfc2a786393823816490c00e20e75f297c077adc6a02cf3ef3697a509897e0034277888916405cf061012242386219d24a8afb3cf820e664ef7f29c76187f5bfeb41a53928cac01e23c9def91e23c9defa24a35ad596a42121922c80b901adf54c4e1884a422806a88d248605d861cfeb0dee63e7a969de400fa5fc77410c11011bc22c892386219924a96792f3c216c2c80c5cc88f01b44185121884a4228029887a8c330d0232406108981254b2c97bc10ea3e5c72a8e172d24cdd77cf759fbf654a000b004c41e223fa626fbd16306204908a013721e806a886a036e30d2dfd4c36d52be2daba7d2f90c2518fdb9bc26b9e6730cbfcde84488fe888a7e093a480718406204908a1641e85506a1440318679fad40eade8c59285705e52d30e21c8d85d9ff6184fb2ba615860448b2628410488e6480735406204908a1041e85506a1442680670c2c6886480c210840294eb88f000409811d00461892c68c901842108001bf37caeb96020cc08c821005094540c8152220340482f70802) (S (M w55 (S (K 17 nt 0x2184891087fc21208e08de0d141802441ce18d331e8730e76829e6b125bb7446b7a9378f6d56af7468db330c7fab7d9fbd3a8d7fb30ce37dc8bbe0ff1173a29788284028c8841c58c1885142293511a15603fa45189b9222e4963912a52484312830110601a8c6480cc145372005133383300c901a44a14508a001f200d0439ca14508a4c4b48558020114728514228412d2486baa18eab3807128ebe5a42301cb94cbadcff87ce7e01aeaf9cbefcdd0338d2760c3f99e091d6f0184e5aa9bb21c7acd0a1d2061114363a9208f8614306214508a1041ea2ae8da2eea4e58308ea9ddeb14b4eb4af6619fe5ab6219ecabefc21e163348671797f97fef01ad754a5675ac39bc6aa20f2e891203a9fe158618406204908a1041e8084086a043e20938419688439da19186480c2100c4c01e8e506a5845c8814286ac6480c21084000df9be575cb010660204012c404e899a4f40a9110f2) (K 17 nt 0x5ec3806480d2218064d00c901a449f2d8b8d16fd09227f071a0ff4981e830a921889400049524018c610c9a019203488c347806480cc2500012445002e900a621ce50ce8452622242ac0100ae3941da114208892832151862c38c901a407a5061a8015c805a902fe210e251c23240610845a9ff3694e5e0011cc5eb686bc042e8c040a04acc32406108420012369cffadf801487cc0012a405c099a724e29c1467c87162687d1f442209418088316946480d208d0ab004c228c4dda20806480d22278c0324066134f049dc3814a210e28114328808f12b3e048620027cb7200ee36864e00c901a444f0d0032406611f361d7877f973e177fabc222f4afbb7039e6239c0736fc23b106a1a860f39ca518cab0023844500b8101b921ce2eff578445e95f76e073cc47380e6df847610e2050ff6e0c28c998310ce8452625a42ac04708a3a3fdbc6f2e56b2e751edfb94f6f7a8c6c1b7252eda1aa7a30f86dd9ee58a6bd997302eff578445e95f76e073cc47380e6df847620e20517f61932650c437a114209691cb5d51862d38c9018420189803d1cb0d400e040ab88382108711d011920308426b6e7b84f30f0007bcf7df567202036c3010280cb38c9018421080019c678efab6900290c24c0013e405fc99a4f40a91104dc1))) v4)) private def zz440:"s01b8"="s01b8":=by decide+kernel theorem v6:V s0:=(S v1 (S v3 (S v5 (K 15 nt 0xb54300c90184210042101effceff9fc02a0c98240c9c0192030042008b1695b75a60c26081c718c901842000539a42dfdf3c614980021897220503d6419203084210b351b67b3bd0200a452600095203ba5d1833a241a5c27b8490105491eb6a106421208032406108052bcef9d46b0080201e27e9d25ec5b8946bcc10112219203084210963b84613b7e81005219c980027c80c19a261c414488ea908f2b48a96f73f1e68358ca293066021d130e20a2447a1f8e441338dd299fe8358ca2970662012d232406108420004014898001a08092101f02e4c1058c921e722c75d874006480c210842adf219cc75a08024bf69bb67960ac5060bf62190fa249270e79cb53df916bbe6794fe0f9edb95bf6c1ae652486c1980870a460192030842abea1ad6396c0406c7f52bdb7df00291434c1025431920308421000200a44c000d04051c812c9bd6700c901a44ad4006480c0100a9a8d29cc4e41157f3c53d4ad8270f24c1106133ec90122670a054c4a90853d03d739beff4f17323af419800d12034c421c235986480c21087dddd2b2c739e08131877bcdde9a00525d418201acc324061084200069dfdf3a94f400a4ba60009a202fc4cd01c89904e0af62c032406108421016beacbf2cf8080c98224b82324061080319cad6f6e1e080c3b300a3852e00c901842165f77e477c080c26081cd20c901842008406130002c900e820322421c055246480c21084003e25eccb7bd00205174c001344cd47a8e51a80c60b438c6145c6b3b40324061084210d2b997699c6ec100430942f5ccf5e093b58f7b8e428c0ce8c16a4a019203084210000002a7ba7a3dde142b304024946480c210840074e96a4b959002fa73fa967ba52e8c0018462d00bd18a512ae51c0324061080358fb3edcffa0000014b71adb94d24766080303846480c21084000c674a477bafac01f739c475894209162de6000e03025e61920308421000f897b32def4008145d30004d182510a1d3fa028e372d001920308514bebbe08005e7ffd9c3003ebd9e43c9530441e4423c8507248090fbf5de336a16b0c20320cc42200af3654953f1fb1fc212c101ecfdfd7316d16b0c20ba0cc432084018860942a804fe8790149186019340324062d7a598f820080018ef7895a87130490089960ffa3d92ea0a4348633fb7835a48e20cc00521812c08c9018421080000204c000c6648b281df47a0bc710c40926631b73f62d65040833108802d0c490c58324061084204d3ffb76120c211d67f390104608341080324c12815009fd01a024077640105e79)))) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v6 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case5 private def zz2149:"s0865"="s0865":=by decide+kernel end section namespace Green24Proof.QuadFull30Case6 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l44 l46 l51 l6 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x7cacc944b, -0x2cb416090, -0x196c8a344,0x7860c], ![-0x2cb416090, -0x157f499bb2,0x6c6869b20, -0x1c2b46132], ![-0x196c8a344,0x6c6869b20, -0x14d5613676,0x42972b733], ![0x7860c, -0x1c2b46132,0x42972b733, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x9732454a,l6),(0x229af27f4,l4),(0x1f4da46c,l10),(0x19af50,l14),(-0x661b2126,l17),(0x3922eafd1,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x1c4696,l25),(0x4c57a55,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x44532c,l46),(0x528654,l44),(0x165a0bc00,l51),(-0x105630e9b,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x105630e9b,l62),(0x3922eafd1,l15),(-0x9732454a,l6),(0x229af27f4,l4),(-0x661b2126,l17),(0x1f4da46c,l10),(0x4c57a55,l30),(-0x44532c,l46),(-0x1c4696,l25),(0x19af50,l14),(0x528654,l44)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x480e401001043108808840138c28820c0172a00c0000000026014802000009c08802c6020000000443c0530080004a1304805a006000000007802480307904505a031880280000002600132010000029090009980800000000b0024803000000006c01240180000000024062008000340208013180a0000019024030c0300000d4088028602000000681100e300c000000002c0290040003919028079003003b8d009006c8020000000078d0330040000003a340718040000008828030c03000000001700a4010000000b8640e30080000001e0e05180400003086200e4c04000000000380a401000000982901a300c0000003a24029804000000000240c80100000b868281480150829010800cd401800b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x40e33b0641392348ce6dd6a40c218bf7851220aa773cf8300fd7dc71d84013b5edfe033041100420888e8925ca1038391b67de891843569849c40c158fa063424407521cde39200cae8bc5f08003e37142a4b3841280400005f081386c09827c7b66bb0faec718342b333d3285013de296a071433e8cb60320407a91ee00080c62ca6126e28009b7fa57b480099bd7a85610b0204c018025010000e7102409d221000014c066e0820240c30c48a488388308384180202e0700401a0001bc63f2becb6491a485d7504861bf4b83ddeb0223348b752b1802de048f842c0c0b32031831c01000c00400467e20b85f0b07bfd38ccc1c0aa69b162df8992b3cf21654c6c4c97a7613912f476208e1ba80013b9e170db0948f196a2998cbc9cf43b03361aaa23e0b064db0862a7e53b7908dbe27339de58ab80bb9e8743afc4ae578f97b1023d3a10527dd5e4bc1894ed3fd3df5142fce7123b017efbae0b3af59fefded39ba2bdc14e2a4b32853100e8ed3b4c59e1021c772b678f5f8999) <<< 16000) + 0xf64c9de4f09f3c067c78a3cb09b082c15e047be47d714342ba1f2a02341eba1151041ff2cd7ea3800774abf8f4886f2e3655b44bb8bf434f40b0017215b12c6abbaee492324c6183889490bc27a7c42553dc2129b6567a04212e7d8de102ee4493dd53b0fa44a29603cede87263f25966c126b365e61748b115587d791eec5cf172395288c95ed5b0000f366c016009bcf31fa52802fd258cb88ce81cce3231ac58dca4fd10000000000000000008880993a7bdac7f3a54ffd6370faab4d4cd65cc372af3d06e00000000000000001f90c08608c00a0080201e3b7b4f99cfe804c2e12d061ee6bb4c9f5b66e442b19b0cd37a796c6ff6598f0df16eff21377b1935c1020d0303d3b16d76f8e6af269bb59758d99a5a6ada74aca5cf97749cbaf3b1f33681b6b2df2ac882f31d6842419580849182c61aa299cc26be8f4015633d4ca6a9490a05400176081194c088740420a0200140c3c278d223b4102873e9aced78c3852ce6e1229030c11535d89b4688284221b506e84d1000fc49d13d2103805166d826cfe8a00443ee7e5b1a021e702609816d6f940c170182472e08d9ced68710de8ba8a61b203a836d12635070f152dec80930c100039d67c4060281eb591ed0001a6ac38f6d2f630a15012247590ef64b36b23127bacd880e36c882b83dc9f9ceb6971c3e7b857c6613366b49ed7060c52fcc77db6a215d0ff7d14214bad082f36b7e621ef9400051f4f85bb2baec867d1e002542e843924a2614520c8000147900044a203e23a237c29ec94f228544659e57f609146f38247e342843c35b0d4b9491000040ff5012435db6ea0caf0a078447ce23c62000001782e58322000a808144532a246483ecd28533049b4e3924c48a296d718d79f68a10b38da5163ed69220007aadd400cc24345d6a920d6a2c5034fabda3681ab8000000929a76ac14a92a000cc1100004504078076345b62e1f22c5314b9ffce50b457abb01c40877e909fc920b08fb1c0a1400001e18301002bc04ad2e700230085915f5a1156b02ccb1896257c853e76962af9ead4ce43502853e1d4ea02277050890e403794f42060436ed1545bc580201f1096e5a139800000030de278eb18db8800330440001141b2571338c20856b9147b0b21b85ba219f327d016bcb1b81e053d552d3c00a04a1539165c85e0a832d23040852c99f0ba6d1da4c705000006c9feafc546db00101391f3f55efe3e540339c053dc907004809859127f11660070c4b18ad3ba58ce54f9430b4f6c53d97502c5782f184b6a90050a00217539d1ac0408658d3efce068160371e1acafa7a800000027fb94ba9145688003304400011410004d420011386068fa934ffedb902aaf1d7235d4070e55369a7520c405a4d02c10fd91c2000005b8d800e0812e122bf8e8404005086ad6c0480003f76b24c043e84061681600007e0d10da5277492a818639dbab110661c26768db17f408c108ad4fbc9c14704c3b698c3ce8303477bbd51e7c1403677cdd23da08005a16c1166cd038c4081681600007e480e808070040360200114c20342b0191180c08c05c4602c23c3039bb1141003bf89049c600473e5e062811e55e98c0800a5668d500022129610804005405456c54f08c4d0026a253141208210044020040100000446018020080000222028230130d80902c04407206913233ce2482334d44cbe527990f0cc65004056cc5ab01cbb6cd4d01e9c0f30c8e7ee1afda8db95e89ea56c4c544c131b01590c9b453b68000e6f63371faca34bff4125a0048170f0d03f71e503f07c46eb701eef1d7ac3d0ebb7a56413714cb57368efab75db72a849cbc7f82ca7c59024b422fc354b007c1b1b47afb9a570b0013c224c7b5f12f8c6010b61cbae9e16dbbcac98356ae4fce08040d2e9c53da6f0a87c6ffae6227644ad5888132dca660b32eaabfc5ad5ab5c7190ad030c0d678a4c71588dd3994af3a9cedacf1b0308ec361c2f464ee929393fa624378cd000070930117eed3be1010051ee3610344d88d9c100366703d02050607c01001e0b00e01c051e23ecf2e4fa839f495bbbc23f6465c55fc5006085f6a513721aef509f90c958c6cf300b3e0da84811ea0457360f10d0a5f6a628c281cdce9f960c0a034a4a0ce8a98142d709d5da3452f7910e3be70000b8c6829be98ab3fb2114ccf3510e12e80bc5c06b38337406b877aa65d78cefadb008fe2f94c30f8bc806c0a0192de15b0b04795a42104b0ec00011648002bb101025d04408ee5bd0418f346b558300144e60a1000179280a88041124282200840700401001e0b00e01d0e71bcd9386ba9326202ca6c77d341d9976aea65cbc99fd31a9240222411e27cfe74da192d10b82bf5488550a8f622f997c2bcf3591d596dccd7082e832e70fc6f3a9aa82d01c311ff22e08670d387af020d31dd179d858f74a669ba446f6678d119ce1c09265b0e586eaaf1f8da3a79f0080c4810d8522f2f1c957f47f9d31b5075e7daabeb4597d9586638007a25340a9e851fb406fa92c972d636d5d2ade51d7a2cd6132f3e02e3f55c9b88589c5f2cfca27e4d6ea1e81128489e45c07d66d27a548b3eebcf8c972354cdfa02e6d33a221b2b5eff5de62550ad2e8ae24e6972255126ea523e89464c0e01e6ab6966a5baac55da41cdb9296fdf2d88c427f2a081a8a56595afea416627b9cd8b0b490d8009c44c4b0380008bf200124c40028b4800c2f1a83e7f9cd7bbad9a7feb1b87d55a6a7718a18478a0416800000000000000003e45b71d228125d92dc538ba80cb872588a7e218f63f3dcd)) <<< 16000) + 0x95186000000000000000000000000000000000000000000000000000019c5c5de538022aecb29a7913798e0b25ba8abcc11e84c6ef8000000000000000000000000000000000000000000000005e31831030c318014040044948a6aef8167fdc22bbeb04eb573a9fc2445ee827ace5f310b93d4265e031bc280c733ffd86a21100229b535d6beb280db4bd2e2dfbca32463ee8e2e6bf1676b8aaea01ff7b2d5d5fdac1933f9bbd3734d4cf531574e6806808001d18801082900399f3c7aa5ba2aeb351d071ea96e8abacd473ff63e9ec481777f16fd8fa7b1205ddfc5c2105080644083883842840822001000e32c41ab8ed0720335a99fa504f0418931a9c1fe648c4ee11be7f17770b653aa2c8e183298c1fee3948455e2174aa2d45761c2050edc84b662842cbdd4686b43041dd2cd81578209b909215f101c0c91a8e9d4f408000011223300400399f9a204800000d2f008760e385604800020c3860cfbd65f0e137ba1a3602845f9fe4e188008494b2b210122839d5802011138079c088cc3844010d208f953b143a2268d576afbf347c3103000b8441fc4506184a7ecfb7a398b0800006d1e92006808c75313a804f2c0000115572540060000001c9c38027104001881e349232301c686910d20cb620d0410838b548608003e5271000000122ca1280118040000430e102d6d1e0dcc1e4c18c44a943800126e441c20006875ee104039905a60700002b6a8433021180400004f480402ac7089a57e84b1a2dbf56332461e0f6d3e46041e020b980812aa03d5ac7005ea1330610069eeb18c009c30880200002d27481d868e3eb8d1bde30934513830000000180d0c4a85c37ab2c3000008c88070800003e40034064e12f4198b0000055bf6024000000231c3240098041a4a8bc6a9be9a441579e3ad9c1800003a981a1bade2d785161800003a981a0829b3a22d8000007625b9d7002400c0000b9180e418fa8c561b200000000157b59803e1d2878c3ff4944794f948f871ea71d8e6208c8d463a4000000000000000000000000000000000000000000002c01e0d7a0e48000000000028661060e68460438008160001006806008000b28e0c572715dc2a58d5123b49e6a48c000009e340588afd189b932284022cd0e6805825a84e700ae380510e6139ca2000c31557e4000458d90611b2020a00700003e4402c240010f26452f11f1c329422291868608912422d5495a388000008ca024280f4c53b80608002b5ecc01045be15f3402808a46114e2001ee995848190284a0200001da3022b4476c58c80eb8dd8dee2306000008ca02015aaa98cd41200de1b99000700002998f60300261f3f17c100131fe1a16000f74cac24132060940400003b84004ab8800a0510020171ea96e8abacd4741c7aa5ba2aeb351cffd8fa7b1205ddfc5bf63e9ec481777f17084e21fa2bdca7de2b55a8ef350401ecc76fe5a4813000050408378221650ee6b2417f10247019046592c99a06170b99c31b1ba531d36374a63c11a0e18610a008006002225a83397d4630716d09ac6e78423685c1e0e4fa5bc4b734578e147c4bfefea8429c5ce348fb8a3216ac805cfcf70c768f6730473827f6f220056d1c6f3c3c016fc84f3d03bc2c0255f17eb96f2cdfbc1e125bcbccb7816d8d82e052575562f1ea96e8abacd4741c7aa5ba2aeb351cffd8fa7b1205ddfc5bf63e9ec481777f170840001410208798366b9dcd6405fe1d68106411964b2668185c2e670c6c6e94c74d8dd298f0460158cd8d910058b8bbca700455d96534f226f31c164b751579823d098ddf000000000000000000000000000000000000000000000000bca408082180000088c620a06154c4caa97a17a5a082c2e3b77357b58e2ca41ee509cd8bc700eff442a3bd23cc283af98a0cf5a44f5f47c76e5de2c66b84c99f0041f42de635abb8aea9d10e224ec3db45ddc3264c251649cf56aee7f22c41b335acb2b266519fa5f6d62210b17d5050555e538c2001b75420d301208460ff34c85087bdd0b22825adbb745025060b82810008c83d1a0448c608402001403802008020024140100a806008020000088c8c086638c461812a43f41800209da8f1c0e5583660301b7dabdb5425101f0080000801a184b1d5cea72ef7ff4496a480c11c2ae214e8130b853cd2cb8880800aa64efa3881eec8b5f3b8c03301d9751c7326ad1f0f9190a03848c71b90e8186ad292f4a00056ce06aa1735d719b63632a20031c5b7832f3e8c672d3f901f7414efd2b885d4c28b81e00003303c42013190d2e6856be97a2dc6628281bf154080d65fe3d2e9fde8a02c311fd8ccff75c14903905a9003c66a1fa1c99ca9f04a295bd1c015387009ad5c2dfe9556bc26801471e7c20d55a0dfa92a008133549dc4e14982c894617c4000005c04001fa880046710011032002e7c6863b45e66ac050713dde902a080800a294d701400219af5e862006589d0ab1030000513bc580400586b5e85a40468e384e02881806986b77a9220006920688204e0f452981e3880004ce95e060000098e85c000038d9b930c428c184e02881807dc9728c9100040fc9e0812cd44c71dc71000000bb809000082974a48009c08ce32d098309002000028e60500103f2781c51579323e21c39fcf25538183000002ee0101000001a0b1c00d28fa134409840900200002927082af25f9a438400207e4f03053f9e4f890284000005dc03803d93128f2800056cd3844a284801000013e200e32000590200c0200501002008001e00801948008940020200001001c431)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 18 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case6" = "QuadFull30Case6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 18 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case6 private def zz2150:"s0866"="s0866":=by decide+kernel end section namespace Green24Proof.QuadFull30Case7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l41 l43 l44 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x331aa0d30, -0x2cb416090, -0x191a376e6,0x14af75348], ![-0x2cb416090, -0xb8b9a0a90,0x4c8b92caa, -0x1c80372f3], ![-0x191a376e6,0x4c8b92caa, -0x14d5613676,0x42972b733], ![0x14af75348, -0x1c80372f3,0x42972b733, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x9732454a,l6),(0x229af27f4,l4),(0x1f4da46c,l10),(0xee41865a,l14),(0x64e5cc20e,l12),(-0x6c8da953,l17),(0x3a4801a75,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x1e664d1c8,l25),(0xd3041e,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x2f2aba8f,l43),(-0x36607e6b4,l41),(-0x1a3c1aaa,l46),(-0x2b53b928,l44),(0x165a0bc00,l51),(-0xa2a55f73,l62),(0x8db2ab70,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x1e664d1c8,l25),(0x64e5cc20e,l12),(0xee41865a,l14),(0x3a4801a75,l15),(-0x36607e6b4,l41),(-0xa2a55f73,l62),(-0x9732454a,l6),(0x8db2ab70,l64),(0x229af27f4,l4),(-0x6c8da953,l17),(-0x2f2aba8f,l43),(0x1f4da46c,l10),(-0x1a3c1aaa,l46),(-0x2b53b928,l44),(0xd3041e,l30)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x24140d3008000420c84408900300000008814073008000022011004cc04000000000c8052008000000000501c802000000000c80720080000000c8004c80400000002a0013201000001cc410268c04000000320900c300c00000000190348020000000003c052008000000002a01c8020000000a81c07300800002881200e4c0400000a806003930100000009824030c0300000008418063008000000001a0148020000c4321100d400c0000000011024802000000000980520080000002605014c0200000000014092008003c0841a0271004000000000240620080000008828030c030000000002c05200800000000e0c0cc0100000b83414054008000024c390088c04000000005890330040000002a09014c0200010c2a0c036400c000000000240c801000009444240e4008000000000140c801000000621201c300c00000000070148020000000844806300800000000110348020000e45409022400c000000002201480200000000003032004000000002a0148020000000a81407300800002a011004cc0400000000483033004000000000d0248020014c380840534010000000e85004cc03000000038240b300800001f150d029002001582405809d4010004d08c1200c900450829010800cd401800520a81200f5004001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x443c0530080000138110058c04000000440900e300c000250982402d003000000001e009200c0f208a0b4063100500000001e00132010000000001e01c80200000521200133010000000161201cc02000000002c009200c00000000d8024803000068041002630140000019024030c03000006a0440143010000001a044038c0302984886d00ca40140002a1206405500302983084100d240140a60ce11c0349005000000000580520080000000015024802001845804c0534010000001a0b404cc030000000000b0320040000001916014c02000000064580b3008000000882403cc030001c89213016400c00841841e01590040000000088f033004000000211e038c020018c440d007a401000000000210388020000000841c053008000001c8440a4c030001687211029400c0000002e1d024c020000000b8740d3008000000321d038c02000000088240930080000000009024802000000044340f3008000018c290088c040000000942c053008000026210b015002000000620a01c300c000000001701480200000b312401130100000001e19024c02000000000740d20080000001e19034c0200000000074092008004c0d41d03210040260208210069401400460841100e5004000000028180f30080000000f07028c0200000000283033004000021150902d00200011c5211013400c00611081403750040000000542c0d30080000001512034c02,0x6114412022100491871061802e540180000000005034802000000000070320040000000005018802], #[![8, 0, -63, -3],![-6, 0, -15, 11]]⟩ def dynamicCode : Nat := ((((((((((((((((0x59502d0484b1c48205fee80592006d9cb2922807a3b1e2480e7de762d9282110043090743afcfd2c61d16d1c342c583220082b30307b7d363a2c1120feeec13004c07b53022604240080000a19bc415e0f0ac994ee659682c11fa80c6622a090a57ba9a4191a376e559682c11f7f3ae14c023a2088a56d80e16d9397fa0569436797e2140b5f23f8d055c59cb6eca1f659890db3507d4b0c804504c009589922f465e85ca4a77223c3a90fe37698520e345b72c01cbe093aaa109f22812da5e86f24d3834299631f9a321b02b91a411e08618d48e1dad552077817d9a65c102458f6a00095640e82610813b4d91d7f80000000087a2d620091207aab42312c924924830728628230028014c0800803420c1400026e6f91fc685c0484c7140d8e54c486d9a83ebe47f1a0ab8b396dd943ecb3121b66a0f969b23aff0000000010f45ac4012240f556846658c48a4823803002f71f059388dcb0581a93f8c3f823e142098f9ddf696825a32183e59017785380088989d50f75addb199edf73c89609bf32b591a20bfaba287800fb11e8b3f09107741dda1462f89fa00085276ee609e3e5f2a1b43ef028be47f1a17012131c50363953121b66a0f91428e28e18408c00a00600a6a4101dfe7551d3f4981022e03487b54a72ff820c6f484788f23925be3ae371c8619e800129902915da6c8ebfc0000000043d16b10048903d55a1189229220c20e18c10e0060003bc8ec13f4a934f4bed07c8a6872ba2640b91f9bb66aed1724681268000e81dbb98278f97ca86d0fbc0a3ce7fb3555a017445dd4881f005af91fc685c0484c7140d8e54c486d9a83e8488308304202182bb9463b5b9b481ef992d7821ed85dd9d2f69e89ec7b65612fec7f192e3f9d10f20080754b2abc511ea315646d08209c8a6fece832922207dec02430941ded42c8c1096457352202b81b3a3c0603ba62003c02acc3844010000143201c4208115000246908021c0ca0caa8a7197c569bbf9db070b6e6a033c7b14409eac230440ab491e2dd55ea2ac89e7c6c205392a430b623e5b4b7eab0c505d1a19e44b73510d79b07212a2e93e66e3b9c25f499f25b0fcfb4e49c2cb6e77b2108e9fe1ca6795afb53610cf0a9b90a987b3d6710c1603800006bc6dd88aeeb3e6f776e23cab022e2fbb45baa71d01682a1d00000000000000003d11811010c118014010001674598c4b32ca36f8187f97208aec74c4a834642b0b06aec081b5a34ec0a7a9549a23c97f7f92b531f7a41bbd167e2bc824e29bc19b952b9) <<< 16000) + 0xccddd42634a32128001a7907f2d03f06c1f4360f80a07b0170b2f1c34a40c153a505e4b081000002ee0400400976bf8702a895d497a0fbbb7ea64d02ca76143f38288c4802c20998d0ea504601091cb1481bbf445c70eac1a6f3cfd8460c870c8fbf693890807111f1f1000304596a1ab949a0601d6ed01393b7150d086b61c12e872fc32a1a0ba409090c4860078a226cb0acb10eb00920566ab5ca09342f3c60c4ffbea0ce40e491034d81d2b6da1ce84504570c655afe35ea080d026d5620ea6b5112301960583160216248e03c60df2020337f9806203a06850a5433ce9230922cf6d9ecfb42588101c48e52d0a21134cd42c2c3021703d85bd390049d8d99b680180d21df12197a005cfaa5f8481ce7182a02458c7bab653d9dca1971ae2600968e2814a53fe02c10420c5aa0cb7038212174ecc9d4504818315f0f7020e397912bbdc10011f7fb6727c09f6fc0589482c502056048b1a174c29cba0a191bee6a0ce891815a272d400c14427d9c0c2081448cdb191e04120196c127207043721e03814700996f8bcf444284081400e000073880f8ac00104480e0cc00186480044a9000ab820f45391d58ef14d5481403bd012c071051eba1b9480d5cfc9f798808c5367f66080639285fb406006a45fea002003b35ab0414a030900214394cc21b70285e7676d70e4881a3c098e4a0c9069c74a0e18c7d54419282aec042e964839782869d89c108c0214400278f3f93d143b106761bd4a9423ea63967e8a122000001ac7780e186b8061eacc1411ebc87ef251120c0353a953be960019198c6152006c84a15f5524c0216014000085cf1cb18d65258806ecfbf5a040103465f9cc18336448dbd41bc0000000000000000008824884864064844822001004a68f0557081c0068000d8100056920f20307801c890199545331c8119c5e84feae92185f16c779dc20324c84b1651c284184d515e98c704aaf2a600fd0e010a0bf691ee0c01412db591c4b4a8082b0245113fbb0507c50e071c9955050ac73617c7e48a0fe0a5864488d9a3cb8283060eec03410102442c992164e0848010a2331dc92c06914383310446eaf28580339602770489466d98dce0460c2c9ac0db330409a32de3d22c2c001b17f93e6a3800403b75debc03fff72dc55598042b024000106900039b202803a1c8eb69167a30a161cbad5ec7949148919a70a09c91216ac5dbafc860c5efad1b3904800a69a69702b8400421b7d1e7482008fe97dd55296d08082c028590d5170dab8b1b88aee876142ddef23d841c411ea25f3438621a5833c430c89b822460409d200b26f270423008590b0907c80c2f8e38308525b0c5058d74779d4826a942ca8dae92ae683880dc3aa45a5e0e1909dacd9e6781026255b2df5d4180029563f5c1084000111dd5d7ea1a292085c060000237200077c68749984f986828551834753e524507965a4d332449e5ed930621831856921df520027a8ed875e1000c0db77be208027e42c7aba5a2020a006164920397093f2c86928279d8058d42ebbb8210a18c6db47f539428419601b451c21ecbfb2562582c26b8d3898a3821380a2c882fe5df809c038e01707aa4f140a185de614aed64162b0ab60b423402850856a4c39f003841c4de7e83d40b049719d64dd201008011e4d621d3200025c2e75320e6604821781800009008001f310005ca200175640683600231441ac440ee1a0760d03a8081d0040032c64094d60e64b0722583890c1c0670bc7c1cbcc62f5af0a2231641198034242c80d2cffcb4f065d59a04d8b625bb176fc8458794e5f789202cd6e62e6ee1ccba81f0da117cc161204780512c7bca36eea0000000000000000000000000000000000000000000000005f6f98e500a7702d051041050030051423e73ed15376c3d0563dc4708c9045989ed01cbeb9596c096e5a2c8525ddfd0aba83ed28f59750e49bb3d601508b9ac385b56211d2f6c9a7a28988707db444b0a8ea9b39f646cf78c3fe96ef9aea63bb9822c36911a167fbf93f2a9b16d630ee61a2d8eb6cd540ffdbedebde4114fe0e7eca46393a4c23eb3da825b08c104ab5d70216b0a8741bc360dc0b06d010360081ac0503dcb653165c7961c28855d14a0433d0dfdc7c77eeb6b423c4d29480de268892c8b59c97702a89c07c83907c7be457eda0c93a9fc7fe405321274bb43b2cc00d489b74171048bc451bbc100d5368ac49ef0c1001042446e992d00836d6cad116bec8024557ec3757da790b72b19a96af8305a868c82cff5e332b4fee3d8eff765c397240fbcc99f5e4b4a7cdebfd5eaed9ac222eaea48989579c227dc8199a578b008aed8b7420019f9bb75080bbf55f5d2b1861080400002b883508c1a4360381a0680d83386c198260ca0306401f123d874af94e1a740d77b30c086a6f7fa61400863647ca480846010f38fa39e5463c78f28c00d4f104a3d802c3c0902eee57c8000000f885940088021e5044e167d33c7e8c24cd531001180400001fc8000d09d23e2d5f4537cf91d6d0c07ee5412ad080388124db798fb5ca49c2c3cdd706c667344453169b960122cb4b84a577eee1a14095dd56108b62c11f96d9106dd3bdafc08304859f3121bb0b52a16db21b9a316a249213ca824bd525d5eb5dcb6dfcf27854eefa874ba0dfd8b86357d7a18a0073699a4beee17be41d290a64d11b928826bd940848987469cc3e86618e6827193e0914188137ef09b3d3ff9f0a948fbc9f97bb1d734003dab39f546f9bdfde16d26a4bbd5093b5ad9ffcf3c5f7d33144b54fc50a569b2d16e)) <<< 16000) + 0x32b3d414e3ddc4ddf27e55fd673cced87c8d1e9fb687c4136fe53962db9665c3048c25970448db9ac6959d6debc03380c15eb8bdabadecbbab92be768f645950e87c23353c68c309b26480004509f101b4e1c299a2058927b3e3048e802e51e5020b8c8d5ec70009238f128128611804000044883186f830525e1bb21a77d5a378fcac941f7cfae051600ac5161d5986dd4868d8cb8ddad0fc1afc168c863408f54e0a00201db485c71d6434d6109b72c36b528c9dd52063e18004d1f3f4e548ce88b254de3eb4f68b9103b34926904009cb45a367490a0132308664870aa2c84d05923138801f2f44450b73f0112485684c0ea0dd5022b249222d1593002cdbd5a47b7314162087ea406ca294a4180004c620c423a103312854a5c1ae86840317527dca95c42828dce09c37b6318040880860ed75f98c0d003bc661ec32320030007a8013f30f92310018f1caea8accbb8a015bd81ae981ea08069b9a4c4a22214b693c71c3905c00014c90611183004f6ee609e3e5f2a1b43ef029445dd4881f005dbb115dd67cdeeedc47956045c5f768b754e3a02d0543a00000000000000007b75ed7b612ebdaf6c1c44581a9500000000011a7ac9eb894c816a6845043823022c7ef7522ae884c85aa75a0c86795d069b6c635548f471b9ef893983ae2fa6cd05a4fb45d648b6af20abb9b79afa8953a6816a482d222e7af488e2fd87e07672f5a54a3854d28324281d8777e4fa14362700000fa08beb38e075b77304f1f2f950da1f7814b7622bbacf9bdddb88f2ac08b8beed16ea9c7405a0a8740000000000000000f4ca08704c006005d6899467b9cf22ce92f159f5cc595a4447f10561dba23b6708dcf2108efdbb430ac2a3f3edbb9c72ae7bf21c33ad7cc800b6fd4bae2e19f24db5e5725cc29d3a01c7f7558b4db798b4818170eb6e14cdc1603349088394a16c685cddbb1ba1e3c89697896adbaac8d1b45cf83c1a51c64fccbcaa6831de6850005d420323a05f1502f088002c30e9493230752c2aade1269001324f2509820e80234a106c3d38105fa09156e4003e00802301000045905d01c86a14e756af93a278458469f759a39a202946c8d9bdb4b41961c907921c228c8ae30a0ef00f2e5c2002834eb438d3034858b4dd373c26567865bb40ac691c2c462c235f7cd1a2b3716d4c4ffc03b5568605b6f9a01eeb43f57436b54fe2d1962491f9767dfe8012e1ff63db89d293bee660fe68ddf5bd50000c777387e28849dfbdb4287f08a16173b7a69a23a7c2500e2905d52f440868d019dad4c3cf449460ed07861739ec46f22fdbf7817ff47c3b7688a5e44f623537698630eb8dbd555b22630d3545c00031a105c0d82d86c1682609a130590582b00c12c060010744009fa481292c09027452ffea40a334d5595832117a3cbf67fdcb6cde6e5035704f21a9763b9933e9847ce5d0ed758602b6a5f2a2a84dec0c0aee743a031ce86fd50b9b7b5efe8cdb24c957fb9376d2ca5ac98fae70009cce6e46015f1613d657a7899a56df9711d35a981528c5c1ec15044565dd3eab2ef1b580805045a93e09e83e5cb8cbdf8780e631242ee8ae3942f5627a03910bbb8b535fce49d440e32e0f660099a0495ce3bbdd7850e52befe452dd61e551d8da7637d8bf52391b4de6a480b7646724c83885e3e0e5e6317ad7851118b208cc01a1216406967fe5a7832eacd026c5b12dd8bb7e422c7c99b0dc0d016450c68858840860410250020028981801006e8802de317d0e20037c7c906848e238822981440f35298504178665438c0026d1541428930c11004000050481d84c160078404454f9d11830995975b6602012e16d98b07494c7371120ab9e884a50803a2d567802aa2cc484601000014d20ae0a0560502a80e01802008b1c0285cf9416280698e1ff14594451001c10203789d54870052f9ddac0a00c2e988e12604230085025b15a13081a6f17128204354d3bc8c107402000013c6000020080540101180800013080012e90530d82906c144270bc7c1cbcc62f5af0a2231641198034242c80d2cffcb4f065d59a04d8b625bb176fc8451e022446bc5caead290ca318ed9200a8a743a094af689f93299a6f935699ca83eebbcb57e50aed6449927ace000000000000000004102187e6908302cf5f8596177613fb23d74c1553812412c004014e9e0f74eccc619c0a6be4a0096ab86a0aa7270f5659475f8abee616c711ec5ec9833bd70822e129fab9f59399f239a57f65ca902aa5fb26637e9705d5f3a11af28c11320dd5101d3c2d86a62f289dbf78b6c4ef2ac3c216596bee25ef3ce06b08b10d986a0acf30370cb71e11da1c70282dac02c50365cea02c3437c36f12c00656146b140936455bb198208002100c67365b2343866212eca0dfae9c3f66083c0080500500005b104f05d96e2265904344882e39849010b743ac5ca0072c7558a400009e5078149440840200002144000ce080f80800290cc11d5ec1cb830c8400c914589c8a4a2a4381a40d53a6000ba067618082129010004000043482708c134460981b04b0580075990013e020033f040122dce1ba68be08664218406c7bc05df6070c003fbcd0d23041029e2d72adf060122dada0b208040000000493e000015ccc481f0811049618c0b80a00942a0491102408811c0408c02000233200a610401e674d0c3c8be7b21c4a8cabc108c129353511840b2c0ff9c628206e074a914001572ab624c104201085e3e0e5e6317ad7885e3e0e5e6317ad77681362d896ec5dbf1681362d896ec5dbf211191b02e88647938)) <<< 16000) + 0x348fce41522c72c52051c3143200180d952184ea5b4f08fdba74ef80cc48b3504203215d34abc103bdbc76d29aa14ae82771d4f1cdd0e027d7a7fb0eec53b6dc1330b0b62a2efde6b8a14e5b11b4c40a663006de24378cfed958a1fe7516c086080eac37da4c0842010000131200097668a22d134b250a1061c0f4c391c40c40fd545840c26664711620204a2b846b060844b504c2e1026fb07f1caca051fe10d12f08191cbfe5ab4701a21e661a864a0426018508b051992f1440219a6bd88188b62446ca08ce9271f64047d8b5259102e8009df4840d6c10d4f19c10840200002bc40b00400075241144607c230140d82206c10c2744a84ae1151438e78476b0e330d413b28c2c029dafc080e78a449c1a0558bf728cc004001003401ebebfc87ff650d40000000419e5d9e07d5ce4a19ce9c0b23472871c6185101140100c674e3073e3c0709766f1f43e00ab0837891b0360682e9a097047014a8000fa185e3e0e5e6317ad7885e3e0e5e6317ad77681362d896ec5dbf1681362d896ec5dbf21101afaff21ffd943500000001067976781fa2e1190958c02edd88aeeb3e6f776e23cab022e2fbb45baa71d01682a1d00000000000000003d43061851441c20c2a406920d9341aa52c366eae2b1a6cb68cff454331716bd03084a84db1d4718dd9598ad84e14214004f83918358dc8adf6cc80d80911b68258962eb0bea1efda073e2c8aa68d4405acc261aff7f8d37b65f4dc6c4454284b228b400178881d06c1083703aba7dbd98a246c9b4940818abb79600c12ae9c14b96065c107ae8c026070d152a130a1000400004ccc8d522b510c30aa964fd0c28940c5c5f638642c396700820f6c10004812fec82163801f3305c44e08400100410180d00f47839bf0e838dc3cebbcc617965126791820f80400d007afaff21ffd943500000001067976781f573928673a702e3c08e14b9640b33472871c618520014031f591d018ec2635bb36dc8acbe851d1a6eff86c55c04e28f296ee6a2ad58221066a0004904000c7080d06e05a24c77359c858f6760a21f0eaf6c48c013ff7ca0c52ed6948810a2d184206f4f0ad10880cc75251828b2f7837f5ecdab0016045d9559f4a6ea3061490095beea1d5dd6ba08a3006dc371c993d769ba454425d12b69ce224f9e589e13295840a2284c0000c708004021b145c866dd451279d62cb440d1dda8f2c8c10800200800301601c0e01a176d52a00430b1502ca85e73c7746102801c8a73aa36b661032c46f08e001882c40404b5fe69b05df502042a6ef1239e6ccc8c0029262d880d383d0c0f692f8c643e1d9023ac18331f645a52bcee492030ec1a000056460620bd8b6892164f2dd46018446cf5fc09400da80cc124005bccd7db8e008615b1402800f7415d88a4e204401000016a207e0a02c010002a6901319000c2f10271dc86057d28f120e57d36808ff0e1b43f2421a09decc00d716a88129358567a78a0967d88e835471e78bf7ca529f2530304435b2619e3e212a0be1e9e75b3ca4011095b371dbdd2b996a8562491a0f0380726b479760da00a0f2fa203c40d667a0e7ab4607901cf40ce8bab2316889fd95b45c7b29619441c450143084a483f4609efb681d420442293a222815d589540080825df2dfc7028d8fd01c08068afc1ba49c2084021419228f4a673192a895ed791cfaf3e29ab1a6a65be162161d57ad1e774fb8a4fe5a70b7301b39dbed35f5e3054cb57e6894b58bf079ff1c4aec0a84688b50fddca00fbee6542934d823e946539fb44d5d676bcf53e900812eadb904fb771141dad11aec54fff58918f70d758d97231d5da1ae362c9b854eebb7c602439f151ebbea102580c6dd300c2aa564d7543703258bbafdf49d62d5fafb134b21659b164da657f48dc2f2b62ba0d8abe681cb44d2d0dd0a1d18ecb6ca20677daf97f1133329f78c7b6e4b27f6be21e4a898d7d0a873d92b5e4091190b2c7665536ee98076f8539710f0ff77fa865b08cb593ade1dc18730d2f58086d094ce34d49025392f000101040b00400133040f846026230140d81e86c0f027640e12d1dc16371190cc496257b11e0191821000434d6600b764061631b167218d17d8548613882077518a7438001e3a58dc6807fb1cb0985006362b6d313821180400005b0e1842715a83790a24000007242018407fad8f6efe104e9c12c1e38e18607bcc2699c460865c20414c204106df5422da0200254bb6de000180198e8a4ca83a92005604803b0101a008000904d892ffb65aa615b5bbc08feab627b7febccc3a1c921e1b7e74c642bfb675a756c010dbbc3844485f8197bbf861d51aa4fa04df85bcec878e9057b7005893284221d2fbccf6c35fae50049508a8b7e042258f607d76a3a48b0b88f9c94bba4aa59cbc797ec33b8492caea380c4802ed1a106df636aab8cc7efa2d5bda9a33553b85cb36a6ca88d4b475ad43fd8c297b782003fbb6f5db8b58ce479ff1e8e54fabf100b3ea8be4c3b16b424f79ce8cad898fa82a900c341356a2eee111759919cb8cfed578c3c4db49a6a01ccc1c07eab7f1269e9bd7c5a44f8f55d8290cb1bd249b3e09fd47ff470599689ee4c8f1e58842ad511d3512868a1e80001f3481d08c06847658520d957e461000b55e1529240000008ca058e31e3e2d0596180cf5deee61874a8d0895818086f542871858283b874ac98200295eeb63132004c0200390181c00f0409723bc4c2c4ed94a76c6244cde355ff22c350c1bb5f01c366f19c599301f175a49902c17a64e84a01a3841200a00005e081b8280d)) <<< 16000) + 0x8140640a0003e138400801a3826095ee9ad2290201c2f4f383861163cd1514090710d37a10000bf9e20000036551cc44e0844010d6e62e6ee1ccba81f0da117cc161204780512c7bca36eea0000000000000000000000000000000000000000000000005f130c3083041c30c134030010030080200d00020c206a1301a01c00004011a2d3416bd1242451418438a9428a775c43489c908217bfd8e28410a172947d11c1128369fbf80821444d44e9cd00cdbfb4ab90a00504b7e0eaf4801380a00007bc80e02f4d98673fccf5c34903824487ce6245134a12368911c40cdc0e0ca361040132991b03d1c31bdc8d014480c31029de4340008215488ccd0c024128deababb00fa2400b00a1a6ccf732b4ebe1a481ee4424c63122893f7ce14ec8e2062a543503308201d176e0dda8e18e04d77111c06187af62e7aa404108ec3c1607c12094912f3e7f47d1200580500002212068020004722066120006e3203423a0c113e0b84407e8dc29be28274b7db188c13d1b7f5bcb003cd24ca85001e4ed86b1803504664b08ce204201003201018808000638800639101415d1235242b022c41dfd15f386106d8d7c209065bf23ac218278ec937808000490e3680003e1284709c108402165ee19256aa58e0c7d85c28a1800002ee018415ab3720920953ba8a6e1820f8b61a718000f1d2c6e580986826a61804220040000c910300981784c08c2605c03a04b837784301e9d478f22041d00840100401000004440b4174181fd50d0c1b20e58e440836010f2157380ab28306a452a030864ca73b3c0bbd49eb4b00b66f44c25041e00800007a98000080228603eb25910082ed38623c0c4c14cb8b00b7659bf900078020000192404c140002364000adcd6cc2d3f1adfd46088a43a8bea8d9fb873ba6cb8ddcb9e900000000000000000000000000000000000000000000000017cd6e62e6ee1ccba81f0da117cc161204780512c7bca36eea0000000000000000000000000000000000000000000000005f6283e5552850652c0000000189094e507ccd1860ce04d049034bd8a8775fc0e4c507caaa861a03b6087e6821fb508180a60fb20a202323e7e73a0308016d6ecef84103dbb6a6a020200ef27753960006b22ca3610006fba54388000a083384654900260144e92b7726806329d80c7616e075ab94c816c0e5729819b00000000000000000000000000000000000000000000000174e38fd946b2b51fbe959932e7730dfa7ef22041a0080000000000000000000000000000000000000000000556283e5552850652c0000000189094e507cd319219018e04e00b02c000200d9253c69cbf9057efa46923810da45662735702a2436d3e7be4dd0f5c06518304576db535fbac72418601e570df0fa77dd3d204335bcfa290b22ada8c0805c9fc8ddb51f9bbab9206e76e008611800026c0009147d1ee4e76efc113409911364a5011153a557d3e65c071400e355010c8c50802a9e8fb7fa4404009b26335061100027ac442b6e0200009800561e20000007411480003c2890030038000125000c0008d33e7c3d2f7c023cb0cbf387f680603c76e438f0cfccc88eb02083ebebb4440006f9d97d678025f780fdcb0000000bb8140211804000066cdc9636841df2c2cf0e3bbd5c02905310a0e1c51f0675640000000000000000000000000000000000000000000000170490cf08e08c08700400aa9ce541fed5a014be261472fd99c9f93a03288f037f8fc4905b5ab7f2e8f8ac08cb67e79eff9fe6936486fa4172449fe19c582358baa0006f44004080800a421c1424876e0940b10ada828243cc0c5125d8881060813a30541d87040000031ce0b0264a151184c4009453e7a6bc000051fb4aa8cdc50a00600003864006858c8e09c7e7cbfb3471400001c9c3801214be8d4c86a002803ae3bcb7a00a40053d095d4b78870056f6786beec8a005b3e4fd0c6f104671038e1781e0000764816008007e64801e771004aef20560200301707b226dc65100e9b50c8b3172907890ed60961579070b1c72c84554c69449191a8ae43f37b5a1406f8bf0f7a42d917bde525889648f89fb6200777e9d47bb1252c9581dffbc52cee98152e2b6050d70e460f7d35cac585fbf3fa1ae062e3cb9017440e2c2a976fc7f156fbdb260b5e25980712213a4073d40227c2cb23fa7f061232be855e9bf142d97f002b3ca1e6dc8d3694b89e4bfaeee3c80fb9051fc5f610071564f661a08633e46df46267851694b0afeda1018f0147dc864a90818204d12df9132307182ddd18648e4bdec311c1686b421a064ce31eb7aa89ffd089acb172402a8258b4ddfa1014d52f1a4368589ec9f08003180c397eacca5e923092d7e6571c46b0408ef20997bcb88ecbc3da1d37df42fe9fc150f21cfa0c5fab35204aa96d9038e058068d9f6bff5a0e4b1c8bb832a4328c420c20000f7c80b0880a8051f266c3703405dd7b5ed84baf6bdb07111606a5400000000046c8d81744323c9c1a47e720ab141f2aa9428329600000000c484a7283e8288304284280080a4b2ecfe60c9547d7cded730acaa299fceea6ec0fe1cb6d3c4b8e18d6cbadbc343d1604ae21af42f9fdafd9bf7642997a918c2944360bba052130130981402f883bf4ef20203887b51d40a092403aa1c3063d3af0901011c8664f40000a2a27d22a0cc30420109107c5615cd204cda5d330860836653894102365bccc345042f4d36d514251422008488c7172a9210259c9e7a983047a6cc3ec0810f16178265804d2627860c004c607564a84c28440100)) <<< 16000) + 0x0013f20004d64000f0081382c001f6c813108094860480b8105f08aa4e376840c08a95f0abef88044f3b37a4792030408f7808752e4601546fcd63fee450212a2cffd8be43005989783f8e8d45041ce5d11687a4001afc11ed7a8286e73030038611106080e450461a4584a4857cb86284404f11e152c3803519412a12841000438a8e1e6ef624308c922481025d268b183011592fa462c130198f992813a27d16f1c0f015eda39c0080021c52470c861881040c531e1809ac06e161608ac89a91940c641caec0601905134acc0040010000129321fd8bd7582020449cb8a1800bf244be3001f0080118080002dc8001b590220d81086c06427f603a57b6f8ca4e3b9ac80bd1ccb0a8c108f0112235e2e57569486518c76c9005453a1d04a7afc2cb0bbb09fd91eba60a998410118092010002029811d9484ab4beccd1ae43ccddd9af7ceb4c920e9232991a807529d235d0e795a07f8c189e12291eac625082796cd0ab086515d78a042ba84c2845245e7b6103b97f48d5102537c5b8f38029663ffd18006456c4866042000858a671422b23c40257b2850a2524bcf3a450c114ea19e58000ec7b649400840214483a47c648d1471841c1860aed5f8b672050af9309c1e20d50e46a8f0066b480962810b94340c9c00840200002b840009e481002e7ac9eb894c8167afc2cb0bbb09fd91eba60a91a49219008808609a010040f98966236b6ed37965564e48941d32b22e7c9c31543ea00034a400165080f8080024dc80906c0683603c13c31d0338d880709d8f2ea844283a010c35b16491c0e21995ca1e961813457531a063af8ae69002f3f04712a128a100040000418c07177a202c300003f60a3960287ac2ed0900233f0df648084201001d0180d00e0000200801c0180d80e08512d56181405719262c0902f2c004a611841080400002b0800089901a0dc2f1f072f318bd6bc2888c59046600d090b2034b3ff2d3c19756681362d896ec5dbf2115c833d13b1986408b0eae81514efbec23d502cf5f8596177613fb23d74c15646c0ba2191e4e0d23f390554710c08d0080152bcdba7987f5c9efe8322b0d9fed02713a7d249c013111ab91a53aa12bcc6b070af04c7d7f73b2d5f451869bec94e31857aeee24dbc6a5d454b9154e8f645733f44fc3fecc3531c9d054b910a000a144001da480c8ae00002008919c4d3ba0a003750d3410306f83a66003800800009820300391869e05f718498e383586049999b2d0402c9c10e28003c008c1a99f278a89182eed705ca00f0758b4e300200080000529017050000ce901601e843a95fdd82020a30306508121c393d14803263b218e381bb04ddd60c08f3a90b30a4c2042010000137321f163e1ec8c1818e49ba1805da1ee4a14043e942f612000f621fa8e01d554e5188930a1000400004cc80a82805004000b02404c74001dce61ddf93f6df1949c773590179ffd11e382135b98b9bb8732ea07c36845f30584811e0144b1ef28dbba80000000000000000000000000000000000000000000000017cf8c05b8d77509ed0cc4f4153d7e16585dd84fec8f5d30550910a041047006033048b16f9ace61c23444eb19d79fcab5b7f1ef1a02ee92ea830cb84852d5c085dfc489c4d2895b9526086b2530442cf8d78e9a14904b722a3e1cd099befbf18b387bc28fc2d55547433fc51c267bf2329814075435653da024030110180800f8901e4a920c926170dce360c1086caf158c0001ac2a1590008802124c79f4a54c184060475929400300ece6f1801100400002acc0000401124c977b7f601840518853394002cb9e4a31801100400002ac8000741c287a72ed0f28705ca5dcb471e8cccfab82030688765d8d007ebb4a6f20010fc401207002fbabe8c09c20880200002ce61ddf93f6df1949c773590179ffd11e382155830117c8fe344503639562436cd862436cd41f32461c31c22401c01804d35a4ab1c63fc7fbb9dce3869675a4b4b6e8df9611ccd0ca282ab2d603f89fcc191437d00029630eefc9fb6f8ca4e3b9ac80bcffe88f1c109adcc5cddc3997503e1b422f982c2408f00a258f7946ddd4000000000000000000000000000000000000000000000000be450a40a28a302580480400300898100100680014f100f150004d1900e11006848030140160a00101a2005b1c400bfc880212c1a1de054a5ef31822a09266ae430208b84c2960505590d068a2880a06f6189181005b7f04236818081bd7ed16004428e404e028b92c6d083be5859e1c777ab80520a62141c38a3e0ceac800000000000000000000000000000000000000000000002e08e18c10a10e08a0820880129a3c1508971c1c006f1eb76d3ae7c0e280c393682f203006f9d687838640c769ede460c00000177002080ee086dae1000241c9bca408002e3556260046818270085156881048e00a2005726eca59630037ceb43c286208e4014ba48c000000bb80000013cbdd2504c104e010a2b98499e090a288028a6a3c740b18022e130a5828627db287cb00918000001d4c02c0013cd7f27f0a000b49eb33b70a3841500a0000688c931e113133b891c0cb98ce6d9228f5e3c46cd2050000005dc0186000002ee0040400284dcbd120029db7ba72002534782904e184e0100001b33045f1d707b8e40c042317e92122013e1a65c24083d83048e28e20000002ee0104000002ee01200087406ee2300022f9b175a2604098010000370402854000d9440022a480057090091900408801c3400c1a00501002008003448801a08008340020200001005ef61)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 24 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case7" = "QuadFull30Case7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 24 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case7 private def zz2151:"s0867"="s0867":=by decide+kernel end section namespace Green24Proof.QuadFull30Case8 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) private def zz444:"s01bc"="s01bc":=by decide+kernel theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case8 private def zz2152:"s0868"="s0868":=by decide+kernel end section namespace Green24Proof.QuadFull30Case9 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz445:"s01bd"="s01bd":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case9 private def zz2153:"s0869"="s0869":=by decide+kernel end section namespace Green24Proof.QuadFull30Case10 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l14 l17 l27 l29 l33 l34 l35 l37 l38 l41 l43 l46 l51 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x47393239c, -0x22dc31e1f, -0x430e21c90,0x39f780], ![-0x22dc31e1f, -0x132ea37c08,0x6cb2b4cb6,0x179bbd9ec], ![-0x430e21c90,0x6cb2b4cb6, -0x1229298c00,0x2cb418f70], ![0x39f780,0x179bbd9ec,0x2cb418f70, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(0x44532c,l14),(-0x528654,l12),(0x105882330,l17),(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x211c6206,l38),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x223d12d3c,l34),(-0x536ac3d,l43),(-0x3922eafd1,l41),(-0x19af50,l46),(0x165a0bc00,l51),(0x9754cbdf,l60),(0x6627b4e7,l62),(0x1c4696,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0x105882330,l17),(-0x3922eafd1,l41),(0x9754cbdf,l60),(-0x223d12d3c,l34),(0x6627b4e7,l62),(-0x211c6206,l38),(-0x536ac3d,l43),(0x44532c,l14),(0x1c4696,l64),(-0x19af50,l46),(-0x528654,l12)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x50188020000000048012401800000440900e300c00002702200b1808000250982402d003000000003c012401800000000340720081e41141680c6200a000000001e01c80200000a424002660200000006c440630080000033128051806000000161201cc0200000000580124018000000036009200c000340208013180a0005315898051003000000000880e401000000088340e300800000110500618060000000009018802000000050301e60100000003c1c0a300800000210c80698074910608e035cd006000000000b00a4010000c4321100d400c18c118158079200a000000000e0148020000000000a06400800e027048036401000000001c28198020000000e09038c02002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x104911a9c1d6a65903e075a99640000000165841aaa160fcc2a1011429029020e11000e008020971401006c12446a7075a99640f81d6a65900000000596106aa8583f30a840458c48c48a3821820824808171001006d91ba717764de5102350dc09e22840bd2f782f66820000101d0050220f74a050858043d4217d28380228850a94400096cfa963f8962020a007184d6dcf51aa60a00167698181) <<< 16000) + 0x2ba5e1bb858400002ee0120000001770180001d0d5436042200469b89142d610694557dd3e42786000002ee06862e69c1ce8606000002ee0682016b5be176002400479400000d2f0034a054feae7811a40cd274ee574d1a740e0d922a28a0000007c781c20000c42ff41e000025f906e0d007b38a247a44800000023280912005203800020320006bc40012bcf3ef00264ee0e89d7e05f377bb6dc3eb409243d8e6380180b23481422412010812001c01004c0400803709ab1c19530610003b2525ce0800870015961002688f29240000438566ca0846010d2a63d2a5bc9a483614f3470c3076fa0e1c68229c22297c304000068ebca0046010c8c6b8e89545b9ff3c181bbf5f89eefe08c4f28d28d20d1840c30c708f00d032000200d00011c20004864000db080026a1000b8320019e46ad0c2f9332c63794ef6e02b21ec731c00c0591229220e20e18e10a0080040008e0600401a00024a64500153a2204388352532cf34709087efc80f8e09c1eac83db0c10004b6da480829304b20270703b6466351a8000fe350720000008ca043238c1380c379e81478931366096d28a2b17d465bccadd02490f6398e00602d3d92e90e8e76acf3d92e90e8e76ad03b40e70cd05a82900000000000000003d32451c41c218214010005e8a24c315bad7fe9c5cbca460db269398db1ff0a4aa6351935cc18cfbfcc9defddfd43e21fcdecf7953ed30386713d6ae2bcc6d59cb62f6618e933e8001ff90005fe204833d6e20fa25516e7b64d9736ed5e22f1a089568617c999631bca77b701573ef00c3058a00dc9b6e57505c000000002c3f30cad81e98726d10a94215142440c31c2182102081004d4f8d6887283b8adf002bcaa3e6f47ba15a3479a1d323898e4c4fdab696dc182ac16be1a1eaefe3063eeb37885b546f7f70d5f503806d8ecbea92789a54001068ca8ab1450d5f6307b8b14512015a2c82f5fd29e69378ad3ec2800000000000000000110460450430460050040055259fe5f7e0275c3751d2c82e038bf75e6066ab89812781eb71d48c371f242a6d441ce9ffa394baf739bf078f2e1768da624520958d331587ae06557e81892a88aa0460200038b20445b0212581002807c05034619fa3df0f8e120408a874920c11cfc9e4ca9a8a10ac4ff21f1e1000ac02d86d5e0e020ac544ae340a00a448c64c3d8088928a9391ab6c2512c3af8e1552e5058050b246825be28f4919c14189b9509166844afcdb8814a30d35f6ec50c0000069780b002b086f69b48003e5d3dc2dc6000b4101d4700045523ce204da050a0061851108e675b706120016a941e0143a2f85025d6250d08876198a092317865ff8aec3080000030d4002085ef3b46e883805e198783db000805f6741019102054040b22558f2f854b1f550ede66ca1c003a3dd00d00000017700b015cde988e0a000074931002304120062c8781894ce658fe51de5294a1c0039efb00e2800000fa000000e33dd30128411804000044080f06c000a188002551815017aec2eb204a249f99234710002435ce0102000001388010414b79bec30c00686fbf06410068b95008a011a718260100000c69011158080af0ce1e1d702598282a2388406386284184082200000002260900401a0001ba400261880e94e052d0e61dfbc28a0c0b36880060caeab9ab4a8e10000023280182461db9e8142840f71a515347046b68a63460c0f23f5827680c034bc5602562189102701440b262fb18bb24400000465010235571cc8bc90c6b68a63464072d04ea7751c30008bfa970408f058ba74c80048de4113c3800015bcd001d2104a018a1eb9cdf3c5963000153f0c286bc24e06a858a4792812a8a16e2afb47c88185c5cfa651005567eefff3801180430aa3680025e58d1b73f78e0a18e5e42542142b4cf5b9f82c489edb50ec380b0089540c100479961b1ce004601000016a356a5dd3af9240f212ed3185f358b6084b5e21e93112bc6bde3a0000000000000000001184918a14914910708308700200c0200803400069c8002589a22c9b8bb027943800137106c24459c99ca71440824994b84cc90c5941d1dd11019b64fdbf682424b15de9b342823bdbbb53b8700001a822ca34904270145931d75e972850a8fa5247dc48a1d419fb5650823b311a8448857b85ed285067820fbd2e3042fe0d4343380120042c992ec987a1706180032ac88682854a25b2140e49143c3ecb4e31284124672c78a8910b51b62c8702833e076dbf3c860862875dd2731c0000678676e212400a808000041a4000e6480e0480016e8800640100b0500d80806804032020180100b80805804001e4a405437bcf40a3c4bd761afca6f766e0d632de656e8122ad0c2f9332c63794ef6e02a41824003802801000088eb5f225b36b2c46819e96523cb85a5c3c88b18deced66381773668f0058cbde6a3f570eade4a29976eaafea9b69760f03cceb41174c8f1329821ccb77129c9a113635e05cdf46a612639dc304bf10750e28dba95940c0a9254ff8180330485219204b9bca588e003f5bc2a0c02ecc513a2824e3040010d2073efeb3a41014b8a0762c6007299aa1418007aaa90708e7b613624012b7ec7ca1c0e2f15402a8138a108042492ebd700c48e0175c1c880c0b743e016000ea4e9b240e65f1fd0401cb64aa75098307c02106590cb96240355693e480093fd32148c20780210040100400a02c0000dc80007910131180012590003cc301440843231448460840200240200006d302010ed45f8620aeef68db3f60c9532b7c63f35b620a41832)) <<< 16000) + 0xb9d211040b753c74d2a34c86297b0401cf7e821ee16b5bd2885497c2a0683836aa8ad26d6b134b2867c45483bf1b8f0de62dba885090b505c1000224261c65f815f91b1c3bbb6c078645f23a0e1f14e3ef654d58300223d6c32c9432a9fc54c957a5d4fcbc686104b7d58d4daa2c0063e9da6b5d8889c56ddbc60b5f453f62075b03ea1231d9e420cf2c000028d1011198080ce422dd56bc2ec0b0903866fa0aabb0186e814bcce801d5e7ec9640bd4b38ea85b565082d369e6d5e001d3914f6521164eb3e495ef42d3dbcac0bdea76e7a875d8700b8e5280979d55ffd497d4575c1bba30a5a80e96c421f48748155f19c6bd85bb3a120fa930006dafa0f7699bcd9ba4a95b0ab6749bd36129dce2205cf59defc8fb5f11cd2eaea8695bad6b43c9279d1bd97d51cd1860c396d9774e3308ded8cb7d771a3a64a0872880e008020014140080200004c386c3e45e291820e57613600003df5531040449941000200002dc80034190011cc356a5dd3af9240f212ed3185f358b6084b5e21e93112bc6bde3a00000000000000000011929e4b0918c58b6aee2c4c2b13aa13dd197f47d5674a7bfd3a400000000000000000044b8008c40460050020011125d4f0a18adf00195ffb0a014071e111a64c36ec02ea2d105ab5eb0abe378a71800c0403527f5fa6bad1580abea1e311ea2e35428c709dfb2864a872e5fb25ec5929caa7301cd91d69f989d9e654229fc06ede80cb2d7925c58a62c2ef18fd67e83466983ca0038ab2ac17885a4c83d00f010070080018cc800de91003715381e793cfa1dcd5e3a64bc4e7c9448f3488131749f61017581720315f5eb15230d2b11bba7c308f0549d3514086a8f03f3a41705fc46af9e02a60d2d2570ad9b10c02c87459c53ddb222ae62e06afff72a0fa0a32e08040235dd24a4b9f7e6f870a18a906a5092a61ee46d00036f700c1caab0e06fd3f35d92ee393f2931ec868990e0bc7afc5d08d1c846467ce0e4d3997bde5c5a4a1c7d898d177ebec0000bcdb015279da520a020072c8d677cdcefd197fefb85272e2a64eecd4884abfe5ef58300000000000000000000000000000000000000000000000000c521ffc82f70ac6ae3d7dd2fe1d09ba3c8c668f36a6b114400000000000000000000000000000000000000000000002e11030e20e10a106002002435af35ea5961c21012c8fa04386b982057e2139a67902036fff837060c145d408d6482005463660200973398f8b8c013846de7d0129c409404001a03a10734932a19223d5d1f00d24323c77f290505e453cb638104000041371201648d495c1260c2300850c309b179d12258bb46cce505213a14200803cff195f210064ae1d96812861100400004348060680009f8805848001114800406100a250048ac02005c392f6f366d51fe4af099051bdf6914a4891cd987884eeba387b668f7044e5bece1e184c5009827f26258c55d5e3c951b65e52f7cf1ef85bc97210f0a51d82e31734470b55d9ebcb1003d9f54e365b6993acdec54f1ba44ffb8a88b1269c1f5a9fe6aa964efe7eb96a94e22a8300e6ac9d8438ea3e12c279195908ca7cccec8491ae3586751a9293ef14afa25a2007ad90044409bd0028c4df0a0f4fc576908d723c605f4620c35857c3fc378f2a8f5cda7d3f0bc9d2f86cced7e61e90dc094069d6aeb0d07eeca0eed7eda18f4f9b823744515d52168b1ea25c506680e7ac515120d004b36ef727528ae9beccf0c3a87bd700000000000000000008b70013c5c5cb8c3b816e8f740000001995054d617da0c21228e08a09000800004ac78e238cc9c7b12897e88a5d52a3ea4792aeda3453b357cf54e150d5305ebf9fe4e9668c0ddbbf72b9bad3ace76ee2bc8894a4d49368c1b229aafeb7a0c08cf7127b8a0cfcc05bc820118e10004001414008020000dd38201a60c5568880db75d3a35174592deadcc9e26a8b6ccaa3252c56a47412fd483c992bb85170f841a446acc1ebfc9d322cf5eb7b69a8dc2d947d9ecd86a6f81c802d7a592f18c0cb8c122d449944363add3fc4394f992c575583b06297db1960d3e5786cfa4d786a8507059079e8be491d9b2c645573bc2e7c65bd1c87dfdef951001b610964090f99be4073f9e22b0dfce996d24fec8e1b53a5f5ed5abadcbd5f2c575d2643e6d6952f4522821a157d4f7d94150707e75bf969aa4f2ace384f90800012c3579358cb1c7eedd0610994689ecb894bc0756360903ef9ffcf9228467ee980608de7c65c629f45df76a0ac14e3d240e8a21fbb33d5ec8b585ac5ec510c86c857a3493d581d9ba1dec431ec54f6a46e210643e6d179a7a6e7af19ad634123cef5c09b10af5b37a61bbcd6df87990cf22d4af9eb86f9fa67412c64bf4ec880a008022018020088024bebc1b0210c1e00800002890070d0000519006110028280100400023e4002d3c80081f900172130f2dc0f86dd2d162fddc2d05d3ac471b12a4f9bf05abf0e00000000000000001fdc005355c8d1cff6537964fda0e598eb60169947e5a71cb880391cab00000000000000000000000000000000000000000000000000003398a08a008006002223eb67605ff450f702fe5863baf1274881d1c1682cf7ee968f6c91bde461f559193cc329f323885e86f338f4dda55c7c87e6207ece979351345b748d16cfc659c88c83455c8f6a3798057da64a3ea8583fa9813d4e6a41e2d121441d3b4a663bb84878cb545574552e16ae7ad096a6acfa55a86c067fdaf2516fa08421884c5b00347a16b1a89400c040040200075d200202000010016471)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 18 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case10" = "QuadFull30Case10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 18 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case10 private def zz2154:"s086a"="s086a":=by decide+kernel end section namespace Green24Proof.QuadFull30Case11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l41 l44 l46 l51 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x54e7c4a39, -0x22dc31e1f, -0x42a4e6998,0x257aa6da], ![-0x22dc31e1f, -0xb26318d78,0x1655298fc,0x44b65bda2], ![-0x42a4e6998,0x1655298fc, -0x1229298c00,0x2cb418f70], ![0x257aa6da,0x44b65bda2,0x2cb418f70, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(0x1e25cfef2,l14),(-0x6558d2156,l12),(0xb20f1b1d,l17),(0x35696e78e,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0xeb996c84,l25),(0x2ffefe6d,l30),(0x165a0bc00,l33),(-0x211c6206,l38),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x223d12d3c,l34),(-0x3a6b1aa75,l41),(-0x8bc3a680,l46),(0x1e7e0e52,l44),(0x165a0bc00,l51),(0x9754cbdf,l60),(0x6c1fe5eb,l62),(0x204b58e4,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0x1e25cfef2,l14),(-0x6558d2156,l12),(-0xeb996c84,l25),(-0x3a6b1aa75,l41),(0x35696e78e,l15),(0xb20f1b1d,l17),(0x9754cbdf,l60),(-0x8bc3a680,l46),(-0x223d12d3c,l34),(0x6c1fe5eb,l62),(0x2ffefe6d,l30),(-0x211c6206,l38),(0x204b58e4,l64),(0x1e7e0e52,l44)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x881a40100210610540e64010000000000481900200003111090390020002d8541806c80180000630e4022301000000001c181980200002a1507029002000000e4240386018000063124011301000000004c8819802000000000b014802000000088580a60100000a8442c05400800000390500e18060000000026014802000000130881c6010000000b874093008000000003a049004000000191503cc02000000050301e60100000003c1c0a3008000000000181900200000188a4034c03000000000280e4017246181380d734018000000002c0290040c608c0ac03c9005000188642201a8018000000006805200800000000120710040000001a0d038c020000000008812401000000000140d2008000000000a049004007c0f02101e100400000044140186018000000341c0530080000029088149806000290c8480a50030000000685012601000000000240d20080000001a1406980400000000150248020000000004812401002a06814c07a4010000000001a071004000321484c05900300000b0883814801000000000780520080000003c2207180400430a011014d0040000000000e064008000002a0c013300c00000000028190020000000a05014c0200000005028166010000003209016300c00b81403802ea0080000000098024803000000000700a4010000000442c06300800000000e00490060000000012014802,0xa41806300800005102401c980800002a01800e4c040000004c120186018000000003c0520080000019048061806000000002201480200000f8c88812801000000074480d3008000000120a069804000000150b034c02000000000c81a40160c4241400c70401800000000540290040000000120c0cc0100000d088280a8010000c85221026400c00dc288820232008000000000d02480204d0630860114802800088321101d400c00000001200490060000011024038c03000009c08802c602000094260900b400c00000000f00490060003a1a0ac07900307904505a031880280000001a001320100000000034039004000014848004cc040000000d8880c601000000662500a300c0000002c2403980400000000b0024803000000006c01240180000000024062008000340208013180a000001a044038c0300000000f06066008000004209025300c000000003204900400711a023014d004000000f06a026601800000074680b30080000005a240318040000000007014802], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x6c6f1274000000047641d0f65cf9c9c0f89649249228c09601201000a0082381c01006d1235291e5240a0c9cf943e78121052e9c034f20219472ca7be28408f6eb4190704000005dc01604f5a31ec6e1c05c40e703c000488142701c586137136dc0294) <<< 16000) + 0x0200000e0f1f01c1437e1e51d8d4d0845be5e73f8a50015f484e9fed10000afe150231800240bc3ccd6d00b6beec0a4153327082d03479f5dcf7cf69e40cd44d1c47867f58180d1c180d28217008216452d641e003506f40470012bd5755160000000fa0601088011e7e649312a888600000bb81e1acaa531f87060349e5341e005a02cb385410880100002104000ad4ec6f1274000000047641d0f65cf9c9c0f88c18a11a09809a01200005b7652cc0c82f91f244e3a2ebbb861f0494000594e0e0884c7b870c2cd2530861092285d13c0b0ce0a5458020338c665001f00840000401000004440a417e44fb743861849deae439e06d1406007003bcb86f980006d8b5a580432597913020f0043cc468f1d8792c7d06d430777dda091820d80400002608000e918020080230116c502222083a00800004a20dc0a00009c20007dc4002914ec6f1274000000047641d0f65cf9c9c0f89659620a18611a0860960140180401006e982a6bf6b32c428e34d410610a9c4121cd0671c173781825d2791750000ad4b38113021080400004c48368481b0240681206b010001561000eef20c203a181c7f35b62a50662a96e80d1282fd9d6314600e08000008ca00a001b923c211c4803beba27ec018009ee5f3ac804009e3969bfc1440b1a56e8a852103052040cc256e0000001c114521d7b120644b24c20e1cc10908c0050040030100200dd1867e01b271a2debf42d3024506a46f35630a1439461bce08280d48b81a010a95763a3000ba844c8138011804200002008000022207a0a0001bc20d413d8de24e800000008ec83a1ecb9f39381f130c3083042430c13002c010030080200dc127c331e21204045297d7890c268c30a33811b8ff2be4c042474634200008c23902098108802000026e41a4240120200028820122200059c3984adc00000038228a43af6240c89431829419411401200c004028860600401bb1bc49d000000011d90743d973e72703f984adc00000038228a43af6240c91621618e11800e00c01d72ddfa0e7b77e5e1aea91e818de071e7bc4097c94e95f384eaf99e77b38ffd832286db984adc00000038228a43af6240c89649841c39821801000a0080060200401be706903b7501a69487f0b751a2c0280f86e88207b784da71a00fc4ef91c18000693ca680a0069039fe01382120043ce47918ac51e6061a95508f16499e3be07849913591924042100800006b900026520006f0409c44012220006192000e6841a054001e3e77f7d45bfbea48cf49d59bd024068f98fed6cd640b376461940773f2c0cfebd054c8188107086084086066bcb6919139c6a5c39ffec822710474f23f630d3fd5cde421b846246adcb04420cf6061b49e6bb1020e15a5d9080c390cf63038524ad51b21022b8955e28c0abd9f8f60b01838345c6080ab9b44e54a0208402000031a418407c504b0f8ce8d6ef15c403c89ac5d88e110557eef0941ce2e9568f6b1aa98904067ef34090eabf5d642be0837fe2822b7c242e3d6e71b9ab9f87d141d0c138e1b6fc4b3996e3cd71512e40590054179799c2611af0b035758b52700881c0fa9c541945ef917f7d90b91f85598bcb39aec0b4f4c20da2600003b520ce2202911011068178340ba120008563831083835c490b1192e1880c222d1c7b3cb0029dc89eb28018234607c8009baa65db1400c248b46052710220086100296ec6095548b78914307007d5257910b63dcc9e123a15b6661611b9efeea8040cb1d55e6882f7c74378210215983a6803e7e9c8de918006695fdf284ea13302e860776aff246e66e849fa28471f6ba1ee55e8320d395fb5b760b04386268582471293a5251c4a207a653103399613332304200080330080fc040001a24000fe483282c18407e78cac70ab40b4266fb7b952a361ceee130548c1c71040c608b00900601529f67eb1bbbe2980aae0a43755af071791f1cfafb8a2e88173095b8000000704514875ec4819adc3098cfdd2ca7d23e2c055e78cac70ab40b33892c92461852001403648f18a35df9cfdf1f4166cf750559ec386fe5bc48e739cdc35ffecd29f1125822306eb64a0a3569e9234155f2ea8c296c10062118210004018c040001787484d090e57102893c095e47140cb4ea502891936cb511c3007252d082083c0a59c0d00f05a093c580dde3bf4b2804210080320080240400036a402434000a5270860f16c7a64068425bc1e5c8d0c388d6d2a3e0dd9043fbf7c5d6983040e868bacc9c1788a41c3fa32186040ff7c2e67c06c7f2578a194e1602c09bd1d012aec71286c38ddbbf50481f0cfe98c8325206758400e4f8cc312c1476dcbcacee2ec99b6e4a10b561ea5ae77f2e05e6146712440a26d1759b65272a2da4279b0f05dee9fde207d7c288df109446773c56ed89109f6e18cce5e0f4fc99a3840a50c078962e9bd63a4b2394777242785c62ce818531ce77d0a83445f43ab8d85adea9c2017ca641838000385829c382981a1bc7339624ee13b5cd1ba267fa61b689f4e4b3abdb182ea613288e688324f11643506acc28143e3e24965dc35d057ca11383e0e28555fcf5e707a10cfc4e245735389cbe3b6eb85cb24e439cd7b2604c0e5046153d7bb32c9e75bd31b44052dade558daa6c7579c5037d1d89b8553c59d358401e533a2593380f5a8588463489f273b7cd72288dd5ffc3a704480a07147b6ceacb389351b52dd1230ca6f24c86161406a0ac58027eb0afa9400840200c602000117200081e409c340c41a0008d720018fa4004e3c8148ce065aaca78f0c18a93a40)) <<< 16000) + 0xd4709acdb433e30535050de72010351265f040856f10115981084021038c97dd3d252c61372cce2b840c3136e5208460c365d6c4ec0e11db3038588182970fba3a344028c114ab598206409a510711604d69eb6716764821380e00007cc83080f0704b8bdba048e2bcd4d5407100caa301e1618cb4af49d2030284fe14838678fe43e8820a5a1aa3ae33821180436e6403a4bff6825cd52b8bfc11f8501041400257236836e7617960a0a91839238e21018e18a18c10c01804010068000b79cc256e0000001c114521d7b120668004ae46d06dcec2f2c141522c62041831c2182141040be3243ef736586f62c0e75b191d15e24d15d75d82d01ce77970d03843b0b7400086880029590601102f888088340bc1a05d09000481905c1d00114d1e143ba01ef5239f45a8e228c78349bb0608cdc8f1106337f600a867a1161763c204025d3dcec302bd4cbb915fd47dec60c212d3f02aa619c91b873ebfde327620e02614b0adc569ab02adac138f5d35a14500f0cd5b06503ded5149f7a2c33ee101fec538abb7a3e64f526ff31cac664fdce37a38b34165404408a50ea29805b0d02d028001078ed00ea177e652606d1db87f38ee37e8751803ee26c86038400000000000000002008a08608408a00802833d6ccded200a46d310554c1178fbf1e20a9e6aad22b28fec82a6288642045e5569095c2c985ad1743a484253a317d3ca582b53d655a96d65a2b55bf69f327c54d9bffe553bf735a33f9d17f0c424702a985210941640400080c4160260ae130560502a80a068126e16ec3203846098c6a7489860913add915dd40a104c05a0509ee201019940eb1b3440023656d04d970700bdfb3a8e0fb8a003057a078c4d511040ba6720d74cd6f94161781834b1bee1e024b1646ee43b54624b1efb2292332c50e514028e0111c5000001a5e00a1000001a5e00d003d65c2ce14500165c4653a8200025e86588ca26c9102901c718642f1fae58071613e7f492460613a5788282f5e69000000b71b006119ea9dcdd74e5907ac290d3834306000007a120008211cbbb115b84807c5da1ed57407d121858050f343786b19f69a556cb7f6daf34997f2927e186120bb66a1d204041c10930469e0000001d4c03402b5ecedb666000b72b9f88c290104e028f34201541ef8d2a06f15f8c4d26171d5f254c2412bd4f85091c000003e804041078b84f82608240080000a290003202000ac4415057179001e72e73835acda1ebb40844a1ca189186109041043001000470300200d0000fd3179001e72e73835acda1ebb40844a14914814b10808804b00600044c0e0080340003fcc8879aa719a71481257c5f86af90e21fc329da5252832d1c04dbf4c28624c24866c0c70421bdff80611407da657241e000c1a8b3c44423adfb7c279da3e4e405604800020f203603890637ccb729cda5d6e539b4bb046250e50c48c60a306186480200060300401b2483f1f5b8b522050d03d43f92e39c12309dc9f35b002c60a0c317cd6193d10284ca5fe9501e630802a9e53c5301882003f2bd0459ac380660e9e6d31180125dd01864080000225202e0a0160500a82804c1564e3663447ea6122d6325d7f231902850067fff8f962087ff5877a80e2084ef17527c0a190bf6a7be6c9603d4858d53490c02762987d6288084579f47423104388202c02c0001131a237ff07dbd4209187f8d05bdda4811227fc133788710531e58bc50ca0c63d22df0d4060c3d3b3475e204081ffd1275f94500eb8ec61118044133af29ca1880c62090b00a000044e4002058800a1f90531dd0ef111be16ff2c60a1e2c90d814346632ae8a64b14a7c1bda08050a29b651f7580c37df359b4d40611152b7fdc805000d7d8d17a00209f88f48bc8042901850f3fd1e01b258c337a3fd6050ca795a04b858a1289a99be50ae70cbfeb018426de3c6e018023540fa744e084801000017336403d94344dcc5109130495d3e14397fcfa8bff230c7e8cbf747e142c75db1073f6488c8e93980721600d6716d3d0c3801a5f3088fb8a0013f151f95ab39210540400002113850351f936dfb2c91f6e6bcdd7458c744967fc604a1a4c338de3bb16287e008c3a6628517768e1b2183845d8583b67a45000f2d3eba940092cde84c4a1d00856048c295e7dab9e964aad2f81922c65e0e8826450d92c4d91dcb149b7fa14e142be88442b01c24de8ef79a4e084601000016c36405eb5c7905c510776b817ece143993233ea6c630c4cda6290a6142c0a2df1dba2488fa9b96644a1600730cb3755c3802918c7513b8a001b4e1d5d7ab39210540400002112000b806c985990dc4690a159d73fae530245227754efef0910fb2e618f3018218bd184f5e020451ca5f1191100035f6345e802001ca7ca2fa50104fc47a42f100854038b2641e72c684a208e9b370f8a15a9ff91f0491449ddb58f49116491932bc6084a62ff93c2046a707385c9c10900200002e661ffcd570870796de48c71afac3d398f488fb5515c33d968604b180000000000000000008e250e48e488486406500300200b808010068000d7900e010002b790290d5117d99560529143807347d4c4048c356acb4f679221b738a15a464087c08e712e810186addceffd028436684f33b306003cba241cf810025d535bd2a242484150102c9862b2f857a11438858afc4682ca1475586aee8ee48a3300930e5d02441c4025ad6340c187abe9658258a04c6ce0b6086040004a328801f000b36d7140c54a402168142c983213065b32871172d154f22851cd90d27c32451279b71)) <<< 16000) + 0x26324427152cf1f31830dc009ec4c28126e9d2a75328e0850028000192200079a6461c83f72c8d1032b1addea9b0817beaca2b4822085fa685bbc4203a13c350ab98e17caf623ec9090038fe740fd42806c797c082f0c0035c9b356eab392185204000020a20a402051010004241050110278881383409a1a04c0102580800683482516c124760903b8697e5a703b44304cf28b08721435ed9c852bcfc08ef8e8ca61000000000000000000000000000000000000000000000000000001a28004ae46d06dcec2f2c141522001c014008055412503a2b8e66c5503610033cffca1cab9a70667e67591e6a77c90d87a1f966975d62ac9c8bea4f889252d466e64b1ef7f8551224273b47277b6982c1b871b3a199974cc88025d06c8270ae070a2da73958a413f17218cdf50a06feffde106f7bda308345a0b0d22e279497c1d02fffd1bb5eff35000bf2438fd5869190fd03a3fb9b64827496667dee402aa93ff1c34bba21bd2696f8f0de87d518027e0e5f6ff2f2526a66b061484b5cce92f663ced021e8e9f76c829bf6a8608229077e9bc1c70897756b08181d706db71c1161179d68d009188e4ff2801dd99ceb470064e27e5b44a04088021c481bd02a6c30236343fc178292eb667d2c308eccf6057ad27504b7e8c6b0a649044040de854978d0eafdd0e1ae9ce26acb3c9025a7e370b63b47519f2e8ab95772495100049ba672e2392c97f0f7396d1bded701c014f978a4f39d2706f6dcda4761fc5fe810eb39ebbc9b578aed713c0670cfb2a829196c6803d6a94eecbf69831ec5a1bfbea2dfdf52467a4eacde812034019d4104379a87707d9c0a11a51451a49440809a0180120060200401b606a01033e1001d008400004010000044709cb6329c581cc8a3ad880074021c182605170880000fa0f62001f00800003b100010220003484000c4c8003a9104715c3ff9aae10e0f2dbc918e35f587a731e911f6aa2b867b2d0c096300000000000000000011d1d3798567f2cc28f52bc141a4ad28800f70cd47c52d054ca1c904104c00300102029411bf69e9803c23e5f18fcf6c0752a5e4583e1a8a456f307d3f027f6925a276f2c999786480415f17c5b50450c7ba3039ed2cc4eb94c001b06789a940c00408c0202f0100022a10451182204c10c160840be0ed088e1d490c61ca38f080953635f44b03858a50cc8003671a0307011471230844985080021810b32f2d244088ea8d862501404cfc1a240353a515110009d0d02b052a204200888d32a168405807f7edaa710010004306075df6983091afc5f9cb0415497548c094490b24040218293c92800f80400003e082082f065fe5fdf96003146e381020ecc8bf1800e8042000020080000222080020000ee207e020002c020007c840f81606a03db9900e92ffda096f3121ef2ee6b2800100d50b194649a000e15a3b2352fbc8e3eff23c46338ed518d6c1255000000000000000000090fb6bf3df14e05a3a6f30acfe59851ea5782885086846004805710013ac9b00aa875f24f288babbb0970be52f1e717cc81957d37d47db1b64a98f2deb5f4a5719fb1c4c6c091d54477cbe600bf4769cfd1c9ffa88659a546af78ab73c79e4b80608bcaf623635f446dacdcb3ed0ec23033c42ec2384ef15d1588a37f95b8c518a6ad1498120a93211700c205788240ca8899842cdfd8bbd802afa380adea615c56d68c3f884255d2408ef42c00927f814eebf8d025a45a866b641d88f3f05f61040e2de1f59061d6322ae2d5ed5280726ba40dfc270a6f3b5798aff7d63e1895cd8b74dd67455cb28b378291aab7c20d0409f5cc8d9f333685a4ed58376ae9c3cc59bea3e0a4cdcc14a547b8341b385e58a87fd9e36024ef52ae14c3a44a075709dc908ca41ce119d1a6bd1654399184841d220000200803d0101e008000130c00b0af583a24013ce5bdb22042000801d8080240400014c402434000d1a68462709ba4300f2e1877c24037b6466154231420008508c16cc79450f0357f2412097b9dd605423141f0080000561000176206e2a000e4420523bc1859cbbc3a8c19811531d80c201832f946482040d76b8840468ebd105860f380cf89f30043714c8744802c1bf46984a4061180a30a0ee7914b405489559533842d60c3eb14380393bce3802f2d03da1408b2eb6af9800800218500c81ed2c814b4e5b7047081a9776c914497e9a7888a187a2d0388800003010c13001080400004bce8e16a1a80038891d84f5c207dd6948585840c34a21e204843356d24002291b794cc084001000012b20740a0003ce31d3798567f2cc28f52bc14003d6747b8caea59fe78be1a638d877d45cc070988b14508b04604e0050010149221d1fd5a776ef3dc69d59f26051238247b6001b8e87e32f32062000d2d4dc388460df40009dc81a80e8800d9e4d318380cfce562020152d3500c002721cfc90008002006803d1d3176d34840837fe04f09045caef1387061b7f18703007522e20e5002000868e9e44113c243268d32f4881181689a18704521c04e01020f19c2de3003a0525590c063abd45ee700210080000ae10002743629bb02ad892186d23d8b1c15ae370f20a169b478920e002fecee684a104001000010120721a0380d01b8480013408180680243405e12000d5c200428e7637893a000000023b20e87b2e7ce4e07cdd9186501dcfcb033faf41521c61841c11012800c0514d7bc82d159cb9909d97877cbb525fc9dff22e9a4e7dd31ea18a13b9af1e015c968915822fa4347d0c3473c30f518802d6c610e34d0002de203603)) <<< 16000) + 0xa284a9be39100015264ed08041a56c54882118e1000430dda6f2cc87098d2cc348506178ec50248463f9ec58380803134daa4a1840010e3c8c59db12034ba1530a28614657478208036b26db4041f00471f8ce01cc080d4a11dc2880027b00b058c108002000014c40d81400034674487152189b0d53559026c198259ef8b60542de50c063cd54ec42189ada4f0a08ce65011ce31ea2bf70e6d0b45bf0ee0341a18e6bcfb6401a47c6b3a45e80000000000000000004510d3471000f02d1d3798567f2cc28f52bc14003d6747b8caea59fe78be1a638d877d45cc070994b04604e001014c4532c21f8820f0c439dadf28dd92b9e1510181836babe9326a6fcdae68f105064bc5371b19472956a62296e373b10629531277a1b3cf78b84685c983cea372121ac6df8badfa99477fc4dda34459e73ebc7dfa658efcc9c34c93ced917dc168d3f8f00208ce2ff4001bb081a80e0000200803401c827205da1081d4b6c0cc4003a010c204d50164040875072693009c274adc40000930618502a59141fd4007c0100001ee4000614c0200401000004440cc340641a031090001299000c4a202e220161100a86804c1502848ef76dd301502cb6fa0503cf20ef3e0b00b531a1c68a009d624e6d000a86c83200aa8b3101180424600badb544d08498d7a0e2c2a647fe674a08c84effb11c005433b0fd4494508802144874dd53883470769040d248a0877404a4b0b8f4da6f504092061892a34011f1df6a648029b63dd19449c508c0200002e840c02405e020002ca205c0b02d058160080011bcc1196519b33d372e0773f02f55bfbc741edc02febbfd422404d994b9a8c7f9990409308c3ac6e9e4c040c4f74365fd00b5856101dc298e4349b864319599043e4151788759e1a9ae1a8983ab4e767006e900013ff914254630d0eeb0175f9082996468f25181e7f4555a577b4e667c20f3bec92b1830b776818a1411b7835dc0ffabb032ad5ccbe4cb3dfcbb8831fd3d7cb75a398f978de6b7d6e26404a21a5c236838d60dfdb0fe6352d46241d57618b5e1dc569b38c1be094d30954fdead75cae15b8e43132b6bc60ee58027e078d1895308081e86c8f8c9e69a8b00d1838e7bd53fa968c4112f9b264cda79fe6ab0cd4ed1c0000f3c40066b880260b98081e6e44e1a1ceca601dc9a2b1b0286f38dacc4bd25de1ae5d06d81aab328c02f0c9dca02d9dd55958035b6650dc24b8834460cdbf3fa4ff20d82bf5c90a00916522c251695bb29837c2947a47a1750381c193b099f42ba7a6f563018200793078496750dd76d88452c7987988eca69923a93b3c005a51d4a1251828142e7623b4d52bef59179ace0b4b6cff1c9e5bf500206bfbbc8c9b68a8d20ee7f737cedcc54b9b2e7690859757339772fd8383da31961e3a7db12edc80498ce23b4b7c2f150a55d1c45ae0da4f5b769b270c0a70b63bb45a15324c6d8ec178d739949c0b4043eea86c868eb922660b03c059f74b2871d865002b01015008001f48802e049008d423021763c8230342854bb6b06c81c7061828bb8f0c43b1280f43a4476d610158f65d83a3a0f478ba5a0d61bf8a11c791569b7342e54d68f49cf52040bba23f06a706ddf9ce3420f48586035280362d6a106ad844e04cb8608057a9a675af3db8a619c0bbf9cab2924fadea877f83244c38d0240ed9d8f478ff8e1c7cff0547ffa015b1a042ab26abfb7a805b7cbc26c5b001615ccad8d240521021010a10808408e927d1707009e7b032fff26811f2f3c2ca9f2d584afe70b18e7945e4f68646fd3b47da3e4ed4628081a03c120002cc20522bfee36c3bfb0d38f1349165b6fe98672e25355add93980000000000000000000000000000000000000000000002c89020e20e19010a11008602e49b062c955dc807c02bbfbea319e93aaefc346cde812034fb6bf3df14e05b6cf26fd6785f3e05d4d982a648a306182102280180a6034f374afad8c7f54af4f693f723bdd82eb25cb31d6d41a3ec96787796699211ed8624472bb73201d25ffb412de6243de5dcd650002037f7d4633d2755df868d9bd024069be5e1362d800b32452441c424120018059ea478b038722d59f2922412971e0c6dbc225eda87f6a1d8f8d33fab9766dd031fd1aaddfd8528080b0d2fcb4e076886099e51610e4286bdb390a579f811df1d194c2000000000000000000000000000000000000000000000000000003409649639431029619411401002980c0100681402f504c508064b84c569178148697e5a703b44304cf28b08721435ed9c852bcfc08ef8e8ca61000000000000000000000000000000000000000000000000000001a1b67937eb3c2f9f02ea6cc1532c62c3181300280000c6b759cf41442a13a4e04b9f0f280819d8f5120542acf3e7292fc224d0e4e321c84bf6045bc6b21d6f58289d13d749f00ae3d05e9a6133f44c108b33a28d0e455d7565fad6407270eb8fce16053d476e97d87c3ccd1a49bee0c2906123e5111581838a5314ed0601ac7ed1e2ca0044010d272a8a15ec4100f88c3e63459bf8eef88e2825f9055070836e103cc3817ec010e598008402000025e400094481384809824000f82400289c8006851025150007dd10011ec2048430230500180ac771a45fa60e3125137e5c709458ced5e382c989018f2008ba07a9c8c00929210d15098508402163ca42e15a880c4c828e578b61d0007b2de8d31cde2e10e03ead7e9fb36316d9150e30d1a6e507712571562bc00721551bb6fafd5e87c950aadb50bc8a241d63f72858e12ef7b49ba69fe555ba)) <<< 16000) + 0x05f400899f6a6987c5155814a126c16295e304bada993b8e0a0440fdb8e2bfefd3e00aa3a14b754f5b96201ad26b853661bee126c90140808aad07f95b164c55379c7d378fd598a084c3e351d9e486e21612e4ce0bf88df7f641adf4e4752052775aadccb476d661c26d53582ca6d5024da6df42360482a007000006393852545b64e900c06984bac6047e259b7a180d68f0b7104008fbe6b2aa0ca304201000010d3120c6f996e539b4badca73697608db73201d25ffb412de6243de5dcd65000203637893a000000023b20e87b2e7ce4e07e8004ae46d06dcec2f2c14154245182142080040536be814ae8af8aecf102b82dc375fc4ef61082d2603d9becae0ce1448be675cdf2acca8d79ea8e5480358887ddbb04482c6cd4296b353226cabd05b2887d9bd4088240421202005000231101f05508033df51fe6f32013baecf609831c40431fbfb5610b51c00ddc2f63160d460057ff3e227c53140034c1e25038801023016a8286316150dd8de6e405f2334338c1901e28806aa0dd826f69f34e06ed79b77a175c1776df922019f15616dd44d1b0c8b68e8bfcab6cf0d671627d8808578391d248e5336afcc051331f50e34236ddc54201ac5f563210b7daf2ef05b1df4151a531c26c178288640c157da2ca1fdb59dbffa3cc118ef9c293a61c941d6f559e442da0a0004b945d31fef1456e3c6caf4c4d0b6a5b8b5fb3401dab1f9be4189d1ec000241901e1180e80c001b9480e10c06c074315f86960fa465d5935d04d12cde2f4be9242de32eb440dcdba5d48681e0ddd254401527e799a3f48c88e002ae90b6eade3eecfc6cd362444f15a54b9dda6c966641c80c7f366354f7ef87f7a467d1605e6db2050c05527e2c7445533c32a8dc7a0c9100fb2a02b54cf444d198215fc65585dff98fdd7a565ea31836f9e108078cbf4d52204d99ce096f4d5322d565c01fb5538a5d2c8e80e8378d556d3bb7b0c078607c35dd6d556dda122e5ed517f27b65f1d1455823c50b7857637529ade120175b87693171ff1fc8d7c2d98c25212910000100471c4e2535628289574ddc5009fa1bc68c007802000013c4068040001e04064340301a0170900b04805414028020130158574f3a30b616f69eea87c0c08b07c8252354b32921ace4802119da730295bfec565510000bb47dc699fade2f0d403000cda970660771859f4c58830d5b0e2ac7d3f36b07107dcbb16b91dec86488f120e028d963593a6ba49e45dede0b574621461482f16162a76842a6a113f50a42f41bb4a8056cc3e429940d68803c7101b5f074040409e152c1fba4efbdd3e91b96fd3158a570afe3ee24301ab11cce811fd40c0853b9418b3239a61002af0bbdd2b3fee41cfc15bd510296adbd48f76cb821ee5a86c3205e6451c8fa31f999a73375592b74d52968b381a2e3d601f414e762c945fdd12b596d0151711537ea3e610e16e93e3e47273f303ab8c9699774d58dd999823e60af75806214148199738b41ec60d9f0631d46400005a920242b01111f6cec7a3c7fc70e3e7f82a3ffd00ad8d02112c72c22020812402001c050a64fd6f7d14bd3d7a5960cad126dcf50eda3d8d5a0796bb1a62609ed98c8ebc9ae30be20dc0f13ec93920c6f10ce18ce0cb5ff26258d51218379d0cbd6736ad4e55192ed1f74326e6c2000a00ded67d295efbeb166cf8103a07c6a618004ec95aefe8ae29811cbc39c58dacbb2042002ccb171e1ca1453ea61f2f79f24a32ef7a00a13505355818c4aa77d918425d25fdde2f3a47b9910cebba6e9beb9c6b288438ca3448fd154839a2f65466c6d5b78d50ad1f670d306aa1b676d6bd0754c64c8b26a833a8bff407368cf14ebe4390f88d702a9578c10e3cc31aef1b585cf631ee99b44fda17fc6b3f5bb0c395eb070b49778a17c1d9e2eac4fdb47fc8ac4d291c68e1ded913bdd28304b5d9ccbb29c58ff143a3ec0aef88ee27510748dfdaa5790a07745ecc1f3b0d16de4b2d93df424e62337cc1ba158737d0011888ca791299ea863117dff254bd70be22b5bc3f0dea30ba9391b5c490662653e95dd0e0cf37a531fc112468b9236ce8789e73e7992464f81a3d3911337488f685d1cf1aead397bb4cec2e36f773a1bdef1519f040e018594bed609fc0eb184c52d2385a7711a43870843c8f3f5c8103647b30212009df2d4a264042300879e0b4008c60f3404071da11e6003abc9d13c6f92e88b93200118042c700834817e78dbbe63c010e180a37ce1b122001807dfa2c001bbd9aac200071728e6e6002300800009d9000233200065a40403400166a403c44001eae40384401a120011ab20035b46041b7bc144106559eb034700322c4c046004679400c503436140895a8610002245765bd173658853926a8c6638e336440ccd8ed708df2ed9db3c1da2c03332248481ae33014dc6f50264ac6f6f3520bec17318648ce222ba7fb1217fd3a9aac20400725fa90512a487b42e13a059359d2fcf11509fe32d1a5bd0480b9846ec820d9ed53d7d3b6e039d8f8f42f3457ade2f3ff3df3a2a0051906aca1b860b324c6fb3752909f31ee1df6c2da09a3f255fa750c73666cbf4007529966bca84ff6e48c3ca448524046296df758e288c3344c20cb5b61fe70434240cf334c0002f3900c0d00586c028340121a0080900380801804000f2a400ab4c801faf9a0ece8f0b36d21406a3e69ccbe8201cac724b8c203026b31581786a8504e4765a19059f2d1e3b249da985ddd6e95fed9787631032e3235afb68708605605800501002008000878801988008540020200001002d6f1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case11" = "QuadFull30Case11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case11 private def zz2155:"s086b"="s086b":=by decide+kernel end section namespace Green24Proof.QuadFull30Case12 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz449:"s01c1"="s01c1":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case12 private def zz2156:"s086c"="s086c":=by decide+kernel end section namespace Green24Proof.QuadFull30Case13 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case13 private def zz2157:"s086d"="s086d":=by decide+kernel end section namespace Green24Proof.QuadFull30Case14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l51 l6 l60 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x116d775c3, -0xd5c8eff8, -0x140ad74f0,0xee2f780], ![-0xd5c8eff8, -0x3919bb408,0x1398858,0x12e607258], ![-0x140ad74f0,0x1398858, -0x56abe11b7,0xd5c91edb], ![0xee2f780,0x12e607258,0xd5c91edb, -0x6ae483b4]] noncomputable def hinges:Hinges:=[(-0x13ad57,l6),(0x1bd0497,l4),(-0x80a985,l10),(0xd74beca4,l14),(-0x5a4510c,l17),(0x14df5ea9a,l15),(-0x6ae483b4,l27),(0x6ae483b4,l29),(-0xd74beca4,l25),(0x6601a546,l30),(0x6ae483b4,l33),(0x80a985,l38),(-0x6ae483b4,l35),(0x6ae483b4,l37),(-0x1bd0497,l34),(-0x6601a546,l43),(-0x14df5ea9a,l41),(0x6ae483b4,l51),(0x13ad57,l60),(0x5a4510c,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges def s1:=qPath 0x1ac084dc025cc0e4b00027310b001dc5ef002815ae9df1ab91dfef0d72b3785ad5a37e1b72337680f22daeeb862403 s0 def s2:=qPath 0x1ab923db625cc0e4b00027310b001dc5ef002815ae9df1ab91dfef0d5c90767ad57c236d72337680f22daeeb862402 s0 def s3:=qPath 0x1a818348825cc0e4b00027310b001dc5ef002815ae9df1ab91dfef0d24efe39ad2021a3f72337680f22daeeb862403 s2 def s4:=qPath 0x1ae9636d425cc0e4b00027310b001dc5ef002815ae9df1ab91dfef0d6ca5a71ade880ec772337680f22daeeb86240a s2 open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨7, #[0x3804103014000100810300040a000100230080010180003c04b0104040600005020408001018000300ca090010123420c09286c11018c000180c4010010120000000080c001014b0124041060048534804903102c10104c80118041060008233c04603100c00104c0002c609011c14220000701040c001048000200810200040e00000001c04203014000180810300040a000050108040050280001c20503003432000000028083010148031c0c20700102f380c809082800711c000200460100101200007011404004048000380ca030c04063408c03240480302c000180420100040a0000402082400e0b8000000070110040500006030c042030480003408606002c26000000028204010348031c0c304080c1f343890a180c5030ecd183004a0d18406300005040c0c00d0e800000011020c040528049010c0400504c0000000202000c0500000003808201034000340890304040e4438d0a280c9030ecd022808902001c1f00000004c2030103400000012020c040500000002c040010140000000a010004052c0480104240181bc000100430100040600011022018107098000000100200040d3c108031c0c2090dc0003808101000412000100228080010190033404a0304080f0000000200400101400000007010404050000604100c00c0d8000140410100080e000000028080010140001c10202000c0e00000001808001034000140830300040e,0x608140400f0c8000206060110142200006030404004048000140c20400041200004030410004078000181c303002c2a0000303040c00404800000003010008050000000242040103400020586030c142600000002c08201014000280810100040a3c48801080c10808c0002c0830300080e00000003c18001014f163004203042427000000030080010140002c2040300202600009060404001048000201860400141e00000002c18201014000280410300242a3430a07181c4010cc000180c2040004160000d08241c4030880003404601040c0e0000e021c0800303800030045010c04063418a04180c30106c0004404c01000c0e0000f033404203018d02283080400141f3410a09200c10509c000000020104040500000004c08201014000200460110080a0000b062004701028000240470300101200000002804403014a01240410100080f0000b0124044060280000000701000405000000018040010140000000402000c052404801041800107c0003804901040c0e300c803080800507cd012c0440300040b0000f022808003038b0124042060018230000d012004301018d062c04a0318101b00006010c0c00304800014042030010164804c03100c00607cc012c0420300181f]⟩ private def zz450:"s01c2"="s01c2":=by decide+kernel theorem v0:V s1:=(P w269 (P w317 (S (K 17 nt 0x1244915f4fd0d221840ae24521802aa48845fda2ab104742792210832051003b986b1b5b01b439ad815dbf83687eb60d633ef00aae6e2458fa1766b888b009c3104d435e6a5f0d3f2c4c33842a486ada16253d8ef58dd50bde41e6231b96792f3c21d49698f9716aa4c5888a0e7c0cd5d24037306207a01a32350c405ae61a575fc86dbcda8dc5594dc436cc3380d27a84078e7eeac47c2e4b701429ed0753dcecf9def32cf45e7423b111010afe474900c2c60c40f4490d43111403d26503d0e4350c445104008a6ef4e12cd9b6a6ef1a8f1abf21e0cbd2cd72117f8648e2658716386207a1c86a1885a1484a01263129a188c9018421006d5a435ce4ec03174c02107401484320a8220681202802) (S (K 14 nt 0xaf04c0433c84c5221b18d2b8142a51066270c287e142be1cde0d1218044d0b00722750772b03400c901a440c0d103240690006c6940c0324069000624ba2ca040604192030842bbfedbe6658d040139fd660009a203085023ea43ec91098fd0c225224d4bde5cec850a94320cc49064d7d20f8899c7a3a43fd56f3eda1a0c883b0660f300b32750773ec902617538c7e21126a9c419081018146480c21080fec5a90ee7f2f00270d2ba6000a4202484320a80b10c3090fe11f830a9264812c80c3d6a523890798d5afcd7605d50c28e8330710770950619203084000eb58e4f519680139f0c101506192030842016395f4bd3e67f2004eb973cc001484051c864151b404ec6e69023240690694310d5c4192030804260328016491641c90648900ffecb04e3b94ea0c0401886a11920348003b30903118c9018a19ff3938d00235980c20081245c900cfeca0423ca2c1295418085a1a806480d2230c4c2192030804260004a20126620c5c61920308442601a862005e202f440b848772243300c901a440478c6480c22be318e623e26271a4756f7b56011768f18002f4974594ff24844807171c82582036ad21ae72762d3062e833059005c101e5219054110340bb240a) (K 16 nt 0x2aedfa00da1cd70358dad755737006b19f781b43f5b0834c9eeb0ee811fc3438621b38a5f9fb1c00edbaeb98e8e12bfe1ed043c833637c929244e1886ac0358b06d1aa71060728c901a433685802513a83b94323806480d2200c0e119203480036303cc31920348003125d16503983192030842008027130002f101482c947f142e3da4905d89a2a2490c0316a9c2040423da4f74af8330695406221c7d079c859d8463c24f7587f53ac290c4004592498344d0b013327507729d60192034880305846480d2000d8c0f50c6480d2000c49745940361c6480c2108b979765b94b81004e2ce980025480bd15880db4af6b9ad752ce119203000579d39ac04819302a72447f654901f0cbe1d12486011342c01dc9d41dcab6006480d2205b10324069000626a48c0324069000624ba2ca03a08324061085d7eeabd97bc1004edf3000459016b2b12b53fc91098790cfcb18891504820c82a71203000c901a443051403240690006c4f300892750777fc913fcc492f8324889354e20c84044146480c21080979c239ff2f2af8013aef2d3000521012921928404f8687a423240610019befa389cf840c9814b92218407f25d7a1fc983fd0926773a7e12fe2c1a48abce8330018e4e20ee12b0c32406108002fdf109ef7ffc8013871fb304056186480c2108118dded8a633e004e29e980025480a390c9424e80bb0d0e5006480c210db31ff3f9f00255498210c2048a28be3fef1e02850601330072295077099881920308400000271304066206480c21080dbcd73797bb9b00270fe5660009f2022043248822468099485591))))) theorem v1:V s3:=(P w24 (S (K 17 nt 0x248922bea2219f430815c48a4300554910dfe2845631d0fa0d50395ff3dd2dec08298c83315d3bee877cfda8bae4b7ecaa78443d8845ef08913fc63f0b901ac30a203103d007f12880724c7095ff0f6876dd75cc740297e7ec7024892039fd9011601386209a867b9e3e18cf37993bae65def53059e4bcf087526223f4c58f92bc1922480b7f2487e78614386207a01442350c4048c61a5ad9d86daf76c4cdd98aec36b5e560d257a709d8d623f4343b579616295807389cf8184e919967a2f3a11d88488e111132184096306207a2486a1888a01ee3281e8721a86222882004537e61b979f986e5d2577ae58379fa9108e101247512c33996680c40f4390d4310b4293a4023862531a3240610840294b1d8f29cee8064dfcc0e507401524320a82270812029ba) (S (K 16 nt 0x2d71023240690694b9c921417702acc9e887bb176e58c9b29c65f8129a95b7125a30b53e4a6a56dc8610efe88222b5f896386207a7e8ca017b2459070c9a18806480d2246862119203480036316ea2ec0300e4d98e337c23bf8d75115377f57c1c7bb6c8822a647e18eca5fc96406207a7c9ea0135245cd995ed4d17da87adb0e2face68cdf279c8454813211d961850c1881e8727a9e29b361cf61a5855f8bb6170b9f933e36657b5345f6a1eb6c38beb39a337c9e72308a99240731b20581c3103d0e4350c402f640a44823d10ee24b42324061086328f7d8acfd6000061cb4c0594296a86480c2108058a5e5cb62f7b780656eba602c802a480ad90c82a089c27680a) (S (K 15 nt 0x15860910c901a44b6a9c7f1f06125c37c05c7e95418080304946480d2000d89e6016c4ea0ee13b0a32406108001004e26080ec28c901842100696f5231edb32004e3a79800268808590ca1a5ead0c9801920348b8336806480cc250001240148c7729c9728908928ee5d4078887721f2acd4f37b597295bdb5cff4ce3a01061024c4284107f92689a031119125139a819203301e8720045202f262b01bd311077094e61920308400000271304076186480c2108194a4eba94a4009c9260008b201f843286a1203ca30c1a408c901a41a51864f30c901980f4fd19400a848b20e1a45130e22c884e3b8ee1911418085a19806480cc2fb56317c7f1f3e3f8f9f6ac629dfe5526a1c81350dfd3bfcac5a7038e871e2d36324474eaf04e12250c400a99019c30862e00c901a44a07a0013200b864bf211c58bed43d6d8036f439eb0bf0e63b2c7350ec642fc398ecb1cd43b188712cfbfdfc7b4fd2c1c4b3eff7f1ed3f4abb7a8725a6ebdd8f2eeb43f8dcdd0bfab3f0c7c9a995186207a7c8c20266245c7fb0fd11f7a3f68b4c07190e645ac5dbd4392d3ad0fe37375a1fc6e6edea1c96861a4c3feb4781e896474e1888289230eedea1c9699fe6b5ddbad0fe3736d6bbf56410c202a41a7f8f2a44ce18880892abbaa6d59fd3c18cf5c0c2f1e8a189e452efac1ae630986b696a8994edde5f9f9efd06439cf7612fd297e8bd9b4618b4218cf801ec398dd341e7e5ef6763afefce5a9b1d7f69cb39f3b7a8725a6ebdd8f2e02e633bd4abf8b142487e67ca1881e872031020842618c09a177a2b697ff6b5596ab0a46caacb3fa5735d6b1915fdeade9ea673ae06d3d5710d5b56b5c41e5cf661ec140430b203103d0e4350c4038241e34865990ee44bc0324069132da51920308042601a862005925d16509d8919203084206773f956f8f52c030eb29301640148405a086491044e107971) (K 15 nt 0x490d5b219c2160d3f2c5035e6a700f3118e150bde23bd63816253e0ea22f3c59e498a8b561f304b50818403482853b309830621b3bbdea649dd73418cf37a067b9e603a88bcf167925762cc07ea131219f0cd0df912491386227b01302c1b46a9c95d8b321fa84c40c10c4c23e14bf15f368fa84062250001249260ea342c03b49d41dca190600192034881e708c901a40018981c618c901a4001892e8b281cb18c90184210040138980017880a41a6a90c940192034896fd8ed75c877cfd7cba7a1317ba20f64784844886902bf4a1dca5406228b00f42c1b16a9c39988f3c0b150932882ee833e44ca8090c44a00024924c1a2685806a13a83b94e18006480d220386081920348003634a0601920348003125d16500d8419203084248e6f6e775af04013ae5e600095202fe69203f235356019203488ab4176e484cb9d163117701ef09e9040030c7a40a7e58ecb01c31103985192033000312023e68396d538a5217263efcbd805971e903f1281fe8472a43114512541c0b4946480d2000c49e602164ea0ee121ca32406108001004e260808728c901842100401389800178806790ca7203a935862d00c901a4450e7fbaf4bd0e669dbc7d6dde96ec450e6f9bd73fafcab1e4fb387af8b480c97751dc714fce1a9ebfab6eb066f93ce438beb39a17da87adb36657b534244857f8540286221b7a1cf5805f6a1eb6c97e4238b0712cfbfdfc7b4fd2a1c4b3eff7f1ed3f4b0bf0e63b2c7350ec622fc398ecb1cd43b193a17f567e75a1fc6e6dd7bb1e5ddbd4392d0c54e867770c310049a41214c7729c97742feacfceb43f8dcd9a9e6f6ab75eec7980bfe489281df0a80c204aa03113d1251dc6193903240661191251064e40c901980f4390025100a731580eb18883b910e50c901a440e50c6480d2000c49745940559c6480c210803e9ead6c52b39002746acc00134404d8865394d410a0663))))) theorem v2:V s4:=(M w28 (S (K 15 nt 0x164891087fc2324910be1928300694bd80fbf1726294827f8a920a11208ea8e12690c40f4fd194018448b20e18b0a019203488fda1f7a3f447fb16b20e621c68b4bbb7a8725a75a1fc6e6eb43f8dcddbd4392d0c748357820f64e08e188b480588cad0c403240691281e8004c802e1b75eec79866a79bdaaeb43f8dcdd0bfab3f0421a405081507fa2649a03103d3e51d0086922e58d0b3907bf14ba7deec00c29ae7b3b0c29aacbd613204a0a7c1922a7c832406207a1ca3a94a6f4071eab41f542c8871424517240760a030ba43103d0e4350c401a24085082b590ee243023240610be33c4230edec03565dd46320185d8301650a18a19203084200dab4d6276f78062e980b20095202ca4324882270a62) (S (K 14 nt 0x4900d243e087d51f43289418085ec20c901a4194007648b20e1930201920348b6b5dfab275a1fc6e6cff35aeeddbd4392d0434a1201df1a880f08e9c31169007c9b0306806480d223e543b90f112ea005cff4ce3ab94adedb353cded6106942403cca2039043044901881e8047080b298c317146480cc07a7ca3a0054245cad7106480cc07a1ca3a94a27b0c3240610084c0350c400b240314820190ee23a0232406109290be69c976403c23faead0b00cf83016501947192030842017b9587a11d00270f980022c80ad90c922089c2) (S (K 13 nt 0x10cbd2cd723c6afc879b6a6ef1abbd384b360a178192a30f30489c31189c379fa912577ae59f986e5d7e61b9782bd92a30eec71a091406228b00db2c1b1781c0c20c6480c3feef50804010944c000e470a0ee50c9c6192034880327186480d2000d8c0d28c6480d2000c49745940e5086480c2108abee479cfe241004e693000481017a35062f0386fa1c7a6e483de8e3624ee3ecc95e9f13de6d4efbd58be17bcb99df79aa063f9cf1ece374cd1b7fdef0c43b597461e44250c203cb0070c44a00024924c1a268581029be83ba84094046480d2000c4c0838c6480d2000c4974594022906480c210802009c4c000bc4045881b919cea0c12019203488ad00d2a39f0d9a933e2e7e2e0bb666f93ce438beb39a17da87adb36657b534330f24c0a911fd60386222b685de93418c0369eab886adab5ae2bfbd5bd3d4ce75c55659fd2b9aeb58caffed6ab2d56148d8419fd160922ff06925010188019e205fe6ebbce4b87d656471f1bbf0a2012443898ec4e0f652a43114512575c0e3946480d2000c4dc602166da0ee1c4c7d404fa38fe443e72be6549f834944e2d06620228632406108404a4abff4770ec8013bbb660009a202a2432b96700c901a45218840324069166f93ce438beb39a17da87adb36657b53410e208c0afe128060c4450f4fa295eb80d67ecf035dd33756e358ab98c4831b7e618523e00bd9b4618b4218cf990e73dd84bf4a5fa994edde5f9f9efd01d7f69cb39f0ebfbf396a6c3cfcbdecec3d8731ba68b98cef50375eec79776f50e4b455ecf8234250c40174103d130860c00c901a44418b4632406603d00201008931862d28c901980f4f918400a864b8a5d0f7e59c8b1a0614d565eb0614d73d9d80fbdd8419e1a7d9cfe1cda5406227a248c38c324086480cc23224a2de8de3745bc849115327d92085ccca44921881e87200ae20216627acc3240690350c4008a40a4883e610ee4338032406916a8801920308433eeaf8ad6362ebf0ad75df109c6000a925d165518a01920308420656f8f5f17b00272e980022c80cf90c8275887f79) (K 13 nt 0x594dc5b8a86dbcda81a575fbab10a0f1ce6c349ea120db30cf1f3bde81d4f73c8a14e645c96323a88bcf1679222c8a077f09c9130621b3b315d93370db5eed834b5b3b1fa1a2763588692bd381b5af2b0613a4681ce273d8b14a7c76af2a3a88bcf167920430b32e1850756183113d80e0960da354e2ed4fe273c5bd0288234bf15f938e61901218880326206480cc000d8924c1d4685808593a83b94327a46480d2207a4232406900062607206324069000624ba2ca072ca32406108401004e260005e2028671a9ce6b))))) theorem v3:V s2:=(S v1 (S (S (K 17 nt 0x540aa8b3b3ce480e3e12447d15288d8e87f8964a24311554a07a0013251006c9940f5650d4310018994317986480cc07a2486a1888a00683281e8721a86222882004530ad2219203084202cad484716b00c8f3058401206252d232406108404bdeb3c5a3e0183260ae83a009a2192441138409565244911fcfe0efc1840ae24521802aa140021440708b47469e4d2510188aaa2c54f3c08399851024c5bf096b88584b243103d004f928804e0c6180620192030cbfebf318a04766092ff1fa62cc495e1831098412451015fc21fdc185101881e803088d43100b0196f4273c7f0bb50849144853e049c1d1a185521881e8921a8622280358c3df1b911c7c1be495f0fb424f038d5b7fdef0c43b597431fce78f671ba668f85ef2e677de6a87c4f79b53bef56230a20498a9049e818c8e1881e8721a86222882020730ad821920308425c4e3dfd80031181d2008131256c19203084200dab4d6276f78062e981ca0e8027c86415044e10240503dd1) v2) (K 14 nt 0x5891806480c210042015ff795bd1905066090316806480c2100b369c6fefd8826081a718c901a4001892e8b281ca20c90184215c374ddab5c482009c38930004a9017c2198570d2233e02480d27347b086a138c99684f75c5f942ea9540a960cc4241006480c212df90c623e96031a621c9f241004e1a498202244324061084f9d6f7eafa72080270ce4c0012a40594dca2006480d224649fd49f491f49540b92a73f2d7b0387e97d5b93f1754306b60cc006d90ee1e4d2488f4328eea42216866d29d78abcadcdeb7cf06d289c52f06620128632406108401004e260005e202a240a34dca3806480d225620032406100710fd61a8e8f8c42bfceec1287cc124030a1f891dd1440107c7b35ec799d1a77ae6b4d7741b48a296033001c04067087700925192030842000029873d5e59026000813dd0144107893d95cb5006480c2008050dffd2d7780319821430032406108ab1ae7b0ae801bf6bcc66d029982185c41bf487fa02041effcdf94d403bf5a3fd52c1b48a190660033080c190ee02a5032406108402f72b0f423a004080f9800240f55d1735c901761acf8ba8cc00c90184210eeb9a4fb3ee82008af19f7d3a682887336cc61c5078c1584e41920308423bc636c5bb608025cd63fdfac1491838200bd3bd6e56a4e01920308095c6a56dfe9800008e7297f6a5a3ae8c103ce119203084201cbd9edadbd5680367fec77dd8cb4724a386000d13021c6192030842017b9587a11d0020407cc0012073adab62c88099cdaa4006480c21a739ea48200c7fbbdf15f0038946df858e1f30441e4423c84e7248092f215f52bec169830ec198d2802a4d15250fd7ec7f0a8964277fffa9ff50b4c183e0cc6b41d005c1ceb52cab220480a14de18b00324066a5ef2e764008152f7f5ad48a1930490089150ffc3d93460a47db72b19c035914c198009f3025611920308420000c26000593241140efc3d05c3906004a71097e70916d0310331a500571892182c6480c2108a7bcee3fcc89aadf1cf72803064c1a1074018e73accb2ac88120280e6485489))) private def zz451:"s01c3"="s01c3":=by decide+kernel theorem v4:V s0:=(S v0 v3) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v4 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case14 private def zz2158:"s086e"="s086e":=by decide+kernel end section namespace Green24Proof.QuadFull30Case15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l34 l35 l37 l38 l4 l41 l43 l46 l51 l6 l60 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x11233bc38, -0xd5c8eff8, -0x140ad74f0,0xec0efd1], ![-0xd5c8eff8, -0x38c1cd71d,0x9bb4a0,0x12ec06013], ![-0x140ad74f0,0x9bb4a0, -0x56abe11b7,0xd5c91edb], ![0xec0efd1,0x12ec06013,0xd5c91edb, -0x6ae483b4]] noncomputable def hinges:Hinges:=[(-0x13ad57,l6),(0x1bd0497,l4),(-0x80a985,l10),(0xd97995fe,l14),(-0x4d43674,l17),(0x1454e2de0,l15),(-0x6ae483b4,l27),(0x6ae483b4,l29),(-0xd97995fe,l25),(0x683418d5,l30),(0x6ae483b4,l33),(0x80a985,l38),(-0x6ae483b4,l35),(0x6ae483b4,l37),(-0x1bd0497,l34),(-0x683418d5,l43),(-0x1454e2de0,l41),(-0xafebf7,l46),(0x6ae483b4,l51),(0x13ad57,l60),(0x4d43674,l62),(0xafebf7,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges def s1:=qPath 0x1ac084dc025d80c02600137694001d81dfa22815ae9df1ab91dfef0d72b3785ad5a37e1b71839ae392246778702403 s0 def s2:=qPath 0x1ab923db625d80c02600137694001d81dfa22815ae9df1ab91dfef0d5c90767ad57c236d71839ae392246778702402 s0 def s3:=qPath 0x1ab1c2da625d80c02600137694001d81dfa22815ae9df1ab91dfef0d3505143adb0e059971839ae392246778702413 s2 def s4:=qPath 0x1ab923db625d80c02600137694001d81dfa22815ae9df1ab91dfef0d5c90767ad57c236d71839ae392246778702402 s2 def s5:=qPath 0x1ae9636d425d80c02600137694001d81dfa22815ae9df1ab91dfef0d6ca5a71ade880ec771839ae392246778702411 s4 open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨8, #[0x3004a01041801214c0003004a0114180a2004601041800208c000300c7031410123c04603100c00104c0002c609011c14220000701040c0010480000000b01180c055008a01040c00407ca06081010300082700000002c0c5010140000000701080c050000602040c001028000140420100140a0000708140c00d0c80000000a020c0405200c703081c0040bc000200460100101200007011404004048000380ca030c04063408c03240480302c000180420100040a0000402082400e0b8000000070110040500006030c042030480003408606002c26000000028204010348031c0c304080c1f343890a180c5030ecd183004a0d18406300005040c0c00d0e800000012021004052c04a01100410504c0000000302040c0500000003808201034000340890304040e4838e0a2c0ca030ed2063814a0300041f3808b02280810707c000000100100040500012040c0c00c0d8000000140810040d00000004c084010140000000c0108040500000002c040010140000000a01000405280830304180040bcc01240410900606f00005030c04002028a01200420204040f0001102400c101038000000100200040d3c108031c0c2090dc0003808101000412000100228080010190033404a0304080f0000000200400101400000007010404050000604100c00c0d8000140410100080e000000028080010140001c10202000c0e00000001808001034000140830300040e,0x30080010140002c2040300202600009060404001048000201860400141e00000002c18201014d0428103030040473430a07181c4010cc0002c0410300242a00006030810001058000240820204040e0000d08241c4030880003404601040c0e0000f02200810303800030045010c04063418a04180c30106c00048046020804060000f022804501019202380c606040c17000120134040030380000000402000c0500010033804303018d02283080400141f3410a09200c10509c0000000201040405000000048044030140004810503000c12000080118044020280002c188011c040a00009011c0c0040480003404b0100080a00000002c04503014000000130100040500000001c0400101400000006010004052404801041800107c0003804901040c0e300c803080800507ce01300450300040b00010022c08103038c0128043060018230000d012004301018d062c04a0318101b00006010c0c00304800014042030010164c04d03140c00607cd01300430300181f000130214042030280000000f0104040500000003c04203014000140820300040a000050110040010180004408d020404060000f012c0410101800014081020004064008a01041400207c00000014020c040500000003c0c101014000300830104040a4408c04100430104c000300ca090010123420c09286c11018c000180c4010010120000000080c0010140002c10303043036,0x608140400f0c8000206060110142200006030404004048000140c20400041200004030410004078000181c303002c2a0000303040c00404800000003010008050000000242040103400020586030c142600000002c08201014000280810100040a3c48801080c10808c0002c0830300080e00000003c18001014f163004203042427]⟩ theorem v0:V s1:=(P w269 (P w317 (S (K 19 nt 0x4337864119203481b50bc3610c901a40d20041324422fed1558823a23e930c4190194308020cc34b523a0db71a6c0c952c1b6e98e06968cec0577b1122c7d0bb3774c5892470c40ba1650d2dcad436d66dc256ccff3e1af6b3c8675fc7e2ee35945e3791a50c54d8966ea8d7780eed1b749588f59143e4fe0888183fd06b337431c983102284100f310e41a831019c186948eaa1b76128067c8affb88e95c6c57f7221d4ada9be5eed0b3817b500ec344042bf91d24032f97270c408a1042a8390a20c426806a8c3de1b931c781be433e0a6d99ec24404488afd12c3af97280c408a1041e83906a0c4268490092187b88febcf075abdad6e9e34fe23c1579596e6117f8648e2658a1838620450820f41c8350620b41482500a69894d0c46480c21084200da39bdbd8bc8082e9802103a00b020c81502203404805002) (S (K 15 nt 0x11e198086790a82441afde6301c42a71066270c287e142be1cde0d121802864ec01d091a0772b03400c901a440c0d103240690006c6940c0324069000624750e281018106480c210840985ffddcf989040149fd66000a42032049912a90fb244263f430894892d7b5a7a520e2153864198b267e92041f11338f4748793dff5cc7304a48c3b066091805c92340ee33ec902617648fc42243caa4419081018146480c21084003fa79cea7395e000a434ae98002b8809990640a80b88c3090fe11f830a9264812c80c3d6a523893eb9d6271a70b6951028e83304481dc254186480c21080000e7b5acb7cc480149f0c101506192030842100058f6e17f5612960014ae5cf3000571015b20c81510a028f37b8a219203482050bca21920348204007861906cf28c9018420189807d0c2006a226c49d9224033fb20cb20901dca8506020286411920348003630c242e54271c44c1e0a8506020086c219203480036201586228644192030ea10a63b40806ed300f2184011a44dc900cfeca0423ca2c1295418089c1b006480d2240c8e31920315effce71fa040324acc00102461006a98c3279c6480c2108c4c01c83506200702039c4100483b91219806480d22023c6324061093f7b6650bf85496f32ac69c8e80031770f30006391d438a7f924224038b8e412c101b56f4ff7b4c16b0c20ba0cc0e200be203ee41902a0440681dcc80a) (K 18 nt 0xb254a8036dc69c0d2d48e55dec401a5a33b06dba63820c221a64f7587f4240b638621019fb8a5f9fb1c00ffd9c397c8f34ad61db043c82d900cea9522470c41c33e601ce4398a33d65ee30c5061920300099ed7d80103e603c676c9d804992340ee50c83038c9018000456185d2fe95f050c98200c0e119203480036303cc31920348003123a87140e60c6480c2108420080291300034101ae274a3142c4a120faac244492128832072cbdc39a80f3e0afb0a20bf997266443a86a80c41c2873131e76163a11e123b920b14f8c244290c41ba00a022a8d99ab2864ec061491a07729d60192034880305846480d2000d8c0f50c6480d2000c48ea1c500d871920308421007dcb6f928438100522ce980027c80c3131407aa4d199b32752ce119203000019df559e0013064c05ee71fd952407c32f8744921802864ec01d091a0772ad801920348816c40c901a400189a92300c901a4001891d438a03a0832406108420543ffb42d4904014b7cc0012a405dc98a305086913fc910983888824a28513083205ee2406001920348860a2806480d2000d8923008a24681dc3481fe62497c184912243caa44190808828c901842108004bc2959cb30a4e000a5779698002b8809c10645c80a6cd165e91039f01288e93c674dc6fef0630c9c320cc4910c208b2f43fa0903fd090de17e5a7586781ac2471e6c19800c724481dc256186480c210800017a70f47b4ac3000a438fd98202b0c3240610842002334de23ce6b000a453d30004f9015b20c8b916a03233439401920308421a5eb5bdbb2000275498210c2048a28be061e1e02422830058c01e095a077099881920308420000000a44c1019881920308421000d9e47989eaf9e00290fe566000a9202484191520445280a3c85a51))))) private def zz452:"s01c4"="s01c4":=by decide+kernel theorem v1:V s3:=(S (S (K 16 nt 0x4317144324069040861ca1a062819203305042093d0fa46600e444d8938b9509c9018e8491c62506021706801920348be9b8e5f3cda4f9e6d27d371ca77b8749acd6c4d66b54ef70f169c0e3a1c78b4d8c911d3afc13a8914310a08057880d3984327806480d2250a0841000f90068230e7b467be6ef3e4207b467be6ef3dffe5b7b34df3ffdf7c5b7b34df3ffdf7a8b56d0b2276ecfe8ad7bc9a296ae2420c202a5507b3388a98310a08412721e428c07e089ba2d5b42c8ad7bc9a2b5ef268b56d0b043480a10225f867cc188504a68550f318745ab685910c52f9456bde4d11bf37c086101520d7e14c814e188504a494545badf3dfc85b8d67a86c75a7235efe63ad2fefea1e45ab685913b767f03f1488830a0f82e7493650a1885042093500ba185819006480d225c58b8896659167c2cfc1dd43cf883cbaf2a1f487e8430c203102284126a00f22027640f1cc52f2245de49d90031fe650dc39fdd737d2ffcacefc9ffb0a60d3eea3fc4e33de335106fd26912240760a32186101881142083d07247418806f4835690b7420ee44bc032406913b03170c901a4072474188015c8ea1c509d8919203084210019ed7f57bea7c80103aca4c038802bc80b9906454811212) (K 16 nt 0x2b0c12219203485d65ee3f8f83092e1be02e3f4aa0c0401824a3240690006c491805b92340ee13b0a32406108400004014898203b0a32406108420006968d6f6ef3b000523a79800290808f9064aa8d15c19b4032406917868e00c901a44a141000a1005d2b2c61ae35b728504b48552cb1872e7c3c443b80f9944314be83f86267e6a778804184095142083fd131d91f40621412c251528504209350015180315986480d2000d880d51576041055903b8fc4915fb10c7f1109250600714076186480c2108400653109763ba002924980025480889064aa95102241)) (M w148 (S (K 15 nt 0xb0327006480d22d0cde0192034896decd37cfff7de96decd37cfff7df1ed19ef9bbcf7ff9ed19ef9bbcf9082296ae248ad7bc9a276ecfe8b56d0b09ff153cf9b4f72c0c188604038e40840acb186b8d6dc9d2d0b7f17192dfe5c58b926139f4fc01c6169d3838ea11c6514b5712456bde4d10c52f944edda4081a40941077a6879730621811f2154b2c61ca1a060a1920330604b0945461a060a192033060420935002e135601ac55d816215640ee443803240691039431920348003123a87140559c6480c21084000f7f1f5f98de2800a51ab3000521014220c97d2f2) (K 15 nt 0x167f9f256c1b6b36e0696e56a8bc6f11771ad0675fca01af6b3d07768dbca8d77736259c1a50c589fb8a301eb44ac887b30740d208826c60c42033f76cb1d2f641b7219b069595aa18d73389a3caf1fdefa0195f32c0ea22f6c59c49bb87f41f6c4c4088932019d9a4a92460c41c33e603404398c33d65ee3a88bdb165f26f21fe07da12fe000d2effdde73368d24687695cfe34f4b7d2c79eddf41dd29ebf57e8472a9d7d1cd4888afe9287970183111c445ec8b3a8fb14f897a163e44a7d87fa4cda1bac838b6ef2fe9bc94a3fabbfeb62a9cfa7d57a1db5e87deb32dcc828651214ea4cb0060c400e31a8000491541cc61b2b27607da48d03b9432786032406000038fc7028f6d2873051d982079c232406900062607186324069000624750e281cb18c90184210840100522600068203665915419ac032406915066b28c901a4001b136630ce597b873501e7c15f62fc441e50f0a079dd6f49cfa7d3ef5996e87deb32dcc6882fe60df62492270c41c2a8000491546cc61943276032648d03b94e18006480d220386081920348003634a0601920348003123a8714036106480c2108400080291300034101542c680f64d6e6006480d22b730a324069000624d98c35d65ee29c05ce8fdd2efc9cfa7e00e30b4e9c1c7508e32265c90106953e830b0f2e406218930a1546cc61c0b4946480d2000c4923018e24681dc243946480c2108000080291304043946480c2108400080291300034100e320c97d01b21)))) theorem v2:V s5:=(S (K 16 nt 0x24806921f043ea8fa1944a0c0441834a32406903e9198026113624ed1040324069113c601920330a237e6f88ad7bc9a218a5f28b56d0b0434a07fc225772459f386200358b6a012536862e00c901a444f0cc032406611f321dc0788973e01f9a9de21fc31344314be841a50900f32891e010c59340620040c882015720340461ca1986071920330674209392ca14600e444dcef0c0c3240660dc84126a5948ed71461834e32406008062600e46ac310038100fb2098a41dc474046480c2109292bda3ee46c0017b19d6b9e48087c1807140651c6480c210840016f54dfaf1c00290f980025480b8106454811212) (S (S (K 14 nt 0xac315006480d224d48b9f8ac2e789ffdf1103ad4c5301e775bd0833f92649845c928746a0310c4e4ec8bbca242978d3eea3fc4e33de3355ff959df93ff614c063fcca1b873fbae6fa00833fa2e1a5037eac730b50188386030240a60b9b186e8d6dc38fdb17f4394f7a55b8bff8d3bf87ff48ca01afffbbf6799cb5da72c18e236feaf5fcfb6f77a495a7eb27fea5239eec3dfe2f6e6afe00822e44a4b80a18893b22ef2890a5e45655dce9b8627ec75ffdc73fd7ffc85a07ad67da5b16b4f3ca48bdaf2f4b6a14d6a1fb891609221c5c30a0eac020310036e5850aa73630e071ca3240600815faf7bb800a3b30003b972608fc5c503b867f3f9013e8831fc954bb48106407140450c6480c210840047a7d9fbd4bc2000a4509498002a4809c906572ce01920348a8320806480d2215866019203489625a17122e2a1e7c3ba967e2cf822443c81c5bc0663991480c4475a5fdfd43c3ad391af7f316e359ea1b16eb7cf7f27e29102276ecfe8b56d0b09104515f2bca188013f20446409b0c218b4032406911866f00c901984a00024882005d2014c461ca19bce3240660ce8412721e428c01b4adb93a5a16fe2e325bfcb8b16e4c007ff72d7f6fff84701bc6f386e59acb7895837ade3d8eb1196b13e8eb4bfbfa87875a7235efe6024ad3f58819e1a7dbf0d25cc1883847c8550f31872868a18c901981c2584a2a5bd9b86dcb7a84910c2828410b9920182eaf48621c10824d4018a51d809d18c3061c6480d203937b0c400ae40fe884089077219c01920348b54400c90184214f77d8d7f6a0059bc77dbfa861598002b88ea1c5518a0192030842100193d47bf8d3000a4ba6000952036041905171) (K 14 nt 0x8abcacb733c69fc4781d6af6b5ba1ee23faf3c142f0325462865123862045bc38abcacb733c69fc4781ccf51f6fa1ccf51f6fc15ec95187f638d28920310f4d858082976630ce5bbb818418c901803ebc35480401084e260007c2f281dca1938c324060000012898200c9c6192034800363034a31920348003123a87140e5086480c21084228e2d3f46d88040149a4c00134406a4c37d0e3b37281eecf66cc530cf82660915fc81ff0884490188406f0ea000125d98c3396eeea02a9d98c32864ec0100baa077299201920300000646fa9f7850c98203250324069000626041c6324069000624750e2804520c901842108401005226000682032040cc4afb)) (K 15 nt 0x2bfee219f221b7612806948eaaf97bb40ea56d4c57f7223a571b1d405ed8b2f8d92459140ffe1422470c42033f764bf167721b73b0a0694ac3a1a671b8063bd46a8eefd756e3f88ea02f6c59c4618599020c34a9e8e38621819f3016921cc619eb2f700079e76d4cf7daee65ad4b71d0f1fb4bdc8ff39fdfda96bd50cbd2cd74197a59ae43fbe3b355fb9e0ed8cf3fb37633cff0bf423954ebe8e6a30f2e1287972062181c9ffdf11272129507a852f7e0f1196bd508fe117201592260c449ffdf11272129507a852f7e0f1196bd50a20117224d84060c40066101ab22a8398c36564ec101c91a0772864f48c901800002ef0c76f42864c103d21192034800313039031920348003123a87140e5946480c2108420080291300034101952f697daf3))) theorem v3:V s4:=(S (S (K 19 nt 0x2a036919c58e9e763073109223e8a9446cf53f943459218867490a50a0841000f91948cc03f4ca1410826b41c851862004b31e232d7aa3d4297bf09c84a5427ff7c4427ba447ab430a18310a08410aa0e51e232d7aa3d4297bf09c84a5427ff7c442115327b0521c60c1881142085507200fd21884d010f1942821041e8394a0450820f41c800d48621342480278c2b4886480c21084002cad796e9be0108f30352009b312969192030842100036adfd6d7f58020ba606940e802ac8322a40890901268524458833a39b426f8831486006d0c38afb3cf800e6a1440911720d7cde4912480c433a48515f679f001cd4f09879308bf23ef5996e67deb32dd139f4fa1e775bd0d1024442df84b0e2c70c424a10402a046523b022433066410c901983324852cea5ec8438963d25e69e8fb26f2528fea1c5b7797f44cda1bac9129f61fe9f7accb7357a1db5e89cfa7d77fd6c5483a751011e6a45cc188494208075c8728c320cc232406108981214b2f97b610ea4bf47d987f726f4687695cfe34f4b7d34bbff779ccda349000a9d7d1cd57e84721dd29ebf4b1e7b77d107488fe981e0e458c18811420807848720254218812ccc78fda5ee47f9cfefed4b5ea8f3ceda99efb5dccb5a96e3a00157ee781fdf1d9865e966b90cbd2cd74a9d7d1cd57e84726ec679fe076c679fd8d1017383a073420620450821541c85106213404bc6502284107a0e48c83109a12400c2615b04324061084202cff0f6ec00208c08880230c495b06480c21084000dab7f7698840082e9810d03a00ab20c8150224240480505fd1) (M w28 (S (K 17 nt 0x2c912210ff846492237c3350600810c38639ce2a1c7755d1f3df87daf7559a67468db5c0c39bcd836af73f2efc3f745ce8a7026f628545de96504e7f1cdf908273bffefabd4038ea11c64a284028d8611454a1885042093d0fa46604ae44d893864d3006480d228b56d0b22b5ef268ad7bc9a2d5b42c11d20d440f32b3e60c42826d401ba6670640192034894282104003e401a08c397192dfc5a13a4b9745c54b88137427242ec45e9a73f8e6fc84139dfff7d5ea01c7508e3289dbb482218a5f28ad7bc9a296ae245152281cc9c0d3050c42821049c9650a30220226e5c64b7f1684e92e5c17152e201bd6f1ec7588cb589f4378de70dcb3596f12b0ffee5afedfff08e00495a7eb0075a7235efe63ad2fefea1e23202c40648a838b18310a084126a5948ed71452f2245de49d917b5e5e96d429ad43f73d6b3ed2d8b5a79e524ffee39febffe42d045655dce9b8627ec744488a183d9214484185101885042083d07286388dbfabd7f3edbdde86bffeefd9e672d769cb0bff8d3bf87ff48ca01c7ed8bfa1ca7bd2adc01eff17b7357f27fea5239eec92b4fd610b920a5140c2850c408a1041e839011490c4085441a40854690773b43130c901a40723541895d0ea1c50a18a192030842100036adfdda6210020ba601c40140404ac8322a408909362) v2))) (K 14 nt 0xb12300c90184210042100affbcade8c82a3304818b40324060084011629e942b89184c1034e3192030040008a3cbcbf68e2861e980022c8ea1c50394419203084210a6ddfd6b0c560100521c4980027c80f610660ae1a4467c04901a4e685edeadb32f2b7697717e5645b5a9550a960cc4241006480c2108b54dcafb9e020080295304044886480c2108426876b7dd730080290c9800254809c1b94400c901a4511241fd49f491f49540b5ec76749c2c1f6215ad3dfd16d6a2035b0660039483b843cb9223d0ca3ba908cc755d6b325de9ce66dff06b994522c06620128632406108420004014898001a080a8902983728e01920348958800c901802017796a5e9ef702885a5a8629f804e2f4982cb06143f123ba2880203bfe27ded2920d3ffbd337868b991d1a0cc006d901b020ee11a8032406108539df699e4ac1012d4acb3db68014870c100d461920308421000f38d35bf6b000a43e600095202ca63d01c11086631cae5a8032406108021007d6c6633e60083304496846480c06a6338bc3b8f005cb47d4dc7d0df82031e97e3009b8617106fd21fe80810484a9eece5ef1b118779c95035cc8ea90660035880e010770152819203084210005bd537ebc70008141f30004d18d518a2d45203422d0e25d466006480c21084219c67cece76bf820086debf375fc6c12cedbc4f93d61819d182c414032406108420000000d31096631f4944e304024146480c210840016276eee95b0022cdfdbc5efa507cc0018462100bf98750cad49c032406108095f7a70dc69c000004429ee77bbf25746081e708c9018421080038f798bc3b487006c523aa5311a69249470c001b660438c3240610842000b7aa6fd78e0010283e60009a2fea154227c405126d52003240610869ce7a92080018fef9eee5a007128dbf0b243e60883c8847909ce490123ee7db94e7a2d61840a8198814015e68a9287ebf63f8544b213c8ebf7b63c5ac3080f83310681d005f97f5049f53e202405426f0c580192035d3118d7010040054e3ea4f3a3864c1240224543ff0f64d18291f39296bb40d6923983300148604ac232406108420000081300031995930efc3d05c3906004a6daf6ad4d16b28208198814015e624860b192030842100afbadffedf098feab6c5e804064c10081d006997f4fc9f53e20240280f0085ec1)) theorem v4:V s2:=(S (P w24 (S (K 19 nt 0x248867e143831c9c137c33486006d0c390331846480c2113024288320d08324066092841002891951868508c90184226048520641a986480cc0450820051232802fc80c898f34ad61db0ffd9c397c8052fcfd8e051108e7e0c2022c492386205d242869594661b721e817b06cb1d0cafc96dfe852a68eb110c6b4b78b3897b610ea4bfc7da87f326f0424427f0b1027c38b183102284100d290e48e831016298694a7b01b73b2ab61c64bb656b70aa3b5ed431dff150d33a9d0b3917b500ec32445c8120126d900c3070c408a1042a8390a20c426806a8ca0450820f41c9190621342480184c399ea3edf8399ea3edf4f1a7f11e0abcacb7308e101247512c379a6a80c408a1041e83922a0c416829222015731298d1920308421000529e690bcbd980109bf9810d03a00b520c8150224240480520a) (S (K 18 nt 0xb9e510c901a4102187286219206480cc1250824f43ea40d43240c9019808a1049e87d0033900e1226c49c3370640192034895c19086480d2000d88c395018906480cc1250824e498a4406a71920330114209392620062201ae44dce1886a619203301142093526214496a2e78562e7e4d483ceeb7a75a98a6004ffef88883cb8f28c8eca3d9104c901881142083d072464188050080e81036720ee24b42324061084318f7fecf376c000002072d300e2852d50c901842108002c62f595631ec20042b75d300e200b4202e241902a0448492900a) v1))) v3) private def zz453:"s01c5"="s01c5":=by decide+kernel theorem v5:V s0:=(S v0 v4) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v5 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case15 private def zz2159:"s086f"="s086f":=by decide+kernel end section namespace Green24Proof.QuadFull30Case16 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l25 l27 l29 l30 l33 l35 l37 l4 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x7ca7d0983, -0x2cb416090, -0x196c8a344,0x1522ce], ![-0x2cb416090, -0x15827ed2b3,0x6cac3e26a, -0x1c18686bd], ![-0x196c8a344,0x6cac3e26a, -0x14dd8e48bc,0x42973263c], ![0x1522ce, -0x1c18686bd,0x42973263c, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x975dd2f7,l6),(0x22448f01f,l4),(0x20d49ff4,l10),(0x1a3dc6,l14),(-0x6627b4e7,l17),(0x3922eafd1,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x30e392,l25),(0x536ac3d,l30),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x1cb750,l46),(0x165a0bc00,l51),(-0x105630e9b,l62),(0xd9b40,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x105630e9b,l62),(0x3922eafd1,l15),(-0x975dd2f7,l6),(0x22448f01f,l4),(-0x6627b4e7,l17),(0x20d49ff4,l10),(0x536ac3d,l30),(-0x30e392,l25),(-0x1cb750,l46),(0x1a3dc6,l14),(0xd9b40,l64)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1043108808840138c28820c0172a00c0000000026014802000009c08802c6020000000443c0530080004a1304805a0060000000078024803000290a44204880180003204d007230140001a4178028180a005311413006100400000a822007260203c82282d018c40140000001100099008000014848004cc0400000000580124018000000036009200c00000000120310040001a01040098c05000000c812018601800006a0440143010000003408807180600000000160148020000000000a06400801dc68048036401000000003c68198020000001d1a038c020000004414018601800000000b80520080000005c320718040000000f07028c02000000000380a401000000982901a300c000762b1300a2006000000000240c801002684609006480250829010800cd401800b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x40e2ff75aa7123479b0108840c2d88e7911220b1ce531a300fd5a3dea840139091c4c0cc184401081c0cd86a1f12342e382af62061998de8b648631993882880baf38739a92010b5dc5881260c230080000a0902a0dcdb2e0000002c11fe92c783060491c718a1471481080ca00800130200200d02901000084102809c0dd35a87416f6f1812f72212242a6e4989bc15fe89fd7a3893dbc181b8f6876ad2a9e8c21e89d0515ed6eeec0c61c484b834b407559b27a5218b92081748cbb048c7eefc736618197688c1f576016e6821902098e7b8e70d07f1c1a0fb94460a56bc4cd0e38a4190000343338958c6ff5be007ab4af81596d1362496002ddf49383ec0c0b8e44372a489ba763d0f9af51d0f9af51081080c60c40030010001ddb61203dc7d96e36bbb4f59562b0d50c4fe20e48964c86997df6002e2291ed7d49c60a8290eb15482a88aa0005f076a38c266b42d15b6a38c266b42d157ae17c34ab1d3d87ae17c34ab1d3d883c35fceacd0d0fb60339907626228683b13114409400589ea8fb95b05eee6b202fbb9aca000214e25631bfd6f801ead2be0541164ad3601a8a34c1164ad38000000002051031c210208100cc763b325cf0f2f51a1db1eb5fe28f58f4e6a75b415811255d63c9dc3a99a782ad1d34842970c833ef9b8c4d39c5b10108541d5031e38e4c104b7caed9ff9fbed2826b134cce948483f44f12de0dc7473fd365be5cdf87acb84fc839f8284afeb150006563d57f09c1ad971ffc800f46c55136df53fd08c072c1af5ac6640000000000000000043358c6c1fe9a084ca8b8fe126f0d2b69603ac2c1d23610dd00000000000000000fc860430460050040100ff3d67c768a88d386952f37b221ca85c8c32f19edd53c6d0a5935387ef0dbbc81d4f7e84ea05a563f5bde5378e268ee8dea0c9b28d451a5c7c9a45b677c3a2eebb995e29e1f2bee68e26908b08910f0f10787197ecf8f517d92421bf4e1ca92469b0638060ef552948d1f740016fc81394c0987404a0a0240140c4f6278e451240a274403608dc385904cf0956083047174926ba222842d77016702440054aebcce5d83806c9afad405a28016cdab024b202289a11d5677529a060b00b12458b237396741437ae0aa70c661220cdb50d342f082210004ab9f98e10fe499e62c98416118929c24c940aa4e1e4ce130a0a8fc083a347880161cb7b3d94e584801601824855de62ef772018526307cdc43702440bf69d5712d81043fa18b9416d908289a955c7479f1412fa1fa9246701800f988d60dd7208038f2ab6cb29e0402c5f9447a9ae9060900300400001259b2c73455a25b4590176306d5d61860a1a9344b4142890d2035ab49165b0067973a28817699e3458041111308d96a0a0068637a4104c8804290200000e8902309f19b45913d4f40a2b826ca5be2e243270397057b02861f744d7f03c40c89fea6e9b61612bed969d4c018207e1ad1bbc0282100b7e46b98b03a58a53cc887209002b02c60e514ca072163d5c6b2a5068c180d8e450e309df65916508cb3cd7190c108f8f4eb0480211d46c88800072804f3400110040000644c0c0d96517d237471b903c59803ba9228fff9c2551c1145c33f3bfe890c48695246f81fde440c5da610d77e98c10ef98b1f57000c003140ab813340819a80cf4cbd5b7832400bc101839442a36b658f576544261a305fdbdd1a38c2770c86c94232e5187e630423fbd50f12008495a01020001a) <<< 16000) + 0x6a1ea50004401000019120007dc6cb0ca214afd4c207211f418ac472c60e56ed39f0e2459d37287d19a1441e5084871ec202751621c532a0c10203aafb77e1400ca8a6f3d560fa1010580580001ee20013ac403c37c62001cc49e050cc3298008f103a56a285884608a99d21304082f6aa8c1c4050566fec15911013220e63c8c301379dd6992000ddbd3e9c9204801300e008c06044030210101000e4601139209b20a38cbc31b8517c3451764597a2a28c1021bb5467ad9b224301f0fcf7ce9038619a2cbeff1b0600e01f065fdb1080031196c151ea0c00f249356f2a95d82400bc0f184ca3aff5aa56d5260e2540d7111a265163a20caa7d6fb4e2585ca0f62c909e2310100019f1b4d9f4a3023dc6d541ea4560a08f71b5507a9159e848070036054000101101f01c59d8e5cb9f33100c73e6620142213072c71c614518410208114030080200dc1d6b5387faa8163c69bbf5acea3461b3921b681848c2defdf9b3fc714c8f3d460058a2bbc803c46dc081362d113cc4c4005df94c63090901008560580001e420005ec687ab1cc230c6180f6c7524285afe2814e0915ce5b829e2051a967075c60848d6ebdd08206e6484e070049f365570280c220080000cb9000936200171840070dc80f0ae8882890b40442873c3089f2502070000f28a882846a71edf1f524424d6aa09b12436b23c1c78428274fd8a77c52020c469a20f32000002af70e0b2400a006143c8c89c403284aaa74ecbc4886b2b612d890e6f5a120014132cc6cfe920211dc4f6465007407cf83e700230080000b5191f7bbfaa226f1c6000491892c09111196d01ee02432e5855a1cdc80ca772a7cef620279bfe7d7160906dabf9865681c10defa596c88a000021a6d1c0722410a808000041e407417240000c0ee3200b189f57c2cf0a058b4d620fee2eb2857a238860fbf881a09c3edf8a5c9051bb7cf9c6e0402548d800c90a240000445a7f0006002d80eb18f5e302400b40c1635b212074850c5d85bb7b962f1e8cae0a50b4b8bc26d081b1396e25a402ab5fbb818201ba0ba10938011004000058cd8d243fbb4bd0070c1208718e160a18e894855e3f10312447a26dfe5840c721c9eda090800014abce80608b203bf84da140000255628200803a2e747097e8120056048b2353f0bcff1431c13d0b592c5f8dfc6a5850a000184d3440c69c17d2c0e08a2ee299f2c025e52f9ad3801180400005a88001ce191cf4edf3ab72246ec274a7a33c81082def78233243e6685a74b5880c0000156c60142001009121d0204920e22abe5280000f30310b09009f11a2da9a4ea9082a020000108900098d30854e3f8508ada6f586fdcc01dba39dfbf845c2a192077b8a9c800000000000000000118451030c808708704604500401030200200d0001ad20380201b0100d0080045b080c8ac0604602e230161180a88e00978828ddcc6ec3b79c0138d45295bc06c984d9b9cc7cddedafd2d27edf3a29d866d0f09fc323caae1dd00a14eca283d5d8837c5ccb8715ca5bfdf62819ccb8271e224893d3197856b8eb18e745f09d301e6ae85d2f626b217c4337fe168d94609244ba538767d12b8a8605083ede647b9490f633dbb43b820062dc683ecc91e399b043cbf71381c36af0cccc914109a6e51220dd2c71a8b1849d74dbd2bb5faeca329a0a1a8d1699059ad3fa7933f7952af501f80026706beb385a6d8a9261529258518fce35c6a3e6d5bc5d82e9cdb5b95db1290baee17ba90b9aee45f82c53b8caf05d0a2294c77f8a2c0a84c1931a682c2902ad5e8e69c32df02c8cbf970d4d64344e03141d745632c5dcc6e0b7397b8770b0e74481c30eb41d2bb32878c493b9df75887fb5f58cb75db8002802a2b24991dfa3400a25cd16c220822008402004010000044404c370100100400001110121180882c04007206a161bab36435a52395b423c8a195cb917068e938d1ecda1230d9f42d4797025704f0dc850dc63058a4ca558dde19ee052162d0929818ea487ff149000065045e13946994a9b3eb8ebf74d49deca9c89d6ce49b616a73e3b10a0dbc6462fc2b380da54481670025d46841fc0f35da1ff19d6b7d01dc451e3a4099288da1d40f4898f46f1799124bd8280e78eb7bb7940ac159be21cd3e127139212f96ff0173fb50a2589636aceae38793241b1d05793a84a188852c931e3f15f482b3f402df86fb9c1e83116b3f69bcda09878e4dbd37d3e1be0d39216d5426d391f7ac3be1837ba816307bcac7a4dbdbd4a6243badd800078d30370987c2220242384001000d01ebf9d59a1a1f6c067320ec4c450d07626228812800b13d51f72b60bddcd6405f773594000422096b6397780599011408608409200a0005aa56bf7e6c293843c0697241f2452461f774a82e10e81afec3fc15fcc0ace7e267629498e5016486a5620af25280019010003a9201e4ba08581ee0fa083154d08d6060002a89bea0004db901740202248504401080e0080200381601a03a1cf39775485b271a82fe7ba3bb40777ff70aa032bed93469ea71d43764324b06f42669b5919b91b1131d02d2ac2a590c7160a1ece889909fda4ccd89e97ae6d38e18035329fd09124c448dd8e0e39aed47797f7e45d2f184a977acd7225d52bb634644cbb226129da2ac46d8611796ed491c23c71333d7243bf6babcc22a5489b108205684c136ac604821aec567859759ded2f54726aa36af097517ab1cb50c357c01ef51c3d428fd4dcb14458b591bb2e7116156fa16075b853163ac47dd5fcad800165236e177d3e26d34542a3b345)) <<< 16000) + 0xa17c2d395fbf8a97cf4df39eb7ea3372badd5395751c3e9940ad129acd7a8b035e30f8b65671a65dad4ab9073845552f745fa1827ac2cf3deb502b59093306c28bf7fa2f777d3cbb3761f6f0fc9fb3f5891700d243dd9caf1d779f8a8b45f04ed780df94af31cdf9733ae8f5f36e7192fdbba00028788005429000b8c20030ee62d6d7f3269665362d48a1fa11150a9b6d5fa8f91f07fc80000000000000000f8d2324675d31c44ef6b0defb7e4dcdb5ed7655b5193ce3708e80000000000000000000000000000000000000000000000000064172407435f36148bfb2b25ee8d4ebfa4acd7f2791bfc64600000000000000000000000000000000000000000000000178c60c40c30c60050100113dea2df62e322ee4d5f28c71bf3ad7a3a22816b37203ed14c8bb5c4086f09fc6e0e0c3a9fbcce1f053f4c95bbee1281b3913e1afaaa0e79da08ac31e71ff035d323030e3130545855845a410179380d6a629697500c010003919002952200b3cc604149d7d867ca908618725782cc77d3870bb699853b2628a28472e95cf5839240c101894688f0026020f3969cce7e7c48401314702fc7fd78101a9aeaea9012b00047d09010386a0a8e2119e01e1d3638406f16799878a1086a7ea65de1820b37890f7202094ac3257ad83812e8144f86182000008f48fc42000913881948000009e3410d138e150100000808e1809c3aabc384ac326b488a11a43e5abe2003f6448ae04047b8efcb608034543cee80a330e1100434905cca9a6cf8e7f34818bc20377f47682c80000026c9e734b346923d60e3349daf103000005957f89c00c30c2d828fd30ea02c20000a6ceb9db703401174cc0a2394b22c00001dc27f254faf42404801c02a3492493d4a0c6910c8367e1080c0008daf2881800007a2e3410300bf5b5280118040000430e1035062598cc1e41cb902094380003a0021c00008798c8c808460100000df20100ab1c3c53af322c68d5fb60289186ac4ba40181085d625ac204a4580abd1c01370fad684019bfdf5920270c220080000b49d2419a775c6088d206d6c0a14088b20000018b2260d1a86ea20fd8007080000facba48604000000017e8d004d382f9769cb0000083b220049000000062bca61c9002c028693063b9bfe9a4694668dce706000017701a1dd17553a8586000017701a083127ba5c0000000c0494e0044010000163384061d8943f983e66ed99639a100000ea6018136a07363d0e0000001d4c020000a6815f35810900300002887062be944fff32c6a849289c25246000004f1a02c4591cf0076e1420127bf19832c12c808bc53e1c0288e15325210006b655b8020005bc65c08d9010500380001f22016120007203229a8bc08ed62844d322f8df6489462f3c9594710000013c6812149725ca8a80c100031e7e48082334e9bd5d050134c8aa7158002de32e09036814270180000f7181103299ed21901c165e55ea11830000034bc04028a654bffd0900533bc81530e0002c3f65001800e2b190eec2001c62a9e478000f4bba0482490304e0300001f020023424004bf480100b8695d757e987b7ce6b10eac3b50e0dbf41e02d53a5ce53f276a4c84c49ef52d9f90a9c583081a62f170322ea3400580766d5b4991ceaec76fc06809a01a6f122cc99c8f6aa363fd88804ddaa5870a0901cf636c01278d3b587b56ef919903340ccf18b320d5689732e0de15ea0c03eb7541249d647b9660bd60c0a401581c0d4b806b8bba840970f3063262571d5db4ce200892f8e89e1b0824f53cc8f93a239bc2f7347595cebbde13727b61d1682dcc5be2aec7ea081a6c948db9b738aaab6483cf78a94b583142b2499444ed7f698a3fb1ce32c84a2e7b88124306a9a00a52c877d3ba600a5ff66fb2a0fd8ecdca2e723a4c61bc74738ae29ab35126a964187a5db6552323629cf6cc3003568c6e74127c8ef6b1d5216715ac9632559195daf253b6a59b51d0efbd13a2f2399cf431f736907437ccbd85921c36400268dcf163201b2e274279f789f51d1f6aa4e7e4ee2e7618cc55edf3f91945bd34417ea38c0c6df9d628187e438a5d7a580113685944a291c6c7795f48deb99adc7663d75816ac691cee559e7a451bfcbb3846184e94a004005cf7f9242e4be043d1ab5a3c69e307056d08514d1b7160e4ea0d4df2b22873e2a0c2df5764155308d4fb29ac57f924b06169a5f68c14c860160122803f0c2bc5027829ba0a08910c10804002807004010040048280201500c0100400001119180d154a68c32080e6a21c30079766260004313d807039e1335f8c070b991d95098407c02000025668626b0c280304e7ff21fc2020032c10c30100839db2281e1861c92a04a28400100001063c42902817b10402be15de14151f258f2280db17da86200987cc2161c019b692ca50498608002000026840010fc80027b1000cc420027526863eb34fd442832bdd5f4f02020010a39b828071ac0e95c20000d59b86818000109dbf810025c613a7202338c1200420601340d95e0910001712418204e1665fe028710000636afc18000018a02700001be340f6d429830980410300b679f8a24400084edfc40967b6c740c71000000bb81200008626fc20028a5c89a6858308c01000028060500084edfc1c515c0fbae91c39f875be31183000002ee0101000001a0b409440900200002327082b81f27b238400109dbf83053f0ebca82284000005dc03803d96aa2a680002c766444a284801000013e2000a7a401c7400c0200501002008001ca08019280089400202000010019779)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 18 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case16" = "QuadFull30Case16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 18 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case16 private def zz2160:"s0870"="s0870":=by decide+kernel end section namespace Green24Proof.QuadFull30Case17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l25 l27 l29 l33 l35 l37 l4 l41 l43 l44 l46 l51 l6 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x342cece0c, -0x2cb416090, -0x191a376e6,0x14810a762], ![-0x2cb416090, -0xba9f572c8,0x4d555df36, -0x1c7fc70e4], ![-0x191a376e6,0x4d555df36, -0x14dd8e48bc,0x42973263c], ![0x14810a762, -0x1c7fc70e4,0x42973263c, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(-0x975dd2f7,l6),(0x22448f01f,l4),(0x20d49ff4,l10),(0xeb07ffb0,l14),(0x65889cfa2,l12),(-0x6c1fe5eb,l17),(0x3a6b1aa75,l15),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x1e342a174,l25),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(-0x2f2aba8f,l43),(-0x36607e6b4,l41),(-0x20400684,l46),(-0x1d0b02e4,l44),(0x165a0bc00,l51),(-0xa2a55f73,l62),(0x8adfd4da,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x1e342a174,l25),(0x65889cfa2,l12),(0xeb07ffb0,l14),(0x3a6b1aa75,l15),(-0x36607e6b4,l41),(-0xa2a55f73,l62),(-0x975dd2f7,l6),(0x8adfd4da,l64),(0x22448f01f,l4),(-0x6c1fe5eb,l17),(-0x2f2aba8f,l43),(0x20d49ff4,l10),(-0x20400684,l46),(-0x1d0b02e4,l44)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x24140d3008000420c84408900300000008814073008000022011004cc04000000000c8052008000000000501c802000000000c80720080000000c8004c80400000002a00132010000000c824030c03000000000640d2008000000000f014802000007310409a3010000000002a01c8020000000a81c07300800002881200e4c0400000a806003930100000009824030c0300000008418063008000000001a0148020000c4321100d400c000000000e014802000000000440920080000000026014802000000098140530080000000005024802000f02106809c40100000000009018802000000220a00c300c000000000b0148020000000038303300400002e0d0501500200000930e40223010000000016240cc010000000a824053008000430a8300d9003000000000090320040000251109039002000000000050320040000018848070c030000000001c0520080000002112018c02000000000440d20080003915024089003000000000880520080000000000c0c801000000000a80520080000002a0501cc0200000a804401330100000000120c0cc010000000003409200800530e021014d0040000003a14013300c0000000e0902cc02000007c54340a4008005609016027500400134230480324011420a404200335006001482a04803d4010005c0a01c01750040000000026009200c000000110b018c02000000001c009200c0000000012014802,0x140d20080000000001c0c80100000000014062008000000110f014c02000004e04401630100000011024038c03000094260900b400c000000007802480303c82282d018c4014000000078004c80400000000078072008000014848004cc040000000584807300800000000b00248030000000036009200c0001a01040098c05000000640900c300c00001a8110050c04000000681100e300c0a61221b403290050000a84819015400c0a60c2104034900502983384700d240140000000016014802001845804c0534010000001a0b404cc030000000000b0320040000001916014c02000000064580b3008000000882403cc030001c89213016400c00841841e01590040000000088f033004000000211e038c020018c440d007a401000000000210388020000000841c053008000001c8440a4c030001687211029400c0000002e1d024c020000000b8740d3008000000321d038c02000000088240930080000000009024802000000044340f3008000000250b014c020000098842c0540080000018828070c0300000b312401130100000001e19024c02000000000740d20080000001e19034c0200000000074092008004c0d41d03210040260208210069401400460841100e5004000000028180f30080000000f07028c0200000000283033004000021150902d00200011c5211013400c00611081403750040000000542c0d30080000001512034c02,0x184510480884012461c418600b95006], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x2ca81aaf6628b2474b7b84b308085416f6491436718c3d2420377bd16090188fb502d980088021a5a7697b97a2ca28bf8fcfc60e1e3109c90b1c2611235198201929fbcf30086744ca8f3001180400004ecd9006a232c4348f20d7f37b1235b8a23ce8021568d60ca75efc5b1ba102c5824337d161d421e1f4ba07199af84815006dafdfbc207d23e703fbf7be5108d9ac178f9819884022c81e9f28433a82c830e74b9c282f983d35c5c0c1b248d6fdf6805b6f4d60704998021acaa4aa39b58e203a37d9d5192e823286d0f378791258bc09c0ce80a3efc57d6af09421b0394536ad8858ea9770d4f28ab2fbcfd89677d6a8144d93fe60efd25853c0d528851a2b3b7855d69d1226f36df7813faa57591759218188083a4050639400032a103a0984084e8a260e36fe90b2408808e10624984f9fae440920b8895e27228624ac38a41840c0f5e0c86c300124f191fa8a010f4bb2640526030980401000a0001ce3634d5644434dd3c32de134c6f1dc8ab8904fea8987a48a1f463977ceb3391f5fdefae2fc5d63531bb72457120e9601f690cfcf40304f310d623fba778a4a456a003809afd4f51278cbb40364d5729c38b0b8d9e7136b70800ea308736a1f8131e357753dea51e3c7baa661b98afa05efd9edb65f983f69312283f28d433bac82f042ebbda66337989930527b824cd28fa2398f94f224d8afd27eabbc1795032ae637bc4ccb1e8a2944410000555342d1ba20d9d9181547b86dd636deb1ba8a568580c8e191aefc30d05202ad52c0acf19c63a8e2aaf19058c00a305b1b49c742a32df4d76d02c9de785fcfb1d8a03362fc61d0549f501d2800ba37312e86a7cf94506046d3d1a1313808e3da454174c5c34432d880c9128b65a482e4aecd7192284ff09be9bae2e64579e92da0b587d1ceeade421867df4a63948d28c4e0f8000122c8140ae452f7d29c6a30a1986b8a3891202d8af7c8c24d86297a61c327533bd003819e65a0d183029b96fae400a1b82e788958e404601800019e322086f6fb703091d61887d8c1170dac03a202d9f86de3860816ea44cc2ab28c1100401fc27222db2e5f3c30906c0053c8c114164588e202c16a942a06080ba7a8ae18092b6953780ab30e11004000050c83f0a8000a6c83e90e06471c717cf7e2601c89e87b1c2c1bcbf24b385d0f2c9350b0814d5ff5bb7fb45b6b3aaf7dc20518509c01a9eff441b2b8f6a0aba13b671a3b4e575f9d1a101e52adf9796c86abca6312d084fac8a0802d53ecfd5323465d85d49d28aa61ae612d4a4172f76111e210b1643900006ca702778952ed33b38809dd9fcb9578da18221d4ff22bde10c00b7f4c6b1ecb4281216632ac6d3d080195fc1b49674c003bbb7baa86121cb8842c908442890c145f8aa4120e6d531819020000094083e1681ec360f41b0790503c00b85a7d755eca183056f7e8bdd65040041a99e731f83816ef5846d180080020f85cba5a84b14ec69ac49b93ec7b9d2447450ea176b40474378bcbb359e14a0b00b19798d42372f31a8473785aa12108c491c70c60c90830460154ae8e543675fb01c6da2b649dced7258447312198331b118ab28266) <<< 16000) + 0x90367ca732299b007a29656246d13ae5e63508dcbcc6a11cde16a848423128820518310314108069bea7a8c088133be45557d4310d73d26bca63b2b2be0053fe34a02f6a2829e72c39e587d8819448b9798d42372f31a8473785aa12108c4a14914b10510604800301a78f7120d144087b1a66df92dd2056ed49a227d114cf78ee30ce255cbcc6a11b9798d4239bc2d5090846250a48a3082882081862000002060500401a03c2b0001182036330002f12000a1c4001d0c83b94e476ab56a36949181069e949f1c482618d14d480e447bbfe7f202700ce2b61870ba7ea4b0d11804c4324d2d0200589e54a555690184c028a22a9b8c4d4942ecd4ab58b244101ff7c12506b5d08b7b470c639116299413aa20e08a241c7246f6424e0846010a2330d45be74eca147c9dfb47980a10e87d937eec491000000b54640a0d51d2d2a3b4070c2caa88b1e90905b034ab26840b000dd7cf40ff8042810541faf7c02160120000858f345d2497eeeebb8e860a4f726ddcae90f3430396060f8c4c120000000000000000008a2488486406482300200100634b53657081c0068000da100056c20ec0307501e5e63508dcbcc6a11cde16a84842312882872442042431421c00c05c04008036889feec157d28703ce3707228563ae060972450729ad5792446d3e7f270183071d5179b08121ba2c85927042400851199252c17490287064f626afc0942c0269086529c9128c810765e303061639081fb780813459522cb5816001661a27d4c0700081b09d623002e59ec6448ab24021681600008848001d7901301e5e63508dcbcc6a11cde16a84842312c82852452842441832001005c04008036c86fb04349458dceed20028a16cdcd67310e2068f2b3111c31eab7af0858215803f84c204d9c482b99382118042c858a6cdd79ef8e38464859eb890b1aebd4b5e46c250b2840097c3381c405b3f19b5770e19027646a2e68204c50b25e61106000efd52562e8200001d36827e01a2a410b40b000045a4000ed0e5e63508dcbcc6a11cde16a84842312c92872852452441832001005c04008036c913425ce302c855af8ef542c68120a7150286266215f81285080ff99771c217d9b85272c1509e4e014270424008591945ffcc514fc1c7000dc5a9a1e71430f9544c5b92a8b1656204d37b08850a22170f92ef801c2156d9691178a1609c6368b1a4c5080401a067c64cae40008ec67252d7b27104821881e00009548001f190004fb20013c4406436001ddc41a0440e81a0730d0390081c404002dba41c0960de4b06e218368ce1868070934a1eee6510c866703139e44190c51f7cf53941934d12421d943d312a40870f29abf513005ad61291f8bbba6f9b313ee1abf86cbd8a8e3e706068ae9a9700000000000000000000000000000000000000000000000000c4c943f6b970d2fe9c5278fbd36879b860fa0a20820a006028a1b2930e638fda17b7e0a8b7ad9126362146cf6c5e2642f5c31926dfd40da86218871dae6b3e9bdfccd3c17df0194e0b269ee877260b84fccb807ac0ed2976f1f60c15396498a77d07c1b065477274955e05d7c23b94d3cfd27a6f0356590f6680fc8261c95432750a00092d83a360247f4753aae29d8d193cacc3e2c8b1ed7246811d64adb3ce683aee201c2ee37c0cb7a2a28531ab8506c0d83582c1a8040d20206801406e465acce4db8d89b7e01768586ba0250ed65447cbcd55d609dadba87984923bcd48347a599b84ec5f5499014e0bc86ae5fff6f324c254293fe436e579220244b2d27c3950d26195d21b97fbaf442e9bfc0bdb807c3b238200019e10c67caa3498a8703cae496ff22391fe756eaa14bb819765abe997cf32079f5906b33740735bbc020b60e7fee3f947947b3cc1ab80e1d9815f7afad6c6fbf60c30933d34518b9063e95cff21fa89673a76bdf8b1debc02b7b2da6ded355a3e24c15096d40ab4d73ed94a160bcb2aae2564baa355e4c2a6380a446b8918938c96c1c2cca029d0b5ba8dba8f5155ffd08cbb0bf5ce800340f706d2d4c1dc9e7d13ad3ce94b9035493310215af4c7c9012c9863ef160243c789188029293f7c8407add722dab28610004000040c83386c06c340cc1b0650d83204c18c060c403e2476538bf01c354758c5f4303000c7ba6a3021930b9e78500224bdbb14a0046010e3868c688501c481a89d5e83c600000a46470dfe7a066e4b1800000e174a004601000010c3a445596ca4cc23a691bf59b75e4ae50b1ba3a16fceb05fa57dc50e2a9650a6a18f83ee3eb1256463d961b9e83ca033e966cd2609f4f5b9d1dd18a18802582226d8fdcbc73e5393a1c64c6bc8ee1e08599c499467418c188f40248a364d03d42ae7dc59519eb0c3ac36b9f8ce17b8cfd909e3bfcf4915c7acea7514008759822700aced562f787f004aab24b535119a3f462dcd6d451720636a03e44988f2c62b72ff769b2da74d6f050b612c30371e36052d3e8f49abb2a1336dd0de51a4219f66dbdd0875d489b66cd1d954f19afeed982578556d31317414b5af9ed345217c075e656466996dd6bcb818e80704df053ccc4e5e841245c05e4991061db37041da14fc440eb9148bf7b034f263cfd54e6a7256e262bd5c8a7369e56af602dd14b888e22195b14ef3ae6f42305de6f40004bd1c1cfc50b0173c4044c42f30d1018196cd0304bef6d3c7ca0443e9c0030942088020000216418437c18296bbbf94fbaff64a116220ade28e470cf880b0e2ee92fea5b0e6008d5c325dd595abef2c2df45000fe98b22de74af37e6d19e950778c9b3)) <<< 16000) + 0xb97860c000550873aef822b704296cfb364f3f4abf24d02002dc1ff7099ff9001ab763aeef41637bb11ed1003e535a1d259afd16d8fd240986032682b164d5872c47ff2b41496ccf849db1b551442547300008a8418047423afa7d7f78880ab047173381a107936beb204bc04218187b31413cb31d2c4bd3bb48f6d22669a000c3c105d122f1ea81f78f518047a42cd16ee4e0adf7f1b28920097c51b449835c0e28429f62809f9acdb6d047ed574bb19640b5aa948eae0e637f21dd095310750331aed0a6185c0ec0001c7105f1182f04f420996ec863cdeb34acac70eddb5431e628bae7ad82ccdcfe0c41392141532cfbe8ac09fc34cbd5c4c56dbb41c6e51ae1e9f60cd07043bac4070412a6ef8df1db445941384a91c0798b0c04db151d3ee2884bbeb3963020d6c028152b2880740ab44bb94c13e9f3ea209d8f1def887747bd714237beb89a978e6c701657fa0bf7a20e7349ec07774eb9017ab4d9924f3f8986d44ad0a2cbbda0f1100d3ef4687939978e3396418d92dc50586d29243052fc09cb7ecdcb8843675de5b7d19e3ccc6675293b4274220e08a4f83ce2c3dc0123523ae279616573ff60bf839a8acbe293248fd784460008d704189e77f44313fb82711fdd8623ee760b0b07d4644e5939b9cce8c00381d55d229b4626b11a5e6dada7187fdd7329ec85bf91b1d2094dbbc42163f35adc633f667affb8e793c6c44528059327e34ab9ae04669ba7b1420614b1a483c6d4c73985e2a676881cafdef4fed9816dffc7c519f0ce48524417aceee1640a94c5114b829787f243fa347af1a87db14459971b942406ef63d6fe5cdae6f8a4a6f181d9d09cffca7c28cdb89520c731880001da482e8a8170440019fa74ab93ad9990029eb4d9e2001d0086940b188fc9202001fc05c84150d75d1d230021008000054105b01c868e92b45f8ceef583266926d7c640222cb543214378542f423091764cf1c67d973987f9000d12c8ce4a4dd6208c6567c1d89a29ebc896e0baf0eddd6f94e4e96437a9628485a4361817a0a923f63cdce0630c8706290fb71d390af5b5e19d2f3b65e321eacd09606398fa2b80d659d4917e684010490f88771fb2dda8052f3dc44c6a3f37ffbcbfd28dac3c20e60251bd9bb08e4286fcc3094d29aae86f671d85d8d9787efc4591f5daaf0b3b59c6122c7c000059720b41b0590d82c04c134260ae0b0540182580c001e4080150e90242581184e8a74fcada123005c521e8dcda889db9888fdf3030493a9d215e1a1695c09c8c101586f7f810180e3130256ab4d94f0d81236552d27d962d9469a1230bef87810536e304e25b1848f3ef8d6f0006e1f001ce195a06b3e1679a396437298431ebc68c0f8f458914fbe1d01fd6142df87e26fa9411e63872e6c2b4addbf86e0f7f8f9ef91bc80f06c64cf7efffdf37be774a37d19eb5cb722f3dc50843def6c8cba0e7072c31e9a2a7b064cc7c937ccf3d4a0c57bef9546eab51977566d318031327556b2bca78db650329c926bdd7549108379760cdd563868b7f4f4f33dc7da3352541850c0ee2dbc74d103078b76696207d0ac6fb20400bf38326605e65dd2fdc20451e4450894008f2e98911001491d59fea2502846010e200653115468463d037d41815306ae2365042510f1650c002a251cfca24a284401000011020761305601c840b1b18d0a924298ced815024213026520164d49273cc00000000000000007cab060227cc9eb894b81628df8d827ae05a0c19809609208402eef46ec146868182176c3086646a37ba722df60061a6c13e516133a8bf5c539d7c53f52fbddd34b14007c669ab22905e9474000d6482a828150140a603804008022c700d99aab458a0261659745160b687abe04080b6638422c00087666be3802ce4f1e4050039125d9bce0046010a04f7cca2a1034c4f17004018b6cc446003a01000009c3000010040110080000dc80013990520d82886c140270c3403849a50f773288643338189cf220c8628fbe7a9ca0c9a689210eca1e989520431dec3c0e18c070bc6232ca2e5bd002d47956090b0ff2f55ebd29a4bad893fd98e52a679fa08445d984985db600000000000000000420218866808302cf4a259673d616b0239ce41553812412c0040537b865ef4537490feccae38c205dc59afcca96453b305d532c9d0b11a02a3b6670e103d16a7efa12aa88ce078481f492b68bd0d63147e0c62456fb0ed41073c2163cb13924b65660b1f94a34764cc6ecbc4f9c13600022554e99619dc1f5f126f7f0aa08cbaf570cc03becdc1c70285ff682c50a12481a2c349d1576d2c00492870f1408ea3b691660420008618fbfbeed858a01d5783258679eb253a287ea8fd54cc808400100000d3209e0bb2dbb96a9686892b5fad35202173486419400eba280e080000f6695ca4a184201000010820006a2407804001488608823f6c5e0c312205cf18b1201c00fb640810be7a351c06874fbc100014215569041098708402000027a41384609a2304c0d82582c003be8800ae01001cf6200a28c70df2888082d131840418c0d1b538c080cb303c9d9040400000124f80082054ca8761431804b65b1b6f24800e8b8bc3d08110496316168120128540922204811023808118040004524017190803ea19b0e26ca7c842c0000004c1683e06dc8d1a3ed1240b65a21bc54c9daba11f447054ca1871040c608408501fc50a9dc352715db6461b37d736a1875cb2e340e0cd59139d9ad2f45c61bf2ac111437de468d1f689205b2d10de2a64ed5d08fa2382a458e58a40a3862864)) <<< 16000) + 0x003016b6f37bb73a4b9148eb88228e83c8177bd0206ae08b61fda03473c76bbe67b37040a391a347da24816cb44378a993b57423e88e0a99629429218e18a184155df7e4ab43c824e34696885085dde92bff8cf838360f4b180db9e2f6047d18280011a90003f83450c9423f15a143064a11f8ad1420f7c0bbf8c8e209a20413be08186c1e73ec61011db2eece0c0815a5bd90c52140b2d1d14b36840f461be8f540e04d0b5b8eac3b140850040a10659fb64514407d1d7d9840c0e8060f328202ad8f490808c8c1543810280fe69fac204feeefa1b6704220080000b2902c010001e310451181f08c04c360881b04309d1262bd0b49287390c754c0e30b5c03520616243121182027d2d37df340162f6cf2cc004201003501e8e5ed61625ff1c3454bad406bff459ad28722f6419549234cebf72b5f3f550bce8c2a16956bb502753d3776384dd70790e840cb2e73946d5fee5ec235ed6d503d2a028172a33773581ce57be12865b751cfda1001f1c59b99666ba4c7bd12bd995bb1f0de32f3541858356e4c8b8d08425c62e621093f59629613465e8a604791600002081b0e26ca7c842c0000004c1683e06e8b56e64ecc3864852b56815908163631a152485319db02a04842604ca402c9a924e7980000000000000000f9c8d1a3ed1240b43061851441c20c2e19d8de28c9f8bd0e8ca99d9dffc1c44056fff3ed85fca395d132fc6bb131f7e644b5b1a532e909620005d9d28bb20e641eff3225beb724acd49a55c268d5090539e80022c903a0d82106e0754a40d05144874b200d103252652391824f4553112c0c7503d901804db4a2d35426142000800009999193c66cb3da9da850a0dcbfe4749f861850acd3ca5917ef8a2501bf8d28544c470c0904690cb225c0820c9855e48075a2c06b23d50a428b61201abbd3e56cf7b0f42404021a82a01040603203d1e26b97088e36d9c4653185d78113d24085780259090107c02006a03d1d0a67ecd29f4280fd89c00a9f4918e9d8e0533ada1c6085500d677699d0653a94456c2bde56555ae9b4886149197fab32c2616f661808e67a3eca6f57cf183ef20013d2814695248eff393c171e064f84aa932759204502526a1c2f6c5ee42826315a9fb76c61a60ef115a00578f325fae28e31dad667da77226426a0c78bc30b2925a6e9160f7638562a41c2f4713044a11444080004ac2000b56406437d55dd5769800b7751dd46389bfa5484057054881451040c608b0090060153dd849ea36d712be61d9969ed89cb80ce09268fc0b8a2f88540006dc80050a9b143e7f8f58512ad850e1440cddbc8b348c10800200800301501d77918683ad02cbddf8206c47fffde4e0841522072c51032020811800c01b8aa1ad5eea3caf6ffa96fed3515ece023d79009c31743fa00035c60620d3191d1216262c736618445b5fc601400d5cefc3840058de12dc0e0094c18eae280103043388a4e204401000016a207e0a02c01000224901219000d0210261dc860a418dd298dc880fe3bfb2305c59210e89448b121c8650224f2ea0625a38203c503f0ee70fba764f67300db08a09a5328837c5f407cbc928610d0be1822a048654d0424686289e61bc2a09004efc582623c157bc1bd3ba62662803dbdc55387ecbf4a8601443226e475d799e782f1a238df39841b84d1430890418cc609f17a5c3a2044174bbd828163b1684208081fdc5f4c702844b3e26080622b550d49c2084021421359e7d55f8b18dcc944695deee76cecdac99eb405406c890ff8273935e774d308d0c56096dd27ab9fe710c15b85115597e20b61743f1fb3f2f09017950faa200b04df9782526548ed12c91a96562b53804b28e504beb0813208e56bc9f49128904e8a3b744fe1b76500f919d010fbe26abf1c430836f80328b23edd49c2348d6f1120409801d84eadca70929c1cd34475643f881a1a22e29a825aa10cae0e1b58f1d72b7df8a077d9162c4bd100108850adc062f257a626e2b07cf91767262fb5049885a490b1c46825731733a88b7afa8c3c1f2f270cd9bfc6f092dafdb6cfe943206f4baf69ef0f19dcc66639233a076eb3fa4e6f58f8800d46d8f57ae1f710255135000105840b00400137840f846024230130d81e86c0f027644249a5262c6e606f18e5897976e8a08c107c021a694552e5f61858689991a81a2c0a3e7d5e88206eac4d2d1c000693ca681a00fce27aa80a0068997a3813821200400005cce183a7ce3b290289000001c9081840817c565b08413a1ce14d3aa18608e5c54c2f182196941cf9904106e3bc792048009575ff5c0e18019118acbf1eb2005203803b0101a8080008b4d896908b89598b4a1c80fb9db9c13a5a1ca8ab536c05af69852f94e6d034fcec635441c22673219c97d89f98605966ae11db585f8468fc4067f13219bb92919ac2ac15f16f1401543517619c0d58dee9f4650f02c0f40ae8b845c1f82aa32c5979b8b04438a5df9c900c7995149e6c3a8faf9696afe6ff71b17e38f46e05e5fe487b52b7f9239268317a620044bf4bda48335de6912b494bbe4dd2e7c2bcf960ae45019ded662ff2d3925b3a5506cd8fe53bab5f11fea4d801c8b65b87e0af29a1690716508a9ec1018c6c98bdda9170ae0edff765aa5705051078a155695b5e26782d5023846556824bcc6850d093a40003c0103a1180c88ecb08e9256670c20013bb5f382480000011940b1c648adcdf00c3a66b17e6c820800904356a3010dfb17ba14b050757114fb040052042bcca6400980400720303801d8713653e4216000000260b41f0368d)) <<< 16000) + 0xbde5e529fdbf3c2d085e432054bcc8becc47522063fcac0000000000000000000000000000000000000000000000003011821621220e19809608000dc200401a0004f440dc140660a032050002719c124dd56a0e20405fc24e8c70c2681b82730107c7a525ca04716f568600008bed49589810880216b0948fc5ddd37cd989f70d5fc365ec5471f383034574d4b8000000000000000000000000000000000000000000000000062130c3083041c30c134030010030080200d000219206c1301901c00004011a2d0d622a0b61228a39efd7368a29fdda2afd51210438aa77a704109bde99aa20e08936a6a77e02085e069915e1a019c7314af40a004e01c605d79200500300001f920360bd36b1ef57b463c349047ce07183d091459c40adb50f1c40ef6040a822841006b447b13391c3208c1e9ea18830c4baf71fcccf08218647fd94dc4904bf86c955df39244801701a34dadae9a3ba130d24130ead223e424515d1ba52f9cc7103a2f4f1fc221040396b79108d470c82be10289da0c3124c941b58cc20856c918a26cd2413016ca76c09e4912005c068000236206a0200049c206812000717203223b0c0c8b93672d40028372624eb14df42880ce04fc796beaf62829418751a34db646087027cd715397b2c052fb7da0419644a011af27ea0d221313d0900e186c0a8033010190080c40400048e40034f88098ae89158853a3162141fd5eb43085314915a48336e6f8690c12ea52a71800057650a889810840216b0948fc5ddd37cd989f70d5fc365ec5471f383034574d4b800000000000000000000000000000000000000000000000006212cb2c71430c22410c13002c030080200d00021920601302f0981104c0b807408328a9e630101ec54e91020f004200802008000022205a0bf29532bc53c12ea66283077d5e36260834008f220e1181040709b85a7490c391f2303c0df4dbe04b00f4cb05225041e00800007a9800008022860b49c8d0e20094e76490cf27fa7a5818c74bfa90007402000018a40481400022e4000b58dac2523f17774df36627dc357f0d97b151c7ce0c0d15d352e00000000000000000000000000000000000000000000000001899ad4bd0908a6104000000036870ee41e23461830c33813412c124012e180200d821e958638a040c0595a57342023245b8cfc0610030ec7b0a1040f0e6a1b81010043695d99600081e944f82000dc7f68a4000223f9bb94a9002501041091004c1f350300691da7ca40434927104b06100083914e61010062a95148104004093e71a600260100000a81f3fd09654c448f2ccf604ab93d00c148eb43f00f0ebe62c7c988104899beb8829000745c61cce0f011d55096ca0b000000249f00c8804280200000e498dbde5e529fdbf3c2d085e432054bcc8becc47522063fcac0000000000000000000000000000000000000000000000003009219e11c11810e0080126b90206cba5ea179c77aed42a5a1f6ab9f588fdc10e01c95aa576144c01a85b3aaa8d7d7262a0c1cea67335551fc91ad811027b046e1814000e5880046e9000b8b38285ab131cc44654a52965a92c425553080225cf7b894bc6e6061d19dca482d73b5fa2ce306080b3b58f1e1258c15641460e0800000524490406a59e3f02c081b242b41c30b9fbbe3e4e20036343e64c8304a805368840006ea3513348bb21e3cb69150f8116a264d6714570d40001b510012e532381fec89c9b0e280000493e0121624334329414024dc5a64309001b166d0cf00e00ee5346dcf8a007256533fe082390e38500400001a120580200188a2006ea040115a48158080a805c1f4c60ce6ad7cf966b6bcc178457258e23756553d4a5cd398a903de87aaca652e6ef5b723d0f05a9376ef81140738a657f2731bd77523078759eb18e24b802c9f573f0caacdaebad649cfddf4189b53aebfcdeebd99dadde1434f0026a4ffebcf6d9dd88b22d38bb1e14e89676246a220cfa13e70374454174bd49628b3613267ba602f222a5b76846cfdfb487c8baaa74edfe52224e27a538f2b26dd591c7224568df1069471a12a0a93e159ab36a8fa54dc7312e75bf030c3823c212e465c03f059133028551ebf1058b63a0440160341b462622fe886561361c1b222f57b029e72275076eb29fc5618a0a01ac1904110900ec42f52c1e4d2dc2b99c1c18db3fac7ba61268e12ae0800dad87f49c810b1de9bcbd6c55787d3e088c3cb1d1b81039379c5754433ade75ce1161e643ce11a9f08b4732981519d50902754c7fa1aa37447ede0eb65aa0ddda91c04a2d9b6f12ff1f5e2441c08a221c8b9b5c29bd062b88c000089840544405202b94da70a2e5369c278936b03c40000000008a464e17fa3040b65a21bc54c9daba11f4470559ad4bd0908a6104000000036870ee41e4144182142140040525305c21aac42a0999e1b9a255a1ff780f036ea974a774f006069b4f5e96dea295cd5e4c48c58733ee7b9d8f529ea100a219857d0280980904c09c17c431b872a4101bdc1707e850471eec75c1827a2c7a48080d0be478c82025423776c000fea702e8a8338c1080424417a952e9081339ffc5461820751f4f6c40909de45bf1410929bda0050945088021029435907a4488735e5ff39025ece9f73830435fc183488112f6db5c458068d4d8548c0054d9d83a284e284401000016d2000532400106c81302c002058812908090860460bab130119ad4bd0908a6104000000036870ee41e22041032010c11801400c0514834bd7cc0b15c751485b65f48051ed419de6275056e60ba1)) <<< 16000) + 0xf5c20c1342aa428a2fa43ff82428be6f053101230ae861470016a5ae8412841080438a8eab28da24306e805ae1025e81353030119c82af02c12885b0852813935836c1c0f1203de69c0080021c5247da00388104161db99809ba52a4e16086731983140c6ce457d860179cf9854c0040010000129321c050da8b101010a01ea8600109f97dc600400100220100005d100036e20421b0200d80c04fb09e4c6dbe32939dcd6405d1747d8f0201dec3c0e18c070bc6232ca2e5bd002d47956090f4a259673d616b0239ce4153308202301240200040535edad3b12e7bdf2ae2ef251cd2925451c5ed6aa988843230d94bc94c787179bdb4b47b8c8878e45087076bc0d118430ca7bc502353439142284f0cd31c18907a47f081d89d90f88812b22b0569c010ec8fa20c004e3b0c63382100042c5319653d59e201ab774f05128ba686b428611486ed324101422b20960001d3b872600210085121f64731268a7b888ce040a277d76a27885be4b61e286ea2d3e2e78062977ec028129797fd738010004000055480014f901f05e92211f893c4864eba78ac40203df6d1e202293d96ec1837175d7ce6806d9b2ea24002195f3f824e184001000015b2000b384078040012524044360321b01d09f11dfa1349143d945fb0c804a8d5649081bf41709d50a0a0f00230c5e6d1dca1c450ff33368a18a722da68d0200d2f91e400355629f5142514210080000859d0c22e7e06080fc9eb3d78c0149866facb01f773b3fc9010800200380301901c000040100360301a01c102f7af7cb6ae05c480d881249ba908627b5fdbd5416fee9aaa24b28e03e8b3a7479a742e6ff902ef4045b0677ef3be7966e654e45c8df4294006da3401b337b614f6328b3ff6f920aef5e7f61f214727419f2ccb03b6988e0ae23d46a89678e5e125bdec937782ac3a5f62df335fdadb34dedf398addb3f508db6368c23e8161d8cc489c9ea11846b96c000116480026010190dc30d00e126943ddcca2190cce06273c883218a3ef9ea7283269a24843b287a6254810dca10515b2f85e6cb02be015146fc6c13d702cf4a259673d616b0239ce41565a21bc54c9daba11f4470554710c08d00801523f1429e61f8b93c871cd71596404477e5b2f2ae33bf6640a8ba5dd8e2d7966d30b589e1b0d55d900cdcd0791f0ce87fe5a312a9d79a98021f9dc2bf7c143b42184fbf58920838d4152b43680027e1000b0420302b800008022462f12aa994001c48dd4102299ece71800e804000027080b80f09a3b06e08c0ce1a46fc08070731c5c6003c010c1a6c3b6da491821f2001ca011bab34c6300200080000529016050000b9901501e8458902640102478cf29510050763a274703ad3abb7a180e479357b14944084020000214643df72898218300379feb300ba7bdbad2807e919a602400e1e2d7d1c03a4417b7112614200080000999014050098080014b88090e8004a24cf5a705db7c65273b9ac80ba07d658b040b584a47e2eee9be6cc4fb86afe1b2f62a38f9c181a2ba6a5c0000000000000000000000000000000000000000000000000311efcdb71f06a16b41938d82a7a512cb39eb0b5811ce720aa1221408208e00c05ab781eff69a14d64d3350d863a09304666a6acd73c28fe65b54420283e85957107192ff6116afd679b2170dc9d3e8f629425a58f186c42a298cf5c9becb1700df2e22b36c24135ddfb48ae7822cbc763d53dbdc056a1ac0a250110180800c03c07c4853ff662124fbf1e43d8e080dd5a2e86084ebcd0ed0008001124c4a8a95483080c728e905000ee63c2e98010802000029cc0000401124c5071065418403e53fd1980811cf45205000d9a46994800440100000d9200022c68805f897184a1c33a4ef931c79f748f99880c19efe47e34028864fb88c00c2eda36b20007666018c2708220080000b39ab06023250fdae8a4f1f7ada1e6e20da1e6e183e0000000032f31a846e5e63508e6f0b542421199230e18e11601200c024c6947acfd31f689697c79b32e380ac7082745abf1c2d056bd44ee66112fc0486bdac19283c50002b43428e0091d8040a15cf641d0a2ce7d249d03022ba0e77716011beef74a48011c7be061000ffa7ff903001d891a44a2502044010000199201c2a0008dd201a2200c0900582802814001ed4400c1e880192e9004651343ebd994839d0608d42f3401cd1810745c45b480505ad4f01249a10150ca6b02848401cd95ea8a2d0c050ca666ea48044321c80a8081c32ffe7aa61d918269fcbd207901428d52ff5c1b01c106a0a82ffd51417f58da01be804119067562e681008d52f9a343000c1ef1ed782113e871c2c02871ea0db8317adb438a0360d43586f72030091735721a00e18fb77842f052460c0000016e3600082055f6257220010002133d50ce9c020011fd97697184047e840c1881628ab158dfea245100373b21d64b180253c3f441431018815c4f2460000005dc00000085887c2026082700851559e89ca8a0a200a62080f1963004a787e882861f5259c38a48c000000bb80b000510d5cc514000963c556c09c209c020000314649907dfcae2891c0ccc9d5c82451eb7b470308140000017700c3000001770040400231437824006307b2f2400c696a6c82e184c0080001aa3045efe4ce064206020b8d1aea48804f72f9d648107af05bdc80e20000002ee00820000017700480020f0c8dac600048cded51a250204e0100001c120122a0006b220011d44002bbc8040c801c4400c1a0050d00200800c04001a704008340020200001005f569)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFull30Case17" = "QuadFull30Case17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFull30Case17 private def zz2161:"s0871"="s0871":=by decide+kernel end section namespace Green24Proof.QuadFull30Case18 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz457:"s01c9"="s01c9":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case18 private def zz2162:"s0872"="s0872":=by decide+kernel end section namespace Green24Proof.QuadFull30Case19 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFull30Case19 private def zz2163:"s0873"="s0873":=by decide+kernel end section namespace Green24Proof.Full30Rows open QuadraticCertificates ExpressionCertificates FullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decode [0x101b203dceb9480718d963205faf8a039e8d2ae07e2779ae58003b38cefa606e203dceb948009e6858601e203dceb94800dd4c7abc66203dceb948004c4bdde07a22fd7c28001aad3c8ee01a203dceb94800da6d48e8a2209c4da8021f2fa07d201eeb5ca8007b8e9faf606d23bcdb2c0049a91b5de01d203dceb94801eb1f9d4a25201eeb5ca800ce1b1848207920ef3acd001d9da01923bcdb2c00eadea1217ebe18001e7a280f607c27a898006f9faa24203dceb94800dcb90da9a07823bcdb2c003acc1f6c20207b9d6a81af4ceb614] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decode [0x107ea01eeb5ca800dcbe6abfe6a03dceb94800dcdb5f9de07aa17ebe18001ac9eafaa2a01eeb5ca8006dee8efb6763d84c002363d84c00207e65faf84800683e3ffca02e603dceb948021e491c0f201e601eeb5ca8007aeb2ecc26601eeb5ca8003dcb788aa07a62fd7c2801baa9e02a62fd7c2800b80b6265faf8480079fc7a3ea563d84c002163d84c00207f203dceb94800ef2868cda06f203dceb948021d0fbd6da01f217ebe18001c2c7aeca7203dceb948019c1f6f38e07b20bf5f0c002c8e214] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decode [0x12301eeb5ca8012afc39a03d303dceb948008d6ffa9da06d309c4da8001c6a29605d301eeb5ca8001818086c25301eeb5ca8031d2eab603930ef3acd001d9da05933bcdb2c00eadea1303dceb948058cfaa03c33bcdb2c001e7ccfe4301eeb5ca800efdbec6032fd7c28003ccb8b67e3d84c0023e3d84c00207fa3bcdb2c001eb83fff606fa5faf848006e2b5e8be01fa01eeb5ca800f8d85a1ba7a03dceb948019e3c7ea9207ba03e8a4806bbe01ba03dceb948001c3c7923a5faf8480079fabd9f614] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decode [0x102e7779ae5801cf19eee05e73bcdb2c0018dd9aaee67779ae58001dcd2b8c603a72fd7c2801baa9e06a72fd7c2800b80b62701eeb5ca80058282573d84c002173d84c00203f307b9d6a811bc9d9a06f303dceb948051a889c605f301eeb5ca80018196d8f27303dceb948063f8ef9e03b30bf5f0c002c8e205b303dceb9480718d963307b9d6a8019aca03e31de6d9a05982ee05e303dceb94800eedd49e6301eeb5ca8013abf2da07a303dceb94800acadcfa01a303dceb94800895aeee14] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decode [0x15003dceb948006c7fbcd9607c0779ae58001daede602c0779ae58001f8e5e205c03bcdb2c00efbfe401ec2a0027f3d84c0023f3d84c00203fb01eeb5ca8004b4be92b606fb03dceb948061afc5be05fb03dceb948001edafa3967b03dceb948058e7889a03bb03e8a4806bbe05bb03dceb948001c3c7923b779ae58024fdb203eb03dceb94800affafee6b01eeb5ca8010f68ed22b01bede880ff0c2773d84c002373d84c00203e703dceb948001d1f0b5aa14] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decode [0x15801eeb5ca8003a498a9e207c83bcdb2c07af0be02c803dceb94800982ccca05c801eeb5ca8055e4ae481ec2a002741ec2a002641ec2a002541ec2a002441ec2a00203f0779ae5800183a99ffa02f003dceb948016ec97eaea05f003dceb948012f5eecbee7001eeb5ca8003a485e4e207e03bcdb2c066a5ca02e009c4da8013eca205e001eeb5ca8056fcaa601ec2a00203d02fd7c28034fd8dce02d0779ae58005dab68f8a05d003dceb948012f5a6afbe14] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1412fd7c28002fa03812fd7c28001a394a2b602811de6d9a06f8aaef6058101eeb5ca80299ec0f60103dceb94801dc67c1ec2a0026c1ec2a0025c1ec2a0024c1ec2a00203f817ebe1801985babe02f8779ae58005e29fb7fe05f801eeb5ca8009b9c98aca7803dceb948006c0fff7e607e85faf848001cdee8202e85faf848001edabf205e803dceb9480019db5ae681ec2a00203d803dceb948003f4e7ac8e02d803dceb9480178fe4a89a05d803dceb94801380d7db8614] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decode [0x105892fd7c28001a3afa6ee091ec2a00203f503dceb948005f2d5ea9e02f5779ae580098885a29e01f503dceb948014aaaafde67501eeb5ca800dfdfea8de01b503dceb948020d698bab635779ae58006f89185ca551ec2a002151ec2a00202e103dceb948026f984b8ce05e103dceb94800dc1ff97d6613bcdb2c004b1a1de03a103dceb948053b5b0fa02a103dceb9480268bd1eab605a103dceb94800ce2bdd3ce211ec2a00203c15faf848002cfde83de02c1779ae58003acdeb9b205c105faf8a061e99e14] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decode [0x103dd03dceb948005fff7f9da02dd01eeb5ca8011e6f3efda01dd03dceb948016a0f8ecba5d09c4da80449bd5a2019d05faf8a034a79bae1d779ae58006f883e1ba03e903dceb94800d83a0e3aa02e90ef3acd0369becca05e9779ae58013a8b6ba69779ae58007b203a901eeb5ca8006b086cac602a901eeb5ca8006fac7f1de05a9779ae58016c8d18629779ae58007b203c909c4da8021e1ce02c903dceb948026edaaf8ce05c903dceb94800dc8eda5a64903dceb948028a6f2fa038903dceb94804cabe9aa028903dceb9480268bd1eab614] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1089403e8a402010101000102010008921de6d9a001e1fbfdc2089001eeb5ca8066c28a088f010208882fd7c28042eeb6fa08871de6d9a001aad8baee088401eeb5ca80049dfecade08831de6d9a001aad8baee088003dceb948008c3f0f98a7d1ec2a0023d1ec2a0020b] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadFull30Case0.base QuadFull30Case0.hinges QuadFull30Case0.normalizationDenominator private def zz458:"s01ca"="s01ca":=by decide+kernel theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case0.base QuadFull30Case0.hinges QuadFull30Case0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadFull30Case1.base QuadFull30Case1.hinges QuadFull30Case1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case1.base QuadFull30Case1.hinges QuadFull30Case1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadFull30Case2.base QuadFull30Case2.hinges QuadFull30Case2.normalizationDenominator private def zz459:"s01cb"="s01cb":=by decide+kernel theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case2.base QuadFull30Case2.hinges QuadFull30Case2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadFull30Case3.base QuadFull30Case3.hinges QuadFull30Case3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case3.base QuadFull30Case3.hinges QuadFull30Case3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadFull30Case4.base QuadFull30Case4.hinges QuadFull30Case4.normalizationDenominator private def zz460:"s01cc"="s01cc":=by decide+kernel theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case4.base QuadFull30Case4.hinges QuadFull30Case4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadFull30Case5.base QuadFull30Case5.hinges QuadFull30Case5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case5.base QuadFull30Case5.hinges QuadFull30Case5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadFull30Case6.base QuadFull30Case6.hinges QuadFull30Case6.normalizationDenominator private def zz461:"s01cd"="s01cd":=by decide+kernel theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case6.base QuadFull30Case6.hinges QuadFull30Case6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadFull30Case7.base QuadFull30Case7.hinges QuadFull30Case7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case7.base QuadFull30Case7.hinges QuadFull30Case7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadFull30Case8.base QuadFull30Case8.hinges QuadFull30Case8.normalizationDenominator private def zz462:"s01ce"="s01ce":=by decide+kernel theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case8.base QuadFull30Case8.hinges QuadFull30Case8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadFull30Case9.base QuadFull30Case9.hinges QuadFull30Case9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case9.base QuadFull30Case9.hinges QuadFull30Case9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r16,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadFull30Case10.base QuadFull30Case10.hinges QuadFull30Case10.normalizationDenominator private def zz463:"s01cf"="s01cf":=by decide+kernel theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case10.base QuadFull30Case10.hinges QuadFull30Case10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadFull30Case11.base QuadFull30Case11.hinges QuadFull30Case11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case11.base QuadFull30Case11.hinges QuadFull30Case11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadFull30Case12.base QuadFull30Case12.hinges QuadFull30Case12.normalizationDenominator private def zz464:"s01d0"="s01d0":=by decide+kernel theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case12.base QuadFull30Case12.hinges QuadFull30Case12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadFull30Case13.base QuadFull30Case13.hinges QuadFull30Case13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case13.base QuadFull30Case13.hinges QuadFull30Case13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadFull30Case14.base QuadFull30Case14.hinges QuadFull30Case14.normalizationDenominator private def zz465:"s01d1"="s01d1":=by decide+kernel theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case14.base QuadFull30Case14.hinges QuadFull30Case14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadFull30Case15.base QuadFull30Case15.hinges QuadFull30Case15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case15.base QuadFull30Case15.hinges QuadFull30Case15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadFull30Case16.base QuadFull30Case16.hinges QuadFull30Case16.normalizationDenominator private def zz466:"s01d2"="s01d2":=by decide+kernel theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case16.base QuadFull30Case16.hinges QuadFull30Case16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadFull30Case17.base QuadFull30Case17.hinges QuadFull30Case17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case17.base QuadFull30Case17.hinges QuadFull30Case17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadFull30Case18.base QuadFull30Case18.hinges QuadFull30Case18.normalizationDenominator private def zz467:"s01d3"="s01d3":=by decide+kernel theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case18.base QuadFull30Case18.hinges QuadFull30Case18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadFull30Case19.base QuadFull30Case19.hinges QuadFull30Case19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadFull30Case19.base QuadFull30Case19.hinges QuadFull30Case19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFull30Case19.nonnegative x hx def pair20:Expression:=pairSlack (3) (1 / 0x186a0) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair20Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_20_base LocalFull30Pairs.compact_full30_pair_20_hinges private def zz468:"s01d4"="s01d4":=by decide+kernel theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalFull30Pairs.full30_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_20_base LocalFull30Pairs.compact_full30_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalFull30Pairs.full30_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=pairSlack (3) (1 / 0x186a0) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair21Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_21_base LocalFull30Pairs.compact_full30_pair_21_hinges theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel private def zz469:"s01d5"="s01d5":=by decide+kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalFull30Pairs.full30_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_21_base LocalFull30Pairs.compact_full30_pair_21_hinges x theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalFull30Pairs.full30_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=pairSlack (3) (1 / 0x186a0) rows 0 1 false def pair22Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2] def pair22Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_22_base LocalFull30Pairs.compact_full30_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalFull30Pairs.full30_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_22_base LocalFull30Pairs.compact_full30_pair_22_hinges x private def zz470:"s01d6"="s01d6":=by decide+kernel theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalFull30Pairs.full30_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=pairSlack (3) (1 / 0x186a0) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair23Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_23_base LocalFull30Pairs.compact_full30_pair_23_hinges theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalFull30Pairs.full30_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_23_base LocalFull30Pairs.compact_full30_pair_23_hinges x theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalFull30Pairs.full30_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=pairSlack (3) (1 / 0x186a0) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28] def pair24Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_24_base LocalFull30Pairs.compact_full30_pair_24_hinges private def zz471:"s01d7"="s01d7":=by decide+kernel theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalFull30Pairs.full30_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_24_base LocalFull30Pairs.compact_full30_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalFull30Pairs.full30_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=pairSlack (3) (1 / 0x186a0) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28] def pair25Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_25_base LocalFull30Pairs.compact_full30_pair_25_hinges theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel private def zz472:"s01d8"="s01d8":=by decide+kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalFull30Pairs.full30_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_25_base LocalFull30Pairs.compact_full30_pair_25_hinges x theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalFull30Pairs.full30_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=pairSlack (3) (1 / 0x186a0) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2] def pair26Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_26_base LocalFull30Pairs.compact_full30_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalFull30Pairs.full30_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_26_base LocalFull30Pairs.compact_full30_pair_26_hinges x private def zz473:"s01d9"="s01d9":=by decide+kernel theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalFull30Pairs.full30_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=pairSlack (3) (1 / 0x186a0) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair27Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_27_base LocalFull30Pairs.compact_full30_pair_27_hinges theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalFull30Pairs.full30_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_27_base LocalFull30Pairs.compact_full30_pair_27_hinges x theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalFull30Pairs.full30_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=pairSlack (3) (1 / 0x186a0) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_28_base LocalFull30Pairs.compact_full30_pair_28_hinges private def zz474:"s01da"="s01da":=by decide+kernel theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalFull30Pairs.full30_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_28_base LocalFull30Pairs.compact_full30_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalFull30Pairs.full30_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=pairSlack (3) (1 / 0x186a0) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_29_base LocalFull30Pairs.compact_full30_pair_29_hinges theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel private def zz475:"s01db"="s01db":=by decide+kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalFull30Pairs.full30_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_29_base LocalFull30Pairs.compact_full30_pair_29_hinges x theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalFull30Pairs.full30_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=pairSlack (3) (1 / 0x186a0) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2] def pair30Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_30_base LocalFull30Pairs.compact_full30_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalFull30Pairs.full30_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_30_base LocalFull30Pairs.compact_full30_pair_30_hinges x private def zz476:"s01dc"="s01dc":=by decide+kernel theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalFull30Pairs.full30_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=pairSlack (3) (1 / 0x186a0) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28] def pair31Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_31_base LocalFull30Pairs.compact_full30_pair_31_hinges theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalFull30Pairs.full30_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_31_base LocalFull30Pairs.compact_full30_pair_31_hinges x theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalFull30Pairs.full30_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=pairSlack (3) (1 / 0x186a0) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_32_base LocalFull30Pairs.compact_full30_pair_32_hinges private def zz477:"s01dd"="s01dd":=by decide+kernel theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalFull30Pairs.full30_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_32_base LocalFull30Pairs.compact_full30_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalFull30Pairs.full30_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=pairSlack (3) (1 / 0x186a0) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_33_base LocalFull30Pairs.compact_full30_pair_33_hinges theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel private def zz478:"s01de"="s01de":=by decide+kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalFull30Pairs.full30_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_33_base LocalFull30Pairs.compact_full30_pair_33_hinges x theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalFull30Pairs.full30_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=pairSlack (3) (1 / 0x186a0) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair34Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_34_base LocalFull30Pairs.compact_full30_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalFull30Pairs.full30_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_34_base LocalFull30Pairs.compact_full30_pair_34_hinges x private def zz479:"s01df"="s01df":=by decide+kernel theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalFull30Pairs.full30_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=pairSlack (3) (1 / 0x186a0) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28] def pair35Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_35_base LocalFull30Pairs.compact_full30_pair_35_hinges theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalFull30Pairs.full30_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_35_base LocalFull30Pairs.compact_full30_pair_35_hinges x theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalFull30Pairs.full30_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=pairSlack (3) (1 / 0x186a0) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2] def pair36Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_36_base LocalFull30Pairs.compact_full30_pair_36_hinges private def zz480:"s01e0"="s01e0":=by decide+kernel theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalFull30Pairs.full30_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_36_base LocalFull30Pairs.compact_full30_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalFull30Pairs.full30_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=pairSlack (3) (1 / 0x186a0) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2] def pair37Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_37_base LocalFull30Pairs.compact_full30_pair_37_hinges theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel private def zz481:"s01e1"="s01e1":=by decide+kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalFull30Pairs.full30_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_37_base LocalFull30Pairs.compact_full30_pair_37_hinges x theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalFull30Pairs.full30_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=pairSlack (3) (1 / 0x186a0) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_38_base LocalFull30Pairs.compact_full30_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalFull30Pairs.full30_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_38_base LocalFull30Pairs.compact_full30_pair_38_hinges x private def zz482:"s01e2"="s01e2":=by decide+kernel theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalFull30Pairs.full30_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=pairSlack (3) (1 / 0x186a0) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalFull30Pairs.compact_full30_pair_39_base LocalFull30Pairs.compact_full30_pair_39_hinges theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalFull30Pairs.full30_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFull30Pairs.compact_full30_pair_39_base LocalFull30Pairs.compact_full30_pair_39_hinges x theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalFull30Pairs.full30_pair_39_nonneg (hx 0) (hx 1) private def zz483:"s01e3"="s01e3":=by decide+kernel theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack (3) (1 / 0x186a0) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.Full30Rows private def zz2164:"s0874"="s0874":=by decide+kernel end section namespace Green24Proof.Full30Cyclic open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseSymmetry FullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack Full30Rows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact Full30Rows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse Full30Rows.rows p q same x] exact Full30Rows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack 3 (1 / 0x186a0) Full30Rows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact Full30Rows.pair_nonneg p q h same x hx · rw [← pairSlack_swap 3 (1 / 0x186a0) Full30Rows.rows p q same x] exact Full30Rows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) private def zz484:"s01e4"="s01e4":=by decide+kernel theorem rows_admissible:rowsAdmissible Full30Rows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials Full30Rows.rows theorem remaining_rows_count:remainingRows.length = 9:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (1 / 0x61a8:ℝ) * mass g ^ 2 ≤ weightedAggregate 3 h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack Full30Rows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack 3 (1 / 0x186a0) Full30Rows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum,stripPotentials_sound 3 h4 h3 h5 g Full30Rows.rows rows_admissible] at hs norm_num at hs change (1 / 0x61a8:ℝ) * mass g ^ 2 ≤ weightedAggregate 3 h4 h3 g (stripPotentials Full30Rows.rows) + 4 * deficit g linarith end Green24Proof.Full30Cyclic private def zz2165:"s0875"="s0875":=by decide+kernel end section namespace Green24Proof.Full30Mass open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseAggregation PhaseMassRows theorem remainingRows_eq:Full30Cyclic.remainingRows = [ ((0x443e1e45 / 0x3b9aca00), .balance 0 (1)), ((0xaab0eb7 / 0x3b9aca0), .balance 1 (-1)), ((0x21dfd2af / 0x1dcd6500), .balance 2 (1)), ((0xaab0eb7 / 0x3b9aca0), .balance 3 (-1)), ((0x42dcdbd / 0x5f5e100), .child 0), (1, .heightChild 1), ((0xcd085 / 0x1dcd6500), .ordered 0), ((0xe1f7f61 / 0x3b9aca0), .massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)), ((1 / 0xf424), .normalization)]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff PackedPhaseRowsEquality.labelEq PackedPhaseRowsEquality.labelEq_iff _ _).mp decide +kernel def oddDifference:Phase → ℚ:=fun p => (![0,1,0, -1]:Fin 4 → ℚ) p noncomputable def balanceMass {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := ((0x443e1e45 / 0x3b9aca00:ℝ) * phaseTotal h4 g 0 + (0x21dfd2af / 0x1dcd6500:ℝ) * phaseTotal h4 g 2 - (0xaab0eb7 / 0x3b9aca0:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) * (phaseTotal h4 g 0 + phaseTotal h4 g 2 - (3:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) private def zz485:"s01e5"="s01e5":=by decide+kernel theorem weighted_remaining_eq {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) : weightedAggregate (3) h4 h3 g Full30Cyclic.remainingRows = balanceMass h4 g + (0x42dcdbd / 0x5f5e100:ℝ) * rowAggregate (3) h4 h3 g (.child 0) + rowAggregate (3) h4 h3 g (.heightChild 1) + (0xcd085 / 0x1dcd6500:ℝ) * rowAggregate (3) h4 h3 g (.ordered 0) + (0xe1f7f61 / 0x3b9aca0:ℝ) * rowAggregate (3) h4 h3 g (.massSquare false oddDifference) + (1 / 0xf424:ℝ) * mass g ^ 2:=by rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_balance,rowAggregate_normalization] norm_num unfold balanceMass oddDifference ring noncomputable def meanBalance {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := ((0x87fdc3a3 / 0x77359400:ℝ) * (phaseTotal h4 g 0 + phaseTotal h4 g 2) - (0xaab0eb7 / 0x3b9aca0:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) * (phaseTotal h4 g 0 + phaseTotal h4 g 2 - 3 * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) theorem balanceMass_le_mean {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (horder:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ 3 * (phaseTotal h4 g 1 + phaseTotal h4 g 3)):balanceMass h4 g ≤ meanBalance h4 g:=by have hp:=mul_nonpos_of_nonneg_of_nonpos (sub_nonneg.mpr horder) (sub_nonpos.mpr hhigh) unfold balanceMass meanBalance nlinarith noncomputable def massPolynomial (U V:ℝ):ℝ := (-0x87fd0823 / 0x1dcd65000:ℝ) * U ^ 2 + (0x2ed5c98c9 / 0x1dcd65000:ℝ) * U * V - (0x20012649 / 0xee6b280:ℝ) * V ^ 2 theorem massPolynomial_lower_bound {U V:ℝ} (hV:0 ≤ V) (hlow:(0xfb / 0x64:ℝ) * V ≤ U) (hhigh:U ≤ 3 * V) : (0x885c3c01 / 0x48c273950000:ℝ) * V ^ 2 ≤ massPolynomial U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) unfold massPolynomial nlinarith theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (horder:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ (3:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hchild:rowAggregate (3) h4 h3 g (.child 0) ≤ 0) (hheight:rowAggregate (3) h4 h3 g (.heightChild 1) ≤ 0) : weightedAggregate (3) h4 h3 g Full30Cyclic.remainingRows ≤ meanBalance h4 g + (1 / 0xf424:ℝ) * mass g ^ 2:=by rw [weighted_remaining_eq] have hb:=balanceMass_le_mean h4 g horder hhigh have ho:rowAggregate (3) h4 h3 g (.ordered 0) ≤ 0 := rowAggregate_ordered_nonpos (3) h4 h3 g hg 0 (by simpa using horder) have hm:=rowAggregate_massSquare_nonpos (3) h4 h3 g oddDifference linarith private def zz486:"s01e6"="s01e6":=by decide+kernel theorem deficit_lower_bound_of_child_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (horder:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hlow:(0xfb / 0x64:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ phaseTotal h4 g 0 + phaseTotal h4 g 2) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ (3:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hchild:rowAggregate (3) h4 h3 g (.child 0) ≤ 0) (hheight:rowAggregate (3) h4 h3 g (.heightChild 1) ≤ 0) : (0x885c3c01 / 0x48c273950000:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ^ 2 ≤ deficit g:=by have hc:=Full30Cyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g hg horder hhigh hchild hheight have hm:mass g = (phaseTotal h4 g 0 + phaseTotal h4 g 2) + (phaseTotal h4 g 1 + phaseTotal h4 g 3):=by simpa only [add_assoc,add_comm,add_left_comm] using (phaseTotal_sum h4 g).symm have hp:massPolynomial (phaseTotal h4 g 0 + phaseTotal h4 g 2) (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ deficit g:=by rw [hm] at hc hr unfold meanBalance at hr unfold massPolynomial nlinarith exact (massPolynomial_lower_bound (add_nonneg (phaseTotal_nonneg h4 g hg 1) (phaseTotal_nonneg h4 g hg 3)) hlow hhigh).trans hp end Green24Proof.Full30Mass private def zz2166:"s0876"="s0876":=by decide+kernel end section namespace Green24Proof.Full30ProfileInterval open FullPhaseRows FullPhaseAggregation PhaseMassRows ChildRows HeightChildRows theorem interval_bound_of_height {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hh:(49 / 0xfa:ℝ) * energy v - (6 / 5:ℝ) * (classMass (ZMod.castHom h2 (ZMod 2)) v 0 - classMass (ZMod.castHom h2 (ZMod 2)) v 1) ^ 2 ≤ deficit v) (horder:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hlow:(0xfb / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (3:ℝ) * mass v) : (0x885c3c01 / 0x48c273950000:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by have hg:=interleave_nonneg u v hu hv have hV:phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3 = mass v:=by rw [phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2,classMass_sum] have hU:phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 = mass u:=by have ht:=phaseTotal_sum h4 (interleave u v) rw [mass_interleave] at ht linarith have hchild:rowAggregate (3) h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even] have hd:=ih m (by have hp:=NeZero.pos m; omega) (dvd_mul_left m 2) u hu linarith have hheight:=rowAggregate_height_odd_nonpos (3) h4 h3 h2 u v hu hv hh have hc:=Full30Mass.deficit_lower_bound_of_child_rows h4 h3 h5 (interleave u v) hg horder (by rw [hU,hV]; exact hlow) (by rw [hU,hV]; exact hhigh) hchild hheight simpa only [hV] using hc theorem interval_bound_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (horder:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hlow:(0xfb / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (3:ℝ) * mass v) : (0x885c3c01 / 0x48c273950000:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) exact interval_bound_of_height h4 h3 h5 h2 u v hu hv ih (HeightStrong.strong_height_bound h2 h3m h5m v hv) horder hlow hhigh theorem interval_bound {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(0xfb / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (3:ℝ) * mass v) : (0x885c3c01 / 0x48c273950000:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,horder⟩:=ProfileOrientation.orient_even_child h4 u v hu hv have hb:=interval_bound_ordered h4 h3 h5 h2 u' v' hu' hv' ih horder (by simpa only [hU,hV] using hlow) (by simpa only [hU,hV] using hhigh) simpa only [hU,hV,hd] using hb end Green24Proof.Full30ProfileInterval private def zz2167:"s0877"="s0877":=by decide+kernel end section namespace Green24Proof.FullPhaseIntervals private def zz487:"s01e7"="s01e7":=by decide+kernel theorem interval_49_20_to_three {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(49 / 20:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ 3 * mass v) : 0 ≤ deficit (interleave u v):=by by_cases h:mass u ≤ (27 / 10:ℝ) * mass v · have hb:=Full27ProfileInterval.interval_bound h4 h3 h5 h2 u v hu hv ih hlow h exact (mul_nonneg (by norm_num) (sq_nonneg (mass u + mass v))).trans hb · have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i have hl:(0xfb / 0x64:ℝ) * mass v ≤ mass u:=by linarith have hb:=Full30ProfileInterval.interval_bound h4 h3 h5 h2 u v hu hv ih hl hhigh exact (mul_nonneg (by norm_num) (sq_nonneg (mass v))).trans hb end Green24Proof.FullPhaseIntervals private def zz2168:"s0878"="s0878":=by decide+kernel end section namespace Green24Proof.ParityCover theorem low_coercivity {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(0x67 / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (11 / 10:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by by_cases h:mass u ≤ (21 / 20:ℝ) * mass v · exact ParityNineteenTwentieths.coercivity h3 h5 u v hu hv hd hlow h · exact ParityNineTenths.coercivity h3 h5 u v hu hv hd (by linarith) hhigh theorem interval_103_100_to_249_100 {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(0x67 / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (0xf9 / 0x64:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by by_cases h:mass u ≤ (11 / 10:ℝ) * mass v · exact (mul_nonneg (by norm_num) (sq_nonneg _)).trans (low_coercivity h3 h5 u v hu hv hd hlow h) · by_cases htwo:mass u ≤ 2 * mass v · exact ParityIntervals.interval_eleven_tenths_to_two h3 h5 u v hu hv hd (by linarith) htwo · exact ParityTwoFifths.interval_nonneg h3 h5 u v hu hv hd (by linarith) hhigh theorem coercivity_103_100_to_eleven_fifths {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (hlow:(0x67 / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (11 / 5:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by by_cases h:mass u ≤ (11 / 10:ℝ) * mass v · exact low_coercivity h3 h5 u v hu hv hd hlow h · by_cases hmid:mass u ≤ (0x18d / 0xc8:ℝ) * mass v · exact ParityIntervals.coercivity_eleven_tenths_to_397_200 h3 h5 u v hu hv hd (by linarith) hmid · exact ParityTwoFifths.coercivity h3 h5 u v hu hv hd (by linarith) hhigh private def zz488:"s01e8"="s01e8":=by decide+kernel theorem near_balance_coercivity {U V du dg:ℝ} (hV:0 ≤ V) (horder:V ≤ U) (hratio:U ≤ (40 / 37:ℝ) * V) (hd:0 ≤ du) (hc:NearBalanceHypothesis U V du dg) : (1 / 0x12c:ℝ) * (U - V) ^ 2 ≤ dg:=by rcases hV.eq_or_lt with hz | hp · have hU:U = 0:=by linarith have h:=hc 0 (by norm_num) (by norm_num) simpa [hU, ← hz] using h · have h:=near_balance_descent hp horder hratio hc have hretained:0 ≤ (16 * (U - V) ^ 2 / (9 * U ^ 2)) * du:=by positivity nlinarith [sq_nonneg (U - V)] theorem coercivity_to_eleven_fifths_of_near_balance {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (horder:mass v ≤ mass u) (hhigh:mass u ≤ (11 / 5:ℝ) * mass v) (hc:NearBalanceHypothesis (mass u) (mass v) (deficit u) (deficit (interleave u v))) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v):=by have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i by_cases h:mass u ≤ (40 / 37:ℝ) * mass v · exact near_balance_coercivity hV horder h hd hc · exact coercivity_103_100_to_eleven_fifths h3 h5 u v hu hv hd (by linarith) hhigh theorem interval_103_100_to_three {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(0x67 / 0x64:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ 3 * mass v) : 0 ≤ deficit (interleave u v):=by have hm:0 < m:=NeZero.pos m have hd:0 ≤ deficit u:=ih m (by omega) (dvd_mul_left m 2) u hu by_cases h:mass u ≤ (0xf9 / 0x64:ℝ) * mass v · exact interval_103_100_to_249_100 h3 h5 u v hu hv hd hlow h · have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i exact FullPhaseIntervals.interval_49_20_to_three h4 h3 h5 h2 u v hu hv ih (by linarith) hhigh theorem interval_to_three_of_near_balance {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (horder:mass v ≤ mass u) (hhigh:mass u ≤ 3 * mass v) (hc:NearBalanceHypothesis (mass u) (mass v) (deficit u) (deficit (interleave u v))) : 0 ≤ deficit (interleave u v):=by have hm:0 < m:=NeZero.pos m have hd:0 ≤ deficit u:=ih m (by omega) (dvd_mul_left m 2) u hu have hV:0 ≤ mass v:=Finset.sum_nonneg fun i _ => hv i by_cases h:mass u ≤ (40 / 37:ℝ) * mass v · exact near_balance_nonneg hV horder h hd hc · exact interval_103_100_to_three h4 h3 h5 h2 u v hu hv ih (by linarith) hhigh end Green24Proof.ParityCover private def zz2169:"s0879"="s0879":=by decide+kernel end section namespace Green24Proof.NatBacksubRecoveredQuadraticCertificates open IntegerQuadraticCertificates (Linear Quadratic Point linearEq linearEq_eq_true linearEval linearEval_zero linearEval_add linearEval_smul linearEval_neg product quadraticEval quadraticEval_zero quadraticEval_add quadraticEval_smul quadraticEval_product Hinges hingeEval positive_step negative_step) abbrev Combination:=List (ℤ × ℕ) def combine (C:ℕ → Linear) (w:Combination):Linear := (w.map fun t => t.1 • C t.2).sum def nonnegativeWeights (w:Combination):Bool := w.all fun t => decide (0 ≤ t.1) private def zz489:"s01e9"="s01e9":=by decide+kernel theorem combine_nonneg (C:ℕ → Linear) (w:Combination) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:nonnegativeWeights w = true) : 0 ≤ linearEval (combine C w) x:=by induction w with | nil => simp [combine,linearEval_zero] | cons t ts ih => simp only [nonnegativeWeights,List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [combine,List.map_cons,List.sum_cons,linearEval_add,linearEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (hC t.2)) (ih hw.2) inductive NonnegativeTerm where | square (a:Linear) | pair (i j:ℕ) def termMatrix (C:ℕ → Linear):NonnegativeTerm → Quadratic | .square a => product a a | .pair i j => product (C i) (C j) theorem termMatrix_nonneg (C:ℕ → Linear) (t:NonnegativeTerm) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) : 0 ≤ quadraticEval (termMatrix C t) x:=by cases t with | square a => simpa only [termMatrix,quadraticEval_product, ← sq] using sq_nonneg (linearEval a x) | pair i j => simpa only [termMatrix,quadraticEval_product] using mul_nonneg (hC i) (hC j) abbrev Decomposition:=List (ℤ × NonnegativeTerm) def decompositionMatrix (C:ℕ → Linear) (d:Decomposition):Quadratic := (d.map fun t => t.1 • termMatrix C t.2).sum def decompositionCheck (C:ℕ → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition):Bool := decide (0 < s) && (d.all fun t => decide (0 ≤ t.1)) && QuadraticCoefficientCheck.coefficientEq (decompositionMatrix C d) (s • Q) theorem decomposition_nonneg (C:ℕ → Linear) (d:Decomposition) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:(d.all fun t => decide (0 ≤ t.1)) = true) : 0 ≤ quadraticEval (decompositionMatrix C d) x:=by induction d with | nil => simp [decompositionMatrix,quadraticEval_zero] | cons t ts ih => simp only [List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [decompositionMatrix,List.map_cons,List.sum_cons,quadraticEval_add, quadraticEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (termMatrix_nonneg C t.2 x hC)) (ih hw.2) theorem decompositionCheck_sound (C:ℕ → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:decompositionCheck C Q s d = true):0 ≤ quadraticEval Q x:=by simp only [decompositionCheck,Bool.and_eq_true,decide_eq_true_eq] at h have hd:=decomposition_nonneg C d x hC h.1.2 rw [QuadraticCoefficientCheck.coefficientEq_eval_eq _ _ h.2,quadraticEval_smul] at hd exact nonneg_of_mul_nonneg_right hd (by exact_mod_cast h.1.1:(0:ℝ) < s) def combinationCheck (C:ℕ → Linear) (s:ℤ) (w:Combination) (a:Linear):Bool := decide (0 < s) && nonnegativeWeights w && linearEq (combine C w) (s • a) private def zz490:"s01ea"="s01ea":=by decide+kernel theorem combinationCheck_sound (C:ℕ → Linear) (s:ℤ) (w:Combination) (a:Linear) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:combinationCheck C s w a = true):0 ≤ linearEval a x:=by simp only [combinationCheck,Bool.and_eq_true,linearEq_eq_true,decide_eq_true_eq] at h have ha:=combine_nonneg C w x hC h.1.2 rw [h.2,linearEval_smul] at ha exact nonneg_of_mul_nonneg_right ha (by exact_mod_cast h.1.1:(0:ℝ) < s) abbrev WeightFormula:=List (Nat × Int) abbrev Plan:=List (Nat × Nat × WeightFormula) def coefficient (Q:Quadratic):Nat → Int | 0 => Q 0 0 | 1 => Q 1 1 | 2 => Q 2 2 | 3 => Q 3 3 | 4 => Q 0 1 + Q 1 0 | 5 => Q 0 2 + Q 2 0 | 6 => Q 0 3 + Q 3 0 | 7 => Q 1 2 + Q 2 1 | 8 => Q 1 3 + Q 3 1 | 9 => Q 2 3 + Q 3 2 | _ => 0 def planDecomposition (Q:Quadratic) (rows:Plan):Decomposition := rows.map fun (i,j,terms) => ((terms.map fun (k,multiplier) => multiplier * coefficient Q k).sum, .pair i j) def supportDecomposition (C:Nat → Linear) (Q:Quadratic) (pairs:List (Nat × Nat)):Int × Decomposition := match BacksubIntegerElimination.solveScaled (pairs.toArray.map fun (i,j) => PureIntegerSupportCertificateData.pairColumn (C i) (C j)) (PureIntegerSupportCertificateData.matrixColumn Q) with | none => (0,[]) | some (scale,weights) => (scale,(weights.toList.zip pairs).map fun (weight,i,j) => (weight, .pair i j)) def cons (a:Linear) (C:ℕ → Linear):ℕ → Linear | 0 => a | i + 1 => C i theorem cons_constraints (C:ℕ → Linear) (a:Linear) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (ha:0 ≤ linearEval a x) : ∀ i,0 ≤ linearEval (cons a C i) x:=by intro i cases i with | zero => exact ha | succ j => exact hC j inductive Certificate:Type where | support (pairs:List (Nat × Nat)):Certificate | plan (scale:ℤ) (rows:Plan):Certificate | psd:Certificate | leaf (scale:ℤ) (d:Decomposition):Certificate | split (positive negative:Certificate):Certificate | cut (a:Linear) (positive negative:Certificate):Certificate | positive (scale:ℤ) (w:Combination) (next:Certificate):Certificate | negative (scale:ℤ) (w:Combination) (next:Certificate):Certificate def check (cert:Certificate) (C:ℕ → Linear) (Q:Quadratic) (hs:Hinges):Bool := match cert,hs with | .cut a p m,hs => check p (cons a C) Q hs && check m (cons (-a) C) Q hs | .support pairs,[] => let (scale,d):=supportDecomposition C Q pairs decompositionCheck C Q scale d | .plan scale rows,[] => decompositionCheck C Q scale (planDecomposition Q rows) | .psd,[] => IntegerPSDCheck.check 4 Q | .leaf s d,[] => decompositionCheck C Q s d | .split p m,(c,a) :: hs => check p (cons a C) (Q + c • product a a) hs && check m (cons (-a) C) Q hs | .positive s w p,(c,a) :: hs => combinationCheck C s w a && check p (cons a C) (Q + c • product a a) hs | .negative s w m,(_,a) :: hs => combinationCheck C s w (-a) && check m (cons (-a) C) Q hs | _,_ => false theorem check_sound (cert:Certificate) (C:ℕ → Linear) (Q:Quadratic) (hs:Hinges) (x:Point) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check cert C Q hs = true):0 ≤ quadraticEval Q x + hingeEval hs x:=by induction cert generalizing C Q hs with | support pairs => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q (supportDecomposition C Q pairs).1 (supportDecomposition C Q pairs).2 x hC h | cons t ts => simp [check] at h | plan scale rows => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q scale (planDecomposition Q rows) x hC h | cons t ts => simp [check] at h | psd => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero, quadraticEval,IntegerPSDCheck.eval] using IntegerPSDCheck.check_sound 4 Q h x | cons t ts => simp [check] at h | leaf s d => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q s d x hC h | cons t ts => simp [check] at h | split p m hp hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact positive_step Q c a ts x ha (hp (cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.1) · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact negative_step Q c a ts x (le_of_not_ge ha) (hm (cons (-a) C) Q ts (cons_constraints C (-a) x hC ha') h.2) | cut a p m hp hm => simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact hp (cons a C) Q hs (cons_constraints C a x hC ha) h.1 · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact hm (cons (-a) C) Q hs (cons_constraints C (-a) x hC ha') h.2 | positive s w p hp => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w a x hC h.1 exact positive_step Q c a ts x ha (hp (cons a C) (Q + c • product a a) ts (cons_constraints C a x hC ha) h.2) | negative s w m hm => cases hs with | nil => simp [check] at h | cons t ts => rcases t with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w (-a) x hC h.1 have ha':linearEval a x ≤ 0:=by rw [linearEval_neg] at ha; linarith exact negative_step Q c a ts x ha' (hm (cons (-a) C) Q ts (cons_constraints C (-a) x hC ha) h.2) end Green24Proof.NatBacksubRecoveredQuadraticCertificates private def zz2170:"s087a"="s087a":=by decide+kernel end section namespace Green24Proof.PackedNaturalCertificateData open IntegerQuadraticCertificates (Linear) open NatBacksubRecoveredQuadraticCertificates abbrev Reader (α:Type):=StateT (List Nat) Option α def fail {α:Type}:Reader α:=fun _ => none def readByte:Reader Nat | [] => none | n :: rest => if n < 256 then readByte rest else some (n % 256,n / 256 :: rest) def readPacked:Nat → Reader Nat | 0 => fail | fuel + 1 => do let b ← readByte if b < 128 then return b else return b % 128 + 128 * (← readPacked fuel) def readNat:Reader Nat:=readPacked 128 def readInt:Reader Int:=do return PureCertificateData.unzig (← readNat) def readLinear:Reader Linear:=do let a ← readInt let b ← readInt let c ← readInt let d ← readInt return ![a,b,c,d] def readCombination:Nat → Reader Combination | 0 => pure [] | count + 1 => do let w ← readInt let i ← readNat return (w,i) :: (← readCombination count) def readTerm:Reader NonnegativeTerm:=do match ← readNat with | 0 => return .square (← readLinear) | 1 => return .pair (← readNat) (← readNat) | _ => fail def readDecomposition:Nat → Reader Decomposition | 0 => pure [] | count + 1 => do let w ← readInt let t ← readTerm return (w,t) :: (← readDecomposition count) def readPairs:Nat → Reader (List (Nat × Nat)) | 0 => pure [] | count + 1 => do let i ← readNat let j ← readNat return (i,j) :: (← readPairs count) def readTree:Nat → Reader Certificate | 0 => fail | fuel + 1 => do match ← readNat with | 0 => let scale ← readInt let count ← readNat return .leaf scale (← readDecomposition count) | 1 => return .split (← readTree fuel) (← readTree fuel) | 2 => let a ← readLinear return .cut a (← readTree fuel) (← readTree fuel) | 3 => let scale ← readInt let count ← readNat let w ← readCombination count return .positive scale w (← readTree fuel) | 4 => let scale ← readInt let count ← readNat let w ← readCombination count return .negative scale w (← readTree fuel) | 5 => return .psd | 6 => return .support (← readPairs (← readNat)) | _ => fail def decode (fuel:Nat) (chunks:List Nat):Certificate := match readTree fuel chunks with | some (cert,_) => cert | none => .leaf 0 [] end Green24Proof.PackedNaturalCertificateData private def zz2171:"s087b"="s087b":=by decide+kernel end section namespace Green24Proof.NatParametricCertificates open IntegerQuadraticCertificates (Linear Point linearEval linearEval_neg product) open ParametricQuadraticCertificates (Coefficient Quadratic coefficientEval quadraticEval quadraticEval_zero quadraticEval_add quadraticEval_smul coefficientProduct coefficientProduct_eval Hinges hingeEval positive_step negative_step) open NatBacksubRecoveredQuadraticCertificates (Combination combinationCheck combinationCheck_sound cons cons_constraints) def polynomialEq (Q R:Quadratic):Bool := (List.finRange 3).all fun d => QuadraticCoefficientCheck.coefficientEq (Q d) (R d) theorem polynomialEq_eval_eq (Q R:Quadratic) (h:polynomialEq Q R = true) (t:ℝ) (x:Point):quadraticEval Q t x = quadraticEval R t x:=by have hd:∀ d,QuadraticCoefficientCheck.coefficientEq (Q d) (R d) = true:=by simpa only [polynomialEq,List.all_eq_true,List.mem_finRange,forall_true_left] using h simp only [quadraticEval, QuadraticCoefficientCheck.coefficientEq_eval_eq (Q 0) (R 0) (hd 0), QuadraticCoefficientCheck.coefficientEq_eval_eq (Q 1) (R 1) (hd 1), QuadraticCoefficientCheck.coefficientEq_eval_eq (Q 2) (R 2) (hd 2)] inductive NonnegativeTerm where | square (a b:Linear) | middleSquare (a:Linear) | pair (degree:Fin 3) (i j:ℕ) def termPolynomial (C:ℕ → Linear):NonnegativeTerm → Quadratic | .square a b => ![product a a,product a b + product b a,product b b] | .middleSquare a => ![0,product a a,(-1:ℤ) • product a a] | .pair d i j => let A:=product (C i) (C j) if d = 0 then ![A,(-2:ℤ) • A,A] else if d = 1 then ![0,(2:ℤ) • A,(-2:ℤ) • A] else ![0,0,A] private def zz491:"s01eb"="s01eb":=by decide+kernel theorem termPolynomial_nonneg (C:ℕ → Linear) (v:NonnegativeTerm) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) : 0 ≤ quadraticEval (termPolynomial C v) t x:=by have h1:0 ≤ 1 - t:=sub_nonneg.mpr ht1 cases v with | square a b => change 0 ≤ IntegerQuadraticCertificates.quadraticEval (product a a) x + t * IntegerQuadraticCertificates.quadraticEval (product a b + product b a) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval (product b b) x simp only [IntegerQuadraticCertificates.quadraticEval_add, IntegerQuadraticCertificates.quadraticEval_product] nlinarith only [sq_nonneg (linearEval a x + t * linearEval b x)] | middleSquare a => change 0 ≤ IntegerQuadraticCertificates.quadraticEval 0 x + t * IntegerQuadraticCertificates.quadraticEval (product a a) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval ((-1:ℤ) • product a a) x simp only [IntegerQuadraticCertificates.quadraticEval_zero, IntegerQuadraticCertificates.quadraticEval_smul, IntegerQuadraticCertificates.quadraticEval_product,Int.cast_neg,Int.cast_one] nlinarith only [mul_nonneg (mul_nonneg ht0 h1) (sq_nonneg (linearEval a x))] | pair d i j => have h:=mul_nonneg (hC i) (hC j) by_cases hd0:d = 0 · simp only [termPolynomial,hd0, ↓reduceIte] change 0 ≤ IntegerQuadraticCertificates.quadraticEval (product (C i) (C j)) x + t * IntegerQuadraticCertificates.quadraticEval ((-2:ℤ) • product (C i) (C j)) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval (product (C i) (C j)) x simp only [IntegerQuadraticCertificates.quadraticEval_smul, IntegerQuadraticCertificates.quadraticEval_product,Int.cast_neg,Int.cast_ofNat] nlinarith only [mul_nonneg (sq_nonneg (1 - t)) h] · by_cases hd1:d = 1 · simp only [termPolynomial,hd1, ↓reduceIte] change 0 ≤ IntegerQuadraticCertificates.quadraticEval 0 x + t * IntegerQuadraticCertificates.quadraticEval ((2:ℤ) • product (C i) (C j)) x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval ((-2:ℤ) • product (C i) (C j)) x simp only [IntegerQuadraticCertificates.quadraticEval_zero, IntegerQuadraticCertificates.quadraticEval_smul, IntegerQuadraticCertificates.quadraticEval_product,Int.cast_neg,Int.cast_ofNat] nlinarith only [mul_nonneg (mul_nonneg ht0 h1) h] · simp only [termPolynomial,hd0,hd1, ↓reduceIte] change 0 ≤ IntegerQuadraticCertificates.quadraticEval 0 x + t * IntegerQuadraticCertificates.quadraticEval 0 x + t ^ 2 * IntegerQuadraticCertificates.quadraticEval (product (C i) (C j)) x simpa only [IntegerQuadraticCertificates.quadraticEval_zero, IntegerQuadraticCertificates.quadraticEval_product,mul_zero,zero_add] using mul_nonneg (sq_nonneg t) h abbrev Decomposition:=List (ℤ × NonnegativeTerm) def decompositionPolynomial (C:ℕ → Linear) (d:Decomposition):Quadratic := (d.map fun v => v.1 • termPolynomial C v.2).sum def decompositionCheck (C:ℕ → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition):Bool := decide (0 < s) && (d.all fun v => decide (0 ≤ v.1)) && polynomialEq (decompositionPolynomial C d) (s • Q) theorem decomposition_nonneg (C:ℕ → Linear) (d:Decomposition) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) (hw:(d.all fun v => decide (0 ≤ v.1)) = true) : 0 ≤ quadraticEval (decompositionPolynomial C d) t x:=by induction d with | nil => simp [decompositionPolynomial,quadraticEval_zero] | cons v vs ih => simp only [List.all_cons,Bool.and_eq_true,decide_eq_true_eq] at hw simpa only [decompositionPolynomial,List.map_cons,List.sum_cons,quadraticEval_add, quadraticEval_smul] using add_nonneg (mul_nonneg (by exact_mod_cast hw.1) (termPolynomial_nonneg C v.2 t x ht0 ht1 hC)) (ih hw.2) theorem decompositionCheck_sound (C:ℕ → Linear) (Q:Quadratic) (s:ℤ) (d:Decomposition) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) (h:decompositionCheck C Q s d = true) : 0 ≤ quadraticEval Q t x:=by simp only [decompositionCheck,Bool.and_eq_true,decide_eq_true_eq] at h have hd:=decomposition_nonneg C d t x ht0 ht1 hC h.1.2 rw [polynomialEq_eval_eq _ _ h.2,quadraticEval_smul] at hd exact nonneg_of_mul_nonneg_right hd (by exact_mod_cast h.1.1:(0:ℝ) < s) abbrev Supports:=Fin 3 → List (Nat × Nat) def bernsteinPart (Q:Quadratic) (d:Fin 3):IntegerQuadraticCertificates.Quadratic := if d = 0 then (2:Int) • Q 0 else if d = 1 then (2:Int) • Q 0 + Q 1 else (2:Int) • (Q 0 + Q 1 + Q 2) def supportCheck (C:Nat → Linear) (Q:Quadratic) (pairs:Supports):Bool := (List.finRange 3).all fun d => NatBacksubRecoveredQuadraticCertificates.check (.support (pairs d)) C (bernsteinPart Q d) [] theorem supportCheck_sound (C:Nat → Linear) (Q:Quadratic) (pairs:Supports) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) (h:supportCheck C Q pairs = true) : 0 ≤ quadraticEval Q t x:=by have hd:∀ d,NatBacksubRecoveredQuadraticCertificates.check (.support (pairs d)) C (bernsteinPart Q d) [] = true:=by simpa only [supportCheck,List.all_eq_true,List.mem_finRange,forall_true_left] using h have hpart (d:Fin 3):0 ≤ IntegerQuadraticCertificates.quadraticEval (bernsteinPart Q d) x:=by simpa only [IntegerQuadraticCertificates.hingeEval,List.map_nil,List.sum_nil,add_zero] using NatBacksubRecoveredQuadraticCertificates.check_sound (.support (pairs d)) C (bernsteinPart Q d) [] x hC (hd d) have hmiddle:0 ≤ 2 * t * (1 - t) := mul_nonneg (mul_nonneg (by norm_num) ht0) (sub_nonneg.mpr ht1) have hsum:=add_nonneg (add_nonneg (mul_nonneg (sq_nonneg (1-t)) (hpart 0)) (mul_nonneg hmiddle (hpart 1))) (mul_nonneg (sq_nonneg t) (hpart 2)) have hid:(1-t)^2 * IntegerQuadraticCertificates.quadraticEval (bernsteinPart Q 0) x + (2*t*(1-t)) * IntegerQuadraticCertificates.quadraticEval (bernsteinPart Q 1) x + t^2 * IntegerQuadraticCertificates.quadraticEval (bernsteinPart Q 2) x = 2 * quadraticEval Q t x:=by simp only [bernsteinPart,show (0:Fin 3) = 0 from rfl, show (1:Fin 3) ≠ 0 from by decide,show (2:Fin 3) ≠ 0 from by decide, show (1:Fin 3) = 1 from rfl,show (2:Fin 3) ≠ 1 from by decide, if_true,if_false,IntegerQuadraticCertificates.quadraticEval_smul, IntegerQuadraticCertificates.quadraticEval_add,Int.cast_ofNat,quadraticEval] ring rw [hid] at hsum linarith inductive Certificate:Type where | support (pairs:Supports):Certificate | leaf (scale:ℤ) (d:Decomposition):Certificate | split (positive negative:Certificate):Certificate | cut (a:Linear) (positive negative:Certificate):Certificate | positive (scale:ℤ) (w:Combination) (next:Certificate):Certificate | negative (scale:ℤ) (w:Combination) (next:Certificate):Certificate def check (cert:Certificate) (C:ℕ → Linear) (Q:Quadratic) (hs:Hinges):Bool := match cert,hs with | .cut a p m,hs => check p (cons a C) Q hs && check m (cons (-a) C) Q hs | .support pairs,[] => supportCheck C Q pairs | .leaf s d,[] => decompositionCheck C Q s d | .split p m,(c,a) :: hs => check p (cons a C) (Q + coefficientProduct c a a) hs && check m (cons (-a) C) Q hs | .positive s w p,(c,a) :: hs => combinationCheck C s w a && check p (cons a C) (Q + coefficientProduct c a a) hs | .negative s w m,(_,a) :: hs => combinationCheck C s w (-a) && check m (cons (-a) C) Q hs | _,_ => false private def zz492:"s01ec"="s01ec":=by decide+kernel theorem check_sound (cert:Certificate) (C:ℕ → Linear) (Q:Quadratic) (hs:Hinges) (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hC:∀ i,0 ≤ linearEval (C i) x) (h:check cert C Q hs = true) : 0 ≤ quadraticEval Q t x + hingeEval hs t x:=by induction cert generalizing C Q hs with | support pairs => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using supportCheck_sound C Q pairs t x ht0 ht1 hC h | cons v vs => simp [check] at h | leaf s d => cases hs with | nil => simpa only [hingeEval,List.map_nil,List.sum_nil,add_zero] using decompositionCheck_sound C Q s d t x ht0 ht1 hC h | cons v vs => simp [check] at h | split p m hp hm => cases hs with | nil => simp [check] at h | cons v vs => rcases v with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact positive_step Q c a vs t x ha (hp (cons a C) (Q + coefficientProduct c a a) vs (cons_constraints C a x hC ha) h.1) · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact negative_step Q c a vs t x (le_of_not_ge ha) (hm (cons (-a) C) Q vs (cons_constraints C (-a) x hC ha') h.2) | cut a p m hp hm => simp only [check,Bool.and_eq_true] at h by_cases ha:0 ≤ linearEval a x · exact hp (cons a C) Q hs (cons_constraints C a x hC ha) h.1 · have ha':0 ≤ linearEval (-a) x:=by rw [linearEval_neg]; linarith exact hm (cons (-a) C) Q hs (cons_constraints C (-a) x hC ha') h.2 | positive s w p hp => cases hs with | nil => simp [check] at h | cons v vs => rcases v with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w a x hC h.1 exact positive_step Q c a vs t x ha (hp (cons a C) (Q + coefficientProduct c a a) vs (cons_constraints C a x hC ha) h.2) | negative s w m hm => cases hs with | nil => simp [check] at h | cons v vs => rcases v with ⟨c,a⟩ simp only [check,Bool.and_eq_true] at h have ha:=combinationCheck_sound C s w (-a) x hC h.1 have ha':linearEval a x ≤ 0:=by rw [linearEval_neg] at ha; linarith exact negative_step Q c a vs t x ha' (hm (cons (-a) C) Q vs (cons_constraints C (-a) x hC ha) h.2) end Green24Proof.NatParametricCertificates private def zz2172:"s087c"="s087c":=by decide+kernel end section namespace Green24Proof.PackedParametricCertificateData open IntegerQuadraticCertificates (Linear) open NatParametricCertificates open PackedNaturalCertificateData (Reader fail readNat readInt readLinear readCombination readPairs) def readDegree:Reader (Fin 3):=do let d ← readNat if h:d < 3 then return ⟨d,h⟩ else fail def readTerm:Reader NonnegativeTerm:=do match ← readNat with | 0 => return .square (← readLinear) (← readLinear) | 1 => return .middleSquare (← readLinear) | 2 => return .pair (← readDegree) (← readNat) (← readNat) | _ => fail def readDecomposition:Nat → Reader Decomposition | 0 => pure [] | count + 1 => do let w ← readInt let t ← readTerm return (w,t) :: (← readDecomposition count) def readTree:Nat → Reader Certificate | 0 => fail | fuel + 1 => do match ← readNat with | 0 => let scale ← readInt let count ← readNat return .leaf scale (← readDecomposition count) | 1 => return .split (← readTree fuel) (← readTree fuel) | 2 => let a ← readLinear return .cut a (← readTree fuel) (← readTree fuel) | 3 => let scale ← readInt let count ← readNat let w ← readCombination count return .positive scale w (← readTree fuel) | 4 => let scale ← readInt let count ← readNat let w ← readCombination count return .negative scale w (← readTree fuel) | 6 => let p0 ← readPairs (← readNat) let p1 ← readPairs (← readNat) let p2 ← readPairs (← readNat) return .support ![p0,p1,p2] | _ => fail def decode (fuel:Nat) (chunks:List Nat):Certificate := match readTree fuel chunks with | some (cert,_) => cert | none => .leaf 0 [] end Green24Proof.PackedParametricCertificateData private def zz2173:"s087d"="s087d":=by decide+kernel end section namespace Green24Proof.NatParametricCheckSteps open IntegerQuadraticCertificates (Linear) open ParametricQuadraticCertificates (Quadratic Coefficient Hinges coefficientProduct) open NatBacksubRecoveredQuadraticCertificates (cons Combination combinationCheck) open NatParametricCertificates theorem split_valid (p m:Certificate) (C:Nat → Linear) (Q:Quadratic) (c:Coefficient) (a:Linear) (hs:Hinges) (hp:check p (cons a C) (Q + coefficientProduct c a a) hs = true) (hm:check m (cons (-a) C) Q hs = true) : check (.split p m) C Q ((c,a) :: hs) = true:=by simpa only [check,Bool.and_eq_true] using And.intro hp hm theorem cut_valid (a:Linear) (p m:Certificate) (C:Nat → Linear) (Q:Quadratic) (hs:Hinges) (hp:check p (cons a C) Q hs = true) (hm:check m (cons (-a) C) Q hs = true) : check (.cut a p m) C Q hs = true:=by simpa only [check,Bool.and_eq_true] using And.intro hp hm theorem positive_valid (s:Int) (w:Combination) (p:Certificate) (C:Nat → Linear) (Q:Quadratic) (c:Coefficient) (a:Linear) (hs:Hinges) (hw:combinationCheck C s w a = true) (hp:check p (cons a C) (Q + coefficientProduct c a a) hs = true) : check (.positive s w p) C Q ((c,a) :: hs) = true:=by simpa only [check,Bool.and_eq_true] using And.intro hw hp private def zz493:"s01ed"="s01ed":=by decide+kernel theorem negative_valid (s:Int) (w:Combination) (m:Certificate) (C:Nat → Linear) (Q:Quadratic) (c:Coefficient) (a:Linear) (hs:Hinges) (hw:combinationCheck C s w (-a) = true) (hm:check m (cons (-a) C) Q hs = true) : check (.negative s w m) C Q ((c,a) :: hs) = true:=by simpa only [check,Bool.and_eq_true] using And.intro hw hm end Green24Proof.NatParametricCheckSteps private def zz2174:"s087e"="s087e":=by decide+kernel end section namespace Green24Proof.ParametricTupleCheck open IntegerQuadraticCertificates (Linear) open ParametricQuadraticCertificates (Coefficient Quadratic Hinges coefficientProduct) open NatParametricCertificates (Certificate) open EndToEndTupleCheck (Vec Mat vec mat ofVec ofMat context context_of mat_ofMat addM scaleM productM mat_add mat_scale mat_product vec_ofVec) structure Poly where a:Mat b:Mat c:Mat def poly (Q:Poly):Quadratic:=![mat Q.a,mat Q.b,mat Q.c] def ofPoly (Q:Quadratic):Poly:=⟨ofMat (Q 0),ofMat (Q 1),ofMat (Q 2)⟩ def addP (Q R:Poly):Poly:=⟨addM Q.a R.a,addM Q.b R.b,addM Q.c R.c⟩ def zeroP:Poly:=⟨EndToEndTupleCheck.zeroM,EndToEndTupleCheck.zeroM,EndToEndTupleCheck.zeroM⟩ def scaleP (s:Int) (Q:Poly):Poly:=⟨scaleM s Q.a,scaleM s Q.b,scaleM s Q.c⟩ def productP (c:Coefficient) (a b:Linear):Poly := let p:=productM (ofVec a) (ofVec b) ⟨scaleM (c 0) p,scaleM (c 1) p,scaleM (c 2) p⟩ theorem poly_of (Q:Quadratic):poly (ofPoly Q) = Q:=by funext d fin_cases d <;> exact mat_ofMat _ theorem poly_add (Q R:Poly):poly (addP Q R) = poly Q + poly R:=by funext d fin_cases d <;> exact mat_add _ _ theorem poly_zero:poly zeroP = 0:=by funext d fin_cases d <;> exact EndToEndTupleCheck.mat_zero private def zz494:"s01ee"="s01ee":=by decide+kernel theorem poly_scale (s:Int) (Q:Poly):poly (scaleP s Q) = s • poly Q:=by funext d fin_cases d <;> exact mat_scale _ _ theorem poly_product (c:Coefficient) (a b:Linear) : poly (productP c a b) = coefficientProduct c a b:=by funext d fin_cases d <;> simp [poly,productP,coefficientProduct, mat_scale,mat_product,vec_ofVec] theorem context_cons (a:Linear) (C:Nat → Vec) : context (EndToEndTupleCheck.cons (ofVec a) C) = NatBacksubRecoveredQuadraticCertificates.cons a (context C):=by exact EndToEndTupleCheck.context_cons a C theorem combination_eq (C:Nat → Vec) (s:Int) (w:NatBacksubRecoveredQuadraticCertificates.Combination) (a:Linear) : EndToEndTupleCheck.combinationCheck C s w a = NatBacksubRecoveredQuadraticCertificates.combinationCheck (context C) s w a:=by exact EndToEndTupleCheck.combinationCheck_eq C s w a def termP (C:Nat → Vec):NatParametricCertificates.NonnegativeTerm → Poly | .square a b => let a:=ofVec a let b:=ofVec b ⟨productM a a,addM (productM a b) (productM b a),productM b b⟩ | .middleSquare a => let p:=productM (ofVec a) (ofVec a) ⟨EndToEndTupleCheck.zeroM,p,scaleM (-1) p⟩ | .pair d i j => let p:=productM (C i) (C j) if d = 0 then ⟨p,scaleM (-2) p,p⟩ else if d = 1 then ⟨EndToEndTupleCheck.zeroM,scaleM 2 p,scaleM (-2) p⟩ else ⟨EndToEndTupleCheck.zeroM,EndToEndTupleCheck.zeroM,p⟩ private def zz495:"s01ef"="s01ef":=by decide+kernel theorem poly_term (C:Nat → Vec) (v:NatParametricCertificates.NonnegativeTerm) : poly (termP C v) = NatParametricCertificates.termPolynomial (context C) v:=by cases v with | square a b => funext d fin_cases d <;> simp [termP,poly,NatParametricCertificates.termPolynomial, mat_product,mat_add,vec_ofVec] | middleSquare a => funext d fin_cases d <;> simp [termP,poly,NatParametricCertificates.termPolynomial, mat_product,mat_scale,vec_ofVec,EndToEndTupleCheck.mat_zero] | pair d i j => fin_cases d <;> funext k <;> fin_cases k <;> simp [termP,poly,NatParametricCertificates.termPolynomial, mat_product,mat_scale,EndToEndTupleCheck.mat_zero,context] def decomposeP (C:Nat → Vec):NatParametricCertificates.Decomposition → Poly | [] => zeroP | (s,v) :: ds => addP (scaleP s (termP C v)) (decomposeP C ds) theorem poly_decompose (C:Nat → Vec) (d:NatParametricCertificates.Decomposition) : poly (decomposeP C d) = NatParametricCertificates.decompositionPolynomial (context C) d:=by induction d with | nil => exact poly_zero | cons v vs ih => simp only [decomposeP,NatParametricCertificates.decompositionPolynomial, List.map_cons,List.sum_cons,poly_add,poly_scale,poly_term,ih] def part (Q:Poly):Fin 3 → Mat:=![Q.a,Q.b,Q.c] theorem mat_part (Q:Poly) (d:Fin 3):mat (part Q d) = poly Q d:=by fin_cases d <;> rfl def polynomialEq (Q R:Poly):Bool := (List.finRange 3).all fun d => EndToEndTupleCheck.coefficientEq (part Q d) (part R d) theorem polynomialEq_eq (Q R:Poly) : polynomialEq Q R = NatParametricCertificates.polynomialEq (poly Q) (poly R):=by simp only [polynomialEq,NatParametricCertificates.polynomialEq, EndToEndTupleCheck.coefficientEq_eq,mat_part] def decompositionCheck (C:Nat → Vec) (Q:Poly) (s:Int) (d:NatParametricCertificates.Decomposition):Bool := decide (0 < s) && (d.all fun v => decide (0 ≤ v.1)) && polynomialEq (decomposeP C d) (scaleP s Q) private def zz496:"s01f0"="s01f0":=by decide+kernel theorem decompositionCheck_eq (C:Nat → Vec) (Q:Poly) (s:Int) (d:NatParametricCertificates.Decomposition) : decompositionCheck C Q s d = NatParametricCertificates.decompositionCheck (context C) (poly Q) s d:=by simp only [decompositionCheck,NatParametricCertificates.decompositionCheck, polynomialEq_eq,poly_decompose,poly_scale] def scalarTerm:NatBacksubRecoveredQuadraticCertificates.NonnegativeTerm → OrthantQuadraticCertificates.NonnegativeTerm | .square a => .square a | .pair i j => .pair i j def scalarDecomposition (d:NatBacksubRecoveredQuadraticCertificates.Decomposition) : OrthantQuadraticCertificates.Decomposition:=d.map fun (s,v) => (s,scalarTerm v) theorem scalar_matrix (C:Nat → Linear) (d:NatBacksubRecoveredQuadraticCertificates.Decomposition) : OrthantQuadraticCertificates.decompositionMatrix C (scalarDecomposition d) = NatBacksubRecoveredQuadraticCertificates.decompositionMatrix C d:=by simp only [scalarDecomposition,OrthantQuadraticCertificates.decompositionMatrix, NatBacksubRecoveredQuadraticCertificates.decompositionMatrix,List.map_map] congr 1 apply List.map_congr_left intro v _ rcases v with ⟨s,v⟩ cases v <;> rfl def scalarSupport (C:Nat → Vec) (Q:Mat) (pairs:List (Nat × Nat)) : Int × OrthantQuadraticCertificates.Decomposition := match BacksubIntegerElimination.solveScaled (pairs.toArray.map fun (i,j) => EndToEndTupleCheck.coefficients (productM (C i) (C j))) (EndToEndTupleCheck.coefficients Q) with | none => (0,[]) | some (scale,weights) => (scale,(weights.toList.zip pairs).map fun (weight,i,j) => (weight, .pair i j)) theorem scalar_support (C:Nat → Vec) (Q:Mat) (pairs:List (Nat × Nat)) : scalarSupport C Q pairs = let d:=NatBacksubRecoveredQuadraticCertificates.supportDecomposition (context C) (mat Q) pairs (d.1,scalarDecomposition d.2):=by unfold scalarSupport NatBacksubRecoveredQuadraticCertificates.supportDecomposition simp only [EndToEndTupleCheck.pairColumn_eq] simp only [EndToEndTupleCheck.coefficients_eq,context] cases h:BacksubIntegerElimination.solveScaled (pairs.toArray.map fun (i,j) => PureIntegerSupportCertificateData.pairColumn (context C i) (context C j)) (PureIntegerSupportCertificateData.matrixColumn (mat Q)) with | none => simp_all [scalarDecomposition,context] | some result => rcases result with ⟨s,weights⟩ simp_all [scalarDecomposition,List.map_map,scalarTerm,context] def scalarCheck (C:Nat → Vec) (Q:Mat) (pairs:List (Nat × Nat)):Bool := let d:=scalarSupport C Q pairs EndToEndTupleCheck.decompositionCheck C Q d.1 d.2 theorem scalarCheck_eq (C:Nat → Vec) (Q:Mat) (pairs:List (Nat × Nat)) : scalarCheck C Q pairs = NatBacksubRecoveredQuadraticCertificates.check (.support pairs) (context C) (mat Q) []:=by simp only [scalarCheck,NatBacksubRecoveredQuadraticCertificates.check,scalar_support, EndToEndTupleCheck.decompositionCheck_eq,OrthantQuadraticCertificates.decompositionCheck, NatBacksubRecoveredQuadraticCertificates.decompositionCheck] rw [scalar_matrix] simp only [scalarDecomposition,List.all_map,Function.comp_def] def bernstein (Q:Poly) (d:Fin 3):Mat := if d = 0 then scaleM 2 Q.a else if d = 1 then addM (scaleM 2 Q.a) Q.b else scaleM 2 (addM (addM Q.a Q.b) Q.c) private def zz497:"s01f1"="s01f1":=by decide+kernel theorem mat_bernstein (Q:Poly) (d:Fin 3) : mat (bernstein Q d) = NatParametricCertificates.bernsteinPart (poly Q) d:=by fin_cases d <;> simp [bernstein,NatParametricCertificates.bernsteinPart,poly, mat_scale,mat_add] def supportCheck (C:Nat → Vec) (Q:Poly) (pairs:NatParametricCertificates.Supports):Bool := (List.finRange 3).all fun d => scalarCheck C (bernstein Q d) (pairs d) theorem supportCheck_eq (C:Nat → Vec) (Q:Poly) (pairs:NatParametricCertificates.Supports) : supportCheck C Q pairs = NatParametricCertificates.supportCheck (context C) (poly Q) pairs:=by simp only [supportCheck,NatParametricCertificates.supportCheck,scalarCheck_eq,mat_bernstein] def check (cert:Certificate) (C:Nat → Vec) (Q:Poly) (hs:Hinges):Bool := match cert,hs with | .cut a p m,hs => check p (EndToEndTupleCheck.cons (ofVec a) C) Q hs && check m (EndToEndTupleCheck.cons (ofVec (-a)) C) Q hs | .support pairs,[] => supportCheck C Q pairs | .leaf s d,[] => decompositionCheck C Q s d | .split p m,(c,a) :: hs => check p (EndToEndTupleCheck.cons (ofVec a) C) (addP Q (productP c a a)) hs && check m (EndToEndTupleCheck.cons (ofVec (-a)) C) Q hs | .positive s w p,(c,a) :: hs => EndToEndTupleCheck.combinationCheck C s w a && check p (EndToEndTupleCheck.cons (ofVec a) C) (addP Q (productP c a a)) hs | .negative s w m,(_,a) :: hs => EndToEndTupleCheck.combinationCheck C s w (-a) && check m (EndToEndTupleCheck.cons (ofVec (-a)) C) Q hs | _,_ => false theorem check_eq (cert:Certificate) (C:Nat → Vec) (Q:Poly) (hs:Hinges) : check cert C Q hs = NatParametricCertificates.check cert (context C) (poly Q) hs:=by induction cert generalizing C Q hs <;> cases hs <;> simp only [check,NatParametricCertificates.check,combination_eq, context_cons,poly_add,poly_product,decompositionCheck_eq,supportCheck_eq, *] theorem K {cert:Certificate} {C:Nat → Linear} {Q:Quadratic} {hs:Hinges} (h:check cert (fun i => ofVec (C i)) (ofPoly Q) hs = true:=by decide +kernel) : NatParametricCertificates.check cert C Q hs = true:=by rw [check_eq,context_of,poly_of] at h exact h end Green24Proof.ParametricTupleCheck private def zz2175:"s087f"="s087f":=by decide+kernel namespace Green24Proof.QuadNearBalanceCase0 open ParametricQuadraticCertificates hiding Certificate check check_sound open NatParametricCertificates open NatBacksubRecoveredQuadraticCertificates (cons) open IntegerQuadraticCertificates (Linear Point linearEval combinationCheck) def constraints:Fin 4 → Linear:=![![1,0,0,0], ![0,1,0,0], ![0,0,1,0], ![0,0,0,1]] def base:Quadratic:=![![![0x3797219f80b54, -0x221b262dd8000, -0x3328b944c4000,0x237342d5e5aa], ![-0x221b262dd8000, -0x126552ce068b54,0x41ff182e51a56,0x110d9316ec000], ![-0x3328b944c4000,0x41ff182e51a56, -0xde5bab6f61f20,0x2245f2ff317c8], ![0x237342d5e5aa,0x110d9316ec000,0x2245f2ff317c8, -0x110d9316ec000]], ![![0,0,0,0], ![0,0,0,0], ![0,0,0x1155bbf3a80, -0x4556efcea0], ![0,0, -0x4556efcea0,0]], ![![0x1202087f6040,0x57714333f70,0x831923eaa00, -0xd16a6e706c0], ![0x57714333f70,0x25a72fb42020, -0x68a5014e480,0x1a5329299a0], ![0x831923eaa00, -0x68a5014e480,0x2689cbe72c20, -0x6373d2bd250], ![-0xd16a6e706c0,0x1a5329299a0, -0x6373d2bd250,0x2ba7def3000]]] def hinges:Hinges:=[(![0,0,0x1c3a90], ![0,0,1, -3]),(![-0x156668acbe4,0x22ab77e750,0x622c7c7930], ![0,0,1, -1]),(![0x156668acbe4, -0x22ab77e750, -0x622cd128e0], ![0,0,3, -1]),(![0x11b9a16af2d5,0, -0x22eca8eb020], ![0,1,0, -3]),(![0x3d90afd394f02,0,0], ![0,1,0, -1]),(![-0x110d9316ec000,0,0x2ba7def3000], ![0,3, -2, -1]),(![0x110d9316ec000,0, -0x2ba7def3000], ![0,3, -2,1]),(![0x11b9a16af2d5,0,0], ![0,3,0, -1]),(![0x110d9316ec000,0, -0x2ba7def3000], ![0,3,2, -1]),(![-0x156668acbe4,0x22ab77e750,0x622cd128e0], ![1, -3,0,0]),(![-0x110d9316ec000,0,0x2ba7def3000], ![1, -2, -3,0]),(![0x110d9316ec000,0, -0x2ba7def3000], ![1, -2,3,0]),(![0x156668acbe4, -0x22ab77e750, -0x622c7c7930], ![1, -1,0,0]),(![-0x11b9a16af2d5,0,0], ![1,0, -3,0]),(![-0x3d90afd394f02,0,0], ![1,0, -1,0]),(![0,0,0x45d951d6040], ![1,0,0, -3]),(![0x110d9316ec000,0, -0x2ba7def3000], ![1,2, -3,0]),(![0,0, -0x1c3a90], ![3, -1,0,0]),(![-0x11b9a16af2d5,0,0x22eca8eb020], ![3,0, -1,0]),(![0,0, -0x45d951d6040], ![3,0,0, -1])] def normalizationDenominator:ℤ:=0x221b262dd8000 noncomputable def slack (t:ℝ) (x:Point):ℝ := (quadraticEval base t x + hingeEval hinges t x) / normalizationDenominator def constraintsNat (i:Nat):Linear := constraints ⟨i % 4,Nat.mod_lt _ (by decide)⟩ private def ctx2815:Nat → Linear:=constraintsNat private def quad2815:Quadratic:=base private def ctx729:Nat → Linear:=cons ![0,0,1, -3] ctx2815 private def quad729:Quadratic:=quad2815 + coefficientProduct ![0,0,0x1c3a90] ![0,0,1, -3] ![0,0,1, -3] private def ctx342:Nat → Linear:=cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx729))) private def quad342:Quadratic:=(((quad729 + coefficientProduct ![-0x156668acbe4,0x22ab77e750,0x622c7c7930] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x156668acbe4, -0x22ab77e750, -0x622cd128e0] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0x11b9a16af2d5,0, -0x22eca8eb020] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1] private def ctx170:Nat → Linear:=cons (-![1, -3,0,0]) (cons ![0,3,2, -1] (cons ![0,3,0, -1] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] ctx342)))) private def quad170:Quadratic:=((((quad342 + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1]) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3,2, -1] ![0,3,2, -1]) private def ctx341:Nat → Linear:=cons (-![0,3, -2, -1]) ctx342 private def quad341:Quadratic:=quad342 private def ctx250:Nat → Linear:=cons ![0,3, -2,1] ctx341 private def quad250:Quadratic:=quad341 + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1] private def ctx575:Nat → Linear:=cons ![0,1,0, -1] (cons (-![0,1,0, -3]) (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx729))) private def quad575:Quadratic:=(((quad729 + coefficientProduct ![-0x156668acbe4,0x22ab77e750,0x622c7c7930] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x156668acbe4, -0x22ab77e750, -0x622cd128e0] ![0,0,3, -1] ![0,0,3, -1])) + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1] private def ctx574:Nat → Linear:=cons (-![0,3, -2, -1]) ctx575 private def quad574:Quadratic:=quad575 private def ctx490:Nat → Linear:=cons ![0,3, -2,1] ctx574 private def quad490:Quadratic:=quad574 + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1] private def ctx725:Nat → Linear:=cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx729))) private def quad725:Quadratic:=(((quad729 + coefficientProduct ![-0x156668acbe4,0x22ab77e750,0x622c7c7930] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x156668acbe4, -0x22ab77e750, -0x622cd128e0] ![0,0,3, -1] ![0,0,3, -1])) private def ctx649:Nat → Linear:=cons ![0,3,0, -1] (cons (-![0,3, -2,1]) (cons (-![0,3, -2, -1]) ctx725)) private def quad649:Quadratic:=((quad725)) + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx1387:Nat → Linear:=cons ![0,0,1, -1] (cons (-![0,0,1, -3]) ctx2815) private def quad1387:Quadratic:=(quad2815) + coefficientProduct ![-0x156668acbe4,0x22ab77e750,0x622c7c7930] ![0,0,1, -1] ![0,0,1, -1] private def ctx865:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons ![0,0,3, -1] ctx1387))))) private def quad865:Quadratic:=(((((quad1387 + coefficientProduct ![0x156668acbe4, -0x22ab77e750, -0x622cd128e0] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0x11b9a16af2d5,0, -0x22eca8eb020] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx1385:Nat → Linear:=cons (-![0,1,0, -3]) (cons ![0,0,3, -1] ctx1387) private def quad1385:Quadratic:=(quad1387 + coefficientProduct ![0x156668acbe4, -0x22ab77e750, -0x622cd128e0] ![0,0,3, -1] ![0,0,3, -1]) private def ctx988:Nat → Linear:=cons ![0,3,2, -1] (cons ![0,3,0, -1] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx1385)))) private def quad988:Quadratic:=((((quad1385 + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1]) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3,2, -1] ![0,3,2, -1] private def ctx1142:Nat → Linear:=cons (-![0,3, -2, -1]) (cons ![0,1,0, -1] ctx1385) private def quad1142:Quadratic:=(quad1385 + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1]) private def ctx1070:Nat → Linear:=cons ![0,3, -2,1] ctx1142 private def quad1070:Quadratic:=quad1142 + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1] private def ctx1384:Nat → Linear:=cons (-![0,1,0, -1]) ctx1385 private def quad1384:Quadratic:=quad1385 private def ctx1382:Nat → Linear:=cons (-![0,3, -2,1]) (cons (-![0,3, -2, -1]) ctx1384) private def quad1382:Quadratic:=(quad1384) private def ctx1304:Nat → Linear:=cons ![0,3,0, -1] ctx1382 private def quad1304:Quadratic:=quad1382 + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx2813:Nat → Linear:=cons (-![0,0,1, -1]) (cons (-![0,0,1, -3]) ctx2815) private def quad2813:Quadratic:=(quad2815) private def ctx2067:Nat → Linear:=cons ![0,0,3, -1] ctx2813 private def quad2067:Quadratic:=quad2813 + coefficientProduct ![0x156668acbe4, -0x22ab77e750, -0x622cd128e0] ![0,0,3, -1] ![0,0,3, -1] private def ctx1470:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] ctx2067)) private def quad1470:Quadratic:=((quad2067 + coefficientProduct ![0x11b9a16af2d5,0, -0x22eca8eb020] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx2066:Nat → Linear:=cons (-![0,1,0, -3]) ctx2067 private def quad2066:Quadratic:=quad2067 private def ctx1602:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx2066))) private def quad1602:Quadratic:=(((quad2066 + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx2065:Nat → Linear:=cons (-![0,1,0, -1]) ctx2066 private def quad2065:Quadratic:=quad2066 private def ctx1708:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] ctx2065) private def quad1708:Quadratic:=(quad2065 + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1] private def ctx1822:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) ctx2065)) private def quad1822:Quadratic:=((quad2065) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx1983:Nat → Linear:=cons (-![0,3,0, -1]) (cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) ctx2065)) private def quad1983:Quadratic:=((quad2065) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1]) private def ctx2063:Nat → Linear:=cons (-![0,3, -2,1]) (cons (-![0,3, -2, -1]) ctx2065) private def quad2063:Quadratic:=(quad2065) private def ctx2148:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons (-![0,0,3, -1]) ctx2813))) private def quad2148:Quadratic:=(((quad2813) + coefficientProduct ![0x11b9a16af2d5,0, -0x22eca8eb020] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx2811:Nat → Linear:=cons (-![0,1,0, -3]) (cons (-![0,0,3, -1]) ctx2813) private def quad2811:Quadratic:=(quad2813) private def ctx2241:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx2811) private def quad2241:Quadratic:=(quad2811 + coefficientProduct ![0x3d90afd394f02,0,0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx2359:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) ctx2811))) private def quad2359:Quadratic:=(((quad2811) + coefficientProduct ![-0x110d9316ec000,0,0x2ba7def3000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx2809:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) ctx2811) private def quad2809:Quadratic:=(quad2811) private def ctx2489:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -2,1] ctx2809) private def quad2489:Quadratic:=(quad2809 + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0x11b9a16af2d5,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx2640:Nat → Linear:=cons ![0,3,2, -1] (cons (-![0,3,0, -1]) (cons ![0,3, -2,1] ctx2809)) private def quad2640:Quadratic:=((quad2809 + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1])) + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3,2, -1] ![0,3,2, -1] private def ctx2806:Nat → Linear:=cons (-![0,3,2, -1]) (cons (-![0,3,0, -1]) (cons ![0,3, -2,1] ctx2809)) private def quad2806:Quadratic:=((quad2809 + coefficientProduct ![0x110d9316ec000,0, -0x2ba7def3000] ![0,3, -2,1] ![0,3, -2,1])) private def data27:List Nat:=[ 0x1131313110d0d100b0b0b0a0a10090b0908080a020a131313110d0d100b0b0b130910090b0908080a020a131313110d0d100b0b0b130910090b0908080a020a060a040306010c00080416030b020902011200300436030502040200020302030a040904060401020406030b0202020202030e04080207020404040803131313110d0d100b0a0a10090a0808080a0208020a131313110d0d0a0a10090e090b0908080a0208000a131313110d0d0a0a10090e090b0908080a0208000a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e040002020603010c0402020206030b04010800060306031313130b100b110a11090b09110417021701091313130b110a11090b09110417021701081313130b110a11090b0911041702170108060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e0400020206030d08070606060212041a030c04010200020308030e060b020806010404060301] private def node27:Certificate:=PackedParametricCertificateData.decode 11 data27 private def data37:List Nat:=[ 0x1b2f382f39acf9997a3d69095becdd6f088f980dda9f2a2961108010201ce9bd8979aada485b4d9da90dd9bc9d2c2a8b7f1c7edf5b5aaa9f2170201025ccfabd5c6bc8dc0ee9e8592fc92f1a299e0b7c68f9eb083a7f2e01313000202f7bcdbc3e8e9ece4aec2cb94cc87acedb8cbead18bd6ece1b88e80130a000228d6c6c4badec0ceb9f7f3f388f2dc9bcef4fb94fcf58a94d1ef800a0a000203eae590a1989282e8f796f3a9a2b685e9ac92c287bc9bceea9da0170900020fe0c181fdc3b1b0e09fe3b8c2b2e5cde983d1bdad9bf8dba5ccabb01109000211d6ade3b5bde5a288a3d6b49fcc81ca8be0b5eab3b48edaa3beebd00a09000214d09ca6d687e99a9cf8e2f4cfcde5b6ac97d5c3c181f2b0b4828017080002038ebcf1a8f8c598fdcacb86a1cbeee2beecc0edb8e5a2bcd5b3aed01108000202928c92d3e2f4c0a2fbbbdffd89e18deff78089c697c09590ead9b00808000213d286e2f0fdeff1edb7a795f6f7d59be980e383adc3cf9cdaf8801702000274c4f6e8caf4dca79ab8f3bcf280a1dd97f8e6b0c18ff5ab899bc01e0ee6f5d482edaac188d68ae486f28ff59a8db1b5a0000a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e0400020206030d08070606060212041a030c04010200020308030e0408040002030203, 0x108fb8008db9301c29148e214dcfe4df79d02d8e07e9f0008cbacdf81e0c0b3f5ce95a1acc99bcab6f3a4afcfd1a001a2a005bffa69afe434c7df019c890286a703e6ea01dcb5000297c681acb0aa8cd0b581d0969eb4d29fc9f1ae8fe0131302020291fdccdfb4e5f7e5c2d8b4cbb3f8f2b6fe9e9d9280abf494f1d6800a0a020202f39292c3cbb2ad8c9aaddb8097d3d2d7d7c8c3f38db4d090dc80170902020da0d2b08488c1a2e4d981a4b1c7b498d2ebeb80a7f3a696ab95c8c0110902021397c7d7b9e6f399b499c8cca9bfc2e6cfadc3b6f7da8bf3b2fbb8c00a0902020ce89493e48f9ebdbfe9c4cf9781d797b2d990f8ae94a8a6befe801708020207c2988ed682d596f9e4ffa2b39fffdffcbd8d81a4e5d0ab90efadc011080202019d8597b1a0d3ebcbe29da0c3adafb9c4ffb68a86d485b8befee8c01702020239c3c7e9929bd4de88b6b9d1b3d9e0e1d0badffef7999ff2ca9e801313010202caf2f882d4e99b90a0b69ac5b79f89db90c7c8d1fdfdb1dc86878c0a0a01020489f5bb80d0b7fa96b1f18d86b082e48089e4e7f8c0a6a4fff8e0170901020f99b1f3dab78fd9ab8289ff978aa894bbd3c7d6e9f3a582f698bbea1109010212c999ece7beb4eed3a1c3a89994c28382a2a89aeead8d8cc49e8bce0a09010215adf4cfc1d6bc80ced3c0c38bb1eac1d280eeefb4ecfafce1bfc01708010205c1b2da, 0x109aa8679c8a305cad0029e9f011ca186bbbcc5878fa4ac84e0d6c1f294f8d0de9485e850e906889f6dced735afd20107b1fdd09dd098b2ee9b90bfedb98c93f4a7b8c89080] private def node37:Certificate:=PackedParametricCertificateData.decode 10 data37 private def data62:List Nat:=[ 0x18cbea3cf8cd09b81a8e0ce93ad8aa1f1cdda97f7d2dce380a3edafffe9a4a483c6e5afebc785cc171100025aaecf95c1f8f6fc92f29e9cfebea3b2c6a2f281daf6f9dfcaddf3ae92b9c4ffea9be0dcde948cddeba4d882d287d6dac4d0e092f5f1d0f39c170b00020bef81e1ff9fa6d98088e1b2a8d7cbb2ffd2e2f9c7da93aa98b48bc9b99389fe9dc8bfd0ed92a1c0fbf78cd3a4dfd2aecd8deba79490b98e800808000203fdbbe8d7beb7edf4998487ead89bb2f8ef89859dcbc2988abd86f3a88c89a3c5be8389a0e8e0e1a4ebede9c892969688a5f9d0ecd396f80807000206bba89fd3a1ac9bc7fcebbec6aeb9dc808caa8bc1c0eb928481afe3a48df9d5afa2bc97f193b3f6a6d4bce4f6beecb0f4decbaacbfeb0070700020caae4fd918eab91c48ffdd28fee938280fcea888b9acd85dffcf78e82d8c9849c94beb690c6fef9a6ea91d492f1dc8f9caebdb49faba0170400022dd99bda9786e9ebc486c8b2f6b6cfb0ece9acd9dc948ad7b487c0e2f9ee98e2defcb1cecbd0f58897efb5c280eeb0b1fde1f8b7e29fdc9ce01e09cddabfd796f2acc69adde5f1ff9faac1c190c1fdc2e3fc86d7cce3a198bce2d388b2c0eaa0d5bd88ddce81f68aa3b3deb6b0000a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e04000202060301, 0x1ccb4ba93f80606020209c8ebe6c2eb9cacab9a8bdcf0a3b290a5fb90bf90d9c5faf8d4fbaf97a1b0b3ccb794b1a9f0f0ce8f99e8e7e7aff9a8e2ac8698fce5e81704020223d4b7b1fd82a5c580e1d298a0fdde85f3b0edc1ebd5f5ceccefa3f6a5f59ca484c2e6a8e5d1daac87aad48399c8c7eab7d780f2a687d58ae0171301020196a8cfd7f1edffd2fecee9abd1b78ae2c7a8e689d9e8d4b5b1b68afeaeaf9fb7ffcb82b3bd85a3b5fdd0ade9bffa8683fff3b7ba86d0cc9cc217110102589ac1a2aac6fced89efe7e3eef6d387a2d8ae87c1f9818db3aba1ac8fdea786aad7b9b9c9bfac909ef3c1d8acb19a9b89f2888c8ceb8aa892170b010211b7c4a5aed0f4deecccccc5a7919ce7e39ec4bc8ef0e1c2b0d08aa9bb9984fbcbcaabcfa68b9291cfc2d1ecafced8f0ebb0edc8b3c29cadd00808010206c3ada2e88ddeb8b0ced9bd8ecbd689caba8fe5a7e7b7b7e5d7e5e5d2f8b7da90fa86c49a89b3db9b9ab2ecddfca2eafdcbe7bef2d0b7b20606010202c7a2fdfffc89e8fff6c6d39cb3efe6e7bcb887f4f7b488f688b5b0b9d787a9e8a9c893e0919898ea8cdce488c1cfc5b8c0c6df8bab9617040102288bc8e4c7bdace88bd2b2c8809de4befefac0f0f8afd7d8db91ff93ea988a8be7bcb2edf09be4f5dbd9b5e8c9f4afdd958bd49ee5ce8a8a981713000201ebe4918191b6fde189d18ccaf1ce9aaa9ba6, 0x1b28b39e6b50ce2a107cdec0004a6d8fbd2ea8fd890cbe6d7d2d3b2cbfac3f69fb682c2ab8af091fb88dbadb3d0b2c487d7c599a9dc88e8dfb4bce4cee2b7dca81eaeaf0ecbb509a6d90394fe3feac44594d01fa58a1184ab00018a89e4b08bb2958f8ed8cfd8e482fda6b4d7c29df9a9e5cb94cdbde6ace2fff8a7a8bc9ccadda89bf2988ed6ea9ab2aca1dec00189f601c6a63db18c79879a1fe46ab80691ad0d9cb900219982d1f783c0c2f38791f6cafda3ad8bb5b3acc5c7b882ecfc9099e6ed87e79feda6bf92e09099cbb7af929db3adcebad81713020202afc6d3bdf0c4eabb91c3cdb9a4c3f4c5c088af82bafb8cc78f93b5f1dfdbbae1cbe1c3de88d68ad9aba6c8e2cbf2bdf6d2f184a49a9bacded01711020254f5a8dbf495d2e1f182dfda85accbba9c8af5f4dafadbcc8bc283bde2a0ddc89ab5fd979da7dcdad991a7a7d4d08aceb489e486b2c9d4b790170b020208a1f1d2b19ba7ffd2aa8ed2b7dbcfd3d98af2e185dcb5f8be9bd2ca8594b6e2c69ea1faa9e898f0c68daac2cb9e9095a1e1dba79eac96cda00909020256b8d680dd9c8bd5ab9381d4d5bca0c4939abde59e8be5da98a3e4a89d8dd9aa83ab9a9b8e8f9689d2a7a0fce19c848daec6c4939aad800808020204bbcaa4b987b5b8b9b9fe81b186dbf0cef9e587c2bd86df80cd81afa5edb9c6fe8de8bba587cbaff3bdcccd8d828ab7dbb5de, 0x10486f449a5016786ba9c8494cfae88fdfec8d8808cbdbd81f598e68cdac0e98bcecfceb5e6f98d82ec88edd5abdf8b96f1b5fafec8fd97ee809414d4e2119ba86a97df35f0860122b4cfa8d5b4f0f6f6f7f7b4e387a78d9dc6bad9b087dacfbc95b2f7b9dc9a9dbdf4e3f4ac909a92a997f0e2ee8fe9a9d189f0f24fa3d558f4f71786870db1d601029f95d5e8c5f2b49d86af9fadbff4d3fd8ec282c992b3e8c9e0e3bdcc80a4ad96abbad5dbbeecacc6f7f99990f3b5c0fe9c87ca019ee56bef01a2e06e9b38859e3aaef51ae68e0ccad9000393dcee94eeefe7bf968bb1adc885c0e2d5b5dc939e95efedc8ef82fed9e094ddeaaadb989cbded8dc7c4c49b9ffb908dc99ceac005adf205ad8f01e1dc0184a72989a605cbee43899d2293b20001d5cdcb82ff97b39f95b994aea892a888d9d7ea9ca4d68bf9a6cf8e9690dcd0c2cdc8d791eef2dcd6e8b8a5c3ffff8ebbf789e380018cca8162b2d803b0ff019bde439294378dc903e3e502e69c003cc3a0aa8aa8f090e6cbf5f9b4d29fddf9a29bb396b3abcfd9d09392a0e5b4e694c3e5f5eb8183c6faf787cba8e496c7e6d2edc01af0f21fe9b40195c78f4bb5b80cf4b111a0fd49eede25ac8f0010c3e38aa1e6ff91f3ad8ed5a08ff4e4edb4beb2a6ce83dbfaf4899ba9fb95dcb881bc94e1c48eecb8d7d0ada790b1ef9585c4a05bbaae0189aac422eeac14cfff24, 0x186c9c880060602023ffbbcb394a5fab0cae1ef88d7bae2ae8de00702020201839cb5eef6ead8c5f4939286e4d2a896801313010202dedbadc1c6f0ecffe6978fd696d0deacc2d21311010202ca81d3d3cd92a598cde1a08d8da68785b7c20a0a01024a88999f86f183aec8a1de90afe6e2bdd280130901020187bac2aeb598b88187b5baedebda97b6f3b80808010269cab696b48a96eec5bcdaf9cf81f7c6b9d40707010201abb9a5d8b4e5fabcfbd6e7a2cff6e1ef94d8130601024dcfedf8f8c3eaa9a4fd94e8fbd7eefcc0c80906010268fdf8dc9cb8f0d39cdd85efab8eb4d5bc800606010201d4f09788cbe2b383a2cc90f0dac3e296d41313000202de8ca3b8b8b2bbfad9c292b2e6e9ffd0fd801311000202ccdbdbedf9e2cfa99ddbcfd7c7accdd382800a0a00024ac9f9c6f0e8a4d0ea9d9cd8b7a0f2bac180130900020185bbd4d98fc38ceac199b3b4f9fd84c6ec80080800026bdbe2e8de96dbbdb0ade3acc1fae6f0a38007070002019ce2d0b9fabae080cbdf80819ee3ffb79780130600024f84d2d19dd5d687f0dff0b8beecf4f2cc800906000265facfd79886998aea8bfc9eabdbe0a8a4800606000205f7dea7edca95ecd7e78dbaf3a3dfa1bc801e0ebded88cad1f8efdbe59780000a040306010c00080416030b02090201120030043603050204020002030203010b020202020203015abf9a51e9c7, 0x113131110130b0a0a080404040e030b03070202020a13131110130b0a0a080404040e030b03070202020a13131110130b0a0a080404040e030b03070202020a060a040306010c00080416030c020b020506000604080311040402020203030401060202040b0202020202031313100b0a0a0e0608040e0302020301080003000a1313100b0a0a0e0908040e0302020301080003000a1313100b0a0a0e0908040e0302020301080003000a060a040306010c00080416030c020b020306000c040e031104040202020379892df7ff63c8fa35d09f010387d7fbec90fa89a2a8b582b035ae01848b61c50180a009dcc22e898541c1881f939b0002c1eef19fcac981a9ab8cc6e1801313020202dec0b3ddf5cbeac8a6b9a9e5c297caa5a2c01311020202dc99de83b1c9a4f9a989e5ee9a8e84b89cc00a0a02024bb7c7dac1e493c7f0c2e1c9b0dede9af280130902020189c7cdddb6e1eacdceffb3dcaadb91b8a880080802023e94d1f3dcebc699db9fb3efc0b290ffa8a00807020201afd18fedcdcede91bced96ceb4adbaea9980100602022cc4a4cfd5eea9a8b384ab9f93ecabe6bc80090602025dc5a5d7a9f08ce0eaeef083e2a7] private def node62:Certificate:=PackedParametricCertificateData.decode 8 data62 private def data115:List Nat:=[ 0x108070c03120034043e0301131311100b0b0b0908040e0302020e010a0108000a131311100b09080410030e0302020e010a0108000a131311100b09080410030e0302020e010a0108000a060b0803060118031a031313130b0a0a10090a07090708040e030b0302020a1313130b0a0a10090a07090708040e030b0302020a1313130b0a0a10090a07090708040e030b0302020a060a040306010c00080416030101131313110d0d100b1309090908080303020209010a131313110d0d100b1309090908080303020209010a131313110d0d100b1309090908080303020209010a060708030202080306031313131111110d0d0909080803030b02090202020a1313131111110d0d0909080803030b02090202020a1313131111110d0d0909080803030b02090202020a060a08070c03120034043e0301131313110d0d0a0a08080a0713060905030302020a131313110a0a08080a07130609050303020209131313110a0a08080a07130609050303020209060a040306010c00080416030b02090201120030043603010101131313110d0d0a0a130908080a071306030302020a131313110d0d0a0a130908080a071306030302020a131313110d0d0a0a130908080a071306030302020a060a040306010c00080416030b02090201120030043603050402060002030403030401060202030e0200020202030101020004020204, 0x1060f020b0201080308031313130b0a0a10090a0709070d040e030b0302020a1313130b0a0a10090a0709070d040e030b0302020a1313130b0a0a10090a0709070d040e030b0302020a0612040a0201060008040e030101131313110d0d100b1309090908080303020209010a131313110d0d100b1309090908080303020209010a131313110d0d100b1309090908080303020209010a06131313110d0d100b1309090908080303020209010a131313110d0d100b1309090908080303020209010a131313110d0d100b1309090908080303020209010a06011313131111110d0d0909080803030b02090202020a1313131111110d0d0909080803030b02090202020a1313131111110d0d0909080803030b02090202020a06120c0a040706002604280301131313110d0d0a0a08080a0713060905030302020a131313110a0a08080a07130609050303020209131313110a0a08080a071306090503030202090612040a0201060008040e030b020902011200300436030101131311100b0b0b0908040e030a0202020a0108000a131311100b09080410030e0302020e010a0108000a131311100b09080410030e0302020e010a0108000a0613100302020603131313111110130b0b09090908040e030a0202020a131313111110130b0b09090908040e030a0202020a131313111110130b0b09090908040e030a0202020a060a, 0x11313131111100b0909090d040e0302020a010d000a131311100b090d0410030e0302020e010a010d000a131311100b090d0410030e0302020e010a010d000a06131311100b090d0410030e0302020e010a0108000a131311100b090d0410030e0302020e010a0108000a131311100b090d0410030e0302020e010a0108000a0601131313111110130b090904040e030a02020208000a131313111110130b090904040e030a02020208000a131313111110130b090904040e030a02020208000a0612021002000803080301131311100b090d0410030e0302020e010a0108000a131311100b090d0410030e0302020e010a0108000a131311100b090d0410030e0302020e010a0108000a] private def node115:Certificate:=PackedParametricCertificateData.decode 8 data115 private def node116:Certificate:=.split node62 node115 private def data168:List Nat:=[ 0x1029bb7f2c39086f49891c49fb8ad89da87ce801108020202b099f8c0a997b9af9dc3a3edb0ccf7debb800707020212d1ebfea4ad93abd9a0d6b88fc6a9b0800706020206c193bdc4a7feabb49be6e29bc0d780801302020201efe29edee6e5f4a48495c3ddc9ce95a080131301022becf5a7fec49887c3a2dbf0dfc8f8c9ec94170d01020380bdf5d6aea4c6db9ad0b7a999cbdefecc170a01024fe1dd8792a6d6e6da99eeaef88aa1c8a49c110901021b88b896dcbeeab3e5e5abc6db9496cfe1b61708010201f18d87be86a4b6c0beccb1a6acdd91e4fbe41108010202b7f1e2aecbba98f2db8cf7a5ceddbcebbeca070701022dd59ad0c2f9dc81cc8bceb99fc885f0800706010214b18b8c8cb5dc84b0dac4ce8cd6c080131300022acc87d7a4a3ced2f8f8a7b1b89bc4cbb080170d000206a5df87cee79cc3c9f9dad2f4d3b5e38080170a000242c7e6f6fad9f088e096d0e193c28ccda0801109000222bb8fb6fef591f2858b8e91c6c3df939080170800020281cecbf19081b0eaebc698f4a9c890f380801108000202b0c0f7ceb1eaa9cbefffc088dbd68b91d0800707000228d8e7b0dde7a68d94ddb5fcccf4f2b0801b03fe99ddcef2d481aaead880000a040306010c00080416030b0209020112003004360311040402020203090c0208010600040412030b0202020202030e0400020206030102000402020301, 0x10806040406020e0108010913131110170d0e060806040406020e0108010913131110170d0e060806040406020e0108010906100803060018031a0312040302020203131313110a09090810060a0608060802040203020a131313110a09090810060a0608060802030209131313110a09090810060a0608060802030209060a040306010c00080416030b02090201120030043603010a0209020402010a0408030e020002020203011110110e170d110813040404110202011300091110110e170d1108130411021300071110110e170d11081304110213000706100803060018031a0312100402020603131313111110170d1108110709071302080206020a131313111110170d11081107130207131313111110170d11081107130207060a040306010c00080416030b0209020112003004360301090c0208010600040412030f040e0601020306030e0400020206030146f0f863abc102f3bf02f3c0010f9aaaf184dbbbef9da3b994c005f2976ae63a903ab736e79a45a99d01fef501fef600018380e39cc186efa99fae91b080131302023cd6bda2f9988fbdd999a6f88fc29eb9a680170d02020f94a8a480aad1ebbfbef4e691c7bbb8da80170a020221b496de978be79ec99bdd9bbca0bcd9f2801109020223d29effdeeb98f4b4cfc28db6b0ba86e58009090202028ba0b992928293a2b7d2e2a4819a808017080202, 0x113131110140e110e140d110c0d04060201010913131110140e110e140d110c0d04060201010913131110140e110e140d110b0d0406020101090613131110110e110c0d04060201010d0003000913131110110e110c0d04060201010d0003000913131110110e110b0d04060201010d00030009060113131110110e0e060a060d041102060203010913131110110e0e060a060d041102060203010913131110110e0e060a060d04110206020301090612021002000803080301131311100908090710060a0609050d04080203020a131311100a09090810060a0609050d04080203020a131311100908090710060a0609050d04080203020a060f040a02010a0004040e030b02090201120030043603011004040202020313131110170d10060e060b060602010103000913131110170d10060e060a060602010103000913131110170d10060e060b0606020101030009061310030202060313131110170d0e060a0606020e01080103010913131110170d10060e060a060602080103010913131110170d0e060b060a060602080103010906100803060018031a030113131311090810060a06080609050802040203020a13131311090810060a0608060905080203020913131311090810060a06080609050802030209060a040306010c00080416030b0209020112003004360301100404020202030113131110170d0e06] private def node168:Certificate:=PackedParametricCertificateData.decode 9 data168 private def node169:Certificate:=.split node116 node168 private def node170:Certificate:=.split node37 node169 private def node171:Certificate:=.split node27 node170 private def node172:Certificate:=.positive 2 [(1,0),(1,1),(2,5)] node171 private def node173:Certificate:=.positive 3 [(1,0),(2,1),(2,4)] node172 private def node174:Certificate:=.positive 1 [(1,0),(2,9)] node173 private def data202:List Nat:=[ 0x113130e0e0d0d130b100b09090e08080803030a020a13130e0e0d0d100b130909090e08080803030a020a13130e0e0d0d100b130909090e08080803030a020a060a040306010c00080416030b020902011200300436030502040200020302030c02090606040304030b0202020202030a02070604040108040c0313130e0e0d0d130b100b09090e08080803030a020a13130e0e0d0d100b130909090e08080803030a020a13130e0e0d0d100b130909090e08080803030a020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e040002020603010c0402020206030b1c081205120102041e0313130e0e0d0d0e0a0b090b040d030e020b000913130e0e0d0d0e0a0b090b040d030e020b000913130e0e0d0d0e0a0b090b040d030e020b0009060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e0400020206030d040606050602120416030c04010200020308030b1c081205120102041e0301] private def node202:Certificate:=PackedParametricCertificateData.decode 11 data202 private def data247:List Nat:=[ 0x10b010a0109010a131310100e0e100b0a0a080802020b010a0109010a131310100e0e100b0a0a080802020b010a0109010a060b0803060118031a031313100b0a0a0e080907090504040e02020204000a1313100b0a0a0e080907090504040e02020204000a1313100b0a0a0e080907040409030e02020204000a060a040306010c000804160301010f040a0c0204010e041204010d020806011200020414040c0607120214000e0422041313100b0a0a0e08090504040e020702020204000a1313100b0a0a0e08090504040e020702020204000a1313100b0a0a0e08090504040e020702020204000a060a040306010c00080416030b06050a02020008040c03110404020202030f040a0c0204010e0412040b0202020202031010100b0b0b0d0a0a0a080813040e02080203020a1010100b0b0b0d0a0a0a080813040e02080203020a1010100b0b0b0d0a0a0a080813040e02080203020a060a040306010c00080416030b06030a020200120416031104040202020313130e0e0d0d100b0a0a0e0808080404030302020a13130e0e0d0d100b0a0a0e0808080404030302020a13130e0e0d0d100b0a0a0e0808080404030302020a060a040306010c00080416030b02090201120030043603050204020002030203010b020202020203010c060712030e0206041404010b300a02081a05200430030702040401020006040604, 0x113130e0e0d0d100b0b0b08080b020a02020209010a13130e0e0d0d100b0b0b08080b020a02020209010a13130e0e0d0d100b0b0b08080b020a02020209010a0613130e0e0d0d100b0b0b08080b020a02020209010a13130e0e0d0d100b0b0b08080b020a02020209010a13130e0e0d0d100b0b0b08080b020a02020209010a060111020c060106001e042004131310100e0e100b0a0a080802020b010a0109010a131310100e0e100b0a0a080802020b010a0109010a131310100e0e100b0a0a080802020b010a0109010a060f020b02010803080313131311100b0a0a0e080907090504040e0202020a13131311100b0a0a0e080907090504040e0202020a13131311100b0a0a0e080907040409030e0202020a0612040a0201060008040e0301010f040a0c0204010e04120413130e0e0d0d100b0b0b08080b020a02020209010a13130e0e0d0d100b0b0b08080b020a02020209010a13130e0e0d0d100b0b0b08080b020a02020209010a061310030202060311020c060106001e042004131310100e0e100b0a0a08080202] private def node247:Certificate:=PackedParametricCertificateData.decode 11 data247 private def node248:Certificate:=.split node202 node247 private def node249:Certificate:=.positive 2 [(1,0),(1,1),(2,5)] node248 private def node250:Certificate:=.positive 7 [(6,0),(3,3),(4,4)] node249 private def data290:List Nat:=[ 0x10804160301111007020206030a020902020201040406040f040b0605020306031010130c0d0c17080d0508050e010d01080103010a1010130c0d0c17080d0508050e010d01080103010a1010130c0d0c17080d0508050e010d01080103010a060a040306010c000804160315040a040312000c0412031104050202060304031010130c100c0d0b0d090e080808090604030a010a1010130c100c0d0b0d090e080808090604030a010a1010130c100c0d0b0d090e080808090604030a010a060a040306010c00080416030702010e0020032403050204020002030203010b0a050203020006040a03011010130c100c0d0b0e080808060610030d010a010a1010130c100c0d0b0d090e080808060604030a010a1010130c100c0d0b0d090e080808060604030a010a060a040306010c00080416030702010e00200324030502040200020302031304080402060306030f040e0601020306030e040002020603010c0402020206030b1c081205120102041e0310100e0e100c0b090e080b0417020e020b000910100e0e100c0b090e080b0417020e020b000910100e0e100c0b090e080b0417020e020b0009060a040306010c000804160315040904011e00480452030502040200020302031304080402060306030f040e0601020306030e0400020206031004050402060306030c0402020206030b1c081205120102041e0301, 0x11010130c0c0917030c030a02080202020c01091010130c0c0617030c030a0202020c01081010130c0c0617030c030a0202020c0108060b0803060118031a031010130c110c090917080c030d010a01080102010a1010130c110c090917080c030d010a01080102010a1010130c110c090917080c030d010a01080102010a060a040306010c00] private def node290:Certificate:=PackedParametricCertificateData.decode 11 data290 private def data337:List Nat:=[ 0x118031a031010130c100c130a0a09090709050a0302020d010a1010130c130a0a09090709050a0302020e010d010a1010130c130b130a090709060a03090302020d010a060a040306010c000804160301010a020902020201040406040108020702010c0002040e0407060606020e00080416041010130c130a110a17030a03080202020a01091010130c130a110a17030a03080202020a01091010130c130a110a17030a03080202020a0109060b0803060118031a031010130c100b130a0a0909050a0302020d0102010a1010130c100b130a0a0909050a0302020d0102010a1010130c100b130a0a0909050a0302020d0102010a060a040306010c000804160301110404020202030a020902020201040406040b0202020202031010130c130a110a0d0a110508050d01080103010a1010130c130a110a0d0a110508050d01080103010a1010130c130a110a0d0a110508050d01080103010a060a040306010c00080416030802030800060308031104050202060304031010130c100c130b0d0b0e080808090602020d010a1010130c130b0d0b0e08080809060e0202020d010a1010130c130b0d0b0e08080809060e0202020d010a060a040306010c0008041603080201080016031803050204020002030203010b020202020203010706060603080206040e04010b240814051604020424030702040401020006040604, 0x11010130c0c0914080e040c0302020c010a01091010130c14080c060e040c0302020c010a01091010130c110c14080e040c0302020c010a0109061010130c0a090e0408040a0302020a010800091010130c0a090e0408040a0302020a010800091010130c0a060e0408040a0302020a0108000906010c020b0201060018041a041010130c0a090e0408040a03080202020a01091010130c0a090e0408040a03080202020a01091010130c0a060e0408040a03080202020a0109060f020b0201080308031010130c130a0a09090709050a03040302020d010a1010130c130a0a09090709050a0302020e010d010a1010130c130b130a090709060a03090302020d010a0612040a0201060008040e030101090c0208010600040412041010130c0a09170817030a0302020a010800091010130c0a09170817030a0302020a010800091010130c17080a0617030a0302020a0108000906131003020206030c020b0201060018041a041010130c130a110a17030a03080202020a01091010130c130a110a17030a03080202020a01091010130c130a110a17030a03080202020a0109060b08030601] private def node337:Certificate:=PackedParametricCertificateData.decode 11 data337 private def node338:Certificate:=.split node290 node337 private def node339:Certificate:=.positive 3 [(3,0),(2,5),(2,11)] node338 private def node340:Certificate:=.positive 3 [(1,3),(8,8)] node339 private def node341:Certificate:=.split node250 node340 private def node342:Certificate:=.split node174 node341 private def node343:Certificate:=.positive 3 [(1,0),(2,5)] node342 private def data371:List Nat:=[ 0x1131313110d0d0b0b0a0a13090b0908080a0210010a131313110d0d0b0b0a0a13090b0908080a0210010a131313110d0d0b0b0a0a13090b0908080a0210010a060a040306010c00080416030b020902011200300436030502040200020302030a040904060401020406030e0200020202030e04080207020404040803131313110d0d0a0a13090a0808080a02080210010a131313110d0d0a0a13090a0808080a02080210010a131313110d0d0a0a13090a0808080a02080210010a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e040002020603010c0402020206030b0808120706010a0412030e0e130b110a110910090b09110411021002090e0e130b110a110910090b09110411021002090e0e130b110a110910090b0911041002110009060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e0400020206030d08070606060212041a030c04010200020308030b0808120706010a04120301] private def node371:Certificate:=PackedParametricCertificateData.decode 11 data371 private def data411:List Nat:=[ 0x10d040e030b03020210010a1313130b0a0a0a0709070d040e030b03020210010a0612040a0201060008040e0301010f040c0401020302040b0202020202040d020a020102030204010200040202041313130b0a0a0b0509050d0404040e03070202020a1313130b0a0a0b0509050d0404040e03070202020a1313130b0a0a0b0509050d0404040e03070202020a0612040a0201060008040e030c020b0205060006040803110404020202030f040c0401020302041313130b0a0a0b0508040e030b030702020204000a13131311130b0a0a0b0508040e030b03070202020a13131311130b0a0a0b0508040e030b03070202020a060a040306010c00080416030c020b0205060006040803110404020202030f040c040102030204011313130b0a0a0e0608040e0307020202030103000a1313130b0a0a0e0908040e0307020202030103000a1313130b0a0a0e0908040e0307020202030103000a060a040306010c00080416030c020b020306000c040e031104040202020313110e0e0a0a13080808060604041002070213000a13110e0e0a0a13080808060604041002070213000a13110e0e0a0a13080808060604041002070213000a060a040306010c00080416030b02090201120030043603050204020002030203010e020002020203010c0609060302030204010b100a1e080607200410030906070606080008040804, 0x1131313110b0b0b090e030a02090202020a010d000a131313110b0b0b090e030a02090202020a010d000a131313110b0b0b090e030a02090202020a010d000a06131313110b0b0d040e030a02090202020a0100000a131313110b0b0d040e030a02090202020a0100000a131313110b0b0d040e030a02090202020a0100000a060111020e020002030204131313110b0b0a090e060d040e0302020a0100000a131313110b0b0e090a090d040e0302020a0100000a131313110b0b0e090a090d040e0302020a0100000a0612040d020b0401120412031313130b0a0a0a0709070d040e030b03020210010a1313130b0a0a0a070907] private def node411:Certificate:=PackedParametricCertificateData.decode 11 data411 private def node412:Certificate:=.split node371 node411 private def node413:Certificate:=.positive 2 [(1,0),(1,1),(2,5)] node412 private def node414:Certificate:=.positive 3 [(1,0),(2,1),(2,4)] node413 private def node415:Certificate:=.positive 11 [(14,0),(9,2),(2,3)] node414 private def data447:List Nat:=[ 0x1130b0b0b0e0a0a0a130411040e020802030203010a130b0b0b0e0a0a0a130411040e020802030203010a130b0b0b0e0a0a0a130411040e020802030203010a060a040306010c00080416030b06030a020200120416031104040202020313130e0e0d0d130b0a0a130909090e0808080a020a13130e0e0d0d130b0a0a130909090e0808080a020a13130e0e0d0d130b0a0a130909090e0808080a020a060a040306010c00080416030b02090201120030043603050204020002030203010e0200020202030d02070604040106040a0313130e0e0d0d130b0e0a0a0a13090e0808080a020a13130e0e0d0d130b0e0a0a0a13090e0808080a020a13130e0e0d0d130b0e0a0a0a13090e0808080a020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e040002020603010c0402020206030b1c081205120102041e0313130e0e0d0d0e0a0b090b0410020e0211000913130e0e0d0d0e0a0b090b0410020e0211000913130e0e0d0d0e0a0b090b0410020e02110009060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030f040e0601020306030e0400020206030d040606050602120416030c04010200020308030b1c081205120102041e0301] private def node447:Certificate:=PackedParametricCertificateData.decode 11 data447 private def data487:List Nat:=[ 0x10e0d0d130b0a0a0e08090704040e0202020a0612040a0201060008040e0301010f040a0c0204010e0412040b0202020202040d020806011200020414040c0607120214000e04220413130e0e130b0a0a0e08090504040303070202020a13130e0e130b0a0a0e08090504040303070202020a13130e0e130b0a0a0e08090504040303070202020a0612040a0201060008040e0311020b06050c0006040a03110404020202030f040a0c0204010e04120413130e0e130b0a0a0e08090503030702020204000a13130e0e130b0a0a0e08090503030702020204000a13130e0e130b0a0a0e08090503030702020204000a060a040306010c00080416030b06050a02020008040c03110404020202030f040a0c0204010e041204010e0e0c0c0d0a0a0a130411040b040e02080203020a0e0e0c0c0d0a0a0a130411040b040e02080203020a0e0e0c0c0d0a0a0a130411040b040e02080203020a060a040306010c00080416030b06030a020200120416031104040202020313130e0e0d0d130b0a0a0e0808080404030302020a13130e0e0d0d130b0a0a0e0808080404030302020a13130e0e0d0d130b0a0a0e0808080404030302020a060a040306010c00080416030b02090201120030043603050204020002030203010e020002020203010c060712030e0206041404010b300a02081a05200430030712060404060016041604, 0x113130e0e0d0d130b0b0b0a0a130908080a0202020a13130e0e0d0d130b0b0b0a0a130908080a0202020a13130e0e0d0d130b0b0b0a0a130908080a0202020a0613130e0e0d0d130b0b0b0a0a130908080a0202020a13130e0e0d0d130b0b0b0a0a130908080a0202020a13130e0e0d0d130b0b0b0a0a130908080a0202020a060111020c060106001e04200413130e0e0d0d130b0a0a08080e0202020b010a010a13130e0e0d0d130b0a0a08080e0202020b010a010a13130e0e0d0d130b0a0a08080e0202020b010a010a0612040c020b02010c040c0313130e0e0d0d130b0a0a0e08090704040e0202020a13130e0e0d0d130b0a0a0e08090704040e0202020a13130e] private def node487:Certificate:=PackedParametricCertificateData.decode 11 data487 private def node488:Certificate:=.split node447 node487 private def node489:Certificate:=.positive 2 [(1,0),(1,1),(2,5)] node488 private def node490:Certificate:=.positive 2 [(2,0),(1,4),(1,6)] node489 private def data530:List Nat:=[ 0x10c000804160301110404020202030a020902020201040406040a060502020203100e130c110c100808050c030e010d01080103010a100e130c110c100808050c030e010d01080103010a100e130c110c100808050c030e010d01080103010a060a040306010c00080416030e020a06031800100418031104050202060304031010100e130b0d0b0e08080809060e020d010a010a1010100e130b0d0b0d090e080808090610020a010a1010100e130b0d0b0d090e080808090610020a010a060a040306010c00080416030e020906012a0064047203050204020002030203010e020002020203011010100e130b0d0b09090e0808080e020d010a010a1010100e130b0d0b0e080808060610020e020a010a1010100e130b0d0b0e080808060610020e020a010a060a040306010c00080416030e020906012a00640472030502040200020302030c02080602080308030f040e0601020306030e040002020603010c0402020206030b1c081205120102041e03100e0e0e100a0b090b0410020e0211010b0009100e0e0e100a0b090b04110210020e020b0009100e0e0e100a0b090b04110210020e020b0009060a040306010c00080416030e020906012a00640472030502040200020302030c02080602080308030f040e0601020306030e0400020206030902050602080308030c0402020206030b1c081205120102041e0301, 0x1100e100d130c110c10030c030d020a02020209100e100d130c110c10030c030a02020208100e100d130c110c10030c030a02020208060b0803060118031a03100e100d130c110c09090c0302020d010a0108010a100e100d130c110c090910080c0302020a0108010a100e100d130c110c090910080c0302020a0108010a060a04030601] private def node530:Certificate:=PackedParametricCertificateData.decode 11 data530 private def data570:List Nat:=[ 0x1040e030101090c0208010600040412040b02020202020408020702010c0002040e0407060606020e0008041604100e130c110c130a0a030e02080202020a0109100e130c110c130a0a030e02080202020a0109100e130c110c130a0a030e02080202020a0109060e0201020202031010130c130b130a0a0909050a0302020d0102010a1010130c130b130a0a0909050a0302020d0102010a1010130c130b130a0a0909050a0302020d0102010a0612040a0201060008040e030111040402020203090c020801060004041204100e130c110c0c030a030e02080202020a0109100e130c110c130a0a030e02080202020a0109100e130c110c130a0a030e02080202020a0109060b0803060118031a031010130c130b130a0a0909050a0302020d0102010a1010130c130b130a0a0909050a0302020d0102010a1010130c130b130a0a0909050a0302020d0102010a060a040306010c000804160301110404020202030a02090202020104040604011010100e130c110a08050a030e010d01080103010a100e130c130a110a08050a030e010d01080103010a100e130c130a110a08050a030e010d01080103010a060a040306010c00080416030e020a06031800100418031104050202060304030c02090606040304040e020002020203010706060603080206040e04010b240814051604020424030712060404060016041604, 0x1100e100d130c110c140810030c0302020a0109100e100d130c110c14080c060c0302020a0109100e100d130c110c14080c0302020c010a010906100e130c110c130a0c030a0302020a01080009100e130c110c130a0c030a0302020a01080009100e130c110c130a0c030a0302020a0108000906010c020b0201060018041a04100e130c110c130a0a030e02080202020a0109100e130c110c130a0a030e02080202020a0109100e130c110c130a0a030e02080202020a0109060e0201020202031010100e130c130a0a09090709050a0302020d010a1010130c130a0a09090709050a0302020e010d010a1010130c130b130a090709060a03090302020d010a0612040a0201060008] private def node570:Certificate:=PackedParametricCertificateData.decode 11 data570 private def node571:Certificate:=.split node530 node570 private def node572:Certificate:=.positive 12 [(13,0),(3,4),(8,5)] node571 private def node573:Certificate:=.positive 1 [(1,2),(2,8)] node572 private def node574:Certificate:=.split node490 node573 private def node575:Certificate:=.split node415 node574 private def data622:List Nat:=[ 0x1060a040306010c000804160301110404020202030a0209020202010404060401100d130c0d0c100a08050c030e010d01080103010a100d130c0d0c100a08050c030e010d01080103010a100d130c0d0c100a08050c030e010d01080103010a060a040306010c00080416030e020a0603180010041803110405020206030403100e100d130b0d0b0e08080809060e020d010a010a100e100d130b0d0b100a0e08080809060e020a010a100e100d130b0d0b100a0e08080809060e020a010a060a040306010c00080416030e020906012a0064047203050204020002030203010e02000202020301100e100d130b0d0b11090e0808080e020d010a010a100e100d130b0d0b100a11090e0808080e020a010a100e100d130b0d0b100a11090e0808080e020a010a060a040306010c00080416030e020906012a00640472030502040200020302030c02080602080308030f040e0601020306030e040002020603010c0402020206030b1c081205120102041e03100d100a0b0a0b090e0810040b0411020e0209100d100a0b0a0b090e0810040b0411020e0209100d100a0b0a0b090e0810040b0411020e0209060a040306010c00080416030e020906012a00640472030502040200020302030c02080602080308030f040e0601020306030e0400020206030902050602080308030c0402020206030b1c081205120102041e0301, 0x1130c0d0c0d040c0304030a02020204010d0009100d130c0d0c0c0304030d020a020202040109100d130c0d0c0c0304030a02020204010d0009060b0809060106030803130c0d0c110b09090d040c0302020e010d010a010a130c0d0c110b09090d040c0302020e010d010a010a130c0d0c110b09090d040c0302020e010d010a010a0612040a0201060008040e030111040402020203090c020801060004041204100d130c0d0c10030c030d020a020202040009100d130c0d0c10030c030a020202040008100d130c0d0c10030c030a020202040008060b0803060118031a03100d130c0d0c090910080c0302020d010a0108010a100d130c0d0c110b09090c0302020d010a0108010a100d130c0d0c110b09090c0302020d010a0108010a] private def node622:Certificate:=PackedParametricCertificateData.decode 11 data622 private def data647:List Nat:=[ 0x1100d130c0d0c140810030c0302020a01000009100d130c0d0c140810030c0302020a01000009100d130c0d0c140810030c0302020a01000009060e0201020202040c020b0201060018041a04130c130a0d0a0d040c030a0308020a01000009130c130a0d0a0d040c030a0308020a01000009130c130a0d0a0d040c030a0308020a0100000906130c130a0d0a0d040a0302020a010800000009130c130a0d0a0d040a0302020a010800000009130c130a0d0a0d040a0302020a010800000009060111020d06050603020401090c0208010600040412040b02020202020408020702010c0002040e0407060606020e0008041604130c130a0d0a0d040a0302020a010800000009130c130a0d0a0d040a0302020a010800000009130c130a0d0a0d040a0302020a010800000009060b0206060202030d0b130a090513040a0310020e010d0102010f000a0d0b130a090513040a0310020e010d0102010f000a0d0b130a090513040a0310020e010d0102010f000a0612040a0201060008040e030111040402020203090c0208010600040412040a0605020202040d02090604020302040706060603080206040e04010b240814051604020424030712060404060016041604] private def node647:Certificate:=PackedParametricCertificateData.decode 11 data647 private def node648:Certificate:=.split node622 node647 private def node649:Certificate:=.positive 12 [(13,0),(3,4),(8,5)] node648 private def data697:List Nat:=[ 0x101080102010a060a040306010c000804160301110404020202030a0209020202010404060401150d100d130b0d05080510040e010d01080103010a150d100d130b0d05080510040e010d01080103010a150d100d130b0d05080510040e010d01080103010a060a040306010c00080416030e020906032a0010041e03110405020206030403100e100d130b0d0b0e08080809060d010c010a010a100e100d130b0d0b0d090e08080809060c010a010a100e100d130b0d0b0d090e08080809060c010a010a060a040306010c00080416030e020906012a0064047203050204020002030203010e02000202020301100e100d130b0d0b08080e020c020a020d010a010a100e100d130b0d0b100a08080e020c020a020a010a100e100d130b0d0b100a08080e020c020a020a010a060a040306010c00080416030e020906012a0064047203050204020002030203050202040202030f040e0601020306030e040002020603010c0402020206030b1c081205120102041e03100d100a0b0a0b090e0810040b0411020e0209100d100a0b0a0b090e0810040b0411020e0209100d100a0b0a0b090e0810040b0411020e0209060a040306010c00080416030e020906012a0064047203050204020002030203110402020202030f040e0601020306030e0400020206030e0402020202030c0402020206030b1c081205120102041e0301, 0x11513150d100a1304150313020a0202020000091513150d100a15030a020202061513150d100a15030a0202020606150d100a130415030a02020210000e00020009150d100a15030a020202020006150d100a15030a0202020200060601150d130b0b0b0b090e040d040e010a01080102010a150d130b0b0b0b090e040d040e010a01080102010a150d130b0b0b0b090e040d040e010a01080102010a0612040a0201060008040e030111100702020603090c020801060004041204150d100d100a10040b0415030a020202000009150d100a100415030a020202000007150d100a100415030a02020200000706141003060110031203100e150d100d130b0b0b100a0d010a01080102010a100e150d100d0b0b100a0b0910080a01080102010a100e150d100d0b0b100a0b0910080a] private def node697:Certificate:=PackedParametricCertificateData.decode 11 data697 private def data720:List Nat:=[ 0x11310130a0d0a14080a0304020a010200000009130a0d0a14080a0304020a01020007130a0d0a14080a0304020a01020007060b0803060118031a040b020a02010c00240428041310130a0d0a0a030d02080202020a01000009130a0d0a0a031302080202020a0107130a0d0a0a031302080202020a0107060b02060602020411020a060516010204080401090c0208010600040412040b02020202020407020602010c000404100407060606020e00080416041310130a0d0a0a030d02080202020a01000009130a0d0a0a031302080202020a0107130a0d0a0a031302080202020a010706130a0d0a0d040a0304030a0104010800000009130a0d0a0d040a0304030a0104010800000009130a0d0a0d040a0304030a0104010800000009060111020a06080603020411040402020203090c0208010600040412040b0607060508030804070206020404030404060605060304020c041004010b240814051604020424030712060404060016041604] private def node720:Certificate:=PackedParametricCertificateData.decode 11 data720 private def node721:Certificate:=.split node697 node720 private def node722:Certificate:=.positive 8 [(5,5),(1,7),(24,9)] node721 private def node723:Certificate:=.split node649 node722 private def node724:Certificate:=.negative 2 [(1,0),(3,1),(2,5)] node723 private def node725:Certificate:=.negative 2 [(6,0),(1,2),(1,4)] node724 private def node726:Certificate:=.split node575 node725 private def node727:Certificate:=.split node343 node726 private def node728:Certificate:=.positive 3 [(1,1),(8,4)] node727 private def node729:Certificate:=.positive 3 [(1,0),(2,3)] node728 private def data750:List Nat:=[ 0x1131311110d0d0a0a10090a080808110413030a020a131311110d0d0a0a10090a080808110413030a020a131311110d0d0a0a10090a080808110413030a020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030c06090603020302030c0402020206030b100a120836012004300313131010130a110a0b0a13091109130211020913131010130a110a0b0a13091109130211020913131010130a110a0b0a130911091302110209060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030d08070606060212041a030c04010200020308030b100a120836012004300301] private def node750:Certificate:=PackedParametricCertificateData.decode 11 data750 private def data760:List Nat:=[ 0x1c48f8395c0f8a2a894b9e8b0ce0a0901021ac584f7bbd0da9aa2d294aadb88dfbfc18ff4eafc8013080102019edeecaa8dafaeb0fd93d1bed490f7b28ed1e4a8e1d61108010209fab4eed1f2b1f6bc9a82a58ff0cd9c90a4abf8fdfb920808010212f9f98a8dcd81d1cfbf8ff3b2e8ffdbeb92ee98bf80130201022dd9a3e6b1948bd7f7ddd9f686fd93b5f0a4c48c8be01313000204bec1dfc2ceb8a2d3aac6d8f391d395bab4dd83a3a9e0100a0002069bc8d2c082a3a4c1bcbffcf1a9e2b3a0b2ddf399e01309000208f8b2e3e8b7a2b4b5a481bac8cdd4ede9fef3b3b7b0ba1109000216b0eb858dd3c89dd6b9da9fdaddb883a4f8e8a6b091ae0a09000215b9b2d4df8abba1e7ebc8b8fab2d9a4a0aec2c4f1a013080002018cf0b6f2aba6cad6d488bcf79bb5d0f7aea295ebdfd61108000208a097f09995f1a283d79d93d38ee1f5e4ff85dae7c7c20808000217ef988babdac8faf089998cc38ee9bb97c2e7e3e3c0130200022ef2e1ced3a792c9969e979884a68eb1e7fec9dfa0b8110200026faaf6e990baafd3f0c692a68981b3f893a9a8bac81e13c8f4da93bf96c3a5e69efca0a9d4f0000a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030d08070606060212041a030c04010200020308030a0608120008030803, 0x1038b900fdfb901a8f73b9410d4bc4c8ba702d8ba018bff000391e5d9e990d1c7e290c8c39c8bcb9ed4800bf1fa019dd69602cadb019cdc1cd0d64ed3cb10d109ae0001ba89acc197f8cffaf4a3c2a5a792b2b1a00686c404abb031bd9e1af0b303cf9544ed30cdca168a8f0003abedffc0b3c2b5a4d0fea7dfc0fceec013130202048bcde3d7b2bce7e5f8e7cce390e39693b4cc8cbd8080130d020230d2ffd3cd89a397db85d8bacafad6b48ad4dc88af800a0a02020493a1f1d9c0848b91a998efbaf7c2e4f0b2e1a5baa0130902020b86fd9dd3aba3edeebeeacd9d8a9ccbe3828c90c7c1ae1109020217e8eebffcddbeb9ccabc4a6c2cffbb5b8e4ded8cf99aa0a09020210dbfaecc08ba5a484ecfa938f8a88deef94908dc68012080202019cb6ee9899ac86b7bff3a2b2edd0a180c8c9cb99c3b81108020206c5f5fdf6bd8fabdcd1edc3d0a3de8780a6c5cb8fbbe81313010204aca6a1e3a380ddcfb08fc2d885b0aa9bd0b4c59bd8800a0a0102069595e7ee81e4d297e4a8e197ba9287aa93bde7e9e01309010208f2bffeb7fdd9f9cde7b19aadbf8e9ba2eaf7abe5adca1109010214eff1eee088f9c2b5c3] private def node760:Certificate:=PackedParametricCertificateData.decode 10 data760 private def data811:List Nat:=[ 0x18b8089abac9492aa97a786a8dcc4be8fb2b5dfffbeba8db4df96a8fe8a9ac00606010202a2b3a5e299d4ee859dd280c3d49aa0e9e7d1d4e0b0899bc49acdefddd4f8f6d984ace99296da1313000208dcff8aa684c3a7eda2e3818b89cf9cfecedc8af996b69485e98bfacdce98f5c7c5a6d6d883b01212000270b6918ddef597edc4aca3d5a9e897d9d789d8f88382c2cf8fac88e9dff5aecde7c1a0a18e95b81210000215e7b2ec90bc94e396e5b8d1cdaf86b6bccb8196c0af9a8ef8b98186fcb3aeedc591ddd0c191f0120900026ae2b0f8fad1aadcc4acb5f7bc9a9bc5e1aa91b2ecb0a0fd9fcde2b3c7c4b48eb397dbaf9ab2e80909000214e3ba9082f9fe8c9bfbd0c7ace2beace3c0da93bbed90ead1a1b1baf9f589e4829be9a4e0f1fc1008000202f9debcc4babbcafee999e1e9fdb389acd9d6edd5a2e4e1edac83ffe3b1f0ba99d39a839598b01306000201a1e3b89188c1e1b484dbb4e4e084b884a3bd9c91f4848c86c9d7a5b9f590f1e59984bab2bbaad806060002028fc2c7ce9acc93c7c3dfa5ed8ee4afdfccdd87eabc84e096d086d7d88bcafe86a3e8a7d6b6e41e27f6f28dcac2dcd794d7d4cdd7b5e792e0eadad39ea8d89093a6f9ec83bbfdf9d8000a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030101, 0x1ada38d8dd3cac5ac92d4a4f1baf2b7bf92dc81ddfec4f884aca80a0a020236b384c3ffebbbd5e18281b29cab97fff3c9c8b2f0e18a93d3849bc4e4a6a6cbf696fc81f5c80909020208fa9ae8d6cccceaa68dcec394e1d6b1f5b3b8b7a5a9b4fbe89e8dc7bb8ea4abe68bbfb5faa8da1208020269b1cc9ac0819be38886a5e1d6e5ba82fedb96efc2db82c18fe8ddc0cc8482f7ba80bdf2b0c0cc080802021db88bd1feffc98caef9cca4cdc7d6e8a29bc29bcb80aed7acbca1b5fdcbc7d8e7efcfa6eeaa130602025becf5c1c488b6f5c2dbfbd5dbc0ac9cb29f908cf395d382dee9edbfaed3b1bb989ae9eac1cc9c0606020201d3feb8e2f6eaa9fcc99ebaa4ad8faae08ee280fcfec494fbb4968f889d8598fdb7eec883c2fc12120102029d868ac197e6e4e9bfecd68adfc4a6ef93dfc4dede94f99e95a89cc6fdec8ef49397f0dfa9ffcc12110102018ddad1a28ca891f6a3e6ea84f7d0f3dbefdba1c6a483f7e3cd84e49dfed7fdc192938681efff94131001020db6d1c9b3c1fedf9095c2a3acaeb9e3aa8df4a996fb81b9c9e093a0d7889affc787f8b3dc92f00909010204b1c9b2f5d8988c95d5b2c8ed8e919ceab98efce1cee5d3d1dd9d81f8ca8c8cc4ebf2c5c9a8ee1008010203adc4be8dcdb8dff8cac9c7b9aabdfbf8dc94c6fce287edafcbb49f90bce9ede5e5da979cb0d81306010201a5f3c1b5b58bf5bd, 0x1d3a584969ba89789d3bbd4daaaeca41e01a2f0bcfaedc1e2a19eaab8000a040306010c00080416030b020902011200300436030502040200020302030f040c0401020302030b0202020202030d020a0201020302035e96cb4ae8f6129dc00a8a9b0102869398c9afb4b385c58b93baa783af92b989d7bab2cefae3e7d8adb2abcdc5cdebae0bdcce2e84ee64c6fd32aa8e0111b0cafae988f6e6faa59fa4c1b8e681b0ebc38998a4bfa0c0f0bedd96d5d8ed85b04ce2bc54dcda2580d815b9b3010cf99990c583e28cf7fafb9eba99f5bbebcbac89b7c19ad0c9a1f4b7feb5f1d3f1a206a2d702b4d605a6d402f4bd2eced83cce9325cbe612a9cf000c85ebe5e698b3a1d1929a9488c8efac96b9b5ddf7c8a0e9e4cbe386eccabddaeff7b00b90c40ebaa906bc9003b7f52ed49e05a2cb3eee931ffcc00006c5d5b9f588edc393b29d84e0a48abdb6a39cb3d7ffd6daba80f5c2dbcfd2ccc5cca80184afe96987821aeff20eaaa745b3d032fce514d7af0aeda0000183ef8fe281a1d9e6edaca5e2f4bcbd95af80b1f695beddcfa1b3b9ade88ea0e8eff8121202020397eec988ece797f691f5cf83f39ee6c18985c9ff9987dbafbcb0c2c89bec83f98eaaecdcae85f01310020204add1d88df1ffc7f78ce2c494f5c5fdabb3b9928c98d4f9b29cc3ec958e84cec3d8ebe8b4a7f0130a0202189497c8d4d3fefddffcdaa5b6, 0x1b9d8aed00707020209d8a2e39ef2d5b0f4e187e3f4b88086bbd01006020213b5e2e9d7a1a398c79bb9edc6f78183a8800a0602020bbef0ab94caf4f0e49eddaab79fddd6d6a00606020209ce81e59fb4c2c7eaba849a919cfdf9d790131301020bf5aba4b9cce1e0b684d081b7acd480eb9c1010010212fcead7db91f0ac86a499a3f6cce1e6e39c100a010208e0838d81a09783c2c7ecfbeca5c0b2bd9010090102088ebad2cba0b4dddc8a8fa2dbb5c2ced4cc0707010209b593f39befafc9e98be59099ebea9dc1b4100601021684f8ed8ef8aac9d9b999b883f9d6ea95f40a0601020afdd5befedeb3e296e3c391cbe5d385a3d8090601020a9cc7b7f6a5af98eaafb3e480cde382ec060601020aa796cd848ddda0a1cfc3b0b6bca389bbd0070201021ee79fc5838e8bf19d86bba4f5fcd6dbf0101000021ee8dbccf2e0d6d9c7cce38c8eb583918e88100a00021e8ef6b9efd8a3d894a0cab0edb3f0bc800a0a00020198cfd2db86a0dafaf3b1eca4a6e4f3e9a21009000208f584bffde9be85b6c69df7ff98eccfefc00707000208c2d0b79fd29aa78f8abaebd0a7bca4a38a100600021d9c80b6d99decece397bdfa84bf8cd3c0f00a06000208d3b0cccda298efbea1b68f9ba9d5cfeba0060600020be6888488ade5f183e78f95e3e0dfcba4e01302000218f5fea1b5f38fd6bab5bba4bee4f5b8f0070200022d91, 0x1caa4c00907010201a9dfccf7c8a2cc85aee5dca5c099f79587f0080401022293ca95dbe6cbfdc7d8c6f0c2cb8a87b4e0130301021694b7fd9789a0d4f6fcb0e9ccf4a984e4b0030301021e8cfca5bf81e5f2bbb7d8cd83ffa08ad5f01313000201f3f593e881abd8c88797f5e8f6829af080801009000201baad9a9ccccea491fcedd0e395d5bcd5f3f00808000201ccdec2a3bbd8d6bfbdb8e9beb3f8fe94d4c00b07000223b1aec8e78e83a3a089d294cdaee2e2bfc00a07000201ccfc8ffa8dd5b9b2fca3a8d4aef0c79db3c00907000201a9b7f1ebc28df7d8d182fc8dffb096e0d8f008040002218896e8f7eedef4fe90e7eb97d1c1c9fee01303000216b1b3eca5c08dcd85cfa0e1f491a0cb83b0030300021e91f9a3ad9798a7e7dd95f0c8c8daf3c4d01e09d89e98f58cf1dac99b83a0000a040306010c00080416030b020902011200300436030504020600020304030f040c04010203020301010102000402020405e8068133c91fa81bfad63bc2b933b09c16c7b30031e1c1ecc1af98968cdad3c8f80290b101d2b52fd45bfe2ca99c25b7c333b9cd2698800004a3db9898f9c4a4c5cdb38b98131302020afd9bdbddedfd9bdc8bcfe487fdcdd8eab01010020214c3808792c2d5c3f4c6e69fe091ea97d7e0100a0202068df29effd5d49390adb2a194bba3ccdac0100902020ac6fafbf6e58aadbface6e697c2, 0x1dcfcb5dae7e496c48fcdb2dfe3dcedb59a801303000242fb9694a2f3aebd87e384e6dae79afec0800303000202b58c9effdbafa383febc8c91f9ceebb7c2801e52ab9284c587e9d59e87cc80000f040a02010a0004040e030b020902011200300436030504020600020304030f040c04010203020331d2d4698bcf25a8a40485017ac0cfdcedf0eea1e882908001caf91cb43c96229d2fdcfa3fb2d11fcaa20f83f700018bb589fadfcafeeeeebca489801313020201fcc3f5e3c29bca92f69ba1909ce2dec585800a0a020201abe6f3e6ebb6eb8afd8285a982dfa6ece01009020201b5e794cacee1929deee198f28ef49a9991d808080202019f98fcdbe08ccde9c5c7f7e9dfb4e3fbfaca0b0702022cf787e887fa8fc9a682e19b8ef381a2b7e00a07020202e3f6efa5ceb396eedffce3f8d99ca092e198060602022ad0a1b2fce5e182d2d5b48bc7e2f9def0b6080402022be78cae879b8ee3b483efa1dcbe96f3a290130302020ba2d2eac7a5ec80b69e88f3ababcedace98030302021ed0f88dc1e7e9def9f2aab2b3dddcfd9c981313010201f5f9b99cc4cfa3e9c19b888da0e08287e9801009010201bab4e9edfeb5dedec6cae399f3a3fbb28df00808010201cbf3f49bccba8b9bd4d4cce49cdf98ffc1a00b07010224929dbbc8f8ab8e89d6a69fe1aeb7c38fc00a07010201cbacbdf7a3d0fcdd95e3c592ff9b92, 0x18ad5c8100902020c95b09990f69bd3c190d2fca0a992afc7d5aa080802020dc5ef95c9d3d9ab9494e3f9dfbc96b28dd0800a07020208ae8486debadaa0f0d3baf0fda9bb87d7e9e4090702020eecf6f3f39ffdc6a6a780cbb492f3cee1d9e40d04020204cfc387fbeab8e88989dc81dcf2bed5acdffe0303020202c68ad1a781d0e0fcf8b88b83978b888fa4b80202020206b9e08dc1bfe5cababd89eafd83b0aec480131301020fb1b4fab3fd95bb8b8fe5e2d48ca89ef8ec8011100102079dd8ed82acd4c4e491ded294e2f2fdded0c0100901020b87e4b3fe9efce2d3c0f8e3df8785b99ad9c0080801020dc4d7f8d1a4f7c9bcc49687a8d5b5b58da0800a0701020b94f5c2f4a99db9b1cecb98868db0b0a98f80090701020def84cf89bed5afa8e6f2b2f6e5f397989e800d04010202eaadb9c680f6c9aac594c4a6d6d6eaded3c01303010239ff97e3fbf78098a9ecd4d597fcf39dbf800303010202b8d0ecade0ebeba8a4c1b2cccdfcbaaef780131300020fae8fdbb38198a08f9ff1ffbc8fa0a988e0801110000207be99fadcbb978ac9ebe2b2cceff7a4ddf680100900020af286ebdb8499b5bdb08bdedc9199f79f9e80080800020dcbbffaa5f1f58dac88e9beb3fe81f08cfc800a0700020b9bacc4f6aaf3dcbe86ef8489b28cd7df8c80090700020df3b0cfc2f1e2deb5b5d9fa97cbb2f5c6a4800d04000202, 0x11313100b0a0a0a0709070d0404040e030b0302020a1313100b0a0a0a0709070d0404040e030b0302020a1313100b0a0a0a0709070d0404040e030b0302020a060f040a02010a0004040e0311020e020002030203011313111111100d0d100b100903030202090101010a1313111111100d0d100b100903030202090101010a1313111111100d0d100b100903030202090101010a061313111111100d0d100b100903030202090101010a1313111111100d0d100b100903030202090101010a1313111111100d0d100b100903030202090101010a06011313111111100d0d1009080813030303090202020a1313111111100d0d1009080813030303090202020a1313111111100d0d1009080813030303090202020a0610080f0c0706002a042c0301131310090808070709050d0404041303030302020a1313100908080a0509050d0404041303030302020a131310090808070709050d0404041303030302020a060f040a02010a0004040e030b0209020112003004360301010e02000202020429f8ca6adafd29efee0197a30112a19bb1bef0dcb5ae958aa08006cd0188e231992e852182b842a49529abb812b5810008bc83abb7d6b29b81e9c0b1ce80131302020eedde8ce9ba99d9bbd5e8adb1d8b8e39cdc88111002020580f682f0b2fbe9f7a8d9f5a4d7a693fafca2100b020269c6afafe4ba99c0c3b19ce29b87f5, 0x1131311100b0909090d0410030e0302020a010d000a131311100b090d0410030e0302020e010a010d000a131311100b090d0410030e0302020e010a010d000a06131311100b090d0410030e0302020e010a0108000a131311100b090d0410030e0302020e010a0108000a131311100b090d0410030e0302020e010a0108000a060113131110110b090904040e030b030a02020208000a13131110110b090904040e030b030a02020208000a13131110110b090904040e030b030a02020208000a0610080f0c0706002a042c0301] private def node811:Certificate:=PackedParametricCertificateData.decode 9 data811 private def data861:List Nat:=[ 0x1020201b69491d48dfeb2eca0dcef8efdcfd4cd8fe2fda0e00706020251a0f4a9bebdebe4b4dff5939f8080c4b980c9c01313010209eec390f9cdebeda1fdb6e89fda8cadabd0a981d6f21209010210fcfeacf68ec9939194979fffdffb98c7b5a7fc94b81109010202a59aa5cc84d884b597d4cfeb9ef5cab08d8da8cee813080102119d93a099848ad5dfbde5ab9a94fbd68ef4aafed8e41108010220c1dca8b1f1c488d69aaeccf4e7b7cfb181f8bca7c6070701020acc91daa3f1cb9caaaccee3bf93b2958ba8a49c921306010202b1ecd5e5e6c4acffe6edb5f7ffe8f3f389a59eb4de070601025bb7c5abadecf097a187beeefdc1bc9c8ba5e01313000209edcab1d1b4a6cec7ebbc92a8fbe9d9c8878bdd90a012090002109aadce9ea4c9c096c3a291f9bafe91b89f8ed689d81109000202cb8c93c5cbd7b3f6c5afc891fe83c3b99f82e986e813080002118abedcffc6a3b8f68df0b7a9bee1b595c5a2acf5861108000220b4c5ccf1d195dffdeaa0c1be9ecfd8bfbbbb8cddf2070700020b9daaf6b1d2ac86c0a3dec7d4fefde1eae5a8faa01306000202abeecbaf98a6be99bcb5e7c2d4bca4f0aef9fda6a01b3387ebe5c0d6e9e9aaefaff991a5b0000a040306010c00080416030b0209020112003004360311040402020203090c0208010600040412030b0202020202030e0400020206030102000402020301, 0x1130d130809080a0608061303080203020a060a040306010c00080416030b02090201120030043603010a0209020402010a040803010113131110110e130d130811080404110202000913131110110e130d1108130211020713131110110e130d1308110811020706100803060018031a031204030202020313131110130d110a1308110811070907080206020a13131110130d110a1308110811070713131110130d110a13081108110707060a040306010c00080416030b0209020112003004360301090c0208010600040412030d0601020202030e0400020206030131fb9622fd8e02b08202b08101028dbe8acafe95ef9ebbcea6fabee4a99c02cea3299e3c9c3cbd31b5d247e49301fff501fff60002ffe6b6edf788b79c96e0b8c2ee9ecbe01d95a010ebb0019fd001a08154ddd937d8db03c2a503c2a60075e8ccf0f5ac88abe3a9e999a7808dc0131302020b80e79e87bd99a38b97d3bdf480c39fd8b5a6ccf2a0120902020deb8485cf83f8c3aab2c3df92df9a81e3a4ba9dbec81109020203cdf481afc1c8f89fdbaea2d9d8c0f0ec9e9ca4e9b81308020210c1d09aa1b2fac1a6e7e7c4d5d8d3ecbaeb9c86a7a2110802021ff39d909788e08babf3a4c8bafbc38998bd82cbcf86090802021adfeb8d96c0d38d8d94e68aba9ae193d6e486e00707020206d6ac9af3a8bed1b3aad58ea5cdf4c49edff385a01306, 0x1110e130d110c060201010d0003000913131110110e130d110c060201010d0003000913131110110e130d110b060201010d00030009060113131110110e130d0a0613031102060203010913131110110e130d0a0613031102060203010913131110110e130d0a0613031102060203010906110200020202030113131110090809070a0609050d041303080203020a131311100a0909080a0609050d041303080203020a13131110090809070a0609050d041303080203020a060f040a02010a0004040e030b0209020112003004360301100404020202030e02000202020413131110110e11080d0404041102060208000913131110110e11080d0404041102060208000913131110110e11080d04040411020602080009061102000202020312040302020203131311100a091108090810060a060d04080203020a131311101108090810060a0608060d04080203020a131311101108090810060a0608060d04080203020a060f040a02010a0004040e030b02090201120030043603010a0209020402010a0408031110110e130d11080e060404110206020800091110110e130d11080e060404110206020800091110110e130d11080e0604041102060208000906100803060018031a031204030202020313131110130d130809080a0608061303080203020a13131110130d130809080a0608061303080203020a13131110, 0x113131110140e110e130d110c1102060201010913131110140e110e130d110a1102060201010913131110140e110e130d110b110206020101090613131110] private def node861:Certificate:=PackedParametricCertificateData.decode 9 data861 private def node862:Certificate:=.split node811 node861 private def node863:Certificate:=.split node760 node862 private def node864:Certificate:=.split node750 node863 private def node865:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node864 private def node866:Certificate:=.positive 3 [(1,0),(2,1),(2,4)] node865 private def node867:Certificate:=.positive 4 [(4,0),(1,3),(3,5)] node866 private def node868:Certificate:=.positive 1 [(1,0),(2,1),(2,4)] node867 private def node869:Certificate:=.positive 3 [(1,0),(2,5)] node868 private def data897:List Nat:=[ 0x1131311110e0e0d0d0a0a0a080808110409040a020a131311110d0d0a0808081104090413030d030a020a131311110d0d0a0808081104090413030d030a020a060a040306010c00080416030b020902011200300436030502040200020302030a040904060401020406030d04090205020302030e04080207020404040803131311110d0d0a0a0a0808081306110409040a020a131311110d0d0a0a0a0808081306110409040a020a131311110d0d0a0a0a0808081306110409040a020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030d0601020202030e040002020603010c0402020206030b0808120706010a04120310100e0e110a100a11090b091104110210020910100e0e110a110910090b091104110210020910100e0e110a100a11090b0911041002110009060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030d1c09020606040c040c030e0400020206030d08070606060212041a030c04010200020308030b0808120706010a04120301] private def node897:Certificate:=PackedParametricCertificateData.decode 11 data897 private def data931:List Nat:=[ 0x1a3da85f8080801020584b5ea9a97d189f2f4ebc097ffcfcfa1cdc8b3ebec841306010207d7cf999ebcacfc9dc382ac9ee3ee9effafde8388a4d010060102208ed9f6dde4dc81fbd5f0af9daeade7a4b7f4d2df8d900606010201cc9dc58dade1dab8f0cde5e0d8f5f8fedbb4c2dbb6dc040401020498eda7ed95c1ca99a7e3a2b3a5b687b98b9de393d4f8060201020188b0e78e9e919cc9968d99d7b2f3ecb2f5d78bc3b7d01010000206e598d8c1c381c0feee80ef9fdcfdfdc8c0cbf7e9c9800a0a00020194c3e3c2dece8ef89aa596bd93a6fdbf879ec8fde8f00909000201a195bbd9a0c0fbf2aabadfd3e0f3b4d6ea83adbddf880808000202d19097a4bea0d884b8b996aae4a5d39dc7adc5d783841306000206d1e3ccb2b2a6a9f9e383f8b8d5a3cf9ac7d8e1eaaca0100600021f93faf8c4d8dde4f5f0d5b3fbddf5d1efb280e5a4f9e00606000201b599e2f981dce4968eedeb8a9791a898acbad3e4cea411040002049182ffeef1bcd7dad799d6b882c5a6f1eca3cfa1e5a00404000202f58896b1cb92b28d91a4bfa7ccd7d3ffc197a2c0e1b0060200020188f9ce9de0ae9ffebbc78ca9d4eefac4d9a3a7d1ae901e04fba9d8e39994dfeaa8eed3bd8caebf80000a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030d0601020202030e04000202060301, 0x1eecfa8cb958eefb2a01001000201abd282f7efd083e6d2f2a586d5fc8aee8b8a9294d19da01e07e7eff5b8b0ebe39bb2b8829df6d5b187cc000a040306010c00080416030b020902011200300436030502040200020302030101017edd7fc601eaf601ba912c8df83ea5eb24de8410f0ad0001c7cdbad9d98998b6f795d088eba982a5cee004f2e605c98b02e3f001ebed2d94e60b82cd3feabb21dff80060f3f3b0ffb695ef84c7e79dcfbe8ba6fcd006c6ff4ad5ee018abd8146c39a0585a626c4f543c2c622a1b90037e7c9b0cdcffb97a6accde4a1f1eda0a01010020204b5a5af8ea7d59de0f2b7c1e19be4d4b1adc6a3dc98880a0a020201f7feeecbc2aae8f4928fcee48ec9c8d2e89984b89c9012080202018dcea7e4afef84a1fac190ff9ac8819ee7d99ee1fdb80808020202dcf68db482fab9b4ec81e0d7eea980e4e8e6d2e593f21306020206be828ac6d3c7e8f2f2cfccd39d94aeebfffcd4ab8e80100602021b93f5ec88dfaccff3fcd8ffe29b9fbffbe2c2f7f0e2980606020201a688d3aaaaa9d0da97a0e2f08fe7f0d2c2cee58fd8f60404020205b5d0cee9b89cbc8d908ab9d3eaf8aaaa938481f697b8131001020181d2e7e3f083a6becc92a9e9d0b8f791e4b1dcd3ffd010100102038faba796e6e4cdb7a6f7a0d7dbc4a69ed7aeeab4b9f80a0a010202dfde9df987f8f7edab83efb5d59ecccad0b4, 0x1f9cba6d0efe781d3edbfb2f8f7e9f48df88e88a78c131301021289fad9e5a6c994f7feb08c9ee9cdd6edd395a3ad98941010010210b6e19ccadece889afbaaffc1bac3e4c394bae5a4eae7d40e0e010201c4d9b0c888b1fbe5bcfdb0faffae98f8f3ecce998498941007010204dfc9c6839fa8d5a38af5b6f79096a081d5f0bd81f8ae9c060601021aca83b6d3e2cffd85b2bbaa9fa391d886e0baeeb4ed82a00804010218e4c3ebd5ce8fecf7f3dbb6c6e6bdbcabe09db4d3aac39a0604010213aaf8f8cabe85cf8ddef78bcdefcee7a3ba96f5afa2e5ee0303010201debf88d4ee81f7e5f7a2e7d6888bbbe3c8ad9292fba790100201026b94bfc9c2b5c8adb1d7fef59ac7e484b4ab99d392e8b81313000205badbb686dd8bf0b58acad299d891fd80c59abced8cbcac1310000205c299c5f1cbec8d89e3d5c1ca83cf97c2b4899da29e99b00a0a0002028ebdbd8b83e7df8ccaba93c5ebc0e0a1a4b7d485dd868c0a0600024b90f68ac6cd97cfcf90abfc94aafeb69c9383fb9ae890060600021a87f3a2a7a3b1e6d2e1d0fefcfbafd9d6d8f2faace4b8f0110400022090b1b9c2cea5988ffcbb9d95ac9d97d7f3abc2b3a5bbf00804000202a2fd9694c185fb83bde5cbcaade5fba4e6b59eb2d2de840604000206e282ebbdd481cd9c988cbab4a5f3a78cc2aef493fa84e41003000206a7a7b8bef1eb8b87c9c1eae5ae, 0x1a4a1f6b7ed88d1c1c486f4fee6bff0192df5d4c58ddddffb91e1e1b7c9bff0caa3c2ff85eec2a3baffd2dfeac9dfccf597ede9f5d381bfe9f5e800110200020202030b020902011200300436030502040200020302030113100a0a11040b040e03070202020301040003000a13100a0a11040b040e03070202020301040003000a13100a0a11040b040e03070202020301040003000a060a040306010c00080416030c020b020306000c040e03110404020202031bb567880198e201aa9d2c98c63ff79722cdb80ec4e50002bfccee8890ebf9c299f5d18cd298eca3cbbba003edb803dcd901e4e801cc9129cd880bf39d40fab1249aac0001a0f9ecaccbd7d5ccf7a19c85f4e2b2a9d5c9a803fbc442cc94018ddfed48a5be4fa620dfad45f6e424ccaf0057ebf2c5fc9ee0a3e5c5b2e6b3c1958d8ae81313020263fc90d1ccc5d1d48bffde99e7badcc6de8cbbba83e5b0101002020ae9d48498af86b0fdfb8e948bdba8d2eae5d389dfe880a00e0e02021dc298c7dec186d790ddf099b1c5c4e29eb2a4c2c28d940606020217abe7bd99f2edd7d8d6f28f9ab5e087e3fdcce6fde9e198080402020eeffd9af3d39e83c8bdb2a2b686b3cedaed9196f28cc8a80604020212f8c187a7f199f0abc4f9a0dc8de1f1f3aca9cea5bec4b804040202079bcfe6b08483e3e4a39ba2d18bdb9f97f8b7bee48ba7c80303020201e4cd, 0x1fed5fefdccbb89d1d00e0e010213add0f8d8ef8cee9ed1de8b84deafa9b0e1c2cdf9aae7c0e8ccaab1e0e9cdb7b4fc8b95b8dacc83bbc4fece83818ab21207010202ccffbda0d987dfa193a7e8b398fbf9d088ed90e9a3cdeeadefedc7a385889c81b5fdea9af08a8adac1f2f681feadf2cc080701021e9cdffdf7a7f0a3f69ddde196acb9aa98fd9bc1aac08ed7e6cfd7bd9eeeb4b3a0fadc8deb8fe3a7effbaffb848c070701027da780fed9f2de87b8e9eabb88e0c1abf1cf9db4e282c4a8aef5a6c8eaa39c8af4ff99b7c1c3b0c78bb8c6f0b8bec6d61200010215c1e49bcca2de9be4ee9ac1abe2e5f69895fbb0a6a5b98cc5e1cd81d297a1b7cdc68b9c95edf5f1bbb9e4ac9ae0120f00021ede9acdfdd1f3acb0d4c3d285b8bae587e998f99cd5d2eeddc2c6b1a6ecea8c879f9681f8e8fd91ccc5e5efcfd7e8d0120e000228a580b6e5eca0a4fed2fe9a9b80c6cde19bdca3b4d4eae3b6a2ddf5b1a59ab4b4a3968ae288f4d1d38494d9cb83d9d00e0e00020a8da6fce0a38ddbdcea97facdc5c491f0e1ec9893f98f8b9699f5c4c082e3b3e8c6b4fbbabbd089cd8098afc7d5d5c00707000201808ab6ba9ad8f3f8998ac0a285dbe8e2b8eab598a0d9b998f2f089b6bbd1b995a385d7a6adc0e7bbc0c494b4f4f2d8ec1205000265b0fac9dec1d4c6bd808ee0d0a4b8e9b5b9e898c6c5d0abf7ba8fa19fc69a9edd, 0x1edbec19ff4f6b1e9ea86f4ef9ea3e0c4d4f2bc8ad3eceaa2fb8882b5bbafe41f8eae2385b42d96ee6faba943d18540b7cf1fffb701a4888e0072b4feed8af3eda680d7dc98fbf3d19688fadea1b7f3a3dd9caa8ab7bbb9dcb0bd9befc8c0a68bffb1a83cf8ce3cfa823d84903d9b9e05ee05b402c60de700019e97fcbacc93dbffe2e3f8a791aac18481a4e6f1d7b0eace84b8fcfd839dacdaefc6bccebaefa2e290120e020257d7ebef8ac2f4b79f91aca1d5d79adaba89c9fb9dc08eb2cb91ff95dfc886eb86add6b182eae2cebc9fa59abad4bec80e07020231e9fedab5ecbdacff9cf8ff9ac2edccaec6b6b2ddd6ecea83dfdfe09688989798ebe2ecfcd38fb6918bfa97d1fa91f80e05020209b6ae919597ef91fcb3a788d7eecad8f3feb1debb9bc8ed88a6b6cd82b7eabea1e79fc3d2ce81dacf959bfaaacbd7a00a05020208c58fd3ad8bcdc19a99fecdbad0fe869896deac9bb2f3f5a39e859ae18ef48e91cd82d2f5b8a5f89d8cc6d2e6e8100402020accecdfc195adcbe2e6cfcd9ba3a4cc9ba2eac2e892d6cac1868988dea9b18c8be3d986d1e5ad92a2f0e0d3c9f00a03020211dde8caa9f2a8ca9df7fb83ee8887d3b8c2b9fbc4baf5b8f8d5b7e9ccd6c3f3c681c3b9d78c8edef1efe9cc9c80121201020392f0a683e1c0c68a94be9fc7ce8f83d2b6d09fb9bacbfd8b819aa9d7c8b59bbd83f0f4ff8e8cf4, 0x107070505050404040e030e0007000a1212120e0e07070705050e03061212120f0e07070705050e0306061102000202020311020c060506000c040e0311040402020203030401060202040e0200020202041212120f110e1207070704040e030503030107000a1212120e070712050e030503061212120f120707070e0305030606110200020202030c020b020306000c040e03110404020202031bfca92cf2a81eba9f0dc4a2010daeeeb1eafac4ccaeb9bfd6c48decbfbed3a687f589debacebd8ccbbfab83cdacb4d8a5a3b6b79edda3d4a442cba719d8d26383f43a919d0101badbd8c1e490948bdf87d68ac7dd81eda5e0f3e5d8e0a4b4d68fbf9ad5828be2dfc6baa4b7a9e6b0a5a5a802fcef06dd05c6a202c2d32ef0c141bbaa1eccd90c81f2000dd8b5ed88f7d88bc1c1b5a3cae2b7b19686ffac8fcbe7d3c9c886fbe292a68786dfd0f8d68ab0a4bc9898e40c85de13d3c10d8caa05bec52ba6b30f98c44090a62482b5000696d3e8fa8cd39aacb3859394b4fbab90a1da9fe08898e6a2febdc49de08dbcbaf794cfe2b1d0a7a4fb878c4d83de7b8cd155d39c27caa91f89f53cbdd839f1c91cbde80001eebaed808bf4c6f6c9a3e4bbb3bbd9d293a5e9c790909aaef6a5b8f6fcb891b7d8eaa5edfab6c5ec8fc8c85fd2ce27fc8b0180b09d48d9dc34cbc114c8da46dafe26d8950066ead2d390a89af5dfd8e0e2, 0x11212120f0e07] private def node931:Certificate:=PackedParametricCertificateData.decode 8 data931 private def data963:List Nat:=[ 0x10209d5b29af7fa8ca5c9d9dea2a7d586bd8396b48793faf0bcbb9bba9fefa01200020206f0a0a3f7acc6ebefb2c5c18c95e2eff5eef2e1f1f0facebfadc0a2c00500020205c9fd9081e49b8b969486b9cbe2baa9a0df8581cca1bbdfdb9096fbc01212010202c2fc8ea6f3bbeea7eccf9b97dfc7d28bc0c8acbe9fa6e59baaefe4db85800e0701025ae1e3a8c7bbc380a8dee783e892a5b1dc9d81d0c0b0ec97b9d5fc8ccd90070701026bfbb6d2c2c58eec83cdffe5c5b3d5c9b6faa5a49f9cbf81c0c2d1c397da070301020292dcc68fedadaaa1caf890d282b988babbb6cbfbb8d9deb1cc89998c80030301020baea6d78db8d2c09d95d9a9c6eca599dfdb838dfbc488e5a396a0ac91e00502010205c4c8b5b9fb899884aa8a9c8fb9d7c398eefeb7cf8dfcc2d383ebe01212000202c2b79f87d69ce19cb197d3b8c099fed5d7d2c0f9b2d4a38de2e8e4aaeca00e0700025db4daeda9c9e6d5ced1c4b2f8feb79fccb0f186c3d698d7ca97e5c6b9c00707000266c1fbb9b0c9c1c5efa5be9ab6e39cd3fc98cdb7dbacb492b5fdc284bee0030300020b9fd4b6f18499e0918386b1dfcfb189d8aaca9284a0d5b0e2c690fdcda01901e0b6dff0a0aab8a8e9eea7dab9fb9397a3a1a898fcfce000110200020202030b02090201120030043603050402060002030403030401060202030b0202020202040101020004020204, 0x1ef86f5f19acda0f6b0e7c000110200020202030b0209020112003004360301010b02020202020462b7a847d5b008dcdd01a1aff901078b9e81d7c2ffc48c87d4ff98c5f39a8ac8f6c69bfba0ac13ae33dd6ce04cad30a58141aa801d868f0c81920019bbd0cbdbe7a8f9ff8d86bfcb97e797ffa2d7baa5c583ea80039a99019de803baa705b5de23c3f9078fd849ef942dbaf10004d18cdc9bc8b69e81e0b58ec2ffb88ce89eb58bba828de012c2e603999950a18940f9e2268fca2ba7ea2aebbc7ca2ef0012f9f1eec884e6beb2f4d7eef8e9ada1c386e698caabbca079d3ae55d2a029b2d501a5f4a153d1d9409fe505a3c4018ecdfc0005ef858b97b2a6cdd592f1bbdfcaa5c7c9fe85b6a38bf9801212020202c188afa7bfff82bfa7b5e39cc0c9a4eeef8aa5eaf8b3f5e0fdb6b2c6c2c00e07020259b1c191a3e49895a9d4e3f1eca8b282a9bfa39fc1998a92aea1f4f2a480070702026c8d9bc8bbddf1af8281d8d583d993858bd9d5d7f3988089dc9cc0b69b800704020201b5e0c09dfbf7d186d9a2988ff6e7d1abe5cac0b79ed980a3c59fc1c00404020201b098ea97909fe0c4bae0b394ecc2d89386b6919e9bd3c6f48abd97a00e03020201bbe89cbec4e3d2c5d292e4e39be3ffa3b3d694c88eacb2dabc97f980800703020201a992b38af0f39ababeb194decceb89939fc8bd8d9a8ca7f69ab39e8e80030302, 0x180f692b4e7cad4f0dbf5b5f2cdc6b2a4d6a991e9c4a9800a05020202fadad1cd849d98fc98b58fc08ed1cb9ebdcd968daec3cb800705020201b9d0dab89d9fc7cccdc68edcfda693fbe684f98adb8de5958c80130302020295e69aa58fe9fefb98c383a0f5e1fedf94c8c7f8f79ae9800303020228d680dfede9f4e5daf1af8abbf3f7faf4bdd1b4c79cf4b3c1c0121201020284a4c6f491dee99accc1e3d9a186bacee9acfcbeb38beeadb5c81208010209f0d1f7e897d8b4ecc1abc69fde8acdd4d0968eb89e99800707010201cdb0f39bcdbc9580daebdd91859edd83e5e1aaf4f6e6e9fbbfa012050102238292d08dd8ebc186bdaf90d9fa86fc84bff7bbfa84a080faf8110501020d87dcd1b8d8d9aac1f0ede4f4dbebfcd58ef0f484ecaf8005050102699889fbbdae99c8dbb6a296868bc8a9bef7d28fe1eacedcdbba03030102189dc6d6f88ecb879589d19bf4cfaaf6d7a5c7afb1c0e0959588121200020286a4c5d2dbf394f1dbedf3d8fcc5b69681be8fd4fa8ec2f5db800707000201cdcbc5fde0b5e3d1f794dfbfdde3c6db86d19192efd6d2a19280120500021183c9aaaadd9dd4e58bb6fbe191ded0fcc9d8abe9da81e6c1800505000276e3bee2b3a1af94d09ddaaef0e7e387a1a99ab6b2cef9e1f8c0030300021899aaacedcfc9bbeae0a3a699a399f2a29d8ea7e39af3939dc01901969da3c6e0c4daac, 0x1939197a3f80011020002020203010113131111120b0f0b13030d0302020901040000000a13131111120b0e0b13030d0302020901040000000a13131111120b0f0b13030d0302020901040000000a0613131111120b0f0b13030d030a020202090100000a13131111120b0e0b13030d030a020202090100000a13131111120b0f0b13030d030a020202090100000a060113131111120b080813030d0303030902020200000a13131111120b080813030d0303030902020200000a13131111120b080813030d0303030902020200000a0611020002020203015febb349d5a511818f01bac1ea010188eca980e0ab80aaf682d4ff8aaea2b7cac9c59c03bcb40482ed6df501b49028d8954bb29a159acb0dbfb70008ddade1afc4a1c5cb9bbcf99988bd95a4f8ead6c00c8fec0383be2fd70ee4e90dbdbd07e4e842c9a83cf0d1003d99a5aedceda1b9c2defcb3bffccba69db0a2c06ef4de54e8f4179c9e01daf98f4e99e541b8e3268ee101b5e1ac0025ffc1d2f8d3d1f49798fb8485e789dbdfb9d8c012120202028cd9d795b3d9d6e4b8ebead888d7de9f809a87f299b78a95d8c0101002020ffeddafe5dcb48cb79bf9c4a5b3f9c9b4a5e29587ffdb800808020265f9e1f3f5c898e68cd2ee97d9bc95f989fd899083bca3800707020201899de3ce9198a4e1aaccfca0d29deb95a4e99eeec1e9e5cff5800e05020206d1a5, 0x1dee0120002024ed28fd39ec8fa8fd6dd91ecebb9e6b4888cd6d892a9a4eea5b0faddbba987800000020227abbfa0eae1c8c3fee1c7a8ddb782bbd2bfa2c196b6d0c5ce81b89ef8c489b012120102018fc6d28cd7839ddee4b3c3d38696fcaeead7bb8091b4aedce3ee80d2a6f5eaf5f5fc120f01021dcb88a4bfc1c9dfe8fd94ccf8a9db8a848fcadbb1e8c7bea9b693f6b4bdd6ecd6f40a07010219d9bbe3a5c880fbe784ecf4f1fb9fcccea084e3a39ea7c4cae8fea5fe8c800e05010250fdf1acfdadbbceb3f3cf9f9e85a4b3b9f5c2d382d7c1e6a4cfbcd79ac5ffa2f7960e03010206dfd4aeeaccd69ba1b78d81c7af8cb183f099eba1aeafafecabc7eda5fa9494a0da03010102088bdbdaa48ee1a7bcfbd8ebcbfad38f81c6948990d5e392aae48ccfd4c78012120002019b9090fefbed9de2acd4d3f2d0b2978be4b1f8f2c6e0e3eca39aabc7afa7d0c38ea8120f000225e5fbc7bde9b0d1dbcbb8fddde9f0d9e9e8baca9cbef1eaedfe8ff79bfdb9eddb900707000201aab4cae59cbb81e4cec7dceaf6fddddacaf994c6fef28b95b1a6e6cdb1bdabc6bef80e0300021ba2b98885a395b0bb85b886e3edd0f6cab1ada9c4ad83fefccde2c1ca8dcacbcba00703000207b78fefb3a3dbec90c6ddb9ec86b19eb998a7f6becfafc69e86d1e1df85a6bca59019649efbc0ddb0a79f8dff9fb9f997e1f4c28ad387cea6, 0x1020102020203609df335f2a234a7855ed2d801028dc8fafdd1caa9d584f7afe0b4898a99ca96fbc180d988f3a79bfd980faa8661a99a4889ba01b8dcd9010590debfe89f82b9d1fcba918393fb83f3e6dfddfb998bc5b8b5d69e900c8ae73ab21faa0bb19a3dab9e3390e321fec917e490000ceb848cfcf5d3eaeffcd4e48087c6d499c8e6ddcd8bac82a3ff888018a9d20d89c90db79818d79f14c7ca13e6e32ed68e2fb6f3007dabf3c3b78eacbce8ed97e6e28bdef9c183a7a8aecebe84b782c2902ccfac588df62ee8be01b3c5d942a8a75ea1f115f09301b6baae001bda80d9c48fabfe8e97a2d0f8a7a0fa81a0d8cadbcfad87e8e3ae80121202020194c79fe996f4c2a0d0f0eda9cfbeabdcebbd9ee0c2e7a9c5cb9ea799f9b2b686f4d8120f02022aae82c6f896baefb99af6bd87cde2ffb8cedcc9b6f1afba9d98819e989baaa0cef007070202018fdfdde0ce94de82f1daf7c3b1cbe7e884d5a4f1c6ab86f4958ac1eaeefecfd8ebd80705020229c0c7ef97df8bada6faccede0e593eab990f4b29fe8faafa5d9c4c384a0e4e2aff0070402024ec28ae8cdd4f4e1dab893dfe9eb92bbfdd8b9a7f18d9880ed87b2cbbac4d1800404020227adf0c8c3b681dfa8838f8bfb8b93d6e68486efca99dff7feeda782eca9c8900e03020219d9a6c39297a08dae81d6cebbc98ddcaee881f4c9cbefc7d191ae879fe1b5df, 0x113131111120b0e060e040e03090202020b010d000a13131111120b0e090e040e03090202020b010d000a131312111111120b0e090e03090202020b010d000a0613131111120b0e060e040e03090202020b0108000a13131111120b0e090e040e03090202020b0108000a131312111111120b0e090e03090202020b0108000a060113131111120b0e060e040e0309020202100108000a13131111120b0e090e040e0309020202100108000a131312111111120b0e090e0309020202100108000a06110200020202030113131111120b0e060e040e0302020901080000000a13131111120b0e090e040e0302020901080000000a131312111111120b0e090e0302020901080000000a060e] private def node963:Certificate:=PackedParametricCertificateData.decode 8 data963 private def node964:Certificate:=.split node931 node963 private def data985:List Nat:=[ 0x11313110e110c120b0f0b100811020602060101010a1313110e120b0e0b0c0b100811020902060201010a1313110e110c120b0f0b100810031102060201010a061313110e110c120b0f0b10081102060201010e000a1313110e120b0e0b0c0b100811020902060201010a1313110e110c120b0f0b100810031102060201010a06011313110e110c120b0f0b100811020602030101010a1313110e120b0e0b0c0b100811020902060201010a1313110e110c120b0f0b100810031102060201010a0611020002020203011313120b110b12091008090809051003080203020a1313120b110b12091008090809051003080203020a1313120b110b12091008090809051003080203020a06110200020202030b0209020112003004360301100404020202030b0202020202041310120b100809080e060a0608061003080203020a1310120b100809080e060a0608061003080203020a1310120b100809080e060a0608061003080203020a06110200020202030b020902011200300436030f060d0202060302030a0209020402010a0408030b020202020204010b06090200020302040a0608020002030204] private def node985:Certificate:=PackedParametricCertificateData.decode 9 data985 private def node986:Certificate:=.split node964 node985 private def node987:Certificate:=.negative 1 [(1,0),(1,6),(3,8)] node986 private def node988:Certificate:=.split node897 node987 private def node989:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node988 private def node990:Certificate:=.positive 3 [(1,0),(2,1),(2,4)] node989 private def node991:Certificate:=.positive 4 [(4,0),(1,3),(3,5)] node990 private def data1023:List Nat:=[ 0x113130b0b0e0a11040b0404040e020802030203010a13130b0b0e0a11040b0404040e020802030203010a13130b0b0e0a11040b0404040e020802030203010a060a040306010c00080416030b06030a0202001204160311040402020203131311110e0e0d0d0e0a0e0808080b0409040a020a131311110e0e0d0d0e0a0e0808080b0409040a020a131311110e0e0d0d0e0a0e0808080b0409040a020a060a040306010c00080416030b02090201120030043603050204020002030203010a0605020202030e04090607060408040c03131311110e0e0d0d0e0a0e08080811040b040a020a131311110e0e0d0d0e0a0e08080813060b040a020a131311110e0e0d0d0e0a0e08080813060b040a020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030d0601020202030e040002020603010c0402020206030b1c081205120102041e0313130e0e0d0d0e0a0b090b0410020e0211000913130e0e0d0d0e0a0b090b0410020e0211000913130e0e0d0d0e0a0b090b0410020e02110009060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030d0e0702060204060406030e0400020206030d040606050602120416030c04010200020308030b1c081205120102041e0301] private def node1023:Certificate:=PackedParametricCertificateData.decode 11 data1023 private def data1067:List Nat:=[ 0x1b8b584ea80001102000202020301010e040a0401060306040b0202020202040c02080201060306040a0607060204000a040e0413131212120f0e0e0f0b0e0707070905120307020a1212120f0e0e0e0707071205061212120f0e0e0e0707070f050606110200020202030d020b0205060002040403110404020202030e040a0401060306040e0200020202041212120f0e0e0e07070708050404050312000f000a1212120f0e0e0e0707070503061212120f0e0e0e07070705030606110200020202030b020a02030c000c041003110404020202031212120e0e0e12070e0707070404040312000e000a1212120e0e0e12070e070707061212120e0e0e12070e0707070606110200020202030b0209020112003004360305020402000203020301131310100e0e0d0a0a0a0b0404040e02080203020a131310100e0e0d0a0a0a0b0404040e02080203020a131310100e0e0d0a0a0a0b0404040e02080203020a060a040306010c00080416030b06030a0202001204160311040402020203131311110d0d0a0a0e08080811040b04030304000a131311110d0d0a0a0e08080811040b04090403030a131311110d0d0a0a0e08080811040b04090403030a060a040306010c00080416030b020902011200300436030502040200020302030101010b0207020302030204010b0c090208060508040c030712060404060016041604, 0x1cac9e5cba680adc9adb6800707020224e2fcf4d0bfbdcceeabd6a1c9babf85b985b2c9969ad0800e0402021a99adee8ad3e8b2f787d8a4c3d7a1918fdfefd89c800e03020203aeec88dcaaf9e7beb69aaedefee79bb5bbe5a2f7b4800101020202a5edfca0a09adac8898fc7aee0b8f68bff9890d4800f00020265b7a18fe3d8fde8d7bfea8095e6b7aaea81c88c84801212010212faeabdf3b6c8b2da809df69bbe9ee785ba9e81f9fdbdc8120f010217c88ff48fb2e8d7a9a0d9b7b0f2b5c4e1c3e5a6949eef980e0e010205a8aa909aa5a38f9babd883da9cb2ebcef5a5c3f28bf7e60f0a010204bdc8c689b3d6c1c6b3a0af85ed8a96c393a39c84800d0701020287b583d7ebe38eb88088b39799c6f0ad81beb0cc8007070102249fc9ecd192a4e2de9cd8e0938c8187a0fcb1af90f3e6800f050102238898a6e693f192f7f8a9ffa2ddb0e5d9f699fbb3c9c00e01010268f6b6b4eea0f89bb3cea9ace1f6a2f4dbf3feac801212000212e584ae99f8abdda7a1c4d4cafe8baecba4b4c6c2d9fe80120f00021885f1c0e291bba4cfbed8a3d4ebbdb6baf291ada593f4800e0e000205a7f8c582a7dec28be1baf0afa5978a8bc39df9c8d0b4800f0700020291cbe8e18d82f7a5c391e4dbda92e5dbe5eea1d08480070700022488de9ca8ae9ddcb0b6ecbcc8f7b8b68ee2eea9d8d9b0801914d3f8ff85c6a9fe8393a9d4, 0x11313121111110e0e0d0d0f0b08080c020a0202020a1313121111110e0e0d0d0f0b0c020a020202091313121111110e0e0d0d0f0b0c020a02020209061313121111110e0e0d0d0f0b08080c020a0202020a1313121111110e0e0d0d0f0b0c020a020202091313121111110e0e0d0d0f0b0c020a02020209060110020c020006030604131312120e0e0d0d0f0b0e0202020b01080000000a131312120e0e0d0d0f0b0e0202020b01080000000a131312120e0e0d0d0f0b0e0202020b01080000000a060e0201020202033afcb12eecf86088a56c97e00103efbde5f0e3d3a8c4bff7939cf1c3deedb4089dec0596890287e4058f9d0ddd8615c0c24ecdbd2baff6000198e6b9e08d90d5d89ae3e8b0dbc2f3a2be8001a4a0289c0dfad50cad9240dde938cec208f09c60f3002cfdb7dec4f3fdf980d7e7ea81c5cbb9c280131302020df5e9d5a1f4bae0b3ceb697d9eb96989399ebb98c80121202021ae489a6f3c0e593de95a3cea9bcd5c786b9c8b48ed79c800f0f02021198f1d3d0ab97d185c0aca3a09296f98881efa889b3c0800e0e020203a5d2efe2d5f0d4dfe8c6a6da] private def node1067:Certificate:=PackedParametricCertificateData.decode 11 data1067 private def node1068:Certificate:=.split node1023 node1067 private def node1069:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node1068 private def node1070:Certificate:=.positive 5 [(3,0),(6,2),(2,4)] node1069 private def data1102:List Nat:=[ 0x1130e110c0d0c110b130a0b040e010d01080103010a130e110c0d0c110b130a0b040e010d01080103010a130e110c0d0c110b130a0b040e010d01080103010a060a040306010c000804160311020a0603180012041a03110404020202031010100e0d0b100a0e08080809060b040d020a020a1010100e0d0b100a0e08080809060b040d020a020a1010100e0d0b100a0e08080809060b040d020a020a060a040306010c000804160311020906012a0066047403050204020002030203010a0605020202030d02090604020302031010100e0d0b100a11090e0808080b040d020a020a1010100e0d0b100a11090e0808080b040d020a020a1010100e0d0b100a11090e0808080b040d020a020a060a040306010c000804160311020906012a00660474030502040200020302030f04080c021001020412030806070601040304030e040002020603010c0402020206030b1c081205120102041e03100e0e0e100a0b090b0410020e0211010b0009100e0e0e100a0b090b04110210020e020b0009100e0e0e100a0b090b04110210020e020b0009060a040306010c000804160311020906012a00660474030502040200020302030f04080c02100102041203080e07120604040c040c030e0400020206030d040c0c05240236043a030c04010200020308030b1c081205120102041e0301] private def node1102:Certificate:=PackedParametricCertificateData.decode 11 data1102 private def data1138:List Nat:=[ 0x1130d110c120b0f0b0d0b0e0202020a0108000a130e130d110c120b0f0b0d0b0e0202020a0108000a060e020102020203130e130d0f0b0d0b0a090b07090702020e010d010a130e130d0f0b0d0b0a090b07090702020e010d010a130e130d0f0b0d0b0a090b07090702020e010d010a060c020b0200040304030101090c0208010600040412040e02000202020408020702010c0002040e0407060606020e0008041604130e130d0d0b0a0a0f09130207020d01070101010a130e130d0d0b0a0a0f09130207020d01070101010a130e130d0d0b0a0a0f09130207020d01070101010a060c020b02000403040311020d06050603020311040402020203090c0208010600040412040e020002020204130e130d0d0c0f0b0d0b090508050e010d0108010a130e130d0d0c0f0b0d0b090508050e010d0108010a130e0d0c0f0b0d0b0d0a090508050e010d0108010a060c020b02000403040311020a0603180012041a03110404020202030906060202020002040604130e130d110c0d0c110b0b040e010d01080103010a130e130d110c0d0c110b0b040e010d01080103010a130e130d110c110b0d0a0b040e010d01080103010a060a040306010c000804160311020a0603180012041a03110404020202030f060912060a0202040c0401010706060603080206040e04010b240814051604020424030712060404060016041604, 0x1130e130d110c0d0c0f0b0d0b0a0202020c0113000a130e130d110c0d0c0f0b0d0b0a0202020c0109130e130d110c0d0c0f0b0d0b0a0202020c010906130e130d110c120b0f0b0d0b02020c010a0108000a130e130d110c120b0f0b0d0b02020c010a0108000a130e130d110c120b0f0b0d0b02020c010a0108000a06010c020b0201060018041a04130e130d110c120b0f0b0d0b0e0202020a0108000a130e] private def node1138:Certificate:=PackedParametricCertificateData.decode 11 data1138 private def node1139:Certificate:=.split node1102 node1138 private def node1140:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node1139 private def node1141:Certificate:=.positive 1 [(1,2),(2,8)] node1140 private def node1142:Certificate:=.split node1070 node1141 private def node1143:Certificate:=.split node991 node1142 private def data1184:List Nat:=[ 0x10202030b020902011200300436030502040200020302030113130d0d0a0a0a080808110408040e02080203000a13130d0d0a0a0a080808110408040e02080003000a13130d0d0a0a0a080808110408040e02080003000a060a040306010c00080416030b06030a020200120416031104040202020311110d0d0e08080811040b0408040d0303030a020a11110d0d0e08080811040b0408040d0303030a020a11110d0d0e08080811040b0408040d0303030a020a060a040306010c00080416030b02090201120030043603050204020002030203010107020602040403040311110d0d0e08080811040b0408040d0303030a020a11110d0d0e08080811040b0408040d0303030a020a11110d0d0e08080811040b0408040d0303030a020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030d0601020202030e040002020603010c0402020206030b1c081205120102041e030d0d0e0a10090b090e080b040d030e021100090d0d0e0a10090b090e080b040d030e021100090d0d0e0a10090b090e080b040d030e02110009060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030d0e0702060204060406030e0400020206030d040606050602120416030c04010200020308030b1c081205120102041e0301, 0x1131312110c0b100a0a080d040a021100080003000a131312110c0b100a0a080d040a021100080003000a131312110c0b100a0a080d040a021100080003000a06110200020202030b020a02030c000c0410031104040202020311110d0d0e080a0813040d0404040d0303030a000a131311110d0d0e080a08080804040d0303030a000a131311110d0d0e080a08080804040d0303030a000a0611020002] private def node1184:Certificate:=PackedParametricCertificateData.decode 11 data1184 private def data1219:List Nat:=[ 0x1a1ccfbd4f08df4a4120001023eb483b4bd98f5b59eae909894f786b3e1800e0001020bf8cc90e0ed87d1f7d9f5e4c0c3c1e7f3801212000201f4d4aca085f0e69bd7cda8dda0b5f2fea4f4a594120e0002199aed84dccde3aec1acb09184a185f7849fd2b80e0e000218d0f1a685db8fc3f88ec38ba1d195faabc7abb407070002068e9c86b5f1e7a4c2baedc8a9c4f089ff91f0e5c01203000201a592d2cd96bb93b3b085b0d189fdead7a0c5b880190487f48daafbb1a4d5f3cdc5b6c0001102000202020301010e040a0401060306040b0202020202040c02080201060306040a0607060204000a040e0412120e0e0d0d12070e0707070f041203120007000a1212120e0e0e0e0707070303061212120e0e0e0e07070712030606110200020202030b020a02050c030403110404020202030e040a0401060306040e02000202020412120f0d12070e0707070e0508050d04120312000a1212120e12070e0707070e05061212120e12070e0707070e050606110200020202030b020a02030c000c041003110404020202031212120e0e0e12070e0707070f040404040312000a1212120e0e0e12070e070707061212120e0e0e12070e0707070606110200020202030b02090201120030043603050204020002030203010a060502020204010b0207020302030204010b0c090208060508040c030712060404060016041604, 0x1c6dfcb9cd8819de5e8bdabb5bfc40800000205dcf3edfb95c08ac3aad0928cfe86f98bebfc1e01ade3dad0c2bdf281dabf82b0000104cb991bc08c76ebff5ff78e0158cbb2e4bb88d0be99f0ce9be5e402de970395a842bc79db0fd5f525edae4483db2deca40033b799b28ef3b19daea68c89cae2800a9b960a9dcb0a93f40a92bd2cbba341ccaa168fda2ba0df0006e8969d86b3b2ecaef58be7bdb0cc1212020201d396d7f8c8d1e2ccc799bdf4b5f4d087e2858dec121102020ae7d39bbd9380c8c99987dbceffecaba382800f0e020206bd8abac5c49fbfe786b5a797bdaae0b98899fc0e0e020214bca5f5caa9bcbb8fba8dc4d2c4c5fcaae087cc0a070202108ac5b78ca9a9b7b896b0e1f9f0dec3c0e280070702020683e9a2e0becee8e7d4e7d3a096b4afc8e7e3a0941203020201bd85adb2f7d4a0b8f696a6888495b8bf9aa089a803030202019de2e7e286f0f79c9eb98baddfc39acbeef1e00f0202020da8fea0fcee9ca48cbcf8cccebed18e80d08001010202039895a8b9bedca9ced4cd80deea858aaf88801212010201e9a793e38ee5c7ed9fc4f0fbf3e6e391d8feaec0120e01020bff87f49f9ffff7fdeaeee2c0e0b68de6acf9c80e0e010218bea5fce583ad8ea9bba9ebc4d982a4fdd09c9e070701020686c4fbbe83b7b0e0a3fd9ea3a6e391a6dddbbaae1203010201b0dd9ca1f8dfa5ad87bcd3cb, 0x102021fa2e8d79498b8c2a88ba5e1a9eab39bebeb84020202021fac87c0b6ec82d186ad9acbf5d8e897c9b8e80b01020219cfe89593a7c3d68cafabaaebeba0b6b3cd9a0a0102020ad7af97e2f9d1a8f9d5f9cacdbb88a6efe4d20901020201dcdd97e2a7c5f781adc496b89a8dc7c0b3a80800020209ddd5e89dc38a91dbb48cec97d1dbe0c4f88e1211010217d7bdd4d5c7ceaeefe5e297b2eeeaaeeacb8c0e0e01020593a49bf8cec0bf89f2f0879ee3c1d3dea7c80d0d01021cc8fe8c8effd680f1f69281db8c90a8eb92d0120b01021d99a2e4a68cca9ef0e2a889c1ec90d6c889e00e0201027cd9b8f6abbdc39296cdcecfe8d2dfa186dc0202010220bad4e0cbd1d0a1dcacea8babecd5df878d840b01010217a2bbefdcf2b9b6a79df485f5c186dae9acde0a0101020fb089daa4cd98a392a9d6a5cae2c096cdc98a0800010205f8fea1de8bcedffcc0c4e5f9aff69580f7e6121100023587b48e8ede81def8fab8fbd9efeddebbd0f80e0e0002058beebfe4a08095eec5baa4de95d0b6c7e0f80d0d000215aee6cdb8d3abd5dcf498ab87eaf7bfa1bba80c0c000207a8c7deeff3e0ecccaa8ca1f7e086beb2c8980e020002018fc1a2b386a093a2e8aeedc1f8b0efaef2a80202000220b3d7acccecb4b5e6b4acd886f6e48ce8b0c00b01000216f4de92cee494a9d9dead9eaefe96eab1afec0a0100020ff4c58dc4, 0x101020fcedf81eedce4a2c6bd839aa88a8b9eb587a01209010203abcfb6a895b4a18cbbe3bacb8efe87c7c9800e02010202838fe49b8ab2bcbedadfd3f78d86f49999e00202010216d8e0c39996ddba8ac49d87c1f2c2849cf5b00b01010211969696ce91effdba97ee90fd80baf4aff2800d0001020398c785d19c8d958ee0c0ebe9d3a2cd8387e01211000222c3dfa3b783d5b28ec3b8cf9193f599acb1880e0e000202e4ae8f9390e992a38c9efda0dad0c091c4e80d0d00020efdefa3a4ea8ff5bab7b8cd95f4dea6b0ff9e0c0c000203f293b9dc8beda5abb681e9fbbeddc8b387a21209000203a2e585c5d7e7c288bee4cfea80d9e282dde00e0200020285c3d5f2a8fd9dad88d3b7ebbd82e8ebd2c80202000216c08b81ecd9e2daf99991a1e7e6908f9089e00b0100021194fcdaaff289b98fa68ede97cdb4cda0c4880d000002038c87e58c9ef3c794b086f8dee1aed6b89df01e72abc296acb9d1ad95bbd2a00001a1ca29fbdf6ad99829f0fd0126c9bf8088bdbccda9defee1982e8a319e0188f906de12b1ae29ab8142a7dc20fe990011ee80e1d093ef8bf787e7cbfcc0131302020dcda0ab8da2d6a2f2d9d1c5d5b3d4a9cca01211020211e1c687b0fb81a692dee5bb8deba8b8bcb9840e0e020205b0b6fddab19ca495d7eb80ecca95b0e4f9a80d0d02021ccbc3b3c4c1b3e7eea892b2eb90cadf9ccca0120b, 0x11313121111110e0e0d0d08080c020b020a0202020a1313121111110e0e0d0d08080c020b020a0202020a1313121111110e0e0d0d08080c020b020a0202020a060e02010202020410020c0200060306041fb625b3cb68fbf031eba9010aebd89caf8fd7cceb9999f9a025f24381199d01cfce0efab41fc4a13fb7ec2fdaa5000ceb8aac95dfd6e6b59182cf93a01211020220e9afb69dbfde8acde3c390cea884edd48d88111102021087f1eb8183bfdceec4f1b49bc7c2cae3a00e0e020202e9d0eadbadd1dcbed0e5e488e4d9a7b9cfe80d0d02020ed6c3a7fda68898c1ade3f184aa968ee08c8e0c0c020203f6a1e4a39afe848fb4f6b2c1b0a4ed9785b2120902020491fe9ad0a69bff99ebfbc1f0b4b9afd3b1a00e0202020182d7c3cbea88eaf5e0b1d3e2f494e283e8880202020217a6eddbf3a0f58abdc9cdd69592bfd7e6ed800b01020210e099b3b3ab90d3b9e5c5a6edbca1e0e0fbc80d0002020489d299a2d0cce1b68aa1bfd6ecdbb9efacb01211010212e4dee29dc2fa90e1d3bd9881efcbd3f3b3800e0e010202e3deac84d0b3a9dcccdce8d9ec84e6a4d9c00d0d010212e69a83c5e999e1c1d0d69c8fba99c4c8dad0120b] private def node1219:Certificate:=PackedParametricCertificateData.decode 11 data1219 private def node1220:Certificate:=.split node1184 node1219 private def node1221:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node1220 private def node1222:Certificate:=.positive 1 [(1,0),(2,5)] node1221 private def data1269:List Nat:=[ 0x10c020b02000403040311020906012a006604740305020402000203020301130e130d0d0c08050b040c030e010d01080103010a130e130d0d0c08050b040c030e010d01080103010a130e130d0d0c08050b040c030e010d01080103010a060a040306010c000804160311020a0603180012041a0311040402020203100e100d130a0d09080809060b040d020d010a010a100e130d100d130a0d09080809060b040d020a010a100e130d100d130a0d09080809060b040d020a010a060a040306010c000804160311020906012a0066047403050204020002030203010101100e100d130a11090d0908080b040d020d010a010a100e130d100d130a11090d0908080b040d020a010a100e130d100d130a11090d0908080b040d020a010a060a040306010c000804160311020906012a00660474030502040200020302030f04080c021001020412030806070601040304030e040002020603010c0402020206030b1c081205120102041e030b0a13090b090e0813040b04110210020e02090b0a13090b090e0813040b04110210020e02090b0a13090b090e0813040b04110210020e0209060a040306010c000804160311020906012a00660474030502040200020302030f04080c02100102041203080e07120604040c040c030e0400020206030d040c0c05240236043a030c04010200020308030b1c081205120102041e0301, 0x1130e130d110c0d0c110b130a0c0302020d010a010a130e130d0d0c110b130a0c0302020e010d010a010a130e130d0d0c110b130a0c0302020e010d010a010a060c020b02000403040311020a06080603020311040402020203090c0208010600040412040e020002020204130d110c0d0c130a08050c030e010d01080103010a130e130d0d0c130a08050c030e010d01080103010a130e130d0d0c130a08050c030e010d01080103010a060c020b02000403040311020a0603180012041a03110404020202031111100e100d130a0d0908080d020d010a0100000a1111100e130d100d130a0d0908080d020a0100000a1111100e130d100d130a0d0908080d020a0100000a06] private def node1269:Certificate:=PackedParametricCertificateData.decode 11 data1269 private def data1302:List Nat:=[ 0x1110c0d0c0d0b0e020d02080202020a010a06130e130d110c110b0d0b0d0a02020c010a0108000a130e130d110c0d0c0d0b0d0a02020c010a0108000a130e130d110c0d0c0d0b0d0a02020c010a0108000a0601130e130d110c0d0c0d0b09070c030e010d0102010a130e130d110c0d0c0d0b09070c030e010d0102010a130e130d110c0d0b0d0a09070c030e010d0102010a060c020b0200040304030101090c0208010600040412040e02000202020408020702010c0002040e0407060606020e0008041604130e130d110c110b0d0b0d0a02020c010a0108000a130e130d110c0d0c0d0b0d0a02020c010a0108000a130e130d110c0d0c0d0b0d0a02020c010a0108000a060b020606020203130e130d120c0d0c120b0d0b0a050f010d0102010a130e130d120c0d0c0d0b13070c050a050d0102010a130e130d120b0d0b0d0a13070a030d01070102010a060c020b0200040304030111040402020203090c0208010600040412040e020002020204130e130d110c0d0c0d0b08050e010d01080103010a130e130d110c0d0c0d0b08050e010d01080103010a130e130d110c0d0b0d0a08050e010d01080103010a060c020b02000403040311020a0603180012041a031104040202020309060602020200020406040a060502020204010706060603080206040e04010b240814051604020424030712060404060016041604, 0x1130e130d110c0d0c110b0d0b0a0202020c0113000a130e130d110c0d0c110b0d0b0a0202020c0109130e130d110c0d0c110b0d0b0a0202020c0109060e0201020202040c020b0201060018041a04130e130d110c0d0c0d0b0e020d02080202020a010a130e130d110c0d0c0d0b0e020d02080202020a010a130e130d] private def node1302:Certificate:=PackedParametricCertificateData.decode 11 data1302 private def node1303:Certificate:=.split node1269 node1302 private def node1304:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node1303 private def data1354:List Nat:=[ 0x1130c0d09080809060d020c020d010c010a010a061102000202020311020906012a006604740305020402000203020301130e130d130c0d0b0b080e05080505030d0108010a130e130d130c0d0b0b080e05080505030d0108010a130e130d130c0d0b0b080e05080505030d0108010a060a040306010c000804160311020906032a001204200311040402020203100e130d100c0d0b0d09080809060c020d010a010a130d130c0d09080809060d020c020d010c010a010a130d130c0d09080809060d020c020d010c010a010a060a040306010c000804160311020906012a0066047403050204020002030203010101130d130c100c0d0b0d0908080c020a020d010a010a130d130c100c0d0b100a0d0908080c020d010a010a130d130c0d0b100a0d0908080c020a020d010a010a060a040306010c000804160311020906012a0066047403050204020002030203050202040202030d0601020202030e040002020603010c0402020206030b1c081205120102041e030b0a13090b090e0813040b04110210020e02090b0a13090b090e0813040b04110210020e02090b0a13090b090e0813040b04110210020e0209060a040306010c000804160311020906012a0066047403050204020002030203110402020202030d0601020202030e0400020206030e0402020202030c04010200020308030b1c081205120102041e0301, 0x1151213121511150d120b130a12020a02020200000a1511150d130a150312020a020202071511150d130a150312020a0202020706150d130d0d0b130a150302020d000a00080002000a150d130d0d0b130a150302020d000a00020009150d130d0d0b130a150302020d000a000200090601150d130d130c110b130a15030d010a01080102010a150d130d130c110b130a15030d010a01080102010a150d130d130c110b130a15030d010a01080102010a06110200020202030111100702020603090c0208010600040412040e020002020204130e130d130c0d0b0b080e05080505030d0108010a130e130d130c0d0b0b080e05080505030d0108010a130e130d130c0d0b0b080e05080505030d0108010a061102000202020311020906032a001204200311040402020203130d100d130c0d09080809060c020d010c010a010a130d130c0d09080809060d020c020d010c010a010a130d] private def node1354:Certificate:=PackedParametricCertificateData.decode 11 data1354 private def data1379:List Nat:=[ 0x1130d130c120b120a0d0a140813020a0202020a010a120a0d0a140813020a0202020a0107120a0d0a140813020a0202020a0107060b0803060118031a040b020a02010c0024042804130d130c120b120a110a0d0a0d02080202020a010a120a110a0d0a0d02080202020a0107120a110a0d0a0d02080202020a0107060b0206060202040b020a02050c03040401090c0208010600040412040e02000202020407020602010c000404100407060606020e0008041604130d130c120b120a110a0d0a0d02080202020a010a120a110a0d0a0d02080202020a0107120a110a0d0a0d02080202020a010706130d130c110b0b0b0d0a0a03100202020a0108000a130d130c110b0b0b0d0a0a03100202020a0108000a130d130c110b0b0b0d0a0a03100202020a0108000a0601130d130c120b110b0d0b0d0a0a030d010c0102010a130d130c120b110b0d0b0d0a0a030d010c0102010a130d130c120b110b0d0b0d0a0a030d010c0102010a06110200020202030111040402020203090c0208010600040412040e020002020204070206020404030404060605060304020c041004010b240814051604020424030712060404060016041604] private def node1379:Certificate:=PackedParametricCertificateData.decode 11 data1379 private def node1380:Certificate:=.split node1354 node1379 private def node1381:Certificate:=.positive 2 [(1,5),(1,6),(6,9)] node1380 private def node1382:Certificate:=.split node1304 node1381 private def node1383:Certificate:=.split node1222 node1382 private def node1384:Certificate:=.negative 1 [(3,0),(2,3)] node1383 private def node1385:Certificate:=.split node1143 node1384 private def node1386:Certificate:=.split node869 node1385 private def node1387:Certificate:=.positive 1 [(1,0),(2,4)] node1386 private def data1398:List Nat:=[ 0x113131010130a110a0b0a13091109130211020913131010130a110a0b0a13091109130211020913131010130a110a0b0a130911091302110209060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030d08070606060212041a030c04010200020308030b100a1208360120043003080606020002030203] private def node1398:Certificate:=PackedParametricCertificateData.decode 11 data1398 private def data1408:List Nat:=[ 0x11313100a130911090a09130811080808130212010a1313100a130911090a09130811080808130212010a1313100a130911090a09130811080808130212010a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030d08070606060212041a030c04010200020308030a0608120008030803] private def node1408:Certificate:=PackedParametricCertificateData.decode 10 data1408 private def data1465:List Nat:=[ 0x1080801021a95cce59bb08ae8e4e1c9cdf3a28ac9aad1c3eca2fbbcbc1206010227d5a0dff5aff1928ee9cbe2a5f0c8ccaafee0c6a4b4babc0606010236c889989085ec85e4d191a4e5c5f3fa93d5add9bdd48c080401026fdfb6cae4d58cc2f2eb9de3ddb9eddce48fa6c1d094d8120101022293fdfdc0f0a2c19dc8f181ee9bffdfc0e4f38fa697ee841313000214aae4d4cec798a7d892c5a5c98fa3f4eda6a0aeb8fda1881312000201e5fbd8eceb88faf1a2ebc6bce4e7d0adcdd68395a5b7aec81110000239c5ada082f3af8ccba5e1e2f098bbe98fcd88dacce9a1e00909000204c5a1db81a089e0a690b8f3e08fe4c686a7b89eecf9baa0080800021289f7d9def0ad90d0da94aab8d78faceffc90b0b6d9bbf01206000246a9ade2b6fbc1dcebd8a5d08bd4d8befb87bbbc9c92e58e060600024497bcc4a0bfdcf0fdbae7b3b0f8c4859f85fedba4d9f00804000243b9d9e1d1da92e996c2dbde8cabedeeceadd5ea95e4e0120300021ced94f5c0f5b2c5ec8aa2dc809effb4b6dab8c2fec0e1d01201000204abd6cce1f5da81c2e99cdfdd9abbc19fb0b6e98bd8fed61e06b0a8cad5cbafc2d3e0d9b6fff8cccc9bf0000a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030b06090200020302030a060802000203020301, 0x10209020112003004360311040402020203090c0208010600040412030b0202020202030e040002020603010200040202030101b88c38ed449523a615bcb03588e339d4a41cebad0001c5bccecd85a791d183caf0afd7a6d4e6b5a4a05ffe45af2de711903bfafe23a9872cf5b916c0c400599cefec92e494e4a5f8dfccfad6e187b2a0804bbdb105a6bc018ae99e45a78325f5da03afa145a7eb22c6aa0001f4adb7b5d3a4f284e28bbad4d4aed4ddaac01312020202b38af991f3d0c4b8b396e2dba696aaefffd0d8f4ffa5f1a01110020223ebd2b4d6fed2a3f3f3cfd6e1d699abc4aebb8de6f9bce00909020205c0e5f59c8ba4a8b8c2b2b3f3a9faede39fefe683f7ef90080802021182a4fbd0c7fbcdf2a79eaab2c6939aa2ab9bbab1d9d1c8120602023ad6eca9b6d3d3ec8ca0bf88fbccb0fde9b7e5af9ff7cd88060602022bb7c5efd6a8d4cebdfab0abc7d9beed93a1cfcbf7bbd80804020251bfdadda7a6e4cdd1c6e994d1bbe2afd2b6e4a6d0cad0120102020a97e7c5d4c6d1bba4c68681f782a1ca94f7e2d7fac89db813120102029fb384a4bdf8fed3d690fff1c9a7c186839a96b8d7c6e3e011100102398bf7a0e4d5d280c4e5c1fdaddbf1cdc3d5c086f4bcc2f01010010228f197a1d7bbb29ab4fbbfc38fb7a8f8dba4a7b993a3900909010207c9a7cbcd9ff3c48ee0fcb3dbb3fd8efb9aa0d6c9e6bee0, 0x10302020203131311100a091108090810060a060d04080203020a131311101108090810060a0608060d04080203020a131311101108090810060a0608060d04080203020a060f040a02010a0004040e030b02090201120030043603010a0209020402010a0408030d060102020204011110110e11080d040404110210000e000800091110110e11080d040404110210000e000800091110110e11080d040404110210000e00080009061008050600060308031204030202020313131110110e0a09090911080d040802060213010a13131110110e0a09090911080d040802060213010a13131110110e0a09090911080d040802060213010a060f040a02010a0004040e030b02090201120030043603010a0209020202010404060313131110110e130d130811080404110202000913131110110e130d1108130211020713131110110e130d1308110811020706100803060018031a031204030202020313131110130d110a1308110811070907080206020a13131110130d110a1308110811070713131110130d110a13081108110707060a040306010c00080416030b0209020112003004360301090c020801060004041203010e0400020206030113131312111011091308110809080707120607060a13131312111011091308110807071202081313131211101109130811080707120108060a040306010c00080416030b, 0x113131110140e110e130d110c1102060201010913131110140e110e130d110a1102060201010913131110140e110e130d110b11020602010109061102000202020413131110110e130d0e060a061303060203010913131110110e130d0a0613031102060203010913131110110e130d0a061303110206020301090613131110110e130d0a0613031102060203010913131110110e130d0a0613031102060203010913131110110e130d0a061303110206020301090601010f060d020206030204100404020202030e02000202020413131110110e11080d0404041102060208000913131110110e11080d0404041102060208000913131110110e11080d0404041102060208000906100204060202031204] private def node1465:Certificate:=PackedParametricCertificateData.decode 10 data1465 private def node1466:Certificate:=.split node1408 node1465 private def node1467:Certificate:=.split node1398 node1466 private def node1468:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node1467 private def node1469:Certificate:=.positive 3 [(1,0),(2,1),(2,4)] node1468 private def node1470:Certificate:=.positive 4 [(4,0),(1,3),(3,5)] node1469 private def node1471:Certificate:=.positive 1 [(1,1),(2,3),(2,6)] node1470 private def node1472:Certificate:=.positive 3 [(1,0),(2,5)] node1471 private def data1493:List Nat:=[ 0x1131311110d0d0a0a0a0808081306110409040a020a131311110d0d0a0a0a0808081306110409040a020a131311110d0d0a0a0a0808081306110409040a020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030a0605020202030e0400020206030b02070203020302030c0402020206030b0808120706010a04120310100e0e110a100a11090b091104110210020910100e0e110a110910090b091104110210020910100e0e110a100a11090b0911041002110009060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030c020a0404020302030e0400020206030d08070606060212041a030c04010200020308030b0808120706010a04120301] private def node1493:Certificate:=PackedParametricCertificateData.decode 11 data1493 private def data1503:List Nat:=[ 0x113100e0a110910090b090a0911080808110410010a13100e0a110910090b090a0911080808110410010a13100e0a110910090b090a0911080808110410010a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030c020a0404020302030e0400020206030d08070606060212041a030c04010200020308030b0408180708000a040e03] private def node1503:Certificate:=PackedParametricCertificateData.decode 10 data1503 private def data1554:List Nat:=[ 0x1fd849dc2a9908287e390d4d2f2ecc794f8e8b80808010202b9d1b2bb8383c1edededcca09df2e6c081dafae9f68a8a1306010203ead8b193fcada396d8c28ca2c3f1f29ff48191efafbfa4120601024d85eef0b2d8d3d6c7c8a9e2b7e8ede5ade5b6ed979fd1d81006010239ecbbf9fcbee2ee91bfd7a3aed0fbf7dbe4aebd92fbc1e8060601021085a28ea2b2dfd9d4f9859fa88e80f2f5c384d6eabcabfe110401020a8f9bf2c1dee8dacffcd1e3c7ded2dd8df590e5a3c3cafc131200020189aa9fbbf7e38cf5d0fe809c9ee69ae89d99dcbca59f8afa1111000204dcfca2ea85bdc0f9c08991d6a5f0dfb092989182d2cac81010000216dddfcdbee69e82a79a8ef5dd98a2e08a8ac9d98ae5d2f00a0a000203cde291ececa1f4aec19bfedc80b4e691e294ccc1b5c5e01306000209d6b0e9b7e887adf4bdedfaa1bafffbced981dc9daed3b2120600023fd6f4c9c2fbb58fa4a4a98dac8e9d928290f1c6fcaac0d810060002368ecde080d4b2ef8ec9feff9dfdae86fe91f7b6c7dd91c0060600020ee6c49eccd3d8cad9ace8d9c3ee9de8d6d9aff7c4f6cde01104000206d3afe0a9c2d9b8c39990e98aa8f4a2ecbcf7e1efbea4ee1e05c0d09d849bd7c081a3b6c5fbfd9cd2a6b0000a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030101, 0x18dc993c2acd9c004040002069aa3c0a6b1d0bbe7fcd3f41e56d0869880000e0201020202030b020902011200300436030502040200020302030a0209020202010404060325b141ae09ae01af1b9ef2378ea736aa9a1bb4830001bb95ebdfa79bd7bc8ea5d6b6b9b88f9fba87a019fd62d501819c31f53abfce1fd7ab31d7af18c6de00469892f2bfd3e794cfe4d0c3f4bba89da481801cb2bf2ebfb50192c0e849a1cd0db5f0178ef849829124c7c80053e3d2cbfcd5f58abbc9feb4ace8f8f9a3e0131202026dad83a3ada7caafaaa0d0a3f6f692e9e5c4ecb8fcdaf5a01210020215e3c6e3b6d098deebadc9d092d4d7f39da0a5deb9cbe3c01010020217c181ced5e58bfcf8ac9691facbc0b7fde090e3f2c0acf00a0a020203a4d6e8bee1fadfe3fcb2eebfd88e818a88e4c5e1c093801206020276b8d8fccd85e0d5d38be2efc2c7d8eee4b5f8bfc4fb83c01006020231cdc8dbdde3a4ab9d96c98b90dacbbe82e9a9e5d1f595c00606020205d098effdaa9f8ab982a7c9dffa83f1cce1d6dfb8f2a4a01104020208d5f3e3f1ffabf59ec4ed9681b482c184f3f9abe08defc00404020207b3bcf0b9ec8df1f9c5fe87aaabe2b3fe9dbe99d8ededc0131201020184a6879d97b7ebd48ffecafac4a994d8c6b39da1ca9089c41010010218a9f090f6a58e8c9083c6f0f7db9a9ab39185e1df9fe6d00a0a010204b9fee8dc, 0x10202030b020902011200300436030502040200020302030e040a0401060306030d0601020202040c020802010603060301b48b4ab13ebf0190ee08cbf028b79d43cf882387e10013dfb5b3f1fffc1010020202f1f3b0f8f2daf3c39ad8800a0a020233dc8b80c2a580e7b694c01306020204e6989ce6b4f2f7c888be801006020206abfc98e4c18cfbdb869280060602020f8cf98ffd95cdfdb589d880130402020397d9d185bcbea8f3cd9dc01004020201aeadfebd9de6c9e9f6eac00604020219f6b1a9aad084f898b3f8c0040402020b908da5f5eea6f1bbecc5901111010249d6e5ea9a99e5b4e3c5a80a0a010236ceb1b6adf1e1b8b4cda8080801025f9dabf8d2d184bc80ab961306010207bcf3dcb9f8d597eca8ca801006010207fbdb9c82fa8aaabf958088060601020db5e5fab5a7a2c8ff97eca21304010203dabbe38ddfe28a85a8ca881004010207d4f6acfaa5c4f9a3a7eaa00604010215a1f6f4a69ad98ce1b790a8040401020796c489e1cbbc81d5e2fcb01111000271bce6bac1d8a8dbb5ecf40a0a000231d5c3e1b1fb9bedcff7900808000241fce6d19cdc959c8e8a8c1306000208aa86c1e58cf8e2c489c7901006000206e6c29de9bea0fc87e58b90060600020d93f68e8aa6b9e7a8bb8bb41304000203a8b197bea4aec78ea3b0b81004000208f8afcbb0e0e782b69fc6800604000215a480c0fe, 0x1b8cff08f8192c2c18194f8b1eac812030202068e98f691a0e3b8f5d5f9dbf4d7e6d4e9a089eebcdacdfa9de0e9980702020202b09882b3e3838ba0dda0dee2a3a5c7ec8be5f9fba5ac99eceda01212010256f6ebc9a1ad90fada9ad09c80d8d7a3d888c79dab94d9c5e3b9e8e6120e010201f8d7c7c7c6e1e989a1cf9985b3ab988589e2f4f5ffa9ac8bb2c29c0e0e01025ad3aebfbfe79db19deefdd3f3d9818688f38bd5baa8c9e3ccfdf208070102029beeb598d29fa1c8cdb5a7dfa7a283eca3acf596da9ecd9ae00707010204cfdba3b297a793d7deccb190fb8ab2f9b3e2fcecb2c5cd8cb881e0120401027de4c7ceeebb8fc89da885efcfe4efaeb48b88c9aeefdca7e2f00e04010204aae2a3aaeffdd085cdb2f7a1bc92949892cccd84dbd28a96a01203010205b8f7f8bdb5a9e6f1cde8b88e8dfe86a4fcb6cae7a3f4f7f4bcdda012120002609dc5addfdfa3eeafb8f5befdfcddddb6eff782a2f2cc8df9a6fbc8120e000201cbd88ebbdc86f9fbf4f7cbf39989bbc2cbbd87a79bd0e3f6f287f00e0e000251a0a9ddc98fc1e7fda1b5ded6e9f7d6a7dbddfbeeb3dfa9b5dcfc070700020593a0a2e2bbd391a6c0b6ead0a985dbc38dd0a2bc91d1dc81f286f01203000205c18981aeccc4af98aa9c858d8eafc0e9e09dc5a5fd85f2b495d9a8197df4e0e0c3e294d78a91e0ab94b5c4d3bcc4e5c8b4000e020102, 0x103030302020a12120e0707070705120303030612120e0e070705051203030306060e0201020202030b0209020112003004360301010b02020202020412120e0e080812070e0707071204070412030f000a1212120e0e0e12070e070707061212120e0e0e12070e07070706060e0201020202030b020902011200300436030504020600020304030e040a0401060306030b020202020204010102000402020417c3ac1fedaa73bbfd3c8ba8010bf8c8ea8ffea6dae9f1ad8cf9dfc1d1d391f1a1acb9d40495e3038bca01e18856a92af8bf3ee0ea2391d70fa9ae001dce9b9ca0aba3b7ddbce18fb9ad9ae88fa5dceea28ed803bbef0ad68b1cce9c0ebbd727bfa910e1fe3496c81db99b000bf1ffb28ff2f4e8b4ead2c3f1a5e5c0ea9ac4e4e2f58c1fb3c02a93f40198c8ff4f81e41ab49d13cdbb618ff0338e950006b9efaa8a90daa4fdac8d918f9e9387be9dd38bb297fc131202020682b9ef82ebfd8de595cbcda195d0d6c8d0d7efc3c58cf1f39cc01212020249c6d8c6f1b3c4a8feed97c1eefbdee484c1fac2938efffac08284f80e0e02023fa1dea5fed9bb97cce5c8f3d1ba99f3b2fb9297d7b497fefed9bc0f09020201cfeee58bf6b8cde589e882f4e9edd8a499c5dbdeb583ec82b2c00707020202ecb9f5aaa0f085b886fd8fc1f3b7d4ef8180b199dc86fe9cbbf4e00606020262ec9ca6a3cbadb1c790a3c4, 0x11313131211110e060e03090202020a010d0000000a1313131211110e090e03090202020a010d0000000a1313131211110e090e03090202020a010d0000000a06110200020202041313131211110f090e060e03090202020d0004000a1313131211110f090e090e030a02090202020d000a1313131211110f090e090e030a02090202020d000a061313131211110f0b0f090e0309020202080000000a1313131211110f0b0f090e0309020202080000000a1313131211110f0b0f090e0309020202080000000a06010112120f0f07070705120412030e0304030f0000000a12120f0f0707070512030e030612120f0f0707070512030e0306060e02010202020310020c020006030603011313131211110f0b13030d0302020901040000000a1313131211110f0b13030d0302020901040000000a1313131211110f0b13030d0302020901040000000a06110200020202041313131211110e0e0f0b0d0303030902020204000a1313131211110e0e0f0b0d0303030902020204000a1313131211110e0e0f0b0d0303030902020204000a061313131211110e0e0f0b0d0303030902020200000a1313131211110e0e0f0b0d0303030902020200000a1313131211110e0e0f0b0d0303030902020200000a060101121212100e0e0f0b07070905070512] private def node1554:Certificate:=PackedParametricCertificateData.decode 9 data1554 private def data1598:List Nat:=[ 0x10b10080908050410031102130102000a1310110e0f0b10080908050410031102130102000a1310110e0f0b10080908050410031102130102000a06100204060202031204030202020310100f091008090809070f060e061003080205020a13101210110e100809080f0608060706080205020a12100f09100809080907080610051003080203020a060e0201020202030b02090201120030043603010a0209020402010a0408030b020202020204011310110e0a0911081008090809071006080206020a1310110e0a0911081008090809071006080206020a1310110e0a0911081008090809071006080206020a060e0201020202030b020902011200300436030e060d0203060302030a020902020201040406030b0202020202040e040002020603011310110e090911081008090810060404080206020a1310110e090911081008090810060404080206020a1310110e090911081008090810060404080206020a060e0201020202030b02090201120030043603110404020202030a020902020201040406031310110e090911081008090810060404080206020a1310110e090911081008090810060404080206020a1310110e090911081008090810060404080206020a060a040306010c00080416030b0209020112003004360311040402020203090c020801060004041203010e0400020206030102000402020301, 0x113131310110e110c0f0b100811020602090101010a13131310110e110b0f0b100811020602090101010a13131310110e110c0f0b100811020602090101010a061102000202020413131310110e110c0f0b100811020902060201010a13131310110e110b0f0b100811020902060201010a13131310110e110c0f0b100811020902060201010a0613131310110e110c0f0b100811020902060201010a13131310110e110b0f0b100811020902060201010a13131310110e110c0f0b100811020902060201010a0601011312111112101010100809080b051302080203020a1312111112101010100809080b051302080203020a1312111112101010100809080b051302080203020a060e0201020202030b0209020112003004360301100404020202030b0202020202041310110e0f] private def node1598:Certificate:=PackedParametricCertificateData.decode 9 data1598 private def node1599:Certificate:=.split node1554 node1598 private def node1600:Certificate:=.split node1503 node1599 private def node1601:Certificate:=.split node1493 node1600 private def node1602:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node1601 private def node1603:Certificate:=.positive 3 [(1,0),(2,1),(2,4)] node1602 private def node1604:Certificate:=.positive 4 [(4,0),(1,3),(3,5)] node1603 private def node1605:Certificate:=.positive 1 [(3,0),(2,3)] node1604 private def data1636:List Nat:=[ 0x1130e0b0a11080a08080813060d040a00080000000a130e0b0a11080a08080813060d040a00080000000a130e0b0a11080a08080813060d040a00080000000a0610080d0c090601120414030b020902011200300436030502040200020302030a02090202020104040603130e130d0b0a11080a08130608040f010f000a000a130e130d0b0a11080a081306080413030f000a000a130e130d0b0a11080a081306080413030f000a000a060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030b02070203020302030c0402020206030b0808120706010a0412030d0d0b090a0808080e040d0409040403110008000a0d0d0b090a0808080e040d0409040604110008000a0d0d0b090a0808080e040d0409040604110008000a06100e0d0c08060118041a030b020902011200300436030502040200020302030a02090202020104040603110a11090b09100611041004100311020f0009110a110910090b0911041004100311020f0009110a11090b09110410041003100111000f0009060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030d08070606060212041a030c04010200020308030b0808120706010a04120301] private def node1636:Certificate:=PackedParametricCertificateData.decode 11 data1636 private def data1682:List Nat:=[ 0x198fcf993ba9bc3ccedd4d9f80f0d010217b8c8e3e2aacf809595fd8aa2df9780f2ffe8c808080102058fb6d1d999d3bcd8f58ca6959ee9b0a3fd91861306010204ae958dafa29af7f7ffd89da79cbad8bad38ee61006010216b9baf0b2cff3a0f6cc8382e3ef8be9e7fe820e0401020db694eeacc781ebc2c49ca1ce80d7a9a481f3c804040102719e97cbe195c2d7e8839a8283efa1c897e6e00602010204d8d389e294e484fbe1acd1a8b9c6e99e87da860f010102018dcdaab68aa5cda4deb5d9f8ba8c87d2b3ebb01111000201b686d8b1f4aedfaedfa894c8c2d0b48cb785f00f0d000217a7fe97cdb7cba6e5d4aadc95e1cc9e8ccbbec00808000204efd38fbabdd8bce2f4f084f2a9aafb9285e7f01306000204bcd4d7a3919fc1b0c78397b7c89c86b5ae95c00e0400020db0b8d7a481e188bad3b58eb8c7828c8afdace0040400026fcd9089cc9ed0c6ba96c3ecfd9aeede97b8b00602000204a682dda48ac8f9d9d0b0fbb09ffe83989ff1d00f01000201a2b58ba5dcacffb58afe81c1c5efe3df9889f0060100022adfe4ffda94d7c498baf9bfd3f7d7d0a7c390080000020cea958a91adc7d7c2b48080abb0dac5e3c8f01e35809fbab9d9ce94c1ce9cd9f00010100d06050c01120416030b020902011200300436030502040200020302030a020902020201040406030a0605020202040e0400020206030101, 0x1a8e3f0e29f888ff3b9b9c082a9c01212000202bad4eab6c3cfcf94a0c1fecaa09deaa996facca0120e000209dbbafb9f80cfcad59fa9abebf5dfd28cd1b0ff800e0e000234b7eed8c598bb8caaff81e493abdff09093e980070700020485ee8ba0838afaab9db38dc6afbaaaf3f8b091800f03000210d088b6d6a6b9c0eb87f3d7d4e2d7d089d3ddfa80191681a29bd5dfd5ecbebdd291cd800010040d06060c0106040a030b020902011200300436030502040200020302030e040a0401060306030d0601020202040c020802010603060303a129ac03d005ce16bedc39edd338a5d41591f30009cdb8a28fcded89e4effbb7dfea9c2cf2ec5399a50182c1843da993169ab12cb7d63f9da11ca08e00058bf7c6cac1ccedb889e78efac01111020201b5b1aa86dd96f2fdf3c8a58486b89d9de4a7d40f0d020217ddcae9f3abd98af69bccb8aa9da5eed7e6a3900808020204f5fd8992be8ca792f18fb7f986cacbbcc4d9cc130602020490db95859d8cce9f8eb3dac5c0a1d2bcf78de0100602021dd8addcd9fafaa1dfc4c8f4b7c7c4f5c7b5980e0402020d94a3fdc5b4e5add8d3f1d1f1dbbae6c581bb900404020259b6acf8f9959db4fed398b2bfa5bbd8cbeb800602020204c1e18ff5bef6f496afa98cd3b6d2f9b1f599e80f0102020187f0aeb8bfe3b6fb83ebdbe7abf7d4e3d2d7f01111010201b2aa8ce2bebef9, 0x102043af0eb588ee33cca8901cfc9da011192b59cdce9cee8aee3d0d8c98cc401dc9e01f6fb01c8b301e3ba1a91b13db5fe35c7f312a3a8000598c0ead8e2e8b783f494f7e4b8c0e05081e45cefc635d39a01e2c6e54c8f9d4becdd30999f01c8959c0008af96949bc3b4d580b896a3bcba80121202020497c2ded8dbd989d8e0d3879bdffabfc088a3bba01111020211a3de9fcab0b6ca9bcfa39bc4d69ec3ace6c0120e0202038fbc86c091e2ebe9d69384838de3e5d5d3c5e5800f0e020206bfdaf1848cb7b989c6a1b3befa859af2c2e5ffe00f0d020274f3af8eb096c3bcdbcc999facd5b8efa1f080070702020886f09787a6bce79ea4d2ede6b7dbea97929eb5a00e04020236fc99c3c88cd9ae95c9adb1eaa49ec7daef80120302020587a18bc0b1ace6eaa891fa879bd587b3fbadddc00f03020207f8e8869de1afc2d599b0c7feecfcd3d3b1e8b1c007000202089bceccf1efe596dde8d497aec7eacafcaf801212010203cfecb3c986c4f9c7d5c79caba8f0dad8acafc4e0120e010209d8d1aecdabbadb9cc2e5b1c7f2f39acba3949ce80f0d01020ae988c694aaba9aa9bf95d9cd8e92cebcd6a00707010203ef95c19483f1bb94bdfbf3bb8cf4f6c2a98eb08e0e04010206f786dca4faade08ae4ccc4c085dbf98edde01203010244a1f3988285b5afa8ebdd958895b99ba1f8f6b80f0301020f98e9a7e2a0ed, 0x1090202020d000a060e02010202020401131313121111100e0e040e0302010a00090004000a131313121111100e0e040e0302010a00090004000a131313121111100e0e040e0302010a00090004000a061212100e0f0e12070707070512040e030a0300000a12120f0e1207070707050e030612120f0e0f07070707050e0306060110020c020006030603011111130e130d0d0d0909110813030901010102000a1111130e130d0d0d0909110813030901010102000a1111130e130d0d0d0909110813030901010102000a06110200020202041111130e130d11080606130303030a00090002000a1111130e130d11080606130303030a00090002000a1111130e130d11080606130303030a00090002000a060e020102020204011111130e130d11081303030302020101090000000a1111130e130d11081303030302020101090000000a1111130e130d11081303030302020101090000000a0612120f0e0f0d07070705070405041203030300000a12120f0e07070705120303030612120f0e07070505120303030606010b0209020112003004360301010b02020202020412120f0d12070e0707070805070412030f0308000a1212120e0f0e12070e070707061212120e0f0e12070e0707070606100204060202030b020902011200300436030504020600020304030e040a0401060306030b020202020204010102000402, 0x113131111100e0e040d040e030b03020209010d000a13131111100e0e040d040e030b03020209010d000a13131111100e0e040d040e030b03020209010d000a0611020002020204131313121111100e0e040e030b03090202020d000a131313121111100e0e040e030b03090202020d000a131313121111100e0e040e030b03] private def node1682:Certificate:=PackedParametricCertificateData.decode 9 data1682 private def data1703:List Nat:=[ 0x1100e100d0f0d110a0f0a110810081102060201010a100e100d0f0d110a0f0a110810081102060201010a100e100d0f0d110a0f0a110810081102060201010a060f040e0807060012041404110e100e100d0f0d110a100810030602030101010a110e100e100d0f0d110a100810031102060203010a110e100e100d0f0d110a100810031102060203010a060e02010202020401100e100d0a0910080a06080610030802030209000a100e100d0a0910080a06080610030802030209000a100e100d0a0910080a06080610030802030209000a06100d0f0d0f0b10080908080609051003080203020a100d0f0d0f0b10080908080609051003080203020a100d0f0d0f0b10080908080609051003080203020a06010b0209020112003004360301100404020202030b020202020204100e100d0f0d100809080a0608061003080203020a100e100d0f0d100809080a0608061003080203020a100e100d0f0d100809080a0608061003080203020a06100204060202030b020902011200300436030e020c0202060302030a0209020402010a0408030b020202020204010a0208020002030204090207020002030204] private def node1703:Certificate:=PackedParametricCertificateData.decode 9 data1703 private def node1704:Certificate:=.split node1682 node1703 private def node1705:Certificate:=.negative 1 [(1,0),(1,5),(1,7)] node1704 private def node1706:Certificate:=.split node1636 node1705 private def node1707:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node1706 private def node1708:Certificate:=.positive 3 [(1,0),(2,1),(2,4)] node1707 private def node1709:Certificate:=.positive 4 [(4,0),(1,3),(3,5)] node1708 private def data1751:List Nat:=[ 0x103050204020002030203010d060102020204070206020404030403131311110d0d0e080a0808080d06040403030a020a131311110d0d0e080a0808080d06040403030a020a131311110d0d0e080a0808080d06040403030a020a0610020b06090600060408030b02090201120030043603050204020002030203090208020204010204060311110d0d0e08080811040b0408040d0303030a020a11110d0d0e08080811040b0408040d0303030a020a11110d0d0e08080811040b0408040d0303030a020a060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e040002020603010c0402020206030b1c081205120102041e0313130e0e0d0d0b090e080a08080809040e0211000a13130e0e0d0d0b090e080a08080809040e0211000a13130e0e0d0d0b090e080a08080809040e0211000a06100a0b040806000c040e030b0209020112003004360305020402000203020309020802020401020406030d0d0e0a10090b090e080b040d030e021100090d0d0e0a10090b090e080b040d030e021100090d0d0e0a10090b090e080b040d030e02110009060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030d040606050602120416030c04010200020308030b1c081205120102041e0301, 0x113121111130d0c090a080d040a021100080003000a131211110c0b0c090a080d040a021100080003000a131211110c0b0c090a080d040a021100080003000a0610020b06090600060408030b020a02030c000c0410031104040202020311110d0d0e080a0813040d0404040d0303030a000a131311110d0d0e080a08080804040d0303030a000a131311110d0d0e080a08080804040d0303030a000a0610020b06090600060408030b020902011200300436] private def node1751:Certificate:=PackedParametricCertificateData.decode 11 data1751 private def data1809:List Nat:=[ 0x1c6f89cc2b2eb8da8e3e49c91819d8ddd98040301021b9fefeefede9ebab296d5ebe89cf3a293c39ae69096d4e9f084f6f9b3f7c8c7ace79ec1a807020102019f85e3c480adfcada8ba96aabbc08096d0f180b9b8a8ceacc1fd918bd690e289e6d7d0ffe81212000279b09ac1e0c4c3fd9298ffbc9bf2af819ae4f9ce96ecb3caedcca5f2edd8ace1b98985b090a4f80e0e000201cfd58fbfbbed93f082ce9cc881c6e1cdd9d893a2889fb8c098ade7c9dcf6ae9f9a80d99ad8d6b80e07000202e98ad8a5e792f8d1f6aff6e9abd6b1d5fd87cd879af4f89e87c2fffec1abe6fee5acb7f0d183f0070700020285a1ffffb7839ca380b0b8e8e6b682b1fdaba4fa9194a2a4e1a0a9bedfe380c8dd82c6e6f2f4f01203000205f8af8bf18aae998280adb69aabd3c69bfc8bcb87c9e2ba91dc8dde84d8aee0fba7a5ecb5dda0e0190bc7b38ee1d4ea83c794b998f29ae6e089f4c4a0d5f7a29295fdd7d781b3e68fb8000b0206060202030b02090201120030043603050204020002030203010d060102020204010d0a0a0a0e08080813060d060b060a04040411000a0d0a0a0a0e08080813060d060b060a04040411000a0d0a0a0a0e08080813060d060b060a04040411000a061008050600060308030b0209020112003004360305020402000203020309020802020401020406030d04090205020302040e0400020206030101, 0x1fca1c7dda9ffafb389d2981111020204badfbec49bf589d7dfdcbf8fba9aa79cdc9d95cfdbbea9ad8fe7ec9ac995d2ade8fec0ff9e110e020213f5b2ed918484d4bcb7a6f286f5bdec9fdcf0e683b0c4e4cfb3f9f9a4efcff4c1f4a9efe7fc0e0e020201a4a789f498908a888cf18e8e99bfb39f8dc6c3edaaf8b5c2da83f19ade8b88fad5a3b490b7f3960a0a020204ced8dac3e6c6f9859683d980dda0899b80edf186fbe884ff8cdda3d6bdddc68cd292b2e3c20e07020204c8a39c89f3a0c982ec8ecdc7e0a692b79bd59ce0d3cef1a4bbfcb7d9f29abbb0c1c2b892b68fc01203020206c68da58388ee97fa83ca869df8dec6f0b1ea87f49d84a89ce980b3a297c4f289abfbe5aecbe6e00a03020213e4fed7eba8ddedf8e79297abc8e396f1d1c6c893dda9eebcf5f8aeaef5e18e8893a6f0c4e40303020204f7f0a98ef59788a0bf99b5ddf9eaedaaee83ecbcb1b8baf2c8c3de86adadd9e9ecbef59d9dfa12120102338999f4e7a6c0e4a7c88fbecde7d382aab6c8cbf6f5eac2fdcb92b0ee8b99d9c0f493ad9bc1b00e0e010201c3cc94ebc1ea8d88d4d8cc86fb8db0daa99aa3c4b6dd938fcff296cbb2bd99898fbf8cabbcb4c00e07010203f2a999a3a2b29fb1b8c4d0cfccb8d88f8baeefb6a6cb94d8bf95c7b3e8cae0e9acaac59db8e6e01203010206b0c1de9a8a87c393a98cb4c282ffd2cc978483b4f0e2, 0x19683da99bab78df79196d4b3b3908283900707000204adbbeaeba7cbb5d5fc83db94ceded39683dfcef98ac8e7c18ba4a00e05000203d0b6cb8cb5b2d2d29584c9a4fb8f88e3e4a8dbf299f4c7c3eca4c00703000204abde80d39883df818fd1e88fe3a08aa195e3b6cf95cba0afefd4800503000201fbae9d95bc97e4c3d68bcda9d5fbe1e4b781e38ed2b4d883b3bd801908cfc78ee4cab4aedd9bc6a4ffa7cae3e181c2f5a0000b0206060202030b020a02030c000c0410031104040202020378d1c40abd960fb78d73d7cb011de9e5cdccb0bef8e9f0badceaa08aa3d09db9d0c888fecdd0d0a3e7c1a1928b958003a79a57b09055978801afeeb101058799e3b0ddf1caf2b082b5908fd5e3e5bddd8cea998bbdd68a90849c82a8f8a2f011f101a9d90185be368e0aee813cf28e3ced810ae8f60004b4a2ddfbfcb3b98deaf19080d6e0f3e3d89ca999edafdb99a8998099989085e5bcc805aec60bec840ecbcd02cdc333f8e324cdd036d1fa27a6e5000ab5b9a3b09d87d6b0b983f0c9d8acd4f0dce0a898bae6dfe7eedc9582a5fcbfc5a035b2bf228dfd0c94a84bac941494f105dd9c1ecd0ed6a40028b4acdaf797e2f5bea7a2fcf1fff4f1cffe9285b7e795e9acc3c7fc888bce8f8ca00196a4a80bc0e1189e8972c5ff69dfd30f8fb102bdfd7bad84000dcfaaf680fedbc58190e6c088dda9c3c490a388a3f9c6, 0x102020381dac886bffef2a6a7b7998690b6cde6f08fa4af81dcd4da8197f0120d020206ded4fb9d95e9c0d08488bbe4bc92f7c7938cef85adf2f1d8a00a0a020206e2af89ed8fea8bd3de8cc19dc797a3bd8bc580d186c8abcbb00707020203c482ddd18cf6aaa28ab79681e3cccff1baa3d1fa85dae7a4b8f0c00e0502020488edd0eabc9b8fc0e786b5c9b1b1bcab99f3ebc2efb0a8bbd58190080502022b85d5cab3f9a1b29d8af7b3f6edaa95feebe9b7dbbfcca8fa90070302020491d5b0fcedeaf1dabdf0c4e6ccf28795e2ceb8c6a694afb898a9f00503020201b5f3c0b99b8e879cbc91b7bbb8ce898f84d2daa7abbde281ee9df00300020213e3d7e19bb5d895d2aa84f5d9e3bdc3b2acdf9fc1f7dcabcfb012120102038ed4c698b38eeebac5879cb3ecfbd7cdf2b1a7a6d5c7b890b3fc8a0e0701026681d5abf3a29fa2f4abc485c48dd297f8aedfb1dbb4d3daf6b8b80e05010204fbf5baa7a4d8b4a3f089b4a4e0c786f6b7baba9fd9aceb8baed4e808050102028c97d3daf18ada8384c0a5e2c283d880b4a2908c95a28e96b00703010204f7a1cdf7dfa4f890f5f9a492b7e4f2a3a4b8f487f8ad96d5c6a9e00503010201948db990b0f5a4a6dbb6c0afacf2e49b83c2a4bdd2be9399ccd6e0030001020190b5ace2fbca9fdcfada89d0f69fab9d84a9918980ccebcb901212000203a681ded3d2dff2f5fef9, 0x105010202add7d2cdaeb7d6db8a86d1de9bc29de6b0e4d8c9fd91e2bad2edb2a7c2c3aac00303010210d2ec9791c982e7da9ab894b9afad9291b188a1e9d4c08bd8f4fdd1eab6dfdc8a900702010227c484b0e1e3e3e994fadfd8baefefafcfcab5d6b6d9aefea8d3f7eab485bed3b0120700020390ffceef82ba89d98f9af6eec0afdff3e0f3b6f5d8d9c8e9a4d5c6d7acad94e38fc00e07000212e1f5bec4eaeeb08bcdeed0dabdc5bf81cbc5a1c7a6c08d8fe2d9cf87eab5aab5800707000204b88a82faf199c69c95ea86e5ed82f8d2a8b9e7b3828f9391b1b68fd1f5bc9aa6fcc00505000201b6d6fee5bcb7e2dbe5e7cba3c19cd0c382c899dffffcb2b6fa84dce0ce86eba5a1b01915d4d1efb4a2f3c1d2aed2accaf797f8b3c3c3dbea97a0ead2abe2f0000b0206060202030b020a02050c03040311040402020203030401060202040e02000202020427e6a25a858248979c01ca82bf010e82848afa89a6a993e1a8c9c7e9888199f0f9f289ec4fc351ab01c6a902e7861491cd39b0c63aa7af1588b80001d882c6b9b1f08ebba1d38fb4bae5f6ccdcf48c9ddb980abab616adff1799d00ba4b12e9fd53793c621fff22af3e10008adeafef39a91d6d08cf38ff2ca8194b291979b85803adce04894cf60c8e16dffc610b1ca3d8dae3590880182ceff00029a89b4949cc393b6a8acb9c482f1b8c181c6fd9cb81212, 0x1aaf8e7b29abcb1a1c38cb4a6fd89b7e0b8e195900e0e020204d5cfa8c6e0cf8dd783a4cbff82c1eeb1c180c8d6c3acf8968295b687cdf4f1f6ae0d0c02021180b99198e1dc91e2b4d2bbda99af81c4ad99baf2effcc6ba9fe1b9cbf9f2dfae120a020215ffbe948cf5cb96ceb9c9dee184b1c0b9aceede91bcb1d7c4b6b5f9e3b5cadb900e07020230c28cb2cabeb69bb8d5cde9bffc9a9e83bff6d1eedbd6c4fd9ae7b6e7a5a29494e0070702020dfdcdc38bab95f5a0bbaba7b7cceca684ffb096eebb93c689d7b0e5edda93b0faaeac1305020248b8c7999c88c88f8cd9f1ef9edcca8786a8d3ced6adf3e3eb91e6fda6cdcbfad4120302020ef3ccf99bfffef8accbd8c485e4b0898daab8f8f7f697c1c4c3cfe0bdcdddf2ece40f0302020295c2a68cf8cd97f59d84c8ecb2dea489d98b9d9581d1a1bae4ce99dca1b28f8eec070302021e948dfea1cd9eecf7bef38987b7d6d5afe3ead7aff0bfbbe3fac9a1e7fcaea29da807000202019c9a9cd1f79393d6eac1f3f7aecbece1ebf6da84f1fb9584c6bdd59a81e784b0c412120102339c84d5c88da7b8dfb292e4cd87faaef0d68ac3ddef8281abe3b6fecea1c9c1a6d0120d0102038e8dd8d1c3d6f3dfa891d7b09bb6fba2f5bba7f68fe0dacf96ffcee69fc881d00e0701027080bc809cc9dafbdbafaafd90a691b2d0f1d8c8919c9298bec8d091e7a29c90c8c00c, 0x1131311110e0e0d0d08080d0303030902020200000a131311110e0e0d0d08080d0303030902020200000a060e0201020202040111110e0e0d0d0a0a08080d0302020a00090004000a11110e0e0d0d0a0a08080d0302020b000a0009000a11110e0e0d0d0a0a08080d0302020b000a0009000a0612120e0e1207070707041203040303030e0000000a12120e0e12070707120303030612120e0e12070707120303030606010b0209020112003004360301010b02020202020412120e0e120707070704120307030e00050000000a12120e0e12070707120307030612120e0e12070707120307030606100204060202030b02090201120030043603050402060002030403030401060202030b020202020204010a0607060204000a040e0435aac56a89b61cb08d18aee10109e1e191cdaaa5abe595d58afad2dec881edfbb1e0e49ee7bdd0aec8a009f2991ae3ac76d7e60187c8f7014b9fb7d3ad9c9ecb9986d296cddaae8fadd2958d8e8a82efb691d9e8e020e501ae9007f8ae09869718ddf333a2fa40de832698fe0005e0df9a848de6d684de829deae4e7e0b1d68d949aabf7c7f988a9a9d2e001caf41cd902fc8701cf8420ccab3492b82c839c3fc9a70002c2b5f5e5e8bdd5d9dc94fdd1fae4bdd9a7ef95becfb7bd98c7f5da9bf84ac7df0197c7800e8db53ef1e325baee5090b7748d2bc9d8000bbac4b4feae829490, 0x1c9ddeab5b2d797d8a00707010209fa84d7bbc381d781a3bea8c2a3ae8ea6ebf290c3d1fe9bef8ce1cfabd6f3e8dcf6a7d287f5e6f280ddea110301022bec8aa88ce38892da979fee9899fbadc2f1afe2acacabaceba4becbcbfbc4efa0eeec8b9a90a4c0050301022be3d3e2e889a4cbf6d7928694e7c794b1c3c6fd83f1cb8cc7c8ddb482acdff7a0cad293cafbdbb6d2ea0303010206bfb6dbca9ef9c1de88c7b6f7b6aeb5f88fa1ea98c498b5c4f2a1fa9ce8a5c6e0d8a5adcfcb9ca9a0ec12120002018b849a8baf8bddeacef0efc19599c4aef1b9e4bcc9c8bab1e8b7b8fadee4a2baf5c2b5b7d3dac5819cc00707000205e08394f9acbff2d190cd96dba1cfc581d9cbe3a7b6a3e687f5f8d1f1afa2f1f9b1f6b2c4f594d1eebec0070500022f85b1b18e9ae19784b7bb86eea3d3f0dacf959dc1f190cec3f4edeff9b9bd92b582e09ee6899986bf800505000201a4efcfa197f1f3b1c4d4deff88a4fc86fbdae08b9a9cf8a295cda8d5f6ffc5dcfa9ccddbabc0e6fade80192da7dbb99ca7e281abd2928ab8ae8a88f6dda8e089bfe993b1c0d0c0cefeb5cf88a8808000010101131311110e0e0d0d08080d0303030202090100000a131311110e0e0d0d08080d0303030202090100000a131311110e0e0d0d08080d0303030202090100000a0611020002020204131311110e0e0d0d08080d0303030902020200000a, 0x1c3c002c7d50fd0c22e9a883b8e8143a7f32298cb059ef56adfb60050c4d8c9f195d3b69ffba7fcce8381dcd3f088d5d39ceaa78ef6c0decaa78fb899f2c3c012120202588ae7acc2b1a2dcc7d3ebba9c97e580f9a4ba9af68193f5f5e993f1a9a9d0d5cdf3ffccdae1cef189c0120d020239cbd582a9d1a1f1e8b6ade8c8bbe699ed9de79cc6dbcece9bafecf9b3a19bdfb7a3b196a1cbfdce800e0c0202309da38fbe9d9bc28886eabea38ef1968bb9df81f3dbf7fbf6e9f084a09798fa909dfe9ca49ab2c980070702020496e1dcc385cb80aaa1a4f3eabfad8ab4a3a4aed6c5ae96e191a5ca94bfd7aef181d1c2c381c39ca6aac0070502023dfceb859bebc582808292dfaef3829dacee8bc4cf8aacd0ddcc8b8e9cc48695c1dc8de3f2fbcaafa7800704020201c6f89af1badeccc0fef29c8bc4ecbbf9f8e6c69fad8c80f5d8c1aea3d9eac4bac3cdd0aa84ece78580030302020cf4968ddb9e9d8781daf4fda19cfa8182bba0bfdcb090e5b3d391f98082d48bf6f0dbfff7939899e7800000020223c98e9fbbdd8a84fff7b6c6a1bcdde9bd96beecc6dadaeea8c0afaed0cef6a3ae9da08b92fae8d58012120102018aeceaacbfebebc1c1c491dea9f0c1b598c291d6dfbbf689bab5c7b6a2e99cc58092a1ffbd919dd5f0b00a07010208998c9b8580dfb7cfbfcde996bfeee7f2fbbaeaf9fe8a80a3d987beb79aa782, 0x11001000201acb7a2bc88e681a1e9b4a2a0f7f2e0b5efb6b791aa87ce0201000205b18abcb690fb86f5f386bcd6bbbda3dc9eb9a8cdb5c2c80d00000202a1a19ffdbbeade90d8a6c5c4a9f6eef8c3fdabf3b2e9e40c00000206d1a18da1b4969ee4c590e092c9cef4b792efdabec09c8a0a0000022089d5a79ad8c2bab286abecf4f8a69d91fc839ad393c7f01e07e684c4aa9acebdedc2f2bbbde98cadb6e0000df1f007a0c97987dd72b6b80103ef91eec5f4b291f980e1b787b69fa1d281a49fd2fcc5a8dcedc8819a8cf7b7cfb3c7e3ccec3a82966acdd70d85de23c5e40102f4b0a3bddddfb4a8fbb5e19dc89c9eadeea7beafd6eeb583e2c2a9e2b4df84eabe9af1b4a00196e503a59603a5a701978016c89d308bc43bffbb22bc96000af8eb82e7d2efc3c5c6d9bfeac3ebb8ea92b8ed9b9886dc87869af5e3e2e9a3c883def69fc00496ac019e47a4b7438d8217df8e2daabf0cafa6099c8c0004ea9adafebcd9b386dcc3bcb289d7f9ab9afcda9383f594d0e7c0c59d80c69ac1daf7f0d8c022b9c12b94ee7a93f20182ef8f2590ec34eb9363a1bf72fbe8000290ebbbd6ccb983f69588929ecaefd595b0dfa0a4d0a3c4b299f9eeeaf0afbda0e5d783e0c049c1c1018eefdc39f2cd0bbbd71fae9e42998922f38608990001b88aa499dbfef68dfda1d2f3ddfae1f1abcff2ae89afecc8dac0b3a49880b78df2c0a4, 0x1e3d9c2bfeac896e997c78a80010102020ae9a0d7f4eff4bc8effe5a19cdbc1eb8fb3c2d5a785cae00d0002020ef2ca8ea8eaa68cff8ebeff90c2cbb78de4a9e594c7ebe00c00020212df93e49fc2b582e1f5febfbeb0c5afe692dfdbb7e9e5a0000002020789eb98c099a49f86c8b8aee9b9da83bac4abc6a998d1e00e0e010201dfe1b592bfe49cada6aa8e8accc3bfaf99f9a7f6a2c1880c0c01021abb8bd4c4e5feabccfddeafa9fa98ea89e9d0ddd7b5de900303010201c3ea838d98d69be1c2cee6c0e5e7ad85cfcebe97aaff900202010204cbbcf9b1a3d9b0c18ffefbedeeaafde8ff96fd8dc2e8130101027380f0aef6d29896ec8b85b6d1ec8be2ccbe9e97c38cd01201010204bddbebcdb2b0ec9a8be5bed088d9bef9eddac381f4d9f80101010210b9b4fdff81a2aa8e9eb8efb3acd3d7cdc3b69c9afefae80d00010218d9f7b5c0e58dd5dfb692c4ab98f4d9fc97bad2c8b2d7ac0c00010213a3b7b9d9c3b08583c1e8eccfa4cc93d28dc9cdf6e4d38411110002028cd2c3bfa690c181e0fca6f390abfde18fc8b1c1efcac0110c00023b9af1ccf593ff9defa7bace8ee081d8dbf48bafc6e8ee0c0c000219e2c4c9fcd6ae89eedad58f8aafc5a0a795c797f89bb3d60c0b000210e5fff0f0dbeac1bcdcbe9ae4eecee2808cccf4f7c0a20202000205c7dd8fe1e0e2d4bedd94dd8aedafaed39580d9a194b0c8, 0x1de8c9bc5a0e789f183d3c8c2a0010101020cbab7b18ec1d197d7aabff29d92cde19fade8131200021de1cdb2b3a1b9da9ec39bdde78ff884dc801212000205cafe8e81e4c1d6ad95effb96dd9f91d6b1a01111000262adbfd1b1f8eaaa94d197a7fb80d9c0f7d8110c000205daaabddfa3c39aa986ecfbcdf9af9fba84a00c0c000207ddf3dabdf6e9b7ce83cfd0d0c3a08795e9a81002000210a8e0edd582ce95c7b29fbcd0ad8edde7f01101000219afc4e0cabfffb69fd0aa99a6ec9bf8c5c00c0100021392a787c6a794dea7d7e3bd8ef4b7cddc9ff00b01000205ecd290b1808785ecb58de8b18481e7d0ad8001010002149da3a1a6d0d6d6a3ddfd9caadbbde2d88e801e6af2c8b1ece3858eaec698e0001102000202020401aace01989d67df19f60ec3cc22cbef3ff7f82c99810002bf88b7d4f898ade989b1d289d0e9e3deabe8e001cdc101e4a203d8e703eeae249bd840fb950bf3cf29cb880001a0d7b0fce8dac7b4b1bcefe3b596ed91befe8048a79f018de4b642c09f048ca524cb9a45f9b920dbf643910056d5aed2a0abeae5db9dc18187bec288b2e00e0e020201e3a68ce0d78bdb93d3a6b2f9b5ddcedee293d5ded6a0a00c0c020217a49d8fe297afa6ae89e9e1acbdf8d198cfe4ece78696e0030302021eb0d1d0aa83bf94dc96b9a6f9d3caa2c9edf0c1b5c7e00202020264d3b7adeb828de097a9fb, 0x103030d020a020402130100000a131211110d0d0c0c03030d020a020402130100000a131211110d0d0c0c03030d020a020402130100000a060e020102020204011fbb33e0069a05fd16c7f433b0e93bc1f61bfa970020d486da88f6e6dd90918ab7a5c85cb82ef601d1fb0290df2697d033b8db25b8bf2ca9c00002e6fc8998f9f0d8c0f3f99eade01212020206ae8098d1e0d0fe8fbd81bed3c7c4b8bbf7c0110c020207c5a98ad7fcee9ce296b291c38699c6c69d800c0c020206a7e6d989dca6bab9c68cf586b785cccdc5a002020202079a9a9d8e83db849d9e89fc8ba6b882e6f8c0110102020481a5e2dbf6b7b9ecb8a8d3dfebc1dd8ed6c00c0102020ce0aedfb9a5e0819597c3b6cfcb8bbec886b00b01020206f6befe9bb8eae8b7e8c2b7c0e1ce94dbe3d0010102020dbcb6eb949b88ace7cae280e8aefb89edd5f81312010214a1c1bbd9bfc4bfcfc5ccb189a6eb9c8dc812120102068ff695dc87ab9191d58fe68cc8e6929bd2880d0d010201d7b79683caa5fc9fcaa4dcadc6e9f1a7c2110c010207a19a9e97afacfc8e8ab5a185a9ff8efce6d80c0c010206e7b4b1cbb6f2c0dc94aafae8e9f8bfabeaa60202010207e981f3e892d1df89a4f3d491abf7ecf484f81101010205df919ea786adbecfcba4818380d081f091e80c0101020ebcb3d4eb8cb8c2cde093c08beff09cb1d5c80b01010205a9b7fedfaa, 0x180a4ece0f4b0d7bda00c02020245a7e89ef3a1e6f8e1da85aa9ebeb583800b02020201a093fbb1bbd9d0fe90b091a6e6d4adc4800a0202020496fae0f29d97dac9e3f5cbf996c9b5e2f00202020203dbe087c6f081d3ee9cadf2c2a684ff99b01212010229d0fbf4f3d6be9be9ff92abc9a7bba1c81111010267b993cdbff19cd7e2bfc2b2f8d297c3b00d0d010201c4a8c2958dc7b9c7dcc785bfd38c83ba80110c01020183fb86d0cea4d3d6b3f691f3d6ddd0a8e00c0c010277f4afdf98af9f81dba880d5eecbf989800c0201027295fc92d6c2b9a2daacbfeadca0f694d00b02010201a2819dae85e7d3af87a8c7cab7f8cac7900a02010203f6aaaddb86ebf8cae7b08993a5cdcba6b40202010203ddf6989ed6a5baaeb0be98eadbcad9e7a4111100026885b19196c1b0bbceefa6b1d4d987f4e0120d000201a0d9e9a5c89e8598e184f8dcade9f999a00d0d00027cce8dbafdc2b589c796a4859acad2acf80c0c000240c5b8b1e1968c898099eae7bdb4fe97a80c0b00020181b5d1fab5958fd087a6a091928cd98f800c0200027380c78d93e8b1a3cbcabfa1d382b0a5800b02000201a3daa8a1cfd8d6f6b5dc979390a79f8c800a02000203f3a388cb8fca97c792d386dd99dea7ba900202000203dee8958c99fafd8cc0a1a8bca0958f9ed01e149aa9d3e1eba2a1c4dea00011020002020204131211110d0d0c0c, 0x12edae65fdad13bd0b001fbdb0101a1a08499e4dce1f1e784903c971e8436c6148c20a5dc42aecf2c888408d4bb0003b5c3ddaec4a8fbcbb18cd2e0131202020baa9dd8dcd5b3c2e58cdaa4e18bcdd3f0111102026888b3be8cf5bac8b2f596d59d94e68ea8120d02020193aa9aeba9ffa9aee7eec4ecc4f6b8fae80d0d020278cec68ccc93bad4ab8bf6de8ce4cbfff60c0c0202318f95d7afbcd2a1e6d1c5f385c297c3aa0c0b02020189c7c0c3b6f69493] private def node1809:Certificate:=PackedParametricCertificateData.decode 9 data1809 private def data1818:List Nat:=[ 0x113130d0d0c0b100809080d0309020602060101010a13130d0d0c0b1008090813030d030902060201010a13130d0d0c0b1008090813030d030902060201010a060f0c0d0807120026042c040f040c0406060302040e020b0205040202040204100404020202030b0202020202040b040804020600020408040a0607060204000a040e04090606060104000e041204] private def node1818:Certificate:=PackedParametricCertificateData.decode 9 data1818 private def node1819:Certificate:=.split node1809 node1818 private def node1820:Certificate:=.negative 11 [(11,0),(3,4),(2,6),(9,7)] node1819 private def node1821:Certificate:=.split node1751 node1820 private def node1822:Certificate:=.positive 4 [(4,0),(3,5),(1,7)] node1821 private def data1873:List Nat:=[ 0x10c0416030b02090201120030043603050204020002030203010806070601040304040111110d0d11080e080a0808080d06040403030a000a11110d0d0e080a0808080d06040403030a020a000a11110d0d0e080a0808080d06040403030a020a000a061008050600060308030b020902011200300436030502040200020302030902070202060306030d0d0e0808081306110408040d0303030c020a020a11110d0d0e08080813061104080403030c020a020a11110d0d0e08080813061104080403030c020a020a060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e040002020603010c0402020206030b1c081205120102041e030d0d110a0b090e080a08080813040904040311000a0d0d110a0b090e080a08080813040904060411000a0d0d110a0b090e080a08080813040904060411000a0610060a0408060008040a030b020902011200300436030502040200020302030902070202060306030d0d0e0a10090b090e080b040d030e021100090d0d0e0a10090b090e080d0311020e021100090d0d0e0a10090b090e080d0311020e02110009060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030602040202060306030c04010200020308030b1c081205120102041e0301, 0x1120d0d0d110b0b0b130a0d0a0b0a0a02020201010a120d0d0d110b0b0b130a0d0a0b0a0a02020201010a120d0d0d110b0b0b130a0d0a0b0a0a02020201010a060c020b02000403040411110d0d110b130a100a0a090c010a0102010d000a1111120d0d0d100a0a090a020c010a0102010d000a1111120d0d0d100a0a090a020c010a0102010d000a061111130d0d0d100a0a090a080a0201010e0008000a1111130d0d0d100a0a090a080a0201010e0008000a1111130d0d0d100a0a090a080a0201010e0008000a060101110404020202030d020a02060201080406040e020002020204130d0b0b100a0a0810050d040a021100080003000a130d0b0b100a0a0810050d040a021100080003000a130d0b0b100a0a0810050d040a021100080003000a060a02090204040302030b0209020312000c0412031104040202020311110d0d11080e080a08080804040d030c000a000a11110d0d11080e080a08080804040d030c000a000a11110d0d11080e080a08080804040d030c000a000a061016090c021200] private def node1873:Certificate:=PackedParametricCertificateData.decode 11 data1873 private def data1910:List Nat:=[ 0x199eef80c02010204aea3dbde8cb6a1a5c7c5f6c49aa9868a9ec8800c01010216a7fbf38ae2f0e0fc83a0c5a6f8a3dfc183a0030001020db687eeb6dc9495f4d9e8ee9fab9ee2eba4ebe800000102719d9aaeb993c5d5de96a5dda3fbbdd3c9a4c00d0d000204efced2cbd3aba98e9afcb0ff90d29fb7b7db82130c000204a5ebe5c4e580cbf19eadd587dda7a284f4e588100c00022af09af1b68acba5e8a595ccea95a78a88bfa20a0a000201b684cfc5f4ea85f3e3c59191faa7b8eae0b5d81005000201a2b6ec81b1b28fdba087efdfa3e6b4a4dddea00805000217a7e1c8c8d79ee1ccbefcbef885ccbffcbc87900d0400020cea87affdce80bbd6cfb0dc8cc5cffc8ade800c02000204bcd1dc9d92cb90bd9ea487968a9ca1eaf5eb90030000020db0abdcd1c081f5ada0d4cecde4e5d8a587c8b0000000026fcc92df84c9f2b4f7bab599c0a2ab84ddd1d01e34ffec92e8ede1b0d2a4b1c4c000100204060202030b0209020312000c0412031104040202020311110d0d0c0911080c080a040d030c02110000000a11110d0d0c0911080c080a040d030c02110000000a11110d0d0c0911080c080a040d030c02110000000a061002060402020302030b02090201120030043603050204020002030203010e06070605060102040804010a0205020302030204010b0c080805060302040c030712060404060016041604, 0x183cdb9c00c000002078fa6e7f5aa8b93ff91f0e2d0020000020185fc84e6caf6c7aaf1ef93f00100000203a8d790d8d9bc89bec0eac780000000020280bfb2e2b4e0caceeb978d881e1df7f7cd9cc0000101110404020202030d04080401060306040e02000202020405cd03cf29ab03a215928038a5d539edc816bee90009cdab92fba5abbe98a88bc1b1e4a83da8a40182c0f9539abe2cf2831c9fd53f9d982cb8a3169a8600058bf9a3b0d5839cebcacc89f1b00d0d020204f5f8c2d8d4ffbea5f68e8af4f1c387958b9fa2130c020204c1dadce1a4ebd1ee809bf5a0baf4a6c5eeedf20a0a020201b5af9fccc5948491a0afdbced995d288acade0100502020187f2a4f9a2f9c2c9c8e8efe7e8f086e3b5d5e00805020217ddade7f68883b2fda8cab1c0f099b99ea5c4a00c0202020490e9a8f39ccdf5b09accbabca3a0f599edc78a0c0102021dc7aeec859dcba488bd9b90f0f1a8b98596b6030002020d94979f9ecfe5aad19ae786fbdcbacebecf95e00000020259b5c6bcdfd2a09bb3d8b588e1ddaba1e3beb00d0d0102058fb1f5bdbad4b2a5c6b28af2c6f7f2ff8c9290130c010204d8ccb0b1cecbbda3a6c6dc81f38ea0888fbde00a0a010201b2a7fab0abb9c5bfd5c6ddb5d7b3d8dc89c49010050102018dcfa8beb7c4dd83ba8c97be9c87e697b5d1a00805010217b8abe68ce69ef7faf4d1f989b8e8e6e7, 0x1e1d6ebd9f99dcecc93b4ecea86f2a9d7ceafefcfe00a00000203a88fe490bdd6c383afddc9e3e6889bcad9dfc6a1a7da941e02e0a7cfb6b6899ad99ac2928cfc8fc8daf000018bdb43a646ae019f9622f09043b3b728f1e608f7bb0006f08accadb4c7e01111020211eff6fdf2cc96f4c0b7eca00d0d02021ffac0e0a2ed9f82ccaefcb00c0c020204fa98c1edbf9b8c9995c7b4d00c02020201bebaaeddbf94a584b5deb0800c01020203c4f99a808ae68ff2ed8da4c00c00020207e0f68db6c4e384849ce0d1800200020278fab9e3fdac8b8d99daf0c00100020202e4d0e6dfedbbfea6a0b7a6c00000020202d686ebb4e0e0928de5c2a6e01111010212d0c6bbbb9faeeeff80f8b80d0d010220aa9e83df98e9cdc9cbd2d20c0c010204ced4eed1a2e2c4a0c79c9c860a0a01021acbdfdb99b9aeea96cca1d80c02010202b69283f89ab292d08692a5b00c010102038ce7c5d0de9185e1ce8ebca80c0001020790d0b5d1d0b0cce2ec8ae8f8020001020193d4b38397a89996e591f2c00100010202f5fbc8abe7bdece7ba86d5c00000010202a99eefd0aadb8ee7e7eee3e81111000210d69bd283da84f2dde0ba800d0d000215d0beaccfaf83ccbe8299b00c0c000204c1e7dcc9c9a7c3d0d1ecf4980a0a000229beefe3e794c290f782ab880c02000202dd93ab9cd596d4a4c9d4cef00c01000202d98bfca9e09bd6ca, 0x1b00a00020204aafebf9d8d99cbbed2809eced5afa4e4b9b5d1a2cfb8c00000020203d78081d3f189cfe0ecce86f0de85ddf1c391ada9b4fec011110102029cffcad3fcd6bf9dca97de8388bbefecb282bff6b2ef800d0d0102019d80b4adce93b0e5a4c3b4eaacd490c29ffe96fee3e4de0c0c01020882b7c48b8a9db2fae8b2d1e886c29296c8bdf3e8bcba820c07010226bc82dcd1c292dae6c3c5d7ec969dab9bd7d2c5e0a2dce00c02010201f789c1d7f8b9a6e4d3f3deaca2b9aeacd79499b9fa89a207020102428ffa89d2a4dd88b78fbbc7ced7d78fa6d9ef94b58bbb9a0c0101021cf5b69d92908ba4bcf4b0ffa180a9d5e4f39ad6ffaef5d8010101020c9490b9a5c0e4ce8abba2b1e0ac998eabe2bfb7c68ca3c80a0001020585ed8ea2ece199baf7eca4b9d891fdd6aac999ecd2a7be1111000201e6e984a6dd9fddd0c1eec298f88ca6d1e5849695eaeda00c0c000207b390b8dfdbe6df828ca7d0e6db98bfe992d9ecd5f9eec00a0a000202aedf9698b0d1f2cfe0ad8dc0cdd789a681c3a9b4dee5b00c0700021fe593a1b4b8c9b4baeba1d9a4c5b6d3f380fb85cde6ecf00c02000204eced91cee8c4c7e5cee5f1e28c9892c3a9f8868eeaf98c0702000244d2a29face5e3e9d4aea7b3eee7e0cbde9fc6ecdeb28f9c0c0100021b86ddc994a2eacde5d7e09abf98e5c086b7c3fbab8af0c0010100020baead, 0x10694ba82f1a4e582aea58cd8f58d8088be849ebb9eaa99900c0700020ef5c9a6b6a0c1b8a1ca82a5b6d4cfc892b7fdfca193bda60702000230fbbd91a492baeb98b2a4a4f9f3e4a2a39c89bbe2eca2c80202000204abd2a9b595df95b6e7e1defb89dabdce96cdeca3bff2d80a0100020ca48d97ddc8d3dcfdcbd4fdeaf798f5dcbcdadc82ffeec00d0000020eb2c3af91b1fbfdbaa784c7bcc0e9caabf7afdab8edb01e01ae9ec9e3e2c59baceafff685a7f8c3dff0000c020b020004030404019a08ff40ed24da1bb3c836a9a1378ee61b9fef005dcbed98f5e49ab280b69787ceb2f4a08cfae031b301809e62a119f518c78e31d88f1fd6a53abefc00238ddad7aa898ed5c5a7f29de9e7f6c3f1bde049a09d0192bde82edfd31c90bd24c6f84980e1179edc0da5ae0029f78cf1afb9edab939efed3efb7b09fc5b01111020201d2ace7c3ae8082ae92e782fbb4c7b4d198fd99d0f386f00c0c020202eadcfdd492ca9a86d9c183edb3e292b5f6e6dd8a9285a00c0702023b8cbca184ef90c0ada1b3a286c3f7ef8fa2e491fc9495800702020236d6defbc889f9d0eac8a2d082c2aeb0f2a29be1ee89dfe00c01020218e6bf90bf98fdc6f49fa7d3edb4ade09192e7dc94eeda80070102020af1f6adac89a1b89283f7bff0a6f2a498d385e987f88bc0010102020be0ae9596a6d29bd8d88bafd8be8da9a4a1eceaa9a69e, 0x1ecddb081c986e5b0bbd98010070202029a93b3acedddafb299f28bf6a1acc4aacde1ecd19af8d40c0702020cb7c482c3aaeea0e894ff90f39e8fe2f697f393ec9ccd940702020241b6bbf7bb90acdb83bbb5c6aec096959990e48c93d9e1d00a01020207d38ed1e0bfa4b4f39ecec5abde99e7e3bd8d9efd88cde00d00020211b8fce2b49eb6b3e591fdcdd4f7a4fe85d2f7c7a9ecd00d0d010205ca80af98c4e9f0dc95c0eb90cd8abeed89b4d9ded3bcf40c0c01020adbc2aee5d7fc959fccbd8cafa6b6afde9f8b88c0c5e40b0b010201cef2b690f0c0b2dcef83e6e88491b6b5bd86a788c8ffb01007010207a9f983f6e4ce89e6c3969ecbb683add1e892c2b585d0c40c07010208b8c3bfb2f5d78f9484fac3bcddc290e39ec1d7ebab88ec070201023d93cfabfdd1958d86d9d7afffbcefd7b1eda6fd84b986b00a0101020c97e5d7c79589b480b1bf98c9f4f4cf8dd4f7fbffaaabd0010101020cb9e5fbd9b1b38fd7a4a5dbaff196aec5819599c1b7900d00010219decda7e2e8bdf7b6f1a6dedbdbaed0fcd2ccc09396a80d0d000203edf186b4bdc4f0f0a895da88d88695b7b5cda6ffcd8de80c0c00020ec6ead3c1faa68cd3e8e7c3a9e582a5e787edd6cbc2d80b0b00027c86a3cfe7fcf7f4b19da2afa4aafd989ca1f1ebe3fcc0100700027ab0ebaba2c3b0c2d7e5c7c498fe8ed895c9bc838fb5be0e070002, 0x1000202ea878df39690a5bde0a8b3cc98ff80ad90fcb59f8a92b0130c0002019380dd86eb93c39dd698b4e7b2ae8f9298a682ccc79cd40c0c000201c2cdc9caecf3b6a6caef9583a9ebd5bcb3f89ad8b1b3b40b0b000201ada0afacf7a0ffb0fef89ba087e99cafcefdabf8ccbb980c0200020791b8f58a9ae0bcbbc68b84d8ffda8aa888d1f7cc8bbfd40c01000221bbb592d6b0d4bdeca895a3f78fb483b4d4e0bfe1fdc0dc0101000207a5dbbdb79bdb99c4a695e3e496a09ec6dcb1fdbdb28df00a00000204b8bcb4bcdb8a8da8edf8e0cafff980b7f5f38686edf3c0000000020390f09bb3e0e4a7e58aefaf83e49dd689f5bec1d9ffdf801e05aab9f0f4d9ffc2e3c0f391a3a98db6cea8000b02060602020401010d04080401060306040b0202020202040b02060201060306040a0607060204000a040e0423a7449a38f601b8951ce8b039cea9358dbc15c4a1002a95eb9cf6deea919e86f4cdc2a987accb87c011882ddb45875fc816c4ae2cfd8b23a29f3bf89a0013899ae3c4e99ba88684cb9a9ac3f8e2a7dbf04593db018ac2c0068ccc4c8e9922bce24594cd03e3a3269dde0034b1c0c7a5d58085b4f1e580a8e39096d7a00d0d020203d0f5bc95cdf9fff2d1dd82a49bed9a80afece0b2d5f0880c0c020209a2d49aaad9e7fb9c99dcf1ef80e7c7e2a1af91e2b9d80b0b02020196b78fcce5908cb0d6d3d0fb, 0x1a582b5f599e011110202028ab3d2aef3ac88d9b6ff9198a3b4d6fcdea789c989cdc00d0d020202f6dad5e2f7ecc8acd5cc8897878acac6f8ae9381a1b9f40c0c020201b2bef1f4f7f7838581deb5bc909ddaf1aad6d697ff88fc0d0702020198d0fdafd880e8bbdac5dcdfd684dcc0e7d78980f58ae00c02020206fbcad48690bbf19bfba58ce4e79b849dbcb4e6b380e0f00c0102021d95fcbaabdba9d1a3a4f6cbe6c080c29d82b591afabb6900101020204dfbbc5a2e09fe786f9c5d5e281d2cd9b8aafff98f19ec00000020205e983abb5af818fede687d3e0e59dcb929ec48bc4b182d01111010202f9eb9fc8c1a0b6aa899ce0e4ec8be5dce5c6a5cacb80c80d0d010204a48cee9eea8a85aae6deffb88ee28c8082e58fcdd09d9e130c01020192c193bbe0e0bff2ce87ff96ab8886b4c89ab2bba0ebc00c0c010202ebd19b9ad6f2a0f5a5abe7da85d094c5ccd598b9d2e48a0c02010208a0aed8b6ac8dc3b7c280ac84fdbffae890e9aa8eede9b80c0101021dffbba1c2c4f882879ae1b79090fa82978ac8f3f98a889002010102018ae8b0b9a5dfdda6fcbe8ca6a7e5fdb59d99b5beabb6d00101010207ee98df9bbbe29192f8a4eff2edd7ad9aafa1d1cb8aed900d00010204c0ceffbf959cfeb2b999b9e388f899a0bfccc9e0bd9ce011110002019faaab89ac99fdd8dbc1b7d386a2addcf285a8ca80fce00d0d, 0x1d40c0c00022edcb6c3f0c6d9c6ae8bdbd5ce9ca7c9d5849defae9780d1b3b8cca38ad2c6efa2fba0f9f8d00b0b000203c4b28abaf6d7aac2d28fd8fda1ad88c399efafd0d1f4da95bfed8991a4d6c38bb4e898dfa0e00b07000213cfefd1a881ac95dbefc185ee80d5d7c8cf89d782f6ded4dfacc0d4d3b0d6dd8e93c3e1e9f680070700020cf3cbe486fe9ab1e788eff5aa8ed0e589a59c928ad584f799f5ceced98289d39bdbca949ad28c0c0200021be59ac1a7f895d4b184bcb7efe0c3b0f591fea682ebcde0bfcdd891ef90ca8a98b4fa90c69da00202000201c7adc1c8d282f8bad8c5c8f1b3a7d4b7e3f1aee7dfa2e9c6df82cfe4e0c3918a9bb08fc691fc0d0100024df798d8b28fcdf195f2ce9afa8d838fd38da8c6d9cdacabe7b9eaa4b89b9b8cf0f8e389f9c00701000203c1fdc2d6e0e8ddb09cf0a9eff7d0b9aaefa68ce0e786d7e8c284e3d2cbd1a1eec8cbc5dcbad01e06f09f85fdf1bec2cc89d28fb4d792ab9efbbccabede99de94ee95f394a9f498e8000c020b02000403040401b9ee01eaad7fb57ea810f0c424deaf3ea5e22c8dd70001d6b4c5a7dfa480f79a8bb5a0a0dccebec7b68001ebc902e3a005c7fd04f28421dfe63fea910b839d2d959e00688be7f3dfeb88d6a18685a18894dedf839b8846c4cf018ac19a4ace8506b9c622a2c443c59926c0d404fe91003c86ddc88e84d9d5b7acebb2, 0x1c00a07020214c6fd919edaaea18bf18787ebb38caf83f28d9887b590bea0f9b8f083ecc38791f78ebf96b0dc070702022c83bed8cbd7fc839489d5c2afc3c6b2fa9dfe90c9e6d8dce7fdbb9bc68fdac8e8a99ec2e398b21102020206ad83fb9191b4f5b284c2fc86ab99db8ad985fe87d697bee19fe2dddcfadaedbd81fc80d4b7ce0c0202020edcecbab087c3f2bdcfb6fba2c6e0dc89acc882eaa5a2cdec9ab1f0fd8981d5e180a1ece988de020102025ca18cd990a4fe84e2c9add4e489aa90fd8aac83dbf29feebdb0959290bbd0dbb8e4c393d9a60c0c010231fb93d5b59b99e189c8cfc9b8fed7fe83d2d8c29285ffef959d9a88d0cce388dae494b5d4aa0b0b010263e6ddd3d395ba9887d7fac2f4f68df485e7dafbe0c7a6bbf3cc8897da8cfba5f6e2989dfb960a0701021ae9f1aaa3da98dd99ccb597caaaf3f48ab98ac880ebb5a5f891dbef9492bbb297a193a3e7cafe0707010226c4c8cdca9ee784c7cbe5dee98df4a1f484cc9be4d6dfb8cf8bd4fedb97e39b9882f1b9d0e0900c0201021ccdaaa9f9d0f7fcc7f1bdf3bfe5c5b58cf9cbef9eeccedec8edf1a3d094d2e6e8f5e8d7b2d3ec0d0101024ef393a9f6a680f489e2b5c8e1d087d09eaba8c4e3ebbe9f9ab48c87acacd99588f8dca3a2b002010102028dad8af180a39e92aba7b7cea3b296ad8bdfa0c6f7cfffbd8aebaa9feff7b48b81b1e39bc0, 0x1c0dfc2c0000b0803060118031a040f020a0200060306040acadf139e8c4aa6ea5eaa9f012eebd4dfd7e99780f6d289b2ffc69bb8c585f99bb7acd38a9ef1f0cedce3c7b4fbe03296be64a1892f83b20afc800102f3fdcec0d6edf6ed86ebd7abc2d8f28182bcc9fad8c8d1cbf2ae96c2aab5caa8d415c8d625a5e954d1b74cd8d1010297d0f1b8e38bb5f4b8d4f585dbbb8b81d1eab4f49382dfb2a39682c58ffcc786ec03819a05bfbb02bed306c0a012aa8e25cd813ccde82ed2e3000289f2908af4b1a7f0f884a1a3c9f7dcdbd4b8b2ddfcd09bf291c3d1b397e7f3a4c4d003c0b106cde40ef1d10bc0a21ff9ec3ee9a50592bb2ec68400019080e9d2a2e1cb909a96f9b081a5fe9cf5c2fb9ed0d5c3aece9cc492a1ce96facae80f88e31cacda689de00184c8b90baa9015d18132bf8d45c6ea0017b791fea8f4a3fc9fcf9cdeaab3f3dfcac2e9cdf1a7b894e4a4ffa091bdecb685a81111020209f6a395aae2b6c49fd8b1bb91acee8c92f4eab3e1eefeb08db6a1e7aadded91a5e88ea3e4e80c0c020224aed7998ea99d9bd69ee4fcb6b79bf18eb08fc685c484e992859bd6cae8fdd8b5e7d1bf92e00b0b02025ab1aff8d8cdb2f7def281ebdcf3ecfe8cd89feebca991c7a0f5c2fca6a8e4a7a5f4b99ea8900d0702020986819ff6afc7ccbdbea58df3f2eef8afa9fe86fb81a9d8eec0c8c2eeffadb0cd9eb5b3d6e2, 0x199b3a5b4aebee6a7e591e7f0e3e5c7fcbce9dce8bcfbd4e0d7c0dbdcf797a4fc98afb5a39f8eeaeadb8f90cccfee0c0c00020a98d8e3bfd6bfb3e6b1c1d4a8d1c5dba4e7eadafdd0b7feb693fc8286b4bad4a8c0e1e6fa89c7b5afd6c0f88ddbfedcd1bdd7ddfd800d0b000204b9dbb7d2eee68b9898c79594f18ad8f3e39aa095cda190d7e994879be191edeb9389e1efd1a6b58bd8e998acbfed9f9cf6c880c5d0b00b0b00020296998880d9dfd6d0b3d0a380aac4aae28e97cb87b2fcd8b3f6a3e8d6b099ada087bd9ed4dcc7d7e6faf5dcebf1bbc6dc84b5f4a8fcc0140a0002028cbdb3f4c9a7be8bbbdfaece8191938ae2f08eb197cdada8aede94f5ed868a90cdf6a5f4c19ad1cdb2bb8edfeba3aa96ce8cc39a8ea7b9b61409000222b5b3cb91d9acbdcfc794bbe5a2b4c3fcf0dcefec9cf8c1b896bef7f888a1dcd28890aca190d8b8a5c6ddfb848af3d1ec8481e4aefbf9c01402000205c38eabcf93ece0a9f1e38dc4c3bba0d398a491b39db7a9d7f8b3c29efde5d8b1cfa0a38babf28cd7c69ab89aa4c9ece6a0c49588cb8fa8be14000002018cdf95d8f292b6cfe48cd6a0a0a7c2d69df5a4b9a4a2df988dbcb5b9bbbc88dbd6c4eca38be8b8dcf3c7eafd98d9ece9ab88e2ed9993cdc01e1d86ddcee6b6b2fd91c7ffabe5f3f1c3cbfbfec5aad78799eb9c92a0aabfee8cadc1adcbf5e8be95f69fa28fb1e6, 0x19ab3e8a8c2f0e0c08fdeb4b2a7dae0140a020201dcd8828281ded9f5a9a2a49ea0d5f7e196fcfafef4a6f9fcd1c9f8dc9a91d5d7fa96b1baffe591828afadecbd4f88cda95f0bebec4a1aa86140902021bb8d4a8d6ca95cff9cbdabc9fdfa0e49fe6c5e09d98adfe84efa5ced8d5c896faf7e9d9b8f2ba81aaefa6988ebcc2b2f9b4f98ad7cadfc01404020222cabcc7abebd9cffcf4d2cdbe8eba86c2c0959e989ef5d9bcb4aae9ac9fb8b9f2d09cf6d4ebd69ffad2a39898cec7b8ca80b5d6e6bbd4801402020207f1abf9d6aa8986b4a4cf8d84a0aaeaeab6e886cacadc92ddddb9bdc3c8aa91a2c7ada0dbc2e891fbb9d5f1de948591a4cbe1b4fc82f982ae0d0d010204abeec5b6e5fb96c786d0bdc3e8f7dcc3e992ae9dd3cac5df85dad8eadf83dd8eb6e4fda1ac8eedeeebb4bcd2cf879f8ee2aca580e9e0140a010201dcd6a7b2dfcadeb2b2e0a4d6aed5abf2c5cf99f2b7be85b7aa928d96d2dbcdb4def9baceb0ca90b0fbe68a909caac9888bb2aed9e2ba81a61409010234f39dca83d3c2c2dd94f6ccfa97c4a8b1e0b7fea890f1adf1f7cdb1a9ede68197a5b3faf1e1dbd9a492a295bb98c0a6b7fda1a4bfd5ee801404010228cc87d5f5f3929c9fc1e0d8b6aae7a08fa6e2ad82fb8ab9b0efde838bd683a6cee3ae96cce6a29b9691b793d382cb85b2aae8c1affb81f01402010204bfd4c292afd5e5a0f187, 0x1d3e225a88f49e78611aa950cb4db003084b1cfcea7c5a6de8ad3dabbdbcce2ddf495bae7ded785d384c6fcb5dde0f4cacb93ea92b7ea80a1a4d8b9bf87c5aaa9a5a01487c621d6e30189c0e75c82a507b29f0ca9b43a9acc24ebcc000bf0dfe1b7e185e291ee86a1cbcab899cac3ccf7f6c581839a87d7b39ae88cca9890b9a3fda19fcaf2a7daa9e98cfc9fce9c8003a58309d4fe0decba1decbe118eba1fbbbb44e8d33fd3b9000480e8919682c6eff08ddcacfb94f7a9d8f8cdf1a393cf80bba180ee81a7d2dde4eba3aad2e290dcf6bef7e2dd9bb9d8d4bbc07989b73db1ff01cb99018b850d9fdc0691a86ab121ad0063b1e2ff94c68ed8f8f0aab694c5dd86b781e0f7f9bcbdcc8de999cdefd8a8df97fbd1d8c0de83cbe893b1b5c297f2e1d0120d020208f0fe899efab6d7d496d3b1d3e4e1fbb1dec181bedc81e98af4daf1a1e2b287dedad7858cf9b7888ea5e4e596fff9dfa88b8bc5d2b2c00d0d02021297b5d89aa89fbff3eaa3c2a2dd89a9a994d6bbede1d7f388a1b2d1b5ae95cccef597a2b0f6b0fe83b99bf3969ebdb3bfbab3efc881a0110b020209ddaacdbdd19edba2edad9c93d0dd8af8bfb58a8affb7a9be8a96d2f5eed5d8a2f0dec2f4838d95d6b1ecfed4e3cdbda28381829d87c00b0b020230cfdad29bb8eb8093a48a81b9b2e494c7d69ceebebaa1aeeda8dbd3eee682a8c6cca7f59182c7be, 0x11d9003af9551c8aa5ae0f90102b7b3a795fde8ac88b38184b4a89e9e9fed9082b4baf999f5c3bfb7b2d084a3aedaf991b084efffb8f2fdc5cbe8c3c8c1f5d1f035f5ca6aa3f111bfda13e7880164c0d68aadb4b7c2a9bce0ded4afabbfe9adc29fc5c795a7b18f85fcc0c998edd1e0b8c0ee87b194dbe6e9b2fb90d0f5d29f800d9ccc16dbf5598cad4f99890105bab1ceaeabe2a3d6f2f7c3d0d5c0eee2eebcc0ab8ac3bcc0f9b3cba88ea2f8d6989ff3e2ab91ffae82e5c7e1d19588f8bf907ba801bcc56ca801bc860cd0b81af1bd3ab3a637ffcd0009c4d4fe97f097f8d1c4ecf8a6a092a69081f2b7aa8efeafb4a995dbffe5eda3e2acadf2b1dd81e4b1ca8cdde5ca8edde7cb86e0018fb501f8f605e4f305e2982293984388f105cfd82983b2000586fdc0d8fbbce2e69df8a886a29a83ab9886e6badad6e7b39aeca3d793d0bbdb93a4a0bfcdd8d4fce7b398d6ebc1ff9cedb4806eae02daa762b9b4018cc495038c8a04ae833785e3439d800001b696bfc4fdb7ff90bc8baaaed89af0b0ea9ce2c4fafff8e4edb380df8982b4e7a0b381fbbcb7e3cbacf69193c5c4e1d29fe1f04bc8d00195e89d1f93f819] private def node1910:Certificate:=PackedParametricCertificateData.decode 11 data1910 private def node1911:Certificate:=.split node1873 node1910 private def data1957:List Nat:=[ 0x10b0908080d040e000b000a0003000a06100204060202030f020b02030c0006040a03110405020206030403110e0d0d0d0b0b091108080813030d030b000a000a110e0d0d0d0b0b09110808080d0303030b000a000a110e0d0d0d0b0b09110808080d0303030b000a000a061016090c0212000c0416030702010e002003240311040402020203010e120808061c041e041e0401110e0d0d0d0b0b091108080813030d030b000a000a110e0d0d0d0b0b09110808080d0613030b000a000a110e0d0d0d0b0b09110808080d0613030b000a000a061008050600060308030702010e002003240311040402020203110402020202030e120808061c041e041e040e040002020603010c0402020206030b1c081205120102041e031313110b0d0b110a0d090a0809040403100104010a1313110b0d0b110a0d090a0809040604100104010a1313110b0d0b110a0d090a0809040604100104010a061008050600060308030f020b02010c001e04220311040402020203110402020202031313110b110a110910090d0911040e021001091313110b110a110910090d0911040e021001091313110b110a130911090d0911040e0210010906100803060018031a030b060202010a0026042a03050204020002030203090c020801060004041203010e0400020206030e0402020202030c04010200020308030b1c081205120102041e0301, 0x11513150d0d0d150b110b110a0b020a02020211010a1513150d0d0d150b110b110a0b020a02020211010a1513150d0d0d150b110b110a0b020a02020211010a060c080a08030600200422041510110c110b0d0b110a10010c010b0102010d000a1510110e130d110b0d0b110a10010b0102010d000a1510130d110c110b0d0b110a10010b0102010d000a06110e130d0d0d0b09110302020c000b000a0002000a110e130d0d0d0b09110302020c000b000a0002000a110e130d0d0d0b091103020210000e000b000a000a060101111007020206030d040a02070201060406040e020002020204110e0d0d10090b0908080d040e000c000a0003000a110e0d0d10090b0908080d040e000c000a0003000a110e0d0d1009] private def node1957:Certificate:=PackedParametricCertificateData.decode 11 data1957 private def data1981:List Nat:=[ 0x193a3e0130a000201ded5ba9cb788a98cc4a496b2a98defabc6e6c58de80d0a000210c0adc4cdd1f1f2bcda87f19aaad39aab968daaa791ae0b0a00022ce1cfd3edaaf8cdc098b5989ccf83a7e4fe96f4e79ef2130200025de5b5e6d8ced4cbb2b4a2e0cbdfb5efd7fef9dbe9980d0200020299dfd9f0abaaf5c38e9baa80fbdbafb0de8ecfb78ada0b02000211f0e3f3b4f2f49ea2bacceb83e08fb685dde9e7a0eec60202000208fd82feff8eb9b7a5e9bad5e0ac8883c7b189fdd2b5c0110100020cb78fc091b18a82aad2bfedcde4aeb7cdce85b3fca01e2791e3ee87e1fbd1c1e4dcf3c29887d0000c080a08030600200422040f0209020506030204010d040a02070201060406040b0202020202040b020502010600020408040a0607060204000a040e040d0d110b0d0a0b0a100713020d020b02020211010a0d0d110b0d0a0b0a100713020d020b02020211010a0d0d110b0d0a0b0a100713020d020b02020211010a060c080a08030600200422040d0d110b0d0a0b0a0b09110310010b0102010a000a0d0d110b0d0a0b0a0b09110310010b0102010a000a0d0d110b0d0a0b0a0b09110310010b0102010a000a060a020902040403020401110404020202030d040a02070201060406040e0200020202040b02050204020302040a06040603020206040804010b0c080805060302040c030712060404060016041604, 0x1b9d8e5ae97df8c86adbc801111020208a6c2cc9d94ed98f5f8cb89b1f0d6e3e598eaebd6a0110b020221b7f3b88f99e59d98ac81a892c6abe789bcf0a0c6800d0a02020d8beda2cfe5e3bfdad48ec199f2b1a1bab9f0a7b79bc80b0a02022fd1d581ab81fe94eb8ef198a5abe1d083dc878de5bd920d07020202b8e6b89cdfd4c2f8edb9ccfdcecdb2bb98c7a4baa9980b020202168df5e2a79fd3fa8d9be9bce9d1949beb90f9a2a18ae60802020261a5f18bcae4bdec9ee0c695e3b18199b4b7bfe5e3800202020208979b9cc1caa99bd9a08bb795acb0d8f29f93d0b0b1c0111101020caaa9e1aca1d4e3c2c7c9c9e586a9caa1eddde895e00d0d010225f3eabfd7afa4f5dfd28a9ceae6fdaab4ddd4f1f080110b0102358a8387c495c483f1bda6d0b48cdeeb91eaa6f9bb800d0a010213f4e6d396e8f79bd7af9199dbabd7b5a2d0cbe9b281ca0b0a010229dfde8cb1efe3cc89e884a8d0b5d0bfc1999286bfcec6130201025bb2bac581c6d9c19de18ce8efc9c187cf9fecc5d3c00d02010202bdbde78eb9df97a4a1c6cd8fc881bc98c4a0afd9e2ae0b02010211e4fd89afca83d1c68cc7ccfe9ef5d7dccce69fe0edc20202010208d8cc92a9eca3e285b2c49190bff1f599ceddbc85b2c00d0d00022fdea7e6b8bbe9daeab795ddfb93a8adacecb2f8fc80110b00022af2dfe8c881b2adfda298fc80fbbfebe9dcbb, 0x18d8cc49e8bce0202010202caf2f882d4e99b90a0b69ac5b79f89db90c7c8d1fdfdb1dc86878c1413000274c4f6e8caf4dca79ab8f3bcf280a1dd97f8e6b0c18ff5ab899bc01111000203eae590a1989282e8f796f3a9a2b685e9ac92c287bc9bceea9da0140d0002038ebcf1a8f8c598fdcacb86a1cbeee2beecc0edb8e5a2bcd5b3aed00d0d000213d286e2f0fdeff1edb7a795f6f7d59be980e383adc3cf9cdaf880140b00020fe0c181fdc3b1b0e09fe3b8c2b2e5cde983d1bdad9bf8dba5ccabb0110b000214d09ca6d687e99a9cf8e2f4cfcde5b6ac97d5c3c181f2b0b482800d0a000202928c92d3e2f4c0a2fbbbdffd89e18deff78089c697c09590ead9b00b0a000211d6ade3b5bde5a288a3d6b49fcc81ca8be0b5eab3b48edaa3beebd01102000228d6c6c4badec0ceb9f7f3f388f2dc9bcef4fb94fcf58a94d1ef800202000202f7bcdbc3e8e9ece4aec2cb94cc87acedb8cbead18bd6ece1b88e801e0ee6f5d482edaac188d68ae486f28ff59a8db1b5a0000a040306010c00080416040f020902010600120414043b9301a8f80fdfb8038b8d018c8002d8b94c8baa10d4bd0006a3ca99bfd2b683beca96a3b7dcf8d7ba80019cdc02cadb019dd6a00bf28409ae10d14ed3d11cd0c40002f49198dfd5d0ffea88dda58f9ac897d2a01af0af31bd9804abb00686c4168a9130cdce44ed03cf950006d7dc9d83a1, 0x169afe305bff901a29f01dcb603e6e90286a8019c8a000297c681acb0aa8cd0b581d0969eb4d29fc9f1ae8fe01413020239c3c7e9929bd4de88b6b9d1b3d9e0e1d0badffef7999ff2ca9e801111020202f39292c3cbb2ad8c9aaddb8097d3d2d7d7c8c3f38db4d090dc80140d020207c2988ed682d596f9e4ffa2b39fffdffcbd8d81a4e5d0ab90efadc0140b02020da0d2b08488c1a2e4d981a4b1c7b498d2ebeb80a7f3a696ab95c8c0110b02020ce89493e48f9ebdbfe9c4cf9781d797b2d990f8ae94a8a6befe800d0a0202019d8597b1a0d3ebcbe29da0c3adafb9c4ffb68a86d485b8befee8c00b0a02021397c7d7b9e6f399b499c8cca9bfc2e6cfadc3b6f7da8bf3b2fbb8c0020202020291fdccdfb4e5f7e5c2d8b4cbb3f8f2b6fe9e9d9280abf494f1d680141301025ccfabd5c6bc8dc0ee9e8592fc92f1a299e0b7c68f9eb083a7f2e0111101020489f5bb80d0b7fa96b1f18d86b082e48089e4e7f8c0a6a4fff8e0140d010205c1b2dab2f382f39acf9997a3d69095becdd6f088f980dda9f2a296140b01020f99b1f3dab78fd9ab8289ff978aa894bbd3c7d6e9f3a582f698bbea110b010215adf4cfc1d6bc80ced3c0c38bb1eac1d280eeefb4ecfafce1bfc00d0a010201ce9bd8979aada485b4d9da90dd9bc9d2c2a8b7f1c7edf5b5aaa9f20b0a010212c999ece7beb4eed3a1c3a89994c28382a2a89aeead, 0x1029ea005cacf79c8a409aa85011ca186bbbcc5878fa4ac84e0d6c1f294f8d0de9485e835afd26dced706889f50e90107b1fdd09dd098b2ee9b90bfedb98c93f4a7b8c8908048e101c29208db9408faff7ea002d8df4df79e14dcfd0008cbacdf81e0c0b3f5ce95a1acc99bcab6f3a4afcfd1a034c7e0] private def node1981:Certificate:=PackedParametricCertificateData.decode 11 data1981 private def node1982:Certificate:=.split node1957 node1981 private def node1983:Certificate:=.split node1911 node1982 private def node1984:Certificate:=.split node1822 node1983 private def data2035:List Nat:=[ 0x1020c010a010a060c0a0a060206000e04100311020906012a0066047403050204020002030203010d06010202020401130d130c0d0b100a0d0908080c020a020d010a010a130d130c100c0d0b100a0d0908080c020d010a010a130d130c0d0b100a0d0908080c020a020d010a010a060c080a080506000e04100311020906012a006604740305020402000203020305020204020203130d130c100c0d0b0d0908080c020a020d010a010a130d130c100c0d0b100a0d0908080c020d010a010a130d130c0d0b100a0d0908080c020a020d010a010a060a040306010c000804160311020906012a006604740305020402000203020305020204020203010e040002020603010c0402020206030b1c081205120102041e03100e130d0b0908080a04090411020e0208020d010a100e130d0b0908080a04090411020e0208020d010a100e130d0b0908080a04090411020e0208020d010a060c080a080506000e04100311020906012a0066047403050204020002030203110402020202030b0a13090b090e0813040b04110210020e02090b0a13090b090e0813040b04110210020e02090b0a13090b090e0813040b04110210020e0209060a040306010c000804160311020906012a006604740305020402000203020311040202020203010e0400020206030e0402020202030c04010200020308030b1c081205120102041e0301, 0x112121511150d150b0b0b120a0d020a02020212000a12121511150d130a15030d020a0202020812121511150d130a15030d020a020202080611020002020204120e150d130d110b0d0b130a0d010a01080102010a120e150d130d110b0d0b130a0d010a01080102010a120e150d130d110b0d0b130a0d010a01080102010a06120e150d130d120d110b130a0d010a01080102010a120e150d130d110b0d0b130a0d010a01080102010a120e150d130d110b0d0b130a0d010a01080102010a06010111040402020203090c0208010600040412040e020002020204130e120e130d0d0b0b080e0508050d01080103010a120e150d130d0d0b0b080e050e010d01080103010a130e120e130d0d0b0b080e0505030d01080103010a060c020a020406000204040311020906032a001204200311040402020203130d100d130c0d09080809060c020d010c010a010a130d100d130c0d09080809060d020c020c010a010a130d100d130c0d09080809060d020c] private def node2035:Certificate:=PackedParametricCertificateData.decode 11 data2035 private def data2060:List Nat:=[ 0x19e8ea09bfcbdf180b78bcaf381a296800d0a00020af8dcd8ca99f9a7deafb0a4be8a99e9a2b38ec7c492960b0a000270fb9087c5c1e39a9ef5faabb1efe891fceddff886980b07000205b7aab8aaabbceb90c4c1c4adff84d5b5d7bab5c0d8c80d02000205e18e9fdbd6c9d6c0bce9da80e3c998f3ecfba99ef6d20c020002658af3e29dac99949686ad82cb8be3a3b6dafca4f1800202000203aa8bb8e7ead7faa19dae9f87ddffa092ccc5d4b5b2a01b119ed3d5a79b96d2b9ace1a1c8d8cbc000110200020202040b020a02050c03040401090c0208010600040412040b02020202020407020602010c000404100407060606020e00080416041212120c0d0b0d0a0b0a10070d02070202020a010a12120d0a0b0a10070d02070202020a010812120d0a0b0a13070d02070202020a01080611020002020204130d130c0d0b0b0b0d0a0a030d010c01020100000a130d130c0d0b0b0b0d0a0a030d010c01020100000a130d130c0d0b0b0b0d0a0a030d010c01020100000a06130d130c0d0b0b0b0d0a0a030d010c01020100000a130d130c0d0b0b0b0d0a0a030d010c01020100000a130d130c0d0b0b0b0d0a0a030d010c01020100000a06010111040402020203090c0208010600040412040e020002020204070206020404030404060605060304020c041004010b240814051604020424030712060404060016041604, 0x1b9b5d9c1a3f181f6c1b1b2cee001a18101a0d2118da01dac9a03c2dc03c2db37e7d554e6890027a1e9e9c0bf91868cf3eaa1f9ffc0ff801212020202a0d8b9c6849bc2dadcad8db2beb68cdcfea9f89380120c02021bb5a6deedd8b8aab0e7b9eed182e981cb94eec0800b0b02020983fc9e8fd5bbb7f2c3b0f5b988b6afbccfd380800d0a02020ae2d996cdbcf3bbcfefdb88b79eb4a4eafba8edb99ad80b0a0202019cdddf93e5ffc4cb9ab087dbb1fc8788aef989a4d2e00b07020204d1e2f39df6d8ebfdb4cde7dfe3a2c2c7edd7a1a68ca00d02020205c8cfd298d08192a69584c884c2cf84a0edc0c8e482c80c0202023db2ac8b8ec1dde5a9a9d8b8adc7f2f59b9fb4b1d8800202020203dbc6f992b8f2bda8a8a090ebffe097fbfadac39fe3801212010203ca8eb7eca199a1b9a0cf86decdc6908886dee3c8c0120c01021da5a7f1b4eda2958492c498b492bd8ae18880800d0a01020afd96d4a48f878de8adba8293ce82facbacbfcaade5cc0b0a0102648bc59fa8aedbf8a1b585e3d497f4dd90a99ef880900b07010205d8f7fefdecc3ac8f82878ea4c3d38fcceae1eeadd9900d02010205e7bb87d4dfa798dc90dbeaf79ba7b581ca8293c3bfe40c0201026790fce6a98a94beef83cedca1e49acefe8cd7c6d8c00202010203aaa2b28889d2dc8aaad5b984cbe3d4f7a4f5ce9af6801212000203e5c4b3c9bd, 0x19989f9cca0bb9dd3f98da4c2a00b0a020201be8c8e9ddb9ec4aba3dabca9bdd1e1bde01408020250ecb5c3d3ab939daace9dadebdae4efc01302020209fee08efda9ffabc79f85f3fe93a3c0800202020202c3cdb5ebcaed8de4bcd1b1e2b2c48ca8c01212010201f3c6cbdcf9f1d3d6f4e7b8c9bdd5dc801411010203a9b3f9bfbd81e897d1f8ec96e89ed4b2b4140d01020a85f0edd3e3989cd2a2e9ed90869f9db5cc120c01026cdb92d8d5d3c6f4a39c8593bff0800d0a01020cffb4e4caf09afff9fca4a3d2aaf1bdde8e0b0a01020190ad81c2cf93ccb1fabaa7c8e4a5b7a1f2140801021082d0c3e59b98c7f7a8e0aaa1be98fcc40202010201e9efdbe0e79bd1cec2a39383e0c0d1f2fc1212000201d984c5fdf3c0d0e5928bb2c0bda0fc801411000202e2ff88d3afd1e690c0f8e984a0e981a5c0140d00020addf8fd8ec59aa2d1a7e8edf1c38eb892c00d0a00020cd885d8d9e7b8dccba4a3c786c3a0ba84a00b0a000201b7e5fadf99fcd884cbdc87aff5d7d0fbe01408000221c9ab95d4ebadb79fefbfd09e8fe58bc00202000201e395ebbcd5ef99d2fae4f6e0a287caccc01b15a18aa39f8185eaf8e080000b0803060118031a040b020a02010c002404280404dffd04dffe45fae063f5fe0116e1b9c1b3c3a8fd9ac1c9e6b4cdd6e7803cc03c9f28f302cc8601fff701fff847e3f831b4d1000182d5dc80, 0x102f3bf02f3c063abc446f0f501518cc5f5e7a7daebb8f785c03ab83a8f6ae705f29801fef501fef645a9a036e7990005bad9c9f5f79396ace7c7a4801212020263b4d0daf7c3bdedf4cda3cbd496bc801411020201b29689c6d4c29ae1c4e5fdecfed9b7d9c0140d02020be7d5da828dead7d8c1d7f9aed9b5af9ec0120c020222dbbef2ac83b29292a7ee9fe7ebe0800b0b02020b91adcbf4dfe5939bacb7d4bf9fc0800d0a02020cd6b5c8ff] private def node2060:Certificate:=PackedParametricCertificateData.decode 11 data2060 private def node2061:Certificate:=.split node2035 node2060 private def node2062:Certificate:=.positive 1 [(1,1),(6,9)] node2061 private def node2063:Certificate:=.negative 1 [(1,0),(2,5)] node2062 private def node2064:Certificate:=.split node1984 node2063 private def node2065:Certificate:=.split node1709 node2064 private def node2066:Certificate:=.split node1605 node2065 private def node2067:Certificate:=.split node1472 node2066 private def data2078:List Nat:=[ 0x1131313111010110d160a130a0b0a1609160209131313111010110d160a130a0b0a1609160209131313111010110d160a130a0b0a1609160209060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030d08070606060212041a030c04010200020308030d2c0a02020601120412030712060404060016041603] private def node2078:Certificate:=PackedParametricCertificateData.decode 11 data2078 private def data2088:List Nat:=[ 0x113131311110a100a160913090a091608080816020a13131311110a100a160913090a091608080816020a13131311110a100a160913090a091608080816020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030d08070606060212041a030c04010200020308030d0c0002020203] private def node2088:Certificate:=PackedParametricCertificateData.decode 10 data2088 private def data2143:List Nat:=[ 0x116080908130411040d040804110208020a1313160e1608090813041104080411020802091313160e160809081304110408041102080209060f040a02010a0004040e030b02090201120030043603010a0209020202010404060313131311160e1608040416021302110102000913131311160e1608160211010613131311160e16081602110106061510030600100312031204030202020313131311160a16081607130709070404110207020a13131311160e160a1608130711020713131311160e160a16081307110207060a040306010c00080416030b0209020112003004360301090c020801060004041203010e0400020206030113131311160a16090909160813081107070707040a13131311160e160a16081308070711020813131311160e160a160813080707110208060a040306010c00080416030b0209020112003004360311040402020203090c0208010600040412030b0202020202030e0400020206030a120904070600160416030113131311101011090a09090911080808080711020a13131311101011090a09090911080808080711020a13131311101011090a09090911080808080711020a060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030b0202020202030e0400020206030a120904070600160416030c04090608020006040a0301, 0x113131311140e130d10060e060a06060201010913131311140e10060e060c06060201010813131311140e10060e060c06060201010806100803060018031a041313131113080e060a0606020e010801030109131313110e060a0606020e010801030108131313110e060a0606020e0108010301080610020406020204010e060d0205060224040e0410240d140a1609020424030e0200020202041313131113080e06080606020e010801040009131313110e06080606020e010801040008131313110e06080606020e010801040008061313131113080e0608060602080110000e00091313131113080e0608060602080110000e0009131313110e0608060804060210000e000800090601120403020202030e060d0203060302040d040a08090401120412030e060c0601080308040113131311160e1608040411010801090001000913131311160e16080404110101000713131311160e1608040411010100070613131311160e1608130404031101040102000913131311160e1608130411010613131311160e160813041101060601121004020206031313160e] private def node2143:Certificate:=PackedParametricCertificateData.decode 10 data2143 private def node2144:Certificate:=.split node2088 node2143 private def node2145:Certificate:=.split node2078 node2144 private def node2146:Certificate:=.positive 1 [(1,0),(2,10)] node2145 private def node2147:Certificate:=.positive 5 [(4,0),(3,3),(8,9)] node2146 private def node2148:Certificate:=.positive 7 [(5,0),(4,5),(6,7)] node2147 private def node2149:Certificate:=.positive 9 [(5,1),(6,2),(22,6)] node2148 private def node2150:Certificate:=.positive 3 [(1,0),(2,5)] node2149 private def data2161:List Nat:=[ 0x1131113101010110d160a0b0a16091009160209131113101010110d160a0b0a16091009160209131113101010110d160a0b0a16091009160209060a040306010c00080416030b02090201120030043603050204020002030203090c0208010600040412030a0605020202030e0400020206030d08070606060212041a030c04010200020308030d24070202060110041003070205020002030203] private def node2161:Certificate:=PackedParametricCertificateData.decode 11 data2161 private def data2176:List Nat:=[ 0x113130e0a0b090808110409040a030403080204010a13130e0a0b09080813041104090406040a0308020a13130e0a0b09080813041104090406040a0308020a060e0201020202030b020902011200300436030502040200020302030a020902020201040406031310110a10090a090908100608040a03160110010a1310110a10090a09090808040a030802160110010a1310110a10090a09090808040a030802160110010a060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030d08070606060212041a030c04010200020308030d0c0002020203] private def node2176:Certificate:=PackedParametricCertificateData.decode 10 data2176 private def data2236:List Nat:=[ 0x1160810081102080206020a060e0201020202030b02090201120030043603010a020902020201040406030b0202020202040e0400020206030113101110100d0a091608100808070703110208020a13101110100d0a091608100809080703110208020a13101110100d0a091608100809080807070311020a060e0201020202030b02090201120030043603110404020202030a0209020202010404060313101110100d0a091608100809080703110208020a13101110100d0a091608100809080703110208020a13101110100d0a091608100809080807070311020a060a040306010c00080416030b0209020112003004360311040402020203090c020801060004041203010e040002020603010200040202030113111010110d110b0a0a08080d040403080211010a13111010110d110b0a0a08080d040403080211010a13111010110d110b0a0a08080d040403080211010a060e0201020202030b020902011200300436030502040200020302030a02090202020104040603131011100a0a11090a09080810060804110211010a131113101110110b0a0a080808070804100211010a131113101110110b0a0a080808070804110110010a060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030a020802000203020309020702000203020301, 0x1060602080103010a13131110100d0b0b0e060a0606020d01080103010a13131110100d0b0b0e060a0606020d01080103010a0610020406020204010e020c02020603020410240d140a1609020424030b02020202020413131110100d0b0b10080e06080606020d0108010a13131110100d0b0b0a0910080e060806060208010a13131110100d0b0b0a0910080e060806060208010a06131311100b0b0a0910080e0608061003060208000a131311100b0b0a0910080e0608061003060208000a131311100b0b0a0910080e0608061003060208000a060112040302020203131311100a0910080e060a0608061102080203020a131311100a0910080e06080610031102080203020a131311100a0910080e06080610031102080203020a060e0201020202030b02090201120030043603010d040a08090401120412030b0202020202040113101110100d09091608100809021101080103010a13101110100d0b090909160811010d01080103010a13101110100d0b090909160811010d01080103010a0613101110100d0b090909160810030902080003000a13101110100d0b090909160810030902080003000a13101110100d0b090909160810030902080003000a06011210040202060313101110160e100d0a09160810081102080206020a13101110160e100d0a09160810081102080206020a13101110160e100d0a09, 0x113101110140d100d0b0b10080e060a06060201010a13101110140d100d0b0b10080e060a06060201010a13101110140d100d0b0b10080e060a06060201010a06100803060018031a0413131110100d0b0b10080e060a] private def node2236:Certificate:=PackedParametricCertificateData.decode 10 data2236 private def node2237:Certificate:=.split node2176 node2236 private def node2238:Certificate:=.split node2161 node2237 private def node2239:Certificate:=.positive 1 [(1,0),(2,10)] node2238 private def node2240:Certificate:=.positive 1 [(1,1),(2,9)] node2239 private def node2241:Certificate:=.positive 7 [(5,0),(4,5),(6,7)] node2240 private def node2242:Certificate:=.positive 3 [(5,0),(2,2),(4,6)] node2241 private def data2268:List Nat:=[ 0x113111111110d08080e040d04130302020a0008000a13111111110d08080e040d04130302020a0008000a13111111110d08080e040d04130302020a0008000a060b08090601060308030b020902011200300436030502040200020302030a020902020201040406030c020a0404020302040e0400020206030d040a0607060306040a030c0402020206030b04010800060306030d0d0b090a08080811040e04090404030b0108000a0d0d0b090a08080811040e04060404030b0108000a0d0d0b090a08080811040e04060404030b0108000a060b08090601060308030b020902011200300436030502040200020302030a020902020201040406030f0e110d0f0d110b16090b090f0316021600090f0e110d110b16090b090f030f0116000f00090f0e110d110b16090b090f030f0116000f0009060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030d08070606060212041a030c04010200020308030d2407020206011004100301] private def node2268:Certificate:=PackedParametricCertificateData.decode 11 data2268 private def data2278:List Nat:=[ 0x10d0d0b09080811040e0409040a0304030b0108000a0d0d0b09080811040e0406040a0304030b0108000a0d0d0b09080811040e0406040a0304030b0108000a060b0a080607060106040a030b020902011200300436030502040200020302030a020902020201040406030a0605020202040e0400020206030d08070606060212041a030c04010200020308030d0c0002020203] private def node2278:Certificate:=PackedParametricCertificateData.decode 10 data2278 private def data2312:List Nat:=[ 0x10a00090000000a130e100e130d09091303110302020a00090000000a130e100e130d09091303110302020a00090000000a06100204060202040b020902011200300436030110240d140a1609020424030b0202020202041111110d0d0d08080e040d04130302020d000a000a1111130d110d0d0d08080e04130302020d000a000a1111110d0d0d08080e040d04130302020d000a000a061311110d0a0709060e040d040a040202110108000a1311110d0a0709060e040d040a040202110108000a1311110d0a0709060e040d040a040202110108000a06010b020902011200300436030504020600020304030d040a08090401120412030b02020202020401010200040202041311110d0a0a0b060e040d040a040802070208000a1311110d0a0a0b0609060e040d040a04070208000a1311110d0a0a0b0609060e040d040a04070208000a060d060704060801020406030b020902011200300436030502040200020302030d040a08090401120412030e060c0601080308040e040b0208020106040a031311110d09090e040d040a04080211010f0108000a1311110d09090e040d040a04080211010f0108000a1311110d09090e040d040a04080211010f0108000a060d060708050401020406030b020902011200300436030502040200020302030a020902020201040406030c020a0404020302040e0400020206030101, 0x11111130e100e130d09091303110309020a0002000a1111130e100e130d09091303110309020a0002000a1111130e100e130d09091303110309020a0002000a060e0201020202040f040c040606030203130e100e130d0909130311030202] private def node2312:Certificate:=PackedParametricCertificateData.decode 9 data2312 private def data2355:List Nat:=[ 0x1000a100e100d0f0d10080e06080610030802030209000a100e100d0f0d10080e06080610030802030209000a06100e100d0f0d10080e06080610031102080203020a100e100d0f0d10080e060a0608061003110208020a100e100d0f0d10080e060a0608061003110208020a06010b02090201120030043603010d040a08090401120412030b02020202020401100e100d0f0d160810080f0810030902080101000a100e100d0f0d160810080f0810030902080101000a100e100d0f0d160810080f0810030902080101000a060e020102020204120403020202030f0e100d0f0d0d09100809080f030802060203020a0f0e100d0f0d0d09100809080f030802060203020a0f0e100d0f0d0d09100809080f030802060203020a060f0e100d0f0d0d09100809080f030802060203020a0f0e100d0f0d0d09100809080f030802060203020a0f0e100d0f0d0d09100809080f030802060203020a06010b02090201120030043603010a020902020201040406030b0202020202040e04000202060301100e0f0e100d0d09100809080f030703080203020a100e100d0d09100809080e070f030703080203020a100e100d0f0d0e090d09100809080f03070308020a060b0206060202030b02090201120030043603110404020202030a020902020201040406030b020a06040203020404040e0400020206030102000402020301, 0x1100e140d100d0f0d10080f0808061003060201010a100e140d100d0f0d10080f0808061003060201010a100e140d100d0f0d10080f0808061003060201010a06100803060018031a04100e100d0f0d10080e060a06100306020d0103010a100e100d0f0d10080e060a06100306020d0103010a100e100d0f0d10080e060a06100306020d0103010a060e02010202020401100e100d0a0910080a06080610031102030209000a100e100d0a0910080a06080610031102030209000a100e100d0a0910080a06080610031102030209000a06100204060202040b020902011200300436030110240d140a1609020424030b020202020204100e100d0f0d10080e06080610030602110108010a100e100d0f0d10080e06080610030602110108010a100e100d0f0d10080e06080610030602110108010a060e02010202020412040302020203100e100d0f0d10080e06080610030802030209] private def node2355:Certificate:=PackedParametricCertificateData.decode 9 data2355 private def node2356:Certificate:=.split node2312 node2355 private def node2357:Certificate:=.split node2278 node2356 private def node2358:Certificate:=.split node2268 node2357 private def node2359:Certificate:=.positive 1 [(1,0),(2,10)] node2358 private def node2360:Certificate:=.positive 1 [(1,1),(2,9)] node2359 private def node2361:Certificate:=.positive 7 [(5,0),(4,5),(6,7)] node2360 private def data2387:List Nat:=[ 0x1131111110e0e110d0d0d0e0a0a08080803030a020a131111110e0e0d0d0e0a0a0a0a080808110303030a131111110e0e110d0d0d0e0a0a08080803030a020a060b08090601060308030b0209020112003004360305020402000203020309020802020401020406030c1e0b08090c04160416040e0400020206030a02050203020302030c0402020206030b080512021201100418030d0d130c0e0a0b090e0808081104090404030b010a0d0d130c0e0a0b090e0808081104090406040b010a0d0d130c0e0a0b090e0808081104090406040b010a060b08090601060308030b0209020112003004360305020402000203020309020802020401020406030d0d0e0a0b090e0810040e040b040e020b00090d0d0e0a0b090e0810040e040b040e020b00090d0d0e0a0b090e0810040e040b040e020b0009060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030d040606050602120416030c04010200020308030b0805120212011004180301] private def node2387:Certificate:=PackedParametricCertificateData.decode 11 data2387 private def data2397:List Nat:=[ 0x10d0d0d0a0b090e0809080808110409040a030e020a0e0e0d0d0d0a0b090e0809080808110409040a030a0e0e0d0d0d0a0b090e0809080808110409040a030a060b0a080607060106040a030b0209020112003004360305020402000203020309020802020401020406030c0c0b0c091205160416040e0400020206030d040606050602120416030c0401020002030803050602060004030403] private def node2397:Certificate:=PackedParametricCertificateData.decode 10 data2397 private def data2442:List Nat:=[ 0x101240426040113110d0d0a0a080811030d03030302020b0009000a13110d0d0a0a080811030d03030302020b0009000a13110d0d0a0a080811030d03030302020b0009000a06100204060202040b0209020112003004360301010b02020202020413110e0e0d0d0a0a0e0808080d030d000a0009000a13110e0e0d0d0a0a0e0808080d030d000a0009000a13110e0e0d0d0a0a0e0808080d030d000a0009000a060e0e110d0a0a0e08080811040d030800020000000a0e0e110d0d0d0a0a0e08080811040d03020200000a0e0e110d0d0d0a0a0e08080811040d03020200000a06010b020902011200300436030504020600020304030d04080401060306030b02020202020401010200040202040e0e110d0a0a0e08080811040d030800020000000a0e0e110d0d0d0a0a0e08080811040d03020200000a0e0e110d0d0d0a0a0e08080811040d03020200000a060b0206060202030b020902011200300436030502040200020302030d04080401060306030e060c0601080308040b0206020106030603110d0d0d0d0a0a0a0e080808110406040d0300000a110d0d0d0d0a0a0a0e080808110406040d0300000a110d0d0d0d0a0a0a0e080808110406040d0300000a060b04070605060304030b0209020112003004360305020402000203020309020802020401020406030c0c0b0c091205160416040e0400020206030101, 0x1131111110d0d0b09090908080a0202020b0109010a13110d0d0b09090908080b020a0202020b0109010a13110d0d0b09090908080b020a0202020b0109010a06100803060018031a04131111110d0d0b09090908080b020a02020210010a131111110d0d0b09090908080b020a02020210010a131111110d0d0b09090908080b020a02020210010a0610080d0c030601240426040113111111110d0d0d0a0a0808030302020b000a000a1311110d0d0d0a0a0e0808080e0202020b000a000a1311110d0d0d0a0a0e0808080e0202020b000a000a061002060402020302040f020a0200060306030113110e0e0d0d0b0b08080d0303030902020209010a13110e0e0d0d0b0b08080d0303030b02020209010a13110e0e0d0d0b0b08080d0303030b02020209010a06100803060018031a04131111110d0d0b0b08080d0303030b02090202020a131111110d0d0b0b08080d0303030b02090202020a131111110d0d0b0b08080d0303030b02090202020a0610080d0c0306] private def node2442:Certificate:=PackedParametricCertificateData.decode 9 data2442 private def data2485:List Nat:=[ 0x10d0d0c0b130810080b0811020801030109000a11100d0d0c0b13080b08110208020801030109000a0611100d0d0a0a13080b08040411020802080103010a11100d0d0a0a130810080b0804041102080103010a11100d0d0a0a13080b08040411020802080103010a06010b0209020112003004360301090208020404010e040a030b0202020202040111100d0d0c0b1008090810060d030902080103010a11100d0d0c0b0b08090810060d030902080103010a11100d0d0c0b0b08090810060d030902080103010a0610080d0c030601240426041204030202020311100d0d0c0b10080b08090813060802060103010a11100d0d0c0b10080b08130610060802060208010a11100d0d0c0b130810080b0813061006080206020a0611100d0d0c0b13080b08130610060802060208010a11100d0d0c0b10080b08130610060802060208010a11100d0d0c0b130810080b0813061006080206020a06010b020902011200300436030109020802020401020406030b0202020202040e0400020206030111100d0d0c0b13080b08130610060802060208010a11100d0d0c0b10080b08130610060802060208010a11100d0d0c0b13080b08130610060802060208010a060b0206060202030b020902011200300436031104040202020309020802020401020406030b0e09060406030a0410040e0400020206030102000402020301, 0x111100d0d0c0b0b0809080d030602060101010e000a11100d0d0c0b0b0809080d030602060101010e000a11100d0d0c0b0b0809080d030602060101010e000a06100803060018031a0411100d0d0c0b1008090813030d030902030101010a11100d0d0c0b0b0809080d0309021301030101010a11100d0d0c0b0b0809080d0309021301030101010a0610080d0c030601240426040113110d0d0c0b130809080d0311010301010109000a13110d0d0c0b130809080d0311010301010109000a13110d0d0c0b130809080d0311010301010109000a060d100718042803020416040b0209020112003004360301100404020202030b02020202020411100d0d0c0b1008090813030d030902080103010a11100d0d0c0b090813030d0309021101080103010a11100d0d0c0b090813030d0309021101080103010a0610080d0c030601240426041204030202020311100d0d0c0b13080b08110208020801030109000a1110] private def node2485:Certificate:=PackedParametricCertificateData.decode 9 data2485 private def node2486:Certificate:=.split node2442 node2485 private def node2487:Certificate:=.split node2397 node2486 private def node2488:Certificate:=.split node2387 node2487 private def node2489:Certificate:=.positive 1 [(2,0),(1,2)] node2488 private def data2526:List Nat:=[ 0x1020312000c04120311040502020603040311110e0e110d0d0d0e0a0e080a08080803030a020a131111110e0e110d0d0d0a080808110303030a020a11110e0e110d0d0d0e0a0e080a08080803030a020a060a16091e020c00080416030b02090201120030043603050402060002030403010e060c0601080308040b020502040203020311110e0e110d0d0d0e0a0e080a08080803030a020a131111110e0e110d0d0d0a080808110303030a020a11110e0e110d0d0d0e0a0e080a08080803030a020a060a040904050200020404030b020902011200300436030504020600020304030902070202060306030c040b02070204040404040e040002020603010c0402020206030b08051202120110041803110d0e0a0b090a0808081104090404030b010e000a110d0d0d0e0a0b090a0808081104060404030b010a110d0d0d0e0a0b090a0808081104060404030b010a060a060902080401040406030b020902011200300436030504020600020304030902070202060306030d0d0e0a0b090e0810040e040b040e020b00090d0d0b090e0810040e040b040e020e000b00090d0d0b090e0810040e040b040e020e000b0009060a040306010c00080416030b02090201120030043603050204020002030203090c020801060004041203010e0400020206030602040202060306030c0402020206030b0805120212011004180301, 0x113130d0d0a0a0a0811040d040e020a02080003000a13130d0d0a0a0a0811040d040e020a02080003000a13130d0d0a0a0a0811040d040e020a02080003000a060a02090204040302030b0209] private def node2526:Certificate:=PackedParametricCertificateData.decode 11 data2526 private def data2536:List Nat:=[ 0x10d0d0d0a0b090c0809080808110409040a030e020a0d0d0d0a0b090e0809080808110409040a030e020a0d0d0d0a0b090e0809080808110409040a030e020a060a1e081c07080112041e030b020902011200300436030504020600020304030902070202060306030b06070605080308040e0400020206030602040202060306030c0401020002030803050602060004030403] private def node2536:Certificate:=PackedParametricCertificateData.decode 10 data2536 private def data2595:List Nat:=[ 0x102050603020311040402020203030401060202040e020002020204110d0d0a11091005110405040c02080203020d000a110d0d0a1109110405040e020c02080203020d000a110d0d0a1109110405040e020c02080203020d000a06110d0d0d0d0a110911040d0404040c02030208000a110d0d0d0d0a110911040d0404040c02030208000a110d0d0d0d0a110911040d0404040c02030208000a06010b0209020312000c04120311040502020603040313110e0e0d0d0a0a0e0808080d030d000a0009000a13110e0e0d0d0a0a0e0808080d030d000a0009000a13110e0e0d0d0a0a0e0808080d030d000a0009000a0613110e0e110d0d0d0a0a0c0808080d03020200000a13110e0e110d0d0d0a0a0c0808080d03020200000a13110e0e110d0d0d0a0a0c0808080d03020200000a06010b02090201120030043603050402060002030403010e060c0601080308040113110e0e0d0d0e08080813060d030c020d000a000a13110e0e0d0d0a0a080813060d030c020d000a000a13110e0e0d0d0a0a080813060d030c020d000a000a060e0e110d0d0d0d0a0a0a0c08080811040d0300000a13110e0e110d0d0d0a0a0c08080811040d0300000a13110e0e110d0d0d0a0a0c08080811040d0300000a06010b020902011200300436030504020600020304030902070202060306030b06070605080308040e0400020206030101, 0x1010a000a06100803060018031a0413111111110d0d0d0a0a08080c0202020b000a000a13111111110d0d0d0a0a08080c0202020b000a000a13111111110d0d0d0a0a08080c0202020b000a000a060b020606020204010113110e0e0d0d0b0b08080d0303030902020209010a13110e0e0d0d0b0b08080d0303030b02020209010a13110e0e0d0d0b0b08080d0303030b02020209010a06100803060018031a04131111110d0d080811030d0303030b02090202020a131111110d0d080811030d0303030b02090202020a131111110d0d080811030d0303030b02090202020a060b0803060118031a040113110d0d0a0a080811030d03030302020a0009000a13110d0d0a0a080811030d0303030c02020209000a13110d0d0a0a080811030d0303030c02020209000a060b0206060202040b0209020112003004360301010b02020202020413110e0e0d0d0a0a0e0808080d030d000a0009000a13110e0e0d0d0a0a0e0808080d030d000a0009000a13110e0e0d0d0a0a0e0808080d030d000a0009000a060b0206060202040b02090201120030043603050402060002030403030401060202030b020202020204010102000402020413111111110d0d0d0a0a08080c0202020b000a000a13111111110d0d0d0a0a08080c0202020b000a000a13111111110d0d0d0a0a08080c0202020b000a000a06100204060202040f0209, 0x113111111130d110d0d0d08080a0202020b0109010a131111110d0d0b0908080d040b030a0202020b010a131111110d0d0b0908080d040b030a0202020b010a06100803060018031a0413111111130d110d0d0d08080b020a02020210010a13111111130d110d0d0d08080b020a02020210010a13111111130d110d0d0d08080b020a02020210010a060b0803060118031a040113111111110d0d0d0a0a08080e0202020b010a000a13111111110d0d0d0a0a08080e0202020b010a000a13111111110d0d0d0a0a08080e0202020b] private def node2595:Certificate:=PackedParametricCertificateData.decode 9 data2595 private def data2637:List Nat:=[ 0x10a11100d0d0b0a090813030d0309021101080103010a060b0803060118031a041204030202020311100d0d0b0a13080b08110208020801030109000a11100d0d0b0a130810080b0811020801030109000a11100d0d0b0a13080b08110208020801030109000a060b04070605060304040b02090201120030043603010902070204060112040c030b02020202020401131111100d0d10080908130613030902080103010a131111100d0d09081306130309021101080103010a131111100d0d09081306130309021101080103010a060b0803060118031a0412100402020603131111100d0d10080b08090813060802060206010a11100d0d10080b080908130611020802110106010a11100d0d10080b080908130608020602110106010a060b0206060202040b02090201120030043603010902070202060306030b0202020202040e04000202060301131111100d0d10080b08090813060802060206010a11100d0d10080b080908130611020802110106010a11100d0d10080b080908130608020602110106010a06131111100d0d10080b08090810060802060211010a11100d0d10080b080908130611020802110106010a11100d0d10080b080908130608020602110106010a06010b02090201120030043603110404020202030902070202060306030b0e0706040803080410040e0400020206030102000402020301, 0x111100d0d0c0c100809080d0306020e01060101010a11100d0d0c0c0b0809080d030602060101010e000a11100d0d0c0c0b0809080d030602060101010e000a06100803060018031a0411100d0d0b0b1008090813030d030902030101010a11100d0d0c0c090813030d0309021301030101010a11100d0d0c0c090813030d0309021301030101010a060b0803060118031a040113110d0d0b0a130809080d0311010301010109000a13110d0d0b0a130809080d0311010301010109000a13110d0d0b0a130809080d0311010301010109000a060b100718044803060422040b0209020112003004360301100404020202030b02020202020411100d0d0b0a1008090813030d030902080103010a11100d0d0b0a090813030d030902110108010301] private def node2637:Certificate:=PackedParametricCertificateData.decode 9 data2637 private def node2638:Certificate:=.split node2595 node2637 private def node2639:Certificate:=.split node2536 node2638 private def node2640:Certificate:=.split node2526 node2639 private def data2689:List Nat:=[ 0x10c000b000a000a0d0d10090b09080811030d0306020e000b000a000a06010702010e002003240311040402020203010e060c060108030804010b090808090411030d030403090003000100090b090808090413030d030403090003000100090b090808090413030d0304030900030001000906110d0d0d10090b090a08110304030e000c000a000a110d0d0d10090b090a08080811030e000c000a000a110d0d0d10090b090a08080811030e000b000a000a06010702010e0020032403110805020302030403110402020202030e040c02060404060406040e040002020603010c0402020206030b040108000603060315131511160b1609150908080d03090003000915131511160b160915090a080808090003000915131511160b150b1609150908080d030900090615131511160b150b160a16090e080d0304000915131511160b150b160a16090e080d030815131511160b150b160a16090e080d0308060113040106001003120311080502030203040311040202020203110d0d0d160b150b160a160915090b04160209110d0d0d160b150b160a160915090b04160209110d0d0d160b150b160a160915090c04160209060c0407060306000a040e030b060202010a0026042a03050402060002030403090c020801060004041203010e0400020206030e0402020202030c04010200020308030d120b02010403060301, 0x115131511150b11090a0811020a02020201010915131511150b11090a0811020a02020201010915131511150b11090a0811020a02020201010906100803060018031a0415131511150b11090a080a020b01020101010915131511150b11090a080a020b01020101010915131511150b11090a080a020b010201010109061002040602020401111007020206030604020401060306040e0200020202041513150b0b090a090a080e05080515040503091513150b0b090a090a080e0515040504050309150b11090b090a090a080e051504050405030906110d0d0d10090b0908080d040e000c000a0003000a110d0d0d10090b0908080d040e000c000a0003000a110d0d0d10090b0908080d040e000b000a0003000a06011304030600040306031104050202060304030b090808090411030d030403090003000100090b0908080904130311030d03090003000100090b0908080904130311030d0309000300010009060d0d10090b09080811030d0306020c000b000a000a0d0d10090b09080811030d030602] private def node2689:Certificate:=PackedParametricCertificateData.decode 11 data2689 private def data2700:List Nat:=[ 0x1110a0b0a0a090b081303020210010b010a0009110a0b0a0a090b081303020210010b010a0009110a0b0a0a090b0813030b02020210010a000906110d110a0a090b0809080202100110000c000b000a110d110a0a090b0809080202100110000c000b000a110d110a0a090b0809080202100110000e000b000a06010802010800160318031108050203020304030604020401060306030b06070605080308040e0400020206030d04030402060306030c04010200020308030d0c0002020203] private def node2700:Certificate:=PackedParametricCertificateData.decode 10 data2700 private def data2761:List Nat:=[ 0x1110a0b0a0b0903031301110101010a0009060a02090204040302040111040402020203030401060202040e020002020204110a0b0a0b090a0405040e010b010a00010009130a110a0b0a0b0905040e010b010a00010009130a110a0b0a0b0905040e010c010a0001000906110d0d0d0b0908080d040a040c000b00080003000a110d0d0d0b0908080d040a040c000b00080003000a110d0d0d0b0908080d040a040e000b00080003000a06010802030800060308031104050202060304030b090e0808080a04130311030d030b010900090b090e0808080a04130311030d030b010900090b090e0808080a04130311030d030b0109000906110d0d0d0b0908080a0413030d03030302020b000a110d0d0d0b0908080a0413030d03030302020b000a110d0d0d0b0908080a0413030d03030302020b000a060108020108001603180311040402020203010e0c060605060108040e04010b090e0808080a04130311030d030b01090009130a0b090e0808080a04130311030d030b0109130a0b090e0808080a04130311030d030b010906110d0d0d110a0b0908080a040d030c000b0002000a110d0d0d110a0b0908080a040d030c000b0002000a110d0d0d110a0b0908080a040d030e000b0002000a06010802010800160318031108050203020304030604020401060306030b08060605060404040a040e0400020206030101, 0x104110a0b0a0b090a04030313010b0101010a0009130a110a0b0a0b09030313010b0101010a0009130a110a0b0a0b0903031301110101010a0009060a18066803060210042a0401010b090e080808090413031103030302020900090b090e080808090413031103030302020900090b090e08080809041303110303030202090009060a040306010c00080416040b0908080a04130311030303020213010900090b0908080a04130311030303020213010900090b0908080a0413031103030302021301090009060b0803060118031a04010b0908080a04130311030303020213010900090b0908080a04130311030303020213010900090b0908080a0413031103030302021301090009060a08061804100302040e040702010e002003240301010b0202020202040b090e0808080a04130311030d030b010900090b090e0808080a04130311030d030b010900090b090e0808080a04130311030d030b01090009060a18064805100302041e04080201080016031803110405020206030403030401060202030b0202020202040101020004020204130a110a0b0a1109130211020b020202010109130a110a0b0a1109130211020b020202010109130a110a0b0a1109130211020b02020201010906100803060018031a04110a0b0a0b090a04030313010b0101010a0009130a110a0b0a0b09030313010b0101010a0009130a, 0x114131410110a0b0a0b090902020209010a000914131410110a0b0a0b09090202020a000814131410110a0b0a0b09090202020a0008060a040306010c0008041604110a0b0a0b090a040303090213010b010a0009130a110a0b0a0b090303090213010b010a0009130a110a0b0a0b090303090213010b010a0009060b0803060118031a0401130a110a0b0a1109130211020b020202010109130a110a0b0a1109130211020b020202010109130a110a0b0a1109130211020b02020201010906100803060018031a] private def node2761:Certificate:=PackedParametricCertificateData.decode 9 data2761 private def data2803:List Nat:=[ 0x10913030d03110108010900010009130a11090b0913030d03110108010900010009130a11090b0913030d03110108010900010009060b0803060118031a0412040302020203130a11090b0913030d030b0213010900020009130a11090b0913030d030b0213010900020009130a11090b0913030d030b0213010900020009060a18072405340302041e040702010e002003240301060404040112030a030b02020202020401130a11090b0913030d03110108010900010009130a11090b0913030d03110108010900010009130a11090b0913030d03110108010900010009060b0803060118031a0412100402020603130a11090b0913030d030b0213010900020009130a11090b0913030d030b0213010900020009130a11090b0913030d030b0213010900020009060b0206060202040702010e0020032403010604020401060306030b0202020202040e04000202060301130a11090b0913030d030b0213010900020009130a11090b0913030d030b0213010900020009130a11090b0913030d030b021301090002000906130d0d0d130a0b09100813030802030111000b000a130d0d0d130a0b09100813030802030111000b000a130d0d0d130a0b09100813030802030111000b000a0601080201080016031803110404020202030604020401060306030b0e0606040a03060410040e0400020206030102000402020301, 0x114130b09090413030d0303030601010109000914130b09090413030d0303030601010109000914130b09090413030d03030306010101090009060a040306010c0008041604100a0b09090413030303130111010301090009130a0b09090413030303130111010301090009130a0b09090413030303130111010301090009060b0803060118031a0401100a0b09090413030303130111010301090009130a0b09090413030303130111010301090009130a0b09090413030303130111010301090009060a1007180468030a042e040702010e002003240301100404020202030b020202020204130a11090b] private def node2803:Certificate:=PackedParametricCertificateData.decode 9 data2803 private def node2804:Certificate:=.split node2761 node2803 private def node2805:Certificate:=.split node2700 node2804 private def node2806:Certificate:=.split node2689 node2805 private def node2807:Certificate:=.split node2640 node2806 private def node2808:Certificate:=.split node2489 node2807 private def node2809:Certificate:=.positive 8 [(5,3),(1,5),(24,7)] node2808 private def node2810:Certificate:=.split node2361 node2809 private def node2811:Certificate:=.split node2242 node2810 private def node2812:Certificate:=.split node2150 node2811 private def node2813:Certificate:=.split node2067 node2812 private def node2814:Certificate:=.split node1387 node2813 private def node2815:Certificate:=.split node729 node2814 private def zz498:"s01f2"="s01f2":=by decide+kernel private theorem valid170:check node170 ctx170 quad170 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid250:check node250 ctx250 quad250 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid341:check node341 ctx341 quad341 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · exact valid250 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid342:check node342 ctx342 quad342 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid170 · exact valid341 private def zz499:"s01f3"="s01f3":=by decide+kernel private theorem valid490:check node490 ctx490 quad490 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid574:check node574 ctx574 quad574 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · exact valid490 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid575:check node575 ctx575 quad575 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid574 private theorem valid649:check node649 ctx649 quad649 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz500:"s01f4"="s01f4":=by decide+kernel private theorem valid725:check node725 ctx725 quad725 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid649 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid729:check node729 ctx729 quad729 (hinges.drop 1) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid342 · apply NatParametricCheckSteps.split_valid · exact valid575 · exact valid725 private theorem valid865:check node865 ctx865 quad865 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid988:check node988 ctx988 quad988 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz501:"s01f5"="s01f5":=by decide+kernel private theorem valid1070:check node1070 ctx1070 quad1070 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1142:check node1142 ctx1142 quad1142 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1070 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1304:check node1304 ctx1304 quad1304 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1382:check node1382 ctx1382 quad1382 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1304 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz502:"s01f6"="s01f6":=by decide+kernel private theorem valid1384:check node1384 ctx1384 quad1384 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1382 private theorem valid1385:check node1385 ctx1385 quad1385 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid988 · exact valid1142 · exact valid1384 private theorem valid1387:check node1387 ctx1387 quad1387 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid865 · exact valid1385 private theorem valid1470:check node1470 ctx1470 quad1470 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz503:"s01f7"="s01f7":=by decide+kernel private theorem valid1602:check node1602 ctx1602 quad1602 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1708:check node1708 ctx1708 quad1708 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1822:check node1822 ctx1822 quad1822 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1983:check node1983 ctx1983 quad1983 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz504:"s01f8"="s01f8":=by decide+kernel private theorem valid2063:check node2063 ctx2063 quad2063 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2065:check node2065 ctx2065 quad2065 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1708 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid1822 · exact valid1983 · exact valid2063 private theorem valid2066:check node2066 ctx2066 quad2066 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1602 · exact valid2065 private theorem valid2067:check node2067 ctx2067 quad2067 (hinges.drop 3) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1470 · exact valid2066 private def zz505:"s01f9"="s01f9":=by decide+kernel private theorem valid2148:check node2148 ctx2148 quad2148 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2241:check node2241 ctx2241 quad2241 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2359:check node2359 ctx2359 quad2359 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2489:check node2489 ctx2489 quad2489 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz506:"s01fa"="s01fa":=by decide+kernel private theorem valid2640:check node2640 ctx2640 quad2640 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2806:check node2806 ctx2806 quad2806 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2809:check node2809 ctx2809 quad2809 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid2489 · apply NatParametricCheckSteps.split_valid · exact valid2640 · exact valid2806 private theorem valid2811:check node2811 ctx2811 quad2811 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2241 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2359 · exact valid2809 private def zz507:"s01fb"="s01fb":=by decide+kernel private theorem valid2813:check node2813 ctx2813 quad2813 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.split_valid · exact valid2067 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2148 · exact valid2811 private theorem valid2815:check node2815 ctx2815 quad2815 (hinges.drop 0) = true:=by apply NatParametricCheckSteps.split_valid · exact valid729 · apply NatParametricCheckSteps.split_valid · exact valid1387 · exact valid2813 theorem certificate_valid:check node2815 constraintsNat base hinges = true:=valid2815 theorem nonnegative (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i):0 ≤ slack t x:=by unfold slack apply div_nonneg · apply check_sound node2815 constraintsNat base hinges t x ht0 ht1 _ certificate_valid intro i have hC (j:Fin 4):0 ≤ linearEval (constraints j) x:=by fin_cases j <;> simpa [constraints,linearEval,Fin.sum_univ_succ] using hx _ exact hC ⟨i % 4,Nat.mod_lt _ (by decide)⟩ · norm_num [normalizationDenominator] end Green24Proof.QuadNearBalanceCase0 private def zz2176:"s0880"="s0880":=by decide+kernel end section namespace Green24Proof.QuadNearBalanceCase1 open ParametricQuadraticCertificates hiding Certificate check check_sound open NatParametricCertificates open NatBacksubRecoveredQuadraticCertificates (cons) open IntegerQuadraticCertificates (Linear Point linearEval combinationCheck) def constraints:Fin 4 → Linear:=![![1,0,0,0], ![0,1,0,0], ![0,0,1,0], ![0,0,0,1]] def base:Quadratic:=![![![0x12560049d02880, -0xaa87bee538000, -0xffcb9e57d4000,0x7bd1d6fd8b6c], ![-0xaa87bee538000, -0x5c2b42de1e43d8,0x149a3591f026f8,0x55da62ee47472], ![-0xffcb9e57d4000,0x149a3591f026f8, -0x457ca592ce9ba0,0xab5dbefbf76e8], ![0x7bd1d6fd8b6c,0x55da62ee47472,0xab5dbefbf76e8, -0x5543df729c000]], ![![-0x1119ea5fc70,0,0x88cf52fe38,0], ![0,0x99e93d5dff0,0, -0x2ac0c9ef718], ![0x88cf52fe38,0,0x56acabc2480, -0x15ab2af0920], ![0, -0x2ac0c9ef718, -0x15ab2af0920,0]], ![![-0x3bb390787c40,0x1b5365003d30,0x286f09137130, -0xa3d13b65800], ![0x1b5365003d30,0xd30257723da0, -0x2c3fcf26fa80, -0x3253dc8e7d0], ![0x286f09137130, -0x2c3fcf26fa80,0xc0b0fb83dca0, -0x1f1431db1b90], ![-0xa3d13b65800, -0x3253dc8e7d0, -0x1f1431db1b90,0xda475abf000]]] def hinges:Hinges:=[(![0,0,0x8d24d0], ![0,0,1, -3]),(![-0x6b000b5fb74,0xad59578490,0x1eade6e5df0], ![0,0,1, -1]),(![0x6b000b5fb74, -0xad59578490, -0x1eae015cc60], ![0,0,3, -1]),(![0,0,0x4c4b40], ![0,1, -3,0]),(![0x5b61255b6c84,0, -0x4f5f5c3d2b0], ![0,1,0, -3]),(![0x1327fce0a51aaf,0, -0x1cb26590e0f0], ![0,1,0, -1]),(![-0x5543df729c000,0,0xda475abf000], ![0,3, -2, -1]),(![0x5543df729c000,0, -0xda475abf000], ![0,3, -2,1]),(![0,0, -0x4c4b40], ![0,3, -1,0]),(![0x60154138c6bd, -0x1119ea5fc70,0], ![0,3,0, -1]),(![0x5543df729c000,0, -0xda475abf000], ![0,3,2, -1]),(![-0x6b000b5fb74,0xad59578490,0x1eae015cc60], ![1, -3,0,0]),(![-0x5543df729c000,0,0xda475abf000], ![1, -2, -3,0]),(![0x5543df729c000,0, -0xda475abf000], ![1, -2,3,0]),(![0x6b000b5fb74, -0xad59578490, -0x1eade6e5df0], ![1, -1,0,0]),(![-0x60154138c6bd,0x1119ea5fc70,0], ![1,0, -3,0]),(![-0x1327fce0a51aaf,0,0x1cb26590e0f0], ![1,0, -1,0]),(![0x1d7839dca6ce,0,0], ![1,0,0, -3]),(![0x5543df729c000,0, -0xda475abf000], ![1,2, -3,0]),(![0,0, -0x8d24d0], ![3, -1,0,0]),(![-0x5b61255b6c84,0,0x4f5f5c3d2b0], ![3,0, -1,0]),(![-0x1d7839dca6ce,0,0], ![3,0,0, -1])] def normalizationDenominator:ℤ:=0xaa87bee538000 noncomputable def slack (t:ℝ) (x:Point):ℝ := (quadraticEval base t x + hingeEval hinges t x) / normalizationDenominator def constraintsNat (i:Nat):Linear := constraints ⟨i % 4,Nat.mod_lt _ (by decide)⟩ private def ctx3529:Nat → Linear:=constraintsNat private def quad3529:Quadratic:=base private def ctx920:Nat → Linear:=cons ![0,0,1, -1] (cons ![0,0,1, -3] ctx3529) private def quad920:Quadratic:=(quad3529 + coefficientProduct ![0,0,0x8d24d0] ![0,0,1, -3] ![0,0,1, -3]) + coefficientProduct ![-0x6b000b5fb74,0xad59578490,0x1eade6e5df0] ![0,0,1, -1] ![0,0,1, -1] private def ctx81:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons ![0,1, -3,0] (cons ![0,0,3, -1] ctx920))))) private def quad81:Quadratic:=(((((quad920 + coefficientProduct ![0x6b000b5fb74, -0xad59578490, -0x1eae015cc60] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0,0,0x4c4b40] ![0,1, -3,0] ![0,1, -3,0]) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1] private def ctx918:Nat → Linear:=cons (-![0,1, -3,0]) (cons ![0,0,3, -1] ctx920) private def quad918:Quadratic:=(quad920 + coefficientProduct ![0x6b000b5fb74, -0xad59578490, -0x1eae015cc60] ![0,0,3, -1] ![0,0,3, -1]) private def ctx467:Nat → Linear:=cons ![0,1,0, -3] ctx918 private def quad467:Quadratic:=quad918 + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3] private def ctx226:Nat → Linear:=cons ![0,3,2, -1] (cons ![0,3,0, -1] (cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx467))))) private def quad226:Quadratic:=(((((quad467 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0]) + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3,2, -1] ![0,3,2, -1] private def ctx465:Nat → Linear:=cons (-![0,3, -2, -1]) (cons ![0,1,0, -1] ctx467) private def quad465:Quadratic:=(quad467 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) private def ctx464:Nat → Linear:=cons (-![0,3, -2,1]) ctx465 private def quad464:Quadratic:=quad465 private def ctx387:Nat → Linear:=cons ![0,3, -1,0] ctx464 private def quad387:Quadratic:=quad464 + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0] private def ctx540:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx918)) private def quad540:Quadratic:=((quad918) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx764:Nat → Linear:=cons (-![0,3, -2, -1]) (cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx918)) private def quad764:Quadratic:=((quad918) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) private def ctx763:Nat → Linear:=cons (-![0,3, -2,1]) ctx764 private def quad763:Quadratic:=quad764 private def ctx687:Nat → Linear:=cons ![0,3, -1,0] ctx763 private def quad687:Quadratic:=quad763 + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0] private def ctx915:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx918)) private def quad915:Quadratic:=((quad918)) private def ctx839:Nat → Linear:=cons ![0,3,0, -1] (cons (-![0,3, -1,0]) (cons (-![0,3, -2,1]) ctx915)) private def quad839:Quadratic:=((quad915)) + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx1706:Nat → Linear:=cons ![0,0,1, -1] (cons (-![0,0,1, -3]) ctx3529) private def quad1706:Quadratic:=(quad3529) + coefficientProduct ![-0x6b000b5fb74,0xad59578490,0x1eade6e5df0] ![0,0,1, -1] ![0,0,1, -1] private def ctx1004:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons ![0,1, -3,0] (cons ![0,0,3, -1] ctx1706))))) private def quad1004:Quadratic:=(((((quad1706 + coefficientProduct ![0x6b000b5fb74, -0xad59578490, -0x1eae015cc60] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0,0,0x4c4b40] ![0,1, -3,0] ![0,1, -3,0]) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1] private def ctx1704:Nat → Linear:=cons (-![0,1, -3,0]) (cons ![0,0,3, -1] ctx1706) private def quad1704:Quadratic:=(quad1706 + coefficientProduct ![0x6b000b5fb74, -0xad59578490, -0x1eae015cc60] ![0,0,3, -1] ![0,0,3, -1]) private def ctx1115:Nat → Linear:=cons ![0,1,0, -3] ctx1704 private def quad1115:Quadratic:=quad1704 + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3] private def ctx1111:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx1115))) private def quad1111:Quadratic:=(((quad1115 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0] private def ctx1392:Nat → Linear:=cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx1704) private def quad1392:Quadratic:=(quad1704) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1234:Nat → Linear:=cons ![0,3,2, -1] (cons ![0,3,0, -1] (cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] ctx1392)))) private def quad1234:Quadratic:=((((quad1392 + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0]) + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3,2, -1] ![0,3,2, -1] private def ctx1391:Nat → Linear:=cons (-![0,3, -2, -1]) ctx1392 private def quad1391:Quadratic:=quad1392 private def ctx1318:Nat → Linear:=cons ![0,3, -2,1] ctx1391 private def quad1318:Quadratic:=quad1391 + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1] private def ctx1701:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1704)) private def quad1701:Quadratic:=((quad1704)) private def ctx1700:Nat → Linear:=cons (-![0,3, -2,1]) ctx1701 private def quad1700:Quadratic:=quad1701 private def ctx1699:Nat → Linear:=cons (-![0,3, -1,0]) ctx1700 private def quad1699:Quadratic:=quad1700 private def ctx1621:Nat → Linear:=cons ![0,3,0, -1] ctx1699 private def quad1621:Quadratic:=quad1699 + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx3527:Nat → Linear:=cons (-![0,0,1, -1]) (cons (-![0,0,1, -3]) ctx3529) private def quad3527:Quadratic:=(quad3529) private def ctx2513:Nat → Linear:=cons ![0,0,3, -1] ctx3527 private def quad2513:Quadratic:=quad3527 + coefficientProduct ![0x6b000b5fb74, -0xad59578490, -0x1eae015cc60] ![0,0,3, -1] ![0,0,3, -1] private def ctx1792:Nat → Linear:=cons ![0,1,0, -3] (cons ![0,1, -3,0] ctx2513) private def quad1792:Quadratic:=(quad2513 + coefficientProduct ![0,0,0x4c4b40] ![0,1, -3,0] ![0,1, -3,0]) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3] private def ctx1789:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx1792)) private def quad1789:Quadratic:=((quad1792 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1] private def ctx1874:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons (-![0,1,0, -3]) (cons ![0,1, -3,0] ctx2513)))) private def quad1874:Quadratic:=((((quad2513 + coefficientProduct ![0,0,0x4c4b40] ![0,1, -3,0] ![0,1, -3,0])) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1] private def ctx2512:Nat → Linear:=cons (-![0,1, -3,0]) ctx2513 private def quad2512:Quadratic:=quad2513 private def ctx1976:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx2512)))) private def quad1976:Quadratic:=((((quad2512) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0] private def ctx2510:Nat → Linear:=cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx2512) private def quad2510:Quadratic:=(quad2512) private def ctx2082:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] ctx2510)) private def quad2082:Quadratic:=((quad2510 + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0] private def ctx2509:Nat → Linear:=cons (-![0,3, -2, -1]) ctx2510 private def quad2509:Quadratic:=quad2510 private def ctx2428:Nat → Linear:=cons ![0,3, -2,1] ctx2509 private def quad2428:Quadratic:=quad2509 + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1] private def ctx2197:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -1,0] ctx2428) private def quad2197:Quadratic:=(quad2428 + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0]) + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx2427:Nat → Linear:=cons (-![0,3, -1,0]) ctx2428 private def quad2427:Quadratic:=quad2428 private def ctx3016:Nat → Linear:=cons ![0,1, -3,0] (cons (-![0,0,3, -1]) ctx3527) private def quad3016:Quadratic:=(quad3527) + coefficientProduct ![0,0,0x4c4b40] ![0,1, -3,0] ![0,1, -3,0] private def ctx2594:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] ctx3016))) private def quad2594:Quadratic:=(((quad3016 + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1] private def ctx3015:Nat → Linear:=cons (-![0,1,0, -3]) ctx3016 private def quad3015:Quadratic:=quad3016 private def ctx2688:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx3015)) private def quad2688:Quadratic:=((quad3015 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1] private def ctx2772:Nat → Linear:=cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) ctx3015) private def quad2772:Quadratic:=(quad3015) + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx3013:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) ctx3015) private def quad3013:Quadratic:=(quad3015) private def ctx3010:Nat → Linear:=cons (-![0,3,0, -1]) (cons ![0,3, -1,0] (cons ![0,3, -2,1] ctx3013)) private def quad3010:Quadratic:=((quad3013 + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0]) private def ctx3523:Nat → Linear:=cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) (cons (-![0,1, -3,0]) (cons (-![0,0,3, -1]) ctx3527))) private def quad3523:Quadratic:=(((quad3527))) private def ctx3104:Nat → Linear:=cons ![0,3, -2, -1] ctx3523 private def quad3104:Quadratic:=quad3523 + coefficientProduct ![-0x5543df729c000,0,0xda475abf000] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx3200:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) ctx3523))) private def quad3200:Quadratic:=(((quad3523) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0]) + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx3443:Nat → Linear:=cons (-![0,3,0, -1]) (cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) ctx3523))) private def quad3443:Quadratic:=(((quad3523) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0,0, -0x4c4b40] ![0,3, -1,0] ![0,3, -1,0]) private def ctx3319:Nat → Linear:=cons ![0,3,2, -1] ctx3443 private def quad3319:Quadratic:=quad3443 + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3,2, -1] ![0,3,2, -1] private def ctx3520:Nat → Linear:=cons (-![0,3, -1,0]) (cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) ctx3523)) private def quad3520:Quadratic:=((quad3523) + coefficientProduct ![0x5543df729c000,0, -0xda475abf000] ![0,3, -2,1] ![0,3, -2,1]) private def data10:List Nat:=[ 0x11515150b110b130a13090b09130419021901091515150b130a13090b09130419021901081515150b130a13090b0913041902190108060a040306010c00080416030c020902011200300436030506030200040304030a02080202040102040603110410060102030603100400020206030f08080607060212041a030e04020202060310060d020a06010404060308020002020203] private def node10:Certificate:=PackedParametricCertificateData.decode 11 data10 private def data20:List Nat:=[ 0x1bc88f6afebbbcaa8c4120a010201d7e6c2ebdae2c1acd696a2d8c38bf3fca01909010206c3dbdfed9aecc1dbd3ebdeb1cbd1be97eec41309010207d380c38892b8f4e5e5b8c2b1c8ee8cc7abd60a09010206c99a94d389e0bdeaf1c6e2ecbfd5c2d0c01908010201d893e5dceec8e2dadda8e7b285cdb1b394c4130801023fd0b2df8df188bab68baadfca959c8aa1c20808010208d6c0d1e092cbf8eab98185bd91dff6d680190201021ed4efc5c1d5c38e84e7b5eff0af83e6f7a41515000201b0ae96a4bae9f9ba84e5a8fafbd1f7d7dbe4150a00021b8bf496a4b1c499e88195a9afc1d9b38398120a000201cea1c58dc0e2a0d4e0abe1bb8581b38f941909000206e5e3ddc1ebec9181d8b8bfec80b08ddf8ce01309000207b5fa85fcf3da93dde887c5f682aebca293b80a09000207ceacc5aba7c8919cd6a9f3988bdfbbb5dc190800025690afc0f7e0edb7b5fcdaf9e7ec9deeb3b0130800025cfd88f9d8b8b6dca5fdc5d8b6c18b8abc880808000207c5c9c8b1a9de87bac28395acf5faa1a590190200022aaae2c491b7b9f2efd0fcb8ceffc9c4dc901e019e87bfee8aa2ccabe9cdd4000a040306010c00080416030c020902011200300436030506030200040304030a02080202040102040603110410060102030603100400020206030f08080607060212041a030e040102000203080310040a040002030203, 0x109859607bcef0197a93ab211e09e4fb1c903c2a201b3f90003cbe2f3d58d88efb5afbe9eb8fc4a8504939d0186f3ed429b821ff77cea1dcefa0df8a70078e4a7c5f5f49ab3c184fcc0151502020185d0b6b4cd8da687f19580828ab988b4ac90120a020201929b9297ff94b6ccc8a3fbc2bd86adde901909020205f9dc9a8fc5e3c8bf8f91e589e1b89b88c7f61309020207f5ec92cedab482d2ff9dccf0d4beaca08afe0a09020204cac091d8bccd8eedfac1a6928a8cff8db01908020202d795e4b1fdf0fe92888cabcfdeebb9f4efba130802022ed1d4a2f5e193d28380e6b282e5f998d1d21902020217edfadcf6d6b8c4ffafd89b858ba0b3a6c01515010201a0aa9b8bddedd5dbb7c0d3cc8881d481b1f8150a01020887faafaafcc48bdd] private def node20:Certificate:=PackedParametricCertificateData.decode 10 data20 private def data76:List Nat:=[ 0x1d684bff4a7bfb1bfcc8dffbfbdeb89b2989adfe98af8dc0909000204928ba8a6d98cbbcba095cd9eaa9bcaa5e8b1cbd4aac9d68ec884b0d8c0c9d293b29a9feffef1cb9aadce8ab380b8c5ec19080002028bf38e88c09cdae0e08ceecbc8f8ef8de0bcb884f1c1f0f8e6ecf792ddbef19e81b0b1a7efcdfbdf9aec90afc698f091d409080002059f97c2a3d4eeb2d5a481abcc909edbf3a794d39fd4caba9189f1c2c696a6d9a381a0b39fc49faec2b6e894a9f5efdeda0808000206aff6ffaab3c5ba8d8de682f6eaa2df94dca789fad9c981fce1c79ba4f6aae4f78ad6d39fb1fb90d0cec9d4f5d1c9cea8060600026da1c8b1fab5d5b1979db3a1e1d08592c1e68eb5b0a6bc99f8d9f88b8d93abaea2f993bceeb985eccc8cd9d3ae869ff61904000203dbd4a0b4fba08cbad1dd88ab8f878a948aedcd8e9dc2f5caafc4a8ebaefdbfda9acce9bdd7e7bc96c0cd9be4a9eab1d0a00802000225ecede2839681a8d5d8e98de49399f4d09ebbc0f7e4d8e5e7d3e6ccb8e4becae7dcc8f288f8ffd7d282bdd78ad689981e1e97b2d287eaa6d2ab88fea6e2f89acba9f19ea7eacd86a58d8dc5f0c5d3aac596b9f887c3a9d3fdfba7be000a040306010c00080416030c020902011200300436030506030200040304030a02080202040102040603110410060102030603100400020206030b0200020202030a02000202020301, 0x192e01904020203e9ecb2c3948d9ac7a6d684bdf7b6f684c6bbc0a2bdf3a58e83f8d89feb89e0f285d3d4da82cb8fdbacefcacdfbd4c49da0191501021089bef5f6d2b08b95bfead3fcfdefd3f182b9db93c2aeb6c6b5c79ee79de5c3d6e1cae2ded1b18dc184dfaeadf8eba6a5901908010260849bc6f38182f8daa7d6b9fdee8abad9a7b8dfd4f687c8dfaf9b87deb5e2bc98d1e8b1bea5da8e979fbe9e938aeade881208010203a6b49391a0e9a6a2f19cd0f0cad4a5d9ddfcadecb7ced9c4decf9db98582cc8392cbf1809f8df9c0a2a3e88cc2d095fc1907010206a0f2e4e1a590b09ae9f5e88ff58bad80c7f3a1cc8e8be1e5e0f7a685a094b3acdfdf82d4869bef91b7f4cda9a4e89fd0e00806010267f082fbeeeeb0bcc085bfede1b99ea997a9e8e8aeade79eea93d1e8fc9cfeb28e9b92c7a18191a38d8db9c5d6a0c8940706010201f7fedfe6b98df2a8e59adcdcac8aafc5bc8ff0ceac9a9b80d9cc97febed281bbcaddc6be87a284c7ecf1fdf8c092f684191500020cbc97c5ffe3d1ecead6aefba09ca8dfeade82ebe796bdaecbd4d3ee8d96ef85d3b2fcd1a7beb092bac1e5a6d88eec83bfd8150a000245c7f680dce5d788ce96c685d1c688f1c796f3b7b982c997be8cc6f5bcaba6f4e796d1c9f889bff7b5d98ee4e0d9a0f6b013090002118dac9099baa791b6b8fbf0eede8094a0a4b69debb28886cdb1, 0x1c8afa6c8b897a4ecc5a9f0af9fbcd3acf8cc81c698ec9cd8f6b6b680b8cfefce94a8b4d6dfb80186f0a96ad6c409d8a206b0fb469dcc33def70895a304e7b00007b690b3bef8d889a7bdc4ffbef1a58bb580f4dddbe3899ba1baadfed580df95dfc1d48894e3a8a7b9a1eadfa807eedd04cbcf03b2d701bef82fbae53c82b718d2890dd8ba0051c5cabfc888d38fd3c082a787d3db83afc18b8aaa9dd8d1d0caa294ad8a87acd7c497e1ccc6ec8c9792e4a864bc9377bbb940c3e322b1d635d4a43edcb021bbd611e3a90007dddad1f5bba58dbbac82e0c0abbd8ee1c09e859388aebbdff8e097abb480dcf4d9a3ebf385d285fcb9d0c0191502020ffeaed9add1a9d59fc8d1c48bbbc0bbd4e7859a99cbedc4f3f4bdbe85c8d090d59084bef98392d9e6dacfe4c095f2f6fd901212020201b4a78fe7cdd7bdeed987d98c9edcbc93c7ed96d29ca9979df2f4a58ff2fb839fdff5f48d8ebadef3f5a9f0a1b1faef80150902020f8e89e6fbc3bab695f185aabad2dde585d294cde291c7bbfd94f5d9a6f3b0e1c686e4aeac91a4a9ebe4c0d4bbff96cfc81908020202f28bb2da9deff9beb7e9ecd3abaf969eaad0ebfbfceeadb7dd89c8f9baffcb8591faedb0b297858494c5deff9ff09293d8080802020de0cda4a1bff886eb98bbb1a4afb097af9591ee87d4f086b3e9dfafc68dbcd588d4a3c5cba386a0daad94dbfb848a, 0x1f294ccbc190e00020fd6b1f1bd9eb3dcc7e39ceac6ddfe82ab84190a000202d5a6d2e0d9c6a2b5e2f693e2e4acccbfdef41309000201d6ddf5d68addc7f4e2dabb90e0b491e5a292190800020ded8590898aaba9bda7c2e6a1a182def8b78c130800020f93bbb3cf9588d2dd9cc4feaaa5f793ced7ee070700020288e5b6c694d9fbefcaa2a698b6d8de86801502000205e588d1cddbb69b808c92e3beb0bcadcc801b0588d3a4a781f8f09888cbc0000a040306010c00080416030c02090201120030043603130404020202030a020802020401020406030c020202020203100400020206030b020002020203015e86eb4db6a406a7b404c8a1010efa97d3fff4debcb684d0988accbc9bdbf8f8b4bfd3eb8ca6e49dcea6e48fadc1c2a9f7a6e3dc98c0c3debbd019c7822a90e263e28d32999e0122dce1c2bf819fe6b8c7cfaac2e3fb8dabe7fdddf2e4cfb5c892e1ccfeecbae9ffb9fbb0b2a3b4a0ef9193bc49bfea54b6c62ada9a17b3b50115d5c99de3f69a8fbb9cbeaebeb9a3c1a1e490c0f7a0ce9b9b9983c5fd9b8fd3a48ab78dcad3fdddc6fdc0c401ffc501a2fa02c78e01bd953187903be2dd239a9410edd3002fbca6f6b0af8ebafeb4d585d4a0f2a08de993e1a0b3c5e1f8b8f7c9bbd6f9e699b5c5baa788bcc9bdce9eedf006eda206978d039d8801df952eabcc04b49f3ff28520dcb20019ddd6e18387bd, 0x10306010c00080416030c02090201120030043603010a0208020204010204060311041006010203060310040002020603011db1c435bca901cb8b01cb8c01019691aadbd4c7a4eacde4c6c180038df80187ad38dc3989329e8244bce301fccf01fcd00006c9dc8ef7bef2f9c9c5e5f9a4e01515020202c2c5e4d1dabfbcdb86f8d39bc8fac993f3a0190a020202b49dc3b2fc83c8cd8ef18394e2d1a9eaf6801909020273d68db3cae0d096bdf1fde0d8a998c8ff901309020201ce81b7b6b7a1d9edede3fcb583e4ffdbb6b0090902020da2e9f3b4c0dcddeaa2dea492d4bb8fa0190802020daa95deb9989ac29290c0c0ddcde0deed9db0130802020f97f3f8d680d6d8d8838de3f8918683b595d00707020275d9b7e1dd88d9ebd687d285bcacf8b6800706020229cfb3fae2feecc8a5b0eaa7c89784ee801515010202dd95d1f9efcc9bb38ed4d2ef92e5e689d6a0190a010202bbbad4d3f880a8ad968cf2e5f2fd809cd180190901026dfedaf397cad5e8abca8dded6cda38099b01309010201bce0ea96fcaea3a7fbb6a2a2c5c2e5e5ba90190801020dc2c7cecea6828dec9d81a2b5bddaccb088b0130801020fb088cef2e5cda881bdbdd09e94eff48ba4b00707010202dad696f5dee5c989e589b1d9999bf2dc80070601020195a0a9b898d8f2cedcf6ebe8e1e5d2801515000203868ccfadcfb8c1cdc9a18c81edb0, 0x1060a060e041302060203010915151311130f0f060a060e041302060203010906140212020008030803010f020206020204121c0e140b060a06041c0315151311190e11060f060a060602010103000915151311190e11060f060a060602010103000915151311190e11060f060b0606020101030009061510030202060315151311190e0f060a0606020f01080103010915151311190e0f060a0606020f01080103010915151311190e0f060a0606020f01080103010906120803060018031a03010f020206020204120c0e0a0a060002040e030115151311190e0f060806040406020f0108010915151311190e0f060806040406020f0108010915151311190e0f060806040406020f0108010906120803060018031a03140403020202031515151313110e0e09080f0608061202080204020a1515151313110e0e09080f0608061202110208020a1515151313110e0e09080f0608061202080204020a060a040306010c00080416030c02090201120030043603010e040b040a04010e040e0310020002020203011311130f190e130815040404130202011500091311130f190e1308150413021500071311130f190e13081504130215000706120803060018031a0314100402020603151515131311190e1308130709071502080206020a151515131311190e1308130715020715151513190e130913081307150207060a04, 0x115151311160f130f160e130b0e04060201010915151311160f130f160e130c0e04060201010915151311160f130f160e130c0e0406020101090615151311130f130b0e04060201010e0003000915151311130f130c0e04060201010e0003000915151311130f130c0e04060201010e00030009060115151311130f0f060a060e041302060203010915151311130f0f] private def node76:Certificate:=PackedParametricCertificateData.decode 10 data76 private def node77:Certificate:=.split node20 node76 private def node78:Certificate:=.split node10 node77 private def node79:Certificate:=.positive 1 [(1,1),(1,7)] node78 private def node80:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node79 private def node81:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node80 private def node82:Certificate:=.positive 1 [(1,0),(2,10)] node81 private def node83:Certificate:=.positive 3 [(3,0),(2,2),(4,7)] node82 private def node84:Certificate:=.positive 3 [(1,0),(2,6)] node83 private def node85:Certificate:=.positive 3 [(1,0),(3,3),(2,5)] node84 private def data113:List Nat:=[ 0x1151515130e0e110b0b0b0a0a11090b0908080a020a151515130e0e110b0b0b150911090b0908080a020a151515130e0e110b0b0b150911090b0908080a020a060a040306010c00080416030c020902011200300436030702050800080306030b040a0406040102040603100200020202030902080204020106040803151515130e0e110b0a0a11090a0808080a0208020a151515130e0e110b0a0a11090a0808080a0208020a151515130e0e110b0a0a11090a0808080a0208020a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311041006010203060310040002020603010e0402020206030d04090601020306031515110b120a12090b0912040e0312021901091515110b120a12090b0912040e0312021901091515110b120a12090b0912040e031202190109060a040306010c00080416030c020902011200300436030506030200040304030a02080202040102040603110410060102030603100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node113:Certificate:=PackedParametricCertificateData.decode 11 data113 private def data138:List Nat:=[ 0x1caa1daa8edbeabc2abdce4c88987c7a389b5b8a198cbcbf9afc0150801021d95e492ccddc3f2d8e7df859cb791ade4fbd8e486eaa7c4caa7880808010225c4ad9e8dbbdde4faecb083fd9cc1e1e8fbae9ed1d7b29db1eca0060601020affadf495948ec0d7d1f9a9d295d2efc6f88cbbd882cca4ebcd921204010208bc83e093978fd0e1cbe7e4d0acd98687a8c8f2cad996ce81f3b01515000274d3fe89d3bfa7e78fadefbe93f0baa7f1b2fdcd88ed8ea3e6e0a0151300020198d2e6de8fe6c3ac87e6e3b6c39babb3dfe5b5bb9fe3a7aa92fe801512000222cedbb497fbc1fd81d7b8eb97ebd2aac7eef4ba8b8788c38ca3e0120b000208bc8d8bb6e3f99ad2acc88ae8dcfd92b7f98e86b8acc3d8e595a0090900020bf3839581a9b493deb5e3dfc48fb3c5b8caacfd83a9adc8f685d0150800021ed6d6f1a9bbc9bba68db3d4ccc199f593a6d7858a8afee3f5acc00808000225dcfeaf9c8bd5d081cbc4ddeaef8dd8c395b3d5b8cfadf9bffb80060600020a83bbb19bbdbcebab8bb9f5b2e4badd88889bb4b9c2adbdd99c901204000206f3e0ae90a2c2d897d2ffabe8b1a582ba90a9fd87a281c6bad9801e018198f4fce6bacbfad5b0b2f39585b5efd9cdd9d0000a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406031104100601020306031004000202060301, 0x1c5fd9dff84e2bfea8b978df5d4fc428211bf13d51ea409afab219681479fde22dc850079cc9dff95a78db59bdcd1e8cf97d4a0f4dda2e8c880088edd1a86c944c0f574f1e702878603a59a08a6ee0ee8ea006d97ba93bff3ecb898bfc2dbe6f3cbbcdd80c5e015150202728ce1c096dda4e5aac9a994d8d5b2dd9397c88f9db0a6e6f9f6b015130202019ae6c6bcc383ffa6fc97aac0b7bba8acfe8499df9ebfb8a2f3d6f01512020225e3f2efc1e1cad6aac6cdfbebdba8efd5f4e3ab91b2bc9ea68be0120b02020a9de9e7bae5c99bbbdac7db9de99df6ae8df6c0c0d086b6f598e0090902020bc19982f6a1f6cac2e1b6e8f6b5d0feedbaae91d1aba3ebf1b3f8150802021a80b5caf088eab0a5ff96cee3a3fbbeafeafaddd3e0c7c39ecbf008080202258fa699e39cdcb4baa8e48b96aa8bd1e0ab99be9dac94838dfca00606020207b997cfa6b5f8dc8fa39acecb8abbf1dffbefffc09de39ab3c7b808040202039e84e9b4e598d9cfe89091d1e38ad492a1e8d995d2f1b7eed1901515010274babcfff3e9e1f1c9da83a0ec95e4e08495c2ae87e9ab978ec7ec151301020199ca84d3e1aaaf84dee393b2c6e9c3efccc3d1f2ccbebad2e3add41512010221959eadd99599e0ecaffe84f8818a99e19e86e2c48ceaf3b0f0c0120b010208df90b6c8c0afb1ba97a694f982ca97d5b28a93d3e6f7a898eae0090901020b, 0x11515010201a2d0f5bf95f5b89fdddce9918192d4ece8d4d1901513010201aa8cecc9ea96d5e7aeded9d19ba592a2e9b7f9900a0a01021ff6cba488a4979695ba9880ba96bebfb5d2aa801509010234e3d4e18aa2d9f1e9e3f8c2a980b0a0d1d6b2e0080801023db0a4cbc99b91b9f59dbffd9ba2cebcb6d5d9f8070701020885bececec0bbc7c2aaf398b0adc3d6d7c0b3e01506010219cbae90b3fde199a0f785eef4dfb087c8f180a00a0601022a96cfa4cadf91f88dabb38be0b281d29fcf98a0060601022aec8ee2bec5c989b7dbb3a5b6cea4dcaae6b5b01515000201a4eaa3d7def9fff8f2ccf48caebef7869a9fb2c81513000201a2a2a8deb8db97fbf7d99ba3d4d2a2f3abb2bfa80a0a00022092e789bdde8aaaebb8d6fe84f1c2a7a9aae4a01509000239dee6a390fd87fbeab4e9c9a78ed8eef2c3fa800808000234f2bf9ef0f5feadb38183c882d3998bcce4c4b80707000228bdf4b587c8cda19ac5dca2bfd5adadf5cdcda0150600021a968d9de1e7dacbe2a0f9d2d6edfddfdadbd2c00906000227f9b2eea6e9d1a59898fff7bc91e68bf482b2b0060600020df6bdc4e5b0afd18dba999199dbbaa0dbe4ffa01e01a8c4808cdebeb8879693a3f8c8000a040306010c00080416030c0209020112003004360305020402000203020301100200020202030104f393248fdd67c7a835af990141ebd291d0bfac, 0x115151311150b0a0a080404040f030b03070202020a15151311150b0a0a080404040f030b03070202020a15151311150b0a0a080404040f030b03070202020a060a040306010c00080416030d020c020506000604080313040402020203030401060202040c0202020202031515150b110b0a0a08040f0302020301080003000a1515150b110b0a0a08040f0302020301080003000a1515150b110b0a0a08040f0302020301080003000a060a040306010c00080416030d020c020306000c040e0313040502020603040355b837cc81618bda30e8e901019f88f5cbdec0bc878fd6bf8bb2c001bfcf01979f4b87018c9a0997ec2bb3fd42d4f820e0d7000190e9d1c0c19cb6e899ea9fa1c58ee015150202019dd98389e4ceace0bbe1d5829df3bd8aa5b1e8b81513020201b1f1f4fbd8e29ead89fecee394d7bdf18599a4d80a0a020220a297a5ccedcd9fed8fccb4e996f8fddcf2d0d8150902022ff3abcc83c6a4da8591bfb6efd390c8b2e2a0c00808020226a38dacaecae4c981c7e9e6d8dd85bf8de4fc920807020231f896fca1d7f0fdf096ddc2fbb8dcbba9e2f9d81106020216f785fdc6d993e3b9b0e9fee6ccf589eaf7e9800906020224caa1b8bb9a83f3ad9dbdb6ddcab6eef9c087d00606020220fcf9abedaec1968ce294d7ddb785cba9fc9ea607020202019acfb2929fdeddb6abeb9ee1abeecdf1baf690] private def node138:Certificate:=PackedParametricCertificateData.decode 8 data138 private def data191:List Nat:=[ 0x10c03120034043e0301151513110b0b0b0908040f0302020f010a0108000a151513110b0b0b0908040f0302020f010a0108000a151513110b0b0b0908040f0302020f010a0108000a060b0803060118031a031515150b0a0a11090a07090708040f030b0302020a1515150b0a0a11090a07090708040f030b0302020a1515150b0a0a11090a07090708040f030b0302020a060a040306010c00080416030101151515130e0e110b1509090908080303020209010a151515130e0e110b1509090908080303020209010a151515130e0e110b1509090908080303020209010a060708030202080306031515151313130e0e0909080803030b02090202020a1515151313130e0e0909080803030b02090202020a1515151313130e0e0909080803030b02090202020a060a08070c03120034043e0301151515130e0e0a0a08080a0715060905030302020a151515130e0e0a0a08080a0715060905030302020a151515130a0a08080a07150609050303020209060a040306010c00080416030c02090201120030043603010101151515130e0e0a0a150908080a071506030302020a151515130e0e0a0a150908080a071506030302020a151515130e0e0a0a150908080a071506030302020a060a040306010c00080416030c020902011200300436030504020600020304030304010602020310020002020203010b020002020204, 0x10201080308031515150b0a0a11090a0709070e040f030b0302020a1515150b0a0a11090a0709070e040f030b0302020a1515150b0a0a11090a0709070e040f030b0302020a0614040a0201060008040e030101151515130e0e110b1509090908080303020209010a151515130e0e110b1509090908080303020209010a151515130e0e110b1509090908080303020209010a06151515130e0e110b1509090908080303020209010a151515130e0e110b1509090908080303020209010a151515130e0e110b1509090908080303020209010a06011515151313130e0e0909080803030b02090202020a1515151313130e0e0909080803030b02090202020a1515151313130e0e0909080803030b02090202020a06140c0a040706002604280301151515130e0e0a0a08080a0715060905030302020a151515130e0e0a0a08080a0715060905030302020a151515130a0a08080a071506090503030202090614040a0201060008040e030c020902011200300436030101151513110b0b0b0908040f030a0202020a0108000a151513110b0908040f030a0202020f010a0108000a151513110b0908040f030a0202020f010a0108000a0615100302020603151515131311150b0b09090908040f030a0202020a151515131311150b0b09090908040f030a0202020a151515131311150b0b09090908040f030a0202020a060a0807, 0x11515151313110b0909090e040f0302020a010e000a1515151313110b090e0411030f0302020a010e000a1515151313110b090e0411030f0302020a010e000a06151513110b090e0411030f0302020f010a0108000a151513110b090e0411030f0302020f010a0108000a151513110b090e0411030f0302020f010a0108000a0601151515131311150b090904040f030a02020208000a151515131311150b0b0909090f030a02020208000a151515131311150b0b0909090f030a02020208000a06140c0a040706002604280301151513110b090e0411030f0302020f010a0108000a151513110b090e0411030f0302020f010a0108000a151513110b090e0411030f0302020f010a0108000a0610020b] private def node191:Certificate:=PackedParametricCertificateData.decode 8 data191 private def node192:Certificate:=.split node138 node191 private def data223:List Nat:=[ 0x11513111211120f0b09120811060602030101010a151513111211120f0b09120811060602030101010a061402120200080308030115151311120809080907110609050e04080203020a15151311120809080907110609050e04080203020a15151311120809080907110609050e04080203020a0614040a0201060008040e030c0209020112003004360301120404020202031515131112110b0b0b09120812020602150101010a1515131112110b0b0b09120813021202060201010a1515131112110b0b0b09120813021202060201010a0615100302020603151513111211120f0b09120811060602030101010a151513111211120f0b09120811060602030101010a151513111211120f0b09120811060602030101010a06120803060018031a030115151311121112080908090711060905080203020a15151513121112080908090711060a06090503020a15151513131112111208090809071106090503020a060a040306010c00080416030c020902011200300436030112040402020203011515131112110a091208090809071106080203020a1515151312110a091208090809071106080203020a1515131112110a091208090809071106080203020a060a040306010c00080416030c020902011200300436030f0202060202030b020a020402010a04080310020002020203010b0200020202040a020002020204, 0x11515131112110b0b0b09120812020602150101010a1515131112110b0b0b09120813021202060201010a1515131112110b0b0b09120813021202060201010a061515131112110b0b0b09120812020602150101010a1515131112110b0b0b09120813021202060201010a1515131112110b0b0b09120813021202060201010a0601151513111211120f0b09120811060602030101010a15] private def node223:Certificate:=PackedParametricCertificateData.decode 9 data223 private def node224:Certificate:=.split node192 node223 private def node225:Certificate:=.negative 1 [(1,0),(1,8)] node224 private def node226:Certificate:=.split node113 node225 private def node227:Certificate:=.positive 1 [(1,1),(1,7)] node226 private def node228:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node227 private def node229:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node228 private def node230:Certificate:=.positive 1 [(1,0),(2,10)] node229 private def data258:List Nat:=[ 0x115150f0f0e0e150b110b09090f08080803030a020a15150f0f0e0e150b110b09090f08080803030a020a15150f0f0e0e150b110b09090f08080803030a020a060a040306010c00080416030c020902011200300436030702050800080306030d020a060604030403100200020202030b02080604040108040c0315150f0f0e0e150b110b09090f08080803030a020a15150f0f0e0e150b110b09090f08080803030a020a15150f0f0e0e150b110b09090f08080803030a020a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311041006010203060310040002020603010e0402020206030d040906010203060315150e0e0f0a0b090f080b040e0312020f020915150e0e0f0a0b090f080b040e0312020f020915150e0e0f0a0b090f080b040e0312020f0209060a040306010c00080416030c020902011200300436030506030200040304030a02080202040102040603110410060102030603100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node258:Certificate:=PackedParametricCertificateData.decode 11 data258 private def data303:List Nat:=[ 0x102020b010a0109010a151511110f0f110b0a0a080802020b010a0109010a151511110f0f110b0a0a080802020b010a0109010a060b0803060118031a031515110b0a0a0f080907090504040f02020204000a1515110b0a0a0f080907090504040f02020204000a1515110b0a0a0f080907090504040f02020204000a060a040306010c0008041603010111040b0c0204010e041204010f020906011200020414040e0608120214000e0422041515110b0a0a0f08090504040f020702020204000a1515110b0a0a0f08090504040f020702020204000a1515110b0a0a0f08090504040f020702020204000a060a040306010c00080416030c06050a02020008040c031304040202020311040b0c0204010e0412040c0202020202031111110b0b0b0e0a0a0a080815040f02080203020a1111110b0b0b0e0a0a0a080815040f02080203020a1111110b0b0b0e0a0a0a080815040f02080203020a060a040306010c00080416030c06030a0202001204160313040502020603040315150f0f0e0e110b0a0a0f0808080404030302020a15150f0f0e0e110b0a0a0f0808080404030302020a15150f0f0e0e110b0a0a0f0808080404030302020a060a040306010c00080416030c020902011200300436030502040200020302030110020002020203010e060812030e0206041404010d300c020a1a062004300308020002020204, 0x115150f0f0e0e110b0b0b08080b020a02020209010a15150f0f0e0e110b0b0b08080b020a02020209010a15150f0f0e0e110b0b0b08080b020a02020209010a0615150f0f0e0e110b0b0b08080b020a02020209010a15150f0f0e0e110b0b0b08080b020a02020209010a15150f0f0e0e110b0b0b08080b020a02020209010a060113020d060106001e042004151511110f0f110b0a0a080802020b010a0109010a151511110f0f110b0a0a080802020b010a0109010a151511110f0f110b0a0a080802020b010a0109010a0610020b02010803080315151513110b0a0a0f080907090504040f0202020a15151513110b0a0a0f080907090504040f0202020a15151513110b0a0a0f080907090504040f0202020a0614040a0201060008040e03010111040b0c0204010e04120415150f0f0e0e110b0b0b08080b020a02020209010a15150f0f0e0e110b0b0b08080b020a02020209010a15150f0f0e0e110b0b0b08080b020a02020209010a061510030202060313020d060106001e042004151511110f0f110b0a0a0808] private def node303:Certificate:=PackedParametricCertificateData.decode 11 data303 private def node304:Certificate:=.split node258 node303 private def node305:Certificate:=.positive 1 [(1,1),(1,7)] node304 private def node306:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node305 private def node307:Certificate:=.positive 14 [(13,0),(3,3),(4,5)] node306 private def data339:List Nat:=[ 0x11111150d130d150c110b0d030f010e01080103010a1111150d130d150c110b0d030f010e01080103010a1111150d130d150c110b0d030f010e01080103010a060a040306010c00080416030b02030600060308031304050202060304031111150c110c0e0b0e090f080808090604030a010a1111150c110c0e0b0e090f080808090604030a010a1111150c110c0e0b0e090f080808090604030a010a060a040306010c00080416030b02010600120314030702050800080306030110020002020203070204020202031111150c110c0e0b0f080808060611030e010a010a1111150c110c0e0b0f080808060611030e010a010a1111150c110c0e0b0f080808060611030e010a010a060a040306010c00080416030b020106001203140305060302000403040309040204010203060311041006010203060310040002020603010e0402020206030d040906010203060311110f0f110c0b090d040b04190212020f020911110f0f110c0b090d040b04190212020f020911110f0f110c0b090d040b04190212020f0209060a040306010c00080416030b0201060012031403050603020004030403090402040102030603110410060102030603100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node339:Certificate:=PackedParametricCertificateData.decode 11 data339 private def data384:List Nat:=[ 0x10e0d150c09090d030f02080202020a010a1111150d0e0d150c09090d030f02080202020a010a1111150d0e0d150c09090d030f02080202020a010a060b0803060118031a031111150d150c150a0909090709050a0302020e010a1111150d150c150a0a09090709050a0302020e010a1111150d150c150a0907090609050a0302020e010a060a040306010c000804160301010b020a02020201040406040109020802010c0002040e0408060706020e00080416041111150c110b150a0a0609050a0302020e0102010a1111150c110b150a0a0909050a0302020e0102010a1111150c110b150a0a0909050a0302020e0102010a060a040306010c00080416030b020506020203130404020202030b020a02020201040406040c0202020202031111150d130d150c110b0d030f010e01080103010a1111150d130d150c110b0d030f010e01080103010a1111150d130d150c110b0d030f010e01080103010a060a040306010c00080416030b02030600060308031304050202060304031111150c110c150b0e0b0f080808090602020e010a1111150c110c150b0e0b0f080808090602020e010a1111150c110c150b0e0b0f080808090602020e010a060a040306010c00080416030b02010600120314030502040200020302030110020002020203010806070603080206040e04010d1c091406060506041c0308020002020204, 0x11111150d0e0d150c150a0b09090902020d010a010a1111150d0e0d150c150a0b09090902020d010a010a1111150d0e0d150c0b090909110202020d010a010a061111150d0e0d150c150a0b09090902020d010a010a1111150d0e0d150c150a0b09090902020d010a010a1111150d0e0d150c0b090909110202020d010a010a06010d020c0201060018041a041111150d0e0d150c09090d030f02080202020a010a1111150d0e0d150c09090d030f02080202020a010a1111150d0e0d150c09090d030f02080202020a010a0610020b0201080308031111150c150b150a0909090709050a0302020e010a1111150c150b150a0a09090709050a0302020e010a1111150c150a0907090609050a0302020f010e010a0614040a0201060008040e0301010a0c0208010600040412041111150d0e0d150c150a0b09090902020d010a010a1111150d0e0d150c150a0b09090902020d010a010a1111150d0e0d150c0b090909110202020d010a010a06151003020206030d020c0201060018041a041111150d] private def node384:Certificate:=PackedParametricCertificateData.decode 11 data384 private def node385:Certificate:=.split node339 node384 private def node386:Certificate:=.positive 1 [(1,1),(1,7)] node385 private def node387:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node386 private def data427:List Nat:=[ 0x1060a040306010c000804160301131007020206030b020a020202010404060411040c0605020306031111150c0e0c19080e0508050f010e01080103010a1111150c0e0c19080e0508050f010e01080103010a1111150c0e0c19080e0508050f010e01080103010a060a040306010c000804160317040a040312000c0412031304050202060304031111150c110c0e0b0e090f080808090604030a010a1111150c110c0e0b0e090f080808090604030a010a1111150c110c0e0b0e090f080808090604030a010a060a040306010c00080416030702010e00200324030702050800080306030110020002020203011111150c110c0e0b0f080808060611030e010a010a1111150c110c0e0b0f080808060611030e010a010a1111150c110c0e0b0f080808060611030e010a010a060a040306010c00080416030702010e002003240305060302000403040315040804020603060311041006010203060310040002020603010e0402020206030d040906010203060311110f0f110c0b090f080b04190212020f020911110f0f110c0b090f080b04190212020f020911110f0f110c0b090f080b04190212020f0209060a040306010c000804160317040904011e0048045203050603020004030403150408040206030603110410060102030603100400020206031204050402060306030e0402020206030d040906010203060301, 0x11111150c0c0619030c030a02080202020c01091111150c0c0619030c030a02080202020c01091111150c0c0919030c030a0202020c0108060b0803060118031a031111150c130c090919080c030e010a01080102010a1111150c130c090919080c030e010a01080102010a1111150c130c090919080c030e010a01080102010a] private def node427:Certificate:=PackedParametricCertificateData.decode 11 data427 private def data460:List Nat:=[ 0x10408040a0302020a010800091111150c0a060f0408040a0302020a0108000906010b02010600120314041111150c0a060f0408040a03080202020a01091111150c0a060f0408040a03080202020a01091111150c0a060f0408040a03080202020a01090610020b0201080308030b020506020204010a0c0208010600040412041111150c19080a0619030a0302020a010800091111150c19080a0619030a0302020a010800091111150c19080a0619030a0302020a0108000906151003020206030b02010600120314041111150c150a0a0619030a03080202020a01091111150c150a130a19030a03080202020a01091111150c150a0a0619030a03080202020a0109060b0803060118031a030b020506020204010b020a02020201040406040107020106000203080408060706020e00080416041111150c150a0a0619030a03080202020a01091111150c150a130a19030a03080202020a01091111150c150a0a0619030a03080202020a0109060b0803060118031a031111150c110c150a09090a03090302020e010d010a1111150c110c150a09090a03090302020e010d010a1111150c110c150a090909060a0302020e010d010a060a040306010c000804160301130404020202030b020a02020201040406040c02020202020307020402020204060603020206030804010d1c091406060506041c0308020002020204, 0x11111150c16080c060f040c0302020c010a01091111150c0c0916080f040c0302020c010a01091111150c130c16080f040c0302020c010a0109061111150c0a060f0408040a0302020a010800091111150c0a060f] private def node460:Certificate:=PackedParametricCertificateData.decode 11 data460 private def node461:Certificate:=.split node427 node460 private def node462:Certificate:=.positive 9 [(11,0),(6,6),(2,13)] node461 private def node463:Certificate:=.positive 3 [(1,4),(8,10)] node462 private def node464:Certificate:=.split node387 node463 private def node465:Certificate:=.split node307 node464 private def node466:Certificate:=.split node230 node465 private def node467:Certificate:=.positive 3 [(1,0),(2,6)] node466 private def data495:List Nat:=[ 0x1151515130e0e0b0b0a0a15090b0908080a0211010a151515130e0e0b0b0a0a15090b0908080a0211010a151515130e0e0b0b0a0a15090b0908080a0211010a060a040306010c00080416030c020902011200300436030702050800080306030b040a0406040102040603100200020202030902080204020106040803151515130e0e0a0a0a08080812040a02080211010a151515130e0e0a0a0a08080812040a02080211010a151515130e0e0a0a0a08080812040a02080211010a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311041006010203060310040002020603010e0402020206030d040906010203060315150e0e120a12090b0913040b04120211010915150e0e120a12090b0913040b04120211010915150e0e120a12090b0913040b041202110109060a040306010c00080416030c020902011200300436030506030200040304030a02080202040102040603110410060102030603100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node495:Certificate:=PackedParametricCertificateData.decode 11 data495 private def data535:List Nat:=[ 0x109070e040f030b03020211010a1515150b0a0a0a0709070e040f030b03020211010a0614040a0201060008040e03010111040d0401020302040c0202020202040f020b0201020302040b0200020202041515150b0a0a0b0509050e0404040f03070202020a1515150b0a0a0b0509050e0404040f03070202020a1515150b0a0a0b0509050e0404040f03070202020a0614040a0201060008040e030f020d060506000a040c031304040202020311040d0401020302041515150b0a0a0b0508040f030b030702020204000a1515150b0a0a0b0508040f030b030702020204000a1515150b0a0a0b0508040f030b030702020204000a060a040306010c00080416030f020d060506000a040c031304040202020311040d040102030204011515150b0a0a0f0608040f0307020202030103000a1515150b0a0a0f0908040f0307020202030103000a1515150b0a0a0f0908040f0307020202030103000a060a040306010c00080416030d020c020306000c040e0313040502020603040315130f0f0a0a15080808060604041102070215000a15130f0f0a0a15080808060604041102070215000a15130f0f0a0a15080808060604041102070215000a060a040306010c00080416030c020902011200300436030502040200020302030110020002020203010e060a060302030204010d040c060902080604040308020002020204, 0x1151515130b0b0b090f030a02090202020a010e000a151515130b0b0b090f030a02090202020a010e000a151515130b0b0b090f030a02090202020a010e000a06151515130b0b0e040f030a02090202020a0100000a151515130b0b0b090e040f030a02090202020a010a151515130b0b0b090e040f030a02090202020a010a060113020f020002030204151515130b0b0a090f060e040f0302020a0100000a151515130b0b0f090b090a090e040f0302020a010a151515130b0b0f090b090a090e040f0302020a010a0614040e020b0401120412031515150b0a0a0a0709070e040f030b03020211010a1515150b0a0a0a07] private def node535:Certificate:=PackedParametricCertificateData.decode 11 data535 private def node536:Certificate:=.split node495 node535 private def node537:Certificate:=.positive 1 [(1,1),(1,7)] node536 private def node538:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node537 private def node539:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node538 private def node540:Certificate:=.positive 11 [(14,0),(9,2),(2,4)] node539 private def data572:List Nat:=[ 0x1150b0b0b0f0a0a0a150413040f020802030203010a150b0b0b0f0a0a0a150413040f020802030203010a150b0b0b0f0a0a0a150413040f020802030203010a060a040306010c00080416030c06030a0202001204160313040502020603040315150f0f0e0e150b0a0a150909090f0808080a020a15150f0f0e0e150b0a0a150909090f0808080a020a15150f0f0e0e150b0a0a150909090f0808080a020a060a040306010c00080416030c0209020112003004360307020508000803060301100200020202030f02080604040106040a0315150f0f0e0e150b0f0a0a0a15090f0808080a020a15150f0f0e0e150b0f0a0a0a15090f0808080a020a15150f0f0e0e150b0f0a0a0a15090f0808080a020a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311041006010203060310040002020603010e0402020206030d040906010203060315150e0e120a0f0a0b090f080b04120211020915150e0e120a0f0a0b090f080b04120211020915150e0e120a0f0a0b090f080b041202110209060a040306010c00080416030c020902011200300436030506030200040304030a02080202040102040603110410060102030603100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node572:Certificate:=PackedParametricCertificateData.decode 11 data572 private def data612:List Nat:=[ 0x1150f0f0e0e150b0a0a0f08090704040f0202020a0614040a0201060008040e03010111040b0c0204010e0412040c0202020202040f020906011200020414040e0608120214000e04220415150f0f150b0a0a0f08090504040303070202020a15150f0f150b0a0a0f08090504040303070202020a15150f0f150b0a0a0f08090504040303070202020a0614040a0201060008040e0313020c06050c0006040a031304040202020311040b0c0204010e04120415150f0f150b0a0a0f08090503030702020204000a15150f0f150b0a0a0f08090503030702020204000a15150f0f150b0a0a0f08090503030702020204000a060a040306010c00080416030c06050a02020008040c031304040202020311040b0c0204010e041204010f0f0c0c0e0a0a0a150413040b040f02080203020a0f0f0c0c0e0a0a0a150413040b040f02080203020a0f0f0c0c0e0a0a0a150413040b040f02080203020a060a040306010c00080416030c06030a0202001204160313040502020603040315150f0f0e0e150b0a0a0f0808080404030302020a15150f0f0e0e150b0a0a0f0808080404030302020a15150f0f0e0e150b0a0a0f0808080404030302020a060a040306010c00080416030c020902011200300436030502040200020302030110020002020203010e060812030e0206041404010d300c020a1a062004300308020002020204, 0x115150f0f0e0e150b0b0b0a0a150908080a0202020a15150f0f0e0e150b0b0b0a0a150908080a0202020a15150f0f0e0e150b0b0b0a0a150908080a0202020a0615150f0f0e0e150b0b0b0a0a150908080a0202020a15150f0f0e0e150b0b0b0a0a150908080a0202020a15150f0f0e0e150b0b0b0a0a150908080a0202020a060113020d060106001e04200415150f0f0e0e150b0a0a08080f0202020b010a010a15150f0f0e0e150b0a0a08080f0202020b010a010a15150f0f0e0e150b0a0a08080f0202020b010a010a0614040d020b02010c040c0315150f0f0e0e150b0a0a0f08090704040f0202020a15150f0f0e0e150b0a0a0f08090704040f0202020a15] private def node612:Certificate:=PackedParametricCertificateData.decode 11 data612 private def node613:Certificate:=.split node572 node612 private def node614:Certificate:=.positive 1 [(1,1),(1,7)] node613 private def node615:Certificate:=.positive 4 [(4,0),(1,6),(1,8)] node614 private def node616:Certificate:=.positive 4 [(4,0),(1,5),(1,7)] node615 private def data648:List Nat:=[ 0x11111150d130d150c0b040d030f010e01080103010a1111150d130d150c0b040d030f010e01080103010a1111150d130d150c0b040d030f010e01080103010a060a040306010c00080416030b02030600060308031304050202060304031111110f150b0e0b0f080808090604040e020a010a1111110f150b0e0b0e090f080808090611020a010a1111110f150b0e0b0e090f080808090611020a010a060a040306010c00080416030b02010600120314030702050800080306030110020002020203070204020202031111110f150b0e0b0f0808080f020a020a010e000a1111110f150b0e0b09090f0808080f020e010a010a1111110f150b0e0b0f0808080f020e010a010e000a060a040306010c00080416030b020106001203140305060302000403040309040204010203060311041006010203060310040002020603010e0402020206030d0409060102030603110f0f0f110a12090b090b04120211020f0209110f0f0f110a12090b090b04120211020f0209110f0f0f110a12090b090b04120211020f0209060a040306010c00080416030b0201060012031403050603020004030403090402040102030603110410060102030603100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node648:Certificate:=PackedParametricCertificateData.decode 11 data648 private def data684:List Nat:=[ 0x1010a1111110f0e0d150c0b090d030f02080202020a010a1111110f0e0d150c0b090d030f02080202020a010a0614020c0201060306031111150c150b150a0909090709050a0302020e010a1111150c150b150a0a09090709050a0302020e010a1111150c150a0907090609050a0302020f010e010a0614040a0201060008040e0301010a0c0208010600040412040c02020202020409020802010c0002040e0408060706020e00080416041111150c150b150a0a0609050a0302020e0102010a1111150c150b150a0a0909050a0302020e0102010a1111150c150b150a0a0909050a0302020e0102010a0614040a0201060008040e030b020506020203130404020202030a0c0208010600040412041111150c150b150a0a0609050a0302020e0102010a1111150c150b150a0a0909050a0302020e0102010a1111150c150b150a0a0909050a0302020e0102010a060a040306010c00080416030b020506020203130404020202030b020a0202020104040604011111150d130d150c0b040d030f010e01080103010a1111150d130d150c0b040d030f010e01080103010a1111150d130d150c0b040d030f010e01080103010a060a040306010c00080416030b02030600060308031304050202060304030d020a06060403040410020002020203010806070603080206040e04010d1c091406060506041c0308020002020204, 0x11111110f0e0d150c0b090d0302020d010c010a010a1111110f0e0d150c0b090d0302020d010c010a010a1111110f0e0d150c0b090d0302020d010c010a010a061111110f0e0d150c0b090d0302020d010c010a010a1111110f0e0d150c0b090d0302020d010c010a010a1111110f0e0d150c0b090d0302020d010c010a010a06010d020c0201060018041a041111110f0e0d150c0b090d030f02080202020a] private def node684:Certificate:=PackedParametricCertificateData.decode 11 data684 private def node685:Certificate:=.split node648 node684 private def node686:Certificate:=.positive 1 [(1,1),(1,7)] node685 private def node687:Certificate:=.positive 4 [(4,0),(1,6),(1,8)] node686 private def data727:List Nat:=[ 0x1040306010c000804160301130404020202030b020a02020201040406040b060502020203110f150c130c110808050c030f010e01080103010a110f150c130c110808050c030f010e01080103010a110f150c130c110808050c030f010e01080103010a060a040306010c00080416030f020a06031800100418031304050202060304031111110f150b0e0b0f080808090604040e020a010a1111110f150b0e0b0e090f080808090611020a010a1111110f150b0e0b0e090f080808090611020a010a060a040306010c00080416030f020906012a00640472030702050800080306030110020002020203011111110f150b0e0b0f0808080f020a020d010a010a1111110f150b0e0b0f0808080f020a020d010a010a1111110f150b0e0b0f0808080f020a020d010a010a060a040306010c00080416030f020906012a00640472030506030200040304030d020806020803080311041006010203060310040002020603010e0402020206030d0409060102030603110f0f0f110a12090b090b04120211020f0209110f0f0f110a12090b090b04120211020f0209110f0f0f110a12090b090b04120211020f0209060a040306010c00080416030f020906012a00640472030506030200040304030d0208060208030803110410060102030603100400020206030a02050602080308030e0402020206030d040906010203060301, 0x1110f110e150c130c11030c030e020a02020209110f110e150c130c11030c030e020a02020209110f110e150c130c11030c030a02020208060b0803060118031a03110f110e150c130c09090c0302020e010a0108010a110f110e150c130c09090c0302020e010a0108010a110f110e150c130c09090c0302020e010a0108010a060a] private def node727:Certificate:=PackedParametricCertificateData.decode 11 data727 private def data759:List Nat:=[ 0x1130c150a0c030a0302020a01080009110f150c130c150a0c030a0302020a0108000906010b0201060012031404110f150c130c150a0a030f02080202020a0109110f150c130c150a0a030f02080202020a0109110f150c130c150a0a030f02080202020a0109060f0201020202030b020506020204010a0c0208010600040412040c02020202020407020106000203080408060706020e0008041604110f150c130c150a0a030f02080202020a0109110f150c130c150a0a030f02080202020a0109110f150c130c150a0a030f02080202020a0109060f0201020202031111110f150c150a09090a060a0302020d0102010a1111110f150c150a0a0909090a0302020d0102010a1111110f150c150a0a0909090a0302020d0102010a0614040a0201060008040e0301130404020202030a0c020801060004041204110f150c130c0c030a030f02080202020a0109110f150c130c0c030a030f02080202020a0109110f150c130c0c030a030f02080202020a0109060b0803060118031a031111110f150c150a09090a060a0302020d0102010a1111110f150c150a0a0909090a0302020d0102010a1111110f150c150a0a0909090a0302020d0102010a060a040306010c000804160301130404020202030b020a02020201040406040107020402020204060603020206030804010d1c091406060506041c0308020002020204, 0x1110f110e150c130c160811030c0302020a0109110f110e150c130c160811030c0302020a0109110f110e150c130c160811030c0302020a010906110f150c130c150a0c030a0302020a01080009110f150c] private def node759:Certificate:=PackedParametricCertificateData.decode 11 data759 private def node760:Certificate:=.split node727 node759 private def node761:Certificate:=.positive 12 [(13,0),(3,5),(8,7)] node760 private def node762:Certificate:=.positive 1 [(1,3),(2,10)] node761 private def node763:Certificate:=.split node687 node762 private def node764:Certificate:=.split node616 node763 private def node765:Certificate:=.split node540 node764 private def data812:List Nat:=[ 0x10108010a060a040306010c000804160301130404020202030b020a020202010404060401110e150c0e0c110a08050c030f010e01080103010a110e150c0e0c110a08050c030f010e01080103010a110e150c0e0c110a08050c030f010e01080103010a060a040306010c00080416030f020a0603180010041803130405020206030403110f110e150b0e0b0e090f08080809060d010a010a110f110e150b0e0b0e090f08080809060d010a010a110f110e150b0e0b0e090f08080809060d010a010a060a040306010c00080416030f020906012a0064047203070205080008030603011002000202020301110f110e150b0e0b110a0f0808080f020d010a010a110f110e150b0e0b110a0f0808080f020d010a010a110f110e150b0e0b110a0f0808080f020d010a010a060a040306010c00080416030f020906012a00640472030506030200040304030d020806020803080311041006010203060310040002020603010e0402020206030d0409060102030603110e0e0b110a0b090f0811040b0412020f0209110e0e0b110a0b090f0811040b0412020f0209110e0e0b110a0b090f0811040b0412020f0209060a040306010c00080416030f020906012a00640472030506030200040304030d0208060208030803110410060102030603100400020206030a02050602080308030e0402020206030d040906010203060301, 0x1150c0e0c0e040c0304030a02020204010e0009110e150c0e0c0c0304030a02020204010e0009150c0e0c0e040c0304030e020a020202040109060b0809060106030803150c0e0c130b09090e040c0302020f010e010a010a150c0e0c130b09090e040c0302020f010e010a010a150c0e0c130b09090e040c0302020f010e010a010a0614040a0201060008040e0301130404020202030a0c020801060004041204110e150c0e0c11030c030e020a020202040009110e150c0e0c11030c030e020a020202040009110e150c0e0c11030c030a020202040008060b0803060118031a03110e150c0e0c090911080c0302020e010a0108010a110e150c0e0c090911080c0302020e010a0108010a110e150c0e0c090911080c0302020e010a] private def node812:Certificate:=PackedParametricCertificateData.decode 11 data812 private def data837:List Nat:=[ 0x1110e150c0e0c160811030c0302020a01000009110e150c0e0c160811030c0302020a01000009110e150c0e0c160811030c0302020a01000009060f0201020202040b0201060012031404150c150a0e0a0e040c030a0308020a01000009150c150a0e0a0e040c030a0308020a01000009150c150a0e0a0e040c030a0308020a0100000906150c150a0e0a0e040a0302020a010800000009150c150a0e0a0e040a0302020a010800000009150c150a0e0a0e040a0302020a01080000000906010b020506020204010a0c0208010600040412040c02020202020407020106000203080408060706020e0008041604150c150a0e0a0e040a0302020a010800000009150c150a0e0a0e040a0302020a010800000009150c150a0e0a0e040a0302020a010800000009060b020606020203150b150a0e0a0e040b030a03090302020e010d010a150b150a0e0a0e040b030a03090302020e010d010a150b150a0e0a0e040b030a03090302020e010d010a0614040a0201060008040e0301130404020202030a0c0208010600040412040b06050202020407020402020204060603020206030804010d1c091406060506041c0308020002020204] private def node837:Certificate:=PackedParametricCertificateData.decode 11 data837 private def node838:Certificate:=.split node812 node837 private def node839:Certificate:=.positive 12 [(13,0),(3,5),(8,7)] node838 private def data887:List Nat:=[ 0x10a0b090a01080102010a060a040306010c000804160301130404020202030a0208020204010204060401170e110e150b110a0e0508050f010e01080103010a170e110e150b110a0e0508050f010e01080103010a170e110e150b110a0e0508050f010e01080103010a060a040306010c00080416030f020906032a0010041e03130405020206030403110f110e150b0e0b0e090f08080809060c010a010a110f110e150b0e0b0e090f08080809060c010a010a110f110e150b0e0b0e090f08080809060c010a010a060a040306010c00080416030f020906012a0064047203070205080008030603011002000202020301110f110e150b0e0b08080f020c020a020e010a010a110f110e150b0e0b110a08080f020c020a020a010a110f110e150b0e0b110a08080f020c020a020a010a060a040306010c00080416030f020906012a00640472030506030200040304030502020402020311041006010203060310040002020603010e0402020206030d0409060102030603110e0e0b110a0b090f0811040b0412020f0209110e0e0b110a0b090f0811040b0412020f0209110e0e0b110a0b090f0811040b0412020f0209060a040306010c00080416030f020906012a00640472030506030200040304031304020202020311041006010203060310040002020603100402020202030e0402020206030d040906010203060301, 0x11715170e110a1504170315020a0202020000091715170e110a170315020a020202071715170e110a17030a0202020606170e110a150417030a02020211000f00020009170e110a150417030a02020211000f00020009170e110a17030a02020211000200070601170e150b0b0b0b090f040e040f010a01080102010a170e150b0b0b0b090f040e040f010a01080102010a170e150b0b0b0b090f040e040f010a01080102010a0614040a0201060008040e0301131007020206030a02080202040102040604170e110e110c110a0b0417030a020202000009170e110e110c110a0b0417030a020202000009170e110c110a17030a02020200000706161003060110031203110f170e110e150b0b0b110a0e010a01080102010a110f170e110e150b0b0b110a0b090a01080102010a110f170e110e150b0b0b11] private def node887:Certificate:=PackedParametricCertificateData.decode 11 data887 private def data910:List Nat:=[ 0x11511150a0e0a16080a0304020a010200000009150a0e0a16080a0304020a01020007150a0e0a16080a0304020a01020007060b0803060118031a040c020a02010c00240428041511150a0e0a0a031502080202020a01000009150a0e0a0a030e02080202020a0107150a0e0a0a030e02080202020a0107060b0206060202040c020a02050c030404010a020802020401020406040c02020202020408020602010c000404100408060706020e00080416041511150a0e0a0a031502080202020a01000009150a0e0a0a030e02080202020a0107150a0e0a0a030e02080202020a010706150a0e0a0e040a0304030a0104010800000009150a0e0a0e040a0304030a0104010800000009150a0e0a0e040a0304030a0104010800000009060113020a060806030204130404020202030a020802020401020406040c06070605080308040f02060604060002040804060603020206030804010d1c091406060506041c0308020002020204] private def node910:Certificate:=PackedParametricCertificateData.decode 11 data910 private def node911:Certificate:=.split node887 node910 private def node912:Certificate:=.positive 8 [(5,7),(1,9),(24,11)] node911 private def node913:Certificate:=.split node839 node912 private def node914:Certificate:=.negative 1 [(3,2),(1,7)] node913 private def node915:Certificate:=.negative 2 [(1,0),(3,1),(2,6)] node914 private def node916:Certificate:=.negative 2 [(5,0),(1,2),(1,5)] node915 private def node917:Certificate:=.split node765 node916 private def node918:Certificate:=.split node467 node917 private def node919:Certificate:=.split node85 node918 private def node920:Certificate:=.positive 3 [(1,1),(8,4)] node919 private def node921:Certificate:=.positive 3 [(1,0),(2,3)] node920 private def data932:List Nat:=[ 0x115151111150a130a0b0a15091309150213020915151111150a130a0b0a15091309150213020915151111150a130a0b0a150913091502130209060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311040c0804020302040803100400020206030f08080607060212041a030e0402020206030d100c120a36012004300308020002020203] private def node932:Certificate:=PackedParametricCertificateData.decode 11 data932 private def data942:List Nat:=[ 0x1a1d2d8a9f7901509010203eca7a3ce98f1bb9f9bc9e6adc9ede58bb7aa130901020b9386d6e4ffb6cdbec1a9ac8bc0fbc39fdd8e0a090102088dacee8feac3c4ec99d988c7fdccdfbf80150801023ffb93ebdedce4d7b2deb9beb5c3ee9bbe961308010201e3cadfceb0b2ef9593d5abd2c0ada1cfa5d2080801020ea987c298efad85b4a3b4f3e4fa83c581c0150201020dc4a7a890f387f1fe93dda692d8f69bb89413020102018ef9d0f5b6dbc1fec7f69e88c6f491beac1515000201fef6d3b0beb8efccfed5bcaa93e0aa88db90120a000202c8ab99e98d9ac89e9898b49bb2939aedb01509000203efd7d6dcc9dbd9badc8fcec1f4849181858a130900020ae3d1d8fedd98868284a084a1d8fdf6eeed9e0a09000209c8fbc6dcf1e7e7e7eed5f0e6a4b8e395b0150800023ef4aadcd3d99593e189c8919781f9aa96c2130800020293dee6e0c6c2dfa1d8a09fdebde7ecd3a5a6080800020985c19ba582ead4d4b1e4faef88c8c6dd90150200020deb809fff97b1b9afdee6d7bba19282b6b81302000202ef99c4b6c6829791a3a39df1c3aac5e7881e01d8db959fbd84af88e882e8000a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311040c0804020302040803100400020206030f08080607060212041a030e04010200020308030c060a120008030803, 0x102a9ca0b9de70180a72bd610f5c24ec7ef02bd9a7dd30003e2e7bc85d088b886f9f0c9cbf001ecf805a8b80196c2e04a80d50181cf02ed9939ae851bca9e0001d2fe84adce9a9df08fa49b801515020201f2cfa086e591a5c2baf3fd9d8085a996a8c0120a020201e1ffd6e2d1bcb984c6dd95aece9fd985b01509020203e8bb8fc882faaf82edec9cf0bdace8dbb3a2130902020bccd6eda2b7c3b2fababb9accc1919a87b6c60a09020205cbf79093d0b4fcafef80fbad97e2ea88d0150802024cceaca5c98881ecf5c8ef89fdf888ecca821308020201ca87b6ddb78cd7f79bb9e2c2f8a0dbbaabe6150202020cacf8fbfcb696f78f94a0e0f49ed4c4efc01515010201fae483e5eaeff881c0c88ef1f4c6c7cbb9a0120a010202cc9496d5b3c2b7b2c5daef] private def node942:Certificate:=PackedParametricCertificateData.decode 10 data942 private def data999:List Nat:=[ 0x1a19499af8cb9ddaaaed6f28cadbbf28afc8ec8f5a5e61515000205cde8a7de80d4feabeaa9fbb1fefa96fdbc80948e969c8e9c8fbcc58d8aff9bf3f3e08deaf8e014140002039cd5d6c8ca98d39ed4dec4eaccdcff88d996d2d0f8c7a8a4b5e3ecbeb3b4bfa8ffe88bcf90c41512000204b1948eb599eab8b5dcb8f8a88de0c4b182c78ec78c9fab898d9da9829abdb58a80b5a7a0e8901411000235bbac9ea1948ff5a88886e5a2dad9b4d696d6aef4e9e797e1b4b3fcb4b7c4b4a8f7e695d1f01409000208a2e7e2cfbbf48ad1a892aed480b6e5d2d09bd798a5f6c0b5dad4ccdda4f2ecabc2f2bddedaa80808000206e3c5e6b88aabb1c3c893c4d7ddcdc2f3adb2d0d6ed8beeffaaf78a9b9fea82a49bd1bfffbc1506000201cae7cfb3efa4c6a3aad7fbefad9cd1af8bcccfb0c2c8dfafadf995bcfd9fe195c9c1d1d689b0120600020c9be3f3a8beaafc83e0b893bbfbbb94e7c0b2c096eb9b9be8c7d490c98cc999c8cdede4bad00606000203b597c7acfbc1dfe8d3a3e2add8f0edacfefea4f1ba8bd0c4a7a0aa8cb0a78ee1f5f9da92ec1e39cec3a3a3bc80bd9ceab3eef7c5d4e8d695bfbad7e4eef2d6e2fdf68986b7ac000a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030c0403020102030403100400020206030b0200020202030a02000202020301, 0x1ebcadcc8f7b3b1b5fae1a087b3bda88ef2b68d918fba90150a020201dae883f3e7a896c7c7d2d4becaeff2c2e8a0db83808fd9c9d0b7cb91fcb39b8186e6d69ff4c8120a020209cdb0dedfc5d486d89ca4b7bee2a6e0fa9eace1a6edd4dabce4abc69383dac3c1e696e0fff0140802027be6beddd7cb8fccecdcbac28da3cf8baaadcdf8dabde7e9d3dcdaedf1f498f6d2b6b2e591f0130802020295d8e786c1a786a8b7fed5b9e2c292fcf2bbcdf7e1e0f891a2fdade48d8ccdd9f7f1d7abc9a8080802021cd8e5e9f3a6ddccc1df8bdcfeb2829ecbfd91e4afcffeebea8f93cbb599dd99a3d9d887cca81515010203beafc8ec9bb0befcc2bca194e7def8eff1a5d1e8c9b28485aadde7afa8d280eca3cbb8a8cc8814130102028fdfe2b182c78ee5fa94dbe8e68ae39bc78edffdaf9bb9fdbbbce88edac8eee4cb969dc2aa881512010207f18fc5addfd7dad381d5b4aeaef4818c92bcc4a9d4ddb5febbe9dae3f7d7dbeafc81cbf9d7b01212010210b4f0c3978eff909ba786f3f7b5bec1c094e288f3d8a1e6d5a0b3d2dc9ef9c9efef98dbb6c8140901020187ceb289dff5c5c8dcacf4c5b4b4be94e9aef088da85c3bb87d28fbaceca99c5a9d3a382ccbc0808010201a2e48d8881d9e1fedf8dcfcac0d0a2aeabd5b5b1b8ec84c584bccbc58cc79a91e283c5f2bbae0606010205d981c1caf586b3a6dba085a5f3db91, 0x1c4d4c9ccf8acc78097c01b59ae838e83ec8dd2f48dd1aced9dee88000a040306010c00080416030c02090201120030043603130404020202030a020802020401020406030c020202020203100400020206030b020002020203015da4bd4bf4d81294b80aaa990119d1d0bfcede878ba48f95daa8ba8caf8a9e82bff4dcc9a29bedc5b7b390eb8dadc80c86ba2ddea864ce8b32b5960139b3dacba7a1ceca87cce0f8d4f8efaed4ab88d3a0dea49c94fafb83eaa4bd96c04de6d453f49e24e1fa15acc7012f98aafcf798bba28fbbe5d2f598d8fac8c286ac8a98c682a3d1f689bee09baec006f887038cdc05dfd0038fdf2cb0e23cc2fb27faec13b2a90054b9c783fccebeb982f5b4cf87fbf5fbe1e1efd1a3e8b485b0ccfaf6aeb3a49e8aec0fa5c211d6d107b2de03e8c92de8de06eec33dac8d1fb0c6002e89eb9dfabe8fa298d9e7eeede68ea7ed9fe596ecfed58dd1c9a59ae581d7c6c3e0018399b168feba1cbbb40fc9d7469e8833bb9917b5c30cb7aa000bdcdae8c4d1cdf4f882d0d2b1f491fdd2e6fbb6f8fa9fb3f5c897ceca85aeb5e7bc1515020202a99e9ba0c6d6b4ef9bedc7f6c4c6f5b0beaadca6cf8e82bda7c6abf2f6d5d2cee6aaabb8b29815120202078bcfa6f2d886a1c9d1b6e9dcd9c1bfe0b9abd2c7f892aaecefeea99fda8dbee689a8b78fdee81212020215d3c5e3e8afead393a88be0dc9df5, 0x192afc5deaaaee7e9d8f28c1308020202a28093a5bb98f6dd9597a7f5ada4dbd9c8e596ade7fbe4070702022f8dafee9ce7c68bddb7e49aa9d6c7cc99cabfcd9ce0150602020a9bf1938bcbea98d1acb5eeda9cbfe7cde7e4ccc6f6c00706020205cef189f7fce2d6fdb3cdd68195e6d08fd7adeed680151501025194c6d4bbd5c0afaf94b58f9f89aba4eff7c8df83ee801409010232ddddffa5a5a7adf4e8ecfcbff68af3a7e3a394e8f8e01309010220f2c59ebbd1e7c69fb0bce8c0d4f58d86d7ec8cdca7b0150801020180c787ee9cf2eb8690e3d180989efe9b99f183e8dac6c41308010202a68ede98d8d389e78fa4ecaac3acbfd68ec4c1b2f7a08c070701024fd7a5c89dab87d4988bfbd898aaa385a0abe4d78f80150601020be6cfe9968596c1b0b79b89ef95bdcdfba3d5d0bea9f0070601020bbd91e294dccf98e4fbcff2eef3d7effc96fba7c01515000254cfc2ecf09e808ecb97f3e8f7e8e9e0b2adf29187fec01512000215d7949aecb18bddd9d4aba4e5d88683fe93a8afa1c3c01409000223c3eea8d5bc8ca5d396fcb690ea99b8fcc3a6a4a8a8a81309000227b3d2e5ec82db878baa9f9bfddf808df6c0afbb96a1f81508000272f2dee3d2a3eae6a78feedd8c9286e8f3c2bda1d6aea61308000202a3c9f9c7c1fe97cfc19087cdc283d7eb918d9ae0accdd20707000255dde79abee6ababd9d397ed, 0x11a031404030202020315151311150e0a0909080f0608060404120208020a15151311150e0a0909080f0608060404120208020a15151311150e0a0909080f0608060404120208020a060a040306010c00080416030c02090201120030043603010e040b040a04010e040e03010115151311130f150e130804041502130202010915151311130f150e1508130813020715151311130f150e1508130813020706120803060018031a031404030202020315151311150e130a1508130813070907080206020a15151311150e130a1508130813070715151311150e130915081308130707060a040306010c00080416030c02090201120030043603010a020802020401020406030f060102020203100400020206030162bcbc47fda604eaf204eaf101058ca78a86a8a6fdc897c6a696d9b288818026dc01ba8d358035ab2f99e247b4ab01f7d901f7da003ffd96fac38aa0d7cee6eff7939190c2b6e06ca1eb50c99703f0f103f1e662face45f8f80489cc0489cb0074949d87c992f7e5ccc6f19a9189b0a2e01515020254d8c9a0ee88a2e6f18efcccc2cbbaa4c7f395f9fdc2c01409020217a588a98ac3e5d3c8f5f6fcc0bab18cc695bc8bd2a380130902022aad8ff396fdcaa0ed92a282d18587c4d3c4efa097e8c00909020201ea8686dbeeb8ffebf5df94d0d3e5ebb3d2fde89a801508020279c7e6ccabafb9dc9387bdf5, 0x115151311160f130f150e130b1302060201010915151311160f130f150e130c1302060201010915151311160f130f150e130c130206020101090615151311130f150e130b060201010e0003000915151311130f150e130c060201010e0003000915151311130f150e130c060201010e00030009060115151311130f150e0a0615031302060203010915151311130f150e0a0615031302060203010915151311130f150e0a061503130206020301090613020002020203010f020206020204121c0e140b060a06041c031002000202020415151311130f13080e0404041302060208000915151311130f13080e0404041302060208000915151311130f13080e0404041302060208000906130200020202031404030202020315151311150e0a0913080f0608060e04120208020a15151311150e0a0913080f0608060e04120208020a15151311150e0a0913080f0608060e04120208020a0610040a02010a0004040e030c02090201120030043603010e040b040a04010e040e031311130f150e13080f060404130206020800091311130f150e13080f060404130206020800091311130f150e13080f060404130206020800090612080306001803] private def node999:Certificate:=PackedParametricCertificateData.decode 10 data999 private def node1000:Certificate:=.split node942 node999 private def node1001:Certificate:=.split node932 node1000 private def node1002:Certificate:=.positive 1 [(1,1),(1,7)] node1001 private def node1003:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node1002 private def node1004:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1003 private def node1005:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1004 private def node1006:Certificate:=.positive 3 [(3,0),(2,2),(4,7)] node1005 private def node1007:Certificate:=.positive 3 [(1,0),(2,6)] node1006 private def node1008:Certificate:=.positive 1 [(1,0),(3,2)] node1007 private def data1029:List Nat:=[ 0x1151513130e0e0a0a11090a080808130412040a020a151513130e0e0a0a11090a080808130412040a020a151513130e0e0a0a11090a080808130412040a020a060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030c0403020102030403100400020206030e060a0603020302030e0402020206030d04090601020306031515110b120a150912090b09130412021501091515110b120a150912090b09130412021501091515110b120a150912090b0913041202150109060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311040c0804020302040803100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node1029:Certificate:=PackedParametricCertificateData.decode 11 data1029 private def data1080:List Nat:=[ 0x1c21204010204d6faf2c4d598949cc1f5e1c9d6b78aa0efe6849cd0c28df8e5e8a6a792eee8110401020bf5f785dbd3a1ace095d78adab0f2cadffdfeecc3f49fadb9ce93cce09ac808040102018cdfb98abba08b92d6b5c08482e39ca4aae5ea99c7b6de9bb6afcddabfc4861515000201d4d3e68bf28f9090ffc8bbd0aada8ba4b1d2becfbac4e4b6b5b4d3fe99bc80150a000219b9e7dbfd95f0a4888f9fb780b5b6febdf3c498f5e9aeadd9e1ae96ec88800a0a00024bb885a2eed081f48aeb98fceac2cd91c5a6a5c293d285f3eaa1f6a5d7aa801208000203d8a898ffaa8ebe8eb9bab4c7cca093a0fa97ee91c6a7c5b9cca8a68de4801108000203d0eb95dea2e2fc9fa2e8fad18d99d1e3c6e092e2beb4aabb868db7fd9aff800808000202a9cbcdf3f5baeca183f9ddfab7a486a398f8ecf8efed87eecfdd889fb68f801506000273d6f585f6b6a2bbf483fec3928e8bf4f9ed8ccfbee09de8f0b3c2fdde98800e0600024ffe99a0c99bd487acb4c3b5c1bbc3b2caa0ad96b8c4a3e992ebc5dd9180120400023ad8c5ed83f8d5adbaf0d281e8d9a8e88a80c4fab3a19ffbfebfbdb7acd2801e4b8194b0c3998fe199d1d5caa090a2edc4948b8d95f9a79380000a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030c0403020102030403100400020206030101, 0x1afdfa9b2b6cf9aa0f6c6c4b8801515020202d1dcce88bdbbbcb3b8b8b4bca4bb8af2d5f6afbff082ee98efafcf8ca08c801312020202cdc889a589eea6b4b2c2bfd489e1afac96f7f5889fed98f3bbe6aed0cf9e80131102023783effccdc4dae89bf8cd95dc80909ed2f1d8c2f8add1f980a1c1cab6ac800a0a020231c1dbeabce1ef8399cae796a692ffc1b0f49db2aea4acacb3e5a2cda691801208020237abf581cae4e7d5a9d6e5e1e5d485e9bdd1cc8fe9f29bfa80f0cfb08b83a01108020203d1e38385babde7fe8c9cb8d1e589e6a3eab389a8e2e8a1d7e1a7cbceb6e7e00606020201b0d0a1a8e198d4b7b7ded0d9b9f5e0e9deb384e8a2a9bef1e5fb9197cdf7e01204020203bea299b68feaed92dac5da85b69acb91efbaad9bbcd3fd8682ecf6d389fa8008040202019fecb5c2b28b80d9e2b899fed08cc2e79791f981cef39edef890a2e9a0a8a01515010202d5b7da9bbbeedaf9aec9acdf96a29cc4e5eca5eef7c3e3eed5a7edc99594a00a0a010246eef0b2ebecf2d28ba9e1b5a2a582a78de3a8c395eee9cec1adb8ddf3abe01208010201eedea9a2b2a7ece4b7caf7d6b288da99f5b4e6fae2f4b2ba919bd7ec8ffe861108010201f383b9f0e2bcc493dfddea93efb6cdbc93e599c0a2bced9e999186f9c9c9a206060102029796bee9a7bf9dc4a6f6b8cce995fec5efa1c3e6cdfeece3e3d2b2be8eff, 0x10601024f9995e79b8185bfd79eedc8ed8ccc83e8f989e9b2f0efecc01111000201aae0e9c2d380cfb2a983f5c58df4b7fba6a4b9e4d8e895a080110a00020583959ce6f38aacd599c3b9f7c196edf4f887c6b0e0c796800a0a0002058cf4e6f5c7f7f1acd5adbfa1f78af290eedcf78aa7bf9ec0110900022abfeccffea5d4dcf78bb7a7fa8ac0adc7e3ca88f68eadf8800707000226b1defd85d5b994fbd6a5a3968b86b384c79fd0fe9693e0c01106000201a5a1dbdeffeee3f6f7c4b3fcfdc98db5d0b5cfd989becf96800a0600022bbbff94eda6e4fbf5f48abde6bb8ed6ccbfbac5b8ccb9f880060600024d928dc59fbfb19f95ff85d6ede4a7c3bdabbeb1a6c9c8bec01e01b0cab4979d919efcb0b9b0d08fbfe5fdd3c0000a040306010c00080416030c0209020112003004360305020402000203020311040d0401020302030c0202020202030f020b0201020302032dadf14f80d248fcd123dde20125c4bef196a6d198a497fbba93fafdc5a7dfcb85a0f4a4f7f3b053a372d434b716c43299fc3dea891fbfbc0ee39d0079feacfea096abbbffe6ccd8fbafabf39ef9ebb888eb9ac2f5cb803bbd01f8ba3beb13e12dc3e605b781418fd121abbe00439ad7a4d0fcceff8cb1dcdcccb6c8d1aaa9bbd09ec1ae81a6f88017c19c1dcbdc4cc8c47abcc202f1d70493910fc0f91b89870064d295a8bf85ed91b5a6d1a2, 0x1f0d6c8b6938ecde1d0da8991d2c680110a02021decccae8ea5a2c08fc4fe9ebdefc8968a8ec7c997fd90cdb00a0a020201c3daede497ea81c1f9fddafedcbcc4a8e188f6ab93d1fba81109020223fdd29cfa99d9d0dbf8a08fc3c283fc8babfbb7888582a1f811060202018be3efa7a78dbab2ff9ddca7c2f1bea78de0df98cfdcc3c6de0a06020219a2a5cfde8d99edb6eccb9f9ed5ecadd482e589dab8baa89e0906020218b0fb87988ba3dff4acf397c7eeb4b0aca0deb4c3caa0a9a80606020231baeed392838680e8a68cc5b9f9ec8da79ec0ec90c1b8af8a0702020207e3a4c88af689adcac8e7d8a5bce3b2a5a1f19cf6ece780981501020202f5f2c9d7faf3fcaae38babf4ab9cb0f6f0ddcb9e9892c1fe1111010201a3d3eebac7af8ee9d2c38bb782d987a49df49cdee3838fd280110a010213caf695caeff1deed90fac082c4ba81dcedc9a489efb9a7800a0a010204d8fdadca95adf5d4e0acdfc68dc595c7beec96cbc7a7c8a01109010221c7f1affcb3bba896f1a2c7d4c9a9ebfdb5cabff1b1f4a7c00807010210fcdfd792e4cba688fca4fea38ab1ba8aaac0ad8eb0f7db800707010208fdc189f9cbdaf2c5a0ace2fde2cfa6cf98f8cbd285dfbee01106010201a1f389c2c9e1a4e6a08df3c2bae8d3d9f491f6d39bebdfacc00a0601022ad1e18eebeac9a5d29bf19e9d9fd1cbcbdfebcac1c4a2f58006, 0x195ef86a6f283fdbf80d5b3cc88bbe0f3cbb8ec94a9801515000241bea4cda5f5defa8dcccafce5aa94e5c6e7a9acb19ce9fccaa0110900022db9d8ad84c6e0eee6d9aa80bde7b1fed08bc7fce4cf969fba80080800023185e88cd1a0eb9eb9a3dcf1daa3a8a98ec4bbe588b0fef8fa800b07000207c5af829794e484f4f4f3d3dcfcb0b2d8b5a5d6a2cbbfd188800a07000234a7dcafefc1e2dadffcb7b6d4b0c8e2c6e395e7c5f4afdcd680090700022bddb8988cc298ed87c4f28382f1b3d68b89a2d6eba1f1ddaa80080400020984cdfcb1beb2c1beefd5f8baa3fbd6afc9f39bb3fcecbb85801503000202bb9bdfd4bda79bb78797d0bea6b685a59f8cbbc7baccd4c5c00303000207c4df89d1a0b1aaccd4d1f8a5b7f4b3c1aca9e7b7f4bdace5e01e3e8680fee588c4e795fab1bda68a988bf486c0000a040306010c00080416030c0209020112003004360305040206000203040311040d04010203020301010b02000202020402bf8e0194d00ecc5dc31d85e23aada933a8e617959b00028cc8cec7809d9da1f0cbdccc9aa6e9b2bd85df800ae6a611edb901a7f604f4fa2d8cf617b6c332e89b20c0d4001bb69ed28ab6fae8a98be0d2abdad79acbf0e98006d99250f0fb0181b39041b38315ff871cb7c83fdbd12895e6000198da89bd889b80ddae88b3ded09d81f1c69680111102020198d6ba90e6b7fc8d9aa7, 0x1979fd4d49dd5afbadb93bfc2e5abaf9dbb8a9bc195a1e480110902022d85d6d39afabb95a3b4c2b2fae39ff7a2c6b2fdbea9a784ab980808020225efc68a89bfdbcc8de2e4f4fff8f3e7f2fd8db187d4d488adea0b07020208a1bcfbc6c1b5cbdcdec098ea8dfd999ad18df4b6fa87f6f3e00a0702025e84ab96bd85d8c8c7da8c9885f0b4ae83c0b5cc86c9fd9bd298060602020ae5f4dec7f2c9faa7a2f588fc95e8eaf0889ec8d2d5f3d6ab960804020209d2f4829abc9ca0e5fc8dfbcfa9efa1b7ceaffbe7c8c8899bd0150302020282e3cbe9f5e985b9cccdbc908ec8ade0dfbba68d95b1aeef980303020207baafe19db1affee9a8e88c95a3be90a2b8a9e6e0dcb8c48ed81515010241c887b6b3c6d6d0aadfebfd91eed2b4d8bbdecdc2b0ddb1c880110901022db7bdaccab480aaefb588a6a3f0aed5d9e583a0ffa6ad82a3c0080801023193ae91a2bad9c2baf090bcef91e494f9ed8fe48ff0f5f6c5a00b07010207e4adfd9ffffcbbf19cf181d5d286dbe9d492f1acbfcb91a8e00a07010233fecbcaa5cab095daf88d85fbebe4a08dba9daa9ccbc6bc84e0090701022bde9599ebf7c1a9f4daafddd1de8bf1d3dabddec788c58de48008040102099c82ab919fdfa89386dbbcac85daf2e5b6aac591cea4fa83801503010202baa3bad5b790bad0d9b9c7c98ce4c8b981dbc1b28bbdc1dee00303010207c6e784, 0x1f4d8b7ab8286dc1503010205d8d8bbd8c4c5c2ced1b4868ae9a1dfa39fdafc9cdbd6fda8030301020ec6afb1ee8994a98f9eabb4c9f98ecacf81cba4e4fec9d1b0151500026ad797bfd2c4ca9bf8c8e0c89bc6e4aecbe8ffe7a0deb4d89013110002278fa0a9d0faca8bfed597a6bfe7bfafdcb8ade3bdc4a599c4110900024ce0f3b390e3b8caaaaad197a9cdd2d9bfa1f3a3e9c4b9f4ac0808000258cfefeeddfaebe8a891ff8dffcca2bec6bfca9ba0ada0db800a07000258a38e94dc93b48fd8f5becfdfb49ce185eafccff38fc5d4f809070002588f8ad9c6accb9e84e0d9acede282ea9eb587f9acebd8f2c00e0400020ecff8a3c0c8bbaea0b5fcf0f5a9e9c28fc1f29dbcfbcbbdbc15030002068286ec9b8aa3a0acbfd8bcf091c6beecafd782fdbaeaab88030300020eaffcb8a58bbfad8dd3f194b8f7ed8f809ab3c5e5f3b5bb801e7088d8b3fdf39590a2c1ae8681baafb098880010040a02010a0004040e030c0209020112003004360305040206000203040311040d0401020302033b92b662a99528be8409ecd9011089d9e7baea94eecfaee3e1e5a2c9f2b3beee802ee940ae16b5068e2cfb8240e29720e6ac0ecfb10024d68786b1deb3e2cccdddadcfd1d4fb85988483e01c8be42badf456c6be569c8a03c9cf049e9306fec106e1830001e498fe88cedfdbd1c5ada6b59ea7adb79588801515020240df, 0x1c6c5afa6a7efbfb8f4b9b01dabca2bfbfa56f49e55918602a2ef02fba707958907d2cf0002f59fdddfcde2f8c6a9f8b78bada08df5e7c01515020268dac5e5d991ecb0d4c8d2e4def9a3a0eca9a190bcefd79fc01311020225f7d7dec5ecb7ccd9acbfbff1cce9e5df83cbc1cef9acddca110902024dbce3d4be9dea96e1adbaa78fd6e9868d96bcbda897dbabb60808020257d3b7e899ce8cfd93f3d4c0bbd393ee89eed3a9948e9591900a0702025683b0fbcb81bbb4d6c5b697ddf59ce7fba8b0cbfefff7838c0907020257ae84cbd7c8dbf3e4c1ba8ab7f3a19a80b0dcf299c5baecd80e04020210a197d99783b7a4a9f1babcb28883d9b9a4e1eebfbeb480d61503020204b886bdbef6ed8bedd3ad81e5b3cbb0eba889f4a7bf9fc1fc030302020ed68cafbd9f8481efc8f2afa6a7e8e7f3c9c0a8f4f2f48394151501026ad4dfb0ee85f6ad98cdd099a7fbdee490dbfdb5b3b7fcebd01311010226b0f5d9a896a8f9eac88382c5f1ffa79d9ba8a48ff4fce9a4110901024dac8d81dab4caeeded6e1b3ee9a95ecc99686e0eeced6fb8c0808010258c98e82be8ad3c2d4d1c9a1bbeed9aae2db91c9f2dd96f4d00a0701025893a2b3908d958bbba1d1d88db9fbcfafbbfa9e83b7abb8f80907010257f7c1c48ebcd3c4dfb49cced6f6dff0a2e3a2c6c988d7b6a00e0401020f96feb2f3fe9e8eed9cac82e7a6d78bec90, 0x1030b030a02020208000a15151311130b0b0909090f030b030a02020208000a15151311130b0b0909090f030b030a02020208000a061208100c0706002a042c03011515110b0a0a0a0709070e0404040f030b0302020a1515110b0a0a0a0709070e0404040f030b0302020a1515110b0a0a0a0709070e0404040f030b0302020a0610040a02010a0004040e0313020f020002030203011515131313110e0e110b110903030202090101010a1515131313110e0e110b110903030202090101010a1515131313110e0e110b110903030202090101010a061515131313110e0e110b110903030202090101010a1515131313110e0e110b110903030202090101010a1515131313110e0e110b110903030202090101010a06011515131313110e0e1109080815030303090202020a1515131313110e0e1109080815030303090202020a1515131313110e0e1109080815030303090202020a061208100c0706002a042c03011515110908080a0509050e0404041503030302020a151511090808070709050e0404041503030302020a151511090808070709050e0404041503030302020a0610040a02010a0004040e030c0209020112003004360301011002000202020415f49235b08913f4b60fd00101989aa5b5aef99eaa9d84e5dfedf688b599ab8001b235e624a9069522dcd842e49b27a78010d5eb003ea1cfe197c2b7a6ff, 0x1151513110b0909090e0411030f0302020a010e000a151513110b0909090e0411030f0302020a010e000a151513110b0909090e0411030f0302020a010e000a06151513110b090e0411030f0302020f010a0108000a151513110b090e0411030f0302020f010a0108000a151513110b090e0411030f0302020f010a0108000a060115151311130b090904040f] private def node1080:Certificate:=PackedParametricCertificateData.decode 9 data1080 private def data1106:List Nat:=[ 0x1060201010a15151311120f150e0b0b120815031202060201010a15151311120f150e0b0b120815031202060201010a0615151311120f150e0b0b120815031202060201010a15151311120f150e0b0b120815031202060201010a15151311120f150e0b0b120815031202060201010a060115151311120f150e0b09120815030602030101010a15151311120f150e0b09120815030602030101010a15151311120f150e0b09120815030602030101010a06110210020006030603011515131112080908090709050e041503080203020a15151311120809080907110609051503080203020a15151311120809080907110609051503080203020a0610040a02010a0004040e030c02090201120030043603011204040202020310020002020204151513110a091208090809070e041503080203020a151513110a0912080908090711061503080203020a151513110a0912080908090711061503080203020a0610040a02010a0004040e030c020902011200300436030f0202060202030b020a020402010a04080315151311150e0a091208090809071503080203020a15151311150e0a091208090809071503080203020a1515131112110a091208090809071503080203020a060a040306010c00080416030c020902011200300436030f0202060202030b020a020402010a04080301010b0200020202040a020002020204, 0x115151311120f150e0b0b120815031202] private def node1106:Certificate:=PackedParametricCertificateData.decode 9 data1106 private def node1107:Certificate:=.split node1080 node1106 private def node1108:Certificate:=.negative 1 [(1,0),(1,8)] node1107 private def node1109:Certificate:=.split node1029 node1108 private def node1110:Certificate:=.positive 1 [(1,1),(1,7)] node1109 private def node1111:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node1110 private def node1112:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1111 private def node1113:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1112 private def node1114:Certificate:=.positive 1 [(1,0),(2,1),(2,5)] node1113 private def node1115:Certificate:=.positive 3 [(1,0),(2,6)] node1114 private def data1143:List Nat:=[ 0x1151513130f0f0e0e0a080808130409040e030a020a151513130f0f0e0e0a080808130409040e030a020a151513130f0f0e0e0a080808130409040e030a020a060a040306010c00080416030c020902011200300436030702050800080306030b040a04060401020406030f040a0205020302030902080204020106040803151513130e0e0a0a0a0808081506130409040a020a151513130e0e0a0a0a0808081506130409040a020a151513130e0e0a0a0a0808081506130409040a020a060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030f06010202020310040002020603010e0402020206030d040906010203060315150e0e120a12090b0913040b04120211010915150e0e120a12090b0913040b04120211010915150e0e120a12090b0913040b041202110109060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030f1c0a020606040c040c03100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node1143:Certificate:=PackedParametricCertificateData.decode 11 data1143 private def data1177:List Nat:=[ 0x1c9d00808010215e68397dfacefc7d9d8ce95a6ecf9f9b1c484fcc6e89c1506010247e5d7cbf68894908499b1ed82fdfdc487eefc84ddcea8110601020380e1a393e8aebf93a3f1c390b1a8ce98d8d0d384fdafa806060102339eb0a5dbb6b0e9f3ebfee69bb0ced7bfb7e3bceae89c120401021df98ad8999d96a29baae8f9cff38b9dd6d3bac68f9db8040401022ce0b1c2f5d8d3ebbacae6baeffc9f8ec0c9ae9bfbf5c81111000266e0a7d684d59d88b78b83d3c6cc82aab2c780e8bb89f00a0a00020caca0eeafed80adc8a5b5d0cd9ad8b19faadbdeccb5a00909000205aed283acfde4ccf0d994848b8db3be9bbbf2c49da8e80808000209c8cfc4cee689daac88a4b5d6db8ca3bf989d8caeccd815060002439beaeba4e7c3ffa0d5bc9da98ad8f0a8f994f8d7cfc01106000202c4b29feb9c8bf0f1bea99ce094e299f4d4a89da7c7e2e0060600021ba1ea86d883e5aec8b6ffc9dafcb2cbdab1a3c3dab7f81304000218b5b8cecfbaf2aec0c1a6a7aaddfafdfccac9f98bba80080400022093d19af0b0c1fff08bf7cfecd6bda0eb9ec7ebd0d5800601000202fe8d9280c5a8f6b687e8af98c587f2d6b78282b1bb881e0f8ac2bbcebada96d8e2eafd85f0abff98000a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030f0601020202031004000202060301, 0x191b7d5da9fb8aff6fba6cce0c9c9a5b2dec3a98cb8a792b4aaeab7ffbec2801e03b2d2b6c888af81e5c6daf6b0d9b791dffcdbd8a4f7bef2fea7ede4ea80000a040306010c00080416030c020902011200300436030502040200020302030101010c83c53cffae5e8be32edc9e0117dd9ebb80df8ecddba98af5fa8eb795dcc003adb701bb8c03ff8602a5872ec8ce3ea48d22d1961089c1001892a6aad1c2fd808486b0ffe38fe58d949cb006e9c608a1e505c2a6038adf2bddc00892d341d2a322bca4000bea8fb091f9dd9190ab8d8cc4bfacd2e7bf901111020223fbe5c984faa8a8c4efa8f08696d19c9fba93e3f590900a0a020215faf0b58eb6e1e6efcbe784a6a9f3c9c0fea1aa95a5b80808020220bfccebf09baee0c5fff5d89b82c3b3dcbad2a6edbaaa150602022e9dbee6e1e2a7ecdea782dbea8bb0fca991f5bafab3d611060202039a8af6b7a7a69f8ef3cbebb0a5a698a39b8ead9abbe8aa0606020226afebcefdf7fda1ac9088868da2f48998a29d8ebbcce404040202358396c7dae197b09de0c5aa99dd829eb4b0c3ce928ed00602020204b7c0e3c9c7dd85dcf38b87f5a4d5c2cbaafff1dce59e1511010214819ba8facafb859cd980f0f6f4a6fa9fbfb7d99fc1c811110102349fa2dad0e8a8a284dcc9bce190da9498d1dbad80b5c00a0a010212a0b1e2e281c78e9da3a9c58aa3c48ebbfaae82c5, 0x1e4ddafe084e9d8adbfddcfc5ef9dc6e9e787add6ced1b7c8f0901304010247aef2c7e78ae58e8e8ca6f4c9e6fcfee080e6a79ddeebaba6ac99a0d1f6d4ed8aadf00804010206e5cacee5c4af96ddcec0b7e8a6fbe0dea9efe8e6b7e5f1a3ecf0ff8a9eedd7b083c7f80404010213b3d1c1e8c9b58aceca8cace5a0a3e0d29de4fbaebab39caf9ed587c6f4cbaee8a89dfa0303010202b89eb2b7caeca28a95aeed82f4bdd4fce9e0d8a5a7f1f2d2a8b593c9ecbccfbec8eda004000102758380b6d0ad88aa81e8cf95d5c2d9a883d9d3b0a184c3f9dcf7b1c7e38ce0998a82ec0f0f00020384d0bce5de90a5ad82cfb79ef2eec7a2aea5e4abe79dd8fbae87a38af0a9edfbdec9800a0a000246eff1abd0e1e380b7e2d39086c6a9f6e486f683e8eda1f7aaafe081f4b8f3c7b7c3800808000202a3ddee8befc488ecbb96a7f38981a09de2dfaab989c58ed8b8bfd9f8b5eab89fe39b8007070002109ec8bc81ecbffc8f99a2bcf389a1868a84998599cdf6e989dfebd8e08ee29ae6a3e4800606000203f89b91aa9ab1ecd5c4d8c893f8a78dafa2a0d1d6ff9989a5ae95acdca3b5dabdd0af800804000201d0c282e7c2b3efc0ecb8bbfaa7cbf1f18feec1b1e3c0e882cee2aca8bfbaebfd96f4800404000215e3d28f88a6e1beacccd2c298b499de97d089c2c2b998b0e2d99381b3e6f3fff3fdcb800402000201fd9efca7, 0x1cad59c80249e8029e7f04dc6a070b1b008eacb09e8b90f95b514dd9d0001e4c9b8c9c0c3ebc292d78dd1fbf5a1dac3cc9ff3f192f6cf8482b78880111102020bd392e4a5b1c9c2a3c89b94a5c191fab488c7fbadc3dce2e69ec3ca84d3de9bd3dea2800f0f020201c9fac4b290bf8092b2d8d6f9eb8289f1fcf7bbbadee0fdf3d2d8baffefabe1efe191800a0a020201f5c188c8b6e7dfd0808fe39bbaebf3f589cfcb91c7b19aedd0fbb1f2aee19a82e7bd800808020202c881e2c4feac8b95bbe2bde2a2bbdcc4ea91faa78b8bc1c9cbc697f68bd6ffd5a997800606020210a4a481bca1d4ecd8b2a1add6f5ee99ceb2a3b0aa978788c49bba9fddd7aca8d48bcf800804020208a082f68596a9ae8ea9a1da82efa6dfdbe490f9e1e28becc5a492f1a5f3e79af492d4800404020205e7ced093e0f7b4d4d5c587f480fe83fa95ccbcf5c899cee6a29b82d4f3d3af9ec291800402020201cf949af7d4e9e383acf1abfbfcbecfeff1eea4fcdbe2b4b994c0a791e6cc94d79abe800400020203f8e78387f3bea3fa98c086c8cf90a88aeb93a6e3fefbb5cf8caae4f4c7b39395f0b0800f0f01023db3dda1dc8dd7b3cec1aad8dc9cb9c99fe8cea1d7f1b28cd79280ecfce6a0edbdf1c00808010203c191a5a48c9ff9a4f998a6d5abc2cdfb99c5e0f7a3c5ad98ac9bfac9b8b3add3a7dbc8060601020aa397dd84aec8cecef9, 0x1fc8c9b91d895fce9d8acc0da96b5bed0c4acffc7ce81d0d1caf6c5c79fb9cefb928ab4f981ebc18b9adaa185941414000205dbb7fc9debbcd0c9d9ec9dd6d8b8cd8386e5f18888ab9fbed9ea8b8eeaa3c0ce838af6c1f1e0ddb2cdc782dddfcaecd00f0f000202b598e3b5a4fea4c09ff0fedc8eb2d4d4d7a1878ae6feb2a9e7d1fee5d6d0efa3c4eed6b784dd9cfbf381e7de87d2d01907ca8ba490cffca494fbb3bfdad1ea89adb88ca9a19ccdb7fc98d8e9bd8597a9d0b690ff97b8cfabb898bc000f0201020202030c020902011200300436030502040200020302030115110a0a13040b040f03070202020301040003000a15110a0a13040b040f03070202020301040003000a15110a0a13040b040f03070202020301040003000a060a040306010c00080416030d020c020306000c040e031304050202060304032cd4e107da9364c0a834b3f501058e89e4acdccdd7cdaba59facbfc3a3be9881f2d6d1a8daa1f8b8d4d4f0c448edfd5f90e216f6e10491cc0101e69da286a5958e89f097f3d0d392bbc5cb84b6e3ade9a39191d3e7bcf2806bfa5cf401befb41882dfeb240d19720a3fe0da89b0005e0bf80cbd4c4fe8ef4f08c92ffd09a97b7a6b2b3a8c6f5d09f83bbb9dadc8001f6e503a9ae0183e70cc629b8cc0c9fa141bc9f24caf20002e6e88fffb8bb9284a3e6feeaaac8b6e2b995aefb91e2dd87b7a58c, 0x1ceddbee79c969098e3e3eeecee8381c1b4aedc8fa9d5d9c8b2acf19de7fde7eda1ec98070702020cd4c593c6c395d2a3a7fcf1aae4968081ccf6ceb985c489a98782d9ffba95ac81acd0f1e59bdbf198defba3faccf3f7fc040402021dcf89e7be8a97dacfb7a3d3b88dfaf0b193fbcdc6bf91d9a7b6f6c483d7c6a398b68f869ed48de695d9e1b1c4f6bf88140002023dd8dce8fa8ec6c3e582a6afc48095eeab93fef6cdbd91e2c3c2f0f4b0eed892f2e6d6ea9295beb696c387fd93d8f6d01000020276e8dc8df08ff094ebde8588f5cdfd95b1b2d0b1ebdd83f4fda4e7fdcda0b696bbcecff99caccdb3ce8fe4e783f4bab00700020255a9f590e6d3e1a7999586f69ab9958ae4e0eb80d59399a8fe94fcbbd9eda7fca780d0c4b6bacbf69dd3ae92d788a5a0140f010206ce88c986c7e0e296d2ab84f097c594f8cec690ada5d7b5a9baeadae1bc83b6f6eaada6ed93eee2f4b08dba8cba9a9184100f01020786c8c5e39bf1d6f4f38ab2b7a6d4cc93899aabfcdab4daaafdc3f2d186c4ffb2fca3eadaa0b699f89e938898e5f1f9bc140a01027a91d1f6dbb9c5bbcab18788cee3e0838283b29aea8bb8d99785b5d788c9bef489edc89ce794c7afe8c4919a91f6e80707010217adb8fcc6a7edd198e588aff5a6cde897bd90edc8ce96a9e9a7b5beb4c4edabebf1c6a5f98080e88cfbf5e0b0bddd88de0f06010208a5, 0x1b83fb6fa04b2e0019280db4e98bc2eb8d102d58a6098c234b4f9000298f59588a68082d98d94e6cfbf8a81b2d1f09ad29498ce9c8780e0e5f285e4f2ed94b6bd86c6a3bbc0d08d8866f5be79b2d116e9ae04acbf2688c13bb88426b08b1180ca0001cbbfaebd8ccda6fac98999e4f78db1f2f087d3a7bce5b4969bfaf6e2f2d1b2939cf68b8ffcb1e6e0b6baf39809b4e60499d824f0b918ae822bb79a27eca212d1b265f4ed0001cac291a8aea3ae87e6cfd0fac097aed4cbcfec8afd92c09c8294baf0cda39cc7aa89b6fdcdad9c9ee3d9e86788ff5dbee316d9f101dcf6fe48dba04499fa21e4e801aeda810017e5d9a4f7a3fa9ec6f6c7d5aff1a9d0c582d4fef1a1b5f6d581a2bcb1faddf2a49ac1fde0cc8bb4c3ac8c1414020201819f99e8879bc0e7d1a1b5b68287b395e0be8bb7c89af697e0f0f9c0aeded3c79ec586dde3c7efb3ecd8f293aaf3cca3a01010020210b9a9d38bf089cae4cefe8284a59f94a2b0808ccc8cbbe3be9faca8d0fedbb5eca9bce6a4cca3f58f92c9f4ea9f99e6d0140f020209f2fb8ac5e1a5cda0ada9ef98b5f6beeadb83aebf8c89f7bcb5fca0e8cfa0ecd1dbf28af5ec9cdbb6e0949e92d8dfccb01407020204a396f5d3ae8eba9efec2a7e7fdb2efc6fae6dfe0c7adc1c783f4dceaaab6d5dfb289f4e7dec7f7d88a97fcdbc49faba81007020203afdcc8d689bfd6ba928a80fbb2, 0x1141414100f0707070505050404040f030f0007000a141414100f070707050505040f030f00070009141414100f07070705050f0306060f02010202020313020d060506000c040e0313040402020203030401060202041002000202020414141410130f1407070704040f030503030107000a141414100f0f0f0a07070f030503030108141414100f0f07070f03050306060f0201020202030d020c020306000c040e0313040502020603040307f11b82ce36dd9b1be2c00111bdb1f995f1d8aa9bcdd6b7ffdbfac6fa89ef9bf6ccf3efb4ba95de8088f9f0f2c4b6baa8d6f3fdd4fa80f8b42c84ee25efed12dfe90ccaea010f88c0e6c0d5b698d4cb96bfde88dfc6bde5b7dbce85de9fd8c68bc6ef8cac94df89f986fac8cb949ae4bdb4fc04fdeb0abb0b99ca0690f52df5a341b9c8219c8d0dd7ea000ae6aee4bbf68bcaf3bde6a9a091d0dfb5a0b0b584d092ff93acf49e86bc8baab3ead088aa8ac8ebe8bbaceee819afd031eeb12ef0c616b0812ceeef1cf98027e4f617ef850003f0d5fdcec1ddefcea9e4c3b7ffeee6e2e3c991f6c6c2bcab91f6c9ecb1e1b9de8daef8e390c8fea4d9ea92] private def node1177:Certificate:=PackedParametricCertificateData.decode 8 data1177 private def data1209:List Nat:=[ 0x1d6c19e878589e5a8d49aae96e6c980c01505020205a3e680a980e4f2a3bdecefa3b3e8aa9efdf5e3c6c00505020220969dcbe3a3ddd1e7b7c8a7a1b6a9dd89f3d0ebefc5f00303020206dfafba84b5d9c6bda598dca9f4ef93d3b38da9cf8fc014140102029da1b29e81aaf9fef1dcccb8a5f2fad3cdc08ca5acf8a01413010202a28ff6f2dfcbc7c3d6c1909ca3c7f1f2a7bd90f2c00f07010253e7d382ccb5959480f1d7f79ec2deeadac3c2d39ebf800a07010202fba4c581e0f1e9eab8f1f591a8e3bac6f283d0e7800707010251dffcb4f9af94d8a6c3fddfc9c1ffb7bec58edadfc3c00303010209f887cde5c4d699aee3feb288b4d1c09c83b398f2b7f20502010216b4eeddf5f0caa9be808fd3888ee9e0fbfbabf18014140002029dbfb3adcce5e9b6b6a1dad0cfc3cecb969ed2f8acb3a00f0700024b8783f0c3c9c2c5a1a3bce19bb0e7cbc1dcbfecc5a880070700026c98bee59ccebcb0cb8afb92f1b7eedc97e2f4d586d4800f03000202eea29f97bca080b1ab92b4c5e6d9a08bdcabf0deb7c00703000205aae89dabe49cd085a282afdeb2c1e3dbc2f6dcdcd780030300020785e6c994e6e3f59eedb1da8eca8787bad6fc8eaabfd01928c792ac93e0c5dec2b787be868da4b0000f0201020202030c02090201120030043603050402060002030403030401060202030c020202020204010b020002020204, 0x1ac981005010215e6bd9797a283dbdcca91858fbab6c7ceac090501020494dcb2a8bbaee1ac9aa7bf8880ece4ea0705010203cce99183ad83aac0d89fc980a2b9e2c5b79c1103010202e1bb98e7cafbdcd491b597a289afcae4030301026a96dcc2e08d82c2ca99b3dfd4dfb7ffab861414000205beb5bcf49ea7f08bfc83babcabd4dcc684a407070002048a95ade9b586d5d487deb6a5dbfea4dc93a01405000203f3ab8ff4a8e9ecadc0d0e2e3f6a59e82880505000202df949db2bdf5dcd8e38c8cafdea5aacaff98030300023f98ecbee599e1a4a9fc9caccca7e693faac1950faa9c586aad1caf8ee82000f0201020202030c0209020112003004360301011002000202020403849f049cae17edac1985b90116caaae498b888b0f4b0b3ef92e2f9daeddc6097b64b94aa01898901aaa2d501099af8cfb6da8ff1cfc78c89b3a0caa78026aa02ffb502f8d905d2982fe19f42d3e41bb3f108c1ae0018a5c791adccb2a4aafec0c7a895c7c5c98014140202029cb3c98cc8b1ca8f8087befeb6fdfb8882a1fd9fd7c4c011110202019fabedfe80da95a5a5d7e88dacd0a5f6fb8dbe91e00f0702025fbe859fcaebb29a83e1e7e5f9b7acd784d0f6f280b4800c07020207f6c2dfb3e8afffafeea281c0b6fc81a5cdcad0bac0070702023fe090b588aae690f7d18192abc3f8eef1a5e3feabdba01406020208fcce82a985, 0x1100b15030e0302020901040000000a0615151313140b100b15030e030a020202090100000a15151313140b100b15030e030a020202090100000a15151313140b100b15030e030a020202090100000a060115151313140b080815030e0303030902020200000a15151313140b080815030e0303030902020200000a15151313140b080815030e0303030902020200000a06130200020202030161fc098791049dae0487e428e9cd4db6f616e6950de7910019cbceb28bb083b9feb186f0d80be0e807ccd202c0c415eea703f6b308e0be3ad8de3fc2e700078780c8c2b5e99fb8b5c5d2901414020205b685b5c0e4cca5b8e98f90bc82c0aba4f1d81413020213d9878ecef3a0e4a1d7f9dade9cb0d1d81111020202be89d9e2f39c909bc2ebfcfeb087a9841410020205e6d2a88cd885bfd3b0e8e79b9bcfd9d2b00707020203e5cbdc97b493fac3f1f799b3d5a3cca9d28c100502022b8da098d9bbf5bfd6c8a4f095f6c98b8f9c0905020206a8c397bcb1aedf9bf3a5fac2d6ebe3920505020202ccb59cea919dffd9a49d8edbbbbce6d0b7a01503020207bcc8aefcdad590ae9ea685d0a6bfbea40303020247c38ac6c4d7bffc85f1ba9e94e1cdf797861414010205c0c3f9cfe6fb95da92f783f6adec8f91eee41408010205b9b880d6e1ddddc8bd8587c9cdad87b00707010202e18984eabbcd86b8a2efa4fdf8fdc4f4, 0x1f587ec901414010211bf939dcb98dfe4f79acabf9e81a7d2928ab5ef95f3ee95efabf9b9c9c7bcf8101001020286b9edebd086a9b899dcb781fbe0beb1fbba83b0fcb5cff397a4f990f0ea8a140c010213c1f0cab5cdfbf5f0f88ba1d3eddbfeebdb9eb4ffcffb97a09cc7acfdc00a07010213f2aa82e2889ba2b192be8ebed9b8868cb2d8869dd187ebfec1fca0e9c00f050102098ff9c1cff6fba3c0ea8a9fdf9ca289abdbcaf4f0bb8bd6efdebfb8b686c8f00f030102018a9caed5f6a896f9cc8ca5b0aeef988880bca39eb8dba498939cf1f5e0f088030001020fb49ad08eb4b4baa2d5f7ab9c9ae5e7cfebf09bb3ea8fe9efaae3efe01414000211ffed83cce8958290f4e48dc1cec597ed8cceae99b0f8debdecde8899c2eec014100002048babb7dfb5d5caa7c9d0ab9dadb0e0c2d6efe3cb91b18dbf86e8d7c6e2da800707000213dec2e388eedb809df78482be9fc2cfecd0c3a5949ad1818f86dcc4e0c9f9800f030002039680a3b1aad3bbe99ca4ac9fcec7b0b4878688ce9ba7bc8897aec9bbc0e6800703000253b5cae4a8b2fea88dd7959defefb6a19e88b5b981d3fff0d3dc848eaa8e801902a5ff95edef87bfe0ab96bbd990bdb0f5b6c5c7e4e1e5e1e0000f020102020203010115151313140b100b15030e0302020901040000000a15151313140b100b15030e0302020901040000000a15151313140b, 0x102020901080000000a060f0201020202035de4853184943cec8169cbf401268d8deec089efd9c5aee8eea7acdf82f9bad9c6dcbdd89ab78c09d7c665cde842fabc01b29fe9014dccb4bd899af5bbefc58f8dadc5dd809293cee6a5afb4de89902cb8e617a9c719cdcc2edcdf08f6aa0fde85228ad41ba2f70009c8eb93e5e6c0f0c6b297b4cbceadf6d79a9ebdf3bbb7d7e2c026d88972de8d1dd69101b78bdc3b998e65cfe81197ec01b280e10003dcabe8c2d5a2abe79e92a8b3d1bad8cbcae79b82fda4a495c014140202149b9ff1beb0ece9eebac9afd9eec8aaeeaeaa86a1edbbb6ba91b699a489bf80140f020201c0f29cf1b3feadacfbe4a9cec3d29ba290bda8ebc599d3c490d8cea0a4ddc00707020213efe2efebcedbceade9c683c597c584f4f99698acda92c4f7b38db0da8dbec00704020223988492c1afdcedfdea95f6d9bef696edf5b4a7e8c6e0e3cda2bea1b6c00404020204c1df84fdd195ebdeb6deddfdcef2aedebfc58fc68ca7bdfca4b38fdcf00f03020202fc928fec98a79eab988f9787a19ff2f292a9cdf1dad4a9988be2edd4b29ac00703020201be9182de85bd9aebb0c988e0dfa5ccf9d3e0fab5d084ecf4f5d2d5db8ba0801400020223aa918fb2c796beafa99e9bbe97ce90aaab8191808ae1fc92cb9bc7e6800000020204c1aeb1a2f3d6f0b591b498c1d3d8c9def7f09f91f2f0e1f2fe, 0x1151514131313140b0f060f03090202020b010e000a151514131313140b0f090f03090202020b010e000a15151313140b0f090f040f03090202020b010e000a06151514131313140b0f060f03090202020b0108000a151514131313140b0f090f03090202020b0108000a15151313140b0f090f040f03090202020b0108000a0601151514131313140b0f060f0309020202110108000a151514131313140b0f090f0309020202110108000a15151313140b0f090f040f0309020202110108000a061302000202020301151514131313140b0f060f0302020901080000000a151514131313140b0f090f0302020901080000000a15151313140b0f090f040f03] private def node1209:Certificate:=PackedParametricCertificateData.decode 8 data1209 private def node1210:Certificate:=.split node1177 node1209 private def data1231:List Nat:=[ 0x11515130f140b100b0b0b110813021202060201010a1515130f130c140b100b110813021202060201010a1515130f140b100b0c0b110813021202060201010a061515130f140b100b0b0b110811031302060201010a1515130f130c140b100b110813020902060201010a1515130f140b100b0c0b110813020902060201010a06011515130f140b100b0b0b110811031302060201010a1515130f130c140b100b110813020902060201010a1515130f140b100b0c0b110813020902060201010a0613020002020203011515140b130b14091108090809051103080203020a1515140b130b14091108090809051103080203020a1515140b130b14091108090809051103080203020a060f0201020202030c020902011200300436030112040402020203100200020202041515140b12081108090809070b061103080203020a1515140b12081108090809070b061103080203020a1515140b12081108090809070b061103080203020a060f0201020202030c020902011200300436030f0202060202030b020a020402010a0408030c0403020102030404010b0200020202040a020002020204] private def node1231:Certificate:=PackedParametricCertificateData.decode 9 data1231 private def node1232:Certificate:=.split node1210 node1231 private def node1233:Certificate:=.negative 1 [(1,0),(1,8)] node1232 private def node1234:Certificate:=.split node1143 node1233 private def node1235:Certificate:=.positive 1 [(1,1),(1,7)] node1234 private def node1236:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1235 private def node1237:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1236 private def node1238:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1237 private def data1270:List Nat:=[ 0x115150b0b0f0a13040b0404040f020802030203010a15150b0b0f0a13040b0404040f020802030203010a15150b0b0f0a13040b0404040f020802030203010a060a040306010c00080416030c06030a02020012041603130405020206030403151513130f0f0e0e0f0a0f0808080b0409040a020a151513130f0f0e0e0f0a0f0808080b0409040a020a151513130f0f0e0e0f0a0f0808080b0409040a020a060a040306010c00080416030c02090201120030043603070205080008030603010b060502020203080206020404030403151513130f0f0e0e0f0a0f08080813040b040a020a151513130f0f0e0e0f0a0f08080813040b040a020a151513130f0f0e0e0f0a0f08080813040b040a020a060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030f06010202020310040002020603010e0402020206030d040906010203060315150e0e120a0f0a0b090f080b04120211020915150e0e120a0f0a0b090f080b04120211020915150e0e120a0f0a0b090f080b041202110209060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030f0e070206020406040603100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node1270:Certificate:=PackedParametricCertificateData.decode 11 data1270 private def data1314:List Nat:=[ 0x10f07010208e3e6cc9487e4a1c0bbcb959590e2e689fdc5ed8a86d6bc0403010213f191ddf684f88d89bacf8c82dbce93c9aef2e190140001021199afb8c2bfd4e5d6d2978fbbc2bb84f4a7ad94fce01000010211ead9d6fd81ea8181e29097bd929386c5efda94ed90141400021ea2fff9a1fdeb99f4b0baa0cd879fe68ec099d8f794a296140f000203ffa2d6c4c9e68dfccfaffe87f4a38ef99185b0b88eab980f0f000207f3cffca6c6fea4bdc6d49fdacbcee590e5cbd5ab9b94c80f0700020987f881ffe09fbff3a49df8d5ca8ca3e68dd7b68aa8e4800303000210b3ab8ce8f9eac4a6c69db0e4e9dddf8e98dcc0f9aaa81902f1ccebe9a4cee5d2ebaee8ec9e8185c8000f0201020202030c0209020112003004360305020402000203020301151511110f0f0e0a0a0a0b0404040f02080203020a151511110f0f0e0a0a0a0b0404040f02080203020a151511110f0f0e0a0a0a0b0404040f02080203020a060a040306010c00080416030c06030a02020012041603130405020206030403151513130e0e0a0a0f08080813040b04030304000a151513130e0e0a0a0f08080813040b04030304000a151513130e0e0a0a0f08080813040b04030304000a060a040306010c00080416030c020902011200300436030502040200020302030101010d0208020302030204010d0c0b020a060608040c0308020002020204, 0x1d799d089d0f4e0000f0201020202030c020a02030c000c0410031304050202060304034cb1a640ceb045f8b801d2f88d011897ead598f9ef9f9bd291e5ab82f985f6b021eacb07bd9e02a5bc188cee42c8c422cac002f7f2688af5000db398f9e59ba2c48cf8f9929bbdd8a88eb054aa8549aac94cf3f901ead1aa3bb2f238b1fa3ee28401b2c6ef000beccdeacdf2ccc59294cf878cd28ffdc88a141402021ccfd4908dfde6a4fcc1ac90f996e789bc8fcef6b2defea00f0f020206c287a7edf8a39fb89aa68fb3aac29daaaaaeacc280c5b81407020205cce480ca9cae98aac8bca2a687e6b7a9849fada2c088d00f07020209bce3ec85d0d1849ac4ddbcca8eb2d8a0a892e5d6ecb8d80707020204aea1beaac192b3ffef8193cba6a9b7d2c6e8c386c3c9f6040402020babc7f0acbdfcf0f09ac8d686fad0c0c0c989dfdcd00303020201e2d584c2d58ce8cce8bcc7c0b7cdd5e0fd87fdd9efc6b8140002022ab0a48fccc8b784a8a3859280f6a5c7a1c1e29dd6e0100002022eccdb86f7dbc2efeec4a882e4c3bbb190c28ae5b480141401021ec3c1a598c9d6f0c694e3beafc5c4f3d4c7a8c6c683a5c0140f0102048ea18085a7c48bd7caa3af9cffd7fcb5d9c7d5bd9f8aac0f0f01020886bea89ea2809b9bdaf0efb6a8c1de9adde4a78c9bb298140701020783cba9c2c2eac68cfdb585e5a7dbbed5fb819cdbd1fe, 0x1fea4e995ff8ccfc7b5f5f1848f9391f6bbe79edd9ec6c5fcb2f1a00404020203d9dc8492899abbf4a4b9f4b5a59cbabdeabd97a7ccec80f6c4ae90050302020286d8b8e2e5bfa2bfadbcefaea8f6e796c3a5e7feb9b9b4a4cca99de7d01010010201dbc3d5fbcdbdbec4c2cee9b6c5d988fec5add0dd9ae682fecccc9ae9920f0f010201ebd080c3facfc8d287b0d8a6f3c591cdf9e9b8e692dfdbfbef8bfaf3f6100c010211b1c1c29ebc82b1c9ece8fde0b2c5c797d4eda18fdd94bfc7ae89c00f07010201a99add98b5a6e2dff0c696f6dca5a2c0868ab6dc979ece98dcaa8184b80f05010203e3baee8f8ce2faa2c3f5d1e782878095b9c8af9596fff1ff80c99eb9f80503010201e1e095b38ac5ddeead868da9d9a8ddd8d480bbc9f59da2acaff8e3fcf80301010205b59d8cc5ef8ee1b1f38ba2f0e2bba1af9a9ad0e7d5f982af96cc801410000201f09293b8feb08ec5d88cc8aacdd9ceabed98a28e93a1dfc3e9eccd98e00f0f000202afce87fdc5fb8fb3cd9ebef0c9d9f296a7f3dee5ddca848acfde91cbe00f07000220fcd1c7ba83f3a498c2cfa895f4aed3a6c38f82a3c3819fcab0b3e2e00f05000204e2efc1d4a4dccaaba581e4a3fbbce1d4d3c2ccb5cdb1cc99a6f7ddc0a00503000201e1fccca0efc287b4d8e5ab8ed3b9c0a1dfb7eadfa787c0daffdda698c01978cc829ebaf9f0c18cc582f695e1b7, 0x10604100200020202040e02090201060306040c0608060204000a040e0415151414141013100f0f0f0707070a05140307020a141414100f0f100c0f0707070905140308141414100f0f0f070707140306060f0201020202030e020c02050600020404031304040202020310040b0401060306041002000202020458d1c62de1dc46adf401cce1950104fe9eb48aa8f498aef2e2bb98b5e0c6bcf1a1bad1f2daf00691fe0182d30593fd05ee3cf5d438ad8507f7d60cc0a3007e82b4b3e5e696e0e488c2b9c091daf2dafef49fc7b8948008d0b638bcbb31f7f0028df32089cb0de28725d88353c3d80003acefd4f49e8b87b880ecad8a8dc89df98dd0aa83dd9fc06c86d3378bd942dca501e5ef944bdf982fc8e238db9001b483890002c1dfb48589d7b6b7bccbeeb8ffd9c399edc0e0b7f9e4e0101002024f84d5adaaf2f7e2c9ba86f2aac8918181f0fa98aefeafdbbdcddfa88c150f020211e282edebdc96e3a9d2dde4e7af8da3e8b692ea9493adb5ecf7ce900f0f0202029e85c5e3e994a8aecdcbb09be8bcdcaaa9c1a7b2c28ac680f48fbbb984100c020243949a9a8c8da08fe1a4b3d8d9ca9b9afdb3c2c2bbbcb58af0b69db00707020201b9a0d7f5d0d280dfc0cafa8a9af5bfa4ebdc85a3a7fef0f496e3d4bde00f05020204a3a8fce9e7bfa39d89cdefd1a0e090b9feafc3dfd1cf9ac1859a8688e00805020204, 0x1e080a08ca989a8a5c7e9a3fef9a7fa96e01010020205d5889c8bf1fffec59aecb4b9e4b3d788900f0f02020186f59cf4e2a7c793a187c6a0b28581bcd8100c02021a80c9d9a9d8f7e88cd09ad4d8f8e9b0100702020d8995b9f9bdc5c8aef0b3f681a7feb1e00a0702022a9efed8a6fbeebdd5c581fa87ffe6a0070702020be5f2d6b3fc9e85edd9d8ccc4eaf7e3ab880303020201dbb6ce94b2819e8af598d4b1dc8b85c00f0202020fe4aedcecc2b0d7acc3dfe5eab5e3900101020205ab90cfa6fbc6c7be9ee19799ca90801414010208f6c0c9b699d49d83bdeea7fefcced7f1b81310010211b68288f09dfa8dbfe988cea6ef8bb81010010205c1bcc290eae08fda92bbb5d0c4d8dcc4f60f0f0102018be8dff5aac2f7a6e4fb8d81aed3d886821007010215fac2b68ee7accff896b1a6b1e2fdeec80a0701020bced6dba093fc88fff0db89c4ca87d0070701020bf38a92edc397c1f7d8e3eeedae91e6dcb80f02010205e7abadd089fe84bff8adc4e2a583e81414000206a7c683adf7e3ace0fbfadfe1c89bd5d1a01410000207b1c19df99bc7929f8fe4c49fec8dd396f00f0f000201e1cdb8a29b85c1b18dc6aadaf7c4d6dad8070700020bf0c8c09dcc91fea0dfbb95998bc8cbb7b81003000217d981b59ce4bbbb948083fba1a0f4efd01901adef8b99b5ddc9effeec000f020102020203010110040b04010603, 0x11515141313130f0f0e0e100b08080c020a0202020a1515141313130f0f0e0e100b08080c020a0202020a1515141313130f0f0e0e100b0c020a02020209061515141313130f0f0e0e100b08080c020a0202020a1515141313130f0f0e0e100b08080c020a0202020a1515141313130f0f0e0e100b0c020a02020209060112020d020006030604151514140f0f0e0e100b0f0202020b01080000000a151513100f0f0e0e100b0f0202020b01080000000a151513100f0f0e0e100b0f0202020b01080000000a060f02010202020304f89903ecf82db85dea16dc940ff3964d9ed726cfae0036a7f48da7d1d282bae3a5d001acd2018c930bd5cf0bb59240e5f83791a708b4c6128995000eaee7a396d1d893efae94a01414020208] private def node1314:Certificate:=PackedParametricCertificateData.decode 11 data1314 private def node1315:Certificate:=.split node1270 node1314 private def node1316:Certificate:=.positive 1 [(1,1),(1,7)] node1315 private def node1317:Certificate:=.positive 4 [(3,0),(3,3),(1,6)] node1316 private def node1318:Certificate:=.positive 5 [(4,0),(3,2),(1,5)] node1317 private def data1350:List Nat:=[ 0x11111150f0e0d0b0b0b040d030f010e01080103010a1111150f0e0d0b0b0b040d030f010e01080103010a1111150f0e0d0b0b0b040d030f010e01080103010a060a040306010c00080416030b02030600060308031304050202060304031111110f0e0b110a0f08080809060b040e020a020a1111110f0e0b110a0f08080809060b040e020a020a1111110f0e0b110a0f08080809060b040e020a020a060a040306010c00080416030b0201060012031403070205080008030603010b060502020203070204020202031111110f0e0b110a13090f0808080b040e020a020a1111110f0e0b110a13090f0808080b040e020a020a1111110f0e0b110a13090f0808080b040e020a020a060a040306010c00080416030b02010600120314030506030200040304030904020401020306030f06010202020310040002020603010e0402020206030d0409060102030603110f0f0f110a12090b090b04120211020f0209110f0f0f110a12090b090b04120211020f0209110f0f0f110a12090b090b04120211020f0209060a040306010c00080416030b02010600120314030506030200040304030904020401020306030f0e070206020406040603100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node1350:Certificate:=PackedParametricCertificateData.decode 11 data1350 private def data1386:List Nat:=[ 0x10b0f0202020a0108000a150f150e0e0d140b100b0e0b0f0202020c010a010a150f150e0e0d140b100b0e0b0f0202020c010a010a060f020102020203150f150e100b0e0b0a090b07090702020f010e010a150f150e100b0e0b0a090b07090702020f010e010a150f150e100b0e0b0a090b07090702020f010e010a060f02010202020301010a0c0208010600040412041002000202020409020802010c0002040e0408060706020e0008041604150f150e0e0b0a0a1009150207020e01070101010a150f150e0e0b0a0a1009150207020e01070101010a150f150e0e0b0a0a1009150207020e01070101010a060f0201020202030b020506020203130404020202030a0c02080106000404120410020002020204150f150e0e0d100b0e0b090508050f010e0108010a150f150e0e0d100b0e0b090508050f010e0108010a150f150e0e0d100b0e0b090508050f010e0108010a060f0201020202030b02030600060308031304050202060304030a060602020200020406041111150f0e0d0b0b0b040d030f010e01080103010a1111150f0e0d0b0b0b040d030f010e01080103010a1111150f0e0d0b0b0b040d030f010e01080103010a060a040306010c00080416030b020306000603080313040502020603040311060a12060a0202040c0401010806070603080206040e04010d1c091406060506041c0308020002020204, 0x1150f150e0e0d140b100b0e0b02020d010c010a010a150f150e0e0d140b100b0e0b02020d010c010a010a150f0e0d130c140b100b0e0b0a0202020c010906150f150e0e0d140b100b0e0b02020c010a0108000a150f150e0e0d140b100b0e0b02020c010a0108000a150f150e0e0d140b100b0e0b02020c010a0108000a06010d020c0201060018041a04150f150e0e0d140b100b0e] private def node1386:Certificate:=PackedParametricCertificateData.decode 11 data1386 private def node1387:Certificate:=.split node1350 node1386 private def node1388:Certificate:=.positive 1 [(1,1),(1,7)] node1387 private def node1389:Certificate:=.positive 4 [(3,0),(3,3),(1,6)] node1388 private def node1390:Certificate:=.positive 1 [(3,2),(1,7)] node1389 private def node1391:Certificate:=.split node1318 node1390 private def node1392:Certificate:=.split node1238 node1391 private def data1433:List Nat:=[ 0x10a06130200020202030c020902011200300436030702050800080306030115150e0e0a0a0a080808130408040f02080203000a15150e0e0a0a0a080808130408040f02080203000a15150e0e0a0a0a080808130408040f02080203000a060a040306010c00080416030c06030a0202001204160313040502020603040313130e0e0f08080813040b0408040e0303030a020a13130e0e0f08080813040b0408040e0303030a020a13130e0e0f08080813040b0408040e0303030a020a060a040306010c00080416030c02090201120030043603070205080008030603010108020602040403040313130e0e0f08080813040b0408040e0303030a020a13130e0e0f08080813040b0408040e0303030a020a13130e0e0f08080813040b0408040e0303030a020a060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030f06010202020310040002020603010e0402020206030d04090601020306030e0e120a11090b090f0813040b040e031202090e0e120a11090b090f0813040b040e031202090e0e120a11090b090f0813040b040e03120209060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030f0e070206020406040603100400020206030f04060c02120316030e0402020206030d040906010203060301, 0x115151413150e0c0b110a0a080e040a02080003000a15151413150e0c0b110a0a080e040a02080003000a15151413150e0c0b110a0a080e040a02080003000a06130200020202030c020a02030c000c04100313040502020603040313130e0e0f080a0815040e0404040e0303030a000a13130e0e0f080a0815040e0404040e0303030a000a13130e0e0f080a0815040e0404040e0303030a00] private def node1433:Certificate:=PackedParametricCertificateData.decode 11 data1433 private def data1468:List Nat:=[ 0x100020207e3dca9dbaddbc8adba85888ddfdadd91ce8cb58eb6bbfbbf81b4d0141401026b87b0b895c4e5be89fce4feca8fe1f09da4afe685b0dc8eaab496bfb0140f010275affa819c8291e1ebae95e795ec959ce4a0c2cf8dd6c780f7aaf0b1a00f0f010222e1e5e5a28be38f85f588f3c583bd83c7fdc6c0e9e4958a81eb9ec5ca140701021ccec0e5e0c2a7ad90b1fe9888b1d29c9888fcbcead9b6a3de95a8c3a00f070102388fe2d0e8fb99ead3a0ddc693a9b5c29384dcb2f8a4ccc0a591d196900403010212df99c3e3e0dfd69ffa9a81accc8ef187dbae8ae9d3d5b69dc7a01400010201afc3f0abfe808d8abcb5959b99d5b8adc1a5f0e1e6d689f8ec9a8014140002739ff4d5b5aac9ecd6fda4caea89a9c5add88b9df2a2abb99df2c8f090140f000276f3c389aafbeda89de4dbe5b68397a08ce5948daddcffa9e1c2cda0880f0f000220f089a5fb95f3c2d9d597e3e98ba4a6c4dcd8c3e4f4e58bd7d8a8befe1407000215d9abb5f6f6c2a2ee93ecc3a091c790c2c0869cbb9a92d0aac498e8a00f0700022dc09ac9c6e9e29bfd9f98889ebdc395d7a6d0a9cee08ce8c5fe98aae81913d380919fefaba7b0b7e0c0a197c4fbe489f3ebec9800130200020202030c02090201120030043603050204020002030203010b060502020204010d0208020302030204010d0c0b020a060608040c0308020002020204, 0x1f38289f5d5c2d4d8e0f48df5caeba4be861915b6f1b8dfa58adcbae7f1a6e4a1a890d29ab486a000130200020202030c020a02030c000c041003130405020206030403469faa41d6d04b989a01d38e930122ebdbd8b0ffeec982dcb1a6f8b2e7c9f0ffa58fd1808c04e2f341d4843dcf9760d620d18f07a3f046d6f82da9d70005cd8d98cdc0e3bfc5be85a78891d7f7faa4d9ebb6a18a800ef7cd07d3b20da0ef14c1c633e2d315f3ef0adc8c3efab80002aea2c2ecadc1fdd0b9c3b3ec91e4b9b3c7fcb9a5eebfa048d2a24eb7e05487ba01eb99bb4290f93fd4b740a1d101c2878400198999add4a093f990a5eb96cbfaf4aa808bd99582d5d21414020259fe9df1caa698c3bcea9ada9da981e0f1d8a98288d5a7918081d2b3f8140f020267bc9eeccde9a1f9d9808bf4d697a9adfdceabaecea1d3adeabaded4900f0f02021fe7a699ba8685edb7b79b9ba0b58adff6af94d4c2e0c3e0da9eafc4b81407020222d2bacabdfedbf9df8a99f1dbd1ebcde9c292a2c6f5b4caf5f1a0fcf00f07020241b3a39deaefc3ebb790c2b2ea9bd8e3f2d798d8baa4c381b2b0c1fe80100402020380c0c4f2adf1acc4a09df587d7dd95c493c39aa6e2d4cbe3a3d3a0040402024d94bacce7aee69dceeca696fcaedac381dbdfe2d8efaff58093980403020202c884b4ae9a809efc89a9c0c2fee5b1af91a9b7d4efb1b4b899ae9014, 0x1e3cebaedc8dcdaf88fe2e0ee8ba28d81e8c9b6d38285cdd4fa0f0502020e8ff2ed8cebe3e786a3b888ffb2b5b6fe83eeeea8a4c98ededdffa00805020273c4c08ddca89eae88ecc9b5a8c989c1b39b8997f3e8f2efd09e0e0402025496f6f88cbfe083aad2fbc297aafbbcccfe9edeb0d5859bf6fe0503020234889590fab69d8586bbefeadad3f3f6a694c394f0dfc48b9cc5abde1400020206bf8f92fd9ca2d5e0e08ec7d3d7f6f98a9de6bceda7c1f8fcf2e614140102178bf69199959d8099ac8fa7b4e99eb9eef3f392d98ab1e49ed9dba80f050102139be5ede2aac08986efff94ad91c5dcd1d291e3b796d4d9f0a6e1dc140301021cb886a68097979cb7f0a4d5f8e4f7e5f1b6cf95c8839db4e6e0e182070301022ad4d9beaee9decdae819aa684b9eda1c0f38b99e790f7d7f5dac3f80503010233fcaae3c9d9b8e7afdee0f084ea93fcfcfcc9f4e3fce4c6eef29dba1400010201c391f1b4f8d4c18dcd83cac9c88dd9eeefd28ce1b5b59997d8aa0300010216eecafcff889efda0b5b0d4bae2e6f6efd7afe9ce91bdbbfcd21414000212aff6cf8fc19be6b4fab7f9d597acae9ec6abc5899f98dacf9fe5ee1403000225bfd3b9a498b19ca4c080a0afffc4cd84aad5f09cd3d29bad95de8c0703000224cfd792b7aca99fa8acadb3f6bde7fcf8ada38397f1cfca8bd592bc0503000248a88faffabaaaabb385c9, 0x1a00f07000201f9acae8ec9d4d7afeedf99acc5d8d593dbd8b9eae085849be4d3cbf0070700024da1f3d8a0a988bda191e2d5f0fa85e799a38083e5efe0f787ebd18c88140300021695c386eec7fc8ca3e5d5e6eed4c1f0c4c791c986f0d1b2f1a488c49003030002039684c4bee8bdc8e287aaa88edaeae88ce9a59ab3a6a7fafac0b0bd981912e1fbf4eddbcfbb8fa7cd8c80decac0c7a0cefe9ac800130200020202030c020a02050c0304031304040202020310040b0401060306041002000202020443ebd536f2e955ad8d01d08bce01018ab585c4829abcb4b68cd584e2daf7f0a596cec6e8f002bb930390e602bee80395bd08a8892a90e04780a32597ce0015c7d0ebf2bab0d6a0adce93d8e68cddd6a8d1bb81eaa20bb5a206e9ab0db1b708e6a03efbe136ede628d58a20c78d0004b1a7a1eafd9bb0b9ac91bb9a92e5a2c690b7eee397803aca904afde260cad201e695c33efdf140c58d43f49d01c3b79e004cdab2e190a3efb79dd6f890c9eae190b1d4e38efca01414020235a0fffd8f8fb3e8a8919ff1ab98ecdbf1e9dfbfa7e5e3c2c18bcfbe140f020215dfbaade5f8cf90ffd8bfc095d7efed8cc2a899e4a5d4c6d6a585b2100e020202b8e6a5cdd0eae6a3a28189968b8e89bcfb83fac286a48da5e7f21407020213d18dfaf09888e98b95cab0a18bd1d992e0e7bdf6ed88c8f28d9fca0f070202208dd7, 0x192d086ba97b7d0eae4bcaeb182d390c3c6f3afb69e93b0a3a6140a0202069deaf4ded5ddfe9aab95fbd5ff97d8abd8f58ad38695bbc2b0f5c01007020228b096ced4ac94db9fd09580b8d9dcc5ed9c8dc5ce88abcc92bae193b0070702025f8091e3f5f486e581f9e4c4f7f7c3c39dc6e9e1b6f8a6bce8b6bae3e21405020215e996b1e7b6f686d6ceb8a3ecbc82e6dcf3caadc19c90edd0bec4bcfe050502021dba91caa9a9f2c7b39ce3c8d0cdefbdd2e2f3989c9add9fdcb6858892140302020c92ab82cef19efca6a2c7fba9c6e397a0e3f4c6a2bed5a2c388bdc59e10010202039482b0bcdeb088b3c3cd9cfeb5c189b7c188efb5b9b1aea2a0ee9c0701020216b6f6c2a1c7cbc6b6f1de8697f899a1e7a5a5ddaefeee8ddac8b81414010223dd83bb99a5fd8f8297c0abed80b9e595f6c9bbb2d38886ced1be83f41413010201ba8aadf9a1fab196b9baca94a5c8a7c0fca8fd95f6e99c8587eecc0f0f010202e4e39bafa9f9958eb3a3a0868eb7e482dc85fecdd8fffdad8adff0f80f07010209a0de98f78d91dac4c59ab9dae288d0d79990a492b0b2c89eafba92800b05010218f892a9e2e5eeab96b8a6f398a1c7ae9bf0f0918bf1be86d2a3901403010219ddc3a2e2fd9b84f3e6c8f3f6a5e58d8eaafdc8fbeef2b6adcbd0d9f01414000227deaf8ff4bafcb7efc192ddcaf6d2b686f4bc86cc82fcf998d7cce8, 0x182c8b4fcc2a5f4dac41409010205e4d9f0db86e594b8c2dace95dfdbefe20c07010209b4a7d7c6d59fd1d2aac299c5aef6e0a40707010209ddbb88dda7a3df8da5bfd19bb1a8a8f082ac1403010202c5fee3e9cf9ddefbb0fa80cfc4aaa0f993ee100201024cf6d5e394a3b5caac90baa9fcbc89dc1414000202bbb894c586c3aebf84eecaf5d7c2f49ed5d4101000023cd3bf8cbda7c89ccf8bc8caadfe8299ecee0f0f00021ec9daedb28cbee8ed8db3f280c9c2affcc40707000209dce69baf9a92c0bc9fe2a0c8d9e283c9da801403000202cde9e894b1c3a6ee96cdeeadf9c181cdf6f819019e98c7988ca485defddfba0013020002020203010110040b040106030604100200020202040e02090201060306040c0608060204000a040e0411feb633b6c76d9ebb018ed6ce010797a8fbc5a0e1bdcce8abc3e89899d6d4cd98c2b796cbd00aa4af09fab605cbf405a3850dfcd726908c4581cf2cee9c001081f39fa584b0ed8cf9958cf29a86f28db0dfd0cca08ff4059caf049f99379aff40d6b82bc4d62df3e502d3c424b30013f086e1e7a2acf9b7e5c387888abefbf0d79cf9e0f9a825b6c8539cc96583830192e9c828faa542a0804efd8668a2df0001eba6aff1c3ceaacfc9a285a68e839caad1fec5b4fba3f0141402022180a4dfdb96c88afda4a6e399a0ddf49f94e5cd8cac9dbedf9e93dafa0e0e020249dc, 0x1938f86b7dadafe99aae2dbed89caa5ca9b8d909bb19dae940202000201cab0dd889ad3fbfca7f2e9ebadccada8ebbef7d894b6c6afa80b0100027ea1b192ac9eccf9d9c1acabcbdcae8cd2faa6ff88fb8ac89e0a0100026fc093e98ff4fcdddcf6e794f1a6f3a9e8f39a9fa0cac1ab9a0800000214fef7a9a0f7bd9abc9bc9c8a182f8abe2c4849ed6cba38fa61e01d9ea93add3c2fbe6cce7b0b3e1aaa8efb39400017ada7af957b757aa0fdbed2787b84495e52cea9c00499c89b5e890de99c3f59df6a02e9ce84883d10184dcec6af6a50bebff18f982569edf4991de002bcbfbd190c9a4c986949bcc1414020202f3f1dfbdf2f29fb8e6a3c4b0f084a8c5bf980f0f020221dbf381a3dbaef5f0a085d6dfb5efafb68e0a070202248cf0edacd7b8ef978be786a8d693b1b80707020209c9d9cbc3b6f2a8a089efbcfcfee2e6a8d5f4140602021ed5f2d4c5bdbee1dd92b9eea4f5ae8ba8140502021caececcf2e982bdc9c7b08b8683bf9e8fa41403020202a1b2bdd289b7f99ae7fa8cefcfa5f6d7f2a40303020203a1d6f7aaec9fe294f2d2a09ffee8c3fd941002020214cfaf8ebf81e788e0c0f6baa9939fb7d80101020204edc4aaadf8e6c6ded8dfa5f8c2f2c6ac1414010202d0948af68bd6e888c0f2e18e91dccce39df81010010227fdfaea9dfe9ce7d998fceafac5e782f9fa0f0f010220f0ccf083d29996f9, 0x1dd81a0cec4cc0202020201c6c4c3d497d4fca7a8f6d58bfeec92f3fdfad8dfd7afa298e80b0102020180bdc982ebdfae899d95a6b1bb8eeec7facbabd48bfa98e3b20a0102026d9f99d7d2a98f9dc3ec94b7ecdacb91ad8591cf9de394abb60800020219b6fae8c0bab8b7afb4a0aecfc6bfd5e6c9cff9b1ecf4bf8a1413010202e4c9dde5ad90e5f9d3beeec0acefc39799eef3aec1b9bc87840f0f01021ba1aaa3e4d19fd0c8ae8ff9f1b9afc2be9fedded5f1c0eba00e0e010201878399f4d18a939fe387c0b69a9dedecd791cbfce4fbd089ce0c0c01022587e0f4a08589f4f1e6e29e86ddfab3eacdfceed8f9ffabba0f0201020fd1facfd194babdd19be1cb9a91e6bee0e1b2fcabfcba9e9c0202010201cad0948ccefb92f1f5a2fda5d3bfeca095c181f8bb8ef28dc80b0101027fded4b184e68488c4cfe4b3dcd4c4b0fdb3dca887a59d8dfe0a0101026dd2a5b6d6bc83ffdea68a9df3d1bac18cc3cba8f7dbbaf0a2080001021681f8a0bda2adfc8092e5bb92def49ceed7e6b3a0ceb9f39e1413000201d2cbcfc0cda281bcd08a89a098f585aacd8f92d9d9ba9e90ec0f0f00021b819fbda6b6b8fd9aa5c997d68e80dceea8a4b380f3d5c8800e0e000201aca2c8a9edf2c687efdd979cd2aec2a3e4ccb4f689ccfee2a0140b000201938995a2ecb5dbcf8f8e9fa38af29a97c7a6a5eebc9ac1d5c00f02000210, 0x10f0f00020ebedbf08ae28c8ebebde5e1a3dc86fcaf94d0f2fffcce82800e0e00025d9e938cd99cacf0dcbb9796ec8f88f589d4a9b69bcf8bd480140b0002519edbcab8f8edae9ffb908fdfecf887e989d6b1b480c6a180140900020ed495edbfe6ffcebc96a5f6ed88ddc5e3dbefd5d9bced90800f0200020487b7f1cf84b0f28de780cba18dadf9d5b081eea1dbe19580020200027cf2dccbe3b4c29dd0a3d9fa95e98ec89189c48ac3e386cb800b01000255f291d1c4dcbecca1e0e8c6c1d085be93a68680d1d2df9d800e00000212d0af9cc9ecce87e09a8381aad5aabbe3ffb9fe9ef7ce88801e75f9c88191b8fcf6f2c895de988cedede08000119bb236bcc363d3bc29a8b7010191ddfbb2c5f2838fede48197e6efeabfb5d6c013981dd855e71fb20f91ec2790d344a58c20fca70073ddafe2b1c1b0f3e288c3fccd91ff9ded89a6c0569baa56a3e62bbdc81cd1a808b3c106e8c302c6b301cd930004bfa5f3ae8f8bfeaae594f0908aa8ba92efe01413020201cad291d393b9d6f79ab489849ecf82e9a287a689a297bdcdb40f0f02021bfb958ab584bb98d3fea2b3f99b939cb6d3a38baef4cb98c80e0e020201aaffa292a3dde195a3ccf9f7a5caecffd4c99aa491dbab81f0140b02020193d2b2a882d0c98885e1d698e6f8f1f7e6d8f1fa9e8ecee9c00f0202020ccbabd9adbb82969b878fc0899899f3e7dcf9, 0x1d6dec8b3b8f9a4f4cc91e484e3b3f8e7c3a00e0e02025cbcc3bec09796efc1a6b8a1aed7f68ac9c3ed8793bdcfdc80140b02025097f7a48badcb9cd2efd3e986c4eac0d6f4ccb4ced2afffa0140902021089c586efabeaee93c5efb6bc99d9adcedef0afcfa5c7b7800f0202020392b2ed9d8bc5fbc6be92d7b0949fe6a3db868fadcfe8b9a0020202027bd5fefcd1c5f19bd3e0e0f0c998dfdea0db93d2a6d79a97800b010202558c9a98bc8edafbfdc0cc9cb2a8f5bed2c9f4b5ecdfb8b3a00e0002021480d1e898fc9dffadafc0f3e2c2c6aedaa3a0f488b1d2bdc01413010201b6a5d4e3fafafaade49795a1aff0d6dadabfc4c2e5e3a29f980f0f01020ec3b2cfe1f8c09be2f0e8c5a7d3948be09aa7f9ccae8ce7b80e0e01024990b1aae087aacfdece9fabbadeeed5e5ccb6c3ede1fee9fa0c0c010214a6bba4ce98f6a9e8b296a3accaa2da88f5b6ebb5f8d69de6140901020f978192f19bc7e08ef797aff28daadeb5f4e5cd8bbac18de00f02010203ffd9acf2b297d6cca8b880fcfca1d987d29e9ee8e29385d8020201027d92bbe482f5c98b9dcedae2e2f7a6fdbbad86fee2fbd0a8800b01010255eb95bfd9e6d9bae0cf9ffbae85a8bdd78293d89995fa80d80e000102138fafd5a497f9b8d7a5e5888caeed88cfc2c7be99ff958ed01413000265dc9483f59ba1ced0cdb8ffec9ee9eeb6e5f5a3a0b3cae080, 0x11515141313130f0f0e0e08080c020b020a0202020a1515141313130f0f0e0e08080c020b020a0202020a1515141313130f0f0e0e08080c020b020a0202020a060f02010202020412020d02000603060405e5cc2581dd63df823bc9bb011bbdecdaa7e8ea8faaacc783b78c8ae2e584c00ab313ce3db141ba0e96da20c681418af62cf0d30045848998fbbf828393a4dab7b39c9bd9f6e4dc80569ce256c3ce2bafa01bf9c406e7e506fa9f04949303b6cd0003b7c5b9f3eca99bd0bd84a4dcbbf2b59abd801413020262f3feded3aec9a1aae0eefed6e9ebcd94959ab9b2af85d4800f0f02020eaaf3e6caf1bf] private def node1468:Certificate:=PackedParametricCertificateData.decode 11 data1468 private def node1469:Certificate:=.split node1433 node1468 private def node1470:Certificate:=.positive 1 [(1,1),(1,7)] node1469 private def node1471:Certificate:=.positive 1 [(1,0),(1,7)] node1470 private def node1472:Certificate:=.positive 1 [(1,0),(1,6)] node1471 private def data1513:List Nat:=[ 0x1150a13090e0908080e020e010a010a060d020b0200040304030b020106001203140307020508000803060301150f150e0e0d0b0b0b040d030f010e01080103010a150f150e0e0d0b0b0b040d030f010e01080103010a150f150e0e0d0b0b0b040d030f010e01080103010a060a040306010c00080416030b0203060006030803130405020206030403110f150e110e150a0e09080809060b040e020a010a110f150e110e150a0e09080809060b040e020a010a110f110e150a0e09080809060b040e020e010a010a060a040306010c00080416030b0201060012031403070205080008030603010107020402020203110f150e110e150a13090e0908080b040e020a010a110f150e110e150a13090e0908080b040e020a010a110f110e150a13090e0908080b040e020e010a010a060a040306010c00080416030b02010600120314030506030200040304030904020401020306030f06010202020310040002020603010e0402020206030d0409060102030603110e0e0b15090b090f080b0412020f020e0209110e0e0b15090b090f080b0412020f020e0209110e0e0b15090b090f080b0412020f020e0209060a040306010c00080416030b02010600120314030506030200040304030904020401020306030f0e070206020406040603100400020206030f04060c02120316030e0402020206030d040906010203060301, 0x10e0d150a08050d030f010e01080103010e0008000a0e0d0e0c150a08050d030f010e010801030108000a0e0d150a08050d030f010e01080103010e0008000a060d020b0200040304030b02030600060308031304050202060304031313110f150e110e150a0e0908080e020a0100000a1313110f150e110e150a13090e0908080e020a010a1313110f110e] private def node1513:Certificate:=PackedParametricCertificateData.decode 11 data1513 private def data1544:List Nat:=[ 0x1020c0109060f0201020202040d020c0201060018041a04150f150e0e0d140b130b0e0b0f02080202020a010a150f150e0e0d140b130b0e0b0f0202020d010a010a150f150e0e0d140b130b0e0b0f02080202020a010a06150f150e0e0d140b130b0e0b0f0202020a0108000a150f150e0e0d140b130b0e0b0f0202020c010a010a150f150e0e0d140b130b0e0b0f0202020c010a010a0601150f150e0e0d140b0e0b0c09090702020f010e010a150f150e0e0d140b0e0b0c09090702020f010e010a150f150e0e0d140b0e0b0c09090702020f010e010a060d020b02000403040301010a0c0208010600040412041002000202020409020802010c0002040e0408060706020e00080416041510150e0e0d0e0b0a0a150710010f010e0102010a150f150e0e0d0e0b0c0a0a0a0f010e01070102010a150f150e0e0d0e0b0a0a150710010f010e0102010a060d020b0200040304030b020506020203130404020202030a0c02080106000404120410020002020204150e0e0d0c0c140b0e0b090508050f010e0108010a150e0e0d0c0c140b0e0b090508050f010e0108010a150e0e0d0c0c140b0e0b090508050f010e0108010a060d020b0200040304030b02030600060308031304050202060304030a060602020200020406040b060502020204010806070603080206040e04010d1c091406060506041c0308020002020204, 0x1150f150e0e0d140b130b0e0b02020d010c010a010a150f150e0e0d140b130b0e0b02020d010c010a010a150f150e0e0d140b130b0e0b0a0202] private def node1544:Certificate:=PackedParametricCertificateData.decode 11 data1544 private def node1545:Certificate:=.split node1513 node1544 private def node1546:Certificate:=.positive 1 [(1,1),(1,7)] node1545 private def node1547:Certificate:=.positive 1 [(1,0),(1,7)] node1546 private def data1594:List Nat:=[ 0x10d020a010a060d020b02000403040313020906012a006604740307020508000803060301150f150e0e0c08050b040c030f010e01080103010a150f150e0e0c08050b040c030f010e01080103010a150f150e0e0c08050b040c030f010e01080103010a060a040306010c000804160313020a0603180012041a03130405020206030403110d0e0b110a13090e09080809060d020a020a010a110d0e0b150a13090e09080809060d020a020a010a110d0e0b110a0e09080809060e020d020a020a010a060a040306010c000804160313020906012a0066047403070205080008030603010101110d0e0b150a110a13090e0908080e020d020a010a110d0e0b150a13090e0908080e020d020a020a010a110d0e0b150a110a13090e0908080e020d020a010a060a040306010c000804160313020906012a00660474030506030200040304031104080c021001020412030f06010202020310040002020603010e0402020206030d0409060102030603110e0e0b15090b090f080b0412020f020e0209110e0e0b15090b090f080b0412020f020e0209110e0e0b15090b090f080b0412020f020e0209060a040306010c000804160313020906012a00660474030506030200040304031104080c021001020412030f0e070206020406040603100400020206030f040e0c05240236043a030e0402020206030d040906010203060301, 0x1150e150d0e0c130b150a0c0302020f010e010a010a150e150d0e0c130b150a0c0302020f010e010a010a150e150d0e0c130b150a0c0302020f010e010a010a060d020b02000403040313020a060806030203130404020202030a0c02080106000404120410020002020204150e150d0e0c150a08050c030f010e01080103010a150e150d0e0c150a08050c030f010e01080103010a150e150d0e0c150a08050c030f010e01080103010a060d020b02000403040313020a0603180012041a03130405020206030403150d110d0e0b150a0e09080809060e020d020a010a150d110d0e0b150a0e09080809060e020d010a010a150d110d0e0b150a0e09080809060e02] private def node1594:Certificate:=PackedParametricCertificateData.decode 11 data1594 private def data1619:List Nat:=[ 0x1150e150d0e0c0e0b08080c030a02020215010a010a150e150d0e0c0e0b08080c030a0202020a0115000a150e150d0e0c0e0b08080c030a02020215010a010a0614020c0201060306040b0201060012031404150e150d0e0c130b0e0b0c03080202020a0100000a150e150d0e0c130b0e0b0c03080202020a0100000a150e150d0e0c130b0e0b0c03080202020a0100000a06150e150d0e0c130b0e0a0c03080202020a0108000a150e150d0e0c130b0e0a0c03080202020a0108000a150e150d0e0c130b0e0a0c03080202020a0108000a06010b020506020204010a0c0208010600040412041002000202020407020106000203080408060706020e0008041604150e150d0e0c130b0e0a0c03080202020a0108000a150e150d0e0c130b0e0a0c03080202020a0108000a150e150d0e0c130b0e0a0c03080202020a0108000a060b020606020203150e150d130b0e0b0c060c030b030a030d0102010a150e150d130b0e0b0c090c030b030a030d0102010a150e150d130b0e0b0c090c030b030a030d0102010a060d020b02000403040301130404020202030a0c0208010600040412041002000202020407020402020204060603020206030804010d1c091406060506041c0308020002020204] private def node1619:Certificate:=PackedParametricCertificateData.decode 11 data1619 private def node1620:Certificate:=.split node1594 node1619 private def node1621:Certificate:=.positive 4 [(4,0),(3,7),(1,9)] node1620 private def data1671:List Nat:=[ 0x1010a150e110e150c0e09080809060c020e010c010a010a061302000202020313020906012a006604740307020508000803060301150f150e150d0e0b0b080f05080505030e0108010a150f150e150d0e0b0b080f05080505030e0108010a150f150e150c0e0b0b080f05080505030e0108010a060a040306010c000804160313020906032a0012042003130405020206030403110f150e110c0e0b0e09080809060d020e010a010a110f150e110c0e0b0e09080809060c020e010a010a110f150e110c0e0b0e09080809060c020e010a010a060a040306010c000804160313020906012a0066047403070205080008030603010101150e150d110c0e0b0e0908080d020a020e010a010a150e110c0e0b0e0908080c020a020e010d010a010a150e150c110c0e0b0e0908080c020a020e010a010a060a040306010c000804160313020906012a0066047403050603020004030403050202040202030f06010202020310040002020603010e0402020206030d0409060102030603110e0e0b15090b090f080b0412020f020e0209110e0e0b15090b090f080b0412020f020e0209110e0e0b15090b090f080b0412020f020e0209060a040306010c000804160313020906012a0066047403050603020004030403130402020202030f06010202020310040002020603100402020202030e0402020206030d040906010203060301, 0x1171415141713170e140b150a14020a02020200000a1713170e150a170314020a020202071713170e150a170314020a0202020706170e150e0e0b150a170302020e000a00080002000a170e150e0e0b150a170302020e000a00080002000a170e150e0e0b150a170302020e000a00080002000a0601170e150e150d130b150a17030e010a01080102010a170e150e150d130b150a17030e010a01080102010a170e150e150c130b150a17030e010a01080102010a061302000202020301131007020206030a0208020204010204060410020002020204150f150e150d0e0b0b080f05080505030e0108010a150f150e150d0e0b0b080f05080505030e0108010a150f150e0e0b0b080f05080505030f010e0108010a061302000202020313020906032a0012042003130405020206030403110e150d0e09080809060e020d020d010c010a010a150e150d110d0e09080809060e020d010c010a] private def node1671:Certificate:=PackedParametricCertificateData.decode 11 data1671 private def data1696:List Nat:=[ 0x1150e150c140b140a0e0a160815020a0202020a010a140a130a0e0a160815020a02020207140a0e0a160815020a0202020a0107060b0803060118031a040c020a02010c0024042804150e150c140b140a130a0e0a0e02080202020a010a140a130a0e0a0e02080202020a0107140a0e0a0b0a0e02080202020a0107060b0206060202040c020a02050c030404010a020802020401020406041002000202020408020602010c000404100408060706020e0008041604150e150c140b140a130a0e0a0e02080202020a010a140a130a0e0a0e02080202020a0107140a0e0a0b0a0e02080202020a010706150e150d130b0b0b0e0a0a03110202020a0108000a150e150d130b0b0b0e0a0a03110202020a0108000a150e150c130b0b0b0e0a0a03110202020a0108000a0601150e150d140b130b0e0b0e0a0a030d010c0102010a150e150d140b130b0e0b0e0a0a030d010c0102010a150e150c140b130b0e0b0e0a0a030e010c0102010a061302000202020301130404020202030a0208020204010204060410020002020204080206020404030404060603020206030804010d1c091406060506041c0308020002020204] private def node1696:Certificate:=PackedParametricCertificateData.decode 11 data1696 private def node1697:Certificate:=.split node1671 node1696 private def node1698:Certificate:=.positive 2 [(1,7),(1,8),(6,11)] node1697 private def node1699:Certificate:=.split node1621 node1698 private def node1700:Certificate:=.split node1547 node1699 private def node1701:Certificate:=.split node1472 node1700 private def node1702:Certificate:=.negative 1 [(3,0),(2,4)] node1701 private def node1703:Certificate:=.split node1392 node1702 private def node1704:Certificate:=.split node1115 node1703 private def node1705:Certificate:=.split node1008 node1704 private def node1706:Certificate:=.positive 1 [(1,0),(2,4)] node1705 private def data1717:List Nat:=[ 0x115151111150a130a0b0a15091309150213020915151111150a130a0b0a15091309150213020915151111150a130a0b0a150913091502130209060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311040c0804020302040803100400020206030f08080607060212041a030e0402020206030d100c120a36012004300308020002020203] private def node1717:Certificate:=PackedParametricCertificateData.decode 11 data1717 private def data1727:List Nat:=[ 0x11515120a150913090a09150813080808150214010a1515120a150913090a09150813080808150214010a1515120a150913090a09150813080808150214010a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311040c0804020302040803100400020206030f08080607060212041a030e04010200020308030c060a120008030803] private def node1727:Certificate:=PackedParametricCertificateData.decode 10 data1727 private def data1784:List Nat:=[ 0x108c6f0d3bec794b28de8a1e7d9f7dfd5bbff98ae81eac0980909010203e0d4f7f4a2b8d0fe85ace393c1c692fdc8fcc8f0f9e1b611080102109fbb9c939ac6dcd3f1f4f0a5929094f8dedb9c9497ccb0080801021f84908183bb89c9b198e6d89e98ac86b7ef978ab6e1f3a214060102039f84eda6b680cad4cbecc8d0a0ddff9ee193f3fdfbe0cca0151400020edbe3dae88780a4a1d6a7ae8fa4ebc789d7d0abb9c2acdbc41313000270e187928a9df2dcf4919e91cfc6bfb4a7e5faedaab485c0151200020380a7e38bf69f8e8bf286a9ebcdb5e6da8ae5b28792e394131100026fbcf3c3e084c1a895ccfa8cdaeaec9da9b5cb98b4f294e40909000202df99d6e6b3dafeb0a1ad82c892c28af1a1d0d8d2e79cc21108000201b1dea7f5aaf3e799f792e2e1d9bc91e3c5bdbdb0d388c40808000216e784baabfadefa81a1b6a1a8fbd9a688dad4dbf6ce859e140600020381a0daa2fbc18ff7afd4c0a5868fc3e3e9add8e5959cfbe41206000204c0cd86cd8eafbac2b6caefa7c6f89b9fa5fca5dcc4e0fc080400020594e1ea9a94f0ac84cfcfd9a38cc9c181f1d5dc9897f4d81e05b1e787a4c2bde7f7c8c1ba9fb087a0c0a6000a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030c0403020102030403100400020206030b0200020202030a02000202020301, 0x1080416030c02090201120030043603130404020202030a020802020401020406030c020202020203100400020206030b0200020202030126ae8710db8166cb9e339fc10102cab2cde2d4e683b8b5bdd5a7ebc18483a2e0308401f53dc31ff60a99b62dd2e5418cb620c7ad0006abb4829e818bbd8481f6b6b4cad894abbbc6801acf27ac35d31b823ee4e02df4ab21cb9910e5b40001f7e38e89d5cccc95a2f7feac9be29a8eebd6c0151402020e9f8fbcb9c086d3f4cf829790c8afc4d9eba9eb87c5829f90131302026ffc9bedeaf2abfaaa8aa8f0cdebf9d7eba0f7f09adcaab81311020278d9a6dfd0a788e2c0a0c1a2ef90c4ee8c9582d5f0beb5a81111020205de86d685d78fb0fd86f293f3de95a3bbd4ab8af8e987980909020202e4b1b8c2898386fc86e98cf681c08a8b90e19fcdb587da1108020205a6ddd793cc838ee78bf7e2d7d7cee7a2e6e3bcbbafd4980808020219a7dd91f4858defeaac868fc5e0819ce1d99fba889efe921406020202ffd4bdfbb4ceaab1abfbfa98fac7efcfbfb2bed9bfba919c0804020202f6b8cfc0c781b4db93fbcdaba0cf8ff19bb4a3fbb2a6ec151401020ec580fcc894bdabd0dff7e0f6e385c2d7dc9ecab4c5f8f3801313010266edd7f7e0ace6f09efbce84a9fea693f3a39caadda3d9a0131101026eabf4c4b998d3e29fd3a0edf5c79cd8f8a1f8b4ceb28bc011110102, 0x10202031404030202020315151311150e0a0913080f0608060e04120208020a15151311150e0a0913080f0608060e04120208020a15151311150e0a0913080f0608060e04120208020a0610040a02010a0004040e030c02090201120030043603010e040b040a04010e040e030f060102020204011311130f13080e040404130211000f000800091311130f13080e040404130211000f000800091311130f13080e040404130211000f00080009061208050600060308031404030202020315151311130f0a09090913080e040802060215010a15151311130f0a09090913080e041202080215010a15151311130f0a09090913080e041202080215010a0610040a02010a0004040e030c02090201120030043603010a0208020204010204060315151311130f150e130804041502130202010915151311130f150e1508130813020715151311130f150e1508130813020706120803060018031a031404030202020315151311150e130a1508130813070907080206020a15151311150e130a1508130813070715151311150e130915081308130707060a040306010c00080416030c02090201120030043603010a0208020204010204060301100400020206030115151514131113091508130809080707070614010a15151514131113091508130807071401081515151413111309150813080707140108060a040306010c00, 0x115151311160f130f150e130b1302060201010915151311160f130f150e130c1302060201010915151311160f130f150e130c13020602010109061302000202020415151311130f150e0f060a061503060203010915151311130f150e0f060a061503060203010915151311130f150e0f060a06150306020301090615151311130f150e0a0615031302060203010915151311130f150e0a0615031302060203010915151311130f150e0a061503130206020301090601010f020206020204121c0e140b060a06041c031002000202020415151311130f13080e0404041302060208000915151311130f13080e0404041302060208000915151311130f13080e040404130206020800090612020406] private def node1784:Certificate:=PackedParametricCertificateData.decode 10 data1784 private def node1785:Certificate:=.split node1727 node1784 private def node1786:Certificate:=.split node1717 node1785 private def node1787:Certificate:=.positive 1 [(1,1),(1,7)] node1786 private def node1788:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node1787 private def node1789:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1788 private def node1790:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1789 private def node1791:Certificate:=.positive 3 [(3,0),(2,2),(4,7)] node1790 private def node1792:Certificate:=.positive 3 [(1,0),(2,6)] node1791 private def data1803:List Nat:=[ 0x111110f0f130a130911090b091304110213000911110f0f130a130911090b091304130211020911110f0f130a130911090b0913041102130009060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030e020b040402030203100400020206030f08080607060212041a030e0402020206030d080a120806010a04120308020002020203] private def node1803:Certificate:=PackedParametricCertificateData.decode 11 data1803 private def data1813:List Nat:=[ 0x115151111120a13090b0913040a031102080213000a15151111120a13090b0913040a031102080213000a15151111120a13090b0913040a031102080213000a060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030e020b040402030203100400020206030f08080607060212041a030e04010200020308030d040a180808000a040e03] private def node1813:Certificate:=PackedParametricCertificateData.decode 10 data1813 private def data1869:List Nat:=[ 0x1f886cc9a93f0caa5e686cf988cdd8a15110102328dead799ffd5d4daa9ecb8b7e28a889297c990c6dc8012110102029cf5f4d99cafa7a7f3839197b5f7c299a9aed49e9afca81111010203f299f489b6aca5d1e1ceb5b7d9c689d5baa4f5e6979ad6090901020eefd6d5e59fc5a19eb4b797939af79383c7f5809ae7820808010231b7c2f78edae6ef98af99e6feb1c2a1b184e798c7ac9c1106010202e7a8f3f0d7b18dbeb5f6bffb939deccdbdb5d7bececed4151200020395f3d9ef96d9f99cc5f28fc7daf2b1ab9b9ae381e0ffb012120002019e8592b6bcb184abe6b1eeb4a08cf780adc8f99c8595dc151100024afdde8b89b4b2c8b8d3a8948ab3d8c1b893ecb79bc0e81211000202edd8d4a3d89fcfffba82b0f3ff91af9587f1cfcef4edb01111000203df92e383f4ddc5e68fb080f2f2b68398ad91a7a0efc7ec090900020ad582b2ddcac28d88cc8dcafa87e498dbffdcbebed08a0808000244a6e8a0fce2fbd8c2a9d4afc997f19593d4ddd8d2d0da120600026384dafeb7aba4bdffadc2cbedb7f299a2aaadb4f988981106000202c3eddbe1b9ae9af99cb5e5db8fcb8ce6c184b1abedbdd81e03f2f6adc3ced9ecc3aed5ccef99c48ee6000a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030b0200020202030a02000202020301, 0x1a5ccb1c7a1b4f0fbcc8acae4d6e00e0400025afba596a0c2fcc78cea9bb5f9a5a01e0db2f783dcbd9fc5f8000f0201020202030c020902011200300436030506030200040304030a0208020204010204060329cca92fae8f50b1f342e9b2016588b5fdd3d1f8a7b482e2e2dfc3a6b5b9f430fe12b932e11ade07efe22ccbaf42818820d4c50003f786f7dea9faf8a5f39e8acdaeaed195afb43382d934c2b37cd48b5eaca219a4c61a9cb03e9c9a2efab70030c0bb969493c4b387dcc78aeceeefb9f7f813130202089f8ddfbdfedec1edb2f6ebdfcdaacea5fe91b88cf19815120202038cfab599dbe5e394c5e5aadab7dc8a8e92e0a3dcbff19012120202029c8cae9ae0858e9bbc88eaf2bea1d2bd89ed9f81cf98881511020237e293bea293cdc0adcacd91a4aba08893ba8eacfbd0c81211020201e7cbe2feaa9e9ae5f58eef8ba0ff83c19dc9a6adb4dedc1111020203ed83b9c3fdbde7f7a88caae8e8a3ffc2afc6dff9fff4800909020209f6a6d5dedfedc39390f7b6e99bd3a2ffcc91d3d2c4fa120602021ab6caf5bbc3be86fe86d5adf396ca95fbaab3faaf83ca110602020385828bd8fbcb9ec2e286b0b4bea1a98ffce3e7fdc8edf6080402023edbc2ac8a98e2f8b2fd97f397f4c7a68ba5d0c5abe9a61512010203d8cbde99c1e996ddd4e8db92cdcc85ca95acc0d8c5a9801212010201ef989ed1b1e0f5e9, 0x1cbd59994c8d3c6a1fd96dab5b295d00a0a0202019aa0f7d4c1ac95bbe5dfea86b89890090902027681c8ee91f8fe87818fa4fc8fc3e80808020208b9bdbab197b4a4b598f7c0b494acc81106020207b1a0bde3ffbca7a09395c4d08a82d00606020217a3f78484acfab1a38190dfd7a090150402020d9ac8cba0c4acfed5c7abb2e1c78da00e04020252b1d7f9cacfd6e8de94bc96db92f01515010204fe87d0f5f3c0f196a482e7cfb2cc1512010212d0f2b9a98aab9c9287829c8ec1ddb8120e010203fc8784c5f8aedff691939cacddb9f40a0a0102018edab9a7e681ddb3a0c4a8839ed4bc09090102018492bbbbd5ca96acbac1b48f91a4a00808010208beebd29a8d8bbbfcc1a681e492c4c21106010207e0e7a3f8a094f282f3e586da87df84060601020eb7ec808db2f1b3d7e393dfed8cf2150401020da4d2cdc3d2a194c5c0fcca82d68af80e04010256de90a7b0bca3c1b3c9b1a1a4ef841515000210c1e0a2edbee6a48cd9c28ba6b0dc13130002428cc5aad1b7c3b9e28ab2ccd884b4151200021296c2e0a5c686d7e6f482eaacf89aa0120e000204908ea1c4ade7a0b1b0b483b383a3c00a0a00020197c8ccf49884dbdedcefa59edaa4c00909000272ddbae2a5898efce7a7bed197f0d808080002089fed9aeabefcfcc5bdacb2b68abcf81106000207e0f0949bbda8bed2cbce87d0ddf1a0150400020d95, 0x1120204060202031404030202020315111211130f0f090a0909080f060b06120208020a15111211130f0f090a0909080f060b06120208020a15111211130f0f090a0909080f060b06120208020a060f0201020202030c02090201120030043603010e040b040a04010e040e030c0403020102030404011511130f0a0913081108090809071106080206020a1511130f0a0913081108090809071106120208020a15111211130f0a091308090809071106120208020a060f0201020202030c0209020112003004360310060e0203060302030a020802020401020406030c02020202020410040002020603011511130f090913081108090811060404080206020a1511130f090913081108090811060404120208020a15111211130f09091308090811060404120208020a060f0201020202030c02090201120030043603130404020202030a020802020401020406031511130f090913081108090811060404080206020a1511130f090913081108090811060404120208020a15111211130f09091308090811060404120208020a060a040306010c00080416030c02090201120030043603130404020202030a0208020204010204060301100400020206030b020002020203013b9d039d18c32cca0babf105aad9249cfa1484f9001fcba1aed590d9d7e7abc01512020212f2a2a9a482fe8089ed80d883bad480120e020203, 0x115151211130f0f0b0b0b110813020602060101010a15151211130f0f0b0b0b110813020602060101010a15151211130f0c0b0b0b110813020602060101010a06110210020006030604151515111211130f130c0b0b13020602030101010a151515111211130f130c0b0b13020602030101010a151515111211130f130b0b0b13020602030101010a06151515111211130f130c0b0b13020602030101010a151515111211130f130c0b0b13020602030101010a151515111211130f130b0b0b13020602030101010a0601010f020206020204121c0e140b060a06041c030c040302010203040415151211130f0f0b0f09130811081302090208000a15151211130f0f0b0f09130811081302090208000a15151211130f0f0b0f09130811081302090208000a06] private def node1869:Certificate:=PackedParametricCertificateData.decode 10 data1869 private def node1870:Certificate:=.split node1813 node1869 private def node1871:Certificate:=.split node1803 node1870 private def node1872:Certificate:=.positive 1 [(1,1),(1,7)] node1871 private def node1873:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1872 private def node1874:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1873 private def node1875:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1874 private def node1876:Certificate:=.positive 3 [(3,0),(2,2),(4,7)] node1875 private def node1877:Certificate:=.positive 1 [(1,1),(1,2)] node1876 private def node1878:Certificate:=.split node1792 node1877 private def data1899:List Nat:=[ 0x1151513130e0e0a0a0a0808081506130409040a020a151513130e0e0a0a0a0808081506130409040a020a151513130e0e0a0a0a0808081506130409040a020a060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030b060502020203100400020206030d02080203020302030e0402020206030d040906010203060315150e0e120a12090b0913040b04120211010915150e0e120a12090b0913040b04120211010915150e0e120a12090b0913040b041202110109060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030e020b040402030203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node1899:Certificate:=PackedParametricCertificateData.decode 11 data1899 private def data1950:List Nat:=[ 0x19fa4b596111101025c9d9580dbbbe795fa86f7f1e590e8e5faa4f09884f4ea0a0a01020cdbe3e6c186e6cbfdc58ac4a6fdcfeabcce8ef6d3f1961406010207e1f7e9a2e09eebfeaf9fc9e4b7c2cb90a0f5f890cbf2be1106010201b18fb6c4b79d9e9e9fc1e6d7f5b5c0b4ea9ba7cdd48de60606010234a8e2e1b89099b6edc9fed5d2f5b2c2ea919884d69182130401021c89cf97fdd6d49aacacc9829086c8e3899aaef5f4c290120401021dfef2cf9199e7eab8d2fb89d2c38af9c5d4d2c6becbe61514000227bcc5ba83c8cf91d187cfaa85c6bab5edfea891bba2841411000209e1f4cfd6b0effea4dabcfcd2a5a8c6ed919f9fc19bcaf0111100025ad4aeb4b7d9ebb1dcfaa4cdd2bb91addcd1d2b0fa90b00a0a00020d9faeff9bb5cfb3b9cff4e194b780d2c6d494cedf8ac0140600020899d4899ca5c8f38ad0e5bce0daaafed59dd6d3f5c2bfd41106000201cec9a7ea9a9df28b8dc094ceca9fff83c7e6f7c7d88c90060600021f9df4cde2aca5e1908bc5caeca987adf896a0a28e8b90130400021cacfa81c6d4b5cc9eded1e8b5bb979486deb2c5fe9c84040400021595e895a2f8f8c3d3bca187bb80c7ad91a8bfb3b6caf81e04d8dcc1c2c4c6dfdee390e4dceefadf8e000a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030101, 0x1dfc7e6e7dc06040002058ec9efecaed9fcfaf0c0aa9db1e0919c86a9d4040400020287dcf39ea8b9e5e4828d8bf5e4d8d1eb8c92961e03b7d6aa8febc2afcef9de93b4000f0201020202030c020902011200300436030506030200040304030a0208020204010204060324c99a12c3886781ef3389b401038f938ffed1849585c1e98ea5cac8a4c4c008e134c6259911ec11eff031bdf13db4f41ef2b7000691a7d2d7a7dec1d1afd9ebafdd88aad8a5e837e212902494259f3d85d628e2cd28be8514bd8e0060adabe0abf5828ca4c89a86d597b0eab9901313020231db8585daeec7caed9ff8f9acd5cecee1dac0dae2be141102020ab0b792c9a1c3c1fe89f49cd3eabe8fe8c9ac87d991d592111102025cb98fe1c9f1a59daa8599ec8b93a4f4efe496e095d7980a0a02020ce4e0ebafb1dbcd848fcbbec29c90e3f18bb0d6aafc901406020207e4fee5c9f5afc1daf2decf8a8aaefab0eabfebf6a3e2a61106020201abcdf6dba2e3b4e8adffc1acaec280c2819791d9a99eda06060202319c94b8f6de8c9bbad69a8989ffdebabfa2bdcddc89f81304020220c8f183f6f9fe9ee5c8fdcfa4e3ebfa84e8fed0e8ebc4120402021be1f7ddc0a49ab58c86f4bedbebfbcccf8cc98efc86b61514010235a8c78cb3ee9edc9c98cfae9bd098b5cebfe0a5adb6dc141101020a8cb486ecbdd09bafbea4e3cbbba5d09a85cf95, 0x106020202e9a2d1b0ced3a3d69dbef3bcaebc8eabf1be8a15040202019bc8cce7e6a7c4e2a7c9e4cbb791f5c0a2ffe01104020249939cdadbdff2d9aec6e7bede89cfc2d4d8a00604020204fccabcdfbbfe83eccea4c58bc3cba5f8dadb900404020201f0a9d6c8fa83c5ebb0bdafb4fbaec7c087ded00a0a010209bda9f4a8b8cc92de98cd9fa9af88fac993a00808010211a39af4f0c895a7b9e882c583c6b6caf5c0f81506010201e2a5d18899d4a792bcdafee380fb9f8fadd8fc110601024d98ddcede849883c6a4e2d9b884b0a5d89f800606010202ebbf82b1eddda5f0f5d4afa9cbf5e998c6d68c1504010201b186ebbeeee58cd1cfb78a9deae2d38df0aff41104010232cfd5dac0e5a5cb869a9dafa882bad5d0eef006040102058189b7bfd68b97c2a4f99d96daa0bda3fe9cd80404010201f4dfd3cbd6cab3cfffbfb487be9bc1c785e18c13130002098190c492d3dbe4e285b4a1e094fa9ee993ae1111000212ace6f692b9d6fdd7c6b1edd09b86b9ccd8a00a0a000207a8f2a18094a3ac97dfd6ddd5c0cb80ab92a808080002079f8cbe838b8abb86e4dd8aeaed9a89b6ae861506000201f4eaabb8fd87ebe9d794cfc3c9abeca3eebbdc1106000225f6ecb8c7b1d4b891b2b8bdf8aab8e5bf86b80606000202e795f8a0d791ccc4c39ad99cbde1d5a2bda0c01504000201bddfea8180c98580b5fec7f5baeb, 0x18fbbd989fbc00707010202fbfed9a6b8e8e3e4faa98082ecacccb3c08aeaf5c0c09bc89f8fb0cfa8eef7fa14040102058ff58df2d0a28ac4dd98a8a0fb9fdd8099e0fc97b3a2f899dfbcf4d8928ae01403010204d7faef87a8a3ebd5eb8dadefbaf2b1f9c7c2d2d8c1b39ee4bbd7d5f680f99bb8141400027bb8f7fff2b7edb0dfddf7a2aef1b2f6e28aecb3d0e4968686e5da83b196ecede00f0f000202ef8196e08fb7929ccfd9f4b3c389ffeff39bbeb7f8c9b8e393c8a8b2e9bd801405000203e4b387b9ddf4d795d0a3d6eafff680b5e4a1a1a1cecf91fed2d7fcbbd0eebcc01403000201f1d3a7d5bbdddea780fbf7cdc3f6d09cd8f3d0e2b0c7f49cc48d97f3b49bbcc0192280cefaa49af2dd88b48786f3add2d69bd58df6bacfd9988980000f0201020202030c0209020112003004360305020402000203020310040b0401060306030f0601020202040e020902010603060358a727fc51902ab504b9c126c0f244f8d32391c60003e4dff2cc93b8d8dee398c5e3cbc82cfcb72af1c55895c10183afc31aa6d219a6cc33f9c04dabc00001fa99bda0e98f88d1bb94dd900a0a020209b188da9ce7adf6dfc9ccc4dce6e8aae693f80808020210ca95bdaab3cfc7a6a5efb0a3a598fc8d95f61506020201ceb7b1eee986dc8787c795bcc98b969b9cedc8110602025ef087fad0f6ed87ae92b9888df1cfcd9fc7d806, 0x101df959f4896c947bbc524838901b3d59a0002bc99d2b89282c2b68ff298bfa7f7b3fd97cbd3d0c1c9e3d0bbd01414020255f5f9a58386e5a8adfe8dc5f9adc3b3e6d2a8ca98cebddfd4fd90f0e597d0e5b01010020202e0fcc59bc4c9f0c58796f6fffd829f95fd93db96db93f0b5f0a7f5fdfe82ce80100a020203f9c68de895bccfd9a0fbd3f2eca7d9e9d894e0ceaf85d48683d28793f6c4d0140702021284ecb7d69cadfbb989d1d88fba81939df6c2c48acf9085d295d5e9b0e1e2cc801107020202c99b81cfadf1e8c6c89cc4dafbeb848eca8bf6a9ebb9afccc6eccbb99ea5d00707020202d0b6a3d1b9c294c4c4e3ecf7e5cca3e1b892c8e2cab7ffa28fcab99adce490e0060602020185948ce6a8e1eaa4cfe0c995cfabc3c1fba8a79f8ff7e7cdd4b2d3bfe3c2901405020205a1a78286b08cbaec99c0bc98ebd8a2d9eeebebae9ea9cc89acadadfab0fcf4a01401020210b692c5edffe594f7a8f6db91ddbc9d80eabeebdda5b6a9f9d7fbd7c2c192e0141401026e90d3ebd991c1aba088ab8a829dc69e84b686efe78ef1e7c6979bf8dbd5c1cfd0140f01027dfee3a5c39cf4eee9c7f3c6ab89a0d298b9c39cd2c999a9aeacd98891beefb80f0f01022cdd85b0a2d8c09fb0bab496fc96a5a4cdf08f84e78485b38cbde7a2d7fbb6a00807010203d0e2bbb7ded4f7bed3e8c2fec3abd0dff49b8883f9e4a3f3, 0x1bc9585e3f2f1dcb3ecb7f4a00a07010202b5d08d999bb3efddeaeab7e1ebcef3a1c983c00707010223cbf79fac81f18ffdffa7d9f3d9c2cbbaa88a9a980505010202acafeaaafefebeed828297ba80fab29dc3e0bcec0303010201beb5b9939be4ccbefded95ddae9b81a78bdbaabc1414000235dfc7d9acdfdef2b5ebe18dfce7e48885f2a4d980101000020f92e591fa8882e99de5dfc4d28df7e8c0ba94edc00f0f00026bd6b4adf2e5aacfcad0f1ffcf84c983a5daeb801007000220a1b6dd8380bfeb8eafaaefb8e8bef988a1c1af800f07000225ffc486d7b1e28ae1d2f6fbb0c4a5929183819180192186c4aeedf4bcdea0f6f0bc8b80000f0201020202030c0209020112003004360305040206000203040310040b0401060306030c020202020204010b02000202020414f6d424d0c472c6a538ff8e0111b6d3b8fffb88b4c59ae3cf98c285b0d7b992bbea84e88fefb6feec08dc8304a3e407b7ec02fd9d28c9c13ecc8225a6e90fa4aa002ab19fe3fd8cddeaa2daeefae68aae8e9ab7b0a2d7fee381a4a08fb007cc9c1bffed289cda13e4f72a85a118f49a2ca8b81b97af0010cec7829ed9c2fbdeb0a4938ab3fed6f8d19fb0879497fe849a9ba019b8ea31b0ce01958dc54aa7b01bb4fb1395c764a5c035dafb000985aae0e4f3c7ee87c0a387ceeec1a2add6c696949ef79bd3cbd0c061d2c661a8d41b9cd4, 0x10601011514141413100f0f07070a0507051403030302020a1414100f100c070706050505140303030814140f0f070705051403030306060f0201020202030c0209020112003004360301011002000202020405a18a04ecf101d393019fda339ac144ceec18eafd07b6d4002cc6a5f1ceeaf382c68adc83ad8c96c00b94d70c99c60aade909a8f61ca5e932f44e95a832a2b1000a99a99b99d99ad4c78bb8c2a3cabb8038c4861aefc443c5d60196f9dd51a3c739f39f2ab2b701b5c9a0004a82ac8cd89398e8fa9887d6d3aed8141402025c93c796edeeca8fb09083d4c6b1bfa3ddbca7e8c61010020207efbcfffba38bc0d38287fdbf93a4cdbea48993d60f0f020203cc97f9c78faaf2a9e883c8b4a3a3f9aaa39d85b4080802020181ecaa95a6dcfbb0a9d6b6feae82bffd9c80fa0f0702022188d3c6e1e693f287bba0d1deafc2e2b089d9f7fc0707020232af8b83c78cd0e5d0f6e8af838d95c2c2d2cfe9e2140402020698f0d9d6a7e4fad9a49fdb8fbb96b2b4d398cc0704020204c689b38faed3cd8ce1aef8c1a8bda4a58c8d8c1000020205a099a89cd8d6eca3f2e1a7e6b495a1a9a9e4f41414010247fce4839ec3f9cc95c5ecd6fba9f5a1c6f1fd9cf8131001024ddde791eefafcb285ef838d8692b5cf8cdfb0101001021483b68ea9de80a58493e1d0a5c6ef8f8c89c39ff80f0701022985e88ed8c9e4bea9, 0x11515151413130f060f03090202020a010e0000000a1515151413130f090f03090202020a010e0000000a1515151413130f090f03090202020a010e0000000a061302000202020415151514131310090f060f03090202020e0004000a15151514131310090f090f03090202020e0004000a15151514131310090f090f03090202020e0004000a06151515141313100b10090f0309020202080000000a151515141313100b10090f0309020202080000000a151515141313100b10090f0309020202080000000a0601011414101007070705140414030f030403100000000a141410100707140414030f0307030403100009141410100707070514030f0306060f02010202020312020d02000603060301151515141313100b15030e0302020901040000000a151515141313100b15030e0302020901040000000a151515141313100b15030e0302020901040000000a06130200020202041515151413130f0f100b0e0303030902020204000a1515151413130f0f100b0e0303030902020204000a1515151413130f0f100b0e0303030902020204000a061515151413130f0f100b0e0303030902020200000a1515151413130f0f100b0e0303030902020200000a1515151413130f0f100b0e0303030902020200000a] private def node1950:Certificate:=PackedParametricCertificateData.decode 9 data1950 private def data1971:List Nat:=[ 0x115151511130f130c100b110813020602090101010a15151511130f130c100b110813020602090101010a15151511130f130b100b110813020602090101010a061302000202020415151511130f130c100b110813020902060201010a15151511130f130c100b110813020902060201010a15151511130f130b100b110813020902060201010a0615151511130f130c100b110813020902060201010a15151511130f130c100b110813020902060201010a15151511130f130b100b110813020902060201010a0601011514131314111111110809080b051502080203020a1514131314111111110809080b051502080203020a1514131314111111110809080b051502080203020a060f0201020202030c0209020112003004360301120404020202031002000202020413131511141112081108090813061103080203020a13131411111112081108090813061103080203020a13131511120811080908130615021402080203020a060f0201020202030c020902011200300436030f0202060202030b020a020402010a0408030c0403020102030404010b0200020202040a020002020204] private def node1971:Certificate:=PackedParametricCertificateData.decode 9 data1971 private def node1972:Certificate:=.split node1950 node1971 private def node1973:Certificate:=.negative 1 [(1,0),(1,8)] node1972 private def node1974:Certificate:=.split node1899 node1973 private def node1975:Certificate:=.positive 1 [(1,1),(1,7)] node1974 private def node1976:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1975 private def node1977:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1976 private def node1978:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1977 private def node1979:Certificate:=.positive 1 [(3,0),(2,4)] node1978 private def data2010:List Nat:=[ 0x1150f0b0a13080a08080815060e040a00080000000a150f0b0a13080a08080815060e040a00080000000a150f0b0a13080a08080815060e040a00080000000a0612080e0c090601120414030c020902011200300436030506030200040304030a020802020401020406031312150f150e0b0a130812081204150310000a000a1312150f150e0b0a130812081204150310000a000a1312150f150e0b0a130812081204150310000a000a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030d02080203020302030e0402020206030d04090601020306030e0e0b090a0808080f040e0409040403130008000a0e0e0b090a0808080f040e0409040403130008000a0e0e0b090a0808080f040e0409040403130008000a06120e0e0c08060118041a030c020902011200300436030506030200040304030a02080202040102040603150e0e0e130a13090b09120411011200110009150e0e0e130a130912090b0912041101120009150e0e0e130a13090b09120412021101120009060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node2010:Certificate:=PackedParametricCertificateData.decode 11 data2010 private def data2056:List Nat:=[ 0x18dfe8daa86fbede8100e01026eaf82c8b989dadcfbd5cb8687d7d0bcbdd88ec00808010217a9afdd9fd5b1dcf6d5d8dfddb7a2ef848084ac150601020faedcecfdb1e2b8aaa0c7bcd7de8bede8b2d4941106010205eda1e5dbe4c195b6b4e6d9fafeaf88befa8de00f0401023de88eddadb1cfe8e8e1c0e5d594b6ebaeadc2f804040102048acdd6c59285aeb38097aac8fce4a8f3d3f7c80602010215c6aba6f1baaea2fda2a781cdb38fbe82fbfcf81001010204db98df86c7a6faf9e7afeeecf8c8cae8a7a8981313000206a28e8680f7b6cad7b2bcddead890eab8a3a0da100e00026eaaa5a585acf891b689f0acb2b8c693ebbfc8c00808000216f883adb78ffdc6d1a6b2c2a4be848b80b794c6150600020fe5facbb0ac8287bcbbe0d1a6fc9db2a880ecf41106000205abb8deb4d3f4ec868ec992e284dd9fdcc1b2c00f0400023dd9b1f686e88fa2fdaaa1b5a2e097bebdf7ad940404000204869c8eaca0e1a8ea97acd1e5ec81c7a8c28aea0602000215bcb4e6c8daa796b9d5c0c8de80c0fcade2afae1001000204f2a787a9a7dedf9d9b89adde9ce5a6c9c2e5fe0800000216fcfbd6f08eafc6a6f9f4c4eee4c893bce29e1e30e583cc9895f4b5aada94e0c00012100e06050c01120416030c020902011200300436030506030200040304030a020802020401020406030b060502020204100400020206030101, 0x1c89380100f000228b9c4e2dc96b9aeaac99c96fb8efbaf92ffc7aee782b6d591c5c00707000201d0af83fb9db6d7efb4e4b0d4efffbedee98a97fcd2aa9ef6c2c01403000235eff0a0d9b2efa1fcb0e6dea5e1fbf0f18997aca680d9cdd3e0100300021ad8cbc996eae7d7fecb9bb798948f9ed0b1da9cdfa2e79fce9ec01911dbdbaed1aeb8cab6a8af8b9f85ede389aeb5e00012040e06060c0106040a030c0209020112003004360305020402000203020310040b0401060306030f0601020202040e0209020106030603029323941fe107941583a63abdb738d8be1493ed002d9a98efafc9aea3bdded9d6e499e82bb2e656aeb10181fde03bc2831781ff2c9bba3fafaf1d99a60001e1b7bbe7c0f8fef5ddac9fdee413130202069b8886e3c1e28abe99bde7c8cfb58b9cedd8f4100e02026ea78debdebab3aca4a4d99aa3c287fef6c0e6a00808020216fcf5f197c5f1c283dbc5d2e6f2e2badef2f7c0150602020e97c6b498c882b2dce4dbebad84c0c0c696fbc41106020206c7ae8d92a9e29eccf2c09aeeebdbe390d88ef40f0402023cf8e1b5bae3cddc89d4b4b3e5afa7becf84efa00404020203e38ed593f1d88398b4a99c8a82bec6ea80f5a00602020215a3ec87e5ec90db9c95dfcfe8e7c0a0a8ddf6dc100102020498ace2b398f0a8b39df7aac083f7bbfacef89013130102069eeea5b1b6c0edc4b79e93, 0x10e93fbb6fd969e9d9ca4d2faa5c1b4be9788c7efe1baf2b4cdcbd01313020245c690e4bab8bffe80859bf4d1b8d696dd9bbbdbb0cefff8d0140f02020df096d8c6b8d5c3a6bf85c3a3cadadcd2ecbdded9c6faeb91d390100f02022b85dab4b7bfd5aa9fecb2fcd48d9ca7f5a899a8d4f39991979df0100e02020490ccf3abb2d1a7d4f0bcbbef88a3fea1f0ccf3d7f2e5918eb0080702020980cac0f4ecb0e9ddc5f6d9e1b6f2a9d5a890e9a0f380c6c00707020212a198abe98585aec78d9885a986c9ade781c3cbd3d3fcca9ad5b80f04020201fa98e19d8881c28e9dd2cfc5c4bdaeb2dafab1d2b3e5af8dd0100302021687a6d696a7c18787e7ba9fcb96e693f4d0a6efa581f99bc5c3f01414010209e6b8bcc4adcfa89587f4e088f9a8a98983a2c99196a4cdb7d28a140f0102119de584c0a184f99af2f0de8cd3a8cfc985df95d5e58e85a190c0100f010228fcd3f0a38b818cf38adfa69ce98fd1e7cfafb9d3829c8aaed0d0070701020aeeaee6dbbae0b3cbc689f3f4b9e194b9c988828da8ce83cae3f80f0401021189beabb6e98d9ba4a4a0f0d9b496e1baf88ac7a5a2a4d9d01003010218ed90ecf2bf8cdde7ecad9acf94c8defa918fdad6d7e2a9efc4e0141400020498c8b79cf6b5a7e4fc9dc7d690b18ce5cec98ff38fe3cdcfc398140f000212c7c5b1e8d786ae92e7d79bd1f696ecd988c3b9918ff98f, 0x194ccd8a8edef88c3e28d8081b3b4cd9e0f040102078cb3a2fc9db588bbbff4d1bf81afbde7e3fba485b00704010225e6cdfdfbeb90c9adf1a1aba89aece3f8defafcbf901403010206a089daa095cbe3b6a7938995a1e1be81e8ef82c7efbaf810030102019981ebeabae9e0c6ef83adadaef0fceaedf0c5dc8cefc4100f000209bbd3e3f1cad1cdd68381e8c4a8fdfe89d7d5a386dcb8900f07000207fbab848e8bf29ce9dbbbf38df880e2f891a396d2879de01403000205a3e8faec9dd98395a98af681e1ea8fe8b1dcb18986d1901003000203e997d7d1d4d68dc2b9efcebddccbe3cddbb6b0b6938e900703000246ce82c8d7bbc4cb8ed7fafeb284e798b985d5c6b89dd01903b9cfeac3939ca5b1ccb382c2edaab6b000120204060202030c0209020112003004360305040206000203040310040b0401060306030c020202020204010b0200020202043eaefd5595c93da6c301d0eb8c011691cef489b1ab96aeb2e5d39eeb87e285c0b2e9ac02888e01849734d94ee519cbdf3e85a835eac111b0fa001abd98a2e582d0c5db9383ebdbbca0d8cdefc498b9e006c0e608e1fe14aa81058bb831a3831fa9ba419fb42fa5e90004d190b1d7a9e5b5bea89abda49bf4bfe3d2ffc6eae044b6d65c83b243e79201e4b0e146d1d54bc0c53787af01c999cc0013e9aba5c5f1eaa0dacca3d090d9d7eefcb7dae88814140202, 0x18d85b283841903e9ff91d8f788c0d1c3d9f2d68db9f1a3f594d2a59800010c020902011200300436030101100200020202041dc9f106eab40391c319f1820104a293ede99390edd8d0f58bcd99f992a6f08402ddae02e79502f1ee02e6c721ba954493be2dae890ad4e20003bff684f4e6df83e98092dbf4d5c4b289c68066d1f657b9a401a7d401bfb2b75bb7ad4ac78312cca301b8cad600128ebcb3d29eafba8af889eef0ccef9cd5a0100f02020682bcf3aaf2b4c9fadfc5c58fefa5f08ed48deeb4c1e6c8100e02021ba9c88dbbb3d999e6c2919cf7c897e7a5b8aedbd5d814070202058781c5bb84acb2c5fef5949be2e6c0f0d3beb2d5a48db8070702020c8ad3f6d2d1bf8c98f6ddc8e9e298a7dac095eaf0b587e00805020248d1b2aaeeb7e6f4f4aceee1f88aa8d6ee9cdcdddc880704020201a2f4c5d8a5f1b683af88c09880b9c1dfaed392d0c4881403020206b6ebfabe9bd09f94b0e1e6faa4a3c0a8e6d796cbead8981003020204dcc680bc9e9880dcc9a4eefae0ff80a3b08d8bb3d7f1d00703020202ff83a3baf5ece993ed80d4a587d7a18bfdb7e0ececb4c8080002020dc6d4f7d6eea8949acd8593bc86869cbcd1d6bffdd8100f010209f2f8f9a38f88c7adc1c2cdbcd3af8dcfdd97999ec8b2c20f070102058bf6aae5e2ccfcc8caaae4eea5d79fd5b2d0f69388b2880707010206cfa1cd90eac287, 0x1020231d8f4c4b58eb9f8fae4988bf9f6a7d99ee5db93d5f0dcf893d4a0140302023ed89dc2cb99e6c7dbe9c6f292b3deb4f099b79399e0d1de96bcc1a003030202069de7e79b9ff48ef7dbe9d9a3f6cae9a5d4e78afee5e1e0939d98fac8000002020f84fbffc7eb93fb9bd582cb9bc5b1b8d390deaffaaeecc9ced0e0100f010206a8dcccf5e9bcd587bc8ff6d8ddecc6deecd8d0eb81f884f4e6a9c0cc0707010202b1aba4c2f981a9cff0cf948682abf9f2c68b94ddcda8f79599e8c4c8090501021bcda8b0d6b8f7899cf0b4c690d8c3b3a1e3f4a08cc2aaf1af8fe40705010208a8bbae88f0a5f09db28af7dd81fbeec280e9a5c4b3bac9fcd6d0c4840f0401020fdda0c6a6c8fa89a5ebaa8bb6e2f9c4f9db9d8c83acc5998efbe01403010214a2abefebf6b6e49fe392d0d8979486a8e9c4f9cdddeafbb7e0dccc980303010201bbe0e1f591a5abc5adfc82c6c6c5f0a5ea82a499c5aa8fc5dfeae1d8100f00020ad9dcf0e1f8c4e4c2fed1838f89f7988082ff89a782f1c98384fcf1f80f05000210a48bbddab9dee3d087b6beec96f0af878cf08ce0b89aaee4dfb1e2a8050500020396e4ae80cfd59ad6e3e4f8addbe1ccc9f0ba979aebaee7d78082fa94100300020b99fbf7f2f2d7bebab0bcdbb28694cee2bafac3eee9ac9bf593bff0d8030300020ba1e38aeeb89ff3a5ecb6a7e4e58ed3a1ddbfbcb3c6b59f, 0x10a1313150f150e0e0e0909130815030901010102000a060f0201020202041313150f150e13080606150303030a00090002000a1313150f150e13080606150303030a00090002000a1313150f150e13080606150303030a00090002000a060f020102020204011313150f150e13081503030302020101090000000a1313150f150e13081503030302020101090000000a1313150f150e13081503030302020101090000000a0668e4f51197b93c9af501b697a6015aa3d491a091fec197f49bdc91bcadb0eedf9e9091b98805bde40afbbb2b860593ba1ec2974ff9d420928f11a5ab0001bfcfb68b9afbf8d2e1ba82e7e6e0a5b7d5dfd0f8eb87b608ed851b89b616991286df03d8d20597a839d7b842c7b10001b29be8c897ba98f1dbc7ccaffbe0fdc7968bbce2eb9ae0018ab8ba02caf82e95da01bb96e767acbf16eebf20b6a3019ed1a400348b97e7e283b089fc89e3d2c2b9cc909990bcb0c69cf0141402020fd0d6ff91f5f3cdc4f080d586fd84a8e289a9c59393f7e7b28b84b2d8110f020225e9bdd8daa28cbab48aafc6b587bfb2d098de8ec6a4b895baf0100f020211ffa0f48be8a3e6ea9be189d783d38f9fd9e4f9cad0cffcebf595b3a807070202149f9ee8acd4e484c7d1c8d7e3a88cefa0fc98af84a481fc87baa3faca070402024c86d584b8908bef90c3e1d8eb8f8ed9efa6eed8cd91d9fa869ac80504, 0x115151313110f0f040e040f030902020209010e000a15151313110f0f040e040f030902020209010e000a15151313110f0f040e040f030902020209010e000a060f020102020204151515141313110f0f040f030b03090202020e000a151515141313110f0f040f030b03090202020e000a151515141313110f0f040f030b03090202020e000a060f02010202020401151515141313110f0f040f0302010a00090004000a151515141313110f0f040f0302010a00090004000a151515141313110f0f040f0302010a00090004000a061414110f100f14070707070514040f030a0300000a1414110f100f070705050f030a030703081414100f0707070505050f0306060112020d020006030603011313150f150e0e0e0909130815030901010102000a1313150f150e0e0e090913081503090101010200] private def node2056:Certificate:=PackedParametricCertificateData.decode 9 data2056 private def data2077:List Nat:=[ 0x1120f110f110e120a1108110312020602090101010a120f110f110e120a1108110312020602090101010a120f110f110e120a1108110312020602090101010a0610040f0807060012041404120f110f110e120a1108110312020602010109000a120f110f110e120a1108110312020602010109000a120f110f110e120a1108110312020602010109000a060f02010202020401120f110f110e09091208110811030302010109000a120f110f110e09091208110811030302010109000a120f110f110e09091208110811030302010109000a06110e100e100b12081108090809051103080203020a110e100e100b12081108090809051103080203020a110e100e100b12081108090809051103080203020a06010c02090201120030043603011204040202020310020002020204110e100e100b12081108090809070606110308020a110e100e100b12081108090809070606110308020a110e100e100b12081108090809070606110308020a06120204060202030c020902011200300436030f0202060202030b020a020402010a0408030c0403020102030404010b0200020202040a020002020204] private def node2077:Certificate:=PackedParametricCertificateData.decode 9 data2077 private def node2078:Certificate:=.split node2056 node2077 private def node2079:Certificate:=.negative 1 [(1,0),(1,8)] node2078 private def node2080:Certificate:=.split node2010 node2079 private def node2081:Certificate:=.positive 1 [(1,1),(1,7)] node2080 private def node2082:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node2081 private def node2083:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node2082 private def node2084:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node2083 private def data2126:List Nat:=[ 0x1090201120030043603070205080008030603010f060102020204080206020404030403151513130e0e0f080a0808080e06040403030a020a151513130e0e0f080a0808080e06040403030a020a151513130e0e0f080a0808080e06040403030a020a0612060b02050601060408030c020902011200300436030506030200040304030a0208020204010204060313130e0e0f08080813040b0408040e0303030a020a13130e0e0f08080813040b0408040e0303030a020a13130e0e0f08080813040b0408040e0303030a020a060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030110040002020603010e0402020206030d04090601020306030e0e120a0b090f080a08080815040904040313000a0e0e120a0b090f080a08080815040904040313000a0e0e120a0b090f080a08080815040904040313000a0612060b080806010c040e030c020902011200300436030506030200040304030a020802020401020406030e0e120a11090b090f0813040b040e031202090e0e120a11090b090f0813040b040e031202090e0e120a11090b090f0813040b040e03120209060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030f04060c02120316030e0402020206030d040906010203060301, 0x1151413130c0b0c090a080e040a021300080003000a151413130c0b0c090a080e040a021300080003000a151413130c0b0c090a080e040a021300080003000a060b08090601060308030c020a02030c000c04100313040502020603040313130e0e0f080a0815040e0404040e0303030a000a13130e0e0f080a0815040e0404040e0303030a000a13130e0e0f080a0815040e0404040e0303030a000a060b08090601060308030c02] private def node2126:Certificate:=PackedParametricCertificateData.decode 11 data2126 private def data2184:List Nat:=[ 0x1f8eb8bddc3988fbc8d9fd5e3a395a7acb797a4fdecfdd7ebabe8cce0d0deef969491b0f095f9c7d3a9fbc00a03010224cead83a9cfc4daa3cefaddade9839dd4e8e0eaedf0b381a4e4c0cfb1cd9fb0e5b2f3a8c1e599fedc9eead187bfc00303010212a4b28c96be97989fd983f6b6feddc3c5dbe8a780c689c1daabbc9c9899a89ebdcc87ebb68dfc9c8ae7ccafbbb6bff5a01414000206ab90a38ab3b4b6c1d5d4efdda9bb9c9fb48aa6dc87a1a8c8bcefb8c4b0cdb4f0f4e0a8f3ada9d98aa9b59396f8f7c4e00f0f000204cc85dcb2a2f9ec95de8bc79cc7d6db81cfcabc8cd1bbc5e494ea8083d2dfaff4e7d0a09be5fcfdde8fe7e0d8f3e3f1c00f07000211a2e1c3acebe5d99de9fbec919c8ef5eae6f6cebc89fdd49ed4abb5c68acdffb6eeb0f7dfdacaa5fdbdfbbeb8ddd4e7801959a3b8b687b8dda1c6d5f3f9b9b5f7e59e8d9dc4c2a18ab3c5d2f5fda687ed87e9bda3b983dae3acfdc0001202060402020302030c02090201120030043603050204020002030203010f060102020204010e0a0a0a0f08080815060e060b060a04040413000a0e0a0a0a0f08080815060e060b060a04040413000a0e0a0a0a0f08080815060e060b060a04040413000a0612060b02050601060408030c020902011200300436030506030200040304030a020802020401020406030f040a020502030204100400020206030101, 0x1f7ebd98594ff85f5fba7abbee8e69e9180f79bf08abaff868f91fefcfff0110f020204ffa3b4a2c59498c9d5a98495fbea80f9b197b793c19584a08198849fcef6abcaecf582e88ec0e1d0f1bbb2bce090900a0a020202aaefb4ebb796f1f6d4c1ed8ef7a889a685e681a785ebb5aaa6caf5ef8dcaab97e9d2c1ebc3fffe8abfdabeb2edabe80707020223dd8be1db89ee9d8fc1e4c484daf6dfeae599bc9d8a91f59dcbd992abe0a4a2ba90e2b1f4edc5d7b6a3f8d0c2d29ea4b80606020233d09aaab4f8d5ada29b86c0bf97b2d5c9d5ecbd99cc83d999ecdd9bebb0a6f5c9a2feb0fe92ffbc889da4b990cbea0503020211b9f9a7fc8d9ae6beebfbabc9f9a5b4b8dca2c2b7d882eecc82d2c9a6fbb6a286eebf93f681f8c0acbbc2dd9494eef2ce0303020205c2ade7dac6dba0d3f4dfcbc8e889a790e3d18da18efa8892b7d58193f3a9e6989baeaeb1d1f4f49ac9ddc2b1f9f8bdec050202020aaeeaf9d6cfba9caaead5b294d3cca3d18280b8f185edbdb589c6fe959be495b1a9aabbceddaee08ce5f4a0febbffac0f0f010202f8bcfbaca4fc8cb0f5e7bc9c95d4d291e2d3f5a5ee93e7c7d98aee9faf9ffac2ecdde7c2b5cdbbace5ab9badd5beceec0f07010238a1a3879c91e4aed0b2ed99b0cdcad4ac93ead1d69ab5a28fbcc3df92f7c9c2a1ebcefccda4ffbbbe9e89feefb996f3b014030102248ff4f98083, 0x1b0aa90a3d5dcd5c1909581a6edb094abddfba789f1a07eff0181970192a46df609e4973cf3a43cf3bb09e4b00001fb98d2a8dd8f90d7cb8896e7abc483cfddb1eff28ab7aa99dcbe8bb0e995c3baa5ec90aadaf1bbd0efdab4f810abce5ba3a755ab8c0ab0d529c98f4a91960acb8115fd83002298c5e9ccc894c184e9f3bdebc6efbb8594cca4ed97dae2a191a3eeba80cbf4ecd9dec9d1e2cddaf0d89cd006d88d50c488568bc10ca2f21e8d9f06e7bb4ef39029feb30018a392b1dceea5cfafc199f0b09be6c49ff3b2f0d287e38f91f7afe2c3a59cc4a2aea2d8ac98f6b7cfd2de9045eafb02a2d508f6d63f96f60da7e50a9df52ab0179bac0001a3d9ccedc19df8e2a0b5c8f4d8bde0cdb9e9acb2ef8cebdde8dbcee697c59080e7ded299bcecb2ef94f1a0018fac8258ce1681cd7a84836ce59f16ba9504a7910187c6c80001bae4c8cdf5cdbaadda89ba92a2ba9be3faddf9a3c6e3d488b5a5d186ffc2c1a6e093f6a4ceffb8c9c3dec012b7cf6a88fe67ff9801bfd7c70ccaff47808d45c5c5019990d4005fb6e8e4d987b6bf82e8ebd5b2de98c5ebaff7cdc1a4c992b18ff2a7c9ffb0bbe7c8b680caebafc3d6f3901414020236b0c6e0b6d5ffc28fd7a68988a884dbf3c38bdcf5c2bbf780fead9eb2cea799cf9bbdc2a5e7acf2849fb0b7d5edc8dce01010020207b6e0bff5e1cff0ec8880ea8780fabeb699ef, 0x1e4f5cfc4bc9a8ea2cd99e80f0501020fd6bbb0f2f8cb8ab7bce9b69afb97e8f7edf781a8b18ec2fcbfb6eb83dbf09f88a1ae97e9a682c3e7de9296fe0805010217b1d78090aeeae8ffb8d9c8b1c7e3b7e79de1d483c784c6febaddf6e5a1b5fa8c96f196acb687a0eeedc00703010211c7c4f2de93a2f181fdd5b4979cccc5cdf0d0e7de93be8192a9bbe8a3fd85c9a0cda3c1cda2ffb4b1a1b1e8840503010274f8b0a7bfdac0f888ca86e991e3a9fae8d6a5b694d2efb2fbd7df99dca79dbac6cbe9d0abe8b984cf85a898f80707000214cb9e88b5f683c5a1b4ccfab6e89cb3989fd4d88af8b8a4a9bd98df85c496e0d7e5ad8ceec0f8da8bbaefcae80703000202e886f4a9f9c0d9e8a796ccc09cc7b2828b87df9be09183de8df6d0f8fc96b6c8f0a59b96dca89df6e7c5d7d8050300020188b4a2fa98f7f492dec4c0ace68882caecb3dddc95b8dbaad5a9e79c99a1a4becd9ce4f1d7a6c591e4cc8ac0f41921a1c18de4d994ecd19e87a099bec5a5dca2dcdd89e5c5e8cdfee59effc7e4ecd89ad0b8faa4000b0206060202030c020a02030c000c041003130405020206030403109785569de054efd50ee8fc0123cde082f3e7da8aeee3abc68df1dc9fdf8b88da91a6e2bcb5f689bbf389e58ee9eaace5b78be1ed91f6868878f6e208db900e99ef73b881010581c6e2f99294b6c282aa88da90d7fe9dcab0b7edef, 0x18ce1b7a495e6eee7c5ffeaf5dca5e584e4a189ccac90879ca6a7ae8aa691ffc2cda1f2f5bdbfe40c0c02020182cbd2d28193fa9587a9a89ca7dc8a8e8bb2c2a1b4d2d1cb83e5a0879c8ebae395ebf2dbf3e8839fb5fedc0f07020203f3ce84b6be8f97879aa4de94e5c6b8a5f9f185e8d8e487f9ddecd89cdeedab8dca928bb6c9fd80a2abdc8ff40f05020216ae9d888ab98d9bb8a9cdd7ab87e586ae81ca8b93edc6c3bdd6f3b0b8ccfaf082cdd0febaf1ea9ee08193e4ce0805020206f883bba9b3edfe80aae5fee9caf5d19bafb9839ce594c1a3a8fdd9ca85bcfbef97b5a8acb9d290aa88f4f81404020203bef9c4f2ca8baa959fc8dd87e0feeff2a1aa8bcecae2b1cbec90fa8585c98ee9d8c990f8bae08d98ddee8c0703020209809f898785b8d8a5d694abb5e5abede798cef8d2a2e29c86b2cf9a91a9bcbaceb190c4d8e0affddba6be95ea050302026fc4c2b5e0d789e1b991a5b6dfbde5ec84d2fcb4eeafb99cf4aeecd2b1cce6d5bec0b885df9e99a9b097ff96d6030002020480dfd5e1a48b95a7d093a7e6a3bce4a8fbbdd485879ace889c97f8b0cdb1c5809b9cdfac9a88b6b0f8a5ba14140102098298c7f096c4ec89cef28bd5f8a1e6e4c5cad8d590e591b3c9b8f5da9d85b5a1d8d491f294e7a880d0db9184140e010207aa99b6e4afd99888cfc6c9c3f49bb2d2eedee9b6938ee5978abbadf58bd6b2, 0x1ff829f8087e09093dfa0a8fcec9d8ad5b7f8aac2e9f4c2e1aaf2bdc5ed81e5e0000b0206060202030c020a02050c03040313040402020203030401060202041002000202020423c88b51c8c253c8bd25c8880107b7d297b393cfabeea2c3f5cc85d9b3cfcbaae29082e4e79eb497e79792d6baad84a284db97c2801eaaf25ae7d04bdd8401c4efc5010192d38fd483abddc0baf894fb81e0ae8e96fee59abee6c7d6daaed2a3ad918884cff183a780e8b801eb9125d00389f201c4bb11dda539db983d98b9159ac80032f0cfabaff880c6ddd4faaa93a8b285c7959594b3a2b8ead4e288c4c1e0fde9e0d3ecb193d3c7d80de8ee1ee6b119a7ee08a6cf2fdf893ab48c21affa2c84fb000daac6ceddd8edfc92879cde99e8c7848ce0a0c685b3c697b4b2efa4b2eab9a7de9beba59083d49a2c97a371d09a6fc3ab2a8ba008f9c42be9b348a4a825b4b700048db5efb1e9f0de9cafe7c6e1948b8080d1cb95f3dba4feb2939afaa0d1e08ffca6cd9388d6fddc1dbcea59d7f430ddca01a7f48108b98e2db19b2dd88552d0940001889f98e0f2bdf999dfbbaec987e2baa9f192ecbe9ab584dcfa96e898f79a9de6afc1e2d9d1fbfa018fcaba0f9e8227f4cb76ebf36b9ebd1cfcd709f8f07ea2a6000bb9ce9edfd1deb18f9db58191c8ccfc96ffdbc1d8f99ac3fdb5e9d88fdba7d2c0dcbac9f7a180141402020aff86edbcf6, 0x1d1b9d7a6c0819ca8aa93ebd2cbb295b0c2bbb9b6c8a9c0d6bb82ceb1ec8efda080070202021ad1bbbbc9d5bc94feb9a9ce91dedffac6d3d5e6a888acbfafe2e4aef8c28efac3d4b29ed0b38b9eabebe81414010226dae2e3a7ebaed18d8cb2cdd9a9e486ab80e89ae2c186d496f0ed8f96cbafbebbede8c1948ef0c9b7f9ce140e010208b7e9fb9492e3c9ebb0c8ce89ebb0d4b187cda3b9c9cec9beab959aedf7b6f5e8b699f7d3ccc3ebc6980f070102098b86af9c87a9cfa5d594f4b7d0f198eef6eb8bbfd5cfcd83aaf3b1ac82a699bff89eaaf3d89ce5e7befdd80707010207d0d6c9f08d88fafec0d6fd85c5a2f5a9a3a88acb8acae89895f9f7f6f399cadf8592c4d4e5d5c4eb8ae4fc0303010209e6e084b4f4f7eef289cad2efa4c7effea18dd48bc5b38ca5f29eb2d6fa84ef90a2a4eebd85aea9a9aec807000102068ef182c3b892c894afcee5e89e91c88ffbfcf9aaf6e5b7b58baedfcf95e98da5f5ff9fa7f7dedef5b8881407000220fdcba4e7d1f5e7aa8fdabb818782ec8ab0aea69087a0dca9cfc9ded8c693bdcccbc2c5fc909fa9a6b9caa0070700026cecf4eab2f8dffafad385a69fea84a4cadae79cf992d1c1b88e88ab97ab95a897cfedd0e9b8f4cd9cb680d0050500020aa493a9d0b9e1e78fa7f8a6d690f7adffe894af81c4a6e2a3e6b7a6c1c7b1aaef8d97e89e95d3f3ccc680192fc1c386ca, 0x10009fb81b6e997fd8e87b0b2d8ffb6bfd18889fbed9b93adb8ddc4949eefadafb284f5cdfcdbfeb009d5ba11b8950190aaa901988fd211c2951c9cd060e4cc6bbf850052c8bc9df6efeb80dba8dbd2a8a4a5de86aec2de809ce8b995e78f9d89b2a59d93dd8ac599a005b7aa13a1db2fb3dd3ce0ea40e6f825bce606f0da6d94b7000e9091abd0daa3e885e1f7c3fcc8c697dddfb8bfc59ef08bd3a4b6b5d9c4e78189e8f5e9b8d0141302025bfdbdba85b6849ba0a18ae18f88f09de1bb91e281b9f7a4adc18b82b4f5fb88cee9b4acd687ccd6d9f00f0f02020beeff90e2e2fef3a889d5d0b98ad7c6eed7f69681afb786e2bdc5e290e6e6f8bc8487b088e89b8efdc2c00a0a020201ba85de96e1effde9d587e69b828eff97a6b9aec6c0fa90f9eca4daa4afc0efd9b996a3f09385c086969c1408020201b3e6b4eabad0bff8d9d0b78b89a8c8fdb9929afb919fd9f78fee8bc4d2aefbae8ce9e58a9e90b0b3fda00f070202058bd5a68f9c8fb5aaaed68dc7d6c68ae7c3fed892e4a5c5b2a897dcd2ef9ab188b29796d9f2ede2d18fb5c0070702027780eb8cf187efcf89ed8a96fd9990a4cae3d6e6b1f0efb5a0a1c296bad3e4c3b3dcc287a3e7e89dc2a58f9c0e0502020489babee986a9ecdaadd59bcfc4cea092b4b2c9c1c8d3a7929cd0e2cb9794c4f19c8eec928ed8cd98c4c01403020213fefda3efafb7bab1f0, 0x1e2f7aeabf9d0030301021a88fb9d80a5f9df82f287a58aaff5c4f6f8b6e7ecbfaec7e00707000237d6c9b0dbe4b39187bea9f5c8cd83acbc8c9ddadefaf6aea00f0500020da5d5ac97a58eadf58688bdec978dbcd2a2fd8aeaf3a3eda0140300024b98a79ee4a6f093c39a90f4f4b7bac9a696e1cc9383cfe9a007030002018a82dda8cbae808082caa18bc7f2f6e6d99dd2cac6c5cca8c003030002358a9faf81eea9a696dcb3f9f6d8dca0d5c5be94da98f8dbe01926f6f0c7b4adcfab85fbd993b68fd7a3c1f000120204060202030c02090201120030043603050402060002030403030401060202030c020202020204010c0608060204000a040e041a80e934b69611abe90989c10152b887b5b4ea81d8c4ebe6d2e2d6d8bb89fa8cecc987f2e0f7b1c39dd795b9dbccabfdd68bbaf80ecaa51fbdfa7584c80185f89b0108bbf5fce0a6a7c6c882a4a9b8f3a998a2b3b7d8aa97f3fb8af9d7b8b7b6daf3fde887e98dc3bc04cde307eb9e07e3a00b82b312c2e92a8c9e4598fd2dcfca0038f0b8d59ae5d7bef9dbd0eb8084a7e2a2c397e6b1a3a4fde3cc80eebffb85d6e6f3e5c9e5c19009ee8a13e98d1bf3d411f3af26bd8540c1e212d8982cdcf3001988b48fde92fbc8ecbc8aad8ea385d4d9ceb7cf84fd868e9a90dfd8cda29efff0a794f0eaaaf04999d60194cee920f4ec2abf8621a0e746b88e12d5b512c1ef, 0x1a06af4a32dd3d628b88d03f2985e9fbc39d9c5000a8886e7bdedcdadb9a1cfd28dd5cda2fe80f8a801a09ea71faaa60b8d8c75e3a860a3ba469d06bbc66698e10002f28fcbdbb9db86b5b7f3fc8cc2ccbf85b2e1900f0f02022cddaf81d2c691d981c7a5b3b7e49e8795bda7e2cdd3edacb21407020242cdfcc089fed0bcf8e1c3a19dbbf9aaaad3eb9bf8eea4d2dc0707020201a0b3dedeecd9c1cdf6988993f1d8a1ac96d4f0e6bdc3dcfade070402020eaa99fdabc6a5dd8fabe5f3ece69cf1d2fcf5cbedd7bdec1403020273d2f8d0faf4edf682bdcd8380a2d1cbe3f7c7cea581c9feb80703020248cdb5acadaafabccefc90a0f8bb86c3b692e4fab98092fcc40303020209fed18f84dfa1aaac8cc599b1d0bfd6b9e2c8b1b2c9d8b7e80f00020201c1c6c7f4e3aedefaf2d4b490ecc9b9eed0c4ef9c8ccccc050002020585b6f799dbfcfe959ff6ddc7d3efa09eb7e9a090f1a5b0000002020198f1c8a6fee9f0e5bcbff797ee94c1e7bdf5b2d2c290cc0f0f01021cb8dfbcf5eeaf88a3a0ece3da80b5cfc8d6a2ade0de81f1b40e07010202f5b799b3e4d7e0cbc089928eb19ca3acf0b4b39dc3c1b807070102018589d3fa8ef0aae984a8c7b5de878cfbd5e38acb8adb9ec59a140301026eeb96ccaf92a3818fc4c8d4c9cff99081c187e9d3e495b9d0070301020187e3deabc69f848cb49ca4fd8da8d4c9c9add9, 0x1f0c1d48acfc7f8a7fb8cdb90bee2e5e1b880f5e80f0f0102449fece881e5e384978fa5cbe5dce6a5d5c7e4dbf1d7d8e2d7a00e07010210add3d787b7dea28f8d8fd591d7c6d59796a4fda9adb2beb80707010212a7ad93d5f5dbeb8480aec784c1cc86e8dbaad0adc1b2f8bfc8b20e0501020bb383aeb2beace0cd979ffc92ded2e49499a385a590b5f1e01403010207be99d7e0f7a2b6ababfaa9e6b5cbf9c5c8c0a7b2b299f29dd9a0070301020688efb8edb88fa8f4c0a0b79493c0fda195b98fbce78eb5978cf80303010205f6c1a5bab0e8c8a4f28dea888a85a79bfed5e9e1e08fc8a58f980f0f000201a39fff9cb29f8efd8cf8faca9ccf88dcf6c1b9f3d6d4ebdbd80707000214cc88d989daa18289f190fdfbb2febfb79a95ecb5c982c0949be01403000206cecfdcc5dbeb97a7aab7faaaa4c3ace9cdf4b5b0cc98d2eaf1e0070300020693e085f4f283c293d7fb81e5b2b4d0f6dda3cf90bbe79b8885800303000206c3cbffcb80c38086c3f49a9aa2a6efafc989c1a7f7dcbced9ba01902b6cabcecf2a399acab9089e0e188d6fcb7f0a800010c0209020112003004360301011002000202020479d0f8059acf08f6967dacbd0104da8e8594f78aa790ec9bfec5cf9dd5b0e1c8d401aefe01e5cb05ca9c0592c112c6f33fd5a83aefb70de1840024f3bac5e9b098f580d8edc8bee8d79aeda2bdd609bacc33e8, 0x10e0303030902020200000a060f0201020202040113130f0f0e0e0a0a08080e0302020a00090004000a13130f0f0e0e0a0a08080e0302020a00090004000a13130f0f0e0e0a0a08080e0302020a00090004000a063cabe404b5b40884f648e68d0101e686bfd0f9efa5a1c89091d2cae7b9d1ddccc8c2bc01e4cf09ca8047d808ab9527d9cb37a7a21c95f42be3c90066f8d7b7e5ebf3d9a5aed0dba483f796d9e9a2f09005f9c53abee621b99455fbc53e96e73cd5a507d7950182c3a40003c5d9d3e399badfefb3a8aad0b1c781cbb0ad91f001a0dfc01381d909bdf901849bad5df2f90499a506cfc968dbea001ecdf39c8fe5fa96cff9bfd3afa7e0e1c5afd8eae01414020201d8908bdbe8cdf8c49e84ae9cd1bf9ad8e7c8da9ef3b3e0afe2801407020206f987dac1e1decce8b8fed2ab99a6a19b98d39ab1facc8cd9b7e00707020216b0e7c7d49b91959cfdf7a496e0a4b4e6e98f83d3f4aebe93c6d8070402021e9aedb9bfe9ccb2aaad88b9e795e2dbabedace885da83c6b00504020212f6adadb2e8cc82bdacd9b7cb85de94bbb4b6e8f9d8fbceb01403020204908e89eaa2ba89d8f7a49d91b89feb9eb9c5bd8d9082d7ddadb0070302020496d286f3b388a5f9b7aae1aac1eedacee7979587fc9adfedf9800303020206f095f4a48debc39ea7ddd79e8bfae48d8febcd90b983f58da0e00000020209c3e4de82, 0x1ff89b5c8be8ab6aba1d78b918b8ba99d8081d78283f2ae0c0701025b8aafa59993c2e185adccecfee3d9f98bebb090e3dc81ba8b9eebd7e9e99ad7b3dfa1de9b8eb9d9b00707010202f2caf7c0c3b4bbb9929e86ecede7aed2d5ccb0a2f3d4c0a88f93dec2c6edc0fcfebbe7d3ebcba8daf2f5a80303010202f18ca1b8eeb39ec2dfdfef86a29cd498af80d79ad2acab8febaade9ce7e5c8bf9a87c6948195ebe3f4c81401010257dfc9bfe0f1bb9fbcb4809cf0edd2bcb1c0dfb7facdd9a58bea9e9acb87dfc3a7f0d5eda1d59deca00707000206f7e6dd99fbdad39fa686d9ecaeacc492fbc8ffc2a5ece5aca493e5f49bab8eae9280abe598ebd2a8b9a00505000259fdcabcdcebdab88eb9bc8ec9f7a9ecb8fe888cd7c6edaca7e5d5ee85feb7fce4c9b4c497e7c4b5cea003030002078df281c5dcd8c4b2dce69195a7ace4d1d4c9c8b4abeba2facac6bfba9ea9da97d4ce8ce195a2aa8bc019048194a48fcfef9cf2f6f7e491c6f9b3a0c0d9dbedc8d3ecf1c8aff4c6d1c8a5a1c3a3f79000010101151513130f0f0e0e08080e0303030202090100000a151513130f0f0e0e08080e0303030202090100000a151513130f0f0e0e08080e0303030202090100000a060f020102020204151513130f0f0e0e08080e0303030902020200000a151513130f0f0e0e08080e0303030902020200000a151513130f0f0e0e0808, 0x1ae8090ffc7d8b9c0d5d28bdea3b292bed38e9de7f7c01414020208eab9bcce9ad3c6c0bcf2effb9bd6fde1d4d6caa7c9ddd7a2c7e0be82ccca88959d97fab296ecc28ad3b01411020210e1aad6a0f58c8db2d8a8c489cb8fa897a1b695cbb59a91ffaaf3b4f6e3e8d7e1b8f18bc9f4bdfcccc0101002020698c2b1c6f181b4e0f498b5e2a7b49c96e1c0d1a3bbe8908cf880d8b1c2cc8ec5d7f0a6c0c08aab9cc3900a07020232bfe1b0f8cdad86f49dabb5ed8ae987e09f96c4d2c3adbd84bbbab1ebf49dc79fd6bde5af9189bda7c00707020242b7afe4dfd49da6cca0f5cf8dd2cb9a80e2e0af8a93cec4b39aa3e9b3bd89a9cce7d7fafdb1efc3dcbdc00a0502021bd7cfb88adcaccaf488febc9aaaf4e9e6a894cdcadec5ddb1d9fea3adbcf8afc6a9a8fadfc6bdc8ec80070302020db4e09bb0a8beddcfec93bec1abe7a6a68ca9c983e189a7ad91c3a3b1addbb1bf91928ee1ace0f186c8a00503020203e288a498e6cb9cbdd6cdcb80a2c7e7d5dbf3a097ebb687f2c1ec96d6aaa3ddb6f5a9ac9b94f584e5f1f0000002020fd4e8d88dd2b3f0c8c1f8dba9f6bab0bdd2b4dfa6f1e292c2fd89dfe2fb95bde4f8ccdb96f0becbd9a01414010221f9c5bad3f3999893b0bbf3fcbdb3c3e3ac9283b69291d4aca58d8fa8c692eff09884e081b98dc2d2b9fc0f0f010202facb8adafcafa9d8f4c5f089b7e7f0eee1a7e9, 0x1fed4f4adc1d6e9e5c8a2bef4bfa7b093a80e00000271f0b5aed585f1c98381a692d0a5eec7b081b9e2deabbbdad19592afc0900000000203baa59cafc6c9e7f587d2f5ec9096e6aa88f1d8edebfb988c809aa3c789c41e49dbaa8c899bc3c9a4edf5c3d3b899a4e59ef1f5c3b9c3880039caae6995bf16f5d546c0e80101b0f9b2af9af29eb0fcceaeacd7d89bb086d8fad8ade7d8c5ff91828ccf82a0eac08af4e2dd8c02cb930bd0c23bee9d32e8f00103a9d8c4dfededa29d89dd819feb86c691aeb6dbd5cbc095f3dbb1d1f4f2dda8b0b9a1f1828ac831f9018fde01d4ab76c813b4bd2bbeb640c1c328b7cc0005aee4d3838cdbebc1a785c987abe587e1f796f8eed4aff98c89bdcebbdebc86f4d2e3dbc496e004b7c703e4b620abf21fd6ff1ee4db36c5fc0ad68622b7a500028d9cfe8586869fdac996cde5e8cfe5bc9bb2a89193def0f9b6fd84e6e4e6c8aa9cedcbe589f04490c778b08045befe79e1892d8ba84b98973abead58cb9e0067fce3a1efaca8d2d8fcc391bde7988e8a909ee3b790d5b5b1a2b6a580f1999188cc9bf2c0f027eec758c1be018387b152b6ec0aa0ee1fa4a354baf63fb7bf0044c5c89eccda83eabdcebfa2a1e0d2e9a0d4fac5f4cad5bfd786a3859de8f98ef68ad8d6d3d0018d87ea3a81dc1b80e501aadd9554b1a12cd6f904bbef0185c48c005cfcba9695de9aa4c1d7b3d1fa84aa, 0x1b3b9e488a3bfbbd0d1cd8a9b828c0f0f010234cdf88cdfb1e688e5cdccc8b48ea7f2c0eee9d0e5c0e2b7be90cfdffe9e0e0e010240ddfbc8febb91f2bd8bee8688caf5b2a5c4989683b3d5adada9c58991b80c0c01020287ab9395cdfe84f5b2eeaad690aaf9fd99d2c3aadefc9f949be0c293b69a030301020990d7ba9ce38dc9cbcade88bac79bc281a392ebb7f781c7c2e8aca58794010101022dfba492ddddc8d591a7b8e19ab1a2b9c98ba193bcaa8ef2b2fefbeafc8c0e00010201d0a8b3e1f88f9ba291c5ebba8583eae6ef9ec3c0fac697fbc7cbe4cf86c80a00010236b5b784b78d94c089b7baf9cfe394c1858cbc9c9bce97d39ea081dc98800000010203acf3b4e7939fd5f5fc80c4f5c0a28af4eb8aeb9e8fd9aaa7eeb4a4be9fd0141400020398d3e8a8bca29dde92e9eaa08cb0f1c9c0eedde3b1a4dcaf8addd1a5c384131300021e87f4e2aaa2dbe4c5f0abd4cfbd9dadd8a8a8cfa99cde88d38a87e8c6d80e0e000218d0959ad8a1a9c889d5929094f086f283a983d287f7e3ca8e96ea8dbfc40c0c00020183e9a7c6ebbc84e0aed190afeaebc9f0ebcf9d91aa87d2deaeaae688c7f4030300022eca83dac7fbd0b7a49abee092bdddbeda8c95d7bbbdf38ec284e0f788b40101000244d4e59ce7ae92ba9cba90bff1a583ddece1e5e1bf8dd8a2fa87bcaec2b81500000229f2dad298d4decae7b8b4908f, 0x186b3b0f6a4b4c01e22fba68dd6d0d5d0a98f8ffd85ac9380c980001302000202020435babe65b3d10a83c628dfcc0172ec99ecbeffa6baa5a2a3d89aab95b981a4c5fc99b9db96b002f844da6bf9249f0d88ca1ff3d940ddbc2e9391007ce4d489d385a6abcfb189eda69ae0ffb8c49eb2f0bec5d4f28813f505bd0184f453b724d7e841f6eb0b98eb28f3f2003cdcb4b8eae8cf97fdb3c1b2d2fdccda9af1c78dd89784a3f3c870f6fc4da8a429a2dc23d0da14ffb50f86c109c5cd08c2ef0003dbcae1f7bef0f38aacd9f8aec2c4b8828cddc1f6ae96e0131302022b95d1bbd392efa993aca5808ca3c9c9c69ff2adb8dfecbe92dda3e4ccce0e0e02023dfdebac80b2cd9fcef6c49089bad7a3b99891cf9b81b1bcdac48ef88bea0c0c020202c8adef938bfd918fa1fe849683fce98ce98deec2ffd384f7c3d3d1a7ccfe0303020227eb87808aecc4afc3ecf2c8e7fbdcb784c5d2abd4f6e6b9b783dced82f601010202029a8396dabf90ecc682ddfdeba894c89b88c5be92839b9aeae59c87b9f48c1500020212f5bda6d492abdca0e9b5e880e9c9f3e383e0dcc9d4a1e4c986fbfef9a40e00020201c5a1bd99d1fc988bc8e9ecebacb1c9a4f19780dea7b7c8a6838ab6e1bf880400020260bef3abbfed92cd9c8bc197b58686a7ccd8c1eb82f4efd0d484d0bbe1b6000002020186f4ca97fdcbbff2a9d1b1b48db1e695, 0x1021ee5ec86d5d188bae4fbe6faa7a6d6ffa4e2a4fcb0f5f2fcc01414010208bdebd0a1ce8bbaa5aae995d0c5a3a7bbb9ebc9aefc8dc8c0130c010207ede3e3cdcef6a6dedff481c9f297d1e180b7f5eeb4daa8800c0c01020c84f7d3d1acfab1c989f0cbcaf4a7da9fa2e3bd878de58d800c0b010202d0fbf4c0e4949bef91d6a68be6a091b4c3a0d5e4e088eec00202010208b09bc6e2abf09385e4a5d4e6ecd4c4ebcf9497bef5b585c01301010208cfbe9f9c8f98aae0d5d0e0e7d1ece1e7ebab809bcbe999800c0101021abfa6dfebf2c6ea8aa9b8f58b89a49fe98be0b0f2d5e0b8a00b01010207a5a192abd6e2afe5cdf7b0f3898eb5c6c19ac9c7cd8399a00101010218b1ffc7e8efa884d1cace85b9a4d98c99c082a4a0ecec83c01414000207cdb1c0a4c3e6e68abaf0bae78386eef7ebe89ac498ac9380130c00020ad0e287aef793edddd4d0b3b49a98bc97feb392c6e4bee4800c0c00020eb7cbaaf7d282848e8aecdaecb7a880ebc2ba8abdb0d4d28002020002098b9ae689f480fb84bf92ee9ba7fee5d5f4d788b7fed2c8801301000207b3a0cfd1d8fcecf8e4fc829f82eaa4c7d99c93f5c3e1b3800c0100021b938588dac9dbfce8dab4aec1eeeda3f297a2a2e2aad68d800b0100020892e58adff1e5a4a4dbc89ac3ef9fd0bdd58d9d91de9d96800101000218f08aecb8abe2f1a1f7e4eed3aaa3a098e5, 0x10c01000206e0bd8681aee2cff9e4e4a4fca6eeabcdab9ec01e2af3ec84e59387a0e0b1bfc0d8000f020102020204151413130e0e0c0c03030e020a020402150100000a151413130e0e0c0c03030e020a020402150100000a151413130e0e0c0c03030e020a020402150100000a060f020102020204013fee1da363f901d5bd17a2d833b6a13aa09a1d84ef003596d8bdb8a9c1f1a2d8b68e9897e2b1d6ecf9c003cff2028c8010f3e10cddca20daf432fbf317c8bd2cefba00059684dfa29dbe9a9eec83caf0fc819e98a2dbc045e9cb0184c6ee4e9cbd0ccbb427bcb640ec9f1fc4a61487eb0013929ac9e3e9eef0fa808ba0c0ae8bd8db8a801514020201dcfca49bfdc88dd7c6c7989fec85c3b7dcd8c1ffc8d3e99813130202489bc4effcadff95b5cde2c9f7e682cdc3d782c8b7c580b6130c020206b4a4d3d8f4fdf3b591f7f6f5fea1a093dcc3f9d4fba699820c0c02020b9ab3aa858d99e2bfc4b386afe68393fab6d699dc8ceef9d80c0b020203acf4aad5c3e0bf8cc3e1edd1b4e1b985d18dfaf08bf983a81502020212c2f48beabcbbb3a3e2eabcadbab5a2caafda83c1e5cafe13010202058c8ce88ff9eba6e0b5febb94c285c580e9eeafe687f7ce860c0102021d95e986ec8594cecdafe6fcf4da92e581db8cdbbb8bb0eec80b01020206efafc6dccbbdcb93a4c2b19492d180ab93cfa193f3a1e1b8010102, 0x1f289e2f6e5a2bce00c0202020683a6dcf2b6a6c9c9ecd1a9d497d0838bc0d4c00b0202020999969cbbb1fbc5a3bcdc8fd4fdf383ffbeed800a02020231f9d2dcfdc3ef9f9f9599d2bc83c590cefc9bf00202020226e6bcbc98aba3f2b9bee3e3f682ca82ede2c8d0131301020890a0f093baaadcf2f680959bfbc5bcffba9eb8140e01020991faf6f3c5c6cdb9f5bbdae0e8a49ab4c392980e0e01020bc8fbeede9a98ffd7c1ccc2d4bfb4dfee93d8960c0c010209b0d6cad2b9f4a7f9f6e0e5ef87efb6f9d5c8920c0b0102089bbbfcb3ccfed0c590a7abe4eb82b899cc92800b0201020cb9839a88fee1ee9f93e5fb8ef5c2e2a98ef2900a0201022ced94b3da8c998cabfb8ac6faf7b8eaa1f7b2b00202010229808aa2f89cd9e0a7f2a4b183f5ae8a8f9aafd00c01010206cd97c7fe99aa959e9df7f1c0defaf4a7bbefd0131300020897c8a2e9f9cdc48086ce99b4abbcc2d691def0140e000206c3ea84f28984baa2afebc6e2a4d9cff2b9dff00e0e00020ce3c196aaeca7f69890c1e78fa3b5ceaabbc5cc0c0c000209c1e3f4949496f3e2cf84f7d389f9c2d4cdb7fc0c0b000207cab38cd4fcf99f8abbacee81e6e3908883efd00b0200020fda8ceeba9fc1e7929adbc79aa38e8cc3a199800a02000227dfa6ad97a496c3a7ee8ec7c69ef78eabe0fbe8020200022ab1eccaa9b0c8ddc897c2ad87ad87c8e6dac888, 0x12bebc65dddb540d1e803fb990104b0f7fcfad3c394fcaadc8ab1c06af905aa55da0488b22181ba42dbed2afb9e09e9970024e7daa9adbccca6a28eb6cba2c7e0151402020195f692a3c89db49797d8b5d8ea8ceafbfbb3e013130202088bb38ecbecb5f18edf8ac99290b9c1e1e2deb00e0e02020eeee6a9ef91949dfd838c82d2cde6e4d6f1a694130c020209db9bd4a9efc4f3b8e5bb90fae3dad08392c9b00c0c020209a9be88e8d4eca992f0c5eff3ef9c96bcace9e40c0b020201c684be96c4eabfc3db9fcd] private def node2184:Certificate:=PackedParametricCertificateData.decode 9 data2184 private def data2193:List Nat:=[ 0x115150e0e0c0b110809080e0309020602060101010a15150e0e0c0b110809080e0309020602060101010a15150e0e0c0b110809080e0309020602060101010a06100c0e0807120026042c0411040d04060603020410020c020504020204020412040402020203100200020202040d020902020201020404040c0608060204000a040e040b0607060104000e041204] private def node2193:Certificate:=PackedParametricCertificateData.decode 9 data2193 private def node2194:Certificate:=.split node2184 node2193 private def node2195:Certificate:=.negative 1 [(1,0),(1,8)] node2194 private def node2196:Certificate:=.split node2126 node2195 private def node2197:Certificate:=.positive 1 [(1,1),(1,7)] node2196 private def data2239:List Nat:=[ 0x112000c0416030c02090201120030043603070205080008030603010f0601020202040702040202020313130e0e0f080a0808080e06040403030a020a000a13130e0e0f080a0808080e0604040c020a020a000a13130e0e0f080a0808080e0604040c020a020a000a061208050600060308030c020902011200300436030506030200040304030a02070202060306030e0e0f0808080e06130408040e0303030c020a020a0e0e0f0808080e06130408040e0303030c020a020a0e0e0f0808080e06130408040e0303030c020a020a060a040306010c00080416030c020902011200300436030506030200040304030a0c0208010600040412030110040002020603010e0402020206030d04090601020306030e0e130a0b090f080a08080815040904040313000a0e0e130a0b090f080a08080815040904040313000a0e0e130a0b090f080a08080815040904040313000a0612060a0408060008040a030c020902011200300436030506030200040304030a02070202060306030e0e120a11090b090f08130412040e031202090e0e120a11090b090f08130412040e031202090e0e120a11090b090f08130412040e03120209060a040306010c00080416030c020902011200300436030506030200040304030a0c02080106000404120301100400020206030f04060c02120316030e0402020206030d040906010203060301, 0x1150e0b0b110a0a0811050e040a021300080003000a150e0b0b110a0a0811050e040a021300080003000a150e0b0b110a0a0811050e040a021300080003000a060a02090204040302030b020306000603080313040502020603040313130e0e13080f080a08080804040e030c000a000a13130e0e13080f080a08080804040e030c000a000a13130e0e13080f080a08080804040e030c000a000a061216090c02] private def node2239:Certificate:=PackedParametricCertificateData.decode 11 data2239 private def data2274:List Nat:=[ 0x15de6c7f9a5e3eecddb87e1bad7e796bf99ede6820c01010222b9ffe8fc8de2efb7d6a599f1d89cb7eea9eace0300010202f5c0bafad6e0c9a2c8efb492d8e9949482d295f00000010218d5ebf9d6eef7f985c7d3bba1dcbeb2cad3aee00e0e0002018ad18da1f7f0e6c2a589978a8fd09dddf6cea1e2150c00020181d2f5c38eb1a5d48dcfc2e99a8fbf85c297b8ca0a0a000225e5c2a6adf7b89ac0b1f3a89ee59f98aa9bbeb8110500021de6c4e98594caaa8b95d191e69cd6cbc2bfcbf008050002059a90d2bca3e6c6deaec6c2e9c4d4e2e79a8bfaf00e0400020189ddbedaa2c2f5c0a794bef4a0a2a9a698e9e00c02000260b083e5ddd8a995f7d5d59d86e9a2f383b9fc920c0100021fb197e6d1be94e3c1909fa4f097dce5e8c7bbce0300000202f4e8c2ce90bfbfa388b0d6d39eade2ca8d9289b00000000218bbf39da0999bd5829bd280f385ce98b4d4c3f01e02a6e6dbd3b683a8ac97bce896b800120204060202030b020306000603080313040502020603040313130e0e0c0913080c080a040e030c02130000000a13130e0e0c0913080c080a040e030c02130000000a13130e0e0c0913080c080a040e030c02130000000a061202060402020302030c02090201120030043603050204020002030203011006070605060102040804010c0205020302030204010d0c0a0806060302040c0308020002020204, 0x1020391c78eadf4bf8ad997adf6afb1f8bb9d8ab00000000214b587f097d982fd82978993a8e0bf8fc9d3c81e24d0f5b3f0d688cef08c94b800010b020506020203130404020202030f04080401060306041002000202020407851fbc2399029c1496c038d7e73abbb81587e1000290f68893dfe3c1bbb4ff9badc2b3a03bfbb20181fee355e4fe2bf3f11db3ef3fb5a42bf5e517999a000aa5c6a496fb8ebfb5ca969ea2800e0e0202018aec879db88cdefbd5aabb9bcfc6bff1f5c7e2c2150c02020180bdd9dcd0f0a6f5b4e9c682d386a6e5c3e9d8aa0a0a020225bbffd5b8c39dbfe48d9efc8ceceda9f4d784f81105020219c793efe8e7c6e8ef9c8ad5e993f1b697d5e0f008050202059a80a2ffa8b48ea3dccccdaad1edf9cccdd2e1f00c02020256d5d4cba089e3d5c9b5e696dccdc895adbaf4d20c01020226da8cbbe89d9cc89bebfee5c092cc89ba83e0ee0300020202f09fb9eba2e7bdb4e3e0c5b1a5bd9b96d1dfaaf00000020216e78b9096afb6a4bfaba7e09ff7b2b5f399f8f00e0e0102018cf8d0fe82fab29cefb298f384adcf81e4a9b1c2150c010201828ea0a480b8dad3bad386aad6b2f793c0c9d6fa0a0a010225d2deea92aea19bcbd3cbf5c1eee9fef7caac88110501021cdbc7aefce5a59994e99ea5faa6feafc3d1cee008050102059aaee69888cdfb96fcf7dcd68db6d0f6e289b8b00c020102, 0x186a0a7d8d6fbc00c0102020dc3f1b1e9d1a7febdd8a2cab2a2f1e8edc7800c0002022fbaaebd92f6d4f299c0aeb5a2c38097c6f9e0020002020cf8affacae5c3b6fd86e78a95f88cc4ba9fa0010002020691af8c84f8f7d29cd295afb4e2ebaabd8e800000020214809fa2f09d96e4c0ded2fdfebecfb7c19cf01313010265a0b694baa987c7b0dedca8ec9facd789cc0e0d010202f0e3bd8092808f9ac792af8795f1f08d97ba0c0c01021cebc3f0cdb7e8e1d5a7ef96e5b7e1d386c4b20c02010212e7c48fdbd48298e2a7c78cae88abc0b6dd940c01010209b4ceebb7eee4baeedea281dcb8d2a7e998ee0c00010232bccf9ff1ada593a1e9d7c4fe9e8fdbd8e7ce020001020edcc28fd1c1ecf5e3db8598df85badb899bb40100010204a3c1f381c9afd6c1dd98c19ff7deaa9ed6880000010214adf9e6eba8a9d0c9808eadd9e5d1cc9187b4131300024ec7e0fa9cd387e6f7b1b2e1c9f3978ad2880e0e00027eb3d09ccd86c2fc8bc8b689deb5edeabbd60c0c00021dc889ed94b4abb9efe1acd1d1a5aa97bbfac40a0a00025df3d4e589d0fca1e28ebb949bea8d8ade9a0c02000214a9a1a39cfb8ba8ef8defb48c91b385b780dc0c01000204e5f1c7b8a4919df5d7eefb92dddcc78feff80c00000234febbffd4a5ebfd9899af90c780bfe5eaf1d8020000020fe197b5d2fbf7a0fff0dcffbdd3e2ede4c1b0010000, 0x1aaf3d2b9be9295b1a5b4010101022b8199b09aabf3dedda9ace9f492b487bb9ecdfffcded00a00010213e0cd94938bb49dc3faa9acc1dc89b2dfdb88cd8ca0e21313000209a7c4b0e1baba97adfcbaee8ffab9c0e79ccbc8cdabe80c0c000224e782aac5c582909fa1de8eef8a8eaccebaefd6efcea40a0a000201cdb4c285a2b7a897f1e29bc5abe2b49f9dfda7d0800c07000205b6a3e0d680d5a18fb584f2b2fe98c6cebe8ed7c7c08088070200021e85b8f8dcd1fdd2d9cd89bf999cd787cdd0cf909490800c0100020181b5c9b19187dee1c38bf1d193cdd3f9ccefdce9be85c8070100020799eda4c888878ed5c48f838887ee83c1e3f7f5cedced98010100023fe0af90e5b2f7b8a080c8a8a4efd0bdefa9d2ed97b3f80d0000020fe095ee9fb3b2b199a685f5bddba4a0abc6d48d8898f80a00000213fefa88fef3d785a3d6f8e0c38bae9bb1b78da5cacfa81e03a6b890f1a3a89ec1c5899afaedf7c5a4002acf50be279a56f52390ce44f78f26c49004bca30028b2e8cff9f5a8a6f7ad8386abe00183b09a5895902af5d02cf7ce4dab9533f7e719a6fb1aaa8d001695dca7dfb4dbbfb59db7ce1313020263e9db84f2ffea8faea5e6b0bc97c5d1c4900d0d020205c489b3e289dd99889ae0cddeabb8dcb08eb00c0c020219f9b7ceb1a2d9a38aea8ab6f9c9a0c1e0da980c0202021193c3df929acff6aaacc88b, 0x1043387ca66ffdb12b3ea24d9c001029fa0ced6f1f19889a3e2f1aafc9aae99fc12e926ee31c505c41ef4823db7eb31ba9c11eb8d0004a7f6c0979980939f94bab1f7b2d8cf9f828421a31dc013f4379614b9c828b7c328e68d3d86ee0043dcd9d383cda8a7f5d3fccdf2cbc99ebfc4131302020986dede9994dbed94dcf89081bf83b7a2beb6b6e9efca0c0c02020de8dff188eee3b289dded9cf3b5b0c1d8dfd1c9d0fbd40c07020205fcfcc7d6ad88b2b6be9198a392f984fee1c393d5a7d3bc0c010202018cfb94e5ca8ce4daac88b5c3af939b98efd5dbd7b9c0a40701020206e68484e4adc1bf99b9c6c3819de7bcb5ffeca4bc96ccac0101020241c7abf1abdebaeb8ec4d4ebdbc5c38599f99ba2f394920a00020216dac09eedbf88c7edddb6c9c7ce83ffb3cdbfaf88a6bc000002021582e28ae5e6b4d4a7df86f9da9daed0efa8f8bfd3a1a21313010208f8c9c4d6b5f4e29486f2f9ebb6fb87b8dcd1c8a1c4c80d0d010215edb7ecfc9c87d7b1cfa4edf8beb7cccfb0fedf98ec980c0c010224e499babcc4e78784b6beb1f9e99ca1f3f8f8a8cef3ca0c07010204f9edc0f192f796f687d29fdca7e5c3e6c78ebf9e9ded9a0702010227ad8af29bfe908bddaea1aceb87ceb48efbb6849ea8ce0c0101020191d0eccbde99998c8ee2cd9b9bca91dff48edaf6a5d8fc0701010207ccf4a6dcbea192ade4afa1c291, 0x19feaa0b9c5eb9ccfcf8c8dc2cae80c0c01024bb2e499b6e7b5939ba3e2c2a498859687fbc2c9eb8b8a0c020102018195a9b1d4c1f6c9ddbe86a9d7dda6b0d4e5b8d8b2cd900c0101020680ebdfebf7a9e1eda08d9b8bd2cbe1a681a2f5c49587e00201010220fb8a87eefd96bb92bdd8d9d6d9d6c7cfbcc2f4fcf4b0010101024b9096eb85c9c1e487c9c3cbcac5a6c0db82f68d8bc5d8000001026ccc9fca99b7f2ebd28ff4f2bf91f1ec93c2fd87a2b598131300022194cf9ceae09cb5bbc392a7b1bca68598deabfdf7b6800e0e00021de5f7c2afebe6acf6d8bee2b5d0dbdcabd4dd96e99abc150c000209e3c5a3b3e3effbb99182f8cde1e7a2adfc9585d4bbe00c0c000247c689c698fafbcbf09d8790d39ff7dce596ccd2899bb40c0200023c90f0f9f2dc8bcc8e81aee5b5acdacbc4aa9c95828af00c010002058ef699bbbdb5d999f2b481b2f3898ef4cccba18acfa3f00201000232f7a8d7b5a5e688e898e995c4bfc9d4f6dfc2d1dbbbe00101000268cd8e90c8a89fd497bc95d8abc2d5c7c9e282d1c581f00a0000025fcc9a85d1acb9e99dfab0dab79eb6a0f7d8e4b1d7d0800000000211c4c7fdff94c0d7cac4e983dab596f0c9bab9f7eda9d01e1becbf92e9d4e6beddc5fae0caece780f8000b02060602020401010f0408040106030604100200020202040d02060201060306040c0608060204000a040e, 0x1f8aa8ffaf5fd91eca1d1acd5e888e4b99dc7b3a00e01000201dd81b385fbc1c18bf29b8fb3f08eb8a28cb9a2f4e3dbc8ddf00d000002209bdce29898e0b7a58bf9a2a297c09edfc7e9a0f5e7f997e01e21f3e5c8eda2b5b4c7f7ce95929887c8c0f7c0000d020b0200040304042de9915cd4a43f9bb30eeaa8012debb3ceaad0f3be8992a6acece9b9919c8002a9d40488b901bbb703b3e810869222caf93ea4ec2ecca3002cc9b3c6a2fba2b4b0a1b8b3f1cbdfc9dbe480038dc305ca8a08b38b06f58222be9041d6b908898f2bd5ec0015ebb8d9d799aceafdc28bd3bd989299f6d1a01313020228c5b598a2cccef6e9cbc2fdefa1f88adec6c7858e9ac00e0e02023bfcd2ebf2addec5d1888bbca393cef7e1e8e88098cbb8150c0202089a97c483c8968fb2c0c696efe8acbb8895c484a898fc0c0c020245cef7be918d81a6de8ceae5efce95e089f0c0d2b0c6d40c02020255b0e38fc2d4b3c4a7a7fbd5c1d586f6eeb9d3cdfc979c0c01020205f4abbce7c797feb5e8e3c78fda8f958cedb5bb87aabfe40101020242cc90db8695e49dab9bea97a3f897e2ecb6c2c0b8a2e00000020262bcb496bce0fa93a397b9d6beccc8f3e0af8e8ac693a01313010221e8ddeec5b7f5cef6eda7af80c98eabf9c3d382f483a00e0e0102248fc8ece2bd9b9ef3b088d4ac89eeb8a6ad95d4db9fde0e0d010216bbd98ff5a3c7dbe2, 0x1a4e0fb94c20a01020219b9c9e38087e1d7a1b3fca9d9ebf3c3afcd87dfc0bbec93a00e00020201878ecff5ddcfa4d781af9699e0cad4cdaff0cae4bee0ae898e0d0002022a8ac0f4fc8ad6c1a2eaf7d0d383c7999097fdf7ea96dbd2b0131301021cb1a6aceab9f9f288fbd088a98eb7bbadb7f8c9ddd0cdc2a00e0d01027493a8a1e3fae3ade3dbfeb3d19e86dabad9efe6d8a5e6dfc00c0c01027ef7a39f9be284b5d79bdec5d8dff5cae2aeb1b9f9b8d6d0e80202010201a2c2b0c18ae68fdd84abf293e9faea85bba8f1a1fbf5c0fbd80e0101020187e4b5b5e69b8292d5e59ccc9197efb1c8f089eceee1ccb5a00e00010227bcaa88f0deb49a88dfa4bad4addbfbfdc7e4adc69c94a5900d000102029df69fb3839ea6eda697fad6b081f3b7c9c4abc1b78f9f87c00000010207b8ef99c78fa6a8d9eb99c7d184b2d492f496d5cecccfe7e8131300022193e6fcd9cfc5a1d299e4ffbabbeaeab4f5bcf29aa3e0b9a00e0e00020180d3f385e0ccc1a0ed94f6e0b3b6affdfef980ddb9acc2e2e00e0d000210a49b9ab9e290d6ccdaf3cddff7bdceec82c8bad5cfcda6c00c08000202f38beeced2e7a8aae8ccd6b9c9ec8e819ebabdc4b8c4a9d0130200020bd6e88caeaad5afc585fed3f697f8bec0d3e4eccfd8e7e3c00c0200023189bad8cda9f78c9faec694f7cf87d7bdaba2c0d2c9d2a7c00202000268f6d0a7b1, 0x100020c859589a498e889eccbe982eda3a191e5d1e8dad5e5aea3c4ca800d0200020db6f0f9d58bf7ff8ddcbefda287b8c9ebdde6a88ddb9ab8d9c6800a0200023bb2dfcbfea9d0ece19c87e6e0e28884b8b9a4c3dcf4bccea7f280020200022dbb8ec9aa9bf69d87cdb08e80d5f4e9a090b6c1c5d6b1afb0afc00d00000202e0f48d91d0a498d4849fa6f981d9d2ece8edb9c787dbe1aafa801e32aaaecc82e0e6928e8fd5ebf3afbbadb6b1dcc0000b0803060118031a0411020a0200060306042796a34fc6de4b9ac92595fe0114b8d4e1b28ad598969fb2bc8ca58fc282c090c01ffb46f671af46cc0eed881fd2e33de8e2328ccd003785979deca5a7d5e0a98dec81b688ebd7bbcd9da00bc94dc7029bc657b721a5944181ed05d28f2dd982001eb3b7c5acc2f782d5b0d9e092daa69782dddde9c01313020219e88ffd99bedad7afaaa6a79ecaf1b6e9c6c289a5ead791980e0d02020a9ba2e9adc68abdc29381ff8393d68ec59fb397bf8ffac6e60c0c02020a98b9a8ceb88bf29baaf1e89998f7d0e7a0c996d1a1edb99a0d0a020201dda3f7f498dad7b59f838c8981acf3c98bc2cdda92d7eeb5f00c02020246a9cfc3dbdfaffecafcf6b2b8bccf999efcc785e7cda8c5d00202020201a2db88fd9cace8c0eef5c0a3bfeaccdcb4f29dacecc6f9bfc00e01020201e4c290e3c8b2d0e3d2a9c9eff8ceb2cfd0a5e7f4, 0x1af91e4e3a2f587f899929bbfabc00a0202023ca2dcc18a8fbb92f5c0e0f5aa9eac9d989da1fcc1acb8aa9e9280020202022cbacab6d9ec89c28cd983bef2f6d6cd99bffda3daaeafc9addfc00e00020201b2e8a1f392bac9e0e5c68f98d19ed6eeaf96b6efc1a39ad6e6800e0e01020ec7f2f497e6d390d2bcb8c4bda6cb81a6ea829282e194f98697ea0c0c010204a88088dea886b1c3ece2e6b9d18186d5e2cab9c4cfca8daaa2ba0b0b010204c0c797ae99d4e8ad9e8bc0e2a6c0938bfacc88d3bab7d6eaa3c00d09010203b6f9fbd085accae2f2e4dedea0c59fb2f18ae3f1c9f1e7b198cc0e0201020bb6a1a5eec2dde2d0fbc3ef88f1cda28fcf92a8809295b1e2e1f80d0201020cf18ec0dbecaaebc3bfd1ced6af91a89f8ec8b4abcfd5c1bfdce40a0201023be4a785d0ec8d91baa1a5f8aebddcacc6bf919fb8e5868fc8d4a0020201022db0b4afb3bfe6ff94bfe4f487c9d1e7c793e3d6d396f7d1ebe5c40d00010203abeae7beab99b898c6e2b6cfdf9f92ba8d80b2caa7efb8b4dfc00e0e00020ed5e5a7d4e48dcdefb4b785fac8f6e4e1e6afca8bd5cccfe9d6800c0c000203f886bed7e9ebb7e68acafdf688b2a09dcdd887f1facadfb0b4c00b0b000204d1bae2aca8e7acdf80848b86ebf5ce83febdccd8c787f3d385c00d09000203a5f4e3f9e4ed8df0d3b9d4d8a5f0fe95f4cbe5f699e2eef3ea800e02, 0x135b6ad67c58624a0b903bfa9011e8fbdda9390ca87dbb9b199eee0eaa2979082afb820d6168117ef449c22dbab479fb42196ed09b4c5002fb18b99edb4ebb8d69dd6e290bf96c1d3efa2edaac074f7f444bada19fef4088b840eebe708a3ff03a393028281000fb294c4f083fbd680f2a0878cce9fa0d887e0800e0e02020eb6a3b1ef89f8aedf878cafbcbc95acf5aa8da6b3dd8e8994d4e00c0c020202f5caeab7eff9d6fcc4a3a1ebc1ded2dff39f9aabf8b8bee087a00b0b020204c389c5938adbb795aaa5cabec4f3f6a696a4ef91ea94f3f4f9c00d09020203f88ca882fea7fad3b4c8eaa385f6a0f0d3f3e8eac39b9588e8c00e0202020a84a9efa9dab2a09899aacdc8aac9eaa8e5b09081e4d9c4d387800d0202020ee0e78bd7bea5c4a8a0cd8db9] private def node2274:Certificate:=PackedParametricCertificateData.decode 11 data2274 private def node2275:Certificate:=.split node2239 node2274 private def node2276:Certificate:=.positive 1 [(1,1),(1,7)] node2275 private def node2277:Certificate:=.split node2197 node2276 private def data2328:List Nat:=[ 0x1061216090c0212000c0416030c02090201120030043603070205080008030603010f06010202020401151513130e0e0d080808150603030a020a0000000a151513130e0e0d080808150603030a020a0000000a151513130e0e0d080808150603030a020a0000000a061208050600060308030c020902011200300436030506030200040304030a0207020206030603151513130e0e0d08080815061304080403030a020a151513130e0e0d08080815061304080403030a020a151513130e0e0d08080815061304080403030a020a060a040306010c00080416030c020902011200300436030506030200040304030a0c0208010600040412030110040002020603010e0402020206030d04090601020306030e0e120a0b090d080a08080815040904120213000a0e0e120a0b090d080a08080815040904120213000a0e0e120a0b090d080a08080815040904120213000a0612060a0408060008040a030c020902011200300436030506030200040304030a02070202060306030e0e120a11090b090f08130412040e031202090e0e120a11090b090f08130412040e031202090e0e120a11090b090f08130412040e03120209060a040306010c00080416030c020902011200300436030506030200040304030a0c02080106000404120301100400020206030702040202060306030e0402020206030d040906010203060301, 0x1140e0e0e130b0b0b150a0e0a0b0a0a02020201010a140e0e0e130b0b0b150a0e0a0b0a0a02020201010a140e0e0e130b0b0b150a0e0a0b0a0a02020201010a060d020b0200040304041313140e0e0e130b0d0b110a0a020c0102010e000a13130e0e130b0d0b150a0a020c010a0102010e000a1313140e0e0e130b0d0b110a0a02110102010e000a061313150e0e0e0d0b110a0a080a0201010f0008000a1313150e0e0e0d0b110a0a080a0201010f0008000a1313150e0e0e0d0b110a0a080a0201010f0008000a0601011304040202020309040204010203060410020002020204150e0b0b110a0a0811050e040a021300080003000a150e0b0b110a0a0811050e040a021300080003000a150e0b0b110a0a0811050e040a021300080003000a060a02090204040302030c0209020312000c041203130405020206030403151513130e0e0d08080815030e030a020a0000000a151513130e0e0d08080815030e030a020a0000000a151513130e0e0d08080815030e030a020a0000000a] private def node2328:Certificate:=PackedParametricCertificateData.decode 11 data2328 private def data2353:List Nat:=[ 0x101d286b4effac19d84e28eaed2c5c5d80800020212a7c589e08f98e0eb82f5afb9ade80200020202f7d6c5a3e6dae2acf8fdb0968ba990131301021fdbade680c69cb2c7eed4f0a7acec0e0e010201f1c1e4b5d4a0cfebeb908ce8cabbc60c0c0102039ba7dff39385e996e6f2dfacd6aa0b0b01021daec3c4f78396b28af4dfebecc3bc0d08010270f297dcf4f4f2e991dabe8585b4c40d0201020491fdb2f2cc8dadd1b7c9aaeedbd7f802020102018deafdc6a6caadddc39196cdd0a40c01010201dccef5cea6a6b48ee494a9f3dec8f40800010213a39ce0d1b6b7a6cdfda6f4d1c8b40200010202f9f591a6dbd6bbeba6f495fdb9b8c81313000221d6a4d9e5dcfbffe6f28babe8f7c00e0e000201ead18fc69ff986a7c2c99d81ea9fb40b0b000219c0bfefeb89d0f6b1b5b5a5cbcea40a0a00020ed5f89bd49fa7aab08ba9f7cbfa960d08000275ad9ddb9ab6b4c485ad94bccbcee00d020002048582a5a3e2cab5ae80ac9dadd1cab00202000203d5e88494faede3e397e1a6e3b2a20c01000201dcd182febfe680ebf5b1f19dd282f008000002149b86f6f283a6ea84b5c4a092eef00200000202f6c0e598fbf8b19ac7be86aebccbd01e02fd8bd091d7b8bad4000101130404020202030904020401020306041002000202020407020402020204060603020206030804010d10090e040603100308020002020204, 0x19aa9b29484a687b39f84dc848a909482cde7c8d7b8c8d7d00201010275998b95e8b4af9988deaff4a0c6bbdeb482c69fa7a9ece00101010207afb9cbb9c0dea3e8cbc6b88a838cd7b793cfa6da9cef87f00d0d000204d1bd99aeca89faa2c08ebfe9efa180a9f1c6bca2c4898d940d0c000228dcb49cd483ced2caafcdccc6e2a5b3d4cca4f2e0fd9cfe0b0b000214ded1f7818a8dc1c982b6859b8bb9adc0acc7adadb7e5c60d02000206999dfc95d1d59b88c3ae8da6948ba992e4aad0bdb9f0fac00d01000203a8dea8ded5efb083a5909090aafcabd9b89ecd8fa7a7c7b40c01000205e3b9a990acc0c4cccc98c2bbde9c85e58db4e1bf9fb8ddf202010002019fd7dfb59f93e7be97abfecc998acaa0eea7fda5d78599d801010002078caca6b489f3d5e0deae96d09aa8fffffecaf2daee8d83a80e0000020182d5f2efccbfd3e8dc82b9e0ffd483ac949be0f0b9b188e21e07beca979de5d9d4bac7dcd098c78aeca4b2005992318706bd76b92889ed48b9f40ad5c516d7e70001e0d089da8884fde297e01313020222a3e4d0cb94cff0879ea8dea0bff80e0e020201f0a99aa9bcb583cffbaaacc1a4f2e40c0c02020596d6b3dab9e5b480a895df9186900b0b02021a9cdbeeea86c397dfeb89c4a5a3cc0d080202669289969cbca5a6b8b3e3fcdaec980d0202020499b2c5efaec3bec1849dbaf3deada00c010202, 0x1d920aabc41d58f2da6ea07feb900079df6d2bbf5f9a5fca3a4f385dcc6dbd9e7f4a05ebee60188cdaf1adcc526dba92f8dbb4499f60db9ac139df000798cefe1b88da08ee786ea949c8d84f8ceaac00d0d020204dfb7b489be8cb0f388cfb3aefde3ffc69ae7f0fbafe5d6ca0b0b020213afbabc8d84f9809efed7ded1f5ff9efb97ccc895d5f1de0a0a02020f91c2a0eb8cf3eedbdcc285e5edc6caf4abdeb5b0efbbd00d0202020684e7dc9b998abd97d1a2a1ccd8b9d1e380f8998787d487a00d01020203b198c1dba1d9c0d29685ddbaafbd96dcc8dca3b8a294ff940c01020205ffd6e6d6fde9fb97c193c581a9ce84e5df938de08defccb0020102027bb1d4a9cda8bbce93abb0bdfb81fa95b3d5b1d2eafb98c8010102020783a1aaf6bfa7f4a680ebd6b0dae9b6a5f384e0ba9beadc920e00020254f099b7e3fba5fbc5afc1e5898d839be2c3b980ace1f5f40000020223b596dcd8e3b4ad8096dbe4a586c9cec9adbbfeea8ead960e0e01025fbbf2a9a8bdb9ad95b8a2c19fecdcf1d4a3dcbcb8a9c5d60d0d010203e1e2929a98c28096f9b7dfcbb8f2be87b8e5a9a6d6eccbb00b0b01021cadf4dcb4b29bfb84bee29eb8b1ab8885eed789a6f298f20d0201020790dccef3b9ee989eaefbcfacc7e9bdfed38ec9a39deae7d00d0101020497faee8b9688f6c386e184e8afde96e9aad3e7dddbded8f00c01010205, 0x1cfe3e8fb9da7b492c7c7bca0d888b00c070102179eaeeae9b99be1f7abba94e1d58798ceb9fef0c3d4abedc0070201026898acc1c8edeff58bf0f8fbcebf90ade1a081daf6fcd3c4b00e01010274b7aaedd28abb809e82bb99b68bf2c2e8bfbd9bc6bdebf00a0101020696e1cfb78eacc0b79cfdcc9b9bd3dcf2b8a8dc9cb2bd8dc0010101023da6b5f3c9c0d1aec4eadac3b1ddbd85f48de889e8e59aa80e0e000201b3e0b5db8c8ff5ed82c7d0fdb5dbbb9adcb8ea87dfcc9bd40c0c000210928d80a3daae94fb8bc2be9feedcbfefaadf92ce999b900b0b000213dbc3d4badadea4f4a5cacbd5e1ab8acbc0dccbcebee3800a0a000206a7dbbcf2d99d8b8da081ebd1d3c0abf881d08df8d7bcfcc80c07000215c9b5d2e98a8aa8dbbe99be9588e0f9949db1d3fbbea6f18c0d020002159ff5fa96b0ddaba29df8faebeff0cdebd394a9beecdf9a0702000269bbc791a1f1d082c1c4ffd6aee1fcec9f81cae68cd1feaca20e0100022ab09df5a68ea6ca8688ce879debd2ad899481fdecd593c80a010002069f86ffb9c58fe6fef58c85d4c881e8f4dbacbb8bdc93c2e60e00000204d8daecb3d8c084cdbef68cbfbda2b7b9dba6aab1c9a5fc1e26cfbbe5ddf9c4cf8bf6b9bcfca99994c6f0000d020b02000403040443ffed5ccef41ac3b61fc7a20101f1f18793bac59ecddad89ac5ecc393c9b28ea01bad33b6148032, 0x1dba4d08ab2c0ebaec5e9a0aeb194b8e0e1b4000d020b0200040304040b0205060202040109040204010203060410020002020204070201060002030804060602080002030a04339fd666cbc510dcda26aca20112c48ea7b9eb8880e488d4bb8df2f5b4f886b01fef3dbc01ec2ff520c7a4418ca32dd2fe0a99d7002db6f3b9fc81f0dfd1c6aa8ac5b7fcbee3bfd6c01ae6359926ec1aad10e5ce21cbcf2df3f13ee4d2000defe9d6e5fef9c6bd8287d3a99f82c1e1b3dfe00e0e020201b5c5be89e9f1b1f0fcfaabfc8aee94a7e28a9ecbcba6bcd00b0b02021482eaf7e2888fe2f1fe9d8efef39e93dcecdab2c28388d00a0a020206a28ae8ddd1d1d0d5a8c4908884f7adb0dbb3939ccd83b2a00c07020215bdc5e5f28199f9baee8896c4d2cbeaefccb597f0e6e2bfa0070202026688d8c68b8ab492adc68ea090ed83d0c8fcfbe9c38fedb7800e010202268b8588a7edf0e7cdefb9da86d6b29a82c097dee983d3c00a01020206e187f698b8c1efc98f90eebfc4a2978efca6d5edba81d98001010202298cc7f5f9f395b6d892f2d1a2b584819fcd97c2a8b0bfe00e00020214f09dd9e7d7b1c9cf9ddae2f088d1fb8cf1d2b3d283c5a00e0e010201deb8fea5de98af86b9b3d2bef185cdf881a5ce889bebd4f00b0b01021af8cbe6a2b6c9bd9d8da1e8ad8fc1d3adb9e1b881c9f7b80a0a010205e0f8ff93cefe9583e5, 0x187a6bc91cbcffeaafec4e4bdb2f6e2ffc2d491eff6bbe2e9a80a07010207ee9af0a482d7dfb7ef86bba2a5c5bedbdca392a8c2a2ea95a694fbcbd8c4d29983e495a7c2b00d02010229d0e39282a3e697c5a4e88bf2d5b9fe9ec4c29cc781dc86d89290f4b4b5fd81daaadf88f8b2f80202010212aae68587c397b0c4c7c58bc89bbdd291c08ce8919fd8ac9c98aa84a8e49bd9c7ebf68b948fdc0e0d00022d94c393f3c3cfa7eec0cdc3f49d84e7feba95888db0daf4e5c2d49ce5bbb8a8ae92a2dbc0f00d0c000264d0a8eca0dac6edd3ccbba3c688d6f0d8fe88878ab7a2dba5c4adbf97fe92aaabd2ced7c3900b0700022afccb92c2eed595899bf3d1b785c1f2abafb9fadafeb9c498c3cbda87fad1d0e8aeadd1e8e098070700021dc7e2ccac9bddcec39096c0918dfee58981e5e688c1ea96febddaf4bac9eea786a1a8a4b890ac0d02000214f1dda5d3f7ceb3c9a2ffdeb0c9a9f6c18ce5cbf79b82f7daf7c4c2dd88f890ff85f8c8e8dec00c02000209bde2ccf8be97e8c4ae85b9e791e281dccea187a3aba5d4e2cd8ff4a0d7bcf7a6c6ce9683add8020200021d8188b7a7f4ccbe9cfe82a0e7e1b8d3af99dfc4c4d1e9c38494f3f39c98e2de89a3bfc9c5ba840701000201f2fca4def991cbba81fde79494e0d3e1b0d7b3b0d0cdaafee1ec8489ec8bd1a29280fc85e2d01e02b0b2b6ada6f0cbe4e3bdeaa78688, 0x19bd987a6c9a0a3c7a3ba8dc1b29587ffc0ebeaf4fde3addfb00e0e020226a6949e838392fad9b7a1d8e0ed92f08ee5838f84fd91c2de888eb4aeea8de4daccb0a5adb0130d0202149ad5b8dbd9e785eff3f390b8c09aa4afee96f9d7bdf6bae58ff5c591adb090c6b091bebca00d0d02020185def0a6e6dbbda0938194e2a0f69593ebaaafe5edfa96e6a2ee81a3c68ac1a4dcd09edbf5900e0a02020d8486e3a780b5c1a0d3c4a5a2debfe0f9eef283b2c4f6cb8aada885d6e7b580f5fae5e7a6e2f80e07020202c59cdcd4a7b2948ff1b7aa90d89ae3a9e2c6dfc0b0c0b7f185aef1dbced5efb1fba096f3e0981302020208829acd92ccede596da91cb80b8b4d5ac99918d83d3f4f5db87c4ca90b2b8e8c194909ac4d8b00d02020226cdf990e0999497d085a1d9e880d4f59f9ec6a1e59f8ed2d4f4f4dc88f6bacc8883cceb8cafd0020202020da08196db92e380a490a9a3b0ceb5938281ba8ccc9fecc0bcb8a0b3a0e0fe91dbf6f6e2e380800e0e010206ec83e2a89ba485a4abafd0d8ad9282d4e5cdfdffaaa096decfb3beceeda7a8bceceafad190ca0d0d010255dad2cadbf78f8391d1adbc85e283bdb093c6b8eafb9dc9d1ecc0819aafaae186f9faf6fd940c0c01021eb299cda0b7b3b3bbbb9393df86fab1fbd7f9f2c7a299f3e8b39d8bb28f9dc7f0f6c8bfddae0b0701020797dba9fcc7eba5bef0a5c7a0f8, 0x1881302000210b0b6eff4c7d598e4b6a8fda9aff9e190ccb5f7b79fa7c3f492a7ac87969af8df8ddf90edaab3b2a4a8a390c5b1c28ebe80160000026fc4f5918781b88ec894d6a9e6f59c8dd1afe79abffbae8cd489c9ebe6dbad93b99e91c49180f3bc9be3ee8ef5f1c989aab01e0789a0bcecffbc84dbe4d1dacae9dcb292e8d5c58690bfb798fe8bd3b1bcb89ab981c69bbf95c6e482b2edd0000b0803060118031a040b02010600120314040591bd0982f025fece2ed0cb010496b9fa85a883b9a1ddb29ce2e3e992bbea99a0aa9abc83dcf4b9b88e87d3dfd3da8832b48264ccd52ddcc20c9de20101ec95a2bdcbd2af9caafe8c86c098c1c5efddb4f68db6dba7b0c680e7dfb39cf58815b28224edbf53edbd4de6fd0101f8afe9b9d3cb8f8cbbafec83dcaff7dfb4b7cfd5ec8b8bbbe5d9d5889ceaacf1c003868e05ccd703848906dec013b3f027fdf13cc0f42cab970003beeedab1e7a8fb85abdee39cc9e7c9c395a697dd87b9ddc2e2b0c8dca7d0d09b89e003de95079cd21191dd0eeb8a1fb0ee3dac890789fd2e83de0001f3d7f6d79fbfa898e9a2c486b3e3848781f2e6a580eebfa9f095a8aaf1cf86c8f5800fb9a71c9b8c6996fe01839d930c9ce21781c133c59b4690e4003cc1d7dbb0c2c6bbc9a5cca4a4c99ddaa694aef0cb949890e3b8e9acdbc0ed8efa90131302020bddec92e6edbcb7d69a85b7d8, 0x1f199c4e9909ae89381d8f5ce89c0d5bb96c1a2d18fecc9f7baefb21602010203e281dcacc2f09280b991c9b784f8c0e4afa6ad93edbee0acf3d78594bb9edbb1e288a684e4a0cd8fcba8c8aea2bcfff981b0160e00023ea6a8a9e58e88fccfcd94e18ec0e0dedaddedb7f3a3f9ef8899be919ad7e6daa1ffdc8e9bc5adf6c4f3be81a184cce181d4150e000207f08d9093a8a6b6e380e493b9b6dde9c2b1b6988898cefde8ccf9cebec18fada5a7eafc96d6bdfbdeabbf969dd3fdf9a00e0e000201ccdeb7ebc5a7faebb4dbbfa6d8acf39ffbabc9f1ceadc28bcdbadb81d9dff8a9c8e88cc7e6d68d90cffb86b684a2a191920c0c000219cbcfb79ec88995ebebde93d9caa186a6e5d4c294eaf39a8fab9aa1f7f4c690d3facce4d984d5a2ef978ce7db898292b00e0b000201cba7d6a6a8c5e094c4abd88fa8e6d3edd0f49e93e3dcafa8d8efc6cb8296e6d185a5dba2b3b1e9a5e6f4d2ccc4c2f6d9c60b0b000201a69facc39fd0d3aefe8bfffc96bec3d5c884e5d59c9ee2a9c7e792cdeac6dedbc0fe968592d7c7bedddeeea1bda1f1d6b40b0a000203a5bdb6cabce1ebe589d2d3d496e9d188b2b1f5bcfcf6e59cb0fcc0c1f394d0c1f3f3d7bcf1edffc0a9ac8490d5edc891dc1602000202f6b2fdb696ba97fdb9f7b5bba5ecaafecec7aeb6efb4c5b5a1dea5baacfbb8da99c3f2899fcc85ad92bcf5b789d09a91e6, 0x1a00e0e020203a9fecbf1d9dfe1b7adb595a091b5cafb949adeb0cee1cafbdbe8a4a8a18ba384c995ca94c388bf8688c19aa5bcebb2bef00d0d02022aa5cf8d8be3dc988f83a7be9c9a90c28980f7a09cbfd1eb92bb8b90eba3b581b088d09ecef3dab3a687c4c0eea8f7a8b01602020203e096b7cde2aad19785b28f8b96ca91a2df84ffb4dcd8d392addcc68fbbc3f6e7eaa6aaaeb5f5d48f97849a8cc88ad9d988c00b02020203aea898d3cbdeabccf7e4fcdbf88c89d0fea0c99981dbbef59ca6fcd8ee8e8ea1b48ca8e598a1bcb3a6ecd5d5b0f9dcbba01600020272e18ef8cd978896ab8ca5a9e8c8cfcefdb8ed80e2ffc7d4aefee9cd899dd5dd968ead82efe0bae1d3d9ca94a798d9e580c01614010201bbd8c388ea8cc089a5a2dc83feefdbdaaec8fc90a1b6a08b9fd3a7e2f2d0aac2bbb1b18190c18dc4a6c5d589f3d0e8cfc7a8160e010215f2c5cd8ff0c2c098cbb8e8ba89d092e88fbdbf8993d0ecc7a6deccadf9b18bb3a6c8adee8becf9e283d08c9c9caf9efb900e0d01023dd1aaf5f59c8bc5a4e9df9eb886e295e98899af8fa7e98c93e1f6c7dde197b4befc8aeee1f2cec1cff7d492fbbab1a6ce140c01023a93a3958ceae7fbbda8d6a4e2a49a9284b09df4e2b9d0cbb39cc4d79ae3d598e9da99cdc4a7b797fc9bc3dce1aeb6ea820e0c010229eaf7de90e28a90a9e9f6e492879fc7c8d4a2ffbf81, 0x1d001088f849ea3c29ae5c1edbcada2acfda9de8edf9383eaa1cfbbd3aeb0cddfe7a5fec29ba5b8deaaebcdadcffd8017b3aa2ada8554b69f49c0a501058781b491f6e3a097caddf4cf82eaf882cbe1feec8fd3efbea9d4f7b9c29fa9f4a4d1fbd28dbe869bd595bbb801bdd202c88301a3890280a410ed8e2399893be2dc318893000b8fdddbb4becd9395a6c8b8c0a5b5d1cbba9791a49fd29c91a8fddb86eca5f8989d88d3dadbe2cefca0c9c7d9d001dfcd039dfa0699a906efca20dcdc3ff2dd04b2a92eaa82000683e5f8f5aabc89a9a0d7ce809b95b3cbc19fe7e9b0b6caeaa8b5eca9afaad4ed93eba5ecdc98feac8290f8f2b006b2ef09dc886ad4ee0186f18904e8fc0898b733ddf5469eca0001ded9a8fc8490929aefbea996e19fca9c92a09ca6ebc39bb1a6fdbcfcb2eeeeb488c4b8b7a5e1a1c4dd8d9bc8f801bf9703b39004cf9e07f1cc0dd8af18d1f83c80dc2fb98400138edea8d0deb2bfe8dbd4a4a886969a8cde8a89c0f8dbf5cef7adde888985df86e9b0d595b5d4eed9a2faa9b022b1c040c3b577bbab64bc9311e3c921bc8c3eddf235d5d60001e4dd808bbca3dddfe7a8fbb9c4efcd98caa4b1c2fbcf93d683a49fa490e880b4b5e9f891e9d5dcee8683e7c0160e020256b182c08dcb8bd980d8a5f49481c8fdaafe97dcc4dec6c5c9b2eec3bb9aebacb5e1ffb0fea7b7e8dbc1c7fcde93fb92b8, 0x104c9cb06aa844db5d05e87910103c0bbe5aece97b7da92eeede8caf5a4df90aafa87b2eecba690ccdae4c3d19fedce8b93e6c58c9099e3c9a9a2e832999263e2812a92c619c4] private def node2353:Certificate:=PackedParametricCertificateData.decode 11 data2353 private def node2354:Certificate:=.split node2328 node2353 private def data2400:List Nat:=[ 0x1130f0e0e130a11090b0908080e040f000d0003000a061202040602020311020c02030c0006040a03130405020206030403150e0e0e130d0b0908080e0303030b010b000a000a150e0e0e130d0b0908080e0303030b010b000a000a150e0e0e130d0b0908080e0303030b010b000a000a061216090c0212000c0416030702010e0020032403130404020202030110120908061c041e041e0401150e0e0e130d0b09080815030e030b010b000a000a150e0e0e130d0b09080815030e030b010b000a000a150e0e0e130d0b09080815030e030b010b000a000a061208050600060308030702010e0020032403130404020202031304020202020310120908061c041e041e0410040002020603010e0402020206030d04090601020306031515130d130b0e0b130a0e090a080904110104010a1515130d130b0e0b130a0e090a080904110104010a1515130d130b0e0b130a0e090a080904110104010a0612080506000603080311020c02010c001e04220313040402020203130402020202031515130d130b0e0b130a13090e090d081101091515130b0e0b130a13090e090d0813041101091515130d130b0e0b130a13090e090d0811010906120803060018031a030c060202010a0026042a030506030200040304030a0c0208010600040412030110040002020603100402020202030e0402020206030d040906010203060301, 0x11715170e0e0e170b130b130a0b020a02020213010a1715170e0e0e170b130b130a0b020a02020213010a1715170e0e0e170b130b130a0b020a02020213010a060d080a08030600200422041711130d130b0e0b130a11010c010b0102010e000a1711130d130b0e0b130a11010c010b0102010e000a1711130d130b0e0b130a11010f010b0102010e000a06130f150e130d0b09130302020f000b000a0002000a130f150e130d0b09130302020f000b000a0002000a130f150e130d0b09130302020f000b000a0002000a0601011310070202060309040204010203060410020002020204130f0e0e130a11090b0908080e040f000d0003000a130f0e0e130a11090b0908080e040f000d0003000a] private def node2400:Certificate:=PackedParametricCertificateData.decode 11 data2400 private def data2424:List Nat:=[ 0x101021facbdf9a8d0b297cbb3c5a98180a0a8f7b00e0e00020190d883f2ac8fd8c2ba8199d5fba3c881d8130d00022985afe7b782b08aeec5d4cec6e981ecf8130b000201998fab9bd1b498ebf2fdfd84d9c4a09ed8150a00022df38fdbdebcf9a4f7cffffbbdeadcc8e80e0a000222bbeca4df97e68ebe9da4ccfad6a2b198f40b0a000201acba89f7a0c59cdbb49792f2b2b6a49681f61502000201ddafefeccd8882be85fc8982cef6dfc7880e02000207eec4c1dd95c2dd8fb3d5b9a6dfc0a08eec0b0200023dfaf5ca98c4fb81aac696beead7af83b9b2020200021feee7e988b2f3b2d2fc95dce1f691bff9981e1b8bb0a1e6f6cea4a4dcc4000d080a08030600200422040b0205060202040109040204010203060410020002020204070201060002030804060602080002030a040e0e130d130b0e0a0b0a110715020e020b0202020a0e0e130d130b0e0a0b0a110715020e020b0202020a0e0e130d130b0e0a0b0a110715020e020b0202020a060d080a0803060020042204130f150e130d0b0a0b090a040202150101010a000a130f150e130d0b0a0b090a040202150101010a000a130f150e130d0b0a0b090a040202150101010a000a060a020902040403020401130404020202030904020401020306041002000202020407020402020204060603020206030804010d180a0e060e040204180308020002020204, 0x1a9afc1d9b383980202000201b0ae96a4bae9f9ba84e5a8fafbd1f7d7dbe41e019e87bfee8aa2ccabe9cdd4000a040306010c00080416040b02010600120314042bd50180a80b9de802a9c97dd402bd994ec7f010f5c1003caceee28c87fdbfac84f3cda84a80d50196c2e205a8b801ecf81bca9e39ae8502ed990181cf001aafe0c5d9e3a3de81f4c3b0130d02021c9ff8a8fab0f4b3e1f7e88780c5d0d2e8130b020259bef3c8fbe4b2e1b9c7e1d384ffffcd980e0a020219a0f7cce188c9e381889dd1e6efd1e7e2a00b0a020201b9cadabcc1aa8ab2e38facffbbb3abfff4861502020201c5cefebba8f7eea8eccba4c2908eb6c3a00e02020209c9e4bbf29acec5b6cab29296e4fde7d1d00b0202023d87ace3b8c9ae95d2e6a6d4f3b999ace6b2020202021ea9f1cd9a9bf1aba7d598f8c9dca1a4a8e00e0e010201e590e6f78585d493e6c7e5e391f7bdd2e0130d010229c2bfbde7eaeedc82c6abbfc0aa94c0d8130b01020181d5beebfcb9fcd0ed8980dc9dbae5c6e0150a010211ef9499d4baa0d0e5eda584dd98ab8ae00e0a01021cb9ac9490ed9baea4aea8f9cfbabd9d9d920b0a010201b2b0d8e3dd9cec95e5b1cb9aba93d98a99fa1502010201d8c4e19b83a3b28981bd90b385f4a2c8e80e02010207ffb1ccabc7faa5a8a980e9e7e2f0c3a29e0b0201023dc4ef9f9b9086e8dce9e7deb4e1fc9dc3d60202, 0x1b89b88c7f6130b020204cac091d8bccd8eedfac1a6928a8cff8db00e0a02022ed1d4a2f5e193d28380e6b282e5f998d1d20b0a020207f5ec92cedab482d2ff9dccf0d4beaca08afe020202020185d0b6b4cd8da687f19580828ab988b4ac90161501021ed4efc5c1d5c38e84e7b5eff0af83e6f7a4160e010201d893e5dceec8e2dadda8e7b285cdb1b394c40e0e010208d6c0d1e092cbf8eab98185bd91dff6d680130d010201d7e6c2ebdae2c1acd696a2d8c38bf3fca0160b010206c3dbdfed9aecc1dbd3ebdeb1cbd1be97eec4130b010206c99a94d389e0bdeaf1c6e2ecbfd5c2d0c00e0a01023fd0b2df8df188bab68baadfca959c8aa1c20b0a010207d380c38892b8f4e5e5b8c2b1c8ee8cc7abd6130201020887faafaafcc48bddbc88f6afebbbcaa8c40202010201a0aa9b8bddedd5dbb7c0d3cc8881d481b1f8161500022aaae2c491b7b9f2efd0fcb8ceffc9c4dc90160e00025690afc0f7e0edb7b5fcdaf9e7ec9deeb3b00e0e000207c5c9c8b1a9de87bac28395acf5faa1a590130d000201cea1c58dc0e2a0d4e0abe1bb8581b38f94160b000206e5e3ddc1ebec9181d8b8bfec80b08ddf8ce0130b000207ceacc5aba7c8919cd6a9f3988bdfbbb5dc0e0a00025cfd88f9d8b8b6dca5fdc5d8b6c18b8abc880b0a000207b5fa85fcf3da93dde887c5f682aebca293b8130200021b8bf496a4b1c499e88195, 0x13ab10197aa07bcf009859501b3fa03c2a14fb1ca11e09d0003cbe2f3d58d88efb5afbe9eb8fc429b810186f3ee04939e4a860df8a81dcef97ce91ff80078e4a7c5f5f49ab3c184fcc01615020217edfadcf6d6b8c4ffafd89b858ba0b3a6c0160e020202d795e4b1fdf0fe92888cabcfdeebb9f4efba130d020201929b9297ff94b6ccc8a3fbc2bd86adde90160b020205f9dc9a8fc5e3c8bf8f91e589e1] private def node2424:Certificate:=PackedParametricCertificateData.decode 11 data2424 private def node2425:Certificate:=.split node2400 node2424 private def node2426:Certificate:=.split node2354 node2425 private def node2427:Certificate:=.negative 1 [(1,0),(1,7)] node2426 private def node2428:Certificate:=.split node2277 node2427 private def data2479:List Nat:=[ 0x10809060c020e010c010a010a060d0a0a060206000e04100313020906012a0066047403070205080008030603010f06010202020401150e150d0e0b110a0e0908080d020a020e010a010a150e110c0e0b150a0e0908080a020e010d010a010a150e150c0e0b110a0e0908080c020a020e010a010a060d0a0a060206000e04100313020906012a006604740305060302000403040305020204020203150e150d110c0e0b0e0908080d020a020e010a010a150e110c0e0b0e0908080c020a020e010d010a010a150e150c110c0e0b0e0908080c020a020e010a010a060a040306010c000804160313020906012a0066047403050603020004030403050202040202030110040002020603010e0402020206030d0409060102030603110f150e0e0b0b090808090412020f0208020e010a110f150e0e0b0b090808090412020f0208020e010a110f150e0e0b0b090808090412020f0208020e010a060d0a0a060206000e04100313020906012a006604740305060302000403040313040202020203110e0e0b15090b090f080b0412020f020e0209110e0e0b15090b090f080b0412020f020e0209110e0e0b15090b090f080b0412020f020e0209060a040306010c000804160313020906012a0066047403050603020004030403130402020202030110040002020603100402020202030e0402020206030d040906010203060301, 0x114141713170e170b0b0b140a0e020a02020214000a14141713170e150a140a0e020a0202020814141713170e150a140a0e020a020202080613020002020204140f170e150e130b0e0b150a0e010a01080102010a140f170e150e130b0e0b150a0e010a01080102010a140f170e140e130b0e0b150a0e010a01080102010a06140f170e150e130b0e0b150a0e010a01080102010a140f170e150e130b0e0b150a0e010a01080102010a140f170e140e130b0e0b150a0e010a01080102010a060101130404020202030a0208020204010204060410020002020204150f140f150e0e0b0b080f050b0305030e0108010a150f140f150e0e0b0b080f0508050e01080103010a150f140f150e0e0b0b080f0505030e01080103010a060d020a020406000204040313020906032a0012042003130405020206030403110e150d0e09080809060e020d020d010c010a010a150e150d110d0e09080809060e020d010c010a010a150e110e150c0e0908] private def node2479:Certificate:=PackedParametricCertificateData.decode 11 data2479 private def data2504:List Nat:=[ 0x1cfde9ef988d0e1b1c3ff97faccb883f7aeb2de800e0a000240e5e1ebeddfa1bd92d6b2d2ded49f97f6979091839ab00b0a000208e0e7dac9de85aca58aa8bff585b6f9e1c3fca6f1ace00b07000207f2d1a9bbac83d7efa4b3bdece4e6e8f4fd8bbdf1c5a00e02000219c494f8c9ca86bb8bfed6fd97efedeea4dbd4a6a3de900d02000204e8d9e6cef094b9cc8ee6958bf9dee1bab696e9cca9800202000212e780c8c7e9f5e88497e19dfca79cbda5e28ca8d3a6c01b13ede494cabcd3ddf4eed3e9fdc0ddb000130200020202040c020a02050c030404010a020802020401020406041002000202020408020602010c000404100408060706020e00080416041414140c0e0b0e0a0b0a15070e02070202020a010a14140e0a0b0a15070e02070202020a010814140e0a0b0a11070e02070202020a01080613020002020204150e150d0e0b0b0b0e0a0a030d010c01020100000a150e150d0e0b0b0b0e0a0a030d010c01020100000a150e150c0e0b0b0b0e0a0a030e010c01020100000a06150e150d0e0b0b0b0e0a0a030d010c01020100000a150e150d0e0b0b0b0e0a0a030d010c01020100000a150e150c0e0b0b0b0e0a0a030e010c01020100000a060101130404020202030a0208020204010204060410020002020204080206020404030404060603020206030804010d1c091406060506041c0308020002020204, 0x1dc8baaf2c7aef0b7d882efc003f1e503f0f250c99a6ca1f00489cc0489cb45f8f762facb0019e886bac992b788adbab5ccf5c998f9c0141402020abbee92ca9d98db87e3b1fee6d0cc84b5cda3d1a0c0140c0202019fe09dfba3e9a3c1b6dd9cd7c49783d9e8f3b28c800b0b02023481abf7d3dfc980b7c483f4e881b897dfe3e49c800e0a020240b8f5e590838d90c0979ef3ee81f783f7a1e9cfe6ade00b0a020209b4d8e8ccf2b8c5b8e3a3a39aaf99b0e6d6f5fbe69de00b0702020596badeae81ee969090889582b3fd94bec8edb4a9e4e00e02020218df8be3ac809ad9c9e0ce9cc0d8b8a08290a28393cae00d02020204c5a485f5afb28aa0fbf5928ef183b5dcefb1bba583800202020212e981fc94d5f8bd8de59ac1dde18cc3ec92f899e2a6c01414010211dac19289d8d39882b8b39bdef2c6a6dac089b4bfe0140c010202c6bce9f08bf09ede86c8f6a4f8c297b686a7bb800e0a010241adf899c5b49dbfeeb38bd999b1f8b683b79faec9e4b60b0a010207a7d6becb8d9ed284b8a88295c2acf3e8d7e2b98bb5b80b0701020ba386c5eb879dbac0d2f8eaf1b5c9cbc8defc8792b1e80e02010219f8fe8d939cdd85c4bccbfa9ebe8cdfa4d9eafcc591f20d020102059fb1d6a6f5ca97a1b89fb8bbeebdd5ccfcb8f389ad80020201021284c8c48385aecec2a3e99aaed8c5b3bdd6c3fdd48fc0141400021386, 0x10e0a020203d2c4edaef0edf1c191b99ff498c8babb94900b0a020231b8d5f487d4e8fbe8d9a0e8e0ec9bede7f0020202024db4cce6c28b948ad0cdc9a6cabee3ca90a0141401025399e8c69ffd8dbaefb8a5b1e4daa4da80161301024bdaf296e3fdc986d3e8fbe4f0fdf2a48d80160e0102039faaed919fcdf195f0f7adbbe48fdafff080140c010223e985bfb2b5fbfecbcece9eecad9a80160b01021ab2f1a8f6d9be9cb2b4f0b7d7949198b8e00e0a010203d8ab8cc5b4afe6d0cbe6fdb7c5e79db6f9c00b0a01022da6cdb2e3df9ed8bdd28cfcb9a5efe5ff800202010253e6bedbfb82c38381dd83e6d6dbf8e7d6a0141400023fc6b79edcf1a3dffffcf1ca89a0f19e801613000251f4e7a88bcb90ac89a0fa96a9ebe3ade4c4160e000203a9c3ed8c96b4fe8892ffa09cac95c0ce89bc0e0a000203d1bcb3e890b380a6b6fc9fac9e95e4dae6a60b0a000233c4d0b3ef86cc9ea3e3e5ecd7fcc28dfbda1608000203e1c4aebdbcebd18a90939da2c889a1a9941502000201b1edcf9dd7d3f68a95df84e2d2b6f9fc80020200025dcfebeb88b88bc681a3fbced786ccab8cac1b019bd6c988a1c9d0c0bed9c0000b0803060118031a040c020a02010c002404280404eaf104eaf247fda662bcbc010190fabba0f5dffa93b7b4a8c8c89d9be0c035ac34ff01ba8e26db01f7d901f7da47b4ac2f99e1000e9be8ccbcaf, 0x10396970396986af8d63ae383010981858fded6999fffc6849dc0398a38db0187ae038df701fccf01fcd044bce4329e810001ca81d494deb197e7d1fba3e7e0141402021c9fdadb89bce4cae795ef9ad6accd8e801613020249fceddc84c290a2c8ffb6f7aaa5e0a9ce80160e02020399bdccb3eebfd3bfebddf397f4cadad6aaf0140c020209feca8cb5b1a988bdc1e1b7828f87a680160b02021be1bc8793f78eceb5d882a7a3ce94f983d00b0b02020397dc84cd9eeacae7f6cda0e8d8cc9ca0] private def node2504:Certificate:=PackedParametricCertificateData.decode 11 data2504 private def node2505:Certificate:=.split node2479 node2504 private def node2506:Certificate:=.positive 1 [(1,2),(6,11)] node2505 private def node2507:Certificate:=.negative 1 [(1,0),(1,7)] node2506 private def node2508:Certificate:=.negative 1 [(1,0),(1,6)] node2507 private def node2509:Certificate:=.split node2428 node2508 private def node2510:Certificate:=.split node2084 node2509 private def node2511:Certificate:=.split node1979 node2510 private def node2512:Certificate:=.negative 1 [(1,0),(3,2)] node2511 private def node2513:Certificate:=.split node1878 node2512 private def data2524:List Nat:=[ 0x1151515131111130e180a150a0b0a1809180209151515131111130e180a150a0b0a1809180209151515131111130e180a150a0b0a1809180209060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311040c0804020302040803100400020206030f08080607060212041a030e0402020206030f2c0c020206011204120308020002020203] private def node2524:Certificate:=PackedParametricCertificateData.decode 11 data2524 private def data2534:List Nat:=[ 0x115151513130a110a180915090a091808080818020a15151513130a110a180915090a091808080818020a15151513130a110a180915090a091808080818020a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060311040c0804020302040803100400020206030f08080607060212041a030e04010200020308030f0c0002020203] private def node2534:Certificate:=PackedParametricCertificateData.decode 10 data2534 private def data2589:List Nat:=[ 0x118080908150413040e040804130208020a1515180f18080908150413040e040804130208020a1515180f18080908150413040e040804130208020a0610040a02010a0004040e030c02090201120030043603010a0208020204010204060315151513180f1808040418021502130102000915151513180f18081802150213010715151513180f18081802130106061710030600100312031404030202020315151513180a18091808150709070404130207020a15151513180f180a1808150713020715151513180f180a18081507130207060a040306010c00080416030c02090201120030043603010a0208020204010204060301100400020206030115151513180a18090909180815081307070707040a15151513180a180815081307070713020815151513180a1808150813070707130208060a040306010c00080416030c02090201120030043603130404020202030a020802020401020406030c020202020203100400020206030b0200020202030115151513111113090a09090913080808080713020a15151513111113090a09090913080808080713020a15151513111113090a09090913080808080713020a060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030c0403020102030403100400020206030b0200020202030e040b0609020006040a0301, 0x115151513160f150e11060f060a06060201010915151513160f150e11060f060a06060201010915151513160f11060f060a06060201010806120803060018031a041515151315080f060a0606020f0108010301091515151315080f060a0606020f010801030109151515130f060a0606020f01080103010806120204060202040110060e0205060224040e04121c0e140b060a06041c0310020002020204151515130f060806080406020f010801040009151515130f060806080406020f010801040009151515130f06080606020f010801040008061515151315080f060806060211000f00080009151515130f0608060804060211000f000800091515151315080f0608060602080111000f000906011404030202020310060e0203060302040e040b040a04010e040e0310060e0601080308040115151513180f1808040413010801060109000915151513180f1808040413011201060109000915151513180f1808040413010601070615151513180f1808150404031301040102000915151513180f1808150404031301040102000915151513180f1808150413010401070601141004020206031515180f] private def node2589:Certificate:=PackedParametricCertificateData.decode 10 data2589 private def node2590:Certificate:=.split node2534 node2589 private def node2591:Certificate:=.split node2524 node2590 private def node2592:Certificate:=.positive 1 [(1,0),(2,12)] node2591 private def node2593:Certificate:=.positive 9 [(8,0),(3,4),(8,11)] node2592 private def node2594:Certificate:=.positive 4 [(1,0),(1,1),(6,9)] node2593 private def node2595:Certificate:=.positive 7 [(5,0),(4,6),(6,8)] node2594 private def node2596:Certificate:=.positive 3 [(3,0),(2,2),(4,7)] node2595 private def node2597:Certificate:=.positive 3 [(1,0),(2,6)] node2596 private def data2608:List Nat:=[ 0x1151315111111130e180a0b0a18091109180209151315111111130e180a0b0a18091109180209151315111111130e180a0b0a18091109180209060a040306010c00080416030c020902011200300436030506030200040304030a020802020401020406030b060502020203100400020206030f08080607060212041a030e0402020206030f2408020206011004100308020002020203] private def node2608:Certificate:=PackedParametricCertificateData.decode 11 data2608 private def data2623:List Nat:=[ 0x11515120a0f0a0b091504130409040a03040308020a1515120a0f0a0b09130409040a030403080204010a1515120a0f0a0b09130409040a030403080204010a060f0201020202030c020902011200300436030506030200040304030a0208020204010204060315111311130a120a11090a0909080804180111010a1511130a120a11090a09090808041103180111010a1511130a120a11090a09090808041103180111010a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030f08080607060212041a030e04010200020308030f0c0002020203] private def node2623:Certificate:=PackedParametricCertificateData.decode 10 data2623 private def data2683:List Nat:=[ 0x1110e0a09180811081302120208020a060f0201020202030c02090201120030043603010a020802020401020406030c020202020204100400020206030115111311110e0a091808110809080703130208020a15111311110e0a091808110809080703130208020a15111311110e0a091808110809080703130208020a060f0201020202030c02090201120030043603130404020202030a0208020204010204060315111311110e0a091808110809080703130208020a15111311110e0a091808110809080703130208020a15111311110e0a091808110809080703130208020a060a040306010c00080416030c02090201120030043603130404020202030a0208020204010204060301100400020206030b0200020202030115131111130e0a0a120908080e040403080213010a15131111130e0a0a120908080e040403080213010a15131111130e0a0a120908080e040403080213010a060f0201020202030c020902011200300436030506030200040304030a020802020401020406031511131111110a0a12090a0908080804130111010a151311110a0a12090a09080808070804130111010a151315110a0a12090a09080808070804130111010a060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030b0200020202030a02000202020301, 0x1060a060602080103010a15151311110e0b0b11080f060a060602080103010a15151311110e0b0b11080f060a060602080103010a0612020406020204010f020206020204121c0e140b060a06041c030c040302010203040415151311110e0b0b11080f06080606020e0108010a15151311110e0b0b11080f06080606020e0108010a15151311110e0b0b11080f06080606020e0108010a06151513110b0b0a0911080f0608061103060208000a151513110b0b0a0911080f0608061103060208000a151513110b0b0a0911080f0608061103060208000a060114040302020203151513110a0911080f06080611031302120208020a151513110a0911080f06080611031302120208020a151513110a0911080f06080611031302120208020a060f0201020202030c02090201120030043603010e040b040a04010e040e030c04030201020304040115111311110e09091808090213011201080103010a15111311110e0b090909180809021301080103010a15111311110e0b090909180809021301080103010a0615111311110e0b090909180811030902080003000a15111311110e0b090909180811030902080003000a15111311110e0b090909180811030902080003000a06011410040202060315111311180f110e0a09180811081302080206020a15111311180f110e0a09180811081302120208020a15111311180f, 0x115111311160e110e0b0b11080f060a06060201010a15111311160e110e0b0b11080f060a06060201010a15111311160e110e0b0b11080f060a06060201010a06120803060018031a0415151311110e0b0b11080f] private def node2683:Certificate:=PackedParametricCertificateData.decode 10 data2683 private def node2684:Certificate:=.split node2623 node2683 private def node2685:Certificate:=.split node2608 node2684 private def node2686:Certificate:=.positive 1 [(1,0),(2,12)] node2685 private def node2687:Certificate:=.positive 3 [(2,0),(3,3),(2,11)] node2686 private def node2688:Certificate:=.positive 4 [(1,0),(1,1),(6,9)] node2687 private def node2689:Certificate:=.positive 7 [(5,0),(4,6),(6,8)] node2688 private def node2690:Certificate:=.positive 3 [(3,0),(2,2),(4,7)] node2689 private def data2706:List Nat:=[ 0x10e0e0b090a08080812040f040e0404030b0108000a0e0e0b090a08080812040f040e0404030b0108000a0e0e0b090a08080812040f040e0404030b0108000a060b08090601060308030c020902011200300436030506030200040304030a020802020401020406031211130e100d100c130b18090b0910031802091211130e100e100c130b18090b091802100009100f130e100e100c130b18090b091003180009060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030f08080607060212041a030e0402020206030f2408020206011004100308020002020203] private def node2706:Certificate:=PackedParametricCertificateData.decode 11 data2706 private def data2767:List Nat:=[ 0x1110e100e0e091108090810030802060203020a100f110e100e0e091108090810031202080203020a100f110e100e0f090e09110809081003080203020a06010c02090201120030043603010a020802020401020406030c0202020202041004000202060301100f110e100e0e091108090810030703080203020a110f110e0e0918081108090810030703080203020a110f100f110e0e091108090811031003070308020a060b0206060202030c02090201120030043603130404020202030a020802020401020406030c020b0604020302040404100400020206030b020002020203011513130e09090f040e040a0408021301100108000a1513130e09090f040e040a0408021301100108000a1513130e09090f040e040a0408021301100108000a060e060708050401020406030c020902011200300436030506030200040304030a020802020401020406030e020b040402030204100400020206030b0200020202030a020002020203010e0e130a0b09080812040f040a0304030b0108000a0e0e130a0b09080812040f040a0304030b0108000a0e0e130a0b09080812040f040a0304030b0108000a060a1e081c07080112041e030c020902011200300436030506030200040304030a020802020401020406030b060502020204100400020206030f08080607060212041a030e04010200020308030f0c000202020301, 0x1110f160e110e100e1108100808061103060201010a06120803060018031a04110f110e100e11080f060a06110306020e0103010a110f110e100e11080f060a06110306020e0103010a110f110e100e11080f060a06110306020e0103010a060f020102020204010f020206020204121c0e140b060a06041c0310020002020204110f110e100e11080f06080611030602130108010a110f110e100e11080f06080611030602130108010a110f110e100e11080f06080611030602130108010a060f02010202020414040302020203110f110e100e11080f06080611030802030209000a110f110e100e11080f06080611030802030209000a110f110e100e11080f06080611030802030209000a06110f110e100e11080f06080611031302120208020a110f110e100e11080f06080611031302120208020a110f110e100e11080f06080611031302120208020a06010c02090201120030043603010e040b040a04010e040e030c040302010203040401110f110e100e18081108100811030902130108010a110f110e100e18081108100811030902130108010a110f110e100e18081108100811030902130108010a060f02010202020414100402020603100f110e100e0e091108090810030802060203020a100f110e100e0e091108090810031202080203020a100f110e100e0e091108090810031202080203020a06100f, 0x1110f160e110e100e1108100808061103060201010a110f160e110e100e1108100808061103060201010a] private def node2767:Certificate:=PackedParametricCertificateData.decode 11 data2767 private def node2768:Certificate:=.split node2706 node2767 private def node2769:Certificate:=.positive 1 [(1,0),(2,12)] node2768 private def node2770:Certificate:=.positive 1 [(1,2),(2,11)] node2769 private def node2771:Certificate:=.positive 2 [(1,0),(1,1),(2,10)] node2770 private def node2772:Certificate:=.positive 7 [(5,0),(4,6),(6,8)] node2771 private def data2788:List Nat:=[ 0x10e0e0f0a0b090f08080813041204090404030b010a0e0e0f0a0b090f08080813041204090404030b010a0e0e0f0a0b090f08080813041204090404030b010a060b08090601060308030c020902011200300436030506030200040304030a02080202040102040603120e0e0e0f0a11090b090b040f020f000b0009120e0e0e0f0a11090b090f040b040f020b0009120e0e0e0f0a11090b090f040b040f020b0009060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030f04060c02120316030e0402020206030d0806120212011004180308020002020203] private def node2788:Certificate:=PackedParametricCertificateData.decode 11 data2788 private def data2849:List Nat:=[ 0x115080b08090811060802060212010a13110e0e0c0b150811080b0811061202080212010a131112110e0e0c0b15080b0812020602120108010a06010c02090201120030043603010a020802020401020406030c020202020204100400020206030113110e0e0c0b15080b08090811060802060212010a13110e0e0c0b150811080b0811061202080212010a131112110e0e0c0b15080b0812020602120108010a060b0206060202030c02090201120030043603130404020202030a020802020401020406030c0e0a060406030a041004100400020206030b020002020203011513120e0e0e0a0a0f080808130404040f0202020a1513120e0e0e0a0a0f080808130404040f0202020a1513120e0e0e0a0a0f080808130404040f0202020a060b04070605060304030c020902011200300436030506030200040304030a020802020401020406030e0c0c0c0a120516041604100400020206030b0200020202030a020002020203010f0f0e0e120a11090b090f0808081304090408020a0f0f0e0e120a11090b090f0808081304090408020a0f0f0e0e120a11090b090f0808081304090408020a060a1e081c07080112041e030c020902011200300436030506030200040304030a020802020401020406030e0c0c0c0a120516041604100400020206030f04060c02120316030e040102000203080306060206000403040301, 0x1060101010f000a06120803060018031a0413110e0e0c0b150809080e0309020301010100000a13110e0e0c0b0b0809080e0309021501030101010a13110e0e0c0b0b0809080e0309021501030101010a0612080e0c03060124042604010f02020602020412100e0e090603100310020002020204131112110e0e0c0b0b0809080e030902080103010a131112110e0e0c0b0b0809080e030902080103010a131112110e0e0c0b0b0809080e030902080103010a0612080e0c03060124042604140403020202031513151213110e0e0c0b15080b080908130112010a1513151213110e0e0c0b15080b080908130212010a1513151213110e0e0c0b15080b080908130212010a06131112110e0e0c0b15080b0809081302120212010a131112110e0e0c0b15080b0809081302120212010a131112110e0e0c0b15080b0809081302120212010a06010c02090201120030043603010e040a02080201080408030c04030201020304040113110e0e0c0b0b08090811060e030902080103010a13110e0e0c0b0b08090811060e030902080103010a13110e0e0c0b0b08090811060e030902080103010a0612080e0c030601240426041410040202060313110e0e0c0b15080b08090815060802120103010a13110e0e0c0b11080b08090815060802120103010a13110e0e0c0b11080b08090815060802060103010a0613110e0e0c0b, 0x113110e0e0c0b0b0809080e030602060101010f000a13110e0e0c0b0b0809080e030602060101010f000a13110e0e0c0b0b0809080e030602] private def node2849:Certificate:=PackedParametricCertificateData.decode 11 data2849 private def node2850:Certificate:=.split node2788 node2849 private def node2851:Certificate:=.positive 1 [(2,0),(1,3)] node2850 private def data2867:List Nat:=[ 0x10e0e0f0a0b090f08080813041204090404030b010a0e0e0f0a0b090f08080813041204090404030b010a0e0e0f0a0b090f08080813041204090404030b010a060a060902080401040406030c0209020112003004360313040402020203090402040102030603120e0e0e0f0a11090b090b040f020f000b0009120e0e0e0f0a11090b090f040b040f020b0009120e0e0e0f0a11090b090f040b040f020b0009060a040306010c00080416030c020902011200300436030506030200040304030a0c02080106000404120301100400020206030f04060c02120316030e0402020206030d0806120212011004180308020002020203] private def node2867:Certificate:=PackedParametricCertificateData.decode 11 data2867 private def data2928:List Nat:=[ 0x1110e0e15080b08090815061106080212010a151313110e0e11080b08090815061106080212010a1513131112110e0e11080b0809081506080206010a0615130e0e15080b080908110608020602130112010a15130e0e11080b080908110613021202080212010a1513131112110e0e11080b0809081302080206010a06010c02090201120030043603130404020202030904020401020306030c0e0a060406030a041004100400020206030b0200020202030115130f0f120e0e0e0a0a08080c0202020e000a000a15130f0f120e0e0e0a0a08080c0202020e000a000a15130f0f120e0e0e0a0a08080c0202020e000a000a0615130f0f120e0e0e0a0a0808130404040c0202020a15130f0f120e0e0e0a0a0808130404040c0202020a15130f0f120e0e0e0a0a0808130404040c0202020a06010c02090201120030043603130404020202030904020401020306030c0607060508030804100400020206030b0200020202030a020002020203010e0e120a11090b090f080808130409040f0208020a0e0e120a11090b090f080808130409040f0208020a0e0e120a11090b090f080808130409040f0208020a060a1e081c07080112041e030c02090201120030043603130404020202030904020401020306030c0607060508030804100400020206030f04060c02120316030e040102000203080306060206000403040301, 0x10306020f01060101010a13110e0e0c0c110809080e0306020f01060101010a060b0803060118031a041513131112110e0e090815030e030902030101010a1513131112110e0e090815030e030902030101010a1513131112110e0e090815030e030902030101010a060b0803060118031a04010f02020602020412100e0e090603100310020002020204131112110e0e090815030e0309021301080103010a131112110e0e090815030e0309021301080103010a131112110e0e090815030e0309021301080103010a060b0803060118031a0414040302020203151213110e0e0b0a15080b0809081302130112010a1513151213110e0e0b0a15080b080908130212010a1513151213110e0e0b0a15080b080908130212010a060b04070605060304040c02090201120030043603010e02090201040304030c040302010203040401151313110e0e11080908150615030902080103010a151313110e0e09081506150309021301080103010a151313110e0e09081506150309021301080103010a060b0803060118031a0414100402020603151313110e0e15080b08090815061106080212010a151313110e0e11080b08090815061106080212010a1513131112110e0e11080b0809081506080206010a060b0206060202040c02090201120030043603010904020401020306030c0202020202041004000202060301151313, 0x113110e0e0c0c110809080e0306020f01060101010a13110e0e0c0c110809080e] private def node2928:Certificate:=PackedParametricCertificateData.decode 11 data2928 private def node2929:Certificate:=.split node2867 node2928 private def data2946:List Nat:=[ 0x1150d130d180b0d0b18090d0908021200090009150d130d180b0d0b18090d0908021200090009150d130d180b0d0b18090d0908021200090009061811130d180b0d0b18090d090f0818020400091811130d180b0d0b18090d090f081802040009130d180b0d0b18090d090f081802180104000906010b02010600120314030502040200020302031204090c020e031203110f0f0f130d0d0b18090d090f081204180209110f0f0f130d0d0b18090d090f081204180209110f0f0f130d0d0b18090d090f081204180209060c180708031601380442030b020106001203140313140602050203080312040a0c020a000404120301100400020206030f04060c02120316030e0402020206030f120d02010403060308020002020203] private def node2946:Certificate:=PackedParametricCertificateData.decode 11 data2946 private def data3008:List Nat:=[ 0x109150d0b091508090815030e030b02080109000906150e0e0e150d0b09110809081503080203010b000a150e0e0e150d0b09110809081503080203010b000a150e0e0e150d0b09110809081503080203010b000a06010b0201060012031403130404020202031204090c020e0312030c0e0606040a0306041004100400020206030b02000202020301150d130d0b090f0808080e030b010d000a0009150d130d0b090f0808080e030b010d000a0009150d130d0b090f0808080d040e030b010a000906130e120e0e0e150d130d0b0908080a040b0002000a130e120e0e0e150d130d0b0908080a040b0002000a130e120e0e0e150d130d0b0908080a040b0002000a06010b02010600120314030502040200020302031204090c020e0312030c08060605060404040a04100400020206030b0200020202030a02000202020301120e130a120a0b0a0a090b0809080202110109120e130a0b0a0a090b080908020211010a0009120e130a0b0a0a090b080908020211010a000906130e130a120a0a090b0809080202110111000b000a130e130a120a0a090b0809080202110111000b000a130e130a120a0a090b0809080202110111000b000a06010b02010600120314030502040200020302031204090c020e0312030c0607060508030804100400020206030f04060c02120316030e04010200020308030f0c000202020301, 0x103060101010900091615150d0b0915030e03030306010101090009060a040306010c0008041604150d0d0b0b0915030303150113010301090009150d0d0b0b0915030303150113010301090009150d0d0b0b0915030303150113010301090009060b0803060118031a04010f02020602020412100e0e090603100310020002020204150d0b09090815030e03130108010900010009150d0b09090815030e03130108010900010009150d0b09090815030e03130108010900010009060b0803060118031a0414040302020203150d0b091508090815030e030b020801090009150d0b091508090815030e030b020801090009150d0b091508090815030e030b020801090009060a18072405340302041e040b0201060012031403010e02090201040304030c040302010203040401150d0b09090815030e03130108010900010009150d0b09090815030e03130108010900010009150d0b09090815030e03130108010900010009060b0803060118031a0414100402020603150d0b091508090815030e030b020801090009150d0b091508090815030e030b020801090009150d0b091508090815030e030b020801090009060b0206060202040b0201060012031403011204090c020e0312030c0202020202041004000202060301150d0b091508090815030e030b020801090009150d0b091508090815030e030b0208010900, 0x11615150d0b0915030e030303060101010900091615150d0b0915030e0303] private def node3008:Certificate:=PackedParametricCertificateData.decode 11 data3008 private def node3009:Certificate:=.split node2946 node3008 private def node3010:Certificate:=.split node2929 node3009 private def node3011:Certificate:=.split node2851 node3010 private def node3012:Certificate:=.positive 3 [(1,4),(8,9)] node3011 private def node3013:Certificate:=.positive 9 [(5,3),(3,6),(22,8)] node3012 private def node3014:Certificate:=.split node2772 node3013 private def node3015:Certificate:=.split node2690 node3014 private def node3016:Certificate:=.split node2597 node3015 private def data3042:List Nat:=[ 0x115131313130e08080f040e04150302020a0008000a15131313130e08080f040e04150302020a0008000a15131313130e08080f040e04150302020a0008000a060b08090601060308030c020902011200300436030506030200040304030a020802020401020406030e020b040402030204100400020206030f040c0608060306040a030e0402020206030d04090601020306030e0e0b090a08080813040f0409040403120008000a0e0e0b090a08080813040f0409040403120008000a0e0e0b090a08080813040f0409040403120008000a060b08090601060308030c020902011200300436030506030200040304030a02080202040102040603150e130e0e0e130b0b09120411011200110009150e130e0e0e130b0b09120411011200110009150e130e0e0e130b0b09120411011200110009060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node3042:Certificate:=PackedParametricCertificateData.decode 11 data3042 private def data3099:List Nat:=[ 0x10f110f150e09091503130302020a00090000000a150f110f150e09091503130302020a00090000000a06120204060202040c020902011200300436030112240f140b160a02042403100200020202041313150e130e0e0e08080f04150302020e000a000a1313150e130e0e0e08080f04150302020e000a000a1313150e130e0e0e08080f04150302020e000a000a061513130e0a0709060f040e0408020202130108000a1513130e0a0709060f040e0408020202130108000a1513130e0a0709060f040e0408020202130108000a06010c020902011200300436030504020600020304030f040b080a0401120412030c020202020204010b0200020202041513130e0a0a0b0609060f040e040a04070208000a1513130e0a0a0b0609060f040e040a04070208000a1513130e0a0a0b0609060f040e040a04070208000a060e060704060801020406030c020902011200300436030502040200020302030f040b080a04011204120310060e06010803080410040d0209020106040a031513130e09090f040e040a0408021301100108000a1513130e09090f040e040a0408021301100108000a1513130e09090f040e040a0408021301100108000a060e060708050401020406030c020902011200300436030506030200040304030a020802020401020406030e020b0404020302041004000202060301010108020002020204, 0x101010a120f110f110e120a1108110312020602090101010a120f110f110e120a1108110312020602090101010a06120803060018031a04120f110f110e120a1108110312020602010109000a120f110f110e120a1108110312020602010109000a120f110f110e120a1108110312020602010109000a060f02010202020401120f110f110e09091208110811030302010109000a120f110f110e09091208110811030302010109000a120f110f110e09091208110811030302010109000a06120204060202040c020902011200300436030112240f140b160a0204240310020002020204120f110f110e09091208110811030802030209000a120f110f110e09091208110811030802030209000a120f110f110e09091208110811030802030209000a06120f110f110e100e1208110808060e04110313020a120f110f110e100e120811080e040804110313020a120f110f110e100e1208110808060e04110313020a06010c020902011200300436030f0202060202030f040b080a0401120412030c0403020102030404010b0200020202040a0200020202041313150f110f150e09091503130309020a0002000a1313150f110f150e09091503130309020a0002000a1313150f110f150e09091503130309020a0002000a060f02010202020411040d040606030203150f110f150e09091503130302020a00090000000a15, 0x1120f110f110e120a11081103120206020901] private def node3099:Certificate:=PackedParametricCertificateData.decode 11 data3099 private def node3100:Certificate:=.split node3042 node3099 private def node3101:Certificate:=.positive 4 [(4,0),(1,1),(3,6)] node3100 private def node3102:Certificate:=.positive 4 [(1,0),(4,2),(3,5)] node3101 private def node3103:Certificate:=.positive 7 [(4,0),(4,1),(3,4)] node3102 private def node3104:Certificate:=.positive 10 [(11,0),(3,3),(7,6)] node3103 private def data3130:List Nat:=[ 0x115130f0f130e0e0e0f0a0a0a0a08080803030a020a151313130f0f0e0e0f0a0a080808130303030a020a15130f0f130e0e0e0f0a0a0a0a0808080e030a020a060b08090601060308030c020902011200300436030506030200040304030a020802020401020406030e1e0c080a0c0416041604100400020206030c02050203020302030e0402020206030d04090601020306030f0f0e0e120a0b090a08080815041304090412020a0f0f0e0e120a0b090a08080815041304090412020a0f0f0e0e120a0b090a08080815041304090412020a060b08090601060308030c020902011200300436030506030200040304030a02080202040102040603130e0e0e120a11090b090f080b0412020f0209130e0e0e120a11090b090f080b0412020f0209130e0e0e120a11090b090f080b0412020f0209060a040306010c00080416030c020902011200300436030506030200040304030a0208020204010204060301100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node3130:Certificate:=PackedParametricCertificateData.decode 11 data3130 private def data3175:List Nat:=[ 0x101240426040115130e0e0a0a080813030e03030302020b0009000a15130e0e0a0a080813030e03030302020b0009000a15130e0e0a0a080813030e03030302020b0009000a06120204060202040c0209020112003004360301011002000202020415130f0f0e0e0a0a0f0808080e030e000a0009000a15130f0f0e0e0a0a0f0808080e030e000a0009000a15130f0f0e0e0a0a0f0808080e030e000a0009000a060f0f130e0a0a0f08080813040e030800020000000a0f0f130e0a0a0f08080813040e030800020000000a0f0f130e0a0a0f08080813040e030800020000000a06010c020902011200300436030504020600020304030f04080401060306030c020202020204010b0200020202040f0f130e0a0a0f08080813040e030800020000000a0f0f130e0a0a0f08080813040e030800020000000a0f0f130e0a0a0f08080813040e030800020000000a060b0206060202030c020902011200300436030502040200020302030f040804010603060310060e0601080308040d0206020106030603130e0e0e0e0a0a0a0f080808130406040e0300000a130e0e0e0e0a0a0a0f080808130406040e0300000a130e0e0e0e0a0a0a0f080808130406040e0300000a060b04070605060304030c020902011200300436030506030200040304030a020802020401020406030e0c0c0c0a120516041604100400020206030101, 0x1151313130e0e0b09090908080a0202020b0109010a15130e0e0b09090908080b020a0202020b0109010a15130e0e0b09090908080b020a0202020b0109010a06120803060018031a04151313130e0e0b09090908080b020a02020211010a151313130e0e0b09090908080b020a02020211010a151313130e0e0b09090908080b020a02020211010a0612080e0c03060124042604011513130e0e0e0a0a0f080808030302020b000a000a1513130e0e0e0a0a0f080808030302020b000a000a1513130e0e0e0a0a0f080808030302020b000a000a0612020604020203020411020a0200060306030115130f0f0e0e0b0b08080e0303030902020209010a15130f0f0e0e0b0b08080e0303030902020209010a15130f0f0e0e0b0b08080e0303030902020209010a06120803060018031a04151313130e0e0b0b08080e0303030b02090202020a151313130e0e0b0b08080e0303030b02090202020a151313130e0e0b0b08080e0303030b02090202020a0612080e0c0306] private def node3175:Certificate:=PackedParametricCertificateData.decode 9 data3175 private def data3196:List Nat:=[ 0x113110e0e0c0b0b0809080e030602060101010f000a13110e0e0c0b0b0809080e030602060101010f000a13110e0e0c0b0b0809080e030602060101010f000a06120803060018031a0413110e0e0c0b150809080e0309020301010100000a13110e0e0c0b0b0809080e0309021501030101010a13110e0e0c0b0b0809080e0309021501030101010a0612080e0c030601240426040115130e0e0c0b150809080e0313010301010109000a15130e0e0c0b150809080e0313010301010109000a15130e0e0c0b150809080e0313010301010109000a060e100718042803020416040c0209020112003004360301120404020202031002000202020413110e0e0c0b15080b08130208020801030109000a13110e0e0c0b15080b08130208020801030109000a13110e0e0c0b15080b08130208020801030109000a0613110e0e0a0a15080b08040413020802080103010a13110e0e0b0a0a0a15080b0813020802080103010a13110e0e0b0a0a0a15080b0813020802080103010a06010c020902011200300436030f0202060202030a0208020404010e040a030c0403020102030404010b0200020202040a020002020204] private def node3196:Certificate:=PackedParametricCertificateData.decode 9 data3196 private def node3197:Certificate:=.split node3175 node3196 private def node3198:Certificate:=.negative 1 [(1,0),(1,8)] node3197 private def node3199:Certificate:=.split node3130 node3198 private def node3200:Certificate:=.positive 12 [(15,0),(1,5),(8,6)] node3199 private def data3237:List Nat:=[ 0x103000a060a02090204040302030b02030600060308031304040202020315130f0f130e0e0e0f0a0a0a0808130303030a020a151313130f0f130e0e0e0a080808130303030a020a15130f0f130e0e0e0f0a0a0a080813030e030a020a060a16091e020c00080416030c02090201120030043603130404020202030110060e0601080308040702040202020315130f0f130e0e0e0f0a0a0a0a08080803030a020a151313130f0f130e0e0e0a080808130303030a020a15130f0f130e0e0e0f0a0a0a0a0808080e030a020a060a040904050200020404030c020902011200300436031304040202020309040204010203060310060e0a0708040c040c0410040002020603010e0402020206030d040906010203060315150e0e120a0b090a0808081504130409040f020a15150e0e120a0b090a0808081504130409040f020a15150e0e120a0b090a0808081504130409040f020a060a060902080401040406030c0209020112003004360313040402020203090402040102030603130e0e0e120a11090b090f080b0412020f0209130e0e0e120a11090b090f080b0412020f0209130e0e0e120a11090b090f080b0412020f0209060a040306010c00080416030c020902011200300436030506030200040304030a0c02080106000404120301100400020206030f04060c02120316030e0402020206030d040906010203060301, 0x115150e0e0a0a0a0813040e040f020a02080003000a15150e0e0a0a0a0813040e040f020a02080003000a15150e0e0a0a0a0813040e040f020a020800] private def node3237:Certificate:=PackedParametricCertificateData.decode 11 data3237 private def data3296:List Nat:=[ 0x104060202040b0205060202031304040202020303040106020204100200020202040e0d0e0a0d0a1309130405040f02080203020d000a0e0d0e0a0d0a1309130405040f02080203020d000a0e0d0e0a0d0a1309130405040f02080203020d000a06130e0e0e0e0a130913040e0404040c02030208000a130e0e0e0e0a130913040e0404040c02030208000a130e0e0e0e0a130913040e0404040c02030208000a06010b02030600060308031304040202020315130f0f0e0e0a0a0f0808080e030e000a0009000a15130f0f0e0e0a0a0f0808080e030e000a0009000a15130f0f0e0e0a0a0f0808080e030e000a0009000a0615130f0f130e0e0e0a0a0c0808080e03020200000a15130f0f130e0e0e0a0a0c0808080e03020200000a15130f0f130e0e0e0a0a0c0808080e03020200000a06010c02090201120030043603130404020202030110060706050601020408040115130f0f0e0e0f080c08080815060e030e000a000a15130f0f0e0e0f080c08080815060e030e000a000a15130f0f0e0e0f080c08080815060e030e000a000a0615130f0f130e0e0e0a0a0c08080813040e0300000a1513130e0e0e0a0a0c080808150613040e0300000a1513130e0e0e0a0a0c080808150613040e0300000a06010c02090201120030043603130404020202030904020401020306030c0607060508030804100400020206030101, 0x10802020b010d000a000a06120803060018031a0415131313130e0e0e0a0a08080c0202020b000a000a15131313130e0e0e0a0a08080c0202020b000a000a15131313130e0e0e0a0a08080c0202020b000a000a06120206040202030204010115130f0f0e0e0b0b08080e0303030902020209010a15130f0f0e0e0b0b08080e0303030902020209010a15130f0f0e0e0b0b08080e0303030902020209010a060b0803060118031a04151313130e0e080813030e0303030b02090202020a151313130e0e080813030e0303030b02090202020a151313130e0e080813030e0303030b02090202020a060b0803060118031a040115130e0e0a0a080813030e03030302020a0009000a15130e0e0a0a080813030e03030302020a0009000a15130e0e0a0a080813030e03030302020a0009000a060b0206060202040c0209020112003004360301011002000202020415130f0f0e0e0a0a0f0808080e030e000a0009000a15130f0f0e0e0a0a0f0808080e030e000a0009000a15130f0f0e0e0a0a0f0808080e030e000a0009000a060b0206060202040c02090201120030043603130405020206030403030401060202030c020202020204010b02000202020415131313130e0e0e0a0a08080c0202020b000a000a15131313130e0e0e0a0a08080c0202020b000a000a15131313130e0e0e0a0a08080c0202020b000a000a061202, 0x115131313150e130e0e0e08080a0202020b0109010a15131313150e130e0e0e08080a0202020b0109010a15131313150e130e0e0e08080a0202020b0109010a060b0803060118031a0415131313150e130e0e0e08080a02020211010d000a15131313150e130e0e0e08080a02020211010d000a15131313150e130e0e0e08080a02020211010d000a060b0803060118031a040115131313130e0e0e0a0a080802020b010d000a000a15131313130e0e0e0a0a080802020b010d000a000a15131313130e0e0e0a0a08] private def node3296:Certificate:=PackedParametricCertificateData.decode 9 data3296 private def data3316:List Nat:=[ 0x113110e0e0c0c110809080e0306020f01060101010a13110e0e0c0c110809080e0306020f01060101010a13110e0e0c0c110809080e0306020f01060101010a060b0803060118031a04151313110e0e0908080415030e030902030101010a13110e0e0b0b1108090815030e030902030101010a13110e0e11080908080415030e030902030101010a060b0803060118031a040115130e0e0b0a150809080e0313010301010109000a15130e0e0b0a150809080e0313010301010109000a15130e0e0b0a150809080e0313010301010109000a060b100718044803060422040c0209020112003004360301120404020202031002000202020413110e0e0b0a15080b08130208020801030109000a13110e0e0b0a15080b08130208020801030109000a13110e0e0b0a15080b08130208020801030109000a060b04070605060304040c020902011200300436030f02020602020309040404010e030a030c0403020102030404010b0200020202040a020002020204] private def node3316:Certificate:=PackedParametricCertificateData.decode 9 data3316 private def node3317:Certificate:=.split node3296 node3316 private def node3318:Certificate:=.negative 1 [(1,0),(1,8)] node3317 private def node3319:Certificate:=.split node3237 node3318 private def data3360:List Nat:=[ 0x1030b000a0002000a06010b02010600120314030502040200020302030110060e06010803080407020402020203150d130d0b090a08080815030e030b01090009150d130d0b090a08080815030e030b01090009150d130d0b090a08080815030e030b0109000906130e0e0e130d0b090808150302020b000a0002000a130e0e0e130d0b090808150302020b000a0002000a130e0e0e130d0b090808150302020b000a0002000a06010b02010600120314030502040200020302031204090c020e03120310040e020604040604060410040002020603010e0402020206030d0409060102030603150d120b0d0b120a12090d0912020802040109150d120b0d0b120a12090d0912020802040109150d130d120b0d0b12090d091202080204010906150d130d120b0d0b12090d0912020802040111000a150e150d120b0d0b120a12090d091202040111000a150e150d130d120b0d0b12090d091202040111000a06010b02010600120314030502040200020302031204090c020e031203150e150d120b0d0b120a12090d091202110009150e150d130d120b0d0b12090d091202110009150e150d130d120b0d0b12090d0912021100090611020c06030601100412030b020106001203140313140602050203080312040a0c020a000404120301100400020206030f04060c02120316030e0402020206030d040906010203060301, 0x10b090a090a0808080d040802110104010d00090b090a090a0808080d040802110104010d00090b090a090a0808080d040802110104010d000906130e0e0e0b0908080e040d040f000b000a0003000a130e0e0e0b0908080e040d040f000b000a0003000a130e0e0e0b0908080e040d040f000b000a0003000a06010b020306000603080313040402020203150d130d0b090a08080815030e030b01090009150d130d0b090a08080815030e030b01090009150d130d0b090a08080815030e030b0109000906130e0e0e150d130d0b09080803030b000a0002000a130e0e0e150d130d0b09080803030b000a0002000a130e0e0e150d130d0b09080803] private def node3360:Certificate:=PackedParametricCertificateData.decode 11 data3360 private def data3419:List Nat:=[ 0x10808020211010a00090009060a02090204040302040b020506020203130404020202030304010602020410020002020204130a0b0a0b0908080d040802110104010d0009150d130a0b0a0b0908080d04080211010d00090d0b130a0b0a0b0908080d04080211010d000906130e0e0e0b0908080e040a040f000b00080003000a130e0e0e0b0908080e040a040f000b00080003000a130e0e0e0b0908080e040a040f000b00080003000a06010b020306000603080313040402020203150d130d0b090f0808080e030b010a00090009150d130d0b090f0808080e030b010a00090009150d130d0b090f0808080e030b010a0009000906130e0e0e130d0b0908080a040e030f000b0002000a130e0e0e130d0b0908080a040e030f000b0002000a130e0e0e130d0b0908080a040e030f000b0002000a06010b020106001203140305020402000203020301100c060605060108040e0401150d130d0b090f0808080e030b010d000a0009150d130d0b090f0808080e030b010d000a0009150d130d0b090f0808080d040e030b010a000906130e0e0e130a0b0908080a040e030f000b0002000a130e0e0e130a0b0908080a040e030f000b0002000a130e0e0e130a0b0908080a040e030f000b0002000a06010b02010600120314030502040200020302031204090c020e0312030c08060605060404040a04100400020206030101, 0x10b0b0911020b02020209010a0009150d130d0d0b0b0911020b02020209010a0009150d130d0d0b0b0911020b02020209010a000906120803060018031a04150d130d0d0b0b090808020211010a00090009150d130d0d0b0b090808020211010a00090009150d130d0d0b0b090808020211010a00090009060a18066803060210042a040101150d0b090f080808150313030e030202090009150d0b090f080808150313030e030202090009150d0b090f080808150313030e030202090009060a040306010c0008041604150d130d0b09080813030e0302021501090009150d130d0b09080813030e0302021501090009150d130d0b09080813030e0302021501090009060b0803060118031a0401150d130d0b09080813030e0302021501090009150d130d0b09080813030e0302021501090009150d130d0b09080813030e0302021501090009060a08061804100302040e040b0201060012031403010110020002020204150d130d0b090f0808080e030b010a00090009150d130d0b090f0808080e030b010a00090009150d130d0b090f0808080e030b010a00090009060a18064805100302041e040b0201060012031403050402060002030403030401060202030c020202020204010b020002020204150d130d0d0b0b090808020211010a00090009150d130d0d0b0b090808020211010a00090009150d130d0d0b0b09, 0x11611150d130d0d0b0b090f08020209010d00091611150d130d0d0b0b090f08020209010d00091611130d0d0b0b090f080d04020209010d0009060a040306010c0008041604150d130d0d0b0b090808020211010a00090009150d130d0d0b0b090808020211010a00090009150d130d0d0b0b090808020211010a00090009060b0803060118031a0401150d130d0d] private def node3419:Certificate:=PackedParametricCertificateData.decode 9 data3419 private def data3439:List Nat:=[ 0x11615150d0b09150303030601010112000900091615150d0b09150303030601010112000900091615150d0b0915030303060101011200090009060a040306010c0008041604150d0d0b0b0915030303150113010301090009150d0d0b0b0915030303150113010301090009150d0d0b0b0915030303150113010301090009060b0803060118031a0401150d0d0b0b0915030303150113010301090009150d0d0b0b0915030303150113010301090009150d0d0b0b0915030303150113010301090009060a1007180468030a042e040b0201060012031403011204040202020310020002020204150d0b091508090815030e030b020801090009150d0b091508090815030e030b020801090009150d0b091508090815030e030b020801090009060a18072405340302041e040b02010600120314030f02020602020309040404010e030a030c0403020102030404010b0200020202040a020002020204] private def node3439:Certificate:=PackedParametricCertificateData.decode 9 data3439 private def node3440:Certificate:=.split node3419 node3439 private def node3441:Certificate:=.negative 1 [(1,0),(1,8)] node3440 private def node3442:Certificate:=.split node3360 node3441 private def node3443:Certificate:=.split node3319 node3442 private def node3444:Certificate:=.split node3200 node3443 private def data3493:List Nat:=[ 0x10a000a0e0e11090b09080813030e030f000d000b000a000a06010702010e00200324030502040200020302030110060e060108030804010b090d0808080904150313030b0109000300090b090d0808080904150313030b0109000300090b090d0808080904150313030b010900030009060e0e11090b09080813030e030f000d000b000a000a0e0e11090b09080813030e030f000d000b000a000a0e0e11090b09080813030e030f000d000b000a000a06010702010e00200324030502040200020302030502020402020310040e020604040604060410040002020603010e0402020206030d04090601020306031715170b120b120a12090e03030303010d00091715170b120b120a12090e03030303010d00091715170b120b120a12090e03030303010d0009061715170b120b120a170912090e03170104000917151711170b120b120a170912090e030400091715170b120b120a170912090e031701040009060115040106001003120305020402000203020313040202020203150e170b120b120a170912090d040b04120209150e170b120b120a170912090d040b04120209150e170b120b120a170912090d040b041202090611060d020306000e0410030c060202010a0026042a0313140602050203080312040a0c020a00040412030110040002020603100402020202030e0402020206030d040906010203060301, 0x117151713170b13090a0813020a02020201010917151713170b13090a0813020a02020201010917151713170b13090a0813020a02020201010906120803060018031a0417151713170b13090a080a020b01020101010917151713170b13090a080a020b01020101010917151713170b13090a080a020b0102010101090612020406020204011310070202060309040204010203060410020002020204170b0b090a090a0812050605170405040d01091715170b0b090a0812050905170405040d0109170b0b090a090a080f050905080517040d010906130e0e0e11090b0908080e040f000d00080003000a130e0e0e11090b0908080e040f000d00080003000a130e0e0e11090b0908080e040f000d00080003000a06011504030600040306031304050202060304030b090d0808080904150313030b0109000300090b090d0808080904150313030b0109000300090b090d0808080904150313030b010900030009060e0e11090b09080813030e030f000d000b000a000a0e0e11090b09080813030e030f000d000b00] private def node3493:Certificate:=PackedParametricCertificateData.decode 11 data3493 private def data3517:List Nat:=[ 0x116151611130a0b0a0b090902020209010a000916151611130a0b0a0b09090202020a000816151611130a0b0a0b09090202020a0008060a040306010c00080416040b0201060012031404150a130a0b0a1309150213020b020202010109150a130a0b0a1309150213020b020202010109150a130a0b0a1309150213020b02020201010906120803060018031a040b0205060202040109040204010203060410020002020204070201060002030804060602080002030a04150a130a0b0a1309150213020b020202010109150a130a0b0a1309150213020b020202010109150a130a0b0a1309150213020b02020201010906120803060018031a04130a0b0a0b090a04030315010b0101010a0009130a0b0a0b090a04030315010b0101010a0009130a0b0a0b090a04030315010b0101010a0009060a020902040403020401130404020202030904020401020306041002000202020407020402020204060603020206030804010d10090e040603100308020002020204] private def node3517:Certificate:=PackedParametricCertificateData.decode 11 data3517 private def node3518:Certificate:=.split node3493 node3517 private def node3519:Certificate:=.negative 1 [(1,1),(1,7)] node3518 private def node3520:Certificate:=.negative 13 [(12,0),(3,4),(4,6)] node3519 private def node3521:Certificate:=.split node3444 node3520 private def node3522:Certificate:=.positive 8 [(5,4),(1,6),(24,8)] node3521 private def node3523:Certificate:=.split node3104 node3522 private def node3524:Certificate:=.negative 1 [(1,1),(1,2)] node3523 private def node3525:Certificate:=.negative 4 [(4,0),(3,1),(3,3)] node3524 private def node3526:Certificate:=.split node3016 node3525 private def node3527:Certificate:=.split node2513 node3526 private def node3528:Certificate:=.split node1706 node3527 private def node3529:Certificate:=.split node921 node3528 private def zz508:"s01fc"="s01fc":=by decide+kernel private theorem valid81:check node81 ctx81 quad81 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid226:check node226 ctx226 quad226 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid387:check node387 ctx387 quad387 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid464:check node464 ctx464 quad464 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · exact valid387 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz509:"s01fd"="s01fd":=by decide+kernel private theorem valid465:check node465 ctx465 quad465 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid464 private theorem valid467:check node467 ctx467 quad467 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid226 · exact valid465 private theorem valid540:check node540 ctx540 quad540 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid687:check node687 ctx687 quad687 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz510:"s01fe"="s01fe":=by decide+kernel private theorem valid763:check node763 ctx763 quad763 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · exact valid687 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid764:check node764 ctx764 quad764 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid763 private theorem valid839:check node839 ctx839 quad839 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid915:check node915 ctx915 quad915 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid839 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz511:"s01ff"="s01ff":=by decide+kernel private theorem valid918:check node918 ctx918 quad918 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · exact valid467 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid540 · exact valid764 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid915 private theorem valid920:check node920 ctx920 quad920 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid81 · exact valid918 private theorem valid1004:check node1004 ctx1004 quad1004 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1111:check node1111 ctx1111 quad1111 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz512:"s0200"="s0200":=by decide+kernel private theorem valid1115:check node1115 ctx1115 quad1115 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1111 private theorem valid1234:check node1234 ctx1234 quad1234 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1318:check node1318 ctx1318 quad1318 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1391:check node1391 ctx1391 quad1391 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1318 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz513:"s0201"="s0201":=by decide+kernel private theorem valid1392:check node1392 ctx1392 quad1392 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1234 · exact valid1391 private theorem valid1621:check node1621 ctx1621 quad1621 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1699:check node1699 ctx1699 quad1699 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1621 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1700:check node1700 ctx1700 quad1700 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1699 private def zz514:"s0202"="s0202":=by decide+kernel private theorem valid1701:check node1701 ctx1701 quad1701 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1700 private theorem valid1704:check node1704 ctx1704 quad1704 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1115 · apply NatParametricCheckSteps.split_valid · exact valid1392 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1701 private theorem valid1706:check node1706 ctx1706 quad1706 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1004 · exact valid1704 private theorem valid1789:check node1789 ctx1789 quad1789 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz515:"s0203"="s0203":=by decide+kernel private theorem valid1792:check node1792 ctx1792 quad1792 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1789 private theorem valid1874:check node1874 ctx1874 quad1874 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1976:check node1976 ctx1976 quad1976 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2082:check node2082 ctx2082 quad2082 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz516:"s0204"="s0204":=by decide+kernel private theorem valid2197:check node2197 ctx2197 quad2197 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2427:check node2427 ctx2427 quad2427 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2428:check node2428 ctx2428 quad2428 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid2197 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2427 private theorem valid2509:check node2509 ctx2509 quad2509 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · exact valid2428 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz517:"s0205"="s0205":=by decide+kernel private theorem valid2510:check node2510 ctx2510 quad2510 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2082 · exact valid2509 private theorem valid2512:check node2512 ctx2512 quad2512 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1976 · exact valid2510 private theorem valid2513:check node2513 ctx2513 quad2513 (hinges.drop 3) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid1792 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1874 · exact valid2512 private theorem valid2594:check node2594 ctx2594 quad2594 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz518:"s0206"="s0206":=by decide+kernel private theorem valid2688:check node2688 ctx2688 quad2688 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2772:check node2772 ctx2772 quad2772 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3010:check node3010 ctx3010 quad3010 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3013:check node3013 ctx3013 quad3013 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid3010 private def zz519:"s0207"="s0207":=by decide+kernel private theorem valid3015:check node3015 ctx3015 quad3015 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2688 · apply NatParametricCheckSteps.split_valid · exact valid2772 · exact valid3013 private theorem valid3016:check node3016 ctx3016 quad3016 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2594 · exact valid3015 private theorem valid3104:check node3104 ctx3104 quad3104 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3200:check node3200 ctx3200 quad3200 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz520:"s0208"="s0208":=by decide+kernel private theorem valid3319:check node3319 ctx3319 quad3319 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3443:check node3443 ctx3443 quad3443 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.split_valid · exact valid3319 · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3520:check node3520 ctx3520 quad3520 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3523:check node3523 ctx3523 quad3523 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · exact valid3104 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid3200 · exact valid3443 · exact valid3520 private def zz521:"s0209"="s0209":=by decide+kernel private theorem valid3527:check node3527 ctx3527 quad3527 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.split_valid · exact valid2513 · apply NatParametricCheckSteps.split_valid · exact valid3016 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid3523 private theorem valid3529:check node3529 ctx3529 quad3529 (hinges.drop 0) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid920 · apply NatParametricCheckSteps.split_valid · exact valid1706 · exact valid3527 theorem certificate_valid:check node3529 constraintsNat base hinges = true:=valid3529 theorem nonnegative (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i):0 ≤ slack t x:=by unfold slack apply div_nonneg · apply check_sound node3529 constraintsNat base hinges t x ht0 ht1 _ certificate_valid intro i have hC (j:Fin 4):0 ≤ linearEval (constraints j) x:=by fin_cases j <;> simpa [constraints,linearEval,Fin.sum_univ_succ] using hx _ exact hC ⟨i % 4,Nat.mod_lt _ (by decide)⟩ · norm_num [normalizationDenominator] end Green24Proof.QuadNearBalanceCase1 private def zz2177:"s0881"="s0881":=by decide+kernel end section namespace Green24Proof.QuadNearBalanceCase2 open ParametricQuadraticCertificates hiding Certificate check check_sound open NatParametricCertificates open NatBacksubRecoveredQuadraticCertificates (cons) open IntegerQuadraticCertificates (Linear Point linearEval combinationCheck) def constraints:Fin 4 → Linear:=![![1,0,0,0], ![0,1,0,0], ![0,0,1,0], ![0,0,0,1]] def base:Quadratic:=![![![0x12038b4ed26ec6, -0xaa87bee538000, -0xffcb9e57d4000,0xb1404e2d7c52], ![-0xaa87bee538000, -0x5a0dab9f32163e,0x13fb66c17f4d8c,0x5543df729c000], ![-0xffcb9e57d4000,0x13fb66c17f4d8c, -0x460ff6eded75a8,0xadab046872d6a], ![0xb1404e2d7c52,0x5543df729c000,0xadab046872d6a, -0x5543df729c000]], ![![-0x69c0271f4cc0,0,0x19945ca262000, -0x6e9b12afd720], ![0, -0x30254342ffac0, -0x1ac58d12d0a0,0], ![0x19945ca262000, -0x1ac58d12d0a0, -0x282085272680,0xa082149c9a0], ![-0x6e9b12afd720,0,0xa082149c9a0,0]], ![![-0x10d8c266d720,0xa7a358200,0xa7a358200,0x1dd4cbf36c00], ![0xa7a358200,0x5540839ef2a0,0xa7a358200, -0x20b36426cfe0], ![0xa7a358200,0xa7a358200, -0x8862ab3bde40,0x222326abe800], ![0x1dd4cbf36c00, -0x20b36426cfe0,0x222326abe800,0]]] def hinges:Hinges:=[(![0,0, -0x34edce0], ![0,0,1, -3]),(![-0x191a2c19d6b5, -0x50410a4e4d0, -0x110c4aa72df0], ![0,0,1, -1]),(![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490], ![0,0,3, -1]),(![0,0x16ada57d3700,0x1476b081e800], ![0,1, -1,0]),(![0x58a02716be29,0, -0xae9f4c970a0], ![0,1,0, -3]),(![0x133d36f21e8b0a,0,0], ![0,1,0, -1]),(![-0x5543df729c000,0,0], ![0,3, -2, -1]),(![0x5543df729c000,0,0], ![0,3, -2,1]),(![-0x36c599a8bcb6,0x531281a215c0, -0xa8895429a00], ![0,3, -1,0]),(![0x58a02716be29,0,0], ![0,3,0, -1]),(![0x5543df729c000,0,0], ![0,3,2, -1]),(![-0x1b7e5fd92756,0x1b78ccf2f520,0], ![1, -3,0,0]),(![-0x5543df729c000,0,0], ![1, -2, -3,0]),(![0x5543df729c000,0,0], ![1, -2,3,0]),(![0x1b7e5fd92756, -0x1b78ccf2f520,0], ![1, -1,0,0]),(![-0x465418d301c3,0,0], ![1,0, -3,0]),(![-0x12c695003c6fa9,0,0x6eaa7278920], ![1,0, -1,0]),(![0,0x7d5efacaea0,0x9ee1b3f4e00], ![1,0,0, -3]),(![-0x36c599a8bcb6,0x61ea37729e20,0], ![1,0,0, -1]),(![0x5543df729c000,0,0], ![1,2, -3,0]),(![-0x7402f3eb1c84,0,0], ![3,0, -1,0])] def normalizationDenominator:ℤ:=0xaa87bee538000 noncomputable def slack (t:ℝ) (x:Point):ℝ := (quadraticEval base t x + hingeEval hinges t x) / normalizationDenominator def constraintsNat (i:Nat):Linear := constraints ⟨i % 4,Nat.mod_lt _ (by decide)⟩ private def ctx2809:Nat → Linear:=constraintsNat private def quad2809:Quadratic:=base private def ctx748:Nat → Linear:=cons ![0,0,1, -3] ctx2809 private def quad748:Quadratic:=quad2809 + coefficientProduct ![0,0, -0x34edce0] ![0,0,1, -3] ![0,0,1, -3] private def ctx115:Nat → Linear:=cons ![0,1, -1,0] (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx748)) private def quad115:Quadratic:=((quad748 + coefficientProduct ![-0x191a2c19d6b5, -0x50410a4e4d0, -0x110c4aa72df0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0,0x16ada57d3700,0x1476b081e800] ![0,1, -1,0] ![0,1, -1,0] private def ctx109:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] ctx115))))) private def quad109:Quadratic:=(((((quad115 + coefficientProduct ![0x58a02716be29,0, -0xae9f4c970a0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x133d36f21e8b0a,0,0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x36c599a8bcb6,0x531281a215c0, -0xa8895429a00] ![0,3, -1,0] ![0,3, -1,0]) + coefficientProduct ![0x58a02716be29,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx368:Nat → Linear:=cons ![0,1,0, -3] (cons (-![0,1, -1,0]) (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx748))) private def quad368:Quadratic:=(((quad748 + coefficientProduct ![-0x191a2c19d6b5, -0x50410a4e4d0, -0x110c4aa72df0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1])) + coefficientProduct ![0x58a02716be29,0, -0xae9f4c970a0] ![0,1,0, -3] ![0,1,0, -3] private def ctx744:Nat → Linear:=cons (-![0,1,0, -3]) (cons (-![0,1, -1,0]) (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx748))) private def quad744:Quadratic:=(((quad748 + coefficientProduct ![-0x191a2c19d6b5, -0x50410a4e4d0, -0x110c4aa72df0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1])) private def ctx618:Nat → Linear:=cons ![0,1,0, -1] ctx744 private def quad618:Quadratic:=quad744 + coefficientProduct ![0x133d36f21e8b0a,0,0] ![0,1,0, -1] ![0,1,0, -1] private def ctx2808:Nat → Linear:=cons (-![0,0,1, -3]) ctx2809 private def quad2808:Quadratic:=quad2809 private def ctx1393:Nat → Linear:=cons ![0,0,1, -1] ctx2808 private def quad1393:Quadratic:=quad2808 + coefficientProduct ![-0x191a2c19d6b5, -0x50410a4e4d0, -0x110c4aa72df0] ![0,0,1, -1] ![0,0,1, -1] private def ctx858:Nat → Linear:=cons ![0,1,0, -3] (cons ![0,1, -1,0] (cons ![0,0,3, -1] ctx1393)) private def quad858:Quadratic:=((quad1393 + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0,0x16ada57d3700,0x1476b081e800] ![0,1, -1,0] ![0,1, -1,0]) + coefficientProduct ![0x58a02716be29,0, -0xae9f4c970a0] ![0,1,0, -3] ![0,1,0, -3] private def ctx853:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx858)))) private def quad853:Quadratic:=((((quad858 + coefficientProduct ![0x133d36f21e8b0a,0,0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x36c599a8bcb6,0x531281a215c0, -0xa8895429a00] ![0,3, -1,0] ![0,3, -1,0]) + coefficientProduct ![0x58a02716be29,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx941:Nat → Linear:=cons ![0,1,0, -1] (cons (-![0,1,0, -3]) (cons ![0,1, -1,0] (cons ![0,0,3, -1] ctx1393))) private def quad941:Quadratic:=(((quad1393 + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0,0x16ada57d3700,0x1476b081e800] ![0,1, -1,0] ![0,1, -1,0])) + coefficientProduct ![0x133d36f21e8b0a,0,0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1391:Nat → Linear:=cons (-![0,1, -1,0]) (cons ![0,0,3, -1] ctx1393) private def quad1391:Quadratic:=(quad1393 + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1]) private def ctx1135:Nat → Linear:=cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx1391) private def quad1135:Quadratic:=(quad1391) + coefficientProduct ![0x133d36f21e8b0a,0,0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1388:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1391)) private def quad1388:Quadratic:=((quad1391)) private def ctx1729:Nat → Linear:=cons ![0,1, -1,0] (cons ![0,0,3, -1] (cons (-![0,0,1, -1]) ctx2808)) private def quad1729:Quadratic:=((quad2808) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0,0x16ada57d3700,0x1476b081e800] ![0,1, -1,0] ![0,1, -1,0] private def ctx1463:Nat → Linear:=cons ![0,1,0, -3] ctx1729 private def quad1463:Quadratic:=quad1729 + coefficientProduct ![0x58a02716be29,0, -0xae9f4c970a0] ![0,1,0, -3] ![0,1,0, -3] private def ctx1570:Nat → Linear:=cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx1729) private def quad1570:Quadratic:=(quad1729) + coefficientProduct ![0x133d36f21e8b0a,0,0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1566:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] ctx1570))) private def quad1566:Quadratic:=(((quad1570 + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x36c599a8bcb6,0x531281a215c0, -0xa8895429a00] ![0,3, -1,0] ![0,3, -1,0]) + coefficientProduct ![0x58a02716be29,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx1651:Nat → Linear:=cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1729)) private def quad1651:Quadratic:=((quad1729)) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx1726:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1729)) private def quad1726:Quadratic:=((quad1729)) private def ctx2063:Nat → Linear:=cons (-![0,1, -1,0]) (cons ![0,0,3, -1] (cons (-![0,0,1, -1]) ctx2808)) private def quad2063:Quadratic:=((quad2808) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1]) private def ctx1993:Nat → Linear:=cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx2063))) private def quad1993:Quadratic:=(((quad2063))) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx1864:Nat → Linear:=cons ![0,3, -1,0] ctx1993 private def quad1864:Quadratic:=quad1993 + coefficientProduct ![-0x36c599a8bcb6,0x531281a215c0, -0xa8895429a00] ![0,3, -1,0] ![0,3, -1,0] private def ctx1796:Nat → Linear:=cons ![0,3,0, -1] ctx1864 private def quad1796:Quadratic:=quad1864 + coefficientProduct ![0x58a02716be29,0,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx2806:Nat → Linear:=cons (-![0,0,3, -1]) (cons (-![0,0,1, -1]) ctx2808) private def quad2806:Quadratic:=(quad2808) private def ctx2134:Nat → Linear:=cons ![0,1,0, -3] (cons ![0,1, -1,0] ctx2806) private def quad2134:Quadratic:=(quad2806 + coefficientProduct ![0,0x16ada57d3700,0x1476b081e800] ![0,1, -1,0] ![0,1, -1,0]) + coefficientProduct ![0x58a02716be29,0, -0xae9f4c970a0] ![0,1,0, -3] ![0,1,0, -3] private def ctx2610:Nat → Linear:=cons (-![0,1,0, -3]) (cons ![0,1, -1,0] ctx2806) private def quad2610:Quadratic:=(quad2806 + coefficientProduct ![0,0x16ada57d3700,0x1476b081e800] ![0,1, -1,0] ![0,1, -1,0]) private def ctx2211:Nat → Linear:=cons ![0,1,0, -1] ctx2610 private def quad2211:Quadratic:=quad2610 + coefficientProduct ![0x133d36f21e8b0a,0,0] ![0,1,0, -1] ![0,1,0, -1] private def ctx2311:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) ctx2610)) private def quad2311:Quadratic:=((quad2610) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx2606:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) ctx2610))) private def quad2606:Quadratic:=(((quad2610)) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x36c599a8bcb6,0x531281a215c0, -0xa8895429a00] ![0,3, -1,0] ![0,3, -1,0] private def ctx2605:Nat → Linear:=cons (-![0,3,0, -1]) ctx2606 private def quad2605:Quadratic:=quad2606 private def ctx2509:Nat → Linear:=cons ![0,3,2, -1] ctx2605 private def quad2509:Quadratic:=quad2605 + coefficientProduct ![0x5543df729c000,0,0] ![0,3,2, -1] ![0,3,2, -1] private def ctx2803:Nat → Linear:=cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) (cons (-![0,1, -1,0]) ctx2806)) private def quad2803:Quadratic:=((quad2806)) private def data18:List Nat:=[ 0x1141414120d0d09091008090707070900070000000a141414120d0d09091008090707070900070000000a141414120d0d090910080e0809070707180009000a060608040200080306030b06090203080004040c0312040002020603110410060102030603100400020206030b0603020202030e0402020206030d040108000603060314101010140a120912080a08120318001200091410140a120912080a081203180012000814141410140a120912080a081203180008060608040200080306030b06090203080004040c0312040002020603110410060102030603100400020206030f08080607060212041a030e04020202060310060d020a06010404060301] private def node18:Certificate:=PackedParametricCertificateData.decode 10 data18 private def data27:List Nat:=[ 0x1e696b7bdc584fed4a191f2fce0e780141401020c8dbf9484cbdab7c5a5f1f3be98c993a2faca1412010202baf284c8b68896e68eb5edf4f1bbeb889ea21409010201c8dea6d9e7ecbcba98c7f2fbc1ecdb81eb800909010223adfea9c499d5f9d68be6de87f8b187be80180801023e8287dbbbc6fec9c8e4a2adf1b2b0d8c5b0c0120801022f95e2d6c087a2c5cfacca87edc49c91e69dd809080102018ab68cbc8b85cbceddd8a2bf98efc193a1c0120701021699988884ef888fce808bc5aea9b4b7c4c5e807070102018c9987ba93f3a0aa8d87a8e0afdedad8c2c01800010202aacffc9698afdfc38cf4b192afe8dcc6dcc0141400020cd3b7a9fdce8be1b08daea2b4d593cfeeb8c00909000231a2f7dbf6d0be94e299f280bad6d1a4aa801808000241f79cfae7b7df9ec2c499d5d2fac8f28fb380120800022cc08acfc5f38f97a2d9ebc8aae3bdd5ed82800908000203a0f48aa38082a2eaa98fe2f7a1c5b48294801807000267b4d98a84d592b4c78ff8e1a8edbf9ce1801207000214a9f6ab89f1b2d5a6df9a96e9c5bfabffa5801800000202feca8f9d83fd80a0868b9f81cfedef8ff2801e0a98a0aeb0efa3ccc8ecb380000608040200080306030b06090203080004040c0312040002020603110410060102030603100400020206030f08080607060212041a030e040102000203080310040a040002030203, 0x108a4a207d5c50dcdc805cef707c7a159a1a00dd7ab05d29a0005fb8f9681fc9099bde2eb85d5c008f6a813b1d66e94fa32bfdb05ace713f5d96da3c33299ea004fa3afb4eca6f6bb9baee6cec0141402020acaa1fabbecdcdd88bb81b388d8b8ed87a7e41412020207bff7a4e6c9d9f5cf82dcc6c8fbb2ebc1b6d41409020206abc3e7e8f68ee4eb9cadd4d1e4c7a8c3ce80090902023ad295b290baddf8b6f5abbcd0bbcd8bc0180802023289aeebbeb4bab3bc8ac39aeaadc7fea7b7801208020233c1feb8d8c98b8199ffdee8a4ea86bee487f00908020201a1efabf2e5e29dd1dcfe84dce4d3c0c880120702021b8afadbb282f387b88c9492b2eabbddd7be90070702026cbbd8c7c6a994aedbf5d4d4cbb3cbb2c0180002020395e8bb] private def node27:Certificate:=PackedParametricCertificateData.decode 9 data27 private def data70:List Nat:=[ 0x1ea9fd1a8ffacf2da96f5d9b9b9a5bb90a980070501020aa4cbf3cdc0d2f0b3e4bba5978ae285cec7aabaa985b4a0f8dff9f4d6ba82adf2cff4debb87c0e8e6a00505010203f1fffdefe5b7def89dabf2c5a3d3ff99bd8098afa08be6c99ccbaaafb5d8cabcb4f4a9ca90b0a387a01801010219fe898687e2aef3b79ddeb8f1fc82b3bba486becd8aa5a5bd999dbf82bfee99d89dffd1c8c885fee0801814000201a3f39d9c99cbabf99ea5c0f6feb1eec2b4cda5d0e8abe9c0c1ff9ba4cbeee093fdf586d3a59c9b8a9d80181200023986b18b8289c3f2e6b3f7a89195e59cefb9ccc39bd4c9b588e3f0bfd1b2e88b9fecc2c7baadc782ff80180a000216a2b88bacdab5efa1aea1f7ebf8939e8ff7bcc980a1bbb5a0a4d9e4d0cac7c7baeddeeff5cfd9d8b680070700025ee7d8cdcd99b6b5cad0ffd5aea68383cb81bdf59fbec6bda2ffd0a2d4e9c7e59ec5bdeb80c5fc800505000202efbfcab88df5afd1dbb4f4f6bcf39abea8f2cfaabfebebe2b2ca89fc9ceed7cd9ec794f98ee4801803000217ffa7c5da98fbde9bbab9c1f9f6ab8bad8cb6d28d8e9efa91e8dfbfa6b1c39ee9fdfca7bcc8fefbe2801e04b8bdd2f9d5df93cab39c9bd192a1f4c3dccbe682ffa6dff091e0eba29cc0a3e3c3ebc0000608040200080306030b06090203080004040c0312040002020603110410060102030603100400020206030101, 0x1e0ae8a94f2929ae0d4dcaefebdf7dc88c3db8ff9c9b8f980140702021ddad7ccff9eb8d5a3a08cb4e986c0d6c6b3a2e186d1a7e9c4969cf6f8f4bcacfdb2b192bfc0bcb6cac00707020208879fe8eec78aa7fe9798c2cc83f1f1fc9de0bbf4f5f9938ad0a8f7fae0e59fa387b8ec9699f08cd7c0070302021e8db2f890f6e7b8ddb9fec9e9cdc2f4ead6fcf1c8fde1858086ec8dc8e4a4b399f6c4dfd8fbe4c5ebc01800020201a2b4a7f9ccfad6b0d0b2cdd89b89f3d4c8bde7dfe9918cda9dbfe5ecbbeeb1caebadc6ce8ce0c781800800020207dfa090d4a3ddbbf9b7aef4f795edadeed7e9f3d7e3fce3d380d39af4f0b8e0dccecb9a89e0d1a1de80141201021ebec99bbbc9f8f2e2a7aff182e18bbf8fe49afabc98a7d9b191aaad87b9c6909786f5939ec1a6dfbb801408010234e992cee582928585d1909ed4dcab9dfddfac91dfcbbccab390dfcdcfe2a6bb9ea48fe5d6e8e0aca580090801021882fcea9acdc78de2aaedbda6de9f848bf8bfb7a6ea9fbfeb9d87cc95c1d583e89ca0ecf3cad3a5f6c0080801020ab1a0e98aed8ddefb94cfd296b8c9a886d3d29ad7c0aee7b5ebef9dbffce0c299f3e5ea95e4fcc3c6801407010234b6c487d2cce49e86a0e2bf84a2eabcab90dfb5d6cdb3e2a58ae1f2ccedcbcc9ba881808c8e90d1f18007070102479a92f3f9fdf2a1d393aee0a8f78aedc4daf1c89fe0908a, 0x1e1000edbeadfe9ecb6a3fad598a4ddd1fff4adccc2ddefe4c0ebabcde0b18ddcc4a6e6ea8030a1bacf73f7d3a40febf2b706ade3dd038b9ee6e85ab2dcdd03e8f096c90282b694e80006e79b88d7b69befa5bfbec2fcc5aea2c5cca3a9e0dbba9bf6cff0e0c4ceebd9bea98001b6fef9e604e9bfecce019fc2aafe6dd9c2bd03cfb6929705cac4929501f8c9b4ad019be6f6b80004cbbe8fd3c496f9dcc1f7a1e7e896c09c97faca93c5ddd4e9e88086e6d9c58c89800696db0eebbc0283c9689332cbd00bc9853ec9df218a80004f8ef3d3fc9da28fa1f2f5edfa84e2aea997faaef089f593af80acfcd2d699d18ef4efc2801fb0a534db87018fe3cc48dcb51084ee16d68249f3f925dede0015cbd0f6e0d1bca9f790f5f9aebaaeb3a9abbee283cc87f3f7b6c7d4c6c49cd2cfa0fd9380141402020dbcca8fec8bbe83b4d7a0c2b2f1ff91c2c88db99af2ac8f91ceac9cdda9ddcf84eacde4bc9382ccfdbe14120202019ccf92ccd2ff85a6978dcca69a91be8fcdf2b69fc4fca5f9ae83b9cfa8d7e5ecf2f383c08baba1e1a78c121202027ae694bbd5c5afa3a880c7ecf6babab5dbede1d38dc8ebffdbf784aeece7b89ee891ccce86e799eaf8ae0d0d020202eaf3aacfa4c1c2d0c48e88b8e7a2c3badabef2ba80ead9c9c2c0f38cf5e18ec7eebfb08787eb89800a0802020397ab99d78cedc8d2a8d6eddefaa2f495f3, 0x1fddde0bbb494941412010204a1cdf5f68ef5dd8be7cacc8185a280ccbb87f3d40909010279f18cbff1d2e3b7ccf8e69ae1d0a9aedc80baa81408010201c3bba9d6ccf4e1dcd3e5dfabc1b09885868ee9f00707010201b7c8cce6d6dbcd8fcda79780f4cfe7dad49e9ce80606010202909a988bffa5b4b1d4feb0b9feffeaa59aed82c81405010246fcff8ae3f9a7b9c8eab3baa899dbe5d3eeeb900905010225d3d4f99cf7b694c096889bb282e7b5ff89c0c0080501027de6a689b7ccab86b0d2caf8a7befe9bf9def3d0141400020481f696968df8f38785b2a9a2c2b7a2abd9d7d7ac1412000203fea6ffedd0a6e9e9dada909dbdbfb0f9e9d3858c0909000261bacbf3acc9c58bac91b4dcffcf8e9ca8ff87881408000201a6afe9f5c2bfb78bd8f1c4c9fee4be808df5b9800707000276f58bed9fe58381d68dc2adcfa8a3a4b79a90ce070600020190b4bbde95e38ca8d6a3cf909be7c1c8c0f0eee8140500020199dab7e2f9f8afa396eef5c1ae93deb5b7a6ac8008050002019ae3ecdbb699e3e6afefdfb6b8ce92f4a39381a0050500023290a9dd90b7e483adf69ceabcedac96f481aa8a1e04aac8dff8d9bbf9c1b4c9c9c1a8000606050400080306030f04020202020312040002020603100200020202030c0201020202031ba8b3d73682cae014b2cdf502a0dda3038da2f8f003f5878a93028cc282c479ea88, 0x10606140508040703010100000a14141408070709060606140508040703010100000a14141408070709061405090408040703010100000a0601011204000202060301141414120e0e0d0d0e09090907070906070300000a141414120d0d09091408070709061405010100000a141414120d0d09091408070709061405010100000a060602030200020302030f040202020203120400020206031002000202020301010200040202040282ba05d38d0182e3489608ccb62d9dab40d5e21ed5d10003f1cf8994b7c0ab97e0e5b2c6a2cf8005bbfa2099eb0188ebb056b9d50dd6f001d9ac4dd59533daa00013efcef3a5c5fde78fa8abf0f4f4a01414020203fcbfbafef787dbbd96da9390f4c3eab9a0e8cfd61412020204acfbdacaa5c3d1dddaaf9495bf93de948c98cffe140a02020cacab98cb9b869d9782fcede28b9a96c6c9eab0090902020182e383ce9af680abd48db79c8bb7ab98a9e0b4e81408020201d784858ee69cf8be84bfd4aedb93c6edea9bf3980707020201a590bf93a7e4a7d78da6abf39e97a3e7d3d3cfca0a0502021bf0a3b092c6e4eeade6a9abdad9f3f3b7c9caf80805020273aacab9dad0bda3d1beb1c69e8ceec3b3d1bdf80700020211abcce89ed9e5a7de9fedc7f3a4d1bee3fbac860600020236a5edc286bd8eb485fcbeb88addb7d99ff5ee841414010203fe8bfdccfae2eea1ce8d8398bd, 0x10000000a141414120d0d100a1408080807070101080000000a141414120d0d100a1408080807070101080000000a0613020106020204011414141212100a0a0d030e010e000d00090000000a1414141212100a0a0d030e010e000d00090000000a1414141212100a0a0d030e010e000d00090000000a061414140a090909060d0303030e010a01070000000a1414140a090909060d0303030e010a01070000000a1414140a0909100809060d030e010a01070000000a0601141414120d0d100a1408080807070101080000000a141414120d0d100a1408080807070101080000000a141414120d0d100a1408080807070101080000000a0614141412070709060606140508040d03010100000a14141412070709060606140508040101000009141414120707090614050904080401010000090601010114141210120a0a0a120307030e010e00090000000a14141210120a0a0a120307030e010e00090000000a14141210120a0a0a120307030e010e00090000000a061414140a09090906070303030e010a01070000000a1414140a09091008090607030e010a01070000000a1414140a09091008090607030e010a01070000000a0601141414120d0d100a1408080807070101080000000a141414120d0d100a1408080807070101080000000a141414120d0d100a1408080807070101080000000a061414140807070906, 0x11414141212100a0a0d030e010e000d00090000000a1414141212100a0a0d030e010e000d00090000000a1414141212100a0a0d030e010e000d00090000000a0613020106020204141414120d0d100a140808080707010108] private def node70:Certificate:=PackedParametricCertificateData.decode 8 data70 private def data105:List Nat:=[ 0x1f4abe1b4c1dcee84a3a9e0e9f2d480080802026fb2d7c1c3cc88909ce8fba192a08080180702020187aa9fcaf2cd84f1d3cf85bec8dec1c680801207020268a8fb84f1f4e0c6eade90c89b8ae1d1ac800706020201d290b9d7febeb2c99798caf9c3e88080060502027fc8f094f29bbdfd98c9eb94bfc08080141401022083a2e5b69ca1f5b3eaba80f0c3a4febaea141201021595f8b59ebd82b99eada592ac9bf4f098c2180d010209b7c98ca0f4a9bbd28ccea4bad3919ec6801208010217e7fd9cd7bbc0cd86b3a3f4e8d89f90c3a81807010201848498e4ab8afbdbb6de97ffa08aeafeae801207010274f3a5a9b7cbc4e984c4bbaff89dc383bcd806060102018cdfd4cef99bd6dccf979cf9b3bd8cf1800605010201baeffee5f6969992d39de8a5a6e880801414000216c3ddc1e38db1969efe83d3b1a7b4eaa880180d000202fb8e98e581c5e7b0c3f895c9cfb99de8801809000218ceb9ecfde4c284e8bef3fcc9cccaf7c880120800020ceef08698b5f1b58de9d0b092f9f4b2b4801807000276c3fdcdffd5f081dcf4f6ede3feb685b880120700027ce8bb8fd4b48583f18ae2999baa8587cc800606000243fe9ffca68ce2d3f2d883b1fa98edc0801b2afe9befb7e1fcac89a08000140c050400020306030b06090203080004040c03120400020206030c020202020203100400020206030102000402020301, 0x10905070508040d0301000000091414121012070905070508040d0301000000090601130405020202030114141210150e120e180d150d0905050000000914141210120e180d150d09051200050000000914141210120e180d150d0905120005000000090614141412180d10050905070508040700010009141414121005090507050804070001000814141412100509050705080407000100080601130405020202031204000202060301141414121210180d1005090507050700010009141414121210180d1005090507050700010009141414121210180d100509050705070001000906140403020202030c020b020502020a04080312040002020603100200020202030114141210180d1209180712071206050507000914141412180d12091807120712060714141210180d12091807120712060706141004020206030b06090203080004040c0312040002020603110410060102030603100400020206030115edf638f29f03a38503a386010394c28ea5d0b6abb89fe6ae8022f3e92ac0c6058dec05928b40d48657fdc50596970596980021ffdca7859e95c5cdabbff0801414020224cd9aacb2bda7a491efbdb0bcb38be3b580141202022397f1b985bbe3dea5a1c0cdb9d6bac3e180180d020202f9bfb2e98686afb3c3b285d6c093c080801209020208e9b7828799c5dcbda2ae8dd2dab7db8080120802021688ba, 0x114141210120e150d12090d031200050000000914141210120e150d12090d031200050000000914141210120e150d12090d031200050000000906130201060202041304050202020314141210120e150d12090d031200050000000914141210120e150d12090d031200050000000914141210120e150d12090d0312000500000009061414121012070905070508040d030100000009141412101207] private def node105:Certificate:=PackedParametricCertificateData.decode 8 data105 private def node106:Certificate:=.split node70 node105 private def node107:Certificate:=.split node27 node106 private def node108:Certificate:=.split node18 node107 private def node109:Certificate:=.positive 1 [(1,1),(1,7)] node108 private def node110:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node109 private def node111:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node110 private def node112:Certificate:=.positive 1 [(1,0),(2,10)] node111 private def node113:Certificate:=.positive 1 [(1,0),(2,2)] node112 private def node114:Certificate:=.positive 3 [(1,0),(2,6)] node113 private def node115:Certificate:=.positive 1 [(1,0),(1,3)] node114 private def data178:List Nat:=[ 0x114141412090914071107070714050505110006000a141414120909110707071405050511000600091414141209091107070714050505110006000906060605040008030603011204000202060310020002020203010b0603020202040110020d060a02090c0406030f04090408060006040604141414120d0d100a0909100809070707090000000a141414120d0d100a0909140810080707090000000a141414120d0d09091408100808080707090000000a0608040616001c0312030c040b040704020204060312040002020603100200020202030902080204020106040803141414120d0d09091008090707070900070000000a141414120d0d09091008090707070900070000000a141414120d0d090910080e0809070707110009000a060608040200080306030b06090203080004040c031204000202060311041006010203060310040002020603010e0402020206030d040108000603060310100e0e120912080a0812031800120011000914140e0e0d0d120912080a081203180011000914140e0e0d0d120912080a0812031800110009060608040200080306030b06090203080004040c0312040002020603110410060102030603100400020206030f08080607060212041a030e04020202060310060d020a060104040603010107020102020203060804060018031a030502010200040306030a040002020203, 0x1030e010e000d00090000000a1414141212100a0a0d030e010e000d00090000000a06130201060202040f0402020202041414141212100a0a0d030e010e000d00090000000a1414141212100a0a0d030e010e000d00090000000a1414141212100a0a0d030e010e000d00090000000a061414140a090909060d0303030e010a01070000000a1414140a090909060d0303030e010a01070000000a1414140a0909100809060d030e010a01070000000a06010f0402020202040114141210120a0a0a120307030e010e00090000000a14141210120a0a0a120307030e010e00090000000a14141210120a0a0a120307030e010e00090000000a061414140a09090906070303030e010a01070000000a1414140a09091008090607030e010a01070000000a1414140a09091008090607030e010a01070000000a06010f04020202020412040002020603010c0201020202040b06020200020304041414140a0909100807030e010a010700060001000a1414140a0909100807030e010a010700060001000a1414140a0909100807030e010a010700060001000a06140c0d020c02050c0408030f040202020204120400020206030c0202020202031414140a0909100807030e010a010700060001000a1414140a0909100807030e010a010700060001000a1414140a0909100807030e010a010700060001000a0614040302020203, 0x11414141212100a0a0d030e010e000d00090000000a1414141212100a0a0d] private def node178:Certificate:=PackedParametricCertificateData.decode 15 data178 private def data240:List Nat:=[ 0x10314140e0e0d0d100a09090e0707070303010100000a14140e0e0d0d100a09090e0707070303010100000a14140e0e0d0d100a09090e0707070303010100000a06060605040008030603011204000202060310020002020203010e060812030e0206041404010d300c020a1a0620043003090205040102000604060414140e0e0d0d100a08080e0707070303010109000a14140e0e0d0d100a08080e0707070303010109000a14140e0e0d0d100a09090e0707070101090000000a0608040616001c0312030e020b06070403040312040002020603100200020202030b02080604040108040c0314140e0e0d0d100a090908080e070707030309000a14140e0e0d0d100a08080e0707070303010109000a14140e0e0d0d100a09090e0707070101090000000a060608040200080306030b06090203080004040c031204000202060311041006010203060310040002020603010e0402020206030d1c0a1206120102041e0314140d0d0e090a080e070a030d010e000a000914140d0d0e090a080e070a030d010e000a000914140d0d0e090a080e070a030d010e000a0009060608040200080306030b06090203080004040c0312040002020603110410060102030603100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e03010107020102020203060804060018031a0305080306001a031c03, 0x1090e0707071000090000000a061302010602020412040c0c0304020e04120414141010100a0d0909090e0707071000090000000a14141010100a0d0909090e0707071000090000000a14141010100a0d0909090e0707071000090000000a0614141412140a100a09090e07080603030e0000000a14141412140a100a09090e07080603030e0000000a14141412140a100a09090e07080603030e0000000a060112040c0c0304020e0412040114141010100a0d0909090e0707071000090000000a14141010100a0d0909090e0707071000090000000a14141010100a0d0909090e0707071000090000000a0614141412140a100a09090e07080603030e0000000a14141412140a100a09090e07080603030e0000000a14141412140a100a09090e07080603030e0000000a060112040c0c0304020e04120412040002020603010f020906011200020414040e0608120214000e04220414141412140a100a09090e07080403030e0000000a14141412140a100a09090e07080403030e0000000a14141412140a100a09090e07080403030e0000000a0614040c020506010204040312040c0c0304020e041204120400020206030c020202020203141410100e0e100a0d09070714030e00070001000a141410100e0e100a0d09070714030e00070001000a141410100e0e100a0d09070714030e00070001000a06140403020202, 0x114141010100a0d0909090e0707071000090000000a14141010100a0d0909090e0707071000090000000a14141010100a0d0909] private def node240:Certificate:=PackedParametricCertificateData.decode 14 data240 private def data303:List Nat:=[ 0x10b140a0d0a0e07070708050e000d0000000a06060605040008030603011204000202060310020002020203010806070603080206040e04010d240a140616050204240309020504010200060406041010140c120c140b100a0c010e000d00070001000a1010140c120c140b100a0c010e000d00070001000a1010140c120c140b100a0c010e000d00070001000a06140403020202031010140b100b0d0a0e070707080510010d0009000a1010140b100b0d0a0d080e0707070805030109000a1010140c140b100b0d080e0707070805090000000a0608040616001c031203011204000202060310020002020203070204020202031010140b100b0d0a0e070707050510010d0009000a1010140b100b0d0a0e070707050510010d0009000a1010140b100b14080d080e0707070505090000000a0606080402000803060313040a0c030e0312031204000202060311041006010203060310040002020603010e0402020206030d1c0a1206120102041e0310100e0e100b0a080e070c030a030e000a000910100e0e100b0a080e070c030a030e000a000910100e0e0a080e070c030a0318000e000a00090606080402000803060313040a0c030e03120312040002020603110410060102030603100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e03010107020102020203060804060018031a03, 0x10707070c010c0000000a1010140c140b0a0a140907070c010c00090000000a1010140c140b0a0a140907070c010c00090000000a061010140b140908080805080409010e000d0000000a1010140b140908060805080409010e000d0000000a1010140b140908060805090108010e000d0000000a06010c020b0203020204040604011010140c140b0a0a1009150707070c010c0000000a1010140c140b0a0a140907070c010c00090000000a1010140c140b0a0a140907070c010c00090000000a061010140b140908080805080409010e000d0000000a1010140b140908060805080409010e000d0000000a1010140b140908060805090108010e000d0000000a06010c020b0203020204040604120400020206030109020802010c0002040e0408060706020e00080416041010140b140908080805080409010e000d0000000a1010140b140909050805080409010e000d0000000a1010140b140909050805080408010e000d0000000a060b0205060202030c020b0203020204040604120400020206030c0202020202031010140c120c140b100a0c010e000d00070001000a1010140c120c140b100a0c010e000d00070001000a1010140c120c140b100a0c010e000d00070001000a06140403020202031010140b100b140a0d0a0e07070708050d0000000a1010140b140a0d0a0e07070708050e000d0000000a101014, 0x11010140c140b0a0a1009150707070c010c0000000a1010140c140b0a0a140907070c010c00090000000a1010140c140b0a0a140907070c010c00090000000a060f0e0c02012c00040410040c020b0a030a00080412041010140c140b0a0a100915] private def node303:Certificate:=PackedParametricCertificateData.decode 13 data303 private def data364:List Nat:=[ 0x109000700030000000a1010140b120b0d0b080818070d000900070000000a1010140b120b0d0b0808180709000700030000000a06010c020b02030202040406041204000202060311040c0605020306031010140b0d0b18070d0407040e000d00070001000a1010140b0d0b18070d0407040e000d00070001000a1010140b100b18070d0407040e000d00070001000a06140403020202031010140b100b0d0a0e070707080510010d0009000a1010140b100b0d0a0d080e0707070805030109000a1010140b100b14080d080e0707070805090000000a0608040616001c03120301120400020206030c0a050203020006040a03011010140b100b0d0a0e070707050510010d0009000a1010140b100b0d0a0e070707050510010d0009000a1010140b100b14080d080e0707070505090000000a060608040200080306031604090403060306031204000202060311041006010203060310040002020603010e0402020206030d1c0a1206120102041e0310100e0e100b0a080e070a0318000e000a000910100e0e100b0a080e070a0318000e000a000910100e0e100b0a080e070a0318000e000a00090606080402000803060316040904030603060312040002020603110410060102030603100400020206031204050402060306030e0402020206030d1c0a1206120102041e0301010d04070400060306030a100402020603, 0x1120b14090d0915070e0309000600091010140b120b14090d0915070e0309000600091010140b120b0b0a140915070e030900060009060f120b02013600060414040c020b0a030a00080412041010140b120b14090d0915070e0309000600091010140b120b14090d0915070e0309000600091010140b120b0b0a140915070e030900060009060b0205060202040c020b0203020204040604011010140b0b0a180715071801090109000600091010140b0b0a180715071801090109000600091010140b0b0a18071507180109010900060009060b0205060202040c020b0203020204040604120400020206030107020106000203080408060706020e0008041604151510100b0a1409180715070b030901090009151510100b0a1409180715070b030901090009151510100b0a1409180715070b030901090009061010140b14090d09080808050d000c00070000000a1010140b14090d09080808050e000d000c0000000a1010140b14090d09080809010e000d000c0000000a06010c020b0203020204040604120400020206030c02020202020307020402020204060603020206030804010d240a14061605020424030902050401020006040604140b120b0d0b15091807150715060303180109140b120b0d0b150918071507150603031801091010140b120b1509180715060906030308061010140b0d0b0e0808081807, 0x11010140b] private def node364:Certificate:=PackedParametricCertificateData.decode 13 data364 private def node365:Certificate:=.split node303 node364 private def node366:Certificate:=.split node240 node365 private def node367:Certificate:=.split node178 node366 private def node368:Certificate:=.positive 3 [(1,0),(2,6)] node367 private def data430:List Nat:=[ 0x11107070705051100100006000a14141412090914071107070705051100100006000a14141412090914071107070705051100100006000a06060605040008030603011204000202060310020002020203010b060302020204010d100a06091e08020410030906080607020008040804141414120d0d09090907070710000900070000000a141414120d0d09090907070710000900070000000a141414120d0d09091408080807071000090000000a0608040616001c0312030c040b040704020204060312040002020603100200020202030902080204020106040803141414120d0d09090907070707031000090007000a141414120d0d09090907070707031000090007000a141414120d0d09090907070710000900070000000a060608040200080306030b06090203080004040c031204000202060311041006010203060310040002020603010e0402020206030d080a120806010a0412030e0e1209120810080a081203120011001000090e0e1209120810080a081203120011001000090e0e1209120810080a08120312001100100009060608040200080306030b06090203080004040c0312040002020603110410060102030603100400020206030f08080607060212041a030e0402020206030d080a120806010a04120301010702010202020306020202000203040305020102000403060304040212001c031603, 0x1141414120a0a0e080d030e010e000d00090000000a141414120a0a0e050d030e010e000d00090000000a141414120a0a0e080d030e010e000d00090000000a06130201060202040f040202020204141414120a0a0e080d030e010e000d00090000000a141414120a0a0e050d030e010e000d00090000000a141414120a0a0e080d030e010e000d00090000000a061414140a090909060d0303030e010a01070000000a1414140a090909060d0303030e010a01070000000a1414140a090909060d030e010a011000070000000a06010f040202020204010c0202020202040c0201020202040b060202000203040414141412140a09090d030e010a010700060000000a14141412140a09090d030e010a011000070006000a14141412140a09090d030e010a011000070006000a06140c0d020c02050c0408030f040202020204120811040b020306040e031414140a090907030e010a0110000700060001000a1414140a090907030e010a0110000700060001000a1414140a090907030e010a0110000700060001000a06140c0d020c02050c0408030f04020202020412040002020603011414140a09090e0807030e0110000700060001000a1414140a09090e0507030e0110000700060001000a1414140a09090e0807030e0110000700060001000a06140403020202031414141209091407] private def node430:Certificate:=PackedParametricCertificateData.decode 15 data430 private def data493:List Nat:=[ 0x10a06060605040008030603011204000202060310020002020203010e060812030e0206041404010d300c020a1a062004300309120704050600160416041414140a0e0909090907070714030e00070001000a1414140a0e0909090907070714030e00070001000a1414140a0e0909090907070714030e00070001000a061404030202020314140e0e0d0d140a090908080e070707030309000a14140e0e0d0d140a090914080e070707010109000a14140e0e0d0d140a090914080e070707010109000a0608040616001c0312030112040002020603100200020202030f02080604040106040a0314140e0e0d0d140a09090e0709070707030309000a14140e0e0d0d140a090914080e070907070709000a14140e0e0d0d140a090914080e070907070709000a060608040200080306030b06090203080004040c031204000202060311041006010203060310040002020603010e0402020206030d1c0a1206120102041e0314140d0d0e090a080e0712030a03120010000914140d0d0e090a080e0712030a03120010000914140d0d0e090a080e0712030a031200100009060608040200080306030b06090203080004040c0312040002020603110410060102030603100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e03010107020102020203080206020008030803070205020008030803, 0x11302010602020412040c0c0304020e04120410100e0e140a0d090909140807070d00090000000a10100e0e140a0d090909140807070d00090000000a10100e0e140a0d090909140807070d00090000000a0614140e0e0d0d140a09090e07090603030e0000000a14140e0e0d0d140a09090e07090603030e0000000a14140e0e0d0d140a09090e07090603030e0000000a060112040c0c0304020e041204010c0202020202040f020906011200020414040e0608120214000e04220414140e0e0d0d140a09090e0703030e00060000000a14140e0e0d0d140a09090e0703030e00060000000a14140e0e0d0d140a09090e0703030e00060000000a0614040c020506010204040312040c0c0304020e041204120411040a020306040a0314140e0e140a09090e07070303030e00060000000a14140e0e140a09090e07070303030e00060000000a14140e0e140a09090e07070303030e00060000000a0614040c020506010204040312040c0c0304020e041204120400020206030110100e0e09090707140312030a030e00070001000a10100e0e09090707140312030a030e00070001000a10100e0e09090707140312030a030e00070001000a061404030202020314140e0e0d0d140a09090e0707071203030300000a14140e0e0d0d140a09090e0707070303010100000a14140e0e0d0d140a09090e070707030301010000, 0x110100e0e140a0d090909140807070d00090000000a10100e0e140a0d090909140807070d00090000000a10100e0e140a0d090909140807070d00090000000a06] private def node493:Certificate:=PackedParametricCertificateData.decode 14 data493 private def data553:List Nat:=[ 0x1030c010e000d00070001000a06140403020202030e020b0607040304041204000202060310020002020203010806070603080206040e04010d240a140616050204240309120704050600160416041010140c120c140b0a030c010e000d00070001000a1010140c120c140b0a030c010e000d00070001000a1010140c120c140b0a030c010e000d00070001000a06140403020202031010100e140a0d0a0e070707080503030d0009000a1010100e140a0d0a0e07070708050e000d0009000a1010100e140a0d0a0d080e0707070805100009000a0608040616001c031203011204000202060310020002020203070204020202031010100e140a0d0a0e07090707070e000d0009000a1010100e140a0d0a08080e0707070e000d0009000a1010100e140a0d0a12080e07070710000e0009000a0606080402000803060313040a0c030e0312031204000202060311041006010203060310040002020603010e0402020206030d1c0a1206120102041e03100e0e0e10090a080e070a03120010000e0009100e0e0e10090a080e070a03120010000e0009100e0e0e10090a080e070a03120010000e00090606080402000803060313040a0c030e03120312040002020603110410060102030603100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e03010107020102020203080206020008030803, 0x11010100e140b0a0a1409150707070c010c0000000a1010100e140b0a0a1409150707070c010c0000000a1010100e140b0a0a140907070c010c00090000000a06130201060202040c020b0a030a00080412041010100e140b0a0a1409150707070c010c0000000a1010100e140b0a0a1409150707070c010c0000000a1010100e140b0a0a140907070c010c00090000000a061010140b140908080805080409010e000d0000000a1010140b140908060805080409010e000d0000000a1010140b140908060805090108010e000d0000000a06010c020b0203020204040604010c02020202020409020802010c0002040e0408060706020e00080416041010140b140908080805080409010e000d0000000a1010140b140909050805080409010e000d0000000a1010140b140909050805080408010e000d0000000a060b0205060202030c020b02030202040406041102090203060306031010140b140908080805080409010e000d0000000a1010140b140909050805080409010e000d0000000a1010140b140909050805080408010e000d0000000a060b0205060202030c020b020302020404060412040002020603011010140c120c140b0a030c010e000d00070001000a1010140c120c140b0a030c010e000d00070001000a1010140c120c140b0a] private def node553:Certificate:=PackedParametricCertificateData.decode 13 data553 private def data615:List Nat:=[ 0x1120b0d0b08080b010900070000000a100e100d140b0d0b080810070b010900070000000a100e100d140b120b080810070b010900070000000a06010c020b0203020204040604120400020206030b060502020203100e140b120b100707040b010e000d00070001000a100e140b120b100707040b010e000d00070001000a100e140b120b100707040b010e000d00070001000a06140403020202031010100e140a0d0a0e070707080503030d0009000a1010100e140a0d0a0e07070708050e000c0009000a1010100e140a10090e07070708050505090000000a0608040616001c031203011204000202060310020002020203011010100e140a0d0a0e07090707070e000d0009000a1010100e140a0d0a0e07090707070e000d0009000a1010100e140a100908080e07070710000e0009000a060608040200080306030e02090603080308031204000202060311041006010203060310040002020603010e0402020206030d1c0a1206120102041e03100e0e0e10090a080e070a03120010000e0009100e0e0e10090a080e070a03120010000e0009100e0e0e10090a080e070a03120010000e0009060608040200080306030e020906030803080312040002020603110410060102030603100400020206030a02050602080308030e0402020206030d1c0a1206120102041e03010107100506001a0318030a040302020203, 0x10900060009060b0205060202040c020b0a030a0008041204100e140b120b0d0915070901090006000300091010100e140b120b0d091507100709000600091010100e140b120b0d09150710070900060009060b0205060202040c020b0203020204040604010c02020202020407020106000203080408060706020e0008041604151510100b0a140915070b070a020900030009151510100b0a140915070b070a020900030009151510100b0a140915070b070a02090003000906100e140b140908080a0109010d000c00070000000a100e140b140908080a0109010e000d000c0000000a100e140b14090808090509010e000d000c0000000a06010c020b02030202040406040c020302020203151510100b0a1409150710070b030901090009151510100b0a1409150710070b030901090009151510100b0a1409150710070b03090109000906100e140b140908080a0109010d000c00070000000a100e140b140908080a0109010e000d000c0000000a100e140b14090808090509010e000d000c0000000a06010c020b0203020204040604120400020206030107020402020204060603020206030804010d240a14061605020424030912070405060016041604100e100d140b120b0d0b150915071007150609100e100d140b120b0d0b150915071007150609100e100d140b120b0d0b1509100715060806100e100d140b, 0x11010100e140b120b0d091507100709000600091010100e140b120b0d091507100709000600091010100e140b120b0d0915071007] private def node615:Certificate:=PackedParametricCertificateData.decode 13 data615 private def node616:Certificate:=.split node553 node615 private def node617:Certificate:=.split node493 node616 private def node618:Certificate:=.split node430 node617 private def data679:List Nat:=[ 0x10610010b010806100d140b0d0b120a0a0a0a0808080900070000000a100d140b0d0b120a0a0a0a080b010900070000000a100d140b0d0b120a100908080b010900070000000a06010c020b02030202040406041204000202060301100d140b0d0b100907040b010e000d00070001000a100d140b0d0b100907040b010e000d00070001000a100d140b0d0b100907040b010e000d00070001000a0614040302020203100e100d140a0d0a0e07070708050d000c0009000a100e100d140a0d0a0d080e07070708050c0009000a100e100d140a0d0a10090d08070708050c0009000a0608040616001c03120301120400020206031002000202020301100e100d140a0d0a10090e0707070a030d0009000a100e100d140a0d0a10090e0707070d000c0009000a100e100d140a0d0a100912080d0807070c0009000a060608040200080306030e02090603080308031204000202060311041006010203060310040002020603010e0402020206030d1c0a1206120102041e03100d10090a090a080e0710030a0312000e000910090a090a080e0710030a03120010000e000910090a090a080e0710030a03120010000e0009060608040200080306030e020906030803080312040002020603110410060102030603100400020206030a02050602080308030e0402020206030d1c0a1206120102041e03010107100506001a031803, 0x10915070d0309000600030009060b0205060202040c020b0a030a00080412040c0203020202040c02020202020407020106000203080408060706020e0008041604120b14090d0915070b070d0309000300020009140b120b14090d0915070d0309000300020009120b14090d0915070b070d030901090002000906130201060202040c020b0a030a00080412041515101014090d0915070b07090109000300091515101014090d0915070b07090109000300091515101014090d0915070b070901090003000906100e140b14090d090a0109010d000c00070000000a100e140b14090d090a0109010e000d000c0000000a100e14090d0910070a0109010e000d000c0000000a06010c020b0203020204040604010b06050202020407020402020204060603020206030804010d240a140616050204240309120704050600160416040d0b150910091507100715060d030b010300090d0b150910091507100715060d030b010300090d0b150910091507100715060d030b0103000906140b0d0b140a120a0a0a0d030d000900070000000a140b0d0b140a120a0a0a0d030d000900070000000a140b120b0d0b140a120a0d030b010900070000000a06010c020b020302020404060408020602020203100d120b0d0b150915071007150615020b0109100d120b0d0b150915071007150610010b0109100d120b0d0b1509100715, 0x1120b14090d0915070b070d0309000300020009140b120b14090d0915070d0309000300020009140b120b14090d] private def node679:Certificate:=PackedParametricCertificateData.decode 12 data679 private def data739:List Nat:=[ 0x10d150910091003150216010706100e160d100d140a120a0a0a10090900070000000a100e160d100d140a120a0a0a10090900070000000a100e160d100d120a0a0a10090a080900070000000a06010b020902030402020406041204000202060301160d100d140a10090d0407040e000d00070001000a160d100d140a0d04070410030e000d00070001000a160d100d140a0d04070410030e000d00070001000a0614040302020203100e100d140a0d0a0e07070708050d000b0009000a100e100d140a0d0a0d080e07070708050b0009000a100e100d140a0d0a0d080e07070708050b0009000a0608040616001c03120301120400020206031002000202020301100e100d140a0d0a10090e0707070a030d0009000a100e100d140a0d0a10090e0707070a030d0009000a100e100d140a0d0a10090d080e0707070b0009000a06060804020008030603060203040202031204000202060311041006010203060310040002020603010e0402020206030d1c0a1206120102041e03100d10090a090a080e0710030a0312000e000910090a090a080e0710030a03120010000e000910090a090a080e0710030a03120010000e000906060804020008030603140403020202031204000202060311041006010203060310040002020603100402020202030e0402020206030d1c0a1206120102041e0301010b300902070a031003, 0x11514141014090d091507090109000600020009151414090d09150709010900060007151414090d091507090109000600070613020a06051600020408040b06090203080004040c040802030600020308040c02020202020408020602010c000404100408060706020e000804160415141410150a14090d0915070a0609000200091515150a14090d0915070a060900071515150a14090d0915070a0609000706130201060202040b06090203080004040c04080206020202040c06070605080308040f02060604060002040804060603020206030804010d240a1406160502042403091207040506001604160415141612160d15091009150715061403020009151516141612160d1509100915070716141612160d1509100915060606130201060202040b06090203080004040c041010160d150910091507150607021601030009160d1509100915071506140307021601030009160d1509100916071506150210020706160d140a120a0a0a0e030d0303010900070000000a160d140a0a0a0a0816070e030d030900070000000a160d140a0a0816070e030d030e000900070000000a06010b0209020304020204060401160d100c100b15091009150715061502160109160d100b15091009150715061502160108151516] private def node739:Certificate:=PackedParametricCertificateData.decode 12 data739 private def node740:Certificate:=.split node679 node739 private def node741:Certificate:=.negative 1 [(3,2),(1,7)] node740 private def node742:Certificate:=.negative 2 [(1,0),(3,1),(2,6)] node741 private def node743:Certificate:=.negative 1 [(1,0),(2,2)] node742 private def node744:Certificate:=.split node618 node743 private def node745:Certificate:=.split node368 node744 private def node746:Certificate:=.split node115 node745 private def node747:Certificate:=.positive 3 [(1,1),(8,4)] node746 private def node748:Certificate:=.positive 3 [(1,0),(2,3)] node747 private def data767:List Nat:=[ 0x1141412120d0d100a0909100809070707070309000a141412120d0d100a0909100809070707070309000a141412120d0d09091008090707070703140109000a060608040200080306030b06090203080004040c03120400020206030c0403020102030403100400020206030b0603020202030e0402020206030d100c120a36012004300314141010140912090a0914081208140012000914141010140912090a0914081208140012000914141010140912090a09140812081400120009060608040200080306030b06090203080004040c031204000202060311040c0804020302040803100400020206030f08080607060212041a030e0402020206030d100c120a36012004300301] private def node767:Certificate:=PackedParametricCertificateData.decode 10 data767 private def data776:List Nat:=[ 0x1a8a393c3f0a8cdf5d6a01407020202a2ceb29ea2c89befb899aff1841207020218ce87cea3a1bddce5d7e1faaabc0707020253bfbcd8ebddc6e2c88ee380140002020cfef5f9cfa197ebbfaca1a39c1200020226dfbed5a3d0bafba48af59a841414010209f8c5d7978797fb9ab997ac8180100901021badbdb0c2d4aacac5d0caee801408010212f0f48b96a29ac9c0e1f0dffcb81208010227b9a4b48580f5f99ccedaf9ddf8090801024fa2a6db92fa99b0f8c4cca3801407010201a8c0b4a9bcad88dfa8d38fa2e2120701021693f2e8cadbd2eca28deda6c2d6070701026bf69be5cf9df5f697e7b9ba80140001023adba69a87be84fdd79decd4de120001020ad0ea8caaf8f8d2d5c298d09a1414000209e5fa85f1e8cdd9c8ba9ebbc8c0090900022dbfd0c3b0cd929ea2b6e3c6c01408000212b9e88788c6c1e4bafbb0caa5b21208000225f1a2d7a0c8bee795d58bd7b996090800020290fbf9bce8a0848fb9c8abee80140700026afa86f5aa8ac9ad83f6f1c4ce1207000214adcedef587a299af85da99d3ea070700027688efca848cc883e5abb9d6801400000265d4918fe7a8e68bcb9099d9801e07ebffd3c0d2a0000608040200080306030b06090203080004040c031204000202060311040c0804020302040803100400020206030f08080607060212041a030e04010200020308030c060a120008030803, 0x104f7d502b0f86ff3ea3289c106cfc40bb2a16eb0f331c8ac002284d3b8be9fe2e0141402020a8983aedcebe2e8f184cb9992e0100902022cb1f4cbf5c6cad9bf90c4e01408020213c0fdda9bec8e9db3b3a9cfa2e01208020228de98edc286f4b9e3cea4cafac009080202509e] private def node776:Certificate:=PackedParametricCertificateData.decode 9 data776 private def data815:List Nat:=[ 0x1acbaafeeacf6a8dda69caf840909010220d889a0bb9091adf3ddfb85e99fd8e0908ff9dc9bc8f286d01008010208b6f2b0b392ffc8d980d1bff6beeafcc3ca81cfeec893dcf41007010238a9f5f6b888efefadeedfcef8f8b6f7eaa6e1d6dd88dc839407070102539daffddae9d9c3dcb19e9ebaf6a7afe986a882d0fdc0bf80140501021dc8d1a78fb3e9e1ba9c8e9ff1b99d80b7aafef1f0f3d7a8ee0805010201cde2efc289cedeb0efdcb6e487ad80eadfb1e8b9fdaf96ba0703010214e3e098fe85e7f6cfcecfa3cde29db7ce82d3e69c86838eda1410000226c2fc8dfcd7caf6ccae84efe183a99ae29aafe88bbebdf0801409000229f2fea0c8918fbecab4acef9ef693f3b4d79bcda0b1ba96a00909000204cd92f7b2f2fda7fec4c4a9d7faabc587cb868d84d4cde0881307000227d6badac5dcfcade3e9c3efbeb2d4f4c784ec8bb9e081bee81007000202c39eb3f6959bdfe1d392b79f8fb8bfd7fd86c281e5f2c9c8070700021698f1c1a69898ccac9ddabde488d5e3a29cfbca9ea8f4e6fe140500021ec5d380e3db83bdf49d83af88ffe5cda09485a0b5d8afb9c0050500027e92b6e4b9c0cf90c8ec9f83dfe99cafdd9de19f9faf89aa1e09c0cb899c8289b0e2f9d3d2bca4df80d6a2f8000608040200080306030b06090203080004040c03120400020206030c0403020102030403100400020206030101, 0x18bd3e0d088a0000606050400080306030f040202020203120400020206030c0202020202030c02010202020335dc11e35a8b0191813187e03e88f51f8fd60e89e1000fe3e68ebdb7d5bec9c8a8c9dda4cdefa898a0d29002859307ebce3fc301af852eaff2088ba740f3d92288d60008b68ba1fef592928c9e8fc386bda681cee29cb2b00eb0bc57f4a701849eb242878506c1912bb8bc43ecc521ee920017fdb9bf94abf6e689d78efd9de7f3affb89bae0121202023afebea2fb988fa1ea94a68e84dac3e5fb81c5c5b7cdf491c0140e020212f3b19bd1abe7d1a180c1a786cda8d6cab1f4a8f19de2e8a00d09020212e6fde0e78acddf85d1a9b5bbbce685d1a0ecf3928c9ab00a0802020cb3d1ceed92ef8aa581a2f9b5e99be3f0ae9f94b5c6f2de881007020209ab87d7dbe2ab9f8fd8c8c9aa9484a8d784d288fccdf4eda0070702020eddbfb292a4cb9398c1c7e0a28d979cfca6d295a9a983c49c1203020255a3aea9eed1e489e9fd90b184ad9efdfad5a3af86b9f7cea00803020205d3b4d7e2d5effbf5e8c380b0b59fdfdcba8acfe984cde7a40703020213fac382d295d5e0d0f8efb886859c91f6a98ebe91b5a3c69814010202088fabc7d5889faba9809c969aa4ec938eecbaff92ccabac1410010202d8a48ba7c3dff9d591e2e3c5fef4fedafed1a4bdd285dbe0140901020bf6ea8af78a8b8e92f4f9cecf, 0x19ed88b83b2b1bdb61010010220be93b2bc8afcaab0abe8bcb7c1b6f1a3a9b3e5e8eea4aee0100901020b8aebdae88484c3c48a8486d3e9fa92ceb5d0cd989089ace00909010201d4bfb1e4b584edd688dab7cf8d89b5b0b0aaa6cce0e8bb981008010201c3d8cadbecad9ed182f4f19ac4dfe2fadaafdcb2c280b7a0060601020f97d1eeadd2c6aad39c86fed8c786b581e3ccf8cea6e5daa8100501022692e5ac9686e6b6ecd093c4e1f99a82e3e6b6eebeacc993e00905010204a89396a3d4e3aac2c1dfc7fbb799f9eebc8683dade9384800805010204efcce6b2d0fcf3c8f086a9efcec7cef6fcd5878dacdaccc0050501020aa191c88ee3c8ce9a99dee48faebbc59fcaf0a6c7caf4b280101000021f8283edbb938696d89fabd18dbedceddb8dcfe08eb9e080c0100900020abd86fbe0dffdd2bf87a1eba9ecfbbedaa3bcea9eccbbd480090900027bb6adecb2f38dd0d9e19cc6849cdc9481f0b5eac4c9b2a0070600026acaa6b08c99ecb2cda192ede6e8b9afefabe08be7b39ea00606000205f0ed9782b989f1d491c594b9a59cd18689d7eb80908cf3a01005000227fe8eafcaa3848cf5a2a88ce5d19996d8e68ae2c8e9cec0c00905000208a8c4cf8380f3c3ad8281eb95a1b0eeb5c5b0e0eeb586c4e00505000210978ac4ffe2b8c2fda0c1f7bd8debe08af6bfefa596fbf0801e2385ea8de0aab8ccfacbe485, 0x11401000244fa98a9eb8d8cffbae7d8c5f3a5e3cc9c8b8888010100024884c8a99ca8e6e7c1b294b2fdf89fdeaf9084b81e05a0d1ef8eca8383e49899b6e7b0000602030200020302030f0402020202031204000202060301010102000402020401eeb901dab702cada02b6891ed79239c4b931ccae16bfbb0036a8db9ba9cacae6d78a9490e59a928c90caeaa00bc9cc13a7b10c8ea202f5bb2df6a0159983388ac123bc880003aa88d4d5d2e78ac7ffd6aef19eb7cff693808048b1d811e9da0184edcd46ec9813d4f918d34382ce2a87a90001dfc3aebfb395f5bc8fb7a7eccea4f1c6a3f2e01414020206db8b82d1ae92bae4e0bfe0f1cfddf98895e4b7cd87b6b3a0101002021986e0f7a0c4cfd7c68afbebc89cb6f48088b7b2e987e283c0100802021382b0c7eac6bbadbfc291c396f0e5c0a1bbd6e6c28598cd980e0702027ba79df7fba09df9dac3a39d90b385a1eedae5f5ddf39688100502020fe087f3dec3f786a58aa5c4d4f0d0ed898a8fa3fef29581c209050202038f8eece5a5c0b3acb28aa9caa1c18893dff2a0cb87b98ae80805020209b888bad88ebda1d5d7df80b1d0f9b4c7e099fba0acbdaff2050502020488c5e6b2f3ba92bfbca99dbc9ccfd4ddbb9585b0cba298a41400020201cbf1b2aabdf485dfe893a1d2ccbf94bebbebfed3cbbdc7ea0600020201ffa5b3ff92ae9fb3dfa6f183929dbe98, 0x169cbbf82eeec92a49decd1bac7d786d0afb7fbc409060202058a82bbdab6b8cd9682c6f6c69eabc5f9d8cf93d2080602020280b7a88dc6fe9798b2aad28fb5a9f2e897b692ce0703020201adf891f0d5ddbb9ed583edc5e0eee7849bedef82010102024ad798b2ffb0e894ad80ede48db5a9cf95bfddde1414010205adb5df89d49faa8aa48fb18ab3addbb586ce88e01008010203e3cd8ceeb1c584aec39da6b7ac87f4faa2a2d4f00707010203dcb9e9bdb5c8e6b0f2a5a8aea8e7bda1b1e6d3840a06010270fa8bbdf080bee6ada9ddefb2a5a488d7cde0c00906010207ce8eaec68ebadcc2e6e89bdcc9c0f8a1abee85f0050501025788f0c7a996d7c7edadbb8bbcfb9ef4dcd6e0ec070301020196b9afa0f7caa2f3bab6c699d2b3f28ae6ab97a01401010209b499efcd84b7dd82ddc9f3a7b0d287f9f9d1f0010101025783f9aba3dc98a0f894f491db81b9bc9cf08ad014140002059f93a3e7e6b78fdfd49aff97bbef8ef2aa9bc5e01008000203f088bcecdea6a8e2ff9f9f99c4ca95beb1be91e80707000203b9d387a8e7ebca939aec99d5bec8fde9a6cfa9d60a06000263e1bbc4cae09cc995ba81c4a3c4e3dba3ddf4a0090600020893e8deeadefbcbcfb293ac9bed9ae8e6c9f5b3c80505000255da9ff6aeabf6fe98d2c5de8dfef681c8d0c1aa0703000275c3b8ceaf97ee8d879bbfced4fdc5deb0c5a3d0, 0x1ac070701021cd28efbb7c2ee89c5a5e984b2b20906010241dfe8c7c6fcc0d9c8a2c7a288f00505010205e8c189d7f4c2b5e59582bba1ce0d03010206cd82d3dac7e18c96aeecf1fb840101010205e48d8d93dece9d87a3b4ccad90000001021e97f3d1d9a6b0a1d28fdb9c80141400022791caf28ae7cddbcbe8e2b8e480121000021890abf0b195f0d7c6b8e0a0e9c01008000216a1d8d3b28ccedf94d3e6b5e0c00707000221b1c3aedf9d859c95becdec9880090600022ed2f3a2a3edf09ccbeafba48980080600021a86a78186c6ceace8dee6c7ec800d03000202838dd7dbba87f985eafc9c9ec01401000204d7e2b4e68dffa2ede9d8de9f800101000204e9e48bf790e28aa9edda8ac9801e2acaeea6aad280000602030200020302030f04020202020312040d0404020106040c03748013e149a002ac832cd9ce41c99b1eab860bc9f10002faa0cabe898cdbe4e286b483d8bcc0329286018cafe624f1e731ada330dbbd55b19518adc423db92000a8087b792e0fafae4d1e484f2d3801414020205aac6b8bb8df692ef81a6dccff2cabe9ee0bc8aa2100a02021efbf5d3b0a9e6d8d8d6ce9c9ce090b4fd9dabba090902020aeee6f9c8f88fececeae7c695c2bca691d0b0901008020203c3dcfafeff869ea5dab6f4a88ecfacdcf1cdb4960707020204bbf5bd8bfee681baba86c7a08291908bd6d9cfc00a060202, 0x10d0d100a100807070900080000000a061414100a10080707090608040d030902010100000a1414100a10080707090608040d030902010100000a1414100a10080707090608040d030902010100000a06010114140909100809060d0303030e010a01070000000a14140909100809060d0303030e010a01070000000a14140909100809060d0303030e010a01070000000a061302010602020314141008070706060804060403031401010100000a1414070706061005080406040303010100000914141008070706061005090403031401010100000a061302010602020301011002000202020419922b8702bba803ffad20bebc43f2ab25cd920dcab30017abb38bd3eba8c8801414020223db8089df9188af8fdcbbcba4f01210020211b4e7eed9d4b398ff8ebfdeb5dc100a020206c59688cec3f1f8c4cdcfa2e1f01008020218c0f0c0e2f1d4f8ffdee9abeccc0707020223eed388dec2c2a6ebd4dce5e8800906020221c9d9d5bae8dae4f4bca996d4f80806020217d8b3c6f2c2ccf1f4a583e9b4f80d0302020ca39cc98882a0dbbad7bde5b5e401010202058ff9d0839288a5eca28ca49c90000002024ea285d5f4abc0abc4f2b9e080141401022689ca9af2d98ba7c7b2b5f583f01210010217dbd4d1d0f39feecdf0ee99bcbc100a0102248e8fcdec86fff0b882d780f01008010218dab38fe2fe92b1d4f2c4e9be, 0x114141210120a0a0a0d030e010e000d00090000000a14141210120a0a0a0d030e010e000d00090000000a14141210120a0a0a0d030e010e000d00090000000a0614140909100809060d0303030e010a01070000000a14140909100809060d0303030e010a01070000000a14140909100809060d0303030e010a01070000000a06011414121212100d0d100a100807070900080000000a1414121212100d0d100a100807070900080000000a141412121210] private def node815:Certificate:=PackedParametricCertificateData.decode 8 data815 private def data849:List Nat:=[ 0x1ff04c18704c188002ba79197fcf69c881414020231c1a6e282878c92b3a0c0b4e8121002020dee80f7bcc49c9effffd78ff0130802021cb0efb3b0c6b7cdc589f6f7a8120802021fe4d5d48281dcdcd2f4cebee80808020209caafc6e9fde184c8fe981407020250a18ae3b292d3aaebeff890861207020201adbbadaec0bdc59ffcfbaaf8ba1405020202a8a3d48dcec3d68281abdad80605020201b283b98fa583b6b190c1b00700020230f280c5abe3b18ae3e7981414010231ebddb2dbd1cdb5b6b2feed881210010203b7b5a7c8c4e6f2b7f58680c8130801020c9ac9ba8dce91fab0d097a1e01208010220e2a181bf99c5efc7f8e0c8d81407010250b8cbc6a9a3f492c5dcf194d41207010201b98e99a9c391bac595f8b3acb00606010201cbf0ecd1ace4a49782acccc01405010206bfd3dacd939799a1a5f7b9fc06050102019d8d9e8189e5f9f8cb8bc0141400022fc2ece99a92f8b6e8ccc2be80120800021bb3b2dfd4a2d9c2f49e93ab98140700024d839cff9fd0f1a5a6b0a59ab81207000201c3c6bef1d0baaee5eb93fbd2a80606000201c0a3c392e4f7dbeffc8aa2801405000202f8c5fc8ea9fde2a595c0d4f01401000204949accc485c6c6938cafff881b3bfebbd584c000140c050400020306030b06090203080004040c03120400020206030c020202020203100400020206030102000402020301, 0x114141210120e150d140d12091401050000000914141210120e140d12091401050000000814141210120e140d120914010500000008061414121012070905070508040d0301000000091414121012070905070508040d0301000000091414121012070905070508040d0301000000090601130405020202031414121012070905070508040d0301000000091414121012070905070508040d0301000000091414121012070905070508040d0301000000090613020106020203130405020202030110020002020204141412101207090508050d0303030700010009141412101207090508050d0303030700010009141412101207090508050d030303070001000906140403020202030c020b020502020a0408031002010202020314141210140d0905070506051401070001000914141210140d0905080507051401070001000914141210140d1207090508050705070001000906140403020202030c020b020502020a04080312040002020603010114141210140d1209140712071206050507000914141210140d12091407120712060714141210140d12091407120712060706140403020202030b06090203080004040c03120400020206030f060102020203100400020206030104d4f51adfd604bad404bdef3681f8518a] private def node849:Certificate:=PackedParametricCertificateData.decode 8 data849 private def node850:Certificate:=.split node815 node849 private def node851:Certificate:=.split node776 node850 private def node852:Certificate:=.split node767 node851 private def node853:Certificate:=.positive 1 [(1,1),(1,7)] node852 private def node854:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node853 private def node855:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node854 private def node856:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node855 private def node857:Certificate:=.positive 1 [(1,0),(2,2)] node856 private def node858:Certificate:=.positive 3 [(1,0),(2,6)] node857 private def data877:List Nat:=[ 0x1141412120d0d090909070707140512030a0309000a141412120d0d090909070707140512030a0309000a141412120d0d090909070707140512030a0309000a060608040200080306030b06090203080004040c03120400020206030f060102020203100400020206030b0603020202030e0402020206030d080a120806010a04120310100e0e1209100912080a081203120010000910100e0e1209100912080a081203120010000910100e0e1209100912080a0812031200100009060608040200080306030b06090203080004040c03120400020206030f1c0a020606040c040c03100400020206030f08080607060212041a030e0402020206030d080a120806010a04120301] private def node877:Certificate:=PackedParametricCertificateData.decode 10 data877 private def data935:List Nat:=[ 0x1acefd5ab898ed5adf6dfe3cbf18586c3df9bdcc9a5c80706010203ccada1dca083e1d7998beaab92a1c2bbffccdbdcbf929f9aeebde01005010227ddf3c7d695c994f2e3fff5cff19280abdad198e4958ccab39bedc00805010256a9e7a1d9efe18cdec6f1aa92b8b0a3ae8cc4dfbf8bb9ca9afde00703010207c9c7eda89f9ec0c3ec9ed680b1b1e8ac8eb1accfb783d6a581b1c0050001020380edfcd1edba978b8ae3d9bbff98a9f6f8aa88d3ae8efab8ebd2c81414000203ecd1afe0bdad85a6e1f7dc88899f83f8c5c0bdf48af3dcfe85bf800909000202b59596fbf29797f1f5dfd1ff8db59380c8d2b8e9f5f381ebd8af800707000202fcabc1c5d7f1ee98ded4d9a684b494b8edaf94e583f1e7b698bb80140500020a82f8e1a4e691eaccdce4cca4948ab185e2ffe6e2d989a7959fa580100500021a9985f2cdc58dc3a1d3b2b7b8e2dcaebec2bab5baf1ddeed2f08ba0080500023fa9d59fefc5a7b8de88ba9687e9ec9cd9dcca9880aee2ea89f5800703000206b4b8a3f9af9af6cb8f968ae296d0e8f1c1e4d581ce9bfaf5b993801000000225e2d7d788d3dee7eea0c8dfe4b28ddcd8bca899b1ddb8a1e0f6a01e01ee80cc83f1abfbe0c1d8e8c686f0d7c5fcffd39280000608040200080306030b06090203080004040c03120400020206030f060102020203100400020206030101010a0607020002030204, 0x1a2e32eefb60ef5953ee7932297e20001bcfd8f9dfdca86b484969d85b1e9b892e08cc9e9fdb08018b3f93296af01919eb64ae2db0cbce818d7c649b1d325f6ac0003baa8c180d4d0839cfdf1bd8dd3c2a9fcdfc9d194cd801414020205edad98fa9ceaabe892f6c48c83b58fb8d2c894bd94f695c1ade9c80a0a020240abd6a2dca4e693dbe99ae1f7f98385ec88c2b8b3839adca2c3a80a0802020289eafbfbbf9f83c9a096aaf8d7afccc98799c8cea2bfe1d4dec0f00707020203ab839af5e683a2a7cbd2ddddbcf59aa8cee886c1dd8b82bfedefbe140502020deb9182f48af9a29fbec8cccad6bea883aadbd8d6aeebd59decff9010050202168fcbecd396a0b2cddda3e2ea89b7e09bd1caad80dfa0afcdb1eae8120302020383e7e09ef8fbd0f89cb995a9f4b6e183a1df8390d1cafabab48af0070302020992e4e980a1d9adfbc38db4e9d1b8bcabadccaeaeb9d4b2e5cd97f807000202019ae396b78fa8d2f4d5a380ec83c3ab95fe9ec4e5bebc9696f8ae90000002020cfbed81ccbca7b5a894c3ddbeffdce4b5d1a996a1f1d493b6d1ca1414010201aeb4d0db80a4b384cfe8bdfe8df186ffc6bcb4bbf5f588d28ec2801010010202809feec3ffbcc0ab9e92cea683c487a6eb86af83c3e1efdfdea1800909010206938de29debd3c191baf7fcfde5f69686f2a6dfafbfe29b8faaeda0070701020991e9ecc7b7, 0x1ce94b9b6abd1d8fb998cf19495f8800707010219a1e1d2ed9391d2fbe8cbe391d2fbf8b2e8dec5e3aff8800505010243e88e93d3fdd1ffd3b6e7cc8bc3c0d7b5ebcfccacf1fe80120301027390da93e390ee86f5d3e6b3d1d8b5fc92e6d7ddf3cf82800703010230ddbeaea5dca7fc81f796eba9a0cfc5decde9a893aed2801000010205b8cde79a9ad5f486ada3dcd9deba9e92b38cefb3ffc480060001021dace3e7a48cc19aa4eca0f9b2a0f0b889cdd7a684f4801414000203f2f48698b4b6b3d1ecc7f4dc99a18ee7ec8ebddcaad0801111000271d3bbdaeaa6ec8e8dd09697b883bd9f9efce9dc82dcb480101000022ae8b9e5fdef9d8a92d4d282a08abea2caac9ce3ffc2e0800707000208b5c2a6c89dceeefee0d9c7d19ab381d89489f2e4a7a880070500020a93a4bbededa49abbf4d98aaca3ffd5beef87f4bea0ec800505000218ed8484b7c6b4b6dddea5939cd4dbc5f3adb0a08ba19c80070300024cfff4f18dadba9ff292a182a0a8dae7e598d68fb5cf9c80050300020da1b38ec7e1fa80d4d2d882cddbe08e92a8abcfd792e4801e08f89085d487faedf1a3d6a7d8a8eaf7b480000606050400080306030f04020202020312040002020603010c020102020203019cc0718771d101bcb32be3ba3eaaa123f6b60ffecf000385db9ec5d2fe8adea1afbcad86fdb1a09ab797ab99fb8023d60792b07bb902, 0x1aaca8eeca6c0000606050400080306030f04020202020310040b02030603060370d91fc832c801dff32ca1d440b9df2284bc0df797000ee698809fc5a389a59de7fde3c9eafa8aaad88004d305dab259e20296cd2bbb820fcce740c3fb24e0f2000799c890a0c1edffb7acbfcbc7a19892f5ecd4803ed4f00392df018ca2af4dfaa41b9dcf03f09245f8e429bca5000988d3d8999efaf2b0a7f4fe9da3babedef080141402022ba1bce2f49ed3c79788b69be4cee2ccf2eeabcba1a5a2fa121202023d96ba95bd85c6fcbe9ad1fe9bacd28593d69b94d7e2e8860e0e020203d4adb496d98aedb9c68d8fefd589edd6b4f5d2f3eed4c0090902020eed9efdaad380aeafaaa7cbd2d5c9beb3dbf5f1dcb8c5c0070702020bf1d5af82b1f5f6cec892ddb6f48ed0eb9bb1ab9d92e9c01205020205e3d2f2fcc3a58986bfcbf987a1a9aa8afbd9fa90e7c7f0050502022be7cac4b9bedcbd9ccbb3d0eddde1eadcedcace9fb3c4a01203020201a59094a4e2f09cd5e4efe4e8bdff809ad78ae9b8b4e9b8f0070302020d8bf2bbafe6b598cfd48fb3e5919e89c5ca91fda6c08cc00303020224c7e4faa7cdf1bb848aeecc9aa9e4a3b6c1e494f3d8f4a014140102088498acbf8fd19dcfa08ca6b996aceae2a8d1afaaac9e801010010228f4b2b586ab9fe08bb0a69e94d99ddccdd0b49188cbf4800909010218e2eeb5d2b08298b3, 0x10e020279a085a79aeeb080eaa1dcd3bbe7dfc6aceb9be1a9e4b810060202459e9cb89afbdef78ba0a0e8fafff59fd6d3a1f1a6f6900806020207b8fee0edb7beffe4a4cafcf08af2a1f3cccffad4b9a7b0070602020898a5b9cebdd9f380c0d0ab8a94a4a88896a1dde6f8aedc1202020202d09a98f5f1e0b8fea2a5f6caf2e3c8dfb1c8bd8eaaf8f0060002023f9aebd0baf186a0d88aff85ae97a28dcd8cafa9b1aef41313010201b1b6eeebe2c5f4d98e8edea3e1c68ddc88c7f38bc1a2aba8130f010202c5d6988dc5e6f8f3f3cbb0e7c199f6e4e3a8fc8782efb40f0e01020286dfd5caada0a686ab9091f1839b96a8eae0cef2e3e6e4130a01020590ade9c18e9888f2ce94c5ed94e89ac1a8beeeefacf6ec0e09010203fddeadfb94eff1d3c1f8a6cbd98df2e4de959989dfd0070601020b84a6d6ca86cda6d8c2e9e0f795bbbb81f5e2c4f7f6b2ea02020102059cb0fae98e97c2878ff5efc9f785d3bdfac2fef3ccf094060001024cdde4e582d9eee79aeafbbde4c697c0f686b4cd9e8cf6131300027df6adf6a6f5b7a38787d1ac848bd789e7bbb1abf5eb90e8110e000204b7ff8ab8fad0f1a999b1b6a4e681dcc1f2fbc5d3ebb9e01306000204d998d897f5b484e5fa8bd9c6add38b85f9bf97979f9d80060600020ad491e5fee6f98983dbe2bea9eaa7ece4c9fbd0cad9faa019018afee8db8ae4889582b99d, 0x11302010225f0bee2db828cefc9dce6bbf8d3aed08f820e0101021080c9ab9cc982f5f8f6fac3acafcbefb60101010204fdfbfdf8e9e9c1a2b9abd6f6a1ec82b7960600010223bfe0e98ddccac9e58185d08ba6d1e4c01313000201d680a18997df98d1db80dde5c3c3999e82c40e0e000250ba95ecb1b5c6c9f29dffb8988bbfbeac0604000220ddbbd5f8d7af80bcd7a0a6fdd2a7f485f80e02000201c79be883e598e5f3eee1e1d8b6bbb6c0e80602000204cdb387908beaa0daa1ec9bbdc4e6cbeb980e01000203ffa6d097a1e38dadddfffa9192b4eeb1a81953abed8dbcabf0a4aae5e4000602030200020302030f040202020203100201020202030c020202020204010102000402020401de9c58e9718f01c0ae2c80b940f3ca23bfe90eccda0001dabacde3b5cfa0e4e7ac82d0aeb2ab8ec9c7a002b082068a9346bd01e0d42dab931083b044a7be26ffd90062948683c8c69486c6dbe6a3b1bf98edb1988008e1ba17c1f50188c2ba78e5e906f78e14e0a651abab35d3f800559c9d8ebe95fa8ab0acd2ca97c3bd8a8db81313020201c9e5f880aedbec89e2f5b1f1a0ab96b8afc8aad4aca1e1c01312020217dfd1a3d881b5af87cbc99b87abd5b6efcfa5b680b99780101002026993ff95cdf7a4f4bccfaecadbd3d3b4f88cbbf9ea8c88130e020213ecba82928296ade1e7d882aca0eb8abdbe89a1e08eebf00e, 0x1dcdf979b9ac6d5a9e3f8f1d5cbb5aa949b8dccd4b2c1f8a4f195e602020002268beae0d8acbcb9aa888795a8e7a99cc7f9c9a499ca89b5f8cf9dcec086a899fabc01010002039af4edf0f8ff98dad4adb3fe89daf3e4e9f7ed80cdedb9ebe9c68fe5f3d6f983ce191ecec2c2cad7cfe8ffe7b8ab82dc87c5fe9cc3edd2dbf9d68d8adc000f040602010c000404060301011002000202020403db5fd801dfc20fbd27cbf53ed0962ab5fd13b1de00738f9ba5e7cbf5a5d4c8da8c8001f1be079bdd03cfae028acd2de79d188dfc3e96f028bdcd003a9bd8b6beb887e6dfb0898ffc1313020201b8dfefe0c4cfb6c7bad8ba8ca59e8cecfcf0131202020cacbda4fea7cac5f48aaf90d497d1cc8db4130702020496f3d59fb9d9d1a495ec87e287d3c5bbcc0707020210e4db93ff92d5ca9ab59bc9f0a683a3c00e04020206c2c3ff80ce9997faf6b6d892cea8dccfc40904020204e0f184f290aecfebd8bce0a3e68da2bb800604020238f69ffba5f8efb8fdbbe0e0b8eac8f290a41302020235e192fca396b09ecdf5ba8cbcc08bfebab00101020202dab5c789a3abbb95b98aa7c5f9838c80a01313010201bbb2edfb9abcb8d1eb92bb83a9a7e3efdad21312010208b9a3ba99baa8b2f0d0cfb4e9eca9c9c68009040102029281eab18abac697af9cb4dcfdd1e587c0060401023185cffe9a80d9ce87b1c4a48bafd398aca2, 0x1aae8a99fd1cae7a9f785840e02020203a09aa59c91f697f6d3c9fe86ecb28b9da1a2e2aaa598adefe3e297a3f198c5bec8020202020b97d9e1caf2bcb79888dca7e8acbcd9c5f088a299f4e5eba99c9fb4e5d7a8a1c9d0010102027f94f6d1b78198b8feede7c2bb98fbc9ace0d9d0cafd9bc0e696e2aac4c1cdc98a0200020205d9c3ccceeece90d7bcc3f3bdb3bfd7aac397dceba1a5d2b8a4ebc0d78cac8ccea8131301026d97e49c9b9ce6949ffcbcc787baef8bb9cca483f5ebaccbb79fb0ed8bfaae8ee7dc070401020297dfd3fec1a2b3c6c7a4efa9828dc2f9cfc6fdaeb5eaa3a1b0fe9781e7d89c87f60504010240a9c2f6d1e5d1a3f1a092d789abeddc8785a1e2fe99b5f79c9df4dfc0c7f3ebaa020201020984848fb1b2c5b18a81dcd8e1a7d7c789b8b88fa1b3bab08cac88b9a3a688d6eec00101010202e0e6c298afa6cc8383faf1b9b0a1f1828ed4b6a7f6f4a7c6babab3c783d2e2cba40200010203bab584ed8881e7b4ecccbbd792f4f8b5f7d1f687bfd6b7f18fa0cd82e585afc6f41313000235a391af86bae4afafedbdd0bfddd7a9bf9288ffb7a98d9eb8fbdcbbf3c4f8f2becc130e00024785bdf4c886ecce88b1ca9ad5fee7be92ccf8e5bde5f3a3d9aca0fac0a1a1eee80f0e000247d49ca0e8ad81df93c7e685ada2aec0fdffb289eaf7bbdbf8889e878e98d29c80040400024bf7a094e5dbf1, 0x101000202b79bdbf2def4f4a3d9e0b9ddb8f4d59cb5dbaaeda7e5c8da0e01000206b085d285e7ddfcd9afbda4ceb3bef0dec3d0b685e4a2d1840201000209de9d858db3a7b4b798b89092d5b7c2b4eadd96fe8df7f18a1905fccefbbec0b4d9af8886e9b69fd4c6d7b8001302010602020310a0c078f3c604b5b50184decf0105d0ad96fdc3f7c0cdddd7b1cfeabc90a997c2abbdbd9aa39fa0a1b2f002c78504fafd02c09806dcc020f1c94bafa020938b0aaac90030c6e3d4bfb3ee8a988adad8fbefb8f8b4f3bbc9e486f8cd9dffbf89c402abc20cf9a30398f403b3ca16c8f517b9ba42affa43a0bd0017f8ddb1a3d7eae49ff7ea97ceb1caa2dcdcc99f9494d9e586f19582981ae2ae3ed1ff0ad9f217f58245edd70cd1880b8c962e90ba000892d884cea0f7838b9fb3f6969af188b8fda7e5fb9becfbfff682baf819f2d812f2ee01a089bb7786fa05cdcf02e3fc5ed2ba5be8e50003b5dd93f5b1a5ed85f4adb2c698c6d796b2cdddf8b5b2dfead4998c13130202788e80d3eedbd2b880d9b58eb5f6cb8b88add8b2a48e9da6c1d7f4d7c0f0a4fae3fc070702020695a78efaf8b290f19be38fe38db3a4e6eac381a4e5bb9199c99fa0b1bde1a0da0704020203bcdde6c996a7ca82dbd18bf991d0adbdee94a781d6dba9c295c2e4f8daa2afedf4040402024bee92a28ed3bfd68d8ba9e1abe6e0d9bef29eaca197b3, 0x1c9d9a9b5d09683f5d7dc91bfc381b1f488c389a888bcca130202020f9dd0e8bde5c8a69be8f7dad3f6d3ba90d6c59af988a5d2b41202020202a7c1d0beb7e9bccedac8fdb3c9e889a0ce90cbfbadb3a08c0e01020205a4c9909a8891dce3ecb69d96d9fdab838187b19fb7bbeca20a01020230d1b1a5fda58da681c5e0c89e8bbef6f5eeb3cff581afee0201020208e9e5b98ea19699c996c3c3f9f4c9aba9edf4b2adad93b8f00400020211af99c0b2d1dcf3bc86a8a5c3c48fc8fadfa8a298dac0c8010002023bb3f1b2e5b9a2909cc2a3b8fdd8bbdaa4bed781aec9d9881313010207eb9da6e7c1d7a7c7f0cd9bcc99f9aeae94caa3a3a99dd6b0130201020d85e6f4a599d2eb99c0ebafafaca3dbe48ecae7e69081c6a8120201027ff1ee9bc3c6f0f9a8c3e1889bf1b59b86c7d9b9f6d8ce800f0101020195c4d7a7a2c5e8a0e98ef2f7ebabadf085d5c3f3e8c8d18c0e0101020589bda1d7cad3a2f3c88bb58fa9c4fce78de4cba191f0f4f80b01010247cef1afcb9bbe8ce49d999fba87f2ede18183e0f6cda5ac0201010209c4dee8f181bea980b7ff88a6ceb4d0b8ddc3b7d5dec49ac0131300020ae08ac1f0bdc8bacb9a8195939082b4aaeeaae3ddd2dd85f21302000208f3b1bfe5a39ac7c1a69795c5f0dae5ade4fcd5dbd193efe40202000203c5dea3b2d7c389fca5eda8cacc80f6cdcdb597fbd9cfb08213, 0x1fb83fedfe091bfb3c683dce786f99fde868c9aac9eafd490e1eee1f292e3ccc2a8010001020b8eeca18c84cd93acdac288d6889eb489a6a2d2fd8bcdd9c5d1bfc6b3bcf9a790c8c7d3d5a9b0c790fed6a6f9ab878aa8801313000201cda2e4b29a8f84d68da5c7a482a0d6b7b790f5a88ad6ebcbcf8cc1a5e3a7f3e4fedd8bc58caa9be3e580b7def5a7a0b7a0d080130e00021be29af6a798d8ae8883fcf19cedefd897d59faec5da87b8a2ccd2acdcffefc891bbbbfed1e2a1b5ed9adc94fad3f5c192c0800404000201928680abfcebc4abeff1fccad0abeac19f96decee889eeaea9abcbcbe3e7f3c3b780bae7f9dfa7a0d4a0a2d7f1b8b5c5d888800101000207f0adb291d8f198f9dadd8fbddbdfa58fcd82b69dfbd0f9e2a693c58ea48fd7ebb18eaf9c96a1bba188c0b0d2b18deacdf880194dead6f9f08fd1cd8cb3c992f38ae0faec80f689abe7a0dafba6c2accac0e3f585eff1fd9ae0b38abd8ab08000010171c2d024dbdd19e7ce66cebf0110b2f8c6e4e88a95dbe1edc190dbf3b1b78e907ce904e5f303fab403dcdc218eea25bb8336f69d3ba2b8000684c8fad3f3dc8cbef6809688dd9ae2dbddec8001fe8e07fdbf03fffa01f0ee41f7c012a4bd129a9441ed950002c7d1a6fcdeec9096e4f4eb88a59ea3b5afaae81414020206b4c7f1aba5c5b6d8b9fe94dcb4b7dad6e5c3c3b880d5b61313020205e2, 0x137aecdbeeb82bf95cb8ec4ecb3c8a6f4b29ba5d78ef2e7d7a2c6dc99c5eb81a592d19fc1e7c69ddfcae7ed97e7ecbfaa9ce080070702020d85bdaae0fdfcdbeee497f1b3dda4878ec0d6dfc1afa283bdbde3eedac8f999adf0ab90c0c396d1beae96f68896e299d080100202022ceedef4c4e4ebf5b2e0d5a2c4f281e99cbf9efd9e86c3b2c49ad597f096f5a6d1eba5b7d7cac5ee8c8e9fe8afeefe8ee0800101020202c8cbeeb8e4b6859fe68facdaccaed29c9592e5a1f28892e78bf6eb878ba09bd2d3f0e6e2d982d5f5df82939dd8e185a2f0801313010202a6d69c8c9cacdee3c7c0a8c6dbfaf4c8e5cdb2d38fa6ff87b2a88aacf3a5e3ffac9ed68fe9eac1b796fd9993869aecb199bdd6130f01026ac6b890c1a4b39d839ddadc9db6bcc58ba1ba9ee38ad8f8fb99a89c92d2fec2e5c1a4ebccec9990a7ec939efabbaac299d5b0130a0102049098e9f99f8bf0f38585ee88c395f8ad9ddfe6d7e8ede3f1c3dfd093d5a3c7d0f5afe5db95aa8096eff8a0e7b2aea9c1bc800404010253c4dcfd90da9bf1dfaee1c4b7dff9f4999cb5bbb7bfa7de85e3c785f99bbdf798e0839aff8fadc7c1b7ca87f7ce84f6bebf9c1002010201bd93aa9586ce8ad99484bcc089a5aaf0b29d91add8eca9faa98cf4e6c2ace8aff1a284f8db8dc4d8d8a2f2bedba3c5b988800101010205d8b5c1f0cf82b6fa9dc6b0bcb98bb9a1a9, 0x1bfd0df84d591d1a7e2d9c0d0feebbd8a89a0dfcaf0be99ddf9faf5e3bbf4d0ca9df5b5e2f7d08007fec802f08048850e9fcb0ea0fb14b3fe3ca19e42b49f003ddcbef787cf9f9995e3bcfef0f9b1d9a8d5dc9af18498bcec81ebd6b28d83a98c98e9c6edacd3fef183cdc2a0801f86dc6eacfd0eb8b23fc7ec3d8ce135e6e813fff40cd9f9001a8aa2cb86ea908aa9c8b6f9edcddcdbeab991d28de98ed0cecdf982edb48fb1aa89d0fe9af0a0fcdfb1b8cdb08048c19669e5bd03c1ee1e9cb20e95e03f95ba11e0993bcaff0001ecaeb1fddcaeae8fc7e580e280fdf899d2e5b9d8eea191f28be78ebb9f889aacad81aed497c1d18ea9bde9c080018cf88c34dafc23909d019d82b762a2832dcdf503aad0018cc5aa00069a9fe084e584ccf1f1c5f1b4d0c5bcbaa7dfb5cb9d8ac7d897ccb4abbe9fd8ada1b380c4b1c490a2cffbc7e08002d4b90fb6019bf4dd01a1f68e10d0ca1195945fe39a0181c8f70005a28bc0a8f385e8c1f2fee5ecc6c79890fac0e5aefad5cbc9f7d7dcb3a7e3a6ffb0f5b1d0b99d8df4bf828080131302020398dec8baf597f6c3b5d5d4d5d49883c78ce2dab78284ccb989b1f58ba2818daeb3a1d2e1aeed91f09dfbd3b1cec7ebbadee080131202020bc293cddab3e5f1f1cdd6dceb8f91c3beb7f2f7bee992b3bbc390d6b1e6fef8d5ae82d3b9b2eefdeef28cf0a9b7ba8cc8c080130e0202, 0x1800f0101020c9699d7eae0fdb3c187dcc186aebeb3e3c09cb2adcab3ae0e01010207c9b0cd8d85f4cf978abd8aa488b99de085da9e8fd4d7fa090101021df2ded4d4fe99dcd3b2c3c4e6bab2abcecca0dee580800601010205ccd3e8ba97cdc690d598a8f1e596d3eb9fae8e989cfecc131300024d8ed6d2d099abcfb0f8cf9efed7f68092dbe094ec8f9680130e000207ac90858b85eb86a8b6959bdbfecce4aab9ebb7f6fbf28013060002058eb6d1c3eceaaf99a2f2f6ebd0aeaa97fee9eaaeab9e800404000206d2eeb1e3e7b1cdc4e7ed95b786c1e6a1b5bacb8ad6ca800e0100020cafcddae5d085baa79999b5b280edd9ec83db9996cc82800601000205b58fecc694f0bd9b8e9b93958ba7d7f3f8b6958dd1c6801908d7e796b1e0eccd95ebd89ac7acd9f880000114141212130a0f0a14010d0109000800030000000a14141212130a0f0a14010d0109000800030000000a14141212130a0f0a14010d0109000800030000000a0601dbad3c85a50aeae832f5ec014ce5baacf1d0b7db93c880dfb3cfa28edfe1dec7dcf3cacbc2958dc7ae86dee0de83d9d19bf4a7ecc9a8bbaad8ec78a9c206f6ff13afaf5e83910107a693c8c4d990c2afc481e1c7f5c3a0baa1da8dc2d0c58dabe1f1b2a6eed2bdd4d7d9c68781f9a9beb698d6f3c869d26df40199be0189f31ceaa948a4b22583a106b6e500799692ddeaa9ab, 0x112130a0e080e030e010e000d00090000000a1414131212120e050e030e010e000d00090000000a1414131212120e080e030e010e000d00090000000a063ad9c93be4c358e3ab01cfa1ba0113e2f6cfd3d6f69db4b8f5f2cd94e1f6b4a80298b164f002e5e20299be04d4a50b95d24882fd41c1d2000899fcd7a0c2be82c3a1b19f97c8e484e5808040af8c38d9aa6b84bc01e68be938a7b539c7b14ba0e501bd8fce00059a91c1bc8cd0e181daa4ef85bcbee0e0801313020245deafb8c0abd6f081d983fbebb8efac91b0b689f59bf880130e02020de6b9abeea1b1b38386fbf7eefbfddaa7af8384c8a4d080130a020261edc3b7a1d5a8aba4eef8a9d3fda2aaa2a7a485f5c0800604020203d4c6fe9de9abeffbdcafe589fd8d908eafa88bafc1dc800f0102020aaedad5dbb382ce8ae09aeacf99d8eea5c1ccb5b087e4800e01020207e98ffe85ac81d5faa6a0ca9d8eb596bbd6e588b880fc800901020250bd89b7facbc8de9a9ea7f0e1cd8c89bedab1f6eac0800601020203b08ea3d4a5e8b99bd3afeabda9c1c9b4d0baf9dd9df4800000020204d9d2f48ad2af8dc9c99b97c2d3bcf9a1aaa4bc8ce0801313010227f9abdafdc3929affb4e0e7e0ede18cceea86fefafca38c130f01022bdb8ba19390eac2b3e4c3cdf5acf7d1bbcab7f58bbe8180130a010233e09cb7a7b4de9080e38eacfcc1e0b99ad1a3958780, 0x11414120e0f0a0e0a1007100112000800050000000a1414120e0f0a0e0a0a0a100710011200050000000a1414120e0f0a0e0a0b0a100710011200050000000a061410130a130812071007080708041001010000000a1410130a130812071007080708041001010000000a14141410130a12071007080708041001010000000a0601130405020202031410130a130812071007080708041001010000000a1410130a130812071007080708041001010000000a14141410130a12071007080708041001010000000a0614040f04010c000204060313040502020203010c04030201020304041414130a120710070807080609051001070001000a1414130a120710070807080609051001070001000a1414130a120710070807080609051001070001000a06140403020202030c020b020502020a040803100201020202030c0403020102030404010d060a0200020302040c0609020002030204141413] private def node935:Certificate:=PackedParametricCertificateData.decode 10 data935 private def node936:Certificate:=.split node877 node935 private def node937:Certificate:=.positive 1 [(1,1),(1,7)] node936 private def node938:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node937 private def node939:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node938 private def node940:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node939 private def node941:Certificate:=.positive 1 [(1,0),(2,2)] node940 private def node942:Certificate:=.positive 1 [(1,1),(1,3)] node941 private def node943:Certificate:=.split node858 node942 private def data1007:List Nat:=[ 0x1e9bec9dcb6bec08b8fef8ee41401000201c5c1cb90c4e6e1a0cb88c1d1fca21100000205e6fdd5a0e4cbbdecb7a49e9488f01e09848bf599b6bbe400060605040008030603011204000202060301010b060302020204010d100a06091e08020410030906080607020008040804141412120d0d09090907070712030a03080309000a141412120d0d09090907070712030a03080309000a141412120d0d09090907070712030803050309000a0608040616001c03120312020c0607020204040603120400020206030f040a0205020302030902080204020106040803141412120d0d090909070707140512030a0309000a141412120d0d090909070707140512030a0309000a141412120d0d090909070707140512030a0309000a060608040200080306030b06090203080004040c03120400020206030f06010202020310040002020603010e0402020206030d080a120806010a0412030e0e1209120810080a081203120011001000090e0e1209120810080a081203120011001000090e0e1209120810080a08120312001100100009060608040200080306030b06090203080004040c03120400020206030f1c0a020606040c040c03100400020206030f08080607060212041a030e0402020206030d080a120806010a041203010107020102020203060202020002030403050201020004030603060604020008030803, 0x1aba90001b9888dbba2ecf4a3801414020204ec9784febc9b998ba0a6b7ee8ee40909020204c0cbfb9eb28ea29485eec3e9b3c41107020219aff495909ffda59a96bfe98c83c8070702021ef7a6cecbaa9aa498cecd8ad98805050202058ee5c1f1d78ff996ade1ffbaa1a8120302020d8fa4f4feffb5e8e8acd0c5c5dbf00703020202dfb6c8b0a7c8cd93a7a0aeeac78411000202068894e4b3c794bb92a4919a9cc6981000020201c6dcacfdd6d2a6b584edfce0a3dc0600020203ddd6c8ddcea2a4d0c6a78fccfcc41414010208e7ded5eabc90b0a6e1eafbe2e8b40909010204a69aa1beb2b3eeced9e69a83ecf41107010218f4fecccda39ef1b2f6cb8496ccb806060102049da4a9efb1aa84a1cea3aaf683d00505010204f8da8ac2b1cbc186f4faadfae3c0080301020597d5e69683d8e2ac82f2f8bfd6f007030102089bbaec8284dfd2aaf493cfd79fb411000102069ed8e9c7989084f39fb1b49295c8100001024c87b2ab9eb7d99aa1818de085ac0600010202beb7c8f18feaa3c3ecea9ddbbe941414000208c9b0b097e6bcb6eff0ac83f5b5b40909000203dfffabeb9ae39de48fbfb5f1ecfe1107000216df9ce2958dd297d4a6ee99c0b28c060600020de8a787d4ebad8c89e9e3c097be8e0505000204fc8e87c99cec98efbaceccf69dd608030002059eb7ed948a82f9e385b9b69cc4820703000206e99f, 0x1899ca3f49be8e01302020202fbd9f0aaafc6d2f1fec3a0bcd6ffefa8880202020256d196cdb8bbe387f8cde2c6b3a4f390d99c03010202279cb6c586a7e1f79ebd9cd3afe7d9a9d5c011000202698bd4a8e9f9cadcbd9eca9da6a5afd4dec01313010205d3f0d2f4dd8af2c2a1dde69b8ab8d5dfe6c40e0e010249ddad8fa8a1f1b5b0cd9e93948c98e0d9d01107010240d0e5b8e0d2899dbb8981b9e5e0f0d8b1880606010201a9d9bfdbcd8f8798ab88afc78da6c8b1d7e40e0301020a82eaa185bee3f9ac9496bf879589bdb6e01102010202f7d8c2a5da8580e1bbb2f8b3a19db49089b80301010211bdd8abaf84c9a1c18ec78fc2e6edcebce0110001021bbbb0ee80f2d7facaaebec0f5a3b2b384f81313000205c5a6e4e3e2abb8e5bfadf9bbfbfbde88b2d20e0e000247938aeec8849f918ca6b1aae89eeccdc2f20606000201e29db2f2d5c3e4e9b9d69c83e894bdd3d69a1102000204e2d3f7a8f2e3aebde3eaeaca8af6c5daade40101000217e6e08886e5b5f9c990dbc4b8cecce284da195ce5bdc9bfcb8998b5f3f4000606050400080306030110040b0203060306031410090912030a030e010a0110000700060001000a1410090912030a030e010a0110000700060001000a1410090912030a030e010a0110000700060001000a061404030202020303e6da04cdb301dba301a1983cbac736d3ba1bbe9218, 0x1aa89ada01302000213af8bb6dddfa8ce94a69ccfac908dc39b8fb2a79cb7cdd01301000204c2aab6b19dadfefcd5f9e995babdd8d7fec0f0ad89980201000208d1b8c6c4c58fdcd2f2c48c94c5ddc4b5b7baf8d7a2c6880101000201ccabe6fed2fcbbbe94bd98b8b7cffbb9dbb4a7949ebcf01903eeaaf3e591da9ff4a6d8f9fdb593aea800130201060202030f04020202020401100200020202040c0201020202040b060202000203040414141313130f06060e050e04090402020e0106000a1313130f06060e050e04090402020e010600091313130f0606040402020e010606140c0d020c02050c0408030f04020202020410040b02030603060310020002020204141413130e0e0e09070602020e010201060001000a13130e0e0e09070602020e010201060001000913130e0e060602020e0102010606140403020202035aa6923da9c036d3b001cea3810102b2e8868b84848088a4e183a001a6940ac7bd1081a006e08138fc9e3896f9158595149ff20012d4f3aaf5c4f8fffb9af89ae01313020205c8b3f991b9a6db8c999e9581b0d3ded1e3b40e0e02023cf591c3d7b4bbb1e39ec286d893b4bc938c110702026c8aa5e7c1d5d8bebdfa87bbe696db9b86800606020201c9e3f1819ca1b5e1f797d0dbd2d5e5b787980e0302021a9d90d183f4b99ed88d9b8dbcbfeda2e5800303020278fcfa91ecf8f9f1fdc8, 0x1b0ded1cbf2bfc1908ab8d4b2ed868ad01414020204efdbd8c1aacbe0dacbc1bce3cee8e491b6ecc0fdf6841311020206b6919dc4c9ad97d9ee8199f0e6dfa1f980e4ced98c8fda110e020209bb89d9f3d2d5ae93f9b595bfbc8bb1e3e8fbd7d287d3be100e020212cce0b889f49b939e8381d4b0e1fca6e89ecdb1f281e8110b020202adaae0cfcbf6ef9ea19bb9c780f6c4db8d8797fb8a81f01302020213a2b6f3fcd6ac82cc8cd796e2d6a1ccf781a8c9c7f1a0e0070202020194a8a491f8c8b6f79ea4cf9ae8aebf96f898a396e9b6c00202020201c88093bfb698e48d9ccabde0c8bbe2fad4a6f198cf8194130102020182e8a2cfc283d0c68ce1daccb880a2f0cbfeb8fbae8eac0201020204e287abafc1a7e5cd89ffbd87e38efdf085cddb8efa82ac1311010203b5cae5dfd0ffb3c6b0bff0c2de908be8bdeb9eeec484e6110e01020cc7acd3d881f0a4bcedf2a2e6e5a2b7f793e8bad380b796110a01023ba99ea0daea82e4d18aee83b4c1acb4d0d3d19af1a0801302010211dbd8b281c3fcaac4d0e3c099fba7e6e0e9c5c787efa6881202010242d4d9a3e983e5bd9f8fc89ccae888b9b2f3b69eaf85a00201010207b0abf4c9d3f0d7b7a8f5edaff7e29fd595b8ec8ea2adf00101010201908999a79edb988d8499f7d492b582b89da894d6f7cfb2110e00020d93c1a090ffa194aaaea1badabcff859fe3c0f6, 0x102022899e8efd89888fed2928cb1ced6a8e5a0d8110002020f95e1bc95c09ae0dfd09f82cbe1c4f98eea90070002020fabfb90b7deb3ccb6baca88b7ece78195c20100020202fec4aeacb9a7ffb6bfe093b79adfc9cad013130102019987a3fcbfda82dce5bbd3a5b8f8b8cec3d9d0130f010216f7d0bfb6cdbbeea7f98acbf3b1f8ffda9aba120f01020287c3f1a2ead5949ecbf7e8c2f7c9e9e68fbe0e0501020bf3d4ecaaefcff5cd99aa95fec8efe2b5da0e04010204c2edd2f8d3b380f1bcfbb88fb087d6b8e48a020201020bd8cee6e6c3b7a5d3cafd9bbcf5a0f39e89e00e0101021895a9b1d1a8dba8fdc2e48bfe9ad1aaeecfec1100010204c49ef698bc8feedfabd698c4f6f693c3ef881313000201abc5ada3dcf0efbe9396caccc5f3a09bf9fcd8130e000209d6b998f5e69eac9f8880ce87c7ca9687f3d00606000201ceaa91b1bcf29bbbeafca49fa7d0c4b598c0020200020889a0b2a5d58de7f49cf2ecdbf2d5de87a7c00e0100021ad4ae91acc9f59cfe87c9b3c483e3c6f3c6c01913afd1e58ca0dbb9cdbdfbc800010f04020202020471d7b41fb3971fbea671e2c10112fffbac879ef191b9cfa7a8efa7c9d2ccec0281b003fcf602a7a502f6871dddec20e49b3c82cb3f88fc0004c2a9a29591ecaff1f3c8f5c5a2d4bcb4eeaa06aed502e9eb018b8808959c48a8de17a1ad11d9fa42e1a9000180a3, 0x114141312130a0e080e030e010e000d00090000000a1414131212120e050e030e010e000d00090000000a1414131212120e080e030e010e000d00090000000a065eb7029cc1068cfa039e018ebe05a79d46e2f54afbd6000fe7dfa0b2f185e4a38fdae3a9f049dfe84cf9fa529e9201ead2e541878f45cd813bdef901c2b38c0005ebf9e6feee8dfacb8585dd881313020201adab85edfc9cb1d9e6c6c7e5fddcdaa286acfe130e020204e79fd7a8f8fec9f8d196928ab0cca6dd86be120e020203ae95ac9684d6a9d8b582b7c895c8abacf0fc130a020229e1d896c0a5aca0f3f590d291e68ddc85fe0202020207eecea1d9fc9a93d7b9aaabdb80b3f99ddbb20e01020216a5e2b3d29d919aa1cc82e8d6f0dad0b3a08c1300] private def node1007:Certificate:=PackedParametricCertificateData.decode 15 data1007 private def data1071:List Nat:=[ 0x11412120d0d09090e07070712030a03080301010a06060605040008030603011204000202060301010d0208020302030204010d0c0b020a060608040c030912070405060016041604141410100a0a09090907070712030a030e0001000a141410100a0a0e090909090707070a030e0001000a141410100a0a0e090909090707070a030e0001000a0614040302020203141412120e0e0d0d0909090707070a03080309000a141412120e0e0d0d0909090707070a03080309000a141412120e0e0d0d0909090707070a03080309000a0608040616001c03120301120400020206030b060502020203080206020404030403141412120e0e0d0d09090907070714050a0309000a141412120e0e0d0d09090907070714050a0309000a141412120e0e0d0d09090907070714050a0309000a060608040200080306030b06090203080004040c03120400020206030f06010202020310040002020603010e0402020206030d1c0a1206120102041e0314140d0d0e090a080e0712030a03120010000914140d0d0e090a080e0712030a03120010000914140d0d0e090a080e0712030a031200100009060608040200080306030b06090203080004040c03120400020206030f0e070206020406040603100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e03010107020102020203060203060006030803, 0x1ffe0b8f3eeb382dba1b1cd99800101000201abe0defdd3afe492e7a0fffc93efcfb5f2dee3e7aa8c9fea94be9cc0190ec981e8fadfcbafc9a092b9afe5a4b0b1e2a1ccfcd0000111040c04020603060414141313130f100e0e0e0f0a0906060607020e000a13130f0f0e0e0b0606061202050202010e00091313130f0e0e0f060606020106061302010602020311040c04020603060401100200020202040e02090201060306040c0608060204000a040e0414141313130f0e0e0f0a0e0606060904020206000a13130f0f0e0e0f0a0e060606090402020600091313130f0e0e0e0606060101060614040c020506010204040311040c0402060306040c020302020203100200020202041414130f0f0f0e0e0f0a0e061004070413020e000a13130e0e0f0a0e060e040704050413020e0009130f0f0f0e0e0e0613020202060614040302020203131313120e0e0e070e0603030202030101010e000a131313120e0e0e060e020202030101010e000913130e0e0e060e02020201010606060605040008030603011002010202020310100e0e0909070712030a0303030e00070001000a10100e0e0909070712030a0303030e00070001000a10100e0e0909070712030a0303030e00070001000a0614040302020203141412120e0e09090e07070712030a03030301010a141412120e0e0d0d09090e07070712030a0301010a14, 0x1f00f0b020206cdf7dbddcdb5c48ec1bcfff2abd982a38381b5c8daf0e7c5c2cbb3c0060602020492c5bec4b8ef8880dab8e79aa6adb6e592defbfda4c2acdbbedfe4a0030202021e9598d08bbceed7b7f9faf8f78aa9a0c98b8982d1cea484c7d7c5800e00020233caedf4d19da688c7fbe7c7bdb4cb9befe2d5cc8daea1e0b2abfec0000002020bbe8ba4c59cb0ddcfd1b8bee997e6bed2cecbc78be88c87c8b4b3c0131301024a98fbf5cba7ddebbb9487eab9f2ecddfdbe95afd6adc5b0aed1ecaea0130f010236f2e2d3d0e8f7caffc7f0c0c3e8b2f5ceb68ba8a78cfeb9b2e2e7f7b0120f010203ad8cc8ee92e2d8c3e298d1a7bffacce4ce9c98cb96cadcfff3f7d5c0100e010201b2b68afd85bd99b58d9cf4e79ecee0c5d9f29df4eae5bac9fcb8c5c00e0e01020e9ae8fae0959196f9dda59f99cca081b2b98dbed481c696cad1bfc9920202010204a388a9e4afc6b58f88888895c797aa8dfdd8fccccad0dee9b6a4a1e0131300025ab1bbfeedf6e880ccfd9ccfb883c4929bdeb9c3d7d39a86f389f6f5e00f0f0002288493f7d4ceadccc3bbedf4d995f5889ad4b7e5f7fcd8cdadf788e6800e0e000207ef8db0c4a3e3e390d483bda0d09ac093c38ed2eaf589d4f691b9a8b0060600021bd0feecc184c0a0d1eef5bf8989e0c5b88e82e7faf0d6d5e190a580020200020a8e8ad587c59ffdc0e380e6d8bbdcb6, 0x1141413130e0e0d0d0f0a0f080f000d000b0000000a141413130e0e0d0d0f0a0f080f000d000b0000000a1414131313120e0e0d0d0f0a0f080d000c0000000a0644c38149c6cb45a0a101d3a9f0010da7f8a0f59bf7a2e5a68a90e2f1d4cdc488cb9bbdec9c07e2e303a8bc05bdea01a9ae0e88fa09bcc84df2af36acee0013b2f780f598ddc09c878588d9ec8189eddee69985b1e6e009fa8009ecd60bccdb078fe94ecb8f2384e40aedb820d8f4000284e6f686a2c2a2aa8296fcb28ebedda3dec8f4e7c9f9c001b0ad0792ff0e9bc602d39d15b7c53cbba907a48a4acee60001939dd2eb94dacdad90cb95a28b9fab8ca5a1e2a6dcaa80131302024df0b4a6c1debee7a7868ba6d3d1bcd9e985c4f198d68be9f0bda397a0130f020236a4d9c3b8ac87ecc6f4ac8f8882e298ddbcddd3c093c9a2a094f0c7c0100e020202d0eda8afa0b587c0a9c1aff5e18bddd9a6c6e6c6f484f79cc79eb2800e0e02020cdb9df2ffafb4cefd99aceb8f8adfdd84e6e0b9dec9d7e39bddfb87] private def node1071:Certificate:=PackedParametricCertificateData.decode 13 data1071 private def node1072:Certificate:=.positive 5 [(4,0),(3,2),(1,5)] node1071 private def data1133:List Nat:=[ 0x10e000d00070001000a061404030202020312060b12070a0302040c041204000202060301010806070603080206040e04010d240a140616050204240309120704050600160416041010140e0d0c0a0a0a030c010e000d00070001000a140e140d0d0c0a0a0a030c010e000d00070001000a140e140d0d0c0a0a0a030c010e000d00070001000a06140403020202031010100e0d0a10090e07070708050a030d0009000a1010100e0d0a10090e07070708050a030d0009000a1010100e0d0a10090e07070708050a030d0009000a0608040616001c03120301120400020206030b060502020203070204020202031010100e0d0a100912080e0707070a030d0009000a1010100e0d0a100912080e0707070a030d0009000a1010100e0d0a100912080e0707070a030d0009000a0606080402000803060313040a0c030e031203120400020206030f06010202020310040002020603010e0402020206030d1c0a1206120102041e03100e0e0e10090a080e070a03120010000e0009100e0e0e10090a080e070a03120010000e0009100e0e0e10090a080e070a03120010000e00090606080402000803060313040a0c030e031203120400020206030f0e070206020406040603100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e0301010702010202020306020306000603080307020206020203, 0x1140e0d0c120b0f0a0d0a0f08150707070c0000000a140e0d0c120b0f0a0d0a0f08150707070c0000000a140e0d0c120b120a0f0a0d0a0f0807070c0000000a06140e100e140d0f0a0d0a090808060e000d0000000a140e100e140d0f0a0d0a090808060e000d0000000a140e100e140d0f0a0d0a090808060e000d0000000a06010c020b0a030a0008041204140e100e140d0f0a0d0a090808060e000d0000000a140e100e140d0f0a0d0a090808060e000d0000000a140e100e140d0f0a0d0a090808060e000d0000000a06130201060202030c020b0203020204040604011002000202020409020802010c0002040e0408060706020e0008041604140e140d0f0a0d0a09090f080a040e000d0000000a140e140d0f0a0d0a09090f080e000d00060000000a140e140d0f0a0d0a09090f080e000d00060000000a06130201060202030c020b02030202040406040c02030202020310020002020204140e140d0d0c0f0a0d0a080407040a020e000d000a140e140d0d0c0f0a0d0a080407040a020e000d000a140e140d0d0c0f0a0d0a080407040a020e000d000a06140403020202030b060702030201020406040a02080201040304031010140e0d0c0a0a0a030c010e000d00070001000a140e140d0d0c0a0a0a030c010e000d00070001000a140e140d0d0c0a0a0a030c01] private def node1133:Certificate:=PackedParametricCertificateData.decode 14 data1133 private def node1134:Certificate:=.split node1072 node1133 private def node1135:Certificate:=.split node1007 node1134 private def data1199:List Nat:=[ 0x1141212140d0d0d12070e07090714030d0101010a14141212140d0d0d12070e07090714030d0101010a14141212140d0d0d0e070907070714010d0101010a0608040616001c031203010802060202020314140d0d090909070707120307030e00070001000a14140d0d090909070707120307030e00070001000a14140d0d090909070707120307030e00070001000a061404030202020312120d0d0e0709070707120307030303010109000a12120d0d0e0709070707120307030d01010109000a12120d0d0e0709070707120307030d01010109000a0608040616001c03120301120400020206030108020602040403040312120d0d0e0709070707120307030303010109000a12120d0d0e0709070707140512030703010109000a12120d0d0e0709070707140512030703010109000a060608040200080306030b06090203080004040c03120400020206030f06010202020310040002020603010e0402020206030d1c0a1206120102041e030d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e0314011200100009060608040200080306030b06090203080004040c03120400020206030f0e070206020406040603100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e0301010702010202020307020002020203, 0x18de9eafb82e0909b85a7dbe6b3c4eab2ccefa5a6cda6a00101000201e8eaf5dfff80e982cab1d3d19efb8db6cbf4e3e98eb5a8190bf6bfa7d6e2aafcc9d7a984e3bfedb0e6000111040c0402060306040c020302020204100200020202040e02090201060306040c0608060204000a040e0413120d0d13070e0606060d0202021301010106000a131213070e0606060d0202021301010106000913130e06060602021301010106060c020a02050c03040311040c0402060306040d0d0e06060608040e02070202021301010106000a140f0e06060609040e0207020202130101010913130e060606020213010101060614040c020506010204040311040c04020603060401100200020202040e0e0e06070603030e02070202020601020101000a0e0e0e0607060e0207020202060102010100090e0e0e060e02020206010201060614040302020203140f0e0e13070e070f0303030e020202030101010a1313140f0e0e130713020e020202030101010913130e0e13020e0202020101060606060504000803060301100201020202030b060502020204010d0208020302030204010d0c0b020a060608040c030912070405060016041604141412120a0a09070d03080207020e00070001000a141412120a0a09070d03080207020e00070001000a141412120b0a0a0a09070d03080207020e0001000a061404030202020314, 0x1e2fae1d298f8b8e1c0140f020223d78ae2d0d2f3e8e8feaef4ed9affb7f686a1bc9fe5c406060202019cc0d98183c9cb96ade0b1e4d3b285bccba7bc96c7bdfe060502020ef7d48d8abfa481a2d7caa8eca0b1d6848dee8fd58a800404020201c3a3b68eb195acc4acb0b2ef8489e5ce8e85c0b69a90f2130102020ead82bfe1f2be8e81b9c59cc4ee96cfb2a3ccfaccd5c7a40101020202d1d4a0d4ea9d95aea294e7bf978585b4efbd94a1aaa6dc0f00020201cde1e6dbb8a58bc69ce1a7f288fadcdfdfdeab959e87fc0000020209c1abb5d6ba9f81fce9f8f0b080c885fd8a878cbfa5e0131301020cafc69cbcfa9ac8c3e2e5c4e1b6d28df29089acd0f8bec81312010201fec1b28df4da9aebb8c2b1ed86b4eaf3d0b4b6febd8fb0140f010265f695c9eff3ea8db99ef597d4bf8bcac9bffae7a480900e0e01027bbc9888addfe1a7dbc4e9c4fab3e0dbf4f5d7f7d6a396130101021582c996bdb9c4eebdab8185dba8b391e1ecb3bfc2cdbfd80101010201aad98482ff90eaf4b2aca0fec783dde18de887bdd9d08c1313000211a89796b19bb9f5efcdb4f1c3e49fa697a9c9f5aff6b6fc0e0e00025ba88e9d8faceec9b4fefdc59cf0c4a1c2acc996bba9f60606000202ffb7d186a88eb888e1c5bdb6f79497cffab0e0dcdadae0020200020380a0e5f5bfcd96e3858982c8f9dee0bceb91edcce7a6e41301000216, 0x10c9bd1fa9cffa1dc8fbc9af3add00d0d01022089f2bbc7d89feb9edbb0f68ae00b0b0102098cf3b3cd85cfa7c7cafc9a9aa81308010201e3adc1dcce9090bcc3d5958ef8070701020290f9b8b1a98b96a49f849c91de0d00010204f3f397d1d7fa8eae96a186edc00b00010247bccda1d4d5a78b999ef9b7b7f80900010209daafb88eefffc19092fad7d9b0000001023ad4c59fc2e5b5f0c4e1f0f188c2141400020ceea7bc82dafee4edec9787a01312000272b28c9ffc83a7c3d19bfbe29a800e0e000209dfd588f3a5f785a2819ff7e5900d0d00021fa9e0939ee0bfd7a1b2acd9f1f00b0b00020c94c6e2c9befefcb3ec92b8ffb0070700020393f3b2c1dfcceb86c08ea6a8b00b00000245d7e1d2d9c8fca591e5cdd584c00a0000020393c5a3ba80c0ec8be7e6c5b980090000020dc1c0e4df89a7aafda095daa7c0000000023ac2faa9c7fdc3d2d297e3f1a2d01e45e9b5e2deecd0004ad48d4e9bfb38d3a901d1c3b40111c5a0b592bec7a9c4e487fad9b2b0ebbeb001fc8105f1b60194f31d9104cb9d10aff447ecdd3c8888000eff96a8b7ebfefda1d7f8939fbdb5f3e38d800a8ca30cdcd606939102f09835b3af35f0b211d6ea1293eb000298a1c1a3d3b5bb97f89fc598b2a4d890b1c8131302020aa4bb9de5a7bffdba8082dbdcaebed5908abfe8aca3f9ea13120202049bfccef0a5fca6aa83fbd7b1e1d5, 0x14de501dbb712865cff0fbdd82196a33fc7c22cbfcd003f9ea1efc5aacae1a01312020274f485f781a794a3f4de8aecd9a0150e020209cce4f6828f85cef3a794dd8c800e0e02020efae6ebadadc1998a92c6b4cf900d0d020220d9a2ac9caec894cbea8197cfd00b0b0202069fb194eac5e3c79ac49ebdb4b0130802020695f482cfce919bb7a6c1cfd6a00c000202189ad48efda2db8582c69496cae00b0002023af3a39fb49cf6f9dcaad0d7cba0000002023cd085f8e7aed3b8b8caf4b3d6c01312010274a692b4e4a4b8c6d28cb4efc3f80e0e0102] private def node1199:Certificate:=PackedParametricCertificateData.decode 13 data1199 private def node1200:Certificate:=.positive 1 [(1,0),(1,6)] node1199 private def data1262:List Nat:=[ 0x10202031212100e100d10090d080d0707070d00090000000a1212100e100d10090d080d0707070d00090000000a1212100e100d100912080d08070708050d0009000a0608040616001c031203010a0208020104030403140d0d0c120a0a0a0a0308030e000d00070001000a140d0d0c0a0a0a0308030c010e000d00070001000a140d0d0c0a0a0a0308030c010e000d00070001000a0614040302020203100e100d140910090d08070708050a030d0009000a100e100d140910090d08070708050a030d0009000a100e100d140910090d08070708050a030d0009000a0608040616001c03120301120400020206030107020402020203100e100d1409100912080d0807070a030d0009000a100e100d1409100912080d0807070a030d0009000a100e100d1409100912080d0807070a030d0009000a0606080402000803060313040a0c030e031203120400020206030f06010202020310040002020603010e0402020206030d1c0a1206120102041e030a0914080a080e07140310030a0312000e00090a0914080a080e0714030a03120010000e00090a0914080a080e0714030a03120010000e00090606080402000803060313040a0c030e031203120400020206030f0e070206020406040603100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e0301010702010202020307020002020203, 0x10b0000000a140e140d0d0c130a0d0a150707070c000b0000000a06140e140d0d0c130a0d0a0b0808060e000d0000000a140e140d0d0c130a0d0a0b0808060e000d0000000a140e140d0d0c130a0d0a0b0808060e000d0000000a06010c020b0a030a00080412040c0203020202041002000202020409020802010c0002040e0408060706020e0008041604140e140d0d0c130a0d0a09090a040e000d0000000a140e140d0d0c0b0b130a0d0a09090e000d0000000a140e140d0d0c0b0b0d0a09090e000d00060000000a060b0205060202030c020b0a030a0008041204140e140d0d0c130a0d0a09090a040e000d0000000a140e140d0d0c0b0b130a0d0a09090e000d0000000a140e140d0d0c0b0b0d0a09090e000d00060000000a06130201060202030c020b02030202040406040110020002020204140d0d0c0d0a080407040a0208020e000d0007000a140e140d0d0c0d0a100407040a0208020e000d000a140e140d0d0c0b0b100407040a0208020e000d000a06140403020202030b060702030201020406040a02080201040304030b060502020204010806070603080206040e04010d240a140616050204240309120704050600160416040d0c0d0b14091009070408020e000d00070001000a0d0c0d0b14091009070408020e000d00070001000a0d0c0d0b1409070408020c010e000d00070001000a0614040302, 0x1140e140d0d0c130a0d0a150707070c000b0000000a140e140d0d0c130a0d0a150707070c00] private def node1262:Certificate:=PackedParametricCertificateData.decode 13 data1262 private def data1323:List Nat:=[ 0x10614040302020203140c100c0d0a140912080d0807070d000c0009000a100c0d0a140912080d08070708050d000c0009000a100c0d0a1409100912080d0807070d000c0009000a0608040616001c031203010a0208020104030403140e140d0d0b07040a030b010e000d00070001000a140e140d0d0b07040a030b010e000d00070001000a140e140d0d0b07040a030b010e000d00070001000a0614040302020203100c0d0a12080d08070708050a030d000c0009000a100c0d0a140912080d08070708050d000c0009000a100c0d0a1409100912080d0807070d000c0009000a0608040616001c03120301120400020206030101100c0d0a1409100912080d0807070a030d0009000a100c0d0a1409100912080d0807070d000c0009000a100c0d0a1409100912080d0807070d000c0009000a060608040200080306031304120c09240332043603120400020206030f06010202020310040002020603010e0402020206030d1c0a1206120102041e030a0914080a080e07140310030a0312000e00090a0914080a080e0714030a03120010000e00090a0914080a080e0714030a03120010000e0009060608040200080306031304120c09240332043603120400020206030f0e070206020406040603100400020206030f040e0c05240236043a030e0402020206030d1c0a1206120102041e030101090207060008030803, 0x1000900060000000a150d140d140c0d0a0b0815070b010b00090000000a060b0205060202040c020b0a030a00080412041102090203060306041002000202020407020106000203080408060706020e0008041604140d140c120b0d0b0d0a150707060b01090000000a140d140c120b0d0b0d0a150707060b01090000000a140d140c120b0d0b0d0a150707060b01090000000a06140d140c120a0d0a0b010a010d000c00070000000a140d140c120a0d0a0b010a010e000d000c0000000a140d140c120a0d0a0b010a010e000d000c0000000a06010c020b0a030a0008041204140d140c120a0d0a0b010a010d000c00070000000a140d140c120a0d0a0b010a010e000d000c0000000a140d140c120a0d0a0b010a010e000d000c0000000a06130201060202030c020b0203020204040604011002000202020407020402020204060603020206030804010d240a14061605020424030912070405060016041604140d140c0d0b120a0d0a14090d000900070000000a140d140c0d0b120a0d0a14090d000900070000000a140d140c0d0b120a0d0a14090d000900070000000a06130201060202030c020b02030202040406040802060202020310020002020204140d0d0b14090b07070408020b010d00070001000a140d0d0b14090704100208020b010d00070001000a140d140c0d0b140907040b010e000d00070001000a, 0x1150d140d140c0d0a15070b010b000900060000000a150d140d140c0d0a15070b010b] private def node1323:Certificate:=PackedParametricCertificateData.decode 12 data1323 private def data1385:List Nat:=[ 0x10d120a0d0a0a070e0404010d00070001000a0614040302020203140d100d140b12080d08070708050d000b0009000a140d100d100c140b0d08070708050d000b0009000a100d140c100c140b0d08070708050d000c0009000a0608040616001c0312030110020102020203140e140d140b120a0d0a0a070e0404010d0007000a140e140d120a0d0a0a070e0404010d00070001000a140e140d120a0d0a0a070e0404010d00070001000a0614040302020203140d100c140b0d0a0d08070708050d000b0009000a140d100d100c140b0d08070708050d000b0009000a100d140c100c140b0d08070708050d000c0009000a0608040616001c03120301120400020206030101140d100c0d0a10090d080e0707070a030d0009000a140d140b100b0d0a10090d0807070d000b0009000a100d140c100c140b14090d0807070d000c0009000a0606080402000803060306020304020203120400020206030f06010202020310040002020603010e0402020206030d1c0a1206120102041e030a0914080a080e07140310030a0312000e00090a0914080a080e0714030a03120010000e00090a0914080a080e0714030a03120010000e00090606080402000803060314040302020203120400020206030f06010202020310040002020603100402020202030e0402020206030d1c0a1206120102041e0301010b0c08020702030403, 0x115070900060007060c020a02050c0304040b06090203080004040c040802030600020308041002000202020408020602010c000404100408060706020e000804160415130b0b150a13090d090a0607061400090000000a1515150a13090d090a0607060900071515150a13090d090a06070609000706140d140b130a120a0d0a0d090d000b00070000000a140d140b130a120a0d0a0d090e000d000b0000000a140d140c130a120a0d0a0d090e000d000c0000000a06010b06090203080004040c040802060202020410020002020204080206020404030404060603020206030804010d240a140616050204240309120704050600160416041612160d150d140b1509140915071506140000000a1612160d150d15091409150715060715131612160d15091409150609060706160d140d140b120a0d0a14090d000900070000000a160d140d140b120a0a0a14090d000900070000000a160d140d140c120a0a0a140916070900070000000a06010b06090203080004040c04160d140d140b120a0d0a14090d000900070000000a160d140d140b120a0a0a14090d000900070000000a160d140d140c120a0a0a140916070900070000000a06130201060202030b020902030402020406040110020002020204140e140d120a0d0a0a070e0404010d00070001000a140e140d120a0d0a0a070e0404010d00070001000a140e14, 0x11512150d140d140b130a13090d091507090006000a1512150d13090d09150709000600071512150d13090d09] private def node1385:Certificate:=PackedParametricCertificateData.decode 12 data1385 private def node1386:Certificate:=.split node1323 node1385 private def node1387:Certificate:=.split node1262 node1386 private def node1388:Certificate:=.split node1200 node1387 private def node1389:Certificate:=.negative 1 [(1,0),(2,2)] node1388 private def node1390:Certificate:=.split node1135 node1389 private def node1391:Certificate:=.negative 1 [(1,0),(1,3)] node1390 private def node1392:Certificate:=.split node943 node1391 private def node1393:Certificate:=.positive 1 [(1,0),(2,4)] node1392 private def data1457:List Nat:=[ 0x180e8a01007000203d9f982ceacb08ef2c8bcdebca2bbd2d3a9c9af97cc91bac007070002148b88d9a3e0ffb4e6acc38efd9f93daf2e8c997b5aaeeeaa0130500023afae2cadabdb38bc2eebbfaa0819f8ef4abaac2a784df8aa0100300020486fcb8b997a6e1929095fbf6b18ac1d88ed3aadcfcbfbcc01301000220e3cbb1dcdbb8eccecc9993f5cfccdfe0a8d7ad83d2f4d8e01e0198a596d79ef58fbae6d7f3cb95cdefaafaa0000608040200080306030b06090203080004040c03120400020206030c0403020102030403100400020206030d060a0200020302030c06090200020302030114141009140812080908140712070707140012000a14141009140812080908140712070707140012000a14141009140812080908140712070707140013000a060608040200080306030b06090203080004040c031204000202060311040c0804020302040803100400020206030f08080607060212041a030e04010200020308030c060a1200080308030114141010140912090a0914081208140012000914141010140912090a0914081208140012000914141010140912090a09140812081400120009060608040200080306030b06090203080004040c031204000202060311040c0804020302040803100400020206030f08080607060212041a030e0402020206030d100c120a3601200430030a060702000203020301, 0x1fabdaba8939fcbf7d5acebebe4eab2a5f4dce0edb00908020205bfefe7d289e085aaa3fbbbebbf8faba3a8e1a1fbb1e8c2c8070702020e9ecdf8e9cca780adbef2e1e5a3eda7b3c4a1fe839980f28e0706020204b1c38a96a9edc3d7e1df81e5f69aeba993cbf6a5efb8a48c07030202519fa6c2d08f949ac792edb0f5db88bbe9cbc5efe682f3de1300020203cce3f6deebc38bcb99ccb1e8b59ad2ceafc2b7b6ec8b85fe1413010201dcb09fc59fb99bcea2fac9baf2bcfffceaf98bb7d6c0d5efc0121001022af3f4b69b8afec0fea9bdf4c1a8b68cfeec9feec7cce4a8b010100102048be5e884a1a2a5ef8399e1f4e9abd7eff4aa9895b1dab9e0130d010211fdebc9e6b7dacad1bf93d6edc9b1b4b3adee9ae7c6c4e0f00808010206bfb3fbcff49d95e4f996e4cedec6f9a381f9f1969e92f3a00707010213e0cde582fbcab4c5d289caceb7fb84b5f599a6d0c0d8d9f007030102028a95d7edb2ebcebb96b391d4b2aaba86afcde5a6f3e7c9b01301010224c8b68cf0cbf2bcf7bdbefb94d39c82b2cab0ebb8fc93acd0141300020295f9fcd6e8fabbabdfa3b6f4eec8a48dae9de287e7f38b9fe012100002279bd6a998bedcdb859f95a39d95aff0d19af5b48accb6bec0130d00021fb9b293e3d38cb9ecfbecabf2bac9b4def291f0d9f087f8c00808000205e6e2de8fe7b8c5faa9dcf283a7aacbea8ab5a2f5c9, 0x114141210120e120912070d030303070005000914141210120e120912070d030303070005000906140403020202030b06090203080004040c030f02020202020314141210140d1209140712071206050507000914141210140d12091407120712060714141210140d12091407120712060706140403020202030b06090203080004040c031204000202060301100400020206030114141413121012081407120708070605130007000a1414141312101208140712070606130008141414131210120814071207060613000806140c050400020306030b06090203080004040c03120400020206030c02020202020310040002020603010200040202030107cae00aeccf01da98648717ba9a348dd532f79419c4c90001c28db59794fd95a38783b29682e0bcfd9bbfa9800dcbce0ba0d503f7a4029f9d3297e017e6a334f88f1adfd40063fad5dbd9b4d1dab98cd8bdbfa3bb9ad6dad9c00282b94f92a00188cbbd44e48e06b4882aa7db43fccc22bccf0041d4cfa1d6f4b6d0af9dbaf7da81c4a8ddb190141402020acfe0b3fba4fbf8fe84c1afb886a2ecc6f1aa94eebfb4adb414130202018df2a6e1eec18be2d594d6fd948fecbfce8ebface4dbd787d8121002021e8cf1aed5f88f98e2bdf5e887a3be84d099e1ebc0da98dad8130d020202ed8fe399d4838fdef1948f9be2bb89c2ead081eb87c785ac090902020787f3, 0x114141210120e150d140d12091401050000000914141210120e140d12091401050000000814141210120e140d120914010500000008061414121012070905070508040d0301000000091414121012070905070508040d0301000000091414121012070905070508040d030100000009060113040502020203100201020202041002000202020414141210120709050d0303030802070001000914141210120709050d0303030802070001000914141210120709050d030a020802070001000906140403020202030c020b020502020a040803141412101207090508050d0303030700010009141412101207090508050d0303030700010009141412101207090508050d030303070001000906140403020202030c020b020502020a040803010f0601020202040114141210120e120912070d0303030700050009] private def node1457:Certificate:=PackedParametricCertificateData.decode 11 data1457 private def node1458:Certificate:=.positive 1 [(1,1),(1,7)] node1457 private def node1459:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node1458 private def node1460:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1459 private def node1461:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1460 private def node1462:Certificate:=.positive 1 [(1,0),(2,2)] node1461 private def node1463:Certificate:=.positive 3 [(1,0),(2,6)] node1462 private def data1482:List Nat:=[ 0x1141412120d0d090909070707140512030a0309000a141412120d0d090909070707140512030a0309000a141412120d0d090909070707140512030a0309000a060608040200080306030b06090203080004040c03120400020206030b060502020203100400020206030d02080203020302030e0402020206030d080a120806010a04120310100e0e1209100912080a081203120010000910100e0e1209100912080a081203120010000910100e0e1209100912080a0812031200100009060608040200080306030b06090203080004040c03120400020206030e020b040402030203100400020206030f08080607060212041a030e0402020206030d080a120806010a04120301] private def node1482:Certificate:=PackedParametricCertificateData.decode 10 data1482 private def data1491:List Nat:=[ 0x114100e09120810080a08090812070707120310000a14100e09120810080a08090812070707120310000a14100e09120810080a08090812070707120310000a060608040200080306030b06090203080004040c03120400020206030e020b040402030203100400020206030f08080607060212041a030e04010200020308030d040a180808000a040e03] private def node1491:Certificate:=PackedParametricCertificateData.decode 9 data1491 private def data1528:List Nat:=[ 0x102a196f7b3fe988ae5c69dc7cbaa90e188c481ab83cdd290900909010251f5e8b1a9b4c6ffb9cbe8ad80efabcaa284d8afd2d68080070701024f85e8a5b0fab6b6a2dcd4cdb08ee6e6a9d5c9f4e7dde4de1305010207c4df88bbf2e98cab8dccdaf3e98a94d3e7e4b1fa97c08d981005010206ffeeac87acbac5adf582c998bee08ce086e68de39ba6edb8050501020285f6b8bdb5aebe8ad396bb88b0d7ee92faf1f88af891f5f21203010201a590d8f5c689e7e3d0cefce1a9dae9d5d9d1e08a84d2cbe0141300021b8ed781fcbfbbb1cceab493d8acec87d1c0aad7fe83a5f48e10100002018ac7a6f0c2c3ba83e6c987d4ebdae7eadc86b3c6f685cfb80909000243e7d8e8e39aaf8adba98efd8de8e4adbeab9de2f0b7b19807070002589692fab9fbf4ffa6a0eae89a97c2bdc6dafdb3ccfaf196140500020190abd89bace5fdb299e9e2a4dfffbdacc2fdc4eceacebc96130500020bb6ce8ceca4c5f080e6dcbaefb9e1d1b5c799b0fd849ed7c01005000205a5e8adc983a693f1aefef5b888c0ecf2e5abdbb6bba5cdd80505000201cfd1faebd6a2bfbfab82cdf1b190eee3eedbc9a684f1a7f212030002299af3b9d1dcb8c3b5f3cfcdd9afab99e5cfaed69feeffaa1e14adf885deda9082fce19aa9a2e7a29292d8000608040200080306030b06090203080004040c031204000202060301100400020206030101, 0x1eada84969cc0f8b6e9ebdbd3f5d3bcab9c1e42cdb28681bbfe9f979cbaa2f7fb80d8000608040200080306030b06090203080004040c030f02020202020307a1fe088cf301bfa327de1bba9635fac532aef2199981001cdafff9d29cc0cfb8d7e0a2a28fe0b4d29fa99008829a6f8e02f7f119cf3497ac1b9cdd33f28d1adeec000bf8e6ea9286e0eb99c2f2d094d2a1ea8881e6a04ed3d109dd820188d49e4591b32af6b006dbe944c1cd229ca6000cacb9f498b0bab1c0ded6e1bfde8c8cf1b4e0141302020984df949de5d6c2ffc8d0aec5e7b8cf8db5e199dafda0d8a6121202027eeaad92d6c6b98cfa988abfc3f2c3a4abc6b0c0c5abcb801010020202e7bbd1b5dfeaa4a4859ac9a5d7c8d1ace1ddc4d88ab7f8880909020247f390c4c3ccd6edcfc1ee9eeed9d78bfe80dfa392a8d188070702022392dafcf8c092eaa9aeeb9ec1a7c9e9a5f595a0b0cbbe86140502022e8ad1fd8ec5c6b5eed5e1a0f482bee2d4bfe4b9f2c1bfae1005020207aac3b48d8aa6df85d1c7f79c81e8f5a0e4bbd4f487ff849805050202028384a7cfe181a0ebbaf0b1c9d4aeb9b7eb9af4beddfed3e2120302020197f9d7a4bcdcbce4afc5f6d6dff7c6a6ed99c9f2a6cfae921413010210fea5c783f7acb5cdd7dfecefe8c5f889a7e1d5df85eeee801212010203d8d7c9ac98e5f5c4f0f1f8b4dbefe3c1b2dfb7c381d3a010100102, 0x1d5d2b1a0bda28989e5e395bfd6a9d591f3f8101001020ebd958ff2e9b2908988fc9ddba9bdeccaab95c7d5d8dc09090102029de5968be0a1dec8c3a8a19c97cecdd4b0e6a4f6ffcc140501020d8db38fdfb8c1998e8bebea88dddb87def0b0aaaeeeb0100501021bb4b5c2defaecde8ce7cce7fbf5cac7f6e5f5b9ebe5b0050501022a91a1ed89dca2e3868ac3d5ffdab9b3a9bb9cb0fcd7f814030102029f9aa099c7ab8ec7abce94dfe7d0c1c7acdcf8aaedf8100301020c98c0f4d7dbffa7e5f7fdab9194f3dd8a90d3ff8bddb8050301023ea2c6f2e5caf3dab2f3b68ca4a7d4f1daabb2a9c685e80303010214aac1eefad2e786ebdd9bc4ede6b3c484c0bde6cea7a4121200023cd0e4a7cfc0b2f083b4c9aad199b7a2be8bb0bfd1b8101000020afcbf87a8e09dad9789e38acd80b3ccafbcf68fc3b5980909000201d0dddcb88cffce859785ccfdd4fa80c3b9b8d6cba5a80707000213bdc4ea859ca2d1d1d18a818e8da6eeccd3d788e3a81405000221f09bafb4dba0aaaa92cbb0aabddbd09eaeceffa28eb01005000209cc95f1ee84c6f2be9891bbccc48de6da93ea96c2ecb00505000230c5f2afddafd682b3cc99c1c2fb8ba2aec5c6b1a1c1ec1403000215ccedf3e8a69cd585c4c5a0b2f2baaef387918d95def0050300024ae5db8beb8d8af382a2f58d82f98ae2cc93f68dd5bfe80303000219d4c5f9bbd8, 0x1c883dce08196a8b9bdb5d8b4a1ee13130002069ef38be09bedaac7e4bbc3c2d0b887f5900f0f000201b7eae6c0acc58dd88ec283dbfde4d5d3821306000219cfab84c0a7e7a29dddf89d84f8bb9593c4060600021a9bf8e4d6f5e9bcea8aca83d39dfd900604000201eeffbd82bd9cc1c2d4a3c6a8d2f1d1c5941301000201b7c4af97dda68688f9d2c3b6aba184bec4190cb8ba93d5f4a5b5e5a1e20006060504000803060311040c0402060306030c0203020202030f0601020202040e020902010603060315a0a455839d4ecd9620a3b901118994d1b9e2cd95ce87d1c6d696c285a00cdea60fad9d02c5a7019da00e8bda2ab0913ca5881fa7970056a186b2edc2bf89e881fed6a6b9b6c5a7941da3e815f9d10983c103c3e42de5c017cab126aaa512bf9c001687c7e18ba4e7a299d98fb1d9a390c4a2d8101002020a84eaafd8f0eeddce8c9897dfece0b7bae28ab4bcc1f80f0e020201d09fd596cbfdd6c7de9798d9f3a1828dcfa88cb3cfa80f09020206a8d9e8abc9b6a6bbd5d7a78cf5dee8e2b585caa1aab00707020201ee9cc49ea8ce858a9cf6938c85d5da9edc9bc4a3879e100502022c8cab9eb7a8a3f58fb7adb8bebdb4daeaa6dfadbea8c80505020218d4cdbdb8a8aeead1fc87ceb3fb9fabc9cd9a81a1f1aa10030202178db0e58cd8efe9b7f9d5e3aee8c0f5f9a2ac9fbcd9d00503020218d5ccb0b7, 0x1c483e8060200020fb1ea9ab382d3fea3d3aaa9c5cbab9690010100027cb18fd781a3b1e0b3f7e1f1e089e6ce1928d7fcffb6fadb9aef8a0006020302000203020311040c040206030603010c02020202020401010200040202047ac701c1ac0389c201b9d92bd9cf3eecb025d4bd12c1de0015a2fb8da2c782a5bbd1d2c9e6029104e8df04fbe801f7e52da7fd0e9dcc41a3f62299c30008bffcf8b4c1c3a0a6dea681921313020206b0a5a79e8d8495e9eafae6848ff9c197e413100202139a8ebbffe0d09ee0b0f1c7f7bfb0bad4120f02021ce9c5a2e78b91eacceea58aab96e6cee41406020202c18586a3c3d2d5dcceeaece4a5a2fe99dc1306020203b1f091edfae490fdbada8a858bcac4b288050502020898d8dca1e1eec7a8bb82ff9cefa4e2ea130402024eb08fa6ace5b0de8af8d7f8e7ddccae840601020245e2f6bf9facddf480d0e0e8f7c5b5f5fc0101020205d8feff889a9cfff8aec9f7e587f1a892131301020790de95bab2e4cdc697dae08ea2eddefc8c120f010205f5f697829eabecbba7cacfbb90fcc0d8140601020cacfbd6f2c0d5fdcdcaa88bdcb7dc95a01306010210b8ffcad894afbc8efca5fae1aec5ae8dd6100601024481d99bb6e9839593dcf3c895eeaf98d41301010225da8ae9c398c880b5a9a7ea9baee981e0040101022dcafebec584dff8ccc7d0ddc7ca98dee0060001022efaa7, 0x1040c0402060306035601f0f20290b702d0ec2e94bb3ee1d22086a30fb98e0044dfefeefe9bb2fd90e7b7a003bbcf10d101c0e101d3ac2888fd0bacfe45fa84299e83001d82fea0c2e8ce96fbee8b901313020202f2c3ef94dcabd899f69de6ebf0f4f4fe0f0f020204d0ecc38ec592f7be89c0a9b09fd7ebde0707020206f2ba97b486d3eaeda9ef97f3adab801304020215c7eaa3e3c7d2d2b0b5ab9afad5b794b80e02020204cdafb3f8f6eba8e6c3fac9a9bac3d0e80902020202dbd383e6e9fefff18fd481b8cadfe0c00602020211bffeadfad9958491dfd399afe691d3d00101020206c3b288d2cbb889a9edd882d284c9ce1313010205d88fd986b3f5bde2ce96c3878fbd87ea131001022ee6b5d7d2b585bdd8ebf6b7a081f8e00f0f0102059f96c8c6c6a3f4a694ac968891e6e9fe120601020f8bd0d5c0affdcfe5be8fe4f0f3c6a01304010216b6a3f1d5ebb1aaac82dfe5b296c8e5d80e0201020396e5e0aaf1f497c0bc9ed892afa4bccc0902010201a2df8f86a9beb992eac980aa83dda0e0060201020fe2ecd1e6f4a4c8b0f8fec38bc4daa5d4010101025bd5cad0d0ccb4fc909de4a194bad9d2131300020999f2fdc69592c1f0c089dbc1b090c88e0f0f000207b4aad0bbccccdbebdbb4b49cf1f7e9ee130400021bfe8f93ecfce5bbd9bf8293d1eaa898b80e02000202aca1d5cbc8fc9ce1f6d596aad4, 0x1d3b5a1e1bdcec8a3da9095c5b59f809480fd9f83b00401020203b0c9d0b6e686b8dbfdd3d9f5cdb78cdc82afe8ccc6dee9c3ddda131301020688dde38988fa808ce99ec29cc3f19f9ecc9788e6e182c7b9a4d00f0f010201f8eeaaa1899590f9e5c3c3bcbdc3d29a86bf8385ed8499ace1e807060102069e849ea2eeeeeaae989a918cb5c69ee088f399fd83a2b49d801304010204beb8dce7ebddde929bfebbab8dbec9c8a8df93a1b490dffbd3be0403010225b3bfba8bf2e0dd8ee3aad2acd3a58ed8edacefe4bae095d9800702010201acf7d4f2c5eefcbaa2c9d4868e80b3d1b19086d6d7b3f9de80040201020498ea8f8dd388f4b997d8c5d7cf89f1f3f59fba87eca1cc8791ba04010102029aa6dbb4b3fc8fe0bbe4cebbc484c2e6fed0c3c38b8aebdbb2a01313000203b7b0bdfc82ae9b8ebcc49de98f86d8b592b6f5ff82f1ad91e3b80e04000208b5ebf59a9796fe90ef879accd281fbc7b4efbab395e4999aa404020002039598beb6d5fb92cce2bff3ecdafca5bac89985e6c2beffaeefbc1301000242d0f8e986d187fe99ea88caf4a4e8bec3e4f88091d797f5d0c0040100020199cdbf9bbde0dff5a1dc99adb094c7e79faba4f4a08bf69bfde60101000231c8b3adc9e8bcc5cbdabcecd7f5dae3d6d48ea78ba1a0e7fe9c1907da9fee9c96a3e6a8cfa2aba3db96effca795880006020302000203020311, 0x1d0f6c1d7f0b4e6d1a99db18281dd8fb1d781c194900404000272acd2fbbc89baa78c8ebfd7f690b3fbb5d2d2aff6e4eb97e4adcb85b7e2c9dfa097e9ef9e96e0d6e5da90bbdeadcbbc0101000241cadbf7f183cabda8a1ceefb6a1efca80e2d7f7b0bba89cca83bba8d584ec8ba6c2eeffd8f6e09fb8bcede08bd2859c191ea6c6e2a3a0b3d6a78bc4bfb696fa8fd082f9a68cfc8df4cddba184b0f2ddac89e2a5d9858196fa8ac0000101100201020202041002000202020457dba34dd6b422a286189d95012af8b589b796a688c8beb3fec1c48f9ae7eca49bb00ac301b198508b029e8e2d98853ea39622f19b11e68c000c8df6b1ffc4f3f597bbfedef5fe89c3f9e7a5dc8a80168f0292df26c87bd72bf9ab0dc69643e7bc25b4a50005c3d79fedce97a4e488f4cdf2e1a0f28d8ef1b2bfb278a6ec70dfcf2facbd27d0ea3687db3eb8d81afac023abbb0048f0e1c3accfb191c692998eabc3f4d9d3c0cba18013130202019ea4d5bd92dbf894dbb58de2dfcbe1e9f9cfb3c2e4c1ff8cc1880f0f020247b2ce99a5a69e9cfb908b96fcd286d099d48bb2f19983d781f00707020246cbe4ccc1aedaf3ec89fae2bea3fae39aacf383dc928b8cc00d0402023cf4b0eefebbc0f2f7829f8bf8c69f94a7badf84f4c5e0b58aac0403020249ca87b0ccfae58dafbda484addebf83bde898cfa5d3a8d404020202089082c68ad8, 0x1b5f19ef483bfe2010102020bf6cdfab69387dfa4a0899debd6f3f697c7edaccb8a82e4e582f9f08390ea94e2aebfacfebecfead1d8be90a3bce1d81313010216b4af95e0fbf58d83ac8087e9fefedcf5d1a6f8bdf8e1c8adb8f8beb89eafabcf9fa8e1dac3ce99b0b5a0c689a1afcef40f0f010209ccdfb1b4c0c193b8eeca9eb687f7b1c2d4b28ed1fdd182f9dac0acaba99fecc0b7b79fe79edb8ea5828dd195d2b1a5e8070401020cc2b0d2ed8885ec8ec4ffb7bffcd5a2f9dbd09199d6d293b0c4dbcb98f4b1af88efea888ddd8bb5ae8bcedd98dff3e00404010232d5fbf4ce999194caa48cddaaa6b3eb8cc6cfe5a4c3d5de92fececfa099fe9cc6dbf9c7a3d6f8fff6ea9dafb29ce4fcfa07020102019a9cf9a5dc85bdfcb6fa928bdbf983ddadbfdaf4c68fefafb6f0eb9ce5f0aed2feb798a4df9ce1ea88f9fbb0e5c8c801010102018ee0e0bc8cad9a9781ba84dbedabcd8a8dd9b39e99bb90bb8cc3c4dda1dcf8b2e8c2f88ae18ea8bc909db0f2da86c5d60100010206f381e8ced7ccecd996e58dcd8aa084c6a4c8de87b8adceb1e3849bcd898cf1ce929de586d18cfac7ddaec4cb92b1c01313000202d2c5cec7e1dbe1b0e38eaa9abbefbb8aabafe6fafdbea590c6d9b3c5e7cb9fc8a2e7baa288e19fc386f9c4c9eae8e2b00f0f000201a0a095afdfbabec8a6e7cc8c9a85a294e6f5e0a0e1f3b695afa69b, 0x14b9c880009e484b5d598d18398dfe4a3d290a1cac5e3caaec9cdebf697a093c390f1dceefc929b91b2f0c4fbcdb8cba0299d8b0197bfa208ed936495d520d88050f2e513a59543bffc0006e9adb1cef8aa97c3e9cd9894fdba80a3e5a0888eaa9fa09ae7a1d3a4d9d1f1f0b2b0b7e7f2bcd3d8aae6c0018cedda1fa1dc4f98b55bc9ab58ddb32096e91fb18a59c3940002a5d68a96aca68aa5b2eddac5fcd2d1e087ac89b6eabafbb9ea888d9de6dfdfeaf6d0b19bb594a1aad680d835f3bc03b099018adcca01c0a9912e8abb11b49359f4970199b2e80021d88ce6e69e9ce2acb7e7a4aff3b8d6f6d7a6e4b8bf93cbeed2bcf4dbead38bcea6fcf4a1fcd8d2f2cff81313020201ade2eca1d9cfa0acbecafdedccfe9f9addbbc8f882e79e8db5d7a4d9def7cddadc9da499afd58bfefbb4aacdbcd893c80f0f020253a2ab82d9cfd0a0ecd99c95dc88a7c0f8ddfeddb690edd2e6e1d7ab9f91b4dfc292f4a5cfead386eae4ad92b69af8d8070702027fed8991d6c49890e6b49f9fa1eaf499b0b296c7bbc5f5ec9deef9c7bab2d8cfbfebb286b3f8e5d3c4c9b2a8bbb5ca0704020212899cb68ee7f093e4a1d1a0f6aeadc8a09ad2ca9afb98f78faeced8b3d1e9d7c8ec91b2e086a6989484e0dbfab4dc0404020201adfabbcbf380f4b9b3baf7c8869fcaf5aac7d6f884ff80dabfb5b7a7c487dae293cbcce3b1c28ea3ae, 0x1eca681cbbfb6a3fdf0a4e4a6e485d8800f0400021c83cdaecdefa4efa598efa6a7bbd3f6e799cfece9cac58699b582bf900f0100020498e8b8d484b0c7f8b3bffefeb3f49496ffe2a1a7dbd79587cfacb5d2aa0e0100020185b5b592e4f393e8c3c6e1f7baa2d2eba6abd882b5e5acbac889e88db606010002608cb8e1e4ee88a8de90eecee9b08897c2d88c99ca99da9888c8c39eac1901c7dcfbbdcfb6faceace395a4e4f4f281c2acb5d887c000011414141312120f0a14010d0109000800030000000a1414141312120f0a14010d0109000800030000000a1414141312120f0a14010d0109000800030000000a0629beb672e6a501858448a2ec0107dbdd81b085d5bec29b9b94d2f094a9f5c6c8b99891fef2e0ddb3ffcefda084f0c2fdb491e3cae5b2dca6a864eaec23f4b83ad7e14e87c101038ee0d4a7ae94b7ec9eb5a3b8af909ae1ecb8d3c8cbee90f0eac1e5dff29bccf6ebd1b6b3dacefcaad8a1d005d38203ddf803e1d303e1f129adaf479dc01590c908dfc5003accc6d6cddfa991d78cda89cfedeaecc2c7a1d1e9b3debbd0b4aa8cd2beedeee79de4d8a88ff781fd90e6a803b3d610e1fa0592d312f0e70f9f9176d745dc9435c6a9001a8094bbbafded92a399d8d0eda0eadce793d5c5d5e5a586e9a8b2d7d4ceeed7fcf8dbbad38389e299e88be027b1b32c9abc0da6aa118cdf2bc2892c8ba10cb1a4, 0x1c7e880e1f4de81cb8bf2fdd4dc9db58aafa0ece9c7e4d9c6cd82f00202020207e3da91b5ea87f5b7a2d691ebfcb0ac9cf2c4ce90e3d8b2ced180e2a40f01020202fcfb97af9adda3cfd6e78f9ace97cab0e8e3959dc48c83fbfcdd99be8c0e01020201a3d5f4d6deb6b4dcab8bb08fec84bee5d3a8da82b9f19bedb69d848e8c0a0102020afeddcdc99ab1ab87c0ff8ff68297b3a3b5feaead97ca8b88b7a8d6c80601020275dbeaecb0f6bd8ab890fae7f2c4c58ff9eea9e696f1b189fdc2e28ed8000002024bfba1e48cf2ccb0a1be88b69ec6b1c5deb8a88affc4b3848a9cccd813130102028e9eaefaa5b3acc3ebffe4f0bac49ee2cb86c6d78ce3a9d4c5dcac8ba4120f010207cca68bbdfacad0def9f780c2f4f48bf6a1de88f39be6d39bd39995f80f0f01023482cd8dca92bac9de92cbcab4cdee96b9ae948fa0acb5f4fdba83abb40f01010203c4f2c7e5a8908b80b0f0b4c5defa9fb0daa8fbe79b8d86a69c9ba3c0de0e0101020190fc9294d4e49ad48ed5c8a5a986d1ceded4efeee6abc897d7f2e897a20b0101020b8295d886e7ecd6cd88a8b8b6e3c3ccc3c0dbf2d3e3e89c9ba3db92dc06010102689dafb288cb96bbcb8c89d0fcf6b5c488f7a199b7fc85d0dabde3ced81313000201d1e88192d0ced7d48ba9d6f5e9d5a0a2f6fab4eadd9ecba08694a7a6a00f0f0002019198f197d0d7fdadb8c6dfbbf7, 0x11414141312120e080e030e010e000d00090000000a1414141312120e050e030e010e000d00090000000a1414141312120e080e030e010e000d00090000000a064af7eb368fa74fddad01d0e4c201028b86dbb3d6a9dd97d7c7c9d9eae9ccb3cfafb2a5e399982cae04c7dc03a3e37ff4208aea11b5cf439aa734c58e0001c5aebdb49cc2a280bcbbccc7e785aea3838ceab9e380d3a801b2ec05d4e32083019fc240c28225db8b15a5a4308c99000193ebd5b9a0a9be91f595cd94deaee0b3b28e94e793b6ebe8559999318dfd5fb2a301e89c904195f42f8ef2488f9c01b8b4810001b8b5dfca98f49bfc9ab6c3e9f994bee3a7b8aed7d69a841313020202b1b5c7d3b080e790a5d1f294fcc6c0de9cddd6bef99eb687d5ccdeced00f0702020edc] private def node1528:Certificate:=PackedParametricCertificateData.decode 8 data1528 private def data1562:List Nat:=[ 0x107100708070a040804010000000a060113040502020203100201020202040c0403020102030404141013100f0812071007080712061001130007000a1410131010100f081207100708071206130007000a1410131010100f081207100708071206130007000a06140403020202030c020b020502020a0408031410131010100f081207100708071206130007000a1410131010100f081207100708071206130007000a1410131010100f081207100708071206130007000a06140403020202030c020b020502020a040803010c0403020102030404011410120e090812071007080708061005070005000a1410120e080812071007080708061005070005000a1410120e090812071007080708061005070005000a06140403020202030b06090203080004040c030f0202020202030c02020202020410040002020603011410120e080812071007080710050303070005000a1410120e080812071007080710050303070005000a14100808120710070807100514030303070005000a06141004020206030b06090203080004040c030f0202020202031410080812071007080710050a030303070005000a1410080812071007080710050a030303070005000a14100808120710070807100505050303070005000a06141004020206030b06090203080004040c031204000202060301100400020206030102000402020301, 0x11414120e0f0a0e0a1007100112000800050000000a1414120e0f0a0e0a0a0a100710011200050000000a1414120e0f0a0e0a0b0a100710011200050000000a061310120f1207100708070a0408040700010000000a1310120f1207100708070a0408040700010000000a1310120f0f0a12] private def node1562:Certificate:=PackedParametricCertificateData.decode 8 data1562 private def node1563:Certificate:=.split node1528 node1562 private def node1564:Certificate:=.split node1491 node1563 private def node1565:Certificate:=.split node1482 node1564 private def node1566:Certificate:=.positive 1 [(1,1),(1,7)] node1565 private def node1567:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1566 private def node1568:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1567 private def node1569:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1568 private def node1570:Certificate:=.positive 1 [(1,0),(2,2)] node1569 private def data1597:List Nat:=[ 0x1140e0a0912070907070714050d030702090000000a140e0a0912070907070714050d030702090000000a140e140d0a0912070907070714050d03090000000a060608040200080306030b06090203080004040c0308020602020203140e140d0a09120709071405070314010f0009000a140e140d0a09120709071405070314010f0009000a140e140d0a09120709071405070314010f0009000a060608040200080306030b06090203080004040c031204000202060301100400020206030d02080203020302030e0402020206030d080a120806010a0412030d0d0a08090707070e030d0308030702120007000a0d0d0a0807070e030d03080307021200070000000a0d0d0a0807070e030d03080307021200070000000a060608040200080306030b06090203080004040c030f02080205020302040403120912080a08120310031001120010000f0009120912080a08120310031001120010000f0009120912080a08120310031001120010000f0009060608040200080306030b06090203080004040c031204000202060301100400020206030f08080607060212041a030e0402020206030d080a120806010a04120301] private def node1597:Certificate:=PackedParametricCertificateData.decode 10 data1597 private def data1646:List Nat:=[ 0x1021885f582979385ebbdf2c6b8b4ebf00303020267e5b8afbcbbae9cb3be89d0bce80f00020202bda888a4aab88edc94d9a9caf4e00500020207b696fca4fee288e084e1b3d0acaa1212010202aaba8cafc4ace8d0a4cab6d9f9c00f0d01022989b6af8290e3d5bd89e1e4c4a5f0070701020a85eebdc6adb08cbabc9493c2ddf21405010203abf6fddd8dd3ed96d1f5a3f68ee81005010204c6d0ffe6f7bd9ab1e3f2b9f796980e03010218d7a2f3f4f6d2a9bac7ee99f5cdd00d03010224acabe9f9c0ec82b4aaaff0c8a0030301026cd09dd1dbadce8ea891a7bebec00f00010203dbcaaaed9b91a5a6b9d3c2a780d00500010208b0ddf9e3889df9cebda3dbe8c9ea1212000202f9ddc0b7e3cadb8ca1f2df8a8ec00f0d000227eda888fc8596d5ba94c9e293aa900707000209d99bbaab9cc0b7a4f380edf5f18a1405000202f4d2cbe9a3f699c8b7b6aada81e81005000204eecdfddca6efe0ac929d82f8b3880e03000218a4e491b8afbd80a9a9d2cfb2eaa00d03000201abf7c5a69fa3a585e2acbe9384d0030300022dafdfeceba59e9bf6e3f18e8ec00f00000205928ed781f5cce3e6b681bf85f7a00500000209ae95e2ece1b4da828ffcd1dcefe21e149ecfdbe7c4bca8000608040200080306030b06090203080004040c030f0202020202030b06050202020410040002020603010101090206020002030204, 0x1899afdabd998b4ae9aec968a9ca2a1880f00020255c688e6b8c5dcc6aad2bd98b6bdd480b4a00f0e010201fcd88ce7bad6b9c087b6a3fbf2f6acc2bbd00606010252f9d3aad68b98ea8ab582f7aef6e99cc9ec1002010221efabf4abeac0a9b4efb2fafecef2fce5800f0201020698ace78ec7a58ba1f5e2e393f1f6df8d9eb80f01010202a688cc8fab86daf4bec1e6ecacaba8ece8e8060101020caee8cdb2c7eacc8a9e9facbea7dcf69cc80f0001022580acdbc2ae8fb1e1aca0c6fceea1b9c7c00f0e000201e493bd83c09da1f18ff79398fbcba8ccedc80604000202f7f1adaaa29c878f9bec8ededfa69baa95f2040400027c8af9bd9a8a889684f4e285c697b6b599e20f02000206bc8dd1b4ece79bbfebeca8c4f3d1bef0aa981301000232ef8af0da88a39cab9fa7dbac9f82cc84c20f01000202cce1dcc5d5ccb3cda8cfed95bac1cfbff3e61901fcf8ede6c7cfe0f296d0f40006060504000803060311040c040206030603010f0601020202040e020902010603060301b5f0038dc774ec01e6c11ac49238b9c534dcc415ddb70012a6feb5d7929ba6eea01212020201f0b0e9b3bff5a5f3c09ee3b292b80f0d02022a8cf099bbcdebb9bcc0a0e4d1a490070702020aacef9faccc8590d5e0f0f0cbc4ea1405020203dc8cde9981cbe4c0df99d18ad8981005020204bee5adf9dae3c2a3ccaaaebca0c80e0302, 0x101010204d2afa08ac0becbe8dfd3d8faba9ce1ebf68c0f01010202d796f9c8f58de2aca881dd8ff7f5ebd894b80601010205a5eaa4d7f3f9c3e583a18bd080df91a292940600010201fa98f5c8acc988848795f29d86b1d89aad860f0e000219e0ebe8d5c1e1fcf0b1c3ceb9bb958b84da800606000209ebbc83ecaeb2afccc1b5e4dd8286a0b0f3ae060400020297e49f9acbcf989dcbb7aacdc3b8adbfe3a40e0200021aa3a6ba85bac789e396a6b4a6c3b6bcc8f7c40f01000209c3a9cdfbffb5cab0bb978afbe48b9286e7e40401000205abf9dbfe8b9ceb8fc0deabcc8ababbb9e9ac1910c3cde2fcd9d3b6b3c5ced20006060504000803060311040c0402060306030ceef978bab10f83f70194ada40110e7f2a099ecadc093e6d7d79003deed019eec01fe9c02c3d823f3cb3f80da2bad87109ffa0003af8eafa7bdc1febed5d0faa7800f0e020202c1bfb494b9effd8da8a1a5a1c190879db7c80505020201dcb2aeefd58ed8a3a5b2e082cbfb9eabe00604020202dafef9ebea80cd8bf8b1abf9f9839e96f5fe0e0302027df888d5cfaeefdbb6b5dfa2fcdb9ac5e01002020249accebd9bd7c9eeaef58ef2caaaefb2d8c00f02020205b2bca0fbbbe4be87bfa1bce9fcbee7a8dcb80f010202018a9efafbb6d8d681fdfcc6d2e9e884f29888060102022091aa89e9e88addd3ea80af9edcc5af9eee010102021698, 0x100021999e6b1b6d2c0e28f89e3d9f6b6bbdbbfa0b48ac8e4c6dc0f01000252a9db80ca839afdd7a6a9cfa1dbb0d4e091c7bcf9fed7ee040100022e9cc7f7e2a7aba19b93958bcdb1d0c7f98bf3b8ea80deb81936e3bca6bec4e3f889e88781f0ccc69ed00006020302000203020311040c0402060306030c0203020202040c02020202020401010200040202045887028f8601e7c502bdaa20f69f40eb942ae6c10af1ce0019d8a5aeb1b4c19e9b9c9fb180d80ae70da3db15c8a607a5db0fd4db2a968c2ad5be4596ed0002df9fdb8bc98792f2bad4d0f9f8100e02020cd39efeec81ffbdd9fff5fc8bf7e1bf9ef00f0e020222a797cd82e4cfd6cba5dad7e189a2ed98a7861406020204b0c7e998d8ddb9f6d3a5a2869baee8eef8d2120502020eaa82c6c2829cb48ea9d7e2d6fbb4cfd2dc0e0202021383d39ab9b2998acfcee9a0dfecec8c86bbae1301020203cac8a2e9eb96fcb0d88ea5ecd9938590ced00f0102020285e9fda99fb0dcdab7b5d3f4e1bf8ea9efa40f00020215a9d8e187afce83df9585bfb48ee5acf8bc0600020201ac9aa49fc1b5ade38482f7b4f68585bbbff20f0e01021acca885f092ffc4cc9ed9ffcbf5ad84aac8961406010260bcfeb6a9b29dbab7cdfea5b58c97b386920e03010201d2f5c4db86d7b5ba92f39aafb495caa1880e0201021abaf491cd9cf79cb1fcf589b4f38c8184e28613, 0x1b2ffc1e8a9a3c6f8070702020fd38791f3c08eb4cadedaa5c29e8bc0b88ab1958bb1c01404020207f1b3f5d2fa98adc3f0ea9b80c0e780a398d286f1faf3e01304020270c095c8e39fb485bcb2c3cfa5fff4808ebad1b7a2ccf9f8130102020397b7eaf5e79887ece187f5ca8af0f9e191919eaac8a9e80f010202568ea080c69d9da9b2caa5b6f59fd6fb97edd7c3ecacad900101020202fb9bf68e9589e38b97bc8beaf5ce98f3e6d8b5aae1a9b00f00020202a398a885c7a1bc959ba8969bc2efd1c9f0a7e585f7b1f00f0e01025facfa8d8ead97dfe3d1e289aac3faa3a8eae2bfe7bfa6b81206010218ffcc94d9c9edebbffbd292e997bcbddea9e5899689b81404010204a8b8e881cf91d5cdd9a68dff9996acabc4a0abf592de801304010268d98bb5e1dfd488d3d590efd2d78aa9a98ea788a581d58c0e02010212b692f29591ccc1ffbebcab98a3dacbc3b9c9d2b393cbf80f01010258c6ddbfb0e6a3f083dfabbafd89bb8183c18696a2e38afc0401010210ccb78a96a9e1a1e790c9c2d895b1b5b5f6daa8c9e68dda0f00010201c9bef3c2d290ceb686efdfa5c2fff2828ad6889888abf00f0e00025cffbcbf9abefd9d8398c3afeee1afbee0dbc38dcecc81a41304000229fefea0a4cda183dcf8a58db3bcf6bdacebacea89c48bf80f0400025989fbdba5c0b1b58a87babba3f7f3c191b3fc92d6f9b5de0e02, 0x1fdfdf3fafa94e7caa0fa020201024ea1cda1e8919287e1c6f0a5d992e8f3defbc79fdec8e6f6edc6cf880f0101020288b0a9d3e4fc92b0e79fe096c1f5a9dcaba1e9aa88bcab86e19cb994010101021bf7f4ebb7e7ecc9dfdf93cddbcbcbe6ccb2fa80a0f3f5c7cefcca9e0100010202e1bf8a8ee6eed7f3a8dde6b2f38284ffbbdc9da7f7f98eb9b6d7880f0e000208c5f4adadbeb9d1f6dd97a9d5a5b78feba7a8fdeef9fb81f2d7e995d80404000204dcecb78a86d3b7ac868094a5d9e494ee96dae7bffe90e1a8cfe1c8e40602000223d982fa9dc4e4e2e8c9eec8bdbb9990f5a7a199afeffaaddebd89e0020200020cd6ecebe7dfa1c188aac8f9affbee8fbc96f3e1e09cedc2fa96f5880f01000202fdb493a6fdafbfb0f5acb881e2f6b3de92a7b28dd8e6f4a8b9d5e0e001010002179abcef96efcda09cb5b8bfb09baaedcf82ed8bbe9fcfabe191c3801903c1a39aeaafc7fa9d92beefe58ef8aa8af281c1d680000101100201020202041002000202020415ebf775cee618a6dc7889c90156c480fd998cdf80eaecb5ddac9e9d8ce1ac7dea01c9900281bf02d09a1bb8d33ac7b834f09515e1b20058ba9ffc93848b8cbdfdf0c7dbcab0f49a9e9804f5a30affe203bc880ad6ff06cef72adae424fcc44988af000380a985cbb08daeb2fdf68f81bac0b796a5a00f0e02026b9aabebc3c3c5c2a5f8e08cc7aabc8f, 0x101019493908bd4baf696efb3c5f18ecd8e9fc0e9cfee98609501dada0bdb018ea418f7a348cc9824f8e90adc8900079cdeb996ce8ef2d1ded9b2dfc784a9a3bfdfa1b2f6c388028ebd03bcd414dd04f4ef08becc15fa8235d2e4548bb10002ccbc8cc4e4c5c9f0b3c2b093c1adc1b7dbcfcac8eefd9c73e4990890bd54bde501d38afa52bde81991c03ebdec01aa8d93006f98f999b0d1d5bc87dfe9a9b5b5b1e8a7e6a991e8840f0e020209dd85f0eaa0bd94b29487f5a8f194e2d9e5f5a7fadcc08986aaaadec00f0d020207dbb0b6e4f1c6d0e1d982f09a8c97b7e1ffe5a2c7ec9d88ccd8b5980707020248d8bdd1e1e1a5dcc88ba9f492c4c0e2d9b3fb9eccddd9ebc3bec407040202778c98e1bb83d2c5bda2d8fc9dba9fcf8aedd8d6bcddc8daba89f00404020247968eb8c6dc8cddedffa69c9cf6bbf7e2c2f8a68cadd0e4e7ecb9c80f0202020188eb82b3fac290b4def883adc1a0c5ce85b5abcba689e48aafa8cac00f010202019cb2d58bc59fb79af7b8c8ebbcdda3c48f82bfe1c89d849593f795b00101020220f08381b3d085dfcd9dc7d0d9bffbf58bda96a8ebe2aef7f5ebb6dc0f0e01020991b18bb3def4c9d28397d3d3b5b4f3c6979ac1d0b8bdf7f4ead98dfc0f0d0102068595efeff6e38689feeefebba89cdbdeb1ced0f896b1b5c9a9edb00404010202c9b0edbae8ddc9e3c2b1dfa7d2dba6eafbf1, 0x1aa9ddd8196948eeaeaa9deeeacd2e0ebd00f0e01021e85b885818a958083f79194acb4c3bcc6d18ae8dbe5a994a59382e3d80e0301021882f4c5b0b290a3becef09b94b48ff59fd2e38f80aaa0aeb79ca8800e02010206bce1c1d382aeccbbc3c5c1cce0e2f7a3e186d390fe9a8ef8c59382d0120101024caee6a89be7feaad9a8c0d9f89affa7fae4fbece08ead85bfa1e3800e0101021c9bced3c9ffe583c984d0afc2de9f9a84fdf9dc9a8dd6f4cbb1a8c5b8010101020288b6aaafc0f082ebb6d4c98c81bad0fbe199c4bccaafc48df0dcd3b21313000204dcf7c8ddcec8a49adf998ad3fd8789ceebf0e5b4ad99818286f2c8f00f0e00022393b7fea3f8b48fb4bc9c80fcc9fefdc1ddb797d1db819a8df4b585900e02000206c4ba88a893d2fbc982d093e4c0bcc7839ec6a988bdd8c1efb790b8e00202000202dbabf4b0afdf8e81cfbea48de4f8abd7eaf6d6b4eda6a5b1a3c8bce00e01000217b597a681e6ccc59e95f1db90aefceebbfbd89eecb7adabb790baa9a0010100023e8ce78de6d99395effa97f7dacbb3968aecfbc7d7fd88c197a7bac0190dbdd0e7a8b8bdddebaedcaebf9f819e81bebbc2e0900001100e140d120707070e03140109000800030000000a1212140e140d120707070e0314010800030000000a1212140e140d120707070e0314010800030000000a0658f9891acdb14fa19101c2e7ce, 0x1030e010a010d00090000000a141414131212100e0e030e010a010d00090000000a141414131212100e0e030e010a010d00090000000a063090fb15a18d1ef6f764a982011dffa4bfc8cef5e8aebda598a493daef9dd0f0e6f5c4dc03a1880896be08a39b03f91defef33fc8c338fc31d83a8000fe9fc83a98bacc68f8987d29cabbcf3b796a3ca8beaa3f009a7ce03cfb50aa5d502879212d7c335a98c2cd89e4fa9e50007f5fa84d899fffcef83e8909ef3abe9fde0cff7daa1f18022d7f203b6ec2ae29b13e231d0a406fa900d95892bb5a90071909c9ccbc89ff6f99e85f0f18091a3ab99b19a8ad6801313020202d19cd68792a18694d8eafa98abab8bd8e8a78189a38ab19ff0bcffd0100e020210b79dc9c2dcfda5a4d8fea482f9f084db9bf8f2e89cb4c5b68d96800f0e02021a9fa88cf8aa82b2b6a9bce5dcd0b39c958bc6aca1e288ebbce0d5c1900e02020207fae4bbecf5b1f38791929ef6a48897f984eeb3fbe5c6acacefeb91e0120102027792f18f97f58de7d4c0efe18bbbcaa3b6a1cad2c9f9c4ffd4db8d800e010202228acda9afc7b6b9eb8fedfe92d5a69beaaee7cb80ce95c381b3c8f6e00101020204e3e3f6c6f9b4ccddf6f1d48ea8929fde8697bd9086af9499d4d7d9b00000020203c7f3c0e7939baab08ecafedfeb92c1e7daf0e9b0f7eca7eef2918013130102058cc3b2d7d184fbb1d89b84, 0x1100e100d0f0d12091207100710010800050000000a100e100d0f0d12091207100710010800050000000a100e100d0f0d12091207100710010800050000000a060f0d0f0a120710070807080408021001010000000a0f0d0f0a120710070807080408021001010000000a0f0d0f0a120710070807080408021001010000000a0601130405020202030c04040201060002040a0410020002020204100e0f0d1207100708050a0208021001070001000a100e0f0d1207100708050a0208021001070001000a100e0f0d1207100708050a0208021001070001000a06140403020202030c020b020502020a0408030c0203020202040c0403020102030404010c02090200020302040b0208020002030204141414131212100e0e] private def node1646:Certificate:=PackedParametricCertificateData.decode 10 data1646 private def node1647:Certificate:=.split node1597 node1646 private def node1648:Certificate:=.positive 1 [(1,1),(1,7)] node1647 private def node1649:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1648 private def node1650:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1649 private def node1651:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1650 private def data1678:List Nat:=[ 0x112120d0d12070e07090707070d0503030d0101010a141412120d0d0e07090707070d050303050101010a141412120d0d0e07090707070d050501010109000a060608040200080306030b06090203080004040c030802060202020312120d0d0e0709070707120307030303010109000a12120d0d0e0709070707140512030703010109000a12120d0d0e0709070707140512030703010109000a060608040200080306030b06090203080004040c031204000202060301100400020206030b0603020202030e0402020206030d1c0a1206120102041e030e0e0d0d12090a080e07090707071403080312000a0e0e0d0d12090a080e07090707071403080312000a0e0e0d0d12090a080e07090707071403080312000a060608040200080306030b06090203080004040c030f020802050203020404030d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e0314011200100009060608040200080306030b06090203080004040c031204000202060301100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e0301] private def node1678:Certificate:=PackedParametricCertificateData.decode 10 data1678 private def data1721:List Nat:=[ 0x1c8cefe1301020208b8f8dfc7898985e9f8d1ddf9d898addbc7d40101020206e18ddcf19df8ddf19fe0a4b193cbd4e48f8c0e0e010244b2b59fabc3d9a1c6cb88c48087fec3b4c6d20e070102039594e786d9e4e5adf381cbf2c2cdffbfc0b81202010205dfaeedfa94ce9380c08bc498979784dfac9e0e02010256f994d6d1c5dfed9388f5d1c6d6b2beb2d9d407020102679fe6f2c88df2cbc3c093f6ecc5acddcb8a020201022caac5abceb1fb9c8ac3ac86a3c2f0b6e6edbc13010102258b8dc882b090b2b8d087bb86f8e0a8e4c3840e0e00024194c6f6f180cce4c7eb9ece83c3839c96cfe60e06000210ddfe88cfb4df92f7919cd09feabbe1a8ede40e0200024ce6fca791acdbc4fcae8a90e294f1bfe08b94020200022a9b90e5ecf6ecbef1d589e8a6edb2fbb08db6130100023192b6ebe48489e58592ad938da7d3d4b8f9940101000278b1ede4a0f884b99da8c3efa58aa7c7f0b01921feaeaad2eda784d6daf086000606050400080306030f040202020203010f0601020202040c02010202020312120d0909090e0714050d0509030303120207020a12120d0909090e0714050d0509030303120207020a0d09090912070e0714050d0509030303070205000a060608040200080306030b06090203080004040c030f0202020202030f040a020502030204100400020206030101010912070405060016041604, 0x199bed2fcf9cacaa0e9d8bec7dbc6e8e98cc80e0600022b9ed3e5cea2bfa6ebb2ddfee5fb8ca8d4d5a3f8efb7d092ebd5ce80fffec9e983d9bcd79dc4acd2b2d0060600021a9deac282facdc685f48391af8ca3cda883d6a694c4bad7ddfbf7c3a2b6fa80f8a7aacc9dd1a7b194e0130100020e93be9ed3c6f4b5c0c0de96adcfddfdbac9aeffa9acfefc82f2e499a58093c2c2cbd489e3a880c2a1c8010100020e8bdcebfdc1db93d783e8d9b5e5e7e2cdf2a384f0f7f5aae38a86f69eaac9e0fde7c7c59d9cc5cfe6a8191bc4fd80b9b9ecabf088ecc6cafeb583c191cb83c9a5979ccbf2c7fab2f9ece9a3b1dc000606050400080306030f04020202020302a4e301f1a002b69f038ad019dc9543b7ba2bf4cf0299ac0030b8f2eb8bc0f8f781f1a0b29fd81fb9b5269c9e0c9fad0683e40da5ee0fae963893e654e7e90003e6f7ff9ca5b085a8f2abbeb3d0121202022c84dd9ab6a7f5d5dce9f7fbece1cd808b940e0e02023dc6e7bd9ce4ac8cd397db8cc1ba94d4a5a9a20e07020207e4af9de3b1d0f7c8c89fffd1fdb5dbe4c2a81103020203e2aceeaef2cca2f4f8d8d8d8e1c7ccd3c9f8120202020dca87d0ce9a9af1e2b3b5d6979abed28ddad40e02020257f9effbd4ada6e9ecadbbb7f1f2cef5ed91b00702020225b5dde3e1f493d5d9e8f9fdb5b6b3d1dadc02020202269fbbe7d59cb5cf9882d5c6a8adeb8a, 0x1d1a5a9bfe484d0cab491d682b7fbc7d2d7b8e6d0b0a9fe9da59bb4130102020daecf9e95d1ed99a789afa3d5c48acfac88afaabbe3b3daa895d8ffd2e8f297f0e1b184c3ac9abbb1c4010102020684faa3f498edacf1ef8a95cdf5d4d5b5b2b5f8a5e3e094cc9192e5f4a7f8e9c2b7e992c7e5d8a3dadc0600020202e9cedcf6c1f4f7b2f88cb7ad96c5efcdb1d2bfaacbdedc8096f5868afbb796c48aba98e2e5e59da3e4100601020484d79bffa9aabd92b797e4d0b8faab9e9a92ef98acaefe8fe1868ae1cf938ebdde9fb598edc1d7f7f00e06010231a0c3c186fbf6a5c8a9c2d2abaad0a5e1f4c48db591d7f7b8d0c3ee9680cbb1988fe0c0b3a8b2ed9cb01401010204a2e9a0d6fed59da0bd85c4f6cec99ae5d2c5cdd8eeccd8b6accc9daca5cf8d87a4c3dd92b3b2b1ba130101020e99e4ef9ce0e89ef0b1ef9bbccaa1988febeeada9d5a5b0c9eefff3ccd4c3d5e8aebaf8fdb6c9b3f6a6010101020ba8e1c69fa6f59892d0e7b7f2cce4aeaf9fc5a9dce59186fdddf4c6c4888ee083b1e7e5c4e387b790c00e0001020a91e5e69ee0ffacced9d38e848698eaa5e99da1d7c0eef5ace4c9dda68fd2c9d399abd1ba9fffb1d8060001020b81d0f6ccb7c6cea5b4c58683cfa4ccc5a7c0acb5a581f183ebabd5cfef84e6d8cfebf49f8dd5c6d40f0600020da9a0ae8f88eece99a190acab89b4cec3acd1b3e9b6d0d0, 0x18db64af7d201b28cab0101f2a797a79cc6c7b1f4fcf3e0968eb0affba9949ac381f18e9b9792f5a2b5818d86bbd49801c3c304d0cc01e8b50e8b0cb1f13c84b838f2fb09a0b60046bfdfecb990da8bb988d9acf0a2e592aa9eb9a3c3a7e68f9acfccedceeba9aab4c5e0cac00280a61fdff90cfdd215ee9a47b98123b2aa1ff2f20493e60005d5d3d1ac97e7cf9decfbe5898bef8db7bbfeedc3f186e9b5a8c6a58785e4aac48eefb7f802ce97579be117f585718d96098fa814919609a89113f8ab0002ad92889eb9e2c2a7f2afa3ed98ed80cfa4c8a9f0d1a383b2b9d6f3b3e5cbd0c6d789d7ec0cc3a665bd9035b0a201a5afef27cacb5ba1b53ba9b101be95b40031adb4c2f3e1aae484efbeacdda3affcbdcafce0ced7e6c4a8bcbba8aeade3e4d9879894019fced62382d31995e968d3b15993df08c1c001b7e64f9aba0002a4cdfed2cceacb85e7feebd5f0edfea2b497cfead5c5ecbd8691dcb2acaeaf8cd7d0c41212020214b5fdcdbf849496acc684ed85bbc2cfc394ebe08385c2a6babfb48e83b3b8bfc3bfdfb0d5d3eaf2e4120e02023b96b98fcdbdf7d8af8886fc8a92e58bad97fbdbedeccb97f9eee7d7b6c2f8b2ead6efa5ad9ec2e6941006020205c4e19bd0cb96bdd7dfd68c96cae4eec3fafab796a4dc8caeae86dabcd4d2d488a0b1b0d8a2edc793980e0602023381f9e796abc898efcbc1b581c0cb, 0x1eca3bc8bbc0e0e01020ba7fbec90bceb8ff5c8e685c2b39bd5819cf386e9f793b597e994948beea3abb696c014040102129891f4dea1c6facfe4a29e8acbb6acd3b6e5bd8a88d0ec86cbc6a6bae78ca693f0c41304010222f48fedf58ca4b3e699fbbe94c7f9f0e0eaa3b1a3f6d5f3d495d8b78be49ed3a6acd01301010226f3cde1cbb6feb5cadcaecfa7bfe291bb8caeb8d4dc80ceaaa1e294b9d48cd983e4a80101010219f1b0f281b3c5e8feb7fbc2ef9ac1aaa0f8a2f5c5dc8ac4cbf1d4c5888f8baa98cdf80e0001026ed0bcf6b1a8e089f2efc7a3f3dcd589a0affde08899caee8298caedf0c0ae9593f0130f000206b7cbbac9f094888df6d1f2f8dbdec8dae5ba87a9bfadc8acf6c7e4b5fbd4a6aacca40e0e00020adcbc80acdd98dadaf6f8ffe58dfb89b8c6d2a9e293f8ebffa6faf39e88c2c5d5c5b01304000257919dfcdfddd1c2d9dcd88c9dc1b8b5b8c5ecf8afb5e2f3a2e8e890d3abd19bb6c7ae130100022eac95828789fbe1a2beb281cddbeadfe38fc4e3abade8f28b988fe187e7d8fdb3fbe20101000219e6baea97a697bbe481bdcaa3b6b0a582f0c8e88698ffccf4f3def5a392ccbafd98f819018796ddc4b1f8f1f4f5f9ccda87adc6b99c98cd9fdca1d9e0ecddcfc0000602030200020302030f04020202020310040b0203060306040c020202020204010c0608060204000a040e040787a460, 0x19aad01f4e40a83bf10d7de3bfee124d2d2328ff81ae3e70026a9f2a7c6c0b393cadefcb8b8cd958f84a89bf19bcbfee9a09db3daa6c41cd49536edc364c4a012f08f27b5ae34d8bc279a8734f3e10004abdea3d6a1ffb4b4a7e9a4e3cfd6c2eddbbae3bcb7e6d18282f6e2b49816d2fb0184bdc64895cc01b498cf0bc1ff5580c735c6d30196899c0003bd98b4ee93a3b799c1ed819b84e6a2e5e3b38896a5dfc694ce9cac81c81212020242baa09f8da8d1b7fde08e8df4a9b3d285f7cd9a81c6b5a9db8ef58fee9b8ce986d00e0b020201b2b592c6f4a8e3e19ee7b0d4acd1c4b9e6eed38fedab96b0d3acf9838ddeda9da3b0060602020cdefeefe1a8efdf8a8cbaa58bae99fe92c183fb9fe591a3f2f9c4e4f3b99bf7a9b5c00605020201bbf1d3fba2cbcfa4ffe4bec9b4e9baa6f598bbcdaabcc3c9d0f28e98ba9ef7f4c5b014040202268a9cf3e8b5ccd7a08bea99a7fbafa5fbbaa580a2caf5e5b3908f8abb8c92ae84e4900f04020222d9eab5a48df6beced880e4e197e68cf4be94e9c5abaee7fefd948d9e89e9b382c5a0040402026c85bbc8bbbfd3af8a8ec2e2c0b3aceac8b78cecabdc99abfb85c8caa5b6bdfd9ed5f81301020207f9eeb0c7aecba68ac8e9ef9ce598beb7b78ffc8695c59ef0e08bc4d7e2e9dbddbff0010102021ff4f3b889a6effec8e68ea1b080efabebb8d7e9a3db89e4d7f09cf5e3cd, 0x19882a8878ce8ada2ff988ccbeab286ae99cecadec2a0130101025cab92889ffcb1faecb0e880a8a2f5eebea098bf96dac4e9d4d3f1d69afff2d9c0b480f6f9bdc9bda5f3b0010101020685fda79795e7e293defdd68587bba1b9bbd1c5a9a5e7bdf49ce7a7b6d0d79be580f3b095b4ccebe987dbc60e0e000201aca2d2f3cc8ceae3f4edf0ecf9ffa4bfe7a2d58584b486b3b8f5d9d2e5ece3f6f89db0afda8af393fec2c00404000201fdebccdcd4a29b80dff4e0c2ea9dfbe2979999d9ebcc91ae9cf2bed981c3c8c58eadd9d0c7dbcaad8ec0e00f0100027afccb81c3e8f3bef6e7aff792b5cefbe183ec98f0dbd688bffb9cf1df8f88d6d3c0edf3af88e6abf0e3c00e01000201f09085c094e8bff7809887b8b4a6a6e595def3998b90a3939583adf8f6bf9caae0e7ffefb7a3fa90e79cc00101000206e6a385abecf69ae9889fcfecd4a5f5ab8087dbf5abae9a90b1e9dec5f3cdfca2e1d3f58cbfe9deb7c1faa01902e0b6f3ec8feec083e9b5c9cab2debcc29db387bbc8a3e6aeeaf691dfdcb4829186e2de8000010110040b0203060306041002000202020406bbe5378ed619b4f64a87e5012387c9bd80ffa7eca0e0d6e38ccc87fbb6e7f7d1aaacf2a9db94c6e692c0019f9601a9b801b88d53ee0acea93aa28e3ce3d10d8fee000397a1f2c0ffe0b6aded94f19d81b98685b0ecdafbaef0c6c486e4c2f98bd005, 0x189aba79da5f792b58af0fa9fe7a4c1f480040402021086bfc487e0fb83969bc38fb5e9d2d1d284b19f8bee82e0eee5e68f80f4a4e7cc9eb98dbe8d86a7dc82c0060202021cfccadaa9d083d5a1f1a182df88d2a9e5a994ca91b1d48a95a7d28ef1f2ddb68a87cd8081e1b0ddc6d48014010202018585aa9a83e6f0ff89b68c85b3d1b5c0948aa0e0b6d292e49f84a996ed8f88fc9bddef8d8e84a782b2801301020240cdfaf098b2cadcd29edcc988e4f5b9f098a0fefae0f3cbdefaeeb8d0d0f1aa8682f3ee89b5f0bca6c4800e0102020ae9d18be1e392fc91c3f48feedce2da8af5d8aeec98c0b8b293b7e1d4e2d4e1e881ae8bbb82e6fe9ca2800101020206dba69ceca9e9f197afc8c19dd2cce39fb39ed1d9d8e3aadfdde4c8e0b8bfc6e0ad99f4c4fab1fabdb0d780000002024aeb83f19f8bbe90bcc6d9ddbcef8c90c4dfce8ff09cdc9ff1e8fdb08dead5f8b59aeab38fe7f6e7f9800e0e0102488cc2b1b5bf8dc18ce2f7aaacd3ece18f8582b099b593c796b3e0d2e1bdf1e196f3dcecc2c3cad4c5b9a00606010201fe819feed9a4c382a7feb3d9f2f1d6fcc788a5b9c6fee6f48c90f5d8d5a29bf0a8c5a9a7e4c5eaf5d8f00904010203a2dc949b9f9aa5b1fab0afe5ada9cfafcac1e6e8aaa4e9d1f196fdfab2a281c980c9fda1b5b8fdd089e01401010203f3958bf9f3b891baafca90869beb94e7e8c7e293, 0x1a1c89586aeaab0aab7e8b4bc86b01908bd9fb0a1a7e8e2caea87cdd79bb2e699efa09afdb9bab9a9ecdcb00001141412120d0d0b0b07070d0109000800030000000a141412120d0d0b0b07070d0109000800030000000a141412120d0d0b0b07070d0109000800030000000a0616dae834f19914a8d332bf8601028493a4aebde2f0f8d5cc82f2a6edf2dcd891df84e49987d1ebc082e69e8283de84c0f4ca97b46d8ef31d84c12eb1bd01b8c4f40101a3eff8d788c189d8d9d6edb6aae1fcfe89c0e1f095a6938ec286a3aeebb2aa8881b2b782e067d402e4f301cfa203afe012d6e933d3a44082df1f86a60004cfb78dd78cd8ce8ada86bfd2c3dabfc6d58686f4e1c3b9a3b5e2bccfdec7f7a2e0d48de5948008c3fb3ac40dd9b605e8cf17d0a93898fe1c85b83cce8b0001cedffca6cdc8b0c5abd1b38481d3f9cdbb87c8ecbbb892e2aff3bbb6a0f8929bd4eaa7abf18035a4ad018affb624e0f27abed1268ac64ea6db29a7a551c3bc001b85e2be85e9d89cb8b6d4b2a6aafe9be7ea99b39da7dcc3e58ab1afe0f2f3dfc3aaddc2e1c014c9a851eb946d83d30aa0de34a7bd2cbe9d47efaa18f6b20015bada8480f7a3af8197b8e5a8b1dbd8e09cd2c7b292adb7aba1d39eb6f0dbb9f78ef1e0c38031c083039bf1699d902f81931ca59911859128f0f7569ba400109bf8a387cde48dc6b3bc9ccc9a8c96e7be9ec2e7, 0x1ed80ba8becd2a4b6b693eacbbac3c3c881ecceebbb91cc978fa8a5801313010236feadcbdf9583daebc6e1cafd94f7aae382a8c5c0cbb690a8d88ef18ef0cb82ebce0e0e010211e3cee1d2d7f6dccde7fe8efbfaf1b7ace6e6878de1a08eadbfcc96be96e6f2e7920606010201b291efabcce3cda6c9fad599c293afddead9e98bf0c3abaedecdcfb1a4bda3a0a5861103010221fbededecdafaa69784c1b2f2b0ecc7f2a2b4ff8e86c28a98d9d0e3eac2f8fbe98011020102019ed2b7d3e6cce3a692c6ef9cbdb4d4f398ccefc98899de94e698f4daf1abaa8ef9ec1201010203938f988e88e880c3c3c6b8be89ab85ead7cc82eea6e1f5e0a7ddb0d081cffaf9800101010210cdc6a2fafde5c0ad8ad4dcdefaf2b7dbc7afe8c6b7a9d3bbc3d28ad8abc8dc87ea0e0001020283f186db86ed94e6e49e8aa7dd97f1e4a6d58bd5ad96eeea90c6dea5b4d2a3a2801313000240fb9ec6ce96f693e1cadfd49bb2d5b7e19c80b0acc1a7f38ce3babeb8fff1bb98e0131100023881c6a5a6a7ebb0b8e9e7ffefc19d85dd9eb683dade8dbdf8d1b1849ab088f5cc800606000201eee880f2949bd287d0d0e88c8993d5d091f3c0f8918acafaa2d1f8ef8780d1dec8a01102000201bca790b3d5e08dd7ecaacfeabdf8b7efb489c8cbd48af8b6e1a6d2dbf7d8adb7d0a00101000219f4929adfdacde1ef99b391f8f8fcbbb6f8dbde, 0x10b070711030b00090000000a0635dec245f0b954b8bd64cab6010290f886d1a3abb8cfc8a1a1d2b1d58dafb5d486b5d0c6fde3fdab9adc800192e870aa0287fd03bc8c159fc32dc8b83ec19d2698aa000ccd8eafccb9a0a5cae1b9f4819bd783a89fd4d5dcc2ba8494f8decff99007e2fb05d8b00d80d60ad4eb1df59d36d7d819f5a032d7d90004bd90878b88cad6b6cc8f8f86dac9bbafcadab1c685dacbd5a4bfcc9c804491cc57f1dd6ba7857eddec2ba4e53798e84de7a859dba90001a8bfdaeedad7a0949baec6edd7a4f7beacdff1eae18be993bad9d790801bd183159bf625bbf016ae81328ff521dfd103ee925081b60005c2dce0bbcfe49adf8de5d093a6e681c9b1bae492d0cafcd7dcb7d2801313020219a9dcd69588b58ad4c9ea9cd5d398dad18ad6b092b4b792e8c193b0a0f7bcf589f012120202018fc69988918ef185e88492aad4c292bfa1dd96a6cdefdec8e6fdd9f4aa93f6f6800e0e020215e3eac8e8b0bea6dc9a8190bfd0cf95b8c5e7fcf4809393b0c6a0d19fc1b39884f01103020218adb5f8b0aab9f9fc87a3f5eebaf1d3cfa4d6a1db988dcb9786a6d0e7a6f99cf4801102020201e8fee7f4adc6b2e89f90eab3c4ddd485b8fca0e9f3e9c88be6c1eec2db9189aec8800101020215f4bd87e8ccd3f1c4c4bec2ccfeb1f8dec6aa87bc92e0e4cc8ccdd690ccb3d483d00000020236b9f0b99b, 0x114140d0d0b0a14071007080714010d01050000000a14140d0d0b0a14071007080714010d01050000000a14140d0d0b0a14071007080714010d01050000000a0611040d040606030204130405020202030b040406010a0006041604100200020202040d020902020201020404040c0608060204000a040e040b0607060104000e04120414130e0e110d0d0d0b0b070711030b00090000000a14130e0e110d0d0d0b0b070711030b00090000000a14130e0e110d0d0d0b] private def node1721:Certificate:=PackedParametricCertificateData.decode 10 data1721 private def node1722:Certificate:=.split node1678 node1721 private def node1723:Certificate:=.positive 1 [(1,1),(1,7)] node1722 private def node1724:Certificate:=.positive 1 [(3,5),(1,6)] node1723 private def node1725:Certificate:=.positive 2 [(1,0),(3,4),(1,5)] node1724 private def node1726:Certificate:=.positive 3 [(5,3),(1,6),(4,8)] node1725 private def node1727:Certificate:=.split node1651 node1726 private def node1728:Certificate:=.split node1570 node1727 private def node1729:Certificate:=.split node1463 node1728 private def data1764:List Nat:=[ 0x10e07090714030d0101010a14141212140d0d0d12070e07090714030d0101010a14141212140d0d0d0e0709070d0314010d0101010a0608040616001c03120301080206020202030f06010202020408020602040403040312120d0d12070e07090707070d0503030d0101010a141412120d0d0e07090707070d050303050101010a141412120d0d0e07090707070d050501010109000a060608040200080306030b06090203080004040c030802060202020312120d0d0e0709070707120307030303010109000a12120d0d0e0709070707140512030703010109000a12120d0d0e0709070707140512030703010109000a060608040200080306030b06090203080004040c03120400020206030110040002020603010e0402020206030d1c0a1206120102041e030e0e0d0d12090a080e07090707071403080312000a0e0e0d0d12090a080e07090707071403080312000a0e0e0d0d12090a080e07090707071403080312000a060608040200080306030b06090203080004040c030f020802050203020404030d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e0314011200100009060608040200080306030b06090203080004040c031204000202060301100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e0301, 0x1141412120a0a09070d03080207020e00070001000a141412120a0a09070d03080207020e00070001000a141412120b0a0a0a09070d03080207020e0001000a061404030202020314141212140d0d0d1207] private def node1764:Certificate:=PackedParametricCertificateData.decode 10 data1764 private def data1794:List Nat:=[ 0x1db88eb8ed8d5e5d0959dd4effd96b895ac9bd1a7c8bceea0b999f00d01010202e5acebc6ceb3f5e9d4d58dbfe3cf98dea7a0d781cce2f6b6fbdcaacdc6e28589e3d982090101020181f6e181ecfcd39599c187b2e3abd3f1cd87b9abc298ca94fcf2c4acc98bf0c99fa5e00101010225f6f18a84a7f8e58cb68bd5d6fe95fcebe7e2ecc78cd2e48bd980e8948b88ce9efef29a0e0e00020391eca9cab5f5a5ddb7dae0a384e6dce3bcc28a90b4b3cdf1cca9b0e1cacbe8d68eb7aa0e06000267dda2a9b4aee2ebc6c1fde5c594c0ada2a2c4cae8ec90f7eb909390b9e78bd4b6de81d8130100020298d2b492eec7d4b98fdfdae9ade8b8e6cbc8968193edfdf3f986d8c8ceec99bdb9b3d80101000225c5b494ccd6b7848e98acb197bc98b2ce87b5df8eb88583a3f9b9f2d9f3d6d0b49092a6191cedd2f08394d49fa4a5cd9fa9c185adc5ebaa8a83bee9cffe96a5c5d200060605040008030603010e0e09090e0613030e02070202020601020101000a0e0e0e0613030e0207020202060102010100090e0e0e060e02020206010201060614040302020203110e0e0e09091107120211020e020202130109010a1313110e0e0e110712020e02020213010901091313110e0e0e0e0202021301060606060504000803060301010f060102020204010b060302020204010d040a02090206020404030912070405060016041604, 0x1d9ed94bfa5f7a6b880ab8e8eb69afff9bf92ab81a81212020208e08df9ea88aa9b96b2a1bea1a0d7e39ad9afbfca97bdfa95c4aab4d7d3ea82d2aae20e0e0202048086e9afcedeeaed9385c6a6b9bb928cdfe9a58fc486faa1b38f88ee8ca6c5bdd5fde2090902020da784c6c3b694f582d2ecd49d9dc1a3aecadfb5f9dca6c484ffb386eb89eefbca9188110702021cf0c79ce28991d7ecb0fe899bcbaa80e5d2e59ae5b3fdd1dcafefe18ff297ce97a4f3d00e0602024582f184b2e099d4cbcaadb9fad9a59da1c1c786ac88fdd9bec08ff0d591b4c3f4d0f7f80606020202b0a4e3d7b0ece2c786caa0f38398a3eed5d9fa8495d393bbcc9cb685b9a1fdbcdfd29e1401020202d3aa97f4d6dd91b0c9fd91ccaedeaacbc5b6fadd9a9dcac0cbdd83fdb89d95b093e0bc0d01020206ace082aac0b0f9fcc09ecef6f698c093f0abd1ab9e9fa7c3cec7d9919fe59acbc6aff4010102021ae89cf0f1c1f28cc2d78bc8eadb99d0f5eff0acadd2c589e783cdfc8b99908580bdfda8110701020bb4a48fe59a84efc7a1efeb92ced8cfcbf0f296e8db90dcbbcba2d5d4a4aeaac29e8ac00e06010261f5e5a2f4d5d4a4ef99e49d9a9dfe83828797c69feab3989dc5f6baa787a8b881d9daa606060102188bb3c8a3b0ceeae4cbd68dd1a1bca49aaa9a94c6d3e3de95f7bbbc92b8f2e9889cb5a80202010203a18ee5f28e8ddaaa, 0x18dd4bddbf2d7f783e8dc8bb2daa595ca900202010202a9d8eea4efdd89e1d4e08fd49ec4cfe1b80601010206f8ee8fc9bdef8eb2c283e2eff0c9eec2c60401010217f9bebffba4c09fddfbeaaadccf80c785f80100010223edaa95c9bda693c3b6d2d7ebdb9bbeee0e06000238ce9a8ab9bacfc1b295bde5da9ad4fd91f8060600020480a2bcf9e1e2e8c8d1c08e84f482ebcefa0e04000227e9c286cbdac7d8d5cfd6ead5a7d299b58802020002028e86f4af85c7f1fbb19c948eb29cd1d198060100020d91a9d1bb82b6eff4e3b8a3c393f3f3ccf00401000212eda5ffe3f5d0fbeca18ae8cddcf9df9bd61914cb909a86c1a8f3c299f400140403020202033d9801fe9704c203ceca1c82cd408ed232ad9d0ea19a002ba2ebebb6af9bf2f5ec9b9985b9f6dce1cfbabcf2cbd496e4a4ef95d5c0b404b1cf5bc59257dcad03efaa2689bb1ea38f52dccc0eafff004982de88a9e1efc5c8b2a9ecf6b8afe0afe883e984c5a3d3ecafbbb3a9d405a1bf2cbf896fdbf83ac2972789f124dca014c88316f5d6000397ad8bf1d3b3e0c7ac9cb7e09deff29696d894c581b7b8ec818bc0d0e0cc01d1a24cffe71de9956bd78021dbf515aeaa1cc9d0109c83006485c1ecd7dec8c1c1c1eccbf2a5f3c6c78680d4bcd9d0ca979eb0abb5f208bfeb5fe6f142f0db01a984b22490e059da8a41a1aa01bf8c9300309bc5bb8da7b3d68f, 0x1a3d0bdd682ffeed7a7cbc9e8c9c00e06000201c5c9eb8cf1b7d3f5d9a389d1808cbaa49ffda9b6b38cb4dfdcdc85b680060600020289d8f8a2b2d096eedce7ffdaabc0bdc898e5c4f0ae9ff988d5f697de800101000208db8dbbd6e0dffc9094fee5e1839bfdb9bdf487f0a69badf3a68194a81901f7dfe69be4c3c6fad2e09cd6e6cfe9e598c9c5d7fcc0000c020a02050c0304030f040202020204100201020202041002000202020413f0038c9001f9b901b9c823c4dd3babfa2dfbdd1694c20016bedde4f5e8dac8e78c9bb6800492d734dfe045d3a471a1af3c8abf3bc7cd17a7e1018ef9f00021beaccfa2a2f783cd9cf8da0b0b02020fe5e9d29a91b9fbea9ac8abc6cfe78ea60e0602023beacaddd7fae3c3d4fcd5eaf8fbf5d3e2b80e0402021aadd484aa88a4cca4b098989088cdb380ea07040202099db7ebce89d2e0f8f3a0b4f582e593dab41302020202fc84cfafaa90a5e398b480fb9e85c4fdf60d0202020ffe90e399cac5f8c9b4958ba68ab6d6dc06010202048fafad87dfa4c8e59de5f9b5cba98ab9c20401020212b4e2f9c5c1dec28399d8cad8d4b2849d9e0100020203e096d8d687e7f3b8908aec9f9cbaf7a0d80e06010239a08babe1c1d19ca7e0b4cf9198c09784f00706010202d1cba0c38deaf4b5ce83e2d0cde69ea8de060601020589e9e591dab2b386d981d0e6fdd8aa91fe0e04010222, 0x102029187f9d8a8e38aceb09bbdeaa193f3879ed4abaed4b38d84e3cce6b9c00706020212b9c9ec91c0bb9cbaa2b6db8d919fef81bc8f8ec9fb9fc3a2ec8abfee0606020207ea92a9d2fa8bc9e4b3a8f487b9ff8be0ccd493e290cca7ffe3dfc2f7a40a04020205efa4abdfcba2de8bc0f8bbc2c2a8aed1dafbe882fda1aaf99fb592a80d02020202a59cfdbed5d681a1f2a883f2fc88a9bfa5d6a5c7f283d5b19cb19380020202020e87dfe8fbf7d899a1c0fceee0a1eff3fc8ee99c83f5bde5bbd381bfec0101020207c3b1fb9f84e2888aea9ef7deeed7c5b29d959495cecfcd9bfea7c4e406000202599ca08efe96a6e0e5c3c3f2a5c7ababb0aed78feb89ecb6d6a1c2d9b21313010209dbb9b9cce9fdd6b9acc1e1b6c0e4e9d0f780b3d9e5929287dca4c5900e06010201d4a3abc8acadf0d8d3cea890eedfdfaa92cfafadc3c6b582a79194f5b0070601022ad1bbf2b399e9e88ed2a4f4cadfb2b2aba8b1e4a281dbd5f4d1c0f8d60d0201023be9f3b986a0b9faf7b2ed84d7c5fd84ea93a5b1e9a1bbeda6afbcc01201010234e899d48bf8e898839bc4989bbfd9a9be8bfec8c6c5d8aad2f1bd880101010207f9cc81f78bb4ad918bdfecd7e2b0bbb5c1e1da83c4dff79fd5e8f2a00600010203c780b1eab689c4ff9aabc88ce2aae6f793e3ba9d919fdfcce097daea131300020bdcc3eda3a3e6d082d585d6bfab95, 0x18789aabdd4aec9eac4f5ac9fdea0d6f8c28fe0e99ce58ef6e2d5dfb0d7f0010101020ed1e28993f2bea99adc988ecc98d0abdcc5feb0a8e592a9bcfafea4feb6f1b5d0d9b59c98f290b0e7daa9829fbffdf81313000220bb8c81db859dd1f5ed8cb1def6c1cdad81a58caccdabfcc2dbf1c99dbec78ffc8fbd91cde1c5d39988838ed18aa01111000202a2dbf4e7bda4e487add088ede391ada295c1d5c897beeff582efaae8e4b08f87cd80c299fe829894969ca8b1f8dcc019448cc5f4b4e0b6a8b3c1a3aad4a4a9b8b6b9d8caf6cdf3978f9dbdcbaacbf2c1bcd1dde6f8ac8be7a7a000010f04020202020410040b020306030604100200020202040c0201020202040c0608060204000a040e0401b2a408d19179e0eb0180ffda013386aa98f5c0b6d5ebbcaed6a7f097f8a18de1c9938ffce03ad28410f5d443d94b83fd0101d7a88ac3f8cba7f78fa09ba7d1acbb9fa78cdfb4bdaae80fe90198a006f8ae05bf972098e73c8fa235c7b319d0fa0002a1c49cafcfdcf494d78581def3fbccc9ded2eda4a8baee8801858401ef891b8cd31dd3ee17a1db2cec9244ada859f7dd006f81bab0a4a49ae2b6d5fee5c29eb1fba7aebbeac2ff9f90131302020aa8d8b0aaf3eaf79dc7c982d7dab1b3eecdd0bcdac2ecdea1e59ad5e40b0b020201bc87879691b2dbc2fbf8bbf0fd84c5868d8cd6c6b0bc8a9592a8a5a80e0602, 0x1a2f5fbf7bafbb8d4bdd995b1dfa69ff68b88c7b594cbed9db79e060302021bf8da8db1c599fbba9ddae3a388bdf68d8a9b8bad959dc5e6b6e7d6f5dbd48489ed84b8abffabffabfbc0d2deecec04020202029e95f988e5f1a89afc8afdcb98c59dfabfe18ce8f68d968aa0a6c4fb919f8285faafbba8b6a2aee5a3d0fc8da6d5ca020202020985fb9eb299f7bfc8ab83a3bdd7ab86daf4b0acd9d9aa87fe95a0dfefeff8dda8f3d4b8a3b2b7ed8ff5fb87fcd69eb00301020252a2e8da87d2aac599f389d398bccd87f8dbddf1d3c6b2e5dda28eef869dfbfea895daf4b99697b29093fae2d3a586010102023bc598a2f99db1b0d9e8b38ff9819d83fcd9e0c9cfb1beb7f1fcdaf8dc81e388f69594e5b4c4baba86e7fdd7d68aee1313010273e2cab794e3d5d6a9fbb8b3e6ebe3929490fe8dc8b788a582f9d0c783ace28de2f0b2e9f594e7bac382a5afa1dcf4e8130d01020dfb99eb9698d9d684a298b6dbdc83eec0aab0df82968fcffdcca593f1fda19f86b79deba3f9d4fca3d8bcb9b0f3f00d0601021b9cf1b4bffddd83da92b9e7d182df80c4c2d2b299bbb9ce98cdbb8899d4ecfe99a9d1a2cda0d6e3a0c3c5c2e19fe0060601020588cbb0c5908596a184b2869b95e0f4cf8097c3f1d0f3f297b8c482e4d087e9b29ae7afe8c5f3fabb91dcb4cdb6cb9d8811010102319fe0c78bda80e2f38bffd7b282fec7b89b, 0x1c69339b39c20d1ba37bec100289297daabefc99de1898cf1baee8ca3ce8ff9e9ebabc0f6efab83ffefe9e39ea9bdf5c5aabbbb9fa1e0e5c03eb1915ad8ee6cb8ca018885a723e3a234d1e94cc8bb5db7840005f88ff7979ac582ba91a8a8b2a0adaeb8a0b69d92b4e0efe7d6e9c9c0b79ddca3a182ea968d87fa80fde1902fc7b379b9da6db1d925aefc1485943da3c73ddf8c14c0d7000493d8dcffcbda80a6a5cba58b8cade6bdd3f5ced0aa9492d4cccda6da8eeda6ffd3d5e3ea9499f8b4f0b8f811a2df0bfe8c37c0800fabf9329fd31abf9f02e08f4fbf84001dcbc1c989e39491d0c680ab97bfd5e1e5d1a6ebe8c3d2a5b98aefa2bcf980a0a6c69cd7fb99dd92b7cbc00196b5ca4684f6079b8401a585a359ea852eaadb0bdca50193f1880020b0febc95dd85bfe7fda0dec3e0aae4caa6f4a4edd9ff958291e6cdd4a1ebc3a6c68e90a5b2efb8b6c00b0b020242f88ad3cfc5bed1ddd09585879fecf4e5e0a7ae94dae2a1c0e9faca8aa8a883ca8784d4a9c4d089b8cecdcdceae9009060202599fbdcae1ffe0c785b3a8e2b1d38382a0bba397d8a1ca8480e884d1cec6dccfefe3eabc91adc29fcfcba2cea4f4f00604020260e0aaa4899ddba9cfddddaabee4a683e093ffdb8ca5fcd2abae9ec59d95c2d4c0cea2da82e2a489b3bdcec3f7fab80504020201d1baf18e9784ca84e2b0e9d3e3e59dd9d2acd3cbef, 0x1e3a484888bb8e2b8e4b01413000201fdacc08abda1b6f4ddc7ac9bd9d6c8aae8a7a885ef88cad01212000201c487aaf99af2e0b0f3d385e1aaab82a287a7e0bce997f6f80d0d000276e0b3eb8ec2e5ad93ddcb91b8e5f4e8d6a39bda8ea9b486120b000201ffe082cc9afac9f8a09e8f97acf0a8b9d6b4badd9af892d80b0b000212f7aecee2f5dbe4b6818fcf8fe2ce8482ddbbc2e08d92e0c20b0a00020ba38cdaf587f6d7c1cf8ed2bcb7b995b690ea989ddea9e1c80b00000240a89296fdf0d1d0ada49bf6a087a6bbf2f3e5c8a08fc686a00a0000020bead8a5819383a0bdc48ffe8ad3abe6c5a9e5f7f2d6c299e00900000208c3e0c3d6dea5f592fae1bf86ffc1cdf1d0b2dbeec5a8ff80000000024298bd97b9ddf88280d495b69999c5a78295b8a78fa79de5c01e499380a5d7d1a4cf90fdebc3ad9c9eaaa4b00038e5b660edfb2ff2e157fba80109bf80f4c3acafd7a0b7d7f8d49ffb8eeca1b9918bc1da82a6ec96bbc1b7b9c0ceedb8afdef0edc68b9cf6900ab48a30fa996fabac48e59b0107c3b5b78cc6f198e891a1efff8eb8e2bbc184dba980bfa486abc4a3cad5bca5838affceb8c9e0d29b91b68001f0ae17bf02b1e70480d014d5d92caada3f9eeb27c9ec0064aac2b1dd96e199f9aad39cc6c7a2f1dde5b08fe9f3d9b8ccd7a5d680a8f9efe8e9f39acec2e0a897dc82f003c6cd03bee645b209f922, 0x1a6b232c2e702cc9136edd70024f2bbbebca7a59fa39b8f9a8af8d987b88ca01313020205f995a89ab0ca8fd0bc8dc6fa98c287a8b8a89a8ac9b2a0c01212020268f48eefeeeac0ab90f6ae8ef6ebf7e1e4edf28699d68790120b020207a5e6bbdf999795a7beebb1d8b0de8efcb0cdf4b18abfddc00b0b02021ffbee8b84dd83c2febadfc49ac9d9f5ea9bb78eb2d291ddc0120002025e91abda8bb6dcc0e4c4d296dca0f7c080d293ceaa8f93c00b000202478d8fe5ea9482d9c2f2d6a6a2d99ca5b0bab4ba9ab3e681800a0002020787aba1da8ecde0ccd19cd08af093dab3b9d6d7838cc186e0000002023ec48e9cedce9cc9d1e3f8fe94fea48df6afa0a6e0e8c0d8b01313010201e994939884cfa5e9a1a280fdb0fddfdbb2aaaecbe3b6a3f81212010201a9b1addddcf9bec2d2a0f183b4f4a784dfe1d7b4a7f4cda80d0d010202abe5bddc87d6a0dfee949fbdb3fd87f1ef8ba985e6ad92dc120b01020ab8c1e7f5d7e8abc6edeff0ee8499d4d8f1da9294d091e7e00b0b01021da6e3a1f9869fcafbacbab4d0a78fd3ccf3f9e3c299ccffb40b00010241948ce6dde38e8590879bafa8e4d696fdf4938684b4e7b0d00a00010208dda4d39bc2d3b2da829bfdc0e1e8c6d6d6cb85d0aa8f90c00900010207c29ceecd96d591d4adf7c7c9aabbfbf5eac7d1f7dfa98d90000001023fe880b4b7dfc5f2f8f3cafff9d3c1, 0x179d4028ff35d9701eadf17cc9833c8db39c2a01bf7c9006ed7b2d4e8ea9e80e7d1a698e588bb8cb8bc94a00596df05c68c02b79d069bd226f5b234dda524a2932becc40010c3adbbd9f0acc982e1d689c29fecb2a3e895b06095e368f0b2069fa260c9be30] private def node1794:Certificate:=PackedParametricCertificateData.decode 10 data1794 private def node1795:Certificate:=.split node1764 node1794 private def node1796:Certificate:=.positive 1 [(1,1),(1,7)] node1795 private def data1836:List Nat:=[ 0x10d0d0b0a0e070907070703030d0101010b000a12120d0d0b0a0e070907070703030d0101010b000a12120d0d0b0a0e070907070703030d0101010b000a0608040616001c03120301010f0601020202040702040202020312120d0d12070e07090707070d05030305010b000a12120d0d12070e07090707070d05030305010b000a12120d0d0e07090707070d050303050101010b000a060608040200080306030b020a02030400020406030f02020202020312120d0d0e07090707071203070301010b0009000a12120d0d0e07090707071203070301010b0009000a12120d0d0e070907070714051203070301010b000a060608040200080306030b020a0203040002040603120400020206030110040002020603010e0402020206030d1c0a1206120102041e030e0e0d0d12090a080e07090707071403080312000a0e0e0d0d12090a080e07090707071403080312000a0d0d12090a080e070907070714030803030112000a060608040200080306030b020a02030400020406030f04070605080302040a030d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e0314011200100009060608040200080306030b020a02030400020406031204000202060301100400020206030f04060c02120316030e0402020206030d1c0a1206120102041e0301, 0x112120d0b120a090710040e040d030403120001000a12120d0b120a09070e040d0304030401120001000a12120d0b120a090710040e040d030403120001000a061404030202020312120d0d0b0a0e070907070703030d0101010b000a12120d0d0b0a0e070907070703030d0101010b000a12120d0d0b0a0e070907070703030d0101010b000a0608040616001c03120301141412120a0a09070d03080207020e00070001000a141412120a0a09070d03080207020e00070001000a1212140b0a0a0e0909070d03080207020e0001000a06140403020202031212] private def node1836:Certificate:=PackedParametricCertificateData.decode 10 data1836 private def data1861:List Nat:=[ 0x101020b98bbcffb9c95fb92e38eb89ff6f3d1f099b00d0901020e80eeeec68beac0d396ddc1f798f0a0e791e01206010222adc6da80f4ede7dbc5e5cdeb88e8fad2ebe00804010223afdaa7a4f0fb88ffc8b8a5d08ca0a3da88ba0704010235cdeedd84a8bf88c7b79286eff297faf1f4ac0401010238fdeeb0a8b9e090fbde8cd6dcbef2d2dab19e0b0001022fbfc1f1d6bdf1b1c4b9d5f48ca5b1cd8694a01212000219dfefaa9af7e2a58a95db83a1a5bdfff5b4800d0d00020dd9dddca6cf8c90bc92e480e2f0d5acb8e9b0100b00020af990ee9de390c5a6e4d5bbfc9afdc4ad9cb00d0900020cc8a6dff1ee96b5fd9bbbf0ddcf9bc7a7ddc0120600021dbcabe5dfb5f2c0fceefffcaaf8b9828ef7800804000222b092aec2bee2c6b881b7a9948c9380f7e2a007040002388ae2889098b1caa1cac6d2a5d38ed3bfd2c004010002378f96ddd2f3b0d9fe95b8faf6d59f82e2cce00b0000022fd5fbb4c59190f6a7daf9ca9ef5e891bf93c01e268c8ad882e1d98aa0feeac00014040302020203100b090912070b0707060d0209020d0103010b000a100b090912070b0707060d0209020d0103010b000a100b090912070b0707060d0209020d0103010b000a0606060504000803060301080206020202041006070605060102040804010c0205020302030204010d0c0a0806060302040c030912070405060016041604, 0x1801201000202d0d3feaafcbcd4edbbbcafacdcf0b4cbb292efece8a0bb800b0000027693efafc0fcaeb894beb98ef0b3d3a482f4c598df9df4b3800600000202ecb0ccdad7a284e2d2a5ca96fac89292f6e1bffaa5cdc4a980000000022ca689e1beb6e491a6b6e8af96dc82e0cafaf4e1ccc2d1efc01e01f897a2d7ec8ae3ccb2fce6e6a7d7e3f5a5c0000b0205060202031004090402060306040a020802010403040410020002020204288b9851c99545dbf82a97d9012e94e591c2f0f6c8e0809c92981db502d38401eaac12c115fab535fb8c39cdc51aacda002181b9e1c6fccaedd4899ec5ea801212020219e3c7fbddcef9a897b2bec9f8e0bae1a3b0800d0d02020c9a93b9e693c6f1cffad7ccaf98afc59ac3b0100b02020be1f28ca1e3e0d9e1a8f1e484a693c5d6a0b00d0902020ee491b3b58fb9e18483a7cb8895ae96c6d7c01206020226d2f9c7dafaaeafd792c2bde2e3d5b9a7f18008040202258582bef1a1d4bdeadeebddd0d4fcc5c0d7e00704020234fed18681929790ca97bf85f4d1fdcb908ac00401020238aee8d9f5b6ead6d4d7ecc199b991938e8aa00b0002022fcaf7c0e0defed7bb9f8dd4eaae949accabc0010002020186d2e2a48accf4c1ba9dbbfdc588cb87c9801212010219bceafb9cbbf996f69fd6d2e0f2b394aee6a00d0d01020cc4c6ea909388ee84cfdcc5ffd3f4dac7dcd0100b, 0x1e0fad082b0e8fc8aa2abb2e9f6ecf00101020202b8d7e7c4f68ccda99f90cdbcd9f1aed1a7a59882e1c39e800b000202018ef3b4a687fb8b85f4c2d8a6da93f6fdb7c0cfaaafebb094a00600020202b5d9c2ec89ccc0d88b8dc8d6a8c9a6eabff2decbadd19ada900000020237ddabc8baad8ea2e1adfb96f0c3cb8b8cf68daae49cdad190121201027cbed4bce9f787bcb2eb8881ae81f5c0faaae5f4ade3e2800b0b0102238bc6d0be92a1b88aba9bc1839bd1fbffc5d5a5c2b69ab8c01006010205dc858a978edf95d9e9c58eca82e4b9bfeca9ff87959bdfd00e06010233f4bbcdcdbfcaf280c7d19cf1f88ec5a483c4b7ddf99fe7e00b06010201d7dfbfb5ca9ae9d4c6db8ee0938bffcdba88e58faec2d880f01201010206c7fa9ccedeecca8ac0a09d848681ebcedbaa9dd391bcf9e00b00010201849ba6c5a8de9dd396ded8f9e4d6c4bcf4c484ccb0c4c5c3e00600010202cbd3f4bca1e9aae781b3e0ab9287be8bd19bebe2ee83eaa5a00000010235c7e2c68490bbb2a3e085d7aabff5838ff6eb96cebb9e9be012120002039bd4ece9fab8b1f09fb1f287c6c5c391d99cb7b9bdb988c00b0b00021bad99e6a1d7a2aacc98caed85b8b3f9a3e6ffee8efcb487c00e0600021984a7caae9c80e9f8cca1f799a5d1cfb4a181aac9b18b90800b0600020283d1938690c2ecf983a2c3d0f5d9dbf9a2caed9ee884d6a2, 0x1b09ce7e78adae8fc0b0a00021d97afe6e782ff9adeb3d6a7c2fcb2feb98fb6bebcf9decc0d06000217eabbc190eff3cb8af1dd9de0a7fca3b7d783c4dda8e9a8d80b0000024ed9fb88a2e493d6d7acfe9cbcd5c7fbe0c1cfe48ce9d9ade80700000202f2ec9eedfcdcaa87ddb2ccd5acaffcc184fa9df6e5e5faf80000000211dad8a6b18cf6ccb2d4c7deefa7c094bb8deace8adbd4ee981e02d0eaada5839df8d9a7db85ddb3fa9acbe0c00001100409040206030604080203060002030804100200020202040d02060201060306040c0608060204000a040e0430b25ef9089502ceff1cf4e638e49b34adb21791bb0002d6d8829caaccb5e3eb8beb99caebbcf5b489f9c00193a538ba069b9005f3db17d38c2ea8a926d7b73e98960048f7a59ff6cc96f2a0aed0cfd3d8f188ffcae3c04af29a018e86a90183cc3f97d2248f9f46889e0299831fd8b70001bafbe0cefc8cbfe9959eae949bc8bb9c85c8800b0b020228ecd8acacd380c1ebb6bd88e1cd98db8da686df8dd399cad01208020201bdad93bdc090c8b1d98deabc8db7fad4d3d1e89df9d080f01006020212b9b5b4e2c1dd9fe4cec8d5dbfa98fde3c995bda0a9d8fba20e0602025585fafcedd7bfb19782b99bc0cfbbd5f6868fa7dbea9686880b06020201a2c7eb88dbe1b8f4fda4b1b4f2cc91a1daffab83e4a981bad21203020202b88bf5dadbf7e3babd, 0x10b0b020206a3e0aca089fe9fba95bbc4d1bce9ddbff2b6eef3a39f9ebc080602020293c2dab19abacfb5ecc4c2e5b1c39f89efcc98b2af9bb6e0060302020bd6a9ccc08dc3aea4f7a8d6c9b8f2b7a786d398edb58ce00b00020256f2eb95c2b2f1d3bcadca9494e0b698fff2b2f6dca6a7d9a0000002020e92a5fcf7c08398c9cfbafe90a1fdb1d8cfbec8e1948bf4d01313010207badba9dbd6e594b49d88dda7a18dd19db09fd690bbbf8ebe1212010203d0af96cbe79adacb9ba8aac4ea93c4e0d98ba78af7ebebe0130d0102028cdcc2aed4f1abe0e5f9d4dca8e28ea2a2adaac798a7edc40d0d010262c2d3b0f7c1fea1e992edb1a18586e7e1a0ebbce7c280fe140b010202f1d6d0d9e1a2d2f5afdb9afdb4ac84d6a7ffc59bbd90e9e00d06010218fbaead9dd2a7eea2efd99bb8d6a3d0a38c9789bcd288e3c60603010201a7f699f9b5fbdcc590b9a2cbacd58cca97ceda92c2bdbbfe0b00010251c6a2fd90b1bfe8c8c4dc9c8f8ae0b9ebcfc9c0f9db95bde00000010212c1dbedf5f2e8b5e6b6aeb8b9cc9af5c6d89bffdcf5b3cc821212000203c781e59df3a9e096e8dceacca2e4c589c8e9ead69d8494e8130d000205bbf1959099f6d3ce93daba80fcb4dfd08d99d7e7a6b8c4bc140b000202b2a9abac98ed98ddd397f7b6a1c4d4c299a5aed4ed88e5b40d0b0002038af8a4a6f3f284a680bcddbc85bde5d1, 0x1151200025ad0a6c295aac9c5eaa6b6c8fec98aecd8a18cb2c4ad88e7dfb7d2d6c00d0d000202c3b3fcbbe3c386d0fee5ea85f8a19ef2bbb1b5d0dea49e9cf9cdfccca0130c00020eb5d8e7c883c091e59d81faccbba0dcfa8eb2abf4a4bcc1c0eb9089af8c0d0c00020198ebedb290beba9aa8c8cbc2a3e8cfa7989e97a39dfac79eed92c3ec0d0000020992aeb3bed6839a9fae8b86ddf6f4faf2ac8fe3aaf1d797f0e48de998c00c00000218a4a7ece1d3fcdec0c2a3feccf4d7e3c2e78681a8eee691b5ea9eddd5f00000000205b3c8f0a0ffb798f1e4f3eef6f8d4bdf2abbf86e79ccdd5e0a9a6c2b9c81e01dbc4b9d791ffde9aa7f086c496b7aaaed5c8a4a68cf0f40001828b20eb0bea02d897128acc26fcb53db0d029c2fb0004a5888efaeba48ae2da8d88a5f488a4b2b7b38da001b0b257c505ce9c06abad21beb63d8fa112e8b732b2be0001f7b8eff0c9d9fd8bf2e8d3d385cacff2f1d784d04bc384018f81873c98be02de8026f9a748d1b01cf0e701b1ed0064adb5c0b4c5deb4e5cc95f79697f8d0b8e8f01212020202cab8bbb4ffc8e1b6e480eaf6d1a8b4f9dbd0d7d388f6be800d0d020203e4e895eda9d6f5ba909bfacded8fffa6eb92aec3abd3c7b4140b02020387eba5a2ff84cfe197ebf1d1bffaa1f4a38e80dc919bb0c0130b020204e6f3bdc6eca09998cae08dbf84f3f9d98294d1c193ecdfd0, 0x196858be6f0ffca0a0a0202749ad18f81d18fff98bcefb5a387a3f3f293dddefeafeccbb2adb1bfa80c09020201d9c6939588e4f0e3e0a2d7ffbecccb84a0c9b7f2efbbb7baf6ffa8f8b40c08020201db909bd9bdfea987b7a0b192af8db4f4b790e191aeeaf5aea2dcffc8a40c00020208b8bc9ca3d0ac88beb0b593b2b8e4d1f7a7e5be9796a38aece288ad87b80000020208b787a7fcebe6f8a189c198c883a8e1fdd0d5c09aabb5aeef85bb86a598131301021e80abb7f2b4bdd8cc82a2a2a09fe5a0cffd9bd3a48c9db3d69cf0bfac1512010209afbaf184b7feb7d6aff3dbdeb6a680b5cad5b2bed5a2faf69791ea82c80d0d0102069cb8a6ddc6abf482d9a2da81b9d5e2acd0abceb7bda5e2a8f489c7dcb80b0b01025fd19e86ab9ebfe3fcacc3d3e7cf97ee90e68cbb9bdfdfd1a3c5b2b0940a0a010226df9adea6bbd59f88989cbfdcaefec2939ae2f1dccf93c4c3cf97c1e40c08010248f7f5b5b0adfa9bf0f4b78aaedafd8ab69ca7fdc5a8e5b6cead96d9fc0d00010203ecf7ce98fbdb9184beec94bceeaeefa3bee6e9d0d581b397d88c9c98a80c00010216b0bdca87b49fdadffb958eefe5aafe84b0ece4a6afa5f2fbf481ef91b4000001020d969dbc91c48eadf8f6ffd8c8de88a285f8eab3ecaa8491f2a795b3a4f8151500022fe0c3e8eee984edba84b09af6eed0fefcb292cad5a9b3a395f5e2e39ec0, 0x101de9501c18821c604b9c310989a2388b33d969e2dbb8b0002ede78ca5caa5aeaeeccce391c5c8c0d0c7ea8ca68fdb9882e4028b84029bb707a4dc09a5cd20dcec3ebcc90bcda53399d80001becbda968be190d19dd8b4e599b08fe5cf8dafc9daf89395e04b8e920190fda532fc901694c0278b8549f18616bfb90b81910055afe59383d89a8e99f2b8d09ccb9386b5dacbfdeb9fd1802aacd413aded68d7bd3aefbd29b189149bf25ae9a841c2da0001cacbd0fde0cae99a91f6fbefa8d7bfc18c9afe8eadb6cfe01514020216ffe492af9ee6c986ddf7e689c9aed4a3f6b6ac91979bc081e6dfafb00d0d02020c83fcb7d58c87b999a6bcb1b7c2f2beb4d298e1b89ecdd0d7d098bba2150b020219e7d7aecac8d49090e0e2e194e3e1d5aeccd99fc0df9ac7ba92a8a3d4c00b0b02020290b7ffdf80daf1a88cdeddb4c5f1f387f1f5aeade3f2] private def node1861:Certificate:=PackedParametricCertificateData.decode 10 data1861 private def node1862:Certificate:=.split node1836 node1861 private def node1863:Certificate:=.positive 1 [(1,1),(1,7)] node1862 private def node1864:Certificate:=.split node1796 node1863 private def data1910:List Nat:=[ 0x1061404030202020312120d0d12070c0709070707030314010d0100000a141412120d0d0c070907070703031401090000000a141412120d0d0c070907070714010d01090000000a0608040616001c03120301010f0601020202040112120d0d12070c070907070714050303090000000a12120d0d12070c07070714050d050303090000000a141412120d0d0c070707140503030101090000000a060608040200080306030b02080203060306030f020202020203141412120d0d0c070707140512030a03010109000a141412120d0d0c070707140512030a03010109000a141412120d0d0c070707140512030a03010109000a060608040200080306030b0c030a01020006041203120400020206030110040002020603010e0402020206030d1c0a1206120102041e030d0d0a080e070c070907070714030803120003000a0d0d0a080e070c070907070714030803120003000a0d0d0a080e070c070907070714030803120003000a060608040200080306030b02080203060306030f04070605080302040a030d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e03140112001000090d0d10080a080e0712030e0314011200100009060608040200080306030b0c030a010200060412031204000202060301100400020206030702040202060306030e0402020206030d1c0a1206120102041e0301, 0x1140d0d0d120a0c0a150914090a090907150600000a140d0d0d120a0a0a150914090a090907150600000a1515140d0d0d120a0a0a150914090a09090700000a061212140d0d0d120a090809070e000900070000000a1212140d0d0d120a090809070e000900070000000a1212140d0d0d120a1009090809070e00090000000a06010a04030402020306040a0208020104030404100200020202041212120a0a0a090710040d03040312000c0001000a12120d0d0a0a090710040d03040312000c0001000a12120d0d0a0a090710040d03040312000c0001000a0614040302020203141412120d0d0c0709070707030314010d0100000a141412120d0d0c0709070707030314010d0100000a141412120d0d0c07070714010d010101090000000a0608040616001c03120301141412120a0a09070d03080207020e00070001000a141412120a0a09070d03080207020e00070001000a1212140b0a0a0e0909070d03080207020e0001000a] private def node1910:Certificate:=PackedParametricCertificateData.decode 10 data1910 private def data1928:List Nat:=[ 0x109020201b7f8b280b5fb96dba88dc2fe940c0702020a8193b59e849cd5fe83e0e3d00e00020201c8eaa6dcd0e3a4e1dcc0a0ddd80c00020207d6cafee59ee4efb4dfeeb587b8070002022091c7a3cbb6dd96f1dfcfecf80000020204c1bad293a9c8f5bcbcede9a1a40c0c010201a7e5ccd383a1a7ed85c483f9fc0c0b0102018a8892f0c9cffbbcf18ad6f4880b0b01023bf9b9d3d18f97c6b0dbc6ddf80a0a010206afaad289b2fcc1d8dcdcbda40909010262c7b08dd98ee4f2c7c3e2b9e00c0701027fc39f898cc6d58dd3b6e68f900c00010207b9b4d7f4eda5a2f9effdfcce900b00010201c5b3eaabcfc9b3fb86a3d1ff900700010201818d8e85a2e0bb9eea898490e00000010204b5f3b08ccc99d2ddb39ef3b0a00c0c000202e1eae9d8b59defd4b8e3b2dfc40c0b000274deb3d4e4ceb7f0d6e0a2e4880b0b000247a8b798809cc2adbbacceafc00a0a00020f9ae7c5c5beedd49b98e4b5bc0c07000236c6bc85a5ea88d29cf4a09b840c00000208a5e4f5e4f1c4e8e9f19ea2d78c0b00000201de8cc8d7ff82da85a1d9e6a390070000024fd4a5dacbdae6b4e2dbc4f0ec0000000204daa49fc6b8f5da86c8f0fdcdfc1e04c9bcf2bdab8c00010a04030402020306040a02080201040304041002000202020407020402020204060603020206030804010d180a0e060e04020418030912070405060016041604, 0x1b194a2fcc2e9b0f482e1bce2ebd6ee9ef1ffebb7a00706010201f5f0d3e3bbb4eece84e3b0acec99b3e2c8e0f581f6cdfcdc0606010204ac92aee683928aa2fcf8afc8b5ca97a0dba8ebb8f995fec00d0001021794ce8ec7b6bbe2cbcb93beb7ec98b6abae9795fcbeab88090001024395f2bfa683d3e88ec8bad0bbfd8beedaffbcecbee4e2a400000102118ecab08ff5e0c996f883c7b3eeb4c3dc92b4d3cee7a0f80d0d000226abe484fcfe88d7efb7bfc9edd3a384eeb798faedeff0f80a0a000206d6e79aaa99d4ebb0beb7e1e0a4eecefbb8bef092e3c0981506000206d898bed2a1ace1dbb681b6c2a2f791a7c9f99badd4e1d4a00706000201b792fabb9fd6e9aafb818e8bb499d1ab95e3b68587b68ae00606000208e892edc8a1c4f9d5a4d2ecb7aa92ebe5a9acd6e4a2bbd4b00d0000020cba85f3f8e2bfb6ddfccf83c3d8b195da80a5c7c6b8a3a00900000219feaac68db6f4cbf597fa9880aace9188e89a88d58382c0000000020fb7b3eac899ac908ab1d2d0bac2f483a6aaa0aacbc8a9b01e02bd87a2e1eab68c9f89f7ffb3b4c8eddaf00040ba6fe501f5c3018ce120e48442f3912bc3dc02ecb30005cbdbc5dbf7d9a8e00d0d020218c4838ebfa491a6a3cbd8b0860e0c02020281ecc0d9b1a1f183cef186fbf80b0b020228dca0ed948bffe68be2ebe0960d0902020ecadd85f6ecaa9ccbd4c8e49809, 0x101060002030804060602080002030a0433edd267aad121e7be13e48c0104b4cae8828a89808f838cf2bda0b3b8d0afd002829803edc902b7dd01e28b1ca79238ab8735e88413d8ab0002e6ea85d58ac9a58e8780d090ccdfc191f2efe806acd50bd1c40cd0830ef5e619909231efaf1fb9e333b1900001cdebc1f4cad1c5e087898e80c9c6838eaac3b8140d020209ecb3b69592fe9d9b9198e3df94f3b5a1d3adffbcacf8130d02023188dec4a4b9e18183b6c7b290b996b9e488acab8984eab80d0d020214b39d88adcaa7e8daf4ede0c6aada8bb9b7acb0c393ea900a0a02021295a6a5d48eaab3d3ecaa87b2afc1cd88cdf9a8fbc4edf81506020202f88dc1c8dba28590b5d5fe90f2c0eddd9af1a5b59490efe0100602020a90e383f8b8ea89f48ee8cbf2d1bbe2c98ebee7dddad0e00706020202d4ecb0f196d7879f9ae8d183e7e5a2d0c5e59da1b7fbdef80606020201d7d1adf7d3b6e3a6cec6caadb4d28ae8baf9d180ddfccac00900020271dae2adba98a6a98efbd7f8ec9be7b392e0d8fdc2ada1d8000002021cfdb795ccb6ada2ca9e93cb969f95e4ddcc90a989b7b0e80d0d01022dcc96f7e3949aeaffecadf8e3ddcfd6a081eccedde9a3e60a0a01020dc1f198a9d2ccb5cbf7e48f8cccf99d9e96c8b3dff6f28a1506010206d39fffbee4febbeab391c899d186bad69383ae8bd882d3e01206010201f296, 0x186f89de28297a2acca89eae9bff0e7def9c9afc9cd90eedada0b0b010238c4ebe0f0d1e2a8f7e6e99db8cce6eac8c182a4dae2d7d796bdc0f8abada9bffefdf5e1cdd0d19efbd883f1ee9380aacce0c3d1b58ea78ee6f4c88bc80a0a01020184e1a4f9b5c3d5feaec295c6c285a8cbb0ac86e8de8cbab4978c99cc9793c8f693b3e79bcafec786f5b0bfbbc4c49ba1b6bfd2e4888798fe8aa4e690b6801503010257c980ffd980dfe4d5b5eeb2eeb884f3b9cbf5978a8dc6b2e9e7d3a595a9baccd9c9b9d2f2f9ebcdbe89e2a497bb81f2a3b1f082f6d1f1e483c8d1ddc590150001020992ebb5a6fc9e918991d8a5ee928db081aab0dbb193bacb9784c995f4b4ead6ab80c1b8bdfbdaee9fd38984bf81f3cdd5fdb8ab8af9bd84e78fc5d4b3f8e40d0c00020af3e1e3a98385dc81bfe9f5b1e4a4ccd0ae9bdfe4f680ebdccdb9e4b6ed8093a2eade93e497f5b2d6cabd868bf0bbe7989fb1f497ddd98ed7baa3b4800c0b000278e7b5fa92d591cceb8e9ff7c3f7d7949389f5dbbad5ca8fc3c9aa90d6da81a8fa88fc8ca391c6b593db96bfffd6f5df838eb4d6a6cfc8b69dd3bc801e0299d785a99ef394d0b1bfa7b380ad84e1b5b4f3b5a698cca3ee91dac8daadd08ce7eaedeb8afbf18aad92e982fd848b8ac1f9b2fafab79080000b0205060202040a0403040202030604080203060002030804100200020202040702, 0x1a68bbe84b0800c07020202e28096f2bce6e1d69785c0c3f29cf78b96f2f9cfe0f6cea5deeeaeb6f892f6bada91c8ddb1feeae6effdfbc1e3a49fe899dd9ae9d3c3e7fae1bbedd080150102020bab88c389d481beab84fa969da5b092a0e68b88b0b383bdb48cbcd0cad3e585f0a2dfb4fa82abe4e291c9d3d7f9f3c2e1ca8af7e9b6c192b4a1da96deb4800d000202108cf787bdc19df2b2e5ddeea5c6809ce2b8f1bd9880c2ee998988fdd193b3a7dbafced4e3e1bdb4d2a9e9f5cbafb0a6eba9ceb0b18d85e8d9e9f0f288800a00020208cf9de194aea69ac7ebe7a89cf4ee9595a9f9dd97aaeeafa7f484e0c8f5a8fcd4b9d195fd88beb7bed1d692e9eca3e6d3f99beebe81d0b89a808ce0e880131301023be7fafbddfce6fea7fca0e5d2bcbfa1ac8395e3eaad899e82a7c4ab9ff1e78fa6dccccbe1d1c4aed2b3858eecc1f0c1f989cc91abe3d5c094c0f8cbb2f0150e010201a88dffa580aaafeaf5b192f0c3feef91d4cedbe9bba0a9c4e9e5cbf29aadb2ccf4f786b8a0eec184e18bbbc590d0fdafd3c4ac93d7b1acc394ea86f2bff60d0d01024f9e80d4f6de87ebd9dd99c484a2c4f2aade9cd49f81f690958894a5a5a9f5d2e4e7b996c7bff68491c0fc809283add7b797838ceeb7facce0e6a8919bc8150b010207f9dbd0d295acc3cf80eebbe0b1a28dcf869b93efa987b4baded9bcb6fb9ad7f0e4c3a1ca8f, 0x197abb985d383dcaa9fb4e9aff1c2c8e5c4d1b9d3c7eec3f6e4929384eeb8accae7abc9dd91b08003a9e802d70bbaf72eefe712f4c5188ad8409af24a8fb40002e59788e09cc8c29aa884f3b8da96e8e1cde2d8eafee3d7af91d3bcafb7a5a5b9fe978f99edf784de838ba482e29195e4eabfb38793b4a080150e020202dbc089affc93e4bf96f79585b6fdfc95e8bc99b1a4cfc6dce2dbeefed1e487afa1fa9da5b8fbf097ea88cdbda7baef85c48bafaaece4fbbbbcbdfdc8ce800d0d020202aecef498dcaeccd385abed91cbfdd5829c84aebaafa8e9c1f5eaa78fd6fabc8e91ef828c82d885d8859ac3bfb3f0b1d88ddbe7cf9ad2d3c3b7a8e3a080150c02021acf9dd6c5c4f5d5c38de6c8d5eaa5e7b8bef9c2ed81c5f7d185bc979de0c2e3aceff6cce9a69ed9cee19cd9b6e78ff2bfd2c2f3fa93a2c9a5a99dafafb8800c0c020201a9ce8dfd91d8ec97d5d3cededd8ed1fe82ed9da6ed9bbeb3d0dbf1bb85fac4b7a7f1c69f9491eecbac898ce6a9e2efb8a1efd8a19b8ac6e8e2d3caa080150b02020abfe3dea7b1cac5baf490d3929793c5c8c8be84b2b4d3f5d3eabfa9d7ece79fa0e3dee1fee3bac6f3e48a8bbedec9fbb2fdc1cfe891d1e98c92829a8fe2800d09020230d4e494ece09c83bc8981d6def5a1f49cec889981b4ea83a7e0b09bb7ad8d94b7e39acdeffbcaf0fbdcd1859084cacfc0fee3def4dc8d, 0x180fab301a290eef8028ac0c4b903d9b88af702ffd78c8e006a90abe9cc83d7f685c6a1d4cb8cbdcbec959bebad8ec9c6b6a3e9b48382e5a9b8fb83f2d6fabfdae4aabbe0c2ed8389d4b9ae95eac8801889bf28a8f44bb2e453dded0163dfcebbc6e2a2e080c180929bb0d3b38fa283bef2b0c6b48dc2ed87dce1bebf8fa380a4ce85f5f09aedaaddbbed83a18ffea89bd4f1bce0c3f817f8d72fe7961d9bf303cc8c016295b0de84b6bea5f29fdfedcb81fad391a694859a8dc8bcc39d8c95bff5b1acd09d95e9a7aab4a0c6a6ecd0d7cc8de8d9c2a8deddb3ebafb08076c802eb8302c78501bfc810e4d82485973dd4a62ec8f30017a4e7b0f7bc93d9ccf6d8ddee8fe080b29ed4bde6c3b8f5e3978eeae5c987b6c6aad2aa87a9dd91ade4919fb49ad6b9c4ec88c188d8a2a2dc8004ca02c2a6069dc502efe120d3803ed49d06a5c133c6f600338da5c1f3ebc6dadbc6dbfbc8b1d2b7a7c487ecd8e3d4f69ec6ec8bdca5a2a8baf8d7afc1f39ed4c8f59dfa8181f19ca888db938fb799e1988041def3018484c859a7f905deca20a6d840fc9f2c97c605d2c7000ccbd7bca2b6b8ccf5e19cf299cae49bb08ddb96cdcfcef49b9d8adb89d9e7ceecbcdb909ed68feccb95c1f484bbf3d6dffaafbc8381e9abfc8020d5ce308edd658ec9788fc50e83b513d8d823cdee2e91ca0030c4c3dea29f80f1c9efd6cee7cee2c190d7, 0x1079ea0ee169495e313fb8dbb0bd8cce2018392d4da0299c8c5df03e1dac99002ebe9cccf00078fc299a181cec3c3caaeddf1b884d4cccdac8585d1d4f6b6e496e5e790d5bdf1fbecf4e8b6abd5f3e6dc96f881dccdef90fccda1efe88023e7aa13d5f7d230d6f28f16b989f101ff88b9ae03e9c28ad1319584910392e285bc0002d4829391b9a9a5baa9fc878bd48aeae9cfb8a9c59cfff7d2a2e2eddcb1e2bec589b68ec0aed783d598fb8df7b299bed2c0e5f9b795d8800299e5e2d503c8fbbb9206c0a5fad206ff] private def node1928:Certificate:=PackedParametricCertificateData.decode 10 data1928 private def node1929:Certificate:=.split node1910 node1928 private def data1990:List Nat:=[ 0x10c0a08070714010a00090000000a061404030202020301120e0d0d120a0a0807070d030e020e000c0001000a120e0d0d120a0a0807070d030e020e000c0001000a120e0d0d120b0a08090707070d030e020e000c000a0614040302020203120e0d0d120c0a0807070d03140103010a0009000a120e140d0d0d120c0a0807070d0314010a0009000a120e140d0d0d120c0a08070714010a00090000000a0608040616001c031203010110120908061c041e041e0401120e0d0d120c0a08090707070d0303010a0009000a120e0d0d120c0a0807070d03140103010a0009000a120e0d0d120c0a0807070d03140103010a0009000a06060804020008030603060203040202030f02020202020310120908061c041e041e0410040002020603010e0402020206030d1c0a1206120102041e031414120a0d0a12090d08090707070803100003000a1414120a0d0a12090d08090707070803100003000a1414120c120a0d0a12090d0809070803100003000a06060804020008030603140403020202030f0202020202031414120c120a0d0a120912080d080c07100009120c120a0d0a120912080d080c071401100009120a0d0a120912080d080c0712031401100009060608040200080306030b0c030a01020006041203120400020206030110040002020603100402020202030e0402020206030d1c0a1206120102041e030101, 0x102020306040702030601040004040e0410020002020204070201060002030804060602080002030a04150d0d0d150a120a0d090a0915061406090000000a150d0d0d150a120a0d090a0915060706090000000a1515150d0d0d150a120a0d090a090706090000000a06120c0d0a0a090a08070709030c000b00070000000a120c0d0a0a090a08070709030e000c000b0000000a120c0d0a0a0807070d0309030e000c000a0000000a06010a040304020203060407020602010400020408041002000202020407020402020204060603020206030804010d180a0e060e040204180309120704050600160416041614160d0d0d160a150a120a12090909150600000a1614160d0d0d160a150a120a12091506090600000a15151614160d0d0d160a150a120a1509120900000a061610140d120c120a0d0a120910000a00090000000a1610140d120c120a0d0a120910000a00090000000a1610140d120c120a0d0a120910000a00090000000a06010a04030402020306040a02070201080002040a04100200020202041610120a0d0a120910040d030e000c00070001000a1610120a0d0a120910040d030e000c00070001000a1610120b120a0d0a120910040d030e000c0007000a0614040302020203120e0d0d120c0a0807070d03140103010a0009000a120e140d0d0d120c0a0807070d0314010a0009000a120e140d0d0d12, 0x1a598150a01022c8cbeacb0adb2c1bfefd883b8fbac8c9feaa7a0bd8bf3f3d3e39c859894120a010201dbf7fcefd2b688b79fb9e2ccc7eccef7f9dfc4d2dbb8e8ff8cd782c7ec0d0901020593a09aa2d8e3f6c2db9784aea4e6fccdf7ded5d2bce3b5acfb9186de800a0901022ac9b680cac493d5eee6dceef2b1bc98be96fabdcaeecfaae5af8a81f094090601020aa4bf9289fcb4a9c4f4b0c29daae19fafdfb6f2b994bda0c7aea3e5b9e80600010275cacf9ea7dc8d81cfe1cfc5c6b3a99de9f8b3d18d8e84e5e3d9aa97a81514000201f298d5c2eaedc8b7fedde5ebbaa983ccc7d7e4f2aece88c3f5f6e9d4b8150d00020fdddbdbc2b9d0c8a08bda90c9a5fbdf8be5bbe6acdbbef8f3d9dddacfea120c00022eadd3959995a9959c9fc694f1c7e5f8b49c9bfe9ea3cbdbd1c5c1f9f0150a0002299cacffbbd1e1cbe6a2d798ef84919989ecb4b2abde88ec98c6afc18a8e120a000201b0e4b4959a848cbbdaae90a99d90d9fbd08eb8fd91bfb4fdda87f390c00d09000205dfc3d8d6b598da87ced3bfc0b7d1a0a481db8cb3d3dfdd84b2d7cfa4ca0a0900022e94a9aebbdbecf88dd6fcbbbfa891c993eae3a2d6d3f39abd808ec0e6a60606000223eca8e6b1a4e9eef88e9d87c5a4c580f3ac8998e1f2bdace4b5f8f3f2fc1e0887bec1f2c8efa08bb5e6e1ead9829ff5888aedc3e490000b0205060202040a040304, 0x1d5ff989cade6ca8ccb8fcc08debc13fb8149adc80facb5028de304b19e09dfd34fc69e000398c58a829ac9e587f0a9f6b7e4ed88e8d09aace0a3e28ee42baaa24e9ad702cf9b049fff349ec76a8bf205e8aa27c0002785b9f793d5c795b99a85f1d8a1fb8f8dedc1e9b38fca901514020204bab6988ec7afa680c7a686e0ce95b0e1ebf8b6dedabfed85b9aea4c9e00d0d020202b8e7fed3abe7faefd3fcc2a0c3f3a7f691e9f7f6c2a091fba192bdb18c120c02024c8f83b2f6bff0e5d0a5b4e0889efcc9d8a1daf1af929a8dba94fa84f0150a020220cdccb88dc6e1ddf389b2cfd8f1fef1daffd8bc84daa7a1bccbb5dacce0120a020202d197adb9ebad9992c6d9db95b59cd09b8ea1a685f7d2bed7edf2c7d3900d0a020229aadecf938cfccad6e7b6a78aedf4a09cdea6d2dcd18debcffde1af980a0902022ab1aca2a5d4d7a4e882f7cefffaa9959ec3d3f0b7fdfa9de181efc0a3c0090602021890fac8ec8198d4d0d6c5fc888082f5d187dacdebc7f9fad2cb81adc2c0060002020484ad8d91edd0d4dcbfdef0ffc6d4afbdfc9ded968db6a4d5d2fc8aa3a01514010202ec8ff0fbd992f689f5d6aac8869ce8aba199c1c4f5ea99f3bee6e4b4b00d0d010201e2d19adbb782a8eaaafd93f1bdb6c88c90c7c49fb8dbfec6dce88be6dc120c010231a7e4b7d7b7d1aca0d6e9d1d0898ea5cb87a2b6e6969bcbd2b5af, 0x101c2cc03a5d110d6a278efca0101dc9d81d0b4d4cea282bcba9a8fd89d93c7aad280a2c8fda001879602bac10ebbe106c9ff01fde004fbb158a3f818c09f000ffffcf5c391d0fab5b08fc891a0] private def node1990:Certificate:=PackedParametricCertificateData.decode 11 data1990 private def node1991:Certificate:=.split node1929 node1990 private def node1992:Certificate:=.negative 1 [(1,0),(1,7)] node1991 private def node1993:Certificate:=.split node1864 node1992 private def data2057:List Nat:=[ 0x1000a0614040302020203140d100d140b12080d08070708050d000b0009000a140d100d140b12080d08070708050d000b0009000a100d140c140b14090d08070708050d000c0009000a0608040616001c03120301010f06010202020401140d100c0d0a10090d080e0707070d000b0009000a140d100c140b100b10090d0807070d000b0009000a100d140c100c140b14090d0807070d000c0009000a06060804020008030603060203040202030a08070a0306020c041203140d100c0d0a10090d080e0707070a030d0009000a140d140b100b0d0a10090d0807070d000b0009000a100d140c100c140b14090d0807070d000c0009000a0606080402000803060306020304020203120400020206030110040002020603010e0402020206030d1c0a1206120102041e03100e140d0a0807070903080312000e000d0007000a100e140d100d0a080707080312000e000d0007000a100e140d100d0a080707080312000e000d0007000a06060804020008030603140403020202030a04070e050c03060412030a0914080a080e07140310030a0312000e00090a0914080a080e0714030a03120010000e00090a0914080a080e0714030a03120010000e00090606080402000803060314040302020203120400020206030110040002020603100402020202030e0402020206030d1c0a1206120102041e0301010b0c0202020203, 0x1030600020308041002000202020408020602010c000404100408060706020e00080416041313150d130b150a0a0a0d090a090706060609000a1313150d0d090a091506070606060900081313150d0d090a0915060706060609000806140d140b120a0d0a0a0a0d090d000b00070000000a140d140b130b0d0a0a0a0d090e000d000b0000000a140d140c130b0d0a0a0a0d090e000d000c0000000a06010b06090203080004040c040802060202020410020002020204080206020404030404060603020206030804010d240a1406160502042403091207040506001604160413131612160d150d0a0a150914091507150613000a131316121512160d150d1509140915060813131612160d150d160a1509140915060806130e160d130d120a0d0a14090d000900070000000a130e160d140d120a0d0a14090d000900070000000a130e160d130d120a0d0a14090d000900070000000a06010b06090203080004040c041002010202020410020002020204130e140d0d0a0a070e040a0104010d00070001000a130e140d0d0a0a070e0404010e000d00070001000a140e130e140d0d0a0a070e0407040d00070001000a06140403020202030b06090203080004040c04130e140d0d0a0a070e040a0104010d00070001000a130e140d0d0a0a070e0404010e000d00070001000a140e130e140d0d0a0a070e0407040d00070001, 0x1c6e6a6a18ed7988bb9df8cd0150a02024cc090c0acb180c190e4fd9d81c1ccb8a80a0a020201cea6b6ea9981cbd0fffba98ba8f6a00d09020201eed5da81bcdcddf6efa3cba3bf82f6ce800909020212ffd2e196e9d18d8fbaa2dd9a86a09ea4150702021b89b3fdde909fabe2d0ace7fddd90cbc00606020201e1c8d8d3ada6a9a7d08f85f380d9f3f1e4131301025bfcb7958de7aee0c19ae1f8e184c7a0150d010201c8b8e5c2f5cfced684eff1bfc0acbde3cc130b010220d3e4d9a9e286cccdd88ddaeae8a8150a010257a5aea1d9a6aff381d4b1ecd78ef9afe00d09010201f1aabb9284cccceb87d184f3f785d49ff015070102149185a4cefe90dbd08bf5c38b8f958ef4090601023b89f6dff9bcffb997b2e7e5a5afb18b920606010201e2d193c4cdf5e3dedaa7be82fea6cc93d20600010206a4d68bc9a1a181bfcccab9f796df9ba013130002018dec91f881a4d4c6df95a8b887d1cce81512000225fecbdbf2b598f8eda5adee8e9ad2d8a8150d000201a398ffa8ece185d796ead0ecdc8af1fcb2150a00023c96f5b6b3cb96bedfb3bcd880cdb7f48e0d09000201f1e188f9c3a7c785c98ddc88bddfd2c3ae0a090002038782dee2f4f0bedcf78bb4f6dabbabb20606000202af9eb7c98ae4a1e8a1b9c3f8a4fd97a1e41b4ee2c1a8fbc7a39aaaec000c020a02050c0304040b06090203080004040c040802, 0x101ebcf01ebfc04c2ab04b78e03b2f903b2fa45c5f037f0c5006495fafaefd2909beab4898405c7cc05c7a148a68d47d2c0068dc5068dc64df7be13e8c80006e5bda7c7af8b9a9290dbd01313020201e9e9cab6afedacfba3eebcb8eb96c4b8150d020201eccff6fcef9f92b4e6a69e9ffbe9d6bd88130b020205c5fea5] private def node2057:Certificate:=PackedParametricCertificateData.decode 12 data2057 private def node2058:Certificate:=.negative 1 [(1,0),(1,7)] node2057 private def node2059:Certificate:=.negative 1 [(1,0),(1,6)] node2058 private def node2060:Certificate:=.split node1993 node2059 private def node2061:Certificate:=.negative 1 [(1,0),(2,2)] node2060 private def node2062:Certificate:=.negative 1 [(1,1),(1,3)] node2061 private def node2063:Certificate:=.negative 1 [(1,0),(1,3)] node2062 private def node2064:Certificate:=.split node1729 node2063 private def data2128:List Nat:=[ 0x10808170714071206100607060a14141412170e170917071407120606060814141412170e170917071407120606060806140c050400020306030b06090203080004040c03120400020206030c020202020203100400020206030c120a04080600160416030114141412101012080908080812070707070612000a14141412101012080908080812070707070612000a14141412101012081008090812070707070612000a060608040200080306030b06090203080004040c03120400020206030c0403020102030403100400020206030c120a04080600160416030e040b0609020006040a030114141412120910091708140809081707070717000a14141412120910091708140809081707070717000a14141412120910091708140809081707070717000a060608040200080306030b06090203080004040c031204000202060311040c0804020302040803100400020206030f08080607060212041a030e04010200020308030f0c000202020301141414121010120d170914090a091708170009141414121010120d170914090a091708170009141414121010120d170914090a091708170009060608040200080306030b06090203080004040c031204000202060311040c0804020302040803100400020206030f08080607060212041a030e0402020206030f2c0c0202060112041203091207040506001604160301, 0x114141412150e140d10050e050905050000000914141412150e10050e050905050000000814141412150e10050e05090505000000080614141412090507050703030312000100000009141414120905070503031200010000000814141412090507050303120001000000080601132410140c160b020424030f020106000203080410020002020204141414120e0509050705070303030700010009141414120e050905070503030700010008141414120e050905070512000700010008061404030202020310040c080b0402120412030f02020202020410060e0601080308040114141412170e170714030d031200070002000914141412170e17071403030312000714141412170e170714030303120007061410040202060313040b060906030e04120314141412170e1707140303011200070003000914141412170e17071403120003000714141412170e1707140312000606140403020202030b06090203080004040c0301141414121709170717061406030312000600091414141217091708170712000614141412170e1709170712000606140403020202030b06090203080004040c03120400020206030110040002020603011414141217091708] private def node2128:Certificate:=PackedParametricCertificateData.decode 11 data2128 private def node2129:Certificate:=.positive 1 [(1,0),(2,12)] node2128 private def node2130:Certificate:=.positive 9 [(8,0),(3,4),(8,11)] node2129 private def node2131:Certificate:=.positive 4 [(1,0),(1,1),(6,9)] node2130 private def node2132:Certificate:=.positive 7 [(5,0),(4,6),(6,8)] node2131 private def node2133:Certificate:=.positive 1 [(1,0),(2,2)] node2132 private def node2134:Certificate:=.positive 3 [(1,0),(2,6)] node2133 private def data2144:List Nat:=[ 0x114121410120d100d17090a0917081001170009141214101010120d17090a0917081008170009141214101010120d17090a0917081008170009060608040200080306030b06090203080004040c03120400020206030b060502020203100400020206030f08080607060212041a030e0402020206030f24080202060110041003090206020002030203] private def node2144:Certificate:=PackedParametricCertificateData.decode 10 data2144 private def data2205:List Nat:=[ 0x110100d08081707080707060605100106010a14101210100d09081707080707060605100106010a06141004020206030b06090203080004040c03120400020206030110040002020603010200040202030114121010120a09090707070614030d03120007000a14121010120d120a0909070714030d03120007000a14121010120d120a090907070d031200100007000a060608040200080306030b06090203080004040c030c02030202020314121410121009091208090807071005070312000a14101210101009091208090807071005070312000a14121410120a09090707070610050703120010000a060608040200080306030b06090203080004040c031204000202060301100400020206030c02090200020302030b02080200020302030114140e090a0807071403120308030503090107000a14140e090a0807071403120308030901030107000a14140d0d0e090a080707120308030901030107000a060608040200080306030b06090203080004040c030c0208020502040204040314101210120917081008090808070707100117000a14101209100809080807090507031700100007000a14101209100809080807090507031700100007000a060608040200080306030b06090203080004040c031204000202060301100400020206030f08080607060212041a030e04010200020308030f0c000202020301, 0x10000000a14101210150d100d0a0a100709050705050000000a0612100908100708070905070503031200010000000a12100908100708070905070503031200010000000a12100908100708070905070503031200010000000a0601132410140c160b020424030f02010600020308040c040302010203040414141210100d08081007090507051200070001000a14141210100d08081007090507051200070001000a14141210100d08081007090507051200070001000a061404030202020310040c080b0402120412030f0202020202040c04030201020304040114101210100d09080808170710071200070001000a14101210100d09080808170710071200070001000a14101210100d09080808170710071200070001000a061410040202060313040b060906030e04120314101210100d09080808170710071200070001000a14101210100d09080808170710071200070001000a14101210170d100d0808170712000d00070001000a06140403020202030b06090203080004040c03010c020202020204100400020206030114101210100d09081707080712060706060510010a14101210100d08081707080707060605100106010a14101210100d09081707080707060605100106010a06141004020206030b06090203080004040c030c02030202020314101210100d09080808170708071206070606050a141012, 0x114101210150d100d0a0a100709050705050000000a14101210150d100d0a0a10070905070505] private def node2205:Certificate:=PackedParametricCertificateData.decode 10 data2205 private def node2206:Certificate:=.split node2144 node2205 private def node2207:Certificate:=.positive 1 [(1,0),(2,12)] node2206 private def node2208:Certificate:=.positive 3 [(2,0),(3,3),(2,11)] node2207 private def node2209:Certificate:=.positive 4 [(1,0),(1,1),(6,9)] node2208 private def node2210:Certificate:=.positive 7 [(5,0),(4,6),(6,8)] node2209 private def node2211:Certificate:=.positive 1 [(1,0),(2,2)] node2210 private def data2234:List Nat:=[ 0x11412100e120d0a0907070e030d031001090000000a14121212100e120d07070e030d031001090000000a14121212100e120d07070e030d031001090000000a060608040200080306030b06090203080004040c03080206020202030e020b040402030204100400020206030f040c0608060306040a030e0402020206030802020601100006040a030a080907070712030e030503030117000a0007000a0d0d0a080907070712030e03080303010a0007000a0d0d0a080907070712030e03080303010a0007000a060608040200080306030b06090203080004040c03080206020202030f0e120d0f0d17090a091708170317000f00090f0e120d17090a09170817030f0317000f0009100e0f0e120d0a09170817030f0317000f0009060608040200080306030b06090203080004040c031204000202060301100400020206030f08080607060212041a030e0402020206030f2408020206011004100301] private def node2234:Certificate:=PackedParametricCertificateData.decode 10 data2234 private def data2246:List Nat:=[ 0x10d0d0a08070712030e030503090103010a0007000a0d0d0a08070712030e030803090103010a0007000a0d0d0a08070712030e030803090103010a0007000a0606080402000803060313040b060906030e0412030d0d0a08070712030e030503090103010a0007000a0d0d0a08070712030e030803090103010a0007000a0d0d0a08070712030e030803090103010a0007000a060608040200080306030b06090203080004040c03010b060502020204100400020206030f08080607060212041a030e04010200020308030f0c0002020203] private def node2246:Certificate:=PackedParametricCertificateData.decode 9 data2246 private def data2306:List Nat:=[ 0x1020004020203011412120d09090707080508040e030d03090300000a1412120d09090707080508040e030d03090300000a1412120d0909080508040e030d030903120000000a0611040d040606030203132410140c160b020424030f0201060002030804100200020202041412120d0707090608050e030d030902070000000a1412120d0707090608050e030d030902070000000a1412120d090608050e030d0309021200070000000a0606020302000203020310040c080b0402120412030f0202020202040c02020202020401010200040202041412120d070708050e030d0309030902070006000a1412120d070708050e030d030d020902070006000a1412120d07070a0508050e030d030d02070006000a0606060504000803060310040c080b0402120412030f02020202020410060e06010803080410040d0209020106040a031412120d07070e030d03090309021201070006000a1412120d07070e030d03090309021201070006000a1412120d07070e030d03090309021201070006000a0606080402000803060313040b060906030e04120314121212120d07070e030d03090312010f0007000a1412120d07070e030d03090312010f00070006000a1412120d07070e030d03090312010f00070006000a060608040200080306030b06090203080004040c03010e020b04040203020410040002020603010101, 0x1090507051001050000000a100e0f0e150d100d0f07090507051001050000000a06100e100d0f0d10091007090507051200010000000a100e100d0f0d10091007090507051200010000000a100e100d0f0d10091007090507051200010000000a0601132410140c160b020424030f020106000203080410020002020204100e100d0f0d10070905070510011200070001000a100e100d0f0d10070905070510011200070001000a100e100d0f0d10070905070510011200070001000a061404030202020310040c080b0402120412030f0202020202040c040302010203040401100e100d0f0d08081707100710010f01120007000a100e100d0f0d08081707100710010f01120007000a100e100d0f0d0808170710070f071001120007000a061410040202060313040b060906030e0412030c0203020202040c0202020202041004000202060301100e100d0f0d09081007080707060f01060112000a100e100d0f0d09081007080707060f01060112000a100e100d0f0d09081007080707060f01060112000a061410040202060313040b060906030e041203100e100d0f0d09081007080707060f01060112000a100e100d0f0d09081007080707060f01060112000a100e100d090810070807070610010f01060112000a06141004020206030b06090203080004040c03010c020b06040203020404041004000202060301, 0x1100e0f0e150d100d0f07090507051001050000000a100e0f0e150d100d0f07] private def node2306:Certificate:=PackedParametricCertificateData.decode 9 data2306 private def node2307:Certificate:=.split node2246 node2306 private def node2308:Certificate:=.split node2234 node2307 private def node2309:Certificate:=.positive 1 [(1,0),(2,12)] node2308 private def node2310:Certificate:=.positive 1 [(1,2),(2,11)] node2309 private def node2311:Certificate:=.positive 2 [(1,0),(1,1),(2,10)] node2310 private def node2312:Certificate:=.positive 7 [(5,0),(4,6),(6,8)] node2311 private def data2335:List Nat:=[ 0x1141212120e0e120d0d0d0e0909090907070701010a14120e0e120d0d0d09090e07090707070d0101010a1412120d0d0d0e0909090e0709070707120101010a060608040200080306030b06090203080004040c03080206020202030e1e0c080a0c0416041604100400020206030c02050203020302030e0402020206030d080612021201100418030d0d140b0e090a080e0707071203080305030a000a0d0d140b0e090a080e0707071203080303010a000a0d0d140b0e090a080e0707071203080303010a000a060608040200080306030b06090203080004040c03080206020202030d0d0e0910080a080e070e030a030e000a00090d0d0e0910080a080e070e030a030e000a00090d0d0e0910080a080e070e030a030e000a0009060608040200080306030b06090203080004040c031204000202060301100400020206030f04060c02120316030e0402020206030d0806120212011004180301] private def node2335:Certificate:=PackedParametricCertificateData.decode 10 data2335 private def data2347:List Nat:=[ 0x10d0d0d090a080e07080707071203080309010e000a0e0e0d0d0d090a080e07080707071203080309010a0e0e0d0d0d090a080e07080707071203080309010a0606080402000803060313040b060906030e0412030e0e0d0d0d090a080e07080707071203080309010a0e0e0d0d0d090a080e07080707071203080309010a0e0e0d0d0d090a080e07080707071203080309010a060608040200080306030b06090203080004040c03010e0c0c0c0a120516041604100400020206030f04060c02120316030e0401020002030803060602060004030403] private def node2347:Certificate:=PackedParametricCertificateData.decode 9 data2347 private def data2408:List Nat:=[ 0x100000a14120e0e0d0d0a0a07070d0101010800030000000a0614120e0e120d09090e07070709060804010100000a14120e0e120d09090e07070709060804010100000a14120e0e120d09090e07070709060804010100000a0601010f0201060002030804100200020202040e0e120d090912080e070707090612030d0100000a0e0e120d090912080e070707090612030d0100000a0e0e120d090912080e070707090612030d0100000a060602030200020302031004090402060306030f040b06031200040416040c02020202020401010200040202040e0e120d1209090912080707070612030d0100000a0e0e120d090912080e070707070612030d0100000a0e0e120d090912080e070707070612030d0100000a060606050400080306031004090402060306030f02020202020410060e0601080308040d02060201060306030e0e120d0d0d09090e070707080512030d0100000a0e0e120d0d0d09090e070707080512030d0100000a0e0e120d0d0d09090e070707080512030d0100000a0606080402000803060313040b060906030e0412030e0e120d0d0d0d0909090707080512030d0100000a0e0e120d0d0d09090e070707080512030d0100000a0e0e120d0d0d09090e070707080512030d0100000a060608040200080306030b06090203080004040c03010e0c0c0c0a12051604160410040002020603010101, 0x1010a00060416041002000202020412100d0d09090908140710070a071200070001000a12100d0d09090908140710070a071200070001000a12100d0d09090908140710070a071200070001000a06140403020202030b0209020504020e040a030b060404030a00040412040c04030201020304040112100d0d0b0a10070a07080714050700050001000a12100d0d0b0a0a0910070a0708071005070005000a12100d0d0b0a0a0910070a0708071005070005000a061410040202060313040b060906030e0412030b060404030a00040412040c020202020204100400020206030112100d0d0b0a10070a07080714050700050001000a12100d0d0b0a0a0910070a0708071005070005000a12100d0d0b0a0a0910070a0708071005070005000a061410040202060313040b060906030e0412030b18050a041a0006042a040c0e0a060406030a0410041004000202060301020004020203010d0d0d0c0b090909070712030b030b00090000000a14120d0d0b090909070712030b030b00090000000a14120d0d0b090909070712030b030b00090000000a061412120d0909070709061203060303020e0000000a1412120d0909070709061203060303020e0000000a1412120d090907070906060303020a010e0000000a060114120e0e0d0d0a0a07070d0101010800030000000a14120e0e0d0d0a0a07070d01010108000300, 0x112100d0d0b0a0a07080714010d010e00050000000a12100d0d0b0a0a07080714010d010e00050000000a12100d0d0b0a0a07080714010d010e00050000000a0614120909080814070d070a0703031200010000000a14120909080814070d070a0703031200010000000a14120909080814070d070a0703031200010000000a0601130405020202030b040406] private def node2408:Certificate:=PackedParametricCertificateData.decode 9 data2408 private def node2409:Certificate:=.split node2347 node2408 private def node2410:Certificate:=.split node2335 node2409 private def node2411:Certificate:=.positive 1 [(2,0),(1,3)] node2410 private def data2440:List Nat:=[ 0x114120e0e120d0d0d0e0909090e070907070701010a14120e0e120d0d0d09090e07090707070d0101010a1412120d0d0d0e0909090e0709070707120101010a06140403020202030a0403040202030603141212120e0e120d0d0d0e0909090907070701010a14120e0e120d0d0d09090e07090707070d0101010a1412120d0d0d0e0909090e0709070707120101010a060608040200080306030b020a02030400020406030110060e0a0708040c040c04100400020206030b0603020202030e0402020206030d08061202120110041803120d0d0d0e090a0809070707120308030a0002000a120d0d0d0e090a0809070707120308030a0002000a120d0d0d0e090a0809070707120308030a0002000a06140403020202030a0403040202030603120d0e090a080e070707120305030e0203010a000a120d0e090a0809070707120308030e0203010a000a120d0d0d0d0c0e090a0807071203080303010a000a060608040200080306030b020a0203040002040603010d0d0e0910080a080e070e030a030e000a00090d0d0e0910080a080e070e030a030e000a00090d0d0e0910080a080e070e030a030e000a0009060608040200080306030b020a02030400020406031204000202060301100400020206030f04060c02120316030e0402020206030d0806120212011004180301] private def node2440:Certificate:=PackedParametricCertificateData.decode 10 data2440 private def data2449:List Nat:=[ 0x10d0d0d090a080e07080707071203080309010e000a0d0d0d090a080b07080707071203080309010e000a0d0d0d090a080b07080707071203080309010e000a06140403020202030a0403040202030603080206020202040c0607060508030804100400020206030f04060c02120316030e0401020002030803060602060004030403] private def node2449:Certificate:=PackedParametricCertificateData.decode 9 data2449 private def data2507:List Nat:=[ 0x106030b00070000000a120d0909120807071203090306030b00070000000a120d0909120807071203090306030b00070000000a060114120e0e0d0d0a0a07070d0101010800030000000a14120e0e0d0d0a0a07070d0101010800030000000a14120e0e0d0d0a0a07070d0101010800030000000a06120d100b09090b0707070906060301010b0000000a0e0e120d100b09090b070707060301010b0000000a120d100b0909070708040603030201010b0000000a060101080203060002030804100200020202040e0e120d0e0b0d0909090b07070712030d0100000a0e0e120d0e0b0d0909090b07070712030d0100000a0e0e120d0d0d0d0909090b07070712030d0100000a060602030200020302030f0402020202030802030600020308040c02020202020401010200040202040e0e120d0e0b0d0909090b07070712030d0100000a0e0e120d0e0b0d0909090b07070712030d0100000a0e0e120d0d0d0d0909090b07070712030d0100000a06140403020202030f0402020202030802060202020410060706050601020408040c020102020203120d0e0b0d0909090b0707070a0512030d0100000a120d0e0b0d0909090b0707070a0512030d0100000a0e0e120d0d0d0d0909090b07070712030d0100000a06140403020202030a0403040202030603080206020202040c060706050803080410040002020603010101, 0x1000a12100d0d0c0a0a07080714010d010e00050000000a061412100b090914070d070a0703031200010000000a1412100b090914070d070a0703031200010000000a1412100b090914070d070a0703031200010000000a060113040502020203080404060112000a0422041002000202020412100d0d0908140710070a0703031200070001000a12100d0d0908140710070a0703031200070001000a12100d0d0908140710070a0703031200070001000a06140403020202030a040504020e030a030802030600020308040c040302010203040401141212100d0d10070a07080714051200070005000a141212100d0d10070a07080714051200070005000a12100d0d0a0910070a07080710051200070005000a06141004020206030a04030402020306030802030600020308040c0202020202041004000202060301141212100d0d10070a07080714051200070005000a141212100d0d10070a07080714051200070005000a12100d0d0a0910070a07080710051200070005000a06140c050400020306030a04030402020306030808050604060002040e040c0e0a060406030a04100410040002020603010200040202030115100d0d0d0c09090707120311030a00090000000a15100d0d0d0c09090707120311030a00090000000a15100d0d0d0c09090707120311030a00090000000a06120d09091208070712030903, 0x112100d0d0c0a0a07080714010d010e00050000000a12100d0d0c0a0a07080714010d010e00050000] private def node2507:Certificate:=PackedParametricCertificateData.decode 9 data2507 private def node2508:Certificate:=.split node2449 node2507 private def node2509:Certificate:=.split node2440 node2508 private def data2535:List Nat:=[ 0x1140c120c0a080e070907070708030a00000009140c120c0a080e070907070708030a00000009140c120c0a080e070907070708030a000000090606060504000803060313040a0c030e0312030e020702050203020410040e0206040406040604100400020206030b0603020202030e0402020206030d0401080006030603120c170a0c0a170917080c0807071700020009120c170a0c0a170917080c08070717000200091710120c170a0c0a17080c080e0707071700090606060504000803060313040a0c030e0312030e0e120c170a0c0a170917080c080e07030217000a0e0e120c170a0c0a170917080c080e07030217000a1710120c170a0c0a17080c080e070707030217000a06142007020002030c030b020a0203040002040603010e0e120c170a0c0a1709170814030d031700090e0e120c170a0c0a17080c080e070a03170009100e120c170a0c0a17080c080e070a03170009060608040200080306030b020a02030400020406031204000202060301100400020206030f04060c02120316030e0402020206030f120d02010403060301] private def node2535:Certificate:=PackedParametricCertificateData.decode 10 data2535 private def data2544:List Nat:=[ 0x1120c0c0a12090a0909080a0708070707100009120c0c0a12090a0909080a0708070707100009120c12090a0909080a070807070710000a00090606060504000803060313040a0c030e031203080206020202040c0c0a0606060510041004100400020206030f04060c02120316030e04010200020308030f0c0002020203] private def node2544:Certificate:=PackedParametricCertificateData.decode 9 data2544 private def data2602:List Nat:=[ 0x10900000009060c0a12090a0807070c0309030a0007000000090c0a12090a0807070c0309030a0007000000090c0a12090a0807070c0309030a0007000000090601140c120c0a080e070707140112010800000009140c120c0a080e070707140112010800000009140c120c0a080e07070714011201080000000906120c0a080707090306030d0101010a00000009120c0a080707090306030d0101010a00000009120c0a080707090306030d0101010a000000090601010702030601040004040e0410020002020204140c120c0a0807070c0309030d010a00000009140c120c0a0807070c0309030d010a00000009140c120c0a080e07070709030d010a00000009060602030200020302030f0402020202030706031202040008041e040c0202020202040101020004020204140c120c0a0807070c0309030d010a00000009140c120c0a0807070c0309030d010a00000009140c120c0a0807070c0309030d010a00000009060606050400080306030f0402020202030706060602040002040c04100c060605060108040e040c020102020203120c0d090a0807070c03090314010d010a0009120c0a0807070c03090314010d010a00000009140c120c0a0807070c0309030d010a000000090606060504000803060313040a0c030e0312030712060a050c00020418040c08060605060404040a0410040002020603010101, 0x11514140c0a08080714010d01080005000000091514140c0a08080714010d01080005000000091514140c0a08080714010d010800050000000906140c0a081407080709030d010a000100000009140c0a081407080709030d010a000100000009140c0a081407080709030d010a00010000000906011304050202020307040406011a000e042e0410020002020204140c0a081407080709030d0112000a00070009140c0a081407080709030d0112000a00070009140c0a081407080709030d0112000a0007000906140403020202030a040504020e030a030706031202040008041e040c040302010203040401140c0a081407080709030d010a000700050009140c0a081407080709030d010a000700050009140c0a081407080709030d010a000700050009061410040202060313040a0c030e0312030802030600020308040c0202020202041004000202060301140c0a081407080709030d010a000700050009140c0a081407080709030d010a000700050009140c0a081407080709030d010a00070005000906140c0504000203060313040a0c030e0312030808050604060002040e040c0e0606040a03060410041004000202060301020004020203011510120c0c0a0a080e0707070c0309000000091510120c0c0a0a080e0707070c0309000000091510120c0c0a0a080e0707070c03] private def node2602:Certificate:=PackedParametricCertificateData.decode 9 data2602 private def node2603:Certificate:=.split node2544 node2602 private def node2604:Certificate:=.split node2535 node2603 private def node2605:Certificate:=.split node2509 node2604 private def node2606:Certificate:=.split node2411 node2605 private def node2607:Certificate:=.positive 1 [(1,4),(2,9)] node2606 private def node2608:Certificate:=.positive 3 [(5,3),(1,6),(4,8)] node2607 private def node2609:Certificate:=.split node2312 node2608 private def node2610:Certificate:=.split node2211 node2609 private def node2611:Certificate:=.split node2134 node2610 private def data2671:List Nat:=[ 0x114120e0e120d0d0d0e0909090e070907070701010a14120e0e120d0d0d09090e07090707070d0101010a1412120d0d0d09090e07090707071201010109000a0614040302020203010f02020202020410060e0601080308040702040202020314120e0e120d0d0d0e0909090e070907070701010a14120e0e120d0d0d09090e07090707070d0101010a1412120d0d0d0e0909090e0709070707120101010a06140403020202030a0403040202030603141212120e0e120d0d0d0e0909090907070701010a14120e0e120d0d0d09090e07090707070d0101010a1412120d0d0d0e0909090e0709070707120101010a060608040200080306030b020a02030400020406030110060e0a0708040c040c0410040002020603010e0402020206030d08061202120110041803120d0e090a080907070712030503030111000a000a120d0e090a080907070712030803030111000a000a120d0d0d0d0c0e090a0807071203080303010a000a060608040200080306030b020a02030400020406030e02070205020302030d0d0e0910080a080e070e030a030e000a00090d0d0e0910080a080e070e030a030e000a00090d0d0e0910080a080e070e030a030e000a0009060608040200080306030b020a02030400020406031204000202060301100400020206030f04060c02120316030e0402020206030d080612021201100418030101, 0x1030c00090000000a14121510120d0d0c070712030c030c00090000000a141215100d0c0909070712030c030c00090000000a06120d0909120807071203090306030b00070000000a120d0909120807071203090306030b00070000000a120d0909120807071203090306030b00070000000a06010f040202020204080203060002030804100200020202040c0201020202040b0602020002030404120d120909090707120309030b000700060000000a120d120909090707120309030b000700060000000a120d1209090907071203090304030b00060000000a060b0205060202030f0402020202040f020106000203080410020002020204120d12090d090c090909070712030e00070001000a120d12090d090c090909070712030e00070001000a120d12090d090c090909070712030e00070001000a06140403020202030e0e120d0e0b0d0909090b07070712030d0100000a0e0e120d0e0b0d0909090b07070712030d0100000a0e0e120d0d0d0d0909090b07070712030d0100000a061404030202020301080206020202041006070605060102040804010b060302020204010d0809100602020204080308040502010200040404040d0d09090a080907070712030c030e00070001000a0d0d09090a080907070712030c030e00070001000a0d0d09090a080907070712030c030e00070001000a0614040302020203, 0x114121510120d0d0c070712030c] private def node2671:Certificate:=PackedParametricCertificateData.decode 11 data2671 private def data2734:List Nat:=[ 0x100000906060605040008030603010f02020202020410060e06010803080407020402020203140c120c0a080e070907070708030a00000009140c120c0a080e070907070708030a00000009140c120c0a080e070907070708030a000000090606060504000803060313040a0c030e0312030d0d140c120c0a0809070707080310020a0000000a0d0d140c120c0a0809070707080310020a0000000a0d0d140c120c0a0809070707080310020a0000000a06141004020206030b020a02030400020406030110040e020604040604060410040002020603010e0402020206030d0401080006030603120c170a0c0a17080c080e0717001100020009120c170a0c0a17080c080e07070717001100091710120c170a0c0a17080c080e0707071700090606060504000803060313040a0c030e0312030e0e120c170a0c0a17080c080e070703170011000a120c170a0c0a17080c080e0707030302170011000a1710120c170a0c0a17080c080e070707030217000a06142007020002030c030b020a0203040002040603010e0e120c170a0c0a17080c08120317001100090e0e120c170a0c0a17080c080e070a03170009100e120c170a0c0a17080c080e070a03170009060608040200080306030b020a02030400020406031204000202060301100400020206030f04060c02120316030e0402020206030f120d0201040306030101, 0x10000091510120c0c0a0a080e0707070c030900000009060c0a12090a0807070c0309030a0007000000090c0a12090a0807070c0309030a0007000000090c0a12090a0807070c0309030a00070000000906010f0402020202040702030601040004040e04100200020202040c0201020202040b06020200020304040c0a12090a0807070c0309030a0007000000090c0a12090a0807070c0309030a0007000000090c0a12090a0807070c0309030a000700000009060b0205060202030f0402020202040f0201060002030804100200020202040c0a12090a080c0309030e000a0007000100090c0a12090a080c0309030e000a0007000100090c0a12090a080c0309030b000a0007000100090614040302020203140c120c0a0807070c0309030d010a00000009140c120c0a0807070c0309030d010a00000009140c120c0a0807070c0309030d010a0000000906060605040008030603010706060602040002040c04100c060605060108040e04010b060302020204010d0c09180002030a030e04080200020302040c0a0a08090707070c030e000a0009000100090c0a0a08090707070c030e000a0009000100090c0a0a08090707070c030e000b0009000100090614040302020203140c120c0a080e070907070708030a00000009140c120c0a080e070907070708030a00000009140c120c0a080e070907070708030a00, 0x11510120c0c0a0a080e0707070c0309000000091510120c0c0a0a080e0707070c030900] private def node2734:Certificate:=PackedParametricCertificateData.decode 11 data2734 private def node2735:Certificate:=.split node2671 node2734 private def node2736:Certificate:=.negative 1 [(3,5),(1,6)] node2735 private def data2800:List Nat:=[ 0x10c000a0009000906060605040008030603010f02020202020410060e060108030804010a080c0707070803140112010c000a000900090a080c0707070803140112010c000a000900090a080c0707070803140112010c000a000900090606060504000803060306020304020203120d0d0d0a080c070707080310020e020a0009000a120d0d0d0a080c070707080310020e020a0009000a120d0d0d0a080c0707070803100212010a0009000a0614100402020603060203040202030110040e020604040604060410040002020603010e0402020206030d04010800060306031614170a160a170816080c07070717000200091614170a160a170816080c07070717000200091614170a160a170816080c0707071700020009060606050400080306031404030202020316140d0d170a160a170816080c070707030217000a16140d0d170a160a170816080c070707030217000a16140d0d170a160a170816080c070707030217000a06142007020002030c0314040302020203010d0d170a160a170816080c070c030a031700090d0d170a160a170816080c070c030a031700090d0d170a160a170816080e070c070a03170009060608040200080306030b0c030a01020006041203120400020206030110040002020603100402020202030e0402020206030f120d020104030603010107020102020204060804060018031a04, 0x10006000000091514151212090a091208090309000600000009060b0205060202040a04030402020306040702030601040004040e0410020002020204070201060002030804060602080002030a0415141512150a12090a0912080903090000000915141512150d12090a0912080903090000000915141512150d12090a091208090309000000090612090a090a08070709030e000c000a0000000912090a090a080707090310000e000a0000000912090a090a080707090310000b000a0000000906010a04030402020306040f02010600020308041002000202020407020402020204060603020206030804010d240418000e0316030e1003020006030604161416121512160a15091208090715060000091515161416121512160a150912080907000009161416121512160a15091208090715060000090616141612160a1208090710000a00090000000916141612160a1208090710000a00090000000916141612160a1208090710000a00090000000906010a04030402020306040f020106000203080410020002020204160a0a08090809070e040704160304010c00091614160a0a08090809071004080405040c00091614160a0a08090809071004070404010c000906140403020202030a080c0707070803140112010c000a000900090a080c0707070803140112010c000a000900090a080c070707080314011201, 0x115141512150a12090a091208090309000000091514151212090a091208090309] private def node2800:Certificate:=PackedParametricCertificateData.decode 13 data2800 private def node2801:Certificate:=.split node2736 node2800 private def node2802:Certificate:=.positive 8 [(5,4),(1,6),(24,8)] node2801 private def node2803:Certificate:=.negative 1 [(1,0),(2,2)] node2802 private def node2804:Certificate:=.negative 4 [(1,0),(3,1),(1,2)] node2803 private def node2805:Certificate:=.negative 1 [(1,0),(1,3)] node2804 private def node2806:Certificate:=.split node2611 node2805 private def node2807:Certificate:=.split node2064 node2806 private def node2808:Certificate:=.split node1393 node2807 private def node2809:Certificate:=.split node748 node2808 private def zz522:"s020a"="s020a":=by decide+kernel private theorem valid109:check node109 ctx109 quad109 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid115:check node115 ctx115 quad115 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid109 private theorem valid368:check node368 ctx368 quad368 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid618:check node618 ctx618 quad618 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz523:"s020b"="s020b":=by decide+kernel private theorem valid744:check node744 ctx744 quad744 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · exact valid618 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid748:check node748 ctx748 quad748 (hinges.drop 1) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid115 · apply NatParametricCheckSteps.split_valid · exact valid368 · exact valid744 private theorem valid853:check node853 ctx853 quad853 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid858:check node858 ctx858 quad858 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid853 private def zz524:"s020c"="s020c":=by decide+kernel private theorem valid941:check node941 ctx941 quad941 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1135:check node1135 ctx1135 quad1135 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1388:check node1388 ctx1388 quad1388 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1391:check node1391 ctx1391 quad1391 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid1135 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1388 private def zz525:"s020d"="s020d":=by decide+kernel private theorem valid1393:check node1393 ctx1393 quad1393 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid858 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid941 · exact valid1391 private theorem valid1463:check node1463 ctx1463 quad1463 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1566:check node1566 ctx1566 quad1566 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1570:check node1570 ctx1570 quad1570 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1566 private def zz526:"s020e"="s020e":=by decide+kernel private theorem valid1651:check node1651 ctx1651 quad1651 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1726:check node1726 ctx1726 quad1726 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1729:check node1729 ctx1729 quad1729 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1463 · apply NatParametricCheckSteps.split_valid · exact valid1570 · apply NatParametricCheckSteps.split_valid · exact valid1651 · exact valid1726 private theorem valid1796:check node1796 ctx1796 quad1796 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz527:"s020f"="s020f":=by decide+kernel private theorem valid1864:check node1864 ctx1864 quad1864 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1796 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1993:check node1993 ctx1993 quad1993 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1864 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2063:check node2063 ctx2063 quad2063 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid1993 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2134:check node2134 ctx2134 quad2134 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz528:"s0210"="s0210":=by decide+kernel private theorem valid2211:check node2211 ctx2211 quad2211 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2311:check node2311 ctx2311 quad2311 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2509:check node2509 ctx2509 quad2509 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2605:check node2605 ctx2605 quad2605 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.split_valid · exact valid2509 · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz529:"s0211"="s0211":=by decide+kernel private theorem valid2606:check node2606 ctx2606 quad2606 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2605 private theorem valid2610:check node2610 ctx2610 quad2610 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · exact valid2211 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2311 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2606 private theorem valid2803:check node2803 ctx2803 quad2803 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2806:check node2806 ctx2806 quad2806 (hinges.drop 3) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid2134 · exact valid2610 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2803 private def zz530:"s0212"="s0212":=by decide+kernel private theorem valid2808:check node2808 ctx2808 quad2808 (hinges.drop 1) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1393 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid1729 · exact valid2063 · exact valid2806 private theorem valid2809:check node2809 ctx2809 quad2809 (hinges.drop 0) = true:=by apply NatParametricCheckSteps.split_valid · exact valid748 · exact valid2808 theorem certificate_valid:check node2809 constraintsNat base hinges = true:=valid2809 theorem nonnegative (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i):0 ≤ slack t x:=by unfold slack apply div_nonneg · apply check_sound node2809 constraintsNat base hinges t x ht0 ht1 _ certificate_valid intro i have hC (j:Fin 4):0 ≤ linearEval (constraints j) x:=by fin_cases j <;> simpa [constraints,linearEval,Fin.sum_univ_succ] using hx _ exact hC ⟨i % 4,Nat.mod_lt _ (by decide)⟩ · norm_num [normalizationDenominator] end Green24Proof.QuadNearBalanceCase2 private def zz2178:"s0882"="s0882":=by decide+kernel end section namespace Green24Proof.QuadNearBalanceCase3 open ParametricQuadraticCertificates hiding Certificate check check_sound open NatParametricCertificates open NatBacksubRecoveredQuadraticCertificates (cons) open IntegerQuadraticCertificates (Linear Point linearEval combinationCheck) def constraints:Fin 4 → Linear:=![![1,0,0,0], ![0,1,0,0], ![0,0,1,0], ![0,0,0,1]] def base:Quadratic:=![![![0x11bffdf5c3c49c, -0xaa87bee538000, -0xffcb9e57d4000,0xab14e5dd95c0], ![-0xaa87bee538000, -0x598a66949bfca4,0x13e83c05b2a3d0,0x55da62ee47472], ![-0xffcb9e57d4000,0x13e83c05b2a3d0, -0x460ff6eded75a8,0xadab046872d6a], ![0xab14e5dd95c0,0x55da62ee47472,0xadab046872d6a, -0x5543df729c000]], ![![-0x6f690f4db4c0,0,0x19945ca262000, -0x727f5ae944d0], ![0, -0x280966948cdd0, -0x30aa647ae830, -0x2ac0c9ef718], ![0x19945ca262000, -0x30aa647ae830, -0x282085272680,0xa082149c9a0], ![-0x727f5ae944d0, -0x2ac0c9ef718,0xa082149c9a0,0]], ![![-0x3abf21c93900,0xa7a358200,0xe0e1cc12130,0x162c0f166ce0], ![0xa7a358200,0xb87022d1740,0x28f7d1451a40, -0x2c129eccb7d0], ![0xe0e1cc12130,0x28f7d1451a40, -0x8862ab3bde40,0x222326abe800], ![0x162c0f166ce0, -0x2c129eccb7d0,0x222326abe800,0]]] def hinges:Hinges:=[(![0,0, -0x34edce0], ![0,0,1, -3]),(![-0x191a2c19d6b5, -0x50410a4e4d0, -0x110c4aa72df0], ![0,0,1, -1]),(![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490], ![0,0,3, -1]),(![0x4577d1e0e27b,0x2c0f7d034d60,0x1621b29f0da0], ![0,1, -3,0]),(![0x83fc63,0x14904840,0x1e8480], ![0,1, -1,0]),(![0x5b61255b6c84,0, -0x4f5f5c3d2b0], ![0,1,0, -3]),(![0x1327fce0a51aaf,0, -0x1cb26590e0f0], ![0,1,0, -1]),(![-0x5543df729c000,0,0], ![0,3, -2, -1]),(![0x5543df729c000,0,0], ![0,3, -2,1]),(![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0], ![0,3, -1,0]),(![0x60154138c6bd, -0x1119ea5fc70,0], ![0,3,0, -1]),(![0x5543df729c000,0,0], ![0,3,2, -1]),(![-0x1b7e5fd92756,0x1b78ccf2f520,0], ![1, -3,0,0]),(![-0x5543df729c000,0,0], ![1, -2, -3,0]),(![0x5543df729c000,0,0], ![1, -2,3,0]),(![0x1b7e5fd92756, -0x1b78ccf2f520,0], ![1, -1,0,0]),(![-0x5653d9dc04a5,0,0], ![1,0, -3,0]),(![-0x131136072162ed,0,0x249d8ce84e20], ![1,0, -1,0]),(![0, -0xf10e91ec040,0], ![1,0,0, -3]),(![-0x72c9ab9f580,0x7e79f86c7500,0x162194e0eae0], ![1,0,0, -1]),(![0x5543df729c000,0,0], ![1,2, -3,0]),(![-0x61e2cbeeb816,0,0], ![3,0, -1,0]),(![-0x5d6b26ca1a4,0,0], ![3,0,0, -1])] def normalizationDenominator:ℤ:=0xaa87bee538000 noncomputable def slack (t:ℝ) (x:Point):ℝ := (quadraticEval base t x + hingeEval hinges t x) / normalizationDenominator def constraintsNat (i:Nat):Linear := constraints ⟨i % 4,Nat.mod_lt _ (by decide)⟩ private def ctx3774:Nat → Linear:=constraintsNat private def quad3774:Quadratic:=base private def ctx956:Nat → Linear:=cons ![0,0,3, -1] (cons ![0,0,1, -1] (cons ![0,0,1, -3] ctx3774)) private def quad956:Quadratic:=((quad3774 + coefficientProduct ![0,0, -0x34edce0] ![0,0,1, -3] ![0,0,1, -3]) + coefficientProduct ![-0x191a2c19d6b5, -0x50410a4e4d0, -0x110c4aa72df0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1] private def ctx79:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons ![0,1, -1,0] (cons ![0,1, -3,0] ctx956))))) private def quad79:Quadratic:=(((((quad956 + coefficientProduct ![0x4577d1e0e27b,0x2c0f7d034d60,0x1621b29f0da0] ![0,1, -3,0] ![0,1, -3,0]) + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0]) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx955:Nat → Linear:=cons (-![0,1, -3,0]) ctx956 private def quad955:Quadratic:=quad956 private def ctx202:Nat → Linear:=cons ![0,1, -1,0] ctx955 private def quad202:Quadratic:=quad955 + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0] private def ctx197:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] ctx202)))) private def quad197:Quadratic:=((((quad202 + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0] private def ctx277:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons (-![0,1, -1,0]) ctx955))) private def quad277:Quadratic:=(((quad955) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx502:Nat → Linear:=cons (-![0,3, -2, -1]) (cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons (-![0,1, -1,0]) ctx955))) private def quad502:Quadratic:=(((quad955) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) private def ctx501:Nat → Linear:=cons (-![0,3, -2,1]) ctx502 private def quad501:Quadratic:=quad502 private def ctx427:Nat → Linear:=cons ![0,3, -1,0] ctx501 private def quad427:Quadratic:=quad501 + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0] private def ctx953:Nat → Linear:=cons (-![0,1,0, -3]) (cons (-![0,1, -1,0]) ctx955) private def quad953:Quadratic:=(quad955) private def ctx577:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx953) private def quad577:Quadratic:=(quad953 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx800:Nat → Linear:=cons (-![0,3, -2, -1]) (cons ![0,1,0, -1] ctx953) private def quad800:Quadratic:=(quad953 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) private def ctx799:Nat → Linear:=cons (-![0,3, -2,1]) ctx800 private def quad799:Quadratic:=quad800 private def ctx723:Nat → Linear:=cons ![0,3, -1,0] ctx799 private def quad723:Quadratic:=quad799 + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0] private def ctx951:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) ctx953) private def quad951:Quadratic:=(quad953) private def ctx875:Nat → Linear:=cons ![0,3,0, -1] (cons (-![0,3, -1,0]) (cons (-![0,3, -2,1]) ctx951)) private def quad875:Quadratic:=((quad951)) + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx3773:Nat → Linear:=cons (-![0,0,1, -3]) ctx3774 private def quad3773:Quadratic:=quad3774 private def ctx1790:Nat → Linear:=cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx3773) private def quad1790:Quadratic:=(quad3773 + coefficientProduct ![-0x191a2c19d6b5, -0x50410a4e4d0, -0x110c4aa72df0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1] private def ctx1038:Nat → Linear:=cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons ![0,1, -1,0] (cons ![0,1, -3,0] ctx1790))) private def quad1038:Quadratic:=(((quad1790 + coefficientProduct ![0x4577d1e0e27b,0x2c0f7d034d60,0x1621b29f0da0] ![0,1, -3,0] ![0,1, -3,0]) + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0]) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1253:Nat → Linear:=cons ![0,1, -1,0] (cons (-![0,1, -3,0]) ctx1790) private def quad1253:Quadratic:=(quad1790) + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0] private def ctx1149:Nat → Linear:=cons ![0,1,0, -3] ctx1253 private def quad1149:Quadratic:=quad1253 + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3] private def ctx1145:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx1149))) private def quad1145:Quadratic:=(((quad1149 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0] private def ctx1248:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx1253)))) private def quad1248:Quadratic:=((((quad1253) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0] private def ctx1788:Nat → Linear:=cons (-![0,1, -1,0]) (cons (-![0,1, -3,0]) ctx1790) private def quad1788:Quadratic:=(quad1790) private def ctx1329:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx1788)) private def quad1329:Quadratic:=((quad1788) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx1480:Nat → Linear:=cons (-![0,3, -2, -1]) (cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx1788)) private def quad1480:Quadratic:=((quad1788) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) private def ctx1407:Nat → Linear:=cons ![0,3, -2,1] ctx1480 private def quad1407:Quadratic:=quad1480 + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx1785:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1788)) private def quad1785:Quadratic:=((quad1788)) private def ctx1784:Nat → Linear:=cons (-![0,3, -2,1]) ctx1785 private def quad1784:Quadratic:=quad1785 private def ctx1783:Nat → Linear:=cons (-![0,3, -1,0]) ctx1784 private def quad1783:Quadratic:=quad1784 private def ctx1706:Nat → Linear:=cons ![0,3,0, -1] ctx1783 private def quad1706:Quadratic:=quad1783 + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx1960:Nat → Linear:=cons ![0,1, -3,0] (cons ![0,0,3, -1] (cons (-![0,0,1, -1]) ctx3773)) private def quad1960:Quadratic:=((quad3773) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1]) + coefficientProduct ![0x4577d1e0e27b,0x2c0f7d034d60,0x1621b29f0da0] ![0,1, -3,0] ![0,1, -3,0] private def ctx1871:Nat → Linear:=cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons ![0,1, -1,0] ctx1960)) private def quad1871:Quadratic:=((quad1960 + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0]) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1955:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] (cons (-![0,1,0, -3]) (cons ![0,1, -1,0] ctx1960)))) private def quad1955:Quadratic:=((((quad1960 + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0])) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx2656:Nat → Linear:=cons (-![0,1, -3,0]) (cons ![0,0,3, -1] (cons (-![0,0,1, -1]) ctx3773)) private def quad2656:Quadratic:=((quad3773) + coefficientProduct ![0x191a2c19d6b5,0x50410a4e4d0,0x110c5493c490] ![0,0,3, -1] ![0,0,3, -1]) private def ctx2250:Nat → Linear:=cons (-![0,1,0, -3]) (cons ![0,1, -1,0] ctx2656) private def quad2250:Quadratic:=(quad2656 + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0]) private def ctx2056:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx2250))) private def quad2056:Quadratic:=(((quad2250 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0] private def ctx2158:Nat → Linear:=cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) ctx2250) private def quad2158:Quadratic:=(quad2250) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx2248:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) ctx2250) private def quad2248:Quadratic:=(quad2250) private def ctx2652:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) (cons (-![0,1, -1,0]) ctx2656))) private def quad2652:Quadratic:=(((quad2656))) private def ctx2571:Nat → Linear:=cons ![0,3, -2,1] ctx2652 private def quad2571:Quadratic:=quad2652 + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx2332:Nat → Linear:=cons ![0,3,0, -1] (cons ![0,3, -1,0] ctx2571) private def quad2332:Quadratic:=(quad2571 + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0]) + coefficientProduct ![0x60154138c6bd, -0x1119ea5fc70,0] ![0,3,0, -1] ![0,3,0, -1] private def ctx2570:Nat → Linear:=cons (-![0,3, -1,0]) ctx2571 private def quad2570:Quadratic:=quad2571 private def ctx3771:Nat → Linear:=cons (-![0,0,3, -1]) (cons (-![0,0,1, -1]) ctx3773) private def quad3771:Quadratic:=(quad3773) private def ctx2738:Nat → Linear:=cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons ![0,1, -1,0] (cons ![0,1, -3,0] ctx3771))) private def quad2738:Quadratic:=(((quad3771 + coefficientProduct ![0x4577d1e0e27b,0x2c0f7d034d60,0x1621b29f0da0] ![0,1, -3,0] ![0,1, -3,0]) + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0]) + coefficientProduct ![0x5b61255b6c84,0, -0x4f5f5c3d2b0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1] private def ctx3159:Nat → Linear:=cons (-![0,1,0, -3]) (cons ![0,1, -1,0] (cons ![0,1, -3,0] ctx3771)) private def quad3159:Quadratic:=((quad3771 + coefficientProduct ![0x4577d1e0e27b,0x2c0f7d034d60,0x1621b29f0da0] ![0,1, -3,0] ![0,1, -3,0]) + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0]) private def ctx2828:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx3159)) private def quad2828:Quadratic:=((quad3159 + coefficientProduct ![0x1327fce0a51aaf,0, -0x1cb26590e0f0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx2917:Nat → Linear:=cons ![0,3, -2,1] (cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) ctx3159)) private def quad2917:Quadratic:=((quad3159) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1]) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx3157:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) ctx3159) private def quad3157:Quadratic:=(quad3159) private def ctx3154:Nat → Linear:=cons (-![0,3,0, -1]) (cons ![0,3, -1,0] (cons ![0,3, -2,1] ctx3157)) private def quad3154:Quadratic:=((quad3157 + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0]) private def ctx3770:Nat → Linear:=cons (-![0,1, -3,0]) ctx3771 private def quad3770:Quadratic:=quad3771 private def ctx3528:Nat → Linear:=cons ![0,1, -1,0] ctx3770 private def quad3528:Quadratic:=quad3770 + coefficientProduct ![0x83fc63,0x14904840,0x1e8480] ![0,1, -1,0] ![0,1, -1,0] private def ctx3247:Nat → Linear:=cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx3528)) private def quad3247:Quadratic:=((quad3528)) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx3525:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx3528)) private def quad3525:Quadratic:=((quad3528)) private def ctx3522:Nat → Linear:=cons (-![0,3,0, -1]) (cons ![0,3, -1,0] (cons ![0,3, -2,1] ctx3525)) private def quad3522:Quadratic:=((quad3525 + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0]) private def ctx3766:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) (cons (-![0,1, -1,0]) ctx3770))) private def quad3766:Quadratic:=(((quad3770))) private def ctx3684:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] ctx3766) private def quad3684:Quadratic:=(quad3766 + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x527b1f8b7602,0x43597dba1f20, -0x9f437c0] ![0,3, -1,0] ![0,3, -1,0] private def data10:List Nat:=[ 0x116111111160b140a14090b0914041a011400091611160b140a14090b0914041a011400081611160b140a14090b0914041a01140008060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060311020002020203110400020206031008080607060212041a030f04020202060311060e020b06010404060309020002020203] private def node10:Certificate:=PackedParametricCertificateData.decode 11 data10 private def data20:List Nat:=[ 0x1f29ca9f487ccdcf3d2dfa799e81616010201e2a7dbf2ede08cfef5c09d998bb598faf1b0160a010209bbe4bfd7f1faeac7f5dc9590c2d1cd93e8130a010204ebe399e5d3bfada7ebfbefbab4ef80a0f01a090102099de6cebfde868ec49cceedc5dbdd8cf9aa9c1409010206d8c2898ab981dfd2f1e8f1e2f18ea5aefff20a0901020edbbef5abd7ecc8cdc8cbd8edda8ccf87b01a08010216fe9adfd6a1b192d1da809ea2d288c7aadc1408010202fca08bb3a792c6a7ccdec88b88ddb7b183c60808010213c2b999ecdbbaee9ab5d784e0ecbc9185e01a0101021b94b9f6d79dffa6cef4ecbecee2e9edc9b01616000201e1ff869d8bbee3e29bf88da193c5e3e6c4ac130a000206f09394e0b6e9818fe9f7e9ede4b3fccfd01a09000208fe83f6f7f388c9fcaaafd6ddaea8bf83a3e014090002069991d4949395e0bfb0c9bbd6b0f4e3e1fbb80a09000232e4bffda3cdd58b8084dcbbd390d9e2c8901a0800022fc2a49be081cde0bd90c7a0b1e9c8a285b01408000202f4dbbaced0f1f78995a8c2e18fc3bf889a981a0100022cafdce2d4d2e6facfccaeacb5f3eeeadaf01e01b5c9d19bbfb8e0a697d5e0000a08070c03120034043e03150c050400020306030c020b0a030a00080412031304000202060311020002020203110400020206031008080607060212041a030f040102000203080311040b040002030203, 0x101d5bb129bf90b87a304c4e209b6984beddb0b9fce04ccef000197eae2ebc7a2f4e5a9d7dec6b0029ffe04a2f46ea5e432df8f0ed50af9856ea1ff32dddc000ae5cda8cbefa0e0c1afb69f941616020201e0c0ead08388fdf997d8ec8fd4f1aad4c180160a02020287dddcb7b7ff81dcd5e288e789d9d08ad0130a020208a29a85f3e2ebc9abeed4fb96b2dbc9c01a09020209fed8fcf2b4faf39f8cec85ceb0dac8e49da21409020207a6f7c7a6e487e5b58a8ec7aeace28adb97c20a0902020ea1f1f4a4a2b7d495a6f2f8a8dcac9f801a08020257d7e593e2f2e094a6c68592eec384c5e0961408020203b8a5dea1abf7a1e7edb9e4c88af4bae6dd9e080802020f8cedb8f486a8dadab6b4ebbdeedfefc01a0102027fafe78c] private def node20:Certificate:=PackedParametricCertificateData.decode 10 data20 private def data74:List Nat:=[ 0x1d1d09fd1a4edb49c9cb6a4b4cef7a1c6ddab8cf5c5adc4b8e3d2edbfc888c3841607010201d0ceedc08587f2f3ba9ca9a395af859ce1fa87c89bd7c9b091e4d9df969ea8d8e4a99c8793cdbfdeab8e9c080701023a88dc9780dcd2d7b4f8e8c8d281e8f5fc8bd4cad69da3a7d98ffdb9f4a693acb091d3a6bbfebce29db6a8070701020dd4eb99dbededecaca0fabb8ec6f583cbed9fa6fe8eeefa93b8d598a5dabef6f4defcbadda0f7d9b4c5c61a1a000203cadca496e4f1eddcf89db1adb29cf6d1b99f90d5d492fc8ed6a3c190f7bbf48bc8ab89f8fcf9e2e6abfbc0161600020bb0a29098ee8a86d7cbbae9b1a0dbf2b2b6cfc7bbe0affdca88eb89b5c68f85fce8deecb9b5fad7e0801a130002219081b5fe8ebdd39bfd8da7b2aeabf5f79dc0b1bcb4a2c2aa9ed3c2feb4a6d9c6f3b79e8489aa9da1d180131300022ef8daeabfbda6be9cb4f2fdc9dda1aeb9aa9eb4ad818a8af4ecc8dfe9e5e1928688debec2a3c4c9c016080002168ad5f4e8929ebebb9086a18da4909dd9a8f08982baedada8ede2e2f390e8b7ebf1eeb2befca8c6e0801e1babe2d6e2a494b4eb91f5a5d0effff196c8e7a69da8f7edd1d1a3babff6b5d8fb8cdfd880000a08070c03120034043e03150c050400020306030c020b0a030a00080412031304000202060311020002020203110400020206030c0200020202030b02000202020301, 0x1aff4bca3a0a28bc9a5dfb3fce5d6faf1cbceb7ffe6e0c0160802020189c48ed7d4b6f88f89b4aa92b187f0aea6c8ddcb99e1ae86f095ddae96b0b5bbdd9cfddb9ae880baa1f6800808020211d7f6d2c2fe92b3b1ccb593ac95ff93d2aefee4cfb5a1d6b19da084edeeadc6a6e0b8f0c789e1fea0ac80160402021ee784c3e6efb488f5e48cda97fcb8a1a18c80ecd78abbfbf6d6d486d1e1bbaabcda93ec9cb4ecd7e4dd800804020208fafeb3d6dacab79ea29dc6beb0cec5facacbc9e1eea9998da592b6a6f9adc9fc9bd6a5cff7c3f0f8f480040402021ff8d5f5e5f788d3bdf8b7e78596d4a382d9b5a3b687d7d2dcde8aa5a1aedba6b7c39bacf7d9eed1afc01616010201e7e7fe80ca9ae3adbd98f4f5b8d4f5ce9a84c8b083e1d48a8bf5bbc9989be89ad1ca8be8bbea85c58fdec8130b010203a6faf8fcf2a4d8cc8cc9b9cedab0a9d5d3d8c7d689cce4b7b0edfdb5c785f9e58082f287eac7c3fe81b41a0a0102048098d7a6c2e4d9b5acd393f5c28ffbafe48af0899987e280a0d5cae7f68184caf58fb1f78fc5cbcfe3c5800a0a01023899fa849faed48ede9dd39f8594ddbddb9b9bbcb3d7f0c1c8ccbca4bd83e8b1bf9c9384d8cdb891a1e5c01608010203f8e6c2ab8585f385bfadf6b5a2e0f9eac8b2c1fbab86f8c98191d2dae3aac7b8e0d88bf18fca8ffeb88edc0808010202f4efdda88395c4f28fdf88, 0x10284d398e6002fde9882e2a0c4f58cf1c0a6de97dcdef6e7d7dcaf9ceabadbf4eff782a9adfeb39f9c8003a3b701d9983bc7019ffd2edeb240b7f921d2da0fa39f002cdcfa908a92b0fba19ec9a0b4b5e7aab6cda8dfe5b5c8bbb7f2e49c93bed0a7b390a2eed3c08013b2f254eaa50184e5b242cbe70bdcc925f5ba45f7dd2396e00001dfcffbdb8f8e9795bdc8e1a5d3ecc3c0f3e2cac1e8c4c8cde5ca948590bbe9d9f6f4e696c6c0018cd1f84cdfc937dbb31ddda645f08921fcf817f8b60ddbf500228e9f8692c7c5a0a28d8087ede590c6e4d5af8aa9b7a9d8c2cec9e6cacddcb2bdf8df929480338883539ead19b58310ca8c47add2588cb021abc814c7c70014bfdbd0b1ea93d6c9ebae84ed80f7efcd89e7dcbf96c1ace7e5eb91fdc8aa93b784fdf9f2801616020203878ac49880acfee19f80c6aee1e592fbaed1f9c894e3e6cd86cde08efeb29df2efbb89f7dadba5da91b1b01614020203c4df9b9191c9d2f7c2b7e4ddbf89c099cdc9aff0a1adf59281acc6e5d7abbbecfdb5a687b5b5f3ae8495a01414020204c2f58a90e8fdc7e3979c8bb1d6fd81bdf1b69092aebd8d97e9f4a484f3b6bbb1e5d8abb0f1f6a3cd8de5b00b09020203e5dcb3cbeface0dcacf1cb9abee196c1fee9abefced780d5ebafd0d4d7feb395f4f6f8a4c79692a1ca80090902022beeb3f0d9e4efd6c6f0ade3edfaf285b8fecbe6, 0x1fb90c7a0f0ca9e99cfbbc5ffeae2e0bbceebba93c01408010203b4c9c585ce88b1f9b69aa7d0fc89b5fab3a9e8f1d2a884efb6da84e80707010204a9d896dbca9b86f9b2cfaee9d9f584f8a1cfce96a496ce9d90f5c00706010206deb6e6b699bce0e6d9f3aceeb0eb95e7c5c8df9dbae2c5f9eb80161600023c9f93d9f782d3e6a0ac80b5a4bbc6aceadec4d9d9d597d389edfec01a0a000244f1dd8e818bba88bddfdae39794ac8493d3ada0efc9dab9bff285801a0900020e8da1b7fb99b5f9d2868cac8ad086d1e1c9929bb0cac5af82da97e01409000230efcaddb69dfebd8997f6e0e486ca9284bc83f49fba8aa9fb88d7a01a08000203eaf98f9ae9f6f1aff2bcf89cfdd28cf7e797fddee792eada80bc8aa01408000203d2f0bde0e3fdf1dce0b08c80efbace8f9a85dd80faf0ad99f9be88e00707000201dbe5fc82fbde87f0e182edbf8198c6c7e399eabce2f8f9e4caa1801b01a695ec8af797ea97e5ff95d0c4ed83d8b282b89cc000130803060018031a03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206030c0200020202030104ee8bc79401ea83d9a304dc9083a502c0c8a0fe0105c29cb19fddb1f8f3effae5b78a8cd7f3e1f5c594ddc796f9c6feebc592f39ea3f7839c1f91a8e14ea9bddc03b4e2f70ca186f10386e2e1fa5fb0db8303ecbcabf1, 0x1f7c10019e7a1fad982cde49bcbe7a7bfb0a2ebddd68dc6a88d8062e2bf12d8ed028bec028ed50b9ccb19fecb0295f90295fa0014b5ee8ad78ad1d0bbf2dbc4dee0f4beb3dc9ea1febbc00199239173bde63d9dcf01851eb406c5d506c5d6004abdd286d8ad8bd7da91f69ed4ffc2aac7aca38fc0161602022da497a6e3bb9395d9bee8d1faafe8c392feb7b1b4fc9bb18bc1ffb8161402020188d9fb908590e7e9c3e9c9b7bca186cbf9e6b6fadcacda97a490b4d81409020212b1e3f6e3c2dcbf99eae1af9eadd0ffd2bcc0f3a5cfdb9fe9a4fde01a08020203ffbaccf3d9b28da6caadc4baf9a5f6e5c1f6e8cbe380f4c18ae9fc801408020203ec92f6cfdfbbeae0cee284acab9987e7a8d59f9691a7a987d8cee6a00807020206bfabacefb5adaa9aeafdf497ced187ee97f588809ca285a0cbe00706020203eab78bf2d5da90b6daeadaeccd908bb2f0e2b99a87f8d9d1b7a01600020202d7d6a9b0cbf4ce82ffab8190b0cae9c2d1dce087fed0a3d3d8801616010265bcb987f7aba2f7f4ea839ed1f68f9afe86b9a6cbd99db9c6d49ca6161401020ee997be9f91ebd6ff87b39dfacddef2fbbac883dedff6eb96c6d98e1a0e01021adfeb98fec4ddf18dc9c486e3eba3b0b6acccf0adc0a9c09b81f8801409010251dcc9a0e7b29fcacb8fb9c380e8ebabf7b2ef819eaad1818ea8e8981a08010203f6bd8da8ec95da, 0x10906160402020202031616141111060a06080609050e0413010101091616141111060a06080609050e0413010101091616141111060a06080609050e04130101010906150213020008030803011408100a0b060006040e0301161614111a0e0f060a06080606010101020009161614111a0e11060f060a0606010101020009161614111a0e11060f060a06060101010200090616100302020603161616141a0e11060a06080613010201010109161616141a0e11060a060806130102010101091616161411060a0608061301020101010806130803060018031a03011408100a0b060006040e031304000202060301161614111a0e0f060a06080613010801020109161614111a0e0f060a06080613010801020109161614111a0e0f060a0608061301080102010906130803060018031a031504030202020310040c040b04020e040e0313040002020603110200020202030116161411140a1a081408140706061604080109161614111a0e140a1a081408140707161616141a0e14091a08140814070706130803060018031a03151004020206030c020b0a030a000804120313040002020603120411060102030603110400020206030115b7df06aadd0487a4048bb33cc6a642adff0492dd0492de0001b9e191f7dca8d1ada5f8f1fab3ed97e4ac8fbfa8ff9a801af9c601aaae8903f4df03f89e0cd98f57b69a03f7c203, 0x116161411170f140f170e140a0e04060101010916161411140f170e140a0e041401060101010916161411140f170e140a0e041601060101010906161614110f060a060e04160106010101020009161614110f060a060e04140106010101020009161614110f060a060e04160106010101020009060114020106020204141c10140c060b06041c03161614110f060a060e04160106010101020009161614110f060a060e04140106010101020009161614110f060a060e041601060101010200] private def node74:Certificate:=PackedParametricCertificateData.decode 10 data74 private def node75:Certificate:=.split node20 node74 private def node76:Certificate:=.split node10 node75 private def node77:Certificate:=.positive 2 [(1,0),(1,2),(2,8)] node76 private def node78:Certificate:=.positive 13 [(12,0),(3,4),(4,7)] node77 private def node79:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node78 private def node80:Certificate:=.positive 1 [(1,0),(2,11)] node79 private def node81:Certificate:=.positive 3 [(1,1),(6,2),(2,8)] node80 private def node82:Certificate:=.positive 3 [(1,0),(2,7)] node81 private def node83:Certificate:=.positive 3 [(1,1),(3,4),(2,6)] node82 private def node84:Certificate:=.positive 3 [(1,0),(2,5)] node83 private def data105:List Nat:=[ 0x1161616140e0e0a0a11090a0808080a01010108000a161616140e0e0a0a11090a0808080a010a0008000a161616140e0e0a0a11090a0808080a010a0008000a060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060311020002020203110400020206030b0603020202030f0402020206030e040a0601020306031616110b130a13090b0913040e021a011300091616110b130a13090b0913040e021a011300091616110b130a13090b0913040e021a01130009060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060311020002020203110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node105:Certificate:=PackedParametricCertificateData.decode 11 data105 private def data163:List Nat:=[ 0x18ac7b2add3c6ccb99da5d589c98ca5dcd186ceafa080161301022be9b6f5bebafd8394c2c0c5f5ec84f2e8eef798d080130b010201b7bfbbb5dbdfe193edfb8594c986ac91d9c98c94800909010216fce6d0b4aaca92dc80e6c5e1f3bfd99bfcd986c08016080102069197f0fe80cafb8985f6a9dc92cd878cf9a6919880080801024ab9f9bcf098e0dea584b2ccc8d1afe3bcb0ebec90801304010214ab82f9e484dee5859798b48fa9acbaffffe5d5a480080401020cafcabdcafecf8380dcc38ee589eb8cd6c9a99ad0801616000201a1e0839bdbef97f885ebb8fb90c58be7f2bfbba7c0801614000201c3a49ed391b399e2baabbc96f2c58feadfc3fe93e0801613000268ebdfa0db91e5e086beeea1f7bdd9daadd7fa99c0800a0a00020880eeafec85f3bd958191e58b9e8f82bac891a38c80160900021aca97e7e38fb8b4ffe6e1f7a6fd87aac39981d690800909000206e0e4d684e7f5edc4facbe9e0cbe2fbcea0d09390801308000211fad2de9685e3f796c0d09cf5e99fddf8f3b98bc080080800023df2f5a893d0ceb6aa84ddbb88e1d7d69fa3eacfe0801304000227abb2e8eab5ede2c2f0bcd4a7e8edabaea989ead0801e01bdf587aff3ddb68fd3c184ec9cd080000a08070c03120034043e03150c050400020306030c020b0a030a00080412031304000202060311020002020203110400020206030101, 0x1b28fa8e5a9d5de90d0bffb83801106000206d1dddeefaddb8ebbd797c2929db7a2800906000204ebf1faabe28fada7aebdfddcd3d3b4c00606000204ee898797e684aaa7a7a59fb8b7de9db01e1aa0d6d0c290f299b6c0000a08070c03120034043e03150c050400020306030f04020202020313040002020603110200020202030c02010202020301f2d008cbad1fc45efa0888bb1dfdc746beaa23a6810001a58e9fa4d6a6d993d6efafb6baddc6d48029d3c33eeaa11ce48b1fabe43e92be5693b61fc2c627e289000c9eb5b7f38eccbed7ccd9c4c4eb869080161602020188f8c6b0d0c8cbb49fbf9bfeb4c4acb8cbc8acc9e0c61614020202a1a2b4c1f1b7daf8f3a3caafd8bbd3f9bddf9fe9a9fc1414020209c283ededc280daeb9cf2f4b8ba9f9bc183df80fd960b0902025c90e2b8e1d1a083fad3b7c8c6ddea99c4d1dd9780090902021885c6c7b5bf94c9c3ef97c7f6dec9c89ef9acdcc5a0160802020d81a4d4b3ffacbdd39aabfea79ed69efd84a1b9ddc00808020240f6ceffae9987f5ffaea7a6ec8285b38bfd9de1aba0130402020492dbfac9beb7effbffdac2b3c5f7ade6dab181fae0080402021ea7f1c48e8bfb92f7c8fbdcd3d4a2f7eab5b7ae9fc01300020207f6e1e08ac1dcf291d6928bfca59ceaccf5f3a6bfe01616010201919a91eebef291c0f5ab909094b6e98ebab7fe9ba0801614010202, 0x1ccb4faddc21614020220d8838d98b5ca80b4d19997a485bff7ba0a0a02020590c1eebd8fc7eb8fb3898bd4b1ebd4d01609020207cace9cbfb1b1eafeb7b5a9de8fb7ba98090902024897d9fcceeb8ce8bca0e8a981f2f9e40808020208c3acb394dacd84b487fd8ec089d1bea81606020208da9990fe80c383c9b4aba1e2dd958009060202069496cffac890dbe2a5beb6b4fcf181a00101020213fbb781d481dfc4d1b68ac5f6d8828c0800020201b09ddd898fbeab9298fea4dfb4fcddc81616010216f0918f9186f1f5f4c1d9eff0e1999488161401021debe1d5f3979afe9abbb3ecc1aee185e80a0a010205b6cf9df6dfcf8c96f6d9e098e4acd0f016090102078fb393bee18e828c84cddda2d5cec9a00808010208bf8ccdedebeebf94a18085e386e796941606010203ad90e796908a9ec7d791bd97fae1f8c009060102078c81c6d9eebb88b0ac91cde6e0d9ed980701010201a7efbdbaf8cfe1baf5d686c1b0a198800101010201c88cf58bab8aeab7ebc4aeb3c1f5a40800010249abe08fcccfc1b3edbbda99dbbdbfe01616000217eebdea9dd7ffc8cfecd7dfa98fbe9b80161400021b82a8b3afe2afafc68be394b8a5b291800a0a000204e4fea5a0c6cfd4d7ced5e6c3d2ff83c01609000206de9ffcc89ba9f4d4fad8d9bfd680bc800808000208c7d2e2e39dacf8f3e6afa9bc95b1cde00707000204cbceba, 0x1070707160609050e04020201010a1616161408080a0716060a050905020201010906150213020008030803010101161614110b0b0b090a0908040f020a01010108000a161614110f090b09080411020f020a01010108000a161614110b0b0f090b0911020f020a01010108000a06160402020202031616160b0a0a0a0708040f020b020801010104000a1616160b0a0a11090a0708040f020b02080101010a1616160b0a0a11090a0708040f020b02080101010a060a08070c03120034043e0301161616140e0e110b1609090908080202090101010a161616140e0e110b1609090908080202090101010a161616140e0e110b1609090908080202090101010a060702020201020302031616160908080a070707160609050804020201010a1616160908080a070707160609050804020201010a1616160908080a0716060a0509050804020201010a060a08070c03120034043e0301011304000202060301161616140e0e0f0a0a0a110908080a07080401010a161616140e0e0a0a160908080a071606020201010a161616140e0e0a0a160908080a071606020201010a060a08070c03120034043e03150403020202030f0402020202031304000202060311020002020203010c0200020202043fc803e08775e30e8906ecb02ac6a542a8e820f29d0016e4e6fe82b8e7e2b7daf5b01616020215cbabc3cf99c9bb8af4ce83, 0x1090b0911020f020f010a0100000a161614110b0b0b0911020f020f010a01010100000a161614110b0b0b0911020f020f010a01010100000a06161614110b0b0f090b0911020f020a01010108000a161614110b0b0f090b0911020f020a01010108000a161614110b0b0f090b0911020f020a01010108000a060114020106020204161616140e0e110b1609090908080202090101010a161616140e0e110b1609090908080202090101010a161616140e0e110b1609090908080202090101010a06161616140e0e110b1609090908080202090101010a161616140e0e110b1609090908080202090101010a161616140e0e110b1609090908080202090101010a06011402010602020401161614110b0b0b090a090f020a010101080000000a161614110b0b0f090b090a090f020a01010108000a161614110b0b0f090b0911020f020a01010108000a06160402020202031616160b0a0a0a070e0404040f020b02080101010a1616160b0a0a0a070e0404040f020b02080101010a1616160b0a0a0a070e0404040f020b02080101010a0615021302000803080301161616140e0e110b0909080802020901010100000a161616140e0e110b1609090908080202090101010a161616140e0e110b1609090908080202090101010a060702020201020302031616161408080a07070709050e040404020201010a1616161408080a, 0x116161614141111] private def node163:Certificate:=PackedParametricCertificateData.decode 9 data163 private def data192:List Nat:=[ 0x101010a061616141113110b0b0b090a0913081106060101010a1616141113110b0b0b090a0913081106060101010a1616141113110b0b0b090a0913081106060101010a060114020106020204140405020202031616141113110b0b090913080e040404060101010a1616141113110b0b0b090a0913081106060101010a1616141113110b0b0b090a0913081106060101010a061604020202020316161411130809080907110609050e04020101010a16161411130809080907110609050e04020101010a16161411130809080907110609050e04020101010a061502130200080308030114040502020203011616141113110b0b0b090a0909091308060101010a1616141113110b0b0b090a0913081106060101010a1616141113110b0b0b090a0913081106060101010a061610030202060316161614131113080908090711060905020101010a16161614131113080908090711060905020101010a1616161413080908090711060905020101010906130803060018031a03011404050202020313040002020603011616161413110a091308090809070801020108000a1616161413110a091308090809071106080102010a161616140a091308090809071106080102010906130803060018031a03150403020202030c020b020502020a0408031304000202060311020002020203010c0200020202040b020002020204, 0x11616141113110b0b0b090a0913081106060101010a1616141113110b0b0b090a0913081106060101010a1616141113110b0b0b090a09130811060601] private def node192:Certificate:=PackedParametricCertificateData.decode 9 data192 private def node193:Certificate:=.split node163 node192 private def node194:Certificate:=.negative 1 [(1,0),(1,9)] node193 private def node195:Certificate:=.split node105 node194 private def node196:Certificate:=.positive 8 [(9,0),(1,2),(6,7)] node195 private def node197:Certificate:=.positive 13 [(12,0),(3,4),(4,7)] node196 private def node198:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node197 private def node199:Certificate:=.positive 1 [(1,0),(2,11)] node198 private def node200:Certificate:=.positive 1 [(1,0),(2,2)] node199 private def node201:Certificate:=.positive 3 [(1,0),(2,7)] node200 private def node202:Certificate:=.positive 1 [(1,0),(1,4)] node201 private def data230:List Nat:=[ 0x1161616140e0e0a0a11090a0808080a01010108000a161616140e0e110b0a0a11090a0808080a0101010a161616140e0e0a0a16091109090908080a0101010a060a08070c03120034043e03152c080400060312030c040b040704020204060313040002020603110200020202030902080204020106040803161616140e0e0a0a11090a0808080a01010108000a161616140e0e0a0a11090a0808080a010a0008000a161616140e0e0a0a11090a0808080a010a0008000a060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206031102000202020311040002020603010f0402020206030e040a0601020306031616110b130a13090b0913040e021a011300091616110b130a13090b0913040e021a011300091616110b130a13090b0913040e021a01130009060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060311020002020203110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node230:Certificate:=PackedParametricCertificateData.decode 11 data230 private def data272:List Nat:=[ 0x10101010a06150213020008030803010f04020202020401161614110b0b0b090a0908040f020a01010108000a161614110f090b09080411020f020a01010108000a161614110b0b0f090b0911020f020a01010108000a06160402020202031616160b0a0a0a0708040f020b020801010104000a1616160b0a0a11090a0708040f020b02080101010a1616160b0a0a11090a0708040f020b02080101010a060a08070c03120034043e03010f04020202020413040002020603010c0201020202040c0200020202041616160b0a0a110908040f020b020801070102000a1616160b0a0a110908040f020b020801070102000a1616160b0a0a110908040f020b020801070102000a060a08070c03120034043e03150c0d020c02050c0408030f040202020204130400020206030c0202020202031616110b0a0a080404040f0208010701020102000a1616110b0a0a080404040f0208010701020102000a1616110b0a0a110908040f0208010701020102000a060a08070c03120034043e031504030202020316161614160b0a0a1609120808080606070112000a161616140a0a16091208080816060606070112000a161616140a0a16091208080816060606070112000a060a08070c03120034043e03150c05040002030603011304000202060311020002020203010b060302020204010e040a02090603040309020002020204, 0x116161614141111090b0911020f020f010a0100000a161614110b0b0b0911020f020f010a01010100000a161614110b0b0b0911020f020f010a01010100000a06161614110b0b0f090b0911020f020a01010108000a161614110b0b0f090b0911020f020a01010108000a161614110b0b0f090b0911020f020a01010108000a0601140201060202040f040202020204161614110b0b0b090a090f020a010101080000000a161614110b0b0f090b090a090f020a01010108000a161614110b0b0f090b0911020f020a01010108000a06160402020202031616160b0a0a0a070e0404040f020b02080101010a1616160b0a0a0a070e0404040f020b02080101010a1616160b0a0a0a070e0404040f020b0208] private def node272:Certificate:=PackedParametricCertificateData.decode 11 data272 private def node273:Certificate:=.split node230 node272 private def node274:Certificate:=.positive 8 [(9,0),(1,2),(6,7)] node273 private def node275:Certificate:=.positive 13 [(12,0),(3,4),(4,7)] node274 private def node276:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node275 private def node277:Certificate:=.positive 1 [(1,0),(2,11)] node276 private def data305:List Nat:=[ 0x116160f0f0e0e110b09090f080808040402020a010a16160f0f0e0e110b09090f080808040402020a010a16160f0f0e0e110b0a0a09090f08080802020a010a060a08070c03120034043e03152c080400060312030e020b06070403040313040002020603110200020202030b02080604040108040c0316160f0f0e0e110b0a0a09090f08080804040a010a16160f0f0e0e110b0a0a09090f08080804040a010a16160f0f0e0e110b0a0a0f08080802020a0101010a060a08070c03120034043e03152c080400060312030b020a0203040002040603130400020206031102000202020311040002020603010f0402020206030e040a06010203060316160f0f130a0f0a0b090f080b040e0213000916160f0f130a0f0a0b090f080b040e021300091616130a0f0a0b090f080b040e0213000f0009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060311020002020203110400020206031004060c02120316030f0402020206030e040a06010203060301] private def node305:Certificate:=PackedParametricCertificateData.decode 11 data305 private def data347:List Nat:=[ 0x101161611110f0f110b0a0a0f0808080a01010108000a161611110f0f110b0a0a0f0808080a01010108000a16161111110b0a0a0f08080811010a01010108000a061604020202020316161111160b110b0a0a0f080404090201010f000a16161111110b0a0a0f0809050404090201010f000a16161111110b0a0a0f0809070404090201010f000a060a08070c03120034043e030113040c0c0304020e041204130400020206030110020906011200020414040f0608120214000e04220416161111160b110b0a0a0f080404090201010f000a16161111110b0a0a0f0809050404090201010f000a16161111110b0a0a0f0809050404090201010f000a060a08070c03120034043e0315100c0605120202040c0313040c0c0304020e041204130400020206030c020202020203161611110f0f110b0e0a080816040f01020108000a161611110f0f110b0e0a080816040f01020108000a161611110f0f110b0e0a080816040f01020108000a060a08070c03120034043e031504030202020316160f0f0e0e110b0a0a0f0808080404020201010a16160f0f0e0e110b0a0a0f0808080404020201010a16160f0f0e0e110b0a0a0f0808080404020201010a060a08070c03120034043e03150c05040002030603011304000202060311020002020203010f060812030e0206041404010e280d060a1a061204280309020002020204, 0x1161611110e0e110b0a0a0f080808110101010a000a16161111110b0a0a0f08080811010a0101010a000a16161111110b0a0a0f08080811010a0101010a000a06161611110f0f110b0a0a0f0808080a01010108000a161611110f0f110b0a0a0f0808080a01010108000a161611110f0f110b0a0a0f0808080a01010108000a06011402010602020413040c0c0304020e041204161611110f0f110b0a0a0f0808080a01010108000a161611110f0f110b0a0a0f0808080a01010108000a16161111110b0a0a0f08080811010a01010108000a061604020202020316161111160b110b0a0a0f080404090201010f000a16161111110b0a0a0f0809050404090201010f000a16161111110b0a0a0f0809070404090201010f000a061502130200080308030113040c0c0304020e041204] private def node347:Certificate:=PackedParametricCertificateData.decode 11 data347 private def node348:Certificate:=.split node305 node347 private def node349:Certificate:=.positive 8 [(9,0),(1,2),(6,7)] node348 private def node350:Certificate:=.positive 13 [(12,0),(3,4),(4,7)] node349 private def node351:Certificate:=.positive 14 [(13,0),(3,3),(4,6)] node350 private def data382:List Nat:=[ 0x11111160d140d160c110b0d020f010e01080102010a1111160d140d160c110b0d020f010e01080102010a1111160d140d160c110b0d020f010e01080102010a060a08070c03120034043e03150403020202031111160c110c0e0b0f080808090611020e010a010a1111160c110c0e0b0e090f080808090604020a010a1111160d160c110c0e090f080808090604020a010a060a08070c03120034043e03152c08040006031203011304000202060311020002020203070204020202031111160c110c0e0b0f080808060611020e010a010a1111160c110c0e0b0f080808060611020e010a010a1111160d160c110c0e090f08080806060a0101010a060a08070c03120034043e03152c0804000603120314040a0c030e031203130400020206031102000202020311040002020603010f0402020206030e040a06010203060311110f0f110c0b090f080b041a0113010f010911110f0f110c0b090f080b041a0113010f010911110f0f110c0b090f080b041a0113010f0109060a08070c03120034043e03152c0804000603120314040a0c030e0312031304000202060311020002020203110400020206031004060c02120316030f0402020206030e040a06010203060301] private def node382:Certificate:=PackedParametricCertificateData.decode 11 data382 private def data424:List Nat:=[ 0x104041204011111160d0e0d160c160a0b0909090a01080000000a1111160d0e0d160c0b0b160a0b090a01080000000a1111160d0e0d160c0b0b160a0b090a01080000000a06161003020206031111160c160a090909050a0209020f010e0101010a1111160c160a0909090609050a020f010e0101010a1111160c160a09070a060a0209020f010e0101010a060a08070c03120034043e03010c020b0203020204040604130400020206030109020802010c0002040e0408060706020e00080416041111160c160a090909050a0209020f010e0101010a1111160c160a0909090609050a020f010e0101010a1111160c160a0a0609050a0209020f010e0101010a060a08070c03120034043e030b0205060202030c020b0203020204040604130400020206030c0202020202031111160d140d160c110b0d020f010e01080102010a1111160d140d160c110b0d020f010e01080102010a1111160d140d160c110b0d020f010e01080102010a060a08070c03120034043e03150403020202031111160c110c160b0e0b0f08080809060e0101010a1111160c160b0e0b0f08080809060f010e0101010a1111160c160b0e0b0f08080809060f010e0101010a060a08070c03120034043e03150c05040002030603011304000202060311020002020203010806070603080206040e04010e1c0a1406060506041c0309020002020204, 0x11111160d0e0d160c0b0b160a08080d010a0100000a1111160d0e0d160c0b0b160a08080d010a0100000a1111160d0e0d160c0b0b160a08080d010a0100000a061111160d0e0d160c160a0b0909090a01080000000a1111160d0e0d160c0b0b160a0b090a01080000000a1111160d0e0d160c0b0b160a0b090a01080000000a0601140201060202040c020b0a030a00080412041111160d0e0d160c160a0b0909090a01080000000a1111160d0e0d160c0b0b160a0b090a01080000000a1111160d0e0d160c0b0b160a0b090a01080000000a06160402020202031111160c160a090909050a0209020f010e0101010a1111160c160a0909090609050a020f010e0101010a1111160c160a09070a060a0209020f010e0101010a06150213020008030803010b0c0308020601] private def node424:Certificate:=PackedParametricCertificateData.decode 11 data424 private def node425:Certificate:=.split node382 node424 private def node426:Certificate:=.positive 4 [(4,0),(1,1),(3,7)] node425 private def node427:Certificate:=.positive 13 [(12,0),(3,4),(4,7)] node426 private def data466:List Nat:=[ 0x101080101000a1111160c140c09091a080c020a010801010101000a060a08070c03120034043e03010a04030402020306041304000202060312040c0605020306031111160c0e0c1a080e0508050f010e01080102010a1111160c110c1a080e0508050f010e01080102010a1111160c110c1a080e0508050f010e01080102010a060a08070c03120034043e03150403020202031111160c110c0e0b0f080808090611020e010a010a1111160c110c0e0b0e090f080808090604020a010a1111160c110c16090e090f08080809060a0101010a060a08070c03120034043e03152c08040006031203011304000202060311020002020203011111160c110c0e0b0f080808060611020e010a010a1111160c110c0e0b0f080808060611020e010a010a1111160c110c16090e090f08080806060a0101010a060a08070c03120034043e03152c08040006031203170409040306030603130400020206031102000202020311040002020603010f0402020206030e040a06010203060311110f0f110c0b090f080b041a0113010f010911110f0f110c0b090f080b041a0113010f010911110f0f110c0b090f080b041a0113010f0109060a08070c03120034043e03152c080400060312031704090403060306031304000202060311020002020203110400020206031304050402060306030f0402020206030e040a06010203060301, 0x11111160c1a080c061a020c020c0108000000091111160c0c091a081a020c020c0108000000091111160c0c091a080c061a020c0100000806161003020206031111160c0e0c0f0909091a080e010a01080101000a1111160c140c09091a080c020e010a] private def node466:Certificate:=PackedParametricCertificateData.decode 11 data466 private def data497:List Nat:=[ 0x1020a010000091111160c140c160a0c09170808040a010000091111160c140c160a0c09170808040a01000009061111160c160a140a0f040a020a0108000000091111160c160a0a090a060f040a0108000000091111160c160a0a090a060f040a0108000000090601140201060202040c020b0a030a00080412041111160c160a140a0f040a020a0108000000091111160c160a0a090a060f040a0108000000091111160c160a0a090a060f040a01080000000906160402020202030b0205060202040a0403040202030604011111160c160a140a1a080a020a0108000000091111160c160a0a091a080a060a0108000000091111160c160a0a091a080a060a01080000000906161003020206030b0205060202040a0403040202030604130400020206030107020106000203080408060706020e00080416041111160c160a140a1a080a020a0108000000091111160c160a0a091a080a060a0108000000091111160c160a0a091a080a060a01080000000906160402020202031111160c160a0e0a090909020f010e010d0101000a1111160c160a0e0a090909060f010e010d0101000a1111160c160a09090a060a020e010d01080101010a060a08070c03120034043e03010a0403040202030604130400020206030c02020202020307020402020204060603020206030804010e1c0a1406060506041c0309020002020204, 0x11111160c140c160a170808040c] private def node497:Certificate:=PackedParametricCertificateData.decode 11 data497 private def node498:Certificate:=.split node466 node497 private def node499:Certificate:=.positive 9 [(11,0),(6,7),(2,14)] node498 private def node500:Certificate:=.positive 3 [(1,4),(8,11)] node499 private def node501:Certificate:=.split node427 node500 private def node502:Certificate:=.split node351 node501 private def node503:Certificate:=.split node277 node502 private def node504:Certificate:=.positive 3 [(1,0),(2,7)] node503 private def data532:List Nat:=[ 0x1161616140e0e0a0a0a08080811010a01010108000a161616140e0e0a0a0a08080811010a01010108000a161616140e0e0a0a16090909080811010a0101010a060a08070c03120034043e03152c080400060312030c040b040704020204060313040002020603110200020202030902080204020106040803161616140e0e0a0a0a08080811010a010a0008000a161616140e0e0a0a0a08080811010a010a0008000a161616140e0e0a0a0a08080811010a01010108000a060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206031102000202020311040002020603010f0402020206030e040a06010203060316160e0e130a13090b0914040b04110113000916160e0e130a13090b0914040b04110113000916160e0e130a13090b0914040b041101130009060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060311020002020203110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node532:Certificate:=PackedParametricCertificateData.decode 11 data532 private def data572:List Nat:=[ 0x11616160b0a0a0a070e0404040f020b02080101010a1616160b0a0a0a070e0404040f020b02080101010a1616160b0a0a0a070e040f020b021101080101010a06150213020008030803010f040202020204010c0202020202040c0201020202040c0200020202041616160b0a0a0e0404040f020b020701010108000a16161614160b0a0a0e040f020b021101070108000a16161614160b0a0a0e040f020b021101070108000a06150213020008030803150c0d020c02050c0408030f040202020204130812040b020306040e031616160b0a0a08040f020b0211010801070102000a1616160b0a0a08040f020b0211010801070102000a1616160b0a0a08040f020b0211010801070102000a060a08070c03120034043e03150c0d020c02050c0408030f04020202020413040002020603011616160b0a0a0f0908040f0208010701020102000a1616160b0a0a0f0908040f0208010701020102000a1616160b0a0a0f0908040f0208010701020102000a060a08070c03120034043e0315040302020203161616140a0a16081208080806061101070112000a161616140a0a16081208080806061101070112000a161616140a0a16081208080806061101070112000a060a08070c03120034043e03150c05040002030603011304000202060311020002020203010b060302020204010e040a02090603040309020002020204, 0x1161616140b0b0f090e040f020f010a01010100000a161616140b0b0f090e040f020f010a01010100000a161616140b0b0f090e040f020f010a01010100000a06161616140b0b0f090e040f020a010101080000000a161616140b0b0f090b090e040f020a01010108000a161616140b0b0f090b090e040f020a01010108000a0601140201060202040f040202020204161616140b0b0f090e040f020a010101080000000a161616140b0b0f090e040f020a010101080000000a161616140b0b0f090b090e040f020a01010108000a0616040202020203] private def node572:Certificate:=PackedParametricCertificateData.decode 11 data572 private def node573:Certificate:=.split node532 node572 private def node574:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node573 private def node575:Certificate:=.positive 4 [(4,0),(1,7),(1,9)] node574 private def node576:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node575 private def node577:Certificate:=.positive 11 [(14,0),(9,2),(2,5)] node576 private def data608:List Nat:=[ 0x11111160b0f0a0a0a0a08080816040201080002000a1111160b0f0a0a0a0a08080816040201080002000a1111160b0f0a0a0a0a08080816040201080002000a060a08070c03120034043e031504030202020316160f0f0e0e160b0a0a09090f08080804040a010a16160f0f0e0e160b0a0a16090f08080802020a010a16160f0f0e0e160b0a0a16090f08080802020a010a060a08070c03120034043e03152c080400060312030113040002020603110200020202031002080604040106040a0316160f0f0e0e160b0a0a16090a0808080a0101010a16160f0f0e0e160b0a0a16090f080a0808080a010a16160f0f0e0e160b0a0a16090f080a0808080a010a060a08070c03120034043e03152c080400060312030b020a0203040002040603130400020206031102000202020311040002020603010f0402020206030e040a06010203060316160f0f0e0e130a0f0a0b090b04110113000916160f0f0e0e130a0f0a0b090b04110113000916160f0f0e0e130a0f0a0b090f080b04110109060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060311020002020203110400020206031004060c02120316030f0402020206030e040a06010203060301] private def node608:Certificate:=PackedParametricCertificateData.decode 11 data608 private def data648:List Nat:=[ 0x10e160b0a0a0f080a0704040f0101010a16160f0f0e0e160b0a0a0f080a0704040f0101010a061502130200080308030113040c0c0304020e041204010c02020202020410020906011200020414040f0608120214000e04220416160f0f0e0e160b0a0a0f0804040f01070101010a16160f0f0e0e160b0a0a0f0804040f01070101010a16160f0f0e0e160b0a0a0f0804040f01070101010a0615021302000803080315040c020506010204040313040c0c0304020e041204130412040a020306040a0316160f0f0e0e160b0a0a0f080f010701010104000a16160f0f0e0e160b0a0a0f080f010701010104000a16160f0f0e0e160b0a0a0f080f010701010104000a060a08070c03120034043e0315100c0605120202040c0313040c0c0304020e041204130400020206030111110f0f0e0a0a0a160414040b040f01020108000a11110f0f0e0a0a0a160414040b040f01020108000a11110f0f0e0a0a0a160414040b040f01020108000a060a08070c03120034043e031504030202020316160f0f0e0e160b0a0a0f0808080101040000000a16160f0f0e0e160b0a0a0f0808080202010104000a16160f0f0e0e160b0a0a0f0808080202010104000a060a08070c03120034043e03150c05040002030603011304000202060311020002020203010f060812030e0206041404010e280d060a1a061204280309020002020204, 0x111110f0f0e0a0a0a1609080816010e000a0000000a11110f0f0e0a0a0a16090808160101010a0000000a11110f0f0e0a0a0a16090808160101010a0000000a0616160f0f0e0e160b0a0a160908080a01010108000a16160f0f0e0e160b0a0a160908080a01010108000a16160f0f0e0e160b0a0a160908080a01010108000a06011402010602020413040c0c0304020e04120416160f0f0e0e160b0a0a160908080a01010108000a16160f0f0e0e160b0a0a160908080a01010108000a16160f0f0e0e160b0a0a160908080a01010108000a061604020202020316160f0f0e0e160b0a0a0f080a0704040f0101010a16160f0f0e] private def node648:Certificate:=PackedParametricCertificateData.decode 11 data648 private def node649:Certificate:=.split node608 node648 private def node650:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node649 private def node651:Certificate:=.positive 4 [(4,0),(1,7),(1,9)] node650 private def node652:Certificate:=.positive 4 [(4,0),(1,6),(1,8)] node651 private def data683:List Nat:=[ 0x11111160d140d160c0b040d020f010e01080102010a1111160d140d160c0b040d020f010e01080102010a1111160d140d160c0b040d020f010e01080102010a060a08070c03120034043e0315040302020203110f160b0e0b0f08080809060e010a010e0004000a1111110f160b0e0b0f08080809060f010e010a010a1111110f160b0e0b0e090f080808090611010a010a060a08070c03120034043e03152c0804000603120301130400020206031102000202020307020402020203110f160b0e0b0f080a0808080b040f010e010a010a1111110f160b0e0b0f080a0808080f010a010e000a1111110f160b0e0b14090f08080811010f010a010a060a08070c03120034043e03152c0804000603120314040a0c030e031203130400020206031102000202020311040002020603010f0402020206030e040a060102030603110f0f0f110a0b090f080b0413010f010e01091111110f0f0f110a0b090f080b0413010f01091111110f0f0f110a0b090f080b0413010f0109060a08070c03120034043e03152c0804000603120314040a0c030e0312031304000202060311020002020203110400020206031004060c02120316030f0402020206030e040a06010203060301] private def node683:Certificate:=PackedParametricCertificateData.decode 11 data683 private def data720:List Nat:=[ 0x10a0d020a01080000000a1111110f0e0d160c0b0b160a0d020a01080000000a1111110f0e0d160c0b0b160a0d020a01080000000a06160402020202031111160c160a090909050a0209020f010e0101010a1111160c160a0909090609050a020f010e0101010a1111160c160a09070a060a0209020f010e0101010a06150213020008030803010b0c030802060104041204010c02020202020409020802010c0002040e0408060706020e00080416041111160c160a090909050a0209020f010e0101010a1111160c160a0909090609050a020f010e0101010a1111160c160a0a0609050a0209020f010e0101010a061502130200080308030b0205060202030b0c0308020601040412041202090203060306031111160c160a090909050a0209020f010e0101010a1111160c160a0909090609050a020f010e0101010a1111160c160a0a0609050a0209020f010e0101010a060a08070c03120034043e030b0205060202030c020b020302020404060413040002020603011111160d140d160c0b040d020f010e01080102010a1111160d140d160c0b040d020f010e01080102010a1111160d140d160c0b040d020f010e01080102010a060a08070c03120034043e03150403020202030e020b0607040304041304000202060311020002020203010806070603080206040e04010e1c0a1406060506041c0309020002020204, 0x11111110f0e0d160c140b0b0b160a0d010a0100000a1111110f0e0d160c140b0b0b160a0d010a0100000a1111110f0e0d160c140b0b0b160a0d010a0100000a061111110f0e0d160c0b0b160a0d020a01080000000a1111110f0e0d160c0b0b160a0d020a01080000000a1111110f0e0d160c0b0b160a0d020a01080000000a0601140201060202040c020b0a030a00080412041111110f0e0d160c0b0b16] private def node720:Certificate:=PackedParametricCertificateData.decode 11 data720 private def node721:Certificate:=.split node683 node720 private def node722:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node721 private def node723:Certificate:=.positive 4 [(4,0),(1,7),(1,9)] node722 private def data762:List Nat:=[ 0x1020a01080101000a110f160c140c090911080c020a010801010101000a060a08070c03120034043e03010a0403040202030604130400020206030b060502020203110f160c140c110808050c020f010e01080102010a110f160c140c110808050c020f010e01080102010a110f160c140c110808050c020f010e01080102010a060a08070c03120034043e0315040302020203110f160b0e0b0f08080809060e010a010e0004000a1111110f0f0f160b09090f080808090604040a010a1111110f160b110a09090f08080809060a0101010a060a08070c03120034043e03152c0804000603120301130400020206031102000202020301110f160b0e0b0f080a0808080f010e010a010e000a1111110f0f0f160b0f080a0808080f010e010a010a1111110f0f0f160b0b0b110a0f0808080f010a010a060a08070c03120034043e03152c080400060312030e0209060308030803130400020206031102000202020311040002020603010f0402020206030e040a060102030603110f0f0f110a0b090f080b0413010f010e01091111110f0f0f110a0b090f080b0413010f01091111110f0f0f110a0b090f080b0413010f0109060a08070c03120034043e03152c080400060312030e02090603080308031304000202060311020002020203110400020206030a02050602080308030f0402020206030e040a06010203060301, 0x1110f110e160c11080c060c020c010800000009110f110e160c0c0911080c020c010800000009110f110e160c11080c060c020c010000080616100302020603110f110e160c0e0c090911080c020a01080101000a110f110e160c140c090911080c] private def node762:Certificate:=PackedParametricCertificateData.decode 11 data762 private def data795:List Nat:=[ 0x10f160c140c160a0a020a0108000000091111110f160c140c160a0a020a0108000000090601140201060202040c020b0a030a00080412041111110f160c140c160a0a020a0108000000091111110f160c140c160a0a020a0108000000091111110f160c140c160a0a020a01080000000906160402020202030b0205060202040a0403040202030604010c02020202020407020106000203080408060706020e00080416041111110f160c140c160a0a020a0108000000091111110f160c140c160a0a020a0108000000091111110f160c140c160a0a020a0108000000090616040202020203110f160c160a09090b020a020f010d01010101000a110f160c160a09090b020a020f010d01010101000a110f160c160a09090a060a020f010d01080101010a06150213020008030803010a04030402020306040c0203020202031111110f160c140c160a0a020a0108000000091111110f160c140c160a0a020a0108000000091111110f160c140c160a0a020a0108000000090616100302020603110f160c160a09090b020a020f010d01010101000a110f160c160a09090b020a020f010d01010101000a110f160c160a09090a060a020f010d01080101010a060a08070c03120034043e03010a0403040202030604130400020206030107020402020204060603020206030804010e1c0a1406060506041c0309020002020204, 0x1160c160a0c09170811080c020c010a01000009160c160a170811080c060c020c010a01000009160c160a170811080c060c020c010a01000009061111110f160c140c160a0a020a010800000009111111] private def node795:Certificate:=PackedParametricCertificateData.decode 11 data795 private def node796:Certificate:=.split node762 node795 private def node797:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node796 private def node798:Certificate:=.positive 1 [(1,3),(2,11)] node797 private def node799:Certificate:=.split node723 node798 private def node800:Certificate:=.split node652 node799 private def node801:Certificate:=.split node577 node800 private def data847:List Nat:=[ 0x10b09090c020a010801010101000a110e160c0e0c140b09090c020a010801010101000a060a08070c03120034043e03010a04030402020306041304000202060301110e160c0e0c110a080511040c020e01080102010a110e160c0e0c110a08050c020f010e01080102010a110e160c0e0c110a08050c020f010e01080102010a060a08070c03120034043e0315040302020203110f110e160b0e0b0f08080809060e010d010a010a110f110e160b0e0b0e090f08080809060d010a010a110f110e160b0e0b110a0e09080809060d010a010a060a08070c03120034043e03152c0804000603120301130400020206031102000202020301110f110e160b0e0b110a0f0808080b040e010a010a110f110e160b0e0b110a0f0808080b040e010a010a110f110e160b0e0b110a0e090f0808080d010a010a060a08070c03120034043e03152c080400060312030e0209060308030803130400020206031102000202020311040002020603010f0402020206030e040a060102030603110e0e0b110a0b090f0811040b0413000f0009110e0e0b110a0b090f0811040b0413000f0009110e110a11090b090f0811040b0413000f0009060a08070c03120034043e03152c080400060312030e02090603080308031304000202060311020002020203110400020206030a02050602080308030f0402020206030e040a06010203060301, 0x1110e160c0e0c0e040c0204020c010800000009160c0e0c0e040c0204020c010e000800000009110f160c0e0c0e040c0204020c0108000000090616040202020203160c0e0c160b140b0e040c020e010a01080100000a160c0e0c160b140b0e040c020a010801010000000a160c0e0c160b140b0e040c020a010801010101000a06150213020008030803010a040304020203060408020602020203110e160c0e0c110a11080c020c010800000009110e160c0e0c110a11080c020c010800000009110e160c0e0c110a11080c020c010000080616100302020603110e160c0e0c140b110a0c020a010801010101000a110e160c0e0c14] private def node847:Certificate:=PackedParametricCertificateData.decode 11 data847 private def data873:List Nat:=[ 0x1110e160c0e0c160a170811080c020a01000009110e160c0e0c160a170811080c020a01000009110e160c0e0c160a170811080c020a0100000906110f160c160a0e0a0e040a020a010800000009110f160c160a0e0a0e040a020a010800000009110f160c160a0e0a0e040a020a0108000000090601140201060202040c020b0a030a00080412040c0203020202040c02020202020407020106000203080408060706020e0008041604110f160c160a0e0a0e040a020a010800000009110f160c160a0e0a0e040a020a010800000009110f160c160a0e0a0e040a020a010800000009060b020606020203140201060202040c020b0a030a0008041204110f160c160a0e0a0e040a020a010800000009110f160c160a0e0a0e040a020a010800000009110f160c160a0e0a0e040a020a0108000000090616040202020203110f160c160a0e0a0b020a020f010e010d0101000a110f160c160a0e0a0b020a020f010e010d0101000a110f160c160a0e0a0b020a020e010d01080101010a06150213020008030803010a0403040202030604010b06050202020407020402020204060603020206030804010e1c0a1406060506041c0309020002020204] private def node873:Certificate:=PackedParametricCertificateData.decode 11 data873 private def node874:Certificate:=.split node847 node873 private def node875:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node874 private def data926:List Nat:=[ 0x10f180e110e160b0b0b110a0b090a01080101000a110f180e110e0b0b110a0b090a010801010101000a060a08070c03120034043e03010a04030402020306041304000202060301180e110e160b0e05080511040f010e01080102010a180e110e160b0e05080511040f010e01080102010a180e110e160b0e05080511040f010e01080102010a060a08070c03120034043e0315040302020203110f110e160b0e0b0f08080809060e010c010a010a110f110e160b0e0b0f08080809060e010c010a010a110f110e160b0e0b0e090f08080809060c010a010a060a08070c03120034043e03152c0804000603120301130400020206031102000202020301110f110e160b0e0b110a0f0808080b040e010a010a110f110e160b0e0b110a0f0808080b040e010a010a110f110e160b0e0b110a0f0808080b040e010a010a060a08070c03120034043e03152c0804000603120315040302020203130400020206031102000202020311040002020603010f0402020206030e040a060102030603110e0e0b110a0b090f0811040b0413000f0009110e0e0b110a0b090f0811040b0413000f0009110e0e0b110a0b090f0811040b0413000f0009060a08070c03120034043e03152c0804000603120315040302020203130400020206031102000202020311040002020603110402020202030f0402020206030e040a06010203060301, 0x1171618141611180e170a110a1708170700000918161814180e170a110a170817070718161814180e170a110a17070606180e110a0f040e04180211000a000800000009180e110a0f040e04180211000a0008000000091816180e110a180211000a000000070601140201060202040c020b0a030a0008041204180e110a0f040e04180211000a000800000009180e110a0f040e04180211000a000800000009180e110a1103180211000a000000070616040202020203180e160b140b0b0b0b090f040e040a01080101000a180e160b0b0b0b090f040e040a010801010101000a180e160b0b0918080f040e040f010a01080101010a06150213020008030803010a040304020203060401180e110e110a1108180211000a000800000009180e110e110a1104180211000a000800000009180e110a1104180211000a000000070616100302020603110f180e110e160b0b0b110a0b090a01080101000a11] private def node926:Certificate:=PackedParametricCertificateData.decode 11 data926 private def data946:List Nat:=[ 0x117161611160a0e0a17080a020a0107000000091716160a0e0a17080a020a010700071716160a0e0a17080a020a01070007060b020606020204140201060202040c020b0a030a00080412040802030600020308040c02020202020407020106000203080408060706020e000804160417161611170b160a0e0a17080b070a010000091716170b160a0e0a17080b070a01071717170b160a0e0a17080b070a010706160a0e0a0e040a0204020a0104010800000009160a0e0a0e040a0204020a0104010800000009110f160a0e0a0e040a0204020a0108000000090601140201060202040c020b0a030a0008041204080206020202040c060706050803080407020402020204060603020206030804010e1c0a1406060506041c0309020002020204] private def node946:Certificate:=PackedParametricCertificateData.decode 11 data946 private def node947:Certificate:=.split node926 node946 private def node948:Certificate:=.positive 8 [(5,8),(1,10),(24,12)] node947 private def node949:Certificate:=.split node875 node948 private def node950:Certificate:=.negative 1 [(3,2),(1,8)] node949 private def node951:Certificate:=.negative 2 [(1,0),(3,1),(2,7)] node950 private def node952:Certificate:=.negative 1 [(1,0),(2,2)] node951 private def node953:Certificate:=.split node801 node952 private def node954:Certificate:=.split node504 node953 private def node955:Certificate:=.split node202 node954 private def node956:Certificate:=.split node84 node955 private def node957:Certificate:=.positive 3 [(1,1),(8,4)] node956 private def node958:Certificate:=.positive 3 [(1,0),(2,3)] node957 private def data969:List Nat:=[ 0x116161111160a140a0b0a16091409160114000916161111160a140a0b0a16091409160114000916161111160a140a0b0a160914091601140009060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030c0a050203020006040a03110400020206031008080607060212041a030f0402020206030e100d120b36012004300309020002020203] private def node969:Certificate:=PackedParametricCertificateData.decode 11 data969 private def data1032:List Nat:=[ 0x11601022aebf5a48491a8dcef9f94d784d7878af498130a010274daf6fda598f0c499e9c3bf8cc397b1e01609010253e9c7daadef99d6bbc4b0f5d5feb7879ac41409010201b180d6d9e3b2a9aab8e28fcea8d18f9a8fdc0a09010202dffa88d598f9e1e0b2b0e8a885aeace8b01608010204fbdeae97ce8afad9d886beaddf9dc8acf61408010259bebd94aea5d2dccde4edca98a4bbedb9ca0808010203d4b7d897c2cdbfe3c9d8e8d9b4fbdbedb01601010201c393fa93aad997a787fd98a1aee58fa3f0140001021de7efa7e3e0e7dac0d7a5b6b5fa8df8a8161600022ae193f3cfaee490c6f4bf96f8b5c7ccae80130a000201d6a59cd9b9f8f9bea7f287fcb1c3d4bca01609000251b987cbc0f9f395cc95c3deb8f689dcb6d21409000201a9cb80c1d3839a9dd6bbdfdaf8f391fcd2f60a09000206fba8c082aea0e9ac86b1b490cafba0d5e01608000204e482b6c6abaef3f3e4a1f1dcc0869beca61408000255a8a98eabb690c9fd9cd5f0fed7f384c0f20808000202caceca87b298fabfc9e6b7be8ab3d8fba01601000202ec8cd2a4d4bee2b4b9d387d9d8d4e3d3801e228591f8a0faecffdba0c0000a08070c03120034043e03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206031008080607060212041a030f04010200020308030d060b12000803080301, 0x1f3c6f7faceffc2ac85debfd9cddfefbab9fd800808000240b084e3baf9d888c1baafa8ceca86d792e9fed0f093c4c4bc9bc6cc8db7eac3d5b4f78ae8c0bfe1acbeacbb9caba8a7cb801601000232f2f393bbf488f9d6a2b5aaf89f8fe3d4dde4f7f5baacb69f9faffc8789d7a0cad5dbf9989789d6b7c2ab9ff8a9f9a185c01e0185ede0cfc9d49cdd8ed581ae8fac9ed6fbccfc91b59990cbefcff1eef1d7c9ebc4dd91efbfd5feefb6b5c380000a08070c03120034043e03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206030c0200020202030b0200020202030107a18313f7ff0bbb8904dbf807fb904b8efb0bd6ea04e59b000a9ba08f8cdfd5f78fa393bff009f8ee08f1d86d99ea33e8f5089ddf0ea5ab6d93a133e6a800018cbac09cfb9edf88dde8bef0161602022abaf5c6a98e9d83c184c3e7aae996ffb4d0130a020201c8adb7b5d3cb8f87b1e880b3eb82adc01609020258bfb8fba9abc9d1a4c0dfd3cdf287a191c81409020201bbbbbfe9e0bac7a3f7e5f1e6e6b8bdd9ebb80a09020202d4af90aa92d994ebdfcfacd498e59380160802020897e7a8cfdbecc4a18a9090c8dfd5e0a4d01408020266ca98ccdca488c8e290eec9d893ae92ead00808020202eaad8887bba0f99adbcbb08fbd9685d0160102020c80cc8fe6dcdddde5b1c59cda8d9ca016, 0x1a8b7c4a6cac3d5feadbcbbb6be86c3fdd2b5c4eda6d68a9d98d5bc91c59eacecaede90dcb8aa9cf6a80808010204e99df3f6b9d1a3df82cdd6f0eddce0d9bada9b8dcbc5f59dcbc8eaced3a283cc83b68b83d199def2c3a8c8cbeaf8a0d4d4ee0606010228acc0cdadc8c881f3f2e0bcb898b8f7cc8da8a38dd7d0a7a8af9291b3d996e987a7b88581c1d7df97bfd2faf7b8f4bed7e6080401020381ccb0dab0daa9b98acdafea8af9c3caf1c4c8e4ecd7c3dbdac5dcdcbcede3ac9bb7cd939ed1f98ac4c6b6b3d6bce18694980404010201a180d8a880f688b9d3f4ff98e9b898a19ff0be8d86b2f9d7a9b8bfa1a19a85c3eca39498a8f7c19fe98eaed395b4b699a816160002018db8b9d5ed8bfac0d7a283bbf7828aff95efe5d1bebcc8daa2ab86aeb6e4f9d8af8a9eecbae18bdc909d949ab1fe90ceaea01313000212dcc3e8d8dd86b9accdf8ec83d9ce9fdfbbaa85bfa286a6a78996d295bccc9f82b3fbf5cabdd09cb7b9b6ec82e3aacfea80160900020186e3b38cc0addcabd3f2dae983c3bdc6e29badb383efa0dc9782e6a48afec29a97c9b4d3bae2c081ce978e98eeee98d4b7800909000210b9cbf49ecaca808da4f094fdc6b98cb4c494a6ddffd1c1fe9dd792c893e5e08aaaaa8b93e192bcfd84bf95cfb2e796e2e0160800020dec8db5bbf2f8daedb8ffccd7e7b1cda9cd8ce8bce1d292c6c68087e8809f, 0x1aaea82a4f8f8c5dfc1e01609020254df82a5e1e7d686cff2f2bc9185cad2b4f5d9cfe0a486dbbb91a990ddb6c0a3b0feda92f0a5a3e7a49ac996c2b382cbcf80150802021dfcf9f6eedee9c1f49dba909ee9a1a39d91accbe6c5f4fbcca3d89088bdfdbc8a9880b489ddcde7b592e4accabdc5f3bac00808020237f1c68fec979e98e39ad6fea9a495bbd7d9bfdef9c289fbdaafdcbddcc2d3f1f08dcda6a9b8f0ba849ddecddd8686edd5c01507020203aab1f5b8b695edb8afc8888b97beebc2a2db99a7e4c2e2b8f5c4fcf8bca2fb89eadeadbcc89d93da9283d4fdb3f2cc91c01107020202fa81a18aa1a5d5b3e7d5d2bfd7fda992b8a282ececaab7b3c68eb8e1b7e99db0efd4f4f7b0c48380fbacb4a99792e687c01106020201acdd94bae892b98aaed28c93a4d5e9bbfbda8f97fdd3a5e7cdc695cda5b8d888c9ebafd2cbf6b193d4b4e1a4f0899bbac0161601020ef0f4d5cea285a697d39c97f8af9fa4c3f9f096dbfef399a2b6a0e8a2d3d7c580dbb8c0f9e282e1e5c4a9eff0d7bfcaeeadd4160a010203cecfe694dd87a2efa8d0cdc6c797f591f1faf3b9e6b8b8cdccc18aafcff39cfe8eeeef92c5c2f6ed86c6e4dbea8ceae6ffd80a0a0102029ef0c8cf968fb6d1a79ed1f29aa0b494b9899ed6fecf87b5cc96f3d4959cfba0a5e5fd8e8cb6dfe79dc8c1a99df0bde6f9e40909010240ddceaaccbbe388ab, 0x1f8c4878dfeab9d84ded5a0b2dfa884ad9685ad92e8fecd80af91d9b6d99bd4c9ad87bdecdcb0c1f0884d8703ffa50184d376c52e89863e929320a2ac0ed6e90001e8e2fcdddddfa6cbf5b4fbe6f4e4f0e9f4da8be4fcc7c6e7dcccf78cc8dab9f3b5a9ce93988fb2b5b1f5d1ccd5a002b2fd05a786018089019cc12fa4b009d09f40899721e2be007184dad9ecf8c6c6a6b5a0f8adcbc58d8dd3cea2f6c5f296d7fa9ddda2a4c4d5ebf4abbe84f5948785dfd9beb5800188abd45cadfd18e2ae0ac2a934eaed3d92f607fda101f6840006c5dae3ecd4ecd6e7b285f4d5ec91d6c0b3b197c3c18bacf5d4dc8b84dac4b38a80ace6cdee89dcb7bee6bb92c041b5d53cd7990183b7e041f8ff1bf5c219f1de44d0f122d382000596eccbb9f8d0e2b1cec6c99cf1acabbff4fccc9393e5f9bcd2efa1efd0fde1c68adafb85809fc396d3d5b6e5804daccc7ed5b048f1a62ad9972ec6e148cafb25c7b318d5d2000185f8d0e2b8e8d499e2dadee8f1d2e0e896bbe481a3fdaf91decbc1a49afbe6c69cb7acd0b4daf5e991a1adb3801ed6cd26a9a811f19005d3a745a4fc2393dc10fec60c9eeb001fd08aef97fef4b7efeeabd8d7a2fbaeb2ffe9a6fdbb89fc8e9ebf9c8ffcd8d7e3d3a8d98aceea958b948cfcc01616020201aba89fe6d7a1b6f4cda5d7c1fefcec94d5c6a0ebaec3dcb5e1dff3a2f6ddfba98895a9ae8ba79ad4, 0x1b6b9b9c0160601020c9bb0a4eef0f5c1aff4b1dfea8a8efceec4b09ee298c9cedaf4978bae8996c583da0706010207dab4baa29ec2a3a1bedc85c6bf9fc1c09bb3a4e491bcf1abd1ede8c188a7ec901602010205d891dbe2c4ac828394d39cb88ac8bbf6c488819192f9fcf2ff8fe1a2a9fcf995ce161600020195b296a6f982d7a3a7e1a880f7fde996a9edb0c5adbfdebbe5e7aa8beb8cc3978ccc140900025c90e7bb82dcbdc0c7848da4929bdecbcbe1ead1cfa79cb7e0eb93d4a799ffe49fe01608000202c5bbefadaffcdca8acf4f1d491a998f3ace3ba92da8ac6bdc6f1dddeaec4c480ff9014080002069d8dd09cddf4bba8828388b9f69bb48acb9cf1a0ceb9f2a7f8ec82f78589b98bd5b00707000204ebcdd2ecaca9c7a9eca8cd839bf48697f6fda6cbf0ece9e780ffeb909eb0a7e4e01606000222918bfcc6c2998288f1c6a08095a7c6a6a589f98bd3a9e18bdee486f080a0de88a01b01f7f1a4ae92c9e28288da88c498efabb9a98dd8d28da4cdfab5f0b000130803060018031a03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206030c020002020203015ca6ac42cbff27b3d813eec10132cda98394ccc09e8b8386f2cfda82c0dfb7fce1cef4b0c8fa8dcfafa999b6a0e08cdcbbe598b5baa2cff1f8c03fd6ae14cdd45ba0b52de2c8010785a5efd9, 0x19ca0fbdffdbb93b2cbccdbc69d88999da6d0161602021bdd88fca6a2af81e0848ce6c7c89a9cbba9f08ebbd6b5c5ec93ca97f3db9cc1b4d015150202288da2a7fbd3e0efba97b6edd9d9cbc0fd8db5c987ee91eeb2b4e1cbff86ed83a49015140202048395fda4d8d6a7a9f5949093c4dec9959192ecd0b1e284f2f2d8e5e4d0c7f6f7b2a01613020211e0ac85a9e3d5cfb6c797f4addcb4d0c4b59fbba7efc98385f6acb7d0b6f6fce016080202029de8d4e9f3ecaad0e6989797cee7a5efa480afe9d5bbb899be88eaf6a7c49e96d1ac1408020206d985bf91a0b79da2ee9cdaefb6c1e0a6b7cb82b8b6d0f9d3e49ef9abdd9cdbd6eae4080702020aaa80f8c6d2c4dae4acce819caaba97e886cc979a84b997cda2f5c6c6ff8b9bda0706020205d7d9ebebcfc2ebf28de2a3d4a7c6f0a2c5ceb7d2ebccb3ce85dbaba4f0f1e8b61616010201bccccacbdd8699fcfefbfaf6ccd6ab8bffae9da3bfc5b4d79fb1c8efb99a9187b4b0140901020195c0fc8fedffaeb892a3acfd87dfb5e48cdfd99cbdd9ebd6e6b581c6caf59ff2808a1608010202a8cffd80a2a58183b8c9f8bd9ae5dfcf8cfad58083d4a69aeccbbd90dfd9e6eff1c41408010205dcb5cbd9a3cbbbc2c59bacdea3b5b99cbc8a92afcbcaabfdc6ebfab2fab2e9dd8ec60707010206c0d5bfa38983edbcb4e79ca2ebdabc8fda97819cd6b182f0e4d9f4d5f3, 0x11616141114080a060e040404130102010800091616141114080a060e04040413010201080009061302020600060308031504030202020310040c040b04020e040e031102010202020316161411160e14080a0608060404130108000916161411160e14080a0604041301080108000916161411160e14080a0608060404130108000906130803060018031a031504030202020310040c040b04020e040e0313040002020603010116161411140a1608140816071407040407000916161411160e140a1608140814070716161411160e14091608140814070706130803060018031a03150403020202030c020b0a030a00080412031304000202060310060102020203110400020206030104c4e90a8ac503a8b203ac8536b6d23fbc9503b28f03b2900001ede292b0c0e9a4adc7c9b78fb5a48e818888a283f3e5f081f99bd7909435f09a019ba4b105f1ed05f4f808d5d9609cde05f6b405f6b300278cf0d1f6fcbf9d89b7bee4d08cf58faeffb498b1b7e48bfeb3b59280779fe24aabe801baff01bf8011c8b509f3b701cfb401cfb30020fdee9b86cfdbbcd198d1d7f3aca388aeefa7a3e09494d682ccaac2c070bf8804fa8306e9b006eedd6bb68725ff8706f79d06f79e0002fbde86f4808da5b894aeb599afae98baf6d8f18bdda3c4b1c3dffdf00eaf10a56da2b838eb8b01e705bb68b568b60077b4c5c89697c7b993, 0x116161411170f140f160e140c140a060101010916161411140f160e140c140a060101010816161411140f160e140a160206010101080616161411140f160e0a0616020601010102000916161411140f160e0a0616020601010102000916161411140f160e0a0616020601010102000906011616141111060a06080609050e0413010101091616141111060a06080609050e0413010101091616141111060a06080609050e041301010109061402000202020301141c10140c060b06041c031616141111060a06080609050e0413010101091616141111060a06080609050e0413010101091616141111060a06080609050e04130101010906130202060006030803140201060202031408100a0b060006040e0301110200020202041616141114080a060e04040413010201080009] private def node1032:Certificate:=PackedParametricCertificateData.decode 11 data1032 private def node1033:Certificate:=.split node969 node1032 private def node1034:Certificate:=.positive 4 [(4,0),(3,8),(1,10)] node1033 private def node1035:Certificate:=.positive 13 [(12,0),(3,4),(4,7)] node1034 private def node1036:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node1035 private def node1037:Certificate:=.positive 4 [(4,0),(1,5),(3,7)] node1036 private def node1038:Certificate:=.positive 3 [(1,1),(6,2),(2,8)] node1037 private def node1039:Certificate:=.positive 3 [(1,0),(2,7)] node1038 private def node1040:Certificate:=.positive 1 [(1,1),(3,3)] node1039 private def node1041:Certificate:=.positive 3 [(1,0),(2,5)] node1040 private def data1062:List Nat:=[ 0x1161614140e0e110b0a0a11090a08080808040a000a161614140e0e110b0a0a11090a08080808040a000a161614140e0e110b0a0a11090a08080808040a000a060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030c0a050203020006040a03110400020206030b0603020202030f0402020206030e040a0601020306031616110b130a13090b0914040b0416011300091616110b130a13090b0914040b0416011300091616110b130a160913090b0914041601130009060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030c0a050203020006040a03110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node1062:Certificate:=PackedParametricCertificateData.decode 11 data1062 private def data1113:List Nat:=[ 0x191a3a0d2f01411010206928fe3c185fffeead991f8faa59a88c884b6f6f8cbf0c394131101020aea9ed4888bbbfea4dff792808a8fd1f8b8e5c38390a992880a0a010201c69a99abc4d188d6c8d5bab19288ded4f2e493edf2e1eb860909010246c2e88cec91c1a4c5fbe3958bc694cb8fbaa0b69294feb21606010202c3acb0c9b0c7dce0d18b91b6d08f88b4a5de95d69ceefb880606010217c8dc8791ca9496afa3bef8d9fca6f6c4e6bed3ccfd85bc1304010202f8dcf6c383aff3e4ffcaa69bfdeb91a39286ebe2cbc8a8f40804010209c0ebafcef896f3e187d4ff888eb7a7cc8487df849dd2e19816160002018adeb9c3bda08fa382bed2ceb2ddfbdfb7d5f5b69df08d9c1313000201c3c4bcf6d881f6bdfbfeacaedccbd4cfd3fda4a1d18bb9b01311000214aefcafe4f6bcce98df98f8d0e1aee1d1f1d6f5e9af99f49c1111000201d7ec8f85f4ddb0e7bb96c6dfe2ff878cc0fec5bba89fe3940a0a0002018ace84efdf9bf5f6aeb2b3bedbf6d5e6989987ad91cb92be0808000205b0f2ffb9cfeb8384c4d9d7b4f596dda6dbb291b6a090e7a61304000201a1ceff92a0a988f3b0b99d9cbebddd90a7dbb8f9b7c3c08c1e76a6ecd993a8c5cf8efdb6b0cffd8f81bbb2000a08070c03120034043e03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206030101, 0x103150c050400020306030f040202020203130400020206030c0202020202030c0201020202032da501c3c802cb9b38d12e8be63e89b924fdc011a8c50001b79d8f91d0cbf4a2d7c1e8e884a489ececc8efa802e1bf0d9bdc02f8b50198ed33eff80dcfe13cbcc71fd8900068c29682d0a8b2f4a2af94eebc88f2ff9c8185c858aed053d5a226988638efed4bebff4c97d71d91e92dc2d0005981a8d5d0b8f584d7c9abccb7c5bacfc0db98161602020490fec590dbf5aac5c7efa5c0b1e7c98e86ced4abf181838a141302021382faf49eccf0a080d9e3d684cee4b192d7a7a4afd9b2caec141102020a8ca4c5d0dfff83ba86f7c3c2ced1a2a4f49884d7b599e9841311020219cba7cfc5f3cc97839d8b9596bafddbbd909ab1b2afb1b3e8111102020294a0f6b2b0e085a2a58fb39e9cdc92f2d5c4b4c4bccce182130b020233ccf9aa97a082f5a2bdd08996a19eb882eed2b8cca4f1c40909020201f79ea391e2de9ccae598f484eccb9bd9e5b088c0a7e58cce080802024580dc8c82b0c3fe9ce2a3d3fda8d6fe9baeb2c980b595ee1304020204a4c7bcaf86d3c69bdbbbf2bda1d8aec48090c48d85bd89f80804020209f1f9998fb6c3eed98fbaebd385889cd3a5a69b96c29c82f01616010205c09aabf7c0dfc4e3dccade9d9bd1bee69da293a5c7dae6cc141301020ec2f9aadff58080fed387c2e6889ff8cebe828b, 0x1f99cd5c0ebecc68cc392b01109020217a1e0a9b796c8999aae9098f5900707020207eceeb387a5c8e2a2eff4f69c901106020215fdec80a486a89dbaeaffe3afd40a0602020492f5ea94d3a6d9dd85f0d891e0090602020b96d78f8d9e91a6abd7fd95cfa40606020205c099c9b5dea382fde6ebf9f4d81601020219e2cea8f19f8eb3d4d2cf98f4070102020296c081d0df87d4d390fa84abdc161601020be1e38490d2f6c0e0f9fccca298111101021da7bcfcc0f4a7c5a8a1eb89b6c81109010213b2a8b58ead84dbd7b2b6adcea8070701020af7f7ddfee7e28cb4979aabc288110601021d929ed7e5b2b6d78deb9fc8caba0a060102059bd1a080ae9a8693e2f09edaf00906010207f1ccf0fd88bbe986e7f5a89882060601020af990a2c2b0dbf2a4b786fba8cc160101026cadd9a48dd6ead19597d6c5ea0701010253d2f3f99bfc81d09ad5b0b4de1616000201b5b197e5db94d5ffa699d9d9801111000227c2dfd1d3c4bbdbc6b6808be9a00a0a00027b80b294a3e0f29cb7ea93bde0110900020a8c9087dd92c1e0bda897babcc0070700020987bfa1b1cbc0d4fbed88f9eb80110600022e998ec38eb4d7e494f3c9c3e5c00a06000206d6c3ad97e1dc81a981bea89ec00906000202c99bcbc7fac3a2b78392bab0c00606000213b5999ddea7afe9cbfd9287cc801e26b4c2e4dcffa0000a08070c03120034043e, 0x1a9b5c5fb82959c080402020688e48bd5c6b3aeb8bc8f95afb1840202020202a9d794edf9cdf3f7efb9adfbcbdc161601021bddbac8a2e09e9d889781ff8ed0800a0a0102208083f08f8c80d5a2e2be8bbca01109010214d6eeb69ca7eae897eea7c8ec89a80808010211cdc9bfa6f5ad97eda9c598d3f0960b07010202bf9e9ef5e9ceadf4f58fe6a7a4a00a07010226ff8887a5c1fcbaaecfccaeb998a80606010204c6d78fbb96d498c8c9f6b7dbd28a0804010204b6d3eec6e185d1e8cc82a48bebb01602010201afa9e9c49fc8faeba3ced6fbe8a80202010202ccbaade39eafc6baf8c3a7b7d1a8161600021bc5e3abc9bbfaddefd29db9ffb2801109000214dbc2ddf2c8ffcc80c0d9e6a483f00808000210b09385f9a2efb4bda5a3e7e0e8a40b07000202a5ae82cdbdf58493a8bda8f3f1c00a0700022a8e9f92e2f6f5d3b597f3bfb6c1f00606000205a4afe2ec9ca78fe8caf893cca8dc0804000202fb85bc869f95e3dce5e79d96dca01602000202ddfd87abf0e6dcf5becae2d8fff00202000202d2c8de92cad181c88a84fbbeaab01e1b979295b382e2c0000a08070c03120034043e03150403020202030f0402020202031304000202060301010c0200020202044aa30399f35b8d1ff518d4a637c7df36bcba19c39f0038deb59cb7e0b98ce016160202109cda99aacce98a8599f1e889f01111020218c6be, 0x181f29effa19ac0a1809685d7cd9ea01602010206f48db695a5a4a597f891e8cfe6abc18fa5c2c00202010226bdb79bab89c9dfc98dbcd69cf1ebed83a4d8c0161600020296ae99ecb4ecba8baacaf8baace3bb81a2e3c88014110002018af4f0e58fe9ee93f3c69eed88caa3adacaedae01109000201ad8595d58394eecaa4a2b9f58b84a097fdfbf5a00808000201b1e7d4f1dc93cd94dfe7c599c18685fd8896cde00a07000203e0c086f7e2cb98ca989be794effcd49de5f1a3c00606000238fc938f96b1e5d1dae299e698dfe4afc6f3b2a00e0400020fa59abbdfdd94ffde9596d9f2adc5defa8c85a0160200021fb6d9e2dcc3d8d6e6e5f1f6dfdc9af086a8fcc0020200021ec4bf96e69ae9a887c68b9dca91c8d49f97b2c01e02a7a3f8dba7a4fdcf80e2c59e80001308100c0706002a042c03150403020202030f04020202020313040d0404020106040c0301b3f568ed528601f9b32bf8b44088a521c7900fcd99001085d6dfbff4f2f4eb80161602021bcb87b8f69ebcc4c7fddec6aea2c4110b020207ccf4a5fee89a88c8a8c1c5e1b40a0a020249beeca8bedaade4a88d83fe92a01109020214d4a8d3bc8be0e38882dbe79f88ac080802021790f2f39ab493fea699c581868b800b0702020382f6f898e9f6a4dd81e4a985ac880a07020211e3fcbabee4988e91ffe1beb292a40907020211bcb6fcc3a4c3d7, 0x11308100c0706002a042c03140201060202030101110200020202047faa01d5f70ee001f0b523878e41a48926c7bc1180dd00019ed8eb85e7fed4c0b4bfb2e08b808027d8fa0195f1e74796cc0c82930b808f4c81fc2acce908fc94000791dff8b0c1b7a0a1edcbd7d8c0801616020201f6d7ee81c7b7b9e2e79affb0df8df8a7a8a2a88814110202018fe3cbb4c8a6d4d884eff3dd92d0d39bd1fcd4e2110b02022cedd7828cb7e3a391dca5f9e09ca2b4f78dffc8110902020191c68aa9d7adf28df8c8d9d595f4e8bc94b0b3ea0808020201fa96dba09ec1a78fa6cec193bca5dcfbf7d6a0800a07020201eae8fdf3eac5f984958a88b0c295adab969492e40907020201afaadffefdccd5c8f7e1eaf6c7acf3e08c8feae40e04020240a4ab91958cf289e3f682fcddaaf2cfbdfe8bbe020202021c8e949b9ca6f1f2f8a28781b8ec858d979ef8b8010102020590c08dbb9cb7accbe9dfe292bcb4c2ab8dc080161601020288b5a5b98f9f95f890dae6d8ccd8f2b8c2d8b8801411010201af9de7f3dad5fa85e7abba86b2dbf9dd83ddc1e01109010201a2ecd39deaa19ba7b082b9c5fd8fe1c99fe0c2a00808010201fccdfef398cf9299f897b3f98f939e84d4e8c8800a0701020281e0cfdd89b5decbacaab9a58ac7c4b9ddbbc4c00907010201c0f5c483a0f3b4d9cfccba9dfdae8af18bfcb1800e0401021fa4c7d0d7, 0x1110b0b0b0911020f020f010a01010100000a06161614110b0b0f090b0911020f020a01010108000a161614110b0b0f090b0911020f020a01010108000a161614110b0b0f090b0911020f020a01010108000a0601161611090a070e0404040f020b020801010108000a161611090a070e0404040f020b020801010108000a16160a0a11090a070e0404040f020b02010108000a061308100c0706002a042c0301161614140e0e110b1109080802020901010100000a161614140e0e110b1109080802020901010100000a161614140e0e110b1109080802020901010100000a06161614140e0e110b1109080802020901010100000a161614140e0e110b1109080802020901010100000a161614140e0e110b1109080802020901010100000a060116161411110b1109080809050e040a03020201010a1616110b110908080a0709050e040a03020201010a1616110b110908080a0709050e040a03020201010a061308100c0706002a042c030101161611090a070e0404040f020b020801010108000a161611090a070e0404040f020b020801010108000a16160a0a11090a070e0404040f020b02010108000a061308100c0706002a042c031402010602020316161109080807070905070504041602020201010a16160808070711060905070504041602020201010a16161109080807070a05050504041602020201010a06, 0x116161411140b11090b0911020f020f010a0100000a161614110b0b0b0911020f020f010a01010100000a161614] private def node1113:Certificate:=PackedParametricCertificateData.decode 9 data1113 private def data1140:List Nat:=[ 0x10b0b090a0909091308060101010a16161411160e0b090909130816020901060101010a16161411160e0b090a09130816020901060101010a0616161411160e0b090909130816020901060101010a16161411160e0b090909130816020901060101010a16161411160e0b090a09130816020901060101010a06011616141113080908090709050e041602020101010a1616141113080908090709050e041602020101010a1616141113080908090709050e041602020101010a0612021002000603060301140405020202031616141113080908090709050e041602020101010a1616141113080908090709050e041602020101010a1616141113080908090709050e041602020101010a0612021002000603060314020106020203140405020202030111020002020204161614110a090909130809070e041602080102010a161614110a090909130809070e041602080102010a161614110a090909130809070e041602080102010a06120210020006030603150403020202030c020b020502020a0408030f020d02010603060316161411160e0a090909130809071602080102010a16161411160e0a090909130809071602080102010a16161411160e0a090909130809071602080102010a06130803060018031a03150403020202030c020b020502020a0408031304000202060301010c0200020202040b020002020204, 0x116161411160e0b] private def node1140:Certificate:=PackedParametricCertificateData.decode 9 data1140 private def node1141:Certificate:=.split node1113 node1140 private def node1142:Certificate:=.negative 1 [(1,0),(1,9)] node1141 private def node1143:Certificate:=.split node1062 node1142 private def node1144:Certificate:=.positive 13 [(16,0),(9,7),(1,10)] node1143 private def node1145:Certificate:=.positive 13 [(12,0),(3,4),(4,7)] node1144 private def node1146:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node1145 private def node1147:Certificate:=.positive 4 [(4,0),(1,5),(3,7)] node1146 private def node1148:Certificate:=.positive 3 [(1,1),(6,2),(2,8)] node1147 private def node1149:Certificate:=.positive 3 [(1,0),(2,7)] node1148 private def data1170:List Nat:=[ 0x1161614140e0e0a0a0a080808160614040b040a010a161614140e0e0a0a0a080808160614040b040a010a161614140e0e0a0a0a080808160614040b040a010a060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060310040a020502030203110400020206030b0603020202030f0402020206030e040a06010203060316160e0e130a13090b0914040b04110113000916160e0e130a13090b0914040b04110113000916160e0e130a13090b0914040b041101130009060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060310040a020502030203110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node1170:Certificate:=PackedParametricCertificateData.decode 11 data1170 private def data1221:List Nat:=[ 0x1b7c0080801022caffbbcc1c5eeada190e782eeb5aaf299eaacfc9feeb5da881106010201d6dba5fef09eccff8bd5878ac5bad398f0ca87b0fcf4fda9b0090601020189f49f86ddafb1deb19cf192b4b898a2f9af99b3b3c2b4c00806010207d9e587f5e5cac9f4e187c398f9c3cd83b999fddc85909ae80804010217b3ebeda6f4f7bdf7b3e4f1c8d0e4bcdbd8cab9b9a6d7a0f0060101020993a6f6a9959cf7e0b888e2b1b0f6c1c3c1a1e5ffb1a2b980161600020cd0c994aae68e9cf381e594d49ea1f1dfd7c0cb8adef8e0c00a0a0002098bc4c7cade828e98c3aefdcbf8c1ace5c798add0e988c2d0080800020dc4cbd8afa9b988ffd4f5bb9191cfabffadc59ab1e9d5bc901606000217efc9a68bc0a4ba98bbb4f8ca92acf4e4f89e85d5e2add7e011060002018e96cffcc0c59789fab7f9b6a896d7eeb49684ae9797f4cb9009060002018fb890bf9cb2c0ad8886b58689c3c3c2a1f0fd98c0f089e00804000212bcc38df29bb9d6c4c3befb9db096e6b9fad6ddca92aeb8c0110100026adb83b796a5a69489fbdaac80c4e7d5ebdef6de90ec9cf0060100026e88ecd5cdb2cbe2dae2b6dea899aba29681d38a85daafa01e06d2f8cce98cae889bc8fbf3c0818ac392aaf0000a08070c03120034043e03150c050400020306030c020b0a030a00080412031304000202060310060102020203110400020206030101, 0x1043e03150c050400020306030f04020202020313040002020603010c02010202020340ef1def3ecf01da8f2c9de63e868524d9a4118d8d000accfcfedea7b4acaae6968bf1e1bbc6abb7eecac05cc5068aa023ca02cef130b1de0f98b93ee3f921f19e00058b9db4feadf2e0d791c581c8eef3888da5cfb9c02cb7db2393c10190fdb04acf9515a7e61188d448d3a925dde0000cc6c4a085d3fad2d6cffcc6a9f39585ecb8cec01616020211f4ada3a78cd8f1b4e5e0c895e7999ad3ee9da0c29ed79ec2141402020da3a8bab6e5cb84c1ab91c8ea8c8fcae8d8afbed3f1d4cd9e0a0a02024fe6c893b3f2c28ca9c8d499c3b490c090cf92e7e791be900909020209d799afd2f9bac1cc9f9acf9bccfcd389beb0f7a1f3f3c2f0080802021585b8e0b7e092e6b2e6fbb4c7a6d7b7e3dcb58aedf887aea01606020216c4a081f7f094d2aad8fee3a1e7e8f5e685dcb7feb59280f01106020201bbaca78681d2ade0eaad90ccb1a1c0ac908ec9fb9ebcb0d0a01404020226d09780f6f4b2dfc1baa7ffd1f5878efbe683b1a2eff5e3b00804020215de93bba1e1fb8ccec6f9f1b8fec9d9dda394b7bc96f3e1801616010242bc9abec2b4cfab8cf1c280edd8aceff9a9bb95b2d7be901111010219a5e4f39ac1c7bbc9a3ba89c093acead1c6cfe1ffd89db9f00a0a010216b4cecc9890d1e1cefcc1f280dcc797ccc4f0a3ace0e7, 0x1c9c0a8bf8cd6e1fea7fcd4e6e41404020216d5b5cca7bed9a9a5c0bae4d286ca9ed6e1e00804020203a9a2e1f4a4a6b7f3a1d384c3c298b1a1e0800404020201b8868eb1a5f29cfa88fcd5a6f7cac6e1f7901616010204dcb9839683ebcddebebeb7a7dfc3a58cdcf0111101020282859e83a396b0abe7ca90e3a4a8e6b7a6e80f0f010201c784bff2f4ebb0a6b0ae85fb9ee1f6db99d0080801020199feac90ecb5b0bfb7edc697e4e4dcde89ba1406010205e3a7b0b784a9dee1cf81fdc18fb5b2bee9f8130601027581acd583c3e7f4b5a280cfd396ceb5f780060601023cddd0a3b4fbf5cac0cbdb85cab5d8a7a3861404010209d8e2c3e6eab0c687dac08bfbabd89b9fb1b8130401022ed4dfd68380d393fccec38bb7d8f083bed80804010206b6e88c87a2decabff3bd88ef9acdc3d49680121200020acee6f9a2dde6d599d6caf8d8a7eefdabeac01111000202c9f497d6bbd7ede7a0cfcef5dbaa9acbc8f808080002019da0f8e6e38d88f4a6ef90dfafdfb0b19ac2080600022fa58894d5afb084c0e9c7f3d4a4fe88a39c0606000201dbc8cefbf398b4e699c5a2bcffcc99dd839a140400026af3e0e5f5da93ac938aaad0cea0efbfb7800804000204d1b3d6e68d8ed8b9c6df9fa9f2f4f39c95980604000235ecf28c81def8eebaeac3bbf9e6a390e5981e6097be8ed9b8b1d785cefbc0000a08070c03120034, 0x1bfd383ee86ca8ca3c8b78df1d00807010202d6abf0fffffb8effc6d993bea9dfbcb58e9abeaee28aa807070102039df8829097fa8992ada8b1988ffdf7f1b1d8f1f0fcaa86030301020293a7bceaae81b9c8aced93c1b89bb1958b96c6f5faac9e1500010201d1c885e5be9aebbd98e8c581be8adbe0c9c0a1dbe889dc1515000235e0b7c091a1b2be8486dd84c5ccd09f8cc686eea085c7e0120f000201ffbeaa938a87d485f1b496cfd9a9e2f2fb9bd89ca1e1801507000205bbf1afcba8f8f0fa8fdac5a3acab84febd8cbcd9a9a7a00707000203faacf8d084bdc5f7afe883aaefa4dbb7aaafe2d8c48da81937febeb693ca89b7b1a8baf9bde5dcf2fc00130202060006030803150c050400020306030f0402020202030c0203020202030188e103ef03a68357dc2bf2a040a3a3249fba0fdfb300019b9bb7abbb8bc696fadeeec5ba8007bad10d84d402ee810edf2ed18614b7fd3ea5c7248990004d8289f7f885d7afb0f491d5fe881616020205d1f09ceaacd6838bd3efcad2bdd9f8e2a0e01111020201d8a89df1adcbb5f3bcf38d938db687f5ded00a0a0202018af2ae9fc68e8fa2b3dbcabd8187e3a388d808080202018acbb8d5b38ab9abcae6cb89c2f89f9ddfc41406020208c4fdafb6bbd1e7eea8c4c398f0d384fdb2c0090602020181938ea7cdc5d9b1c9fdb6e1ffc7b1b2bcb00606020201abc5d8f7b4, 0x10204010c020002020204018a9112d002fd8618db2bdcff40babe249e810fc0c40056f8b7a3a7aaceec8eb1a0cc83dbdbdfa6e8ac06aaf60d8fe302f98e49b62eb2af129ad442eb8e26d3b10027d8d3e6e4f9dceaaef7ed99d5e6b3d8d1a8e008e8dc16b8970184958e74e4b90b9c90159e864ff6c32fbcae001e99a291e1b6bad7dafae6e9b899eccac69c151502025289d081f5bebcd7a5daedcd97af8d80beb9a9abf0a69280111102021680cfddceca9a89febfb399958adeb99ab7fee1ead6c80f0f02022bd1f2dac4bce1f2a09ef480b0ededf2af859d83f8ecf4150c020201b4e2d9c2ffe9f6aaa199fad89499f3eda6b3b4a3a8bc90150b0202039987add3d4d9d4ecccd4f7bec8ebfec080fccc99d0b1f80807020201a7a6b1989adeb4d2fc809084fe91f9befba9c08597eece140302022fc795f4d5be94bfd2dd95dbdcc9a8df9efe9bf7c9d2e00701020201c1d7c1dd8db495b0f3eea6d8dbf4f8b894ebce96e1acb21500020203f58f99dbf2eae6b8cdc7c1dc82bae9aa92c29ea4da85c01515010243c5a0dcbca1dec6d6aa8880a1cc8ddf848cc8bbeacce9fc1514010203b480af9dfed6c49fa4eee4b3c1a78d91a9acdcface9884100f010232e7acf9dcd9b9fba982c5d49baabdedfeb387aee2e0ac0f0f01021a9ce9cee3fbecadc1a3a4c7ea93b1d0dfe48d8187dcda0f0a01022197e795b89ece90b78e, 0x10702020cf7c497f1a694e3be90ee95bcbdadc381ef97b3e2b01506020205bfc0b4c4bfbdd7d9dfcaeff1e6b39cac88f6e7d8e01605020231fb9787aed1c8fee2bde1c1a2b9a68efbaebaccb0070302020ba8bf8f8ad388beb5ebbacc88c1d3d2d19780f3a0020202021a83f4fb8ebff9e29becc0f4cea0e5fd9d85e5dcc01515010268dcbed3a0e689b3ddd9dba8dd818cd2ba87858bdad0100f010201e3d08384a988b9d2b4a2e6dcb28b9eb9ceb9eeb1a00f0f010244cf99a2c9c4aabe97e3dca5858dbcc89fcd9090a8150c010202e5998692b6a5b1aeace6a88397e685b1b2bafba0b00705010201f682faea89f4fdadb08a82d5cb93ece7bbb0eabae00504010232a6b3f0978abfa0db928b92f7d688ecdec2bd95c00f03010263b5a38efca2bbdbaed8f0b9bbc7d3d1e4f9d3a2d80703010204d1a6fe8da5e1befcf3b1b8c58d87cafd9adde0a2d81515000246c3c3a7e093b88491cbf3bab8ed8edd9a8fa7fa86c20f05000204bd8ba2edcd80a5e9d0d7a5efbb9cd9cbf8a5ad8b8207050002168ec3d4e6f5f493a5eed8f5a4a4979989f5dae6eed2150300020fdfd995d2bdba8c8dc5a99bd1e9c1f2d7e1c4c7e1fe0202000201d794efc1f4db80fcbd81ac94aab6dab7f98191fa191cd0dec7b5fdbca5edb69787aba08800130202060006030803150403020202030f040202020203110201020202030c02020202, 0x1020dd189d2a0b5bb90a2b9dab2b5cbedf8b792bae7b6b9f9d7a3cdc28acdcdc4c99ec41515000206fc98fea290e6ddb4fdb9fce8c6bc8e9ff5a6d5fdefe5c8f2fca9adeaa58aeacab6980505000201a6e5b294c49682c186d2e2eae6e2b7adbbe3dae5f8c4b6ebddf7f187facbf6e3bebc0f0300023788888ae3b7a183efdb93b0e8aaecf2d8fcca83ffe9beb5e48ee1ac9afed58de5d00303000201a1efe4c0caf0e3b7e1b2e499c789ffeaba8ae5b687fafe8799f8dff3deb38e94efc80202000204cde2aaf790f6e490c3b6acfbc5f0aabda1aee2d4e4ebb9acb4e0ddd19defd9cc1901a3c3c5fda7c1f7ca9ed1c0bbbb9b90e6c49781fcc5bcf7d4c097d80013020206000603080315040f04010c000204060301011102000202020425e232880d8e01e8ac23cb913cf0a22eeea515c9960026d3cdbfebe89ee0d0f2dbd8c1aaa9f3a00b8cb216b1a1018f9108ff9a35fdfb24b6f63db5942bee8d001184e795cad0c6c786d6b8aa8bf0e09ae022fff31dafdb01a193e65be89f04c29e02c7865987cf51feac0027d7f1b9b3a7b8d9f692a9859afeb1e01515020262e291bdb98bf2e6d3e592888cd18383f4ccb1c5ff98151002021ed5c98296f09adb8eae9e80b0ffebd7f3b2fd8286800f0f020224bdb49ecfb18be3809ad2b1d29ebabfabb8d780e808080202058a97eab899a5fe919af88d92f5c3cfa982ca9fe815, 0x1e6d2c7c9b1f2948691f98ce8150f0202238794a1feb1f0808e91eaea808e8af8adefe7fb9d8de8cdff8ff1adc285cece88e0080802021d83cad4dfdf91cdc2a0e3dca2e5a8edbd84bfc2aebde9eca5e484ebaae9ccd5d60605020222f8b9d69ef4c6a8b7cabbafafccd5f8a2efbaf08de480b99e85ee9aa9a3f0a6a99c05050202069aeaebbac4f3bff78d9ee2d69fa8bdf0cadfa7b98fc29aff94a3d09fde8d988ff7c00f03020218f581bfecf3df8286d3f9ddbdb6abdf90f0e2dab6eeeecbc48d99cec1ccef81fee002020202078aa2d5dee6a3bbbdcba79ff7818dd1f3faa6e2bc93adbf83fab4b19981ce9ec8ee030002022392ece09092bab4beebc6c2ca8ca88beca8cdc3bdc287e0ec99c6f6e28cf09dded01515010205cbbcb984dce9e8999cd5c7d8e4a5c0b4f4aeece3f2c2eeedd4b6a6a4e391df8ce4ac15100102018bd286d980c482f495bbe4bf9eb9f98bc5b0e3bb8ae3d4828ed8ddef9692bddfbcc0060501020aece583979683cf97cfa3c1abf1eeadd7a5e6e082c0cecc9d8484ede3aca9c6f5e40505010204b3c59798d68aa2cefab889d3b2dcecf3df8e8c99b3adbcf48d8fdda4e292ec98cfd00f0301020891d5e8bda595869098befdb196f6f5f1b6ffbff6c087e7d6acc9f3c7ee8f84c480020201020ec3b1c5c7b8a2c6dfdae78483f08ea1e7d1e782facdeecfc59481bcc9b8f9a685e8030001, 0x1d2b5b6bfb5b1ddc5aecc151500021bc1d5ec91ffecebb5fecb81c3ac8ac6fce0adabdfd7e385d1b9d39aadf01503000226c4f7b3dfa6ba88cf80feffa5d8aef496d8aeadf9edd189d381e689ebbfac150200020adcdebac9e588ebadc5fbcce48fc2e8a5f480d0fed0def297adc4edc3c0c40f02000209848b9c8fda97b3e8c4b4dddacfbecac6f0ffb58ac195b9ccc0fcfeb4c6a0030200020691eefdde9aaee5e5c88f82a0a0cba8c389cce9eedce5e3f9f2efcec284c01907b1abfee99bbaddd695cfa684f1ece4d7feee91a9a2cf80001302020600060308031402010602020379b3b90cd58901c3d50187cc9a0104d8b981f5aea4819582f9f58d9cc2f483b3e8dbbab2a6e6f1fda9dad005829330d101cb07ceb01ab8e3478fe627d0f305868d0001ef858aea8483bac6b4c0dfb6ceefd8a6dfacf38c8af0a895fdfdfaffc004c3dd0aa6af0188fb0ca9e2148d9b20deca40a98a4cfab70071ad85faa0bc99d2a8a0c78df3aaaef0c49ce6fec8efc78bf5eccbdfc032d4b35187f604e8e11ac08f21bbdd3aa7b310c3ce4b9fc4001efb9098abfd83b3e2d7cad78dd0deedb1ceddfeae92afeddcb8c8f4e815cae611f08e01a2d1fd7687e8028bf602b3ea5c97e060d7bf0001c5c189acb7bb8396c99d96befdccddf89384e0dd9e9eb5f1be9ae7e81515020203fdc8c68da9a4ecbaedb0f79bbeb483b898e4b6f6efc5, 0x1020214a7b0a792c8e0a1aeadd29195fe9dec898b9fff93fbcae18be380a6aba2c20f05020202a9a6a1a2c8d3e1af9fb998a991aca1c1a5aeecb9b7d994c8ff9c8df5d5941204020201b5bdbfa394a9c4b7eddaa7d1dfc3db93b196e088f5afcfc5e9b7e5c0dfe01503020208f8cab6acc3b0e4f5b9e8f1d6c4aea0c5faf08399d389cf9db4c3adb8a1a81403020202f4fc9dadf292f19aefda82c499a2d6dee0f7f6b6d0d9b6ff86fdf9919984030302020bd1f38998c4dfd8fdd1f486ca8ab286ffcc899cc58ba9f3acabc5c8c39e980f020202078888b385f9d582e8d9b588eebf8ffbfcd68c87a4dcd5e2bf929c8aece9c40302020205ddd5c0f3f5afef8aeaccd2f0cf9cda80b68cea98b4eba3c6ed84f1969ea0020002020294c58cf7edcbe38fd686c098fef6daf8a2819dd0b5a48bd581def9c9f29c151501021691caa2a09fd99f8fbbf48ebaabc1abb3eaeeefb5d7d0f781cdf197f5faee15030102058aa0fbbcebffc8d482acf0accd9c8fbdfa9ae4d793a897cfc6aba9e7c3de140301020199d4a6f1dab2aaf9d781a4d9cad2a4c6e091908798d9b9eaf6fb91cbd68c0f02010207e3cdf296f0f099bea6968787f3e8da80f0c1ade3fab89fd5c6bbbb9f86800302010208d2e9dca3dcc2d3e0efc9978ce6b4ff87f1f4fb92a1bb94a18bbef49fa0da020001025897dc92ffc1d7a09cb9cceddb92828297f0ecc9, 0x1b4feb18ebedaec85b798abc9f9c9c3b0d7d1b3ecd1e59c15150002098783a789f3d587e5dfdd93a6c8e6eaabb6e9cdfa9682e1c0a29ff992efc8f3c2bcedcfe6cecca01510000202e6fec6f289cd9efcd999bfeca4eb8ab893c8dafec2bfdcf1ecc5ccf7fad3d6c7b88a939de28c80150700020495a8d388a1abb28eca9ca5caf3d6c695c381cc97bbff86c8d2f6dff4c1ebefa68fb899b9e5c6a00505000207d782bd95a494c7faef8ef9e4c38dd8a2aecbe4b0fc80eb8bcc9ac2f58da8fe88cf96fea4cecc0202000212bbb6feb8efc8e1a495f2c88b87edd681fcf6aed4ab998ef3f0ff86a1b185b184d6eef0f1e41902ffb19ad0fad1b9d5dcd3c7bbc4dba9f0a59eb5ba9b8daef2aeadaebee3e49db8001402000202020301016fcaa427c3991de7fc65ef8501018ec5d693d8b481f8c99ddbe2a2d3ebfbf297eaf6ebbca494d405b987038b91089ea40284bc20a18023aefb3bd7dd3ee5da00078a9185f4b69f9dd9e3828fd68ba181b8d9a2fd9db9b395de98498610d38504f3aa0b868a449fee10cbfd119a8644edf5000288b6eeaddfb7ead4a0d9f6a7caafe8c7daadd9aba99bbb87d4258cbd50cb807fe0a601a8e79f0397ec39ecab4daacd0183ff8e000fcb9fd5d1bf90b4a7fc8593bc96f7faafa9a9f998a99ff9f41616020207bcc1c791bdf58a86b1aad4ecc18ed6e2d5cb8a9dd1dcfdd8f7dec8a5c61515, 0x1ac9fd8e681b9a59e81f5d1f9b8b5e0111102023f90c9aec098bfd7cbd5e3bac2ad989caaa1a2edf4cabe83d494918380eae8d8eff8a6a3dbf01510020208f1bccfb59ef9eedbd4cc91d6afa4a1b0d8fa82e680b4f3ecf195f8e7b8a9d9f09da2f1b5aee1a00905020206f5fef0929aa8d9bfe69afccbeae0f089fdbbafedc1f88d9fd5badbabb8d8fca2a4b4a3a7fcc8070502024be986c79a98aee5b8e0fdd7a8f9d9a8e2c3bcb2a6b2cad2b0d59af4d4bc99acada6befaa6fed805050202038cc2a7dea3b5e4c5a1f3f9ec8688cee19ffcd8d9b290cea0dc92bfa8c9a89da4f0b2d0a1cc91ce020202020d81edb1f995b2b7c4ce8bc4e593d4c5e5a3a1c1c1e3b080ec939bd5feaabfc0a7a5c8dbd6d9d2020102020282a3f2dcce9addfd8882c6c7db9d9ecdd6d497aacea1c4c5b5e5d7e4f0ac9e88dda7aacbef9015150102088fc0af94e09385f7c2f68ba1c084eb80afbba88780c5a385b697fad2b49088cfe3e8c39ff39cf81510010207bcc2bba787f8df8596efefeb8fe49c92eb95fe96b2e7f7aabe909af5e38cf595afeccdb0d2f7d8150c010219d2bf83b4a382dbd9cbf09aa0f9b5dfd2b49bb391da93eeec81d3a7efa1d9ac8ba0d8ddd1d0a0050501020682e4ab85c8e8d4e5b1898cefd6fdd6b787998deba1a4a78dc698f5e2eac8b0e2e6a4baa7c09b94020201020d96e2bec1e0c1d7b5b8dbb1fc9681ff, 0x10901010100000a161614140f0f150b0f0a080816020901010100000a06161614140f0f150b0f0a080816020901010100000a161614140f0f150b0f0a080816020901010100000a161614140f0f150b0f0a080816020901010100000a06016b83a237abe213cc99018ee2e9010ff0c1a4b6d8bcd7fb8f95919db2ab9bd1ddf38cd8d786aee7d8e09bf6aad3f1d8c003a3f902a3930197ae06999619d58f4acbd224b8f70cbdc900059de4ee83a087d0f3d8fc9fafed97a7f59596d393c4bbcdf7fd98e1f5dab4dd87ecc002a2bf019ae941a725ae05bba318aae43cf7804fe6bf00029be2ee8fe1d7becca6fbe3ba9dc1ddaba6aeb4f9b5b7a691b1819dc4dfb8b6bab6801b80824381d902bf8a248cce4ad29f1be4ea1dafd011bde6005ea3b6afac86a590dfb68d9ec1e4c2dbdbc8ac8bbfa7f9bdfe80ccdff2f4ba9da2d87995d555d289158a9801b8c28459f5de3c8efe049aa6019a9f8100148cc48af68eef8487d2fabd85aafedd96aa988e8990cd8fd39ac88cb1b9dcfb82800780ed08aa9b01a1b3d0018cb4b50ab0fb09b89b5e869171efaa004db9a0ee86eeeecc83b0e4f08ea7a198d68ac9a6c4cfc6df99cda4e0edc4dde7a815150202079bc0e1fbcbddbae3d4cbf19285e69191ebf6a99b86b2dc8be6f0b2d7a49ccdd7bbfacd828787d015140202428daacacbdfbfc9d1f99cd6fa84dc95f79abca9d2b79786, 0x19ed782c7d1acc8f78080090202020dded082b8f3b48ec491c9b2e9c0f7c69ab8ec9cd080800502020201ffd2e28bdd9dbea1a7aeb8b0aec4d4b7e0a8db98a380800101020201a58cd4faa3cbdae3e98190b5edeaa4e7fc99c4e8808015100102168ffc9987d0a0e88db08994aaedf0b494d282cdd1a6aee8150c010217f6d99e9c8a94ca83e7a08f85abfbb4a687c7c5b880801505010201e2adfc8ca6b788b9f2eb96ee9df0a3f5c5b4dac19fbccc100201020888e8e5f3a4c4c692e49cc7decaf2cba7b9f3a3a3b5a0f20f02010248aef990f1ace181d4dc81e1fcb4f8fd8ac4c2dad2f7f20a0201020cc8bef6bada99869dedfcfaf9ab9ab98de5e297e88080070201020d8fd7c98f96c990b1fdf9f2bdbbfbb9d2c7b4ddebafe81515000214f5a4dc8aadf1da9ca9a781b9d380d685f0c7c285948080150f000201dba4c0fbcae78afecb998da1e9f88be3e8e0a68c9880801507000205a4a89fc4c799c5c78ac0a8e19be180b1c49be7ceea8080100500020d8ba0e7fd8bac80f98df782c3e792a0dd87abb5f180800f02000203b68dc4b3eaef8ff3cbcbcb9be6fc8bf4c7d086c5ad80800502000247eba08da6f6febfccd69efbded8f18cbabff8908080801902b0e3d5cbdbdcbde89beae8c1b08e8080001402000202020301161614140f0f150b0f0a080816020901010100000a161614140f0f150b0f0a08081602, 0x11616151414140f090f040f020f010a01010100000a1616151414140f090f040f020f010a01010100000a1616151414140f090f040f020a0101010f0000000a06161615141414150b0f090f020b010901010108000a161615141414150b0f090f020b010901010108000a161615141414150b0f090f020b010901010108000a06013ae6953d8fbb57e5f301cfdbc6010bc18fb580eb9187dabae990e3858dcefdb006b1b90a96c20198ce01d2a109eead08d2f2458fbf46aafc0002898beb979185ce91b683acf9d2979bc880803da2ed40a38d6df8cd01e4bac233989635b7b64d9ef201b5eebd00058a84ab97f2aaafc285a7df83a0d5dc80801510020215e6b9a9f8baa28fb28c8989c5f6d496f3eadae096888080150b02021b86aef8a2c1c3d2d8aec182b282b397c29bd9c6a880800f0502020288aad5d0e9c19ebdeabbfef7bfa581eec1ecd994d880800705020272a9958ce7bc95cef887e1e9bbb1f396898af5afe980801502020204dacaaefeb58ac4accafd9e9b92f2f08ba8aca9d2c180800f020202039ce9d983bad998b799b2c3ebb3] private def node1221:Certificate:=PackedParametricCertificateData.decode 9 data1221 private def data1243:List Nat:=[ 0x11616140f100b0f0b1108110214010901060101010a1616140f100b0f0b0c0b110811021401060101010a1616140f100b0f0b0b0b110811021401060101010a061616140f100b0f0b1108110214010901060101010a1616140f100b0f0b0c0b110811021401060101010a1616140f100b0f0b0b0b110811021401060101010a060116161611150913081108090809051102020101010a16161611150913081108090809051102020101010a16161611150913081108090809051102020101010a0614020002020203011404050202020316161611150913081108090809051102020101010a16161611150913081108090809051102020101010a16161611150913081108090809051102020101010a0613020206000603080315040f04010c00020406031404050202020301110200020202041616150913081108090809070b061102020108000a1616150913081108090809070b061102080102010a1616150913081108090809070b061102080102010a06130202060006030803150403020202030c020b020502020a040803110201020202030c020202020204010c0200020202040b020002020204] private def node1243:Certificate:=PackedParametricCertificateData.decode 9 data1243 private def node1244:Certificate:=.split node1221 node1243 private def node1245:Certificate:=.negative 1 [(1,0),(1,9)] node1244 private def node1246:Certificate:=.split node1170 node1245 private def node1247:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node1246 private def node1248:Certificate:=.positive 2 [(1,0),(1,2),(1,7)] node1247 private def node1249:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node1248 private def node1250:Certificate:=.positive 4 [(4,0),(1,5),(3,7)] node1249 private def node1251:Certificate:=.positive 1 [(1,0),(2,2)] node1250 private def node1252:Certificate:=.positive 1 [(1,1),(1,4)] node1251 private def node1253:Certificate:=.split node1149 node1252 private def data1281:List Nat:=[ 0x1161614140e0e0a0a0a08080814040b0409040a010a161614140e0e0a0a0a08080814040b0409040a010a161614140e0e0a0a0a0808081404090406040a010a060a08070c03120034043e03152c080400060312030c040b04070402020406031304000202060310040a0205020302030902080204020106040803161614140e0e0a0a0a080808160614040b040a010a161614140e0e0a0a0a080808160614040b040a010a161614140e0e0a0a0a080808160614040b040a010a060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060310040a02050203020311040002020603010f0402020206030e040a06010203060316160e0e130a13090b0914040b04110113000916160e0e130a13090b0914040b04110113000916160e0e130a13090b0914040b041101130009060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060310040a020502030203110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node1281:Certificate:=PackedParametricCertificateData.decode 11 data1281 private def data1324:List Nat:=[ 0x1e888898db7cbbeeca1fefba4080402021ac2a7a3c9cfa39b8cc2a2aa9dbdb21101020209d6c39bf8ccdbf6ddec9b82cedfaa0701020204fbdc8cdfcecddf9ab8d997bfa8ee1200020233a9ead1bea78894abc2c0c5af9ecc1616010216cefccebec1be87a8cbecc2d9eed00f0f010218fa99e191f9e4efaee0ecaf99a2900a0a010202adf6869995ca82b2ad90b7f6e8a80707010203e4fde38ac69b96dad2fde5f0bcc80606010215989aeedbcfc5a7ebf7fea5a48cd8090401020b96caa3e5adbf83d0f6b2bbd494a8080401021899c1a1adb6fda295a4f2d1d1f1e0160201020abdb5aeeba6c9abf59cadf8cfbd980701010208f4cbd3bd85e081a184f89db9b5b0120001023ca7979d8fc69dfe80cac8fdb1d2801616000216deac96cbc2f598edbee3ae86afb00f0f00021790fc8be8d2a0ebe1de9baed689f00a0a00027be6a0abf2c5f8ef80c4b789e1f00707000221d687dbd4defabaeb97888199aae00606000215a4b9fa8bbed697f6ead796e29bc0090400020b97eebe94fbddbaf5c8faaed5eea00804000216d2bafc87bd9b88adf78effa5cba0160200020bd9d1fc9e96d8dbfbf0fd8183f080120000023599f3b9c89e83ff8982fe9ddaeba01e198daaf2f4d8e5b0000a08070c03120034043e03150c05040002030603011304000202060301010b060302020204010e040a02090603040309020002020204, 0x18a8fbce684cce207070102028981b0c9ea83f5ea99a09dc1ecada1e2affe0f04010211dbb0d8f9a883d2f7a1caa884aaa284b9e01203010204abe9d4fedc818ffdc0b79196a1bdefc9d68c040201021c9eb294e3f4cf87aadb918dd19da3a2e1d00202010214d0ccc0cdeda4e0a48ee0a2e1cee5d5f4fe12000102019af6ea9baef4ccfaef82d0f9e18c88abb9801515000209ac90c0dc9ac1a2abb8a5f9a08e8fd2808af40f0f00027bb6fea8dd98fe87e3c5eebec287f5bccafc070700020399f5dd8aaec5b689b0e9c8b6c3a99eb59ae41203000207cdf0b3d4dfa5edd995d7f091b6baf0a2d7a8020200021cc1a690d0b9b0cac7bf80fbca80ad82daf019019dd8bcac98e7d6e9c4ff8c00130202060006030803150c05040002030603010c02030202020311110a0a14040b040f020b0208010701040002000a11110a0a14040b040f02080107010201040002000a11110a0a14040b040f02080107010201040002000a060a08070c03120034043e031504030202020303a0f403f0bb03a6d702a4f23789a52eb6fa2bc0941eacff0002ea8aeff0a7e9bce0e0161602020ec8ade3928ef6d399a2c786c49da00f0f02021affe7ecdbf2e2a7ffb6e4cead89940a0a020219fddaecd1f99180e5fef7f199f4080802025df385eaead6d591f9bef897d7de0606020218b5d6c6d1befc9cf3f2fabbdacae21404020217cc84, 0x100020202040c0201020202040c020002020204161615150f0907070f050a0503030f02070107000a15151510140f07070f050a0503030f02070109151515100707050503030f020606130202060006030803150c0d020c02050c0408030f0402020202040c02030202020311020002020204161615150f0f0f0a080503030f020302070002000a15150f0f0f0a080503030f020302070002000915150f0f070703030f0203020606130202060006030803150403020202035bd7d93cf18934e6e901cdafce0104b98b8794ebf1b19bcabc88f00198da0480dc01b1db03e7dd39a69640dddd08c3f10ffbba0021dff0e4ed88fdb48bdbfdc7f0151502020984cbfadbaad28798c4d2bac0c59aebcefcc00f0f020266e99f9690dfe6b5d9fa80c49daabde0bc900f0a020216a2c1a9c5b6cfd3b6f2939ab6aa9efcf79007070202029ae59e95ffa2dee4cbdeb6b88f8283ece9d00f0402021ce0dec9c6c883aeebfceacdefebd0c5e2f00404020201bd8fb487d39d82e49196f787b1c8c999d00303020201a0ce82cfbc8aa4db8da29993dc8ae9e3fb900402020234c0ed9cbfee99e6ccab82f1a3c5bddc9be00202020231a6b6ecd5f383c7d4d5849683a4c286b5b41200020202da8dd2aedbc1cfc3848ce8bef883ae9d8ec01515010209bad0ecf887e9bac697fcf7b4a6bdea83c9860f0f0102018cb0a4afb0c9cd94aefe9f, 0x1a9c0fdaeaa93ddb38eec9df080b4cc030202024091c7d7f4d9aa83ccf492a8deac9f8e9287c7d490d2a2a2a2f9ed87d9c21200020227f793d3c3e6ff9795beeba58884c5ce9fe2edf8d5c7e5c3fbe0aebd9ab81515010202accaa4a5868ef5b3c2afe8d6b4aeb4fed393f58f9ab1e6c7b9efc1e88cb00803010208eac5fbc981b0bbcfd4cdbb80dd9aa687bfb1899fe9a2e4cbb3d6a49ee8100201020fd49eb4f1f7a48baed480c7f9e6aa9dffeeb5e7db96aca4abdcf2de8ff00f02010248c8eec1a1ffd9b683dcb18091a6d086a6acc1e8cfc5a79f8fc898f3fdb00302010237858eecd98bfde1d9d3aafac7e0e8f293b5e396a1c9eed0ebe4cfd3f0e81200010210a690cdd18cd5f8cdb6f4a9b2f8c4e4f7928df283b186e2ec85efe4d5a01512000201bffa96d783cef9ffa79a8194c286b081ae81ffb28cdca686b0d39fc0b790120f000201c7a0a7eb8286a8f0fcfd9fc7dbcdc7a0c287e4aca693a0f9a99dc392bfb01503000203b4e2dd96a8b5ccd3cfb8b5b2f196f197c9c99a9cbee7f7edfadbbcaea0c0030200026df7d6e3dbeef8ecb1dbb18fb9aa9fc5c298d6e88c9fb9918fc9a6f180c00202000201c4a6ca9289ffe0cdb5f6c2e4ef8f92cf8382d5c9c6c9a390e8999680d01942e488cf8c9a87d5f4dfbf9b9ecac1c8b3d8e7aff3b1d800130202060006030803140201060202030f040202020204011102, 0x182afecf6acb889c8e4b6bbc2b8dbedf9b6f1dbfaf489a4b6c8191afbe6edff8cc493c3e38ea6e3bee9b2cfaccbf18ee20014020002020203010f0402020202046e96d020a6c929bae277aae7010fc4f4998fc5a39bb3e7a1af93a8f0b398f7b898f7d2d3b4a007f6d305dbc00bedee08fcdf22a1862287af43c5fb43aca6003c8faa8e8e8fc5c8d5c096cbe79cc0f3f1bae9e4b9d2c492f009dfb52099ed25dfb2049faa47b2d6028bd304aaeb40fc950007c0a2b5e591e5cee4c0d2eca9c2befc97f291d8bedf8bf79017ece06099db71b8e901b8f2f00ce4cc42e2d444b8aa0193ffc90003e4bd96e1ced393bb87a5b89097da999f87a2b5f5f8b0a4a0161602024e9ab09fb7e2a1b1ef89f9aae78f97bbfbad9bcbccb28b9efcf1a4b9bc1515020202b7a9979adbe9efb1d5ea8fa6da8e9afec4df9ffa88f4fdd2e1c6a1b8feb20a07020206dd8ed78ae8f4a8fda38f8887b1b7f095f2edcee2ca9ce0fd8889bac688070702020ce9cee4ca9acbfab6ca87ee9d8babcabe8ca298b4a3a8bdccc297fde4800803020217b29f8ad2818687ffb8cfd7eaf597d58edd82d8ade4c1d790b4b5f5e5980303020201ca91879da085e7a0fab3dae8b8bcc5cfb896f4afb2b7b0c4a1c3abe3de821502020204a2dfcae4df8f9dcf89e9acffa2a0f2d8dae1aa85d3c2e9b1adc2c4c9ae0f0202024c9ef4dbb1a8aea0b9bbc58291f8d7, 0x18c84a98784e3d9d493d5d8150202020483f2ee8df9b2a5fbd1f7e0c287a7aab79980a3beefda8698fc8eeef80f020202219db78eec8fc0eec6b9d6d0de8aa4b0b1a1abe888ebf0c588d3a6b4f00101020214f6eaeee4a8eba0e7d1e18881e2b1f6b9cac884a6d09ce3e3eadfa8120002020b99b3e39ca8c78ed4a3daa6d289b88b99e8dfbde9d9b385a8f5f88ea8151501021aecb0dcd2afd2929e86c4dac686daffd6e69c92b4c2caf4a2ba8091c41514010202c7a8d8e5bca28ecbecae9ee8c8dcc79591edc4bdcb8aa6ddbee69fb80f0501021dd7d18591f1bafdb6e0ecc5d1b4cbb9a5aae7aedac6d8dfd4f6dbbfc81002010212c5eaebd0a8a6ecc6c7c4c4e3e9a7a0c39cc1b7dae6a0d6bac48791dc0f02010216d8a6d0faf5ea91dc92c5fdc9e0d4d183bfdb9badf0edabf2a5ffeaf41200010203f8a7d9b684e8a5a0fda79cf19e9eaaa8c2a6f99bc685b497a1c298e0151500020ab29cf49af1d79cc9c9bbd1d9a092a0f1e686f582e7dcdddbcfcfa1c81510000204e7daef8de4fecfff8dbade80c68cb5db82dca0c3cdbdb3e6d2f2b098070700024180f4afccd4bbb4b3b983f1eaedcf879ee0a0cea5e7f89beea091d40f05000215f7ceadfd87dbf3eebd99e29095b4f5af85d497fba895daaff2aed4dc100200021ae0fdaec2bd809bb3849eb981bdad9abcbccefeb799ccbb8392aeb8ec0f02000216faa5af, 0x11616151414140f090f040f020f010a01010100000a1616151414140f090f040f020f010a01010100000a1616151414140f090f040f020a0101010f0000000a06161615141414150b0f090f020b010901010108000a161615141414150b0f090f020b010901010108000a161615141414150b0f090f020b010901010108000a060120b4ce25c08623cef669c3c9010595bbe79e8bbeffdcc0aed7c6afdcbf9bbbfdc197a8ddd8078ab406f8a304d99e01f5fb1ab6d10bedf440b8994f80f8001188d7e8cfa1f0e8b39dc3e7d2a6c485e3f7a2c0f1d98db0029ea202bf9306eefb06c09440d1d135eaf21bc9f810e397001af9f1f2dcf6a4a3e2c291b5f8deddbfe583d582cb84b4f050b6de52d7824e97d601eaa7dd41becb40a1e73bb6cf01bd97840046dab0e684a2e7fca7eda1d4a3db9285a3a5828b9798841515020225909ebec3abe7b5cfc387eb97bde8e1dfdb83c6e1d48cb7c9e8d381a41514020206d3f6a783c8d18f87a5bfe39bd8ebec88e78d8ccdc385a8cfdffaa4f8070702022ddfb083fafffae8e483ee91e1eed7a0b0a895b2b9a2b9ac87c8b5fcd80f0602026ab291d1f2b498f6cce9cdbceef4c1c5b593cdaaa1fac491e7b5c9980f05020205b7c2c78a8094ec80e19ba7b4fda297bec2] private def node1324:Certificate:=PackedParametricCertificateData.decode 11 data1324 private def node1325:Certificate:=.split node1281 node1324 private def node1326:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node1325 private def node1327:Certificate:=.positive 2 [(1,0),(1,2),(1,7)] node1326 private def node1328:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node1327 private def node1329:Certificate:=.positive 4 [(4,0),(1,5),(3,7)] node1328 private def data1360:List Nat:=[ 0x111110f0a0a0a0a0808080b040f010201080002000a11110f0a0a0a0a0808080b040f010201080002000a11110f0a0a0a0a0808080b040f010201080002000a060a08070c03120034043e0315040302020203161614140f0f0e0e0a0a0a0808080b0409040a010a161614140f0f0e0e0a0a0a0808080b0409040a010a161614140f0f0e0e0a0a0a0808080b0409040a010a060a08070c03120034043e03152c0804000603120301130400020206030b06050202020307020402020203161614140f0f0e0e0a0a0a08080816060b040a010a161614140f0f0e0e0a0a0a08080816060b040a010a161614140f0f0e0e0a0a0a08080816060b040a010a060a08070c03120034043e03152c080400060312030b020a0203040002040603130400020206030b06050202020311040002020603010f0402020206030e040a06010203060316160f0f0e0e130a0f0a0b090b04110113000916160f0f0e0e130a0f0a0b090b04110113000916160f0f0e0e130a0f0a0b090f080b04110109060a08070c03120034043e03152c080400060312030b020a0203040002040603130400020206030b060502020203110400020206031004060c02120316030f0402020206030e040a06010203060301] private def node1360:Certificate:=PackedParametricCertificateData.decode 11 data1360 private def data1403:List Nat:=[ 0x110070707030206061302020600060308031402010602020312040c04020603060401110200020202040f02090201060306040d0608060204000a040e041616151515100f0f100b0f0707070a05030307010a151515100f0f100b0f0707070a050303070109151515100f0f0f0707071005060613020206000603080315040c020506010204040312040c0402060306040c02030202020311020002020204161615100f0f100b0f0711050f05080515030f010a15151510110f0f0f100b0f0708051503030309151010100f0f0f0715030303060613020206000603080315040302020203151515140f0f0f0704040f030303040202020f000a151515140f0f0f070f030303040202020f000915150f0f0f070f03030302020606130202060006030803150c05040002030603010c02030202020311110f0f0e0a0a0a14040b0404040f01020108000a11110f0f0e0a0a0a14040b0404040f01020108000a11110f0f0e0a0a0a14040b0404040f01020108000a060a08070c03120034043e0315040302020203161614140e0e0a0a0f08080814040b04020204000a161614140e0e0a0a0f08080814040b04020204000a161614140e0e0a0a0f08080814040b04090402020a060a08070c03120034043e03150c05040002030603011304000202060301010e0208020302030204010e0c0c020b060608040c0309020002020204, 0x1d193c4a5cbce880101020252ad8fa8d8affef799e5aae3c1b6e8ccc6f881c1ff9ecbdfd181ec1515010204d1a396bda0bba0c5d6f5a2a08cc589d19ca9deffeb80d08a9bc0b8fc151001020482ebeac2dbfce9e19097dab2b5bde4d7fdf4f28df2b7ca95efdaedb8110f01020ac5dd83d595b2fce3b6d4b08cb097efedcef380978dc39194e4f08c0f0f01026ab1f9abb893ec99b0aac7b5fbd09de2a3a4c9cfd79ac5e0b6a4ec8c100b01020b8df9d5a0a3f2faadd28fabf8809cf8c3adc0a1b9efc4b6ebfac9d40303010221f3aedad3b1d8f1d1e0fcff9099e9b7f8f08fca9df28d8ff1c1fdf0151500020488d1a4f0b7e3cdf6dbf98d99ff88eefffe92c78c90f7bdf9f3ec81b41010000205d7a68fe0eed7adb1bfb4d0c7d4e5ccecd2a1e6a284b2fffcefc994960f0f000228bcb2aac0c2d0c5eeaa9ca1caae90bed2f899afc9ce9889d5f0f0ce0f030002049da6f0edd08eb4f2f7ffba8efb9aabfce0b7a5c1aed5e58c97f2b0150200026d99eebc8a96adcdf2e0d9eac8dfb6d587fddeffcdacc0b8e5ad9a800202000201ff82d0f181f993e6fcdbdfbea795c3faf1addb95dbc7d5c088d7e4196a8ed5c7e4a3a9b4f3eca997c39585bce9a6acfc8200140200020202030112040c0402060306041616151515100f0f100b0a07070708030f0103000a151515100f0f0a0707071503080303020f0109151515100f0f, 0x10c010b010a0101010e000a06161615150f0f0e0e100b0c010b0101010f0000000a161614100f0f0e0e100b0c010b0101010f0000000a161615150f0f0e0e100b0b0101010f00080000000a0601419ef34ebefd42faf701d2d8ea0104a8e587eab2a0f4e1e5dfb1adfe82a7c3a7ecb6d1aac808fab613a6048fb702efb903b38c0cedc249c5e939a59c0001848784e0edb9dbd2d680c1feba82c1a4d892c0f58086a811c4cb37c8d632909909b39e1ba48a1fa9ea0eb3a849819b0003bf999281d2abd384e4f69da684c78be189c6c9aeeef84eeee854ecb84dafca01ea99cd3feadb3e8e8f3cbc8b01bab4f8000293c8a29ae3b2c8bcfec898b8d18a87f6839df6a5dbfc151502020589bdaaf98a88d19ecc90a48aef95a6fafaf0a496d3ca9eaae0bae3a41510020201f6a4b0f6b5bffea28482cdaacbecbed3f69cf7bda6e9e5c3a1e1cbb4141002023e86bfddec9d9bc2a2958db6d596b3e8a694a5a7fc8dfec5cca1e5cc110f020217a1c0a0848ddddaabc1fefd8ddbf0e6ca98b5d5f9f891a5978bfbe40f0f02025bdeabf39db7b497b0ee97c685b7a7f6bedad69c9597c78c8da3abe40707020225ca84a5cdb4b3b99a88dba598c6e88bc5cafa9ef0beb3828af9c2d0030302020197acc6e9dae784e1958fc6b9959b8a8bffabffaafabda1c894d1b4cc0f01020203b5cfecade5fad7c495b6d98499e2f4d9efd2ea9f, 0x1161615140f0f100b10090f0808080c0101010e000a16160f0f100b100908080c010b010a0101010e000a16160f0f100b10090808] private def node1403:Certificate:=PackedParametricCertificateData.decode 11 data1403 private def node1404:Certificate:=.split node1360 node1403 private def node1405:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node1404 private def node1406:Certificate:=.positive 4 [(3,0),(3,3),(1,7)] node1405 private def node1407:Certificate:=.positive 5 [(4,0),(3,2),(1,6)] node1406 private def data1438:List Nat:=[ 0x1160f160e0e0d0b0b0b040d020f010e01080102010a160f160e0e0d0b0b0b040d020f010e01080102010a160f160e0e0d0b0b0b040d020f010e01080102010a060a08070c03120034043e03150403020202031111110f0e0b110a0f08080809060b040a010e000a1111110f0e0b110a0f08080809060b040a010e000a1111110f0e0b110a0f08080809060b040a010e000a060a08070c03120034043e03152c0804000603120301130400020206030b060502020203070204020202031111110f0e0b110a14090f0808080b040a010e000a1111110f0e0b110a14090f0808080b040a010e000a1111110f0e0b110a14090f0808080b040a010e000a060a08070c03120034043e03152c0804000603120314040a0c030e031203130400020206030b06050202020311040002020603010f0402020206030e040a060102030603110f0f0f110a0b090f080b0413010f010e01091111110f0f0f110a0b090f080b0413010f01091111110f0f0f110a0b090f080b0413010f0109060a08070c03120034043e03152c0804000603120314040a0c030e031203130400020206030b060502020203110400020206031004060c02120316030f0402020206030e040a06010203060301] private def node1438:Certificate:=PackedParametricCertificateData.decode 11 data1438 private def data1475:List Nat:=[ 0x10a0909070f010e0101010a160f110f160e100b0e0b0a0909070f010e0101010a0613020f060d02000a040a03010c020b0a030a0008041204160f110f160e100b0e0b0a0909070f010e0101010a160f110f160e100b0e0b0a0909070f010e0101010a160f110f160e100b0e0b0a0909070f010e0101010a06130202060006030803140201060202030b0c030802060104041204011102000202020409020802010c0002040e0408060706020e0008041604160f160e100b0e0b0a0a10090b050f010e0101010a160f160e100b0e0b0a0a10090f010e01070101010a160f160e100b0e0b0a0a10090f010e01070101010a06130202060006030803140201060202030b0c0308020601040412040c02030202020311020002020204160f160e0e0d100b0e0b090508050b030f010e010a160f160e0e0d100b0e0b090508050b030f010e010a160f160e0e0d100b0e0b090508050b030f010e010a06130202060006030803150403020202030b060702030201020406040c020302020203160f160e0e0d0b0b0b040d020f010e01080102010a160f160e0e0d0b0b0b040d020f010e01080102010a160f160e140d0b0b0b040d020f010e01080102010a060a08070c03120034043e031504030202020313020c020b0807060406041304000202060301010806070603080206040e04010e1c0a1406060506041c0309020002020204, 0x1160f160e150b100b0e0b100908080d010c0100000a160f160e150b100b0e0b100908080d010c0100000a160f160e150b100b0e0b100908080c01010100000a06160f160e0e0d150b100b0e0b0c010a01010108000a160f160e0e0d150b100b0e0b0c010a01010108000a160f160e0e0d150b100b0e0b0c010a01010108000a0601160f110f160e100b0e0b0a0909070f010e0101010a160f110f160e100b0e0b] private def node1475:Certificate:=PackedParametricCertificateData.decode 11 data1475 private def node1476:Certificate:=.split node1438 node1475 private def node1477:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node1476 private def node1478:Certificate:=.positive 4 [(3,0),(3,3),(1,7)] node1477 private def node1479:Certificate:=.positive 1 [(3,2),(1,8)] node1478 private def node1480:Certificate:=.split node1407 node1479 private def node1481:Certificate:=.split node1329 node1480 private def data1520:List Nat:=[ 0x10a08080804040e0202020a000a161614140e0e0f080a08080804040e0202020a000a06130202060006030803152c08040006031203011102010202020316160e0e0a0a0a080808140408040404080002000a16160e0e0a0a0a080808140408040f00080002000a16160e0e0f0a0a0a0a08080814040f00080002000a060a08070c03120034043e031504030202020314140e0e0f080a0808081404080402020a0004000a14140e0e0f080a080808140408040e0202020a000a14140e0e0f080a08080814040e0202020a010a000a060a08070c03120034043e03152c080400060312030113040002020603010702040202020314140e0e0f080a08080816061404080402020a000a14140e0e0f080a08080816061404080402020a000a14140e0e0f080a08080816061404080402020a000a060a08070c03120034043e03152c080400060312030b020a0203040002040603130400020206031006010202020311040002020603010f0402020206030e040a0601020306030e0e130a11090b090f0814040b040e021300090e0e130a11090b090f0814040b040e021300090e0e130a11090b090f0814040b040e02130009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060310060102020203110400020206031004060c02120316030f0402020206030e040a06010203060301, 0x1161614140c0b0a080e0408030a011400080002000a161615140c0b0c090a080e0408030a01080002000a16161514110a0c090a080e0408030a01080002000a061302020600060308031504030202020314140e0e14080f080a08080804040e0202020a000a14140e0e14080f08] private def node1520:Certificate:=PackedParametricCertificateData.decode 11 data1520 private def data1555:List Nat:=[ 0x18acfd8b2f0f291c4eb91a799fe9ac590070700023ba39797b2c19793b7ecaaf4fbdddda4c6d5a7b5aac7a3fc89b7dfc01502000235e1e7bff3b1c2e7eca8d9d2c1eac4ac9de0babfe69186a3acb0d9bee01919aaf1d295c7bd9cae8cb3b4e6ebc981d3ad8ee7d0b000140200020202030112040c0402060306040c020302020204110200020202040f02090201060306040d0608060204000a040e0415140e0e15080f0707070e0303031502020207000a151515140f0707070e0304030303150207000915150f0f0f070707030315020606140200020202030c020a02050c03040312040c04020603060416100e0e0f0707070a050f0303031502070003000a16100f0707070a050f0303031502070003000915150f0f0f07070703031502060613020206000603080315040c020506010204040312040c04020603060401110200020202040f0f0e0e0f070f0308030303070203020f0002000a0f0f0f070f0308030303070203020f000200090f0f0f070f0303030702030206061302020600060308031504030202020316100f0f15081004040415030f030303040202020a151516100f0f150815030f030303040202020915150f0f15030f03030302020606130202060006030803150c0504000203060301110201020202030b060502020204010e0208020302030204010e0c0c020b060608040c0309020002020204, 0x1aa8fc2f7800f0f020201bbccfb95c4fabb948dc995bbdad0bbf3aa9e8bd3b9c5a796bde38af00a0702025eadb3b489c78d8c8184efb3fed1f1e6d4c69ca99dc1ceb0c7eee1e0070702020fa695ebd9a3fcfbbaeaaeb0fadbedefaeaebfb6cddfcca7d8a2a0f8e0070502021baca1dcf68dcdb6b1c6eeac9fa7a7c8f9fb9eedb1e4c9b8c1e48d80150202022bba94cac5c1e1dbfdeff490c087b7b5a6d48794d7e2ac91bea4c882900202020202fca4f8b092eed2f1de9b9ac59cf2fcfaf4f1d4afc7aebfa9f8dd97e40101020213d4e496f4cffcd790968f96a5c2dc81a8e9d6f1d3dedc9abdb8efe8151501022ad98f89a49fc6a9d9a2c89af8e7e3c3d7aa85b185c4ec87e4abccc9fe1514010204e9c78c9cdaa2a68cc381f9fab6a2ee9797bc83d08fd9ccd7e0c5fbb01610010265cd86b887f1eaf481bbf9c9b0ece0dce8d987fa9391cea9accac198100f0102329bfef2d7c7adc4aa94a2fabffec5d4d188d2d7c7f1c4d2a0f696b60f0f010204d7e7dda587f1b295aff2c7a0b5dbb2f2b38ff3ccc996cfb8a0ecc49c1502010232f1bceccb97eeb8dff0f2e9acb69eaedbb7d8a5b7a8cf86add992c1981001010201c192a3f9bdd194d4bbf5b5c8e29ee08edcc796ba9889e8a2f494b2c81515000232d0f7f0afaada92d59b839bccc6d9c98acbc09bafd4a2a180ca8dc3900f0f0002058ea5c7d2de81b7e7f4ca8584, 0x188c1eeb7cebf90161000021bf4cfa7a3d4b9afe4dcda91d5c8e89fdaea980f0f000231a9c08696c5caa1f098ced1fceed5dbeac8820e0e000201b1998fbb968af0f79285d6c2b1d7f7ccc0a59c150b000201c8cc83c5a88ff18ae0f998e7b69380f197b7880c01000267a6e5c9bd82e7e8deca9fcc92adba87d1fde80b01000201e1f2e8e2eb8cfdab9c9aedb2a984fd8e8cc7e80101000201a5c8fabffe91e086dbb3d3a9e4a2f6809bd7940800000201b6abf4bce4a886a7afa09cf7cfdaefebb4bfa8000000023cbbd1e083d5d4839dc0f9cafe97efdd81bbe41e01f99f86fcd19d90f3cb93b4e200014b83944cf4a239f8f601d1f0ab0161d2b691fac5efe9bef0a8bc8e84a8a9b2a2dadebec2c401a79905ab8e52ff018df903f0c90edfe448b6973dc6fe001dfaabe6cbdb9d83b9fcc693f4a5e6a3bddd8dbda5c3fca053d301bd8e07d8c30696f23ac7873c9e8c10fcf812d3fb0001f491e4f7f788cd83ea9adc9bebf1f4f1caae95a5ccccf4568e9d57a1ef3d9abb01e4ab9a38f4ae37f6a4389dc401a9889500348be685a6f8ae9ae9a2edd8d3f3f18fe9acd0e3b59ab0151502021c8efbb797b89b8cb3899acf878df3f095f7f0d2a18ae5b7a1b6b8cb90151402020bc5b1fca7d1baddcd94a4d394dbaee2e69dd18de197f7bbb2b5d2f9e0161002020594cfd7be8ce68790efdd90ebdff9cbc893bfe58ff2b7d9, 0x1dd0e9bae26f59d45a1fa1de7bb00019ad4e9aba4bbcef2c4eaecc299b00a84e03991800190ceeb1f8b9413d1f82f90ad3bb78c0afcb30003b4c0c0ed9afad092cbf7859bf01514020201e8bd8fe6c5fb9ebadff0b2e1da96f597a2c8a00f0f02023feea5bbe1c5d188b19286cdb5a3e9b5e8c8860e0e0202019f84cbf399d8c9d196cea3b5eeb3d4e7b2fe98150b020265f396f4c8a6a7e5edee8dabc1c9beffc8a7900c01020201dbf7e7a3b7d4aac3f8a6fbacfcbec3c9ebbcc80b0102020181e3d8fba1c3aaaec4f9c5eeb4dcb2c2baf9a8010102020181d6c1b4cafbf0acf094cbb4fb98899ee3cd84080002020185e2cb9ec7a5f8a6bbc581c3abc389c5929a880000020262ad8087e292b6f199dfaae5efebf8abdfeca41514010201b88e9595af8bcc87b7aec5f298bf88d6c2d9b80f0f01023da4f6a1c2e5ccdfa1cceaa3fee9d3d5ff8ece0e0e010201aaecc890caa2c4fd8283d2bb988f98df93fff0150b01020189bcf596b5aa8cffd8decf809fe7919aaa85d00c01010201e0ba9ae39791ec9ba8d8a79194b3d7aeabbbe00b010102018a93b4f8faadd7b5a0aca1c5cca5e5cffdecc001010102018de79ef3d5cd8b9c96b798bab6b7a2b4dce2ec080001020180a782bf9794be8298d8a9c48bc0c7aff28498000001026196dfd4bfeca8f9e691ade8c798f5d281d7dc151400024991acd6c1df9e85a6b4c3fa, 0x1f8cff5e6ecc4ec8bcc83800f0f020203f6bcb7e4a0fed4a48f88a1ff800e0e02020ad5c1d8c7c1bdeeafd1dbb2cde0150b020209c5968ab483f1ff8a8febc8e5c01509020205c799b4f185bcf2f48696ec83800c01020211b9ba92e7e89a83b39cf5f4dcc0010102020efcaf80add986e6cda482dcfb800e00020204c2bcba88eed3bee5fdf4e6e6c01514010211a9f99fa0f8d5bbc084e189d6d80f0f010203b9e9dac2df85ca9ac5bb9284800e0e01020b848decedd7c3eabe92f2faefc8150b010207a5c0ac99f482f6dea2a5f2f5c01509010203e8ebabfaf3fcb4b3ffd6cbf1f80808010231df8f839e95f4adfc84daa3c60c01010215e8ebf48087ffdd94f6a890b2d80a010102019fc0bccfbbc5a782ac9becacd0010101020bf7a889c58f99a7c2c2dbeef4ba0000010203a3b5e8e0e0d3f3eea0a0fbe7c0151400020fa8a3a69bb792b9a0fda39c8d800f0f000202efbface2f1f2b5a8f4dcecdda00e0e00020bcde9d3f0b2cda8a2a9f6ab86e0150b00020bb686e6ffa38deac8b190b2de801509000201e0bef3a5d6e6eefcc9c5b387800808000251e9f0e2b0ef99c4e7df8db6a00c01000212f9e58df3bff28df8b1f6b6cb800a01000204b08297a3d3b4af8692d7cbe380010100020de2f0f2f487b8a3a3c1a9e3d3a0000000026a84d1a1cfbdefcaa2dc96ebc01e11bcd5f686c6a00001ef9d309918cf02a6, 0x160a501a7bf0ee201e49b10c1e621b6af3efbb22cb9ab000ed198acbef4f4c4e0151402020e869cc7e6cedbc59aca95c5f0c0170f020202d7e6] private def node1555:Certificate:=PackedParametricCertificateData.decode 11 data1555 private def node1556:Certificate:=.split node1520 node1555 private def node1557:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node1556 private def node1558:Certificate:=.positive 1 [(1,0),(1,8)] node1557 private def node1559:Certificate:=.positive 1 [(1,0),(1,7)] node1558 private def data1598:List Nat:=[ 0x1110e110a0e090e0808080e010a0100000a1414110f110e160a110a0e0908080e010a0100000a06130202060006030803152c080400060312030111020102020203160e0e0d140b0b0b0b0409040f010e01080102010a160e0e0d0b0b0b0409040d020f010e01080102010a160e0e0d0b0b0b0409040d020f010e01080102010a060a08070c03120034043e0315040302020203110f110e160a110a0e09080809060b040e010a010a110f110e160a110a0e09080809060b040e010a010a110f110e160a110a0e09080809060b040e010a010a060a08070c03120034043e03152c0804000603120301130400020206030107020402020203110f160e110e160a14090e0908080b040e010a010a110f110e160a110a14090e0908080b040e010a010a110f110e160a110a14090e0908080b040e010a010a060a08070c03120034043e03152c0804000603120314040a0c030e031203130400020206031006010202020311040002020603010f0402020206030e040a060102030603110e0e0b16090b090f080b040e0113000f0009110e0e0b110a16090b090f080b0413000f0009110e0e0b110a16090b090f080b0413000f0009060a08070c03120034043e03152c0804000603120314040a0c030e0312031304000202060310060102020203110400020206031004060c02120316030f0402020206030e040a06010203060301, 0x10e0d160a080509030d020f010e01080102010e000a0e0d0e0c160a080509030d020f010e01080102010a0e0d160a080509030d020f010e01080102010e000a06130202060006030803150403020202031414110f110e110a0e090e0808080e010a0100000a1414110f] private def node1598:Certificate:=PackedParametricCertificateData.decode 11 data1598 private def data1630:List Nat:=[ 0x100000a06160f160e0e0d150b140b0e0b0c010a01010108000a160f160e0e0d150b140b0e0b0c010a01010108000a160f160e0e0d150b140b0e0b0c010a01010108000a0601160f160e0e0d150b0e0b0c0909070f010e0101010a160f160e0e0d150b0e0b0c0909070f010e0101010a160f160e0e0d150b0e0b0c0909070f010e0101010a0614020002020203010c020b0a030a00080412040c0203020202041102000202020409020802010c0002040e0408060706020e0008041604160f160e0e0d150b0e0b0a0a0b050f010e0101010a160f160e0e0d0c0c150b0e0b0a0a0f010e0101010a160f160e0e0d0e0b0c0a0a0a0f010e01070101010a06140200020202030b0205060202030c020b0a030a0008041204160f160e0e0d150b0e0b0a0a0b050f010e0101010a160f160e0e0d0c0c150b0e0b0a0a0f010e0101010a160f160e0e0d0e0b0c0a0a0a0f010e01070101010a06130202060006030803140201060202030b0c0308020601040412040111020002020204160e0e0d0e0b090508050b0309030f010e0108010a160f160e0e0d0e0b110508050b0309030f010e010a160f160e0e0d0c0c110508050b0309030f010e010a06130202060006030803150403020202030b06070203020102040604110201020202030b060502020204010806070603080206040e04010e1c0a1406060506041c0309020002020204, 0x1160e0e0d140c150b0e0b170808080c01010100000a160e0e0d140c150b0e0b170808080c01010100000a160e0e0d140c150b0e0b170808080c010101] private def node1630:Certificate:=PackedParametricCertificateData.decode 11 data1630 private def node1631:Certificate:=.split node1598 node1630 private def node1632:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node1631 private def node1633:Certificate:=.positive 1 [(1,0),(1,8)] node1632 private def data1678:List Nat:=[ 0x10e0b110a14090e0908080e010d010a010a1414110d0e0b110a14090e0908080e010d010a010a06130202060006030803152c080400060312030111020102020203160f160e0e0c08050b040c020f010e01080102010a160f160e0e0c08050b040c020f010e01080102010a160f160e0e0c08050b040c020f010e01080102010a060a08070c03120034043e0315040302020203160d110d0e0b160a14090e0908080b040e010a010a110d0e0b110a14090e0908080b040e010d010a010a110d0e0b14090e09080809060b040e010d010a010a060a08070c03120034043e03152c0804000603120301130400020206030101110e160d110d160a14090e0908080b040e010a010a110d0e0b160a110a14090e0908080b040e010a010a110d0e0b110a14090e0908080b040e010d010a010a060a08070c03120034043e03152c080400060312031404130c09240332043603130400020206031006010202020311040002020603010f0402020206030e040a060102030603110e160911090b090f0816040b0413000f0009110e110a160911090b090f080b0413000f0009110e110a160911090b090f080b0413000f0009060a08070c03120034043e03152c080400060312031404130c0924033204360313040002020603100601020202031104000202060310040f0c05240236043a030f0402020206030e040a06010203060301, 0x1160e160d0e0c140b0e0b160a0b020a01080100000a160f160e160d0e0c140b160a0b020a01080100000a160f160e0e0c140b160a09090b020a01080100000a06130202060006030803140201060202030a04030402020306040802060202020311020002020204160e140c0e0c160a0c0808050c020e01080102010a160e140c0e0c160a0c0808050c020e01080102010a160e160d0e0c160a08050c020f010e01080102010a06130202060006030803150403020202031414160d110d0e0b110a14090e0908080e010a010a1414110d] private def node1678:Certificate:=PackedParametricCertificateData.decode 11 data1678 private def data1704:List Nat:=[ 0x1160e160d0e0b0e0a170808080c020c01010100000a160e160d0e0b0e0a170808080c020c01010100000a160e160d0e0b0e0a170808080c020c01010100000a06160f160e160d140b0e0a0c020a020a01010108000a160f160e160d140b0e0a0b090c020a01010108000a160f160d140b0e0a0b090c020a010101110008000a06010b0205060202040c020b0a030a00080412041202090203060306041102000202020407020106000203080408060706020e0008041604160f160e160d140b0e0a0c020a020a01010108000a160f160e160d140b0e0a0b090c020a01010108000a160f160d140b0e0a0b090c020a010101110008000a060b020606020203160e160d140b0e0b0c020b020f010d01010100000a160e160d140b0e0b0c020b020f010d01010100000a160e160d140b0e0b0c020b020f010d01010100000a0614020002020203010c020b0a030a0008041204160e160d0e0b0e0a0c020b020f010d01010100000a160e160d140b0e0b0c020b020f010d01010100000a160e160d140b0e0b0c020b020f010d01010100000a06130202060006030803140201060202030a0403040202030604011102000202020407020402020204060603020206030804010e1c0a1406060506041c0309020002020204] private def node1704:Certificate:=PackedParametricCertificateData.decode 11 data1704 private def node1705:Certificate:=.split node1678 node1704 private def node1706:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node1705 private def data1758:List Nat:=[ 0x1060e010c010a010a160e110e160c110c0e09080809060e010c010a010a160e110e160c110c0e09080809060e010d010a010a06130202060006030803152c080400060312030111020102020203160f160e160d140b0e0b0b080f0505020e0108010a160f160e140b0e0b0b080f0505020e01080102010a160f160e140b0e0b0b080f0505020e01080102010a060a08070c03120034043e0315040302020203110e160d160c14090e09080809060e010c010a010a160e110e160c14090e09080809060e010c010a010a160e110e160c110c0e09080809060e010d010a010a060a08070c03120034043e03152c0804000603120301130400020206030101160e110c0e0b110a0e090f0808080b040e010a010a160e110c0e0b110a0e090f0808080b040e010a010a160e110e110c160a110a0e0908080e010d010a010a060a08070c03120034043e03152c0804000603120315040302020203130400020206031006010202020311040002020603010f0402020206030e040a060102030603110e0e0b16090b090f080b040e0113000f0009110e0e0b110a16090b090f080b0413000f0009110e0e0b110a16090b090f080b0413000f0009060a08070c03120034043e03152c0804000603120315040302020203130400020206031006010202020311040002020603110402020202030f0402020206030e040a06010203060301, 0x116151814180e170e150b170a160a1708170700000a171717151814180e170e170a160a07171717151814180e170a160a07070706160f180e160e0e0b160a180201010a00080000000a160f180e160e0e0b160a180201010a00080000000a160f180e160e0e0b160a180201010a00080000000a0601160f180e160e160d140b160a0b020a01080101000a160f180e160e160c140b160a18020a01080101000a160f180e160e160c140b160a18020a01080101000a0614020002020203010c020b0a030a0008041204180e160e160d140b0e0b160a0b020a01080101000a160f180e160e160c140b160a18020a01080101000a160f180e160e160c140b160a18020a01080101000a06130202060006030803140201060202030a04030402020306040111020002020204160f160e160d0e0b0b080f05080505020e0108010a160f160e160c140b0e0b0b080f0505020e0108010a160f160e140b0e0b0b080f0505020e01080102010a0613020206000603080315040302020203110e160d110d160c0e09080809] private def node1758:Certificate:=PackedParametricCertificateData.decode 11 data1758 private def data1780:List Nat:=[ 0x11615170e150b150a0e0a17080a010701070000000a170e150a0e0a17080a010701070007170e150a0e0a17080a010701070007060b0206060202040c020a02050c0304040c020b0a030a00080412040802030600020308041102000202020407020106000203080408060706020e000804160417151615170b150b150a0e0a0b0708070a0100000a1715170b150a0e0a0b0708070a01071717170b150a0e0a0b0708070a010706160f160e160d140b0b0b0e0a0a020a01010108000a160f160e160c140b0b0b0e0a0a020a01010108000a160f160e160c0b0b0e0a0a020a010101110008000a0601160e160d140b0e0b0e0a0f010e010c01080000000a160e160c140b0e0b0e0a0f010e010c01080000000a160e160c150b140b0b0b0e0a0d010c01080000000a0614020002020203010c020b0a030a0008041204080206020202041102000202020407020402020204060603020206030804010e1c0a1406060506041c0309020002020204] private def node1780:Certificate:=PackedParametricCertificateData.decode 11 data1780 private def node1781:Certificate:=.split node1758 node1780 private def node1782:Certificate:=.positive 2 [(1,8),(1,9),(6,12)] node1781 private def node1783:Certificate:=.split node1706 node1782 private def node1784:Certificate:=.split node1633 node1783 private def node1785:Certificate:=.split node1559 node1784 private def node1786:Certificate:=.negative 1 [(1,0),(2,2)] node1785 private def node1787:Certificate:=.split node1481 node1786 private def node1788:Certificate:=.negative 1 [(1,0),(1,4)] node1787 private def node1789:Certificate:=.split node1253 node1788 private def node1790:Certificate:=.split node1041 node1789 private def node1791:Certificate:=.positive 1 [(1,0),(2,4)] node1790 private def data1802:List Nat:=[ 0x116161111160a140a0b0a16091409160114000916161111160a140a0b0a16091409160114000916161111160a140a0b0a160914091601140009060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030c0a050203020006040a03110400020206031008080607060212041a030f0402020206030e100d120b36012004300309020002020203] private def node1802:Certificate:=PackedParametricCertificateData.decode 11 data1802 private def data1865:List Nat:=[ 0x1939deb820a09020201aaf2a4b9b3b893ce9adbc01608020203aec9bd8ae482e9de8e8af3b21408020238becf9fd8999ef2fecefda7960808020201b5c0e7ad9adfad959bb4e01501020202d284a199fcdab293d1fd801616010214dbbbafbe9fa5efcbc0e4aca0130a01023acccfe0c0bf869c94e5ac801609010228fef39fa7a8affae4c3d4defe1409010255899aaff1f687f3e0d59f83ea0a09010201affcfae4a5d9adf2f682c9e0160801020482ddeba8b6f5e1d1e08de8d01408010232ae8fb6c3d6eb9da387f0d3e00808010201eacabd9681b9f3c1edefd4a0160101025ec1a4f7fd8092888a97fda8150101020187f3b2a7aaf1b5acb988c81616000215b7c4aaa6b592c5b0f1f38dc0130a000274fd97b8afe2f3ecc8d6d1a0160900022888eab1f49ff897c09eb6b78e1409000252a0838fd2cc89cda7a5f9ba8a0a09000202dfe084ac8a9dd0e9f289bea01608000201efb48eccaae7fab2acb0d1fe140800022bd9dafeefcac1d9aadd8bc3fa0808000203d4e4ebf19bf7c090baa396e0160100020185c09eaee2edaebfdea9a9d015010002019df88eeb849283c1a5fac3b01e1186c2c8fce0000a08070c03120034043e03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206031008080607060212041a030f04010200020308030d060b12000803080301, 0x1d0c6fdc397c295c9db81abaf90e6cdfbe8e7b1a6fafca39bf8c3c3c9a587bc1613000205b097dcf4aaccdaa68ab4baf4bbd6cfdce181ce86a0ceb7b799c78ef1d6e2b280090900025bc7a5c8b898bef3c2cacdd8c784aae1b6fbb9e89282f2faccf8f7e490e0fbb81108000215c9e4f3f7a588ffc7cf98a28881d5b5a2a795c389e693bfb5d9e7fcafad8bc80808000201b6aeb3ebaef3c2ac81e1bbb3a6eb8ef4ff93eab1cec98e9dc7f2b3eeccdaf08c150600020efe94dcc89ed8bfafbedee481b3e0e6c6b5d38fc6c88ef585a0aba0e99ae2f0f81306000201aeefb29b8afad2fc89d6cbfde78fff839ff2b38eb58a93d09bcd9982de8e8ba0080400024cd9fffa868eaaa9ecb0c6eaf0e081c9ffa6d4b8ebaccd87e889c4e3b9a4a48c150200020a95f3c489a6e5dceaa8cef1a7eafed0bfce9eb0f9fac3ffc6a0aee09a9ad08ec41e35f6a8c2ffafefbde99eb6a5d4f58286cba19abbb1a9a698b6a0000a08070c03120034043e03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206030c0200020202030b020002020203015ee0d22cd7f201c18e3bed14e5f21df18101fcbd4fd00001d4b88eeae79fa01616020210d1a4afe7e9fffe9f8f8ffde0130a020263f6e4a8b5ffbacb819bc0160902022d82e5f9d8ac888487b5d4c4d61409020258ebf484cd84c6adcb, 0x1cdc8af86afe49fa498e0f8f1d9ddc8df97f5a7bed0a2f99da6af801111020202a3cdd5d29eb39ec7a684f9e8afe39eb5fde6ccd98f87ccefb6a799feb5e7901109020201ad91a5acedb0c2a7c3c5c1feeac1eec78acfd98edaddc2eb838ac6c5edaaa008080202018eace1df91ea8ba5bd9fd880e8e08a94af938ba9bdfea5eed1c3ac81dfb785b0161501024cc2fec0a7f29faab8ac9ee8e18ffcc2b4cadbc4c9b0f7f7a1e7a89aa79e8a95d21613010207c6889eda92f697da92f98fbfb3a499b8decfecedca82d5b7f892cd8bcbd28bc8151301020481fa99ccdfb18d8ccda896bdbbbdf6e0b7cfd794cc81f2f5b28ee7848e9db9c41313010201b7c6f699869fc681ce8ec1eaa2c09ed8d9ee8ddaadf5b6c8bec1e4dab8b38fe00909010201f784d1e9888e86a49c93f6c8ebc8ddd7f1ad98a3ece9cbb0d9a9fcb6cceff1de110801020187aee5cb9bbea99bece2ebe7869dcaeceaf99feee8ae9acbd1de97fee38586c00808010206a6c19de1cda1eaccde8bc6f6c7b6de8584fdafcfddefe5fabd8ce5e786ce86881506010203ac8ae3bbfacf94d2a48eb6edfbeffbcba099feac9ceefdf6fd9cc7f092aecd8e1502010202dfb5b9dad9c6ba8bd4fbdc8ca891a29fe6ba9de4a7ecc0bce69ec88ab0b0d6ee1615000268adebcccbefe08aa9a9c0eb88f7ace7929de2fe9ffabad8fcd59ed7ddf0e0a6ac1414000207b2, 0x1eebdacf0a7ac8fbcfdace4c0ecc3ec070700020d9aa6d9efc0bb8ccffad4c9df80d098868ae2c49cdc808dbca793f48cb0a0c8b01506000204f183dfdfcd9f97dd9192c4bbe5f1c2fff1d4f6d2e0ddf5edfcb4e4c3eaee84dab01b04ada0f7e5f68c92f082cc95b8be9aa086aecdc7abe381bbffcfa000130803060018031a03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206030c02000202020301459d9e0e8ed75988e32cba8e010282eefcd5e7b8b0b5a499aaa3a1dc88edc7c7cbb8eb9ac2f0c2919407a0920cafc902b4c27eb31c87b835fb8f2df0941793d9004af0e290d0e2a48887a782f89dcea2cabef693a5b1dd87e69a9bf6900df7de0cfeeb048ca80286dd30ccce10cedb38d8e51cad960026baf58aa0dba99ba69ba98db6c791df8dd6cef7c285abc0d9acf6801ac7b34ce8ef0187bdec43dc8505bbe225e68045848b22c6e6000294d5cbaed89c88e9bad5b7ecd187cbc7c893f3dcf09384a0848ee01c89f951acdf35b09d1682982195bb0391ad05dfdc02b0d80050dd92f6c89f82f3c19ec5c9cdd98bb9c7a1c8afee96a8e690ada016150202149194928fe1e1d8cecfd5b1fd98bf80ad91c0a8dadf9a9dd7c7d6d58ed098d0a015150202439bb6b6a2af8dedd9a293cdee8ff496bbf3e0cff8c4e9aaacdbd899e0d7cddaa01513020221d3a6ecf9, 0x18a801506020241edcab7b59f96b2d699efebd59be0eda3b2a1a7c5d7fd95a4e5ecf9e7bb8ec01616010204e7fda881aad0d99afbd0f0f295888ad4979ea488d4ffa8e593bca593f9f39791901409010203ed908ef3f4d5ee85bb84ada4a7d0e192b8ab9e83b781b1a984fc9599f59883ffa01608010205adb9d2dfbcbbe1f5e0bb94ddc88cd5f1c1ebf9c1faf4ceefb183a584e4b7b8889a140801020bffcb8ee3fab389afb78194f8beb69aa6fed5ff97e198d6f9edede9f1a197e5e0c6070701020ca9c2b9fef2bde6f5aef5e4d5ecf0f8ecfcc9bfe283eb9e9cd1ecd4ceaf94c2f41506010209b7a79abfa0c1a2c782c1e2b5d1c6d897e8e4ec82af92a68fccc2a8c2c1a8dfdc0706010214b1acbd87a0cfe4b2f881d2f7d5faa2cfb4ea9281a1d9a7cff5c3bbbe9c8cc0150101023ad4fdb6d5dcadeee3b2d0f5b0bfbf8bf2e0a682ce86cfd4d3859cd6f9ceb6afd41615000209d6ca889999f1b881adcfc4b186fd8baeaa8f8295e1b98aacb8c7ecc0e6efd7bde0141400020184a7abd196a2859b9ceb88a1a4ac96afa3becab7bea2dbbcd99ca1d7acb49394f01411000202b2c5c2fbe391d2eba896f7f7c0e1c3b8cccebc92dafeceaad6969ed0e7f5faf8c016080002058c92add3e8fd9acfe6f8a486ae9789a8feffffc4f1c3f7beb9c1a78ab9affb8ad4140800020eb8e1d2f6c9c9dfabeed2fbdef5dfb5e6ebfc, 0x10018031a03150403020202030c020b0a030a00080412031304000202060301110400020206030144c8fc648dfc0da9920da991010e80ada5ddc08ff781cda0fa9acfa39ffc81dac382b6e5eddfa0c79804dc920ad08f01adb601aecd2c8ef84397bd01b28901b28a00029b8cdf86bd8c91f0fe9a9fc7c8cfc2e5f6b6c2b6d9b1ade1899f8ec073f4d82dbaad08fb8b0984c409c6c5399cd2099796099795000e8ca3a5b5cbbdf7eff8a4b6c49cabdcc1dcbf9bfffd8697a090dfc04ae1e3019ad3b906c48506ccd828cdd253e3ea06cd9e06cd9d00019cbecbc9fa8fdc90defccffac584fcfd98f4f3f6e8eebce99fd39e8006ad04ed6ed8e638d2dd08bd07d901d9e501d9e60001fba38ffba3bdaae4b6b5dc84f5fd8bb99390fa89a8befb9a86901515020220b6aef4dcbdcfc68eca8d81808e82acb6dfd9a0b699ebfe88ac9ddaaddfccd09de01414020201aaaca684fce5e9d1b5a8aac79eebf298b5a18187b7eac3c2a9b4d0c6b788b08180160802020583bb9aaaabceecf3eb89cccbbdabf0f5a8fab1ffb8f58f80c7d4c7dd86ab9ef0f0140802020f89a0b8c180bcfaa5e4fce7acdf9985c091bea396f1b096eff0b6a2a2dcb5d0cd901307020219d1f6e49edf92e9cfe1f995f9d797aea1e8d59ee386ef8bbdaadba8c0cdd2800807020208d5d48ba3bacbb895b6f0b891f0bad7dad49f918eefeadf8fd09fbed9ca, 0x10101010916161411140f160e140c140a060101010816161411140f160e140a16020601010108061402000202020416161411140811060f060a061602020109000916161411140811060f060a061602020109000916161411140811060f060a0616020201090009061616141111060a06080609050e0413010101091616141111060a06080609050e0413010101091616141111060a06080609050e041301010109060101141c10140c060b06041c0311020102020204110200020202041616141114080a060e040404130102010800091616141114080a060e040404130102010800091616141114080a060e0404041301020108000906130204060202031504030202020310040c040b04020e040e031616141114080a060e040404130102010800091616141114080a060e040404130102010800091616141114080a060e04040413010201080009061302020600060308031504030202020310040c040b04020e040e0301100601020202040116161411140f140a14080e040404060108000916161411140f140a14080e040404060108000916161411140f140a14080e040404060108000906130202060006030803150403020202030c020b0a030a00080412031002020202020316161411140a1608140816071407040407000916161411160e140a1608140814070716161411160e1409160814081407070613080306, 0x116161411170f140f160e140c140a06] private def node1865:Certificate:=PackedParametricCertificateData.decode 11 data1865 private def node1866:Certificate:=.split node1802 node1865 private def node1867:Certificate:=.positive 4 [(4,0),(3,8),(1,10)] node1866 private def node1868:Certificate:=.positive 13 [(12,0),(3,4),(4,7)] node1867 private def node1869:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node1868 private def node1870:Certificate:=.positive 4 [(4,0),(1,5),(3,7)] node1869 private def node1871:Certificate:=.positive 3 [(1,1),(6,2),(2,8)] node1870 private def node1872:Certificate:=.positive 3 [(1,0),(2,7)] node1871 private def data1883:List Nat:=[ 0x111110f0f140a140911090b091404110114000911110f0f140a140911090b091404110114000911110f0f140a140911090b0914041101140009060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030b060502020203110400020206031008080607060212041a030f0402020206030e080b120806010a04120309020002020203] private def node1883:Certificate:=PackedParametricCertificateData.decode 11 data1883 private def data1893:List Nat:=[ 0x11111130a140911090b090a0908081404110114000a1111130a0f0a140911090b0908081404110114000a1111130a0f0a11090b09080814040b04110114000a060a08070c03120034043e03150c050400020306030c020b0a030a0008041203130400020206030f020b040402030203110400020206031008080607060212041a030f04010200020308030e040b180808000a040e03] private def node1893:Certificate:=PackedParametricCertificateData.decode 10 data1893 private def data1950:List Nat:=[ 0x1110102038af7d290d9f7a6eaf0c59086b1c3e7d0e0f7d69cfbbdfbca0909010201a4c389b3e7d8e6a6e7f2e4e0ebd9dfd387e8d0f6c4c9f4e41306010251d2c3afbfaba0f5b88ab3f08bbbd6c2b0d0f1dcb69f8b8c1106010205b2abf3ea80d3c2acbeecb6bbdf98ef87db9fe895b397f6f8080401020688a5db97a983c5e4eae0eef1cecda1c0eb8a87acbfe8a3e81414000205dce1e7b98ba08c9f91a89283b9a384ced7a797de88abb2161300021e988fa6bbc5cbfdafa6bfc6b4d1ddf8bead8b87a8acfcd3a8131300020fbbb7f2bb81aaf8958dd4a8f7efc6a8c5c7d9ff93f78dc1b0161100021dd1c2ad868bc6e0a08db4aaab949589c5b38de88cd7b3efdc131100020ccfb7f49ae0c9edbea3fcc3ecea8eb9b787e6c88fdd8b8e9009090002018ecfacdcdaa38ea1ead2c9e9f9cfa9efa3a59181f59ba3ba1306000205a5baebeabce6b6b49df193ccaf8d9a99addeb4cae0f2c6e21106000209bde191d7ba85abb3d78ff7d5a9c4a3a1d7dda6aaafb9b1be080400020591cab0eccaa1a9b9c2c896cfc0d4b59ed9fd81f7a7a993b6110200020bb99087be95d4e68798d0d999a8e9c8b5e5bedef9d8f2d01e28e5edc9e5dfd18ac8a594ceef94f1e2a69a000a08070c03120034043e03150c050400020306030c020b0a030a00080412031304000202060301110400020206030c0200020202030b02000202020301, 0x106030803150c050400020306030c020b0a030a00080412030c02030202020304a48a11f2d303bccc18fd119b8e30f5c534dde219ec8900378284f4a8c5ea8ed2a1acd6b7ab93f8d5aff7840ad4802088fb0996bc01ae852fc6b814c7cb34da9f1b80d00016e19aef8fd5b68ba7d2d883f0c9ab85cf92a2e053d9a06ed4e638aaca4ada8516daff31d89f19d8851ed2a6001fc9afb3a99ee1a5e393f0a38bfe80c4b0daa81613020201bee283f19fadeadde889a2dff0ef9cd5f3e6d9dfd0ffbcd4161102020dcfcb8ce2d6cba7b681a1e0ee9d8abf9088b2a2e1e986c3b01311020217ffb3add4d6d1ccb9f5e7befdfad7a7f099c5a3d8e7ab83f01111020208acf18cbeddbaad9ae78db1e4b0a3e9aaccc7c98494ccd7f2130a020201e1dcbbcbbd89a1dc87dcbb8191b9e6b990baefb5dad78f940a0a020274d3f4ecfebee2b4d483e7adcaddbd8e98fac4e1a7e8d5ba0808020201be82fcccbfa98febdabaa7d8c08784b3b4f9feeadff388b20804020203a3c9f081bba887cdbb87c6b581a4e1adeda7cedff3f4b3f016130102168899d2f482cbd7929a8084e6f4bfe8bbbaf9dfd29fd08490131301020baeb1ce98d7b6c1ee818bafa6e8a8eea6e1efb0d6fcc399ae1611010217a0abe8c283cbafd194a483dde6d18496d393c3a1adebbba8131101020b86a2f4a4e3fc889cb880e29fcfb3f2fb9c9292c3b5a7e18011, 0x103e8f3aeba8ada96b895a882f1d98bec0808020228bc928d87e3bb94eb98d8b0d9ffe1a4110602020ccfc4e19dd3e9e08df5bbaca2ddc2881604020245e79fc39bb086fabdfbebcca883e888060402020787a8a7d48fefe1eb98a7afe29cd1c01616010206d387e0e3ab89af90f793f38bfaaeee141401021de08db3a8febc9983c0eda087ace8ca1613010260f7aa89e6abb288a9e8a1b2cbc28690130e0102138dd1baac8ffc99d8a9849181cb87f00a0a010204e096cae197a7abfc8ddfbec6c7f98008080102238dc3c8f7a4d09f8483acabc2d5a4e01106010212deecb7a9d88696de86998ab1feb4a01604010241bfa3f58bedffbdf6bcbce69ebe9ef00604010206a1a0aba0a0bad2ef8fe8ceefebb0a00402010201debca9d78edd8894cfa09181def3b0161600020aa78bf1f39e9d90e6e69892daa986fc141400021fa2dcc981f3cbc7b5cac0a798d3fb9c1613000254c6d6fbeeb1c3a1cbe7d8ecf79ac090130e00021ae3d1ebc2d7d0b08ff7b6f6cab4c0f00a0a0002059be19087d1a1e69ceec897fc9bcc80080800021daaebc2a9b2c59ac4d096c6adb3c79011060002199aa98dd7b58a8dd8ccb0f5ff9e8cc0160400023ce885e3a6d6beb0f5c6d787c0d3efa00604000202e0ebb086fcb4d3b6ef9896e0f1bbb00402000205c7d0efafb187f7a6c2e3858da2cef01e47b4d9938bcee29ef8001302020600, 0x1130108000a161616111311140f0a09140809080a06130108000a061302020600060308031504030202020310040c040b04020e040e03010c04030201020304040116111311140f0a091408110809080907060108000a1611140f0a0914081108090809071106060108000a1611140f0a0914081108090809071106060108000a06130202060006030803150403020202030c020b0a030a0008041203100202020202030c020202020204110400020206030116111311090914080908110616040404060108000a16110909140811080908110616040404060108000a0909140811080908110616040e040404060108000a06130202060006030803150c050400020306030c020b0a030a00080412030c02030202020316111311090914080908110606060404060108000a16110909140811080908110606060404060108000a16110909140811080908110606060404060108000a06130803060018031a03150c050400020306030c020b0a030a00080412031304000202060301110400020206030c020002020203016c930594e5288c01cd9210edaf0defdd488caa29bb9d0031ffd6abfdd3a3a0f5c3e0141402021fdfefdca3d4bbf2f29c9b9df9efd28c161302026dcde9dfec94fc82d6f9a8f5df96bff811110202039087a8d8cad0d8f3a0fcb7ccb4c1a4130e02020cc7f3e4f8bde8d698969690de8be8b00a0a0202, 0x116161311140f0b0b1408110811021401060101010a16161311140f0b0b1408110811021401060101010a16161311140f0b0b1408110811021401060101010a0612021002000603060416111311140f140b0b0b160113010201010109000a16111311140f140c0b0b160113010201010109000a16111311140f140b0b0b140a16010201010109000a06161113111111140809080a060b050905130101010a161113111111140809080a060b050905130101010a161113111111140809080a060b050905130101010a060101141c10140c060b06041c030f020d0201060306040c0403020102030404161616111311140f1408110809080a06130108000a161616111311140f1408110809080a06130108000a161616111311140f0a09140809080a06130108000a06130204060202031504030202020310040c040b04020e040e03161616111311140f1408110809080a06130108000a161616111311140f1408110809080a06] private def node1950:Certificate:=PackedParametricCertificateData.decode 10 data1950 private def node1951:Certificate:=.split node1893 node1950 private def node1952:Certificate:=.split node1883 node1951 private def node1953:Certificate:=.positive 12 [(13,0),(3,5),(8,8)] node1952 private def node1954:Certificate:=.positive 2 [(1,0),(1,2),(1,7)] node1953 private def node1955:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node1954 private def node1956:Certificate:=.positive 4 [(4,0),(1,5),(3,7)] node1955 private def node1957:Certificate:=.positive 1 [(1,0),(2,2)] node1956 private def node1958:Certificate:=.positive 1 [(1,2),(1,3)] node1957 private def node1959:Certificate:=.split node1872 node1958 private def node1960:Certificate:=.positive 3 [(1,0),(2,5)] node1959 private def data1981:List Nat:=[ 0x1161614140e0e0a0a0a080808160614040b040a010a161614140e0e0a0a0a080808160614040b040a010a161614140e0e0a0a0a080808160614040b040a010a060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030b060502020203110400020206030e02080203020302030f0402020206030e040a06010203060316160e0e130a13090b0914040b04110113000916160e0e130a13090b0914040b04110113000916160e0e130a13090b0914040b041101130009060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030b060502020203110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node1981:Certificate:=PackedParametricCertificateData.decode 11 data1981 private def data2029:List Nat:=[ 0x1ed93a685bcf99ef798fff1a2d285dfc1dc98dafb818a1111010217a299e887bd97d7f4def8bd85e18784d79e90ce8aa5e6fc0a0a01020ab6f0da889cb99590bda1c9d7949dc380e0cda8a4eedcd011060102459df48a85d0d2988fbdfef792bfa8d0b78788c3bcd48398060601022cc0e4c0d9e498eaacc384cefa82e8b09185ff9e84a6f888140401020def8e878a82f1f1fbc190ef88c7eef0dd9f80ccf4ed8998130401020183acfc96e7e4e6eb8ee78db09bacbc95d2bde4a9a38adafc1615000204b5afa6aadcc4d4b6d7a58eff9b93c8b5f5d9ca94d0ace6941313000242ce9eefed809bcbdeada2e1f4d2fffa8ddaceb8c1c7c28a0a0a000208dfc1adfec0b8b99efdeffeb4db97eef4ffa987f3e9d5a0160600020ec1b1b5cbb9fc90a0828fbaf5898feeeba8c181b28588f815060002239ba083b2af90a3fd8be2fcc7f99880f2a9e3a08ae4deac110600024a94cbd2f6fc8cd6b68c8aaad6d2a181e4d68e95fbddecd80606000224fdd4f5a7d0e086c4ed988ae5efcdff9ece9efd989feac81304000255d7c5b0ecfaddf7aceec696a7c0f8e9eefdd484cb8ead9815020002139e89f6e5e6b9e4a2afe297b2fb85e0c9ced8eb95828cc41e02ed9edfcc90c1b2c8c39b95eec49ba9f4cc000a08070c03120034043e03150c050400020306030c020b0a030a00080412031304000202060301110400020206030101, 0x1eea3daf09b97b21e0fa9a799daaca1f8ceefbd839985c0b69c00130202060006030803150c050400020306030c020b0a030a00080412030c02030202020337c804d0f3409a0caf19a4f235949f3690ee1bc1f30003c797cefdde8dc3bb95ab84b3b0eccd92a781a004a8fa04a2fb02e2ce019ba93887c41ee98331e7e319bce40001d4ea9febe8c0adf597918585a3cdfcd780dda84b80cb05b8d40189f8c447c3fb24e3e80381cd45848523ddb00001dabdaa94e0ec84f2d2ecaaa2f7a696f3be9a1615020201c0e2ccf592dfed82b592c1bbebbac5d2bebe80bddc8b9d941413020207ff8b8196ac87bfdff4fad9b0b5e9bf9ff6c9ffbdf0b9941313020243ddbae0bddbe99ed7cbdca490a4e6cfe5c8b09de0d08efc151102020293bcafb8d091e78e99f9ff938afefe93efcac7cbdfcfc9d41111020205bd8cd9bfd6a7e09ceca6adbfeca9eea993bff9b5dbd6980a0a020207ff82a8aec980e6f4f8c6eb91f29a9eb3eb97d7e8e4878e110602020deaddb69098be93c2ebee98ff95afeeee9ba984c695acbc0606020226bcacaaca85b3aceab59186b0cb8286b9e6b2d9de8292ea1404020205ca93e68ebabcd0c0cd84bce6ed9ddec2ade1deb7998ef41304020201b7bd8cb2809c86baa4cce3afbcb8ed95adcbc991dfb8ad881615010203bfabe4ab8496e2d2d7ed89a6edf4af8cf5fde8a9f0d5f7a81313010243d3, 0x199acebbae5e0c4e0e0f484d6f0c78cc4de0a0a01023b89ae80cbcddd8eccd0cdeeccaa989cbce3e8fce6ff841308010201e3c1d8c684b6fbfab8d5b5e99ea0ece99ff0c1bfaea7c816060102049ae5eeb485f9b4b48aeed1d8adbc838da8f0baa4e2f7ba1106010206ecfcc9e7b0cec99793b1fccab1f9d4dedee0a9dab1c9de060601020a8bf2fa94a39fd5f4bdecaaa8a18aaeecd5e0dd859ea6f01604010201d190d1c6cdcef59da4e29f85ebb1ba8abe938dcc9f94821104010204e5c5c480a0f2d9c98fdedda9b48fac9ca7fa8bccab98e40604010211b3cdcfb3c2d1a48fa484b080b68da4fbc9b39e84e7918e040401020797c5ac8796e9ada9bc8fd7bbaef9e3f2d5d8f7e2a9aea81313000202e0d88ef7e3c8e2f8b788cba698fb9f9898efa0e6a0eff40a0a00022fb8adf1c6b1d382bebab9d4a4d7a7dfe8beac8ef0c1dc1606000207d4a9d4f7f4c3ef9cfc90ebffe9bacabaaf8a838dabf4d011060002068482f8e9bca8bb94e280cd84aa95e0d4aa9dafebdb83f80606000209d8de8cb184fb8ee5b3ebe78be3f5f7f4f0e9e2f2aafbd016040002068cfda9f995f3e6bccbb3cbf784e4c3a8e1cd98f1cdbbe41104000201adbdf2bbc0a8caa9c58bafe2ebed83e2beee9bade8d1f40604000211a5a990fcb6f9f7c0b0e284f9aad4a7f7eef5bda8febcb804040002088bef8bf781bca5cba2b18e8cbff7a0d1, 0x1aed0070700027af19193b2eb85d5f1f595a4d9cffaafc6aba5d7c4150500020197e89a9daa8fdd99be9b8be6cbe4bb848484bacaafb0070200020d9994bb9cddadfefbe2f6ba9deaf9a88cd3ffdb9dd81901cc82e0cca282c5b9f68fbaaecdc28400130202060006030803150c0504000203060312040c0402060306030c020302020203100601020202040f02090201060306030c91bc09c6d76bbf01d5d7089ffa27f3854082ae20ffad0011fddcddcb94dbb4ec9baf88bb91d2a3e6a6c240b5da1d889301f9950a8cc11ec59e10b9b320c7b111b9ae000495beab8bd0e7ebb7e390d0c095b2a2c1d0e029b3e359e0cd0184f7dc2ff2a915f9a8309ca642db8d15feb00009dca2b8968af9f5fdb4fceff3b9a5c6c9b2141402020ed0bdfcacb4b2cd8a8bf2ae96d8c3bdf3a4cab98cdac01010020203a4b0e4b991d5a888d3edbbe8ef92f7cdfbd0b1fc92d1801308020201b6bb91e8c7d29dd19b84f697b793f1e8a28edef4e48da81606020211b2e7d082f8ebcaf6bfe6af8bca8feed1e2d8accbcdc01106020208a5f4b8b0ab809db6dd89c2a6f8e7d18dfaf0e1efb68c8c0606020208f1b3f5e0f59ad8d8dea3dec2d09ea1ebd2c5ff99e9b3ae1104020204f1a586bb8e9dd3b8d193dcc8f093d5bfcdc4a2a3a7a8c4060402020cb7f7d9d39bb2badde2a7b0daaed09e9bd19c92d9cfcab804040202028ba68fc7d0a4, 0x1a3fd0003b4b2c1ffa0d7b4d6d8cdfaf5b98bfe80151502025597c8fbbaf68098cef29fe489aa88b49cae87929fc41607020205fabe98ebac90c9fdc6dcbecdeadef1a097e2b4f2c60e07020203c8a8e0b1e7abcfca80a597a8cfe2c191d8b3d2a5801006020201d280d5b68683b881a385f4cbeef6fcbfaaf2bdfc80060602022f9981aeba99ea80c3848d90a189bbaacc90a7a1d00704020202bbaae1a6fae4cc8ad798ebb0efca8384dc9ab2c29a07020202108ce7fad098b7d384e8c0cefb8ad0f6fd88a6b6a8f61515010279c7d9ade3f6c98895eebdffbdd7d89da1a982f6e1a41511010204e582ddead082c8a09ceb92f4bae1bef493d092f8a0141001020488c3e0b1a1acead996bfe2fb95f2d3f1bb859ae5901010010214b1d3cde3e8dda89d8d80f9fb9bacfcf3d0c9f6b6c01607010206e8edde819ba088dce8e5b8d2a9ffdeaccfd285a2fe150701024bc7f4adbf9ac2868c85a59aedeea7d8b085f1bde6ae1505010250b7c6c0f1a083f6f5a78bf4e89cdcc7e5b4bbedd6e8070201020adec7a085978dc2d4ade4f0f6a7c6d0de88e8edbdd607010102029cfaeeaea79884a5b2faafd68a98e1aaca9abb99d21515000261c2a9bce387a2b9f4b0aeae82b48acad1dfc2f69a9c1010000217d4d7bfc6d0e388d8dedcdee7d99afeda87e2968090150700020180e7f4b4f5c6d681f6bbdfc19fd4a9849af09df1, 0x180140701021deaa5fd8d97a8e7ffd2aa9bbab7eee0b89cbfb78af7b18c89c01505010236a7a09dfef9e3e5eacfa88ed88cb893e3f3b6abb9f9cfbae6a4d80f03010203e086ecbbd886a5f58794fca0b9aa9ba1faffc0dffe91bbd5e4860a03010201ebb0c7c1c7f0e2ffd7c2cdf695939985898dca93e5a7f4cbb38007030102179581ddbda29093c2d0b9ade1b2b2d6dec5e1f9a4a3b8ace681ee100f000203f1dff8afaf96ddceeaedb088bbc48c92eef4f7dbaff885e4e0c0150500021ae09ae194ba8890e5d6f091f1a8989bdbbec3e7e1c9f1b4f8cbc015030002409b8edea6cc8df3edc4b2a5fa8adea5fae7f5d5f39eb29bb0c00703000244bfcc93a097a3e98cecb2c3f8a8cc80f4dce8edb589c2c098cc80050200020398948481a790b1d9b4a5e5e286fdadaac6d28fc48ac586eaa1c00302000209c2a8a3e4aff4ccf6a0b981e8c1cce2caff94c592c3d7fa82ba8019599bbfdaafbf97caaeb09ac585a9f5dbbfb88e80001302020600060308031504030202020312040c040206030603010c020202020204010c02000202020402bded0389e20480bc01f8b72bfafd3eadf824b9e11286e80002d1848dcdf7a6b6cfe08ba9a6e5f6e6c5f8029dec07ba9f04e5e601f1fd2cfca50eb280428dcc23c3a5000191e08ee68d86c9ede7b7d0e3f889d6ead00182a9d66395cd34e3bf15ebb2418bf933baea19f58e0c, 0x1000f040702040400020404031504030202020312040c04020603060354fee04fa2f125aabf1fced2010ad3e7f7d483d8bff6e4cef1d7c3becdd7e7b5a4d89c02d5f103929206bdf204a99d2cdc9b3e9d8024f09d13afba000193feb7f6dce08088d692ccd7c899cbf4bbdbb0b5c4c008dbea10f6bb0782e801ebbd2deaaf13c1b240f9bc26d0bd003df5b8b1a39aa99edef097c59b90be9ffae9afe3fa8076b0b06fa88133ceaf2ce5b432adb53fc1f0178bbc249ff50007d3c6b4b7a4969ba1f7eef4e884f29baee7a6cad4801515020202a8a0c5c3aaf1ddd292d4efa2fcd6c8b6d2c3e5bde2d8bb91c9801010020206aee08f96a68888c2b0d0a1bacfb8c38e8687b9d8a8e580d0ca800808020207bacfb3b2b0fb878aa0e7f1a6fccfa18287c0dc8aa9ca91aac0150502020af9c1d3c7f9e0f894b2a2fceece96dce1a2f8c0f6fce2d79598800f03020204a9f0b9a8c9ea99cd87e1d287b0a59cb5b9e38a80de99a0fda8c00a03020201d0c3d5dcea9da2819ce8b7b7faa2b2d998c7859ef3aba78fa9800703020207d2ac88c8ba8dd9a1ad8da894eea3e0fddea9e3cc86bc9d94a9c0151501020c8482f8a881d4f3ea9ba2e4cc98e0c392f8c7c281d5bc988abbfa1511010244ba9aeb8b97f2c1ecd3aa86a7a0d784ffc2a1ffb2a492c8fc8010100102198bd4e3a0cda79ac1fdb5cdb3c4a9b0ebb0b9badcdfc8b1fe89, 0x1e5f00503020206c38beba599b8e8faefb894d29199dcb0bdbba0d682dfbdc48b90050202020188958bc59fffe896fecb8d8df29581a791e9e19faaf5d7ea9da81515010205a2c3f5afb7eda4ffee8b9ae4b0bc8795d582c3bbe6a7d5cdb1fa1410010202ff909194c9ef9bd8829bd2b9fec3c3e491d9c8d7d6e58dc2801010010201eee5c3ba84c5d6c5f4d6adb681b49584bd89abd4d4b59e8589b00807010236d7cf8be0aeaca999839bb4eba0fdba88f591e9dac3b18c801505010206fbb8d7bcaff8878e98ddf2b3fea1b9b2a5c0f0f8c7e9d8e1b2ee050401022ba895bb87de91a3bb8996b5c8e1ebe3e5e8fbcff5f7d594d9b00503010204908a95b5a2c39b8d9fabd6e6ebd3eeaaa1f29fbbd7bc91b8d9de0502010201e2d2ef84959acd8e92aeb1cfb0c4aab8de8ba0dadfccc8a9b9c815150002048efc86b18ddee1e0b99c9ff6a292e7fdd1a89aa0c7e0c78ff580150500026a92f49ddefbea83dbf08191add7bbb390fc85a49e9ef1a6fae40503000206dbc6cef3f4c8b4e5d5c2a7b0c28481a4c985fe81e691fe92affc150200020da9d2eb9dd2c0f0d1a2bdddf899c78483c49986dac9aabbb7a00502000203d8e9ee92e5cf93a0d9aa85d7f393c58eecc2fcbcbca381edc0d8020200020883d4ab80f1c4af9b96e6edb7d6dcbbcba7e8c3cfa088f482a4190d9d848bb0c3f1bfb495e180ccb8bafddde0b6a0, 0x1a18ce6c7d4fee094f6a68cffe4b78781839ecbdbfee9e2a9c3899aabff82d3c8b2978c8db7eabab0050500022a97ec85b8a791feb697dd98b1d3aadb93c0d0ffcbb59abd85fbb980e3e2c08293d5adb1ed89e2c3e09ca00303000234f482829cb59ab6a0bef5cacfce9393eff5e3c6d1b5f982f7d599cfbf969dddc0c5c8ccbc93f6cef691c01909fea5a3f8deb7c4f7ceadb6b8efb4c689a98cc891d5f4abced38293dff0c49dfec1d0cc800001010111020102020204110200020202045af2c248a6ff25c8d712fd9601039ca4c7c2c996c28397f7f889c6b9b8b9cb9baedbac02f6dd03e4c603d5ec01c6bf2aa6cf3dbad626ce9513ba900014dabfe3c8bff8e0e6ddbaf4afadc1e18b98a9b3abd004edee0aacbf03d9ae6e992ef18b1383d041a99225bbd50008edf2f8b7e2b6c8ee9cc892c4c0e8ff8891d6b191a07bb0c46a84d533dbe322a6b23e9ab535af881981d21096a3000280c7e486e39891c1eea391f1fdab8d879185c585a015150202729da08eb1a9ceb1e3c7b9e8a3d181b7f882cae5efbbc4e6fa80101002025199ef88eaa1c7e0bb9dc3aaa69ebccea195b1a9dc9681f2e390080802023efbb0bb8ae59cfa81b6bbd7aeb4909180e59ede93ac97a3e80f0502025adaec9d939ad297fe8d97b6dc8ab1c18db7b69be6cab2c4fbc00e0502021ecba690a9f1a6a6e4cfc8d082ec80a6f1d8d2e69b8ea5fe, 0x182c5f094a280e1a0f191b9b988f7c1f5f3be87f0c89490a9c3edd0919fa3a48cb5f8100502021880aacf84dd9a9a90ded2a5a6ace3e8b4f7fdd6fdadd8dc89d581c084e7a8cae7d5e6b7c1b3aadefbe9d80505020201d3a3dedc9298fad4a4ec9efbbcd7bd96d3b3e4a68bdd85efb3eff8bba9d4d7d5b4b9d3d6e2dd8dbfc5b2020202025ee4ea9e8a85b094dcf6adc48a8c88d38981d9c8fad6d798dbd1c1b2bcb4c5b7afa3a980d0fcedbc8c8215010202019cc489d29e8bc89aada9988dffd6cd968ddec6f9affca4d1f0c8d1d9999df7ead2e8c0a5d1c5eebad3901515010267c4b88d95f5e1ce8c85b098f4acbdb7b39bbfedc5e888d6c48fcad7e4a0c7f485daa4b5caaaa988f1c0801010010201cff78abbc9cc839fd7a2dfe3c684f0ecf1daf4c7d59cebd6a8fdbccab7d186f2daccb2e6cfbd94d0e8a9f00505010202deddf58eeca7d8f282c6928a80c9abdff8a8d0feb28efdbbaaeff0a894bfeae7829494e68fdabd86eac3c80303010201c1af8c9187a4f8f4dc87deb190e5f2e3e9bbafeba7aedb968298dce6e39ef4e8a6c3d1ebe8c5b2db97b7ca1000010223adbac59e9eb7b0efface97ebcc96dfefaedfa3c7e8a4f5c6c1ebffb9e3d1b8dab0fbd48b88f79ce6d8151500020bdddcb8f1968484e485dea6dcff9784edd2d6dc90d6fe94b3d2dcb8c1da878edfd6bbf8a880b496c691c0101000021aaabf, 0x1afba03f7eb25a2f54993b8178ca70ce4990014d393b5d2a5d8a089feffef83c3e4c1f7c182a1d8a0a0e2cf9ea8909da8d89bfaefb2da91c9800ae2d00ac9b909e903ec9d0dd5eb0cc29c44dfd243cc810008a2eac7decafc98badec1bbbca6ae9db2898ad99bc4f2c2e8b187fbfa99b6f18efae3a1f1eb800cd49512d4c509a49e16adb239eb8f07fae11787d42ade9e00038bbcfca4ddf5cbedc9b29285d3a0c8c8a9b8a4a89db9c3a1fffda0e7eb83cd89b1afc292b4a00196a7cd22c3a649a8aa29ebac548c820c92a71da6c12ad39700019692d2a0dbf191e999e9b0cdb8dadb93b19c899debdda6a8a2c8a2ab8bb5bfa6e7d29ca58f900eadd0019bf5a619a4f7018fd0a31ec6a95f80c70584c278c2b0007b98b1bffe8be6ecccc085f58babe194e4e7cff6adc288e1defc9bceafa8c59dcfe8ef8fc6c01515020213d49f98f89bedf6ddddf8b8b0d6bafb9ef9fcacf38ed6c9b9aed3b0d18ecaaba489a197a8a7e799e99988141002024988d7b5baf886cebb8cdad1aef5c88cd7cba296a3b5aef181a991cc848b8f8c999ab6cb8caad487abf0101002021cc08cf7bd89fef2858e9dfdd2b9efd8f4f79e87f88ddae4bfb3a7f388eda6f8ea80ab8facf290b29681e80808020228cf83f199c5d3e481d0e5ef978288f398eabc9fa9a9c2c188b3a99f9482b0fbc4c785bde4e3e996938c140502020adfebcea58cf8af, 0x1aab0c6b6b2fa88fcb3e20c02010201d2e4da9984bdcdff98b7c2c4ac9caa87c294bffad8c3c9c6bcb6f2e80702010210d1a7e28bc99599e0ebabf5dd90c4d1c1abc2b5cdf2cce8c3fabdbec41515000201e794ebe0a2bae7a89aa5e0e69d8bd3a6d2fef1bd9d95a8bcb3dc81dc1010000221f7edd0e78da5b9b7e2c0e0dec6f4b9c09cd5ecfe95f6c6afabbde5d0100200026790d4e7d0bccfd1d2e1bdf9dfbaf285a7f0fd85a7d284b4a397becdfc0f0200020caa83ced7e9da91c5f1cba0aee6d09394b0c4f891b8d084cebc80c4b4070200020d99b9c0ccb6c0e68292e392b2abfbb49fa2cc8c8beab8b6b6958fe998191bbb8bdbb28897e2d99383deccd6f3f6a0a18ef2caf00001011616161514140f0f100b080816020901010100000a1616161514140f0f100b080816020901010100000a161614140f0f100b0f0a080816020901010100000a0614020002020204161514140f0f100b1602020201010a00090004000a1616161514140f0f100b160201010a00090004000a1616161514140f0f100b160201010a00090004000a066ab0c422b9e930fbd916faff01028df8a4fbf885ab8aa6b39ef3d4debac9a49b85d8a3c9f9f69695e0f2f4afc6c8b183d6cefdb018b7aa748ff81ccfeb6ff7b50101c6a1d2b9df91f7a0c9c1d0fb80cdf1f38aaeacc2f581fe81e3d3b2e4ca85bce183bad284ccbc1ce901cfc004, 0x1da9793faedf4fbd49af0e4806082c13286eb5bafa701e4f78a45fc9e30c9d8438c8001b9d1f5001bd9c6c0efe9c4adc8b4a8fad8ed8eb7dff2faf49f9dc81515020201a7add295bccaecc2de9eebafd198abb7edafe187add5c7dfdfe6f7a81410020202caebbad9b1efbaa1cdeae6fc99d2b1cbcbc4fbbdc2f8a19ef2899ff0101002022bedd398f78899fee195dcaaefe1d6c1d9cdec83fab3fcb1a096afea8007050202179080a0d7bdc493b498aacbaeb7a3dcc3dcbc8ccfa5dec98acdd2bfee100202024d87a6c3c4a8e7dab79891b3addaeb98bd92d0efda9daa8da3a9e8e2ea0f0202021184c8978fa3b19f8ad2a780d2f2d8efd1efcabb9dc7b0ff95e0d4e8b60c02020203c1b4fbb2d9e3fdf5d79cba9cddf08aa89ef8dfa3a8918fe2b988a7b0070202020fcbf2c2c7949bffb2c5dccbaffae5dc8eb0b1fbeca5afaac2f4bde29a000002020ad1929fa093c1d2f5fde588849ab8dba3ac80e3fbe9ffb0f9a6d28814100102728f8a92a68acbdfd7b6e090d8e5bedd98f2dcc384a8ffecdfb889d01010010222cdc2bad0a884e2d491ddffb5d3c9e08bc398c39a8884c68e8ffbfc92100f010205f5a9b8aaa6cbbbd3d69db6f5e9e8c080f5bbfcf5acafc4e5b3c4938610020102618aa689a19dbba7d7dcb595d5afddbdd09596d8e0e9e1af9e95e79dce0f0201020e85b7ebbfc08780e3ffdda3989dc6e78b98e1, 0x11616161514140f090f040f020f010a01010100000a1616161514140f090f040f020f010a01010100000a1616161514140f090f040f020a0101010f0000000a061402000202020416161615100b10090f020b02110101010e000a000a16161615100b10090f020b02110101010e000a000a16161615141410090f020b0201010e000a0004000a064cc48335a7f74ee0a501d0cca20144d2a6cc99caa8a684dfe08483d28edde18293ae88d5d80494ed04dcb802c2b25cd322fcfa10f4e146c9af34c1980019a1ccc7cbd395a2ddc58fa399e4b6c6a7d19b8ac2ddb6dc43aa0cb483049ba404c8d240d78e22c2ed1484ec32998b0014f7b88cd9b2dab2a8f2eddc] private def node2029:Certificate:=PackedParametricCertificateData.decode 9 data2029 private def data2051:List Nat:=[ 0x11616140f100b0f0b1108110214010901060101010a1616140f100b0f0b0c0b110811021401060101010a1616140f100b0f0b0b0b110811021401060101010a061402000202020414141111140b100b1308110816010201010109000a14141111140b100b1308110816010201010109000a14141111140b100b1308110816010201010109000a06151114101308110809080b0509050201010108000a151114101308110809080b0509050801020101010a15111410100b1308110809080b050905020101010a06010114040502020203110201020202041102000202020414141611151113081108090814061605110208000a14141611111113081108090814061605110208010a14141611130811080908140616051102080105010a0613020406020203150403020202030c020b020502020a04080314141611151111111308110809081406160508000a14141611111113081108090814061605080105010a14141611130811080908140616051102080105010a06130202060006030803150403020202030c020b020502020a040803010c020202020204010c0200020202040b020002020204] private def node2051:Certificate:=PackedParametricCertificateData.decode 9 data2051 private def node2052:Certificate:=.split node2029 node2051 private def node2053:Certificate:=.negative 1 [(1,0),(1,9)] node2052 private def node2054:Certificate:=.split node1981 node2053 private def node2055:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node2054 private def node2056:Certificate:=.positive 2 [(1,0),(1,2),(1,7)] node2055 private def node2057:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node2056 private def node2058:Certificate:=.positive 4 [(4,0),(1,5),(3,7)] node2057 private def node2059:Certificate:=.positive 1 [(1,0),(2,2)] node2058 private def data2090:List Nat:=[ 0x1160f0b0a14080a0816060e0406040a00080000000a160f0b0a14080a08080816060e040a00080000000a160f0b0a14080a08080816060e040a00080000000a06130202060006030803152c080400060312030c020b0a030a000804120310040b0606040306040a03160f110f160e1408130813041602110210000a000a1413160f160e0b0a140813081304160210000a000a1413160f160e0b0a140813081304160210000a000a060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060301110400020206030e02080203020302030f0402020206030e040a060102030603160f0e0e0b090a0808080f040e040904140008000a0e0e0b090a0808080f040e0409040604140008000a0e0e0b090a0808080f040e0409040604140008000a06130202060006030803152c080400060312030c020b0a030a000804120310080b060504030a040e03160e0e0e140a14090b09130411011300110009160e0e0e140a14090b09130411011300110009160e0e0e140a14090b09130411011300110009060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060301110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node2090:Certificate:=PackedParametricCertificateData.decode 11 data2090 private def data2153:List Nat:=[ 0x101023e9c94bf9dafe094b0f4deb8e2bcbcc1dadaf8abe7d09c0f04010201c1e9be8eceddc992c681d3dddef9d59694a0e0d8a09eb4040401020ea4d0f49bcb81bf90e9f0cdf9c3a1ae95b582a3bcb0bc1002010253f2b19ffecdfacdd583b4f3bca5f495b3c5b4e39bcbbc1001010203f6d3baf8f5c8b3f8adfcc487c1cfbdb2fbb9afeec7c40601010244f8cde9e89880d8de81ad8586bca7e0d8babacbefa4be1414000215fbe3bddaceadc9ead3bd838bebe8d2d0ff898b96de9a100e000202c1acc8909798c2a2d784f1cd8485f4f6a5fca5f3ce98e0080800023a8aebf8ed84e5edaeef86abe4bac78f80818c81aaee941606000217999dbcd0ebb1a2b9c9f1d3df89a4b2ce93d4e9b4e69e1106000222bc9dc996f6e4bdbbe8ab8f8b98c39de5d8a6b7a4bb9a0f04000201cd919c9ad397fa918de8bbf98ef6ce99d0a6f490acb8d8040400020bcdaaf080b0dbe683c7a3ffaaffbcb496e1bcfbb396ba1001000234c3a9d9a8b898ce89dcc2f6fef08183e48c88c8f08c86060100024886b7a7b0fcf0afdef5e8e9c68babd297d59fa6b4c19c0800000209ffc7c8dcf5c7cf89b7f1fb89a5f6d7dfc6d59fd9c6a61e01a5be99aabb88c5b28df4feb18be7c09e00130202060006030803150c050400020306030c020b0a030a0008041203100202020202030b0605020202041104000202060301010109020002020204, 0x1f3a7ded582e792919f8bfe92898aa2eec6d5a1cbd4b1f5e5eefcf1801906bedab3c2de9899f58ee38a93ef83cb9ade80e2ccd78000130202060006030803150c0504000203060312040c040206030603010b0605020202040f020902010603060301d8b002d6ff78bc0291c51999883a95ef348aa214c0df0001a0c189f0c6bee487a3a5d6b7b4c4bbc6d89836a8c259f2cb74e3bc3bdacd17d4c53b90ee33bc9112b4c80003a5b095bed68188bc96a0fff5ebd0ced5e81414020209b9e6edc7868987bca4c687aaa7adc1cba1b1f3d5c2f0100e020202cbd2918ebcf1f889fba199e7d396ef99988bf7868df088080802024da2c9b0b4828fcddde986c5fad5df80d7fe98b5cdbbe6110602023c84e890f98f9e8ea8db93d7f78b95b889a3c7d690c7ac0f04020201b3a5e0cba0c4a6ff8bf28485eee3e7e3d7babec9a2c9d40404020205fee6a9c8acdbddd68ffec3858785869598b6f8f798a8080302020880ebf0e4efc4efa19b88a0a5f5cfaa8ba0d8a688aec01002020235a9fae3cfe3ea9bc4a2eef1a395f3b4a5afd5a8f595c8060102023cf9f8bc90a4acb9aef0e7da85eb88ce9cd1888bacdb821414010202b98d8987ecafebb6e7aeaa85f3a188ceb6eb97c3d384100e010202aae4ef91c4e6a4f68c8dcaf5978a939febd4e38be1c3d0080801025685a4a9e893a5afc4c287f8a6b3feb5cadabad0a180de1106, 0x10202020399a0f9d19eedf287c8e997f997a2a1d5c88ebdcee9e5bdf58092dd9aa00702020268b893adecd098f9f7c29e8ef0b7b398bdded68f88f3a5b6e19df2d68005020202019a97cbd3e9f2b6abd2c993bdf893e7a3c8af8ff8cdf0a68e84c8899b801000020201cfc293ffaef4c1c1eebbe2bdefb890838bdbfcca92a498a6f3deb9c990100f010206ea8daf9384f0daf794f4d3a3e28b99c893e3c9c694ae8ca3e9f685929a0707010203c9fbf58cdcadf990b9eea7bce3bea8bb87ba8a95fbf5d88ee8b7fcfc960f04010207eec2cb82b0aaae948092f6f0c3e99caeca86b9f584e8c4979bb7b0e8110301025aa9f6b7f1b3d5fdb5d7868bd4e5f591ecedb397cbc0a5f0a2909d8be01003010215b6ff9ffabf9fddadffb5f9edf18a91f7e290abad84e5c884e980bcf4e81502010201e393aea3d4cdff9ee59ee1a0b480be95abd0dbaaadc8a9a4fdb794cdc81002010205a9a5def3afc5a2afebb396eabbd1e3b3cd95818af9f6f5d8c8eeee88d4100001020183bcbd9e89f2d0a8ffd1c3aaebd48efde9f3dbe6f1e8c0e1a0e9dbaea0150f00020380abd49a93c18baae9e1eae0c3a4fccfb387e5e092eef0d0d2d2f0c3e0100f000201e8a0c7c1fcb8e283edfb9195cdb1f9969387f1b1abcfbbe58fa2f8c1f0100300021b98b79aeabc9eb4de94c791ac97e089dee4f1d2a2d9f8b9edd4cfcedd80100200020b94, 0x1b3a5918df381c18ab39395f2fdb1aff9e2d3ca8e85d41502000202cfa0f6d4c4a8cafedab3e4bce0c4caf1c9ccc3a1eeafae1002000201f1b7f88dc9b9b8edf3c3dac5bfbdc7bbadb0cdc28496ae0702000201fabf9dd58a84db8397b2b394b4c8ddbfe1f29ffbcae9f219049a9f88a3bcdb87a1b4edef9fb6df95ce0013020e0206060002040403150c0504000203060312040c04020603060315ca9d75f193179b9701a2d6ca012cfab3f4b3969fb2c6a192979f958dc0dfbbfbf6feaf80f4028de202b7b37495019ecf27aaca3eeffd27f0e610abb1000ac1aeb2b5e098ccdcf09ba8b3b0d8b886abf4f1df9dc1c7804cbdaa25d58b10a6f239ac995388e11594830efaf97797e0000dafdbc388bdb4b9eee790db8c8589bfd3d2feb5f7f1b3d0108dda0197a5a004c5f201a9f9dd15b7d763948f1d92df0195dec8001ea2cd8290d3b98ee2d0d5d6b893df88cac8b69694d1cfb0100f020209aed396ee89e7fd94cdbff6f2b9efd4b5d8daceb6dbf888d3eeb593b0d007070202099bdc85cdcfcae4bbabc3e88380a8fba0a496f1b6f7fd9ae08ff292e3800606020203d6dbd5d1b4ace6d2cdcab5f9869dc2cd8796eb9896b0bdbacac985801103020201a096f483b3d7e482b3fcf19cb98ec4e1868b86ced3898ef9d0d5b1d0a0100302021181f0c7afa3cc9090c6aca4c2ecc0a1bdbd88c1fedba6fcf7a0ee80e8f010, 0x1eef0b2f5d3fbdff2da86b01414020202b1859fb9bcd7a6d9c0898cada5d699c1dd9e98ea87c8100f020202f691cd99a8a5e6dec8ebdde1bceeabaeb3d195d99792c8070502025df482e5f4a4c5dbf5f4fbf1f8cfb39193b8e6ced1efdc0f0302020aea85c6bff4bec6999bddccd6989be6e7d583b0ca9f81a40a0302020389f683d99cc7c1a7cbe798e2edd5cc9be3fcfffc88b01502020263cc81c1c2e3b786e18c858190a7da9ac398e3b3c5a9ce100202024afefeabfd82f4dab49d98edabf9caa0b4879afddfdaee0702020205abc0e39784a9d892c8d8eda1bed7ae94ec8eb39dac9dee0701020279ba85c9d5c7c0ffd2e0cdcca9bf9cbd929eab88e78bf0110f010206edbae3f08297e986aadaa9cbc3b8e3d798ef88a897f8100f010203f6b98ddbe082b080d3bf86dce0a4afd9d5e787fd9481d80f03010208fbf4ffd0be86ff8dade0adb183fc94fa8f81c39af6a8cc0a0301020daff4a8d5b387d9a1fcfbe8c0a999a0fbe1f6ddcffbf01502010201d9cf94ea9598b7c4f09fd1828cafe4cda9eae9dfbb93be100201020198c8aeea9388c7908ed089b6e0f0b1feb7ade38290bdee070201020481d1e392e9f29bf492fb8698b2ac85a6a5eeeba4dcecb2070101025b95cdecbac287d7b6f3e9fdffb48fcf91e4fad19ae2b8100f000205b7fba2c094cdccb6c7ff9dcdb7fff1b8efa9e386ac81880f03000206e8, 0x190a08ca28ae0eaf5c7f9b4d9a8ecee93afd01407010209a2b1c9e1ebc6f4f6bdc4c492e5bbbab7f798bdcae0150501020d9cded9b691a0d6b4daccdff7aee68ca8dea794a3baa0110501024dc1a6959fb8bdf4dafacea4cce891d7b7beb7c494e81005010208e9d78efdfcbcc7e0b7b38a8096f7d798e8ede2f7f4ac0f03010201faf2e28eb487eee4dad1b88d85b8e193efa8bcf9bda81002010208fc8690e2ec9ea4a6ac91e2ede4f98ea9ead19afe8d98100001021ca9e2de97b7cfef98e28ce6b190c6adeee0e3b89df0100f00020fe798f3e788aeae83e695e681b5ce99e4a98f80e3bae01505000215e8b5b9f386eaeda9f597d0e5979dc48695bdc9bad1a81005000205eaf4fcd2a3f68484e3f8939fc1c9e1b6d3cbd4e1cce20f03000202c1e3cf969e8dbec7bdb9cbf690b5cab980978af0f3a4100200020bc0d28be0968ef3eebee3d8d3e7a9bfc897b9a6ae91fa1908c4a0c19be7848fbeb494c9a8db8cec00130204060202031504030202020312040c0402060306030c0203020202040c020202020204010c020002020204099ba153c079dc9b0182a3fe0123bed9faa8a0b0b3e0c7eae3f7f3d3f1d3c001fabd04898e01afcd01ecc220d6f340acf82a8bc10ab5be0006aa80fcb986fadcbfdef9eea7c69494bdead8068bd50db1830188898d019c9ed001c6ab1fdafc71968a018faad9001cb1f1d28a8091, 0x1a5de8dc1e190c6bee5cbd3d80303000201daa089c1baf3b9bcefecaa988ee6fac0f3efabdd9cb68787eae6a010020002069acea1d3e5d980a0bb96f8e1fde5a2e5fbaff4aeb6fbefa2a8abf8020200024bbfebecc09bd7b3b2a5afd8db9afa9586f7c993addac8edafb8e81918b58be1e89ffabbee91b4ffecb9d4dff2c4cee384000101010c02030202020411020002020204088ebf3bd9aa09e3da3daec30102daf9ecfcbfa9bec6e8cd8ae3dfc6e98ff001b1d104978476f845ff1b8a8d3ad1803588d915c1e8000df7acd0a3be9fb0b6e7b2edbb81aed3bf9004ccf1018a84a701dfad018ecdf018e5ca6abdb61ac086019de385001ee6f2bbd7abc0a0c2e4e283a88b8fa1bc100f020212fbcf8cbeccc08084fddaccaefde0aeabbcb0f792b2f40808020201b4dda9d7cabddbc5b193fcb6b994b687eef8e6c78c100502021cf0c9f4a6ccd0a29da0af8d95d6868cfcc4e7c7fa9d9605050202049ac0e491ac83d6b1ccceaebab4b4b2ecb3b08fc68a800f03020267df8aaceddbaa91e5b4eff3ab9c85d4c5d6f790eb841002020205dacbe2dea9c9dde8f7cecbcad8a6c58fe39adfebe3860502020203a388e9a395a4cdefa0c8b98aada5d5f2a9dfedb3f08c050102026af99ff6898a80c8ab8eb5cce091b5ecbcfa95a1f6b81000020218eff0a4e8f8bea59ebc829fcdd8a4cbe6e180e3d5a0100f0102119ff0a5e5, 0x1acd49af9ffd6dceaa19eda96addba1888008080202038beaded0e0f3e4c6858f96b5b98bc1fee690f2d5fec3dab4949c080502020cc9e88bbcc49ba5c9cdd3e4ee9692cbe7f2d29da384a8edc581980505020204a6b8e38cabe196ac8ab88ba89ac6c69bb2b2eb9f8dccdd90d6a01003020201d5a4b18bd689d9bbbdbea386dd8f88d6cde497f8f1dee7baa6d2b8100202020393aca8bab5a0ddc4c79cabc0be9586cbcafdce998fa9fbc6c6fd8802020202018edbf683a195ebbfaf95c9c9fbbd968cbaefc1f5fb94d78d8fa38c100f0102429d8ceeb9b2cab4ca8eb5f3e9c697a393a283eab3a1ecc8c6e1ce98100e010217eaf5d5b384e5c6f9fc928eaee78ab189dd92ac99c7d09faa8be00505010217afddf6d58e97a18df3aabeeca0b087be8fa38ad094c6c7d0e5aaaa1003010202f98fdcf9a2f580ba9b93fdf9849fd3da91d9bfb2ede8af90c18390100201020ac3a59efcada0e4a7cc89c2ae98b8ac9584948cd3dca3a9dea5fef00202010202b799bfa7ec81bbc087d7a5eb9cbbc0f5cbcfa6f4a9bbcdbcf1c99e0200010206888dd7d7eae4b5c0fff6a0dfbad997cba3eae4a2fddbefded6e0100f00024586d9e1d1a6cbf5b58d98fdd08ba9bd85d4aed6cdc9e29aeea0d380050500020df1aca7a39caaa6f6e39c9ccbffdaeab8fdc99f8be1adf282b1cef01003000204acdbb7c9ff82fb9ccdde97a997a081, 0x197d7c9e8e58fd5f0acd6f59c99b9eecd840f03000217ecc7e5a291f6bbc89bf79bd6aec099d7f297deeeae93cc0303000205e0d0facbbedd8c90f085f09da084d8ddeeded1a0caa0ac0f020002028ea2cf93c2f4afdad1fefa81d1c7e4c2dcde94cde5ad99ac020200022cd3ac9fb5e3b1d89fd9a8be98f781d1d3989cd3b4f981d61966dae09ce3e084b48ca9edf1dbdcd3a5d20001011414160f160e140808081602090101010a0000000a1414160f160e140808081602090101010a0000000a1414160f160e140808081602090101010a0000000a06140200020202041414160f160e14081602020201010a00090000000a1414160f160e14081602020201010a00090000000a1414160f160e14081602020201010a00090000000a06198eb07798ed07fa8e5690b00103f9a9d5b0dde0b6d8e1edb38af3b1a8f2c6e7c498dd900f8f02fc9803d09e04aaa91ac1bf47ccaa26b0ff06d9e90030a2cdb084f1ebc5fbe88ceafdf489d0afc7b7d183f79003cba601d98102bdd607d2f505a2a017d08e34cfda51c2870011ebd7e283b8aeb48393f7bef0ccb6a78480a290acb2a822edfe01a097810addd471aeaa0de8c35c83b208f1c6578cb30003b2d1c2f8afddd5bd9bf8a8b79b80c49bc4cfeb8fc8b0100f020243dec3a69eb6b7cdea96d480bcb5aa83e1d1ee929383c1b596c1eed8100e02020680b5a79ec0e1ab8fce, 0x14cafe3003e80ade5d683dcc8bed2d2a7aee48b9ced88e0151502020bbbf5a6fbadbdf1d1978290f6d79c8c94b49feba0c6cacc110f020207f9b7e0f580ce9d86eabcfec68a84f9f68c94d5d8e1aaf8100f020201f6f5c9e0c1a1cff8c2acf58ee79abbfea2fdbd80efecc18c100e020274e1c7999cfcb3ca8dc6e688fb8af1fad5e884d8b3bb980f0302021e82d2e6a2aeebbecdadf6c484f7c6f1eef992f2e6b4dc140202020eaeafd791f7958ecd8a879ac4b1e3cc90aa9ac2ff81a1900f02020201bfdedef0a2b7ce91b5c2c080eea2c096b8b7f99cb6dbfed40202020205feecb9c0bc8bf9cfe4efdeee84f4f8a3c4bdba80b4f3d4000002021894d28b85e8aef18ed9b29582b5d5ab8f82afbcbad1a8151501020adbe3bb85d8a2b882c6aba6b1fe87ace6d2ac96e4b8a7bc100f010201dbc6c0e18ac785c3e6ce9fab93c9e29384f2e0d3f2b7fcac0f040102028dec85d88e9db6c2bbe3d7b5c386ceaabaf8f2e4c4d9b80f0301020dc4fdafefda83f4c7a984d185a796c08cf7b4f4d3c9f0941402010204a2a8e38c88f686e093cc9cccfaaddedfdfaa8dc8f19bc80f02010201e3e6cf9ac7ef97b5a79cadd3effaacb498d4e0b0979eba94020201021adf8599a7d4c0b8eab3bd93eda7f189d1aeafa1fcad8f981515000203e2b1dbd7c78e868cb3bb9680d8e7f6f5a3f9ccd9f091a0100f000201b6d1ef8d82d9cc, 0x10f0807060012041404130f110f110e130a0909110811020201010109000a130f110f110e130a0909110811020201010109000a130f110f110e130a0909110811020201010109000a06100e100b130811080908090509031102020101010a100e100b130811080908090509031102020101010a100e100b130811080908090509031102020101010a060101140405020202030c04040201060002040a0411020002020204110f110e100e1308110806060b030903110208000a110f100e100b1308110806060b030903110208010a100e1308110806060b03090311020801050102010a0613020406020203150403020202030c020b020502020a0408030c0203020202040c020202020204010c0200020202040b0200020202041616161514140f040f020b020a0101010e0000000a1616161514140f040f020b020b010a01010100000a1616161514140f040f020b020b010a01010100000a0614020002020204161616151414110f0f040f0201010e000a0000000a161616151414110f0f040f0201010a00090004000a161616151414110f0f040f0201010a00090004000a0662a6d228b2f43c86a801c6dfed011b9e86dbdacfdaf593d68494bdb0e6bdc8d0039eff03919d09baf80db61cdae738c8da3ba8e71fbaf6007ce1deb3c0e98dd3f6d297879b9dae8efdb79204efc90cd8890fd6ee308f0cce8139eb901f92d6, 0x1130f110f110e09091308110811020901060101010a130f110f110e09091308110811020901060101010a130f110f110e09091308110811020901060101010a061004] private def node2153:Certificate:=PackedParametricCertificateData.decode 11 data2153 private def node2154:Certificate:=.split node2090 node2153 private def node2155:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node2154 private def node2156:Certificate:=.positive 2 [(1,0),(1,2),(1,7)] node2155 private def node2157:Certificate:=.positive 3 [(2,0),(1,1),(1,6)] node2156 private def node2158:Certificate:=.positive 4 [(4,0),(1,5),(3,7)] node2157 private def data2189:List Nat:=[ 0x114140e0e14080f080a0808080e0604040e0202020a161614140e0e0f080a0808080e06040402020a000a161614140e0e0f080a0808080e06040402020a000a06130202060006030803152c080400060312030b020a02030400020406031002020202020314140e0e0f080a08080816061404080402020a000a14140e0e0f080a08080816061404080402020a000a14140e0e0f080a08080816061404080402020a000a060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206030b0603020202030f0402020206030e040a0601020306030e0e0b0914080f080a08080816040904040414000a0e0e130a0b090f080a08080816040904060414000a0f0f0e0e130a0b090f080a0808081604090414000a06130202060006030803152c080400060312030b020a020304000204060310020802050203020404030e0e130a11090b090f0814040b040e021300090e0e130a11090b090f0814040b040e021300090e0e130a11090b090f0814040b040e02130009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f0402020206030e040a06010203060301] private def node2189:Certificate:=PackedParametricCertificateData.decode 11 data2189 private def data2243:List Nat:=[ 0x10202e9808fbce5f2d5e08682cdd1b6eaeed3e5ccd2f7f2ab80cc8808030102219eefa7a1b3c3a5beb292d8deb3ceb0d0d183ed8c96d6c5a20303010203b594d094f9ed8ba5e9f3e5d396f6e7b1ec9a92c2f7addae882150201020be3ccdcbdb0bbf5b29fd7e1a4d5b3edf8c4e1e9ab8688afdc0202010201ab85b090b0ceaeef96e4a2f2e0ed8ed580d5b3ab86d7f1cdb00f0001021396bcd68ade9891f28493f3cef0d0d4f2f8b9addb87e68bb60f0f000201d6a5868596c3d1f2aface4be9be1e2f597d492cea58c9180bc0f07000203a6ebddd0dfbf89ccaa88adbcfa8a97c298c18698e6ccbff4c40f03000202bfc18a86c89588c49cc989a5b3cdb5ca80e3bbfaf4f5a1ebbc1502000201bed4fe99f59fa8f7b0caa4bcc6fac284f8878ec9d2fdaccad8020200027cceb5d9c9deb7ef8196cbaaf5a1898efbb8a4a0e490c8f1c21901bfdbec8499d6dafadaac8edba5f3fe9cf78c00130202060006030803150c050400020306030f0402020202030110040a0205020302040c02010202020314140e0a0a0a0f0816060e060a040404140308030a14140e0a0a0a0f0816060e060a040404140308030a0e0a0a0a14080f0816060e060a040404080303000a06130202060006030803150c050400020306030b020a02030400020406031002020202020310040a0205020302041104000202060301010109020002020204, 0x1e2c3aff9f5d288d3a3d9c4eafcc7ddecd7eda28ee2000b020606020203150c050400020306030f04020202020303ab8806ff9504e3d40285e118a6b43fffe92ca3dc04caa500028fcdece8dcbddda9df8cfdc7bda1eb9fbea8a5ca3ba782078bc73df7e870e0fb45f2b5139dec06ac822ca8c800199aee99a798aaa298c3e6d2d0f4b78696c6dea00187da8f029fba06b0b40180c1fc53f9941e9fdc2294fa0194ade90007bbea97abd787f4c8de96c0b0a7f9c1a1c093e81414020201d3b780f9f5af86ba9ed1f5dcf484a3efdb87f5888ea6f8840f0f020202c5ccef88d3d3aea5c9a8f4d2e3cfebe2e6c7ccc4dcb9efa9880f0802021dc09becc8d4e2f0afc290b1f3f2c5d0a6ef9ca6a1aeb4f2880f03020202edc7f1fb8ee6c1f9a5b984c3fec2e585e7e79985e9e492e5a8080302023e8dd6e685be9af9fd97fc9edcb3aaf3f5e2e683d7f5d59f880303020201cbb2f1f2c78f8afcc7afdea7f7e1f7f4f9879ba0d7eb9c98bc150202020184fb83808dd6d7ffe293c6a1f9c086f8bbbdafb3e3bac6d1b00202020217d29bfbaab6a1a99cb3d0ce839aa7a89adde78ac791c1e0f80f0f010201bdb9a7fc8da5ece3b483b988f3aceabac9d892beaeb0ede4cc0f070102038289b387ec96e898e9fa94c8c0d0cecfa0d182e9f0d2bef294120401020cdaeeaea4a28787a196edf6ad91efdc8babe4fbc9a2f9e3e20f0301, 0x1a00701020202be8f80ccffddf68e8cdffc8eb1c3b096cead90c9a1faed82afd0eee29fa1feb6f9b00f0f01023dfcb9d9cb85b9a0e8f0ece88892a1b59b9a87edf1c0e8c28e8e9ea4e9f7a595d3c80f07010211afe188f8f8bbc6efd7d58ba8d1ffc5e18dfcaa8d8c849eeaf6d68582b4dce6819bfc1502010203a184fba5a0d69caa8a86a09696a6bf9d88cbfac5d495ec89e3d39a88b68c84dc83fc040201021ee4c3ddb8c4d6c9a0a88cd3aac0b1f4ea9df383c1fae1aaf3d5d8e48a9f81b489c40302010260c6f399c5f1afefbcddb296abb2f488e6bedfe4c7e5d2baece9bee9b4b3cbdaf7bc0202010205ead28e87ecf2aab18f959dd1f2c5fed7a0a1a89cabd297c8c68dedecd4b1e199f9d20f000102178ed2e1b0878d8193af97df8e87ffd1c0e698d8e9e7d7e485a58fe2b7cefa8e80c007000102018aeec9fded958ac291eaf3dfdac4de9cd4b2f2fbb3ef94b78cbac6db818cc5ddf9a41507000203ccfe94a6f7aa9ad9dbafa7cad69c8e92ecd491ba95eaf7ba9badb08fb4dc908effec0f0700020cb1da86bb8fefec8ff982dee6f397d582a7e9fcbdf4fae68e918d84eafff08080eab01502000207f0b4ebd89af4da99eadfd0dda9b8b5a4a1dca1a0a190e4a289b49ad995bcaf8ddbe40202000203b9cfec96d1bbdcb8cacbc3f997e0848d8ad4968b868bf9a1bbdf8de2d3e4ece4b2861909fafe9b99b1e6, 0x196f2e4e0ae908281aac1d6ffcf9bf486b6f3e3abe2c3c8039dd107a0ae49fe0394c50b8bd539f7d23afbff0c90840019c5e8b5edc39bd5e68aa5b2cdfce7a4b08393b1f4baaffd9c97af9fc8ae189a43f4cd46b4ae01f8ca35dde53d8f9202b0f009e29b0002c5e49888efe19d9ac4a1c69af492aac3b49b95f6e8ebfb9cef8de4dc960beea25789e86ce7a70d92dc2fdad920b1dd4ec3fc01c8bc0001d5ddd0ebe49bf8d881bc8f83b7d4ced3cbb2c9f3a0d788f082fbe3c6d80aff8350b3db57a3db01afeffa2b99b04ef48a4890d201c29e8b001ecfadcca89eb08ffbe585c7a0acf8a08095b2818dc787c9a4e8b0d6c81414020203ffa3bef4a5efb691adcedcb7c59cb5cfd7aeeaef99f692d99aad98ddc4abd3eea40f0702020eacebf2b1a9ebe9c784e6d09594b395c4a3c3e89f89e4ded4e9e3fceec680edd7f4d40707020203a2a1b3d8b4db8ecaf88080a996f4cee3aeebefd5d8c2a5f2868a80a2ede49fa0fae80705020202c1cfeafb8ba1a1cb8bfcd5de8a8599eba6e193c0bdeba7feac95fadd9bc9e1f794e81502020201e3f78af2809cca80e49da79cd1a8e8ddaf87ac8cc780bee8ebf09d9aabe3f6fa82a40502020207acd08eaad7f8968586daf3abb8e8f4eeb2e7e9a0b6aba888da8ad19babd6e5ed8cca0f0102020aecdbb7b685e7a98fd4b1c6f89bafcfb1bafdc1b599b1feddb4afdbf0a3c1b8d9, 0x1f1c00f0f010201ed8af9849bbba0ababae809deebcc6c9bdb8e7b1a4bae3f4d2e4eecb8a98140701023c9cf4a4d8cabbfcd9d384fcb6cff2f2a8d7eb9f9fe38c9183f7ecd4d0c01605010201bedcb8de8e88d4c8ba98ca9d82c59fdc84abfe9ac4b4dff4cdc7b9fa8db01505010205f1f2ffd9e192a6d0e0f6ef9be4ed9cbb98a384ba9d839585aee2bcf1d1a815020102039fbef8cccdcdf59790f9bfd9bce5f4add6d6eec7a8a6b9e4b1b3abb1e4900202010201b4aeecc0becfe8feb2d49697b98da1c1e4eec78df4d0f1eeab959cdadfa40f01010201f8e8ade599e8ffcaa594e5aad8b386d4b0d88b9fbdb0eed1d1afb4c180150f00020183a7fd81aef7eec5b6cfcfd490ceb1b9a1dcfea3a3ee9deec9a2ddd780a00f0f0002038bdca48bd3b7f3c8f0e6ed91abafd4a0e9ea8284b3ab93e2c0f88df5d5f0150500020ce98cdb87f39bafd8b5f9e884a0f180f9f1ffc685d0fc92a8c7aba4f5a7b41502000204d7c589b0adde9bdeb685b8f6b8b7a78bc3fa82b5ef8cf7a3f8ea92e9d39c020200025ebd95ccfafefafa84f8d0e99a9bf0bffdf8cc988899839ef781a180a3c41909f296a5c5c7a0cbc9d886e7fec9b5bba0d3f6c9afd1cbec0013020406020203150403020202030f0402020202030c0203020202040c020202020204010d0608060204000a040e040dc9d05ce5ae4e92be01b8c1bb012debbbb5c59e, 0x10c0203020202041102000202020408a3f56c8bb8388f94019bf6d50123fd94b896b9a4aac4f9b19aa695b895b28e93ebbcdddcd8f00190f30480cc7ddd01b40a98833995c83cd0db0dd398001d838ad8c284cbf49f9dd0b1c9b2b9ab9c80dfdbafbbbae9edc002d6df14edc71efcb203cb8138f1f130ddd61cd8ba14c49d0002e69aaeaae48a92fbfb9ecf88c8d1ee88a3b7c890bccad888d816fa9546a7ae2f82ac59d3c924d38545fbe12996db0193e5c4002bd7bcc5fa99f791de93918881ddacef9acca096d5d1a79a8014140202029e9eb6d6bbcae5b89a83ce9dfabad4d08bbca2fbb0e7e8a3d688c296f0070702027aecaef0ee93f4c995c4bc88ef8797c8f9d2b6e8e1a0ab86eb86e2d1c7801105020201fb818091f2f7d59aa3d9a3f99df59b94f3c1b2a6ccc7dafbea97fc889f800f05020203faaf80fbbfe9c8eea0bab4d8acad80ce938f94ec9fd589b5e797ffb0bb9c150202021681e0f5d4aa8ac4fbf8a4d6b0b0f7fbd8dd80979baacdf5f599f9c8e6a40502020206bdaff1cdd7fc8b81ebf3c0b3ed98e5968cb6849f93cd859dae8e9897fcfe02020202029181d1cce1e4f0859dbf969eda85d2d4de9de6f79c94f0c2f7a18fb5d39e0f00020206d0d0a0f9f1bb908bcc8ba3e4a8fed4b1f29acca3f5d5e596c7c09b98a0110f01020a909efeecbaf691e2a9c4fc8a83eea19ec5eeb5f3c7b1f2efb78280, 0x1a090c0bfc4df94e1929897f1981602010201abc1c2b8bfcae1bdb586d097f9cd9db8a0a1c8b481fcd1ccc8cbae90daf8e1bca995d2f1d6df97de95e4d1eef3c699dd8cb4d01502010219dedce68fd6a081bfd6c69fb6d5edad988986a6dfd2acc6afabccb3e6abbca6e9b8bec2f4edefbfcecfb09c8fb8faa3b5eeedd802020102029a8792f9a7edfebffbc4deecf687a6e480d1d7bfb4fba1eab7cbba9699eddfabbfe2e0b8d4b9ad89c893e98792f281f184c8a0fa0f010102228dffaab5cca5fd8febaffb85a1f6b3a2afcf8bd3a496bdd182cdf6d4969e948988a4b4a290a4839e878394b59fa4eaf18be00f0f000205a5c2848b8bd5ae8bf38dd4f8f698dc80f5fbc5d5e5a4bf81f0b0f1c5fecbcaf0d4e0dfb4a8c7d6c0b69ed684f6abd28ad7fed01502000210b4fb9bbd80d19ad1e7a888fda0a9a294c2bcd6c8c193d6f5a08583d29ec59a97a39882aa94a2bff796a1e683cadc97ec958ec00302000218f6e0aef4f684d6d19aeaf793a6f493d6c7bffda0a284e5c58eb5a0eca69c86a0f4a28abfb7baa9bea0e5d7eb9e9795bf90a4a0020200020284ee8cd0e5eddae1fa85fb92a8bacecbdcb5d78297bcb185feda9f9fcfa2cdc49df5a9b7fa95f286d4ae9df88de8b2a2b3d8dad0197b9998b7a7ace0b8a1e88981d2f4f2a1feaebed1eca3d5c6a7b4b9fdaea398cda3b986d8afdaf3fcb1bc8f8c9000010101, 0x1aec4d19597ded4bad884999ade8aebc59ecfb4bcc4f6dca00f0f020202afd6d9be98a59cd8afc9d7f1d1959383b2ad8d9a9296f8feabc2fda3c286ec98ca9880f8a8da94f7b2f8d990cde784b2c5b4b00505020215ded9f8facfd59cc18f95e9ccedadfdbd81f2abacf4f0b391cdded3f4aef28294b5d2c2abfee18880cccafd9b90e99cd4d180f00202020201eaed8fa8e3a18ef69ec484e98bd1feaec4a897dff78e87f895b8aefcc09685cc9aa399c2eaf9b283d3f4c58be8f69b95f7e6f1800f0002020395c9d9e494f0f78091b1e8dda6a7a1ebbab7eaf7fdcbfb9d8bb0e5cef2d898cc86f4fc95d0c29b959bfb90c081d1d89eb5e0020002025aea98a69593eaa1acd786d9bfee9de0e091adcef0dae4dead85acc8b1939890c7b583fbd5befdf58ec1bd9cc5f8b0a89985e00000020206d0c9e5ab9490daeb9e9597cf9dd8bc8bb3cea7becc98bbbddbd9c6c0b7e880fac0e0bbffc1f199b3fbb7f4acdcc4d091bbf00f0f010206e5d4b7ebf7f3dfe29f98d283b7dab4c7ed87dcaee6d0c5c095f69290e2b7c9f796b587a9c9dcc7f099b69de6fedee0d5ce91d80707010201f0f0b4a3c4b7fe86da8fd787a5ac9aa19fd992d5e1ede4caf5a4b7e2d0caa1d4ccd8b6bdf8e4b28eaf8bbfd4fe8edff1e28ae8090501021de1c9c2a8b9cfb6c0e781cc98b9b6e4e58acabac7a6c892d2f989cb9bbcb1d8bdedbd9988a2, 0x195be8e8bbbd3c5fccdc2d4c08ae7b985d9bdc2ed8dbdafb2d8e5ace5bddbdfff91efb9e483afa68038c08c0bd5ea13f5cc588bc10104ad9ba8b5e1a987c8f5ebb0cc8cc4efd4ce97faccfec8c999befe91b6cadfdeefb9c1a0a4dc968fa583c98fcfceac04998b0ca3e60290a607a9bb10a1e131c3d03e99d31cf7e60001d7acbc92f2f4c8b086edaa9caec887dbaec1f8b8ff85fd99d5ed83c4e2f2e7c4839de7a0a38b9cb3aa9fe9a48b92d060af0ee28316a7d206fdcd16aef33aa1da1ce6c640d9ab0058d58891e7c7e5f6efe3a5eb89c88f9a85e4c0bbd3bad4a8cc9b9ffa8686dbeefbccd4d685a491ceeaf9aae3dfd8d009d4c601808dc13d9a8e3c8bea2380cd3ed6ea13d3cb0882cf0012e8fff19dd2d9c5e0a086d9ffa2badae388ad8295e7c2e3d2a9f7c7e4c2c2f6f794b9c296baa695e5b9d2cde4abe02983861cd1ea769caf33e3943fd8870989bb53e2900b80cb000baea2f1e5e484cec5a2e2dbd6dcad98ea82fdacefcdd282decde287bd8ff1ac8b9ee0e6a2d184c2f9afea80cdb0902bd3eb5ce7be54d28a7fff8d1caca744928127beaf0187fcda00058381bef8c5c7f49ed9fcb488b7f7cda1dda5e4d1fcd587d3e6d3a1a89397fbbbf48582e8c7aa848deff19be3c2a00193f6dd01e59f1badc901b6e08a59ddb213fe8e239c8c0190f7cb0050d0fdddbebef3cb82f6ba86dcd5fff2eaaabd8c9f85, 0x1fef1b796dfa4d01203010208bbf6e6bf82b085c991b6d5c4ceaaa2baeaa1ada8dbf1f686dbf0abc4a5f0900202010201c6e582a2cde69da7beaaf4c4c6f686bee09cacbcd0a3adbb82b1fcc6e9fef80f00010213cfe1debeb79cb4dac2a199c2d88e97a0e6a68fcdf8fe8fdc90b384d8dec002000102209ee2df93ab86beb39dd5c3cacee991a085eb8f8b8082dfc891aaefc4bbb01515000201b4d4becaf5b7c7a2a6c0e0c6f9dcafb1dbffbfc8bbd3abdcc59b99d1d692f00f0f00027692acb798c1a5a1f9c9f1a8decc85808e94f4c0ccfad6e7ece6e9b5db85c01207000202e092bde69de5afd4bcede1e2a0ede3aafbaebef1f799db97d7bba0f7abac90070700020d86b1bab4cec48db2f2b2a2a5f4d4f88dcd8dd3c692b8c8ade48bfbd7aea5c01203000208ca97d4fa82cec1829984c3c1daadbcafa99ffcb2de9ca5f1e1f7e7ea8ff8f0192ae98ccc89bba8d4b7b9fbf8c8eaeaede6b99cc7b6c3adbb98000101161614140e0e0c0b080816020e020901010100000a161614140e0e0c0b080816020e020901010100000a161614140e0e0c0b080816020e020901010100000a0614020002020204161614140f0f0e0e0a0a08080e0201010a0009000a161614140f0f0a0a08080e0201010b000a0009000a161614140f0f0a0a08080e0201010b000a0009000a062e8dde33bde964cfcd69ffda010dd5e7d890e68e, 0x18eb7ade7dfe3b3feb89096e9f8ef84b5ace4d999e7c0bb903cf5e258808f6d8bf10187d0e027f7953a929e4d92e25fade90005b9cca0cbabf0fa91c58786f2aa81a297d497d4fadbe1c2fad0900cdee407fe9934b9872792fc39f69e1deeea068da65df2ad001bcac0a7d7b5d3cfb8f7a1db89efb289fbbf81a9c1eb8afaeac0151202020abef5e3bce3f9b3a3b8ef9ea4c8ff93db81f2daa1a6f2ded7b2b9ffda85dd900f0f02023cd6a6a0b9a7a5858583e1decfe39df48de2a5c9ad90e9d99491dbb4e7dde01207020204e5ab9389a5b3f5ead2d8c0c583fcc1a2ff9abed4ace2def896a1f58794ce801203020201a7bde5d3bee5c1dbbaeccbd6ebfbe589b8d0d7a4c7d1a3b58caed1e882f2e0020202021ca4ebe29ff1fedcf194bb81ae82b6cb859dc0c1a49ccdacdbfdf2bceccdc00200020209a6f4bcccfd87dda39ad8b5ebd5e195a0f6d7d9ccceffa9f881e4a3fff3a00000020201fae78fd4cda2a3d4b5c5cd9ab086b7f582c0acadbff6abbec3dfa5a3abe01515010201d496bef186e2eac6aa9af080f0d5dae395f8adda8580dda4a980c8df8ec8ba0f0f010269cc9dfdd9a79fcfeac0b2b5cbddc4d18bcac6eb9ba9a8d6debce9c0f0beb8070701020d9898e5ee86cbe6cff087f789a3a8f4bbf4c6bd92f284dc9bd5c9ae9885e5d81204010201f5e0e5c38efaaeb2aac6fe8dbcecb2e3b8f9819e96c5d6bc, 0x1b6c9ec151501020dbef0c2a3edf3ce939bc4f7e5b8b014140102059f9dd3b0c3f1eb91d298efd687c0120e01023ed7e7f2e3c7fbe88f88a199d4c5900c0c01020da4dae297b5998a8eefe89fa5dbe41204010201f4a194bededbfac9c2c3e2e3b5d011010102038b99a5e7c5a9f2cd8e81ece7f6d80f0101020bd99086efca9ccdccb081cbd88efc01010102108893a1a7a9eb92aa95bdfeecb2d80e00010211efaee6c7bcefc1c3a4db89c7e1e00a00010214c3f8dba6e0b5effcd5e5d5b7b38c1615000205aa9afcb795f09bc885edb8d79db01515000204ede9888be0bc82e09587f8b59ff81414000206c3f095e8fed5c1959b8a8f99b7e8120e00023eaff7c2ccd7cca6c9dda7e4d297b80c0c00020dbccdec9bd6d6cfb982b2f3a49f8c1204000205e4e19bf2e9c1cae687a5abe2abc00f0100020fbccdb9a5fbcd8afee8deb9dea6bc010100020eb6d9a5fdc8a8d4a6d980c58afab80e00000209899cf2f4d895858f8ec1e99bcad80a0000021a89ff83f0b2879fb4d6a0a386d1ac1e168586d3d996b3ba0017c1aa209bd12e99f736f4a00122af9a91ddccb8a0a09dffd7bbf8f5e0f6f3f5d3b59cabb3e68cbc02c3f305fc9601c3ea01bcdf13f1ab2bb0dc40bf9128ffe2003da4c2b8e8bff1fcf1afcb8df998cbe2b2f7fe8491b7f3f680a5905ab707b79d1ae08e11d19f21b2b53bbdb012fa942d858d0019c986, 0x116160e0e0c0b16081108090816020e02060101010a16160e0e0c0b16081108090816020e02060101010a16160e0e0c0b16081108090816020e02060101010a06100c0e0807120026042c0412040d040606030204140405020202030b040406010a0006041604110200020202040e020902020201020404040d0608060204000a040e040c0607060104000e04120416151414120e0e0e0c0c080812040c01010100000a16151414120e0e0e0c0c080812040c01010100000a16151414120e0e0e0c0c080812040c0101010e000a061402000202020427c602ff01b1c601d5e125a9fc479be30ec1e91ce1be000593abb7cdf5d1cafd8014140202099fd8e8b0d5e4c1f7c6cca5c194b00f0f020218e4f6cc8d9eaa8af3f3d4fe89fce8120e020203f6c2ecc2d0d9b5f0eef385bbb6980c0c0202088786efd1c2ce8e91bfafa4a595c41204020241a5f3afe0f6f4a4aac6da81f8a0800f0102020bedb1bcba84fce383b284ca9197bc010102020ebdb4aca2e3a28cf1c7f2edea9af80e00020208c0ac80d897c4e8eeaedc9781d6d80a00020217e5b197aef084b297ae96fa] private def node2243:Certificate:=PackedParametricCertificateData.decode 11 data2243 private def node2244:Certificate:=.split node2189 node2243 private def node2245:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node2244 private def node2246:Certificate:=.positive 1 [(3,5),(1,7)] node2245 private def node2247:Certificate:=.positive 2 [(1,0),(3,4),(1,6)] node2246 private def node2248:Certificate:=.positive 3 [(5,3),(1,7),(4,9)] node2247 private def node2249:Certificate:=.split node2158 node2248 private def node2250:Certificate:=.split node2059 node2249 private def node2251:Certificate:=.negative 1 [(1,1),(3,3)] node2250 private def data2292:List Nat:=[ 0x10804040e0202020a000a06130202060006030803152c080400060312030108020602020203100601020202040702040202020314140e0e14080f080a0808080e0604040e0202020a161614140e0e0f080a0808080e06040402020a000a161614140e0e0f080a0808080e06040402020a000a06130202060006030803152c080400060312030b020a02030400020406031002020202020314140e0e0f080a08080816061404080402020a000a14140e0e0f080a08080816061404080402020a000a14140e0e0f080a08080816061404080402020a000a060a08070c03120034043e03152c080400060312030b020a0203040002040603130400020206030111040002020603010f0402020206030e040a0601020306030e0e0b0914080f080a08080816040904040414000a0e0e130a0b090f080a08080816040904060414000a0f0f0e0e130a0b090f080a0808081604090414000a06130202060006030803152c080400060312030b020a020304000204060310020802050203020404030e0e130a11090b090f0814040b040e021300090e0e130a11090b090f0814040b040e021300090e0e130a11090b090f0814040b040e02130009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f0402020206030e040a06010203060301, 0x1161614140c0b0a080e0408030a011400080002000a161514140c0b0c090a080e0408030a01080002000a161514140c0b0c090a080e0408030a01080002000a061302020600060308031504030202020314140e0e14080f080a08080804040e0202020a000a14140e0e14080f080a08080804040e0202020a000a161614140e0e0f080a0808] private def node2292:Certificate:=PackedParametricCertificateData.decode 11 data2292 private def data2330:List Nat:=[ 0x10202010257a786eb81f7e4ff8cb6bfd9e192c0afd3b0d780ffa98795dc9aafb3dfd69cabb1f7929a9caace928ba81200010224acecdc81bf848399d399a8ccdbbbb9a3e4cf87e78aa0d18494bfbccce2ba8f9bfaf485a7acecd298d0120f000202a292f894edeba2e7dceefcb28dbdc5a3bdc288b3e6f78fad8aa9e9d6e2ddf8e2f9b8a2829ad4b0d5a8bc030300021ca1d994e6dcbfcce6c0bfec9191aaccb9a6e48ae4fefc8698cdcd94cbf7ecdaf8c3cb9ee5d5acb3a7d4030200020280adf49ebbc4a8b38af885c9b5c39ece84c3b496dd889afbc9829f87a5ec9bf7aa9fc5c6e08cb5ddb4800202000240e6c4998d99e39d81ec9feec5c9f5ddf2a5f2d8c69a82c8c7bde0aaec8c88fb85c9af97e0888cb5c6fa193deca69a98cfdcf5ecaca3f2bd9bd1a5d5e0e3cebc91b39deba7a7cef0ccec8ed79ef6000b020606020203150c05040002030603010f0f0a0a0f0715040f03080303030702030202000a0f0f0f0715040f0308030303070203020200090f0f0f070f03030307020302060613020206000603080315040302020203120f0f0f0a0a1208140312030f03030315020a020a120f0f0f1208140312030f03030315020a0209120f0f0f12030f03030315020606130202060006030803150c05040002030603010110040a020502030204010b060302020204010e040b020902060204040309020002020204, 0x1c285aa0c0c02021ac0efabfea2e8fce3cda0cbfddccfa191c0acd1c6e9ddafa39cb2bbf6ab88eabda68fc3bcd7e4b8d21208020235dc88809f94bf87f7a5e99decefd49de4bf98dac5a3aa8fe2d6d2fa95aacee9fce597e6e4ed84eb8db80303020204c7eac5bb83f7c4a1e0dfdcb0acf9aeefc0d4cccdaca4a7b48287c384e6c1f8f3ff94bdae8ee78190fc0a02020209e0b0a5a1b1bd81bbfad7e6d29397b4ec8395c2f8c2fbc9fe958ec98c90ace0cd9b8be5f2ed9daca0d40302020201f1f4d8e4dacee7b9d69fc5c9fa8392e69483c7b3ceaee391efb3dbbafde0dca8ab8f82c5deeabe83db800202020231b28ab2bf93baeacae3f68f9da4e8d7afd48ac2aeb3858bbab2c0b39ee090b2f9d8ffbae899f1a181dc120f010201fb9ac4beeeffeee8b6f7d688b0f9a4e8dad8ab91c0efab84a5c2c6bec7b8db8ec684cca0f9a1cccd95e80707010201dcdfd3b980bda1a3d0eed6979fdad88bcbc9beabdeb9eba3ef88e2abf4c98ed784a8eeb8d6bdcd879d80030301021cc6c18bd0b7b3c9a68babb2d5d4f1af90ff95edb0cc87fef38fcaabefa395dbbea5f3aadbe6c4d496a80a0201020980d8c4e2d7d887a0f9c2e1ae99efcec5d5cbe89480bec8c1e691e7baf4e2e6b4edd5bff2dcb5e7bcda0302010201e4cabba791d4a1b1e1f7a8e4e3bbc2f8e9a3879dc485ebe9b491b8c386e0db97f0eaf8988aebbbf0ede0, 0x1bdfd9fbeabbf9393c8f61975c2908fdfb3b9a6a8e4b8fba7c4e5d7a1809ee6f9ba000b0206060202031504030202020301de940480e806bfd902d1fc1691b53dc4e43297f70ae4ca0023c48aeae0f3d9eba2f0a6e5a6d6d6aad6e284a4ba86b7a1b5ccd4f680cdd4b6be96dacb8c0b98fb2289d414e98f03a6922ee4d70d9bce40f2c01fa9b5000c88ba8bc489aae4fdb184858db0a190a682ebfac7acf285a3c3b293e9e396cdf78a9f9ed83ed25aeaa70183fdac26edd71ecca529b3f23edfab33f7e000099d95e89a9a89cbb2fe82d583dcc98dcbc993d2ec8089bcb5e8b7c2d2d0fb9ea2c3c7d9cc04e3f50fb2fd3fa3a556dea01edde90decf52190b40bbaac0011938ddcf9a5d6c3d5b2b7b3dae0aceea6dfcd9d8fafe0caa696dfe6a7ca9ed7978b95e9880acdff7d8cad39d9cd01bf8a8823e7ea5eed86378e8a01b9e2f90003e1e1edc4e0edd8e4fcb3c9cac1bed3eccd98bdd8abb890a691b09cf5dfa19ccfedc08de0019f86901ecadd1ffb9766b5f95f96f70685b209fdbe4f9488003293d9a3a6fbfbe9a49591e9d99b9a8d8bd4f2e0f8d8c2d4c5fab0d8c49baebfe8aca4c2120f020201fcad9b91e0ffc4dc999b8ee8bae0f8ebf280c7f8c3ddd3ecaa9e87b38af58cdcefc5a683a9e0d4ffa8bc0f0f02020281afabfdff84ceb9e5a991edd59f90df8b98b095c3e1a8c8fd89918b84cee1c6acc2fe8e89a1, 0x1f9dae0e6a687d3fdf1a4b8d4db9adba8a693e4a6070202020186d0958abdb99bc487c39de0debbe3cbe2a39896fec4c8b5c5afe288d40502020201d2efb782c8d6a5f2daa4c5b7c4b8fe83c4f6c0ffaff8bdbedfbf89acf60200020214d78daab2f687f9bc99fbacdd8cd8b8f0dad995a0bc9ed29694b2e6840f07010201e2d19182dbcfc59bfadff5fc91f88cf7fcc6d2918fe6a6a3afc199b68607070102468eeca5b7ccbfb8de81998eb3d9f484f2d4aff2a9cecfcefaa190aac60f05010201a7a787ea90d5f581d0eed99885c392baac98cfefc6f0b5e4b1eba180860805010218f5dac592fee4c1aca8d0bbaa8f84a08edcf3bb928dded3a19ef1edbc0e0301020296e6d6f4f1e5edd8e9dfb2cabdc980ffd0a4da93a2c8c88e9fdc95fc0303010204feaea7ef96a2868ef6a0ccaeb7b8b0aee084e180ab829cd79f9f8c940702010250c699a9c7b8b0ce87f0c2d3ffbca7afcbc6cae699a0fb9b88efd1d2dc0502010201a9d9b3eadf80a4d3cbeddaf795c0c9f6b0ee8fe189b79bc2d3efccacf80200010208bdfb90b088b5f7f995ffd9a59dfca3f2c9afbfaecea7d4d9ce8cc8ce0f07000202b4ada3fbd18df9d0b9c190d9ffddf2a8dcd4a8f9b0c198d3efc4eec9e40f05000266e8c598f6b5eead85e5bccb90bac4babce8a7b9ded5fa92e0a1d4e9bc050200020290cbfccd8bb6a3eddabfddbe9dcf87bfb0c78e, 0x1ee87db948f8dd6d3a9beaecab8b19bc2e69ef9a78df39ed3abe0dbcff2c00202000225cae0c4ecbbdcdcf482eca8e39c9affcc9797a4e392aeaab4dfbfef85afe4cbd6c0190b8db6d8f2e2ebb1d1d3a2bacfe8fc9299f59c93ffd289e5cadfba80000b0206060202030c020a02050c0304030f04020202020411020102020204110200020202040290920584b202e1af01ddeb1efe933c828c30b59513b19e00018ee2c1d1f7e2e4e5b2c19bdfc1c3eee8b18e82e390b786da0b97ad16acdc47d107a1ff18ff951a92aa36e3a237f6b5000c98f0ecef8def878dc69995cca99087ef8baf95cd84d58402999869e3b83defbb3288bd28d7bc2ea29b08ab8602e0a500108b80e1ef8ae3cad3dfc08dd0b7e8e3d1a3abb4d6b695a80f978770aa8248f08801a5b6a522ce8f57c6e92ffeff01aa93fa000291c7c59693a7ffd98ed3cbfa90c580abfae0bda2fdbbfe0c0c020232aec6e4a9f6f1e7ebe8ae8a91b3f8ecfcbfb1d4839de5faf7d9a3fc0f0702020188b1ead6d486fbaaecbdd9c594e2bfaac9ddfce7e1ccd1cdfef9d993c00707020249a48fbdd88e8e8ac29d8a8289f29c9e8a83c0f4c18cc7f9bf908e8dec0f05020201e7cdcfbd96bcd0de9aa0f8ba87c487f98fc6dcb5c2abf6e7b9d2cce9fc080502022aec87c19aa79edfc8a1b7d5d29fa493d689e198e08da9daf7b2c48cac030302020cbfde80e0cc8ce391, 0x1d0d3c00707020225d3d5ce99c1dae69690facd928baeee93abb690b8b8f2c7fefcf6bccb908490b5c78009050202238fe1b884dfcfca8bcdedb3c3c684928a81fce693ae8abeceebebccc0c98aacb4800202020206999cb1e6eea698929b85bfebaec2c9b791c5b4ba91e4ca94b9f4b7dc859fe38f80070102022ab8bfc5d49ff1e3accff9eaf1cbc0f8c5ca93e6faee8ee3c5d187b39ce4bbcca8800700020203c5aacda7c585feb9c8f388b8fba6c39aa89e9a88faec9fb7c49ba7c1c9b0d2b2f6c0151501024996fafac0fba2b5e9fc8fc38c9bff8ce3c5d88df2c79ec7ed9edbafe2d29f9b80aa150e01021191dcb5a382aadd8ca6c4e3d1918cddd48b96f4decdfcec90b6c9d3e0d5dac49bc00f07010209f3f488e3a6e7b3d5e7d688ae8aace2b5a5e68de89b86b7f2c1f59b9bd7ced5dffc98070701021998cdcb97d4cc90a4f18fbdb48ce19498f0d3caf9bfeccc8e90d2c481a9848cc3b1b80c0501020ee893b6a692a2abfb95f9cf918185dfced8edcafbc3d6a3b2a6f880cffcc7d4d7e0020201023486a0f6eed0d3e8b3de9189a488d9b4d6ace2f189ecb5ceaf85fbbfa7c594cae3ba0700010202a1bdded0b9e6ff9ccbbbae8ffdc5b6828ae4d78c8ac894c2efe4f5b3c5a3b7ffdce00f07000207d3e2cd8dc3ecc483cde98fe7f4fed5e3949baa93f2e7e796c1ae91e5ce8ff9a5d280070700020f86cbdca1, 0x1c4e79ee8e5ae9ab3a2d8b79d92c9a7cd96aed38cd3c6d881aaee8db286f8bbf00001010f0402020202040c020302020204110200020202040c0201020202040d0608060204000a040e0408f28f14cad638e29f2d89da0101f183acd6f39abcffb883f2cb87dc8d8fe3eda5bafff6aac088faa3accc1581c934deca16b4fc3691fb010398e1c1f3e6e0f09e9fe7edfcd69cbbe18cd0f7a7d2fea6a29e94d4928c039d8604d39b5aac03b58820b5f73cbab234c5f718c1be000d81a7ebb5eaf9b2e6a1dff7a1ca9fc1f2dfa1c1d2a3c38ee3b1f9c0dbc008c5bb13cbf2209ad517fade15e39324c3ec42f9be51da95000596b7efdb98fdf5fff7bfe0a3faada1b3e2d285b9a5e2a7cd97bbc7afc03a889a0189b0c33aefe90187889818a48d4db8d630fa9c668ee30041b2a893908a9fc7fbb7c5fdf794bdbc8db5e0fb80d984cab0d39fc680161502020786f8aacddcbf96c4ddeb92d0988a8afdb19a908396e6fd9ae1919d85b7dcc485800f0f020221e68186daa59c95a394aec1ded5d9ddd6ec9f8b9dc1dcc4cfaac9ecd396d2d3e9a00c0c020203e9a4bfe087f790aaa582afaddfbdd3d8f085d5f3ab8ea4d0d982aa8ecdb1e098a00a0a02025dd1dd87adfd99d6ebbda9c880a29bffe0afac93b7e6acf59cfdefa0fcacb9c3800f0702020bc4f7cff6c0f8afa685f6b9e2eddcf3dc96b2f7cff6da9fa0faa8f5b68bdea0, 0x1f9a7fca8c6fedca7f6c3ede2d99cccaf84d2c7bef69ee5f9b8a80000020226dda5a6b9b2dbc6cebce3f1f492b3c4f8e1a7fad1f7f1ffa2daa28083bed6ebd2ddf182ed80e69ee7d7ecbfdbd7f29a151501023dd3f1b3e8c3badcc180e3d388bcabeb9a8fbffbd3b5d6af9ad4a4e5a6ebebd2fbcdc5d6b3e589c4a492af95d3a8f9c1c00707010201fb8a999bdae69faa86e6d2fb9a8a9ca2d59092ae93999ec394cacfc7c6aeb980e4e0b3e4e1f3fcecb28f8287e2989da6a8070301020db1f798ff8cc2e8c1afddf4f0b8d2f6b2bbe8adcbe6dbb39299e3b3b4ccb68ad4878de3f9fa89e9c7a0fca1fbe3b4a9a00202010212d4dfd9d0a5faa394cba8b0d18b99b6c485e1aff88dabc8b8e4fdf7dfa2d0f793d481d9c9bcbc88bedad0f6f3ce99d0f81515000232a687a8ecf0cba5b0a8d294b4d0f6849496d2f7efb0fbddceb1e7f0a79af8e4e2bbf7aee2f78dbb8cf083f19fbf8580120f00023bf0d592cbd9bfbf8e8880ff82d280f7d0c4bdd28dd4a7b083dca3a9d8b4e2a0c79098d5b887e0ebd2fdacdb89bebfe00f0f000206f5ec9dddd4da9083eec2dcd8f281ccabe1e689e0aabb96aedfa7a0b7af8bd8c0c093ceccdeaff79dd5cb8de2a295e0070700020596d2f0c3f6f6a1f0e0f487c9b084848dc8e68cff84c6f4e5fbefca80a4f6add9b5a395d9eee0d1969ebcd39a929c80a01922d3d3ea97b18d83e5deac, 0x1ebcc000ae1a592fb9cb49299c3d5abe795968fecf58eabc7a9f0f19784d9d998a7b4b5bfb78bd7a199a7f4d4d0b4800193a6be3f93cc0dceca01ab9d8161f8ff30afaf0de1bb01a089ec0015f9c0adb3e2ecd2e68588c2ecab8aafa49bf4f598b393b8cab0c4a1fdd7a2b891ccf7f3ceffdcf6838ce00f0f020226e98bf1ed95e8bc93b19997859998e3dfa585ae97bbe19781faddf79fc3a8c4dd97a49cd9ff84fcb8aca2f08caf8a9a0c0c020216e3fde8ae97b8b7d0b286ceefff97e69ccfadd7eaa5e3ece98fccddfe9ed3b492fbc89dcad4f0c2dce69fd7b1d2c6960907020275b1ac97a8c0eae1f9c5aedc8090848dcde6dbf5e2a8f1d4afc993be92ab9c89e397a3a5d7f7edc7aad7d5f5f48f93c80504020253f0fefefeafa2f486e4d8abddd7c7e282e5ca86eabf99f59c94858697b68c91deceb29eecfbffc88481dcd0e2b3f8820f03020201ab919af9df8eb392e383a9e9c699ce80c5faddcbbdc091be998abbb28db6aef8c1db83e590b384dd97f29eaeccac89ac030302020bebf6f3f1b6c986b0d196e4decccb9de1d595abfcc89dae88d0fc87d2e7a7efc5ef98e1bb9ff8f4b880c582dfeded838a040202020195b4d4aecaddbddffff9edd9d0e7c1bbe3fa9b9bdef6a499b0eaead99187e3bb979382f0eae7db9699f1d68dc8dfc68a0202020201c597e39aacdabbd6d7e3d8889cc3948dc6d7cfbdd8db, 0x1acdeb284dee8dec8a0feb1eab8b3e59ae7f80a000002098191c9c2c0f2b9d3a0a3b3f3d1f7c2a9d9fcc5ffacb39680000000021bc3edaca7caf3c6d78fffc28bc1f8e8c9b1929ac2b4e59eb01e0cf497a7aeca9c8886fc98f9e5dfb8d8b5f0a00033c4d0559abd46cdad68a39c0106c3f294ddeffde0f78198bca698a6fcc498e8faedc9d6e1a6b9cda796a7a8a5be8f82e483dfdfb798c4b7a7b014be954598e062babf31dff60103c1ad8ae4d782a8e4e798e8e9fee5d3f9f785aabce3958cc2cb90d9cea6e3ebe5c7f5becbf0fdd4b5d5ac88c02cb503d69e1ae51cac13fba12ae59a40bf8929d592003292d4cbc0ecaf88e2bcfcbbef8f83dae6d0af80e7b081bdfab2f8c7c887dde3a1f0dedbf6c9e1d6f7d5e6d3c034ad02abc10f92fa0b9cbb23b1c93b8cc018a5c83080bd0014a798f2acb0c8f8a8ae86fba6f69fefe4c9fde6b7d3b8f8f8fc8bca9db6eb808e8dd3e59cc3caefa783c6a6c040afb764e4a26497d0018791a12586d43de7fd46efa15fd0cc00048792c0cfd3dca19584ffb8fad8a28da5daf0c19bc48fcba5a6c0f1a6eec0f9998cbcfed7efe5ea96f9c3b1b027e0b373e7fe728ea529c4e208f6a036c5d7468ea418beeb0001ead4c2e792b9aeb99db1bfa4c2b3cbdd9885aa91e6a98889f8eddcdf91a69f90b196ec86ebc78ef0b0aa9be022ffe105d0a538d8b404be8627c5a510f2c703b3dd3b, 0x1e4f3d89abb858cd4e1c00a0002022ff2ffa4fd98e791c6eea1b1dfd9b1f0add895aeb3d2fc80090002020190f297e597d0bf81f7a48ecac3eedbb4c7a3b6fde8eb83c00e0e010213eff09df5f7fce3f3eddaf69bec95a9f9beebb2a883a5e6e00c0c010213cb9888f0c2aecb90aecbedabddf890ba83aaa588a8e3ba80120201022badf3bbaff9d0c8dea0e5c9fddad7c1a388dfcacba9ead980010101020fde98feb5f8b8fcddca8ba494f5e8bdbfbdedf3a3ebfdbea00e0001020297cfbafca18fa1f8b2e6f3b99fcdffb1bcc9b59cbf859f800d0001023aba82e6d5a3c7d0fb9c91f69f9ff1eea0f69999bbbe98e6c00a0001021fb6f09af18c9ca3f680ba87c4e9d5c794d589dbb5a7c0bac00000010238c9cba3c9b6a0ede6a28e8d9b8fc39498b982d3bed0a4f8e00e0d00020a90b18dbac5d2d1d5dae6c3b4adba9cd8ef9888c682eebfc80d0c00021af0d1dab4e39d97c3d7ac80e9f3d68c8a86bedbc2ec8fc4b00f08000206b3d4929acde1a8ada0d7fed884c0feb293fc87d2e7bbcfd0080800025083e3c0f9eeccd382b4fbc398d183e5aaf3fbd0e9b2eab202020002078cff9adca2cfe4f9f5dc92d1acf8ab9bb5e9cdc996a7f5800101000235e5b5ae86a3eaf795b79feeb2c2aeac9fb3bfdbb4ef90f9ee0e0000024bd4eaf387d4e3debffa918795acabadb3bfb5e8d2befbf9900d0000020fc9d6f1e38b93, 0x192ff80979eacc3cffdeefacea00c0b00021ec0efefbf86a18ab7f9fca1c2bdd1a69da0b89cc2c6978fc00c0100027ff4c9cdddeb94b693aea588d38c8abfe0aca7d8d8d1afb6800b0100021793bfd6e1b7c0a690f2c893ea98b08189a6d6d2d789dec7c00a01000220c180e2ecef9281cda9f8c3e0d2e3a5e7d9cfd4aecc808c8001010002018483b2c589cbb19dd68dfe96f2f795c6f78c9bfdf79bc795801e01a8d3d4a48da6ef91a7ddaad4b295af95cac000140200020202044fba0393b7448315af0d9bb21ff2cb409af22da0fd0015e5cbceaf87ff8bd88e90cfaabec285e5b7b4f38024db02d4ee02a89701eca12685ee42b0e10ccf8d28e49a000aa9d39bfcf8e0b9badc88e2e6cfead7bfacb89f804cdefc01899aa708ddf745c1e82380fd43f7d64cb525d3c7007ea2bcba8385dbefa1a3fec18ef6b5bede9380151502020ab3f9e18b95dea5fbe9c2d0f3fc91eded92ad92e3c1d9d4a0121202022adb9cb3b183eed0f9828cd0d89da0fde0d3b9dbf59698d3800e0e020205b8e4b1abb3c3cbc2fae1b1fbcd85aa99e49ddcafd2cfcef00c0c020227c4e4c4c1ae89dbb1f28cd0bae7e9bc9feba0ab9db5c0a5f0120202021bdefe82cfead2e5b0b0dbf1de89a2b2b0a7c09e9edcd19cc00101020238e5f4ae8bc2ada9ade4fcf8cc81d3ffb7e9b2babe90cff4800e0002024f9bd7a884d3abc497e79ae7bea4f3, 0x1f8ffc00c0102027be6fef39deaa0ddd5f1a286b2b7c0c8a2fcb2afa8a4c7a8800b01020211a590e9f28ed3e6818ff1eedcebf8c2adeca5d1f0f6a39280010102025b8b8fb7e2d8f484f8a2b8ff92d6a59af3adb9d589fe9b8080000002020cc2da8e8580cf9b9adad393e7a181d784f1c2f890f9c2e2801615010202d5a4d4f78af1b1a8b9abd8b7ccfab1f7bfc0e19df2cdd380141401020381f48b89c2a6e1cdd18982e0cceb8f9cf2d1b992fdd98d80140c0102019da5b1f89a9993dddbbcb6978982bf889caa95fdac81aa800c0c01022bca81f48de7d19cf6a6a3a181b7afaec1a0cfafd2a3a28ca00c0b010218c1af9fb1f7f4e290809483998ec5a6a1e0f6d8e3cec294800c0101020188a0b79ac0a6e3d48de9eebffbb6b9aef9a8a89cbf92f8fb800b0101021aafe2fcb7aba69fc5aee2bde190ada3c3f2b7b8def8ed94e0010101026ef789cec0a0b8999dcdcf8cdccec6ebe2dcd3c092ffe9ffa0000001020f83c8de98b29987d2d3b0b9b38fcfd2bbf7aeeaaffc98dba01616000244f2c5bc8ca5b39c8ada97ebe29ad7af9ce4e49088d2c0f21615000201e5d4c7ccc1f7bbeda598b6e8f0c4e7c6dcbeb5bdea9490b01414000203c0dcd5ffcfa6e29bebdb95d38f86c5f2bfafede094e8ffce0e0e00020294c393b7cfa4dd97ebd7dcbccdb0f1cfb698a3e48afbcdc00c0c000229b79ea4b18da491bcfca8b2, 0x10188d91c940280f404c3fd17f9d033a5c138d5f01cc6e10001ffaefdd3f389c680d8fcd5cbfe87f48ebbc7eee001dfbe08ff9b029aea0cf3f41fe49a2ea4bd1ec2df2f96d8003aafbcf4ebd7c1f786a0e5cdf1ceb8b491c3e2e033d7dd75fb886cdbe722feee18b8d23cdca539c0920c97e900179799fcbcd780859ccba7c4d580ae9ca3c4a01515020207a6b399cdbedb8a82c8a4b2f0d89ccbd4cde78ff1dab4a8801414020202ddc8aec5d780e6ecc5c5dde3f9889c87d0cb94c5f8e385e0140c020216abaae1dfd5c6b5c19198fbe9eec38d8eb0dbbae2fdece0800c0c02023de096f2eeacd2cfa382f597a9a3ebb1bcedf5fae09d] private def node2330:Certificate:=PackedParametricCertificateData.decode 11 data2330 private def node2331:Certificate:=.split node2292 node2330 private def node2332:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node2331 private def data2380:List Nat:=[ 0x1080f080a08080804040e020c000a000a06130202060006030803152c080400060312030101100601020202040702040202020314140e0e14080f080a0808080e06040402020a000a14140e0e14080f080a0808080e06040402020a000a161614140e0e0f080a0808080e06040402020a000a06130202060006030803152c080400060312030b020a02030400020406031002020202020314140e0e0f080a08080816061404080402020a000a14140e0e0f080a08080816061404080402020a000a14140e0e0f080a08080816061404080402020a000a060a08070c03120034043e03152c080400060312030b020a0203040002040603130400020206030111040002020603010f0402020206030e040a0601020306030e0e140a0b090f080a08080816040904040214000a0e0e140a0b090f080a08080816040904060414000a0e0e140a0b090f080a08080816040904060414000a06130202060006030803152c080400060312030b020a02030400020406031004070605080302040a030e0e130a11090b090f08140413040e021300090e0e130a11090b090f08140413040e021300090e0e130a11090b090f0814040b040e02130009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f0402020206030e040a06010203060301, 0x114140b0b110a0a0811050e040a011400080002000a14140b0b110a0a0811050e040a011400080002000a14140b0b110a0a0811050e040a011400080002000a06130204060202031504030202020314140e0e14080f080a0804040e0202020c000a000a14140e0e14080f080a08080804040e020c000a000a14140e0e14080f080a08080804040e020c000a000a061316090c0112000c041603152c08040006031203011414160c0b0b0a080e0408030c010a01080002000a1414160c0b0b110a0a080e0408030c01080002000a1414160c0b0b110a0a080e0408030c01080002000a061302020600060308031504030202020314140e0e14080f080a0804040e0202020c000a000a14140e0e14080f080a08080804040e020c000a000a14140e0e14] private def node2380:Certificate:=PackedParametricCertificateData.decode 11 data2380 private def data2411:List Nat:=[ 0x10e0e0102078f88bf89e895f5cdeb90e3b4bfb0110c010205c3b5888fadbfe78d86b3d58485840f0c010201c6f4c4dfd68d9de0bfe087cfc3e40a0a01025ee3b5a28e89f78b91c7b4f7e1901105010201b5c7f0d6fff5adbc96a4c19c9fac080501021ef7d0d69ab4b9a88b92909ebea6a00c01010206a3cadcec938fa79bffd086e4da940200010212efd08fd0f7c5a4eeb4bdb48ea0e000000102019fe39ef1e9aba7b9f9bfce8cd1d00e0e0002079897bada8aeabda3cfd29e96c4c0110c000205ee8bbf938bcfda98aec8e7cbfff00f0c000260bbb2c8c3ff8da4c3eff3aecd800a0a000201a3b5b69da1bfd4fa82ee8ac38b801105000202b0bdbc94b4e89ea1cbbae8ebed80080500021dd7c78dbb9795b1d7d7a3e2a0b8c00c01000206ca8ee4fccde2ccdfc1b4bf83f8c00800000201cabf9397a5d4fde5cf9b92cbc002000002128dd8d3c0eb87d386c6bd9dea93800000000201a390c5b18ea5f7f9dc8a9bdefce01e0ea3f9a7eda1ede000130204060202031504030202020314140e0a14080c080e030e020c0114000c0000000a14140e0a14080c080e0304030e020c01140000000a14140e0a14080c080e0304030e020c01140000000a06130206040102030203150c0504000203060301080206020202041106070605060102040804010d0205020302030204010e0c0b0806060302040c0309020002020204, 0x1c98b9ba5f2a00c01010203f9dbeae39582a6eca3eedab1b60c0001020586d5f899e2ac89bd9b98a695be080001023fb78bbfe3eae9d8afb9c2b7800100010202ebfc8bdefed2c8efe2c4a7cef00000010201c8f0d5c387bbc0a7b8b78fa6c00e0d000230f097ec8cfbcd81c4da82f2ce0c0c000203d889fac7c5f9f3eedaafdfbec60c08000227e480b0a5a6ced1e0b3d184da020200020d88ecbcd68f9cf88683fb91e00c01000203e5d6fdc8ffadf8b0b0f6c58fa80f00000236eee69f8ec1cca8ecb58ab8800c00000205bdd1e9b1b7ebd9e5bfd7c0b8aa0100000202bdff8dafbfffef8bf5a69899b000000002029ac3a6d1fe95f491ee84a1b0a01e04b2e9dff99bac00010b0205060202031104090402060306041102010202020411020002020204588003e9a10195d711c01689e636c7e338c2c6198b9b000cb1d09bf48ae6d788f00e0e020206f9b083dbd3faa2aec291808ad8d2110c020205c9f6f79ccfd8ccd5f4999cd687bc0f0c02020281b6e6eccaa8958280f9cdf092ce0a0a020246ac83e493c1cbc1d698f6b9f3dc1105020259d3dcadc9bbb4e4fc89f584a7c6080502021fd694acca968baafedfafdae39ce80c01020205ecc58ee3f2cdf0c7dfd4e6debed20800020222e79bccb1daf49dba93b2b7a2880200020213aa99a3eed7eba0bf91f9e793f4a8000002027ce0ec98aee9c8a3babaadcdf49c, 0x19ff7a095c00f0700023984c78680adc1b9f0a6dcdef091dfd1cd829485c9a7eb800c0700021782f1d6c7d59cc4d586ffaac6a5f997e6a2b0b7f4b495a68008070002019adda6c1d5d38bd4ea85b9e38cf8d1daa3869bd48cd6a1c00c01000209f4e7e0a683a599f6bebfa3dff5ce93c0938dc7b0b59caa800701000220c2e0918befc597bf8ffe8db1e7ae91ffecee8095cccfbac00101000203df97cafdcdf1fe97e7afd6eda8c89da3f78bf7bdeed8dc800a00000236afa8c5a6f1f3aff2fac2cfd1c8bbf3a4a091d1c3e6fb801e15d6deb9be8991ac8df290f7bec3aca3a880002aae4e9739c603ffff22e2aa42dfff2891de0882d1000584fb86b4a9b3adb00e0d020225c9e0e2bbd98bcee6e1bbf4de0c0c0202038699d7b2d5f5c9ced0ce93dfee0a0a020224ad87d086cabac894a7baede00c0802026aeddcd38bec91e993879ddcbe020202020f84c2d2a09a90fa86adaef1c00c01020204a997b3d1ed9bf5a7f39ea2e9840f00020279d29fb9a9a0e9d5efcb87f7c00c00020203d4bb8cd4d68aa6aa83d4eedee20100020202efe2ddedbce8ce99e88896e0f00000020201c190e0f0b6b6b586c3b980b2a00e0d01022de8998edadd93d3e8ebfcaafe0c0c010203b093c99d8ba0e3ee9db7b59d8a0a0a01020ecbb5f6e4d997d8958fb0eea00c08010249a9a8818081fabe86b6bb9984020201020cbb94899d88f7, 0x11107020202ceb280dd9e94b6ceb7a3a9aee998a1eb80f0d5a0eeb689a20f07020205b3f1b0958b96d2faf7a2a9eef081f8ca8780fcebbadc90880c0702020cc9b0978bfd86fdd6a5dfcaf9bff790f6c2dcc0f6daede2d2140402021095c3d9d198d6f69b96acb3fdb59dc68ca4abed8ab484b00c0102020b94acd3e0d6b1c3a7c88cf0b391dc89e2cbe0cbb9c4ccefe0070102021cc38bd2be998a808d96eac4f5a9928692b4ccebf088cb83d001010202048bedc7cae0d19699b291e7faaeb5b0ffb9b1d4c9f19ed0d00b0002022ed7c4f2c782aceaf2ee9efdf7abf6e99ca8c5afe7cd9a801414010214d4d59ba4e88fad9d8bd2bac3c4d1dde89e95d78fb986c00c0c010202fad7b0b8b0c0d2f690e6abfe9affde8486ff8dc4db8ffb800f07010204cbabe495f49f8deaebfcabf1b4c7da90839ec090a6ce80a00c07010210c9f6ca9385978afdcff39e8da4a890aeb8e2aa97b9b683e01402010238cdaea0acc99288f9d7bdfd9fa091d584bad788a4a39fe00c0101020bc68eb6a9bfe796caa0f59de3a687e6a39deae4a98e8eefa0070101021d9f89cda780dddfd9aeb488edbc86b2d2a8fbb9bcc195cae00101010204d5f3faa899e1b1dfea8cdbfaf7e58297b3dec3b084dbe1e01414000240d4c5a4a5809a82c1e0e682ea95cfc189d6eec5f986dd800c0c0002029dcbb094b697e3fdfff6a6dfc599e5ffedd1f9, 0x100020dfea3dde7cba9d380eee9a0ebf1e5e79aef8590ecb399a00e0e000208bec493dad9f5d2edcb8885f7cbe9b790dfbed29df9e7d2110c000204bbdccff6a2e0dcb1b7b9c39cdd8b93ff9addd593eef5b20f0c00020282a2dabaea97b59fdbabd2959db686bffbdeebdac690c80f0100020ec8b6ddeabf87ea9faddcd7cc9bc9dbc784febdf8bea3c00c01000202889fc8ed8af0a3f8d5f1dd82ccc8ace1b1bdbea0e0bde3d8010100022efaaae39598e5e381ba9da5e3e19b91e2ac96bfd6de80880e0000021c9cb58fe6d7efc9c4b5b196989ba5a69cafccfda1cdd0e8000000020ab2f4bcbf97a28180ed86d68da4bacadaf39785a4bffc981e099198f68d90d2a1aacd8dccac8bf69de8b0000b02060602020401110409040206030604080203060002030804110200020202040e02060201060306040d0608060204000a040e043cb601889353de0393991cd4f238a69134a6901798df001ded9c8e83828688ecc882fdc0d5d38bbab0958075c901c5844fb003f6fd1894822fb0f32494d93cbfea0006eba7bdf8ca8881a2fac2adc1e3a6aad8ffd2804cd18f0193b7b229c7f515b4e926e3f249a5db1596c209c9f00010fd9b93cfd288bfb4acd0c2c5f393cddbc6c00c0c020203b695d6a798e58dbaf8b1c6c3ab93c5baaef0d2b2d1c8c8d014090202288a94a0dedfe8cb9fe289b9e7a9eb9386e8dedae0f4a0f0, 0x1a4f48dcc801414020209938fb1e1c2fdf7f9d1ddb3c89282f4e6fbb289a9a1f9c00e0e020210dca9d8daa9a7bde6f6dfd6ebbda09ca4fdcfc6bcc5f5f4160c020204868fe19aa192add2e6dcfbbb88afa3f38293b0be95d6d0110c02020a9cdcedeaf9cbe1a29994ebffd4cae3dbade3fdb3c5e6f40c0c020206b9bdd295cdaefcd5f99adceeaceddbe6d7af94b4b4e4e00b0b020202d6ccc1f1c68d9ebf83e3b7a6ad89fcc6e4c2ff8cb19e900f0102020190b7f5a1f7e997c18fe0b2b1b59ee0e2f7dccec3da91800c010202029fb39ae1e4c9d88e87fbb9a4b792eabc96e3c381f9be8180010102021abf98c68c82b0cba7e6f7a3f09aee9683edfca1ade4a5c0000002020b92de82b39aaeafd1ebc3dbfbd9d0f895c8c2f9c2dbd7c0141401020da4cb9d93bef3ecaeefa0ec82d4ac86aab1f8dfdbd8f3900e0e01020ef3d8cfa7e3e6c8d0829aabb0cdc6a5aef893dcd4d0a3f8110c0102068db9bfc1cde7ca9fdbabd9fac3f8c8d2b2c7b2be8cc3980f0c010202cf9d9fb68d82d8ce8b8f83bf9584abcccaa1fbd29ccfe00c010102028adec8ddfcfcc0beeaa3e8fb99ec8be6fafdd6978782b6800101010237f1eaeceb84dce9fca2c7a6fc93c5f6f494a68fb9df81800e0001021ddbb6c5b89196a2ade6ffd1cbd294b5cd9ad1de8bd8d3e0000001021ef2c0fc8b9c96e2b9f9e698c6fdfbb294ed88ffd4eca01414, 0x18cc88fe1ffd8f486bbe6828592b2de99bbe7eb8fb79e9be0a7929f8391b3bbe9b7f41717000271faaacbc1d08e8bc7a19ef5ad9ce79086adba97c8dfe88a998ec0debdb4c38ccc8bb8171400023586e185d4c9c19796879df7e5eacea1ca9cb782d1caebdeb7bab5fdd989e7acacef800e0d00020abbdbcfe2cf8dc4c79aa3a9d7a2e5f3c7bfdcf4ff82e7848bc9a2c4ef9daa959a97c40c0c00021bc5b6aab8e7fddbbf95e0f0b493b6e6d0cea3aec381eaaae3ee85abdeefc990f8959c0d0100020183bfdabfb7c2a2dcddd893f5aeeb97e6e49c93cd97eab1b2c3e2b4dc9291d888a9d79c0101000230dcf6cb91efa8e0e2c6a1d58987d5a8b1c0e98e82c5e48cb8b6e2d5ffe6d1b9acada80d00000201c2e8bdddd6ddfda7e1c8c8b5a1dbabc3a8fcd5f89082df88f4d983f7b0badecb8dedf4000000020cacf0b4d6cdd498c7e4dfbb9fd486a2a9d885f1e9dab28ec58b93edbbbbca83efe0c81e0bfb8693e7f6a0e08af7c9bdd4baf9f0a7cadeedb59fe7c7ca85e7cce4001402000202020435be02e5c54e894dc3119c9024e7f73dd4962bc2e3000ee3c9ffa5f29dfeead9e0e79ce3d189bff8b0c011f902e4f201aead02c5e52294e63fc6970e97c93096e80006eab58fc189cfaa9fa4a3b1f6e68182a38ebba04f85dc0191dca716e1fe2a9fda26f7c34897aa0cdf9d13f5cd0002c4c39c98bd93f892ada2d59cf7, 0x10c020227cbb7c4d3ac989b99b1b0edd2b39cf3fbd0deeec29eac86b3f3d0a2efb2e1e9b3c6900b0b02022381efc7888ace9c84bae98aaeabef82bfaae4cefee691a9f4afaaffb5b3d8c6f7800d0a02020ce5fd82ddb2d188ec86c3b5e1d9cabadddefe95b8d796e0f3978397f8efdec98181880d0102020180caddcf8587e897a7c285a2e593f2d28cde93bebbe9bff382d69196f0a2afa1b0ad980101020244beab9ddfe2afb8d2c2c5de9fc3b4c79b9aaab6d9ecc3bfc8a5c591f5e6d58b8ee1f00d0002024ed581c1b0c2b8c8ebe785fdc9c5f0e4e0f2d787a3c9bcacca958ad1c8e79de6f9f1b01714010248f6f99bd38feeb0fe83f5b8caf8b4d592af9bf2d0bed2bd8cfc9bd889a8a6baaea5980c0c010220ebc5c9f0cfd0b9b5efdbebaeb4fab1b0d3c8e193fba2fd83f0d7f1fcadb7b2fb84c60d0a010215d8a4aea6f58ff1a9dcbdc991ecf3cdc2b5e3f1eecfddf8e6a8cfa7fcddecb78dbe880d09010202d0bd9fc89f99fad9baa8c4f2fb89ae9cc5af8a80c5e0c88eb7d395a3efb0d7b7b5d40d01010259e4d5d5d8d7818499c6f0b1d5d38491daf2dc9de1b0f8b0c0f0d1e4cc87bec0b9fbf801010102629b8c81f9a4e28ffcafd0c09ba6e1eb86bef4befec9f2b3abbe95f4ead3b39fb0a8e60e00010215ee89a2cd98918a93efa4d8ad9cbbd4aba0d2e9e8ed8c89f7d5f1dae4aeb29cd78bc40d000102018a, 0x12ba9ee16e5b55aa6d941fa8d0101d4cfe69fc3f1d2c595b98efcef8cc4e0ca868385dbdebfd6e589d0f0f462ff36d117de02d6fb108f8c22c38b3d8bb62e8dd70013c19ee4d580fec5dfe5cc948ba7b6ae97a3aeb9f1eecbf697ace3c986c19001a3cc1bed02e2e606dbfb20fad23fb6a509e4bb32a3ac000aa6b1ddb3c3fc9aba9d97c4e2dbadd698999bc197d69ce695f2a9b0ac8fb84bc4d4018f92d911afe439baf625add947808008b8a91cd1bb0002dbd6d283af9fa5eec5f6cac7c1c3aaceb0c0cccfa289c1ffd7efd099b029c1c4118f8b61b6cf43cef529d0c114819c588dc64683de000ce0b8f3f68cedd89fbbd6abcb819fda95dbc3f4abc795f597cae4cbf0a8171702022bc9d287d2a0b0e8be88dbb7bbbdadcef3f2dcea85b6d78ee79ffee4dcf6a787e2e590171602021baa93fbf1a8c2ebe081e9e68592f880fae4ebe89184e58abbd1cb88c8bbf8aaeceda01414020206b2dea2c8d1bb8dd5c0dbe2ee82ffa2ecaeefeeb2d1cdfb92f49b8891acc1a9fbd8d40c] private def node2411:Certificate:=PackedParametricCertificateData.decode 11 data2411 private def node2412:Certificate:=.split node2380 node2411 private def node2413:Certificate:=.positive 1 [(1,1),(1,8)] node2412 private def node2414:Certificate:=.split node2332 node2413 private def data2471:List Nat:=[ 0x10a0000000a161614140e0e0d080a08080816020e020a0101010a06130202060006030803152c080400060312030101100601020202040114140e0e0d08080816060e06040402020a0000000a161614140e0e0d0808081606040402020a0000000a161614140e0e0d080808160602020a01010100000a06130202060006030803152c080400060312030b020802030603060310020202020203161614140e0e0d080808160614040b0402020a010a161614140e0e0d080808160614040b0402020a010a161614140e0e0d080808160614040b0402020a010a060a08070c03120034043e03152c080400060312030b0c030a01020006041203130400020206030111040002020603010f0402020206030e040a06010203060316160e0e130a0b090d080a0808080904140013000a16160e0e130a0b090d080a0808080904140013000a16160e0e130a0b090d080a0808080904140013000a06130202060006030803152c080400060312030b02080203060306031004070605080302040a030e0e130a11090b090f08140413040e021300090e0e130a11090b090f08140413040e021300090e0e130a11090b090f0814040b040e02130009060a08070c03120034043e03152c080400060312030b0c030a010200060412031304000202060301110400020206030702040202060306030f0402020206030e040a06010203060301, 0x1160e0e0e140b0d0b170a160a0b0a0a08170701010a160e0e0e140b0b0b170a160a0b0a0a08170701010a160e0e0e140b0b0b170a160a0b0a0a08170701010a06140200020202041414160e0e0e0b0b110a0a0811010a0101010e000a1414160e0e0e0b0b110a0a0811010a0101010e000a14140e0e140b0b0b110a0a0811010a0101010e000a0616161414160e0e0e110a0a080a010101080000000a16161414160e0e0e110a0a080a010101080000000a16161414160e0e0e110a0a080a010101080000000a0601010a0403040202030604110201020202041102000202020414140b0b110a0a0811050e040a011400080002000a14140b0b110a0a0811050e040a011400080002000a14140b0b110a0a0811050e040a011400080002000a061302040602020315040302020203161614140e0e0d08080816020e0201010a0000000a161614140e0e0d08080816020e0201010a0000000a161614140e0e0d080a08080816020e020a0101010a061316090c0112000c041603152c08040006031203011414160c0b0b0a080e0408030c010a01080002000a1414160c0b0b110a0a080e0408030c01080002000a1414160c0b0b110a0a080e0408030c01080002000a0613020206000603080315040302020203161614140e0e0d08080816020e0201010a0000000a161614140e0e0d08080816020e020101] private def node2471:Certificate:=PackedParametricCertificateData.decode 11 data2471 private def data2493:List Nat:=[ 0x1d5d4edc6c1b2c39a010102020ddfbbe8f2c5f4f483afe98892bfc60d00020215c7c4efe5f4b8e482ae988abfe2dc080002020ec09ff994b5ca9ac9a9bed1c9e3b6000002020d9e9febf5d7f896a4ccaeaaf4f9c41414010201efa5ead4b4f18bd69ff6c9cbacb40e0e010203efd6e7fda2c2b8ccf189c88cec800a0a010218a8fcc9ffdf9dd4cfbb84c191cffc0d0801021d9db7a78de4e2aa8cc0b4f8a1a5f6080801024d9ae1a580e78cbee79599bec0f00c01010215b7de84d882c382dacf8fc9bf80c6010101020fafd9b08d8e89cfb9d194bb8dcdea0d00010218aea09da8a7e4aee194a988a6e8a4080001020dbde3bab690e5b9b3beebc6aa95ea000001020cbbeac6f9e9feacb7c6a3c687e4bc141400020294aec39ffba0c5a8d2e8b7e4f59c0e0e00020496b081efffc494cbf0f1d4b6c6a00a0a00021ae1afaadd98e8b889e29d85b4c0940d0800021d9697a1e3a1bee0f0cda1bcb0b7c20c01000214f8acf394c69abcff80e3fccbb9f2010100020fd9a2feb283b2b6fc81cebcf1a9ce0d00000218cec5a5f3e0dad4c3e8cda7daf9ec080000020cd0adefe1e9fac8c8a4a6a8dcba9e000000020cb5e1f6cef7d9e787e6d48eca8eb41e21b086dfb6b9d7f00001010a0403040202030604110201020202041102000202020407020402020204060603020206030804010e100a0e040603100309020002020204, 0x192a7cbf4f089cc0d08010212e0c4a2ffccb6f7c9f59df290d4b48d93f2dc0d01010201d1fff0afcdf7b3ffecbbbc96808894fbbbd8c80c01010201a0bf958dc8bed0d8a7b4989c9aadbdb9c694860801010211d6d3bca48bfddfd9b599aadbebb7e6dead9c0101010201ca94c5b79fb7c192a89dc898a8b4d5cec2fcbc0e00010218c5ccc99fd1ea9acae5ceaa8aa4b8cdb7a6a60e0e000216fda3fcc6c6daf8b0fea4f7a0dcfb96c193a00f0d00020ea3d994bf81b7bfef93e986eebda1e3d89c800d0d00020dd6e7c8e7b7b984fdad8385d1d9af9eaec5fc0d0c000201879981c19289b88cb4f086ac81c896aeb385c80b0b000204f189a9b6eb9580b0f7f389f39e82c6dce2e40d010002029a9c89a0accce3f2b28eb8ecfe8ad698b5d1880c010002018cdbe9c6c7a4c6bbd78ec5fff2d7f8f782f1c008010002089ad1dda5e7eccbc6bcd4ffe3d29c97a9e7fc0101000201d090ea94b482b1a78acfde99cd95feed96cffc1e01c580e8a8e5acb7a08fc7deb40035bf38eb1fa904e0be2a95e348caec109be90eb8930014c8b9fac3a584f7ab801414020201d9e4ee9ceda1d1efd6809cfce0cc0e0e020203eab5f69794a495be80f3f092c3e00a0a020215e49dd28285f2b6e8e4eca7faa8e40d0802021d8da691b5f7ece585c7c7bbb9eeaa0808020201a6808494c58c98f78ae895e7a7a00c01020218b8fda49ffef5, 0x1070700020491aad6ee8b839ac584e78ce683f4e1ccf4b4d0a6deeda7ea0e01000206dbdd83ed938298a9fff5eed4ba85d39cfcdcd1cfeba9b80a01000208b993fd9fab8f9092afdc9694ab90f999e5a1a1caa789c00101000207c18a928eadfa81959bac85fb81e987c1e6c28dddaa9a9c1e019adece94d4e0a4d6f28dd093c29faed6a400140200020202041a8644bb5d9803ced52091c640bbdd2dc0d008eb890001f88cf6c0e3889cb19beff4dedba047f7bb3191fc75d2d859adea28bcb61bbbad41d1f131acb30001fad2fcf1a8daf0d0daddfbaea00f0d02023ae7effcd0aef68baecff2d1afe4a5ee99d2b00d0c02022bb8f79ee4e0d8caeae6ddceb2e881c9f2fde00c0c02020eded1e3a6c9e9a0988c9f9b89b59ed3e8aecc0b0b020203afa2e6918d89acf5baee8aa5b9e0f9e6c5f40a0a020227d5a891d6a0dbaae6fde4e79ba197aa8693b80d01020201b193a9ecd8a9d7d7e5b3c5e8a2bffdccdbaea80c01020201b69ce8888bcaba91aeda9190b7c0cbda86ee88080102021eec92fcf0d0e6f2c39896a2a3c4a6ee8e92880101020201a9c9e5a190b3aab78b8ea7a38eb58d82b9cc9c000002020eaed183b689bcba88c7d4dfe7bae8f8bb94e40e0e010205ce98cdcad093fceda8f3a98bd180b0f9d9d20d0c01020199bdb7da88a4edc384fac1c994cb928fe0d0e20b0b010206d1d6cbd6abbac9e6edbae9, 0x1aba1fc1107020201909ef9ec95f6d98699d5a7fec385ced3a885cdddcaf3b80807020201a7fca8aab1fadcaea8a7f188a0fac3bc9d92eeaea984abe007070202029ceca5c2efecc3b7df8be7dac89ba3fec3adacea8bb1d4e60a01020234e5c7a9e7b7c893c89c99cbea9899e08488f0effdcca9b0010102020e8babeed9c89b9dbbaffdc9d9df9b9ff982a4e0e196da9c0e0e0102119fd3b7ec838afac58fcf9c8f89d8b88fdcc9d1d1dd87ea0b0b01020686a382a7d3a3dfa5f7dc9391c186999ddffb97cad1dac41707010202a9ac918dd1d099ae8fb6b9d18d95b1f4e8b2e6f0a2c4b1c00807010272989ef999a1d3ec8ff8fdbbc9fee7acdcab85ae9dcbd6900707010202fe8eebf79ee4bbf5efb9f994c1ace49e96c2f68bc7a0abda0a0101021bafc7f3dcd3cdddeba1cdbe8cb988daaebfc5d397db81ec0101010208adfbe7c1c1c798f7ddadfdaba9ad83f3b3e394d9a7dcf40e00010203d3c9b99685ddb3ddce8faecb97a7c6efe9dfeded80f1ea0e0e00020baea49af692fccaf7df93d3b3999097d4a9c3cbc7b3e18a0b0b000204c7f4aeafcfb0a7dafbcaa286a8a3bdc995b6e0cf85d8f81707000202d1f1dcb0ddefbef9b5b1cefe888ce8c5f3e188cbe0f4f4f80b07000208d99bf9a4a4e28bccebc3ceb2dfbbdbbb91e4faf4d098f40807000252fdaae0a093d5a2edae84ad8b9b86d8febd81acc49ab8e8, 0x185c0dcb2ea8da4d899b8e48dcde7bab5e3c39694c584f0c2aeefb4eba78ece94cf9588f6b691a4d6e7c00d01000207b5f0e8e685c4e2858fd58f9daaa18999a4ccb2bbd0d8add5f7cb90d992e7ad81af8996808ccae7f6e79ecce2df83e397edbbf98cbaccfcfe87ceb4f2b68edad7c8aef3b885c01e09eae2a5c7bcf2b594f5e5dfe68cf3d2d3e99b88b1d0b9a8b6b7b0da969deafdeaa5c4fcff819fc6e3f4ffc9a2acae8feaff83d9b7a7c9b8b89ddefcf3b5ebc0cedbcce000140200020202040b0205060202040a040304020203060408020306000203080411020002020204070201060002030804060602080002030a0403c43dba02c3fb06b3b91dd08c3b8bab359e8410da950001b4c3e5b88e8ba5d4d4b89e8788c3c3b39ca7b074ee02f0ff06bed2038cc415a9c62a87ab29e9bf3aa4ea00629cbbcae4d6e3c59687c2daf5e0fefeadf98a4885b6018ef1c93d83de14bed424cff948dbb21ba7a90af9c10002e2faea96cc958db99fd697a8babdf1d095981717020244fa84cbed93929dc9f8ec86f9b8a3b2dcacaad9e1d5d1f8160e020203c3ebaf83fab994a6c1d0b88fd4808cf180b5b6f2a7c9980e0e020202a5c4f2afd0f3ffbf8e96b79de1f0c1c4f7dc94eaf0b9b40b0b020201fcc7c6879f9dd2edf1e1dce2bdb0e0cda08f98c2c2a9b00a0a02020fcde9be8087fdd2d6dbd2acc2aaa9dc90dbc481fa, 0x1a59bf4b395b6dee3c6bba1f0d196900e0e010229e7a3de8096e2feb7a2dad49fab95f0e6d8bbc096c3a59dc8bff9dd84e4b7abd8b6e6cda0ddeaa4f8a4c7c387ddb694908c80c0cba2cac3d688ac81bbb5d9e7ecd095f7c29addb3880c0c0102029adfe190be94e9ba95a58e84a98ca6f5bdb8b1898fddcaa2b3e5cbcb98c9d6eaab8dedfbd8998aad8bdad4d9dba0e5a4a496cfdfb4e38cde83f4c5ccf2c8d7c1cf97b9eff9828fbc0b0b01021eb9cfc2efd19dbdb4ccf9a3e494becfcb8ae8fcbeacd7f29790bdbfc3ebc8d296d58bd299abcbc7b5b7a2b9e7f39be9c5fe9dc6f7cff0e3ad8aacf4b2ecb0f0a9c4bfe89498bde69c170a01020cb8dea2f8eabd96a4ea81edcbc0d0afaca080daeba9f09ce0e1a99195ffe0ace8e5b9b08ee2aecf9bbeebd5e6fcd1cdc0dbe99198a49fe099fdd1bf9fb5baf7b1bb839fa2a9868dacb01709010215de8197f2b79296b298dcfdeb87d2eae2eb8e94f7aafcc4c9cc9ea5cf8fced1c2d9b6dab3d192f3b59be2dde69acf9c94b592c5bf8f8be6aab8e8ffaba0d0f7ffcf86f4f2deed9eb0a00e0d0002068bb588a7ffdaf4c0d4dff3dcf7c6dab4c6e1d48f8da1b2d5b9e8efb1b4a6e5c6cdb1a0a98c91ea96c0dadffa8cf682a786fbe697c6ea87c99d93d5a2b78893b3d58fadd3be8bc00d07000224e89fd5d7858d829cc3f2b9caf189ba81d9a5b39ae1a6bacdd68c88f0a2, 0x19ffe9cd68bb39ce69d96b2ec91f0c7d4c197c0d89fd8d6ddfc9ac2c7d2d082a6888285f3c7aaf49dc4fb81d8c0e884f4d7a584b8beefa694b099d0a1caf1a80b0102020395ebe08ddb8bb69bfc9fddcffdbdb1ebc1d8a1fd96b7e096f098eee786aabafccabb9ecfbba3f7e7fabbb4a7e4cdf2c5e4ce909dd8e095e28ff3bdc8d88cacd7bdb498dcc4c9bba8170002021fa8c196db91d1b3e780c286b1c395e3becdb3c0ba91f086ebafca9cd2e2f48febde94c8988fed9ee3c5f7a9f1c5ae94e2bfa1fae382fda2e2dba9aaf3d0a993c2bbecd2d7f5948fd6d20e0002020afbc9b08281f6e6aa82c3b9a0bcaa9f94c99ed8ddcc94b9ade5bfcdafebccdf9f88bbf8d3e5f5d09289faffdb96efb0f4cae7b78af8cfe1f3bde9bac58cf4a9a3b987b4c598eb9eb80b00020208f0b9b085bf819ea696b6e2edeed0a3f087c9f8d3cd82f898e3cda6d3dd82f69bf3a48bd2d5b89d9be1bffefaa2c883cf88e9cbd7a99f828ca7d6dfcce7a09a9df5bfbce4c9b783b81515010206b5a799d8f69ccda9c6d59abffabeefcac6c8bfedfbacdad686ca8fad9baebdc9838a8882bea5aaefc496eed6edd584979aa3dfaacbc8d4d88f8cb3cabce2ceffd4b2c0a38896f8a8170e01020ed5ed85b481898886b49b87f6c58ef3d2c8efe3d084bf91e3dfa1dafcebfabc81e6c0e189fa91ceebf0e98fdb96f2cbd5c1a9bcf5b7bafeccc78d, 0x1b3a5e5ba9ab4f1c9c5bbd5ec95d59396e008b1d214e0b72fa6850e9baf0ab7e40ce5ab21d2d12cd7a9003889e4caa8e1dc88b2e6e2bcab98f49a9cd7d7d0d0d8b7cebe8fffc185d3f697e4b0918fb995ee9c8d89b2baf0d99a8ed9a088c3e9e8c7c7d6fcf386c790a29c8f99c5c0170f020218b6ceec8cfce5b4aeeaeafad6d8cbe1e4a2adefeed794b08991bedbfeed9fd4ecdfefb4acdbb690d4a993d799a7ad85bacfa084be8c99d8fde4bde6d78ac7e9b7d9bbc0aaf283d4d8c00e0a020205f0dfacb783abb585a0a893e9fcaab7f9c993cd85bccce19c87ddd78cdfdad3f39886e2e08bc0aac4ddd8ad97c8b9f580e7ddb5f8a7919adfabf095d4b0c3fba7dac9ada7b0f6bfd00d08020206d59bbaf2ef8595eaf39eeff4a7e6f698a485d38b9ad7dbc8acdcf6e4a999a398a1e68bdef687c5ec9bd8d7e39698c2d292c7f6958fca93a2aaacb1b090d0dbe785bce59dc8f7d0b0170402020595fb94aaddb6c7829fc8ecbd9dcabdf6aae2d6b5db95bfc1f0b79385c9dee6b7bac0b4b6d49cbfdf9991a3eba9f6e8c0bbfce5fdb0e6fd8499879baca8cfcfd5f09e8cfbe0faecc5ea170202022dcce8acbdf8c09fe4888199abfeffc08bc1f690dfaaf48aa2a3c0a1eeebdca8c085c181b3edabf18beba4cfefa0c0fde1c1bbd8b8d4a88ae0ba80d1b3bbe0f7b6a4e8bdb7fac3e2a6d00e0102020dffc7eee38edcb2de85, 0x1ca8e92c2ddc781bcc6aba8d6f4b5a1e18ce4cf86f2d8c3fed8a3e5fcbeccabb8e8eddc9fe286e1c992c6eba002b2899aff03f2faf78c06c2e898ba06cfbdb5bf01b2c8bb9802a3c19a9b03efe6bde302d5d2fc920002cfc0e8cfc28a82aecdc4ef8a81cc99f09180f8bfe4e59689ccb9d4bccb929bc8d8b2afd48cc98192f4f0ebc2be8984dcf3c4f5a3c8c5bec48ee6e3caae899c9097b001e0ace7fb01fe90dff205ccab8c80088be5c79a0199fcd69401c1dbd8af03dbf7b8db04e793d39500058f98fbceb9d7e1e6e5fc8fa4d1a3859cf2c7cece90a8f88bbeecb69ca3b39791fde9c4dac5a2f3f8b0feaee69eba90e793a2f5d1e99dba96b499feece0cdc0f5902fad975ed7863c908d08f4d60170d58bf1f2948cc280dce1e2a4a4f5e9abd9aad9c49eb1b9efde81b997c196f1f4f1bfb387ced9fad8e0b684cff7acc0c4bdfcc981e8abeaee8287e5b583e7c4cde9cfb79024ae01fb8805e18703d9e52197f23fe6dd05b5a531f7900051819ab8b4eed4bc84e4bcf9ffc4f9f18ec2f588d3decfeee8a0d0fe8ab8a3d3dbddaa9e98dbf9cafccde4a996dc84cbfceed7e7e4e1c5f2bd87a3debcabd585adb1d7cdc0428dfd0184c5ec579edf0ef1ee2083f040bd812dbcda07d2f10036c7f98afdd6ade7f595e4dec8dcfbceeb80a8ac81facaccd59e80b69abb8590b5d28691fef1fccef9c198babaacaef4efe0a9ad, 0x101cbbe95e102d4fcfac804dd93f5e004ecfce98501058ff5ffcc8df6b3d38bd6e98ceab5abcdfdcdaaa89292a0a1c78be4d290a6a39fe8f790b1a1c4ba96b8e4e88fdedee5d3eac9f08aca88f589c7f7f598a3f3c0dec8b0018bf6c7df01dea2b7a004b6feadc205d0b8d2840145d8c195a9fcc9bdd2c6c9c0d9acf8addfe7eeaee785f884998ec4f1a9b3d1dda5979caca5e2c5c8a5ad93ebe39ad7d1e8d9d3e5f287fa9ea6e2adae95aeeec5b00581a38412e2d9f10fedfa8f05eabc9e7bb5d3b2028abcecfd03e6d2cfec02f09de6cb0022aaa29fc4f1d9b2d3999aea9ea88486bf8bbfe1e7dcc9bcf7adee9be5d1c1f4d6f8ece3b8b9aed5b99ed0c491a6f0c383eda5a298b48af6b4e2a5d7aef2dac0a3b8c0029c92d60fa9b7ea2cfea6a11cf5cb8d0283a2cdea03f2bacff32aa8abe103868ad79a000ee8edf0ddeca4cd80e0f38db29bfeeac6f9b7d2ebe3bb] private def node2493:Certificate:=PackedParametricCertificateData.decode 11 data2493 private def node2494:Certificate:=.split node2471 node2493 private def data2546:List Nat:=[ 0x10002000a140f0e0e140a11090b0908080e040f000d0002000a140f0e0e140a11090b0908080e040f000d0002000a0613020206000603080315040302020203160e0e0e140d0b090808040402020b010b000a000a160e0e0e140d0b0908080e0202020b010b000a000a160e0e0e140d0b0908080e0202020b010b000a000a06130202060006030803152c080400060312030101110609060606010a040a04010e0e140d0e0b0b090d0808080b010d000b000a000a160e0e0e140d0b09080816020e020b010b000a000a160e0e0e140d0b09080816020e020b010b000a000a06130202060006030803152c08040006031203150403020202031002020202020311120908061c041e041e0411040002020603010f0402020206030e040a0601020306031616140b0e0b140a14090e090a080808090411010a1616140b0e0b140a0e090a0808080904110104010a1616140d140b0e0b140a0e090a080904110104010a06130202060006030803152c080400060312031504030202020310020202020203140b0e0b140a14090e090d0814041602110109140d140b0e0b140a14090e090d081602110109140b0e0b140a14090e090d081404160211010906130803060018031a03152c080400060312030b0c030a01020006041203130400020206030111040002020603110402020202030f0402020206030e040a06010203060301, 0x11816180e0e0e180b170b140b140a17070a0701010a1816180e0e0e180b170b140b140a17070a0701010a17171816180e170e0e0e180b140b140a0a0701010a060d080a08030600200422041811160e140d140b0e0b140a11010b010a0101010a1811160e140d140b0e0b140a11010b010a0101010a1811160e140d140b0e0b140a11010b010a0101010a06140f160e140d0b090808140201010f000c000a000a140f160e140d0b090808140201010f000c000a000a160e0e0e140d0b090808140201010f000c000a000a0601010a04030402020306040a02070201080002040a0411020002020204140f0e0e140a11090b0908080e040f000d0002000a140f0e0e140a11090b0908080e040f000d0002000a140f0e0e140a11090b0908080e040f000d0002000a061302040602020315040302020203160e0e0e140d0b09080816020e020b010b000a000a160e0e0e140d0b0908080e0202020b010b000a000a160e0e0e140d0b0908080e0202020b010b000a000a061316090c0112000c0416031504030202020301140f0e0e140a11090b0908080e040f000d] private def node2546:Certificate:=PackedParametricCertificateData.decode 11 data2546 private def data2567:List Nat:=[ 0x185d083a6d5e7d3f094ed86abb4d8ada0170e00020380b6a589acedeb91e2eea0808fdce9e3e291d3e390948ab0140d00022994e1d0e08495fafac8b6beb084adb994d28cc69cc3fed8170b00022d998ff8cff194af8aa0f7dfecafbba6c8f3dadf8988d0b7f0140b0002019ccb8ef1c9f8c685da95b284d8faca8adcd7dab386d2bdc80e0a000206a8f98fc3c099a6fedeadaabcecf4fafaa7dbbbb2ed84c6d00b0a000227e7e7ace5e4f491d68cb2e0b9a1c799a897d2cbc6a195b9d0070700020aabebb6e2c081e79ac593f0dae09fb1c89d8ab0cca491c8d01e0793bfcea4deb793f8b282dceed882c1a9c8000d080a08030600200422040b0205060202040a04030402020306040702030601040004040e0411020002020204070201060002030804060602080002030a04170e0e0e170b140b0e0a0b0a170708070a0101010a170e0e0e170b140b0e0a0b0a170708070a0101010a170e0e0e170b140b0e0a0b0a170708070a0101010a060d080a0803060020042204140f160e0e0e140d0b0a0b090a04110101010a000a140f160e140d0b0a0b090a041601110101010a000a140f160e140d0b0a0b090a041601110101010a000a060a0209020404030204010a040304020203060407020602010400020408041102000202020407020402020204060603020206030804010e180b0e060e040204180309020002020204, 0x1fabcae9d8984be90b2ae0e0e020202baeab885f2b2cae2a79582dcf2fdb3c3f981d2fae2a2cc80140d02024991f0c3a7a88183a68daf81c0e580ada7b7a08be6e69be8170b02022488e3febff0dda19ee0addbcaf7e9e29f93c193e6debca4fe140b020202a9b2b3aebeddf5bdeee694faafc5a289c7aec7b8e8f888b80b0a0202259ee6b3a1f3d8a2d0c7fdee8bf4a6c99690eb8bffa5ffb2800a0a020205ad97b0aab1efd88acbb493eba09ca7d59087e49cc9d8dd900a07020204fab7b1f7c6e0f8c0d0b5edaf80f4c5b38eb68ef8ed948ae00a0102020181cad0efecd4a6ece7f0cfc695d0adabf3a5f091e3fdd5e01716010202b9f4b588a4a6c7b3ffd2b692e7ff85dcbfb6aff8959786a00e0e010201a1aeb9d0b9abdac2bae9c49fd5b5e884e3bbf78ac082df80140d01022bbac8c488db80da90a1ebb4a8b3eaadb6c784b8d8b0a2e8170b010227cbece980c0afaad9abe4daaeae8e829f9fb9e5a192d6a1e0140b010201bb89a9a9bc8fc795a89bd09ba9fc83d8c8d1ddbfff8cc9b80e0a010257c1a6acd2abe1bd89a7f6b8e6fbf6e6ddfa8b82afd49fa00b0a010229bdc5e4aaffd9f9f7ee8bfbdfcb9f87f7a5e3f6afa2a7acb00a0a010209e2fae2a5868bca8280b1a8e7c2b4c792fd819ec29ea195e00701010275b6a2f0a3dd9ef092bdc7d4dbafc198deab9bee9892bf901716000201d6aad386fbdfa38f, 0x101b0ea0396dd0c83e30297ef02828a058289579e8a1ac2d1000ebff48ee9c3e985b0c19dbfaeb781c49ec7b2f00386c207bc890de19c07bcf152a601c38114cafa54f2b60003dbabb6c8cef7afb4f298a880e593ba95c8d4c026a3fd48dd9204868e099f33ca8068d6d9088dad01abb10023eedfdf87aa8cc2b1fc9fcdf5a6cd848795e01711020231b0bdb7d4a89e96d29ea6f69ebdf9e89d968aba8cb2fb9c170f020203cea4c5dfbec5dacab58183f0a3f7] private def node2567:Certificate:=PackedParametricCertificateData.decode 11 data2567 private def node2568:Certificate:=.split node2546 node2567 private def node2569:Certificate:=.split node2494 node2568 private def node2570:Certificate:=.negative 1 [(1,0),(1,8)] node2569 private def node2571:Certificate:=.split node2414 node2570 private def data2625:List Nat:=[ 0x1110c0e09080809060e010c010a010a110e160c110c14090e09080809060e010d010a010a06130202060006030803152c0804000603120301011006010202020401160e110c0e0b110a0e090a0908080e010a0100000a160e110c0e0b110a0e090a090f0808080e010a010a160e110e110c160a110a0e0908080e010d010a010a06130202060006030803152c08040006031203150403020202030a08070a0306020c041203160e110c0e0b110a0e090f0808080b040e010a010a160e110c0e0b110a0e090f0808080b040e010a010a160e110e110c160a110a0e0908080e010d010a010a060a08070c03120034043e03152c0804000603120315040302020203130400020206030111040002020603010f0402020206030e040a060102030603110f160e110c0b0908080904140113010e0108010a110f160e110e110a0b090808090413010e0108010a110f160e110e110a0b090808090413010e0108010a06130202060006030803152c08040006031203150403020202031004070605080302040a03110e0e0b16090b090f080b040e0113000f0009110e0e0b110a16090b090f080b0413000f0009110e0e0b110a16090b090f080b0413000f0009060a08070c03120034043e03152c0804000603120315040302020203130400020206030111040002020603110402020202030f0402020206030e040a06010203060301, 0x115151814180e170e0b0b170a160a1708170715000a15151814180e170e180b170a160a17070815151814180e170e170a160a17070707080614020002020204150f180e160e140b0e0b160a0a010801010100000a150f180e150e140b0e0b160a0a010801010100000a150f180e160e140b0e0b160a0a010801010100000a06150f180e160e140b0e0b160a0b020a01080101000a150f180e150e140b0e0b160a0b020a01080101000a150f180e160e150e140b160a0b020a01080101000a0601010c020b0a030a00080412041102010202020411020002020204150f160e140b0e0b0b080f0505020e01080102010a150f160e150e0e0b0b080f0505020e01080102010a150f160e0e0b0b080f0508050b020e01080102010a060d020a0204060002040403150403020202030c020b0a030a0008041204150f160e140b0e0b0b080f0505020e01080102010a150f160e140b0e0b0b080f0505020e01080102010a150f160e0e0b0b080f0508050b020e01080102010a0613020206000603080315040302020203110e160d110d160c0e09080809060e010c010a010a160e110e160c] private def node2625:Certificate:=PackedParametricCertificateData.decode 11 data2625 private def data2647:List Nat:=[ 0x198c2aaacdee4f0dc0701010202a985e688caf6b5b3b69c8ee2a6cded81dc1717000261e9e698f699f5c1dfa9889d96a0f886efd8151500023381fdecf5c2d583859bf597d7e5ccfaae170e000254a68ce193d1bde5b2bcbadac1e3daa0c2f8170b000205a3d7ce81cdd7fd9798c1d3d096fcd0bae00e0a00024ae695b6e3adf5878ccfd2f69a8da59ce2980b0a000206c0d6f0f8b6ceafc2cee5d0f4c6e1fbc6c017080002038bfeebc680d997abd9a79b9daaaee0f3801b1aa298bcbce6e2b78fae8200140200020202040c020a02050c0304040c020b0a030a00080412040802030600020308041102000202020407020106000203080408060706020e00080416041515170e0b0b0e0a0b0a0a0a170708070a0115000a1515170e0e0a0b0a1707080707070a01081515170e170b0e0a0b0a080707070a01080614020002020204160e160d140b0e0b0b0b0e0a0f010e010c0100000a160e160c140b0e0b0b0b0e0a0f010e010c0100000a160e160c140b0e0b0b0b0e0a0f010d010c0100000a06160e160d140b0e0b0e0a0f010e010c01080000000a160e160c140b0e0b0e0a0f010e010c01080000000a160e160c140b0e0b0b0b0e0a0d010c01080000000a0601010c020b0a030a0008041204110201020202041102000202020407020402020204060603020206030804010e1c0a1406060506041c0309020002020204, 0x101d1ef01d2ae05bcbb02f0b203bfc103bfc246c0d436c0bf0022ebb5f0ef8895e6eaa9af9dbc04fca204fbef4b89cd5b95e405cadb05cadc4acbf60593d60078f0a9b0a2f1f2b3d68ef5e0171702025bc7a3e799b6e2e6a7bfa6ca8f84c8deb2f8151502024db4e8bcc194e4babaa49fa19e93a7a79a171402020ad98db3c1f0c9a9bc9cace9fa858ea999c4170e020260c1aee9dcc18da8b6c2cdfdc1cca381c994150c020201f9f499eccf8bbae1d48582b3aab886d00b0b020244e4d4a1d29dbdebccdb8afd9f8ef6e40e0a020248a3d0d8c192a184f1cbeed7f1cd8ca993ce0b0a02020792afc8909cd9fac091f990b6e4da8ed7821708020204ada3f1aae4e1bbbcb19197ac9fb8a498e41515010217fec5d989e998c1fcac989dcb89b9a79a170e010242dddca9c68a93d9a5dcd9bc8ef2ea95cad4150c01020fa1f2f0c1e3b9ebb08de7efd5b7b584170b01021fc8ada1f18ecba9aaa4efeec9c49cf4c1ac0e0a01024e93c8b9e0feadd9f9ed98f0a6cba4f0fc880b0a010201bf8cc89dbc938899b7af909280fc81a7941708010205ba82cfaad090af86c6aeedeef4ce88bfe8070701025fba9583d5a888d596b0] private def node2647:Certificate:=PackedParametricCertificateData.decode 11 data2647 private def node2648:Certificate:=.split node2625 node2647 private def node2649:Certificate:=.positive 1 [(1,2),(6,12)] node2648 private def node2650:Certificate:=.negative 1 [(1,0),(1,8)] node2649 private def node2651:Certificate:=.negative 1 [(1,0),(1,7)] node2650 private def node2652:Certificate:=.split node2571 node2651 private def node2653:Certificate:=.negative 1 [(1,0),(2,2)] node2652 private def node2654:Certificate:=.negative 1 [(1,1),(1,4)] node2653 private def node2655:Certificate:=.negative 1 [(1,0),(1,4)] node2654 private def node2656:Certificate:=.split node2251 node2655 private def node2657:Certificate:=.split node1960 node2656 private def data2668:List Nat:=[ 0x1161616141111140e190a160a0b0a1909190009161616141111140e190a160a0b0a1909190009161616141111140e190a160a0b0a1909190009060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030c0a050203020006040a03110400020206031008080607060212041a030f040202020603102c0d020206011204120309020002020203] private def node2668:Certificate:=PackedParametricCertificateData.decode 11 data2668 private def data2732:List Nat:=[ 0x102018886e6b9c1a89685c6e6c0190902022480ceebd7db9bc1e7dee5e1cc1609020227c3abbf8ed08a83dfe9800a0902020ab4868e97bf86928ec9a01908020216d09ef3c4c4a287c8caa9bf94080802020c96fc9fb4cc868599e5f01616010202a2fd84b19f86ac89f6f994b2161401020383999a85f2b2b0babd84a8f2140a01020297c6ba90dea2c4f4ced8bcf0110a010208efeb839fd083fec4bee3b0190901021e9bc8ffa1eb879dcab5a0cc88160901027febdcffb8a2caaeb8e3e9d80a0901021aceb0eaa6caa4a5d4e580c0190801020ffcf2bbc48fc7e5e6cdd2cec80808010223bfb2ae8feca09df9f3d8901900010278e89ead8bd6dec7d48ffb981616000202c68bcdbf84edb2c9a99b89ac161400020284dabab0f992c5bdc287a9e4140a000204ae8e88e8e8ca9195e2f2bdb0110a000211ddf3bdb2ed9eb3b4aec5b01909000218d9c9cbb3ffe2cac7e8b5ceb01609000201fa91b0e8d2c8ada5ca87e4d00a0900023596ecb5a48d83e097edb1b0190800020982a9dbd2bfe18a83d6c487f00808000246c099e2ddca8cbdaaf398d81900000201e2c092efe7c48cd5dcb8c3a01e02ca9ffd9ff8000a08070c03120034043e03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206031008080607060212041a030f0401020002030803100c000202020301, 0x1b1c4eab8d881c0801409010206af8fe6cde3f9c3d684eee18aeaf5900a09010202ebf0c094c7f1ebd5e3bfacd086c8c009090102048ae093bfcfc2d791d88994a49d94801408010203c6a9a7ffeceebdcdd0f3eadac2a390080801020c838395ecf2cdb5fbcca1a0b2eca8800807010203a1a2d5fe9fddedc488ebfa858699c01401010201a3c7bcd8978fca92b9dccaaffcf6801616000204adf380d3afdf93f2eec7828e9cc098161400020fbcb2d6da809eb1dde288bbb1e4d0b81111000236d7faf087a4fff291c2e1b3f7e5801409000203cad38299cc8dd9ac9c87efa382f9a00a090002058ce1b1a0f6b3c69da7e6c5c0defa800909000235d492a89dc1a2f7f792eaceb1f6801408000201b9eeb6e7f384b5c19aeefdf8e8f2a00808000209f7c9ec8283af97dd94f19cb5e4be80080700020683f1cdbfbcbad281ffdacca696e6801401000202c0d1f8a7f285a4c6f88bf4d6f68d801e0885c1b6ccc2b4c080000a08070c03120034043e03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206030c0200020202030f040c0609020006040a030173e0b77ddf8b0cbce406a09934c4ae39cbc80c88bf068f9a0005cf96d795d2e81616020201d8d190bceebe8ee597cdc7921614020204baff92eea093c5e4facb95e2111102020fa4c0b49fdff4a4c7adb0140a02, 0x1000206d3eb97fe89dfbdc3cdc6fbf1fcd194b9e2a8b2d7b6ca190f0002049394a5df9bcafbd6a2c9eab8dfb3b7ad86899a87f4f0190a0002059ba0f0b3e3c3df82f0cece92bcdc87afeb898dd0e8b01908000217cb87a0bea8b689cdc5bae29ab0d5c69892b697d1b8d016080002019ebcbdf792f3b1f59fb79bc7adb1d7b1a3908088a880140700020892e488fdd5b9a8bfe59afcc6d9acc4dfc0a9b4d6a7801b04edd6d7f98a8f87f4b2c1f884be8d800008080610030a0018041e03150c050400020306030c020b0a030a0008041203130400020206030c020202020203110400020206030c020002020203012ea0a816da8d3d866efa30a19015b18516dbe10a9ef40031f3e5f8f98de6af838029c6de70e3f0568ece2adae128f81caeeb1bd68b0dbcf8006c8dfe9e93efb4acc0801616020201fec1d4fbd1aad59d88b5cac5fdacbe1614020214f2b38bc0c2838c9d9f9bcbff86eac6111102022fdbcf988693c78faba093dec0801409020206d0f6828ad4cba5f6d9d9a5f6a2828809090202048bb6a9e9bde5f2f382dffec1b6b9c0140802020987c6cbc3e9b6b9ef95f885c6f4ea88080802020feba8d3fefbc0d5eae5a3d7f8ed93c0140102024c85c38cf794aaac9691fec580801616010203eeade3f8c4fdcbb999d3c89dc3bbdc1614010210ff9fc08bbcfc9b9cc1da8ce3bdacec111101021bd3e6978daef2, 0x1c078db8c798a8f0b94ca02abfc79b2e379b2e40065bc92a3fce4a2f6dc9ed3a0fdb082e01616020201c0deaac99deae28bba8aa7cbc1c2c1c89df2c4d5f4a01614020209dbf9d3f6c1a3ab91db9e9acfd9d4f9a3ff88f9b4dee01111020202e082b6d8a180e7b3f8dfd3fd9a85a29e9bddbcc019090202088ba0dbbb99e3aad8e7c5fbaa8ac18b9a88d0a4cdebc01908020224dafaaf88eb9cac99deac8493ae8afce2bcdcd4c2c2c0140702020294b5a5a1ddb1a7bdbf8ee9dbc7a3dbc7d8a8e4ef801104020206d3f9b8fbfebfa9fbcad28c84cee2f6ac84b1ff80040402020397e591cde7f5e2ecfdc5f9c7989f9192f2d1b5c01616010203a5e9ddd09b8b97ce8ab6fda2fbf58e91f5e0d882dda416140102088289f2da8995e7f6a4f9d5f4e78ab6bf8a8682eafed4190f010250fbaaa1c1cddbf6faa6e19e9bdd9686d0dfc8bff3a0190a010208fafebbc381b49bc0a9b1fa87a4d1c3c698e1f88e99e0190801021aa2f1bfde95d484a0fdfbdbcbe3dfe4d68ee6e485b6a0160801024fa6f4f4b3cab3faaabfb8f9ffb1a784d4f691f1b4c01407010204a7f1d3939e98fe83808eb29999d5ffcec9d580eee1800707010210aeefcdf8cfe3c3d7e9ffca82d9f2e4ce8eafadf280070401021497c088c28d8bb0b9bfd7d0ffb589bff19fa7d5801616000203d887b2d09efbe79881badfd8ecf7e8829eb7e8baafb21614, 0x10f060806130108010201040009161616140f060806130108010201040008061616161416080f060806130111000f000800091616161416080f0608061301080111000f00091616161416080f0608061301080111000f000906011504030202020310040c040b04020e040e031002020202020411060f0601080308040116161614190f1908040414010801090001000916161614190f1908040414010801090001000916161614190f190804041401010007061614190f1908160404040e031401030111000916161614190f190816040e041401030108000916161614190f19081604040414010706011510040202060314080c060b06030a0412031614190f190a190816040e040404140111000916161614190f1908160408040404140108000916161614190f1908160414010606180402060004030603150403020202030c020b0a030a00080412030116161614190a1908190716070404140107000916161614190a19081907160714010716161614190f190a190814010606181003060010031203150403020202030c020b0a030a00080412031304000202060301110400020206030173868e3ceadf03d8d603e09924a3a5168cb303e5cd03e5ce0027a7bf81d0daf5a79e8ea390dec2859b8039c3da3fffc808d7c908e092238cb406bfbe08ed9808ed97003de6cca8d48ef9f7a2d58df597c6999dc006ffc501d4, 0x116161614170f160e11060f060a06060101010916161614170f160e11060f060a06060101010916161614170f11060f060a06060101010806130803060018031a041616161411060a0608061401020109000600091616161411060a0608061401020109000600091616161411060a06080614010201060008061302040602020401141c10140c060b06041c0310020106000203080411020002020204161616140f0608060804130108010201040009161616141608] private def node2732:Certificate:=PackedParametricCertificateData.decode 11 data2732 private def node2733:Certificate:=.split node2668 node2732 private def node2734:Certificate:=.positive 1 [(1,0),(2,13)] node2733 private def node2735:Certificate:=.positive 9 [(8,0),(3,4),(8,12)] node2734 private def node2736:Certificate:=.positive 4 [(3,0),(3,2),(2,11)] node2735 private def node2737:Certificate:=.positive 7 [(5,0),(4,7),(6,9)] node2736 private def node2738:Certificate:=.positive 3 [(1,1),(6,2),(2,8)] node2737 private def node2739:Certificate:=.positive 3 [(1,0),(2,7)] node2738 private def data2750:List Nat:=[ 0x116141611140e110e190a0b0a19091102190009161416111111140e190a0b0a19091109190009161416111111140e190a0b0a19091109190009060a08070c03120034043e03152c080400060312030c020b0a030a0008041203130400020206030b060502020203110400020206031008080607060212041a030f040202020603102408020206011004100309020002020203] private def node2750:Certificate:=PackedParametricCertificateData.decode 11 data2750 private def data2765:List Nat:=[ 0x11616130a0f0a0b091604140409040a02040108000a1616130a0f0a0b0916041404090406040a0208000a1616130a0f0a0b091404090406040a02040108000a060a0407060224001a042803150c050400020306030c020b0a030a00080412030c02030202020316111411140a190911090a0909080808190111010a1611140a130a11090a09090808041901110108000a1611140a130a11090a09090808041901110108000a060a08070c03120034043e03150c050400020306030c020b0a030a00080412031304000202060301110400020206031008080607060212041a030f0401020002030803100c0002020203] private def node2765:Certificate:=PackedParametricCertificateData.decode 10 data2765 private def data2823:List Nat:=[ 0x116111411110e0a090909190811021400130008000a06180402060004030603150403020202030c020b0a030a0008041203010c020202020204110400020206030116111411110e0a090909190809080807070604040a16111411110e0a091908090814070807070607020a16111411110e0a091908090814070807070611020a0608020604020a0006040a03150c050400020306030c020b0a030a00080412030c02030202020316111411110e0a090909190809081407080707060a16111411110e0a091908090814070807070607020a16111411110e0a091908090814070807070611020a0608080610030a0018041e03150c050400020306030c020b0a030a00080412031304000202060301110400020206030c02000202020301161411110a0a1309080816040e041401080108000a16141111140e140b0a0a080816040e04140108000a16141111140e0a0a130908080e041401110108000a060a0407060224001a042803150c050400020306030c020b0a030a00080412030c02030202020316141611141113090a09080808070804140111010a161416110a0a13090a09080808071106080414010a161411110a0a13090a09080808070804140111010a060a08070c03120034043e03150c050400020306030c020b0a030a00080412031304000202060301110400020206030c0200020202030b02000202020301, 0x106060101010a16111411170e110e0b0b11080a060806060101010a16111411170e110e0b0b11080a060806060101010a06130803060018031a041616141109090a060806110214010201010109000a1616141109090a060806110214010201010109000a1616141109090a060806110214010201010109000a061302040602020401141c10140c060b06041c031002010600020308040c040302010203040416161411110e090911080a0608061401080102010a16161411110e090911080a0608061401080102010a16161411110e090911080a0608061401080102010a0616161411110e090911080a0608061401020108000a16161411110e090911080a0608061401020108000a16161411110e090911080a0608061401020108000a06011504030202020310040c040b04020e040e03100202020202040c04030201020304040116111411110e0a090909190811081401080106010a16111411110e0a090909190811081401080102010a16111411110e0a090909190811081401080102010a0616111411110e0a090909190811081400080006000a16111411110e0a090909190811081400130008000a16111411110e0a090909190811021400130008000a06011510040202060314080c060b06030a04120316111411110e0a090909190811081400080006000a16111411110e0a090909190811081400130008000a, 0x116111411170e110e0b0b11080a0608] private def node2823:Certificate:=PackedParametricCertificateData.decode 10 data2823 private def node2824:Certificate:=.split node2765 node2823 private def node2825:Certificate:=.split node2750 node2824 private def node2826:Certificate:=.positive 1 [(1,0),(2,13)] node2825 private def node2827:Certificate:=.positive 3 [(2,0),(3,3),(2,12)] node2826 private def node2828:Certificate:=.positive 4 [(3,0),(3,2),(2,11)] node2827 private def node2829:Certificate:=.positive 7 [(5,0),(4,7),(6,9)] node2828 private def node2830:Certificate:=.positive 1 [(1,0),(2,2)] node2829 private def data2846:List Nat:=[ 0x10b090a08080813040f040e04040219010b0108000a0e0e0b090a08080813040f040e0404020b0108000a0e0e0b090a08080813040f040e0404020b0108000a060a0407060224001a042803152c080400060312030c020b0a030a00080412030b0207020604030403140e100e100c190a0b0a190919041001190009100f140e100b0b0a19090b09100419001000091311140e140b100b19090b0910021900100009060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060301110400020206031008080607060212041a030f040202020603102408020206011004100309020002020203] private def node2846:Certificate:=PackedParametricCertificateData.decode 11 data2846 private def data2860:List Nat:=[ 0x10e0e140a0b090808140413040a0204020b0108000a0e0e140a0b090808140413040a0204020b0108000a0e0e140a0b09080813040f040a0204020b0108000a060b0c0808070a0006040c03150c0504000203060314080c060b06030a0412030e0e140a0b090808140413040a0204020b0108000a0e0e140a0b090808140413040a0204020b0108000a0e0e140a0b09080813040f040a0204020b0108000a060a0407060224001a042803150c050400020306030c020b0a030a0008041203010b060502020204110400020206031008080607060212041a030f0401020002030803100c0002020203] private def node2860:Certificate:=PackedParametricCertificateData.decode 10 data2860 private def data2912:List Nat:=[ 0x10919081108100811021002140008000a110f110e0a0919081108100811021002140008000a06011510040202060314080c060b06030a0412030c0203020202040c0202020202041104000202060301110f110e0a0911080908080711021002070214000a110f110e0a0911080908080711021002070214000a110f110e0a0911080908080711021002070214000a060b020606020203150c0504000203060314080c060b06030a041203110f110e100e0a091108090808071002070214000a110f110e0a0911080908080711021002070214000a110f110e0a0911080908080711021002070214000a0608020604020a0006040a03150c050400020306030c020b0a030a0008041203010c020b0604020302040404110400020206030c020002020203011614140e0a0a0f040e040e0314021401060108000a1614140e0a0a0f040e040e0314021401060108000a1614140e0a0a0f040e040e0314021401060108000a060e08070c05060002040803150c0504000203060314080c060b06030a0412031614140e090908080f040e040a041402100108000a1614140e090908080f040e040a041401100108000a1614140e090908080f040e040a041401100108000a060a0407060224001a042803150c050400020306030c020b0a030a0008041203010b060502020204110400020206030c0200020202030b02000202020301, 0x1110f170e110e110810080a0608061102060101010a110f100f170e110e10080a0608061102060101010a110f100f170e110e10080a0608061102060101010a06130803060018031a04100f100e11080a060806110214010201010106000a100f100e11080a060806110214010201010106000a100f100e11080a060806110214010201010106000a061302040602020401141c10140c060b06041c0310020106000203080411020002020204110f110e100e11080f060a0608061102140108010a110f110e100e11080a06080611021401080102010a110f110e100e11080a06080611021401080102010a06110f110e100e11080f060a0608061102140008000a110f110e100e11080f060a0608061102140008000a110f110e100e11080a06080611021400080002000a06011504030202020310040c040b04020e040e030c0203020202040c02020202020401110f110e100e09091908110810081102140101000a110f110e100e09091908110810081102140101000a110f110e100e09091908110810081102140101000a06110f110e0a0919081108100811021002140008000a110f110e0a] private def node2912:Certificate:=PackedParametricCertificateData.decode 10 data2912 private def node2913:Certificate:=.split node2860 node2912 private def node2914:Certificate:=.split node2846 node2913 private def node2915:Certificate:=.positive 1 [(1,0),(2,13)] node2914 private def node2916:Certificate:=.positive 1 [(1,2),(2,12)] node2915 private def node2917:Certificate:=.positive 2 [(1,0),(1,1),(2,11)] node2916 private def node2918:Certificate:=.positive 7 [(5,0),(4,7),(6,9)] node2917 private def data2934:List Nat:=[ 0x10e0e0f0a0b090f08080814041304090404020b010a0e0e0f0a0b090f08080814041304090406040b010a0e0e0f0a0b090f08080814041304090406040b010a060a0407060224001a042803152c080400060312030b020a020304000204060308020602020203130e0e0e0f0a11090b090f080b040f000b0009130e0e0e0f0a11090b090f080b040f000b0009130e0e0e0f0a11090b090f080b040f000b0009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f0402020206030e0806120212011004180309020002020203] private def node2934:Certificate:=PackedParametricCertificateData.decode 11 data2934 private def data2997:List Nat:=[ 0x10203150c0504000203060314040a0c030e0312030b18050a041a0006042a040c0e0a060406030a041004110400020206030c020002020203011614130e0e0e0a0a0f080808140404040f0000000a1614140e130e0e0e0a0a0f08080804040f0000000a1614140e130e0e0e0a0a0f08080801010f0000000a060b0407060506030403150c0504000203060314040a0c030e0312031614130e0e0e0a0a0f080808140404040f0000000a1614140e130e0e0e0a0a0f08080804040f0000000a1614140e130e0e0e0a0a0f08080801010f0000000a060a0407060224001a042803150c050400020306030b020a0203040002040603010f0c0c0c0a120516041604110400020206030c0200020202030b0200020202030116160f0f0e0e130a0b090f080808140409040a020a16160f0f0e0e130a0b090f0809080808140409040a16160f0f0e0e130a0b090f0809080808140409040a060b0c0808070a0006040c03150c0504000203060314040a0c030e03120316160f0f0e0e130a0b090808140409040a0208000a16160f0f0e0e130a0b090f0809080808140409040a16160f0f0e0e130a0b090f0809080808140409040a060a0407060224001a042803150c050400020306030b020a0203040002040603010f0c0c0c0a120516041604110400020206031004060c02120316030f040102000203080306060206000403040301, 0x10018031a04161416130e0e0c0b0b080e0214010201010109000a161416130e0e0c0b0b080e0214010201010109000a161416130e0e0c0b0b080e0214010201010109000a060e040706040a0202040604011410100e0a060310030b040406010a0006041604110200020202041614161314110e0e0c0b16080b080908140113010a1613141113110e0e0c0b0b0a16080b08090813010a1613141113110e0e0b0a16080b080908140113010a061614161314110e0e0c0b16080b081401130108010a1613141113110e0e0b0a16080b080908140113010a1613141113110e0e0b0a16080b080908140113010a06011504030202020310020a0202040304030b060404030a00040412040c0202020202040114110e0e0c0b160811080b0816060801060102010a14110e0e0c0b0b0a11080b0809081106080106010a14110e0e0c0b0b0a11080b0809081106080106010a06141113110e0e0c0b0b0a16080b081106080106010a14110e0e0c0b0b0a11080b0809081106080106010a14110e0e0c0b0b0a11080b0809081106080106010a06011510040202060314040a0c030e0312030b060404030a00040412040c0202020202041104000202060301141113110e0e0c0b0b0a16080b081106080106010a14110e0e0c0b0b0a11080b0809081106080106010a14110e0e0c0b0b0a11080b0809081106080106010a060b02060602, 0x1161414110e0e0c0c0c0b09080e020601010100000a14110e0e0c0b0b08090816020e02060101010f000a14110e0e0c0b0b08090816020e02060101010f000a0613080306] private def node2997:Certificate:=PackedParametricCertificateData.decode 11 data2997 private def node2998:Certificate:=.split node2934 node2997 private def node2999:Certificate:=.positive 1 [(2,0),(1,3)] node2998 private def data3019:List Nat:=[ 0x1130e0e0e0f0a0b0908081404130409040b0103010a130e0e0e0f0a0b0908081404130409040b0103010a130e0e0e0f0a0b0908081404130409040b0103010a060a1a0912080c0010041a03150403020202030a04030402020306030e0e0f0a0b090f08080814041304090404020b010a0e0e0f0a0b090f08080814041304090406040b010a0e0e0f0a0b090f08080814041304090406040b010a060a0407060224001a042803152c080400060312030b020a020304000204060301130e0e0e0f0a11090b090f080b040f000b0009130e0e0e0f0a11090b090f080b040f000b0009130e0e0e0f0a11090b090f080b040f000b0009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f0402020206030e0806120212011004180309020002020203] private def node3019:Certificate:=PackedParametricCertificateData.decode 11 data3019 private def data3074:List Nat:=[ 0x1060301161414110e0e11080b08090816061401080106010a161414110e0e11080b08090811061401080106010a14110e0e11080b080908160611061401080106010a06161414110e0e11080b08090816061401080106010a161414110e0e11080b08090811061401080106010a14110e0e11080b080908160611061401080106010a0601150c050400020306030a04030402020306030b18050a041a0006042a040c0e0a060406030a041004110400020206030c0200020202030116140f0f130e0e0e0a0a0f080c08080816060a000a16140f0f130e0e0e0a0a0f080c08080816060a000a16140f0f130e0e0e0a0a0f080808160601010a000a061614130e0e0e0a0a0f080c08080804040c0100000a1614130e0e0e0a0a0f080c08080804040c0100000a1614130e0e0e0a0a0f080c08080804040c0100000a0601150403020202030a0403040202030603080206020202040c0607060508030804110400020206030c0200020202030b02000202020301130e0e0e130a0b090f080808140409040a020f000a16160e0e130a0b090f0809080808140409040f000a16160e0e130a0b090f0809080808140409040f000a060a04080407020002040403150403020202030a0403040202030603080206020202040c0607060508030804110400020206031004060c02120316030f040102000203080306060206000403040301, 0x1141113110e0e0c0c0b0b09080e02060101010f000a14110e0e0d0b0b0b090816020e02060101010f000a14110e0e0d0b0b08090816020e02060101010f000a06130803060018031a04161416130e0e0b0a0b080e0214010201010109000a161416130e0e0b0a0b080e0214010201010109000a161416130e0e0b0a0b080e0214010201010109000a060b04070604120206040a04011410100e0a06031003080404060112000a04220411020002020204141113110e0e0b0a160811080b080908140113010a141113110e0e0b0a160811080b080908140113010a141113110e0e0b0a160811080b080908140113010a060b04070605060304041504030202020310020a0202040304030802030600020308040c02020202020401161414110e0e11080b08090816061401080106010a161414110e0e11080b08090811061401080106010a161414110e0e11080b08090816061401080106010a060b020606020204151004020206030a04030402020306030802030600020308040c0202020202041104000202] private def node3074:Certificate:=PackedParametricCertificateData.decode 11 data3074 private def node3075:Certificate:=.split node3019 node3074 private def data3096:List Nat:=[ 0x1160d140d190b19090d090d0108011300090009160d140d190b0d0b19090d0908011300090009160d140d190b0d0b19090d090801130009000906140d130d190b0d0b19090d090f081901030103000a140d130d190b0d0b19090d090f081901030103000a1911140d190b0d0b19090d090f080808190103000a0601150403020202030a04030402020306030f0f140d130d190b0d0b19090d090f08040419010a140d130d190b0d0b19090d090f080808040419010a1911140d190b0d0b19090d090f080808040319010a060c0407060218000e0418030606050400080306030b020a0203040002040603010f0f140d130d190b0d0b190913040b04190109140d130d0d0b19090d090f0813040b04190109140d130d0d0b19090d090f0813040b04190109060c0407060306000e041203152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f040102000203080310120e02010403060309020002020203] private def node3096:Certificate:=PackedParametricCertificateData.decode 11 data3096 private def data3152:List Nat:=[ 0x10d0b09090816020e0214010801090001000906160e0e0e160d0b09160811081602080102010b000a160e0e0e160d0b09160811081602080102010b000a160e0e0e160d0b09110816020801020114000b000a0601150c050400020306030a04030402020306030b18050a041a0006042a040c0e0a060406030a041004110400020206030c02000202020301140d0b090f0808080d040e020b010d000a0009160d140d0b090f0808080d040e020b010a0009160d140d0b090f0808080d040e020b010a000906140e130e0e0e160d140d0b0908080a0401010b000a140e130e0e0e160d140d0b0908080a0401010b000a140e130e0e0e160d140d0b0908080a0401010b000a0601150403020202030a04030402020306030712060a050c00020418040c08060605060404040a04110400020206030c0200020202030b02000202020301130e140a0b0a0a090b080908040211010a0009130e140a130a0b0a0a090b0809080402110109130e140a130a0b0a0a090b080908040211010906140e140a130a0b0a0a090b080908110101010b000a140e140a130a0b0a0a090b080908110101010b000a140e140a130a0b0a0a090b080908110101010b000a0601150403020202030a04030402020306030b02070206040304040c0607060508030804110400020206031004060c02120316030f0401020002030803100c000202020301, 0x11716160d0f090b0916020202060101010900091716160d0f090b0916020202060101010900091716160d0b0916020e02020206010101090009060a08070c03120034043e04160d0d0b0b0916020202160114010201090009160d0d0b0b0916020202160114010201090009160d0d0b0b0916020202160114010201090009060a040706041a020a040e04011410100e0a0603100307040406011a000e042e0411020002020204160d0b0916080e0816020e0208010900010009160d0b091608090816020e0208010900010009160d0b09090816020e02140108010900010009060a0c0712051a02040410041504030202020310020a0202040304030706031202040008041e040c02020202020401160d0b091608090816020e0208010900010009160d0b091608090816020e0208010900010009160d0b09090816020e02140108010900010009060b020606020204151004020206030a04030402020306030b020702030c00040410040c0202020202041104000202060301160d0b091608090816020e0208010900010009160d0b091608090816020e020801090001000916] private def node3152:Certificate:=PackedParametricCertificateData.decode 11 data3152 private def node3153:Certificate:=.split node3096 node3152 private def node3154:Certificate:=.split node3075 node3153 private def node3155:Certificate:=.split node2999 node3154 private def node3156:Certificate:=.positive 3 [(1,5),(8,10)] node3155 private def node3157:Certificate:=.positive 9 [(5,4),(3,7),(22,9)] node3156 private def node3158:Certificate:=.split node2918 node3157 private def node3159:Certificate:=.split node2830 node3158 private def node3160:Certificate:=.split node2739 node3159 private def node3161:Certificate:=.positive 3 [(1,0),(2,5)] node3160 private def data3187:List Nat:=[ 0x116141414140e08080f040e0416020a00080000000a16141414140e08080f040e0416020a00080000000a16141414140e08080f040e0416020a00080000000a060a0407060224001a042803152c080400060312030c020b0a030a00080412030b02070206040304030f020b040402030204110400020206030d06080603040006040a030f0402020206030e040a0601020306030e0e0b090a08080814040f0409040402130008000a0e0e0b090a08080814040f0406040402130008000a0e0e0b090a08080814040f0406040402130008000a060a0407060224001a042803152c080400060312030c020b0a030a00080412030b0207020604030403160e140e0e0e140b0b09130411011300110009160e140e0e0e140b0b09130411011300110009160e140e0e0e140b0b09130411011300110009060a08070c03120034043e03152c080400060312030c020b0a030a00080412031304000202060301110400020206031008080607060212041a030f0402020206030e040a06010203060301] private def node3187:Certificate:=PackedParametricCertificateData.decode 11 data3187 private def data3242:List Nat:=[ 0x10200020202041414110f160e140e08080f0416020e000a0000000a1414110f140e08080f040e0416020e000a0000000a1414110f160e140e08080f0416020e000a0000000a061614140e0a070b0609060f040e040e03140108000a1614140e0a0a0a0709060f040e040a03140108000a1614140e0a0a0a0709060f040e040a04140108000a06011504030202020311040c080b0402120412030c0203020202040c020202020204010c0200020202041614140e0a0a09060f040e040e030a03140108000a1614140e0a0a09060f040e040e030a03140108000a1614140e0a0a09060f040e040a031401080007000a060e080706060c0002040803150c0504000203060311040c080b0402120412031002020202020411060f06010803080411040e0209020106040a031614140e0a0a0f040e040e0314021401060108000a1614140e0a0a0f040e040e0314021401060108000a1614140e0a0a0f040e040e0314021401060108000a060e08070c05060002040803150c0504000203060314080c060b06030a0412031614140e090908080f040e040a041401100108000a1614140e090908080f040e040a041401100108000a1614140e090908080f040e040a041401100108000a060a0407060224001a042803150c050400020306030c020b0a030a0008041203010b0605020202041104000202060301010109020002020204, 0x1130f110f110e09091308110811020901060101010a130f110f110e09091308110811020901060101010a130f110f110e09091308110811020901060101010a06130803060018031a04130f110f110e130a0909110811020201010109000a130f110f110e130a0909110811020201010109000a130f110f110e130a0909110811020201010109000a061302040602020401142411140c160b0204240310020106000203080411020002020204130f110f110e100e13081108110214010b0009000a130f110f110e100e13081108110214010b0009000a130f110f110e100e13081108110214010b0009000a06130f110f110e100e130811080b031102140103010a130f110f110e100e1308110808060b03110214010a130f110f110e100e1308110808040b03110214010a06011504030202020311040c080b0402120412030c0203020202040c020202020204010c0200020202040b0200020202041414160f110f160e0909160214020a00090000000a160f110f160e09091602140201010a00090000000a160f110f160e09091602140201010a00090000000a061302040602020412040d040606030203142411140c160b0204240310020106000203080411] private def node3242:Certificate:=PackedParametricCertificateData.decode 11 data3242 private def node3243:Certificate:=.split node3187 node3242 private def node3244:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node3243 private def node3245:Certificate:=.positive 4 [(1,0),(4,2),(3,6)] node3244 private def node3246:Certificate:=.positive 7 [(4,0),(4,1),(3,5)] node3245 private def node3247:Certificate:=.positive 10 [(11,0),(3,4),(7,7)] node3246 private def data3273:List Nat:=[ 0x1161414140f0f140e0e0e0a0a0a080808020203000a161414140f0f140e0e0e0a0a0a0808080e0202020a16140f0f140e0e0e0a0a0f080a0808080e0202020a060a0407060224001a042803152c080400060312030b020a0203040002040603080206020202030f1e0c080a0c0416041604110400020206030d02050203020302030f0402020206030e040a0601020306030f0f0e0e130a13090b0908081604140409040b000a0f0f0e0e130a13090b090a0808081604140409040a0f0f0e0e130a13090b090a0808081604140409040a060a0407060224001a042803152c080400060312030b020a020304000204060308020602020203140e0e0e130a11090b090f080b040e02130009140e0e0e130a11090b090f080b040e02130009140e0e0e130a11090b090f080b040e02130009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f0402020206030e040a06010203060301] private def node3273:Certificate:=PackedParametricCertificateData.decode 11 data3273 private def data3335:List Nat:=[ 0x100020308041102000202020416140f0f0e0e0a0a0f08080814040e020e000a000a16140f0f0e0e0a0a0f0808080e020e000a0009000a16140f0f0e0e0a0a0f0808080e020e000a0009000a060f0f140e0a0a0f08080814040e020a02080000000a0f0f140e0a0a0f08080814040e020a02080000000a16140f0f140e0e0e0a0a0f08080814040e0200000a06011504030202020311040904020603060310040b06031200040416040c020202020204010c0200020202040f0f140e0a0a0f08080814040e020a02080000000a0f0f140e0a0a0f08080814040e020a02080000000a1614140e0e0e0a0a0f08080814040e02080000000a060b020606020203150c050400020306031104090402060306031002020202020411060f0601080308040e02060201060306030f0f140e0e0a0a0a0f080808140406040e0200000a0f0f140e0e0a0a0a0f080808140406040e0200000a140e0e0e0e0a0a0a0f080808140406040e0200000a060b0407060506030403150c0504000203060314040a0c030e0312030f0f140e0e0a0a0a0f080808140406040e0200000a0f0f140e0e0a0a0a0f080808140406040e0200000a140e0e0e0e0a0a0a0f080808140406040e0200000a060a0407060224001a042803150c050400020306030b020a0203040002040603010f0c0c0c0a1205160416041104000202060301010109020002020204, 0x10e040706040a020204060401140405020202030b040406010a00060416041102000202020414110e0e0c0b160811080b0814010801020109000a14110e0e0c0b160811080b0814010801020109000a14110e0e0c0b11080b08090814010801020109000a0614110e0e0a0a0a09160811080b081401080102010a14110e0e0a0a0a09160811080b081401080102010a14110e0e0a0a0a09160811080b081401080102010a0601150403020202030a040504020e030a030b060404030a00040412040c020202020204010c0200020202040b02000202020416140e0e0e0d0c0a0a0a080814040a0101010c000a16140e0e0e0c0c0a0a0a080814040a0101010c000a16140e0e0a0a0f08080814040c010a0101010c000a06130803060018031a041614140e0e0e0a0a0f080808140401010c000a000a1614140e0e0e0a0a0f080808140401010c000a000a1614140e0e0e0a0a0f080808140401010c000a000a061302060401020302040116140f0f0e0e0b0b08080e0202020901010100000a16140f0f0e0e0b0b08080e0202020901010100000a16140f0f0e0e0b0b08080e0202020901010100000a06130803060018031a0416140f0f0a0a08080e02020201010b000a0009000a16140f0f0a0a08080e02020201010b000a0009000a16140a0a080814020e02020201010b000a0009000a0613020406020204010110020106, 0x114110e0e0c0b1308090816020e02060101010f000a14110e0e0c0b13080b08090816020e02060101010a14110e0e0c0b13080b08090816020e02060101010a06130803060018031a0416140e0e0c0b160809080e0214010201010109000a16140e0e0c0b160809080e0214010201010109000a16140e0e0c0b160809080e0214010201010109000a06] private def node3335:Certificate:=PackedParametricCertificateData.decode 11 data3335 private def node3336:Certificate:=.split node3273 node3335 private def node3337:Certificate:=.positive 12 [(15,0),(1,5),(8,7)] node3336 private def data3371:List Nat:=[ 0x10a0808080e0202020a1614140e0e0e0a0a0f080a08080814020e0202020a060a04090405020002040403150403020202030a0403040202030603161414140f0f140e0e0e0a0a0a080808020203000a16140f0f140e0e0e0a0a0f080a0808080e0202020a1614140e0e0e0a0a0f080a08080814020e0202020a060a0407060224001a042803152c080400060312030b020a0203040002040603010f040c0207020404040404110400020206030b0603020202030f0402020206030e040a06010203060316160e0e130a0b090a08080814040904040213000a16160e0e130a0b090a08080814040904060413000a16160e0e130a0b090a08080814040904060413000a060a1a0912080c0010041a03150403020202030a04030402020306030e0e130a13090b090a08080816041404090413000a16160e0e130a0b090a08080814040904060413000a16160e0e130a0b090a08080814040904060413000a060a0407060224001a042803152c080400060312030b020a020304000204060301140e0e0e130a11090b090f080b040e02130009140e0e0e130a11090b090f080b040e02130009140e0e0e130a11090b090f080b040e02130009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f0402020206030e040a06010203060301, 0x1161414140f0f140e0e0e0a0a0f080a08080802020a16140f0f140e0e0e0a0a0f08] private def node3371:Certificate:=PackedParametricCertificateData.decode 11 data3371 private def data3429:List Nat:=[ 0x10201010b000a0009000a16140a0a080814020e02020201010b000a0009000a060b02060602020401010802030600020308041102000202020416140f0f0e0e0a0a0f080c0808080e020e000a000a16140f0f0e0e0a0a0f0808080e020e000a0009000a16140f0f0e0e0a0a0f0808080e020e000a0009000a060b020606020204150403020202030f0402020202030802030600020308040c020202020204010c02000202020416140f0f0e0e0a0a0f080c0808080e020e000a000a16140f0f0e0e0a0a0f0808080e020e000a0009000a16140f0f0e0e0a0a0f0808080e020e000a0009000a060f0f140e0e0e0e0a0a0a0c08080814040e0200000a16140f0f140e0e0e0a0a0c08080814040e0200000a16140f0f140e0e0e0a0a0f080c0808080e0200000a0601150403020202030f0402020202031002020202020411060706050601020408040c02010202020316140f0f0e0e0c08080816060e020e000a0000000a16140f0f0e0e0f080c08080816060e020e000a000a16140f0f0e0e0a0a0f08080816060e020e000a000a060f0f140e0e0a0a0a0c080808160614040e0200000a0f0f140e0e0e0e0a0a0a0c08080814040e0200000a16140f0f140e0e0e0a0a0c08080814040e0200000a0601150403020202030a0403040202030603080206020202040c06070605080308041104000202060301010109020002020204, 0x1020e02060101010f000a14110e0e0d0b13080b08090816020e02060101010a06130803060018031a0416140e0e0b0a160809080e0214010201010109000a16140e0e0b0a160809080e0214010201010109000a16140e0e0b0a160809080e0214010201010109000a060b04070604120206040a040114040502020203080404060112000a0422041102000202020414110e0e0b0a160811080b0814010801020109000a14110e0e0b0a160811080b0814010801020109000a14110e0e0b0a11080b08090814010801020109000a060b0407060506030404150403020202030a040504020e030a030802030600020308040c020202020204010c0200020202040b02000202020416140e0d0a0a0808140412040b010a0101010d000a16140e0e0e0d0a0a080814040b010a0101010d000a16140e0e0e0d0a0a080814040b010a0101010d000a06130803060018031a041614140e0e0e0a0a0c08080814040f0101010a000a1614140e0e0e0a0a0c08080814040f0101010a000a1614140e0e0e0a0a0c08080811010f0101010a000a060b0206060202040116140f0f0e0e0b0b08080e0202020901010100000a16140f0f0e0e0b0b08080e0202020901010100000a16140f0f0e0e0b0b08080e0202020901010100000a06130803060018031a0416140a0a080814020e02020201010b000a0009000a16140a0a080814020e0202, 0x114110e0e0d0b0b0b090816020e02060101010f000a14110e0e0d0b1308090816] private def node3429:Certificate:=PackedParametricCertificateData.decode 11 data3429 private def node3430:Certificate:=.split node3371 node3429 private def data3462:List Nat:=[ 0x10b090f080a0808080e020b0109000906140e0e0e140d0b090a08080816020c000b000a000a140e0e0e160d140d0b09080816020e020b000a000a140e0e0e160d140d0b0908080e0201010b000a000a0601150403020202030a04030402020306030e020702050203020411040f0206040406040604110400020206030b0603020202030f0402020206030e040a060102030603160d130b0d0b130a13090d0913010401090009160d130b0d0b130a13090d0908081301040109160d130b0d0b130a13090d090808130104010906160d130b0d0b130a13090d0913010401030104000a160e160d130b0d0b130a13090d091301040111000a160e160d130b0d0b130a13090d090808130111000a0601150403020202030a0403040202030603160e160d130b0d0b130a13090d090404130100000a160e160d130b0d0b130a13090d090808130111000a160e160d130b0d0b130a13090d091301110009060c0407060218000e0418030606050400080306030b020a020304000204060301160e160d130b0d0b130a13090d091301110009160e160d130b0d0b130a13090d091301110009160e160d130b0d0b130a13090d0913011100090612060c0203060010041203152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f04010200020308030e040a06010203060301, 0x1160d140d0b090f080a0808080e020b01090009160d140d0b090f080a0808080e020b01090009160d140d] private def node3462:Certificate:=PackedParametricCertificateData.decode 11 data3462 private def data3520:List Nat:=[ 0x10216010101090009160d0b09080816021402020216010101090009060a0206060404020204040401010702030601040004040e0411020002020204160d140d0b090f0808080d040e020b010a0009160d140d0b090f0808080d040e020b010a0009160d140d0b090f0808080e020b010a00090009060a06061205040202040804150403020202030f0402020202030706031202040008041e040c020202020204010c020002020204160d140d0b090f0808080d040e020b010a0009160d140d0b090f0808080d040e020b010a0009160d140d0b090f0808080e020b010a0009000906140e0e0e0b0908080a0416020e020b00080000000a140e0e0e0b0908080a0416020e020b00010000000a140e0e0e140d0b0908080a0416020e020b0001000a0601150403020202030f0402020202030706060602040002040c04110c060605060108040e040c020102020203140d0b090f0808080d040e020b010d000a0009140d0b090f0808080d040e020b010d000a0009160d140d0b090f0808080d040e020b010a000906140e0e0e140a0b0908080a040e020c000b0008000a140e0e0e140a0b0908080a040e020c000b0008000a140e0e0e0b0908080a0416020e020b00080000000a0601150403020202030a04030402020306030712060a050c00020418040c08060605060404040a041104000202060301010109020002020204, 0x10b09160202020601010113000900091716160d0b09160202020601010113000900091716160d0b0916020202060101011300090009060a08070c03120034043e04160d0d0b0b0916020202160114010201090009160d0d0b0b0916020202160114010201090009160d0d0b0b0916020202160114010201090009060a040706041a020a040e04011404050202020307040406011a000e042e0411020002020204160d0b091608090816020e0208010900010009160d0b09090816020e02140108010900010009160d0b09090816020e02140108010900010009060a0c0712051a0204041004150403020202030a040504020e030a030706031202040008041e040c020202020204010c0200020202040b0200020202041711140d0d0b0b090d04090101010d000a00091711140d0d0b0b090d04090101010d000a00091711140d0d0b0b090d04090101010d000a000906130803060018031a04160d140d0d0b0b0908081601110101010a0009160d140d0d0b0b090808160101010a00090009160d140d0d0b0b090808160101010a00090009060a06061a02060104040c0401160d0b090f0808081602140202020101090009160d0b090f0808081602140202020101090009160d0b090f080808160214020202010109000906130803060018031a04160d0b09080816021402020216010101090009160d0b0908081602140202, 0x11716160d] private def node3520:Certificate:=PackedParametricCertificateData.decode 11 data3520 private def node3521:Certificate:=.split node3462 node3520 private def node3522:Certificate:=.split node3430 node3521 private def node3523:Certificate:=.split node3337 node3522 private def node3524:Certificate:=.positive 1 [(1,4),(2,10)] node3523 private def node3525:Certificate:=.positive 3 [(5,3),(1,7),(4,9)] node3524 private def node3526:Certificate:=.split node3247 node3525 private def node3527:Certificate:=.negative 1 [(1,2),(1,3)] node3526 private def node3528:Certificate:=.negative 4 [(4,1),(3,2),(3,4)] node3527 private def data3568:List Nat:=[ 0x10f080a080808140202020a000a060a16091e010c000804160315040302020203011002020202020411060f06010803080407020402020203161414140f0f140e0e0e0a0a0f080a08080802020a16140f0f140e0e0e0a0a0f080a0808080e0202020a1614140e0e0e0a0a0f080a08080814020e0202020a060a04090405020002040403150403020202030a0403040202030603161414140f0f140e0e0e0a0a0a080808020203000a16140f0f140e0e0e0a0a0f080a0808080e0202020a1614140e0e0e0a0a0f080a08080814020e0202020a060a0407060224001a042803152c080400060312030b020a0203040002040603010f040c020702040404040411040002020603010f0402020206030e040a0601020306030e0e130a13090b090a08080816041404090413000a16160e0e130a0b090a08080814040904060413000a16160e0e130a0b090a08080814040904060413000a060a0407060224001a042803152c080400060312030b020a02030400020406030e0207020502030203140e0e0e130a11090b090f080b040e02130009140e0e0e130a11090b090f080b040e02130009140e0e0e130a11090b090f080b040e02130009060a08070c03120034043e03152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f0402020206030e040a06010203060301, 0x1161616140e0e0a0a0a0814040e040f00080002000a161616140e0e0a0a0a0814040e040f00080002000a161616140a0a0a0814040e040f000a00080002000a060a020902040403020315040302020203161414140f0f140e0e0e0a0a0f080a08080802020a16140f0f140e0e0e0a0a0f080a0808080e0202020a1614140e0e0e0a0a] private def node3568:Certificate:=PackedParametricCertificateData.decode 11 data3568 private def data3600:List Nat:=[ 0x10f0101010a000a1614140e0e0e0a0a0c08080814040f0101010a000a1614140e0e0e0a0a0c08080811010f0101010a000a060b020606020204010f040202020204080203060002030804110200020202040c0201020202040c0200020202041614140e0e0e0a0a0c08080814040f0101010a000a1614140e0e0e0a0a0c08080814040f0101010a000a1614140e0e0e0a0a0c08080811010f0101010a000a06130204060202040b0205060202030f04020202020410020106000203080411020002020204140e0e0d140a0d0a080814040f01080102010d000a140e0e0d140a0d0a080814040f01080102010d000a140e0e0d140a0d0a080814040f01080102010d000a060e0a0a0a0c0808081404040402010c00080002000a0e0a0a0a0c080808140404040f000c00080002000a0e0a0a0a0c080808140404040f000c00080002000a06011504030202020316140f0f0e0e0a0a0f080c0808080e020e000a000a16140f0f0e0e0a0a0f0808080e020e000a0009000a16140f0f0e0e0a0a0f0808080e020e000a0009000a060f0f140e0e0e0e0a0a0a0c08080814040e0200000a16140f0f140e0e0e0a0a0c08080814040e0200000a16140f0f140e0e0e0a0a0f080c0808080e0200000a06011504030202020301100202020202041106070605060102040804010b060302020204010e040a02090603040309020002020204, 0x116140e0d0d0a0a0a080814040b010a0101010d000a16140e0e0e0d0a0a080814040b010a0101010d000a16140e0e0e0d0a0a080814040b010a0101010d000a06130803060018031a041614140e0e0e0a0a0c0808081404] private def node3600:Certificate:=PackedParametricCertificateData.decode 11 data3600 private def node3601:Certificate:=.split node3568 node3600 private def data3649:List Nat:=[ 0x1150403020202030a0403040202030603140e0e0e140d11090b090a0808080d040b000a000a140e0e0e160d140d0b0908080e0201010b000a000a140e0e0e160d140d0b0908080e0201010b000a000a06080207020212000c0412030606050400080306030b020a02030400020406030111040f020604040604060411040002020603010f0402020206030e040a060102030603160d130b0d0b130a13090d0913010401090009160d130b0d0b130a13090d0908081301040109160d130b0d0b130a13090d090808130104010906160d130b0d0b130a13090d0913010401030104000a160e160d130b0d0b130a13090d091301040111000a160e160d130b0d0b130a13090d090808130111000a0601150403020202030a0403040202030603160e160d130b0d0b130a13090d090404130100000a160e160d130b0d0b130a13090d090808130111000a160e160d130b0d0b130a13090d091301110009060c0407060218000e0418030606050400080306030b020a020304000204060301160e160d130b0d0b130a13090d091301110009160e160d130b0d0b130a13090d091301110009160e160d130b0d0b130a13090d0913011100090612060c0203060010041203152c080400060312030b020a02030400020406031304000202060301110400020206031004060c02120316030f04010200020308030e040a06010203060301, 0x10b090a090a0808080d040f01040102010d00090b090a090a0808080d0411010f0104010d00090b090a090a0808080d0411010f0104010d0009060e0e16090b0908080e040d040f000c000a0002000a140e0e0e0b0908080e040d040f000c000a0002000a140e0e0e0b0908080e040d040f000c000a0002000a060115040302020203160d140d0b090f080a0808080e020b01090009160d140d0b090f080a0808080e020b01090009160d140d0b090f080a0808080e020b0109000906140e0e0e160d140d0b090808020201010b000a000a140e0e0e160d140d0b090808020201010b000a000a140e0e0e160d140d0b090808020201010b000a000a060115040302020203011002020202020411060f06010803080407020402020203160d140d0b090f080a0808080e020b01090009160d140d0b090f080a0808080e020b01090009160d140d0b090f080a0808080e020b0109000906140e0e0e140d0b090a08080816020c000b000a000a140e0e0e160d140d0b09080816020e020b000a000a140e0e0e160d140d0b0908080e0201010b000a000a0601] private def node3649:Certificate:=PackedParametricCertificateData.decode 11 data3649 private def data3681:List Nat:=[ 0x1160d140d0d0b0b0908081601110101010a0009160d140d0d0b0b090808160101010a00090009160d140d0d0b0b090808160101010a00090009060a06061a02060104040c04010f0402020202040702030601040004040e04110200020202040c0201020202040c020002020204160d140d0d0b0b0908081601110101010a0009160d140d0d0b0b090808160101010a00090009160d140d0d0b0b090808160101010a0009000906130204060202040b0205060202030f04020202020410020106000203080411020002020204140a0b0a0b0908080d0411010f0104010d0009140a0b0a0b0908080d0411010f0108010d0009140a0b0a0b0908080d0411010f0108010d000906140e0e0e0b0908080e040a040c000b00080002000a140e0e0e0b0908080e040a040c000b00080002000a140e0e0e0b0908080e040a040c000b00080002000a060115040302020203160d140d0b090f0808080d040e020b010a0009160d140d0b090f0808080d040e020b010a0009160d140d0b090f0808080e020b010a0009000906140e0e0e0b0908080a0416020e020b00080000000a140e0e0e0b0908080a0416020e020b00010000000a140e0e0e140d0b0908080a0416020e020b0001000a060115040302020203010706060602040002040c04110c060605060108040e04010b060302020204010e040a02090603040309020002020204, 0x11711140d0d0b0b090d04090101010d000a00091711140d0d0b0b090d04090101010d000a00091711140d0d0b0b090d04090101010d000a000906130803060018031a04] private def node3681:Certificate:=PackedParametricCertificateData.decode 11 data3681 private def node3682:Certificate:=.split node3649 node3681 private def node3683:Certificate:=.split node3601 node3682 private def node3684:Certificate:=.negative 1 [(3,5),(1,7)] node3683 private def data3740:List Nat:=[ 0x10814020e020d000c000b000a000a060115040302020203150403020202030e0e11090b090d080808110314020d000b000a000a0e0e11090b090d080808110314020d000b000a000a0e0e11090b090d080808110314020d000b000a000a06080207020212000c041203060605040008030603150403020202030111040f020604040604060411040002020603010f0402020206030e040a0601020306031816130d180b130b130a13090e020d000900091816130d180b130b130a13090e0202020d00091816180b130b130a13090e02020101010d00090618160e0e130d180b130b130a180913090e0203000a181618110e0e180b130b130a180913090e0203000a1816180b130b130a180913090e0218010e0000000a0601150403020202031504030202020318160e0e130d180b130b130a18091309040403030a181618110e0e180b130b130a180913090e0200000a1816180b130b130a1809130911030e021801090612060d020218000e04160306060504000803060315040302020203011311160e180b130b130a18090d040b04130109160e180b130b130a180913090d040b04130109160e180b130b130a180913090d040b041301090612060d020306000e041003152c080400060312030b0c030a01020006041203130400020206030111040002020603110402020202030f0402020206030e040a06010203060301, 0x10a081707010109181618141714180b170a14090a08170701010906130803060018031a0418161814180b14090a0811010b010a0101010918161814180b14090a0811010b010a0101010918161814180b14090a0811010b010a010101090613020406020204010a040304020203060410020106000203080411020002020204180b0b090a090a0811050905080518040d01091816180b0b090a090a081305050405020d0109180b0b090a090a0811050905180405040d010906140e0e0e11090b0908080e040f000d00080002000a140e0e0e11090b0908080e040f000d00080002000a140e0e0e11090b0908080e040f000d00080002000a0601150403020202030b090d0808080904160214020b0109000200090b090d08080809041602140204020b010900090b090d08080809041602140204020b01090009060e0e11090b09080814020e020d000c000b000a000a0e0e11090b09080814020e020d000c000b000a000a0e0e11090b09080814020e020d000c000b000a000a060115040302020203011002020202020411060f060108030804010b090d0808080904160214020b0109000200090b090d08080809041602140204020b010900090b090d08080809041602140204020b01090009060e0e11090b09080814020e020d000c000b000a000a0e0e11090b09080814020e020d000c000b000a000a0e0e11090b0908, 0x1181618141714180b170a14090a081707010109181618141714180b170a1409] private def node3740:Certificate:=PackedParametricCertificateData.decode 11 data3740 private def data3761:List Nat:=[ 0x117161714170b140a0b0a1409070101010a000917161714170b140a0b0a1409070101010a000917161714140a0b0a14090a01070101010a000906130803060018031a040b0205060202040a04030402020306040702030601040004040e0411020002020204070201060002030804060602080002030a0417161714170b140a0b0a1409160701010a000917161714170e140a0b0a1409160701010a00091714170e140a0b0a140916070a0101010a000906130803060018031a04160a140a0b0a0b09020216010b0101010a0009140a0b0a0b090a04020216010b0101010a0009140a0b0a0b090a0402021601140101010a00090613020406020204010a04030402020306041002010600020308041102000202020407020402020204060603020206030804010e100a0e040603100309020002020204] private def node3761:Certificate:=PackedParametricCertificateData.decode 11 data3761 private def node3762:Certificate:=.split node3740 node3761 private def node3763:Certificate:=.negative 1 [(1,1),(1,8)] node3762 private def node3764:Certificate:=.negative 13 [(12,0),(3,4),(4,7)] node3763 private def node3765:Certificate:=.split node3684 node3764 private def node3766:Certificate:=.positive 8 [(5,5),(1,7),(24,9)] node3765 private def node3767:Certificate:=.negative 1 [(1,0),(2,2)] node3766 private def node3768:Certificate:=.negative 4 [(1,0),(3,1),(1,3)] node3767 private def node3769:Certificate:=.negative 1 [(1,0),(1,4)] node3768 private def node3770:Certificate:=.split node3528 node3769 private def node3771:Certificate:=.split node3161 node3770 private def node3772:Certificate:=.split node2657 node3771 private def node3773:Certificate:=.split node1791 node3772 private def node3774:Certificate:=.split node958 node3773 private def zz531:"s0213"="s0213":=by decide+kernel private theorem valid79:check node79 ctx79 quad79 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid197:check node197 ctx197 quad197 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid202:check node202 ctx202 quad202 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid197 private theorem valid277:check node277 ctx277 quad277 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz532:"s0214"="s0214":=by decide+kernel private theorem valid427:check node427 ctx427 quad427 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid501:check node501 ctx501 quad501 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · exact valid427 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid502:check node502 ctx502 quad502 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid501 private theorem valid577:check node577 ctx577 quad577 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz533:"s0215"="s0215":=by decide+kernel private theorem valid723:check node723 ctx723 quad723 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid799:check node799 ctx799 quad799 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · exact valid723 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid800:check node800 ctx800 quad800 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid799 private theorem valid875:check node875 ctx875 quad875 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz534:"s0216"="s0216":=by decide+kernel private theorem valid951:check node951 ctx951 quad951 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid875 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid953:check node953 ctx953 quad953 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid577 · exact valid800 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid951 private theorem valid955:check node955 ctx955 quad955 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · exact valid202 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid277 · exact valid502 · exact valid953 private theorem valid956:check node956 ctx956 quad956 (hinges.drop 3) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid79 · exact valid955 private def zz535:"s0217"="s0217":=by decide+kernel private theorem valid1038:check node1038 ctx1038 quad1038 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1145:check node1145 ctx1145 quad1145 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1149:check node1149 ctx1149 quad1149 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1145 private theorem valid1248:check node1248 ctx1248 quad1248 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz536:"s0218"="s0218":=by decide+kernel private theorem valid1253:check node1253 ctx1253 quad1253 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1149 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1248 private theorem valid1329:check node1329 ctx1329 quad1329 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1407:check node1407 ctx1407 quad1407 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1480:check node1480 ctx1480 quad1480 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1407 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz537:"s0219"="s0219":=by decide+kernel private theorem valid1706:check node1706 ctx1706 quad1706 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1783:check node1783 ctx1783 quad1783 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.split_valid · exact valid1706 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1784:check node1784 ctx1784 quad1784 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1783 private theorem valid1785:check node1785 ctx1785 quad1785 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1784 private def zz538:"s021a"="s021a":=by decide+kernel private theorem valid1788:check node1788 ctx1788 quad1788 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid1329 · exact valid1480 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1785 private theorem valid1790:check node1790 ctx1790 quad1790 (hinges.drop 3) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1038 · apply NatParametricCheckSteps.split_valid · exact valid1253 · exact valid1788 private theorem valid1871:check node1871 ctx1871 quad1871 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1955:check node1955 ctx1955 quad1955 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz539:"s021b"="s021b":=by decide+kernel private theorem valid1960:check node1960 ctx1960 quad1960 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1871 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1955 private theorem valid2056:check node2056 ctx2056 quad2056 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2158:check node2158 ctx2158 quad2158 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2248:check node2248 ctx2248 quad2248 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz540:"s021c"="s021c":=by decide+kernel private theorem valid2250:check node2250 ctx2250 quad2250 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2056 · apply NatParametricCheckSteps.split_valid · exact valid2158 · exact valid2248 private theorem valid2332:check node2332 ctx2332 quad2332 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2570:check node2570 ctx2570 quad2570 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2571:check node2571 ctx2571 quad2571 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid2332 · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2570 private def zz541:"s021d"="s021d":=by decide+kernel private theorem valid2652:check node2652 ctx2652 quad2652 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · exact valid2571 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2656:check node2656 ctx2656 quad2656 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2250 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2652 private theorem valid2738:check node2738 ctx2738 quad2738 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2828:check node2828 ctx2828 quad2828 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz542:"s021e"="s021e":=by decide+kernel private theorem valid2917:check node2917 ctx2917 quad2917 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3154:check node3154 ctx3154 quad3154 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3157:check node3157 ctx3157 quad3157 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid3154 private theorem valid3159:check node3159 ctx3159 quad3159 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2828 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2917 · exact valid3157 private def zz543:"s021f"="s021f":=by decide+kernel private theorem valid3247:check node3247 ctx3247 quad3247 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3522:check node3522 ctx3522 quad3522 (hinges.drop 11) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3525:check node3525 ctx3525 quad3525 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid3522 private theorem valid3528:check node3528 ctx3528 quad3528 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid3247 · exact valid3525 private def zz544:"s0220"="s0220":=by decide+kernel private theorem valid3684:check node3684 ctx3684 quad3684 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3766:check node3766 ctx3766 quad3766 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid3684 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid3770:check node3770 ctx3770 quad3770 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · exact valid3528 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid3766 private theorem valid3771:check node3771 ctx3771 quad3771 (hinges.drop 3) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2738 · exact valid3159 · exact valid3770 private def zz545:"s0221"="s0221":=by decide+kernel private theorem valid3773:check node3773 ctx3773 quad3773 (hinges.drop 1) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1790 · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid1960 · exact valid2656 · exact valid3771 private theorem valid3774:check node3774 ctx3774 quad3774 (hinges.drop 0) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid956 · exact valid3773 theorem certificate_valid:check node3774 constraintsNat base hinges = true:=valid3774 theorem nonnegative (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i):0 ≤ slack t x:=by unfold slack apply div_nonneg · apply check_sound node3774 constraintsNat base hinges t x ht0 ht1 _ certificate_valid intro i have hC (j:Fin 4):0 ≤ linearEval (constraints j) x:=by fin_cases j <;> simpa [constraints,linearEval,Fin.sum_univ_succ] using hx _ exact hC ⟨i % 4,Nat.mod_lt _ (by decide)⟩ · norm_num [normalizationDenominator] end Green24Proof.QuadNearBalanceCase3 private def zz2179:"s0883"="s0883":=by decide+kernel end section namespace Green24Proof.QuadNearBalanceCase4 open ParametricQuadraticCertificates hiding Certificate check check_sound open NatParametricCertificates open NatBacksubRecoveredQuadraticCertificates (cons) open IntegerQuadraticCertificates (Linear Point linearEval combinationCheck) def constraints:Fin 4 → Linear:=![![1,0,0,0], ![0,1,0,0], ![0,0,1,0], ![0,0,0,1]] def base:Quadratic:=![![![0x11ccc5b529b210, -0xaa87bee538000, -0xffcb9e57d4000,0xe805e7d63908], ![-0xaa87bee538000, -0x5c69c7ab6e2908,0x14c4b7477ffa38,0x4f8e040f98a7e], ![-0xffcb9e57d4000,0x14c4b7477ffa38, -0x460112777b9af0,0xad6f728eab6bc], ![0xe805e7d63908,0x4f8e040f98a7e,0xad6f728eab6bc, -0x5543df729c000]], ![![0x7b5287aa00,0,0x19945ca262000, -0xea29f388fd80], ![0,0, -0x24861a0c34280,0x19945ca262000], ![0x19945ca262000, -0x24861a0c34280,0x7b5287aa00, -0x3da943d500], ![-0xea29f388fd80,0x19945ca262000, -0x3da943d500,0]], ![![-0x6eaa7278920,0xac8e31c00,0xa7a358200,0x22d55c8b200], ![0xac8e31c00,0x6eaa7278920,0xbbcecf16440, -0x6e02cf20720], ![0xa7a358200,0xbbcecf16440,0,0xac8e31c00], ![0x22d55c8b200, -0x6e02cf20720,0xac8e31c00,0]]] def hinges:Hinges:=[(![0,0x1ed4a1ea80,0], ![0,0,1, -3]),(![-0x173d9d4b9b5e, -0x9a27299480,0], ![0,0,1, -1]),(![0x173d9d4b9b5e,0,0], ![0,0,3, -1]),(![-0x2de2a95799a0,0,0], ![0,1, -3,0]),(![0x7402f3eb1c84,0,0], ![0,1,0, -3]),(![0x12c695003c6fa9,0, -0x6eaa7278920], ![0,1,0, -1]),(![-0x5543df729c000,0,0], ![0,3, -2, -1]),(![0x5543df729c000,0,0], ![0,3, -2,1]),(![0x2de2a95799a0,0,0], ![0,3, -1,0]),(![0x465418d301c3,0,0], ![0,3,0, -1]),(![0x5543df729c000,0,0], ![0,3,2, -1]),(![-0x173d9d4b9b5e,0,0], ![1, -3,0,0]),(![-0x5543df729c000,0,0], ![1, -2, -3,0]),(![0x5543df729c000,0,0], ![1, -2,3,0]),(![0x173d9d4b9b5e,0x9a27299480,0], ![1, -1,0,0]),(![-0x465418d301c3,0,0], ![1,0, -3,0]),(![-0x12c695003c6fa9,0,0x6eaa7278920], ![1,0, -1,0]),(![0x5543df729c000,0,0], ![1,2, -3,0]),(![0, -0x1ed4a1ea80,0], ![3, -1,0,0]),(![-0x7402f3eb1c84,0,0], ![3,0, -1,0])] def normalizationDenominator:ℤ:=0xaa87bee538000 noncomputable def slack (t:ℝ) (x:Point):ℝ := (quadraticEval base t x + hingeEval hinges t x) / normalizationDenominator def constraintsNat (i:Nat):Linear := constraints ⟨i % 4,Nat.mod_lt _ (by decide)⟩ private def ctx2392:Nat → Linear:=constraintsNat private def quad2392:Quadratic:=base private def ctx619:Nat → Linear:=cons ![0,0,1, -3] ctx2392 private def quad619:Quadratic:=quad2392 + coefficientProduct ![0,0x1ed4a1ea80,0] ![0,0,1, -3] ![0,0,1, -3] private def ctx301:Nat → Linear:=cons ![0,1,0, -3] (cons (-![0,1, -3,0]) (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx619))) private def quad301:Quadratic:=(((quad619 + coefficientProduct ![-0x173d9d4b9b5e, -0x9a27299480,0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x173d9d4b9b5e,0,0] ![0,0,3, -1] ![0,0,3, -1])) + coefficientProduct ![0x7402f3eb1c84,0,0] ![0,1,0, -3] ![0,1,0, -3] private def ctx142:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx301) private def quad142:Quadratic:=(quad301 + coefficientProduct ![0x12c695003c6fa9,0, -0x6eaa7278920] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx615:Nat → Linear:=cons (-![0,1,0, -3]) (cons (-![0,1, -3,0]) (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx619))) private def quad615:Quadratic:=(((quad619 + coefficientProduct ![-0x173d9d4b9b5e, -0x9a27299480,0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x173d9d4b9b5e,0,0] ![0,0,3, -1] ![0,0,3, -1])) private def ctx511:Nat → Linear:=cons ![0,1,0, -1] ctx615 private def quad511:Quadratic:=quad615 + coefficientProduct ![0x12c695003c6fa9,0, -0x6eaa7278920] ![0,1,0, -1] ![0,1,0, -1] private def ctx1151:Nat → Linear:=cons ![0,0,1, -1] (cons (-![0,0,1, -3]) ctx2392) private def quad1151:Quadratic:=(quad2392) + coefficientProduct ![-0x173d9d4b9b5e, -0x9a27299480,0] ![0,0,1, -1] ![0,0,1, -1] private def ctx750:Nat → Linear:=cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons (-![0,1, -3,0]) (cons ![0,0,3, -1] ctx1151))) private def quad750:Quadratic:=(((quad1151 + coefficientProduct ![0x173d9d4b9b5e,0,0] ![0,0,3, -1] ![0,0,3, -1])) + coefficientProduct ![0x7402f3eb1c84,0,0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x12c695003c6fa9,0, -0x6eaa7278920] ![0,1,0, -1] ![0,1,0, -1] private def ctx1148:Nat → Linear:=cons (-![0,1,0, -3]) (cons (-![0,1, -3,0]) (cons ![0,0,3, -1] ctx1151)) private def quad1148:Quadratic:=((quad1151 + coefficientProduct ![0x173d9d4b9b5e,0,0] ![0,0,3, -1] ![0,0,3, -1])) private def ctx833:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx1148) private def quad833:Quadratic:=(quad1148 + coefficientProduct ![0x12c695003c6fa9,0, -0x6eaa7278920] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx1147:Nat → Linear:=cons (-![0,1,0, -1]) ctx1148 private def quad1147:Quadratic:=quad1148 private def ctx2390:Nat → Linear:=cons (-![0,0,1, -1]) (cons (-![0,0,1, -3]) ctx2392) private def quad2390:Quadratic:=(quad2392) private def ctx1694:Nat → Linear:=cons (-![0,1, -3,0]) (cons ![0,0,3, -1] ctx2390) private def quad1694:Quadratic:=(quad2390 + coefficientProduct ![0x173d9d4b9b5e,0,0] ![0,0,3, -1] ![0,0,3, -1]) private def ctx1340:Nat → Linear:=cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx1694) private def quad1340:Quadratic:=(quad1694) + coefficientProduct ![0x12c695003c6fa9,0, -0x6eaa7278920] ![0,1,0, -1] ![0,1,0, -1] private def ctx1409:Nat → Linear:=cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1694)) private def quad1409:Quadratic:=((quad1694)) + coefficientProduct ![-0x5543df729c000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx1691:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1694)) private def quad1691:Quadratic:=((quad1694)) private def ctx1537:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] ctx1691) private def quad1537:Quadratic:=(quad1691 + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![0x2de2a95799a0,0,0] ![0,3, -1,0] ![0,3, -1,0] private def ctx2389:Nat → Linear:=cons (-![0,0,3, -1]) ctx2390 private def quad2389:Quadratic:=quad2390 private def ctx2040:Nat → Linear:=cons ![0,1, -3,0] ctx2389 private def quad2040:Quadratic:=quad2389 + coefficientProduct ![-0x2de2a95799a0,0,0] ![0,1, -3,0] ![0,1, -3,0] private def ctx2037:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx2040)) private def quad2037:Quadratic:=((quad2040)) private def ctx2384:Nat → Linear:=cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) (cons (-![0,1, -3,0]) ctx2389)))) private def quad2384:Quadratic:=((((quad2389)))) + coefficientProduct ![0x5543df729c000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx2331:Nat → Linear:=cons (-![0,3,0, -1]) (cons ![0,3, -1,0] ctx2384) private def quad2331:Quadratic:=(quad2384 + coefficientProduct ![0x2de2a95799a0,0,0] ![0,3, -1,0] ![0,3, -1,0]) private def data60:List Nat:=[ 0x18ce497b0adfdbde9cdf9dcfbfebad1b0d6801313000213faba8a90b9daabdbb6bff5dcabb5faeca0fef988e7d5801008000266e8aac2bdfb8ca7bf85c094cd97f6f7a0ebd3e4919c801707000275bce8dee8c9c7e29f9ba0fcbeeafcb6a5aeb78cde97fdc01107000269d6b4919bb789defbddfbd299c8d0bd97f5daf4acadaec008070002038defff9adc829fcaa7ecd7809c9d8b93f6c791efb4a8801706000207cad0e598ec8caadaff88a199ccf4d6c5f2acd6f9ffc8c011060002109aaa96908eb893ebe59ee5b9f1cfa8ddcfa595a0a68fc01701000206bfd9e1d2d6b49ddc8392b4fd97d0d18a95ec8a9fa5c6801e13ad9ad4eb83d480c8a58390e1c59b9ac0000b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e040102000203080310040a0400020302030113131311130911080908110709071101170009131313111309110809081107090711011700091313131113091108110709071101170008060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04020202060310060d020a060104040603080200020202030107020102020203060804060018031a030502010200040306030a04000202020307080204000603060306040002020603050403060002030603, 0x1131302020fe28ee0f38a8095818cfae2e9cdc6c981f1c5e4f1fdd0b21311020215c1c2cabddaf389f795a9dd9ab2ecebe59cf494f3b3a9ea130802020aa3e783d8ffb097cac39790fcbfc7aafedbe5e3fcf7b080100802026ca8b28da38db9c3cf8ab2c7d4befba4f8dcaaeea68e801707020244de96918fc1e4a78292e186edaeb0e3adf8bbe8f8fc88801107020271a6c9fedc9592b7a78794d4cfeb9fd083f89092e5cec3b80807020202e7babba1f89dc596aeaa98a788f58df3b4c4a1eae9e4801106020212d885df87bbc79ff5fcf1b8a9bbb8ddc983b485af9bbac80606020201f5f792d1bedd8bb8e3f8a4edefc0cd8892a7a48dcdd580170102020c9683dc8be7afd2f7aca59d879493e9f8cba4b691e0ce801313010215f0e5d883d096e2d8a0de86a8828de6b9e1c3b4bad1d180100801026dd2bca5d4d4f1a8bccccc9996c481a8eddcaeb6a5ac801707010266a49dd5b183ecf8e496f684f692c992d3ec99a8fce395c01107010260eeed9acec7b3faa896f0c3e684e496b6c998f681858cc00807010202cba2aeb983b5c0e38498d0aeb9f2c7a9a7dd91adfab380170601020ef7e3a7a68adbeddba0da94d79c8de8f5bd8af6f6d3c9c01106010218b19fbe9ee1ed9680d8b1b2c0aaa7af9ee5c7ad98d4d5c00606010205cb99ecbae891fefdf494aacba4a5bae6cac781dda9f88017010102069addb7e6d2, 0x1d3bbc2c7cfa19298ebc8f9efa1edbad9818d87e69f83acc4f0e3c483f4a39e9580aa86c888a2ddeab9c4b28a8db3bfa2d09e901713000262faf1e4a9bbb89f918ff3ddabc2f28abcdfffb1adbbc2a4fc8eabbc85aa86c4faaaef8fe090cac2b1d1f887f7cbf0fc9289e7bed0c01010000203d3cecfacc2c7e6f1abb5e5f38b80c7988683b48fce8e83d2f29db5d0d99094c2d494badbecff87a7bab3b981b3f6d3b6acab801709000202ef909b80cec5c3a3fa8ea1d3afcabae3dbd7fcd6e4dd99b4ded7b0ecd593bde5a1f78cd4fb91e9e4c48afea48fa184ddad8886d5c01701000207a6a29bc3ab9c8bfb86f5a8e88e87c795b5b58fc88685b0d08cc581b58e8aaae8fc879180b8aa8ad6bcadde8089d4b6beefa2b283801e0199dbb492c9a08f8cd6efcdacbfc5b9f6c583f88a9397b5cc9d8c95e4a4f6f3c283f98894c581afb7badbf3a7cdd8a0000b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a0200020202030108d8c70289ce71c715ee18f3a254cdbb04fe9a028295002188c2cfd7b4d19c9dd382a2edfea186a8d5800ea2dd01a9d68f10efd607bff911e2f856e0fa07f4f103b9940006dda2ecd3dbabbf8de2e2e288e9ffcdf3e48014c811ad960195bdd649f3c301d0810acbf15d8f8d2df286006f84a59bcca0caa985d9fac1a2e6fc94f680, 0x1f3ebbe9ee79da9f5ab9bb4da9fe0b3d58ed8cfb8a7a2efb08cb890dccda5dbfbad909df3faab9fa7adc01713010203a0d1fbeed9cfe8e3c4c9f3eec29baaa4c28fe78bc8bf93f1d9e689c3a1e986c1cc99eeee9abb8afceff5b6a8b0a1f5f884b3868dc0170f01024ce6a3f59abdc1babfebf8facfb8bcd0f5c6af8aa8feaac6d89ac799fdc5f993a6e8f497818e99cba1c6b7a0cfa585bbe5aaf1d7b7c0080801020181c3fec4f2e0bce0c7d5b38aebbcaab7dbd38bc5bc8c9e80a3d2a29cf7facbea93e7c59fd0bcd0b6ab9f9af0d8bab0e8bbebbc96f81307010214ec8186c5d594a8b691849db6c2c2c1c69bc8d5d98682fc84cf9cc091a1bc818b8cf4c5e2b2e9a280d883f3f4f4b5eaa48790bef4f007070102039aede3afbbf4ebeca98c8798f7b3bcfd89f7d3f3a9c8feb7e2baa6a6fdeafcad96a4e0a5cf8d9adfd7bde8e18b8cf5a0aedd99ebe406060102098998d9f7e8b9a497cce9acd69ea190fecbd5d19ef6b7cab0aed89ab0e38ca4d2a6aba6dedbc7a89aaaf7bae5b9f9addb8bdeaccd8a0604010202be99d189c3adcdb2ea8ee8feb3f6f296e5c4c5abb8ffadaf89d0918a83c4bdd5dddce6f4c2e4c3a382b5bdfbe4facdd4d9e5b1e9ec0404010240ec88e3829f98d687e4a5e8ffe3a7c8b8dc8fb6c3c7bed6dad7c795e891bbcda5f3e6d2c285dd8fca878db8d9ccdffef5d5cce2ee170101020280de, 0x1c19097c4a1a59f8c959be5f3dcf3e5ab8bcaa0e9fdc19b92f58b9b98b2898ed3acef87c9b3a0130c02025a85e096c1e1dedd9f86fabed0e0f8eabc9fe180e4fc9ebce7adbceacdc2b9a886afd5ddcad8d6f3a6abbca7d7afa19b969ecfe5a80f0c020230a9b7ad8ad683a3b782cea1f59898b0b4f0e685cdbfa9e59ac9ba95afc9d4f7eca6b6f0e3c5c8fb9fab94f2838caea4f58eeea3ec090902022cca85a5f7acac9da1ef8db3aee5f4d4a6f5d5bedcf6be90ca84dc9ce08de8bd86fd828bd0d9e083cf8cc5aea6ccf9a6f4bfe0eccc13070202109f9c938dede6d29ff4f5e8c182e981dba78298e2948499e9dfa1ddbac1f7b2fb94a3b2a7bfcefb8dc2b7c4ddb9b998acdec2f3a6a01106020209f3d1bf8aeca484d3e3f7d99e91dcdcff91f4daa4d8b7fee6a5a19691f584b59d9d8de4dcb58deef994f1cd8ac08dbbb9b1ab83e490090602024df586d2c0a8a0a4c38fc796a3af83e8f9fcf5dfa481e0f8a5c3b7cce1cccbf5eaaac1c4b0d8af83b6d888d180eebaaac29b9999e0130102021fc0fd82a4a7e891adfad1f6ffa6e7ccb9c4a7c2fec0fde0dfb3b7e1c09aadafe3dfe084aaac97fad8eae5a9a2e2aa81a6e9a0e6d41101020201e0dfce83f0c9dbf7a5bda391dc88d280d2c3a585bfc3bbbcec8f9eb2e89b9abbe0928f9a9f849da682e6ad86d9d4eed0d5aed0dff4060102022beb8489ba8edf99a5e1ef, 0x18885d6f698b0fac7f885cadae1bc85f6ede018e8daae13f9f9dc02ee96eb03b2ddbf0397b0fdf803d2d1ab9f01f184d9a66da3a0d70004a89f9794afaca2aaf1c7abb6bd9baadde0bbeef7d9c5c0939d84b2a2b1ec94f6ceadea83a0dc969eb5a19fcd99c01dfca68f63f4e6e402e0e9b103a1e3d502f9c1c1f62b87cad303f5a08f8b02869e81880001b781f6e2a0cef899e3ced4ab84d9f8bcf8ccc0b3e8faa7e08cb8f099a7a698f2f3e2d48e80fbd2e7aa8eae97bfd007c497b38903c8b1efb405cfe3feee0385b3d9b503bda087e60289cea0c702dfd18da701c08af9ee000cc1bd9780c48387f08fa3ffb6ec86fcd88eadfffad19efce4c185999796a2adc2bd84fb9dc0a7a49ce99cc8ed8003eb850ce4fc2d9335bd30a99405c1bd4094bf21c8ba0030b2a1b39ab0d2bcc18cdbf5ffe29189da9998ecd1bea29297b0d5e6d6aaf0b0e0c2cde2a6fce5ebe3e4e5feff9df88a8036ea836a80d26fcfc136f3f418e4ca34dfa53ba1ce1d80d50005c2e8e9b098f4ccdfbbc7d4b6b282e5b2e0f5cecad1c48bdf95af9bd8d8a3a99798949b9ddfbfc7f09bf48dccc9d3f4c0029fca0fdaaa0b95d806989d2f87c6379de81699900db9d70003d1e5a5d38ea28ac4b39bbdfcd3dceccca5cafb8181f0a9fdf482f8d6eed6d2e0a280b7fdaee8c5a7a8b6a9e9a8cae7f0170f02020184dfd6ceec8fdd9a95a2a9ac8bd8b6fe, 0x1ec91e396abeabcf594cbd8050502020192f8a9b9e2898288e5e5a5c7e1f7aef4800504020202a7ced8ffa685fea0b1a796918481fc8013010202109fcbd184c893c7b1a9d9bbdcd496e7ac80131301024befb6dacdcdaaedd0b89eb6c88aa396b7ce1311010211909584a3bba286f6a285f3b4c3ea8f8796170c01024cd9c7aed6f49cfcafeb9db7a88ad2fafe801107010227a4e882b5deabbfa8ff978ddb98f7eec9b81706010202e183c5aafa8fd4fddd92cf9ba2a8fcd4b2801106010202d4d9c2abd0e9f8fde3828edbb5c99bc4f6c80505010201e6e2dc90fc9d81c2acc7ab8c9db0a0e380130101020896f392d1a8e8eede97a8a49d8dfde89c801313000249808db2bcc8acc39fe8f8938ed6edf8def0170c000214d59fc8aa85c7c9e9c182acbccfed99fe901708000230f29fbb9f82cb82e19cedb9f69cccf4add01107000225ba88c8bd89c3aa879297b98fb385d9c4c81706000202dfb0939ede9ec9d5ea97c4b2a2e9d4d2b8b01106000202eaa2de8fdeaf9dc2a189c784d68299dbb1b80505000239eeaafcd9e286f49af4d6c1a8b1abb5801b7af9c7ab86a089d1c3f1c0000b02080201120030043603120403020202031104080c010e031203100400020206030b0200020202030119cde8fd01d78f98b802fb9dbbb501bfb0d2e40136a39cd7d3a1fbd7b09790aa89bf85d695c3cbd495ffdedfc0dbcbbd, 0x106041c031313110f170c0d04060404010f0006000100091313110f170c0d04060404010f000d000600091313110f170c0d04060404010f000d00060009061304020202020313131311170c0c0c07060d04060410010f0106010a13131311110f0c0c07060d04060410010f0106010a13131311110f0c0c07060d04060410010f0106010a060b02080201120030043603010d040a040904000e040e03011313110f110d170c1106110113000f000400091313110f110d170c1106110113000400081313110f110d170c11061101130007061310030202060313131311110f170c1106110507051301060105010a13131311170c1108110611050705130105010913131311110f170c11061105130107060b02080201120030043603011104080c010e031203100400020206030109f1b30e98f004c57d379ed44cc2ff0493fb0493fc007ceef4f0a1ed8486fee6a2d58001ef0d884aa5d04b8a8b3809ea339deb339dec0016f0fd9dc3c79a9897a9f1801313020247d0f491b285c9d1dff5a4ea9fe199889e8a1311020234bec6c3eda3c7abcef5a2fdab8da6e8f9e2170c020274c0a6d6f3c986d2d4ac9cdadbd8cdfbdc801107020224a4d2c0c0ed9f8da0a8e0f98ccd8ad786a80707020202c0c18a8989e794d4c0b3c182d797e8801706020202b2d8b8908bb3c4ab86d687b09382d6bb8e801106020202c4f08ad385b299, 0x11313110f140d110d170c140c110904010000091313110f140d110d170c140c110904010000091313110f140d110d170c140c11090401000009061313110f170c0d04080404010d0002000000091313110f170c0d04080404010d0006000200091313110f170c0d040a0408040401060002000906010e020106020204111c0d140a0609] private def node60:Certificate:=PackedParametricCertificateData.decode 17 data60 private def data82:List Nat:=[ 0x1131313110c0c0f09090908080f070606080106010a131313110c0c0f09090908080f070907060608010a131313110c0c0f09080813070f070907060608010a060b020802011200300436030402030200020302030a040904050400020406030902080204020106040803131313110c0c08080f07080606061001080106010a131313110c0c08080f07080606061001080106010a131313110c0c08080f07090706061001080106010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d0409060102030603131313110f091008100709070c021001170009131313110f091008100709070c021001170009131313110f091008100709070c021001170009060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node82:Certificate:=PackedParametricCertificateData.decode 9 data82 private def data137:List Nat:=[ 0x188afb1d499fb9fdca2c2faaaa0c01313010201b38b9dfdb48b8dbfa782d69ce0d290c1f4e8e0801311010201d7e7cfe38aa48796c382f0db90a8b88f94b9e080131001026cbed9fda886dcd7b4cdc9ca9a80aeedede2e0801110010204fb9282d69df5b2bcbbcaad81f484ddcda2dc80100901020addb4bee79dabe9c59c85b4c7bcc2a1c3dbb4800707010210f7bb9eb1b1ccf29ea9f1c9b0b3e6bec3a0ae801306010206af94c6fb9492d3f191d8e9f7fbeacddaf2e0800606010238919dcfa0e2c3b08382eb98b8d9aec5cb91d480040401020eb78ce6ca92bfedf88fb986b8bc8ddcfc9e9a801313000201b2bbb4f2b4fde2958badc5fdd18ec3f799f8fc801311000201d7958988bbddada39de4bbbdb5cdc6a4cfd6cc801310000267c0d69792ebaefbe881e2effeb3cd9e95b6b280111000022d998bf1c0b0c9eba0fafbd1dc82cf9fb983c6801009000205d6f9beb0b7a4ceaabb909e95f5e9eeaa8584801307000203c8ec9bb1bae489b79beec4a99088c2849fc080070700020d8fd5cbd980f6b7c8ffedc4ded1e3e2d5f7b680060600022ba6f6f3cbbdfc9289a89ee588dbb3e5b4f6d080040400020ad7c4e9deaee28aeea1f193b8b384c1dfa9c6801e01c48db0bec9c38fc4a2f7dff280000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1b28499869afac499a3b0131300023ac0b7ae809abc97c4f0febceb881311000232b9b7879292dab8cc9696db82e80808000209dbfcea81f5938ac7a896f78fc81307000213b0bdcee49bb3b094ff89e4cee006060002118fbbb5d1bb848dd2c1a583c6f60505000207b1918198d6c8eee5cdd6f381b80f04000210b394d2aab095dca9cbdaa7bca0080400020d93f3cdf8eac498bdd694d6f9c80404000213f6f8bc82b68cf19aac998fa9ce1e3b9dcb9ad889fc000b02080201120030043603040203020002030203010103ce820ab38b01c6d035cb06b3811ff5e344f4f821f4a70001c8bbcba9aec8fbffbed0dee3fed0802ac1a129a5fd0188e1cc46c49103f3a11391804794d126b5ba0004f3c5ebb081ecbe9ad1eaa59f90801313020201bdcb92c1838886aaa39fb2fffad8d2a1a4dbb9ee1311020201a5c993f4d9d7bf9aa8f5d7fdd08ec7ef87b7a8ec1111020226dba8afbca4c4eee0a3e7b9d7fab3dcc5849cde1310020268b3dfaec4b8aca19af1c5a1faf1ed89c0fde2c01009020205c89a8a848ca391cfdcbd97a88ca897fab1d8c00707020207dabbefbbfed3a3af959184dbeef691cfa2aea01306020222bfbfb78aeadad2bef3c4c9d4d9c5af9689a080060602021ae4eaacbb96c7d2fb8e84e280ffa395e6c8a6f0040402020ab7f4ddb3d5b38dafe3efdfabecc8bbd1e7e5b006010202058ad3ace7cc, 0x1000a1313110f130908080d02090213010501010102000a060c020b020406000604080312040302020203020400060202041313110f080813060f060d040d020501010102000a13131311110f080813060d0213010501010102000a1313110f130908080d02090213010501010102000a060c020b020206000c040e031204030202020303948c05a39f698c7ba307deec2eafb13faffa1d9f8d003cd6abe5a5b8f1bbf01313020237e48bd4f3fbd4e6d799d3fbc4c813110202388595edfbc9b094dd9495aef5e80808020209a9899c86ef8094e395c088b3e8130702020becfed785b4abfaa4e8e09988c0060602020cb9e8afb980d3cee6e2fbd0d0dc0605020206b1a491d3feddce8ee292e7fcc00f0402020e949dc6deaac2ac8ce2c5fdbd80070402020a828fea83a2f0f68a91e2e0eaa80404020208e7d4b1f9f6b5cff5e5b8e6f6e00501020204c1d2f9a2bba5e7bcb884fbfb8013130102398fc3a8acb9dadccfecc9f2fb881311010235d1e392f9b5c2ddb4c0a7fbf8a80808010209bedece92fddb9088bdd698a2f0130701020fc8a4a6f1dac99a819dc0d594b0060601020cf4c79b8ac1cbf7d6c3fa8ea1bc0505010211e18cbbe6abcca48f83d6ddfbe8130401020f9083ccb8919a94dc8cdb90c8b0080401023687b09bbdd396e4a0d9e1ce8007040102109ebfacf9dca0ef9fa996fbe2c80501010202b18ac3, 0x10a13131311110f1109090707070d020c01080101010a13131311110f1109090707070d020c01080101010a06011313110f09070f060d0201010d000c000800091313110f09070f060d0201010d000c000800091313110f09070f020d0201010d000c00080009061313110f1309080808050d020a021301010102000a1313110f1309080808050d0209021301010102000a1313110f1309080808050d0209021301010102000a060101131313110c0c0f091307070706060202010107000a131313110c0c0f091307070706060202010107000a131313110c0c0f091307070706060202010107000a061313131111110c0c0707060602020901070101010a1313131111110c0c0707060602020901070101010a1313131111110c0c0707060602020901070101010a0601131313111310130606060d0508050703020201010a13131311131006060d05080513040703020201010a13131311080806060805130407030202010109060b0208020112003004360301011313131113100c0c130606060d0508050c0206010a131313110c0c08081307060608051304020201010a131313110c0c08081307060608051304020201010a060b0208020112003004360304040106000203040302040006020203010b0200020202041313110f130908080d020a0213010501010102000a1313110f130908080d02090213010501010102, 0x11313110f100f0c0c0909100611011001040100000a1313110f100f0c0c090910060f041001040100000a1313110f100f09090907100610010401130000000a061313110f100f100d0909090710060401020000000a1313110f100f0909090710060f040401020000000a1313110f100f100d090710060f040401020000000a060113131311100f1006070607050f040804070302010a13131311100f1006070607050f040804070302010a1313110f100f1006070607050f040703060102010a060b02080201120030043603011104030202020313131311100f08071006070607050f04060102010a13131311100f08071006070607050f04060102010a1313110f100f08071006070607050f04060102010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a02000202020413131311110f09070f060d02080101010c0008000a13131311110f09070f060d02080101010c0008000a13131311110f09070f060d02080101010c0008000a0613131311110f1109090707070d020c0108010101] private def node137:Certificate:=PackedParametricCertificateData.decode 9 data137 private def node138:Certificate:=.split node82 node137 private def node139:Certificate:=.positive 1 [(1,1),(1,7)] node138 private def node140:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node139 private def node141:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node140 private def node142:Certificate:=.positive 1 [(1,0),(2,10)] node141 private def data193:List Nat:=[ 0x10613010d01060102010a060e020b06020c00140418031204030202020313130d0d0c0c0f0908080d0606060202130101010a13130d0d0c0c0f0908080d0606060202130101010a13130d0d0c0c0f0908080d0606060202130101010a060b0208020112003004360304020302000203020301010e060812030e0206041404010d300c020a1a06200430030802000202020413130d0d0c0c13090f0907070d060606130108010a13130d0d0c0c13090f0907070d060606020208010a13130d0d0c0c0f09130707070d060606020208010a060b020802011200300436030402030200020302030c02090605040304030b02080604040108040c0313130d0d0c0c13090f0907070d060606130108010a13130d0d0c0c13090f0907070d060606020208010a13130d0d0c0c0f09130707070d060606020208010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130d0d0c0c0f0910080d0809070c0210010913130d0d0f0910080d0809070d060c0210010913130d0d0f0910080d0809070d060c02100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203060804060018031a0305080306001a031c03, 0x113130d0d0c0c0f090909060609010801010107000a13130d0d0c0c0f090909060609010801010107000a13130d0d0c0c0f090909060609010801010107000a0612020c060106001e04200413130d0d0c0c0f0908080d0606060101080007000a13130d0d0f0908080d06060601010900080007000a13130f0f0d0d0f090808060601010900080007000a06131313110f0908080d060705070313010d0101010a13130f0f0f0908080d060705070313010d0101010a13130f0f0f0908080d060705070313010d0101010a06010110040a0c0104000e0412040f020906011200020414040e0608120214000e042204131313110f0908080d06070313010d01050101010a13130f0f0f0908080d06070313010d01050101010a13130f0f0f0908080d06070313010d01050101010a060e020b06040c0008040c031204030202020310040a0c0104000e04120413130f0f0c0c0f090c0813010d010601020102000a13130f0f0d0d0f090c08060613010d01060102010a13130f0f0f090c08080806] private def node193:Certificate:=PackedParametricCertificateData.decode 13 data193 private def data246:List Nat:=[ 0x10f130a0f0a13090c090d060606070401010c000a0f0f130a13090c090d06060607040d0101010c000a060a020106001203140304020302000203020301010806070603080206040e04010d1c091406060506041c03080200020202040f0f130b0c0b130a0f090b020d000c00060002000a0f0f130b0c0b130a0f090b020d000c00060002000a0f0f130b110b130a0f090b020d000c00060002000a060a0202060006030803120403020202030f0f130a0f0a0c090d06060607040f020c0008000a0f0f130a0f0a0c090c070d06060607040f0208000a0f0f130b130a0f0a0c070d0606060704010108000a060a020106001203140304020302000203020301070204020202030f0f130a0f0a0c090d06060604040f020c0008000a0f0f130a0f0a0c090d06060604040f020c0008000a0f0f130a0f0a13090c070d0606060404010108000a060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306030f0f0f0a13090f0909070d06170110010d01090f0f0f0a13090f0909070d06170110010d01090f0f0f0a13090f0909070d06170110010d0109060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203060804060018031a03, 0x10f0f130b0c0b130a070706060f0101010b0008000a0f0f130b0c0b130a0707060601010b000a0008000a0f0f130b0c0b130a090707070f0101010b0008000a060c020b0201060018041a040f0f130b0c0b130a07070b020d010601010108000a0f0f130b0c0b130a07070b020d010601010108000a0f0f130b0c0b130a07070b020d010601010108000a060f0f130a1308080707070703080201010d000c000a0f0f130a13091308070707050703080201010c000a0f0f130a1308070707050703080201010d000c000a0601010a0209020102000404060409020802010c0002040e0408060706020e00080416040f0f130a1308080707070703080201010d000c000a0f0f130a13090f09130808040703080201010c000a0f0f130a0f09130808070703080201010c0001000a060a020406020203120403020202030a020902010200040406040f0f130b0c0b130a0f090b020d000c00060002000a0f0f130b0c0b130a0f090b020d000c00060002000a0f0f130b110b130a0f090b020d000c00060002000a060a0202060006030803120403020202030f0f130a0f0a13090c090d060606070401010c000a0f] private def node246:Certificate:=PackedParametricCertificateData.decode 12 data246 private def data297:List Nat:=[ 0x1020a02080101010a0008060f0f130a0c0a0707170601010d000c00080006000a0f0f130a0c0a0707170601010c000800060001000a0f0f130a0c0a070717060a020c000800060001000a0601121006020206030804010400020306040f0f130a0c0a17060c0306030d000c00060002000a0f0f130a0c0a17060c0306030d000c00060002000a0f0f130a0c0a17060c0306030d000c00060002000a06160409040212000c0412031204040201060304030f0f130a0f0a0c090d06060607040f020c0008000a0f0f130a0f0a0c090c070d06060607040f0208000a0f0f130a0f0a0c070d06060607040f02010108000a060602010e002003240304020302000203020301010f0f130a0f0a0c090d06060604040f020c0008000a0f0f130a0f0a0c090c070d06060604040f0208000a0f0f130a0f0a0c070d06060604040f02010108000a060602010e002003240304020302000203020314040704010603060310040002020603010e0402020206030d04090601020306030f0f0f0a13090f0909070d06170110010d01090f0f0f0a13090f0909070d06170110010d01090f0f0f0a13090f0909070d06170110010d01090616040804011e0048045203040203020002030203140407040106030603100400020206031204050402060306030e0402020206030d040906010203060301010d04060c00160312030a100402020603, 0x10f0f130a1706140608041702080201010800090f0f130a1706140608041702080201010800090f0f130a170614060804170208020101080009060a02010600120314040f0f130a1308080417020802060101010800090f0f130a1308080417020802060101010800090f0f130a130811081702080206010101080009060a0204060202040108040104000203060407020106000203080408060706020e00080416040f0f130a1308080417020802060101010800090f0f130a1308080417020802060101010800090f0f130a130811081702080206010101080009060f0f130a0f0a130807040802070201010c000b000a0f0f130a0f0a130807070802070201010c000b000a0f0f130a0f0a130807070802070201010c000b000a06011204030202020308040104000203060407020402020204060603020206030804010d1c091406060506041c03080200020202040f0f130a0a0417020a020801060101010a00090f0f130a0a0717020a020801060101010a00090f0f130a110a17] private def node297:Certificate:=PackedParametricCertificateData.decode 12 data297 private def node298:Certificate:=.split node246 node297 private def node299:Certificate:=.split node193 node298 private def node300:Certificate:=.split node142 node299 private def node301:Certificate:=.positive 3 [(1,0),(2,6)] node300 private def data353:List Nat:=[ 0x10c020b020206000c040e0312040302020203131313110d0d080813060606040413010f0105010a131313110d0d080813060606040413010f0105010a131313110d0d080813060606040413010f0105010a060b0208020112003004360304020302000203020301010e060a060302030204010d040c060902080604040308020002020204131313110c0c08080907130606060f02080106010a131313110c0c0808090706060f02080106010f000a131313110c0c0909080813070907060608010f000a060b020802011200300436030402030200020302030a040904050400020406030902080204020106040803131313110c0c08081306080606060f02080106010a131313110c0c0808080606060f02080106010f000a131313110c0c0909080813070606080106010f000a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d0409060102030603131313110c0c1309100810070f070907100109131313110c0c1309100810070f070907100109131313110c0c1309100810070f070907100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301010702010202020306020202000203040305020102000403060304040212001c031603, 0x11313131109090907080713060d020801010108000a1313131109090907080713060d020801010108000a1313131109090907080713060d020801010108000a0612020e020002030204131313110907080713060d0201010d000c0008000a131313110907080713060d0201010d000c0008000a13131311090708070d040d0201010d000c0008000a06131313111309080808050d020a021301010102000a131313111309080808050d0209021301010102000a1313131113090808080507050d020902130101010a06010110040c0400020302040f020b0201020302040b02000202020413131311130908080d020a0213010501010102000a13131311130908080d02090213010501010102000a131313111309080807030d0209021301050101010a060e020c060406000a040c031204030202020310040c04000203020413131311080813060d040d0213010501010102000a1313131108080d0713060d0213010501010102000a13131311130908080d040d0213010501010102000a06] private def node353:Certificate:=PackedParametricCertificateData.decode 14 data353 private def data407:List Nat:=[ 0x10d0c0c130908080d0606060202130101010a060b0208020112003004360304020302000203020301010e060812030e0206041404010d300c020a1a06200430030802000202020413130f0f13090d080808080613010601020102000a13130f0f13090d080808080613010601020102000a13130f0f13090d080808080613010601020102000a0612020b06020c00120416031204030202020313130d0d0c0c130907070d0606060202130108010a13130d0d0c0c1309130707070d060606020208010a13130d0d0c0c1309130707070d060606020208010a060b02080201120030043603040203020002030203010f02080604040106040a0313130d0d0c0c130908080d0608060606130108010a13130d0d0c0c13090d08080813070d06060608010a13130d0d0c0c13090808130707070d06060608010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130d0d0c0c130910080f070907100109000913130d0d0c0c130910080f070907100109000913130d0d0c0c130910080f0709071001090009060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203080206020008030803070205020008030803, 0x113130d0d0c0c13090909080813070606080101010a13130d0d0c0c13090909080813070606080101010a13130d0d0c0c13090909080813070606080101010a0612020c060106001e04200413130d0d0c0c1309080806060d0101010c0008000a13130d0d0c0c1309080806060d010101090008000a13130d0d0c0c1309080806060d010101090008000a0613130d0d0c0c130908080d06080513010d0101010a13130d0d0c0c130908080d06080513010d0101010a131313110d0d130908080d0608050705130101010a06010110040a0c0104000e0412040f020906011200020414040e0608120214000e04220413130d0d0c0c130908080d0613010d01050101010a13130d0d0c0c130908080d0613010d01050101010a131313110d0d130908080d0602021301050101010a0612020b06040c0006040a031204030202020310040a0c0104000e04120413130f0f0d0d13090c08070313010d01060102000a13130f0f0d0d13090c08070313010d01060102000a0f0f0d0d13090c0807030d0106011300060002000a0612020b06020c00120416031204030202020313130d0d0c0c130908080d0606060202130101010a13130d0d0c0c130908080d0606060202130101010a13130d] private def node407:Certificate:=PackedParametricCertificateData.decode 13 data407 private def data457:List Nat:=[ 0x10a06030b020d000c00060002000a0f0f130b110b130a06030b020d000c00060002000a060a0202060006030803120403020202030c0209060504030404010806070603080206040e04010d1c091406060506041c03080200020202040f0f130b0c0b130a06030b020d000c00060002000a0f0f130b110b130a06030b020d000c00060002000a0f0f130b110b130a06030b020d000c00060002000a060a0202060006030803120403020202030f0f0f0d13090c090d06060604040202080113000a0f0f0f0d13090c090d060606070404040c0108000a0f0f0f0d13090c090c070d06060607040f0108000a060a020106001203140304020302000203020301070204020202030f0f0f0d13090c0909080d0606060c01080101010a0f0f0f0d13090c090d0606060f010d01080108000a0f0f0f0d13090c090d06060604040f010d0108000a060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306030f0f0f0d0d0d13090f081007090710010d01090f0f0f0d0d0d13090f081007090710010d01090f0f0f0d0d0d13090f081007090710010d0109060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203080206020008030803, 0x10f0f0f0d0c0b130a090707070b0201010b0008000a0f0f0f0d0c0b130a0907070701010b000a0008000a0f0f0f0d0c0b130a09070b0201010b000a0008000a060c020b0201060018041a040f0f0f0d0c0b130a090707070b020601010108000a0f0f0f0d0c0b130a09070b020d010601010108000a0f0f0f0d0c0b130a09070b020d010601010108000a060f0f130a1308080707070703080201010d000c000a0f0f130a13091308070707050703080201010c000a0f0f130a1308070707050703080201010d000c000a0601010a0209020102000404060409020802010c0002040e0408060706020e00080416040f0f130a1308080707070703080201010d000c000a0f0f130a1309130808040703080201010c0001000a0f0f130a1309130808070703080201010c0001000a060a020406020203120403020202030a020902010200040406040f0f130b110b130a06030b020d000c00060002000a0f0f130b110b13] private def node457:Certificate:=PackedParametricCertificateData.decode 12 data457 private def data508:List Nat:=[ 0x1020801010108060f0d130a0c0a07070f060a0201010c00080006000a0f0d0f0c130a07070f060a0201010c00080006000a0f0d0f0c130a110a07070f060a020101080006000a0601121006020206030804010400020306040f0d130a0c0a0f0606030a020d000c00060002000a0f0d130a110a0f0606030a020d000c00060002000a0f0d130a110a0f0606030a020d000c00060002000a060e020906021800100418031204040201060304030f0f0f0d13090c090d06060604040c01080113000a0f0f0f0d13090c090c070d06060607040f0108000a0f0f0f0d13090c090c070d06060607040f0108000a060e020806012a006404720304020302000203020301010f0f0f0d13090c0908070d0606060c01080106010a0f0f0f0d13090c090d0606060f010d01080108000a0f0f0f0d13090c090d06060604040f010d0108000a060e020806012a00640472030402030200020302030c020706010803080310040002020603010e0402020206030d04090601020306030f0f0f0d0d0d13090f081007090710010d01090f0f0f0d0d0d13090f081007090710010d01090f0f0f0d0d0d13090f081007090710010d0109060e020806012a00640472030402030200020302030c0207060108030803100400020206030a02050602080308030e0402020206030d0409060102030603010107100506001a0318030a040302020203, 0x10f0f0f0d130a110a14060f020a0201010800090f0d0f0c130a110a14060f020a0201010800090f0d0f0c130a110a0a0714060a020101080009060a02010600120314040f0f0f0d130a110a0a020802060101010800090f0d130a110a130808020d01060101010800090f0d130a110a130808020d0106010101080009060a0204060202040108040104000203060407020106000203080408060706020e00080416040f0f0f0d130a110a0a020802060101010800090f0d130a110a130808020d01060101010800090f0d130a110a130808020d0106010101080009060f0d130a0c0807070902080201010d000c000b000a0f0d130a13080c0807070902080201010d000b000a0f0f0f0d130a130808070707080201010d000b000a06011204030202020308040104000203060407020402020204060603020206030804010d1c091406060506041c03080200020202040f0d0f0c130a110a0f020a020c0108010101090f0d0f0c130a110a0f020a020c0108010101090f0d0f0c130a110a0f020a] private def node508:Certificate:=PackedParametricCertificateData.decode 12 data508 private def node509:Certificate:=.split node457 node508 private def node510:Certificate:=.split node407 node509 private def node511:Certificate:=.split node353 node510 private def data561:List Nat:=[ 0x10c0a0f020a02080101010f0008060f0c130a0c0a110907070a0201010c00080006000a0f0c130a0c0a110907070a0201010c00080006000a0f0c130a0c0a110907070a0201010c00080006000a0601120403020202030804010400020306040f0c130a0c0a0f0806030a020d000c00060002000a0f0c130a0c0a0f0806030a020d000c00060002000a0f0c130a0c0a0f0806030a020d000c00060002000a060e020906021800100418031204040201060304030f0d0f0c13090c090c070d06060607040c0008000a0f0d0f0c13090c090c070d06060607040b0008000a0f0d0f0c13090c090f080c07060607040b0008000a060e020806012a006404720304020302000203020301010f0d0f0c13090c090d0606060d01080106010c000a0f0d0f0c13090c090d0606060d0108010b0008000a0f0d0f0c13090c090f0811070c0706060b0008000a060e020806012a00640472030402030200020302030c020706010803080310040002020603010e0402020206030d04090601020306030f0c13090c090f0709070d060c0610010d01090f0c13090c090f0709070d060c0610010d01090f0c13090c090f080f0709070d0610010d0109060e020806012a00640472030402030200020302030c0207060108030803100400020206030a02050602080308030e0402020206030d0409060102030603010107100506001a031803, 0x1130f0f0c130a0c0a14060a0201010f000800090f0c130a0c0a14060f020a0201010f000800090f0c130a0c0a14060f020a0201010f00080009060a02010600120314040f0c130a110a0c0808021301060101010800090f0c130a110a0c0808021301060101010800090f0c130a110a0c080802130106010101080009060a0204060202040108040104000203060407020106000203080408060706020e00080416040f0c130a110a0c0808021301060101010800090f0c130a110a0c0808021301060101010800090f0c130a110a0c080802130106010101080009060f0c13090c0913080c080802070201010c000b000a0f0c13090c0913080c080802070201010c000b000a0f0c13090c0913080c080802070201010c000b000a06011204030202020308040104000203060407020402020204060603020206030804010d1c091406060506041c03080200020202040f0c130a0c0a0f020a020c01080101010f00090f0c130a0c0a0f020a020c01080101010f00090f0c130a] private def node561:Certificate:=PackedParametricCertificateData.decode 11 data561 private def data610:List Nat:=[ 0x10108010101081513150c0f0815020801010106060f0d150c0f0c1309110909070c000800060001000a0f0d150c0f0c130909090f0809070800060001000a0f0d150c0f0c09090f0809070f060800060001000a060112100602020603080401040002030604130f150c0f0c13090c0306030d000c00060002000a130f150c0f0c13090c0306030d000c00060002000a130f150c0f0c13090c03060303020d00060002000a060e020806022a0010041e031204040201060304030f0d0f0c13090c090c070d06060607040c0008000a0f0d0f0c13090c090c070d06060607040a0008000a0f0d0f0c13090c090c070d06060607040a0008000a060e020806012a006404720304020302000203020301010f0d0f0c13090c090d0606060d01080106010c000a0f0d0f0c13090c090f0806060d010a01080108000a0f0d0f0c13090c090f080c0706060a010a0008000a060e020806012a00640472030402030200020302030402010402020310040002020603010e0402020206030d04090601020306030f0c13090c090f0709070d060c0610010d01090f0c13090c090f0709070d060c0610010d01090f0c13090c090f080f0709070d0610010d0109060e020806012a00640472030402030200020302031204010202020310040002020603100402020202030e0402020206030d040906010203060301010b300902070a031003, 0x10f0a13080c08140608020f0101010f000800090f0a13080c08140608020f01010108000813080c08140608020f010101080007060b020902010c00240428040f0b0f0a13080c0808020c01060101010800090f0a13080c0808020c010601010108000813080c0808020c01060101010800070612020906041601020408040108040104000203060408020602010c000404100408060706020e00080416040f0b0f0a13080c0808020c01060101010800090f0a13080c0808020c010601010108000813080c0808020c010601010108000706120209060706030204120403020202030804010400020306040f02060604060002040804060603020206030804010d1c091406060506041c0308020002020204150c0f0b0f0a0f08150213010c010801010109150c0f0a0f08150213010c] private def node610:Certificate:=PackedParametricCertificateData.decode 11 data610 private def node611:Certificate:=.split node561 node610 private def node612:Certificate:=.negative 1 [(3,2),(1,7)] node611 private def node613:Certificate:=.negative 2 [(1,0),(3,1),(2,6)] node612 private def node614:Certificate:=.negative 2 [(5,0),(1,2),(1,5)] node613 private def node615:Certificate:=.split node511 node614 private def node616:Certificate:=.split node301 node615 private def node617:Certificate:=.split node60 node616 private def node618:Certificate:=.positive 3 [(1,1),(8,4)] node617 private def node619:Certificate:=.positive 3 [(1,0),(2,3)] node618 private def data680:List Nat:=[ 0x1acc985d0a8979fd6889e81c38ef2110101025ebfb3b7bff98e909bfef1e1c28bf48add801300010201f8e29ef6a2ebf2a2d7cae5f1c599b78f9eb41313000224eab7e6e3f1b3baf6ebd59bb787b6ea8cdf801008000201aaebc3efe58b8af1e692cee8e3fecdc4c4801307000245d7c6c0d0f6cdfc80add3c5a994dfdfddfbc01107000201a092abbaeb89b6d2b1c8c5aeb8eca8b6e1ccc00807000204a0b2de859fc2e3b9a0a99983a891e9918c801306000204e5a4f298b994b686f69e8787acd1eb82aa801106000241d6f39bdbf3b0ea99fb9d98c9c98d86d79c801301000203c4f6bef7bb87dc9ed5afd1f2f097cc8698801e1dcce4b695ac93a5d0f2ff80000b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030c060a1200080308030113130f0f11080908130711070907130111010913130f0f11080908130711070907130111010913130f0f130811080908130711071301110109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d100c120a360120043003080200020202030107020102020203060804060018031a030502010200040306030606040200080308030708020400060306030604000202060302060002020203, 0x102031104080c010e031203100400020206030b0200020202030a020002020203010a87c714b18202e1a5018df212dcb65ec38d05b2c802b98f000fe7a79285c399d5deccf1cfc18077d61792ae019787aa4b9beb6aa00c9ae3588bf52bdde60001b9b991d1b6d1d2f8ab9bbebe801313020225dd8e8ebf9ac1c8b9fca98ab88c88d293a9801008020201a9d3fbffa5daf5f7a6acb28ce5f18fcfd980130702024587c0e0e9c28c85b6c8fdd7ebd5b4bfacefb811070202019fc6e9bcc6a28bd795c19de981e9b5d2eafdd80807020203fe8fe18880c1a9f08889b0ffd2e396c0a7801106020248ec95ecb6ba9cb8fdae8c8a9fc7bb92d382a80606020202bbfea1ebf6f381bd8dfda599ccbec0befa8013010202029fa7e2a5908a97b0abe9c8e084d3bbb5cdf01101020201c9f18ff7fcc59ac3888287c0e1ff80f7b0a0130002020199b4f2d8f0f3eab087b1ef838589f78acb881313010225bcecd09798fdff969aece98ad0bae6c5ab801008010201aaa3c1d3b19e97d88ed187969fb69df7de801307010244a1de8bb5e5a1b3f483b280a588a0d6a5ffb211070102019ac0d7eda7f6b8b9efc19acfd8ea9dc78dd1b00807010203fbd2efdfe2e390c4b6c9c5e89fd285afdc801106010237d9c2b7c39fd2d0eeaea9eff6c8becd8df59006060102098db580fb8ca8be8ba0b28dd1eddebf9dd4801302010201c8fd81ae, 0x19fb3dbf1859fc0130c010202ea86a0f0a5ceeba48681dbe6c5facae6e0dfb9bdabcd8be4c3c0130801020199a8c79fe081b3ab879e8cc9d6a9c4b9e9c0f7c3daa5c7aed1800808010201b5a1cb89afa0acf6a5f9e6ecfb94e486eede8cd9d0e0ffe4cce00807010202e289eafd98e2b691b99dc79ee9fffc9e9de8cd8be2c0df948a800606010209cfa0b5cac4ecc6d4e3a280b7f38880e1a8fcd9c6e09cf6c8de800605010203c79abdeecc9e9faaa6d1a2f9c8a18495bccba2cad2f190e2a790050401020299968dc98b9e8ecaebfecdee92c991fce1fdf3b7c5ff9de795901313000203b6bd8ceeefadecc996d9ba89c184c7f0858391cef6c7e1c7dd801310000216fabb999fc9a2f9bdeff3fdc2feb5c1e085fab58ec196d7e0d380101000024ac6adeeb88aeacdf691f59db9a3a7c7c4b4c7b8c6c2aff985801308000208cbacf4959da1b2f6c986fcbdc0df89d59984cd9ff3b092b693801008000201aa9c8886c9edddaea7d2d6abf0da9f939fa6d3f6ada4aca1e1801206000201dae286deceaa91d9fc948dc28ff2b2bef2f9e48eaf94bfa6be800f060002018d84a3fa8aafbcc88899e4a083cbd0b9ae99c4ecb0df97d193800606000203cd8ae3d099d6dfe7cb8adb8894eafccdcaf4fd9ea2f0a2e0f5801e01a4d3c7b7cadca8d2b1b49584e2d9a8bc8ebda9c0000b0208020112003004360304020302000203, 0x10206030b02000202020301029de201d7fc4fe750932fb4a83d8dfd22e7c4109687000282baed80cbb09a95f893e1a590fe92e587cd83bca58004a7eb0d9ef259d14fa332f9f00c89b53eb7d320d9c4000190ff84dd9189928d93f1e881ecc5d8a693fef7e0f2802fe6cf2aabb7018f868648be9518d8f214ade2489cc524dbf80002f9b9e4eba6efa8f9c1dd8a9afd8994fa94869af380131302024c84cf9ff4cfafd6db898b87d399eea99f8ab88dbbf7b4aa9dfe11110202079bcead9e8fdad1dbcae5bebbcff289c4fcb990a584818fa0b7e2131002022fc7a390e48ce48fa2eaa6e195c99ee4dc9da4efa98effe4e0a2d0130c020208b8e6d6ee8cd0fa848aa79098dba7c7d5bf919a82c5a8b9c08f90090902025de78ab4f3c682deb5faebf586dee18ef2e48586da91b08efd800f06020203bbcef1da83cfa58ab2abe5a9e0f3e2d480c3bcf7edd0c2d984800606020203ccef8fc3d1c6c3c8e586a2c5c2cacfb2dbac99e9f6f7d4c79e801101020201c2cfaced8f8ddbee94cac0f396e9a6fe92bafed5ab98f6f6d8800901020202caabf38efeb7a6e39afbc1fcbfb1ae86dec3e5acf1819eaa8006010202398db29699dac99894e5b4a5ca88dadab885e2a0fd87ceafe880131301020499faa5e39595dee3daf9d8c6f8f6b69aa393f8d8ec85abcafac01310010228a79fb8d7dadbb1ffb2cbb4f28be7a6b8ac85d0, 0x18cd1d7d7a280b387b989f5c983801313010202b4e9d9b1d3c1e6a8b693a3a9adadb9fcb9cbf494808ee8abd494a41310010201d2e5dce6d6fde6f1f8868ac98df39a88aa98efa4c8e59ad895e790110f010227fbb2e1e8a8d0d9d8bbcaeb84ceef8c9fb2d1c0ef94b9d6bcd8a012070102039edabede8caeb78d968eceada7b68de6db83eb93e685f1c29c8f8011070102408a96998bdbcf9197dad99d8197a3c5e382c38680ed8085ee8e901306010203a7e99c85dbb698afa7bfe6a3cc94e2fcbfcc8394e5a08babb0f0f01106010207d6a4a0f8bfa78da9ded383a4e1d5f5bbbbcd9885eee087a18b92900505010206f8c3fe88e9b0df99dafb9acbe9b3c5aaa9c68a82b2fffba0ff80131300020285ade2b7cdfcfdb7bb9fe9b1dc83dc81b88ccdede1b2aca2e8b7a61310000201de9da3acd0bce9c8aeab8ec8e6ff8c97f1afae89a4c5d38d87e1a01207000205b7a6c6f3e0bdaad987b3ceaac480ce8f8481b3b39cfadadbee83801306000203c79993ffb1d3ebcec3f09bb4b6f6e2c3c3a08090eeda8fc0eff8e01106000208949b83ea8de8c69fc6b6ca8089e688d1a8bceec9af9eb0fbc5f3800505000201b8fec892ec8aaecaf6eef2a1a6cb87cea3a8d48c9391a993db801b02c38298db89fba0c287a8baf182dff9a4ae93e9c0000b02080201120030043603120403020202031104080c010e03120310040002, 0x11313110f130c110813061106110507050501091313110f130c110713061106110507060b02080201120030043603011104080c010e031203100400020206030104baf70cc4d004c96532c9fe4da5a10484a70484a80055cddbd3a7cd9ccee5ffe4adf9f5a195aabddbf0f08031b6fb08e6810c8002ab5cd8d432b89207a0b007a0af0038f8e59dedaab1a4cfb4c6bab3b699efe6b9d9888a8001efba04a6ca089ee807c79f05ce830b91e740ccce40cccd000cba95bce684c3f5b9b9e99cc593e9a9f1e9e6f58012c533dd0194c880019682bf259251fa679ccf679cd00017d9b5ed94f8e9b5bbe1adc6dabdcfe2f981a7928a1313020202c5a39cfc988ecab8b9cbfff7eca4c8e0baa0b9e7d188c7c8c3b1981310020201c9aeb1939ecce7b0f7ebcdb58d91cbc89797e4d9a99291d1f8b180110f02024febe4ef94f6dc89b0e0ff95d89681f1b6c0a6c1eaebbf82b9aac01207020201c3faee9a80f4a4d7dad4a1f3a8a9f4fd87d9e693938cd2a9beb6c0110702026cdbcdb494ae9cd684bde5a5a2bbd9ec87fd80e6d8cad9bf8e80c013060202039886ce81efb6aefdb1e8dddee8f5a1bd81c6fcc19590b5acc0ebf011060202079fa58e9a8ce7d3c7dddabce8e78b92c8a5f2e2e5bad5aceec7df900706020206c9d6c984aa91ce9cc9e68b999f9da9d9cf95f791dcf2b9f88005050202049eb1f0b3ebd6e1d3a8a786c9, 0x11313110f140d110d130c1109110104010000091313110f140d110d130c1108110104010000091313110f140d110d130c110811010401000009061313110f110d130c0d040804040102000000091313110f110d130c08041302110104010200091313110f110d130c080413021101040102000906010e020106020204111c0d140a060906041c031313110f110d130c11060804130104010600091313110f110d130c11060804130104010600091313110f110d130c110608041301040106000906130402020202031313110f130c0807130607060d040604100106010a1313110f130c0807130607060d040604100106010a1313110f130c0807130607060d040604100106010a060b02080201120030043603010d040a040904000e040e03011313110f110d130c13061106110110000400091313110f110d130c1106130111010400081313110f110d130c1306110611010706131003020206031313110f130c11081306110611050705060105010a] private def node680:Certificate:=PackedParametricCertificateData.decode 17 data680 private def data697:List Nat:=[ 0x113131111110f130c0c0c08080f070806060608010a13131111110f130c0c0c08080f070806060608010a13131111110f130c0c0c08080f070806060608010a060b020802011200300436030402030200020302031104080c010e031203100400020206030e060a0603020302030e0402020206030d04090601020306031313110f0c0c0f0910081307100709071001091313110f0c0c0f0910081307100709071001091313110f0c0c0f091008130710070907100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node697:Certificate:=PackedParametricCertificateData.decode 9 data697 private def data744:List Nat:=[ 0x1010206daf5f58bcaf08eb5e789d0ff87dabebce7cbea94c7fcaf81800808010203c6d3a790e9d2aa8eb28999c5ffa7c3b1c79ac8c6b380e59b80070701023cc299c480b8c9cbb9feed80bcc2e6b8a2c9e2d5a6df95dee0060601020996e5959df2f8d7eb9a90d4ccd982c099dcaa8ebac1c68fffa0050501020891d999a6ee88c09b8ff990a7f5fbc3d7dbfdd0d4b294dacfc00404010201e8f0d5f7b39d82a9e9938391bae1f8f9fd96e9a5ca8ff39d801313000207a5a0bf9ae6dfe88e87f5a0e9d6acfeeca6f7faa2a98c83fe80110f0002528df7eefbfedafce58886a4e489baf0c58a8bf6e5d6b6f58008080002018bf7c68682f388e2c4eadcf6c597efeeacc583ecafffd3c1c010060002049dfa9daa99b5f4c2dcc0f9c5d6e0e3c3d9db8ba6db85aaddc00f06000207e1a6eff4f4ca9aa3b5f4a9bdb2a9eac5d1c999e6e396ebb9c00606000202edd8d7a1cfd4a58c8693de85f1a3d3a98bc0c6b0da89eefa80130400020df7c7ae8fa4f1aaa7f5e1c0e3b1a0f9ae90f0f0f891ddb1c004040002019db8f3c3c58cc1d8fec3ead5bcba8bfeb1f6ce918e93a6c9800402000242ca9a9d83d6bce5df8dd6a09392f5b28bcb9298ba87e7f5801e01a6c7e2ebedc0a9c6d3a9d682edb6cbd8f6fba0000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x100020302030f020b020102030203139e14db02c8b601cc872ec09c3dcff721dc840ef2ad000298a6b4e088c1bbbd9ec3e9cfaa8284f9ab9fdc8e8001b3b907b0da02bcbc01d1a331a4820af9ed3ff7f721eae200018dc3adac91c0ade4b08cc39fb0b0959f8e98819a8036a8e92ba2df018dcce045ea8718818e14b5a047d7eb23f6b000038c9feba3eacffcadcbcde081daf8f198edcca5801313020202e1b1ccc18ea482a8a192a9c0b5d4b3bcffdaca9a93eafdc29a1111020208fec5d3b8e780eefefbecf5a890c2d8eecfdf998998b3d6ddca110f02020ff3e594d5afa69caae5a1e4c2eff1c8bb81c8cd9dbcc39dcf88130c020203c2a48da2c8f5bacea5dfd7edbce097908384a4e6e1f8beeef00c0c02027583cdcec5eae5bbe6bff596beb780ceb980878eea87898ee40f06020207abab9f9bfac7d2f3f094d6dfa28790b8e5fa9ae68b84ddcac00606020201baadd9d98bf8aadcbd83a0dae188b5f2cb9eafed97d6ebe8fc0901020214deaa9ce58cdeb588b786e89dede6f3e2a7c294b1b6faedc006010202028f93e2f3ae979893c4c7f1fbc9eeb7a4aac09fa2a9889ab6d8010102021183ad8ffac3f8db9aeeea8df8f2b9e6d2b98a8bb690edf6dc131301020694c8a19cf0b0c085cebd8888ca82adecb88ba4ccf0e7fbdf80110f01020bdc87dbdba0edfda1de99bc8ec2baa4e994aafcbfa6bde8a980100f, 0x10500020208e2f0a5fab3f7eded9bb88bc3efd8f4bf9ed01313010201f7acd283bdecb8e6a3f2d6a885afe3ad9ab0f60f0f010203fbcef5d1bca8b9bac2fc9195cbe490dfd0ad8a0f08010201a8ffe1a8bc92c4b1c4a2def8eadcc0d4a194920f07010201cba0a4dfaba4d59cc482efc7cbe0c8dcbccdc00505010214bdc19facf782a58df3ef8be0adfc9f9490d80f04010203c6c6d8d6e2fba2d2f4c1bcfdadace99eccbd8c080401020289eed9c4b5faf3defaf4f7f8ff99baf591fac60404010201ee92bccb9fc1f1fac48aeeec8ffb89eebcd2c213010102068af0acbdaf86f4fcc2caa2a3ade9ebc3ced605010102329cbac9c19bc68d9488feed85a3e4aeb3e8981313000206b0a8aa929280d5fa94bfbbae91c9b882fac00f0f00020693ffd4a3d9be82e9d8cbbc87f9b3aabd8fa2c008080002189fbd9494cdf4d0cee8b3c0a7d5f7d0c5f4e00f07000201e39dcd8bae8c80bf9d81a6e69ea0c596c3fec0060600020887c4d0ddf5fafeda9eb2aeb289b3d6deece40505000201a0b4c1d8c795deda97bfecd782efe6d4cdb3a00f04000205c6a58197cc9db7b4cfbbd0dfb3f4e6f187e8c00804000201e5c78db49cbadb99e999cd90b7c6e4caefe7f00404000202dadde6f19c95cbd6b5b68993fab6f3ba96d7f41e08cdbba3dfb5a1fde29b8ee2c8000b0208020112003004360304020302000203020310040c04, 0x1b2ba84e28e84f6a78dd099f0131300020282cfde83cfe78eb5f0c0ecb7bdb00f0f000220bb81efc2e6ebdb98bfcfa1c6900f07000201e0a2fed1c7e8a9e5deaaebead2f006060002018a8aeeb897ade1aac3bef3f2c2b6090500023093d1f298c1d697b6a1b1d4adc00805000203c58699b1b6cacfebf6ecbff0c6b80404000234b3a6f786f3d5b5efc7b2c699d202020002168686c88ee98c9dd8f7fde388ce0101000207c4faa394b2caa79286edafe3f8130000021bf9cb82cdd9e7f0a6d28196dd901e02b3caa389add2c2000b0208020112003004360304040106000203040310040c040002030203010b02000202020401d08803a28f02bee401d4b91fd0883aeaf52ed7f6148f93000ea3e48af49be9c8d4e1bcd1b3e9a004a5fa07a0f905e49278fd32eca015d2db3888d722afe800038fd2faddf6f5e585a8a6a1e5afd813130202018be4e98f85decbc1f2c4adaad5a493f1d3fab00f0f020204bbbbcfdba5f6a695b1e6ebd0a1f1b4b2bbdef80f07020202cc9183e0b5f9e2f0c7c986c2f79fcde4cfabc00f040202028cd5d6d2c3cbaad7d0bb84f7e0f1fafbb5bed00804020201fcace49ca184dfc3b2f8c8bbc8fec18fc8c9f004040202019989d3b2b2dff286d2e1a0e4cbe6b2abd3cdf01301020236bde9bfdbe7b9a88cb0c4cfd68cdee7f3dba0050102022eac95d7e4ae89ffccf6d7dbeed983caf1d8c0, 0x111110f0c0c0f06060613020202070101010a13131111110f0c0c0f07060613020202070101010a13131111110f0c0c0f07060613020202070101010a06011313110f0f0606060505080305031302020201010a1313110f0f0606060505070304031302020201010a1313110f0f0906060805050507031302020201010a060b0208020112003004360301010299b661b102d4a801f1b3298cb63fd18922e9fe0f9aef00029c8fc9cfb08fe8dee013130202029792909ca887a4a1d1abfeebe0e00f0802021cd791d7efacedd2aff0d8be89a80f07020201af9dceae8991abe0e9fe90d1dec40606020201abe3c1cbd1cf89849681fcc18fa00805020202e0dfa3aceeded8b9e8d2d796e6d80705020254c7c0bfcef3cc87d59aefcdf2e4050502023df5c9979cb0f3fabea5bee1a1881303020245f7a8d9fd8ceff1ca8bd28cb4f4020202021ca188f495d7d0e6e2b5cec3d7e2131301020292faa0998ed7959de4d0ad8b9db80f0f01020ac4e7c6b99adcb9e5c3f9b9daa80f07010201d48fe6b391f5b5c3adcf9aebc4b00606010201b7d0b0f4dbea94c182ab90e9d6b00f0501020c8aebb8d09899eab4a8f5d4b6900805010202c8cb938296bfdfd3e0a8e7e8d9c007050102019ab9d1d9b9f7b6ffbfc583b9c2e8020201021aa6f9ad80e4efada2e6f490819e1301010218c497ffdfad85f8f4e0d4acfda003000102088f, 0x10909090710060401020000000a1313110f100d130c0907100613020401020000000a1313110f100d130c0907100613020401020000000a06011313110f100f10060706070507031302060102010a1313110f130c10060706070507031302060102010a1313110f1006070607050f0407031302060102010a060b0208020112003004360301110403020202031313110f100f08071006070607051302060102010a1313110f130c08071006070607051302060102010a1313110f08071006070607050f041302060102010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a0200020202041313110f09070f060d0201010d000c000800091313110f09070f060d0201010d000c000800091313110f09070f020d0201010d000c00080009061313110f110909070f060f020d020c01080101010a1313110f110909070f060f020d020c01080101010a1313110f110909070f060f020d020902080101010a06011313110f08080f0608050c020a020902010102000a1313110f0f06080507050d020c020902010102000a1313110f0f09080507050d020c020902010102000a0612020e0200020302030113131111110f0c0c0f0906060c020202010107000a13131111110f0c0c0f090f070c020202010107000a13131111110f0c0c0f090f0702020101070000000a06131311, 0x11313110f100d130c0909100613021001040100000a1313110f100d130c0909100613021001040100000a1313110f100d130c0909100613021001040100000a061313110f100d130c] private def node744:Certificate:=PackedParametricCertificateData.decode 9 data744 private def node745:Certificate:=.split node697 node744 private def node746:Certificate:=.positive 1 [(1,1),(1,7)] node745 private def node747:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node746 private def node748:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node747 private def node749:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node748 private def node750:Certificate:=.positive 1 [(1,0),(2,1),(2,5)] node749 private def node751:Certificate:=.positive 3 [(1,0),(2,6)] node750 private def data773:List Nat:=[ 0x11313121111110d07080613020f021201080101010a1313121111110d07080613020f021201080101010a1313121111110d071206080613020801010100000a060b0208020112003004360304020302000203020310020a0605020004040603090208020402010604080313131111130c0c0c0806130412011101080101010a131311110c0c080613040f0412011101080101010a131311110c0c0d09080613040f041201080101010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306031313130c0c0c110810070f07090711011001091313130c0c0c110810070f07090711011001091313130c0c0c110810070f0709071101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node773:Certificate:=PackedParametricCertificateData.decode 9 data773 private def data828:List Nat:=[ 0x1d6b2d5b5f2b3d3ed8de4e00f0f010203e296e6b8c3e2d4dcac8e96e5e29af7c0e3e8f4ba9ca008080102749dcaf2b79d83a2d9cdecdf97d3b5f1cbcd8f9bbfdce0120601025aa6b8c6aee0dbebaccdc3c8c6f4c9aae6cc8ccf97a1b0060601020197a5c29d94e9a8aac7acc4dfc7f5aad1b7fcdac4c3d7f006050102018aecfba3d0d2efd3f3be8297e1c6e9d7af9da39ffe99900f04010207e79883a2c1909cbecdff8bb8808fdadb9182cca7a2d9900504010236e6c684ccc98ed19bf6d3fafeb88b86859ed4b394cd800401010262c199c584bcaedfb283b19da48ff7f4a1ec9bebffed800f0f000261f3d0c5eb91e9dfbe90b1c28c9de99ad9cafcf38bdf800808000232a082eec787d3f0b7deb9bc97bdb6e0acfec3b989ec80120600025e9aa4dbb7b299baddcbcbb783d6dee6a0e6f3d6f6fb80060600024af6f4bed2eac699b5c1e3e2b8b889cdb1f5f7bca09d90050500020298ede2dce295e8bdeecc87d4ce8ba4d6ed8b82a1d9a00f040002069c87dcaaf0c9d6c6a3afe89adf8e8cfca7b0c79d89b180060400020bdaf388e8f087cab390959ff084c6e5ed9bce82e89bd0040100022d89ff89c39982c2db858ab38c98fdee8d97f9abf5fca01e22ae9394dcb9aec782a5989fa6e9f4a4d0000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1c5aff7b7c0800505000207e0eef9e3ccb6a59e918e95dbe1d69a9cc8b1e7aff5fd9eeee7ad9890a2858a80197886aa9688d1b6b0efd48e94dee1b3cae8e19b9caac3d2c8f880000b0208020112003004360304020302000203020301010efa47d902ceb20280d52a8bc83de8a525c68c10bea30039c9d7f69fafbba0acd6b68bbf95d5d7a1b6c002978507b0fa0482c803b2bb31ebd41294fb3f91c122fac40018facab6baeed8ded3c5e9afe59fc8f4f3f18016978859c7f70182d6cc40e0930aeebd2ef3fc41e3a11ff2e4003682b9bfffe8cfbbe29dbfffe1f9c9b0d0c01313020265a6fddff8b39af6e3c2d3938dfb95cc86bccdcb8680880f0f020278f59ad8c9e68e8bb8a390dacbb491f6caa9809deddfb8080802023d95dfaa91b494e887b987a89fd7cceecac8cb9eab87d60707020227f2bed086d88393d3bcfd93efb8fcf7fbdae3eed9d2e00606020204c6bae39393af898fe9f4e38bedebaebaa8e4e1bbe6c81304020202849f87adc988abb1a9efe7f080c1a6c4b3b1daf4a799b00f04020207afca97bbebefb7999adaf9d88bb7f885de9ee9e8dbeda00f010202129bd3eed2b881beaad48dce88f0eeabecdcf2bfb7be90050102027ca187debdece6d3f3e7edc580d1b9b7b9f8a7efff9fb00101020214fa84e0c3e9a7fee29bb2b29cdfebeda6feb6eae4d182130f010201a491cdaefde389adbca793ff, 0x1aef49e84b6f00605020207cef49ea297bebbbfeee883d7adfd8780a2f8a2f5c5a2e3f880ba92caa9e38cf01102020228c7f5cadcfbb7cae29dfeefcec083ececef968194db98a4c88e8eb89dc7daa00601020210cdf1db9b908cd4cacbc4c3fa8bbaaa869dee8dc8bde9e485e6eec48cd8e080050102020195e6c2dae585b6decb93ebaeccbc8890d7c0cab2a5ffec95e18d8dbcf0c6c6f0010102021cbea69ec8a4d4d7c7d4c89ab4bdaec5d1d0d3f9d5c7b4b097fdf490b8d7a6901212010207f1ed95c1d0e490b3ce9589ac84b68ee4b3fbbc93c9ead0d7e8c1cfb8c9de86c21205010209f6c1b0e3b89b91aec5de8eda93a7b5b992f7f7d3fd85f0a087bef7b3df9ffedc1005010202eddfbfabf7b4a6cef3b9c4fa8ec6fbe9dc92d39cacf7e088c3e4c9e6fcafa2de060501020e8d99aac4f9acf7ce90a7b69b9ec292d193c1a880b1debaefafc4b9d68982f0a20d02010201b7a5d3c384c486cbb3c2ffecb4d9c983d1969bc3ece8c782d688f3b99ba796d80202010251bafaf0cb8398c3f0b6e3bcefb6b6bbb8cacda5c993cab4b0dcd8e2fa99aab01212000229fe89d4afc6aac3c78196d59fa1a38b98da9fdfa49dfedb938fea9b8f9fdac00d0d00020febf5d295ea988df28b9c9bc18fe595a58fdee8b8c1fda2e494dfd1eaf7a58012050002069aa6a5b69a89e682d5e4d0e5a3889eddaed2c88cfbb5bebceea1, 0x1a79ffbc7ddfec8030200021cc1e9c6aadcf1ecc7afc1c1e7efc0f4b7f89de3b685cef190c6f098a21905b9a38ffab3d3d3f4cfdaa0da9ac0a3d58bb18bdbe4000c020b020206000c040e03120403020202030e92b125bb9e2e888516df9a01368fe188b1f08a97be89b2b6bbe29f9b95c6bcdfcfd5dbe493e8bbfc02a39d4da41f853ede2de3ad40dcd01ed1810bd7e00001caedb582d6c7d9f9ca9ee9c5d2c095b987fba0f1da82a0c1bccfffa007859e09f3bd01f4ce0196b32baeff0da7c645a89a27a0df005489b894fccdc3d584f4ff8bcafec4bf8dcef881b7a8f5ccffcda0c021d3e4648ad90181c6f83efea30cdf91338afc4ba8d924fcf00008f6d998ad83b080c1fffdfe8aac8df0b0e0cd809fe7c5f081c8dba0018dd9962de4a40df8b701b3b48d5fa8a52ec8b30cfec3019aef9e0008b2b5f9cff6ce98aadaeab6f394a6a4b0d5a0c29ac78d92b49e800f0f02020ce9a6d9aee38b9a9885e79c988fa9dea8dcce97b2d38f80abfeb4a8b699d8900d0d02020198c18dab91bcf4bcaebcdba8d8eba397bff9e1d4dfe7dfb9d3c2bd9986cecff0120902021fcfa4a380b6c8d89293958df99cead6d4c085e6a89ebbd09ed099b8bdcbb2a00f05020224b295c0a7c4b7ced6c387a4a686dd8e89fd8fe4d298d4a3c68b8deaf3d688e0070502020ade8f9de5cbc1c4f6ce9bfbd8fea7d4f098ea99a5a0d2bccd808a, 0x102020a9783d8d886d084e2cbe2fbbbb3be96f8bfe1c1b0dc97c7f7d3a7e4e00d0202022887a8b3a4c5cddded8ebca2daedccb68c8e83a0bbf7ecf4c1ef8cec0302020218e8f3cdcaa2d69bb19bf3eaa7aa88ab89a1ccd0a98ad8eaacaaf0aea602000202698daaf2e0b2b8d3a7e383deff9fcfd4cde9b1b4909af7b6dcf982f8120501026ee0baeeeba7aadf9ee7ece5c695b68bb2be97fad6ebc5e0dfa2c498050501020795f1c390fbfecd84dc9693ef8cebc5b2d5fcb8f2ced999e6a3b9b8b6060301020cfff7eea3fbc7c8b589d0dccc9c9dd087d6fdacd686e6f180ace1da0e0201020a8cf5d292ff9dc7c18599f2e7d0bfbcb2c6a285b0fa91f7d1ac8d8b9c0d02010204a8f5e7a3d9d4ff92f3fea5b0e0c4e6ae98cfa7efd98ccccbe889e0030201021dfabbbf8ce79c9f90c7b2aafb83f4e3f5b8c685f2a5adafd182d6bba40501010266d5ecddaf8fddabf9f1fdfedda5f9b494b4ddc79dd1ddc5bdf5a1be1212000206fe87c1e395feb4e2cce8c0bf9595c7f896bfacbabb83b9bddefcde1205000205fb8ab3e8b3fcdf88cedaffddeed0ed9ed4d4e7eae4ae91fdcc8cbaf0050500020f9ab4db92f4a78ed79992c1f2fb829cf3c2bcbcfcbbfadcd597d195f40e0200020689ebb1cb9b8bf8e3ab9991d8ffbcd582abb7b4ffb295e9f9dbfda7c40d02000201e4ff8bf985ede6d190c6f9db8b95adfa92caa1d6f9, 0x1c3d0dacd87c499afe2e3ffe394eda1f4d5aeaf99e3a88eedebb4a00e02000203eaaed9b3a5b2e8a5c3d1b585afd7b2b296a49aacc5ba9fae8cdfcafdf79b879e980d0200020e93b6a9ed838f8cb3c180fde0aca8bcccc8cfa3e8c3acd4bc8bcab39eaccbebafc0b80502000208f3dfa1e5b1dbfddb969bc5d4969182fe89a9efe1a9a2f4d39feabbeda7e1a7fee1c8190a95faf4e0b580dfd3f7b5a796c8f0b8efe881d0899a83dea488d7f20012020c060406000c040e03120403020202030204000602020479f8be0385de04db980181d9b3012bd78e81d9e3a28eb7caab84f68af4f3968da5a5bae4a427a507faa003a9aa08d6894089ec3d82cf0b9edf0897c400068af0b5c1eb9bbadcf7a69ba4f5ccf9f4caf4b6cfc5bbcc5ac005eeec24d68b1ddea40a90a104e1e3288eb73780be0001e7b18eaadcc8c4ed8c8280c381f791bff7f78ce9f1ccb601a0c6da1399db18e0b777fabb5cb991039a85508a5f838e0014c19ca0cbb79383d0929897cbb4eec1c6e6fadfe1b6ec1313020202def5e882fcd6d58a8eac95e19aa1829595b2aad2c3e495a6d3fafc1212020201c2c8d6b7f988f2b3f6b0bb80a6ead5b7fe9f8b89e0fcb58f98d9d1f2120502020386d1ffabe5a1a9e8a59eb9d595e5bdb18593aba9dea9cddaf8b7aba80603020202dd959df8909df190a2bfd4819cdfc0f79297c3f0f0968aa5df85fca40e02, 0x1020228f681f4e9e1d0f985f4add7e0d4b7a3d692ccbcdfbb9193d8b4f3d8beefff95d6a81205020205d38eb5caa9e8b4c5f5bcb2bbfebaed8f91abf4c8d2efe1d9bdaa95bbc6b7b8f3f8dc0e05020201d3abc485fe96d4ff84b896f4b48f91bde6fde8cde0dce4e2cbc1cbe7eee7fef4d484050502021fe9ffad829cf1c9b0f1babee9bbe2f3edb7a396d3a8e1b9f7add1dea6bfd8a894a2a013030202599c93e9ff81fcf5efc8e1afe7ad91d88cb7bca3a5c4bbf1ac9afbaec8fec9b395d40d0202020db9ec8bf5f9889ed984b0cbabc8adc2b9e7869f8bbca682e7fcca83ef99a0b2dfda9c05010202048bada4c9fe97f098dbc0b2fca2a5a0b9efeacab4e88899a99a9eeda0c6c4e9be81f80f0d01020590d5c3e1a5f3ad8bebc2e9ded994bdbddd9daeefd0cbd4b7fdf794cec0d5eef6a4120501020282fff1fe95eeb3e0dedbbae880ff8affd19195d3dcfbd7f7b3dcc595f397cd92d9dc0605010201d0d1ceac969ad49785c3df86d2a1c9f1dfc9ddbe97d8d9e992b3a1be94e381f0feba0d0401020191fbd29a9fc1fe97cfb2d2aab799e4ecc0f29afabdbdb7cdc0a5f090dedab1edfc0d0201020debdeeed88fded5bcbcfc909de7adf2bce2e1c6a8feffb7b5cedaf5b3998f83b39b9405020102049cc6fef4a5819790bd87bc99ffd3fee3aecfd48faf8ffbd5f99bd6848cd1f5aaa4fa1205000265bfa7a6cda8bc, 0x1a59491bd9ce4f489b7a0a8a595a2da9ad1b7a4d59dcbe3f4c288bffee00502000205abc9d3fe8f9af083c78c88a4d3e8bff6cc96ada4b4fba4a4c09ff8f8e0cbc792a5d29786f79acae4c019259ca08bd79dfcc8fe99c5a3e4bbd3f2ebfabb989f8f92afc8d6eba1b4edb9f4e9c8a2e0000b0208020112003004360304040106000203040302040006020203010b02000202020403f3dd0bef813bdf8b4bc1ec0104a5ac8acff2d8f5be8bf782c8a48ca8e2ccecb2f9f1de9fefb99f8feaa873969828b9a341824b9df5012481ea8594c8a1c0fcfcc7c9cae4f6c4d5f2c9ef85c2e99ad7ece8fb8002fd01a6b607df9406d7ab3eadf23b92850ed0a10bb4b6000c94ddd6adbca9a9e080979780c1a089ccfdf2e7ebe0a6b1e3dfc08fed9805dd810bcda709d5c71baf9410ff8804f7da4a9fb46096950005d6fe81e0df849ed4c2fae392c9f4d4f19381fbcb91fdfecd88d6e8f494019a84fa43e1cd10c8f148939b51d0c71cef9e3aa9359bd4000cf6dfd098b9c6e1f8fb87f7cc93f4d6a49c8feac5bedc84cdcdac9bbc1313020204ef97fcd78481edc9b38ae8d3ddaf82f78cbe9e96b1c0e9e88dd9f3b5d8dceca0ec1212020201d0ea90aff590cc8793efd6a9eef6e6968096919395dceb9addbab8e2dbbea7ffd7a4120e020202db9ba8a0d39bc3dcfc9bb993fcd08af0bea8a3f7a2d0fffca0c798e69cc7e5fed80d06, 0x1abbb8daafdb3cef6a3a69dc3c1e6a681beecadb7c6b287abc0050302023997a9c2c8c385b3f5b5abcd80f6b193baa0ced4e1a4f2f8bfc6e2c8bac9b5808ffdb2f3af94f3929fe1e01212010202f9b4ddc1aaeeb8b4bcc9bac89fc3b0e985e2ff8ca7dbd9d0a7e5f0cc99c2db97e3a8d4a2dfbeaf8ba3c00e0301020ea28df0f7e7b2bf82bcfe81c99e8bad86d1f7a6b8eafdf6c1b9e8d6ecf0e0b9ddd89eb8b8c1aceed3aad00d0301020492eef4ddb898dd96beafc09da7909cb89bbab6ddcdce98d698f8dbfcbf87acfcb0ab85c0e6fecbfbc9b00803010201ea93b1a4b38186f1c4ac87cdd7cd92e6e5cbf18d8dfcc99b81b7bbae86cff6c1ccf1c5f497e3bae2ca800503010225f58282f4c2bac1fad7d0efef97e79f93a4d1b8adfeff8beebcfbea9797a9bed4f8c0f6f5abffbab2bfee0502010201d7b2cba480c7bbac8cfec0fd95f0bfcf80db84dd8086d8d8bff18dcd84dcf39ba6e886a5d5d4f181fce61212000209affacaafe8bcb4c4bef4c6af969795b8b98cfca6aaa5b9e1ba96e797d9b1a4a8aaa4befc8db0c7f9c0120300020697d4c4bf919b85d3c1a3f9bcfefeb4f696ceb499eebfa1d2fab1f69fa5a5e589ddbdf5bdb8ead7f9f9e00d03000205ecbc8ab5938db28a84caff86c3ded5fc9cfdf0d6b8a9d4a8e19e9fccf0f0dc86fba2f28b8e9beac6a1a00503000235e48ce6b9afa4ebcdad97d6d993, 0x1b8dfa5badc9ae68048ff817dbd8c52f5ff1dd9e01aef9c45d2a532c1b807dead0005eaafc2e7c1e9d7c1b7a8c7c3ebfcdfaeb78bdcf8968df49eccc7d2bd85a7ede7d0d98ef4801597844fbed41a98a27d8d8b10e9a213dd8f1fe7d122dbc0004afcdfbea4fbba91e3b282c4d990acb5d7ceec9e93d7e489fcb5ccb69cc5d09b91e78ab0803d91df3ee0c348e9cd01c5f3e24dcede49b6b8338bbc01ca90d10011e4d4fc8ae8e3a4ae95fdd7e48599bbe1dac29db0efa886aeecfcca97fac3c0ae9eb4b9c07fb8ae01c1ad748ab50eb6af40d09701eba33786b40bb588000ba3c98bc0c986889684cb94bff7db89ccd6d987abb5dc99c4a48fd48ca3a6b2d59aeeba800f0f0202019fd6949fa6f7fdf2bbb186d8b5a0daa7aac0d3a8e788b4d8eec9bca2b8c687ffb0dca995e09be087c00f05020246c6c1b4e0abb7fbadd09aa9d4b2eed8b48ec6f698e39c90feb589b0d4ebef9ad6c8c1e79dadd79c800f04020202a282d2b1f1dcb3debff8d7e58d92cb968e93c7acd8d080889b8691daa4d283a5db9da6f5d5bad5c3801203020204e9ead29daa81898fafb3c1fb9f918a98a5cef7fbd0cbc1e08a9282e492d5c1dec8a5d59ff796f7b5afa00d03020205c89aa9c7cacaa2bef5ac88f8c1f6918492b2e7da9399809fdb929498e4eef8ae8d95bfd7a183f6fde0a00903020201e384caeac1a39e97ac94e8ceefe39cf4e2, 0x1e4bf8a9598adadb5cc83e2a39ce78a1202010201a39a94d6b89ea683e1b6c9e3ddaad1e8faf59de582b985c5b2d2e194f3e3bf8aa285eba4dbc6cbc988b287d4d4df8d98b6c80202010201f19a85b8d9a480b4fad3caced980c19ae783c29fdec4f684ecdbf9b4abb6bf8598c680bf94fec7d6ab9ca5f89fd1e5a39fbe121200020afecbb2fa83be95c2e9cd87f59ef1fab382a9a3d889c9a4ceed8ba59daac9bbf1aad0fbbab6bed5b4b3f5bb9ee69bea80e01203000201b7f3b8e7dfaa8fbebf8da1a7e1c8ccfd98cbedbbf687b8ba80edacb8f2b4ece8f991aff9dfa2d396b5cdd6cade8ff3fa800202000208c193d9c9a4d1d3a79283cec8c2bdbbabb1a7b682c5f48dc0ebd9e8c5cbd2f499a6b7e38f84abe4bde8a1eca98d96f4bb9019028badc2e08fccf9bbfed99cd0f4d98fb6c09decc391df92bfd697d8d29499d59c83fdda84abe1bdb1b4b9ee80000b02080201120030043603010135d8ef5bcca03c9e9116aae2010aea81c5ac82f9a1a5fb86c38dd1a9f7bdfefb82b5d8b8d8e2e5e4cbdab8e1abbf808b85b3e80f970284ae028c935db530d3f53fe68c1bb0d70c9ec2003ab5b69194b0f7cfd8a0a38f9ca7c488addcc9f6ebf18987f9a9dfeebb9983feae8df2c8f08004d4a408bf8b548c569f24aee90e84ee46a78e2ffd91001cb887d9cf9ac59ac9e292c9dda1ef9dbcf4c3a6bfafd49ad2b086bee987, 0x1d1c7c9afabb9e0a0ee96dac9bcc7adadb4c58692a8d4e085dbb8f48e95caf3aef5a095f98adfcecee00505020234e5b69e8ce8bd80acb5caadaea5eebc82a3e78e8effe3a3e394aec4c1dd85ad8ff09284f8a6d5f7b5d5b9eae4b6e5f2dac80f0302020299edfac8fa89dc92de85b2f7aabd87a2c6c4eccfffdcb0f282a0d2bfaaf1ceafa3ae9ce5b6dad2db8daba6c0c4d18eeef00503020269eea5bbb2bafe8cfee795f2a1ee81b7ae958acbf4a7b89aca81b38aaf93e1e1bad8dcb9eeeb90b0ceceb7d5a89ad484d5d0020202020b92a3efe2d1ddd4f6abc8bfe9fbbba0e18ea99fa4e9aaeba48a918cff8ccdb5eae4adc9e8d4e6ebd9cfdac0dfd3b180e1b00101020204f69ea194edc193a8c9ae9ab384a2f98db1ac9892a8c0e19cacf7f791e8b7e083fcfcc2d4c7eb83fbe4cc9a9cdf94888de8120d010201aef0afeb8aedf1a2bf9ce8d9a3d7f8e7c0ea919598f3eae99585faff8db7b198a18ab1edf3e0c69695a694d7edb2fbba8fb0120c010222e9d7fdc0c088e4c0bcfddaf395a8efa4fac7c8fe83ee83f5fab0baf3a0b6dba88cc89da3b58df0f0e0b2a195e9c9e4d00f0301023ee6fb90afe0cf86a4d0bf96bbbbc6f4d6cde59abda8e3a2c0bdfd8cc29ee8b0a7afef92d9dffeb786a4818dcac99bb4980303010211d883d1e3e8daffeddab6d4fbb7acd79de0a08ce0ffeeb9c0898d97dcede9f7a4f5a7dd, 0x1ddd688ca92f3fcb5e595a5d5eee8c6a8d2b2f282bdecf3fe8a8082c88b9fc0b2900bf7e006f2c62dfa16cdc31792e50199fc44b29a2eb9af0001ded8b9fa9dfaf3a6ede7ecbddc9e88e0a890b1bd9788e484e2cfa3c396928f8f85cbb188e9f8cf90a5808cdc859021c98330babd05bfcb559c9e23928d0cbfdc1fcece08fc9b0055b3d485d3eeabd2ceaaa9c0a689b982ea83e98fa683f7c6def7f7bb85fcbb88a0ae9d9ff2bf86f7ebfe98b5edd00b9bc90192ef9b2dcec470c69425d9b45d9ee00e918b74e7870023b0ebe79a82a4efc6eb8af5c4d3daeb80fa82a2f8afd3859ec0e9c9ecbe96d88edfd299c7e1c294edeccdd7bab07be6921c91c34ddaa801acf78b5d86d508aea33993ab019ec8a60017bf969e93afba9287bba78c8980c5edb9cdd6b2b6e4dba2c6edadd08fd8f6dddbd4e5ced6d9f690c897a3878cc05fe4f725efd201878bce48c8e927b0a419a8d34985f13afea20009c994b9d9f8a194fc9b82cec29580cea6d9f2ed9ea0ea80c0bcdcdaa1cf99cc88d8fbd28ffcdeb6cf9fa7b1e00f0f020203878de6aa96eefc9ed8e2aefa9b92ff95a4a0a4aa94cffa9a80a1c881df85f6e98caabceaecff8dfad6d4d4f1f5e6e9b8f01206020205d8a098b196a5a1858d85f9bf9bf4dbacbdd3e3c9de91b8d8ccb0bed9849cde8ffd88b2f3a4bde784a7b5edfdb99a93c5f01305020212aac4bdb7c5c7c2a5, 0x1fb8c91b7dd92c0e2f18f96f7a1ecf6ea81d3e8e3f00d02010202d4f4f2bf8cfcc08984a9a2dee8e2bebc97e1b496ac95ccba9b98869295f8eddeedbdfefea396ecc8cdb9e18bd6e4b6a090050500020ed9dcb8ccd1ede3b8cfce8ae1ed9e9799c2e8a2bdbdc48c8497bdeaf9fd90ada797be98ec85a8abedabbd97dd9bd4800d02000202d696919eaed5d0e0b7f8e893b29d80b9b3e6b8e1f4efc8b59ebf8ef2ebc3affad6ecd481f8b58ee5a1e3feacd38efa88801901fedebba1f9e9c3edd3e5b58ee1a9eda4b0c2c69f83e5aec3f7cab18fb58eeec8829ec9e8ebffce8ed1800001011313111112090d0913020c0213010801010107000a1313111112090e0913020c0213010101070000000a1313111112090e0913020c0213010101070000000a06131312111111060613020c0202021301070101010a131312111111060613020c0202021301070101010a13131211111112090c02020213010801070101010a06010e87f874e7bc20c5f162a9c10146dcfaf9c0d1e1ece0f9af989ceae2ccbeebf083b8f98fd4bbe3f89ad4e1a09bddb9c4abb9d2b8c1e1b7d380f2b035d5d101d0851d82e954a8c20101a6c9abae8ecf91c3c0d9e9c0c1ffabb2dbc6c1f4f185fcc9b8fcc1d4affca58b91a7bdaee7a1a2c6c68ac597dc8005ec66aa02a7a930d626da934987f614b1830dfcdd0004a6efe8b1e3dbccb5d5c0ddacf5, 0x1879bb1aa86f8ffefa0800d03020210caf1dfbd96b984b79d8bf5fc85b8a1fbc7d3e6a797dbe1eca093d19285d1dfb6c696cafabad9c6f4c0eb8db3daf0800503020202ea96a6fd98d7e29a93db9ebec6fec5abbea684cfe8c394d0bbebe7b3a6d2a78db092aea8fbcebfa482f6dcf592e4fe800d02020202d4c6e8a897a1cf8becca88bdacd28baaaef0d7e1b1fc98d781ccb2b2ea98d89cd8f2a0d59d93cabdd9f081eca49580e8800802020230d982d6b6b6a48afbacaac1ce99c4a0b1e39ffbb1c0d98ef8d1bfaca3f9cebc9babe6d5dcf4fb97f7eea1f08dfef480050202020994e6b9af938eb8eeab9ad1dff9addac3bfa8b2d7d586fff78694f780adf8fea9cffba58dd9aba1ecfefc83fcb5aa800100020205d4dbd2deefd383fc87c2abccc3c9f491f3e58cfec9eaa7dd95faa6ebcdb688f08dcaf9c58f98eebeecb1a1e1e0888012120102709cefaeeaac9ec1dad4e49ee7bcb9a6b386dabcfed5f9c8f697a1dfc6f4db9ed3f0f4fd9ef0de8ea9c3fce2f089849a120e01020391c6f79faab1e39596868a9afb9b9ec2c2b4d3e2fcccc1f6eed9fbd6b4a8f9e7a7d081b9f1ed9899b4a7acfeeff2fdf0080501020282c6f8cca1b8a5b184bea0cfb5e59994b5b89ab9c8c19dd883b5de86b493a5fa82dd82dbbbc1bebaffab9ea3a2800d0301026e8387c89e99d8ad85ed96bddac6bb95fabfdcbb848daae7e8e187, 0x1d3d0ace5a4e3e2b9bcf9a5e0bcbeb2f1a1c7aebf9b9d83f8d2fcd3c6e9e8adb5ffe4fec2ce91b08068f4cd55c8b457c4d769fca438b4cc2c84c344efa2519fa9002addd997a682d4a0c59ff8a9afdfa7fab9dcc3aefec992c99590fce4d9e2d5f1f593c6828ee3d3a8eae5cc804bfc8d499a8c7393c06ccac328edb21dc5974ee7c943bfb00003fa91b8fa8082b0faaca8ccceb8bfd2858680abba91ebc89ba8c29cd6fa88adeccdffada8fd81b0a5c0804c8ebd62dda502e3bd01acaebc4e8a9c5dc0a401e6af01a9e48f000184bc9bbd8cd7a8a78a95eec79bb7bfcbbcb5d48bbcedf0ce9fea8bcfd7ccc5e280ecffb588f08ddfe4803cafed3a889b3aeb8f42e0ad518702f8d10295dd05dfb80039a9bfbad380b6b4a7aab7fc889acdaad5fac3ddd9b3a4f3a4c9c29fd6d5b7c89cc5a4db989988eff0800f0f0202058ae58be0d4afaace89a8bfc0a6f387f0bc92e3cd8186cfb2adbfb2e9d0fceba0a0ef9c8da2d5bb9aa78490dccca880120e020202e0d0a8fbb2d1d2a5e6cebaf5878b9e96fa80e8a19ffabd83c0e48283e783cfa18ef8ce88fdbffcaa8ab198bcc8deda80120d020201a8fcb6edfeb5acffad9a95c7cefbe392f89fc994f0dfed9fe6a487828a9693b0a8eac4bff8d5f9f787d3bbefde9a80110d0202328382c9b9b894c49595ecb9f4bbf3b198dde2a0da8aa4c59cd4f9badaaabca5c09298ac8fa2, 0x113120910060f060706070509040f02060102010a1313120910060f060706070509040f02060102010a1313120910060f060706070509040f02060102010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a0200020202041313121111110f0d0d040d0213010701010108000a1313121111110f0d0d070d0213010701010108000a1313121111110f0d0d040d0213010701010108000a061313121111110f0d0d040d0213010801070101010a1313121111110f0d0d070d0213010801070101010a13131211111112090d040d0213010801070101010a0601131312110f0d12090d070d060d0401010c0008000a131312110f0d12090d070d060d0201010c0008000a1313121111110f0d0d070d060d040101080007000a064f8bc341ceea41f0f74fadd2014eeee6e7a6b693918edcdda4b4abca9bd7db91bdc2c9afc2d987dc94b0d9b0ebdd9985e2cbd0be95eadfe48004aafd2dd4b928a2c75aa280014eb2bb939892f7da8ab6fe9bf981b8abeba79bb1cf888ef8dab8da9cced2b6aeb3ff86c2cfedbecbeac7ec0288f502bee802dbf209e33bebae38c7a11af29917ce8e0002a0dce28ae7c886a9b587859daba0d98bccc2dddbebf48698f7a78780caf4caf0cca386c1ccb7b9cfecddac800ad2ae0c9db909b3cc09bad913a2f40bdcc938bafe4081a70001c2fdb2bf, 0x11313110d12090d090a090f0611010701040100000a1313110d11090e090f060f0211010701040100000a1313110d120911090e090f060f021101040100000a061313110d12090d090a090f0611010701040100000a1313110d11090e090f060f0211010701040100000a1313110d120911090e090f060f021101040100000a060113131209110912070f06070607030f02060102010a13131209110912070f06070607030f02060102010a13131209110912070f06070607030f02060102010a060b02080201120030043603011104030202020313] private def node828:Certificate:=PackedParametricCertificateData.decode 9 data828 private def node829:Certificate:=.split node773 node828 private def node830:Certificate:=.positive 1 [(1,1),(1,7)] node829 private def node831:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node830 private def node832:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node831 private def node833:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node832 private def data887:List Nat:=[ 0x112050d0505050c020812120d0d12050d050505020206060b0208020112003004360304020302000203020301010d0208020302030204010d0c0b020a060608040c0308020002020204131311110e090a090f08080611010801060102010a13130e090a090f080806110108010601020102000a13130e090a090f080806110108010601020102000a060b020902020c000c04100312040302020203131311110d0d0e09080708060c0202020a0000000a131311110d0d0a0a0e090f0808060c02020200000a1313121111110d0d0e090f0808060c02020208010a060b0208020112003004360304020302000203020301080206020404030403131311110d0d0a0a0e09080613040202120100000a131311110d0d0a0a0e09080613040202120100000a131311110d0d0a0a0e09080613040202040000000a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130d0d0c0c100810070f070907120111010913130d0d0c0c100810070f070907110109000913130d0d0c0c10080f0709070c021101090009060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203060203060006030803050202060008030a03, 0x1e9f3ba800d01020234b8ed95d1979bc1aaa88aa293c3d2c2a384ab81c680d8f7beacc783c0121201023084d396baa3d1ae859080e1a7d7d8e5e0a0dbcabc9cc280caa6b9bfa0120e010202b4abc5e7a0e8a0b2ebc79fd18ce1b0c6cfffb3eba5a8aeb5f8f3b7a790110e0102099dfefebfb8aeabbabf9a8b97aca0aefd87c0bfa4a890d8a0b896e00d0d010203d0f090d0a19692cca5da94c7bcc6f2acbaa3b6dec590b2bdb58fe2b8860d05010215ecd1d0b2c9a3f583c0b2c883eecbcaf1d897aeedb6d182bfe4e9c0cbb0060301026a8da6cee2c3b7cba19bd4a89dbd8398a0c5f687d1f3c9a084e1ee96c00302010209a7a3ecd0b6c0869b92a480b2fa82aaf4e09f89dd8bf3e88d8da3d88de00d0101021b97c6ccf8b2baf7b1d4d7add894dbdbfc8fa1f2e5c6bf8dc3b6aad1800d0d0002049cd9e5d3d0eca594b0d7e3f6cbc5c08dfff6c3b7d4f8f08bf0ee80afb00d05000213fce6babdd2f8e28a85bab0bfa5f1b6b4ccdc85a7a68a9cf0d5a1feebc00d03000201e1f088fce1f4ceadada8b7e6b8e6f887e090cf86d99ad2ec9484bcb280030200020ad1bd85d8ea889ab6f7c4d1a9a1a2a8fd8bc7b6a7a9c2a4adc882fda58019049ba094b58a9edaa3dfa3c2beddb0a3efa28a90faa380000b020902020c000c0410031204030202020312120d0d080812060d0612050d0505050c0202020a1212120d0d0d0d06, 0x18199958bc5f7f292a8dfe8daa5dae6d49e85d4afb1aaeba3e6d59c87cbee000d020b0204060002040403120403020202030f040a04000603060472f3d20391dc298bda019f9187012dabfd948582addab98ee2bda4e584c1c2c3dcbcef81d6b40181f902ec8206f5d007a0e546b6ce31cfcd0fc69705a0e70004bb99f2ca87d6a7b38dafc887cff7dbdfc2939aa4a9cffa801cec57b3e81bd2f874ad9323e38d5eabab21cec901a3dd84000dc3edb7b29d8bddffc49afc96ea8ea0f08ac9d0f4c8f4d00197dc9e26b9b51dea960191afdd59f0e706a4f41ca2856fedfa001dbfb1c3f0aabffea8fab69596f5819f8fd5fed4f99bc9c013130202038986ba89a4dad9cafabde6bef3998af486df9cc39797fbfbebf4ef801212020202bda099e897a7b893f690dbb1d9ae96b6f5ebf7d7a3eaeeddc5cd9dd0c00d0d020204cfe6edc8fe94eaadafeacc84b2c7e48bee89f3cec9d6e38e8dd190eeb00d05020210bcb592eec183eaf9daf29eb0c5f899b796d4caea86809983a0bfc7e5c00505020207b5d1e380c1b8c3ccb5e6d096f6c0e3c9cf9aaef8da80bfcef4b7a793800603020201c586a2e186b4ffddb782fcfdf285d4a397c0efeff6dcc69be2ca97828005020202148d8cbfa183e3d5a4f3e9fbde92e5d59adc85f4efb385bac6c4d5a080030202020aaedbd3bdaefd9987cce7b4a9f2bdd1c3adf5feafc8ede585d2, 0x1f4bfbef283a58fd4a8f29df3e5e0a28c9ead94eed892aabe97d4ebb7e805020202078a86e796d8e380ece6a7fd94b89df191e191bed1b5fad2878edc92e79886fbfdbfa19db3c7a3d6f4b7f8e41212010201c8e98ab3f6daedc5fbe9e8a4dd8fe4e5e0a5eab7a2e3ffeef4dbf2c783b48baadba4e9ee9bd1d1efcfbfb00e06010204e8d9ffa5949ca689fc8ba5978ccbd7d69a97cecfa88bc4f29ae2bd89cfeae3fa94afe0ee89828180b60d0501020bf3fbede58eb790e3aca8b289a5e89ec1e3c3dbcab4e8e6b892e694e2d6a685d8c8a1c495b2aabffee9c5f80605010246f5a4fbf0a7ffaaa1f7b199b4aeb9c4a7fea2f3ea9ab4a9cfd8d7a895c99ac8b5c0aba29afca6b8eabffe1202010265b69488a185d5cdc2a3e48eeec7e58c92ca929cf181ff96f2978db9a181daaba2aa9cf9bbaacaaab5a39a0502010203b5c1d195b6ffc387e4d4abc6998e9cf0af888493d7adbabcf9d891819aad9be2bcb1c29680f393da8da59c0d0d00020188d08fb4eca8c4ef8589e3dcf6eca7f483c5c4c8aee5d39191bcbab29febb6d5f184ecfec6c1a0a5f5dc0d0500020b80cac8d4cb8286939596bad0f798f9989fccdefecdade7c4ad8bff9d8afe99ffe8e7fc82dcc4bada82df880502000204c388c4c69cb3f2b8d09ca3e1e199ac9babf4f4b9d3e397e99debc6d2f19cefaab7ae94e1f884d6e8ae9bb019048b8aaae3c8ba, 0x1eb99cd8ecf90a7a0d295cf98e1b997b9e7f7f0ccda8792848285da9df78edaaa87a4e4078b9608b7b4329da041dabb19a3bd14f28f28b2fb56c8ca0001f5eb9eafddc2dfd6e286efb6e9929ddb81c388c0d0bce794b5dff183b98edefaaee3c4debcb467eea80189a1f306d9c21894ae32fcb145c3fe01f89510cfb50016dc9f9897d280fbc0c7d8d888a3bbbca1a6c9eedde4fddfc4b8e9d9d6b7eed99dde91d7a6b81313020201c0c688dfe3def5d1f098f2a0dbcac694f5e6c0f7ee9ea6f7af82f1d7bbbec7d2f08d878dd4ef9d88e2c012120202298cb5b4d282a8a4bce28bafc38bc398edc4d2cdeccae9b6ce82dfb3d2cdeafccfcdad8af8c6affcaccba80e0e020226b9b6d1d0baccc6e9b8a1b4c0c485d3c594e2b6ebded9ccac92dfbcc0bda883b781d1fec6c092829b97d80d0d02022c88f0ceadf6aaa6f199878bac94f388ff93e4a8c5e2aeb5c4cfaecab7afb0c4e7bac5f78cab99cedaa19a0c0c0202288e83dd828e9cf4eb96b7a3bdb0cdfbef9987a6eff1abc180aedcd7cf9fcddfcfd399cf88aaf1cad0f21205020202c094feab97d3be809684eada88a3f6b0c98fdeadc1af95c7f19f809aabd59799f0e0c2adcad2f492b785e0060502020194ade58ef8bdddddb290f085d9cceab393d7a6f8b89af69284caac93e69cb0f4f195dfef9ecc9a98e8becc0505020229d8fda6f59accccdaf4cb94ffb892, 0x1acb1e8eac1909bdab1f6f0ee86e790a3e6bfd1f0e1f6a4afbe82b5adf6b2c297adabbfc3bdd180b48a95eef0a6abe0900d0d000234fdfbac9192f8f2dea1fdc7c3dbbbd8f3de8a80fdc58087d28e97a999ed96baf48cf2a1ab8ddefd8cdafc87fdf9bcc0cb87d99d84b5d00505000202dcaedabc809cfdedcfa7a1a3b7c3919b9cc1ecccaeafc4d4a7cec4ace8dc85e3f1a1c0c0efa5a79e82cde79cf7ead9f29ab8a984d9ddc01923a2e0f2f990c58bb1e2a0f5c3f2bbdea5b7e68c979de5fe9bbdaf9beaf1eec6dee5d89380daa5adf3debe94d582ec9fb0e00001010f040a0400060306040e02090201060306040c0608060204000a040e0402b8ef03fcc179fdcb0180b2fe01018983f3a1eaddc89ae9f3f3c1d8ffb2f0b1e18182aadce7e7fafa82938c9af3b5c58cba90a2ac6581e844b3ea04a0a101a595af0162e395c59ed3a3fc8eeea3889ff6d9c79dd4d79ac582c6a1ddfd82c2faf8fe8e9ec29d91b7c801abac0195a205b5b206f78d20ad8611e0c118a4a509d7e2001488aeb7bcf7ecb2e7b8e6ce8ca0de8c81a0c1babcdba5acec98f89da3938f97fcf2af95d0eb8807d1a304989307aff914e4e809d4d23cb2993ea8820bcab90003b3f7a0c3edcc98b3ca93bcedfcbadbaae38ff3f0fb93dbd4e68cb4fd9981d0d7e8ba8dc6d29878e9de53e5ec40e8df018bdfcf49f7973aafbf15f2bc6eb49c003ab18d, 0x19a81efeba2d49bcfdca5cdf6ab96c6bfeaa9f98aef94800805020201ccf889c08885b18a9affbabdacb8d2dab9cccbddf39e87a7b6c8e2a986b49491d2f0c4d490b8df94cfd7fc8991f6e5c9dcb2fddfd8c080070502022acdabdae8d2c7f5d2d1ddb78fc2e7f5e1f7bdada7e9c1b986eff882b28695e1add79aa0e4fffe93d085f8f7b19ff0d3a4fca3c0dda5c0020202023fce8cdcc7f7e4e2ff8ceb8c8ac8b7bca4d683d391b9d0daeca09b8ff9d2f0adf38f8998ecec97d183c09bbbafeeab958be484e7d9bfc00101020251a9e5fc869daccf8ea7d997d8bdffff9ce7c7e98de7baa4ceff8cadb1d7f193c6d6d8b2b18bc19ef2e5c5dde1f6c2b4a8c7a9dca487a00e0e010201e3a481b6ee8c8deba2c9a3f9d8a0c9edf6f0b697cea4d288dbabedada9a68cc2d4fbb6819799bafbddcdbdc890dbb0dae3dfc7f9eec19cbe130d010202d7dadef49edfe9abbf9ed58fe396cc92ff9ac5f396b2a5f18db3cf97ddbdb3a48ae6b0feced198e2f8e38ba0bb87c4fcd390f390c1e00d0d01020fb092fae0b396ccaef6e9e0dcb79291b6f2e09fc8d1bcc7dcb083d292dec0a2e4f281d6fce583bbe2e38ebac0b9aedad3dbccebdc809acc0d050102208dd6cea6f5bab38198b9ffc19081ce868ec9bafc80e2e58f98d8dc9599eee5c3a381e1e5b9bfd991a791f1888db9beb28ac285eae2e6800e0e00020294c7fcef93eca6, 0x1c79fd6d28de03fc7a252f0836f8f84598bf33ac7c311ab9243cac56ce6f80005c6bf97c283d380c5e4eee880b2a1eeffe9e988e3c783eb92decfeab9f2b3f3e4ee8f94aea1dfd5c5a4b2dbb9ccf283d39ffa800186ed920b8ce462f6932dd0ed50bc9112b9932b96dc37deca0004eed0b4f5fd92f2de8188eaa098dbef99a9cd99ddb1cbf2bda1bca19a82e8eac9f4ec918dfe8f9291eec687daff9dffb0a89cc014da920185f3fa3bcaee01cea8871df3b755c2cb31869101a4bc96000a87bbfbdfc0f2b0bd9cf886ec90ab96a287ffa88bb6fd95bbce99a5cfbaffbcb69782c7a0e781cfe4d0e4fef986cbfd91801313020235c9d5f882b3df93aae4f0a0d7a6899ce6a6ffb9849e98db94b3f8b3b9d397d9dfd590a28eb3c2dac0aae284bec3c99aa094cb8fa8d9801211020272fff882b4f1fb80c6e6f7b2a5c3d0cc8be49fd5bdcde5e8efcd8fd9bdf1bb99d68ff4ad82e3f59ec99ee0fdd181a9a092a392a6d3f1800f0d020272e2968ccfcbd2bcdaf9a6e2a9bdbccfe1e8a7e4a2b280e09fce82dab9ea8a97a4b7a58af78db692c9c0b0f6b29d84da87b5cf8d9bf8800e0902020182edac82fff2eb90d48bbf9bb4ae8ed1cdc7a6baa4a4affee6b48882d3c5fde5dcabdbe4bfaca783eff9b596c38ffca1c7f1a7e9d1a8801305020249cea79ac3bdbdb8bda9f7c8e8b680f89bbef882aa88e3e4e4ae86c495b9f5b3, 0x1010a1313121111110d0d0c0c0e090a0108010101090611020c02000603060413131212120e0d0d0c0c0e090d0101010c0008000a13131212120e0d0d0c0c0e090d0101010c0008000a1313121212110d0d0c0c0e090d010101080007000a0628faa220d2a71fabf627d3ef0131a3a792a7d58bb5ecd2e0d5968fc3f4eafdf39be2c8e6f984e6efb4c6eaf2acfc97ecebdea9dd9495d3ff9088c6daaefbbfc5ac53899f14d5bf5782fa10dbe60109d4d7d78db3d7ad8d89eac194dbb6bdd9adde9f8e9affff8bc4c481d9d6e98cb8bb8ad6e0e09796bc8cb2e7b9ccb7a7b7c0e2a023f6ec6586e63aa68801c3a3d9014edee1b6affbfae9e2cd9892f7e590c3a0dd8dc5ef9bd7c38bc689c1c997d398b7b091a1d9e48ceb90d6eec9bc8b94aaf6e00483ad03dcd472f302b6fa1c91860ef1ae4c85f72183c40043f39f87e1cbb68af18095cfe1e2b6eeffbafaec8fe6f7dbe4f4d494c6ce8d9dc794c7a1eca9baf799d58b8dc2b4aabf85f0e8e001b5ba369c02fb960291e739b0fc3fe1db04b1ac01ffb4002390c1b885a4fc9fb8bfe18d99f39fc4cca495a7b9a98cffd2cfcce8fe9eb7f1ccc2ceb2e1f2ec87b18993ade6aa898b93d3dc803be5b72884c019d183309ac00486ff33b5ed1081fa27baf4000af1fdc3a6dc87a6c0f0e7dfe7a7e897cfa992c3c1e5d2cad39d9cfaefbea5f9d9b6d78da4f1ea81e9abe9d3a88b, 0x1131312110d0d0c0c0e0912020c010b01080101010a131312110d0d0c0c0e0912020b010a01080101] private def node887:Certificate:=PackedParametricCertificateData.decode 13 data887 private def data938:List Nat:=[ 0x10c0006000a130d130c0c0b0e090c09070306030d000c0006000a060a02020600060308031204030202020310020a0209080506040604010806070603080206040e04010d1c091406060506041c0308020002020204130f110b0c0b13080f080b0211000c00060002000a130f110b0c0b13080f080b0211000c00060002000a130f110b0c0b13080f080b0211000c00060002000a060a02020600060308031204030202020311110f0f0f0d09090f080c070c0611010c0101010a11110f0f0f0d09090f080c070c060c01010100000a11110f0f0f0d09090f080c070c060c01080100000a060a020106001203140304020302000203020301070204020202030f0f0f0d0a0909090f080c070c0611010c0101010a0f0f0f0d0a0909090f080c070c0611010c0101010a0f0f0f0d0a0909090f080c070c060c01010100000a060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306030f0f0f0d0d0d13070f070907110110010c01090f0f0f0d0d0d13070f070907110110010c01090f0f0f0d0d0d13070f070907110110010c0109060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301010702010202020306020306000603080307020206020203, 0x1130d130c0c0b12090e090c0901010b000a0008000a130d0c0b110a11090e090c09080101010b000a000a130d130c0c0b12090e090c0901010b000a0008000a060c020b0201060018041a04130d0c0b12090e090c090d01060101010b0008000a130d130c0c0b11090e090c090d010601010108000a130d130c0c0b12090e090c090d0101010a0008000a06130d130c0e090c0908070905070501010d000c000a130d130c0e090c0908070905070501010d000c000a130d130c0e090c0908070905070501010d000c000a0601010a0209020102000404060409020802010c0002040e0408060706020e0008041604130d130c0e090c0908080e0705010c00010000000a130d130c0c0908080e07130105010c00010000000a130d130c0c0908080e07130105010c00050000000a060a020406020203120403020202030a02090201020004040604130d130c0c0b0e090c09070306030d000c0006000a130d130c0c0b0e090c09070306030d00] private def node938:Certificate:=PackedParametricCertificateData.decode 13 data938 private def node939:Certificate:=.split node887 node938 private def node940:Certificate:=.split node833 node939 private def data994:List Nat:=[ 0x10e0c120612050d0505050c02091212120d12050d050505020206060b0208020112003004360304020302000203020301010d0208020302030204010d0c0b020a060608040c030802000202020412111111130c0a071206080608010d00060002000a12111111130c0a071206080608010d00060002000a12111111130c0a071206080608010d00060002000a060b020902020c000c0410031204030202020313131111110d0c0c1108090811060d06080602020a13131111130c0c0c090811060d0608060c0202020a13131111130c0c0c0d06080611040c02020208010a060b0208020112003004360304020302000203020301080206020404030403131311110d0d0c0c11060d0608060c04040202020a131311110c0c11060d0608060c040402020208010a131311110c0c11060d06080606060c04020208010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130c0c10081307090710060c02110110010913130c0c10081307090710060c02110110010913130c0c10081307090710060c021101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d04090601020306030101070201020202030702000202020306020002020203, 0x199898b92b7e0d8e2aaf80f05010202e085ed80a5cadfece68fd4f9e9b7cca491c9f1bebdfbe2c99db6a79bb3c2bbebbf9a0d05010218ead1c39fafd6d6deeccfd6e5fddb93aff4aed1ccea9ea590caf8edbca8d8ac9d81f20202010202b3b0de88fcfa8bd78fbd9dc1d1b4ad80f2dff9c8eccc93d3859adbd4b48dc7f6f0ac0e01010201f68382f5e48cabd9b187e2a1dcc1c5e2cc95aebd97ee9d96fed2c6eaaaeab597ded4050101020197e09eb0a0e7fef39785a1fdde87f59f9b8884eff39adbadf0c9d1a1dbf6a8b8dcde120e000218e4f8c4d2efc1d9de91a893f4b8b4b5b7fbe0a8d490cf8f80eac5ace9c5b8f89fe48e120d0002078aa4ccb0e6deb9a8a6fe93e6dbcae9aba985c3e0f297e1b5efb4deafbc9fc08e9e0d05000227dbbcd4e6acd8fedaa988a88aefe6bdc9b7d68ba8f5fa8e90c7d2c2d891eff7beabc0050500025bd6a9a789f0999bb188f9e4cc9fffbcd5c5b2a7cac8ddcd8af187d5d2c38dafcb8fd2191999ba8af59597edc5e78fffb7d1eff3ab888ec5cfe8fbd4d8ba9de4000b020902040c030403120403020202030f040a04000603060412120e0c0c0c12061205050506031202050203020a1212120d0e0c05050d0306030502030208121212050d0505050d03120206060b020902020c000c041003120403020202031212130e120d0808120612050d0505050c0202020a1212120d0d0d, 0x1d30fe99106a3ca7acb9c0019d680dde8bdf8e687a8cdf39fefcc9b86e7e984b1fe93cfacd2cfa5e00ae1ca01a19acd14e3b67ec9e80cbac25f8cd26de96ad9a900799bf7fef78d8ab8c4abee9dfeff8cc1c39dddb680fbdff6babaa7ddb8120e020226818288efb496f9bfbedfaaeeb5a79bbae893b19396ffc6f5cc9e9390c399e49dc7c2110e020202f790b19fd481f7e3b6b7dae8a9abf6c99abdc5ace69b93b888a7cbf5dad8b3dff8fc0c0c02020dcfe780b4f98582b683cdbecee6ffedd988cfb4ab8be1aff0de99f3c58fb2a5d3d60d0502021d9cb8e5de9bf18194fafa82a0b7bad28a8a8ec487ce94ebbbf9a2a6e1eb98fffe82d60605020264aee7b8c6b091c1c988c297c39f96fec5a389d4ffbded8a9aabf3f3a0a6e5d4f498050502020184eee5b1d08685d4baae949dd58ee6e5908adea78ba2a1c2c9e9bbe4d79cb8f291e7d20e02020203e3eeadfeda82b9ea9fdeb0d5ced3b0d8ae94c2d4d3b4abc8c8e28ad2b0d6f591e8c80d020202029ee4b3e2e2a3fab8e695a0d0c8c0f3aedde782fc9ef7de92f8a98fd7a38a84bfd6f605010202088997eabaf386baf8eceffea0e6acda8eb99bb3fba2d5fedcedabc8f99dd99dc096d8120e01021efb8c95ea87ff95fce2f4ce8191ad8eb8e38eadf19ffefe87cb84fdb7e29cbfc6c4bc0d0d010202aea0ffd4d8add4838a8487a597f7d4eaf6fddedc94f1fec7, 0x1010205a78ecf998bcffe8b97c697abcf998eccb789decec5928fbbacf6d893add1e8c1fff9aff00e0201020cc3e9fdbbdd95f099d1d799c5b58299ccc587b2fdcf96b8dde9a098fd84b7dcb0a1e79a98120e000244c39fb2d5cdb7dfe8a0fdaea9a4cbb1e2fe83becaf5baecd09ac5d5f4838190a6e39586d4120d000207f0c38da0f6b4a481dbf69eb4d1d3cce3cf9e9593fae9d9daa3eba9dfaac0c0aab8deec050500021ba6aeaff3c0c9a1b5e7d09291fdc3a1addfc6c7b0f1d2e29db6fec2a1fceed0e9a8a5c80e0300021dc594dce5e7beb6d7b8a198d88bfcd6bccba09387a6e894d1a4cea5879fa7b7a69ce4bad40e020002039aa7e584d9b4cffaca99a6f9cfa7dfc4c7f485ca97fd81e59cabfbace1b482e0978ab3bc193bc5bbae959eec8ba69deedbd99ed387c4e3d3acc1a3a2b2caf6e491b4a00001010f040a0400060306040e02090201060306040c0608060204000a040e0405b0bb0293d779f7b10181bbc60108bea09585eba58e86b3d1b3b9fdee9db1dab090ac858aefd0e9d1fc83c004bdc955ef01afce01d2b827eedf41e3d624f09f0afbaa001bca80b19b8fb0f3c3fea0bfe4cde5edebc488f88aabaaed81d499c9d6d455805df312a1af11aab410eff71ee0d447a8b655999100089885c0d8a08381e597ccea9787ccb3c6dde099828eb1fbe3e7f2c2dfca018be28e10fae906a9b373fcb57185, 0x1d39cb4b5c6ea9da3f0b2b0ddba8cf7c9daeb8c9acbc4f0120e020239a1c494f3eba794cbf3bda8e8fb8998adccd88df2d9ffd990e0ea838e829a95dce6f0f3aa110e02022a94849499c8f5f5d9ca94f7fde7f1e2ddf5aa90b4d7a4b0848299b099b0879b949e84960d05020269cfdec0a2e492fcfe9186dca58ac5b3f58caa9aaef7a7afc5e997cacde983938ab3bedc0e0402020688f0d7c18ea0d5c9f88b93aaa392d7e9899fcfd4be86c6bdd9c28b979484f6a0dd8d998a0d030202019ffacdf6e2f5a3f997d3f4c9bf8bbeefefec89e1a9c0bddbd7fea984f3e9b4bea5bee8ac0e02020204a8dfa781bdbae6c88ba3c19682948793bed5e7e0938addf395c2b5c3afefac83a18a888e0c00020204fcfdc9fec3dfcdb4d091c3d1fbeeb0c9e696e480cca2fcb7899cbeaaf5f4ea94a8e7a00000020251f3b39bb6a0d1f6bc89b2a887a5b7d2fdcbcfe5fa96c7b3e3c1c39dddf186d0a0ee98120e010239de86aedc98ede4aaa2e0ffd0f1b784eccdb5be93d09ee0cdc39be78184acfcfd89c0d0a4110e010202ed8caaa585df9eaebbfe9db38ccffcacb7a1e9b9c4f687aed4eaecc8a3b3d599cae4aec0120d01020385df9f98a9b4fb9db982cd8d89ce8ed79fc086cd88b8b886f79689c885ab9db2efef99cc0e05010208d3cbec94a0aef7ffc29ebdd6f3c6869ad3b2d5fdaff7f8c8ee84f8b1e5efeca3d8dcc8e00505, 0x1e5c1c1bfb7caa5c20900010256cbdb83c4eac3a488d9ed958613130002039bd6cef2eefbaa94e9cfaab01211000201c1a5f4a89beeeb87ff94c8a0a00d0d000209b487a2e5c9e2ffb882a2ebd80c0c00023af583a3948de3cedce099d3a80a0a000216adf1f7abbcf1f5a1a18bc9e81207000214c5e6f2b2aff2a9a191c5ff800f0100020bf6cc94a393df92ec978c95a0010100026eabdec1bbd7a49cfa87a48dd0090000025fd897c7e7ddc0bf98e1f995e0000000020ded85a9e6f5a4c88bc2c1d9a81e01839de1afe3e8001afea742c58662dbff3b95a2010da3f697bddffbb69290fb92b68dd994cb8bfea1a59ce8eac7e9dae1d093fd9001cf8103b1f403e2a9028f8014e9b529f1f43eb2e729aaaa0053e2af898687f6d8d2b9debcb88bcaa7f782ca82e2d284f7fdffb980eccda4d804888605adbd02d1f513c92adedd3bb68823d7f834afa1002cf6cae1b7f6b4beaaf987eaebfaa4e4e081ebbfb2cda88de8d6beefefcbf3e01ff3ae588ea10187c2f44eefef0accd92b8892538fab32d3f40007e5d8dc8cbcc6a7ccd6f29a95d48899e09d969efbe6ad8995c7c197c5c4d6c80fbed607eabc2af7890fe69635c5de1892fc27d34db185003488e2da9de696aac5a2a2b9d6b7f684d68181fbb8c5a8a2d8c5dca3e8d1b0319ef60180f9ce2f9a8e01d7dedb2c91f153cfdb2c919b01abf2ea0006d0dffdc0a8aec9, 0x11211130c0c0c0d06060612020c010b01080101010a1313121111110d0d0c0c06060a010901080101010a1313121111110d0d0c0c06060a010901080101010a0611020c02000603060401f1b402d4a561b20299bb0f9af822ea813fd184298cb500799ceac0cb92d988121202021ab58ae8f49bea81b3d3dc8db0121102020196bfc98fc0b6aaa8c2ffca96880d0d02020c879ccbd7c3cbf195f99883840c0c020249a597959c99a6ab88db88e09812090202248acab7afea97abb084b086c40e0102021debe493f6f6f6ceffc4b7c9bc01010202778cbb8682f9c0a6e0cd9593b8110002020c9eedb6c8949fff8fedd5bbf8090002024ae1bbc9b3b4c0c0ccd686d1ec12110102018ab3e28b8c9db7d3f7a9c6fc86130e010203eba9d4a8a6ebc4cca580b3ba0d0d01020ae6eea6ce93b1befce0a0e0ea0c0c01024eacaf97a3e9fbc4d9a4ece5d01209010242fddde0adcff2e6bdd1ebfc8a130101020a8bf7aae39d82b7a5a5e5ace60e01010202dfadad83d9a684b4b6928bd60101010279e7af9aca9c9be9c2a2ab97a81100010207b9e2c1c9] private def node994:Certificate:=PackedParametricCertificateData.decode 13 data994 private def data1044:List Nat:=[ 0x1090c09070306030d000c0006000a130c0c0b0a0a12090c09070306030d000c0006000a060a0202060006030803120403020202030b020a0209040504040404010806070603080206040e04010d1c091406060506041c03080200020202040c0b0c0913080807070306030a020c00060002000a0c0b0c091308080706030a020d000c00060002000a0c0b0c091308080706030a020d000c00060002000a060a0202060006030803120403020202030f0d0f0c110913080f080c0706060c01010108000a0f0d0f0c110913080c0706060c010801010108000a11110f0d130c0f0c130811070c0706060c0108000a060a020106001203140304020302000203020301070204020202030f0d0f0c110913080c0706060c0101010c0008000a0f0d130c0f0c110913080c0706060c01010108000a0f0d130c0f0c110913080c0706060c01010108000a060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306030f0d0f0c0f08130709070d06110110010c01090f0d0f0c0f08130709070d06110110010c01090f0d0f0c0f08130709070d06110110010c0109060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301010702010202020307020002020203, 0x1130d130c0c0b120911090c0901010b000a0008000a130d130c0c0b120911090c09080101010b000a000a130d130c0c0b120911090c0901010b000a0008000a060c020b0201060018041a04130d130c0c0b120911090c090d010601010108000a130d130c0c0b120911090c090d010601010108000a130d130c0c0b120911090c090d0101010a0008000a06130d130c0c0b12090c090a07070501010d000c000a130d130c0c0b12090c090a07070501010d000c000a130d130c0c0b12090c090a07070501010d000c000a0601010a0209020102000404060409020802010c0002040e0408060706020e0008041604130e130d130c0c0b0a0a0c0908080d000c0001000a130d130c0c0b0c090a08080813010d000c0001000a130d130c0c0b0c090a0808080d000c00050001000a060a020406020203120403020202030a02090201020004040604130c0c0b0a0a12090c09070306030d000c0006000a130c0c0b0a0a12] private def node1044:Certificate:=PackedParametricCertificateData.decode 12 data1044 private def data1093:List Nat:=[ 0x10204130c130b0c0a11091308090201010d000c0008000a130c130b0c0a11091308090201010d000c0008000a130c130b0c0a110913080a0201010d000c0008000a0612020906070603020312040302020203080401040002030604130c0c0a13080908080706030a020c00060002000a130c0c0a1308090806030a020d000c00060002000a130c130b0c0a130806030a020d000c00060002000a061202090602180012041a0312040302020203130b0f0b0c090c07060607040c010b010c0008000a130b0f0b0c0913080c07060607040c010b0108000a130b0f0b0c0913080c07060607040c010b0008000a0612020806012a00660474030402030200020302030101130c130b0f0b0c090f080c0706060b0108010c000a130b0c0913080c0706060c010b0108010c0008000a130b0f0b0c09130811070c0706060c010b0008000a0612020806012a00660474030402030200020302031004070a0602011204120310040002020603010e0402020206030d04090601020306030f0d0f0b0c09130709070d06110110010c01090f0d0f0b0c09130709070d06110110010c01090f0d0f0b0c090f08130709070d0610010c01090612020806012a00660474030402030200020302031004070a06020112041203100400020206030f040e0c05240236043a030e0402020206030d04090601020306030101090207060008030803, 0x1130c130b0c0a0c09140606060a020801010113000a130c130b0c0a0c0906060a0208010101130008000a130c130b0c0a0c0906060a0208010101130008000a060a0201060012031404130c130b0c0a11090c090a020c010601010108000a130c130b0c0a11090c090a020c010601010108000a130c130b0c0a11090c090a020c010601010108000a060a0204060202040108040104000203060407020106000203080408060706020e0008041604130c130b0c0a11090c090a020c010601010108000a130c130b0c0a11090c090a020c010601010108000a130c130b0c0a11090c090a020c010601010108000a06130c130b11090c090a02080201010c000b0001000a130c130b11090c090a02080201010c000b0001000a130c130b11090c090a020902080201010b0001000a06011204030202020308040104000203060407020402020204060603020206030804010d1c091406060506041c030802000202] private def node1093:Certificate:=PackedParametricCertificateData.decode 11 data1093 private def data1143:List Nat:=[ 0x10108010101091511150c130815021201080101010706150c130c130b11090c0913080c000800060001000a150c130c130b11090c09130809020800060001000a150c130c130b1109130815020c000800060001000a060112100602020603080401040002030604130d130c0c0909060d03060303020c00060002000a130d130c0c0909060d03060303020c00060002000a130d130c130b0c0909060d03060303020c0006000a0612020806022a0012042003120403020202030f0d130c0f0a0c090c07060607040a010c0008000a130c130b0f0a0c090c07060607040b010c0008000a130c130b0f0b0c090c07060607040c010b0008000a0612020806012a006604740304020302000203020301010f0d130c0f0a0c090c0706060d01080106010c000a130c130b0f0a0c090f080c0706060b0108010c000a130c130b0f0b0c0913080c0706060c010b0008000a0612020806012a00660474030402030200020302030402010402020310040002020603010e0402020206030d04090601020306030f0c0f0a0c09130709070d06110110010c01090f0c0f0b0c09130709070d0610010d010c01090f0c0f0b0c09130709070d0610010d010c01090612020806012a00660474030402030200020302031204010202020310040002020603100402020202030e0402020206030d040906010203060301010b0c08020702030403, 0x11312130c1209120811080c0814061301080101010a1312120912080c08090814061301080101010912080c081406130108010101080007060b020902010c00240428041312130c1209120811080c080c010601010108000a1312120912080c0809080c0106010101080009120811080c080c0106010101080007060b020902040c0304040108040104000203060408020602010c000404100408060706020e00080416041312130c1209120811080c080c010601010108000a1312120912080c0809080c0106010101080009120811080c080c010601010108000706130c130b120911090c090c0801010c000a0001000a130c130b120911090c090c0808020c000a0001000a130c130b120911090c090c0808020c000b0001000a060112040302020203080401040002030604080206020404030404060603020206030804010d1c091406060506041c03080200020202041312150c12091308150212010c010801010113000a13121511150c12091308150212] private def node1143:Certificate:=PackedParametricCertificateData.decode 11 data1143 private def node1144:Certificate:=.split node1093 node1143 private def node1145:Certificate:=.split node1044 node1144 private def node1146:Certificate:=.split node994 node1145 private def node1147:Certificate:=.negative 1 [(3,0),(2,4)] node1146 private def node1148:Certificate:=.split node940 node1147 private def node1149:Certificate:=.split node751 node1148 private def node1150:Certificate:=.split node680 node1149 private def node1151:Certificate:=.positive 1 [(1,0),(2,4)] node1150 private def data1211:List Nat:=[ 0x10f000201caf6deffe2e2acfccceafecec6dad6c1a6f00707000201b9b78ff7d489dcf3f78d81f784d8a09b9aa80f06000224d2f88ebfa9aee1aefaa9eba38ec7adaac0060600020295f58b8b9089e6cfbea8b8c0a1c0d7b9afc8060500020385989686d9b6e0bea4e0dfb9c5cd97f29da0120400022992df83faa3a79bcaaddb86f1b3f3b4d683c01e22f6e19ccadae5a58ec4dc88000b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a0200020202030113131008130711070807110606061301110113000a13131008130711070807130611060606130111010a13131008130711070807130611060606130112000a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030c060a1200080308030113130f0f11080908130711070907130111010913130f0f11080908130711070907130111010913130f0f130811080908130711071301110109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d100c120a360120043003080200020202030107020102020203060804060018031a0305020102000403060306060402000803080307080204000603060306040002020603, 0x1f9a3ea85a2e899e7a487a8e01313020210fcf991ac8cb1dccef8b39bc2bf97f98dd9b0131202022afccbd587a69ee1beef82c5a9fca2e0f087c013100202428dc5a4d2eb87eabce6ab9794cdf9bd8ba0110f02021598bd978fd3eefae1dabcbec8dacad5dbb1800707020228ac8ee4e5d7c3f9eccedcc1bcc9f6fbe1f80f06020201ca99d9fddb94d892b2d9d0c7e2d38e8ffdf006060202048dc8b8eecdcfca9496cee9fbb1b3c2e0f2bc1204020221c4a7c4f384e1dbf4a4d7dc8cbfdb9ce0c4f8040402023286b9b9b584bace90e0aee298e0bfbff7bc1200020201b3eb93e29ad085c98fb89befd8939a81c6c81313010207e3d5b6bd87c7969084ca90b9df9dcee3a488131201024bcca8bac0e3fcb2b4ded7bbb887efebe7d6b8110f01020fbffee4d8cccadd80d383a8acdefae6b583800707010279faacea8eaca2d1b4b5b2f9b6c19cd986d00f060102189ac3a5cff0f4b9b4ae909a95c0bfaccdc00606010203d7b0f28efff5b89cd1c98cb989a4b0fa87e00505010201bce1db8cb7b3b2f0dc85bedebefaea9be3b01204010223b889e8e4e1e889e6c2b9b2a7e8bebd83c9a20404010203829eb9eaeff1b898b1f6fc8ba892da92d0120001025399cefdb4f89dffa590b0909ff9c4d9b48a13120002639cdaf79dc1f7dbcc83c1ce9de788b2fdba80110f000209bcda8bf9ef90a1fdfa8ab8d7eec49483bce00f, 0x1b4bab4b1c8adaacd87b3c006010202018dccb5b4caf8b2e2dcadc5b99490acc01200020268ee8dfaafd997abb4a3b6b0cff984f3a6c0131301020297ba9cb78cbcfee88defb2a1ffc5e4a9809e1111010203b1aeae83e28fe0be8ef9d4e4d0e3da8ff4b2110f01027bafedd0a4cfadd5de83afd9efeca3c78ec011070102109fd49bd6f3d3bdc7d0aa92ddf1e6d891f013060102038ad784d8ffc0fb89e58ebeeac1efcc95f0f81106010207ddb48e8ccd99d0fcd98e8481e5ef88de90980505010224e2c8faea9abde190cba4f2a2818bd8801200010264d0edfbd2b095cb9c93edf0f9c6acac8aa01313000232fedc8c89a6e4e5b3f6aed5c292eff9c0f81312000206effefeb1d7c09ca2ab8c92cad8a4bee6aa98110f0002498bd3eab6da8d98b4d5b792d399e29388801107000201ecded9cae1d681cfb8f7d3abeabd8d99e0f81306000202f4cc81cad281e89fd3f89d949c89e8b7e3801106000206c9a0c2888f8aee92e897eea5d1a1cbb48c881200000261bbf4d7e1eba5b1fb9b84a5ae96a1fc84801b029df08ed0e291c4b7b6d480000b02080201120030043603120403020202031104080c010e031203100400020206030b0200020202030101c7fe05dea101f8cc7e8b08e0fa2bc1bf3fc2cc1fdfbf0029e4feb8c3b6acbcb2c0ffee93e004bd9704b48d0eb0a40796f9418fd42ae0cf28d4fb14a9a600078d, 0x10d130c11060804130104010600091313110f110d130c110608041301040106000906130402020202031313110f130c0807130607060d040604100106010a1313110f130c0807130607060d040604100106010a1313110f130c0807130607060d040604100106010a060b02080201120030043603010d040a040904000e040e03011313110f110d130c13061106110110000400091313110f110d130c1106130111010400081313110f110d130c1306110611010706130402020202031313110f130c11081306110611050705060105010a1313110f130c110813061106110507050501091313110f130c110713061106110507060b02080201120030043603011104080c010e031203100400020206030108ee8605f6f072c6178311b9910d898344d7d044d7cf0001b1a69096cccbd1bccce989802395078f01958fb40195f199138406a063f59563f5960001b3d1e4bd95a38cfb96d88013130202029fddf3f0dfbaf0e0e98bebd2ff9485a0f7de1111020201c7e9ab888c9a81b1fd89fbf8abe8f78eddb2110f020201af9593e7aac0edd2cdf4fb8fc1e9c4e3a380110702025db3b7f9f5bbc8f8b5f2e2c8aba4d2edf0f01306020203a1c8b5add5aefcd1c1979efab4b28888f3c01106020206c9c78e91978f9dc7efdaa087c1cad0d79e900706020203d0dbd4bfa180e8bdc5d2a98da7ecc680050402020bd1d3d1e2e3, 0x11313110f140d110d130c1109110104010000091313110f140d110d130c1108110104010000091313110f140d110d130c110811010401000009061313110f110d130c0d040804040102000000091313110f110d130c08041302110104010200091313110f110d130c080413021101040102000906010e020106020204111c0d140a060906041c031313110f110d130c11060804130104010600091313110f11] private def node1211:Certificate:=PackedParametricCertificateData.decode 16 data1211 private def data1269:List Nat:=[ 0x10f000201c3fa83c394a1a6fba6afda89e4a5e9eacbb0070700020cc79cb2d7c0e9ed829ddbddcc9487c5abec0606000237c2f1dfd5d5afa8a4c08bbfd7f2a08febf610040002018aa493be9fd1e3baf29d98f0a0818385dbb80f04000201d9ddc8a2f782fd8be8b289eab0d0df9c8be00404000201ac86bec0b59ed6d399a4fbfd86cdf184961e02d1b7fdf1c7b9c0b28af4d4000b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a020002020203011313130f100f100811070f07090706060f0211010a1313130f100f100811070f07090706060f0411010a1313130f100f100811070f07090706060f0211010a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030d040a180808000a040e030113130c0c110811070f0709070f0211010f000913130c0c110811070f0709070f0411010f000913130c0c110811070f07090711010f010f0009060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d080a120806010a04120308020002020203010702010202020306020202000203040305020102000403060306060402000803080307080204000603060302020102020203, 0x194f021ecff00128de5a8f89bcfcfecb1ca93801111020265d0baadb0d0d8e9d6ba9099eac8a1d39f841310020203a5dd9be494a58daab4e39af3cbcca58893b0130f020202a2e19aa8f091f6808586a2eaaea3d794ccb80f0f02022dadd4c09dcbecbec481a3f4abecb4e6c9ec0808020208e78ae0a9d09be7aef9cbd0e49597c4dbac070702023bc7f8d083add3e28c9acaa2b1d3e7889c06060202089094f7d098cafda4e5f5cb98dafd8af9f00f04020201a4d1d998cf8490fefabea5bf8d9b95c0c3c00404020205ebd1fcfcebb4c5e8bcb0cd96ebebaedcf8040102020b9df3e0cc98cf8ffe86ee9df784cddc90b8111101024c9cfadb959fe2c7df96f0fe8fe3c8cd9be01310010203c7a7c5e3d9afa0c5d197d2e8d2b8e2d980b0130f010201ebf3ffc09ce2e2c0d8ad83a5e0efa2adb5e0100f010207f0ebdb94c4cba08d858ba2e3c5bface0b00f0f01026685d6e0a6b1e587f0b7a2ede7e1958dcf880707010207efdadee1dadca1e0dd98eeb3f8affacbcc0606010215c3b2b3ffb9cdea9ed7918792c3d789aa800f04010201bdf2e3a6c2ce94b6c4a6c0a9e7e7cbf9fde00404010221ebfcb5d4b68bebdec9f19cd2ffdbea80cc1310000202d190a1f1fbec99b7e3fd9cd2c6a0dbe890f0130f0002018f97a2ce9cf3d7eca3c7a2e1b5f6aba5daa0100f000201cd90899fc7bfcfccd7f4c3e19af5e8eed3b00f, 0x10401040000000a061313100f110d09090d0711060f060f02040102000a1313100f110d09090d0711060f021101040102000a1313100f110d110909090f0211010401020000000a06010e020106020204111c0d140a060906041c031313100f110d0d0911060f0607061101070106000a1313100f110d0d0911060f0607061101070106000a1313100f110d0d0911060f0607061101070106000a06130402020202031313130f100f110d08070f0607060d04100106010a1313130f100f110d08070f0607060d04100106010a1313130f100f110d0d07080707060d04100106010a060b02080201120030043603010d040a040904000e040e03011313130f100f080711060f0607060705100106010a130f110d080711060f06070607050f04060104010a130f100f110d080711060f0607060705060104010a060b020802011200300436030f060d0202060302031104080c010e03120310040002020603011313130f100f0807070711060f060706100106010a130f110d0807070711060f0607060f04060104010a130f100f1108070711060f0607060504060104010a060b02080201120030043603120403020202031104080c010e031203100400020206030b0200020202030104c0fa08ceb17ef427bb03d9b627fbd141c6e020c4fb00038583d5c7c6b9bfc4e1deb2a8b8209a8174b904a7fa019aa644d8a637d5ec0e, 0x11313100f110d0d090a090f0611010401040000000a1313100f110d0d090a090f0611010401040000000a1313100f110d0a0909090f061101] private def node1269:Certificate:=PackedParametricCertificateData.decode 16 data1269 private def node1270:Certificate:=.split node1211 node1269 private def data1287:List Nat:=[ 0x113131111130c0c0c080613040f0411010e0108010a13131111130c0c0c080613040f0411010e0108010a131311110c0c080613040f0411010e01080101010a060b020802011200300436030402030200020302031104080c010e031203100400020206030d02080203020302030e0402020206030d04090601020306031313130c0c0c110810070f07090711011001091313130c0c0c110810070f07090711011001091313130c0c0c110810070f0709071101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node1287:Certificate:=PackedParametricCertificateData.decode 9 data1287 private def data1334:List Nat:=[ 0x184b6dbf1abf387e1f4d080120f010210a49f8a93d088bce7e7b7d2c4d8c4feb7c7a388fb80d3ef800f0f010209caf0c5d3b08ffadaa7aea3e891a7c59abaf085d8df80d0c00808010203898be9c5c1c085e0b3c491b4cea1d8abd78dcdbfb0fdeec0130401020bbeffb4df8cdbfe8797f489cbc4bde6e3d591cc8e97e4b1800f0401022ae8e28dfee19292aaabfd9a81a0a5b4a6eafbd4bed384f380040401020da4e6a2d9d99fbbd3b1d6e5ccc9bff9cbbcfbf8c3c98196c01312000260e5b5f6c7b6b694a2d9fae88a898eb8d9abdb96b6b1d8d480101000020de08ee8f1afe58fc1ace3dfb0d9c7ffbcd9f492b4d3dba980120f00023dd3e7f6a482a6cccad2dec7f89debc695addfdfe1b2d194800f0f000203b7ae8090ece0c5ab9ac780cefae9fc95bfa8d7c6fee1fe800808000202b1f78ad4c9ce95dbdec3c082e1f984c4f2feeeb4b1a5a4801304000206d999cdd5aedbedae968acda6c5feaf9b8cdbf5818fa9d180120400022cca81a1d69084e5bcddb5f9f0a6c4bdaac3e9cc8da8ffcf800f04000223d6a2cea8c0b4a4c18792bef3e6d3e5b59287beac9ed1e280040400020afa9cd2889782d0ddd2efdfd9e287d9d4b4dc83c8c78aed801e55c1bbb6b2c8d4a1f890b3aba4c8f1f0f1c0000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1e982a2acee80000b020802011200300436030402030200020302030f040a0400060306030e020902010603060303919005f6a159ea29a314b2c0329def398e9c1cc8bd0073a2c6fdd481e2e983d195e5dad9838ed9e6848004ebb504e99203838801ce953dc89427b3ad2ec9d31882cc001db7fff2b9ab8cb0fb85ff878590edbcf8a7d68026e1866595877885c03c9ed714869133a89e3e83fb1fb4a0006396dfc6e689fdb78ce2d6b2c9ff95abf28180131202026c848cacce80e9dddfb7bfc2ad8f849ca5d4bfe6e18ac9c0901111020208efc4bb8bdfa8b8f4b2d9f496f7e0b1a9e3d6dc88d3ae80ba130f02020cba91d8e3eedbc4a19aacb5dde991bcfec7ffdbe18782e7cc0f0f020206f290ab9ad5cab5b79ec6cbecd0bcc0cbb4d58a9cbe9bce9a0808020203acb8f3cfff81b8afed9282cca6b4e6cfa4e6f6e680a59db6130402021882a89984c395c3f2d8e5bfe5b7e2e0cde1d7ddcf97fad4a40f0402021de9b991bfe19fb6befbcdb48cf981e599d086edacbcdecfdc040402020aaca890d699e9fbb9b6b49689ce90ddf3d8b5e4e594a1a8aa040102024f86a6df95bacdc7b9b5f881f8e8a0f2ebd6e7c8adf9e0131201027bc1a9d4fe84c1b48dfaaca28c8392bb95c1cccaaf80c1f8c01111010204c0c79193f2a7f8fa9afcf3c0a7f4dcfba9c9acbffaddaa80101001020bed9ac0aa8d8390a2e59b96e3f2, 0x1e8daaddbc4ccc5fbe498febaba9ed08995e3a2110502023bd88aa687ee80b0cb92b7badd8fddf4a097b39cfdf1aba40705020221e7b4f5f099b3bed2d4ae9199dce2f2c0c5c3e58ad991c00605020237c1ad9fe88cf6e4af9c8ac0dfd38a81948480cbf3b7bed012020202049f8fe3fcf08495d298c9ebd5e9dbfba2b8eb91b0969fdb94020202020cdae4cbb7e781f3e7e6cad08fc79bee97d7dbad99eee79613120102629da9f5d2bdefd2d785bef18cbdc0acbaaaf184ac82bcd01212010217e2fb98befbb4a4d6a9bcaefcc089b38af5b69d81eee494900d0d010216ef8398e99da7a3f6dce391f2d184ecc4cb92dffbb8cfe0060501026285c1affdfbc5a6cfe7d399cedd8b8edd88a7b8f7efe4e0050501023be1c7c5b8fbcfa9cde8c0d5b287f6f2e998f8f4b0fbffa00e0401020bdaf98ba59a8a9be3cbac8aac92b6c99edc869896f3a01202010203dcbfac96a795c3a68dd09983adb0a5b79589bdc6a0eed0c0121200021fe786afbffaeffe98b79f92b39de2d9e2fc9badf4cfe38c800e0d000212ddb087dcc3e3b2d581defdc48cb8d0cbdcb991faf2f2800d0d000208f2c4cfee91dde3ede1d8a4a691dab4d1f5f38b86d8a8800505000277bc8ce0e5b1a784a7e4d283f8a4fcc5aef8e3d888e8a2c01202000203c1e3de9cb8a8e5a3c4a98081e0c2f9fdb5b2c3e2ccd69c801904bed7b1b190a8e0aadf9683, 0x1d2cde5d5f2d0b3d0e6a88489e4fa98050201020b8385dd9e87a0f9bac9bd81d6df97afe8e398acc28a12120002129ea694f5919e82e9d0959d98becbc5ebd1dba0e8ce9012030002039fe3f6a7fcd8e4a1cf92f9bef6e69cdb868cefbe89ee0d030002019ff3d6d8c6dca1f6a78cfdc7ca9ea5f5b0b6f6c7bed60503000206d3cbbbc184f7a99cb793eb9c9f85f0a3a199f7faceb61202000202ddb09df2e1eb85b898e5bea0c4c9aee295cf9ee49f88020200026ee3ddc9abbb98d480bd8a9eade7c7da96abd7c5b21903ba8caed68adeaca6a9e89ec897b6e4000b020802011200300436030404010600020304030f040a040006030603010b0200020202040ae38509d39e70d30280fe0edfa72dc7983e83ef1f9c800004ebae9e8fd582d3e1ecb089beb5efdacdbab7b817dc8914cdf65baa02b2b82fd1fd1af1f62cedce188dc50001fee4f9ea94fcf2aef0babcab84d6de8596fd8025bd862294d6019bdcd7548ae214c6ab12d08b5789c62ff38d000aee9cf2dfe491f6bfbfb7d4829afac9bceec01312020201cfaa99aaa9bebfc8b48cd2d6cebddab380cae0bf90c491f4121202020bfcb08c8efbe1f6d6dfb5f18f80f4b9b7cac2ddc5b890b2e80d0d020201f5cba58dcfddc4aac2cdb8afffe7e8cbe58b86edc8bbae0e0902020890ec9cbeb7e0d19ee3d3cca4b18982c3fdd5f6e7c4e796060602020482d5d29c, 0x1010107fbd508a7f201ccf612c011c7b729c4e040b18d28b3e60003c3a0bfa9d1b191d9ccc1b6cfa780f196a002b4f449fa0298ba06bfbf3d81bd29d79c28bcaa1592870001df88efacd8d8f6a0a4aaa3ccc3c5edc4c80fcda90a83d5019ffbba0183aab70a80fd0f94af5bec877581b600118682a3a6bb85fdc3ab96878bd9b19f901312020201a382f4aeb2bfbcefe7f2f4ae8194a8a6beeba6bab1c0121202020cec848b99fbdfb3d88efcfadce088e188fb8beccf9a800606020201eefb9f89c89fa0a2f0a5cb9aebcfb3b497d9cee5f408030202368fbe94aa95d6e89f82a2e581d99ea3eea38efbfec805030202049588e398c8a3a8f8e2e2a5d38796ba80f8fde6a89dc0120202020384ede8d0f2ebb196bac68fbd96d0e5f68edea5a4a3c0050202020df1ea9eebaab49ef586fdb7a5eff296bbfc96abe7880202020230d1a1d485d6f9e4ac989594fbe48ef0d2e5f9e39398131201024adb868991cb80a1ccfa99c897d0b1cabf86abe0bda8121201020fc3e0f3f0c5a0faaad8c5d5c7f09ad081a7ccd09384ac0d0d01023a8abed9b496adf483e3eea2f39895dbf5ece2a08dec1303010213b4f0b9a08af0f08a9ea39eafc4dcf2c5b0d0f3c2880803010206facef3b4dde2e6d48de99ed0f3e2c7edfbd1e8dff0050301020382aabaeba0cdd8bb8ba9e1e6f9fdddc285bcc4bb9eca1202010203f1a9b2f1af8ae0, 0x1e8e69796f290c4ecd8f2b1b5e0aecbfff1b2bab9c0bfe01212010265b0b7f5c4ea86bec3b3dda386e8d990a9e9e2f7dbb8938a9bd3869ea9c1ee8587cdedf7eb9886fcdab290888c0f030102409086adc7dbfbd183b9fece95dcb7e3c1b3c4eac8fde7a4e7a29ae3c5f3d1b3bdcbe8b2abf7848fe5c1a003030102159284ad8295d7e099a0e8fcadd18387f6a780e9eee5e3a0f7c5e382d7eebafd8c9a9bc4bd81fe9a9bdfddb2e6120201024ad2e68ae1bede9389d6a9bbb6a68da98c8ae1b2c6c2f3deddf7d7bedeebb099fe96c1c08f8fdfc7b0f8cb88f8020201020594d589fee2d2cae4bdf887ed99d0abffbdd68edef2ade5a5f2d99c83aec1e1c3c9f9beb9ff98f4cfe1fbe5d2121200026acacdc9f9f0b590adb6c0c2bd80f0cef1cfc09a88cf8aafb0f9ed89b5a6a59ec9bddbbdcea982f4e6d08ea5e41205000207e4aefcd9a5beebe6c096f4d7c4a1eca1e89ff1aefbeeb7e782c0a08db6e6e6e582a7fa9bd4f0878793c7a5c01202000276bea7c5c6eeb19c93e1b4c9c2f6b8d0bcc685d2fdfe918dc0e7fda0d6e89c9282bd87b6dfd0a1e7a7c28681800202000207b7c3cece9ed6a8b6c4f6f99bf0c7fae0bfffe6cbfff4e8d4b2b982ecf0d7e3a4c1bbc58ea89dcf9edd83b81919a0fdd6f281e48ea1cdcdf2b185aa93bd9896b3cdc8cef2c0e9fdb9cb97d4c2ef92c4c9d4ae000b02080201120030043603, 0x1bfe3e0fbb5bfe4f1eb92ea84a2f7a6dbaff493df80eaabb5dec7fd98b3a024a8ae1daee6018cfeea01c9d7b524e9cd22c5bb5aaee501a1ddf00033b9d6dee7bbeed9e39bc6a7f48c89d9a6e8ecebadaccc9cfbf3f1c8d5be918dc6c886e5e69cd8120f0202049ac983afa5e6988ddb9da6e0c68da39cc08b9dcfbbdfdaa789baf1e0bb9a85eae48d86c0fe97f196ee8dde940606020207f8a9b194b7f692ef9e9da7f9fa8af2b9a691fd8382ab9bd8b1e2c082e398f3a1c7c4a2dbe08994e1d6c00d0502020385e5b7b48dbb94fdd0fcd8f6a1f9fda3d88fcf8eb29fcb8ad0f5f8b59bdeb4b1d09fa382b6e3a0a780e5f3f80e0302021ebfb8e3a1ecaffee3cee9b9c5a6ecf3c9bbf6b184d3e5c7c7dbd49bb8cb83efe7c2c9a180fec1c5f486e0f48c0d03020202878eaa83d88de3c8b7dfddf38dab96dbc49296cdd2c7c9b5cec680f297cccd8ec2909a88bed9fce0ab90aaa41202020249f4f2aa97d191ff93fb9883c5b298aeccd3a790a5b5de92ddf79cb5a38a9288dfe5df9cda8d839df88284caf41201020204eafacb9cace980c4a0f8bb8c99d0cff3bdbfdec1baf9d2faabc6b98dbae4b19f96a59187e1d8cc83d191aacc010102020b95b398defeb7c9878c9a90b2ab8ed9f8c8e6cd9ba4bb91d2e180a6e6d3c28ff2bde2cbd5ddc5bdd78fecf01312010203bc84e1bba7b48d9ee183afa6dbc59083f1f7d9d7e1, 0x1f29afc85d4f1d287fcda8fb2cc1949a5bcd6c8ce97cfa19cf3f593b2a5e88f8fd7aed4c80011020c020006030603011313131211110e0913020c0213010801010107000a1313131211110e0913020c0213010101070000000a1313131211110e0913020c0213010101070000000a06131313121111060613020c0202021301070101010a131313121111060613020c0202021301070101010a1313131211110d0d0c02020213010801070101010a060171b5fa1ed683218db931d2bb0101f5f98ef2eddbf480c3faea8394b5e4c9b6f5d996e7d8c8e0e69fe1f39ee0b4c3d38ed181cc97c02aa8fa29979e6aeb9a01beabb1014cefede494a29dd8dcebd4b5a6948afdb2aaba8e90a897be98ec8b8cb6c6aed287f0c1c5e982c003d6ae0e86b104a1d408a0f017e3aa2ade9d2be8fd3ee3f20014cee7ee9889e9ffc3fff2d3fad2afc080bc84ccd8c984feaceda18af49195e7e6dcd690a38effb02699a62897cf01c29701ebb610d48721c5bf3dfee00be5970017d7b6d3a39afdf8e2df82dfb382f3e7b0e7d0d8e4b9e4e4f5bc839ed6b0e5c9f28f8bfa89fac8d01efd8309c4b80be0b60abe8036c2dd06c8e10786a636859a000bf8f0eaf0ca91ae82a8d3ecf2dec7e3cbcef1f38793a48b8ea298a598f899ef91f1c0bacbafeee0739ace52fbc44f8c8175e0fd4eb1c734f8ed18cc986ade9e0002b6e8a3f8edd496ac87, 0x10503020260ce8797e7fbcb84f1cec6cfffceefb59594e49b9fccc2c5f6f0cbb40e0202026ac5b4f2a4c9e2a9b39d98e391a5eac4e2dbeab0b8d4ac9496d1bcf4da0d02020241cdebbb869197bfa8bbd6b596afcaa6fec9ace4c5ff96e5b9d1a4ff9e0902020269a282a0f7a6cfeee3ab88d4a0aedde5a19fc8c0beebc092bfcbecb0010102022387ebc4c7bcb6b2919bd8f3dac5d0de88e6f286829bd9adb0f0cafa131201020ca286be93ccf9b6d0aff584a6d797e891808eb2b7d4e495989eeda0ae1212010201aadeefb7a993a282aec690aeb8bff28eaca3abb0ccf3cbe3afb5f5e1ba0d03010208cff2adf7e397ab9ccaf7f99ebbc6b389e6abec91dad0baa8cfe8e7e40e0201021fe595d29fa6a49996abe4c693e993e0fefcdbe89af4ddd5cdf3eac2f80d0201025680f6ada58797e8b8deb7f8daecb8ac9f8991d9d4b5f5c2acc5b1b5c00a02010231acf4f1c780b28acaeed1c2d1c5d5a7ce85cbb3fdebfde4cbda97f01212000201cc83848dba9ea1a3f0d4d88fb4a8cbbeb9b6c5cbd6e6c9faf8e8aefc8c1203000217e0f9a7b1d480dbe1f78dfed9c5f4aeb9b68f9fadced1ea859bdbbb900d030002709fdeeda4b3a8f6f787cd84fc8dcdd0c5c8e2ebe6ab949cbea6b7d41202000210dde69bc4a48790b1b6d0a69bc9ddebcdaa80b59df2f0d6dbc7b8aec00d02000262ecf8cbdfbddea093c6c4b894b4aaf9, 0x10201060202030a0209020302000a040803010b0200020202040a0200020202041313131211110f0d0d040d0213010701010108000a1313131211110f0d0d070d0213010701010108000a1313131211110f0d0d040d0213010701010108000a061313131211110f0d0d040d0213010801070101010a1313131211110f0d0d070d0213010801070101010a1313131211110e090d040d0213010801070101010a06013e8c8b3de4e355828901d0f2fa01018be3caf7e2dbfdfad5f0c1bf8df79c91c6868cb4a0f79006f7890fdbea04cfd501f4cf2583a427aac539c0f13be894004088d6bfb49cbd918391b990c4f88cc6a182c7b0bdcaeae404e5e606f1da0ab4d302f0a535f9ea30c5a926b8fc2bedbb0038d9f3ecd8e0fa90edf698bedbb38492a68ab68bae85ecf0448ca043dbe265d8a601e7e4c139cced39def348aab101bbd6940045d787aae391f0be96dfc2fa86a287d4f3d8b1f1e3fc841312020205a6a2eddfc1fe8099b9aeb8eeadefacad9dea9286c5e290dda5d58aa81212020272decad8b0edfa87a2e2e2c5b6cc9cfb9fade3e192f9e4d7cecc9783e8120f020217e3ff8fafdfddc495cc9589e786acaecdaac597a1c9eafbfba79abeb4110e020202e99b978be98d9380b99983e2f3e185f4f6cce281c7a8b0c5a3c8a88c050502021eaf90c090ad80f4d89ca3da9dc9d5b0ced4c488bbf6c385bcd489f89e, 0x11313110d11090e090a090f0611010701040100000a1313110d11090e090f06110107010401070000000a1313130f110d11090e090f0611010401070000000a061313110d11090e090a090f0611010701040100000a1313130f110d11090e090f0611010701040100000a1313130f110d11090e090f0611010701040100000a060113121111130f0f0f0f06070609030703060102010a13121111130f0f0f0f06070609031301060102010a13121111120f0f0f0f06070609031301060102010a060b0208020112003004360301110403020202031111130f120f10060f06070604040f02060102010a1111130f10060f06070604040f021301060102010a1111130f120f10060f06070604040f02060102010a060b020802011200300436030e] private def node1334:Certificate:=PackedParametricCertificateData.decode 9 data1334 private def node1335:Certificate:=.split node1287 node1334 private def node1336:Certificate:=.positive 1 [(1,1),(1,7)] node1335 private def node1337:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1336 private def node1338:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1337 private def node1339:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1338 private def node1340:Certificate:=.positive 1 [(3,0),(2,4)] node1339 private def data1357:List Nat:=[ 0x111110f0d130c0f0c0908110608060f040f0208010a11110f0d130c0f0c0908110608060f0208010e000a11110f0d130c0f0c0908110608060f0208010e000a060b020802011200300436030402030200020302031104080c010e031203100400020206030d02080203020302030e0402020206030d040906010203060313130f0d130c110810070f07090711011001090f0d130c0f0c110810070f0709070f041001090f0d130c0f0c110810070f0709070f04100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node1357:Certificate:=PackedParametricCertificateData.decode 9 data1357 private def data1404:List Nat:=[ 0x10204bef9e1ddc5dbccfc85b6a8f2a40808020201c392a9f9f9bb80c68b848dc7b41106020212c5afd0b0a996c88e96def6e00606020201d0e7ac809ae4feb1a0d3a7a4841304020201a68484f7ffa4f1a8f3d8eac4e00f04020201c8cde7baa8a5ccb3b48babc69c0401020268bcd1adff83d0cefa8ae5ee940f0d010204b6b2c5ebcdeda28ad4fa958c0e0d010206c6f4cfc4e9f184f6d6ffc6a9c60e0c010205c6cfb6b8cd848e97d092cffdd00e09010212bcab94e184d4bafdd2afc6d41208010203cde6e9a8899bf2d888e6e7eca40808010201db849ca58a99a99bc7ebfe98f40606010201cee0a3a5c28eb7c28dbaa0f4fc1304010201bc9381f48eabc4f095cd8ed3fc0f04010201bfc3cba9bcc6edf8f4a2d09f880400010260d2f782b5bbed9d84e5aeaa9c0e0d000205ff82b7b1a78384dfd5fe9082de0e0c000205d0e5b097b4f4d298bba4b3aec80e0a000274e19edae686cfc3a5d5afdac81208000202d4ebb0f0aaaacd99b19bd0d8c40808000201f3a2e1ddd190f1b7e8b587b3940606000201c2ff96bcb09f9df2bab9f7c9fc1304000202f6acc9fee8f9ee9a93a88edcd80f0400021780a1dabdd5b2bacc9ae3e1d4040100025bf7f9aae8c0a4dcacd89484cc1e02f1fcee91bf82000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1f1ffded4e7d0a2d01212010208e99ecef695c2f8bbf7a2809fe5f5a6fbb891d4beb9ac91fad0130d010268d3b9d2a098ada7f6e8baced48ab590ece689cee2e380120d01021ebd99e1e88484e8ccf497d2e7adb388c8a9fa9187a9befd9d98120c010202c9a9d0dba19081f1ec9ca4c1a6dfefe7d9e7eff1ff88b3b8980605010202c9a2e1f0cce3c6dcc889e1c4ba9beee3a5adf5fb9fdc95ece0120201020ba7bbdfe48880d6ace2e8e5f688ff969e8584dddbccc290a0c00e02010230dd8be9f783bbc6b2e097e997e591a99aa9a3c4f8f6e9a8aea0121200020ec2c6e9bbb4fa8493bc9aecfcd1aabfecbca9e4978183caf880120d00021ee7fda8cd828acaedeff4d6f0b1f8e0a184a5e89bf0d5cad6c00505000207ab90b8aeb9b5f4ce80958d9cc4dfb595d78497a9e2e8d086e0120200020cedaec7ceb7bf80f3f4d799bac2868c93c986d3c2c584b2fac00e02000230d3b88eb1ccacb0ae98edfef88cfdd6a1ecc588e8e0d6ababc0190f88a99acbf99ab8cdf088f8c1efb499d8a7e0000b020802011200300436030402030200020302030f040a0400060306030e02090201060306031e9104b1af01f39e0f8c12b49c36cec539f1c214cbcd0002dcb7b39ca2ddd5c80f0d02020cd3d3a6ecede1bea2db91f6980e0d020206b183d8b6b282f4d0bca1ddaade0e0c020205b9eed69cc4f98f88b4eacdd5e0120802, 0x13004360301010e0d0e0c060612050c050505060312020e0205020a1212120d0e0d0e0c050506030e0205020812120e0d12050d050505120206060b020802011200300436030404010600020304030f040a040006030603010b0200020202043edfae58a88c38a18a01cfa8c30138808d99deb19ddac0e9d7909f98fa909ad5d4c003e38902e2da0187bd0287f416d2a337a38438e8af1897d00010f8d0bff487ffbff289a38eeba7fed3c5fea68ac83cc3b34efbc734f1dd01c0b0c0499ef052e5ae30b18001ccb59d0019b4e4dbbc93fbf9c786f5fcdfa2f8f7c7f4b580121202020488f788d2d1e6abe6a7dff9a1c4e1ae8af79ed4d1a5def3cfba111102020dbef9e5dfa3a184a292d5f7abd5ddebd2cb8799be85cec4fe120d020201aa9cedeea08d8cddcabff4d9edf4a8e491fbcecdadf3cee6d40f0d02020981ababb9d1a3f49faac7fb98e49b82e7e0a4e8de85e2dbe80e0d02021ca9d9c0e6dbfd9accc1ebe4819ace84fe9cf4f5e298b4d3bae0120c020205a58c9bb999df85d3fff0cee2b0b8fec882f6c384d1b4a680cc06050202058182a29baccaf4fd9ea69ae8a1fe8d83a2bad096cdc9899fd0050502020f84bfcced95deaafef2e0b393efb99de383fce6efe7bce1c8f0120202021dd2a699acab839cc08bffe3f3a0e9c7e386b280e3cd81b1cd900e02020210aed2cdf4f7a2eccae9b1dabfe4e2fbfeff, 0x1c2ec8ebb898bbaea93fe89f0a4050502024aa3b8c3fe8bce98a39287e4d6d3d0b799c1a9bea9e0130202020be592d491fc91ee9f9bb185c1bdffbbfac993ddf5e01202020204dfd4d1fd8edcbc8c94a5b3a6b1c595adafe4d88dc7a40202020274f6d0a8aa9797bfb7abc0a8e4efd18480eb8adcf3c8010102026299dcfdc6e290c793f3ddb3ae8acfa8c8b3d5f3901212010203b2cb8ec0c2eedda7ede4cb9480a08ae0e4d69ea6869c120d010201c08fb8a884a4cffee7acc5b9b2d4cfb9e9f0a5d48aa40e0d010201faa9d4a386f7ddacfab09fb9dce699bcfbe5949aaeae0e080102199c8abf8d9691b8e8c29ba2bfd5eacde2bde29b90f01302010206a2f2f4e5bfecb4919a8ccc9188ac8e90849ef987e01202010203c8b9f4e0aef7c5cfd8e1968a9086eee2a2e7f2ddf29002020102659893b5efecec9f88e7acd281dec8d3fedac3b4efb01212000225de98daa48dfea2ffa0c4c2d3d9e382d78db4fac1ec0e0d000237e08fbfd68786bdf2bafb8ab3aae3ac99a9baddd2a20e0500020389e5cad985e2d5c4ebbaabe1fad980aed5ddd6d4e1b41202000206f2d9e6fcdbf681eaa18dfea997d7cbb59e9ca59df5c00e02000233b3bbf69de3b5d5c8adfaf9a7f49ecdb9c6a5cae7d4020200023096faacc99ec1c4b083d3c6838cab9ee4caa7999bf8190186e3b9cfaeae9bccd2bc80b7d186da000b020802011200, 0x1d7c1a1801212000214e49bddc1dee2acc8bed5f1ac89cfa6aaafb58ad3b799c0120d000202f18cbfe0badbd2b39897c0aad2b49b939b9e9ffe8ac4c00e0d000211dedaa091fc91d5e6eeb5c7b8c2f190bd90d4f3a7a69ce01205000205b5bccbe4c1bec09ebfc6f9cac1a59799e2d795d7918a800d02000204ccd190b5a9d2f1e79de7def093dbfea2baa9b4a38aaa801904afd8d0f782f0becbbdd6dab39adbdca00011020c02000603060301130d0f0d130c11060606130213010101070000000a130d130c0c0c11061302020213010101070000000a1111130d130c0c0c1106130213010101070000000a060f0d130c0e0911061302020213010701010100000a0f0d130c0e0911061302020213010701010100000a0f0d130c0f0c0e091106130202020f01070100000a06014ecbf833d2944dea9201d0889d0104b09bfb94d6dcc9a6c6bfbaebefb9d9900288ff71e703a5b201bcfe0882ad15dcf138cae956aa8a005f838ddcb2cbc2d3f2e7e3a7b5baf8f7c05b9cf02f98f25f8aee01e5c7b346d7e12db1d345b8a501b9c1dc000392ecb0fb8396ede5bff6e9a8a78a86901212020201d69b92a8aacbc7b9f0a286eefe99f1bad4dfa5b19d800e0d02020282e19efca9e1c9e7c798f4b0b58f96bccfd4d9f5dcd60e0c02022fd8f7f4b1c7d5998b9aa0a7d3d897b194dd9dd1f5a01205020202af89d7bbfdcde7bef5, 0x15096d351c9df4fc7fd01eabde43fa5c841bcd43da6ca01be88e50005c5978bebbbcdbeaac1e4f696dacee5a88012120202139c928df4d8c192ceca95c6d3ddcaa2b3c7f98abbacbdc00e0d020213f3a0dcfeaab0ffa0ade0d4b19694e9bd9187dbdf9281a0120c020201aad691b49d9ab28ff78de4bc8ea9c4a1f3d199b9cadc800e0c02020fb2d88696cae6c6f9bb9bdddbfe99ffe3e390a592e080120502020595c0d0909bb8ba9caafbe0f3b283eaa1d1d6c5d08bbe80050502020397feabedb5e9a8f082a8b4f793f7dd8cd6bcf6b78fd9800d0302020393e3a88c95dca7f297c0e4e1dd81b4f594a686d89bbea00d02020202d79ffa8ce78fe6bbffe1b7f9a381c5fee18cb5bc98f7e0010102020299a9a4f496b099a4fefbadaee2d8869783edc1a2f78012120102148d8db697e5afac8dfac880dbc4e3ec99dfb7a4b7d4cece130d01022afff6bafec1a9d2a6e188bcbad780b5b99897a2f3b3c0120d010206fda2edab8399ecc182ffa189b9fae7aecb9792debc9fe00e0d01020cdb8888e795e4a18c89ac8eabdfa7c78688b690c8a1f9a00e0c010201858b93a5b485a9e0dc9ee899cac897b4f3e8b592b8a5c01205010204ecb6b0d7e9b2bdc0e38cffd6888e839496c5ebdcb3d2e00d02010205f88dddacf9cafad1b2a9aafc80df86bedcd3d08e90cc800200010210b59ff2bea180a0cccddea29c84bfb9db96, 0x110010401070000000a100d0f0d0f0c10060f060f0210010401070000000a100d0f0d0f0c10080f060f0210010401070000000a06100d0f0d0f0c0e0c10080f060f021001040100000a100d0f0d0f0c0e0c10080f060f021001040100000a100d0f0d0f0c0e0c10080f060f021001040100000a06010f0c0e0c0e0910060f06070607030f02060102010a0f0c0e0c0e0910060f06070607030f02060102010a0f0c0e0c0e0910060f06070607030f02060102010a060b0208020112003004360301110403020202030f0c0e0c0e0910060f060706070504040f0206010a0f0c0e0c0e0910060f060706070504040f0206010a0f0c0e0c0e0910060f060706070504040f0206010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a0200020202041313131211110f0d0d020a020c0101010c0008000a1313131211110f0d0d0213010c010801010108000a1313131211110f0d0d040d0213010701010108000a061313131211110f0d0d020a0213010c01080101010a1313131211110f0d0d02090213010c01080101010a1313131211110f0d0d02090213010801070101010a06014893a6458a8a4695c001d3b2ef010be8b289eaccbcf08981eaa28fe2b193e08406f6ef02cc9c07b7a43edb06b5a406979748f2f148d4e60003df8985d4e4e2faed96decebed8eafb8d8b80, 0x1100d0f0d0f0c10060f060f02] private def node1404:Certificate:=PackedParametricCertificateData.decode 9 data1404 private def node1405:Certificate:=.split node1357 node1404 private def node1406:Certificate:=.positive 1 [(1,1),(1,7)] node1405 private def node1407:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1406 private def node1408:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1407 private def node1409:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1408 private def data1434:List Nat:=[ 0x11111130c110a0a070a0608060f030a02060002000a1111130c110a100a0a070a0608060f03060002000a1111130c110a0a070a0608060a040f03060002000a060b020902020c000c0410031204030202020313131111110d0c0c1108090811060d06080602020a13131111110d130c0c0c090811060d06080602020a13131111130c0c0c0d06080611040c02020208010a060b0208020112003004360304020302000203020301080206020404030403131311110d0d0c0c11060d0608060c04040202020a131311110c0c11060d0608060c040402020208010a131311110c0c11060d06080606060c04020208010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130c0c10081307090711061006110110010913130c0c10081307090710060c02110110010913130c0c10081307090710060c021101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node1434:Certificate:=PackedParametricCertificateData.decode 9 data1434 private def data1482:List Nat:=[ 0x18c83c6afc8b7c5cef3f2bfb6988d91c3c2a0fdd3b3cf980d0601023af6e49496f2bed2c0c5a3b5b9adb5bffcca98dbc3e9f5e2d89ef1f9c3f1cff5c0ca9c8c0d05010201f9a69deaa99aa183fee4cab9a3b1b7d8c38af2dde5c1c1d3b8acb7dcfeabefc482af81d8120201020683dfbc96b0bbe5ae90e58d8892fbf184cad8e4a8e08afddabfdd93f58dfe8bc7a0a8fc9c0c0201023af6f2f288e2cbad97988ccca1b5cc98fae7c183adbf91a2d096daaaadd0c192b2c5a1a81212000273cff78097a69c9fd3ddb69ea29294d5cb9d95fcdf86e485a8d6bdd2b4cee2e5caaf9ca00d0d000203b1e99382ccfbc7829be1d19df2afe0fea5a5919e839797e5818b9dbfa1ee88cab08999e80d050002038bbbf5bdbbc882f0cfa2ffd0a8f0f2e687c1c5b3f999fa8ca8f5ec8196b3d5e48cf3aee01202000208efb0e789b0fbd496a7a6fbd3e3d393f0acfaa8e5ded7b6f8c7aedfccb19bc2fed2d681c01902d98cf5eae8c7a6f2de83e4ecbab1e3b28ad8cbc5f7808bad9bceebf0e0000b020802011200300436030402030200020302030101131211111308080811060d06130409040d0104000a1312111113080c08080811060d061304090404000a1312111113080c08080811060d061304090404000a060b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x18a3ad6ce01bccd8d52a6c744e3cd33978101caa1980006dc92998ba092e6da87fbeba8949d8bc1daadcaa6f882dfdd90bd92979e800808020202b588858f99eab8af9ca48e85a0fddfe892c3badf8a928ff6a1f0e9dffaed86a5a7e19a0d06020270e9aceca2fbebc3e6d7a1c4edc8c6c49a8cfbcdc69091d9e6c78aabd2f7b49be5e4fc8c0d05020207b580c6ac9fb5ecdfe6ef81d8cc87c4b59eadb990b3abe9b8d8bba9f99fe4b4b2abeda49c0605020206b9898ecc83a7a09191eca1c78be6bbf6b5a7f7f1c1f7beedb7f08ae9e7f5aedefca3e40505020209d8e0c1bdc5d2ba828b92f1f896acadded6d6e492c7e2d3e9c2cfe8919ed1cbf7fbbfbe13020202718ec4ecfcaf81f4f2f097d880f6eac6d1f9e7b3e6c3c88ac9e792acb0bae8dfe4ead8a8120202025eb098b1aa98abde9b8ecbc3a197aeabc79eb4d9a3f6aeeba3e4d8f4d998b899a4f0e3b40202020202fff5efecddeafaf0f2a396e1b4f6f99d9de5f0d3a58de0aee886dee9aea3b68ce2a7c28c0d01020201f3839bc8e6cbeaf5c0c8b6e0d69a97d9eee8839bd982e3b3dfe897e9c7f4cba5adb184121201020283dbc1f7bcd2bdb6a6a384b4988dd5cde9cc93bfd4f48687e3aeb8fec3b6f787b3a7a0de0d0d010202bdb6beddb6faf0eaeeadede680b58990a89381e4ada1e3eaf2c5b1e09ffec4a8b3b8cada120c010279b29fe29485b1e9bbeef5, 0x10203aaa8ffa1ddb3a18cb6ec90e5aecfb2e093a00505010243d082e0aaf1ccecb2fbff94f5fad2d8d4a2b80d0301023a809ce2c3cf898ecaadeebaa1bccc8280a6d00603010204c3b4b3b9db80dcd1afcb8a81e0d489a80502010250d38cbafbb0cb92cabdc1c5bdb0c8dab2d0980302010210d683e7c3e9f2e2f29ef1dfcc93d38aff9ec00501010204a5c181cca99aa1b4ab97e7bfd0eedfc092b4121200022285c9a3d6ec8fb4f4bba7dde6aac8fdd6a5940d0500020bb9a4ddb29094ef88e4ace7daabcfdabe87d8050500022ac293fc978a80f686a69af6b8f59a9e8d84ec0d03000254d395d1f4d7a5dcdaeccaa0dcf59efbf5fc98050200024db7de9b85f9f4cfabd087f6cfe1d9bdd2b0d8191992a3eab7f6f38fb7acd4dc000b020902020c000c041003120403020202032eb08d4f969a50c1b12fdba60102e48ee4fdf4a2db81b4f0efe7fba4c39f9fb9a69c97fda787dceab7dab2a6fc0ef0c65ac88050beb001b9f6f5010deabbd2aac7d19cd99bcbdffba9ba9aa0c987f4a79a9ccefaf7dcebe087e401d2c606ece8079bf501a3b50be9c938d3e638dae50bf0ca000385aaeae69bed83fd88d693abecaffda3ebc4aee8faf3e2d2d6a0dddf8df0804eaccd67a3865effff4689c21ad1b234b9fb39cab61fe1eb0001abda9ed1dcf79f85f398b1e7b8f6b5aee3d5baffc2cbe9aeb5e2e9d882cdd83b9fc646d7, 0x196d4cae58cf9e1a3da9df4a0d0f0cce480adf00d05000201dac1b1a1f5a2ddbb86a4f1b196c7ace6b0b6c4c5f8efaace900505000203defa819a8fd7e2c98cb2adc5a18fdff2dcb687f48cc1a5e4b80502000211d6e4c2e9d0e086a89084bab6a183d5acbeb993a6ad96fd880202000205abb7afb7e5968aaeb1b6a3b5e59ff985d6c7b2f1a1e5f19c1901f88ff9bb95a09780e7d7c3dfdbf0d5e598c2000b020902040c030403120403020202030204000602020401c4bb0681973cbe07899e17d0e13df38437da9b11b7fa0015f2bcbee1c8a980e582b0f6bbd06af39c06a6d418e8ca018a829f70b1b91f94b90cfed1019cc4c60046f488c3e79ff8c49d8bd1a7b812120202248ed8eb95f5b8ebecd7a487d3a0fbaa9ae1ec120c020208adfbe0e5edace1c58f89c0ead289acd8f0e80808020216c299ee8bc0f7cbf3fc95c5c48eb7d1f6e2060502022ed3ef9d8fbffae7cbb9a3e9a7f1f6edf9a0050502023ef5a3c8ec80b5f7d18cc798e288b9d58b90ea0d03020234fce3e299ea8fa5c0bae0c29a9a918ca38bf0060302020cd8e5a7a69fbac1ceb4f6c6afacb3c8e1fee20502020254c8eba28ff6beaa8499f095e9d0ea9985a9980200020204accad7d3a7e1acb585c2b896cfffd1ff98c6131201027ba7ad87c09aa9b6ce94e9a78dce9ed099fc1212010227a2d0abd2dafdddf48484879feebcdbf5daf0120c01, 0x1daf597b4acfbe80d0d020205baf490b2f3fe91dea4afeb90a9ef859ae8a3c2c7cbaba3e4120c02022db5afa1ae8493d7f78cfdacc590b5dff19cf3fed5e7beb4cc0c0c020201de9ba5bceba4ce86b4a5aa8a8bfad3869f92eecdc1ca9ffe1209020210e1bdc1ffaedda1bcd890bfe9849de5e5f8ecc282c1b79bf40d05020201dbe084eca78496e9caa08bd785dccda0cfff94fddddb9fa4b00505020206b688b8c1a2d1a198b2dbd992caacebd899f28d8880d38ec69a080302020781f7ceb8c694c9c18a81e1bc8f848de1a7e1f0e6f89aa49c0202020202a9b3def7b8c980b5bbeabab28fcc9faab3e6a7f2df84dad20501020259c0e5e0b0b3f5cdd1fca395b5d9e1a9cff0c688b1d088ecf4131201020acbd0c795f4899ef894bccdecc2e4a4ebd49ed9d0d18987de0d0d010201a59cdfcfd3bab7b6bb96baaca4f19be18ce384a8ace5b3a4120c0102129eb3daf3f299d9a08982aca994c7ebfbeafafcbde8e8a0de0d05010201e5a3979ab4cc87e4c7b2f3cbdb9b90efcbb39798bafafdd1900703010202a899cb838fb9d2dcb7d5a9b2b2ab9ccfa7bddf8dcca29a0202010205bfb5d7a1a0e5d4a3a9e4e0a8dec89af4dfa992b488c5aa88050101022ab493fac6e0e196f3d79ca1d4edd7ced9a5d78ef7d69fe4c0120001020dc0ed8898e5e7e5b384c8a998f7a1b5acdffcf1fdccebe380121200023fd1ac9bcef3, 0x1d6889c801205000202f18b80ebe7f8a1f1c2839dd6a6d0c6cebdc2fbbca8c6a0b5b1c68c829e9cf8800202000232c39dbb88969e9d87dcc78dbaf8f9cc81a2f9cb88e3cd80bd9ca3b9f4efd1901901fde2a4eb83ccf0c9979ea2f5c9a2df8c94cedda9ca85aefd99c0000101131311110d0d0c0c06060c0202021301010107000a131311110d0d0c0c06060c0202021301010107000a131311110d0d0c0c06060c0202021301010107000a06131311110d0d0c0c06060c0202021301070101010a131311110d0d0c0c06060c0202021301070101010a131311110d0d0c0c06060c0202021301070101010a0601121211110d0612050c05050512020c02050202020a12120d061205050512020c02050202020812120d0d120505051202020206060b020802011200300436030101121211110d0612050c05050512020502020203010a12120d0612050c05050512020502020203010912120d0d120505051202050206060b0208020112003004360304040106000203040302040006020203010c0608060204000a040e0403a4c1029ff87a80d77b85a2012eb3e28bc6cfe1c9d6e79ae7a7b99ef1a086fbd401d99d0287b602b0d402dfa31de5953a90a435d5d519aac80002a9c4ecedc8fee8febdd79e9fb4a8d490dce0e4a203a69006d1cd0dc4c310efd417f3f731c9c039b4ae5389f50071f0f5f1d4f192f4bbb391fff3, 0x1ca0d0802026e86dee8e3a285a2fed0c3e9e5a2ffc4d8d8ebb382cfd8f0b99cc6afd7de959e0d05020202d196dfbdcffe85fd8acee1e289a3fb9982a2d183f5fec993eaa9b8f395cad5a60302020202fc9ce3ac808184defda39790b39aebfeb98d9bb5b1ced4cbc3e588a7c183f3a2020202020282b9eaeec99c8b9df0b2f19ad9aefa8deab1a9e68fa9f399f486eefcabd1cef012000202088e87cfb0c3f792fba0d393dace9cc9fc8cdfb1c296868cd7c5d0cfdee2f681c80000020209fce491a3e4f0c6a9e587d0c9bea8babb9fe1f2deb5d7e6cd9b85d69bff87b01212010202ae8fbabde8d1e3d7eac7f7f0d493e5bf849fe1cfb1f6d495bf9bb98ee2d3ef80120c010223f6b4cddfb4c2f0d0d8f4c8d5f5a8ecddcc9aceaedead8d87ef87a4c594c8fbe4120501020cd9929bdcaeffc0edc7fc97ae98ebd1cbcfa9809cadaa88a8a4b5ddbbe7cdbdcc0c05010206ffd4c0bc88e0fa9addf7b9c092af88dd99bec6f7b781c3b1b9e7b2c3d6f0a405050102179396c885f8a990a2cfabd291dfe3f3bdc9ece7eaa0ce99ae92e6c2cbc1b9a0c40d02010202a4d7de99a38ea2de99e1babfe8e5e297f2e1c995bcd2fcb792eec4b6a2a8a1d80202010202baeaa1c4f88dfb94dcd59b909cf0dedaaebd85dcd889e1dfd48389c9f089b8e81212000216d2d08abebaea89ddf682afbfe3d99bd680a98ec2dae7cbd7aabfedea, 0x197ffca97a5ccb19c010100027596f7faea87d2a8fcefe096acdceaa3ffa00a00000258cf9cb7cafee8c587abd5bde6a2c7b4c4e6f8090000021cbb919cb99ce988f885a5fff2f6f8c386bef80000000262aed7ddb4ed92f4a684bbadfb8a9edd8eac881e0189d5a5f9969dd1eeacbc8ed6002cdce158e48246ebf31ae4d40110928dc9dbb49c97e989c086c1cbab9de98b9eb2b5a8b6d7fbf9f89046db26de0282c103b4ba1293e52ab5ec40e78928c5840003859de3d5d0b9e1e2db9e8d89ecbcb2d6acf8de92fda697b0a795f0d01dea3a89089cdd05e49424b3913ce8ae23bbb23bf0cd0001a3c7f7b69de1a68eb3a9ade1dd85e5d2ebdbe2d0d9a9a5b7ade0ada03f86f97f889a60afad2092981ef48a4081bd358ef21481bd000d81c3d5918a8c81f5f5be99e7bea38aaefdaadde8c6f092e6a6e3f863e1ee5cfc882a8fdc01e1e6e946c2a34285fb2bcce301b495840017ebe8a7f7cff7bae7eacaf09c8debbf9cc198f0f18ac8a0eee2a61312020205b5a4fcc9e3b18deadaeac8e7bfb09e87bed9b697a3bf92de858db0ce8ae085ea130c02027098b5c9cfc78398a4adfe97cae6b6a4e5e2c9f297aa88e8c989c38adcdefd8e120c02020cd79381f2fcd8c09991d3a0d1d4ddcfaaeeb6f7fdcdeeeff6e9b6d7c1d5f2ec9c1209020213bdfdeb84d497f4c3c5dae6d6899787a0eae1a3eefaffd082c988e7e7d3d7fe, 0x1eeedf2a7acd8839dd286cfe3ac8e94110a02021fc6bad8fb8aae81c5e3a1bacef4859beeb8fc0a0a0202138deabee8aefcee94c3accad9c8f1a9f787de1301020206e5dbe79099bccf9dc3ec95f3f3f0a8cfa4d80101020211bdb8e1b8a29ad9cac0d3da85e29df0ddc7e40a00020221cbf49cd7e7aedfdbd681e2b7d388c3f8f7a00900020229bf9d8ee8e5e4858885ce8ed5eeadb881bb880000020247b688f585de9af383db85dcbeb98dfcc5f4b41312010206a082889be6eab2a586ddc5e092d5efd8e9ec1212010202d3aa94cfd598ead8f0c8c0cb8afbbe86ddcc110a0102219d9286f2e9c7f8f09bf4afa0af9bbdca8bec0a0a01021ddf89a0e69edfc6e09beff6eac0c9ff9dc4e21301010264ef99f0a2aaa0bd9dd1c6acadc38b9892f4010101021ee8f093a9b8e789f6e4f19ed8e99ee4d4dd881100010214f4c2b9d5869ae8b5e7e4c2e581f3a4f1ded40a00010238dab19d8cb4dee784fe918fe080afc6bfbdb00900010219c8b4bfd6ddf3a29dd09888a1e8d0a2aed7f0000001023fc598bb9981e391b1b9b8f5ef8adc83e7b4e0121200021889fc8d929c9fccdde9a2f3e9c2ba9ba9f0a01111000203829a8fe086e7b6add1cb84e190dbebaceea8110a000218def18ef4aea6a5fcee87e1cfb5f48e9883900a0a000228a6b998d8b3a2fb90fe83b8deeccab4bc80ea0a09000203feb5c881d59e9ac6eb9d, 0x1f4cec0a38aa41212010206c99fa0cdbe90f7d4deb1f0abc21111010204dfa0c4e1b2a6bae6f5f49beece0c0c01020783cc8cedaf85fba2a584faafd80a0a0102049fe4abb8dacd96d5bffee8a7b20a09010205e7f799aab3a2cbacda9ed6f5c80901010207e4d3cfdd88d19bac94a4a499c8080101021ae7b49cc3fa8c919aacc5b1a198010101021cc7c7e7d1e0b398e590f885a6d80a00010207c7defbcdbcbff68c81bdaae488121200020d82a7d49e82ccd2f9f5fdbfb9981111000204edf588ebd1dded9094dbe0a3cc0c0c0002069d8df3d7f3c2b7c1ce87d8e5860a0a00021f8ba393f0c0edebf6a1f7edd00a09000209a891cad3eaa7b998ee84c1bbc40a0100020899a18fbdf4c5f8fcb3ed98f6e00901000209d8e9c2ddafbfc5dddadba786c008010002199b8fb1d0a098b692c7c6f6c094010100021da086c5f8d699feac8aed8e9a841e1dcea5cca2baf600131211110c0c0a0a020213010c010801010113000a131211110c0c0a0a020213010c010801010113000a131211110c0c0a0a020213010c010801010113000a060101d59002bfcd03a1ba01cfcb148ec82ed7c13aebd21fcfdf0001e4baefc8e1a8dcd5eeb6b1faf1d479df05e69607a2f104a5f022b09a3889cf15d1f132ec960031fbeecbe5e6cd87c387b2f6c0b81312020205cebcefc2d1c8b08cfcaac085dad4faa0ca98120f020201a1fbd0, 0x113130c0c0a090f0607060c0207010401040000000a13130c0c0a090f0607060c0207010401040000000a13130c0c0a090f06070613020c020701040100000a0610040c0405060302040f020b0204040102040204110403020202030d020902020201020404040c0608060204000a040e040b0607060104000e0412047be469bd05a2ac0393eb1d9eba3fafb52eb0be07dfaf001eab95f2d2dcb8ddf81312020202a1a5f692dae2f0d2c58ccfde9c1212020203978ed6b5cec8d7fdfcd7a7ecbe1111020204d4b19fc88cc497c0e297daf1b20c0c02020782cbc1b0c7acecfffad8d0dca60a0a020203cda693cbc59df2b6bc96a786980a0902020581a7b0cafaea8fd682f2f699bc0901020205f6fa95ade4a7cea2ec81cae1e0080102021c819be999ff8eb183dea1b5c4a4010102021bf1e8f09dc194f09ac897e7e1b40a0002020789f6a58eccf4a98de5cffcebe0131201020198e2c4d4a9e8da] private def node1482:Certificate:=PackedParametricCertificateData.decode 9 data1482 private def node1483:Certificate:=.split node1434 node1482 private def node1484:Certificate:=.positive 1 [(1,1),(1,7)] node1483 private def data1536:List Nat:=[ 0x1010a11110f0a0c0808080a0711060c0211010a0105010a11110f0a0c0808080a0711060c0211010a0105010a060b0208020112003004360304020302000203020301010c0205020302030204010d0c0a0806060302040c03080200020202041111130c0f0b090908060d0303020801110002000a1111130c0f0b090908060d0303020801110002000a1111130c1109090908060d0303020801110002000a060a020206000603080312040302020203131311110c0c0a0911060d0608060c0202020a010a131311110c0c0a091106080606060c0202020a010a131311110c0c11060d06080606060c0202020a010a060b020802011200300436030402030200020302030107020402020203131311110c0c0a0711060d0608060c0404020a010a131311110c0c11060d0608060c040402020208010a131311110c0c11060d0608060c040402020208010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130c0c100813070f0709071106110110010913130c0c10081307090711061006110110010913130c0c10081307090710060c021101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203, 0x1c78a0c08020201abadbabad2a89ec1faadc787e81105020229f6a7aa8785e296cce19ef4d2800603020232f2b98cf8f3c4b1fec5f8e1a7d8030202023bcc968ab6aec1edb695cff8b0880a0102020c94c3a0b6fcd4c2a9ede78cc5ba0a0002020ecac4f1a7b5f5ee95ebd298f9fe0200020276b2dbe6c4a2b1958be788e8c8111101020ffd90facdefebd1c0f4839fa9a80c0c01020f8a9ad3aed6e5f7988ba0ae89da0f0a01020785e0f4faaba4d3ead999f4e2ba1105010221d6a486c6e8f0f3e7b694ace2b01003010205b9b38fc3e995d583a895bbcce006030102318c9681b3efc581bb8d81cda1b0030201023be7f0bff388baa4afe388bbebf80a0101020de0dbb5e5cdbff4909ad5de99e80a0001020df8d989cbd1a99e9eddb8e9bec80200010229b8a8c490ea80eedac6ee93e01111000211dfb7a5abd9eaf59bc1f1ecc5800c0c00020e9cb99997f9dba0af81e1f8f7fc0f0a000206d9e6b9bcaee393efe39a91c4bc1105000218eda29dde96fc90dc82fad1b1900703000204a2e5e79da5c4eaeef4b8cbd4880603000234c7e1bee9bb8bdac2bed98da5f0030200023c98ba9d9fc99194d9bfeb9eeed00a01000214d0c2d5beabb2d483ffe19a85800a00000208adf7af94a2e5deff94a8a5ceb01e1afe88d5d4a198000a02020600060308031204030202020311110f0a0c0808080a0713020c0211010a0105, 0x1f3f8ce83fc8ecf9084800501010214dba4b9d49ae5b6e2d0a491bb81c2bee2fcb4a6a1c2b8f2800a0001020798bdd7e085f48cc2a8b8ddbb99a2a58ec692c692fab195800500010202e298d4ceccb6b58787f8d3c8b8f690c190c0dcbbf386d1e00000010201cdcc95d5c1d2cab9e1e0f7adbaf1aad984bdafb3fe84fd901111000203b0dccdc4b3c58cd490c7dafaefddafefedffa4e083b4c00b0b000202a8b5b691abbb90d3a3d7edd983f6c189d6cebfbfd58ccf800a0a0002029ba5e4f5fe86c6ee8ef9868ac0a4d4c0f391b5e6f2f9a4800a05000206acf5ede984ddc18dc796d7f4e7a5ebe699e6b5ccbea5d78011030002018feee2c7c3a8defdf2c2989bcbabe3e4f3f7cdd0a5dcbcc00501000213cfbad3e985debeb2a1f1e2d29bf2d998ddda98c4b4a7c4c00a000002078e9efc86ff87968583fdb5f59efe8daee38ae892a0eefac00500000207819aaeddefeaf3f2e1edb2cbdeb0a3a198f4a7cc9bf8ecc00000000248e1a3e0cfa198eacf97fda2aba3a9def7d3bc96889badc01e0eacf192aba4fbd9cdc7f88de9cfceafdbc0000a020406020203120403020202030e04070400060306040eff01f3a704b1b81e8614ccce39f1c336cdd012b5c70019b48588dd99bfc9a0111102020e9e8bc582de8fa595cebbcfaca80c0c02020f9ea0b6c6dcc8de8999c2d6a8ea130a020207cec0ca81f38ee8bfe2edfa, 0x1c988398fab329cf414b1850013abe7b8edceb486f2cee88ab8cec9a2b6aca3c001cedb0383e004e99a04eb931881fc2ec8b927b4c73dc8ea0004f7e9c0eba7b0fae2bacfdea6db81d6d3e9a4c03ccec078e4e964baee25d7ef1fcae53eafbc32fafd13c4c60010c3f1dee3a294db83f0abfc95e4d4fe9592c01111020247e9daa08d88f3edd1b8fab397c896b899dae8a1c0b2bab2130a02020897a880b89ac390b5beb6b6aa9cc5939693c7c194bfd00a0a020201dea38e9589d193ccf39887a9bfeeacab88ecd3f18db2bb9e0808020201bf8a90adf98bf1fca4d7b9959098cebd9aa1d389d2e8c39e0a0102020483f8cf84fee9ec85fbffd2fec7e38399fcdf949b9b91bdfc050102021294c09a8c9c98c4e1948da68bbfa8d8d1cbc3cdb1c9ecacb00a0002020580bcd8e6ad94b7bafcb38ca48be3f8e5f4c1ebdb9f93858401000202028aeb89bcd7c5a9e3cb86c3bcd58db0b68299a3b4d0fb8f840000020201948994c6b7c6f1d3eb87f4aa92df88c8e8b9f5f4c3dae2be111101024282d2f0a688df8eaa84a7b2e8c5fcbcddfae1ea82d1a5a00b0b010201ffb9a2c883ea82868eb0f1cb8183f6fc93b8ebad98f2b7900a0a0102029dd196f0e7e2fe9da6e794a0baf9f9acd0a0e3e695b899a00808010260c1d8d2e5c6acbbe98b8dadd389fbbedac98debb4c9b0d00a01010201f6da928beeb292828dacb9e088a5, 0x1be9a92b0111101020ea7f792a0948f98cb96ddc2a1faf7c2f2c095eeb28a9990120c01020aa6b1e0fec087c2b4a29befec9bfec7aab4dfa3ddf4e3b80c0c010212d0f3a9e8d2f4ddddf8cac4d8c1a1f5f483a0bcf5c290c8130a01020c8df7a0b5fff4c6d99ea3f7acf1b68db7aaf890dee2cba00c0501020afbbde5dca3e99ffab7cfe09885b3e5aca98592d8a79bc80a0001027b84d1d3abb393deaeccccf0a08fdfc3edfbaff29bb3dab8010001021490e4fbecc2a8d1efc99ec9fcb2e4f2f9dec9b9f6e5c4800000010244c196d7d880ea97b2cfcf96b4fce6d48399c0868891a0111100020697ee909ce081abaacce99ed898fde4c3bcc8dffcb1e0a00c0c000209a58889c384b192998cccbac4e1b98dc5d3add5abcbc69c130a000205c6a6b3bddeffa2d788ba8cfd98a0afe9e3a1a2e4c68aa0120a000213fae5d590899ee1b6fcb2bbc7a0d9e6b08eab8a81d7b80c0a000201c085a2e2c29cc88bff9cfbb2afbdc5e1d3d3fdd3819a8c0c0500020bd09784bec4e5ab9cb8e3b09a8fc6a897d9b18db9ebf3a00a0000026284cbcabee497da9df882bf88c2edf8b38bd0d2eb86a8e0000000020c89c882e5dd92b4becececbf1d3c79dadcca2c0a0ddedc01e049dbeb4d297c5cc9ee0d493e387d781a4900001010e04070400060306040d02060201060306040c0608060204000a040e0429b459fb05f6940391851c, 0x18abd8dc1b7f2afb4e3c3e78b82b7f68f8788fafec0c294b00800000225e788bfc9fc9cdb9fd4dbc6a4968df89ba0b1b6b1bab6fca8a01e4db2ce8ff2d6d9b7e4e0a7b694b9dba6f2acb9e80002818402cf8b47d60ebd10be8425c5d13de8ae2a8beb00078badc189849cddafe49b80e3dcb4f5fab0e6d003b2ef0483d007aeec0295d322fae83f92931293ed31eaee000389a5b6e4aca7b895ced4f6d9ebbfa4f9e4dbc040eaac0182e8f159af8e15f1a11ff7b541eb902ee7e70addbc0006d2a8b3b4b8d4d09d92f186fdf1a9c4e19ec01313020202cae2a1978dffebfe92acc2d4d49af39cd2cae0e9b4beea131202020fa48287a483acf685e6e89ecbe1a5b5d7b4c4868e9ed0f01111020207c4b6cdc5d6eed8e7d1b0b9a5848ae59dbea486b0eff7a60c0c0202488bf786f2a88e9ebfe78fd9d7dea1dc94cedbe3b19dc00909020204f3c689eacaa59dd4d7e0a9e69fa2c9a487938ef482cab00a0102021ffee1f2ddb7f9ba85b0f7bec3a3a68984f0bc9782f8aea0010102020cbcdf96cf9ce5d9c2f9a6feb2c8b8eccbf8a48683eebcf013000202029f94e09fafc7fbdba38edf96f2e7c7b4a0f4f3e19d8da00a0002027497becedcf8868aa1a6e9b8ead0bbe0c1c0b49fd387c680000002020ef092dbf885e2e8a095a1a29c89a0d4a5ddd184dac9c280121201020dd2ace7bebea3c6cef9e184ffbeababd6b2b2fb, 0x1f0d1d286bede86e482f5b0f880d00800020207b1c7efe497f184c5cda1bdb5ea84c8f6bdc8e3ad91d0a8c6e9b81111010201b7a0b6c2a99daab2f7d9dbc6969e86f8e0f79fee91cbbb84ebd0120c010203c7eceffca9ea9bcbd1deb8ebf7ad83a6e28ffebad7ffa8e3c7c00c0c010203be82aed9c0e6a7a6a1dad7a0d3c7f2c6899786fff8f18ad5eab00a0a010201ec9bf7e78adb8ed58f96aaffc4ab86dba3bda9d99ef6a9b5cdf0110901023891c0d1d5aca8a39bd5fc919fca80d39ecab9dfe9cdadccba800101010202eec0aeeb84bb89aac195b29adc9fe1cea5f3fd9a8890f8adc4c00b000102038f8ac3ecf4dbe9b5eacddc95dbb7a6d5c3ddcef7b5d7bdc5efe00800010205b980c4ea86a7a7b1b5c0abb8deaee2a4b983b2f1e8caf392b4a01111000241808f94d99cfe9ccea9f5ebb2d3a2c8f9cfbd9b9fd9b389f3f00c0c000201a9dee0c19d98dafb98bfaacb8d9b8ee1afdfb5c18dc1d0d796f00c0b000201fca0eff4c4e0fbe18599e0ece1c8f69cb0f0c2a085e9afdcf4b00d0a00021f87b3a18db2a2de8cf2fcd3b9db8fd1b397f68088b592faedc00a0a000248f5e8e9e8c383d6e8cb84b5bfe0abccb2cf819591ebd1ac94f00a01000206b2def9d7dc82f289e19194eab996b6faa286def9fecce0d4f00101000203b1df93a596f7c4cacbd3fda7c5b3e28cdea3adfcbf80d2d083e00c00000203ce88, 0x1a4f6a7c1aedcd3fcfeea95a6edf5cbc00901000223cae7cfda92c293d3d0ead7fdd5a6d3f1c880080100021184eebfe0a7d89abdb589cfcefe92e6d280b580010100020e8ff29aa3e1a095fef689ccbedda7c6d8b3a1801e0fc2f3dbddeaa1ccc39785c2c00010020902000603060401cc8602c8af14e213a30ef2ae21dc833dcff62ec0990001829fbbbdf7c3da9bff9ca689c9d3f9ab8e93a3aaaca001d19f02bcb407b0e401b3c121eae23ff7f50af9f331a4820041e1daf19888e4a4d2bfcfbd908d929a83adac8bec8045e9be018dcc832b9fcc36ae8223f5f347d7ac14b3f51883f90001b89ce0bdf4b891d39589d2d3ffdfb4cdeaf1c18ea01313020207f0f5f2a984cb8680cbc8a7e78ed59cb3c3fefca9b9acbdbde2130c02027def92bcdbcbf5b5e899c99bb9d5a9acf4e49e9faa9ddaa08d940c0c020256e2cb97dcc3b1dccfe6a086e7b982e583b1bea684ada0ccfde2080802020496b5cad5bdce93f2b5ec80e7efe7efbcabeece85c982a3c4e88a1307020209dc81f8b181a2839dbfc8879af9acfac48bbee9d194dcd5adb00606020236a9b8abefe6dbc78abeb79b9efaf1a980b0bfae80fda589efde0601020201d1a5d8dada968bcfccf58ded87cfece795f1c886d29d8efc81d40101020201a4a3ef998be39df2fd8984ed84f2e6d3b2878fcf8787ebfcdeb40c00020203b4f5fcc1b9b4c9eeecb4a0ab, 0x1c79997f788f480090902024ea5e0b4cb88cba2aeafa294c4edb1be9181c0080802020387c6a293c0b198b9d9e981b0fee59ce3f2d5b20b07020238aad8d2e4bdb788a7c28fcf8aeae6e587bb800c01020202ddcad485c993919fcb85b0d4d5d58ee8afd8800b01020208a1ebc9bf879397bcd5c3e2bfb2bba6cad89780080102020d8dfa82acd28f8aab9bd9f5aacb9ad0a8a6f4b4010102020f80e392b8beb98cdad6f7e1e0b2ebeda0a19fa20c0c010204b8edb8d1fca88ae9c893c0d3e2e192ea8ebd800a0a010201928bc6c7b5b497d4ed89e8a0bfbcf4ceeea9c00909010201abc8ecc9ae81a3bb9aa7cb90fba28fbbecbcc00b08010232caa28eb4e3b5dda898f3c9a18ebebba6ea800b0701026cc6b78cb9d4daaa8be1fcea8999caa48fb1800c01010240bfb1f2d2cac1ec87c1acc28fb4f7eac284800b01010208cb91f594a7f0d4c8f9afd0adfcdda0facc878008010102118ac9d5a191f196ac83cdad999685a98cb3cbc0010101020e96c6c28aa68dcb9aaeb495c1e2eebf92bfb1c00c0c000203b6f1f489a1dae99f86f6c6e9f69f8ea5a9dc800a0a00026c8edcc0f7a3bab6cda19d9f88ca999cfff1c0090900020184f9fb8ff2dfefa6a2c9d2bcedd6919e82d1c00b08000203ca9fbdaafdbb83e29f8db5bba9ca89f4ebb4c00b07000239adcd98bee386cfa9d0e699f49bd2d4b1b9800b0100020898c8d6, 0x135a101c6940ab3c103ce9a21f4d144f5a81ff58d06b3ab000feeeee4e09c9bba9bb4b18a82cc8046c2ec0188e08b299eee2adba826b4ef4793e8138ba703e0f80031cf9a82fee8bab3fddae5a78380130c020233bdafadcae8f9e7e6a1dae795b1d688e2c6800c0c0202028ffaabe9c1e7e0bcc3f3eceab184d2cab6e7c00a0a020269dbd5ebc4dec083b6e2d9e4] private def node1536:Certificate:=PackedParametricCertificateData.decode 11 data1536 private def node1537:Certificate:=.split node1484 node1536 private def data1586:List Nat:=[ 0x100000a120c0c0c11090b091308090808010101090000000a061111130c0c0c11090807080608010d00060001000a1111130c0c0c11090f080807080608010d0001000a1111130c0c0c11090f080807080608010d0001000a0601120403020202030804010400020306041111130c0c0c08060f030d03030211000b0002000a1111130c0c0c08060f030d03030211000b0002000a1111130c110908060f030d03030211000b0002000a060b0208020212000c0412031204030202020313131111130c0c0c11060b06060613020c0201010a13131111130c0c0c0b06060613020c02080101010a13131111130c0c0c0b06060613020c02080101010a060b020802011200300436030402030200020302030101131311110c0c11060b06060613040c04080101010a131311110c0c11060b06060613040c04080101010a131311110c0c11060b06060613040c04080101010a060b0208020112003004360304020302000203020309020602010603060310040002020603010e0402020206030d040906010203060313130c0c10081307090711060b06110110010913130c0c10081307090711061006110110010913130c0c100813070907110610061101100109060b02080201120030043603040203020002030203090206020106030603100400020206030702040202060306030e0402020206030d04090601020306030101, 0x10c01020181d3c3b0fcdee6f59ad1d48a8796bda3efc00a0a010201c981a1d7e9b981cb859ab484af85a0c5dc84090901022f9cab81eda49caec2eb84ab80dcf292bdbc0808010203c5c3ceb3958af1b48abad9e8bac8ed8a9db80b010102159ef5bff7efcab781fcade5a3f4e8f587f2f80b0001022dd8ede1d989cdb3e0fbdc9ee083d08ddcc80a00010208eed7c5efdfa891cbec8acdffb4b8c5b8cdd0010001020afdbde2d7d2e0ceee8790b3eca0a5fbf8a8c00000010204e2d499f7adab82b0d5c5f8b1e5b3efe7b5b80c0c000202cbf881f9ded6a9e18eabba9eda97849aa9800b0a000206b7d6d7c3fec2aa99d1c0e5e5a0bd95b9f5800a0a000207b1e3f7e0a1de9693ddbe8798e0f0cfc690090900024af599f2d8cb8597d4cba292e38ecadb87900b0100020fdfa9bbfbb28aefdf93c0bcb2d5efccdfc0800b00000209c3c58ab982aeb3f8dab7e6f6dbbdea84b5e00a0000020a95ebecc28be6849b84fad1ed9fc785a8e9c00100000206d3dab8e9b7f6f7fd84c7eea3eca5fea2eee000000002099381fad5fda894b7f8e78b99f6dcb99d8c801e0fddb190daf8c5adb19984f000011204030202020308040104000203060407020402020204060603020206030804010d10090e040603100308020002020204130c120c0c0c11090f08090808070801010100000a130c120c0c0c110913080f08090808010101, 0x18baedca991a4abced899dbc694e887e1d8120c000201ca99bdf9ecc0a4b98596989bf8a7d7cdcef00c0c000201839ccf83dbf7a796f2b1d9cbb39c9ea1bdfc090900025ce0ecd6fced8598f2bcb5d6e9e1b9bef4cc0a05000214c9d1d3d9f89e8cffdbe7deacb3f4f1a2a9c00501000231b8bf9aedd6d79ea5cdb9edf9f8dfcbbe9fa00c0000020ae1a9cded81abdda7f8cfe8aceac9abc5c00800000204deb0bedce5ff98dfa0d0db80b2a3b79ba1900000000265bcb5d78bd6e7c5beecb1fbb7beb987f1b81e11bbc7e2ffb090faae85f4840027b47ef908cece04c0cb20c58641c6d927fbc003d9ed00129090f4918e84efa8c2a9e1da9001a0d7049d997a9a2098a621f09a0e999937d88744d8ed006ce5c9c7bbb5caabd9a2bdbdf01111020234c285f1f8a6b787c3f4bf938a86aed8d7840c0c0202328184f9d1dacdf2f2dbf685d5dcc0afe7ee130a020242f2d2a0ffd2eed49ad2b3a7e69b92b8ab800a0a020222aded81d9c5a3cae5d9d4a7b7fbbcc5a0ea090902020398c6bbeee1db9fa3a8fdefef85cab5f0c40808020204dcb5fdcac7ba8098c1ab8692cda8939fb5b40b01020213d69a899897ebeb8ba3a0ac9cfabea2e3f7f00a00020207d792e4cf91898ac3e2b9f584a6b4a0b9d3e0010002020dc593b89ca0a9edf89ec7e8a1ec95b38eb4c8000002020290aaa0ddd7f090b4cdf7a98cde91f29fedf40c, 0x10a040183aa02838705d69c01bacf1fd7a83fb2992bd4d808fcfb0014f7f9efd1d891d2daa08d9ae1d007a6a90ecf9a04d8cd04aceb14bbfc28fabd2abd9d4182b60003ce85a1d39cf697d2e6a586e9f00c0c02020282d69d82a39ed0aed4b1cad384a5acaf83920a0a02021983bdf4fea8eda0f8a492a0cb8c87dfd0aa0909020212a0d9bdf194ecf4add3efbafed4f3bb8bfc0f05020250a9d9f3aedc99d7818eebf5daf6dde98fc60d0502022ff5c9afdec6fed5b78ed3e5f4b1ebf6f1b00a05020210e1b6e3fbeedcb280b3d3c389d4c9bcadd5960501020214e3f09db4fddeb8f9c097d8fbefcfc7a2ace80101020208caaadeb3f6cbd093aedc90d4f8afc7d082e00c0002026588c6a1e3f1f6e9ce92f3d7ab8eafefafa8080002020aedb8cce0b29af988f1cc81b7eca792e5d0d01212010264b6aff6a0acac91ba83f6978e828d889f88120c010270dda4bbb0eba989ffcd8df892afe8afd40c0c010201e59699b698eef08aefbdf9ddfb94dea6cef8090901023cb1a8c8abeddb88a08d92ffcabdd9acc2c40f05010228a28dab80be99cbf5b1dae0e8ddbef9f1d60a05010211e0a3f4ad99e798b1e18cfa90adbf9cb7ceb20501010225c59fddc9c2ade1a7ec86bbee8d91f89be2980101010203f5b3a6a9c7aeaad78fd0e0dae290d69fecd80c000102059692e999bfe6b2e8b0fbe9b7edbfe193ac0800010207e0, 0x1120c01023adbeef9e89bb5be959bcef8fdfdefdec2b5a387e5b5e0f1b4e00c0c01020394aad0bee08287edc0dfaffeb2a9a0f28cc186f0cad3affebbc0110901027295e1e0f6f2dded93c1ec8af0aea397e6f59696c79ebdd491c01101010239ebf0b4dcfec3a0c7b9e985ccfbdaf097fcf896a38bc0b7c6800b0101020d9b84b7e8949fe4cfe7c9dca0af9edddbd1c5b5deadac89c7b1800601010272ec9ae3c1e1cecce780a6b894c0f8e291ce81bac785a9fdbee00101010201afcacbb7c094859f9ab9c381c0a6e9ffa2f2df859bbef0d8d7800c0c00020197d5c0efb58ef6bb8487a4a3c3a5e5f1f2b4b5d1c2a1b1ef83e0110b000237e5f6ceb39ce3a2f0fcc390a9e8f6a39a8599bd99a3c4c5be800b0b000218a2fee2c788ceaef9a2afa9bdcbab99cfb3e8968e8ee391c5800c05000244a689d2f4f9fe8efddb8da3d7a5adbd88ce8ecc83b7c3decd801101000202e7a184cbbdbbf9aab8c6ef89aeea9e9daeec9ac8fca7a0f3cd800b01000207c295cec5cacef1d2b7e49a89edbf959fe4c1fbd9b183a0b8c380010100020190b6bfcccbaef5e7d08fa39cb9829f9bf092a485cfbdf0e7dba00c0000022e9be18683b697f4c8f2b3d59fb9a486e182aed68e90c3cada801e35f1d8b4c3f7edd0b990d2d6dcae91ed9dcd8cc0000a0204060202040108040104000203060407020106000203080406060208000203, 0x1000a02010600120314044ff850a201d891029eaf10959822e5ef3d8e9e2fb5b90054cac6d6e896bdd8af98abb587f88eb9fc84a7c9c4e04ef15aab0d9f8e04a7c720d9f43eb8b70c87ff32f888002fbaddfde0cce1e0a6dce4d5f391eaa5f5bf87f4f0c048c088018f91a52bd4da2ea5e824e08148a99c1581fd17fdef007bccceecf3b68683c1c099a09cb0e2a0e3e18795a0130c020212e8eee5e6deaee6e1a2c0d0c8b8c6d0c8c2b9edc8efb585b2c00c0c02020197a3eebd84d6c0f7d5e0f0a190a7b6fbdce18dcde2b3afc6dfe0130802023fd2b494fed2d1d0b4f39ac5a0aba0adaf9ef684e3afb2c480800808020202add8cafaaab9a1ccb886b9a3c2f9cd8edfcadeb2fbfecaa1d88e1307020267e2dbe7aca6c696e6c8aea9a2eece948a83b5fdcabce3cdc0070702021ee0dcbab3d481e5c593e18bab87eabecff5dd89b0f7c7d5f2c00b0102020fc7f6dacad3b1fd8fefb5b4da859ef9efd5c1f2ebee87c8b8d1b00601020202e1d8e497cfcbe297ccc5fe94d3e48987c8e4dace9ef0f3d694f00101020218b1ba8fc0d5b1df9b8ecc9ae2d0abcc9ce6a596b3d4baf9f4f20c0002020190f5c391a3fffeb9d9f08cafacaeb2b1c5a7f7c6c4eed3969cc01212010201b6ef8280c29ca3d1cbcedc9588cfe5f1ac93e999d5f5cef2b1c0111101023cb897bae69e94acdea2ddb5f0e384cfd3b3f1bee1a3ec8fbec0, 0x1c5a2e1b8aad3e1a3e8d2f2a1a3fbe00c0c010216b195a4ec82abb09a8995defee6b9e588c8c59585d8d583f4c5d6e3abc784a7aebc9fe3fce7a984eb940c0a01026ccbaea29c909f8da7db95dbcce3beefc0d0d19394809b8db6898fd5e2eb97befcdad0d7caaaa99ab8090901021ad6db90d8c7b2d4fec69690b8a6c08e959d998bd98ced87e4f6c08bb4daffb4acedee8eb98dd38ea3a40901010201899aedefce93fbdea2c4ff80a9e8b8d7928ed4daed8d80e0a899d7acc9b5b9d1ccf2b6dfb7dac8f4e3801400010201d7f187c0e1ebc4dbf68193f8d8928bfef7eeea90f281f8d1f8c4faaba39291b9c2ca91d1e49ce281e3c01413000222bec1a7bf84ab94968897cdfed6bfdd98e0f5e0bccae7cd8183b7f7aaaebde6c5f7cb988e96ccbcbae00b0b000210cce6e399dbf4efb5d7e9bcffbfffcdf6a788a8f3c3ba9083bcbde4dc86dba4bb8f9fa6f3d3dbc0140800022281b78ca490d68e9b969ef797ecebbeb782febcefb6edbbc3ffaa8e91ab8ce592b39fa2bc93c1dd8cde1407000209c084a5af8bc4b9e288cc97c5b89b9ef4e4a9be828ac6d7e58bde9ec890a4c3a0cdee8ec08ba5f396e01401000203a4f88ce5daeb8ab5eeb1938eadb0a0b880e7c4a2cdf2eddb979bf0dddbbddd84afd1ccb6fb8e9ec1e2e61e05bae0a187acf3d8c18de1b3ebfeb092d2d997eccfe4e1c899e5f1e5e1d0ffcacdfcd8d0, 0x18ea4b49886929c8ee686c398bdbf94f7919ef7e0800c0802023797d3fed1f7b4defda9fa89a3b8ac969ff8a09782f9c8aaf184def1c3dceba3fdd9c194bcf1b7dffad00c07020263cacddd84a7f483bc9afc8eb3c787d4bd82e2c3adcbb0aa9ab5d1d0a7f692d59299a5bad6e1fcd5d4090702020298c4f780e8d7b78cdff6e18add93b591a28befadc7d8c0c7d4909c8ee9caf3c9cecfe4d8fc9ee2d0c4070702020293b0a3a7aec6a6adf2d4e7cafeab9aefe4a582ffa7fbebe1d2e9a3fabec88ba181bde8c2adbf9eb7f01301020201caa4e8e8ebd1a4dca8b7cf88c9f9dc9c88aae087cff0a2e4c9e9c2f1d7eb9eabcba7e3fbd2ecf2eeb00901020238f9c6d6b2f7e4b5a1b0dad4dd8482def6f6beb7cdbe938ad5c68898bbadf8ddd9ba998a93bf85848f900601020208cbe488d0d78ae581b3d39cb6c6c0c2a5c5e1aaafc3e791f0a6c187f5b5a98ad2da8c99c7ded78fd1f81400020204e3c198eb93d3b1c1ba8299b8d3ed8abce582ebbe9ec985f49fe9abdb86f5d89d9ed7e6c69acdf9c7c5881413010209c3cc90eda2fec1e8a592d8c7aaa6dfd98dd5898bc0e7d9b9cdf3b4aba9c5e38babc483a6c5f9b69590121201020f95e0deed80c2f99a8cb790a783ffc9eac6bae192cdcaa1b4d4f483f4dce3cba5a5c6e9f086d3d7d9f0140f01021ce0ecb2b2dabdcffef98acbe4fad891b2b5cef2bdb7d9ffd6cd87, 0x114a2c122f3c841d3d05ed5a50103fcada086b4c79ae8f487ede8de84e9fe9dd1f08fa5b9adaad89f9184f6f9a4dda7c6b0e030e29f60d8ea37ecc307ae92015ad3bf9ceafabfecf389d1fcb4b9d3ab81e985cdccfbe38bede4a2c482ede6d7a7b2a9d2e038a82dc002c58b039a8d0dfcd61ee9d93bdae03494c7000997b2aba983a4e69581b2a1d29c88bc8fe1809c9c91f4c0b7b38bae979a9cf0db909ae899d036b32b870ce0c803e38d21c9c64096ff05bbb330a38e0004ce97c9b7c885bba39e938987b4e18ef98cc380e4aceffbf9d5d6ac8fcbe99cddb6d0eab0e032948b5ce1ee39f5847b85ef18e2c42daff121e5df38e7b80036e4bcb1bfb38ef0e2c698d3faab97eabb90cacbb3c8a1f8d9afc6918792f3a0cdfba790c836c7956efeb26ad6bf3794ce1ce3fe3aef8135a4ac18e7c9002ef48cdaea80f9a8a5da94ab81c9a7d9cb83cdb6a89fa3869dcdb9fa9c8584e28afdb4aab005f9f80ae0e10fbec701cbcb0dc98416b5bd37afb72fb2c3000c8da4c38efbb488ded4b19dd7ffd19091c2d1bdddbaecfcb0cbc794e1d687a0a7b0e1cad8130c020203d8c8dbbac3d1ffe3f3fa91aefcc9a5a1e4d89bfedca5dbf9bce2e5d5b3ecdd89d5869dfed5b1e9b8f01308020203cfddd3df8fe89381d0a8ade7a3ffedb4a880d0a9] private def node1586:Certificate:=PackedParametricCertificateData.decode 10 data1586 private def data1635:List Nat:=[ 0x1110809010801010111000a1513150c0c0c15091109110809010801010111000a06150f130c110b11090c0911080a000900080001000a150f130c110b11090c0911080d000900080001000a150f130c110b11090c0911080d000900080001000a060112100602020603080401040002030604150f0f0c11090c0911080f030d000b00060002000a150f0f0c11090c0911080f030d000b00060002000a150f130c0f0c11090c0911080f030d000b0006000a0610020b02020c0006040a03120404020106030403110d130c0c0c110b0907060613020b01080109000a110d130c0c0c110b0907060613020b01080109000a110d130c0c0c110b0907060613020801010109000a060602010e00200324030404010600020304030101110d130c0c0c110b0907060613020b01080109000a110d130c0c0c110b0907060613020b01080109000a110d130c0c0c110b0907060613020801010109000a060602010e00200324030404010600020304031204010202020310040002020603010e0402020206030d0409060102030603110b11090c09110811070c070b0613020f0009110b11090c09110811070c070b0613020f0009110b11090c09110811070c070b0613020f00090610020b02010c001e0422030404010600020304031204010202020310040002020603100402020202030e0402020206030d04090601020306030101, 0x1bdd28efc0d0101020796e0bccf86b3aab98087c797fcb4d5d8be0901010202b888b5c3e2eff2efd68bbfec99e5df9de2be0101010201aba8da8dbdf4d985acb0e78eca9ab9a7cec0110b0002068cff88ac9093c1f5a3f587ea8caa81de801109000213b8d7a1eed6b8e89deff1d1a2e0d2bf8a800c08000202ac9fdbdb8ae3b3d3a382d492bbc4f8f3f2e00908000205dc8c848dd29df5c6abbabad0e786e8f3e1e0130100021096c5aabe8af8f5e8e0c48bf3db9f9ae4800c01000215f3d2cacd858eafbbacd88cf296adebffa00901000202bec7c890d39ce1f2e3b8cab291b696a5eea00101000201a8aff8f9edbfaaf2cb83a19dfa8ed6adecc01e0187a8aeded9def08aacc180000a02040602020401080401040002030604070201060002030804060602080002030a040c0c110b110913080c08090813010f01090101010a0c0c110b110913080c08090813010c01090101010a0c0c110b11090c0809080f0513010c01090101010a060c0c110b13080908090701010b000a00090001000a0c0c110b13080908090701010d000b00090001000a0c0c110b13080908090701010d000b00090001000a06011204030202020308040104000203060407020402020204060603020206030804010d180a0e060e0402041803080200020202041513150c0c0c15091109110809010801010111000a1513150c0c0c15091109, 0x1d6a1a1a5c00101000209fd9df0a498fd9fa2dbff89ebca959aecfda69abfa299801e09d6cea0cbcee4f0e5d79882b4ca899dc0000a0201060012031404018df102e1a614b1810a87c802b99005b2c75ec38e12dcb50048a1e2f8bdcac3f5c087978bc04b9bec019787a91792ad77d52bdde7588bf80c9ae46a9f0006cfe0d0cfd599e8efa0fdd4c00c0c02020ba4c988d396eceffc89c6abd9c593dfd7c0110b02020687ca97ffcef499bf82c0b392f1cde6b68011090202129c848bb0e1d1d1f2d7e9f9949defeba78013080202079af4c7d3c89ed390e79bb5e3a89af085a00c08020202cd8182bdadc6f484e2efd7b3a28ed38bfcd00908020205d9b2da93a5bab1b6abb2bcbbb5bd888180e0130102020aa1a6b0a9b5baefc7a4e386fcc5cdadf2800f01020205bdb8ac8fac98e9da81ceada39fb4f9ac900901020202bbd9d5e0f8b5bcdee8e5fba4b182ace5f1800101020201acbc98d08cb5f1fdca969dd58ebed2b0ec800c0c010229cfd1d7effb9c9bd19f84f3ce95c2db8080110b0102068ab5ebc2c0febdb880bf8687a598e6ae80110901021290d9d19d88b9d3cbacabde9adfb9e992801308010203affe85f2f9c7f3c3f4bcc0d786cee7f3e00c08010201fed0a6ed85b783c882fce2a89296b3b0c5e00908010205c2a8fea5b3a5d1b3d7c3fba1d8faf9fa8f900f01010208f19ef8f7e9c881b7cecab194f8, 0x1829d86a8f4d4f7a7ad989ed6c6dc80080102020ae0e3aebeea87bfd0e0d0cfd8bfcce2b1dae6aeb3a0f4e20101020207f187e0adf3afd4a291a6969b8194b8e5d4b1cfa2ae918a14130102038daf80ec99cbd8d2fae6e6d0eb83abd4cf8aadcdf29f80140c010207bbf3ca95e1fc8483eac195fea698e3faa0a0ddd9d7a7800c0c010202e5cd92eab19ef3d7cac98bc389ded694c0c3ee86e08880110b010236e9a3b4ddfdcfb5b7c3c0fde98fbcd48986f3a9bbbd8014090102339292f8b2c5a0b5e2d492a2d6f5f48499e3ed8fd2d8c3801109010201a5d1acd9a09eebe1f898efc2e994c984e991b8c0a4e6800c0801020c98d1a2cdba97c7cda099b1d0f1a4c5b4a4838780bd94c00908010230b7bb8fd0ecdbd581d9ef95eeb0b0abbbffc4ca87a1acc0010101020af8b3eb818ab5c2dda9a4f199ac9defa9c6978ebbccb98014130002039fed98ebf199ced8ceadf1d4b3bfdef4e485baa0cee080140c000203e5a7b5a6f4e6f794dfee97e1cda2a0aaf1bba49588a1c0110b000233b49abbaef7d6cebcebb69ac2b6e9fb81b0b1a2b5e880140900023adebaf8e2c0d89a8dbd818d9bb1f79ff8b4c48ed0acf2c01109000201c6f7ffbaabbcdac492c491919ec192b1dec6b7d2a88e800c080002088d94e1d692bce1b7bef4a1bebcadffd4e389e7bfa3bcc00908000234eb9ff7d3edbfe4ccb5f991f58cfade9ad5c2, 0x115ed71c80289cd08d8c802829604fe9954cdbc18f3a10010c4a3aeeec8bbf190d2d39ce6fbf9adf3ac8007bffa10efd501a9d6900ea2de03b99307f4f256e0f911e2f70003aed2bd86b0b68ebdc18396e1bcdfecbbe98049f3c30195bdd411ad9614c82df2865d8f8b0acbf101d0810037c292cde690a594c2ecfda0d1b3be8abb8014130202068b82cdf1cefe95aa99b9b99c9aa0b2afbf9dfd87f1a8800c0c02027afbdaecf8a0e6cadfc981f0ad94d88c94e7e2be93a480110b020236949e88cfb397acca9ef98ccce9a29ac2a985bda1cd801409020222af8cd3f8a4dfe9e5b6c8fea184b88dd68f9dc8c1f9b0801109020201b3ddafeffd91bc8f9ff785bae0f38fe88390c9f084db800c08020209ac82bce2a7a989d7e58ccda4fc81ce9788859ccfe2a5a80908020238d3aba1aec3ddbe9bfebbc1a5eb9edfe189f781b0d6e2d8110102020591f4a5afbab18a99] private def node1635:Certificate:=PackedParametricCertificateData.decode 10 data1635 private def node1636:Certificate:=.split node1586 node1635 private def node1637:Certificate:=.negative 1 [(1,0),(1,7)] node1636 private def node1638:Certificate:=.split node1537 node1637 private def data1690:List Nat:=[ 0x1f890b7d99194aca9e000120d150c130c11090c0913080c000800060001000a120d150c120c11090c0913080c000800060001000a120d150c130c11090c09130809020800060001000a060112040302020203080401040002030604120d130c0c0909060d0306030d000c00060002000a120d130c0c09150612060d0306030c00060002000a120d130c0c0909060d0303020d000c00060002000a0612020806022a0012042003120403020202030f0d130c0f0a0c090c07060607040a010c0008000a130c130b0f0a0c090c07060607040b010c0008000a130b0f0b130a0c07060607040c010b000a0008000a0612020806012a006604740304020302000203020301010f0d130c0f0a0c090c0706060d01080106010c000a130c130b0f0a0c090f080c0706060b0108010c000a130c130b0f0b0c0913080c0706060c010b0008000a0612020806012a00660474030402030200020302030402010402020310040002020603010e0402020206030d04090601020306030f0c0f0a0c09130709070d06110110010c01090f0c0f0b0c09130709070d0610010d010c01090f0c0f0b0c09130709070d0610010d010c01090612020806012a00660474030402030200020302031204010202020310040002020603100402020202030e0402020206030d040906010203060301010b0c02020202030702000202020406020002020204, 0x1d9b1b998a9e89a8997c097e98290e3c2a3d00c0102020895e7d6f1adc992a8f98887e6fdedd3ae8dc39897bec0080102022bb8d2e1e7b3f2d6f98e94b199cfd4b8e5bbf1fad7e3be0101020213a099d0d1f3bfe9e7c089d6c5a0e685aea2f0afae88b61212010206fae397d5af91f7ebbeadbd81bdd0c6f8ddeaeedbc0151101023284e0eeb7d095b396f4e3fc9ee1cd9c80c8d3fcaf8f90150c0102019b9eba8cba85b8b8bbe7c9ab92cedb9dffa3e9fed2fb90130801020da6fec4c0e7d4e8e2a8b190ede5ac9ff7cfcac8ccb9801502010229bd848dd493d3e2a9c6b5c6fcf5abf3cddab3cbadb9900c0101020497c4e8ede394aba9babcdb98e6968bbdecdcdfbcede0080101022fcbe2c7c2f78dc6db8ffbf5f1d8a9cb83b7fbf8aadede0101010212c3a0d3b680a8bbf48fdaea81e29fd9f4919387dffb96151100023e98c1aa98c78fa1b8d2cacc9f84deb681c2def7feb2b0150c0002019f9ff7d6f68892f0c9fdb2b3a6f8c1dce7c0f2ecfcaad0130800020df5c3d6f7cff6f2b9f980d2a8fc9f8ea9cabab1e6e8801502000223c2eedbd7d3e0cf92f083cf96dfbdbaabfb8ae0d8d5f00c0100021bb8a9dfe7bd999fc6d4a0f7f884d2eaa1a585b7c4800801000233edd4e5d3bab3b7c5858ecdbdbfbef69d95b3fad0cfca0101000211d48df1c6869c95feb895dec9cb88eae1d3febfe7d2b21b1fb68afcc9b38e, 0x1c60f05000203e7abc7b6e998baf9e88795bae6efa9ec94800c0100020ec6fc87f59a89899ea3d991e58cb18a96ef800501000206d0eeb896fcb6f58481b9fae3fca1f3fda4f00101000208f6dcdcb4dce4be84f990c1effa83c1a0909a0800000202edbaa39491c2c1fa87ab93dda080eadfa8801b0b95b0c993ead7d69591a48000130c130b11090c0909090c0801010c000a0001000a130c130b11090c0909090c0808020c000a0001000a130c130b120a0c09090911080c080c000b0001000a060112040302020203080401040002030604080206020404030404060603020206030804010d1c091406060506041c03080200020202040abb03d507979f08a1a30ad3e40ad3e301e5b65180b50003e89796baffa4d388c18d8e91e5f1aff7c003f69d04d19403cbc102e3ec42c4fb42c4fc05b0b30e9e890007e6e988e2a0a5f884f69d81de97b3e6e00195e7bc019589c54ee907cb65cced65ccee04fb2ae1002bc2c3809eb1acb7f8ef89989bede3c01511020225f8de95fbe68cefd7c7c3a6d684fa9a97a9a3e9bcb390150c02020197848786928bbaa9ff9c83929af09eea8596b390dfe2b0120c020201ef8dbba6a28a9b988ac48afab8c7ae8fefd2b7d480090902025299e0f687a59b85dbf8addfefc0c0839ff2b590a0130802020ce5daf1e4a9e6dbb5b3b291f699bfcd89a092b4ece680150202022feda6b4a2, 0x1d7cf44d7d00d898311b9910006f6bed0f0fefa97af808dad800195f19a01958fb30790239663f59563f596069f138300078298f6b1eaafc0e7f1b880130c020205c3fe8b86f6d9fdedcde3db9de4d1dec0120a02023a98a298edf186a485f7e9e2d581a581c00c0902021293caa6bca5848ab3dc9bcdc2c79ede800c0802021ffe96f7c6d5a0efedd5f29adbc6d283b7a2a00908020203f5fb9cb585f29f939ef4a9cf9ddfcacbebf00808020206f192e7cee7addcd986c9fec38194be87f7d21305020204f594d3de9e978c84b9d4c6a3dfd69db3e7800c01020210f6bcd5a08ecde0d88d8ee3c8c1f58c82feb0010102020babe3a59383a1c6d9c3ffd18585e3aaf38bbe0800020206ebe9e384d4c4a49d85c8e7cdc98fd7f0af801212010201b7ecece69384b4e5d2f8b8bbaa85bab8800c0801021f90818aefc4b2bebae3b7e5f0bbcde3b3a3d0090801020894a1e0d9f08ff7e8c0a080f69796c9dc86d80f05010203f794a5ea9bf0ebf88ce3a5b4dfdfdddcb3a00c0101020fb5b397bcfdc4e7b0f9c8ba94c9adfcedb4d80501010216c98ab2eeb8e9839e8eab8ac9c598d8ea87f80101010205a380c1b7f096d9a181e298d7ccb6dfb2bf980800010204e8efa491b78ce4acd690eec1af9db1e3c8c00c0800022a8dfc8a9eb3e4aeeba5cdc897aad9bb85a1800808000214e7a9afe98ae7d29de0c289cd8defb4c1e2, 0x1cb8180bedca7dfb5fafbecd2d886aa9fadbfcceda5a80c08010251ef80abff96b4b4a7b995d1b1cfeec7ac87c8c2db94b9b0b7fad2940908010205abfcc5e9c0a9a1aaa4889de3cfdedaffa6ba9790efbff5acd1e7940905010222c4f9df94c3c78bdef8bdd58d88cefdd8efd08a8dc9e1b2d0d0c9e80c0101022c8da08dbdd3beb8c4fdbb97bfaf8c8acdacd89fdb8693d291e9bebc0a01010208e3eead85c28b8cbce9eeaeb7b6f595c3a6ea94cd8b8582b2d18ddc0101010219dfdc98cdf9abefa6b2b3ddcba1d7ee85d9abffb2c39a8db381bac80800010203aaa7e5ae92c2d9e3e090b08c8083ebf2f7ae8cee8cb5dde38ec9d8121200020fa7f4a992d0cc90fedbffa9ffa4a581ebdf8cceaefddadaa484880c0800025783d294dbb799fc9ff5aa99c6b1a1ba81fdd8daa2c1dfc1afd4fcda0905000239f7d8febad7ce9687e3e49efecfb7af9de18287e1e5b28fc3ae97c00c01000225f884ec899af3e7f4b5bce1c8d085dbeff48ee5a8dbdecbacfd90de0b01000212c28dbceae685abd7b2c99ff982f7f2e1eda8f0def3acbcc0e5f3c00101000215e298e2f286b499dbd6b196e8ffc4e5e4c98fa094c28cec8fa8baa01b1af5ea809099c788a6bbc8cda6d4f08ef1ac81a6c4000b020902040c0304040108040104000203060408020602010c000404100408060706020e0008041604178372c605f6f008ee8644, 0x1bfd9cdc5ceef96e9f0d01b07d2db8effe2fac6dcc9ef80000b020902010c00240428046004d00ccac904bbe60485ad0485ae4dadc232c28f000791f8f4daf89c9bd49691dab9d4abccf5fafcd49efd9002820bd308d88631d09a079f86079f8532a89b5ce7b50004dfb29aae8684e6c9cbededafc3aeeab492849afcd4a007becf08969604a78601efd840d2d340d2d40b91d105cd8b000186f8b6d28987eee2affdcc93cebffbaa95a3cfa2d0019682f00194c8c333f612b26798ef6798f051cb24f70001fcfd95e2e7948ca3a8abcab99f9c9fe5cb9ccdf8dc121202022d8e8da49780e1fff681dfa9dcebcfe0f6a2ebd2fbd298f6dac8880c0902024692f5d3fba5b3d090c2da8fb4cebeb9d3c3d3e79e9df5e1d4a00c0802024da4a0efd780f0bae6b1efbca1a9f39890d3b9e5b6fd89b2b59bc4d0090802020988a7ada2fde698b7c6e088c9d0b6cccc9fe5e6d1d58092e9b7bad00905020210a6fe81cfb5b9fbc9f0a5b2e5a494b8e4cbc09bbcee84ebf4c894e80c0102022281aae59687d9c3b48ffca183dda38fc1b3c981a5e598cdf1b796b80b01020210e2e8ece8adf392c7a9b5a08797cfdfb7c9ade6d3c4978885e381a0010102021b8fe3bfaa9a9be9ccf88d9fdbfcb89be4c1c8eeacdc8bfefeccd3e40800020206d3e0cdf5b2b1d2b8b5aeafb7b5c5e1c5adc6888593d9f7ffc8bf901212010249fde0d6b6, 0x1120a020212be8ff393dc86f89ea1d9e0bb93b9a0800909020213f7af83caa2a7f6b4899aa7aaf2f5a8800c0802021499f0ebf989cddee5c3a4c8ecc28ee1cc83c80908020202a180dd9bd5aec8c5c5eafa8d8aecc5a28cb814060202079f99a4ceeb80c5e5ef8dc1b5f28d8995d480130102020181b49985aaeff0dbb1f096a6cc99d196cc8008010202039f848d9dbfb19eece9c0b2e1f0b9c7e0e6960101020204b8fdcefb8ff4d7ffebc5cda3a0eb869dc0ce121201020eadf2b19aafe2d6a2dbfef687baaac7b280140c010215fbc7a0f79ed58cd697eab0aebbeeaf9880800c0801021597dbf294f58bd7f7fd8f88fdeda9cad3a8980908010202b986a2f8f9babba7beadf3f8918d8dc9ade81406010204e2968eb8a3fca897b4dec5c5b2c4e7a2e680130101024192f39f9dccf3a880d39df9eafffec6ee80080101020185a1bb8eeb8af0e1b2d4fbf1fadae7f3c6b20101010204dacac8dbf8ebc492cb87e49fa8efada2ed9a1212000203cdae9689c895bce8a6ccd5a3efaeefe28014110002038bffe4f8f7e4f8d5ad83c88ec3a8e5a3c0f0140c000215e7fda2e28fc0f7d891e881f7dbd7b3c18b900c08000216c3e288e1dce1daa5cf959ae9aec1b0f59ea80908000202aa93a4c28d9397c1aeef9584b9e9b987fdd81406000201a1d4e58888dca6b5f38aada1b4a4c4faaab00101000204c2ddf88bd3caced1, 0x17804cc0e94ef09f0b80493b70493b84cbb8e37a6d70007e3e2899acfb3d48e86a9d8cd80019694a00194cbf119d303e666b7eb66b7ec13cf018f002dc8d883caf9d1e6bd84e480121202020991a393bf889da287fda98192c3c0b2ea80140c0202138aadf89592f9a2c0d399ae9686f0fbc5e480] private def node1690:Certificate:=PackedParametricCertificateData.decode 13 data1690 private def node1691:Certificate:=.split node1638 node1690 private def node1692:Certificate:=.split node1409 node1691 private def node1693:Certificate:=.split node1340 node1692 private def node1694:Certificate:=.negative 1 [(1,0),(3,2)] node1693 private def node1695:Certificate:=.split node1270 node1694 private def data1753:List Nat:=[ 0x1020df5c3d6f7cff6f2b9f980d2a8fc9f8ea9cabab1e6e8801b1fb68afcc9b38ef890b7d99194aca9e0000b02080201120030043603120403020202031104080c010e031203100400020206030b02000202020301131313110f0f11091107080706060605060111000a131313110f0f11091107080706060605110106010a131313110f0f110710070f0708070606060511010a060b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030e040b0609020006040a03011313131111080f081607130708071606060616010a1313131111080f081607130708071606060616010a1313131111080f081607130708071606060616010a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030f0c000202020301131313110f0f110c1608130809081607160109131313110f0f110c1608130809081607160109131313110f0f110c1608130809081607160109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030f2c0c020206011204120308020002020203010c0400020202030b1004060010031203090c01020002030803080c0608000a030e0307080204000603060306040002020603, 0x102025299e0f687a59b85dbf8addfefc0c0839ff2b590a0160602020197848786928bbaa9ff9c83929af09eea8596b390dfe2b0130602020895e7d6f1adc992a8f98887e6fdedd3ae8dc39897bec00605020201ef8dbba6a28a9b988ac48afab8c7ae8fefd2b7d480110102020ce5daf1e4a9e6dbb5b3b291f699bfcd89a092b4ece6801313010212c3a0d3b680a8bbf48fdaea81e29fd9f4919387dffb96131101022fcbe2c7c2f78dc6db8ffbf5f1d8a9cb83b7fbf8aadede160d010229bd848dd493d3e2a9c6b5c6fcf5abf3cddab3cbadb990160801023284e0eeb7d095b396f4e3fc9ee1cd9c80c8d3fcaf8f9016060102019b9eba8cba85b8b8bbe7c9ab92cedb9dffa3e9fed2fb90130601020497c4e8ede394aba9babcdb98e6968bbdecdcdfbcede00505010206fae397d5af91f7ebbeadbd81bdd0c6f8ddeaeedbc0110101020da6fec4c0e7d4e8e2a8b190ede5ac9ff7cfcac8ccb9801313000211d48df1c6869c95feb895dec9cb88eae1d3febfe7d2b21311000233edd4e5d3bab3b7c5858ecdbdbfbef69d95b3fad0cfca160d000223c2eedbd7d3e0cf92f083cf96dfbdbaabfb8ae0d8d5f0160800023e98c1aa98c78fa1b8d2cacc9f84deb681c2def7feb2b016060002019f9ff7d6f68892f0c9fdb2b3a6f8c1dce7c0f2ecfcaad0130600021bb8a9dfe7bd999fc6d4a0f7f884d2eaa1a585b7c480110100, 0x10d04080404010d000600020009131313110d04080404010d00060002000806010f060d0204060124040e04111c0d140a060906041c031313131113060d04060404010f000d000600091313131113060d04060404010f000d00060009131313110d04060404010f000d0006000806130402020202030f060d0202060302040d040a040904000e040e030113131311160d1606130613011100100004000913131311160d160613061301110004000813131311160d16061601110006061310030202060313131311160d160613061305070511010f0105010a13131311160d1608160613050705110105010913131311160d160816061305110107060b02080201120030043603011104080c010e031203100400020206030108a1a307979f03d50abb5180b501e5b60ad3e30ad3e40003e89796baffa4d388c18d8e91e5f1aff7c002e3ec03cbc104d19403f69d0e9e8905b0b342c4fc42c4fb0007e6e988e2a0a5f884f69d81de97b3e6e007cc4eea019589c60195e7bb2ae204fc65cced65ccee002bc2c3809eb1acb7f8ef89989bede3c01313020213a099d0d1f3bfe9e7c089d6c5a0e685aea2f0afae88b6131102022bb8d2e1e7b3f2d6f98e94b199cfd4b8e5bbf1fad7e3be160d02022feda6b4a2d9b1b998a9e89a8997c097e98290e3c2a3d01608020225f8de95fbe68cefd7c7c3a6d684fa9a97a9a3e9bcb3900707, 0x113131311140d130c0f040d040a04040100000913131311140d130c0f040d040a04040100000913131311140d0f040d0408040401000008061313131113060d04080404010d000600020009131313111306] private def node1753:Certificate:=PackedParametricCertificateData.decode 16 data1753 private def data1812:List Nat:=[ 0x10607060502110106010a130f110f0f0c080716060f0607060605050211010a130f110f0f0c0d070807160607060502110106010a060b02080201120030043603120403020202031104080c010e031203100400020206030b020002020203011311130f110c0f0c11090808080706060f0206010a1311130f110c11090808080706060f02060111000a1311130f110c11090808080706060f02060111000a060b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301130f110f110810080f07080707060f02060116000a130f110f110810080f07080707060f04060116000a130f110f110810080f07080707060f02060116000a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030f0c0002020203011311130f110c1608090816070f0716010f00091311130f0f0f110c1608090816070f071601091311130f0f0f110c1608090816070f07160109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030f2408020206011004100308020002020203010c0400020202030b0403060004030603090c01020002030803080c0608000a030e03070802040006030603, 0x11313110f140c0f0c09090f0606040f02040100000a1313130f110f140c0f0c09090f060604040100000a130f110f140c0f0c09090f060d040604040100000a061313110f0f0c09090f060d04060404010c0002000a1313110f0f0c09090f060d0404010c00060002000a1313110f0f0c09090d04080404010c00060002000a06010e020106020204111c0d140a060906041c031313110f0f0c090908070f060d040604040106000a1313110f0f0c090908070f060d040604040106000a1313110f0f0c090908070f060d040604040106000a06130402020202031313110f0d0708070f0606040f021101100106010a1313110f0d0708070f0606040f021101100106010a1313110f08070f060d0406040f021101100106010a060b02080201120030043603010d040a040904000e040e0301130f110f0f0c0907080716060f060701060002000a130f110f0f0c09070707160607011100060002000a130f110f0f0c09070707160611000c00060002000a0613100302020603130f110f0f0c080716060f0607061101100106010a130f110f0f0c0d070807160607061101060104010a130f110f160d0f0c080716060f061101060104010a060b02080201120030043603011104080c010e0312031004000202060301130f110f0f0c080716060f] private def node1812:Certificate:=PackedParametricCertificateData.decode 15 data1812 private def data1870:List Nat:=[ 0x10f0d0f0c0e0c0c0716060f0607060e02050206010a0f0d0f0c0e0c0d070c070f0607060e02050206010a0f0d0e0d0f0c0c070f0607060f020e02050206010a060b02080201120030043603120403020202031104080c010e031203100400020206030b02000202020301100f0f0d0e0d110c0f08080806060e0206010e000a100f0f0d0e0d110c0f08080806060e0206010e000a100f0f0d0e0d110c0f08080808070e0206010e000a060b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301100f0f0d0f0c1108080707060f0216000e0006000a100f0f0d0f0c1108080707060f0216000e0006000a100f0f0c1108080707060f02060116000e0006000a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030f0c000202020301100f0e0d110c0e0b0e090908160716010e0009100f0e0d110c1109160709070e0216010e0009100f0e0d110c1109160709070e0216010e0009060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030f2408020206011004100308020002020203010c0400020202030b0402020202030a0401020002030403080c0608000a030e03, 0x10f0d140c0f0c0e0c0f060e0606040f02040100000a0f0d140c0f0c0e0c0f060e0606040f02040100000a0f0d140c0f0c0e0c0f060e0606040f02040100000a060f0d0f0c0e0c0f060d0406040f0204010c0002000a0f0d0f0c0e0c0f060d0408040f0204010c0002000a0f0d0f0c0e0c0f060d0408040f0204010c0002000a06010e020106020204111c0d140a060906041c030f0d0f0c0e0c0f060d0406040f020401110006000a0f0d0f0c0e0c0f060d0406040f020401110006000a0f0d0f0c0e0c0f060d0406040f020401110006000a06130402020202030f0d0f0c0e0c110911070f060d040604110106010a0f0d0f0c0e0c11090f060d0406040f02110106010a0f0d0f0c0e0c0f060d0406040f021101100106010a060b02080201120030043603010d040a040904000e040e03010f0d0f0c0e0c16060f060e060f020701060001000a0f0d0f0c0e0c16060f060e060f020701060001000a0f0d0e0d0f0c0e0c16060e060f020701060001000a06131003020206030f0d0e0d0f0c0e0c0c070f0607060e02060102010a0f0d0e0d0f0c0e0c0c070f0607060e02060102010a0e0d0f0c0e0c0c070f0607060e020601040102010a060b02080201120030043603011104080c010e0312031004000202060301] private def node1870:Certificate:=PackedParametricCertificateData.decode 14 data1870 private def data1925:List Nat:=[ 0x1080201120030043603011104080c010e0312031004000202060301110f0c0c0a090f060906070613040601040002000a110f0c0c0a090f06090607060f040601040104000a1310110f100f0c0c0a09130609060f04060104010a060b02080201120030043603120403020202031104080c010e031203100400020206030b020002020203011313100c0c0c0c0808080d0606060d01060101010a13131311100c0c0c08080d0606060d01060101010a13131311100c0c0c08080d0606060d01060101010a060b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301131113100c0c10080f070907060608020d0106010a131113100c0c10080f070907060608020d0106010a131313110c0c10080f070907060608020d0106010a060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e04010200020308030606020600040304030113111310100c0c0c0d080f0709070d0109000913111310100c0c0c0d080f0709070d0109000913111310100c0c0c0d080f0709070d01090009060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d08061202120110041803080200020202030103020004020203, 0x1110f0c0c0a090f0607060c0204010d00040000000a110f0c0c0a09090607060c0204010d00040000000a1313110f0c0c0a0909060c0204010d00040000000a0613110c0c0a0a130607060c020f010701020000000a110f0c0c0a09090607060c0207011300020000000a110f0c0c0a09090607060c0207011300020000000a06010e02010602020411200d1c09060706042003110f0c0c0a090f06090607060c020701060002000a110f100f0c0c0a09090607060c020701060002000a110f100f0c0c0a090906070607011100060002000a0613040202020203110f100f0c0c0a0913060f0609060706100110000a1310110f0c0c0a091306090607061101100110000a1310110f0c0c0a091306090607061101100110000a060b02080201120030043603010d020802000403040301110f0c0c0a090f06090607060c020701060002000a110f0c0c0a09090607060f040c020701060002000a110f0c0c0a09090607060f040c020701060002000a0613100302020603110f0c0c0a090f060906070613040601040002000a1310110f0c0c0a090f06090607060f04060104000a1310110f100f0c0c0a090f0609060706060104010a060b02] private def node1925:Certificate:=PackedParametricCertificateData.decode 11 data1925 private def data1979:List Nat:=[ 0x10111000a060b020802011200300436030108040104000203060310040002020603011311130c0c0c0f060906070613020601040002000a1311110f0c0c0f06090607060f041101060104000a1310110f100f0c0c0f06090607060601040111000a060b0208020112003004360312040302020203080401040002030603100400020206030b0200020202030113131311100c0c0c0c0808080a0606060a0101010a13131311100c0c0c0c0808080a0606060a0101010a13131311100c0c0c0c0808080a0606060a0101010a060b02080201120030043603040203020002030203080401040002030603100400020206030b0200020202030a02000202020301131113100c0c10080f070907060608020d0106010a131113100c0c10080f070907060608020d0106010a131313110c0c10080f070907060608020d0106010a060b02080201120030043603040203020002030203080401040002030603100400020206030f04060c02120316030e04010200020308030606020600040304030113111310100c0c0c0d080f0709070d0109000913111310100c0c0c0d080f0709070d0109000913111310100c0c0c0d080f0709070d01090009060b02080201120030043603040203020002030203080401040002030603100400020206030f04060c02120316030e0402020206030d080612021201100418030802000202020301, 0x1110f0c0c0a0a0f0607060c0204010d00040000000a110f0c0c0a0a090607060c0204010d00040000000a1313110f0c0c0a0a09060c0204010d00040000000a061311130c0c0c1109130607060c020701020000000a1311110f0c0c070613020c0207011300020000000a110f0c0c0a0a070613020c0207011300020000000a06010e02010602020411100d0e08060310031311130c0c0c0f06070613020c020701060002000a1311110f100f0c0c070613020c020701060002000a110f100f0c0c09080906070607011100060002000a06130402020202031311100f0c0c0f060906070610010601110010000a13111310110f0c0c13060f0609060706110110010a1310110f0c0c09081306090607061101100110000a060b02080201120030043603010d0208020004030403011311130c0c0c0f06070613020c020701060002000a1311110f0c0c07061304130207011100060002000a110f0c0c0906070613040f0407011100060002000a06131003020206031311130c0c0c0f060906070613020601040002000a1311110f0c0c0f06090607060f041101060104000a1310110f100f0c0c0f0609060706060104] private def node1979:Certificate:=PackedParametricCertificateData.decode 10 data1979 private def data2033:List Nat:=[ 0x100040009130b09071306070613020c0209010600040009130b09071306070613020c0209010600040009060a0201060012031403011104080c010e0312031004000202060301130b13080907130607060c0209010600040009130b09071306070613020c0209010600040009130b09071306070613020c0209010600040009060a0201060012031403120403020202031104080c010e031203100400020206030b02000202020301100c130b110b13080c08090706060901010109130b110b0c0b13080c08090706060901010109130b110b0c0b13080c08090706060901010109060a02010600120314030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301100c1108100809080807090607060d010f0009100c1108100809080807090607060d010f0009100c1108100809080807090607060d010f0009060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e04010200020308030f0c000202020301110b100b16090b0916070b070d061601081613110b16090b0916070b070d061601081613160f110b0b0916070b070d06160008060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030f120d0201040306030802000202020301, 0x11413130b090713020c020701070004000000091413130b090713020c020701070004000000091413130b090713020c0207010700040000000906130b0b09090713020202070111000200000009130b0b09090713020202070111000200000009130b0b0909071302020207011100020000000906010e02010602020411100d0e0806031003130b09070c06070613020c0207010900060009130b09070c06070613020c0207010900060009130b0907070613020c020701110009000600090613040202020203130b13080907130607060c0209011000020009130b13080907130607060c0209011000020009130b0907130607060c02090111001000020009060a0201060012031403010d020802000403040301130b09070c06070613020c0207010900060009130b09070c06070613020c0207010900060009130b0907070613020c020701110009000600090613100302020603130b13080907130607060c02090106] private def node2033:Certificate:=PackedParametricCertificateData.decode 10 data2033 private def node2034:Certificate:=.split node1979 node2033 private def node2035:Certificate:=.split node1925 node2034 private def node2036:Certificate:=.positive 3 [(1,4),(8,9)] node2035 private def node2037:Certificate:=.positive 9 [(5,3),(3,6),(22,8)] node2036 private def node2038:Certificate:=.split node1870 node2037 private def node2039:Certificate:=.split node1812 node2038 private def node2040:Certificate:=.split node1753 node2039 private def data2102:List Nat:=[ 0x11203010b0200020202040f0d110c0f0c08080c040b040904080406010e000a0f0d110c0f0c08080c040b040904080406010e000a0f0d110c0f0c08080c040a040904080406010e000a060b020802011200300436030402030200020302030e040a080904001204120310040d0209020106040a0313110f0d0e0d110c0f08080807070e02060110000a13110f0d0e0d110c0f08080807070e02060110000a13110f0d0e0d110c0f080808080707070e0206010a060b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204131111110f0d130c110c080809070606100108010a131111110f0d130c110c090706060f02100108010a131111110f0d130c110c090706060f02100108010a060b020802011200300436030402030200020302031104080c010e031203100400020206030f040c0608060306040a030e0402020206030d04090601020306031311130d110c10070f07090713020f021001091311130d110c100709070f0413020f021001091311130d110c100709070f0413020f02100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d04090601020306030101060601020008030803050602080002030803040601080008030e03060e03060016031403, 0x10d0f0d0f0c0e0c10060f060f021001040100000a100d0f0d0f0c0e0c10080f060f021001040100000a100d0f0d0f0c0e0c10080f060f021001040100000a0601100d0f0d0f0c10080f0810060f061101110001000a100d0f0d0f0c10080f0810060f061101110001000a100d0f0d0f0c10080f0810060f061101110001000a060b020802011200300436030111240e140a1609020424030f0d0f0c0e0c11090e0910060f0607060d0411010a0f0d0f0c0e0c110910060f0607060d040f0211010a0f0d0f0c0e0c110910060f0607060d040f0211010a060b020802011200300436030e0201060202030e040a0809040012041203010b0200020202040a0200020202041111130d0f0d130c110c110213010701010100000a1111130d0f0d130c110c110213010701010100000a1111130d0f0d130c110c110213010701010100000a0610040c0405060302031311130d130c110c1308080807040703010111000a1311130d0f0d130c110c130807040703010111000a1311130d0f0d130c110c130807040703010111000a060b020802011200300436030111240e140a16090204240313110f0d110c0f0c08080c05080509040f0206010a13110f0d110c0f0c08080c05080509040f0206010a13110f0d110c0f0c08080c05080509040f0206010a060b020802011200300436030404010600020304030e040a080904001204, 0x1100d0f0d0f0c10060f060f0210010401070000000a100d0f0d0f0c10060f060f0210010401070000000a100d0f0d0f0c10080f060f0210010401070000000a0610] private def node2102:Certificate:=PackedParametricCertificateData.decode 14 data2102 private def data2119:List Nat:=[ 0x111110d0d110c0c0c0808080606060c02020208010a131111110d0d110c0c0c080808060606110202020a131111110d0d110c0c0c0d06080606060c0208010a060b020802011200300436030402030200020302031104080c010e031203100400020206030c02050203020302030e0402020206030d04090601020306031311110c0c0c10080f0709070c021001090009131313110c0c10080f0709070c021001090009131313110c0c10080f0709070d060c02100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node2119:Certificate:=PackedParametricCertificateData.decode 9 data2119 private def data2166:List Nat:=[ 0x1060c02020213010701010107000a13110d0d0c0c090906060c0202020701010107000a13110d0d0c0c090906060c0202020901010107000a0613110d0d0c0c090906060c0202021301070101010a13110d0d0c0c090906060c0202020901070101010a13110d0d0c0c090906060c0202020901070101010a06010f0f0d0d110c110908080d060f040703020201010a0f0f0d0d110c08080d06040407030202010111000a13110d0d110c08080d06080507030202010111000a060b0208020112003004360301010d0d110c11080c080808110706060c02080201010a0d0d110c0c08080811070d0606060c02060101010a13110d0d110c0a0808080d0606060c02060101010a060b020802011200300436030404010600020304030e0407040006030603010b0200020202040d0d110c11080c080808110706060c02080201010a0d0d110c0c080808110706060c020802060101010a13110d0d110c0a0808080d0606060c02060101010a060b020802011200300436030402030200020302030e04070400060306030d02060201060306030d0d110c0c0808080d060606130407040c0201010a0d0d110c0c0c0c0808080d0606061304070401010a0d0d110c0c0c0c0808080d06060613040c0201010a060b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1040000000a110f0c0c0a09090607060c0204010d00040000000a1313110f0c0c0a0909060c0210010401040000000a0613110d0d0c0c0a0a07060c020f010701020000000a110f0c0c0a0a0a09130607060c020701020000000a110f0c0c0a09090607060c0207011300020000000a0601131313080808070713060c0609061100020000000a13130f0f0808070713060c0609061100020000000a13110f0f0808070713060c0609061100020000000a060b02080201120030043603011104030202020313131311110f0c0c0807130609061101060002000a13131311110f0c0c0807130609061101060002000a110f0c0c090808081306090611010601060002000a060b020802011200300436030e02010602020308040304000e030a03010b0200020202040a02000202020413111111130c0c0c0707060608010101090007000a131111110c0c09070707060608010101090007000a131111110c0c09070606090108010101090007000a0613111111130c0c0c090706060c01080101010d000a13111111130c0c0c09070606080101010f000d000a131111110c0c0907070706060901080101010f000a060113131311110c08081305080509020d0101010d000a13131311110c08081305080509020d0101010d000a131313110f0f110c08080c05080509020d0101010a061002090200060306030113110c0c090906, 0x1110f0c0c0a090f0607060c0204010d00] private def node2166:Certificate:=PackedParametricCertificateData.decode 9 data2166 private def node2167:Certificate:=.split node2119 node2166 private def node2168:Certificate:=.positive 12 [(15,0),(1,5),(8,6)] node2167 private def data2193:List Nat:=[ 0x1131111110c0c130b0808090708060801060102000a13110c0c130b080809070806080106010d0002000a13110c0c130b080809070806080106010d0002000a060a02020600060308031204030202020311110d0d110c0c0c0808080606060c02020208010a131111110d0d110c0c0c080808060606110202020a11110d0d110c0c0c0d06080606060c02020208010a060b02080201120030043603040203020002030203010702040202020311110d0d110c0c0c0808080606060c02020208010a131111110d0d110c0c0c080808060606110202020a131111110d0d110c0c0c0d06080606060c0208010a060b0208020112003004360304020302000203020308040104000203060310040002020603010e0402020206030d04090601020306031311110c0c0c10080f0709070c0210010900091311110c0c0c10080f0709070d060c021001091311110c0c0c10080f0709070d060c02100109060b02080201120030043603040203020002030203080401040002030603100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node2193:Certificate:=PackedParametricCertificateData.decode 9 data2193 private def data2248:List Nat:=[ 0x1110c080813050404070302020a0101010a0f0f0d0d110c0f0a08080404070302020a0101010a060b0208020112003004360301010d0d110c0d0a0c0808080a0606060c02020201010a13110d0d110c0d0a0c0808080a0606060c0201010a13110d0d110c0c0c0c0808080a0606060c0201010a060b0208020112003004360304040106000203040302040006020203010b0200020202041311110c13080808060613030a01060101010a000a1311110c13080808060613030a01060101010a000a13131311110c13080808060613030a0101010a000a060a02040602020312040302020203020400060202041311110c0c080808110706010d000a00060002000a1311110c0c08080811070f0306010d00060002000a1311110c0c08080811070f0306010d00060002000a060a0202060006030803120403020202030d0d110c0d0a0c0808080a0606060c02020201010a13110d0d110c0d0a0c0808080a0606060c0201010a13110d0d110c0c0c0c0808080a0606060c0201010a060b020802011200300436030402030200020302030101110c0d0a0c0808080a060606130409040c0201010a13110d0d110c0d0a0c0808080a0606060c0201010a13110d0d110c0d0a0c0808080a0606060c0201010a060b020802011200300436030402030200020302030804010400020306031004000202060301010108020002020204, 0x10713060f0609061101060002000a1313110f0c0c080713060f0609061101060002000a1313110f0c0c08071306090611010601060002000a060b020802011200300436030e02010602020308040304000e030a03010b0200020202040a02000202020413111111130c110c0c0c130b06060801010109000a13111111130c110c0c0c130b06060801010109000a13111111130c0c0c130b090706060801010109000a0613111111130c110c0c0c06060c01080101010d000a13111111130c110c0c0c0606080101010f000d000a13111111130c0c0c070706060901080101010f000a060113111111110c0c0c0808060606010101090008000a13111111110c0c0c0808060606010101090008000a13111111110c0c0c0808060606010101090008000a0613131311110c13080808060613050a01060101010a13131311110c13080808060613050a0101010a000a13131311110c08080606130507020a0101010a000a06010113110c0c090906060c02020213010701010107000a13110d0d0c0c090906060c0202020701010107000a13110d0d0c0c090906060c0202020901010107000a0613111111110c0c0c06060c0202021301070101010a131111110c0c060611020c0202020901070101010a131111110c0c090906060c0202020901070101010a06010f0f0d0d110c080813050404070302020a0101010a0f0f0d0d, 0x1110f0c0c0a0a0f0607060c0204010d00040000000a110f0c0c0a0a0f0607060c0204010d00040000000a1313110f0c0c0a0a09060c0207010401040000000a06131313110c0c1107130607060c020701020000000a1311110f0c0c070613020c0207011300020000000a110f0c0c0a0a070613020c0207011300020000000a060113131308070713060c06090607041100020000000a13131308070713060c06090607041100020000000a13130f0f070713060c06090607041100020000000a060b0208020112003004360301110403020202031313110f0c0c08] private def node2248:Certificate:=PackedParametricCertificateData.decode 9 data2248 private def node2249:Certificate:=.split node2193 node2248 private def data2274:List Nat:=[ 0x1130b0b09090708060d01080102010d000a0009130b0b09090708060d01080102010d000a0009130b0b09090708060d01080102010d00090009060a020206000603080312040302020203130b110b0f0709070d06080606060801090009130b110b0f0709070d06060608010101090009130b110b09070d0606060c0208010101090009060a02010600120314030402030200020302030107020402020203130b110b0f0709070d06080606060801090009130b110b09070d06080606060c020801090009130b110b09070d06080606060c020801090009060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d0409060102030603130b10090b09100810070b0710010f0008130b10090b09100810070b0710010f0008130b110b10090b0910070b0710010f0008060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node2274:Certificate:=PackedParametricCertificateData.decode 9 data2274 private def data2329:List Nat:=[ 0x1110b0f07090706060202070101010900090601110b0b09130809070606130502020101090009110b0b0913080f070907060602020101090009110b13080f0709070d06060602020101090009060a02010600120314030101130b110b0c0b130809070d0606060901010109130b110b0c0b130809070d0606060901010109130b110b0c0b130809070d0606060901010109060a020106001203140304040106000203040302040006020203010b020002020204130b0b09130811080907060606010101090009130b0b09130811080907060606010101090009130b0b09130811080907060606010101090009060a0204060202031204030202020302040006020204130b0b09130811080907060101010900020009130b0b091108090706010a0009000600020009130b0b091108090706010d0009000600020009060a020206000603080312040302020203130b110b0c0b13080c08090706060901010109130b110b0c0b130809070d0606060901010109130b110b0c0b130809070d0606060901010109060a02010600120314030402030200020302030101130b110b13080c080907060609010101090009130b110b0c0b13080c08090706060901010109130b110b0c0b130809070d0606060901010109060a02010600120314030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1000000090601130b1308090713060202090109000200000009130b1308090713060202090109000200000009130b1308090713060202090109000200000009060a02010600120314030111040302020203130b1308090713060c02090111000600020009130b1308090713060c02090111000600020009130b1308090713060c02090111000600020009060a02010600120314030e02010602020308040304000e030a03010b0200020202040a020002020204140f130b110b0b0909070d0608010101070009140f130b110b0b0909070d0608010101070009140f130b110b0b0909070d060801010107000906130b110b0b0909070606080107010101090009130b110b0b0909070606080107010101090009130b110b0b09090706060801070101010900090601130b110b0b0909070606090101010800070009130b110b0b0909070606090101010800070009130b110b0b090907060609010101080007000906130b0b09130811080907060606010101090009130b0b09130811080907060606010101090009130b0b09130811080907060606010101090009060101130b110b09070d060606110202020101070009130b110b09070d0611020c0202020101070009130b110b09070d0611020c020202010107000906130b110b0f0709070606020207010101090009130b110b0f0709070606020207010101090009130b, 0x11413130b090713020c020701070004000000091413130b090713020c020701070004000000091413130b090713020c0207010700040000000906130b0b09090713020202070111000200000009130b0b09090713020202070111000200000009130b0b090907130202020701110002] private def node2329:Certificate:=PackedParametricCertificateData.decode 9 data2329 private def node2330:Certificate:=.split node2274 node2329 private def node2331:Certificate:=.split node2249 node2330 private def node2332:Certificate:=.split node2168 node2331 private def data2383:List Nat:=[ 0x10708061101080101010000091513151115091107080611010801010100000915131511150911070806110108010101000009061513151115091107080608010f000900010009151315111509110708060801090001000000091513151115091107080608010900010000000906011210060202060308040104000203060415131509090708060f030603040303020b0009151315090907080708060f03060303020b0009151315090907080708060f03070304030b0009061404020600040306031204040201060304030f0709070b060606130211020b0108010900090f0709070b060606130211020b0108010900090f0709070b060606130211020b010801090009060602010e002003240304020302000203020301010f0709070b060606130211020b0108010900090f0709070b060606130211020b0108010900090f0709070b060606130211020b010801090009060602010e00200324030402030200020302030402010402020310040002020603010e0402020206030d04090601020306031513100b150910091008150710070c02081513150910091008150710070c02150108150f150910091008150710070c02150108061404010600100312030402030200020302031204010202020310040002020603100402020202030e0402020206030d0409060102030603010107020102020204060804060018031a04, 0x1140f1308110809081107090708010701010109140f1308110809081107090708010701010109140f130811080908090708010701010108060a0201060012031404130811080908110709071301090101010000091308110809081107090713010901010100000913081108090811071301110109010101000009060a02040602020401080401040002030604070201060002030804060602080002030a04130811080908110709071301090101010000091308110809081107090713010901010100000913081108090811071301110109010101000009061308110809080907060601010f000a000900091308110809080907060601010f000a0009000913081108090809070606010113000f0009000906011204030202020308040104000203060407020402020204060603020206030804010d10090e04060310030802000202020415131511150911] private def node2383:Certificate:=PackedParametricCertificateData.decode 12 data2383 private def node2384:Certificate:=.split node2332 node2383 private def node2385:Certificate:=.positive 8 [(5,4),(1,6),(24,8)] node2384 private def node2386:Certificate:=.split node2102 node2385 private def node2387:Certificate:=.negative 1 [(1,1),(1,2)] node2386 private def node2388:Certificate:=.negative 4 [(4,0),(3,1),(3,3)] node2387 private def node2389:Certificate:=.split node2040 node2388 private def node2390:Certificate:=.split node1695 node2389 private def node2391:Certificate:=.split node1151 node2390 private def node2392:Certificate:=.split node619 node2391 private def zz546:"s0222"="s0222":=by decide+kernel private theorem valid142:check node142 ctx142 quad142 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid301:check node301 ctx301 quad301 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid142 · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid511:check node511 ctx511 quad511 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid615:check node615 ctx615 quad615 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · exact valid511 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz547:"s0223"="s0223":=by decide+kernel private theorem valid619:check node619 ctx619 quad619 (hinges.drop 1) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid301 · exact valid615 private theorem valid750:check node750 ctx750 quad750 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid833:check node833 ctx833 quad833 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1147:check node1147 ctx1147 quad1147 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz548:"s0224"="s0224":=by decide+kernel private theorem valid1148:check node1148 ctx1148 quad1148 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid833 · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1147 private theorem valid1151:check node1151 ctx1151 quad1151 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid750 · exact valid1148 private theorem valid1340:check node1340 ctx1340 quad1340 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1409:check node1409 ctx1409 quad1409 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz549:"s0225"="s0225":=by decide+kernel private theorem valid1537:check node1537 ctx1537 quad1537 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1691:check node1691 ctx1691 quad1691 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid1537 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1694:check node1694 ctx1694 quad1694 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid1340 · apply NatParametricCheckSteps.split_valid · exact valid1409 · exact valid1691 private theorem valid2037:check node2037 ctx2037 quad2037 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz550:"s0226"="s0226":=by decide+kernel private theorem valid2040:check node2040 ctx2040 quad2040 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2037 private theorem valid2331:check node2331 ctx2331 quad2331 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2384:check node2384 ctx2384 quad2384 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2331 · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2389:check node2389 ctx2389 quad2389 (hinges.drop 3) = true:=by apply NatParametricCheckSteps.split_valid · exact valid2040 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2384 private def zz551:"s0227"="s0227":=by decide+kernel private theorem valid2390:check node2390 ctx2390 quad2390 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1694 · exact valid2389 private theorem valid2392:check node2392 ctx2392 quad2392 (hinges.drop 0) = true:=by apply NatParametricCheckSteps.split_valid · exact valid619 · apply NatParametricCheckSteps.split_valid · exact valid1151 · exact valid2390 theorem certificate_valid:check node2392 constraintsNat base hinges = true:=valid2392 theorem nonnegative (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i):0 ≤ slack t x:=by unfold slack apply div_nonneg · apply check_sound node2392 constraintsNat base hinges t x ht0 ht1 _ certificate_valid intro i have hC (j:Fin 4):0 ≤ linearEval (constraints j) x:=by fin_cases j <;> simpa [constraints,linearEval,Fin.sum_univ_succ] using hx _ exact hC ⟨i % 4,Nat.mod_lt _ (by decide)⟩ · norm_num [normalizationDenominator] end Green24Proof.QuadNearBalanceCase4 private def zz2180:"s0884"="s0884":=by decide+kernel end section namespace Green24Proof.QuadNearBalanceCase5 open ParametricQuadraticCertificates hiding Certificate check check_sound open NatParametricCertificates open NatBacksubRecoveredQuadraticCertificates (cons) open IntegerQuadraticCertificates (Linear Point linearEval combinationCheck) def constraints:Fin 4 → Linear:=![![1,0,0,0], ![0,1,0,0], ![0,0,1,0], ![0,0,0,1]] def base:Quadratic:=![![![0x380da9dd80678, -0x221b262dd8000, -0x3328b944c4000,0x272784c5e33c], ![-0x221b262dd8000, -0x120fab7bccbbd0,0x40998df762514,0x10c399d674506], ![-0x3328b944c4000,0x40998df762514, -0xe0036e4b25230,0x22afe3b62248c], ![0x272784c5e33c,0x10c399d674506,0x22afe3b62248c, -0x110d9316ec000]], ![![0x18aa1b2200,0,0x51dac207a000, -0x2a96a9a4a280], ![0,0, -0x791eda6a9d80,0x51dac207a000], ![0x51dac207a000, -0x791eda6a9d80,0x18aa1b2200, -0xc550d9100], ![-0x2a96a9a4a280,0x51dac207a000, -0xc550d9100,0]], ![![-0x752b5c80fa0,0x2282d6c00,0x2cf9f59d370,0x37109fd8f40], ![0x2282d6c00,0x752b5c80fa0,0x21867f240, -0x483166e3c30], ![0x2cf9f59d370,0x21867f240,0,0x2282d6c00], ![0x37109fd8f40, -0x483166e3c30,0x2282d6c00,0]]] def hinges:Hinges:=[(![0,0x62a86c880,0], ![0,0,1, -3]),(![-0x4a5ec425246, -0x1ed4a1ea80,0], ![0,0,1, -1]),(![0x4a5ec425246,0,0], ![0,0,3, -1]),(![0x95230bf7bd8,0,0], ![0,1, -3,0]),(![0x1393c262f19e,0,0], ![0,1,0, -3]),(![0x3d03e016d13c9,0, -0x752b5c80fa0], ![0,1,0, -1]),(![-0x110d9316ec000,0,0], ![0,3, -2, -1]),(![0x110d9316ec000,0,0], ![0,3, -2,1]),(![-0x95230bf7bd8,0,0], ![0,3, -1,0]),(![0x1143f85f3421,0,0], ![0,3,0, -1]),(![0x110d9316ec000,0,0], ![0,3,2, -1]),(![-0x4a5ec425246,0,0], ![1, -3,0,0]),(![-0x110d9316ec000,0,0], ![1, -2, -3,0]),(![0x110d9316ec000,0,0], ![1, -2,3,0]),(![0x4a5ec425246,0x1ed4a1ea80,0], ![1, -1,0,0]),(![-0x1143f85f3421,0,0], ![1,0, -3,0]),(![-0x3d03e016d13c9,0,0x752b5c80fa0], ![1,0, -1,0]),(![0x110d9316ec000,0,0], ![1,2, -3,0]),(![0, -0x62a86c880,0], ![3, -1,0,0]),(![-0x1393c262f19e,0,0], ![3,0, -1,0])] def normalizationDenominator:ℤ:=0x221b262dd8000 noncomputable def slack (t:ℝ) (x:Point):ℝ := (quadraticEval base t x + hingeEval hinges t x) / normalizationDenominator def constraintsNat (i:Nat):Linear := constraints ⟨i % 4,Nat.mod_lt _ (by decide)⟩ private def ctx2392:Nat → Linear:=constraintsNat private def quad2392:Quadratic:=base private def ctx619:Nat → Linear:=cons ![0,0,1, -3] ctx2392 private def quad619:Quadratic:=quad2392 + coefficientProduct ![0,0x62a86c880,0] ![0,0,1, -3] ![0,0,1, -3] private def ctx301:Nat → Linear:=cons ![0,1,0, -3] (cons (-![0,1, -3,0]) (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx619))) private def quad301:Quadratic:=(((quad619 + coefficientProduct ![-0x4a5ec425246, -0x1ed4a1ea80,0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x4a5ec425246,0,0] ![0,0,3, -1] ![0,0,3, -1])) + coefficientProduct ![0x1393c262f19e,0,0] ![0,1,0, -3] ![0,1,0, -3] private def ctx142:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx301) private def quad142:Quadratic:=(quad301 + coefficientProduct ![0x3d03e016d13c9,0, -0x752b5c80fa0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x110d9316ec000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx615:Nat → Linear:=cons (-![0,1,0, -3]) (cons (-![0,1, -3,0]) (cons ![0,0,3, -1] (cons ![0,0,1, -1] ctx619))) private def quad615:Quadratic:=(((quad619 + coefficientProduct ![-0x4a5ec425246, -0x1ed4a1ea80,0] ![0,0,1, -1] ![0,0,1, -1]) + coefficientProduct ![0x4a5ec425246,0,0] ![0,0,3, -1] ![0,0,3, -1])) private def ctx511:Nat → Linear:=cons ![0,1,0, -1] ctx615 private def quad511:Quadratic:=quad615 + coefficientProduct ![0x3d03e016d13c9,0, -0x752b5c80fa0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1151:Nat → Linear:=cons ![0,0,1, -1] (cons (-![0,0,1, -3]) ctx2392) private def quad1151:Quadratic:=(quad2392) + coefficientProduct ![-0x4a5ec425246, -0x1ed4a1ea80,0] ![0,0,1, -1] ![0,0,1, -1] private def ctx750:Nat → Linear:=cons ![0,1,0, -1] (cons ![0,1,0, -3] (cons (-![0,1, -3,0]) (cons ![0,0,3, -1] ctx1151))) private def quad750:Quadratic:=(((quad1151 + coefficientProduct ![0x4a5ec425246,0,0] ![0,0,3, -1] ![0,0,3, -1])) + coefficientProduct ![0x1393c262f19e,0,0] ![0,1,0, -3] ![0,1,0, -3]) + coefficientProduct ![0x3d03e016d13c9,0, -0x752b5c80fa0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1148:Nat → Linear:=cons (-![0,1,0, -3]) (cons (-![0,1, -3,0]) (cons ![0,0,3, -1] ctx1151)) private def quad1148:Quadratic:=((quad1151 + coefficientProduct ![0x4a5ec425246,0,0] ![0,0,3, -1] ![0,0,3, -1])) private def ctx833:Nat → Linear:=cons ![0,3, -2, -1] (cons ![0,1,0, -1] ctx1148) private def quad833:Quadratic:=(quad1148 + coefficientProduct ![0x3d03e016d13c9,0, -0x752b5c80fa0] ![0,1,0, -1] ![0,1,0, -1]) + coefficientProduct ![-0x110d9316ec000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx1147:Nat → Linear:=cons (-![0,1,0, -1]) ctx1148 private def quad1147:Quadratic:=quad1148 private def ctx2390:Nat → Linear:=cons (-![0,0,1, -1]) (cons (-![0,0,1, -3]) ctx2392) private def quad2390:Quadratic:=(quad2392) private def ctx1694:Nat → Linear:=cons (-![0,1, -3,0]) (cons ![0,0,3, -1] ctx2390) private def quad1694:Quadratic:=(quad2390 + coefficientProduct ![0x4a5ec425246,0,0] ![0,0,3, -1] ![0,0,3, -1]) private def ctx1340:Nat → Linear:=cons ![0,1,0, -1] (cons (-![0,1,0, -3]) ctx1694) private def quad1340:Quadratic:=(quad1694) + coefficientProduct ![0x3d03e016d13c9,0, -0x752b5c80fa0] ![0,1,0, -1] ![0,1,0, -1] private def ctx1409:Nat → Linear:=cons ![0,3, -2, -1] (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1694)) private def quad1409:Quadratic:=((quad1694)) + coefficientProduct ![-0x110d9316ec000,0,0] ![0,3, -2, -1] ![0,3, -2, -1] private def ctx1691:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx1694)) private def quad1691:Quadratic:=((quad1694)) private def ctx1537:Nat → Linear:=cons ![0,3, -1,0] (cons ![0,3, -2,1] ctx1691) private def quad1537:Quadratic:=(quad1691 + coefficientProduct ![0x110d9316ec000,0,0] ![0,3, -2,1] ![0,3, -2,1]) + coefficientProduct ![-0x95230bf7bd8,0,0] ![0,3, -1,0] ![0,3, -1,0] private def ctx2389:Nat → Linear:=cons (-![0,0,3, -1]) ctx2390 private def quad2389:Quadratic:=quad2390 private def ctx2040:Nat → Linear:=cons ![0,1, -3,0] ctx2389 private def quad2040:Quadratic:=quad2389 + coefficientProduct ![0x95230bf7bd8,0,0] ![0,1, -3,0] ![0,1, -3,0] private def ctx2037:Nat → Linear:=cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) ctx2040)) private def quad2037:Quadratic:=((quad2040)) private def ctx2384:Nat → Linear:=cons ![0,3, -2,1] (cons (-![0,3, -2, -1]) (cons (-![0,1,0, -1]) (cons (-![0,1,0, -3]) (cons (-![0,1, -3,0]) ctx2389)))) private def quad2384:Quadratic:=((((quad2389)))) + coefficientProduct ![0x110d9316ec000,0,0] ![0,3, -2,1] ![0,3, -2,1] private def ctx2331:Nat → Linear:=cons (-![0,3,0, -1]) (cons ![0,3, -1,0] ctx2384) private def quad2331:Quadratic:=(quad2384 + coefficientProduct ![-0x95230bf7bd8,0,0] ![0,3, -1,0] ![0,3, -1,0]) private def data60:List Nat:=[ 0x1010201acc7e084e9a3f1f593e4e1f39cab89f6b9a0060601020db1bddb9cc8d5f1acbc908aa9b5b3f4f2801701010250f78581faaf81e182d786c3b993efc287a01313000201aec5d2918e99eeaccc8199c4b1e891f0e0a010080002089cb5c19ac6d5e0d9f3a2d682bbe2f2c9801707000207d98b89c8e8c889dddea1c292e5f9e388cad01107000208c9a4b2de85cc80f79bf782c0eba08581f9d00807000220afc5dfd5fc9e89a3faa4e098c2f1e2df801706000202f2a2c2aaea9b96dda98692bcadcdd184bdb01106000201a68fe9d187b9dceab3b698abbd87b5f3beb01701000233d1c488e298d984f397d7d09089859ec9c01e07e5b994a08289cac0dc9880000b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e040102000203080310040a0400020302030113131311130911080908110709071101170009131313111309110809081107090711011700091313131113091108110709071101170008060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04020202060310060d020a060104040603080200020202030107020102020203060804060018031a030502010200040306030a04000202020307080204000603060306040002020603050403060002030603, 0x1000b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a020002020203010a82df03a8c301c4b347ea1bd2dc51a99d05a3c20296a50003d8f482d082aceaf08bada7cea016a0ee03d3ce2ad4bd1483de0ac5a102d88a5eeab22ed8950008da9a8bcde98090fcf6fadce01313020201ccb7c1fbcdebc69efffcc896c4b985d686aa131102022d95ec81cda4eea0ee95f0f8be86d989a182130802023a81f5a7a6bff7eb93a381e2b9b6f598f5801008020208d4fdbdd18e85c7d49cff8282c6fab4a0e01707020207c6bea49beb8aecedfbc6bbcab3dcf681e5801107020209ae87f2a2ce8de1b5b991d6e7c09cb999ecd8080702021b8f9eccd3c6e3e19cc8ea99addfa5c7d1e01106020201abef99dde5bde8c8a9afa3c2879fbdf589a80606020215d880859fd9f38a9bf4a18cd1d29efdbce01701020261c2e4d4f4d0d6c1e7f1afdeab9393eac0801313010201cbb799a187c4af86c3abfb9d8dd996b2dfc0130801022cf8e4efdea5babcffeaa4ebbaa894b8bde01008010208c5f3b4b8c8cdb787f2df96ef97ce87f3a01707010207bef2cddb95e2c0bfd3b7c3f2bd8dfda29ce01107010208fc828ce09abac8e0b0d3e8c88cae92c5d7c0080701021cdde0acdde2c9fed8c9ed8ba5d3f485d3c0170601020186e0b8ddfda9fcabc297c7c8e6c6e6f985801106, 0x1dee187edbeb78c9d8ab89dd9b3c6c2a29abbf1eedbf3f3fa82d6d9eacae2a7daf0c6fe9782c00505010205e3b09befdfd8faf8e593c880d0bdf0cdf2a1dac1fc87eeddaa8cf8b48ef28cb9b8c2b3ccaca9a8dcaae7a4b81702010256bbfcafb0d6cf89ebcabbc2d7f89ccfa6e4dbc388dbb6fde7b5a5938fdc92c785f2fcedad989e93fa88dad0170001020c8e86e7c0d6faaaf3e1889bd68ae9f6a08fa393f4fdf1adafb6eae3daf7db8796d7bc99fdabb6fdb7b1c7bbf0171300025aebcb8be1deb6a8edb7cfc9c5ddfaa8b3a3d09fcaa287b4b5aeca95e7f4b289c3c8b6f9c0d6bde580b290c8e01010000207a5ffb292ad8cf3e7d5bef0b398bfd282a7e0acb489a49df0d3d6f7bd8de9db85a3bcc2f6fffcafbee7d00707000214e8c7a099bca9e8f092c9b6add992a0eec6d9ebb1d8f0d4f3c58cc28accaabd838d9ca3fe89c7a88481e01706000217ceddf9baeef39e8885c7fbf29eaa8ee5edd6eea6b897dce5b2c4abd888de9fa0e6c4f0fe8dcaa3e3ab9ac5c0060600022ba3ef85808aecfb99a8c2a5988a8ad8efd6beb7ae8cb69982d4e598ace99ba2f29dc9e58f8c9dc6bbfcc8170100020b8caabceba9c7d6ffc1d7e9b5fee7bda5f8bbd3c0cee7a9a785b4a2a8ed859cc9b3c1b597bbb1db98baecc8e01e16a2b8a7facec79ef7d990949ec29be5c4a297d9faa1d0f18bd8e79e86e1f8f89a86f8cce99590, 0x1d68deb83cba5e194b891debfca06060202099193b0baeca9eebd8ca293f5b9a582efb9a3d2c9eea28f9e8dcaf5d9cae3d28bf6a789b986d2d0e0ccd7bdea1701020213c1d5f1eaa9b2c9b3def08680b3889c8986d5ee93c08fca9da8acc3e8cfbeb5cfb0d98ef1e2eef0898bb7b1a407010202558caf9cb0d393d0dbe69d92b59b80fcf1d8bb8cc3aac494a6c7d4a8b2f7dfb3e98aa398e1b5ccddef98e0b00601020202ceb0c0f099c1bd86f68fc5d0aeb8ed8fcac2d1e48dffc5eebdb8b8b6d2f0f298ddd9a4a7b09086ccb2b1a4b0010102023fd8aae5fbcf9cbbd3acb9dacfd3f5c6d8c182efefc19dfcc7c5f2f9aad5dfe380eaa292b5fce9c687998dd0170f010261b6eda6bca2a48fadfa9ff6bbb29cda9ea090d7b89b88eca9a882faafb1d6acafe9e38e99edcecab5bcbec9a00808010203ad97f9b1e6d9eda6a3aa86b6f89fb7deadedb4c291fbfa9793b39bf2969b8dbecdc8e59499b6969ddb899e881307010229b6bad9e2b1ac8fe9d29fb5eda0d18998f0839e90b0d6daffb3e8d99081fcb5efe9c98089aff3919ea5b99ab80707010213a49e89d5b6ba9eded684ba9a83fe92aba0dcadadc2b198b6c7e4eaf1b8b298e1ddbbe88ef0eec3d0fdd1e7f0060601021aeda5f8d9b79bd895c7dbfec0eb8cfe8e83efdbaabc8bb0b985e9d0a2f2a09ebcebf3e7d1ebf29ed2a1decfc0060501020cf1e5a6f8bdb7, 0x1ada64cebe4800ac8f6f808b3dba102f79cf28043a99abd03f3ddd48f0286a7ffbe0008868cf98edec0ba979a85d5a29cc38385d28dd890e9efb1debd95c9e6c4a0a6be8acdfba8f807beb8dab5078f9a8ac001cefba6fa018ca188fd03bfc095da03e2dce88d5ccef3c3409ff6a80028eb8cec948da2c8ffebd6eaeda5d994f6b2c5e6bf86dcd98fa5e8cb93f6f898fa80cce2f019e99645b7ee018babb345f9860db2e322e4db46d2cc23cdf9000bb5c89eccd2d8d8c885a1998786b088e89ab5f1d1dbc58ee7e3939ff3e49d92fac9e6a4f9dc8cd03387e52397971494e50da3a24ad2ee49a1c4239cea14e2a900058dd6dcc1c5e9edc5ae91b0e3f4d4dcfe8f9cc18080d69993dcafa7a4a9af99edf19fbee5cab7901713020262efd3c6f8aef383c6fad78ad4e8ffaba697b7c5a5c388bbf0a6b2acd489ca81928a959395a8efc6b6a7f6b3ec170f020201e79ab2a8d99cbb9bc598ce8c978dcdf5ec95c6e5d59ce2dea895ccd8b2a691c3b9bc93b0a4e1cef7b3fac4c6cc110702021688f980e484d9f0d1a1fad7a8beded8a9daff86b5eec3ffbaede6d1f88ecc888a8ff9b5c0b887ee99fc9284b40907020203cacdc2e1ff85babbbbf0a494da88d8b19f84edfab792edb08edbdc8db6f6a1bf89d781d9eda497a3d3b59dc00706020209c5bbcce5e5cbdfcdc2ca87dddacf83b9ef8cf9f1858aa596ea9383daa9b982, 0x192e4dbfff09cdf88b98785d5c3bdd2c0050402020ee0a8d39b8aa9a3859c8894cf83c08013010202369cb3f8a1abeefdb183fca0ac8294d480131301020396b7bab3ddb9c1c5dafef99cd6bab0d38a1311010222b8e4d0da96848cb1c7f09deeabeda4e2170c010202cbc7f2bce6cced85d785e181a4f093fc801107010201bda6daa4e7a9ffb1859fe7d8fe838adea8170601020ed39adae0b3ca85e88d95e6d0a28eccdb80110601020db29adcd1d0b2d8f48aff87f39aada5c2d80505010209add0b2b8bc84d2f9e5ce84c5f193c8c0130101022697a2bb98dabff8abee96daefe2b6b68013130002038e9981f8cecfe78ab8fbfeece6e1c7a3f0170c00022583898d8db6b1a0fda8b7dde4a382f9901708000202a3b49886ffc6d498f7f2f6a292eba6f8d01107000201b193e78edeaf86d1a4b6eafdd9a0cff788170600020e8fabccb29ce0c7fbc1e89fb984f69fd2b0110600020eab80ead9b2b089f8e08ef3acbee9b4adf80505000226fcd1b8d4e4d494d597cb9cb790f0c01b18fdd0aae4c5909bd19ae0000b02080201120030043603120403020202031104080c010e031203100400020206030b020002020203011bb5a98006e5adc009a9f0d4089aadb302f1ecaa9e03dfd8dcc101fcd5d0f673c5ff850010b5f9ef88c9ede7b286ebced1cac8fab59cc2f79f91a9f795eda694eafd9aaec9e9e0809fe001a9, 0x104010f0006000100091313110f170c0d04060404010f000d000600091313110f170c0d04060404010f000d00060009061304020202020313131311170c0c0c07060d04060410010f0106010a13131311110f0c0c07060d04060410010f0106010a13131311110f0c0c07060d04060410010f0106010a060b02080201120030043603010d040a040904000e040e03011313110f110d170c1106110113000f000400091313110f110d170c1106110113000400081313110f110d170c11061101130007061310030202060313131311110f170c1106110507051301060105010a13131311170c1108110611050705130105010913131311110f170c11061105130107060b02080201120030043603011104080c010e031203100400020206030106dff70ceede04e35934dc8a4cd9b9048f93048f940005a6de99ccc2c19980c4f2e0800e3fd30194d8a60195e6c501b64af667cdf767cdf800268c9883fbad9daac49e8013130202038c95ee8bf4ce9f81b3ed91ef849b8fc5ee131102020190f7e6c9f7cdd5ebef98d4a8baa586fcb6170c020203caaa90f7a9a09aec83b894c5ddd9ded0801107020201b29ff2d1c7ace797cdb5e093e0a1e68cb8070702020d88d1e9a4fdcde396f8f9ba99c5a080170602020e8caca7c1ca8e93a4f5f492e0a5edeecf80110602020cccf3d3c5ece8c28ff89ccc98b7fefce8c80505020205, 0x11313110f140d110d170c140c110904010000091313110f140d110d170c140c110904010000091313110f140d110d170c140c11090401000009061313110f170c0d04080404010d0002000000091313110f170c0d04080404010d0006000200091313110f170c0d040a0408040401060002000906010e020106020204111c0d140a060906041c031313110f170c0d040604] private def node60:Certificate:=PackedParametricCertificateData.decode 17 data60 private def data82:List Nat:=[ 0x1131313110c0c0f09090908080f070606080106010a131313110c0c090908080f0709070606080106010a131313110c0c0f09090913070f070907060608010a060b020802011200300436030402030200020302030a040904050400020406030902080204020106040803131313110c0c08080f07080606061001080106010a131313110c0c08080f07080606061001080106010a131313110c0c08080f07090706061001080106010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d0409060102030603131313110f091008100709070c021001170009131313110f091008100709070c021001170009131313110f091008100709070c021001170009060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node82:Certificate:=PackedParametricCertificateData.decode 9 data82 private def data137:List Nat:=[ 0x19d98dfe3bdc1d8c099c1dacdacc01306020206b4fef69cd7e7e586f4acb19dd080060602020baeccc1c5f8a7dfb1acd7d2f798e00404020205af89aa94bdd7ff9d8da8809db7e006010202089f9cf1b3e4d783bad9d4e1c6a580131301020183f48e8fd088d8c282c8d4da9db88a1311010201aeb0d5bfd6ebe69adca5c7c8dac3c41111010206b485a9c6b0b2d2b3de86b0c5ecda1310010247a2f6e9cac1b18ada9ac3dec1bfc0100901020fcfde9cdcd0b5a2d5b29bd58eb1c0070701020b84cdcdd4b4eba6b7cdb4b690a6e01306010202b987a0b292ada1cfad88a8abb08006060102119590d9b6a5c3fad9a0e3f492ccd00404010209bac59496f592b699a38df390f49006010102068de2daafe1a5e5cbbcaafef291c013130002018393b7e8fdf5ea92d3b693dbbdce801311000201b0eca9d59ecf97f6b0af83f2c9a6801310000228fce9b6efbcd9a4fc8ec2bed7c480100f000220fceff291e9a78bc096c5dae880801009000210e6a5e1c7fbdccfb6f282d99694801307000205a5d5e6c2ff8a97f2f2beeea29080070700020beafa83cff5d994a5f19393c7fa80060600021ef192a486e186e4b6e3a0b4ca94800404000212bcc193d387dcdea0a7c1ddb5ce801e05effff1c8a5edba80000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1d0cef6a3c0131301020b8ab5b6d7cf98ed8aeeedeaa8e4131101020c9bde8ff3d8b4b6fceaf186b4c4080801020291eb9c9acdf596c88ccf90e1b01307010202dcdab791e681e0b7fcbcf7e7c0060601020387b4c495f7d4e39a84dbbde4fc0605010259a8a5abe7a9b4f699c5d69a800505010204c399fbc4cdc0e7f9cecffb94c81304010202eaa9d4a8fdb1b4909ebb8baa80070401020398dbefa7e0e5e59d81d08998c80501010213bc83a3af86e8a18c95dcbbb0131300020ba0d3a4aacaf8f9f7cecbb0bbe0131100020bf3d6bfadc1c4e9ccb2f6e7f8d0080800020299a5b5b092dcb4ba9be2a8fdc81307000203b3c9a098b0d283dacf84ace58006060002048cf6b6ccabd7aceba688edb08a05050002019b84a0cc85a68b9388c2f4b9e80f04000202f9a3d3eabcb79383c1a4e483a00804000202c8e59ea6c8d284b0d59bb98eb80404000203e2d9908fea9ce9a9d9b3c3cfda1e3cbcb49ff4d6d4000b02080201120030043603040203020002030203010103e3f60789c936c43ef504d6bf259fff4498c620d6b70001a68dc1eb97f0bba2f080131302020189deceb1b29bbbcba58bf5c0a4fcac131102020196f8bfc18bb3daae80e8e7e386abf8111102020ed2f1f9d9b7ddd188d2ffd9fa9d8c131002025081c0b397869cd7a6a8e7a3f8b580100902020a85899d92b6bc82898eacddfaa1800707020209, 0x10201010a13131311080806060805130407030202010109060b0208020112003004360301011313131113100c0c130606060d0508050c0206010a131313110c0c08081307060608051304020201010a131313110c0c08081307060608051304020201010a060b0208020112003004360304040106000203040302040006020203010b0200020202041313110f130908080d020a0213010501010102000a1313110f130908080d02090213010501010102000a1313110f130908080d02090213010501010102000a060c020b020406000604080312040302020203020400060202041313110f080813060f060d040d020501010102000a13131311110f080813060d0213010501010102000a1313110f130908080d02090213010501010102000a060c020b020206000c040e031204030202020303fad007c3e70eaf29ac0799a62c9f974090d01ee4ef000ba9b8e6daadd4fe90131302020af1e5b3818da692cbdfc4a6dcc8131102020c97a4b3bec7bb96f9afe1edd998080802020284d1e283cbd882e1c6f7e98fc81307020201f7a0dba1ddbc99fab7bebda1c006060202028596a596af88a5e08c82e587840605020205cefcb6b099bce1a9c4fabdc8a00f040202038a9dc8f0d0affa92a7e5e6d1a00704020201dba9f7c1a0a2a98ce78dd2cd980404020202f08ed5cf88b6e6f3f8e49ecec8050102021698869aacb3f6, 0x1060102010a13131311100f08071006070607050f04060102010a1313110f100f08071006070607050f04060102010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a02000202020413131311110f09070f060d02080101010c0008000a13131311110f09070f060d02080101010c0008000a13131311110f09070f060d02080101010c0008000a0613131311110f1109090707070d020c01080101010a13131311110f1109090707070d020c01080101010a13131311110f1109090707070d020c01080101010a06011313110f09070f060d0201010d000c000800091313110f09070f060d0201010d000c000800091313110f09070f060f020d0201010c00080009061313110f1309080808050d020a021301010102000a1313110f1309080808050d0209021301010102000a1313110f1309080808050d0209021301010102000a060101131313110c0c0f091307070706060202010107000a131313110c0c0f091307070706060202010107000a131313110c0c0f091307070706060202010107000a061313131111110c0c0707060602020901070101010a1313131111110c0c0707060602020901070101010a1313131111110c0c0707060602020901070101010a060113131311131013060d05080508030703020201010a1313131113100c0c060608051304070302, 0x11313110f100f0c0c0909100611011001040100000a1313110f100f0909090710060f041001040100000a1313110f100f09090907100610010401130000000a061313110f100f100d0909090710060401020000000a1313110f100f100d090710060f040401020000000a1313110f100f100d090710060f040401020000000a060113131311100f1006070607050f040804070302010a13131311100f1006070607050f040804070302010a1313110f100f1006070607050f040703060102010a060b02080201120030043603011104030202020313131311100f08071006070607050f04] private def node137:Certificate:=PackedParametricCertificateData.decode 9 data137 private def node138:Certificate:=.split node82 node137 private def node139:Certificate:=.positive 1 [(1,1),(1,7)] node138 private def node140:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node139 private def node141:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node140 private def node142:Certificate:=.positive 1 [(1,0),(2,10)] node141 private def data193:List Nat:=[ 0x10613010d01060102010a060e020b06020c00140418031204030202020313130d0d0c0c0f0908080d0606060202130101010a13130d0d0c0c0f0908080d0606060202130101010a13130d0d0c0c0f0908080d0606060202130101010a060b0208020112003004360304020302000203020301010e060812030e0206041404010d300c020a1a06200430030802000202020413130d0d0c0c13090f0907070d060606130108010a13130d0d0c0c13090f0907070d060606020208010a13130d0d0c0c0f09130707070d060606020208010a060b020802011200300436030402030200020302030c02090605040304030b02080604040108040c03131313110d0d0c0c13090f090d060606130108010a13130d0d0c0c13090f0907070d060606020208010a13130d0d0c0c0f09130707070d060606020208010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130d0d0c0c0f0910080d0809070c0210010913130d0d0c0c0f0910080d0809070c0210010913130d0d0f0910080d0809070d060c02100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203060804060018031a0305080306001a031c03, 0x113130d0d0c0c0f090909060609010801010107000a13130d0d0c0c0f090909060609010801010107000a13130d0d0c0c0f090909060609010801010107000a0612020c060106001e04200413130d0d0c0c0f0908080d0606060101080007000a13130d0d0c0c0f0908080d0606060101080007000a13130f0f0d0d0f090808060601010900080007000a06131313110f0908080d060705070313010d0101010a13130f0f0f0908080d060705070313010d0101010a13130f0f0f0908080d060705070313010d0101010a06010110040a0c0104000e0412040f020906011200020414040e0608120214000e042204131313110f0908080d06070313010d01050101010a13130f0f0f0908080d06070313010d01050101010a13130f0f0f0908080d06070313010d01050101010a060e020b06040c0008040c031204030202020310040a0c0104000e04120413130f0f0c0c0f090c0813010d010601020102000a13130f0f0d0d0f090c08060613010d01060102010a13130f0f0f090c08080806] private def node193:Certificate:=PackedParametricCertificateData.decode 13 data193 private def data246:List Nat:=[ 0x10f130a0f0a13090c090d060606070401010c000a0f0f130a13090c090d06060607040d0101010c000a060a020106001203140304020302000203020301010806070603080206040e04010d1c091406060506041c03080200020202040f0f130b0c0b130a0f090b020d000c00060002000a0f0f130b0c0b130a0f090b020d000c00060002000a0f0f130b110b130a0f090b020d000c00060002000a060a0202060006030803120403020202030f0f130a0f0a0c090d06060607040f020c0008000a0f0f130a0f0a0c090c070d06060607040f0208000a0f0f130b130a0f0a0c070d06060607040f0208000a060a020106001203140304020302000203020301070204020202030f0f130b130a0f0a0c090d0606060f020c0008000a0f0f130a0f0a0c090d06060604040f020c0008000a0f0f130b130a0f0a0c070d06060604040f0208000a060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306030f0f0f0a13090f0909070d06170110010d01090f0f0f0a13090f0909070d06170110010d01090f0f0f0a13090f0909070d06170110010d0109060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203060804060018031a03, 0x10f0f130b0c0b130a070706060f0101010b0008000a0f0f130b0c0b130a0907070701010b000a0008000a0f0f130b0c0b130a090707070f0101010b0008000a060c020b0201060018041a040f0f130b0c0b130a07070b020d010601010108000a0f0f130b0c0b130a07070b020d010601010108000a0f0f130b0c0b130a07070b020d010601010108000a060f0f130a1308080707070703080201010d000c000a0f0f130a13091308070707050703080201010c000a0f0f130a1308070707050703080201010d000c000a0601010a0209020102000404060409020802010c0002040e0408060706020e00080416040f0f130a1308080707070703080201010d000c000a0f0f130a0f09130808040703080201010c0001000a0f0f130a0f09130808070703080201010c0001000a060a020406020203120403020202030a020902010200040406040f0f130b0c0b130a0f090b020d000c00060002000a0f0f130b0c0b130a0f090b020d000c00060002000a0f0f130b110b130a0f090b020d000c00060002000a060a0202060006030803120403020202030f0f130a0f0a13090c090d060606070401010c000a0f] private def node246:Certificate:=PackedParametricCertificateData.decode 12 data246 private def data297:List Nat:=[ 0x1020a02080101010a0008060f0f130a0c0a0707170601010d000c00080006000a0f0f130a0c0a0707170601010c000800060001000a0f0f130a110a070717060a020c000800060001000a0601121006020206030804010400020306040f0f130a0f0a17060c0306030d000c00060002000a0f0f130a0f0a17060c0306030d000c00060002000a0f0f130a0f0a17060c0306030d000c00060002000a06160409040212000c0412031204040201060304030f0f130a0f0a0c090d06060607040f020c0008000a0f0f130a0f0a0c090c070d06060607040f0208000a0f0f130a0f0a0c070d06060607040f02010108000a060602010e002003240304020302000203020301010f0f130a0f0a0c090d06060604040f020c0008000a0f0f130a0f0a0c090d06060604040f020c0008000a0f0f130a0f0a13090c070d0606060404010108000a060602010e002003240304020302000203020314040704010603060310040002020603010e0402020206030d04090601020306030f0f0f0a13090f0909070d06170110010d01090f0f0f0a13090f0909070d06170110010d01090f0f0f0a13090f0909070d06170110010d01090616040804011e0048045203040203020002030203140407040106030603100400020206031204050402060306030e0402020206030d040906010203060301010d04060c00160312030a100402020603, 0x10f0f130a1706140608041702080201010800090f0f130a1706140608041702080201010800090f0f130a170614060804170208020101080009060a02010600120314040f0f130a1308080417020802060101010800090f0f130a1308080417020802060101010800090f0f130a130811081702080206010101080009060a0204060202040108040104000203060407020106000203080408060706020e00080416040f0f130a1308080417020802060101010800090f0f130a1308080417020802060101010800090f0f130a130811081702080206010101080009060f0f130a0f0a130807070704080201010c000b000a0f0f130a0f0a130807070802070201010c000b000a0f0f130a0f0a130807070802070201010c000b000a06011204030202020308040104000203060407020402020204060603020206030804010d1c091406060506041c03080200020202040f0f130a0a0417020a020801060101010a00090f0f130a0a0717020a020801060101010a00090f0f130a110a17] private def node297:Certificate:=PackedParametricCertificateData.decode 12 data297 private def node298:Certificate:=.split node246 node297 private def node299:Certificate:=.split node193 node298 private def node300:Certificate:=.split node142 node299 private def node301:Certificate:=.positive 3 [(1,0),(2,6)] node300 private def data353:List Nat:=[ 0x10c020b020206000c040e0312040302020203131313110d0d080813060606040413010f0105010a131313110d0d080813060606040413010f0105010a131313110d0d080813060606040413010f0105010a060b0208020112003004360304020302000203020301010e060a060302030204010d040c060902080604040308020002020204131313110c0c08080907130606060f02080106010a131313110c0c0909080809070606080106010f000a131313110c0c0909080813070907060608010f000a060b020802011200300436030402030200020302030a040904050400020406030902080204020106040803131313110c0c08081306080606060f02080106010a131313110c0c08081306080606060f02080106010a131313110c0c0808130708060606080106010f000a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d0409060102030603131313110c0c130910070f0709071101100109131313110c0c1309100810070f070907100109131313110c0c1309100810070f070907100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301010702010202020306020202000203040305020102000403060304040212001c031603, 0x11313131109090907080713060d020801010108000a1313131109090907080713060d020801010108000a1313131109090907080713060d020801010108000a0612020e020002030204131313110907080713060d0201010d000c0008000a131313110907080713060d0201010d000c0008000a131313110909090708070d040d0201010c0008000a06131313111309080808050d020a021301010102000a1313131113090808080507050d020902130101010a1313131113090808080507050d020902130101010a06010110040c0400020302040f020b0201020302040b02000202020413131311130908080d020a0213010501010102000a131313111309080807030d0209021301050101010a131313111309080807030d0209021301050101010a060e020c060406000a040c031204030202020310040c04000203020413131311080813060d040d0213010501010102000a1313131108080d0713060d0213010501010102000a13131311130908080d040d0213010501010102000a06] private def node353:Certificate:=PackedParametricCertificateData.decode 14 data353 private def data407:List Nat:=[ 0x10d0c0c130908080d0606060202130101010a060b0208020112003004360304020302000203020301010e060812030e0206041404010d300c020a1a06200430030802000202020413130f0f13090d080808080613010601020102000a13130f0f13090d080808080613010601020102000a13130f0f13090d080808080613010601020102000a0612020b06020c00120416031204030202020313130d0d0c0c130907070d0606060202130108010a13130d0d0c0c1309130707070d060606020208010a13130d0d0c0c13090808130707070d06060608010a060b02080201120030043603040203020002030203010f02080604040106040a0313130d0d0c0c130908080d0608060606130108010a13130d0d0c0c13090d08080813070d06060608010a13130d0d0c0c13090d08080813070d06060608010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130d0d0c0c1309100810070f07090709000913130d0d0c0c1309100810070f07090709000913130d0d0c0c1309100810070f070907090009060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203080206020008030803070205020008030803, 0x113130d0d0c0c13090909080813070606080101010a13130d0d0c0c13090909080813070606080101010a13130d0d0c0c13090909080813070606080101010a0612020c060106001e04200413130d0d0c0c1309080806060d0101010c0008000a13130d0d0c0c1309080806060d010101090008000a13130d0d0c0c1309080806060d010101090008000a0613130d0d0c0c130908080d06080513010d0101010a131313110d0d130908080d0608050705130101010a131313110d0d130908080d0608050705130101010a06010110040a0c0104000e0412040f020906011200020414040e0608120214000e04220413130d0d0c0c130908080d0613010d01050101010a131313110d0d130908080d0602021301050101010a13130d0d130908080d06070302021301050101010a0612020b06040c0006040a031204030202020310040a0c0104000e04120413130f0f0d0d13090c08070313010d01060102000a0f0f0d0d13090c08070313010d010601130002000a0f0f0d0d13090c0807030d0106011300060002000a0612020b06020c00120416031204030202020313130d0d0c0c130908080d0606060202130101010a13130d0d0c0c130908080d0606060202130101010a13130d] private def node407:Certificate:=PackedParametricCertificateData.decode 13 data407 private def data457:List Nat:=[ 0x10a06030b020d000c00060002000a0f0f130b110b130a06030b020d000c00060002000a060a0202060006030803120403020202030c0209060504030404010806070603080206040e04010d1c091406060506041c03080200020202040f0f130b0c0b130a06030b020d000c00060002000a0f0f130b110b130a06030b020d000c00060002000a0f0f130b110b130a06030b020d000c00060002000a060a0202060006030803120403020202030f0f0f0d13090c090d06060604040202080113000a0f0f0f0d13090c090d060606070404040c0108000a0f0f0f0d13090c090c070d06060607040f0108000a060a020106001203140304020302000203020301070204020202030f0f0f0d13090c0908070d0606060c01080106010a0f0f0f0d13090c090d0606060d010c01080106010a0f0f0f0d13090c090d06060604040f010d0108000a060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306030f0f0f0d0d0d13090f081007090710010d01090f0f0f0d0d0d13090f081007090710010d01090f0f0f0d0d0d13090f081007090710010d0109060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203080206020008030803, 0x10f0f0f0d0c0b130a090707070b0201010b0008000a0f0f0f0d0c0b130a09070b0201010b000a0008000a0f0f0f0d0c0b130a09070b0201010b000a0008000a060c020b0201060018041a040f0f0f0d0c0b130a090707070b020601010108000a0f0f0f0d0c0b130a09070b020d010601010108000a0f0f0f0d0c0b130a09070b020d010601010108000a060f0f130a1308080707070703080201010d000c000a0f0f130a13091308070707050703080201010c000a0f0f130a1308070707050703080201010d000c000a0601010a0209020102000404060409020802010c0002040e0408060706020e00080416040f0f130a1308080707070703080201010d000c000a0f0f130a1309130808040703080201010c0001000a0f0f130a1309130808070703080201010c0001000a060a020406020203120403020202030a020902010200040406040f0f130b110b130a06030b020d000c00060002000a0f0f130b110b13] private def node457:Certificate:=PackedParametricCertificateData.decode 12 data457 private def data508:List Nat:=[ 0x1020801010108060f0d130a0c0a07070f060a0201010c00080006000a0f0d0f0c130a110a07070a0201010c00080006000a0f0d0f0c130a110a07070f060a020101080006000a0601121006020206030804010400020306040f0d130a110a0f0606030a020d000c00060002000a0f0d130a110a0f0606030a020d000c00060002000a0f0d130a110a0f0606030a020d000c00060002000a060e020906021800100418031204040201060304030f0f0f0d13090c090d06060604040202080113000a0f0f0f0d13090c090d06060604040c01080108000a0f0f0f0d13090d060606070404040f01010108000a060e020806012a006404720304020302000203020301010f0f0f0d13090c090b0708070d0606060c0108010a0f0f0f0d13090c090d0606060d010c01080106010a0f0f0f0d130907070d0606060f010d01080108000a060e020806012a00640472030402030200020302030c020706010803080310040002020603010e0402020206030d04090601020306030f0f0f0d0d0d13090f081007090710010d01090f0f0f0d0d0d13090f081007090710010d01090f0f0f0d0d0d13090f081007090710010d0109060e020806012a00640472030402030200020302030c0207060108030803100400020206030a02050602080308030e0402020206030d0409060102030603010107100506001a0318030a040302020203, 0x10f0f0f0d130a110a14060f020a0201010800090f0d0f0c130a110a14060f020a0201010800090f0d0f0c130a110a0a0714060a020101080009060a02010600120314040f0f0f0d130a110a0a020802060101010800090f0d130a110a130808020d01060101010800090f0d130a110a130808020d0106010101080009060a0204060202040108040104000203060407020106000203080408060706020e00080416040f0f0f0d130a110a0a020802060101010800090f0d130a110a130808020d01060101010800090f0d130a110a130808020d0106010101080009060f0f0f0d130a08070707080201010d000c000b000a0f0f0f0d130a130807070804080201010b0001000a0f0f0f0d130a130808070707080201010b0001000a06011204030202020308040104000203060407020402020204060603020206030804010d1c091406060506041c03080200020202040f0d0f0c130a110a0f020a020c0108010101090f0d0f0c130a110a0f020a020c0108010101090f0d0f0c130a110a0f020a] private def node508:Certificate:=PackedParametricCertificateData.decode 12 data508 private def node509:Certificate:=.split node457 node508 private def node510:Certificate:=.split node407 node509 private def node511:Certificate:=.split node353 node510 private def data561:List Nat:=[ 0x10c0a0f020a02080101010f0008060f0c130a0c0a110907070a0201010c00080006000a0f0c130a0c0a110907070a0201010c00080006000a0f0c130a0c0a110907070a0201010c00080006000a0601120403020202030804010400020306040f0c130a0c0a0f0806030a020d000c00060002000a0f0c130a0c0a0f0806030a020d000c00060002000a0f0c130a0c0a0f0806030a020d000c00060002000a060e020906021800100418031204040201060304030f0d0f0c13090c090c070d06060607040c0008000a0f0d0f0c13090c090c070d06060607040b0008000a0f0d0f0c13090c090f080c07060607040b0008000a060e020806012a006404720304020302000203020301010f0d0f0c13090c0908070d060606080106010c000a0f0d0f0c13090c090c070d0606060d01080108000a0f0d0f0c13090c090f080c070d0606060b0008000a060e020806012a00640472030402030200020302030c020706010803080310040002020603010e0402020206030d04090601020306030f0c13090c090f0709070d060c0610010d01090f0c13090c090f0709070d060c0610010d01090f0c13090c090f0709070d060c0610010d0109060e020806012a00640472030402030200020302030c0207060108030803100400020206030a02050602080308030e0402020206030d0409060102030603010107100506001a031803, 0x1130f0f0c130a0c0a14060a0201010f000800090f0c130a0c0a14060f020a0201010f000800090f0c130a0c0a14060f020a0201010f00080009060a02010600120314040f0c130a110a0c0808021301060101010800090f0c130a110a0c0808021301060101010800090f0c130a110a0c080802130106010101080009060a0204060202040108040104000203060407020106000203080408060706020e00080416040f0c130a110a0c0808021301060101010800090f0c130a110a0c0808021301060101010800090f0c130a110a0c080802130106010101080009060f0c13090c0913080c080802070201010c000b000a0f0c13090c0913080c080802070201010c000b000a0f0c13090c0913080c080802070201010c000b000a06011204030202020308040104000203060407020402020204060603020206030804010d1c091406060506041c03080200020202040f0c130a0c0a0f020a020c01080101010f00090f0c130a0c0a0f020a020c01080101010f00090f0c130a] private def node561:Certificate:=PackedParametricCertificateData.decode 11 data561 private def data610:List Nat:=[ 0x10108010101081513150c0f0815020801010106060f0d150c0f0c1309110909070c000800060001000a0f0d150c0f0c130909090f0809070800060001000a0f0d150c0f0c130909090f0809070800060001000a060112100602020603080401040002030604130f150c0f0c13090c0306030d000c00060002000a130f150c0f0c13090c0306030d000c00060002000a130f150c0f0c13090c03060303020d00060002000a060e020806022a0010041e031204040201060304030f0d0f0c13090c090c070d06060607040c0008000a0f0d0f0c13090c090d06060607040c000a0008000a0f0d0f0c13090c090c070d06060607040a0008000a060e020806012a006404720304020302000203020301010f0d0f0c13090c0908070d060606080106010c000a0f0d0f0c13090c090d0606060d01080106010c000a0f0d0f0c13090c090f080c0706060a01080108000a060e020806012a00640472030402030200020302030402010402020310040002020603010e0402020206030d04090601020306030f0c13090c090f0709070d060c0610010d01090f0c13090c090f0709070d060c0610010d01090f0c13090c090f0709070d060c0610010d0109060e020806012a00640472030402030200020302031204010202020310040002020603100402020202030e0402020206030d040906010203060301010b300902070a031003, 0x10f0a13080c08140608020f0101010f000800090f0a13080c08140608020f01010108000813080c08140608020f010101080007060b020902010c00240428040f0b0f0a13080c0808020c01060101010800090f0a13080c0808020c010601010108000813080c0808020c01060101010800070612020906041601020408040108040104000203060408020602010c000404100408060706020e00080416040f0b0f0a13080c0808020c01060101010800090f0a13080c0808020c010601010108000813080c0808020c010601010108000706120209060706030204120403020202030804010400020306040f02060604060002040804060603020206030804010d1c091406060506041c0308020002020204150c0f0b0f0a0f08150213010c010801010109150c0f0a0f08150213010c] private def node610:Certificate:=PackedParametricCertificateData.decode 11 data610 private def node611:Certificate:=.split node561 node610 private def node612:Certificate:=.negative 1 [(3,2),(1,7)] node611 private def node613:Certificate:=.negative 2 [(1,0),(3,1),(2,6)] node612 private def node614:Certificate:=.negative 2 [(5,0),(1,2),(1,5)] node613 private def node615:Certificate:=.split node511 node614 private def node616:Certificate:=.split node301 node615 private def node617:Certificate:=.split node60 node616 private def node618:Certificate:=.positive 3 [(1,1),(8,4)] node617 private def node619:Certificate:=.positive 3 [(1,0),(2,3)] node618 private def data680:List Nat:=[ 0x1c0ac0606010207eea6ac8fbec9afefabe3eacdd7d882a7c01301010204d1a1d695cacae4f8e7d6e2a995a2cce4861101010274b9d6b2e7b3eac9f6cdf3cbe1d8fcf5e213130002329ef19ef6c7cfabc0ddc2878daaa2d5d3e01008000201fbc5a6cce4b88dc58583ccb78b848695981307000262d9bebfe6949e87b28bc6ea9c9aa3e686e61107000201ffc5f3ced4d8d6acb2dd8eb6ddadf7bc95f20807000206c392bad8aac9f6e6b8abdcd4f8a4bba9e8130600020ec3d0b0ae9aedb3b1e1ec8dfb8c8da0ecba110600024dd89ff2afacf0d5a9ffb8e1f7cff1e8d7ee1301000204a8d8aac9e083fd9da2cccf9ff498fbe9e01e01dccba8c5f6ae859be6cdc0000b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030c060a1200080308030113130f0f11080908130711070907130111010913130f0f13081108090813071107130111010913130f0f130811080908130711071301110109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d100c120a360120043003080200020202030107020102020203060804060018031a030502010200040306030606040200080308030708020400060306030604000202060302060002020203, 0x19dc4fa8ce4c28397958695b8000b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301099db30cdd8a7d9321b216be8c5aa6ab04f7be0296b90034ae83a8b2dbaac2d6f5fcbb8807b1dc0ab89670a1d237bfb1059ff70994c56cf2f535fa920001b589c5b6aff89fe096f1dfa01313020235d1fae4aaf0b2e4dfa1ecc69a9ef8a79e801008020201fcd1debad3a6989cf2edb3e49fc9ebc6b8130702026494aacbf3d9aff5c0fcbdcf92b9c6a78fc01107020201fad4cedfb2b6f3bfad8dd786f4d292feb9a00807020205ffc982c6dae1ac9aa9f0d5f4ccf3b59ef81106020253eee0b39cd0a5fda9e7c2d6b5979eabdf900606020207cf8aabe9c2e68be9d9a7f295f5d68cbef81301020202c09ff68da4bec0e387f1e99fa5ed84dca41101020201cca9a3c89de9b591aeaaa3b6ec99e0afcc1300020202b2a5baa4ce96eacdcef4de9acbd9a49b901313010234cdf0dbe5bbb7c4969ba7cf83bd96bf95c01008010201fce7b9fcd09aba9c8596f082f89b9681b81307010262dd92e6b589e089aba8e6d889cb8595b8e01107010201fabf97c5c889b6d08f8fa893a2f7f3b39a800807010206878ac0bbcffbef8ee0acafc2958febb9e01306010203f6dacfbfb98df3e0db8cdd94d3849087f4110601024a879ee1e8b0eff0d392f6e6ecc592a4, 0x1d99786e5b894ba9584e7a092df85f8a6e2a7e5a01310010201c6f690e486a9ece9ae97d3ffaab3cee0f7ecb1d5cda48ee799980808010241d5bae2a4a0a4e0f5faefdfe18ca0808ae1b5f8f790efebe8cc070701022fc0ef9d96e3b9c3d7e391d4ccc390fbae9fc7c3cef8e3b981d40606010201b9dbcef89f92a6e1db81adbc95ce92d089d1aaa29be6988791c0060501027dc2e6c2f2c2f68fe4ecf2d1fa9b88b0d38885c7efd2cca8abd40505010234e9a5e2a9facddcc4f8f99f9e94ee8fd7c6d0f7e1f4a7cd84841304010240c7a987d281beb5e0b4c8f6f694fdf2dd9dd6d79cc0a7afe4901302010270feefc489b580e0da88a0a8a3b591d3fbe0e788fcc9cff7f7d01313000255b28482f1f683dcfea8cca1cb9cd69a81edd598acd6fbd0fbf0101000020d85f19497f2a0e4f7efae9e918283de9197cab5e8b48d9ed6b8130c000259ad9a94c6f29ed7b799d983dfae8db68ec8a6f1bbb496c3c9d01309000201fdcfebd2f9baefc6cab1b9ebcae8f28a8a91d6bbf5eea6a7b01008000204b583b9cbdbaaa695eab5feceb89cadf9b9d9dbddc4c3b2fbf00808000203a78caf84b3f3caced8c6ace7a78cd28d90dcc29cc19893db981307000245e0e18ab7c9e8b1cfe196bfdee4e5a7a9c0f7f1b5b0b59c87b00606000248b6d0b7e4c0a6ffdaf78fb387bcf0a6998fd89ff3afebc682bc1e01b1cec1b6ddeba48e, 0x1d01b018cfe96aee5f99ada8e8ea6a5a1e0cab8000b02080201120030043603120403020202031104080c010e031203100400020206030b0200020202030102a5cc0193fc2b8d4aa92dff943ec49921ee8c0fcf91003cb8ace3b8f3939c8c8297f5d6a491b0b0a092a6b8ec03c9e10cffa030ab4f8331db940ce4ef3efed92190ca001ebfa0d8acbcc2b6c68491a1d2c68596e6aecbe2b8d032b9a32ebfcf018da48c47ccc51ac5a81795b44798bb248cc2004be5cc908a8dc7c9d59095edf8a9b885b8e8b3df801111020201c48dedd1afb89cbde4bbedecf1cf9eaeadecb5f19c85cb869cea1310020201f997a7d5a6afcfdee0e3ccf9d7f1c78482f7f1b8ae80a8ac80a6130d020230f1aaaef2c18791888ce0cd92d5de8998fc82ee969fd6b1ddce090902020ffdb4f9aa9f87b9f8cd8895c4b097a7a199dcd6d5c581f3f7f0090702020ae9b3ee96e3d3b6c6aaed81e1b59cc0f1d2e3dd9edbc7cb90e80f0602020184ae99b3fc9591bfc095c691f5dcdaad86d7ae909dfaafcbcec406060202659dadedbfb3eccbaae7a08ceaeab3d1b5e6b3bb9c929bccd4981302020202ad9bdc87a2c7acdeeabda8e38df281d5f3f2d3de97bba2cf8fec060102020198ddd09aa7c9ae9bf59a989fb4b9d0a2aca7b9bac2d7dacebc0101020264b5a4d998c9f9d2a2f78197e5a9f791bffaa59aa684d3ede4131301026ddca1caa6e9, 0x1feebbdcbc0cca00707020249dae18a8292ab99ae9cb283e5c1cfcb8eb393e080130602022291d9e8c9df99a99ac380e2bdc2c3e788c5f2c7b3ff92110602024fa8d7d8abaecad08af784aea7edb9b7ae93bbb5d0b5de050502022998a4b78ab2b9bdbff1f98596befad68492ece19ec0050402021897ecc9b290dff2f4bbc5fda0dcdfd6d8c5e4c58013130102188c85d2b99f89f2c5abf9b2e3f4a2f1ccb3eacab990c8131001020f88c6a6ecc3d982e0afacb4b0a8fc87ccf888c693a3b8110f010203b3abddb9c1f58380d1f2dcade5e2a6dec7aca1a9dab8120701021cbdb8bd8eed85f79d9ff6acdadaacf2e684b0a3d69fb81107010205a09cddb19abf85b5ceb1ddcae2e99cf295b39cb8ec9013060102248bd9bee2ba81f6bdd989b9f1c1a8e0c9ba93d0bfd0821106010253fde8cff0d5a5c3f6bfdfe38ae7f2bd9fe29ec1cfc1ae0505010249b39cf5c681e782f1cbb692a990b1a0febfeee786901313000212f3ecebc9ab96accceb9ff09e8e988fb1e9bea1b7b0b0131000020fbca9d3e7c6b49bb3d99bffd0ce90d78a9d8e85ffd88012070002349babafd1c2baded3a4879ea1c1ac97d7d5bdbee5e0a01306000226f7ffbdf6a2a2b4ab83a68b9a8de9a883908c98a4edcc1106000259b9c2dfabdfd0eae7a3d7cae0dcc4afd198aff7fcec8405050002049eaff99ebdc8e099cbd59cdde3ba9cf9f0d2f1a2, 0x104010600091313110f110d130c110608041301040106000906130402020202031313110f130c0807130607060d040604100106010a1313110f130c0807130607060d040604100106010a1313110f130c0807130607060d040604100106010a060b02080201120030043603010d040a040904000e040e03011313110f110d130c13061106110110000400091313110f110d130c1106130111010400081313110f110d130c1306110611010706131003020206031313110f130c11081306110611050705060105010a1313110f130c110813061106110507050501091313110f130c110713061106110507060b02080201120030043603011104080c010e031203100400020206030102a9ef0adba404c55131ae964ccbf103f3b703f3b8000d8dc3c884ddf6dee0ddaceca1e8e0e8ae9039e6bf57ea0eb8058b5ff5d82cf5860785940785930004fe8ae684cef3ba9fd48af1fbb9ebf0e4a02fe566df0194d7b80195ecb131f069c667b88d67b88e0002a5d1c884d39bd4b4caa085fd9d94bd801313020219e9b9f1f48dd9f4bbb6d182bd9edaa0cfe0bbd4d19ac8131002021087a1ceea94dddfdca1888acd9582ffbfe88eeffeb288110f020205cf99cee0cfbeebc5c6c5cfa6cbb6c9a5d6e8f2bd96b81207020209edeaa4d4d5b1c3d18582a9ba87a3c3bbd4bdceb89dd811070202098ee49ae5ddecb0f0e1afc5bc8784a8, 0x11313110f140d110d130c1109110104010000091313110f140d110d130c1108110104010000091313110f140d110d130c110811010401000009061313110f110d130c0d040804040102000000091313110f110d130c08041302110104010200091313110f110d130c080413021101040102000906010e020106020204111c0d140a060906041c031313110f110d130c11060804130104010600091313110f110d130c110608041301] private def node680:Certificate:=PackedParametricCertificateData.decode 17 data680 private def data697:List Nat:=[ 0x113131111110f130c0c0c08080f070806060608010a13131111110f130c0c0c08080f070806060608010a13131111110f130c0c0c08080f070806060608010a060b020802011200300436030402030200020302031104080c010e031203100400020206030e060a0603020302030e0402020206030d04090601020306031313110f0c0c0f0910081307100709071001091313110f0c0c0f0910081307100709071001091313110f0c0c0f091008130710070907100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node697:Certificate:=PackedParametricCertificateData.decode 9 data697 private def data744:List Nat:=[ 0x1f3fc8cb9b598e3afd0130c01020ea4f9d799f19298b9c399e18f828cfaaa9bc7c290fdb68e85bba80808010205a7928db6efb38c9da6d5e096f3b58b828fcfd4a5e8ccbdb8c4900907010204dceab0f48d94bddfbec1e4cae7b7b3bf8afaa5eab6eec6ae85b0070701020887a5e6938d93dea0b3b6ded19baf94dea7b4acb2c2a8afa9cdd00f0601024aa5cbb4c3c6f0d1dccab9aacfc8fc9fea9584abd597a1d2d5ebf00606010244cac6bae79dbda7eee9cbac8a8ccc86daeda9a7ce8bd297d293c00601010206a0b7ded3debcf0f6fcd1c79db1c3cfefc8c29dc2a3aad5a8df80131300022a9ed3b4a28bbb94cf88a9cec2bae1d997bf8fdfd2848aa7e6b8a0100f00027f82d4879bceaf97bef3efd2aeb9b0d8adb3cef4f7c5ca88e9f3800808000209cdaac5aafabdc6fdc9f2bff6c9bad4f79efbfbe1fc968d999dc01006000222c4cea18abb92ea92cbb5fedec186b2c2cda8e7e987f7deb2a4c00f06000236d6ebc5fbe58ac998a0efc0868ec3b2b7fdcdaff7b3ff9eeef2c0060600022be0b0e2bcee8ab7d285e2aec6d7aa94bed489879ceca9edacb8c00404000202a2f4a49af09e91d8eea0e2e297c7feaf99f4d0a7ece591caa7e01e2d93e18f9afec7c580c9e8918bdcabe6c9d6cdfae0000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x10ed585d9cfe6b7f09cb5fac39e9eb9e990f29597cbf98002a5a403b38205a38002e7db30fcd008f39b40c5f521d5bc0007e1b5d186a9fb94f8a09ca1a2be809cf7bcc8d5f8be802183ed23ce930df3c3148cdc429ba64991bc17ebf027fb890002cc80f6f082a8bbaae585d293ba8482bad7d7bda8e01111020227abf4f0d5e4bdc9eeb1f6f9e6aeadc7b8a1a891c5f08ddca2e4d4110f02027f96b4c88d9fa7d2e7ceddb4b1e4928e97fddca49ce5bc88caeeaa100f020263e6c7e1acaeb8f48d80cba4d7bf9fdad9b99ad6d484ab9dc4e0f0130c02022aceb4abe783becbc9aadde5c1efbb8b8485c0f4b6f6b3d2f1bfba0808020206a1ace597abd0a1dc87a7d5fca982e9f1a9a7d18584c6cceba1b00907020204db8bcae5e5c6c5c6eccbf9f4fc9c8fdddfb4c3b2e4f1f3fb96d80f06020247899598b791c7a6a184ef9acfa1c291c7e7838186dbce96eeeda4060602022898aab297eefba7bd90d7e8f3d083ffa6e4dab4ee9482c5a398d41302020202e3d8a58bb98ad89df3ddfb8ebab5a6d7b0fcf88fcd92d38ba5dc0601020213c3bbbcacbeeffa93a0bf929fd4fbe5abc3c0a5f0dbb7bbade2f4131301021d8199e0f1b78af8d9c481a3d3f5ede792deae8fb6adbd87aa8b80110f010248afb583e3b1988df1f09ee1b68ef6ebedd7e6a59af68782b3f4d8100f010268c7cbd9be82e1dff09ed2d8a589a79ca4b7, 0x101022591a7cbe880fb8b819af8b39595c8b8b3cf940f080102028de489e182b88ed186d6c292a3f0e8aee19c0808010201d7dfb58edaace6dab4bab1d9c6dfe5dcc4d80f07010208e9e9f8f3e7b0e488e4d4ab92ffaef9b4e5900505010202d4fef3d98af8e695f5f58adce09ed68dfda00f04010223d2bb97f8f0f4aeffb893a5b1d2f7e5e696e60804010207fff5b6f9def1ff909498e29efca4ecb3c2d00704010202999bf5b7eb80f9f0ebf7ccef93a2c886e9ec040401020db0b79e8b86ebb291acaefd9fceb4e0abfe980501010202e7ee828aa3c592c39bf4bdcebde0f1a2d0980f0f000226f5cff0dbed83b2fac090bfd2a0a690e5ece80f080002018980948cdba1c4abe7d3a5818af187d5e3f00808000201c59585e7e19ab4caded1bcfcb988e29aeeb80f0700020bce959ce8becef4dd81dbb4fd8b82f5fde6c0050500020cb0aef5cda1dbe3efdc8586e696e4c5c6b2800f04000226e2c8e3ef968ac5adbcc5a09eccbea49edff80804000205d9d99ee98490e5d1dcdfc7dba69692b8b6a80704000205c5b7f1e8fcaea5cbd7d0f383d2878bbbf4a0040400020f8dd2c9d689efbd94e1cee3f6e8b6bec4a3921e0285ddffb1c7a59ed38c96cdf8000b0208020112003004360304020302000203020310040c0400020302030f020b0201020302030281f1249b0582f002c39d2f92c23d88d321b1dc0fb39f00, 0x1c9b4b7adb1fdff94cbb2eef80f0f0002499bf6c1e3add2dfe29183be9bc80f070002089bc198d38cfcd0c2a2f08ad3b9c806060002058b88d9b9a09bd2c5ccc9d8e7a49c0905000202c9d0e1d3a2adc4e381f4a28d9d80080500020f9ed5c7c0e0f5b2e0ac87fb81eb880404000201ebf1bcdcafdfedcdb5b5fcd1a8f80202000256aedab69df08df498ab91b0b49a0101000235e1ef9fdc809b8c82cbdfeef498130000025ac8dcd7d7f5edd3a5f8b5a0d5f81e37bbecb380a0e6ce000b0208020112003004360304040106000203040310040c040002030203010b02000202020470fe0488bd0392a201d5f11fe6c439c3d52f8ac815a2d900549be2dbb3b6d9fa8df5cab5bde60790f00c879f0898dc01e98732ee8012f7f33899c321eabe00108cdbbbf7d4d7ecf0cfa58b8ee01313020206b6afdc808ff6d88cb887e8d5f0c6c5e581d80f0f02021ca8e7e9f5fcd5839082b8afd4eabdf0f195b20f07020210b9d79bc9f1a1d5fee398819ca5c5ace9cea805050202059a879dfedbd9c1b48fa3bdb3ed84db82f6c80f040202118c8bfebceaa5c383d7cef1fbb6f78493ae90080402020c808ebadaf6c3f0ae89f793a7a5989e9dab900404020209b2b2ecfdc5888adee3f6e384c1a8df9fbf881301020203a0e2c1b787c6cab1d1fb8895ebe5fbc3d7e00501020201e1caeec3b493f6f3d2e0a4b0a0cac181ad900f0f, 0x10f0c0c0f07060613020202070101010a13131111110f0c0c0f07060613020202070101010a06011313110f0f0606060505080305031302020201010a1313110f0f0606060505070304031302020201010a1313110f0f0606060805050507031302020201010a060b02080201120030043603010102c0aa7ded02d6de01d0af298b823fb6a322d2e60fddaf0009f8f2accce5cdfef2d01313020206c4e2dfa0e8c6f4b088bdee96c3980f0f020203ad949e8695efbc849c94ce838af80f070202048fddf3fcf9b59fbaafa9aca390e80606020205ebaf9bb3b7f9bfd6edf1f4c2b6c80805020210e8f8e1e3e6fbb387ddb5e4ebd4c00f04020205d6a7e19b93d095d6afafaed2b5c80404020233dfa9c9f3f1deecb7c8d3fffcd00302020201a895a3e1c0e1d4c28ad4becb99c402020202019888b2ff9dffec8fcf81d9d5c2f21313010209d98782dd8fd9a0a592f0ab9ccfa00f0f010242b187e5d28af3d4d1cab2c992900f07010207edcee8808ffbf7d3b0edda9dd7d00606010206d4ae81cd90a4bb86c9d2d0de9fa4080501020bb2f98bbaf9c9dcfeecccdceef2900705010205eae285b3b9d49ba3e3c6fec2e7b00202010268b0edf2f3ed9799cc92e1cfd2da030101020fd7999683d7a1a5cbe99e84daa8010101020ef082e8f8d3fbc58dceb2d4f398130001026a9cbee2d6eaf9ecaab3bba882a01313000209eedb, 0x1100613020401020000000a1313110f100d130c0907100613020401020000000a06011313110f100f10060706070507031302060102010a1313110f100f130c1006070607050703130202010a1313110f100f10060706070507031302060102010a060b0208020112003004360301110403020202031313110f100f08071006070607051302060102010a1313110f130c08071006070607051302060102010a1313110f130c08071006070607051302060102010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a0200020202041313110f09070f060d0201010d000c000800091313110f09070f060d0201010d000c000800091313110f09070f060f020d0201010c00080009061313110f110909070f060f020d020c01080101010a1313110f110909070f060f020d020c01080101010a1313110f1109090707070f060d020902080101010a06011313110f08080f0608050c020a020902010102000a1313110f0f06080507050d020c020902010102000a1313110f0f06080507050d020c020902010102000a0612020e0200020302030113131111110f0c0c0f0906060c020202010107000a13131111110f0c0c0f0906060c020202010107000a13131111110f0c0c0f090f0702020101070000000a0613131111110f0c0c0f06060613020202070101010a1313111111, 0x11313110f100d130c0909100613021001040100000a1313110f100d130c0909100613021001040100000a1313110f100d130c0909100613021001040100000a061313110f100d130c0909090710060401020000000a1313110f100d130c0907] private def node744:Certificate:=PackedParametricCertificateData.decode 9 data744 private def node745:Certificate:=.split node697 node744 private def node746:Certificate:=.positive 1 [(1,1),(1,7)] node745 private def node747:Certificate:=.positive 13 [(12,0),(3,4),(4,6)] node746 private def node748:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node747 private def node749:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node748 private def node750:Certificate:=.positive 1 [(1,0),(2,1),(2,5)] node749 private def node751:Certificate:=.positive 3 [(1,0),(2,6)] node750 private def data773:List Nat:=[ 0x11313121111110d07080613020f021201080101010a1313121111110d07080613020f021201080101010a1313121111110d071206080613021201080101010a060b0208020112003004360304020302000203020310020a0605020004040603090208020402010604080313131111130c0c0c080613040f041201110108010a131311110c0c080613040f0412011101080101010a131311110c0c0d09080613040f041201080101010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306031313130c0c0c110810070f07090711011001091313130c0c0c110810070f07090711011001091313130c0c0c110810070f0709071101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node773:Certificate:=PackedParametricCertificateData.decode 9 data773 private def data828:List Nat:=[ 0x132b7b9c6e19e8da7c1b6caa5ef91d9dfcfa68aeaf7a2da800808010224be8aa4c1bf91a1aad7a7e0e1d3e5e584c696ecbacd8e8012060102299eb9a9a3ccc7eceda3c7c8f8d9cd8c84d3c388bc8cc5d00606010223ef91eda4dfa5cee6fecbc186c89ec1d9b7e3a1a1c385d0060501023da89bf7c0c2c78dacd5fcb9eeb48efda1e9b4babaf0b4b00f04010202c7e5edae97e7a5bf9c89fd88bbe995bfd2f6b2e7afcb90f0120101020cf2b98d86b8c5efd9a3f7f8c8a4e8ecfebb9e80b89ee280040101021bf9d5fa9f8fd2bac9d589fedda4efd6b3e8e9a3b49d90800f0f00021c87c8c1a1fb94e48ba1df86d48abb8fe1a6a880b6eef9800808000211d2e2c2b0fb90f7ffbfb9e782ec90b0e7a28199beffa180120600021e8087b09394e2eed5d9b2a3b98df39aeae1cf8fc8e0b6c00606000212ccfa8fe9aee495d0d1d1fddbd39a86a0a498a9baebf4e00605000210dba4c5c4988fcea6e2c8c7c9bd8df3a5f3cae4fcc0c78005050002039f91dd839dfa95f7a4f9d88d96b88acde0dc98c2afd9a00f040002028de2d8b8c5d28f9fcdca95e5bcdab0dfd5d3fdaefcb993c0040100020cb2f3ffd194cfeba3a4d4e4e1c1f3bbe4b0cff984e1b8801e2fedaaf5aed2e4fc96c0ffc688b8a9dba280000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1e0b190f4b194d4ef9aa3cda6da841909b4ee8498cce6b28c939ba29fe58ccf91ecef9694ddac93bee2d9f4000b02080201120030043603040203020002030203010101e6f716e3058fd80388b72be1923db5b324878810d0d3000fd6cff0ff948bda9ee08f909be8cbc4dbb79e8001be960297f607c98804d9cb30db840ebaf540f4f92383e00006f5ec9ffcb8fa90f7d5b3d7aec6ee88d3f8ffe032ccf46fb1d56de1aa34a8f11ccfe538c6d83685d11a93d6000ed0d5c5d1f487a2d6b8c1d9ff8fcb8ff1a6801313020219e9849ad8ac8bfbc199e29187feeced85dcd4d5d3b19ed00f0f020220c0c6e4b58491ddb9eea3f3faf6ddc9aa8096e4acdea9d00808020218cb8c9192948dabf2a08ad193c9ffaa93ffe7b8d9a38a9a0707020207c3dd89bef0b6acdf8aea899cbcfe80a6c680aeecc2c8a0130402025ad3d9f5db87d4bef4c685eca89bfdae85e5b5a7ecf2c0b00f04020202aaa1f7968ca2b592b882aac78181dff492fbcffd81b799f00f01020208af8f93f1feadb8b5c6e5a0fad6b6b6e8f3b0d3cacf80a0060102020b9c85bbf5b8a5e9d4cdaca3a09cced4cb89fd95f8f4faf00501020218cbb8c7e2edddbee7d6cca09086d1a7f39895fdd1edcfb00101020205b6aff4fdc09ef5c195e9c0caadecb7c7d7b4c7cadbe0b61313010202cea4c2c7e8a680ebfbb0dde0eed3eaacd5b985df88a4c0130f0102, 0x10702020209a0e5e7c0caf3d583e28991dcacd7d4a8e9c79ffad79e81b4c89288ede29dc1bc050102022490a19ecbdebe83dea0e3e7bcc9a99bb387a690c2819ccce2a180a8a7eee6abcc0101020275a9c4bbfddadb9dc2f4e8b782febcfea086b3fcb99defee879df399aee7fedcd41212010215faa4ccd88b80c4e0f999c392e1b3cab6eeaed4c18fb4c0cab881e0e98285d0cbac0d0d010279f2b6edeeb88081b9bbe4ec80d1c0d6dac3e3cab0a2e6e8f994eeb1f0889da49a120501021db1d48395e7e5e8dc8c8abcf6bf968ba886daeba5d4cda392f3e3c4cf9cc99c86cc1005010204f8edfcfca5aac68aabcbfcf7a589d297f8bcc8cea0f0a5a7ae85f0d5edd4d59f9a0605010222b5a1f3ddd185eac6a5b6b0eba8fdafd6aebdcad0b8feb5e19b969c9fd9bdf3a6920d0201020493d79cdfd795b181e19cc9d2c8c6cfb7e58ef088db9aeabfbdb6a3e6f2b4c9dfc012120002019eabd59f85f3f9d68599cc93a5a7bd81df98b4a380948b9f85e49d9ea8f897f2c00d0d00020cf1f49ffcdae5e38f9195b9e2ece0c9f3ac85b5c7818c95b2db96f4b8ffa9b3d81205000215d08d87c8a487cae4a4cdebc4f8ccd297e3a99996cdf2878ac6b2a0fed7bdcbf5a005050002159292cfcccdd6fdfdcaeb81cc83dbbbfa8dbcdd88caaaffbde4d9829ff4c3cf88e00202000231afdbd6b2a3c2bfce94f2f3eab8bcf2dadad9, 0x19efac0b7ee90a2000c020b020206000c040e03120403020202030dd8cd24f5f42ed18317b3de010196bdc5deb9e5feb0b6f89187c282e9b5ee88b8c7978ac6a0e79091b884029fb356d426e919842faeff40ccee1cb59f0b97b200038dd380c9c9ddec8bd98ddebd94f6ffcca8dd86caf998da9ea9ccbcb1a807fec60af89d02f8be0299bb2aa78b0be8f445c5ee2787d50001a7aafab9ebf6e8e5eed3e6ecd7b092f2d4efd2edcce9fda3b4e6bfada01ffaac62fde10182e69c3fd5870bf7e932b6fc4cdfe926a0d80018a895f4dadea297ebe190e481bfdf80da99e2a9f194d4e999c98bc1d00188aa8e2eaaa606d2d901b6addf629a833483cd10dfed01a6fdc00010918e93d1e280e4ea9bbac6e2a697d2b7aa81b18789e18fdad3a7c8131302020fb7958ad6aac08d8f86eda8def48ecccdf3ffd79bd0beb081c1c4f790c1fe8b880f0f02020bfeb0fbd6d1f2b7ddc1dcd792c9eea3fd87abde87ce85c09cf284a09bf0e6ea8c0d0d02020290d2e2c1efe1e4dd98f8c589dbd9d4a19b82a79ba78683e4c0958cf4e9bd979ffc120902023987fe85b8e8cdafb5f9c8d6bcb4cce490f7abbefbbab3e59ae2acb1f9f4dfb5c00705020218809ba2b1baef9add97daf5f1bf8099e0eaaccaa0c8b0b9a0b0aa8cdaf3b9ecabec0605020214ffe9b990aff987d4b6c2db90b0e496cec9ffff8eb2c9a3bfe0f4e0e48f89dcaef4, 0x1e0decfa88dd997fe0302020206b0918af8c580b1a5ebecf7a3aba6d1e48dd09988f6e7b7b2c2c0edca020002021fdbbbbffde6f88e89d393d6b68d8bedbc80dcf3cbaab58589e487d4120501021bafe98695d581e9c9c5ed9081b592bcecfb9cbe8acea08cc9faa3b405050102029ceffcf694ecb6af9cf9a0ddc1919cd293dfe0e1e2c69a91a9acdee806030102048792a1dedbfcd58985e0909492bb95d8f9cdd7ae86d7f7e3e998dc0e02010202e0bce584be82a1e695f6949abbacd2d996e7af90cfee909bfe8fc4be0d02010207fdafa5afe1a3a19f98dc9aded7f3c8b986e583b5f288d1b79ab5ee03020102089e86a2e1dcd4a48fa1a9feaec4b89cfcd699afc5eab197aaedbfa4a8050101021fe3ecc098a8e2a69ea9e6c1dae297bffbccf8d791d9828fdc92dcf81212000201dad5efbe8496f8d9d1f2bec185f6cd9b91f2fddc94deefdacc84d41205000201e0a4f89fd4f88edeae9389f1b49ca4b8bdc7bce487d9facffe81a9f80505000204ce83a392cadcada0dfb5dda4f6ecf9ffc5a2efdfc0938e98d9c6c6a80e02000201b4b8b284c792dfbff1f6f1f2ada49789ded3c69cf5a6e695b6c9f3fa0d0200024ef58298ddc5db81f7d2a4b6ce968de2848c8b98cdb4d2ea90ba9cfe0302000207f38daad3b4bca9faca8d819ddfe1bfabd5ceecc0ece9acafa3bddd821907c4abaaacbdf6aab2a2a2fed2ca98, 0x1878fe49fc8eef8eae4ed8d940d02000247a9879ec59b84f7bdfad7b9f5f2a5d5d0b4d9d2e8eab3f096c8bfafbc939298c29abc0502000231e9b1c290f980d6d5aff8dda0e7f5e09cdcf6f8ad8096adfadac3cf93d4c9c6a0cec81901fddbb7bdf2ccde81ea88a0d9d4e4dcf7d3e7b8fbc4bb9fd0b1ebf8f00012020c060406000c040e03120403020202030204000602020479f5ac03aaa20591a80182b0f5010da498c69bac96aa84b9bded90abd990bbddd3f4c3f18441f70ab5d001e9820996bb40c3fe3dd7e50afcf90890e20001d7fa8fdee8ebb7afa588c1b1ddc3e69cb8f6f0baedd7880190a80eb4be2efbfd1f87ee09afaf07acfb22ce8b33aab8003f96cd94e9caaeabe8ecc99492e7eb8688e4f9a3faaa8801a0adb2128ad9198db378efef5d9fcb058f9701fa8460b4e0000682f1b5fcdcef91a8ceec8b93fbb9d7e38bed9f84a79e1313020277b7c6dab594dbd0bdafd292b0cba5bef1b8b9aea6a0b6bc89eb9e121202023afceeadf8d7bb8db4dc96a5dfa7a4c48a98ddbe84c188f7c492b1b0120502027ed0e9fcaacfd9f7aa9e97da9ce7febce5b3ebcbcf84958ef597dad8060302026bb2c8d6d493bde4fab684e6bb84b7f9df8c899ac8b2909d97a092e40e02020202e4ec9fc5c2c590a78dbee2b3ae9699a1cbb9f193e5acbbf8b4eeda9a0d02020220b8bc96bbab82a99ae2aed0c196c083f0bfdcab, 0x18fdec0a6e699f5dccef1dbefe0c4f49eb89ae4050502024a82aecad390a98ebbb6a38cb88eab82c283c4b3fe9aa99dc1a9def691c3ddd0eb9bdc13030202059d9a8cdd9483d89e82c3ddd89787eac6aab9ded7d5cbfc84b2a6f0fac4e8e1aac59c0d02020242e8b0be959dae8eb9b5cfa486c2af84b09fbbeda3a08291b9a281b7a592bfeaa797bc050102020694e68eb6da98e0c686afc0a6f9c9ee939fde80cee296e2d9f798f4e28c9fcaf496800500020212c1df9dd6a797a593ace6b9ab8ce5bca6a090cb82adc1d1b9a9ecdd8afdae84c9ca8c120d010203adc898decfca84e7b087ced38bcba3cfc4fafcbf82d9b4b6edabf6dbe3f6cbc5d1dc110d010229c3e19ee883dea4d5ace1b4fbf9f9d1fab6c9d39193efcfe1baebacd8c9dbbec6941205010215d09e84fdd6bcdabc97eea2bf93b295edd2d4b5aff9cca382c799f691d2dce8a4baa806050102098b83b7e2d1b5b99d9ef39b86f2eae5c5aed2908586dda5dece92e9d087dcfabe9fb00d02010243df9f97b8aef481e4c6c2c89092c392fde491f4f9acd09cffbfdfc7cefe92b6ed879005020102069eed9cfe9edf9bd9f9b7b687b6e0f1f380b4b9e2e1ba80b7dbf9c9a2d8ecf2e2baa8120500020398c5b8abcbc58bb2d4db9581cad0c28fe7d4e2f792faa68edfe2f8f8a39de684c2e00e0200021992908cb0aadc9bd0d5a69894f5b5e081a9a1a5eff2, 0x18cf3c6f5f2d8c8c2faa3c5f89fcf86c41901a3cce399bf80a0cfeb99e4a4d3888c9c93b5f38fe5b8f9cdf3de95d7bafdd680979ac1d4000b0208020112003004360304040106000203040302040006020203010b02000202020409b3a71ba0fd76ceef019ba3960102c180a0b7c9da89818ba6e2a2af91eff293eec49980c18cefeab0d3c5f072db8c29decd408249bcbf013bb0dd8cfc819d91f7d7a7ced4c0bde9e496f6f286aee0e99ba8bdb2b007bc01b3fc08c4ae07b2cf3ecefe3ac9bf10add10ca894003db6efddf4a1bba9fcc8b493abc3b6f0dadfe1a2edb3f780a0819481bf9808b6f90f949506dbbc11a78c11fdc805af8840efce589c9d0022cfa8c2aff9d7a5e3c890d1aa92a8e7d3938780ebd3ded0efe3e8aca9a0018f8ba0559cc916a7af2690b142a6a130bac201f111edd2004580aeb5e0e9d1cbac87f5f4e0dda1afd0becdf5ede1f8949af0bfc8131302021dc9bfaca8e0d4d8ccbe8fe89eea8da1b7f986cc9887cad093c0d784cff8f6dec5c21212020206f7b1eeb4eb98c6a18c93c7d3e4c1a787bdd0bcb393eb99c4ede499b3f59dd3ecaffa120e0202028d8ce4cee0eaf3b9b0c4dec7b29eabe4d1f8e485818b808dc5a898ccc8d083e58dd40d06020202aa9beec1eda8fc89bbe9f5ddb88dbbbffeeac58eb0ebd7d9ddc5f085acb1b5e892a40e0502021f9192f9aca2e2b3f7fcf1f586fc9bd9, 0x1d7b798f889f785dc9da88e80841212010203b1caa1f7b0a395db868bd5c6fea98dd4ce88caaad4fae99ec5969efd87de989dd99ac7b4e7baa999cea20e0301020aa9fbc3bad0fcfa8dd2e7f390b7b9b8e1adb7f7cfecd1f9f892c8e596fe90faead191f4878e989b93ed8e0d030102048bc5b2bbeeb29391da89dc99a4c3c287d5c89592c6e6a8f18c8d8cd784feb78bc0afb8a0fdc2e68588920a03010201eabec7acd693f3899190d2a2d6bfb4ebdce7d3fde6ecb7eece88d9ba9d8fdbf9ec928f8586e3f699a080050301022392eecdc78380dd98a9e08bac95eccd97e497d4dfd3988ea0b9ebc1f9bbc1e9d297cde3c9e790ecf0ba88050201020298e190b49cc7efb1a8f6fcb1e0cf96c8b5cee5bd8abaa89a93adfef6fe8acc84a1cdd09896e8b6fec5f4121200020db9cd9896a6b5bef587a1f1cc97e68af2b295a0a8bda6f4b0b7dcf8e2889084cd80a8a5caabe6819ea00e03000207a1e9bbabc4d99ba0b3c49bc29b9cafbd8fa883effdbcb1df9c848383e0d883f89aadd1eed4b4f7b4f58a0d03000202d9e080b9f0bfbd94a1b688f5cd85d6a7d29bdc8ad09c85bbe0d685e7ef81dae2b1b780eda5a98af38cc60503000232eaa1bcfeb5abe2f5989ed2a1a68cdb8e9c87c5be88a7cbbce5b3888a8bb896c3dea29ac5deb0c5a7bae80502000206f7aee1f4ccdcb1ffd4baf58e99ff89a99ab4e7b9b4bf8bd8e2, 0x1c0ebe1fa9ab18ed7b6c4cef819c3e051a7a01ecca80187c99d0bf4d416b4a322dcb12d9c820034e4fad484eda1acc4ff99bcacc6f3f0fec5f3b581abd6c4b586bfd0e88ceca0db9ee2c8803ebad337f99147fda501bfdfdc4f999e47a8ca31c4ca01c886b1000fdaa891b480f0d18ee692a597ff87cff4d4efdaf2c086b6e19fdbabecfdabc19eec8ed0887e97fc01beb175bda70cb6833fd79901e4cb37f39409c8d2000a8fb4958086dcdad4c4e2d48d9ed8ed8085abbd85ccb1fda19de9bdadf0b6e8f7b2d689c00f0f020201a1ebc6d995bcf5c8c1a180dad5e0e9e4f3eb95ce9fc7d1b4e8c3ccdedea6a3ed9497f5d5ebe3eeb8c80f050202339c8baefff384f68bcd9fa2c2dec0e6a9dac1d8d9f5ffa1e9efe8d7d6cedda49183abf4cff0ffe3800f04020202abefb7a5aaadf3a5f894d7b2c28a8fc4cdf7bebcdabdfac2a6cd84f2bb92eec9a1e1bbc6f6b6b49af00e0302020a9f99d3b0f9e5c0d395f5b19de88e9fefd194ecf2d4dfffc2aea3fef0c190c09ceafeb7d2dfc4bdf2e0a20d030202738ba1ec8d9e86cd9be497d28ba6c8c8df8896ffc5d2a2a5dbb6f99defb6e897e9e9fd8dc7d6b6dda6be0803020203c79ef5aaf38d8dc894dcc7f6a190bcc4979f8cbbeac0c88baeb68f9fbeb4c38baeb1d8d5ebfbf9e8aeb0050302022b98d5d2fcf59fa8eebedbfde4d2d097dcbedf83e293e7acf390d4959ce2, 0x1c6e9aaa0ddb2a0cb8ec4daa7ebc9bccfcab2ef9dacf00303010202cecadda7958bbd97c9b1988dc0da8bb783b5a4c9d9b48eabcf85dab1bf85a6eac196bea4be9c969fcfb4889bdc9ba6c8120201021387b8fbe8a399e3d3c7f5b8eef8a8fcfacca2a69defd2ebbdaea9c884afdbcebde5c2f79fbcefd0e9f6a4fef9c4a8c01212000260ae8199b9f6ccaad3cdcfb7aabde7bf95ceb4ee8f8ed7f4d492cbbee58e84b0fbd2b9b3d2f699b4c9ddc1d1bea1800202000213a7e285b6d6e58780d8d38581dde4dbc2d88cbd85cfc68ff3a0bdaa96cde5f683d382abf7c798ae87c6d99b82bdb8190188ace4cbbfd1e0d3cfd0d09195d1ccd3eee7a3faefe6f5a3e9dea8cd81f5a1f0b6fe83b7a18e80cc9aa4000b02080201120030043603010136aae15cd88e39f99713cbec0108d9a38284b7eae691aec291f0fce7f69b9c809292b7ecb2c8fba0b9b786ec99ecdc93e0d8fc10e802baae02adbb01a3fb31deff3fa48c1aa1c70cdcbc0033849ea5c8dd949dd78f9fb9cee99e8aefc39ba990f996fcc1f0d9ceb8f99fe8cccb8ac6e4e004b4f80985c920860df823cf930db4e046f6cc30dc9700198598e1808d96a9c7e9f3d8cceda2acb7c6f4d1c2fbb088e2c39f88e483a6cfba899cc7ec8048b5ad7fbcd250b1bd18c0aa1a8eb447cbcb30f2b203b5990004eae7afe2dda8bfdbe194ccccaeb98ab5a4a0b7a1ee86879f8b, 0x1bfb6d6d382bcd8b6becde5e2fffcdeb7ba1209020222a185ddbcebc3cfeed6bfe095a4a990da97ec898afca8f6f793cde0e5f681cbddc59da5cafddae0cbdae385fdc4dc05050202038899c8baf9debf9ba1858dd7bff0c7eb8fec9abfb3d0b9a598ee89c1aec593a8f991edf3e082b4a3a4f1dfcbe1adec0903020201f3adc1e3ceb5c8d4e7b9d8eb9ba3d281d5fcbde5a5bf9ecbabb78ed9acfff5ee85b281fccdffe6b0e7c7bcccede7d80803020203d587bafdf391b8d9a7fc9beaf3b197ad9fe68ac0d4d187b5bfa4d9cec297d486ecb4a4da968ddebad2d8afbaf28ef00f020202018782cbc9aaeb82a297e7f9a8e1bdae84fa87bc92fbdf8497c883f4a0d5a19fc4c19993a2b7b8d3f2b2f980a4efd9d80101020258cbb5c5b1fe82bc8e9bca90e7a6d3a8db8c8b9af5ffdab5ebe8968697f1cb88bfdd8fdda9dbc5e786ddaea996d0d402000202018f92b9fafb9b8fa4a3aed4bffbb9daffa9ec9bb7b6a3c8ce91c09783d2ece38187eac0debfff82b2dad5c8e6e4df900e0d01020e8e9df3a58b83cacfc1c4f3a3f0eaf3cc90fddbf8ab80c293caacafc4aadce7e5eec2aec0b1dfd4e2fac5e9d7908af40d0d01020af8a0dba4bd82d2eaafa6918fcff390b4a9a3a1a7ef9df38ff8dcf3d2fbb1808ed7cbebf0f5e286bec1b4c89ceace8c0403010203a18194dbd8a694c581dbbad8d8b7d3f0f5d2d6ee8fe2adda, 0x1e285e1c2fae1c5abccaaed9ea5a4d0c49addf7db8b8bed8bf7dbc00ba3ee0682ba0e96159a8b15fd9b0198e444df9c2ffae30016dee4aab7e3c98196e5cb81eae9ab80f79cfff0e1b5b38cf7b1edaac5a5e7f7ef95a3f4fb96b4f5f28f83a01c8ba9298cfb0598bd47ece828e6ef06dcfe1eb5ea03d4880008f79af890a19eafb9a481b6d8ebd3b294a7e3959fea8e81f6a5d08df5adf48089959ae488da93ecc9d994e03080a20188869e17c8a901a0a48d3c89c95c88c302f1e1019b83f000038ea9bfeefd95f1d6f7b0e5d1f1a1afd6a5c1d3d39fabc6c2bee3cbd6a7e9f392ff8ee6e282b1dda8ac88b876a89a4390df5581fe0187d5db4f8fb51288ae3a85e9778cf20002a3fc92e4f09285adf4ebe5b4bbd78bf591c2cdf085c78bcc9dc0c0f5efced38db6ed80e2d4f2c191f5e5f05d95c4269a970188b3894cd1ca25a68f19fa824a87a83edb990018c2e6f8e3b2b99699d2b595afa2e08aabda80b38d9bc78f859684c5e489d8d0eff099cdf4d1b082e1c00f0f020206b3a096e4cbf7f6c1aedbbaf8b9fcc9918683fa88baa0edd69693b3c9e59cf0cdc4a88b90dbfbd594ae8c9ddfd0e40e0d020202a0d8dc9fa2f5c2dff8e8adcaa5adebc59e99bcfddbec89c09fa286f88680e68de7a1f1a6c386ac9cceaf98a28bab8e0d0d02020182cfc98985e1f69fb596f6bbe9d383a693bcf2b6abaae3ce87a9e3ddd4ce, 0x1c6aaeda1fbabcdfd8c8aaec7c3b897b59feffa86de0200010201ff89e0ee9d95d9b29ef1a7a2b0d4e8ebd39cb3e099e78b9b99fdcbf4a3ddaef9c7baa5f0801212000236fcd4b8a6e3a28089d097c1a0e3cfff9f82cf86e6d7a88cddd48b8be3a0b9d8d7a3c58e80800505000201d7d6c5e3ced7e3d5eb94f5a3bdba9ca6a1bcaaa1cec292cea4e4fde1a5cecba18e86feb78e800d0200021fc1c8e7a0a3b0db8394ccccebe4cbf7c4a39bcc9bb5fdb982e4d6c5a994a2fde8c9c8c5b7f9c0801974faace39cdd8e8effde909b86f2e7848ba0e8abc2dfa2c485a6b6c980b7e9f8800001011313111112090d0913020c0213010801010107000a1313111112090e0913020c0213010101070000000a1313111112090e0913020c0213010101070000000a06131312111111060613020c0202021301070101010a13131211111112090c02020213010801070101010a13131211111112090c02020213010801070101010a06010d8fd03a95ec0d81ad3aa48d0117f0ddefcbffa8d1f4c5d4acb4eac2c8ece6ec9fb4d985abb0bd81a28596cecdc3bfb4fbce97dea4ebb4b38c35a6b305be9c1d9d9d4d85b601108dfc99fbffaaa1e986c8edb9fba8f2c3da8b82dae8fed1d8cfacdb8585e9d384b6e8c9dbb5a49da3f1a19428c341ea02c9e901948a26cea349aaa013be9f0f9ddb0038b48d8dcff18bb7b6d1e5f4b391c698df, 0x1c6868fbfdf9f8ea4cdf5fcfedcf1c58a9098f4c00503020213e8ffebd396f282d0e6dec4adcfcacfe28baaf9ce89a4f6a7f6e1d8aca7adf7aff89082cfeea00d0202021fb2d1f79ec7bc9da3decbbda18beb8a8093dbaf82aaf98cc6d8b4f3a79b9e81f99183f59bfdefc00802020209b5de99bcb7a4c8dff19da4acc6bfdbb0daa2dcabd0cf91d2c1c5a5d0c5e281a59fd79d9b97c00502020204cbdda7bdaea5e1eee099af9ab4eefbfefd83fbf0da8fc2b392eee6e49fd7e7f0df9faecfcfa0130102023bb2e1ee87b787fdd8a2c5c697d9a1e8b1b6f0c7d5cb87a5edd8dd82c3c4849590eba7e08cc0010002027f8091b9cdcfd1a0d7db91a3ef87d08ee4d392d583d7f3d3f8fdc0e9e7c2e58cd697c3cfa180000002023cf8abe2c189f18895c582e2cba7a5af9d9adffc9594f190dba0c28786d3ffd5918ac59e801212010248adf2f5b19cd3dfeadcf68ae1a5e5a0baf8b6aa96a59be6cfc3dbf3ccaad2a385a28fe09ea080120d01021988efbbf4d8c18a9a89f6ffd5c0f6eabffe99e485cab2d0a4cdd18aaa9fe2d095b796da84adec080501020ccda1ffddb5f1b28de6a4c9bfffa1e3f597c9db918ccbb6b8ddedfcdf90f5f7f4e5ebe8a6800d0301020f8ad88984b5bce6b3abda96efa6bfbbd2f79aa9b0cfca8df9d892caf7c486bbbed2ceebdf9cda0d0201021fadded9d2e7edc398a4ce93bcfe9ed4dab2c1, 0x1010a0601131312110f0d12090d070d060d0401010c0008000a131312110f0d12090d070d060d0201010c0008000a1313121111110f0d0d070d060d0401010c0008000a0650cdbf40c796418b9f5191ca0104d4a993dd8bedffe989fbefa4e9d9ebfefdc7f0a2c7ac88f1d89f9bee84d388cbe5d80b99d95cfab14ea9d101b6bdde0102fddaa7a8958699e5feaa888683f2b9ffeeffa2d8caecfffe9ed7faeabeedb2d7e801a7a301cf8803d58e59e13d9b8438dea717dc87139fac001b8df5fcd6eec6abbb96a487efa290ea9ef88ba6b597efd7a1b8f9cf8ce098cfa3ac8006e4a609c2910692ca05bec1129ab008f1c73bf286459aed0012d1d3e8c581c2df84d0c1ddd891caba88d7ffc6aad4e49ccdfddff19dbec2c2a68e806ab6ef5598b457c6d96be9ec39aef82adca342b5ea5188bd0002c8a3aaa4e98befbee0a69db995f7c7f98a8ef082f2b0e88fd981fca8fcfc97ded8805688a756a281119fa0019685aa52bce058a59c10aac1019ab7b9000dc3f18aa6fe89848de8a5beea93bd86c1bde1a5cdffd4a9e99aafdfcd9dcdcc800f0f02020181d983b484accee5fd99fa9bc19b8380f0f881b69defcab19b8386c39ac980ff8b84dc9fa0c0120e020227b7c0b3d3a6a6a3a98ab282c18ee7cafcdb9bc7c2f1a4aca881e8cbfba4f2a4eb9cc2abe4b980110d020209ddbbb78d96a19dbd96ffd7f7f4bd818aaccb, 0x11313110d12090d090a090f0611010701040100000a1313110d120911090e090f0611010701040100000a1313110d120911090e090f060f021101040100000a061313110d12090d090a090f0611010701040100000a1313110d120911090e090f0611010701040100000a1313110d120911090e090f060f021101040100000a060113131209110912070f06070607030f02060102010a13131209110912070f06070607030f02060102010a13131209110912070f06070607030f02060102010a060b0208020112003004360301110403020202031313120910060f060706070509040f02060102010a1313120910060f060706070509040f02060102010a1313120910060f060706070509040f02060102010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a0200020202041313121111110f0d0d040d0213010701010108000a1313121111110f0d0d070d0213010701010108000a1313121111110f0d0d040d0213010701010108000a061313121111110f0d0d040d0213010801070101010a13131211111112090d070d0213010801070101010a13131211111112090d040d0213010801070101] private def node828:Certificate:=PackedParametricCertificateData.decode 9 data828 private def node829:Certificate:=.split node773 node828 private def node830:Certificate:=.positive 1 [(1,1),(1,7)] node829 private def node831:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node830 private def node832:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node831 private def node833:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node832 private def data887:List Nat:=[ 0x112050d0505050c020812120d0d12050d050505020206060b0208020112003004360304020302000203020301010d0208020302030204010d0c0b020a060608040c030802000202020413130e090a090f080806110108010601020102000a13130e090a090f080806110108010601020102000a13130e090a090f080806110108010601020102000a060b020902020c000c04100312040302020203131311110d0d0e09080708060c0202020a0000000a131311110d0d0e090f08080708060c02020200000a1313121111110d0d0e090f0808060c02020208010a060b0208020112003004360304020302000203020301080206020404030403131311110d0d0a0a0e09080613040202120100000a131311110d0d0a0a0e09080613040202120100000a131311110d0d0a0a0e09080613040202120100000a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130d0d0c0c100810070f070907120111010913130d0d0c0c100810070f070907110109000913130d0d0c0c100810070f0709071101090009060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203060203060006030803050202060008030a03, 0x1f2eab6f9a8cbf20d0102020ceddde594d7c7abbac9c99bf3c0f68495c1bf8dc0c28de4b8c689cad0121201021ffb94d0a5a4cbfcfcae95b8dbbd8cf0aa8dffb4b8e689a395db8cafb60d0d010266c9b9969af2b28282cfcc80e7ecb1b3c096ffe7ba8fedefb9cf9bc8c60d05010204ffb5f5f397cffa95fadaf5ecf8f9cce3b08f9beffceca6a5fdd8d1f9d0070301020de9e5ad8db1f385dbd1f4a9baeca5ade0fed88e9c8d89b0a2b0fff1dc0502010211c9a3f5cecdc7d3e6a6c08b95d0a6a281aaf5b5878be2eec2bdb8daa80302010202aec5dc94cda1b4d8e8eacabce9a18bdaabf2aea19dab86a0bef7adca9c0d01010206f6c1d5a5be99908fdec5fea1c1f4a0a2acf7b5f7daecf6f892e89dd80d0d0002688beb86d28fbbbbb1acf9e0cebdcbdbba988c8cc585d6cecc92c189cc0d05000204e7a58dcf9192a0e4c1f1a1c1c9de839493e69cd6e0bff682bca9b9a5e00d0200020debf8fbe899e5a783a9f7c6f4fbdfda8398f2fe9f8f91fba7b991b4e0050200020391abdcc4fe98e8c4fddaa3a89b8ba2f4a0f1cb88cccfdef2c980e9fc0302000202e8d3b8a7a8a9b6b49ae2d2b4e4feb390f380fba4acb2c8f891f3fe8fe61904f5998acda7ecaca1b9d295ffd5e59181d6c786d4a8ba000b020902020c000c0410031204030202020312120d0d080812060d0612050d0505050c0202020a1212120d0d0d0d06, 0x19fa988f292fadba6d5a5d2cdb3a8e193e5a48eb3b9f59683abee95d9d98497de96de9491c0000d020b0204060002040403120403020202030f040a04000603060473a8a001e6dc2880e2019d8fdd010d929bbd8acbf080c5b48ea0def7d2bfdce898e58dabb78c2cb103d3a204bcc80692eb46a98630f39312bfe702f6890001898cafbe8594f0c2a284fdac95918bd1dbcde9ac8cdfb7e809c9fa29d0871fb09f40bec61dfedc47948a23c9c60188dcab0004f0ae8a92fb9fc9a8a1ffbd98b1f4d6ce8a9a9e8fbfc89c0197b5e61ec8bf1f9be0019ad2ab5bd1c555d11da5d179ccea0007a4a2e6d09fe9898adeb480c3a5fccc83d5b69783e0d5a01313020270dfcaf8e3e3ece2f9f4a5deb7f0b5ef9fe6eebdfed68688948589c0121202022b8a9392d0c49ec6cadfd9acec8e838a9de5ccf7d0ef99a8d99ddfa1bc0d0d0202779de79dc2f7d3ddfdefdfe19696ebe384a8ddf5f9d1c1d19ff9dc86ec0d050202039bfda2c7d7b5b4f385cd88ab8bb8bed0e7a3cff5de90bb85b5c2dcf6d80505020202b1b7c5ccafa08e8a9ebf859e99efadd0c7febdefbbf2d0818be4f1b4980603020232afb0a5dbabbce6e094c7e587fbf8b3eb9b94cff19bf2a69aeeb4bb8005020202018d879ff8f995fda4f8efaad8f88afebc8b9cf9e7b9c3cedb8e8d809a940302020202938adcb4abcbd9d8f4b8e5e0f7b3cfbfc08e869fbde1, 0x1f8d989b3fac6fdd7d3d4dfcd82a4faeee3fb81ea8de9b0bc130302020faac29ec6f4f2bac2d98fcc81dfb9b199e1c7aaaefbd3a790f29d83e488fdd1aab9c188828ed883dfdac7f01212010206bbe78399a493a49f92eaf7bde7bc82c8d0acce8bd9d7cc97d7a396c3d3f5e5d6d88b9cf4e9c1e3d1db9f8ee80d0d0102588a91dd9ce8cda6c4f3cdf3aff1bea9feffbf80dcc18ea1b388c3fbad9fb3adfa8ebbb6abe8f8cdb6acd3e60d05010211dcc7bcc2c496ed86aadcef81fc83ccd49edaf6f880a4a4fcdbcb8187ab8b80f7f9f4bef4ad9c9092f3d0bdac0605010201e18483eb86f3e089cca5d0fcfb83b3c8a5c4c68cfc85fb89d9a9c184cfe1c1afbda3c5f4a2c8bcf28ba3d8d0050201020fb6c18ad7eb97a1fa85b4c6b9b7b796baa9a2ffd8e7bf9cb2a8ebc383e6e6d3fe99bea6f7a8a090b5f7fee2980e0e00020b93b8deb2e5e1838f8bf4f5bac582beb189f18bdacbdcb786cebfe4a199c5e2ec8fc9fd89fada99a3eca2c00d0d000202ce879bfdcad1ac848db8e6cec2e2838d9788819cf38ed7b3ecb78cdf80bea1a8d1fcb7f2f3d786ce99eae00d0500020d9cf9fbbae0cb81e2a582d0cc809de3bedcdaefbd8697d49999a3e8d6f68afcb3dbd2be9a87e2ced6effc8d80050200020e9dbd83b4d6b093ea8e85e8b68df3c2dfa4e1d5dc9591cff480f6ddb0f281dadee887b4b6c5d79fa5ecdad4801937, 0x1c8a8e0b8c5b885cdf4ec85cf91ec84f0718acf5ff2a32b94ca01a5bab64d85a844c1f068ab0190deeb004bfbecf0d6ddf880da89f5bac385bba6f9b9d6bac785bffd99dfd0eab68abe96dbbfc5a79b879c70f99f0182a99002b68e10f9c537e1ea41bbd702aad10c84c00032d9d9c19bffeda880c9ebfbd5b287cfe0aea8f3deb4ddd2b593b0afc9ff8fc583d08a91cc8fe01313020203d4e6ad99f4d0ed8199a69083e580bfa792e8e5c3a7ef8ed498abe8f2a5919583aeb2baf5fb90cbb884c6f00e0e020205f8cdf896d9a8f184f783b6d3daab9faf82d7fccfb5849aa2dcb1bca6c2ecf997a8d3c39d8c849eb3bbd89cac0d0d02020192bddb9cb8d2aeaaa2e796cfecb2f48dd3aea5d8bcb78089fecb81b1888fcf8081faf3c28be6ef87b693c0d40c0c020202a0dbf8e99bbd8a99d3f4b588b9a488b3f4ab9dade0c784fabd9ec2de9799ca80f4e2b6db8186d0c4a9b8b01205020226b6d3ebf9fffecd85f3ef98b0e7839c9faff6ada8afcab3f9d9f2dfa48881b1d88bd2fed3bfb6dd98bccce8b80d0502020dc6e3f3b0eba79ee3f5daa5938ebccc86f1cea7bbcf9bbddfbcc5b1a382bfd4e0e4c8c9888afbdcc2e59fa5a80605020203b4bff1abc5f0ba9aead1bbcce3e3f9f5b5928ec29fb8fd98d5dad193f6a0b09197eff6cf89d0e1d6cc9d84a80505020262988c97cec58e9fb687d4fdd497aff689edaabbe0, 0x1800e0e00020196c49ac2958bced48cbdfac9ca8dcbd2d9dcdcecbbe59c8abef8bfb183e5ce91a6b8a291eba4edaffda5c199b0a00d0d000224c9dc8cafdd93caa6c5b1e6a9f196fb9c95b2938de8f6fba2bed2eb81ef9a8bacbf878bc9c8e49ddbdc9d99d7a00505000201b7a0c39f97e98c87f9c9e5d2ddd8afdccd84ff98d8abf6da9eb1bca5bc93efad9eb6f2bcc7c8a7a7cc9e9ad9ff801937b695d0ccaba6a99599bc9ff5b18b9896ee8a9b9ea7f5d0b9e5a5ea97f884c0fff6b6a1d2918388c00001010f040a0400060306040e02090201060306040c0608060204000a040e040f86f30ae89378d3e90192c2f20104c4fcbdafcdc28f8e94a8b185c9fdad87d6b2f3e390f5fee9a9ead3f799e6a699f8c0f0cbd1ca8c61a6b647acac12c4b301968ead0173fdae87fff6d9feacb5d7ac88b897fcf5bf9cfdf9c1feb3c6af88f9c3f8e7becfc69d979eaa942cff53cb0eb9d00bc3bf40d38618de853a90a7129ba8000eb286b9aaf6d4afe29eb0c1caccade5e6b7f89bd2b987def08adeceb99a9fba96eebeb99f86cda002bdcf46b411e89715eed610b6ea42e0a13cb1ba0a88810009e9cfd0e5eba2b68dbb9ce6898dc2d0c29eb8899b99c0dbe1b3dc8afeedb8b8e9e2aceae7b5d3a02ab702ead8018bb49b0188e7aa238ad01cea945891ae019886910001f4c69abcd196f6f99e80a8cdf190e0d4ada2adbd8bb5cc, 0x1808dcccacd8f801305020246e7a1c2fede87b0b0bcb6ee9bdca8f5b0ddd6988ccecc93fe91b8fdb7f6b0999983b6f28bf49a87d192cf8d84800705020245b5ea9d9fb3e7e483cbaead9c948a9f93b0aff7bb9694eed496aadddda3ee8f90b6d49aa6c28be68abfd3cc8a800505020202cd86a0edacb9b1cfb6ede7dfaddc8db7c89bfcb498e19790f4a39e81bae6a0baf9d0c6cb80acb0f6c1fcbd9296c00503020201a3ba8ec8a8c5dae4ecf8f8c7cb898990f99aa1a2faceec85e2f9c6e0ab85f5d69fac88bc8fd0d0a9aabdb8bf9b800202020246888df1dee485c5a2b6e8fffc9ad1e194cbc9e091b5cfc0bcac80ad94d7ce9d8287abca8b9fc6c3fcb3e7f8f8c00000020226c69dc8d1bfcdaaa5e988a2f0c0b79bc0eee3f2febef5d4b7ebcd82f6c0a9d6e280a2e0d2a6e3dfd6efbaf9f8801212010224aba8d798fe809aea94dec18896f8e6e2ecc5e98da8b6f7e98ef8c1e5a696f7b3d7ddfab0cdd5eebcc2a1d7b5ccb6120d01020ce4df83a8c7d2dee1e887abebd1b6c0bfa4d181abddd4e4ddf08fdcdef3bbc1ab82fbd99ea7a7f38c8fbda6adf1900d0d010205e18c86fea8cca4eda8c4dac5f7a8fbc0a1d4fca59ccbdcc2b8b1f9d9b6aca0cfe4a099f5ec97bfad83c7e8c1aa80050501022ec8aab1c780b1f8e6e0a5aab596d995dbb6bac2edb3b3d6deabdb9981f0e7ebfee18dcf8addedcfa5e2efb2a5cd, 0x1b7fb000bdabb93adfb8f9fb7f7b9b6f8d1d4dacce7dc8683cdc5c9f68fdfefd1fedce7a9b0cfe8d0e3cfa6eac7c01592bb0fa5ba03c2af0dc5ec1bd58731d4cd70d44cb9820003ab968bef88e487cefed4949ebba9deadbbc2d0e3f5a6c883f2b88fe98db488e8bafb94c291a693f0fa801da29c589bb1018c9d8a4fdbaf1998f1209aca508fbd498de60001c592ba898d97aeeed4faa8a3e096d58f8feacaa8acd5818f899cff97d8a6b2df9bc4f4a0afdcc1a79880019ccdf213f3a538b6db4ed5a75ba9f101dea111ccc44bbbd0006d9cdfa0a9c5c588f3cca1b6ddbc8bce9ea382a9f1bbb09d81b7ea89a6c4b4dcdcf6aef9d6dbc7fab7c013ebbc0186e6ec3bacca01cd87a51d8c8355d1e930d5a501a3b394000af9feedacbdabf08bd28feae0bbebead7b7a9b6d7edbaab93c191838bc6b1bca5d5e6998d9bca87801212020203fccda49eb5ed82d082a2b3ff8c9ee8c4feb4c497c2b199d59ed4d8e3a2b9d493e8ad86a7e5d0f887e6b08abe91c0120e020220ffdfc2d3cf89bf81a8dab7fc96cf8dd7f2d791b59db98cf9a48ff0cf9cf8a1f7a2a4def99dc2d3cec1a0d5800f0d020271c1dde9bde4dc94cdc5d7cedac6f794e499f5cdf7e1978aff83fa92bd87df81fbc9d9cf82a1d9cfb3e1cba892800e090202558ecaffe7b799d488a192cef3f3b2f9a9c1dee0cb80accfea85f3d4f2dc90a2fdbdeb9994a99b, 0x11313121212110d0d0e0912020c010b01080101010a131312110d0d0c0c0e0906060b010a01080101010a1313121111110d0d0c0c0e090a0108010101090611020c02000603060413131212120e0d0d0c0c0e090d0101010c0008000a13131212120e0d0d0c0c0e090d0101010c0008000a1313121212110d0d0c0c0e090d0101010c0008000a0615969740dd8e65a7ad39e0b80102f6c7f1a2a284b7c08ee0b3b994f983bd96f980ecbe9386b8a0f4bbdbfeb6cb83d982b284b6b899e8cec072fefa138d81249eb73bd3bf0101e292929af8cd85bedddedeb2d6d5bf9ed1a087fff1fadeb8bdb793d68ccfee9bf78cdbb585beeea0d694059cab04a6ae0184dd03adbe1ea6f20da3bc4bd6c3208c960015c8b6ffabcad9ddfdb3d0ee81d1c9b3e28caf8b97c0e2acb9f09984afc1f6bdafd3bda2eecd87d8848a8003b8fe01c6ee66df01c1833aa0b03e95c108ad8e04] private def node887:Certificate:=PackedParametricCertificateData.decode 13 data887 private def data938:List Nat:=[ 0x10c0006000a130d130c0c0b0e090c09070306030d000c0006000a060a02020600060308031204030202020310020a0209080506040604010806070603080206040e04010d1c091406060506041c0308020002020204130f110b0c0b13080f080b0211000c00060002000a130f110b0c0b13080f080b0211000c00060002000a130f110b0c0b13080f080b0211000c00060002000a060a0202060006030803120403020202030f0f0f0d0a0909090f080c070c0611010c0101010a0f0f0f0d0a0909090f080c070c060c01010100000a11110f0f0f0d09090f080c070c060c01080100000a060a020106001203140304020302000203020301070204020202030f0f0f0d0a0909090f080c070c0611010c0101010a0f0f0f0d0a0909090f080c070c0611010c0101010a0f0f0f0d0a0909090f080c070c0611010c0101010a060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306030f0f0f0d0d0d13070f070907110110010c01090f0f0f0d0d0d13070f070907110110010c01090f0f0f0d0d0d13070f070907110110010c0109060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301010702010202020306020306000603080307020206020203, 0x1130d130c0c0b12090e090c0901010b000a0008000a130d0c0b110a11090e090c09080101010b000a000a130d130c0c0b12090e090c0901010b000a0008000a060c020b0201060018041a04130d0c0b12090e090c090d01060101010b0008000a130d0c0b11090e090c090d01060101010b0008000a130d130c0c0b12090e090c090d010601010108000a06130d130c0e090c0908070905070501010d000c000a130d130c0e090c0908070905070501010d000c000a130d130c0e090c0908070905070501010d000c000a0601010a0209020102000404060409020802010c0002040e0408060706020e0008041604130d130c0e090c0908080e0705010c00010000000a130d130c0c0908080e07130105010c00050000000a130d130c0c0908080e07130105010c00050000000a060a020406020203120403020202030a02090201020004040604130f130d0c0b0e090c09070306030d000c0006000a130f130d0c0b0e090c09070306030d00] private def node938:Certificate:=PackedParametricCertificateData.decode 13 data938 private def node939:Certificate:=.split node887 node938 private def node940:Certificate:=.split node833 node939 private def data994:List Nat:=[ 0x10e0c120612050d0505050c02091212120d12050d050505020206060b0208020112003004360304020302000203020301010d0208020302030204010d0c0b020a060608040c030802000202020412111111130c0a071206080608010d00060002000a12111111130c0a071206080608010d00060002000a12111111130c0a071206080608010d00060002000a060b020902020c000c0410031204030202020313131111110d130c0c0c090811060d06080602020a13131111110d130c0c0c090811060d06080602020a13131111130c0c0c11060d0608060c02020208010a060b0208020112003004360304020302000203020301080206020404030403131311110d0d0c0c11060d0608060c04040202020a131311110c0c11060d0608060c040402020208010a131311110c0c11060d06080606060c04020208010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130c0c10081307090710060c02110110010913130c0c10081307090710060c02110110010913130c0c10081307090710060c021101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d04090601020306030101070201020202030702000202020306020002020203, 0x1e4aec9eaadf6ebf80d05010233a08fa8c69b9593fab4d9aea7bcc5f7f086ab8da181b881dd87e686b0a8e19e91abd002020102059fcdeea589d7b4a4f3fddab9cbf5b2e8e3d7c081f78f94fba78d96fddfecacfaa1b80e01010203d987dffc9df8c3d4a2fed4f1e98a98e283bbfe8ebff4b5f3f685f2c6cab6beacc4a80501010207c8d9d7b6bfafaa97dbe5cafcc48285a08aeecbfd8fb2a780d5808ac896f89bbcdbf0120e0002308cc5fafad2d8e5affd9de8cf8ca69ae1aed7c3989dbea3a7a49ed3e3a6a8c3a6d1ce120d00020dbc99fa8badded3a0b8dde0b7aee6acd1b8d3af96a3e2c8f8b3a7eeb2bdf59a94860d0500023c8fddbeb9cac3d8aafe83aaf885bfcfb2ff99e5dd83e6f8c7a9ccdfbef5c9c98880a805050002019bfbaae8eee397b3aea5f2b2a5fab0aec8cef4eee0a7dabbd3e38687ebf1b1a9de8ccc050200020af8c584bee9f6ecf4d7c4de95d481ff98e79ee6b4d9fcf99c818a81dfe2efb4c9e1f81901dea497a6e2dea4edd9da88efb6bce691c6a8ecd2e0d0f2cddc93cac8000b020902040c030403120403020202030f040a04000603060412120e0c0c0c12061205050506031202050203020a1212120d0e0c05050d0306030502030208121212050d0505050d03120206060b020902020c000c041003120403020202031212130e120d0808120612050d0505050c0202020a1212120d0d0d, 0x1e1c60182b4ba003680c5d090c0efd9d4fe929af8b1b8dfd1beba85bbdd8498aaecfbcfe815a5e201a1e1f91594f673e7fe05d2dc5ed39e7fdf63a6990001def6f7ddcbe4d2999699cdb7b2aadd84da838debf2c6ff91eedeccade8120e020240f1b6b9da82e5d5e097d6b4e7d99be5b188cabca8defdf4f9ab919e8fb1fc89a2d8ec110e020205f0cbbb9492db818ece8cb8cebee9bde9c8a0f9839eaca0f7f7edd788ccfd96fd92ac120d020201ced9b8dfc4afe1c8a3cfde8e80f2c4a0a0c590e5d6ebb89e9180d6f1c09da1d1fad00d0d020205c89bdbbcb1e7d3ea8591ccedc2d2ebeee4e6eea8fee2ebf592bcbbf186a9f8a28bae0c0c02021cf7f58eee8fc9e7f2dec7cbbb87908d8ade81bea6b2abd0fd83abc89396f7acf1a20d05020225abb7e68fe881faa780e0dd80bec5ca81eeafb8acf2e7c19c96caa8aba0d2b593b6b00505020201f3f083c6d99697c5d3eacabe9d879bc19af5dde6bf8ce8cf8983b9f08abbbf8eabfcf80502020208d9a5cff480ab8082e4c3c9a2decba7ceca8ec1b0e1aa8afdd7ceb9d99ba6f687dbf00501020211c384fca89cb19fdbf3feb9cfefdef7b9b0b98fb09d8ae596c1f28cf7bafbe4c6ca90120e010233e38cae91feb5cae2a987a3c1fbcdd1f8d0dff6d5e3d4bce6e6f183a18f86fdefe6b80d0d010202d5c1bcf0b3c5c6b6edf9e5d587eef3dba988d6ffd2b09590cddb, 0x1d28f85cbf7edad8288f9dc8f9ee39b84cbfa8fb1f684948499dddfd3e790e7cf88d791d2fbc39a92e8120e00027fd1c0c9fd84f5bb9f9dd6cbd4bd8d87f0b7b8c1db89fad2ed9296b2dcc2a5cfbceeb693e38aafadf8f0120d000218e8a7c8e4a0d292e6d8d7bdbcc6cfd5b6eff79db88a9e89cf88b4f5bcca91aad7fdafa6ee8fde89a80e05000224908aded6a1d2d4afb4cd8cedf4d895c4e3fccfcdbfd3ddc4ced8d9ae82b4a1b5d1d4f0a4f1bd8fea980505000255f489a0a2a1e9d1e4b8e0cdc9c1cf8a9a838b8ad790a9c494e3dfced9ddcfaee6cdb6adcfda818e900e02000218c294cce9c092a0cf8ec1a1bbeef1e9d5fdcde5d8a6d98d888f93a1eba7c6a8bb8c969bf7b18d95cdd81904a0d5fbb7b7d0dfaff7a8dda0da8983d8e7978cb889f6c69191c8cfeae1c4c8d3e1eeb80001010f040a0400060306040e02090201060306040c0608060204000a040e0406c1a1028bab79f0bb0182bd8a010dd89cd2eefd8cf5d0af9da091d397e382adc2d0f4eccaf599d1ee93ab800390a9019ae90187a502f9a229a0d142a1f622bdc909bca6002fae85cc9af1d7c6b6cccafdc4d4bde3cc9f86a182bcdde6baf9f1a89f9c01d58b01f7c218dc8717b0f40eb0b71cefa04babe459eacb000edff3bfd18583c0cc8ecbc8fadb9491f2b7e4d5fb94a7acdcf98ec5e4f80187e0fe07d0b101f8bb7dadfb71ddf316b88b05, 0x198dcbe110e0202019ac1b19dbab8d0eaffe2e6abebf9c5add2aae0f1e4f5fec3dad4e6a0a8c0c7e1f6ccb6af80c6e3bab20d05020201b3bbbbd6d3c9df8c8fa7ab9ddbbf9bc3ca98dadd99de83f29dd3a1fc85d0d29998aea4b2a5a4c4bcf40e0402020bf2dbd587d080f3fedea3fbfddbeedcbfe6fa80e5acf190c5a9e09aa5a48bd1e4c9edf0a1dfefe9f5be0d03020202ac8bbde8bbc0c397ce8da8d7939ef38b8faedc80f3e5ada7a894ba87a0a9cbc1f4e6d3fce19bbcf1940e020202078f8baaa198b4b8e78990aec3d48087f1e0c28bd3c79fcbde81d8d0f79ada8abb88e5b9a5c390dfaada0c0002020ad3f9d180b2c0ce93bff7f5a5f7b98b80e58cc8cfb9bfe0dc81c19a9de89ed8b0ecee8ae0aecf9cd00000020201aaef989ff6828e8bce92c8e7b097a8cf9aec818af5dc83d8d080c1969ec586ba8ca2db9a98ebe3a8120e01026e82afe1efd5f3eabfbce0fbb48cdcafe6d28be5feaec48bfabea5bdbddb9480f9abcde492a4ff9886ec110e010205fff9858eaaa082fec695aab9c5fda5dcbfa29ff585a5f58fe2ead9d69ff0d7cddec3969b9ef5b3e4a0120d010204c79d80d6e6d5b0f89b90bc969c958dff9df6a2b099a5edbc8bc28a82b2ced1bcb9a99de9e2f8cec78c0e0501020c8ec18dcec0c5b8cdfce4f2b5ebfb81c897ab86a393898be9e8fcdbeb98a7a2afd7adb99cb0cba58de00e02010215, 0x19aa5f48bc8e3ceb9bceba3e8090000026993bd9eb9898ecf8cdaa4f190b00000000207a8fdd38dd0b4ddf0e5dbbfb4901e05c5fed8f485aeb80007b9c310c4ec18c5b50fba8e0103c6bb8c90fba4d2def0c0f3f5e280c8e2ecafbd9bca83d9cfe8efb4c8e7eadea28caea2b28033f68c62a3ca32bbb601c8d58b011cbee6c68db6b089b6e09bf994ddc1e5fd95afdcabfbbd9398a08b8f81cd9be4e4fbe9f031ff01f58802c0910186b00aec9114cd841ee9cd1588dc0004d19ce7d791f7eed380d49aa1f7cab4e8eceef5b8808cedaabd8093b3bb9f9e98cceef48ba003ded005b2ab02f1ed622ac4d53bce9823c3b634ccf70052d59899f88797d3c78eeabee1cad391bdd7beabd58a8be0ee87b7f79cc6d882ede18ec6a823dbb957c2e00184ea8350d3be0ad4ac2bf6c953aaac32888d0010c5e0f7e7aee9b5a0afa7b4b9cef7faa6cec4f39fd79dffc3c1d4d1cadde389e1fa80a8f80cf28c0ba2f03089e513d8ba36d0a216d59a02b5824fdabd0058a0ce91b4bb8e89ffb4cdea9482d2baa4dfd8a8bfb2b0fae3f2d8cc9084feb3e9f9cde830c5e2018296e62ed0a801d6c0932bbcdb53fabb2bc29101aaf9aa000cdddbb0f7d2f998c5b3d880a692b4d8c0f0b8efef8dea9aa0a591ffbda3cb9dc1d5a6c0120e02026a81f6e1b3d9c5f6a8a0a3ded6eaa0a9b3a186decea183e8c4e18bdbc39cdac7a59da2f998b593, 0x1060401d0ae02d6d97df202c0ad0fddae22d2e73fb6a4298afd007fa584baf0c7e6a5881211020201b8f6eea8b9e3e4f7efa5fac092b00e0e02021bc683e5f984b685fbfe8ea4c8e60d0d020209a8a5d2a7b18ade9d9ea7c7cada0c0c02024ff4dca184cdaefb87f2e7e99ae81209020219c48490a2ecd0f8a592e7ffdbc00e0102022181dec9aff7e2bebc8edff7bf98010102027ecc8888e4bdc9c9c2a3e69b82a01100020206ccd1e8f6d580f1c6df84adf0d00900020255e594ea8cf3c7a291eda0f1c1981313010201beb5f7adc3f7b0f3a1da96f1ac121101020191f2ebb7a6f2e88abffbf0d9e7e8130e010201c8dcfe87efb5bf91e0a3fdf0e00d0d01020ab88addfad5d7b6e6cadfded5d80c0c0102559ea9b7dbeffc8bc1e8b08ee784120901024ad6c2dd8e8f9ea1f091ba818db80f0101020acfc68ee2e69e98dab1abcd8fe8010101027c8df0e7d781aee6df81fba281e40900010264c7ff84da90cad9b18dc0cad2a80000010206d1c3f793fceec9acd6bcaec38c1313000205b09be689c6dcaadcc4c4eebfb01211000201c388cde4d4f6909b8aa9c8d0dcd00d0d000208d1b9bcb2c196edfcaca0acbfb00c0c0002418dea80f8bac1ebd6d0db99cbac0a0a000217cbb0cfa3a384cab8b6a997acd41207000220fbaf8bb0968183cbec84e7a6c00f01000209879497bbb0ca94bab39acec480010100027ea3, 0x11211130c0c0c0d06060612020c010b01080101010a1313121111110d0d0c0c06060a010901080101010a1313121111110d0d0c0c06060a010901080101010a0611020c02000603] private def node994:Certificate:=PackedParametricCertificateData.decode 13 data994 private def data1044:List Nat:=[ 0x1090c09070306030d000c0006000a130c0c0b0a0a12090c09070306030d000c0006000a060a0202060006030803120403020202030b020a0209040504040404010806070603080206040e04010d1c091406060506041c03080200020202040c0b0c0913080807070306030a020c00060002000a0c0b0c091308080706030a020d000c00060002000a0c0b0c091308080706030a020d000c00060002000a060a0202060006030803120403020202030f0d0f0c110913080c0706060c0101010c0008000a0f0d130c0f0c110913080c0706060c01010108000a11110f0d130c0f0c110913080c0706060c0108000a060a020106001203140304020302000203020301070204020202030f0d0f0c110913080c0706060c0101010c0008000a0f0d130c0f0c110913080c0706060c01010108000a0f0d130c0f0c110913080c0706060c01010108000a060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d04090601020306030f0d0f0c0f08130709070d06110110010c01090f0d0f0c0f08130709070d06110110010c01090f0d0f0c0f08130709070d06110110010c0109060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301010702010202020307020002020203, 0x1130d130c0c0b120911090c0901010b000a0008000a130d130c0c0b120911090c09080101010b000a000a130d130c0c0b120911090c0901010b000a0008000a060c020b0201060018041a04130d130c0c0b120911090c090d010601010108000a130d130c0c0b120911090c090d010601010108000a130d130c0c0b120911090c090d010601010108000a06130d130c0c0b12090c090a07070501010d000c000a130d130c0c0b12090c090a07070501010d000c000a130d130c0c0b12090c090a07070501010d000c000a0601010a0209020102000404060409020802010c0002040e0408060706020e0008041604130e130d130c0c0b0c0908080e000d000c0001000a130d130c0c0b0c090a08080813010e000c0001000a130d130c0c0b0c090a0808080d000c00050001000a060a020406020203120403020202030a02090201020004040604130c0c0b0a0a12090c09070306030d000c0006000a130c0c0b0a0a12] private def node1044:Certificate:=PackedParametricCertificateData.decode 12 data1044 private def data1093:List Nat:=[ 0x10204130c130b0c0a11091308090201010d000c0008000a130c130b0c0a110913080a0201010d000c0008000a130c130b0c0a110913080a0201010d000c0008000a0612020906070603020312040302020203080401040002030604130c0c0a130808070a0606030a020c00060002000a130c0c0a13080908080706030a020c00060002000a130c130b0c0a130806030a020d000c00060002000a061202090602180012041a0312040302020203130b0f0b0c0913080c07060607040c010b0108000a130b0f0b0c0913080c07060607040c010b0108000a130b0f0b0c0913080c07060607040c010b0008000a0612020806012a00660474030402030200020302030101130c0f0b0c090f080c0706060801060101010c000a130b0f0b0c0913080c0706060c010b01080108000a130b0f0b0c09130811070c0706060c010b0008000a0612020806012a00660474030402030200020302031004070a0602011204120310040002020603010e0402020206030d04090601020306030d0d0f0b130709070d060c06110110010c01090f0d0d0d0f0b130709070d06110110010c01090f0d0d0d0f0b0f08130709070d0610010c01090612020806012a00660474030402030200020302031004070a06020112041203100400020206030f040e0c05240236043a030e0402020206030d04090601020306030101090207060008030803, 0x1130c130b0c0a0c09140606060a020801010113000a130c130b0c0a0c0906060a0208010101130008000a130c130b0c0a0c0906060a0208010101130008000a060a0201060012031404130c130b0c0a11090c090a020c010601010108000a130c130b0c0a11090c090a020c010601010108000a130c130b0c0a11090c090a020c010601010108000a060a0204060202040108040104000203060407020106000203080408060706020e0008041604130c130b0c0a11090c090a020c010601010108000a130c130b0c0a11090c090a020c010601010108000a130c130b0c0a11090c090a020c010601010108000a06130c130b11090c090a02080201010c000b0001000a130c130b11090c090a02080201010c000b0001000a130c130b11090c090a040a02090208020b0001000a06011204030202020308040104000203060407020402020204060603020206030804010d1c091406060506041c030802000202] private def node1093:Certificate:=PackedParametricCertificateData.decode 11 data1093 private def data1143:List Nat:=[ 0x10108010101091511150c130815021201080101010706150c130c130b11090c0913080c000800060001000a150c130c130b11090c0913080c000800060001000a150c130c130b1109130815020c000800060001000a060112100602020603080401040002030604130d130c11090c0909060d0303020c00060002000a130d130c11090c0909060d0303020c00060002000a130d130c11090c0909060d0303020c00060002000a0612020806022a0012042003120403020202030f0d130c0f0c0f0a0c07060607040b010c0008000a130c130b0f0a0c07060607040c010b010c0008000a0f0c130b0f0b130a0c07060607040c010a0008000a0612020806012a006604740304020302000203020301010f0d130c0f0c0f0a0c0706060d01080106010c000a130c0f0a0c090f080c070d0606060b0108010c000a130c0f0b0c0913080f080c0706060c010b0108000a0612020806012a00660474030402030200020302030402010402020310040002020603010e0402020206030d04090601020306030f0c0f0a0c09130709070d06110110010c01090f0c0f0b0c09130709070d06110110010c01090f0c0f0b0c09130709070d0610010d010c01090612020806012a00660474030402030200020302031204010202020310040002020603100402020202030e0402020206030d040906010203060301010b0c08020702030403, 0x11312130c1209120811080c0814061301080101010a1312120912080c08090814061301080101010912080c081406130108010101080007060b020902010c00240428041312130c1209120811080c080c010601010108000a1312120912080c0809080c0106010101080009120811080c080c0106010101080007060b020902040c0304040108040104000203060408020602010c000404100408060706020e00080416041312130c1209120811080c080c010601010108000a1312120912080c0809080c0106010101080009120811080c080c010601010108000706130c130b120911090c090c0808020c000a0001000a130c130b120911090c090c0808020c000a0001000a130c130b120911090c090c0808020b000a0001000a060112040302020203080401040002030604080206020404030404060603020206030804010d1c091406060506041c03080200020202041312150c12091308150212010c010801010113000a13121511150c12091308150212] private def node1143:Certificate:=PackedParametricCertificateData.decode 11 data1143 private def node1144:Certificate:=.split node1093 node1143 private def node1145:Certificate:=.split node1044 node1144 private def node1146:Certificate:=.split node994 node1145 private def node1147:Certificate:=.negative 1 [(3,0),(2,4)] node1146 private def node1148:Certificate:=.split node940 node1147 private def node1149:Certificate:=.split node751 node1148 private def node1150:Certificate:=.split node680 node1149 private def node1151:Certificate:=.positive 1 [(1,0),(2,4)] node1150 private def data1211:List Nat:=[ 0x18da5d1ea90d38f9aa696ccaad6ade7ffd6900707000201a6aa9ece8af188c4d2c1c6c88ae3e9e2ea83fd8e89add80f06000202cec0bed48bceab899b83c898c1918abd92cfad9ea39aa00606000204fad5d4da9aa4e6a4868d89bdb9e8a9d4888989a3faa798120400021be9fbc0939584e6c88ef9d2a1a4ddeec7c1e3f1c1bfb8a01e01c4efeda485b6f1efaae48f9ae4fbb1b2f8000b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a0200020202030113131008130711070807110606061301110113000a13131008130711070807130611060606130111010a13131008130711070807130611060606130112000a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030c060a1200080308030113130f0f11080908130711070907130111010913130f0f13081108090813071107130111010913130f0f130811080908130711071301110109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d100c120a360120043003080200020202030107020102020203060804060018031a0305020102000403060306060402000803080307080204000603060306040002020603, 0x1c0070702024a8ba5d2f9d1e582a2d1a3a685bfaea999b9a3a78084d80f06020201e4b9f98e8787d4c6928cb1e0b88efd80c1be8bddd7ba90060602020596fa8beee2d7f6d4ce87c98da18286b5db8bd3b8fecba41204020205f4b1c0b0cbb2efc3a4bbc3b3c69d9da6cdbe8da1f3b3800404020238b68dfddff380fed9b2d1bed4d39ae5ffe5cfb3a8a5f412020202129ef2e7dbd7b5b4cababaa6c7dcdbcbcb90ed9bcadeeaf0131201026cf28fd29bd6f7b29c9dd2afa4e5d189e3fadbdeb8f18eb81310010202a1f0ef95bfa594f7e5d4fbbbc0cff790c4adf7e9bee7a8110f010209fee691b7b2aa808cddccabccf5f1daf6bdf996a7c2d6b80707010202a0dcf7a1e4a683f99ed5a694f79fcebcfeb7c1d4d596b80f06010201aadeeca9d4d3d6dea9b485f5b0b4b382a3c6d1b8d8c7f00606010207fdffda8aeadbbb9ff7c995f3bfba86c7f297f5ea8bb8f41204010217d8bea2c099c0f9a2c9c2ae9fc5dc90f3ddf1f3e4ac8aac0404010238ccf897f3f2a6f4b6a6bafcf0e8dcb6d0d4ad9db8ee841200010202bc9caff5e7babb8681e2f0bc9eb09aa7cbf584fd92b28c1312000269b5b1a5efcccbccc399faa3a88ff8eaebe28ec2d2b39fe01210000214bfa6dcf0c8c2b7c6f1edc5a48ce5a3d6a7b8948384a3a0110f0002059df7ccaaf191f283a2b4c396dce3f4f39bcd82fd90c3800f0f000201e4bda6c49a, 0x18ec9c01200010206ab9785d5f1dfd8df98a3bbdeff88dcf29280bad2f0131200024ce3aa8fddb091a7b7e89cf4fe82ab84ad9dca9087c01111000201d68faef688bec695e6a2b6bbcbd09c828cdcddce80110f000202c2b6a982a0cb9fa985dff5b2f882f586d9bcb5d9801107000210e0ead8c0f3cdb3f4a7ddf8c5b5f9e2c89dcdbcb1c0130600021ab0dbb698959bc29beaecdfbdf78c94d687fee9f8c0110600023d8ac7a19af3bd99f9d58ff8eaf09993f394f5e4ffc01200000205dec3dedbcda0afe4e7a09494ad83b4c3ace5c4cbc01b68cdddb7d8958cefecd7b78b8bc3e0000b02080201120030043603120403020202031104080c010e031203100400020206030b0200020202030102e1bc06e1d10184c638bb08d0f02c8e813f9ce01fd891002e85cfb59eceaee5e1b890f0a780f7baf5d1e004c8f704fcf806e3d803b6f34181a82fa3ff25eaf912fac0000bc0d188f8d2fecda6e8b8a08c9eef8bffc1c047b1990cb69b018bf3e646878320d3b608c68644adb322a3ec0073989bafe387a386dbbeac80afd48e93f4e0131302020abed4ffcdfadd8d82f8a0cedffaa7a09e84db86e0e4bbce131202024090fbd89bf9d7c4b9948c93b586d6f3b5d2a5bad19eb5a01111020206c7e2bbb1dce3b683d1c4cec888e29af4f9d4bcc6e7d8b2110f020213d4d185fabedd90b5f3c7a39bf1a4c4ebee92d9efceac, 0x1f7900a85c20a85c10020cc8dd4dee0e69484b4f2c99dd1818003e58a03b18c04d78203fec50edacb0be3a342a0f642a0f5000bd28d8cfae1ee9184d78484e7afb7c03fb236b80194f7d60195f8bd10840c8065d1cb65d1cc006198a1bac297d6f3a1c7aeccea82c0131302020cccc1e89adc9289e79cb9878ae6e1ede0e3ee86f480131202021df695becfa8e2c4c599bb9d8ceb858e9f9df4a98480110f02020ac89ad5bcf9faafb4a081cc8d9da89bf3bbfcb0f3c0110702020dcae3dbaee9b3f8d1d897e6a6f3f083dd80b68199c0130602021ddaaed7aad2e9c9a3e8f4fcb4cf84edcee7d39cc28811060202359faddee6a289ce9de3c8d7d18de583a3f6a3db9eb80706020204eeeabbc8bd9bdabef3a8fac2c7a8fda49791800601020218f7daa1e5b2fb9dec9beedffbf5e69ca891bc801200020207cfdcc88db2998d96eec4dbade7babed8edd5fde9e01313010211afcfb0ebbaefdae89da8b1b6add3caccc9d4f88ac21312010209a9b1ab81d9d387fba7bc81bba8d4d6a8dbd4e8ba9011110102238cf0f8b883a480aceafa9abfa8fe86fbc4cfe7a49e110f010206bb9ed1adb1e0ae93d0b0838ba8c69daadd9fa9fbe0130601021bf7f69fb0b5a295edcca3aee3dcae88f78982e1b6cc1106010248ab9ca7efe49ee1fabc88efca93d4d8efb3f1828dd40505010210ca8382f0cc9aa0d6cb87d89b83b08f999a, 0x11313110f140d110d130c1109110104010000091313110f140d110d130c1108110104010000091313110f140d110d130c110811010401000009061313110f110d130c0d040804040102000000091313110f110d130c08041302110104010200091313110f110d130c080413021101040102000906010e020106020204111c0d140a060906041c031313110f110d130c11060804130104010600091313110f110d130c11060804130104010600091313110f110d130c110608041301040106000906130402020202031313110f130c0807130607060d040604100106010a1313110f130c0807130607060d040604100106010a1313110f130c0807130607060d040604100106010a060b02080201120030043603010d040a040904000e040e03011313110f110d130c13061106110110000400091313110f110d130c1106130111010400081313110f110d130c1306110611010706130402020202031313110f130c11081306110611050705060105010a1313110f130c110813061106110507050501091313110f130c110713061106110507060b02080201120030043603011104080c010e03120310040002020603013adfbe62bee7108202cf1a82c24f] private def node1211:Certificate:=PackedParametricCertificateData.decode 16 data1211 private def data1269:List Nat:=[ 0x1026aa8a1db828cf0bcce99a5b8a0130f000204beced8f8a080dfb7f69ed3a0f8100f00020ca3e9fbba9eb08fece490d4b1a80f0f000206c1adcef0b2cab3e5efa682f7e80707000227c6bf99f9abd2a09ce0c78fb60606000201b7d5e2aed4a4d78490e5c4bbbe1004000206b8d3f6bbcade858f8f9fd3aaf80f04000204dc8de28bb9eef798f9a0f78db01e32fdc9eefddda6000b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a020002020203011313130f100f100811070f07090706060f0211010a1313130f100f100811070f07090706060f0411010a1313130f100f100811070f07090706060f0211010a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030d040a180808000a040e030113130c0c110811070f07090711010f010f000913130c0c110811070f07090711010f010f000913130c0c110811070f07090711010f010f0009060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d080a120806010a04120308020002020203010702010202020306020202000203040305020102000403060306060402000803080307080204000603060302020102020203, 0x10301130f100f110d0807070711060f060706100106010a130f0f0f1108070711060f0607060f04060104010a130f100f1108070711060f0607060504060104010a060b02080201120030043603120403020202031104080c010e031203100400020206030b0200020202030104e2ec08d6fb769a329303facc2986ff40f5d4209b89000ce38ad69b818cfaf01111020204dfebd8d6b1cd868a979b87c3b8131002020a83fc84a78b9da8f4a6fb80bdc0130f020209d897a4bf88a7b3bdc79cf7d088100f020257d4b2e4ecd5b0a3b0bda2a0b00f0f020244b2d7e1afb5b0f6ba9f97fae0070702022cd7ee9280c3d79ed58095aa0f04020204de84ee99e4b5d0bfe6f3c5c6f004040202388a9fc88cc5cef19ed6f7b5c21001020269e7b7e3fba18fd582be99fed8040102021cc7eebea7e1f7a4a6d8b595d81111010202edbfb88dc4d69dd8bcaab0ab801310010209b2d7e5bdebb6f2c290d4e2b390130f01020796a29aedeabba19ccf83f38dd8100f010204b6b9a788d3b4f3ea86aaacdea00f0f010203bab28cd990b7a6909bcd95c8c8070701020bbad4ccc4e4d8f195ef95c08a060601022583c4bd90f49ea0ebf6a598c010040102029dd88cebe1948fabfecc9592a00f04010204ccbb80bed2e9d4ea84feedd7d0040401020186b6ca85a588d8a9d9b5d5b2ca1310000204edc1efbba4dedcb5f3a1b8ce88101000, 0x11313100f110d0a0909090f0611010401040000000a1313100f110d0a0909090f0611010401040000000a1313100f110d0a0909090f0611010401040000000a061313100f110d110909090f060f020401020000000a1313130f100f110d1109090911010401020000000a1313130f100f110d1109090911010401020000000a06010e020106020204111c0d140a060906041c031313100f110d0d0911060f0607061101070106000a1313100f110d0d0911060f0607061101070106000a1313100f110d0d0911060f0607061101070106000a06130402020202031313130f100f110d08070f0607060d04100106010a1313130f100f110d08070f0607060d04100106010a130f100f110d0d07080707060d040a04100106010a060b02080201120030043603010d040a040904000e040e0301130f100f110d080711060f0607060705100106010a130f110d080711060f06070607050f04060104010a130f100f110d08071106070607050f04060104010a060b020802011200300436030f060d0202060302031104080c010e031203100400020206] private def node1269:Certificate:=PackedParametricCertificateData.decode 16 data1269 private def node1270:Certificate:=.split node1211 node1269 private def data1287:List Nat:=[ 0x113131111130c0908080613040f0411010e0108010a13131111130c0c0c080613040f0411010e0108010a131311110c0c0d0908060f0411010e01080101010a060b020802011200300436030402030200020302031104080c010e031203100400020206030d02080203020302030e0402020206030d04090601020306031313130c0c0c110810070f07090711011001091313130c0c0c110810070f07090711011001091313130c0c0c110810070f0709071101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node1287:Certificate:=PackedParametricCertificateData.decode 9 data1287 private def data1334:List Nat:=[ 0x198fcfbff94cecc0404020215d99eefd89099a0bb95b7cae3ad95e7e3f20400020206b5abe8a2e1cb998ac1a092cf94c4fab9d01312010203f0c999ffb5aef9a2a0ebb5a2dab6969ba1801111010223d3c986cca2c0e48dcbaddb89c1f7f5bda01010010207d6f7e4e289939abaf2bf8dbd8ab1afedc0120f010213908b9c8cbab1aa9af7e1d696adee99e5c00f0f01023bf4cea18fe3c4dab98fdcb2f5b9fee7c9a0080801020a8afad28b99afa99cd19dd496b6f0e4e1a01304010231e6b2929bc2e9ac96b2dff8daa3e482afc00f04010201ae95f6dbedeb9d8dfee48093bef191bdf7c0040401022ce8e79fc187858289f9b598c9b58ac8a8a01312000202d2dbcf8dd697b2b8e09b8bd0baf4f5a7fe801010000243e986bbe4c99dedf3ba8ed8bb95aaea99c0120f000202d5cdef8ff190f3b2b89cb8b1d2d3f4a9d9800f0f000204f1a1c79391c1d2a7c4cd87a2b0cf98a1800808000209ecba87cc9ca4b4a2eab59add9196c6c9c01304000211a3fbeffffd8dd38ad69ae6c59ff29d91c01204000269f3a2d4b0c5ceb5e985afcbc9aac58b9fc00f04000201ad9285abacbbb6b6ce95bbfedea7bcbaea80040400022b90acf9c9c39c86f5b4ab85feaffecdcc801e0eeed39ce0b5f4b39ce0eca0000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x181f5dea6f7febd81fe0e0401021aa392cff0ef96c585b49ec393e19eaf9dcdbfa194cee21202010205f6c2f4adf88094d6d686bbe2b3d1dfa1b3c7f5fbdde4f2e20501010223d0fc8c9be9f186fab39687eaa8b28291e18a8fe4f2ba9e1212000225cab5d0a8feb8cccada85faaeb5deacf4cce489c3aefddaa80d0d0002198bfdbcc5d7bafcb3dbdfbb978eeda2de8785f1fa9790cc0505000201cdf2a8f2c7c9d2eb98ceae9a98b7aa99d4848ba5b6c9f6821202000206c38cc4d896e0b3d994f5d0aeca90e0c3cebf9cc696e8a7801928b997ffa7afdfdc86a3a6958fbbacc5f488000b020802011200300436030402030200020302030f040a0400060306030e02090201060306030396f806ae9f43c211ed16c1f233b5ef37aaec1bf7e700048ab9c092a7ab9ab9da81d7e180068bdb05f49001f0e6679f3da3e625fcf53082ef18ebac000196f8c9a5ffd0bbaea39db9c58013120202038b86c5adcacaf4b6d991afe2e5ddcfb7d3d0111102021faacffcd9ffe0b9c6befdb1fec191c0f5d2130f02024dfeabb7bde897f3b8fcacd082a38bd7f49c0f0f020215acabc3e7cdaf9d9da2af95ffb5fbd7a4b2080802020cf1ed8cacfe81d8e3f992c6d5f3dcf693de0807020202e4c187eaf590e0c78c8298dbfa96bca8801304020255a7b2c8cdf9bcc18bacae84ebdcd2f5b1b40f0402020190e395c7d7d5a792a6e29c, 0x18b90b8c2a1d40bcbdc08c78703aafd25ea41aac32893f831b2ce189c810003eef289fdeaa3c983d1ebca96e0bcdf9df999ae14d3983489d8019a888551aafc0b8bb71da8e755f4e62dc0c5000bb3ab8ef982d6dbc9bdaab7e0c9ebacbfa2941312020203a680b4d8b9bbd5cf97aad383b9e5aaa5c4d0b7ffbfdddfbc1212020223cacf9aa7ec98c2f08ec2bed5e8b3d7c5c68081e9c2bab2d0110e0202248e8be781b8f58bfea8f3e7a7e1c18ca085cf97eb94dfc80606020208f6c9e4c583aa9aefdfd6f0ca96ee81ca80abe6b9cba6ee0f0502020185dafbdac9facc8cb7ebd6befea5a5debe8ba3e9b3a2bee00705020253d5e3fdc0f7e79eb9cefaefcc84c785a68597e8c8efe9a00605020236adaa8bb7969beaf1dbda94998686ecbfe3b7faafd4cff81202020205aedd8bdbcda8fac983c994948398fba2cce9abecf9a7b0f8020202021ee9f3ca83ebeea1abe88e80fdc8a7a4c5d1b6a584c186e6050102020c8e88ead2e6978092c9f9fafecbb6b7f8bedbd6f0cca08c1312010201c6bea4c095e3afb2e8b8f0ddb880c5c4b18897aefcfa97a01212010225dbc7b0ebb09df8a590ebd5e2deffbcc9c9c08ae19c9483ea0d0d010223c9bbc7d385ecb8d4e7b9a0b6effa848fc6c0ff95b8d2ba0f05010243a4de8a98d8d296c996a99edfefd084b5ede9dbdbf3fbc4060501025f91ee85a992b39d9c9ddfc5ff81bd, 0x1cf9dfaa4f3e3cbe9b5cb9c95fed5f01202020206dff697989dddf397f1a8e696898ac1b6fdcc9defb6c40502020201809dc396c0ced0bdc7e8d7feed93979ac7f695adab9c1312010201ae8bc7d996ebfcadc49daea0c0d9e89de1eee8a7c7a0121201021de3fba7d2d6a2b191b7b5bbd7eb9586e7d382e3c2a090080301023d9baffc93e691e0aafcd0ec9ff8e28faae0e6b4fce00503010206968298dcbaa2a7b5a2aef7dcceaab1cbfa948aa7bc8c1202010207cbee85dcdeb6f8c3e69b9cf1dbb6fbd3deff8dacab900502010202e4a5cdea95ae9eeced888ffaa7ab83e1cb9b81cab4ec020201020183cab6efb5bd8df68fff98c495a89c9bad95c0ccb8cc1212000226d8bddaecb98faec6c0dc99bbadd0a5ddbdb186e19eb01203000201d6b8b2ffedb7c0dad3c38fe984e9e5d4dcdeae8bf9e60d03000203a1aefa99c3d1aa84a1b6daafa0f488b79bada2ccafae050300020da8a5d8ddd5b9f19ca9f9c7b6ed919abdeda3f292e9ae1202000207d6e8bbc781a5a0e0c19af594de83fcf3bdb3eeaad7c80202000201a6b2f893debaebbfdfd9ae84cd979e8c9cfc9ff5b2192594cfe3ddb2c9e8f081baaee9a09394000b020802011200300436030404010600020304030f040a040006030603010b02000202020402a2f302fffc0288a101abec16c0ed32d4983ba5ab1f92820008f5a1b2ae9dc884d6efa7d281a4, 0x1a9b7ace2c9f98a8fd6bfbcc5fb88f1ee8d90ae8f89a7b689c3cffeb393eaa6f41205000238b581d986d7fea5a2e3829894dbf9cef5d8a4afa0e7df8dd484c4fb86e7e191f5b49df9f582d2881202000206efade3c5fce3c1c08c82e0f0a4b4e5d29f8fef8be2b8cdedc3dffbaaa1e981acc085be8faef3d688020200024390d5dbd1e08fae83c1b78e8dfb86e4ddd5d087f5caf4e08ff8f3abe6c288bfa09e81adfc84ee1908a7e0a681d1a8c2ed95b396fb9c82cbfac388ffe7d9c38cdaf4c4a8e3f8aa87c99c000b02080201120030043603010104db9308c5b47a914ced168a9929e1983dcfb729f8ba00079e9391a69ddfe0e2efbdd282b5ffd4d88007bce706a8a40385b502be82389a8923f1e02ec3981a9aed0004accc9cbbdbb8a48bbc86e4bbcbcbd5fe9029b8bc229ebe019fa2a750b29007bcbf0595b756bbf449e9fb002c8db48293bdf084be97eacbd6a6a8af801212020218b7feacdfadeac3b19ef3e3b1daa6d59ca89cf5e08de8120d0202548590d0c6aeaa8b8bc0fe92968f84e2bab3dcec90b8120c020202e394aad0d995f9fcf7ca958bbc95c08feee8caa8b1800606020204eb9891a092cda9d996d8c1aec2e4f6fa8d94fec2e00d03020201b3fccc8c8de6f8f3c38488e899effcbccbe38ae081a408030202018491e1c4d7bc8390ea87e085acf2d7e2a7e9d8c1ae800503020205f5b8d28a9a87f1, 0x1b5d7a2a28acbc497dc9ae2a083d3ee1202020206b29eaef785abfecec5e88bded3e3f2a0e6a584f2dd88deafd6b8d1b6e987fac896a79c97f99bb3be050202023dc7f0c499b09fba9991b6d296d3c494da9faf898b9cd49aa5c7eeaedbb0a5c5d4caa8a5e6d382a60601020228bba696b28efbe29dd4d9a4bbeeb7c6cfa4e8f3ebf4d1a7b2a4b695e7e394f0e4d1c9ce93d3980101020249b38bc5f5e4fc84e1b2bcabdcbce7b1a1aff6dff584f4f7dbb19eb4c6dbe6cefa819eadb5b9c21212010206d8f384dcd08cc89d88cba5b7cf92d3d9ddcd8094da9ca9a2a696f484b3a6b590dcd0d790a5d7f2b0120d01021489b7e883b384dedfc5f3eaefac8afcfeabb7b1a9c8eacd83a3dfce85acc4e1cfd088a39bd0abd2120c010221abdcfbfde095fcbc8b93c9bef2c1c383a6e4b0f3ed8ba2cf959f938cd5b1eeae91d8d6f18182fe1303010205c6f9e68cc8c1eee3eae8ade3bde0c09887c5d9ddfb99cde5afc9aab7b6ddad88b1e5ade4ec80120201020596beed8e98f7acd199eefdb9e0bdfeb8c3838fb0fda0cea7fa869987e6fde9a6a6bbddf9eb86ff920d02010213d4efabab8cb6c7928cb6e6a5c4b296e8daefeea9d1acdce9c2fedc97ff9aae8bfff8d2dbfc919a0502010203a1868bba9be8938cc08393cbe6e2eebfc7d6eba595c2839592e5f39ff0a3f7aec7c181bbf6d3f01212000205c1c2e5b59f829fef, 0x115e5bc34c2aa60bfc9011bcdbcac88caf787fddd8bf0b793bccc95f5d39f9faedeb7b0d1efadabc8e393efd5a8089ef10687b401f5d00391b020819c1fa5f53e9f9d3dc3f80001b7e6f7d1a3f2a996dfbee79fbb97f5bf8a9de3b8c9bca98ccdf2d6f98bddf3a090eb9c0cb6e211b28d0194a505acc609969d3cebdd2dfb8e1886ee0001b2c4f4ebc0eb9afed79dffa6a48acecc8cd3c3c49bd091b3e4eebe80c8ffdd828681a00ef39c039fbf07adf905d2b13fe3d00bea9907b0dc3baa910067c0fec7b5f4b0f2e38ffe86b6f6b493a598bebf84eb958ba8f5a689d5a2faabacb1ea0188c6c8318ed64f98d169afed53f9a120f08f198d825bdcb0000a8c9cc1d1c8a3c6a9b68bcacd81f8dbc4e497d4d2b1b9ad90ffe7cf92f8c3fa87c5bc24b7c12588a7018a86bd01cdfb8225c08c2884a858a4f601a5e9a90003c9eec29b80e8a0edc6d5c4caa7e3a7c0d0e4cec2e2a1b4f9ddd5d681ebe68aa4edc0131202024c80e1f7a385aeea89ef97beecf4e8c1d0d7b7b3fa99aaea87ab8299d992dab8bdd7f9b1d1a593c81212020202be879ee4ebd4c2d9c0ebe5aff9c8a2c9d291c2b9f3f4a2ab95bed8d091a0f696a1d2efcf9ef5cde80d05020249dfa497e9bdecd9f7bacfd9ae89dc88bac1b2cbe8b3eba9ffe5cb9ce6f797849e8abd82aca89c0d03020269c9aceeb9b9b5a5ee8a9ba3b7acdb8ec7a7ffc4d4f0deeab0, 0x1a196dee8e0d4dcfddaa5a01212010203edcd95c396b0e089baf2ffeecae0c7fee4cbd4c6e2e4a4a4f394ff96a00d0301020786deecb988c0df80e897c9f3bbd5cd9bfccc96dfecffccc887edb9a00e0201026adaa5ffa2c2dbfd85ecf280e894c0d69e9ebdafbbcffce59b91c5efd80d02010201a2cd96eccce9d4e794fdb189c9d8de9bbab391abdcfdc3c4bbf2b9f5d8020001026fd9899585c28f95b8e6e6bd848a93aaf3a584aceaae8dd1f1a2a0c81212000202c080dee7eab88f91f1dacffcc6c0bf84fd99e5caa79faeb884b684b680120500023df0bcd0d4c9f3c4c4d58cb7b3cbb9b3a1befc9bbdab9ac88bd8addc900d03000201bde9bbc58585befce5dabcfa90b5decea4c5e1c7c7c2fadbaab094e80e02000201a2e6a5d5c3fea2f0a0968bf9cecfb3f4a982a9f88af3f7f0dae089d0f80d0200020195f3e5c2a49aacae8fdcbe9cb5b8b5c4859a8c9684fac7c9f7edd4d4b01905c8b5a5e9d4c39e8ba58ea5a98bd29fedd0cddeccb3f00011020c020006030603011313131211110e0913020c0213010801010107000a1313131211110e0913020c0213010101070000000a1313131211110e0913020c0213010101070000000a06131313121111060613020c0202021301070101010a1313131211110d0d0c02020213010801070101010a1313131211110d0d0e090c0202021301070101010a06011697e4, 0x1ba86a3e7b5e59aa1ecdcd00eb19d0cefb802cbba01dab21be3a417d9934493fb4089ec007bfcc8c0a6ba81ebadd3c199efb4ef81f78abfd3bcabf3c80d969f04a4ec039da804adca48beb63188e70efe8226b3cf0054e2ed86bdc19e9aa4e49cdfffc4a19aec999aa9b982ae9041a8f248b3c664b3d801e7efc735b38d39c6a949bcd301b8b68c000295c7e7d2b2facfe8b8cdb4b192c992b8c3cef3e7b2cad0131202021b9ca6eedafaa1b7a084d9b0b5959c91b18bddd7c6d4d58fc896a097a01212020204c4fca0a391c19ed0e0e8fcb4ab9fbde5f583b4e2e1eca9b6c1dbebc1a0120f02021ddae9b9f6a6d9b9b3f893f181b5a6efd1cca4a0b392d186908aea8e8c110e02023381f5ed80a4abeb9eb4ade3cc8aa9a287a8c8e496f9a0f2ef8dcd84050502021df7d1edbcb7a78ae5eca1d6aa80f89d80a0adcb8ffaf38de5e0a5f9e60503020255e7a9cdf1b3ac84b7d489d2c5feedbe99dfdecea9f982aaa9cbb8c4e40e0202024fe19ad5d28f849affc29287a4d59ba58fb1d4da8effabaeb8e58d95800d02020201a798a5b8b6bab19092a8d2c9d0b694aef1dcf48685adbbd2eb86bee2d0080202020197b4a3dbcdd2aeb2e7f7d5efd298d5b4c8f1c58ad5b1a5fce2fc85b4010102025380efe5fc8b8d9985e6c2b2d5cf8ac7cbd7e1b7ea99c6a2ef979ffa131201021ab8f4f4a7f0a6b78bccb1cdd6b78f92b2e5, 0x11313110d11090e090a090f0611010701040100000a1313130f110d11090e090f0611010401070000000a1313130f110d11090e090f0611010401070000000a061313110d11090e090a090f0611010701040100000a1313130f110d11090e090f0611010701040100000a1313130f110d11090e090f0611010701040100000a060113121111130f0f0f0f06070609030703060102010a13121111120f0f0f0f06070609031301060102010a13121111120f0f0f0f06070609031301060102010a060b0208020112003004360301110403020202031111130f120f10060f06070604040f02060102010a1111130f10060f06070604040f030f02130106010a1111130f120f10060f06070604040f02060102010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a0200020202041313131211110f0d0d040d0213010701010108000a1313131211110f0d0d070d0213010701010108000a1313131211110f0d0d040d0213010701010108000a061313131211110f0d0d040d0213010801070101010a1313131211110e090d070d0213010801070101010a1313131211110e090d040d0213010801070101010a06013eeecb3e8fe55499eb01d1989e0104a9dd89fc99eff4d4958189d4] private def node1334:Certificate:=PackedParametricCertificateData.decode 9 data1334 private def node1335:Certificate:=.split node1287 node1334 private def node1336:Certificate:=.positive 1 [(1,1),(1,7)] node1335 private def node1337:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1336 private def node1338:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1337 private def node1339:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1338 private def node1340:Certificate:=.positive 1 [(3,0),(2,4)] node1339 private def data1357:List Nat:=[ 0x111110f0d130c0f0c0908110608060f040f0208010a11110f0d130c0f0c0908110608060f040f0208010a11110f0d130c0f0c0908110608060f0208010e000a060b020802011200300436030402030200020302031104080c010e031203100400020206030d02080203020302030e0402020206030d040906010203060313130f0d130c110810070f07090711011001090f0d130c0f0c110810070f0709070f041001090f0d130c0f0c110810070f0709070f04100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d040906010203060301] private def node1357:Certificate:=PackedParametricCertificateData.decode 9 data1357 private def data1404:List Nat:=[ 0x1021cf5e79c99c5c7e5f3facc88f01208020203b39defc5a1a49bec99c09cbdd0080802020190cdea94bccfc3f6f3aada9d880606020201b59096d0d9d3bba7c086ee8ba2130402026bddf3938593cf958d8d85dc9a0f04020201b882d8f9fffdc2e0eee6fdb3d60401020252cf94d8e9c3c0fe81a6a4f9f20f0d010210d6def8e09be28adfe9dadba80e0d01020588eb8cf7cadde69e9381d4d5e00e0c010204c8fe8cbeaec09c839f9efeba880e09010212e599d284bca7a2fdcea4cff01208010202f690bc9289eae9ebedddf5baa00808010201a593aadd8d859cb897a4deb3800606010201aaa6a586988ded8a97f0f1b6c81304010201b1b7e1ccc385daaab1cccfd5e80f0401020181b6cee9c5d5c4e4e382c2bbf8040101024fb59ffcb5f8fcfaedf0c8b4e80e0d000204fd96facdfabae0d09ea2b895c00e0c000203f7ca97efd1aadd96b6cbcece800e0b0002019ef7f7b3af9b82b5b0a19b9a801208000202a2d49adf91a4a1ab85aea8a9800808000201baf3e28eeeb697ebc0b09af3e006060002019f9393c4c5de94b8d0a48397b01304000201fc9ac2e7e7d9d6a099e9b69dd00f040002458b81e5c9dbaeede0899b95b0040100024bf5b8d8d1c5e88fd5cda1dbd01e0be8df90c5f7c0000b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x18980c0a485c4bcdba7999dc795a2c6a8130d010203e1c0a2e9e487a5cdc2b0848cf1ba86b3adee92cdcbd7f0ca120d010235e886ba928a8bceb9d0fae7c196dda687828cfae0ff93d1d20e0d010206c9cb82a7bff8d3e1a1e1b9c3e2b6e0c4b7adb6d79188ffa80e0c01020ba4e0ebdee981969dd3c2a0ff9aee8be0efcbbcf9afcb80f20605010207c3bbc7bf99bcb1a3c4d7e6969ed4adc48fe093d1f69d99a4120201022e85a5c5acc782c7a4e0be82a890ebf0e78bc09882e4c4ceac0e02010270c6c9d7fedb94bf98db9adfdbc7cbf78c8e9791ffc1a6caac121200021dfe9e90ab87a9bafcc5fce8fde0a29cb2cf84fae1d19aab86120d000249b5c8abd2dbfcf79acedbc0fc8ab5f6b1e9e984999a87fe8c0505000203a4f9d3c3bccdb0e0cae6bcfdfcb199fbb5baf3dd92f2c192120200022497c9ddc7a0b1f9a5d185c1a6afc281a7d29facfb9e92cbec0e0200020182c2a0a4eeecaff0fce5b2aaacd39894a5e4d9f785ef9be6c41901c4c2a6d6ab89e88dcdb2cafedc8bb7809396000b020802011200300436030402030200020302030f040a0400060306030e02090201060306030ba3048ced01f09c019712f49836c78539dd9a1587db00029c87ff948aead7e00f0d02022e83d5b3e7b6b0a1aad5e884980e0d020204c18fd7a299e5e8b5ecf7aba9e00e0c020204c7ba85e381a596d88b9b9ab3e80e0b02, 0x1daf3fbfeee89e38fc982eec483da000b0208020112003004360301010e0d0e0c060612050c050505060312020e0205020a1212120d0e0d0e0c050506030e0205020812120e0d12050d050505120206060b020802011200300436030404010600020304030f040a040006030603010b0200020202041fa7d42ca1d61c848467cdad0104a5b690c69683e3f8d0a0cdbc819fe4d1e9f2ac04bbc304efa001b3857f9816d6ef3691ec38c6d9198bde002e99e5a59fc5e5e8ffdcc0c0e8eb9994deebb290399cf4508bb24091de01c9b9bd42b5a353e8c539a5d701cfc3c20050da8dfdecc8bbd9b8cc84ab88a0ffe5dae3b8111102022bafb6b1ab88cca8ee81b595fec5edffa2b5ada89bf4c4de120d02021c94b587c3809cf99ff6bdc787999ca7e6c5c6ea93a3be96e80f0d02021ce3a9ddf8c2e1d3c1e4f3a1ceb483debb98adc4d9d5ddf80e0d02022d9d9ebf99d8b8f686ffed89d385cbc594df939afddcaa88a8120c02020fc5e09780b5a0a2d2e7bc81a1e5e6b1edcbfb9b9de58bdab40505020207dfcd9884ec84f7f4e8d0a9b9be83b9a7cda0f3fae88ee6aa12020202349d9ab7f5efa6bef0d4dfb7e5d4e7dfa5f892aab99fb59dbc0e0202024bd9dd9ce2bb85fcdefaedc2a985f58eaf84f0f8c3829fead4050102020ed2f392dc9086b6818785c482f5e0a581ecabf7bf8bd2fcc01212010208b1c69ab898dbd0d0, 0x1aef1cbe58eae95fcb4dca00505020202d492ee8685aca2d19cf2a8cceb97b5dbf5c7d680fec5f81302020221eac6c2f6f5e4daf0dfabb6e1c5d5a596cee396ff90e01202020206e3c0a2b1b8f99de7ab82e3d2f6cf8af4a8ed92ec87b1d0020202020390a8dec2a1ebf3d0b9e1aae7c0f5dcc2feafcce3f3e0cc010102020299aabbfaf2b0cfb99884b692a18c82e4f383fa85aea01212010205999ac6d9aa97f4d6b2f6b6c5b6cedfa2f1b1d6caae86c8120d010202d3e7cbeedaa98abdf8b09fa0ac9e9482c3d6d499f9ac0e0d010205cfcdd69de0a3c3b49295e892afc29aadbbed849db7d6c20e0801024395e4aeadf496c3999683839abed2e28af8b39882c4c0130201021180f18cf1eac2c380acadb493dcbb9dad97a3b8cda2c0120201020ac5b8f1adb1928ed0e69ffda2e2a687b8c1fbf6d4cb83d802020102029cca95bbedf1e6a0c9e0fab3c4d389a59d9c9ef5e7d588121200021efec1fc9cc7aefadfe7dfb0e8a5d9c6d3bee7c3ef96bc0e0d00025ba683e4b8efedd4819de4e8b697989889f6fbc29eee860e05000206ab90e0ee8594c782a087c0a1a7adcab5a0fa9a9dd0ac8c120200020dbd8da88af181fc9fe49cc2f0d7c0a28795d597abd3d6a00e020002048b81e580b8e0c8dd9388cfd69e888ab7d6f5ceaeb0889c0202000201e7db8fc8abf5c2abd58aa6f2eaa0ed88f6d089c4bb89c4190ca299, 0x1baa2dca2cea0ddc39fe2b597eedbb9f8de8188a3c7eefc120d000207b7d8b68195939c8fd1848e96cecd9badc7b08098e6e9b00e0d0002539689df88b78b8fdd9bccfcefb2f49ac3aeedaebbf9a8e8120500021ba6cfc281fabac29c83b5de8dd3b89ea98bf196b2b0eab00d0200021383eff9ecc8a7ecfcd3e58683fab0dc98e2dac8e69198a01960ccd2bb95ceedaba7fcf9ececc4c8ede80011020c02000603060301130d0f0d130c11060606130213010101070000000a130d130c0c0c11061302020213010101070000000a1111130d130c0c0c1106130213010101070000000a060f0d130c0e0911061302020213010701010100000a0f0d130c0e0911061302020213010f01070100000a0f0d130c0f0c0e091106130202020f01070100000a06014fa7f232e3f44dd5b001cfe195010fb4c2c9ff9aea84a7edc0c19f9582e6eab80298bd05e0960194e12dcd0aea8711bead39e681568eb80001d5d5e4b8ccfeeba3a184bbe8e29a8bfd9fa05fb39e2eacf05bdbfa01e597dd45c3ad2feee743e2a301b994ba0008a9aaddf3dfba98baf2b599f49f9ebf89801212020206eedfb39fd8bbdff2aef78abad1999a928eabc884e3f7ac120d02026aef91f5f7a7cb85e8fba895d3cca1bd8da0a0a2d0b99c0e0d02020790cdc2bfdddfd9ddbbabeba8a098f7bcebaaf890c0ee9a0e0c02027ea7a29dcdeab0acfedef5de, 0x1ea9b8f4190c540c7e93cfe9301bed6c4001ab0a4b1e8fecdf6b4c3aee0a9cf88c1a5841312020206a6d4efd8e4fcb0e59ca8f7d8d4c7b1d2efedf196a2b5b0121202024dbfd7e5e9ddc5b7aaebcfb4de80f6f88dffe7a0df8ad7f00e0d02025d99cbc3c8acb8c4abd486ae8cb7df8d85b7adf2bbfefeb40e0c02024e82cff4cbc3c096ada2aaa0a68597fc9ac0d29c85afb81205020223f2f6fdb1f2ffc5d3f997d6a98bf7cb8bbade9a8fa1cee0050502020ed78796f3c788eaa8b8c199b2a3a6d5a6829bd29ba3ce980d0302020ec4b3a0e58af7ddc09daadeebffb2ecf9dda08de399f5fc0d0202020a9095cbff9d8b9cb38cfa92bee4cbb39f93bf80b8db83d4010102020bf8fa84f8cf9df5e6a984b2d0db9cf5dfc3e6aaffaaa81212010257cc81f1acb7edbfc88a88dbe0d6dcb29ec185c5f3daeba8130d010201d2befd9ca0b0a6b0f0bde0ebd19cf581d2e790f9c9bf92120d010219f49dd4f4b481cfaeb2cfa2d2ce8afcede3d3b883b1d5e20e0d01023c9380a5c2cfea95d2b49997d49deacfeda3cefd86a9dab20e0c0102058ef1bef388d6dcc5efe89cffd7c8c2d6ae96d7d88fd8d6120501021de09b82f6acd4c587e5c9d39b8feeebbb8ee59ae0a097f80d0201021988dfbcdab8a9c0abc2c2a9b3cec4a5f888d2a9a0f4fbc80200010258f5b19bbdeca7f3b6bcb9b3d195b487a399b7d5df88121200025b, 0x1100d0f0d0f0c10060f060f0210010401070000000a100d0f0d0f0c10080f060f0210010401070000000a06100d0f0d0f0c0e0c10080f060f021001040100000a100d0f0d0f0c0e0c10080f060f021001040100000a100d0f0d0f0c0e0c10080f060f021001040100000a06010f0c0e0c0e0910060f06070607030f02020101000a0f0c0e0c0e0910060f06070607030f02020101000a0f0c0e0c0e0910060f06070607030f02060102010a060b0208020112003004360301110403020202030f0c0e0c0e0910060f060706070504040f0206010a0f0c0e0c0e0910060f060706070504040f0206010a0f0c0e0c0e0910060f060706070504040f0206010a060b020802011200300436030e0201060202030a0209020302000a040803010b0200020202040a0200020202041313131211110f0d0d020a020c0101010c0008000a1313131211110f0d0d0213010c010801010108000a1313131211110f0d0d040d0213010701010108000a061313131211110f0d0d020a0213010c01080101010a1313131211110f0d0d02090213010c01080101010a1313131211110f0d0d02090213010801070101010a060148ae9444edf04695ca01d3b1cd01399eabedbfc3acd893c08ac7bdd38cfae9b004b8ef41e407ba8a52d706fad60781af48ddd548e4b00010d9edb2cb82c2d680b49ef7a897a1acdbb3d05283c84fe2be4ff9ee01, 0x1100d0f0d0f0c10060f060f0210010401070000000a] private def node1404:Certificate:=PackedParametricCertificateData.decode 9 data1404 private def node1405:Certificate:=.split node1357 node1404 private def node1406:Certificate:=.positive 1 [(1,1),(1,7)] node1405 private def node1407:Certificate:=.positive 2 [(1,0),(1,2),(1,6)] node1406 private def node1408:Certificate:=.positive 3 [(2,0),(1,1),(1,5)] node1407 private def node1409:Certificate:=.positive 4 [(4,0),(1,4),(3,6)] node1408 private def data1434:List Nat:=[ 0x11111130c110a0a070a0608060f030a02060002000a1111130c110a100a0a070a0608060f03060002000a1111130c110a0a0608060a040f030a02060002000a060b020902020c000c0410031204030202020313131111110d130c0c0c090811060d06080602020a13131111110d130c0c0c090811060d06080602020a13131111130c0c0c11060d0608060c02020208010a060b0208020112003004360304020302000203020301080206020404030403131311110d0d0c0c11060d0608060c04040202020a131311110c0c11060d0608060c040402020208010a131311110c0c11060d06080606060c04020208010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130c0c10081307090710060c02110110010913130c0c10081307090710060c02110110010913130c0c10081307090710060c021101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node1434:Certificate:=PackedParametricCertificateData.decode 9 data1434 private def data1482:List Nat:=[ 0x1980d05010212d8f3c4a1ab96cfcae1b5fab1a792b0dedbd584928aacac8794b4f0a0ebba83ccc9ac0605010203e0bc96d98db99bb88fccbbf7c5c88d9ce595c6d2d4aca3a1abf686bdfad4c5c8120201020fddf999d3b282be95b5d8bddaadaf92ffa7c7fdd394c48fdfe3bdc8adc1aacbdef6f40c02010201b0b2c7e6eb8e9a9ee999ebefd3e9e7bcefd996d3ebfff894f5eda2e2e2ae9cf4c6a40202010203d79cd79684edecce919e9298d79eae85f6dac5c4c2ee9596e6bab294e3e990d3e3ce1212000205a6fcb4f983b98b81d2ccf396e4d3f59998e8d0cce1999dd2d280d7c98eb8d5e6c9e00d0d0002099295a2ffd3f48ac581dac8f6b9a1dc86fd83f6c2eba79ed696a5c6bfa495ccd8e8d40d0500020485ddb894eeb5f8afd1bdc583e7b4e9e7c8d5fc949e92c8f2ad8b9bfab3e7f8fdfbe01202000216dcaeb98284a4e994f8858cc089bac493ceb0e996bdd1a2d785c0fed3f7fff2a4fab01923fe9eaea2f5f1f2cafcc58ab29ff5e8cd85e4f9d8b6cff983e3f8fc000b020802011200300436030402030200020302030101131211111308080811060d06130409040d0104000a131211111308080811060d06130409040d0104000a1312111113080c08080811060d061304090404000a060b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1eae10003e4c495f1e6b9ccf1fbdbc6aae6e1a1b3fed79acfc8aaf6a5ed8ee0b3a01793ee53abac50d18c01bb90f53faccb4795913be48901c2a5e80008fdcff6e6c6d5c3a7a9fdbb95c2b9f796d8b0f8aad9c7f2a1baf3e6a00808020207f8c9a9ed9b9eebb198d0a4f1f29a8ed5e0dd8ab8b3efcde19cc881be8fc581d7fc0d06020202b1f9f0ed98f3d999e8aac88da9a5accccba2e4bca5bbf9c8afc58296e7baebbab2d80d05020212d5e8faa3ad87c288c682f4e1b8dcedb4c98f858cce8aadb496d3a6898fc6e9fee1900605020215a198b8899dcebfb5c1d4e0a4b7a281dcf8c6e6cba585b2d680b49edcebc283cbc805050202018485f6c4adb5b1abff9780fedbe2a29cf9d8b2dad3a9f095bad2b4a987d9a0eaf1d41302020202d1f5e79fb1ead8eaa9c4c3e0e58bbfa7b9ecd3a684ad97cebb9fcc8cedbeccd0c8a01202020207d984d1e4f2d5cfb991fb9ec8b8f5a7a3b09885c0e69fa2e99fe0adfda6b4c285f80202020208aefff2daaadd9eb58ff4aafdc9acd487d6d7df9cfb9eb1f2a38ee3faede9fdc993fc0d01020225a4e79e90dfa881fee69aa0d782c8808e80adf6c6b49cce8ac099f0aca8b3ecd7d00d0d01027d809480a7b9a185e7eae491cdfde1e2abf5beebecb9da8ee9b2aadcb0f2eaadd5aa0d06010201b0b3d3e8d0bb99bab3c5ad93c5caa5d4c8faa79afedad6ae8595a396dbebbee79b, 0x1f6a4f6abb396d8fd801212010201ffa0aee1fbd295a9efffc19cc6b3bfd39fefa20d05010204c6c288d798a5f8ce84efa9aab9fe85f1b3fdc00605010244e2cdb5f1d1fbd39a8ff2eb96c6d2ffc1dfc00d03010205a6ca83e3b8f1d1df90eed8f8d693fab1fdc2980502010202e482ef84a18c8fb5ccbbc7ece7e4b4cbcaa39803020102039bc3d480f4d8c0a28a9bd6adde9eeb86f6bfd00200010207818084e0dda6869beed4d39096f6a7a01212000203d7ccc5cfc1f88de4b6c69a89b9f7bcc695bcf00d05000205878a9fa99698dbd1a59cdee7ccd0bc94dca7a00505000202bf8fb7978cb4ce97ddffbb80cded9daef1a4d00d03000205a0de9a85aac5b18dfbf18bde87a082b2c2bbe00502000202fb84a0e4dcaa92b981c6ffbc8cc3d08a8aa7a00302000202dd88cbd8b39ca38da382c4c88e9dadd8cbd880190e83cbd3edf3f6b8a0a0e59890000b020902020c000c041003120403020202032caf974ded8852f2cd31b4de0106bf9db29193afcfa4f9f89ed1d9cad2fcaadfc3c6cea7b198c2c8c3dffc71c6fa19c0ea24e9b7669eab0101839ac8f59ab7d1d9c3f3abf68dbca88bd5e6ffac8cd9debefde5e282e401c7ea03d7fe05aac50ad20c8deb3ab18639bffb0b9ce2000885a785beffa6cea4af81eff1e4e8dbd5d6a5e8b3f7a3878cdbf6cdc1c447ee996299f6689b874defa815c0b22ccf9141f9c22a, 0x1decceaa89fa0801200010202ba9dc7fcbcb7e2b3a6d1a489a69de5f6b59192b6f6dccc1212000207ffbbefe1fdc8b2c7ffa7b1db9ad6cfceeaa7b6eaf180800d05000216cbc38495aad68ce0cf9de7ace5cfd8f9abf7d3b5ac808005050002669bcac1d6a6cc82d3bfeff2f3bd9290e2dbd49dfca49080050200020d9be38d90d39eea959dedc5908c89b8aaeef9a9e287a080020200020193b581a4b2c6c7f2d9f7e8bddbe2b39e9189a8add290801901d9c6a980e7d9c7f18ec8c88ccbfaa38080000b020902040c03040312040302020203020400060202040bb6d655819656edd001b7a5bb0107ade19ab997bce2a8a0e28bfefc379b06fffe0984cd02bbea1ad1a73595ba33a5cf18e1be000395d8e3cd92bfbcafab828cf7efc0131202020185e7d8f58df1a3ec818597e685bbf080bca3801212020233e7e6e7a5d792b8f4fed193dedbedf9f08df008080202038ca3c6b0afda90c48488deec95c1e0d290900d050202048fa0a4f6889bbd85fa85fbf4d5baefa7a795a00d0302020580e082dc8f91eda18adbecb8dcba8dd08b81e00603020201d58deeeef6e281d399ee80b4ecedd89797a9f00502020202bde7adeba0f8b590dfe0f6b6d6a4d9f9dd96a00302020201bddc958fa797a2c5d2befc93e6d6fbb291e28002000202498cf8e7aed299fd8385d8dffeafdfaedf81d01312010244e29dd885d8aeb9f4b6, 0x1938339e0ba36f3af1ba5fa00328fbeaa8087f3fda4dddebdaed088b0cb80800aaaa41298a708fbf510e9b21b9aaf35a7ee38c89a52d5d70013c78bcde1aaf9dd9798908093e6aae5d2f0800d0d020225b5a289ccdcf0a0e6e6ed8abfcaa2a5e0b5c0f6abc080120c02020995e9a7b68abcf6c5c89be0b3e48ff5f0f0d9e8ec8f80800c0c02023081c3c1e399e7cfbf9386b6f0c3d1bab9ed9e9a8cc080120902020391bcf3acfb8eeba2cccac6b4c6e6ccefc5809dd285c0800d05020226bee0bdf5ce96c58c8ac78be8a58eb49bb7c3809998c0800505020201a4fd8dfd8df9f3cb869cf7daf0b5b99cdaceabeedff3c08007030202618df8b098bda4bccc98a4e6aec683d6efd9d2ff95a08002020202019386e2b88696d5fbc4dfcaf3dab3b690b1d8a3bec5b0800501020211dd93f2c4acf8dff8d4fe93d295cedebec7c3a1bbec8080131201025cf6f0f8e8aecfa3bebad8dde6cbeec999af97d8cce6ec1212010202bac8fd8aaac4c0eefec6d5a79a83b48899f682e491ca86120c010205928d8dd0e3d18edadbfdc1be9efee18d93d298ec8abcc80d05010224a5bdb0dac687a1f9d8daa2e4cbbd9491d7dcb8a1fb81880a030102018ffeaac4c6addbca95d5e1c5aa968d8ddce6e288a0800202010201cab4a59f88dce2d3938db2f9fba4e29196edefd7c7f0a20501010208abc69bc0beabe4b789a1f7f58fd4c0fb, 0x10201020998818be9ebf0c2d6e9f7f4abbcf0e5d1c2f0fbd0f1ec80f8a7feef8ab38de8c9aa1212000229d0c1cffb9ab7b88cf3d7c3d8a795e094b6d8b6b785b4adda82fef0c299cbe2c8800d020002568387c7bb9dcec0bb979bd4b8a2deebecda80cb80e5fe93edd092f3aef4f3dfc0020200021efd8fd0b69eb98cc8c7eef8afc4c4f9ff878fddb6b4d0f390d0e8fc8ce7adc0a0190ecbe1ff95efefb3b7f6eeafa891ecc6bddcd7ab80b389b59cd1e8a0000101131311110d0d0c0c06060c0202021301010107000a131311110d0d0c0c06060c0202021301010107000a131311110d0d0c0c06060c0202021301010107000a06131311110d0d0c0c06060c0202021301070101010a131311110d0d0c0c06060c0202021301070101010a131311110d0d0c0c06060c0202021301070101010a0601121211110d0612050c05050512020c02050202020a12120d061205050512020c02050202020812120d0d120505051202020206060b020802011200300436030101121211110d0612050c05050512020502020203010a12120d0612050c05050512020502020203010912120d0d120505051202050206060b0208020112003004360304040106000203040302040006020203010c0608060204000a040e0402bbc10df07a85e77cb3ba010997efee8ab3ebf1ecb7cfebffcdf9cbb487dc0381f704bc8406eb9e08a5f91e, 0x1988cbdeb91bcc8e6ebb9fcbeff80bbb7e6bac8120902021f81adb489f3ebc3dff0978cc8a6e59edd9dead5fd88b9b5e3c1e1c7eab798feeb800d08020201b996dbc2deeac6d7e7848390858bb9cfa7818cf3dec8ccbbc4919eabdf87c088e80d050202039b81e3b1a2ec9dce96cb93c28887e2adfc89b2dabf81a3c1cb8ed1b2a3efeedaa80302020203b2a6d392d6eeaccbfbd2bfafadb78f89f6ff999880a6ecfb9cb08493f3cbd98c980202020203d2dfb7a488f4f6a09ecdcb9da08de9fd97998feefbd6f2a6d7bfb2dca5b3d7ae881200020210fdbda4e3a495c6feeef4efa996beb8a8d5ac968ba2d8cde9a1e3aae881be8ab9b0000002021fcb8980f19e8eedafed9de6a1a6bd86a697e796c4f5fdbaa5d5a29a82ba98c1a01212010205f59893af83d6d2d2d3c59fdfa6e4f6e598f4c8c9bac9cf93efa1d2c5acfcd8a190120c01023da7cf939fd0d2b3bef098f898b1f0d9b0eb8d81f8c38a85b1beddb8f393d6b4f9f0130501020ef8fafbdff9869dd3a5a0c69da0df8d9fe0dbe0d0b083b5e8b38ee0e09af2c8d0120501021beeb6fcc6f6feca83f8c59f9d95a6e6d9ede7d0f1f4f6b186c1dbb385dfc7f5b7b00505010230988c81d9ef8486d8ada7cf99ddcfdbc7c19a9bcf81c1b1b48ce0c6a29cfdbdeee20503010201c3c086d4b5f08bf3fbd59f85fbf3f1f9dcd487b1a6ae85d3a9e4fcf9c6fc86a3dc02, 0x1aff7fbbeb99587e0e00a0a000202c29ac8fd93c2c4b3b4ecce918ec6afd38cc00a090002769bbbb290f4c9d1f0a5bcb79ba1e7f0ccc01100000216ebf4a8ea8ea0a49ec3a6cabc99b1b0dfa00a00000206baf3b9cb81b8bb92faa9ddd6cadeaca7e1800900000201f7d6ac82a9e6919c9bb390fbc5b1b3c7bfe00000000206be90f69a908ae1d4e5efefcbc9949dd0e5901e2bcfae82fca3fedfcba28ff0002d869759bee245dead19a5e40119a581dce1e39acab5d590c9bd87b6cdca9bc6c5ffa3d098a5f5d2baac01f50eb702b79703f2cc12d0c729eef440cb9d29acf20004b1d6989383f081f8bec7c2eee1e3e1b09aa781c3afb8b89effcd9dcd805a8d2d8c09cbaf0788e62484d33cf09623cfe63cbba70001efdcc9a0c8b5b8a6f2f0bfbd889df4dcf0d295defadf83bf88d4f38dc03ea6c10180ce825f91af1cd3d21f90ea41bafb33caea11a0d70015fda7c0e5aef18eec85e5eaeff5c0eac7a3c7dcc3fbcb99a881b5fec05ed5e55da6dd31e8ef01e4a39e43aefe41c4ae3082c201b4f5ed002fd6c5e0dc8681dbc4c1a9f3ceb8b38b93ebc2f2e2bf8dfde68ba9a01312020207fcbfae88d9b48a90b683b7ad8dce82aee7c598a493b5cbe9d989b180ceb1fb9a80130c020201c09bc6abfecfd2dde4aed9fdca8a96dcc8ddff88caaaaaede285ddb288bcf4c4c8120c020216a2f0eb9ef783e3aca492c7ea90b3, 0x1c63899d112f7e732ee800002d7c0f9dfc884ebaefa9ac4e9e81312020225cbeccc9bf9fef1a4ebddc7aaddc9fec7fc121202026f81f5fbc991f4d3b497b393d191fcb0caa6110a02020280819cb88fd6add5a7b0939be58ee59587c00a0a020201c8acba99cf9baaa28992f5a0ea8cd7eba9a61301020245badaafbaf2e598b288ed9cab8de8d8f09401010202018986fb99f2918ab2f5d195bad78fafed83ba0a00020202ecc2e99fbcbdffffa1818e978eefcde2c18c0900020202def7d7eda7c792e9e2ae8af289ecc6eec5980000020204dc8087ef91def6b3c8aac0c9a889b0ab8bde131201023bfcb3f8cebc8c9ca8be8bc1a2d5dbde91941212010238eac48deecb928eb2cda9f6e5cea38390d81111010223faaf9bb786d3ded683bcc5aff58fc093dc110a010201aad4ecf9cb9b8688abbc89d48e9bf6d4cce00a0a0102029dac99a999a690aaf8c4b3b39686e09081a00a0901022eedaca89fc7fb82a1aae2de87e0b3d2c7b0110001022cfbeac586dad68982dcb1bde3fd81edcaa80a00010205f89cef91f5eec6e588d6a1f0cea684aea5b00900010201bca5c39dbdb3c3eda0daf0f0af80fbcc97b000000102069889fad09bd18cddf1b48299e1d2f8b38ae012120002028885a2a0cfd6a6f39f9891a38faec6888ae01111000220edffa8aade8793f6ae9bddc3adf9a38ca8110a000279d197cfcfd693fe97, 0x184d2e2aabfc00901020221cf93b8e8a5f7bbdfc5dde5f00801020201d4e6a9f28587f1ecbf92dccbce0101020201be83cfbee9d38fefd1b68d96d61312010202d9c59b8ae8939ed7f4dbb598121201024aaecd99e5c7e9aeeeaebbc4801111010225ab93f6a0f395bfa1f7a8cdb40c0c01023cc6fcfaa0c9a0cdff8ef0b5fc0a0a010219e8a2c8cd85aac5e7e3dbceb60a090102279fdb8ec7f3a3bfbbf3a7ec8c090101022fbfdda9838d8e8a9584adf3b80801010201d5aa95fc85da8ba4c9cda5fcea0101010201c1b3ce99b483e5d0cff289de820a00010231b5d5e1e787a5d8ffffeccfb812120002539782ff86d888e4cadabd8dbc1111000226ae8087e297cf818fa2b4f2c80c0c00023889b4c7f5edb5f29df4f1c5ca0a0a00020295ecabb4da91bfc28cc693d00a0900023dffd7ee9ffb92b0dedeaffa9c0a01000233b98edac5b3aeda89e58fd9f0090100023bb2bae8f689fbb9a393ccaf800801000201cfe4e4d1f9beadc7a1a8dbd0a60101000201c4bac482d4e9d4ea84bc97a2ee1e089fc5f6e2d0b600131211110c0c0a0a020213010c010801010113000a131211110c0c0a0a020213010c010801010113000a131211110c0c0a0a020213010c010801010113000a060101d5f60392a50488b670f915a2c82f8aab39c3e61fe6e1000e84c7afc0b2a8e68bbfea8e8ef001e9910898ca0c86e30790f221ea, 0x113130c0c0a090f0607060c0207010401040000000a13130c0c0a090f0607060c0207010401040000000a13130c0c0a090f06070613020c020701040100000a0610040c0405060302040f020b0204040102040204110403020202030d020902020201020404040c0608060204000a040e040b0607060104000e04120427930cfc07bfe003f8f31ee4e04090e12c9fec07999f0001c5d3b0f5869d85c8131202020e9fc5e0a0bee6c0f7f9e880121202025cf2cca7b2fd86b2dac1c9958c1111020223c497bceb8c9b89fda9ef8cb8120c020216adcb9ebf8781d7f2a899c0800c0c0202328d81d8ee8dbdc6fde2baadaa0a0902022fe5fbdfe8f58d97b9889dccac0a01020235e5e3a48f9afb] private def node1482:Certificate:=PackedParametricCertificateData.decode 9 data1482 private def node1483:Certificate:=.split node1434 node1482 private def node1484:Certificate:=.positive 1 [(1,1),(1,7)] node1483 private def data1536:List Nat:=[ 0x1010a11110f0a0c0808080a0713020c0211010a0105010a11110f0a0c0808080a0711060c0211010a0105010a060b0208020112003004360304020302000203020301010c0205020302030204010d0c0a0806060302040c03080200020202041111130c0f0b0c0a08060d0303020801110002000a1111130c0f0b090908060d0303020801110002000a1111130c0c0a110908060d0303020801110002000a060a020206000603080312040302020203131311110c0c0a0911060d0608060c0202020a010a131311110c0c0a091106080606060c0202020a010a131311110c0c0a091106080606060c0202020a010a060b020802011200300436030402030200020302030107020402020203131311110c0c11060d0608060c0404020a0108010a131311110c0c11060d0608060c0404020a0108010a131311110c0c11060d0608060c040402020208010a060b020802011200300436030402030200020302031104080c010e03120310040002020603010e0402020206030d040906010203060313130c0c100813070f0709071106110110010913130c0c100813070f0709071106110110010913130c0c100813070907110610061101100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d0409060102030603010107020102020203, 0x100108efd9da482b611110202089ca3c685c4c6ebfa9af1c80c0c02020aa4fbcca6ddfbf5de8385a0130a020204d7a0a5e894b0ea9be9df881105020218da88d3a38cb79e808cafa00703020239d3daadedf2d79cc8dce00603020221f7bb8be889f292aa85cee0030202022194dca585f79ef281a2aab80a0102020699a8e4a0fd8a82dbaab4980a0002020ab29cabd0b5b9c3dfdcf6c80200020202cee19aceefc7a5f2d986e01111010209b1cddce680f5a299bcfb880c0c010209d69fd99f97a6d8b0c3b480130a010204bffefbcbe685d1ccda90a811050102159dfd89a8d9c7b6fcc391801003010204b6a9b2bbe388fbccb49fd4060301021efea2e2d9a7afcd98f4f1cc0302010223dc99edb8dfd3a595dfefb80a0101020a93dda595aaea87bfb6eed80a00010207a5d9dd9ce6b4f8f2b4c0880200010279a780c7f397c4c5c4e2b0111100020acfdebe93b0e893f7e1b0880c0c0002098597e29cd19592a8818480130a000204a6ca8d87c285f5aeccf9a81105000210bfa0e8aa87cea49ca7a8a0100300020996f8ecd6e3b88387fd99cc060300021cbfeda8b6bfea97c2ebf6b4030200022490b0f7c7c7b6a2ceb0f6fa0a0100020eb380e9cffceba0ddcdacb80a00000203efb283a5f8a3f5efa2fea81e55f7a6f080000a02020600060308031204030202020311110f0a0c0808080a0713020c0211010a0105, 0x1020204a29d82ae8a8b9093afbdddccebe5a8ee82f4000002020195cb819bfba5c7b6addff888a59cb9f2ccc61111010246cde496a1e39a9dd8b6d683f5accfe895e00b0b01023585c5ec8de1b8f0d4d0e081a19de4c7e6a00a0a010202b9e0ff88f5bbd0b2869f8c8993e396d98ca00808010201f9c4bc88a0eaddf682f7be8bc2e0c4a697c00a01010202dcc5e3adadb0be8fb38ba2ced7c6ecffeec0050101021b93afeaedba80e3bb99f48acdaa9487e080c00a00010209c3a1c4eadfe0fed597dfeedbf5c0faddd6c0050001020182e0fecac6919e84cfafb38bfd92c0b7a5800000010203a48cf489caea8f88f099e998ae92ffa7d280111100021cce93cca69cafdea79ee1ede081b2e390c00b0b000203da86ccd7f787ffc4eac6f28ed0c6cfb8a9c00a0a000202d699bfd7bedae7faf081b79a84dbb4f589c00a05000204ecc196add7ddcfb182d3ddbf84a397e6f3801103000278fba7ca8fbcb48ac391da81d4aacb94bf800501000215add1b39bd6e88ff7828289f094c5be9386800a0000020ab4f2e3dda39fedd7fbdad7b6eab28aefba80050000020fe8f2d283eafcefa0d2d8d5d7cdb1c0fc8f800000000222eda9f3d1af8aaa9bc6eeda8adac19fbc801e6886a1c2f5debbede7c09f80000a020406020203120403020202030e040704000603060401a001f0a9048d900b9a158c8039dda536c39c12f9f5, 0x1120c000202c9e4d9ab8dc8c1f2d4adcafded83caf5bae5e68ac4c6b4a00c0c000202cee58f89d2edd793f885c7e0a8d9affaaed5be9fd3c8d180130a000201df9992cdb1babecd96dfadb5a2c2a5c992c2fceac2a7e8c0120a00021cf6f69fa4e79dde95ddb6cbcbdfc5a3d3eba6a197f0f9e00c050002049bf68d88f286b3af9ab1aee8fec8ffacefb2cbfbd98bc4800a00000225f7e487cccce2d980f88abbf1ecdd8b9fb2b5e78fecb3f6800000000203f988afd2a1a2eba38cbc81fafb83a7d89a97b9e9cef8a8c01e06ddadeca0a6ccabed8be09fc7b284ce93a1e00001010e04070400060306040d02060201060306040c0608060204000a040e0411e243bd06aebe0396f91bf7a837a9f133b6c416c2fb001cc9bdf39e99a7ddfc839891e58066f901f0d805f482068ca118ebf83083fb25fc833da3aa0008a0f9958be4e783c895d1ade980111102025a8f8df3c6f7d18e80b289b1b3b3e1dde0ea130a02022cfda9b695eaf4d4b89d87fcb09094dbc7a00a0a02020197dcf0889685ecaba4e7c5cb88d1c0a7d9b61109020213d5b1cda3b7a9dbc88cd1aba7ae97f6a4800808020201daebe5c8aefc9cd0d89c91f9debef7d49da60a010202058286f29b91a8b5b1d689dd97a0ca8581ea9c0501020215cace82e0b99181dfaedfa0b2df9fc8a388f00a00020207c8c5acafd0a991dbffbca4bc83efc2d0c7e40100, 0x1c3f9f5bfbeab9ef2addc9cb2b3f4e4f4eae0ab8a130c020201c9d8e5d8f494cb8ae7fbc3e1fbf4bf8591f495b2deb4d2a0090902020187c6a7a2ed86f48bbbb1a197848a96829df8d1d1ccccb3e00a0102020cdf9fe0a1f782b8b6f4d3e195e1e4c0c1ded8d9d2f2cfc8e00101020203d0d4bbb1cdecf088e087d18cf8f5a0fc9e86c2839fccaf80130002020196dfc5b6fd8283eee4b9b195bc8baf98c2cab4e696c9da800a00020229f993a3bf94c0b5de89f1c9ac898fa2b894f5dceabadacba00000020204c99790b1e0f9ec968b92f7b2ebd5fdced2b79cfa9fcad3c0111101020590d9ddd79fdff9eeb8f987b8e3affd95bc8b8fc0959ed780120c010208cf83d384809e8cee8ba4d2b79eaaecda9bcfba87d0efb0800c0c01020585e3a6bfbbd784cac3b18ff8d0b1a2e1f482fbdebf86c080130a010203f790ecd3ddd8b3f4ab90d594ade59ddf8496bec88af088c01305010201e8abb49fe392a9f4e5eaa2a1ada1b0c4d1b1d0ece0af84800c05010205e5c1d895affbfbe5eeeee4fbe8bb8c99bfd4a3f4e2b0ddc0010101022fadbae897a4bd91ac958e82e888d6f7bc95add2cec1ecc00a0001022e8cabba95d6ef92f7eee2fbb5fef599eff7a6918fc5b49ac001000102078bb9df979c959befd8c3fc87c68cf5fecb90c5afd988d4801111000202bdd888e4fc87b6d188faf9f0a6e0b2a7a69386d2fafab080, 0x19bce8ed790b1e9fae2989582dbcdc999e9c1800b0001023ede9f80f7eae4acc09ee0ffefc584cfafbb98c7cef1f18a8ab6080001022bb9dbf7dfcdc2e4ebe8e38ec9bc9ec284a6c89ce5cdaf999da61111000205e1a1a388cfeaf396d4da85ee80fcdff4acadccd889f7e3c59a0c0c00021aa2a582bac98fd69dc9e2f1cffb98a5f190bf91f2acf1c096f60c0b000214e3dcd1e1c1abf096d5d6c4cdbdeab7cfdbfdb3c090ebda98940a0a000201adfae5ca84dbcbde899bce88b7cce8e499d48eccda8ce994a60101000219b3ebdf96e2ca9fa8c996cac4be8788b3ddcfed83c6928abfa40c00000220f397bff8bf9cbca6bebbb3ba9afef082c5fecb9bd18afce4cc0b0000024c99d0baee9ca8e3dcb2d8a1ffbcc6949fdfcab7aff4adee96a41e1b8ecc9bebd9dfcd8eafc291efd0f8f29492e9f8000388b4058fcf16e801e6f010d0d824878d3db5b22be18b00029a96cc99b886e2d2faa6fddba386cfe693c5e28004d9c707c8fa02988e01be862383de40f4f10ebb8330db8e007cc8f2b28efd969ac39d99909f9ec587cee5b28034a8e46de0ff6fb1e832cdbb1a93cf3685c638c6e11ccffa000287adf5aadcaecdace196b093f8f4a49e9bfb801313020261dcabfda0caf2d0bbb79eceb3f5cfdffaa98ec6ea8eaed61312020203bac4d793a9908c9cfb8afa8bb2bbb8ffaee7adc7fba0c3d01111020203babd898a, 0x1b3cfddf2ec84f88fef8eedb1b6b0e2859bf591b4b6130c02020bd8f6e088b6f4c18a9abdfdd0eb9bd2d5fcb58fafcce7f6cb840c0c02021899869395e29dd681f5da87f2cfabc6b180f8dee3ebc8b3878c0808020217cfbfb0efbf8887d9d1bfa8bcf7aae8faa4bfa0d482c9839bc00907020202ecccc3cfaedebdd2b2eafb8df2ac819fa5ee94e294a5a180a00d01020201cc86d4dd82a5ebd1dcb4f3b5cda49b9791b5eb9dc89bede3e80601020219daecc9968cc0c5c8e8c4faaa979fb2acc1ffb5e3f087a0ccd80c0002022adba4fc84c1e8899abdd9c8e7d3f3cd94bde2f495f9efc1b2980b0002023bec96b5a1c1bdb39dcef38bf3c3dcac9aa3c39caff2ced3fce8080002024cc2ef92c38988b8e5b1a1a2c19ac8c294c2b2f3b4d28a81e6a0111101020395a9d9caa08281b7c3cfc6fafdc7d3e2f3fae894fe9bc8e8da130c010203de9bfea1c98b8ce4d1b89095c5aac696b2f6d59884e4b3b9ac0c0c0102299d99c6c3b1d5b4d1fed4edafbe95c0def5d9c083a5bcc59e860909010204e9f6fcd380e994c2e2ae92e3bcdfa0dae9b9dca1bfbe98d6d20907010202ed849be3ebc2f3cdaba484dab9ffc8df99f4e79ababd85d4fa0601010208c9a095c8f1bbc095a69899f5878283b4fae8b1d3ccecb6f1e60101010211bfb097fb92a9a1b5c2ca8b9d8393bedcb8b8a2898b8ab6e6c40c0001022cd8fc9fc1909d, 0x19d8ad0f4c9e7fdd5d8b186bbc00c0c010268cfe4c3c1f1909db0def3ebee900a0a010239d2c3b6e9b3acad8781b3fc81d00909010243a292fca891aaaebcd6968ddde0080801022786bc968fefe6a0c3fca898f0b20b0701025f9cee8eacddb9d6edc8efe5e7c00c0101020ef3ea9ebbc58af7b1b2e9c480800b01010203b2b6abfefaad83cfaaf2d78e9dc00801010208a6f1eafe8bc5f2e38ed199becab40101010206a480c48683af94e28ed9b3b1bea20c0c000201bc9effd7d1d0b7c6d2fa97e0e0800a0a000270cc9f8fcceae3fbecd7e1d380800909000248928ac4ed8fabd9ac9c88fce0800b07000266b2c1b7dfd7a8f8bee9bbb790800b01000201f9e0a481bbe6d3b0cfc89beb90800901000220a2c4d68f9e82a2f3dda1b680800801000208b5f5dfa8bfefb4e4e1bbc8dca08001010002069fb3a7d191a3bec6f6bdd493a0800b00000201c8ffaeecb4accdb98ff8a9e6c0801e23e7ce86cde3e0800010020902000603060402c3c40583b924800282ca0fb3a021b1df3d88de2f92c90008e787dd9eb1b28ccd83e9bda08ac1f1859eeab5d38202e7f305a3bc03b29c02a5f221d5c840c68108f3a330fcb40004d4c3d5d9a592cc86c19adcf89a99b5c5fb90d9abb81492800df3d523dd8f2194a127fcad17ead64996ba42a1ca0001c68fc9ba9b9ec7abf2efe68c8d86f8c5ded39cfa1111020203d8e0fff1, 0x13ef536c40789c703e3f820d6b74498c625a08104d6bf0007f4b9ff8191c5efb080130c0202329fecb48b80ebafc0cf9fefd7800c0c020245a1ffbda6c6cfde83bdcbf7cca00a0a020220dbf099ca95dee0edc39efeaba009090202389fc2af8390dbd7d695a1cc93c00808020259a4a0f1d2be8994b0efa2e786c40b0702023d98e9b99e86e4f99d928a80df800c010202278bbaafe1e6ffb5d8b982d180800b01020203e7d8a5fea18b91a9d599d9e08b800801020207988393c6e3bdd9ac80ffa6b0d6a80101020206c7c6ca82c8dd9f95eca8d4edd4a4130c010225] private def node1536:Certificate:=PackedParametricCertificateData.decode 11 data1536 private def node1537:Certificate:=.split node1484 node1536 private def data1586:List Nat:=[ 0x100000a120c0c0c1109090913080c0809080801010100000a061111130c0c0c11090807080608010d00060001000a1111130c0c0c11090f080807080608010d0001000a1111130c0c0c11090f080807080608010d0001000a0601120403020202030804010400020306041111130c0c0c08060f030d03030211000b0002000a1111130c0c0c090908060d03030211000b0002000a1111130c0c0c090908060d03030211000b0002000a060b0208020212000c0412031204030202020313131111130c0c0c11060b06060613020c0201010a13131111130c0c0c11060b06060613020c0201010a13131111130c0c0c0b06060613020c02080101010a060b020802011200300436030402030200020302030101131311110c0c11060b06080606061304080101010a131311110c0c11060b06060613040c04080101010a131311110c0c11060b06060613040c04080101010a060b0208020112003004360304020302000203020309020602010603060310040002020603010e0402020206030d040906010203060313130c0c10081307090711060b06110110010913130c0c10081307090711061006110110010913130c0c10081307090710060c021101100109060b02080201120030043603040203020002030203090206020106030603100400020206030702040202060306030e0402020206030d04090601020306030101, 0x1b78aafa7979e96f6940b0002022c9da4dcd59faea4fb82a3d7ac0a00020202af87abb693db9dc583bafc8e800100020204ec999db0f5a2ba9f96fbc1f0a00000020221e9bbc2a3b0eee8f2ae9491d00b0b010248e3f9bd94a4a0b083c1fecb940b0a010245d7f281949a86c0fca192fd800a0a010255c9daf1ba95ea85d398a1c1c40909010205d6c6e3f6988fca8ff0bdcbbc0808010201b782f9e8f1fcc9ff81b6e5cf8c0b01010204d98199a8f1f2b683bfbb88afe00b000102029ae6f5e5898cb78ab0db87b5bc0a00010202a6a4d8dba6bacb91cde683cce00100010203cb8b9b88dcb8fac487a980d1f40000010201dcffaccd95b48cb78a9ccad5a00c0c00025be7d6eca0cbcdaa8ee6dadce00b0b000234b6aaf1acdff189a490a1a0e00b0a0002039ced9aa884deaaf5818f8588c00909000213e2b990cca1fb9b80fc83e7800b01000202b686dffed8dfacd5c883e589c00b000002069289d185959ccfc7bec4e3d7800a00000202ae91eec3d6a7e6ccf89a92d6a001000002029f87a5b4a4a5a6dee59fd3e1e00000000203a0dbb2fe80c2efe895d789bbe81e19bde9f28cb8a000011204030202020308040104000203060407020402020204060603020206030804010d10090e040603100308020002020204130c120c0c0c11090f08090808070801010100000a120c0c0c1109090913080f08090808010101, 0x1daf9b1a4b7ead4b28bccb1d4b89abdf9cfb0ebd3effce00a05010204a3e0a498ec87a58fa899e083dcd6e6cdf78bae87ccd2a3a80501010214dfaee7f6cdceecefa097ee96b0d79d84e693f3dd8da5a2800c00010220f3eb9edef1ade6b5ceb8a394defda6f8cfafb2a5c59ac00800010202b292faebb1d4e3a8c1b5d59393f28ae18fd290d0f0f7bcc00c0c00027be2a389a3f989c4ab8abdebcd83b1ccf98188f281d8f6a00909000220b7d7b293e7c8aef2e2cca1c8ccb6a6c3f2ba84dd8c9ba00b05000204839ae6add0b5db9aeccfda8f968691f8fcf9fdf3d4abe5800a05000205b4d0bce6888e9f8e82a9a9c1dcc1fe9b93d5b7d6e1bdf7800501000214c6e5b8e982b4fefafc9aaad9fbd1a6818ef28d868097ad800c00000240c8bbb880f4a8cdc8d6d0e5ceee85e3dbd6c8cc8395e3800800000201839b9dce978b9a82e2decd8ac393a4b8f3ab818091d6fc80000000022cc4e2f1be84dae8fb85f1c9979ad5d4f498aecfc9e3dcc01e26b0c3fd80aefe9cbba0fc818c81e3dad8a00032cc76c708d5d004e2b9209abc40f5812988d003fb950006b1c5ab8dc0c6bdb8130b020235a7f68c91e699b7af86f5caa4130a02020ea4f7bcb380dbdff0cea0cca40a0a02021bddb6e1efc4d0b799f2c0cc92090902020a9ef3ebdcc88cf69ffcf9c20808020202b0b78fd5edfccc83a7b4bcd7900b0102020580d7a184, 0x1a6a4b4ca9a83f7b5ddbcabec888d918003c3df06fcd204edae04dae712fcfc25ef892fa3a14189fe00029fe2c3e7ecd383d9cbdc98a8c4e8b1c996b680478ba3018dfcbe158d9b3fecd722f5f445d1dd0cf6ac1ce5da0015d0ceeafe95d1b8e1e5e5ec86ea80bcc7ce800c0c02020182b494adc596d9a6fb80c8c8e9d6c3cc95d98ae8f1a2f7b00a0a02020afff381af9bb5cc87dea3c78fb4ab83e4939dff958f88b0090902020edcbfcddca681ccaae8b6c2c9dd8aa794f6c6b5a0b1a0e00808020201a1b1e6e2f6abf6f5d4b3f4c6a2e6c58bddc9eb88f5b2a5de0d05020203c2cbe1a0aae0c2aaecf19cb8a0d9e8d0d39bd3bdc9f0acc00a050202019cd39ab5cdda98c4c3bcc7dcfbfe8bfcfa9493b2feee9e80050102020cc6e9a580eb94928be2a1ec9e87d1aff2b8c8b6fe9e96f0f0010102020285efe6a4d989fed6d8d2c5a28289a1cbaaf2cb8f81bff5820c0002022cb7ead0e69dc5edfd8c99ab99f0cc9b97d2a8d0bae9a1c00800020203ead882bb82babde1bae7e686c78086d78f959387b7bbba800c0c010201c7addc8cae8299d5d5fdf1e9feeafae4bdde9584c1e2bef00a0a01020b84abdacaeaf0ded494fccbe1e3a6dca1acf3fcadb798b009090102389feae08b87b19ed6a5b5c8a896e9eda7ad8ab8e4a7faa00f05010215ab87c1998b8c98ac9bedb2d0d68cbcd7bfd49095dbd9e80d050102018a, 0x1909da1f4c3ddee9c0c0c01025db4e8b081ffaecfd180e5908bd78aba81e6e5c79ee8ea84d4b81109010226828189bda99ab0a5d9b5bee7f2bbd6e4f4a6a2b0e480c9ebcc0d0101022d97b591e8bb8eb78dc2bcfad9efbbc3e6a6dfbfb1eff9b0e3d80b0101024ffe89b3ebd18a959cdfbdaeeffb9683aa91ca99a3eacddcd5b00a01010219d6c8d4c1f4d1c4f3d4ca95f4f88aff8c8393b5ffa5b6d1e8e8010101022c84b1bda4cde8a8ecd8b1cec2bcfb8eedebd9efc2c6cee59fc81111000201a7addaf5d584a4a3c4b7f3ef968ebadede89c4819ed4ec98820c0c00021d8a9281defcb7e1d3fbf7aeefa0dfdbbad0fad2ad98a89caac2110b000201e4f5dd8ae6d0d4a4d3dc9eedd39ebdafd3ebb7f584acd784d40b0b0002059bb3fcf8e5c1bbae97edd3c0a5d3a887bad9b9d5d6aeb1aea6090100021c939aa792b3a2f0f7cda3c2ee8ec0d1cdca9bd398efbad198900701000233ebf283ace0ee84f1bb8aa48aa5afb581f0c0b9a8ad91b4c0060100022492b1a2fcb6c297aefcdde4a8c4e88ec4cd85bbef8fed91aee00101000221ffb2908b83a7959887c0c3ecd0d692b89390afdbb6d0cbb0a81e47878b9dc9b196a6a6dcbbdb81f3edaeed81ebda000a02040602020401080401040002030604070201060002030804060602080002030a0439e60187cd06de9e02dba71fda903fa09d2c899208cbd70008fba9a3, 0x193fb02a5ef0fcfa421eeaf3ec4982dfef9001896e082a4cd8cee9298aed7c1b58bacaeeb88a1bca84ee730e10d809403cab12190b83efeb50ce5b331dbc0000c99c4afc0a8918482bae3bdc9c39e8d95bbcde5ace847ccd9018da3f62eb8f132bfdb248cc247989d1791ec1ac8d0001ea9cae19be3a1affdb2e0e8ca829fd3ebbff69ab81313020229bec7b8c0dcc4a7f1f9c6f582b1d1d8e7be9ad5dd99d693fe130c02022698bac0d3f4a5d3cba5c5988fe881efad88c29faee9f1a3980c0c020228ffb881b9e8a384fcebe88995d5cfc9bebadba5aba389eaf7c6080802024e9d82c09e86c8fca1f2b9d0f0ecd98ccca2b9d8fd9eda94d88e0907020204b3cbefed82f8e1aea58684a8a4ab95e585f6f1b9a9f7ddf08c0707020206aece8faaf38cb0e8b0cd94f9bc93f0a487c6acdbae87e8d9b60d01020278fb81eda1abde8499989fffef94dfbdd69188ae97b184ab8bec0b010202639df4e7eb8aabedaff0f1bca38788c7b9ae84a68ed882e488c802010202138aaabdb6f1b4c1daf2bbf7efadb8e5878ae084e392f9c9a8ac0c00020235d8db9296e1a6e5e68cf7dda388c2c391c4ce87d995a7d1be80121201022891d59cd4db9f80d5b7fbd6bfe0abdbb592e5c4fef7b1ecde941111010207a1f59ca2fbf1b8b79aee89e182e496f9c88e88c2e497a393e8120c01020c9693f3b3d9e8ecdda0d79d9aa1f885d08a, 0x1bff0a5e4a18f8cfcd6d7d2b286bb95d7d6ebe9fac5a6eec6f3cbafabd79d81ada4b7fdada2c8cdadc89cc08c090101021dd0e4d0b184b2fee2c397edacbadadacabdadcbd1c489e29be6dc98ef958dccaee988d3f9c9c8df97d395edd2abf1c81400010245dbad81bac8d2d1e3ddc9879fd0d780958ec2affeccdafde6968dee8895d4d4b5f7b7a3b283beeaf1e0b6a6d4829fb81413000207f88287a7fab3bbf5bdf8cd83dec7c5bba4b3d6ba9d928ca29ce5bfd4adc2cec9de98f2b3e1b69a86c8a5f290b793a0140c000210f2c3f7d58880fb8ca0e2d6ccd59c98b6da9deebcf0bacef2e3d08cbd9eb4a7a6baf1be9cccada5fcf0c89edb919ec00c0c00021ebbbef2ead8b9f0cec5968299bb9cf3d3eac98fdbeabed3d5e9abc5e0f7ba8cc3b39dc48bd5a0abc899d5dc93a00b0b000204fef1afabf3bb8bad92eaacbc9d8b83f6c0b8d6bfddade5bd96bcfdf19af3e6bfbcaef484e6a6a2b7bb96fbd4f009090002118391e6acb29ad0f5948fc2a1a6e89597f782f8f5bae89debf99a96928792fabcb8bdb8fde39df4a4e2d4a2e3c01401000240fe92ad9c95f0f298edca80e7d89ceaa6a299aae489f8c78ab4e9ec8edfbfd291d4b4a1dcbca5ecefd8a4e0e4b0c4b01e0ff789a7b9b3b1f493c7bbabf6e9ef92e9efefd3eedebec9e8bb918a96d08cff94db8195afd3a3d2cac4000a02010600120314044a902bc201, 0x1e0e698acff88f7e592c1dfe396d29ef4b7acbd86f78fbe9ef395ff90a3c793a299a7ace20907020202c993f7a99be5b691a6acb4948bf0deb4ccd9db979a85c8fb93f887b6c7fce5f0989589d596db8ea2e6ec8dfddfcaa61401020246e3acd5e3dc86b0fedbdbb5e2d7c1f4d5f18bcd92f09ecbd0fe90c5a5e98afed9a7918acecdc7aaa0f7db99aaf2f6a81400020201a5aff1bcdecae8b78bf3bdc6afdff5c395bbe5d1a8c2abbf9eea80dca0bfc9a7f3ed8fab80f7b8b0d59e879ffda68ac8121201020490f7d7babcb4f5acd185d5e7f3a3cfc0bba7b5fbbbfba7b2e1caffbfabe9cabffdabd983fed5f78ed58aa0d7d39bd01111010202b380a7a2d3b5e7fdfdd69b8af79ea4cdadb689cdd7d982d3dcbceff3f3b994eeb5b8d6f9fbf4dea7cbe8efd8a8dab0140f010208d6cc89f3b1b5ba96d2c2fff9b89ca79ed1f889e99eb8bda1b0e688a7c5e0b0868faf97de9ac985b393f7d6e1bc98cc140d01023abef793efd0d4a784dae186dcc68ad8aea3ef8589b88dd0cae692bb8084b7ef87dffd89eee5f69fcad090acfcbbd4120c0102099c9dd9e4edc9fd819dccb99f97e5e2ad82e68aaaaeabdbebb1d98886fcedddd5a1e88e8ee38bb090d28c8c9b80cf980c0c0102139acd9997aedebaae82e5bddaa2b8a5e699c38bf7f987c397f2eaf980e4a1fdf6dac0ca94c8e9f7ece0f3def1e0cb9c090901020de5e4fa, 0x1c095d19085f49de1bc9493ddedb589eec6a4ab9cbafab984fde7b7eab3e5a9b4f5ec8080ce9867df9db4019dc983ff0292f6b283038f81eae101a2a19ca502939b99ca04bcafef8204c79be78c0007d4c6b0ae87e0ca9b84a3e5d1ebd8e88a9ef78188f1a6c795b696a3dad186eadd83dab3cadfc09811fb9d1ac1aa74d0967ad7ad089da80beed73de4c339a3fa000df6f0b285f4fac89ab1bcddb690c5b5c6ca96af97d8bd95b1fddd8091a8f1cee3c08899df8b858784ad80141302020dfb9281dea491b9ddd2a5abc1bff5c5929acbd699bcffd5f3fb9f8ea19ac5e7cfe6afcec78ec693938fd0f7fcb28ae8131302022dc7e7e696afa7a0e2eca3cc8df887d4dff1b1f8d580feb98ab28edafefce8fad8ddf2b7fae7979aa3effe93d3cc80130c020201ef9997ec9d9290eff8d0f4f0c88f918081c0bda2a2c3b194c2ba9796f2decb9eecb0cd8da4daa4e69b9ba0e3dd84b80c0c020206c4add694f3c5cf96e2979cb9e3cfaee0b1ebd4a6d4b7e1f0d8a68d87ca9a9df887a2ebcdceafcf89d584acf194c4ea130902023c9bff80d5cbb5ffe880bbaeeb8d80f7d3928bfcaea7c283a8ad92cf8b8cd082c689b893d0d38ef4f2b1caa9979ace0c09020206ebd6ad92add29cc5d299d7d8a8c292cce1b3afb4e78fc4bde1c6a9dce9d0c4b8fcc8b4bff7bfbec5b0e091c9cda9a0090802020fe29caeedc995e787fa8ffe, 0x1089aaaa209a9eae906e5adbf1bb5dabf73c5f1c401fcd5b6a503dfd8d2cc02f1ecb5bd000bdfd2eee8caa5b0e495d4f190e9da9194c8dfe3c28eb8a3c6d2e8c6afcbe998ae8eb0ede8f4d6abd808b3d7eb0ac8f18a4cebdfea01a9d6820286a8839c03f3dddea543a8ebcd02f79cccae0005e0f1ddcba5a9d2b4deafcbeac0f5e4c5e1a0b4bbdbb8dbdd9ff1ee9ebda6b599d1a29fc991cdcba004a2b6e8d408c0c6d5d1049ecda5c801c9cfadc6029697d7c704a7f39f9e028febdca968ce9fbd001190] private def node1586:Certificate:=PackedParametricCertificateData.decode 10 data1586 private def data1635:List Nat:=[ 0x1110809010801010111000a1513150c0c0c15091109110809010801010111000a06150f130c110b11090c0911080a000900080001000a150f130c110b11090c0911080d000900080001000a150f130c110b11090c0911080d000900080001000a060112100602020603080401040002030604150f0f0c11090c0911080f030d000b00060002000a150f0f0c11090c0911080f030d000b00060002000a150f130c0f0c11090c0911080f030d000b0006000a0610020b02020c0006040a03120404020106030403110d130c0c0c110b0907060613020b01080109000a110d130c0c0c110b0907060613020b01080109000a110d130c0c0c110b0907060613020801010109000a060602010e00200324030404010600020304030101110d130c0c0c110b0907060613020b01080109000a110d130c0c0c110b0907060613020b01080109000a110d130c0c0c110b0907060613020b01080109000a060602010e00200324030404010600020304031204010202020310040002020603010e0402020206030d0409060102030603110b11090c09110811070c070b0613020f0009110b11090c09110811070c070b0613020f0009110b11090c09110811070c070b0613020f00090610020b02010c001e0422030404010600020304031204010202020310040002020603100402020202030e0402020206030d04090601020306030101, 0x1e79aa2ac0c0101021fb49dfde386b3e9f9dbcca6caafb09ed5ee090101020695bec385e5c2f2c7efc08897ccfee9fae9ee0101010203a4d7e693fcfc84a2a5ac839d85a6d6c9b080110b00020fdbc2b5d6f4ed89aecf95a9d68ccbcdfba0110900023496bae6bf9fe5b5a587e08cb6e79999f3e00c08000204ed8be1ba9fb4b9bff3b4c5fdeaa29dd4bbfe090800020ffbd2cbb99cf7a3b29fe5f2bbf2e2c7c3c0ba1301000222c3d9ddb9ccf685aef0d4c5939eebceaa800c0100027499f49486e3e5d8d8eb91cce98085f2efea0901000206959ee5d9ad9091b9a6d4f5d5fcfaf39cc7fe010100020391df9da2f3efcff0dcadddcd87e9b8ad81801e0de3fdd0c3acb9b2b7b4afb0000a02040602020401080401040002030604070201060002030804060602080002030a040c0c110b110913080c08090813010f01090101010a0c0c110b110913080c08090813010c01090101010a0c0c110b11090c0809080f0513010c01090101010a060c0c110b13080908090701010b000a00090001000a0c0c110b13080908090701010d000b00090001000a0c0c110b13080908090701010d000b00090001000a06011204030202020308040104000203060407020402020204060603020206030804010d180a0e060e0402041803080200020202041513150c0c0c15091109110809010801010111000a1513150c0c0c15091109, 0x1f5e98fda94abf6a391da8ef8d5a9dfed800101000213b2b2c48691f6aec989d3f6b9a0d99ba5801e6ee9f483c7abddcea6d880000a020106001203140421b37d920cdda7099dd80296bc04f7bd5aa6ba16be970003a2ef95e6b383dbc7d5c491de8037bfc370a1f60ab89c07b1d635fa906cf2f30994c9059ff7000ba7fcbfdc9cb8ecebd6a7b0e00c0c02023cf5abf497d688fa8e9b80c7ae948ade8aa0110b02020fe4a383baa1c6d1c1d585b1ca9ecbc7cdc0110902022ffa8daa8daaefe59d9da3bd908eab9db180130802020ce28f8da6a6e09bcfa28c9aa5a7fe9bbaf80c080202059ec391afce81b9e98482e1fc97ebb4d4d6c6090802020fd4c699ab9fb0a389e1c3d8aaa2e1a988c2aa1301020213fcafa2c1cb8ac7dd9587c5dca697f6efe40f010202139596dc95d1cdefcf939fe0c5cac3938aee0901020206a0f9e6c092a8b69d99cad3cba0dec4f8c2d20101020203acf8ddefbbf3dcc8db97a09782e58ff98ea00c0c01023eef8efcac818bdbd3eff8dee8839189e9c0110b01020fe5d098989da3dfb3e0c1e6b8e886f681e01109010230b693b997e7dae5f89dcedd9e90c59ce9a01308010207a3aaacef8b94beb7cef4dfb4ab8ba6a1c40c08010204d088a699becae7eec1b0a8b4f6cbdfd884ba090801020fd39cdabfd1d7eda5a2b5f297b9fd82af929a13010102258895cadc868cca8e86dbaa95a8, 0x1cae0140902026bb1cb91a8abefd3aa9686cfb0b4fef1fd80110902020381d8ddecebb5e091b2e191858acba4b3e00c080202138cadc3a7dc99ebcbdacb87abbcb1c5f2e80908020201858f8cd996f3a7a2b181fbb695ade9f4d3981101020206b98d84aef8f0efbb83f1fcdbdbb7d88d80080102020582b6d5c1bcfe83d3ad8cc6a3abb4c891f20101020216dbc09bfab6cef59cb8c0f4a486aba680da1413010208ff80c4ceabbcf7a3f3ccaf8ab99d93f5c0140c01020efcc1f3f9ce93b7caf3e4f5c1d0adc99e800c0c010201beb1c38396a5feafcde5abe89493fee280110b010279c5db94c0fab0e4b7b59efe90ec9da9a0140901026ac5cdb6daa6ec8ef2a7a49de6c0b2a5ecc0110901020398d1e8c3a7b2f1d0f9fdf38497c5e497c00c080102139698f59680f5cca9d4948deee7b1b5e780090801027fc7ac87eab49f92c1c0ad86f9a2c3c2d3e01101010204ff99b78abd86bfd5a8a0c4ea84bb94bfe00101010216cd9eecd5beebb7ebf1e7c5b6e29ce2f8801413000205deb293d3e9b0d2c097fbf5b2dbada3d680140c000229928ca6f7a4ce859bc3fdade78fa6b58a80110b000274f7dcca87ed8adfa9a0a680a38afec180140900026dba8bbcc88d98dad7ac90fbc09fa7a0a6801109000203ccb2b5a5ffcab9f5e2f5ee9f95d3e0a7800c08000212bad2f5c3de8994c99dfe99c4d9dce68b800908000279, 0x147e901c4b403a8c40a82e20296a605a3c151a99e1bd2dd0034c5e3ecb9939a8cba93a0eca01483dd2ad4be03d3cd16a0ed2ed8965eeab102d8890ac5a2007be6ba96ef9cbae39bb8a6e0141302020aeafcfb9b9797eaef8cccb5938290b6c0800c0c020202b4b8f2ae989b8191a9aeac898991d586e0110b02027b9c958981c7dda5e6e3b98ec0e2f7] private def node1635:Certificate:=PackedParametricCertificateData.decode 10 data1635 private def node1636:Certificate:=.split node1586 node1635 private def node1637:Certificate:=.negative 1 [(1,0),(1,7)] node1636 private def node1638:Certificate:=.split node1537 node1637 private def data1690:List Nat:=[ 0x1ccae1b0499aff2c7a800120d150c130c11090c0913080c000800060001000a120d150c120c11090c0913080c000800060001000a120d150c130c11090c0913080c000800060001000a060112040302020203080401040002030604120d130c0c0909060d0306030d000c00060002000a120d130c0c09150609060d0306030c00060002000a120d130c0c0909060d0303020d000c00060002000a0612020806022a0012042003120403020202030f0d130c0f0c0f0a0c07060607040b010c0008000a130c130b0f0a0c07060607040c010b010c0008000a0f0c130b0f0b130a0c07060607040c010a0008000a0612020806012a006604740304020302000203020301010f0d130c0f0c0f0a0c0706060d01080106010c000a130c0f0a0c090f080c070d0606060b0108010c000a130c0f0b0c0913080c0706060c010b010b0008000a0612020806012a00660474030402030200020302030402010402020310040002020603010e0402020206030d04090601020306030f0c0f0a0c09130709070d06110110010c01090f0c0f0b0c09130709070d06110110010c01090f0c0f0b0c09130709070d0610010d010c01090612020806012a00660474030402030200020302031204010202020310040002020603100402020202030e0402020206030d040906010203060301010b0c02020202030702000202020406020002020204, 0x111080c080c000b0001000a060112040302020203080401040002030604080206020404030404060603020206030804010d1c091406060506041c030802000202020456a706af01b6b201daa045ec9845ec9702c0d00bfea80041c1f682a5801212020203bdf3b1c9f9b585f7aff01511020201bbe3ab8d8fb7cbc9ff84bfd0150c0202048cc8a683d3bf9eb2b2b68290120a020206c492a1809c94ccf1808009090202029997b8ee8d9690b7b080130802022396c4cdd2c88e8a9ce9fd801502020259dee486ca95fcbce78499900c01020223e6d58aa0b7f4dd9a8ad0c0080102020182e7ddacd7a5feafdca693de010102025bf6ffd9d38a90b0bc99b8f612120102069fa2e6a398edeaf9fff01511010201f2c1aceade9aa296affcda90150c010204b0dcefb4fab7ccf597b7f5d0130801021fe9aef69ae7f2b2eaceaf80150201022e8fa89bc0f3afa5cae997d00c01010213f5f6e6ba8ad6a9da93f2c0080101020199bda889c08897f880f4e1d601010102559db99df1cad2eb80d4bbce121200021bef9df1e083eda8cff015110002029fa1d098b7b8e6a8cfc59c90150c000204c58dd6c3da8c84e2a7868fd01308000220c5a0f9ddbbe4819bc0bf801502000213f6a38a858ea0a8c1daadd00c01000205d9f5dad4aec2f1dbcb9ac00801000201acdecae4e9e5a395eca4efb6010100024ee7fdc38bf5c0df87ab, 0x1800101020212f2e2dca88a9b8edaead5cad09a92e4d195e58aae80080002020feca8809bb6f7c78eb082b293ebfca9ed99fac9ada01212010218ef84c4a8f2a7b181f0cbc4a8c58896e5e795eea00c080102558dc9ebc2a9c0e884bdbbeb858295d5ffb5b4a8fcaa0908010217b3a0d0a5acedaaf39cd1bcaa9ba9afa7d8b59a98940f05010209c0e2c8c0eacfc58ee4b599cebecd8bab9b80d7fca80c01010229f3f1af88cff3a0e4b2b58695cac58db2cdc49291f2050101025497ebf1b2cd84ccd2d18eb797cefb8fb492deeb9fd40101010208c0fecd8596d5c885f6bfbcf1effeacb58c97c0bdd40800010209d8edfa848ad0c59db8c884d0fce9ac808beefef9d00c0800025db0ad979ce3c2a5afd9e6b0adb787a5b7d7fafbb1800908000217b0dddfacf78dcfb5a1beb9db82958ca1b3e9f6d8c00a05000219e9b0ea9c9bd1d785d0d0dadbcacfacaf89c8f4d3e00c01000227c98991a49fe9a3a9e0a38f9cf2d29f818bfe9ef4e0050100025cd7ed8b9bfdc5b0b9d89fc1d8d091d298fc9fded3c00101000207e2ddf6ceafd1a4cca7df8380dddd80e3fce9f88aa00800000203e3d1bdc3b0f0eefdc8cff08cb484afca869ad0c5c01b019cf4cc93c49fd3a7e38392d0d1a5d000130c130b11090c0909090c0808020c000a0001000a130c130b120a0c09090911080c080c000a0001000a130c130b120a0c090909, 0x10289bfface84d89fcbb9f5a2f0d2b2de91d4e2f6b5c00c0800022be7d09dd6c0a5b5a9d686d8d3bc84fbe786afb3d0dbc80905000219c9ad8bb1d1f2e7c5d9bc8a9994b4dd9be48789948ea00c010002138981ddc0bbb6e7f689ca8ce88192abf4b0ca97dc8df80b01000207c9f5cd808ae1f3d8a8a6b4dba1bddae3eb88d3b7b2800101000209a1a4e9e7b9f1a7adbc8ba699e58def8babaeb0ddf9a01b4586be9bcaccedbca6a4d8f0e4e4a9a0000b020902040c0304040108040104000203060408020602010c000404100408060706020e000804160402cf108262bee73adfbe0a85c10a85c24ff7901a82c20030f294bf8e91999e86cfabedecb9c1c003fec504d78203b18c03e58a42a0f542a0f60be3a30edacb0011bb93d3b892e599c782c6879b8793a00195f8be0194f7d536b73fb165d1cb65d1cc0bff1083000191e4b297e3a3c2acf2ab85f39f83e0130c020225b3c7b2d88cb8ece2a9e68ff9f0d9aabc9a9a800c09020207a69fd9acdbe9c7deacfdb7e3eafdbbf6a2d9c00c0802024fef84ce99b38eb5acd5ad83b9d4d7c4f5f1b5c8edd40908020214b095c9869e8df4fac4a3d9baade885cbc0d181e6a00f0502020bb7caec948ba5d3e2a5e78984db97de85a4c0fcded00c0102022cc7c682fffc9eadf5ddafbacef6c7a4b69bbceae38c050102022cf1a09df6fd93e6e7e698ebd3a0c7d5aeeceebdc6, 0x167b88d67b88e69c531ef00018fe7fab086978de8f2a2d7c898f9b28012120202149682c6d28cf1e983b8b4cdd0a7a5b599c4b3bfaaa0120a02020becbfedb38eade3a0d5dbf49d87eaefac84b8d28009090202248cefa3a39e8ca8d0e7fad4deffe68ff5fdd8e7800c08020226ecbeb182b6c1a882bdb689a491c4cbe5fa92ce9f988a0908020204bbacabae8afea2b7ef81f8a68cf2bad5e280c8e9f0f00905020204eab0f39dfff6e1efeaf9de8ead9fa68cc8ee9aa4aab80c01020210dc97cdf98083c99bf9818e988da892d59395d996b2a60b01020207eed5b5f6c5e7db948fd0adfc98c3ef8e9f8facc4b1d8010102020cd2ebca8884e99cdbf7acdca1fec3efbcffceacb886e80800020202e0a188d6d3b3f9b8a8b08b80f5b388ffc5a1c1e283c81212010223f9a48deed7c38cc6ff83a4f0a6d2889ac3bbfcf0c00c0801022990f8d1e3f8f393bae2dcd5e299829ffed5c3d885a5b60908010202c993d5879b80f3d686e7f1b5e8e2a1c3869bccd0d6ec090501020df9dea6fbf9e7b4bddae295c5edbdbfaec1fbb3bec2c80c01010211d6d0fd88bbac9c88a6de88e1cbaa9fe3cee5a2e38a8e0b01010207b0cadb80e69288b8b481d89fc1ff99c9f28999f7fe9c010101020be6b592f3fffd91dfd3b3e897fd8bccceb7d98beaf7c40800010201d59ce9d6ccc6b4a0d580e7d09b92bcaad7c892f4d4d412120002, 0x1ded79a80e5d08013010202369cb3f8a1abeefdb183fca0ac8294d480080102020190f888b4a8bfe0d5d7c3ba8298c2d8ccf601010202038c95fd8cf9eac392cfdf93b3d28de8e0ae1212010209add0b2b8bc84d2f9e5ce84c5f193c8c0140c01020ed39ac4f6faa786e29bdecba5db8fe1bb800c0801020db29ae3d987ecb9c3e3eed0ebb090c5c4d80908010201bda6d39daff09ee1acb09ee0e89feadca81406010202cbc7f9db8da4b4d4d9b2c8f7a89dc5fc80130101022697a2bb98dabff8abee96daefe2b6b6800801010222b989d5fd99cab7d6b1c9a888cad3fea2010101020396b7caa9dabeb9deac9a8ef18fd8bceaca1212000226fcd1b8d4e4d494d597cb9cb790f0c01411000202a3b3c5a0a0e89d98a4ddcaad8da5f1bcd0140c00020e8fac89add3ccf0f6b095ba9eaba0be8eb00c0800020eab80ec9adba6e99d99f988d1fe9d8af3f80908000201b193e5cdb5b8a7aceaccd5d899ecf9b188140600022583abfde4fbf2f8bad2a1b4db98c78d9001010002038e999d90afa99a9ac9f2fe8fdc83dd8ff01b18fdd0aae4c5909bd19ae0000b020902010c00240428045204c60adba502a9d203f3b703f3b84ccbf231ae870006b5c6ec8ee6bfb7e2daf1e0a7fea992afa0058c0eb757d939e3e40785980785972cf5ab5ff4e10002b8c3938383c4bdadc7b6c1858fda99d6e00195ecb20194d7b766e02fe6, 0x15a04e40ceedd06dff8048f93048f944cd9ba34dc870005a6de99ccc2c19980c4f2e0800195e6c60194d8a53fd40d67cdf767cdf84af501b500268c9883fbad9daac49e80121202020592e4dbfff09cdf88b98785d5c3bdd2c0140c02020e8cac91d9ffbaa39ef7eded9af78baf8f80120a02020ee0a8d39b8aa9a3859c8894cf83c080090902020d88d1e9a4fdcde396f8f9ba99c5a0800c0802020cccf3da82a7849ba2c486c0e48c8396bec80908020201b29fec958d918e8581cbebc88c9dccb6b81406020203caaa989093fed0889199] private def node1690:Certificate:=PackedParametricCertificateData.decode 13 data1690 private def node1691:Certificate:=.split node1638 node1690 private def node1692:Certificate:=.split node1409 node1691 private def node1693:Certificate:=.split node1340 node1692 private def node1694:Certificate:=.negative 1 [(1,0),(3,2)] node1693 private def node1695:Certificate:=.split node1270 node1694 private def data1753:List Nat:=[ 0x1c3c98ac0050500022ad287d784b88aa99bf01101000230e7ed818ed8db8ed1e8ef801b06a6878fc1a8000b02080201120030043603120403020202031104080c010e031203100400020206030b02000202020301131313110f0f11091107080706060605060111000a131313110f0f11091107080707070606060511010a131313110f0f11070807070711060606060511010a060b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030e040b0609020006040a03011313131111080f081607130708071606060616010a1313131111080f081607130708071606060616010a1313131111080f081607130708071606060616010a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030f0c000202020301131313110f0f110c1608130809081607160109131313110f0f110c1608130809081607160109131313110f0f110c1608130809081607160109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030f2c0c020206011204120308020002020203010c0400020202030b1004060010031203090c01020002030803080c0608000a030e0307080204000603060306040002020603, 0x1110006061310030202060313131311160d160613061305070511010f0105010a13131311160d1608160613050705110105010913131311160d160816061305110107060b02080201120030043603011104080c010e031203100400020206030101daad01b69706be569a0bfe8b02c1a145ec9045ec8f0062a2f183b7c0131302020189f2afbfd1a79abeb8bef8ee1311020201c49bb6c0fbe5b1eef990cdb6160d02020186ce83d0eaadd3bfffab95d0160802020299d4e4e9a9c0d1a484dab2900707020203a5e2e3c0d3b0b7e7c880160602020692ebe1db9ba7fdbc93c197d01306020235d9f993c584b6b0a5e092c005050202059ae092819acfd8a8bcb00504020209e69e8ea3a1d1ecc88c801101020234e1e1a9f5a0d7cecdf58480131301027fec86f5af85a388ad86fcce1311010201e69be2f0bbb3c4a790c28bd6160d01024596f2a18fe0c5cef0e5ae901608010202ebe1ddf985dc87e1df89b1901606010206c98ac8f6c4d9c39cd4cb9a90130601021df0ee9cc2e5bfdf89a988c00505010209aea2d8aed2fcffb3a7f0110101022fde81de9bb6a2e5fdd0ec8013130002769beeb5dcf0a0bec0e9a3aa1311000202838dd3e7be8fcee08f92d0c2160d00021df1aff1b485b9bdd0d2f2f01608000203aef28ba3b69cc6a5c7d7e4b01606000206e7d3dfb999ddc9f9bfd987b01306000208c6eee6be88f8ee, 0x113131311140d130c0f040d040a04040100000913131311140d130c0f040d040a04040100000913131311140d0f040d0408040401000008061313131113060d04080404010d0006000200091313131113060d04080404010d000600020009131313110d04080404010d00060002000806010f060d0204060124040e04111c0d140a060906041c031313131113060d04060404010f000d000600091313131113060d04060404010f000d00060009131313110d04060404010f000d0006000806130402020202030f060d0202060302040d040a040904000e040e030113131311160d1606130613011100100004000913131311160d160613061301110004000813131311160d16061601] private def node1753:Certificate:=PackedParametricCertificateData.decode 16 data1753 private def data1812:List Nat:=[ 0x10607060502110106010a130f110f0f0c080716060f0607060605050211010a130f110f0f0c080716060f0607060502110106010a060b02080201120030043603120403020202031104080c010e031203100400020206030b020002020203011311130f110c0f0c11090808080706060f0206010a1311130f110c11090808080706060f02060111000a1311130f110c11090808080706060f02060111000a060b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301130f110f110810080f07080707060f02060116000a130f110f110810080f07080707060f04060116000a130f110f110810080f07080707060f02060116000a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030f0c0002020203011311130f0f0f110c1608090816070f071601091311130f0f0f110c1608090816070f071601091311130f0f0f110c1608090816070f07160109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030f2408020206011004100308020002020203010c0400020202030b0403060004030603090c01020002030803080c0608000a030e03070802040006030603, 0x11313110f140c0f0c09090f0606040f02040100000a1313130f110f140c0f0c09090f060604040100000a130f110f140c0f0c09090f060d040804040100000a061313110f0f0c09090f060d04060404010c0002000a1313110f0f0c09090f060d0408040401060002000a1313110f0f0c09090d04080404010c00060002000a06010e020106020204111c0d140a060906041c031313110f0f0c090908070f060d040604040106000a1313110f0f0c090908070f060d040604040106000a1313110f0f0c090908070f060d040604040106000a06130402020202031313110f0d0708070f0606040f021101100106010a1313110f08070f060d0406040f021101100106010a1313110f08070f060d0406040f021101100106010a060b02080201120030043603010d040a040904000e040e0301130f110f0f0c0907080716060f060701060002000a130f110f0f0c09070707160607011100060002000a130f110f0f0c09070707160607011100060002000a0613100302020603130f110f0f0c080716060f0607061101100106010a130f110f0f0c080716060f0607061101060104010a130f110f160d0f0c080716060f061101060104010a060b02080201120030043603011104080c010e0312031004000202060301130f110f0f0c080716060f] private def node1812:Certificate:=PackedParametricCertificateData.decode 15 data1812 private def data1870:List Nat:=[ 0x10f0d0f0c0e0c0c0716060f0607060e02050206010a0f0d0f0c0e0c0d070c070f0607060e02050206010a0f0d0e0d0f0c0c070f0607060f020e02050206010a060b02080201120030043603120403020202031104080c010e031203100400020206030b02000202020301100f0f0d0e0d110c0f08080806060e0206010e000a100f0f0d0e0d110c0f080808070706060e0206010a100f0f0d0e0d110c0f080808070706060e0206010a060b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301100f0f0d0f0c1108080707060f0216000e0006000a100f0f0d0f0c1108080707060f0216000e0006000a100f0f0c1108080707060f02060116000e0006000a060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e04010200020308030f0c000202020301100f0e0d110c0e0b0e090908160716010e0009100f0e0d110c1109160709070e0216010e0009100f0e0d110c1109160709070e0216010e0009060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030f2408020206011004100308020002020203010c0400020202030b0402020202030a0401020002030403080c0608000a030e03, 0x10f0d140c0f0c0e0c0f060e060f020401040000000a0f0d140c0f0c0e0c0f060e060f020401040000000a0f0d140c0f0c0e0c0f060e060f020401040000000a060f0d0f0c0e0c0f060d0408040f0204010c0002000a0f0d0f0c0e0c0f060d0408040f0204010c0002000a0f0d0f0c0e0c0f060d0408040f0204010c0002000a06010e020106020204111c0d140a060906041c030f0d0f0c0e0c0f060d0406040f020401110006000a0f0d0f0c0e0c0f060d0406040f020401110006000a0f0d0f0c0e0c0f060d0406040f020401110006000a06130402020202030f0d0f0c0e0c11090f060d040c040604110106010a0f0d0f0c0e0c11090f060d0406040f02110106010a0f0d0f0c0e0c0f060d0406040f021101100106010a060b02080201120030043603010d040a040904000e040e03010f0d0f0c0e0c16060f060e060f020701060001000a0f0d0f0c0e0c16060f060e060f020701060001000a0f0d0e0d0f0c0e0c16060e060f020701060001000a06131003020206030f0d0e0d0f0c0c0708070f0607060e02060102010a0f0d0e0d0f0c0c0708070f0607060e02060102010a0f0d0e0d0f0c0c0708070f0607060e02060102010a060b02080201120030043603011104080c010e0312031004000202060301] private def node1870:Certificate:=PackedParametricCertificateData.decode 14 data1870 private def data1925:List Nat:=[ 0x1080201120030043603011104080c010e0312031004000202060301110f0c0c0a090f060906130406011000040002000a110f0c0c0a090f0609060f0406010401060004000a1310110f0c0c0a09130609060f040601040106000a060b02080201120030043603120403020202031104080c010e031203100400020206030b020002020203011313100c0c0c0c0808080d0606060d01060101010a1313100c0c0c0c0808080d0606060d01060101010a13131311100c0c0c08080d0606060d01060101010a060b020802011200300436030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301131113100c0c10080f070907060608020d0106010a131113100c0c10080f070907060608020d0106010a131313110c0c10080f070907060608020d0106010a060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e04010200020308030606020600040304030113111310100c0c0c0d080f0709070d0109000913111310100c0c0c0d080f0709070d0109000913111310100c0c0c0d080f0709070d01090009060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d08061202120110041803080200020202030103020004020203, 0x1110f0c0c0a090f0607060c0204010d00040000000a110f0c0c0a09090607060c0204010d00040000000a1313110f0c0c0a0909060c0204010d00040000000a0613110d0d0c0c0a0a07060c020f010701020000000a1311110f0c0c0a0a130607060c020701020000000a1313110f0c0c0a0a0a090c0207011300020000000a06010e02010602020411200d1c09060706042003110f0c0c0a090f06090607060c020701060002000a110f100f0c0c0a09090607060c020701060002000a110f100f0c0c0a090906070607011100060002000a0613040202020203110f100f0c0c0a091306090607061101100110000a1310110f0c0c0a091306090607061101100110000a1310110f0c0c0a091306090607061101100110000a060b02080201120030043603010d020802000403040301110f0c0c0a090f06090607060c020701060002000a110f0c0c0a090f0607060f040c020701060002000a110f0c0c0a09090607060f040c020701060002000a0613100302020603110f0c0c0a090f060906130406011000040002000a110f0c0c0a090f0609060f0406010401060004000a1310110f0c0c0a09130609060f040601040106000a060b02] private def node1925:Certificate:=PackedParametricCertificateData.decode 11 data1925 private def data1979:List Nat:=[ 0x10111000a060b020802011200300436030108040104000203060310040002020603011311130c0c0c0f060906130206011000040002000a131113100c0c0f06090607060c020601110004000a13111310110f0c0c0f06090607060601040111000a060b0208020112003004360312040302020203080401040002030603100400020206030b0200020202030113131311110c100c0c0c0c08080806060a0101010a13131311100c0c0c0c0808080a0606060a0101010a13131311100c0c0c0c0808080a0606060a0101010a060b02080201120030043603040203020002030203080401040002030603100400020206030b0200020202030a02000202020301131113100c0c10080f070907060608020d0106010a131113100c0c10080f070907060608020d0106010a131113100c0c10080f070907060608020d0106010a060b02080201120030043603040203020002030203080401040002030603100400020206030f04060c02120316030e04010200020308030606020600040304030113111310100c0c0c0d080f0709070d0109000913111310100c0c0c0d080f0709070d0109000913111310100c0c0c0d080f0709070d01090009060b02080201120030043603040203020002030203080401040002030603100400020206030f04060c02120316030e0402020206030d080612021201100418030802000202020301, 0x1110f0c0c0a0a0f0607060c0204010d00040000000a110f0c0c0a0a0f0607060c0204010d00040000000a1313110f0c0c0a0a09060c0207010401040000000a0613110c0c11091009130607060c020701020000000a1311130c0c0c1306070613020c020701020000000a1311110f0c0c090913020c0207011300020000000a06010e02010602020411100d0e08060310031311130c0c0c11090f0607060c020701060002000a1311110f0c0c0906070613020c020701060002000a110f100f0c0c090607060c0207011100060002000a061304020202020313131311130c0c0c0f06090607060601110010000a13111310110f0c0c1306090607061101100110000a1310110f0c0c09081306090607061101100110000a060b02080201120030043603010d0208020004030403011311130c0c0c11090f0607060c020701060002000a1311130c0c0c0f06070613020c020701060002000a1311110f0c0c09060706130407011100060002000a06131003020206031311130c0c0c0f060906130206011000040002000a131113100c0c0f06090607060c020601110004000a13111310110f0c0c0f0609060706060104] private def node1979:Certificate:=PackedParametricCertificateData.decode 10 data1979 private def data2033:List Nat:=[ 0x100040009130b13080907130607060c0209010600040009130b09071306070613020c0209010600040009060a0201060012031403011104080c010e0312031004000202060301130b13080907130607060c0209010600040009130b13080907130607060c0209010600040009130b09071306070613020c0209010600040009060a0201060012031403120403020202031104080c010e031203100400020206030b02000202020301100c130b110b13080c08090706060901010109130b110b0c0b13080c08090706060901010109130b110b0c0b130809070d0606060901010109060a02010600120314030402030200020302031104080c010e031203100400020206030b0200020202030a02000202020301100c1108100809080807090607060d010f0009100c1108100809080807090607060d010f0009100c1108100809080807090607060d010f0009060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e04010200020308030f0c000202020301110b100b16090b0916070b070d06160108110b100b16090b0916070b070d06160108160f110b16090b0916070b070d06160108060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030f120d0201040306030802000202020301, 0x11413130b090713020c020701070004000000091413130b090713020c020701070004000000091413130b090713020c0207010700040000000906130b0b09090713020202070111000200000009130b0b09090713020202070111000200000009130b0b0909071302020207011100020000000906010e02010602020411100d0e0806031003130b09070c06070613020c0207010900060009130b09070c06070613020c0207010900060009130b09070c06070613020c02070109000600090613040202020203130b1308090713060c060c0202020901100009130b1308090713060c02020209011000020009130b090713060c020202090111001000020009060a0201060012031403010d020802000403040301130b09070c06070613020c0207010900060009130b09070c06070613020c0207010900060009130b09070c06070613020c02070109000600090613100302020603130b13080907130607060c02090106] private def node2033:Certificate:=PackedParametricCertificateData.decode 10 data2033 private def node2034:Certificate:=.split node1979 node2033 private def node2035:Certificate:=.split node1925 node2034 private def node2036:Certificate:=.positive 3 [(1,4),(8,9)] node2035 private def node2037:Certificate:=.positive 9 [(5,3),(3,6),(22,8)] node2036 private def node2038:Certificate:=.split node1870 node2037 private def node2039:Certificate:=.split node1812 node2038 private def node2040:Certificate:=.split node1753 node2039 private def data2102:List Nat:=[ 0x11203010b0200020202040f0d110c0f0c08080c040b040904080406010e000a0f0d110c0f0c08080c040b040904080406010e000a0f0d110c0f0c08080d040c040a04080406010e000a060b020802011200300436030402030200020302030e040a080904001204120310040d0209020106040a0313110f0d0e0d110c0f08080806040e02060110000a13110f0d0e0d110c0f08080807070e02060110000a13110f0d0e0d110c0f080808080706040e0206010a060b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204131111110f0d130c110c0f0c06060f02100108010a131111110f0d130c110c090706060f02100108010a131111110f0d130c110c090706060f02100108010a060b020802011200300436030402030200020302031104080c010e031203100400020206030f040c0608060306040a030e0402020206030d04090601020306031311130d110c10070f07090713020f021001091311130d110c100709070f0413020f021001091311130d110c100709070f0413020f02100109060b020802011200300436030402030200020302031104080c010e031203100400020206030f08080607060212041a030e0402020206030d04090601020306030101060601020008030803050602080002030803040601080008030e03060e03060016031403, 0x10d0f0d0f0c0e0c10060f060f021001040100000a100d0f0d0f0c0e0c10080f060f021001040100000a100d0f0d0f0c0e0c10080f060f021001040100000a0601100d0f0d0f0c10080f0810060f061101110001000a100d0f0d0f0c10080f0810060f061101110001000a100d0f0d0f0c10080f0810060f061101110001000a060b020802011200300436030111240e140a1609020424030f0d0f0c0e0c11090e0910060f0607060d0411010a0f0d0f0c0e0c110910060f0607060d040f0211010a0f0d0f0c0e0c110910060f0607060d040f0211010a060b020802011200300436030e0201060202030e040a0809040012041203010b0200020202040a0200020202041111130d0f0d130c110c110213010701010100000a1111130d0f0d130c110c110213010701010100000a1111130d0f0d130c110c110213010701010100000a0610040c0405060302031311130d0f0d130c110c130807040703010111000a1311130d0f0d130c110c130807040703010111000a1311130d0f0d130c110c130807040703010111000a060b020802011200300436030111240e140a16090204240313110f0d110c0f0c08080c05080509040f0206010a13110f0d110c0f0c08080c05080509040f0206010a13110f0d110c0f0c08080c05080509040f0206010a060b020802011200300436030404010600020304030e040a080904001204, 0x1100d0f0d0f0c10060f060f0210010401070000000a100d0f0d0f0c10060f060f0210010401070000000a100d0f0d0f0c10080f060f0210010401070000000a0610] private def node2102:Certificate:=PackedParametricCertificateData.decode 14 data2102 private def data2119:List Nat:=[ 0x111110d0d110c0c0c0808080606060c02020208010a131111110d0d110c0c0c080808060606110202020a131111110d0d110c0c0c0d06080606060c0208010a060b020802011200300436030402030200020302031104080c010e031203100400020206030c02050203020302030e0402020206030d04090601020306031311110c0c0c10080f0709070c021001090009131313110c0c10080f0709070c021001090009131313110c0c10080f0709070c021001090009060b020802011200300436030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node2119:Certificate:=PackedParametricCertificateData.decode 9 data2119 private def data2166:List Nat:=[ 0x1060c02020213010701010107000a13110d0d0c0c090906060c0202020701010107000a13110d0d0c0c090906060c0202020901010107000a0613110d0d0c0c090906060c0202021301070101010a13110d0d0c0c090906060c0202020901070101010a131111110c0c090906060c0202020901070101010a06010f0f0d0d110c110908080d060f040703020201010a0f0f0d0d110c110908080d0607030202010111000a13110d0d110c08080d06080507030202010111000a060b0208020112003004360301010d0d110c0c080808110706060c020802060101010a0d0d110c0c080808110706060c020802060101010a13110d0d110c0c0808080d0606060c02060101010a060b020802011200300436030404010600020304030e0407040006030603010b0200020202040d0d110c0c080808110706060c020802060101010a0d0d110c0c080808110706060c020802060101010a13110d0d110c0c0808080d0606060c02060101010a060b020802011200300436030402030200020302030e04070400060306030d02060201060306030d0d110c0c0808080d060606130407040c0201010a0d0d110c0c0c0c0808080d0606061304070401010a0d0d110c0c0c0c0808080d0606061304070401010a060b020802011200300436030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1040000000a110f0c0c0a09090607060c0204010d00040000000a110f0c0c0a0909060c02100104010d00040000000a0613110d0d0c0c0a0a07060c020f010701020000000a110f0c0c0a0a0a09130607060c020701020000000a110f0c0c0a09090607060c0207011300020000000a060113131308070713060c06090607041100020000000a13130f0f070713060c06090607041100020000000a13110f0f0808070713060c0609061100020000000a060b0208020112003004360301110403020202031313110f0c0c080713060f0609061101060002000a1313110f0c0c080713060f0609061101060002000a110f0c0c080808071306090611010601060002000a060b020802011200300436030e02010602020308040304000e030a03010b0200020202040a02000202020413111111130c0c0c0707060608010101090007000a13111111130c0c0c0907070706060801010109000a13110c0c090707070606090108010101090007000a0613111111130c0c0c090706060c01080101010d000a13111111130c0c0c090707070606080101010f000a131111110c0c0907070706060901080101010f000a060113131311110c08081305080509020d0101010d000a13131311110c08081305080509020d0101010d000a13131311110c080813050c05080509020d0101010a061002090200060306030113110c0c090906, 0x1110f0c0c0a090f0607060c0204010d00] private def node2166:Certificate:=PackedParametricCertificateData.decode 9 data2166 private def node2167:Certificate:=.split node2119 node2166 private def node2168:Certificate:=.positive 12 [(15,0),(1,5),(8,6)] node2167 private def data2193:List Nat:=[ 0x113110c0c130b08080806080106010d00060002000a13110c0c130b080809070806080106010d0002000a13110c0c130b080809070806080106010d0002000a060a02020600060308031204030202020311110d0d110c0c0c0808080606060c02020208010a13110d0d110c0c0c0808080606061102020208010a11110d0d110c0c0c0d06080606060c02020208010a060b02080201120030043603040203020002030203010702040202020311110d0d110c0c0c0808080606060c02020208010a131111110d0d110c0c0c080808060606110202020a131111110d0d110c0c0c0d06080606060c0208010a060b0208020112003004360304020302000203020308040104000203060310040002020603010e0402020206030d04090601020306031311110c0c0c10080f0709070c0210010900091311110c0c0c10080f0709070d060c021001091311110c0c0c10080f0709070d060c02100109060b02080201120030043603040203020002030203080401040002030603100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node2193:Certificate:=PackedParametricCertificateData.decode 9 data2193 private def data2248:List Nat:=[ 0x1110c080813050404070302020a0101010a0f0f0d0d110c080813050404070302020a0101010a060b0208020112003004360301010d0d110c0d0a0c0808080a0606060c02020201010a13110d0d110c0d0a0c0808080a0606060c0201010a13110d0d110c0c0c0c0808080a0606060c0201010a060b0208020112003004360304040106000203040302040006020203010b0200020202041311110c13080808110713030a01060101010a000a1311110c13080808060613030a01060101010a000a13131311110c1308080806061303070201010a000a060a02040602020312040302020203020400060202041311110c0c080808110706010d000a00060002000a1311110c0c080808110706010d000a00060002000a1311110c0c08080811070f0306010d00060002000a060a0202060006030803120403020202030d0d110c0d0a0c0808080a0606060c02020201010a13110d0d110c0d0a0c0808080a0606060c0201010a13110d0d110c0c0c0c0808080a0606060c0201010a060b0208020112003004360304020302000203020301011311110c0d0a0c0808080a06060613040c0201010a1311110c0d0a0c0808080a06060613040c0201010a13110d0d110c0d0a0c0808080a0606060c0201010a060b020802011200300436030402030200020302030804010400020306031004000202060301010108020002020204, 0x10713060f0609061101060002000a1313110f0c0c080713060f0609061101060002000a1313110f0c0c08071306090611010601060002000a060b020802011200300436030e02010602020308040304000e030a03010b0200020202040a02000202020413111111130c110c0c0c130b06060801010109000a13111111130c110c0c0c130b06060801010109000a13111111130c0c0c130b090706060801010109000a0613111111130c110c0c0c06060c01080101010d000a13111111130c110c0c0c06060c01080101010d000a13111111130c110c0c0c06060901080101010f000a060113111111110c0c0c0808060606010101090008000a13111111110c0c0c0808060606010101090008000a13111111110c0c0c0808060606010101090008000a061311110c13080808060613050a01060101010a000a13131311110c13080808060613050a0101010a000a13131311110c08080606130507020a0101010a000a06010113110c0c06060c020202130108010701010107000a13110d0d0c0c090906060c0202020701010107000a13110d0d0c0c090906060c0202020901010107000a0613111111110c0c0c06060c0202021301070101010a131111110c0c060611020c0202020901070101010a131111110c0c060611020c0202020901070101010a06010f0f0d0d110c080813050404070302020a0101010a0f0f0d0d, 0x1110f0c0c0f0607060c02100104010d00040000000a110f0c0c0a0a0f0607060c0204010d00040000000a110f0c0c0a0a09060c02100104010d00040000000a061311130c0c0c1109130607060c020701020000000a1311130c0c0c1306070613020c020701020000000a110f0c0c0a0a070613020c0207011300020000000a060113131308070713060c06090607041100020000000a13131308070713060c06090607041100020000000a13131308070713060c06090607041100020000000a060b0208020112003004360301110403020202031313110f0c0c08] private def node2248:Certificate:=PackedParametricCertificateData.decode 9 data2248 private def node2249:Certificate:=.split node2193 node2248 private def data2274:List Nat:=[ 0x1130b0b09090708060d01080102010d000a0009130b0b09090708060d01080102010d000a0009130b0b09090708060d01080102010d00090009060a020206000603080312040302020203130b110b0f0709070d06080606060801090009130b110b0f0709070d06060608010101090009130b110b0f0709070d06060608010101090009060a02010600120314030402030200020302030107020402020203130b110b0f0709070d06080606060801090009130b110b09070d06080606060c020801090009130b110b09070d06080606060c020801090009060a02010600120314030402030200020302031104080c010e03120310040002020603010e0402020206030d0409060102030603130b10090b09100810070b0710010f0008130b10090b09100810070b0710010f0008130b110b10090b0910070b0710010f0008060a02010600120314030402030200020302031104080c010e031203100400020206030f04060c02120316030e0402020206030d040906010203060301] private def node2274:Certificate:=PackedParametricCertificateData.decode 9 data2274 private def data2329:List Nat:=[ 0x10b090f07090706060202070101010900090601110b0b09130809070606130502020101090009110b0b0913080f070907060602020101090009110b0b0913080f070907060602020101090009060a02010600120314030101130b110b0c0b130809070d0606060901010109130b110b0c0b130809070d0606060901010109130b110b0c0b130809070d0606060901010109060a020106001203140304040106000203040302040006020203010b020002020204130b0b09130811080907060606010101090009130b0b09130811080907060606010101090009130b0b09130811080907060606010101090009060a0204060202031204030202020302040006020204130b0b09130811080907060101010900020009130b0b091108090706010a0009000600020009130b0b091108090706010d0009000600020009060a020206000603080312040302020203130b110b0c0b130809070d0606060901010109130b110b0c0b130809070d0606060901010109130b110b0c0b130809070d0606060901010109060a02010600120314030402030200020302030101130b110b13080c080907060609010101090009130b110b13080c080907060609010101090009130b110b0c0b13080c08090706060901010109060a02010600120314030402030200020302031104080c010e0312031004000202060301010108020002020204, 0x1000000090601130b1308090713060202090109000200000009130b1308090713060202090109000200000009130b1308090713060202090109000200000009060a02010600120314030111040302020203130b1308090713060c02090111000600020009130b1308090713060c02090111000600020009130b1308090713060c02090111000600020009060a02010600120314030e02010602020308040304000e030a03010b0200020202040a020002020204140f130b110b0b0909070d0608010101070009140f130b110b0b0909070d0608010101070009140f130b110b0b0909070d060801010107000906130b0b09130809070606080107010101090009130b110b0b0909070606080107010101090009130b110b0b09090706060801070101010900090601130b110b0b0909070606090101010800070009130b110b0b0909070606090101010800070009130b110b0b090907060609010101080007000906130b0b09130811080907060606010101090009130b0b09130811080907060606010101090009130b0b09130811080907060606010101090009060101130b110b09070d060606110202020101070009130b110b09070d060606110202020101070009130b110b09070d0611020c020202010107000906110b0b090f0709070606020207010101090009110b0b090f0709070606020207010101090009110b, 0x11413130b090713020c020701070004000000091413130b090713020c020701070004000000091413130b090713020c0207010700040000000906130b0b09090713020202070111000200000009130b0b09090713020202070111000200000009130b0b090907130202020701110002] private def node2329:Certificate:=PackedParametricCertificateData.decode 9 data2329 private def node2330:Certificate:=.split node2274 node2329 private def node2331:Certificate:=.split node2249 node2330 private def node2332:Certificate:=.split node2168 node2331 private def data2383:List Nat:=[ 0x1070806110108010101000009151315111509110708061101080101010000091513151115091107080611010801010100000906151315111509110708060801090001000000091513151115091107080608010900010000000915131511150911070806080109000100000009060112100602020603080401040002030604151315091107090708060f0306030403030209151315090907080708060f03060303020b0009151315090907080708060f03040303020b0009061404020600040306031204040201060304030f0709070b060606130211020b0108010900090f0709070b060606130211020b0108010900090f0709070b060606130211020b010801090009060602010e002003240304020302000203020301010f0709070b060606130211020b0108010900090f0709070b060606130211020b0108010900090f0709070b060606130211020b010801090009060602010e00200324030402030200020302030402010402020310040002020603010e0402020206030d04090601020306031513100b150910091008150710070c02081513100b150910091008150710070c0208150f150910091008150710070c02150108061404010600100312030402030200020302031204010202020310040002020603100402020202030e0402020206030d0409060102030603010107020102020204060804060018031a04, 0x1140f1308110809081107090708010701010109140f1308110809081107090708010701010109140f130811080908090708010701010108060a0201060012031404130811080908110709071301090101010000091308110809081107130111010901010100000913081108090811071301110109010101000009060a02040602020401080401040002030604070201060002030804060602080002030a041308110809081107090713010901010100000913081108090811071301110109010101000009130811080908110713011101090101010000090613081108090809070606010113000f0009000913081108090809070606010113000f0009000913081108090809070606010113000f0009000906011204030202020308040104000203060407020402020204060603020206030804010d10090e04060310030802000202020415131511150911] private def node2383:Certificate:=PackedParametricCertificateData.decode 12 data2383 private def node2384:Certificate:=.split node2332 node2383 private def node2385:Certificate:=.positive 8 [(5,4),(1,6),(24,8)] node2384 private def node2386:Certificate:=.split node2102 node2385 private def node2387:Certificate:=.negative 1 [(1,1),(1,2)] node2386 private def node2388:Certificate:=.negative 4 [(4,0),(3,1),(3,3)] node2387 private def node2389:Certificate:=.split node2040 node2388 private def node2390:Certificate:=.split node1695 node2389 private def node2391:Certificate:=.split node1151 node2390 private def node2392:Certificate:=.split node619 node2391 private def zz552:"s0228"="s0228":=by decide+kernel private theorem valid142:check node142 ctx142 quad142 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid301:check node301 ctx301 quad301 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid142 · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid511:check node511 ctx511 quad511 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid615:check node615 ctx615 quad615 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · exact valid511 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz553:"s0229"="s0229":=by decide+kernel private theorem valid619:check node619 ctx619 quad619 (hinges.drop 1) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid301 · exact valid615 private theorem valid750:check node750 ctx750 quad750 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid833:check node833 ctx833 quad833 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1147:check node1147 ctx1147 quad1147 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz554:"s022a"="s022a":=by decide+kernel private theorem valid1148:check node1148 ctx1148 quad1148 (hinges.drop 5) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid833 · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1147 private theorem valid1151:check node1151 ctx1151 quad1151 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid750 · exact valid1148 private theorem valid1340:check node1340 ctx1340 quad1340 (hinges.drop 6) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1409:check node1409 ctx1409 quad1409 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz555:"s022b"="s022b":=by decide+kernel private theorem valid1537:check node1537 ctx1537 quad1537 (hinges.drop 9) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1691:check node1691 ctx1691 quad1691 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · exact valid1537 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid1694:check node1694 ctx1694 quad1694 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · exact valid1340 · apply NatParametricCheckSteps.split_valid · exact valid1409 · exact valid1691 private theorem valid2037:check node2037 ctx2037 quad2037 (hinges.drop 7) = true:=by apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private def zz556:"s022c"="s022c":=by decide+kernel private theorem valid2040:check node2040 ctx2040 quad2040 (hinges.drop 4) = true:=by apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2037 private theorem valid2331:check node2331 ctx2331 quad2331 (hinges.drop 10) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2384:check node2384 ctx2384 quad2384 (hinges.drop 8) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2331 · first | exact ParametricTupleCheck.K | decide+kernel private theorem valid2389:check node2389 ctx2389 quad2389 (hinges.drop 3) = true:=by apply NatParametricCheckSteps.split_valid · exact valid2040 · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.negative_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · apply NatParametricCheckSteps.positive_valid · first | exact ParametricTupleCheck.K | decide+kernel · exact valid2384 private def zz557:"s022d"="s022d":=by decide+kernel private theorem valid2390:check node2390 ctx2390 quad2390 (hinges.drop 2) = true:=by apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · apply NatParametricCheckSteps.split_valid · first | exact ParametricTupleCheck.K | decide+kernel · first | exact ParametricTupleCheck.K | decide+kernel · exact valid1694 · exact valid2389 private theorem valid2392:check node2392 ctx2392 quad2392 (hinges.drop 0) = true:=by apply NatParametricCheckSteps.split_valid · exact valid619 · apply NatParametricCheckSteps.split_valid · exact valid1151 · exact valid2390 theorem certificate_valid:check node2392 constraintsNat base hinges = true:=valid2392 theorem nonnegative (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i):0 ≤ slack t x:=by unfold slack apply div_nonneg · apply check_sound node2392 constraintsNat base hinges t x ht0 ht1 _ certificate_valid intro i have hC (j:Fin 4):0 ≤ linearEval (constraints j) x:=by fin_cases j <;> simpa [constraints,linearEval,Fin.sum_univ_succ] using hx _ exact hC ⟨i % 4,Nat.mod_lt _ (by decide)⟩ · norm_num [normalizationDenominator] end Green24Proof.QuadNearBalanceCase5 private def zz2181:"s0885"="s0885":=by decide+kernel end section namespace Green24Proof.NearBalanceVerified open ExpressionCertificates open ParametricQuadraticInterop open NearBalanceParameterRows open ParityPhaseRows (Phase) open IntegerQuadraticCertificates (Point) def quad0Normals:Fin 3 → NormalForm:=![NearBalanceCertificate.quad0Degree0Target,NearBalanceCertificate.quad0Degree1Target,NearBalanceCertificate.quad0Degree2Target] private def zz558:"s022e"="s022e":=by decide+kernel theorem quad0_identity (d:Fin 3):normalEqual (quad0Normals d) (componentNormal QuadNearBalanceCase0.base QuadNearBalanceCase0.hinges QuadNearBalanceCase0.normalizationDenominator d) = true:=by fin_cases d <;> decide +kernel theorem quad0_slack_eq (t:ℝ) (x:Point) : NearBalanceCertificate.quad0Polynomial t x = QuadNearBalanceCase0.slack t x:=by have h0:=normalEqual_sound _ _ x (quad0_identity 0) have h1:=normalEqual_sound _ _ x (quad0_identity 1) have h2:=normalEqual_sound _ _ x (quad0_identity 2) change normalEval NearBalanceCertificate.quad0Degree0Target x + t * normalEval NearBalanceCertificate.quad0Degree1Target x + t ^ 2 * normalEval NearBalanceCertificate.quad0Degree2Target x = _ change normalEval NearBalanceCertificate.quad0Degree0Target x = _ at h0 change normalEval NearBalanceCertificate.quad0Degree1Target x = _ at h1 change normalEval NearBalanceCertificate.quad0Degree2Target x = _ at h2 rw [h0,h1,h2] exact componentNormal_eval QuadNearBalanceCase0.base QuadNearBalanceCase0.hinges QuadNearBalanceCase0.normalizationDenominator t x theorem quad0_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => quadComponent NearBalanceCertificate.rows d 0 0 false) t x:=by rw [NearBalanceCertificate.quad0_eval,quad0_slack_eq] exact QuadNearBalanceCase0.nonnegative t x ht0 ht1 hx def quad1Normals:Fin 3 → NormalForm:=![NearBalanceCertificate.quad1Degree0Target,NearBalanceCertificate.quad1Degree1Target,NearBalanceCertificate.quad1Degree2Target] theorem quad1_identity (d:Fin 3):normalEqual (quad1Normals d) (componentNormal QuadNearBalanceCase1.base QuadNearBalanceCase1.hinges QuadNearBalanceCase1.normalizationDenominator d) = true:=by fin_cases d <;> decide +kernel private def zz559:"s022f"="s022f":=by decide+kernel theorem quad1_slack_eq (t:ℝ) (x:Point) : NearBalanceCertificate.quad1Polynomial t x = QuadNearBalanceCase1.slack t x:=by have h0:=normalEqual_sound _ _ x (quad1_identity 0) have h1:=normalEqual_sound _ _ x (quad1_identity 1) have h2:=normalEqual_sound _ _ x (quad1_identity 2) change normalEval NearBalanceCertificate.quad1Degree0Target x + t * normalEval NearBalanceCertificate.quad1Degree1Target x + t ^ 2 * normalEval NearBalanceCertificate.quad1Degree2Target x = _ change normalEval NearBalanceCertificate.quad1Degree0Target x = _ at h0 change normalEval NearBalanceCertificate.quad1Degree1Target x = _ at h1 change normalEval NearBalanceCertificate.quad1Degree2Target x = _ at h2 rw [h0,h1,h2] exact componentNormal_eval QuadNearBalanceCase1.base QuadNearBalanceCase1.hinges QuadNearBalanceCase1.normalizationDenominator t x theorem quad1_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => quadComponent NearBalanceCertificate.rows d 0 0 true) t x:=by rw [NearBalanceCertificate.quad1_eval,quad1_slack_eq] exact QuadNearBalanceCase1.nonnegative t x ht0 ht1 hx def quad2Normals:Fin 3 → NormalForm:=![NearBalanceCertificate.quad2Degree0Target,NearBalanceCertificate.quad2Degree1Target,NearBalanceCertificate.quad2Degree2Target] theorem quad2_identity (d:Fin 3):normalEqual (quad2Normals d) (componentNormal QuadNearBalanceCase2.base QuadNearBalanceCase2.hinges QuadNearBalanceCase2.normalizationDenominator d) = true:=by fin_cases d <;> decide +kernel theorem quad2_slack_eq (t:ℝ) (x:Point) : NearBalanceCertificate.quad2Polynomial t x = QuadNearBalanceCase2.slack t x:=by have h0:=normalEqual_sound _ _ x (quad2_identity 0) have h1:=normalEqual_sound _ _ x (quad2_identity 1) have h2:=normalEqual_sound _ _ x (quad2_identity 2) change normalEval NearBalanceCertificate.quad2Degree0Target x + t * normalEval NearBalanceCertificate.quad2Degree1Target x + t ^ 2 * normalEval NearBalanceCertificate.quad2Degree2Target x = _ change normalEval NearBalanceCertificate.quad2Degree0Target x = _ at h0 change normalEval NearBalanceCertificate.quad2Degree1Target x = _ at h1 change normalEval NearBalanceCertificate.quad2Degree2Target x = _ at h2 rw [h0,h1,h2] exact componentNormal_eval QuadNearBalanceCase2.base QuadNearBalanceCase2.hinges QuadNearBalanceCase2.normalizationDenominator t x private def zz560:"s0230"="s0230":=by decide+kernel theorem quad2_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => quadComponent NearBalanceCertificate.rows d 0 1 false) t x:=by rw [NearBalanceCertificate.quad2_eval,quad2_slack_eq] exact QuadNearBalanceCase2.nonnegative t x ht0 ht1 hx def quad3Normals:Fin 3 → NormalForm:=![NearBalanceCertificate.quad3Degree0Target,NearBalanceCertificate.quad3Degree1Target,NearBalanceCertificate.quad3Degree2Target] theorem quad3_identity (d:Fin 3):normalEqual (quad3Normals d) (componentNormal QuadNearBalanceCase3.base QuadNearBalanceCase3.hinges QuadNearBalanceCase3.normalizationDenominator d) = true:=by fin_cases d <;> decide +kernel theorem quad3_slack_eq (t:ℝ) (x:Point) : NearBalanceCertificate.quad3Polynomial t x = QuadNearBalanceCase3.slack t x:=by have h0:=normalEqual_sound _ _ x (quad3_identity 0) have h1:=normalEqual_sound _ _ x (quad3_identity 1) have h2:=normalEqual_sound _ _ x (quad3_identity 2) change normalEval NearBalanceCertificate.quad3Degree0Target x + t * normalEval NearBalanceCertificate.quad3Degree1Target x + t ^ 2 * normalEval NearBalanceCertificate.quad3Degree2Target x = _ change normalEval NearBalanceCertificate.quad3Degree0Target x = _ at h0 change normalEval NearBalanceCertificate.quad3Degree1Target x = _ at h1 change normalEval NearBalanceCertificate.quad3Degree2Target x = _ at h2 rw [h0,h1,h2] exact componentNormal_eval QuadNearBalanceCase3.base QuadNearBalanceCase3.hinges QuadNearBalanceCase3.normalizationDenominator t x theorem quad3_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => quadComponent NearBalanceCertificate.rows d 0 1 true) t x:=by rw [NearBalanceCertificate.quad3_eval,quad3_slack_eq] exact QuadNearBalanceCase3.nonnegative t x ht0 ht1 hx def quad4Normals:Fin 3 → NormalForm:=![NearBalanceCertificate.quad4Degree0Target,NearBalanceCertificate.quad4Degree1Target,NearBalanceCertificate.quad4Degree2Target] private def zz561:"s0231"="s0231":=by decide+kernel theorem quad4_identity (d:Fin 3):normalEqual (quad4Normals d) (componentNormal QuadNearBalanceCase4.base QuadNearBalanceCase4.hinges QuadNearBalanceCase4.normalizationDenominator d) = true:=by fin_cases d <;> decide +kernel theorem quad4_slack_eq (t:ℝ) (x:Point) : NearBalanceCertificate.quad4Polynomial t x = QuadNearBalanceCase4.slack t x:=by have h0:=normalEqual_sound _ _ x (quad4_identity 0) have h1:=normalEqual_sound _ _ x (quad4_identity 1) have h2:=normalEqual_sound _ _ x (quad4_identity 2) change normalEval NearBalanceCertificate.quad4Degree0Target x + t * normalEval NearBalanceCertificate.quad4Degree1Target x + t ^ 2 * normalEval NearBalanceCertificate.quad4Degree2Target x = _ change normalEval NearBalanceCertificate.quad4Degree0Target x = _ at h0 change normalEval NearBalanceCertificate.quad4Degree1Target x = _ at h1 change normalEval NearBalanceCertificate.quad4Degree2Target x = _ at h2 rw [h0,h1,h2] exact componentNormal_eval QuadNearBalanceCase4.base QuadNearBalanceCase4.hinges QuadNearBalanceCase4.normalizationDenominator t x theorem quad4_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => quadComponent NearBalanceCertificate.rows d 1 1 false) t x:=by rw [NearBalanceCertificate.quad4_eval,quad4_slack_eq] exact QuadNearBalanceCase4.nonnegative t x ht0 ht1 hx def quad5Normals:Fin 3 → NormalForm:=![NearBalanceCertificate.quad5Degree0Target,NearBalanceCertificate.quad5Degree1Target,NearBalanceCertificate.quad5Degree2Target] theorem quad5_identity (d:Fin 3):normalEqual (quad5Normals d) (componentNormal QuadNearBalanceCase5.base QuadNearBalanceCase5.hinges QuadNearBalanceCase5.normalizationDenominator d) = true:=by fin_cases d <;> decide +kernel private def zz562:"s0232"="s0232":=by decide+kernel theorem quad5_slack_eq (t:ℝ) (x:Point) : NearBalanceCertificate.quad5Polynomial t x = QuadNearBalanceCase5.slack t x:=by have h0:=normalEqual_sound _ _ x (quad5_identity 0) have h1:=normalEqual_sound _ _ x (quad5_identity 1) have h2:=normalEqual_sound _ _ x (quad5_identity 2) change normalEval NearBalanceCertificate.quad5Degree0Target x + t * normalEval NearBalanceCertificate.quad5Degree1Target x + t ^ 2 * normalEval NearBalanceCertificate.quad5Degree2Target x = _ change normalEval NearBalanceCertificate.quad5Degree0Target x = _ at h0 change normalEval NearBalanceCertificate.quad5Degree1Target x = _ at h1 change normalEval NearBalanceCertificate.quad5Degree2Target x = _ at h2 rw [h0,h1,h2] exact componentNormal_eval QuadNearBalanceCase5.base QuadNearBalanceCase5.hinges QuadNearBalanceCase5.normalizationDenominator t x theorem quad5_nonneg (t:ℝ) (x:Point) (ht0:0 ≤ t) (ht1:t ≤ 1) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => quadComponent NearBalanceCertificate.rows d 1 1 true) t x:=by rw [NearBalanceCertificate.quad5_eval,quad5_slack_eq] exact QuadNearBalanceCase5.nonnegative t x ht0 ht1 hx theorem quad_nonneg_sorted (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (t:ℝ) (ht0:0 ≤ t) (ht1:t ≤ 1) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => quadComponent NearBalanceCertificate.rows d p q same) t x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg t x ht0 ht1 hx · exact quad1_nonneg t x ht0 ht1 hx · exact quad2_nonneg t x ht0 ht1 hx · exact quad3_nonneg t x ht0 ht1 hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad4_nonneg t x ht0 ht1 hx · exact quad5_nonneg t x ht0 ht1 hx theorem quad_nonneg (p q:Phase) (same:Bool) (t:ℝ) (ht0:0 ≤ t) (ht1:t ≤ 1) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ parameterEval (fun d => quadComponent NearBalanceCertificate.rows d p q same) t x:=by rcases le_total p.val q.val with h | h · exact quad_nonneg_sorted p q h same t ht0 ht1 x hx · rw [← parameterQuad_reverse NearBalanceCertificate.rows p q same t x] exact quad_nonneg_sorted q p h same t ht0 ht1 (FullPhaseSymmetry.reversePoint x) (FullPhaseSymmetry.reversePoint_nonneg x hx) private def zz563:"s0233"="s0233":=by decide+kernel theorem parameter_bound {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : NearBalanceHypothesis (mass u) (mass v) (deficit u) (deficit (interleave u v)) := NearBalanceCertificate.parameter_bound_of_quad_rows h3 h5 quad_nonneg u v hu hv theorem coercivity_to_eleven_fifths {m:ℕ} [NeZero m] (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hd:0 ≤ deficit u) (horder:mass v ≤ mass u) (hhigh:mass u ≤ (11 / 5:ℝ) * mass v) : (1 / 0x12c:ℝ) * (mass u - mass v) ^ 2 ≤ deficit (interleave u v) := ParityCover.coercivity_to_eleven_fifths_of_near_balance h3 h5 u v hu hv hd horder hhigh (parameter_bound h3 h5 u v hu hv) theorem interval_to_three {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (horder:mass v ≤ mass u) (hhigh:mass u ≤ 3 * mass v) : 0 ≤ deficit (interleave u v) := ParityCover.interval_to_three_of_near_balance h4 h3 h5 h2 u v hu hv ih horder hhigh (parameter_bound h3 h5 u v hu hv) end Green24Proof.NearBalanceVerified private def zz2182:"s0886"="s0886":=by decide+kernel end section namespace Green24Proof.LocalFullFourPairs def compact_fullFour_pair_20_base:CompactPair.Quadratic:=⟨(-3 / 0x1dcd65000),(0xea71 / 0x165a0bc00),0⟩ def compact_fullFour_pair_20_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(1 / 0x1dcd65000),2, -1⟩] noncomputable def fullFour_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_20_base compact_fullFour_pair_20_hinges x y def compact_fullFour_pair_20_cuts:List ℚ:=[(1 / 2),2] theorem compact_fullFour_pair_20_check : CompactPair.expressionCheckPSD compact_fullFour_pair_20_base compact_fullFour_pair_20_hinges 0 compact_fullFour_pair_20_cuts = true := by decide +kernel private def zz564:"s0234"="s0234":=by decide+kernel theorem compact_fullFour_pair_20_representation (x y:ℝ) : fullFour_pair_20 x y = CompactPair.expressionEval compact_fullFour_pair_20_base compact_fullFour_pair_20_hinges x y:=by rfl theorem fullFour_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_20 x y:=by rw [compact_fullFour_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_20_check hy (by simpa using hx) def compact_fullFour_pair_21_base:CompactPair.Quadratic:=⟨(-1 / 0x23c34600),(0x2eed / 0xb2d05e00),0⟩ def compact_fullFour_pair_21_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x165a0bc00),1, -3⟩,⟨(-1 / 0xee6b2800),1, -2⟩,⟨(1 / 0x2cb417800),2, -3⟩,⟨(1 / 0xee6b2800),2, -1⟩,⟨(-1 / 0x2cb417800),3, -2⟩,⟨(1 / 0x165a0bc00),3, -1⟩] noncomputable def fullFour_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_21_base compact_fullFour_pair_21_hinges x y def compact_fullFour_pair_21_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullFour_pair_21_check : CompactPair.expressionCheckPSD compact_fullFour_pair_21_base compact_fullFour_pair_21_hinges 0 compact_fullFour_pair_21_cuts = true := by decide +kernel theorem compact_fullFour_pair_21_representation (x y:ℝ) : fullFour_pair_21 x y = CompactPair.expressionEval compact_fullFour_pair_21_base compact_fullFour_pair_21_hinges x y:=by rfl private def zz565:"s0235"="s0235":=by decide+kernel theorem fullFour_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_21 x y:=by rw [compact_fullFour_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_21_check hy (by simpa using hx) def compact_fullFour_pair_22_base:CompactPair.Quadratic:=⟨0,(0x14821 / 0x165a0bc00),0⟩ def compact_fullFour_pair_22_hinges:List CompactPair.Hinge:=[] noncomputable def fullFour_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_22_base compact_fullFour_pair_22_hinges x y def compact_fullFour_pair_22_cuts:List ℚ:=[] theorem compact_fullFour_pair_22_check : CompactPair.expressionCheckPSD compact_fullFour_pair_22_base compact_fullFour_pair_22_hinges 0 compact_fullFour_pair_22_cuts = true := by decide +kernel theorem compact_fullFour_pair_22_representation (x y:ℝ) : fullFour_pair_22 x y = CompactPair.expressionEval compact_fullFour_pair_22_base compact_fullFour_pair_22_hinges x y:=by rfl theorem fullFour_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_22 x y:=by rw [compact_fullFour_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_22_check hy (by simpa using hx) def compact_fullFour_pair_23_base:CompactPair.Quadratic:=⟨(-0x234810eb / 0x5f5e1000),(0xee36595 / 0x47868c00),0⟩ def compact_fullFour_pair_23_hinges:List CompactPair.Hinge:=[⟨(1 / 0x77359400),1, -3⟩,⟨(-0x821a399 / 0x1dcd65000),1, -2⟩,⟨(0x149a3b1 / 0x77359400),2, -3⟩,⟨(0x37bacb6b / 0xee6b2800),2, -1⟩,⟨(-0x7d4a0d7 / 0x77359400),3, -2⟩] noncomputable def fullFour_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_23_base compact_fullFour_pair_23_hinges x y def compact_fullFour_pair_23_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2,3] private def zz566:"s0236"="s0236":=by decide+kernel theorem compact_fullFour_pair_23_check : CompactPair.expressionCheckPSD compact_fullFour_pair_23_base compact_fullFour_pair_23_hinges 0 compact_fullFour_pair_23_cuts = true := by decide +kernel theorem compact_fullFour_pair_23_representation (x y:ℝ) : fullFour_pair_23 x y = CompactPair.expressionEval compact_fullFour_pair_23_base compact_fullFour_pair_23_hinges x y:=by rfl theorem fullFour_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_23 x y:=by rw [compact_fullFour_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_23_check hy (by simpa using hx) def compact_fullFour_pair_24_base:CompactPair.Quadratic:=⟨(3 / 0x77359400),(0xea67 / 0x165a0bc00),0⟩ def compact_fullFour_pair_24_hinges:List CompactPair.Hinge:=[⟨(0x7373c6f / 0x165a0bc00),1, -3⟩,⟨(-0x4c90c73 / 0x2faf0800),1, -2⟩,⟨(0x3db23b / 0x8f0d180),2, -3⟩,⟨(-0x13335ed5 / 0x77359400),2, -1⟩,⟨(0x4882aff / 0x8f0d1800),3, -2⟩,⟨(0xd2c3611 / 0x165a0bc00),3, -1⟩] noncomputable def fullFour_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_24_base compact_fullFour_pair_24_hinges x y def compact_fullFour_pair_24_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullFour_pair_24_check : CompactPair.expressionCheckPSD compact_fullFour_pair_24_base compact_fullFour_pair_24_hinges 0 compact_fullFour_pair_24_cuts = true := by decide +kernel private def zz567:"s0237"="s0237":=by decide+kernel theorem compact_fullFour_pair_24_representation (x y:ℝ) : fullFour_pair_24 x y = CompactPair.expressionEval compact_fullFour_pair_24_base compact_fullFour_pair_24_hinges x y:=by rfl theorem fullFour_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_24 x y:=by rw [compact_fullFour_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_24_check hy (by simpa using hx) def compact_fullFour_pair_25_base:CompactPair.Quadratic:=⟨(-11 / 0x11e1a3000),(0x2eeb / 0xb2d05e00),0⟩ def compact_fullFour_pair_25_hinges:List CompactPair.Hinge:=[⟨(1 / 0xb2d05e00),1, -3⟩,⟨(1 / 0xee6b2800),1, -2⟩,⟨(1 / 0x2cb417800),2, -3⟩,⟨(1 / 0xee6b2800),2, -1⟩,⟨(-1 / 0x59682f000),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def fullFour_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_25_base compact_fullFour_pair_25_hinges x y def compact_fullFour_pair_25_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullFour_pair_25_check : CompactPair.expressionCheckPSD compact_fullFour_pair_25_base compact_fullFour_pair_25_hinges 0 compact_fullFour_pair_25_cuts = true := by decide +kernel theorem compact_fullFour_pair_25_representation (x y:ℝ) : fullFour_pair_25 x y = CompactPair.expressionEval compact_fullFour_pair_25_base compact_fullFour_pair_25_hinges x y:=by rfl private def zz568:"s0238"="s0238":=by decide+kernel theorem fullFour_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_25 x y:=by rw [compact_fullFour_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_25_check hy (by simpa using hx) def compact_fullFour_pair_26_base:CompactPair.Quadratic:=⟨0,(0x1481f / 0x165a0bc00),0⟩ def compact_fullFour_pair_26_hinges:List CompactPair.Hinge:=[] noncomputable def fullFour_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_26_base compact_fullFour_pair_26_hinges x y def compact_fullFour_pair_26_cuts:List ℚ:=[] theorem compact_fullFour_pair_26_check : CompactPair.expressionCheckPSD compact_fullFour_pair_26_base compact_fullFour_pair_26_hinges 0 compact_fullFour_pair_26_cuts = true := by decide +kernel theorem compact_fullFour_pair_26_representation (x y:ℝ) : fullFour_pair_26 x y = CompactPair.expressionEval compact_fullFour_pair_26_base compact_fullFour_pair_26_hinges x y:=by rfl theorem fullFour_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_26 x y:=by rw [compact_fullFour_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_26_check hy (by simpa using hx) def compact_fullFour_pair_27_base:CompactPair.Quadratic:=⟨(-0x4928d7369 / 0x2cb417800),(0xea1d05c1 / 0x165a0bc00),0⟩ def compact_fullFour_pair_27_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),1, -3⟩,⟨(-0x9c12dc2d / 0x1dcd65000),2, -1⟩,⟨(0x750e2523 / 0x165a0bc00),3, -1⟩] noncomputable def fullFour_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_27_base compact_fullFour_pair_27_hinges x y def compact_fullFour_pair_27_cuts:List ℚ:=[(1 / 3),(1 / 2),3] private def zz569:"s0239"="s0239":=by decide+kernel theorem compact_fullFour_pair_27_check : CompactPair.expressionCheckPSD compact_fullFour_pair_27_base compact_fullFour_pair_27_hinges 0 compact_fullFour_pair_27_cuts = true := by decide +kernel theorem compact_fullFour_pair_27_representation (x y:ℝ) : fullFour_pair_27 x y = CompactPair.expressionEval compact_fullFour_pair_27_base compact_fullFour_pair_27_hinges x y:=by rfl theorem fullFour_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_27 x y:=by rw [compact_fullFour_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_27_check hy (by simpa using hx) def compact_fullFour_pair_28_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0xda9637b / 0x11e1a300),(-49 / 50)⟩ def compact_fullFour_pair_28_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFour_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_28_base compact_fullFour_pair_28_hinges x y def compact_fullFour_pair_28_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullFour_pair_28_check : CompactPair.expressionCheckPSD compact_fullFour_pair_28_base compact_fullFour_pair_28_hinges 0 compact_fullFour_pair_28_cuts = true := by decide +kernel private def zz570:"s023a"="s023a":=by decide+kernel theorem compact_fullFour_pair_28_representation (x y:ℝ) : fullFour_pair_28 x y = CompactPair.expressionEval compact_fullFour_pair_28_base compact_fullFour_pair_28_hinges x y:=by rfl theorem fullFour_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_28 x y:=by rw [compact_fullFour_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_28_check hy (by simpa using hx) def compact_fullFour_pair_29_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x8c307d1f / 0xb2d05e00),(-49 / 50)⟩ def compact_fullFour_pair_29_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFour_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_29_base compact_fullFour_pair_29_hinges x y def compact_fullFour_pair_29_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullFour_pair_29_check : CompactPair.expressionCheckPSD compact_fullFour_pair_29_base compact_fullFour_pair_29_hinges 0 compact_fullFour_pair_29_cuts = true := by decide +kernel theorem compact_fullFour_pair_29_representation (x y:ℝ) : fullFour_pair_29 x y = CompactPair.expressionEval compact_fullFour_pair_29_base compact_fullFour_pair_29_hinges x y:=by rfl private def zz571:"s023b"="s023b":=by decide+kernel theorem fullFour_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_29 x y:=by rw [compact_fullFour_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_29_check hy (by simpa using hx) def compact_fullFour_pair_30_base:CompactPair.Quadratic:=⟨(-0xc691b7e1d / 0x165a0bc00),(0x6b9bf796f / 0x165a0bc00),0⟩ def compact_fullFour_pair_30_hinges:List CompactPair.Hinge:=[⟨(0x22e1c57 / 0x165a0bc00),1, -3⟩,⟨(-0x53b773 / 0x5f5e100),1, -1⟩,⟨(-0x51d02823 / 0x2cb417800),2, -3⟩,⟨(0x1752169 / 0x165a0bc),3, -1⟩] noncomputable def fullFour_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_30_base compact_fullFour_pair_30_hinges x y def compact_fullFour_pair_30_cuts:List ℚ:=[(1 / 3),1,(3 / 2),3] theorem compact_fullFour_pair_30_check : CompactPair.expressionCheckPSD compact_fullFour_pair_30_base compact_fullFour_pair_30_hinges 0 compact_fullFour_pair_30_cuts = true := by decide +kernel theorem compact_fullFour_pair_30_representation (x y:ℝ) : fullFour_pair_30 x y = CompactPair.expressionEval compact_fullFour_pair_30_base compact_fullFour_pair_30_hinges x y:=by rfl theorem fullFour_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_30 x y:=by rw [compact_fullFour_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_30_check hy (by simpa using hx) def compact_fullFour_pair_31_base:CompactPair.Quadratic:=⟨(23 / 0x59682f000),(0x12bf / 0x23c34600),0⟩ def compact_fullFour_pair_31_hinges:List CompactPair.Hinge:=[⟨(-0x4eda2a8f / 0xb2d05e00),1, -3⟩,⟨(0xfb43983d / 0x1dcd65000),1, -2⟩,⟨(-0x3061ab61 / 0xee6b2800),1, -1⟩,⟨(0x3193213 / 0xee6b2800),3, -2⟩,⟨(-1 / 0x2cb417800),3, -1⟩] noncomputable def fullFour_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_31_base compact_fullFour_pair_31_hinges x y def compact_fullFour_pair_31_cuts:List ℚ:=[(1 / 3),(2 / 3),1,2,3] private def zz572:"s023c"="s023c":=by decide+kernel theorem compact_fullFour_pair_31_check : CompactPair.expressionCheckPSD compact_fullFour_pair_31_base compact_fullFour_pair_31_hinges 0 compact_fullFour_pair_31_cuts = true := by decide +kernel theorem compact_fullFour_pair_31_representation (x y:ℝ) : fullFour_pair_31 x y = CompactPair.expressionEval compact_fullFour_pair_31_base compact_fullFour_pair_31_hinges x y:=by rfl theorem fullFour_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_31 x y:=by rw [compact_fullFour_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_31_check hy (by simpa using hx) def compact_fullFour_pair_32_base:CompactPair.Quadratic:=⟨(-0x2e7e1303 / 0x165a0bc0),(-0x19e54973 / 0x2cb41780),(-49 / 50)⟩ def compact_fullFour_pair_32_hinges:List CompactPair.Hinge:=[⟨(-0xc323391d / 0x165a0bc00),1, -3⟩,⟨(-0x11644055 / 0x7735940),1, -1⟩,⟨(49 / 0x1f4),1,3⟩,⟨(0x7b19eb95 / 0x165a0bc00),3, -2⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFour_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_32_base compact_fullFour_pair_32_hinges x y def compact_fullFour_pair_32_cuts:List ℚ:=[(1 / 3),(2 / 3),1,3] theorem compact_fullFour_pair_32_check : CompactPair.expressionCheckPSD compact_fullFour_pair_32_base compact_fullFour_pair_32_hinges 0 compact_fullFour_pair_32_cuts = true := by decide +kernel private def zz573:"s023d"="s023d":=by decide+kernel theorem compact_fullFour_pair_32_representation (x y:ℝ) : fullFour_pair_32 x y = CompactPair.expressionEval compact_fullFour_pair_32_base compact_fullFour_pair_32_hinges x y:=by rfl theorem fullFour_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_32 x y:=by rw [compact_fullFour_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_32_check hy (by simpa using hx) def compact_fullFour_pair_33_base:CompactPair.Quadratic:=⟨(-0x2de53b7ab / 0x165a0bc00),(-0x1985536f / 0x2cb41780),(-49 / 50)⟩ def compact_fullFour_pair_33_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(-0xb47158a1 / 0x77359400),1, -2⟩,⟨(-0x1fe7487f / 0xee6b280),1, -1⟩,⟨(49 / 0x1f4),1,3⟩,⟨(0x73ed691f / 0xb2d05e00),2, -3⟩,⟨(-0xaea521b / 0xee6b2800),2, -1⟩,⟨(0x61855d / 0x23c3460),3, -2⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFour_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_33_base compact_fullFour_pair_33_hinges x y def compact_fullFour_pair_33_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_fullFour_pair_33_check : CompactPair.expressionCheckPSD compact_fullFour_pair_33_base compact_fullFour_pair_33_hinges 0 compact_fullFour_pair_33_cuts = true := by decide +kernel theorem compact_fullFour_pair_33_representation (x y:ℝ) : fullFour_pair_33 x y = CompactPair.expressionEval compact_fullFour_pair_33_base compact_fullFour_pair_33_hinges x y:=by rfl private def zz574:"s023e"="s023e":=by decide+kernel theorem fullFour_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_33 x y:=by rw [compact_fullFour_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_33_check hy (by simpa using hx) def compact_fullFour_pair_34_base:CompactPair.Quadratic:=⟨(1 / 0x59682f00),(0xbb9 / 0x11e1a300),0⟩ def compact_fullFour_pair_34_hinges:List CompactPair.Hinge:=[⟨(-0x2876ef / 0x2cb41780),1, -3⟩,⟨(0x2876ef1 / 0x77359400),1, -2⟩,⟨(-0x2876ef1 / 0x165a0bc00),2, -3⟩,⟨(-0x2876ef1 / 0x77359400),2, -1⟩,⟨(0x2876ef1 / 0x165a0bc00),3, -2⟩,⟨(0x2876ef / 0x2cb41780),3, -1⟩] noncomputable def fullFour_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_34_base compact_fullFour_pair_34_hinges x y def compact_fullFour_pair_34_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullFour_pair_34_check : CompactPair.expressionCheckPSD compact_fullFour_pair_34_base compact_fullFour_pair_34_hinges 0 compact_fullFour_pair_34_cuts = true := by decide +kernel theorem compact_fullFour_pair_34_representation (x y:ℝ) : fullFour_pair_34 x y = CompactPair.expressionEval compact_fullFour_pair_34_base compact_fullFour_pair_34_hinges x y:=by rfl theorem fullFour_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_34 x y:=by rw [compact_fullFour_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_34_check hy (by simpa using hx) def compact_fullFour_pair_35_base:CompactPair.Quadratic:=⟨(-29 / 0x59682f000),(0x2ef3 / 0xb2d05e00),0⟩ def compact_fullFour_pair_35_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0xee6b2800),1, -2⟩,⟨(1 / 0x59682f000),2, -3⟩,⟨(1 / 0xee6b2800),2, -1⟩,⟨(-1 / 0x59682f000),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def fullFour_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_35_base compact_fullFour_pair_35_hinges x y def compact_fullFour_pair_35_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] private def zz575:"s023f"="s023f":=by decide+kernel theorem compact_fullFour_pair_35_check : CompactPair.expressionCheckPSD compact_fullFour_pair_35_base compact_fullFour_pair_35_hinges 0 compact_fullFour_pair_35_cuts = true := by decide +kernel theorem compact_fullFour_pair_35_representation (x y:ℝ) : fullFour_pair_35 x y = CompactPair.expressionEval compact_fullFour_pair_35_base compact_fullFour_pair_35_hinges x y:=by rfl theorem fullFour_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_35 x y:=by rw [compact_fullFour_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_35_check hy (by simpa using hx) def compact_fullFour_pair_36_base:CompactPair.Quadratic:=⟨0,(0x419f / 0x47868c00),0⟩ def compact_fullFour_pair_36_hinges:List CompactPair.Hinge:=[] noncomputable def fullFour_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_36_base compact_fullFour_pair_36_hinges x y def compact_fullFour_pair_36_cuts:List ℚ:=[] theorem compact_fullFour_pair_36_check : CompactPair.expressionCheckPSD compact_fullFour_pair_36_base compact_fullFour_pair_36_hinges 0 compact_fullFour_pair_36_cuts = true := by decide +kernel private def zz576:"s0240"="s0240":=by decide+kernel theorem compact_fullFour_pair_36_representation (x y:ℝ) : fullFour_pair_36 x y = CompactPair.expressionEval compact_fullFour_pair_36_base compact_fullFour_pair_36_hinges x y:=by rfl theorem fullFour_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_36 x y:=by rw [compact_fullFour_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_36_check hy (by simpa using hx) def compact_fullFour_pair_37_base:CompactPair.Quadratic:=⟨(-0x19608d39 / 0x1c9c3800),(0x74de372b / 0x165a0bc00),0⟩ def compact_fullFour_pair_37_hinges:List CompactPair.Hinge:=[⟨(-0x6c68239 / 0x2cb417800),1, -3⟩,⟨(0x74bf6a3 / 0x5f5e1000),1, -2⟩,⟨(0x32486521 / 0x3b9aca00),1, -1⟩,⟨(-0x7696255d / 0x59682f000),2, -3⟩,⟨(-0xf6f98529 / 0x1dcd65000),2, -1⟩,⟨(-0x1ee46661 / 0x59682f000),3, -2⟩,⟨(0x33246aff / 0xb2d05e00),3, -1⟩] noncomputable def fullFour_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_37_base compact_fullFour_pair_37_hinges x y def compact_fullFour_pair_37_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_fullFour_pair_37_check : CompactPair.expressionCheckPSD compact_fullFour_pair_37_base compact_fullFour_pair_37_hinges 0 compact_fullFour_pair_37_cuts = true := by decide +kernel theorem compact_fullFour_pair_37_representation (x y:ℝ) : fullFour_pair_37 x y = CompactPair.expressionEval compact_fullFour_pair_37_base compact_fullFour_pair_37_hinges x y:=by rfl private def zz577:"s0241"="s0241":=by decide+kernel theorem fullFour_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_37 x y:=by rw [compact_fullFour_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_37_check hy (by simpa using hx) def compact_fullFour_pair_38_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0xda9637b / 0x11e1a300),(-49 / 50)⟩ def compact_fullFour_pair_38_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFour_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_38_base compact_fullFour_pair_38_hinges x y def compact_fullFour_pair_38_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullFour_pair_38_check : CompactPair.expressionCheckPSD compact_fullFour_pair_38_base compact_fullFour_pair_38_hinges 0 compact_fullFour_pair_38_cuts = true := by decide +kernel theorem compact_fullFour_pair_38_representation (x y:ℝ) : fullFour_pair_38 x y = CompactPair.expressionEval compact_fullFour_pair_38_base compact_fullFour_pair_38_hinges x y:=by rfl theorem fullFour_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_38 x y:=by rw [compact_fullFour_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_38_check hy (by simpa using hx) def compact_fullFour_pair_39_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x8c307d1f / 0xb2d05e00),(-49 / 50)⟩ def compact_fullFour_pair_39_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFour_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFour_pair_39_base compact_fullFour_pair_39_hinges x y def compact_fullFour_pair_39_cuts:List ℚ:=[(1 / 3),3] private def zz578:"s0242"="s0242":=by decide+kernel theorem compact_fullFour_pair_39_check : CompactPair.expressionCheckPSD compact_fullFour_pair_39_base compact_fullFour_pair_39_hinges 0 compact_fullFour_pair_39_cuts = true := by decide +kernel theorem compact_fullFour_pair_39_representation (x y:ℝ) : fullFour_pair_39 x y = CompactPair.expressionEval compact_fullFour_pair_39_base compact_fullFour_pair_39_hinges x y:=by rfl theorem fullFour_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFour_pair_39 x y:=by rw [compact_fullFour_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFour_pair_39_check hy (by simpa using hx) end Green24Proof.LocalFullFourPairs private def zz2183:"s0887"="s0887":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l17 l21 l22 l23 l25 l27 l28 l29 l30 l31 l33 l35 l36 l37 l38 l42 l43 l45 l51 l57 l58 l6 l60 l61 l62 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x19f49b4dd, -0xefee2004, -0x167e5534c,0x2e9e], ![-0xefee2004, -0x49a05fbf4,0x1d7333fc,0x14eb3ab72], ![-0x167e5534c,0x1d7333fc, -0x6178d2d86,0xefee84a2], ![0x2e9e,0x14eb3ab72,0xefee84a2, -0x77f72ae4]] noncomputable def hinges:Hinges:=[(-0x241b7d8,l6),(0x3394304,l9),(-0xd8a0014,l8),(0x4d5da3a,l10),(0xd9d5cd1c,l14),(-0x8240658,l17),(0x332d374,l21),(0x1fd81aec,l23),(0xc7b59dc,l22),(-0x77f72ae4,l27),(-0x332d374,l28),(0x77f72ae4,l29),(-0xd9d5cd1c,l25),(0x217184a6,l31),(0x64c6e036,l30),(0x77f72ae4,l33),(-0x4d5da3a,l38),(-0x77f72ae4,l35),(0xd8a0014,l36),(0x77f72ae4,l37),(-0x64c6e036,l43),(-0xc7b59dc,l42),(0x18f6b3bb,l45),(0x77f72ae4,l51),(-0x217184a6,l57),(-0x18f6b3bb,l58),(-0x3394304,l61),(0x241b7d8,l60),(-0x1fd81aec,l63),(0x8240658,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x77f72ae4,l27),(0x77f72ae4,l29),(0x77f72ae4,l33),(-0x77f72ae4,l35),(0x77f72ae4,l37),(0x77f72ae4,l51),(0xd9d5cd1c,l14),(-0xd9d5cd1c,l25),(0x64c6e036,l30),(-0x64c6e036,l43),(0x217184a6,l31),(-0x217184a6,l57),(0x1fd81aec,l23),(-0x1fd81aec,l63),(0x18f6b3bb,l45),(-0x18f6b3bb,l58),(-0x8240658,l17),(0x8240658,l62),(-0xd8a0014,l8),(0xd8a0014,l36),(0xc7b59dc,l22),(-0xc7b59dc,l42),(0x3394304,l9),(-0x3394304,l61),(0x332d374,l21),(-0x332d374,l28),(0x4d5da3a,l10),(-0x4d5da3a,l38),(-0x241b7d8,l6),(0x241b7d8,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x32120a07a00400430728a5039840140000000e452048601800000294220258c040000096420480ea006000000a1090096301000931040580572802800000001d09038c02000182508680242008000000002814063008000000144820486018000039188900590030000000000240390040001a82606801f40100000000118a80c60100000000011c02c80300000000022809900600028c92044068401000000012472048601800000000002c0c8010000062290e00b2006000000000038072008000000a218809060200000240c82c051003000000001e14031804000000003c240a30080000000642204c60180000000e05002cc0300000001f0b81318060000000034240a300800000082108090602000001f0883805100300000000140a0298040000000000070320040000000641204860180000000a824088c0300000012822043180800000002a0c013300c000000560b810c602000000009824088c030000000000120490040000000005500a200c0000000001500a40100000000002f01880200000000000981900200000f8521a013400c0000000000e81640100000001984c0bcc030000000230a8051806000000004c280530080002a04e0a00da80200000000001301480202841480840066a00c0001342104803240100a20508220031a803000a60a209804b50050000ac1202c04ea0080001702807005d40100000000004c01240180000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x724a079804000000000385033004000001260881106020000000110480b4c0300000000522c031804000000360440fa30100000001445803c60180006209013026900400000000005603100400000006629037300c0000000000681c4010000000000a0c0cc010001423382604aa0080000000441e01d300c0000000021810e40200000000000901c8020000002304207d18080000003604805930100000000e822038601800000254220258c040000004884804b18080000000000780d20080000000188e81e601000000002512018c020000000491200f180600000000009c0620080000000007e0164018000000000f404c803000000000012071004000000004c14073008000398c6120194802000000118140064c0400000000007207100400000000002c09200800000017c3201660180000002e86804cc030000000003680510060000000000d80520080000000001d80c40100000000000640c801000000000046031004003085188200f140140000000000a81640100000000058004c804000000000178099006003182302b00f240140000000c45206c60181c5198145029850060000d82882e027a0080001c8631480cb40100003e0781080f080200003c0841a027100400000000000a0310040001d03408407840100001e0420a00788020000000000090188020000000110500618060000000000140e20080001008e980f486030000000208e40d8c0303a81840a203dba00c005bc778c300f14014000000c21900fe60200009c20c4501b9004,0x338b604318080000000622b022300c0000000000a8124010014420c20c0bed0050000030c3c808d980a00000005219016300c0000208f01602880180000002e0c4028c030000000005c68198020000000000b40b2008000000005c002640200000000017c04c80300000000000b819002000000b30e404e301000b212610605f6802828f1ca0d703db10060000094330480ea00740c70419f020ac401c00920c6058057280280000000290d038c020000038c4c808d980b2c872413e00bd7401c000518f82a80dc80200000031110903d002000038232603d2180c00000007231036300c00001f0a44206c801800000000003c0c801001ea29c4381eda00a073c514414085b4018000539261900988020000a5244320131004a5040205f00978a00e000094c80407a430180000001248206c6018000001845101b0c04030c21e19e01d1200c0000006108807f301000000000002206400800004e1c8c40d90030026a39c6381eda00a093c714614085b401800014092980f4860300002d328101e90c0600014c3182603da0080002886c04406b4010000001023880d860200000000000340c80100000005b1a00898060000000a623025300c0000001584203a60180000000000540c8010000000541580898060000004108807f30100000000742201a6018000001e0e0601d0020000000003428198020000000003700b200c0000000006a026401800a210618803c500500000000000a0490040000000008d00a200c0000000002300a401000000003d2903cc02,0x1e0290040000004e044016301000001284c1201680180000000007802480300000000000d8190020000000005d00a200c0000000001700a40100000014c3202f0c040000028c37017c180a00001047632026400c0000a088980f48603000001181280becc0500000000001403900400000005221036300c000000861b8150602000000c60d4055cc050000019416009b980a0000043867024c301400000850ca049860280000018c4102a4c04000002b0310137980a00000004613025300c0000000982203a6018000000001e140cc010000004088604498080000000662101d300c00000b909205ae6028000016a1380c5cc05000002bc2501bb980a0000005411403930100000006e0b8118602000000000e0601cc020000ec1283a0662008003345288c00d84014000000000980f04020000000001700e08040000000000e80f9006000000000003032004000000681280726020000000000dc04c803000000000d000990080000000662500a300c00000000d8900a60100000001608404cc030000000000360290040000005212001330100000000b04e026601800000001611014c0200000000002c0290040000000002c009200c0000000006c0124018000001a8110050c0400000003404805180600000000642407300800000d0082004c60280000001b84402cc0300000000341203180400000004211016300c00001c8dc1c028801800000001916014c020000001182605718080000000622d022300c000000c22a810c60200000001a0b404cc03,0x1f0320040000000001881c4010000000001940288030000000000640290040000000f211034300c000001ae21012c602000000354440258c04000004c4310013180a0000000094380630080000013019002660200000000260e01cc0200000000004a0590040000000026001320100000000009e0264018000024c28c08c0c0500000418418118180a0000000000880d200800000000b8280e601000000158110124c0400000003a0c80e1806000000009c340d30080000000048381a601000000394420258c040000007088804b1808000000a80c4013301000000015c340266018000000981103e8c0400000000521c0598040000000005700b200c000000000aa026401800000198110124c0400000000522a071804000000947c140e40080000000a82c03a60180000001d8840fcc030000005c84401a180800000000bc280e30080000000019810e4020000001583103e8c040000e41984804d2008000000930840883010000410621480c880200000020c210220c0400000000660e05180400000000001c0920080000000249281e60100000000452103cc020000000003a80510060000000000e80520080000000ec4206e601800000014884058c0300000000000a0390040000051879011b301400518790b60236802800000000260c0cc010000000002780590060000000004d013200c000408a2198176802000000010864058c03001821841180bb200a0000000000340920080000000088780a60100000001282402cc03], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((0x717d7dc27a69645ebee22822c34c52082367b0605806c4a76424a1838010ba78000016b01d34a0b3bc1d19f66a08e429347bc0b5ad59962590205e4e1643b62373c570e200000000000000003b23ce3cd1c310340204124000030080200d81c25fd22a81450002029406880ab141461020252310fc88629d4ccb0081832a56de0204cdca044a8415281703ac3820000d710424008805145000283391a207e9df20082011cb4e09a1045b7ffd0812252ea8e0417ea752630e0800043350808c976e5a1c00c978ab659002000c0000d7100038c3c3132fb354206004f1b0d008832e9da12093486feb041b263371848000239a6a6001f0084920007596d2060604861ce9243861bef81120a1842e09c035f05020e4a09cc82482489eb91f0a083983184f7ac3000000c494a0080278d996d7fd44801401400007f489f028000d3c800488913d09f175a3119e6960535b2670aab572e068241f41aa5805d255a610014256480804d8978e93840e0043ce134a4e41e68715105c30d93994e4805059baa61c1224f027120003399a000083e0a653800e8043cfc2b70e5b9d1450000bdf3a238306aa0e98901412a5f77cb4e101016c4e850804119fb3b0f583c002ce30135e180000013d8da0400eb5c966bcbd900280200000fd9f3c4b6bec6408228157b4f0e401e5e740240cff46090000ce62b0c00003922000042b2e249c0078021e7be7e75e5f879c00008103c20581c7b4ecb028a0001b22ce1e1c8515b534e8040e2af65080c080002234040824ab37e83a0a0000016aeb1b4801) <<< 16000) + 0x300c000079c8001a490006ba22781a13b0500041e1ba780c35f2d3dee5e0b63ccab668c208c00002e9e061af969de6a19d538a7c1d100220000000013c60104d6c90e6bf8810b32e0858ed80443892853402802401f3e4699c7c50fd09756a2d92392734f174f0b3163ad147f3ce6021cd2d5b75f6121856defb2422fa71c01f0e05615485aa319458d0003a43a5823d52d9a46a205f01c2ef4a070981a90040c8e19eb3f939c10b845734c0038010820b7abe3ba73071a9d4e5b716389b44859a871c4c26071d88069e87ce4a73032e058b0c806197a31bd93c206e056799800824fa46a6c8c92004a0380001e0227403f1a466fb8668866598bd2042c478491e18d1778124001d00871d1dac90bd56690000025cdd028a00ab4aef7a40812e45ff71868414b5d1ad202040b844fa26c104574c0ccd28182213a93e5300800830cfa61169200500400001fb3c6c3928249c6242acfb9e347f83f99a22727cbb1021cbe4409c0f2989914c0038010e3a6dedb3ee1e583ae667f83450000131d070808236d5a8d100000484210204ae5806720215642ec5e88202cc8eb14e053594ebd3e9002300c0000e490002f52000bd644481574f0186be5a7bcd433aa79d3523dc411863db2c28061af969ef350cea9e10f9c08504600000000278c0209ad921cd7f1021665c1099c49a29629c08a0920266766d92dfe978ec79717ad8ccf76059fcd4cd86f1c2ac59c74fcded23fffd17d3ba54f41b285210c24e6a610b427e8001b711391509c0680033bcd1562fd04c21421c6015ef8408000048420820a98f295850228208d15900800005ac020210fed59c0208647b9bc05801d74e588520044010d37bc8e5185087489dfe2001a335b84c007401000013644dc1408c0a1360509a828490142680a066010001841ba78817c2b43f9bed66f864f9550203282a0c09e8ef52ec4704c8b1880c808608700600400401a19fc381d1a126535f5b4b808f9c3f02c6267c8b92d56733ae264df6ec1c920465a00047e441057938ad16a8e87cf7303013281f3282a0c09e8ef52ec4704c8a14714708504a004003014045271bba14240e8f479913cd9d737e6808b4b9ffaa8a89b421afd8c28efe072c8119e80011911331989908c4c41602603f201ae5ecf082259a12710904336ccdd4c001a62012c490308002112aba9da8c694534a025341421d3588400a664560901074021c587f022bfaa02cb97276e2aa006142fa152ea700a285d4e614e2822180001b847802c2225367eecc438402983720ca420a0c3f8a85210e00941657a1b09b44801581a38b074a079519a730b2ec515b7cde567030a0941fb77e22a80a28369cd6e8d4ffa38208345d649b3150b0821ebf71b7c1e60827c3e1f483a4bc470406b52193e73a43c00c96280bdf7b5219ef66400d818000051240012fce95390610c200b9eeed440036010a2b8d0f5b023f4124871b779d4c9e2870d34d97b4c3868a0dda20e94760a1015427e00ed01608439688af8ce0417bb8fff63c9e3000af395a002781001cead0d7966455ae400bc11000048644c0140005c4400227cc1017f53d9a402caabefdf3020292a0a4301069d00891c003e9054025042000840e000036bc5e06941f4d742ffc8a2a725cf141161648c0cf2b86de2491d29e35ee6468600d4bc97298a088918b4f91304141230d0cff118013d07ed1add34d9002b0346940dfef8d1a3cd61455c9a7a69ec293859210d5bbf622d2c12489b7ea8998612c6841090b774764e2141042ddf88094eb4104f861961e49fa88c0810a4a8faf7778700198aba016b380433decc801b0300000a248002601c2003c1a5284108208a7948052be7e97b302041df8029600117fc2f65002100861208e9322bec78927b946e09dee410414c7c34659ac3040d5db9e17d022860a3c4030fc18c0845239c02ee39408f75ccf397e0041997bfe95c7e42800ee3a8137b52c8852005e088000243225e0a000374225c0200097f342c4d47a50e2d64d1011c0640a7389403c5c7d008120a0e004000032c89688c4b0172102a400e611102a425714f10ee7c06d820a98ed7928d000cbe3d86500200084937759eddda8e2002793e5501041455cea17c3840ca24fb0424088c414ec4b8411b407363598611944777f240820ad061ad0a68216cbbf8e0f864009c0800003e47cf0746bd6c3c450839fd1082b150df98401542d54403010654ff1f34002b76fe198008002124c2c37b4c8944038e3015210411b5ae86c9c203d05c2c31021c5f7b3fc8822c90ba0640610eff152e60410bc785e0a8a000423dbb656400900500003a84000c6089582f4a05161219405652123f424326ea1a940c3e8fc15640824adb382a3800194bd64980080021a502b331fa3fc7920a00abc09f9248d55bb0326c78a03cde00820922935a229d50828b1518501eef121add24490fac382079b8041410209508beb0939682400a80b00004207090741aafd94871011bb85c21b0820d8c64c7a62923036c601d5d43840000147d11040896671cde090412e5facc6c09900212425709b10002c6b222dedbce72005606012a010001179c2423badcefd1c40412fdba3d2082ef158c9c470805cb4f250c810ede0978060826efbf8805a20297d5eae6843000b963832180010f93dce0a4824009c0918483bceb08f9438808ddc2e10d841075b32e485549181a11fe70b61c200000a3e8882044a308ee66f820972bbde9e41c801123f46288c800167718aeb9de739002b03000010d11290500021e90009f6222412d1ade261d6)) <<< 16000) + 0x50a5cd57c81c5fcacf611e0a209c7d0e034aac32850047b9ed24026141d00800009091281909388800477ce190c7bc0cc0c31ee1fdd8060a3df52f599811306f7ed038400002d600a102687373010427a985a80c0875d154105000eba72c4520044010c33df3845f830cee861bf830521e4e138942875d15410c09483c70f838400005ac0142083ee7f104118385df10100eba066114801080400006d8c0100401000004444982408c1201e09092848490242460a077010002301c1a1f30bb438478da0758814beae520581b0c07898e026b29e862800d88723080084c503c01000013022183381966e400f5026e2197ab040823a8378f0557cfdafd01c306ee62c9fc2af1b07e40e08312b21e0ed1822dd3a0605dd48ceb30639f5af700182cdb7128397a2f886ce01009e2db189120207bac74200820d203b52eeececb0008fb0808aa8a9b81cc1343000006464488462420bf3e0e0b86a163809f0b582c10d2fe3be3000fd98ce490107c021e58000132480c242a991f09849336b7a660c2483d01f52e81041c3d169ad0614154cea3f84844abee12881020c792e12b841471cbf073e8c801280e30905942f18b98124e20b02c386809202cb2b82b0f041098fefeca00c34602ca2ac66ff1810405e9c2dbb090828d77c9baf8104fe2b12cedb13400c11cd8283944a99002d03c00011790004293e797a0bb0e3c7224aac7858e0d0835fc20b47de10c0c00460b59a94007c0216406d19898a08410efb38a91e7103acaa13e02c238e404add64aa1a2800027909965860157acbc77161062589126cc48232843f7d4d020c4ed0389bdf39f2005406000021122380a00033922400311f01c10ba084652349026ba4ba289571e27f21040a85c82c082bab2130818100ad29b43000311a9559c0080021a504a8c1c99a145445d9705ab9449c325479ca92490314c9f839838080ebc3660e301930d5c1d1c200000c8ff4140961aba3039020b812d629e9c6f200500500001fd3042d235ac88d240989e05ca256037c4dc4102dfba0a020ae99b41d120002226324c000b93cc867002000851400a35f88a2721782fe9248acf8abc387000023d86843ae6ec28a09b461ac61608eb9d94a1c10a118c220836e322bc29001f0080000d2100031530401b7f97ddc6ac081cdbde99d67f7fa68a06e2a9236a1e2305022cc945a818f0a107a5af7b7995002092288ac93ce18038221b47fc5cf600340000015a2f0c0000040a74b15897e03d09012006a0a811e0108e808000a9cf1475656de386ec6e5e5861004e0e1410538430ca58011bcaf402a183a0080000f320ea22000a83200823d36d8b0e9b7d61c7a0db02320c4618abc9ff371730416095a5647491007288341c22c212e34392190a083083e88a4e0404a2929600480026d4dfe9736d6f2005405811c01f1db6d5d48641021a51ac040e27d5c68238e61fd955e288000011ec1860eb970b66821d73dff41003ae765280007b6a1c059002000471de1bc606a39c38c000017eda0016401648a26d640b1c0940139b1a038eb4e151d78d430503b4988110c1c181da3540bd60e00ccb18294e2208086ea55ada098702400b40e000045c4000fd4c02004010000044446c3408c1a11a0900a008001b18e3b60111b8e93f25dd6268500fcf30be324140326db82279b226c38800000000000000000423282a0c09e8ef52ec4704d09de0cfb85a8b133f21e41542c72c3300200180345b47c6b969f175790e42dbef7ad48b7587ae92553f1d22c637a175c3f0086c29eeed87e7062175cfb7eaa39775494f40d20a1ee5d9829dae9483a4d1a000814446437a600000b58071d79be0d8030cba54921c10414d441070e182c2ce8dc70441b36fea3026ef2399704185d037f0140009d1471a90021008698060a7912640e3b56c944175430d025baad31108204f7ec154823860c1440525c1410101b58a360382267df411f88c0a1f60fa06be083474afe94d1cec9002a02c00010810750588c02c45c17a504879c0a550a2b2166949bcc492f694ec8fbe1c73e07edc1f71c200000df548080c0226c4dabc30607726327c5281322edc303f820bb86f44d1f2764801481634a0642451309b14548e4a956f0a09259cbf753d15038e548373018c8345032133138fd9a0803155cb911ca0483717ef70d0082b901ce642b03800224a8e1c3476212005a07000022e324c8be9807c16208d46cba3612c38c1b7e620e4a06184f4658d8458c282a853aa7383041c3b72014044020dc78abe780a0070ee5399d1000338de9a24d193ac801581a045804000460601002008000022364021665212efd8822c7f25e72130a38f236ae5a78839145043f825e8d89961849f0e560b128c0855dbca9090e25800ceae9f4abf620033438cd384a40002b98d3e8094bbde1e90031048410e9760e5911438f0fb10b8c33028800efe8bbfd4586576d251d878582219fd18fbe63020e56709b2fe2020e8bbdf5376480576d52fa4f8000861b52682258429002c034000112105e0188a80c0012fc8005d910041183e06f8e98641241e3871606c7e866c6871d5fa3f261c90a28915fe5b4c1303011c42c1318586011c6b2861cd08052efcba1c82007076dc2c5b000a29b1953781bbe400ac0b022803f3f44497730ce59e6004c67a2258420859eb43d6340c30c25e65287f08041015521ff0e45981800002b512903810aa94a77867c1002e39b337062000117090f1f5f174049002f03c79f0a863433638f34000031a100184012680bb100208025892b541040c383370)) <<< 16000) + 0xd2440f100933ba0b301a18126832e5403c109bdc88a4be0805e6a570186a3048015816000086480023a9804008020000088889868448253342036b146c1030000094e300d28203600dba0a2affc9bb2a3092616678fa11071d069c4ac428a040000d3c4d020591757e35bc104ebe1ee9a5a76900280284cd000017a0a2051509ed6e7f178924bd8aa70e670e3954942429c6342048d917698a6820ab513c59f4a04293af79203020a0ea42c38283800a4ea187dbd5192005606000021b3249bfce4e3208a68c2ae690e000047b0618654c63b0820f0d6d393010eb9a91e482786cb3a4a003ae71d78002ee032dac800f802044404000370444017e7e732f0e9ead748c0000103e6f6079800e17699329082181acd9e919f0c3044353f8ba3010405aeb0d9ed2e70216bb3865dd58200603504acf8c000211100ca5daae8092005e078f3ecd19bbd95479c00002a8a0048d00003ada9024581889f7d900c240c4555a9004108eb24cb8982061208b92b681e09fafe9e9ef4100fb223dc41de090029024000102910f0508700800122cc040040100000444002bfc80a008004950c0ff637486600a702e7d20003e71c28c0600e973801024201d00800006a110d210011c5110c1de3b601195e21446441fa48946c65ec09eebb8bd7b77d98019fff4400000000000000003f3282a0c09e8ef52ec4704d09de0cfb85a8b133f21e415424920620424110040450940e9b8de1a2adac7bdcb7e1b4e3b7283c3b9a6fbfc51ee855a7ba39f8c634f30814c6a6e68693f10db4c6513e1dce8ba67a0b1fd760530e43228001fc102c25085908011958803af49c1c13f3bd1923a65c702c1c4f7af079620225d2fe48000337ea7800128a0f8043070ec3d0b848e958493dc713c40f1a18808c52ddde2000f96a66e004a283e01000010222142b02a0988480ec63802d3e240cc7669ad460f2c30e6116100cee8ce1c03b5a216c3005f7c78b8400098907c02000026a44106742874b763d60274ac0205a1b3d3a241cb80ea38ba1fcfeadaf38403850a98a412a47d49abf0e090ef254e885eb9870c0672927c3f4aa28c0208071194255e67489880cfa78fefb55904d5fef5e8c262c3f08400014b11082d88388c418172394107e050e24090bfec0c181334083861986dda380200484040010c1ea1f60438e25026c89f200314c091c380a76a552410024201f00800006e91050dc0cfdba36c49fd3194db7d3d08a640c1c57c4d991325b9c0d495e041d341824c9da1b25ddc96dfca3de623b312037b3030c18feec9d4311f403fe828007acfedcdf2845e8a228ad60f18001b6a3f04bc9da304b3a4881f2e800001065b31646f6224b1e4e6d7b54151b79f4bde5ef3e548b314350980000eb48820ee85ab85636908419a2b2030e1eb22059b00e570f283505cfad4207a81c5bdfaefeefe4e3d303a7859029142748872a472a83b36bb07207b10c07318d791145d8fdc47bd08c05044053f557f678731f1b189409f2803b7f75f0eab37fb152eee35538fa41da032f0c0008494c1904600006ea40109420642000985220402001068209613e12d628a9008e5b13c565854a7534f522a450862d2842d57df536444a848a022c2e8b0204dd8cef9576cbb9b5317e77d2b7acbae108127bb267b7d3c68a9d8afee558c94e26f0a00067896b8112464b7f3cfd1fd33d628b920225971f18ae129a8ad74917376d13524801373090cf4feff3f4f16662ebf089002893503deebbd518646024a064b244c8118800022e9c08ffc23180b6e2023722acc3ad9860899dcf03e724300246af6685290a04c08da9770d82006417e4fc41d200980fd475a4822801063b6b266c80044dc43ff950a30e1b281701c00008e8880a4812d26200930ff3507f04c3f4141f80281a38ca6454c6384465efd4ecc1829997f564ab8a10c89ba5b9d880415e0c7136c400273657755e1c05c4544d4060a00a96c28e32d10114502491a9315bdff0805204081cd8938dc31a505203c41c51000000f9e16101ece53fa582044469ad8208eddf8c0c701c615c03f13821100420700001ded081a000000009c5cb0f26cb47154c65e44f9a5052043fa0584148056af0208ede3f1a4500000111269402110040000650e4e2b45aa3a1f3dcc0c04ca07c5038d29008b08804104e009030000200d81c000077b49c5cb7b7943e7154cf652459a504d80cff0584135f7ac28208ea05c4f450000011126ce004401000016421f60a00027f20b013d2f1b3141ef66946baef1e2d0c300013c4f41a083eaf0b5809040000464705804cab18ac22800bc4ce7a908032a13a5368103497c2810924801280c34d8cb8fd042716ba8325718e2a7d88dad2061800034b7e38107d59b67868200002ead09040000176d1000000404b80003bfab945dc80118040000720f9a0013d24c9a55141e9b4a6935c3f49eb984800bd058c480000000028200009b4d664c084401000013721f4120f90100029e99e300826b648735fc40859970422718612690610590308702480180801006cf1804135b2439afe2042ccb821138c3093483082811811800000c040080340003d487c0683dc1400045e43d807c620d95460788c2414196c686a704000014d66018204c42c2e059808ce31899d08c02bb5218556e38000001a17b0321c10a4081c5aebd6f13124a8155c19184534031559c11ad803cf180bce5746294006d164f890038e5be7088008ac9f24940210004000060ce966c673499df034a99093d751249045b71b662b1009183d82810a0a238cfc7a6e935)) <<< 16000) + 0xda3403389d05653d92012fb3ef9af20701aa2107a64f233882020b40f00003f443d4341e80a0f30507902800168c86308f2715a2d51d0f9ee606026503e261450e50c30a204602282500380801006f1ea4608f58b1a20d53238c149f63f3bc6156c3a7500801ec5c55286008f9c35b43001fe2ae616708200080000ac10f10d078068078241de0a0ee05076808000b808618ef2715a2d51d0f9ee606026503e248a40a308286404582300008bae8a145744ecf2f230a4aebb38d48cc15f8283922b87b72715a2d51d0f9ee606026503e248a40a308286404582100008b05a1e0a8a9188c4c3688f1f5ee180578a80fa59b922e081400063080210c000d0082590c1201608e03b261c1a090f9230e87ed0e828500004603848a40241d18c5104050e2a7961080a251290c029d6d891a000001026f626404ee1489c5b9a118042c921d57746a4c4a243515ef3fd6f3081dddb8bb47f4a2044f5cd0cc632c55083c5c017c4a17287979381cf0822402f2896cf09043beb25239af081156f97b11efa7104801701e2c91550c49ea128908d4f5ad4730813ef4eef2e2880a368fc82a2c5340853924028580da52dd3008217a841a09a24109ecd556d70810d4d2333b1c8900280200000fd90ec05c4a15096e4669d0c34a244920a85c01d2ca3079ccecee82b3067627bd0cee2202c6a3f8d8dfd73f00c32d969ca9b3ccc2c223443649aa1642800dd8eaf92f72c0004477e1cf481d0c2f6a4801a02a225111a0bf489fa06944824ee3ed9e39652364f5b8e270a60d3b14a2cd25b01636d5090953a2a050624ed1d4329320619e646871228885845e0b3b6f1ae60002fefe3b6c0b2103f39200640a0000262312842a7bcb836a10d28a31dfa927a53cb28c16bb82420604c19dff7185a82c80b1a888b3f5892bc030caad45b9c78970b088d10d926a8590a003af868b29a3500011b0275be397430bda9200680a8894398a951446b01a514a248cbadeba5948e0d3cb18d2f9834ffe840f15cc058db05cd4e5b72814189d4117319b3818671e2e7bda5ba1611782cedbc6b98000c5d6d88668c840fce48019028000098880027910009ff21d60b8122d74fac33030c24610599e0ce3944987fd37691ad2c55c927142402c50b06c58df0cb290080c760a2d1341410e708a2fcff8082136cd33c8e1408258e2e24f609a7cc2400bc1010244d9fb68e54a1848dc6a9e4ce7128931064959bcf658abbf334ec3f68a1607ee7712183201017184b0d2182821d1b8d89409010424368237fb18104b70c0d210354f9848017820000090cc0916ba7d6198186123082ccf0671ca24c3fe9bb48d6962ae4938a120162858362c6f86594804063b051689a0a087384517e7fc04109b6699e470a041286f1a6f96cd3e612005e08081226cfdb472a50c246e354f26738944988324acde7b2c55df99a761fb450b03f73b890c190080b8c258690c1410e8dc6c4a048082121b411bfd8c082538159204eaa7cc2400bc10000048640012848538482980400130e43a8461d2220410980204c3a017650f5ad9aad3571a4961da164d3851248033b99989d322321d88a9457151831d05ac0ed57f96345d326b9a9dd92214a49567e1330820f71d6a308df14186c2ad02913c495ba400c0111650f5ad9aad3571a4961da164d38512480e19877ff832232128e584970d1831d7e512694df963460a26b1aa85922144da5f8a65b0820f9d4e5aa64b14186c2ad02913c495ba400c01100004986ca1f1cdee8651e3492c3b42c9a70a249002923687b5e44643a7ea92b09a3063a393db0169f2c68b819276e5ab2442a1cdef5dbce1041af315ef02b62830d1e2e72640892b7480180222ca1f1cdee8651e3492c3b42c9a70a2490184e12566be4464248a073308a3063b2a87df955f2c68bef9266e6fb244296f0017661e1041b4a055e3d8e2830d1e2e72640892b748018022000093080025990e70987304a78c0209ad921cd7f1021665c1089e69e61a49641421a09008e00060400401a0001f2613bc19f70b516267e43c82a67372335a56c6492e2ace7fa0c11c59a51249841439039c0100001814010068000ab90e519016068390141c602000c853938ad16a8e87cf7303013281f12c62862461c53011c1140401162e18c3c8950d364fec68a1e797c124c3dfd87fa8e58b820d0001912058530026fe382acd223e84d80615ea2d156f7a040800005554440104c3f1baa061c181aa3bd887c85070cc010780c67e306bd0c9bfcdf714119e77e67a00060858a81e1bf9abe09002d03860ac4fd2239a861624d76ccb11020000184f70104e496451904606c90fd8c7cc70cd3c1e08110c1b38bdfae04141239f751f901821d87ab8def224009c0800003e468724c5d4c8bf70c31c4d8157f2589166cb45333e8e3882ccee40582e14410cb6bda14c0619e161b58cac06040c289640e645801615d2443501c014fdc3185788a0027c6ba33908b285021681a00009a080f848078261c4130e10900e848070240361201a0500c8080600402e020e0010003dd10030b82009596437c77040e7b3f502d9234d87e54d97922b8c6d6c9e99222cc4b251c81019ad50672880e180000c089a08191efc6de4d061096dc86fe5880000009038d639002801c06f00ec9eea8539b8a16acf8aac02843f1a4195c911aec004801c00096ff4bc300a90236db04004c1e80209c10880200002ca647e414c2243922661bf8316490d144a7476240736a2eb5f01c21ff2eca470c000000e9160100a47d7078c14708250140000bf90dd0986e0)) <<< 16000) + 0x4e8a5d9d21fd428800003a458285cfa2fd6b11c56c8804dae18575f4ec6f2344492180c421c4174d0633e184df1c786221037294a6841a4801200a28a405c075e1c2880000280fc82858e9c126ec21c54a9d83567a185513c5e573f3443681bd1fb81c4143e0f72d21849529aadf711034a8c4a96c6dc900280200000fd9924d2a18c79d091c0000831c60c1042938641489119ec16c3c2c610b19e84ab305113dd461eec0c0c53d1a32b7050e3893951e103094461fcea6ed2400a00801b602000210364a2b109d1051170f886ad8c303bea307050a445d9deb122e2eb0c0b250918916b7112207a6f9962304266869b9020027f13fd8148411004000070cd102700f842b923ca76a3e19228a2ecf0589a122181d04e480408f6309fe02921a2113c71be406000074b080a080b55daae030000001d22c01490c260140000f6101e1180050790da1940c6f0218f81e720525208a182ee86192716906c940a08000051885f04046cd47f076fe1407e35623f44c0605989b607db8020051df13ea4b408044a201ae924dec4801681a20835d479917850f31ae41eb1491ad4f0cea35142aa246b0423245e969ccc76c4895260a06ea0a0821533c19c080800010c0c80c154985a4871724009c0700003e26881df43f41a48f3ae422f60910cb849f7e902341c1c28e2030b3cfa20628414f56b34010009fca71213821180400005b0c0d5b4c67710814551a64da9019d23b68351c3657f3bbf038400005d5a04043694b7e10a0000005d3c09c208c0200002dc4364261b0120900906b808001e7486b108354441a8220d311069088344241a0120cf09067008334040030384331261966b0ca3182596c324a61903b0c7198240aeb9a8151dca72e2da83317ce0d0667935492f1327eb5400000000000000003cbb100c851040c80070050020150010140162400578a526e2674b357af0a200d794a56796c2856d4763fc72c93d866b763a56b1814c149b732fa20761c790fd02bdf709b767d44f16f86649b1fad076b3822638605385503800211bcc00118c0e004208e4d1d968a18d247a90d00c19296c480303dc6c0c0661fc648005460740100001f2721ebd1e740841dea6a52b5f1165636d7ba5a8c119150b4b72c00000000000000000110ca0a83027a3bd4bb11c134277833ee16a2c4cfc8790540000000000000000721cc17f32c6303d12037471a7c6de17775a5fe81ee89a43f42871c72421022004018105198ae44a2cb0e3433809d0fadef49799fdc08a9bea3500fc941c350b250ac295c62df386b5f05494dc632b3576a3a92a6ab83bf8a367ab5d75c1eefb629581f3aca7a466b31b5166d96a1119529985ddad664f1a8eb228f40017b08630ac3141790f5e8f3a0420ef535295af88b2b1b6bdd2d4608c8a85a5b9600000000000000000088650541813d1dea5d88e09a13bc19f70b516267e43c82a648c402182580200100820f58b46bf025a965ed3ba1df88df8d93e4d865485f0ae1c84b788e0e04754325526aadc2d72e6364353e009e6d62f341ad7461b2fa906f0d0550ec51e46b50004152188530042506192c308861823b0c01185f82c2f80617a03d378d26a3c20305e2af8828519e9c24430af562bb6c60a90432c0a000f20fb8d2c01cb134c0013880f8042850da4400230b822e35c86093ddd7a0020801eae5e090207c0201780a02c0580007d9a1c6fa581720317ee9d0a28532fcefb830ab1a2f1c8609886f619a0095e045c240083bf6b8a5800ffb8cb4028101f00850a2c1b6ce0c2d34f98ea304b5c7662a008a7c4aee94081e00405e0280b0160001ec4000a48c0a070ba0b8b0c8da670e921901bdc582034b72efa42064d5f681c80401db1b81404a6888f41009c607c0200002b442ec660541bd211459b9b1c41b7ae0f0d0c8fb86b31c2e66d6d1830895f8ac3240bef6612c201f0fcf2c100027241e0080000ac90ba1585c82f0718d0b120dd040b5b4cf7c0c18c2c4acad6b377ec842420907c3043669a3cfadb217180302f920fa4c9130bf704a190200795908fae8a05ea2a58a4038b387d49ffb7831b75820b9e73b0e439e1ba664d4482083537006fc40c98e796ed96f929a34e25d8a0a60aa1b80003522170630b72185b0ec2d4461680b0b301f0a7062fdf181286f9cde582068667e2204eb7e25a00c8283c010f05f35d5c180a9b68811818d99664811880d80402c43400016670222a5bbd8a08be3c571102b7f973800cc5074011c3155dea726001e9f8fd40026a1d4b011820f804204e479b861036ca925f1000e0043c52e430e3a214bc21fa040a3c40e3e68035a139790007402000018a400054081b04a83232d30e60077d275800164f01b411840e004200002008f1734af9d8d1480155c8d0102423263001c00800004c90b20500007590001a221621a0003f5200096a701373c3c89a064459f789020e802385038a5a8a145ff6ba2001900870b448bc24509cc9c1a86092778514407b7103018011e5b5e5001b008000072100016a2160120af090570282b4041580200026221563b0330d85500e0275dbc810812a33e328b03618e792a0046383a01080871b3be59a218ca2bf440447790b588150f9aea48048283c0100a9110540680003f8e071bc1b1316099611e02182a91ae2b9000465936000012100f0040000364853928298240005c24270778ed804ae6a0547729cb8b6a0cc5f3834199e4d524bc4c9fad500000000000000000f109de0cfb85a8b133f21e4153289284281340180100317eb38c2ed94b3fc52c1ba4c8bd8e)) <<< 16000) + 0xd7fdaf8f4f2920825f208081ef3ecb3b00b47cb6ce64ad4dfcca08f2cffb9ff28c697a525000359214a6b0a42585188c288174030851b9080817d4aa012101b00458b011c78755d611e971e23d77b829247739c2c2e574f3f42051ab50bc41dde92986503c28da99e9f1e1c576f77833d51b295d1600cc1930d506f7c5cb5201356d892b94f2542f0a64f825b0fab0219bb3211dbf33b27b2bf3f800bd423ffc211f1f585910139e2b881521e544f7a295787d9e3f25c710cfac335a71e183e7c769725884410eb000086c6c5075fb7a501063d86020117403a811860d80420080200880000802340921cdf0800b8040000110800040980400802000008880007d9063110000e390a11585004c27c07c4474d5801c1e3d6e370022141c0080020af4c1605900347dec571130144bba502801d574d02001682c10000a8c0e00200003d08228e81102400039042789613a1b90a4d1ef02d6b566589640817938590ed88dcf15c3880000000000000000ecca0a83027a3bd4bb11c134277833ee16a2c4cfc87905559cff4c925c66b4ad8ce6e441842ca2c52001c0af4f874cf278383bfddff5f66b7cade8dd7253b55f91c4da277307436efaea1b9d200040c198e9b5861d8c25d780c13a38172ee745448372d3182ecd73a5c5732ca55a30c2e927e1df97d2cb2b1b53adf28f2db34ad1abea4d5d48490e898b990a814d308621479d00058821383bc76c02573502a3b94e5c5b50662f9c1a0ccf26a925e264fd6a80000000000000000792149a3de05ad6accb12c8102f270b21db11b9e2b87100000000000000001da13bc19f70b516267e43c82a85086806004803008008f6bac252f213494f647c421a27e0cee0e239cbf72a0569e0f0645e3431e600e91f22ecb200d3eb6cc875684e886e93bfbef782af10368650df8a71da69d0004a421366209a2104c8e8004eac8011e610030282096830480982380f80069da8c75a0f922a30b25f1206849513651e2f225acaa0277c09060615ed056fe7b815a1de0f16f904cec48e40d98b95faa10f4300100297aa98c94d4ab85d0bc466bbeb6548fcb3dc5888a0d514ec2d10000003f25875190af14251f46ebe920138a0d4cf8ed39a1a67836820d285ec8e57d3a7e36d91690d21980918e9197eb04af4725cc179c970c9becb16e8fd645188c7f7eeae5d7c3b5ccc540a6dc1a77962c701d11e10ae7c7dab26aa78d95ba3204b478e5f0e04608960949f10775a7a15bd52c1eade4192c1fc8e50c9bdfece3315d84bd59891119037cdc3b669ab960f05585bc114dc1dcc1e8a300f9ba4b1a45a09017c42ba9881f7f2f94dc7b8a0883c7ba9a3005c9045fb0892c985a3def9380c918e92510006a755cc95e486918635f139d49b8916a00c4ba01f858db7c697307883141f0e27241c8da2cd1da617e77098cb6cd379b46b900000a44c890bd5e94cd045e53540bf916eccb6800a4bbb70a6ab67e99e670b957b0a11cc015a7038fc501967145caba9a28b1aa428cc2864797be922325efbaa1d168d7831d133e54ebc492c61a054ec552992d5b2bdb41915e7bd8e71e99f1df0c3c18824073af5bc7449f92c88d2d77447d980392ef70c0599bd2b60642c16354e20e8a92ce68cd18d4076bc1c11aa74bfa325b41b2c8da02692c74ef7a5e3e6df2942cc158dc15eed4cc866ddfec9e630af4dd934e5a800040b6bcaea13a8eda13fbb85ce6ef41b717f29c5110a3834053e8b3c08f6962f14024a1678100001026703a0080000b62130730132584b88c258170140100440400401012a2200003721282b80e0080200000888498cc24864122230901184788ec70c8eebb8f02661308530044606f54a009edbb0a50004024341e008000071908e2d04694c1c0741183208b1900014b18206a07576ad9f99bb20f93c3c7e2308a04b620539a8e06819208accf1759ce46412ceb84f3763d1b6546d2a8e8020011514b88d11ae2058eb6c9d555c0c2c460260ac49c00c0395240dad61f055f01c57867d5b28e5ce75d94f6e541040000f69557a3b491d87d26a49bf0f4a418c8aa2739b00c080cde05da0df24e7850d6682c69e22569c4996ca2f429008386a969dcb8500289b03d71326b78f9ce90450ad24000028a9000dce20024be60a857b80f8fcf81afe4eaa8ccd79d200969c11ba452b5c57c29b1703d71601405a20fab5712aa255b24fa4a932d73cce8efd333b9a17f34a58beec84ab8100000104f8d58e8ea71d04b07363dc606455814c88467759b16e59594ab7c02862085afa5f30bb2185db2f789b95a6cf97f85d68d56ef299c07ba32a4ed6824101ef879dc6358319a3829572ca0970efac32bec3451679ee51a6e3eba08200914c472110b09e322a4508003458bbfc3845440890dc5a30b662ec8f80830d9a5369394589087fba4c1bcb256eff506e2aa3c026fc8a412841ebba345246a1f6fda10ac41530fe3f2a9fe764045162c5e12bc5b55012e7719e0001ed08010f79005f6330b9839e7ff250e40de91065be38fbe9f20e5a2c70d35700000000000000001f17f79f61e698373d3259641bb05985f2352ea92e82fd15ed100000000000000000000000000000000000000000000000000c44206182300280080a00008a200cd4a741e61aa5aeb6eaeb3725cb7a010956076bb93069b44dbd3802a4839e60609bc0e3e1eadbec3dd393e299c87ca286ad24946d38069ae31ca0e25371e44116c60aa2e9f24fa5bb85fe270a5caf383f1cb29b544a1a302d15bba7d32c71b0ca327ab6ce85c6aa86f93445f1dc7d18f06c54)) <<< 16000) + 0xd552de1fbf54c3f9791e7f007c55a56d3da000e30401a850806810980b4c4f14cc7c193ed070a36fc577d11e8d7d85085021323572b56d70205e21de5182e1cc2484015d9b05f52d62a0811010349c5b4d1379633a046d859bb4685493e8164f7ad8ed4639f98c808ef8d14f10022122620176129773b3e8e21e68e8c34ec71fc881961d03bf044d50a900278d7edd09e6c020801ebc1796e43f731a2000a7b47e171b2be3c4a7d8c44a50780f0a10fa4a83b8e234659e0e103c740a9a42824467c404300e67c8df020804a503e01000010c203c4308a1dc890bedf915b7fd086c710322d8e72b2acba836290003c644e9a8164a89806002b375a530895b1fac2003d1b92bee7d1f3ed50400258812a95a092c4188000c50057acaf736ead6b2a0b727a98911426162ad7e54ad205074672c4289e1533e8840463867b51200e8595120025141f00858a9971c8a081413f3a168a27bd7862310112e979e600019bf44f80094507c020000204422454054120880500012f10872904308821414000a74421084001160420c078f6cb0a2c0fa5327036278e1cd93577420882173073cffe4a1c81bd220cb7c71f7d3e41cb458e1a6ae00000000000000003e3fd86d503b32bffda5f2537580b809b1d3a6b69ec036cc040000000000000000000000000000000000000000000000001817623d1dea0604e650541342431831c018014050045022994cbef0c52c152dafaed268786ab10366a7a04649d73873840c1257a586c4438dca63c15258b913c34269ac18866cc6d9ef3a710719b6bf80085883c56f4ccb4f02604823b560e2b2347a1ffa98a30c88be2d9206e1fd845a0efbec9da405c5682923a31746d18a7b5ac85a06a3f8c4f18170f46830306d25c383240c83d3a147000ffb0e114039075045005026281e008405004011e61cfe0a28764114ec03918e103118952b12228b35499ba008c18bbc1c86cc1841e5f5d5fc1c000000ff3c02804d3a4f67d0006306510fcd0f2004c040f381fd8ae3ea01864d800207584e140768b9d388145827847dc71c60c186f8586d82002655f96c300600b487f235ba0c00b1cd08ccc000229d5a6e864c612005405800021021040b08101d14a2c8b914792000047b041138c3139430c46fb740c2081615d8c06822c2cfb5a082d366150c5801d738ebc000aecb82054801000402000765ddce3161c8040a000021141604927afba369a0071cf65fcfbb121c103cd4da023f3810e814698c9e58200008161c201058a4d4886d01a00885197c6a4ec49002b030716121e607b8a165c850e8eaf988140c149e6518124aa50d3e72f838e6c248059171a300000a77f60582080e14350a040a35f0d1ff420825e7f3ef4857629002a02c000108100044520fe0a000637304115a599c8a840c5d56b350b80c301413659bf870a000012d5180a2b65bff7e9e64060f02e32b1c0c18993f92c1a0604182908770d000452a7e61b3d3ee400a80b1042ce3f0bd51800c32e314a48deeb9c28146b99b1bfc0a2db12c041a6788c18b860b56aa441c104444862e7c00c01dfc7a33361b06007a826749fe8000779520ed289e483012006009000024d313c00011b9801c6836cace57e3090510ce63e660e05350e4b7491d236e5b3b40a2a37da9032c1c0036cd150ee0013c98588b00c8804270200000e1107e0982f02c0019fc8008951806008022496698ca0bb66838f2b34bf1eab40c0cd0fad46a7ae12101d7607ab05934104227464c5e660231cebccfdbfcb040c70f7f9db1940116a47d566e80004cc474703ca184212005e080c2422f572d14efa493e171967f1b571c770e516ab6e608a28db9772686174b104649460394923061a4feb74699f30007542887c248920224eae044630c00195ca476aa0c5239f2400c41300004ae41780524c4ce7e2390d8e3d0e8b3b287a982831dc2336cc90283b0beb5ff50a291189d764b49818e1db900a02121048d6ca75641400969351f78c0002f662acb5bf7ffa400b00d00fa03ff61b540eccafff697c94dd602e026c74e9ada7b00db301000000000000000000000000000000000000000000000000060144d38d3093072471451c000030080200d00021020008c840025208020681f02400135e78800002538c018692c76db19a2c5055e72e120104a677767a1a183080d8036e8082108743466f181196fe35f2f1015db211e7dd041db899bc629d248014012388000016b00c3325f9f05841151510ee03060b0b3a37082180e17410c0883662a54404dde4cdee0830ba06fe0280013a28e35200420100001b6208c0a07b0503d0281e4140f00207701000225907621c02004011848233657e4380b14133bb40cba028a4b1f5f247ed344000009905c00a201de9b9aade0411be31f3db166384140b976a5601402ed7b3461d100044006b48ed128789002d03858a032f142366005151d72f8ebfe39a2019775cf8e80144100ac5ca8c6a2097ea79e7b887cd0414dea6241400e046ce1e6034e008022c01bc0f500000ca19c45fe21242c12005e088000243303800011b9801a6036cace57e2c80510ce63e658c05350e4b74819236e5b3b40820a9cd3facc180036cd150ee0013c98588b00c8804270200000e1100066920ea1b07409f14338095e4a1432b4f470e2ce4c676a24300479d18104b1ab2449094307c021040dd5b24f88187308e8c230c4362889e28405e3f97a0818804ccbb430d30a5aa943022357a318280000016b000043cb40e3a9002100803980c1c807e01cbf39de6f2943a7fa93d21f5c)) <<< 16000) + 0x3d0d10dd29000000000000000000000000000000000000000268a071a61641631030820c0000060200401a0003904000f0c8020680013c48230affd86d503b32bffda5f2537580b809b1d3a6b69ec036cc04000000000000000000000000000000000000000000000000183c0397e73bcde52874ff527a43eb87a1a21ba520000000000000000000000000000000000000004d234b289308203143041000a30fc1b1a42ff754f6a93fcf422c38237339ddb26a6a29557b57898d2bebc310b9a903e2c2fc5da1596c23889991552d8732cb1a00097a41c4340021bc400c29480210c1c07762e46f65fe40a1c70b190c1b99d11ea203128d1161207b7162c438016c46770a000abeb5c800213940f004200802008a1c037db5d251c7bd2a5ad34c9142123823901452b7a8037cc50d5f818b1430c3b8acf5e43c90800009924008226292255b07047d8ecdc46d92004c038a1c04456b7011c7b782761b9c914212382390145276206bb9c50d61d8abed70c3b87b087ccc90800009924008226f0d7f3707047bff6288ed92004c0380001e820007d6418c2603c1306f0983702f886dfc09d9c17d3b73d6584ba9f2aa90011df0d048048283c010f00e5f9cef3794a1d3fd49e90fae1e86886e948000000000000000000000000000000000000001345038d28b20918604104b0000130100200df00e5f9cef3794a1d3fd49e90fae1e86886e948000000000000000000000000000000000000001345038d28b2091901060410400130100200d0001c830380001bb1d80079610f69e8654c34a042c09746ca9230298ec899650105f655c5283e45802342974eb6904079e50b66d40000771d9fd719e19c410085a078926405c4d92e58e01c392dfa287068529c1c0e390875861dcd141616e789838a85d61d683145657decd3506110910dbfa02084574761db6c801280c222e1301dd43c51246fada5800ae7cb8e3001f008000051900029c20da0a0004c520bc130008a0200131a41b0660d623e1b7993368c1f1604859606af2dc50e03507efa20120a0e0042c807978a1a108222ad74e4102462734a755a0618706aeb85a2c40c42f64dc4710310aaba902c23e43bcf5bc904a37b3c9ec041b254bd050f3e40098081640089b2dc2462951f8c028838a256ecb094a665f40414b4af8c494007c0200001f041a4078484dc1436784933dc0e818014387b8506a7038e1892f238918182dc1fd99c6041b3f12b331210000185d6c105046ba879b96086cfcca6ad0f2004c040a1ca36ee888c28f141f2a1440028d196606ab48cfe830e15014f31a00004f02498007c0200002466afa153953fabfaff051d401391a82fc039b8b3500000000000000000000000000000000000000000a0289671660618618410280070180001006d0e543730c0c28b7166c26069bbe952061e07327a21021e3c8e0960004abd9f6001e00400008e10003062000c9041a817848034d7802f9124d26d7d304620e386d70150d5d1230568d3a647418283ca676ad021410268ae65e7f0412edb7bbacf69c003a6b286ef804002a53cf04696686400b00d184c5f7580104f8d6120204c0968b1800d004000024cd051f6944208225d8270500afb281ec6083801000009b20d20bd2833d70db2f9456482348d8e2c80bf84db4bc4101405c3bbc0d0c41642ce1414180001d3ce80c39c4098490860220b23cb9a0f0007edce2095124009c091a519c189714530e964e0e1c61bc1b8401126167c800380100000c13a50322e3f9bf9456274cbf4991640152aa51c310401b7d844751e381d0576d439a18470eecb179418ab25f58ad861c1dc7b883fa410d52e5812ec6f20050050d2af56bcc1208e8f28d1c1c2de8dc100c24413e4001b00800005e90002d534309e062425822f1b790020d407d29c5002791034248103c0100000cd2000d4e400297c800a0190681103382819804002a4e4008e4083288819014004a6041588400aef67fd86d503b32bffda5f2537580b809b1d3a6b69ec036cc040000000000000000000000000000000000000000000000001817623d1dea0604e650541322431832421c0140433fad59f4987e001fd883c9347e3ef79edc181d2ac1fdc347fc1b6391209623d001f7b8ff4cf4eb10d845d56253a6fb38ac0d837baaf94c82a75bfb6dc70cd73c84462b804c2759ac9711e2498f96b9682f8b82fdd7e11686be0f0e9d8ce71d7e00235e156c18a88682d524ff57303c0316edc21f6a363f15461c07e7ae5c7296809c96848ecef028e38c2edd88fb45a79568251437d87ab23636653c6e1c2c230ccae388010d6388411a7c2395909380ef06488c65aea07153a68fb10e5815e6bed11551cbba0902d4db0a09f0c1a3836df8c8e948ae1e9a28e62ade834e03be34df0f6ee3b32a1e0a02d4cfeb8690007f0983ca4244588f1ec43857ca150670ec86e3d45d7e2c3afe3e32ee1fa5b3eb3f331803ec3f71925460ff682a76b3e34ef77eb3cae2cf6eaa7bfb40ddc10e8e3f04e058d6c280010805933c67c4037e2d5d02fd242c1c577dbddeccc8b53dbe8ef800b7c3f754a7476dab77feb8740c72de747ed991f929914e7718a2b8630c7730b784aae2599ded94944cf614556cdb33868a77c11c482085c0607c3802cc9e0848003c010d36c54bd8f051200006058345556bb63b8a295322d6d0c102744455028443fd127308244c7764402083f6a36681000000b5814801080400006d883182c188160c20b06005f8072fce779bca50e9fea4f487d70f4344374a40000000000000000000)) <<< 16000) + 0x000000000000000000009b8810b32e5b2439af93c60104c0000000010dc35003419814650e68a58a50428438095c93a71def8afb4b6afcca26dfaa2ca43a9b3fc575bf2c56951d4868f50c45c5d8e0ea2b69bdbee2456c82a608b92af84d3777f8e461bba45e1cda643087d1c9786c5e8caa1a275cccff0b0f1ec1f5a5060000f202c0c98f22d0000cbe225081d00878072fce779bca50e9fea4f487d70f4344374a40000000000000000000000000000000000000009a279678e70a60858808218008180001006f9391aecbc608407512c588435e8ca3898c1e4ce2831140ac52800e00400003a482f808000b7482f02c001070800444105d1582e06e46a5f8bd1204034ab5528032681a5180504835544090607002102800071700d2800080a510200015a860f18e51e72bcf122a1c572830c8dc54fa0f0a9fd38110d000000b8a2900040028812000f3a878cdf1851a78992fcc64785f21c2b21800003ddc0007727bf53000e0040000448c0a4de01ca34a00033753c45d8cb7a3c2bed510118133e5f6808119f7502340000049e9c0070021026363f4f4f0be4309ac40636191ec2040007bb8000ee4f7ea5001c008000075100023f3a490316051c401508e81a44651c329a155b41d3900174956a04005095920201364438a4e103801000013d20b61305a01c0a592b31c1a50000cdd460d64a71b0187d5cfef82021dba0939e039461260d00000093d3800e804205270bb598c1d928e3f1016ff5c541e0b7890394800380100000c23e4a050e599c4d84dc3a1410ed3a28861161a5ea1201b129f232820e00400003ac82c82e2596d38a7eee38b000051686a2088ce003cfb0c0c3cde66f15061ddbe97f6194020fe30794ea482000092308900002283180d1c0000003a6aacac80138122259caa06ea80e021d8780822c3389606062637cca061f68c205e80424c9b6f92080002e140000ee4f7ee000780100002e2625cbca43b071600019ba98199433b2a18341f01aaa0010bf0580700000024f08000006ee53800f004225bbb58b606064f9b88520111dc9338204000228f060c17277720001dc9efd4c003c01000011e20005027c938e2c74a50225bc1b6410722e8e7e1600016420a2400660060892840f80400003f080039990580900054e100114520ae020012422003c30415854004c3a4154740a82a0530901602800b3208045d310524180f1e812cb60060281bf0b36bfc134f6bbd28443039303a32da34ba4eac7dd0a0970eddeddca2312a716ac2024680c0ea2a3e81f63dd18c02865e23861422a4e6188c28173f0212747368611a92a88039d44c0810ad5e6411f8e200a00a0f9e58289ed3ab665c65a03d5a8b05764e68a41a0a1c21e5c7c8e3070c664e10397b99984384f88e174470405541db8c002ed5625000261c1f00840e58ce534a6ae82745a4e3cb4031ce5e237828823895086c70db0325388307d598cc469eb9c520b52f68411a80b45ae18b5238526c2f61ab44c7c9d668db72b28dd0786bd59827c0ed67080089c57a92cc7c2e85415f9c80863f6a3279ea08cfbdca3cf5505d127b39c0365d2233e8bc60172614e119189aad585b505830238cb0d10c00744e2c39f829285b5fe56bc2e7dabe2580c4007d828d6ba86400accdad4d070fe3adae3c59af899612ef0769581761608249e3ab8f2579239712cacf4f7e234c6219895ac0288480019748280ec13c5609c1bba78c140c4cbbdacd1e2fce32c809044aa8435bb91c05c85268f7816b5ab32c4b2040bc9c2c876c46e78ae1c4000000000000000076c1b2202a1018c18610c08a045a9319e8640a27294857df2d6a54f30dc050a58111268c41307efa6e54400201dd7efe662ae59723e6914a450b3bda11a9de8f9a764aa6699f1d54b3b0d3a0007fe68811306ca0608b8a656f840db3da6f82405c6df3201804516abc0201f61bf130002804c603e01000013a2001aae4134c60986204b3182514c124a40900304701d0dda225378a0d31549079005b9cc1d11c086e6cfa6180259cec4c5004050025481f0086922c9876c1a34d31981e3024651fb09001b227e2a000048483c010f2ee898348790115a75a2035bd148d1e035ac22ac0090507402161e0d5dab101858b68f160a8b6483060012ad98804820380100041100006f1c08e39da8470b580e6dd0022181c00800003e90451d022048000a2881f12c0f43700abb42c0200ccd267a0000444836010802008023470e66709405b5414a2001900840000401000004440002a0c0200401000004468081dd06a180766e354088306c0200000ea411847420e9d641d50f7f334064ccf6abe4beefaa0fb5a7d84abc308e8d678900fde0991287586c0f27f338de60334235957d170533b12b5fdf2b0abc6ebe3ddf975ea3f14a407ce5c78993294f425170e5492b5f7bd920b6ab9b7108e327fa9f0017a9eb793016d54448e20972e046158afca4789906f5db89f6768c06550149f01464e31847a8543a7becf73edb93045251dc533a3e2db2735773d9e748719e1d6ec0b8845092714049ac98018055835d804840680100000e840016ec8228c8110240860a0007dc2068420331500045110422d8208ec010774157e62928a04c735426302e26c09f081fa0d0ec20048303a0100401981f88e8177c59de18180d82b81c0ea0b5ae50009900e00200002a081f12c0f427e24d67c301028636f08600f9336f63001b00840a2c2aca200300080000433c137aac4bce031fe2c0b22041e00800003b103c0981d84c0e8160720303801e8a1b95992)) <<< 16000) + 0x60b336d90a388068f3d63043a73fb4780fab9ba32800e004200002008000022206e0ba0eeee6d1300450f59a280befcdec002cc132d850206c01000017e6411e58cd2c40b1842918780839407a8c007402102ceb2aae102f4101b22001b0080000371c1c65d738cc002e8d01a281774fec900018bf4d912020e804000031881b04c00087081a86e026f9f5d8b13b4eae00a2a7acb8af0b09f417b984745ab72e7bc022a3cd300c0bb27e74a69dde649919c784dfa186ad8a2a61cfdb296439fa53fc97803bdec092f5a452e39e2cb420b0ed55446d8daa7bf0bceb82f7f3ac406aa1858ab5eb22343ae6f31124449dec19974d1c56bbe10b521910a729920000ee0d0238304fc607627e79204420360100350df8869bef5b12128d335be601656ad1600318a0f00400002a48000a8100099f20683203309019028002f9c8189880b0840602202f0500071f102925000d8a1c287eecfb545e380f25ef8445fbb85bfb01c40f249edeb9cae4aa04ce5319c8e878685031244632e2653c2479c02c2bd50f682205053838fee67d58afd07dbcb072591c2b206025034e1b9e06643ef6bfb91f9833dad8024902ff79b7a6f6cdc5ebaf7ad59701202081f2d74395a5af9758cdc989f714bae8ba59e3846c469427b48923e750a60fe308b13accbdc8062286873cc056b9a8151dca72e2da83317ce0d0667935492f1327eb5400000000000000003c4277833ee16a2c4cfc879054c71881440c6084002001b0e48533455d28757ee6f768540f0d26053b0c293a0ea159daa1954004bf77d8899ba4e31fdeb4614364a2230dae272b2f981f0dcb126c98160705ab698c70dfa3b44c103899298c47043e64db9140d8dedfac302bec5670100986078021228cdeb8ef18597ad33da304d6eb4a9cb046314015a48103e01002e0581602b1021665cb648735f278c0209800000000214277833ee16a2c4cfc8790548a24b18914614608b04b00800030200200d00017a32287f2b8f3185af65ee46304d204d43810471ae281248103e01002d0581602b8ee349c1f858c178ab31891467a70088c2bd58b060182a410cc525803c83ede080072c4d43804e203e01000015620004d8400145c8158a80a824000d0a40a45405012000a98204e6a026250129080905404612022050007be985cc1cf3ff9287206f48832df1c7df4f9072d163869ab80000000000000000f8ff61b540eccafff697c94dd602e026c74e9ada7b00db3010000000000000000000000000000000000000000000000000607e43d5458959f70c84ef1054c80c30c9047006005010415cb820850f660d2d15439ab0342be990dd636dff2bd8de4a37e8c0b741b7bfa92a01026f249bd1ccbc4fb2fda0eba852344ff0b686427d9d9219ebdfed3168b08ac9d6ee1f0a626a85a01a7c6ad9bb09b8e35fa21ef62b2a7314b62a76afa153953fabfaff051d401391a82fc039b8b3500000000000000000000000000000000000000000a0bb11e8ef5030273282a09bf21eaa2c4acfb864277882a64882085041843808012e7f52926fdd09b38388e95b62c9b0401cbd46b7579fe44d9718360175a12672ed5aa4b004d1f43076681776a09fd027aee92b6c23527d52f3277f3d50cb9f5762d8d362a3cee097ffbb4825b5c28fffca3b743dee531a4766ca0a3ee15e851d053a6d0a0636019a28bb342ceac486346595ca40033f284e41802c0ee19000128c100042439c3b1f040c4f978418017d51740023181a00800004f90001c320422a020090003b3901f2d00f14c074940384a01b2100d0a8064240300a017010007329003a6320097a6787e087102c18538841dfeb1d874744b531c95e3e1a30000000000000000762286304302282202180100a2229a144ca22326d163527f5df73f2561a723b353f691dcb6e3531632d1cfe12f497d08b872c981eee135e8daa8ee305b4f8a1de1142000048fc6020883009cf98500d0cb3d91220000001d22c0c00de4adbf820229472425014714fccf912a870e676fe5fb0208b1433821830400003a72880006c354114600541e4053850000003a639011ae38480188239eb80ce5881851e7e4300813125792f5830c3f5382d8040400004dfd09006e3ec368c7001a920578460000006169901b02848018b240007d5b9963d431e16bb1c00000789800800003c6d9240023008592e08e161c98380000ba7850e00002eda18083489df1c581d60b1601ca004401000010738380013a18b2c7a85f71e4a48200026a2c0700000287098400002329b894008c02164b6dda559a60e01b2eb6318300d8ad18e48201b2bcc51607582981a250000002eda4c004401000013520004b840582602a03b2f897e4f6a05920000126d02c72a19289b396103a4d92684708000297f24482000005e5704103a786d990e000000859f2800250084c0c04caa8e87cf664e2b458000000003e259260e48410430208258050180001006800086101405c06650be05321876e839cd6848400000e48e402000041ba050000001f02440021adc0efc1806b165c1380002e179d741400120043b68a74303f40b0005c6b7cf3eb9ad2b60ce6e470688d28c20d0cc0c80c8041000030000200d00012e364a21d40d16060e01f23b28c98300f8a0350448401f21e06096049719f104c50000001d48414604260140000a9100045720260a00076c200184e404804001c06404444001f644040740022dc403cc401c4200d1d0060c802c54014220090d00404801c1400c0200501000a83900451001888008440020200001007c849)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 31 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase0" = "QuadFullFourCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 31 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase0 private def zz2184:"s0888"="s0888":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l21 l22 l23 l25 l27 l28 l29 l30 l33 l35 l36 l37 l38 l41 l42 l43 l45 l51 l58 l6 l60 l61 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xc1779cca, -0x77f71002, -0xb3f2a997,0x174c], ![-0x77f71002, -0x22059065e,0x72dc88d,0xa78d6538], ![-0xb3f2a997,0x72dc88d, -0x30bc696c3,0x77f74251], ![0x174c,0xa78d6538,0x77f74251, -0x3bfb9572]] noncomputable def hinges:Hinges:=[(-0x120dbec,l6),(0x19ca182,l9),(-0x6c5000a,l8),(0x26aed1d,l10),(0x7042c55d,l14),(0xc4cf70cd,l15),(0x74ec3d1,l21),(-0x612542c,l23),(0x1157bbd5,l22),(-0x3bfb9572,l27),(-0x74ec3d1,l28),(0x3bfb9572,l29),(-0x7042c55d,l25),(0x32cfb520,l30),(0x3bfb9572,l33),(-0x26aed1d,l38),(-0x3bfb9572,l35),(0x6c5000a,l36),(0x3bfb9572,l37),(-0x32cfb520,l43),(-0x1157bbd5,l42),(-0xc4cf70cd,l41),(0xe60778f,l45),(0x3bfb9572,l51),(-0xe60778f,l58),(-0x19ca182,l61),(0x120dbec,l60),(0x612542c,l63)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3bfb9572,l27),(0x3bfb9572,l29),(0x3bfb9572,l33),(-0x3bfb9572,l35),(0x3bfb9572,l37),(0x3bfb9572,l51),(0x7042c55d,l14),(-0x7042c55d,l25),(0x32cfb520,l30),(-0x32cfb520,l43),(0xc4cf70cd,l15),(-0xc4cf70cd,l41),(0x74ec3d1,l21),(-0x74ec3d1,l28),(0x1157bbd5,l22),(-0x1157bbd5,l42),(-0x612542c,l23),(0x612542c,l63),(0xe60778f,l45),(-0xe60778f,l58),(-0x6c5000a,l8),(0x6c5000a,l36),(0x19ca182,l9),(-0x19ca182,l61),(0x26aed1d,l10),(-0x26aed1d,l38),(-0x120dbec,l6),(0x120dbec,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x1703c0c603d20080002d87618409a401000000000a8300c601000000000009018802002984947281cc200a00000000b828073008000000001b26066008000000000070148020000e23085803620080000009474240f40080000248e42806c801800000000a0702cc020000000062240718040000000b251036300c0000000108a80e6010000000001e140cc01000000003a1a0518040000000088540e300800000000a8301c6010000000000210248020000000491c812180600000000004807200800000000000a06400800000120d050290020000066291080f2006000000003c280630080000000078481460100000000f85c098c030000000190881318060000000034240730080000001248206c60180000001c8c40d8c030000001e120c05200400000ac421901e400c0000000050280a601000000000001c0c8010000000150481118060000002b05c08630100000004a08810c60200000000c824090c0300000000140a0598040000000000240920080000000009a01440180000000002601480200000000005603100400000000001103200400000000d84812601000000001a0d018c020000000330981798060000000461500a300c0000000098500a60100000000001301480200009a1082401920080510284110018d40180002a04e0a00da8020000520a81200f50040000ac1202c04ea0080001702807005d40100000000004c01240180000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x1a069004000000511140c630100000000000901a40100000001d024070c0300000000521c0718040000000038240e300acd9460112079e2803800000002d1903cc0200000000522c0318040000000a22c01e300c0000000000e81240100000000003503880200000005f0c80598060000000ba1a013300c1a4924903012c680300000000019402880300000000006402900546c93008903cf1401c0000000001b80c40103892892460258d00600000000000b81900200000000008c062008000310a62100f48020000000000bc04c80300000000002a059004000000000058072008006304605601e480280001010d301e90c060000b01985201420080000000882101a300c0000000108881a6010000002213060190020000084230501520060000000004830330040000c08a980f4860300005110c3801a10040019c2841c816d200a0002585610409a40100e28cc0a2814c280300006c14437012100400000000341a07180400000003211032300c0000000068301c6010000000000190248020000621202606620080001f03c08407840100001e0420d01388020000740d02101e10040000781082801e20080000000000140620080000000441401860180002011d301e90c060000005c220c072004000000007854063008000430c218810c8020000046188640590030000000541880d1806000000006c180e30080000000148c81a601000000000029024802000048242603d2180c004b0828c503984014000000000d0a066008012e2021640b69005,0x41825013a980a0000000084340a300800c192216e06a480280000000220a01cc02000000003a320518040000007106406a301000000001083814601000000018884050c030000000000160290040000007115c04830100000000098501c60100000000211e038c020000000411c8111806000000000c89033004000408e62400d0802000000002105028c02000052648203d2180c0000007115c0c830100000000150a81c6010000000148840c8c030000c62206803d2008000184430cc09a401000000000e8700c60100002c129301e90c0600000000521a0518040000144620d00a400c0000288c432058801800000002907028c0200000a2330c80e200600000000003c05200800000000f0c81c60100000001c8c4088c0300000000744a0718040000000000e409200800018996080f48603000005c298a80690030000005a562c06a0040000000a22202c300c00002d14c540548018000002d2a160250020000000531100e1806000000000a8b0330040000000000701a4010000000070a0c0d001000000000012069004000000000003032004000290861900f48020000000000050248020000000003e80510060000000000f805200800000001a9081e60100000000311d03cc0200000398118118180a00000006a1303f300c0000000c82807e6018000014c0940ab8c0500000003b0c81f980600000000028303300400000000c89814601000000000005038802000002c0118077180a0000000521d034300c000000b40880fc6020000001581901f8c04,0x230900e18060000000064240a3008000000014828126010000002c4730224c04000000003a120518040904844290061240180000000003a03e40180000018c2b0338c040000004088604498080000000001501f200c0000000098700c60100000000130d028c020000000270f813180600000004219026300c0000000088680e601000000000002c0c8010000002a08a01c98080000003705c08c30100000000070300e6010000760941d03310040019a29446006c200a0000000004c0782010000000000b807040200000000003407c8030000001a04a01c980800000000037013200c00000000001a0640080000000068004c804000000033128051806000000006c480530080000000000d80a40100000001609c04cc0300000002c1080998060000000058480730080000000000b00a4010000000000b00248030000000001b00490060000006a04401430100000000d01201460180000001b84402cc030000000032120398040000000681100e300c0000001449206c6018000001d1b060290020000000210880a18060000000064580530080000000c45a04460180000019c5b0218c04000000308aa04318080000002304c0ae301000000000c8b0166010000000000150248020028840c7180e9200a0000008478140a40080000000a43202860180000002e0c4028c030000000005c68198020000000005f013200c0000000001681640100000000002e01c8020000000693081b18060000000b255034300c0000001c4d206c601800000002d1501cc02,0x4c4310013180a0000000094380630080000013019002660238c189025c0aef9007000000004c1c03980400000000009c0620080000000009e02640180000000002502c80200000000004c0390040d24c18a240a6b401800001060c60460602800000032064028c03000000000643819802000000bb08801430100000001642c03860180000002e848028c0391841204b815df200e00000000b42806300800000000d8280e601000000198110124c0400000003a0880e180600000000f4580e300800000017444014601800000002e12014c020000000311681a180600000000544c0a300800000172110068602000000002f0a038c0200000000001a071004000006306502ae301400000e6086046060280000001684c0fcc0300000002a0a01f98060000000000bc0620080000000a442028601800000001605038c020000000210c80a18060000000000140d200800000000012812401018210d0c2023410060000c21882605da0080000000000340920080000000088780a60100000001282402cc030000002702200b18080000094260900b400c0000000003c01240180000000000640c8010000000002a80510060000000000a80520080000a088980f48603000001181280becc05000000000014039004000070c424081f30180000000000700e4010000014c0a809d4c0500000028832035180800000006229022300c000000a21b81906020000641443702110040000002886e02418080000000088340e300800000cc10404de6028000000108480b0c03,0xe8190020000000000b40e2008184963124814d680300000000017402880300000000005c0290040000000e209034300c000001ae21012c602000000354440258c04], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((0x1e53a952ac83c95e1e25f8aad2cdf4566cbbe127f7ecb4258aef82a90ef0c06c619bcf8efa8b4c2864e4d3d6ac2de8fb870322266bcdb851e8a3c3e0d5f0c2936eacfbb6c89a9284dcc4583945011c0125158f7e876ff11d8b6d1c5a59f2b2f21143100ad1050d8e4d5b7ee9b848181c5c4e6a0806ce9ad82f62809329854a37f897327d7ff50e3b1f2d3dba2b98458f494a0c40e6803f45e65418c8255d521ef7c01d0cc76dc74a9fefaea0e9e342c29834315bcbce5de2e38c24950d028a0be3058cfbe830e6bf8d90f092312060b0410753b4106e7aff708000056c5c981070021248002833904127473d8d08063a) <<< 16000) + 0xd0d5fe3c3033ef4d10813f208b6bc20acb9ddaa830200010cd4101067c7fc20c000cf70ece920042028924000b4e8080823fae4a8c2330205b7835ce02042f6a4e71fc20a0bf148ab58c0800025cdd01010df05ab7806801494ea5b8010004dd5c9e85a12004e0500001f4200079078c062b3031c30a4e8b30c39f88eb23c24cd748f041ba64e9e2000015b159800700210400036459c0c180737d7a6440ca383c08401878759157b32010f7156cf5020c92742bdbd1000002d5d607805c1afb0d0040009a2fd0f6c48012810000077c8a3828000c80800418914609f940a2ea446148d8d92e5822171f2c083a2fed4450034815e04a083801014505f1802ca63a187b5ae988784536c4d038204ad6e24000015afb5001c00471d6d1a86d841000040529c1a1cdae53343029dbcdc186f17d79504044935c17a2000001ae2380030adff4080108c585f2003e0080001a33e3885cc44061c7e994a1e1285a844900000ab38480038010e3b88dd33e84100004052830dd6d89580f08186ae2b11040006f158e0545ea5c84d04000090c0f00089be38850000006b8a900200080000d690002892000a944510342860a00068f3e508c1b322c272f24d03058e5ec5c1048dbaee1401e4a6810803238a7ecc0836010d3158389c9c300fc1703035d15d5c38737518d24001b008410043500ae0d375c8ef28c30711f3f3ef8c0c47cec2ea1c360c4a587830dd5c32ba21420b08d1b2420b3b6458b808031bcadcaa9200440280001c32000536450817e50131a970b0878ced9630462756c130168ba8fc020d30a2c20a003fbd586100183310e49c2074021e383c67d81a2180dda51220478f8a10222d0371061f1987140e0865d62bcc0038010e3a535f62c70d20000064cf881408c7e501851406fb4e19c810557105d08d0c1aedde64040c78faef43830d916e6f4f410035db122fbd200480280001d43e313539b23445d3965a488337a1e8812383e031c0884737694006c021c74474614a33cb0396e446868a000026418814061c659b1a20000090c02040dd6b91f8186a96463c9510443ec7ede1c09213cea06c900230100000e510002c92000bc84001d0c8a0888500240016c064995308fe0124000005afc90d057e48c840600001ae20c31a28836314081cb864cc9005bbf8f8e1801606d53b0000f41948d52004201013f010420084f80427a0213c0109d8084e804000492674ea6ab2b63bda2270e8b766b04600002e98000016bf74d282cef37df65241080000ba609c898e8bdacd1e2c52550860404a9bab7dbec05a1630e31010c11600805874a9d348ce49721651a9d7c593b6c05f3e6f0e628d82fcbe6a983e46494d63f0fd2b4a798243d25346bd024782e3a7ec91310243548380c5a0007aa446c0742885e20bdf76be4a0a6654da38a2c0eff578616f0a5322f460e09dc717fe45d4d4855649ea02820d407b71c73789288b46df12043ce351ec9f1a79b2c2327a30010dc174216e150bd682d468602092a83e83cb7a0a7323c74a004989bc57223182742ebfc342e94bad89262b3053942d0780000e4c89c84c4e01626e03e1e5057d53b4b5eb6e8f758419604afeaab2c1d458c6cfeebe059aeb2697a622b1c8629b2f30d256041542666ff8c9f046dc3e806c5089a68d343035160113b8378f1b7777a363c16a1f13d6ac0a5b14c63597696acaeb49113b4295609531ea7874e7165ad8163a35c70cfe5438c422b50b39022547b026c0b8020080234a0396e44680145771486e5e6061407997fe8bc8060562f941c014300cae978f114113d328c21f050830288c68de104e37c97e576140058870ac814804801481834a00b295e6c7005156f50e53b9230e1c0318b84f7c814281969eabad2b34207209286e30050412cccba7b91c2096c0b9a6c9800e08045deb8c0603800ab0e82f6901a2809002f0440001219000466300001004493d0c7905dc012280fc01aed00486694f5302580a1822cf59f3201862df152a5b8020a8a5815e7c04801194cacf3d0800101bd0a27a0800cf24f58e7f0848015018000084489a82800098c800390912d0989600fc84b70e4660a366daf8914d7e9e8a217ef60093824cb2e086005b737bca001668f2b3820d8043cf806ebf98a2002eed1f4830ee990d0f0c170eacb900078021e329967dc28e181cb9864c30c8c117b26383072e2bcf101999e1dfa860c1ad73e861877f2ec374242c69c760c0400e5c2a2022400840400003704000a7089582fcd0000221e869a19abe7a9ca1c04c9305e08210d170ac23411ace19f6c082140cd6f086016328b9bb00042e112b4d0132598890e40611808000071089a0884cc24000c126cbb6812caf3c28ae191891ff0b0a1bf0453ab94102ce372794141059c35c4285807136326fcc60000008e29c0400d9b74130700020e8a1f551912004e040132010420084c4042600212f010970084780400050a674ea6ab2b63bda2270e8b766b0464d695b019cdc8fcead5fed3ab57fc0eadf0068eb750166080dc62e605212290192090094008040c3690e64d0b0841fab58507376ec3314361f4a324e198ab258b4248bfd98043b1c28d19bc3bcfb6d3b4f2905b93b4000c70c01004011e680cb7e8f7b018480d5f782718124d05cb4cc99e0a200cb6f74a50081818853141c49210c0e948324e841218c5bce42912080abb39717808003f6a491d6fd501200580709270c59a08a6740708001585e6c135104010a7004d0ac9818035f710b6880c0818a6249b89cc484150e4ba3c51108254fb6b56725592)) <<< 16000) + 0x080b74212beb90d0026b776fb9f8986aa2400c41300004ae400125cc000040110478578f70661628a5cdf3b39102b92aabb48896109a4b5558f101023d514c5192092b5ad4129020d3efbd2bc4060011469b0af02000eff8cfca6609002802c0000ff112105000128112d0589600f8e07fea61848e03476c40b14143c90390299d3e94c145986aaafc80400005afc505b7d3d66820ca9cbcfa0004a215890d2083e010e381ff92c712380d1cbe62c5050f291c40a6750d47851661a5eed0a0b6fa618704195392a5868000001e540010ebb95f34820f804000069889582fcd00003055e1a6ae5e92370ce2810b6eebf450e009aafcd6104531c9a7c602090f15a4b386020248fb9dc001783242361004d6af174112030940700003b244a844000b0a70c9f8d0c858c15aac25fbc2c50e5c6a3a0f04151d0eae30121e6914349041325bf2018135bd6a0c02001cb843b4000a49dfd9c2240088041865413c3a70c3398c801e1e28c81ca9196283972147061039713d6020856297ca180300faf0616000000b5f80018bc32b75200400100001ad22520a084050940080000423c020003f23229ddf24bf62a9b4502e8954f3aae1e24777264b8bdf69cef3a3531343878e801d3b1063bdf79342207348e5df1abc500655ba242287600eb7545fe37ea9ab2ad8273721456ee5e9e62dd296ba061f2b0becb105b82fc0ab796b5919187b0548009b1e9804df4793e39402a73dec489c8a034d8f55f5ef3d5a3ff10af7433d1d91f671791d9dcbb423f9f6bf502bb61558d83df22e9ca77dbfac40eea04a001f6b7bc950b2eadf1d7b962762a3ed5a135f0cbe944f129c80248b34cde987c334d04fa0f22e461a7d631c1b8dd64366c0d8d0512cb434b11255faee1c5cdb1312e758597e95d611206721366a97c3989648ec6ef35440507eaba72070a5b7259795ea38c76697f000107041f4440032fc447417ab8abdb0b56f16b52030289ad2b619cdc8fa3ac128005c740d28cc04c10313cacfc0e371efd1816814dccf5c5fd5e163a2c00000000000000000826080dc62e60520c086094008028090eae05e82af624f02b565e7562f9602a1fc22e5f130a64954614fb24479d98d83ff27de81dd557b9582b08be85088a5a07cb3a36c0f910516a9ca4c0fb3cf683e4a4db2e3fb9a371987825c4d62674e43561978576090a17900f69da203f7c85a0675500056520881bd2c00005ef97c778e3cfcdbaebc5ef2286074fc56af1d3840810d127edff888410aeea7a3aa6820e180d28ce1222c71c023d16770dd7cc10027e6558b9ea68000b5f82b6d453e42ce8a400cc151c7d68e1c7308a1859bd89af01c645a4966104810000ee8b2010434af892378a0459ab41b8e0c100016dbaac800b35e80c68000518f15500322400980800003d0449c07c7f266f22053e8286190de82c67d82041abeaf229e3810452c6fdda97682c10288f534fe28280012062f89e481c02aed84a0f9c208005d07263ae750005611a8e5c162fd7a2400c0121c7189a5153a850c0b37af0e5071a88acbe90d8820cb190ba001c22e7882b1561840869d84b4c8000b37fa72508001014409b90001e7538de4d912004e0400001f122460a00046d224c1300005edcafb5eb86c8b5f860904e30c30d24d14b0c30c500000c020080376e57daf5c3645afc3048279a69a71470c60820808230180001006e9b4fd8a81be31a600000c9842450e048b0440921820091657e48c20896202a43ae1a122c438f3c44682158e93be8388016cc94ae994001128f4d202846e4801501800008448001819125090920284780400086c6030020080000223858264be708c34e33160f0c18fb537250618a95686a0c101324c178c01ed4dab8060093f8c9c040013259888003bc5bff55200400101230189100ec8020c78ced144116a9957ff4288146a9ae8fa178a28cb56269f7e10302b3ef5be1c60404aa042ccdcb0401be2dbec310091315ed8c5c0413dc13b974917769002b03459004673d0bd09c4119cfd05e082b040a39ad9f145a1428a3bd19bb740185060233bc30b8d6582035e880bac2e402459ec03b5a2c08294e4f4383d606000627c343ff2da7c6480180240000934f1e0c50f976c8a1010f951c2807111f1d147418410502f83c41840c0d03e57b6ca08267a102594708d91a166d0c800267a616aac000dba12a944aae9002802809080800084480035791200988f82f8c000016bf30c3b38eb293cb00000d713490264982f345beedae1b0c31c293b7b1400000174c0005de806070301840008f3400005afcd350ddc5711030000035c4e28099260bce1afbb65b3c41070a4edec105aab2bc9060000005d3300040008d36f54fc364800d3000005829cfd024062f34b46d8a1c062ec0fbc90710cfe7f360be84104fb316842f070c000045627e4d04c2779188c78001e42529228c3e052005806800022420e00a06f010001f4911e010002cf980c008020000088800761111d01c0c34811fb814bc99bd1e173ec848ed494ff7605b8afe06e768f47d86dfa00ab73921b868f5ae8d7a546cda8b2a4982e7714061d26fc1a0f475ef31179c26ce1acc5f91a73756b6fe48f4478e6952444677e28a42867b3f99f5c52dc17e708bc4435020134a35d3f53a2a8c4986ada17dc6911820877560c12564440df932a2d130b9adbec7ffabe5446d6324cdd4e14d32fbb6026abde73050a476024046baac51416519d1d8bd3f6a70ec0c527286375641b4f387d2e28747498b5e9bd3c76b346fb30008e1428c0be463be30d7124)) <<< 16000) + 0xa2671bdfbeaf7d4fa2d6ae574ce9e598fe02809be163543b00849dbd0715b9005750c95f9610000f5c424c942383a04e0500125e9005b483a4125ee8125101c7901f902fa01836a2867961e4b0a081895cb892840f0043485134ceb0a205fa2fa4205c7a2c2a050cb3f5eff141476329c4c00978aa24098207802000024240a8173a7535595b1ded1138745bb358234725119cea402c953756fb7d80bf6839f1be6f1be6f68390510c1c710a0840870008c1f45f3570e5841b3dc92e4ba970ae5d8e7043617b5ab06d1f483d07de240eb789fb50ee7f52a510a823a80016b10950d84a02ec65b927bc881842ae8b0183d1aac704305f976dcb0403ccb9b8c0007b37a3a000261c1e00800009590291d88d82e85399e2be0bc9878263acae8d1c53436fa9c7235dffe333ae50142370ee4d4c8f2a19f74c387b2813c9ffc9de91847837a5047224016c6daa84f0dea9d09365ca180948357dea55a6a76518c4d01400b87530219353c9f42f536710003e6e6f6b7da955365474a1a4b61e19eabf2d73d9ca1703e000074a4468a62321b9d3a9aacad8ef6889c3a2dd9ac119cc1066a139131d1f1addab9ed687beb0418c54602ac8f574980dd0cab89fdd4df3990f45d61060000000000000001d1b94f0e9b1b816850a38a2842021001274563e641151a3302a6867ea450e81812787859fec2251df7cd3dc18d08cb90b29d68080018e8bc18e395eb8885cf98bc846de1631da3f95b3e7975bfaf0e19ce70b0dc31b2aa523a83d8362a0f27caa4fc2e217c056e8a7866cd200bc62a3015647aba4c06e8655c4feea6f9cc87a2eb0830000000000000000e8ca1471450890060050010088c7f86ca717d28a98c8b8b1c7ca7313fde45da946c881d870e1d4d8417d60a58caebab2d68009c34690a70cc90fb14619514000dc888c0e845c140010e64458040026c0413827c289533ee8fb9a85f6e9d42051cf2a581f6703393b9382049af2627eab2fe53bb7e2849e6a91a2eb937a1d08802806272e863bce7a06f302c178eb8972e8442b83a0c29374e7a086cf04fcf02ed2f7068c6a4d5054da0c5f28e671c978af2b70927d785b72390d8d113c3100006b8702307a13dba51011748bba85f860872edabf9c8600397725b4f428101663c614410024e4ca007d2a08a032d06d0b6812e20e348d015729c68f6051db32414812000081088aa08288d409c3b1141d88984c448142220281a2ba24ebf2a38452587b17e6182897da742298a107ef23eaef88003f78ccb5ec380b9d76d372c140102f74bdb9220a812945b09ae2409e4594553d719cf0a4091c61274c78cbd9a608e915ba129c58735bbb9089a504fd576337184800001a5c9964800001a58a9618de65ffde59c0dd22c5ffaf08005f0b32d686c480140102c90000083c520410000062db3a303206df3168acb0caf4ba870471020252423f0843063e98dcfbd62c01d70f9d435ca00af705faf390001a3f8aa11121c480150160000840e9519b4a232349a562756298485ea14c80a082f472208182000025620411c288c87120000059f549c10840200002bc74a94ccc6f95706932eb8dde5428c242c01fedd5f861800011293042820aff5751e6e082360e8b75850d0044c47349d0100000003d013008000010a05131f42400ac0b1a546d8985b8d2696ab1eaa6121686f3432820b424c348208dd6935209000002bf133001080400004bc888028000de083584f0abf0438be9cc24e1a3703910c300004f13d0c0434cd068f820100001191c0b000f94718d2280240b1932483017fcb85892040dcafdade724240098081860511b43db9a545367e2ab18500000baa21a4b67fe93d606180000d2df9812cfc680fe9a08699a0d1f100800002eda0e00000220cf648012008000074ce1330680265308b1ac0cd29640001747f41046a935260400000119b30400000337113021080400004c488784843804000a9a6472d49f50e66a2070a9fbccab5a282191384f509d20214f467632030824bcf0892ae01c1052bf391a640812d98720b7982400848f35fb00040cd824f2ffa08ca2400b00e184ca7fdea84e88a610de52600c7dc192380000962ef00830c12d799e5e0a61410000077ea2e78304149f87738a280410848631fbe95060305244daeded40400a80eb3012d191fd92400c81300004c074b864b95fd2c757a3467f2872fe5859034102045b901c034fd6ea125042000800007f910d0908600842c04000bf24418161a60391adc837be39f94280001695edc24598d58555e124028e3ea8889b0304063112da9014031e3c6c1fbc1c000001685fa0019b4c1b6820040be23555fe4fbc7202b02c00010890ce05f18c87b6b53fbfdf2ca000010882b0f01845098737e36101cb200ead48c33f7c040c0f385ff7c0d873841ac3c5073eb2012181f7a5b56660ac90009caec187536800035b68aaf2ac383d09012086a0a8e1c3069ba5055c48e2b2238c826120730cb324e2949421a484049080c910fbaf18b45e440907cf6f4489b280020475eeb019000cbc436f25140010f7a84b51a139e2400b40f02140200024422120391d24c876612b2073d309e1fdc4a1002b166fc4924446d1d48c734813ae2d3aabfc201300f3254c8c604d22da5b9ac041526ef312540900272a28c2bddec9002a0304e9d4d5656c77b444e1d16ecd608c4e30d20c20b20e1ce10b006030000200d0000f720ba0a108050001a699d3a9aacad8ef6889c3a2dd9ac1189c61841641031219c1061000180401006ce9d4d5656c77b444e1d16ecd608c4e)) <<< 16000) + 0x30c20b2081890ce08308000c020080340003e4ce9d4d5656c77b444e1d16ecd608c4e30d20c20b20e08604e009030000200d9d3a9aacad8ef6889c3a2dd9ac1189c61a41841641c39219c100060000401a0001ee41741400043c441c160008b642484620c130d305e149e4d70fd62c634e8bc8501434b6e7983a0714007cdc9d6308003ea2b9b30235a43bb6f0808857e14df8901206ac4dbc08002d90d19c059244094061448ad830511d10311ace745d50e302d4b726508e289a981c3288a280dc20293a121809304ede31019128ea35ac0e1c8c55da6630a12caeaae7bf6c2400a0091a5b4ab3b1d56458f0bdc303e08143827a78ac39840c09e9be4a260a1096ddeca2a6204183b6552b29a083b7a2c884450031444d3f600a0068503a7f859048015014000083c88282c410062060300046522042a05611016048001a948020ec004f9482704c0f01609a03b27acb61ebb1232ca76b58328500008bf9848ac8c6c03fc510606033f21610c0c17f740c04d4e96ae08020544f29120036e3d70216398118082c916df2ca05aee94483746231c9b10c204626da6fea0a510187cbcb03ff42c52f9d7008b32c942c1893ede2982c104c1992d118f404800cbe3c67fef20000113612b567862ba5200620908124e272523bc8018489bc24c9198005125ea05fe5b684962bba41b0a13f6050b8c9744240d4592087c27ec4cf3c008255fd95d6658014011a4b94c617060007ef9ac25acc067fb048019028000098888080e048f844fb7774861222046cca52094497ff7a6cc41658ab087ce3fc1d142c3e94872580c80200b7e290b1c1408fd3b2cbcfb008288bfd29d547000121403202f253e612005c0808123e113edddd218488811b3294825125ffde9b3105962ac21f38ff07450b0fa521c9603200802df8a42c705023f4ecb2f3ec020a22ff4a7551c000404b5f108994f984801702000008e8826028001290c09007ebbdb062c91ec43512c92890c2d082a513081f88fbe67d2880be7319ca32c54895e99d10285bc0a557f70041465fb609d02400bf9f9d288902400a00a10244cddf162e42030926767d3bb74b0a24c0b84a09f0bd2c5803b2ae0996c0a16f562b516548b24113e2097dfe14010473d067df896028023497298c2e0c0012a7b518cf180cff60900320500001311b206c2f28fc94e288380b21dd16809213f90a1cc0a21c742a65fbe9a88a1196b8b672fa7244d8e7bf14a5c4a04524477871ba2403653cf14ece0002624e974a55af3a29002e04002600800093881c02c001be481486c400261661304e0587f82a479fb25088492185b8a433d2fbca4500ded9e5bf01c52c0ae3609b01a4cf780f70d139c3d23b0cb16691839ba50a9123b1608e8a37fa1df02054e57c188fa49489002c03c79c97b8212c9470c2e2556033d9a094567c216ad6c1838940a1841e261c6933a0b6a28440521d00dfe7e12dc1c3ace8750efe5a30749897f830ca4583405aab2f4aaa79f09002f048000122189e3745294489c5533ad8661821ffceb4797a93906f06942da5073e5942e8036548802d183890580445ca5a0d0084001000018436547dcc5a05b08d24a5fbda9af644938a39f97dc6c3486fff9ad0a4c98441c4bb084d35119c45ea17576868c6565b57f53b2c6552d76a1e0094046a70472e01a79f2400b410113cac4874f9138d25438b4c30728591d0f2f6f887640d284d4e39b8b28693bbcd510070727be8b006f88e07e800200080000c11092050001f110fe096946148c4d0196504a31f86ba8920637b01fe1649b6787a4c860cf88f71d7a1636f9c4d9d1828a7469a8cb2122631cd018284082e16f9aed6048013010274ea6ab2b63bda2270e8b766b046289e89c79671669488c60c4818000100680007b90920587e80fce60e5d8ceb6430ba4c3161344f28ad902aaad6083894c891b2b1e234994bab3d2ccf487719729c19c8387532262b8f023075df5edc21d22c19d660ddc306b521200580780fc01ce9d4d5656c77b444e1d16ecd608c524123d030e2cd1d004b04a00c020080340003e4c4f3c5f55750489c51b849a324c3042ceae6b91e5dd5715fbff34a0c6daf784859424b16922d91004e432c84f16009f28e2cd54c8808270200000e2100052e20010dc40e0450240c27d137c0c249b0aef20dca247e01110a3cc2056d43f7c84a20ce60f3b894c14be43c53cb0b1658e7cf5b08a17c80e1568a800132264d0833cc9002802840925ef3a82581848a60f6dea88a24cd09fb231058af306c64137285d05745614a98003f48b2f38cb00178b8c88f85002db559cbe70003ca322c02b68a9002902c0001041b2015dd1c500724824295cf872491ca6835921501c76000db2fbe0f122029fbefbc2840ba512e1ce89119852aa764a1c01a8e4946fa02015acd6f463c8a09002a03001800800089887d84c0a4161f40b0f90100035b10ad1d022068006740c910341a85af1638c411d7e5c38ee26021faa1e3239696508c58ca92fc161a1e2144492f66c50874cfeca75922180d93f1de400654c5990d62480130103cd50ef7ac83cc34cb3bd53ca0989ac9028a22bd595234984faaf6224841b2bf702c02947a8e62400a747b0ba0008002000030243e015a63d6b9f2d40c144c05ad17fa681040c8abb21ca41838cb2faa6aa89639bdc0b163f2982a21c0732ec216299d9da4ea499428b6d5d95c03820259faf6c99f62e1200580709d3a9aacad8ef6889c3a2dd9ac118a072069a69c5144a0284090060000401a0001ee7cd58344f113cc261f6a523ca1)) <<< 16000) + 0x2b6aea328a1783f4b834984f08b0a24841d2151e2c02cef88ab24009946eb32804200080000c190004d5212412923333046be2232c72a6ef613991871ed54c031b3183c670c45b2092f8b19fa32e15b4153c456e490c1b2b0a114298bde6e72244570d3610a03880533ce11e7b569e7c4801702203dc073a7535595b1ded1138745bb3582313cd3cc30c3492483c61011c030080200d0000f93ab8abdb0b56f16b5203028271c71871671249261040e50040019080100680007710f60100024090f51507a0883cc241e4120f1010006d210f025801c719c1500dc35661e41061555211cbd206e8810000076a86f30041235ba06d214c28c0ceb318797c93a470c85750ceab615060d1447ca5a668f850440d0cf4795b0830411dffda334d17d0901200680a8c159631b166f18589491fe0808100000c268c104ed02a59a10c0d926d73d2b1c334e25cf42460db225bd54514120a69d502430425d461ff3c8900260200000f49a1dac8279391580461932032f1c024c8917861033405a7647106cf55d2573000510469ed05fe7c1c30cf7c371923c2d860410609a3ce6ab0b0052d6efea0d5e8700857b8db661864f42404821a02a00009d880e848070261de1301b0900d008064041dc020180100b808058041da020007f020085a6401b96c87614e081da736a7f091a3092c432b24562c39e30049113e898d1d42032f3bf4ed7070c0000558a410320669e4ff03084457a3cb81000000100442c9002601807580ec9d71c788294410e682554a16d685f35e5085fcb53322446aa31f6b86014c0deea81001ccfc2fcce084201000015e335af8547ccd0330b06182b0d0a3c2ec5574bd0c1329c4800000000000000007c2cef998ac8edd5c87cbb952f3cd50adeb1c0f2a679f0100000000000000001e91239221219018e10c002005c200401a0004f843a8061d203a29817a85aa302880000340dd00a16e2460b3e371c5610e5e1dfd8615aa65dae0333442bec4bee2a89101eb0077452184d8d77cad7e4405df25306e5b8f09002a030697a22342e530a5bd867cd983bab7f77c8b1cc3b5697c60c8dcba8042c68d4aa27e0600bea9dde010028186b3f400108040000624e142cdf55e185936984755b460e0169f04b638e3dde4ae5c58c7e909985c50d1e8830e0258a9fbbc2f9c50a0000232380000117916402120080000724d14c0bd42d5182880000340dd0142dbdde177f6471584397877f630ad6de6d2f5c344262bcccd2912208a900338346135b92f3e418202ebad18ce3d8f120052058d2dc31ba7d461583c2049530773615062963ac5c7534cc193490567258cc415060a081115c452782005030d67e800210080000c49c28717ea82a45936235b18a43070311120bd8e38d1b78d348b18ea4063da450d20d0ce1172c5538543656142800008c8e0000022f2162010940500003a64001664c92a1be9e7cc0c10610fc6beb1224512264e6d184392e63a630288d462b6515490c335652b5a0a1df63a56a5f0c17a2b2884da2800000575d03c24009c081852f3413850b2705113cfe58c7ac57921286a4e9c9e0162b83ca97b0a14b7d6ce3e3861ee501950400a061acfd0004201000018936488ef384711445ca9ba882163005a7c12d8c30f7792b971429fa426617122c9eaa969594225a6538d2122000008c8e0000045e459008480200001c921d00200058f20382300110c2124328192e46f43ce5902966edc528210c33cb23f3da605040000365aea080928abbacbdd0a054b3eef01200c0ec1f8b530c01002fcfd6f4b48100ce35a0dbee4a42400ac0d1041f0044c6d8287a2d319ba0a48d681742da80a1538dee742d922f5a1b948f8244a87265a6905040ba1e18000404000085f50060aa1cb27bb8b8900270200000f91a2002812201247a55e90a049181d1ec71c24423f021410811de64c0d12030bcfd1e10508088e457a0400399f85f8a01088020000326606ab53d18f1902a1222fc38c4106bd469a884062c6f4a8341c37cca992c990116ee1465547080000e94a8202170baf61914000000e8f8052420940500003c2439c261cc020e501072008002098871908388641c2320e01106f888378241ba120dc0106d8080081c086d22c364e609c6b0d82986b92c358660782ba232e109f4ce1081874c93224bd9001d71828fa880e06281bea80e28a02197e6fce02aa0003c2ce703d4c2a02245d5ce1b042b82af8a3d9f00e844af8e3a501d2ae1601c2020020088334144b4a005c810b9200e2c2d0000ae0dbe050106c011000010040190080000dc86a82e8ad1afa3989080136a4a1c0171f828400227927140240c1e008000067900020c3646ccf389c50cfa71a9e4808c6f78a0c0430ffff80120a0e804000033cca9bab7dbec0590d057466e90166fa4ede1ace47490eb0616a0023a22cb73f789597ac96028000000000000000020114680d7eff771f28e8a282a838e38a4842046008065bb9c710bcf006c17a6c1658e32cf2ba0b43bbf8046f1c8e3ca687c217c1654a56bb7a9bdff681b50a67232dac10b466b41f817c74eea31cc6550003ef21a80b0d301eae2af6c2d5bc5ad480c0a1be93b786b391d243ac185a8008e88b2dcfde2565eb2580a00000000000000000804308402182500380805dbf048fed2cf32c7200dfe5c4af41ddfe2778436a00383463512dd27ad2a9fe2c9ad678215612774a29d9335990de7cd7c7b62d8458d07f21c6e7110f8eff59a81506a5660a4c6d355e8e5cc321501b1136b8ee7f317375108f767bd35410fb6b1ca499)) <<< 16000) + 0x05750004db21a44b004210688ec3402619e0b0ce0586680c33007438b332a8480c3155e019428e58352e30aa15ef5e8c0da5deb1c800ddbb8e09601cbcfed204e183c010a1423d7c93185c8d7dfe0605131bd1448c20780201960a0000b83e5360535be2cebb05b5b72a4eb93a1adfa289126771686f5a1faf877ddc44f84ee2ee450288faf60be04565c22449eb74c1705fb41662c099000e3dab187c69c5f538c30511d0ca50803e70080cc0a801b742e8efdbf45f0d2cf01c28dd8a2705abbd496766cbe59068e1bc1ec7bac7d96ab72e0b88ce97d96510851a40001f5102a09c0a14ea7b0384c850bb2901fa939f8040caf4ec267014630bf40c095d318b0004c303a0100001233c428877e1848d8da066bfeafd624a09224eedf68f15fe35bd369defd1c26115c01f2f65a4d66f828abc0cd0211dfabe5df38d17896c052bdf0800f308b6733f4ddb06c3549614c10206b8f07cfb92e33af40c0186c008bdd01f63717205afff53434800cf8f2ed6c0cf5f5bad30e330920000e1c8148ec328261920bd46ce8a1a3a02f8fdc5d3135fcf3f27fd2bb0bdcc55b0816ee327fa00000000000000038cb890119ab4155f9f8063c1ce71415430718324118120040032255147919cf8f00423814799fe5afef9dabe32760ea89f3e794ab03954532fad77b9b43372ed4035d5062d290c7027452cca2c28001c490c82d86390c3183618a130c401f872f438fcd0574de878e089beffa2c02aa14a2480836010f0ebbcaac70f6b248a400300080c30100003e9e0813b6f94908fc0db5c3086be28045022cad00c3023e90a78200a3422e126081c00800008a90c005e83a4b42fe20107d816fa001b900bb5023101d00800005210c20de014729502208320088000080203040400006e601002008000022340e45b20100ed3a509040b00202f4240000f8430017008010040218482fc240680200006120003fc42f8640381af04726d3a4c1eec25877aae8f7f1f1ee0dcbdffc304177791ec492fbd129c8fa82da41fda34530ac205238fe1b4033d0646dc9137cf2fc86bd89cd7cc0204b98c347d9eac5b2ff728767c88d52893a4c09e1e736800447ae3ca955e5a8489bbc5d05a4032a105fafeea71209cd2e220ac81c720c4a0ee2833c71b54880d03556cc036d2fbea11860d8042218b858d30c1afeaede10268d7db08c106c02017a0a0bc0100006198173eaa42015526d8120c160040218680001f885d8880008a085b88c2e846000c464070961721b0b809e8399506340a04cd2695e840b06e71a02c09063b09600092100f8043060596773d21a992766a3c0c06fea1e1f69c126fe11e8d718e6a47630529f073798718b0b8a28cdef8c967e623f3bcbf5c033741830438a8724f1810982077ac7cf92e9a9bc630068929cc0ab6992bde87d7b6257de2ab700343d104a122275dd8df28118ccdfbcfcb697707b687132245a29b9bea944204641818778e5bc3820ec3fb285851dcc5b5060877393a58048203e0100000d5215c2b0b71585b02c0013f08569282d484158420440d00032410b43585988e02cbaccf2960172ecd68600bfe7c8280011900e804384ed449448a10786b2db28012e39f89008c5078021008010040218482c8241620a000061215e2b90a3a683fc902160ff110008870700200000fe400075080e0ec2c0570109b604dc341c41e6f6a282652d7df0b012a62d4f80048303e010e10774abb460bb22332c048307401015e1bc1866af6b22c2722de5cc60a03480522402f8c4558024101e00800006890ae118000c690ad1d0560a80b434088120002d521564a0aa1905484c13824000c124006384801431104e1181e04c1340782004b590675c337eea845d5a4cd8f9712732301aeba19a53d5ee134d17c44f142af29f39241e7bc301a28d7abc13814f15cd4c0ecbd1e13e1d7345c07bff623c8ecb6acf3714bbc29986b9ee1c3e39e0026d61c98402096975e9ef4593d0fc691b39b46c813b28832f9652de31e86a68cecc53a509db280010f984b92238b421361564b95ec18b0e2649804836c761071c13bc947fd278a123f385388e7267e10da7ff44eac21b1b59cb69059cad9ec2e2d94e694ad9525d53cb234e3aa187499188222842dd64001c6bbb5df918f7dd14b0a3610e01537182254ba6617b6e8f2dbd1e3e1d701c278fe3d0b8f897fab5898de664fe10c0a30318df2309df4a1fd6da87582681f8d44d3f35c648210e668ec3603556b22041a2452795c501f9c196d849cfba47b56ad02991fd298321e80da756b22f9735f11f44a26c8c8c0c1c22bf6f459c904905940ca598b2038c150cb1358070468900f2971016f4ca2e9b02fc567feed182a171ac13a15ba4d8060101dd6553b5ba94f0b3377aac999ca1a792a61d3d467e7384008aaff08d635e06c1f84807a99c3bfee5a693b5d5bcd6e514000a6f850eed05807e23d776dad80e39b3c4c2023bb13502da0797cbefd4cceb6794f90d62b0ebf4d767799e6c860cbbf82e499379becf8afa0e0001306d4ab8afb44457264b41aee4002d868ed37d9a48b06105ac6b7dbc136bd0eb269655e260aaf186e0a3e365104f235120cc30aff3032ef408f1132f09e1a5024d067241124b6515a011f695f0050002fb250920118721b40015181e00449386b2ab88b001f03a6d8044203e0108120ea2524c9275f85d7a242051eee6e4430e684f54048183e0100a80d0000749092110000cc1c2465320b29c2e3c0ee601a9a33e6a150276108a4eed37ae38fac5287650c35a161818e54a3843361ed51ec)) <<< 16000) + 0x63ac7cb1c3c17cb2c6bd98644e1519fe12294de12e5cb5e069bffc2e59c0284e93b16b272bf467362f35b699234d4a60384318903c0002d744fefaada49b7a600681fd9a946bf79d94a5b5dda75305744ec8a1d1befef5d06201ab76e81f577120e5a93000011f88538ec2985614a2b0a40d81e04c28c15e413a743b0c20d913bc688473f94273021fc657192074efafc84000949074021a1cd52af5e6142be4abe37ca986b51eccdb3afa8498c91e28d19c933b64f0b0278a92050aa32adcabfd7de8ecf6ed55208083c92f798a42342b97d2d4e857b6615b0c2de82a4ee0fc0a2eb7d650257636acca365b57037cd41f6b8e7aae9f99cf8501123b3afa774dbf999878f6dc18983d8d20a52530f26d5bc3c99e873f600869dd78bfd324853b3ebdb4dec11559ccac03c18b59c4e3253d5503e63d37eb7f6b91a11813cef9a81b28564ffb4c587099fc5242cea3a90ebebad3c5ce4d5f73c0043cf001ce9f655a8a3796ddbfd4cc797fa1e041c8f5f5fb77daa2a92626e7ce3f0b3c6ab3135a3e3122a0ddfd8887a0feb3726817619885705e36b6e53ac98e2d46c22194a991917b5900306530748c11ca0c035485239df45444831d7957079613842a038a121688b14544526168b14292db8a012080e80400a447016b220ecc4d43abf908cbabcd0725b7d977ea58420f31188b46fb3f6664bf3722c88b762967914b3ddafc4f7358a6629602aab0f82782ef02bb42bc48172a2c50a620563aa475d804ba4560758cebdab621d2dede38132c2d41f3d0c57918075678dd681204b74806b1af4f67ad4a05a553ab6b1e14ec2b070800bd67288e03953ff319c55f880da0e9ae4de0f85988e5202c48fa97f609dc29cf0092263e0d59d64448da2ff60610a9416fca01e6ddaf897d507bbed2fe20dc385f80e0041944602aa9efbdb7bc4e92744266f2b524cc9871b4d62e68a9d993a8700dcd5622600c738c42e6a55f3eb363c924da9b53c089f8e3919f92dea6f036766a80faa5e72d25c5a61bb7aa7bebf815d255d96a2c798570075d417bef1a26d62c3bb704bae14bb2a90d4a9e0d8759ed75a3b612eb332dc879632862bdce980009d920522a000aeb214433001425207042f315e8f7006106593f761c75929cad101346309b4b04e8ed4d25818cd681940000262c1d00800009690a131050088005b1c84f9cc27857ae955afec0b20b6bf0567124d5f6bc5f71ccf0786d33ddc00000000000000003fbeadf9bb12902d9ab4155f9f8063c1ce71415f6839f1be6f1be6f68390510d18918d04904e010026f053a50d4c626a727308690a57b8a2f05df9ee74a5447fb9026d23ac730b673dc5934f622a5e6f2d5c92698f24b42092951846ac6f782aab87ca39ea6d5d287a74874f21418c89c822774f340b0ca351c34090307002013a1b82308caac8b00815edd0a001de3a25023101c008000050909211c00e9d5b0cb7d2201f22c6767c43f3d86e1db5f85f8797b84891ea6853b2931c9583a89b71d8b856f7bd749c16fc2fcdaf48262001543448668e5a8dce0565bbeaef71f769515f97f28fcd428e6e1d1aad08612ddecc7622c84e7373ec1e419e374a403b235429ebc927d90872aa8016af5338d98e8ec6862f1e71aa4437866ac4416500fe3d62de22a8df12e37041b423302b2800049f2000cce4270840083209b1904d088264441301a03c0504b80c258040016e0757157b616ade2d6a40605059df331591dbab90f9772a5e79aa15bd6381e54cf3e0200000000000000003d30406e317302bda0e7c6f9bc6f9bda0e41442082453401c01804100836b11018d3269484ef87764509aa2859048642db334f64e22e7193aea2b28001b3bd94a4b83bc30bf25c05bebb4139013ee3394d02c1fbb3c3e4aaa4779ad40010b080175310035b43058e88f79f58d9ada586787f3431865801c1718ccff5823ed8501ab36a81d30422ce571dbf2c0548f6b9086090b4b22de4bca00afa35a2ef0b981150d39a138862bf4db27b3cbb02d6af680011b78040ba4dddab8779a17187e63f25ceabb97c3eada0fd1d8b9e5a225e032e3bbe2ae937c1538e3fc5d8f2e8d6efe8910db162fc08cc1efe8b91bfe7939a75ed9daaf7d62e965090010e8dbf90f5b5a89307dec4abeee0da7c1c7be4546bc741e82e2ed805c8d6c26002e55ee259daeb4b974ab7bf00c176c3441e87a5daa43e65261f68faeb73b3302c2b1f2d1c4a97e5100006f92008da8401f2c0db99777a313783a3148115bbab955e370be6918000000000000000707f14d8bf78cf2923445207bea3fdb6ca274f54ab51223f30000000000000000000000000000000000000000000000002f90818608c00a002028020a8003b5521c2fe412ee268918790c7003891682fafede36d39f5637f60ac3d8977da876a673ba66f1456f2d50e3203781e252ecb5ec477746db0ea18ff0a1f11778f3a376d437535e32999e922473f53a20893fed02ec60741afec9f71ee0c3737829d8c0002bf36e5f314ddfbf38e46ee1f006de0bae7f07a2bec561484ae80035810085b82022f0e6026ae68ccf1ef90d5197b2d0f18508c38d56413e4107b4c79d5d0408150fb56735af967561f39d162c4026519cd92734db64020dd73ef0801860ee5db7519d5b8cdb7396d1002e2bafc65e3dd8101bfa9f1120eb5c3ffed883f5638fbb0ada00bf695834468b637bbdd146213b5b7a715ece040e694d18844121a1db6760307846035a061519c1732103fe5aca3880164a22a6000012940f00428435ab81b0710b1f155b103ed8c060c309a12)) <<< 16000) + 0x273a080313c7ca4000947078021c603a59af8b140487551205724f56b0512e1851c61032d010474500f834fd6009840780218309b7d10448cad535fb8c2df5a981a48410d725f0a0b6e92d1e5005ff0b8d84c103c0109184970439d858f2fdc9f272482d7e9ea30b2c21ff66dbad5cae3b48b7553a0e1714403ba93aca2103fbc0b65c463a6300c8a0872b051e75d2b368a33fc8aa9b49dac0865536ba3ce8271f42fec8a347c111315848f6842776dcdf876fc810f22e000030c20540a00045d212a22094090002e310932102a048001c30849128244140010b04240078327c6c1f72bce995cfb25a2524fe45ca7bd3a09e81646b11cf3c0808b39f2bed7ec29729de178ca00045a4a262109b67a1bfefb6d90703b46f5362b08dc0e907bc156c32c2469d4251f7f1bc9eb0c8438280d80d4be372870401a495d4fbfd5adcd5f3ed63bffd19b31c4e850005fcd2e696764bc0b96b7c36370bd94259cae1ef1424b7a517000813c6ea6cf1676f1db487adfe8922b583544248fea7eefad29944a275d73bc0980950bbf36691389b80105d398d85af98434cd2c0407004011a5056297089021898b1b48a201cb83328820f38c2b02019b6ee0969a18a2d5112860891347099800000079500040495cde520040010816060173d74ec1a580696c984ee82880031958a95a08229e129969c1e60600b5b89e0c8061bd8147a0b8c228008224f25e84080294cb1f06324001b72cca6e6c66e804801702000008e884782c238070458facee510d1400015009040896b78f4a310469fea196e1608869b8ca74806ac5dfb846480166fa0e260801f519078b0003d13c26673224009408011a039261d5d2cb8e1800006b8891421a5bcb45148eb4a9e0c041cb740889040000c7fc2043f6f964010499afdac8b001cb75ede9002000861205fb7c758926603732c81c3017ef70652450ea7d04d628a562544ed8b10000038dd920817f057870813797220dc0822ab943aea9200460280001cb2000726423014000b7078f4d05a860ac2830a4a9a6e140e1aaa9a8545b040c084db66fc418638faa0b314281128d2336b08e09eea85338548003178c6649400092afe6d268dc92005205808b01d900742bbaf5298823a5d48194d1a10210399a81b8b8104227165eb2560604026bb5fbf0c8b040d7a202eb0b90092efe955e2dd04156d8a7025df850007f307ed4423cde12005e088b20107d28a3dc10467088c8d6402041efd3647a902083c76cfa5940a0c057fb3c8740a1015fd95a9982012a7c80ccb54102030cd00dd5410520a3ebffb16e42400ac0d000043640011e484502822404000db274704c97ce11459d2e40821420264982f1411e3e4fb504116ecfeb41403c4b91c20800264b311040148c4ebd000778b7feaa4008002010802077010440081d80402602000216364007cb5f632020502ba3ca2d405080277e46404041126462a2a759818000048fa2010300e286210b4186b40075e67e4400de03b83479000490a2c8901c9a04801581a208230ee9d448816fa4390411b0f76c1061be373dd02c2089dbe74184201fc650405c26358f8a0044ec87b000ed4884554800f8040000690f1d85e040c110188f9952840c358d1a9b1818418d8e23ec208c820f66914086bb277790c10cfec9e1c2001aec6500c003a815e729524008c05010e020001df210c0be38bd7f27f722850869c34abc38b3d204a2cf030c631b64edf0e097a2d0bdc01010434ec25a6400059bfd39283000a2d1d1388000f3a9c6f26c89002702050e0055a646c7a8e3fb205b04a20850a3a2a41e5b4a1018bf45eb8aa2c1869a2b44edd4f121034e78e7662450008d123cc52e8e013595b3c1b86000b8ea1be98044099a400b811000047442141400002000470210823c355e9e307c2441aec0fb4830851f14aae8208a9b4db5312088f4433730c10903aae0a10202ec9b5447008f96a8220001e9a2f126a4801180a38800001e9cbd7891809ad9556e37186c59a7578bb50910303211cfab51c209a55ea51280208d849f399a801803bc5c0e3aed820003e569552d804038d992c88d52b112400b8100000472420c0410402081010400080011c880078b100225520fe4307e1981e00ecb67efbf80404e5bfca2280e942b11460072de36f0c0475fbb9800000001e569480780200fa2bc13c7afb614edea06bbdd1643d9c4a0ba5de350955c943d6c0befb85198bc92dee1085b807455920bc1b2dacb39518f7f50a167a2e7da8d910b44448f130eb18ac05593976c478f813dac36485b388cf1fe59269833311f40a23cf1f114d7103381371804a51b9343673daafa60d7c98faba9edd1c780af8b3e60c72642874cc37fa10ae1f69b8ea2715ea6d6e9dd263456a6c46a000dbd56f607f58132bd22a6ae179c858242397fe85602a2ab3064a588e540b0a37988cb44b3278d3285611454b99a936eb74b4f11d0dee34e00e9b72b3d3b15d6c77c6da798aaed75a9f0e43cced019598a71947eef8008c86eae2dde198c86016516ee575710d2e99baebce5af6e909411ff480f349d2f906000000000000000000000000000000000000000000000005d38100c8e38e30d2491871030c10412e200200da1c0ac4f11088212f1b32b53c232a68df7810411591be2c9000000665b8a03b93128dd000be06ea10403972358a193861180a2c80e5b911a4118109d46100f7bf9d231c18000443d3433dfc005c40223ed5350264be70d98107c031e425b87232851b36d7c48a6bf4f4500d32cb821a1fef6009300059a3ca5005b7)) <<< 16000) + 0x37bd9c106c02000026841f014000552400116883d88c1e8274380a701f4ae03e94fce8de6096c09372c516fa45d42b68b3d7370647c0e3e9e48215995b0c07bc13d404ec9e90f01d549a68f9342027507def1e04100d449439c4b9d2d906250a68366fd7854ffb128da82fd8bc22a91bd9e0000017acb4a93e31d0c41b5662ad7b3b01377b28b880a9ab73b543fd9c00583c83fd7ed8d247bf403446ef66ebc17c59a9ae0edf10451b8ef4c806f694a6919092071c3859d918236bdfd4e2de23156d3d3cc6598f650a734d35f3ae9cf4688ff772c14ee155a5e80499f22bdce2941380c31c50d81bbc50e510864922d59e1ca58000f6dc1202d81de12800d00401e4040001e841e017c3eed25c172870e5b911a38f54426e48e05d8ad14b840d2d6d99c0413dcd2104780000110f4264b311467081f00c71da360438810aefa5b82062642a8c1046971b409006de71c925081c008000076100027920ee120760100980800295c80089310018f820ea12001a5e20d20a003d5f38560e70edaff25b0aafa749eca813cae9c82d93ba0000000000000000395cf8c018c1028860c908904700500301000c2a994d9887498f10c80569f6287ddda47cb2e0b0d7a5d85d66aab50c4628b5c6e7ea3bbaddfb2579e733544d5276e359be836bb4fe6b477d0c513e41dc2ad5e923a9bbdbedf5cfb7bdafa523a065151b888000000000000001c3a6b28d7a73ad7b5bf7a931e8a5322b31ad34200234090400000000000000000000000000000000000000000000000bb8745bb3596c77b44493a75355900000000011df56fcdd8948171d144bb8f89afe008a33e0aa8e21410a10e02001fe1ea7b6d743fc171cc6f6db9ed48d5bb21a62bf812d81ae39770707b0dfe9df089f3ca27127be2470807629f0e741972883344a9247a85582994241079d8ad6803b7f80157f144bbb0c0dd7795884f54a3c4c9a846df1780fffa68e898802adb717423d27d393d078210d8b2f649392e55224800011ec30600016bf304e7133dc2c272dc88d000b5a315e0498407002181872dc88d342194de8a258400005afca08e70e9821a067cbfea428018cab63c00006606198307c021c36506a4dc961c39c83cd94185fba25e8a0a3e4eac1020a7e5ba0f05fbfbfad45042001471079d30c0b0fe7c78094182c2a3d183f012d4e083507ea40800d544ad33020d804000043483a02800097c8001e110731183904fc90002d7e3090002597382c30ae51380455c592300000205a8a0038018f240015c91c32c14a950c3add9470704d5953864001b00800005e9f24006959382c29313c60400bbf338045bf058c00001ae2a800d0023c903c533f861e3cc0cc8e0877a69323020c8cefa90007402000018a40006f8e8e2b2bf5250e22bd2f2502597cd06083c4679a0380307960a4a08380100710500008010700983780fc920490994306811d0aa07082af61a38415ec027423809e0a4b68600000866a28c003e028f243717edc60c5bc05ec30e378dad820abadc130e04ce6719e5001c0080000749e2034bff45909fe761041db54501002fb7f128003200806e01000064906d05c0a1b703730586124b00f030e478c54da000000bbf33c02333d3a2680000219aab000f8062050a821cbc411f9d9c185860e01eee0c3a963ece1e10cb23e7e5001d0080000779814db81b982c3249601e060bbc37e3100000177e6781199e9d1340000433556001d00c40a33d01722094945398b0c4511cb9e113f58d20c1518c90d5001b00400007210002183c4179e88b1640848b2b84141c862f0609db7dca820acf43af1000b0523f93020e00401b01400025040016948358480023e08350080038208009a1906901000d5890680d03384819814003cd8401879c8329cc138b603822003015100edb4008a1227f8b841419e66844038037c233445001b7a0f2004a203e01081440cae6a0e104119b4b14241793c6e38232a05fd4506840bc76820022aea6c098207c0200c812063050000a890621183086c180360be0b02c0182f00e870b2b8ad071251acedf143055e32987099573eb024033c50bc4025101e0084880001e1f8e24c95a66c2065450ac08e114fb96a0280002621184a103c01005d0902e00800048482c88c16c1701a7046dd4306f1198ab8c0c6f95db22004e5ff99a00120e0f004000035c82d08f0a0552b68880c4ef92b40c19e82735c0c20bcbf9a0202224310f43067c42f7804c103e0100590982c02f0a4180074101f073c2c23065ba4f288615154d51c203200bf20060f93952a428021fb49f804e203c01000014e20ae2a0561102a8481501400061a414c54000d4a4148a60a25205009827848138260780304d01e9243450469a30bcba95c487129675d8c1a68b936040064f0adf004a203c010c30454ef70586436241e121b6a629b6307607cd84812060f0040130340001c6412445840fce654e282ea6249ea40416f358e8b06805edc498026fd394900094607c02000020840f8460961303c0582502a831154963c4862cffbea860e6b453751a1054100dc1821e63e09e18416a8eccc026101f008692124f9b88d1844d5d60961a1b0cd2318390d6fc906804dc1dfd4025101f00800008010491501c0a812005216736a77d2023542413e2841a783c402047f8293e1803946cf2f000194807c02000021040b8940581a0003d2208e5b0462d82292c1104785a9a6b0c9036a24880c011afc1b000288f5b8050306c011008010040218480000dc82106c104260800bc0bc62ea1d0810cece25c80045af)) <<< 16000) + 0xc94500231c1e0080000569b0705ca9a4203fc7eff23001fcde9a940345ecc8440024201d00800006a903f1d81f0ac0f4540780bc2c837030210c1800801d86f031f027c61833d42d302054190d091820d80400cc1607403c0dfed1b31801c2a0c7240d01f1c284c306c01000013640005e081c88e8115f1aa3c305b83c3d73409cba3d30a0003390de5009060780200001aa40e05406e1a8040080200d82606a0b03401e04d5cff02003a79a844103001003309c010040100640bf01f12a5658181c28909040c80200001b88000601031050000b81e070012c667005a80ee62c02e1b936a046203a010f0a5fadd4c400194a91b1004d636a806004116c8d24081d0084037832621418d9c96470f3846625026fed8490006402006403e0d22dc1d2c0554264a44083601000007020002ac40c41400049e40c04400064640bc6603823000554205c5202d1101606800233881496809c240018e070a13d766cb7043e56a7a6bd57c396d281017a24f3f394dd21b05ff17c07c50a09dd6f91804a50f6f3763c40857df03033566e3d204eac58860b11eb759f806e40032b6fc8dda025347f8886a8400c7d2203eeb24eb7ad5da32b3c89429a701a73393898055b18990b1c4531c608d7574bc9319c68147a4858411f05856d4dbd8f9c1304e517ee32205d464608c4dc7448ce36f8bda6e74018e3ab1003234bdba309738e5830fa13fe02930804879b01ba3afb29d6dd1e640ccd22001c8d8abea997fd12af04144dc9f5d8b44920b31cdad12f5e0a59471cc561038a906534911712fcf638782e32291037f23b9792071f36dcc3019e9a89800130c0e80420466b9c6cc845b8a02b2d0888c20070aa09605129cd9cb520fb5e193468c739383b0eea43020107172ebd51b4443a03971ca0444e1f0a7006025e3251876a475afa71e1fd17fa7b402d981004cfd084b2a78178e2b001b3f15d4047f18014a0d02dba21f6de0a333be5ddc99c545ae0da905ceca52e4419ff7d02ab34c1442286e1228469974c30b8cbf64a0c0a3099b6691840f00400ac17c701f5ac8848a1ac08478c2ba650bd63037b383ad16005afee924005cb3a67813060f004000048c8000fb102a0500031990007712052320280d013828002cec81318809494048220230d011028003c70e15839c3b6bfc96c2abe9d27b2a04f2ba720b64ee80000000000000000e59ab4155f9f8063c1ce7141522030c32411c01801400804008d518c17f58eec703c9c9cf3afd5454bd94ff02b28b9976da1078e2178595729735e7c620d3f06dc9d5c92c094b7468d02c21c05e315180ab23d5d26037432ae27f7537ce643d175841800000000000000075205f1350105b2599536e4bf82b33acb042917ac50193c0000000000000000000000000000000000000000000002d5f56fcdd8948171d144bb8f89afe008a33e0aa9220821010e0201084cdea9e834ea507e68b06af061a497c9d1d1562dbd7fc5213552bd2dc0fcaab71ea86785c105a8950210ba5709ae0a75bca8bd46b32300c643180887b4f5b31417a194f3f4d9a8a7f169ce3cb25c492633740844d19cf798f22a0995e20cc22d168512a2bc0a28b8b15701890c4c9407f1000c7cbda60c0205f2960004a283e010b18b9d2f75186d56f9f5070410b74d91401f26e7b8000e7e7cae009440780210000100401080e0a0a6ae6890098f69805002fc69240032d03af4a020e0020000300c020040100000444080240002c840009e88001cb901f0900f00800295c80e948070960364201a0d00c8480601402e0a0160100071a10031d320078546ed20f60ae665f5eb48cad88a6167c983707acdc16ec00000000000000000000000000000000000000000000ae2286304302282202180100202ae4370ee8101e80379cebf4f7358e2c73b98d7b38a2c549b17d16a1264fb3b82a4cad8f0adb30fbaab2d5a20eeb601e931728cf2cae11471f942863050ed064dd514200001d33a020a29810a4305005bf65f64e20000001d1f00c01900ea4272008d1c8094051c55d6a022a771c3b2121b2c79082043851af4c0c100005b4e38200187d57ebd418006d50af666140000024808840321c50a0081658684a3a137c28a9ce7473f424510000003a0e3cb180000242f94143101b7fe4a130820bb6fbd4f94300000018211f41000000000004e4400158102886df6e06b2c60000174c2460000176d08205164829280ed894523a801000200003f0d96211226014515937c19bf858c00002517a50c5278358181041ee569fcc402000004a5030000001ee2c1000000094a1400120042886ddcfe3f2c6000b0c0f0820ecf74f7201000af4c3280ed8249062400000176db001000200004a080017210150980a00fbc8933fc3bc0b0002e3abbd09794d695b019cdc8f0708a28b20a20a18a086081046030000200dddada97e080263f4490dd536f99494e2e8c504e93f185700000000000000001f09441631010410a082094012060000401a00030e404c17fab9f1610c8160005c7577a12f29ad2b60339b91e0e10e18619010e09200e006000060000401b860857c7c1a165e46b060521848000037bb9838000024e7163949e15811861877f5d72c0e0800007b8b0a0000002527d000480100001a134436f3f9811630005860790100057a6194076c1248312000000bb695042000400007f100040920240a0007262001ac040441402002000f41201e0a0010fb201c5a00d210060e802c640142a0091100404801c1400c0200501000aad9004210018880084400202000010060659)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase1" = "QuadFullFourCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase1 private def zz2185:"s0889"="s0889":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase2 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l17 l22 l23 l27 l29 l33 l35 l37 l4 l41 l5 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xefbf5a5ea, -0x59682c120, -0x31e60e220,0x2ee0], ![-0x59682c120, -0x288420104a,0xfb8c479a8, -0x55b5f7084], ![-0x31e60e220,0xfb8c479a8, -0x2b973db529,0x90d0c73d6], ![0x2ee0, -0x55b5f7084,0x90d0c73d6, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xdc95de2d,l5),(0x4d5b4caa,l4),(0xc219ca96,l11),(0x1c9501b6,l10),(0x2b65e9d6,l13),(-0xceedf0bc,l17),(0xc22106ce,l23),(0x733438fe,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x685981fe0,l41),(0x2cb417800,l51),(-0x1402e1c3a,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x685981fe0,l41),(-0x1402e1c3a,l62),(0xc22106ce,l23),(0xc219ca96,l11),(-0xceedf0bc,l17),(-0xdc95de2d,l5),(0x733438fe,l22),(0x1c9501b6,l10),(0x2b65e9d6,l13),(0x4d5b4caa,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x24030803000000001580c40100000480440163010000000221e029804000250982402d003000000003c0124018000000002406200800054240580f2006000014848004cc040000000b0900e601000000002c009200c00000001b00490060000019024030c030000000c8480e6010000006c0900c300c000340208013180a000001902c070c03000000dc220166018000000005805200800040811807c980a00000188a4050c03000000e46206c60180008402c0079301798292086075f200c00000841400f0c040000150c8280a80100000a4681809400800000311481b1806000000001e014802000000078381460100188531080cb40131029821000f0a00d4c109043032b9006054086044016e80280148430c80cb40129021819000f0a00c0000000005018802000000000700a4010000004211024300c000000221203980400000000a0c0cc01000000000d80c401000000002400b200e841480840066a00c00520a81200f5004002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[![0, 1, -1, 0]]⟩ def dynamicCode : Nat := (((((((0x40e49f262b596330ebcf3d048dcafc7aab9032a8bb2122380553eec710c0311ffac540cc1844010c2645ae847d9648f09ceac730386780c698586ca1ee72a49008ea654fc020060f67f7098008c02165c11a89a79df182ca09a2f5e0406826120a3dceb421630b24268dfc59fe1c983010bd9c83ca0b305074f9e183dd6a1040c9f001343c8820400002d10b8641802fc064631526cea62400cc0e00004c86c84d383dc025103c04e3fc4b1602b85add92083f0c95be20140d50ea6428028ea1f1d82010601bae913821180400005b0c931c7371dea0c20000001772124054363e3a03070000005db850e0b2f77eb7091c2a1b194101420d1fc1a14028112173c28ae5004422e84a8c92084e018030050001021000760205e0b91c335eec6e44838f33c8ea35e322851889b6f5fd69028a0ebbe72ef4714416f34c693c4081a626510d7020217913ff848108002b9f7cbe6a8000073fed909bc80c56450b40900004666a53c8632932e795991e8b6d9cb316efc46e0866df720daa09f000000000000000000892c13b1a53158e9211baf94bc0baf3794bc0baf21391220e20e18e08c00a008002db0f1eb2a6e08b8733b93feef8d33df3ba763aed97793075d7684edeae7e446f238191d9d828f538379c26f4569a31f91263cc5ee896e5098addc63d0d5a00081a603c8215889592b72c51e51518338cd92a482fee470eea4414203d54254a16d47d16bb2b1009363b4237977724572acf0c04795869ebfa98c6cdcfa304020350e64396bf3a8b2ddf443629390b6647f4e280c3200f2217da31fbe807673387bdb875dc401e61c540c80001a39818386dc12707f060169ad604a15bac2d7fbf44985c83410deca385a9dcd6799c42a6906678ee81474e993111f232e99016c2057081157749a518b005ddee022e33cc24c3937bf7f59225b46dacd21020bce32bc68ead403ab86741f8d13467f9b723f8b35d9da697022409ba0bb469c3741bce6fc0cf67140f2eef8434d4cab8254409076705e993db60a1356cdd15827bc782918a98f22420c6294000270983eb6777dfc97c55557b3b0ca8aceb0270267be20000000000000001b88c08a08608c00a00800143ebcd143c899eb8b75a5b7e27f25cd4df083b9d0fb19dcfcf3f54b927f8a21b6714fe3b2d3b940c2bfe1a6db4e9148d6f42ac491a3750002ec205c4b02d250160280ac050306c2581322f1c293cc50f941830441e9ad52c945084eb7e905b810009d6fa87ad01c03d125d85a4628013adfbfcca049a2f2f8dfeb1dccb2d81b0b8dc50ac081483d0a9d6ae5bba36280556253793e0781b81b6ec84fb738cc486a8fc1198154487b4f3b870d8e8d22406386306484284480300389fd3c01ef3ae73356c140c7c986d548dce819832149e6378fb9c) <<< 16000) + 0xe9591ff3464e0a6e1fdfc3c077f330c743207439c1e43fa524e1510fbf98b88781a56072164ebfb200c20cc0517d4a4511ef5c66cfae3865fe48bc0c00c3c6d27fb3fc0c11d51d8d926c5082573b68aca2008e576ff4ca000ba78703956704801481030815abfbd5ee5451130f3af61f790a183c80c08c9580c38d6e26671c603042d29fbdd6d44209489b069aec60c09b6ce0f3ca3014025428b579ab40005a0d6fe30c921c09002f03800011f902a0581482f8c6c6d6dee71c714ad26f7370c0a2d43dbfe4abe1c412edb2e16aa28606243289f4030c8bb1ef52d10c116e5728c87910225ca391cba628067f5de9fbca589002b028718f4ba5377e4618199113a5ac714bce9dd80a8516e044da394871070eab08f4c4102ad3b9210c6087ff3dda5d840846d9d7c9c8800881fde7f3244801400e00007e4002614eb6f88cf8c5142c8da9f34c610b930949a90412e5b197740860c4accbf6c8c30c126a6598ac504995451e49030480c6bb690070038e4148d5244801400e00007e4d0e28fbe6eda32186145f97c9d4d142e887faee5f8891598dc3e70b4e28802d10917e4418201688501c80041016288c996487001aca6dbdcd27d08042d02c0000fa1014010004379000d122002168606656b86c9a2056ed1307ac185000005dc0202fdd916bc81c246f62277d1c160cc9eef818046f60b07d000959eead5ea000900210349a886393ee20556936ddfe6030a00000927c0070cbea1526776901788e7fed4021c20000124f80038237ef0f227cc002e548d1bf766440015810000077cf14aefb1fe7c71186bd86318510bd5a690044104c8186f6830c744f3a8c87076304169e0606380f5270c500bd5a51904400594320544a410900200003a440a00404e02026010128080017708120ec08c560442b021158100ac07c57028e2e71f731c3ad68e662a396237858bc306b09bc710f4e803348193bca201a6840541bf6df1faec27c428689f06e9816afb7df14576b9bd22dedd551947e151120916e414348935d5798c8874bd41527e0cfc2981005326940ee13b5e4d7785a0c33048eea6a3ec07faf36053e58ead7ae0f63368989f23c64d2c2ecc4c98410089f05963bacf8cd41b4eb2faf5e78cd51c4b3d490ae14e1c7c0705eedabf1a94a2759460e0ff856b68002807d9d6a712ea9363e4f1a92bbfe0b12b90cd4758f81ce22fed36acd98c29c0da83a039d1186c88b4c9955b6a3b671b5385ad9bb3fc4fefa11b3758d5644e09544d95ac52160c2c47fd53f2f6334857a14a525400780524b4074118303157f54f1000e804200002008000022300401004000011101d0980d00e01002008821361c9cf8702a1ccd4d422082000800003e901c09000067901b05f0131670a60f6059fae62e75053ce34ba9fa5de3e8aa5bcfefea488a9e1b1df3434d72530a34d79eba9f719d48db1fe59745450c064617642a51c60cc9a6955bc9e2356dd08a473498c882de1800ae9df676c87d4ff187742eabd05f86275122faf3e62d6482301d730b75cd6049fa1f2e0b8685382e702d8664107f1bf095eb623aa8a743dbb76ffb023ce49855a6d93d77ba1270939b3238516a4c3f3c89bc4d259aaaa3923764a3d7fc503b65f2d9041f6ffbe08adff8245eae74999b43f107cec533e43c306510cc7ae40001984d8e49ce108c40c003209c640607325186284aa4db30c2051ea4ea7404a184001001a01c84da0c8224182057a35878a1176d66e0c20400290f223805244cf8e0008c93625c00cc204201000013720320bd8f33b5f321ffd219c94c0a9692b3a91ce8172c13b1a53158e9211baf94bc0baf3794bc0baf213800000000000000000000000001483d0a9d6ae5bba36280556253793e0781b81b6ec84fb738cc486a8fc1198154487b4f3b870d8e8d2838420218238030003397148b69972b8e1a90874c025b172d0376ae783fa94e6a98b39ba649281577cddb4a1d57aa896187c5f489a9bfd59df100109ea0e57772755625aa8201c090af75919c372f2bd37b9fc49d3dbe6091122caa8caaa73400178880043e1d8f33b5f321ffd219c94c0ac00ac5966fbc740b9635ba248d61944cf4c6f2acea062763818140000000000000000008cc5c153fa56401a4fe47a2db672cc5bbf11f10600592b1fa01ac000000000000000002215c04c8fbd3a2b4a7037282a00000000000000000000000000520f42a75ab96ee8d8a0155894de4f81e06e06dbb213edce33121aa3f0466055121ed3cee1c363a34a8e09401200c000a155fe675177166fa789dc85cff07b3e3df66771b7746619ed04bf8e918799523fa197a419dbd2ec137d42c243bf6cf592beb2f4c45066b8c3e652d71e12e7113dd963d37b0c45e0cdc4c493e7e7d18be5090d0d6ef82499e069f3108c1ceaa7a60aac22d9697776881579a15c3f4c791683541e518c1b9a971936f93e843fcf050008e8203043a0806db03541078b74467e00848708401002e1301605c080f3c659dc93f30e354a3566c8ca09e33c687dd8759d9455284475f6a2d66187fba794c42a6a0537d2b89ae531797f0e3ba7d7393cdf430c0f227b773ac222211fb6768a0b1457fab75c29e11ef79d31ae00842955895ae88a077ebbb2f8325cfb49913fa82810668eafb0fe65e160e16c027d3e37556d62843cad60f665989309d0cf20123e356e8ed42ac078847563b840fdac01590cd8568ff3fc198b6fed8b727ca5c300d366d23837a5bc2c78e82a58bdf0b76e332d38f2f3bcef1772740ceabb8f55f478d7bfc20b711c99aeb6e33b31b1f)) <<< 16000) + 0x36f4ddf1198638f1fec6d6db086ddf1b72fa03bf3014b86104ad798838b3d567af5456c97e2a044859ef9d9a10dece2d96129810daabc335e404c66bd8f002a0bc3ccfa70fc43464895fe6956d1d6dbb3a5104d987b2bcd867f26e1dc8bcb7677b831a05213155e5199cc5a71f863ebdbca62cdbd436d0c15af1aeca11355f166a027de6d4b59de414010bfd349f7a692a34f90e7b39b01a96139af52835441b5f1538551929c66a594f0d91a7b5a2edf3e79877f3ba96adba3f265a1468062f28562be289aa209375f588035237e3d510014e6893e812199d9dabf6e78ec554770cc39dfefb63a7aa65c8c119ead3f6ab2a84234c9a159a30be6861b1f670cc72b8cc62003617faf59081a4bd6a05c982b922a20b5492ac001e558962a41398f8c1497f57043ed623d91bb5c19fd7f4201a3bb9ca1d02924a5833f95626135ee59de898a1978b36113a120792210095ee99619ce0081973c72476fc359aa13238fcb70907a2cf6b708cf4b08cb7846e5ac8a527c48121d477aeaea781bb9706875a160d4bbf8cc169ea494700064e2dc1105b403998ba66303d349fcac885fc050748c78d2140001666405004002824400537880179d1cf3fa31ca47c0a7e41325e61a403c767f4be1b04cf377e8800000000000000004031000c9fea4110162d7bddd023d286fe0078a71fd5e631b2bf54d9fba800000000000000000000000000000000000000000000000000006831860c31011c01800050ebf8ecf38bd9b1f70dd4cec47821ad6f0c0388503c2c57d28055803e369b578730c8b158b1eff777dc228f8e2abedaed5d5bc4154b4635e111bff461840a96819c9404c04000a76400f2fc802b131b90eac6bae80598800615016b4681aa4011d5ca210d3d51d6aaffc16a1319028820408208a006008d1a870025dd3cda32eaffb6fd8659337991ed4bad18b2f5c87d47c1a5914b0c430cd40481703c4989cb369902ecda45f6b08c28000041eb0040d7cc65d3bb82083b0fd06361002cb3519ec38400000034bc0086c91b21847000001ec3047ee30500300110d00010119140cfc07f3cc3d89102afc4db63deee92820300bf0c9bdf0e96a306074abac8853425c4081c9f843216d28704141b0aaf6d5457f22410575ba9bffcf50e1800deea7dd6f4e99c44498c9e4fc5e4a8c5a1cb540c1d83000401702b71a6af7a1218500003f29cc4306091c5b67b384081239cdb3f584154c873e53c62001e1bd575bc810000002d485d8416673500f21000000cb2008d07182b02000786800087c8002829e301d3cdced90e27a28dca2c20618504c2de010e107db56c08b8a10504c7e7110a082826678108400bafecde400200bafeee1e002815053893450a050a007001c0be24616aba3fc1c31332144e4e38440a49f038c50800000f618100800003d860041000007b0c03807a81fdc348090c242cb0c00000520822ae284e02800d0d0000fa900c1900000800111880580bfa86518abfa86518b0aff922c17d5eeeff4e09400000fa00d8374369dcd6405fc6bccca80226c799daf990ffe90ce4a6054c70c30850040030004c0aac20c1c7ac755a399070b5312c4f577262f7ffc190fba7a0c903221db8d49ee7847c7ccf41feedc47ad229f1e5cf363f0435ae07a26fa1f4dcea970231d2af3ba365607db541fe8fb9092a51a458d8133ed3463dc50b15a2624f9166c5710d24f17feef90470cb6785cb964973e65f904b2ba838d8ecbe675ead599f660cb89a3ff1ea2790e1179964a2005eb6d534cc1273f0a084567cbd08000a03e9e1723f1af6d69e437f523a7311ada4bb52e6420f7ff161ef28a90c1038ec53d6801de8160eadae7cc89662df24251a87d9e8ba0a251e357b4e27ef750e8a6d7078ac70fd8c51ab4e30354458d9d87c9a6863f0b841fefd971396554d61d4f34d8e84a2f300c74e48bb7affb2f8d9ba281f06692ab7e9e4e1afe7956220a551ca88237474a4254be1cc1df1e39aa024c9b168c83d0efc595f5e0cdf5f5e10000f988006a7578f398b6fcf24d76b3a71bf95fa5dd698a660d583781a0464000000000000000000000000000000000000000000000000000034000000000000000000000000001483d0a9d6ae5bba36280556253793e0781b81b6ec84fb738cc486a8fc1198154487b4f3b870d8e8d2840a288402202280240e4a7a2845edede5bdd48727b21a8a86db9290e26823e6cb4a31c494d01cdf6f41fcd0fd6cc9c04841857d242de2317abce59612da0984270eda7aa7f3b254f45b1f0c0c30612f8024be24018fd3c043d5442b159a424b1775b24d27f16fc4cdeda7063ac439393bcf80db6f48db768f69cf6506b7dd4676519ee73e80502f887554ca5cc7a30800587d2998c288587c0bb4134306a23e6b7a5d818776b2128e7642004da028384ac1806b1ec7876682200006acfc011f41c60b00b00121a0001fe201002000a4c20022d64005770d16c2d6ec4d395738bf85374b16d2bfe04aac02861e5fdeef9fd735994d5e46ae3f94e3326aa181000000c0fc0d6bc2357805e9c1f26e30da00a09863c5d621d63416198fc4733a8496ed402840400000303f035af08d5e017a707c9b8c3680100034b4e040da772e40ceb195c42a327600711004f0a22435346e21a7267428a8b67f9a09b241df3ff917482e6de1327fce3b30c468d0001c1745d7d30cf47450c3e4d40376181000001d4c0504ba4b1f6f81400a4895e7d83000000017701100000177022c304c0080060d0000c910050100200800c04004020006cb200202000010015909)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 18 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase2" = "QuadFullFourCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 18 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase2 private def zz2186:"s088a"="s088a":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l21 l27 l29 l30 l31 l33 l35 l37 l4 l41 l42 l46 l5 l51 l56 l57 l59 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x7391a8561, -0x59682c120, -0x77ffdf030,0x3ff3c1674], ![-0x59682c120, -0x2643bfabcb,0xf2c3af21c, -0x55d7af032], ![-0x77ffdf030,0xf2c3af21c, -0x2b973db529,0x90d0c73d6], ![0x3ff3c1674, -0x55d7af032,0x90d0c73d6, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xdc95de2d,l5),(0x4d5b4caa,l4),(0xc219ca96,l11),(0x1c9501b6,l10),(0x1291f1c00,l14),(0xc7f4b76a,l13),(-0x4630ef1c,l17),(-0x6cb2202a,l16),(0x274f8bda8,l15),(0x267954798,l21),(-0x36e0314ce,l20),(-0x2cb417800,l27),(0x2cb417800,l29),(0x7bc32b1b,l31),(-0x3919233c,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x20bef651,l42),(-0x5fb5d97d0,l41),(-0x127fd674,l46),(0x2cb417800,l51),(-0x4ca58129,l57),(-0x43aa813c6,l56),(-0x1ed91038,l59),(0x1a3df7150,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x267954798,l21),(-0x43aa813c6,l56),(-0x36e0314ce,l20),(0x1a3df7150,l64),(-0x5fb5d97d0,l41),(0xc219ca96,l11),(0x1291f1c00,l14),(0x7bc32b1b,l31),(0x274f8bda8,l15),(-0xdc95de2d,l5),(-0x4ca58129,l57),(0xc7f4b76a,l13),(-0x4630ef1c,l17),(-0x6cb2202a,l16),(-0x3919233c,l30),(-0x1ed91038,l59),(0x1c9501b6,l10),(0x4d5b4caa,l4),(-0x127fd674,l46),(-0x20bef651,l42)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x410c406c30100cc14224c064900500000002a00132010000000290702cc020000000057013200c00a510c1901d9004002ac430640764010000002a02c04cc030018c5112803940100000000007024802000000ce0b00b300c000000003101c802000000ca0e013300c000641982c099003003286304c0464010000000019002c80304047084c024c401400000188a40d8c03000000000140d2008000000001501880200000611440c6301000000188b0078c03051838824016e40140000261909029002002448108804c401000002c4a101b0c04002d04506001640100005a138300b9003000000000340e200800002d2913019002000164a226024400c000000083021c804000000000030320040000000360c0cc010000000a4240d3008000000000140c8010000000001f032004000000003e01480200344b109004840100000001d09028c02000000000540720080000001d0b028c02000007118406c30100000001d1903cc0200000a124406c301000000000070188020000007231014300c0000000011018802046c7184101fd401400991c453018900400000000024072008000000001d01c802000000003c00b200c005409c1401b5004029828826012d401400520a81200f5004001342304803240100a20ae08801b5005001702807005d40100000000098024803000000000380520080000001109018c02000000001c009200c0000000012014802,0xe11840693010000003a084028c0300000000e89033004000000310a014c02068cc104d01564014000001d864058c030000006611016300c000000006409c803000000000a40720080000000027018802030c43042011540140db14610407f500500000000007032004000000015002c80300000002600132010000000013c04c803000000340a01d300c00000c4110128c04000000980b013300c009108c190159004001484109002b40100000014884050c030000005219034300c0048084150091004001d0340840784010003c0841a0271004000002105003c30100000008828030c03000000000140620080000002e0d018c02000000b81900a300c000000000d0188020000d8260b014400c000010c13012cc04000004405009b3010000010411016cc0464852028c049f40180000000907028c02032850850015f401400001d11070390020000e46222024400c00001d19110390020000006219025300c0000184310254c04049828824016e40140004b218240ad00300000000e850330040000003211018c02000000c82100a300c00000000360148020000000d8940e30080000000019038802023030841024c401400000c42101b0c040000003211014300c0005d15824079003002ec530440364010000000017002c80303e061883021c40159b14306d01f750060000004219014300c0001021b40360c05000000044340f300800010a1c40360c05,0x51828824016e4014000002c944058c030000b894b0092301400002f4aa00a4c040000000b8a807300800002d0a100a4c04002f47204c055401000b41d81903e90040000008e3f026300c1332161b00a29005001cc360500c740101752922c8052900500000005c380e30080db1461a80d29005000006714c06a301000001b4570128c0400000691580253010000001b0b0074c030000006829015300c0001a62840628c050000068148095301000001484200e4c0400130350740c84010004f0841100e5004000000028180f30080000000f07028c0200000000a83033004000018811016cc0400000000094072008000000013002c80300000000013032004000000190d018c0260c57840c046040180000001f07028c02001042206006740111b0c306d01f750060000000006c062008000000001a014802000000000640620080000000f0a014c0200000a43c280540080000011064034c0300000a4241c05400800002a09070150020000000241c0530080000000032014802000000000c4062008000000088004c8040000000841c0b3008000000011c04c803000000880b013300c00001c811016cc040000000342c053008000002b82c02cc03000000aa0e013300c000000000440c8010000000008409200800000cc140248c040001047612032400c009213c3402690040018453058084401000000002e0c0cc010020c710c808440100000000006c0c801,0x49c33c12806924018005413437012900400148490d802540100002b130700750030000a84819015400c0ac126184062900500164480c8095401000530c82200e50040000000000b0320040000000016014802000009608c05830100003a1a0240690030000e46a0a032400c000001c8cc088c030000000746809300800001845101b0c0493062c52c07a440180093194550325004000000064540f3008126182284034900504b0708c1019240141231c2304066d0050000006229014300c000000000b018802000003304c02a3010000000001a0348020000000006409200800000220f002cc030001047216026400c1111d61300449005002347a09804940100cc1421cc06710050000088782c0b400800841c42601250040000000002c09200800000001d002c80300000e228c029301000000188840d0c0305cc7104300a740140005b1e05807d00305c4720460147401400b91d424009d00405c0728440047401400ba1d02600dd0040001687a14017400c1621d8148049d005002c4760a40f74010000311484803500300208430480874010000002611002cc0300012c822300d400c000002791c098c0399484c430011e401813a222218013d0050026c8711802a4010009b2084600bd00404b48089200ca401400071290ac0a500300000530480923010000001d2a2c0d00100000e8a45405400800001c4410254c0400000e8a85c0e400800000002a2c0cc01,0x44030803000000006700b200c000008c1300a8c04000000240a01d300c0000084110128c040000000443c0530080000120110058c04000004e0440163010000001282402cc03000094260900b400c000000007802480300005388b00d230140000000d0501cc0203c82282d018c401400000941d0318c04000000004c087201000000108740d8c0300000000074062008000000001f01880200000000cc0872010000000023021c80400003384b00d2301400000000d002c8030000005821013300c0000001611014c0200000005848073008000001509402cc03000000002c009200c00000000d8024803000000640900c300c0000000009018802000006a08401630100001a01040098c050000006c0900c300c000001a044038c0300000006824063008000001902c070c0300000510c404830100b310e0c80f6900548435411403524018005611c3301a9004], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0x81eb60d43fb2c6562b1e41891bc53e71e3206264fea2b4700636da31f180514d1e5f415098708802185a80277b12695d184bcbd98532b43dc9469021243cb51405f731b3612801100430c5285da8061b46160d050f250698d28373633354129a40131834a0fc930319db3774147218400008b437720208324adc5fa2e1a05d81d404be9bea10005e0580002023654992b96fc613734eae42164874ac725060eb0fa428e920ae19fa0983801222284a06013b57e7744e084401000016534547eb7fdae851211a3815c416310f04b0cfa584405a7523d94091c7bc44bc68000000753016034a594734808ebd034c55c10980302500a0001bd20600b1270581a00e49d96b9990efa3074681cb49f4628713c10a2358c2470e0e4b158302813211a4cc1c418000987ac7bca10023113c346ed040145f6c49b2b404ff40c1601200007d0800465103d2181d8ee8503bf8dd2dc0815c) <<< 16000) + 0x343e055e220400f196e47e880a79c4a91576200bece63255d040009fec94de000008ae7e7bc6150101033025590333921500e0374040003e27b188f5ee0e1c677d02cb416c47f8c736f93104c878277d0e80c2f6313b6c0abad5c1361fc8167c429288d462ed2af346c1390ea35849a1611a0c2922080060020222a1d1cbac1b98b9f0baef7576a225b5d03a4fc3874b3f711fbd85d245014465dc663e1927ec26091daa137d7f13beff807fcd3316d5d4ed2a59cc6550003ee224c631251989204f91402e9167e0489b450fda4f00000000042250a40a408304284184380280a22a87d592f011063041efbc3ca8beb267b2f7c136873c29046248346d13ac8e06524da08a030a80b402abe7b37ab862d92aa934900ab91402e9167e0489b450fda4f00000000042650a40a484304284184a22a8418fa1ff241dc8ade7f23df9d3995c93390b992d873e7bcd67a3c94e1022c1eeb685b3900a307de8c695a46d00030b3fc4b49e1fa2cfce7d9daeb8b782a868f9ae7dd165658807ad0000000000000000021391402e9167e0489b450fda4f000000000424488282202102200180a21b5af90854c36f3412d7c3d0317a652b3df52117076193ab05b2fa7c77bf2a0382aaed51348fcfdff74403ea0e3a52bb0dd1fcfab7ef3c8c6b7b5d2c2c850b70a21625a46cafbf6674dab3c74abc5178838b6c63708485831c7719d400134c8004fd9e1566788ec798c11f543c08c72cabe1fe864c5097c39b5b241c9de32a911107b23998951ca204be43cb110da8c5b3a91ea73be50835dc2a1810a806fdee8245528a42343464c362784f2040821b83b0f7ee04611e444707c70093be66844010399b5784ab9eeb3a91f38996277ee2950802f03c33312da89756fc770ccaebb93df47239d01bafa58ba314d4920022bedbb70dd7d40a53a343731a433a8440e211f2a0448d000014a8ff12d2787e8b3f39f676bae2de0aa1a3e6b9f7459596201eb400000000000000000842302202182300280200800aa6e710a995e25189425e61aff673b1bcdf79c195cb100a48d44c17061a5586875409ebb3fc151bd268fa9a4f04c98428c2969f0ba80a407d7b2cdd6e4241fb22561194000e148919e8488b62423b1200988f82847805c2ffa2a2a4148c1353fe4e16285083161bda67e400325f22931318027aacb58638a0132d08c6b090440c6e470524931f8ef4fc814e1901bd8d686282901c07b00a03d1f56115cf41c3d3eb5a4d930183735c2f6e0001020a8fe88cab4180f2c8d7e173251143fd88f70ec81e6a34f04ce6562ccda6998411e847c3ce9a8a50580588a5a98bea652e5c54ca5cb41e12442042831831031c00800008f1d0fac3614874e6d68470cc169d74c0452a898b8e48c22058a5a98bea652e5c54ca5cb41e0000000000000000021ad7d6fa83f94416c435afadf507f2882d555bc444395947d47f1188b20a1ca1491451070c00ab83cfdd460fb0265b19e1c413a5e32d1d9d4786c9998c30d024d8a5a98bea652e5c54ca5cb41e13092c82861852041c32400400030280200db223bda6fa20e3875181b102c6eeb161bfe50cbc85d0bcc6141ca0a970902049be0b01002614230080000a29000254223a3311c050002a490006f4200122a446cb6234538a5a98bea652e5c54ca5cb41e12882872442042432031c00c0570180200db90092aca9b6be33c55217c6641522882872852440820c120018030080200d11905e14e0c8fd40cd67269cc25660cd048caa972318349362d86f4f19cb72c632c002b6fea71358288294803a2895ccd0c50c2134512f931c459160934ac9ce2d3ecfac00000015b05ad16364132907d10007e0e0c2a4204199d9a184a98e722e080306a75d29f379a58c8c2782feaa8a148c277a34aa8a20e9acd8224d3420003d50190058290cdc676a00d000174b6a58060480158100000858df5c22bc9ccb3767c06e459e03f074516edd327260a4d6835000000000000000002109648e39629428811000c059a3442b820c803400069480034210007ac314b5317d4ca5cb8a994b9683c251050e488408486282380180b80801006d116402fcf95850e09cdaa55d650b45409f0924488cd8374b55e3040db0bb88881821d7c78d47e58004971132804000113601b1948002801408c80ec9e9337614149d058a164204d81e7eee706d6cb1a90aac40b5da3b36a58aa9050c15deeaa054285be1f2ed2b0e68a080e18921c776a693b69204087d9d9d0680596cb00000004e147a24ff68089f43841000820f8b2601622594490b206a4afc5055cb1982b2c9862e4b1481d7ccd8b90a15952658eb14070c2913f2e44a0408438661f4ae0c04000b7f04b00c00011788fc202412005804800022020009c24001b5488c04c001fcc88b84c4582714b5317d4ca5cb8a994b9683c248e48c40a406386384300100a181001006d92302293c502c843c96552e96349b739808ca14caf774b423880e6ee8fa32c32248fb880061059d267a24900062195cd740012804045407853c4cd7c357e14d90613f7ccc4022baede418391cb7290538671ae60daaf2f0e3a956162163436abf01c04bac8440a36f50374ffbe954881163074746d5e7dac0000004e147a24ff6844fa1c24001f03830a9287d0be60309f1664ba3123074651660871306bd3792f59c2c690dd2dbf4a2051e284e90851023049b7b7ee3410005bf8258340008bc47e1092400a00600003f2400127cd9200ec5a3dc2c84df83a84296349144c2d78a14c2a297ba63880f20a60f02c32c3c91b250610544)) <<< 16000) + 0x47efbc900062195cd74001280404540784a2de59be0a1e60f6057be6ea8598309b68c3ffa8858d60c6924122a10293bde9bba50c5075db2b1dbcaa101058530ec3a2800000046bf8b447d08002e02c61265a2166b4cc1e3fded9eb218302d41271542c6891be6c4e840a465b32e90ca0e0be345a470818105d829223410003d5019068000ba5b52c324009c0400003dc400100c8002ee1a1fb3972647bca12a5baa037389109712e0797460c0cd2b8f844a08792753eb5060403fc825b0c80007a9fb40dc3001072043a3290005002811401d919593088efd914cf050c5f27185a5db196ce58b8094074af4d9e5f250a0243af0beb2b34005868aa0b550a251d45a384254b7822c59dd4b220429824f9f752be13a000000340da6c354f016fe096080040074591c93b69319228630a8dc573b962e10066508dca140033cd291858694a195692b20300016fe0960e10bdcdba1294408335d2ca93660000c110157cc2400a406000040440012e4806808001b088009a611131188900800520c8889084404421e1a10e0508680843004004c16442cd62145b1092d88416c41c9620c4b1052588210e4610f95d368c0e0c8ed3c0304daae794280918c10804040c0620403f1e18a62abd7bcee0c778faa514aec93b83e0aa92fab471808b12800000000000000000048722805d22cfc091368a1fb49e000000000860d774c735f1444663f8a6a94a09800000000025318510124014008004040475c8dd0ce0425dd83478350109002c022d4a886f69eb1e12776463ad3635739d022514787a32b406121d090a18fc925d6c8c12197a475214d6cbb3d877d68d181c3c50c1b835e34c15884b914a000a26440486200430ff1d87f0cc3f4661f8230fb1187d08c3e4361f00a0f70107b00b8bce01e31dc924012da0020c34148664f8e0022fc0f0a900088021c5b0b3b49de5973810551b16325a9e65871801100400002ac87802c3a0061ea03d2ab0e3e08d20801f152230400166414ff0230c22008074848000318c0500401000004443d0661e6230f20d87886c398361ca1bd307f72f769348928a94798d1c1ecdeb061851f6df45403042f362396300096664cd4200034ca6569c0088021a6d0e2766cd1a40ef9f80800e2808b361b49a09979874ca0a0029b5b5f34a00480100001113a4575a78d89a3d8b966a916381d0b5f48e2980136d58c28310b2688e0afbbe37804006cb7ac0ce0040010d2237191fece1c7d975a6cd1f30d8cf40b1c0632e8906141218c1947060a1e121a60020008000094900029936366c8b9ce0e147b0ee71048a29271a222441c741c458e006839404425082100800008310f00d87782c3b8161da0b0ec05d8d804548a31c302c03381081a470bd34880490353ea21806f37cb231650c2100807580c3a807655051f92b96317cbc0e39008df1e5a18e00436058d0a94142000400006d10e9150740a800094487212c2dc7784081e8851e606038b87808e182447abca384849d0c65120759d1241e2001037c11ba08a8131611004000052c80056490e7358378cc1b827608c019bb439bed95ee4e9aa741a65104c30040fc0c31827e26765e9fe3d058a3477ee8300e0286454ef086f14e2b6e55b9be939055ea00600c28a161dc7319a6426d2a27fee7b652700004cc016451fafa42bc7e515f9ae2ef1c5e028a2a0da55099c6b76bfb2dce0eff15116d42e47281e64168aca9bb748ca6f671b70227b405ba3357598ca7bb63988385b3014d2206701cc230e511e882b0eb39a9423c74a5b904080184a645921c5d0e5c6220606b42e9d06094f66bdda5012f339faf8138611004391402e9167e0489b450fda4f00000000042ce43f6406b60591a49a29a214212008002070ee60dc56a51c193cf61814c83c12fe5f1c9af455074ecf01c31b053a0004024390461c6230b70d87104c384261c0130df0986f04c3741782cc8dab878b157136ea9648a6043b447144571d853b0c132467e3311149470840201b80b0db05d9427880f753851b019ab19629ad8670548143340d2b8509ffa5e2bb241083ee20690013eaa619111509c90840200002dc40b4841b423d104bdb3b551425ca4d684930068edc23e6280cbb2f473840010fcfcbc208aa04a604601000012420008584070e600113c40035dc83292c190560c603806008020178361b21b0d80d86b84c358161aa0b05d0586a02c34c161a40305c0186880c340058005e0532812cb120f9e05ebe94f545ae113829594993a0776d515f908a5cd7b6b51a0e31e95c5b7bd690900d1aa543a95e2ac0c148436c558a2d6b97e3c6e5f7bd6d7fa5d1416b2e75437ca778d62b769936e512c40138128daebffcd196d7d1afebef54dc42578ad6c5336e4cfdc71e94813b8804e7e0620758b086641ad610455028b2d1bff304e7269e0c3b19a49b06d7b612a8baaed7f102e507c9b50efd4903ce5141ba49abea4f26734cc739892a27fe5fe9bd48e4c8d1cd09cfd85392022db91dd3868782b6973118cd03fcb1d467a92940e0c72aa10d68efe8a33fd4cef403538952783ffbce02995b372b8a8c43c94aff0cfa3f5154c33bd75106b00a1712afd2d5a3ffe25835663e79c8950c1fd0cd4512e15ccf05f1b637348342d4b8b6899f0058b2a76706e24564263a5b2352ee061a51f5e15f2375c4c3ead022816ae7018414650209c60601c412bbf1af338631c04f1f026d8a4d45ce95a45388f67cc31e6b2b5bc26a9e78631554ea2be727fdec3cd704c02b7f3a4c0b077a0d6b29939e32739f36c34e675c3af3dca1b60)) <<< 16000) + 0x573ad8485152a6d1565592617be4051b8ea0a8d272fd3fb13716ada50427a323fbc9957da040ba5b64f5a971520377e76a2ab28f1ba9c420724ccd834ce57028ec1d102d692af5e031776371bcba4af49c5090baa0cb8673afbdc5c6bc5fdffb447ed47188e735e033c1760b4595f7b27010fdf2c7902066181b114004628440100000b5219c2b0cd1586608c32c361941b0c90986404c31c1760389b8faf6d591884439c476d793d0523f42dbc60ac8be6e6f0a8947d006c035ec98ac1262c10771df67ce273545783dd2493de58ab1dd201860d78a73a2dbb38b5ca7b78d7684f06c6abaa2eee202e08a9fd6d34324adcdb92fc55f6e2c15fbf6af003bffe818359df16c50580cde34403182618a120c40986184c30826182130c009c43eb6a0d44683ea20ef05422101f00805f82f879de7b7fa9420019f2a08a007148c838a24628420100000b23a653308058080441d84b1c92112daf045e5003c4d691ea884830440100000e5217c2b0bd0985e04c2ec161740bd8dcd7e0455d9b8b6cef1f54a295d927707efe6c60904ea69225200000000000000000023ab0dc7d4c468e7e7cf7522bd2af3fdf33387abc7540772fab12f680000000000000000008ffc4b49e1fa2cfce7d9daeb8b782a868f9ae7dd165658807ad00000000000000000215c8048616782402480400a08b4fdb933a677bfbda87368a34d8e31140ebeb1ec73c9d61f134cc397b54f47c96e098ff3b67fa95b615f4253ef969caa63c05b63fa96435c71a2292ce24ec19f8998faf30ee1da8938a08aaa04ec5fc93115961c10d107adc1e234e1c63e8dd3172edbaaab65a1a2ca98d5b1f4001c888005041000e4120032364007f8c82512c124570080100402184c2e416084030410182000c0fc0617003ac45a03e5c65c6559e7d80aab0dc7d4c468e7e7cf7522bd2af3fdf33387abc7540772fab12f680000000000000000008e0cd3dc875240b96185c3e48f5c041fbf696c1bf44dfed72db5c5000000000000000000230970189e430b629073fb31875df82c599ef21e060b68acda174a0000000000000000008ace43f6406b605a9228819a1040fcf2a04786b447fbe1fca6ca6047540d5ed50bcf9b7f12ab20f7091eb83a63c5bc5bb28bd1b9d5aa2f6f6cc3a95c7048c85fb9e44d394c5e0287e0ff5d0a268044d52d56c7f06144a4d19403e35172219b82616ea5e94d1f16164b644eac2db281ac0205a37c7d6d9f93cb64c28237ad0d02b0181500e060af25d2c340cc90aeafc100b449acf50008c608802000016a42dc570080100405b00c2d4040580302b0181500e82904ed606042183e0100b40585982ac7ab645eb250b07cc117cb0d776c3371e05a9d73910424141f00800006b9a1828d334992064cce19604088607c02000010640008308001591000b9021644b0b1258580cc2bc6615c230ad1185608c2ac361540a000d1d2005d264012c70c0c002911973608e604ca50251fb87abe326a66007f0fa78d06963dc524cf6009e0b72927c18179f7211a5df0eaecbc63af59a279bfade397b3068118587a180d7fdf4fb3efa9f9bb4167eece2c91d0d1348f7b834bd4387b882c910ccacdbd3edde65fb6d12cfe6c86ebcf9adb0ac9b8fb83d5bb31e6aa1023d66e8754100002915dfdb2a052ecd274d46ea410f92ea6fda9f96d46a07d751969c4ca10bba357c955644c56401b03af5ca5866e0589c783a76c64d684efa7281041a000624e6ed0ee0142d9dff4ca174726b4f76c8978beb71448444ccb9b90a7f1ff2a38900fbb6713e9d0e75283f243cba1eefcb4716af772e54f278936f0801410058b3ed541f4a6faa27fe584f312d1434573fb991e11a738e00e4281293e2b923088ed3d4ce339f3c52ab85b287c36dbc49d8b35d5d37efd45e19882451e0a1f3288b5eff867ad5ce67a228844afeb48941af3664e8a36ab9e254fde8ed1ec1631ed2e21d7edf6edc96788e5a2b931e301f02715404e77cf83d6edba317b754f71ab7035538e387b95c294677d32c719172b8f4455c1276d7db151a08db3dce3c6f4aa8178890b836917fac0e0d11b8d9fb84a7309a4f538e02a4241500a0a7010530080037f480302b90092a13ff9e0b3a1dfff7c0beb2d05823fccf9d756104ab2ef61e879a0591639039028821010a08e013d9d3c1a15d62ed43324e5e73722f51b907496aeab6e70403b7a15c31e05bb6289735e604a10125b25a2404e2e75a101c21010fb5a8a0c354ac03c40438f7dab20808d4e6c730270c210080000b1101f0d85286ec7091eccd52862024629c2845202f5272023e652b171c2137744c81c0e5e70fd41498408002124c568ce868921a859a842500556d3c8520047e151328e00cc1839f8600031b4b3a330410804024807440a9a5bec050cd3c4f3129428e2a824f05035a1d74440481044010c322128d70ba287000000bb80c184cc64fe9b18610a5802180a103f1ae2ed03400000017700c0051ef556a809c209802000030640009ec8001ef10a40900029f90a31d85106e844771ee4d0e221423bc8030eb17900b0282553ea3db0c12829a4a1820ed14821084022ca0787408ce2842010d8eee9018b45a0000001b1bcf480e2d4e207a72928a84e71ee625ed23b893ab58d26a97731b5440000000000000000000000000000000000000000000000000c245084862862821825003800a5c500401a00050e4284541400a09f0500022390902984710ebace05542600b49b59fec5920bbaa4537aa35e1c1d5b0324c2ecaaa30783b200000000000000000000000000)) <<< 16000) + 0x00000000000000000000000188ffe5e1150140b8fd5885dd1fab10bb417b529d4c7eac42ed08d090c40820850430118762261c930bab0661fadb6bcbb6d9e962fa423a1822e8eb6010728a20443b980fb7f654ecec061c25cc8ebad6fc0609e703807ebf9ea02bd1e4a8d3128200ee02c22131e4fa8a0fd568d8d17f8368bb8a3a9a975b53881e9ca4a2a139c7b9897b48ee24ead6349aa5dcc6d51000000000000000000000000000000000000000000000000030c8804440a204104382282480898d705645fa4650aac89372cafed2dd8536d7ba193cd72fec8b5e5d8b2ff993b2d3e21a055fe5f3671bb2c34d4348f41c0c532e00b361ce030e8001de909e1904e8282701406c020009aa21366b09a1984c82ec74ab9a79116288852e668817d968843458808f323c1203b7221ab2881a9d3812f450466a504a43810eefe2a30280c2100858a28167d7396205f507dea2880dc00366901d5b074df22063e8a15638a097849f0f008062cac249013861100400005a484c06c25c37638ae179dbc510d993b4344079aa411e9103650895c016080743c300701bb0c8610293081080430a9dd87d15244a4e3302a8a23999c01acc080162121e5009479fb8d20057228c0b8cc104201009201f186747e83128549e34b018614d16dcbb63048db317cdc60d3032a6e6101d913675382608220085464830214464d056ef139a5c4faceb58671c228f2ff179c20000000000000000000000000000000000000000000000000063130c1c61853043013403001000c040080340008748001b810004d2212c1200063921103b0870de6d1ab50be876fc2f788c9a37604286b466522f84ab579fe54900000000000000000000000000000000000000000000000000003389421010c11409008808408c006257255982a35aff3c8e0d0cc8555744d3c5180965c0840413ff8b46bdb3d31ff6e026bccf1b4ec12980d9788d69fa1b33c719be39f6ab80ce733a84a84c250261260bb1c368184c92031a63b1ec040e4e41671f2c255c7855a4508560310522c10b3d65780700c67e4118142714220084892b1806e81819b9fb1f9a3063130a355881d81e3d0fa4003b2ffdc20c0138355bdc24c184401009205e920bd47fc19038931365cc58deeb3bcc190297163f978482007af6250409cd561a1a280665b45ac13821100438c9169b4ae7205f6c4a15f40c2c5717febfcd04796d00ed4482452825f83081b19c6cc111c000000ea600d028ba0d69d0520109405000035a424427a4836a3287a58df6b79f630e30cf04794470ba0b2a2eb9a12fea9f39628002f8addf84c1044010a8c90604288c9a0adde2734b89f59d6b0ce38451e5fe2f38400000000000000000000000000000000000000000000000000c6269a69258c38c70220270068018080100680010e90003712000d9c40020e48004e0902d198300880038a484812c23c9611c4308d1181b02f062073e1dc470c2e61be111810e940da406028c959f0e24042200860c23c9a5ac0a286d7f70006040201ab9f8c0872211b2608161a5a160128211004000042480f84c2082723819493682280c2a02d00aa58b0091fab10bba3f56217682f6a53a98fd5885da1199020821618a084082046b825f1b28a312a5e8d0e202b2c5c7b9b50ab3cff3d8c6fb99016f40a186b02430d975fdd2dca2c2aced14ab83220bd91d1fa09abb57ebb302c4adc40000000000000000000000000000000000000000000000000000cf220111638a29020e19801604f75c1ef8da55c52bcc5523aa37f69539fb27874e7918a9fdad5f2b027670ef80c23277815bd1366e1c8de9e99f416db0e17faf282299b141720c09ea6bd0003f221180208b01000353108a1583b8ac224560e413c18ddce8ac11c31e775d52030cd973b74c1c222d83ff9820a0fd8fb2618146f682c6d1126182200876311ebdee22931a7000017703c27224920892c58048fd5885dd1fab10bb417b529d4c7eac42ed08cc920c185148046047000d41e9688f8b561059ea850552d8e0dec079af4edce52e078e71f4d8c7fc57cd9d6c502d6d591e775862ac8da0005e468242991d0eb78414ff050214686043d7382426010241401049c72c0391bbd5d21080000001a5e010005ca64a6552287d120549a430e1480e000071083a82800190884414c0b48410e230860960d163b0cbeff4e70e8968479430201692273d23a18ef73f3566100174b27abda87a3199e51ead060091a51ed6bdd1d94f785d05418049c68837f0e9afc4f3255aa0800de4784e796cb6fb757b40b209bbc64f7966a237d8cc285e095863e6a12db928382d3e045220bd4405170f61851743d1038842f72482041c5fdcc08e0555c7b2aa20087c094370120611004021417c40fa9a66dcb203f4606b84062ca057bb0c1d1193aeb120210804021007221523eadc061002c25e682054e3e51ab24019913e7b12021080438915ff36d4f29f61de02232a24a2411c6b6f8d8003fc76d7ec013c50168ff9260827716ed08b4d06101f8b6ae2023183a6954c020102858c8c53ca99afda9f876184a001473cc1668fb125e97fa772053ca99e9b8264543e7c33faf34c2b4d047adc13022f07a0000ce0800215101c090002a3100065521062b01f0d84106f068c441831315d5d299f79606140002192788e488dae91381823cd22caa52569e003695a0a01a6ccacb1acc69743048a8200535df3b021940b4a7018e030000de35bef4650387b955008021d464cd76820d122570c0421afe79fa90e465186e3965098faaa60033b)) <<< 16000) + 0xe0e40ac1b8efed4a332bb24569dfda9452df533700fa58b008d7f74b728b0ab3b452ae0c882f64747e826aed5faecc0b12b71000000000000000000000000000000000000000000000000000033c8804dae52d82db8e53dc21d4a0aa9c18a19009201a29ab426a6f31915b625c872725fcfe9d35a0c3a33e34b9be975f68a9840ccc6aa0c4fe61a9342375c371c51b0337f89daee9aa0dcab4f5bbb9930f0db358ae2ab0510553dc6224cb88ecd1677c2a824094c4bef925ea0491478832a199a26850bef7190485cd761bbe3044cfb5c7028457f71c3a4c0840010f245832648c9140e26da3c90bff055e3860b33b18eecf0062884574a001beb1a902004c2f0e889c10800200002ae4000a7484084c070261000b04e05c07ac1d2fa4b08aefeab9140016fffe023041f00840a19cbc16850273735564d0384e9fbf1001cb1f9c824041f00800006818863f87188216594ec8d1ce77964f6299803ecee1de11ef19100000000000000000000000000000000000000000000000000032c8804441068e704384502780700170801006800116907f0d83f06c1f427813a6912698085a8d0d10051abe8691820e0042460a7a18740c05ee460611124a8189820d802000026083d82e668072bd873860a0a0e569051dc0a1489042eaba8c9a0021d0c1f94007c02121a9a04f830e184d421a0450c294d828d200222fa6f0e0063ae5f8a5002000800007f19184b4e194981821064be883975edc99a088e6a7912000f00401f0060001be41e82400064260215179f338b080bb788948033735fe07381039376d18e001b5a12500001ff562f813041080401ec172198e36c9929074f04858f482172ec48746004201090c264d63411440072e29aa41e8fd78dd9209178c839c70003cea68794008402000020676b94b60b6e394f70875282a288a8846841848826821822811a7f675faf9b7bfb6cd5ee3b2b220110c2aa0002a241e82400069040012b0f9f04c92b2533177c3cb02e4aad1b0b8ea9e090a43df2b085958d04000012a05f2000500000000ee6b2800180011291aecaad358000055e1095ed84a83d0900e10720a802005c51aa4ff6f5a44507c30356c483000002ee04432134a75e83c3000002ee044204835c75ab0012002228f30e2e50a44d1394b77de90600002ee0110cab1799bb24000433ed80440271de16e0680000005dc2e004600800016a3afee96e516156768a55c19105ec8e8fd04d5dabf5d9816256e2000000000000000000000000000000000000000000000000000067ae350992e71c05e7f6eb5e4306dc00000000000001d08d6edd12f550dc9011109004c04c00900401b82008034000c1c83c8480017f483c0080021748008ef100160f2003d7e400891083b90c1c8378320ea50c020202048cb077143844051077b584084665f13a3041436d505c44181279650ecfe1824f2c775efc11cc3a9ed4889d38e1380c306d76c1315f1a2816423add8e2003a5a04d4d34064f15e488057804dca89e8c218e6772020208003cf9ead1d40d9732e1c0904840b647f9614ac2e3608002baeb5c3b0708a2468650018058289387593e3fb5d412496c84e3353dc43c804fca97049e02c44bc61c550d80001a99b53881e9ca4a2a139c7b9897b48ee24ead6349aa5dcc6d51000000000000000000000000000000000000000000000000030d71a84c9738e02f3fb75af21836e00000000000000e846b76e897aa86e4306302182580dd1f2582fa3a2c5f2726e042818f67079f61e038f57b9aa2d7a0fec2b63b17396bfe2e7687fd539cc808506a78d499b17d7a8a1bfe7e5c7ce50ef5a4c6a22e5c01bdb133201d8a07226bd57eafa050c1325354356fe16d87545ec1d28011ae21f9e256e3fc01aa9a5c359156be64956b7a0a0834004518894d8457180bb8147cc608329c946bc7998f22bfb53b0cba1a1a0ceb5ee539b5bd43c073f27a85b2210a12494001f0883b0c81d4140e80a000d4920c032003a4720094a24018b5083980800c05c79d0a9f7c050c52379dda080d9c91b0028c1a4d2be87e1820761709661048a47857086045ea431d38a4e20460100720582182f8eff204d0f10199c6f55983079be088340c08a2df9e2c2801b0a777f860078ba74462a130c1100400005008388ec1c067229d4f477723852d6e8ea10a15227ceff820223a6951f8c0477fe03621802c23fe30a2a8131211004000051c8378ac1b817441b1b59de0709ed5fa115182a2c13be7850a5bd0d6970811b28e0808500663193670403dc8d75b91567182200803680c1b00606c0306b01d8e030c9a4d4a1c5923057792240a1cc2d91c4220004d9e40426f5ceca87067b991c4a22b30a118040118060d4039113739eb870e219ce0832e2c307ad6789e2840251fe778706260777d28c0025254aad455261c230080000a490690de14317b0dbd101cad258ee5183277d345b4202006cf492430439e6423b1402439ee551100388923758180d8fb7dce51550a0908c02000035440012b4834068001a7c8339ac198b40ca430641183180ec72f5f560e0921e1e9c9eda070cbac45ebb23040bb88f2180826a435fde50e08990d57a3c700e91fcfc502005288f9b020a4041280a0188160c20b0460583002e43ece8095c1c3827edbf51820cfc5ade082eb75e1921c12a645e4518034dc16120c0f5ab62f6080134a7a531528142000802280800068081e8ec0ec6701031b6db220c103ac67a640a085c9b4658020c09ddc8770e00502a499908006fa1b1a1a2a930e12004017c0406c0200017)) <<< 16000) + 0x920bc5305d1582e02e86169281718c14628ce86050849f043f6380c8045c29180a610283b0202874ab7d5449850840200740b0390582d82c0e0160b40b0360182c80e84990b55d090241a477b70408d3f184d43820360037a2003b6c34e4a1286108040160160ae0b0560580a02c0401762890fab74e40278b28373860833bfbae430150f9523c22320a11004013407832bbdc4960918429cae7e484bbd0e9f1181a0942edb040fee5018a1119450840212304f0a1b0448658ccc58512117da77de2302731fff25060e5801e11248034c31f4922330a1100400004fc800133100f010001c710552582a08f0638f1197a1021444c755061193e709d670662c2bc8128158410942860d172611e99810840200a603c18fa20612f41620427d0d34ff8e0612dd1d8a8a38c18315d7cbd2fee8a04fe68f4522271c13beaa81e41a8e0126bdc69dac304023370e06e18d67104041701e000080882904f0692d12808902082feb58c611db85fe54707245c7c201810632e47a8202704f90bc66082100802880ec65e388bd190292f1350b861261b17ec23062a9af2e7181527d82af1c01e46b903d598308402000026a4000a6081a06c1402609e130300580802ec500026775a50a377c2a0c4d0885f99f20100873508cc30c11fdd838e83006cf20ab2820308754e99a884e304601004e0582680f0924c0834d25cee3ce0dd358b8820c79699211a716b7ebbc5fd72410f1d64c679c460a302abe5f4c4beecf3020794482625d30b3628807edf2e1e70d76acb11814c30760d804c05c0a0a73d6fb6b6eb485b1fe6d6ac9c8f94820460f52e834e4d47e68fbafb58b08b9c220c273f57f42862c8eeb2ee902f8e60a841d8606e62c8726525211b067693a25964b6930481738860a8146ec21184f39b43bbe01c36101701dd8f6eabbb85b1d96bb130ecf34350d4f31ccc4b871dab0005aeb5a72776c6b75c819e912f1b042954a42b1472046200008a44001ab08078080021f0800795900148a2002ce2412cb40944304911d0a761b04bd0c102581b9d210594fc4c210e09c7e8457c3803ef2753788003f788a18013081100401202608e1304609ffe782ce877ffdf02facb41608ff33e75d584128ec623d7bef0afcf2c59682c11fcac7a8a49048d1ddf784690c98b852bc49309d0dda3c17ba0e75bd534445564000000000000000000000000000000000000000000000000000331b0d22c412f81626669c202e2312f6048620aa8c10410c0040056b111f8be69183e261857fb7352acaae23e29e18ad5f1d500eef24dfcefeddbdec7406a91d1780347012c1be81fb18ab225004bca619d5ef0c61a2af43ae99c9591c883358d0d521f88d0c94a643881b97abdaf97f86e64a7843bad5b79123ab29a849fab883340c1504501000382103d2181d8ce8221e7782481069f20242214004978a71c41549901180201100406c020000e620865b042158208ac1002607e0bb1c218b23d0402525383d41c1baf0327b840a97e266dc500fbe97538012881080400ac2728db2c48e881661f74cffd1aff06113c720a97c202c579cf0898814aaced8ae800f45290dc84c658e30a4023825800800179089bec73f6c2e5d28c832cb0914244e239c4f4a39428bf788109b06f5985e7a145cec16149c20e800165103e1981e8cc0f0660762b03a1581c8ac0e03606e0b03605c10182545f5181065ad6973082861a5b4a44820a58ef428b00320951421200227e437b26042300840100401000004440d426068130330981904c0c4260601390b42e3957c484308002121466dd903030a16c995b3f9bdfff739d29b155068eedb5e036b88eee39d061edacb155ab37ac04eac601359223fe78235eed6c25f5df3fbddbbffac524631745ae2b2c85e1856556206d71a14ab7c3b21a589e29e324c64d67c6c7e4865e50076ca954382400f4a12672a271f13200725ac881256766069c7cc766a18dbebd3dca6b1cbc603a1d926db426ca597ea6964f837aafa2b0356332626b05d63220d3e47c00028b102f11c03e094c22117a8ad7b4bd6d2a1e5ebbb723b955bf7ef1db1d38b1e3c1ceeb73a7f9ac8039e57f138b40f4bc98c08fed24ea7c08ac8358fcf70c2a8e659f73c41e0effce733a3cdbba3a03dc20217ede934f9bbb8eb095cc5a42ed375d191eea6b33ea1bdca204da73d54064c6fd5329b89faac6533e3e66bd36c9c186a0aa17a65b31e5ee0c42a1676800044f20200200f01000516902e258168e80b0460562302a05c0f1754d14980d7b405ad2c1602b8eaa3021fb6668c504ed96486012860f80400a41700d8a2f9106380e75980c0d42fe15976ade79ae0a0e7f3a3ffe10314dbc08097f270672f5d12fa31e023231710904df90a21402b7668199a1b2cec805d5decaa735e6f9fc268c5a5078c6104409c00013910281181380e000020080230168411d25ac9601836cba63013ad6a3ac6003c01080000802000008880006e10260981284c09017855451ec24805997ae188401247eceb23041f00801000f873e32872d9e08b96a29c6680175992dd8c610440100000ae20460a81c6f67646060858135358e0114d9824020057c3ef292021000424515eb61662892f1398f44083688d98c6003e010917287f7858400f06e55a9000f80200001d8800099902005f8a070fea4418282493763038719ee498d9a0054b064c424818440100000df200065e400137cc020040100440b02105e863dd9922a7828410328c6035b938772402a0c70e4a1003648c84232841000434800cd94d5487653725e63)) <<< 16000) + 0x43270266da201835808743403c080a7c094208002000020278a70f2ce7142c26bc4904006afe6408c107402004003c16ec60eac902cbf2c2ea340581168bc280bcd5941064081f008000068900019e20007ac4070340008a44002b5080f88c07847208e853bb0a4cd15c96ac408112d6ca548e2428a8741e0833e892e79627d1483880870033ba37bafe872e349100c01441fe3795b049d6f2480c009b1ebba64a08afd47ba1000c5b47ee2afa32950625019da31ad0fe02101eec4a6a09c0f3800ce309e17080c25143dda00edf53fdc34190b939b31800f8042883895aa54283f494351c58027924d0f18010004000029080e82c070160360301a01f02a5fa1211001d00440000401000004440641720018430fc20292d0fa71000e80422711e5802a78b00a3fe1921d219adec780f79ea8d48003c0100000ca30256bf1332400e86b330404c88dbca3001d00878aa14ad4d121ec019c4450206bafef84085c7546a781113b272ca003c0100000f320003504000c6cf160a6c35e9165e95e8e73060e00217d7f1810a9afe31c30202cc43c59800e03ad8e604c184401000013b365842600bf180f2a55319c0d5e515eae092f6b2286044664f54016091c24cda9150000d2405aacc58037032a05d1280255ef98227806440814810000075c80038c10008e820303a0170900b04800319c80a92c0503782dc631d8b8c1e06d59538e103565a810a115c5b8f28920610004305125c11770a10a428c7dc107ba943660600513d17c91240c2100800006d9ec623d7bef0afcf2c59682c11fcac7a8a4904910c895c2b84f3530c8c379f91e833b78244236b099415f0f4b4000000000000000000000000000000000000000000000000000335c8046c348b104be05b3841dc3c336be9637e7e82aa5882027004805bad7d36b8681971177e817091d89827157ac9e1570903c5f2fda498ecb641083760b4eb30272e8b4ccad01436d5edecc94b0e54a445d3d4cb02c462c1b4f10dfb3d8d92be9d93ad57ae68b9678ad7119ac8701eb4115c5068002ec9013158090ae83bdb718ca243cd569ee5102c09cc8ea0809b1ee9bb040442b44f0101251c200080000859808dc41b58aefee898a16c2ae1c54f6061ed149804e7d88b0ba09c4f15c778212f724795e145ff5a23ea68655b38dc67bf49c67c771018d032af308b6831dcf5aecaa21195bf7659ee2936c7391bb95dc6ab6c01b600c043b56b0821d918ee75660785f3c8193ddf59e0c903e7ce390fc51554ac1f5137dae67616a23730ddccd02fd75be727792077c385d3b5b6b6c8f1fd86147a07e67829991f0acbc2cb606b61a9dc6a2327f3b626ad0342f9e2e28994b743ba54ba2e005c4bf8d77b36c8c2b9b8818f3f95647ead5040655cfda27c3bf57804204319918e27fe178747d11e0cda8ba2ebd348d4d45a3fd192454dc0cfe35b14573684def61992322615d0f47b158a4e8c867980000109678f43d319ad57cc8d57964c01f68870415ae471e49fa3039b29b9b03782fe9f401d591f2a020115f024eccb9ceb333a06edd423c6066556b44d50d898031ddef848116a58fd83316bbdc06084b5ee9fb44dbdb8237bbb9cfe277480520d1dde50b0137db9fc4c3772528a731c7f4418d016281837b4385bfd5c5413b0576ca1c927734bb10c2fe367d986b0f0bf970df0b2903b3c4000009afec4458f32ef1a2acbf2eb8aed207c377e64cfa4b0973854d6b590f92d7646ee24500409da37c4029bdafd720aaf06301592cc1c1ae30aea0eee45c96606229ee37a159fb17f33e75cbd7d5f2a53480b8026318dd432d57649de88baa5beba623ba97f191425149474fb000102a4044740200a00f05000cf3100358f20084a44011cb88028bc1006e1a200f40868702a1e64ecff2b46087134c6d2a9a418c08026f7ebb3b28014159e954d15f2302202896374b6a1bb3030089636debb3b73040019497578b9836005500211d59a244f44928c70e606e0a0e2a13cb1802d763082fa62f9a2340a2052f6d3682cc4060e4bd0904b30e1c77a74be1bce306e4f7aae18ee0409559fb02749a2812330bc40b0700a2b39bf00102812010405c0608227dd5c81ec59a652060bc405b6cf9e67c810da0c550c0ebf611c4000000b2d05e00010415b955a91ed6621c001a3dfa10e9144450004ca8c0d0ed127000557c37c59002053d0901c60e814151920c0851193415bbc4e69713eb3ad619c708a3cbfc5e708000000000000000000000000000000000000000000000000018e0d774c735f1444663f8a6a94a0980000000002522492472852452051000214696a699caf675832e6aabb56524d8088beb86431e8fa3413e12969b7da689a1b7ff17e104246528c37e7e9e7cb0a6294d6cbb967e0a1d82c901141a509f3070008674e602c721ab8c04e92870000005dc008000178b76a209820a002165eb78917b6a2c9008e4769ba60e0010ce9cc0b1c88c57baf39438000002ee02c002c5e7c280080008d9332d82e104e008000189345659970d0d165d9314400b170ce45718e796300040258b9894001430fe055f02f62018960000804de272a0001400238552df06bd311000000002cb41780001e848070c3c054000119100e090002b19000991201a12000c2420184300b0de1a186c72fae118401750a08ec070800000278d018222d685e94d8508000001a5e01800dcb75c615c40003bab992aa001774ad73204155972c2a0100000ee100109820146a0091900402801c1400c0a00501002008004e70801a080085400202000010084911)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase3" = "QuadFullFourCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase3 private def zz2187:"s088b"="s088b":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l17 l22 l23 l25 l27 l28 l29 l30 l31 l33 l35 l36 l37 l38 l4 l41 l42 l43 l46 l5 l51 l55 l6 l60 l61 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x178f517a3, -0x11c0c8e78, -0x1aa12eece,0x1c2452c4], ![-0x11c0c8e78, -0x4fda37198,0x30bb26d8,0x10c86101a], ![-0x1aa12eece,0x30bb26d8, -0x73652d7a7,0x11c0cec3e], ![0x1c2452c4,0x10c86101a,0x11c0cec3e, -0x8e065eac]] noncomputable def hinges:Hinges:=[(-0x1c76191c,l6),(-0x120c504f,l5),(0x61cd59a4,l4),(0x31ba0ab3,l9),(-0x15252f9c,l8),(-0x3b0fd808,l11),(0x28a8eb2e,l10),(0xd3923ab8,l14),(0x8f8f757a,l13),(-0x8240658,l17),(0x1fd81aec,l23),(0xc7b59dc,l22),(-0x8e065eac,l27),(-0x2d51adf6,l28),(0x8e065eac,l29),(-0xd257eb94,l25),(0x217184a6,l31),(0x64c6e036,l30),(0x8e065eac,l33),(-0x138f6a4a,l38),(-0x8e065eac,l35),(0x1504a7cf,l36),(0x8e065eac,l37),(-0x82fef52c,l43),(-0xf2c99a6,l42),(-0x13be4cca2,l41),(0xbfa3754,l46),(0x8e065eac,l51),(0x1349343c,l55),(-0x184a5000,l61),(0xf8e874a,l60),(-0x50edde2,l63),(-0x298d5ec,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x8e065eac,l27),(0x8e065eac,l29),(0x8e065eac,l33),(-0x8e065eac,l35),(0x8e065eac,l37),(0x8e065eac,l51),(0xd3923ab8,l14),(-0xd257eb94,l25),(-0x82fef52c,l43),(0x64c6e036,l30),(-0x3b0fd808,l11),(0x8f8f757a,l13),(-0x13be4cca2,l41),(0x31ba0ab3,l9),(-0x2d51adf6,l28),(0x217184a6,l31),(0x1fd81aec,l23),(0x28a8eb2e,l10),(-0x184a5000,l61),(0x1349343c,l55),(-0x1c76191c,l6),(0x61cd59a4,l4),(-0x138f6a4a,l38),(0xf8e874a,l60),(0xbfa3754,l46),(-0x15252f9c,l8),(0x1504a7cf,l36),(-0x120c504f,l5),(-0xf2c99a6,l42),(-0x8240658,l17),(-0x50edde2,l63),(0xc7b59dc,l22),(-0x298d5ec,l64)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x1e14031804000000003c240a30080000000068480e601000000144310120c0400000000221a0798040000043867024c301400000850ca0498602800000001912034c02000000308820241808000000003c2c06300800000a110203246028000000148840d8c030000030c250129980a000114310a00664010005608508a02388028000001043101b0c040000000210c80a1806000000530740fb3010005c08308604388028000430a011014d0040000001582e04318080000002504408630100000000050280a601000000000001c0c8010000000150481118060000000028140b30080000006208811860200000000000902480200000000001a039004000000008c44053008000000000108164010000000000f002c80300000000003a0390040000000003f00b200c0000000007a02640180000000000d03480200000000004203100400000000008c0620080000000000280e40100000106128094cc0500000000004806900600000005a1b017300c0000000000c80c40101050d209b02781006000000000036031004000000330740fb30100000000ac3c04e60180000001884409cc0300009a1182401920080510284110018d40180002a04e0a00da8020000000000130148020000000230a80518060000004908403230100000000098500a6010000520a81200f50040000ac1202c04ea0080001702807005d40100000000004c01240180000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x781083404e20080000002105003c30100000000000480c401000000008828030c0300010c3a04604ea00808507242280ada40180000000000580c401000003a0a8240950030000000005418198020001b05306c06e401000000014482048601800000001105028c0200000000001a031004000318861c409a4010000641103980f4802000000003121024c020000000006c881980200000000581c0e300800000000000a06400800002023840648c050000000411c81b180600530928e503984014000020854120148018000002cc930120c040000000000c806900600000cc5612034400c00000000012812401000000002619038c020000b22182406220080000000822a021300c0000000c426068601800000002116034c020000000330881a180600000000005409200800000000001e06400800000000d07038c0200000000002c0390040000104722c016400c000000e22880906020000000002a140cc010000000002a00590060000000000a4072008000000000ae01640180000000015404c80300000000002a0690040000000000280d20080000012639809060200000000001d03480200000000003206900400000708c1019230140000000e46206c60180000020c630120c040000000000120390040000000000030320040000188a43806c8018000000000440348030000000430481298060033052865011c4014000000a22080d8602000000014884050c03001b028c31810e200a0001583b088056401000000007c2e04c60180000000c844098c03,0x1e02900400408718c200f140140000000013060660080000014c4703f8c04000000001a0a0518040000006315c0fe3010000000a222818c60241b1cc02240f3c50070000004086203498080000000084340f30081849048e3012c6803000001c6228094cc05000000003e0a0718040000000000740920080000000c41203c601800000001905018c020000002985a07d980800000000342806300800000000d8580a60149e211883c0574900792441510481669200e00000000984405300800710c314401e280280000000013002c80300000000004a0390040000000004f00b200c0000000009a02640180000000001103480275a32804780fb8a00ee6c63008903cf1401c0000000001480c40100000000002b018802000000328aa01418080b2472461809634018006188508a04a6802800000001d0a03cc02000000035048051806061454841401e0401800000000012816401000000000004c0c8010014c1b41681eb200a060c57840c046040180000000005e02640180000000001502c8020000000390c8139806000000000014062008006304605601e480280000290c82809100300012c2b08204d20080000000094540930080d20a286d80640803018c1470d90248100603482821be0188200c00000000038303300400000000d8281c60100000000001902480200000000341a07180400000000582c0e3008000000064220646018000000c42101b0c04028623c1860230200c0000f02105003c40100003a0681080f080200007c0f02101e1004,0x28c3a4228127200a0000000000e4072008000000000ee0164018000003b4a60124c040000000003a809900600000cc240a01e400c0000017148c80a8010000002f291b03900200000a2310881620060000170a43302a400c00000001484814601000000002e1b038c0200000b8521980d2006000284630840b4401000002e94468044801800000001b06038c0200000a2330880e20060000174a236032400c00000000d0381c601000007a1c8a4055003000000709a203618080003cc740e403a40100000001c4d20286018000000000210348020000006082202498080062492905031b4014000012120203246028000000249040d8c030032448480815da00a0000d4cc0407a4301800000000002e064008000b21c8110355004000166530b202a200800000000a85c053008000000e23080d8602000005d2b0bc0710030000000391880a1806000000a211401b301000000000783814601000000000002c0c8010000002086a06318080000040871030630140000000048381c60100000000000d0248020000002886403c18080000000008830330040000000008801640180003108c1801910040000000000420390040000000004700b200c0000000008a02640180101182208096d0050001023088404ca0080001d85104408a401000000000f8481c60101451120c50078100600142184110099200a00000a4320a01e400c0000000048381460100000000000502480200000000241207180400000000004407200800000000b8281a60151224a8a240b349007,0x5c1880518060000000005f013200c00000000171a0660080000000210d028c020000000054140398040000000b251036300c000001424880d860202461cf18f00e8900600000000000c0290040000000028140f3008000000e22b819060200000010c220248c04000000029108191806000000004c280e30080000000098301c601000083154450325004000000001e0c0398040000000054440f30081060ab862812388030000014e21c0930c05043029a21a0552200c0000052885024c30140007110c19817c802000000344c101b0c0400000000320a0798040000000c259036300c00001c8a4140488018000002042901a8c040000000311080a18060000000000540720080000010233809060200000531b0340390030029239462818da00a00548708c102bb401400016994080f4860300000000000a014802000000408ce06418080000000000480720080000000158281c60100000000002902480200000000542a071804000248520440d540100000001c4d206c6018000000349840d8c03000000588c403f980800000000001b03200400000012c16028601800000000011018802000000039150161806000000731480b430100000000ec54038601800000004905018c02000000809e2036180800000010279014300c00000001f0280c60100000028c290090c0400000000000e8190020000000006890330040007214215804880200000003990c094c030000000411c81118060000000088740e300800001d428600926028000000001d002c803,0x190880a18060028c3b043028b40140000000088780a601000000120110058c040000002702200b18080000094260900b400c0000000003c0124018000000000070148020000000210880a1806000000410840483010000000a82280726020000000dc170230c04000000001c0c039804003c82282d018c4014000000000980f04020000000001500608040000000000600e900600001305219012400c000000681280726020000000000dc04c803000000000032059004000000001a001320100000000b04e02660180000001608404cc030000000000360290040000000662500a300c000000d2208064602000000001b12014c02000000002c24039804000000000058052008000000000580124018000000000d80248030000000032120398040000068041002630140000000d812018601800000019024030c030000003502200a180800000006e1100b300c00000000d0480c60100000001a024028c030000000320580e18060000009434240f4008000008c0c403e66028000002087200e4c040000041c738069180a00000828e501923014000000a62681f66020000002448101b0c040000000492080a180600000005219014300c000000c22a810c60200000001a0b404cc0300000000322e0518040001845804c053401000000000c8b00a60100000019c5b0218c040000000311581118060000002304c0ae30100000000c45a04460180000002082c050c0300000000005a059004000000002e001320100000000170c80c6010000001b1109039002,0x31822e18a048e200c090c80860c072b40180000188a4140488018249206189029ad006000000006a24079804004046608101f34014000000000b80164018000037220801a4c050000000002f8059006004b4730ad03d640140000000001880c40100000003a8a4028c030000000000660310040000007c5c140e40080000000210e80a601000000000e8004c8040000000013000990080000000004f013200c1018e10a180e56803000002910828091003041238c2920535a00c0808778508086b40180000000e43803a6018000019828807ccc050000006a08801c980800000db82200693014000001ae2380726020000003544501a4c04000000398da07d98080000000e22901e300c0000001d022014601800000003915018c0200000002d0580e980600000000d4440f3008000000000ce01640180000000019404c803000000418fa07d98080000006308407e3010000000c61780fc6020000001a42301f8c0400000002b0481f98060000000010c087201000000000a8481e60100000000391503cc020000000431481b980600018c4c0cc0ab40100e48c3084814d680301c219e102021ad0060000000005c38198020000000005d013200c00048902330136802000001c82b004fcc05001c82b01f809fa00a00000728af027f3014000010118602666028010118614c04cd005038629213e07ff200c000070c524081f3018000488c221817680200000000000a01c802], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((0x19b8a3105846829f5a07bb57b54d8c3900000000000000004d2cea6e09810df83f0989626cd0cc5df0a1f4148cf71b7bbe88017412380c02c8199e403a4cf340f4428c0466169d7c1d941c38da3bf0550a1471470c7087036494e9a4bb991dfacea50af3e3a602f95c5ea54bff79f756bff44c4e9074422232c8883256734cd360707b2b03deee77da89e7eb2de88d0a1d24e965493ccdba0ae331bb1582b06c154360a80bbfa46d8050ee56b2715eace6f7a80e720844c10a10804304204b0070000043a14ed1afef7b47249452ea841bff91d1abf530535e0717c43ba2e5d017ecb17e9ae9bc485d6dfc36102b1428ae8848203a0101af05dfd236c050ee56b6876971dce464267040248438420418428258050008058a0c014e444a7e1c070cb80ca9578ec67678949028ae1fd0001ab21401a0002bd2374331b9158dc04f040719e9633028aeb44033005f1ae98423042000860c2f008ea4d0925a28f4041797e09181801849e57648083e0100000cf3a69b9599a42d1e30282afcdc56fcc782000039387000d0476f8e9d558018080000dcc1ac030073455332775f3881800bc0f1a6ed011ab9b00d3acd0af8d45b15e91d7c105f4d704969ee3da3c10000aaac447d501a0d3bb52dc0ec569c20427df7d88dae56e40006a5642b84bdafe906826e00720d800021d20960a0003dd236e1b1b60d8da84c6d0263660b18a01c0713211964f1c16763fe347ac3c45d0b0c215e8b40c39d7bd761000ae720e326041e008711a84cde048807e9f2640870c64693001c00440809a103cce222ba43763000822fa023001e0080000501000153301c01a8a9804203085e29dc9870c37ea47ef60c3590f4a94602098efd926403818360d7d6a4204323071b21280000030d4002003a8d5a0c4c89002602040601f5ded1418e1aecb8022c48187f9b80fc68b081064f824c996104ec8bd3263c200a36c2ad5d4a102a4f8f3d9ee16000c45ddeed2080878b5264c9e97a400a80d0000424408c0400085846c8263620b1b0058d782f76a5e2409f00bc5a00e0a90ca9d69403692c735c77845d36d94c13031990c178800000000000000003e4522ab2740502d0d1c70cd08208706d9b32d2fd4b984e821a933749a2ba6a4fdd82ad88e3e423e520136ed5f8797f3da9b8a3a825f2b011bfa885812f74b0e0bfa9058601a0288cd084b9d0f69a05e520b2c5090407c0200001aa401017a2807816577461448648de3028a76f0f2364144760042eee8826c360b047920c0004016403040c69b54940c265cd3465600000bccb331ebe40094081a28a64cb7df9314507f3cd723b82899a329fb870c413c3f6) <<< 16000) + 0x02301924183f62dfee801820db72e3b018184f215b7cc2d08000a8eaa067000009d3151cb55ede6400ac0e00004387450078165774614243246f181452008bee834510c7386033910490fe30aeb920c000200b20182031a6d5250308cb9a68cac00000bccb331ebe40098081a2853265befc98a2838cf3f62a58a22d065190a03882553f69bcb9124181fb16ff7400c1036dcb8ec060611e42b6f985a10000a8eaa067000004e98a8e5aaf6f320058070000225200085246b81635a03892016c85139111d525f770f31c3000011d2b218595cf75fb4a28a1f90bf286060c13d5fbf049c100000dbba02820027eb5b46184420ff3de2f852004e0488923b2c81974c111dbcf10d652c0c2fcfd7f2b6ac18334b056ffd58204000128b8708309112bbfb79d9e00000246d023280006d047396c10004aa608514f3189002b03800010e9f367fd33343c43342d6dd20d95eefbc3030850d548f0a5f6c765380194b7688d00176fad127041e0080000a4991c000474ac84897bbe492169248bb7a84e1101a6123658c048a56454ceef1453cb53d30c0a26b9f0f4504c04000178c200825645475dec89002502079b24d5c5c9e16614122a6804671ddbc6003c01000009f23580a0002b020960a00087020461a0011252002af24280340039a44120340046124110a7312c4d9a198bbe143e82919ee36f77d1002e82470180590333c807499e681e825b008458c4045825003803002000a09701f4eec5c9eddd80529190b416f5ee2525cd3902db8e6a2921299d2251e5f3c21eb4deb9a4c8f74000aec8015729099398d59ac6a8361301be183375344b4300188e3085d38a3cd753630c3eb36c36cf75e6acd992e6c12a1bcbb94c3012ba9e0c1e72581dfb218908f85bb9a37c1007f64613389a0784badb91deb37d77227828aa12e2db4dc56af14c72cf0f64f52a4724d684daf7e5ce7a9791143d142d5491d106ebee07ee400a87be5cbfb9e3c849063301a9158d408c69c2634c031a501c04ccb1793041a75fd178022101e00851614753168f8c90c100002cb41780008214d84f53dbf6020229f28f429450c10486ffcaf8351a18047f9b529a917a2c03eec835b2cd9201e8480710330540000fa11a40d8d184c688263420b1a001c0200401100001004780ec9ec48001737e4fb2001c00400003818020080200000888000751c37e08b4784a68030c17e651171c76104fb8f9b40d1d91410a6000d462c71a04d62757018958c005302b8804fb800000b2d05e00bd0903061882600007588cf84c6781633a0b19c05e03033b2484b0450a150d06084a11fc7041c84e899820120c0f80430d1302a15038600005dc01860bb9a608104278b87c460299af20020827289b27c680c2edb4a06000000b4d820140c1000400006308cd8e8000a548cd0680018c48cc90c660070e7104a06000000001850cd1a48c28668d221209649c31010a10c0980100000080060800401b000010046960d14ec0d66c1c293332b9bc62e389323f0832b6d96180000ae27fc0104b9fed569ec30c085f13b8611a87002eac860adb31a005584002e83964ad0005c0800001ff232e0b196058ca82c650178500001def410d10ed2a30632a48602542026c61839ba79b1522980530be13527800119edfb154c8004a893110caa630a14816000066c8c88c864c340008e046487764a48c73bd1c200002ee00a146e150fe98086b35860820883189b718003959cad900081f312400024a0fc460800504040010c2903e78e31e280005dc0183aba1e18a187abb79908d08d9c614582087bb345c14040f98920804e283e010c28000169b1e2c0f9e6e0183c25e112220640f9892030d1c503471a1418290ac0005f8e9864804e283e0100001582322321900900017a918f0900025b102329002108002b2c800a28102f2dcc4b13668662ef850fa0a467b8dbddf4400ba091c0601640ccf201d2679a07a096c022054949066006b45942999ba17ca3db7d447c18ca5615017000000000000000008021460221428209200a006002a82201cf299a8366cc686be7777f1e19085dd327b7b205a630b491538e83d2cd5252f54d52adfc2b9b798a616f72f56b0002c9d31e766a81b460500045322203a18e01000eac9e2a337c76eaf9a7280745a6078b59cbd3efb241af1ddb0e4d8f6e28a42a4078f8eeeeb01c0e19b69b66810ebbf6a142c5a9e506878b8e9c128e1e82c5a99d052b787b72250fcf48f9e532464a3a8888218c562ebbdc1898c241d83428280ab42ca978bb47046eac32880727a32c566105d493c1e1f0f8f48af960563940e6321e68a74ede60df6d2ca5ee002d093f5ce35ce16ee2593d0ed9071571419c6e33448e8ab8f28f801efc0898f949986b57b7b9cafcc98e37b1cc808732b8eb346249d45609c553ba17c8dbbce4fe2167a1f06ecd149b7dbf645d6377e2e931c08dff8b2e70ca59d49031a1318c0186c00e0639b718c7ca8d297d9a8169d7b5dfeb7a2053ed22d20c2b28fdd3b3be7efab6f92fe9060f02115060acdf4e7c9ade7145ae8bbe44f18e5d8953b20034dbcfe630d97a85e553fc0c20f795ce1670ce9748afad70809aa48c26f26e2d5762cdb8702b588e634b3a9bf1165006b213892331b5b02bf10591eddab122619d6954e90fa319090851f19eaf3392d1e6640431ba7b6c48a4d02f4a2a3a71152ba69db1b6eee94f3d7a721b131769fe4eb0c9448f403161318a01d934f32ba74919974272a8c29dda1a4a1844acdab22207099ce480504a59a7e6013060f8042c9227003222463)) <<< 16000) + 0x272ced71855f9d994318422d87e291030a3a192330098fa256a0260c2000800009791890d8c404c61c2630c03aa1b932c20896a1391a37a334cda65a810578aa253fba5c6c380773ec19af4f7f2bbc98485384f18f009f1c0989af771f684f8befc80ce911fb05d5f81fbf3a00da1d19851438e30e28c20a27f15cb5243410791c93bea11cb7cd16baff0be7c282af82c265beca2f622c7075f98e20abe0ba768534f6e1bb861026d0c880a3adafc7a0a6e21542c662939819e48609113eae14b894b09ca1d9cfaf170e345f78cad1c559903dd42883f091224d03c64570524c103e010000127230a0b18405d9291cd9a7a48c358d60bc30a7121fe4a6081e256b80308a7dd129e40615a33ddc20628d8a79458129932ae60050284001000018b230632182090003e691811dc39c4128180000000061433469230a19a3488495e2a894fee971b0e01dcfb066bd3dfcaef261221cde4f80e6fa425f532a48ec33c5243b575150f824acb5d3cd8a9086e648e38820410230010000128546300a989ab82703b3cb3e7a83c5fedfaf9a5962f7124221126cbbf473c05853d02eae854ab054940b4c2840a95a0babf0d697e1c3b64e98709b147b1b940011b48007a611802d000a9b917f298250ce4492f4b92c8c30824d91e71c040493038e5c91000e1e381f7c140783531fd02200709cbb900400d66ac99e4200860c6c11291abcdceb6900028d9301c7a899009c08000042a40a0742fc020d401000fb2909205cd614b7c28d02d83d67284e0f59ca14c710bbd998e2177b2c2321c218210208110004011004500f66ed225a5f28d4d8f72c7e0f6eab00e14ecc2f728863c649e20a558c40e62510f5e7d9acc590feb331b2c3a8af4000a94e100df39503bd1812fba06c1ab02021ba8fca87083042e269b81088c004e5a2d16b01409169a0beb7c2004fb0bc04b7040189b881c950aa2a000933f87708ee86fd75c2b02800011610bf450be948248862f83317b098bd0285e405034bd884095883840494adf7df0c17f516c6c4bc2845d09ccc15d1000de6df2aeac38132c2b3cac50a0119de045f3488889427bb54949c205bdb768639d54ba01501434b37bf6094d014482f7c0bc67cb201ebce646a050e1d155b869d2c1dfdd68ca1c0c08000034c2c08000b791cf6c80002a8d5c704240362050a4081c61ab4e31fdc80e2c0b03b1cd67859018f8511f05c302c2a2f11a4440e1000002dfb82060406bfb278fe40821c69e16539f24002721a2a8e0217890185a060f3575ed6fc80b45f7e4067488fd82eafc0fdf9d006d0e84f34c24d0c80c208704f00a0130100200de3053f0e400c5ce2c5b4d6dcf27cc24000007da1a4b24000008a2c1ce124120aeedb68c0c04f26923bbca0c04f2617420430c161834630a03081d0af29cfba1c4801601620716bc0034134a070918998709005c859cc91000000fa21a10330201c9202006db819c40003ff57c42700230080000b59019010001de900051821c21200074122f033d8ddf48a8a99ddb58c96ec092c2f0ea04054500004f24ec05272e5b32ef732b58ddc2abf81b4505e85800000000000000002091851849249439239431230c0280181c01006800114917719c8d8c17a00012851196d10a4122f609f5c95c80814b7c336018207e22d15a2c01196b3ba8080020fe8a448200777f3aeae8880520909405000037c451817e6aebdadf90168befc80ce911fb05d5f81fbf3a00da1d09649039429229029608c02a0057e669af92d5472b5bfeaf1b21d5def52103b315cc1c2f017d69f9178f01891b98e491e3adb25841652db0a850a364a386471b245dd4bd3c14f310289245f8e9cdc61005c70b5a43e5823ef4914b5540c00115f10f3370401944692f6a0d50009934121681a000081880204c0011ec83f02c1f4160f803b27ce774b68600a14c3e544f204091528341aa5cd0510349adc8e77cb082c8679776c86084960ab21d34300d771e2e7a91001be044e64220000cfb67535fa29487342c03061423f320ef0c0c241552587f60164047c10efe9b286875d043696c48c0cff136afe48140d5559ee8e0c200345a6b2831c1143234fee908000051105856050b187810ad13a24a1b71102a43e846102813d30e028c0c10cf9a41338c046402f0ed20870459da07befdc5000314ddffbcd00608e7a0c19100481672c2c0300000fa90d81180020e1817034b4d68978c2d1321b9cc652046bc54d2d200208046f40c89e0c0e08835a1d980e1c705e9ad7861834709281d5c4180ef8cc17f47010129d8f2d9984bc2400ac0d1642327887e638e26ccd28f1434e7a2363a40a146f20788c2839ced89e18209e0bf169800a77f133138011004000058c8bb00f461871650d38c40c7911a96386471a8dc5cd83be9228a636e52a70145c829f1c0f70408c868f304808712b41d2e439f0c003fdf499e0c10003f296d09f17a120056060c2541c63e3220815025e728b1e871b9a82246057479414718190bb1ed145018845770d00510100199c00880200002c67460ebe9f1ed4e2064352c5a56f71c6a2792c62b2724514c6dca54e0145cfec29b2e08204643479824041c4ad074b90e7c1800bdd052cb6410003f296d09f0bd04801601a309519147f088203bb2bb5e2c7a1ba3030c91815f260841c605a43474c514105587ae340144c412ce700220080000b190003a22000eaa40ac24054120290501402c09c042ea0317401013008094040480217301000602900127c20049fa45c8d724bfe56b6d8c0014359401fe89fe012209206810d)) <<< 16000) + 0x43e1020700713c33898a23cce19692ea5881cb4fa4c786bd940c63bfd676d9c0a009f9e056fb0006008ec5df05ee3dac0480180202c962d6276b858a8bfe7715ca14315228ea0c20533386122829c779475208002ab3e5a66002300800009d9a216bc2d5b0da186051b5b7d778a1426f86946b32843b5e3f117189100000249a502418739f413ce46040ca4b67ada00000307c82c87042a0200000e69d34363dff18863a23360cebb429175d78b0581cd48046bc0000000000000000040114dd165ede7a4e50a666e85f28f6dfd4394897296a1040000000000000000f4891c91090c80c708103e126c101800d00028422e20317001d9373f08e8e7e5c716312f5ad65f2a06650db2e810fcddbb3962d0de9c94dc056a50a134e8fbab3d750e192f5a2377e8a6648008f23154d13003e848070436054593599cb94cfc71cd8fba9d50163383dd5e218286b771d7602058aeaa8f3189ca148e3e0f02112211c791cbc61c303fd2ea9f84000000300060852084e0380001f338509ac7d65069164e2e0ef70cf09630f16227c94414372a5a2c404b162d350861bdde942838dc7c194b0e18f1617096d4120024a4a119e03f42010b00b18602050cdcac5933a7f171a5983803e4d883438e37b95b8331631c595025f050d080806a6c162a99f64378a50a00001d4840000026ca152010980500003b84000f8cc3a992ffd420e7ffd829e59150423128828524528424420318220070080200da222732b61b630c765ab9ba028579d261cc3122e5642a6618a116c9f95a9e48887f53a3f620343fa3438d0c101bb784c28700000068bb04a410940500003be45bc0400061440a0260016944128452300000ed6c607188adf3ab10a38a758519ea511c446d8f00cf104111f6c2de3b05046f54eb647e202e6d68a0c7d081821764771e02001a1e7b77b28920052048a205c53d31724454255e85881267cc0f3b10101d6fa8e8304ca7c4ba2280130adb8966002200800009a916e01d108cc6d2a72028701bfbbf608123057d3159e449100d5dc7f91e4085871f6c1802030000080d780a10262f7706c09061115ebf7c0380020f0182706c4821480e28a0bbdb355b4510668c1b411491c06f0047ff12307fbe93a1c14507fbe4d48c4086e05f84ee480c000023238120c747e56ee2000002e8c1620109c0500003ca40010148b680c5b0042d60216a010003ef11691d0b40e859c742cc32165150b20a858c342c412161010b000800725c8afa4c579162ba830923d8ae18c56cc62b44b159258ac10c55c660fa33c209bcaab6000a21f366c3caa0818fbf5ab9261001d96e42e3b0e02c2f9f29068a021fbaafcbd840080fd73a3900a80a20004e5111b7fd40fd292950e41a1c7cf6a920453b814010201bb140d82054f32c12408360088020080200000888ab04c554262a813153018a900f819baecf690840d8040544162a00b14f01e037a2d163fd88be5f5b6534f664a04eaedf28c53c4ee047c18930b477a20ec70d05fcce331958ea1f80d771e533e63a1ebdefcb54bdddf5076ee5fa87fa3307a5a9c8fe8cc8ddc68c5349a9a63f9cbf02783897f1c55ade12b0dd29b667867690ea82ed5c6c8a3554d9dc443756c0216fb472fb41e72902ec49dc792d50ce4cdc43eea3e1be12457c10153ff6b83f450d08b1ac3a69c2c45cc15c8fc470a1bb1fd48acbf4181159b5ad6c9c53a3e708aeab7600016648358480019508a70ce432700e4896d3f367eef1beb5d0ca9390bd9e1f1e518cbb341a2130874cf1d68d775ac9300a526fddcb8661f5b9269b5df8875253d98f2f067e9f27d72f7ff713eb22270b9ef95f026fda3d37af2bed3cb1e7f4661726a27a3e67f26599a1cb3ddae5dba58286b070b409410693c3e74fd079399f81fcba5601024a19b20cb2b45cf6d0d5fd4836f658cc5f16e9622fdda7b26dd720b4cf87669fedaa3cebfc0116784d75c8ec1a94f0563f740c44a287a800058e3153916b1820bb004f5d3b500ed6c4fb454e45ac6082ebffdc2f63e059089de83f0bfa46d80a1dcad6d0ed2e3b9c8c84ce0806c6efa45454ceedac64b7604961787502031c60823011c108150ea8dd2f2d8ea38623b0198892a699b994db09046ae72b9af537d0e40571e98f7c92304ccc43cf1fa6446d6c0e08b607dea67b1a4725c2e4c4238c20e71d7b59fd9e898c822f7023e8b64ef0a74d728d595611cc52ba81e3288a557095cacf1870688f5210d3cac90a2809ff87156690218881311a76a73015de2de4c10282c4ec8cc038c909368a03cd85ac20c003b587ca88814100f80400006248180a8001d3c8a694c530962964314a1986c08c5244600812148098a384c5182628a1305e01c7dda9105291f8139755b37ee002228dc10a84dd5ad08530a5f87a5902acc1bccd47de0599231e29821221419e03a9b5b068e83e6f4ddc8fb02ccab50f51a910e002450e9916b81ae6a68fec45ff4e98b998724c7cb8226ee31ff67012ab999394e7746f428934f4caff48ef443ae97599dca020a1a6d54e0bc2b3305ee243e250a5be2843b8e52fd6270eca37c431c219c2a1bfe3da589d8179ea6e1928e099c0616870a4e4cce96fc1cb7baa56b411e4a1260d9419843280e41c6e1440001a11e0c17490f70c0e54b2b080b0e93efe8d890c4be1a33ce082fe99498e01c7f57b9c100881a4f140002720200080000b291231d81408e21b28f55a80aa0cda5c836302faea121d9d75090eb71b1886f25e5d824c2132821c2341240100080001ef97063a0961579f41e073ecf6caa3758033b0e39)) <<< 16000) + 0xe1a81af10c0e1ec1b3d8b20064a0004ba6fe91b6035389f3f6e3d6171c55f13f382123eed4882948fc09cbaad9bf70011146e084bfa46d820fd27b7f6a305c7e682d0281f33e00d0a08308204300100e12344a0b7d07de8d80dd3ffe862a51463e3b7829086864e24672285b94c3869bf86e874d6149ab3f253f8eceb159d0ed9b80a419e5b5a123b80e2994127e674801c267dae422482151f3d8c204827a5b89a00165673b3008bdcac36481b17ea1a051028201f0080000c490451502202851016000b1a450cc62845b141298a010c0546627e3313e0d87086c4f427c12cfca741afa1c563a0daf68d02969037c2f52d6fbfac6ef3d65e78482652122aaf8fdc153c93cb73dee6e680242e399ecb43a4c11c3f3a39381133f9e287ef8deef00770574abb0f325728bba65ef79de222a8f4b709804a1c5671a921ff3fe0feb83f5b1fa60d45bf5bb636a0cee1d68353947e279769f23ae76e61334fb1b6e4506837c9b9b963c0a0d25bc4deec72ce4d7049b2000eaacee7cd1a4678b70b1abb5a5a729f69b31643aa49b013c0109d80ec347f4104a506287e13d060c7527ae49a09efc9c45400a55c983e00128c0f8042228d3fe2782077a230d69c11bde6308600bedb4080600f3ce498001a36c91900130a0f004308ef97031103f6992439c1609029c42001c4d71e012080e8040498040001c24000890f8e5a7b4825816cb861a048307001141cbeb25804420700102740200006122721a0e10909c0080004c489b86c00129089b0ec0a057628ef5ffe91c0d2de97e28a092b946f71602bf612a380120a100042c573e718b87044adabe2420a125105f140d73606631415db72aba012880f80404d41600022a44d0642302a1170d0998284c8142620b00028922605312f2989714c4b48608a3312c1989586c4a817c08dc83c11208ad1f789407462545800118e0e00424142b8db5870407889c422006445c8a46083c010e0af73c9f0000755d649020d00200001b8d015f55a73a20f288b340d04028c7b88800b1e78c300023525184a103a0100000f33c106b034a9014715c68a200de00859a0284f83312020e004222c4e8d348820c8020000120e817bd1d18807408f471000d004222a44bf843450e814da903a85134a3001b00800004b91290500009a100027522500bd2c04c66b508129208a8ca0052a397c000a9166368009050780200001a6449824000bc268097fe7f00044506c01100001004400e6c4d670800d804000012489400e01002008000022224e1a12605000081112215049048000660c0bae168c53812ba05c00c00d0635b82c022485dd0024101e00840b1e2447a381495d36b4c04266768f0c102a60644090307802024c020000e321240b80c2e4d16c1420dabdd7040a54ecb5530027450ee8a0070ad62d0094407802141002568822059e7f2490c080f52452102047c69c8208abc498404a183c0101260500008711221100011c91241188e04c00118488f8ec1387624a3304d1188f04e82d92dfd4080844906c01023a13a0280be27cbc130fe1069436671697f4542eb53c9b98de57cc06a47aa5d4f4cd0cfe2fd17f6cf807e213c2f3596f1ec37533c4bcef0f086001bb332fdd2423fad4b27fbaf21f7afa7ce0013c992e144665cb4c85f74a40ca9d5286cf0f50a128cfa8d61bfb9875aa7c16ef3a8faf2d4eb0b9707ce31c48a94b393779418beedff2e59c39e1f51bcfe0893575b844de81c849b680e8b354b78aa9f125f35d0a672efeb1d1cb1dc9d68554401aef2285996815163ebfa1aceaec6ba7b9a39f277c7e3373d342e61168983e634825cb4d812cf7a829d5453907909520c4a0001b98d048a0bd76fc1ec1e879befe2a3cf3cbd84140899060c26cf627bf6aa1acdde4c84b169630eb0c71d02ccdce24127dc2af0bb32f75f7a10ff295034e1a8549ad7f9ef330dc579ae418a4ae45343e70481cdae510e9764f110608b0f3c25093b5ce475f0da639d45dc70ca44490c1d900ceb2fe8db505b63b07c8d09c0d016661476938a001085f5c4fe369e22fe7dd728b1128f3eb288283986b3c058278bd0b91b004a1ca530a61d64ebc7963fbced5c4d7d71436c74a783a47b2d42c5adaf399b9d894a0ed176aa52ab5115892d3c4b0d912e3a8daad10c755539023a0bb0d147b500a0a29b3f5ca03f01b5f800423201c00800005491241588e04c001f8488d168120541300a000faa22466302821f876c614d006063e33b26240609a6630e38628fc8b06682d589ea9c400152df17a20130c100043c386718caa606065d8b7080c96864638e190235b453417acd86bc2015181f004000081911c0568e5edbb954c0d0f82e378e1e9fd752d1031e5b55be8000a2e4738d00a4342d3004c203e010d1c26c27e70e1c4f05f0b1c20436fe540002aefb3c80a060f8020488340001ce4484462401b11b0d800136111f218270ec1343623c1390cd571a5e917ef29108bfd3137ae514ac0f3385062c3300c7921495850c83070e5bc81130b0eb3c00383bf6282de6407dd765cdf5a8c2f732210e7b9ba218a08a49bd6713e0e6e12279db9979835858cf8cb14c504586d71fe2da40c2734d04cba7f9cdccd3f416e5cf2e92a9066b236c3c087a5cf5e48bf4b907d94604489616feb2c67b0e0bf3d1b8544b9b093e1b75afaa6f11703d5c973414ba403da86e80c04a9e6cdc43c0de03f1e1cc188729fe5765e2ce5a0f6418f034808e80f47cb28e13490de9a7e761c36d1b4c64d05deb45a928073fd538c400947078020000202447015e10e80daac901)) <<< 16000) + 0x020a7fcd0c142e5f7ae12090ac5e2d280048404001011b0d80007b111a29024088260140010e64464e42306a1172108b08800389482298811054005728400e5fc802514107e0d83e82c1f007b1bbe9151533bb6b192dd812585e1d4080a8a00009e49d80a4e5cb665dee656b1bb8557f0368a0bd0b000000000000000004122c22422021820c001101041000316fe769e3de5ef1bbd1664934affc3f35396d0418da8bbb6b656530c8e62ef12c64a313eb52f34d1f0f9160b0b0deabb10cc679c71a8ca01af24972e6214b3f696848e05451d5f161c001369a23166998efe571db967eaf316bc8ba228f69c2361da80e21fde09df671cac9b65e58113331374b92b8bf315b274ff8cce1044ef3a3049892ea29a95dddb422c0a00a634b9d86080946cdf4efdb769c1c0c946b48b19cfe2c811e0343e6cbc500aeb4d09119b21870c062faf63f401101052837db261993e15447164e870902ad48333ffff37aa0be0e6599084000026f636a49aaab21450aa7e5c82d297650f6f5d5558a6fec42ae370a22498b99e97c281059c455234040b826070008c60800214558ea0e55161017252109a004d9e178980046a64dd00120a1000428ac5d0d3b438503aa636d28518f8a8b34833e80aad72c208d3efe30094408002022a0200011a200042064983566e582c0118d657f0220c200084020040102280200003722261a112090888080004408880ac43c561b01b10e0d88680bc8095bcbd63081e46a82e30327ac2cc444119137ba64009ade524d0000094a0800214511db71287011942dfb000048807801165cf67f96678c2f788d9222776877f0604357bd289a0064b43740095181e00469b3a78cd91030a5a1476880ffaa0f8846103c010d2243165ff5845a5769108810780202180300008c22160b10a01e9a418401ec40d186097067022f438616011881000434df3a849b11204a52ecc1c73d2af388e01f680d91009040780200001a2400066480019410bf1d00022b1800008020424061d60380400802000008888406839c3420e0a106058828084100400020e400185c88192840864000eda68100d35bd94d3dc5af74d37e1fb13c0dff10b861f361718613761f045eeba4342ac7e89a3fa8d4dfbca015626c486b5b833491df121813e126487b4e0bbf069fd3814d2965d17d498ec48ca86669190b78d51808147122b16040605dc126df615e4a5d08f4e0992901472e28e1cca0624508db809d3c707f4507e700004ef9359fb1488bf55b720610bab4a95740b0d45a17410152f184ac11b209e083186a91685da9ea18000f739c13ccb2b7aa5ad852dc0f138a766f8dde5404d8447c8d237dc7a530a02beb4fd58246727c8f80006762202631002d87f92c3f8761fa3b0fc1187d84e008020080fa0507c82c1cc161f00b0f70587b02c3d4161e80b0f30587902c3c4061e0020ef0107700e08c1f845b0d0c2af7c8d382510ccee8c082a4ab07400d0c8f2f8d032fba9f3240af5f6d7000027201e00851584ae9141e282ecf56a58a3230d09a0080dd22f0582a129c5092820f00403b0061d6030e901d97b535c528510073e8f39811458b88d4010838504a6022fdf7470094307c02165d907b9263020c107484600bdccb50408c307c020000150400070487684c248170040100407602c3ac161d40b0e905e19e4ecf103422edd8d9048207401186694cff81a0680fe7504820700100000e843a01700c01004619b2ff29c1a03054aa06044183c01000007b200017040007b48738c8000a4c8002f410e6218728ec390361c61382036389398a04724225e90025a5cd5ac00008c908002124c3e62d2d5cdf30986d292b80f9fd1392fa2a93ed72cf09603fc4537ff94d2df87ff7d02c7aaf949489720679d47490e5897b48605069953a789501f35153e10a2d4a80ab5a62e38343b99285b15c0c73c06034bc405be6d1f24c168265de98fc32e21bd80100768012e48c651a1f99e4b5ccd34e6ee2a2eb9ac4f7ab386a2ab7025b8868c4e5aac897e20693e85a3aea27c1fa19d5134648c57e054668672acebfc24faa2d1e5c13098451f809815d24efad62495b97c4e118318d3e1fa8cec0f45c46945d9decdfa63f6c43b2cbd00e205f1485cdd64249a27a03f1814ff55224b08394b72c600d11c66200109480740200001fc4001ebc82d948120441c20a0008c021c02200109e21be820de3d06e968370a41b62a0da0180093f90025b63312c4d9a198bbe143e82919ee36f77d1002e82470180590333c807499e681e86fc6a741093420795e84d219991173f3a136321f3209ab800000000000000007e440c4086004802802000220208592de1a7a248fb3746c9cd0dde3dfe622bdbd99833a8ea83bd24210b0d2205576db740001f0847ed48fa6ba418ea5f9e9d82aa791a1c5c4c80c99023453fe3602c6f112f49971f970e78cfb3dd7d240275cbc79ee6e68ac3a2f561c91f307cccb6e26be0e998440f3a000b60400bf98e090efd28b24f922a378bf2bd4496281a6003b28a0a7d36481d7a1f2fb0013f2ca03c49e1fb08bb5acce210805cb734bde748680b7f905679fe453f6de5aceb527e6b100302f870800074225639282c0e4e40b2052cdd87d2c6746fd35e4be38be2ea4b4df0dda067fc21e06c26c1eb889fa429d40deb912fc204d59bdc5bf16d2e23e508616ad1aa49a1a44b00008cc400e7dc804d1d9b8a30452b27a842cffb6066818f7268babc0a0731521600000000000000007a22061823002800800228a0a0000c9c07b180f0f44482678c2f3042464ff77c)) <<< 16000) + 0x10aca39117a58204197d7bb8d53b2b6fb911f153e685591217ba791a4f4d22059e8e0c00b99e198ed832063c4e69c0e7229952a3388656f3e756ed5c27480a1b202000400201416640396acd0970939350713a2f9e7d881d51e670218078160924200987c7dcc0194507c021421b1afb6c8e244a344c0881b5824a841410d0319a6020391a61df00128a10004000041c86c0a835c461ac130d50586a00e5c622fc975628a4c60279ef04092a1f605b2a185cf247c00ab30b4ebe0eca0e1c6d1df82a658a288404380280207e6e268374caf4e048f42721fe8eeb4fe68bfe09b0dc90d94f22c6a3839bfe2546d45551d011014a2236afabdde159a183a1cb24baed09c3099e2ace9370428e57925662e8ea70314a04800000001a96996907c615e68ab0404e018000000003cfe6cc842122c52051442c3281181100100c0147cc9d5ded923c7380783fac6f41f31c1660536ce70aa9ac36d614b413477a5c723c75a00053a434c561721bb16702d2b32e6300413d1d0816408391d8c765c669bbc8510bc7f1b3b6ab170fa7eb8b0c785e138e563747457060808ad73bc225dc39ffe1600701029eebfad3b5b214ef88500ed963be618f6a692cfd840059e24dbd5b7afc6b0fa463898c9326dac9498516af3dedfaa58d1c7140321628a21e56b8a24f1d89d70e187452cc70a193108a068a08a74e76e060e5193d95080107265408004e30400100be150000bb10b21900e0880014f88005df90d22586890c3407619e330ce1986684efe91b6107d127ab6e3d6171fa05360e82123eed4882948fc09cbaad9bf70011146e0855150948f3600b32432031831c014004431f6ca638cace5e4ecfc1cf44b2dd168f071a296a109227dd38433ce7dc3dec9397d4fb64fe3576b2010ee0de30d2f142af30f61e3a68bb09ccd45b58ea694e45dc2bcd1560809c0300000000079fcd99084225083062061842801000000cb1f086d595cf833fb7038c76101cf07161172e5fe4ddb8f1e2271253a870d8739876e36e58c62450b909dd18edc76bcbc5d56cdfb8780db5b8229a8b4395ce1c6e50c438d055985a75f0765070e368efc153246285185200180d8a84c333254ea97a7bfb755b2c75b65d7a6880f4191013475dc5d11f0d6e39de9bfeaa8e988fba891aeb80436e1549751112b01ec3433587c92de0de372ad128a5792b64662227a6871470e57ce185ffacb3a450053c42130028283c0080000d22198230cb09c0a439596863080b6e21962891f287db040022d718ec3000948212a0004a38400100ca0100009010c92505912807054000c5440022088641a831c9418c220830d00064990c52186200efe91b6111eef281800003e809607615b0452bc6185ac600593174753818a502400000000d4b4cb483e873793e039be9097d4ca923b0cf1490ed5d4543e092b2d74f362a421ba1628a11409200e008851294e6163a44a29298d00e65015bf097caab76ba1149baeb71a65a064b7d3fc5538d115be2b467f3ca0e029dc55faebc1e679626ec4e42c5e343fda9bdd808cb8a3a207a5c19ca6c77e585269606d14014672a5e30071b21488014141e00440100401185865d8dfbac1e5000016f41014383bdd726860e3e7b672c28f9e33108f7c5830c343678f76638e02245a387a182003deeebdc80001723292964c0d20050050a1c3ad9f86be28e3f2bf1e3882a3c675c3a1157c850c000038c358061aa8c038d7fd142848109f22e508046e9f7385880801fa110d967000193651d3ee35012400ac0d000043640010cc85f84c308070080100469808917f142a20580000ea7f205900cda020e5710449c808b87a480e46ff4733ef0e3bf2a5bd8cc64002a9dab482306006c621cc1e000054f24a2b4dd2b9002a02c03680e260000186d3e06121b8a213eaf124fe88ae80d748902cd90efa5b1047ba55dab0c2582092e2cba2d10088d0ff841800826e0eb726079201699490f0b913b20054060c2411124714d9e493e0ce370b18a4480ee0ed801fa1840396a4459ce8823b0c2c036eb860e4d94d24298d2010e758972c9b020a03df42dd460a0072d31affa5101ea400b40f000045e400117080034e18040080238d0000193bf6044c0c0c86914e9249cf31d6282552089e0b86031ec143004b30cbea20c2178262430ee10119e51ee49e804138a5fe54002240142fd3762d3cebc801601a3090b4ac4e70ca493e8aead7a4c91208e51495c4c18402a972e2929208d9af4f8a4066020dc3e7ab56c40473e3cd3347020a9519cd73fb280154b36c4f090fb9002b03400010d9b2007e494b73a4113e763059482c706beb4984f8e3b497d521a9cb18526379e52410235f535fb1c2400f0c1582350e004c789a2b84000995b11938738c801481401b4040004364001a408003669000dc120024ec42f8540026ee41f4460381b0c30dc0a1578bf75e96e2ae315ad7807063c0886be1e80f77b2be000000000000000000000000000000000000000000000000180b812c05a0cda5c836302ccb1460c5084042047005042ac6d16828fad5f38ac1e648c33c6c673e793725de66ddbfdd70065340c6637b03ee745e457d562f2e93b322a430366e3c2b003d644b790b292c7ac624fa37af5dafcb401402d02855e2fdd7a5b8ab8c56b5e01c18f0221af87a03ddecaf8000000000000000000000000000000000000000000000000602e04b0166a2d0e573871b94310e341541c41420c22801802c2a302b1ff1b1291ccca310092ad290b29e01090e9cbb44aaa3b0b26e350d757dfafc08558165a75)) <<< 16000) + 0xe9f3492229bbc26e40b5fb30d6ccc725bb70d795d09024c574bb32a3a267d5918245c3c3cb3f1c4121ceef0cfe8406ad853a31cb838000003763b000b000045a197e84027102861701e2010f9391c4407a53ebec0220c1e00800003d90c20586080e87006f9957f945393ae00ecb3a38f073a0461772ccbeb97480e70f000000dad4db510f07e34cbe01c010ae8a6b22bbee23be3681ea30000df6b3424d5dc6cae1ff3f404d29e93108d387dd2862f8802018020080000223864a5d1c981c42a3a412c1448df09d622800417c5612000ed07a370250c2000806000800045c85f8a800100080031890be1d00058c10b2210007be10a81d85e8cc29c5614c2b0a505c0200401185824b8d8217428706e288149bc38f121be7bc21c618b6c3914b6f1620000037d520104112a58a10f03824e5ae91d53c6041d07ecb9800209279415ccc0b139002b03050e10c93e21c0e3cbee9bca1e30c647b31a1f162004f9968a02082708b310f0e096b513459030214948f8340209283926c3658003bb01a38649002601c0000f419180f7fc94b08c61a9dff6242d18514ea38033a090910d4ce487ea1c80c0000364818030c5822162d92070098347c02b703001ca86097d40000e9c6eee4a7396d200580680ba0100011c9000671365040437a3a8b09183031b89042430dd12f68a5b0314567a6d27c1f21418000061b4f8030cb756742fba83028df4e6e9d631410cb377912800209fed0bcdda0a6c2c801681e2460a7dc6d518061adfee32e7f614551e71a87400a0c031bfe16400c3252182414a8604eadeb70c0d1410cdcd9b2080104b68a661e0a2800254e106303e8480150160000840c0a073f871fdd228b444101a844420898359428c004066de9b2e6e3a38400001b240c010443776cc94603004e1bb417f881000e54304bea00007569f1cd951cb69002c03405e0080008e4829808001b0c85b82c2ec1616c03c2c19b48a438e14384d1c336b3a1c7ba1309097ee30ca5d7b29db90412142644245b961800004e2a601c138c85b1fe8e302145257d2540104cc537e3ab57c0c801581828709a3881c11471ec4fc197c7c1864e13fe95bec412016fbc37612c300b6d45c4f8704e006c7f97b1810c3f5948484104ae6072e0d52c0022460daf6bbbc80150160000840c8c07825b6d4118c34b5bcb113f4c48843ec0e8690f8a19306b79bda4018685b5cb331ab1410000036481803803249c6067b604002afc75bfb20000545a69cf0ac56229002e03c05d008000934e161010d66a38c2870c0c6808c110e3f19ea21cb7c4619c1955bad6862091df5191296b2c300000c369f00e0a461a4cc596460432cddb8dd200827e839f197c09b0b2005a078a1c3031a88c56471f619c0e19578619a81273cc28041227fa639c134b0c039225cd8d87051ee82a8df046043d3cbe69694104d7adff6702cb000ab5e446d0a5539002c03800011299180eed06b11a830d2c715f1ba64244221f7b8bbdf0a194a5427070c830ccef7576596e50400000d920601c0193c932ca5604002afc75bfb20000a8cda48c823588c801681c02e8040004864001b3483680f11403262e8ea70314a04800000001a96996907c8a24d1c814c0c80c2040002e100200dc4500c98ba3a9c0c52812000000006a5a65a41f22893472053032030810000b8400803400046880c82800099085a068120140020a641f4560381b0b905e6e28c41611a0a7d681eed5ed53630e4000000000000000134b3a9b8260437e0ff8381e7b0de56177a88791cef00b1c1b83f684980000000000000000000000000000000000000004e22461862453813803402c00b8400803646081a25a18684d43152012d8a6a309840e002000027082982f3714620b08d053eb40f76af6a9b187200000000000000009a59d4dc13021bf07ff37df43991896c91c33fff70525e2284bf481362de790000000000000000000000000000000000000000000002cf0703cf61bcac2ef510f239de016383707ed09300000000000000000000000000000000000000009c648c30c482700680580160801006d0e3caf68340eca5de91020c8042008020080000222000154413c34000a026c407851d2510497248fc21820b7b501f18015c4622f009040800201700a0000ee216e230b605e6e28c41611a0a7d681eed5ed53630e4000000000000000134b3a9b8260437e0fd02855e2fdd7a5b8ab8c56b5e01c18f0221af87a03ddecaf800000000000000000000000000000000000000000000000060f9befa1cc8c4b648e19fffb8292f11425fa409b16f3c80000000000000000000000000000000000000000000016498ba3a9c0c52812000000006a5a65a41f42461862433802c002a180200d9181703a470c36ad1394624307188a5a046183e0100000a832309f27614186e2a9c6b4582f7fb70943057f5a0921c000005ac02c027ca93d04c083e010918eb7c304c07514a76c8810700200000e6412c140500a0001dd362256f6cfb104e52908bc3041661075c9040a2effb8e08d2e0ffc1802f96170e013080f80402d41400028042d0640901200092b21664a0b2250009a8109a2d0588e82c02415e120960900192610ae1df1101ec9e88d7c002839b13c7e0ced000a085b7aaa402280020044e7ef30ba5000600c521fd4f8a80010c2280db1595aa04ff29bcb41f0891338eb24582c2200dc280f9aad79e9f780052836060561e74f8bdeec39f905d58a292460279ef044ebb5f96802805ad4c51e8a3506bd8895350f73c2bd65d80a24052afda34500)) <<< 16000) + 0x0000000000000000000000000000000000000000000000bc640a586306480380280065946ff711c27edf13ce202b971592f272a308b5907624cbde4b45684b5aaed7f33e3fdca902e4b49e559a3c26045375ca296d2c709ea600441406e0d9540748efb78865ee02458848d08bc40000307172dbf5fc14bb188070580dd684425dc083d6e7f0f81a084f520462e18d4488dc8b768680d73687886a996a353570b3416000006416d3ec8c19c10c1500066485e82f6dae365bb1034cd114f66e00b32874c50c5e1044b8c45f92eac51498c04f3de081ad4162f75744f1ee76820154950fb02d950c2e7923e0056bdd0f502d00787a0b4b74154388343382142280088439cb5888d28816c6dca1677ec7b718a9e05c2d4a78419d2eb617ea487d6fcdc80efc0218f74789d256f4807731bd43328aea0006c442b007438d7407f11c50783824a683ab0095dc8001a6a89a0e01129d06b0494407c0201560a000115204623cdc51882c23414fad03ddabdaa6c61c80000000000000002696753704c086fc1f89e30c30819c09808609600e0180401006f92002255c9110300109d1889c10711dabb14e06775c31de0602000249f003214109408000023c42b425e396d0f39a78d1422f160c37ea7d44c4802db407e048103c010f240774d3c3c625948b0061b64f0264103018b058c28103c0080000cc200036842b007640b1c27e6ea249988e18772c7b176b91ac270b0af6bbe7a61465a1850f582a3548e76708a2ffc0f3e4255dd85880446415196d8a353c08016bd71f40b4a1390120ac54978f7e975ac71d011c30f41f1c46360511ed37cfc0dcfac62dd9fd8753bc32bd3c90d39ce16a71f8af14a5fd44a1958c8f9e9d0984d95130332a0b2293af643cd3f1314947644ee82398f01ff152710ffe0c0e1e96f1cac871bdaf403adb4105080fdf0301e1e173e30a2b9a72773534ba4d2e09263b6ace305ebdd2e99feab4254cacfe7897f7dd5a18e7c5975cd719cabd6637acc0e04fe1af3166ebcb9644fb1d61251e7c129bf094d787ed7c9323262124f8761ca4610d065bb33f9b8ad84184eb951994c0b727035c951c8b2715c1f3c02d8002fa3814de5aa3db15557eaaa0610de44d216af41b6aea9e30d6552400039310ab050004eb10aa19000762900168d215242001baf2150430a7158530ac29407c30de4de5212450408d62a27055a355a4b060956c043f81a09577cc0522c10561a90d840005613f95860000148bc68401057d29c894801180a2450001626941a187403bfd8ce04001a94f406833af1cf12a2c1000124f8064280128100000470f0d215c1ff10007f147fa1008d13983c6003c010e1c030f08038622d1b8ace0b61f9abe1401295e7324001e00800006490001833a3837b8bd704020df29d799a00002a87ec6010e849b6514000007530145002201468a500cfc8c16dfe5b704083f147114000a70554001b00400005e10a4050000fb10360d05180ec80cd0f9a670c2ee2e07080c820da56061047f9dd5381a2ebd5cc3021a9352486004d9ebfa13820f8042c8061ef3fc206003c7a4320311249bee0c2036a90703819598030524001bdcec72604200080000959a1e482d8f8b156453e8470beb9dcc850428cf8dc204e708d649410700200a6020001003836b434cf4b663a812fae2ff2b603d0f023ad72dc8518be4e247c14bea2c465dc4aaac48da8fff4824c2dabb72ae76938b12ae01f0e9ca51f3ad409c440fbc6cbd78f5a37c538e070f4213c299293dc561d00a3c7cc4cd9d8b27528b39997d49eef07a92cdfe9595c5a02c9427824a00f7c18d52af8e6d0d8d2e77be1b83e508035b3e3c7c54dc41a1c79000045921441200083a21422b0a009c0615c8c75e987042b8cf15e59a00004274622300d3579966bc5000002dc6c00fa14109c0a1a2842a7a71901811dbbd40818d0d321e861c1aa11920e080d677f692821000400003fce8e1a215d9f0203045bd1360080adac7dc524d00001a94f406015225c23e0280000124f80643001281034742ddf57980eecc16b4804592d48620284a298390007402000018a412c14000484427c07aeac780a478f504f127a6248081fbcced14231205183143281201181041180140032180200d09e090000a1109d1504e08805c34000ca4426c941344a0991d04c02825c1412c0a001645212a720943502d82800d4a484984802412084920c244d600602812d2b3d59040c22e735d86069ee8512850600772b28405a9082ed480183257b7c140040026402000850ce1546de8919867894f901d61681ab1839ca08e40303b33839f014094707c02006a230901181a04e86228b92f248c526b10d060fbef0703100941a06f11815c04d2402806515acd4104026281f00800009b908f1d84706f0a30cf03a870d44740290c1c5fb251d10119a26288d0107c01006a0308d0184600c0d0061160308a01d066d2e41b1816cc2d3af83b283871b477e0ab07ace509c1eb394298e2177b331c42ef65846630a3863065021822808010bb6195dbf81a21d2044de439ea1435b13f71ced0a85de2dc32bac2cd292a07e0290309a261c9e21680016410892104410821c4410c220850900024b908425041848001e74841208204e61004b07f1503f02c1f4060f803d26c5ee241ca2441a782e82044253a114b01f4057d008003036513004251820008693ecc60b8247281ede78c198f699d480649da0b23800e52464012a283a0080790100008610731583d8ac1e837a4d2923a2592403e49b931a189bd1da49a0012e07709603d)) <<< 16000) + 0xf7a1131400e92f7748c003b8cd50000138e10004349320eeafc911ed32b2934345036b0860f5647d070c33be43a78908cfa46b60804a893bd00027181e00803c8080005a08328e8190440006204174a40b813a15a52dfb660312e400712023e18e6240127c4519880120e0f004246050283d86046462232c50a305a506841275bc84e0c0166651a800128c0f8040164540002324188640f02b0601102908c178040004e64160b60ae530772183b0ec158760aa3b05409c8a9f15d1b202edae421160a40b8c80f034f589ac500517c52200944074021e5d23bdb4e286ec067a71011bf6b89c58256031ba812060f00401d4140001c870abdc3307fd03522d3c08467fe5fd15789c2319c7be0cde946436e07ce970c8d14d7a30bd7034962e874d5ce389621b8f6fe2ed7e41790c3ec22addac7fe186395ea1719de0f986ae60e0b5ff3a07d093550bcec5f3ecbf5d5501954e33924242183e4636a1fc567bdf12108a9120a0000df083688c1b0460e82306b09c8e75887cd715e660a655e273c630ffad63d900d5d8605afd1fafc8f2267f117321a2a708380c4edb1499357884910cab5b2659a12da38a01d0d8c807954661abcc49ca5c10db54d4e10154678a8d62014aeadf052ca02683aa3638064f2055ea835d14e1c30200ffb800d7df039ee5b0c995552df7f7d56cc6ae2a4d011007e775c9715dd455c5b3e2a68b694a21869000090441cc860e43b0711583806fcb39c8f4c4e14a5209e524503d4e694b050f054ba0c1fbd6d8f8a0038b8397010986078021032c44633e6060836c11302ef8d1308046203a01006805c4dc969fa40c1c359d0e6343152466a0a0cd2b61a2143404920f0e0529e1c930260c1e00803780f306f3351f7816cc2d3af83b283871b477e0ab07ace509c1eb394298e2177b331c42ef65846000000000000001e6aebdadf90168befc80ce911fb05d5f81fbf3a00da1d22471c69620c19a0dda7c5033772884102f0100b7d68e293b6ef372807bb2758c88fcff073da174a160a46728934bfb4d68ffc7964d07b923d6262880922781003da921e40aa74a1a0a75d91c46b99659c8664f8f090f92342805895b0f69e28db0694023840198ec0306dc65fd0c95ab19122c4b078c078883938c6bfda94428d815761f777f8603417bd06419ea573eb3ac903ef807815da36f3ef4ab48c937b984e81e8d66d6edf3a27fed45c1eb478c4b0548aa419d5adac8ff6fc306360a00000ec880041f900099320014d06c30e8e47e030b6b02a990008860780200dc1b00009620da4306c1d83586e4156827b7856d0250abc5dc0331fd13ab671341eb1bb977778d80fe87ab340f420122cbefcd488e1b66597d70ada9b0d6e99245e7594b35aec194d2a539ae2ac21c0a8ba9f966e5f5335a76a85d1b8f9bc4281826ec9626e1490bf84a986e5f0f7080acaafa99a68caab0914c16ef20fe6a6a76ea93e31dcf23fa1b552753913c11002fc72c504c2ac20cd15daafb2df2878aa7898aacb8e946cefc03f21d9f63ee22ad3ed8b9cdf46bf1cdc2fd60454d3b35818dbf78ee4b6d682b0e5c9073e0dc00d40b069014862b536ef282dfe04e7080f2e4112c204c18e42e581088fd0c0010948074021a2b6f9505cb0e7df6ce6387325429a142b4124b680048303a01006805e8a58ca2cb06843d5a91ba85657ff80e35bf8d5c7753fa6488efcb98c254bea1182875279e0e3eca90e70305a9d0407849ae875de7abf0d87cca1fb975b1bbb13096572d6b454013f758da2c37d4e21a86bbaa9575ef111420946f577ad6fe7276ca7344590805e2c6cf5d456d4d260518a581282431eb5b97c581a768a1b86cd3374ca6ae66fc619174a80910e4c97e1b543149d623ec6ba947621735d6751c395504082eaa0475aef811f11c2e4e8feed2f0faf762f183fa83c23f237d258de1e6e9ab2ceca4127cedfa9b5c0d1013c1e070149c4027bc7fb04ea713e69ed137080931fc3f902040b3a40c8763b568965a96a9fc9a70810078516716f475375253c577da209300056e4ec7585d4846c1452b4910000a0a683369720d8c0b66169d7c1d941c38da3bf05583d67284e0f59ca14c710bbd998e2177b2c2333861833813002c010000894bfdcf873f23824f49652e04ebc3b7bb489388cd8fd29065134efa238558381903d71862607ea0005724002e5480064b1000daf20ce2200141a20cc62065310320e8008440c824bf1bfe0814e2b84714062d6c2bc90185ab27c8048283a01080800802200e6208c70210c1c008401004011000010044828fbbcfe40200fa4121406cb7f058c0070020000134400035ce813be8668200fbb6be11040d00400001c48000d0100020a200048e41384609a1380625a482a4802ae5a2c0088407402100c0100470da47fea830f13344b09029fbd2a42007583748090307002000018c400040c8250a81202408e020001d820c64a062250308cc180540be2b0520d82f008001784823208114b4088220430d001926181d09bd6a9632c7ed374246171648b7136261fe34c164eea3b43838be86b1303bcf5e8a72cc7fb0f1070e11550fb84d5dcca212000e3b4d2c8f69215d84502e25bf10b0f30ceabd001109daa2a5620f3825f41c0060f05af1be0a6813bf52c0e288c148c0f3d81371810d936caaf981098076d2710073506082820ea0a6b067dae8ac31c482c734333f342c55fa0b8504a2d8c414b39ab0534f86087392baa3d6efb0f25f002f5e61d18bba3a375d00a117ee859d4513bc49a69602520726144b0b000017a905d19029048170)) <<< 16000) + 0x17220b4dd89e159117394d23d8608c0e4a1212768394b075e7d5ad303865f3dd7e2043c15ce2a48acce240353ffdcb53f7de2beaa2740b9000fb9030e1af4496aee1d3e88d00077457a3ec5cf8aa8aace5c100fe171ced0b511bd5440416aee003400d906adc51148184421632cbdb6e12f86d5d8c2e04f39c2a33a3b3cac0d3c015942aa61229bf94f89e77c25a87503a4e16093dce9b515703c752170b138e08f6bb65f1970a396423ff781c051b76c6519aa44cc2021e13001286e7467305a7e50d4015913cf5e07f10ae77330a2e07c2c63af2f047393467b2df74c4048aad8cc59965c297d7764288c6152da1f46139de7e1bb374a0960b2a357ce4f48075147029581c10ea3ad2ed5bad3b0a773a8c2830e3c2ede5e2927b3dc2833405f5797b7ee8fbb8d0f7a1e914c578ea0e61df9d30a2d87c0000cb0d8ccbc8c1e270ad9b330ae48a0322027a7091ea4ddda302189225ae2804c647f941801c243f06138410004014407d36c022ced4ab2090817d75090eceba84875b8d8c43792f2ec1261099839e31e29410e1120911332f2745d901bc0c5c52faa714cdc31ca67dac02580ff2f168ac10ec2e5c1d50feec09e13c63f684547984a1803df4468573c5d28283934f0a084beb3576022410fd3b00c9c870463e287e5e730029398d308747e840415016000077880020d105b0d02d00800173482c8e80031dc8007f310582582b92c158560aa2b05405c0861f4002bd3f05995b39a3b114ad64e07c7219cb941101efbb8a50225c0f054a3df6224c0f541439d4c2050b5df9635780587b8299574627bdc9b922f63178c0160e382914c2689d4e2d711d9a172740e77952c0200338d8b3ade910b92185bc97cd3992bba317fe8400a94433fde742319b147aa59bee9f2d81295c11113cf1387ecf5def61f36b7dfb45e72144a213c400b280b6f5b6d990612001e14b89e33c63e6fe7ea6ae14315f72ef9d57cc11bb44c544abe3092bf9f654a12142032d8603a1a1e08053dc3ab4bc67104041681e283369720d8c0b12ca3092073c62863041423c13001c84008034000330d9413b53128f1a22620991431b7d7c9d304b67a99c8309e370a6dc2047f5b31693020f804237820b352660f50ca38e815a0cda5c836302c8b28c24f20a18c10610204c00c020080340004708298280009c48002b6904a158270ac13417419b4b906c605b306f3351f78175e2a894fee971b0e01dcfb066bd3dfcaef261219021410811408c008001fd4d3fc684f6601cd1aa37332479573981f11d2341fffc49e5e1dfb7afddcb726148c1c6d940894dd6078d294e5d0250c1d851d8c608c188a7f0308f4e030d204a1840010b28bb5fc241849ddab17a20740a12d4a78ddb4a034ca195c4e2ce9822fe0ee48142334dd88a6015abef4ac0a0307c0200002fe7306f3351f78160f496e6e88a05d78aa253fba5c6c380773ec19af4f7f2bbc9848670a48a586286480100048971ea06fbf385f696c67b0dc03616d73b79844ea71a198f581bee44c00738c21143750002722000a54412434090120007e920a412b3b52ac824205b306f3351f7816440828850650048020018084a21870ec1783a913a8249db2d6c6db8c238576c600a6a3c11ff340d8cba2bce3d6cd5a901e8f486165d4d6ba26d6b1cbe622716883022faaf005c41c202b08ec7c5c183ff881517ca499868c4c15cfc5081b0072456087dfa83bf154cc22c6e12cffe2d140099e8be8124ae97d7a2a99bd2abd9e6784dc440054702f1c01103ac10fa3c3540083917e2bac89c7b20a097c9b71a5ccf67b1c91bea510961e002882f481544c8d5e5f881c6fc747adaba2c3035e609e905c80c39a11584a222822374c3843d508083a5db4982e8401a88a1c320d7402dd6ddb79dea2fce105c078c2c02e3e84c58eabf0d282ac8ace8a35a014d207087ca1c08edebd01c0be0104f97e7680b1c583d4a67e9d0688b0c2fb0460aa604a30a0823170e0e5ebea8100639360a9f91b7680d00798971c1d4e5dd4603a91e1210780e80002c820a01bd22bc2b677407c7d0e32881f6f8647a2c512806108a0aacdd2430c13deb371426081e00861626623e78d226ea3488a03e80ad5c92c742706278504585211d430558fbac51a0327370f209c207c0200002a4413c140005464001eb080061d904e1982684e850406627c68822fa1c08512f10100c10094f4db3910028405ed404a183e01004c05e0f35a59ba9e3775bbb0238ddf37bea94201427242484fd368e40e1086949c613040f0042ca0db95b5660f5a8ce72cf1b821d18f94327a7b5392420853f942600c4f7ed4426081f0080000939b2849193c3307dcbff730f1ab9723071c6c43a7d1490a4d8d0bd2817671d8c8306af7878e27041e00859431e349dcc1ebbbd1809e357f847a22863c79113648451196e70a04c577d0e060adc93fe63005cf3f59450083e01000017b2096120002f42000ae44128540921a04809023808001bd0800a7890462d02290811034086120027d72084820413d0201c80fca407c3203d09001fa29a1f0424c0166d700678828302630d220c621392e8a09d494db9451bc0f6560c100d053b9a58f60f318802564d76140d20a77fe1c017fd040dbf15bdb0486003259536c0e5e2114250413cd35dad96433d538319e1703a51c811828142da1bf399c6e63df97744f31e3ce2050567b84568f61ad7e9b8bc2e92c586e2300620676553ab8cfb468664890c8ea4f22b77f96f8c7645b8204f0c18456ae5d1c29032b816b2d3526e20035cd5372195db5ac7c5)) <<< 16000) + 0xb93371d800757181ee9a1428ae09ffbd70058241b9431019caf240128c30d6268c1d2d8e3574d0615ca0d784042c3f025ca00192f547c50023b41af41943080021c73267d30ab9c16c91674bf9869120b187c5524d0471d6f0341b45a5e583a4f2f364b30f302873c8492f44261be2260c41810f8f53e426dcebda89b3b185078939754eb7ce2c328b081c013c0026147a0e5240044dcab16b077ac71d9493a8a189b0449e6470eebc445205a7b370eca0d53d595deb5d79588aaef70623c60b8d9955da8506c755808e7a3ceffa065c136000121c81184f08818111819714d8ea198e216602e4f3d10b61be487f39a3ef5dbea7cd04ce31cd76f69767b97e5132a0ce9b171c1099b58f91b89f6c59972e6b790144e6d4b8287fce290e5b5aa35d99f3749e230d569d92a67adb42a33eba0e4140021f9c3a6cf7f6f6f043e7035c495ed8937f2259eb2b47f1d3bf2db02b48db37b3446ea875dad3c512843464c5029f1d6e64f5d3dbaf8cc66a39926f46c3867af19f5acad8d6b6389deb9cd6f086f2392499675f3373cae8f6760125ffd179f2df79cd28d5630372b5c0f4e1e3f660f0bda07bea4aaaa77646cbe73ea32541fab2470c044d0472f36cb7cc4623d356efdf9dd71fe1a89f74557b5699902743604dd1b2e6f5004ae4e22c1a6596e56af41161510591ab220a4b038e76b28120c1b00440300401000004440002c48004a59000f2020783a0012fd20763b0301181d08c0e40783c22e3ab214244b3431e30227ed3708a00568bdd812020f8043071349cd050eafa8b046088999280a15ee9c41080a55a1824a08360100000e63632bf9afa090804c404c4821d8d2ad101918efa28e03babdfa494107402007002000105206e13a04e627f211081a00440200401000004440d81400013640d4460680ba142e454e0302f6bf5dd2000c389c88604972e57c09030740210080100461b00b319490173b1488241038008000073200016040cc4406412017090000ea9031210180a80bc1405c0a02d0500031f102c390159a80a8c405242028218138a80981404a0a02401000eae900982420143a670441b746d63c860400004d74f80a0d90d186b874101213fbf5f2cc1805eb3fd2d4d0200088285071f2a20966e1ce1ca1008af14e9bb5080109cf5b61b546382b028716e6bd70ae1c3c71ac3ce860c0000e95808127b2ac6148002498b9cb1803c52703d450000002e8c510271c2200840c5d543afc90248dd793f6388000026f10e0067092936300000007c20215142200459622bbf66c028a8ca2ddfe91440002203630a189e5fbacc8080000a1998525042500859266e04afe8c1c000074d3121800002eda30200c1cb08658319e9d4fba5002300861813c44f6d6309000015e041649dbbcc27c0c14554e7eb8028a1feed845b20200004a8a4160ce7d0cd69040400001191c00000009e2449900250100000ee100030320460bb2c4065c89a851528c661e022c600012a47f14313ce8e67d480400034e2c0300000073f8a100000280a3c04e104a010c28e521b5fd52ca00000ea420d200bdc70e3d28302f70dad34c0ab942f5d5404133a3b03f4a8c004c028d3555305b621a527a53bf58346278cf7a9430cdb3a8d564a0d3d23d9041a168a6aa3702c2000034b54185a29d437500000004f1224c80118080000728e147290dafea965000007521069005ee3871e941817b86d69a6055ca17aeaa020968408af4546002601469b1edad607d1a52e009590b230cded809718941a9cba64b8c685d1533585796100001da5f4185e2267cc7b0200c9c4300920000002c7a32519002601c0000f410003532000d4640020e88110480032d48108c80037d48100cc07c3603c1b01d01d14191071d142499f32bc8a312380001231589149e8b2a19e3860000446f314000001b20c0200000917ac89c1094021441ea73a606dfd96300e1ee54f87c1230000072623a01020070f39d5dde140d57399c9a3a8ce205003003c51061befcd0f8a2800020f23840800d1486f5882010928e9e630601a2adc750618414eb00f850302e7ef7191208000057d8c20201a2b152d7c801300800007948001ad1a283e656a2e0493325d3dfc02870000004f9923800013692c9149e8df981c2800000394ea9800940212398396990aa208000083c8e0e18054ebe46218605fa16ef78a100a9df02ec104149b0e564120404d50953c400000015f6306000a9dfe5cdf2004c0200001e520380a00035c20361301a01d143d9ec87b224983e93e68c14380000027cc91c00009b49648a4f46fcc0e14000001ca7513021280438c0000114b790a2800033e4a204086458d661ec08205696dd02f6186646774b076901106f31753e4304037ba554ba080c239c7a8404102ae47a4756c46f20054050e30000056795d0a2800040ddca81021f5bc2fe99c082072e61fe8dd0619c6a4f4a2f09011470abdd6ff0c101659989d3c080d2c83992505040b641bf7a760589c801601800008888002259a2845f19b7a84931979922de2870000004f9923800013692c9149e8df981c2800000394ea98009402123a7778a5eea640e0000250f710c3000000002d050a12c00e497b0e180c7fa7f3ce1861c6be6b611041094659f9066481a6c1bce73d060019002afbad959002a0240001071019050001c290180d00b8280025e480b0c80544402822013050090280441400254440401400454c403cf401c7200d3500618802ca40143a0091d00406801c1400c02005010012db9004250018a800844002020000100ba441)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 34 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase4" = "QuadFullFourCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 34 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase4 private def zz2188:"s088c"="s088c":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l35 l36 l37 l38 l4 l41 l42 l43 l45 l5 l51 l55 l56 l57 l58 l6 l60 l61 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x11bb7d84c, -0x11c0c8e78, -0x1aa12ee74,0x16164240], ![-0x11c0c8e78, -0x505a009c2,0x3acdcb8c,0x10ced2f18], ![-0x1aa12ee74,0x3acdcb8c, -0x73652d7a7,0x11c0cec3e], ![0x16164240,0x10ced2f18,0x11c0cec3e, -0x8e065eac]] noncomputable def hinges:Hinges:=[(-0x1c76191c,l6),(-0x120c504f,l5),(0x61cd59a4,l4),(0x31ba0ab3,l9),(-0x15252f9c,l8),(-0x3b0fd808,l11),(0x28a8eb2e,l10),(0x38f28b54,l14),(0x1526ea9ac,l13),(0x1899ee19a,l15),(0x10adb62e,l21),(-0x6ef25414,l20),(-0xc24a858,l23),(0x22af77aa,l22),(-0x8e065eac,l27),(-0x287c9968,l28),(0x8e065eac,l29),(-0xb33970fc,l25),(0x659f6a40,l30),(0x8e065eac,l33),(-0x138f6a4a,l38),(-0x8e065eac,l35),(0x1504a7cf,l36),(0x8e065eac,l37),(-0xdb49d4e,l43),(-0x6671175f,l42),(-0x4eeb7af6,l41),(0x284e72d4,l45),(0x8e065eac,l51),(0x1349343c,l55),(-0x4a8e861c,l57),(0x1707c2b5,l56),(-0x43fe84b4,l58),(-0x184a5000,l61),(0xf8e874a,l60),(0x1702d994,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x8e065eac,l27),(0x8e065eac,l29),(0x8e065eac,l33),(-0x8e065eac,l35),(0x8e065eac,l37),(0x8e065eac,l51),(0x1526ea9ac,l13),(-0xb33970fc,l25),(-0x4a8e861c,l57),(0x659f6a40,l30),(0x1899ee19a,l15),(-0x3b0fd808,l11),(0x31ba0ab3,l9),(-0x287c9968,l28),(-0x6ef25414,l20),(-0x6671175f,l42),(0x38f28b54,l14),(0x28a8eb2e,l10),(-0x43fe84b4,l58),(-0x184a5000,l61),(0x1349343c,l55),(-0x1c76191c,l6),(0x10adb62e,l21),(0x61cd59a4,l4),(0x1702d994,l64),(0x284e72d4,l45),(-0x4eeb7af6,l41),(-0x138f6a4a,l38),(0x22af77aa,l22),(-0xc24a858,l23),(0xf8e874a,l60),(-0xdb49d4e,l43),(0x1707c2b5,l56),(-0x15252f9c,l8),(0x1504a7cf,l36),(-0x120c504f,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x442a0298040000000000340920080000000108c812601000000001f12018c020000005187e06d980800000000843409300800000e1182032460280000001c8c40d8c030000000421700e980600000008239036300c0000001105e01a6018000002085b0214c04000000408ee0361808000000a120404830100000014641809060200000000001101c80200000000004204900400000000001303200400000010c4204a6018000000d41101a8c04000000308a2036180800000006229014300c0000198a44203c8018000691381800690040000c62402c03d200800000000000703200400000004c1204460180000000a8240c8c030000000000120490040000000822102c300c0000000008801640180000000002101c80200000000023805900600000000045013200c000000c61781b660200000000002501880200000000004e0310040000000000240720080000000ac3204a60180000000002403480300000000003a03100400000000007c06200800000000d0680c601000000001b09024c0200000003108816180600000000004c052008005105704400da8028000560901602750040000000230a80518060001482a04803d4010000268460900648020000001242100c8c040000000026140298040001342104803240100002a04e0a00da802000a60a209804b50050000b81403802ea00800000000026009200c0000000088480c60100000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x42160298040000005444240640080000000150c81c6010000000000190388020000000541880d180600000000a4640d300800002084c1404480180000000017002c8030000000590f01198060000000000b40720080000000000300a40100000290902c0d1003000000002c16059804000000000d930330040000012238809060200000530a8280390030000052210b01b20060000000044340f3008000000861b815060200000000b0e0c0d0010000000190881b18060000154260a01c400c000000000be01640180000000017404c803000004a190b009200600000000482c0530080002888a0901108020000001141c00ecc040000000210c80a18060000004907c01b3010000008606a02166028000001043500a0c040000002086203618080000000641e01d300c0000000c45206c60180000001a07c034c0300000002e1c181a002000000620ec0853010000000c22b80d8602000000002b09018c020000000000028190020000000000a40920080000000148480c60100000002a844028c0300000000541202980400000000a42c0e300800870e904e02e880280000000320603cc0200010821824052a0080001c4670b006c4010000000e23380d860200000024c730120c040000000000360310040000000000340720080000000000e81240100000000000440c80100000000322a07980400000638a7024c301400000c514a0498602800000001a0d014c0200000962904816a006004d48302702794014000498ac08814a80200000000000340c801,0x942b050062006000000000094092008000000000b0a0660080009214c12025100400000000002a0710040000000982901a300c00000000b8301c601000000002515034c0200000661b0480e200600000000986c0b3008000000000f120660080008408c1501b9004038c1120b60396200c00304508230372401400000a1102032460281a414509b00ced00600000641b08812a00600000005221036300c0003486c11006a802001a324640804d1005061241238c04b1a00c000005088100d230140001a84209019880200000000c844088c030000000000120310040000f02105003c40100003e0781080f08020000000000050188020000781083404e20080000000220a00c300c0003a0681080f08020000000841400f0c040001023884c0662008004047484a02904014000408e2110190802000003115850099003000000322a1405200400028863048094401000000000d8301c60100000331482809100300000000322a0518040000000058240e30080000000170480c60101ea1860ab015b9006000000001e0a07180400000000004c0620080000000000280e401000005a1488c0910030000000034140398054b495010f01f71401c0000000000281a401000000002115018c02002023841181b9200a000314560c80da4010000598821481ac802001461cc13c01450050000004a8ea0461808000000911d005930100000001247204860180000000000540c8010025e2bc418078a00a0002187104c09a401000001c8481603880180000000032440cc01,0x981904809a00600000000942406300800000013422014601800000002609014c02000000004a160718040000000000240d20080000000188481e6010000000000310388020000000054120318040000000000340d20080000000000060640080000000190d018c0200000461a08811200600000004611026300c0000011088281c801402084821009ed10070000000000220690040000000220b023300c0000000ec4204a60180000001d044078c030000001a84e014180800000004219022300c0004a864088092802001370c4084022500500266190110084a00a00001283409023400c00000000131206600800000002e0603cc02000000338b6036180800000004c48703400400000000e8d814601000000000121c0cc01000000518e603c18080000000000e40e200a8f128c41e02ba4803800000000002c0c8010000000002a00590060000000000a4072008000000000ae01640180000000015404c803a5a4a80c780fb8a00e00000003411033300e8d9260312079e280380000000002d01880200000000005e031004000000000017032004000000ee3580d86020000000002a2c0cc0100000000423e05180400000000001c0920080000012a42805060200000024c6301e0c040000000000520590040000000048240e30080000000f022014601800000001e09018c020000c42988403d20080000000002c00b200c0000000000a80e401000c608c0ac03c9005000000003a16051804000000000885033004000000a22080d8602000000002615038c02,0x16c3a06401ea0080000000000e409200800000001d1281c6010000911502202d10040001423204405d200800000005ca8b03400400002e14c54034801800005c298a80a900300000a6320880ea006000000b4ac580d400800002d14c54054801801031a01200be90050001463104206aa00800000005221014300c00000006c1604a60180000000d028034c0300000001e0480e980600000000d884063008000000000de02640180000000003502c8020000000000420310040000000d84100a300c000000001b220660080000000003601c8020000000512481b1806000348a30a407a4010000000164a202c60180000000000a01c80200000005d2a8131806000388b30c407a40100000000000c80e4010000002047101b0c049303a40e28045d200e0002d8811c403940101260e907880bf48030000000208e4050c0300000000004a0710040000000a249022300c0000000149301c601000000000b05014c02000004047080c9180a005c8808e102bb40140000000000380a4014821c186bc08185007002123582e011d200a0000000000a40e20080000000148900c601000000002b0a038c020020634029017d200a00000081120056301000000014444054601800e41882300aed0050000072311301b20060038460883019b401400000000783814601000000001509024c020000a21883203ba0080000000220a033300c0000000000281240100000000903006cc0300000104188183180a000000410840973010000000420a818c602000000820ac0c18c05,0x942c10807200600000000f4240630081c4141065814b880360428306340df31007002842a411809a200a00000006219016300c000000cc14803c60200000001506c034c03000000003224039804000000e134406c301000051902230052802034824208b02971006b0848608681be6200e00000918a701f130140000001644202c601800000028868054c03000000007212031804000000006c4406300800003c9c46c0288018018324425c0d49005003064884281a9200a00000000a4340730080000000000580a4010000001c46101b0c040000000391880a18060000000000840e200800000012482044601800000002522038c020001a41904602ca008000000c12c406c3010000418c21b005280202c81c204b0297100690838604681be6200e00548708c102bb401400000001a8480c60100000001908c034c030000006898203618080000003505801a30100000000000680c4010000000309640d8c030000000612c81a18060001c45310c09a401000000010c240386018000731504401e900400000002910811180600000004211016300c0000108741c04880180000210e8280910030018829036015da00a00000c4521e036400c00608a10c60336802800ac0c21440d310050000000190a81a1806000010c4c0b03d400c0000000129080e601001a23044a407ed0050000000693081b180600000000c4440d3008182123048813528030303259097031a5006060c49210a0734a00c00001707237014400c00b60e51a601908028016c1c63540521005,0x2e1a07180400000000a464073008000000000088164010000000249040d8c030000000110480b180600000009241034300c0000000108700a6010012521a1c009310050000072370700a200600000000645c0a3008000000ce2d810c602000000184550218c0400000000322c0298040000002104408e30100000004609815c6020000000188b4088c0300000000322c0598040000000000540920080000001444402a6018306249105039a500600012a2a08a075a0080000000000540620080000000000881c401000001c619c07c4c05000004c190480b200600000003209016300c0000001742402660180000000000601c8020000000490580a180600000000847806300800000011c7e04c6018000000208e4098c0300000823c0500e200600000000887c0630080000000108e80e60102c32421150129900600000000220a0318040b0c86425c0c69401816310484281cd28030018b0900840dc90050000005882802c98080000000094340a30080000001247201c60180000000001502c802002842a421809a200a0c1091834409a9401818192c86b818d280303062490c5039a5006000000001a140318040051874867029740140000000001c80e4010000000001d404c803069258c3320213200c0000000e269014300c0000001442402a601800000003905018c02000000001a0c0718040000000003830330040000001c4d206c60183432c2195012990060000000391080b1806000000760e401e3010000001e27080d8602000000000011018802,0x1062104201d20080002044409c01a40120e0c0813e079a0803c0418302340f7410070020239c140126200a080c70850c072b40180000006808807c602000000000033018802000004e190501ba00600024c5210c04c401000000001c8980c60100000000310a038c0200000000001c0390040000000000240e20080003888211817680201c214d102023410060000000190880b18060028c3b043028b40140000000000780a40100000001282402cc0300000000221e0298040000004e04401630100000009008802c60200000250982402d0030000000000f00490060001d8250740cc40100000000001e01a40180000000002407480300000000005812900600000008239034300c0000000002a01840180000001c8c40d0c030000002882c04b980800000000000f0320040000006a1380d860200000000001a0148020000000001a805100600000000006c0520080000000a84a016601800000019894028c03000000002c2403980400000069104032301000000000d8900a60100000001608404cc03000000002c220298040000000002c009200c0000000006c01240180000001b024030c030000000370880598060000000064240730080000000c8120186018000001a8110050c040000000340480518060000000640b01c300c0000000d02201c6018000000000160148020000004910401c9808000005288401733014000012720e01a4602800000014864038c030010c108178099a00a00000929050192301400000014492028601800000014884030c03,0x1cc2a423814ba00a004943382503724014000000000c801640180000000019c02c8030000000220580e980600000000065013200c0000000001a80c40100000000d0a0c0d00100000000321a0398040000000620a01d300c000000ac12003260200000000170901cc020000006b86404b1808000000d50d00963010000000000ae02640180000000002a01c8020001022106201420080000004606401e30100000000c45201860180006115428007100493838204f81e68200f21070c08d03dd0401c1230a7026816bc803024320218301cad00600000000002403900409248186240a6b401800000001c8881e601000000034870078c030000000210501b980600000000d4380630080000008808807c6020000000000370188020000c8108320332008000000e4110039301000000e518802e660280000001102c054c030000007388e01c98080000000722900e300c0000001d0340166018000003944501a4c040000000791480f180600000000f4540630080000000e462018601800000003d13018c02000000001a0c0698040000000820a01d300c00000001a8501c60100000000003503880200000000005a04900400000000d4340f300800000000d0281c6010000731704302ad0040000000210c80b180600000e4421900c400c0000006c0c803c602000000001d12014c02], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((((((((0x18398db1f94facb4e3a2c853ee0da97eb46afdbd1d9d7058e5ff43972bd6607e196ab5fa53f18e7c95984ac1d64123b5aa5aadf15f361bca281003bd7b2812db7f7af14d20174d3440000604d2564eb309830a38b312471bb479c491ff990343521190359c07fe191a437221a606a5ed022c1b41bd5e74f03d831c04451d8ec8a9f66ad5f0b040f7fbf05c5c70a1f3d1ed09d02f9f34ec519055118307b01a576ad210c3196399425cbaa39f699891d2915b5dd2fab7f038c011ac1ce5db1a2020065c1d3b08660df18a00058d02baebf034050380e365d5072287411eb918ccc407a10000024220f04b2371183b06c1a4360d003b2157dd8106e118e4917c762aba4e0e6204418caeeec6aa0591a216212106118010000001176177de71d6f7acfbbb460dfda603f0cfb213506a3af414d238e378a7605cedfdddc6973f08e490a21622e0a05061c8ad6f0c11e1e6508581032ea140a054d751da4e083c010d2c2ffabf2a1cd1a735112e2c8b11b55086e3dc9101ff5401e5ca0ca9ed019510b084f6d6552cc2086f27b94bd8400e469d7e5b4fa1008500580001cc2462130550990c04e05a605f4071441e79f942506232e1bd8b0822a74838c113a81a5a341e92fae9a580eb1091105007290cf38050203e010d2c85778f6f1620bcd8da7d244062e617e65061ece7da6cb08012753bd0c10470a631934186e4ab4922003b7f5d904029020460280001a42000682434c44000dc245484644c23e265cd7d8116240fe62b12810f899a7c2025799b8b09010ff42b60603d64d8a9040087b4f62024e283e010e24276ab891a20c6651602c4f66b1356484717cbc10e04727d08204014bc89890126141f008000096922311111028098044) <<< 16000) + 0x6c020002f424405b21e0de141ee46fe0c15e7ce0171a0ce77228f24103db9b3c082e62c5838b000193fb204c103e010d24193fcb5e38c3004dacd6203840d7971bf247059bacf456b8a08010daacf684135d4dabb004010000697800702b9790a4b382041616424004824009c091c5036df0c860618026d66b1070557d8db5710828fafe4f0b200800034bc00e05a8d7db9301020b0b21200240004efcf5b8e000c41f4f2644801280e000077c82502800100891a84c8d0164660b23201f0ead5f3d73030c96e2c0e1de15c73c4041ac356e780c91c119080e132f7e93020e804223c5eafdd1c3be597fc88111be44393041c00400004d990c558d3c5e0e187abc359f1420645ca2961052d4c7ac50f069c3e338104089c4029b4440007f660ce580000075300200e90f1658fa4008c051638047d80bea45880b61bd4e3a861c223dfc5c7c2041454eb3c1104163a439033f088271d75dd594840b037d56149c1804145adb86082025d63c47e7d3569002a03400010910300500020692310990c04f46b0cb64f4e0dfaec2323416c78a0542077d611e40c00fc823f8025101e00870a0aa7541ada48a960a133eea289cad5b3fe3c2096bb8b2df002867488c9fbec984022d5e78546840001005900382504b5ae858182fce3b220b106920050060e1413583c1f34914e4919305dc51296693cf130413a70f54940050cb5db71aa99308037bca5a20d0800019a280070480789173c0305949f836783484801401600007f8c8e000076a70206832f253a3922002ae1943280c5ed4a254738400002671810212a2b4ad4040e730df78b68057c4271fae1002db182a83d1480128100128040003ec66382732fe35eaa70a06006b2fabe0a23e943ee83d202090bba759a458261867f1714e30c1842d94517803804122376c0a6e5838218a850e15440609edb55b536110cf29002e0444c703bd85a31c470a055b01f93ec5116a9979f5e68824b617a738cc4c30a528da82fc1842399f6b1388208df4bc179828e08515df4e1b60c1311fe190e99ae59002b03400010e19101a3e671432080c546a7662031cfba5f83ce1400075d26020777c5efb7b402b5c33e93d040800160a2801053cbd7ec502004ed246d07a2900250200250080007d880034190300d00066e1000df221a6220014432436332191190c08fc61290e1cc68d28683e7cb0c87550888046203e010d20d9368cb1a3513e6b893004e60f740580070febec024101f00800006a9c15c2d642950614830cf51a857f696241ef7f4a7ecdc6075bd05463f15db9a466e0a0816e3230f71e38e7f730ef67a9bd7d836a047865127fbadab443abc9819c2d5c0000bab4f4ae61ae35d313bd55c1f66ca05cc216994e228419dc4e0a84bdeb549c8002194e48be347069c78d8e74c4a555c8c14fa3a90e8a73fd8d6e9aa38c7fe1cd1eda3dd985662274b7dc284c462c568644e03d0d8607c0fefc72e4359818a801c200014b8e8e2e37c496d9a20c8199052848807f23b1310e2576c955454209bc32addd590100a162d57c284001bd2b98060b40d2c7a540834fe09b6155ec801301034408ec4fc97120e23f093db5e2f0412691627b426658405f30604abc08201a06e6e79d860ad0a5ea26df010676db21ed8886803f50766ca0810024ae5c3bafa4e279002d03c000117923001f1a0000747003c62113c27ec0e24ed59820344129d64fe3d86840000278d01c21221b26da8e09a48613c1840463ab1789a102a019d0329da4009406113020970151c610ab80b6443464039327033877d9124001f008000067122f0500016e122e01f1cc40461f91340002280223c7b28c611c77c99811c78c4e67ba10712f5770fc882573bd1400c200005b201040cef7efb2003e008e3097ad1279c3ce57a3463821e4217066002196d654200267652eca003e0100000f83a5a5282ecb3469c7fd6046825d9f2d68b00cd264298a00c2d7ed225041f00800007d122d09116028000fd480d0a8002de49158888201404c0222a0100096590181100169810039b824525b0cb2d91400ec855f76000002d904e58f15675f1b4d2d411addde5eb493d9d1b6005f61dd7abcd4c0e896745bc5c1b586c0000000000000000084e8087ae2c660598a28a11008808800000377f653f681d171edaa35d06c104ebb5c55c5c416a58b57615c877aee61ae8250960ace9edf1b2be1542d96fdaa11d81a981ba8ffaa36ffb2fb5618f135a91384c8982604c0bc362e82b48608150fde69218c5b35d668428e8b5012156a7d80670248d4b4b160cd600b7204e183c0102250191200f861dd7ce9630c4d9975e0b151e33c829621f29bb2f2440d0d0d966867061704450abcfd40e013860f80438a16fdff6c58b61b9cf30b10aff9a8f922005459013c0b7600370580700121a0098307c0200002526845b2eacf0812cfd2e604e1172bdf2d4bb784914c2a3d1d08a3ce010a7cd9b348194186dc05a114e1ec8755be456314136872bfb9ad326e7d7f1e795a99075ca2044a880cd56221187bb14affde90897314a5282ca5885fc15bc073b57fed970c9a77a19805c211e8b0e2809011d47d76b1986e4be945116575437a624a265b9411c8515c72efc88e3fe4777857bc87d4fafbc5e51349f6fa03eeb8221d2e66aa0cc622027180005322000fca488c444440a221010004da92202990f8ec8783720f44db6c022203200891a00773b793cec411a785a1d435d078c42d43bbb777a60811da8f90f3a24087ccbcdb137b8208bae28e39d9549062dbbe3bd81047861b075418)) <<< 16000) + 0xea3e4062ea995b4bbdd0cf2480180242468021909fee9641108edea8f1f810300d8bb2af7e26080d8d92b5b48102099888159630208911c4740a48241885dc791b2744061bbd56fcb771a005151babe23139e2400b80f000047264682240e9942451047a13664ca5c41e30798f0259831982037fb5b6d5279021fa0b29cedd20822f5d4257662b241895055d449af1e1904bb30020209018d9841c7fe79433c92006009091a008cfa0bb3059044229eb33db1b46080a904c7d317c102087431be9ef6a2087e8f16d7859624186f45f784253c406209034fbfef5181004dc3452d72468011ab16978b17c46c49003204c00013090004ca302c19682dd716b8c36bb5767be16018401c7b50f383a5040981b51bddc060841e867dea2804146966c345dd040118ffdab0e9c430227c31f03e618100390aa4c4ae86b94480178200370040ae0200026d20941a000c243c0c5f7d008840c002201002008000022386e478360be20c208e8882c4e48083d5d1a7f1a10481452bce364011c5cf794b38c08689e553620204140871a8cc5000d90da89f11801e7c71edd6f2d2005205005701c0e008278c77e38fde21767c4058802c7ee0500388906f3d1c52208c735e5caf018679ea59b9e0884409a0b37c038441d9b98f461020590103f01b89002802471e3a6b87b80d82c40e20818786b490c465989066e20c3783d25dffa5110887da72b84221c218a1edf3bec82042aab00047b82c00dae5bab7c5470162788fb6eae837c9002e04000011c100044f209412000699243a1a00074d24382b21b1590d06c864364301b02605f040f9fb814c0a7499689c4003e010f280681a0b03c38a2e4f54b8b86e030302715c99396028612fdd4eeeb34904022bbce44f00a09b572d3da6d0041619689e368e07803c527f20154850039afa1e47e370a448017820000090890b8288581642a0b2140510982c848164220b21001f8751649e0686e82a58611040e00438fd265668fe3ecb1019dcb61f0e812188900628753c0c30359905bbf94105b4d96b7547b5104af57b1804400e09084ae39f52e0812d15543434c468008998a7930ff1c4b2005e088e3ec50146cab921888d86f5fc0618d05292fd70413fbc766790a2092b730a5b00e092b6f2d9600408cd42c684e0e00638936cc88401435502127547200500500001fc20600a00046e241e131de0990702c834164180ba2939ff863838d8989c0048506c011100f62d7c83808a7a5d4c008850780200001006800389dd5fd27325062866571636ee62ba2d1b3cd9adcf4704eb7e8dd317ebe164125f7db0000552e486ad60bef8e0b7e2ea11278e61689777936b400129ab4ee3051b2e96c37c2deed4a0066d18c6dac62c73fea1067658b3d51a3d3359b69fae13c7e5b7db725d504b7a9277898f5d6fcb5dec8680b20680167e30062e20e857384fc6de3ebf068a2c3be3b132b59690c902040001290f14034dfff635bf0a2a5a60cd1484a79e301995bf431e4e1860144b1f13f77c80a183970103c22c516efd2936dd085881813d58df1c90a2020a08a35a148d82045a2dacbda46ba1fa3f200660a8c240000927c01220512032e25071c73fa875b71210158348cce111000008e620010437a76f6800901fa1b2babc4002d22fe20cf322000a008000038e482c0765f34fe69c1371888e0414dbaee26fa0382174a6bc9c6a88c156b7f5039cd0c375321a77a18e058a02ce9f7e48141c2001dfb81de3384860db2dd3c00fd0a1a0e2eac4821b14e129200640a0eac1c4b4000000075106a204df01eaa0f89a51042a2a429e108094000060000401a0002167096c73365d11ee2034da1c7c1f968894126448d954819bd239249410780200001ea400125cd158f2c6393b8c5102a3b4ce4a5a80a14aceb1b38030a7381d44afac28ae061645a56c50850ed55c874c7860ab7a0928e42063d434af4838282a3ce544373b9504801601c3c909eabb8a38f25df26b9410d697bbb12165fd28741422cbc81032800f80400003e0d158bc149b24f0a202d59abf8212028422956bd801850d90486299628bbae50530f80a10adec8dc5be1e1828cc81de7414321c701a89222062dc22f2546288120056068f245c42b460e3d72958a05042a5bf4c2485eef09420508cf07aa34a003e0100000f8200065c412824000d2c482807d58389680000000ea20d4409be03d541f12071c72461823c13810800000070280200d00011520603200111f2002e1640072349048e88203400409c400d36c90394fab0712d00000001d441a88137c07aa83e260a304502302082600000a6b5084da6e2ac420794f897fd4080751571a3d8a0e421b063f0424000000008085ac3677b0c400fbab0712d00000001d441a88137c07aa83e451058e68c588584082380202172001006c18fc1090000000020216b0d9dec31003eeac1c4b4000000075106a204df01eaa0f91c49819018610411001fe51945c6696231e6b7b8e9df3d05ba7cf878812bcb26805fadd560feadf142ac56855618951eac18fc1090000000020216b0d9dec31003eeac1c4b4000000075106a204df01eaa0f91851a31a21220208c011c1686cd8532ab237901aa18e7a1cc61c16e072b19cab3dd1d1a0f05a683c103e998523c74be3841638c6147be460e00002b73a84001a3034fa461271ab46893517533abcef5122015cb9ddaf894c0821ccdb7301b3e002000159bc1fd146e000483543459dd2f003e84808143605400012710004ef240c2a0007b321f01200097920f85a0a41d07b068814040017)) <<< 16000) + 0x0246a8644080a004f3a23de23911bb2de3b30181a3f879f08040459988ea00200e2c31a49105006d8a7f7ec0c0134e5edf142007176172bb454013da016c724406f91bf2c080e6fec3fae8363a81300e00008789018ae473d2d63ec389635c51d470553d14061801b81c23d0401597ccb20884a383e0102020990084c800174a86ede899c0b322512df4e502d2f4fa9ade0f3b923d40598f005a7c89e75d6467fb2a0d395d91d88c05a5ac3d32882051442022010c103beec319ef4cef7e5641088614eb204d9eb52eb6f83d835e73f2bf1932260c62d38ae72fcaaf7fe6ca608c216a4d51ff018ff00f0a4726909250edf6cf6c8b10161c08d142316fe85f302e6a953ca380c3933658098307c021e54dd95bef1438d6118a5942044c05f218114719ee19601bf1bfc11403a8b9fa0840247c8a9a8338610004000056ceb086775fb09f2f1a4f40aadd7652f20a816459248c30a5064865825800486015488107923a645a3d3930ce57ecf1510e20a81e500019f21b82200046e23fa2a1fc050fd80800207c8fd16e470f1b045e389415a5e9440c6a13b80140c6cd597830075f3e4c25005f01c37805098707c0203f2131f8098fb82e88838f0f0240b4740cee45106655c679610abc66b91c20462ae9a6020ed0c46c7003eda08400a138e0f804246dbe7f8f7776872cfcfea5ebededd99efd7660648302413b61867832ff055c2e41d775756460d4fa3570314888aad2af26016d0e7dbfcc192133b6d51207388ca42c50a19ee1f852d59fd00de1450aea35306f87dcb34a282e490b556d6c34d5a3983b4f42e9967e5ca17208458dc07d8063ea03d2d10aa2f9964303b76542054b2caa6c6859853d8308020351490812860f80438b5831ca8d34b1245643438575612c17342430c6fe32c08c064f8b0c0135129b3080175ce9490670c200080000ad9d425307d3ca02f18c63c8e4dc7125a7f32f0c8ee2b8dda664d8b93e2c62f20000000000000000004179a51af731d02ccc28a1c718c04c000000f00815ec609a772ebb49f440ace7045b3e1d6ffea4ec9dc16a2853d570d908898adee075a847c556bda0174c682c218453d00035820801a0005fc200137a47d0541f012000b5e23e63a000cfe20ac4b0fa118d502f5aa003acbb80bc6318f239371c4969fccbc323b8ae376999362e4f8b18bc800000000000000000105e6946bdcc740b7560e25a01e2d16bab0712e27204b7307d0c1c91c710608c0030edf1edea3420854f7828736b854ab4c223ab1ead0da06feb4ff3eb36f9a5ce0400a930e8943d288446d716234554bc0f680c96cd59f14a0f8aa162e6c5d4b3f0e2b642afbb020dc231c922f8ec55749c1cc40883195ddd8d540b7560e25a00000003a88351026f80f5507cc91c710a0860820870011c99c52d78fe2ee75d9fb6d3e03374d1033ec85dc20083c1f3839922a87b9afd42b63d55024683d8a2888aa05c1a00030d39dc3526adc116049dafd00a82423919b2d81697a7d4d6f079dc91ea02cc7802d3e44f3aeb233fd95069caec8ec4602d2d61e99631030c18a0820840026132900e48266adb6e71a2419db5c07bda746394192d9889b210098958754d4eedb34a2887eef4c31da54731418e96758b314aaa3e43b00039921766a1f1250f8008002dc08f786e44a58d73dd0308779cc0cc0404fed8826c1002cd22211c14031609d49810045eb29a684511f2d1428817a7510d49406c4b1c0e700cbfae942319208c0400003da4098943dc1203e0500126990a451ebd694baa8e05a5e9f535bc1e77247a80b31e00b4f913cebac8cff6541a72bb23b1180b4b587a43842041023000808aa82f6b98490d276cbad70527c729b3baf63c7d231f0f5b99200378cd11a0f52e95a20cde723dd72581b767dda3db9c55e8cb0a546577363c36ed121c8c812fcfe95b68d9bf0c00857d8c0a97ffe23f0bc7392aabab80c32de8c22b05912940011b4e04d065116e86020231c314bb7cc0c10c2df83b40e0c000efabdf6740502828b5ba16cc2001ef56164a645540d932e1369528a280d550cd5b9e879be991215b0020dbe3321681800008e48f6b087b0e63d6521ea2985210c7a4263d00a1e70140c1a93d08f040c15adf507889828449d25bbe8510089ee417f66a4004c181261d68e031288ccbade2803d76b52b6b8a8222881bd2f43733c80ebe67cb351729d40a8091850105b2b67c50e1af3e2c90123031b2383c8484124afa46814091556a928450167e56b0690a000000232c800d1d74b6f20b18f6f99500c9c9098051a500016157e5143cb5130d1641b7ca82d251012b2d252163d25fbb93450e2f7f91df8e08000f84d600813901100422f233e2517828113a9d7cf59dec31003e8eae0b1c74805b4eb12ee92c816650e38a3821824803803d785e65359b74253e2a231b0590e54e70213b19da469a13b852692863ca518820067a0004aa4000f8c8a900e464ec6e7b14b49165514ecd8d3205073f489bd8050c00001484a020103a88dbd6603042a2c42fbb00412b6b647c0103000c580736bb08017fb1cb7ebc50110a84961501200008908d902c6c417428ed3f86af0f245c91e1a711fa40a39425f961b080803d7afaf32160994cd52609218104875a1779e40007e8851893060021f6e5b69b0200678413ec0814005087126056058a1490332e9fcd49161eccb5f9858814240b75a07a461005baf46af1480843a0a7585d4b04a163c5cdfa02005822449032c5000395010974810b04e69c2dd82fd39816016000088880208c00120c8539ac290961)) <<< 16000) + 0x442b0a001d926ac142756246a72ebbc88922fedce049645102ef732320584177b81a601020eab89c4410011473cc330300c0c9da968aa00b0b28f1084400c4201280a2459aba52a8fcd0c20325cb0a5048408332f9714c9a0822402cb6214a14012e2b320c2b080038e8d4c90b8000d6043b11c0c22008f12c4980680400a507402d030000103906b15f182efccf2495e9b9538dcd605c7c8812da462bbe245aa6e5f1759b85e0ca0c848083803eb579f720cb93b4cc060800c4bc68143adc02158aaa0267850104d9524c6d8ccf20e39bcfd6fe4441110a2844cb6386d06a37b382edf088002cbefbfe72c7f6175630e9ba1f239c3e4383ac6f66048c2a4360960000ef4800400100156923cc7ba20741795929b24803e83dce21082031575beb002460419de491d0a10d265bef6e8143067889fd3609064af5b10244100045058f0800322020a808164aaae9532c1c7054eef99c58a7ebc574e4a14514925768c205b0a4eb02829b7f40a2a08009aefbada700230086b0a5efbc6b2e2b7947e28313ab5ddfed65ba76e6fe30000000000000000ec4c24b24b14a14610a087084070000200d00017b23c002000315323843d59424cc07090e5eb2329ec490c406ba20707d0f9af1c25d1021e7587978c006280b513127cc400706d4344c8266a0404f143aec80bd0901830d41400003e84794263c8031e301e7203165cfe47ebc49d31ea7a01109851631431629428e18e9c1b6840ec66c8053286845dce564ce0ccbc5c5b3856621461127ec3d9e2e6d4ac10c0235d2f04843e5430a696755e58c1e7469e38d2c7302e8ce24c197527e4f92c6705bd588c100523c8e7d9c0088021a680c3de876806150a76814766904122abefa15860ecb609dc90a163aa80eeebf7660c3a9095e3e196311120638ac0482028f5cbc670a0869d7a005b7379002a02400010711e2010001d09ce4062cb9fc8fd7893a63d4f4022130a2c62862c52851c3344e86f2b85c74cedb34ba08b7c39f3eb883878393a3654428c224fd87b3c5cda958218046ba5d429f2cbe61501a3220f183c14ab06d258eb2747874983325ffdbea58cbd03a08002009c528e913801100434d070e4ebecf0c2a3c949f9bf32081eceec442c0c1d30e8c863b82c76cca0f9db84c18c0c15a17652c613bb1305bf0904051eb978ce1410606774aea66f2005404800020e23c4020003a12000b464784279c80c5973f91faf1274c7a9e8044259251050a48a50848988afe2d88efab02d367abfc56d7c59edb6e653abd51057845533787acede3cc75b062f08974b967d53754c2a53a56c6e307674f62b68b1def15eedf3067069042ccb193097c74b080127e16e2e7002200869a196938c15034a03da344c141857236b2a9208d2003fb906bb24104cdc003ede3074ed9dde3d5163e3ae3ad25ccc199de036146c58c00002ad344ea900290200001021d2e5b8df09730a939569338c1dca2e82a92c7747d8a7e8c1992a11f7d2c653b60ff8c2004bb259519c0088021a685577e3ed446152c5df745451040d971f42a9460e7adc1ef4dd163bdb8be3555860c7078221799163061825f2794484028f5cbc670a1012089dd421379002a024000107100038c23c00a00073e212202000951204c130014f723be421de0de7203165cfe47ebc49d31ea7a01109441221021219018a10401d730302b840d8036c97f48b518680288a5e6f444e34287001ee6f87ab285ab57e2f84ea2455121c867d0b2448bc0ef6119c200039e806015704012617a7f852fa100058058a1d157f010de0619b4e1637e98a177a20eb49d8917750ba5fb44913735b6550c080a77cf59e7607040b89dfb43c20453199abc90700055efddd0b62400a00800003f644480400082a415c359c80c5973f91faf1274c7a9e804425104884084864062841009d730302b860d8036c966dcf924ca227a5f6a09287253c1f28ca16706f524b245537a148c491218c7d716200016fafd5410053f88d616804220085100c678b29d8a1e73fc281bc10381a5746f481862a3c55679648b291fa78898a11caa03f9d312204f066746c2814e1d31b46c650084e0300001bf222402000382200095041f0243ba0b04b010ee00876c040014f44768b43b25a1c82d0ec16875ca43ac3a1d51d0ea08874c243a4021d10100140891d05d8522cc73d3639c9b1cd3d8e61cc72c66394331c9198538ce040d164199ef8ce4a308c9c9bd3cd4c180c510a85c46e95ef5fb081808f3a13609dccb200380d672273f29902810a6a48c364dfb502005eb4d0b439c0112002379bd852aef4a444004104014b04a210ed1f69021de8ec03bc1d83407200545050bf2a10121f1d692041a004401004010000044471c2638c0b1c5018e200c70c063840380600802070406380031bf01e0245ca6323038553d26012101c0040df00e01802008d1c1577425a201c16d7cd380b66e11ae046183e0100000a8237a120000fa200034446f044000466643123a2cf3e6db0cb66139925b5c4621b67911387579a0820add697dc231f2f899bb67c02684e3bb01078680804475bb591c3b2b821ec355e07aad45aaf5f066e35668189c6525033e4685d4d0d0067b2922251bf4702b3608016867fdb910ec4f1df8ade64b079b039ece9aabb580830405ad8fe9c8db0efc6af8f7621c993db44b56c76099f4cf05d64e1d3fd4a7dd12d9a201d07e524a52200002699bbc929ec00002d9099b1386b704da9ec60881616424000000b64266c4e1ad8d703e248222424fe15b1bbe92e3185dd49d10b20078c81c90)) <<< 16000) + 0xc50c804304100383ef06870ebcd84c29bb3732601bf4e8156cdd74558d82903b468c805f783a17edde5f522d825f462ce42e8761cba27a8dd86e1b765101707abece72c78ab3c01b564ba08c6b89965839ecae91ebda9dae39ecae91c2122c82072061430c134024004fbe00b3658da84fb52601f28d42e35c16bf743645a8b44c19d538a6987b73954176efbd521714a12168dd0086e404370020003062182420006c0236e2b15205c849fc2b6377d25c630bba93a216400f0d7132cb073d95d23d7b53b5c73d95d23842458a3084025802001000a0200334d89df298c02ee873f81e41b34ed371a7d0c0d3f2e06eac733e2ffe4a371ae57da510484a4e7b940a826b917152644996753d1ed5f25a58634a020e8001ac11b6398da94c6d0a61b8331b3198020686c826362131b0098d782c6b817438d8e422d46ced30f0cf59ae9899a21ac22f799e148d029ecc59c2f094219b642b4da898e1c04c943185b0c1942d8382b7eca7746c4d99a68f9a0d268f78a8c4c8057c6f8867613200603c0ce5409f06534139b07e9b808147db08aa2d9f226cb2766159c413f8c145e9b523fa7e5279d3249593499e7a9fda437610c50d0250f199b73b23206765d6130d14c6b6ea120574124ffc805a7cf17c30090e5d2b8b0052410b100509c807802123d8216f0248d18852651211ce84f862032113ca000920a0f00406b417e38a8470c1097e97c32d105bfc02850e4abd16248fa7fb94be35313227141be3fb04e336f659872475c9dd4c8831d3cbe164453283056a5d543fe1c00a0f7da63f3d2e988cd597d68e205546704198f5d78f68aaeb89e551a4d7c6c3915dbeb6fa50c6a13401800fcc03d8ffb2044c3e68ad20848eb03c48331cdd04081f21c2ff832860e8043cc0a2922d88102021da4cf10b43e81fa415116863c540bd0b94a04010f521ce0198307c02000025240008e081706800169c8a3888001afcf0b27493ffa9e45e482553cef5e96e618210be52fed54593debbc9d00afa8b850406b1a4412025fd0032990128c4c81a01f266ef4479f48b6eca9ca268a2602800a0ae3b6d11747d4662b5f1aaf220036f413b0420a8b5cbc31657c8a7e409a5010ceaff218383f2d4e8de52c49c23b52101e17144b8d428c390a806b0041b8021ab0100020c1000c6434387605cb009a0d12bc577dd4ee8508274c3efb2e63423b76b9543d6200c8809dd5e1b50014390026b41e01d192c8a95e8548f501d8a900131b8a9aa82ed2f1890b40e1a30a2886f9063270d12d0a50c1893551aa3de9b99ed4f4ae40c2dcb4675cc86a8409c2e80c1da94cdb971123fef5e08e1600c1c277382b8b1b0cc7bac01de1a96fdc275bd3dea957062ddd2bfa0ea2e51c550dc44718c8502e3471610eb1a34507114b731c4083305a91028e8273fe080089d2275009840800203540bd2802ea3460d1c3fae9984d14083bc2e071019f1865c40ae9217ea1000e069cfe000985080020000266451c3400055479842d8839530f24e472991607fd27ee6e9348ceb362a83800000000000000007eb6f101367720591c29829821a01000a00600090f11ddd7c997634173731b78a7ca0c94b4f98207b707ea39fde70efd4365ea2f9b02f46adb7d721c82a08da0005f240021dc8d48cc002b0cc28c3ad87bc03f37cce0121461d6c3de01f9be670072819a0c8259f66eb25502940cd06412cfb37592a808aa248c606486782182780124c66bdf2d15b75584a4ad309022b23dbd16ef2feed694a4fb4c42d55ee0eb09ded4778c39b66b2f8267c4e3f3e21457c98d01714393578918e80df83ef1cac46f9084831d2922a2718fc1ed544890149b8559a7bb8bcd7caa6ecc051ec1937cab631febd9931068165703fbee9187efa1ab4f5f83476c7a5dabf501ec9e4eb04f4f703c13d5e63b80f054196b7b058a9bda4db19a4254bc332a255ade726d1b9da469319d04f5a00c13fb3fb41315a8e7622f54c5dc7d7223049c9eb84c15f463f27a0edb4dc80116ddc77e5294cab1c9d81356ed14c23509fb01f43acdb7d98dd2df796de1320131e16cbdeba10f7cdc2eb9b75e16127311e3dc55e684ff1ca081c3e536b2a79168c2daa314f57c2c75017990d40b65abb64bbdb73b45d844aba0023b817d95ad83eab5f606f1e532943a3e6a968a339cc4e6525c9c6d7283b556e0b011a68a38908887fe0132cfc3ee41b2373237352703a01907719e0001e9082b90c6a06606002000cfb3617792f9aa204732ff4b8a083004afe103cde092f080397fecee08128c0f004069c3634c1bbd3bb63f7b00b7dabc1bbcfe02c1211c8cd96c0b851875b0f7807e6f99c02428c3ad87bc03f37cce00e503341904b3ecdd64aa052819a0c8259f66eb255011550808608204a0020012c3e57292eb68793c9ce0931bc3e7d9522261120601e4665bb34fbd0beb71b8dc93c4ac248a5f1f6c83429e229053d062bfc4911294ba1a00735453c8d8a1a402057010d28080011c88159080a804348031a30180030511a2398d094c680a633e430171d8cf0ec33c1633a03a0829d17145814355a2928000cc281011860e8042406def149396d0dfcd4a81897fe7bc0bd9db8bf67be61cd6b05f03a82ceab8f6ad615a0c343ab9ce60d0096275aeb0ed242faf5a2671a21f5702e4f089b1418ae17e34e559c272b5c88c0e73caf77cbfb1b0978bb1be80d92ca5cd67d1857aaf499f5ae0d3dfffc967e0b4d9f57b07950eda5c086cee3025157b43b5b9e2ce72d8e227e695211a9814d2b549e233296aab6b504bc1f8e3cc61136cfa72f02)) <<< 16000) + 0x053d488401004010000044456014000aca4670463361300405c021dc258a818411c527ac20a5ea3f3e1a096ba76d01c00a18de8e2801f7bf53430136ac3e4004e203e01019a090cc8286600400032c40987432e2b19601436eca20b83d5f67aa0e035b9eb1399e084a1b8caf957907f0d5b540155baeca5e41502e1461d6c3de01f9be670090a30eb61ef00fcdf33803940cd06412cfb37592a814a0668320967d9bac9540455434c28714414140006b36b7d73d6299ece332aba857760b69e609124e14f59509276fa654e2dd3cd1aaf5af5e8459f3dc081f65a5043e6a8a864795b459c53d7eab2cb47e32c61a252008dbcb925ed6a280f46b554fd4a4ed1fba50372077e2ecd12c761a618ab0b434c0b8184a0cd8d871663f47dba834353413939c002048e256efbac75eeb56a1d7cbf852ce36a02046c7be3cbacd0f0aece2b86a41cec3fe01c06a50ba20d0bf7ff1425dee97399d510fc00104d17115c09def5f926b218ad6f98eddc1d83da08466f7c418b7b28ca14420c671a50430c576287345c094230a9bf6df68c04d7df0ff040818a94100419e7af294013080f80400004ac8ca82e12e89900c247eeee3a3854d9324f546ba8c0541ae78bf00000000000000003da17da0ac98364db7ede95516fd32b1ca285181dbb260d77b2000000000000000000000000000000000000000000000000018938c035baeca5e41502d0614810610408e000d2e9566384662892c5f54ed3cf5a2998a5816a76b26a4d5ff359ab0544b79a9d906b24dfe194f4387716c5afeea968d746b86ffd5bc66114cb00f1704326921e6c3329b43d91a3c408630bf296e107f66eca983edbdacd5116853ad9021984828b1436f79e48a195d07fed0c39b26248812040f80438b3b80936c718a12405e0c360981a7820429f79834004fc04f98c025023ce208065c7c14427081e0080000a591940900012611470d00043b91931d86e02f8af9bf4ce4036f9339b900e80bc6451017762af2780926667a0c065e24bacc003a010e2c72fc5a6a0c759f31f1c613e8fb80c3136ea348b0ea92d850081419859998007402000022e408c1514022561f89c5868e1b894011ced6d22383663b3a7d100fff35ad82047fbe23d26041f00844b0502790ce2c1958b181c64d1f5a80b0e6d4f35b4010aea8d48b043a7a00926041e008000090100026122b61be312b467cc9061c7dafc0a189b0b3a84839041a959e02bc0e340012880f00400003e88c9068644343200a03a0100032b90014652003394463c7631c3318d158920286300705a5853a710082c2a1c66004db4db280018e160d40050507801104c0bdd00380204087d28011417e626083800880200802000008881302e0902da4cc7009bb0050500485286246083801080200802000008882b84c0003b08c286800081c8c20cc62c363061b1820d82002f061bea0ec861025c98801012046324846103c010c0c0cb969f061f0fab01c0c0a4c0ee6e11840f80400002988bb06c628163120b17505c01bd1b5d54c052a048fc04179f14190e0061c9b0908066d9b37800945078021c2a79d90d483c5bcff4707fe004f409860d802385097b385ce0ce043567580d68f60853010fbe3ed0240c1e0080000679a8c8d2c96834292b2bfc800478fa688023101d008000052900024523102a00037322fa3217c090c3808001610e823ac5777440931a82b9a0380afe00008c5074021e0431164c08840d80228ba235ff640002ac99d8001f9c6cee6003a008800008020000088d8410815f3841306c83b81020088fe8ca006131b531408328f2300030efc03826041e00800009010002123008010040c30080000dc8c2868000b7c8c20cc60c363041b04005d90abeec083708c7248be3b155d27073102206100d1b7d91011b7d90fa8236ebce02f3e4c1f851875b0f7807e6f99c02428c3ad87bc03f37cce00e503341904b3ecdd64aa052819a0c8259f66eb255011550605100d007000000c794d8c8a239d0177305cbfba45e19de8a84004d7e4523b527d0b7a3bd1470a9f841b83decb435c053eac3cbd35a83b16ee5b9c6e09710ef6093b727aaf94f3a45acedfb7bd8665df60c97b51d3946ec880218464101284af439c0002bd70c403b5a912b2000e804260875fe1910184cece11000d80400001c081302a445bc268080016cad80a03919fc2c600360108000080200000888020080003a08c086c600162fe0b88a1a5a7910c8e1408472b526121839208531e1c32c45b0350c38401d23bbd545080feaa7b03a20131e943fb630010378eeb443807a98bddafc00238266f02b0010ea14270240bf088000918800284117d190be068002a6483e0ec003af4f9243601293c63c666691223978849ce0958f7fdc105661441a480516a3c01e066fd6f0409c3074021e30446ca2b569f90307c7801377fe9220396343309128c2066e47c12f1f9e19365106cf60b1e10112c4564fd31a10c26ee904f1a0610253f0c0238d0414ea84c48380006085807863ab1101472a506180240000a3cc0677f2b329c1666ffd1c6023e1f06d1c0060658e46805b6e9d68600270de48013080f0040000494f9254132a93c631756bb92240c28b09202ff78f7c7811bb49d2094207402103060b11d058822d80f40c22e5848427864e10620081ae61a93618707ffa9204108ead1f413840f004000052cc06a393e4138295770c11810e850008d00c6b5b4c0503074010000194451c340006a445ec662f41b1790d86e02e5e9f535bc1e77247a80b31e00b4f913cebac8cff6541a)) <<< 16000) + 0x72bb23b1180b4b587a248648438420470280060030000000064700401b1200d98090122993766464410e167a963030b5acc85300cfad725080085b61f998007c021334126d51144d06532e45120169f2753460879274080838dfde9181c59ccb666001e00800008f1b1a078e1bd9334084f20e22589036f875881996f9669032b45604d301fb05f6f4c003e010b1a48ccf5dcd1c28203e8240d92f9a698c007c020000146400078881304bc600a1253648a015b8d1c6067937d282000840aeb390007c021e3017c1bfe303fdfd26144003c01000007532309b6f3ee9e08247c6734409e6c41ff1800f80405e00400017045dc1400048a45d8462ea0be281746bcac4726ca03102e6cafabfd4728403cab3ba0b67325062c1955dbb8568880d044d9a3a450be8c12c4a5cfd23976e1813ad897012c4dfe801bb8ac8a154636c003c89933595b40c00569ab592206e0d015a0d0ac848000b188004ed1174190b9868002ef08b90ec5c4040029e470a00ab5791ef7a134545802b69ec23d7456cce310f2821a29681595fd4e0bb379ee76e488f863ad27408644086203b9b06545244e8631775a1e2f885ca0deac52800b977dd0865f73542958e6c8d9f1e9adf0fa4ebf04af3ed60803bc272e9bd71aa1196600be02d2d74640df83dcac781a0e91b845391aaa797db6b5614ed82f40ffec5a37f488de65ea18606948392424a020858637a82583147870261a495e6a59fec37f6e0e962a31000df2148ca2bc1fd296b2055965c107bbc548f51c8e263cde0cb77c545031a104fd6c81edd66a233a1430d253c8ca56c9f83f5b79417a86c8ca4681a8851f70d309d2680e2d45a1270fc0610cf087d7dc9962c3840581087c7d4e4ae939b74a4476a27c3df584cf9c79c8f0393e6e568e5a0d5c016ea4cce18e47e633afd8ecb2bb8e6eb15b91f55e216bc0a01512f405978f9b7dbad39cec6ec0dc5d37a289d0db378bb09dd3af63f96984ecd4600cc1bb4d4702af22159efbbc9c184d245f121d316b17f079bf49617a0eca2541fcb6665478875f3ba644e45b3be8cad3eca3e770c23105e9bc59d9862d76f1fbd69077c63348c40b104bf67e2d53f12f015094c827343dc753240e0c71fb42f58c08e33b8e9d09b29b292bf5bbb4d53b34186b1f15bd25831a65f38f9e62c33c73d6891711d47ee15cc48748b3950c2abdbd1222e193b7323e96f3242deb619916a3132abebb2ab4f745ca60664c0cb4c87f712c30582530196d837705e03462eb0210a49e6c5d0a339cd03568334acd61eba2f10d620de5bc7a822c0b0fb08061f65d8a8a7834e3fe260be4bafe9e1c0b0da282f244c75bc5b35664a731af9559bd74e73b63016936eacee92d7daff379c518ff4add01d0f6e4e17669a6e4ea65842fe268862ccfd9dd3c20cd69d503eedbc2fc2e95dc7de32214ba5233f2621995002661e0abec6ffb64eb3a26088638c36998a02e00316d01e08130e3972c083ebc29004840740102de1a00008f200127e45b0542d6120011eb34e70ba68e881761e3b64d79337ed95ad8e0abab0712d00f168b5d583897139025b983f0a30eb61ef00fcdf33804851875b0f7807e6f99c01ca0668320967d9bac9540a503341904b3ecdd64aa022aa141140a20140038b8f479d683de3a96decd1722626f8c22abdf31a027db9310df374b2c34ba50d6d54d98f6a5b9276c13e729d77f002916175082e6fcabf1d4dade83695e607f3c4fa501d98f3a990c2059123a4095d859d07de89259b10849845b5dde8f0bd1709ff01165ac0e67c3405e634eba28f5e3fffa56849b4210a12496431a54b179610a66f618c02622af44580113fbcc0424141d008406f1f41fdcd105fa99b52c415fdd2ec23081e0080b700c5b4074a9e46255ac279dd18e680ad62826b4d5d017879e05a8e4131791dc456606635971b0979e52ae925000000000000000000000000000000000000000000002ba36fb220236fb21f5046dd79c05e7c983e870c5884067805807d8aaf9ab4edaf9c7b50b08c397a72efc63995daa40ebbce499f74ca34175dab85fd19ed0f68a42183f935478462df75d97428f85a17504adff6616e2e685ef02f4e9cf8f0b2ce26936e20b1fb1444fd24a000a9840018d48b60885ac24000e9242ec66001bf845a884030221690180127f9168390b386801488c8b324c594e62c843a101f58be208056a26995cf2641aa044243880827e405c736dbd9a0318deacde7a31af74b041883ff66d2c8098f885f356355a4b9608f02c2393ed81cd9fb51c992e1078655ddbd0a002b2fd0679aee16803946c834378741d0c1ac580020cc7a87d35912d65f98f099408403dd27547746b194fb4741032cc7011de82041a5551cca5ff2cfbd523bbe520841986286ac67b995a8aa68432e4e5ef96b31b9705ac055b06000000000000000078f34a35ee63a05ba021eb8b19816669858e6047005800112a80b76f5015cd93035c04973bb25238a4a91529257c6ebca5fc030b83d4c8b974b959e311251d300fc13f06a14741a852a7769fa902682c5b40bd4c2de653085f8959452f49fbc0d201f1b8e02425e7ef1000e804267855e3064f143f40a78703bb317ef8c007402000013a7c93afd1db8c141b8e9142443421e330e0200de3159000780202c6020000de22c41316101e0c1c3d3479420f69b88c3095ddcc42901af6874687019eb3f2392000e9bd84213080f00400004948001c71160110af848001ef481c92c578660701b1150150712245234e42abe0358d108f6a9ceed2b90053b62daaba1012c6963)) <<< 16000) + 0x7d9b8c6c293750484a4aaeca8b7790b7556d849e27cdcd115f8a08291e00ce9a18a97257621b8615724eaaa63d71e6b34fd7b6ae0dc1d4c43c67f20ef63c6cb9fa433fe5770047983ce52b2e8f86fa120145a1eafab3df95d248fe775ff6a9f39f059f77f0afd0fbce560e6a403d7d9d8e8ed6e82ce91c2f6f1d16d588da5127bbd7b017930011316e7516af48bbc2b1b1e39affd4f4bacfac19357fb7d9a1b25eaffb89e34fc0095827adfa0048c10427059d0051e691940b9ec41702a31c3947e7c74c9dc834353eae773d5a4c4b70be75fa161d67f5543197957bda7ef4dbd8c022c2e82baeed342e964250a041680ae8a5bafe4bf8c48deec9654eeab2514eff8d3355c53e1263f11105680275b6c56c802ed7b678e130b7ca45a3fed4495f196d1b0a3c484ec2e7d9620277cf720b0c068487ba5060ab2cb402c015b87e7f80081292108043c728679d2506a12cfce09040e00220ce8166f95fb65aec8c05e4ebca355c6d6990563dc8e474317d02fe66ac99bdd07378b7bc287a3c02d1a5e7c45e0ff018c1e85f12422a46f320963373816c6b65a3b23da7f23954d78144f367f7e1033184ef4896dfdd68611493552f106a455f785e0c291759010cc90eb06ff959663c84e9914a14efc373aa31ca3fc4427936dee59c901ab6812dc30d7d1303ad70f05584a040265a2092f44800026b9c1490051b144085497ad40038285d220230c1e0080000529d02622ed82010880e80400001488ad88c56427a341119da183089ab799609e807840013141c00468ccd05a286813c01840004850700100000f4457444000298456054001072455c340012fa62a368988265c765fbd3814c50d58cf732b5154d0865c9cbdf2d66372e0b580ab60c0000000000000000f1e6946bdcc740b851875b0f7807e6f99c02428c3ad87bc03f37cce00e503341904b3ecdd64aa052819a0c8259f66eb25501155090ca09000b00900004a0e27d9cae5d973493999be50d914eda9fa3bb579df03ff9d949c71f96925c7e2bff468c30e486c83d5859c32083808bf673903642332553dd4f2160c78086ffabb08e17e631da29039c0f984e33ed6fe611f980b13391d6b33a96b82ab6c4261813682840f5942cc2c314ad5aaf1033ad07a283c0c6af665d300016de41000102624200086193b6982120aff925168807f947ce23041d0084010040100000446209a4d5dc094fa254cb272c37ce7bba3f901097c65293cf40ae58b2fbd03fc1a5ce0418a813050728fdad84c802a560f7b8b397d6d5f107210e72e715390c7766a0d4705fa08e4990282afb810b609db2043a662a23fe6c51e028f877dccd5e35e1e76e3b97442050df953422267e3e5fb85ea04fe1ea2f02ba9bbf63d4ad37203040af6e7adc52ae2c29015d0f6dcda3665642179a36509e3af10096976b875bae165e4cabc7dd19e30be075d9edf57528717d3985bce50c44ca4ae22ed88f98b94629834708df4ba1120814ef8810ccc9112679b3e4c612ac9d00006da31029fe6c3411081d0040ae02800018cf1a3c4cc9d900c0a6869d4c0038e2266c6000ef77ce8424102000800006c1c193191de430b7b758ce304240b1811023074b67cd0244cea181800d57add1026141d008000090915b15e0c0eaea18c81982b96df0c2cbc758b430400940b4a582148d01a8025101f008710f5dfe8060cdaa427a608f51e92c408aa1eb16681b560ce618143e38c8013080e00400004648ad068564240004bc456054001a3c455c34001d12400532080144411563105212855496236321540909584854c04006b9e402ac188a90ce016eab1914028255c337100405c13a66a8060c66ad6b702408b3789740301651b54281100410021622dc023cfaf91c8819008c061426f52ca73921030029170c111744e1a8a1362b52c90a01668415408009eef38f840211b55638200973c812220080141a100043440d664bc0e2c7db5b3b48c5ab7ef5251af5389162585091a089b8f38bf8e7394c3713cfb3c3a0447db98823060861ff55b6911e11c28e2e1159b22c55a8ff1b6ca3a0a120332b549c273e13b633aa3ac7f39ddc273bfda01810208d252912102933efa57b39ae5527097faf76ac788000137b6ca8e7781c6a41318fae42dc2a788ef448e398852d808362b74b7d893066b0e4d4f20a33baed31a6c0165e4c8db7dd270968237a1aa4e1f2b04d0a694e44000058e22a232150190003b71057410a79e8538f429a6214c2d0a592809894001382403915c853acc290e61444b0a001d8547eecc4ba604ce68623dedb80a9612163cbe42af868d762c512690d24a94180f8aff6ddd821c2f670783ec53ff320aa008204876ea416582bff54d42f2e8c6940203961668bd28026b7b085445151332bc6e5fe108014356d4c3777da9c029dd451abaf746292f62c0e0d06f50435f82fbf83397b6ddb696fc5920472f12db4ed32e2fa4e22c36c7214c436eca23126df1ce9658bedec55e1dc88111cc21a45abca78574a31c8d8a57f739a9c5519921639dc160000000000000000080b6f101367720599a20821400e00c00a020a049a502312c76b35a7ebd68501d7662e5be3e2866c4b29cf4ec487b326add02004cf255bf89e1d75afe186bdfb1f8efb441fa71d0ebd699c575c2ec89dc69514a018a480ececa4268ad2110d92a98d8bfdca4837e5199990c9ba962500000000000000000800c201add7652f20a8170a30eb61ef00fcdf33804851875b0f7807e6f99c01ca0668320967d9bac9540a503341904b3ecdd64aa022aa0e39222001a01600)) <<< 16000) + 0x21cc35718ca7ba09fbc08bb7e979272b418d5a55fb3b4607f151df0a5e8e0a1a0a38880bdcbb08b744ccccdb00547ded34d0d9df43c318d84ffcaeda0f80362fd5e9c7366cdda2dbeab6863e28bef12c84833dc0aa94ac2796cb98959d3aa0027d4a208d0037e3b99804c407c01165e074075ca0612b3834061e2dbbdda6846dee5e0005040780100001a0424417456215c4ac984be44a1e9810d85ba9a602a0af5d11c016e516185001a45ed58004c303c010000129365c58dc2bb28006af27871a0022aa3ce811861000420180200800002234545236d772611431c2cc981026e9b409c0030eb9f7004820400100000d922902214711000103100405c05004011004010040a300b4d9332fad42820bae25e65801f0e44ff2304200084010040100000444000390d9714c02a912000091cb01603a6d6d0b0230c1f008000054180800802000008880011b1145150a20a850c340005644001fc08900ae075f386e00108c0d0040508542822a015150a00884fc36238020000ce22366b13e2988410c4f4562780b80400802045c2622c1303605e8c806682d861ac6a58251201f070acf0023141f008000056113b1509d0a84e454148220d01109c0684483426e1b1360509a8284d0142660200022420022da4099362648b1313986088c4c04425e22b3b2909a2b4844368d41c8109b1df1ebd69283a681187a63400000000000000000844eefc3c2440227c9583b455a0b4e2d81f4870b01cf9768db800000000000000002090e21a08c08e00a0020000ca6447462deadaf1c70d5c2e372031558354987d1b98b947db7059ec03c5dbf37e62e03900019ef6b719264446211a5b389687b3dbd60bdea732cba7a25891dd1b25553e7f46db0d57cb656c0d10e91ff34c013aa1515d68c82c0fd3f4c5944fc1e8103960aa43be14a9e31c9020944b8e625a5b12c2d89590c4a8762520b12801c04ae87d448f5f96c91910910e0b19e8014d4d7f4c5401686ceacd6b106eded24b044d9b8b3081360db0223006489654e4ebee6623148010dfb0bfad26bc6ad790404000fae62aa2d0e68e902385bedc447198c1282c1219f9104003466c1723fc70905011074809cc7b938d01d736ba9010251c1e00848674d31660d1a718ac1d3430caeb5c80408c707802000015c449c661ea2b12615e922f1263744fa67b810a07c9d9eccb0bbd4d05704f7334a77470494c754547302209cfb4cb228bb02d347161a19e9da640aff91cb271f1406d2f6c4e53c702204a9e6fdd3b56bcfd9a68d74d8806ad4631d4c72c1bb9d69635eb1e6b860d4a0138eefb6aa62ad9b3d628ef7ded937542cea29e9c54a42a639a4a1cf5755c0390d508c12690a396f340ba1f250283c3e1ba2ff52076e561c43435143b4800ab0c43367c121835eaa414cb6945aa057cd1243a3c6eb7f61b3ec877c652012cb3945add268b5a311de942cbac82b877b7e056d7407f478e4390b3c4d30000dbc400240c8928cc4901424603f2318161db414dc370a22b109ca030d4dd93b28532e455e5b85954e04867f5d0faa3876f4f8308419aa4f973259129a007bb09b963ae00572405cf3aec26c3d471a20337237d28dfefb9a00dc534ff73921f8422433ccec85468d49118c39830625f79e5097e27ede8819ec02918004a283c0101221187a86f4168e6b02cd45cc74f932487f02edf3e7cd89b5e841100000000000000000f418403238a1030414803402c010c22f873c16bdb4c04b99b50c393976dcf3289dc020fbff41226db4161cded01422a42459c0257ac481fffbc4483bf0c7767d47ef005bfb0e4c8fb4000cf0890808001250c044d3f22a1ca4ad751620155a8b8942ec72ca10050536093bdad7648820981ab3fb9c6f8402e729a357b1650b21a1018e48d5e5c1d2f8808772fcc4e28c853c4000d801a1b4926094100009ec331920a0f41e00005344480a423e3211e1588e888470440014d6446d162347311921e892a673832c4ea8f86f9421924754048c30740202300be0af045aef097bf557a7cbee57de48d67e4351f87fd7c1d1d810459f5cd9c12724d6161a4d2166294b09d1e5ef961b582525a230cf70b106a3f94c6fd4d7200680244fdb68bdcda83870fd2ff317250364674f6244e851f4d1eea27f2b1b1e69fcc826fbd67e4a0eabdd24a6a0b635afa6dab9065e8fbf2b499aa453424094555e03e8308386731a6d29999b57464438e50d540335480daadb0c5c0e98eb19265601648edc950a92912b1da7a4c09125f10a02583ac0c95217327c222bcab3b6d1ead9498374fbd3e61717fecfc22cebe2cc445eeaf8bb0aa490182d8f7d9a8fe99b200fdc615d2943eebea1f18b25404a328301340377115abfe3a2346d7c2dc95029d1375706a9a8393c73349e29fc7dfc6dbfc834e91e47d112d1b75211f911f0092e82a9c524254dd5795bd70ef0417c311e77280004d891171588b06c0d81622a02a1e4057810a022af93dd734407152c4a588203b71f8a046ac5d9f9005504ef19040261c1f008692a8ff0760e161dad0769629449dd922c24c3c71ae08120c0f8043c34fb88c3c5841c35fca11032fa54eb9601e1bfb1d2802c20e3e408128c0f80400004108000fc11140d0001ac9004210520c844c44224221111188806843c3421c1a01c09086808003c74801306110c4d085a48428f40084a002cf820086bc41ac97430fe1765c7e1c69fdfcb30183069de49a94f0a0351988b60c0a044b9f5cf151003b7e9510d682a880ed77bb9f881012bf77858902c8606be8880475c041f6d005433a13810)) <<< 16000) + 0x00008bc80251a10142d93a671f23fd09ac746bd7a7893b0219c62a3b3bb62a9ae40000000000000000f5e429d7b286a2571997c42457de5ea2360acdfef4137917880000000000000000000000000000000000000000000000006021030c1180140040515405050041cf11c24698f7a8e533f41fe575fa143df163a602903280ce4e5e86dac30a6643eb7a13633b7a7ad4b01de31ad18c944cfc5a21281d70a500c04651e67310a35ba174a422b16d68c91c7052ef9d017fd2e6f62a001db17df762f4902a73eb5eeb4d0ab8c43a92094a4c4e0c912207e29f44f72f3e8a5e312a4f7e15f52d2ea212020006fd20299fa4063734d90abeec624dbe39d4ab82455a4069ea00222f4eed8fdec02d6056d4fb0e00b31c214208118010008040044a4d2c41ac16f95f875c3b887129cd28715cfa1049c87bc0e04899026f0c60fe32510801dde494f6ec1139ee971f488ab8a319c2304558a09ad357405e286ac67b995a8aa68432e4e5ef96b31b9705ac055b06000000000000000078c8e63b51da19b4a1da7120aa0e10a10c086082026ffd36f25b14444547343a0b8775f5e091cdab8b28da3200d506ff730ffcda06e01102d6521a615579b529d716af9ac156a85b293fa810a13ab536e1cee47505310139a88384800124488316c0989420a4b104158818ac408362021b10001d815b53ec3802c40faf0f671780235b46c7cb7e9077d843ff2e291dda180000000000000003c790a75eca1a895c665f10915f797a88d82b37fbd04de45e200000000000000000000000000000000000000000000000018123df22e11240b42431830411c0140444c2917ede9493d25352440512bfba3a191e459e63d7f3da1af3fc42e221e8479a74268183c6b8a4fb81ddc954da35012471cb6b80401038e124031b05be45342816df21817d7a968a0383ea36c3b823079fed69c30728ca3b412a52deaa50be1987f88c3f8361fa1b0fc0187d80f0625f32d14919a5d3275104502c0494306f1e6182300d7c2dc2c102a303c008d1cf22a76b725a555279f8277d7fe4501d20eaf943b6f6c19341a9a36577d0fa0037c709803525910295a1b451ee5e40b73bbfe1793099a95fa0c0e601ad4717b8ba606dda4d72d05003760eac092ec20189b961e1b97afee2e63bbd531acbe8b29d478147d91f572b63a91d3aec40841848c1cbcd9a34214e1fc1943dd4b4e1dcf79c7074a19263a8d1d55cd800143b6ad9d2320504f95dd828af4aff39040a5ad7a948c0101a1870098207c0201f40a00013c21f21a0f8010002e490570160c562d080d830ffbe787360309527414fd0b04d1f4464e0805069473bc01078cdc33908b00000266250803fd9ec300026a0b0d2d80436820240180000ec10db2587b88c368361b21b0d801e8e116ad7aca1eba9cc8e9028434253f101ba3c417468050f67b2c8009febd31880130e0f8042dbc404d9dc81693081d54bb18dd000000006432e8060f11849840c19e09809400a01789b9cddf4645e5575f03243dd8aab8b58c55a5a571fa3843309d7c94ceec4ec612886ee110a1c694d1408e3975dc6c824340062d72682734d3c14102665fdfd93820f80403d8140002ca43d4341e8038141e13c58c694eab2dc6e5081399cf003886ded76c258088d661cc1017086978c1304100042053b5d8ace694502b14c1044ff5383650885dadad020a7a98272d410780101de0200010a3e4bb5d8ace612502b14c0e3cff5383648685dadad0007846681ad410780101e6020f20100008f10f1090001d090f0050003b19dd7e449a59855697fe069095b6ca09c9f4c7fdd31517259c000000000000000000000000000000000000000000000000182550c9bcc733c89cdaf7c45af4019e643b2e1a79a25397c000000000000000000000000000000000000000000000005d21c41041020c23002400034ba2edc50863cf315cc88d038fe4d7e361e33f637c57c6e814fbd3a09afe04506756bdfc46ebf33ed377af9d9d53aa73c4488713620dc30280029090d42586984f1e39d002c0c0b5b78809b3b902d26103aa97631ba00000000c865d00c1e33472873021013402000ad84448a1df7d16d97dbcae1d1080e5004d6928c2fdee01c0ddf8d9e4b0e3d8c17c90a7ceee43095769b1901c79ca26e4c284261f7c0b1c409e87b6d2432625c8ae34069f46f0f109c4080021028b35bd039a5683ace8a28414dfb614388e3d2bac8b016eca5c78c0392ca2c1098207c02102a369f5b39043c30bd1628446178efe38805cf8108107a2461901203f3eda1726041f0080778080004ec877048000a4cf10d3adfdc793718ea590a5b965e40d8236448c1918038103eba0630d4fc34f3e092dd9040444b19f77635b890284422db2a274096904802b4127df19cc6be1804b8ba0c7d08d99c080179aef52cf320e820570546c9228780f00002cf21080a00070a38337f1788a178e21b7998fef10827d1823f3da0812ef4b6ad2d0e092a5c2da6684090ee8e0f15020bc23444ca012068b82ac198001ba3408e44084388202802c00010110ed1900c068002ec087616832024003414431ca400471a4058e61d6330571980b86e433a11b5aac10191393b177860d51fdb82c0482a1e0c7a2410102577975e12004ae643a007034b5b1b1ac101470e83c7a0400ee08635422a800104458e21b09302501805f10c3a8761d2330e81987380c398072324cc919294205cd353f1812c4c20f7081212325b60c006f5097c06041af96ef01306100040394241c40a0e00101300b4700003e5fc260896364b)) <<< 16000) + 0x1a70d0e56466fb338a1a5a8b0f0ed2023b0a9e435a502b5e48829bcd026d85e6a3201217a5fd660b044d5bebc57dc509c091a1a1224106a214320e91b781a1870857616c788083496302210812259dfd94c08290593bf5786822b9c640f80a057bfd04ee80800ae6e5d620012412284e0480001fd219c1300041221083b0e41587188e65048b548eff216e65048b548eff217110e83924d165e408b5f026188b9942ac4012461843021020823011800c00400432280200d0e20107080c338041c0020260168bfece25180e11261dd9f88c20fbfa221c0c31d6429ab470398d5a2f84b042f7c922c1c03cdf4a8092400000332dc000033b28811940e1180a3c900002d7e1c325fae76d071410de124a7859397730e3804b883d43000003e808509bcc86445142100c7920a77ccb27902dd7117470c2e40bc6450c162e8fc238a01c404f07857e1c06ea4803523e2f20938810004037c340002e44378240005e2412887e2d5493c1dc8714aebd57f8a28b08731dcde3c3366d511160c11ea10558d0e058ea8f77a42007dc6ec63e0c0036aa994c00091e14c22364081280e3c925fafb721e2ec5b09720714502039c620800057daa1824bf5136e1c0d4ec1f49800001388114c204202000015a21ba03815c1a0aff2032d6c2aee30c8713295141259c47aa6820f7e49d840880785ec400e52b903813860f0042056f89b1e6504b77e86d1a08c98ea5e580259f7d2812060f0040000340f933e89aff7564d207540264af9e429368379cf9d62cd6c658db2e919ace2b260de3adf25cb794e94b0f49cb8d72901e7fe6fb7daab88cbb1ce39537d8cc4a980ede9d7615b40d7d3092da28d4a89429a9f285b9f3597ad0b2204edc084f910208063db3d4210c64f326b0d3488003c1a807ded83d9c8fd3250248709a29c10fb88aa062d9920737a84853c22b582d4d00bd34bfd74f4465438168642a6cb0b684765c1b703bcf6428ac33bc2c744a72102d5365ad57c820642e1f2012e3b2bf8d646c9bc245cea4e1849941302c7a7ba05bed06c5843a3a6fa1cbeb854ec8a1a378ca50918501af3d9a913d57a599949f4778f9be022795f20ac9942b4b42924130de3533db300fac03bd05564c0a37f0816fdd90b4df15afbf99091ac2e00023d4866068002d7886804837004001e104005044800b1d90db3186d0cc364661b003a1f86cce591c50869f34061527e032a1422c8b8fbc1075600c121c0e3336f54401b514f440270c1e00806806a8401b1956042010248952cf880d665df7c88304c8c22b0f6083d0df067aa34000008e29c14058aebde7800c8e184a0380ce018000cb90d21586884eb14135a6ae80ba60c243ac5931bd7552418f60092ed132f1534b21881f70000000000000000000000000000000000000000000000001788a1c7147082047004001035fbecdcf12d159357ac1028d53f2c2b2086695a45ddc01c8bab06fd518bf633f644b0dcad832393b3bb6f3de20743b1aa9542908533b0e11cc65d0490986804833c0619c02e304859916c2885aef656e2019a0539aa8785067a8dc78c1043e70d008031033c1c0020d43287e2040027e5ed6f80001770164021100801001712c35e3e2cac38b0000000a8d128990347ba4207209941ad60e1000010757a4030b3c31022510a7fa1befc62420ca9b91d290009d71122c62d4821300e2ef24a7b76089cf754ab82455fbc0021182248f7c8b844902c912d02c81d10d108704100001c020080340005308001a91bbb4cf3603d5450fa784bf39ac87148eed4e2b711d552aaf80000000000000000000000000000000000000000000000001845028d28814d10f08704f00600c02008036051824bb594034add1aba7863c06edf5008e1ea5258e0e40ef5e810000cc4fee0000efcc3099c107c0200002a240f80400072e435c07c582c29991fc239f44a0492c43b29099861013fa161d007ab8918167d9e34da39a2228604745eed572644448cee29d80959058642af6cbe2135051062359d997d4b791200cee56f4c58f3a268d6a12086e0c889622eed04f34bbe238b0737eabdeced3a984008f6a77e368e4881c4f53555c33be388881ed5c7d527a6b82c30d7854660fef9ca20d16de178a9f9d009042d800e5cddc6d0600043bf3caa92870287ca6090439068000154981455a95e40d285d8cbbb102866101af4037ab45b645045505c9d8d040c907e88e05c0a840327041f00806b008000598f93d4f1ea1ce24477177f184ab08ddce286011fff1e30a3b97749c494307c0200001fc4354340010104004488800abb90d42186988e277d3845c40bdca1a376c1512871851453022020820411c0100032180200d0d0095e1f833f211957dfc26cfc55b5f846da21fc160fcd2494c00000000000000000000000000000000000000000000000ba271030c486286484104702582180801006f108b2007dcf724310741b49b49210b0a702bafc30810987085e810506101b64b72c12aeea5558f920035ded69e40300b0407108a400349017fd6bd2020a40a00003fc43380600086c4348461a213a1d7f52e84c01c5021ee805fcc0a6159fd94b20206b0ea5c8c20ae29422cee34106011914bc804560f10f811c057163d2b30400a0982ba4604017c1b386f80c6a0c2602006802833c0619c02f24b8061274a1080c6259c610b6dff318f0bb93cd9d8c0800046488e0799b979f000000002acc18400189391e84e7bf1b4e7c0a47188aabeed85ad07151b56c0c0a50000000000000000000000000000000000000000000000000184)) <<< 16000) + 0x4f24a1030cf08e04a004003e82b8606003400086886680e4e47a139efc6d39f0291c622aafbb616b41c546d5b030294000000000000000000000000000000000000000000000000061b9c1aac5b4252a507087469b14d6cb9f53ec2ddf369b6e500000000000000000000000000000000000000000000000017c8e20b2051090ce0490080008de2fe8e202c01d0cc090001e1900077820013e640b0540302a000fbe2196520ca210648e8320341081a00293c218e62004605218c8a0c535002471900739f2148b30c44181318800c054302d5f19d27028f720c821850bc8cfc3a9ea36caeafc40739aa264cbfb5276eb8fc6085d7f6c579fb9d4965c50c0ca085e590d16b56a7b5b28024e60eaecab08efcbab2080455f27264c9a76bca2c010ed3d158c2af5a30dc6104e5d75b73e1638c27860358433bafd84f978d27a055d010f5c58cc0b21c52441c41c31c22c018039f44f8ca910a4ce74b74a0f0420675415d12741c4e20ba215e2858659672446d6ee6903894b78974470d6f1afef9211c0359811c2d2b3ace41022aec67189c107c0201860a0c2050240280006388608a8000db08600ec2fc7617c230bd1185e08c2ec361741b0b90d85c02f8a3172ec80912784a9eb0e24ccad7311c3707023ec3040533ded0b03f235592000130e0f804285e4bc235e40b144b18d48122416f3688183d488191c0216f38ba20026b78dac000621a3bb00138a0f8043094918627a58d584092f491a98a7057922a442fb2d34003824fca380364c9a3a6001f00805b80c2d8076416ab6df0cb1c159a8b6848c055cc0a420608a7878f8c15aca7f23cd04cb090444582268c9bd19c0084021642ddcd1281638406dc809230e0ed6541030b2e48dd8c17df4de319a0b359953c160966ab26a94000e8f2a5500040010000181383a42f577d1439b3ffe611431f24d8858e297bacbb71408e3a0b408a0fe7094b4cc00400100b50180009f100045121681a0b30d0002f190b2090003b590b12185810c2bc4615c130ad09c893576c0b470ef15b4468a166fb7523102ef04e144482a687c1e82076bc10ab960542ef70a18024f04d160000050583e010a14fc74dfb881416750c288114ef894c450f3db3a910a090f2dc798309a65d9bbc7004b3f520c40022c9e3040000a090800214401dea2e194393d9227d943203c50128e2d98664fb8a23aee02aa08188bb360188130a100043a021eb8b19816260e50e50c40a38a2883025804800064500401a0001a242b05784ed0a7ad85d20889634374cfb7d7d5d31229dbf5d77320b8f8c262b68ba14d8bd7081b39e2946742b328611018fce2f65b499401ab1e97a0f44c2040190f83b42dbda8817eebf1cae9b90401453ecc40e1c0340000a7c8558a800140c824068001b188550880022148549882a0040023d260446662a29840c0cfe867936c0404116633b4704004084c2bd6c0c0065acd53708400ee99b5b94410060044fcf8882834052b46c2045ebea447d920016c3c6705e2c63a21481200008e08539cc298c414a630a42185188828846142230a001c36eca23126df1ce9658bedec55e1dc881101ac219dd7ec27cbc693d02ab6f1013677205c28c3ad87bc03f37cce0121461d6c3de01f9be670072819a0c8259f66eb25502940cd06412cfb37592a808aa838640428428260009611569c521507b7147457fe20ebb9276dc1ed4f71b2cf0cf0903d7a8fa370c0c249592cdc840076ac07e510bb2f94a93cab693b30bdf23e3b975df14919337c9ab97120cc7ebb77fe795ce1923a14850925ba4b4e7bd74c3d741f5b4fbe03b3329a20d2bd9cf11c2eb8df6c0f17533e9870d012421c46c8b1466d3490ffceab249bb9d6353ede836ef91b10ee810237dd63b02b1d06a35a0014238637cb3eeb098be44a82a680cf63a81895ec4a5c7be8c2d319d515bd50bfa00da3b6a443594d3856ede69cfdc5f4fbd33738d49a20045e21567d27367d4fd5ab0061522413d5384811f664ce6c44a51d2f463b1ea44bcd2d67bcbb055ba0063622b89fcd6d4365d9d40f495e12543fba5851c99a484e0f1953f6cfc686f6a9330edd449e0eac20086092ba65009c074bd89cf81ffe761ac6c78c4d2869b09a24b25d90d8d4ec9b34b5dac00a41d414906921f2c36b648719b37de20110810004027c3413c1a09d0900006010008a13779253d6a84bb9ca38191cef06de3bd810bcd9bcac5fa016b6f101367720599841010e08c09800e011f1f0ab4a4546f21ae47889518565624880ac880bbe2c8bed2fbb0fd63b14b0a428d370802f34734202ac67f5ed080042c41cf08c20800201381209b0904b8280003a08158c81d4260540200039d20fa530561d84d0cc1f0560f6230991183d02f860bfe80bcc022d7da448012141f004619d2bf3a141f6648d6848306c010130120970500004e10781984b08c254360ec130750903484c250260d00381012286c5786c48ac954180548963c91aed088e19da83adb6cf1653368ff5553c5867b85b870340e57242898707f6410cd194f04de92ef3e13a4002429e9bc638cbf11d6d5f4e171ef7c5fc7e0068d54808f0549d4a1f861f3e1c41480d90b40007b5ab74a54f4501c381786295c4b90a23c711617196f2f160c9d0bfe91020e004024c0411a03c0f493d8218148c28dd2408360080920169302e0c82611c98f962406e9471a46819ee0840480838010d11da99e126866267b25203f5967f106128593ac090107402000018e4000694800122909105e063dc400b0c008f11a938c042c90f9f08c207c02100)) <<< 16000) + 0x4010040480280000dc81306a20c45489443400857c39c48107c011a2118cc3a9a0ead8274840ee7378093041c00400004d1bbc929eb5425dce51c0c8e77836f1dec0864303e3d1510abf2a185334c85b2db1bd05b08a08e234e00000000000000000000000000000000000000000000005b23092483032031c30c32011c170080200d0900100014e908d050001fd9000523211e1308e01e83d9079904012b39691020c8040234161180389bb395114e28928fba9a317b67053c1d7cf9172000d80438a48add83284499cc0a3c1117da3d38080680fa900070020000182683d2239bc4001d2a8ed880070021424a4d80c0e00cd5c99f1000e80400001cc80007f9d2401ea2b33082084c59c80981bd5d500090e422d824081e008000066900039c300001004480c6dd0c1e0498708620019008000036108c01f830f6b9430098fc05844103201000006f20341200015d3e5cd75b854b2855cb7fe50aa2c3ebc0802c4393300120a0e804000033c8430c821464000db4422c44001f0840e4b60701b80c1a988cb8e1e425cd6101a9b80e734dedfb508e1fad669e24420b60ee897d0358c37f721fff9920157e5b5f411c02c10b8164e480151387fff1c6382e1d42458608212ca467ab9c19da8151f2bf58802360cacf9d3a0106c58229e8864809b13410f86b064467933cefe94d3f0bb554e80054325de80003a143638ab552a6c69726e1ec038b3296498ee2c4347324b4b09775bac12c02c91e4c860239b4be6140135dca3000945078021a30609e1731a202b1035e1a008d725a80e042507fdb8120610004288836261468dccc7050918708eb38c6103601008a010000579e2d0d9713260606bd26c091060f00402241400011e400092cd0c0cc90378e2c7e776805021dab3519401689fb40180504fc970805460780100001fc42204410e03819bbf2179942003b4eea1442b7835da20935c32c780090507c0214368ff9cec81a46bae56580afc12482801d56c68080066f95e8009450740200001f06ca6427e1114188251fd490fa6e73566006e4743408081f55b30004a303a0100000fa210c32085190001949084110003ff901815000644900200c20ae72065090011179057458319ec20cd60be1bd2444d5e90cd182f1e8838d1120911deca1053267ca490c0d1c2ff060f0dae5400d00489e75088001593f1d0028102000869250c55d3268869a8bd9a3077c9fc2422060dc6a0c0012081000400003648410ac0e0460a22308111cc2616cfa278170a30eb61ef00fcdf33804851875b0f7807e6f99c01ca0668320967d9bac9540a503341904b3ecdd64aa022a91010a11800e0040065277e0b9fa5ae945b4fe9e547550c4a426ffc2d7da45ca7f9583b6b42c252727911647bba5a8a6b8223b50db20cd7916223dc6aa5ee0ac003fbe8d1209b83562117ceb6f081c90abff1ecef2ed86177fd1b7ef2b15302823357992c845922992e3faa2de97ad01446db8121524db3028002ac1c2101eae3a181aedbe46d18324bedf024855d836c8080b7202bc20a11a320a1b0c22262208a24e183e0100800583f82f0825da68175243060d04c8e6c6040d83ad5e1e4e12147c5a5295a9202dd6148af86c28493982d76aa430993211182c38e02a7b45bcec812ff21fe537107a42050ac0d000043240ac540ea1307e0501502800101883e96c158860f83307b1583d02e444027e0cb1531184b8f0d813035e690e0b3dfd7cdd79a1111028a880ce90bb6394cf41c1a301a1c612d57941021e8a313a0418eee162c8981b31e7c0e3c0805e64355e9aade3cc914fa206a13115ba2cb004044ad6a8d6c639cb0e5b4cc10b01d80510182800c1e407224f0f1e93103e209339460363f08e8c304c6b7042020dbe8419430055c9d17a3805715d370109c507c0200002b041e0660ee230760983a8481a4260d003f1a789792c2466d2f1ba850aae7610c30036a57df06004301a9314083246d040983078021c6a48ec0f07147714564183077ddd7c09860f002000028c83888e8905d913703870361bd62385134dcd63205167383ee1018b1417492c01ca0f37b0026142000800009990361582108fcd9bcac5fa0174df8e25e344f17ca0f630bb75edccb155590ff8b4df86a21000000000000000000000000000000000000000000000000030e3c73a0058181761e3b64d79337ed95ad8e0aa0a21e11800c00a01cdcd002fd996a1a0d0ddd073dade6f5219339d8ba91aafeb20f4f754f1f1a51d0bd02273a62e1b3a4b4312ce7c44be6c10abac140bfa90bd92b658b7bb02b5c176c4665c79beed4349d0cb83939d8ead2f15ccb1ec4d9cd751fdf31cec638dc0241cb80d519ef6af9e87b98e083da0021e1457e8eaacfd50b1d842ba077d459b3e908c18451084b90bd549ce7f89b9378132ea5d181820015c3ec77b287d8c28280897cbccabdcc3405d4df6c126619f43f98b75074c63f7865d1eefe8f9d7168688c2d19883d094a191436000040920e22304b1182606fb14e320b7b70eaf6e02d8aaf23b0f24924b9fff15813729a000000000000000000000000000000000000000000000000061b0f1db26bc99bf6cad6c7057e1735312e01d0bb7c2e6a625c03a1755af8130c45cca158794ac4105d10d71c3f33c2301241300180227e9a93f2c9244e04bec4853f00c82d85fe830249281de58f1fcf9c019a18e3d691432634db4c8e332c4b36bb8ed98790f55f96edc0743f7ffcf9342c2c20ac5a0df63844fa8f9530f39374feb03355046f5fc203369929e28f98a5af9d20d89c66cda1)) <<< 16000) + 0xcfb6e33157a7f6dad9d7946459493f212f8c2ca62dc13deb3b359cb8ec0aaa5f3047694dc6050a32ecadd921d61254169c48801564b70483839a825da50f181060cc7784e0a00aa9ef7167c2011e8751e70408002b0e6c91f8203bbd7de408443e8408148163890747f6c5f6dbdd4d0f0490b77b1c11903eac77664e0ca3cb88a73b1ae243f796186ba004094d12519dfb441adc449c9f738d834d184806af99da43b5a27955206004f58a8d805edcdddc2002c1fb8b1eeda05547a01f525027a1bfc7e0c25ff25f6a8fa0e209616000034a34a9e46255ac279dd18e680adde99a5dc96017f0b9a989700e85dbe1735312e01d0baad7c098622e650ac3ca562082e886b8e1f99039032019019a114101ca120fde2051fb154440c240ac5bce86b181177f20ae857e183729fe74a31ee1342ccb2be60ae529265b8ddd5ae2f81d84330b1a0e8020003a120011f640042f0800d1590392581c04e46181f471a38ca05fcf3871687bbd1d1418287a3661434acb4a9412840f8042ca02a36fdeacf18524ca4a2e24612d46d121871685cb626ea144095ef8535850946b05d7e72801e80f4d5d4300a156113ca0c8808260200000dd90710983984a05478a1a4840471af2dd44080e44f1d880d11db3f52c025758b5e004a283e010000102206c230720df1b1783f730e2ca627c53144095f2a90286dcdb92ecf0b1f7b31b04a103e010c1cc40c2320e35a5f34cf285139b560238b24288b6451090fdf651e13f690fd6280302614e0180c05b50b428081f0080000be90710982584c1c02409813e33e6f427a941861d85d992183d53edb861d27d2da81e10a2df8090e1131e441a1809c167634120812b7265000503040010d3ac4bba4b205d878ed935e4cdfb656b6382b0a30eb61ef00fcdf33804851875b0f7807e6f99c01ca0668320967d9bac9540a503341904b3ecdd64aa022a98e30e298094012006004c0238a93475adc0af99f28e1e8c58d5531491b49eb0e17e821da2c9faa417ce10134c76ea0fbfd491448f3c514352276b083fa21e433f311c0b01a279356c32047450004542000bf640023f481608806044001b0a400adf882b96809c340de1a00311620dc7206d3502f9681b0a404c32003e6820088206b15d8e5bca46d4fc152f8915c515d78c108014ebd473e41fbd17297e1a2022fbe8bca508f0073fb49b4410805e3bd807555fddacae4fee92a806af0efa1d0406aec1ed996f044b492f31ada1bcca2ec781a502676be5cd2d5eec4820c4220b0f102bb132fcccaab0608233c0ee98c32b97560090665c5540e1493b2df51c18f1144dc7f71fe5c2146bac3a04be85ecf420ca3c22a406410460a00000ee90581582b8ac158560d4230550d82a06c14c060a403c1260f0e108291aa9b8200e54b3f5002630360080690583400e020020080391181c02e887b18da01c32e3cebe0e04ee2b1c42026c4ec0c0048283a01001809000071902b190000af9029190338a8198240ca1200029820c86b0633183114c184660c01b05f0de06ca840921143cda80680808e5abbf5bfeaa93e1b20a131e02c4ccf9142203c00c2464610934a527eca758281db6bbdefd15d3cfbf915600c5204ab381c32c92c7383f192699666d75a6936f24e54850c4b0b8608714f8ea26065c00be22286028f034e40420d1c67e2851af7964aa4a184001000010320bc2305d1182e06c16c360b41305901d87a449c44c80700624708e08cbbd510101f228589a10226bcbf6cb00e349b640c02b166b3e051009ca07c0200002c44160b60ae530562582a8ac150560a60305201c134e79f828c0c79140f545044ce68fe0023102000802880c1400609e0304e0102680f86f9ab8799c11997c276582bf5381e0a0b927f8ca1011ca918680128a0f004013017809187d8bd7cb0aecf4e00c8df776b6c637700a665cc1379893ea32940b66140621e9adf261386ce9f6469af05f18008c80762d861e9190b3ea2db6e7ae742472585b5eb21d12d2314b48f772a83d6ae824133ebaf4686f083c96c98c0472fc67c9bf58d41ba19f5bfe487b5d245729ca0cf5db4e3f104ac1239857e64578f319e5d837bca1dcc871b4011d08e667fefe2d57d65dffc284295bb0bebff815258f439e382d934f9f87e98f6c3b7e5e239f68038927c881940bcfb77a18dfeacde4b63df06f8d5a773e6a78fd6c1850650454d530c26b08fd0abe82073ff8d92ed188b2290343f431a8c160811751940883074021e510ce620cd0ff270efe582a36538a38046aab371a068de1a2009430740200001e8400062082586800236c81300bc1a3d76bd28da4f6cd8364de7e1384b966afb85276c2b6cd217c402446b58e367efcd0def3edcee354f28759dc0c0b737e2d1a080405b1d524a0a0e02fc81474ce28514a4d5e3064463fcfe497cdb060200f675631455742eb46f91d57872e387791ca91e7b68a19a80701210c32e00588209d4e8fe742b056496ab47f89b4648b13741c1309d7de2a79f75a0bfc1436849d7a5f584ec3888198e550f06135bb2de4d7c1d697505375ece532e9348e0ae0654709d50cc38dcf7724ddbf7f6a8e24080451b58ff0debb82b6431e98d124fcc984478d563d00ad9d6691fc70c6b134a5f22b7e7c70404c0d1458785676a3642b45cb42dfe0fd845e1595a63e1f3bc2738599e4eb16c0ddae49e982163c0cd792369d9755098f1e47d6e72ee5eefc05251f3ba2fbf3f199553dd2b88eec824ed6dad4d9d93e322f7b121e070d91f6e78ab96653369787c1c4a17407d5f791430c3481020000b9)) <<< 16000) + 0x641283721889d12a820203488c80e01c44292220140799ad848103c01091431751c81029f1004c22081c00800003a90320de81089445f1c01f73e048120c1d00440300401000004440002d480012110491102406c003590800bcd90472981588c1184608a039040854b8c28116f8b5f09040e802300b4a87b8800c00220000200800002220880a00009620861b0360d82104c1040606603f249044c641023d965fec8045d9b05d101ba13c7508013a26c7525041e00802002e8336880288a1c8210018d04e1e727890087095cd24041d00844b095ef9a44636e700a1849c01dc54c3976021890007002101687668ccb13e1dd2b0403d7df36e3001c00800004d100017720004b27c406a8d7e102b39879d880070021c1b28ad2389098e321e610104199018c007402000013840fc0407c0200015220642303109f07494d3212c23ca2ce28611f7794a023081d008706b7d0ff90c29971c381c0448c31e0c009a129dc12040e8040000324f0780cf8f22c24984fc28611b1826a08c1074021c1ba831f6430a57d7f1a7011466a6f30027dbd3492020e804000031c81e82800065480b0680f0140006bc70168f88fc20019ec900441036010903126cdf220834008802008020000088800042902f0901d8480b82607412000166200141e40e4960701b8020080230d252f755c484051dced44800e8adf224608400100000a6206e0b0360581a82c0d00606603b11506cf5a184b3e15e8201253c15d060cc42c9e424081d00868434b6d5a920883e8c443824afc961060a345c04a5802cca6790c05f27e13c13040f004000048481904c0c417c1f0f9628cb0aad2b6e2184368f70608c2074021c1cee560a430ac212e5870102b45a63002c9673e048103a0100000c93c1e84f2c48309d8d70fe6026f09ff81c1640a3dc12020e8043838a28c1a86150e0f9f8c050242e8a7011d15d4830025e655012820e80400003c081804800079c80b048000e6cd07e1ddd4e4020992fce3003ec5d64100a0271100481838010c25505ef608840d80230161214f5084207402000009a40002c88178480b82600037c4001ef88168a80b0440302200096420565202a0d000ac690292901410809c54005e0c409874006afc4095240488a0233901116800fa94805934100ceed34311ea5558a03182254c059f66018103c84ade638141a81fc6c24011012b95396b1fa0c045ea14daeb2080071c8edb29045514403df5e974d2881fe0ea98c2e5ce7058058a080325d37a632e509ac2cc1ea75c9a5cd5a03d7c6e0000000000000003a11841821421401000c052923adeaa3127665f2ce5ce40b1d65a554b63eeca291785275157f6a587efba79bd0bee44406d356fde806d70c913d4bb2f8cb65318468e760604952f0ad12202a253e5408129c391d5fe38872ced310d1805e14338ae825144094051440023f3ebe58c0c8fa6cd943490f3ff863000003eb6682000262236a54108801144187e3a93658c0436eca2162821b1578c5821a38e31d14042482f3a24800000176d16042200400009b101a09d8c0ca621f58a1a4badebe19008000765e618000007f84c18000042ce2425082300855c96ef9acd1a8641273c4665649a9c759d19f896ae6b40000000000000000f71fe776eab4008a62be16a52ef6cd794b1d5561a3e442cb6200000000000000000000000000000000000000000000000006122882c61432c22012801000b84008034000c2480021a10006bd20422b0200980f84c07807ce8edb26162ad12f5cc3b747a5b5ee74f2a86c0cdeb8952c68000000000000000008673086916af29e15d28c7236295fdce6a7154664858e770580000000000000000202b800777699e6c07aa8a1f4f097e73590e291dda9c56e23aaa555f000000000000000000000000000000000000000000000000030a1439229028e01366b08576730ee532d5d2e5a3fef9aa1fd38280b2dae82550515a3c137452af403d8cd6fe29cf74424a95a848562728c982bb61a158f30146e1dc738ac9f157f4cea7336004df382c128d7dafc9b65dade8183bcfb5ffe406d5b5625668742a1ad2ab7e4f728863d083793060bb18daefb4fd385206eeb8370706569f7dc58f25d9b45409100001ad428e00000454b70400000130b72801180439842d8839530f24e472991607fd27ee6e9348ceb362a83800000000000000007e259260e58e50e488602302581800010068000c59b240000130b983832b417662c792ecf6bb04880000cd1b870000022a5bca0046010b24e93f0519f30706dd794a40b1c14e28218e28700000ea42060c124e093bf241043b256500b027cb205403a3801300a0000608800154901d090002c5901c1180d82e47097e035a2d2850695d1bd20245cfa44814cb20546e49c19581c074bc989c781321430a008164800002617307065682ecc58f25d9ed76091000019a370e00000454b72504230085926b34c68269838486ee8ec858e0010adb5b9438000075210488066b893850c083048d189a58147580122714704260140000c21c24000b70a318383296cd432c792ee2f2722820004e1b0870000022a5bca0046010b24c3f1d49b183810dc103c30602e0170d260402ac105bc4042bbe84c916042482f3a214000000bb693801180400005a880d028000a988002b710190d00c048001b9080b8c80582400296840547402832001d46202632002078202472011350081a803cd401c5200d250060c802c64014320091100402801c0400c020023c9200a42004210018a800844002020000100b7a21)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 37 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase5" = "QuadFullFourCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 37 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase5 private def zz2189:"s088d"="s088d":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase6 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l17 l22 l23 l27 l29 l33 l35 l37 l4 l44 l46 l5 l51 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x596cd8e06, -0x59682c120, -0x2625c134a,0x3452d690], ![-0x59682c120, -0x285eeeb0b4,0xfca656eb8, -0x55b5f7084], ![-0x2625c134a,0xfca656eb8, -0x29f2e8fc25,0x8ce090aee], ![0x3452d690, -0x55b5f7084,0x8ce090aee, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xf702f7a1,l5),(0x202126518,l4),(0x26a72f5fd,l8),(-0x90797c96,l10),(0x6348a40,l14),(-0xceedf0bc,l17),(0xc22106ce,l23),(0x733438fe,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x8b8715c,l46),(0x4e7bfbd0,l44),(0x2cb417800,l51),(-0xf633d72a,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0xf633d72a,l63),(0x26a72f5fd,l8),(0xc22106ce,l23),(-0xceedf0bc,l17),(-0x90797c96,l10),(-0xf702f7a1,l5),(0x202126518,l4),(0x733438fe,l22),(0x4e7bfbd0,l44),(-0x8b8715c,l46),(0x6348a40,l14)] def dynamicTables : DynamicPackedCheck.Tables := ⟨70, #[0x44240a30080000c709900690c0600001505221016400c000551241600b9004003c82282d018c40140000000002601480200000005827013300c000000000b002480300000000036009200c0000000190901cc020000000640900c300c0000001b024030c030000068041002630140000001b84402cc0300000000001406200800000000016014802ed851c12102ff1401c0000001c8c40d8c03002903184301d2401400000008828030c030000150640b00b400c015418e09801250050002b46e0700494010000b11d04603590040000000000b40620080000000002f0188020000000be3900b300c0000002e8e804cc0300000008e2100b300c0000002288804cc03002542102200c9401400000000a0603cc02000000003c1c0a30080006214c42032d004062053042001e140180000022011004cc0400000000881407300800a211418803c50050000000044340a300a9510904180b95500700000000001c06200a9c10c04200275500700000000008406200800000000023018802046831810804ed40180000000002103880200000000003805200800000014864090c030000090220d027400f1c14c04200275500700000000009406200800000000027018802056841810804ed4018000000108640d8c0300000000007c062008000001b120901d0020000000002c00b200c0000000001901880200000000006c0620081440a1044006350060001702807005d4010000000000980248030000000001c009200c00000000012014802,0x8508c0940ddd0050038c510830178401400000138110058c0400000000443c0530080000000000f0148020000094260900b400c00000000078024803], #[![125, 323, -948, 0],![-7855, 2378, 16431, 0],![-7, -50, 63, 0]]⟩ def dynamicCode : Nat := (((((((0x81e19625d3812343f2e5714206329e7ae003020f7c8328c601959f8fbb84a1046010be195d4f29a315686ba929878f5fc1dd293235c2da7153d6d9d400000000000000000114482081c91881890c80820410490032100200d0001b4208c1b91c262180f71071e592059cfd071869c89e158ca1400000697807145b114d5884810469c73651480c8f7f6421bc801ee99008f500273de6b0a094061400a01140400040e40300703147ede57d6061adeb5c31a7048a2fec92cee1244365fa60d4d8e204c631e15b0610b5ea752ff03862c16e67d391c2349256c77786008b436d3ae0042c918290180001071d8005b4be51fc3f1a800c0ab7833cacf0729fbefdd494c3c7afe0ee949283f918c7ef6eeeb60000000000000000008a4406306282200180080a596b6c76bc5163ba71e3e4606fb7b380d8b0ec64beadb983a581ee4a82ae8b1cb2a2f30e96ffa69ca16916bcd0125a13cc4a32401884ec4fe43e612ca48dd4768c00de714119d3f62782827ad7fbb0e6c1714001178c78ef6ab6d80593004de0cf2b3c1ca7efbf752530f1ebf83ba524a0fe4631fbdbbbad800000000000000000229d81a39746669dbc31abe1f8af412907c1dcdb8b8e2e2244854000000000000000000000000000000000000000000000000000ca51ee4a205e52e1ca5063d72b79848642f3cad9213a8818e1081040a8314f58ae40b795e6c74260aab69e578dfe1a9c5afd12f91e6f0333d84ac7c8548d0bfcf3e8fea707fce8ac2bb5656770a4809a4142cce1b771e7b8220e63407208b3624b2f303018f534c629ed1dd38eb2fac3929acb82229d037ecae677340333788b6f367822392bc982187941f41f43ba10e8b674001e44d84f6224a7abffd9f5d6f7cf4d4e36b3a8971e1c347e35d556ba0000000000000000008a7c885c7af5e325b8a7cf4f46405251056726d8118be4701c324000000000000000002210c08608c00a008008108727a895c7c7ccd58123ebf00be777c2f7bc723805ca778f0a34d825c53b38aeda3437ad6251339b849db86c236c6ebc478dcf4317a3f5abffc6f28f687222af72b76ed6340364da79e4d6a28a1758f0eddbe99e84f7c8f0b331048ce2460451210c7fece52055d124cefb5252741e8003001044298218a8108340820a0400140c1660a920b783857b78af91eac3044d76f7ecc802842e54ecc857c400354e64f6a7c380b6b78a46f562801664146672e285f4697f225c8f94df38535444e2858050a200ff69a638e396c6268f41c605126e4824896bb5614fc813368097f78e129e714f5a1020802475be3384118042450df5564b2f8028892ac91d9ae1030e0449134dfb6081036f4765264d0c20ff906caf9662826541d381712020568380aaf17902096754cc0f55c1003ba2e33796297224801781c00fc07658dcaa1eee28598f2bbab248abf2bb3e8c8143d7c32f1901526c24dd50c10a8c7b2e628040a18fdac9c108c0200002d84000f7081606f889cf76be6ad0a18a3926c3ae220701a656d24b8c10b9520bfe5620416a4d1e7d70417bdd970752428277d0f0aeda8601a530af4edc000a1a078bcdf73a400a809007c0303d0181e00e82142102301281041300280040c80008036893082862452442820c1240000c8000803400023000258e38e58a48a48208248008000190001006800046000c81c814a108104107087004000032000200d00008c0029c66288b424a421229675a01029dc7143102309425228b458913c332c204123a99390200e19349c74251006083efc7ce09643026d8c965576a2004278c171fc06c04801681800008acd90ef8407b14b1a24b2b05d1433b3bd397b24605c3c766018628e1059e8a049542c3fd0e083274d55e2704230080000b61a1ccb5ac0fb6e9a38c3002fc738b2aeb4285ba8318e21a0eba48abbab081801441070c72e1e7e012f628a182cf11e31911bf082128da2c862302838047226a082be7e07d09010106e0a800025020011ba4002d1080086c903b15c87d3bba64cd4062039a0c4f740d8190131227022c8a0c80556ee2b51ec7a1820ff7c7bab2001c03a7b0ea4125a8c018ef6dadff50000086dc567ceb113882000c40f159d01519ca45a540a092392312212190190106082060000401a00019840e807233247d13f74dce1e488b28aafef908e6a90204f7b7b5a7d98984863d8bc6fa25ad6e101800003aa5021590404453202f6f03ee6120c73c9ccc1391618500000009f15e60b800000402eef86f1e3075c631208740b091c2c980eb2e48cbeb6c4cdd24485410027c102056620e45c80c00002ed704044b33f8535142000002e9e120d891f639f460400000bb5052084a0100001dc20009487885f454473c67614435d71553b3030820ebc35dd7b48030c62f77b195294384b52beee091891c1be7d3c5745d10c0d0c2a39113848500d75c38b9e70c200583b9f40d6560) <<< 16000) + 0x67104861881e000096081c8080e00406e02000a83206c2b0351581a0ac0cc460642303111c11e6875fd88013ce5903638067af644a140f06485190404aef3e8044044094b0840200600280eed79f210c08500f33e08075dd23f8081e4a1bd450090507c02004c0b0250181200f0a85c2b87a8e1e7bac2613b77011a6b503292c0b7b9b1fb7ecc89ca28337906718d6506ed2bcf0f1913f221f36877d17ab221b7f7afc28508b899a1c433928e0bc31bcfb801ddc02a40c01d94601f6886001191ae244f011360aceebcad1173f1a0d7286d93737a36b0fee82dd6e38892c0e6e05f6e83e0659616425520b66b5eda30cce2b85080a8acb0880cb24f1769a0669b0abb1808ad7271e050307c0100001a440bc4605c03a0893d857f3eaca2eda690d88f5f47a647fcb4b11b244d66478dcd5b0e3c7082134ae302c51e746e69209773992404ebcb673d8258f65d02b33b9f606023abc685851986c56a74aa33cc6aeac63d979c3c99ddfc2bedd07877d002d3297d3578df86c56306d99bce4e78407a962e63a8d49bb597672effa49ad87f60468f11576549aed67b44c2283ae7eb31849095d75259985aa4d77120eb65384be37beaf876761771b654309e2e91e1fc24631c8628000588205a12000afe38400192ebfe34f0e9766c1c77b755df1f684247d6d1924a44bfd851a9234d38f9b3769a5a00cf5360d679e4055ebaff140753dec700ca2a505a7494d5b2cab6bb02d666db8ee1f2469681558858b216ee140a1fca5b402061095d85011458f1a24e6a0ffa0c1bc1d0c173d8106dd9ebb47b86ab8a6bfadbee4c1cdfecbbed0de2318354c8d256f542ed5c89f03ec8e7dda893ace36b1d41d1c9c35198e26461d575bace73437931e609c450803bbb5e54343b911b8dbfa9c8b0411322361644e1ad1c3ccf60dd0923891c5a08413343ea928d18aa7a5e00981604a0302401c86acc91f290c28b279dc1820a1d919e2020031eddf9480c8284201002e01ec002da5f28fe1f8d40060548f1ded56db00b6f067959e0e53f7dfba929878f5fc1dd292507f2318fdedddd6c00000000000000000114d54da500f3decb92526bc1542430c21c0180140502cbc60f0bf5c8d3384ac25401fcc1465e3c258cf5ddc22e8764af53185280788c2aeb5c9fb61196d50540b649bcbb261a383147d3dfe3524130d73c0f5193a8c841d340011b4816848001644800651102c29c1ec365f248300098d763d100221c2200801584c0a8160520b806008023452d6906c5b5ef6565a0b047d42bef6c60463c5a07b39e66a9fc92f540a92441266ee1435cdf9f3d3d19014944159c122013dc42e4f4c70000000000000000008862ebc4c44c2492d159cd2988db8b72731e44bdc9054de3b6b200000000000000000218ad559a19a5816a20828020000047efcc91c1c60b8bd9d739c63b08626a6e8d0e19c7e3473506644f57f5becb852adc9fb10a164c4868a5988a3111430859040f5217c4702efdaf3143263d8955c5290c68389efcc384ae75eb85f47df7640845301701701fd035a953a000cda40a03604e0b0260581280c09007a296b48362daf7b2b2d05823ea15f7b630231e2d03d9cf3354fe497aa054f910b8f5ebc64b714f9e9e8c80a4a20ace4db02317c8e03864800000000000000000443ee1e1fd929349edaf9e9e8c80a4a20acfc0acd6eb14f88a750000000000000000010d030c208400300000ea561fc587c589d577b7e536d010b0e0b35fc070ecb3f78a3c1f3ecedd96014852432334bfe0779f3816b955402242e4d018928d75dd0707970ad73badf0c25a3865437e7e660c52c5cde614b0c6b639f2027c43cdecd15256151e80031d1000d682001c944009d98d08d8322ed3922362745b26288b26e04400c18f8c6e05620195de957304a1044010fb8787f64a4d27b6be7a7a320292882b3f02b35bac53e229d4000000000000000004312071c72841441822801c03e74b7080e00a8000d09eaeddd65349e80e4569c8e513668c35e577497bb05db3e0831fc80000000000000000008e53d7d7fcc36f0d3ca9ed2de62c2032837409734aa2317f877000000000000000002111238e31419219018a08e00b70c0100680015a9eaeddd65349e80e4569c8e513668c35e577497bb05db3e0831fc80000000000000000008e62ebc4c44c2492d159cd2988db8b72731e44bdc9054de3b6b2000000000000000002191030c29010e10810808c00a5c400401a0005764054160280b0230181100fabb77594d27a03915a723944d9a30d795dd25eec176cf820c7f20000000000000000002388e28a20619008e08608a00800a009824010068000dd90210101000807c040015ac400ce748028f818d5694f4ded7498c9b0702a279640291029018c18410c08a00602c8106ce70e13471c0551c7ae4179bcf994f89c315c38a03c03816101e1faa4e610185500d9b3a9c1831726a9195e7a2040f6f1949b7fc20880e3a9cd5040c0838908d742c02002fc453c12b0889c2ebdd0f888000008721c0514c70c2f03400e84800090880e08c06c4602a1b0140dcf2c8056f067959e0e53f7dfba929878f5fc1dd292507f2318fdedddd6c00000000000000000114881460c20850440420430142ca64ee96f0ed460c91b7b4e926c8484bd6e0d925daf439a320c618cec04288ee79a3d1d9479a8e44c5c0e316c4bd8162e14409a10d030a069d82c8e4ec20401ec6fec7e690c18c5d0ff2deb2c4082795a8375f1e1044b48ac59372c101101cbb495c061002081c3e8264f1000abdd4bd7e8454e2)) <<< 16000) + 0x2060c40f00004a6406844024120005a3347b92881794b8729418f5cade612190bcf2b6484e259650e48c50a40a284204380200b90801006e863f5b64b205947b92881794b8729418f5cade612190bcf2b6484e450c30c50a40a284204102500b808010068000b2191bb5496b5214504e1efa6891234bda1711c450ab6912c604783c87241011aecb14b880033770a26180278bfe6415a0308802000032e40643603003b205244568f163b7ada51492c6c68f05f4658744688a5a040800010bc484119dd83ed614101171dc60480139efef4020000002ee03482118042c80b441563385163b7d4ba6ee8ecb1b224a2434e4a58744159df7f0b1020000dbdc25d8411941ef6a0490300000016e360000001310dc0be83821681600007a0cf2c80528f725102f2970e52831eb95bcc2432179e56c909c8b2ca1ca1481440c50470020070100200d00014b3640a1f260080058edb3be037a996361ba64104ea48c0000170e50161cfd675ec89060400000007e00a080895ccec004801350776f100e0000002e14c0fe482150102c80b5a2eee800b1dc238771b37306000005bc320b1b28b3ea8629246000005c4900c0c00000021782c3a35ab748ec050400001eb3e8140000001ec300fc9042a0200001079a1c7a31997c9432ecb87b9b285e222c0092504f6fa95e94b042528e988900800005dc02400949d0f0230000005dba06808230080000ce90005f1202e22016090005b490150d80a06f7833cacf0729fbefdd494c3c7afe0ee949283f918c7ef6eeeb60000000000000000008a6863f5b64b205947b92881794b8729418f5cade612190bcf2b6484e640a288306282180100a9249cc6254b48074329a24d5abc1fc98adf9dde1f181192e3aacff1866a10f0be3cf3874dfcb7d2dc58354b9e6a36b704728043f588836d5d3805be5d5ac8f58c32187658112d281030c24322b6a34de480f5be851c8e1830000069780704de345d14610122b6bda8848025a65b8a9641612d1a38201284730dca938c1300a000076880988804824000d124005b9c80880b86558985fc73d95d33389cde3749efd5e3a5c4c06118b9de63933db14a4084fc387c860a7673592028117f42905aeb210c00727d190c63e21619cb0608030d22ea80c958ddcf5df633dd76f6b5e0afe381802e4dd8d0a0853d78e318b14feffa291f2991e0088807ebda7305067188e38f764c770b62052b7eb040544ed5771f94a471415c8a8ca564ca3b951dc5cecb84a62d3e7555041d83a69d0a592c3a0812448ad8921840a3e0a9b410491b6ed60101108ca088021846eaaed056eafa667e7ae7f5607a1370888e1a218df9072099fb6ef364417138e1374e1b6a0be6b082bf603c783e90382d96c5dd6543fe2ab26e76c735d5abd41b5587e1c40e555bc2490f073d6ec0eec67cb9daa060ddf9d1b15495818802c57d5058b380362fe4c1ec0a54aadba76b464d01225055fe9ac6a5887129665860d15e81636708125316f7a6cd88f4483a80b50da99df55ad7c8a283a80ae2194654cc6a93d089cac14acff6699bfe954fc9138f807b07873b2a645bca5c2d23e44270653c62ed411c24a5d5604619e1d54a06f3e3c8711bb656934e4b4363fbd1c3dca2a461ad8a60d2534c30e32205493f78270826f4e1af6160956d87ba080457fd96d0481555e2b7b1982084021041292c3628413eb04ba5028609fed1d710213313841900a6c0e12a0301c62766d8b3041080400004cc8001409e323a9be188e0d88ab491060813afb571006e6949be8c01c71d0580a4a2040010000104202003d14929fb62daf7b2b2d05823eb4fe7a57023000007ce483ce9f9bb9ac80beee6b2800084afdad30a873534671971511ba7a795ece22b73d8fc8ebf68800000000000000000000000000000000000000000000000006232051451c410414010047b0d40ab0dd015ce87b1fccf50bb01cc908c254130b538f4aeab9aa745b180225f748a845ae1dfa6909c7cbef76b77c22e466d82b8eaf367b2f7c21a08b3386a4e8eb0e97e57ac223e88500f090070480015f880686c03037850ea933e0a382210650590504864117a6020d3178ae381800c66bb6ba1800a52a8a94516618230087103845af6c58001f90cdcf5c1d111c14027056ff5a575de969acd2bb50504560e0b5c7fde2d5853c949e087041ff7564fa056a4f5917acc71cd28500385991912b0e0c4cc9a781d8de440aa8faded1d4cad34795e25e6062ac40c85b7110602d6cb48f15b2949d35489aea3a8a5d28c350920000e5480588802824000a40400584c800b769001c06304705712f52cee2043729aba30e60288000000927c0050c06e79e7c2760a100bdc68efe6914007e70ab3e6420002ed203f4e09800000061954132c38617814208a396d4f39e8818156ac97c2d244000000ea240810d5f1a9fdbb1c4000000ea60050801ffeaec9020007f63de0a2c200029015329e469018540280001da3c54fa076ffb444063baca29848070f094faa55988c188538484152102290cd917dd81048c72fc05110504214e040e6488080cf298eaf41403ab97a27bf62b329102b02400010f100901e1b6cae69fa20c2006ba909ef1c2000001d4903045c7656d5d46002a725f2b68800000002ee044000005db853081380400202400e120001ab200c1b0050dd164c7237ca414318f09591d86044dbe9f3ff141d5b754cae0404000011940140f8aa91292c300578e0d37f0094db62025450cf51c01aa739213006000077480200800c0400402000a65200202000010023f69)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase6" = "QuadFullFourCase6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase6 private def zz2190:"s088e"="s088e":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l15 l16 l17 l21 l25 l27 l29 l30 l31 l33 l35 l37 l4 l44 l45 l5 l51 l57 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xab029c09, -0x59682c120, -0x43484d85e,0x323ebc03c], ![-0x59682c120, -0x1f47481991,0xe1204b148, -0x55d7af032], ![-0x43484d85e,0xe1204b148, -0x29f2e8fc25,0x8ce090aee], ![0x323ebc03c, -0x55d7af032,0x8ce090aee, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xf702f7a1,l5),(0x202126518,l4),(0x26a72f5fd,l8),(-0x90797c96,l10),(0x5d1725f84,l13),(-0x4630ef1c,l17),(-0x6cb2202a,l16),(0x274f8bda8,l15),(0x10461ba6c,l21),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x21d5794fc,l25),(0x7bc32b1b,l31),(-0x3919233c,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x5c092e30,l45),(0x3a381e48,l44),(0x2cb417800,l51),(-0x1cfb5a47c,l57),(-0xc68c3569,l63),(0x135ec9a80,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x5d1725f84,l13),(-0x1cfb5a47c,l57),(-0x21d5794fc,l25),(0x10461ba6c,l21),(0x26a72f5fd,l8),(-0xc68c3569,l63),(0x135ec9a80,l64),(0x7bc32b1b,l31),(0x274f8bda8,l15),(-0x90797c96,l10),(-0xf702f7a1,l5),(0x202126518,l4),(-0x4630ef1c,l17),(-0x6cb2202a,l16),(-0x3919233c,l30),(-0x5c092e30,l45),(0x3a381e48,l44)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x6d00b200c000000000740c801000000000e8052008000000391102cc02000000e821013300c000531083c099003000000621902d300c000036110d0290020000000d4340b3008000003606404cc03000000064140a3008000000001d024802000128620b034400c0000000000c0c80100000000b870330040000002e0d014c02000000000b4062008000000002f01880200000000007032004000000000640c801000000000c8052008000000310902cc02000000c811013300c00000000190248020000000068303300400000188a40d8c030000000000f032004000000b0e0c0d001000042865024c30140000028828070c03000000aa0a01c300c00a7110120261004002bc4404809840100000000d05028c020000c8320b034400c00450c4280089004000000006400b200c000000019c02c8030000000004c062008000000003101c8020000000001b0320040000000036014802000000084180530080000000029018802000000000ac06200800000148840d8c0300000000005032004000000000340c801001a84f06401b40100000094110208c04000000822102c300c007914433009100400000000074062008000000001f018802000000621102c300c004d08c1200c9004510284110018d40180a60a209804b5005001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x8c06200800002d211502d0020001708229013400c000000002e014802002d053044069401000bd14c1101a500403845106602734014000000000540c801000000000a805200800a510c1101ad00405404182100cb40140000000015024802000000005830330040000001512014c020000a4320a03f400c000000000240c80100002082b030630140000000017018802000000920a01c300c0000026828070c030000000341407300800000108440b4c03000000044140a30080000001a0503cc02000000000a8072008000000015402c803000000260b015300c000000017c02c803001583308c04b4010000000002d01c8020000007231022300c00000000c40548030000000029015200c000000006409c8030000000009406200800510d01202ad0040000006a0a01b300c00000000b404c8030000000009c062008000490c84407100302a82782302274014005a0bc13029d004000000000b8072008000000017402c8030000000c8840e30080000000002c0c801000f02106809c40100000000005018802000002105003c3010000002e828070c0300000b90480343010000002c828070c030038873044069401000eb1cc1101a50040001c47611037400c00e81cc21019d004000000000940e20080006a1908408d0030000d8440903e400c000002c848070c03000000ba1201c300c00b7150220261004002fc540880984010000000003601c802,0x9c880730080000024904050c030000009643014300c0000025904058c030000000001303200400eb29c5600a500400000e4a85c07400800074290ac02d00300388a7158029401014c2083900aed005002846610c05b401014c2023840649005050c808e1019b4014000000312d028c02000000000b40e20080071130260225004000007204c079301000992041c02a9004002207205409a4010008d1dc150269004000008d1dc04a3010000021c7301a8c040000008c3c01d300c00000220e4054c030000898e1018a30140000224710328c040000007614011300c0c514a13003490050000000ac9807300800002a4970098c04000000a249014300c000002992c050c03000000a649016300e0a18f0e10116d006000000de4b015300c0000370930094c04000000d64a01d300c00003609200d4c04000000d44b015300c0000344990194c04000000d24c035300d851450cf0216d006033c5086803484014000001a8ac050c030000006e2d014300c00001945301a0c04000006915c068301000018e2840920c050000006629014300c000001b8a40d0c030000006629034300c0001422040930c05000005511406c3010004c0d41d032100402542102200c94014000013090503d002000000028180f30080000000f07028c0200000460e4021301000310941c0199004000064220c022400c0000000220c0cc01000000088140530080000000021018802,0x14320438c05e10050000000443c053008000000000f0148020000004a0900b300c0000120110058c04000094260900b400c0000000078024803001d8250740cc40100000000044054803000000000f00d200c0000000024054803000003509c06c30100000000019038802000000003500a200c000001609c04cc030000000584405300800000000b00248030000000036009200c0000000009018802000006a08401630100001a01040098c05000000640900c300c000001b024030c03000000681100e300c0000001a09018c020298208310246401400014e2040920c05023c3182501b240140980d809406c9005001504d0dc04a4010005212436009500400158470cc06a40100002b130700750030000a84819015400c0ac126184062900500170490c40ca40100a60ce11c034900500000000058052008000391b8280d10030000007a37026300c000001e0d404cc030000000746c0a30080000001d1a02cc020000007233022300c00811c42401a100400214750900684010000000231e01cc0200000891dc026301000000208e4050c03000000863b014300c00000218e4058c0300000000011032004000000003a01c802000000007500b200c15520e39c0f6d00500000000c970330041351ce31c0f6d00504b0708c1019240141231c2304066d005000000000a40e20080000020868054c030024481090068401000952142401a1004], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x16544e6d6e0f38901cf61292612412e70690b249e41219f1202e8aa3aab140406ee446a4c0846010b8122d8a0e588d03165a0b047d33109c1008c4c30b2cb28c20b14b08204104c01c82008034000498e9416998ff471452989f490dc512643e02a63163891b667e0058a4eb8c7ee7940837c73394858149edbb8a18400000023280e8042600c07f00800072480d84c0682603003c21878efbd1b0c0920ff0d61709480c1e04f82854e4f4a1dc1cecb06303c91cf518cc5d8368a145265635ef3a491494fb641987106019e4982dda2bc052b5040c1801e000086882a8ec15077647042e25eb192b2b57da0dac28867a6de47d058c7cd413407658dafa3bc32d1ebb58e86752bc8088455148534b12193de27910c10b3aa7793adc3379fde24752007c954d00ba6b1f0e603698626bca7bd8dbf4db9882a2862acc098474f8b2d13082d8763) <<< 16000) + 0x0a27b4ad9019ac9440506b7f059e30b1c0f0c7d21316058a6834b4b79d1a30209875ca1731e841058680206f090d00261d82060f7a5810461d4c75a4211a952040c40e000043a406c260341301801d93838b11243a50c216f8e4387103183de7179ad8d3128795acafac72fa48f0ab717096758a147898d82ded5820a7a786e421e8180810d2b18a83a0029b904101781c00008548003e71a17f44a6febdc86b448262a88d3080d167a19590b75343650023c00c601598cc8398460c3270e252ba2c500a8475fa8177fcf462d895411540e440b7ae96cd83ed3355560d92b1e85c295cd1d93478b16de49047e6c17167abc305e4d93fd1eb3a8c0ca3574ac2ad214320860000d88c7253e2ea1286c6a9ddc7253e2e9e11c32ad5104cc8919e295d005bb0c9de381556fc22874882a630a48830830420008022887aad6b971d95ecd20bfdb05c4040d05c948e8c7930575dceae53f011136dac2a5e30bcd5ec593c4050002d734456bdb32fe234080dd735d06f8121183d4f64e60b577450c8c33259af314100072a9135770981013309acd744cc100f1a6e97ca1e2102cfff5dc047024c3a0696fe5dca001cc60640880002513c2a6e7b5954f88d303d27663c83d1ffcb9d111921cb3b7b16b155807ed010289de4737b37c1828df8f5547a31a7dd9003f81c218cd0c7ffebe66d3a0812f14c5cb79e754c4090af0c314124904b37013bcb635797edd4881e2d100411c292e2e1ea6b18325574c5a98f307b71947596d010f46ba87f21dce256923c8c41f956785ef46f18064ac4b843e521aa0f1688e4e23f0485c236ad35eac9dc57f7c1810a95cb6b5708d5b1208964ad5d3a9f5187a58a195ccf093e12e6084f538da9d4b643e8ee09913c585f544f19a7218600019dce0527b6a6cbe388096bd802ba130c116e145ed0ec3002dc296bc6385028be322be800802251eb9cda24040fa6eadbc350211fd308c59a17b98e0ac0800003c443f4841f8220fb1187d04c3e4141f002e166408217c770c130880c8cb3410080576e89e8b840800001656c010009e5921495c8e01e5400743f409b5b90f06d040732f5d9ae7c103e2aaf2be45b8c40580500d901510196136452c1c65d47ab74bd12255abc2166a481267780369943889b3e93d48b283003b7bd6950a1837ee91a88c70511bdfd8e882107e667c7893c40a1480e28825022c139f071910d7203813244adb649ae340811f7954cc7541c42d99644a2f4705b5bb1584600c012fbb760520100772301133c11296da117c24d88142a02000010590500982780e44a40fb75d6a020499daa2de0a01c421601fae68c0823939ed155460c129ab77167d51c0100ce52caac080365aee16d2412a429d3483c800d90611151cb3071c2c028488ae477cc7bc0811855c1ca7980a180f7d2c4ea510311454be8d3618600638504e18209eaed56b1cd06019cddf58ea2000cd2b1f1d7f026b0396d378200b440e15812000086480022590008b721ee4be30bbfcbaa68f8205227c57786fb64890d3942425efc81127c12fa8d259219c0902244e931c23ce79ec5fddc10272eac3645a5c700440157d1ad38600af333640cd956ada430bc0c18569d6b55cf1183ab022c27969830391a8c0c996326806b25c78e29c85a7cdab1611df82ef3598c00020809405060074651a85d52000a0051cebeb6318ea04bc3554482a261458c48a38a606286584682083900010068000771e380000153d800285718f04f2f5d2488b98e40b20d606111f0a363b82910183b45b61340c3020000015381005848637241042e84081bb52b7dded940cc564e76a8dbae09002f03007b008000948d08526893abc5244ed9e8d9ed6901f601395e6b050f21c192c8b0503385181c14b0c100895b3e158a009e5a77cbf02018479f29276800002495a2c9010520380001fb2000ea043d407038d024b6040b02859ce5884be43248a603b56f2177ca1042fc44a2de712234bd629564b4182150bbe91d1ee4029286a6681eb08005ce3a66981108009ecce2738de5bdc9082f030615647c3490a3078f615800b96384188f5470c183e5e8463458c6ed5198340c2002d870b714002c83fdfcc2002135217f34001280430a891c1203cee660ea99710a15704b19c723eb597b90e2875e8497a953204083ae20df5805064c999ac0f184d0400002688e1902082cf00e60a360c01297a45b42c3f42400bc0b000047a6c969bb5c35ffa38e000005ad200b19fdc77b2e1c9628ff4de65c63285a02bebc4f20488d6f677f0e4c70c4619e33f67980800000b57581011190392e37f75200560400f40100011590006473640135b26a80442872b11de6bdace40e23e27b56c970a162e596ab69fe9223450b6e1bba81820d0572e07eb8400273e7bc933cc4003858d8250868200b46e9cc39fb59489082f030615900ac13096612005cba9fe860f7d8fc7c94a58cae5e0e85b250a129e9eac1248a0bd4ff5ae440805535fc06a1001d6a3610a148002801461426f20f4b9dfed130735e0286f32d1f816346467532d150b48a15bce6b61bb86f3438a20374161995a9e204117470fe9284b60a104e331020103c04d04000025a1ac49ec0820af89b8297e250f42404801c82a0000a84d920f1ec9a95b438e0000060ae0058c92be899111258a2a47c32d0f450bcad5daad5ac489cad5d19d0ac308255c64249023863e3ad78f6c660200000304aa18c9002c02407a0080008d4800368100092d205a130012013230b848fa322020574950853ade407442bc305c3470c0a0b27bed90e1245)) <<< 16000) + 0x7d60b708101249caf7a04c30032b7f57e740200331a890e1802018e3e8f89b85a89082b020510baa904089050eb628d28c0a50b35eee21f4e4889bbf6fd9a2486961dae3f8830604251fe65c504538a5380101001d6a3610a148002801473afad8c63a812f0d55120a89439429229220c19410c082094064000401a0001dc6ae17a1d28ee6b65820c783306b865c7c359e83906d8f4b0d8fea0000000000000000002389231021219018a10411208c0e0000401a1e8020001be200094c43cc161e4020f10100038d10f00d0778283b8041da0200236821d8530eb2987514c3a4a61d0530e72587312c140776407c60bade40c08a6177c101cb4ef55f4286357c2169920211004206140bb4d3080e8031ae2f14325cabf930b002df2213f0400b6f7f3709410880200002127224678a574016ec32778e0555bf08a1d220a91438a18e10811400c00405ec4ee4e27525742d0182c632754d7aa470f0723842c87f40006a087282c1bc07c601dab3517bc70a3c23a9c87091478bd38a3afb132f90b4141074d1c2381ffe19314293840401e856da3e16b9ad392fc041c4918eddfae9b79e731e7003328ce58971d2f0a20d12087a8c14646541decd93dece11a06588118a18ac198bb008f311bc05aeb8c22098b1192766b6ea9f023aa00000000004cec32778e0555bf08a1d220a98e30e10a11400600401302af0f3d18582bccff7903b3d88e8491a6c843ec41b40f3c199798bcab7e11ef59110624860ca220e80016690e40d8002f510e3198710cc384561c02b0df1586f0ac374461b8230db09829048368241b202fbb41e8742d3f8fa259682d88ff96e560a2412b224678a574016528696c3f3c801db4182007831f2a08145721348b3ba45228a73b6700000000000000000002524ce7c20db5b5a4a4ef6e82a850c4864820821005225601daa3610323188a7939b3b2091997a07e3cf65242008917d91913b8c5a8bd661960d74b7d60f18ca11d485eb588c11ff4774a2a01cee57009f66cbedc850d0d3bac862997566ac3bfc846c1a763947766fc53588cb1b1f0e94c226cb9c482ddb6cc8a5bb4ab4bf3fa4fe3e20009de1ca2825ec98acab3effca4020108bcd13a302a8ef6c82262f0a7072a0e4963608c2269f7116f0083159237bf70789bb78d471cef6f1ac7012adb861066f395fafcec41dce057a72125b655dcff47db10e8360811263298506e8f924f624c67155feb0ed3c2e86b3e1c000004f4ee687dc24d500640cd42cc00029610d80d81406c35c361ac1b0100d86a86c148341a81b0d30dd12304e460994289bce86d65099f0643b2902003d9b5a420238a9121201286110043441ff458e81f8e0d292d6de014279daaf05503cf76a1ac7080d0058f3acf54640a1944de08030007cab87070111ff9a41e20140055e5154aaa6a833c2dae00801c6393ef77ae473ed710f0005515b74676a0292698370f48e8b7bdb9961818316439000062a4348461a2230d00d86786c3383619a1b0cc0986584f8dd7f8362dce240404a99a3803d6ab424e3002200871bada0f677388cc510f0d0800d8d4ff22300210080000541d3252d3edd507a35241e337a541468c53a2e79571a6cd1d5de1c9ca46750d02c208b6995604339761a523d1a0f41aba549ebeb54e2bc1cafd12061b9d04007001107f3e85f45c81b753452b103eb1268e5eb9812a8023ad21d60e7c93e00005cdfe6764cd15613064223a54cee7a418acc8df0df6d018017350789310007ac6e579d1359ff018e3017a92f75988126e2e52450a0660ac9556dd03a8fdb5116e08ff1b23ec0242385aba2a01e27132a2cd031e61c0809dc6680005c4216c0b0c80585a00c2cc07a60308f130868f0457c8341438dfeacf7c5021ac2e78e86091e20d59a082b635a8b4293061100402c40712499b989b8501cbfb94b7091e7b8f970c178e7cbef0fb61ec5472748f5b5b9ca2522a08e9b7f385dd0a0426bf36c0a3224678a574016c3cde5c27de05b2260d6139d3ddc28068382aa81868e5004806edcea7a0e7e604e231dad7be4d22fb23b25aacebed5e1dfdb83d8aade1cdc5bfd0437e1ae9ec47b58872e0c8992d380bd52c6614b3ebd4d1bfc7cebd15ab047bba4676411193f280025d10a11500031d10ca1d8648ef06b270ac821231d719878ca0817b1b8083823d02b6471124142100806402c2d0061660380f342ebf6b2c31951642d901189fdadaca040972280a2920810804031c16162038924cdcc4dc280e5fdca5b848f3dc7cb860bc73e5f787db0f62a393a47adadce5129150473c8e294fc723fbc1c0000000022b4a559608a790fa8122a29a8554a298159400991306b09ce9eee140341c15540c2c3280240122b3c45eb29ddd3356fbaea22f43fb1e859cad5105349b05dc64fd17e66cc57e1f4801651ef52d9f865c432e6ed272cec0eff1cf47b29152137d3fcc2ae5fe1f45bf1dfc099965b5440236054d064f920a000a86428454000cf64001ed0d8b18c2d0cc8a04052efbb88c084ffe86e01123142300806302c3140618803f195e3aaa82306864e57cec708c8ed38eb2410e2a70c5810420fb4b441525142200806180e24933731370a0397f7296e123cf71f2e182f1cf97de1f6c3d8a8e4e91eb6b73944a45411e790fa8122a29a8554a298156448cf14ae802e5002644c1ac273a7bb8500d070554f2cc187088000cb936e659e37e3647c12f91fb88b359397ea737cbd0c602c4cf669b74524926165570c6670515503ae3ad295b8472f536f846da95345ae1c3eeca2be2b2593a3e28321e7)) <<< 16000) + 0x9500048a21842a0005e0206402000707202422001d26200444c78c00b5848bc0c199e857e5021d4b66883423bee3cb43831e73f16f37cdaf1f9b05000b34f18472b750489a818032b8efd341fc429d53a08046a501200c4c52ca43a2288021a468e4568ddaf3015050c4f6fd3e183aeaf9c18cd68f820b31c260540000c3082804c13c070040100461c213e9c408004f20adb860185de7e9118210004000029481900f0ebe32fb5c10203837d7c30001f09bde1200102bebb8100d625f37a1284108042010020080000222000282430446180230bf0d85f06c2f436178130bb09c8a1f2f0b0c5171463d811000c7f968f1c012325712212080f80402e826172130b80985b84e02b5c6565c61081e00805b00c2d406168030b301d03bc4e19a122183a0080b20585880f09133fda4beda2b59d74eaa0ccad34809946eaa966a77819a49353b307f8531057debf9984bbb3894cb9cff5441e585cb62a2b9bccbddd68ac7e4f55d8451794a1b712d127b0e56555ec3140581d0d9371fababb03d4e08125c7f55ca45d2be50642c5b3b599d3d623124c52f95057b18e3dabfd5217e6cbdb29a03520b463c205e9b9adbb8959edf9e729d1c48f3407460d18f60fec5113a98369c109177adfe9adbc2fe0cfe8ffcd27e600ee47e5c998ddcd67c4d2a1913ba0f919adf791d4757ee71ee06d105c1bae2b653e931ad1847cbe6dfcdb0bcc0377f725782082240c2d5e8b50218a9350662d4dc10b4394fc24384beb6c00b07c89e943800a84eb1284b2464dac123dec1789a82dc3d9fba04ab1b594f6ed88510ad8acf294c947c2d2edd54134c42c9b17000095620013d440c80400157a42c07415e22000c2b30040100448402a37ac50417d215e090380018ea74586000aa9a2184808440100000db215c0390802a457ef1420a3cd4be020b1ba7603220000f01985c1006cd04e9d0942088021008010040000111000148215a230ac1185586c2a8361521b0a80985384c29806000670429496148028924cdcc4dc280e5fdca5b848f3dc7cb860bc73e5f787db0f62a393a47adadce51291504734da1a2572793337d9180512673e106dadad25277b741532482451432421412005148c4a78c347227a16070b07a12b1929c55004377ef857b4d6f8019473b8e0f6ac02192fb25ea594dccb04767d708e189c88f3283996b4dac753a1be3b9d634fd376f88dd81326e20435febf069418495eb36cc00d7d2849430120d383351004847f694a84c20420108924cdcc4dc280e5fdca5b848f3dc7cb860bc73e5f787db0f62a393a47adadce5129150474dbf9c2ee8502135f9b605175c61104c588c93b35b754f811d50000000000262751bc6c476f82a8576cd0552673e106dadad25277b7415530b204200080abb09b316a5452a7037b347b83a425abb0414edc0dbe30fb7dcb9f9a6831744c74c68a8a25ed227d84ba8ef5dc90cd0c83ece1c57263e914b611c9bb1b21c4cfeb8b06c33c387c30577004e2b60ad95875f306c458ca2ed045a14aa000bd6428c26144130a10985004c27c160f00bb29f181b67ed0c2eba03d7a5a3f801b9d1201900dcbb610f2b3bbb894eac2683639f7caed7974288f460b787066f7c9407e4519733712a49fdd52dc0f73b437d559331e2ed687b8f08300d4af7fb3ff69ec014783ec70a1c389c723790de22cae84579982b16a74bddff81e51481ddc288cfab774be0a9cae26f4d1c4dd36ed726b0488fd70d2ab7a2de15f147dc7bebef45772f700c0c81788d009d9f495565a6ec6c912bd4cbc1d1a9eb438319102b0a9e80875e2339a3870f18d22ef9aa429f393b046077cb697127668dbf2965afca18663149e329514c804f008001b88e9b4344ae4f2666fb2300a26dfce177428109afcdb028d92155d3dcbcc1ace1770c8dac79116f5fd77f8a0c79728372000000000000000002193a8de3623b7c1542bb6682a8706386602580180caec5731505bd45fc103a9b51a9c2f75a18ef7540b8f34a782d27853b8cc0d23f825d076154f9de8c436341bdb9a43273f73dbe74404ab5a5f30ab73cceda90463b511123ced9471ec6abb3f07365cc5b94c2fb716f26842aaf146206430b94fbb820b6625273d50d64b54ac49cfc1ec0b1e76197cb8387427e6227edbcccfa6ec260066fc92e29f126fe3601978170ae315632406cca1f41a82dc635bba691412e33b7e397e43806a5ee1f9246cecbcfbfa22b376dd71fec12a771475de2c637d907cb2ae46ac48a8810a28667985a0600d02fda07f3841fd37bd368e046a32075b916ac6bc92bf34720c3bb49b88306e8cefb5452a3dfc92b8a0955c6e0eb860f92e500d2f21113d9a915b5661bc031b661cc19c33134170cd587772ffbcb8bfea8ab82c41738ac88eb88dcfb57b609c92188bc2b40001e1484e84c270261361309a0984c82c2601612e03000cc7200373442583400400e7224678a574016d92155d3dcbcc1ace1770c8dac79116f5fd77f8a0c79728372000000000000000002193a8de3623b7c1542bb6682a73afad8c63a812f0d55120aa1038618c0820900041e1abb4b7f0501e4b146724c696f57b642a2a190e4e6f2fba5ff57bcf4d3701b6d1c1cf527c27fa7c16981fee6e0894c0af04a99c4efc142c5fe73c1433fce0b04a40061eb820975b5c3f430138a8cee209010795044f04049b4c33642508220084dbf9c2ee8502135f9b6051b242aba7b9798359c2ee191b58f222debfaeff1418f2e506e400000000000000000435d7184413162324ecd6dd53e04754000000000098e75f5b18c75)) <<< 16000) + 0x025e1aaa241541041c23011c1140b87502e3310d1bb141ef03e0a3377a8f94eb9ae9c9ee8fd01c7fc4386aa157bd72fb87c85cdb067199cd51fdae994d410feadf1ba12cf1a04a1083684ee7907b0b23e6d3836698aff8512395093b4768002961000651212a1b0940984984c24826122130900984784c2382601c0a08d0584602822c1400176a400fa6c8037869c359ca42a246230804f51163ab0e1805cea1c634206000000ea24020814f5d1c22e3005d88e21f0d0a0000000ea330828a0214e705402008a110448882201410e02086010001109007c51201573e684b70fffc48617d94bfe4a3023e534e2a0a0bbfe15650400690f3fee8a0188f5b57c100824696ff0138611004284213eca3b178c1ebe851cfb5840e7d55ce8ed030413a41e65b2102241ab09214880a8017f78fe820616f7ab9a284006684df8c561c00efae9a3bb0c01afaaaaf4c828941052048a11f623d84a3078e442c98103e5ecbded91821080402140400017e4000c6084208c20c46104230811184008c1fc460641ba146c951db71444532c791470ca12277bd242106219e406085d260a360c2a7db336f4503817312aa67042200803e00c1f8060fa03a1c484da88b7838c997b35903a2040ed7412eb80a219439bfde9860c2815059512605153f0322fc18280b8d714888a1557c149668cc88042902001380e5a92e0a710be1a6c13c658288d977a8127a3c5abc3c6e8ce4b2efa0aadb0c766d0f7d08cb39369db0bb8d9a5d50540a91438e31020820c1100040133baa80f13113fef50a35ef610caa45e4aa35ae1f8f6db209a0896fc750657598987cac0b7634504fa9d60c3138367add21db846b9734000e30c8c8dfa24f7491dbe007ab7ef3468616a0d35826e87aa15bcedcf3ba50e1850803ad290d8de110a85a3c5e0c3016920ad6bf43b0a425aac816828349dda84f48a2c93b6cb684e4b8700e58e87933865c4f4c3281e6d9142b1f6b6c0fd1810fd43abe0b92572848c22cb4733aa3063388e0000e148004969067158330ae852f4fc2f9c5103ce57c001c35d77950d860879800b0208245e523668503f9a18b101660c2200803e00c1ec060f403b39369db0bb8d9a5d50540a88e31029020821219810c10a1061064200401a04e03c1c19e0392514397a3339991c6050ce9f54208956ed2ad860bca4c03038a1116418d542000b1e0e712100e42840b381a0308c02000033e41e4376726d3b61771b34baa0a8152b36010861470c30c904504a007002a774f083155199b800426c93ea2f5af7ecd7e714570e68000c5100047c2000c226447d00bf27860800beb83014226a2d588ca014e10a5141008002bc2581008c96ec8b1b041100201e0060ee030760183a80e460c11ad7c4a14177ad4e71855502d1f1c9087b18e056142d7681fd4440ba05c1b4226042200803a00c1cc0763033c0724a2462f466733230a0a19d3ea830c64516ff20a179498060710222c831aa8380163c1ce24201c85081670340611804000067c83906e885737c008c74766dadd74ebc1b8082271efa85c1636606bf303a56cc100c7f5d0dc11aab4a991c93a37fec407a2b457d7561722a970c8119c3c480a1a60fa51959d58e0c88160ad71800b7cf3c7207ad2c34338969b4280abd918ace9db7fc7d0a969358649fc6cf4159120e0b3e614691200001cb90006e220640200089e20e21a07009000d12906f01d8e4929bc7640bb80739b25885c22de26384876996b45026ff5261c402f201127440044fa13b838178500230d008400100640180c80c188078510060aef030c0af3a612a3f352448d383f9b162a397936cc6ccc1fe9921ac885808f5e94db8487ff784e6458555523b72a7fcc5f62dd8be722a980801bc32d9a51f74f1dfc27ed844400cdca30a43517ce04c82e59cc6f817103dbf0b731aef16066f55a54c8bf3ac240b68faade6046a12c01602c0ac17e63d6a0e140c24f993431e60c86594c8b305f98675a280000147de2a5002100860f4b2974c9cc158294270818195728cf3f380051fe1ca8600e5014a67a500230080000861b281d65cfd96459020bd827010346806476bb6b8c319bad9cb3a4d08072b63e278082002a5ea95038000000927c01a018e4b7b5f8c6006d93aa56b6649042901c0001029b1c7fcd6bf2688a77781e334243219152161470e8f5f49082727d98220321120ba10815f74f2051382108042ca0000083d6006188b03e1e5881451e2f25f918041091ef1e84fc342526840a71e49046a26668e861018477eafdcb8d01de19546f331a89a5ffb1a872010a80a000040a4000df88003f11000bc1206403c144a91ca3c02876b805c48618252c6e6d87120acbb6d0d64204052d079f850008eaaec372004fffecb4784002e131ec3da4021280a0068060dc0301801e9202385b9f34707ddb5130e192580a80ca0bfc925dc86821bf9ddf424038be77bd0e01947d5af49c108402002e0b01605f90715bb16d2c80450cf489431438e329cd1762ce034e8001d94c6b51400a8e5b9a00002fcc5b4270021008791a821f166943090fb9b3c38c4d71915f9a28521cdeb630a37fbf32090190ea2785c7813ace1f0ace0044010000163392c6c195c8674b43495d43ea65d5e20f437f4263e1a0fde8d062d0000000000000000000000000000000000000000000000000000000d8270e48a30a28838478070038060100401a00048074a1a48d2ea16401de82d18a1893b2a95a80a1739e990345eead82640611bddac710000c1a2427d3801080430bc3311ca9146e4ca6178662)) <<< 16000) + 0x34893efe8d046927510f86960591641431a29e19610611409e060000401a0002a26871c54db9e91a461818bc1bc0d3024512e3427bec98615c418816e3b930467d79e550320a0469d60a6a45f1c12b60ee00a02ce03724d79a62f01a7592d133feb11a010b80e000045a40014408005301000c033834bbb36d104102f298d64500c768e3e720031d5b0658c0131876b759410840200340306e0180c00f47225c1f938e20dd00a52c702021484f24608420100170580b02ec82f73650050c85a3c250d0f4da80c0c6003e010b201ee54288686b4858fbf281079007101a044ec129b24002100800006a9a1c35c0eb6565871c2532be937b461a5969b0172d051476663efbbf0b1013f60155a68e0868224dd848c4080bc9ec59968f0047ac13d4920e005babed59034c1e410b00a000044660800fb536440a47e9c60c69402ee4d58b20154014e0a1c5aa0ae9281073539253000f8042c80037f6d50c282efd08d050c05ff4970184045b93392810dc9a7229a050b3cb01e600210080000979a1c452a942596438ea7096b824bb186b3605b44e110a2a6c1d97bc650c08e2f088c9f485022958aedb814380ab6821854c8180063746a2dd1052b1945c4494a9e010b40d000044640012b080044b900098620015c840064288368ec1b0760ba2b05915d8f1eba07194cd6a403a6aa5cdc18d001228278296a97c4f1bdf31e3187870a6028ae6d1b3ea6f368bd31aa3542a376601a22b4de0cdc928f17def2da3be2c9ce0488126a8cd100dcdc4291dc34f6df1600a20b5567306a20fd480a17d22007140028169aec027f47ebf5d7b65df6254d0e34301a3ce1dc21651f03023b0ac2ca1a9c28d833609184fd46a536ea18624537fde7274614f012e2fe594145a4076686caec510f60db3fbb241040908a9cc7794d01d438fa226b00000081a95c2b10c021701a00008b0d123d150f124d0d1db76b80a0199028b73efc53471455ca34092438208d2c5c80aa50c0d8ce93b03fb020b342a94440c2006ddad3ef1e6281c1c60481588216484158160000874c90586ff35fc390c18428e7cda3f20e21094fafe57a31043d85a6d67798187d5bd8172f414309a1f4c2522970410122ad064ecb1c036bdf02c2c625ad87c692ea24e69e030bc0e00004744154460a82391416f25f9684b0a459ed561c58e1908516176b548926401b1237691cbf5a7a891026169de0bb545f9aecedb8fc78d48610109f644c10d310c7e9bd4f56e4110411054dc7d6c1157ca8abb49b2ceed2070035f3c6f83a7607fa0450aa3cc816430c08195512c6f676d81637f6b46e8d76ced7c53445725a828c08e8298b281fe3f2f59e0c48c1070563dcf9e1861480f821576292284c25803669505170fd5008ca7b62088ae403d3a56534032794d1db534160047adfd9839182612d2fa718967118043103c000124906b09f91c529f8e47f78380000000045694ab2c1109449a39028a28820618209000180c0100680008e106a0df91c529f8e47f78380000000045694ab2c1109240e20820e18618411600e00298140100680009010008e832300c7fcc9248a01d6cac50a2d93ec668c4080b8cfc7f1010b7fd2a5c4000394ad4513021100428b879317c310104218b19a4020e9086ac160235c41d124808440100000da34483fc7e5eb3c1881420e0ac7b9f3c28a2901f042aec52040984b006cd2a08261faa01194f6c30c75e8d60db4d860064f29a3b6a6828008f5bfb3072301309697d38c4b388c041881e000092c83484e480647ad9f4bdc0c187e7a07ec0e7b1c4075b94714ba3c30e44001529eebc18201c3e2a8732482086fa0c0feb8501c020eb3c315103c4001b75a6ef31660014cbdbc0155226792040c81000004b27c8e294fc723fbc1c0000000022b4a5596088481c60c30c608208104a0060014c0a0080340004808190080021ac834048044240a412001cbf3ba859743116cee08ebb701512c72c52c30822010c11c01405a1bc088d385369f695a3fc52f44768c062405f654d3065bf9964fe86ae9aeeeebfd684f61f1e95ceb6b8519d9c64000000000000000000000000000000000000000000000000000000d729001b7cdb611ca681666084844042043002810175d9ab39e519ee4595cd66ce8514feee58c3a32e4f4f9222e913c6f66eeeb91ccff2fe9f7ec62bf78af87d44de7e6e09e54a4001152916321e0094fedffb6090a3aee8a6da175b78a20ecbc88025071687a6310a1978b3592060392f90b308a005cfe65d04c0844010d1464f825ed74714000013c680510bdd8bd8f4c41000b70993c0a0d4482a59d6050ce13cb3e730c07153601a058d0000004f1a00c016e7e4088e8d9208500380001fc200069c4001f4083388c198460ca13b173071f9a4b0d54134ae060d2c2a1e7090128d872f47022fc79a94401184dc0f4300c99f455059c30800200c8030630183100e0704f1c9f7183019b566d0c10345bda183884f71bc4c180a06e2884880321cc4440302848fa02c1384108040184160580b02b05f8d2409230d3c41543ae141008436e37747043690c2461826046053f20003c8f4108601fee26c789c1084021e326fc6d9e4788197a72d50e096ca34ef6082010e50291e046dabbc1e58000006ce7b3021100400004dcc0714acd31210161d7440d72430f15bf9d1008aa90c69d240067b8ff14400c08d6f4a980088021040f9dbf5e7202b1ea8986d4020fd916f7c08222601fe19002932089404a004601000010d3e58ef044a733c61c980a6e8788751857e8cc08000dc9e8101)) <<< 16000) + 0x0000044703c083e84080e580000017b76700230080300080005fc8001fc1f3f1e55d1043c6448029388f13013388d3402000017700f0a58851c85342000017700300de327caa9c0088021e7b3a03fa66759e592cb54b1dac1e12e033bb3c981a1000008954401408000016e3600208b3bff6c2f01e06e801a62f8c00000001c9ac107d1000580500001e9392c6c195c8674b43495d43ea65d5e20f437f4263e1a0fde8d062d0000000000000000000000000000000000000000000000000000000d8271470a7067827807006005018000100682f80800094c82f0080017a8f90d826c13f2c405e84ccb8c186059e84440e0fa0893440046bdf3b31c03d95c4af930210804224933731370a0397f7296e123cf71f2e182f1cf97de1f6c3d8a8e4e91eb6b73944a45411e500289ed8bf72cd326f510d41054cc2cf18b1040cb00302903f998aff9c337c216aea23e88634bc84308602559c98a721c77f436350e885552817112ca741239dfe34896b58132e19050b026c9794000e60cdbf9c2ee8502135f9b60535240322871420c21c1380280080613fbcd4525db5570a4d109e75c2cf47084b0b68000b21a283372937506885911e7069122000001f4006856b531db740808d721b8b74681418934f4c0e8dfbda01142b340daf000007d00140c184c0300001c8200108c40054a4800b71900189820ba2305911d8e00bab97e2871d8ca5ad10286fe1ec10a13759e93be3862c27a6f21c20ae9e5980a02f3cf5d406708210085100dbce8319f2b78b2050791f7d2c5e687194213d85cb67edbb8c04103ecd76f2973689c282323c200b2dc1fd4300c21094d8f3ad0fc10001a2e0973bb2d8c84001be56ff06bd27809104cfea8083d0740001441b280470f45e0964d22b40c2a024700000520804860d71ff3d3470c1ae45077e861baf716c2e82c079cfa48636197878bd8201ae464f9edc70c270140000ee9a224ea3c12d508180000119400b14d1cfef867cb0c72d03299185042f02c10e04104ae6bd5b590800e5a00d57306012fd5600e842ba9f38e02030810280180000fa991f81876b1679231b7de62ba21c500000acda05086830877ac87058a86e89c8020e5734364d11404b5d148abe0000c8c04a8886b572167c429dc0a1380c00007b8823808170040a40205b01000534105a0500167f100711f205a120030141ac047f52cfddad967e2b82980d6c26c5f55922a5d0948914708608508504900700548b82e716cd9ff24937a3062585af5ef79fac89e5964f623c07186f14e82c82c160160ae0305601d0b0ce38efd1020f1a563a440447149fe3900250051318a5030880100a603f238a53f1c8fef070000000008ad29565822940088a14810a0880870050040240e457c5e48685fe826907b5e43875c8b827c7fb6eb0e20c822d0001cc20aa2b05415d0b3d87dc640810d98b22bb8c086a823e4920033bddc6282a48284601005301f91c529f8e47f78380000000045694ab2c110ba00b17c9014450a40850440438020012157380f240d6511ef39d7b2d78d4275f5a443e06ae03b015c3a03aec12d01e95c1fc612b4f36aabc30c3a0ad40009e48001c81c2013a67804203b951ec81230606be7f1e06096aa5ffb68c085722ce2e0c144b818626500019bef290200575a37ec8a885040460100001a820a412000887302191870a7a14806079db032e5c5d02825b3cdfe15e2420054812b51893006004e9ebe8583e4101b9f6f67b94aa2a2089d5c0d726c21099dda1af5040ace718c0aa9880d062c3104000012310511902802c13c0784163779c78a095230641c404ab3a20cf201ba8b14e98a0aa399990c801ae01401a38005a5fb7409c2084021a49d2dab8ec90d5df0dff440635ae752824245da61881600029e6258a01635a978648132aeb05a270421008692035e0b072c31972b95d921c20dc88b490a6d6d6cf4180807206cb250421008000082100027d20881b0430d82706c1343605e1b02e0d82606e44071bcc461218b1f638f430c05e3a2406041c24e753242093cc9c89408cd0b750c702a47b73af3801080400f80607a0304b0182500e4437167ff112112782761cc050b00a1ce48220d4271524075664eeb0a05028cf128466102100800009b90401581f8ae44007401c28486171b17c3c30f99906e27121017e9c7b51c023203e0f232841180400f80607a030490182400e442f05cf5ec9083f6dca262401552a114450294f7325410004da4c7d054651822008000089900029236188f4bef9a486461c675b901050fdec1e105bdeaf7f312003547af86328411004005c0602c030470182300f042a9b0fbe9222a1d1f418905f5f4ea6c402a9168f5b0c1fdb08a8808928a10804245344bb8f5ca02b100f9d354bf83889212a6cd25b47c53bc609f40c7f44de5e36d39f72e126b467c69f03ceda482556684049b2680c9d0784906c5a31528ab70b246ef9e46689883a1205b78d261339c1ba8e62564ac18f266ed5d57ad5690738529e6895e4969d08153fbf81c68e05d2a377616788e8fceca762eac849542591481b50807a0fa9fe825617320a5b93000012108002d590320100039d1025090006a190451550c2990abb22460eb4c552903088c9a828807b768e808103007a2bc32007a3218410e0017076c4409c3084021238881c953c81c00269cb84848776bfa70c26c222e0a940239c838e89028d9d1cee0800e1ecea509c2084021c504bc4b0e2808ca8814e48107c0110040100400001110000b52000460411046086230421182088c0bc4605c2)) <<< 16000) + 0x302d0de02431a4844a076daf59216057953fc48c007c02007c0303d0181e00c0ec07cebeb6318ea04bc3554482afea59fbb5b2cfc5705301ad84d8beab2454ba1291c48e38821419a1141140f197416bed75ff604101a9271fb9b30114e0c9024c51a882c0c2ea8c070b0e16821c324073bc7848a8015050c0cdb85238a0c0719bac08408b3ecb1e228018268092ea4a1846010000111200075041005607e2b90c3b004a244841ba021fd08297fb8ff90c6104201003e0181e80c0f0060760382059e849200a2ea8de220a2c40b419e0922084787602f0e0940a47eab04a104601003a01d80ffca9cee50146e053b404830800100000fc40e43743321aa5f7e29198d28a744a3c029fb6393cd4d54d55e478692ca5307fc64f4939369695da1ef6625a918575ce2050169a11b3350a80a9ff12dea7b0c7ae6c1a2f2b2af58cf5fbc61b72d016ed9a28308e0bd8d02d4cdadfeea5f9230a4014aace1eae327158ae0f61ad500eb1f909025ad272969991e399888b9f9c5a2beb6f4267af492d850b5a6d72512ef7d51abdc8f98ffd173a27d15c60d476d43216e9f3fdf48066f8e3e299c73a50d03eee58d137462156651c0002dd10007a820011866008020080380180b80c0580606e0303601c0100401006a030340181980e80a8cd039b27314770357138c082d88c1b219e7a75ba3ff0e6688f9e05c82b246db0997708ae54acef3a8b55b8bab400d60c04759c8c810eb785fe18a480fb9d4f76bf46f2351002d59f586775508cb9ac101ed9af7ca2316017610a7204228f61564a28859bbfef5f8f9596de47a46c0846ed85f5ea3adadb001610ef2e71adc60b59b52c63b88c557f6d9e79ef9a1732af9086f4c5a4e39a1efcbe87da3ff1a8e66de00c167598a8f3fd53d0ef97fc5c1fb6443c974fe43b4f0f164b589543b8ac17a7c6e9467089d1817f1f26b3f9d9dcf321ff454c91fe9e2138078ce2bd40e8abf70a24cd987b7890b45a211db6ec0003c59c315507c4cafa05b8afba2ccfffab1443c1b3e3914b4a12e510d52c6a65b35f4493e8a7706e46c45c9fb8bc448f448a490aa94f17fcb1edabbf5051efe78060c211f5e6e7483c9129a82128882a89a3358ac5919fda4bdab99e003f99206ff06076096ad510a4a53f4344b673c775e88e951369399461377976ef66436ab39f788728b7afd3e17729e0ba257282d9a0f634d5443cfc32cb592e289e2f07fdb9f641d0e8766f81fd2d1a51d9b7a092ce4217d45b3563bc9dc98e4b79d142bfb7cb488de4936f1fb983eb653051cba6c3ba9466874fd980ccee14f4fc2b65d649ce38c5599470000e564003d3481900800402081306809424003c1c40089a4e9b4344ae4f2666fb2300a0ab85e874a3b9ad960831e0cc1ae1971f0d67a0e41b63d2c363fa80000000000000000008e450c5022822021023803002a214522ee0ff67832aa06eae0d9220efad2f518ab0b3530127a4e201e401cc5b82bbd0a834e8f6a42ebcb4158f7acd9bfee518e58dc203ed1e1d9244ca08765ccc0c79aca9301c31f39bd83040c523eddc42000e17daf545004e95bcb90c0136eb365c4a030880212262800475e6067923619e0e1855c2aae8206af634a1d98085d65709224a184401000010d2062130300981784c0b82605a0b9b7f385dd0a0426bf36c0a6ad090afd6ad090afccbd5da4b08000000000494e2b29ab2c20593a8de3623b7c1542bb6682a84883862061800005dc632a5af4670a298876f1052f033e07750d4ade7300cef4dbae27de13cbcb9cc1e0da416bbe93601538f99a845f14140b0060560302a0181480ec6a631f970040c00ed926c8e14220091411228738713352421af4b22b410426c3729b066082300801400c09c07a6d0d12b93c999bec8c0289b7f385dd0a0426bf36c0a11631c292292112010004021819f30c6da126a63c3a5e9fbfad403ffb81a6e044bedc419448a0003c074da1a2572793337d91805136fe70bba14084d7e6d81422482853442041442012005b4a8960375f24eca0b86621ef24f06189b308c4372ee38a3189140007808002af902605012808002508800642902409011848004134faf7004a64e0589428618c10e08808609201000e00190c01006d8c4f26362e44127ca4e0bd0618781e3d52202058ea4a2020509eedd4aca00466ba46784c10460108040080200000888000be10221181088c0804603e230141180988e00802008a2ccb66984710181a4d6cfa9600573c236991821200400002c880f02c0740704b5d117cfad89ffe7ea15420172e8a15ae5cf026e72869dee577fa5fd4b4303c921bd5afc93a3a0476b94b03fcd6c6bb007006a8b83783c0bf7765962f1d8c0da5a89c0ced0d4a8c352b9f20bf4318432bca03f186bb651d5aaa772ace70b3e75d6a001fbc0c8a98cce15341c5a6c897936b86c5991dd859d31e9523cda5d83c510bdf365c00301447077b9fa0ea127aa63ff38012e5b1a0cb2685a3123f5876b8f477207d1bd83babcd83dd2bedef881805dcc2360faa6f1a8c0dddb51793ee48db1ad2a510843a06e599035c739372fb4a5db6d32de8911ddb6824557b654ff99f714f974b9e14387459c7cf44bb40211825800003d31c3937f7ea5b24cd0426c0dc6c6b595e1ce331966fa49c4f4a1561832542f92552c5797536683765697450860daec860809215529e2ff963db577ea0a3dfcf00c18423ebcdce90792253504251105513466b158b233fb497b5733c007f31800dfe0c0ec12d5aa21494a7e86896ce78eebd11d2a26d27328c26ef2eddecc86d567)) <<< 16000) + 0x3ef10e516f5fa7c2ee53c17440ae505b341ec69aa8879f86596b25c513c5e0ffb73ec83a1d0ecdf03fa5a34a3b36f41259c842fa8b66ac7793b931c96f3a2857f6f96911bc926de3f7307d6ca60a3974d877528cd0e9fb30199dc29e9f856cbac939c718ab528e0001ce8809008044040200201c0100084199b7f385dd0a0426bf36c0a09428a29610c10e090008004066c17222558fc6f6a7195027dd06a31aeb81c4b0bad8ca1126d7a186a7b21c6c1818caec6a4070ca37f74503025c9775692000bd3896c8201785204fc67082100800d80c068060320301801c7253e2ea1286c6a9ddc7253e2e9e11c32ad5104c9b7f385dd0a0426bf36c0a370a62f9d51017566f427bdc713d676fef0bf64a32d4e7fc19503b55c1524400000000000000002021c49248e39e30c045fb1518e59c3bc2d409ab3422228a1f885a70266b22dd2f05531d09d017bc21696db4294758c0fcb071be8167d8e60ea240d3515ddf4e38b2951c81108fd0fe4ce24ea828c9fb74b0146a5fdc9267739f85e3c406c8f9bfca10337b398228302d41aecc408ae67a1382801c4be5ab99c10880200002ca624933731370a0397f7296e123cf71f2e182f1cf97de1f6c3d8a8e4e91eb6b73944a45411d36fe70bba14084d7e6d814ab37a13dee389eb3b7f785fb25196a73fe0ca81daae0a922000000000000000010250024389309249284180a080a485b942fab69d1132508e16cec48ca9c83f0e3ca25087742c02884dda7c2c40c99fcd06c49adadd4cc7c9906d742911503ba164df90eb00eda3a999eb9d04ad3ff7c91c3fc51f08a3fc7c4660145054d4c6e960b171ead124ce8f3ee005081c7c6c278811e8cd8a485003a6de55984000a7dd77ecc08440100001372000d9a405c1602c0bd5a1215fad5a1215f997abb4961000000000090e75f5b18c75025e1aaa241523ca34a28a2c72c34021c008030080200df2899f382ea2fb7aae23ca2aca72486258cd107dc8b142440a77f04cd20843ca1427ebb9a3ebd622a0d0b0c2816f7484c65f8ac5c80400306f1c6ebd322380b0052caf0ff32a920dbfca0063736c706a68d385e0844e5e5dc9008901380002e83c4aaf43fa4c1292124994ebb5a3bb5e485080df4fbae4cd1cc9102a5184ef427191410f4e0da4125c113c00000830ae0c1ba5001cdffb122f62489005dc1d6d4c1f9b07a1202020dc1500004a04054351c94f8ba84a1b1aa7771c94f8ba78470cab5441326dfce177428109afcdb028c8919e295d005d59bd09ef71c4f59dbfbc2fd928cb539ff06540ed57054910000000000000000081ab4242bf5ab4242bf32f57692c20000000001229c59658821006c57227b16e3a3fa2bd255d1afb9137fa10ab5501b5c3ac2f1adab7e1cd78e44e65aa8c3067b7bfca083b6f977157ab807a8438711d0da5bd816dab92cfbf9d1ab3ca052c8b30f824319ba5aad62277edbc80aa49b5b2f7a43865e306035c6efe460c3ed0f1e43812d285b6281049735d972300273726c683003fbfd3086704220080000b29c2c09291b2d14543b4b95682c7019ef605458a05323c5385083169c3640e083df55dcf2c015895bd5c0000fc355a692808230080000ce9e75f5b18c75025e1aaa241512ca2493c714528424410128060e129b6190914a42c67c834fe406080c480aa8000ac9000a6120022fe4007b8480105810141180988e08e8a0f75189180fbc89e62c44629961945115afe73941403e1cd4b9465082200859239b6bbdc9044ee1c4bf058844b951e2960914bb89ae1023373dc729202780a9cd8000358c75c624e10440100001673440a657948a20cf4a69e248080fefbebae194b24450e617897b4258d569a6871f70feeee2522b7f484141ba3ec11f54b7db1f7e0c3bb544f3891b3a9e1582839ca4ca6e6368ecfec08007ecd8b6a19f8dbe4920d54b9bc3a49ea944e316ac0082080c470980001951c8919e295d005c3134ad5d1455731bffc7a038d3e4eaf2ff411fbc58f2520279384000000000000000000000000000000000000000000000000000000d6440e48c30c606386082380300818100100680013c9818307334408a51bf19c8e303ba48d87c4d90a03e205174b775653f38edcac28b754ecc178d27f01a5880567ad131f82f7f6dc6020c9413869d8b19f224e180260a579b7f00e764a22802f67bc48835742023941570955518a39c838492b3f51f8540a2384c0000cb8809008044040200200f010006019002e78201c1200d0500211e100874120129dc6879fe51f7fb420c1156c4e67893630200000a5a2de0a0d6e62ff0cb28202afa8599a28a0602bea13cf54e81000626264d42da28800190aa9c7f70f1372c2e02c64b1b0657219d2d0d25750fa99757883d0dfd098f8683f7a3418b40000000000000000000000000000000000000000000000000000003608e38e29020e20a21018e188022a60600401b045fe29b0f6210301b2de4cef9220000002ed410211ffec5e108e20000002ee00600136935215820007562738a8ace2050010823a4c8853b4103004bae3d0b2440000005da84084d9c71b7d471000000177010007f401e8b6000000157b13610270040000c0900c150001a3100b0d80506e7733272b1341c42a3c8ed3709a7de32891e4b0eabd5e780000000000000000f8461861070860850860040149ce6c52864d4a7d5b72f455ef22948c6cc9c1c2af3ba7efaad2cafd5dd12e01000de34b924a8f14000a6080480800227480406801c3400c0a00501002008002c90801a080085400202000010098c19)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 24 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase7" = "QuadFullFourCase7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 24 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase7 private def zz2191:"s088f"="s088f":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase8 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFourCase8 private def zz2192:"s0890"="s0890":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase9 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ private def zz617:"s0269"="s0269":=by decide+kernel theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFourCase9 private def zz2193:"s0891"="s0891":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase10 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l15 l17 l21 l25 l27 l29 l33 l35 l36 l37 l43 l46 l51 l54 l55 l57 l61 l62 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2c029c831, -0x59682c120, -0x861c43920,0x2a2155f8], ![-0x59682c120,0x5d2182ece,0x26275c488,0x727c1926e], ![-0x861c43920,0x26275c488, -0x24524ccbaf,0x596831ee0], ![0x2a2155f8,0x727c1926e,0x596831ee0, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xa13b,l9),(-0x97278,l8),(0x3c763,l11),(0x1402e1c3a,l17),(0x685981fe0,l15),(0xa3a05046,l21),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x5d485a400,l25),(0x2cb417800,l33),(-0x2cb417800,l35),(-0x264b5149,l36),(0x2cb417800,l37),(0x5569ef8c,l43),(-0x6348a40,l46),(0x2cb417800,l51),(-0xd258514c,l55),(0x95717e0e,l54),(-0xd568b93e,l57),(0x1f52835c,l61),(0x54d0a552,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x5d485a400,l25),(0x685981fe0,l15),(-0xd568b93e,l57),(-0xd258514c,l55),(0x1402e1c3a,l17),(0xa3a05046,l21),(0x5569ef8c,l43),(0x54d0a552,l62),(0x95717e0e,l54),(0x1f52835c,l61),(-0x264b5149,l36),(-0x6348a40,l46),(0x3c763,l11),(-0x97278,l8),(-0xa13b,l9)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x75013200c00000000881610060000002f0b018c0200000000108164010000000d4480530080000004a0a079804000000011404c80300000000880164018000c8461a02c400c000000004c0290058210d0c20234100605187608605168028013031084035401000901c852065200800410cc23025500400000000480124018000000003c0520080000025048059806000250982402d003000000003c012401800000000a40620080000000268099006000000013002c80307904505a0318802800000002c009200c00000001b0049006000001a024028c03000000c8160386018000680410026301400000340880718060001ca3140930c050000000e8c81e601000000622d022300c00c22c026029a008000001a0b404cc030000000c8b016601001443308c09a4010000001908811180600000000090188020708c11180324802839c6389503db4014000000005c0290040e610218409190050001f0642a064801800007c342c0e400800003a1a1402a0040003e108640d9003000000050301e60100000003c1c0a300800000001780590060000000005018802000000000700a40100000005814073008000028862024180800029088240b50030000000000e064008000003611014300c000001f0b80b1806005c0a01c0175004000000004c0124018000000442c06300800000000e00490060000000012014802], #[![-24, 69, 8, 0],![-21, -9, 17, 0],![4, -35, 0, -3],![4, -35, 0, 53],![4, -17, 0, -1],![4, -17, 0, 27],![27, -175, 0, 0],![3, -11, 0, 0],![17, -60, 0, 0]]⟩ def dynamicCode : Nat := ((((((((((0xc2422db10bf92c900d82c2c54b200210cff532c3811359c224b0757acfa24824000006fa3b66002600801f00f4dedde3106a34905d76f741306054079c173050000cb769344a80012cbf3411392364a20000000037949c0090021848ad63c09fec81c6000003e9f40030c000000002ac0d1248a2ba8e3b7922002df4553e1e1040ab599f2fcb458414f12402bfe0708095a6a857090800209ce615c68ab09002f03000011f10003ca207a03d2a3ea479d030a004521b00d2413d142303449f4edcb8460829becfef2800004493580000001c3a667042200869223a2788df943000003a9806891182746b508201a4072f9c5840000075300c1034a9897226805b8b745f094704260140000c21d361c5aedc94034a340a66c09ccc28130ed1a11e244018b63032c020803fca7460c1810447d9eff0ca00000a637bdd0000000633ce91c88042a02058fcbf665f1033503c797f02b000000001639bd2e209c87d941011a49431a20821608c09a01704010068000a610003402000cbe68ac253dfa4f426bc5ac8ef1fa842c91838c113cfa429ee7e085dab00dd99e81c314be610410cb79f3b01164bb92e2a4b316664bf2d7c99f365154d5a8ccb03) <<< 16000) + 0x011dfac5bcc387650eda7828fc325305dcfe5364dccbedfc1bcc90864056641810013fb41f1536c814364ca157341e6171b8167344262a60fc81750e5ed4c0301ce60ff6234615c3afc35195b3e3168dfe44c8b7fcdae26b5b807ce855e9e5f1b1855f8d2e6ff740a7fb008128b2c15f4c989b1f362c9761043c0d20000bb240f0360761b9b6d886c93b57546b6a70544c30b2450cb08c04804900300001c8200803749096580f47184037e9fbc5342cf8cc133624200df8ad183410e37b72e630100e22055d0c0000001e3b9c0090021a6e72fd6aa474c33d547e8347a30c00000000871c4583b83416f0c18000062e08040c8160650e404849bd4cfe62434014314af08684001d9fd352e21e400a40800004084000e4081d00f4ab50c24ca1850b6162ac8d0cc8abddd26066768b5a428000092a4c860000055314200801f2ae0ce0842010e1607125134811d1902fdcf0b1661987ce0840419c1c50400006020f01126cdb68b000df4cfcc00009708412800200087960d9d99d83c5f76aa4e71c28e0c0c0f8f093fd029ea4020000520704000ccadd7cc004201000012f0089c3806e204dc1fd8e318801e832ec20c2a9eb6f87b5f08a180000fa62a20061800000001c7d1c08e8652131ce91600eb992b3b1d48400e4b940803070004547a9140316401952006009081c7188104107088006002000032000200df2fe056000000002c737a5c41390fb282000001800003cf41c193c90549031018f18711008408902e000200d000160006800042600f000121c8003bc9c32acfedb8c83820000017700c084c4eb89102c2000001770050006dcbb57b194209802000023e40028b0d97110e7250c40a000f32e44408021f53bb238005525e2ba0c81848010e25d1533a922b4a53b1242a251c5e4805597b6424081b008619d609ec8a0914069fee418a001cb4693618c208c020000164400063880014810380501b828004728d051c9330171d4e2c10c65ec6855b8240f73055079b3af21748483c66a6270d0a787bae0607a85ed7906b5339eab6d1012240fb12bd53e8709d4d8d3b9ccd12bf9756febcb2b3540400f54f41739f2b395e109ae69ec5e7eadc890ce8bb443557c590758f6e1d43cda20bbc088279062b370b8b81855833e1a2b1a6117a06aa113cee280a59b7e6a74457d3e911fae52399d75ebd976f3d9388cf8f8cd1791b00300c86fa5362e14bdc9307ea9618642267a8000593206a13f6a353cef000000000a448dc2c96d85e81dc09287803582a983ac0000000034f6c91e780000000008cc914b10900500200025e60a05e3b55f57436e2ae48da43029913c5ba91c99442ea18f2d9ab6347473c0091c61027a28aca2a315e495d30014d28290597623d3e49a30100229443696012c77652b8a0000000bb80200017607ccf098209402180cdaffe610840d004000012cd82a983ac0000000034f6c91e780000000008c4c20e1c208b04c008005000030000200dd363c15884e6427926ca62941da81c1016f934c06d0408b5aae7d7898105ff1233b3d1c68000bfeafc0c530001feaa9c8b2120010189d676600000231ebc83576cc80168143da8d4f3bc000000002912370b25b617a077024000000000000000b1f97eccbe2066a07960aa60eb000000000d3db2479e00000000023e3f7c00000575e6016930510a1cd0c208104a02a000200d89e89630820408278058020000190001006c0e60c38a28610208240028000190001006c91010daa6d886440c00647752997d405b8112e82c8253c500000e4e1c00245010d9c1f6c640c10000ebd15fac1c000081090674f9c40e00600780001d3002800050c0070000ce80120002e7802c0008203004010040000111039090004d410380901b848002e78f0c7f9c608430365e8e11c15088708002000010c40d08406c42000f783e5f7a5c2afffd022fbeaa68b1f1d77073c8245318bd80aa402c8a1481480c6085087042004bb724246380beb50875602ddbe2425e6523bf80476252c4f39221b279571c7e18ac26146fec0002a254858002a250a38a40630428430028018008022a64700401a0001fc40d427e5f7a5c2afffd022fbeaa68b1f1d77073c824db2e39157bc58aa2c6b26055a94308f4e1c0ba46ce289e3bbe20f4906daf9e10c47b45a908d0508404104800200233d44bcb63d88f649835c3f5671752306cd6c63e6734136d73dd34739426931ada736cad59cafcaf31494250010f95246a36e42e03b651ce231ad0aabb471dc1c325d90d220a16b40a84b840499e53b00083da8f5e7e140dec242c20601f05760f41509c70840200002d440d084000ae040cc94001200403057c31ae84beded6bb9c533103026a7cb404a1271a4e1c2267b8b0699b05513c51422bc4f06aa9942fbb8c1022081597f5543a5c9660c1026a7cb404a1271a4e0812081597f5543a5c9660050cb573b8eee268b8cdc8bfe7ab9358e5090138032110188480c02400065870403ddafaaff9d0c203e48539b7c80c081b4fadb8c5fc4046433de5d5648300071ebb2931401404fa889444a68080473b67690e2600027f9e35b4e10aa00a3f5038d23c8274e39a1881e00bc040004d240b8e405a3b02c0501580a0684ad3698a821c2059936927b2182436272060f614211f9b005ff620106d4a21a12020008b25e0d2461c0490fd16d3a714012c56f9c25115010227b238e01aee8282c02071601782cc5e935c03093a2d9fa67daf209648042abd4a258100c20f171dedd5e927e40e000000ee6b28002c27a2eb643ea41289606)) <<< 16000) + 0x78f58b194a5cc5f424070439050716049db234d4309cd03e58b59184334c156d524b20b27777334440c000002ee0018400001c1f441210af2ed76b54a0001a43b17b40001c8a63e05430904290180001021e0fa2463d67ef17a428901f12c82c72871c51043412010000c0400803400039881506ec88583eb7ea963b98a3b0e1ca1c0a885196038a000001f40280048e38379020002d2561d8981094021c1f448c7acfde2f4851203e261261059040c28a08270048180001006e95c773fbff769fcdad366c69af39727120779dc46e88fc3397ca56185c3806939c74f4448d77eb35dba24e9a3aee780000b9f9408740827abcecc3016245000064f44de154aad6a3b650b9775c1000033401db8c8aa8a0184baacf015c0eb37f5228286e7c486007013470754305429435d8c57f56abe046271671469451038208220010180001006f17eee171f083d48950dce2bbc5f52d3810ab09041a502a893f9ca1c0a7e4028301c9b5dbf203362bd058000726ef1947da83d7604e817030a008e1280001e300080005fc00300019e48003bb102905014028002410d8fcbf665f1033503c248c48a40a2861820822001002a60500401a0001ac6443223d022df2cc409c4e915610c7c0a0c121c724384eb0a185f5ecc4952211021825dd97c53ee382980a19cfbc3f0a02afb90a9dc9980064158bd2fac090bb2038c1982200008a080c06c0303723828fdb50d61b0388f3ae0c9a544f8e1cdaf26183cc12306066db890818012101c6933f5de1828403763005a7c206002a41ea8315200001de228b0e6ca0a8013882090c80f0000460400505481396f060b4949ead1103030e5d96028a170bb5ea70c4507d1a82c139a3008b4341917c1406759a117b304000f0c53e86d15400c26859e191e3941480c00980404a020001fe20486b00c358119ac0886604223a512150db1402e0bc810e1c9420507e8a6a0e5ca0c49c6c90ea8bf956ace195e000000000000000000000000000000000000000000000000000006722001c014008000150004dbebc90d4f0a4a92ae9d5883d3aeec4ec610cc488aed00b000723180fae9135b506d8e9be67e4ba59b9771fb0ae631cd0a343c0a0e28a499e4f6ac64e5c73093556f3151996ffa3c5ed811b596decb0b0a291c5db317094d346bfab7502ed645471b3803d7eb83647a2304fa6e95007a210c5b08273316343ee01e4c80e4606fb37c2286eeccfb5227d13d3ef00f1e3ea0abb0cdd14232465c4a78440ff372f1f9225777ca6b565ee4a34ab400855363cea7e00dd34186180242018a5463d50598aa48406348958d588c5a810903923b3d8b912bfd275345cee46af36ba127592b3eca1c00af1181e8211a06faf19c4cab4d7cfe76c20f7e5ec0051562ded65d8b1f1d1c9a2a4faf9b82a8c723be7dc56d225c1df1b87efc8b64855772bea84aa391062a88a104559085a9e1c70507f155438c000a7cfe890400d2d2a7940097a549980250c2300840300401000004440801403e0a000179301250d96864b02055ff3d01005e7381bd015231c2100800005b101e2180e8cc0702603603c0aa4109786103dd0384e1180202eac8984020c394c7c045490908402121814f0102630635bc1a92040cfe9907c21808210b3758200c94d6940002a4a4844010000119202a1390ef6d9a7b8a0be572be11806ab8ed3a080e2fbb32005424201f0084876c28f9351412fa6df771000948bee20300e74f072202a121010804000039480d1080648400040e400114880c0ac0305780158f460fc42f168587c40bc5aa16f479a399303ac4e160a700bad1c5914273b1027d956c1be3317153044400308f98ffa655235f51ff897f84870def551f9330ffba31577b9f30605e98b5a8681bc5e5f502e8620bf40a611bde3c29412b57020fc579bd61eb470bdc92f5f8bb3d07aeaaecdcd2c5337c888576028a5422112dae6085ef395f58709dc079b0f1871ef7f5c5ff9bb889f6592bfd782b88196a9ac7fb62bd0405dfaf6758ac216c800d362f8db216ccd466444633dbc632323cb80d59d4e2c306ad56df3a171e1898da54b2de2b4ae84272ac9b8a88557e12c06c522b77d54d163ca0adc712825853013d6c65a44660668f01d3f0086b9a2e62ee9f9b4a4fbfec400000000000000000114f8db49e619c0b1893818b0477d550a385d055071c30c90460450004d580a88ad14f1c5b8d8f8d163433989a415d978793e48a619668ecf745d716b8125024375f594115cfbf3a8080e8ee341459d0bea9fc4107f3ac6ab39aff07da96831d778e3831d5402418c612d4c8c088ef773b800408c908402002e1a0160d000071901509c080040100283201311009088044440201b00008b2000cd6400356c800c7e1861218d932f67be256f4232f832304c1679dc2ed9e7f173414c00000000000000000115d5a4278139acb7a01714673c30671bac8b8602478c179c3011d0000000000000000004539800cc71040c20860050004550366f115c05d8be39e7bfc35896e457a9c6ee545e836e5b8355089384868663c26cdebcafeecc1f8fa75039fc04e7fb4b541a5cffb326ba2bab7c0a6ffa4d501d03ecbcb26fef1fde29e95a1d403c0401c020005302004b16400fa50f0c9a2502cf7decf2e75e374e1d3a8e24f3e0606b420cd9e35977ec70ca9cc76998229e8704067bec6fc45fcb794f2997600ec8f3c9d3b030250bd1ee8d799317f6b7639c4942581b5201019848bbb9fa0f9c5859735cd473b05f8c800545676d2c97406583fa0ed9ae91b9a958e761099af57f2d)) <<< 16000) + 0xe8691505ef5e19b50a591033882f2043872508141fa29a83972831271b243aa2fe55ab386578000000000000000000000000000000000000000000000000000019c481880870850870430010001619246d2f3200c4a497b07fa038b9e18a42cc2ae8d379a0cb846b6876942e478099ff6558d402bac86186cd3939d0c8ed322a743ebb74adb9473999644959d1dc123884f2186824905bf605ee40c01130f7aa31001c55801a800a4a384601082f2043872508141fa29a83972831271b243aa2fe55ab386578000000000000000000000000000000000000000000000000000019ee040322c92c7285205282100080005b8c0080360bc810e1c9420507e8a6a0e5ca0c49c6c90ea8bf956ace195e0000000000000000000000000000000000000000000000000000067b8100c8c28c20b18c10b0cb0090000b8a0080374b87c13a69c34711011228b30738aeed5c8344057ab39be3045da5b2e7c14100001482a30029b51efba009c4090021a5ca233ebff9a389bbb6c06983aa210b62b1821baf7cbd00e00361394f4804a2048010000119200055a40014208003b29a6317b0154805c179021c392840a0fd14d41cb9418938d921d517f2ad59c32bc00000000000000000000000000000000000000000000000000000ce448a48640630628018008000bfb1f7dce75f0750a8e21984ad28cdc5e8d4f665a1c239e0a95a7c8a0b2ccf24ce07d743d177171d1ed4c4959f8eca5c41b948944a4ca86796b03791b907d1c140010f8806868003420800884900c2180388802c0575401c179021c392840a0fd14d41cb9418938d921d517f2ad59c32bc00000000000000000000000000000000000000000000000000000ce4386306184280200180002a73a2ae96dac64cd25bc8ba8a3fbf7c344b1cf1117d6d91dae4286288cbd4532afd04bc77ac11f13d8dce0eeaf0dbcdaa5b565b7b721f06edcb077ce970329ba659e9ee778b556d400b151fae4912f586e9e305b7f7a34a18c71e06a5b108269268bdc8d03da7fe93a7046143fa6e8e5554560b03905eb5dcd6500010c42615c37d305b8169a8002bbe001a1020a20c0080020000a84b7ba3ed79cad483dcbfa80a8c29cbd10863cbe75a762de73c104f1ec6612e9f005db7279e13041845f95d570ab814d310a7bbff8a37567dbde457f088368a0be331473c481361a9862786d01743c01f6614cc5fee16fe0065730ae303300ff8fcdd2379532b876bb90000000000000000008905e40870e4a10283f4535072e50624e36487545fcab5670caf0000000000000000000000000000000000000000000000000000033a922860880000000a869ea004d8e48512b6b56af1eb5d47d174f8c0811010c6d17a7e56a98ae45265b0c20b0bb78b9dc222ff346c8541db46c701c33f7b10c2abd24e2d7460220ee940763ef91103ae4448ff2e963a1dd54374dca8b89a56af4dcf32476e2276061213fcf6214d27e879d49bb73bdc9163f431c96aad8881224e8c0ed49b368dc544058b802a9f5aeb30ac14277a7dc06e243bff553ddb84ca05f32e501f28b1060419b4eb5192ed89994ce036d85bf6785501f182df9dfb39256d01da8cc61e7ea48ab92e59a7142325ca08040cffcf41e075e5405189cf990a614e58e5e347649e03f7402487574e8f68f8f624648fb46a704383e0000993e0402cc0b673a75e639fc498aaa7a06e19de0987c4d24a6a9cbd4b38019127e3ff807a3f83c3930d049b927112fb3caccd32bb439134a51fd26c457ceb6dd5b8217129a5eb4d34978db80d39b70632969609016d04f3715743387a3544b2fe2ab045c9dbd1ce9f1b2a58bc983f097ddc9ced3854f0fc3299a6a6449f2e732be437c81536f8af849d24f62f55489fe2a9bb883100ef90b60e9a045887de73493e77a3be4f5180b7afa96a9448ba4715c38e14539d8eab15ff754987f423b02f17cbb55b250d4d8ff85ae1044d0e10d036f081fbbc0019b870a665dc4921b54e39411d2d3dbc6c40cd10bdd63bfe4aee0b9b1cf36acbcd48a2fba3a565447af47a857485cf1148467180fd0c1073f30077e600b0632bdeb7ad6f9603fce462c22cad1d4e74413868fbdef28634676c927525667bd80fda9f9a66f5c7a69cd86376ff5127cfe0e6b9f901d1aee95b11cb1ca211fe7806136ec759a04088f6d7150048407c0100000fc40284400118e40243703865a9a864704136bdb463814183ad21000231c210084021597b7241011cfc8fe000885080021007ef5e926010880f00438eb41631300e301810f01138b0dec8105c18c3088021604ea0be970210c1f008000029100011e200031840203400047c4000c3c8038880184400a220013072003558400788880119b1acc612874ca26d1c0c592426b7299b9bbb57a0c0f72b18b36b200000000000000000113b07dc6c8090930cc8674a0f6fa7dcb3c4ed5fad5cf7a9954f680000000000000000000000000000000000000000000000000006621411401000c000554718cd28259856b386edc2a1abc4e4e377857537ce99f3b2381df65783fba0da295aa507eca41c5961ec43ee8eb5293b88a175705c94f1cf3cbf1b1e9c899c070676518ef5f9288ff145ab7b96d944955a53215ba7f3926a567436fde888e289482339653f5aaacc926cdb2c40727dc7722b8a45521a63e7ff1f0894d73de1fd129fbf7fa6a3084cd35166857f7240cd14d1cf93374e1c0b8fc44e0575367c6a22e35339e318d4391e4685d6c4d98de0296cde07684396e54a80200800c040011e640083400202000010021041)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 26 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase10" = "QuadFullFourCase10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 26 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase10 private def zz2194:"s0892"="s0892":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l14 l15 l16 l22 l25 l27 l28 l29 l31 l33 l35 l36 l37 l41 l42 l43 l46 l51 l54 l55 l56 l57 l58 l61 l62 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2bf425b0a, -0x59682c120, -0x861c4392c,0x2ee0], ![-0x59682c120, -0x112ae5f14f,0x27473eea8,0x8fe0ec2c4], ![-0x861c4392c,0x27473eea8, -0x24524ccbaf,0x596831ee0], ![0x2ee0,0x8fe0ec2c4,0x596831ee0, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xa13b,l9),(-0x97278,l8),(0x3c763,l11),(0x276d15478,l14),(0x43aa813c6,l16),(0x5fb5d97d0,l15),(0x20bef651,l22),(-0x2cb417800,l27),(-0x258e48c34,l28),(0x2cb417800,l29),(-0x18bab9fa0,l25),(0x4ca58129,l31),(0x2cb417800,l33),(-0x2cb417800,l35),(-0x264b5149,l36),(0x2cb417800,l37),(0x898c41ec,l43),(-0x7e3c3e73,l42),(-0x1e244b732,l41),(-0x1b09e4794,l46),(0x2cb417800,l51),(-0xd258514c,l55),(0x95717e0e,l54),(-0x855e1724,l57),(0x5014e6b1,l56),(0x6c279522,l58),(0x1f52835c,l61),(0x4aad96a0,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x258e48c34,l28),(0x276d15478,l14),(0x43aa813c6,l16),(-0x1b09e4794,l46),(-0x18bab9fa0,l25),(0x5fb5d97d0,l15),(-0xd258514c,l55),(-0x855e1724,l57),(0x898c41ec,l43),(-0x1e244b732,l41),(0x4ca58129,l31),(0x95717e0e,l54),(0x4aad96a0,l62),(-0x7e3c3e73,l42),(0x6c279522,l58),(0x1f52835c,l61),(0x5014e6b1,l56),(-0x264b5149,l36),(0x20bef651,l22),(0x3c763,l11),(-0x97278,l8),(-0xa13b,l9)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x144783100a400c00000000f002c8030000000a4640630080850960b00861005000000003500b200c06509008c06610050000642409024400c004c0d024027d0040010c3108406f4010003c0841400f1004001d03408407840100000000009018802000000220a00c300c00002047101b0c040000008239014300c00001c4510120c040022467144059401000001a85d00a4c040000000685807300800001845400a4c040000ec622901e400c00731845102590046305343140224401808b0e20b0044900500114350700864010004a0f41601250040000048381c0b4009981510c101091006001043405804940100c31440d407c50050000000001c092008000000013002c8030000000000d032004000000013c02c80300000009464063008000000002501c802000000000140720080001562440248c050000005a25026300c00001684d00a4c040000000584807300800001444400a4c040000004a1d016300c00410c41601b1004000000000030320040000184410120c040000ac421900d400c0001d0982805100300170440d009f401000531043101bd0040000002e0d026300c000000a824088c0300000250440863010000000a83004cc0300000002c140a30080000000a0502cc02000000000240920080000009824088c03001702807005d401000000000980248030000000442c063008000000000240c801000000001c009200c0000000012014802,0x168a62a02a400c00002e291501500200000b8ac580e40080000204410254c0400000000a8b033004000028c120248c04001c84304808740100093194210171004054c93089004f401400a9258440095004000000005500b200ea22461090023d00600015c962200d400c00a42584900bd00400284991180354010000018c23012cc0400264840d40274010009d23038019d00400270830c80574010130208194011d00500268860d00374010000019024026cc04000128881d017400c1222241b0049d005000006108405b301000912243603dd0040000005221014300c000000d82c090c030013c21044039401000480cc13011100400110350740c8401000430881201a500402602082100694014004c0cc13012100400118210440394010000000090503cc02000004c24140f400800440e4190321004000000028180f30080000000f07028c02000000000140920080000000907028c02000042824026b3014000000011c02c8030000000008407200800001dc330064c040000000743c073008000001e06c02cc0302984486600f740140a81181a008dd00502884186201574014000000000501880200000000038052008000000011002c80300208760cc05c401000511103303310040000004219022300c0063144410259004000000680b013300d8115b1120119d0060018453064056401000531042100a500402603082f019040140980c20fc0641005,0xc8052008000000001d038802000009120406c301000001c4570120c040000000b844063008000000017404c803000108440b02d400c000002e084028c03000000005c00b200c0000000011018802001c45310c09a40100000014884088c030000007219025300c00001c4310254c0400254730640764010000002683808cc030026c730640764010000002602c04cc030000054342c0b40080a10ce1300461005000078260b014400c0000184470120c040000000a834063008000000015404c803000000a81900a300c000000015002c8030000000003406200800710c82202dd004029433046013740154c0d3093028b9006000005304c04b3010000015014026cc04000005104405b301000000c4170120c04000000044240d3008007311824031d00400000810480f830115710508c012d900659440426009364018000000013402c8030000006229014300c00390ac130169004000000064540f300800001845101b0c040000688a500d8301400320a01903e900400000210640ca3010000009c1d0128c04000025833018a30140000098190094c04000000280e01d300c0000008830054c03000020833018a30140000088180254c0400003384700d23014000630e84805d0030000758d100923014000001e8d4098c03000007a1b402930100000001e1a01cc020000071190029301000000000110348020000005ca8b03400400002d2b16035002,0x69104032301000000000b00248030000000036009200c000001a024028c03000000640b01c300c000000190901cc0200000006824063008000001a044038c03000006a08401630100000003511018c020000000342407300800000000360148020000008231016300c0000224230214c040000008611035300c0000210230214c040000008212015300c0000000005c0c8010020c7318405a401000831cc6602a90040000828cb009830140000003e0d018c020000000001b03200400a324c8602a900400000c114807f30100000310e0601d0020000009239016300c0000304b101b0c0400016c2a0a017400c0000019824058c030584a0903019b401400002849101b0c04000000000540620080000204670120c040000000000503200400028a4940930c05000124240b024400c00051248500d10030000000a4940f3008008118c5302690040000006229022300c00002041201e0c040000ac220901c400c0000002112018c0200000811c40c630100002a108640590030000ac421a026400c007c1443702310040000f85219016400c00510dc1c0221004000154860901e400c00ab20c1100d9004000cc230440fa40100c810213c02410050000000001903200400002c4a101b0c04000164a214014400c000530a82805d0030001248222024400c00024a4140930c05000009484440e4008000000252103cc02000000000340d20080000000019038802,0x144470900cc401010114208c0b2d005000006309009230100e316c20c0a2d005000000000e40b200800031148780590030000008212033300c0000000004c0c8010000000009409200800000000e140cc01000000024140d3008005111c280331004001442104c0584010005108413036100400000002c1805300800001d0b06015002029c42872025a4014000001a83808cc030000000741c0a30080650960b0046100500108210600674010003109c1c0221004000000000a80520080000144470120c040000006229016300c000000011404c80300000000883033005480d10880237500602c439051029d4014000000001b0188020000000006805200800000000190188020000021044048301000570e41603f50040000843613025400c000270c8440750030012c3308c045401009009809406b1005001303108403540100900c610c0229005000088321101d400c00410cc23025500400120390a40ca4010000000120d014c023a0224124031a401800000000900248030000000003c0520080000138110058c04000094260900b400c00000000780248030000009241022300c0000018884058c03000000004d013200c0f208a0b40631005000000003f00b200c0000000003c0c8010000000006c052008000001509402cc0300000006c48053008000001608404cc03000005212001330100000001b13018c02000000000580520080000001611014c02,0x1102c200c00014409407c0c05000071884024d30140000000029018802000005308804b3010000000006409c803000000000180d2008000000150901cc0200000000015032006aa25e0cf025e900600000c11840693010000000320d018c020000000cc94093008000000002e014802000108662a02c400c00430941303d1004000000000110320041411c218c05d90050000628ab009830140000184570120c040000007231016300c0000001d0a014c02000060843013330140e61461880455005000000980b00b300c000000026140cc0180863450808d0401800811441302ed004], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0xd30000046500349345cf86860e1c4e2e6d3e22c5000047b704e12f3e2aba0f2841a2e7f22f0410047f9f214382be53118c68b000004404f60000185efac4821300a34c011febb031a5808fe05bd8e28c87d6fa2870e1a0c4a6b03845e10624af942005ff11790e0b87f96722e280000007d00220109404000035a7cf076c0462061600000bb50f2400000fa01a49a2f7f47034607111008a60802ffdac88d0d8acce7079a0f17ac8ff21a0208c02000033a456c062b40315901c4d41744047b889420935a9f9902000001d5381c400001de1974471293a38cd638e5f46cb4f30f1400000ea24221611fd5b4a03800000e2bb340000289e4aa24109c06133400002710081186b9e2e78447e92f089d39a3a0bb6050f071c77402ab2c78a0083c312b38561f046ba9a210e7c5340a8a4021280a00006bcc0c07b786e1a830900000271004069a0d08e4b63062d3d4da4d43842c50930623344178b68c2b340168f6da51d40800572ae00a01f1010500380001cb30236f8afcc2e8e200002cd262911e9d0b7f02e8d1dd74507dee071d6cabf05480f0815711564ace09c1d40fbeb4608439a705888e00000aa0c6700000f3b5b2f090428020449ea513153a44591aa8e50e21f6ca8614410c24f42ae3c37a69deb01418347e089890cb14d0e7b3801080438b00000493e00b2c00000000643886e786845200b206de44f24f8208c4a5d2592b100cdbc8e7885434306f0293e1c4a0cf6ed7e907a1431c8093b39ef849002a0280001079000387384800002710080d60d1ce7169833aeae2470030c790337a870e2610aae4c3070202f4a830d1a0ba2dbd1bdc28205eb8e12d0f90104c0300001b92000f38608167c22bbe0a1c00000fa007098848ea85f2844e8e81bc4082286505f430c08549430c56584c161843d90c20f4418deb88620409405000036a6870b113b8ece3322f63a3bc07507e4f6764e74908a5db49533094a7890d37d491f2d5b4181a60dfa2886759f7fdd4fecddbd90e07b717831141e50534072543d9dae16c03f6999f09e569fe1b7700fee750db245c200525807a5090d822a718806b4816b581813c4ac4a99364a4263ab300304c1fd865caf76198fe39cd6206b87e14cc9f2894736bcc87b75a8b6e7bb8d45e950d8d79108dc1fdd4980077f3c7d5eb4a414d62e000029f90014ab344001962c16428348b44477f068402ccd49998908000023280041251967f45c2c1ca780a9b9e382345f0276001004c18983ce8809840e1380c000072c8ac0ac374562921b157018a400f8800005be27d270e21de57655d51175c7e7e06c42018d3a9808e25442185319e1a6e80443bcdbd5fa8d047d97b5d0d9820ffcb601201038000015c996cc00003e735baf62410ac0a1e40466d9c314866ff61ba648881b8c029c120c3288cbd9a2188cf5f8a03821054b6480) <<< 16000) + 0x10509ef124627002300844d3201b3e1a85e71600000b8efc00b2c000000007e41e410646d9cece8208ceff1911ba9088a671ac24c47b9112977901b9a659c14a8115f25dc82c20c82ecd4c4791c112005e0800002432000790628c9d07068aa913405b3ee5652886373f56fb6140300002c5110a2103f85933c30e0000009ad10a000009870eb4c08520288a36bebde5cf1134070655b1ea2191013f5289403000008c940884138947704100800000fa081a10000007d0021c109c0400003164000cd08aa02fcfd3fa3b03e87861181aa8984f04a160e58179008000011928400000002ed7070000048a5ed0000095c073090853881380800006408ab02fe261af9df8160004121e296db151967a60a91e69a51e42021010e1200a00060200401ba500d600475006158da3ac602025deced0c0042e85fc84810420100000d922aa1b15409e841161adb66820072bd600822057b52090000b90c72801bc2fff1401288100043830421c55684107f454eb0e04009fe87a6801d77b2d2000bc90de230128610804248385a99a9034f1c7220209cb89bc22809f0d15a92020e804288407c1b68a071a53f11020d00400001c0c02004010000044400064080015990003d32000c4a78e0f5ba755f5e0e0a725443387eb940816fd1d5236d041171d6cc4e8cc800227bcf162338e00d3851d9b4c2000001188ea32bfb9820bc0e1b09df6c70c424a988fb25e6e137758d4156093db8bf52961b2b22f4b8d4650fc365645f02230873650cad5af7a9517d036e60810e6fe0881f130d7cefc0b43464022810411803f171b516e271c4647b55795433d54d703024ede544b737a50b90e346272e69f0a0adcfe83ad6d6871c021512fff7d2efabbeea384ca925241a01423d0daa000848454c342a41a1510d0a8028001950d96218730f459257c8f2665008a1e90404811231726e004828400100ee050a782853814000234451c374451fd1b2966e1a1a2020054c6c3d71b3e2402b42687daabae7f4c03f9153d0446c29892009e054ec8e8e2c420012afb6f14accb0a300e974153b8e99d4001af42fdadfea75fd0874a72ab3941d83800009ec8858c80803400380a60804f36c725c9084919c9a18081000001194028107bd4f78ac08339c5e0c494a00d9b464d038c00345f008200400896f6ae0e00990304e020b1c5639417d084515c94253dd890b0ba6df0aba9207080f290a05de0d002d7b4a615a0b0121eeb5121d4000005888d0bc86082c0284398bdb5818032626d825c5d99b412b861920903613bed8831092a62825c5d99a7c223e3e823a5d7ca1da35446af2167c054ed8d0e04b2c0b41042c21c22000c028f62626cebede852b225b3c2dfe581325e31b1cbbe509159b67dc6d305166895b82584fc94fc52bc6b462d4cf14a451a6280ab14236cbfa000784442c142860a020010002e291411d0a68e84e07427e1b1370509a82c53016001072685a5103a72b49d85fc55e49a5786d27f1b01209649231020e21010a116090008103537343934a946dfb0bb0edc8ae045350208756cf91d58186b132c88fecfe5ecac3880af581565840551b7180de2105f194afc01e582ed10730b6a2027f67b2b136481ac95667ebc00bf8533bb31191554739d55f718280240000f8187317b6b030064c4db04b8bb33682570c3241218439b28656ad7bd4a8be81b730408737f044459270e408388404400081d2dd1a03a6e2bcf6eb45c1bcd72827ab322d8c1d785ec6f474d3b7a00b33e64169c7bdffc4516e214a43d87317b6b030064c4db04b8bb33682570c32412211806459248858640410448248051dd0e9dfa669666ee2a927c0d2e50d984c256f3428126e20cc2550001e022962a14a1500027e9145198a486c5100629003a207ecf8be44078b3bb8180c271681ce8060025eb81c40090508402028e13a236cc683ce4080c0c20fabd90d08b682cbab10a088aa6605660a006c38afb8f09012d2b8ca91c8012920c325ec100465f42866843c7da5f5ec8578e9d43c2362060a008000044643744421622146110a1068080340007367ce9eafefe79d3d5fdfbbaed7c103dbaed7c10404e87317b6b030064c4db04b8bb33682570c324125809cc8b444d2c2e7f9c402a651068c28a406386380c86708087f528c57fbfff415a4ab825ba5863341846d8179e1c9fbe5432d06ed2e299116b485c2c632c77638d8ccfbdbbb4dfc71a73610e0316d1030304f08051405e701271018dd16bb9a082e9e0e0174382238680d488002372e5bb8acc2046010000143228a2b14401c8e35cee419061a41e1a2bc384b872a1cc940db828f78a30224845394820b2b3059581304110040374142160a143050a1028080140003444504842804213f1189f0484f416000eca44f0d400294274d898509800e83490288509ed5a3c619b7d5147771c6028b381976030416010eee68914400000249f003401716b994a32300000002495a00c88082c0206920316b4b0287122ad6c28e349b390dec610a97bee4e684caf92a312c000e7c4ae858208401000026478c889f94c5fd05097db1eb3b05c308a0681cc63d8682239cb83150a4826839fac2c2a680e807907f2a460000002dbb0800804503e40f5de7d08042c02c69218e00ce414387df571ee78c2cb9b2738e347602ef965080ebaede91a123ad706d24c08440100001372276120003523638192b6914814b037c22a289d24411ff102b5220c9e940817c6e3a49015fc94e14400410b5cdc1270c210080948280005dc89d0a849c372280545ad3c927f15df)) <<< 16000) + 0xce2529818d405b8f75c45f58caec4e081c74f9b35cf94e09b5f16679210444bda01837e903cba22a120a7b531663c5669a84213550a01be02d43bad485c95b3abf8222c6bd05d1eb78cd95dd6721e14d24fd0725498716037000062844e4658621ea20fe03891811de94138430a123696acec303832f3e25e118087850b2a644c004709565df658000000638280c011de90f6a404501052030918f6b6731a1854e4f52588c0ffbd368df20312c2c29c8c046f28f6830c166cfb226c26082200800009c9a14105fba532053460e7a00511508c5af92c2eeba2001470850633a1b2400243e589060099d4b4bd140190361a586808220080948080006a889384e445d34fe3a91c462e1af51b303f5ab28865103704aff8ca2024880df887181749a7ad8c140ab93888de1128e284802800017e2268321381909b848001b5cc8e067a522a7f6654fcc0ef6bdd196884914f161814dd86f2ecf75442431990a23aeb2e8984384091bc32464dab64090775ca86285b712918401a6366f5f0d7f9e010d49cf525a782d8b02fcbf15df575398a67711187103f07848e1d3551004fd28501b475ff68312287cebe1ded60c0e3cfca22fd2c38402a9af07fa024174092de1f839000b16092d83bc70056e9e2ecf1e2099f40d41478106820b39f97448102d02c00012a11360d09a82b077a94cf8c2c24719af78c453303f95ae84c701031e849ea74b1c21e7b76d6770c002558d43b60805292f4d8330401d79fe48a40c88082802009382f07b3c1638c491c7f27582624500a6894d09107c5948253034c60a7f7c40c8a7dd6451404cf4140a84006b5e9eca0280c220080000cb9134110998884c8240007a244c4542602200097f225e5212e1d01d8e81145404212001c9a30182822ec48e4840854e0e5f61bc1057d91201b1fe10101406ddd3658608672873966247007d0a3bc8e24081dcfca48a1a60130a1681621cc5edac0c0193136e89ebe0b1bae0cd36104887317b6b01c0112a17a27af82c6c378c17fc1221cc5edac0c0193136c12e2eccda095c30c9049edc5fa94b0d95917a5c6a3287e1b2b22f81120e28e10410208a076cc2364a65d6a3e9c1b390827bdac6afbe66a04ef2af6febaf66998e4ab28e1ede5178ab6c4a4cffd06a499ddb1a94ee31b694e29247545390c7a0008ea44b4662581b12b0589502c0841763000002ac3a627f3ecf7c7d000121c24e40fa3daf4f3db8ad7bb1010095ea74c03b8049f1195e8c47d120492ec82291582b8ad001085680a007f68ae9712f9084e1a6678000601ab1b1362feb71187980cac10000a0d9bffd5f0b5a83c8e0f070a1bf7326ecd84aa7a15cf3b51f3d3198575960eab0030e3208404a007865b67f1faa4db3eab01c483367210a7a80c103183142861e9e474e4eff9c282afec24d7a5f5ec21800c7048c98dc388e191600000012a8dff632a20c00336717b3a67855ab066023856b842204030c0013a6411c421a30796ce1b8ff2451a703d6c96f4409020840200001b274c44226d86349be5204f73481f0c65df300dacad6382004130b2c6180250a92d3198208002025202000142224e13c243d1fcbd248a01a348a230141fe95320a044939c4d4449050840200001be449844094120005fd30e62f6d60600c989b744f5f058dd70669b082487d7887dca7133b05d30b054881850c30c604900300100000154c0e0080344a00783cdd202f85937b9de3f71ff3a4349f0b87e4a8da5c8c24728430682da63157f587ffceabd0a2085a9e80cb0a9a2088264ce32f053885bc1159dfcc24a7379f328f0bb9287096d7878f03dc55f3bbd6e9e205f2744cf9bb1f5777a04022f5fd40b7ed2b3d01f981b3508861e7b0a0136e57712c9c990f68f1be03eea3c53dfcc57be9e985b54c52515dd0a8a8d1362fe93dd8b89f72cc44e63ca115646012705f9d3d5fdfcf3a7abfbf775daf8207b75daf820809e65262ce48c0a23072472451841041c214023119eda47ed78654e7e7d69225dde50838a40750071e7d8bcfd9c32e214d1c32186aa00048c404c3424c1a12509025048001edc8004b9103b1d0009d3112431091988488c42422a12009000d6d104c19ec277db1d7fa9d141485588e131ef7efe50232e051bdf2e1f9eb9ad70c3fda8fe165f5a29f7c12c7d4e78252b955411387e4bc1d10c870c50c40c1046003001001112642c4711a9b693a50c4c7fbf91b57ff1938062c6e8accf856dff7882bf000a54a4188bf8c4ca4e3172b718c895152e6d66e79ed135c9380c6b0280bc311c24072d7f3f840610715749f608846384401011f0508f00800038c88e8e8470742363a11a1d08c8c84606422e2a1161108a888001654d080311ac455f70a0806093b181de0c10aa18698ad001023ccbec348bf0501111d0e67d9f0804cc6f625d4b000541fc136b864cca0770ca3234c200dc22157b3e044921900bc0d000022114110898884480400051c4445442201304c09887828438050378195f9fa3471c2021e93e8cba030532bef7af16d450857c0d98e1cf1008b3315be9fbb200171b05c1b8d63815e1ee8fb058c5003ee25dea5508aaa080072b062df9eeb7ca0f0bc0c143d1ae1946c99434aa999039b12318a06eefad0c2000000bb80180075a1261a00e00a07ff584e80a0c2c4b5bd101c60b325b45a6b90e231386242801479a1a0157f8c0695c47e085b76693637837b08a6120000232800286000091bc44186008fa9c780780000008ca006807c71f47c084000000326288189082801440e00a1a122b9c5cca520319ce29f04)) <<< 16000) + 0x5449946940000119401040030b83b01c0181ad2ae34b0000000bb804e084a010e2e140baacc071521f48ff2834a000005dc01c1062a635228b0800000bb8010006568ba8d2604250080000a490002df221a0bc25fe63558e99fc3f8d34c23fdb7fc8b517b5c4c4cb2000000ac3b22207380081800000561d911039c004001378df980fae9481283002e6b69c118931db45401ab66f46bf1d7bce286c17548330c209012800028c221813b232bdee6df12c7d60415389ca1c00000bb801c500000177002083cd24aa7e0810c6454f3204000ce5276500c00a30a6fb502001aa635fee104d2304c0180001f022162a020090004fe1a155225585ad0da48b07e56d4be9992c409ef71b7cbc00a184f7bbd5402008082957a721e06040286e2823ca7302c06fc06be9f44f0c01032d03077b3c40e77defed981028103e20a0c40f00004b66049880e9c0ed1a1c415368474821a283192a8f947d661430ce91f877e911020da21de8f1ed1c1113cc45c57582804d90b13dd29610067622a358e25406ebea52d752431f8e586006800024620682303305f112304097cc5470e332cc681aec60c00000c3500040803a19d1d9502081f5d9b3ac5860020b11ff67e830003a19a10550505000321ce0b00800003944004b8c88508e460000050cc1c472cd36acb203000005dc01c388ef600a12025c4352d7c1c2cfe4c4aa0041653139f001c06569ef8b400000067a8a02090021231840e92879440c971859ab32102aa701c00bd4208d0cbc8e9aa101f54e9c382d4385f67b10e93212025e29a98e042803af036f861860058295b5c2293921054040000211221203a23de64a6b42e287000005ae58091cf6b67703b0244b831165a7d8811965bc2c821203b6f75eed4a050873ad62db33080150f0fb8e60000001d250a42010a8081438ec475b1f722472499a424b2848c0af018c1148514520b9356b21222f35f3f09922039d4ed19f0a85002c1527cd028600513cb22c4f880053fbdafd85672410ac0800004306888f303e45f2287000003c99024745327e21d02461869f476dc244397b38814220496f3d0dfc12034fdc1fd71014228f294498f0000004db8b100850028a1c73acdc3b411238c23c6bf2d42464fdadb8670c28a306a3da8c10911018f42aeef101ccce4bd02b428017e3b0e5db43002d8bfbbf17c4001b350583f2b3920856040000218200084244202400110e441c5420c2a1051508208840c442042201711080888400441fe220fe0107e8080036a087e24c131261f6930fa4987c96c3e0761ee2b800ec478f95d5bb660005cef8ddf90381333f1d152e82566a13f2f597a1614027cc43154a27e8173a99f22f3b204005e57814948137bdc88ca6dcf72004543ada0635ed72b424f823a2d232b2a0165c043a70883a55be765c4f5e00836a029f020ba86e6dbb6fb94d00402fa9a140dfa83333b73b4cf86d28d534f2ae851d8be74b36231be7145db7d0bd27b7692e0045c6d12c57b1a6485b25cce2985c19dcc65629b2eb43ca1da7f7069444e9cf8000000000000000000249c6607b9091816461249258260048038000d3f7c9ce3f377b3971af5bb66fb15d8805e25bd4bcad2ceeb8990e9fbb6337095a67420761071a92b16963212c64beba345f1774e380c94dbd0d533f96d5f835940c51684c50bc01f9f3acbf893fb9d1e6049d80c159a386186d223c58108018500aced114e0645820acec2c6c4641e013a844ebbe6d070000025ad012c998000aceb478a864004e208143203c4ce06be7f77ce3bdf06e90634313da1da508080273e7143401855993600943088021a3803291e66863b7b5b01a0d8506b5240023dd6b9812060f004000033cc030040101ec0200003720004946c506a3139cb081ad2a2b2821edcba34606194adb3141d452bc70b0390a07c60982078021c404dafc781c0c08d9f5046001282612211841080400002ac87a8283a4141e80200022621e613a81b1fc64e2d1e8031f5d621b3f2bc403d59d8b3e2ce14300f80000000000000000022a51fd15d6f28ad646c801e1641c486292f13e62b7eb6060a4ea60000000000000000008a73975ee629a05a7659ba48fc816851010278040038003a4b2a0b5319f0a33dbeef2ba3f5a958d2570d3d9f43a221da323ebac975820f388174a292fc4d5e1309f45523635cf58d38771c0f2a490b71bb4e858e0b3926a3c3912663f9aa68e7fd82d085c14521444968002be90c41506104800329487918c3c4a61e01b0ef01d8a26442cadb29d77dcff304a6cea3e89ffa0b9528dd594a47f7d704fff9afc0a3044f5185741f9995a935d499db1d28a9fab3b68adcf1cf34d55fc18a16136f520a22b28cd1c1ee2f2ada51d615b930dca8016c1cf2bb077d488dac14cd558d51d8b03b03e2ea9e29bdf68967e4e1c6c0d001961615045e8301cebac6e9e818a3ec4001b1578d3d1438c5a2333e894f265107fa248bb69fd997d52d98c0e9b61b7bb65ebf82477967ab1dcc21d9d04e956692230aaa30bf4c92cfde7bc645529e3f5a9be0733ede63c10be56baefa63dc37b90bef4ca5d184b6aeb6aee20e7c9b430605189242ee5421c3adc74942d6f7539709a1613d9bff019d8057ad2a360345722944f99627fcf5dd93119558410a568d0d3589070b271b850e9401d40185a24e2bbd6012658c6e6061f5171c9bbe845300ed1139dbec89d9ac1e000300e9c778be6e9bea548b1b8fd97356c21cb929606a73a95f423a4424aa860003767f968d4fedd49959cdb70b180ca0c69c9e39c08b22d3df437cd)) <<< 16000) + 0x8ad906c8651fbbd4d3ae8bd8771352c910cd5f95ea50455de547cdbf01063b0ce186d27f1ac8fd35ad9c3693f8d8119d3580ab46e28b0b890f445cfbca53964e4c5e3a435922926581c0000000000000000008c9a052fa9fc23f4a3e8444214de345e4e9fcbc8b8b289d90b62300000000000000000022a8e4e07ae831960ea9554fc3bef0d363c31188ccc64c0f4800000000000000007e89d7e609c2e7b990c76ba0aa9a19618c184000460e3331c3296e8fbe7ae2ccc0e293f2f49e8485302b2ff85a65d185ef812a36b0038fb303608b138871dba9fa3684e633b71d510865a1eca668f9df60e854f3ea2740c547e7067de7519810a0c65ef2df50cf1512cea5588ff53047dc416091c49808a95280c68c09d30b2cd13bf3422b429aa22a21bc21846f17473d01d06815e8a0010c8400391087710e082b8016a8f4b61830d417246dfd7d9e5200fb21acab039c1a9ac2961879d7da90e75dd88e5e80f309400f36d8688216054d55236004fe4051e675c57d6de253d93ec2899e4c081ffb78c4a91738bb6ce2cf98284d3f7d14cad8eeb1b4f424077783e976ab1d58803c8aef8a926b494fe5155038ef4579819d0c7e031143d455ebbb2d884b25c4961e61dcd6ae74f41c53024cde9f1c8a4f6cdad7773b34194356a3b6c2b7a80b21dcfef5fe02a85cbae0cc70547ee2b504c42ae2a90a241b28b9fcc036c0a53c1d89492249d7c3a339effb5511bcebebabfa97a4a2ab507013498105e1c8528905e7300b8479715f0f110401ce886600e537158e4deb49b6d40a30618de3d67e400d26f6b7b8927781257f6863c434970d202f0dc07baff8d142bb700b63d93702b769ee66cd8770497441dd3b54f9ad0f82e6dabd7a2ff6e41622cb99e39dd11532ab31e3b5e0e14f82adea14491d213b53faa1606e648ff7224ed703868d7491f134e1c9a2b22bff575976de7bfd8586be82f2ea2293f3fe2553859dc1b8f3cf29b013ef46064c11ec96c7d0d8845693c14200e71f73100e3d426026686977df6de1010a80c33302d040840100001b84001f688768a83b0541902a000e1a21c0330eb0d86f80c37807a382c5e88e386cf6d0e4e38d58eebdacd0aa48cae39a055638ea80094407c021859488af6e68408fc8bd460519634a60200b7e97b70090407c0200001a843a457014010040750080000dce8e112df0554c621b4a84f9c3038e24e8850b77fffa046805e7a7ade00944084021852311571f14292acabc41811a71320508126e2765904014d00e2f0094408002000020843a45700c0100407402839c141cc020000612000574439427440463a80314090b1ff6b480412fcf15628221108a370c18344014d1c00b2f4d820b002c20bd2400938c1080430accfc3870d0515d329e8a04d0f8586080461a888ec5041e07ae0c025102000807202838c1400025a4388341c2020002d921ba2a0dc1506d068364340011107ce9eafefe79d3d5fdfbbaed7c103dbaed7c10404e6be389003e0c1dae86c8759f5af0169f15acd4b27478def4000000000000000020480e9e28e2ec4e4288c5acf77482adf843c787aafcb0e2b6c400000000000000000000000000000000000000000000000000c708201a8661b9f0e6816a28a2085004805639ec5240f7b21de525e4cf983bd582951dfb9b0c9b0be2f36b5160f2c48f394aab7ad89d70f2e3b3c7bf3354800af67c5512ce919f5214b7aa35444649616295dd0229ddb441fe4b38159f79722a529a8991be1a84cc803fe9f6f012b961b0110848185a64d2b39d64b6ab282378d05c366ddaca214588265a8c5810cf3ef04a0115da9c18c8103e010f0b6937a098b08617d5f6c64104000800007c21ba0a00017c21c02b0df0186f00e01002008a081eacc0e6041590658eee2400313c7ef038007ee109f440001805f4904a104601000011021ba120dc0906d848368241b2120001b621044a0d82506b928358941aa2b09b0d0005b7900383730306330fbeef95d7f19bebce264850809feb699b854b4dbc7ae0093d8c0856ee3915ecddd47fdf4b60850202a206850aa5ddecab81c1f6fa7040c291ea60cce55f9324fb2ec90e280c17bb32aea2a0bc5403031300004bca037ad8568d0ab6be7fef501f01c32c52404035ae618661146040031335c2035d3719a1081823494b60c00d09385d0024102100806a04c34c2400020c4348641a2320d0190588a82c0541302a0af110570880841419e020005753811f610b3ba08350c5dd5c0c01102543b80aa918e1180403380604203a18f2651db0c158913cd70e0164fc60b8400b42b0470aa4830400100aa01e0970babeb080adb22e2e100c0b4e15404c307c01019a120a809066048298240001f4426054000436432ca4146520a22904b9483286612a2209405049828000f0cc8c0f59dd662c400165cdd0c2604859fb89095c05e3e250243f9700d181223e2e0b1a03f1efa08c10567202100850e161c2890bf0700378c14f7b1ab262b907ccd0e284f63002dd289a65c2833149f3aa23fdcd91c10321b343674b2572138a009f46b62f67112e96084b018fe4429644c6e68349387a30a218462871afe5cfb18281fa82bb471537777e24708faf05ebe283591b9cc7040e47901b60066102100805f0080005308648c8320540007f464074f14717627214462d67bba4156fc21e3c3d57e58715b62000000000000000000000000000000000000000000000000006342300d422d3d147f40b32051433022012c008005593d409f1eaa45ae23e5ba39f94dc77dfe3a0a351faa840eb8ad3)) <<< 16000) + 0x4f8501a91b52d48e6708ab1914f96eafd742f485aed65cb84c7a25f58dba715a32b0e7b9c142fc1417c0a00045e217a3b0bc01ec277db1ebfd4e8a0fbeaa68b1ff5c62b06824a5d7ca1da35446af2167c0561040332462c418418318134009b3b907cd28093997aab12a6f7872eebc0c36967711ee9a72b1e44ce8b01444ac291238591824cb68285883948e92718495d9b4c69a187217a910604f4bb5fd40928810804031c0400023e74718b30e3d57fb16c4605b13a18724b104199f864b53c0ce39a054bc2c0d184a57e9419fc9551681484753830e0c05cc62daadf10d8015be8b17f29461c1063bb280a1cc066e452f12620938d008a08b417454aa2f1eb1cf4f88bb01c8276f5f2649fe4a84bcc30ec667a2cabc5725d9359871e6106e13852ebe50ed1aa235790b3e02bcb0c267343d4c0c573bafe8c7901191c1aac639243fe25374300000000000000000000000000000000000000000000000000032a845a7a28fe816648c588308602382182169e719dcc0f2f0f8c6708ab17659dd833f9aef0f1acb2bd5268066cf5e8b743619ce074bc6cb7e706062579dd322cd429835d06a7a1d433bc29ca1bd1097937c642ba0b0219118349d0aa18c020004eb203e120008da218a1a0c40d0618483082416c0a000d1321826b9193c12a46e183afa133642807197dc1c08b18a108042461c473ed31bc2be37073e5931a5073894f686f3095e1048a0a75ae42b44d5991b3d731b583751e821490c1a997af69e26e564af40748d5374a06a292e6e2dda81bed45546a658bdaf06339df9753e2460b37d2422e2a3bd56f2d6e6cac5c4e56176d43c7a24ea16e04163564f202be52d561ede7f2e71e772a7353658306a3039b0703f0408839ab1ad52b969056ef331d625f289cb541791ddd60670e1a2c85f09d62b1da6510e27660f561c15421fb2022e031ef48d825997fb04799e4192adf825d76bf2548a80d50827070c0266ae09a26e03a3a8986f44530101409219e8cb1188c00f6e53e106fe1fdcf736a3cfdd29ce41142488060008001f60c0a2621eb7c20215df34e7120a539b26188041601f4e258186c9f3be1594408402017e020be0100009a10bd1985e00f882b5d2caf0a22a4b0245208361c944130a009233425c04818440100bb0505d0282e4141700a0b70505b02800057085a9282d0941664a0b20d0005f4990d13e699082848116abeb0c23c8a3dc50a005784844c302398636f2081245d5d290109860840201620a0b00504c0282bc1415c0a0ad0502b02808404158020001f83420090c91f10c2056efaf9a1810e5f79547041981bc08a23000aaa445e61c0126ad5407155261c2400805580c08407830b55c5a1103830d7342182741af020082bd6cebde04107e0453e2c08d03b046200beb63e9f1549c608002015403a106877e7650c18b9f286f710308c37c45e304088eaf4f820a0e3847070808eeb7ad4124008eccb13813841180402a4141500a0a705053028294140003ae4260540006f84290a4146520a2290509482804413e0a00058d213c4b065090015a810341d81982e8a0912a0a262aa25816a25b5122e01020e28a58d9f72f1e05bf4424a466020920cdfc82ae26a75a8a047e8c020060105396711879308d4fa8c5b72f60004aade44b30ea561c45f4d30686dc016189d36da5a609c97604246e13458e4d2ec80a8e3e217fdf286803302b4169400112f484000920c1100438756b73c394b1c62c677be1c7bfca1a058c1857e07cdd2060c1d0bdb08083c5a132700498608802000028270dff0ac8f824307bd242794132c6b5454c049ee4664c5009a6f168918083ae3887002130e1080400004f0d8a3c7fea6b0a2d6a1ed4906880949bace80b18a110040274061360209c0180007a10004a7304580732648a08cf220bb10819e0f557005006c6429bd0c0a27210cd80025182200848a4ff2466b0a2b40d67a30308242523588613efb7abe258131fa7ca08401c8136a34004c2844010914904f2e3d1841c25ed0d8412b508dbd22c30087a3ecc30955fff1af109440880201360a00012420004fc42686413232098150001f5180a00802025c2412c120950504a00824c04124020000a0212242090210479082386411a3208c150458882284411203c1904278bec50c9565665d241930c976c1009374ef8d4a039a9c1e3610022acdeec045450098e08402101e92283622347050b3e6f471d863c74f62821d5b213989085a4e643b18217f9dc1fc9006738df3104409c80880212258cbe4ad3b81bf4dd7862f42314b67185ede09100dec83fd35632e8ff52b6c144d4c245201902050a34d47e03e781ecddd9ae85dc32722132f4121504516b83133cb54d1978391e368662381b00c009481ad1d366169bc8854d83f23e62ddc882008f0264d4a2c5b044326d9776626f49ecd7b3389033c9d040f000d4e4135ae6cd5414624472124b67004dc1e2436723d914181ee07d69e10bef83ae121717b1faf02128a1000402201400023862445cf412ce3976993702edaaa161b7006f6f3f68d1620af1e16464f8850196a462af86b5a6547a702e33100f6cc716f2dc40a9420391d5baeb967a16ca8ac101803ffc3f51e4a54bfd9b7ea8f45b81d3ae2086600c8207643e5a6749ef616faf13890772fabe23699ad610275d846248873cac71c0a512fa300f814712e3d044352b8b117d35337a7cffb116d79c4245128e5010400012b080051f1087150430a8214341081a0830900061b10823dc080040101021a0800d03f8681f8240fa1207c0903d84)) <<< 16000) + 0x81e8260001946f00764011d3580ab46e28b0b890f445cfbca53964e4c5e3a435922926581c0000000000000000008c9e18ee8036605a1228a28409600200626795f7122cef08fa6b71d0e1c73d190a2db34ac04f0c6003c4ef32cf9dce4ca3c1a9b6bfa8e972f28d32cb0a41724ed82401d795d30fa1f95c4aa25fe069cb0143259585d9bf6d87ce3ee673d7bab1708cd6f34c6717aafe9a8c71ab29c79ec16101dc83ee731509285c1f6d00101a3fba2662f0da918bec9a28175d303547b831f07eef4c8904a6abdfdada2d085946040a61eadf9ebfbe62590c89d51c36005b8a60a472e7395942ac3ac3e1172fa3d877116f205767bbd3652f91ff8ac072c000cf041adcb11e6654fe8e34256923af113bfea05361d27ea1ce24bfc135c9e061dab2dd7cbedc1556318779a83260c01ab8779246dcefa929938a8efaac81813ff9041fca17bab927942fd25c612aa197baee07b73d803559940e0c75e15700f21200079c20f0420771503b0a81d4540e822073110390681c41400174260101c010040380881bc340dc1a06d0d0360481ac240d4120690903400819c040cc0200011236004adb7dbe09bd1e018f57d5699e504c35b38fa73ba20f67678246d12eb9500af2d7472234d133d89bc8a98684abdb37f648b328a2de3bf2638d29cdfed70404130ced471e8fcb4e579781be5e01015932aad03a21958325f0c852fb5a5d111c3b43efffec320f6b2013602da53902907431b94a746ba0603d2e132e808008898422c909062fde9fc5fd98a082fdf7151a1eb8e1fa0a11dd4f806fd98c9d42a514f2ccd63d05861bcf5f33e4aa0ef66b7b3d5b5e7a55e773028f46d4d64000e09e47597791a166c90b63b62c604458c6030241f16d76679b972aa3cf98b00b85d3c91da384ec47dd3ebef01a7427beabf93b76a44f8a79567695d23b355d991cbc87259f43c0b3d4b6305326d0bff56dcf8c8729da2d7a28a678e2e0b8d6cf97372911e347516619efb45870574670ff11f0d9e5869b8937b1cb00013b0419434004b0e400cad08058981f7e55edff9e28590339f9bf3b9a43e197759317f227575510cb00000000000000000023015c96b16e4d8501461fbfa9fa911b3676bf5169d0c730ed83980000000000000000008a6528871a62c355b7a92e09c29652cb1a84cee4657947c849083000000000000000000228eec95d58a5d7bfbe3a6856dbe1f19f712d2e5b17ee9248ea950000000000000000008882843823021020007d1ec549adab03b2ff359aa31302a06963bb675f154b68a499454b317c5e7a0437f1a3ede5274a60a2794b5e34f2d54cbbb10cf034fe80c91cc1acaf7f96cd867952a231a6cd413e797c3981bb503901826c5f48ec1c07b08a14c1d6919080ef90632446944d07f9ace0251fe512dd418b7385499af8a4db5572a703582b811d0b5c6aff982c18580a85461085e9ac055a3714585c487a22e7de529cb27262f1d21ac914932c0e000000000000000000463294438d3161aadbd49704e14b29658d42677232bca3e4248418000000000000000001148508704604204800300000e5a20836865d438aea70208805c536756becf5b543d7d80ef0602f35509d91c6074ad358f8a2208fe83669a99a179effb02e34c9fd4c60ff7edde5d3a0c5497c8c0bece470c98f8f0558a4c912a000a064190740c63a0621d0308e8180740be3a05e1d02e8c8170640b63205a1902c80816004001e96403153880749119034a796aa90b1133f8e22e5d479b9430434489169317bbb1a564c140aa0d8a1301fa816640838428410220010002a8a83ae401026017d97f6466730a4d1d53d40cdf47fd5a97c13e8b779ce48edcba7c63c9650ef8c794240d810ca28dd003919d8cf145f8c2e3013934b688df31ed10304c385538cd07036d3b46c423fc048cf1188f751f36ec7716007c1422731bfc86bf74d2e3c4bd7816be7773fe0495510765075b0809667b696e1372ca02ff5d212b02ca1ab9f22a0d2270eb6b4050542cbf11ab1a1263334185ebdc4e3b92a88e99b459e555c8a82064aac625fccaa90998c7a17c1d64cfe313b90fb3fa09f0b371f6b8ec0f090c1de3496d85709e96882d92321e5e93600015d882b88c158374c42742c15a1386bf2453109d0af9f25a4ecae09c6c277db1d7fa9d141485588e131ef7efe502356910e7f7a8d10409cc2b054c81080c60c704504304511503dffafd6e19769f80dfdb386c3101c399b49a78622436210cff59cc50910f17d165be145be3c5672a2afca6bf3a1a607b638ce2c2ec277db1d7fa9d141485588e131ef7efe50237cc90115a4439fdea344102730ac1532042031831412400c0154540e84b74c528e60fb571e3d5befbbf35dded9609a2e7c799feb80d4e7bdbe1a68a11f58e25076a00053c4154f602673810d9dcbc388901ee9815765f2404fb755f12e4009a58bc5028600048dd4ff688002f0958f60011105e12ec8410146302701401080ec802901d3c51c5d89c85118b59eee9055bf0878f0f55f961c56d88000000000000000000000000000000000000000000000000018c8b24b1ca14814a0430010005142e500200dc29c38cefa0612ba2ae35d246ac535f191400664cd5b8801793127b020010828ae30805eb55052808dc60840116401480e9e28e2ec4e4288c5acf77482adf843c787aafcb0e2b6c400000000000000000000000000000000000000000000000000c646946926106066846005000171001006ec277db1d7fa9d141485588e131ef7efe5023901d3c51c5d89c85118b59eee)) <<< 16000) + 0x9055bf0878f0f55f961c56d88000000000000000000000000000000000000000000000000018c8e2ce28d24d10e0c304104d000c060080378cb76659af46908940c5088e10df7dea369a22c55724e72000d77c99e604a184601000011220007c4406c14000c784128440a812053050003fe9a20917b777e28691ef30ef09112871db001c45dc2c483460052b6505d1005168214dc05198708802007c02052010288081400400032e40ec7400182a413cb409c2a04d0500070c90014b520987b04b01614d9c71abe901a4eece1411831a73a42f040105f74bf447002ef406298c065e30afca01554262c23008718706ffb251c4810b33cf4406d0d62604180158b1c90c200f01c68130000d219b9e8554987088021d66a6f981e0eedcc29d7e19c561e9fc1d3011d2ebe50ed1aa235790b3e02b6abf14a78eba019d5f12c0a99438e30e20410808200fc8411d83d7cb581e5dfde087f1b833783a7b23f97a95a581291c67d8d49aab88476d8d52592f69f1f494b0a5a9334128040920200034120903a0471d023048001374d112b3160ac1c2c290a53ac509819448831812936ab194506286c64fa080143c1e840100c1602e6f015671c2200802280811004086020210102100800076482094c10037440c5b8a8697b5746082ae3c22bfb7f3142b07b19bfc1d178404ef8ec349bfb84041192b6b0c3a8e40903f229d81a91ba614017125b96f29cfc0015adc4f22b8a1805540f42404141b02a30a19c570210e183b1ace88307804589350a101d8b8de01823e173aa51001434c351e300031f806a8000af1f7cc82a8503844010c2a3fb64420406f26393420e19c61025b630714e7637d8611125102c2292881100400fc1407c0a03d050000a6903c2101d8a8000cc081d1480e4a407022037050002fb10363501a92c0d05606603f6e2fd4a586cac8bd2e351943f0d95917c088481a53cb554858899fc71172ea3cdca1821a5d7ca1da35446af2167c056c80289380c3247f14e2f63101360ab1c54b3ce5b44c2b7af0dc200000000000000000000000000000000000000000000000001854b1c81c90040004545ec660f2274bb5b8dacf70f066c9f420d34dff43837857296c6abe7c025a56668b58b570f45db6db2871f4de8f64aa62008a60ca33525b409395c935d8900b366d08e583d79a7f3ca4ff34a756c4b7998bf10aa73d2cc5d3d233d9d79a20bd2bb6861879e0a80c24e67abfcc805113c8a6e18313b8d266015524242100801906c0c40784f7a06fc4100a6d8d8c5c304ee5eb6ea5009d1bf90e01514242c21008000075103025e1127f97ec29240fe4fb58e4063ba0497b0a1acf4c2b885041958169a002812921100400bc3405c1202d090160480005b48159680a8440007ba6c77aeeaf0ce6f65081055a148e6543001c25e32d0088fb6c4408274b38d0c772f08102c03163a7e39c9000b6eb5198e2991006899b1a4b5158c1030b0627aee2e9d0003d09010386c0a8b1f6d8a157b20706193d87071402dc759520218342277040951c9c00e0811561e7eacb0312190dae080276f8e180000a0708802000033e40a454050220271100a8880983404a1a0240d0118680841400099264284a29e9e038442bf74cdc7040695d78b8c086a4c96e70819862c8688100d35824984101f0e5f59c0a8a139211804304b695c7162c1889bc3cd920c34e98e5080122982a7e280116e897b151425242100800008990222581080f05aab215581830353157e1c17afc5cd10c08e53c5b41450908080021a340388caf840257b08a2e110410804346a6c9d716450c01503ffe2c2012df42d823082200800005790200900f8480781403a0a01c050000d9101221e111d5ff48a590c480b5ec40e36519a8c306b55507b438013dc65580128810004349881b172949004c98f2bf0220c22008719bc9583a0714d588e6ca70f23c11f2e70000a88060501080011c50015673ca70f2afb56c79400312c86da4608440100000ad2036020001af200049a4068340321a0180900b848058240007ac405474000d924050c402662011310078a8038140014426045d23e938cef20b50096f8bcdb38107e8bda6cd19cf5976ea28ac65d93ddb98db9889e5ac55eaa9c50bf73ff4aef0d89d251d940bd33067474280526ddf32bb13c46f1eb86fc8a143bba42e4f574f7d4408280c33e5192626687b7a102f73134fb457b33ace08a1c8a350dc316271b0e675dc70114c3159e658ec400efc134ea74a8917982ff7d807d807a39bd84ef631712e23a59f629db349e72ac1e19b6ddfee8ce43f4a71512890c089008e45d67316f9d907591b0a8422faf1fc870735daa4e92e500e7680273c57d50dff740ab86e61f2390d8103cec3c6ce7ec8c2e1180cb1f93cc920a0f844ce97500643569f3b98e96970a2fd9f20255b518a90b3490bd9f66a5a58dfba4ac044d36422e895d16f0bd904760e598656f114e2b46202802008b2245e134718818087498ca0c34452dd768046184601001201e132553690885100a73b87188219376fae4241035776f840481846010c260484921f0a2053bbaac8104012566be84801f3ce45dc090308c0200001c6400078480016290110d00804803c2401c0a000356201a3200c190058a8028540122a0081100388801844001a324009ad8801ace1a0cefe1b4988820234567319580a020618708a3020114c9f887400604d84cd145540204aea58575ca8a8825c04c75f7c467e5b64a9942efb75bf7d580aa054040005010020080008b88018c8008340020200001002aea9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase11" = "QuadFullFourCase11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase11 private def zz2195:"s0893"="s0893":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase12 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFourCase12 private def zz2196:"s0894"="s0894":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase13 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ private def zz626:"s0272"="s0272":=by decide+kernel theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFourCase13 private def zz2197:"s0895"="s0895":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l15 l22 l23 l25 l27 l29 l30 l33 l35 l36 l37 l38 l41 l42 l43 l5 l51 l54 l55 l6 l60 l61 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x17067e776, -0x1165c4ec8, -0x1a18a8f46,0x1d7c7f08], ![-0x1165c4ec8, -0x4e0bc3852,0x1b91a2c8,0x160098378], ![-0x1a18a8f46,0x1b91a2c8, -0x7115930b9,0x1165cac82], ![0x1d7c7f08,0x160098378,0x1165cac82, -0x8b2e3ed4]] noncomputable def hinges:Hinges:=[(-0x319f2e,l6),(-0x2fee8e02,l5),(0x1b692829,l9),(-0xa1d59c1,l8),(-0xd971541,l11),(0xb4013de,l10),(0x10b0cc838,l14),(0x13be4cca2,l15),(0x50edde2,l23),(0xf2c99a6,l22),(-0x8b2e3ed4,l27),(0x8b2e3ed4,l29),(-0x10b0cc838,l25),(0x82fef52c,l30),(0x8b2e3ed4,l33),(-0xb4013de,l38),(-0x8b2e3ed4,l35),(0xa1d59c1,l36),(0x8b2e3ed4,l37),(-0x82fef52c,l43),(-0xf2c99a6,l42),(-0x13be4cca2,l41),(0x8b2e3ed4,l51),(0xd971541,l55),(0x2fee8e02,l54),(-0x1b692829,l61),(0x319f2e,l60),(-0x50edde2,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x8b2e3ed4,l27),(0x8b2e3ed4,l29),(0x8b2e3ed4,l33),(-0x8b2e3ed4,l35),(0x8b2e3ed4,l37),(0x8b2e3ed4,l51),(0x10b0cc838,l14),(-0x10b0cc838,l25),(0x82fef52c,l30),(-0x82fef52c,l43),(0x13be4cca2,l15),(-0x13be4cca2,l41),(0x1b692829,l9),(-0x1b692829,l61),(-0x2fee8e02,l5),(0x2fee8e02,l54),(-0xd971541,l11),(0xd971541,l55),(0xb4013de,l10),(-0xb4013de,l38),(0xf2c99a6,l22),(-0xf2c99a6,l42),(0x50edde2,l23),(-0x50edde2,l63),(-0xa1d59c1,l8),(0xa1d59c1,l36),(-0x319f2e,l6),(0x319f2e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x390c401c980800000728c5019230140000000110a81c60100000000002102480200000000002a0710040000007118406c30100000000c45206c601800001822840648c05000000418c6024180800000708c1024c3014000000c42900726020000018a2940648c050000066291080f20060000000000050320040000000078500c60100000000f85c098c0300000001908813180600000000382406300800000000784814601000000000d0901cc02000000308a20361808000000730f40fb30100000000c4520286018000000148840d8c03000002844080c9180a00000608a1024c3014000000a42100726020000019810807ccc050000029c438069180a0000052885019230140000158843203c801800000000a05014c020000001582e043180800000025044086301000000000000e06400800000000b05028c020000000150481118060000000028140b30080000000000481240100000000002502c8020000002987a07d980800000000000f0320040000000000e816401000000000004c0c8010000000001e0059006000004604201f330140000000007e0164018000000000f404c80300000000341a0318040000000461500a300c0000000000980a40101440a1044006350060000a813828036a0080000004908403230100000000098580c60100000000130a014c020000a41502401ea0080001582405809d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x418ba07d9808e6c63008903cf1401c0000000001580c401000000000029018802068648640404ac200c0000006515402830100000000000320640082c91c91860258d00605863863040311a00c0000000004c00b200c006608108203e680280000000013c02c8030000000002680990060001885310807a40100000000005e02640180000000001502c80200000000002c039004000000000014062008006304605601e480282431431020188d0060000000441080d1806000000884c1806400800000108983012801000000002211038c02000000004222069804000000000483033005c48c2010604ee2803800096158410269004000000004a2a0498040000000068340e30080000000000c81240100000000000d0388020000000190881918060000c42404c0cc4010000000044120446018000740d02101e10040000781082801e20080001f03c08407840100001e0420d0138802000000008828030c030000084310780920060000007114408c301000000000f0a80c601000000244710120c04000000408e203618092c081e085008d2401c0000001047202860180000002a0c4068c03000000000052049004000000006c180e30080000000150c81c601000000002919034c02000000408c204618080002d87618409a401000000000a8300c6010000000000090188020001703c0c603d200800000000b474093008000001424080906020000002448101b0c040000000391881b180600000708c10192301400000146418090602000002424040930c05,0x592881b180600584a08f202bb4014000016128203246028000051188640b100300000000521a051804000284630c40b440100000288c41a014801800000384d101b0c0400000f4310480aa0060000148720a00d400c0000001c4d20286018000002c4a101b0c04000000003c3207180400000007231022300c0000000000e81c401000000003a25038c020000000000720490040000000000940e20080000318682602c80180000002c944050c030000000411c81b1806005c8808e102bb401400001011c20324602800005c298a8069003000000051110161806000000b4a8580940080000000000120640080000028c4202d0c040000005c562c072004000000b4ac580d400800000000151606600800071144320265004001c228431012da00a0039052068013b401400033082088114802000e514a1a8096d005000000000012069004000148430c807a401000000000000606400800000000907028c0200000000000a0490040000000000140720080000001244203c601800000002511018c020000004888204b18080000000000340d20080000000000881c401000000144450318c040000000591880f1806000000a31f40fb30100000000168c80c6014091c4020c09dc500700000000421a079804000000810c406930101819018e100c468030000002103400e4c04000003b04100f9980a000000870dc03930100000010a1a80d260200000000001d024802000000001a1403180502471010303cce401dd68ca011e03ee280380000000003102c802,0x2702200b18080000094260900b400c0000000003c01240180000000002d0388020000000002a00590060000000005700b200c000000000aa02640180000000002d0188020000002187a07d98080000000000bc06200800000000002a0640080000000002902c8020000003502200a180800000006e1100b300c00000000c8480e60100000001902c070c030000000360480618060000000680900a300c0000000d02201c601800002023840930c05000001b02100f9980a00000738c700d2301400000008422028601800000001916014c02000000338b6043180800000061154086301000000000c8b8146010000000188b4088c0300000000322c059804000000000054092008000001043900726020000020a3940648c050000000391880a180600000005219014300c0000001706201460180000000017c04c80300000000005a05900400000000b86406300800000000171a0660080000000002e01c80200000584a08126180a000000a22480393010000014524a0324602800000304b101b0c040000000492080a18060000000a249036300c0000000c4420286018000024a3ac0260c050000000026140718040000000084780e300800000010472044601800002824840648c05002a438460815da00a000000002c180530080000000108281460100000491505c04900300000000542a07180400000005221032300c00030886198134802000000001d0e018c020000c62206803d200800000004219022300c0000218a82602c801800000028924050c03,0x1c22b03080f9a00a08247185240a6b40181419210e1814b880300000000003103880290838904181b65200e0000000000c406200800968e615a07ac802800000000033018802000000342a1204a00400000000009c0620080000000001280c401020f1ca14f020ad006000000000278099006000000000098072009c1082410603cb28038249206189029ad006000000000024039004090c80860c072b4018000001e230812c6020000003504400e4c04000003305100f9980a000000d711c0393010000001aa2280d260200000003c8c4078c03000000418fa07d980800000000f46406300800000001a8881e6010000003444101a4c040000006888204b1808000000c40d0039301000000ac10403e660280000031c3700e4c040000006286a034980800000000c4340f3008000001821880d2602000000014884050c03000000002c0a07180400018c4c0cc0ab40101018e10a180e56803000000010864050c0300000000000a06900400000000009409200800030862098176802018210d0c202341006001461d8218145a00a0000000000340920080000000000780a40100000000110f014c02], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0xb28106e0fb1c490615a8d2c9372eb6e861001348254c10b4da243020c9ab739826041f0085930e39fdf24324074359809e03ceb8300f375eca48083a0100000c73c487d998a016486ab2f30940828e48c792087e7b7b8020d84143bd4a0040010b2486289e1921848927d50821e1303400830d2dcfe83003cb484eca003e0100000f821f80a00022521f61312f0987d04c3e427a41ab3a4c65115dd250a90381c990dc482213f8798848203c010a127803fd125148ff1c0bb358a749c583e0915f47176f85299f89ce83a69a53fc9011917b823706ba94b8657cfc622a92c71f5699a7b05a7783625afaf8f23b40fe1000528b8c6809d78b998987ddbc648f4954fd0e9175be4dd7a70b9eba97babea81000ef604df9d6835a8bafca6bb813d5fa1599bac24bf8a8e55186105826ff428821e858992c3fa3af5e13908f710a1d7290f1d1f8a3077e47f8c8ae51102cb050787fe8fdbfa8fd00b5fbf9e1f9e111701e9d9a3e6949781d84646c3c821f66f000061c224c2a12501000399112e) <<< 16000) + 0x1d88482e841b4faad12c100a4b479281e01186e4280102043b600013924faa594208002025a0bd340e040164182001523c323030cba7942a68408b1edba0c081b338fdd180eb972684366042300871c944386f31c50226de9806940ebe83550e380013a08870947e75618082404476bfc8020000d2f01c091301b9702020ebe3f844c801100838e5e3a18bd0e281b0b4c4e1c7000274110e1266beb55a10480f893a710040001a5e03812260372e04041d7c7f08240027515e3a6400880400003824000e74e9a2c834dce3440789cb721a19cc49ce68d082596279858202d0e20f18104d6a79c820c2a4cb7e27002100869b6e154c2b0c300013a0886865c438fd912187fd5e05418749392b6a160914813dbc50202c8319d1e0000034bc06804c1f8e1e4c80110080000704896028000d3480042e90fb0988884c3e8261f213b2428238e32c567835c149081978b650821e8fc8a8e041b6e6a7000bb3a78789810780202520312801d8a693413845085b04eeb9c081f80c2f041064237b45811f70ac300029e48439093060f80400004a489588f0a1c7685c4c185951a2d1832383179030ee7fffe63429b3c25b050418349f904194ba9ab27001e008794000072cea58c000068eb638631529a7c6306526dc080e1878f26c5cda202451f6d916082a6d1ae9306002a18356641801ccfc86c32e400900700003ac44a8062520312801f1839da746902957a761428b5e8f2681e249d4a77828622574e5861f2ab32303821998a6e4e003c010d200002b49488c00007a7634513b1d63710280c719dc05162de7166c40635def6be143f709fbf0861ec6f22eb8608ec52825d4900210140000dc9e3035561ab9028a8d0ca2145582c8f44788946a088c50c0ea69f8061c5bd346a1c20423fce13800f80434800005692a2300000f4ecd142763ac6e40a018e33b814547c2c18e10186bbded7c50dcdb60bde187199a1dde1821d8a504bd4801080800006e0800190912701f182d0e20f1e3177698fc40a51a5bc80a2c05adecc7889ecf23c8a1b2684a4a186aea0e4e4e003c01089800000b00043cb02fb059d19225000026e85a0f190da8086ed268a00004e96de2052484e4ea180a2b926a9da6f080c586ac745ae2870db6048d5aa6e900290300001049d2f823644e806960ad681014216eb78408a1e2cf0c009a45a2c58006bb3f966041d00800008c90960500025a1000b3b2001d9a44986424a0a0011b422481a001bc622103ba00b844f01146d6fc03a168d769603a0aaf942b5ce4a079e3b320a91428e09200c00a0060082016fbdd8fb1444602b702e4536c9f091f4e353d0008ed99ad08e100b63d8643dcc86df824af5be2153e908b95808c61003150002c022464b0182189100e802e113c0451b5bf00e85a35da580e91104adff7301671242db078886df8c0daa7eca3e97635c49b67a30835c0702e00000000000000000219cb015ce131816828a2084021023800c88d6076536af1f7950d48b6bc3604a0ae89870442fb3c13dfa0b9475bc5cda0ac330c8e6655126c0ed89afebdca27b67adca3c8d0294951c00fd475463e4deb4017089e0228dadf80742d1aed2c074888256ffb980b389216d83c4436fc606d53f651f4bb1ae24db3d1841ae038170000000000000000010ce580ae7098c0b04fbb80a39205a259dea705545144108042041a40852cbb74f7f3fbef403849bd5c31b29310b95ded39db200a9a8c4abb7be583271b62f8161a2cd5e3fca50ae27a7e8acc4bb6bc1f7717d5dbb27a5624fe9099844e505458fca242020004e122403311f1188f02e02002008b206a8ff0891cd1d675910eb3ae16420a9f0378830073231f094107002123406a33bb18a4c24062826602e8927b717a348459218052abada304f185c75365e5d0918029117fb38cc14148bafd3ec89149f99bb585385157f59be3b6fb85320058068c2403852e53b38a124d92a30db6abb248602ba27e295c6c48c03c72e4fae954c1415552b76bfb81228a23389beb51114544cff9b74f75090201edfa74bef68d001fffe7bd035ad1d72c801982800009a8800255191e7491fa03c1f6a78460b04942732c18007b3140c901078021234088edbfc447cd22c0044586801a88c2401c9efc35c258926f6d9e1374b6f8f1845f1d163e38389180645fbfb64a54c140f8af74d4765891479d81531093a8515225a7c526d1daaa7e3200680a8c2400082789402e124dddd4bc89b7aa486031625534a8c648c0664f367851a4c1415552b76bfb81228a486e39b01f914544cff9b74f750902007e04b1ebe00d001fffe7bd035ad1d72c801982800009a880027d10005e036401acbc5b24706ab59c48862b1c763020b5d6d1f806001cb05eb94007c021130032b02cb5cc72c80189a357aee78823a8184c0e8b1244505b45e1ffdc3881410c2076500482c4055a779343220810611a7eee6470104813e5234251c0c08302e814323bfda3dd2006409800026136400c2ce07491c45d306cc10406009fbe3c18db444731608084af7d46000905bf0d30010804226011d5b3ad52425900154c34a24211047b261a31d538488a0888d0ba555a10282bfb23295aa45880ab4ef2686441020c48857b915c8209027ca4684a381810605d0286477fb47ba400c81300004c24000eac88e848001d3c80098a911c0d88d86c46826232139539b4dfc17a09ef2864855fe54fdaf7fbfc80944dece53368d43d15ff8e48f876ed9eb0d146627edd23f71af5bc65e441ae02e82e9e84ae76623781027c2e562898595e2702)) <<< 16000) + 0xb6a595235f42cd66a159aef96d451875728071c1fdb0cfea5410d917036c2ad55136ec6a443deeb4c8fbcb3bf2305a8246ff20d96c169e30e730eb67b90e80686e001640a064049839287999a21c5691f0860124424d480038010b2011ed14550b20848948b915c491c0f693edc3f344000009f888c410c6854fba1120211448d0c7c82089a8f04d9270419e50c1edd2d100265ef63e82a97200540580002103438353aa2ff4903160f501504981800008c1b5861a776213d22820ab3758d2381c0162aded7591400406b3ae9d0e054eece02c08200d74dabe0d129c821401400007fc88c02c45c1622c03c36cc978c31c500005dc010432a2d6e4d04dc8e8d418080002d363002ea44a5e280544b7a7c001db0944b8218141f0040000c090006e1222a3a114050005b49001f2a22183bc08446bd361d554f16f03c48ad0115dc21ec4052b14f980b20702196f058c060da7a37a09d5b6a4cb67824d17f9b0fb1f42c3bc905b1e1b181d881183c814001a10aee1a384f732c04d67c91c15a19550219b5b9cf81894ac1ac5358e8805f095abb90517558667ff8cdba162d3e6562bbf40b1e46fd6de28f2cc948007c9205e4f2d19ca331d1a62902ea359901164a76a8d25f62b3141157d0a018eff3568140ef28a81f49d47bd3b847c24bd1b59caa033c6c9860a376dc853aa32e9dcde544953741eff4a99c2974ee8cc82cf27b18c63ac861d86700006bc209e4bc2800009bc40c048c0800bb8a813186e819cb7d3c012289bdc36d81ec60cba85877e5c0186c24f7aa85401c1177bff8ae470209f539377be00100320913c41bdb904801681c246002397f847bde30de61b7cf4eeeb8914500ffc229d279218416bceeb82b218315c6fd3efffa8186affb7efc126b0704509ec336488f0209ce1f4147dd8a2800c44433d3e96da6b27200660a000026a3850e9e13845020f2001ce5567f7848c00e6f9eab9c186f3661d3454c121833f8ea35b4860c645b84281e0186a76e8aca4361811636da1ad7d0209718b7772bbb1f59002d0387900595b5de6f624602cac1b341b0c3764edcf3b21890c19dc65d198430633249fcb7510c35715feb42820c08e1a3cca792c104b7f4c4795c8500136564b3d41ceba400b40e000045c40011dcc0a0418345ed714228bcbe0b3367e4d040829fa78f404e4a4040cf7f7739b1842842436e4753bb8c104f5e73c7998c084821d2e11b3959f03002e12e0622fbcc00074aca2f2d13a1a24859003405470e08e52c680c40a08e4f692cc28be8e7610abc40409f4ee5e9c28430cc8b58dc10505bc70f37848216673f45e228041ac42f0d60006034b50695b9900280240000fe11130500025011120988884c4401621e0bd345efa6da1a600002ee02c712612b48208fd04dad490400003c48208a0b67750c0fa0d2676000b5757880430203e008e3a6aa19c2ce2800005dc0c2024c25690a0800001e242084cdc3a5810493a1b48840332dd3eec000aafbe0e04c061000238a00000bb80c2012612b4814512e381fd0c11eeea9612104d424933e8e0813a8459e282000003c4820844b6ab4604011d79fdec4a4308802000038a4000d988870a843404000a56443047401708bc0451b6a73fbfb539fe0038d681a67f580059c490b6c1e221b7e3036a9fb28fa5d8d7126d9e8c20d701c0b80000000000000000086e8c4806c6ffba388735b76325e86bd8d54f5c6525970000000000000001d5c0e7954e6814a40848230020008857589ac845c553e936c5af319c8c4996f5c382cd05c339a2e1ad9d355e22ac634a0f2dc6409e87baeb5eb407a4c4501cbfbad378bb2c6c0d97cfd7aed18951c4da22c562c99d0ffc2773628a9f43bdf608a9d2a74036ea4256852e800301109b250370a80ec242160a001a20221432004a123030ea8fe420c1cd4883880608d8f199d0c005cfb45ba00120e10004042417d7c7f0800000b4da4e79080f81b58f11022cce09b310c11551461d440559d0f32469c0a230ee90aca2c3ed1421fb055081860c30490050100e512d66e785152abf297f8be6373dc35d26d161758bcdc907fe1bf7992b9acefa17e90ed7b53c3c6ced399f7a905d9414000d1c8840cc0c8571e3eedc6d675a8f5183400fda2b4814fd6ff2b97e62a500000000000000001eb3a1e648d3814450a38a3862845023002800a24ccbe412bd532c03e86f49f59376dc9bbddd17d10da701834f437de18879ea23b328ef7e7bfc5e2c8c72cae24680017f11072d88312e853373a866cab0a1dedea0060bc8faccf298de5c0e286bd25f9321310a85843876fefebc54da9ea12050a2a4234474ad4ec6d65a97c641900351693b0d02021d01faea148c41053dec64717b74cd719fbfc8080434df25864c2d9a8f510725e0e3bcb5e9fe6f400028223061816ca8001192f693063eb4b58056d58078a4ba6332716cdbd034daec3fdbf51e6e6b6d1f9f1d6da486856736aa0a1c8415a542944c8f42864720ffc9285953f07d41c5213c486d14252487ef4180cb2b16361402fb3f1200114498a08002000027a4414541221210405000357910319081008003adc83704f852c595d1bbbfdd029857272bf884630a123c324be1a49a19cbf82950e760218204941953c508f09eaca977adedde8990409267eae299f11df4defad77725f084000009a745cf2019f6451d3b788ecd6152c614bbe0f0afc8c1625cb50b7856fac01682ed71e5c3f5662a38201eb7853b5b06cf0dc701714297860a65ca103546ac8303e09c6dc1c9e33ae44c7615c00023d9c09e61a76b)) <<< 16000) + 0x71e0404a8d4240c5d018229dce967d001802733b8ea3d00a0685a9f262670400fb2dec8e3108808883eab606ced6036e158b51eb025b6b8bcbdf2467a8ca05a0680002302202921003507f84c3f8141fa0281a446586697c3842ffecce588182aa207b59b70a10d07b082ac080033f2bacd30380cc8328037b14010050b8053a08a888bc7f1f55902226ed2568dc6e7052040e314e0b7cd14a5940c7081f2ae309147131c50a9640aa658084f081800001a5aa030c00001192c82420506d0adbf0209ac469ebba8c034aa3974d946c4821481038b0000498b8c2650d83c6f2c91d28b2588c22e3661b2a2c80f11462c01046346fb4a200000097a9c9c10880200002ca78c59bc94578298488aa18fe080b20551dd11b1040c00000d2d50186000008c9641210282890a908a040c7081f2ae08293e123b1ee300d2abce27176c480148103099434e2edcb2474b59812308b8dba69fcb203c2d6897381000058d50104c407a6e62000000adbda700220080000b190fc050001cb90fb0987584c3e8261f20be3104228ea0c00e2c2551999d2b0c2403e4f011b5cb202730d2da568a18000009e2908818000009e16782083fe503e5dc0904139877baaccc028b2ee29644288480160162cb48b4551b0c264ef3cb062c91a8811fbcc22e55cb1452c811ad24820e08000227c12000000ee2ae700220080000b190f80587b82c3d817c63744e5002152c80cf53caff301041b21e601cf0b0404cca378ba8c08228eed4fb70410d9be9459c0601c74f9cc132c70000001b73bc00471d33cd0638480c2b028718000087b9184d9714f0366115a41c6609640fcbdd13a584364a369e0c0810d979564000001137e093861100400005a48001cb10f51507a008001ee88748aec90a9fc73871234816d4d084a142c3b04d3048b0b944e44120205b28cb261008b9ae365d030416efefa20580161d5f460080121b1d3970280192484a0200001ee302641bc11936c0d07103eac4b4db5b6c506012bc32d811de14306b72930aadce88102e685aa79e81470486d23df9391385006f0ba8caf4c8001101705d9c38d7ed17b0243941a828000090c82402c160072385ef2c7ee58710fe7a2ce94240600b4092c3a1c38cb8d37ea68c18416834ba88104282d263f90200003bfa45de00002b727bba5d00e3e794a6e209073429020000103100162838300001191c1030b0eafa3014249c6de79c141d6d0b981c1808493b886c140212c207ac5005048ba65a862692a241981731e12006000069c8799ec1b8e61e46b0f13187812c3bc861dc3b0ed198240ae3c7ddb8daceb51ea306801fb4569029fadfe572fcc54a00000000000000003d11441032001c014008050044050bac8cc339b1fdced276b8452dd401fd4975d6fa61941e74f88e8f1fc9361c2aa40036bedfdbd3054203ba5800c9a586332039915b5803b6cf0a27537a2eaa223b71b5acc56cfcb25d00746dfd8cb93c3fd804008023098221116440240d9e0483058ee70270208c2decf42800ff7ce421801045007026081f0080000939802008023091fd1316320212783aa00c20db2b2ab041b75c3e8038008b115e9280016ba2ff10004a6b68f2704200080000ab90ec090000d4903f0d87584c3a82607c13a0210abfde0842283a010b22c896d6d24302e838b830dcd852e23400176d75c3022816abe0425141e00800007e9043190210080006588748ae802e117808a36d4e7f7f6a73fc0070481c618610804304b00400201010815d48fa792025f462e256c99b1a534497f43ff1050b22050001aa21d0530e71d8730cc294541ca130e40587180c38807c219a7993f961b68550a1881b91e1da7920083755ed10003481d768e00adf4e718005e8e703102938a100043c51a257b599851824f3752bbc91451373af484030028777279cf2b3e28206137a2642b9010c723677706020b702901b2a60083eda410bfe1c280996c654e25f08f9ba12597d2982890c2d04078a709e58d46093581d66c4880c6f2f00288bc2713705041e7d5d9640412c8a5c2083d21447843384100040144040002dc4100440008024384561c013ebe3f8411d323d5eed9c90abded29c300844e10b0c40c408104900800182031321ad0d686deab3957b5a7113e757535f09c6a61d49a3e65199f8ff1d8f0e57146111af086320bc945872cb9fd1a206d133d0680820f72957418006f3a7280928810004037c1400023442ac641520200037421bc2b03215dc0e7954e6814d4e7f81a9cfefef01146c5005c220e11839218c19208c0900000993b9114a447f5c0bf60ceb4e402ad42fa7928929a11c80420b49c53adb9080a3a9d9cafcc58ce25500024721ba5b0dc2186d8ec368261b20b0d801d0c746e6e44b0019984750a00b71df78c00247918c9811241820008613a9b5ff530212306b1420a57cdc8e440ef824b58500cef3e38009440780218417ebbde060435aed384b088f315f3841754d343a1240c1f00806000800039c86b8a800084486b0cc354274380ddaa202830f344198286ab1125cd002139c77f0801477410a00094607c021c53b50593430c6e968803c0a5ec8ce08c107802140e0fe52721041c00800002510d409e123c2838d380611e2390900210a0270230c1e00800005210440d06982800080c8690e8330040006986c2971c3bc74552274d4af654c116b963c03bd709083ff41aac718152139b2baf92590e75a5d8341c0300d4c19404e3059e32ade43dffea864605c8001a7306af6ec872472f035172e26428d738394405096d85989225)) <<< 16000) + 0x9ab3aae0ea5bbd667d6701a7c6208321e1cb8906f9de8950dc82a638851243a80003b221a23b01d19e0d5951a6acf08e97e94996142e3c634182129c1ba218414a21e78f00edb4e1e8605c5cf6910449c607c021c42d3bdbfe40468e207de689e1ba6e305112676e99a20139714ae94007c021c409370edc204e5fed7fa288ca146f563001f00800005110b40586802c2b007a3906259fb0e1ab14a1f1081d5174d0d9a00a34f1929000feab7cf8000e9659e1004c204001000013120a6220003553628e5ccf112c26cb20682502f2c401b4704164fee20a0b347db6c081df4167d44002de1c8c81109c707c0200002b8431c8409e320cf0d01d82831814000d544338d619a530b10df17e5541d470c3866dde400b87de600461838010b2e20dd518e19725546522081c00806600800022882186c32c261941304205c00666ec4e870b5c36087830470b782e6e0ace251bc3822c16f48668fcfab68508056c85e3c001677a30317f49d50f46aa556714099e480350f44a7e4296344b2013e225e134709d6b1e301d7e38830733b1d19e19ec62634b9b516f71b79ffa822604537405709ab926893060903d856e4fe846ae1a4f44ef1ab9e8883d4d800007fc43247603a2bb148bc3de210102ae688d141d454a6ae811880f80403201608403b14d5a77052a77f634bb1b338ae4ad90b1496afffb453415dd6c9bd3c94996b1a37d5a8bf37ab2db0e2e5e9d4a041a48672f31a376119c72186efca5adadcd9bb73a4141b0ffa4c70c8be119fad11f15fe7c3ecc9a242baae8800847ae192953b78bb257267e77d5d08bde972460ea008fd3d56cdf30b2e95ea190644336090bff70c9a22822c608b5ebdb41a8d3e10aae03d05975deca314c4480004d4218e3a04f1501d84831814000c2e4314941883b06e1d0618c8308540018ec400789480153f10480982c00fefcbc05788268e21817f10a52f62f5cfee31af018ffa380000000000000000f84b2070c60870030000000a83f03f5bfe486acb6b32cbf99b6aa911c8ceef405872058023e497cd28c77bc29795ceff4070f91e26dc941bd69ad1b9f8cf13dc345162337c52bf67c8044ded07f7f4b8e5998c6b04df1a12d72344a6b17a29e2054b2ff05a0e7992eb6b377210a24550a120ac806cc113bffda3a8fa2c0a362990640efe9a9c287804fdea30060847e8005d704d8eaceace6f57338aa86f859aabb589a28024743d2a72383fc7b44b6ddff8e015deac40ff656c16942002e6499436a09b8724c6277536944a9d5987b77ac1476ac20000070a36d51fef991efd1b16bcc8aa6ea0cb3153c9d0f62032015ec898abbe80fe720988ee90519ab928bb581acdd5e2c964a4b7d6127e93ea94a136758aff248a60f2b89132e099186432da94318400639d2b8e398ad3edb14003b148fe120031c4105802128e1000420886d4003e40259eaf7d030022839b090230c20008401004010182020c00100002610bf1105f0682f4040002a242f0760902b0bb1185d06c2e407d7c7f0860cc56fe576ce4855c6adda348224d8781d5841ed42cdeee5485852d176cf7624e9b3ecac0000000000000000f19d0f32469c0a0557ca15ae72503cf1d99055a9cff03539fdfde0228d8a00b8441c534d3493822c0006154a700bab03ba4d4a4e90a1a09eae93c7a83480510d2fb085c23bf560636a1e222f18c26d307b3068fc396b2b84d7996fc7771bad7fbcc77031d8c09a162a9a17ba6620d4c8c386550fa5321084f521b042de4f4292cb34b81ce911429b9c153c02372c9000a060f0022cb7e664bb281705a194408830740200000f242e04616a0bf3e3aa308c14508dd332838127ce1e8e2027eae4868b00f0b49ce8a067970bc800098607c02000025e6008020080b70185b0082d407043d4eac0d2cb0eee5015104d66898e18135e64ffc0a060f002208453daa0e2cb4f1763688801682badcc007acdf3b812060f80400003508000df10b4110560280009908002ab1a00b845e0228db539fdfda9cff001c867addf257289139ab7db470e333197e6a2b66d80fb603500000000000000000fee0026743cc91a70290e1c71d008808a0002d9b1a8b72627027268cdbea5ea86e8a965fe048e87c33741f159ef20568aa5799ddb1dab466e90b01917983cea9d660f455ef32ca49b25f50003cc2166520b221058848003bac8581ac2bca615c1b8020080202b40615803c32a9419950e08cb947204d00dfed90dc08c308002000015642ac461541b0a901d976edd444848c0e4078f04801e3f53a60084638400100000b32150420a7190530c81204414a1a0a40905184828814142020002dc32282f89743c6518d6f87fee4928c5024239cb82a07be6027f155b232ce30fe20213c46609c0ecd6743203c8e541ad7c8201147b48cc5f0c1a6704a32abc2a400c8fbac3245c540514a0431c16e04a876891cb5306fcb5cae51497c260878602c6847874e8b3c42e845408c0867ee8fb23aff6ab1298d6c8bd36c7d74f48002002ba62185e33b25efe05012006808f06a1d3c14f9507733b0f006d42c5e1b2000260518227016434f3940883e7d9290d3634bfd4f760540242897388135122fa4cb6779bec5d85632d8a9a0821dd4a41e6fd4ce0393dac41224779a40001b7c800e0b100218f3438992bb159b5f376190eb9fbb3646087aea1b621770e1aa0a0ba3bf541058980ce59e90e8f32260a4420121405e8eba030dd4fdfab64a48f2cb02009603415b1b5da42aafc91a3f700001050e93257f7fa6832c903cccfa10a09aef86c9a727730)) <<< 16000) + 0xbdc63741e2002ee8a42a7a5a6387d06acc2522d1cdc8d7008db544d1b52aa34894000105c8015359005cf83361e0756107b50b37bb9521614b45db3dd893a6cfb2b00000000000000003c49bdf70b9467eb19d28fc7caf43dca90f9d728f94d8200000000000000000000000000000000000000000000160840c3046005001015000114375f6b68347e5ef2878fc852e7adc090e76d60d5b774bb3fc1909d57731cf2bd883b97314ed8efc494130906bc96304b1574268d0381929bba1675f64160c0721c54a6e41ad6c32a5c9c8746e13a286b6f6e05fecebb9bc81950e1657899bf405ae0b0fb2136f1289659a5b15ffb506869d3abfd7ab8e995614349280034f10067be20105467af8fe10c198adfca2de258a32d7e9865044d3e481e33a0511010a10408a00800400006a57d7a104704b5a3520097ec4bbd0833d55a2e5c31e2c34934bd67a7f0644051ebd25ac60a9080f6af5cec70ec2d5c1c0f1b9f20d1fdd1eb810aa74a8fa5ab14e7600c29e1b099571c2188b4bfcf3bf54dce25a85f801032eaae26f054889f591ae7e03f4d6e5984ae008019095fe215ac2f003e3294dd414b806ed44400801118c50c80df9edbf9c45ba4138ecaf8605800000005f448eba16ef3e0ac1545804892adbf2af907bfbec31de629bf272b476cd91e862ce245589e0716396f1f0488d6b358a1205e0296498ea2c50d5a578b9d4287711519d41931800a245f0e784b05e6f08b8d110fe6b86040d9b0813a4abd040cda6153153bbe05005d88e407dbeeb1c596eee3b53150180107c11d0842177449c53c72115600097d85b751921e943647da12d5d6800e4480b0003950396edd659ec36b473ba2a5b2fd8afb8ff505147114c58a2a494c2e40a44fe81002891519a7a42068406eb7c28005e234a4212881000401940400023442806613e0bb145e6d976e7a185e1f23c07111ebe42892fcdb23af0b638e15c17e88bda741036dbb0deb558939ad5fba715ece8606087a4532b92ef0e156cbb1fd4c7e00a00794be91c4d5d82e3c65578585dd430028b5f1aac511d441826980c39e4200f0c32583c70250b9e433bab1affc4dc9d776369d44764d6bc6107114c58a3085973a50a8b54cb6640a6a61e44e288bf65bea420724cc583c1827d7a598c04c1840010077050000a2109e1104e88827034000aee426c940c23a000aea2134320991900080c90981d84b80f066a46eff9dc14e79166286ad6c4f66041a7dd7b01b9511e583b7899bd865400e07f1abd3a09bcd5815692ca17a592a850117470b061647c83e01a63b70372f8180758da0a3afba769883597cfefbb1c401da1a1976db6d034bd55520cbec100458887581ccbaba971e0fb6ec63fe10502655968af8468e2126448229c3a8ae34908d5c44d123030349954d132ce8323a6000ae752b52404210086160d31821b7e14384f2778e59438fa8c164bc281820bae8399498588000015a2570821d613778f8c1871a14b871958e0216bcf7158c000662c2c744544ec801501828706a95b502c60e3d5bdfba91c1ca14241a039871c48800001448319104049a0e27f090819abcdf46f60c80029d54a034b81001a74b781af10002e8e31e36fad6232005a07000022e20008b4425827a48474483612302fe37df9a265e9333e18002b91ec38502080011a600000bc6a60208a2bb4058b9460a03f53b96b78514bf909eff960822d5d0f238292c308e7a4003a44024352bf8cb403042f634f5f01020963e867154cc0f9002b03069800003ae13e0208c914aae9d08182813ca29f1958514f489c5f8142208d3924e07c2f2c30b218d0048d100956d6cc77c183043b3c2336c140826eb3defca2af12e400b40e000045c6c8055782485af208a2b027e3eac2c60c1453a877f28500000903a4414431a1c7caff410406461b051882410b9d4bfc5f410105e10c55b5204127785be6a989924801601a2c805f85dc5c1b64116c5c4c3b8b50b183775bebc1c5942800005120c641450030ca5c69f828871d298e41b5090434e522a9f62080834e96f035e20412c71f714438158892005e080000242200090240023fc8004f71a2413ca43293d08141daecd56178516b94f2206e6490800002073828208b8ca39a0fc41053e0347c6d6c5009b6f9a723e4100230b8acbdc8000b0a2184638f3af20058068814174c3466b18a2fb390b7b9b62033a2c6b923263840000240e9102090f2838d3ca020bb9fbe15baa1802aaa75d4e481000fad7639e3000144eced17274c92400ac0d00004364254140fe020940100024c908b1584500e8902af416d92822050406c910c5b3145935a18f1f524202055690cc39231420b693d7923dd0825357ba6d32101c10801e54a2e2314013b531e1c5a10001defcfa9424688f3c8018022205029235f1d95b8a2c3d36948942a080c3e3a4a8cdde24040aea8b364c9814209ebc4d0a1a6041275005d2e750070420bfcf45554c300182bd5a709f000020b87733e374409992006209000025621260bb280665f191a55123013310fe13df186983dfca28ec84860e8bf945e5a460c2b676b614160619db4273a2bb0181118ae8df2bea0823c1eb81d43b08001d18122f9dbc32f480178202ca02fddcb310071000002c26bc091811f2d0a4e00c3421444532fc18317b0b79c3221866e27404f2b860441fbf0db9c0208e32ee9e55e2c00d18355572ff42400ac0b000043264600bac5b6e2b918690a100ba9f642440ee2854d732b243073ffea6357018309ebc4d0a1a60c3391f5f2118f01c10a68ec730858041204)) <<< 16000) + 0x81c32ffc420007400641480681334801802238800001e6c4a592302a789ae74dc61aadf08f28ae848824fc7768b4b183263263ce013861a5f385f4e0687043f7926f5e9808259810a675600400852ad59b8956232005a07000022e200092a400249884404821c1410c0a0850500073390922182408c244261200ba1c3723a35071c81f32a688146e48bda0f08000169b0502c94effec1251020008686372488b22820000169b0c10ebe4ad18b003723cd324008c5fa347000eaaea0f00318308403164049845cc2088b1d19c48060000b4d8d0c4985d3c0c10ebe6cba000b20588ec0d8307c01000025040009e4c8800000f123020dc90f561c0118c3b0d4a001b91c0ec0801d7c95a3000bb86e9981302108042870a43df2dca28e3d7c42ca5a688f080001b9835807040b6ea6af162302148830cc7450e091ff73b90d0000337846bd3ff84e207042d03c0000df908f050470282340400069468b03e4404f36cc8707a77799f9f296559e06ce4ca75ee61cc071a65d42dfb95daecc2db86a780143cfd907982842837c6d6829beb3c98102e9807a7da2f5fbe425c5401061350f5f48f469d28c0d58fd52e80007607abd02ea2b30ffe355db0d7079ccb85f0615c5ec658768f11c121101a50714d093c7113b58e074b70611659025b70f8fcc4f65936bf557269e183151170801648df0f05944af4b358ce87aed7a1203b7ec1db82e16eee684ee3bf1a154d69d6bf2f91e883b8e68688a22be7fd3ee2c04683df10000c8a772b8004c4480bd54067e31e9e64fa65d41a9ba931a02d32fdfdb8f8fecf8000000000000000000000000000000000000000000000017531f3801472c0b68d76965bf00e84f01146c2802e11075051441050860030113904efbdf9ebc64576e593ebd8d95f746e0e1e82959546eaaa24619c1026b078e5e253f4c638b428acc5c5795c7b0b50a8e8da21ff0ddb0590b195beee95f022625020a5b9f33f445192a4428460080014908458ec22817df8e8920b18a6f25de0848fc7a2b8b3604b00ab5481380000000000000000000000000000000000000000000002d08e208216088082098016012020181401006d88ec5c514841219f70180a117cc6dc82000278aa2630029426458300370ea96004c203e010089050000a01088110438882183410a1a0003b12108420016a820e43a0039f621063bb8009bcc32153c19362f102524277c0677a403c4b139a7461aa5600000000000000000000000000000000000000000000000006121832411c01400c04040d4d1087221135f46ae5602c72ecb2efbc5613ee07d2d9cb39ce59f7e19f14b1811fe358361d741eff98f269138a7fb4f0b6e5b636f2ff533320106f6d073c9f9f2e78fca9977f90f5db643de783e422e86efff282b62c8b77d95d07f5e9b8b9fdfed19ea0d41727b05ac9c5305588a61c462dc116c89dc9e46fd0aba5e5f0228ecbe36dce781c0a0a08525872d8524400025dda6c9902f2c8ed3ea6648accaaac4b810a1b77951edcdd840887760e644eefaf4f0a3266678458c1ff842df99011751f66fedd3000001277f3f21237c2d0d3f916e55f374941d939a103ea95eed708b02d0c1d05e4d5e929ef6d61228db7c2950ebb86105b4d290475dd82400001325f913665d1d54337f45862ab765911cacd1f0af45965a8010414a75e549e80b72532699a6c05ed0537b4edb1b9cb84c9593b63449a775d3efedc8921538ba2416edc0229c85a3a95c66c29a45a8c1259f903f3ffa6c100d4d76352260b37652cd9e85786fdab16e0c4877dae92cb4246becaba319979976eaff9f3830504e0204475e897c83dce5a919aea464f0e3a127510c4ba23d1b67377646c513184d0f7439b04df5fb60f42ff5205b5f2b0c36c1080084c6bd68f8e315dbdc67d5193d2dc330dde53545e39070a913b45f4848494e95c6c4a5f6b5715766c7e7c801e99d1f50b3e6286ea2b3223b53401b867e5c7dba8dccdbdff6dd075dc423ad5d9898ebc80448e43b03f7448b2e5c5c9e97385072a25af7ddd2718e7ef68f667c67bfd705331ff72d8cf82034978b47c64a464c64a118f3ba11b90217312315296fc62302b28082110003e4908109e8eb3c220f14359cdb500e11ace0c88d05ccae554183ec19b3b080314ad48093060e804347b39ecb78a1d0d41d472041e0ce23850c2bde8001240c1e0080000679d1ff3da39470903e2c784055e38e84a001df1134201f10e8ae5001c00841021e89be1a3c044b73c50e80a6fe81020e216b82286158c48aca003c0100000f321000a07f0503c8280008d883f0a81940400090441f4760f80bd365e7ffa2470d2402b4d3be9c6180009333fc09106672cdc9a8412b619c28cc0a0852ee64da708081d46fcc4bcd007cc116ec70b0000018b82021c90028028710162d9749220e8eb8b440462c89908c11e9e26b068337299294a003c0100000f3381a20ead704062f421da0e0a563bd2e00176e650212020f004000032c83c82f8e310be7a6038a0f365aebe1c7000311154385c2ecc5f44145a136b890c2c103125b5c638025e626aae300000083d601400936e7b28b640090061418e50b21a7055260d161208d4c4ed038251a5bc848003c0100000c93e58007ea9afeb3ca0a5792552ea7140c34768620071c0007bb103c1c2c5a242bc1bf14563fa56c11247002d7ebc9d3d8c0000014c56200a0037a635c4fde2e9002b03071c06f239ca8f14342fb68e9e20016fd7813c3d5f86dfbe7840d7e8f6d4e081169de7c4c004601000013b20006e074501118d5a9a)) <<< 16000) + 0x2039a8b148c0c03e3d47a683750d48113400fb49ec4b2821080401ec140002324001de083d04f471fb3792f2030a7228de1c202f29880041b7ba025628000a53f5a080085b4c5b98008002104001663d51a39667d79c143888927009020388d72a8a0820e10c8020eaea21ff4c004001000012920f20bd1cfe0b29b1018a7b85801c205e4b4b20835bbdc5c0a00051b367040085be12a26041f0084100b6af43347a6f8035943a19d0c2c8106dd075a08225efaff2a083a0080000ef200045e41e0340ee0a0004f620ec220751103a0881cc3400222641c8740049ce41c4a40e04a06f05001562900690620dc8306d2d80180a88095f7b3c284a6974a26302bef2945c28337a9c2163801652e2742000fe23b1a004c2840010a2019a09d48e10577f2558c1000bb0308a12e0de2488a0c30a835c004a204001006c0100008c906b158350ac0f0360d21b0680583380c19807220a45ce010e2087f22c7081bebc0bd89211cc9fbe10e15a40aeff0c00327c3078402d65ddf5004e2040010e2807136aa871072fc4b9a2062e22dde52420780f87b8e10f4ec704430aa47865ee84c1842010065010000a490281181382f08187ce81a163202e8dc7ca818318843702778ec3dd55230a06144b6a5ef15d20c0376082d06062055b763d9a82b14781188380195f8a1941ec23deb9cc60140127ef3f7cc9b214aac4b840402b6acaeedb91310b642bf69014773c753c2508bf1aaf9f3040bb0d88727117471c590ec0001c190641983188f0a198561fc80cf68e2678c1c344762f0c2ea329e0a183c6fedb29025101f00801380f0a37bfdaf2406c634599028412340d2c185b1fabdd2202410dd358182fa611a282800930c9b41010077f7940050284001000018a20c4320611103004817c1400061a4178840ba2a000a0520b84305b2102d10c164840900305801c053352685c8c960d2b1dfb1a4c0f339548925665f0cc08fcc031800745b9ad7bce0f1c71a99d4ee28da84006e755daf99f0948943801eee7f32e1d4e125f4a788855384be586871e49a1c0c9141e0021743550c8bb8d3cbee3066207835e9148e2b1cb6737e4519c17737a2c1973543797e61e8cc50f1023d4174c540146318c540c2099a918f202c1907cc470433742b4409880f002015c140ac020000d02094330481182a88811837d7c7f0860cc56fe576ce4855c6adda3482222e1d5beee402da9cff03539fdfde0228d8a00b8441c33082021423010811c001a91198b86adb0464ae2e6854a2c3e2fa0fb06967e41e4f5e1366e073a6e47db01582814462df761ca5226e926802106090f581b3280616dd1db6a34091a0674230059ef43b40025181f00879628ff75e8b17218c33390294ac50d514436e7d04f2000f8043cb1f31887658a820573408171e9d93f0a24e344b393c01e090f706000177132a6001f008000091905405f14501e224450846aea2cc3884d7e3c7220770e60bee180607d3cc81284100040000404829848148140a20a00037b200093440f4840783203b050003ed10502d82790c1386609a1304c05c0179c2698011141a00459354511bc61bf506b52044203601004b0100004610431582102f825a6bc9b49450977e6cfe1708bdb12ce6f9d2111df37a32e48ff5d977e3b278f3e1bd44780ac1e174dba499a5c0472b05ecd68986801e1f07011ffff851809a91e45fbd7ccc53f696da6cd45b8ee7101b3e918e9d19accae5c0a3543e35f5ab51d991ddd59af3689de95b2e315db7e14a2014d1560c1f1ce4153ba225b6d1cab3cd60e5112b9414f600c36b25e2fb26f4b84dd9aa942f67bc31818ed9a13d94e68f468063dc088d3ffe0af74680375cd4c5650a125ab31ff0b78d33903e840cbc00acea0815e3c0c2d79399d4fb2fccded87bd3d25b2c9fa474ee02b4330886ed9e0000e2a4128760923a048158238ac1185703462ac6ae6853f15a4a0b00ed6167a120149e371f0c000bfe83a0084a383e010a2390682ef15e4633d6268a8b23f4c3d93b1ea96f746cf785a02ddca190e0253ffb6fd9d71d375094da5d41895c9b65dc7c043bc3887f5a2958a72180192228eb0f4ab35710a9fc2e2ee26fbeb16ccef543d330ba2019e6650012a53ba6ecad406e69a1b4f636ad9eed46a9534ef2db6c550b4a8b54265448cf25b720fbc2defe42258d9e15aca7253f854793fc7e09d5a2237bfd8f30f09198a0efc92094e5998574d9ddcfeef7a318e28c6384c4180c1098d721041c00871a1e0e3d6801f62442c22041d00800003a10450982080e85071507bc30ad25e711cc02077c95008017542bbe0090407c0200001aa4110440004104001e6882190c1081703202ea16b32a4f006ea8f117896726181d685c13d50ac788b8d0a302392f5e86b38e687d1175d2fa00910de7a123af5b3799a20108452f94c77d46b338ec771576b9e10416e5581fdc42b7ba0301bab27037329ffc78db161d74cbedfe372976e65747bb1311001395fafa2b3ee03f88149b1d37f1145172eeaad879d94a7210926cd8f7b7679b5a808696ed5a6e89f792b2c234241cc229061474cb47c1040d8918d91b8ebafdfb8157ab3be0946716518bb6f383ba850622ea04018bcf5637c127a3dcc5e63fdc167838f288f1681a5c749609724309c54bb474e855bfac367594c8023911b75526205eb540ab4612daf0e861c90311731292913ba5edb07dc2edb2d3ee488b5f193b366d3b252f54900546ae88fc9d1dc3558ad19e982b1fa9a549d8546e2df27eb8de83d08c4c315da1ef13dc5054b010e72612c03ddc5ef)) <<< 16000) + 0xd18afa9eb518e40ce531c02080f0bd4b7343121891943841872c3830c18077bdc62220067985be004a203c0100000fa20802ba20bba87bf1201189301a900087b667400041efbf9e0224830400100000dc2000f9440fc6407c12000cd9207a5a03c2101d86800585c8199080c874003e2c6802e117808a36d4e7f7f6a73fc0071cd2a9cfb800a22861851c42811410c000132772229488feb817ec19d69c8055a85f4f2512534239008416938a75b721014753b395f98b19c4ab223146961f981b5ea98f18e1812e82bb081aa0a1404980559c144780928a100042853693dfb94f620b8ba39890f8daaa01d67baa8a90d5dcc99ebc851e83718c444d709075c325bba55d98f9366b7361e9cd20a534019d463a1a25723de7f1e3540255fd15a4de0c30661d1d0c1c3af27c1b6edbf74bed73d88cc969f6ffe893ec672b25f1fbae5e474ffa8bc2f943c9e8bc5121e47f66a435e8c5cb563f655608be76c97eb2db6305732a364339a56389ec404027ce388f64b5904540d895486c2a69dbcfe6a66bb43be05abbbf1c1fd6962cd4e5a141da2f9077ff3c68f63b9b38f440ebda4bd158c2c164cdaed6a1ab499478fd3d2cc1a8a606d69029c3b648f695f4acb1cb85a9ef21f541212038935946734b737515666b0b8d06be037a256de0c5488d812d05ead20085be8325a4bfccdb21461372cd803701e51a0b7ba767ed85894cd86908ffead5096da2dab5c08000000000000000000000000000000000000000000000b2250a6882882861046803801edf35a1288d56ddd7fbfe90b54a83f7c2b6382f61bebda1f845e1fac287d94884be7659a589012c9181f83863d0c14000d0481d06800313081c8cc0e007429f65f7721a244a9dccb9020305c1b88a2354a1a060611ed71e9d0ca104001003701d0a18ffbd3a730d1140be0b0da08a231efb029b0a1435b71a03209c38409eb2e45cac308a199092bc00414331f53c7102000052cb2ba123808f93cc05ccc4368b65283a51b890c2b034000126103611c886214b7566068994bd0c2070a7b62b23803a6f6498100682872ea000f5bf60ac0a4c2840010000133206a2203405000285103315019088004b9c8189880c09405e4202e0d0168480b014002b8a603c636d65ce1878db71a0e8908914d24ad120c2f7c92381c0bfd5bd86430090ea73e70500b4d2f35784003caf009340404a4141180a2c66adbb1dc1869b69bb3814110cdd56c100175f5a2d0c0100a0e7400944080021869c11b9ac921e6f3d30497877f5896719f8ab46ba14407ab5118da67dde98a39a3b1705c62fee4b8abe1731ac638a60a8c111870d10a083674376ab74dae7ebb646a104ab867ea029003d6f165fc2f32be112dbb0846d4fccb2b980d46b96da58a8f1eeb528316e790b86e8c00371f87991b39369b0f0c315746c1223a785f6c6550dd48150887dcfbd792c26f300d44af3a87a5579010dbf4a4ebd445aa9e232b600e177e95a34e659733cf6d8ee02731aadc56432a67f223b4ca3e2462371af7e63f629a760ea419d4bac1ea927ede9d44c785a39638c1ad6d995b7f892418be68be38afefea9ea410a9b931ce4e1d9bb3a02c317d31e8d11fee78358a38671254f4d01a499698c46958600010c86c63f7834e6186b5f84a6a1440314d70a1041a6722902400922caca1001877083926042000840100401000004440ac140540a029050000d390281981380f5d712c926db3291a7fa279a7fa2801d68d76965bf00e84f01146c2802e110748b18618410708904104900400c0200803600802008000022204c13b185b3fd58c70c35227b69a661040ac26a5c70382227e0a9ea83046f0d1bbb882092e6b4c0f22400dd8a40a761800360b42c383220209c081008010040000111000200204a12024090118480881400088a408454001fca4080b403e4201e1d00e8cc070340361201a0500c808004960802a9810062e2354554bf11e1a08f9b49973235ca71822b01ccaa95dc7080000000000000001e88a18c10c08a088086004000a01b5338e0ecd716005a9d79a5c1bb58ab1f74cb4ef65d2fe93526651a69752cee70b0acec19ca28081b84ae35ccd0c60b4a514ca51420ebe56f10105d0a80a00140363d0ca004003af8fe100c0186cc426104049c90880212384981d6c7285075f1fc2048b6e69aa48481400002eda080075f892f31250c2300858c2c3afdfe4a1a9a1ebc1a900800006147180000040b3a10000001c844650823008590040925128a20e791aa8f96302ad469c614303912d9505010d014ab2490000002eda0cc104601000013f20004d46470000107d650a2c3aaca409169a1fb7288c10000003bb140000040b3b280118042870345af24848e72ab66850a141065c276081015d8d417240870f5cba84000000176d26002300800009d90180500b8280500400054240585602a03a1c000008659238000078ba285161d5438a48b4d0fde60c104112130a60a000002059d98008c021438143c02f448e72412788142826bcfb1c20209adad14820932e40e184810e88f872100000005db5700220040000b1101405d0e00000432c91c00003c5d1428b0eaa1c5245a687ef30628000008167494108c0214382fdc6a076923ab5ed63d1794282c49355ad9420587d1642e02092f62fce7e9206af01e40908600000092694191c10a00700003284000af4809848048240220a010050002fc900f150006531000e35201c5a00d2900612802c840142a0091100406801c2400c0a0050100200800478c8018880084400202000010078cd9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase14" = "QuadFullFourCase14" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase14 private def zz2198:"s0896"="s0896":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l20 l21 l22 l25 l27 l28 l29 l30 l31 l33 l35 l36 l37 l38 l41 l42 l43 l46 l5 l51 l54 l55 l56 l57 l59 l6 l60 l61 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1aef31c71, -0x1165c4ec8, -0x1a18a8eec,0x9a29aec], ![-0x1165c4ec8, -0x5f0a2709d,0x77e4192a,0x134a891f0], ![-0x1a18a8eec,0x77e4192a, -0x7115930b9,0x1165cac82], ![0x9a29aec,0x134a891f0,0x1165cac82, -0x8b2e3ed4]] noncomputable def hinges:Hinges:=[(-0x319f2e,l6),(-0x2fee8e02,l5),(0x1b692829,l9),(-0xa1d59c1,l8),(-0xd971541,l11),(0xb4013de,l10),(0x32a06f5e,l14),(0x16c6550f1,l13),(-0x1707c2b5,l16),(0x4eeb7af6,l15),(0xa1b215f,l21),(-0x16c6550f1,l20),(0x6671175f,l22),(-0x8b2e3ed4,l27),(-0xa1b215f,l28),(0x8b2e3ed4,l29),(-0x32a06f5e,l25),(0x4a8e861c,l31),(0xdb49d4e,l30),(0x8b2e3ed4,l33),(-0xb4013de,l38),(-0x8b2e3ed4,l35),(0xa1d59c1,l36),(0x8b2e3ed4,l37),(-0xdb49d4e,l43),(-0x6671175f,l42),(-0x4eeb7af6,l41),(0xb1de464,l46),(0x8b2e3ed4,l51),(0xd971541,l55),(0x2fee8e02,l54),(-0x4a8e861c,l57),(0x1707c2b5,l56),(0x1001329a,l59),(-0x1b692829,l61),(0x319f2e,l60),(-0x1001329a,l65),(-0xb1de464,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x8b2e3ed4,l27),(0x8b2e3ed4,l29),(0x8b2e3ed4,l33),(-0x8b2e3ed4,l35),(0x8b2e3ed4,l37),(0x8b2e3ed4,l51),(0x16c6550f1,l13),(-0x16c6550f1,l20),(0x4a8e861c,l31),(-0x4a8e861c,l57),(0x6671175f,l22),(-0x6671175f,l42),(0x32a06f5e,l14),(-0x32a06f5e,l25),(0x1b692829,l9),(-0x1b692829,l61),(-0x2fee8e02,l5),(0x2fee8e02,l54),(0x1001329a,l59),(-0x1001329a,l65),(-0xd971541,l11),(0xd971541,l55),(0x4eeb7af6,l15),(-0x4eeb7af6,l41),(0xa1b215f,l21),(-0xa1b215f,l28),(0xdb49d4e,l30),(-0xdb49d4e,l43),(-0x1707c2b5,l16),(0x1707c2b5,l56),(0xb4013de,l10),(-0xb4013de,l38),(0xb1de464,l46),(-0xb1de464,l64),(-0xa1d59c1,l8),(0xa1d59c1,l36),(-0x319f2e,l6),(0x319f2e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x589220241808000000004c1c063008000001424880d8602000000028924050c030000000310c806180600000008239036300c00001011c20324602800002424040930c05000000410e401c980800000000000503200400001071ce01a46028000024a09005ccc0500000004910807180600000828e501923015c9083037003982803800000000003c0c801000000000032049004000000006c340d30080000006c0c8024602000000104210120c0400000001504819180600000002609022300c00000010442058601800000000009024802000000000014069004000000000034072008000649061880ca80200000000002d02c8020000d22302204da00800000000001703200400000000000e06400800000010864030c030000000000088190020000000000840b200800000000002a0640080000000011002c80303222241180371a00c0000000004700b200c00000a504802e6602800000014844038c0300000000022809900606d044823006e340180000000000e8164010000000188440b0c030000000230a805180600000000004c05200800026846090064802000a20ae08801b50050000ac1202c04ea0080001482a04803d4010000000921080646020000001341200c4c04000000002616031804000000004c280530080002a04e0a00da802000a60a209804b50050000b81403802ea00800000000026009200c0000000000700a40100000000000240c80100000000221603180400000000442406300800000000038012401800000000012014802,0x2a8099006000000000b8f03300400949061060160802800003b0c84c09900300000048902036180800000000006c06200800001011c204986028000001c86200e4c04000000001e120698040000005311c0a83010005188f05004a080280000000151103cc020000002888a034180800000000001c0620080000000642206c60180000000000901880200000214110039980a000010c542300e400c00000108e8680e80100000000170e02cc020000004986401498080000104721c026400c000008a05e01a6602800061144160331004000003045080c9180a0000000541c009300c000000aa1600766020000001642f006cc040000000291080a18060000053055010b3014000000a22280506020000001444101b0c0400000000001e031004004147284c00d240140000150842401a801801011c2160064900500000003d1a813180600000007231036300c00000000000606400800001c23040648c050000000410c807180600000728c5019230159c869828a01282803b120c604e0073050070000000320f00e98060000000681f00d300c0000000c45206c6018000001883b0214c04000000308ae03618080000000c242015300c0000319182a06a80180000492082c07900300292498518058200a0002183804407c40100000016649809060200000000000503880200000000004603100400000007631016300c000000000ba02640180000028c830120c0400000000003e0310040000000922a01d300ddc889838a0128280380000000000901c802,0x2e0059006000009b86200693014000000000be0164018000020a09005ccc05000000041108071806000009986400c930140000000130701e6010000000000d002c803000000000032039004002884186200f14014006304605601e4802bb0182824009bc5007028a2160b00052200c0001d8490c80354011c48c2010604ee28038000000148840d8c03034828a0b6019da00c00000a4320a036400c0003486c09006a802000001422040648c0505863863040311a00c0000005210803930100000000c42201c6018000014a2140648c050000f81e04203c20080000f02106809c40100000000000280c401000000008828030c030000e81a04203c20080000f02105003c4010000000420a00786020000000268a4028c03000000000005819002000244591180d640100000000009801640180000000002501c802000000004a2e071804000000009c540630080000000130a80a60100000000000d01880200000294210039980a00001248224026400c000000aa0f80dc602000000204610320c0400000000002207100400000808c902983016168ea011e03ee280380000001106c034c0300000000000a0490040000000000540d20080000000138700e60100000411c8680590030000000391481218060001c4510d00884010000000e22a00b26020000001c4510230c04000000310a401c98080000000721100e300c00000c514a03246028014f19e28c03c50050000004a221203a004000000911c404830100000000000280e4010000811c42600e5004,0x3922ce0a205b5a00c00410720ac02bb401400808e11460336802801321460d007ad005002023845600c9200a00000000002c0620080000000e462028601800000002209018c02000000388c203618080000000220a033300c0000000481803660180000000000603480200000104188183180a000000410840973010000000420a818c602000000820ac0c18c050000000310980b180600000000845406300800710a510400e68028000821243402bd00481238804181e67200e00020c510440aa40100000000000a80c4010000811841202650040000c21382407fa0080040460822025b40140000000e43201c601800000ca0bc065cc0500000000005a031004000000450dc02830100000000001080c4010000018a08801ccc05002421d01480eaa00a00028c8204403c40100000000000b80c4010010418e21802f50050024226c3100eaa00a000000000013032004000000ae2580d86020000931c81100f100400204110148078200a00000e8521200d400c000488e2090132802001211c2088096d00500000000044281980200000000342c0e30080000000000a812401000000001917028c0200000000000e049004000007284200733014000000ea0f80dc6020000000248a40f4c030000000000320710052b485008f01f71401c0000000001e816401000000000007c0c80100012439822016a008000006502f00d330164d9060112079e2803824920615102dad006912408041813b8a00e00000000001d032004000001062180f0602000000204410160c04,0x3b0520091808001942282201104014000198460b01108020000001945100a0c040000000311681918060000000622b022300c0000004208815060200000000001603480200000504908126180a000000922080393010000000124820286018012619218c02c100500000a621098132006000000003c140d300a490e303b005dc2803cb91d307d4069850070001625086c01ca00800584a087801924014000001a26080d86020000001d110d01d00200000000362c0598040000000054440a300800001b0843206c80180000000d0a0c0d0010019821032015da00a0030c40861019b401400660810c2032480280000000000340c801051812c0da0258a00c00598920ac013f4014000000e62900526025922460b0c075750070000000320d8069806000000c12c406c301000000000f8b00e6010246189059039ed006002523085100fda00a0000092905019230140000000000681c40102cc2011c101e910060001224086c06620080000090901019230140a3067847807448030000000249040d8c03044e3120da0235a00c000000004824063008008189205e0516802800003e148840d9003001d829042015da00a0038c50881019b401400760a110203248028000000289240d8c03049230c1b2073da00c00508910c901fb40140000141242032460282861c9059039ed006002923886100fda00a0002f8a916003b401000b8952160019680280008610c1301ed0040000000311480a18060002084c04406b4010000000c22880d860200000411c8b80d9003,0x1e41141680c6200a000000250740c630100000000ec6602860180000000002408c8030000000000600590060000000421d036300c000000a20b012e60200000000002b0188020000001a84e03618080000000000680520080000000006a014401800000019894028c030000000000360290040000000542500b300c0000000000b00a40100000000161201cc02000000348820191808000000006c4c06300800000000d8900a60100000001608404cc03000000002c220298040000000002c009200c0000000006c0124018000001a8110050c040000003504200b18080000000681100e300c0000000c81603860180000001b024030c0300000003404805180600000000642407300800000000d0480c6010000018a09005ccc0500000000260a0718040000000622100c300c0000001a4c2028601800000000025024802000000004e1206980400000b0941024c3014000001444900726020000028e49c0348c050000000311500e98060000000621900e300c000014524a0324602d1220609600bb85007a7242613a80d30a00e0000000000240e20080000001c4d2028601800000384d101b0c0400000000260a0398040000000b251014300c00000012c7202c6018000002c4a101b0c0400000c2590980f200600598848a300b040140000318c44604c8018000032108680350030000052210d0122006000144410d808440100000010e3880d860201e714906d011ad0060000000290c80b18060000148480c03f400c0000001047402a6018289206127017d1006,0x7a0310040000000000fc0620080000000a41602c60180000198104044cc050000033c2300a9980a00000004a1501f300c00000001a84814601000000034844098c0354c20c04900e60a00ea3044c0b900941401c00b20c714c017a8028281166103013750060001863904201e200800000000004c0620080001018448103e603000000000a0503cc020000040421815f980a000000000c870330040000000078481c60100000000002d0388020020e348538149a00a0000002505801a30100000000b41402a601800000003512018c020000046190980b200600000000c8340f30080000000188701e6010000003083101a4c040000031417813f980a00000000945406300a420e2410606d94803c9a1c1820407b290070000000210580b1806000060c124081f30180c186f82481ffc8030000018208c0afcc050000000210c80b180600000cc4c1b027400c000000000128164010000510d02102d100400000000001a04900400000a4381102a400c0000000000701a40101410d8081023210060000002884205c18080028434041026840140a08680408119080300000000000f01480200000000221e02980400000004a0900b300c0000009c08802c602000000120110058c04000004a1304805a0060000000001e009200c0000000001881c401000004b208e80d9003000002141200b9980a0000000421100e300c0000013910e81e8010000000000350188020001322302204da0080000000000dc06200800061966190194802000000010844058c03,0xd40e2008000000000c801640180000000019c02c803000003942200b9980a0000000000bc0620081449230e4814d680302461c90d9039ed00605064843860395a00c0000000722100e300c000000000ca026401800000003a1603cc020000074c520064980b610912083036ca401c0000000000a81c401000000000041018802000003844400c9980a0000000000230320040000000002180c40100000001882c058c0300000000000c8190020000000000c40b20081479250e7810568030000052148680350030001663104201e2008091834828407fe40180000e18248103e603000001c208c0afcc0500000000003a0490040048c7b0c3028b40140000001b42a04c60180000000361203cc02000006cc420064980a00000005a0900d300c0000000c42804e60180000017c1101a8c04], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((0x81625c7189cd2e05cb1ce16180f8a52228201435f6e082ab00e9042a103e008d3040b237e1a5dd7c83223450d9d812a58641a90414a082fe884d020c73250ae0c00384309613840f8040000548c0b12dfafe469702c653d0b0c07cc11b14100a09718041b64ea4b054107c011a603590ff29a5b004b4b5161883294ea94104606c2d) <<< 16000) + 0x8e0842dd88e820e9a7305b06000c20671138210004000055c8f1048000a048f086c6c0363c01b1df0d8ed04c7642636e0b1b605f2a0c0407ad394ed1734e2bc77df6cc0405acf7486bca058752ed16327816d4c667768f081b227b1e0ae7b42db360fa2261c61821a00600c200c528254fbe7c323df862f9f7de6a2ba60a9b7c12e409dbd8aab2b2179cd94770d8a771752718c5d0bea39684c589f6bdfbac92280fce9c11e39098401f1862481aff4386082e1110e0809f22c7141013f2b060800614f03b4000f804228021e1f4244fae8e005078e43b07e44d1c12eca3e16302ae8c132c015e0c10d3000f8040000490c0ee2cec2071da056b85daaf63ee4c72b57b637e7c066386380e80a0432e0c05df08548d2d0907a90b4e6531f3306006347a698f3e714dfd0a6486008b8d68b80d0544b28504918e3ac7f954f9abe410938616be1de83dc53dcd0c002c334e334f6a885f93f70e8abb9863402cf147daf2206d914a23c6f7f94717c3f2ed78ebf30b5aa3c5caecfb4e0123304adedb8774cd42fc1e4f4b2825411600013648ea04c744162480b9a29aec1707abecfa2cf541f70235a581096b3dd21af2816481a79a78c68a102780280413beeadc0680cffa745a632a4d4602f150933d00c9f1e76d850e28e22ad00020821020b000a24302c146e9becd14999749ccd120a319ca4b0c56af1731000275506d47003ff4f46400426202000800009d1c103e5d9024175ebf3985f452938e0af468720faae7ed9bfc8d1d0c0e4a0b3d7d71bf7cccd839fdc2ee2f2b264169e6ef5f686c3b8b0a081a3409d63b9d214d4c957071d7736d1dbf5cd3911bb05aeb0308082be86eb914048ff6756c40eb867319865c74e79a207cffc7e300058e40fb1f15e8ac4e12e82be8b8f3b5cb9b7d20e2fa97ca22224040d5a18add0820c3ac9c4d120043a979e4a89ea8465e2e280f8fcd1e71e5f8a92c06082d7b5f5efcb0351f650c61a42126615a00017588ef14838c040029c44774c63b8531db05e1222497d83c2c31b6b0645416153be6b3364c0585fde2fb0400253812da1000849226ca98000058de081f9b77950402667c010600b6c504a0381da098ec84c760263ae1380dabf5edd1e36251da2c78abfcc6e38e1821a0248080d11bda28a4a203c01081a0c8540be8101923442280a335f468e78a1f45ecfa8028f29425c18204633e787814ac052d2213881000400005788e984ec9f5e08482ce4e9ccd615c799ac2b901f20e5021d65d02e9db47e77d4eda3f3c3c73cf414a84d34d62c24338c3ca386385340300090c1b58c77b11a4be982ca41be0915c7a916a40568309403c0369b6e074370204f971b478b3725120618ab246800185909809e9602b5c88e68929d519a060212c739e41800b47be7e00a12101000400003848eb12c7547713d53de2c43d21caff510718b181e2ca932061b323d3426121622c13271ca0871499541510538f33b97c0000fa00280e08480388910429a3ed124380475dc07458c23e3f47dc0c33a47e564d0a0a0a8cbf100242c1ee415bb2504326083f2da2085612cc2e080007046b8603812084c0400001ec324217f434251c7c0cf7aac95182238a9a24c6bbb4b0ed0f0c2c73fb8f2c30dc3c765d00023fa519fa3801100a20390f9e64e8af648e06846398cf28e3cf8dc9df96dc40a2348c66549a16188b4f8c62dfe4046eaecf4af7c9e08222a53c439e10214070e5281c04003fd693f1b678b712005c08000023a324206523c0a63174c7bcf2c20a2a75b08020e93689d00038bf76f0c004ceac7298007c021838cba23baaafb071e47db123603a470a01265518311c2051eaf4a91a5b79618df1d98c9fa5030d1f66078937e24041b9907b2a01e40130ebdb4c45490401feb59543195a30d86400c41400004b04000e5c8003b711d4098e882e040b90aea6cf180001116038809a4c71848300004650201b73906eb5004866b45e67810ecb421b0002516fd7d00855e04020e0508402000036a474c2703468211d33288f1e82a1cbd9700f184a516de5c9841094fc86ea46120ccee65a39ea100cf2a20ece88ce0434fbc80d5e0800415e6de1225008ab2050b00e1020f28a8bf53c6000088b0101464a7722a1c452a9ffa6120c000232804037f70a971490470b2f01c3c0d81423ef04001bd15a1e0032450880400003984748440007e84744563a0138160000378c2404983000e18630014a82e8dfa8a81a2ca9672d74e0a705f10344000035fdfa0ca8680070287a4df2345c85122402004711f7c0cd21f38d000002afc93f257b9a9fdd9097ae76d540628470a000014a9001425239e621ce05000daa91cd15000ed41d210ebd37ed1440e30b85f028251a42343c4026e9bf90243043006d35084084fdcc8212c09023a798c38003596ebc80010cea937d0088524808c0503880b1c305f94d33defd8c28b955a3b18243aefeee28357589b802862734397c3001e4078a02130a0f80407301702d90244ef9a5980f0099345f745dccc588b98deb3461040671a12009148977b1c113946ea004e183e0101cb01c0b3e6c24ea0b1c1c7109be2c4bad06bd6050d0eaac17914168ff4299cd02cb69fdae3002ea28943870053ce6b15000756668bf80d01025902a4881100a00007b48e5088000e1cf126bde81b65923ac10e047062d237fc05879fc63ac84844369618220426360b9c5800810e34a0084e38400100001632392421c80100034611ae298d690c71c6438c220210586780c0024a8ea6333ba00000004f63c15ca1fcae403ca186021)) <<< 16000) + 0x1a41440e10411a08e000000001724010068ab04c71426388131c309c0d344cb6d2017e864d1e91817e693bcc6bbd6beaa95ae962fd9f135c01988b0000000000000000021365305789c5816640670458448210210087cc6c9bc3501cf543d0426d20256b265a6d59f3bd862a969c20691209dfcae9aa17b8a01cc97f0c51904b113469a8624c029ef186ba1f7516306306414208287022e1c1feaa38726007dda97cca003c010820718510410c08b042046002032000200d00008c2384031c1018e000fcda3fba178c1c575acf14848147117c508005b07f301062d1aa4d00bd126f698007802124a4b3b5103aa1838330dd35a2f9a2b2556b1a1358a2a2ddc895956180922707de7ef900872429aa8d7820a5ba28f33570600330ff4174f82047ed7bcdf5445ba9002c03c00011311bf0184f80e27d7ea63e471249c1d4e283377af382082e3925311e01771c1232800f0042cba057fc8ee8c513133a6b04cf101c5149bd5c401638c7a9e306ca20739917e2152878a899d8c93778b0c5cdb2474728e1cbf65818ef00401366ff6480964a4801581c0000870c4fafd4c7c8e249383a9c5066ef5e7041070acfde43c02ee382465001e00859715f6ae2c8f1144b84f1d4e965880e1d41e4852351638c828286dfbe40e5ba56595f9a1e29b843dc716f4586205fd8ef3cb8e1bd9ad4f78f62280051b0ffdfdc46232400b81100004744000d24c8d4f0ebd74f340bed6db484b5c78ebcd00ec66303490207802000019c4001de080058d91be0d8d906c6f427a290b9e4d0e2080439da028c129751f2ba18400004bf01e080003a9806838ebe5be78401937d394800d38a1100806f044376021ba010000d71000f17237252036210dc028004b5486780a22a36147e3934601c39538a74e0880000000000000114d8db154065b6074e14e45b4732059072810eb2e8166592484502482400000041f61c01f8d86fc8d6a186acb9f05f2e280658d36a138ac21886d2c54c926eeef2d7390e8f4c3cad368ca154c41704e51b7058db02f4bbf2d2eac5882e8d6d446100cb08869619d54531624303545e4610452ca373026081f0080da80c6d007c683db1fc238cca7a98ba71028f44b84714222f1d6982290d6be73410609b8ce4021047c40027081f0080d980f8c4be48a31d9ae2d638c49fef02547bd510c127f0437ad508e90180ac84a9cc5f90521201206968d544bbaaa880366cf15fdf07670e02ab865982dcc66b9a00ea79823d5b5b780529fbbc4fc65321611688e5018760f00002b6200087046c84757e240c180ae995faed9c90abcbfbbcc6411d93ebc109059c9d399ac2b8f335857203ee14e45b47320599851419411011800249559bc754f2765cef221e52fdb4c15e6215588275071a860f4e2fe408ecd1d1c91244fa9a31d98ce380f5298905122e5fe560f7dffc4fb55607383a23db902dd518b425e8001dd11b11d0108c86bc0400139a6c9a2156caa4845e077c60804043a271060978282853007d2d15c24000587a80c3009e4a247000123168a001100a0a07c021856efd5880cd6889916666c11226bc5d4fd3d9eb042c6a5313f5b648431341de5066b26b3cba38a39f48951eca1c72435cf622f0dbe726edb8e72ae92642ce820a1839de52b15cc5e87cea62d3b69d1f1fe4e5f3f925620ba187dc521cdb08f1408205fdf9519b07085e278abe64f4addaa035b05891194056afae7af10f6a9a3051621f488090207e5974214eaf7a4a0634d735986bbc9e59bf9fdd9dd7426404a0c4349566a268461138ccd850e7e60f6c3f9ace61374996b85d79053d8d900e013c2a6757fd83602fd83c67d6565cffcffdf8c185b1bd17e58ba542832b470853fd4cea050c3cbeaec7538c183000518b932e3922fc2004588b511b08b4c0401762f97cca24e4c0b9f43fd54317e420ec7dfb08183a07000015891b11d0d80c86bc040012404002b208d716c6b4960421300186223584a1ab1d001694119b05d0aeee68aaeae081457c996d3170e2a7e5ecb16181c183632c9c4c0480505f3063c406008bfb346be8080085d86859f10c02e18d2b37fe202a001b9e4cd37485012a7e18713d77e042815818000098484e9cc270c7a98ccee800000013d8f057287f2b900f2861808460e48e506306602300000000280173801006f133f8e43194fe2c90ffe326d854902a0ed564e78b4c107e06aaf62c27066c812aef68638016c9ba536d790001c6daa65208002ae5905ecf5805bb64061682006a8060e0031a901f95053418c5fd17ad3d8b3bf0e30a2bf7ec0433d3d9b65b8d58a1231f1ba01e9ad62b3430de5760f11c061dca158f4774c1031b680829ed6141ee11009fe38fc1802400ea7cd84b58ea49f64420b600da0030dcaf9620d1a49d5238b8a8aa2ef216076a6145d10079568fc1ef31d7e35f9424e4211850000475b5ca59e1fdcec760048ca6e6ff79cc0219d33135ee01e245dd02904d5aaaa82c576bf8082755c2810b1e1579acaf83e00004797e257d4368687af61e6000295dd5b5f7205c2a6c7dbfeb190ee0456587da6606145e1040001a2100069b23042b1a8158d386ec953d186cc13004ecf3e9a03b308140f46336bb0f021cf7bd64551383a42d05eb278cfb2a0f1ffad30b061c57fbe4d454e2d71bc6502c2010fb218106accd0634faa317d8800ef987f5a6ea73dc96d3359e30030cafd7ddc1e760e525d2f22e12643e6e6fd6ec4ac84c40c4228a18602453636c550196d8000000000000000070e54e29d382288a8d851f8e4d1874430c30a78868860808)) <<< 16000) + 0x2080002dc700401ba2918bca7340078901c63c001018200002c7ea0008252acfa03a11a06cff47e4d3648055ec81a1b00003f41870a80b00002f84000ca8834808001b108d3168694943480200104f206c0ac1f97bef30247d984f52460cba673601c1855cfce86007d997af00110025341e00800c0ac68c4764ce6595a11e05a789f050e71d92b6af5e1d56a4314065fa698187bbaf0184fa611f3dcf5a0bc211a1cf550f1492fb5c1ec54347859e4ea4fbf3936e3c4423ad3d04dbe2416658adde4aeeba037fe245e4e726a56a7ee75e376519fdd02b4808f45af82d16c736e2906682a375cd74d540734e9adfbb2d617c9528a052a1ee17fee78d84396651c10eb24a25d5bb22462d569dc7a924e65bdaa39e8ceafb5da7b87c9338bc361fa97613e17d431e69cc7f851b24ad4efa05226672af57325903b16413f4e297fe2617b980926aea234ad7bbf31b43a71e0def6316130da10f6c75af5b510de82a84e6dbdf2f9145eab5805f137cb95269a2f19c5e46d39e80d3158ccc5a77d4160dbeb88584df6034413bd73af340a59a315697ee45c06cd025d71ce6bfad231a6e4750000000000000000010e76819ee4db1a3b2e68e85386ac1eebde67f1c861db898bcb000000000000000004150c3011b2982bc4e2c0b42c91c11812c020003d1ec34dbc0587cb2e8cee075071aba24dadc54d99c6669f81a6f6e33d16c106e9c9827b04160abeadd393ae40f4578d9d512e650b1c51d84b69411999abb810ff74306892ab5e5745192c44280028e91a11d88c8cc6804603c1bb246e591e24ac4ed1d42a59405ad90594c50b33192fd337aee08182ec644ab3f27591b3913f23fcb2ae350601915394716b6a301b9713b3f0090282af0f08eea5c1ea684e3389957a8d77cd21829aabbd0bdfe44f1c1edfcaf284d1b5d3040dd50f969dba9c0010788a998879396c97078dec2d01f86317eda951926b497901329c9560cd496110b81d976777883b2f72e1bf62424bf2840cf86ec9c979285b2f48d27a6b1033f545adf3b9a528e662c10564e7e86838e2dd88141957193ad1929e7328e0c1e6fa79813b718427b83400bcc553c882e589bb22c0d7df06ec0d4d5728db00087c205bf928619a8c080e38351c3b00e50901580002f22000fbe4678c433a5219c05000b25100179c2336039de4c05811253c35b43385d2c7e9f07960a60febdaa3e0000000000000000f1430c04e47968759ab4aeae3a214409bbee41079717da67ca5549c82139ac3b8cd5a574c2042851c52801000c0400400816cefc1e2b780c9b3f187d7b0fad25b27ccd4153e14f6ab452f9c96810bddc22640695465f8dff10cbbda454918ac041e6a6c64526a6850116a6d5667eb28e152418eca00092e4368b4334420040d0cc82800ba0cf1163b0344e0c202913d7d31040c12214a42025c0e49e203045ea0c5c3820c8f5ee194401000498e08c021cf2aa62c28d491960fb9828b991bad386373fe818bf1180000000000000001ebda16d9b4f63c15d47840d91a98ccee83f4eda3f3bea76d1f9e1e39e7a0a54269a6b161219220e208084000021514f1ee105f08fdbc755bc61f3695c52d11e8cf72d7e5a37d871d404a1ce676e5ce921b5066b720b0f3fd46590805844a7f50c29a07adbf32f3ff46d828596053de33c743700d5a8434686dccf36e8899496c8ca3f9d97877f626080410314a35e8277c87a3a334358facc064800a38e539c24e132e6a3c3a30ca81f6e18f56d5de1dbf8635a1d248722a7bd0006c523303a197190cb0a8654243280a1930502c82c64814322020008f3214a8be1495b80720e5f96d19ac2b2ead050915688206641d3d71b05843d38204b27118768ea7466f948413c3c08127b6f76f7a9fce6b1e073b96e0c0375f4478ebfd066aceae2fe1490021551e997b866876349ae49410aa0029c545266f3f9763db7e76f74da01cb5ab72983f8051a0578eea5f20f0abf162049dc129d176e80a22c6ae0f8b2ce650e40568651180002309c08a9292c595258809e8209bc9b0b86085546636cf850c002d4b5eaee0f0a04d9c282f7dc808009c3b00a714f222aa8200b66f7215074a80a00326b0d86dd0067e6b5aebd4379b99b0c00f00004b646419431eb20a5498c724c634763181318b050c500a065e710e7f781c20acb649f321829325f4639c1422015b5ae6820109f5d06d7b200122c33b6211c06c0a2d05fe1401d14a27bc5445405405021e3f64f3fb4c2a1400e3cd543307a31d30b0208322f313490119f46b3d3091319d24d4128205b076d8be0413c2166f92a340d1afae286a20000000696a8364021400e3cd0006b3984d29f8387a08349ba2aa76a4c2444a714163c200044386ca080359344b04142df9a318900000762572804220080000c99f353078c493a692025d8ef0d309122a1ec9a941026cda78fc70404d10ea8c0828cc42c306340b952cf30c100000002eda3200094041e6800359cc2694fc1f56f71a4dd169e8506122247223f9e1000221c3650401a8778c020ad875a2344800003b12bd0004401000019123120a00036c217e131880985e84c61c1630c0b045058c282e06941ae61b2e438b07caf44e600694000031465e0a2000001bd17006186cd215f09c382126532c8be610211f5c16867ce0383b122eef072100056050e2de7877b3138ab6fee0ae8d28524e21643432852c7e0880c0005dcc42c10315e86bca00000ab2829c00880200002c64610163060b1820581080c0800723c0d8c93e5b040d0a9590a5c90c28000015f6303c517e67acd4d)) <<< 16000) + 0xc51417c47fd976404230d61af8a8104000033de48400ae9dc0883202d10105404881afc1591f7a065e0a86aaa7981cc784dc9e2887fa3d0228a23e8b00f20200018f49e5060005699418000015ea5214041100400006588c084fcc792ba8e1b120580f21ea6b40f2e8faded9ed438a05d58ed6e62420204a847b8041105fbde72591000790aba34c700114a260a620000ac5f2531a0864c88148100000830f16df0e4377f98e2a0f65d7620f1448119d98ddf82040f280026d8a704541d750b5d88041aa568a2a9a00034d81f4cd834038fce2e59924002187139882440ea2450ac0a0000444400201ced34f922c20526efb90735695d4e2b1cb94ddf72083a471661050e40e7005004002bf018ab1b24358effb722f4dfd7326d27041fa451378d919f38e360a140007c481110809004001c42686ccf7d960bd648c0fe80b103e4610517d8d95c7980858ea0b90e43004a31a579014380307ef86a51c10054f1667444820d0073c2a722883161581600007808c000e467c5b0ac778a1415ae22da024593f832a1088052488072281c001ce7d0c4040023fee699b0c004c8e999182001e5ba7e3d4410500672cc88bec41a1300a00007d089c90e04d3c562e5ac0e2054c1b91a3050c2aec9edd5420408a0e380c61c11c052054db94016915c0b5103007f69a1da2e0820229384f15a88110c69380415bce785204000020a20e0530a52585206c284072396d76c5c10e2184dd41e78e1d904585e78c181ce7ff9e0c10091bf060081000002eda04005677c804a2081c3c40d5402a00067502400c0000df1001e5222fe9b17e29c98ca6e024b9d9282aa95f2126aa0130985164943963143162942920260200401b852dfd2c0c85939c45516516348a6e0f5458a645a0e1b142dcde2a48a600011c759590002f51f1600800c8509a88d0104401000019522fa13af90935505cec9415564c65370120000000000262664f305c2d77891f53340180779e800000000009c8a20a14a1091080c70020052e200200d0001c8326329b8092e764a0aaa57c849aa804c261458c50c58a50a384482480e0100401bd007b31f2edbf883040a82a261459238e58c58a50a38440008064100401a0001e045f4174444daad2b550c311935bef9c142c9a67d9e1a942041bd6ffe51223e2b6a7bce901910cef50708c0835c7d62c30e000dd9beb3404009fb32cf3e8972430a00700004004010260008a845f0362f61b93194dc04973b2505552be424d5402612c92c8288285245284244201430180200da3b2bb643560589649441429229421221008e00202190c0100680006691780dd1025c80fafd0f247888727961348a28b371925b1d0910bbd3e590be8408de63c061fa52433e9873384ff901810c4a66b4306000165afe90f02000a76a10d64a35a050b40c000045445e8460600200047422f23a03005c98ca6e024b9d9282aa95f2126aa01309649429229220c1860900060380401006d936d718a219444f133341850b96fffb4e1229a952cd54489162007a710081da03432380093a95fd02002c06bfeed0084401000019322f00b9185074a0fc2446b636ec548125c3824b32038446593d0705d74965b81800268a6bb0498308802000027640d82564ccd46d445c5894384d0a17bb912142aeb460a5123612288384965aa9392238d7d4762fc68c1857f23e0210710000bc2fe1d1600600a21acce9966ace208083003c498ca6e024b9d9282aa95f2126aa0131d007b31f2edbf883040a82a459251050a48a488402081b4bc9811eb79c2401e92b026153c95bc8eff38d5c5fe8371339ae443b153783f00708901d680012e117809c8ff132e15c2a091ad6edf9c68a0e300200dc7eae145388f800feac409ac2559cb39c90e967846e28c1018877f7e34a01411179a068e8c30005652b36724425848815816000088480036d11770d8bb06832c342ea0a07a010005c81174310b99885c8842e242170190b78c85b8442da2216c090b58485a8042d202001aa722d0c30a55d8b3a4c1c1162cc73165358b214c58c962c43316115e11dec5fd9491614457efbcb78510800bf6bcc9b2101c0e21a08b1e1b85012bb5d3575ba500455000001661af59ea0c118500ba62500404358592d7d8a0402d3cce4801c867ab70552d021610b80e110439a9ae6282028454b041a3a0e5d84c2074011e660ee4aa2c25930550300c54b99c23081b00800004d18020080222701b97299e641446f10c0916a842a202abea9312020e00400003108ad0480004588ac86c0d8262b013160098ab04c554262a80b80400802057c062ba03004018af00e00d74e0fa758535a5b38b35aa2323af80d55c8f315d18f9fea046dfa7328f5e4c8200fc20c94c7e7bce1d4084e149da2f9eb274eb00aeaddd55bd08b3e6d80b6059a4861798c01959a4908d6336402396dfcb4c3d226b84de23aaf03d8e3a914f1df9914d948853cf9429bc5f4247242ac5c6f13f7c4c6a5a2c4492230b7be3120c980a377b0a6aa406e4159d7456b529c8c402b48909e214ba02c01daf2a9abea30396f2151d6221bece301bc0f952cf9ded4e907eda0222d8c15a5986f33d16b70e413d5ad498326577d1035ba47d0d3f0f31dfcea8be2251659980458f5768de3004495f36f4705cb4a993bf51857d8d135550925439df571498f3fd36e576c599ceaf452ebc13e9fd13b53e0f45cf0ea79ea041c94d892878272efced8a503d3c01fd5ebf1ce04b6b66136adc8a26988598a4513035e833f88009ddd61c0424283a00800007d200148a604ab423)) <<< 16000) + 0x3830af5160d0801483d823001a00858c3044cc0b14c074a69a194df82a0c23de9598401d9ef69e5001b008000072112d058ae80c0100703605bd6242072b6dad4e01ef5398ca017fc859c024101c008000065103d1104082c000b80f16953a09a0f30f34171cd531e89b2648a846519bfe68d1bc59c80c0f0d37633d3aa18c806724dad81619d09b8f444d1048cf999011f0d122a5654cb2334c6a598ca1414e5dc0a4d5cbb38473c81403e7431af7836f832f43dda35cfaac3c1a081e9fc0d22fd83c006ff0de7b5d6b83206dfeb985378293d7b8ba0da1ed5d2e20883deb391a8e3c7d4bf710937bd6c238ed4db1aaa05c841865280004d322184a10901000974901f1d0ae0cc56c27e3f004d912423b9cd61880d4359ba24055a9eca16014fb6f704a103801090847f40a10b0801e65e88414c0f665034110dc062e202246226f025081f00800007e904301c4322d3c140b04ab78d09041946d6bd870017ab89710048c8176809430780200780a00010f3e3944db3514840d3d788410557e3a6b840445af80ea400d201f972c0043b317c4c083e010908277c3cec10561431b206821dad71562020be41da44808400100000d4208603c18bcd169040d15fc3d6105d6f41b81006ec9abe848103a01003c0500006e915a1100019b11591581b08c560462ae1b156098aa84c550162a60b91537d723238ab9005703861b448dca814726c4a7808001d464a083801090c0a7faaa68c031492c38ae3cd7b2807af279a64808380100000c422a40bc20562528f0e79c0689dbe00f38031aeda6accebcaa6df807b7fb091f492091cd590dd045a26836bc632ad4b8481712a2bca40c97049dcb944a0bc78422e8fd22c618fa1da170ca6e57447aec9183a33cafc4a80d916e969d500c0a1989e87a71f9f4f4e72b12b0a2b7a3a4aae9da34367bd009a8539012d822fc86290e03e9457fcd340f7b729a0d753a6bf4b4555d0af8c79e6c2d075448a191d847e9f2e68bf79355d6d398af5d56f8be40ce13100002be9150118a884c5340741b394d1f2308dd1f87c5021bf6188980fc41f31801905074021c18228ada44821a838d3c78437de7a98c040fb6441a804ce1838e0465141f008000081109f05000101104709d0bd14c10228abc85c30307ef8cee850448d257e301b25ebda101047d3d613040e00438ac3e90203857264e6c3800ba4af41807a7fdca12040e00400003108a806e875193e8a6847ca600a302564b64c1030041b34581ca5897c012880e00400003c08a608853c3629c1a081058001b41f2aac33989e052f2aac33989e051fc6595b490219bfc6595b490219c0e2c9f5e08482ce4e9ccd615c799ac2b901f73d3c457ccc02cbf32bce8ab40b4ddf720e6ad2ba9c5639729bbee41075470c705000d00032db9c730685f65742b84a43dbc7aafd6cbfa96877497f367bc21f17f19690dc216375d6e716ddc773c3137068a9565176881b8e7aa601e3cb011b6a2cf9593e05d9f98dc5e150649507ba32a92cac0b19f91311e9847bf9d5c202bf4516a892060e8040534073382210df69c74df46d3640617a61afe304dc76ecbcb012d62458804a203e01000010122982200021122962a14a110a4888001d48f3d3c457ccc02c95294806e420a67a8fcf5fe7b45ae1f2c7fb7ee5b96fb13691f3fc0000000000000000f4d02cb2cd0ca0c80cc00011035a438e53040d820182e61040fb9f5d55cfa5714d390d6caf67199aa46b3946a2cc37b38054d643fca438c59684dd00032722186210901000c229001f9d304c8dee3f9c5770973cf470d11898a20e2b1d49be81ef0311c5fb70427b6dac9619e942646a41e0334492d6124008220d1af01edf4443217cfd4292b2267ea3d774775649bc93a65c270ba037fbb86fbfd37ae05e2b171eebc6dfc0700177b3f21b62f7073e021aa60893a9dc3035e4eab347cec4ba012cdfae72ff6a6c8462fbe44194607948ff2ce0023072c0db2ec211d30c12aaa79b88e2773031fd26fe24a46468d22157b98876ed8ccd7d75f12077f08f786a660eb02890d960674672d7557108cb7bd8a506334bfdf977f5e8e8ebbf1ce7b41d64cc49cd4e908e18d43196351000c02c468162620b13005c020040102900312e01f1e64ccb8991041193bcc860427d9b0b42040183df402408200080a080f063fc28ab18137d130a9a06e1e1dd090158e71c8048183a0100000ca200039c43e847a553c5c28162668de968e253705931001109b6c8e00a2a0a20004a30380100000f522283a0591908b008000e648a39284a87407432146110a2808002e3c8a21ac50c172156833e0db4b822120c20db6955365b80c08206e019b73ce518061174bceac5ea00a05380bf4f6dd0ca8604523d6a769abcba002a01f68298895f85643546077a527bf920325e8876f1336dd6965301930e01b0000540449047420510788a0412d157a7384060bbba5061c00a2aef4080884840420101420589182e010020081210189000e0100200814101d8c4af74a6340decc4498e04fff819008c307402000014440003d08a008e8b708a20463c20c3ac92c980031b2b85890004535c3a00120c10804000038088a0e845c6422c020002aa304b26e8db61c10643e1f90810372f8a42000887118c1c0060147190110094a080021458a994f87122002e8709080809d3440e2046284201007009d16d8394da84800412e3ba080078fd1ef8004630420100000b322283a1171908b00800074c80017f113f2583000e435f9410f7008c03b46fc617944ef00f4568edda26424aa)) <<< 16000) + 0x290ec337c3451814f2f8606d17d1883952392daad0a29bf29d50521bc2a81bb41d4965e7140ea3663eb11e7f383a4a3b0b0d34f03b96193a9c0d74e99d39eeea7c220c0368fa78409c1180468224232ec3811f8a16244d1e32d3093da024eaf84010362944a176381f2914a211d8f014f5d33d4267fb6ccc71f51e329a90e101672ec2e1bf8e2b0c24ddd41e708d7db0ad4a682ac514cf833e2d72a40abffc4b9ff09817b6a4d06c2fcf2098fc2f4c080724208be1c871c863800068a227c6a115290819284f474278121010500071d113b5589d1cc4e4d61a2631381df955619cc4f0297955619cc4f028fe32cada4810cdfe32cada4810ce07061ce94b5b8805bb7690d4e85016678a28828660440000009687c7df2234eed030f923126cba928fe2461db1ec2c98826d4a573a24a0782def8b33383a8997fa194ac761cb526ac060ac66ec1acbf852d057d6d4f801d7c9b555c24d198e8cb06ef5e60678dc15430bd43329cd40f969b4ec3817d67e9d014f744d4219a5b64d1b6fee74fe5e9b50d0ce590b7d8c90a27f586b94cb7c17fdf47a6b6b148f3146b50ed2e69fed1cbc1210297009a19efb3dcd19985e0e21beef50d0a2d33c1e86649d550f70ba337fb0863b60bbf3ee01db4a844ed02b4fbc8e0af736da59375b15ced9a2d3b8db9406902a675aada46d6e7c7eef569ec279629016f2db80be01372b6131f991fc8cb8d55a3479ef276d79f81617018cb6df89688ff87ef37de933e2b20a7b9b220312777c65185e44ab90c3083f354eb8d0e63fa37e921068079800411c93fa60213080f80401e81400028244dc640010dc44d8760b2330180988d04c4c417a197070ae07f70f49f419d20acf25389c3d2d196c5d0ccbf8bd51ee40eb40680c1fe08768e0f62026cc55b815436e2f4cceb0853100695691a4255e82be1cf10c0b9a92d1fb0ecfe24c35c57908451c1f5cb9d4b11386137ac81fbd370ca390a001b630219dafd79155503ab0d843c733e5cf2659f2466b730caa3d36c6f2790027a25ddda364d5b664bdc3d457a618b5d29f884b0cd776dfa3f8b3abe40f5016df41b5f17fa282f43b6c2ab6fdd60b648276bcb85d706da1dc543bc2848917b7c37906aed792ffe84247fa69624569ba8042e811aadb8f41152127a1ac3061d16288630b35a20418a0c68904730c0bdc5f03000090607c02026a1a07a0904082c000460f955619cc4f0297955619cc4f028fe32cada4810cdfe32cada4810ce071425aa3477700591e29628a218112116002001bcd19299c880b7c26f10f2fc00e7479a5fdbcaba00844af2f085e39d5501b5e5247127c98c9b904f90b44d0542662a0002f722285a116010005af113209d87f3463d3881cbda8cca20505dffbf8a08dbaebb84001b4217c0e017b76b10000ba93db100004e403c0100180988d04c4c4162600bf2aac33989e052f2aac33989e051fc6595b490219bfc6595b490219c0e1dbb486a74280b22073862040c33011c10800335602d74a03beabcc1a2c2a95f8ea25fb5fd1cea13201768a904e73ec1843bbc261f8526b884f1077881642685c81c7991647202f036ab98800a733fb224041e00868f70761d4104494ab6e1a16c9963e860166640aa100900ce1325041d008000078103d0904080c0008008978ac4b817e555867313c0a5e555867313c0a3f8cb2b69204337f8cb2b692043381c40d344cb6d2017425aa3477700599c31830e29021a081597285297382facd07d84533561be0f9a5357a09b3d9ba56e1e003304dd894a64e9200d82cb4e30c3980d96b0dcd1fa83dd7d4d92c05fe5c800464335f85424344d02885c93d7c9412638d944ab66853ca145f371dc4895be2d112812c9b21a8805580d2c26001d008449cd6d86f4f2511b88e53c5098dfb0d011774416a140077cc064102bf7d17298007802000023c6045286a6243881672e55080a228ee784e104aa68fb1e180d7f0aa3c07d4e6116400ad21970c9c107c0200002a244b427e3a091b8b56bffc2065581e9b983a92686268b5921956d480c8cbae2b492d89c10cd0d5f5743ac1c20612aef90e67c7818db0f26793e7ca0005c9a82f35b981e848080c33054000119100061e22582212b110005191c1336e4e8a59fa4e2a9bb1111ef54e2b81bd2e3368a460040dedcc2841cf3b09bd26f94f8847632ee066837dc72d113daa99b98037ef050d59fd04c19a43be55a978afea5369ea72521f1e17d5a79cc75041c001f453e78e891f55d94641b6d48709301ddfd77d6e5bef565d70002e0061fc5517233d9fd34f1f138ff77102a32b51c6833f3d9e634ba34faa8ff11dc26b4be8cd65a75851001e8589e61880a4f4a03598d879a08fbfb77f508242621a89fd7952b1133eb6108338b00000bc64450940b23a11601000ac8912a2501d108005e0487d18e43c165d17b1b922acd4fc090480a513297d87b945fc018112453fc79d95dc779c20c01d42180baa9093fcd26020017e1f698e234bce8e460400fb0f82f750a9309c7e84014f0c6125000ed8af2825400124ef9799266727537c0fbdca5fdfe7883222705e0000ca0894a2c4a0e624e5b1262189286c490274425de7bb081466430c0a042cf98ce4817608b791c021d5aef000012920e8040060462341b12305f907640cf6c7447bc9afa8a10c0e6985041591b809a4ef6894d3f6bf4244cd4d9a0ba4360e2e7fa38afbf27b01b445130808bcdf918614487b7bbf52c2127f1813094e881241fccc077fc9b1898f01d8ed7a88e1a2358ff317d903736fa35a080e19a17271315e8ae6)) <<< 16000) + 0x56bdc1570c3548bea28e8cad071179be6adf36c8c501672ac5325252a844529466e89c1b3088482fcdade00f17815ad8024a4fe4db2d475e934ea6e7ae078975e424a44a71df770c85d0a6b3202bd5ee7dc8f8931b343680fab88c540c25a83ba5696fc515a73ee066392efbdb01963a80e9057d2b7a34bb394cb08d8684223097155440c02f1fe514285e37f00e08f2225188c1074021a484ebfad8e142fb103c28596c28c408287733b10c01c5673049410740200001e040006a489106c484160e00b12005f94105cc3e68a16b031e60a636816a801b7f5cff2000e0043cacb9b8c9a01d335ae200190080000359c1414bdbea1034d927f740085251d146003a0109181d5fe2140226a99c2040c6df37ca3001d00800004e90001543028c8b06ed3c08d6354c4a00dc83da58c007802023e02028010000651e089bc1164f065522e34f01fc79b3e60038008a202e0ee9280c1d75c4870455b3a6e78311aed4b4001c004000060981450751031430117062c78a21c21569a08465bc3e5800109c471404367b90d3000f004047c040002664238140005ae4478477ae75e6814b3462ad2fdc8b80d9a04bae39cd7f5a4634dc8ea0000000000000000021f3caa98b0a35246583ee60a2e646eb4e18dcffa062fc4600000000000000007ab8bed33e52aa4e4109cd61dc66ad2ba61019038e12201c01a0000147076b9415263a7e81e92e746e291543eaefb6dc38c295d6638a569513f605c491e92e38ad0893d80feaa4c628a8e5cfb992a15b1262b723af5baf0fc317d4019d2f18b9235d6fbb0acfe8c2230a9ea4340015cc88e808003114e0c6f9551b1612ed860545820245c588c083eeab3c38090c99c60c01a58f53c001b54a6c108004e403c01000015722284a1172108b008005e2482898c470a62364b06705f10dcf95ca10241df59e48059c06669200384b5e3c301f4aaccb000abf02a5000100098d0780200302b11a11d066caeb37143ab1b0b2181064d8558b011858ffa301b372eb80009460740201301bb102d944fe1432d345ba4800ababb5d0c0b709c5204009070780200001ae41e4862323b11819d0fea9cbdcc9c3e0df7f7614e5823bd18f012eaefa8b4fe45b240d08f28ded9068e6598309680079ef9858f11220814700f58002229e2bc1d9635e3cf798e3004371c80aa49a58450b1643d00004bc4450c422e521160500027c10851500034410fa35c87b4f63b9972b7c046c597a278a76249badbb3e2138c7927a2b9f3674411e9800d7ec990ac3f431e6acd3455272490e6ad5739a9f03b93bf6681b0826fb628048ba90d8b5d65a49fce2bb9a68bf5673158d9fb7c8637fa902248f98b368802315e4ba813721ea4682f147f29687ec0b31fb9254bc2520bbf30465d6b8a008f594d3e7dbba99fc430480e75c98d371a5ff572fc02234adb78096af1290000a81186632493c2c02406a1ca129ccd6657553d757404ca659340b5b5be0d049879a9d9907da7faf9561a76893e6b3c7affaa77bc4fc15d7e7226771a00001b64818228454e4206621010500139b10b00d02c86c016a3483824c295061482b0a101d84cf2aec11e395db45cedc9d00f00e28fc090bac71b61c2be95302b1fa22e952c871d40605e5dbdfbd316a0777fac7eafa66ff513000012a55f572108f518989b4fef847c2e4b1d2a00014c77957f72532dcc5c20e23a23f9536e167534c796e27513c1ed11902f011cee3280f2c233b5e3af05e5af572a2b3bbce03164f4287feb01b3916922964e180c7495350798186c3a865b497630428d3c1ba418c828b653aee3545cb09ae95bae5d0ba38b02b755ea166cf8cb060a93dc04b381005391b0289980d3c5b29626ad5717002d3d252a49d9294039c971aeb6cb2001e522e5a4cca79914f60d5d285766639c92b43ca72f6af6dfa23faf1118d6a6bbc8c1a90038d119a378a42c83e8ddc64619f209fea24327dd128880c0913e1f1c3813c11a0800dc3f8b000000262c1e00861af21a6291d0ebe1d68c0cd5261cf371e452b5090c3452e1ec832e3f5f080daf89e17c7c2ad0b7470d9d98e48b6f0c56a6904a47e563b647502188002891fb0b8494a1102802120200024322283a0003a620086b1132d87d16c40c96224421110d88082e819b9ef2f91989f89580e0971821fd3dfaad4f70d0163cdddf4c8494e2804004731b0caedbf4259818039f6aaccaf55799c42000d4a9bbcfa18991ec254000039dc7cd06f70a37375cae47efa854c4509c07d84827c2400056a44415621e7310e2588688c0c03786896a31790027da9858000024503a00880c008020430642163210a190848080001d882d14c4209620e4305805e0a0aaf0cf18163d5230890f54eddad10618ec51e89d5546253c2e9f4d74af190e4df09adfd784f5f144c4a153ef2d145cb12973afad773376308e21feedb04ead0e0365d8fb283e349107398e7ddc5d5ac099cc9840604bbac76037f8c00e00de6ffb3f1689477e99721e9b742a190983cb0f9ee18b43b0f2fba709833531c2832afa04075cd67f60d7e6f0f6100e054d53be3d01fdbd76333bae5abfda59d59d6871c5b6960aa8c47bc807e2e943b33c931f1b0f2e4e795d8d34c500004f765b90ddea268461b9c96a8e4b8ebb67b56ca2d33596ef2a1bbec6d56825c80d4058c5eecd94e54c323356d53c08302841404000f144010e6208631032988114840407e147a1b35384003bb65f8a000044504001003901f859de36418a086d89b3b90010ae02b000000232c1f00800005c105a1df016c001f3faba44e61)) <<< 16000) + 0xeafc67af32cbb8952d708752d2335c26d923ab4380eddc3d5d02f115132b5a65410f53ae859129fd8cf871818ca551b140083162ed3686747dd4dda1f30a290185dfa7d509f22eab41c03d1253c0022cf0e6f5514c3c0bb48719dd504fe00ee7f129d3246a6b31f6dd17130fd5c6df82baac285be1cd0855da38c844371bc379c73267907e64616298cdbb7220c29d6154b87605623e13692f1831ad0c6c469b85f000055b2200720ff3107f1483f4741f8220fb0d04f848001e4c80fa683e9041f26a0f83187b82800463c8288880072508388ae46fc917dab33a969db8ee3fb1c9a1372c25201c671506209939cf0706c277bd37b3cc0d9a50140cd087e909daea528168e786a722fbb0b77000044a62a5c64a1e0dfadbf5b94b519368451762500018b2086712ec985400df242241732f0348f82d644925dad5e1bb520a2ac73fe0b7c275e50053740d2dad94a36e17f2e74da852573fee89fbe80ee44d1387587bea14d2b8325a22b32020c9d0837222ac87586f06f125e037c8c1b80002a79002727201ab686efd6a5097e7d802bf349343e21efbb187915510db7c1080000000000000000f8450c40c3046005001015041504128c2b65bcc833da2650a55261849d2857727d82854022a2b7eaae39ff20508736aa80a6bc766e5c4dbe001653a1b0ab48bf93b7299bce9d9fe67e10d113840d00036a201b79440460a0f0a10a6e15e8d7de9154d12584b6144563f14589683bc5a89b523bcb5d0142f5920cfac2b67280dd46652017f18a09d7dcb5aa487ab7f6d39843900205d1c5f5e958b19f87579b7fa15093577efc2405ac580daf42010184201008e6d9ed838b6ae0f836e1a5e5615c84a6042b272545473870f9156d000001d57f67d9a352bf833386f778801ee4c46d8024458236e3d924e7c22159138a4a5b04cc2e3e6bcb0e4244815e4dbda5930a2988c4096d5ac6200efa1435c0e95dead3b24e5da4665f6eff3b2fe76a710e84b5f8bb75389a6303453d55921f6dfd1c93efcfac232341b7666f6c568b0438e231040420c1272b1c2784af4a08611495361a43057aa1ccf21030dd3782104018a4288f88080024c704201000014b21ec3b08f1d87a8cc3d0361e6130f20587882c084141e00bf2aac33989e052f2aac33989e051fc6595b490219bfc6595b490219c0e1ed0b6cda3c206c9810da367b42db341e21422011801401005005400467ec4667bac7e81ff1c4f151f22ed2c9e2c2d161f170a643085038d8f97f28964c21679983e4c5922527e359c9f6f70112aa24fa772a6a4daeeef7f936416e5c109f61521dd7a667f3fc9641f989fed66c2d7eaeb4c9e9fca9fc2dd67791f6b110f9dc55cca2b2f1075e50f7520e6d18408e991fd1351d8815c9df1f284f7bc80408dfee14cf6061028365662f47f52380331e890d2b37f180041a6a2c5aefc80008c051856896e8474c6fa7243505c5a365c6860701787c36ae7b02f37bdffd6b7cdcaf821e0fb804047c6f87330000000000000000000000000000000000000000000000002f9e02808e2ef11826ca05a1c41229a1081180807fe686711d56db8d22d1057e8284a9ce43bdb1787c524c56376965173ac17b97010c05972707aeebeecd5a2398f7ef4eda0f53cf9d92b8bc2a85896016c520fe3968778280011d4e82d9a523d8623cda0d286036e09f68ad7a5e86a684020230a50ecddd3ac1601835488e709ac56f7811850045d9a1d207322330400087a876c12095f7e5644be3050a6648d71edb021e44d253c44294240540000a44cd14d761cf9a1455a2de258a3c8cb4f62c119e02808e2ef11826ca05a87f2b913d8f05700000001a98ccee83c871048a3085044800565b07bac45cf1b33da33ee544d4d95749604954e4d162660b3ba151496dedb856cca6fc2d7e151c3b6a29624ade23ca3f532d07f4d5927cd0c34ac0c6f0ddd20125dd7fc4b1f885309d7264202a7a1498fad242e6112281e5407cd30f2073bfab892089f8b3b21aabae350f88d3701acabfa0194da8d6ff8f59919f8331202b39ea47ce375cdc47b5b6f5e7fba228f912c426a938cf991ce0b0defd3ade9b3027b48e2c1e28a1873f6c318272f3defc458424d8a8ede606571d7c03150a04cb8c4e6bef8c0d05993f9ead1fa3c83b98d59866d42ce1499419c83d54a08cbf89e0f425dbd65cf2cb9940cfc8ba3bad6d77e31137468077028001958e8f0539b78ca1c16ba89010204a1662b1c14f4b4cfe248183e0100ed010760082540400022443ac74126320ea15074888002c1487416c39c961cc03b163c1d107102b1e9d0f81821ee070a028282e00e3860017c6977860087f264f00140026341f008072888390440002ce70411e19e450610dabdae501046cd6d747960800038f404038fa3e8ec08020814a68440200e301fb42db37021b46c000000050fe57203b87c36ae7b02f37bdffd6b7cdcaf821e0fb804047c6f87330000000000000000000000000000000000000000000000002f9e02808658a40a304402300001f45a8521c9effd04a84431ce6ae62aa20a25c6777d71d3a1f777d82767e2dda85d538100b45efba68de6592c9fb5e3de94fff1d875c25d9ca82304d4732d2e6263bd114e444f6a000944416426000c12411c961c43b0210987080fda16d9b810da360000000287f2b901d7336d0e438502c8f24c18910710904f002000ea520fbdff96378637a11f3d0ca4585780012c1f76cf78d7b8a368a179e9e22be6601768d971a181c05e1f0dab9ec0bcdef7ff5adf372be08783ee01011f1be1ccc00)) <<< 16000) + 0x0000000000000000000000000000000000000000000000bf4269a6b17e39e7a0a4a76d1f9e14eda3f3be1221e49220e20a10811ffcae322d125e288cf55f6d7f846cba4851d6bea86739dc1bc324d76506679e7a489b7755540e4cdd0450013d6fdb679c4e9a3f01fa3b39eede3075870e1bada2d184a67ce945ba90239f992b2e9aa2288955070050002bb9c3217c2f13015f12778ee056d1b2e3430380b7336d0e438502e84d34d62fc73cf41494eda3f3c29db47e77c248a6c6d8aa032db00000000000000000e1ca9c53a70451151b0a3f1c9a30e94e20b1480c304837ed7d162ba59be04c55b39eec7533409e3e6a809641b6e956b3ff258285068678913da25a608c88ce79d3507a9708e9f5b9dd7f0e4488fb482e4e4c1e2f2252f331863ba068f2074380041be02045010002889ccd615c999ac2b8e4167274d93ebc1007f9e554c5851a9232c1f73051732375a70c6e7fd0317e2300000000000000003d7b42db368f081b2604368d9ed0b6cd078cf24910b08908f0007e20b7fc1dc6f0e59bce11d4cf9aa5795658a92d7d219d5c5347b92d66dc6eca0c6d8a74712ae344ce72d1adaa99acc1c260af527385edee5069eab5cc948d0b175c453bd08e3c47f9f1ede1f286485294d2d6d18cb0421653c26d0a4450d9cb803c2507d45450f6bccdb4390e140b7b42db368f081b2604368d9ed0b6cd0789028a0ca08709000d00700358380d827d8cf7dc5baf846839dd29d1a7312a50d23650b863589d605589f11cd40930f36b5650a0d8149e88141b1d81c941a681111e1c211e50c6813040f80403780400027a4374340006b8788b3830406406352722e88050051db6891860f8040370041b6020c6010000739000a0821aa430361d86a02f0647e7eaf3ca0919615c88c3231c2045a4a9dc0c20a315901843618154b5720f68040433d77ee8542c074fbcf16c10700712748113400091f1669031004403b724a0a80c01721200023a21a6620d22901b06a8700002dc6c00c1429d2e3080b342000058fd400404a8e3686dc5300cacb56dfffc0040fa0a485405880c7db7b7a925297f74d647ce9cbebed34465751a14e1665886bde3e04419d5bca137f9c6a6e09b2826f8e1a8f1c1f4959fe96aa2bcfee8b3b2880e38217130d974920185dee89d95b55cbded0877cc20507b8b1812b9e8310d00c1b1535225fd963350012b1253a74ad9c699fb9360bff0d1a535344610354429834cb7b4fd435062314c5596524931d800022a90222581b0ec09007831ff518c3f1c269dccf8046025c866da489074472340e16009d8eb8ed1c01d03cccf01017e4c8f404001d7bbfb0620088026a4be86824834230180000ed10cf0580040190da2586c90eca0603ab9338811ce232f2c8293679b5384c5ad2fb22c438ee1fe4203258424ab18310f4ceb7012714200086120a9b1a9f091842098f2a1222eb41af582430f8b8316828643aab05e4508d1fe85339e04407e47ca18021cb120460001821563880680812c81524408c051e48b10157018499fe14239e2c60cc823122167612a08e204e556f69810ae64bd28c1031ec53501386100040360040002e04000e0486b8af47362d5868a1f5ae234e343dd762cc470b03bd4f01421efac4d48000ac2a74080157b0a88109c50780201ac0a07f010000bd90d52186a00f066cc7ef30a9233a8c554c88c0a6ecb625b0302b8982ab0010118e9b5f1e04085f2ccbe90b0044805f6cc38065429805f0400c21c5824000619d962790044094a242502005c8280008e0869968348941a2330d01581b04833c15c38938c1df9e2e0c2a3819e200002d901c0dc39d38b8c00a28eee200000fa0400084a5040010f142b6719fc1e0800019a1038186e09c4f4602000069780e00ca76f035801901a0c0209bfecbaf01eaf8b19a4254a08c0400003167c53bd00a9990606b966833636ceb3b460f1e2524216bde357e47d176a245df64d64354904281eafe7131088aab8342d8062627bde4801bfece738d10b676af9c2c1be5a3bad9200152db7abe96469bdd5b9a0fe6537edad80bd00251b03397bf53753010c798012ea02b0e957621cf48af8d947c95c5e37cf121895324560f99e154deb0d80a948204631c26bbae1783c21f42b50670408fcd058e00b366df10200263f0a414094607c02019c0a0cd0100009710cc2506590800172086508ec8051ba6fb3842665d273383828c672920115abc5cc2c009d541b51400ffd3d19001026242000840a8f49ffa0d23c03ca9b89fbbd3470a40552d52227498b02832d3b64b8457d240129f5c28ba10fb101afdd2a057afcb0c103a80c62b8b440c010fed35b0b5d00e83fc0dd43f6203a7c4640a1a02e010005796431ee2d605c9f4754b966816f685b66d3d8f05751e103646a6333ba0f9a05141a0082088002017016318028f3f2c144dfe00c59a0493e019c23b4f6a418a7307962259da6187f192800127189701eef47c8144679fa396213f8f0d2303003561f8180052d591094107c021232b3b111a1c2803ffab1305269ae02e6880a27f6d040c2829d1f12007a1d03a98007c0212329a73e1b98291a51eb128308c8d36078408d5b35c508075acca06006058cb898007c020000248400098cc0ae880a28e6944a82e5c4a0c359a91890086155076490207c0200001a443243419012004090638280012e88630080027748629483109418602000b7220446b02405e1f0dab9ec0bcdef7ff5adf372be08783ee01011f1be1ccc000000000000000000000000000000000000000000000000be92)) <<< 16000) + 0xf4b5cff25e96ba000000000010a5c7abc21211849a39839a1100980005dc22c301a00dc4235a5ddbe5b36bbe8af8f4fe5764d1aff1237737d602900000000000000000ff2ec3a28041c0b23c93c8387283242041300b711839292ecf4083ce15287d030282c0b6d8cff1083684e83cd906834f47ac14600bf9aaa16abe00ce095e4b5a2816b1caf8f25eda5feb8c2465aee954a0c120ba81470c10e9ebe4107ddb4c6289810800200002564308278846b4bbb7cb66d77d15f1e9fcaec9a35fe246ee6fac05200000000000000001fe5d87450083816479279070e50648408260044a5f226c30381ba605d67faccc16ed4e994b76a44d0e9c75c5b4589c4f6eb821e9011f67ff2201d012708b1262d14177308c0f27d3f2d0b98498fe254528302e945ce3860b70c9f0c0432df80e820ffee232809c207c0200002a440011bc8608883001400121642fc5417c2a0361505e8a82f054176220450d05d0682e43400191440084ac80157390b83505b96801347085b02801a8948037a290a55d85aa8c0850400a02c4235a5ddbe5b36bbe8af8f4fe5764d1aff1237737d602900000000000000000fc440c6045044046005004014014003dd565588bbf8db3c87a512221c8963c808d4035643b40db9a399fa6597d198b202268e4b143652a2aacd14568fbef76798c9e382dd9b9731d14e994041db27d782120b393a73358571e66b0ae407ddbb486a74280b803b1f02c1a57f29d12f7e5f7502345d652f70fd29f3485e080000000000000000108c91071040c70890060003f4242346cf39f024c5d487b6ba951c65b310d8740c11d651b5589f47bdb0006001d347245718dba7cb9c992e286fbb2f2682862fb51b34fd7b58b3b4d1bc51456d4de488759f58407124cffed98a180add25e1033f43c81a384a392640800098707c020168220b3118590482c40400030842c0b615e5b0ae258568ac2b01703bb29d8fc38582a014d060401bf662860a4e5550a1801fdda2781001779913000000098d07c021e555867313c0a5e555867313c0a3f8cb2b69204337f8cb2b692043381c666b0ae2000000014f75f7764faf0403d425aa3477700598e28e20818e10c0860a01545b472457041b48dad6fc336ab6d985255c8792dfc23f5c1d371be0009723b8c66efafccc05412d988a03f6e3d3f124e7df613194c61b65fd0ab050001eb10aa2d0548c82a054000ad87da16d9b810da360000000287f2b901db46cb8d0c0e02e00ec7c0b0695fca744bdf97dd408d17594bdc3f4a7cd21782000000000000000004231c20812401000c008050050007431b47764be26cf3ee5704d950a2b68fe7433da33762a58c2331fc18183d7e4b71f8f1f90ec7524123f68507e64a348ea8628485078b4c91cc64d0004062001f7e429ce614c720703185298c29026146130a20905080e86e312c56edd7f293f0d11a451c4ae6a50277919b49c6ae4facb595684f2501e880700493a98f7608d42f16c4009f7f4186089aa43f4b6a6bf1e756006ff6cffec41140017489b9d455e23fc4e925d572fe89906d3ced7e465574989c458b21e3b8b0284b5468eee00b890ef0333bf110db4a37811a87415a5cb0848a18804704304a005010437af69cfa4d69c1aa0698b778b58250012af8e4862471c1cb6474dd1751c9eea253eaf9207a45be5a4f10c78e82bd00028e21407b09f3984f1ac274a61383b09b1984d06c2642744e78e4e084569cb1e022397dbd914a129e74df130c10f77ce7794a14bc7e747959084a0666fa2831d8c8030ee334916ae0f9a0bbb4d61b0618230710d1be8001c8f80536ee4e6e73ebd40a10d51a68e04d94a3200022acb8ab00aab34c2a44c36203394855944bc3f301fee1dd85a7d489d337209d767c456f048593a400edda4353a1405b99b68721c2816f685b66d1e10364c086d1b3da16d9a0f509a69ac5f8e79e82929db47e7853b68fcef848838c18268058018047624c86fc1bb33911e46793479828420d9f301ac2db38600a8050e083052141c2eb8f71adaa2854ae8f165628c5c93b78c662782a506c75e4585824c8e8961839dc08624816bb164a381597afde004c28380100980500009799181ae2fec617c2f5ea4022101c00804b8082580412a020000b82128420931d0490e800169884888e88001b2f54a091f1f6ce1c20a543268a0490bc2023009dd02470a00d55593e000f2704ce84027181e00872a0c041351162e33e77b6b8e1f384b5e088395060210074663f7cef6d71faa6d3ae8216a6333bb47840d913d8f0573da16d9b07ccd5a574e139ac3b8a5549c81717da67c2042c71c63c0200000324805b145416faf482ff3d17fe902436405dda45c3bf4c979de298e6fe4049ecec5c5fd931f2d0fbea21227c97d1d25347707d33936fd15ea8a759a16062f7f6be8c1015f557e6010c197ce240e05c38d92020e80402401611e0bf2c87a42c0b18dec689cc0b788b614d04c2c962e4001c00860538d919034121270fe1803ec6106e3001d00800004e108e01ccf1dda6111e380f7d0603069e771371800e8043890318bdc1a1820d2d8c306bb73b4068107d501490007402000018a78939363d911a79739b3c00b132b23001a00871246d5fb278c51fdc0a4022014f7a681d557b272000e00400003048000b79000307200095e40f444000ba240028f484684e03178c96386156491a58b0044166c43004d6645224041d00850a6228d5e185ace553828213226fe46083801000009b365089ece000db9120a59e8cab406aaf1d1f68ee7742820dceab1e8641bc35)) <<< 16000) + 0x7724a788601ab7e250e6bf403841dbdbe449ed2fc715ccbdd16a33bf77aa3dedef8206a99103f864f6fadee1ab359eda696d172daa4d60fddb846af5abb0b44eecadff0dbfa43c45ab0f78c75273912c8541cd5184b26c8151392d88113e4180003f121181a070050358281a8040d2020005f221164a08a21044908220040024424144d60d05b06705c0fd370df07057702a1820713930487029ed1cd0010000a1a0e00220419ffe90218428c516dc70470f26f00c087a07cc21014aa53d1e08301876f210100026301f0080440280005408439882186410a2a0002832042830843583196c18007853b4c2d22349e76c46d5ddeace97efa24c8891790603455a1fe95a47acab2680709795f02e04cbd9cbef32fa55e6a9f2c64b6202ec72ecf573aaf82fa31279bf20810a087350ac6265e8492d02dd8cba6ea286c02d6a924c480c18e0a86aac305420e004959a39ccc721a83c293031c68bfb307124a2da185195060db5051e961638004b84cc529cd0976b03b14ddd6fd85a0caed0c586baa9a63859ae439bbbe0b1c46284ab9a6b41b2bd73f52b81d72f4f77fc7910fa9e7f545fb719e4027f04da0ec296cc84add193df1ff025b6ac6ca6df4789b8e817e2cb8aa0611c20a7d9ba38cab55cff4f14d7388429010cd367591420b69141c482366ec65870476e56461e06fb34f61009c407c021e555867313c0a5e555867313c0a3f8cb2b69204337f8cb2b692043381c5096a8d1ddc016469888e58e88a58650038028060100401b222ae640bf1840bf04dd22c50fe072fa30a473ec444305383f18a08012d01be20402f60238f3800f80430850f899994431c5b88081612fd2a6508419c03c140b36c0c14a003a0100000ee20004b07caab0ce627814bcaab0ce6278147f19656d240866ff19656d240867038c3217c2f13015f12778ee056d1b2e3430380b320740628624334030ac881781cb27bad2d04e103e89168a84ec6c5f710a40f44f5b149353435815d74e7d49b578d1c63a23d961fde95e61a9bdc6ad8a7d7f627d4a10a89d6743725541193dd1e8b5aa6bc142330b2a00085a40f4340010f040027a08418cc1b05722dbe8f12cb103b8fb4c485ac46fbf18059039460401eaa526c941074021038b32150638a9a195628e14fe277503806f91ff192020f004000032c84104c20405e555867313c0a5e555867313c0a3f8cb2b69204337f8cb2b692043381c5096a8d1ddc01787c36ae7b02f37bdffd6b7cdcaf821e0fb804047c6f87330000000000000000000000000000000000000000000000002fbda16d9b47840d93021b46cf685b6683c870840850640258006e3fbbc59b946081ea5ae3ac35c6e612cda42c7cf20220cdd0bbee9f4403605c3620b14683c1c118312a873b3f2e6e30d176a0d7a21f6c1231a5567d7f1452f86d8eb539c08142fd0d8230a30bb6f7b8fc353af0c13975140c58427a4e3e351ec54463d74a000d284200440b80207f01000477105a2582c8ec160070380188458c0b673f3a11821191bee040a111563e2011ef30dfc700f299fdf0c00fd2115000027201e00802b848158140aa0a054050000d5107e2582890fcaab0ce627814bcaab0ce6278147f19656d240866ff19656d24086703876ed21a9d0a02c8a1461450cd088086001000c95089e0785b2f33561172c2f7a90467ce33b03a00dc93fcdfd7fa5805f1ff843ae59c95602e413c41d07d1583e0afcaab0ce627814bcaab0ce6278147f19656d240866ff19656d24086703812c61c6184241201181380011d8c233ccf332cf3b6fb18bd5feeec21c8ad6925e2cef29320116ebd6307f0b74f9b168e32377dbf5a4092dcae04e6593e0392448e370705149a4040e4c89c6d071630788fd9420ea88e161c2723bfcfe1021ea07714026101f00802204c10c1608002e2487eabc6d76becfe20d5e8f9553eda4cb3561ae6ad1dfe45a6ebe9fa6e9bb538687b11912fe45d9830737306b9d1777cdfdefb9c9c70923321239105db0bdc333d7d4a4e1976d35cebfc43ce6c2084dea6172065c0c78c77b6a7090af212301c78d42dfcda22f3d8e83f6c60031704acd723211cbd5186915504848eae8ccb999cc2fab288f0ef3b64bf6aa6a43b1dee8258ec97761c634a2c7450307e86943eea010d9d73530cdd0d63d191ec224b85b3c643b855502675dc6ff9de04f065fcd8f01d2a4063c3966d72d967260985953be76e11a0abc012b8f8c3e849fb209f74cc200ccc665336033752497bb1bb75d46edd18f77668e95c908f772003ffc7922172a20d8c5c26fe9376ded8bcfe14ca6ea40d5af14b0b041bd98193ae05cc563baa01c076138762239d8dfb9b380ba26eb05d1c040323f863ca9258c769586000141e41ec740017524003af082d16c16007630e8b94075bf6754dcec9ac48a8c0c28e7f4044a9899b645d3ffecb92c0c2724b9f5096d9dfe9e43813b39d01c1bb7fad8c908c43aaf71e240ab1012107c6b117bf89ddcd0f5ac8d3bcc080005598b588fff47d364cf91e237c99454c092a9b75ece0a20d827007a05f955619cc4f0297955619cc4f028fe32cada4810cdfe32cada4810ce071796431ee2d605dc496a748c3816658c3087064844005fe710fb190a0233ce75c19971c748336e68867a37607d8785ed65b14732396642aae653d3a92ff2be8023d1253c111c19a27be5d152a3f2a11d6c04e1ab6ba899a4ea296e4e50003cb20f233f2aac33989e052f2aac33989e051fc6595b490219bfc6595b490219c0e284b5468eee00bb892d4e918702cca1451050cd08)) <<< 16000) + 0x800000130e955d1965f37f5dc2f579c5d873c606273eee95f158f824d2acac2cff345ec48b60ac9d3b0e9c098459830e5b1374000c8883c0c8164640ae120560502a028002bbc83b86800745083b2081d4d40e85a060210398680102400745041c90400b32041c436008128c35edeea244764441b6ff28297540b9dd4e040466ef2cb00000000000000000807401ecc7cbb6fe20c102a0a91229208c00a00802008a012ee532094aa3f305cf10019fc6599ad3b31e023565b579343184b53d6229eb4e9659172d1c96bc5c40e661d4ce42ab30ceb2053e475add765decf1480d19b5e74415aa8c9b6e0ce4096f2f1044db21ef6232b2bd40801618b2379d67e0732c6858155318a9ba409663bc90c3766e1dca1c00c0f33c204002cfc5c0800015b87e500128a1000430d8ec45dfc90807a19628848407c0100e00a000092345ca74ca9a1018017c79388040861d79a20002be313b1240c210080378081a8040b6020001193a40098d03cb0a5927c1670136250230023141d00850a0681aeb90041141ac83810f5fc6e811860f0042010020080460100001b906e0d00008618020080201b4040d80206b010350081a40400011640009cc82890c1a0760ce0bb763e7156605610940b7092d1402bd940dcc809409a29aec3015d32bf5db39215775836d3d8233c05011576736585f40b8a6c6d8aa032db00000000000000000e1ca9c53a70451151b0a3f1c9a30e9440c30c604600049861246b515f0f0af1912085aac51c44c8befa3510546c088d98137c2d76225627465ff224ed004102c59b866f83a6d741bff510c565e3b562b091f61e09f43ed89a3d7256ec94076c50a4bd11a0cc1200053420ca5b064258318ec188660c20306001e914940d6e9821dc0de9e388a9fa90198013ea309e0048283c010a10fa71646401633f600011060f00438ff7c7a4e46040cd9e97c28411b0f9c2102010327141204100040118040001d2417c3400032660100200805e0502e808170040b60200007620b43b0591982c00e09340ad5eec40ce063c9bc7fb796a7702145cbefd916f632a862f93958eeeb7ad2795fe9127aed1c80372373448c7c4d89041064a0c9f70bb56054175eccb92c0b8dc96aee856192f4a8cb380437c41f6ae25a8db69f75c0f4af2860583011a44b02d06003496a7aafe451e6dc677ba832ec1936d0bc6a4888756063fe31a8098111405e8ae3aa41e61652bcb7ccc1a70f6473bc000cf1de53437dab8b01d7431c7b5eb6352af7738dd5d8dc4571ca3364f2100d5926e576609f1b6f91e7b05798a7470ddec14cc2d63de41e0fca03a2d7d868a4723630d916185ccdf8c453d0e4f3f822074c836958d834b0594728d89f2a98cc0ac4015c140ac0a0550502a02800202082994c148860a2330501582780edd8f9c559815842502dc24b4500af6503732025ccd615c999ac2b8e4167274d93ebc1007ddbb486a74280be7955316146a48cb07dcc145cc8dd69c31b9ff40c5f88c0000000000000000f5576736585f40b53093c4344200033d82daa3777123de49c48eabd6620ad9386668005584b3ae457b3e602a34f4907df6166d884ba7ce02312df269ae5fe3ee91000b4820dd8b63dc27745d2877bd93888407b1936043f8341c5448283a8092da2ac67028f2028ab183541426d87d84a8018de97480e004bb7e8292013969abf00098607c021c2c21cc7f258a687bf809a112657a4e304aee6e848248203c01004e0102680c0003ec800122904c198258cc12857a205834e2b94217dac41e0810a6700fca00d61937b28400284996e0084a30400100400179228271f59b25f58db40391cb060625e54099bd7b758099ab703688460ceb11d7bc9dd6f7026a0a45822796799385fedf33f64b83e08817c9f3edc0f0e3238c07cc04e701c26676bf7b13599f82f28e9e09dcb691e5693ae3cf93f9cc8462f9b7c8701535bde6146010c70ac739a98510a5313669141100eba1a44160ad50e45823e703b740094507c020000204411c1400090c40843711bc785818610b3c28e4605c04f3f46004e4c340300fb19e8025081c00850fc6f2dc5384142f657ac3b6bebe0b89dbe8e11a7c1e7b158159c603acee6d5a81676d38ffb35cf3adfea10a1009e19c1279c4a5527c0dcde5faf1e16cb7d69302fb613379d66bd526fe6b511c90beea05db732c2be5bec028102367c64ee609e70b9fcef88fa55cd8234f8271ceb5811dcf354cbcf89acb357eb1da33f9499489cabf6fb53083de8c2430355c129435a117dbf17c07e1d5b60eb7e00feeecd6542e08285484043a03f3871719db9c97da324ec8ff3f0e1924778b5f5186eec4116c0a1f8ac9151272ac3d61fd08d7525c69b87e596b3c0aa5984ad27e0001bb481f86c12427cf2aa62c28d491960fb9828b991bad386373fe818bf1180000000000000001eac591b506c814abb39b2c2fa05c2971eaf0800000000497a5ae8024bd2d73f848888260258270000018f84acedd3627a483f393de0af0a0e6bbd325c505d64c7e065e65b1376dd0080f1c60872740742f35f812e2581d4945d76f13f5d5b527fc78286771ad64402bf6913440328ede3094c50eb4608053e8394041b0044884d8e3fe9a20b0f48b461059d788030466e9b7d3c08cdd6111a000ed9450981074020000234412014000412411c04000cc840f4540781a0460500076f104501000a71103a3181c80e864ad78f62074824ed4201b30d30c11840e004011017a207722fc284148976d0e08085a94aa4918210004203029e7aaa3441a0c7f681053d)) <<< 16000) + 0x2b60d04044e9473f1a008afe8642c0072326b24c083e0100001262086020001fd207023c0c8b4f0502812ade342410651b5af61c005eae25c40123205da0250c1e00802202f443b7632ac20b06fe7a81012d7ba0ac23081e00840613f957f3449b390d02c1437f3a110197eee7e340be5f60809420700200001dc410c040003824000ba881b8880d84406a1a0420d0198480c8140820a031050003459d2132ca3c607a6c7cca74030232d654b20f71c9b12282bbdd2a9f7a1e50f7082231f8a07b9f4ba2954e395b2cdd20c0a6957a0c1be7e332705b7909c4b20708ce527a1eed91ccac5aeea693ddac4016ef37b06d3d7be15387eef10baf000fa18677264e44de3e32b85568de48299e79398b99e996b8501310380a634a483e83728a1df084724192193c210092ecf8808040a9c32002a2838008040017955619cc4f0297955619cc4f028fe32cada4810cdfe32cada4810ce0716ec7ce2acc0ac212816e125a28057b281b99012f3caa98b0a35246583ee60a2e646eb4e18dcffa062fc4600000000000000007ab9348ad626605aaece6cb0be816a6068827000801c69e11c04a01bc17374b48f84cff48aebd786eb427968cf89aeb800cbf23501367db4782f50c22c4a6b669cc28c1ccc5ee9981566185efc43ced4c60d6b496913107399d36183553d4de92ed14bb343dce74669c54ac6275055a94fbc21a05dfbd8cf3a3c0b1168eba5e38ee471386ba2a9126ea59a15d12c6b98358eae3a2102c0fc24c1d534a137f51ed52df6e43070e1ee483eea03ca5b62fa58cd2c22e7c4eb3a082665873e045df596ee97c4808dcb094c0f337142f52d1237fa580cb3f670f7ec00923045607a77c6e971a26aff59a4d0f0364ae6b8d93a4aa1caeff085971850bdd9fa1cd8838e234a586a926f4e9c4369e4e2543d20b2e628dd5c53c1334f74130034dc98a881e600015fc8005d21a14713042a6061e6d5260c1026d1488c047796a364001d00860cc629a2080b90d2444003401000006b207e0b8020080200f80400006e40f4240780a0210501d828000818800773903a2581c80f040390e92020ec6a08042801a94c7391820f004200802008000022207013a0a898ee41408d81cf42002cbd5c02808a45f3424081b00860436c236f041bc3e943822081e00800003c1000154206e120360901a8480d0240661203205018828000bd081810c0bc6405c1a0016542007462401034008c7c40b5040580a0052052056b202a3d0149a80a0d404e420057742016f9a4032f48d0c254905a286060940506cd91c4604161307edae050674de49b8000405a57820b2140301f2ca9de7f4020050037c389c41450416c47892e5a141139218053a92a73c2c0305e2f541a4485790f5d8ddd5f80fbb4da797cc56ae1fa6e00000000000000003e2efd6a5097e7d802bf349343e21efbb187915510db7c1080000000000000000f88610608508500400301104feeb01526aa6c9ace74e49ba2b3a10417f597a20ba30cb4e5e13fec8834055e3fa65035a748e25f6495cf41da2cdff1320e449bfc9888687d90d392c4f0fe4aab31a851df7108d69776f96cdab228bad6a6b06718e1a5ce304d24ed4b000000000000000008088e18a5d3f17b5ed82dabcef3400867a970ebbc2186a9ab400000000000000002010e29018e18c18a08a0028837e71b6ce3748924e8fbf85abfb4994027f70dc78d428b917ca3bf43fb52cd8bad8d6c47462c9d202d0e212bb92f24715233aad122dac9f7198815e0cbf94e3802d0243ca14017472f128aa930e108042c919946e1295892c75278e5bc1e4518687fe7e321f261c502f0cdd38cc02c238c88a4000d930037dcc7d6a174280402a7648368b24008d25b2e5f0010271040a1801e30891205896c606246c7b04480409a2f8a01a00c8f2162b2c004cb5f35450004d164e3042610230085bb1f38ab302b084a05b84968a015eca06e6404a3363b3c209f29ac96819ea20f01146a0f91e79c71c61e51c508094002060000401be6013448eaa38c15726fce4794000029cb8d2800002eda1c287ba8211c101016635a667010260b70ba700230080000b5102605f9e2d30ac71838ea8f7e53e81e500e767af04e289d114438a6020000137c82800000183839302128043cc02f095cabf5338c1d2497ba19883ca000029bc862d38511632a5909593809db37be2894634000000e4c474027103021801e000066080017e10250900033810007ce3860b06673180b2ea9bbbe55459200001841030701ceea5d696393a21d274820400000d994380000030cfe9c009402184825a116eff7964984b156f94f183800021639e89610d6ba0a6ada1607e292fe86dd14000000b703907d06002c02c0000bd1024050118280880404202020010001bb1000d92203e4301e01d157683a243628800001775996300e7752eb4a189d10e93a640400000910e0410b026ca750c000000c33fa700250087c021cd5312db944e4a5fe80000000007c4a20b18a18918808504104a030000200d00010b203a0ba2aeceb361a45100000337392c601cedcc4214313a2208d9c40400001221c0820ff71eadc18000001867f1382128043e010e6a9896dca27252ff40000000003e251058c58640450210250020060100401a00021a4000a8880e04806c240340a0190500c02805c1402c0a0006032002a6440540400322a405084003b8c404d040247a0113900816803ca401c4a00d210060e802c640142a0090d00404801c0400c0200212f200aa20045100192800844002020000100b3741)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 39 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase15" = "QuadFullFourCase15" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 39 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase15 private def zz2199:"s0897"="s0897":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase16 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l17 l27 l29 l30 l31 l33 l35 l37 l5 l51 l58 l6 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x52ef97122, -0x59682c120, -0x2625c134a,0x56cc0268], ![-0x59682c120, -0x287d7789f0,0x1032fa8078, -0x55fffa046], ![-0x2625c134a,0x1032fa8078, -0x297f25eff7,0x89674e120], ![0x56cc0268, -0x55fffa046,0x89674e120, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x185faad0,l6),(-0x7805aa77,l5),(0x1f07b752c,l8),(0x56cb3e24,l11),(-0x9034c286,l10),(-0x54d0a552,l17),(-0x2cb417800,l27),(0x2cb417800,l29),(0xd568b93e,l31),(-0x5569ef8c,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x2b65e9d6,l58),(-0xf633d72a,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0xf633d72a,l63),(0xd568b93e,l31),(0x1f07b752c,l8),(-0x9034c286,l10),(0x56cb3e24,l11),(-0x5569ef8c,l30),(-0x54d0a552,l17),(-0x7805aa77,l5),(0x2b65e9d6,l58),(-0x185faad0,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨70, #[0x243202183029710060000000004f00b200c0000000110f014c0200000000003c0520080000250982402d0030000000001e009200c0000029151102d0020001544905802e4010000000000d80248030000006a04401430100000001b024030c03000006804100263014000000000090188020000000640b01c300c0000000000501880200000000682406300800000000016014802c0c366102012ce401c000000148840d8c0300550638260049401400000001a07014c020000000720902c300c000036108640d900300330408610192401400d510e19c0f6d005000000003c1c0a30080000000250a02cc020000000004d00a200c000000000270188020000000000940e2008000000001540288030000000000ac062008000000000290388020000000003d00a200c0000000001f0188020000000000740e20080004d0841200c90040510284110018d40180005c0a01c017500400000000026009200c0000000000e0148020000000001c009200c00000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x38c7c6adb754a14616b83da102c89c7e8451c565a4f318228057abe6a4410019faa344224c2046010b24720bbb2e4926199f9b4b89207f8d59534a1d5a3b49b5891cd5464f4a8a0959fdce2f0700040fe9fd49c10900200540b926fdcc33a5c1241406e6ad2a2471feb169e3450a3206047578a10246227fd1141209e12d6293000000046500500c7b1e0af1c320209c0) <<< 16000) + 0x4000037e6c642b980df93491b1329ae70cb2069cdc46ace4081218dfdb9eee241fb6cd2afdb08041074c2d9de0405b26108571822c287020c87cce18540480001d22000a9e40a427035bc3933f4eb602453e8d551e0745a488d2156afb7a33c7123352ca1c0d9c0c22a2384838ba301c21397d24641da818087aa9bdbb71d1107ab40e30660880001f53a9acb482725a45939777815bd598137ac5bab651a6bb8734d8682d8c8d0e967a1654324b2600000000000000000110880c60c604504400300101509aeadae2d45f35dd936a6473e6e72204f4c80e63bbfd335d0338477127652536dd5ae02fd97478bcb67acfff60f0ad24c2b8e689694000e0cf0c06785d0459ca9d45f574c9ec04a3e2671f18d5cf7aeb5b2216b620d2b9f1c2df40ab5fd718c6e1237345c776b64099e860d6934a55c8eaaf545caa8704408f04237e9dbdca95cc0710827e3ae1544d35eac981113747d475bb9028e30810f5236dcf57246e258eff7f99c5a861952176134312de00f7cc12c79525508d7e0433638b6006a9f67bb561f63ddc1f455af2e571622a28c76aff99e4003d0dc96d16615f11dee6cda795dd8aea2ce619098402dbc8b559247b545a5af03de743a7c67f2612f5d2b39af1945ed06fc34ae9cd06c14841dc6680006bf37ab3026f58b756ca34d770e69b0d05b191a1d2cf42ca864964c00000000000000000222fd9673107db85ae57a85ccfc8e6c40bfee29e78c9dacfbbe00000000000000000824302182300280200a005c673812e353776ca5489441b7bbfa388e032f95dc2cbc76854670e6076f0d5e5bb1f190170219e47dedd38a9db4735fa342b25e17ed45a3bdf1a36d9197ad2500b02b16c4ac4401ecee6173f823c63e6cb8ca5bded77aedbbb2463e6e71d0fdc514eefbccaaf186164a4a448150005e120502202711013028094050306927e8fc98385e01caa16410c11b5021f5588284450b49121f1001142ce1d52c380f81b56bc148a008a169d3ffea28614d4b6e4b934f7080156ce2054040816ef6b603733da0a224d61311a6f9b203f1bfeaa5183e428614de84ed794b430d28e494731c490c08cede6300e9b60412442d8129f9fc48177a37ffebb64040025de74ace86a6ed2520066090b1c1a4b79f01038ed0a3f1d28540f3582aa48b159243b205101fbe95dc8c0868bfff1b1401f57139e73801180400005a881202f0b4871d02ac8c0413d004f645e690818ef9fc19ddff18267f03079e500204636aeab96528309b59334d4d900a0a4b12e5ddca42802bd1655bc54028019986ad178b2d484801781e39dd56f0ffe6b8c97735920bf545f26db04400000f949079d3f377359017ddcd650001091861241631431828c29218a0e0000401a0003426cb0e706d05840e4dafd7634a15d4573b60122aa9e1fda21440b29291d040533f71c2a830415e2240d8a00e7081c952804230080000cd90005b23c45f47d15122aca0a18a287838e5184040e11e9ad3053d203043680ad57d27b310206d54c67167418417ed05d71681d685050344eb5de05ac18069e7111f5c6a8000529d784f2052dfa1204801a82800900604603c2de2f120a79dc1045ce56e377aca306378c74692e9030f843291da2170c10cd9e72a770014047b5fe9c0f902001a0163eab200201103c79559205b688002f03c5905cce9357aa6d6a0dee7ddcd045258d4134f482dd287f8196a77eb3b2e50cb6e083cc705dd059194a3d44a8050295ff592aa89dc8822276652c7203820a400f0c9d1c56218418116e021e3b7f9df847e218800280360940000b04d0e8c1b13daca1783576267922a8a02617b1c3073dca83e28608995c48070080b5857333021180400004f480031c90008f920025c66840dc34c16d361ac93b2cb8c0970612ace2e0d8cdc3ad02824e8cf702e9de879f1c0088080000077624864a4668f0301289a9d7b478292b78739040000000ef4eb7afe51fdf0a0ac7b55d72b9b2886a14cfacd3ec3d7c8c20a4170022010001779021198100ac07c5603c2b01d1580e08c06c470440a710aa1001ce36b90a281105accf50401efdeac428a001214110040068052209342d7a921eb29b7f30e1008bd35e9001ac652958600354b060840267e0296804c2040010e2c2a4f4b7cd2eb9e5ac24b2a4315e7fcb18d54147364002000858ba97fd168910004b2f18804d276bde8c007c02000014440641744dffa00a9c700685a70100803938467608c20840200001584060040004fe4050560262301211c06ed9a9a683ebb5a3f881d542d5ec0250c093ac2c177d1e79ecbf4f097c81b8872280885e516558675b369258f3b784482480042990efa37f82e8d933762b9ce2906889b5b3d5987acebd4a8c8473ae1b9f4700025a53374627edd19e5a297dba906d587aef294d8318a1e4994d12103d0b40000e54c045dc83b4e081d39c43f88400f76a87f11008c708402002423e7755bc3ff9ae325dcd6482fd517c9b6c112fd9673107db85ae57a85ccfc8e6c40bfee29e78c9dacfbbe00000000000000000824f4cee9c73e0599010608408a00002359be4177d4dab3f83643a849d727cc1fa992bcdcf89165a68def15410cefe01e281c5f462af7423a5e968087b020080c147c1c157becb1a169e2c380f295cb82abcd624a98e5e7777a95ec25ff67ab931fe1913bd60eeb719520f335680027e90005e330624fbda2b0c004646762910090e11002005c4602c1b804008023013a900168a04ea4005a11040f00400001e080a82e0200200800002220282b0131180908e81502af9)) <<< 16000) + 0x471beda5140e15ecf4b42a2be83415fc95ed5f056a3e785352d68fe8265802b2728085b477b2b3a989cb659246d2d327f402df3ccc59bf6fa0f1828ee88d634201a8b8855eaa34e44d1d92a11924081f8a1e6e8f847888cc12900f1efd5794a0baa9dd9d7aa10b0cd324df959a8b2b7b00ceaa0d70baab880aad5b3893fcc30df374425c981e3ea809a6869280573fe66d3eac448922009d139bce763cf2cd8dbd048b429402f575a8f52c682376bcd00813c41f3bf577dd4d5abf2217e7c9c1db54fcc8eef72e55a98bb44d7d4d212390911cc380001b2080041490008f52002d9063c413368cf48ed42261bb758916384bfa55f5a29a0000000000000000727a08ef2bf55c167a822d112c7f0086444e76325a48ebcfece4000000000000000000000000000000000000000000000000003200000364814df4190000002a6202380300180aa1609764884b3cd93a68a30824aa30ec0ffb42bb14a89ee86c0d532bf392177e521fd0ccea6f3efd56ed04263607601015f55eb7ace294b96000be4c7a1e98e75385e1c33e8b0e8570d53a79d94a9d8e4cfa0ce8867666ce703ef9e364267ccf2870e6e1257ed1395481c1eadda7b4ab77e3344816554bc5d699f30afd73d5859ce7f101294ce1f1bed10b5d155a022020007a22003f40400e14ce9a7ebdd0db06275ab7280a8c9c92ea34b305d63d18028155ec58a7de0599020e20e10208800402290ae90635119b930c45b8aa450effe49187e49befba6095a700254038b0e3e0c56445247c3d5261c40f3972e74b14306987919bb0c329885852f4242c389d957181c2030aa88744280007558b3f01c0165b918208000002ee00b08042801848d418fc0deac0911237470ad8a0e212ae91635db1430c745edd91218677a976681e0909d1e8fe013e0e08b7165513600800758c65cda00eb194f7142872010ac0a000041c403c260201300e0980682e430ec068822b9101be5bdede5d5860c80cfe2704e82041577f65a38c082448e6bd6513100fca114079d8020036a2247b09c08046eaff76e3201a012a34bb4084d5c0c1681800008b08003599d34fd7ba1b60c4eb56e50150aaf62c53ef02c871040c70850840020010179d5bc2a49163ce2fbf1b2772045f6e9bf1e750cb771c5d0fed0c2fa9ef31e50b0fcbb7bf440a000b1f8645065fa4f21802800001d87fa100007e94164000055481a3cce0848010a19871ba5cf49628000029040285b5fb9cc75e506a7755bb6e0b080223606c6080800007af702806071b611904000000148201e4021380a00006f8c8a52b230c1e8ca10466e8ab844122505de5c19b51c40000045948048455bbc65d640304177a3f99a40400d2655dc8c0080d66b69110747cbc0490af8e1056048000203201e1b00e0980682e040f5111595890cc820b3e46203b85d19a76060c000015f902015c106c59d0400c820f5ada040100b5b8ff00a2be00f0a0402da8c1483dc60980400003b24001e748004b690020170ccf773748af918a6684ad549ec91fe0e4308aed56da968e03e1b0b90c1884a1957505018dcf816ed6269dcead904b9baea18d04402570280fd6d2fa93155c8ab7ffd3ceae8300a25dbac9f2a61bbbcdcfc7aa392d079914013409ccb8150c3a5eaff14c588a086f883a0f8fdcc59d491b96650ccd4313bfde8314e21b6af080634e343caca49002f881268af9a30b5bbadb480766ad5d2db97c0592c3b501b6c7097a27207645fb62a6e000002808c0bc2bc398cd2e9eebebcd49eacd08011dc9b2e8a072d5a41f29cde553fd58450010b6caf15bc8b3ca3608c753610af447bb1301a758d6b856465e744870e48b7ad7406fdf89247a0b5228238e9b2833fdbfd79faaf8b587484e40e749a406088424e91228777e877735511dee3869cde9270f1b15165393c3653395636435ea00a22ff504cc7f928358d29aeb356d097f3c63ab8a5de118e8774327f5100a06b5e227dc1c20cd7a2bccd08af8a89036f9358a65f8d6e74d43d4e402294eb4e5f026934012352e258212600b75dbab81d43ecb0e077dedeb2819103375ff044f0bd858ad9bf39fb65abc9d7cd710df0154031ce030450e98742fa881f0bb49f90c214e7bd2618390aca47610015994b6800010c899233020f80438e54033c0dd1230bb1cb58d430cb6d3715eb0e18a0618a3de6000001b747016043df9c447c3001abaa9ee3b4704260140000c19c309d277eb050c1c44a2725057d050e8a1820e1fc678020af9d30bf0800716790bc10083d20be959c20840200002be4030360161300a05d1410870c4f08101212e1152413eebb1be628209082b1207002be25dda8a000f4eb5ca0400de3828b4001c11f5b221542818230080000d2100063b20015d04003d388009da1a2c134118f094c81431725d25f815e8282b78ca40609d30404000011d965a00800031856fcd1c50c0000000e431f80100088690c845ac551271038c1981e20882699458f440c0cd7cfbcbc910000002ebc10214534ad0351c4000000bb8040601ceb1eeda60027008411d8878af5af10304ac2c6ff02488000001d35810218bf61ff4ce388000001d4c0120000006dd1c040018b1faf85751c00a805000033c764814df4190000002a241040e38a40638630620228060100401a0001a24024260101300705d8206fcecb6f635f2979a4c0e6c7600000000001388c30c20e10c10a10c008010d2260fbaaca99e8ee56742c4c07341966edd0479f6667146611e8000ea1000626200c320050100200800c0400110e40088400202000010017b01)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase16" = "QuadFullFourCase16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase16 private def zz2200:"s0898"="s0898":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l15 l16 l17 l21 l22 l25 l27 l29 l30 l31 l33 l35 l37 l45 l5 l51 l57 l58 l6 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x69017147, -0x59682c120, -0x43484d85e,0x33c0fdee4], ![-0x59682c120, -0x22601d6fab,0xf535560cc, -0x57fa9d142], ![-0x43484d85e,0xf535560cc, -0x297f25eff7,0x89674e120], ![0x33c0fdee4, -0x57fa9d142,0x89674e120, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x185faad0,l6),(-0x7805aa77,l5),(0x1f07b752c,l8),(0x56cb3e24,l11),(-0x9034c286,l10),(0x6d1e56e6a,l13),(0x14f6db430,l12),(-0x4aad96a0,l17),(-0x5014e6b1,l16),(0x1e244b732,l15),(0x7698090e,l21),(0x7e3c3e73,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x1aba32e6c,l25),(0x855e1724,l31),(-0x898c41ec,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x5f4dd622,l45),(0x2cb417800,l51),(-0x1cfb5a47c,l57),(0x3cadd8c4,l58),(-0xc68c3569,l63),(0x1291f1c0c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x6d1e56e6a,l13),(-0x1cfb5a47c,l57),(-0x1aba32e6c,l25),(-0xc68c3569,l63),(0x1291f1c0c,l64),(0x1f07b752c,l8),(0x855e1724,l31),(0x7698090e,l21),(-0x9034c286,l10),(-0x898c41ec,l30),(0x56cb3e24,l11),(0x1e244b732,l15),(0x14f6db430,l12),(-0x4aad96a0,l17),(0x7e3c3e73,l22),(-0x7805aa77,l5),(-0x5f4dd622,l45),(-0x5014e6b1,l16),(0x3cadd8c4,l58),(-0x185faad0,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x28190020000000000a40e20080000000190981660100000003288c04cc030000003088202618080001904606007b40100000000a44206c60180000000000340c8010000000161c181a0020000042865024c30140005208c14804680200000000015402c80300000aa230b005a00600029c460a402340100005088c1480468020000051118580250030000000230b0049806000000460a402130100005088c1600468020000b715022026100400000005d0900e18060002fc5408809840100000310c83203880180000000320d018c0200000cc320c80e20060000000541c009300c0000000001880e401000000000013018802000000422a2205a00400000000001d0320040000000001d00a401000005215824055003000000000004819002000000711440483010000000000ba01440180000000002f01880200000000005a071004000000008424063008000000000ce01640180000000019002c8030000000120500e98060768618108046d401800000000000e064008000000188a40d8c030000000000078190020000000822100c300c00000010442058601800000094110208c040000000000420590040000000003d00a200c0000000000f80c40100000000001d0388020000000310880618060000000621102c300c0002684209006480200004d08c1200c9004028814208800c6a00c0029828826012d40140002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x6c0290040724618208046d4018000000000be01640180000000017002c803033428c0840236a00c000184440880ab4010000000000026064008000000000b404c80300000621908806a0060000000000a40b20080002c06614815080200003c0841400f10040000781083404e20080000002105003c3010000668cc0901388020019918c08804b10050001823302404e20080003ac830c403640100000208e41404880180000021110503d002000000423a0a07200400001047222024400c0000000108e81e6010000831dc42032100400000001305816980600000000078303300400000a10da013860280000002e824028c0300000000005a0590040002f4560640bc4010000000000ba016401800000002f05018c02002f22981480b6200a003886088700564014000588ac0c8178802000000002d07038c0200000000000181900200000000005c062008000000000ca0144018000c71903202610040000000650d00e18060000000000cc062008000678c8190130802001041c2284024100500000000006207100400000000e8140630080000001d01201460180148242384027100500000000005a03100400001c8842901c400c00000001d0a80c6010000000001d002c80300000ec421480e20060000000000140620080000010230809860200000001c8c40d8c03000000000008819002000000003c280630080000000000780c4010000000001540288030000000005428198020000000000ac0620080000000150480a601000c41421840241005,0x348ae034180800000006e2d014300c000000a22080d86020000000198a4050c030000032c528124180a00000638a10248301400000a1102049860280000001b8a40d0c030000000331481a18060000005511406c30100002606a0e819080200095084088032500500000026120a07a0040000000028180f3008000000007838146010000039148680fd0030000000550d80998060020c2303202734014000000000b06066008000000130a0c0d001000000004e0a03180400000098241405400800000000050606600800000002507038c02000000000543819802000014c441c00a400c0000000150680a601000000002e1302cc0200000622a1300da0060000000ba23013300c00718a6084022a80280000000d858024c030000001b0520109808000002082b0306301400911031c401e2802801021d430803c50050000001884c02d180800000000b8340630080003504c0880be8020000000000e0c0cc01000000000341819802071c61820804ed401800000015412014601800000002b05018c0200000000520e07180400000000000b03200400000017434038601800000003211018c0200000001b0500e980600000000048503300400618a408402f28028000027208c0124c0500000000004a0590040000000004d00b200c0000130046009260280000002602c04cc03000000004a0e0598040000009505804930100000000001680e4010000560cc13012d00400000000019806900600000000019027200c000000000036064008000000208e4088c03,0x2463846080cda00a0002cc851d40c9401000b31011c201a48028000002043201fcc040000000410d00a980600000e8460c02f400c0004c90e09004c80200000003b94402cc03002aa41c7381eda00a000000cd2e80293010000000144920286018010418628c07490050001163b86c0132008004447087802924014008c8eb0d8012480280008b1dc36016500400000883a0d805a006070460434801aa4018000440e21b005280200000000220f014c020000003986200c98080000000661100e300c00000000d8481c60100000002583809cc0300000484808069180a00001348a0a014400c0000001248204c60180000027220501d00200000004d2280b1806000012c860a014400c0000259041402c8018000049208380d10030000000004c181980200000a092100d230140000000098501c6010000000001d40288030000000742880598060000000ea1a01c300c0000000001d80c40100000000392901cc0200000000007207100400001588239036400c00a61041c805768028000a618c47022d004002984047080c9200a0050c808e1019b401400001912d601246028018625229c0a5d00500000000645c039804000000000014072008000001885880526020000002849101b0c040001022e06c044a008000298620c406b40100000000ec28022601800c514a13003490050000005492e01318080000000a649016300c0000001449206860180000000000540c801030a28a19e042da00c0000006d16c06830100000000d456028601800cf1421a00d21005,0x3032c22430297100600000002204807180600000000443c0530080000000941201660180000000000f0148020000002402200b18080000094260900b400c0000000003c0124018000760941d03310040000000000500690060000000000f00d200c0000000003601a40180000000004c0348030000000000880b90060000000000b00d200c0000000000c80c4010000000d42701b0c040000000000320710040000000003500a200c0000000b04e026601800000001611014c0200000000016004900600000000036009200c000000d40880286020000001a8210058c0400000003604806180600000000642407300800000d0082004c60280000001a044038c030000000320580e180600000000002406200800000000d0480c601000002b0883406d0030014c104188123200a00000538810248301400530910da0194802800054134370129004001301b01280d9200a00000ac4c1c01d400c000290921b004a802000a60c210403490050000054240c80aa006000164480c8095401000560930c2031480280005c1243103290040014c19c238069200a00000000005805200800000000e8d00a60100000001e8dc098c030000072370501a200600000000746c0a3008000000e232810c60200000001e0d404cc030000000190880798060000000074680b30080000000000c81240100000001c8cc088c03000000003a320518052c872411701f57401c00960e11820324802801351ce31c0f6d005], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0x595319e98198e249ea15b96184a3653facd2c911ba3ce5a60e01370e95c900c150c33d2cc1046010e3243e391cd9858984dccbe34a68c225c4e6144e6697ff8c20ab49af029a0d98fb39d7280032415ef23000a4527d2a8002300809e00f0c6687ff63e0c2d0b4fe3e883490f9195d168d1473682229e3031256e9fff0d0547d61adaf3c0000005dc00d02308515b09220109804000036a4000df886702f0a3a8c2e24ab28938369c4aa33484eafdce15b2c8f53adc2dcb288234864c4612861c150f2ae33443752fb6ef01c04e535dae82419d020500380001ce2030230190981284ec99f71a0a48543084257449f6bd307aeab8801e33287a34c08627f82474b84c0229a82858e87c103ff824530f52facb0418066a985744084404db1040580580001fa20c6430611de90079a50a6582c8a3c51fab53162880cba603d0b0e739ec8d7906843af82d90553023ea6b96a7e14131ca70fa5fc1007ba0844ad80007231be823e451b523052038c282ed38b585631a42188d2f883ec2c8a44bd68f02c851052a1e0b67460c0892bf6ea0a7f0411467568ed6481c02ed27ec9383000ac10545ed37870f0e305e06800020420302b0190981284ec980f3b1ad1e0c202af9f0a6d13075fe82048f7ca1d2bf593767c24727f15c30430a1510cb9b67900412fd0e7c9148600b6fa4d9bf840404c88282a0200000f59000673342d2b8a4876392288eb0ebb5080e04b589ed014a8916b0f62830056712e327d48ad7a20ef31140084170e1cc1bddc2ed67b18600b5fcb85c74782bc2abfe5940bda1b2d95c72df79b16c528806a6b6a673ba0b625af2e680338ca04404c2c33d2de3c54352165525e45e2982c8700000dcce144bde5bb99af89f4b2551922353583cacc057aebb4d5c1843810c3bc776896d41f612305342ef1e11f0f9b770d90870429018c6484f5944f09938804e52c0d406a6dc62343970401d9f1a8c095ef4c56ee588a88013a25fcdd650b19be2e409d1f8ce89b37b9cd14c3200006ac68869ea99e525d368293901a05c7a234ab2b39a643070ecf92726c8bb1f030a18a57989ca6ba3d349c0805eef6f9a94f802c85a0a04cc1b27de8405a7a1000daa230d51759b42f12492bcc502fd64ccca52e1f7afaca708c1200002ca31d63e337b26a09f065fc758f8cdeb11b8cfbc7c13c94dfdea722a253c8069082b45724a4df473ee64c56a6a05c668c14469a1198818e10a1081040a0a0012faa6a2402be5d46c379f35d1eaf47f2ebfa8050d108588e66e3237cab0521e5ffd56d68eb0d905d19ccb0e75f2a11d692106b84627d19da53ab7c730b5252c992b496c42877913573fb5c993a48609229e6f17d400124cd05a18433cd228476d5246bb9396af6f280f36912f3b461f94de0000000000000000) <<< 16000) + 0x008b280110c08808608c00a0080280200f979e3eaec66745dd53e6a98df216ed3d38658ae386aacdb203489740009c489d94c4e8742723b1381909b84c4d81426a02e17db90d6dbc70c13585709a3a20a10288fd433421000dc8dd9ab2d0e01e9838af46b0a003cd7e77fc30225beeaeb5ca0a1f031f103205667dc88ad11c23121601404380544135615097107196781298f80409f410dcc3401c41671bb8b371418035a94281850c029a2678fa20475da15667d1c14d6e4360e2020fef027ee893c40c1480e38c2086861fe06488672cdf7b42240946bedd920742042e9a39eff4a3823ffe28278e818006e8a82f7bc08055066bc845408f3d5b1f314494438c1601400007a082508c1c8072267901aaa76c04098e2787c08dd0e22342a2378a901827297c980e838e0094c4128738e10128722d2f2df8219784de5cd99013cba168f8c9450d880b80d1221e7b812a900204407e772a8a028600af9c411e440c195574f4c3841218aed1369e0c103990a2df6e180455986cd3b800302ea1ce7e40a00e853c8fa240d88202b02000010d100042920010e844d0a74435544d0b7b12a81438042bcc83594fd9028e8c5b096d911312251990a4aec7c58921b76c4b46620560101c206f879a26ce50e01debaa11c97de50600bf10aef21fc1dabe848080c3805461493f480243307997ebf4ad9830651151934b183bea447ca58458822745a1800f542df9106000a341310e70025008615533a82b586125320530b658d81568966038b05c412a166063bb15c83e286708fdd2f0584f1666f5713801200400005c4d8db55fc41b2ad1429562b9db8a86208807bafac908101844074ed714c584fee40ea5ebf101000071a3a2802041c7e4be8400940a7dd72a16ca260001152c18e405f09002e02c098008000924d967e11edecb696df5d77d95b8c15cb5fdcc93b62f9966431500000000000000000088251050e508488182380100df2857d5c206801a00035c4001cc489984c4c81743824c61641a0a09124d00874b1d16408c5f4e735aef12432835e35d3421101827d77a155f90504141eaeab21f23803bed3dfb7ef20c0199c8d86bdc328573102062070e300bb52941c696924db6d143489792f358e18417fcfc9fc4d1c424aa8a6660e042ca59451c010c97bfb0ce004a010d2caee0fd6aa6943093bd3cf3488ec1cedc5983a0f2409c5891406bdbbd9668873d20790510308ff20cb1ce004a010000178385138844f7eb0c245e179f893e60f457b3dd6392c6654a81943a10203fbc3696f0c0d522964e90048600017ec8e00c121c14120ee1a0003a5a2030289002901809880800085cf180bdaf1b6b34b42cd55f681a44d91c079ecc20af457595068e1de5373a730704de1dacf8e0087c0494627002500869621dd31eda34a1f5fab1779a4487ea3b254c1cf9981d60c48a0425a3acd344449622d9b0818435063d82700250080000bc1c286bae9812bf30777b2e3200d4c18a0879a31542c6b5b70e70daca16d6ba82cc3b2041805ee554e0c0c52b1d70e1d2430000ef3d8c0d0002478541e0c9200540381310100011090005473a584f0f1a2c8c28e2cf1c81e60f45b5ce1fd2c72507d5db398303ec9600e0b182e02d57b8300228e820d70c00011a9b4050004a010c2a3b735ccae6122572a2b643076536e8e481632cd884e420714407805a1628633da338c0202069ebb0dc4e004a010000178364c5236be07c950b19ce6e791c95ea50a8d10bf899a36202000087b1b5680810bc0995220088a0408ddee70ebd0382115f4b4c19db041071348f1bab218000295ee5d20838b92006206813001000133112f010002e9100108c202a130012d9323b98c77dc76fe10295a6e4938b1d901d589ad8b2dbe8e15db3cde8bca80808b91d61879b20c021da7195dfac0400d34920e0928006d53b8d4364f681c20c00d1648d840514c4a20082a2775c50e53cb0706d28596dd8cfb99221a56d8c4582040113d42b020020994723c080027f4c017d0004a010a1eaa4c26aea48a22a9d437e2848d0f916cf12205f4de011060c16de6817618657ac5258c2804eadefc788200000002b9a800250080000d4991ab1e29b39548810c4032bb384490f486eba5221080c0645d943880508332112b53fc20a66f58e35b909053569fffae5060400035d43f80600020d2b21b02d12005804812e0100011a90005bd225a0a12c058958284a80400106044a4242500a1270109300800958c8929ac490c62465b1222d89096c480a623e5311e2988e90c128870301d8e803a4077f7bf6490a18a6108166102061d40fc04810440108184cd43acb2039e539e20c50cc9444e4b0812504afcf0b005253eab504008f56a6e026082200800009c9a1c5b6b72a9bab3cd5ee20385544480a52b043f816c8102295d28ee9eba6c9cbfd14010e186c9ddb6e0f935c4600441dd9489d8634869581007f7da4a8f0ddd16a809072473bd76520eb23d9c05f715405e19dfaa257887727690681b062685a0000c0888e08c46c1613c03e30542e754258d05ffceb222c2753891b65b28f87090f3a23c7d47c6fcf3d1637d3e0085250d06102820cbc2b41c0c637648cb87e36d412bcaaab9c8041b735933d75e3b398b095c4fd6bdc58f4a9f90001707ff1d761f193dc4696f6260d3c8cf042d208e56109f4187d0f4cadfd11566ef927096f3d859d626ea6cf3180a2cf85646c2e2084a8e432ae8cd2e8ef61eb3597f227a5d4200000000004c7b4ba195e82260c3922856e590b76991a665548bff4a8974f9a000000)) <<< 16000) + 0x00000000000222a648485ad1ba1de3152082a638c3842845001801001496a718845a7696b39005dcf15719b541e22175a4605dc26b3cf9f67db453e53a61c8710bdd6d8e65e925136a7a9f161b4c8cefeaef3e07982a0fd75b0631d280e1fa611183e680024f90921188d06c0024a888c90c4607622e3b1161d88a8cc450642263311219849088444462202310f0908700acab17e01b70b189bded30d2c523ba62ee0a0c0d55056c0c3a59b7f0e840037e22d47260422008595e362689196302654c32c5060a7ccb83061d76d081804808440100000db21ca13b22330dac0f5bb4fe938246710f3ac4a33bcd3f5a27df47a15aa7cb8a88c530003c1ad4091013d8dd5dd120634e004db62698e09b3df9a2f772b6f62bcac0424ea0949a30142152f00d63a38e55f6b200c3d112cfa4908127b411379ffa06e77345a307e6ffaf2ec6c63c3b8e1e5bd5fed3074f0ed416324e980c2e0f2cbe5ab016fb310e314373c547f9eefa36561e289cbafdfff1c7faffddb4a7c4a82db03e8ab7f8449047fd574c691721c6c62c0ac4744780707f431022080b186e6b14a98f3cca822caaf10e3327b3d0cd1ab461a9495800069c3c52c48d1c8a28a6ca48e85c864cb79024abd6c08c61a40298301ff1ccf3a7e512129dae0474813991f1327ecc4012991935d1a26206b6481c96ce4c242f793409b93206025bb2de8863b97a70d0ca7897e79d1aba29661c81803141c4936f45569b64fff1b46a6f9e881f2e536357de6acac9e55fd42f9d6cb0fd93afa2a79f90429c8700008404434562182310b1188508c42446210231071188308c414361241a1040de981b539e9f1a42628b2f2668f93ff5f17a0001913f186480844010d3020530b7634814ed71eb8d1f9041a41b8c008802019c020000c0220613d213cb3c26f347c3266af907081074e4fb2c10066f6d142043c2829a83400188b24d8200024cbf1309c2088021c6a1521c2b038905b0ecfb850204a62c4091000292eba89c06eff9e55a0c01ab4bd2764c0846010e2480343b98388d3cfc3e84b200279b738442065e7047850029bbdc1a250422008000084900026120007c64370461b6230d91187c06c360261ae130c401e9159465ae79a3a45917ef2684da094c9e9a062c01d1020481844010d313aa098543480f44b4920d1e5b00d67e1c0083f98e94400114c784a0250c2200800008690d61186a88c34c461ee1b0d209e8f55bc71fa14389dbd666e5022211a6c408086ec0371e10207bb6024020a8c2c20d4acc18440100f60186700833407a628c814d5cd1e3d52d0d468687a8b8c32c30a4ccf6f0808b10e25d0a00e2d97214aa130c1080400004ec8660883d4040005f443d014000b344394b61c653e143839d174b16c2b3277c816a044352c606cf834170e005b2d2355100947080020204231011188006c3fc27e35121d82c1835059384d92321c82de58e12ba98c3fa2c820400100690187f00c338041fa03a0c8774bda6a05d271f061682d687ca3916706e1a4b737a4065682a3aa833a81a94c7080f7759a57fbef3dfd09f882b8d3678d054d6fc908af4a24e69b4c696189d94324c0177b562a15642ead44657ab501d9b2273ff4b8ed94cd053859f70ace516a5f52fc9025948502a27a45af034702fc806bbf3d64f9ea8b7aaaadc1cbe033df0a542b8aa1179c2533e4c3eafde749c078f5c3e6ab4e3d7f2f28073c2ae7a6b7659d4515599a5435cbc80985649e305c8839e8ee43701b8cc876c3afd314b32aa507a8048420872800065821f8220fb010003e510fa0502d8080025b8e88477b5ae89426ad2f8c3248241c2496e0c082db9543820236c250d202009e6a9ada8a01310110040388461f21b0e10987004c37c060b603e1497d06d4b2c5e3f7555f0608b6df9f941420c98b0b441048c35fb4810000c4c5e7d14026202200806c88c3e0361b0130d70986200fc60a3596b2cc1a209a9b2124620f4e4668f0c50090e921c30e32a0608205d54e288f45009880880201a6230f70d86904e03883dcd4c268fb9fe47c39020dd4e262c8b18811004033c061ec030ce0106680f47ee1870cb10213aa91daca01084df76c180b477fa8945509080840200001ca4330441ea0200023221e80a0003e62000b5e4001e34800eb61e3147c1e0df65df68014088bfc9dbf276b36c0e0ee2fddf1b7168d6e0a080cd9f52ffa47544140078b0322ec3cec80060128a99cd275144558201a853683100ae0a7a2a20000cd9bdd01b0492a041f9635a00013574713f40e2c1d11001f00005e64128660e4038040080238e692d122300ebd7a0788034a77d3c23081d00800004f980400802308045cf1b8070508f6bd2b04198b467e610000edc457a09020880200001ba400046886200e0280200800002230180100400001110f31d8790ec3c4761e03b0ef1d8770c83b4661d83380820992e930818a9c7ec1840440dbb85f8c151724ac8010407f8e74118000aa88a4040018805f5813821100430800a46104a0209166007c40caca812ba4048d28f12518283501f1f9608391a8310705a892702d3801080403ac040002e2416c27010134cdbea08184fc0f58608285f97d2c86802882a69c88005366c5158800384d4fff98008c02103d435232210464544508302087b15446003e0100000a121d4020e9010001111b1c0608098e14577d7d3fa8f0c2128c71f0c2196625e6410756be8034280068fed748600b4be264609c2088021210180d77506137e29885820f8f4466c0400e875dda48004001005b010740080003ec87384)) <<< 16000) + 0x8000a488730ac394561c82b0e3158710ac384361c01b0df0182d80f0c9cf520205068b1c2820b00945db20c0231020008403004011248099d50d84102c0ed0d522040aef9e3211841100428adb93f2249132d489dd1044b0c9649300caecb582c0c884b57ca820f002200802008000022200026240007ec80011c18040080220080200805b0100001b90de0506e82800027886e0cc36c561b42b0d91586c06c35c3618803821acdb60450037337520c241040008804008020000088c030040100000444358461aa1b0d40d86986c348172101856ef6020a3cfa7cbc92082100406880c3400619e030ce0106680f8fab8577e84804e9dd2a44012b2215e2101f7295a668a84838400100000de21981a0001f521960a0480506502c000eb880040990010dc2192530c80148a3556a6ac538f39e01576078ebd19a0a1993d010e88978eec057e7368082f18484c07ea4957bc7aa06cdaa35181e45c0a08a9c468217b7def9faab2451e8ede8401589ce0da2a92eed07d5278f4c16a42931ef42afadc8f491986fd6f5bb0a727029eb074dd2837a0f550f90d1235c20000cccfd0dfa5baad63c742b0a80ec2b0a242daa40cd3bc0213d42c13ba3ad3e39cd090b77eb837319d712671c5a0bb5ff9dc608eb9d82dae4e000626ad43e5a68d412ca03678d514930f012e0fad94cc4bb757504003a874ffd86dc1c56b1bc1f8a6787188200da1435ff426e31642d03665ac336b791a48e7114fd0c9e84eed423d563f5bc9510000be28f0e44617b21a34ab95a63c7c170595c481db60e0c73c7c3b941a5741cc11c3b5971cd0502b4815398404397347ea2a0058a07c01018e230c60d86286c31007655e5cd8589c1ef5a87980e1be8d89bc940d63e71bd0c0282e79ed0201e4f858522a20004c704001000014520005d44001d28861828002e14e347af1eaf602d95746697477b0f59acbf913d2ea100000000002626999dbf28502cc81c70c30c60410480020c04981e1a8e317f208175bcb8c9adee82b1ec9236d9bb444963b5813a041d6cfc3064a0eb609142cbe41870811b7d65b8413e99b36443012f22214da4809593c5004100475d950524c10460108108056b5182086a8f38011c223c7925484175fd2b298c04ace41bb4280192befb84b041080200004c880014590c21186086c3003617e1b0380d85f06c2f4341781b0bb0d85d04c2e424170130b7098080282d814000cd44009a38802ac19c36005b1e3663080b4a7cc410808000001f4008205b90df530e0000be52a38300924bd799f2a2280a036442600405a8482d0241660a0b2010588080007588033b910098a43420114d22b14a66b0710a497503cdbf77e3072062338d0a0eee10395d55ef9ed5484121178bb85f91cf88c708dd78d46c8c0f8a18419d6fbddfc72a21810fcc7b6597c3d20c02a2f175ec9e91e90e1b42490c3906005384c1082614a130150981f04ec513da8300a3883008f29c45119a9893019218347645cd18307c80dfee30204976d238304baeedf6e820c842057ec54a0408c0201440bb169c8348f1a27c65eb4661029fd2fafedbde97fa63181c4d86dfab6d129efae90d82890ca991cd5122cfa44990608637555098bcc5732a000c017d0ccfb86474f7305a40c042a16c25a0c77aef8f80890f88c0466188857162e4cb3324561630e289e1780003242160020380100028f908b218450ee8423e877d6060c6d160087103e81f6b5905086d94dc980823912b08d8704b729dcb2041212f664791527182200805782e84829d7a34c7100b05dc33183987ae26b840cfe0fe68014208b0138c820a584f1e7214019d4b48890549c70880200002e242b80415a0205b010001a7990c5b6ddf48142aabca3d5c30a6da1dd29241086e8f248305bc733cc21c006f23468860064bd366614052dd62631028102200805604c22826156130aa0985484c2a0260b603a10dc60062f5c5733ee340db6a2a16a73a7b24702ddd219dced6d42c699f3570e4a1835b4458703f6122ff721d1e30c1160db2feb68de7e84453d2563d06126bc23a6f040e890f9c31bf7da740c3aa9f07e5f9c4948ea0a5d3fab6effadc8b1d68807da1480c9c7d85a9bf96f280eb68f3256042418323eca310ab67974b1fd299f2e0361b6212cc2620d076bc94d4ba0e425e7761a54fa42e4ffdb51e3dd27f3a343090238805380c29806084030a50180a80c0f80762a62c0520238903a4d9940a22ed831f421860f910d7a21206110040290161460b07c0585102ec58949c0794911e557f1801c42023cc0805123fccb3e2180228587e41056518220080508080004a080013b10a00504f8280021a880055890152104f00e46bfef94012c38c56bdcb242454fd1f32412a8d64272016d09487f24027d919e9200ec7a3e0649c2080020032030250182d00ec84f7f0ae0f74d145ec524b58a2c49490a8a50c0b04c12f785d2b28028b8fb1cdb0900610799aa8020086ea884c348500ac788bee047e840215016008407a5954fa853cd1d10a90d3868d9a432ecc3440c7495768000003b3c4a5002100869610e33a879347799c2f7979a206ceb5618cd0aa1fc5a7b07800d0146b092c0000e7d6c500002e4cee7328e004a02800017b385838ceec8da102658f71848861810edea6c0e93c1c3d805e570082fd597d10e38b0876fb5fab247c8a1e0000004f07784ef49001c01d484fd40f9c99fdf48e00db4e4c347f8fc22ae9b009671403822404c0000a4c8002a31e20021fdcd8b225992d3f0d16323a2928506e8081e0cc020480f1a4a004f)) <<< 16000) + 0xf324508021ee900019c108002004203c265ec46914e1a443f529060ae3d79e88e0445c93cacc06bef0def8a04150f52ec205ab03f1a09c108002180085ba5ab180b7c00000001482450c60844c2c71c410a08608e04e03a8c79adbb947685f3fb413ce8371164aaf5ddbdb4e08c021d0001a92000636400128884e86800309080e8cc0705603613a63155fe76a4315bc705529df2e4b1401164161328abbb0fe9c430000000000000000000000000000000000000000000000000000003589829228e18619008e08608208e0200401a0321301805e00216e96ac602df000000005209143182113062452c31c31c0100040425af7476b41c0de5e7b09af25d170b9c93ef80b10f63883188d40006d484e04807c14036020130100024690762581a10eec6c9f4682f7c9ef6970563cadde44b16af457f6b274b46c327510000000000000000000000000000000000000000000000000000000d8250a5083041044823820830bcc5ab0eefb9ccd86ce69213965e64e579e6043e32f683a58df861044fe6cc2aff671a2137573f9f91fa177b6db804dff77d8faf49c35b0da80e708f636e83e84c26c261340b07c05d8a98a7652c3cb680cb0aac505fb599e8c893e712bb0f1ff58c8b0ca8da844d70184ac0bdbb69ce5172087a124269504f0393b9f3c50ddda3756fa1ec24a73bd20105247df99188da7a207350a59c05433f924616e49f8d16afb4b8cfd6fe9fa3b8382000007327811f60937993976c31aa87782703571ed4fb81f053a69efde110030099b8de4901dd2bf7ac5d9bfb02355659101062315dffbf5ea7b46293a9ba60802a412d959b748b9b793ca0cf35a82be44d32fd0a2ff96cda7e4b18a280c32493a56b944afcdd2edcdfb5b166d461c946bc0d350af23ff495373b19329d73361c10997afd985ddfa215d2eae7f71b43ed57ff233030d4371a378a31f06c00008072132120980503380825c040b602000ce630fab8282f2ae8214f498a57c17e6eb24b823b7d19651470b2fe920000000000000000000000000000000000000000000000000000006b34123e998c048e74dab570548b1050890480490080070020130100200d07d0184280c0900786cac8be2c8cee513cc365645ecbdee13f282457269c2324573ea736c724ccfff63ef04ebc854dc2caa31f579800000000000000000000000000000000000000000000000000019cffb9fb1c8812a112d142c1531c42831031011c00c08121448a919582dc826f02961e4cbca34104e8f44c5a05adf01ca2249f2a3cfefdf705393bc20bca0e76fedafb11a9a2fc333a323f67aa8f47d10c5166b4616dab2e5b1353f4948d768083cbd87b2a2336e0c0aac9bd07f01d8830f2935e0a21a3d2ab9058300f079a98a08064af0642000b561f4a04001d2f99f24c0844010b25d08ec094c83b8f4fa16db5feae85dfea14866119c1cb6c396480000000000000000000000000000000000000000000000000000006c134620514414218138034018030080200d000240200072474909c317d78c20109a34c61c40f467aa10a0e06fcd1971410741d941c9003ebd364a1c01b7a8703e7002200804080c1fc0784835139200da8287038555c5a54248c34c3a40f60b4e1434198c4fce0182c644cf08b6450c215119fed771878014ebb18400100001c345073fe04e208002f03c50e0636ec9322461a5d0c831182ccd3735294a0c13623c41e70461e0c06700c20c49dca92120810959d818e00877bea5d74800250140000d619186229fe82dd02053780bd64f998b113f36848983a1827cbe73a03e304083eee7fe522e181756d279fce482044223824d33938010890325d0e4d0296a061488572f409042e03800011c90006212000f924258340022a84254660ec330341584a0ac24c260b603c1be0cea510826922ee7c082694fd8c430288527d04a02b8709a990025e0a3b218048326f5e37081f00400c80c094060b403e20def365649184ec7d8c04105cd722b080c685239a8306988632e480315e83e466002000801100c08407640715f674c5172fc33ff8684b8a1c4781820570a870c80042010b202241684030c4fc14f62342b32d958d940814a834a4d013109ce29280108040000408e00216e96ac602df000000005209143182112871c71862c51043813c038030080200d0001132000640424837c424c2ac3b10068496dc691021000400880604203814bd34543cb203f13bc20c14c0dc81a2810000db4c48083e010b2015085b5c618baeb4510d09482b5e9ca0469d2a398d030bf4e5549410800200001fe6870d48d1b541c776e8621561863bd1b3fef104ce57a775e28219d15eb283012f0432344380b68cb4848300061f31ecc06745b5532a808240100000e590003d02000920400253880e8cc244460382301b09f10142a0c861230105d815240a08e6967612180cf84b42187d1548ab810080f3586104c0844010c38961c05b08080ce61e5d20108fa00fecb00a9aae93724042200800006c9a241dbfc1329eea40a0dd4bdc7ae1c1451ddcc4fcfdb28820aec08019feb88082afb75bbb610105603e9ce57f4f30031e2bebc7bb814002acda0c81bc40abee225878959c46020c40f00004964064361200b01805e8ee6269f4e20c3fed131f0710582acf872091bc1942f8411edc81e1d810374b28a220133e94528f00438229936103e4e4d3d08bf5c16461047000a9bbe625a45d91f82420e6e7366b4c8571d68c7669e733de439e98513c301a384ca06ff42c28a40de14861608205e97792c2010503416)) <<< 16000) + 0xde3411008553c696db060043b0fe9d601400000036ee80881babf52e7f05e98136a374b38a1501000007fc800272101f0504780804c0400141c423864002b16400a9bcdce1fefeb2846b022f6a00553c8ea426b715c508da458be8f3bdcc31ede77e712e04b3f847b88000000000000000000000000000000000000000000000000000006a695c2c000c702cca18a084087042046018ddaa405755d205f1e8b7ae49565a2555101ef92fc05a263152ed1c1740fabd40d73ba3b2e4ef1c3438dad8b52a3d00056853d99b4a0dc668cc31ec9af09ed08b1dac720b675461126422e7531de2ac16c44528c2c0aa1f570505e55d0429e9314af82fcdd64970476fa32ca28e165fd24000000000000000000000000000000000000000000000000000000d729001b4ae160006381685864041842802013059fcbce2dc4dd5090eda01eb112a42ae1290ed95328610ff2a3e54c71ea4ece7a64fcbd373bfd1bc46a8099b47bfbeed6b4daf66b5d44795a6ba8c7f1d90dbf5b680eea7e9c9c2849621d647052be2f20c112eba90fb2438c8dfca6840cdd1e43302c1a3f159bcc500021951b7260422008592e847604a641dc7a7d0b6daff5742eff50a43308ce0e5b61cb240000000000000000000000000000000000000000000000000000003609659639820c21218819801601804010068001201000392211a120008bf21182b08b1584508c224461100b0870584300ec5a6ede310628df6306c2deb5c2a2e5ac50c42ec6b4a0577c8a0c8fb2eda7177a024095d5fa6a3b745038185e2b821447ba8301307101bc11789009baff7435d1194e5e7b27103706003e80c2140610803d1c594f8361cd48db6cd9dc762b8b040a63302cf92d31d44d487d63213393040a07930e571cd6687ba23d181740e04bbb3b88639376886c5d862102a4502636784436a3ba0fc0b11495a4a60807360eb4dea1aa796787d30258aa2cbaf459654ee190e20d3ae4afcd71919432d6f985904173023689c0204061000307f01c5115e7dcb8404cfc61bef242808a19ea281147dbd5d2410ce4106e2c007bab8092805708a3e49c0080021010eb3fa912584003331b3282200017dd92100ebe0adc904b4e5ab4880114c6fe3e980084020000260604031dfd1008092b1006a69210d678407c802352e260a1808033e2c8c58010f47354120022deb84e2800b6718fa500044010809b4bcd898143066c6b3b0a10565ae9c4208550e26dc8034ea3dfac400ffc3574bcc004201000013020005ba78a36f0de364e18ed7c63083826b09fe640704000b27b7380e23588b24a0005b44f2104003d4dafd49c10880201060a00017a3e397c0b6bf22cb1c00000c350078738d2df167340200001865501e134285b665348001f11ce12b2200151469dec2c87002902079f7ed491a4f850b3c31189b176da906a01000002bf07d990f08f2fe06846761668400000afef00600410a972cafaacbd1e015eabf253211500000089c1ccb0ae1e06ac001a82400008e4f147b923efb0e1818e99e569c115a5a51983c100002325078002f98dfa0e039ba790d2140000002ee09c008c0201060200017f21040a00059d20019cc648077c2140a68d1c6cbfd7306c34560930782078814ae56d681c41012598bd7f514703db1b27b01a18060076c645185028a63dc0cf4fa1000540580810184000c1fc0702070d38fb1e627a198b202d442717909b0734710c16ee853ce0c04c840fc2227f0da7bbc428a0429d72d8a2fcdc558804f3c28679986162a4605105d936ab9331ca8a001eac32cffa652913254baa6d00080108f1ddda429a698d1c08c12eeb5871c0d17d1328040d6c4c77edf0a041b3a483e6c6051073a900c4f022ead0188b8b00203a8b671f22000a008000038e7867ba26fda9c16bcca55b4309a4ccc68038213b9e796380ead7d09d9400280b1c7830068400cf84e084201000015e3a296fb18bb5112280000271000821cc82761640a1126cbe3ce51a0f956e9f7941a0573e0181ec000009c220472447f4fdf503041401000006cc8003e5101f11000509907e0d000d9a9044218210ac0f827a2c500c571480ccb82766e20671f1d6aa0c3312100230e08586cdf80504034febca38060fa6af614010900d08940210804304189ef326081821df6a6060487906fea282411d2fb4300e51d257a900093f971043012368ad9a4e084201000015e361a80ed4b57d800e18000013af1000e108881c736868061028814a747b80414316f76157ec1603f27c024e23604003e96c5adad50a7cd78ba7f2c50a07083003c000103107d0d83e02ec538f630a8882c3876183486c243000009e3401802eee53869008032dbdcc63004022c2cf4062402159ae4d761899aad8e0b630a1400e00006e080b8a81ec240f40a0790101c008001e2c8012df907801001a221007ed220ee4a0151900180bf4d753f90d213617659682c11fc1c67176cc13111806458e488388384382082580000aa0182001006d8e85dc886d491243aadfb88e21b446fdb51c30147cae9c38431db73acc1040d6908760000e11e903055009c808c0200002f441d8860683ba18f6152b5ac203baf1b539c860cc048be0681820d398a46ec604d6b2a376b04116c34244e070077f7326f90004b1aafd4c91540290504c02805b010000ee9915304f9e920e165593e7c618207b9f9c7c2842e2949eb050438d725da0601c8b8348745500262c2300803a808000598c08635a0eb58e20f5640c0ef818aff180623fa028288ae169d6df951441002f52fbfeeadebd6)) <<< 16000) + 0x5018016223207cbcb7b0c02039a4813f5ad21e9d08aa8093af65ce832e10610211d6e6e0f045350400393cbf7a45d761d143f51306344208400017a1074250398a8128560e403a183deb954240c97a08b871c206403c5c0410bf57f3008065082d5be400e290ba1e1400864083c204e20420100710d82b06c1c0360de1b0530df1403af19c5ca0c5837cbb812101ad6aade082862a8fdc03800dd34b00994108c0200a40304c0182880c1280786cac8be2c8cee513cc365645ecbdee13f282412bc72c5405791e79c55a0551ceba1c8ca40b33032830823011400807a10d3fba4ebafa679da311b17674820ea5e994bdedac7e4983872c0bab2886290e0614921d2800155191015b5b9801418824e624f24201e8bca922843491848cc20af4f8af4f1c08291b64255260c2300802602c1b817819e4dda50d1bf0e53bddd959e50295cb53e4030141849c89435dd9aa7f2972c8b456bac11d804d0c0416bbb8bc3e9974cdaca524bf6977f19d9d73ff00a030e472ff2c91fe2bd389c629eb668d8371200c0401e63fd449dbca8df28acf1e695bc9c11995ea422c3b3ec5f8700eec8c47a4cc718033b8d1c3411a2f789fb88a99c9ad9bbd3277c59a18b8f0e6c910d7188026a77becec2bcf567da2e0a29303c00005052000d1641201408e02000af720c64b06121e93237799f8a080dd00588e102e9cc762c1a1cbc17648208e6826125081f00803680c1b0060d20306b0182500e030a1c758c583a42a23d4904a38146a1003d8768d21c0a6b9314028057a2c11915498707c0200002626033dbd575b14172309d81c708bdefb81e10477058c7c3411473ca06224a204201006a0583482c1a017fa6ba9fc86909b0bb2cb41608fe0e338bb66098e730b690a667a8fb8db88155318aaff3b5218ade382a94ef97258a008b20b099455dd87f4e218000000000000000000000000000000000000000000000000000001acf5dea18d2a40b4031ce68ce851824e40db055480c30c80070136f93dcb9e1dba274ec2a421f50657b41e1f3514ea4c46948c558f1ecc0f425fae17c906713710db6ec354609513d752667de54907736462dd591b77243118ee19308eec26c88c7dddf3b8d34729ee6872e908208f8cd1f76e7d954acb31109b4e7483b20b9d0006a9200101a419c140cc0205b0100058c10651d58e0c5020d31c54a94be718a100dbe4ff4b04150dc0f038256691d5f10105cceb589002c8ab79ec703a0c10c1205018420100640d83186c188360c21b0600d82f86c178340ba1b05c0d82d80f490966215e1c20d58db83240d3dbe8470230c2000848a0e201a2c5040cc2b4b1800d1e24cc040c3cb69c048083e010a1c00e8dc66815c3cd2f2c0d46ff23c6003a010a1f253e3800043a89ea9000d80200001b8800092905a0500011210591182c06c15c360ac1b0550d82a06807c360a61be2806023a6f90180443387224201bcfafe01053c91310b8a0411907cf8860868353af4498208c0200a40304d0182600c144060a00204a01caf1cb15015e479e715681539cc2da42999ea3ee36e2055420b2ec03481ec64ab1c41501ac9907021c2e19ac16d0550a0490440430480136e397d309cfdf7f53f2e6e6c9e7b3f5bdcf31a28b4b32b59b0079dc38c3e91de134a4c4c393fb16df60518b125682780a099aac8ec3f9b92b5c8e0e97b1814b83fafd4cdf1fe11e8d1c81070098c8080ee49cfb7c577c689c8919d96aa619d7b3ad3325eb76c280127a9c1ecbe9784d9c439c281aecf83397404b48cc22f35371408022ddeb916ba9cba839b2afbf3c75d204eb9f3e6b41ff39d65c282560ea0f8d7ac3806380af047f2d0d7f58763c7cd062c32dc812b10570dd7f3575ce11ee423be38e5ea6cdc80882162906330ab1430ffc0db84b088457437514206f6302b440a1deed2120c110ec223dd05651822008000089100062e200130c70604ac8f7da50a012844a3c9140140e0aa90181d59b617242086c808b4105ff08e28b9098308c02009c0b04d0582602c12c1740909341af7513060c83abca1a7cbdfeaad7ba38aff2b80314ce1838dc44d727cbf0762d40f245697f59ff77825cb7b2c144d1fd20303588aa0d21cb61f71ebfbac2bd6b5bd712d8e58c9cee6852e36373b4175f0f8c192879add389841c8f875cc32c4298c530c3e2cf5149887e67a17c4d38e505ae4c70e83007ccd4993704712010f009d0097b2a5999d5c9953f9b204e8e14e7aa38f35f0eee78cc86a92802c93a0ebb9a806928ed76db4c41e190cf802a011ee748690e2d8a9138437eaddb2798b043942d1ffdb95fa501392bb4cfe8ee933e2686690df56d16a9b2616535fa6c86e669d1ca0fea9cb8201118a6b16e0001168825008001f0c82484800262082402811c04002a564006360800daa1e730b690a667a8fb8db881578efb6866e44f5de3ecf9054880cb086083087004002004bb9a2ac17334c3f5e0f89f3db25ed64274e78c9f9a491f901c41b852b03873f455d491996ac833a60736c484b41c3114b704a0c09153cbb7c902f67b6b881811a7c01c36704210084893300e00f9819fe2f0124386051bf794881bce29eee8c808440100000db208c120450500013f10441582188c108360821b0400d01f86c0f837613b9ef73623040466713f8a1073a54e364023d4b830b8a087ae4d06c401297b0ae80e00f15bee1610054a8a07f2aa05040440109123d9b2acb303467b9d61040df14d6fe1082ac5fd3bb1490308802007a130180581e02e44b8a521974fcf727af43bd24303863c14a5e47e6)) <<< 16000) + 0x74e813cbf2103d32b215ccd6a98dd6f7f1f62c04098b029bbaa195f0ae7d5424054a3adfc9cc9be8940e80581c00749c15d1c3fb2fd9b97246080d79b8f210eec75f2723d4ee40b89ad5c5538d4fc7b5f5a654cbdff8d0ee52eec7185c0f00001cd903b09000274903a2101c8280e004000dc840dc0406c02000c50203e5a8f98511154cb1d6220ddddc2c46c6018e3cf9ba4547bc4014acf8000000000000000000483dbbb02430b02cc50019a11562ce124aaac1532441442821012001804e0c1abd9d70e363c3c1c62cd91478034675e571a436ca98d636a6fb58722dc6983524020cb6e844c24c6745431fc5589e1a20fc98336cc1a06a0b0340581982c0c806062030300181780c0b80605a03b18a665f75b1c301f4e27b430c78c0d06c20103d71ad1840784b0a09228037d66f95c8002c3126c6009c40880210080100471f1f20d4ca1a001e23abe188008c02100001004000011180200802000008880007c101e090000a5101d1581608c0ac460382302a0d80d84ec680a8224c382613d83699020f80200a406050030180181380e880dde6cd94209365d53e7858005051786e38010caf098c08046b19d0808aca284801000011a204c2a0160900a828050040260200026a2000ba6714006684558b38492aab0544a18910510a048047006001011582a5bf81d66a31ce099002fbbebacbc7d0609016dc1c554d5b494bdb14a2ed0008688289360543abf83739fe270203425504ddc2e170b92144818a16cc10f28c6c0454d9481b28304e958c6790f094bdceb834a581ccbbbc4b16d29feadf7d9c28059a70f691dc42cdec58b6089d5496b2e015b33fb903ae668a75dd237bb9e708590e867531de2ac16c44528c2c0a934ccedf94281662800cd08ab16709255560a99a41c21811610810a04da0a4b01e8480d825d1f2c7e680d0681f5c223373aabd037724d20c08f22fdc50019a11562ce124aaac1513482483842441c310208138024072080200d0000f02000684406026032030250181200e3ac7c66f64d413e0cbf8eb1f19bd623719f78f8278afcb5b3a9bdd904da4903e54cf9bbd9501a7f7db139ba0ab47c000000000000000001165200326999dbf28502cc50019a11562ce124aaac155389249180080c75c60840a5b499d4533128122f4364c06cbe2edfa7b06f989db7d140d140caefb22f7237bf26e7a27fc315eca66c94a5072764351603f1aada758c578c08d9b12fc46a1080a3e81592674a1e41038ed14e04dc28518044a708a0a27fb2fe0a0111b68eaeca084201000010420440b02101da5c8c7d10f02cc50019a11562ce124aaac1523893092492862452822810800c04008036e70ff7f5942358117b5002a5320d54f5c18b6cd5bb615445f3e7274444825cdb1c6026140c400000000000000000000000000000000000000000000000000003411c49249c29229409e01c0120060200401a000522408c340007bc7898bbf9be130944ee2da91809af4328c8c008002124db6ef2fa1429e03fbeb180fda86a028a0a4a821709403923b2f44a00400100000fd20440b02101f951a0a71ca694eb4bc59458e0966e72c3811c931deb200100040080074553d7d174458c103d1c900c187ae5dd8c6821f83fed0020803656f8c5804e9da30993021100400004dcc9314c01589edb378e14082e7204c471312281c1513adf57381042e6f3cf2ddd7384840b86b14630f3385085428a469a989f9408355149d4e64532800e65ded94a853abe84808083705400012810004a3203e220006ba203c1a001112203a4301c1580d84f48a4ed7a6b1c286d3b2b74508081c17302808e5880f99000840200340382263dba4542440a6644ee840c3c73b7c90c3e516d7678b044c9afeb1041026e421409009e0f27bd2704220080000b29c68f5e3d5ec05cbd94068dc3840a33929ad113929ad083e449038e406386384184104400b808010068000a290190d80c02e0700a575045e1d8d8c34d9dffb7498b9e87103b594e32ce246a6064b8dcd9ba3d43618202ccb64b979c208e00587d58f4b4835c2005e0ca6c0fde07c080903907928ef5ea450df6f0857f39b85ee8442050e4170000542405c5402c120150500a00804c04000e324007f288010a990121d0088880401400583e401b1e8803b3b9a1d532722dcbce8c110f01ec53c6f8610155c9ca3a250c0819a2bd009670a0c0e731775179880a386bd588ae20602788189c40c104002d21ab194aba8aa0216ff8343003471e97764cee5a161c5047ce612969c080c002e76b2d8c01c321fc4dc36564060c0000016e360010100970bce16068400041837d80be1411fa0e30640589277719e5c03e12382c7e3223ce2452baf346706440a001dbd85cc080004ac10baaf8e000076f26db018000da63b39168d1c30ac05124f916e7ff6b123805e16d5e09428005f2857c1229354b3d51f9028000002ee012007bdca891700003f79044530614004000061cc92514dd583dcc490a0f11f165b0411e83a14c71584886bb2de58bf0408ab1b3cc417038800000493e0028447cc95893ee3006b1e2f4fa300391020580400001ef201e1a00056c201c3b00d1580604e3e614445532c75888377770b11b180638f3e6e9151ef10052b3e000000000000000000120461861070860850860040115e93331fad74b9f29c9323ef705d2cf792ef903af6922f9cdf1272598fa758373a204fa33bdcf182e514e4550002e220162a00a0900056a10093500402801c1400c0a00501002008003648801968008540020200001008d4b1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFourCase17" = "QuadFullFourCase17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFourCase17 private def zz2201:"s0899"="s0899":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase18 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFourCase18 private def zz2202:"s089a"="s089a":=by decide+kernel end section namespace Green24Proof.QuadFullFourCase19 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ private def zz649:"s0289"="s0289":=by decide+kernel theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFourCase19 private def zz2203:"s089b"="s089b":=by decide+kernel end section namespace Green24Proof.FullFourRows open QuadraticCertificates ExpressionCertificates FullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decode [0x101e25faf8480018fb0c9e66203dceb94804eb3eec207a201eeb5ca8003a7929dae1fa25faf84804cc8b1e615a25faf848048c1abfe01a21389b48021d3eada2201eeb5ca8020beb19207d201eeb5ca04d29f8e1fd203dceb948004959bcfce1ed2779ae58009cf95a3e614d203dceb948012a5aee39a5203dceb948028bafcd0da1f9203dceb948073dd9bf21201eeb5ca8014fb96e9ce07c203dceb94800e849695ba1ec201eeb5ca8074f68fa24203dceb9480088a93caae078201eeb5ca8006e7abcd8e1e8217ebe18002c7c3f20201eeb5ca8003d48cc2d614] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decode [0x107e601eeb5ca8009edd1aa9e15e609c4da806092a4aa01e60bf5f0c027c8cab26601eeb5ca8003a2fbfd8e1ea603dceb94800a9d81a0c601a601eeb5ca17a985d22601eeb5ca800396fccbb6563d84c002163d84c0021ff22fd7c280038d97e49e1ef201eeb5ca800891c3bab601f203dceb948010f5af94fe722fd7c28003e0a2b98e07b205faf8a027dbaa3201eeb5ca801586f792ba07e203dceb948001e3e58baa1fe201eeb5ca8003c39f8df21ee203dceb94800185b6ecae15e2779ae58050fcccda14e201eeb5ca800193f6f1ae14] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decode [0x11fc301eeb5ca804cd6ca8a4303dceb94804cd6d9ce1f8303dceb9480018591efd20303dceb948042c987ae7e3d84c0023e3d84c0021ffa5faf848007a392c1f61efa03dceb948007b4e0928e06fa779ae5806fe7cf8201fa03dceb94800daec6aeb67a03dceb948028ef8ea0a23a01eeb5ca8015ccd3c08a07ea5faf84805180acc61fea03dceb94800f97b8ebf61eea1389b48006bbf0ee6a3bcdb2c001b0eef3b207aa17ebe1806ae8fab62a779ae58002949ed4fa763d84c002363d84c00214] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1573d84c002173d84c00203f303dceb94800dc2bcc7ca1cf35faf848039d7adbe733d84c00203b305faf8a027dbaa3301eeb5ca801c8b8eaa03e35faf848012b4abc21fe301eeb5ca805ad4ac9e14e301eeb5ca8035defbce6303dceb94800b9ec8b607a303dceb94800ab1d5f601a35faf848009cabea22303dceb94800fc203d303dceb948009a4be9c8617d32fd7c280109796fe1cd35faf848032ea8bbe5303dceb948007f781ea179303dceb948073dd9bf21303dceb94800fca14] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decode [0x17f3d84c0023f3d84c00203fb17ebe18053fcdfa21dfb779ae5803dd9888e05fb5faf84800ee6aaf27b7a898001b7ca3b3d84c00207eb01eeb5ca802cbbe4b21eeb01eeb5ca80018084e59a6b03dceb948001b9acfd9e2b01eeb5ca8013d49596773d84c002373d84c00217e70bf5f0c00691afda06e701eeb5ca8026e8858605e70ef3acd026dee4ea675faf848001d6b0c08203a703dceb948022f0f1ae06a717ebe180059ddde627779ae58011b8bcc614] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decode [0x105f03bcdb2c018afeada701ec2a00203e003dceb948002c5a3d6ae1fe0779ae5801c98e59a1ee03bcdb2c0768fec8202e02fd7c2801a8aa88e15e003dceb9480069bd0aae61ce003dceb948060a0eb8a05e001eeb5ca8071ec998e601ec2a00217d003dceb948001cc9e978616d017ebe18001a8a3a9ee1dd0779ae5807da583ae1cd001eeb5ca80038ec1feda501ec2a00203c003dceb948026d7b4ba1fc0779ae5801286d5ae15c0779ae5800cf2c38205c0779ae58004c1dbf64001eeb5ca8011f614] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1681ec2a00203d81389b4800992dca616d801eeb5ca800c90e7959602d803dceb948001cea4b38e1cd803dceb94800998baa89e581ec2a00203c803dceb9480019cbdd4ca1fc803dceb9480708cb58a1ec8779ae5804d92b49e15c8779ae56194d005c803dceb94807cba8eca481ec2a002741ec2a002641ec2a002541ec2a002441ec2a00207f003dceb94800981d3858617f017ebe1800184b2cc8a16f0779ae58002db96be921cf003dceb948005808f8dfa14] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decode [0x10581779ae58010a48396011de6d9a001f27c1ec2a0021fec3bcdb2c003938a16ec03dceb94801e9dc61dec1389b48019e66c1ec2a0025c1ec2a0024c1ec2a00207f803dceb94800983e5f99617f85faf84800593d6f4e602f8779ae58002d6dbbbc21cf803dceb94800aa5b2ca96781ec2a00203e803dceb94805a80a7de1fe803dceb948035f8f7d61ee85faf84802bbec49a15e803dceb948003b6c9a0d21ce801eeb5ca807fe8ded605e803dceb948001c6beae14] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decode [0x107e101eeb5ca8004a698c1f617e103dceb948005a1a0d3a216e1779ae5800495bc979202e103dceb94800a8686a4e61ce103dceb948003ab8d88f605e11de6d9a025abb2ea6101eeb5ca800fce07a101eeb5ca8002d5d3efc616a101eeb5ca800daba2f2be05a103dceb948005a6c2cad2211ec2a00203c102fdbc90058ab1aa17c101eeb5ca805cbfa58e02c15faf848001d1f795c61dc13bcdb2c018a4d4964103dceb94801eaa038103dceb948006a69bc0b61781779ae58010d29dfa168101eeb5ca80028bc689a61581779ae5807fb09af614] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decode [0x102a903dceb948006cab188b615a901eeb5ca8028bbbbe22903dceb94801e9207c901eeb5ca8001e4b2a39e16c903dceb94800fbc99acb602c9779ae58003a3a89fce1cc92fd7c28039fca6b605c92fd7c2803893c9b6491ec2a002178901eeb5ca8002b39afbaa158901eeb5ca800c91848dce058901eeb5ca8006bbdbf0de091ec2a00216f5779ae5800ebeeba4be15f503dceb948018e8e1d5d27503dceb948016a3aa8ab615b501eeb5ca800fb1cfaeaa355faf848006b2f193ea551ec2a002151ec2a00214] def rowsChunk10:List (ℚ × Label):=PackedPhaseRowsData.decode [0x108835faf84800382a4a0da088003dceb94800585bcadde7d1ec2a0023d1ec2a00217dd03dceb948001aed2c8b616dd03dceb948009caac84d202dd3bcdb2c003febaa1fe14dd01eeb5ca8016c78ae2c25d02b196c00381a9ae029d1de6d9a00296a281aa019d03dceb94801481b8b8ba1d1de6d9a001e0c8a5ca03e903dceb94806dd2bace17e903dceb948004a2adc9ea16e9779ae58002aa9d868e02e903dceb948001d2b9fcd21ce95faf848018c8b3f6693bcdb2c003e603a901eeb5ca80048bfdf59617a901eeb5ca8028bbbbe214] def rowsChunk11:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1089403e8a4020102010101010102089303dceb948013869ad60101010001020100089203dceb948016b3b097ae08911de6d9a010dfa8ca089009c4da80668ee6088c2fd7c28030c5aa088a01eeb5ca800edab3a6088f0102088803dceb948005fca7b38e088703dceb94800e85badef2088401eeb5ca8002aadf949a0b] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 ++ rowsChunk10 ++ rowsChunk11 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadFullFourCase0.base QuadFullFourCase0.hinges QuadFullFourCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel private def zz650:"s028a"="s028a":=by decide+kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase0.base QuadFullFourCase0.hinges QuadFullFourCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadFullFourCase1.base QuadFullFourCase1.hinges QuadFullFourCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase1.base QuadFullFourCase1.hinges QuadFullFourCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r58,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadFullFourCase2.base QuadFullFourCase2.hinges QuadFullFourCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel private def zz651:"s028b"="s028b":=by decide+kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase2.base QuadFullFourCase2.hinges QuadFullFourCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r67,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadFullFourCase3.base QuadFullFourCase3.hinges QuadFullFourCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase3.base QuadFullFourCase3.hinges QuadFullFourCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadFullFourCase4.base QuadFullFourCase4.hinges QuadFullFourCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel private def zz652:"s028c"="s028c":=by decide+kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase4.base QuadFullFourCase4.hinges QuadFullFourCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r80,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadFullFourCase5.base QuadFullFourCase5.hinges QuadFullFourCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase5.base QuadFullFourCase5.hinges QuadFullFourCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadFullFourCase6.base QuadFullFourCase6.hinges QuadFullFourCase6.normalizationDenominator theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel private def zz653:"s028d"="s028d":=by decide+kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase6.base QuadFullFourCase6.hinges QuadFullFourCase6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r30,RewriteAtoms.r32,RewriteAtoms.r77,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadFullFourCase7.base QuadFullFourCase7.hinges QuadFullFourCase7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase7.base QuadFullFourCase7.hinges QuadFullFourCase7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadFullFourCase8.base QuadFullFourCase8.hinges QuadFullFourCase8.normalizationDenominator theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel private def zz654:"s028e"="s028e":=by decide+kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase8.base QuadFullFourCase8.hinges QuadFullFourCase8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadFullFourCase9.base QuadFullFourCase9.hinges QuadFullFourCase9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase9.base QuadFullFourCase9.hinges QuadFullFourCase9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r59,RewriteAtoms.r16,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r4,RewriteAtoms.r63,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadFullFourCase10.base QuadFullFourCase10.hinges QuadFullFourCase10.normalizationDenominator theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel private def zz655:"s028f"="s028f":=by decide+kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase10.base QuadFullFourCase10.hinges QuadFullFourCase10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r20,RewriteAtoms.r81,RewriteAtoms.r16,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadFullFourCase11.base QuadFullFourCase11.hinges QuadFullFourCase11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase11.base QuadFullFourCase11.hinges QuadFullFourCase11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadFullFourCase12.base QuadFullFourCase12.hinges QuadFullFourCase12.normalizationDenominator theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel private def zz656:"s0290"="s0290":=by decide+kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase12.base QuadFullFourCase12.hinges QuadFullFourCase12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadFullFourCase13.base QuadFullFourCase13.hinges QuadFullFourCase13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase13.base QuadFullFourCase13.hinges QuadFullFourCase13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadFullFourCase14.base QuadFullFourCase14.hinges QuadFullFourCase14.normalizationDenominator theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel private def zz657:"s0291"="s0291":=by decide+kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase14.base QuadFullFourCase14.hinges QuadFullFourCase14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadFullFourCase15.base QuadFullFourCase15.hinges QuadFullFourCase15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase15.base QuadFullFourCase15.hinges QuadFullFourCase15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r68,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadFullFourCase16.base QuadFullFourCase16.hinges QuadFullFourCase16.normalizationDenominator theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel private def zz658:"s0292"="s0292":=by decide+kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase16.base QuadFullFourCase16.hinges QuadFullFourCase16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r80,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadFullFourCase17.base QuadFullFourCase17.hinges QuadFullFourCase17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase17.base QuadFullFourCase17.hinges QuadFullFourCase17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadFullFourCase18.base QuadFullFourCase18.hinges QuadFullFourCase18.normalizationDenominator theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel private def zz659:"s0293"="s0293":=by decide+kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase18.base QuadFullFourCase18.hinges QuadFullFourCase18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadFullFourCase19.base QuadFullFourCase19.hinges QuadFullFourCase19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadFullFourCase19.base QuadFullFourCase19.hinges QuadFullFourCase19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFourCase19.nonnegative x hx def pair20:Expression:=pairSlack (4) (1 / 0x186a0) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair20Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_20_base LocalFullFourPairs.compact_fullFour_pair_20_hinges theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel private def zz660:"s0294"="s0294":=by decide+kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalFullFourPairs.fullFour_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_20_base LocalFullFourPairs.compact_fullFour_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalFullFourPairs.fullFour_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=pairSlack (4) (1 / 0x186a0) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair21Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_21_base LocalFullFourPairs.compact_fullFour_pair_21_hinges theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalFullFourPairs.fullFour_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_21_base LocalFullFourPairs.compact_fullFour_pair_21_hinges x private def zz661:"s0295"="s0295":=by decide+kernel theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalFullFourPairs.fullFour_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=pairSlack (4) (1 / 0x186a0) rows 0 1 false def pair22Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r53] def pair22Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_22_base LocalFullFourPairs.compact_fullFour_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalFullFourPairs.fullFour_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_22_base LocalFullFourPairs.compact_fullFour_pair_22_hinges x theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalFullFourPairs.fullFour_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=pairSlack (4) (1 / 0x186a0) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53] def pair23Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_23_base LocalFullFourPairs.compact_fullFour_pair_23_hinges private def zz662:"s0296"="s0296":=by decide+kernel theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalFullFourPairs.fullFour_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_23_base LocalFullFourPairs.compact_fullFour_pair_23_hinges x theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalFullFourPairs.fullFour_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=pairSlack (4) (1 / 0x186a0) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r69] def pair24Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_24_base LocalFullFourPairs.compact_fullFour_pair_24_hinges theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel private def zz663:"s0297"="s0297":=by decide+kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalFullFourPairs.fullFour_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_24_base LocalFullFourPairs.compact_fullFour_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalFullFourPairs.fullFour_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=pairSlack (4) (1 / 0x186a0) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r28] def pair25Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_25_base LocalFullFourPairs.compact_fullFour_pair_25_hinges theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalFullFourPairs.fullFour_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_25_base LocalFullFourPairs.compact_fullFour_pair_25_hinges x private def zz664:"s0298"="s0298":=by decide+kernel theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalFullFourPairs.fullFour_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=pairSlack (4) (1 / 0x186a0) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r2] def pair26Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_26_base LocalFullFourPairs.compact_fullFour_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalFullFourPairs.fullFour_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_26_base LocalFullFourPairs.compact_fullFour_pair_26_hinges x theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalFullFourPairs.fullFour_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=pairSlack (4) (1 / 0x186a0) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r47,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2] def pair27Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_27_base LocalFullFourPairs.compact_fullFour_pair_27_hinges private def zz665:"s0299"="s0299":=by decide+kernel theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalFullFourPairs.fullFour_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_27_base LocalFullFourPairs.compact_fullFour_pair_27_hinges x theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalFullFourPairs.fullFour_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=pairSlack (4) (1 / 0x186a0) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_28_base LocalFullFourPairs.compact_fullFour_pair_28_hinges theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel private def zz666:"s029a"="s029a":=by decide+kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalFullFourPairs.fullFour_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_28_base LocalFullFourPairs.compact_fullFour_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalFullFourPairs.fullFour_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=pairSlack (4) (1 / 0x186a0) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_29_base LocalFullFourPairs.compact_fullFour_pair_29_hinges theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalFullFourPairs.fullFour_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_29_base LocalFullFourPairs.compact_fullFour_pair_29_hinges x private def zz667:"s029b"="s029b":=by decide+kernel theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalFullFourPairs.fullFour_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=pairSlack (4) (1 / 0x186a0) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r0,RewriteAtoms.r2] def pair30Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_30_base LocalFullFourPairs.compact_fullFour_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalFullFourPairs.fullFour_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_30_base LocalFullFourPairs.compact_fullFour_pair_30_hinges x theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalFullFourPairs.fullFour_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=pairSlack (4) (1 / 0x186a0) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r70,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r28] def pair31Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_31_base LocalFullFourPairs.compact_fullFour_pair_31_hinges private def zz668:"s029c"="s029c":=by decide+kernel theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalFullFourPairs.fullFour_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_31_base LocalFullFourPairs.compact_fullFour_pair_31_hinges x theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalFullFourPairs.fullFour_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=pairSlack (4) (1 / 0x186a0) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_32_base LocalFullFourPairs.compact_fullFour_pair_32_hinges theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel private def zz669:"s029d"="s029d":=by decide+kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalFullFourPairs.fullFour_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_32_base LocalFullFourPairs.compact_fullFour_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalFullFourPairs.fullFour_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=pairSlack (4) (1 / 0x186a0) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r70,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_33_base LocalFullFourPairs.compact_fullFour_pair_33_hinges theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalFullFourPairs.fullFour_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_33_base LocalFullFourPairs.compact_fullFour_pair_33_hinges x private def zz670:"s029e"="s029e":=by decide+kernel theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalFullFourPairs.fullFour_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=pairSlack (4) (1 / 0x186a0) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair34Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_34_base LocalFullFourPairs.compact_fullFour_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalFullFourPairs.fullFour_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_34_base LocalFullFourPairs.compact_fullFour_pair_34_hinges x theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalFullFourPairs.fullFour_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=pairSlack (4) (1 / 0x186a0) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair35Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_35_base LocalFullFourPairs.compact_fullFour_pair_35_hinges private def zz671:"s029f"="s029f":=by decide+kernel theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalFullFourPairs.fullFour_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_35_base LocalFullFourPairs.compact_fullFour_pair_35_hinges x theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalFullFourPairs.fullFour_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=pairSlack (4) (1 / 0x186a0) rows 2 3 false def pair36Rewrites:Rewrites:=[] def pair36Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_36_base LocalFullFourPairs.compact_fullFour_pair_36_hinges theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel private def zz672:"s02a0"="s02a0":=by decide+kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalFullFourPairs.fullFour_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_36_base LocalFullFourPairs.compact_fullFour_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalFullFourPairs.fullFour_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=pairSlack (4) (1 / 0x186a0) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r72,RewriteAtoms.r71,RewriteAtoms.r69] def pair37Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_37_base LocalFullFourPairs.compact_fullFour_pair_37_hinges theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalFullFourPairs.fullFour_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_37_base LocalFullFourPairs.compact_fullFour_pair_37_hinges x private def zz673:"s02a1"="s02a1":=by decide+kernel theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalFullFourPairs.fullFour_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=pairSlack (4) (1 / 0x186a0) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_38_base LocalFullFourPairs.compact_fullFour_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalFullFourPairs.fullFour_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_38_base LocalFullFourPairs.compact_fullFour_pair_38_hinges x theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalFullFourPairs.fullFour_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=pairSlack (4) (1 / 0x186a0) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalFullFourPairs.compact_fullFour_pair_39_base LocalFullFourPairs.compact_fullFour_pair_39_hinges private def zz674:"s02a2"="s02a2":=by decide+kernel theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalFullFourPairs.fullFour_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFourPairs.compact_fullFour_pair_39_base LocalFullFourPairs.compact_fullFour_pair_39_hinges x theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalFullFourPairs.fullFour_pair_39_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx private def zz675:"s02a3"="s02a3":=by decide+kernel theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack (4) (1 / 0x186a0) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.FullFourRows private def zz2204:"s089c"="s089c":=by decide+kernel end section namespace Green24Proof.FullFourCyclic open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseSymmetry FullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack FullFourRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullFourRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse FullFourRows.rows p q same x] exact FullFourRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack 4 (1 / 0x186a0) FullFourRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullFourRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap 4 (1 / 0x186a0) FullFourRows.rows p q same x] exact FullFourRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible FullFourRows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials FullFourRows.rows private def zz676:"s02a4"="s02a4":=by decide+kernel theorem remaining_rows_count:remainingRows.length = 13:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (1 / 0x61a8:ℝ) * mass g ^ 2 ≤ weightedAggregate 4 h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack FullFourRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack 4 (1 / 0x186a0) FullFourRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum,stripPotentials_sound 4 h4 h3 h5 g FullFourRows.rows rows_admissible] at hs norm_num at hs change (1 / 0x61a8:ℝ) * mass g ^ 2 ≤ weightedAggregate 4 h4 h3 g (stripPotentials FullFourRows.rows) + 4 * deficit g linarith end Green24Proof.FullFourCyclic private def zz2205:"s089d"="s089d":=by decide+kernel end section namespace Green24Proof.PhaseColourRows open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseAggregation PhaseMassRows theorem rowAggregate_colouredMassSquare_nonpos {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (v:Phase → ℚ) : rowAggregate S h4 h3 g (.massSquare true v) ≤ 0:=by let χ:=ZMod.castHom h3 (ZMod 3) let f (i:ZMod q):ℝ:=(v (ZMod.castHom h4 (ZMod 4) i):ℝ) * g i have hp (j k:ZMod q):rowValue S h4 h3 g (.massSquare true v) j k = colourVarianceRow χ f j k:=by simp only [rowValue,rowQuad,rowPair,if_true] rw [pairProduct_eval] simp only [expressionEval,List.map_nil,List.sum_nil,zero_add, pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] dsimp only [χ,f,colourVarianceRow,sameColour] by_cases h:ZMod.castHom h3 (ZMod 3) j = ZMod.castHom h3 (ZMod 3) k · simp only [h,decide_true,if_true] norm_num ring · simp only [h,decide_false,Bool.false_eq_true,if_false] norm_num ring unfold rowAggregate simp_rw [hp] exact colourVarianceRow_sum_nonpos χ f end Green24Proof.PhaseColourRows private def zz2206:"s089e"="s089e":=by decide+kernel end section namespace Green24Proof.FullFourMass open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseAggregation PhaseMassRows PhaseColourRows theorem remainingRows_eq:FullFourCyclic.remainingRows = [ ((0x28578b6f / 0x3b9aca00), .balance 0 (1)), ((0x1824882d / 0xbebc200), .balance 1 (-1)), ((0x12abe50d / 0x1dcd6500), .balance 2 (1)), ((0x705757b9 / 0x3b9aca00), .balance 3 (-1)), ((0x2fc4ecc7 / 0x3b9aca00), .child 0), (1, .heightChild 1), ((0xeb4cd3 / 0x1dcd6500), .grandchild 0), ((0x61155 / 0x5f5e100), .grandchild 2), ((0xcc3b3 / 0x1312d00), .ordered 0), ((0x10bea25 / 0x3b9aca0), .ordered 1), ((0xb33605d7 / 0x3b9aca00), .massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)), ((0x130c6ab / 0x3b9aca00), .massSquare true (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p)), ((1 / 0xf424), .normalization)]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff PackedPhaseRowsEquality.labelEq PackedPhaseRowsEquality.labelEq_iff _ _).mp decide +kernel noncomputable def balanceMass {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := (((0x28578b6f / 0x3b9aca00):ℝ) * phaseTotal h4 g 0 + ((-0x1824882d / 0xbebc200):ℝ) * phaseTotal h4 g 1 + ((0x12abe50d / 0x1dcd6500):ℝ) * phaseTotal h4 g 2 + ((-0x705757b9 / 0x3b9aca00):ℝ) * phaseTotal h4 g 3) * ((phaseTotal h4 g 0 + phaseTotal h4 g 2) - (4:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) noncomputable def meanBalance {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := (((0x4daf5589 / 0x77359400):ℝ) * (phaseTotal h4 g 0 + phaseTotal h4 g 2) + ((-0x7487004d / 0x3b9aca00):ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) * ((phaseTotal h4 g 0 + phaseTotal h4 g 2) - (4:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) private def zz677:"s02a5"="s02a5":=by decide+kernel theorem weighted_remaining_eq {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) : weightedAggregate 4 h4 h3 g FullFourCyclic.remainingRows = balanceMass h4 g + ((0x2fc4ecc7 / 0x3b9aca00):ℝ) * rowAggregate 4 h4 h3 g (.child 0) + (1:ℝ) * rowAggregate 4 h4 h3 g (.heightChild 1) + ((0xeb4cd3 / 0x1dcd6500):ℝ) * rowAggregate 4 h4 h3 g (.grandchild 0) + ((0x61155 / 0x5f5e100):ℝ) * rowAggregate 4 h4 h3 g (.grandchild 2) + ((0xcc3b3 / 0x1312d00):ℝ) * rowAggregate 4 h4 h3 g (.ordered 0) + ((0x10bea25 / 0x3b9aca0):ℝ) * rowAggregate 4 h4 h3 g (.ordered 1) + ((0xb33605d7 / 0x3b9aca00):ℝ) * rowAggregate 4 h4 h3 g (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)) + ((0x130c6ab / 0x3b9aca00):ℝ) * rowAggregate 4 h4 h3 g (.massSquare true (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p)) + ((1 / 0xf424):ℝ) * mass g ^ 2:=by rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_balance,rowAggregate_normalization] norm_num unfold balanceMass ring theorem balanceMass_le_mean {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hU:0 ≤ (phaseTotal h4 g 0 + phaseTotal h4 g 2)) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hodd:phaseTotal h4 g 3 ≤ phaseTotal h4 g 1) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (4:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) : balanceMass h4 g + ((0x10bea25 / 0x3b9aca0):ℝ) * rowAggregate 4 h4 h3 g (.ordered 1) ≤ meanBalance h4 g:=by have hp:=mul_nonpos_of_nonneg_of_nonpos (sub_nonneg.mpr heven) (sub_nonpos.mpr hhigh) have ho:=mul_nonpos_of_nonneg_of_nonpos hU (sub_nonpos.mpr hodd) rw [rowAggregate_ordered] norm_num unfold balanceMass meanBalance nlinarith noncomputable def massPolynomial (U V:ℝ):ℝ := ((-0x4dae9a09 / 0x1dcd65000):ℝ) * U ^ 2 + ((0x10fe666df / 0xee6b2800):ℝ) * U * V + ((-0x7486e8dd / 0x3b9aca00):ℝ) * V ^ 2 theorem massPolynomial_lower_bound {U V:ℝ} (hV:0 ≤ V) (hlow:(3:ℝ) * V ≤ U) (hhigh:U ≤ (4:ℝ) * V) : ((0xbb801 / 0x1dcd65000):ℝ) * V ^ 2 ≤ massPolynomial U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) have hh:=mul_nonneg hV (sub_nonneg.mpr hhigh) unfold massPolynomial nlinarith theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hodd:phaseTotal h4 g 3 ≤ phaseTotal h4 g 1) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (4:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hchild:rowAggregate 4 h4 h3 g (.child 0) ≤ 0) (hheight:rowAggregate 4 h4 h3 g (.heightChild 1) ≤ 0) (hg0:rowAggregate 4 h4 h3 g (.grandchild 0) ≤ 0) (hg2:rowAggregate 4 h4 h3 g (.grandchild 2) ≤ 0) : weightedAggregate 4 h4 h3 g FullFourCyclic.remainingRows ≤ meanBalance h4 g + ((1 / 0xf424):ℝ) * mass g ^ 2:=by rw [weighted_remaining_eq] have hb:=balanceMass_le_mean h4 h3 g (add_nonneg (phaseTotal_nonneg h4 g hg 0) (phaseTotal_nonneg h4 g hg 2)) heven hodd hhigh have ho:rowAggregate 4 h4 h3 g (.ordered 0) ≤ 0 := rowAggregate_ordered_nonpos 4 h4 h3 g hg 0 (by simpa using heven) have hm6:=rowAggregate_massSquare_nonpos 4 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) have hm7:=rowAggregate_colouredMassSquare_nonpos 4 h4 h3 g (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p) linarith private def zz678:"s02a6"="s02a6":=by decide+kernel theorem deficit_lower_bound_of_child_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hodd:phaseTotal h4 g 3 ≤ phaseTotal h4 g 1) (hlow:(3:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ (phaseTotal h4 g 0 + phaseTotal h4 g 2)) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (4:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hchild:rowAggregate 4 h4 h3 g (.child 0) ≤ 0) (hheight:rowAggregate 4 h4 h3 g (.heightChild 1) ≤ 0) (hg0:rowAggregate 4 h4 h3 g (.grandchild 0) ≤ 0) (hg2:rowAggregate 4 h4 h3 g (.grandchild 2) ≤ 0) : ((0xbb801 / 0x1dcd65000):ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ^ 2 ≤ deficit g:=by have hc:=FullFourCyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g hg heven hodd hhigh hchild hheight hg0 hg2 have hm:mass g = (phaseTotal h4 g 0 + phaseTotal h4 g 2) + (phaseTotal h4 g 1 + phaseTotal h4 g 3):=by simpa only [add_assoc,add_comm,add_left_comm] using (phaseTotal_sum h4 g).symm have hp:massPolynomial (phaseTotal h4 g 0 + phaseTotal h4 g 2) (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ deficit g:=by rw [hm] at hc hr unfold meanBalance at hr unfold massPolynomial nlinarith exact (massPolynomial_lower_bound (add_nonneg (phaseTotal_nonneg h4 g hg 1) (phaseTotal_nonneg h4 g hg 3)) hlow hhigh).trans hp end Green24Proof.FullFourMass private def zz2207:"s089f"="s089f":=by decide+kernel end section namespace Green24Proof.ProfileDoubleOrientation open FullPhaseRows (Phase) open PhaseMassRows ProfileOrientation theorem phaseTotal_reflect {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (r:Phase) : phaseTotal h4 (fun i => g (-i)) r = phaseTotal h4 g (-r):=by unfold phaseTotal colourTotal have h:=Equiv.sum_comp (Equiv.neg (ZMod q)) (fun i => if ZMod.castHom h4 (ZMod 4) i = -r then g i else 0) simpa only [Equiv.neg_apply,map_neg,neg_inj] using h theorem parityEquiv_neg_even {m:ℕ} [NeZero m] (i:ZMod m) : -parityEquiv m (0,i) = parityEquiv m (0, -i):=by simp [parityEquiv_apply] theorem parityEquiv_neg_odd {m:ℕ} [NeZero m] (i:ZMod m) : -parityEquiv m (1,i) = parityEquiv m (1, -i - 1):=by simp only [parityEquiv_apply,map_sub,map_neg] have h:doubleResidue m 1 = 2:=by simpa using doubleResidue_natCast m 1 rw [h] simp only [show (1:ZMod 2).val = 1 from rfl,Nat.cast_one] ring private def zz679:"s02a7"="s02a7":=by decide+kernel theorem interleave_reflect {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : interleave (fun i => u (-i)) (fun i => v (-i - 1)) = fun i => interleave u v (-i):=by funext x obtain ⟨⟨r,i⟩,rfl⟩:=(parityEquiv m).surjective x rcases zmod_two_eq_zero_or_one r with rfl | rfl · rw [parityEquiv_neg_even,interleave_even,interleave_even] · rw [parityEquiv_neg_odd,interleave_odd,interleave_odd] theorem odd_mass_reflect {m:ℕ} [NeZero m] (v:ZMod m → ℝ) : mass (fun i => v (-i - 1)) = mass v:=by have h:=mass_reflect (fun i => v (i - 1)) have ht:=mass_translate v (-1) simp only [sub_eq_add_neg] at h simpa only [sub_eq_add_neg] using h.trans ht theorem orient_both_children {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : ∃ u' v':ZMod m → ℝ,(∀ i,0 ≤ u' i) ∧ (∀ i,0 ≤ v' i) ∧ mass u' = mass u ∧ mass v' = mass v ∧ deficit (interleave u' v') = deficit (interleave u v) ∧ phaseTotal h4 (interleave u' v') 2 ≤ phaseTotal h4 (interleave u' v') 0 ∧ phaseTotal h4 (interleave u' v') 3 ≤ phaseTotal h4 (interleave u' v') 1:=by obtain ⟨a,b,ha,hb,hA,hB,hd,ho⟩:=orient_even_child h4 u v hu hv rcases le_total (phaseTotal h4 (interleave a b) 3) (phaseTotal h4 (interleave a b) 1) with h | h · exact ⟨a,b,ha,hb,hA,hB,hd,ho,h⟩ · refine ⟨(fun i => a (-i)),(fun i => b (-i - 1)),(fun i => ha _),(fun i => hb _), (mass_reflect a).trans hA,(odd_mass_reflect b).trans hB, ?_, ?_, ?_⟩ · rw [interleave_reflect,deficit_reflect] exact hd · rw [interleave_reflect,phaseTotal_reflect,phaseTotal_reflect] simpa only [show (-2:Phase) = 2 from rfl,neg_zero] using ho · rw [interleave_reflect,phaseTotal_reflect,phaseTotal_reflect] simpa only [show (-3:Phase) = 1 from rfl,show (-1:Phase) = 3 from rfl] using h end Green24Proof.ProfileDoubleOrientation private def zz2208:"s08a0"="s08a0":=by decide+kernel end section namespace Green24Proof.FullFourProfileInterval open FullPhaseRows FullPhaseAggregation PhaseMassRows ChildRows HeightChildRows theorem interval_bound_of_height {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hh:(49 / 0xfa:ℝ) * energy v - (6 / 5:ℝ) * (classMass (ZMod.castHom h2 (ZMod 2)) v 0 - classMass (ZMod.castHom h2 (ZMod 2)) v 1) ^ 2 ≤ deficit v) (horder:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(3:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (4:ℝ) * mass v) : (0xbb801 / 0x1dcd65000:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by have hg:=interleave_nonneg u v hu hv have hV:phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3 = mass v:=by rw [phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2,classMass_sum] have hU:phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 = mass u:=by have ht:=phaseTotal_sum h4 (interleave u v) rw [mass_interleave] at ht linarith have hchild:rowAggregate (4) h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even] have hd:=ih m (by have hp:=NeZero.pos m; omega) (dvd_mul_left m 2) u hu linarith have hheight:=rowAggregate_height_odd_nonpos (4) h4 h3 h2 u v hu hv hh have hg0:=Full27ProfileInterval.grandchild_nonpos_of_induction 4 h4 h3 (interleave u v) hg 0 ih have hg2:=Full27ProfileInterval.grandchild_nonpos_of_induction 4 h4 h3 (interleave u v) hg 2 ih have hc:=FullFourMass.deficit_lower_bound_of_child_rows h4 h3 h5 (interleave u v) hg horder hodd (by rw [hU,hV]; exact hlow) (by rw [hU,hV]; exact hhigh) hchild hheight hg0 hg2 simpa only [hV] using hc private def zz680:"s02a8"="s02a8":=by decide+kernel theorem interval_bound_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (horder:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(3:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (4:ℝ) * mass v) : (0xbb801 / 0x1dcd65000:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) exact interval_bound_of_height h4 h3 h5 h2 u v hu hv ih (HeightStrong.strong_height_bound h2 h3m h5m v hv) horder hodd hlow hhigh theorem interval_bound {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(3:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (4:ℝ) * mass v) : (0xbb801 / 0x1dcd65000:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,horder,hodd⟩:=ProfileDoubleOrientation.orient_both_children h4 u v hu hv have hb:=interval_bound_ordered h4 h3 h5 h2 u' v' hu' hv' ih horder hodd (by simpa only [hU,hV] using hlow) (by simpa only [hU,hV] using hhigh) simpa only [hU,hV,hd] using hb end Green24Proof.FullFourProfileInterval private def zz2209:"s08a1"="s08a1":=by decide+kernel end section namespace Green24Proof.RatioCover theorem interval_to_four {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (horder:mass v ≤ mass u) (hhigh:mass u ≤ 4 * mass v) : 0 ≤ deficit (interleave u v):=by by_cases h:mass u ≤ 3 * mass v · exact NearBalanceVerified.interval_to_three h4 h3 h5 h2 u v hu hv ih horder h · have hb:=FullFourProfileInterval.interval_bound h4 h3 h5 h2 u v hu hv ih (le_of_lt (lt_of_not_ge h)) hhigh exact (mul_nonneg (by norm_num) (sq_nonneg (mass v))).trans hb end Green24Proof.RatioCover private def zz2210:"s08a2"="s08a2":=by decide+kernel end section namespace Green24Proof.LocalFullFivePairs def compact_fullFive_pair_20_base:CompactPair.Quadratic:=⟨(1 / 0x5f5e1000),(0x4e1d / 0x77359400),0⟩ def compact_fullFive_pair_20_hinges:List CompactPair.Hinge:=[⟨(1 / 0x165a0bc00),1, -3⟩,⟨(-0x13f9f18b / 0x1dcd65000),1, -2⟩,⟨(0x11fa8c95 / 0x2cb417800),2, -3⟩,⟨(0x13f9f18b / 0x1dcd65000),2, -1⟩,⟨(-0x11fa8c95 / 0x2cb417800),3, -2⟩,⟨(-1 / 0x165a0bc00),3, -1⟩] noncomputable def fullFive_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_20_base compact_fullFive_pair_20_hinges x y def compact_fullFive_pair_20_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullFive_pair_20_check : CompactPair.expressionCheckPSD compact_fullFive_pair_20_base compact_fullFive_pair_20_hinges 0 compact_fullFive_pair_20_cuts = true := by decide +kernel private def zz681:"s02a9"="s02a9":=by decide+kernel theorem compact_fullFive_pair_20_representation (x y:ℝ) : fullFive_pair_20 x y = CompactPair.expressionEval compact_fullFive_pair_20_base compact_fullFive_pair_20_hinges x y:=by rfl theorem fullFive_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_20 x y:=by rw [compact_fullFive_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_20_check hy (by simpa using hx) def compact_fullFive_pair_21_base:CompactPair.Quadratic:=⟨(-13 / 0x1dcd65000),(0x1f41 / 0x77359400),0⟩ def compact_fullFive_pair_21_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0xee6b2800),1, -2⟩,⟨(-1 / 0x59682f000),2, -3⟩,⟨(1 / 0xee6b2800),2, -1⟩,⟨(1 / 0x59682f000),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def fullFive_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_21_base compact_fullFive_pair_21_hinges x y def compact_fullFive_pair_21_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullFive_pair_21_check : CompactPair.expressionCheckPSD compact_fullFive_pair_21_base compact_fullFive_pair_21_hinges 0 compact_fullFive_pair_21_cuts = true := by decide +kernel theorem compact_fullFive_pair_21_representation (x y:ℝ) : fullFive_pair_21 x y = CompactPair.expressionEval compact_fullFive_pair_21_base compact_fullFive_pair_21_hinges x y:=by rfl private def zz682:"s02aa"="s02aa":=by decide+kernel theorem fullFive_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_21 x y:=by rw [compact_fullFive_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_21_check hy (by simpa using hx) def compact_fullFive_pair_22_base:CompactPair.Quadratic:=⟨0,(0x36b1 / 0x3b9aca00),0⟩ def compact_fullFive_pair_22_hinges:List CompactPair.Hinge:=[] noncomputable def fullFive_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_22_base compact_fullFive_pair_22_hinges x y def compact_fullFive_pair_22_cuts:List ℚ:=[] theorem compact_fullFive_pair_22_check : CompactPair.expressionCheckPSD compact_fullFive_pair_22_base compact_fullFive_pair_22_hinges 0 compact_fullFive_pair_22_cuts = true := by decide +kernel theorem compact_fullFive_pair_22_representation (x y:ℝ) : fullFive_pair_22 x y = CompactPair.expressionEval compact_fullFive_pair_22_base compact_fullFive_pair_22_hinges x y:=by rfl theorem fullFive_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_22 x y:=by rw [compact_fullFive_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_22_check hy (by simpa using hx) def compact_fullFive_pair_23_base:CompactPair.Quadratic:=⟨(-0x2c29b0d7 / 0xb2d05e00),(0x835b29 / 0x3b9aca0),0⟩ def compact_fullFive_pair_23_hinges:List CompactPair.Hinge:=[⟨(1 / 0xb2d05e00),1, -3⟩,⟨(-0x4bb9cc7 / 0xee6b2800),1, -2⟩,⟨(0x8f1dec1 / 0x2cb417800),2, -3⟩,⟨(0x4f6581d7 / 0x1dcd65000),2, -1⟩,⟨(-0x23b36f99 / 0x2cb417800),3, -2⟩] noncomputable def fullFive_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_23_base compact_fullFive_pair_23_hinges x y def compact_fullFive_pair_23_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2,3] private def zz683:"s02ab"="s02ab":=by decide+kernel theorem compact_fullFive_pair_23_check : CompactPair.expressionCheckPSD compact_fullFive_pair_23_base compact_fullFive_pair_23_hinges 0 compact_fullFive_pair_23_cuts = true := by decide +kernel theorem compact_fullFive_pair_23_representation (x y:ℝ) : fullFive_pair_23 x y = CompactPair.expressionEval compact_fullFive_pair_23_base compact_fullFive_pair_23_hinges x y:=by rfl theorem fullFive_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_23 x y:=by rw [compact_fullFive_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_23_check hy (by simpa using hx) def compact_fullFive_pair_24_base:CompactPair.Quadratic:=⟨(1 / 0xee6b2800),(1 / 0x186a0),0⟩ def compact_fullFive_pair_24_hinges:List CompactPair.Hinge:=[⟨(0xb5c9c5 / 0x77359400),1, -3⟩,⟨(-0x1244d2b1 / 0x77359400),1, -2⟩,⟨(0x10c12325 / 0xee6b2800),2, -3⟩,⟨(-0x4e1d4ab5 / 0xee6b2800),2, -1⟩,⟨(0x1eff6d55 / 0x2cb417800),3, -2⟩,⟨(0x7d0af01 / 0x59682f00),3, -1⟩] noncomputable def fullFive_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_24_base compact_fullFive_pair_24_hinges x y def compact_fullFive_pair_24_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullFive_pair_24_check : CompactPair.expressionCheckPSD compact_fullFive_pair_24_base compact_fullFive_pair_24_hinges 0 compact_fullFive_pair_24_cuts = true := by decide +kernel private def zz684:"s02ac"="s02ac":=by decide+kernel theorem compact_fullFive_pair_24_representation (x y:ℝ) : fullFive_pair_24 x y = CompactPair.expressionEval compact_fullFive_pair_24_base compact_fullFive_pair_24_hinges x y:=by rfl theorem fullFive_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_24 x y:=by rw [compact_fullFive_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_24_check hy (by simpa using hx) def compact_fullFive_pair_25_base:CompactPair.Quadratic:=⟨(-67 / 0x59682f000),(0xfa3 / 0x3b9aca00),0⟩ def compact_fullFive_pair_25_hinges:List CompactPair.Hinge:=[⟨(1 / 0xb2d05e00),1, -3⟩,⟨(-3 / 0x1dcd65000),1, -2⟩,⟨(-1 / 0x59682f000),2, -3⟩,⟨(1 / 0x2cb417800),3, -2⟩,⟨(1 / 0xee6b2800),3, -1⟩] noncomputable def fullFive_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_25_base compact_fullFive_pair_25_hinges x y def compact_fullFive_pair_25_cuts:List ℚ:=[(1 / 3),(2 / 3),(3 / 2),2,3] theorem compact_fullFive_pair_25_check : CompactPair.expressionCheckPSD compact_fullFive_pair_25_base compact_fullFive_pair_25_hinges 0 compact_fullFive_pair_25_cuts = true := by decide +kernel theorem compact_fullFive_pair_25_representation (x y:ℝ) : fullFive_pair_25 x y = CompactPair.expressionEval compact_fullFive_pair_25_base compact_fullFive_pair_25_hinges x y:=by rfl private def zz685:"s02ad"="s02ad":=by decide+kernel theorem fullFive_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_25 x y:=by rw [compact_fullFive_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_25_check hy (by simpa using hx) def compact_fullFive_pair_26_base:CompactPair.Quadratic:=⟨0,(0x36b1 / 0x3b9aca00),0⟩ def compact_fullFive_pair_26_hinges:List CompactPair.Hinge:=[] noncomputable def fullFive_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_26_base compact_fullFive_pair_26_hinges x y def compact_fullFive_pair_26_cuts:List ℚ:=[] theorem compact_fullFive_pair_26_check : CompactPair.expressionCheckPSD compact_fullFive_pair_26_base compact_fullFive_pair_26_hinges 0 compact_fullFive_pair_26_cuts = true := by decide +kernel theorem compact_fullFive_pair_26_representation (x y:ℝ) : fullFive_pair_26 x y = CompactPair.expressionEval compact_fullFive_pair_26_base compact_fullFive_pair_26_hinges x y:=by rfl theorem fullFive_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_26 x y:=by rw [compact_fullFive_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_26_check hy (by simpa using hx) def compact_fullFive_pair_27_base:CompactPair.Quadratic:=⟨(-0x9d5f45463 / 0x59682f000),(0x15015811 / 0x1dcd6500),0⟩ def compact_fullFive_pair_27_hinges:List CompactPair.Hinge:=[⟨(-0x619f06f / 0x5f5e1000),1, -2⟩,⟨(-0x17a2820d / 0x77359400),1, -1⟩,⟨(0x22989f77 / 0x2cb417800),2, -3⟩,⟨(-0x9e3df607 / 0x1dcd65000),2, -1⟩,⟨(0x29cec285 / 0x77359400),3, -1⟩] noncomputable def fullFive_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_27_base compact_fullFive_pair_27_hinges x y def compact_fullFive_pair_27_cuts:List ℚ:=[(1 / 3),(1 / 2),1,(3 / 2),2] private def zz686:"s02ae"="s02ae":=by decide+kernel theorem compact_fullFive_pair_27_check : CompactPair.expressionCheckPSD compact_fullFive_pair_27_base compact_fullFive_pair_27_hinges 0 compact_fullFive_pair_27_cuts = true := by decide +kernel theorem compact_fullFive_pair_27_representation (x y:ℝ) : fullFive_pair_27 x y = CompactPair.expressionEval compact_fullFive_pair_27_base compact_fullFive_pair_27_hinges x y:=by rfl theorem fullFive_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_27 x y:=by rw [compact_fullFive_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_27_check hy (by simpa using hx) def compact_fullFive_pair_28_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x2ebabcef / 0x3b9aca00),(-49 / 50)⟩ def compact_fullFive_pair_28_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFive_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_28_base compact_fullFive_pair_28_hinges x y def compact_fullFive_pair_28_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullFive_pair_28_check : CompactPair.expressionCheckPSD compact_fullFive_pair_28_base compact_fullFive_pair_28_hinges 0 compact_fullFive_pair_28_cuts = true := by decide +kernel private def zz687:"s02af"="s02af":=by decide+kernel theorem compact_fullFive_pair_28_representation (x y:ℝ) : fullFive_pair_28 x y = CompactPair.expressionEval compact_fullFive_pair_28_base compact_fullFive_pair_28_hinges x y:=by rfl theorem fullFive_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_28 x y:=by rw [compact_fullFive_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_28_check hy (by simpa using hx) def compact_fullFive_pair_29_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x2ebad45f / 0x3b9aca00),(-49 / 50)⟩ def compact_fullFive_pair_29_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFive_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_29_base compact_fullFive_pair_29_hinges x y def compact_fullFive_pair_29_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullFive_pair_29_check : CompactPair.expressionCheckPSD compact_fullFive_pair_29_base compact_fullFive_pair_29_hinges 0 compact_fullFive_pair_29_cuts = true := by decide +kernel theorem compact_fullFive_pair_29_representation (x y:ℝ) : fullFive_pair_29 x y = CompactPair.expressionEval compact_fullFive_pair_29_base compact_fullFive_pair_29_hinges x y:=by rfl private def zz688:"s02b0"="s02b0":=by decide+kernel theorem fullFive_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_29 x y:=by rw [compact_fullFive_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_29_check hy (by simpa using hx) def compact_fullFive_pair_30_base:CompactPair.Quadratic:=⟨(-0xdab608961 / 0x165a0bc00),(0x3f9c0571 / 0xbebc200),0⟩ def compact_fullFive_pair_30_hinges:List CompactPair.Hinge:=[⟨(-0x376de9 / 0x3b9aca00),1, -1⟩,⟨(-0x5a9f7a89 / 0x2cb417800),2, -3⟩,⟨(0x1991a3ae1 / 0x165a0bc00),3, -1⟩] noncomputable def fullFive_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_30_base compact_fullFive_pair_30_hinges x y def compact_fullFive_pair_30_cuts:List ℚ:=[(1 / 3),1,(3 / 2)] theorem compact_fullFive_pair_30_check : CompactPair.expressionCheckPSD compact_fullFive_pair_30_base compact_fullFive_pair_30_hinges 0 compact_fullFive_pair_30_cuts = true := by decide +kernel theorem compact_fullFive_pair_30_representation (x y:ℝ) : fullFive_pair_30 x y = CompactPair.expressionEval compact_fullFive_pair_30_base compact_fullFive_pair_30_hinges x y:=by rfl theorem fullFive_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_30 x y:=by rw [compact_fullFive_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_30_check hy (by simpa using hx) def compact_fullFive_pair_31_base:CompactPair.Quadratic:=⟨(-1 / 0x11e1a3000),(0xf9f / 0x1dcd6500),0⟩ def compact_fullFive_pair_31_hinges:List CompactPair.Hinge:=[⟨(-0x50810291 / 0xb2d05e00),1, -3⟩,⟨(0x2ae6db85 / 0x5f5e1000),1, -2⟩,⟨(-0x26fadb81 / 0xee6b2800),1, -1⟩,⟨(0xfe547b / 0x2faf0800),2, -3⟩,⟨(-1 / 0x1dcd65000),2, -1⟩,⟨(0x665ee65 / 0x2cb417800),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def fullFive_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_31_base compact_fullFive_pair_31_hinges x y def compact_fullFive_pair_31_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] private def zz689:"s02b1"="s02b1":=by decide+kernel theorem compact_fullFive_pair_31_check : CompactPair.expressionCheckPSD compact_fullFive_pair_31_base compact_fullFive_pair_31_hinges 0 compact_fullFive_pair_31_cuts = true := by decide +kernel theorem compact_fullFive_pair_31_representation (x y:ℝ) : fullFive_pair_31 x y = CompactPair.expressionEval compact_fullFive_pair_31_base compact_fullFive_pair_31_hinges x y:=by rfl theorem fullFive_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_31 x y:=by rw [compact_fullFive_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_31_check hy (by simpa using hx) def compact_fullFive_pair_32_base:CompactPair.Quadratic:=⟨(-0xe9a673ff / 0xee6b2800),(-0x46182eef / 0x3b9aca00),(-49 / 50)⟩ def compact_fullFive_pair_32_hinges:List CompactPair.Hinge:=[⟨(-0x1293207 / 0x17d7840),1, -3⟩,⟨(-0xec3a7475 / 0x77359400),1, -1⟩,⟨(49 / 0x1f4),1,3⟩,⟨(0x954e63c3 / 0x2cb417800),3, -2⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFive_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_32_base compact_fullFive_pair_32_hinges x y def compact_fullFive_pair_32_cuts:List ℚ:=[(1 / 3),(2 / 3),1,3] theorem compact_fullFive_pair_32_check : CompactPair.expressionCheckPSD compact_fullFive_pair_32_base compact_fullFive_pair_32_hinges 0 compact_fullFive_pair_32_cuts = true := by decide +kernel private def zz690:"s02b2"="s02b2":=by decide+kernel theorem compact_fullFive_pair_32_representation (x y:ℝ) : fullFive_pair_32 x y = CompactPair.expressionEval compact_fullFive_pair_32_base compact_fullFive_pair_32_hinges x y:=by rfl theorem fullFive_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_32 x y:=by rw [compact_fullFive_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_32_check hy (by simpa using hx) def compact_fullFive_pair_33_base:CompactPair.Quadratic:=⟨(-0x493185df / 0x2cb41780),(-0x21c065 / 0x2625a0),(-49 / 50)⟩ def compact_fullFive_pair_33_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(-0x6adb6f71 / 0xee6b2800),1, -2⟩,⟨(-0x38d9e97 / 0x17d7840),1, -1⟩,⟨(49 / 0x1f4),1,3⟩,⟨(0x14acdd2ab / 0x2cb417800),2, -3⟩,⟨(0x4407dabf / 0x2cb417800),3, -2⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFive_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_33_base compact_fullFive_pair_33_hinges x y def compact_fullFive_pair_33_cuts:List ℚ:=[(1 / 3),(2 / 3),1,(3 / 2),2,3] theorem compact_fullFive_pair_33_check : CompactPair.expressionCheckPSD compact_fullFive_pair_33_base compact_fullFive_pair_33_hinges 0 compact_fullFive_pair_33_cuts = true := by decide +kernel theorem compact_fullFive_pair_33_representation (x y:ℝ) : fullFive_pair_33 x y = CompactPair.expressionEval compact_fullFive_pair_33_base compact_fullFive_pair_33_hinges x y:=by rfl private def zz691:"s02b3"="s02b3":=by decide+kernel theorem fullFive_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_33 x y:=by rw [compact_fullFive_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_33_check hy (by simpa using hx) def compact_fullFive_pair_34_base:CompactPair.Quadratic:=⟨(1 / 0x59682f00),(0x4e27 / 0x77359400),0⟩ def compact_fullFive_pair_34_hinges:List CompactPair.Hinge:=[⟨(-0x115e967 / 0x2cb417800),1, -3⟩,⟨(0x22bd2d / 0xee6b280),1, -2⟩,⟨(-0x22bd2d / 0x2cb41780),2, -3⟩,⟨(-0x22bd2d / 0xee6b280),2, -1⟩,⟨(0x22bd2d / 0x2cb41780),3, -2⟩,⟨(0x115e967 / 0x2cb417800),3, -1⟩] noncomputable def fullFive_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_34_base compact_fullFive_pair_34_hinges x y def compact_fullFive_pair_34_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullFive_pair_34_check : CompactPair.expressionCheckPSD compact_fullFive_pair_34_base compact_fullFive_pair_34_hinges 0 compact_fullFive_pair_34_cuts = true := by decide +kernel theorem compact_fullFive_pair_34_representation (x y:ℝ) : fullFive_pair_34 x y = CompactPair.expressionEval compact_fullFive_pair_34_base compact_fullFive_pair_34_hinges x y:=by rfl theorem fullFive_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_34 x y:=by rw [compact_fullFive_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_34_check hy (by simpa using hx) def compact_fullFive_pair_35_base:CompactPair.Quadratic:=⟨(-1 / 0x8f0d1800),(0x1f49 / 0x77359400),0⟩ def compact_fullFive_pair_35_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),2, -3⟩,⟨(1 / 0x2cb417800),3, -2⟩] noncomputable def fullFive_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_35_base compact_fullFive_pair_35_hinges x y def compact_fullFive_pair_35_cuts:List ℚ:=[(2 / 3),(3 / 2)] private def zz692:"s02b4"="s02b4":=by decide+kernel theorem compact_fullFive_pair_35_check : CompactPair.expressionCheckPSD compact_fullFive_pair_35_base compact_fullFive_pair_35_hinges 0 compact_fullFive_pair_35_cuts = true := by decide +kernel theorem compact_fullFive_pair_35_representation (x y:ℝ) : fullFive_pair_35 x y = CompactPair.expressionEval compact_fullFive_pair_35_base compact_fullFive_pair_35_hinges x y:=by rfl theorem fullFive_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_35 x y:=by rw [compact_fullFive_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_35_check hy (by simpa using hx) def compact_fullFive_pair_36_base:CompactPair.Quadratic:=⟨(-0x55d13c9 / 0x77359400),(0x2dca65 / 0x5f5e100),0⟩ def compact_fullFive_pair_36_hinges:List CompactPair.Hinge:=[⟨(0x1c9b143 / 0x165a0bc00),3, -1⟩] noncomputable def fullFive_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_36_base compact_fullFive_pair_36_hinges x y def compact_fullFive_pair_36_cuts:List ℚ:=[(1 / 3)] theorem compact_fullFive_pair_36_check : CompactPair.expressionCheckPSD compact_fullFive_pair_36_base compact_fullFive_pair_36_hinges 0 compact_fullFive_pair_36_cuts = true := by decide +kernel private def zz693:"s02b5"="s02b5":=by decide+kernel theorem compact_fullFive_pair_36_representation (x y:ℝ) : fullFive_pair_36 x y = CompactPair.expressionEval compact_fullFive_pair_36_base compact_fullFive_pair_36_hinges x y:=by rfl theorem fullFive_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_36 x y:=by rw [compact_fullFive_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_36_check hy (by simpa using hx) def compact_fullFive_pair_37_base:CompactPair.Quadratic:=⟨(-0x4be31e1a3 / 0x59682f000),(0x3ca7b41 / 0xbebc200),0⟩ def compact_fullFive_pair_37_hinges:List CompactPair.Hinge:=[⟨(-3 / 0x17d78400),1, -3⟩,⟨(0x3a9 / 0x1dcd65000),1, -2⟩,⟨(0x309717f1 / 0x77359400),1, -1⟩,⟨(-0x4dcd499 / 0xb2d05e00),2, -3⟩,⟨(-0x18077035 / 0x3b9aca00),2, -1⟩,⟨(0x157b90a9 / 0x59682f00),3, -1⟩] noncomputable def fullFive_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_37_base compact_fullFive_pair_37_hinges x y def compact_fullFive_pair_37_cuts:List ℚ:=[(1 / 3),(1 / 2),1,(3 / 2),2,3] theorem compact_fullFive_pair_37_check : CompactPair.expressionCheckPSD compact_fullFive_pair_37_base compact_fullFive_pair_37_hinges 0 compact_fullFive_pair_37_cuts = true := by decide +kernel theorem compact_fullFive_pair_37_representation (x y:ℝ) : fullFive_pair_37 x y = CompactPair.expressionEval compact_fullFive_pair_37_base compact_fullFive_pair_37_hinges x y:=by rfl private def zz694:"s02b6"="s02b6":=by decide+kernel theorem fullFive_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_37 x y:=by rw [compact_fullFive_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_37_check hy (by simpa using hx) def compact_fullFive_pair_38_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x2ebabcef / 0x3b9aca00),(-49 / 50)⟩ def compact_fullFive_pair_38_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFive_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_38_base compact_fullFive_pair_38_hinges x y def compact_fullFive_pair_38_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullFive_pair_38_check : CompactPair.expressionCheckPSD compact_fullFive_pair_38_base compact_fullFive_pair_38_hinges 0 compact_fullFive_pair_38_cuts = true := by decide +kernel theorem compact_fullFive_pair_38_representation (x y:ℝ) : fullFive_pair_38 x y = CompactPair.expressionEval compact_fullFive_pair_38_base compact_fullFive_pair_38_hinges x y:=by rfl theorem fullFive_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_38 x y:=by rw [compact_fullFive_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_38_check hy (by simpa using hx) def compact_fullFive_pair_39_base:CompactPair.Quadratic:=⟨(-0x1b9 / 0xfa),(-0x2ebad45f / 0x3b9aca00),(-49 / 50)⟩ def compact_fullFive_pair_39_hinges:List CompactPair.Hinge:=[⟨(-49 / 0x1f4),1, -3⟩,⟨(49 / 0x1f4),1,3⟩,⟨(49 / 0x1f4),3, -1⟩,⟨(49 / 0x1f4),3,1⟩] noncomputable def fullFive_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullFive_pair_39_base compact_fullFive_pair_39_hinges x y def compact_fullFive_pair_39_cuts:List ℚ:=[(1 / 3),3] private def zz695:"s02b7"="s02b7":=by decide+kernel theorem compact_fullFive_pair_39_check : CompactPair.expressionCheckPSD compact_fullFive_pair_39_base compact_fullFive_pair_39_hinges 0 compact_fullFive_pair_39_cuts = true := by decide +kernel theorem compact_fullFive_pair_39_representation (x y:ℝ) : fullFive_pair_39 x y = CompactPair.expressionEval compact_fullFive_pair_39_base compact_fullFive_pair_39_hinges x y:=by rfl theorem fullFive_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullFive_pair_39 x y:=by rw [compact_fullFive_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_fullFive_pair_39_check hy (by simpa using hx) end Green24Proof.LocalFullFivePairs private def zz2211:"s08a3"="s08a3":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l17 l22 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l42 l43 l45 l5 l51 l54 l55 l57 l58 l6 l60 l61 l62 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1133b2dff, -0x113ff180a, -0x19dfec09e,0x1d2753aa], ![-0x113ff180a, -0x3b229d19e,0x3fadad44,0x102cfd6f8], ![-0x19dfec09e,0x3fadad44, -0x701fb6089,0x113ff78ca], ![0x1d2753aa,0x102cfd6f8,0x113ff78ca, -0x89ffa4f8]] noncomputable def hinges:Hinges:=[(-0xfd827e,l6),(-0x13997a45,l5),(0x90f4d4f6,l4),(0x19c3403,l9),(-0x652c6bf3,l8),(-0x77231c,l11),(0x1ee5b22a,l10),(0x11e5dbf00,l14),(-0x307d43a4,l17),(0x22197abf,l23),(0x890413b,l22),(-0x89ffa4f8,l27),(0x89ffa4f8,l29),(-0x11e5dbf00,l25),(0x34140754,l31),(0x5eb19bde,l30),(0x89ffa4f8,l33),(-0x1ee5b22a,l38),(-0x89ffa4f8,l35),(0x652c6bf3,l36),(0x89ffa4f8,l37),(-0x90f4d4f6,l34),(-0x5eb19bde,l43),(-0x890413b,l42),(0x4d0e5717,l45),(0x89ffa4f8,l51),(0x77231c,l55),(0x13997a45,l54),(-0x34140754,l57),(-0x4d0e5717,l58),(-0x19c3403,l61),(0xfd827e,l60),(-0x22197abf,l63),(0x307d43a4,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x89ffa4f8,l27),(0x89ffa4f8,l29),(0x89ffa4f8,l33),(-0x89ffa4f8,l35),(0x89ffa4f8,l37),(0x89ffa4f8,l51),(0x11e5dbf00,l14),(-0x11e5dbf00,l25),(0x5eb19bde,l30),(-0x5eb19bde,l43),(0x34140754,l31),(-0x34140754,l57),(-0x652c6bf3,l8),(0x652c6bf3,l36),(0x22197abf,l23),(-0x22197abf,l63),(-0x307d43a4,l17),(0x307d43a4,l62),(0x4d0e5717,l45),(-0x4d0e5717,l58),(0x90f4d4f6,l4),(-0x90f4d4f6,l34),(0x1ee5b22a,l10),(-0x1ee5b22a,l38),(-0x13997a45,l5),(0x13997a45,l54),(0x890413b,l22),(-0x890413b,l42),(0x19c3403,l9),(-0x19c3403,l61),(-0xfd827e,l6),(0xfd827e,l60),(-0x77231c,l11),(0x77231c,l55)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x1c0a005980600000003e17026300c00000000684814601000003d188b009900300000622906013200600000005221034300c0000000001481c4010000000001540288030000000000560310040000000000a4062008000001062081526020000020622809c8c050000040c4200d9180a0000000000440720080000000001b00a40100000000003502480200000000000d8190020000090901024c301400001a8a44804c801800001c090380b50030000000291081b180600000041084048301000000f8441c028801800000000a05014c0200000001504811180600000025044086301000000000582814601000000000001c0c8010000000150600998060000002b05c086301000000004c12044601800000000009024802000008c3111009a0060000000000840e20080000000008a0144018000000000220148020000000000460310040000000000840620080000000001500a40100000000002902480200000000000a81900200000000000503200400000000001e06400800a50d80a009450050000000000140690040000000000740b200800000092108064602000000011854028c030000000026140298040001502705006d40100000000098580c601000000001309018c0200009a108240192008050829010800cd40180a20508220031a8030000000000130148020014c144130096a00a0001582405809d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x25840460814c200a00000918eb019c30140000288481207a8018000051090240550030000000032220718040000000c42301f300c0000000168581660100000631506c0d50030001441182c04d2008000284520c4039401000012090980f48603021410205101edd0060000000492081b18060000000078240b3008000000c21900fe6020016f1de30c03c500500000000000481900200000000cc480e30080000000000901a401000000001d0502cc020000000491c81218060000000000140920080000000068501c6010000c12481700a10040001222b82407e20080000124520a01e400c0000001a42604c601800000002d0f01cc02000000003a1c0598040000000f223014300c00002892c6404c8018000000248c4058c03000000004a2205980400000008231024300c0000208641604c80180000001c8440b0c0300000003908806180600000007231036300c000330480c0076802000000002315018c020000000000058190020000000084540630080000000008e01640180000000011404c80300000000005e0310040000000000b40620080000000178701c60100000000000e0348020000072290901b20060000000054240b300800000000c8780e60100000000001901c8020000005a422a05a00400000007229024300c0000000148301660100000000190d028c020000000311481b1806000000510c4048301000001206416028801800000000f0a018c02000000001e1205180400000003211026300c0000000070480c60100000000000d018802,0xc0690040000000ca22013300c000000190420166018000711841401a1004000000006222039804000000a124408630101e1961941012b08036062c2820c09ecd00700000000000f819002000000b12840863010201981961012b08030000000000a408c803000000004a420518040000000000b805200800000000016812401000000000005c0c80100000003c0900d98060000000044240d300800610a310401e280280000000001502c802000000000b000990080000000002f013200c006304605601e48028000000000050188020001261102201da0080002482506002b40100000000118b00a60102452181c50298500604824243820390a00c000248831c80cb4010000000e23180d060201d414205101edd0060000000411c81b180600000e4662a026400c0000000c45202c6018000740d02101e10040000781082801e20080001f03c08407840100001e0420d013880200000000000901880200000001105006180600000000a46c0e300800000015462014601800000002a19014c020000000056320318040001b05305406840100000000148c80c60100006c14c1503a10040000000002b805900600000000055013200c00000000001a064008000cf1901202610040001863202404a200948490808b00dd5401c00a412205c016280280000000036340cc0100000052221203200400001d8781b01f400c0000000170b816601024a08604f00981006048411c08602b0200c00000004219015300c1290a602d808f48030012c20a3140e61005,0x1c81190060000000054480e30080000000a44c02a60180000000000d0388020000002b06207d18080000000521902d300c0000000a44202a60180000010c16012cc040000000331481b98060000009454240f40080000000007060660080000000d834058c0300000001b04813180600000004213034300c0000000842602860180000000290f034c02000000000188119006000007186102ae30140000000843c02a60180000000d84c034c030000000008604390080000000000240720080000000000481c401000000001f09034c02000000002e1a06980400000e45a16012400c00000000b0580a60100000000002d0388020000000002e805100600000000b4380e300800000000d0301e601020f184082035c100604063281140638200c0040c62042023840140000000000a80e40100000003686404cc030000000690d011980600000000d8340b30080000001445207a60180000000003a01480200000000007204900400000000001d0320040000001646207a601800000304710258c040000000001081190060000000084340f30080000000110301e6010000000000fc02c8030000000001e8099006000000003428063008000410e631019680200000411c8500d100300000000560c07180400000000a4180e3008000408e20a00d0802000000001607014c02000000421c0e02a00400398508610292401400718a50ca04e4802800000000e07014c02001c62883100d9200a00000005219016300c0003a8ca0a00d080200000003388402cc03,0x40a38a29e042da00c0000006108807f30100c30878678074480300000000000440c8010028841811817da00a00000000c87c093008000518cc1981148020000a11981500ed00400014c3183003da0080051c938f503db40140000270e46206c801800000000004c0c801002583846080c9200a004d4738c703db40141278e28c2810b6803000028125301e90c0600005a650203d2180c0000000078140b3008000001023880d86020000a618c1301ed00400000005b1a0089806005989204302fb40140000000198f0126010000051248f80d9003002824847600c9200a0002d87104c05b4010000598ec0b811680202852451cf0216d0060000000531181298060000000a82b011300c00000000783814601000001c62980d64c050000002084403f98080038c62042020f40141078c206101ae080302031940ca031c10060020631031011c200a000000005c1407300800000006c2203a601800000001e0603cc020000000003428198020000000003700b200c0000000006a026401800a210618803c500500000000120e0518040000000000030320040000000ec6206e60180000000350a02cc020000003a261e0320040000000014c08720100000001741403860180000000004601480200000000008a049004000000000023032004000001e250812c6020000024408408acc0500000002d0900e18060000000521201c300c0000000005060660080000000982408cc0300000001a0b00e98060000003108c09530100000000642604a601800002862040c40c05,0x2a0490040000164a214026400c0000001248206860180000000190b01cc0200000b62b0500b20060040c520640232401400000000a8681660100000411e02c05100300000005c188051806000000000b8d03300400000000016816401000000002e19018c02000000000032031004000000002e00132010000000000be02640180000591084c099003000000049088161806000000443414064008000000124220186018000950941400610040000050c7e013f180a00000000c4540b30080000001a44604c6018000003043301a0c04000000007a160398040000000074280b30080000000088501c6010000e119c1203f100400000e2310500f20060002983809003b401000820c314603a4802800003e148840d9003001d82844080c9200a003d45388703db40140e78a2882810b680300000000001d01c8020001a41982c04d200800034462084039401000000001e83816601000000001d0d02cc0200001021a0881ea00600002043411015400c0000258c82606a8018000e42841b0139004000000005c220598056a09040be012f1401c1a5067843004c0803000000018884054c03068418611c02b0200c000000e210c0a730100000001c84603e6018000b328c740329004000000007c1e059804000000811cc068301000014992080f486030000000289240d8c0391839d18e80a21200e0002d8711840b940100000000e46202c6018000001c4430224c0400017e4a04404c20080002cc940880944010000000c22880d8602001071ce2d40f6d005,0x1223088605da008000000510cc08930100000000843202c601800c10c208c05d9005001461d8218145a00a0000000000340920080000000088780a60100000000000f0148020000002702200b18080000094260900b400c0000000003c012401800e519a0b006490050000092431d01320060000000000940e20080000000009a01440180000000002601480200000000004e0310040000000000940620080003b04a0e81988020000000d02500e4c04000000000d000990080000006910403230100000000cc4a014601800000001b12014c0200000002c108099806000000006c4c06300800000000d8880c60100000014848004cc0400000002c13809980600000000006c05200800000000b0880a6010000000000b00248030000000001b00490060000000640b01c300c000000d408802860200000001a024028c0300000000321203980400000006c0900c300c0000000c812018601800001a01040098c050000000370880598060000000068240630080000000000b00a401000001c090340d500300000000721405980400000008239034300c000016128204986028000000000320148020000000000620490040000000000190320040000289344804c80180000018c4202f0c040000030c47017c180a00000061108058301000002c9545804c801800000010844058c030000072370700a20060000000064580530080000000c45a044601800000184550218c0400000000322e0518040000000682d013300c000000ce2d810c6020000000188ac088c03,0x3d038802002c6488818145a00a00000000d8440f30080000001a44403c60182021c305301e81006000000003c0e0298040002047114c0dc40100000018870380a80100000411d0640d90030000000411c813180600000007219016300c00000017024036601800000001909034c020000000000108190020f0ce08c0c0a5c40181e19a1181811b0803001a32c450c0a2d005000000001a120798040a0890c37c0c1940180000000001281640100000000098004c8040000000002780990060d0cc08a0c0a5c40181a1961141811b0803000000394420258c040000007088804b180800000000e4440f300800000001d8301c601000000003906038c02000122408c606e2008000244850c80cc40100000000188681e60100000000320a03cc02000000004a1c07180400000008629037300c00000013424038601800000014884058c0300000000000a03900400018c4c0cc0ab40100000000000880c40102472071c30259100600012242884066200800000009241026300c000408e23181968020000510cc2902250040000000004c18198020000000004f00b200c0000000009a02640180009120473032d004], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((0x102c055226016385af6ab1145313ae6185851faab75ca0041f1a360001c71eeae) <<< 16000) + 0x0260c1f00840b04dcdc1293267ddb1076258924870eaf37f80cf59c0011d3085a2eb8d4c6b455e0bda2bf9494cf8d4b3080211cb1fc2ddc358ce12989531daf84baff9c1f8a89ae17183e23a3aa3bb01dc7f7807783abf1bd2032c716f63f9e79582dec58d5ec0b6bf66e953a23d6d27d63d4929f69065a2dbdf2b69d5ad45901a5eec8122c2c66f27178120436c7bbde478f3d8c928698523b9a78685d594897d4f8411f04f0b62df7e607d078c310119ee2104eff55f2f49299a6546a09d0cb82533e29e0ffe0c2a069570e91ec171aa0b32246ab4cef6a2bc317a05b221909defbb893cb952e534827266bd97dad22fe65ce6a51b8291b0ea85056434a06a42560001fa483788fca044204dc58c02092fe8a1848405c3140c72d73c52c00022fc8e500247d98d0703500b2c5024e203e01018e010000b590d80d86b84c35817808cb29348707f843192083d522ba418035d26b612020e8043c60612d83678a17c061f8f077c5c73431820f804000029087782f0608a43be628611c0ecd2187e868de4068208ca77d2680022d79d04a0840010c38bba2da21a080cdf8a7c104205d8db87800670805124042100800006a91f00900010191da0dc1075d6ec7a3c40dcfc0aa3c398fc513940246f8ded73c21f305bba0800008f19b66042000840e06e5c8e6a7945000063249d8d2005d6523af64111951ea166d4c10000248bf520084c33526c588044bc4721dba400115dc2ea350000be3052dd85de400a4091450000835d50b1a400faaac99a790458e1b12a6f89a1027a0e53097a60800018365251008e1d9d7c43e1c00480b6a10b182001a1eb7e55e8000b90bf7121c7c3c8016018000088c80022210ef01c115b355b30886b645b9ae806250d9bae704080cffd41043589fb9018000113ccf30010004206809eb03e93c5140002b9f7881a402339cae32c411abd21cbdae9c1034d803c3980825e713c0b41a60000020293e0800230412eed1100113822880b54a2400a80b0000422608e7cb037c44367c1af7240309a8a4960823e9f1abe3810346173d0c0000b9e1a98008002103402c074de020a28000501b8980d20147128d3610822ef9a59459e4e0413d10169590104a83d441ebdd3000000ec3ce810003f38970de60800810ba87f8725e12005806800022520006d247c024000ddc47641400197c41bc67c1537af12e604a4d5ab60a00822137c46083c010e3004740274e0a219d604cc082de79038e0030f45f949010800200001a6476817a695bc5820071c0002abb828b0f0877303820155f3a01a0a886af63cc0400005c943823a4e790a400000031e61c01f2bf3f702908210080ec80800073c8c806863c2431c0a0003cd23de3a0014b9316e06c43762893a40000000000000000411fc555cc88b01c2bec6fa4654989b8808425082083841045826800800a5c78b932923994c3a225d49bcaf6916d90ecfeb6573abff0a7c63519a115abe004fb02b9b8c4d10942fc143dc0a1ed010f6008000c1cf1200b206714304db669048b009ffa19610bacffb4481ca9540092820f004200802008000022217e0be93a9d5122ef3942dbc5e87ae12fe1458112dd1007601944fca1dc2c0c64eba889be904400000000a048187ca8e9d1e5902310a0f9a13921129755ae8bd33b45bf87dc76e203317ed02ba9378bf36fefb2629878848a702680480081a5b446c9d4b4a036015771b797f2350a291c7f48328677240d64f79c62a2ff9061a8c461052a4ad1f4f3fa5ad7cc2e9c5d7781f64f97d9ab6ddc9f4970e75c9ffe71c191d5fcbd74d53f8ff9e7e01415112db229167d9ed95c03d22e9b118f2803cb2485f41b199f58799d31559098dcd59f2e1177159ffa202a546f3de646188186b67477aad0f678883b8c5bb7cba159ba9a5846f63887283241a295425834a16a18185bdd01dfff4d99cfca2201c0ccbf4551f15234ade7db0204f6b462987d67c417fa5f941c835b1e9ce67e996dfdbd75526fa34e669f42b8d36e014eb607fe17ec18686a0424105955c8db80d924b80178f44f45ad96d41eb6c79bf53c7c60b615ed27566a802d92fa378db4313fc904fe0859bc90c7998a99d3f5c63c6936d5af4232ce5cad1d4e5519d0ac9f70ef2a30566524000393106f0900066491eb0d0f50687a4363d01a1e70906204c79824001d7c4078463ca0b1e401c0b06e68c7860a4862f5e85159443ed914082aa7fb62c08ce73f8e212880f804078c17e40072084110442f67cb7180000803600e0012d55130a00026329cca004001081c107656b10200e0867d1e401664c8b208c8edb3ff4001f00400006691e205c101f7baf211e401d618c8482377b76b0c8862700326d40301d49cf422097f4d5be4100003c0fe93801080420862b6e1be6cf205c81eadc04101199cfb891040001635420c1149a0ab66020a05c86c914980000082fbc4000c713c14e04008beefaa82a900250180000ef91e1010001b61811b1e37631e100ccc4ca38011beb1408002c3e67b2000f004207087e11174087523a3ba7900b913ee4822070d53f48003e0100000ce23c40b820026998c03c801fc1b941044568c383910c134b7e6a8060f7a5a4844135a369ab0200006d0caa70021008410f069ca3ca20780003da1491345c7d6c6ec208000391b3c402b2b2c4bcf8a10c4cde99d420a52c1dea3c8804c2e061f61000000543426d2004a0300001df23c20200036c2000a9e47804400160062dc0d886ec5127480000000000000000823f8aab9911603857d8df48ca93137101084f10610410)) <<< 16000) + 0xd08f00b00100c2cc85c503401a3be020001b63c28f42e73fc514142559e82861b6a7dfb0c38bcc8c2b18102e977590c04d01f3f8040000001edc00000bdf920938e10804000062cc0b0456e574b1e3468824305192cc7e04042649d552c0dcdae02025081e00861057da78cc1c8e3ba6182d9f6fe31014b580ce14081b00400006011050980984c4102782a12405bb145a625df24802c2988928f01ab946ca16022cf62db040a32abfe6893080f8042c71a9e4c8a80a8bf7827cc1443fe0ca200c12603d01c0163078e61002dc362c5026101f00800009591de150001431d163191c1cc79f588fa4b6b371d134749bd71b930aa59ae7784e38c27ec50c0c02a4e48a2d5ba6e0cdf085b57ad48f7c9b29f729e7b2771c50ab8cc822a69e4b21008d2f94b8d97f61b7ec795f24090f788356c873d0c5c998884206f083717e0f2e297083bf924c2c55f23a351c25c90c371869c9e4e142d3c5548aa0a9538db9ecd2109df4084c9f232874418cf0eae3bca3c4702e0a3e09a3ff3b8035b7cd46bbebb4889c449e0024e0eb9084bfca6fe759e20b49c2d2fbdbcc51d26ed489cd52211cbb4deca8bac1d74794e28a8c40d7511b8c539047a4ce564569ffd686e921d537f6cc40dd841e4f01f391ffd9ca84bbef591eeea4618f484f4893a87be9d4118d5024096467d1bd3bc024b4b4203f0b9ca9190246f08fcb0ef3ca0abcd42e3f4f981e56d0c55ced6978923b90cca22fb34f281855709ef22f4d2080463d71ee3930b436941208463b6acd0000a742001e847a4ea75458b76ac3e9a40adfdef18e33630460e93a9d52c5bb561e8b7bcfc1d634c3cd41115aeb7e143959574b1b169da0f8e51583e650840810448240022497265403a6470ebc51dc70c7f4bcf6fbff1489f778e8f0b029aa50f8842b797fee1f73be3dfe61ae87cdc3ee8bba77940b327eb0e57421738142c6393a66d36a3b3c31714951f2738ef257578547358b9b6e8803b00ca27e50ee16063275d444df482220c00cd09c90894baad745e99da2dfc3ee3b710198bf6815d49bc5f9b7f7d9314c3c32442822420823012011393f11006f7002bcbcf0b4c7bb6c20dab717c205f6657c8d58b424816fa0a8d66ffcd17a0cfc0f3908326c4f81a4f2704658732cb5a0007384714040010924078a403a4a01c2100d8e806854004fa446f4a7409030f951d3a3cb20462141f3427242252eab5d17a6768b7f0fb8edc40662fda057526f17e6dfdf64c530f08a1470450490040030014150315974b578ade78811749afee79cfd5dc1cf3bbb3ec7e3b7be34a775bd30d3e5368b733c551f82c030614eddbcae8668ab1315d5a10a6df059ecfc2769f6feb6792b34850ca272525b68f7dd91340b2a0008804774b63b81b1db0989a00e02264dc12881a8b5c2c011080e0043c8194ec7a0409f4c820a0c2951c413cc042c09dfc409040780200001a247684716e06c43762893a40000000000000000411fc555cc88b01c2bec6fa4654989b8808418897db0000000015d6a896b5125ca941013be61180000000c1c12d8afda1b183a650e38e382800700680021618010068001491e1c7f0d9c30c236b33be8d061dfed262c1b89ca2989010780203b40b9df308c000000060e096c57ed0d8c1d140b2871c710430118140038070080200d1d90100008c91900d0c78481a81631c0a00026820ae43f2823cfb134c30c86f39d4a43c105d07b1651c0846a7d4ce8904195ec745c480132b0913b1808e62d99ef0400d7bb4fefc403ad764925c81025014713dc9f83b3c314e18b78d0c19adc75402014884205089fcd1eb181e85fdb884983078021438237947211c7563795364508064ae7458711f4347c9588221d4a30ac18196df211d08000d3d743ece0151f6800d9a004b861876125218460280001d1200061c4760443ae1a0bf0d0eb048001558c010040103aa030bf0187080c75007c5389cc33cf067dda2523016bcb9a60423101e0087140006c1892186eeb21a30227ad1f3e78127b5ec34524101f00800006a100019523a62a1d2110e3048374140004f44744363a00b06d01d9200003eec9881417dae583508202c9198d661028ab697f4d210504d6c03298c0441c72641f9c004aefe36625008f936c11415ce304e040c3a6e408212227192bd2b0c109113901f0805295873702c000000278d592ce9cfe70c032ec1b3427242252eab5d17a6768b7f0fb8edc40662fda057526f17e6dfdf64c530f000000000000000000000022bcfa86fc2b0a6e755dc9860995b5f80335f3bd99ca6fc5a7b7656e259da21fc565305244102000433abb6029eed776538ddf7d91e477fe086e56d2eed19ac0136c9502cc35a8ecaba32100ee72c789736a0020172bd60f2dcef6b5511563ea6b47c68271c19b077a7743fb7193ca5df05ed4319f48ba150ec821a535287f39917020cb82ab4001ac8e6685ad72cc77700d75aa872067903466bdaafeae03a63b93c9bfc5c08641e1a13921129755ae8bd33b45bf87dc76e203317ed02ba9378bf36fefb262987845883881820826004008054122092ae0f84892ff7bc51f75f49fb7c352a76a8fe58fed7ea1a143331bc178412359f2bc4de1f1e42f39763fda72b6667255ab1f764e3f7d4481c07797bd3b0caf426539c52196c956bbbe6fd786d6e721eb0b650ff60f4d0ad27886b192c61d083ae8002b411b2210d89086c07435e2a1ae0d0e7868003a348e614f3342d6b9663bb806bad5439033c81a335ed57f5701d31dc9e4dfe2e04320f16e8803b00ca27e50ee16063275d444df)) <<< 16000) + 0x482240e1fb8a28f02ccb18810b005004005045035090d77ad5c7ce06247ae62c8030b5b2c943af4c76ee284f24145e12af539987a3d4cb30c921b118d37af7bbc17a1759b9f0d67052d0b718fa592b791b30c4320dcbd5a0198b8f722b2026ccbab04528540dd30280025d908f0d84704f0420e15f35d22441df9c431d4182057ad51f040c21cbf952b5a08241f21d53f41800c4d38a7e4080abb36aa95010400093da9b3ea55760a4d7c8f7b981401201b417a2a1fcfe97f7248a01358b09cb0c2abe6934f97c187dbef03736d0610f98e472f08680adef2e883918000002196318026b4659c442aca12bc6195ce70c2a02c616a35e3c91410be959c33003d77b810846183e0100000a736e8803b00ca27e50ee16063275d444df482263d3901947c2ad38611112e9bdd5106a7f43fe2efc883a05530000000000000000010d380b629e96dc46024fe907c2132080a5d68078b548a0b1ff000000000000000004140e1fb8a28f02d0c10904204d00057b3745202076516e16c716f62a2ed99b23cbe1ba33408b8a66944ee2cca03eac0b9341f18c702f95f5bf3c44e97b7702998a42c64e453990864fa85419664f943f09a0f0c362ef9e1e5bea021c108ad6742a850d9a10f166022b68b1fb01b370473fea361fcf550824715a5ec6b1d46ffeda4cbd296b39fa0ae739ad6d3524ec1225884116852a8003b110eb05f1948ace7440c08258e2e12d8220c309525efc45c70408628d44decc040597badf8e1c00fb75a5092a34000002d3444038010c6cf29720fa100856058802008020000088c5b81b10dd8a24e900000000000000001047f15573222c070afb1be91952626e20210a062058e30820609c01a00e0180401006c010040100000444000754c78734da28e79562104fe907c2132080a58b6c4f7e7a12a159e00000000000000000111be2d8a4d89216cbf8d1abc1086928b18fc8a5cad0112756efc000000000000000004340e1fb8a28f02cd09c90894baad745e99da2dfc3ee3b710198bf6815d49bc5f9b7f7d9314c3c40822010413402402ba1ad32dbd3a6f165829511d452ed5be6203ed23b24836fb7b6474a3896cc593867852fef1cce62906bbd43d73e2f4a5236e9cf344d31e47e16f64537ad0ffdae33f0d3f7861813835f70fb5a306a4d3f681afbfd99ea0ed62bb8a2447816b0a88bf677283aa1b46c350006ef239c220490d0005a211b21d0d88e86c06435e321ae150e68a80058bc8e614edd1007601944fca1dc2c0c64eba889be9044258c40838648210228020028a05754f04f1374064937f0fb521894011ca78f65b119364608d17ccc1a407878f5eb6fa5b9139e33895400090082b98872cb402c52001b0a23949a1c925001f079f286ed53cdcc289f14cc4ca1e1ee569b470cc230e6cc40c0aaaeb5090026371ba40261020008614414282ae50f2fb77ed6386186825bc3843195396c81208100040000364f124d52b4ee77d236038e354deb4ce048d0584b316b9550710793e4027145c3047b3a0c6072b984288993c30742e46028a1a25cbb66a8263684b15b81ce8700382f5a4efb245896b025a170f31420011d0bcb800752bd912846d3992b8800d11d217e3d790e4be1be50cf9fb425faea4c169ee63dff58c28e02900003d32234330dd05f1210cf5be448d3d2e35b830807e8329e0118810004389273363222468d231e8c1841246a68418204b42f9128102fc5b0b2410484eb763401fac6b86009c40800200002ba47204438e221c6090001321c1ce9e46d0a9d0f03b4048a1b3eb46cc2e97fe001c49917038c73aadb8fe1001154c7e74575a97a2070081d17c129f6413e302009f142f4092bcac28e0b2da3b00cb5aff3b149bc5567d85204509c0e2808000a288df08c71027030a540fab8c07942306b76dd4065c7a081010506d3e68d8b39e182acc082fe6b16611605d4d478cf4dd33640133b219621e61690a0058069df7216f0c20209a979804e698b402746a60c7303a06c00013b11bd25d0a49b13996e7c50deced83caa40b21897331cb973a2949a040238a5daf6f918df6d573951a0a22846b2fa32e59b87259b2a2c4c1808aab97c3435dd036882998a208a072ca0ab93eff1d0f9f2238d2047cfe32b0deec80eb0fa9317fe96541cc99aee5385c0f400019c11c33588910c7083638213e250f4b881091a2a6a1a408140ca9aa986101363ccbcb04037bacb46046e8bd3bcb00852261c841009c9080021c49d7895381234b44b5ac90303afd4cb1028243ab660200121210004000038cd7ce5d73a89939fa01e38a6df57f03987d887885d2f8cb4b4833002b7f2087b154bf0251bdaf80000000000000001eb5b1ad8c9a0816669040a38840030008a35434c7ca0f85af10b9ba07cde7e70d41945feaba43ed20f1e3e5fa0f482dc8a0ff29cc9e0bc272cad58410b0163b55ea6c5aca2b4fedd50c8fc068e387b1930655aaf10e2f17cbaa63701b3033b0cfefad6cc1a292741994700040009a446fc17238bd36e240c43a68072b07cb0f04389d40da473f1515de4ac48ec21160811390b127de5ec9d86ef13291058501b1a73016a03fa15d3645b474a60c009b0041391ebd161a72e476b3c808028414055879a1f3b5b4d27556908195dcc7711aa8e9d1e3c1e4a6ab0021bfdd8c7b3256990994766c656423f05e995921fe85a81cbc97ab575c8071194d4ab6ee38c60d4260000485237c3b8181628fac830674e0a8cd142010e0e31060910a76070b023912f1c64008aba6fd0104005098e08402000029646f4b742e87175)) <<< 16000) + 0x29098fb9b937e40bcdcacc8f3037716b230e2879b11e40f9612de5ec28457e9bbfc1ce4a003ad86044823d51805707b649228aa027ca5862b97b7fac8fc40a71c686bb8ddcbd5c413aa499ff4f4a80941600002ad20de6a1bc3100084491bb4d0121286e80400457642a027c293e47858b78a114ca3d7841c4092c12d3c8241027897c126bc1c01c08b7fab90c048fb923dcd0140501150001cb5b06ae47c0c4f190a9276664290280000f51c08cc4484b34d0809dfa1a59bd106084f74353def0c0073a40aaaa40a04a160c2ccdb0800ee5d279d162280a810887f0ed034060bd7577b92a080ca5f83e07d48dcd6682c02c00011891b9410dc0e86dc2636c0a1b50140cfd7d5f2d43841793b6d4c305ee8f3294428452ec1b5fc4002e7af2cb4381112c461b22806ada3fd362288a13a4de99e4a06954b780553a2120082812061f2a3a74796408c4283e279a798612506502102680400060300401be600063436a61921422ed01a51dc30e2626141e8cac5d9a4ccae2c3fe61238b306b41200002fd72404e1844010000169202c238af3ea1bf0ac29b9d57726182656d7e00cd7cef66729bf169edd95b89676887f1584f34d28c2491ca0cc04704d00c020080374a372e57690c288343a0c93499e96a0090c2428d5a2a83c1003a395acc04e79225c726042200800009b90b2050588282c014000646678d592ce9cfe70c032ec1b12c82c72871c5103201340000000c0c0080340003b080b86c6d016026038849065ad2092f16bd06dc2ac2213cd34a3093031c30c334020030080200df3400b203e230c8ff926d28d296c74659b3499603a282cc2475d2429c1c304c53adb898108802000026e709818562bf8d200fa8556a308cee200308b200b56c032182084caff9420a1d3189f438003e9fded82708220080000b391b305e1356a07ab82cd202bbb66e98184546c8098bf1821ebe1d5d1c1046c14c64650e0415dd7ebf81608f935487ba1810079f4994c6004c962180d8244841380e3a89939d7ce5d77a01e38a6df57f038eb9c3bce910059ce8e37a8df8166ef4744856ee99d65b03893f385088fd183196c642c1a033591be1aa1a41038c11c010012f39fe234e058cfd26e9f0e2f517b90256ffb910c3f3fb131e5b09717bea4cb4e0c1b159f9f87a5f584ead23c5a66acb8d1dea449508e030e8001e59047010002f811b2150d88a86c05435e2a1ae0d000528918821d922dcbd4139246d8e2df83a9428daa7ddbd0916d2e1c87a4402acd98e5910c1019df49af160048e2512904003e4e208082280a14830250140000e21a048187ca8e9d1e5902310a0f89221020a18810e094002008a0284fe66871f91c0307c65a9a93746e3eeee618ab01d85cd18845a00033e42601612e03d901126e0a01df4ac05382221e0c02611c42031c3183100080504050a2375a0e73486d7b62347a9546bf5f18f060d901126e099011026a00036e4005c908d692ec80e93a9d510428051271491b5c81275e50a00002eda245794719189426658cbf88911414c60d05c108401164acbfc5462510ba1f7dc4942ce00916f4508abbb5e199223958029f60803901049633021100400004dcd14185ccbfebb28e30409778420dc28adab544abf5612255ac0fa73c104081f7782f52be1219cf2460c7f7c406e447f39fc1a0e12cf58a632b4481b4ae5a031b41690105c07000022f3b20224dc1403be9580a704443c1804c259259041050a48a50848830580001006d93e81d47f5288edeb193f142cdb929e30917b016dbbe509ec0b860e244be71a89c02017c06939a700210080000ae1a297004d8cfc2247e28337ef2dc514ce069436fa24467036577cc0813b98f45945224385fe4e1d16c80c2b34bb73f61c20acd1380ae8220ceeb78ea568042a028000102902409800257111211511a077a48d54850e1c7867b404038e64ae26e8c284886c5f2c4750a408cc729e829ca486ad8905ad2d0406c3b811e0fde284241faa2cceefd08042c02c510a99c19a9123b04b4111a48c2b486036922359989402408a4997eba101cf7b1f7900803baf17373382110040000594c0d01193b381902b46145029e30a1238944a40820f45e255fc386dd5fd393e9011fbdb5f7da38436a9da27008083f6b3041014808260140000dc11ac098d58080015a48d50c86a464350321a7190d30c869444348121a3090d10486842432a121a0010cf8080041b08cf26c675263388b19b418cd1ec664c63304b197218540ec658661302bc228aebd02cc1442262589428206153e8adbd08010c6273a310e007c7bb95af14085cfc5595210060796752301410511140005bdf015642633d0c140a0fcee04e03819501682034cce791c071a15d8a7fe0d1e4a82d5ebe738c0f2b9dd2646f2d24c1d02ddbd6be49df29d08fdd02fa4f6a17991c06908d71c5f70f34500031b78f725ce95c632046712d0ac4e4e5b32990883ca81e51bcfb7e09ad6ab0f96bf2d0601d41cc1eb4fbd3e065f5af52c0ab5a7343a82774290cb9f6d0dba81d08841855dc95aa2cbdc1fe08c1e58e4299cf480781b13bebfb295720ad203993e763a6a49ee0ea538a2da0c57b71d6c43a9eeda8ca15150444cbae24c2ab8f2ad019a1f1209d66200cf98d6048ac5845d6fa423cf6677cde5542920522df63d16e1d170476f19d03280b05001c020040103260ba043648b0d230fafc274fc7ae8be8f94916b2e57bfd89d096304c4d6020b996c527113abd8686c6c6beb500608f33f410ae878592acb5eae83807a856e324f45f78fca2e9354a22)) <<< 16000) + 0x77f2ba88fa252ae61547e7f9a6c3d451c07942d38bddc86bbd0d2a3cae9da45a30aac79283913fbb3a49bf3d32cd55a9459f272605c4026e38e06fc4db1d62e42aaf0f2d899bfda359a1e751069d80a47d7f4ba36100805cd5112430cd72e400029a90391101c0880644406e220360d0002f8119225d019bea98c084306c021008010040c88280000dc80b08ec0077660a0a07e650f1422081d0080c800863c0431c020000b6231a038040080234a8b35d13d0e2861c5284850c286df72a7805657b9fc09020840200001b24630143160a18a050190280005a884f86c14007a5190e0ebe0e10a4743ec0417a07d3bb1200102a6c390000689de304a104001018901f164621a27e406289bc298187c2a9c02811841000438b88693d519030154a8b3080c5636e46218625072bca28203b56039881060acc7b10008d45858613841080400005808001121e674ff94aaedd5f50b22538bfb4fbc7d07d9c6653df6a1cb1c040000000000000000008c440565c620eda9c0aa24e0a91849240c20810209c001889e8eb913d5dd966b259bc8fb4557f96d56b099f6dfac94ac4dac3457eb0c766bbda38703727c7c2754e48acb269aebe7df2cfe85e78f67db7a79e8c57161b546cec1a3d9475cec970ff30610d32d680022690391501c0880644406e220360d0004131000b8b23104318711c8c7eec4d62239aa727c240c28058a4ade788b52310c2308120f565708794698eca100b9a0b4f7f2f2560702485808fbecdc2389c7bffd7d8801dddf11976a4e84a1cf2100102d73e0e0124aef5e88208403f33433cc678e788433c2dca1654296d4f3df92058da112b5e2db9c270600000df48c318c614b6308531832583790815c76304231810d8c000c5fc072300c7dbaf078a7af8f13b98207ea5e4cc2898ce532729e13a71c39be50552de69041200bb821f44280e3943ca88001481c220140bf02e4605eda6652b3c521ef0198ea244279a9798cd144473e6e32213c22f772307622825ab1b083493c036c6b375e82c02f56d8854b1005d7de3dff40002076c5c90b2cf2480a00a000046a451057c22ecc9a2d4421035dcc37f2a14204ca9bb151d78b05a5d5410fba920b65e658d8e23808d2df57d21e5817c60246d060600ee7f2f56930880a2b794fe22249304141581a000088c8be94e239dd6ba0f9c34602b7288e32696bdcf960812455a20e0855c0e3d94006451ded0130610004223829995d62c60011e54e38dd2c9ee18b040bbce798e09ecbb3ff1250c1f00800007f917c1182600c5ec076300e10fd81c6db8dda4a882012af62070051770f80048203e010898ad7921096402036c2658ce0466e78e366e68f446815fcc19c0c03a7963e2013080f00400004988bd0685e4240004807c54aeb165ebc0efa668c59572d8b6848911ca00557f14efb8a7df5430b2305109bac9e4b55257dae653aaaa7d4a1e0267c8a46e8c73bd964f4e5a7dee62c04b5905349987d4ef9f25e42795482012539578614d25e96f3e3453ceb58105981417988b9d378f926d8e57f6c16a7290e7c005a0fe0423787281e29c31ef6f03e0ee2313751881bc520000882451047c27b53f193ab0b0e01496ed5c4206b33f845fb310221fbcc2f718608791ccf39ac20431f7c28e6e701d338821b2e2c0b0c13c44688c01b21e8f40d0110123449414816000086c8238a8002e8086112c5e04720d3dde6c4665803a114c34dff2806d0f962ec10c0ba953186b2e9c31e3ce20f32903a0bc3b9a469801c75046a7115fc908b1ba3327e7b86af0cff910028b0439548f58c00008712ab0243d7c9b8afa06019bd9e6b5b178ce1efbf8299ca23a952915c1022a29cc7571605aff4e37e49dc6958a4e94bf90436d681d2aa0b316f8fde6f52d533b38cd08ad026a202718cdb45ebaf0dede7e04d088397739494863aec3d25b1735ffcef2406f8d777f48194178f006cf440a45ed5d865113ab23c29e4a0ec000188c8bb9ac5d8c62ea5b174298b98ec5c8462e21b0b001d0e07bd3a8c8dbaa6b6c58f4d9f6f3e7885900bcc102c61a15e63edb7ac0bdbc0f19409140169a0e85807a49dbc314c62e822dcf7301801bb5da8ee9a330ea07857dcae25be1b38280077a5c911ec7177dacfb459381e1991c00001142e496ff1bf2aeb98485b5d18e7a16f463727e3337d5c04563966cbf8a410633017005e8e04c61e9143815ac102805b827029161009d94d0200e934339080035241e0040000821c0d5b4b43aefd46cd70576abcbd551ef3b7b840a05cf002eb2cec526df81cf71318d731938f05c61ebee91e21e4f28d5cff5e040d549b84702147f0b37bdaa321184312b0976f5cc0b00001fce53b07eda3967e0b001bdd70168a2408402bf2b96c765b4e67db95bc877e2e020e0a00e893c878a12ef416ede3d35bb52c79dc093b69039f7a4991fe1da8a260c6a528881a8000248916f298b70cc5b4462d81b90c2fb22c21031334cb5c9095888fca2021599faf0408410833f440a5a84b20026101e0084061cab9423823af35a292161a878a8409464d55a212080e8040000334c06231daa8e855880e0846938c61653301a10a39f2485e35b0242a894b9e2b996106003c3f05e9b69f2008165b8c571f5bd954b441430dc1b1c389b6863aa6ed3827f391f5f5a3248581b47bd605c840a5ab5ab9541f96090e47fe90b6310446cd75dbd058cb328617828000063c837888000e148b58cc570162d403c1ee0bf4a9c014b90f9c022101d0084030040102d212000037381d70ea32884440780102d00200006530080)) <<< 16000) + 0x100460206bc070110040ecd63860568ca40e08c207c02000014c415c342ce1a1660500009110151dc4809a47c990177075a9c88107402004002e1002877f420242ac5021102ed15cf80801785ce6028103c0080000cc31203402f54405b19af932c12f40e8891820e8040080051202409b819560809742c42573c0b044e137b99781103e18e57d96c0201123c834ebc0058f5f59903b0582841601e00005dc80012311650d0aa068590342c6120004272000dbe744ae7791ad0009fef7813003db7a41c401908552704009080780202941a073010000819148158b104f031545f88131431c76b97ca1034ff299ca81427fbd5c2be1020e83f01443c004015035a2c03b1aade521c0e7a25b3c80c022a65c5f70410012a49a1200e00007c08b08e80041388a098e8480bd1a3b48d0438db386c82814bede677b0d01321f75dc42400a25c1573060034a8e8251140189a23871c11048a72da1883089d6bd090040d8e884c0380001f222c07b015398af96c578462ba1b9d65607ef543319d65607ef54332545d74d4eb5299545d74d4eb529a0e16e8803b00ca27e50ee16063275d444df4822bb100d36fabfbd00f1c6be72eb9d44c9cc1c0000000050240c3e5474e8f2c81188507d4a14e00c00b0040e5874b76a0593adbb82b456703287e6ca230566226720a9e8e469f7d8b7b2d31c0a23c9d8a2ddb5828b34d748addca820677bb510d11c180688553922d4bf77d8930ce404fe35be460538f9f41084f124a2b813c18256e3d8d200e044cc780029b518050402318200080ad82c56817008010040ac808534062b003825d5d7b10f00a39a53611040e804201002008000022387da01efc7008f14c6e04830700100000e870c9fda24e6837e0018e24083a008d078f329bb3801aa21dc48810780200000ee455c242ac0a00012e20005164554642a832000331200084e454ca62a40bc184f14a40a0ad9630492021b5b9cc003ae3bfc0024101c0080a880c5400629e0380802354e25898825fd85846c5589e0461838010b10964c0b02c211da396d002c9546ef0230c1e008000052914e058a682e22c63e7cc4f08bbe658480224cb6bc2411686a2a92020e8043450cb9fb10d0cc6f79b330342de1549007112d59d3c0305be5309410780200001ea42342782909435a260626bd0e9220dc105faa6021115c55848103c01088a116ffee0c0c3607654a20f9109cc33c0122a296012040f80400003488000dd114c0d0a5868000fb08002c89e21040cf6090084b1d70a24000501c0200174c293f000024201f00800006e90751d0a50a81cc04000fd64524a62900ba0546afc4e22684e562f8500f98a07d95d53f34be6e67995602cceca295b8650890459f01d9e4a756a0ccc67770ed557f7893c02a32f9fee3a3c85dfc20096890ca0097894e7abd91426bcbaa74ae245b6bc06a23ec8ce3d54122cc33ff01eb6620000080e7fce1fd7105b7cbbbcd7a7db7bd686dc58c1ffa18a5e595c4fc135322938fe6e4acae38e6b7fef3ae92daf18795968f8511e2c4ab59c6658028cb3e0da1a643b0e7623c752b9bb4868e127cefa4a0499a9383920a081872d1040094a07c0200e60a000121228e5a146210a28a8001a388a210ec551beb80248222c03b44204258e1b19c010907cff2c08149c324300b0b19ce0141000498f07c02028612142050000b5914131d097d36d126680081d3e16500282cca703005564b878280246d3f2a0a0200092a01000405002427e0a06f010000ae113e3509e9484f01400382e400e4f480294910980984b80ec24f2c6f0f4b1a2c4e9213536daaa13603eaa4fb772ddc90bf562d499b11e6fbd19a63ba19fc6e0d883ca00227e318201e125c69b3d88b981ba90b191473dc43bb2253b2654303808f7a78049802d9724063f991caf7e8dd338c3242a0500510d0e975f3bfa25e0df41aeb1ce50a7e219ed1411807321bf6738cc6d91c93009c50ef28191f7824ada69a20da506376dae04721309c803eed45eb07907eaca5873b555a02eed4b9af15f79020364835cd3f9f2341d0e0d4914f08975ad91f2b9542362cb4488c9da4b5db61c5ce2b8f8b06fdf05709c6902f18a7d45b9646452e7d191a2b8901819111670d4054878386417ccea8719c2312044501b2d7a11ebc30035c89a173753320a00a3a0dd7c939a1c20013a2fe39bd0da222802a003e7d77065bd3b908b7d529ed689a328145d7ffb966307700d2a54166643a06c58e225d43b071fda5f96c1a03121e8502c0665edc26381517f77681000494b07c0216383463a38173c62b830fc3b65d12914509ddde36ec624a352bc458a289da8aa88b47d5d723e26f31446ab5ee23f25c65ca4e178100e3e54863b7cff9c594fd391cd1184b0bfc9d67b8863bf986da5a8e092d39f409fdbf0e42518556c06f8b412edc7a105cbd6dad7bba1a136991999a0039a4437c097558c67134129d56839c99624afac4e7bc06496b047163c025d15ac111353db44dbde3cbf9dd002990c020273f5cf40284a76a92a639d860f6800989df746f7902cdee12d2553e6f42b90def43e62fe1b77613b61bb68aaf4a08c7be13e11b01341b12da8b66b4540330d639c9c0ff7e8273af2408f7b85ae7c4e58e7380c8ef2578190ba3e434da91e5a4b5b8f56e9a192d030404ec342740a000881225a431391989c08c4dc3611a0bc06ad414df8e0b385f8353c03a0c1e6650118630b2480046a3e760202000129e0f80404d82424812000140226a7b1343989996c4c8462621b814008022040020081301906d088000)) <<< 16000) + 0x13089790c4b857e665d0287871f6f27840500359d45604040026683a0080000b5225a4312c1989584c2340784001ab6cb401cbe7e8a0100153e737010008c907c0202541b12905e101e84f528b040aa3e39a0026e6bc33300a6cbc0a8400dc34948c1000494b07c02000021c44a0a402a4a1271d0930a8494442481200028521d462123250910a805c140009967a4ea75502cfd6f8b85818c9aa3955c882139d1c6f51bf02c8a24914d00b007006001401269f74b0b6e5197fdb9baa59a0876840d471cd7bf6931110765b3fe1d4c0a940024ed078965ded37b3ce053b303a0af4000a708009ba100164d3236644e9cc01c755a80801bd918ecc0e31ec07fd02a01a348d54ad512a6aa12133e102d21553c4a39f33c2faf83a0a05ae67c3f5af246a2106385d4dd6902802a000cc3a1c888d6f0af5624b6c9d67ca8304aca1435a8f7167fb4a0cd5614017980d4d7df4e3620286d0872a3cb79fc34621c1c67d6956ed691fb70105afcce71ee8aedbcc00b564750511c0ba2b9c51359b8d38aa36380a4000131c80113d90092fb399d6be4df0e9324a11a879da6d729cb2cae28cf021c140000000000000000f4440c30470060050154014005413a9c3c7be200786984b4073233d554799169021016ac08d1bf60339bf579402c4f5993af56b6c9ea1bc4f5757632a00d698ddefd7449239f9efd1b40eddded650b4a6833e12d6c81dab8901d5d26c7da242020003f9201329e4031024f0a3c07ed494b0b8a05082770857acd87bb020420af7b4bcec7c4860000eed9b6a2c68784008914c5c68324b7450542d4989847c8dc5a08708f2fb5e899881450e62967a92a88500b0a18a254c3c0705080daad79c1033c7b48ce86110aabb1685040d7c331a5008ff4569f1c088bb77a802080284c7042010815aefc1d32988c359f1ae4cc477225202890abe6f141c9fd52703ec9435e550a0182154ed35dc84ab96529ae0cd83eb8400e00de6fc35f0d283d8abd4ffde15351c050036ffdd8f00e538a34dc588394ef620280b08bc09d517ceb0a99708a4b91c99830faead99219ca2cb652e62f0819d300a1d9966ff09e45f4685c160eb99f85884ee80d3b6ba6b342f8e240a58f22d80cd05c8c8110b13421860e30b8d0c1f0c30f46028806153f2260e2b820452f41237c247f858206096ace6d9c2038068c8f0d60e7b6e2885ce834cd5aee64009c9dfaf9eada14a1c1a9bd58af715736324c58700d0a1cdf691bc8d0947b77a7571b7797e9f912faa78526807a715788c41e6b22d8a7be278e35a814d209fdd24599519312ecbf72f738e315b645b2866650f92fca885d9d6637272042074aa8e5121849a681c7ff79901ac2ea5f7fd598602ec4caf5e167e9b29024b6180821cae0b269ce7fd1e9a03a905468a3bb0b06905d2bc3f10407db0074094883acce38004a3622a905765b8a0f37944874c69c27b1eae619c04c557de083132f996cd6961d40132bc979d858c7200ca34ca1efac47ed2962221ec5de9848f5be787136664250b3b450e76ab59d838d1eacccc04080f37a76c68409e8e36e304390d61ba68042c1757608204c484001000013b22400a0007f02001534446474001ee64090c623e5ba105deaaa1718dd3c40d67c09d25eb3b0830958021f6c1d69a4a0411e14e5e5c99643041d5789fd0b2504a0293216f8756aaa870392a2adda8dfef4404136b7a776b4e82013ba135ce60700c8a14117efda3ab040abdcfbefeb22144f80bfc40c648e0154bb9ba61b0500ebf76349f7e1001d22caccce010015ab05685550b35920a8aecbc373101681e04780743931e54cc8e346d645a70c2878982d58c106ff4ad216010b3a44914000b67d7a004c2040010a1c055d77fc71a78cef97470429b0eabc0231020008000056911d1188e06c46c2743abb5bda41c6fa7557d230511a3c394804666297d1600b942e9828017ccfd442802a509451009c507c021c40eab3f99103cc5b8e560e185544b718e10cec9e7aa0482040010e20419e4588b20b5536a4481e01025d7470cf7d9118440809fc40a060029b8f838026102000800009890002252234320dd050001e110006152232221180d00042e91173100b1084583422a12000b30222862001c632226a31122983500fa4ea754ceff6be16000018f319d3ad2f7046333ad7c9be1d264942350f3b4dae5396595c519e0438280000000000000001ea8fe281f9038167b99b68372cd238c4d8c96eadd59e5621020c18e00c00a00a02a1be3cf9200eccddceba7f52ac75364f0e60008e9bdf6193d957621d945d4c63ce36290ccf10a249fb7801ed242fbe7cb9f54f540ba364f59ac0dcda0c3fdabb91326117937d9e928bb594c1cd274ed97c4ddfaa98d103f3abb0fab5b61750b89d0dd0b7751b14a3e0693e35611349107b22bb219f574895376a148413f9df71da0e7e991c20f717444add36a212602412c833f43dfa627b53db9a52f6e3f8dab4ea662a5302c412150c05b904850068c33e6d0a4cec298cae5bcf35aa4fbe528a241fc326c56aa60cba0960701174c7433b06afdf6a4218f23298fb3c2355d809ad8901420a685c50c00030e6ad215807719350010912b60bb6be5b800cc175424b0f89af473569f599b0f65e81b1eb454cc0f2a296f173d76459c5f5985a1fab5f5c656f1483e660736ef798985ca030096a53ea5cc21f3e8466fe165a420c7399420100200881400002af48ba34a0be6c4b4fc3964006c4d97c9d481c16717384fec30c17fa20845d42033b9aa96692186100e12d042dc900033c69d62c3)) <<< 16000) + 0xc0011e1fac733bced94801681a2050530372a3c8c3105a7183af1a20048ce85fb901989c17c970101009183515f0c009af2ff5dd080052edcf17184000029c936e0004ea5cb97db422400a00900003fa6080579b511d69d20580000a031376103835c8d6cda530c19e6587a0d62606181a5cb98a9ab06100a77f24f21c140820209e1e055a0001b7fbd4f79700045d849c7b27d6ebe48018020206016920fb9e3186535e68eb07640807a7de293f060c2680677d770618de466c266b18202d2a111eba60202f4baf7c4020021da7f404b8004109ac7ae3ad2b2005605800021a2000902400238888886c440272202f30ac41849655af464024069388ce001ea2284812060f804205000013619be40e0fb4382e0f0c351cbb98b13a4081626acb907981800469303c84861e43f4c7e10618e252b619308005b551b444f0006acb063ea31ace400a80b10301331ddcc8fcc61a4c0115916894810187a79604c60a0c0c6c5c5abdb830c3993e22bc5308080d262655bc806080637080139442003994aaf599ac00315df52b6939a93572006008800024d3c77746188fa9871594b04b20d92040e966fb9d10413823c8ee9a42420afb22d7bac7045f48a14b66141239e4e61c98a001d2c467b16140052cff14eeb4e48015016015c04000448443c26000d9a443814000fa040044d08720ec38c6616433053198290ac43447d2753aa677fb5f0b00000c798ce9d697b823eacf6a5a07f1b90966ca73bd52a04d004e453a7667c6f0980000000000000000103cfd38bdc6a45c1325a20110692f261d8929fd62cff830600000000000000003e3db28865d99b5f1cb271c6710e7041cde6456cf435260c0000000000000000f5a0e321acd6c0b52892872020c200037556a7a3ce649ee6309396632eec386383181dc2c46c1f9cb78fe92c1c5dfa5b5ddd244a14489394454ef279ffa837d01260db1b1c5969e55c8b0673a62a78c29ef23daec003d60c97617cc13af4e8d536c198970302405c217d498d985618dd0af8cfcfe46ae1f00a4421b4662e94255f40ac343c912caf9c635144310f60416f88215b84f554ca68ed5f7f6dc22286a90fa3c7c00a189806a25938b015fee2df560001645e26119b8ac90029030792290071a178a2261b22ac3790433606e910d2862c4230947878a104c757888c0c8b4c82e791a011697d6098280508e3c26be000b4583d496f492004e0480001f322180310b0188500ecb5707c5f91f40a0000446a5a2c9ab91bf79b1249e79b0c788638842ea0878493827d3caf0e4c300801a0f268414008069a2c67000747d0c586d83b20050058b2ec0e8767562050000150d082c92c3f0666684935a63576520e20acc76d0fd9a0a2803afcd43801f9a475de65803132bc60100012f0b36da85124009c0900003e644241765c78f4de7762814000024d6ce124a413cb7584c7101e72ed2ffc0a2817017d76a27023b501175711a0070ab902a506002b0c64d40e0000bbfd7e8f811ba400a80b165db7a20f6e7205047a4ab9e01649ab604c1f9924985ba9a5301c40d6ea28c581a206b75b09c80a2069458398c9601857f84e91100199a38ed086c2400a00900003f843fc0400087842343400111a647b6762d07398307ccdc63e091932f89253e38d6e43247a81846028303580808000256c803048a46c56ea5800c824f4c3280332bec71d609002501c08400e8a191041d791b8a22b2a4c32bec23472e1b10200ebc81e3c8df53aa122420000169cff984088f6510ce5273411d324b3fa6c0b0116aabe99a84000226ad1ab4cbab81a400b8101a50be49fec4340a2ad6dc4327e9051100e9d1a751938305494e1cc6812105493cd26240408a9420ebd426500d5dd25b177d1c01bfa45b41400000292edbc14a23dc4801681e00008bc80024191070900982841804000da27c900001cee43091a887cb6c38515b76f4e32850d442ec381c538e4ffdf81441238a2c16104bbfc8dda4383453532a22000a40c1200a00006c0e940ca8ee4f647c82207b61599f0b9a38fa70377bcfc1863eaaae80d574488043805c3c358510001f49da3950a183353150c93e2c018e3c22b8e340006e9e32ac872e94b2400bc101a514e504d7845145dcafdd3a90459c9c0ec8a30dd835496ad922001eca224c28836473dbcd18180001440605015bbc0541b800301787cf51c12004c0400001e938483a2ecb99c08e3a9bf1fc7385123024079a53470c369895c245a00a293ba16243931220113c8b892d8e201c1d3baab41a181517d51be2961000004caa906a0480160180234040004704414160260b10405e1204676abc60d6e492a3751a859fe7c38fa4b694edd43d048cc87e4301214f430c7d6202c916c0028a175ad957819083885e0a543d03ee068615e0824988dbc58400002c250a681e84809003405408180c40806202039272177d1376880e2068e2b11e61d4b2071995e4dd1049206d64244476787183971f52f3760e0c2b15bdc8ae18e081d7bf76de0c0c00764df001eb080006eb4d14bfec2cd3120060088e2c5d47a3131d2cb8ed68fee3189268e61d0891e3c5052eb0553285145eecb2f3da3c100000f116c0b013b91378e2b24016cd547d23c000a6f10cdf40fa12005405800021022000bb2e4423bea7a70925d54600c4058e2061ac579fcec5143c117b74de8e0c00004512c24e0428874f71210904d101f5282c4c007727d27d77000046161c8509ac4d20058068e2c4684f0575d8b2ed62842d84c4925a80e2970f00a140fabf390db05144679c43a32cd100)) <<< 16000) + 0x0004459440b01255e0029de09003163fc14f8000044e8f5d5b82f412005806800022421fe02000478200123e43f8440018047cb0d64d48a58cca1c179f49379f21459bb8b6a696505100ec003a473a104d1c70a90e5e84082928e58d0530c2084abd5f693cb0409a9c9962e80800ef20a5d63f60d74801701e03f4041f8020fb0107d0083e4041f0020002b62002b8c400ae5487b90f037a30c9e24060002e92450e292063690113b9d49a1c11c9a8f1c00012900f8042c80e7c66a067c3c61bc6ced3c39f872c53ca17ee87f7e8c10108cdb9d1f1610428616c4fcf99840c06d5d83bfa240c20d64061724f70900bcf6cb1e7ae20006e28ed6013cee811d2400c814164154afdcc07f38c36713c6b5564a0e200b7e4ea6dce08235885e6322a80818da0212d3dc614102608ecfbfa496002607abcf07c90058c15be5b7dd0002fab52ddbd8c6f0412006009000024d21ec030f50187a00c3cc07a40eb902e62e294407cb28a13149045d0e3bc23461a3b1ec0d5f2be1830a7d60ac19a0a2040be3774781602de051517610c029ab712fcab0001aecae143c96cfd20058070d2869d51ef355cd204062b0d915482300910927650c1856485bebd4ce101028e0cf260d00183cbbe7878a01aa0d1a3a57880169f479adc100007a2dedd49b339c9002c0380001129c18d143f910e3729209562c503aea422888054c778ca064e9a7df1a0034a651826041f00800009290f20187880ecb0c96d0891c0b26d96df568303883fe4fe2dd3c9218fa1b9202134700001a504a0e0cba9a03d93430149b28594cc870477c779d5e30413e8439f4b432a2400a80c123813d045cce244d01575482316af4260d1c29dc69dc90e2446c230d040a2cd3ccf0006ec8bf6700200080000ab1e2caa91cbc642cbc9f4d43910b255f1520f052492cf46ae490d1c38dbabe1434200002429d0b0612b3a74c52411d1d02c4e41050b1b1cef6c8900260207122d29d952411e45dd98468e1874349c48709fc045468403ae0ffc78003fa6f9d3001000400004a48001969c244d747271d0123b67e025816a1c71a4c5ede59c48d143d27c2390b14284c724fea1220adbe83bcd02c3000019a17983806550e708384600fc4f99deef46e2400ac0d01e0030ef0100012290570d00049f9000f2921d2239247f7b39d5d523070686e7a679a891f62abe3b89b2306413fe0463858b14054c140a32930309150838d7bca04de70893d8b41410012d90f14001066efcc3783bcb8929002e04060e00fd3b8923fb271e4430c65d3124162809edc1c105143c7af1a00644fd036001e00400008e1c24ad365e7cae84939e87af72741247a70f783e4618e3969a8ac2f6a8d14267e2d761145845e8c7f6fc563011f840e2da0f92096a2d317f8e410730110436067d58e400b40f183806316fb247f5b2ea0030c58e7fdc0b140552cd98414adbb7ba3400c998be13000f804000048c8001b690ee05c93d64dceb29123b2e09c12e438e493ef7d4a1831334a0210258a00002a1a118118dcf2bbfa5822ab654f269409899421ea8082ed747b48d514801301030700c62df648feb65d400618b1cffb816280aa59b308247518660680193317c26001f008000091989a00002a58dcbe30912b9a4a1935a124de430efc086f471cdab11af2325c68a048524d179e82c502da1157a0e492087cc3988223186055a1873e2fde60820aa5eaa20461afa66400c412183807e98f1247f53b81fc30c4cfe9b20b14059978b8411e36f8963400ca584113000f804000048c8001ca90d30100037610ed110410083b004001ca64008b908758280090708690c81b40400af5041bcb61d45302429f100fbd31df327bc2898b878c0fa92b1f1745f7fe25b966c0a8148c4515ddebc27e030eaae3100f9eaa9126f4fc0311d49eacb6b19faad2ea10313a755213c5003fe92439f5fd286114feae07d6129251318790fd361016104ed424b987d4c42f4d73b15928b9a9e2bf6a7616ddc94c74a2802b43d705015dda9244d6355c5ca9dd5d2bbb6ea787f915e4f74383c42de8f238935132781096cba2cf6ac4f7ed117b0e80b072231721d18c003b47098c42f7c0a19028ac20bd0a509201d903dae87b51e2345f582d8357d733a09273ae17e4462d6f771c134d97ddf7e2e167101d07450065593dde20dbd524a9f11c23acf75a432326adaad44518953a63fe350eb1351ec48892cfdfb4eed287a4d2f905308aa258b580f64e1fa407023b19124bf6334efa67db8d0472dfc4d543707718174fec2a358d54925d4dea72dbd3ef7dd62f5906b0422ee3511339633279c21aed8b361076ed16bfd9cdf6ae0be44561d613173aceb5dabe4708aa537a176fd7062c7b5254fd165f41f276f63476083cfec5c63bba41db96687567b52d03f8dc84b36539dea950268027229d3b33e3784c0000000000000000081e7e9c5ee3522e0992d100883497930ec494feb167fc18300000000000000001f4e367bccbe9fa6028f08540440e999411250fa62046c80400000000000000007c109113924af4ac30212227130e9b9020fb78bf36fefb2629ee203317ed02ba90bd33b45bf87dc71a13921129755ae878a60a386184680848097ec14e226bbdf670c628c8c2fc8aa518f4186cec1dce3c8cd3f9198cdf7e67ef310ab1fe97b400d73c3541e03fb210c8940f6bad0b5c97845191c26f2e8ba35437dfb82dc256d8c9f552df41fcf5eb2db4f4e00216b063de30912f752cd4b755adc0c3fa1e1121c157e5f0c835a4deb58ca2494e3fe42940c922ca366f096)) <<< 16000) + 0x691cb45acaa10688e08b85055239a10b1c74dcd9b6e1c48a0298dabe9451498dd6e32a0a209d882ba44104a1d0a3e83a38434f3f770282040000d04d002095813e19639090027020614156b278918e3a5a164084c48a027699b9a8a291e7649a0828828fd17242082509b3fa90a38434af7566504080001a09a008257394191dc89002601c0000f410e90583780e0828d79e852488180cb61175db983002cb21d52c30c182df1f776101941cc364a3438407bb8cf1f688101dddc5590a3030024a76758020ab7c676adc5d8a400a80b10425fb5a61be81816c8da9ac3060118e6a800c30770d4ec3c80d2bb85b9203840e3368982102066fc76518c0f3bca31a9410678ed12377b2400940700003c043a01703000ce609fc8902826453642394b202395cc3d4e091857a60499970618219e1a84d48616943cae0cc9c810340f748b1143044ef423157f8106528bd87406fecb200580680e701c4d087e5860054c2406f3a7dc7a28700e2147bdc871c9eeeac804a1c681815aa590c9142861369f8f1020e8768c3b0020aa2d310dc220c00af34efe4bf844801501626df1a399dd2ea7cad60603b08bb47e07d47f140fc81c0b244b2c71c61864453022c0140c000080340005008001b610005c120013fa4398361ca13000e612002f2c4390861c63b0b21982988c148361c4139180ed6ef28e210c1692f2432129099670492814a94b02079b86a084a203e010e22620cf7070529b6ad0160caefbb0a211880f0040000298c01004010196020bf01070808328040000ec4380461be1b0de0586e82f4a2929045f382c81ad97a649f3472176d0edd03c61f0616ac7448112a92b928814102664a853c2c015bc460ee5200c99fafef39000200cef34afec6400a00a1e6059f98469b4c2017956afbc059035ba6081341c739c6c36f18162172eb0591a081255ee072740786051d1bbed0342332e31603e9a005cba1ea84384900290280001031a1c9f9c1591e2972460c351296032b33eb44500a699093f9b66141a1958e8785c3cb870e7218306326c5327041c9446c64c0d783012d4a91c89deaa70c082ea3dfed3ab54c2000146140d453fd046f025a9043906c0001549b202a82607a41038c0354a24600073c6310283a3542805148379343048400005c94341123a61e304057feacc40000c753ecd034841080400006e8c9012a39e20e27ffb13b0686334c7b498102a310703044a9af1c06100b05614283e8b2a69093860f0040000534c11d0f86d892a89185615b0696e0c3008ae6f690a20416ce9d4d17828856cf359b1e0c0c073c82e5811418411a30bb5518333befa0b8ea68002eff4fea32d92400ac0c164074f60dc286217b6a1040a0ea3e7ece0d0ed09961a18b1f8f892028bc29f36080164d0c7e7001f0080000a71a1c4db142b122879f7edc34245640eaa3835d03f4c190107c02000019e4090240d40b00049721b81b0bf0d86d86c368175fb436360e096c000000009df308c0eaba30357c8ab82a157e5ba033f8bf0321fe8e9a6fcfee40c049c0000000000000000000000000000000000000000000000000000cf419146591917caf7222158b1fff00c3d322aa8c13e347277550000000000000000000000000000000000000000000000000003299438e38a09e01c01800d8200401b4388bcde28184b136a789e0d4932428482a7f0caf12020f0040364140001c04360261ae0b06a0506b00ecb0f980116d2612cce546da109246a3960d011c4098559e5463854864f12358704cce4a8f854c04f3d525c2912080113b7b80041aae0646d0d95900270246129d07a9b0412756d5e91c12fc1a242082804a9aa86801ab05de65001f00800007c1e2ca9b29e2e9cb2d82c466e408c2558e9ad32609243990b86ec0d10b678776cece08af35d3404ce0479a5434f30b047afe4a9948106bfe283fa2b2a900280286129bb8991041294b806c1c12f7b4d3c082828c2eb86801ad2f9465001f00800007c10003103848a9cf6119249daeb17a0c313483b4a121e2e9d4a196100000b92841270681b51c0953a1e09000710744350501040010000185216c13b201e32f7c1026d14a82430a704d8c62800ca0948009030780201aa1a0000e421a823e2c8744d740a965f592e755c4349113eb718146121a391ebba0e1113ba1663d9c106e4444b5b341155b2a79346026265087aa0105dae8f691a5124009c09184a6ee264410456c8189c704bded34f020a0a30bae1a006b4be5194007c0200001f066780000f6e38b2a73fabe5976191c5f8d2454e859492483b76035208074ca6ac58226df1a38806012136502082bf85f8c800f8023094d436a6c20890dc6d30e0979a3997041427513043400d75f33f2800f80400003e080015b9c2454e791b1249daea5e818622c7c26a4879402455420897c1100a2080002e4a3812a742ca4001c23cd49430103e00800017c216c0b91851792606823d2ab3e0c1d2f373594005c69125024101d00800006690d309000440900119620ae420017492004d124348341a21206d010014c490d00d06784801392485698802fb5c86728c260a7838f62288ddcea16aeabc279d9141fa57a800c2bf0abbfb1c79ca8db90482e8dcde0721c743a4875dcf67711daa0e43cbd2be04ec1247e8027ee0701fa79ce5ffeef18d6ed3f8e4b1680c952d4f3db10579eb186e2292570a02afdf04c00e6bad5434cfb4402da15852075acd89084ebd103aae2b3050543375bb63f089a7f39f155c63471d0ccf7cf5ffe307ce4fab0d88baf5051f05c9cd321cc)) <<< 16000) + 0xdc0f8dfcdea146e878851a3ed1403deb9c8d151332a87d94bc363f1638e71d304ace4e0e8dbe2b18402f504fe0da07b941217e5bf23e918b4f835268624df2bef52b6c53f617a3fa409a444df30458b7611bb20b37027af78386bcf7f9b7e80b156d7a6fb2153164695403945e4e5d1edb9d5c5b8161759dc4dc2803b48e17646cbfa77cdb3b58b3b7865b74c03f7dc7fc8c77d320ad353df800a643859f1312991eff96a3d2460857f83665fb15039bca574d8ea8b01edefb3ac2eb6c9ba65dc76f0141c826fc43251bc7002106310ef79c578c60641bdb060ac3d138f5fdb54d1b9958de70aba41de2f4facf3bf1af8e4f226f85f0bd26b114d87ab2d20fc094cb1d71bad0b2afeac943e1d8c0e535a087faae31ca433bf351d466f580044438dcef89ba477bdcc478cb06c6e6cd2a3192a43c4ea17fe195822a548fce8b3abe1a2613108f74fe2e54e20000000000000000000000000000000000000000000000171bc5f9b7f7d9314f710198bf6815d485e99da2dfc3ee38d09c90894baad743c21433422c21c21411c0040113ebc745ddb7007ebf8d75b83f7dd25372a34a3b7b7c0ffa9497c59041acbaa1768b21cbf3bd01b52a23da6e6d6439afd0455f200e67e4ac5920c80cfc8fc086cc0349608b69784595ea6f4873f04fceb8ca5a5d40015c4f567b52d03f8dc84b36539dea950268027229d3b33e3784c000000000000000008138d9ef32fa7e980a3c21501103a665044943e98811b20100000000000000001f66f7408d89e816de2fcdbfbec98a7b880cc5fb40aea42f4ced16fe1f71c684e4844a5d56ba1e21230411809408e0089d0df63bba4865e349617a9404e038a1dfb9d433ad1f0a3a8a7248764eed410cc834e747119e47dfbd3261c4b9accfc4088c6134e43b9456638a80eca4266fffc84ad660bb5be22cbe2bfcdef84dea76b4552092ebaf358b433beb4b683441c5476296da000d44433407836a6f74b4aa65531c0d6133f3a4965abe9853688e72bca8f7ca03f120f6d2b6f60c8c7b1154d7df3800ce83cdc8bf180e66df83e5b96db390a195e708749266f80c043546d6bf59506dd3a0b527db963367b4d1e8777f9d51e804b4c5101caa6f50dbcd637dd9a4b2aa288217d0f192e2708bc145258d82131a36c443a301dd59e671b63c4ad609e548f24471c010cad7d465498227c8ecda7198e1c1603808813d2e32df587b4f57e6050657b53465e0b3374e03a156b70d702298abc20f365dc6af4cdb2e988f8b84a1ed7126dd37fd3c75739ad0777b751391ba3de18fd715cc39a66930f590672a44748240ab1ccd33e9f40e04fbdafdac698d2199a8a09408b7e6a1838c4f2c7b78f2bad96123d5b1c991faf9c10adeb442470a2f124e78a8fbce31cc14d02f6a79814ccc1f4d1c03de9fd840801711fcbd026101f00878a02a02d20c157a7643a0a2a556a6b4302976a1f1a5009db68ac8901181fc900401a27633d449c407c0200002ac4000a708660ce849844efd08420700216400b2849850c045dcab90339ffa5dc50835c254a900774f22b412840f00400003dc8658482fc2419412037010000d99d144b1c7647941a0aa3e4941433578dd60a1873b07fb030c057e120f981402186461bc140019c0554c0800000456f000002485920640c1180803241702800017251e17720fe723417478f8b678020e97058d0000031e612820f80402d80712efc6d9ad10994c70dcf0966c0e323001c008447834bb2ce280121f64422001f00800003c10b5050000a118140000b928d19d1e3e2d9e13ce482173c084edb0e268000018f3094107c02016c03897423e09c68e5afa8ee88001d0ab31800e00428127bbd761001b00800002390b505000088900023c216623b2002bc3cc1c2117a02902c40bf7be2e484068671f490002fba189004f4ca2a01098407c0201600a000140206e020006492001086400573c81c92c0e0860323b0371981b08efb1be91952626e21047f15573222c0708000000000000000045b81b10dd8a24e908595183aed39805b283fd87e3790db2d5d5515e8d6cc2e2f6b01acb73f70a00000000000000007b6f2740c1dcf07963f6ad7c2bbbac547fb23bff85ec9ff000000000000000000000000000000000000000000000002e66f7408d89e816de2fcdbfbec98a7b880cc5fb40aea42f4ced16fe1f71c684e4844a5d56ba1e30e2940940525ed19be7143097829f5719bd02ca2a28c4a47663e9d98b30b04b9ae35006a2e68ddf5652a27c02d5cc84d798425473d8f56a675fb996088735a22ba12a3ac96a2670ca73435938f38fb4bc936a16a06857802c86bf6456b503d7e6c1148ea97d7ccaa84db3ff9268dbcc079e226cb76ecb9a7ba9e4cd1df48a749d2034614f9d3bb7a9b6d6e3a46f2e114f8e8fd46a6110183294796870bf36fd038a24590f2ca053a94ad99001372912f1c03a2a343808135eb7f7498107c02000024a41bc270040100450e157e755922825dd8e638b093becf9a10ef64b4a381bcd2cb612820f00400003d485f82800051c86408c31c3418c1b0c50986204830c261840bd147b441d355c49480c1e3545e4fa37030f9470a5b1560e0a047324a00e2cb30904007b6eb6dcad020478035f91eeb90a0062ccc7cdbe400300b67f6a7ac1d21f42404021a02a3453a10a2f1010ba02c58a07f1771c24824811b7e14165aa93b840e2cb0b399810740200002324304260de130c00585f82c2f81617a030bc0185d80f8a00e3f7c038e0002abb8517c8f6ec2121000017251c23a4ed59e700fb278f38c0)) <<< 16000) + 0x000018f305c207c01017403814023a013a80710ceb02650616f3c81c800187a2fca480840010d200290554403aa75f818a0da4d5bdb1401001dc1c90107802000019642e41400039e42cc4764039f655928601be0e4440c0543aa8ce04b9384921004c90ec00094207c020164020b1010580080004ec81886c0c02605e0bbec6fa4654989b88411fc555cc88b01c20000000000000000116e06c43762893a4210a461041a2a22061940a201e060000401b0473e831450619f577a4424104d2663822133e2265b98081a32cb88400005cfbccc004001000012937d8df48ca9313710823f8aab991160384000000000000000022dc0d886ec5127484212084443832830c34403c0140c0000803608ad8d5eec30304048e140c319e59b744821299f3914425b19b0cd0800008998c9800800200002524000b6c85b02f01599bd90901e1dad5e2001b008717664c15c61757a6554c059fde1fcc002a127e24001c0080000601c0c5b6ea432017431dce0106bcef81c8c00780218187129ebc8062b0d58408360257841c0082888750007401000018840005f885c048000be085b86e460617a4acb5391104586f76b45d13a1a2837a758e62a458619c1f177554f3d1408044bbd43bba5a20122e0b81b189e1e0000017cb1e2c00a0053a482a1ff577a1204001a028222faa3ceca2410c35d497a21293a49509c0800c60d48e081c3a228840000459becc004001000012a3231450bacc5068a59c67dbdb441026de137122075bc62ea80f000004df760280917c6eacac86002502045175adbfde485a7064a414840d8ae2e64821fb8a77944246fad3530800008e06c9800800200002544000a4c85b00e24868b3d0d4450bd087ba885df2569b18c107c02100950a355b181061e0c0f082851dfb4c3001970715490107c0200001a042d42400034a42d01400102242cc678483800aee24707fece5a50200c86fa89064449217092060f80429bf169edd95b89676887f6182656d7e00cd7cef66708af3ea1bf0ac29b9d577200000000000000000000005692b18d1d5c52d55b576ea008ac118b9015bed559251b28120000000000000000101941fec3f1bc86d96aeaa8af46b661717b580d65b9fb8500000000000000003d6f17e6dfdf64c53dc40662fda0575217a6768b7f0fb8e3427242252eab5d0f10c24a08904a00002493ea646e71342f9bc006f1799c6a35ef5af89385b6266d2ef106df14c11976c6f87dd438bb42e9c727c5876d02b56d345b5d5d2c2e5de1a19d54cde41de87469c8334142f6c4dea4eb04bfa7c8aa23b0fcd35605945bbcd73a7ceeaa084baae27f1772d8eb2e6a3024382bb2e0f49e2b467ee09e60f2d282f3911aacf5cdb97e3518fd50e1780680047190b20d0588482c01400142040907400371e40082908012689039110578482b80400647a42b4a400b89c42b0c4156220aa0d02b82801901c8094ab90a9398540ac00c05024a005f4da0e24086745210a204dbd3a33081826a3c8490c0d53ef88700a08b7bf00dc1001f42379ff0c01f335cf408a02f09cc055028296398edb9402803094c240146140c8f6fd25f630e430ab2080e7bc55bdeaa3457a4f7c6430a5916b2033850160681eb060540a9b926ba0c9628b0f5c204a02f37331bf76da359bdca03bab39be858d449c06201c040405d7106d09a437c47af1a0264385c0f896b3e06ab8a640e482819bb42e2191150361238e769b90123008b66478c28e0ab8cf9221f57e10712087da1e359605692ed510400604e3f180004e40400100a70d85302e470525bc76a060a4919027cbe4ab3cd51856e6712cc6747489122524e15eaa8fd18224e47638d614fc011bb3d2bdc55200081913b2901b03202844413e020001f2214a5b0a4258518cc288172345deefbae4c44c2185383a859528bcd92402932a1beafde9dd4704b1c6ea7a7f26af06088c871cfcb0694f2c092641db28d146d640019bbfe81e16f8fc00001ac95ceaad8cbde441695be4e60760f0b1b6df8628246b1c1378461792788ae2446377eeb0806c16531a0c11f12828c4000989078020142220a00904f8280005b884f188274540008686873d551e2046f57aa28247187356f17babd9d1b6e62441fe739c22d73326047c40d96d20eb3e7457a9ecd1c28ee7a537d2a571cddb0802ed3a1167233ce3e348040400641a25d30cd263c23ba834d5d3b2f509901282c00005724002c4cc1f1ca2b58d8b4ec872b2ae8ad75bf083e2288384304102480400180100080800c196b61d12f2094233e26330057d5537fa8120cac242d0794000714800836109c3984d9c8268c6132620980184b80ec7b2841561241a163cdb020125de0d9d18103932bdc10001090c0800213acac0fdea86633acac0fdea8664a8bae9a9d6a532a8bae9a9d6a5341c2c811885951d3a3c50240c3c000000003f222e8a8012e05b41c64359ad816858e48240238258020d78cd2b3b6226b27664d355deb12d2c8357ca724eb9fe82830df76d1e2010a0e6c1bc66172cd96660a39e4ce91fa9e1801b22920ddb3719a9872993400100c84b18c254b6128530931d8490ec244561202308f0d84704c2341784139f176d0c1029a754d04084a4b78d9804972640a120006d35fe8a0178da2498280800931e1000402301611603e2941f39a02551e667ef104117f2a36ddb4847e470f14f8897ac1191777f7e73ad13138ab80671a32405e3346dbd24467af2f08468c93452d6d48542800026d4ec62939f6b32a5cbcd9de0f3185af94ee2aa8047e46bb4fe6496b127b014)) <<< 16000) + 0x9d83324951e004506c22417031099f64498184da0f6104002d459120014e4f82c000090707c0218304eaeb703c40f7d4c10605c0f5919ce0052981d2048103e010f1866b15873c41c426798c0afaedcca08c20780200001467854e2c3da1c1916718ece05d739b7e583332b1ad09020740200f4020000de21102308709e0c404c6a73c4abbefde9a12fb5bf611038492de07000d1c19225041d0084460aa2e091833cb2515080b1d19706702751145724041d00800006410860984282f8511d106f4b1475a4361383060ec6307065ca15480240c1e00803d00800039082b888000c448002ef1a103fc8c1268567c49e130041a15358046203a0100840104180820804102020000f820ea3a0730100040910802583f8cc178172090ad2463656d013fae9a821f1d9b527dd3f9f95bd4dfa9335b060901bfecf98eb7242845465ceab5e7bae9a31d43ea06d53798627d900000071f137be88b155637b4aba91ccac47138dcab64d0d6fd2480c30b012b62aaaee1c5ff0b6317dfce95ab471cb38c5e5fafd262394f508390e19be323a2cc2d6681ab2e9d23d18ae45c375781186896801f85760da9f545cd0127e964244083a01091c24673e6240d851dd392c10ac0604846083e0100000a420fa0b07c0183d80ec9421a9153c08f396770882070021008010040000111e201c1de814c38b8916b1104cf7db3d3805d04fd04090307802000019e60100200807a0103c80c0001308001019078198340cec50abafd343403adf8213000a22fae921008c60800200ee120760100006d9a1041694280b2ea8e8a72b1a5dce57876ef0baff84c042880f75ae84e9e943834d14f96c90dfc3c1c015348c953c09ff9d438af12c8f4154217099a5aed043c7fbbda441400f4bc9180abd070430c6a6f056952388148aa8441ec9004df863bdc2020c01309b62bd3d574c2a744b3e8d4a209a03c07de704357f901c6fc98bd71adc540f410ce280b5bf1d3b30e21f9117f82aeca82ff73bcba520a923003002800140883a9281d0240e60a000a0d20e46a000e9920b442001a8020e2630702983782e461b6851d78c0c234cdc92a243011eb190f3050c107f750bdcc300a9c74715da28050aac7bfce240009489387f140389877f84304140032336c94b23a90685004806e0583682f83ae515ffcb00a018a6c1c03d9b82283019106ca704009080780200d81b06b01e0601657514605094901c2205b8de7ac0401c27bfc6048183e010c0fed17aa84420700100d40b00006020d2230680d83386c198271001f6c6fe040602e46c71022141f00803282e018020080640983180e0180200806209e1526f4cb07002fe35e6120045d67820004de18190048203c0100000cf2000242400062080a8c800093cd8c26da18ea9bb4b09cfd87dd838d121660e9eea277114296ad6ae5507e782b42ffeed8b104111b35d76f41632cca185e0a080c8c8f41660413304e82c21ff701592150905dd850a11ae62660039067a80260c1d00800008e902411c062a7ac0e2c28e6c5471012b8cbe84509beb5cb6212080e804243af1322d3025b9bbb92c26fd098e202baa67513008c19e52009440700200001e240007648308a8180040be0200050f200126c417857c50500f7405120621ac2160f044ac06180e2461dc080034241e0047513273af9cbaef403c714dbeafe072c220e64e39e2e8baef89e1b57a332592a9ec18bbb27d54e80000000000000000000000000000000000000000000000006069008ed403c41337415bbcd05b8e882dc730654a24b04900500000d01f3ff1e6c5e5ba2d2058ae896f2f80b78692b8aee9654f64dc2e90f99f17301eb692a25db294468b9eb1bf6d1c71f0094cc714b244327c3dfb84db20b84ebfd6983d9c730534403380ea9588427c91d05d050002ba105c2902d888001a4c82d0c8164440022824160e40ae6a0562d02a888150340027f24118f40060e8681a7bbcd88ccb0074229869bfe500da1f2c5d82141752a630d65d3863c79c41e65207417877348d1c038ea08d4e22bf92116374664fcf70d5e19ff2180337b3cd6b62f19c3df7f0533944752a522b820c05160872a91eb1800010e25560487af93715f40451b6b40e9550598b7c7ef37a96a99d9c668456914e63ab8b02d7fa71bf24ee34ac5274a5fc8213510138c66da2f5d786f6f3f0268441cbb9ca1290c75d87a4b62e6bff9de480df1aeefe903282f1e00d9e88148bdabb0ca2275647853c941d8406b42000e3d8b0809c8051d00c108e0fdf76c0c230ab670024182159574dc28b0057858036d9004504090afa1000e274e310c00131147666881039e860d78406c9202701c02988c148260a20b05005d0a95d62cbd781df4cd18b2ae5b16d0812239400aafe29df714fbea8616460a2137593c96aa4afb5cca75554fa942804cf9148dd18e77b2c9e9cb4fbdcc30096b20a69330fa9df3e4bc84f2a904024a72af0c29a4bd2de7c68a79d6b020b30282f31173a6f1f24db1cafed82d4e521cf800b41fc0846f0e503c53863dede07c1dc4626ea310378a42ca01fbe78cc253c7b5ab20705f19798a19b9e1bdb1c6cb1bb870802ac46c301807bf6da94027101e00850c02ae5c4c71b7c4f8670e00b7e2766008c407c020000154413c3609c13c1c1553e17143000ee7621c6e8d555b050205de3594704f7a747d092860f80430772e83dee78dd45fdaf871a9465e59940830ddd711c10e10c280500511d0edc098307c0200002524134340980204b0100014090004da20942392017b69994aca1487bc0663a8)) <<< 16000) + 0x8109e6a5e63345111cf9b8c884a04bddc8c1d887056ac6c20d24a00db1acdd7a0600bd5b62152c40175f78f7fd000081db17242cb3c92028028490031f6ebc1429ebe3c4ee6881fa979330a263394c9ca502e9c70e6f8e0d4b79a4104002ee087d10a038e50f2a200052070880500920a0001b720904a00041c208e2a000d97208c4a0451500082c1044390219a8108c40825a0402101f8a80f84407a0a00173e3032bfd4ddfc3bca40e0d02cabc701aae0820400b667e8a769c03807b7a22318b4b7b18061106fa46bfcd90a01d027ab4dc0a1d84002024525ecd860c08213a197401624384931ac8f0f8d9e812057676b67383906c58c59ac5bfff763a9c18840e3013e9d0e4b2d94fd9f9a28807e3ee834c7d02f00d80a103b2dae7b6fbd87de69410500fcf5814bff4f84a670808fff33d886b09e7f31804803e7a8e5f455c98e60f1003f4f13221c6072750bd0e5b30c962920e719ff94c472bb997b0e209c170d22cd24e2587181afe49f87103e10a5c0411ace2832060cd8f835e83083fc622fcb011718a3d02708200086908a85fc543882c84b16e209158ed88411841000400002a4e0e88cf8f80c18dd902c418781b21171000494625c14081e00401e00800038480018c9a106c93f97c67dbbf984d6b5cc6c62e911508e78cdbfad2917b9e8f6104e6627ecd0c6b1d85d8b247dd8dbeb9d77b944617d781d8836badd1203d4438aa87771856bcf318683a5b6ab38bca07c215a79229ad74ca3d46819712da55d0aa85e577dc3661562c4a5275d059b1b8015d494939b9dd3b8f6596a4209bb1a9234097bf7c3cd8e0cad1e5d6ae256269613d6f8f41801b5bc6dc703edff1a01a25a3ef1d311866b17020100200803b0500001b903a110002ca90391581c0ac0645606e2b03611e0f093d6c8d185081986790a10bc0cb268a00ae25e430120410804201002008000022206a0b0340581982c0c81780102cd04140b5bd0ea09040e00200c4060600302f01c0200401005c0bc202b9c4e481c55e018088306c0200000e64090340001b440b40400037870c08714891a35623db7f753ebdacc8a76b6297e08de50449fca35e0d652c906d8f77c8d970f0464a9c6275368f02b644038e08b9b777fd89739bb2633801d5e5133b659a50c73a64373ee03b60e4f0009a52752dcd1ec5c0f712099c24ab8f6b075368b0a9b8968f91d571d83336cc74116660c05004c5173534588baea79a02972e39686aa1a8e7399c9cd83d33ebb4dfa0e79052b56b660333b44338a62e694997413755e1ab5d843e3423a24a622f663d88eef38000b014000b9240ac440260a00094f20544202915000b24102835013988098b404a520242580b10808c54044220210501000800677c8033dd9007af931cd9fa114b556de390a1d883e35dcdacce64de20dacfc279d8000000000000000000000000000000000000000000000000006411821811411010c00801145afa5a34780488d1b4edd0f77abe3b194b2a6d87232816d95cc15e44de702851931be83c09c5f79d83946f4943a9383e8a7333e619433eddc55f7086228b187f4a2938942a7eb427f388461c5cf8b2b285f2c59c7dbcb7634ed342e1217019679182caa6fd51c508577658b20416056f3be0500320324e01000749d4ea830040c240951040509cc08802103092e97b8820495d68207038809b7ddfb03041ba46cec0e002bfb30f9180026df1a38100031827c8c16710230084300cbbce9cfe69e356480000000368fb9845da7c87df032672803cdc883c96f973239bf59dda7000000000000000000000000000000000000000000000000030a6bf0c47fc55cab4baaae31d51643b362e38bf79d9813500000000000000000000000000000000000000000000000b8648e48a286204400380160801006e1946d57863185aff88ae9c5922317ec7498395d93e08c58f40c0a3c38e00001b324c080088b07a1ce0044010c241e079ab2f2c92c64139e80c1c06698de1930603332edb80410f743a69642c0a5dc8a3780a0000003a908a3801300a0000608cfbf8e49e4a3f6a05fe720ac85834066b237e8447e8c18cb633acb607127e70377a3a242b77486a461861659260e58e40848238180001006c239358e69ba044de7f39624efea0e37150b7a7debf18000000000000000776f2740c1dcf07963f6ad7c2bbbac547fb23bff85ec9ff000000000000000000000000000000000000000000000002e11849649838821601400205c000401a0005d440013148003f0101f05000600101e1580e8ac070560362b01a0dc8815e09979bca40936cc075cbc03883be7c379a72302ad1ef2f00203003be795b8c32001f41460b00b13efe3927928fda817f9c82b2160d019ac8dfa111fa30632d8ceb2d81c49f9c0dde8e890addd21a91659651451641441631430c0380401006d900cc8966dca20906f7da79630072c4d9d0c32718f1a742820393e6e18a02105f4838920000005db42704230080000b610190580c02c05c173efe3927928fda817f9c82b2160d019ac8dfa111fa30632d8ceb2d81c49f9c0dde8e890addd21a91659651451641441631430c00980c01006d90179723deda05108ab8bd4f55c58c0e9ed03d052186c07b845adf4501f2d6541ee4020000000f404c018009bd6de743207d070c2c02c0000dc1016110001d71000751202a12014050098080023e4809108005c7c800c5a1011390081a803cc401c5a00d290060e802c640142a0091100406801c2400c0a00501002008007afc80188800844002020000100f1961)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase0" = "QuadFullFiveCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase0 private def zz2212:"s08a4"="s08a4":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l5 l51 l54 l55 l58 l6 l60 l61 l62 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x12e346660, -0x113ff180a, -0x19dfec086,0x12663afe], ![-0x113ff180a, -0x38d87911b,0x3c0ec4e4,0x109ffd2da], ![-0x19dfec086,0x3c0ec4e4, -0x701fb6089,0x113ff78ca], ![0x12663afe,0x109ffd2da,0x113ff78ca, -0x89ffa4f8]] noncomputable def hinges:Hinges:=[(-0xfd827e,l6),(-0x13997a45,l5),(0x90f4d4f6,l4),(0x19c3403,l9),(-0x652c6bf3,l8),(-0x77231c,l11),(0x1ee5b22a,l10),(0x10a8481fe,l14),(0x21e69e9b,l13),(-0x1fe4ea90,l17),(0x14b0ee904,l15),(0x1884620e,l21),(-0x21e69e9b,l20),(-0xf5f33b5,l23),(0xbc2004fa,l22),(-0x89ffa4f8,l27),(-0x1884620e,l28),(0x89ffa4f8,l29),(-0x10a8481fe,l25),(0x35888772,l30),(0x89ffa4f8,l33),(-0x1ee5b22a,l38),(-0x89ffa4f8,l35),(0x652c6bf3,l36),(0x89ffa4f8,l37),(-0x90f4d4f6,l34),(-0x35888772,l43),(-0xbc2004fa,l42),(-0x14b0ee904,l41),(0x61a09655,l45),(0x89ffa4f8,l51),(0x77231c,l55),(0x13997a45,l54),(-0x61a09655,l58),(-0x19c3403,l61),(0xfd827e,l60),(0xf5f33b5,l63),(0x1fe4ea90,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x89ffa4f8,l27),(0x89ffa4f8,l29),(0x89ffa4f8,l33),(-0x89ffa4f8,l35),(0x89ffa4f8,l37),(0x89ffa4f8,l51),(0x10a8481fe,l14),(-0x10a8481fe,l25),(0xbc2004fa,l22),(-0xbc2004fa,l42),(0x14b0ee904,l15),(-0x14b0ee904,l41),(-0x652c6bf3,l8),(0x652c6bf3,l36),(0x61a09655,l45),(-0x61a09655,l58),(0x35888772,l30),(-0x35888772,l43),(0x1884620e,l21),(-0x1884620e,l28),(0x90f4d4f6,l4),(-0x90f4d4f6,l34),(-0x1fe4ea90,l17),(0x1fe4ea90,l62),(0x1ee5b22a,l10),(-0x1ee5b22a,l38),(-0xf5f33b5,l23),(0xf5f33b5,l63),(0x21e69e9b,l13),(-0x21e69e9b,l20),(-0x13997a45,l5),(0x13997a45,l54),(0x19c3403,l9),(-0x19c3403,l61),(-0xfd827e,l6),(0xfd827e,l60),(-0x77231c,l11),(0x77231c,l55)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x250c81a1806000000470cc068301000000000090e06600800000012874050c030000000210c80a18060000000000b40e2008000000000ba01440180000000002e01480200000000005e0310040000000000b406200800000000003a06400800002824840930c050000000000320690040000000000280520080000000c45206c601800000000e06014c0200000000140a02980400000002a09022300c000000005828146010000000c4110230c040000001582e04318080000000000070320040000000541802660180000000000140c80100000001904812180600000000002409200800000000502816601000000094110218c040000000000d81290060000000000940e20080000000009a01440180000000002601480200000000004e0310040000000000940620080000000001500a40100000000002902480200000000000a8190020000000000030320040000000000881a40100000000000e034802000000000008819002000000007c340930080000000c42204e60180000001984c0bcc030000002484201918080000000461500a300c0000000098500a60100000000130b018c02028814208800c6a00c050829010800cd40180000000098480c60100005609016027500400009a10824019200800000000004c0520080002905409007a80200005409c1401b50040000b81403802ea00800000000026009200c0000000088480c60100000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x6c3819802000258820e406b40100000000000b00a40100000000002101c80200000000260e0318040000000e211022300c000038968260688018000000004a1c0cc0100000000621c07180400000000003c092008000001c61101b860200000000000902c802000000005a2e05180400000000000f03200400000000d84814601000000001b07028c02000000002a140318040000000000540620080000000130c81c60100000000001903880200000000004a0490040000000064180e300800000000151a066008000000148480dcc03000000005c3a0718040000000000b40920080000000000e81c4010000000000310388020000000003280510060000000000c80520080000000001980c4010000000000120348020000000066240718040000000000c40620080000000108281460100000003a084028c0300000000074481980200000000e84406300800003910846058801800000000011018802000000008e0a071804000000b128406c3010000000144660186018000e313c32036d00400000000008c02900400000000011409200800000000004606400800000000025034802000000000005819002000000f30c80dc301000000000006816401000000000005034802000000000084029004000000000104092008000000000042064008000000000210348020001a62104406e20080000000044240b30080000000068281a6010000000208c4090c030000000000520710040000000000a40620080002b8860b011080200000012c3701a0c04,0x630a80b18060000000c611026300c15112106081afc80300000000d05006cc030001261d84204b200800000003212033300c0000000068501e6010000930c821024d0040001261a84e04b200800000003a1101b300c0002886612009880200000000001f018802000000004a2a0498040002585610409a401000001f090120388018000000002e140cc010000052210b01a20060000000068340e30080000000642206460180000000000d0388020000000000320490040000000000680520080000000000481c401000000000906018c02000000001a0c07180400000002209022300c000188480981988020000000841400f0c040000f81e04203c20080000f02106809c40100000000000280c4010000000000090188020000e81a04203c20080000f02105003c4010000000044140186018000000002e1c0cc0100000b8390d009a00600000008239036300c0000000000300a401000000001a15038c0200000003114811180600000000068b03300400000017072034601800000002d1d034c02000000003a0a06980400000000078303300400000000a8701c601000000000b05038c0200000000002e031004000000000c8f033004000618c61100528020000d12884201e100400000000821605180400000104a4340e40080000016250818c60200000000000f0148020000000062420498040000000000640620080000000000a81c4010000c621871026900400000000320c0318040000000003850330040000000001a80c401000000002509028c02,0x2387603618080000000000280d2008000000821a80d8602001232041940449005000000004a440318040000000000840620080000016250810c60204033032c20256100600000000423a0518040048c8103b033340140000000068300c60100000000170f014c02000000000016049004000000000017032004000000016858146010000751b41c01b10040000000640c8051806000000000c870330040000000190680c60100000000000d01880200000000621e051804000000c108409630100000000004204640180000000211e018c0200000000003a03100400000000d44c0a30080000000001d00a401000000000039024802d0c605041813d9a00e000000c12c408630102219a1981012b08030000000000a408c80300000000524a0518040000000000c40920080000000000320640080000000001d0348020000000004428198020000000003500a200c0000000e43204e601800c608c0ac03c900500000681e0480e2006000000000785033004000000f0c858148010000002113060250020000000441080d18060000000084440d30080000000110881c601000000000021024802000000000044029004000000004c180e30080000000000881c4010000042118280a900300000044260c0320040000000004830330040003a0c212809c8020000001c46301a0c040000062290701a2006000000000985033004000000124220446018000000188a40c8c030000000004c181980200001246413034400c0000000108780e6010000002c4a301a0c04,0x1a120518040000000520a037300c0000000090301a6010000000338e8070c0300000000623c0718040000000c63a01c300c0000012908701480100000035220d02900200000000643e049804000000631080b430100000288c41a014801800000019888070c0300000000520e0518040000000622202c300c000609041d8048802000000284630224c040000000431880e98060003088106c02440100000001248206c6018000000318c4074c03000000003c3207180400000007231022300c000000000f1a06600800000003a25038c020001965b8ec0352008000018cb23b01d400c000669623c01148020000000289240d8c03000000005e340498040000000662101d300c000510c2088106802000005c298a80690030000005a562c06a004000000b8ac580e40080000016950b0128010000002e291501500200000000562c071804000000a864140b400800002d14c540548018000051190280f90030000000005458198020000000621a037300c00000015c54038601800000002916038c020000000531500e18060000000005500a200c000000013038126010000000188280dcc0300000000140c079804000000003c1c0a300800000148e8881680100000561102c095003000000002c1e07180400000074381c0a400800000000d8501c60100000000190a038c0200012228868025a00800000000241c0a3008000000000028124010000000000ac09480300000000660c031804000000000383033004000000001b0a06600800000000016034802,0x2a0490040000000064580b3008000000c22a810c6020000000000390388020000000000720310040058c520440232401400000000a84816601000000001105034c0200000000007c0290040000000000f409200800000000003e064008000034619008c8c050000000000520690040000000006870330040000000218281c601000000034824058c030000000691d8061806000000c4b4540e40080000309645806880180000612c8a80910030001825a8ac06420080000000064240a300800820c314603a48028010a18614805b900500000005f1900e180600000000b4680e300800000016c640386018000030611008c8c05000000003e0e0518040003c42904c08640100000001e4e20446018000079388580910030000000003c3819802000000f474380a400800000000f8681460100000000000903480200000000002e029004000000005c1c06300800c192212e06a480280000000016140cc01000000003a12051804000000000d8b0330040000000128381460100000000150d034c020000000002c38198020000000094880e30080000000001081c401000000024904088c030000000004c881980200000b0903026a3014000000002526066008001233886301b5004000000083088131806000410c11100be40100000000078281c6010000d30c425025900400000ea620881a200600488618370352401400000001282814601000000312d0a029002000000665c1405a00400000000b8640e30080000000a44204460180007114c430269004,0x1822203080b9a00a00000004219016300c00000000b0981c6010000002d0e0b029002000000004e0c0718040000000000180d20080000000128301c6010000001444300a0c0400000000721c0718040000000000340d200800000000e838146010000000001a140cc01001461d8218145a00a0000000000340920080000009008802c60200000000110f014c020000000250480598060000004e044016301000001284c120168018000000000780248030000038c5180e8180a0000000000ac0620080003b04a0e81988020000000001101608040000000002a00c10080000000004c0782010000000000b80704020000000000d402c8030000000000320590040000003409403930100000000006e02640180000000000340c801000000000d000990080000006910403230100000000cc4a014601800000001b12014c0200000000362603180400000005827013300c000000a4240026602000000001b11018c020000000000360290040000000058480730080000000b0420266018000000000b00248030000000001b00490060000000640b01c300c000000d408802860200000001a024028c0300000003604806180600000006e1100b300c00000d0082004c602800000019024030c0300000003408807180600000000642407300800001812c20498602800000000006c0c80100000000340c0298040000000064580530080000000c45a044601800000001917028c020000001082204718080000006716c08630100000000d05a02660180000008c1302b8c04,0x1c19a1161814b88030000000000c408c8030000000000820710040000000b211032300c0000000228981460100000000003601480200000000006a0490040d0cc08a0c0a5c40181c1981161811b080300000000410f028c020001664e106055a00800000000f42c0a300800000000d8780a601001181ca0fc0955005000000006c2207180400000000d4480e30081e19c1181814b880303c3342303023610060000000190a00d98060060ca1123028b401400a11230760666802800002c650c0740c05002c85182181f9a00a0a9c93011807e6401800000001a88814601506244839803f19007000000000544819802000009190301d030140000000158500c601000c712419c0a4d005], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((0x6103c08da4451607e99e31814312321e2c20507f3ec580222f4d6c0017381932013060f804308081322cc6063298a228c0a0e1c22a1610057ee7700026f1df6c04a183e0100000fe2008231da01d8e02985fcc410791a22a1610c5aa4ad2c1873cc34050200580a18c0060a628c1601867d8c40027141f0080c40280005b48bb88c5d8362ea13809dc8572e6821a65a0c303a90c3c67004eb1034480838010d041a8032820ffba62a22041b00800003891dc05e0c3bdbe80861dabefdf2041206688b87000378910490107c0210040100400001111db0900009011dd0df1ec7677084040a179aa510bfc850bc4028088d98810588ceee80800019fbc898107802113c143663dedc710029e9a619a20896149f63288c3000063249d94040000922fd49022f8d628f60201062d28644010002b753d06340003cf1513b5b779002902471003b361c842f208c08c571e3290c30000835d50b0e080c9498cce0aa02000060d94942011b8838edbb21e00309957c05dc10014ac7aab3160003272dc70b90f874801681a00008b480022711dc01c11357514a120e2aacc4aa219a10bd1e3c20238d3f21055049122030000347754c003e010b2c0003458f71044c1895cad648510012b46ec804001c052ba4b081aeeb21cb8411ff9d239de50000002697e49003c3cf27c3080000df99ddf639002701c0000f898233e50933241ca5f9e944432a98c9781056a6ded58f040878aef060000678eb98007c02143c00007cbf2278062fd2282cb00001a8b0411deca9b88d21466de1f269c20041f46d40826436813d45820fd92d571200bf3ccf0fd48011808000072c80018491db0900033411d50500061a1004198ed00f8ec094c36403c8d29919e18f4c3220e00192f8ac4000a1a57525041d00871cf089ff54038124f8b8e0c313424c26083c00800009f239a0be3c6e71c5b202023667a6a01ba13ce1f1e1815ca4c2220a9a210fa200847d4d2b820000146dd138210004208244e354f8e3d4fc3bf92220ca5c93c2019f5351fb9e180000b9894189369594a60000018f32201161b0671804200040000c191cc010001849b0b5d1c824430540103b20300005c23b0221d70d0c40480016608e51080053d8c0b03498a9850400294c984082c6835c1c0cdecc36a081b29f9c8e812880f80407583725b44bd000000010bbde12fd00a34303e238e5041047021028007006800260500401a000228437007a480b3f0c0a28dc50501a149c1529a46103801092da25e8000000085def097e8051a181f12081452c30c32024403c038030080200d1d5010000909c2047e0029c1712217d488206c0203a80300008820c4220de0d06e848000aec80d10c74c8403c0200056f3e5004182ea2860150e2c27851531c67ce01a304d4b9401dffe737080a73ea44693040f80405d4063a402824013691cfc2019ced78a7f50a181578200539a11a65ee28080e1083e882bf00808e137625701a00) <<< 16000) + 0xb12c73cb20600028e05303a0037f46bef784041401001d81591ac23335114a14e350003919d91ac2333511471f54f80055a703432072fa32f2eb258e21c8b7a7e6a0feb4084d5a767a817eba453684af7b835be8effa0228e6f9a70b491339fd41c62b3f639fe9a0810a1041100c70cb09a33735a08a16344653015313602c4dcc4308ab446d966c01928d69ef06ffa4de577961da4ee1b162ac8ce8e01ebfda6e441b3f3fa8e2c8b60c28eacefa463373ca24f4976fbf71eb2f5424c118a022030005452000ece40685586a2a174e23c255f85e5a18239aded3d0c20b3830a00c16ef8060a041364df80e340664c137608000002e6204005f07cc61290c2000807982ac76495fe5d00e7ba7faa382e0d70b48408b4c5bf70c00e1e78c425081e0086ad3b3d40bf5d229b4257bdc1adf477fd0110541d52e292f7d30c40b702ace4d55f470a0599639422019c108120010b43058b13722812cfd71f8ecc4134d21fba3eeaaa13f2c90827910b57e4114ee46088d1ea80014e11d1098001e1901e010002dd11d0190e78c87385438a22058090007931060158110ac3b807e506a74a0696189feb200861dd134c321401eb8bdc8120027a1e970804a30400101750dc101afdbc7c3c7018073231c7bb78162a40409b819e0200020b258e9400800210000100400001111cd05c106bd3d0801e380343ac2471e3efc7f40808040c6072441259a2452a0085d80b6dc100000d0a373801080420841ff7cf5731e3849bfa2ce10a2800063efa90a107b64198bf06105eb49df4404129893cb6932600000126b6720004513b90a5040079dd4ebf65ec801401000007f08e6008000e24c0471e63b530b20f78738092897543005fd45990006802103911d300f1f4a2cfe40030008000069239a0b8216278807878e00b1764c38ea7d963c08080326447a882893e6b468023f3b80fa080000d2fb3380100042084c776fef6881e00007b56d2260418966e2428a0001c8d9e2011a0a7e5bea38481d66717e0c103e1b4161a8803431df1710a00000150d09b4801300c00007a08e6008000db880026e1c1093c8c2e8827e9db6aa08221453370846183e0101cb0580005e91ca150e484c002bb483780f569d9ea10ed9cd6fdc2c0c64f38ed4d39044260838820838468210278058010022064700401be4899c567f6d01c1f22def6c48d416a9a7511864e33d41501c20209cfca18910d361ea4a880233c1b6bba1c0104e3e8a020411c97ceac808250186ad3b3d40bf5d229b4257bdc1adf477fd01109e39438e39429029a18c1a010a1390401006ead3b3d40bf5d229b4257bdc1adf477fd0110a041641041631230e20c188002064000401b1400001f3531238c4473a31d23453fdb1f65421b423581a101c0000aea5061714539efc0514d1dab972080b450a8efa0709e92de83838900240180000eb100031320008a441d8243900b88a1d3ee95668a0090dd6e40b26f8f7168861888efea4067ed7951c2022630f91e804c2840010000134238e320007d13a20ac6b48a518200000b9880e253be38a2f082034b7e4260e1069817a270a08604240741c0081a0871d020014b096ed282e981560c10814240144998ebf82fd748a6e84af7b83ba288ac7a08c0c4427541f51a141d6ffeee039044341282224b6897c92da25ee177bc25fa01468607c8e2361f18ccf45d3d84c41542c71c42c31c20c24d68e99a54d66e556adba7d973c8c7a702de36a65885d90707c24484e512798258188e7f72afe1113bf6429c0e07737c608b378836c5b07de23391514f436a80022011c61902100800195c8007c79a136bff45546840000c7982c2781d89c8080df4a8af20104f43eeff850033ce4161040154afceb0004598f48e810000007bb112080840301d80a1aa010000f290222d0109480809403e4201e11000f271b18d92f8226486e5186aa820250a7b5e70c1428d4b3fcb030d65b82c38058cb92881005f7d47390403573f10d11411e61a74cc09acc4974c8024221080600007b8d0a977d254f5f44b9289f8a6c7085b57feccc88386a23c2f28e0cd87ec07c95837389e7ea014132481e5ea8aee7cee32f2a200981c62a1e4d92f51ed164c3026e02e6f84de5bd485de528282a201d7f04c038cd17f771c73889b73408b86f8880b56ec3049c7fe01fabc3a6a82e7382409aa9c0320ba2c90ae1c80003d32040530212180f02f45021cec67fe313be84ccc250a174817d5c846eed84c2104112df45e3eb9a67b103790080810e63856faed75ff948720008136214a5a0f3187949820136ad7abd2efd58fc4344410010e2f4f7969f726a7bd7882005d2657a55ff7a5f45e2e0bfb118a41dd3ee50a61981c50d81900f464e2ebca362460469781f51869007d96d0102a4e63516008285c06e38830101fca97f42410501436403000f03f88e018010cafa1410084881200a346edbafcb0a117a85f401024079d184208934e45900a080f0020000340f1ea8e00801405551698b88c1400004ad91453c824d33050c3732b0fa0c3c48bcd3d4d043c0f81f028005013f3b800044cc2256e40088021c7be6371114405694207c98305000012b643840eb2b283b1430dccac3e83811e588693d341000022c980c02505fc2ae0002472a4258c900240100000e911c4050e102e0180200800002220501a0004272086321121900e8a86a8540840a1c3050003c39c30a81140f5776880d86daa615aac0c00fd567c19b83458072de8a10fd0e2005b43b5487ec80c00bcfcf561e23141050cc65dba31108119ffa9a63)) <<< 16000) + 0x44e207a95de8dc95df3eb1a1882400009288330ec0e057a2800018f30b0988a8b4e2204f519e62b2c03bb441420e005013b130203569d9ea0000217538f61100280a16710adb1f57a027302100871d6ee1677428be07a15100c38307961584101c2600b9004000063cc68214051aae280035627620a00499b42c00002ddddb1c641084011c7956554b6d0a2b1e25bd85830c09db550f260400f55ade808209df8edfc1c08d1e26f8d8d04000056f7c28205bff26f60c0214c2644a1f2084a0200001dd238413806008020000088f1e4b716bc2ac0c39eb69ac1754d08019ebbf76428200fa3a89e9c50846e50db92240108cc2b8cc34d042a26d43aaf2800383337599c5008d08b5c2c4936400a80a102c000031e638f5e3d9e7540309331d7f1c1028fa98a85081dfcdf987023c0ec4e434100001731060118a16e4c0000e058853900210040000db11c205e1a5ca759a0d109e3a87a4209e1bda4c8904075137682810400080000d32208120004f720862a1121500e8a86a854084021c101019008002694d032a9d84df0f6088befbe1f660c060601599137fccba4c6ce0c000f39a7a4be30d6114b7941c47c574db824f16e37761f88a2801c53f0f7204534dbd13befc10cd914429e2fce4a3683e85040050eec79deb13f3ee616023f7caf5dead4b3a25cd3ab8bae2201f715f5b618cd8869ba2b2ed48408e17ac9e279f5ea75e40830ff489f28369cc9fd8babf496ceb387198fee82c63f5b9007ef5289df93ba5b91eeb52001b084b5f74299440e451665170952b66fd7ad11fd593ed81f3207cd60c42f66434be27400031c11b6310361480047ccd7ce5d71d44c9cfd501d0d311119003ae91e385223fde533700bf99dd05dd16bfaa83044ee33380000000000000001ea8b071cb8db816650a38650020018028aa283abf9fc1804beaa4ef9e6b808d77e2ccd6067b7918118ac8966fc9e271df99c279d47da32bd214ea064940116738ceb344c2716e5e3988a4d9466989e2832c4302d5682836ba877c05c132e6c35e8979b2ed2a27118940012f48e02286e8e437e320221900127391be3dd10573eba79a04049620c55d591f5052eb91c79000a5d739f1153dac902da463da53310925cb2cc0c11e0bab90f662e00bcb48c939b721afe284368ca436629e3fc1d185f3f8e1219989dd4ac71b8fe5cf16e7acd8a000d68748f6ece3e1520f2f325fc5cd4cc6f0bb01cd4032fd0bd20a2147414efa86ee23166721dcdd960ec0805d7ea56a03544924826fb01134c5cd768adf1e0d068312955c457f437dd8f7d1fad2c839ac5c0d204562f215964015b5499a288036b5470240b7701a0e08a1078c64f2e8a112bf304222400cc067e622009a937329c00a40a1180a06f4040b0020001d031cdf34e19145cef76a0e3159f4bba67c8218e6f9a72d244ce7cdab92a7b2431a20788c1c71090c40c404c0090044dced5234b8f774b1e83586814187c8302afebcc15a5f4da6777b3dda7b699e93a4eb422720991f6800157102a118de02ec6198730d5436ae17fe9602461edf9a9f5792e2687c161835fbe6f37aa409abfad482c2267564c6329d724f2a7d2027f1553fe403331ce574e2c02416d2d734190c167a311c08e14eca69d4318cdef1311129a71c9cbfa80af75349401ef85eba765c59e23b72330685bed6ab0e58a018800038a34285c76e3ce3a4c6fa440081679924d07ea4fb24214028406d74f077e1451f9be81c14f3deef04a20d541e88120165018b35c20ded292406000a8eda067acac1389501808f72c195cc30db19588115405ade89adf0e69e569db07b5d45494366a7897b5b40fb0e44da0e609a16800036d23765b1ba298dc92c6e096040430211980f02f8918df63542c941928b1224695b642df20519cdd8a1145b3eac02e38021191ad10003c3798c210002724200085b03297a926f367a14f2ff14dae08f4a48ff71e580f48bb00000000000000000fd9c9aabe8e140b23ca30a2872461c30c1240180000c0c008037ca3ff23735287834278bb2470368f5a72460fa069301c3127768b33010b42a1da1001efeca290027142000806e0080005d08db8c80a84400070c40c807ab4ecf50876ce6b7ee16063279c76a69c822062213aa1f51a141e4a0fc1474db81f7a08418884ea8b491339f66d5c953cb69a0058215b03297a926f367a14f2ff14dae08f4a48ff71e580f48bb00000000000000000fdc146ac47440a520514128008010435279ad5859bcd0c0febce6826337ef90183b860464ae6a5f32472adb63dc1228048019eb0dfe2dccc6cc1b80e02bf44d8d08aecccbf7f1daeb1cf39755c77ab7904ac3be6cf2fb503bd672ac7824d0552607046216ad27b400179c8020ae0b04cd586bdb1eacdebd1cfbb589b54f18229a6632c522902c8c1c7105002001001dda2da6e99959c70e70936700ae4107357687db9f2d5c7cabbd952ab4610f3437c83f1ce3ea9168fd039b8128adeaa5c6a10bceabf894a29a380ab4000ba08db18c218860cc3b03815c8e008593b31c4543bb288940c90691f9040425afa036082f31a629e10002f6e40908202804c704201000419d06b3615f77ef32046a4536b008c196c0e9c14ef69695308c000000000000000008362666928d4356fd9a90fd9308243c38b20c526c9097d7f00000000000000001f3828d588e8814660e38830258040038020803c7a1fc46b71e521f53c487ccd76a43cd9ffe81cbecd965fda4772d3849612e9abc20f03b9809297c174d7904148f2de0fdb5df405c615c1973ffb18aa205)) <<< 16000) + 0xf964db6089245790e31c92a1346d414000a1c46d0c40d85a0006b33058266ac35ed8f566f5e8e7ddac4daa78c11787adf747dee8fbc3d6826450a40a38a500200180282095a3593cb2edf7c7c89be0bb57dc5bba94128635e0733e7ad8f411b6c64e0b1c90e3f25405fd9dbeca95f6489b0ebb79a7ef64c881ae80017b100186a2366a202a1d0d90e800aa9485092e885e54b64948748f9484b4b42d56c1d11c21020811c01801000400504105152ce50b10143bd25f475533c737de5afbee9e05cce44012f03c817921080768530da8001039c09f540a7bcb22026a3a400778860879fdb3d13c3002ff676f3690a06fb006c102420003825afc41228288129865dfe12a02de7f454d548a02b1a4ac27dd0f999b0a809000043e46c536360820a1318d798c2207435c131ad050d600a06533d10369d0c153f3ed37398508501b480040400191a9411c01c0689bd624968a0172d21a29a844114050715cdaa2cc78a11c3c329025ca68cae9da0ca852040f348a416fd851e602965f29d234a0fbc1c678a6120aeede470c91c00001191c0e3800002eddc281057771442a082ef76735ae0d021def1696a0124861380c3cc000408e08c32faaa7df834a388f334dcd2655756f38309238f3d654a081fdf9ced24000059571409c30880200002d24068460320381c66375e6300e2c6348a71d81a50a0f97d19b28800000696a838e0000119328b0c3170555ad9a1243b5daa68202052ccfe6cc70174730689b8da4109c061c5a352efa56696159d95e09c54cfa8c70a6941c74c57d201006ecbc58684a3ea19b393021100400004dce94dfc0bba0a1c48badcbd64e693b23187032184911ea3517e30a12671a9961412d417bffe87802af06b01d14000f19f841a0006d2f857980612104c0300001eb2070120660907904800162880c06c3c837649c7ca99f66211528da2fac2113cd34a3093021c208234020030080200df341a8ca8d134a62ab968f0d261e9af70a3090b08426e8c099d95a2cd1c20586a912c900009da6f52704220080000b291ab09fb99b6854d7c7ab309542a35842261261040e302082700580000060300401a0001ec410c442242201d110d50881080400080044a817ee66da1535f1eacc2550a8d610894396314312304106004028808d7af64ab640611cbf8b0276b575d682dff7dee58ac1d50001893648139e81ed091aeeeb9d1c450a00002eda024595d0a95c510284998ebf80805145a1389850032320574410021c00362c84001841f375c45044212604a0280001f523064b18011c8b706e7ee50c205007ec526810a185a019b15a080811017ddf6c58253706b607c18003fbd7a60d0200cf4d25d8d8401d1ab1732c22084a7e518488b61cd0a408122c2932c1229b102811f88685740c2015bc34d0ea8a18302e78b4a2901023afbf8c119608d1bf9776630400d6bb5862a78802b99905bd308820a1f7d713965351cd0b00b00004484010760008b44290b61422b0a01584e80e47029722e945dc82f8f20e22817888dc5281df7b2470fda73e3e8a89b323c3e30611d34d6f7427a672b818200532fe9cd07bbfaf9881000003c84f479e53ff020042f6b70286a7425d2a22082005505d47310911e30b2400f802e399a2750490a0000185900197023523bb2023efab38180821a52b3198f6891b3cca1e44a68a1400005b81c809159c02e6ae580a131a25070d8f09117483e54befc9042ba846bdf4cfa100858058b258961afdc28855872a718a15ffce841f2846480530789120b624c5f0401dea3d35d98108802000026e68a2f32ae952fe38c0d3ff13e0c8515f79a18d38812262d5de91bf02041367b38825048688b677b78c880df42ae0f6d20e1349559822964083d75a89dd2b2020ac0b000042246a03634e1b1a6098d284ec9c681332e6652c808fbeace06028814babf652b920872bd24a630a285000016e07202458586316d53b284d33deb526bb2443d9f6c677aa00fa102058058b262b0e2889288695bf752ca14d26cbde12458951bc11ca125c6c05322444742753801005db097e9009c40880200002d668a572b256292247ca3b0b49242850a1e637fa11451ea79e37c2244518c18d868204bc756967812436c8c63448620300001569a20004345c7b0bbac0a1400e00007e081508c00168080d0cba1023b1811e12fc8d1419ea404904a251050e38e488408486406284e0100401b442bb735e3448ed749d1619230be916b70488de0ad4a190231569382e4070e5d18848200eab9dab2ce0844010000165303740a1c4414a25240aa9cb14142a3548c2846301a698ee0020873abe070bd3d00e1ed76741067ebc2404953df23b0d4eb8e10d29101f627400202236acbfc381fc07a1202020d81500004904690343461a1a2098d08486802433e02000562233c5219d290ce14866ca433442199190cc0c81f44432e12196090ca848650043260200121c2324bb191598c82ac63d4631c8b18d398c61ac280a61423b18b198c50afc3d6fba3ef747de1eb4139685aadc7ca425ac9290e9442f2a5074881061040480050020014043c0b12f72a2fc6e1152bfb70bec42cd945007c8a5e1276a6490c08a23ad85e50c8790010298ac10680c24fbf1f1859abb403d0bf41f405a000a7c36a6da4405ecb047480fe303fd9a98f2ff6511038a6ec367849a20b4a003827577220e59be7597fef2f60425945ab354dc53e8882231f583f666b1640009b0050a73c04a86df9021856fa0d2589bdc8e806b0e6cb21c78cb402f350008903497d92fcd99667a65)) <<< 16000) + 0xac827afada68a391e4955d6fd1d411fc17fdd790000e8c21c80ee70fee263a8a50cecf212bd9fff16802631a2e284395e6a672a02aefc0258ee7ddb022e5e523a0d9384607014eb6d3cc380de92f6428f134804c82f0ea413f78502e7544040883070021008010040c48280000dc81408c0cc070053ed7c7b45b98ea3319a625fae141e8ec6f7899a72133909ea00356c73e4db23f58ec052ae0e09d681d0a3ce278d22ef559a88813300cf412d5454e4885c967f8e6562894eed97a86d4cfe2cb425f8041f68df7c49f9a4a00b659ff50c287443efde466dfed44305d729e8b261bd53323c9bcd490a6d6345120116bd3125fa005bb5a3afe68d06969d609ca81ae525309fd2e45e3a5ec8e08accb000620140009f87569d9ea10ed9cd6fdc2c0c64f38ed4d390444e41be7868ab245f9f44ae72a6c8c0e99fcfee0b771df5a1c8000000000000000002191a50e28a11e01400a0060023ca38e90c6e8fd8553078eddce38963ca149b2c931089431f3d724577ba9a74e4fa85de3fed1bdbc5722d23db72835fea11371cd22de8001db90600d89686ec11eaf2da020e99cb4c0024203a008d2aed4d1a8838a157afe6a1420af94ed4160935b5c138704181c53ae7804a2ca5d01402645333900ce204201000016420742a0391101c0880dc4406c0a000262200190260cf52024a3c25f91a3d0811d8c000000000004a478e65fda6ed6a208d73e0a91439210c10811800a00223861c2b90488e6746de0cec00d6b449d0954c246d95c066efa256fa9ea0dc33d6e6a4481efd06b37ebefd3b44b7ca8b773e9185cfb18490e94000c608c386ec503738eb610429067cca0030a1b15d1e4f04c2c63d90906103c0ce7a66b156b3337fc100bd66b05719f3bb561d88c2c07950028d893a498d699d020101ea872f7662ac6d403f4200c0e4f441da38c2f0ffcb822892b1446960490bc99d4e82763ca2ccc4d4729aa8491014361727285ee8738530d40001d79186318c296c610a630653182258021086047609e33180198bf8cc5f8162fa03c2ae9549ec0c1c3a6c8ada01266510361611287c8120410502054a0c0150dfe9d800004c504001092da25e8000000085def097e8051a181f6f322b1bbfa067531eadc0548a1cd14b1461500830430000080a677bb28ea4e3bd24b47d8a5ca97fa5e095072471880280d06c93cc50398e510c35d0002603a27c5c102d4a0fb8282302ac549f8979f47dcdf44bffccb4965a2aa9a28a54f1b8000000000000001c91e28a21210a11e09800000102d1c5929617a606a2f4a01072ddae49fdb4c4c0edac90fe9ccdde81d97260d227299be79fa3522a6be361d7f55629cea94ca7627835387a4b9cf7275cebb2f1f62cb42668001e7117c2d8bd86c26417e790ef470a2846973127470601800564a0e7fe3b269e14f7771843810ccb061a1025a9d51b4427101f008716081e61340f24408f9d3f9e20c80fe71438319d2a52c22054dd1d0390e04315d7fd39201d0dbd8b4100836c03bb0014810230140000d21a24044c035a706090666982830c5de0c70814f670f3b14040fe699764824e97ded00982084021c580c9d9710e0c30a3b6102050471b9b34010323852298080193f56090075726b8820047c46def09c20840200002c045e8242f20a0002d820543317805d131aa89e20a117027be11c189a4adf428310c3c6ea884c96f835c25081f008510c9de04247060a670eea4428edfda8ba80001651c54901032747d620005caada0098208402000026466701d8c9351a50895a1e89240f34cca61a112a349f0a601bcc60298206e8efb07813061000400004c08bb8485d8242ea12048010001f4105e0181500e2308ebcb7448a3704dcd8c2a1c58fae886e073e5ea00887d3e4228320999b60408d86f95c213880f004206808bf9d84cb1eaa233688c7446a7c86098a05d69a008b85d9b008183994a18301282e03d4027101f0080000ab98862dc9bcf060aff83367960a93742924000518370212040f80426593813c31a25879324700c1483f692d0c01b5324e584810400100000d622e81204d050000f6915c05f1869170fb2428108659b2c533ef19e830a11ec4b9530ba2734b112820f80438c4a362f3130abbae65a9601c3ec39a1800b495da250107c01000019a7569d9ea21db39adea65759ad69e070a304331df42dd7a80591e61e50c29421e1a01240820060200401a00029a414c240a412051090b9808000e74c0598c7eb44309b7eb2cf3c012d39a34401833bfe6040ac4c3b9509430780212286a40a448144992e9634206e1b868a0e4ed767ca024d7393e95081d00402680800041cd125650219c51068a76021218a78523a2c117be98d0881a7c67e3d25081f0080288085cc0400024c413c5402e13172098001ce1f24b41c2c41e239a9b50b242135ec3bc3846b2d9b24408aebaa708e0d1d0e3d038012af69420813b37e4dc00a0507c02191ac23335114a14e350003919d91ac2333511471f54f80055a7034f0f5bee8fbdd1f787ad04c8f24f1140870840870440490000c0a0080340006fcf1025291d9420696c4d55298200ef9b5a7821ca820d0402390e129280181e9b672004c2840010171010000a411700d0b780c0013a880d14c0045a0d900976a6ac71a50cbec21a09ad3a8d818152e750ca58046fb5f58101595983b80130a0f80400a80784802a82623071896ffe240e2fadc03070a7af86f70e084d725a60804b4e483e004c283e010f1f95bf7228a187ae6e8c3821094ac70384cc18e990701e5d89810a01e3524d)) <<< 16000) + 0xf0026141f008000096900027522dc2a16d150b60a85ac340dc1a00043b31cdf34e19145cef76a0e3159f4bba67c82112893c53041441421012c0100000044100c980080345a82600029845a47400436840a8962d013a0a91a2f60a8f587e7c5e1c26aefd52ea7dbf6337083096ee8614f85420412d634085cf97bb7e27d7c100ca00d14b939aa9fdb2696c240f44393b18566bbff8a820269b6d0eb26b74733ad04142747fe22bf9539854200532b12efd56a2ed51200cae0f8761027384a0b00429480709403a3a0cd1d0001d4990ca48781e9b0386070c9807f824175cbbecbb50c08e89e0beec0c0290cb59c7742800dfe7cfc4f10002d1878b3806033587b26da4501540403e6dda5d500a562809eda2a084c290280001249167458b320c594f60706b0392981b02f06cd5dd88c406c68664e3c002a7c078a0182fa4af000040090e078021c20560ee994026c02ca404004edd2b408c307802187277b1e08a020b2e5b864408400101640503a00800028c8b084c05c15c0e938200a80765e4601a026de93e00118a0e0042010020081640903b02c1d0140000c2400047c8ae8e858c278646c409a3423be61712803d5df5fcf03566dcc60048283a010a2d4caab7c788010194c9022f60724678040284bc012060f0042c28d60b84b145e13834444088d366b2d1040594684012060f8040000350d445487fdec209e20d6468e0c2190d2b1a002129c6f1090407c0200001ac4000ab8cc2a86fc1dc704a19d38ecc049045b3e9a02f37cc6b2c030d96f3220128c0f80400004148ad88c1f0340009c0420ca610c13e184adde686108363ce1e0eba4ecf120054c6c08481038010e04327bbba20004eb98e6080937ad29e11840f80400002988b10485842602e1216005710ca0ab5b9004541516b4a066dfdf8a12002d3a85ecf0033d511fc094308002100c010040000111004118ae02f051dfd9f440018951d42001d5932c1033975ed4090307002100c01004000011115f0d0af0080004b0800158115d1d70fcc8879ce084057274a01e8bdb645003ccca0030243126601018be113426081c0086040657ed321c10ff265e1820c0b7dd540c00030882081204108040000364e086d84f42582266db66181eb3dc200601dd0925024081d0080ae008000374f0c68430c20c183595824a00273b4530c0357c5bf8901078021c309c48018e0dfc5398c5045e142068801268fa824041d0080000631c14087a36300093edba44083601015c0100004290040d0001301000158ad86c1f0342b4120005cf22b242004190005669a080362d7e439ee9b75020ac5a6440cfa9bb930b314feb736dfd110feead975eaf9e85081ca2eed6b79aa45336cbcb5f31d695a470745cd31448c6456a2870dd0fe1dc40008007294786e7b57b6a985a1acb891c327f4c46f3f24d83be89b77cb43b2916bb0939c002955442e4fad659ad7a1b8da754d679be723dc831189f1d04323bcbabeed29982a010402e811e9ea1dacfda6c333d3a441722555b40eb3451a45c7cd1dedb27b098137dc923edaa32b3fc1ebc19fe5724f505171ead58fd7db993d3fa1c1faa0afcc85210748158010ab80c55804000d66400672c8020ec554278301be7fed8c0c04fa11e840ad9dfd230004630400101240981900f061f5a56b4e60422aa9427cb060d9299ad0c0899b789fc0813221f6a5c5800671a9b20700769fc6280001152097ba0000a4101180a00006b08a10e8310740d8320661501c088214442a812153010001a511523d8a898c540a629e43818b9e19b24a0fb7f52062005a9fc7542c059cec55c08080848683e010e1c01333534784673a1be31c2c150a9d69c0075b98fa10024182100870e7c88a5ba986154125946062c4a990e70444db9cac385d29cdd1080128c100040000424c46a23bcd149541b9a55e8597c37b1a984414f57bcb46f492c6d63c445a464f3343817e72b883ab388e89806f0e95ba495a2012885ac9878912f116f511fa5a3b46034013b9c28fe2998e745fea60bf2d81d83000eb855166f8c25c65fed60525acf041043857571fb47e3ac8796b2b8fa79029a460ea42a2ee8aa9dbe3d6461c7816800020c114e2182606f056390f716882a518a5ec102bbe61d4080118e0f80402e434290020b601800077900a1d70ef2b9272070b99a2794861278a07b03c011013876700713b93d500125201f0084099f8799a5802b0c45944058daad5400aaf4cb60090407002100401004440a4535a321041c008000026114d090a60280002cc8a58aea8e8deb4a12454c7286c78f1706bbd40380c6216081fdebd5d8f028348cd800130c0e80400004908a50e8000c04e8ad41a45f90fdf8156905c799e8120e70666cd7ebeaa1a0a4c7375081abed3ba7a028317d494ca281dbe1873d868022a78ed7d81fb40b0b0b4ef0d0d8aa1363039ecd9e9805a1d4cd05deca79abe3686cc6b98144e0d3d7ddb6c22022f871d772af03099aa27b51453eb59df0dad2fd45943881ab84b6d61e37866069169110271b63872125511c0001104c010040118127f1c5a1c05b6d86991020e00400001ccccf286c701a00dd181ec8d017a179de11840e804000028485e068524361741a0b9090260285200416c030001ff20065b000aaf20024966c23b4dc9ea20418e46530b0380ff403880091920f80421ba829b956b93b25edef28186021aec964b7a86d7f565c00000000000000007d0594bcbcaf38447ca73500138f06b3f207f60515482bda000000000000000001fb393557d1c2817e1eb7dd1f7ba3ef0)) <<< 16000) + 0xf5a09a1621619c1041020082144538ed35cf316380222b20ca6108168c4adaf20bfe0b7781e2f0a3c9ac1c0378f2f2907858da1dd5054855a6d5d9a3a8030c898ea1757961a7f4ef064b38d8759e30082aad532504d9d4037a909f245451c14000af26c31f80a8e72c224e11be010219324d7d3c0cbf725852c01d8a00e4400494808002161957d0ea038282782ce84841401f9202084be69099a0042f22a74102a383e0081470500008d10322580012b91461d00d0c8184040011f240106628a0380627fa17324063ada082a205ab47cefc18286d6b3f07003dbf3a6604a1840010f24395b98c1225b6651551430da5f7f611840f8043c938b58f76708cc6563a0910ce8b4c20a1dd0229cd1023da6954c5802b087b8c26081f00800009390001e822881b028098a182f569d9ea05fae914da12bdee0d6fa3bfe808a0b2979795e7088f94e6a00271e0d67e40fec0a2a9057b4000000000000000003f6726aafa38502ccd1cc08708d0080000000c4545d44dcd836cf27fc895b7f81707cb2c58bd3ed984057b792fd30789e97225e40a81765a4093ba364103f32c6467de947e47197d061ce43228001f991240de0d789cf87901639ae7f6303ecdbafd1805e4f7e2e380fc0ef0a880212920f00400004148a1128310840d83a0661901c088214340d41200091c22828a0fa2d0110a850014004c2e643bd5bf45197e5c680e18f30dc0f0eaf8a80c01fc2d1090fe772e84007e1e8d4186b76d41407ca0978e2c620a08800f429afb45fc124c1414414841b4866a9d210a83833a854370025003e551a66bc79dea4013c340101970f41f00005b244fcc427c3a0047fe200f12e429136142530a02984e80ec50794db6893e5ad42b8b7ddbb920cabf0243f796eb242c28d3347b687decdb98dcc382380326b8ad7549e4769a142399a6a37a8e9bc48fa99c96470ce09f4928c9affcd80c0ab853aa99b87a616911ffc34895900e74e9ad7358d855050515005ae36670721cddea631c18f0e7048cedb5425fe39d08bc4d4877babc3978c5e09ba232f28d28c54988fe6b2946cbeb806bf2be6d8cbf7130f2373e40623f79c8af889ba246afb173215da41484a65a34a4c1f958f6bf825d6f2374e95161df5000e73a76599565f8c39910de080086973fd8aaebc879f9690ed24e265a5379b11e2b08e11cdf34e1c8907d8f0e0e6e09a68e8ed2821453628c64d302c8e14b14514b0880870840000010044000c22008037850f19018212284fbdb90451483b4f85c58539780a0020229445b379c00319935ec9004a183ae6088220004e884201000017e20086a0ca1d88b0ac4f43740bac85c606226684704e4c592023b3c5828277c33d1cedddae340a268df3022294f90012bcab2afb07a48601064d292b6f226808820802cb69be42e5a48247e2bfe82e6eb5102e9e2aa32330620210165032c1c8360000abc89e28c4ed36274930623d83198c17817c7af8662b4e1622c7ce00b644a3345ed18e93c2375472233de78d7287d988a08d0800a8e226d1a40ef8715b9b3a3bbcb9e9acac6d8e147e255c80a5a96025f657abe0659edaff9d4114d829dc3c27dade5f6734120c360cf723515c5265cebcce860667ce6b6441dd54c074195dbde42723dff177df19350280010692f30ba73a34ced173a177fdef6be08a6ffdbef43e970a42730a01ddf4ef2e86c763efd3ed7d52ef94f976c13563965f9af76c256171c0aede7904509aca577b2103d6b4b72100422a329c7fc718f22bbf221b62da267402485e0cc0b11c6088ad962a6ff6afcfcfce392cdceb8d45b9755f225d96ec4050040110080100409c8280a80427002000061225a0a1370509602c00037489b14c4d4760082b06c0d84186c4d0342660b13205c01205f0d8658281408854b01727ad9802065b5fb4700400024341f008402004011e7a8d0d1d1453222c3d080e3563de8a065da54f84810380100000c5300c0100400001111310989804c4bc0400603d24a8a14af90455af21c62432cfc6d3a48086bf91e030272f7c5f00004a403e010000108225c3a12d1509604c2642400061444acc40ca5212a2909490800118489420c088d61c8630e525c0200401024e0b1260189280e0280200800002222480b1230589102a01131b859c3810e33419c401088907c0200001124484942404a11f2108f0e8474640082211c1108d86810c34234131190908c00845c0400052440110422c33b286f3462fc50c08af36fc3819e13b25d8e093dfde65c600563e9b960880a0004a8842010b289edcfd1c7034ef043731c124f4c6700c0813d44b44100140009110840200001ee4455042287a1133900e988448941864211111021028000b7880ba4c440740027f04006accc8d8b16060ee785a375a2112a2638d4e9d7af9a867bd1df9b8243a3062ee2703009b6c2833b978b8248570b5416fefd88deb86a50aa8281d5977c000b736b988fa44aac0a0a0a8a00257c6b038a2ea045849e057ad543007494a8afb288f1b44af43d885f085bcdd860b700a0d15cbbe5914d31fe87a33fd8641005532042a17945e6a0af8c021000043b2004c92402e84cd0c240c24a92db2f118ab638d6d078cb0fe826f8ae5a0000000000000001d90b1d22f86155a84c46d41c4324ca7cad40c116a80fd000000000000000000000000000000000000000000000b04206182300280080aa0a0a0a0002afe7b3f072da326fbb1a69e43c56395afcd4ea96962f6c54934fff784ad66d1c26e67776e0ebbe305675292775a401712c1dc54fec6a4e970828a8)) <<< 16000) + 0x3c96bf07a99a0ad808912b40e833417188b601a915300102431fab1721aa6e17767f521798b69c79ecc60b128b4d9ea56f07b653d2e344121e77442c0a0245443c0421c020006cb20187fa403cb80c044899f552e1ada47374a1c28cb60fa55ec0e84f8f804087006e8a053719cc5498601983c19e2fc0255a5fca2004ed1d05377803ea93791410bb25fe119aea786f08c28a1b5ed533c9f6eb8eed720f8f22ea5d51d1139454004721ff94bb68c32de32a5ebeb783c52a82685a389aca087756a988bcb3e6068540f1203f44d9820ef14921d82075ed66e69f384a278edfbfec52fd809506a06b978d0d150a380c7ed545d3faa35fb722dc4efe7c0dacd6eb92583d35ec00301e9cad159ebb4df2460abd13c6d772c4030ad2ac5a8f9706a8080c9ee66c50ad8070a45031944f0e2d91878ddc38e678a6d0c319ebd81f10f39c59fb0e0d3820e131eb3b35aa94be94c21aaee11b42db90e21da41cec0f4c93602c748c499c4f02b058b2137b1efdc9a87c1a0dfc689d07ab6fce7574879784f001d0d88686c430274494aac52c8bc5e3f43ef5cae564832180019bd2b1f883e5e6c8f38235b3c101003bfa98d8e71539f9094be065d0cb60809e6def3bbde061a83ce00e84cf8890404123042fb0d5da6a443171e613e23040404d4630ebcd48452ce9406cdd4250c200dcb3a034b978b55046a8d2a03a0aa30a7ca9a13c1423aa4211c9800da2f30b01023905ab2820220485842010f4028d0d0bbde12d25b44bd925b44be07dc2df4354ce40b22c82072451c41443800c0022f9afbc447ac59abe4104dd711317b44f4af3113f49af5231c51b453a1b803e219048c5567becd51641ef0a93cf96790f207e92497a80ee2ba048a3ad107553e78664514f6c99ce906b9560e218156d8cb430120101246a17851e23eb84803bb667ef4dc7d18503b8d61252963e640006a88f1c2460ec1d000058e4404660501be16fa1aa67205c23dc6f85ac3f1c6462af82a468e50e38c408208306500000200060900401a000256426414000cf64064b40dc320d0190678a8001f508150e8002e2cead3b3d443b6735bd4caeb35ad3c0e146084491071040ca047006001004e1f2733e44d989b693914ecee6a5c946dc4ea83e403112416a50089cef2a4f165fca72ce58c423d82c133561af6c7ab37af473eed626d53c608bb5074b40da4cb7297a8a59f53a5bfa75e7195b52ead4700000000000000003d22051c41442c210210120011341f17a324adfd384440065db943f3825af97d1510c5f32a459b09078de46dedf60a739bd3cb0c45be85d017e0df5782f50e0b906a97170609040a03458fa58cf1ab1d5c7062491801f94664df948c2fdbd94edc363e3030e881c2e2e918284b42e279862564900715dcdd2b8d10603e5ddf6a11b88003d0901028660a810b0187600f0628b43b3c185a8be09d314219c9ef0c110231c20008000059900032e20542210a0900038c91092d07f1484209420e420aa2106d0c8218140013dc40070708832ac0688620a3bb13fd863ac5092d3fe4efadf4ddcd89720b11abd5800000000000000383a5c554c0e702c881050880460040114154504c46de020387165177a9014de19917d240a2c8e83c1b618974d6ddbfe66a619625c445a6a13e5e992d129dcf45a96b6c6f57c63b35f0753965f6fd97a802065a57d63d818c5389a33fce28a4bff2aac501077887ec2e4f5fab80832c69d13976f638149babc939848300311736826cb010175bf48fb6a1828460d75577d8d244b1b3901bc7002811c92b054286083b51306bd0158a02a018024208d4e1c5463028f55907f80442042010c2473e5df92ca180ef7570dc61be22ae6320f080000e7ea0e087a0725db06081eaa62520a041c8848df0604ce40c7b90002e0a1688b2920048028c347bd52187e030e5f01ba4d3c78411665de06438204e6bb227118103d27693938a0405188b851e2021f973449d528004598a83ba0800e6e2bf2cea3d2005204800020422080be3e89a2a31c8f1803491c5a6806000039fa83c31d8708d2a8e18227fcdcc0c0801eab5bd01040506caad01012e0a1688b0000c5f67abba92004a028b1c29d6f45a1a0e39e22f7574852c50742eb1387880600006e8584070c40cff7fedc061089b96f6798041af8675e91f008055804a695800019fce4c0875cc4480158180000868c02290e48e44cfedbbaa308c4f7c4750ec145e1a480000000000000000000000000000000000000000014c471c41100cd0cb04504b000030000200db1c024399c56d6316298563b4c1ecf740309fe5f2166cdc5820163b5e555f503042269df6ca7fd020e3091bddcf10624020d3a510bdd942000c98653a257800016dc9ed51a522442234801982800009a8800230100088c220812000cc420c82b063158310ac184560bc030990188180e45000031e62c1dcb7204e041f519e62b2c01dacded01c00f03b139040c6a3b66f00024bf88c7110056d8fabe0a02859c80b981000200006b080c98c214a700c01004517f7676dd468823c22e172c4000031e6161c62c15d303084999b39070000005cc43402a2dadd88138610804000058481506f458ff10445580fe1cf984e2b4f0be283d48519e79c0cc05b68f380a92dece532f7a2387bdb07c9f12024776229f19ffcf3e23afdc05c359831a0890e6df101a6a019164f815448498e2b083bd79e6c03ebd51f1928a051cf2df1b021002ba0902aa09295f6737999fe9028fce66b86f18da7be139f03621f869554e030ab5e74d3b1dc72c2ddf6e0a15)) <<< 16000) + 0xea4abcb8e89451df92ee202be42667a1e7e4badf4504e9810fcebf27de4f2edccfec35e8d8a9bcbc63787871dda77914a0badbd5e8895af5206aa0e8e6fba3a90fc8970d0ce7678e3efc5e57cba551acb51a397d16d91bd06f40572c7a3cbbc10a0ab5c21c277051b4ce4b8e3ba0abf23343845be0be35954b1c5369f91768052cf211130f96deedae09ee3b63ded28a285abdd433d5ff3654529ff8ab188e7405958bdd3b51c2311e572048a135c9de0345151b3e8bfe08615640a09d4e30109ae626df25820b2cf07eb8e0026ba1aaa09a004192708dc00c8e204e03800019320016aa4190660c62b0621583088c178161dc03e1aa19837d09100e325074811016231b8a0c2c3a5c5c405cc6c1bd049430800214306d3bf1577186b17c2cd12040805312307d4a0c381c98d6e8c1cb63b1f07a20116bd000a86203aa3f253640f001546395119800c5b58e27d02da4309c0800003f04408279eae2fdb63a486bec9985fcb3f9e1d623cd8b200cebe138000000000000000000000000000000000000000000000002f09c61a49228a28e18410a0016eb16f9e8ddb470b788f4d5da2f8262f83f57bce1584c5dc6ecafab8a3b8bf4000b6c88088c0a027a38000073f52040c5753a0c20907d93939040c2bfd79420c110e9680ac1010080950ce200158808c0300002984400340c81a099050003f890d01d0678a800575c8012eb90ff4587f1cc3f46602e2be237c8fd99ca045d866cf428239461aaa1016877892a9002c65c9440702b49a25a4300befa8e72040e6c6aaaa0a800df4cfbe41d6624ba640048442100c689bf2d366e606f03b13905060000c79820527fe381c0802598b22c000f0cb200c08000003dd913101000403f017e8051a1a177bc25a4b6897b24b6897c0ff316ca1a717d952c83d6d6f81a07ba265cff918c835f6000000000000000078f615dcf45307c5f88e1f60a99230c2121061040a00676048912eeba6ceb4dadde5edc98cabdeb3def3842cb379201554a606da85d34be141b956f02c8fc83506695b779439486f2da99ef770d4906a4d0548728982121800959d98619bd1d015ae2879d240c065b788367e9453bcd5b820ac6c11a30c248f78dc2608218d8f6cd0161800003dd80c186981e6610a08604168001c0081a11243020014b0499f282e97df43c10814240140000e910fb1987d00f451313fbb01c596da99683441022d1ab1c43f06968c0c10fd46f4e140049e12b24026142000868a3bfd02cac0a4638b475919460cdba6885b584971c133660800001d7d493003887a7fce749ab4a78222e37a3754a94780c2369cbcab96c00005cf044501207a1201c50d0150000464437c67e4800017311e2132fef448c268e581df0820b51f0250c1968b4d061e08c7e013e0609996b0d81a00232f1af140085d820e9201c626e5a888150e10004000079c8002cb9000cc534399ab5b1420a52065104220c1e00807882a28ba59ed89481a0e9098d7a2600001b68a30d5a3c06ac0a280006585c8842852136b1c106e6cc4de8002e645ccf8a0000012b65c801100422580d1b3ff90302b0d1e58c34c0287aa222003d4d59a208b2e8c12200a57b1b4a020000148f84e004001000015621f203f096c6aa1d103a9b591a2001c008444d92969ce0bf0c19f2c0b24f1aa3001a00800004a10f80500009a98a37b4a6e7c8d182bb3eeb30c34032a1e5c14500013091418433bf3b5a82093a2875b322005cc612b838000003822c10024ffc703a64008c0410300a4b98148181be8697c61a390406111042db27d190048510efa6a00400080000fd21f2038000080230d435e9b9c8880d8cb6863800417c42518010004000029087c0280003d880020490008ba21ee2b0f60950e07fab8987100574bc31a11ee1f9951c0941a00f620120c0f804006c340001dc43d40403e02000ac12074530392581c10c0dc7606c1b91a17509e0284403f7784c0f910b821102ebf62d28c017514d1b0942078021233da51d7a50824abf05981dec8edea5043a80f690814159f12c180162243004c103c01000012121e812a2d150ba711612afc2f2d0a11cd6f69e861059c1850060b77c03050209b26fc071c000002e621a03325c42802002f85594094861000403cc1600038e439c072316c37b812840709b9bc209a3cc2f78c0da4e57a00c1a5beb59b24202ec6e4e93040f804004405048026d239f830339daf14fea14302af0400a73c234cbdc5010182107d1057e01011c26ec4ae03c016258e79640c00051c0a6074006fe8d7def08082802003b02c00081ce2a4fc4bcfa3ee6fa25ffe65a4b2d1554d1452a78dc000000000000000e73d5c5fb6c7490d7d9330bf967f3c3ac479b164019d7c270000000000000000000000000000000000000000000000005e7b0aee7a2983e2fc470fb05611ee37c2d61f8e323157c1542052c22402000806e42f0c7fb0e41b1de5f16d14b8e604b3d33f3792d371f9942f3fb555eda408064f499fb55d5307692c548506b9e9fea9460bea78d7e83b5a93f34e3be086fef9fb6a87d7459ddb5256a94b3f561c11782111c01a407c0c302c5d812bd2a858792a131cbad0f20107880c001af480d0ac00292c8780ec3bc561dc230ed0d87602e06eadce892210340080eb017ad3307794cdf4dd3505a4eb937cf3c65d88df2d561c32680000000000000000000000000000000000000000000000017fd00a34342ef784b00000000496d12f41f21c72c30c31c24003c03401b8400803687e25bbd458760267b4a0ab33c28a4610360100000)) <<< 16000) + 0x9a200067c4394361c81303505fa01468685def0960000000092da25e83e238e586186784184800780680260300401b438b79997247fbce3f6587a2d98b4a05f0e0eda12060d804000030c87506fd00a34342ef784b00000000496d12f41f11c71452c30c30c2181400340070180200db0cfe2a03cd06a1fa39ca005cd877908c307002000013e43a4140003c243700400082c43a086034420e705d0e665702c516cab1908920c1b00407300b3d5c5fb6c7490d7d9330bf967f3c3ac479b164019d7c270000000000000000000000000000000000000000000000005e144d1c72452444834434403c030080200de3f5a0bd3c30408a51d469060d414805204448536a220d5e9c7830400004eaec4c083e01000012421c403c1285997e90820d8042422cd2e2e1825af74b0a41824b8ca98007c16d412020e00400003108708280004f880025b90df15c8c1f7fd3f4f04f787f531208310c7f018135c30e444811fea04ac1094507c0201ba0a00011721ca230e40d81a84e66806b3a3d1a0680000e08b14500000bf1c1046b859f7431c2806b2d318861ad4365d5d24116e82b50694083732f68d2400a09c90ccca400900510467e4475e0c3b4f4141498454f6b40d20a533e8239a0810ffcc5080000d17db3000f804000048cc11774f0f6571c8e50c0001022f5a28078600186eb767aea50610b0a6db87ec61869dce7249b29069044ef0cb6e5c48090022c10c88b5d4680000005f2c78b0040000923fd49287de8481200680a08226ae8cfd1a1811c66c40c3a822a5e49846843621920a2aac2bc04000068f1f98007c0200002464000ec487102e00002008835ec9cb9a0195cad52001a0040000349800008023433ac948e383894c4a8d00dfc84046003601000009620001a6438c24000352412437450000595c65104425b7d7677061948e9a0771a410ca5ecbae71e0800e9a47bb1408182e24763240065207ad18200000010786b10000835d363a54c80140102087cf645f81868c1d7249308cffe81ca414380ffc810103b99e2a100001a459e6001f008000091999a098202a39206800008c56e51400001ddc610446ddf6dbc870a04551ae9706194f915484a9041796ad98ea4007e0313ffe4000a598e3a75b2004c030822c826a204c40a62fa9030d87847784c27feebac120bfc7c0ef080001a123e6001e00800008e900032021c403d082de6db082d292ff49020d0023c23f865e61c25d3b7d1082e8c2ae13001575dd12808380080000c221c21200016021c00a00081921be33a1c42632fb2818cb2f36409060f00234a0491873a28b61fe62a8a0653615a38c02e8708480001f2f550c04a183e0100000fe20c41a0de0906e8280007488150e83701400265a40068a480115590601501d0a836c140064264012f048551483688410c0a004e08200ed4a4364f400f5c64360e60544a0a11980180a4b6897a00000002177bc25fa01468607dbcc8ac6efe819d4c7ab70157a6b79f3cc802fc3d6fba3ef747de1eb41341441c214214104000b0796700d01bcc324e4959795eac9a623d999ca9ec617725d1269f821726df49f61dc7684b921171a98fc128e5b93964b6897a00000002177bc25fa01468607e92e3aa6cbe43d96484e3815af4e4ccd3f502fc3d6fba3ef747de1eb4134185203183182280003327be2000f8ce741b58a4d8009704e0f789fe488ad130e94b271896b6b01f367751c2e9e620d11f44a661e518b8282f182adf09b8e266b7c5561c3c0cdc13648073f439c8700815ac3e12820f80438c0f75bea891079b74da8e268b7824f1c3d579a19048083e0100000ce21ae120d6090140283540400046c400161086a10c34c661a42b0d11186806c33c2619c130cd0986602c32c1619403910e29b8e10b8e22102837b811832eea1e372238493daff79dc30932ca155c3960486a6aec98180035bce5062000abb10f437040404c882c2702006482e471983183c48d52713f08b10ab289701223d326fb90c31edc981430262e7b4c0b01568b56d84e103e010b1806436821236bfc915f24422df6e5a382054a4a3c604a14690312820f80403200400021e431c3418c1b0c50984002c31006186020c20186080f481351381ac590653b5e374a1c9040bb7190392ef9b06734635e1217fc38d87dc0eee470fe17d1a351c100fc697042822116174146809530f6011400328808c041e5009fdf2e81a5055481b0498480ada97f8144861a75bb39a406099407c9242343a4f73922c47d0dbb018202a14cab610226c3e9c181e0044c92aec01141848020d2c002811e26941da82f592c9029f793e144998af4d98f20168c7cc26906b6ac5e3245e15f5b9290270d7bfab02808210080600080006888478882fc4617c0be2452af93a2248441d59fc8e1c9abcad973075d422393481214242ac2283170d18a7c70ef287c96d10318699c220b00252867f3100095d014410009438440180001fc2000c38707399435e8c50e2a5fbe568918aba2019e0e3339746efa28558496fd12304422c2e828d0588facef412083f69f68e141f07207bb84802b47297b54001ca24230100001059a200006205c50e596c9c561c61bdadd8b8c143f04d36ca042a2e476e1820093647226042100805e80f073f81888c50f7e223b40818d7a6d2e8c1712740d70c14ccd958e4800603963880081da74f04e103e01000015221781a0bb0d85d0682e4241700a0b70105b00c000d188006e390011063840fd4be3c0c18f17d302c30883f22950402dbae8b1b08181f997de0e0315056244000c)) <<< 16000) + 0x36acd00808084e58420100b50105a00800066c8599cc2c80703816180fc285179bd7b040ba6ce8fb471036e7bb40a1f0116b4125041f00840e149fb354a149787e3b102da4bbe7c144c1f0d83a287542f8a387003b7f5e913020f804000049485884c2c0260500b0af01f18b6c629b09132d0be86c7112ea4552440c9e94f49c40807e9c3e8500d0f07cf4000dde4a420002718200080000b01f0f5bee8fbdd1f787ad04c461480c60c508308304700100009251b5577f7c592ccc0e1682940004a88570e82b4641582a0ab110550682a424150120a7090002fb10a641052828006c9885218c28ca6144520a1198500cc27c0613c0209d01c8a6051b9118318504456c852e0a20f1acab4d5040c07540a9a544803073f7d80d1c0d221048a6e8c01273ffcdb1840013cea7cbacaa0a2a2808bd0f99def20690c3a80d9007e434148103495db0a488484e956bf2c608b175faf900a6154660340cced3f7c300b25c48e0001098907c0218884ea953c900226a0e31599ec2927b042c549f8979f47dcdf44bffccb4965a2aa9a28a54f1b8000000000000001cb334bf4c8e722bfc54fd4c9b1dc00f742be2c6a7b83ed00000000000000000000000000000000000000000000000b6e16fa1aa67205a1c51418e19c000000111000429e57f3e5f1bfad5bd321fc9627c02bcc40395ce8abb6de79aecc51c772e0d1996b48bfa67fec8cf25fd6bc3f10ec44f9b22c9f3160fd84e86f94bf63fcb4e1e5cc6e913ec5fd0374d83eb298f3ccaccedcd9a058094d3f1e131277eed54763971b030e2ab96f922d91685f6103bf3522e02849a5b6f54b004c9a89984a103e0108181936e824c16b3bcf2a88182afb4a308c207c02000014e7cb0250530b204343750f60c2dfec14741013addfc4d3c010732b010250c20008000081909c0d01504826c140006384268340013b8421ca610c330850de924dab9d14908995ae4f0c166effdef34130012a28102b67de758d012acac9f8c0146a072900009c807c021a48132025d0c30368a56e121461d3bf60810077ee1d84096dc36e98004a304001009a0904c8080004cc84c0e81b06412e2a0961100018010952d84a14c19c960cc3b0381583288c24c2612413c442754a9e48011350718accf61493d82124b6897a00000002177bc25fa01468607d8a93f12f3e8fb9be897ff99692cb455534514a9e370000000000000003970b7d0d533902d0b14a15008b0820844398925815ca8db0712c7110552b104f2323422e11c37d538ca994f4ede7dce12a544358992e0978f11ea5605f1cdb3068d52f6837a716460d46b54e5275586855ed547444f9a11403b1498614249428ac51fa92c24573f8b02058637a4d4b02ceeec818800ca403e01000010820004aa8d7fb7ca301f32d413b689b2df6a8d7fb7ca301f52d413b689b2df81c018884ea953c900226a0e31599ec2927b042a72e0fbae0a981311df81c2375f378dc542de9f7afc60000000000000001db85be86a99c817e1eb7dd1f7ba3ef0f5a09a9c2a010410200221ee8cc672231c45ce58551d7bae998e83cc88a2d3844bc7aeb198b507f5f685879bb4cf01dd1a3ad069a62ce0aa86685654193e7d90f281a41909931dc1a938435bf5587812467e3b2d3ac24e9ea0680c95d5283a541354216753284500ec23809e120408a0bdfd32c09a17f134a0275344b2040068483c0080000da2000e364244860543be283753ec2798c2c4426a73abeddafa2a3998edbb7903954defed35ff5c006bf1b27e809bb21b9e8f9300de8d0444792fc7bd2987de1b2ad35193952370171cd5e8e7dd9be77250a18962b06ba0bc7d0b8988946b5b62c7859fbd0dd6e4389f8aefe1c020581bfc6fb1b9ad5d3312d4e1d06d0869b73ec0c8abf69cb9db63ad8bc7c843f71d7d434dba3fb171b19d0f32db44409817d901481e033aa1111322093e4904460181723340adb9a2a22041c00840100401000004440002c484806812c36094130490582600c22c0411403d1ce2a85b1bf31313fc98902327c1a3eb9d1c68ac82763a5dc5e898641e1afcb08feaa8c0815221e69c622f39de9ef6f5125f1185d3c028075e414120a79b604c78f6c85f771ccd01a6afc5a9c287e02d1dcce73c6d36ed324110fbb1981529a0ec42c11776e1cb0b2c685bec5750da3d513f21acac9522744314bbc2ed47df498f2d95bec819d4a3904328f02ce9e2597e5015a0560cf94dbcf88c6f122d381a871e791ca27dece98cda695b2c4c00371663691e937312dcb681393f42cf520eb5994b919055d651f5eabf1c4881d2e10000318d44f0de4fb5c82f1299cd5b8b9f261e5b0cebecdd58d93fee1365fd0cfac92aa5bf086c0af23590678d105ee1a356c744c04889fa766074a7644de15210967530400bb3e0bc44106c011004010040000111000087211e1a08e0984682f8735e6c4991c3af6f4b7b380136b240334000cc4aa40c00c719d2740094608002000021240019388460ef05480dce0ecb251c6aa9aaac9ec56bb829a030a09625d9121296c02ee379ed2697a7a63c05070dbd1b9c9a22c5c9a2f4979e50787b5681800aa52bd79e9cd5c5e7bfdf400d9cb317102c00a51d7138d02cce2bbba1335ef67f99a6020007e4bf2156c0d21391d5a20afbe1f58a06844947f450e9c9a0667745308e70bb0224d4b5ed66b7fbaaad9a04cb1d240a490e3400004862001ef64000b5e276154b9410201771d1c1c09402867912000051f4c020234d2c9b820128e100040124261160208a01e0a65ff6ff7442099979251e117fd1)) <<< 16000) + 0x9ca0c047ec1e6ea28359fa61d3100651c2100862213aab491339f6ffecec7f46b2e603ede6456377f40cea63d5b80ab857daec97ace3b62357f02a680a60a582282880600a0194a50918fc1420b789e335145d69cdd56112d199beb4fb0e8b51d631dad292e19a6917f22f0266c395246d0002ef21124204c090002221088218002df1001bfc343164c2e6f201adaa75a4501a565fb4c70140e4251080808048703e0100000e9210e7b0862184288c2100610602d088ea43a54308622bc5c4d00f4af1010600f9e0ae280035a5d3260104194908002010403081018400081fc060fc03f0833d4e71c2e6be494881068021c24245a830c1520e01f380863154723041c00800004d107a0582602e02fd8fcd3180032079cc7004c6b82046083a01080cb4109f10c2839ff98890065f80ff0c0246d4d289010780200001964010270183eba53a405a20fed29e08050f784402305ed0d1e0021727a812840f00420312c357bb8d084122a6dd2421ad5fc3b830b0aed60ef381015ae5374d00073f29300c022f3fe2c820289075f6d0a4041100a0000660800155100045e20fa2200a1103e06c1ec2700c010046123c491808003132d8040672b6de02003a45e6812060e0040000314d840a75dbc1608b73d4ac302d8098da040ddea841e780c895b5e804a203c0100000fb20f41b07905c030040110217059e21921639b3b8fa600a387bef9c0055bfa080120610004000035ce10c36237300e71c7fa1806dd4e1808c306c0200f0030000af20082a04c0900010410712180023d1077218150cf82fc614f18b0b79737e810209c9ec2ce04919f7983014613e5b4404488a92a300df76acec4027181e00840450714ed8209da958b48e0c1d0f0499018dddcecc4c00e00b7f8212880f8042228d60b84b145e13834444888d366b2ce040594684012060f80428b4b5e01a1222df58c58880a7d97449201d944d9e048183c0100000ce200037a78520c1e8c1e03a613a4e6006031d2c80118a0f00400002a08001ce100a1502b06e010020080750983b0481d017e0445a7bfa0042283c0100000553c300300adb0c3c013aae63c103385d3b23042000803a82c1d00782057db1a0f026be81d604005a9b6a408c307802000014841cc340e40b0001b920e23b07009000167906f25037028002120f14732cb13dff13e86dafa45fc52f1a2f0354dacd42acf1145122747acd323c6404c14707ca6cc4413bfe153046a81363e207cac7c4ec70baa2cd0df30bdb490d724b49e7bbfca3292a4009276c798c52d193b54f5717b9dce75c7035c1ee99dbd9c00314f02e2ee9365a8834f93f9f0bd8d2b532051eeed7d700080614d7356d4b46701f1afddee841df61c3ae90ea434b826c00024e10017f420da6a06c29035908080740d41a0019f02054520044fc20d26306819d8248aea568b145db40cf140c4cb91cf15ed63cf1ae3026aefd43599a9b450c09600d14b910ee9a313610840085cf975bbdccb9553a8803d10e4a42f24a40cb5c080f627c732f24b5581a982042747e3f85b9f8ab5c48014cac2898116b559550065707b3caa47384a0ac03394c198960703b06519d0ac05a5eb0d268e8d0cb6932b6bf13f00a1888e25c02b90801422b72ec6a2eb22868332728dd174cadca04ae8d8c07115b60c087f71cb06ede720c023408e4c89acf61002646189d2fe8b803f5a3f4881b82e011037429cb8ca9343428615ace4b8268a116c15a6e5606836a43621645140874b6a9beb46805eab9860d50e012981b559382800d41ac490a8019c79a6a2497e10285405000020d20c82b063158310ac184560342a0601582f88c178360ba1aa19cadfb918a207ae6e8c2421094ac70305b188c61c6001af8def8a01e3524df0026141f00861600aa0988f191e128121630655c7eb1829ebe1bdc3022b3376b02012d3920f80130a0f80400004b4d940954c7dc7164eec3891009bd4661d14145d71e0a50046c7d4c81017841f3000130a0f80400a0040002844170560b62b05a1582c86c16027638ab06ea60a1a50f28881c086d5380194084efed1f0e08f5aafa9a207a4e6c1300130a10004015c078faa7c002ad38c8d61199a88a30a71a8001c8cec8d61199a88a41a787adf747dee8fbc3d682646106087843842043822024000060500401b842032e7663045ff4a65a3846b2d9b24408fc35b5f8e0e52fa78d10126bd8778680255ed284101db79abd00140a0f804000060c8001af10560d82a82b08232273f03083e64082480c6f9486a240e1633fc63801d47532c4a083e0100170102a00b8903af9ba91c511b05fc1244088a67e53830401df644c2f3a57cdd34130ff194c08094b3eb7b09c2080021031321c847281d6d03bb09401d978fc50c003b343c292021000420616cd375868a03183a54a14dae99ad8c283efa895503e7655e804a083e0100000fa20003d04000d7082986c148360a21b05005cc91bcbde78d249296dcb142bec6a2c8f042ffcc7124092fe058d25081e00802680f4598c83558305b7ea4b138012d3a7ec401833d425080ac46ea3509430780200001f2413c4602e0aa144e04d0b07141e4ca05a30720fceae03006d4cabec1204100043077fbdf43ce085b96cc7940a93766f43c00518290012040f804000034082704c1341703c045fcec2850f55119b3863a2353e4306c502eb4cf045c2ecd8060c1cca50c180941701ea013880f80438611d7dca49146e0d2bc18543896b6ce09c0ef8c53c110fa89cc50641374da0c11b09fbe4427101e0080000a790002c1200098e)) <<< 16000) + 0x413024000e84400313080d12b4c112e466b38b03b39f2a2471e59c9b5302254c091d38037a5e066040dd4cf22f0260c20008610c9ac98106860a669a834828ebe621c1e000123cbc0801034ccdda20005d4d50f098208402144469261982845c1d418c68626850b20a0c43a14082413266610f094207c0200001f8400092482584c128260921304801f1a06c4371a6862f7b90e2205ea29c502582052179f24007eade3ac2009ccdf8de1304100042880117eb0a1a1823fcdb7ca0c318254d82053d33d7c83c103e64da310093afaeaa826082100800009990470982302f8d040f309a06102047ce9fcc106407f38a1a18ce952961102a6e8e81c868218aebfe9c800e86dec5a08041b601dd800a4081180a30c3515111c508c16d3fa8a0ea7ec0cd1815d7d510b3410c91c2d4102e9103dc8426101f00800009590002ea20082a045050002ea101e05014008002800800dc1104419c7ab6e06754c6efb6f32302be8051a1a177bc258000000024b6897a0f91449c21020611608800600001014d21d0c8f0ab4f03823ebfb53d5537f82541cedec046ad782707fab2142728851aae114eabada060e4e3248f4b0527eabc888049dc51f28600b90b1e9c000025282000800008810432d0210680c8040007944008f488151081043400535441011407e8203e3d01e9a80f0a40760a002deb20104ea6452b915bde48bc51dfdd1f18404c161b2f4ad28ec28901030794b9dd75898293dbce24108cdc95e962247784d221c08032e05f4566cdcbec3118035c546ba80987ab72fe01000cf3da4d2f240c66209454510b2a91387db16ee0608ca193f406afeebec1f4f7480b6513bc6f514738500c048980007c6259905780de9412ae71d46d0e0836965e4045d66287f687ec634a18610129fae40949dc76704400244ec8df8a93613a760e03eadd467ac7e4c4784a08017a94c0d0e18375a700220fed3b60814a396d244212728705489573812ab0723632e2d62e609415082c133561af6c7ab37af473eed626d53c608a6998cb148a40b23071820821412801c01400232d5718a199ae94607c4f924c546555703631448fa8f583c19b88398ad7042f68b4b082887c51b004840740100000f26020020080320100001b903a1581c8ac0e05606e2b03609c16099ab0d7b63d59bd7a39f76b136a9e3044499948bcebecb444ae59a47187b99b6821091838c28a09400e00a0060023132dd3f70ca3c5a77da18aba8e113475d960529461cd6a9c151be54c3612e1fbc20142506e393c415e04bd73930421141b00801a82e0100200803405d024ff90d4084307002000009c40a834066020000ca20002966038020080320100001b9018110188880012a48004129030110005d2102f350171880b4b40585202b2901512c0a4840503a027190130c8094240480a00104a2012a94402ec10e2cee4292a053018d89ef0e176d17192ba38577e79b582b818000000000000000000000000000000000000000000000000018c461070c708608508404300fc2f211e56ac9c8fabeb8ae754f2f8d9189518325e697736ef09ad6fa0110435473e0c25180b2e74b640064f8e329726f47e98542c7a43cdfb9a711977ed687424fd93b24b8905d1b39ea0607ec78766b808157bbf00000000000000000000000000000000000000000000000000c42386384304284202080016450cbed5e0b5fb514676e8ba53f57b6b70badd5b290d460588c394ec0a2291c3b1a2d06803a94052e3be0a74af998d67ad80560d1c49d7147e8884746b0e076cb24c7203d39ee1711d706711a62f2b43b8c95c7299634e832e800259901a21611db470a40305ba5b3ca21421266526b0208e5ed9a24500e8efb69620012663afe0c01d60f61ea8a08a5cc084011c5158c0a30638728e74c80460c126669d80410cd5e6dd2180133c6eb0628009331d7f010035a6a6cda8808b39611804247121b2418648b2fc918b04508093363c61400af9c899e1c0024ccd3b004a1846010c30abdc20cc8b2eff7178148b240004e89a0c1c1b9ce6c18b1cdde508a9c30c1a4df50587000002cd10670024008612080986634b249417dc09183804a6ba23306011ea4c4018665f001080b0213e6e5b9080000005db49c008c0200002d470c2910168002cbcb54db16a30706eae823f2c73771e54360c30c56d36c024100013a2681c00000b34410c00001bc202a000900218602c372a9e30904998ebf85924a03b5b8060c00008344861a2ff25f222c084fdd59485000000176d2700230080000b5100032620461200064c2044230211181008c07c4603c03b18180fdd39b0a1a0b5292e3e89185b6cd2d4e48090d95bded9c8005b6c89a044322841400e30c28c15c6da30b0095a59432cbc9b3258fe2c900013a26830706e84df3c2c7377719a3c24300005c1671c00000b34416804240086180b87afbb984824cc75fc5924a03955a861963bfc07a58109fbcb86940000005db458108801000026c4000bd080e84c0702603613b2cd18d8a18128af1cc9426b0b1822d3faa84286453b7c422c808000ae56a70820720995e18804000cf7e351800001a0eff80a80c26010590081baf0e8a209417dc091630045de89c2c5010c81f3e104659077598a0213e6e5b9080000002eda0270c230080000b8101a1100c808000db880c06805c2400105e405814002082400476c80a92805044002724404d040247a011390081a803cb401c4200d1d0060a802c54014220090d00404801c0400c02001d8b200aba0043900198800844002020000100ba381)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 39 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase1" = "QuadFullFiveCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 39 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase1 private def zz2213:"s08a5"="s08a5":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l17 l22 l23 l27 l29 l33 l35 l37 l4 l41 l5 l51 l62 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x13de6e72de, -0x59682c120, -0x31d0e6d10,0x2ee0], ![-0x59682c120, -0x290a690656,0x10822d75a0, -0x5b2719238], ![-0x31d0e6d10,0x10822d75a0, -0x2d6c316797,0x988bfb34c], ![0x2ee0, -0x5b2719238,0x988bfb34c, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xd6824999,l5),(0x4df5b702,l4),(0x12a224681,l8),(0x71776e84,l11),(0x1c136ed6,l10),(-0x7cf47ebe,l17),(0x62eabb26,l23),(0xea57e01f,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x5895ebabe,l41),(0x2cb417800,l51),(-0x1e7257720,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x1e7257720,l62),(-0x5895ebabe,l41),(0x71776e84,l11),(0x12a224681,l8),(0x62eabb26,l23),(0xea57e01f,l22),(-0x7cf47ebe,l17),(-0xd6824999,l5),(0x1c136ed6,l10),(0x4df5b702,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0xc80610060000000000ac0620080000004208805060200000000110f014c0200000000001e0290040000094260900b400c0000000003c0124018000531141300610040000001884201c980800000c8581301e400c00000000b0900e60100000014848004cc0400000000016004900600000000036009200c0000000c81201860180000001b024030c0300000340208013180a0000000064240730080000000dc220166018000000000050188020000000320580e18060000000000580520080000000a44206c60180000000002d01c8020000000002e005900600000ba0e3004930140000017a3b00926020000002101300e0c040000000391881b180600000004219014300c000000821880d86020000000c41100a0c0400010e2b044054a00915854e10d02e5a401c0000000078381460100007314c230229004039031829000f0a00c0000000000840720080000000008801640180000000001a01c80263620908c011ab200e003a06308200b740140000000001280e40100000000013002c80300000000001c02900400000007229024300c00840e6104016e8028000000188a40d8c03001dc30c3080ac200a0000005110406c301000000000a8881e6010000000000230188020000000000320390040000000003400b200c0002905409007a80201420a4042003350060000b81403802ea00800000000026009200c00000000038012401800000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x1222ddf98a76389e0c1044e8a01c4f00b302012428f1658a120a1100428a8ef715f662890250084cf2c85e392aab12c43dc5082de28252ffe5d9f20012496c3980800d6e2f7b79c0090021454f9582df985121512df5ff16403a3c419f25101512dc71f1630206b35366102000002ee2820835a086adc580d2b44383150004c0100001b1324e8f0b2a1cc0c20000001d4f24901a578fbb7030700000075239238695e3047c0a143ff05538705062ebc7a2a642802f06cf6e5652000a4050076020001e1304417097c940440e11c7e76b5216305c9ab0bf5e48c09be8116c89030471f93ca084841dbca594b104004c1c4c85888158fc6fa8f6dc20a805000039840e817c7e3067a7c1a414301e77712694471828857ecbd4050a157e4ee30bf2051061bee7f240e289eab5a82000804b4d18fdc22020006780921aa040b64081681200007dc8004a3903901e32cbd844d9e185aa8bcc68d6a07b37d1832aba9cf964674c3a400000000000000000116b60b7bdb28a0e32c67fd1b0dd5d58a0e32c67c2622031831811000c00401b79e053a16439e879b84f3a008b1775fed1b6c30bde44e448c7d864c7d911c0886301f24e277f70b8f0929799c4fb05a59a24f0573a6cf71870e7ab87fa29c0505619afe0df8e6fb41bd6944b131d14f4f0c11c0c3f9b6029cd873d4d6a0009f470d285f4d78627648ffe16a670e004efac070c3869a1329ad53710bd63d65c39290840e160f7347c7145cf6ea5d62c9bf4699e1710230f118759372f10fb2be731aa567b1bc1022908b7c839ea39b0345c226fb7c469204007fe64a468e6d8b7df1fc2214b56f753743860526c875238850cc4c64a40fe2f00003c238cb2f6113678616aa2f31a35a81ecdf460caaea73e5919d30e90000000000000000004531000c860430460050040004bd5f2ce2400681fbf07af37d91629e2faa582275cbf00c47fd91853c96bed2b26982cd995e9be68a3600b5729a70d86fd9e99bb882c9631a024fbcdf21d09bd492c490a00073040e09406e2a0360501a80a060e1553b410510280c8c1c8bac070b1d116f96ecc304552f33c380a1421403f8a9caf1000acabab60b38701545c884beba2801403faeed8f514f8a5ebe9c54a68102d02c40f9d362c8d21518510fddf47d85fe090188732ec2c129c1430895bd4b3c02a1867abf24184d930604a2f023b06869020e8edaa07f01fc2404239d2587a9c02003b09ada003492bc50900330487d01c191fe507735920bfe379539282306100c8b2cb20618a149147105105030000200d00011b203803c141ca2b86e7770c2b73f42507faa104b7383b2d121438608aa27244f40609362c23800c80813369b8b051780c2073b5a84982e38250f12a63c6c050118b098609cc44589002f03c61821586dafa5204910365e1cc992e50c81ecb01980ba30a84a2a47220ce4886db8bb4a5e22602389d283944f43824625fe64d14a300081ac8a4c3e33882000c00f000041c6c91038cfeef081d81d696c1824505a5e4cad0b1026e572e5d14456bc3a50ec80a28c444f9c0c11c802c8e9420089d570bdb690084c0280001b62000c7678c2862063041042822021800019000100681a00c0cc0784169f994c37f14479846994096143135abb1f8a80c3fd4dc4fd49018214323157793082630f34f20e41413271934d6ae0413cd0bbf0fac1802ebd8fb8830d812005805803201e1200002ee0012409867be47a58c96ee79bab94312b3b1cdbc30a782cd71a01021484b6f406209101613a941405b1ed8a2d188002601471c36d7980018a2c69d27fbebc9dca18cfe89869a6b185000f9ba39108411a905be5ef39301000fa2f3a308504005d9735423200022e1a0e1cc460009f0d3929409fc9002e03000011a10004032000ca84001c908008a41e3dcfdbcebab0714098691dd7a38817ad6fdf88182025c0a996b10080000046500704bca3ab672e302000001194018005b1ef012d68002900c715) <<< 16000) + 0x4757108393e388e4f4deb390c1442b7f701f8fb08207fe805d218830c65932888ac4383bfe94ce54c7181827e562c0910a015bfb5291ad84004bd04628a21fb4801681400008a48188080c00405e0202e01000230902d198160ac0ac560542b029158140ac09c57c6f0a0d96bfb01b0d11b29d41f0b8d3ba4118ac02d2ca07cf2df80000000000000000008ec6597b089b3c30b551798d1ad40f66fa306557539f2c8ce987480000000000000000022d6c16f7b65141c658cffa361babab141c658cf84c62861864002801000c5c0bc622950aa6c517bd9a875734aedd445f1c0afd07d6944e981300a81ae1d7884294d61dd56e4029d1430925a1d23012ed7929d76653f132128cd1469674904b562676c651719cdb4696276f4384b47b44ed8d3405e187bdf4325ddb21feccfed6127380fd3c4501f82e7ed1c7c745546d5e2a52768d50260171623ef41252cb818396391840b359d0ece00a6dcfe8b20010804382c6a4c3aa18470cfb53a2001f00800003b9fa038323fca0ee6b2417fc6f2a7250467f4f5063b7ec2f31750fa0a9a781c601dfa88ec69a7082b5b05bded9450719633fe8d86eaeac50719633e130466ca83b07478675f7267c29753761ed0ace284ca69a69468438102f665346e96864a7cf34337ff424e8aa79578c3626af215bceb230b41415fd17c273305702f1e6ee41357a01b953f54f3d57416ecd2adc6985f84c114b64d8488d7380d1cf30c65262341d014ed1ea000a5e6008020080250500001b90240d81184c088260420b80200802008007a5115eca97e0376aafd5a34cb345e387a212f3ba166f5cb76199dbe66686a07112da73da26b2b2354d02b20aaf8c7d07652298bd723c40ad5d80e01e7b99de508cf224be3937749f799a1fa5771e41399572d3ad4577836c572a4a69a0ed5fc40e4c08be4f3a4191ed1fd58d451472510dd5f7780029940ca63df6ff7092f472dca46ac8856f20c809138fd272ba272f8e29cd75db0fbbc2de3871a203b17715e3dfb02c2415f2739f257871ebe12bc54a78eca21f34af3abdd3a1c5b88da926c29501fd9e32348a386b7575e53f40696e6df428a29a16e00831eb0be5870462f531bc0c55ee55d042b087ecd0e4bf1d86d4f31bd4363bfa10432f296120f8f818023ccafd6f4034ca4bb9387d467b5113c6835f4c8d3675358173184e234800023ec80f82e8083d7b7259d3d87c4b752001ec49f3650d78411ad46d56086fc92c6580fd92990e00393024ef1b34d3b1724a960dfb6ab2378ac32e1ae02cdf73d2dfb0aa0e21938500689d329b69f6ebbd853a4eebd6edefe8e2937a23fed3539fec71456aa5037f2035cb2baf28885c215059cee8273215fea4ea39b3a434e2e8532e34e07577eae8cc8b2c9c0a840e817dc69a9b23b011e01059681dc3716a6b880b8bd1887e9ba000147080f08807404001d864070070105bbbc3888150cb659706156cadb37040c25be04502120a10004006c260340bc6597b089b3c30b551798d1ad40f66fa306557539f2c8ce9874800000000000000000228308075b05bded9450719633fe8d86eaeac50719633e1319010a10810610c000005380f9bed7979b704c67703dd42936183ef27a8566da12104bc81065cf2a49f3398a9a5540537c714659d626ec7b81361cc82a68001e09a215c1d97c342b9963bf4365e20336d86260e4ab54484bab85080b3fd3ab70fca07b27b493f01c0215be430b132338c35649d040112201d83101662a2ba10690804dc5f8c13ac40435fad0ee0137758421b12ba06b9ee8a7200e454bc0931a49d3102d0720000c988004111fa038323fca0ee6b2417fc6f2a725046539d733f7d274caf6aa6cf4025c19839dbf5e0f6695472c15eaf0000000000000000002331965ec226cf0c2d545e6346b503d9be8c1955d4e7cb233a61d20000000000000000008a62001d6c16f7b65141c658cffa361babab141c658cf84ca2820821800000a017eb5ceb124673c0178908e7eb38c0672ba29161a6a9e2fd4e46e49bca2235ff527e2b019396e4a092b9d02950942b7400e3ab567ba859d3718ad79f31b1e69e1e05d9c1029b11b495368664101ea72486ec01fb0c49bc983c1c8dc4c6fafb28ba12c8adf70cab4d76d820adbace188140244040008c3de2f5b6a160339315a7c40190c844380a011901080400002d88000ab90008502004de469ceb99fbe93a657b55367a012e0cc1cedfaf07b34aa3960af57800000000000000000118c40033d7266282a480b3d6433503ab7cfeba1009958e6da38a0610c9600000000000000000000000000000000000000000000000000001a0c61830c40470060014008d5f96936a7159a2c4f35b2681cc76ef94c79c19f0cd7152c1c7289fbee66f7da559f57335cd18318ccb4a2c3143e8074806956723c2f6b333024babc47f6a4a5a1875d019010002b19003389200987a6491f91fac0d6246a812533082245050c6646692432a1ae7eae4143007d37d2d20c35a53451eec1c20233837211180046362e2d41000177aac436192420a00600300ba200000287f02e28600000006331891bb1611aaddfc245284ae9594764710712a5e7239f143096e30d675d430e30e7c67d1e81c2000005192d00900ddac7648b780dec9082e03000b808000938e1a16a66df82f1028a26f8ec296185000001a5e0048653135f8415080d172f110b838411a918d75be218101e8488b7aa2801f719d6f9b040096e4950a550aec48815810000087480b0ac05447c49e7dff8f41a1440ab64820e7a2022c3001be9101)) <<< 16000) + 0xc234e5d7a6c310c1055b2284f1d0417be86685d4e1801a5a70500280c01b732992425013fb45930729532a81c2c028000111101401e20018466ca83b07478675f7267c29753761ed0ace284c450e2083061862043802805dc53d597ac97b3c95242e800bab6771710c4b7ba022eb2ce10dc27501305d92000012d0fec2c700000005c2e143ef3041bc1ec081c5a884be9fcc50c1724c88332d104184a86167770c190f98bdd6d644080f16bda2da250060242e257720cf12105a0580120100012219192e91fc5c70a11aecded38a89128009cef2c8a0c10ced95ef480c000011940070d09c1c303a08001377cecd48600a7b347a8905017c6195d7cc5644881400e00008088088ac0404702faa5b1ee7890c2855b254cdbd121ad3e691f7f6101c22cecf406e8411a3e640fbbf0808808b3c76ab8e01c00b3e5908080194ccb620c9811fbbe9decd4a96ca070b00b0000448687b389b8a0a80a18072102df63186000be458bc0a141e7bee2b8d2050005f22c5e03040047a17da81c00479a6615305000749baeb9a0c001cc78fc788672420a80800260bb24000022e7e2891fe93df244b1c000000156287d87d8e978c81c00000bb802860c009a7d603080000177002802b82b3ad2c3202098040024020001cc323322975a42a0e300000177001422b7e715cd692200ba4f132414128db73be109004aeec91a6d0c00df99b4e0c0a002a3037ac60ae1020500300001cd20222b01011c0bd6e86e4d20c28000023280486c9990c832101856d4d0eaa482c010a504d0e04a5fafe78820004c44553280e3586cef52a49c709805000036c4001fc080087a100f017d01baebfae0ee6b202fd8dc021d411183006cea6600b43a41116dea7d86caec67d580b305da9fa18a7718eb00000000000000000000000000000000000000000000000000003398e18610a0080060042460d2632d5d91f6732214257b01af1022be20509ffd134b6dd1374a75550e885adc8e1fdd6cdb33704977c02fddcacc0482db010e7933f1f2721785eb53faef429bd816165be64a5095addfc0247fde668d767ea3789692b68eae059d9a805a3f7475a1130728d314b1207636f9a9fd4a4c111b02602e65e669df273f9b2b1a718a743d793ae41fcdb43a7e957215ed4cf2cc1970423f83ceb305cf72887c3dfff7c9d3e9009bd35c2a0418163d7d92c0eae403dcd952fb665c59b25b6b369966e143b615b779d5d1547346e7e3e21a3dd79c2799c02806e3382c18ed45bc0e659d981ef9012a89dac094044dd139829166b9d865d7c530023502b90e30c92ec29287d9102810112b3db839815df037600cf0acf07ab4c4c7eb942d2d260c52bf937c13e7e8658044326844893d5d2a4b0ad6a1c94da5681243569b5c63d683a6b35c84aed3fa750f220b51c16666a97268e6a954b46001cd8d199393191b938045c44af8ae091680499e1469b6ef46b7f3f634a6698525c3ce3b394455bacc0efb9ab505cd72a5a6c649e1c8c248200000c0d542c6a3c1ea0e7cc2f92a394d0ef7e9ded253a74c1c9eca9354c59cafb7149e12f6f10002c8fa6348f2b073f8a29075b2cb1d3d87e1053242f5d089fbdcdb414f6dc9be3a4b3cbf9c89828de50b9b61bf4f834f63f24596f51c7cc03d8ee066fc8652b7fe2f96214439a91268f9950972e062b7c0edaedf372be46536839ce460d4aac8a86f88776e664bd8c978a523797da169fb3653bc123b97b011c0bc8ad94222fff950b4afab75466ccbfa25f95c92deeeb521deb9aa0f23213144450f2e844e76088146a74d06618e286e34dcfba20470be1be1ce104a80e6c37c09053337e91dc1201d62b3d66818000002bf200788042701c692163d9e6f849000008ca0050e3e384c38440a5cf9eced638ac07f0c2fc40968c690bf6104de0661530482deef987e8620109005000034c40381723f758ad600e3a47626519237758c0e80c3388209820e03368d2f68c03368cb2680000dac158208001001a0200016132380769de0fa309186d797afba6c60a859f8d6b6b1241801262263e70c0890858db998410439ddf0290e0280003a753ab920c01a53e2cfc4c3e62010b40b1438505b0b763048e2d3fee3d22103879696409fa48c69626ddcfb1208b023e75ea60837ae5d4e13c0e00123e41bff01d5b77ae30568e08540400001cd20181200b05000203100a1580488fe62ac3c4c38544126f01a1a9ff8202cd1cf8de7949a0b1502940000000000000000000000000000000000000000000000000000ce0c20190c28811408808e00a008002b8baa311a2e383e00d00026220017b44004d38800d7f10021373047ad6fb19ec1031775c50b88122000000bb801022a984f60b00e2000000bb800a18118086ea90a100fc2f3d618a00285aee679910085002082298e76b0ee88e9030db2a1688e00f244000000e4e1c004086a79da39fcb447100000039387000a0807f208bf6100040005e482959c9c4e20e08660700001e820100be3e1f33ae27a38a2cc14bf1f901800000ea60386575adce678e004d1d30f3e280000000bb80000002ee0560826004003008000628f1c2f9d044eb0c312f4ce9c0c184836874276638472b4a1644860950a55f91a8a1000001d4c00c1131e1f2bcc20072b49a1148107ba52f57954081380800007a48038ac01847458f2b79e9b4286b0618c6e5c60414f5b711f0a0b30eaad940101000002328028066f2bb201c3000a7ad723f8206fc9c9c524128bfa4d24671c2700c0000f110050100200800c0400402000a01200202000010022f59)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase2" = "QuadFullFiveCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase2 private def zz2214:"s08a6"="s08a6":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l16 l17 l20 l21 l22 l23 l27 l29 l30 l31 l33 l35 l37 l4 l41 l44 l46 l5 l51 l56 l57 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x58ceff14, -0x59682c120, -0x228a33860,0x2cb550a48], ![-0x59682c120, -0x27a59fa636,0x101fa99b34, -0x5adbf7344], ![-0x228a33860,0x101fa99b34, -0x2d6c316797,0x988bfb34c], ![0x2cb550a48, -0x5adbf7344,0x988bfb34c, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xd6824999,l5),(0x4df5b702,l4),(0x12a224681,l8),(0x71776e84,l11),(0x1c136ed6,l10),(0xfd01fb24,l14),(0x494e71f60,l13),(-0x381818d2,l17),(-0x813bec8,l16),(0x143e12cde,l21),(-0x300afcb12,l20),(-0xc54e32d,l23),(0x5483b764,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x9793a778,l31),(-0x2aae7e38,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x6a9895b20,l41),(-0x74b1ec8,l46),(-0x120ff3a68,l44),(0x2cb417800,l51),(-0x6779ef9c,l57),(-0x140924e53,l56),(0x155492220,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x494e71f60,l13),(0x143e12cde,l21),(-0x300afcb12,l20),(-0x6a9895b20,l41),(0x155492220,l64),(0xfd01fb24,l14),(0x9793a778,l31),(-0x140924e53,l56),(0x71776e84,l11),(0x12a224681,l8),(-0x6779ef9c,l57),(-0xd6824999,l5),(-0x120ff3a68,l44),(-0x381818d2,l17),(0x5483b764,l22),(-0x2aae7e38,l30),(0x1c136ed6,l10),(0x4df5b702,l4),(-0xc54e32d,l23),(-0x74b1ec8,l46),(-0x813bec8,l16)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x9032004000000c8440d8c03049436032008340140004a0d83802d003000000360e009300c00970d819008d004000000000980720080004d0d83802d00300244360700234010000490d8380250030000036064021301000531043a00e50040001884609014400c00b41983901d9004000000b81b00e300c000000000f01880200000ba0cc01630100000002d0f01cc020000000b83c063008000003a044028c0300000000024062008000029250e029002000000000380d2008000000000140c801000000000c4072008000000032140cc01000000006400b200c000000017002c8030000005c683034004000000017404c80300000b704c01930100000002d0701cc02000000005f00b200c0002e008c00a4c0500000b50580293010000002e02c02cc03000000000e8052008000000022140cc010000000844805300800003b2109019002000007118406c30100000001d1903cc020000061104048301000051118240cd0030000002609022300c0000000009024802000000822102c300c000000000901c8020000000cc84053008000000002501c802000000004c00b200c000000002102c802001e4510cc024401000000188440b0c03029828826012d40140a20ae08801b50050013423048032401000520a81200f5004001702807005d40100000000098024803000000000380520080000001109018c02000000001c009200c0000000012014802,0x2105003c30100000003121018c0200000c484280640080000003321018c02000000000110320040000003123038c02000000e82900a300c009114449016900400000510440953010000612182c051003002c4791980d640100000002d1d018c020000000bc740630080000002d1f038c02000000084440d3008000000320d018c0200000000c870330040000032064028c030000c8420a02a400c0ac10218409310050031053044029401000cd14c1100a50040014c330440494010000031170502d002003487309c0934010000000350a03cc020036c7309c0964010000003604806cc03000000000280d2008000001984c050c0300000002e00132010000390d04c0510030030453054029401000000388d808cc03000000000e4072008000003a8cc04cc030000000e44c07300800000001d002c80300000510880b6301000b514c19010d0040000000b81c0730080000000007014802002f8530640464010000000002e01c802000000ba0b00b300dcb1810e300b45006000000b20e013300c0000002d07014c0200000530640423010008211c160171004000184761b023400c000000019404c80300000c50cc0293010000000019c02c80300000ce0cc02930100000304360124c040000000c83c0b3008000000361702cc02000000d22e023300c000000003501c802000000da2b013300c00000001b002c8030000000004c0620080000000003c0c801,0x3c1c0a3008000000013404c80300254630cc0294010000000013c02c80300278630cc0294010009119836012500400000986c3c0b4008000550d8500cd003000000a81201b300c000000000b01880200000002200132010000000002201c802000000a21e023300c000000002901c802000000aa1b013300c0a11161e00331005000000005400b200c0000009838024c03000002606402130100000820ac0c18c05000004108409730100000000005024802000000b82300e300c00002e8430058c040000000b44c0730080000002e13018c0200000000d870330040000310e090350020000000c4380f3008000003206806cc03039c4484e031040140e111e10804410050000000c44c0730080aa1020c4034100500000330640423010000000001d02480200000a42c14054008000510b02804500300000a82c140540081021c630803c500500000002600132010000000260701cc020000009a0b00b300c000002483804cc030000000941c05300800b814c3300b1004000000561b014300c000311582805100305d051863004c40140005a1586c059003000170561b014400c007118c280191004002e86314c04640100000000a0701cc02000000000f805200800000000a409c803000000002b02f200dc9186082011b50060000000000b0320040000000001c0c801000f02106809c4010003c0841400f1004000000220a00c300c0000000005018802,0x430608a10192401400000220f002cc030000000847407300800000108440d0c03000009c84480a40080004c2108c0a90030001348224022400c0000002613038c0200000988444054008000002508c0a8c03000009c844c0e40080000184210254c04075ca90ac008f401400072290ac0350030000000341c05300ba22891460023d006000000000e807200800077290ac035003000148560b014400c00e12985900d5004000158560b014400c00002b0a0503d002000000b20900d300c14c2083900aed005a3c814714085b401815520e39c0f6d0050530808e1019240140000334ba00a4c040000000c8b807300800024623c03c4c05000000a249014300c00002849101b0c04000000000170320040000001511028c020021c730580aa4010000000252101cc0200390a60e405a40100000000004c0c801000000be3b015300c00b31f045035500400000b91d80453010000002d8e8074c0300000bc1cc025301000002e07200d4c04000000b23c035300c00002d0760254c0400000b11e4065301000001885200e4c040000006a2b014300c0d314a1a00d210050000000685405300800001945301a0c040000638a102483014000000000340c8010000006e2d014300c00001a45701a0c040000006629034300c0001962940920c050000006e29034300c0000014884050c03000050881024c3014004c0d41d0321004001182104403940100000000a0603cc02,0x3c0520080000138110058c040000004a0900b300c0000120110058c04000094260900b400c0000000078024803000000682900b300c0c116224803490050000000442407300800001544701b0c04001444b0f006c401000000cc130120c0400000310440c830100f208a0b406310050000005225036300c00010e1ac0348c05000000003c00b200c00000d42701b0c040000000006c062008000000001903880200000005844053008000001509402cc030000000584807300800000000b00248030000000036009200c00001a8210058c040000006e1100b300c0000019024030c03000000064240730080001a01040098c050000006c0900c300c000001902c070c03000000068240630080000014864090c03029820831024640140000184410210c0400198310a0096401000014e2040920c05001504d0dc04a4011210d504500d4900602a04a869010a4014005611c3301a900400148490d8025401008f0c609406c90050000ac4c1c01d400c005c12431032900400164480c809540100ac12618406290050014c32088039401000000000160148020000000005c0620080000015848038c030000008239014300c000391a838049003000000622b022300c0000184550208c040000000645809300800000000160348020510818e301d240140000028844034c0300000811c406c301010c1882900aed00583c614514085b401811518e29c0f6d005,0x2403080300000002a00132010000000002a01c8020000003211034300c000000110f014c02], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x144dc916ccf834823e8679c0590f713420a0a206b58ffd9900162f202ed0800672d89c8033081180438dabf98c0aa798bd3c5dfbce306df9e72c1e2033442aa63006345104da0809a89cdce26002300871c2102b5574c38d1e753c8ad79e603538e35440e3000232630ea7901cf98a3a9718300015a05ca86183b02ae5760f0213b783e76d4800290140000e61d32c3f31f319c5bf5e3106938727fd7df66706b267bab38c080429e3d59611097aa4211c021bca79b6ce084601000016c385ef496b13b86952bd3022039a32bc202e9c0684d5569b5ab16081569b66e650259f25695f0c012d329952494708260140000c31b2dd5d5dab10b2a36f61cc90c249a6ddfc5cb241e7655130c15617eef440c0644656b1b4e00000023280c02b4344445c2002520663808240080a20480007788004219c1d9950301b143ce5f07b822453debaedd85068514deb50800ed09988d0e0007564b5714018a80a39e82ce28460100001742048330221980f86ec75d4958a458b1995583b6c0246eb8e17c5188187fac8f05020498f8340a009096f02066cc14057f28d163010114e11dcfe96ae484c0280001ba22864b1) <<< 16000) + 0x4211e0e079f3f90fbc143a2a22270d99250c01d678037139412c70d655cca63041a72cd0a680041060ba8066a80082151ac0177dd1405389a6f7d932a0acc881c2e02c60eab72fc47e8d4090b0d4606e2a792b159bfb55050ec9a86f360af72fa496a50b144acbe5b10d05005071fdee9b1f9cc5f55d7d8c5c0a973e12e62e24040062174e2c697f1b710b718b7d542f015ab05fd0380291bf800ac7f95254beb04fa9b702ad5682c50a0a28384bea8a6261eecae53a9035ac0573693dcf61500a4b6d93e9e215c16047f474a0a39303b000046f2048430221d80f88e88ab35a5eabf858e3ddc84deb88b18fad9d35a8f12343061fb461020637954df31e4484890c20a58cc10487d01b40330a015f1ac7c561010056d7058560480001f620011c44504477659a4d6803c04ad024a80acb17c90d13e016aeb9759b5e597d21b0c720a007a0d99031220e20c10a00800880a89022ac304533ffb90fb81d9bf7b2d81ebfb506e6204d589c45c1c50482001da876d8e24c72a00053074453b7fd600172c5f24344f805abae5d66d7965f486c31c82801e8370971fbd762af3607a5f07dacac455e6c0f211a1018a18a08600402a02a89744bf8abdbaa230d6e534508cc7a9bd5996828d13411bd533224f735b754ebe932a1b7cc9936495e5346a44a8a798050500035630303457d378d702a46a9d178f4c1de515eaa69eb16e858e1c2e7dc85a0e79889074064a655e7764a1b831d4e19f259d14271219a08149d3fec58a978b0e0c41b13daa730da928c510260dc850bb201daa210533c07e0e0204149671f5bc7cf91001411b6589f1212d7abffabb87cd09a837aa7825e5979971e08b60d905d557292ef828f1e4e0dcd02d4c1f1b1dda75729e1c6cd62c7b0082ac9221a6a40227ec93a348816849800053933104280f4c3642b6da7ee355953e144cab141a7eea61b80000000000000001e88c08808608c00a0080000140e6c7fffe551400a7762f39c183261d4002d41604c52abf861be129cffdc1c51284d4e9e480f944c1428e2823bed57105f5d6afd304d09d99dd099128481a0006a04500e427e4213e1589e84c4f0262760a13a0170a9060ee9841827128ef07f020436d0255c81805a98e1ffb0500f7e108ee60002539da7bb010ea570eba035006fcf42328e154566b58709804022833139050428284380501bfd638ae72cc0e1b1839870dcce0c19d536d56b8e81210457f51397ce920002db0458ec18c04b958fe404042a255039250f5102ea6f2509321207c56b14ddd845598c50600709180b4c7bed1250b032cc8fc282455663b9765f8c201c05a83bf05101268fd9008204069d1fdc0020045e10e50c2060145e1b77fa0409c1be150a104e81c2901c50b28d53ec8444915547841f9e1102801024a156618403fdb63559c40286a2002fb18304e54214f8eb0c002114f3c1790090ddd7f04c44b1c50ac0902702313701000104103e11d909a2c034fd143d78973ae9c50b77e95baf2122b9f730035a28815eb221d7061ee23cd51b8304039127dbd0c09a9b5d6a764010a8dccba504a4209805143cea4660152859de8b35b848a8ba486fd45105d5024a40e180559a2c9041f10d5e1d813041180400004fc89b06c4d436026120120109a0084cc040007844002068800537113231d929e1340cbccd728581942eab89ef12286e7d164a0374a10de22e85742c44889df53b39db882002d6ca6cfa830080083d83d8cef615b13dc30c40e164de537c0acb6acfe2f02c806277471a3d9cbafda50e01135380322c8d4580b1a8e0571f19004f2891942b48e7f933bb66993a0082548ca58311d123787018217b5ed49283cdc6fc0700192855f32ecdc12402510b6d8e84042384834b622e586be1a5389995f42cd1e31b3ba55a60e3ad6b448614407f3f43970a10761696a4cc0437f838fcf3801280434bda661df8b52060f81c6910f02808196411259919614284bf42918fe72840265432fd286286404bc11a85c0e080015bb22d00180bec5531849a0380003d9cbf0001c812005e06000023e3ebcd8794d204fa772990f6458587aa47703c8a8c341a9681a4000000000000000002209851041839831631428e0645f1c5704180068000d5100059620011206c8010ef85c9b68285e6803a94e38b2458d1c25af205228416e9e586129624400aa98724004181058a02bc407120031a714e2c14210022c10dc919865f4b4041801a2c986c2aad236485e96404eadff2a76c0d0b1a0523682b9bab6e50a8f1eb31380a23b1c203b5fa758d6ca3860846940930bf07b07000d8220dadd112428003846234180d007d0901008720a8c2b39f036ff0c24537e34dfcc1faac191ba4b1acdc48654ca147ce02b36080c4b1b066b0508c5e7926d27002400861498cc347a318494e8ce7dca60f10e2d37be9631eac1774fc60439559e2e90a10485f72c0e4820006199500a091159d4a1268000452dc0049002600c0000f210003702000bd244c4260010526883e8aa2a9c79448985c343fd15988111611a73cdbf1218ec9f7269f9420354e69813b1d038070df09efa068300686ae4278a72f62b84178182887fbecf19232876fcceb117c28583179b9eea284346e354dc5244390c8f2d642420384544a3c1000746f5713d0801b7f94bf876900850028b266bef5d4aa5900dd386ca52c6950857d639429fecd4489891051c100b76208b44a67e4c1012b83b3e864e004a010b27b190fa320590581cc292f2c6e2e734083942d3726308509122367560b03863875b3e5a20100061995)) <<< 16000) + 0x00808efc4ef970c000114b70012400940300003b64000db88002a7913009897808001d8082006e477a4b77e06c407edf5f3be2c70cb503d7bc6101033b37b7451c2c767132ce0300a41eeba45c20076d74f244a9470c270145115303bcc348a143f86bf02efed050b16376eb5ce61223dd517e06ec63061004863817b0a095446992feb420016bdbf01de28603c3aa0703bf2fd08042e02c59355c5b90f4590e53c9418c58de24ce07d250b06d9e8e5c388564dc7f8e208a5c90250018457c107a8b380120042c9361b47b322c8b981d937d2c57b2c6648128523f2cae311c4074d8756b10408e00109c20100030cca808123e9a1959300002296e00c801200200007408001ae1a20b27e03063bca1e29c90324e70a147a314172e98a1109ef57b9d749106f418422a9460c1f5de1ced044001231659b1803006a2005eed35c88042c020591377a817802c681812607f1430df37889647103d6089aac5866174acd952c18893ccb89140000133f9d270025008591d5e9afc6e79431087c4b9a7258b2097e6256b1428044d0fcba0586642153fb910e1091024c1cfe5826916a40dd41008001dbcb66040000544fc2004e9002a01c000106100039f2000b464002cc489706c4b40425802000d1a22562a12a150948684a00424e020027fb224c73125358921ac0acc6246631223189096c200a62405311f25d0e020a0c4a0e2808004f2a38562b3f442011861100420249422d0ec40813c775ee28021ce7060c2026bf315650240c2200800006f90ac0588f00c4740615403c240198ca43091c00c17c74c910b0f8525c030e48a8d5de89010900214201915b7be1c30f6c54e56187fda1c27f0c0024fe003c0802a54729ab2504230080000871b204277de62080d15ec7702c20b94916f4f880412ba25adc60002759ce5020038d4160142608240080000a2911c0988d80e65abb08a18500a16613c773b681c74b8d5a029513ef70acb4000000000000000008468a7d55c8c7092e358c4d208ae3301f8cb3382b363fb9a4380000000000000000209c9c4eb2d950d6a7a058fda63a0a7a2cc3dc686a9e89bc560000000000000000080aeb9759b5e597d21b0c720a007a0da1430a10c0060040007ac4e39bf532dc4650876e1a6293128c01152ec782667511cef643bd3f3b7b0e69e9650d094ad6724f4f6ca6b9d90765db3fcc30656da4de242a2e8dff68418898a17155e02baad1fafc22e8c215834246e05e8d032117da64a837fbcdd0b46ec870d37318ed4569187a000e6a44686610a2b000b1022324b1182588b92c4589622a33114198898cc448562222b110118878282141421c0281a13e624ae1e6d00b9f072699b874001e1a403c4b3a048006aaedc2512821100434cfcc8fe95cd241ac9800c3480b84d5040618009953c4345647a42e0e5002200808280800047088204c434162180bf30a57758db9840320e2163307313970a3a60934437978470020ebb5500001142fe7700260c2300808584840c040002d670802c5b3e16eb040a33dfb30a0b5a9b0243763e14ebf4671344aeca3569a4efbde12944b0f19e5b3539fb840caf4bbdb02f508d46f9296eb46f8567958a477be3649d55728de3028027e0a7557f067c04985cdaa38495f9afdbcc11270e992f06267a1970928f94b3c60a400267d2aebaacfc6e6d94395fd3acd44b24f7f8e4e93f84cb8845f5c01d759343225480ebd2325c3a7e7216eb1615f8961d68991b2e6ba443c59968a2b95f9f843a319123c00002c39818083f254294201968904c282e9d3840ae402145e167987002160b273800328e11804000046887e88e4220e2adbde5467c1b8391963d99f4b4c28aab12335d28d14df520d24b63bd5687abb7fb039cd1573d8b4705cd7556e5a871b82032df2c5c8d6ff5aeeaa8f2a25415c7705afd70b14cd7ea5a86c645ecf20f8e9826008fedc40bb7addcb2026bcf9ed7165fcd3e32c9e9675226a321ad1c336d24fd349e971d7ec353a77dea204b089f6126b3a4259cd70ede851c60bc424dea6298b37e06c3dcba6e57c92e98e299d6525c08895292a0000aa24428a61f82b9a432e0bf020abf66b2d05823f645ce3e8023962f921a27c02d7dffea196959acc8b3c4d6a06e2d3140a72f9362d368cfdd9a5e0000000000000000004622100c1025b56ba680da216da830bb3321a036885b4255202201100080401412c48231cfba4b04bec2ac36be418eaa599d73cf54b99236e9d3f8b7ee4bbe2937d96f37c3160b46dafb677feb4b9e23e835b519befbf456b621346f6592f9c0b96b2949572e9a07d9fa87d524313e47a8002b491093588418c41c8620c3bd30520760633486374b3044d1fa86370b91c02494438000903088021e7727cfb010f2b5ceb1a6c793c4731d922071173cd189020fe7d5a0e5002100879d38d62b1c3cafa4c23c39e4ef9779cac810a20f13f860403fbfcb3240018ec2ca88018a9184d2700210080000ae1e373e1e065071389995f70388e02ce89e9818e454060c600d692c3444a0842010000104220a120003ad220823c2f700a575a307301510048c1887e3d70720510d43d62450c6c1b2d332400e24c1f887001993f41d009c4088020206020001803c30a31b69ea70a1cd95054962fd0a22518500a338da740c007e0220842801548b7ec8004c304401000014122043b1011d88006c3fc373104280f4c3642b6da7ee355953e144cab141a7eea61b80000000000000001e91080750eeaccaa21bdeac9800000000a877566521199420818e0040000208bf5e5163be)) <<< 16000) + 0xdf7394a6fa723e52c26863493fed02f98205c54503a61050c93ee6318020e57d28ff06933c864852a0cb3225d78cd6aa400d2d9f7c4452faa376466ec95e010fa7e2425272e88e6c3476b723a966f981400127c87f16c3f45721b965c6dea3865e079eed0c00375b0bb818075163da58201c3676af0001430561f82a00a804c704401000015121f82bb0854e13fd9c86871153a1bc002c1935faed890163c9ebcb290a0c54b91fdae9ae92ec54a7b2c018b306af5b480852b2459d6c8c8dbeb10302006f96faffb574c2a7bf0f21dcb924e4986d8201a647a93bb50b8d94842494d6d368c4cb3faa00a80f723609c7140bb79badab1bf32939448280042ef972eec175f9b09ea36a9dad6c15e18502196858b3703130561ed0f2e92a0458d400012c880099c90810d84000c1fc0720449fd369e18704fd4235a9ce79f4d65a142e34d26657e360194b7e8a8c98ee60e40788aa1ff7eb2ad93859d16fb05271b15c61463e080367e268051f060c03a50a8232b7d608fbeee58eef3d800add19bb777dd4105df6389026f2e4190782e742f6f424e6a5490b73844d222001886f2e1027e0ef3df95c00b9efd6b88fba8068280a89797597443eb94ced327f7d89294386bd1b1afc0bc75affd59e3eac2515b4b54015401763fb5409310233f94227c1deeb42190ffcf0e950fadd90e0d353056bc47052ca94c26fa72a9f834f9e3e1fb7241feea59eca8398a52d836c5932de983c0a9a7ef3878a8e284694ab26dbac2c218b4a38cc1300efd94c5a989d7e94bc54d84a70c1a3749922ae345a9624411bea80cd081626637d88c2f7e659791410003a1b0014101f00458e0aaef9d42057ee1306d0c2c1417d28c516a9beec742080431c6b00802e2d0cf1804c204201000013734300d8066ec51216562770602db3eef9628009707e4a80120a10804000037c87604e0380200800002221f6430fa2187c90c3e0861ee2b0f61587a8ac3d057c18cc320a4c30620c5da261c0bdc4fe9c4580b1c34f26920003c0ad160816e253442a84c20440100f30987904c158261e20b0f00587782c3b8161da030ec0187580e0180200802b01cb17c90d13e0163c7064374d005a54861388b72a8bf5b1e26b50371698a053908ae36d54e9e61f3380000000000000000008e996aec2286140285984f1dceda071d2e35680a544fbdc2b2d000000000000000002104804a78e386900580070f83cda86c8a1e224a4830a3a72008865f8acb11dbf7b8549b54315532c9ab4efcea3cd39799b2e052d8e0d6522034f8f3747083937eea58f910831a6d3bd6deb75e3793803b3bbe676e1d3bcb411444968002be10ea15c441f3a621bca1052888427183030682694e02369d4e914049060880200001cc43a467421ba3df59dcd25823fbf1a43c3d7e93bf78a2446775aa81e5dbd622cd696660f2e48df4faa63a7742cd78f0f2b4bd68d695c88c831725002b58d71ba145e80eceb7936ac6103f91fcf0e953efa6adcd14ce3ea5338992b712187c2f0c0f3b1936ffd8a0cfeefca2415810a6d048005b6f6f8bc7aaa2ca197a1ad736e272d3836e74341f6973987bed26f87c4f35cc746152b71bc818467ca50051d16d85e3537fac7b8a201636c8da8ea1ea1cd06fc31849b853d15a7850fce36e43f477bc78e6fc106a7d4cf2ac7e56af2f3f2b3df3ecc5557677a81547693fe24918b8b0cf86b04304128e54a1d570ad87794af10bac675a2e2b7a8b330219f2fc6504cb336566f5b3892e212cb518b9170e321ab63000044510e82587390c398461ca1b819532d1d2434cd509d3d1201a9fdf195890d03c8631c503130fa55f5449460840201c8130e305f2793e8fdf8696c252c3805478e0c86e9a00b39389d65b2a1ad4f40b1fb4c7414f45987b8d0d53d1378ac0000000000000000100884034243142281280200506d85dc726c6ba1b9332ce270007b22dc2f89e71eda7e0f39170b69c9635cf3ae2c76ff3900e9c8131dad210e152fc0a1e5a2e0f548368bca0007744388541c22a0e01506f828001588800ab790de09000bd71001be3300c0100450c236e08c00c20055686641872bb611b7020054e49a6a05030880100001bc60200200800002221ba1305909c8606cf7b2d861bb99d8b88704220d6eee1608d168acaa1033d73124e84a10440108253633c72024306eb4b1185820ef92ac84205c9defd989c0061c55616094208c02000021e4158361b80b80600802036c07421790310e3c14690b5420811f76e4b808c307c021450783ba150e2a0b5a82e90077d0d23a011861000400002ac8000b710001c021b40a00044f21b2430d82186b90c358861aa2b0d41186986c348361a2130d00100035f103e11c0e151456526d8f68a0da82e909d946688e1a065c163712872181386bd6a7e46a820835138b11714db70800f52a9f398afc706010105fbb7764aa04065e5e45cceea5221e848081037054692462112c19019e387812e206888deed5861d91182ebc3002870e09c0ca104401080200802249012f857082092da6507cc608127f04498e0079c5b2af2808460080000de200023660b4ee6112c1059502df13dddaed3892c9f9de2e79eb88d702f6b0e74e04f0f5fac0f703468d86e87001f7391bb61da006ced245bd30b97cfba37b42b26f297bc7ff2cf0c20f65e348cd3eae82073d3c3cf1d6f4d2396e51d139ca58783f7565e8ee4fb601d78d7a71e2d393c4f3a6ad6052a67b5cc948a6dce25d261a42612aa462d3db70eb5b1c3d749cb0d000943b987ef92a191833cca8441a688980004e)) <<< 16000) + 0xa2000e8c433c5619c2b0cd158660ac32c56194230c91186406c31c2618c130130906284c04804188020c3010005781003689200c12e6fbffd432d2b359916789ad40dc5a62814e5f26c5a6d19fbb34bc0000000000000000008c5eda038faf8795ab9ccc9ca75fe5f298d74e8c74a1f3d7cf8000000000000000020935fa5c0ae91dd5997c830b4c78e46cff4b63abd6abc0ce37d3c0000000000000000000000000000000000000000000000000000ce630c2023008050526005bb0f2263cb1f57c4ca6362fec203650486c29482294264df35376cf64e5d18f38deb3e12a4ba9550b5f384802200e93cf2f65532caa8ce9136128e4167c68a510bdb779a0f19906472fdf9981f935ca89091d2d004ed8aba5371fe580240406abfd2f4bcffc88b5657a4fe694010e1e8caa9b0734b483e123d666eba7e8b90a44565dfa998a8de5118728e3e882c666bc2cfc3c139f1a9c408e284552283208062ff8338f5dc058a80dc086bfeda19ac06c3c0c09e550b8330d1a6be2b94308341821a0c00105f8080029a0803cb8100af33383cca44563cf8e6563b50ebaefbc38435920b27e1afaddb622da54c5450930637ae2a9f3ac01e41ae27298610671c389e7e099b896e168d24b181130ac22e1dd0ffde025e1764ac28096407d23b601d688f2601902910815c09018391ca53fcfc525565ad2ec9ad281c960613063388c02f82617a130bc0585d82c2e8161720b9559bcaa77a2592a6a58e44a1c66bde2d145c095b95018ca8b00b44bac87b34502db1a6c1e5539f70c761ac9edc52c349da9466c1fdd555efa953b4e098830f4bd3c4142052441441021816cdd0e90b6b09e8b2c2d27fd32a5f0266087f600a49a4706b07e9d105c09b19cfd849cbe462a3d86409939986f6befee73bd92c45bb5a3d6cf345767cf1d37ea2a0c75d02405caacde553bd12c95352c72250e335ef168a2e04ae063511dd2f8b0e24acbc5b2f2955fc81033cc3196ef492a71b60f882ad8d360f2a9cfb863b0d64f6e2961a4ed4a3360feeaaaf7d4a9da704c4187a5e9e20a1629028a20810c0a8c74f6ba20f2cc3aa5dd966e88eb6faf4b3b50e898b1ac416585395b6ffc17e80b7e6d2d522bb45b2c2b62e7ce46697faee140b699762ab4d41f26b47299d36d8e8b23fb7ca250c5069cd7bacac59e5d0a329a96d00057b3c4a876135d480d095f80bb103352e3e764708f09a9ee30c1904227b1d425102200805c02c2dc160c60300014d216c2a000b9c216a4b0b415c86603e3ee10a13464fa462184a3719b1d0a080664126a2006291f18000079aabc510a8a84c4844010a11077552dd2030296da5cc60e2ae929e710332823365c2087ed270c85250c2200805982c2c8161620b0b00585782e8484e9d8200c1d7efb982440ecd6b7ba40823e04f65c1403d2dda622a224a4042010000112200054642b86415a0200042f2108420ac1585582c2a80702d886d818701ea71de0c6d8b1ab3d1b05e843862b38b14f82fd79305a6b7bb0609aea9b0d1013662dac2ac0fb978f381587211d0967df3c38416ac81603640300fa4c91232c6f202ebb40e02de3e3795d18ab7cdbd53c16d4235d25930167828df7fd4978c9ce9593cfd447916b736513393617140be7018ea938ad8a11143500240981104c2a4260821301f0585402c29c1614c0b9559bcaa77a2592a6a58e44a1c66bde2d145c09532814b9dcfb9aa4733158c99a65029738216e540632a2c02d12eb21ecd140b42872052c30c2201668d055afad8b54f302deabcc0cf843e8a0c00efa78cd8753809c13ca282c52f22b74546211756bebc5c545191f7b514c22a285282c10817c0c6a23ba5f161c495978b65e52abf902044bac87b34502c8d1ca1cc14d1050c30880101ef83155d558218e2362341367a1b8f8683e275a53e5b44b01b8e380a3400081cc87860a03a41822cad0b1f040918a1af14600b3b1a5b81800ab3c35d5025142100805202c288160520300014b21302a000734332814b9dcfb9aa4733158c99a65029738213a483ecba504c52cb9019054881480c808b0410470010140cf1d7b477b2dd7f9ee733b0689426c2521b3de9e486163d78ee53f62e30fa30501f0580f02c074160380bf38a855041838d08d3f21f4e271c5dc51e38615f4635bc00015ecc1f025042200840e3f73634d67181f4df2ee8e26d7e7cf26a0000007e54f3801c4d01b6a4a084601000010f3c0c6a23ba5f161c495978b65e52abf90206d9b9c8a8a302ceb333b0c32139012f491415334c3cb3c82812c020037aa9cf1a43466a6d395ed60d4576a9b7a3eaa59c75637df9aa085be7e889e4e7680c2c112e3e50002a13c73a0ffb2c006981dce3b9f01c50000065fb270f2a25b2fe786184e4e4f1d8780000005dc01c00bd3d56f9c3801dce35c30012030980300003706ca202e27747068c22982c7828918c114d02a20410bca8f185b24016db861020301c68d150c80003837a19fda800b129607603a2f7db4353b881380c000078082206c10817838991f8cf6b99412318ac1d0ee37e7ea866a6789c50f65339e8000000000000000000000000000000000000000000000000000068494fdaa530eaf159a1958509679a322dc52c2654816ba43a2d2a00000000000000000000000000000000000000000000000000001a08a24d1cc1410480050141f17ef53bc3117c960cdf17c92542acc2d8f72980ffc4ff1dc105a80cf9c6f68e820f4b979b7ec8248f482d30a596bc3f5c0de0d94dc53530e74999400160cf9f2190ad6c3c82d7164b29a3d04ce)) <<< 16000) + 0xf800a10df7a21e28000847709c380004ec1be9302108043cf25ee99498f2c4ab06bc03c89511ee244a10549082c41c433c75a328f00593eca1026042200800009b99940a5cee7dcd523998ac64cd32814b9c10b6cdce45451816470e60c48610448250038042f81b7f3955d45606734d82ccbd7d345c271798a6a43142b84360a540007f8cd7e9702ba4775665f20c2d31e391b3fd2d8eaf5aaf0338df4f00000000000000000000000000000000000000000000000000003389a69a49a31010a11c01a00c00180c010068001181d1c6a620e8ab982dc430493da2841ebe0ed2003820000069780800ad82f33540a04cd4d173cf000a25339c1cc013bfeb358806402fb40d48e204e0300001e021461b0a20581480c00248484c0a8005f58800d4910972d81c8cec41d97b5b2070824d404d71c11eed268e0b01dc05acc7000ddce1fe4951509490880218300b068cff8c10056f0f06c308054b7a8521048fdabb10b0c102b1cc59e04001c7d4e7ae93041280400a026142130270581302c2801604a0be063511dd2f8b0e24acbc5b2f2955fc81030126235788016cf30c65bbd24a9c6d83e20ad43bab32a886f7ab26000000002a1dd5994846860c404384082380b31a9d9813d5b98c8b9333aa64d9d146cdad7dd880205ae565ef2c27844809bb4e46ee4d8e0596eada273f9ec085076c37465d4f5ef548374c2a000786400169ce0cd80f4d9d242228a06f547082b07af1f2c102348f3f86005c67ac5f0009e50105795150b12110022623a01bb7de8b38d1c60e9421f26939ca2d36cb991d8d31aafe400000000000000000000000000000000000000000000000000000d2b153480ac8bc7ac3133f9109fb259ec393ad598d366fc9485000000000000000000000000000000000000000000000000003191020e20821419019810608825c600401a13e0b02505c94fdaa530eaf159a1958509679a322dc52c2654816ba43a2d2a00000000000000000000000000000000000000000000000000001a2a1dd59954437bd59300000000150eeacca42322482c73062c40411c0444c6be5902474978276a0f8d7ba3e7255d8b16f206ce83b9672ccda40004e48cd561608832f537141c4654fde35be82113bd11b8a6b8daee223a90d31fac9517db8263530baa11baf62c425e8850004fb200121240029a482b0e82787413a0a00119e213833b10efc4e5622c33a1a7d490809d1895fcc0c28108f0c587009bc2224114018ec1dac430006899fa709c2088021619d40b576f2937676e38cbb44c740dd32f77145c50cb2028aa16871d1e5df712fb1352374f5ee4df04059567b85ebd48d7fbd05286c8e5236bfda3233a0c22753c09443cafa185201ecc44e3dd2864c29d182020f264565b8386506868ba9b9155a3caf6add400ff69d747fc52d4df0deab96d814a2568d58254f203cfa8f9617b7f4c06d92f6523b9412647901140300048121361b09a0d84c84e862b033e939011ca426c981857772a10916084eefd26e480163fa3388e0165d4e232a24c2844010e28a752138c508a128b87c8a245c4e236028625b349ba1811221a181a402076f640d84000025dc0a13841100426bf4b815d23bab32f9061698f1c8d9fe96c757ad57819c6fa7800000000000000000000000000000000000000000000000000019c4c30c20714510804d00c0010030100200d00022e3c514677b9cca117b6360bb1448c7431350c089561d2191400d172cd4c200001cff4704000507fd2427082200861996a082e5e2d98402867a3690665082a25212a2cf8a203945d43e5426820f6dc5a3c40060800000b71b00680000005b8d801800dc6d0ba31b41f44041701400007f48001bf1098090003ae90008b6212e330961582b0ac0e43612a1b0940984984ec5c44516df2406875f0571c059e988da1403064d3ef100c2cfd2e050944080020044130920984884c07c161200b08f0584700c23407c43e251e08204fb8f96d620663897cdc8c107c020056039164b424d3c510375cd138901fc22b3288c1080021e48cab2776851133c4820e7013a86eecc28011a805218a00bc839368941084020000208400071881486e0c46bdd7b35c17d0000000061dbb23c1f13472052041030c22000800000e9f594cab48e3b3b92c29753c53ea717a1244258b9020c22150001b620502b08c1581388c0983604a13c1c4c8fc67b5cca0918c560e8771bf3f5433533c4e287b299cf40000000000000000000000000000000000000000000000000000345965b60db9f73548e662b1933198ac64c842460c38618410238008020260fc2cb2c5b1972b21d3f270dd6fe9f416bd441020d672d2e618b4f5e65574944938bd8b0beed065c352937ab52fd18fa52c5b435de61a40fa14f0539e28f81e0739cdf9e7098d40c4b068da31c802e0e245d7cd98db97327f16dc15b13320baa6a11504d8bf8bd5cc2d366d65f1e8629304468003149086190005a11c188b326ac6b9cc0033cbb3069af21c182014fc11c0381b0813ea61ff9b1ff1ab1d265613c8c3280fc353ea40ffc3c3201847c11a7ea1cc8417f2f65de436ab7d0c91b738211f5c31e69d3bd405dc60224acfbde5bb3220e4849f5c647e2bc78d924d9e7999770529474059880c5584f5304b325060c4a6949fdcb12b54c373740582631d686109cc0e268537d1b557b2ba31c355627100c54533c4d379b1384590dfe66213c85300af8441e8c4f0255e2db15b8a3a7c9bc0802c4f026b9a87e2029e8629007e64cb542f3bdd6cecb7bee6f3bedc35f3d195b)) <<< 16000) + 0x3429bfa93c95063218ce0ca08f62e000039b20481308b0981104c084260401301f0580f00c2280403a0301c01f157884b138a194a0ec5428188d45de248001841f4450114eb0dd212860f80420c46bdd7b35c17d0000000061dbb23c1f13073463841840822813c090a4e4e6ab421112f80187c19d678308d4ab3af1c31643fa00033a40b03605603d345c5a18246565e3182885477b6f3001b00400800e26c3c7b8dcc090210b34100dd3573623041d00800004f9e2bb816b3c1c13edde1f2601bf9fff3d23081f0080000529f3ee38f5a72a0a37879606fb00a0c77d113c7012198dc75e4caa0000000165a0bc000f00772a60fc8dc3bc6800000059682f00003d0900c18720a80001d821121ba1843364a43434b06cd18604402ae432c0012e2284a000dbd2310c0dcb655c566081e00848814d3f753a42585f9ec4c70c001251f8186066047984815cb65b3612821080424747cb331bb8c48494873cd4b1e58601ab5d18f9c30c66a7c1eb5324086b9ae07a2c480c2625c75b98700015fd1211103001a1eaff4bf1f42010ac0b00003ca4000c14d8a45cdbb023d4934c4a49d6a686042588a4072f6086a054f81df2582289290f36cc5780a91a909a2102f4fffb5b7f86582e8dfe92a4600a1d3c5d6fc1329210747a190101b42cf107845b33dd99bdd63433f79f8ec5024732daf5bcd32727fcd0dd17b13274c18c021000034f314679f8f497a544d033ad9f482910c3a50ea950548200000249f011085ea7aa025c3c200000249f0326002a0184d7e9702ba4775665f20c2d31e391b3fd2d8eaf5aaf0338df4f000000000000000000000000000000000000000000000000000033c188d7baf66b82fa00000000c3b764783e48a289a9048849008806817000100680015218311af75ecd705f400000001876ec8f07c5018b14411008c09104c00201c0200803400043884404821c14000af840035088008c49d1c12d428de21cc4102314a02408000003da521f4d50234be034302eca40dc11f47ec6cc67710012f41bff683f8f7c844bae040032afab6fd04ab4a86b85ca100002a2b8de0ee54c427c768000dc8d4b87ce574a9ab1d867aa2058320353856f7423f032b6fc7f84f0f9e42ce38b21b8000380204e2b02509c94fdaa530eaf159a1958509679a322dc52c2654816ba43a2d2a00000000000000000000000000000000000000000000000000001a20c46bdd7b35c17d0000000061dbb23c1f23061c32c11c00c054130ed8a3cf1449ac19510f73bf45cb5af191b3496f69d8305e41203be7aa112f55505dc8b45de42d41b923e8523b809116e8ac463444374de6baf642144fbcd5e1a60ae85f7785b866257c0b89498426867337bffb80985d0eb2ac2ea3aa302d6bccd35c984309fd5c14a47d00a000bc4421864003cb44009a888019e390850d0021ce9007c5921080a003014aacde553bd12c95352c72250e335ef168a2e04b1aaf8a591aa05c9765e5e81afefa8ab9a15b8e73389aa69f41837337ecca9f092933623324c2728826408204302282202200a8aa0137d13f706642cc7ead37b7aaf2a7b0e65c798ee5e6e1cd4241aaf495b66a68b035c9e54e5c15097e6aad5181e5d7fc86dfe3cfd897f3af85e4b1a799ab613086cd9e95e867c04d7eae724730858c022b8400e3f5d54ea3940b32041031811012000405455009cedb42e560cc4c16f8655b45314dba1ac4300fb60db4773c326ac68f02cd0002362106520822904084c200060fe03e188803d88920af910fe1900f8caa3f7900491630920a00be61e37a4a104001004c0583582c128160d40b07b0583402e040eecff40880407ae00170c1a1ecf47988003f6b3057080065760eb800106a8ac66514261c22008408307cb7de9611071788f85041d4bde2f90081c3df1c81834169d6d4840031ab7f66a24c28440100640583180c0005a480016390612182a0ae835ba17be41c22b741563200cdaafaec58c20800200980307e0182500c1f4060f80307b0183d00c17c056213a64e3a4a0a5edb32f6202453b76052c0170fc25990018bcc805d515094908402182f076fc8512204e43c0c901121b9c340a10d121cdc2a120a1000401e4160f00b05a05d091852cc5848813fc435566027b184640a6d19c4ce9288fbec7dbcc5075ddd1ece29e1dcbd7937b6a365305057ffe8e20420e79347ce6dba2a2c82ce3ad53bbb78f66ac56eac60a09395db7019ecbd42282f41241229b3df9a77ef1748b0b6a24025dafc554fbffb250e477b0990ad83c27aea9669a6571b5b4d2e151151c560ff38806c8a6e2bbc68d0f157bf0584328270b7abdaf6738736660e3cd480e791f49f1ef6672ccf69d6c2bd84077b16e82324927ae3adfe8f902b3ffbbe66921f8bf934417f94fd3efa257482710ef3db350ed717f8ef5b5c44a75ae0b718a4dd253a2cb061fb2596b3bc9c1df8d8c9022c19290645f676f7f9445a1413b198c56ebe82fa02f600b9da8c22e7e216731a09463309b24cc2585e3190baaac00023c48005131000b55200198241dc5741c96e2de28615499f47d900ad561ede8a09a697b5b040e70e88e394009a1bc99900310cf464ce004001007601c372b851b27016de34a8eb462059e539c5954d12c52922e0648030f668e92ccbc9e887b49c1e7b49eef62c251d87e6610486184402600081b7f2ba095458f139b16cb443bf019a21d649751b8525e56166b433ff74779d91b78f14468707fe8f706d435dd81300a1a0006844090260ea130220983a04c07c260e60b0400183900ec80c11308)) <<< 16000) + 0xd18294655fdc0b166b4c4b8c409a63163a10c0357265f94a004201002b01d8b00098b5b144a39dd75812183776893850c257f0ea8700383326686a084200800010320e213a10960d153834328bb4705440f74e4d366102081f4f7a8800699c34455250c2200800008690701183786c09c360dc1b02509c861e7dfca42fc31a124acfaeb18bda46d6de927c56d30220d040b40c2925d1d822630004dbc21f491d55c7d3d083968c23c7fd85012810608534387161d711795481e2c70346178f93987403d553d164f08387005db4f5a0921de09065009b06e9567ba0dbaae13caeb9ed779318a09c963b51789ab821e6841f10b28e2a1f674225569584742f7600e52d7ed6e18c25927e194d59452c586f2a27bff0f822b3109344b00000a4c40024708200281b404001da041b0a5841e79270b120ce1082e6900ff3c41e91000ca834ee21206100040130260d61304a0583502c1a4160d00b908a4eb3f30c2b5b3ed3c904b40e00a5123141e00802d02f36bba03e49eee8b4ee6b202faa25d3620113818d44774be2c3892b2f16cbca557f2040929fb54a61d5e2b3432b0a12cf34645b8a584ca902d748745a54000000000000000000000000000000000000000000000000000034184da6ab91c81704bccd83bb4c9b1561d881f8ae08af99e10a9819208c008000c128f09a6627ddf7691ec5a7716b888f1979173fea8d3db897582628af5ab4caccf0b22acd195bcc9b2dbb26fdadb26bc6b32c902d46de7150ac1ea4a2438cd3a0661ccdc1a16bfde3460f918e033144e2388487280e7715510a8e7b18efd096bf765078ccb2bd29b1d77220cdd3354001cf0d0500e680ac3410d33a518840837da3dd4200a67580ce920410804019c160cc0b0650583202c18c0600028441885400130e4184960a82bc20bba8cd41c2ccbec048c062a2e50c200f23592cd64081e00802600c12c06094030600182480c1200608e0305f0150457a9198f66b20d1a2729790250e8df11dfa84549349ca9282b6e973205638867398c11683db0a520fa820247080ab6420033906469c77c42492afbc6833f671b17043c1edf1526569c04eedf803f5f69f27b433a711a17fa481f48ca4fab09cdd8007d503b70a24be13e6f0f067cea6f4dc6587ed11b7e5d3db912eca5486ec0b86211ded2e0c7881999b3f8ee7dfa48a119417d9eb4f1707810163477994a374865b93d5f1d2a0be3b6f539a7ac6b3b8e63db4feff8a8e83430d107c12c9d3ad4710a84b830a831149688665e8d85b0bd19bdf92d6b18088f623953ab38df61a25a160d5fb6f5aaeffc1e514f04078c95f55d186c1ef4e461220ae1886ec30d3e6707d460412d41ab60c110344dff29286108040178160ba0b05c0582d82c16817206a6874144005ed931daa22488078010000108400083c8004e810561d0005ba905915d8e1acac6ba1000b527b78a3808f28ce5602042096ffd4b204110040160060ae030560182a80c150060a6030520182880c1400609e03d24379b0f94904a6caf3903079b91ff24204b770c23080023e7885894108002009c0380c563b8cae3067f8c35c22820ad47d8a0814e926d7f020402b71f6a500182117370401316f0959382108042381eb22bea867d462d0e82a271659058c30650420418448010064100401a0001e240009a881286c134360981b04b0d82504c124160900304701e8f75bfa734c1ec787b0a9a0048568cb0c01fe0d0b0c8083e01002b01c0b1489a83008035910bf6c8108001101878148e6640b57e163372c03ea3749710014e35dc799010840200001b040005b4e12cd9750fe8ff7e4affb5ce62e2361830f933d19bc598e792f1c1367cbc0900809efabb819809968a2e97f46d90c00642130dee0b8e47893295075b14000ff66cd2955f4fd85acc15d4e4985cb49c1e0c1cf6c457f5a12f66268eb404d16639ce8699332863709a0000d0482308c114360881b0430d82104f441009c5f7d84b412c71e10e6ccae899ce79ac285b3fdc97f4dbf62c2ff7b57d1024aa4d0230c8015ff8312351c23c819b5f25762a63e25c7c28e0130f99a7942fc7f9bb66e987f25de3dc366950608b7e55ce288b73a41656752fc3a9d46a5093ecdb20f45e27de613c992b94e8eebb0b90976e5b54bac375c17f6d51fe70b342676afc515337ad0b89d2d9571f64ca5f97ac8491e3800004ba208232000b1b2001eee4100240022ac400a0dc81f9680f83701c2bfcc4a406187636ef44120ac2a3073e02085f6a56340c01756c1b5e0a0059898bcc0200566a8e82a84e204801003d0981e04c0ec260740b0390581c02c0dc0606c030350181a00e42394d494a20443135c9c80542bcf5a16071ba023690007c02145a656c3445054935e6d8408896841d9008f741970041a0ad141d2800f80400003dc81980e4410a3be9e60600fa1e60b0cc9617170a1ca48edee241078b23266013c08212a6001f0085876147161050cc455823140833fb0aa04024bc1b572000f8040000334e8817f0b0fb159ab36fcaf2a77ad4bfbc65cc39ef05f4817a0a0aba951455fded71c7f79f7ec7805373cacf0b19e9c81b3b1a048353486f62526d64767e9cf92a48513e743221ea08b75a2001319d844b548a64bef4fc039dc056d34c20c08b5e8ea1301009f8d6f22b2c0eedaa49e00c7616937673a9884510a1c228e5bc6ec3dc082f3156828ecf0bd4014f283ecb170cc291d71c199882bfe6bbaa721a6701cb3c8a1fa48538a09764e000055b2000f024090360641b0220d81886c0c03603e1302f0581700c0b407)) <<< 16000) + 0x0040100401602c0ac070040100401502f050207e69b74e97d73222b24b9bc1633de65bc7f33a56493bf7245afba4ba1b7cff1ba142e0a0b4486314f7a45b1e3a6db95d8728022937cabdae58ad29bab4b7799fcfdfbb4bed0c60dc12462914095dbb68b07a86ef0b1f59ed85daaaf375f6da73f89cf473ec06569783fac19b70f7520caf612971e747c7eaf4c84bee586893b3fd9e296d8d7bf4ca13f06895534ac705db7b52046214a000133080028f10290dc5fcb8b58157fe3089aa25f49a53a01e32e202608520120c46bdd7b35c17d0000000061dbb23c1f92ecbcbd035fdf5157342b71ce671354d3e8306e66fd9953e125266c4664984e5105071c40c8004000010b5a5abbf27c4ed5e76d76fdfec8f9d9f8cd2037168a6ff02493f4bde7c627a4b2b6e5a6f5068fb615ac2764a3fdaa6c4016e117f6ff945394c5a0008bc40a06604e230260d81284f8604bd59033b6ae23536068114d54c305911f4f3c50fb8cee841b0e4697241847e0ab2d6990e7fa7b325a7b748e6380d3fec30be260bc4f42a38c0fcb7a2034c632081964a55e1872b92f89b7b2770252ca75ee6a0359a507adceff184c9df1092026647a426428701440001a99015190006f51a176f4c0f0ae28a9fedf93502c170a8cfe99820c5d3822b987002d229e9361003ef9be6350401bf9c193b051c2094050048130230981104c084260401301f0580f00c0740603803d202d7d4ba861103a3cca04127aad23a598210002006c06034030190180c00e05907e12a3096206e662acb84e7a5baa742bf0d721081cf8ad9577bdb5d3cf69fbe2be5979aaa53141d020e4b717d3cf7892a0bc33f237c77ec62d3205aa1f2e07b4ccaa71b5181e0a3dba5d37aa025acc334bcc9459912d741630e826f3cd8d84dd64583cef3c65f3e1813564b21803e8a3dda90842c56423063ce437c3b0119fee9c5a0a1464b3b5cb53ef488062c12a6d185f7cad0c6da58fa1c36fc40a7d4da2ec05ce6d2eafad6d4bfc9c571d1b024ba7e3fe4a2966a2f67f7744e02d901ac93eebb0ace5cab3e3a46c2f204871e428d78b9384a2db7704e5e82a281659660c8065863841028006001908010068000799a2a7f2acfe018407c8e3644b085b22c9753401aac29c94b000c155caa5250c220080000869a28354a7e1b5a17b1c4dc088bdfacb79b249828e583094073850812dfedf37839b0904354cbec158b869e0009004d19dc8c3380698a303a5b98fc48003529935e046f003d09010206e0a8000254200166278ef1b1769307871000f4ba23d5101003d437b43428017dd002ba90400248b384dc58400212f9c3b908005915762c50e5445a239118d0d697182b0240000ef90171180b02e4a7ed52987578acd0cac284b3cd1916e296132a40b5d21d169500000000000000000000000000000000000000000000000000000d0b9f970f20aa0590c31618c18e08e00c0060000d874d6b38e31546d3bc60bb03f8f4c7ddb129860ebdfa20fb657fc105911f24bca7dbbb5676666cfaa0ffe9d14ff7c365a88b70ec576b08d9d7b92791a940010c080a8a8004b2880a0680054d88016d190130d00900804404006090401e5688040301c1c4c8fc67b5cca0918c560e8771bf3f5433533c4e287b299cf400000000000000000000000000000000000000000000000000003408a18c10610c08a08808602211cdb635fea0bdc5ba1e3531368575373b648cbf84b347ad5aa01ea3fb6124401836b6300b4e9c4db0c2013c165b9ee67c03db4344858d327b6e6b9c779a370880242bd44386061f3f720286269386a1828551578d87c382e139e424828310cbc2f4a08253811971c201515781cfc800c8be384808814181200438f93af37c2f871401f9586598e191917fb85b1830000005dc008204935bc3d0400019d6da3802000b17a8bba4000645f1c480885cb09c011a6c28f6aaafe34b01ffc46b1069241bb1e20a491803f9995ad1a08605584379240030243041630001b135053e7002700869ba0dfb5391869600c41866166923cdadbdd32612000646ad4038e00e5564f5470200ebdfa2a8582000322f8e0182003e707db868009a3b6d0f14801400400007d480802f4db6f6f7df40e869600c840b38ab4e24000eb3ee9a01a48db8f53d1043309000000493e006820553e2be472c20001412471348000003222d2ec50c88002f02069bd9684e4304d2c03f02ffcc9c480025a3aa834922a5498aea612000000bb8030c019b0fed11a00387266b8200000096dad61800270040000dc100f010001f398fc6c2cda9b1f1bf44fc909f0ffb8a2170a0c050bf5908a514000000000000000004313072c7287145182241041240030180200d0001a0335fa5c0ae91dd5997c830b4c78e46cff4b63abd6abc0ce37d3c0000000000000000000000000000000000000000000000000000ce251451058c50c58050040001710010068001131a28315c08bb94249bd3593974c891c08688093db285072b4a396c89147092e5e86d2050000007530030c00000753001810263c37c0187001c95a29b22002a450a804000042640383601a0b8fc6c2cda9b1f1bf44fc909f0ffb8a2170a0c050bf5908a514000000000000000004312082062442041c42000050e3957a644226b22c5a6384a93ffe624d410052e0391d948fefd0dc6d9a6250722a6b2a84ee33ae9220f9beb956039a8ab5934d34620951da800198900c110058680045dc8009a9900a01000aaf90091900408801c2400c12005010020080067d8801a280085400202000010095ff1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 28 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase3" = "QuadFullFiveCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 28 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase3 private def zz2215:"s08a7"="s08a7":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l17 l22 l23 l25 l27 l28 l29 l30 l31 l33 l35 l36 l37 l38 l41 l42 l43 l46 l5 l51 l54 l55 l6 l60 l61 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xdd9c15bf, -0x11fdd2876, -0x1b3030144,0x234698dc], ![-0x11fdd2876, -0x460776f3c,0x558c64f8,0xedcb9694], ![-0x1b3030144,0x558c64f8, -0x75d0dd74e,0x122024e68], ![0x234698dc,0xedcb9694,0x122024e68, -0x91010fc4]] noncomputable def hinges:Hinges:=[(-0x10149be,l6),(-0x93f0812a,l5),(0x53576114,l9),(-0x60283098,l8),(-0x1934df02,l11),(0x2f73a844,l10),(0xccdf100c,l14),(0xdb39e04c,l13),(-0x307d43a4,l17),(0x22197abf,l23),(0x890413b,l22),(-0x91010fc4,l27),(-0x3dfedaaa,l28),(0x91010fc4,l29),(-0xe66d1d3c,l25),(0x34140754,l31),(0x5eb19bde,l30),(0x91010fc4,l33),(-0x27c982c0,l38),(-0x91010fc4,l35),(0x6015d3aa,l36),(0x91010fc4,l37),(-0x7568385e,l43),(-0x19d1f1bc,l42),(-0x1593d9728,l41),(0xe51ef04,l46),(0x91010fc4,l51),(0xa1febf6,l55),(0x2a234b97,l54),(-0x2bcf6841,l61),(0xfb953e8,l60),(-0x22bd2d0,l63),(0x1b7fa332,l62),(-0xec6ae14,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x91010fc4,l27),(0x91010fc4,l29),(0x91010fc4,l33),(-0x91010fc4,l35),(0x91010fc4,l37),(0x91010fc4,l51),(-0xe66d1d3c,l25),(0xccdf100c,l14),(0x53576114,l9),(0xdb39e04c,l13),(-0x7568385e,l43),(-0x3dfedaaa,l28),(0x5eb19bde,l30),(-0x1593d9728,l41),(-0x93f0812a,l5),(0x34140754,l31),(-0x2bcf6841,l61),(-0x60283098,l8),(0x6015d3aa,l36),(0x22197abf,l23),(-0x307d43a4,l17),(0x2f73a844,l10),(-0x27c982c0,l38),(-0x1934df02,l11),(0x1b7fa332,l62),(0x2a234b97,l54),(0xa1febf6,l55),(0xfb953e8,l60),(-0xec6ae14,l64),(-0x19d1f1bc,l42),(0xe51ef04,l46),(0x890413b,l22),(-0x22bd2d0,l63),(-0x10149be,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x3c581980200000000481c0530080000000c4520686018000000188a40d8c0300000028862024180800000004219036300c00000810c20324602800001422040930c050000000291081a18060029042845009040140001a8420c00cc8020000010a1940648c050000021c338069180a000005182a0253301400000ac04403e66028000001083200e4c040000a82184602420080000002b05c08630100000004a08810c6020000430a011014d00400000000140a029804000000002c140a300800000005418026601800000000001c0c8010000000150481118060000000028140b3008000000000048124010000000c4110230c04000000004e2a0298040000000001102c200c0002286209812a80200000000002503880200000000001c0690040000000000840b200800000000001a0640080000000001902c80200000000000881900200000005a1900c300c08c866049013d68030000000000d404c8030000000001b8059006000003182a02533014000006c04403e66028000000000d002c803000000002e1a03180400000006211027300c0a20508220031a80300005409c1401b500400009a1182401920080000000461500a300c0000009210806460200000000130b018c0202841480840066a00c00000000004c0520080000000098500a6010000520a81200f50040000ac1202c04ea0080001702807005d40100000000004c01240180000000000e01480200000000000481900200000000442c06300800000000038012401800000000012014802,0x1182982807c2008000000009c240b3008000000e898480e801000000001d0901cc020000000341580e18060000000000680d200800a30c908404748028000000249040d8c030000003305200918080001e42304c0aa4010000398420d81548020000000000840b080300000002c1180e18060000000000580d20080000289246603c8018014925028c09ed00500000000460a0398040000000000b40e20080000001047206c6018000001c4510120c040001083b0b202b2008000000002c1c06300800000004416068601800000000005018802000000006242049804000320881cc07a4010000000000b0e066008000c621871026900400000404708126180a0000000a241024300c00000001308816601000000000025024802000006e2f0d01320060000000098640e30080000000000c81c40100000000002601480200012c24844015a00800000000241c0630080000000110681660100000000011c04c80300172264230049200a0000000882900a300c00000000003812401000000002215018c020000000011000990080000000000880720080000000cc1c018601800000018838070c0300000384608126180a00000008231024300c0000000001481c401000002910858099003000000000445819802000000450c408230100002586e09010c8020000000128640c8c0300000000002406900400000000483409300800000000000606400800000019830034c030000000000220490040000104722301e400c0000000110780a601000000001f07018c02,0xa8190020c0c80c70809584018000000ca2a805060202c91c91860258d00605863863040311a00c00000000037013200c00000000c83816601000001b208c0124c05000000000d000990080000000000680720080a508b065003d68030000000000f404c8030000000001f8059006000004182a02533014000008c04403e66028000000000f002c8030000000390c8139806003182302b00f24015c48c2030604ee2803bc218a86580f1c50070000ec2482401aa008002944582c005840140000160642a0448018000000000a0c0cc010000002c1a1403200400000b0321200a400c0000000642206c601810c0c70590248100602481820be0188200c0000c42404c0cc401009206282d80640803000000c21040648c050000000210c81a18060000000094540930080004b0ac208134802000000001a0d038c0200000000001a07100400000000006805200800000006422064601800000ca1140648c050000001904401c9808053048c330046b40180001e0420a00788020000740d02101e10040000f81e04203c20080000f02106809c40100000000000480c4010000000841400f0c0400000001105006180600000009a2102c300c000001223881186020000024a3ac0848c05000000001c0a0318040043c7186503f1401410c0e7864009c480302121c70c601b89006000009a210a0062006004147288f025b401400000000002606400801892d038c09ed00500000039832012180800000000003c0620080000000000580c4010010c15e09001c1005,0x330880e980600000000584c07300800930c90840474802801031880840ad50050000a21882404ca0080028430822025b401400808c110406e4802800a50ca0a8096d0050014e19c17009da00a0001484608809b401000520640500276802800000000907028c0200000000000a0490040000000028140630080000000000681a4010000000000110388020000002888a06318080002c89218c07a40134498209060799c80380000000001b014802000000003416029804004886184501d140140000000ec6a03a60180000000290e014c020000000052220798040000000562401c300c000000000520584018000531301403e10040001022102204ca0080000000000580720081048e3028816d680341b1cc08240f3c5007812388101813b8a00e00408718c200f14014000511042980f4802000000001b05034c020024430c3280e8a00a0000000722102d300f0496208060799c803800000003219014c0200000052240e02a004000000004c240b300ac494207060799c80380000002786806cc0301bc10c09405a9a00ceb465018f01f71401c00830a90840474802800000000031038802039230c0a205b5a00ce6c63018903cf1401c00710c314401e2802800000000003c0c80100000000003a05900501870a083019ca401c0000010210812c60203032031c20188d00600000000003a04900400000007e11013300c0000000000f00a40100000000110e018c0280c385081813d9a00ee7863208f014ca401dc90c3c11204f94803b86182820c06729007,0x3b0d20129808000000711a40ca301000000eb1a6031460280000001c8d0054c0300382684a9015da00a00714d2949031b4014000000013838146010000000389a40d8c0300000704d080c9180a0000000e84b011300c00000000b0680c60100000000000d0188020000005185003d1808000000a109809a301000000000082058401800000004d0d018c0200000000240e0598040080ce10a3021240140005b0840c81368020000000349840d8c0300000000241e0718040000000118340630080000450e41202a8018000f61e452026d004000000609260449808000000000024072008000001460c80486020000e628c43022900400000000000e819002000390a106c024401000000012482044601800000002621038c020000000004c88198020000000682c00b300c00000000d8a81460100000000191501cc020000000291081b18060042452885031b401400890a11020576802800001422040648c050000004904603c98080002cc811c40c94010009790c0e4011680280000000000a01c80200276410330055a00a004e484868006b40140004f1121c00768020013820c1a4012d005000002944280c9180a000005388700d23014000000a4210072602001312241c0032d00500012443072015a00800000006216017300c00001030540066602800000000f07028c02000000000005819002000104350580c64010000000821a818c602000001021c40c18c0500000000001a0490040000000560901d300c000288641400f08020000001443201e0c04,0x5112401c980800510818e301d2401400920e318603a48028000045130500390030001625082c066200800000e4521c014400c0000000e4520286018000000248ec058c03002cc49011817da00a0001cc630d80aa4010006184605005508028000018a10809a0c05000000003a0c0318040000009108405930100000000441a05860180000000250902cc02002c848c8180e9200a0002c4a11180cc4010000000164a206c601800002c25040648c0500000b4210481b2006091873c63c03a2401800000000002e064008000001c4260268c04000000509220361808000000006c1c0a300800001c8c81202880180000000002d02480200000029824049180800000000b8640e30080000000001700a401000000001706038c0200000003114819180600000ec3c0d00e400c00748850ca0636802800f21021840aed005000000002c2207980400000000a8140f30080000000130380e601000000018884050c030000000512481b18060000000a211023300c0000000130b80e6010000014a08809a0c05000005049080c9180a000284910d80cc4010000388a20b01908020000a31c46103250040000003082c04d18080000000000a409200800000015c22026601800000002a15038c0200000000002a0710040000000000a80520081230a5841018a8803000000144370120c040000002886e06418080000000000180720080000000a41c02e601800001d23540428c050025438c6d81a5200a00000768d100ca3014000000e434012a60200000001e0d8074c03,0x1e0290040000004804401630100000009c08802c60200000250982402d0030000000000f0049006000010c7232036400c000000000aa02640180000000015c02c8030000000002a0059006000244770b00c840100000000001205840180000000002902c802001e41141680c6200a0000005804c09b30100000000007a01640180000000078004c8040000000000a00e90060000000005c0382010000000000880b040200000000000140c80100000002c13809980600000005821013300c0000000cc4a0146018000001a44100c8c0400000000362603180400000052120013301000000000d8900a60100000000161201cc0200000000016004900600000000036009200c000000d408802860200000000190901cc020000000320580e18060000068041002630140000000dc22016601800000001a09018c020000000360480618060000000680900a300c0000000000b00a401000000d810807ccc050001023a850033200800000728c501923014000006309404a6602800001ce31c0348c05000000390c401c98080000000048140d300800000012482068601801822460b80ef90050000000391881b180600000708c10192301400000008422028601800000001916014c02000000308aa04318080001845804c05340100000000d05a02660180000019c5b0218c0400000003115811180600000000645c0a30080000000000a81240100000008c1302b8c04000000031168111806000000660c809b3010000588821281328020000028a4940648c05,0x486404306052e200c000184510580c840100004890630812e8020000002144102e4c04000000000012071004000000f1144096301000001d704400d260280000001e86c074c0300000007d0900d9806000000001087033004000000000de0164018000000001b404c80300000000520e069804000006182102ae301400000ac04e066a60280000000053021c8040000038c108188180a000006184803383014000000009c00264020000000148640b4c03000000888e204b18080000000a639037300c00000ec18403e66028000003944501a4c040000038c650129980a000000e711c0393010000001c8220072602000000014854034c0300000005b2081b98060000000000780d200800000001e8a81e60100000019160f0190020000060cb180e8180a0000000018c08720100000000088281e60100000000391103cc020000007088203498080000000000340720080000000a442028601818f14a0cf020ad0060000286192040f980c000005086302bf30140000108641802880181891460c9029ad00603142aa1940495a00c0608578308086b40180c18a106180e5680300000001a02c070c0303862920be07ff200c000070c524081f301800000e1146057e60282031c2143029710060000a22082c0642008000204731440974010000000e630810c602001031921040ffd00500000002c0580e18060000000048340f30080000c18848103e6030000018220c0afcc050000000210c80a180600000f46229023400c0051876086051680280000000110f014c02,0x210d034c0200000000004e03100400000000009406200800710830d206768028000440f01303e100460c18908d816eca00ec0830610901e59401c000014884280288018000731704302ad0040000000290600e9806000244370480cc40100002908c1b012a802000000001917034c02002023303080f9a00a00000dc8620069301400000001a8701e60100000000017404c8030020a30c328129a00a0000000005f00b200c000000000b8016401800000120f090390020000000771100d9806000000000019032004000000b0886812801000000003e15014c020000000023000990080000000941101d300c000014324603a060280000000002b018802000000000052031004000000002a00132010000000000ae026401824318b08301f8500600202218218119200a0000000048240d30080e186902481df480301c10c6043027e9006], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((0x50606157f331c339a1a9f09214d568f79870853e37788600108349c8280920789b5060000009970000c1ab01468b848358a0003dca26091609084031c4d956f8e2168eb798e10cca03dd14e2e94549980d3424b24912d13e5c345db4d16ac024653c469c9195bdd53eea50436f3132c20729ca5b8ec4a2a2a607352d90ff3e6bd3041dec2c53989592529090a2a9d9e40d181b11ce22d9be0c6dbbff0f70acc725e9a35d03b2082ef8b1be9636620d41dbb46ee5b8968f155e795ac9d53dffe2a8a948914db1a1083dcea934cc44f24acc6f19543a89206569202c9153e4d7c915ceee931242014f476c40aee1de7738006234e3c500ca453780260c1e0080000919224118b480fca44c569da3c8690242ad50f068876314b41666f9bc38eeb467da6c0c283294b01fc04213757953ee0116a385835f360cd86739e667304c92c303fc88632930ab09858427c0d58783910b3844dbf55e8b01171cfc20b26ea9bbff2d314e4d61dea327d935d2bb7996d2d8d903b2967f8c431b9bf5b496f781cdb0d0611a4cb8ed154e7290cd5f6216f0f968879dc35af6322b24e430421463ca2c3c6a2e696ea2d7e271926998bd825aad418f3b8437cebc787d6aa54108dcff77e650fd2066b16e234698dc00000b822bb60987568be4810022290bbb09bb802c8c28a1881850c2084046003aa3332f6ac998a8f20ea96953e4605dca041a34f4622bcd5d27c370c7717680010b9915310b78946881405d59f5310b122d042ffaf49103d5b21409840808613b8e049044934c5a980107a2c014652090005a3e3e7702014ff9007bd02dc0fe6d1883409102802800011691b50d00054f9223151110880044fc90e92c76497630fdfd31331524086d6ccb5e182106cef2043d89127eba10d4402994e09888cf666c080b1010a029f4831917eb72a8f633f810e000f0b234bd407e4cb8189ee100245abc7c28bbb2c656993d008316c8edcbe735f3743e3649142b92592e59ca95740a28a5c04ecf758a41b29423182d8780000e4cc1754fa49746dea8c0fb30f32aab2a54bb7bcb8d123cc26ce80000000000000000108fd870e30a440b15be283fb77267e90f69f054c41070c60ca006002010024bc9714be84170aa25bd86ff5f0fef1d3df35572c6135d3c7963c18e0f75a127a0f2997f92dac9e9f6c7eab15f1040c0beb297d88368beb2281b281378517e24b0b38409cb7248711c40968d0008812aed7c48050483f03822181b64cc3460009659c32000520408405044203c101206a2b64082fadb81a2401169ac5980042a36319002410210081100280003c890f888878340005c04874863b243a25e3097700a41754fa49746dea8c0fb30f32aab2a54bb7bcb8d123cc26ce80000000000000000108fd870e30a440b5cd23ed69915a6daf2ccb39442ed4ce8b085070c608904a004011b1d8020bead362f6c90c351af7c7fbe1252114ade27cc9cb4662568f305a3c1348a041808f0db2d00c50fc495526d0f4df0c5f9d19d945e72bf89ac895998d52d0139e800232921c110005ba11d4398a31ac74c463a42321b098e884e8327d4b59dda576c3fde4b1c6dececebf540a06f8e06f57af0c8f63c40b0ed948c343e800410474e52c62dcc8484db3a6644feba6a8c0a023dbb1fb58ca3c8e466302bc45a27818985bffacf38633d0307adfde56dd9ad0c13b699e71b6a52448f20e631b87648206430d20868264280b2130190900c84407115635e2acd103cae530713ed27dee3001c0087122334b185820ba691a3000388da18e001a830ec2005a73d075001d004000076188b497cd6a6881a634f2389e82bbce6821572bc52000e0042228ffa2e247139e7ff7e186cba83121c02d892968401422fd965001d00800007790001cc3c2c72decdcb14305341c11040e80400001dc90c86c838071144f0b4e2cd1004adf6747103dbdc774d0c0dace46c30e7aecbc7a5002000844516b62b6f1c41fac04d3343032743220c387a667ec30000b5d1941c003015c2a0400514823c9c008002) <<< 16000) + 0x00002ac7c68841f3518310a61b1302ca4ba4d23041c00800004d921809e8502671a14099aac82a332f0927e03b886a7620df1b5b1d70c2c0ad03a48ad77232d0a534d71f599a4bcbc8cccf131754a335b00000000000000000083b99c38af15a05a2021808608409c03ddd9a2a4634a7f0a8a1ccfd84031a6ac25f71de8c15439580c65a9793fc46c0e81a1e0552eaf897cab09d3328457bf6642db845dc1ee42786741f2435688db509093baf83068bb08683d2c30c412081c00400003a100050b236a120008752410222070d00067f11ff258ff10f8e3a97e5ec68e5e5559d4e13a1fd8bb9a2021f36ee343c3a0509e200000efbbe6001f00871dbedd69864714164a88a4c6940d3aad1b830c000450f8470772a7bf8e41868c6b86502800002687184700c3654831c1800d3a79529b900240140000ea1e3b091ca240d1c0a72bb60e1215231a30d103ba4d448e0cb0f46a24b040d3e5b744000014fe4e7002000871d0b9b03d4a38a06acdb40d0c300008a1f08e0d2bf2b2e5418660be80bf9241011a3917a2000004d0e308e00c3654831c180069d3ca94dc801280a00007748001a69d3638004ea8c18560063b4d0dd352a2a8c0c1d510bc4a04006c6bf410431db63c8300000dc7a27002000869b7ed63c423069201f2c8238828a000209ca904841767344c30104683a0f0bc8582286244e8f65020c460319a678000123192906805f64bebcc199200500400001fb21a002000380242e132160990a84c85016426032120190880f8c01c5ea643c59f7d49d13040220ac5c1c40a38bb6d0c357d4ea8a0c21f5f9e55980080021e4134c3e5a5871c000bfd5c4608179bea0bc104070459c5f10107dd8d73b020a56b24f67e880003582be23c03c5778a1206003f37351825c801280e000077cf8afef606b1c2d28c9c2e3892ed47650c1118133aa602336ace60a019e66ddf3000f00438e0bf09e16a182443fee804ea5d8e20e69bea000bcb08028494ddc9440493e0868332a0828bb5e975026100851f5ada074110090525cbc9320801ed88ec2111f0792005a07800022e20006cc78c05841e4278b3c3bcaec71028a9d46061bc6abd2734200f33b361046ae1dea6c003e008f20a96cfae901c70002ff5710c102385e922f20310d7d01d0c408150d0d51d082ad6764e289100006b057c43c02cbf94b0603004e63465e496900260200000f49f163e2a21f1c298e118f31c44dcb1178186fe6f8ec8c0430baf638a0087a256498007c021c708fc933dc04883715076178710c8a8f61f7901a7779960a310204600265be105070e2183d880423feb00ff2200c9bf534d80400715ca32f186900270240000f910003302000ce248402641e132020190700fcd035d90b82032733000f481412476fbe708017b7acd144076c342c08262933abf2600210084100003eaa860d141cec655140a287ff416f8a14429f5e64f6e18711e8b9af303084897688ec2400008bd76181400440a1a2e01804bfcb88523124009c0800003e47c622bf6ea62051a7bd5921441b3156de104ee1ca326402130020ff34107113ee918010cc4e529c0080021a281d3b0180748150d280aea3828a44e9f9214d0c3d46cc077998611209a2d426890419720de1be90025fcdd54ec0c02a7b523a0d0200313f42583295c8014816000081c8001bb9c1802d38d128083ebcacdb183013feedb1a111cb233a020a7284326c128410804000041890684c83027e684193503a034d44d0a2102830a2d739c200e265120824855ba560a18da490094c0040010813af79761759040003c6d93870a00005a9fc102977e8900aa28af89be681c101a1b09c6fe2287759be45162400021b635388009398e701d5ea400980900003d6482c0731d496bd47179a080e3d4b238d80d01456c6939d63e0c1e20260796b306d06128d01c3aa020e88720b38cd57dc7382268dcbf789088e0178692624fb97d0902000c414112bd6785790202464ed0d2a883061862358c6af82442927cf1e2f0613648925f89c3c200044a5eb8440432ea20c23f0810e18e86782c1000062d79986b7c4801501a000084cc0c0ab0727a64922c004699fff2409b5565cbb144820c45ab7c3112056d4c2e35c1c514a1dd1cb3b114382d5a32021490400008d999c00034e9599eee64eb2005406820a01000114100068d241213809e50c3f0cbe56298a1a4e72c455e2b63336d2f594efb070f5b2569e5341ab8fdf8286b2f84b68599f90868fbb4e86035c59c9c4cdd82707687060a50026eb19e256618d106fd384bfd7a9621470a004e0399e26ecb76cb00046a7f78d03b9e37a3a0c21c02043f50e0600c08289b9953ac6f2ba80493a297624eab67de659e9454d0a8aefee8efd4ee3f9c94fc2470a08d221063cbc470dff48e7ba13a2550337707756c7d6c76d12086e98200015a88007c311b509000be792081110386800966080182d91d925d8c766b6cf4944882061232b67a2a8e0101c5586f616b02805080dd2a61b7cd985003da7b313581901c05231c77ae37ce0a0276234438830c4400488c30190aede8222801e826cd2a32eca98ac441a1a82e0000a348da18c8184640a230bf09f0c143334571d6ce02bae56eff47134d4d0c7b36aa45cbf57f871314a63d0cdbe3ae7342b2edca682487b3937e8e009ca83c2767a836ce1c3d6236cd83e1849450a5d222f761d29ffed0f71682234b0fc8b65085e3af43eec4f2c4102f2f86c01af1c27caf591c7153b473a5d9ca42fbf0301b1e212c3e687c5feda4639b6c4a56196bcf3ff2cdaa46a)) <<< 16000) + 0xdb8297779baafbe3247c3f463e1728865cfb3d5e075e973b34a39af64f5fa421a0fbd3b4aef7f1444abea10e02cd4e3a400cba5f00220c1900840790a38e90820e00420080200800002224080a00009b20f42320301d0026a2673848006fdaae030001bc543a001fec1470a01410200040da828808140002044804444001a00029823fe531fe218fe84c7f0260060390cd316c121e3034c5d4e6040c02f9f020e158333c300afd9c2aca003c010c213d08d07412b208ef83723652a8a155ef4d721d81145ab363f9fbcb0812defa65ee1a7104e253e5072620c083f053a7a1c04803e8e8f7ee83cf0237333cca080ba0c4801702200008e8c866e346934f19fe764f6401a9f6a5188068d372d018039de189e5001e0086105fe3681aa0e6942d9ee8c914a58628b4e1d38952cb1182079374b3e2a8a409394f9e2bad2d8826727611906e646029d390118a5f4a400a1688907a0b878110be5263c036d50082400c81500004c44000dc4c8621e95029428d2a0454c0d08ed39030162f171d900074021840b647be4ca9045779981dab142857450583f8a2aaff705dea182075e1dbba01021622d57fac882428b3e504c1a10b0d364f20240175345a6f8d11200500500001fd3218975ba5294284b613c9401cb95d5d040239d53dc8600a25c0794a003e010c205389da407b70942c2a15af11e7bf14588f77c4da91a460830cb075d67490810c13f15f0561388262294ba2a6712342249862693173c602999568167e8312006ab43f958a8ef87dba400cc1500004d64000dfc80033c11fb05c8646c9ff9430fd99d5a408292d68d606015e176c0900078021840d4b0f8fabe720886cfba91592450a1fb80f2ba85451581a54366e061820606be8f87c0204260d0de5fca620960aafb8ae680d0c6c79d6f7a982401813262cfecb9cf048017822000090cc860f29b0472850819e60d0c31c113ac8401a2d2f74618013a9fb569400800218407e9d6f76f59e4a14ee41f61b01ede28aa17f8dce1ff243040a6e83d888d341020b57021c0558f441225a872fa5a5546862ef17d7fdc3f63011ecfc1dcd82722400a6f9fdf371077d71c69003505800013f1000397311519b5901082f4ecb2e01046a4438214057a203524001e00858e62895038828471f148bd66e0e31221bac539f4f831049d662f20a8685861de9719759c070ddf8400fc15e861fca23393cff8301166f361d8c10880a45825afe67625489002f04800012211ac0100019f11fa0100052411e9118fc86c7a0163ce031e6018f280e63f6895758e14001ccf2380eca0b9e8c0074021a4898be803be28901265b2b004928fee923660619ec6b5f8d11e281711d425e145043619f5a41052bd6ff211d300eeb7b29b004004533dcb9690c801381200007cc80180e8417e396c5448572f44c878c097fa9c920c582ae2814181592821041a94aab784001793f09a7001f0087143c6ac7c77e594168adb0f4238fdef5e2e7aa78c0c92bb98be5861136a13ad6507104cd6c15218743e75e3faea00e2b90c2186180034a28bddf15a400a00b00003fc68417e396c5448572f44c878c097fa9c920c582ae2814181592821041cb8bb0644001793f09a7001f008714388a139e26594134dce9cb038fc835257bae78c08bc4800c25860a52fb10dc506f825f3e15218723ce222b88a00d0930750b2180058e2e114ff44801401400007f48001b390006ea331cbcced56a03b253cac538502f34cca208b501eb98f08001ec8a820d563e5541c00a8bb6573800f8042250f3181d30886920489a0886d1a20043a04641c209f29b8bc8d80c10d6df117e62083246919d53a260036ebec90e488038d7743fa520000caff2a8b551a400a80b000042264302de9872dd2031e53e2daa91e300001509a8061d6caa7f84a24100a63a03f58a0893793872d9800176368c728003675109410004bad9a615d5008500400001f223f00200059d30120d3d2fa22c415ded8f21e1ff53118cf503b6f40d0445e84341ad3fd5080efe8b9891d487c55cb91139103bb379fbae50802c3679ea244c2b38c4927b6bde29bba0d8ec02728724cfe53922af9c0dc876ed6194eb8211feb24d49e3e8fcd91a601353225628feb02e20cf87e05b59cb5191c0ded3cd3fbbbd2efac5b4579f6b7ba3dfa112f760d28af0fd72ffc92d640467fe7e0861a9693aa3f9dc34d84ea39c2e263bfd532bb6d4418350dfc954e74c1fe7661f46648e0fff2d05108bcab8000181c8f108c7dc363c20381c0891892e071c2edc5d3a0f147a2c937b8e14000067920714064cb2df84100df03edfc4087cdc8dfe820a5781d6871100178974a104990c240104453c2364e03e7f3b5e86321ff2fc7129545bd759b4b8e3ed035a0c6d6b87b36ee3420353e4e5863cbb236500a6b86e20f621bd2b2c416c7946887e54d98bc08e3f01021df0865c4ebd4ab03373fd319da6d125da79b2a481aec3b9a9cc5116c97f229082a040acfcaed8de9a467f8d394ccdc349a0b9fbcf7bdb3b1ae06510a8f8db68c004c6234307942908c49a8839d37eabebe4a5f54f7c416540ea2fa7cb4e319c22791b49d782dff36229955beaf34d02217ff3ccbfdf592958271f9ee40cfc37800031011f605f08ab3b092218180016d4cc18627ce26330608c10aa05a0831c50022406007d5fec06100117bf96b82008036c8fe2000001eb0520508803000037c471c2436a12000a2c23b8221db0d00102791f5098fa04e0505d04e21407570a3d3488d3cefe420919dbc9b851c20a9d9a372001a8b20f73000f)) <<< 16000) + 0x804205000020db0acc1a48f8450d5129d1a302b5a6af1e551235c907ef3afc88c30a766e1a04f7122b9640d490e580a2ba2687022e511c20a7a8667b1468808fdc6e89721f5b5cd2006009000024e38409699be8dfdd0205a1516395b942a28a0aac90c7f8e18c10305e3b72463510222a5555ad77b51042e950f4ce02046861a3b248e72f28b0c064a3f45e32f1a00911b3388d0b786b894801982a07cc04000500623645b0cf5923094223541c207b582a91000d21917ec80040010d246bc24eba8c091b648106c6d0061827d3ec006a0d1440778429b80914beffc5e4f005164642613e990f100b7e90df054e102a77a85f83ce0860b39b34582c4c9002c03800011298141ff6e46680e030919ea88d23bf038448c40945a427081af9964e4002e0751af300100043491653def535641a3002d8fb606c7891a5d7c1febf32230c37c58a4bcfcc34509a0c73cf343122a05d90b596ef4515529218fc04e870817126dec4f8a3820e713b9e0a94c5e889003104c00012b900039c2000d927c4be1a21ae1c4131576ba3020f23ad4a0410ccbf3fe1801c47ff51940080021638b100634c60cc5880628a00fa8200e241d87edf8d5c42085e1bdf088b9416183d9fb60b1f48386750263adc416061bd9bf5858b7046041c50c233728098088aa81d33a71b0ff5d200640a00002612136021f2010001d191f10d8f800e0600000c68280349114be65481849274034a2a22061b5d42672f201229da218d528c14541e042412a068604243014c0cc0c0ecfb215d086006b503b0e64cf09002b030692108b88e6f612492ce3861ae7c0c349c14b25c740d1414daad9973048a4c57bf664ec1451882d7e1e381a180e38606abb8c0c0ae48f42cca7000fa412bdf648a02400b40e000045c7080c9a04ffb2641053c5ccc4ec05170353882668182026a8aed0282042b03d7fae1820869e7a063f20c080e728614bb161004c3589feb340073fab1dd39591200560601ec010001179b1c29f426909d31c71b9b82d99b20412507797d527c2c302ad855ad10070c7d27954bd880c33c4ac3d36eb0b0408d9c63a4592810149df536bc0c001819df7e71883892005c0780f0010f78080009888f706e6521a0661537ff4814957d3dd97d671a305a18ae3fe05848defeb8d0ce0fa9a2884e0a5167a2848abb2143132b7e0a2b4ecd3b12fd0e6880ed883da5c97261858a84bcf35876f67b200640a01ed01f0e50e70c50c30c70a78258010190001006d0b24c9f9d8b08e38a05a45f8df3663870015edcd96b6287b2eae25b6e0a38612af1a1bdede2863174765407e7186283f2e61b6ca2850283285f3e6d3c11c06b5d6ed45f4dd48018022000093480017a1d1835f2d5841527891b0a4c1272daeac618357e9cbd8ab70d143e18c889cbb58914ccc6bd88e32f451556305a7688ad8d101e4a288be5920e047e4bfa44daae4a0063739495217424cf66900340584ca19eebb273ad71a483b2e3c486300d1813b6715d50bc48da4ba0e07ffb73451d1e6ab435731228041a5cfc7c146148373a72e70c028aa1c7527861703812badb1d68d54ca2bc9003104c00012c11ec0100027e9c145877a549eb85102e565d0801468d1454d1a962f045d8608232c4d85a7c20810d9d53f74bece082504f7f52b1ba4303090f4716a1cc068272de3197613549008ee90605878b5b4af2400cc15122478204a8dddcc203bfae0932f8c1409fd37569808168e9cff90090c103f11685abf0810ab5e792afc0411e2e93e632e880c6546f1f0114d048de78c3b5ce1de9002c03800011310f0010f58080013588007c791ea15000c7f91e9198f406c79c263cc131e501c460f6bd65c48d2f563b7ce14379c73188243d79bf0383127a47bc400049611582005a0b798ce003e010d18882803b230918edbfe9db0c61b9062bcf55ce1460831b6190e0c5eed7431d4b0c52a8d91ee8d046082b3177060512d5d8f3a41059b3b033e8f66900280280000fe9c2002b08d478d460a4af0a6cd4ae205385b3fc06f60a2fa39ef2ae714c0c59b02119b566844ba951327dd101166c3aca54d8400f89dffedb1c003d7f8ba6bb83a56a400b40f02c0020002443e260bb653d0e214c195b8961015a274b8410bcd7b3718083f90fe2a4a1040010000101208a131de01f9a00005c1080e6c4ab14a40b6d0e1fea1874d787fe81042dbd25c070200079c44800e9f61b1e138410004201002008000022343efa77e2acc01c7171f5f8e81278c68dc5cf4270e10a2a99726da1c0900b3cbfa481c14d919806b66082cec01990a5cf00eca7a20f7604001dcdf82270f1b4801581a2859dd97047b7213870c479ce7974c50f99398c61d544f18a9635a4b11f1c202879ccd3db62847e8fda6f325e70254b16de77b38704ee56a4f6927820bf2dfc32d8b883e52400bc12000048a6651153bbcd12348156864962895acf769a20a2070da9a182cca3661219296b2f1920896a4e9e0a080c5b0bc0003177aa195200400101e4010000e1991a09bb861e4890604026a202cc0457c38c0c017e053a1862cf392f640240dced0d84c10420100001342000f50478c440012dc4788563c213d181849520dc7861ae1da9d197b0b146f4c0e5272851452ede55f050d081d2dca4088460a4f1c8e9280020a33ab82387a0204c5a07e4827c10030b883c5f727d09002c03868c1382944948b061bd8daa309fb716289d3464ba0fc1450e296a6be2c4706138add368f70d080e3f0d178a28c10f1173cfc5f4082e5ac4c48144c1026087ef76e6962d612005e0)) <<< 16000) + 0x8800024323c00a1df05c05cedddd7e205238971fd0c3ff425f2c34209672e6f30101c0e9901250c200080000821f19565004f0038854c48c2d01041fbfbf3f4041482608b060904000f388801801a91dcabd0800153fc17e8200d44708400400000f580504081280c00007688ef00eab24c02bcdbd57f800000000000000093abc880476ff04c530995f9124b070c3f140b3851831430413805400083f0606bc105cbaa40c695d627ff1e227a23687f3a0191dc411315b698a250d348c5cd98f28994fcca0a7388c663df3ddfd6491ddd862607ea00065a46d4440016664774643b8321db15000e2611da2d002379900800023b263b186870a56d7e8d342061ffb6c5a944091070c4a33e380b5885c20215ed474e78ff7e05081383e5dc91509428081f1ba0a6b8a760500a1cf4677f839291004f4b0975921d5bd01114400b1c3275e2e0c00a4a92392110e81c000058e4022f548ec128034250c0db207cc78a1fec4507c69fa35c11e518ee57bd6183d8867a0b47ea511954dfcafa14df32fdadcb320c1380d52ab11d3beca0b924f59f9ce7b62ac98ae4306b05a36f1b0993978a9dc4261d3f5b3b31ed85e280614a96d807455a63d5795484d6c4ac4c939ba3000390844807b4fbc21fc02a520d9eb22dcff160b44cdea8179c03c6ed28844a6a4af56732904c8f82c84926cdd65101135319081669490351023083ac17143af6b1b245811ede6d385002200eac8200de6e74200a0407c02102fd8bf67598dcb8e271d921b577c21465f64a799023d6fe8ee9bc184ec0204ece4a3f95ff254fee90a1a82902b33dc31458d5538e950c7b3d7cb81505060a14c553b2aeddd8187027a3ad49d0b027e5e301001ad33676db7bc723dea8012d55bb31763bd94181b853cf83c95d38e852144a81e06ec87e3b9d90548b48fae1c7bc323b90df38ee94fea510981ec00023718d1a63713e7ac5a29c7349d59b0cb466042c2866464ddde7edd858c80a800000005d93b6c8ae0e3862c55216a83e638840638650420448001038ecb8b7634c58d8244f4221cbdca46e94bf7698c0fcdeeb092a5fe394c5f7aaccf5e6b45aaf7eda4351c659852fca2a00068e475c343ac1200099623aa3b1c31d8d604e8533b9982be8640bfbabfa429c87145df44c6c85120900d629fbe0181173883407d22823386140d0506026ebadd9d950600dfbe5c41f01012dd798b8122285f42c7566c836920c0ac0c00004a24750d63a61b1d20d80182c7441744426df9e1102acbe1e290a1aa0b15fc04082ca6d930e0069a23ea0600830cd5a800130e1000430a3f77331450f86e8002471640fc0ef881826ec42b3409eeb4c5812840f804287da246dec38a78ce13c0a00819e991846103e0100000a6323211f88ea8c24075495b8610ee85d64160485383e484810400101d001000075115b0d0e7068734240006026888532e58e20524f8374114342a988a1101765da5391c010f38025000251c20008614eade6f44a1d2dca9491a2941ce1d41c559b27ac8307fb873b9c505151c66d9a039c8c3bd09c207c0211a34c6e1ae65fd6538e693ab1c4777100874281338d0a04cd5641519978493f01d782702d836302ccc28a1c60c50c504a03d3b11cf362e0b89ab9bd15b9178fd09a7bf55d24dc5e3342b90be739d38be2b78c06034ce2227f608a723e8001731c2866464ddde7edd858c80ab9551ea86f201600000001764edb22b838e18b15485aa0f99230c21419218a1160051c7f86f34568bd5fbf71a800b28f4d26a51efc8e7e91fe7bc9b4cf76b1976896760c911d280014891cf0d0e706873424000e7c40021908e612c72c863941b1c90dc8e49e66ef4098e1258a3e81ff3e81e0e20b9b0b8bca02f9661a4017df3741e204716a9bff7c390e6df0084bd4c42f940cce9d910875d1f5d43a59b31c481420230bc92c195ccad5f2764586c2d9f8c004147eaf150ad0fb386dcbf1a8c5e200046c5435cbe78d7ccf51ea7236c5641f25da8c703b238921ae5316390a439308cf46e601709c2ab71b4805f77818e7f7ad8f1360972fc6afa971f516e9b394f1ffcce000000000000000007ef04e05b06c605a1230c21819618c18051cb44f126df77fa86a146c18ab80f40e82688d00112328bba75a1bb00fcf97b02be6302e4f4c4dd150dd79349c4ec8aa29985851c801d9297ed95446b8d19a02461ff015c95ab1d7ad0c210ba461afe3a5d2c0c0d9d5c66a6a93fb91c3074457b9550a4b6da410188b8ab872ffcae681000c41ceab9fe23aab0500228e6bedb39e15fa00235c040fe7d9f7408807aa89f9030821180002f73028e973a07fc48fb381977feeb85c6abab5062884e7aabe7288bc808316456c0bebdb7dda98a1a45cd3bd80b2011308ada84a141439854885854a005b056ea4d64c18315f5191e181608794023f774208d26f70a8b06569156f266f16220077a400598db139d2fc9a11ef8bd4756abc461140d9aa8a0404ee40320d298a5188a1ac0e384800108c8e30a87145438822000b32205002000f4f23865b1ac19f77818e7f7ad8f1360972fc6afa971f516e9b394f1ffcce000000000000000007e250a40a284102480300280180022265572d8148ce5d1a45b4f36e72a1b488b528dc6fc012ed31deb59a1683d4ad542c7e24d7f85e0e28083a18a321c20900017a11463d000fef11c12508182800c59483404f851fe559b6b01022155661c6e0408582bcd1828700df94a51e243000fca03df8910014d3dd521c820096e2839655101019b12da1f4a08083e23670ee210475961b44d)) <<< 16000) + 0x1b0eb8520400002423840242ae685e71811f8165ae35b88090d300bf01c430415fdf0cd142300046e0f3086a1408abec68ac1d08009f143ab3fb91455402cf370c72c5082219996405c6e818f77602d03000012111c0350df9481a05637c231bd0d8de0286ec050312cd9e3ce2460a1c59ddb69e28431714795802000e2e0b1d020e020dd6d5d1ac5003725f626862aa8a186b665b2b210f79a48f14802812a41f02a65920a4081a58fa437c891e14483239fb60ab9640d58548e5b214389e43901de08e2800002c7ea00a280000380d06100824033a3b90020873ffb2a41d1605641df0923005b29082c02c694001be55e14541833fe845904e2460e5144082f73d4c58f1da2d53394392309e5b038000071d9504e104401000016723301b1ba0d8dc84c654163700b1b701dc07d5c5d17acae7964e06a435024138c38b3092c80822413001c00c0400803709230f690d8b247b8a424030893dc4dfa0b205247388438200298447cb083c44cc6d0982088020000272407c3636c1b16905f1874dcdff2e0b2034e9fcba008101c30b4eae2c10bf1c98e3e3020a978c6388104ca112239f18060ef8741481c0000005dc0001a0ab50e24308102701871600eba4d9984943d3ddbc59225998f7d18447ed298305903f29c15516103f1ebcf230200d2c4c6a84e204401000016b236a1a000387217e2a1b41100032e118d25c8cefa3ed9b20a142c994447f122c133acc8f6144010a1cea4240205febafd40304363b9db040e007224b1e610c0052fd8f92c10016ef67c15854500c24b09c06000040c461007221ab5a22edf4409bc481095090e20a064ff0850382458ee198011401ab594dcb740800a60e740970a8260394b8ebc802ba7b2ba8f132331a15014000076c84882c2401611e0b91c666f6603d8710e2c436655c70f2629863ccc60c19d715da105040c1b61bae030404bcb180b840010d7f8dd9814027d31a9da500028491c494080d8e8850038000204200227846cd2779edc2c6981f8800190c0951a608c491c71c81491090c8043035d01bb677d33470de123e00def7f369d0d230c6825a3823209369a947383482cb5afe4075cff0830bba1f2ad4a64676cc0b05800000000000000000440625575213bd440d1024df1711f75ad69fac372d01433fb01d0000000000000000010cc24df86f4dad9cc1cd276b7860da97dff60faf6c7214f20edc000000000000000004332472432032012802406c080200d0003b23035e4fa70cecf81041c5176f72384406a360e92629fc80b88c622fee440e100000e4c47400c0009f2247f88a080d25d5f83eb1d07748936f1014e207082f03c0000ff11b20506600c6c40636003bcf6e1634c0fc4000c8604a8d3046261449258c50c58a50a38978465e95c107001b64eb6adf33d471c182206e2058c936d5663e286f00bcb0f2162d26328b47ca150ef8e42a43885d2f7a5aa300001b709eb10003c37351e9a4821280a000077cde7b70b1a607e2000643025469823130a2c92492c62862c5285bc232f4ae083800dc2812427a266964cba4c4c5161c704128ac2f058c3b82d0666ca1b28e8ffce5162c3b77a0372285000013c3f83882b387dcdacc00149cb866c3b4821380c00007c880018c1b267c4480d63e8820a5c78ea1f70a141f880b0a41c91647384b2cfc4a1339b72172090911002fcf05ee060c1f87af7cc1c16f74b84902fa0e0858058a21efca13a88230c08d2d75108285564d41628b922d5653fc5d0ca10c5b46aa5c0488a9a61d6d791831fbb239ad50e002ca8e4dea02002e1bf518def54821481000008188d78080010588d604af3db858d303f1000321812a34c1189441438e39221020a10800202e0200401b79edc2c6981f8800190c0951a608c4b24820a1c91491060ca06f08cbd2b820e003703c7e44addec5a8aff1fed4f05f075fb7b437fd6648ae87800000000000000002089649438c31228c18819409603804010068000c990002b9235c021ad010001fd91ac0d80075491ab210d50e86a464350321a7190d30c83b04434a221a4110cc86868c04344020017952342ab1a0518cf9ac678b633a5b068298ce12c66c961224319a15e136ab6b35b90510c69bc36ef840c1383b3e93880126aad7b9f8700bb1a344660502d6165d3770200f1924ad68101431ecf63f62043f5c4bb77e44021d283e0ef84040210ee0500481990140200401032203c182b21b7084207002184aded2c20921a0eeb125081f119ba18442b7ff59015b738f687087130b1c701999d16f09c207402000028840006a88cc08c65c4632c1b195098ca02c64c17415b7fa6908860c8020648260f003b4964c511dcc2239525d2ddf6f13a5934c2ded3f245d3b14000000000000000000000000000000000000000000000000301c1180876a0194672bab0b98163c6cc5aa1feeb3a898bba0aa9609400800001ef362fc61d37fb42ff82291bd35a7989f839b92becce642f45bd4ecd036d52fb295c80883d782159163bf751916ed1e5f406b899da50aaff60139d034db39576fe9d05444f6a000966464427c500aeeb3304810a52048620831f88c106c0203200b8009f1c4ddfe760e9fa13a1e29cad5135545fb284197e765c55d7fb22c22aadc427d133d311d2996ca3c52c0d9a183c01aca961c93db5f2e1cc1b4c4346ae5bc54b30ae8950ab6168afd3105e14f2ca9b63f4f6491f932f724bc5eaf2ce88565d8e7fe251936df6bb6bbcda32ca9120d5691a1f4751ffc6f120230675f86eb03cc613f7801c551c3032ae3f2103a4391)) <<< 16000) + 0xfc8ad8d49114add18343a2ee458e8f7c21c3eed0c1b86b56819e4c8884e736400015f8cf9aa3186b997f59d932d199bfcb0834080d44708423ddd51dc156a0734ac9cc281f1dcf577f51c040460bcf878ee6cb77c8eedeec8d34a3edd0910000000000000000010cca2450cf00a00500402c8ee07f777d1a67886f7ea7a1cea117d04a2f44e2e42f170288a14e71a3947e79285c82b4c266f8a2ad1e6f414e6d9dc784fcc93aa5204ab70d42b8c1abd5dedf94e8d83458fca000954411c460f003c18c61644f9bf1810459d4f0e8c0832742d3fb6b484f46c98f4e1054a350dea3eb4c657d3ce7a434001212ef3b881247a9468f6596000057534e7873958154977fc0b1fb634840c936204e22c2406dcb65fb0326a9ae0246bcbcf06b8534a61f74a18ba1e88d1a63713e7ac5a29c7349d59b0cb466042271640c6041048003002801929e7d3b5cd174d2f9db9f22ba78d351fadf3b6ade1ecfdfd0ef4cc31aca2d03cbce18c22450002143dfda82e232d424175b543fa3831c03b5b002bf1750f3380000000000000000f878d98b543fdd67513177415234a3c21421020411c004038dc88c62937a78303abcb5d33715cc2e8208680a1213047264cf41db0da110298fa4886ccf06576d8c2e21624b500032520441a0008ac20027f8463c6431c2a001999231a53bdd165a51cba187d34e02c652346afe0042248c58a30a40218258050020033c4be8e6a40b7d463cb6e669228012d0c20b86ea360a9d830601168000e6918c358c598c628c600622189118c408c61c1630c0b185018c200c60c07640ce0381e8e30a39ee1c9c24bdf160616206274d1c0e18c33abdca202b13deb001306100042c80e45aa6c38c088d6f84e1118946548e2360322a11c38790b18450403b4c848c0541541c5013860f804000055087282ef4e640cac254a4c9309529323c6f59613208c4614d0c60ce04a04604104400300032200200d17e010000a19182198c08cc600562fe0bbd399032b09529324c254a4c8f1bd6584c82311a34c6e27cf58b4538e693ab361968cc085ef4e5750bd40b33092073c530510148035afae6dd0240d0b17ee4883f92282cf86dec1ea52c41e90401fb955690f6e414193c7a92b0bd9baa606e19f610b927ede9cc819584a94992612a526478deb2c26411a7cd518c4f9eb168ce39a4ead88ea50c040c1368a3c1560599039029021a11010b8f59ba9a91752ba1c661f2430c4d3c3915a36b84dd1359f19a068bd3e9fdf96ffcadf7d3a4b8a0335550c941a0f6357389e8a97f04859d9cb25eb6feb9a88561214000e94f18ca7b491aeb454e101c6a5df327eccb0c22a55fe78e46070d47ae998fa72a5104d0b0959be6220c0497bfb3fcad4c4e03ef64f2b7ea26c900637b6d5c5c4c004f424040a1a02a00008f487284e05ada80ec15ab649ce6948ccbb67e62912a44099c454a2423f4de9d82e54e54a1cd01329850dc4ccecdb5d23c8afe2862720c28092edb90047e2dd7c1026a073c6bfdef9036044200a001b7035f86fafabe5511a498d65e2ce79004cf93cb65f0344954a2a66cd2ab5712982bed653ca509330f822265f812a410871a840e269a619481660ccf9b10211d805bb1436e5c3278300354c7994500ee71ecb804c203e01000012b386de4091eeea8ee84cdbe3b9a369003c238c5863862048822027001004ead0bd683da8b4feddff52612ad579cc7d5fb18c640a2e88740006bc8bf028001c408ab8c854c5400214e45e4a600623c18617c865b3bd7ba3032b4a9b18dc07d70c0a24d79a3b67831a2426090a27bd1d2e5cf0786afdeeb834ff82c1b01b79118917a20604da14a4fe24130f2400543ef95e5365090056497166a347848f0136c28183a07060c3dfa19a8f2d264286a3033c0c4e4a4a9fe2603a1811bc014daa1ad0d5df0090975f3f2516ca1a8652078247f275fbef049d76d22c1ce81b821fad859c3050c0878ea1b235ab098d1211e9ad94a749120da8bc06818da66ccc714490ac0be828000c148b20e85885404a2a05d150b08a85d004000c9e45c8d62f86b17005d01547a3e476817b18d7978d4b0a1e2199c93cdfabba6b6d57a6808628206fe46a506804a180cc162761a4db240ecded223f67cb25096530519b0605277171be7a5ef2a6126a6f09ea086e99a2c288601798f73826cb91bf33b5a5e2a9727b3e41bc67d8e4d57eb62dfe2c2750004d6ceca489362202a647ac3c19b65ff058b831df806413ac91badf647cdb24f1128c1f82403bb458cc80adb59a65c1fb0db359ded45d89bdffd72051f28a45c9e912f8c9dbaf19b52851254f6cef3919c0bc7f43af5ca4038b0876f7397e425a17cc2adffe9c378c1d718be4c5d543510282f1d66cd5341931bc8d27312c944057a32fa362098038899532a01ab3eee61908127da44fd87b87a19313fa779b9ae7f8709766edff59bf8e6361e36a420b2bfd3f65199fab1445635711c3228f5ed440ce8e9039082ef3c2b90d011b6e03f00904078021008010047002e1f903180a3465aa91020e804387a8f5f890820c804000012080006c1a26d62561980468ccbc811060e00400001d88000d310002913020a4470d4fc25451be8a6b7dd3d6465509e124106dbadf5fae28ef24e54f529ae5b6b9ce1200c893b395d03ab4271b6feb82b84d18d0c86d00239e4411a2ebba502849f10ce7a144d3c0012176c56f892f42ea35da64fde75e865f4f787edaef4f8b025d9ef3649c32ea3cd0682b20009f57909d7d347839fc96193b64283c36405ceb4bde60a1469208d5a8c544c)) <<< 16000) + 0x8603089f471ff2a6f7632320a46d3a0431e71ce905d03aa83b6e7541390dfa1e2bd22d093218c8f1fc000170c8b68885b034001aea6c07048204c589cd83ca0d27e5eb94e2b80a7f829e4a22e3c0c21e5a5bf546c61720e14c9f5e34aee1feb5727a88a7bde18a03b8291efb0f92b6fe4e22642d2ebbf50ae1ffdb26e08f6a5ea824d08b929a34c9401d75ee18ac645915b975c5403d1c1032a4bff6c62f76c7cec7de38ef223bfd43960ff3cb9df1ccffe120ff235534382e85b781e4a06ed557f927d48418f0ca04281bb17594e4264a19293ddbdf0ee3b14fd34944ca07aab85191a95a3c456850749108ff419591a74019dabe32464b22acf27e40d335f291d00905c30fd4c4aa04c2427e1425f9fecb5e04abcc6ca7cecf2e3e28b83bb01e1c3c500f10ebf2c6240566bd290f0296eb2ec6003a5b3a308c2074021008010040000111d002a949b6a0e87e05aa86a1ea66187be5bf325433cd8b84e86e707214f105672402c504129e89d3db87629edd9e08cfe30a62d011cd32c337eb510f5d72ce9880034912d23da5f48e441d01d700c6a166557bd1351aa4e1e43eb2abde3eaa37c0359f4d0894218ebcbd783f5acf410fa3dc60f04fd2027f34abbd3ec010fc069e42a212b26fbbfbe134e90286397382c60ce9f495361d4ef0834e30cf636000027c917b0d0b68685b024000c62459c742ec12000e1622f44b1792580186f444564e0a0784b60ccb70c0a2b6e8f10e1262f7d403411c49986e04a183e010178058b680f4470a58d5e5dac6f59b5acd4c0b1ee44d89a2207c50dbaa41021d6aaa26c73a4d2fa95548d04b31af7f7ead7ea5e26aed300aa238a8050b84c17fceef8800e57cf37de6b5ea421a7e9000f19d1978b8b3acf8ce4d68155febe0d7abbc6b9164b2822d279f7d60a574e28ac1c80003663a204e3d03d3c241bea862484172f232c70ad756e7692020f80405e0062ee03d10b9357b88e115419c341029739961060189fe8dd0800779dbfa092860f80400003f88b38885d8240004784590742ea2216211012888174442c222174050003c991731102286800a194f050b3390abdc2a51cd9442965d4be46629965cfcb2cac1c080d3b5e89b5ffb917dcc4d37856e2f8d791712fb3a34583572b1aa8a1b97ee0f4748bab05f3cf9df0149e41614920a4ba911c533f96410c6dc8dd0b86d0f5511aa48832b6081084d788c4de7b178a709c161bcbc9d610091631dc1901b58c8bfa1452ba1f8370f88bbfff5d728a19092b88f1028232b3ee9c112d49676180f2f4d4cf16099cf19079208444e43a14067b01b810a002d94bcb0228139210004000059c8b912c5c44608a1317005daef6100f5df56cd1d9178942eef03a8dc0191c41039029020a1960820a20000860800401be09c0b60d8c0b777d1d89a493bdd4af61d05564c7257c56b669640207c153143382142301281041002154dd8d41456aa984c9eb2770a61b07f14b24f1a902333dcbab5cf490cc390232516f010001331b2005090c6961834027b0143d08ab7e220606ae4cc4e08c829dd4a20626ef19c0026141f00850f41ad4f09c11cceb9421420323b4ec011880f80405bc0400017c45b4342d81a16e0d0001229e29cd286a02a6f5d06ea97830c1fc2365ea0710d4015f6286f623b89086b0b327729b778204d51c6f816cc9a1b63993af27d9fb6ed7b2c08b50671074a3cff52cab2ac5903b6dd781203da45e621e6e27bca2d3eb60fc5593e8b8023d0806a0ced052a3f7c64ba09dfd9ab171600263b5e5c1fa0841ad5b44b6518851a460a073d21912202d6a1ae205cf934cd811860f00405b4142d80a16b050000721167190b50285a414000a564094762d01bc186d14f8886100d979fccb0620c96778604b737fd74f000da4bc40c008650f58c009850800218302ff069e8c20383896c960837ccb048c0c3e160530481040010167090b3028594040002284590642c62a1621502e888584442c01a15f0500017a9000e8722bc6b148358a38ec00543481d26c574762b83b0390dc814df547da59103769caed2bddbabde8dbc751a44a3e78374d79ed9abcc98eca47f91f02732949b5ea74dd06d6d15aede68a492fee1de826c515040c5107a720382e3146ec23cf04ff382e294818a8ff24c1f1c3d394017c0e1921822128c779f7a8b8a8f689c181dc53598f5f1f37d8ad19ef3e6d444ae20e020152f5211d514d470165f4714581df444ba11040e00420100200800002238037a494ec70b47526cfc461ca5b32ba0ed6559d464bf09d76171c1741f3f70998b401d502ee1131482bd200a0247528071e8a52d9da08292a68c8e7edd4c320a78b8fe63e6f5bd3909196542d434cf4e7dda838c70135adc3586c57d991d177a7229f1877d6760a896ec6e65e778cf8a0a9031b7b42345583a6e5c5e30cf5ef69c8b9d41526384f05003d31f69808fb109426d608e5dcc739d3a1a7c1e597dbb307e3c5e788352d2e0000a98456c342ae1a1530900032c104f218a88ec540262ac1390598dd2f4ac82dd9e840566248652b5604dbc19960bb28e6eae32196df98b3bdb786a1e1d2194480709e997cf4eee57607a2d5e58d6dc2f5f54835fd952b87d081f2a91ccc5db986f37e3157f1820006abf151b26a5a3c0e2ae0f275648827d790e2cd69f185161c3aefff37409645f9c8521fe4b0001090fb039525d68ad7f7de5113cb137fc3b96e4775f66a4f6ecebd1a51b4f3bb07f5f4ec2ea0285dd8341849657b36466146524050a57ec17a69368a7e47e16220d60542e0e141fe53ff134710f)) <<< 16000) + 0xe776d7a6ad4fde4e2d2a29e5ab7acb61431233902b9e40bda6b0a32422b318deec6525a8809065bd670f15837fa6ac19208334f96c62e02d1d3f0731b7c4ba024230bf417b5c009235f45c4f6229ae45fb3ecd8971cd8d8472dac24f426abd89f9cccd2d04f46eb9f23bad9fe15672ebedf7c5feca9be9e58d3c8fa9a59dc2020ca0b090527dfd14d16c7179d47f6f08d056f80c3372bf2a7852dabfbe1e3e5fbec7ad6249fa70015a090002149159058005d09158298140ae4422da3b06784a28e6e4c60af6432908c6103e01015701e8502671a14099aac82a332f0927e03ac2866464ddde7edd858c80ae0f694b8d22017dbccf5048b7136d68d3f915f50f0acca8f2eef473c1c1c784e3b7a0e1c21831221819611601481daaf5ae202e77f6eac1eaa72f6086e2ef330d624eea34ba8f00b692fcc5cb1ae789b1fdca690ebf9a4852a1319587b64fd94e2bfeb701f78b35b4f943400e3a00088c413c462a00b15605c949ac18f49f29c0ccaf3c76ae32a4a102160c32742af202c81014c1035d59261e28941532c23813411c114120002bebd66c9a1e70b3a6d64c1af3f0ed5f39efb1835d51d4cf35c06449ce6ff55ee366bcc312c3cd1551180015e114e1d0a68a8530541e62a14b150a50a85501400118a644201b1d94eab3d3f9d04da779aa83916735d52e3fe8c5d16c079240626605d6de301298c6fd7cf6036f7cf0d066ff0d8bbabf055501830a0b28a72eefc1ebc1c857b88c3aa09108642ce9b2838cba31c0b9202346027660653de5c4a11432591fc6fb0175080700bb2fae2f7f0032cdc026325049b7d2ea2752e714f9cf8211198001757a21c42717ba42eac68b1827f070b458b87c917b7999ba8b7751520c679642443d87ca598e19c105b282dae152c11d89ea86a7abd3dcbf2b6fbd7dd786b77400115518a084f96862035fb584c29899c691e5fc216ab0bae941ff5db72eed007627afabb504eaeea16ca1ece9126f6ad8b0a7a0447fd490f3fbcd95995a96f181b54af4ce94200537ab61c0617ac05d9aeb8eb39ff1f535c068befac2967f53ead6b30e8b2d753cb711c50b3b0c2ba0adfb18c1bf81bae539e63c6781022113c4800a982854814000a7a413c762a23315009f08cfece9808143832ccc803fe77e6d005508ca07802000016443cc6629e1380cb3e3c011c0ad0fde742811f2ae996283f2595b640424181f0087084fbf970396d594581b850f8e8c80dd70e2424fa3140a90d2238924f27d285e8c44fab71fc6381eacffc01418e64fa8cb5a8533c99d1872474b83725b097c8f7c400abbaa899c1791f140efe45f2025eaeed1c0059a9005e5f9555b4a6a6b154752cc84b168a21105d633d30617e82e3292ddc33ce60c7df6aabbf87110628c85000081c45386429a2a14c150a5888528442920a00058022905b147198008b591463d01a1080cc740602201d0d0a282800c6848045d910910984804c23c1740f3bef2bab2af58d5311cc89e860a3d10e06d9685674807c1b85723f2975a27143ea3ef1e77b42d02ea8303ee2029054639287751ee6cb2855421d1bd81faf0de5c8d1080b9d213feacc653cdfffe3fdabd41cda923db1e8249201ffc7264285d6eaf90661510c217c89e3776706fe4802d36d202c003161115b018ed805826f2c0ec5abb448a62086d29515682dee02474713a3dd1bbdfd3abfd1e8500111f2d289472d66570415b11042f88732fae13d73ca10ddf75545789527640ce04240f46f6b218ea21a45c480ad7c555a8ece3f89911d4d1f9fc6594e6648d9524588d1a63707e1ebe7e668d3eed6f06686a8f41217a732065612a5264984a94991e37acb099046bb312a426340594672bab0b981600000001764edb22b838e18b15485aa0fa8e38e214010001f764bef36ac1c07232f575b2e88a80f62251f26d9d3a782bd56b90ae9eef304ea580200f02056c742ba00255eddbe0731550fb23cc1fede05c6fd0a9fd7edc42421093bad8e711190fc49565522cfd687c48280851aab986608cbacf3ba3880bdfcdc987bfc3d3d717f47138345620250287d4b6738c90602a0ecd83e425e6c086c2811734dedf4a0f8307e660dc01124402f5f5731ef435a1898505faf4a9c645664333ae79a2ca3532200026abd0513d00327f67bbabf26b1cec043f77b9610c28262004f00a91a16900233f5d8c60e2aa234297a3e428778ab6a7641ab4462d98b7424050a34aed18fcb141b8ef85beb2906014400016348a212850c6428432141190a00c84fc6427c1a13d0909e02aecc4a9098d01656ecdcd35a0ccf1ccdbe73ebacf194ffae9d76179fb84318800000000000000002090e38e21a014010000115b0223f7d9e3687b3932d917a7c3fe99eb2ce1b71dcc6499778eba059b560256249e06383fffd3590d9d45fc7db00124b5d53c11f61afa0589eba81b4780da0d03f2448d89f3f040011443670ad1d105148b5f6bbf56af4c39766e6bbaa8978505b2e9466a5336edfd54eeb42625cf9ac22ba3803687b193479c3b57e97fee880f90f5b8b612d8ebe838e84395e6786825468dcf2d4f3352e684da7f262bc8f0a942409f1d04cc31bd7136d239ac232d2043a560578a36ec5ddf7fc8523c06e703a65f439d095972299c7d9a636d880fca23d5c1468f55ef6a244a9ce575b9ebdb63d029cfbec91cf2e09f800a64b5e02587185bf82509ed4c5084051463ef8f67f7190df769ec609ec0d003f87eb3aee1444a84eeee03f4c48d362f3ed3ab0216f4de62fb2dfedd4d62a00daa70cdb3d7e2fbac04495b006b614872cf4b)) <<< 16000) + 0xc28c3c5fc63acaa38b2f77e5c432811d3beb503420ea6356e682bf98af240024181f0080960080003b8d971a7867dcf010d1255a8120c1f00459752df917c9864219c84ea0415ca784260411a849a412041000404b0040001d444ec44270121370909d04800075489c86e8afcd1d9a8c017cc97a30022141e0084030040102700a1370500002611261509b048490142460a00013a226a4b134258128ec4cc462641b92935831e93e5381995e78ed5c654942042f7a72ba85ea0592612011c10e1260980980000d302025987a85478caa9bc6810dd383140c804873f10d55199bc392398af70c2b0bb00d006f20d6710024283c00812e05e185a46820a00a2a4bc982039eba9561a0454c906e0014181e00400006a11310df1db7569d078b25b5c10702c38457a4c107001026003e390486ba90c0ed51e6983c021a37c8611840f8040000298e9ba4e04051c21343b1f620635330e284c207801025e0b0000b7225c03c33c4d79863437b34f190d0367e266f0023141e008000054912d11096028000d1480027b912b25c0000401025403802b44e256681729d6d844083801000007430000100409480e401269fa39a07b4607191020e00400001d080006311280d89380ec0e36a5890011141d0040000299126190928884901424602122010001541121310901080807423e3a000a542002cce4006c70e51c6a42afb5aabdf2ca0216d4f73110ff974b5f0b4ce97d0860000000000000000008a33d7453514ec9e891514a0a91441431c01600e00c0000885457b8334cfcbf737dda1ee380c7c6865251e82b8a39bd749b280a22aa0cb1b2624336013f2f34128a6ca72beb403605f14dfa5d137b4ef05c30db26aa1454276beac1a9056a5b7602e8b206595d44788423a1a11c090002441a2619b5c571a0918f86f40fde0800e4d66e691c701d285587024100e97cf9f498002ae1c698c2407be619ea251339502d349000181086b9e083acf36db60aa0aa05004800021c2236ab11a2588c92c46057886a7620df1b5b1d70c2c0ab1ec4e851840178dd9b23d54c0592d3a18d543a9cf269a5606985a59d911d0238d5f1815ec33c00000000000000000848b40b3badaa044a6c155e9af2775cdb7586db2918f09e17c00000000000000002029829029010c000128c8edaf42667e85b8c94b50c0ee5061eeaf864344404a4dac10c8d556a978b11ce35805cb8da0d32a2f1076f01ed98a2af0628251f8cc6142a45c2ce2cd0c9d085aabb0563a6357e16a6345dd671cf6ef2edfcb3c67212b228d60200200811705c88d63a22b900404f11b00044283c01000007f20c63311609e19c1243418d6a1f4044a02ce86bbe03d0db7880302d9b2e614a0157c48ee4ba3e24003a3f536ea9aa018460693875bf327df2c8d6549f5ef333696e634bd7f5a18188029a96ecbb67fc6dd850a5b5520b93bea662d3f8b83fa27cd65e7fcd3db5a26f10003969109524948589425766ab0dfe7c27428b01ed90545109017ed1e54fab78a2f6d073a2f2a12a17c0457e74ea99c15cd70ee01cf818f2d9396072451121bbe0e31c8a7f4ff2f9ebf669c2c8c6ec6062e01bfd69ea8a2fc410994912320fe380000314100073e3c106f9e9d8b8e4ad50bb5d4c6fd9c51f26bf0105cc5495ca14abfddc740099c37449ca40bdba8dbc068100ba8a378a679048d5bcec1a23c41d2cdcea95b4066f3d7d90391582ee03bf853aa83554b74a9886006c2400a78b4cca032317d5399af514b7c50303accbd98435685accf17e18045ad6d60df50e3e6700b76b2c45986566178c1739e3202543cac96f2f2ceab04da783fe0dda781e8305dc704bcb8b53a0807176244c385b2f8daa0c4c91eca07fd849a546656692b441b60c67a250d9808a705499a5cab00fc0139009a1f15fa53327f92ef5f3d7db45807e295fad72df027af76542c5a7d482d28e1528652768e0000799222a5211429089908448842223a1101d0878e84386421a1a10c0d06606842c242141210901800b151a1e532f460d0908d7e34c14b3d2729039ed5d4e9783bbf94d86a294985d1c340eaec42194acd73832c082b846301342841064d968f8cd4a67ff98b901922e2c7939ef29cfa2bb29ec51003af6133fb5e5d69c32ba398062452b0bdb934597b5c95b88480f435220026347aaf5462a64eaf89fda8c72886dd74dac357c6b1cc45fb17d6d10536c399b0210fffdd7e11a1ac4d000092640120d88027a9100fa8b34300c560eab7420613e94cd67d83040ef475ff930e0006ab10d44e180ab1826c1fb42803bbc021a581041540c2d6e70a0c088082051ad2b37a00c22a1d495400cb6ce85605010801000121100ff5b20256d07891e8017f6b656d10732e3b5f8db8963c2e85d0abd63c20ba59b40bb5938a74ddb6860be06038c02c2070fd963fbc445578961eb50ecc7c429bed2ca2fde28e334953045c5dbe177fde7396da5b05d32b00300b95c70493a46ed8c6004d015c4295801b6779ddd5aa997dc0b9eb263f5c0effc2260f101282f8a0082142db04936030570dc0cfddd02e3c90b633ca61be478fa851218923ff9ba8edbc2bb5273faecb8401cc54d2077e12e40a17861bb49cca15b62d16a6883ca88a5aeba914af7b85e7aed1fd8beb0f70f1f0f2bf1b4ae46dcb744bd65e271e7029fbf10a16579297d1297839122d2a0b61c381cf43213c474711fa6a9e34fb457b05832dce6ea96142bd6a51b71fc6f67b5efcfeacb21701794b2d18bedee6fc31040e14f1dbc1ac3e1108b2781d9f7aaf1f67fb1af2f41cebb541465875)) <<< 16000) + 0x3bc64bf3bbb7b8987ae4e86d010182e166a28b581cd2ce40630b69b91a5bf3d6d5a217932836cbd97d2209456ca5b1e1cb92cfba8e002b58ac6b3c8444aca670811edb0cab0fb6b6f673808e5b8073ab5214bc5fce7b1c1c48e04ba698084080db90d64dd2cace65ad09e5f2795103f020ab126545ebf377ac60744d64f5f21a9742a82eec6e3c5076b4ad632200fa83b88d88a6d94390b92a837a90d682576d6f5bb38c6a0591797368642788e800079b220e421062188290c07c6608a1b1040588180e34698dc4f9eb168a71cd27566c32d198109c1180800000001764edb22b838e18b15485aa0f99629028a20c09200e0080781f87dac607ae1576ee335571c0127bd8af008643ee2330d859aed8d4e8cbac1dac939d2d8a27480b8516cd2c31e71030159b40b7a1c20de7dc1055142157f6244030828078809dde14109350a5d1a30018308459b4280112c24a90e240011b2e55e00104d124050038a1c1a9a9bf35038c31ad0d94182031579b720fe8c180d259c6e4830e152c4023ac1824ccd63f5201c009e1628470001351ec99008138333f2405007182902455953ce8cba02ce08c0453835af760b6e4ebc22a20ca8207dcf15e620f59a628c3b0b4f90d0ca1c718c0c80c304c00048a299040294c63583aea3a8f4f35ea8648b1cdad315191ebb7749b998a38fcba3424c312a3c50002af2204120004d821bc4200071122024b100258780ec3bc1702e50067ba594a9f80547f1546b5cf14447d6427e1ce03f25adf32e4d55d4380c8ece1b3490fe717b7daccc9a96d000d21135d800a9b0aab7c5ff0cdd10741204bd6790f1fb923cb82e2383dbf4e9a1ad64bc0c90bcf6cad532012edcc61105eef9bfa40cc662e0685920ea1c6d67039f1d8996378a2382301000000002ec9db6457071c3162a90b541f23471c61822011813402800282c5d12305ac4b2e570c63e4b8b78839803e83e51ae20c422d07b0183d00e07f71aaa3890874232c21c2a70dd5e0c01bf509e52008a2754b025081e00807700e48ee2184b8810e1334b128312f9d97c80f93abb1509020780212420e0595b204040b103a50604c240dc80e651f717100b63b35ab3c012f2cd025002acb00e027081f0080000a9100023a21d0220ff090001c590fe1d8710ef475b13938ebc90e84871a0b7010009e7abd518284fcfb87c18d8a6c705991ca5acd41474310105a97f1da4e603f8d038504558700276f0280b30dbfb3e22cec0c04b5ab5088faa2bb29cf4f54b3881f04201ec060f40381e409f77e1012ce9496d30031ef97665000f4dbb98800d44c203012860f80403f40724473aabf720410902c0a486d690e03c08c307c021244dbdf288487f4ffdea0c19d4f4c6c403b1e34af1e00881aef6700cc0e6e11400fc1e75604e183c01000014d200042043f0240006a64384541be2a00064e21bc52000c3e218e620f1210628e800412c800d5790fb4587d04e43b3bfd85621af81e307f738e901521234c309f87e68f8cdf2020809f99061808e0b89140ef1205e90fa34d61816b7cd22821414dc006392ee159fe810dc8087db601368e99e08a2376498c0ec1e140dbbeccbca53647d4c465cb59a32c0ef7618b7f442f5df700000000000000000000000000000000000000000000000003089420e20818a11200a0040000000ed009e0947ca0a2e6c60b5fa801d70d455ce507c51bf976b1261be67010fe22b18eb78ef26f405da6786b886c0c6cfb3976cda74bd1201b4babd4239595a585a87abb0b9456fb7a8e288840e93946b975706630c95892051142044d185536546cf1c403a9a26d041a51e9bf61400b1046410260c2000860d4119352c40a5075f9ba30a457aa264388009adbfc082d925fe644000974590c3005a0aae521384100040328040002dc43e4478377b6ea7d2053301003430af7d3d920710a448c440a01a77027e0094407c0218340d30c009028f81cad78c294c63ef80e08c0eb03f10002e9c98d0c0155dc7c40600393928d01386100040320040002e04000a2c8638a8318341e21a0c5090002e390450d00053d10b52d07c0a83dc541ec220f51104b06800362087a1ac3cc271a34c6e20581ead9a9e12485be127b94c41189f354630ee214689601127b891e11dc391046234698dc4f9eb168a71cd27566c32d19810aecc4a9098d01684083865024803803732b9fadc5a0556c271e0fd2552c3ea0131437fe25f9eb7de2b8ad799f9a010bf3617e1884473a50a87c05753a942ccfaf037b80dbb3062332bb524ef352d0c42da245dd5ff810bfa7d006b35e9ee12fe9761103ca8c8b3317ef59cd1bef97c8740a89eacab265061d65789c9bdfed259b2c455684c72d040a5131b8107cc53b0e03e5af2e7492f2be182f8eaa59e762e5806029025cfc1b5c71a846db14ff6c6adb141b481c00cfa4a6bc040b75ba9474e37347ad6de83cdb1822753abb26d017e5b6ae5c76c67f3679cf774a8efba5f20da3efe71fcb106d2f14e1d95852647a14309374dde668e6e3f548b377001818811cfd274bb3ba9e43689799881c61156e5e267b8ad85f1cbed4820aa7a9fc9088552b78ed5738a118010995f89e2c1100860b9209400600424b57bace4c028e6242664000710a5908f166bdd065d4ce884000006afad580607bb74275805bbbc6d67d56a46d00c28c82200003d520e81b914bd7d3c7d83842c8ecad7c0c2aff1e3dce8410e7dbcafc87005117dace0100a869feb8000052aa4b04e008063e117a00d840e0d65538c1280c01c8040003ce43787400166c43c8860d0430)) <<< 16000) + 0xf11d8780ec3bc174137060a9bb2ea0101b4248e5b024b50c10aeae2e0678232402bd0d26e4351f20003bd453b6848a1c03bf5632f547474050cd26fb40e6be842a5a806b5f25a0dfe553181a02a38800801bfe38203f22a25080a314fca6c1067c0f3bfc60031064872180012e116182130a1080403b80763806d4ea64b1d73fb856dddfb67069a19c1ae55938a25d11b4ecf0c38cd49b0c2dc8ec6251f129501767dc8067e4817f195e43cb7368300bbb2ec901d728003ecec4d5d4175bf3fa0171ad6b21928791b4430018dfa68b8218ef5f5e3add647449f6334fdb1d2b7358d7284d300307f08eec6ba5f2b8ba0e0cdfb1766db5d8b117eb56156efe3a88a89d2fcde880289e13d9bc4422da5d26422b8735cfa410cf2c049216d4d1182c808dedbeb9029434870485174423e6786840523f3523c00f8350721302108042490b9a1dcf1028bf6a376c517f3b1773c782094481be24042100800006b98020080203b40400006e43b024000514731e4ef56f02d2858b32c1f5d75bcac0000000000000004b29ba53dce5d460f44b1c61830cf09004f04d046000c0600803731e4ef56f02d2858b32c1f5d75bcac0000000000000004b29ba53dce5d460f44c20814710411008e09101000c02008036c9019f801716201d4044d87103ebf2d1e209d48b81f44420cc3429b9c1042d0599498108402000026243b0140005ca43ac1600093a40031bc8730ec39437040c66a5218a1c1b55cbda6080d90bb9d1049de1391f0e110870df60e004c40f4944c0842010825f172c44886026a9129e08719de364c107801000013e6008020080d90100001b9821521841c0a1cdd498bf8412a02948c110c660d6cd4c0826031770e009ab05e2c981080021040244c0782090f07507181026200ae7022581f3614041e0040000651804f3c5dc960feb535e680ad5f6f11820d0040364040001564000b5887508f0801b8893200820421efa5f22870a24967c4071d82eb92f643044abf28247070bde65d8431440957ee0f020c870426020592005a45c62096d325e2888622eaf1147062cee7cee584181f5c388820496d8004c084001000012b3871bbd9b1c4020b37f72f1c10200a4e409042970792e00021a53ec425042100806c80800045c87486f31e4ef56f02d2858b32c1f5d75bcac0000000000000004b29ba53dce5d460f44c20820a1d10cc0880510100030100200db240759cb31439706b3124430bd6cd82805d5f683a0808f5cebeba20a05f395c30101da192613840f8040000548c020cc50ada78329085ba824103e0080d901000048100039e2000f9a43a0441ce0a07a010006b5191424e06c164083565f45f1c4378cb94814101335500480821262b1a0838b9f7c24300212e3dbc9382108043881540be4520211bfec9b880a74234458107705854344808420100000d621cc130e50987202e04000124ba3886e259fe880906e8488020f7073db4090207c021c458137ca450412c04750808b70931e8a0f4c90f95380180cf6346000079ae20b00aef7a5b84e103e01000015121c60a07a0100013390e2150708a8380541be2a00056421bc5a00211a218e6a0c51d0011c910c429f1336fc62a220c21806084211122d207fffca051f2274d5804ba9020462001035565a3d8803d2da2961cb9da4860152e2aa787bf1a650aa5ac3a9d89725242c8bb24f8addefa41001f6acdc4042c66bd3ceab26303c0785128535fd134207f57640b085fe0a57282022ede6cd07fa8c0602c0b9de79407007cd8cb50427141e00806e80eba7e7830e9727e42eda0fa0724e76f483a265f0ff37d22f8000000000000000004138230121ae1c33c74c0bede67a8245b89b6b469fc8afa8785665479777a39e0e0e3c271dbd070e1071830c704c00700f660ee8f89b422805fc63ba12fa716770f7c035b7725bda914394e54504ff8595ab8c25b80e59c7671781439a0a6000da6d255cd8bf94c804b8eb4f93106b2d4543430f2ba3042469088b1800b4736068800bfd84e34309a4424e96180681cdcc30e90576a44130410804037014000290436c472412c3ac1b828ae2fd5b00201bcea51d90484508ce0e88a124ad9927a880000115bc20052af900907000cddca6c1509eadf91901044020a2702076fe1864fd5df19112138f17b283439e23e8404484a53630018ada4ac2008cab6df9c0078021230004161414498623ad744741af12c888a5880029120e0f08c904a003e0100000f921b402000270344047d2d6d62e39c60c75c9cad207739fe82b4085552d4c466bc0209ad05b75d161341d6ea535d48f0a6101e25b2ed4ada7f583496100b81db12f146d73bfacb280b934042b88bf238872e2f9bf92b80180012b797bc094cefb770bd0983fb4a8d5a5086fb1b31b9f8c5f8fee44f1a31d24ce10be2100d9010001e31ed0d8df0d55d8d52f03c9d3ee4db800fbf2f57dd16b338d2d800000000000000000000000000000000000000000000000000645a8ab433b224f7818802530dee887390947f3a837203a78580000000000000000000000000000000000000000000000001848920408309101000e0381a7256b020e0037823010d0a04ce0d0a04cd194d699501addff41f2289186484444141300100080c0000803646157a25b8512df9ee890a1955c730e206006ad2d2215b6357b52800f00400003d0800119981c60d0aa5af4edd771adfeb710100426fbcaeef1b9d6de0e0b0413087b5bf9985af0ea081ef50f086107fce10a83039f3f7af5030001689ef0fad9c34b13746b82001a)) <<< 16000) + 0x7f0b017db8dc79ecb2a800003ba2f220369399a2f92b5cc0a851d7c0ef9278d3f0d9d281178666c0ed61a3822e07a03640400074e4360240013ae400485c800c2b90740dd88653b5414910011f1d1820f961c3da23041f00806b8080f8041ac03814019132fd32072bffc1cf496205d9e97ef0413d24acc9d078671c3d404e40015d6d27731e02ee1304e68d0011b0f654839db45e6aa14021280e3823010d0a04ce0d0a04cd194d699501addff41f22481454444041012c0100080c0000803625a12838aa490ef31ac80a2422fc0b48055dfa9ae48003c0100000ca200041278d2377c0c3487ebeb83f740c7edff7d885b35db85232677541abdbf926bba5b561c8579c1490868dd338d391c9dd31a75b95af2df9bb3aceb39a76845326fe984567aaf8440fe66000830abca82e8dceb1432f806ff1e779b67e64e2ed92006f1c85235f1f3b7a1d33924840150927277ce45dbf5497a250cc612c924e252c175a48e0a67d3fe1db48f186d77ebda000ac648881bb68c4083090ae3ced81ff0e3fdbd9ca18626e977696ea7a52cf8162dcc207eaed8aeea2f9a1acb6bb7797a06423e87e67e2d2aca16b93a2c650ac8fee72fbda56129063fe9be6aac0b2cebabae24fb0f07fbcd335294eb2186b37c5f6f20c941448f501aa020007d23028b504bea1c81dee09915ac4113f95ee980f0c36620edf0b08ab2b38ef900142a6a7ae8f0281d1321c0d0026995f440fc77027a291008480389224c2e8d37df62d0622228ffad17db72b26c4042d66f312e0dbc25060621b467b8be62df904043dc37fa75293a499600b992430e6a2336c100007b96a72f58b17610038c93af0f40013fbe7f06d7a8003f08844b13159a9c2481cd1a2a71458585fe2e1441884975b30302df9b80103010bebc540228847d039c00800200002ac4001028dd93b6c8ae0e3862c55216a83e238c186704702502600100001d08a695f997413718a62e2ad92fad05b8e1ed60115c3ea1aa020001972000f484004e9886a088340141a6020014e321a433d0a04ce3428133559054665e124fc0754ba0a732487442944043bfc9b425a714471399ab1bad900000000000000003d21441c23410412c028024081eb6a0b641c49dcc86c3dce264a2a74d4f4ad43f70c0d8afdba08437995f2c6cae6593c0a7b66258d39862904bf9579cee199c59d0d101c0a322e57a4614c63ff8b921807cf23a203436a4d9c70501c63cec20958aa93706001c5b4180270c1f00852e829cc921d10a51010eff26d0969c511c4e66ac6eb640000000000000000f4461480ce08c08b08208d009022763fff079a6007e49c2f01259d1532baaa620957ea44949b8eccc09414486247ed0c064a0f34000a5480020210740de8502671a14099aac82a332f0927e03aa5d05399243a214a2021dfe4da12d38a2389ccd58dd6c80000000000000001ef6f33d4122dc4db5a34fe457d43c2b32a3cbbbd1cf07071e138ede83870650e38828840438408240d6ecaccbf63e0eaa3f651bd69f6839137b7a9178d0cd58ac3d969e6e43b979caa58836d8dc465bbae0a6e0c7c15d888cdd10c481b20ae51cf79a218eb811eedfd337f7cdb2b37355834b115ba14099c6850266ab20a8ccbc249f80ea710ab7b473f20edfa78626449de023c1a5dc33f52d7000000000000000076ecc2350ef43c26c406cde4379edfe8bdc1380bac0d09f32d000000000000000000000000000000000000000000000000030df43d0358eec6e71e95e0f1ff7c88867a83d47cf0e260700000000000000000000000000000000000000000000000b883882883846802814a6f4c0038146c39f8f7bd92999b94aa909a4ff7485a25bd86274a57b85f45aeccb1dd0fd6e1cbb0b59d64e6b12f69b05b3faf5a71a287a769bbe4b925c6f6338201cd87a815df01e5757f325c50e714f2b4046753fa1e55b55653c5d435f161a000f804340140e402000d1f219e320ce190568a80054f88669680111b485d1a8070b416e3a0b6010023ca10cc4986584fabc94f3d47f1ce22cb4d3cb9d6d7befb02ec1a1fa8762c000000000000000000000000000000000000000000000000bc25082841041024802801000026d891004925ca07c04b440837be5b1830449ee241c2000017250826f3525ac300c3c1f4460250c2000840a1bd9c738417dd03cfa5ab35899d9369adee1931fd08c925c547c4fab32e7bb8b73278268fbe0a2fc6a93f0a9db6ff37131c419c79162e656474879af410702120f6647e6822f6dc3ff2e44b06a4020cd632391c5dd0c89dce593e74f50688b17e601cbeb31d5daba528e3e2252f623d229762237800d794fa7b5f5237ab08f5962586f29b3339d6d892539b3f2bec423d6165d5822024d0dc1fa14aefb5d50cfa32f2701f65788ac9564f8441f66e241347625d301318aeae1d24ce594c34b9110000c246c40755992d1c40722235a1048b4d00582c31ad1f7470c31dfacb0c18026c999e80660c200080650080005108648af31e4ef56f02d2858b32c1f5d75bcac0000000000000004b29ba53dce5d460f5b29f95045e933c658c3dacb7af8b487a30bafff578de46ee00000000000000000000000000000000000000000000000006184100ccd1cc1481060c404c0002c200200dc179a7eb28cc81744be355a8b0e9321407486826182d4ce0e31e1f946c654fae8a48105bc929bb33ba0a17c690209cb3dd9b52ddaae88c8cd5f865cfd3f7b6c8d46d3a2615ab031125dff3bedfd1a397d51d649e6fab968082021255c76ee94bf6ed165429b24576)) <<< 16000) + 0xc6a5d354c4837e17787205b71749400b00906f12c59cc1e8082515385080971291956e7963a425051017c0f7d497346fad870c579f122ae3a92e2c7d7f879348c9c2120c016998368a6f4e84837145039f4cce5494377a3eb07739b0aba28c4d20eb1ee030986d96cb68a8392a578096311574e80003709a111912e5c58357832d31209eddd23c3824383f878c047400756832880f00403200400021e4002cf08638c83184418a1200143921882bd94fca822f499e32c61ed65bd7c5a43d185d7ffabc6f237700000000000000000000000000000000000000000000000003089a394390288186198118014060000401ba3b69b636c205246224d8206924d610830eec08c04180a52aca5f94007c0200001f07880fa5350e606bbec6636105967675644805ff946fd20010004030c040001ca4308174ba0a732487442944043bfc9b425a714471399ab1bad900000000000000003d6ca7e54117a4cf19630f6b2debe2d21e8c2ebffd5e3791bb8000000000000000000000000000000000000000000000000184e08c0486b870cf1d302d0b1460c204104503bb978cee42775229258417a2d2f9ebe3387d28a00ab393c48938e6dea32f3c3a4e1fa4b58ee97729e281b90de58bc0b293048cc77f55e8c54415d718b504fe39a86082830004000a9842fc4798f277ab7816942c59960faebade560000000000000002594dd29ee72ea307ad94fca822f499e32c61ed65bd7c5a43d185d7ffabc6f237700000000000000000000000000000000000000000000000003091a39029a2061981180140170401006e8e94307ccc8145af0de71a24926b08420302e99fa2602f63414d894107c0200001f47053c5d0386589c45d1a10c0c89c5c4b161047d67631c206fc755048073cb30dc000de019c013820f80402f8040002ca42f4174ba0a732487442944043bfc9b425a714471399ab1bad900000000000000003d6ca7e54117a4cf19630f6b2debe2d21e8c2ebffd5e3791bb8000000000000000000000000000000000000000000000000184e08c0486b870cf1d302d0b1460cb08104500df33076d826ea9d8bbd847d07d9ae99bb8234130d4fb97562cad11c52615f69295113f6da9db868732e793c5dc2a1531efadd42659d15e5babc88d2c85423f8e6a1780a0bb010002a71000b1921742a0b91500e0a82e05416e120b601000ab490b52d05a0882cc44164220b1110580882583400596242bc140150b042b8c60d04b0040148d933c356a7b43840635a74525308de306620315f42cd1e4036e2ce80e8990a3022db8c87a5f8bc400c3ebf4784c1123007bba537fffe841000fd85efa2470808807a1202090d01514392b0b7ae8e29125da9812243e799d80e16e88dc5c88092a6fbeb0c0132a56fa8400a437ea480004e40400108d1a63713e7ac5a29c7349d59b0cb4660429f3546313e7ac5a338e693ab623a943010503a48ad77232d0a534d71f599a4bcbc8cccf131754a335b0000000000000000008308201a1438e29220e108085bc869425781eb79e32f8e4bfd07a280bfae915dff406b77b0d5909dc12c8d58c721f6849a29506aaa1b0d87c2f971f003012af4d9421ab956eaeea0eaa88801c942b4141580a0ab0505500800136880032d1a21b6c13df1c2a45d0d28285e338e6e43007630ff004056b5fc6e0650c1f00804d80826804152020a8018538082640414c02000190214a5b0a42985190c28856142230a005c8c644cdbca3071450841c28417f3e9404024ee7b71830217e2c35200a84a484001009f09e1060a317d11f747d64609584e85219143c81316f5ff14d0e88183a94234adfa869d1c92a157d008996b9452c417435b8853440805a2a889c9cb68c4bbde4ec56430c95128aaf86a1adf7573e01404ab3ea03ce04c6f4ec654530bdfba6f30822ebafb195138e001457a9de1341b21922e92e55d2d49ada9b1a337ddba23e5cce5dabd147f501837bd5428ec9fa685e97aee13a8b54a26c0e8829d9a5f7abb6c272854a7f3fcb9feb69d31c07ea610a308a40000b2442786613a13a20470561d8a1458ac052080909ecced84034e37edc80081212100040270541362209a1104c8280004d884c0c825c3412c1200088b212a820943d84992c248941220b0900584780f49cf282bfe289433146cb2470022650a201310ce0032c0d390fb19100101ff981044261c2000804704c2181610a0be288542a470408d75aed99c01c3d94f412003750d958404be8fe5f00204a4040010e2a9a3e7222850c99cbf490905daff608165da9dcca01bf6219804094607802011a1a08c0d00009490820d000132908b2983414c228861122b0880de934b7fe02d1661be606d1622af75884901229b8000da769f1e80ea171e5d8581508c0e346fbbabd858931d7f543e3004125e888f8f3dad04e3e0f9f20f4097baf83d1787b98dcd5515b5d3d400253b4687e4b61feaddde81208d8411634ca58da945967e137210380a4021c3610c1308505c0534e9b8d8508f91894d880b40c2b603006c81690248013e1fa0401025201f00860a1c20db1228476974ea220429fd640c7811458013e40043aef6fa000e59450380084c3840010e1d7adeaa6703ceba74c181372bcab820456f6f6424081d00840f16b06459438a7f8b4900eea0f5f268668a18ff40052c7897ca003a010a2004164249c38a6a954c686d2e872a8c00370c7a618121a0e8eca003c0100000f43e71f9ce448f225738e64784dc5c3c63024c18bb32002474fe6c702fd729cc4c083a01000011920006644114)) <<< 16000) + 0x37c5b3283c58e25fdf9d00201873cb3c011880e804000028c84202e0626d5b5d94090271d43a48e1b2d5b6cc1496313040c19dbef4e014305d9a8ce681e453d9d00027181f0080000ad90006742000f8c420c741042200091320c06205e2502e90817084001a246e03eae2e8bd6573cb2703521a8123aadbce5c34f23a7a6ecb02a440e6023823024804002801334d18c982dd8d6cd1212371974c7452e5640da466f88476d79e571f35eff80e4e391637dbd399032b09529324c254a4c8f1bd6584c8237bd395d42f502c8a0c60cd08304d00b00343a5476458e60fc7d686dcec172b0089bcee0511d4e7c0463a23d8e12e5758b6a3b2314b0d84b830110521851e85eb622863fd49c98db310abef829c88031c7107bb06b93ceea27170f3d3ab44f57a707669e8a36e6adb3b6df2ff2c67f98920303a5092ee09cbcce9a26845e784a3881b033c60ac6815f7ba8ddafea7c6c9402c40e2b47a9a80b68089560e540ad72f9750f206ca305491904a18ea2b007005eb38aa51b1dec70da6e3f105fedc7e20c0044c2866464ddde7edd858c80ae2b6fcb44d70166588706286206204581cf05005d4c65c349a12383b0fa3b4ad3615a81808d0699689095feac29de7605b09e0254c21323fd0002b32000cb042043400123641608403c3a06b1d02b0e8154740a83a0531d0258281480400188a40751408a3b80d3d42fdf4186e3a8b897880bf6cc710312b1c716c479326eb2f5280c55a9fe2efc936182d55a9ba436953b0cbf487b53644a0fe43f89016e9a00589705d76f58d6524ba4fa4c25d4124e8a52e65ada6562001508c3f21ad0bca097bb914c804268edfb3294e519f57a9a56dd0034aae36ba71373dc472d95c07f0cc1685722c8dd3c893608f62040e90668b55ba5705ec7d2d03b582b8c853c96faed409b428ce2c059141413be94098ab7aee08218fb6690e02bafd8e812040f0040200060fe03c24edf34802c202495844906c14b9f53006047b4b09010780200e2038000080230df2970ac505e359308400d7505ce960297690024001d008000061907e0500008a907809000112907d1583e0af4805244b9e8240f6a24f49de84b20b20c4459ee6e89a519b9e3c24e27824303d490bd7154839cba57df31d0070287f1ce1d9e7fa3353093cc0548000181a3032accc5c302e89c9587c018bb90a5c1b526331b4181e81580b3947d163cba06d89182883509a01ec060f403a10bc31f724825daa3c43400ab984198068794c4009030740200f2038060080230c6f98ffc2c206d25c0a005ad49ef0e00f71a6480503074010000192400041883c0480008588002c3906c2103b8c80024b482a8ec1d8660ea1bbd399032b09529324c254a4c8f1bd6584c8237bd395d42f502c8c2091880cc04704900801011bf80a82705b238ad99088a27b58876c16dbc9a9de4e7cc509faddcb1ca1e45fb2526b063d27ca70332bcf1dab8ca9284085830c9d0abc80b22c61443831833812c11c1100030180200d07005e14332326eef3f6ec2c640544b18e10510608e04b04e00b00800032200200d0000f720e81b0730583902f07637251ff011e25ccec2bdc44a106751cec3b85820491d3c8fd1414b5ae2250188083f94b24ff4c0140795e3db220055e185386203e84061481601c407a408815a2b2058f40232028418d71dbc500dc6c7d3812060f80424a4d60cf49f29c0d932d19958b4beda0834281338d0a04cd5641519978493f01daab221771dd02ccd20a20814714800202445427018d42873096e63e13f4634cd3a10e8608d9f91fd289afde2bf92c63bdd0a77f5832607ea00058a4000ecc83804f0734842da04830c2840ff00e6e28a543016f7365f859e4a28129837bdf9e8cf241bc0bf1f97388530021b6d960820e02001dc902a4717241008b97fad5c22d402f9e99644b4f629ebc21020680b8d3025f77009c4ba006f212461317d7165874d5a1a44c087e4556f8c082885d0d26041f008698519cd351c4e34a5fae60c8a207b8161df9480846041f61f099c05ee022644c083c01000011f3a60a2791ac38984798ad088c583aeb08b0ecc17a138618d6fb19e30110b061f44829f94d6ae7001f0086983f4f1b88e25e93b4e5a23736e615c306024712c4586b2620974c045aa534a1c0361a237f9c007c02000029c41bc14000598411434000ab641b844000ffa41b434001bfa41b0940021c04078940d64a04b050009b4904a3d02416811ca408c5204305001146903a5581c86e88028010e7f072d9d9c38956cd7bee0564449148c0c04b97e103662851c39ac65d9fd53024024e05c4f9a8439c0402cef043502b0f100009c82b716f084a8b00eda66953cfb86697b8511cc307a0f8914f958f98909bff51ec7021a38f5c1598a0e00201a80600016e418c760d23391c992b5b9261f24e02c4beda6be17c6d65ec138c1d8d0694ca5201369dbd5296ed28da0c70f2a642bde09178d6d6ccbad3382e00801e19c0d226e57676c3508a53e2b6532d46b8cd472209d6d9b21c04c114acddc655543620a01217b93db3bf02231374dd21cfdc001d554ef2f2992b3e5ad1fde6fe3c4e7417b7e39e93ddf16415a59bbebf1edf18439b07ebe4e634ee9c96e88075898f2d225848a5b65ac7a2bb3e230c897f0f8ae004bcce8e592f672126315200016b88340ec19c560cc1b0650903204e453bdc9a3ac0d3af5b9819d12d76e42ce0c2706c0a19ece61da52427e900cb36773d256f0cd11cea0080ad1f18c5cd05c6fa901d830e7d5d63879befb001033d138d955ed4356da7)) <<< 16000) + 0x1a9fc5a3e42ad3debf902402124e1e214f9d901d119b19284cab3d62dc6040083b0ad99382eb7de6a8248ca0624692aedbcf9649bf3eba9f7be43a5a45fb79641b4320a39323d8b1c778669f30204c82ba89081a73689240c454a87c064101e008715c8ad9d2500f502418180de3137c0a05a41636c024101d008000066106209ec19f9a954b1164d6fd6a4c48311afc90414f607b229000000000000000000000000000000000000000000000b0230a588308404600580180040c4ce190949db3f6811bde494c7204529e9913798a1d10812fb92b05b5bc097fecffaba1ea98ad4a6e794665db341bb0efb1cc976d861bfde37a4482a3f9e2e7592bd3dcf3364ec878c91b8c679694001104800314906321c055184ba7c61554b61aae5dbad01cceee1c749554c99e41ae0904b4ab38925c106196c49f18c57f13f6aef8c13a9346bf3f912004ece0607b1c0912e4c2cc499ad528552a0a31787afa7cd600484f7c7ace03657ea18cf5eccb3a8c52404a311b7d691bbcc4254282d80e1b3b89ed6ed2b451e265ab317c25f0c72fca1162bf356f078385a528c29c3c786e21b21b7a0b75f75d8ebe9218078aef32fddad82e796f8287f48d7c58df02c0e9fea9c141690f7c1d0cd9725183034220501adbbc2a7a916672643c007e7aeee83aab4cd0e63cb1503c73cbd4a5b24c28ac1d006205d8830a265a1a5d6441bddebb2f45942826058ec028f5297682aced3a7ab8060485e69d74caacda5c90deed62b1c104a633c0f66cedd93742376c7bc030a99f3210c0917b90897677cfb96a595c85a2c3de74ea2c52df5a95823a0e68c3b209be1913186d13c000196100066120c212000a7f20c04a05f1d02f0e8174640b8320015d632401d131ba0a0c7fcc14ce306307fe4c23428a0c0be986110f8f7ec894108402009c0b05b0140858768c61e0c87813827950d55a92832d66e2d45fe2f93ba071159d7870c190b687981ee2967e970839d2ef2cd0b44f83b81e85c0aa0a0fc0679a0a184f3a545725b6f5d01149cccb40be280568fabaa8c674056de1ae8be6aa010a3954f95adf3cff0d7d36de382f2431636bfb4463dd969831b44e000076c413c47240305dacd9419a2d74508c1918510bb1a166d5f04f06133bb9ca01008d88f1c49302100040138060b40292044cf6e98a0d0549424060c599782a4d0a5dfe736c309c2aaaa48804dbac3eeca017e26023409c30800200002b64164140005c04160540982a01e1502b8a8158540aa2a054150298a812c140a4020008e1382c7e317ec4683646f535c64e290d5cb48950a30b9c8bbcdba0df56bfadc536e949ff1f85f8f900b2f42ebf06ab3b527facb9b99bbd12bcc2c187794a06b3cfbef8f562f1e0bb407371d16cd7eea7aff4c6973a982447241dcffc9af8585406ba3930f6d8e9a9d80716e38a7b2b0f0464a90e00a21305009d0ac00771248105e6da830e220e5736b104cb1cce8c6848eaf88f08085565a3e0a12c7ca54827041f00802700e85717f31303886c75992851155ffb2e8826654f53c1425c33292e500bccdec9470249ddbfb13820f8040134140002ca413c3742cdbb64d020310a24d166857df4c3d08084c71cff0a10e14252c2019d58e5f013040f80401380742c165f9ff54687779e1b56f8a10ec331865c402a40dfd76f0e0a2cfe369362820c970595a9402677a78ec2380d9fb71726064404130100134140003a04000c9c826088078440960a00067b209442049190240c811c5408c2a0451102208810c1400160040d9040684a033210180a80bc440068326f3db858d303f1000321812a34c1189220820c08409000e00a02f0a3786e922e4bf86e938c7dfe0a3d411c206cce346cd9392208517075b8a41a388f5cce5f3ccbefdbdd6507957177c1a59e06db406dacfff96e0ae8a20ce86e47ecbe3957bfe273044a3e81a710f44af979eae55e71b55366376c370507797bac76158269cb3e855712af34e961dbf0e697bf4aad57cfcf59e9e37e2250122d3c7ae0bf862d2a45ce2e63e62fc9dbcb781ec0b1b760ff48359f8c97ecf192e88357d634a42e0db2c9d949a2720a8ac36ca0d70e483dbd48281d2ae6541f7a774645d61a724c57c50be527385fc863e64b637d8d2cdd38a724819f26e004201de7b70b1a607e2000643025469823000000113761c916ee8687f0df006d4ba0a732487442944043bfc9b425a714471399ab1bad900000000000000003d261bd59510b02fb799ea0916e26dad1a7f22bea1e159951e5dde8e783838f09c76f41c3850c23c0200180949e814d218e216365130fbc25ec9e5470790818ca0f4060509fb030d31a56e337baf26a2651b33b5b79b28da1fec22efc985f8907b6fcd2f15dad5142d9ef1f30a9f0d69cb7374d1112fc727ab09df51cd1615deaf0a8d61708b4097656af9516a97e82ca2673f831228f09350cd0006cc8be400baadce10c095065d293020e8042f3db858d303f1000321812a34c11b0a1991937779fb76163202ad42019e443359f4ebc94a2050582bdbccf5048b7136d68d3f915f50f0acca8f2eef473c1c1c784e3b7a0e1c29228a29a10404992b911f29b892349f5176e2d9d9b31ba4ba34e63d79c1ff750e8dcbcf5675eae8a981f8ae0bb18cb44afc517543a1e35f6ee535ac40657c081449798dc433a80a1678d0004822000b6c60812475f95dbcf5ba66a18369b6cf1652e8e282381c765937d4d649d0238637ed430bc4debfa7da70a5e1db601d72b7735452d8f5ceaab1c1901030e4514934f725f1aabc9c7c786c293f4dfa8)) <<< 16000) + 0xe2bb3365bcd28559d0bbf92009a35a8fee28867317fdac99669b6498af22616f3497f9d3ce9770090de976cae94126960d5eff23bddb9aae2190ad3e171ae783a4f88ec1166d9c730532344a50839ecb8d2c24a06b30b142eeff4f2a2811be600041050002c1900119f30400c39413ebc3905b428584ca46a0ec7ceedcd68204b007b0020aaa81a05bd600847f742e63c2efbc3f9c770edfc8db595de94036cd507097b03cd62925651510329d663eaf7bdef621b0a58493bdf1800e986d21a8836e835c2d96cf3e90339c4889d6c57db38e700de38927c793253a4542189c2e867d21003f2e950d3d041f33f5cb85896f2c66a22da565ba715a9ccc3300a312526b063d27ca70332bcf1dab8ca9284085af0e3ce2ae00b559e98eda9aa6869b777c1d5abba679873fe15a8811422c80000000000000000000000000000000000000000000000001807b5a99d87c40b27c10cf05d737162ae13051460850870480233386c231b8ea1e253e7f7bbeaadc1a1e02002890b51d2554cc5240268966421bfaf6f8b9206032df711b41032f78d1f4da1dc581ff2eb47f6c3f00b32eff07835bf4ff3045ba9d24daeb207f84c41af9f36b681aae9e50005c9207a1a000aa52044238047bca6d13001a754c3c900188914e1c0876457ac90107802145a5b6e7c0d0080003b804005cf38ce3001e008400004010000044400036cd9422c7c4d2c216abb5c100f17da594d011d4ed192000e8042000020080000223000010040200080000dc8000aa1e107ceb67460945d90be1039ea36f61c0795ee1192020e8042820de679d94090106b445000ac1fbe1011a2aa8a900074021030048b590c21e37f3e30188ecdaa6003600800009520002ea40fc240004d66860ce396e971a8e98dafd2af85f57185338e4e0f7f34470833162e9a12598199c8fc593fd0900047b9eef63794c3b3bbc32d565499e3987c101d0b365fcd23136106fa2f1c195261f64f8005709722b9b97af61c5dbe230fd0a4c9f96f00b701196957d3645fef10d30a532cc69070a0105fab38fded25a62bcc1bd9085e839431924efac94c3d1a9a672c4195db53f8b602c745c3e1806b71d66bd65b0d5a0332d271cf4983cf9d73d966bb978ab44961db70223091f40401f0480f424000bda40f02403e0a000be8207642002eca20745303901c8e0737b7c8b185bc1e0504143fb6c522400ede34d22000a13dd725001f0084000040100000446000020080370100001b903809e12c96e6651c3cd675ad10010017a6c500352c0d248083a01080c01fe3421853ca15a18800740212100aee7c8c1029358d100042f68084060fb8cdc800380100000c1200029e6008020080370100001b9000283206c1a0350d01a0480cc2406412031090180280bc140009c440b8c405a5202c290159480a8940524a028218138680981404a0a02405001b4d900abd220180147042bd85a5a54830220875302270283728b4cfba602024d96af1c6f81804d9685856b01001053078b904a8103a68b2cec080a4b5ad476dca1adfc0795bc71a6342c02c6a2b1160d39730806d7d19ae8e4027321f3ad2e54c0000000000000000076238a3863061041023002802824ae32f94e4ad4dea44c4741015059e2b59b577e5a4a3aa306fd4d2394d7d37b5c82306fb238df0f181f2458e06b33f240a0c3709710404251ca55c1000512fac561c0030dbc81083308118042eda9e6ff9b4cda06f8883ea6ef9b6217651b0531ad91503300000000000000000412e68346826d8885d3ded24e59bb3414e629297ba145e4c0000000000000000f4bb026be1fe86a67445a1b96ba801f9d1582781aaab637000000000000000000000000000000000000000000000005c1020c45ec1a3eab02939f83eb56bb93d8c3038777f745000000000000000000000000000000000000000000000016d0a20a1860cb008002a100200dc288f95183234828c7f8c4cc2210b1758914104baefed01001e00dcf4940088021a5012a7dd4230a23eb5551e6900da873b5871812347fe10820f65e58f030085fd40f125800000176d2700230080000b51c28c990a8fe690d19ac468308e8405171922046389e4ca041c41b7ca4000014e55e100214150ba4e0042010d281172defd98511822b87634804cc7dc3a38c066545274410fb632e0418043721f9a22c000000bb693801180400005a8800170900058820461a000b1a204423a141add3121245b26621b088147b168dea1c150b5856ac7007b16303609420880216403860c8845100d4154ea16310ea374d450d62cf447096100009210eca0844010b2020a1dd6d785106c3c252a4b2c60627ec41520a2020d06eddd4208aa25352054501a6bab067152400000124d28190e085204000019c20005804084340400a01f01000212901e1d000871101d2580e00e460a0c911990304ac5229c9106353257e40952688d20041165549a1880000112446c00420089180cda5557903116ef90cb24405f2a02d21820be42c8dc104bbc2286f10043855214d1c000000bb693801180400005a880d82e46072030ee0818227a8cf424421980c3b8812ad3c80ad10000053c170941088021230263d487520620e29557048808c318e8c90c23081471020837a0d0d4200890600ec03800000176d09c108c0200002d84000a4080d04806424030120170500b028054140280a0130500030d901205000cf410113500816803cb401c5a00d2d00616802cb4014320091500406801c3400c0200501000e9590041d0018e800834002020000100df959)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase4" = "QuadFullFiveCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase4 private def zz2216:"s08a8"="s08a8":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l35 l36 l37 l38 l41 l42 l43 l45 l5 l51 l54 l55 l56 l57 l58 l59 l6 l60 l61 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xffd563f0, -0x11fdd2876, -0x1b3030108,0x1962a9ec], ![-0x11fdd2876, -0x4e4d3b318,0x5be517d4,0xf4fb9276], ![-0x1b3030108,0x5be517d4, -0x75d0dd74e,0x122024e68], ![0x1962a9ec,0xf4fb9276,0x122024e68, -0x91010fc4]] noncomputable def hinges:Hinges:=[(-0x10149be,l6),(-0x93f0812a,l5),(0x53576114,l9),(-0x60283098,l8),(-0x1934df02,l11),(0x2f73a844,l10),(0x4be76898,l14),(0x147253854,l13),(-0x1fe4ea90,l17),(0x14b0ee904,l15),(0x202a1bf2,l21),(-0x10548136e,l20),(-0xf5f33b5,l23),(0xbc2004fa,l22),(-0x91010fc4,l27),(-0x1cccf962,l28),(0x91010fc4,l29),(-0x93f40370,l25),(0x35888772,l30),(0x91010fc4,l33),(-0x27c982c0,l38),(-0x91010fc4,l35),(0x6015d3aa,l36),(0x91010fc4,l37),(-0x17e823dc,l43),(-0x704e897b,l42),(-0x7304ee6,l41),(0x5525f9d6,l45),(0x91010fc4,l51),(0xa1febf6,l55),(0x2a234b97,l54),(-0x5246a3ef,l57),(0x641a4419,l56),(0xbd9183c,l59),(-0x8b166424,l58),(-0x2bcf6841,l61),(0xfb953e8,l60),(-0xcb1cba8,l63),(-0x80f6a92,l65),(0x1debbdf8,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x91010fc4,l27),(0x91010fc4,l29),(0x91010fc4,l33),(-0x91010fc4,l35),(0x91010fc4,l37),(0x91010fc4,l51),(0x147253854,l13),(-0x93f40370,l25),(-0x10548136e,l20),(0x53576114,l9),(-0x5246a3ef,l57),(0xbc2004fa,l22),(-0x93f0812a,l5),(0x14b0ee904,l15),(-0x8b166424,l58),(0x4be76898,l14),(-0x2bcf6841,l61),(-0x704e897b,l42),(0x641a4419,l56),(-0x60283098,l8),(0x6015d3aa,l36),(0x35888772,l30),(0x202a1bf2,l21),(0x5525f9d6,l45),(0x2f73a844,l10),(-0x1cccf962,l28),(-0x27c982c0,l38),(-0x1934df02,l11),(-0x1fe4ea90,l17),(0x1debbdf8,l64),(-0xf5f33b5,l23),(-0x17e823dc,l43),(0x2a234b97,l54),(-0xcb1cba8,l63),(0xbd9183c,l59),(0xa1febf6,l55),(0xfb953e8,l60),(-0x80f6a92,l65),(-0x7304ee6,l41),(-0x10149be,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x78190020000000064240b3008004086105802248028006d08a0c0021900500000001a06004980600000005609025300c0001d84e0c004c8020000010a1940648c050000021c338069180a000000420c8039301000000e04818016801800a4102104024100500148214228048200a00000000002409200800000005412064601800000094110208c040000000000140690040000000822102c300c00000004c1204460180000000000140c80100000000004a04900400000000009805200800000007422058601800000000001c0c8010000000001081610060000000000180d20080000000001681c40100008918443018900400000000462204980400000000000d0320040000000000c81640100000000000440c80148818c089009d5a00e00000003609025300c000000000006064008000000000d404c8030000000001b8059006047c32023006ab401800000000068016401800000014864030c0300000002d0c80618060000000621102c300c0002905409007a8020000001341200c4c040000000230a80518060000004908403230100a20508220031a80300000000130b018c020000ac1202c04ea0080001342304803240100000000000980a401000a20ae08801b50050000a813828036a008000000004c2805300800026842090064802000a60a209804b50050000b81403802ea00800000000026009200c0000000000120640080000000000e01480200000000221203180400000000442c06300800000000038012401800000000012014802,0x54320718040000000000240e20080000000000300a40100000351489804900300000034120a05a00400000000684c0530080003484609815480201ad15504f013ed006034828a098037da00c005d4a30c702794014000000e8c86814801000005b1c8c40b5003001c2304318124a00a0001c8620d809940100000000943205860180009419c1400e100400000000320c03180400000000a4640e30080000000001a81c40100000001112140d00100000000120c03180400028c661440a540100000001241406e6018015524c29c09e500500000a63114816a0060000000661401c300c00000000062058401800000002b06024c0200000b4420c80e200600000f482601b4301400002c8e46207a801801892d038c09ed0050000000511881618060001884c04c06540100000000110480c6010000000289240d0c030001222887802a20080000000002902c200c00000012452058601800000021030064c030000000492081b180600000000007409200800000000e86816601000000001909024c0200000034140a05a0040000000005830330040000000843206c601800001021840648c050000000291080a1806000000590bc01b3010000000aa1600766020000001444101b0c040000002888a0141808004b88184701b040140000260a82407e8018014624a18c06c900500000000340a03180400000608a1024c30140000001105e01a6018000000210b8074c030000000491c812180600000006c2101d300c0000000e432058601800000000019024802,0xc22a824044200800000008239036300c009a90610e04f280280000000250b014c020000000004c28198020000000002830330040000000068481c601000000000f06038c0200000a2490f01b2006000000002c140a3008008a8e60ce04f28028000000000310388020025242041813da00a00000000002805200800000000a828126010000031148780d90030000e62c02c03d200800000004219016300c00000009436028601800000012874098c030000000230c80a18060000000344850340040000000090700e601000000001509028c020024c318478028a00a00000000987c0930080000000168c81260100000000006408c8030000c42183601520080704604118091840180000010a32811860200000000190b018c02000004046680e9180a0000008118408c3010000001023200b2602000000001915028c020029e33c518078a00a00000000003c06200800870e304e0360802800000000120c0cc010000000391881b1806000000000c9103300400000010462048601800000001e0902cc0202a62260b006d2200c0000005311c0a830100000148841c06c8018000014a2140930c050000002888a0341808055c45c1300da440180a088082c0094880300000000151103cc020014e21c130129200a00000003211036300c00000830c404dc602801011c220c0dc900500000461b0a00e2006003103484203d34014006407208800e68028000410d424006100400014a3b02a00d20080000000a646009300c00840af10800e0802800000154440060c04,0x62120260662008045030417c0720401809206282d80640803000000c21040648c05024818a0f60190200d04871e109027ca401e030e142060339480382101c108801995006030228208c048c200c0000050881024c301400000008432068601800cc1420a4034d0050000084220700fa0060c24824718096340181819018e100c46803000000001a0902cc02000001942280c9180a0000003208803930100a1086861005568030000000000090188020000f81e04203c20080000f02106809c40100000000000280c4010000740d02101e10040000000110500618060000f02105003c4010000000420a00786020018c2c250409310050000000000160310040000000000580520080000000000680c4010000000289240d8c03002d8504908126200a000000002c180e300800000000131606600800000001906014c020018418c140116200a00014831050078401000000000f8301c6010000001cc120248c04001481241101e9a00a00000e4240a01c400c0004d0c61a8114802000000001105018c020000018c210137180a004547604202bd40140000000782803e6018000000e4260078c040001061102e05420080000000000240720080000000000380c401000000001b0a02cc0200000a4220980620060000000763501d300c0000000090480c60100000000001701880200018441890056a00800000000c44c073008000000008868146014ad214083c07dc5007000000002c240398040000000000140720080000001284a07c601800e118218c0dc9005,0x423e05180400000000002c09200800000010418034601800000002106018c02000000001e0a0518040000000078440e30080000000088300c60100000000000740c80100000000001e0490040000000002c00b200c0000000ec3406a6018000000001040b080300000000261e02980400000000ac1c0a300800e11631d20730802801e23064240e610050000000001481190060000000000340e20080000000000701a401000000000041038802a5a4a818780fb8a00e0000000003902c200c0000000004204640180000000003d038802048c3121360396200c090860c224062c40180000000000e8164010000001143700a0c0400000000004603100400000000008406200a0f0e6421e0299480380000000000540c80100000000002a0490040000000a23103d300c000000ea3280506020000001c4310160c0400000000000c03900400000000006407200800000d304c0112602800000001a0702cc020000035c118024980a000000610580493010000000dc098052602000000011824094c030000000001e80990060000000003f00b200c00000000078016401814a1160ca007ad0060018c118158079200a002843084302f040140d20a086b8124080301a41410f701c810060000c82886e024200800000000641c0a3008000000000b0a06600800000160a050250020000032110581aa006061832416c072c40180c106182480c588030000740cc1501b9004001422042181b9200a00000003211022300c0002086811819880201240c105f00c41006,0x1c160298040000005a10406530100a106204381dd080301420c408703da10060000c22085203ba00800000a4320a03f400c0000000481801260180c109106400c49006001421841100eaa00a000000000014092008000000048180366018000000088280ccc030000001082a06318080000020831030630140000008210812e602000000820ac0c18c05000005221048122006000000005424093008005306f0a00326802800a10d8124014d00500000000160a0698040000000002900c200c00000108288130602000000000f0a038c020000000260e00f9806000000490d801e30100000000000d80c4010000003845302e4c0400000000003e031004000000d4a43c0740080000000190f80c6010000003c46302e4c04000000006a3403180400000e482601b430140004306a11812a802000000021058074c03062450a3a204f0200c00000000a4740e30080000000e41c02a60180000001d8d0070c03000000001a0c03180400000075190018301000000000b0680c60101c210304402561006002043083181e6a00a004106206602ad4014005506608a05268028000000188a4088c0300150184220109a00a000000000019032004000000e8c8480c8010000000000320148020000000230e81798060000000000cc0620080000000843804e601800000000906038c020000000001c18198020000000761401c300c00001d8501403c801800000025894074c03000000005c420718040000000068340e300800000010c380386018000531301903b9004,0x491101b980701861208201661401e0d8d64112065c2803c1e19682280f78500781233e041810b0a00f060648088027e1401c0000000c45206c601801321822840aed0050025231452818da00a00000608a10192301400000190e8280c80100000001c8c4050c030000000531600898060000000561b025300c0000000b83203a601800000000002c0c801000000388c203618080001583105403f4010000001623981126020000000258e4074c030034c52441010ca00a00000808e1024c301400059902388192802001862521880865005055a30c09e05d8a00d0086060c0017e1401c0005112c24805680200155250230052d005002b24a4440035a00a005109609201eb401400a792c12401168028000ae2644800ed004002b6490430055a00a00000628a50192301400000c714e01a4602826418b14b00cd90060000000390b00b98060000006214803930100005692c24805680200151264240032d005002a0490430055a00a00000000002807200800000000d0a80a60100000001b8b4050c030000032c528124180a00000638a10248301400678a10d006908028000000198a40d0c030000000331480a18060000006915c06830100000000dc5a0686018000001544501b0c040000981a83a06420080000000360b024300c000278420880728020000430881201a5004000090198260222008000110350740c840100000009848281e801000000000a0603cc02000000001e0e0518040020438858018640140000000048281c60100000000190d024c02,0x4d0c80d1806000244640dc0d440100000000000f01a40100000000250f038c0200000614b280c9180a00604b091202bb401400001812c20324602801822c442407ed005000000003c0c0398040000184320902d400c000390660901788020000c20c81703e90040000cc11830032a00800000000681409300800001884c1601a8018001021842300ad00400001026107806a006000418c218406b40100000001a4c206c601801a13024c80aed00500000684c080c9180a00000000941805300800d118225203f680280000330c8580dd0030001ec590a2035a0080d2090842c0a5c401800d611210203e08028000d42084101e1004b0848610681be6200e006908308301b0401400000000e848126010000000249040d0c03000000000647819802000318811d40a24010000031908780348018000064208f408900300000066423e072004000018c843c02a400c000619041081aa802001432201200be900500000c6420880ea006000304840880ba40100000019108f8148010000066208f40c900300000c6411d815200600000000582406300a82101831a06f9880380000002c844034c030000000793881b18060000000b64901d300c00000000b0481c6010000000309640d8c0300000f85904813a0060000000b251036300c0000000088380a601000000002109024c02000000006614071804000000c308809230100000001846405460180000000000d034802000000508d002b180800000000c46806300800a19100a405f48028000000001e0c0cc01,0x6982da22c0258a00c0000000084180530081a10b008a001e2803000000308b200e4c0400000000342a0318040000128441401b400c000000d02a8038602000002c243004ccc0500000000020806900600000000a8240630080000001348402a6018000b21ac41019900400000004b2280e9806000000007828073008184101085814b880350420308340df310070000000391881118060002447318c09a40100000001044406e6018000031168280d9003000000322a0c052004e1851208201661401dcd8b64112065c28038000000148940d0c0373c2ad04501ef0a00ee2457c08302161401c00760a11220698802b98152022009f850070000000291081b1806004485088102bb401400848a510a0636802800001422040648c0500000000004a0310040000000064240a300800003084812068801800000002d06018c020000000891e0059806000000000685033004161101842813b6803000001c23040930c050000000000881610060003504b04c0664010000001b088381e80100000003509006cc0300000005a0a00d980600000b094101923014000000164a20686018000a31c4610325004002023845180cda00ae985720b403ae1401c0000208e45c06c801826d14604f02ec500671829206e81630a00e081471453c085b401800808e11580324802bae16282440df8500770428306000bf0a00e00410720ac02bb4015ce0aa812e04cc28038000014a2140648c050000029c438069180a00000006216017300c000000a421007260200000000270d018c02,0x1242a02a03f20080000000001900c200c0000000090680c6010000000000640b08030000002406a00e1808000000006854093008000000c8b0880e8010000059110680fd00300000000241a071804000184510d808440100000188a434048801800000018884058c03001dc290288137200a0000000521601f300c0000004a0b01fc60200004e0841400f9004000000000076031004047021411803ea40180000000481206e60180000246344044cc05000000625e2e03200400000908cc01333014000001423981126020000000310d0024c03000000002212051804000000b494380540080000000128700a601000000000005c0c801000000308a2036180800000000b4680d300800000016464042601800000002e19024c020000001884205418080000000000680d20080000000108280c6010000001d0a07029002000000001c0c0698040000000064180e30080000000e43201c601800002ca5140648c050000005914401c98080000000002100c200c00001411d80266602800000000013018802000000003c1a03180400000000a8780530080000409583204c80182c81c20cb0297100600000b21904816a00721070c18d037cc401c000590640b81f4802000000000f05034c020000001a120a0320040000000a21100d300c0000000128280c601000000001d06038c0200000000240c06980400000094481406400800000000d89814601000000001b05028c02000000003a120398040000144641603f400c000510c81280fc802000000020884038c03,0x320580e18060000000681100e300c0000000d81201860180000000190901cc02000000034048051806000164480c8095401000000c8441603c801800ac0ca1140649005001301b01280d9200a000170490c40ca40100000150903202a801800002b130700750030015824c3580c5200a00014c320880394010005306708e01a4802800002824840930c0500000000007207100400000b0941024c30140000000842201c6018000020a3940648c05000002303100f9980a0000108380b01d400c00001071ce01a46028000002087200e4c04000002143200b9980a00000808e101923014000000104720686018000000001e140cc010020a3b4280126200a000000006c1c05300800001c8dc1c028801800000010844058c0300000000322c0298040000006716c08630100000000d05a02660180000008c1302b8c0400000000322c05980400000000645c0a3008000000c22a810c6020000000188b4088c0300000010822047180800000000683406300800b212610605f680280000001d8a4094c030000059ca38069180a0000000722a01d300c00001431e202266028000000389a40d8c03000000003c22031804000000009c3c0a30080000000001381240100000000220d018c0200000b4210981a20060a1071818807d34018000000000d0606600801441cc0bc064d00500000000004604900400000cc5426035400c00000162418112602000004a0882807100300000000320a0398040000124540e03f400c00001888c180468018000941601301f9004,0x23024011b980a000150410940a240100000000682a02e6018000000e82b00dcc04000001ac288127180a000003785b010e30140000007a1780dc6020000000c825025cc040000021c3380c9180a000000350a40ce3010000006b0a2011c6028000000c42d0238c04000001cc2b80c7180a0000032857018e30140000000843602860180000012c3d01a0c0400000214358124180a0000000044380530080000008e1c80d06020000010219c0920c050000000210d81a18060000000461d014300c0000000943e06860180000001087c0d0c030000028c2100ab980a000005c84902d7301400000af09406ee6028000016010c07dcc05000002b024011b980a0000000034140a3008000000aa2380d86020000000c4110320c040000001982602418080000003505404830100000004a0e818c6020000760941d03310040000000000520710040000000000b025200c0000000001e01a4018000000000240748030000000000881190060000000001400b200c0000000003a03e40180000001c8c40d0c030000002882c04b98080000000000940e20080000000000d00a4010000000d42701b0c040000000000320710040000000003500a200c0000000cc4a0146018000001a44100c8c0400000002c138099806000000006c4c0630080000000000d80a40100000001509402cc0300000002c108099806000000006c4805300800000000b0880a6010000000000b00248030000000001b00490060000006a04401430100000000dc22016601800001a01040098c05,0x220a05180520870608d028b5401c1219010c1814b88030000000210640b0c03000122418c204ba00800000a1911011330140000020908780c8010000028243004ccc0500000000221403180400000000e4180e30080000000000a81a40100000000003502480200000000006c029004000000b124c0893010000014890120248018000000000260348020000486392040f980c00000908e302bf30140000000a44202c60180000000011002c8030022638c618044a00a0000008e04c02930100000000e83801260180001831090207cc060000030441815f980a003cc618a30089401400001e0ac26016801800000000011024802000000000024069004000000004c140d30080051876086051680280000000000d024802000004e190880ea00600012c3308c0454010004804c04a03588028000410cc23025500400000000221e02980400000004a0900b300c0000000000780a401000000138110058c040000002402200b18080000094260900b400c0000000003c01240180000000017404c803001cc2101c80dfa00a0000000005f00b200c000000000b8016401800000000006c0c8010000092410901220060000000000b40b2008000000821880d860200000010c3702a0c04000001b017811b980a0000042865024c3014000000821a80d0602000000c60d4055cc050000019416009b980a0000000044340f3008000008308402ae602800001321240b5cc050000002303e05f1808000004784a03773014000009008603ee60280000001083807cc03,0x1222902804ca008004845582d037240140000010a208172602000000204420124c0400000000721e0518040000000000e8052008000000aa2301fc602000000003a0f018c0200000000721c03180400000005421037300c000000224320686018000000001a1c0cc0100000584118116180a0000000074240a3008000000901880866020000000000c403080300000000421e0298040000000000c40620080c78a50678105680300000411484403100300000000422c02980400001145a1102c400c0000208b42201880180008517421017100400000000044581980200000ac441900d400c0000248641205a8018000920c81703e90040000040461815f980a004082302300b640140000158441c06e8018010a0900bc0cd90050000b81202601f20080001582205405e4010000420420b015680200000206344044cc0500000404660099980a000000911cc0893010000510b022007680249c1c1067c0f3410070000092410d01b200721070c18d03dd0401c00909070d0049880281c9186109029ad006038433c2040435a00c0728654428092b40180000000c45202c60181c318210301cad0060000000034220798040000003109003e3010000000420981d4602000002f0d0440dd0030000000120700e9806000000350980fe30100002f06212007c80200000008c1900a8c0402b818a10c01f5200c00000003411037300c00001231e20226602800000010870030c0300000484760099980a000000a120c089301000000016848036601800092104150321004,0xae01640180000000015002c803001c82941200bba00a00000000009c0620080000000138c80c6010000008608809b8c050000000160600f98060000002905801e30100e108184481a48803000000000044030803038830c0c403e9a00c0000003809401c30100000000000b01a401001181ca1480fd500500000384118116180a0001484a0d803f4011ce0a0823e079a08038000730c82403fd00470828608681ee8200e07183382340b5e40180c48a3064814d6803018215e0c2021ad00603142aa1940495a00c0000005304804f30100c18a106180e5680302410c3086023610060000000210b00e180600000a4441b014400c00001884414068801801240820a00ab90050000092120501fa006004882582402ae4014000000000ca02640180000000019c02c8030000000003200590060000000000902c200c0000000001780c4010000000000370188020000000007c481980200000000d8240e300800000001a8481460100000000350a038c0200000000005c0290040000000005d00a200c0000000001680c40102010c608301ba10060000002086801f18080000003104c0ea30100e105282300cb480300000000d038074c030000002286c07f1808071028c13002da4018000000660c80546020000710b01301b50040000000220c81b9806080838824402d8401800000008428018601800000000e09018c0200000484118116180a00000e8521d01d400c00000000a82814601001251420ac0dc9005], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0x12223958816c6b1961418ad198541ce51a1218a10653856e0aa0e19c10eac5da54c30c18046751bba31ac1404668bd0fce27e70c005c8463cd8b0a400018d850d9f9f63a02000f1960848f98a5204804c0e1c0340ef416778033bb01fae2b00f571322b004e9fd5835ec80f00a39bb899c816450c48c688186202082500180060300401bc70ca7eeb0a1acf4158f185085c43704089ae73fd0414eb725e809430780200001f0453817eb8ac03d5c4c8ac013a7f560d7b203c028e6ee26720591229029818411400400001c0715ec944027f19bf35756680b4cb25cba4adf7f8f6e28c223d0001dd24f82babac2a9c85783bf35488d2daeac8a3b420884d20c14914810708d00c00a00900000c8e0080340004b89dd10887c64000bcc4ee4b67705b3b7259db08e856f5c1978812bbd2beb1c40dbf9d0050b2c87af7102f24d4d10206b42cdb10260c1e0081da82e8574910eb24c107d7ce6de2046393b705850a4df8b31e1029ecef97fcb0567b68d1708136dd14f88900e3ea76420007af7bcea8029220440280001ca27682b3840d90b86cecc3476413a15faf8fe5922890546243041c46415040869181e8440a537e2ac804a203e0103b1059d8028ebc1675c0ba14b6547ccb0d060819ce994ca8a2041e269d0dd780812e26ed66b060804290d1e239b8282049c50810c4280cfd249395de00061a5fba4f76000029010469f3013082080b40f000046640147400076e4eb494758323ab191d5008001eb085704f851c11ae45402840e6c560380402bb01e6971038214234ee7602827a91a1f1f05007377a6582830029a1ce58082005f552b9ad6180227d871e8a288a058d81a9190020542510a009000048a4ea5267505b3a7299d302ce94162360bb1811e8292cb0c631d23703080d85da80c02c8977300000836ddf48010947080021c0c361d26a18206b6be51e015fc229e46083c0108029412af0d044191bd80045342c6260836008000098306bcd21ec380144977d9000e80220000200800002220500b0000c126200bc1c0bd6dc4c7fd283f48930fcb25a1474bc54d78d7838dcdfc1c8e204d31656ed0b0c0635df16163a205cf9a615c76e046f553e61bcf9808fca2c306cc754bc529ac3080b72f47b399567bfbf3eaf9a438b808065812331897ffbdddc973e61644a800c033c3fd979f14e6650f742e9c8d2dd5bf1779f622d254ac8ed104b5bc68977c041225b92e60edce145c009401b14bd16d5f9f061214e2f02b7b5573de7b448f282dd5aad49a02b593ffc6b2195) <<< 16000) + 0x19e8b1176c5111cd3314f0f6eadc0da410fc3780003109399151c88880022ac9c790ce38867183338b199c486ce1c17a29bcfdbe480809fda520a1b3560ab8185f9906c81a03013bcca18034dfb2584c103c010c182ac4b22185e776c2a82025cf205211840f00400002889d202e0577d9acccd06a433c4004099d89cdf300088655645809b175d18025101f00800007f9256159d186c09c3670a13c104922d152c4411dec5cf04e88abb4000d6e9b9b90903078020706033a2019d080a01056ae8b130201c24ff8682520de1e8d02d2a700ea0120a0f8043452526643c60a1633ab3cc04e99fdf51609ea72eea041e3c7ba5c004a283e01000010220003ea4e04640443200034827404239f1519f0a8e7804000e304cf4f7040d3d42a70f3427fc1f64f240228468901aab54aac501227ec3b0e500200084100fececbda40c1010282883cc04c299e28404aa7141eae1044c37028ec0c30002287c24800013438c2400615d2003c10004c27fdc4dc801200a0000754c100c26ef6a4090ab75e704069bcf2e7f404437c3cb9381027241b6940080021040dc9d12c4903046996dd01012263edc9584119aff0099030c0008a1f08b040658cd2e1200004d0e3090018574800f04001309ff7137200480280001d520005dc78c04f7d8ba3c808b419913c59e04952c3c30e51d50b34101e7594a940080021e7d6278f00f03cb06e5b7f2a85862a15be24e030dbf71b6d68041000104e54834121c993e0526021b1de8f0851000048c64a41e02f19e63238cc900270200000f912af0100018f9d184d7c9fcab43c31f7513b88a0d0fb09340c190303b836b661e60209a3ecd76b152411477bce4be02045ae2fd189c240105b6edf3610bdc4061501a00007889ce84c0a0167380b39b01c0e006c2c78447a6bd20e61431ebddd453410274c9ca04113b9f7a2940080021c2905078f727828a265650fc2b9a100001df966a50275311ea1940408d89e26080008311099112d2a600012760aa36880a3a17a3af6200134fa2d9923a5f20054060000211303804c4993a251b158626447f33b25f82863fc5bc1050547bd27b020b727b87e98007c021c295e2cdaa0962862997c5c942602ec9bd80618004cbbe80a0c7d52fdc7020f74b41854260002acefe82203bbe5898b2002a90a7ac7f89002401c0000eb1000315311e7e65fbc2039d94fcda18625568504482011d75fc7006200cb0ca003e01099c122fb59990228b2ee52b9e2221864dc1b286aa85041113de3e76c6820105187e0545024ee68e6df5608256acdb57ada980471a7237b5810049162e0e821501c801601c0000898c47cdd7afe203f1fc3f6861a17215b43849644996401e4462f28e04aca05c26001d0084ce07a169633a65045fd31fe8a114ffd9f1f21866ff21c64128217455c2960412022d9836c5063a9b8f4649802ecee14de08009751a955759002501c0000f010003132000cd06228abcbb938f3c587b38db71c70a5b8849ea84b0430d03f16d0208eb83c57be44007fd296e505800a2b7af704400542fc2b8595680427024486397deae878c5bf35e60516c43b95818100b4fa1b0411a9a11643003e49888e6001f008409257d4e3626038e1c1184a8d38516950532bf39981049b96947e844100001aed940900377322614a10000a2746f7ec6fc3801581800006b480017610280580026f931005f9a0519e1074090741cb1aa03241d81c2c710111ec15a20654c9a0410c39332856f4c0042010a106a352a90202083d8ec0dd92103bab96c4ae4921193ed43f48020a902d6b6f0860200007d550c48000269893da0800957568e8302008ad70b8431b92400a40b000040e7c62922a4ce28a5b474ed040ccff5358861d722ab741810bdc042a3005b37519a6001f00840a07bed0bb890209173cef11a942065d9c8d7043a4842e73c30bb1010549bf50bd49808206a5b082ab09002a4f4571c00100389ab32d0800804153ffd38213864801601c00008948001b19f34145d446481200563c2b406551d1a968e2000eeb5904101053c9081871ec0548e3c23e4606ca4e004201091a0000f1b64e204c5aa5b0f4be708000038edac0e20ccf195f5e2208a0c933a3fa0e1086d23cfbaa2050b824c8cd4240001499061c0800791f652779762480150180000848c06483e0ff878c1f829264514a5256981e141f9ebef340018d0b7a3004c294ae66001f00848d0021e3c028813bd413ff02c71c9e0ebd2e288254b8462ce91c21b84da0ec2205ac020047001061fa54b985a0030bfea65fa04000005b15e17a4801381400007d480019a10006d8273412267018006f61399151c88880080749c790c1b4866663338b199cc06ce1c17820ae01b69e10447a04f2ec78659a17e66cd0ccbb33852081478acb3690812cb435346180b2cfed7d80016e8d026000148142301418802ce5c17a1b2268857a2051f3162fa9a0a9be8f7c610200005c881e03106450a2200f3eec1418003d5d810051098630010c384402000018924ac3b02711f325515a424f1d48b5eeea4a24b777525126090640153ba190054ee7501b6ab172252e9f1823474412c4215e0efce534737271ea410520855d8b9fa052b10d53e92032d1bf4ac8a88216128228f612822909519fbde9519fbdd0814f0c408f04e0189a652ca7295f70d2fcd5340be869e43e1b16b2adc79203a9bee29aa5875474522dcdb4539657e7583a00ddc179276813d6789c10583ba3455f88243aebc301a21b1fce398deb848601c52e3782e98df8a0ca5263704809e5d6e588)) <<< 16000) + 0x24f48d54a112d08ae39e1da637006143002843487828d9e59244026181f0080000979381150110a8e1004000e744e588472a2a06d151ca008002d1c801bcd1393259c910ce441743008434c8c30ebf30a0d440006ead8a10230c2100840609cdd9901f7b1ec0d3fb2ecd60c9df802a6f575915ee8befa4cca019c2188288a1f74b60e768f9c9c31889df3d4382b2e18797cdea09a230fe78900a687a0ee9f41dea6ec11a7d2da7e457b232df77de8a57ebb90fb4f27b18ccf3e37dbb1c54355f4082821278ecea785e5368c4a2173cc6648500b005bc9707956d1977fab70aea2541feef3164963177f7dbbdf086938a70e4c0fa518319f567dc49864a0f2cf0bb6c7e34e3bc648d42c8f9c078833ebe9b823c18e4b72e8022436ccea6aa0bd95a3b257cc57e5fafcabbc2fcfad1993145fe68790e0bf961a92b6e8e8d40de9bd3d439cd65fb5eed6c21ba70017f8a1182c22c80e4004050020007e3271e2338e119c686ce30367161b38a059c482ce201670e0b80c0200ecee1873bf524a40401e12ce8820462042010027019c300ce1406708038040080207f4067060338201d805e6a7f4400398d42cc8012141f0040000401381150110a80004989c00e8dfc4467c2237e0100014c933d399be8eccec666f80380c217d1993de187d367d22d3638207b22e1b93181158c82eac18b0885127b14e44000b16cfed63004701bf9d4a1d0aedeb6582086182902815788cdec366f41b3790d9bc02c9bc166ee0b37605c1272cad67fe83c395fcb4f99a0d0eb2be12d71824111426bc067850482b43d5aae240214a3d39fc04348c9346bd8113a2587a7f20206cc5054068c338a6e1519c3c531185680304881955dfcde8e04718971306860864c8cd3ca180c799dee2c82806b288ea2040321c409c0806ea0300001c071bb8dbcd40e3ac4eb8a1a1008f8b4f59c838406be9477e1020122b524d0a0d50d4be110104fe21a150c7800e1807e472400122a3cb501890c25014411468970589860016d4cc886b7ca2fa880600005c8830511b23b0010430bfe62a082a6a4b6c4000878fe23d80020004411719049324c6088d68880c34ea7f314130c002da998886b7ca2fa840300002e440208dede8438200a3d1c90f40010804000062490f0284a41400069c4dd03442e1a00057726e0330650dc453cb5fa805118e8ad2e381217556c8104259d0481809d710dd0501255e37400b080f0020dcc060000380e0b2e01891c7297b9fa8243035c0a9bca141b646b30283027df74918004227cf0004c20420100220dc0500401000004440006289b90a80805400063c4002ac899b1080745455e2a000ce326683b33319e042db62ee5c80180c6ae8257bcf840202266e6594c1c0048b316570424000228975741622080248876507e5009c68529461000679d32740c448a94f0b80d1e502492b9d037d25d605fae850f1c2ac244eb380b52fb1604748685b4c47ccb0c72379c04220382420699de00982937128da7152120037acbacc08b383014519c3820012c30cdc3e6c96d9ca29838882098716e207f7563a0fbc4c48401f513891d6b0600b19fcd2fd56fb6666655c8506345d0f44490005b5330f1411d8e6553c4a32b93a40f044b119a453810b5c0d03cb0004e0633720003d9d5bc4401d592976a000a0608802101652ddc913922855551a581c56cac2860e9042abbacc51008be5a2d241e1000011598041324af386c00079fdc3e6034041180638e4cb39926405b97e189e12288b4b12a4715b717e76690445bc5e1e4023912532b1e1000017220100bfad9994140410804000063090b868dc4340000200038526e03b06515f325515a424f1d48b5eeea4a24b777525126090b9bbd4199880b5fae0f0aa99fcfa3c479083493da8f0bfc45470a71c2f9af98000000000000000010a260352cd21714f5e3982660ecf3ffe27d1d355df40c772c7000000000000000004144493c40c12c0200037986b8b362e64126a50da16cb28ccf894b6455b9106afa9dbb612686b3d53bbdc75ee08cce8d4f107bd46ce104c10658c73aa541f8f89adacf8cbaa225a8894650226ea4013e9b410927c7f4f783404cbb2a01a7187bbb3d465ad4fb124b3516ab9e27f37d5f41410f8355262023908172c0424181f00800006d1020191b78c8001cd4859128528946dc32000cf7255e320010cd266a820012f32004546409464005e8842b8574283a567d7c9756194141700d81bc0dbd8e17738a11d0ed1c79409cb5c9cec8a7491400e522fa7d05078920539074e81e57dc0c01e1e9a6feea13e0801c5ee4a3f34e8420a8aa3c666a87453ac8408004673f290b0700d00002bd26da62007bec215c03b277cf76889f448cc544f0c74324456b6e7a5b88e203e4d97f5d860c7bd35d8270585070ab3833c2001b34394d9e800070d97be6780fa101852058b24a1820ae923470dbbf3244662f2f1c3060071b710c05d618fb98c09fadf5b5498207c0206c60a00013c26d8230d3119b586c344366d41b3690586802cda0166ce0b861c20118815dc92a2fe3102bc0699fb0aa28fac0b22462442c22810811800406b267d96211aaf8461496f46e0895f2b60105729bf947106012293e00cd70064f60335b01e40153ba190054ee7501b6ab172252e9f1823134a2872853031420c20c1cc28e71e909d3c7263fda85c83403d9ddb4293490305bf5c6026376c6c8037f1018c7146011a9ad00cd980790054ee8640153b9d406daac5c894ba7c608d8bd84d68b783903c872c01522873852851420c1300040002168)) <<< 16000) + 0x0e01d220493947c80f640113be10e1a255b854ae2e56d79b250434af13b8e440d740009ac80026613581d1b2888d58446c802000760364dfd3980724612e86616488a2c4b990512a197ae10c187ba8a072001ac6c9d804c183e010ebba0cc8ac81d4080c6ad9dbd72466ba40855d8b9fa052b10d53a911a5b5af47256182148c6a8c506182d5fa52f4056ac9d4780f800b4246244183381101bf5a668219f3d24e5d4a122b533f3861c4a80c34def37f7a6281557ccc8cd9ebc985832d77ec8b2daef35a60b393ba1a2a82679694d8c04058020003c026c4230d3119b086c344366c01b35f0586802cd78166ba0bb24a292b4afaa859f4a2138b6b40918a85ebe6fb8e41d68103f3a2409133deaca65315d40741bbb4e240600bebab7f8b3ab5d2e12610b9c020122aa8176734a2418d330ea8581021d85f4774dcd737ba87a0a270644781d1abfa3635211ffd7f2005a7c8793b385bd2ca1add251a88b20223ddd10220e3083208e09f0066b80327b019ad80f4a2c50aac050e67d74ed8a1619621d90a10e79cda2281075c35cc3023319f1e850415307a480138a0f8040d68066b203f289e418be9c2a5523ed82c500419f0250b1cc8cfe060649b29639e05abf577d30047803dd80004e383e01000015c20005f24d60746ae22356111aa808001e488006b7132d0dd8d90fd51010919e79e30211030d380e5c0202130ef4b60402ebb2f9840a00d40f74b30e010882e818140181fd673620087aa1eea4101404062b8dc63f64a01180800008349aa22cd4ca66a44b351099a804ec9a405230048c8430e3f8610386eb298c18fa58e862001cbc7c8004a183e010ebba0cc8ac81d4080c6ad9dbd72466ba4086187080462057724a8bf8c40af01ac3d8aacd8e052d9ae20ce05676559ac5969bd6e875814257499c6061ae0730e26cc1d00000000000000003d4246184183381081d70a838d3959fbdd15cf4dae33f9c1799ef053697dc3009f414190f697d758b128b8eecc5f18f47ba896fcd618821eef806e1c1d4178db59726e184cd74000bff9c8233fb5386dac5092c4429a78080014489a708cd34466981b34b0d9a506cd24166900b347059a302ec99b63528491b3edc36c18427f95fc49052d95d1d1c158328608c0366b3a6b2001f0b88e101409c9078021c8d18fb34b02f8207c8d18fb2cb02f8208112bb173f40a5621aa729a39b93510e657b0430793fd8158005e1177b094533885156b6828868a38a6003801008703617572a812a08adc84fe0a17ddd793acd411486e5d621af4fb08902cda186dfce48e4fb97b0b83c21ff21aa76383d3914433cb8a04e03345019a200cd0c076452374ca2582876cb078044203c010342019a080ec8667efade40a08401edcb040bbe4e59a06d560f440004264d00400128c0f80400004108540c800076c8002f513402119f8a8cf854000f3a4cf4e66783b33b1987080f992a8ad21278ea45af77525125bbba92893048259248c308306604700600400882790ed5c614fb91dcff34d52b5c2402a2e090971f0307a97bb068d226de64aa2b4849e3a916bddd494496eeea4a24c1209851438e28e21a19008409a0202858faba9cb2050cd8f9d4c03e5d6851f36f1a7b35a8b6d5b82469142c0d8c457cdc814649ce59a02056436ed2842eae2810182938dca30801ac0877184044cf76534027141f00819d00cce40667003c252b57a78123a909f01644559e9aa1c78b12f3dcb840872409808808c59bae11c00fb8fafc013880f8040cc80600003c258c3f66392302233035445928659ae78a047d3cf0915c460bc69c027a545331002ab448f200138c0f804000056899b8c8000c2880025e13362100e8a8abc54000dfe4cd4e66683b33319f325515a424f1d48b5eeea4a24b777525126091e9a22040000000d6d43dfae35daf81d22c930218220110138010002c390511af9eac75d3f68482d71d6cf2410f1c48f0dd2efb13a8cf15d70172e90d3a5470637d2c14428031a6c2c771e8a1afd9db7f885e70c3f32d9028484b85317197f3338d1a83e82e6e87144ad474a0280808ef9501a8386e17b1c09ad8757b1156eb82425c1a2149ae1613e0aad38212005a2541b73d362967dd34b8202068055f81153e8cd97902422000015e5919f4379fbf36e2c22a17cbf5bfe79a731b22544017292622485237db2ae275afea85fcfd6bcd0638590e87325515a424f1d48b5eeea4a24b777525126091e9a22040000000d6d43dfae35daf81d8528129b38902cce10810a0cd00800200403cbb001acf0429a8ecdc5bb6f3d321090f1d2dcbbb8d64368efc3fa53549f7229a659779b20e0f7e0eb18a2c094ba514fc620e5af76c98a44a0b260d1d382823894428561bbfeeb204fd20371332fc0c6aa34141436c080856d5822be590284c8038f6e901f688016cc0c8a998510023025c03d280bc90208a1a22ab4fa461649e835fcd084d380cac2004eeb48d00065182000800008490201999902e8702a3582850db53b33b0c14f4972aa9028c6bf6ec342498b24f0032880f8042880b56fcfa80c11bc0e28a1b9094e9e182b26f0a243420d189a367801a45add8202d77f8f2804e203e010000156242e1a3310d1980680000400058a400195c859128cbc9465c320009c324c832000dd120022ac4006ae099688ec6f72ce91d7cd7634a29e81231aa3f3822a41559217ac08081b7350c674d9d41b36a05807308a681c425bd5f36041c0187d738f6741f18150160a00a3d196adbdeb3f6738ec40157ec606f8f6a0909fe920207a8ab271853e)) <<< 16000) + 0x643ec8a2114016bb673bab2ac431c65341a6c7a63a3ec83a2288640cb0346561232a090001ef9196050016f59b7cae8ee8a146777aa21f29765de0bd41f3ae69ee62ff0ea4000000000000000010676559ac5969bd6e875814257499c6061ae0730e26cc1d00000000000000003da02d12122db02ea5432dc4f2706502746841542c61831420812c0510022fe2ef424d6baf49eff8adf5e55f66135f23b7ba1ef3b2870358b93673ded0741e9095dd317ffb8320193f93f4b5b1ba88e0e11c07ae8c7780766588d65395d011420790875d2a7a1efe3e1e80ee53d41496e0ff11cc497caa88d9b93e453a8ae36b702474e00bcae75ac725f123596b979ef0380e230060659203cb9eba29d7029754126c030a61878c2643280933388262e861ac8802200ed98bb82d3cf9ee82608dd19a7b60b922d83eafd6d9272874d46ad296713bf0811ba498882e0b4722e14a8d810d1f45f1a463012578902b6db52c98e20767c197081b2940d11940115bc5438401821524b08021312100043ca91eabaa2287917020d52463f7c18420008c608002025c03f28295cb19ca1eb18ad66c91872720b6ca08021281ecc009b4e8010001947080020000216789663128bc24689fe04ae2053ae3ac552410e4487a82c02aac6a6e000494808002000021a4000c50994908ca08464e2a0004a9204a2a00088f219a2ba17634f5aa43c2dd6e6e8ade0581424fb99bb4cb4309fe88bc1bfe0900533f449b640838ca1657eed60c057a0d21e5234bc3269d4cd530042ee278fb0723ee4f39357c0c803aeb6209f23e32d139fffe7844ae163661903e6bb7d4d41b4185a4cfeb9398df42b3e7b84dc830bc8bb45a5ec836621c3108604440464c02325010001fe902c0d992028c8c141300a32201000962932135190168017298874a6f850e91b4c5202043b0c2ca32010222bee8e1a43802b20e1a61c300ac2f386b3a2000dc8f83c0a080060fd38f528201f4348f69222a0a088350d617111debdbb34481d1d80a007063e3a31e1918e8c8c703400051a702966728cdc080a5fbbe9b7018211eb14fbc0c00959391d60281f4f8f919520a8aa811eb239fe4aa0d82e407dc02ae9b8ee46401d7a2035143e574260140000f790e94198da08c68f66326a3182998b84cc581462a02818050aa8fc6fc60a4ef946d8ccc5083eefc3254608042a8d0b07a2080068b12cac670701382c7144114500cc2669fbc2c5054505045f5d11fa36e008607cbc5b1aa7aeb8580589735603b486e08649517e0e0965184964103181120820980060200401bc5800563b7859719ae94ff1849918b2d4e61123544f8716412f843036082072ee0b710000016df62138411004000059c95686cc5026556133130598902cc440654e0381a4d694cd95c0e2c2d21f9ef681a506df98245812880000006dfc448800000eb467830c17c0480fd616086dfa9255b51011a0fd9dd660701ef88f9b7398ff2410ac0a1c5982bee1ac69617ec1af29c54a82e30a86942f00dff820180253354e6862c4d9d1c9400007d43664e084401000016526200b81c26eb5c29c4338b1377983c39d1a50484a1d75f50a200000013a6dc708412ed5d469124400000541389061878185d88bf08041818f54d500701550fa72f4722d92410b40c10340142a36138b3da152cc0e2a388afc5434a213746870d0c798cec68201015191abc981088020000270485c2400072e49f8464f81b30f0de9519eeb1d523891270525609a4fcb11f6ab891c1bfd93e9238a20a7e9aec3c1276e5e1ce020adae2a9900a00b981175e618028e3b7d6e00312284a028d291e5013be0d2626fcda9e89200658c1eb051424b047120c04769441928a04130a0b2901040ffc0e95450043f3712d00014738a4b9c00b228480180001dc200a2a0003f324c83a30e150005ec92a529f62d0c0e6240592a52900cb51278cdb7264297bd8c87aec6af9fb0c5753a60bfcbc0000000000000001e141669c0adb9a9d23913882a858c50c30a6003002842ba9c08977d674cd3377439758336fc2bbbda298813a49a47c9013fa1cb2604240d1d927aa340a7646c42e1f2f45c1206a986595f4000e8495004f0a35f59297e6050f9daaee50fb4a1a9edbe2321e8c28c653c3a7c01021f8989195786023194d2657005047f7de406f79405cfbeb004c641fa1020560588269e7288ef0dffb21e4a267ec8f74133cd7b3061609d234820000000000000000021b1cc10fe49aa4f43370aa1f6dd1d27c55ad29c9b7cb9f0000000000000000785c9f7e742aa0599630c29801000c00602cc34b26d56855ac2f4036338af85f3b5ec1face96ec947190ad0fb6d97f8f27c25599d62d37fbaa8cefa1b2e48910b2e69d90642d4731e91553141c46c16534bc6b4959b8c361122416800270930d15186088c2c446142230911184068c1c2460c12028050003d1929c1d94b80f0a08cdf7e18b1897b1fcee286fe26091e86104c27fdc43024a60e446070852a5d8822412ccf5e2b840003fa966d42307609cd637302200810d00f4a39efec85fc28ae1d2cd99383073b3aca7f7f2c73fb0442d951c64d669387403431d56b6c18c20317a824b94134119cbc307fa0c0a10c252f04468921850048c1e36dc5264b1d3ceaf9a4719ca6a3648d007cb5b22c9020b1c16a070149f12fb8400da77b01559c30800200002b64c14446081a3030d181068c043419a123000917f8480141400086a497c674374e854585848c4e15078238c2054ab9f93a602983c5409110084674e0a1260012b026d010e00430b7113)) <<< 16000) + 0x42080046c7e59028714e16122323981300c2c6172cc8541b1437066929ae30918a876ca2e2460637ac65ed922430b096e3643180b557a36d3b050444f756f80218036a136ea8910003401aae42032082429024014028bfc1400a0a00024a25fc6302c0d80023b10051d80056f90ec3187490c39c461ca03c2be1bd11a1049254c782f4e2860b8609d488c2905e815f20c0cc26ab3c70202ca536bfcb280025a8b7c7a81fbb67ef0a8e204a0288269e7288ef0dffb21e4a267ec8f74133cd7b3061609d2348200000000000000000219727df9d0aa816438e30a2042026004003008d9c3b57aff8525db8d170891ac94675796d8e88e8b3a88ff1f5293311a384a5e2785622ebd440c8b710ad24280018492fd1517e088bec445f4222f91117c048144265ee0b2f60517a828bd0145e60a2f20102800f4a04a29f950a29be1050e8307515a83c88b1e615c45fa14511db5e138d10203ad5842022a5d3bc7c2003b4441b75280c2200860e4c80d26258f1c0e8c3c38d19d50700282dd3ece98681771c3b4c48070c488bc3806b9a0e868ce184001000015b25e2222f00d177868bb8345da1a2ec0516b82cb58165d60a2ea05014028ba4145d002b1f4cfcf0ca9450e34473a55251c50d54121a229a20b4169edc50d04a208c64504402180e4085863400efca11adb12005daa1cefc4544014d47513040083f908052040d2d3e8ce60b179d9e77183ac1009c61c59659a41841219800e02200382401006e90328c83ad33308855e89420b10382f461788d86100d9ed98228700322256940628008275ddb2510005bedda91ed44020aa27fb304e4392148100000754973948b98945ca422e4211718486c0140006de40016888d810c0027c084508ec94bd0b9f9a5c48b4431edfb9f0814710d935d8d162017fc503f2c1c42498a4a5f1a28617cbd3f49cc30c1307cff3fa0c0a69e8c1b5824011b02f45aa40031720a0ac0b1a5a7d19cc162f3b3cee3075820130a3092c62862051851041c34000c10008036c85c174e071a286ef3406a504185192afd00b0204118ea003fe30030ffc473d82001fbbe6cead180069649398451105513fd9820c8720280200000e590280900017d10322d0189480c09405e4a2e2191708ccb806405a2a2df0116f008001820800b1a9003c5c25baa32dc35c0b9db21bc312200000bb804090a4ca5ff121e51f5ef36406ae9d3197840819be9204800cb154f6530a110042c94e3a0ef08a21ec337e041860b284c038a15c1b9c1e62845256882ac912a82115570401f8f2bdb119c30880218e6087f24d527a19b8550fb6e8e93e2ad694e4dbe5cf80000000000000003c12882871862852440c11f5052d69e81b6698475fc6754d0b60995b23a792e0ec75351841338272ab0ed3d61ac3eb30aa42d163f23cb6aa340296ce9abab44d60c961ea80018912db0900025592da0d96c82cb600764c92e1d7c654302410539d5d1ae685d1428c4a6ef31bd3c648ad0494d458aceb1426045ceefc36d34488a179e27c6feb40c10c4a63c615f3c680306b37a9aa6017a1201c40d8151854032cb2aaf54c02a37164aa4d38fdf1df016d8a1632fc6fd5caf5747acf21430aca33a067f3e385d1962a59cc1ff9c94f60e17942be95beb46a8fd502700200a05d16fc2c82509af207f0ff909c9681cecf64067c4d6a7084809c5931d9952f61640c1964b7638e08e54f7d1637ef956bde50c3d67d100142bad47ccb4202567f963390005318ca90340411004000065496a02800128c96b84cb581764bc353b9e8c5101c395506a90410e1ce9fcc50a00001d4c0122ae0a92a7c45090b425952e12213ae5d97588007eed519c451c6098051a5c21dc7a7061501927cc71839b3b554ec58f148d53ee98346164499058cae5c62ad92101c6e9756100221131f8a94061100431cc10fe49aa4f43370aa1f6dd1d27c55ad29c9b7cb9f000000000000000078261460e58e60c58c50a103bb2ee34970c1a0068000c99d2dec7710f530a8a0d31218c1d165a02c22c782603d244c19cc6f06112c667b3f2a849080318101108014416a1e9680822008639821fc93549e866e1543edba3a4f8ab5a53936f973e0000000000000000f04c28c1cb1cc18b18508903aa5edbce29d844d4d2da7f8d8f946a2bee119ccae684227879aeec93ef30fcda676f2ee112e3f500028b25aa0a00045025a81a0007c5200132840a0460021d84b4c7407e1b9cdcd358314e02684b949a4241089238c31018e19010e1080a0e58aa7b45c607001b39b9a6b0629c04d0972934848213b92e6d31d102ce6495b508c40b32c92882852452440806f5a74b743e5207f30abd40f729a03d0b570401cfaa900a5cb38b45b174c1102335a1dd72cae0ed51942e6229adeec1b24561c5689c71244894d12ed5e490070808ff455a7b090097faf4ab0cc00812844c3c358c0380105cab76b6f867104041781e000082881402a73734d60c53809a12e5269090427725cda63a20591649441439429229220401929874ddd220bfecc5aa5fd769ac46620b1a0cd9b89bdc31944ab43c8017b467c91578b332a8e508c954188d42441379de1de141182d5659a87080cfbdfa682530612808000053c80019d92d20d0003eb12d10d16806cb3c242ca022ce010004b490c335166988b30c45965a2ca2d071168b24545902a2c7151630a8b1434588022c30100111612c26d960a6cb012657e930ec3587498caf87657a3b2bc1d95d8ce04253e573bec951019f7a861144789eb651a333953c81445f44e7fea8222f2a5d7840)) <<< 16000) + 0x4256c2c90c184244db4f2005bba0caa8281d4bb39b05035a6a949d5293c165ce0080079e4d09d343fb9428651072ba728c4b7eceb4c120051050424d5dfad7072dd6553be25d98827cef77584e0b815d14cae4a6570522b7258d81283a48656c432b50d95a06cacc165640a2b10507100bc10de69b90c09dacf9f22041c00840000401056002000037255e039020c6a9c220834008800008020ab80400006e74aaa0ccb68b1414f4f481c5176b01d8808656e5be0c05dff63c425081e00800007b90001ac255a232ac0d95586caa8265520b2a80595380e0303cca80020d3a4c2c49020e80207280744861bdf1180553fbb384820700100000e8455c2642213e13fa62518820fefbb209040d8023ccd2238801a39a3a282cb140850178281c36689a09020740200001924728070040100440d0796b40530605e38cfd3820566ab6528200ad6a8b082ebd262a218018b6072226042000800009618841a47d938a14533e09e082fd933ca1a01f6950a214081e004000066927c0d00013310003ec24fc3327c15d8a16b15d0278205a2ad2660311ed51f28046284001021109c0c0c2a10420141d8e66810414191cf080d064033a048183c0101ca01c0265e40360209b919418101bd7ca360c00ec8da632001b39e90800351310960098407802000024c43845600047440146400065c42f88454c320008e6254a5ba1e2f2d7da4408ad6ac8682080605ea50c010fad17887005c5e71b8200dd8ac81810402c50400082a511152008a8c040002f64a88a65422b2a009c8ce0fcfb691dcb1492aaa66a258c2899deb3b5572019795db44fc41822a50a38d558b017a704df69608014bf8f7c36800ca48e30804a09f854dcdb2142344d9ea39c0081d11d10ac0b000049c4a7d2653c5b29d2994e10c0148423e3b29b0594d02ca64165300329701e06ab6a463901c4b428a26838785d2e2405c059fa012040f00430307b0cddc80f734917630206f0d2b0b083d6e9293412d5ff21425081e00800007b905a0594b00e06199d6c1e40697421ee8c08f7dee458415039bc5c2000d22bfcc08094e04640098307c02143acbb4540a104dd84c8605344c0cb0230c1d0080000511295050000fd92591992c0aca5056058232930d92b82ca4807c383b0b45a48e1bd31b29a20c651b0c489318b5361c0feef8e54980fe4bb34cc003c01091c7a237873440c300580912a3e94ea3812110f08e4001e00800006491570583282ca3c07226cf6f2d0480e60103b820395ceaa611840f0043ca4cc27e4c1a5401a8380df5ab6cd02a0d9139000680210000100400001112870100008591ca050000ef12561581f8ac09c565221b25505d1039b900f8e1446a8b9a1e1424126ad500453f7e1a048183e010a228f644764061301c503c29356a0f811860e804000028881008ca401723c61b27c6983fe987f69c0ca161f72801e4657f616055f7ff5400128c0f00400003fc83286ca3c1742a583407c4060e9caf28c1ddbd39ce7000069e999400b948ee410171dfae7804c203c010800008022250034709c94558d1730e2400cccf25f4600400100000a623600b28e01146808000488c8e64616de9a210c083f84882b411b88e121044a2a78222bad41880cc10248c580741cebc80138a0f00400005448708cca30263941200040d2000e4c4728a442442000c0d21a66b0d12dc0409e758344043ea5863040e3bb342d0403a2ba4212000f80409f806516030220193e80c9f0065140226c019448089a80651002a1176270c6b99a53db0cedc37eea1a46bafd6c9c6764336507e9a3cc2c8fee5f21fab4db377463b96c5dd061702f65c5008965ed905868a4d02d5092083bd3031d3dd462c172688dd820dcf5a82e29563e1a2a8ffe19806b0cd2c73dc17a472ff10cfaabc0b5afe6def5496a671c0bacb1388652fbf5843a6158bdbb525c3238808154eb3c9e1fc0e25cc6235372a976abe5f5eb802deebc045786925f23f42eb5d983c359d24425dd3f110012652e14b16904b7afaef16e759609305643a7130bbc61b72ef83f30076a0ec9e5c0b04421438c95312f13106a0462e087d62dd8efb111ae1c14c1f2842a428ec0a40d07ff8513e432d5d180355ab45b696ff99273389b918bb698c250f82900cd000a2999a2504169c9529cbe0f997f68620ea96c2698f155518e0b00820da720c15254ee071b7e45f2c014f45463b8cd84534362d283852a36d32b3769fd4e1c6ad5a9770369ee8a1a2def83df6aba0316a913e5f25f33c42f7c77d27bf137c4598e91b2f9e410cc2b871007c3502ca1c203cdb1903dfd843f32860cd58c392000f804226636076cce236113698501a442d4a200c0efb9dc8003a0100000c63a399d93e7248d568895c8e34f273a068803dbf13d1a00617f9624a083c0100000f53832162defe40b03e75c68c2cac68792400a04ac74048103c0100000cd250e020003bb207e2b2860d94282e7ddf455280db558a4fbbe8a9d01b6ab181111d104b116fe84d968bc53e738d4d8f1f042762d0c0e6240592a52900cc73043f926a93d0cdc2a87db74749f156b4a726df2e7c0000000000000001e29420c18819401b8422b98011320b8bb511cd82576038b5e61b682e59cd9b45b8f38fb3e677fcb4c7abfb3b0c0017786ca212d50b551c6aae5c238793198be0a6605e5e9fbf5609514168e8c7ee485f24212a4468002879000e412002a1e49409449e3224e1901608893404002e644a1067828c586d428a2c910a23814102ec488404147d8994412007aa49968128610004200002008)) <<< 16000) + 0x1ca011090080b0040000c24a0c461a6232820d86886ca04365000b0d00593f82c2601761850261c218615decf8040d1a2a9381002c3022bc8003c010c368d3f488160855e648b22004bf8a238a001f007a482012b70737ca00400100000fc24fc0b0220193e80c9f0064d80327b0193500e000020088901254d20802e885cc48006c0100000de7897ec64834071eeedfa1c4dd688763c0b6a80f124041c0080000619e3d20f3720c1da539628c065782c8046103801000009c20441b27a0593480c9e40786b3a8803f1c28353ab33c50823acb3ba6800093a5392400c754b0a800128e10804000043c8001df92501d13c088938444ee020006a124ec3209c151168889d43400129849d037542c1d5ced01600000009735603b486e08649517e0e11411210e09a00c0080123b1c867ecbae0422bd2b75614489ec7e3ee9874788ce41e62b63dc220015a34ebeab479bd46966ac78d4285273210718e89c8444481a1b00900016319124f74609ba041863a42d7998afa9e0d29410964bb0afa1fe3ebc315f8cddd06133d1946e386304869e249ca0e3842f2c026fd1c5a39c60db914edf9c747653301ebc0c7e521ed43c4ab0f7947b0974a3a6ed4745d7ff9baad523380d630602a04c2755c3abbb8bf7edc2f845f16fec50ee4e733e58f5d1ff425fea55697493a4abb5433263929e822177fd95a8cd3eec88cec9c0bb63952eb1ac0904f502aaac1e46d6143e34e12c455e3b4f427e85222c226b6ce882fad5984615808826c8f2a9ce155f7e24c3a5a6c81074574e69b71024555cbc6c5a6b242b0140c4eb4c85854404e21b2700593782c9b8164da0b80c24a7cee9ce50ea1b43085f5ff214536b176041a92b7c9090018b990b392152110a80813dac24c8c5d75ba36a207111fff691e40bd8eb4be8c1adb9fea300767e46b7b96044900cb3ae7b3d76ca0798a2601225248c1d19cb7a41b94aadf5bd5b7837931870b5591d4029ff809591e895cb10ddc27db4f62dcbbc7f14415ad83c486c7080a020b24f7e36f2ebafe3f894fd5a1754915f652ddf07fab9adf077d06578a3986c62a1aa9b9d51e01a031aa7287102383963388eeab444a8a11dc4ac05777a1f0f28d801efeccc9464a1c788b2436cdb9d12202640815080a53b928a8046283e01026c0193580c9a80700c0100401106c9a4064d003d1813b9c68448c036bb7011869cd3f8cf1200a90a1a94002418210080000709267190000b9100027824cc42265151320a800257893184ef745969472e861f4809e0714658b043810afd7078554cfe7d1e23c841a49ed4785fe22a38538e17cd7cc00000000000000000856b0a5f228b5a9ff58c3afad8321fd8245dd81159b4bfe80000000000000001ee1177b094533885156b682885043026803002000fda5d778aaeab3929be3563ef279a32bdd13f0aeccbbd4a08341ca0da4ed71d4d0aa173a516ca37cb937c71b3dabd9140244db5ff465e7a05c4320169712550d17b534c92078acaf5816d0193e23da791173374500e5d44510b849baa62e6acd206050d800881404000cf24810844063a202191008a86581400301e4989664c27b2603992f98c100364bc1be266c94f7a96103c81ef00610217a72c9808b502aa78e0c872d1dca40207564152000804ae149800a9c60ee000503040010abac2a9c85783bf35488d2daeac8a3b420884f20814e10810c0c809000d000bc9d13646e1c3606817656cb6d404e4a2b07c5afac481062122f903fa4e708c820609a0523a15a0288f6bae7b80e1568a3ed685c408dbed9dfdd13032308336c7c9016121628ed5c3082e5247cafe01f42040a40b00003b447281400079e497467a506541c4fa8cdf902c72cab42dfeed902044378ed211fa0819356697d22d9f8a1333d296641990a60c1c9822e1d59a22012a67fac1d8a39c001cc8d400e3f201e848080c3405469410e49b3e70a352b3e5220623ce6406284bd39c9ec9831faebefa5003669d0f004c184001000012f38480683bef387240b8f2468868d0d78c710c1b15ab16100d16db70c25d8e3a16203decd60e427081f0080e5008970040002f84780544b61b25a0d0002ad12592592c10c0b0664ae13abac2a9c85783bf35488d2daeac8a3b420880f5c5601eae26456009d3fab06bd901e23871c41c33011c14802c002fa00c0d95c80a1f4f080667feb4d096fec5623da1eccf614a6f41392e5b1249f0cb38a480f76aeb0aa7215e0efcd52234b6bab228ed082213c820544438424420240034008e598c96da9c4f4823dda786e4ce5ee9941befa0880c5e112f9802518c9101cc0d0406a03001c1631286cc084ee27882397dc08c0826d07260810bff255027041f00848bb45771522412baec38b201bf179688fa93f4112c76d1a7438a1fae6e6154028bffe84880a4e9c8ca0007402122ce26d2f28905b12abd2c85e58add2238b0b0ff4b1d8a19d8e58b168c403143046ae115c00740100002804000b14d5d6154e42bc1df9aa44696d756451da1044281478c90a78a906486182380300190801006800092100056f23940a00075a24ac3303f198138cc95417c58019a4ef1236166cb89922960986028c18fcd610ca81329d0ec8a40035ae1c79e008f7ab200004e3040010e2c305d1b3cf1865ad027491800ef59a060c882d32c140a9aef8a08b00aafa7d7c0026182000800009a99906d88dcdf781850e571d67f152a701028f384038e633cbd04eb9ea0d0afe8408074c0c40f527d102dd53737d20f026090a736a0dbe59b8d604566e157cbc8017e848da05551)) <<< 16000) + 0x89b2c45d1713d7b704006a003c628e0c7fdf435104097888002da4fb5956c5b19ab3c3769537bfc0ae66f348e7fb0c3cb82c45d04de16e24c50ac2ae684743e58c38e429000045820ca23f20d4999a048161a6bbb5d1105c640b50e100aa2f56cf080ae9bb445081447a671000f6fb1884d00321ffc1c00a05080021e601cac42650f93f6b64a0302a5ba4a50d8c825720e116f509ac782043550d04c103c010b1650cfd16a458fca872e89081493861644b6200a32000f00422416178d685912437e241a183c8220870004c08a69002416c66a300f518085cc003c01000011e24a8020002183e361cf16a270a440ce4a8c1d5e1e4085821512847a001b2116183804a315630c0133f359804e183c01000014d200a230004d121c2331ca0512980c001ad880070511ca291091080062d88699ae87424bcd058b0a9a01e14418250b35e7505094a00580a401a28414a2cc059a3fb369081c5bcc84e1001cede1e120000a4101100a3200a9dd0c802a773a80db558b912974f8c1195d8b9fa2dfd09b2a2f14f9cc09b37a2040c5ec26b45bc1c81e439600a99c3a419c1881a001a0105f708f5f3f0bc7034f93ebfe0830fd4364c3b54b70d2dad8026b0337756a2ac9c85f3ace1b3427e0c8fd0a83bd630c6094f7200a9dd0c802a773a80db558b912974f8c11b17b09ad16f0720790e5802adb67730a7f20599c59232028c28c12801bf3a453eccac5e966f332a066d5c63ba6d3ceb0520220505b91235f4909573f0d7e23710c213041589424aa44c0a1d358cc7322300374e151c6dd61971850404c9eeaa5001f00811b80c948064a203aec5cfd16fe84d95178a7ce604d9bd102062f6135a2de0e40f21cb00549128a1c71870cb09500d00ce230d05329e9431ba966f5602112a9ab8c6248c31edbcc801883d7a3f400e190835d000254200074e78556546e189883de2feb87106dbe7e48a278bfdb112810c3136d25006478eb0450000c8afd80138a0f80400005608003f59aec5cfd16fe84d95178a7ce604d9bd102062f6135a2de0e40f21cb00549118d18a18308e000f1b270af0d0793fe46321bd3aba4b138a01d79d993c2c051d411a42df106726c4023b0141c80c7662c19ff28af4abc999b86ccaca6acce706a087a01448a5565051c861aa8001a89000ece24a03a24f151270a80b0341300224d01000885924c319258cc92807c5189215a65824da83fa8d0048297780e06f879cba04027b7a8d400128c0f8040924573283d6ce652250936e9f734a27814a52604291beb3430a66e78bc0802913a9d00098407c0210307262f1061229ac9ec34343bb852220835f3b090021066c0e12840e804266141d4c9540c0a7b4d747082a354088512f2107b2048103e0100000d2304bff14ea0d0cd1300a74022d6a42ac902ff96edb08003f21c3c25081e00807180800042c800183105c151240280011dce100a2da80e386030efa7c187201b51ac702079739e64024b3973b5280100042871890b1d0e0696438520c100d19d486012fae70790007802000019241681648e0a246014ca96ad41844aa7322ff287a0af9440230c1c008692068629ae70c056c751430cca9687a0209818d558c8840f2cdfe52801000409140648802819039a5e0c04be01b312041b00448c0bbeb25100807598ae0811d1744411820f0040000284800096900026f20006544730543f222028110002d212432584492c908862ce431660d92086f992a8ad21278ea45af77525125bbba9289304807ae2b00f571322b004e9fd5835ec80f430e1008c40aee49517f18815e034c7a302996ddf7c55abda80aa0e2a411411608e04eadf6a386c8f689e3c54356766e45f97e4e0c794d90047b53dc7033cd70638432952c63bd9400bed22889ecc76c4c468508cc2cee92e954604482afdc3561e11c4e1f90a08d41dfae5828a46c71380ee0e0e004c103a01000011b24801b0b20d8fd86c8fc3647c1223d0591e02f4917b97ac8618bada4081c40cc52d08f090f0a8f324219dafe0440a7064b9910013f62f467001e00869254ab19b8e30e63e0f828678540b42217d3bb5087841c1038694109fe3dd6204c0d24928a03c07fed14000f00400005c4d762e7e814ac4354e53473726a21ccaf60859fb0aa28fac0b238a4c3401381341280180f0b4e2d7f42b2cd6cdd2b9cf3079be007257929042ad81ccf2e08e02ad00020322d4130200591d82c168164740a2390191c00fcb866c53450cd3e66e9310245bf9c6003601089e0214c96796f358c1a8140be5f565012e3fd232000e004000030891b82c8d80646a0381803c15e030a2511d58963b9af2b3cb0850fcd9a40520e40f630112538ca9800f58c50c9c10740201c20bfec2ddc04de62e0fa911a5b5b5fa7db882163b8010903142cc28b1c808c04f0080030100200d000130313c2b3055cf2984042a4e280dcdc9131fa6e69e0705271ea6809430700200001e04000eb891a00aa75b77c799c4d769bd41e3cb2e251262a9301431c2e9054d812820e0042270b382598e248ee58ea98bc9f734f3852a44885ae0070d1d910002158a447801c87da920043a078894020e80400005b0c0d11efa0d9243c2fb6492191bfd3ee70c3de7d60484bed46c026003d9b60c26081d00800008e1233018aa80b8d634597e12106171a3c8822018c6b840a4bdb26e1002276087004a203c01081a44f6dc93050c422bf2821134c0245114dac85ea8741e4acd480019d89393020e8042069192273c80a583fcb918286eff0642883568450aa18288297a506a0deafe940)) <<< 16000) + 0x418061824e083c01000014a3242770ebc448f362342916236253e0498605d7d668818560a60e182197ba3c1202442356010075d16cd850103c0100001753c58a71bfbf5c85f6ec2a4a112a949faca0cc96abee28005a7c8c00250c1f00800007f10005282000c7a40028b080000ebb173f40a5621aa7d24065a37e959151042cfd855147d60591841639030e1881880840000000060800401a0002b24004580800b7f92312500e8c88c06446412001d063cc954569093c7522d7bba92892dddd494498247a68881000000035b50f7eb8d76be076187080462057724a8bf8c40af01a9d9566b165a6f5ba1d605095d26718186b81cc389b30740000000000000000f50c10905000b010002a8bc93cc75b09798bc3d7e20a3ccbbcff010b61947f89a0a4eccaef90198f59de70d4c76568c5bc208e29198df20dc49478016539ae7eef57fefb067735a4eaedbe0f1538ebfaad505a8bfaa30f6640bde3068a80739bcf765c3f0ef64babd3fc65634a55c38aa7fe2deeda3e54710e9c21b9031f2090c50924ba2bdfe6604b80e19731456365b3707dbe6080a4c6e0aefa240802ef2e07515d06b9413492dfe08b8c2cf952439be5846464e2045a3a4ae02435414e8b2c42d4c071049802b0dcc797fb6a765a7c4bfc10bed0d458035c8c545ab3eb16805e44bb873423a200071254dc00dab022f9965a9c225fb2114a5c8e9bc04f3349213170c9891e85d1cc954569093c7522d7bba92892dddd494498245762e7e814ac4354e53473726a21ccaf608720b92a71905c95358b1997ccc58ccbe82033863452c33c034008043fe28233085698fba63185e0cfcb02cbf653ed14b06c0060b97607f382a219568a17749bb0a4a347222436cbb2893d4823cc85350c186378c4bc5094fc65c8931361e3d9e3011ef9d2046183c01089a13ff47524546f85354902016ae099a081b07948b000c25d82a6000a7fad68801fc818d84e103c01089a13415209a541fa7bde11040f00400001e88000f09f2c037dc71d020a158f881008135fdcf910034156b080033d9b5170250820008094808570040002566639f45e9c963d7fc3ab9c37a1b6180202c881ca00120a0e004000033080026710b2190fc86800237c9189088c044001aa048bc543882a22e0d000a23109c1d1168c800f64c87196e841dd22849440381730aa25c694140ae4d307f26f0604ab2fbfeba82282513c28fe4852c0fb8ed5b19bc1004314f24aae800be9678fc9e102aa0fcc2fc20522107395890012fc1cb0b40f162d323639696104eb66ab0c10bb4c5741c0af4b8ddf9408e8a20cc0c09915815f0a0839de2d3000138e1000402702445a0a22c051158280006dc9151888a4b44505a22729113148894a400a222240d0d80680013a0911acc888f64427322009c8ba9ce849a1a4b46e4f09c3e579bc8d31821154806a6fa9fc5092d76dd2684bdffb230a7a5c752e0593951cffceb883e5907019f887c1af463fe289d7d55c6c3fde3a2ea5393599921bea580b96ac95693f49c6afd6f5472e388e1c2aa34b7deca6ca148806b4942e0585bd18aa36e78b54f48634b1aac8123feb8a914014e6604a65a7feb8461e043bb867fe7fd993e2e9c86178500a18131c7a33412e94db2c806b8381e42c07cd1744101024201e00858e56b4cbe09083327b878e01d7486ee080c35a677a80048383e010d2560b118070024fcddd200ac06d60811860e804280bd60ad982002f34cbc88107402043e0b90df875334606ab3ce50441036010000074200023240000784061fd4da40c17668b7880e70ab3007808851e3d0004b5c2678004a283c0100000fd243c2a000318200081c48747403a22219110002a0921c198e20af992a8ad21278ea45af77525125bbba92893048aec5cfd0295886a9ca68e6e4d443995ec10e1162c8e58f0176b0a5f228b5a9ff58c3afad8321fd8245dd81159b4bfe80000000000000001ea14212088096002a3e3c0a2bab03b8bc80d995cbcae2367e8bd462884dc1d85fa95680493c2a10cd6dfca77a2001030e63b07fefabef940f6025bd235d2941f172150a8ada0a9f7dc7009f905f1425c3dcd7eb1b1e0a004864406019109531afdf65f10ad3bbcca5d0e0ba427332e73d1beedab4752e43929436f325515a424f1d48b5eeea4a24b77752512609320b92a71905c95358b1997ccc58ccbe820c22c591cb1e02cca18a08508408f00c0100400a6f9254b9cdd0b033edfc530ad73cc6116aecdb7cc57fb495c7a879ff7760840565709ecd54bdb5e7a140c616e4d5e64aa2b4849e3a916bddd494496eeea4a24c126417254e320b92a6b16332f998b1997d040dbd1351d275718bd999d80ae1162c8e58f016858e5867806801008064b53f2202fe378b45aacb5d6649c40edbd978e61b25d56b9cea7c1feb753e9d5468f92b1c3a1795a6b1fe5af10e8e51cde28520d42e6c03004011522be1fe7ab80fd285ca088207402140c38ea1fc48376760ed480145755e11820e80420080200800002220001b840005bc90d80e0161e3e070210c1b00859358df974b0e3139aca607b22a4608c206c02184e373d9d3c39b6d4c4586183817c23081b00800004d100014f323b5054cd1a334597e0a217d8a39c12091967f09e04119aba004a20380100000f1200058a6408ef98f5a041b8dfcd0c12081f00450e756f548a50426f7cc001053e2e9a20482004a8f0e48084001089202425358a1db81e8499e180cb5bc0082af9e647c8000760de44a00825e42913020f804000049880010a10220d094848868240005d)) <<< 16000) + 0x2704031406d00e205170822c6105f7ad16c80033bd4c5f000b3d2f34c000128e10804000044080046810b2210e61087e4540019be48645400207c4005a1090c20c84077021c9a5c1d3cad054a680aaf23fb462820ea5d38f3c125f60f189b0ea35f4483001f6f6a8a2624f2f51937841378f00a245cee90f1ee5e2ac1420f46e71400f9ab7ddb096bd44bbd6a6ac42d0110008aa17dce9f47ef55b22f40a618c435b7d8577eb9f0af2c0ed2eb4732019e9afd8866dd7c6552047a3925008e632d353f9edc0af5adbfe65978a2ebba78207bbe12a43c2a0378a23992a8ad21278ea45af77525125bbba92893049905c9538c82e4a9ac58ccbe662c665f4104294094d9c4817144565247da05a0a19410e09400a008820811f90bd6c1c6fd53f21da5ee051b90d8ce73d3d66e86cddb3ac21ee6e28b08de02a634ee136791507af96a4f7994e304a4bcc954569093c7522d7bba92892dddd494498245762e7e814ac4354e53473726a21ccaf608720b92a71905c95358b1997ccc58ccbe8208528129b38902d0a18b0cc0060020040364957e837698796bea7818ffc8f22d3f49b94250748a28dcc46dcb9871c80962f27df6b720f7cec0b8ed532f7271dca5fe9ea2ac9835c3625d4a3b8d2bc351a9047cd18df828c470412fbb0d0023141d00870da32e92ccd6dd83d506ef5bb8f5cbed7631e62c09e93b8cc535f3abab213be829a366d0263a0182e98968b2ce0aea650697e96aacac514f75468961d8219b652a48a008a56f5accd30b6acc380ee69a2a06cf9a1f95c0d68effcba3b62de5822ee5d6a355cd220784ef162f6e4799bc06d28001104f66cdd52ebf0605e911d3f2005fd5fbcc4efec420bd8d3764240224241a42fa155efc436f114e2bb01f37b810a09e4e099fdd97b995b21ccfeb6b6369429b953615754423152642c0002f811b01589702f8623c7709f14107a06cb90418ef212440018c6080021c313dfe9cb258ada650149caa217f80d5619d75c42158c5008360e1422388245d828bc5f78459a84ee4b3be620c1091c1a00242ebeceec60639ae5cd74fec7748bf98a9cd0fe235603801561a2632b078c2d2c1be282b2a4862d6f981a3220cc8000510c3bb68f5786e3d27756dfbf90def488ebcc27311bedb8659b34628f64847095e96dda35bbcfe9c7a1062d897000090044a444000ac26c7448aa858d142f2d852103eeeff428202e47aff5000be4c82580494507802042e1a2160d10a868850040002a2400370c90992872894424320012392422320015da21c202001abd21c643b16448dc8a4a0409309fc06052eb2cb8c5042e574908009050800204201be64aa2b4849e3a916bddd494496eeea4a24c124e4ddd8d10918d294a39802ae9d6358d6080599629408c08a09000c00612c632fe4cc4f01d245a46f73b0ccf3229696024876263252c62a91960fe6147b1b8fab0c4a8ff4000ae89078c88386441a3220c191058c88286441232208151038480142440c121b00910284800135890214880c844043a201190cb0280105248160ec02e8c88083dc10ec598749cc39c861ca03c28187116955216171aec32f0800a121447d930681600864bf9fb9810049d3d69368d0801944946ff9786010c277b693aa2a194fb4600d108aa08053f69b6ec012ee96d8da7c4802011b877c2c034718c456fc9de3038c7cf1de5060c3c6422e741430be34641b0c00c3f20159a240ac25b0d3405020189532c51000afc81201505445430602218581002a76cd5c200aa1709806040012028090ff8487f8240ac131fd098fe02a4519c804eca2c54c07998ad158eefeff37378c4f2284c40a5118d518f0c8016dc4afcdcb6dd21ebfd0086bdfd7ab95e803d604215ab447622c38fea6129e3dba4e6cb28281ef15b87cb9d48c537e2ef6226581de4b02fedb2b396673adbef25c412afc68fb0bfd41ec8f144113e4d643e000695c01c589e8f7a1f5d4fc51bd094719fb5e88707ca96fc49b4192943824fe35ccecacf534de6dfb0d148070da5b22903a0d20e6b172245220f28be90658d3af68b0fbe3932c1609fd15d56081598263140004a383e01000010623f63302c11f1674645509612e3c7a6a6008c212dd96046954db00048283c010914812e300241ebddf01d3c3758921d258638d367f8b08475291380128a0f80400004088e60a87e8443f2221f80100012210d3298fb84f860122df6f75b0adaa2beedc2d4b55b4af1000d2c1b5d20101bdcb0465106801a0da2266797bdc0aa962cc669f343851160ad2f48f68138f0f431f32b38ffe005028f79118e1d6bb8ed5303954e681344bafd75507067dcfbcac41e8b95ac3802001a15e3592b1d05447a08b13b7c9284d90c2f4cb31c00f9ec25e5919f3bf60002f5022a9bf98c4c9489d959fba18a1c63546302bc8279e550c5c9cd1361c8c01e93f6e42a2f00de642f7821f9d96468b9719c401168fba18c22801073d8d703ec121d1090160482e8263ea021f40100033f91f3298f90ec7c4663a00389591fef0a0e2808074939a08191d3b73009bb056ec000048483e010e0cc37a47f401b2b416ac022101e008071868088051393a23b433834110d9150049e93a39400dd7561280024181e00800006b112a09d809ce3cc49e015a7736422081d008400a09746090820e804200802008000022200011460629e92520e0cd4bce007013e8ebc708c20740201c6020000b623e0231ef110f68087b8060004844001028c0100401036002f02e49c922380bcd70c708820740200000ee6000020080ec018e600879c)) <<< 16000) + 0x060000c247b4343d81a1eb0d0140687a8363d2020001c32112531e8258b392e40cec9342e6005477556000121c1e0044c287bf760e70067214cec0022181f00869a15338ee98aec936b628b3e6fdb24c1070011602d9e27291041b004000025180400802000008886500ecb407a985858616c65e0470c174388808101dfaa3f10087690940012880f80400004008f380c000a0480019011e6190f2888790443c6220280d0f10280010f08f08afc905248a8c926665f11c2c005e10cd89820f0022008020080000223004010040f00080000dc8ef868778343ba1a1dc050ed828768143b20a1d8050eb80c758043aa021d4010e98080009008df8a80037f88da18c38ca63a4521b0198d788e98c6548ee20e1c0ccaf3c76ae32a4a10212c335071d778b063d6d2da6ea8720709008d08a08a04904a0090004100038e17a429e3700a255cd6963f3d96994b1e92836b29957622b11fe6d61f9a081695e7e73c991eed8456dc03bf0e84847c170c9717c682dec3f3e69405024d5b4da32b84022140980f0c018008d8b0964e20811ac84edc40201230f2911914210e0f68033f401f485db860501ffe7382c0340e89480009a48e800e219fa7d242565d539a30ce63289f9819563c778c8f023834fae79c849fa0d48f5c54dcffd7f739eccefc4bbf85865cd852b11685689193d54ba496e438103af4b1ebb1100deefe58ff8ce4afccd666726073a0fe45fd83d7d3808addbdc8b42893ca0c63c8ac0948192eb6c36aa0f62000fe19ac59bf1e9d05ab1ad567013e357c8b6e9f5aef4b4d84e0fcb9ae6c63540d661423ee223f90d29c8914c632a4771070e066579e3b57195250810a248c592a4b02f82091f29068b400000000046481e98a30a1841028007000129965017245eb7e6792a64b9b0d9c09a60089c0f800df5862d033770f8b7614b1701ecb430cc728a1212f325515a424f1d48b5eeea4a24b777525126090298c6548ee20e1c0ccaf3c76ae32a4a102144918b2549605f04123e520d1680000000008ca0b34e056dcd4e91c89c41542085063c61c610326b8f5f76bbf25a0b9682b831b03b9c297720cb6e0352a27b7b5f2c65eb7fdc308983a562b9cf8dacd9f8d720ea8ef05690598259d1ae70d0cdd9116d70ea86811d3473c0639c0200001f325515a424f1d48b5eeea4a24b7775251260905ee8b2d28e5d0c3e9013c0e28cb1608702144918b2549605f04123e520d1680000000008c5bee3a4eca6215fa3ebcc1543c61c63044003003100b0f2aa8430e655f4410e5f39e0af2b547ca2fffc9ec7404c884fa8d41edcfc9e00a6237f073d1fb5dffa08c54eb2bca661cd430916ba195f43a106a6525c1c0a321879d000487239a3a1cc090e582c0026348e510e248c592a4b02f82091f29068b400000000046291c70420410290058028001c6e52b4c6db025c0c0673146009025d3eb0aeb31aa3432b4ce100508ae90eae5a4e2a30e60c62350002322001db8621c296d32a383005a661860614e7daf4f04389fb90048103e0100e0098e484e98c6548ee20e1c0ccaf3c76ae32a4a10217a68881000000035b50f7eb8d76be07512462c9525817c1048f948345a00000000023c22ef6128a6710a2ad6d050a0b34e056dcd4e91c89c415538d2814402804e41c02beb57eeacdfdbc7b0ca4a28a38f518854873f630cc7a27eec1fddbb32f947d28088d688da42835a3f6807ebd945af6bd23b9a9cc73a1ab4490b7019cd81a5382ecead0448106a0009b247205438e2a1c6150e2888710343861a1c20981102870404000d5a4700b437e2a001ac6237c921bd450de1e86ecf4374220220d00105391b9658dc22c6dd0636c138020080206d40700401004710e15ae72581fc11614440838010000073200016046a837a32c44055c91821eb1e4481ddb48e0008c407402000014846d036366131b2098d88486c01635e0b1ae0570e0d90f5938a1c0d108dc890183fac7c0a402145ca6aae5040002417590020c7e3db41a004530ec264009c608c021e220ac7ed8d125b714dc48107401035a031ac017894511df6280bdf4a468120c1d00400003c11ab11e003c9d7df0a02b772b8f80110a0f80400002048000f111aa1d8d48af08102798d2704928c59a8d094d4d1879611d66bd7d28190113ac800128c0f80406a05740b22d1bc54009ce7ba1e580575772549018f35bae080120e0f804000036c8708080008908d392869844000c0c4694c4348621a3310d1168684b43405a19f250cf108674643382b19b150cd088664443301a1970d0cb0280027688024c99004c6f211443a182b423fd778e340de6630c818318ed0605281844ebfaf81c0a01e36f63d518e0191abfcafc14047486b0366200618f1007e51402b48804e40aa0008df8fa55e8a90904e038195258ca10c64c861183a1921d8c88ec3d8743202b02d150c782c638160440b18d01827808630040006d64014a6880b6259e9f6b658455f39e4e9902c7300da3718c635563eeaeb00000000000000003d325a6ed5b91551cd48c6b953d28ac80963d10501563e7da58000000000000000000000000000000000000000000000000184840c304600500201056780dd3ee542d37b20f62d7068b6fa9214dbffb7c4d06ee7ae88637c5778ea91cdcee9751d2bd539a43696454043c26ba1a22f0934cebb7a0179b08b3679a9816c3f95f5d3d2c9d70a307cf64165692d15dc259b37f1c0da10400ef914f5a1b62176531b59dec8f911c47b90f55a30110397b3766fed2fe01e050bcf331d056ea0856d544e28c5a28)) <<< 16000) + 0x6289431242188210c39086187430a22184010c1808001ee880bc6b901dae4357585534880802b97fd18b461f6b762010b6d9dcc29fc81733d947667c3d01c94ec6a0ac4f035babeeb7cb35494a76acc23d92e87784684883882062022801baf38b284aa04ae2a7969bff2c17a1299aec2fcd26fcfaa3c6bbc91c07d53844d90780b0741fb638c4da5a7eaa646883409b2a29a45e591309cecbe0712ef629fc480e2528cea040d0ce4cbec80723c654944065db46014204226d4a04009c50800200002be460866302231800d8bf80e056b38ed7c144b15099351029b2a40401802be05c6c0024142000848c72265e4e30b8116a28428687147846604f8d20250048184001017e05c8d3a39aea630b4318dbb6286e44f8a263841880ed943802248f760180c09ceada013081000400004c480011c117d19db76e583a3d7328ad6684055b6cee614fe40b2205144102141180080040d74a9079e58a3fa594256e40a92bf5c677a8c9b438a2b0836c6415dd2db246c72524f4285951965ff18569a3b14314396570da100944080021630bcc4ecf92367c56079142c2d327b88c2c87438f70a1ae64a8eb0e00161d569804c204001000013120004a245f02400085c45ec24058120007b622f45b1792580e8cc5e0462ee03c2c88656a4175dd2b235c58ec8803ee9a076c10e70ae8fa2ec8d7163b2200fba82091d104b1174b32cda8bc53e738e8046f0042440438428420240018092803414b249a0e8a5e336faca941f43e9e899258211458d03418b84020824cd88a934e44d6e0cf8e0e170b6afcaaf74bb5c0edd385a2be72ecb441ae351f8e1f77bb86acd678e17ceaf50c62380672cfc8063cda2fe8768280012b88bb20c5d4e604c63174318b988c5c8462e223028050b802ffb0b7705bfa1365d21991777389556ba0848e88258948f5368f07812b70ac8597b78215b76e583a3d7328ad6684054ca1071080070060050114c489a01b8631e44f65328209b840c8f0cf33c37ddd0a57d80094418a42ead54180db78f8de069dd8254e21857ada8b681c8cb31fcd65b15be1645dfd796d15f0e1d942c34f8151300a2ba1da60f7524059d1630d3ae26aec0000000015b9071083f13c0d6eafbadf2cd52529dab308f64ba1de11c9bc7be2c6b9302c0b8f63c949c2400000000000000038b2fd005b026b5877076267c46e2277a108458110a8982dd188000000000000000041852b5cf24fcd43e21a96410192112012e782aaa61fdaea20d15eddd25f112460b405528a9ae7d32bc009469564740c6397a96d4cb356e76c12db89fdf33b6fc8106e52d0063967fd33a359b185b68781b81291e3ca0b0304cbaaf3d7fb4432c958008742fb291bd09dfa420b1dc253e61f78a48e8d50668185bc404c41370163ddfdf93d9819b30da8b901cbe63bf41c12891a8bd921096263828004c304001000013535d8b9fa291ea6d1e0f0256e14cf40f94042b880190e29021610e11a09008a01014c4d646d159f1e952f4713f4005f2e6c6b419f5a48776e38cc2550001d932374f5f9dc940f0f5d8da900913cb1318a0adc4572f8c0106979070202ed8239b80130a1000400a0042de02147018000b9116e218b68ec54c562a423071118b606c014371e58b34a913cddd5217f815aeed695d38a02e2781add5f75be59aa4a53b56611ec9743bc2332c82011010c1340240103dfc7e875b518bede8d209b95e024465d805f824e233556c09ab6d4a83a05d72f79d620921dae12135dfb9dd1cef2bbc8d343156aaf9fc656d67acd1cf93eb705018c2a563b062cad7e1da31e1daf428a838727159752c4ca021ebc3765b76a0adeb0d00ede5944b575082b4dfc33b12ed420550522235fc0e6bb1d156f2d2b3101d99cbc2eb410f02ddf7a1c0a2e386eaca6f7de083e501e3306c7ecfabe5f8c325b0e79521d3d5f555fcd5ad2ab6dceba7e3405caf583494571f44149b90fbb8fe62db5dcbf51a378b3c60bd00166f5b6e2af42d4889eeb4f312a9326224482002f0589500f8b463259a61849c1a095444030ca1478300037eca630240c200087162b2cf90670c7decc89c88ac4b5e5a83093fb9200e300299ba03004a18400100001033a55eef4ceb404658e3884389a282fdec50f6fc16249601135bfb40094407c02000020043845600064a45ac260012ac40b025c34a25cac74456aca05ea807738f4114c0c47685fc0a01e62714725041f0087162214ef401e73082d129e94ad4a0304df4db2a1bc2088a04906ce948800000e27a840400650037f2dcd9c04bb8e522c4589c40e085a0780001bf36381bd545d8d151763885c8049f633e103c2381c7be59610696d9920107735124a42807ca4e81405318f77d6e104201000018122ae1312a05e091a2338061d7be6cf9635cb2d302bb3a1916c0c207afbe5d2d94940a84b72f59f4e04488ab2a49ec1049b11e172edd9641192f2d95c5005b56de85792703f9d7e339271002c3d8b8980a8595a12fdd9f781698d1bfca54ff7caeecb5cf60b13835078b30c2c9ac28c221800035b22d4331691982d0ce0516e2e0c4e105f11f3a2c01eeb1e4050331acbb80024141e0086104b9dda54a344064d3c2ac8f818a2855e56d5946830e406e2356a708800000e27a8404004d18d10d4e29c04e3bf9ee1c40009c40e285a0780001c73840a376ba64453416f7d428b21d08cb8b0015600830a022c18bbf0025141f0086103ad0ca293eee113f0cb938c4068e1a8ea5958ab7b2737cc510a297c74cc81c24790867aea77c604ab553a7df6b8d9da0ed1ce4880)) <<< 16000) + 0x55aba6dc35c1843abd0772a3807bc56be6dfc76d0ce125d140016e8008d2e4b16c71851743f00005bc4000fec89502e8bdb0e08418268b81391601da95648503f13f16212040e8043a2c61a75c4d5d8000000002b720e2107c4c2101851430cc09101000e0030100200d00010e30131f407972c4219fe3487136d3958e10448428fd8d0e5e9d16c2c0a504ea1c50159415120670c1e0080000a710e1118b408c0bc34270020003ae20015524004c4c84494c59c9603a431660dc054ab8201e91716ebc0332ec235f05d9477461f819f1371f896c1187c3d80c1fdd2cb910cd6629c589e114ed17d400c3fad343f2cb95d3c0f5e6df4a81205596a14e94f80ad19ab2659f759fc1a793e965a3fc6fdfe6fa67c26e240200476b82a48a966bbeba6a65b96a74ba2751b2252ef7f2d6d44c20a88520281d15f5dc6f6004014a0d6fc95a93faeaaf9faa68905a96fde71544cb6e13fdbcd5ab64ffd724268827551332967e63c17913e2b8e9337f0ff6bcd116a9f922f70e8410b3ee3fbd9c27ff93f1e77a937a7c4a89ef8a4542cc808fbd14e9e51c3f301881d910df82cdf4e3cc7fef28d168ba21042ce9330612a1b51a60a181211f578c307d1112a2430612840e4846d5da5909043eff01e18061d0f9600009c607c02005e031460189500c55807e6597d1d464931df7c8118336dfe1f460a74e4bf91801873a87c04a183c0101650540c1ba50689204139170f2008747fc45480c15cc1e23017ef5b31c094307c021334d2963ea40d2cb1e3ed304b887de2401116abfb8d0257eeff530077df2ba426081e0080b20080004dc800128113c098aa8485100703610276473478a5a3a28d19f27ffdd38209e401d080807f44220250c1e0080b1828588162c20a89c35eb0e98034e1b718b1389c30a25c4db29198fde562cfca02182eab38664da628e1294a6023a77ff9cf035ba7fe7f34381914efc1b6cb30244397a20a017f9fb88df2a032c8753bc0022d479977a9f1cd43f9d41055df1857cc37e614560e444e3f88fa4289a4cae3afd4043eec7a71a0648d480b0240c1f0080b002857c040001fc4001078f1403416ff7ca4a38d23584ada02c1320d7edd320bcf642174bec9c78b810192905a1ea378f07d312c523ba204c176c183b2363b7ae24bcad820800900edb9e747b0c381350a55f611300602ff8338f8bfe78f99573df176480124c968d243293574d63b824ee60c84a088ece390a811660f8206506b3687922071e7238d81851ac4d1ab987099ed37cc1540a6cde9dd6d6ece82103765dc62dfd09b2d178a7ce72e9afcca085386dd44add3afbacced30153a2c61a75c4d5d8000000002b720e2107d1334e2880d304d0030a3a6a36c994df83a6f670e0451940f16dc14ddb6355406333c867420d6c26c12d146d95aa038505c929f4d6f9a3af8580b4acaf900af2b6be9eb8daa29f670500044522bc0200088b2001c306056a040780695e37f63b96398d51b6c5072743a3d0a1b6ab47e06802e0fcec013060f0040574142520a15c050ad808568042b2020001a2200275040055c4c8a1bc56f067b1433da9389ca81814552ac0e83880832d137bfc0600295108ea8c2c0e00c9bb5df1201bef9256e04500dabde4088d01489ca0a40b1e3bd7510b5dd0cccb32305bb550443138ef3c49570edd27e9f13105540f749e53f7045376c575796073088913d6c2a52d375331f5c0309706227020b1e6a98c65cb33cc588ac93df4d5921ba1a70225814bba39eb43a742b42db3e8d52cc48ad94bb00cc1d1cfbffbaeb140831657965d8290f02691557d5611da1d51fa1156826573ea61b4b8b8a0f193b40f57697b4c5ab6046502cfad2f79b1e3563563499c355515c11d1bcaab81e8e156e5de381a0e722c263cb4bb111078126edc56f7ca2abe8f998b06c4b9eb22433367462274a474c18b31f0e42bc8976ff65b890cc44caa4e50249e2e05da034f9c2dc8ceaa7ed2c588bde11ed89d7aa76bf48907aedb2472c5ef230da16145c400d750bf01f1b15bb11a96b3ebc78049818fd9e60941cb1d68000000000000000000000000000000000000000000000005e22c71c53842844003c0247ebe6d1b4c390bff189da5dec5b203e3b6f5d0b22e9e3c68cd2c048a1ba50fcc8fbee57e6de55e66fe68ad71c3ac3b8cb204df9d83378c2a0007544384442b0131570909500c55807a4b542affcc158781f1e66781f29a989071aec3e2d91a4382886a0ae7e97f9359393736eb3238f6141433cfeddc3068f8c180aa80f2554e958e1e7e6f78149d95cfecfc9795896fa3609bca350e6b6df5471638d2ca39af524725a6289c65036c98ffed498a785da294244588f12bebad6c90b4fda0d153047c4f60a3a6d3813162f010205ee295b7940d2027831b5a968db3c9bb67afb4b1cbc49c27e90bffe3d929ff1676d9fd07aeca37073de69d135941d40d4c75b8f4d604f77b0fa88875231a06912f03dfde82510e7e1acfb51f8a4df90160e72ae1e42c263b9082dcc358d471a4aef07efe46b2c2de1d016ea4a60c5e8316fd523b81bdce7f8cc81e290a864879aab85444318a51ca686098eeb19f7e75f0c83b003590e1c0260c5dc11b777b1205d33ba901d0be2820c9f8dd9b2a3603e281b7326507f5078e19e349f22355fa152cd7c989e549831884500006c044f0162aa0ac2080de69ab40818c2d9c51d7111169f71c9878e13a7887a7eb0c008e14789b488006a02022bc41012e4adbbe4000113271deaab8a718280280000e49e8b1869d713576000000000adc838841f9378f)) <<< 16000) + 0x7c58d726058171ec792938480000000000000007165fa00b604d6b0ec9028b1cd0c504d003346cb61949179cc71a8588b1bcb47e6f69de25b7664085c19cc58133cdddaeb37192ab27b5ff74d31eec695e8f0be7653ebf42de43882dd0bb546fdb37e7bec5adc915f853b83029e96404ccca39a45bd000444205e1a0011192003b68401466003f7c42d06405022003d1f200b9e0401a54c8921ec088c60422302811d0c046d607048881c82ed0389f885086c2882dd8515c50362bd1370401d588d49038091b6ba503013ef3f190a0aaa050159129471d8c72c01424100042c611122455a92345cb6d2e44c0dfc7877bd0502a3d28c3c0181a5440d1650809d7307cd107000b9eedfc80265421cf2010ccb60d3d404f861a4680d9cb0940612327d4121d30c0c1ae170fd038636701c0fc1030db96799e140bdfc7cb7ac5065bf51b09a2022598167d00c155303e16d0c00e621633d040405ec8edd00124941280c055044000458454c662a42b151158a808c53c47c4000b40f52c592f2986830a0a4edb88e0a13429961000a36903608011b20d4604c183e01091008e8b1869d713576000000000adc838841f23883433820822413402c002e180200d000118229c1be2042ab41c8e082811bd00e06644d0780b058b23ae6c80043b4a9e8025102000859402dce27e7d3caa9cb30c35d7c8e4f50647c4d871000005ce236d2f5a917b935223658646ba2cae458a5e01276daf81bf0bfae9699647a732e6c3b564686b5126665cf8705b72894c7a4ab8fdd441601d2681bc403fb23c028c46379d34744b2d090e44a0ee0049ca76d5bded22b8008f084a56d9c4e99bc3410053615a39463d11f32c9c5af182092884c0f400011b48002c690b4198a68ac5305603a2b14b0581402c528162920b148018a380bc953085d8e6121e6a3670f18ccd844398315205af6102a4c027ce78020fc5440098307c02028c0312a018a280e25cddcf19e890f8a348f9c420b90d62588ea1b6ab0c2163306d2304426f1bf84c103c01014401c4c820cd4f4f304ed229b4896b62d1dcf2604985793057f0a4da4709c2fcd6710102e685449c10780212313f13edd44c4b38e1b0f2669cbfb43059e1a0e2c70af2a7a254808d497a1820183bc22227041e0080000a51143050001621abac2a9a4404015cbfe8c5a30fb5bb1008708b16472c780b6db3b9853f902e2781add5f75be59aa4a53b56611ec9743bc23440a3472831430c221c583bd7846f138dbb2ab0e1b373494f245443f65025c59b8333e0778c6b80beb2c03b1b16b0847649c8f0f65afaa88611574000d888a10a8001ea088d80e80db558cef57fe85459f855e8467a217821b46a79678dd696bdb4f492491e995e065881bcb64598a680000000000000000f97f934ad9bfc9a56d09278472e493c2396c22340a207143282141400c1ab28e394d66b611cc2a35595fecfbbeea6fcc05680d643ccf24cbac8e925c6a663ccc43fcb235e2307d000e27b677de6e01453e1c183388993d063f95703c4118d56a3048ca014504062680313c01d1f938a614c816db67730a7f205c4f035babeeb7cb35494a76acc23d92e8778466716890588586304401157b047dbc913308bb591ab5d3bfa39582b4afe7e56473c1e0f4b4c6b9698320468a25c0b8974f14d2e0e2c094b5691c5060b814b2c427efb12a586cce70ef06045d90f24004c203e01000012c20007746860c10896aa881c458ffa2b0504fb2887f30900bafa725904182c7aacf6e8200446e5a44306812c66ffe098e015c6b1c846086440a130102258610bada21e61cc8e1385f625e087169870e3002244f88eba33d7ee2481623a691c3e5ffa94e70a12f4485600586d5bf2fbd4b167f8bc50c0ec37ea221745b900ae1a02f7fd447c34682f040146973021b69e2eeee90d9ad7de80a46d460bb31905c37502245c9e705afaa3c1f066a799c8121831b851025c0b8e53a0544b950e333f23ce8d222fc3880828fc9c530a640bc405dbcdeb90e9a0546fd054d12ce2cb10b0d108402bd29149b885c0606941c091e26d6856c88e602704c235bde7245178fc2bab2bba48610901da80014c900068a20010ca4010740022aa45008427e430051d02b0ec0b045ab987099ed37cc1516838252b34a2337821d0a04ce1a14099b3ffa9c0c8764fc60797f934ad9bfc9a56d09278472e493c2396c2289e06b757dd6f966a9294ed59847b25d0ef08d0f30c18719204c01d93b4ee0d3044ccc8f2c50ac53e07ce409575307b44dabbfda1c30492f9cfbb5699888e3120cf1e66f4998a00988422bcf65e305f33362e9780631e4fcbb16248e0bf50d143f2d122f1056f299660c0812ba00cd038773c70bec3804847b9412945ee782013f9d0ea009001026e89bdb0881feaf8108a8076e75ce45f10404470c2c03c0000f4113e11eae61c267b4df30545a0e094acd288cde086394e81512e5438ccfc8f3a3488bf0e20205fe4d2b66ff2695b4249e11cb924f08e5b088cc24a246112089082088c2d0a3d60d62f5c8c58b4c61d251115a60de58c7ea1b20996138ac10ff7d9b9498d03092c9fb06985afed842d89abd1630d3ae26aec0000000015b9071083e25123864841046829008805446d8b47586d0dce902c5fa0c6f6b7e9839507c7b882e883400068c800296113d1189a02c4f007ab987099ed37cc1516838252b34a23378218e53a0544b950e333f23ce8d222fc3880817f934ad9bfc9a56d09278472e493c2396c2289e06b757dd6f966a9294ed59847b25d0ef08d1018715004a0410228)) <<< 16000) + 0x104124144d46aed9a5e4864dbf91e131edadec0200b22047ae5a52f141084527fb63822afeadf197ddd958f872a6d6d387c8e0653098d40cf344ea58b31c8334e942450f8bd1630d3ae26aec0000000015b9071083e27084087062865029809019dd7ab14b2b227e19d1b9e76365cb079b060d29943842f887400068c89d84ebb173f4523d4da3c1e04adc299e81f280856ddb960e8f5cca2b59a10155c400e2781add5f75be59aa4a53b56611ec9743bc2342ca3851c52021413d5345cd34a6d75613c1e0bd720074956a24b26d354b255ccd2749d14dbee920d52c9bfe8eac657311b45b7ce7a0508c32a689904ba2c61a75c4d5d8000000002b720e2107c4c2c9146085094043053034937352892c3cfe8ce287c31ed4ef8d33aef3a047085d106f8c0023aaf903b3f3ad4a18ea83c7044862968b6e01bbecd4ea9da7a5bf59dcd1a4872604ccd6b7591b0bb8100a5cb364d178e9bd552f199c8d258576347df6a1ff6a03668d39c5330d230310a0a63e010ac037afee4cab81d5d17a6b1e8cc439d2ab41825937886f4a2f2a4b7ce771ece4628a78ffc39a2d895d3149ad364584523a3d8b73efddd807766b136a7b73020ffff71fe5e6a14c68b657268560684b3f5d811b14b11be974b1dd0f9732f84b7e3e7ef3a589e94314d84991b0a3df9023f0df0000c3c4001f608005b79d0d314f5a040f3161e083f66899484e53edba0344d14000000000000000000000000000000000000000000002c1d1630d3ae26aec0000000015b9071083f076267c46e2277a108458110a8982dd188000000000000000041852b5cf24fcd43e2199a18e18e12402205e384ee677d8ea51141d67380d7bb4856ec905e4c8d21fef9584167b79376893f63f67367c554780e883a3123d96dabbcfa03f2e9f265a0a29746fb84fb5a0d7c000d7249b02c24bc67c4075b399dbef939696758c8e67ce91899255878f354161d6cbab987099ed37cc1516838252b34a2337821bc5eebc5f0dcd3b73b604e50a8d3376100b89e06b757dd6f966a9294ed59847b25d0ef08d1230f15210f04502bd0420166b9703dd22396ef503c6eeaa2527c975d780df0a7ed95d9090b3a102beabfdde048f87fe326c17c952ec9e3dcaa09a25b5000399225e0a12e0103580800293889d0c84b4342720a001cb5227033b2887ac1460e2902a540b4c418d818b09831ef62040a007389e3e0801776a5490c023e410d820138c0f8042429d4ed8b2f4b104e06ad8c85066d6fe07053c200000ff1b1411788e450953041866145b68024bb2b3ea0480ccca58873002f2f39c2902140c1280e0000780d01b6ab19deaffd0a8b3f0abd08cf442f043fa89af1d4acfc5f6614d858d62978091b5c1ad1270f340000000000000001e2ff2695b37f934ada124f08e5c9278472d8446588986186504680181447a9e328f9e9639179d6773064882f1d7e541e1e914f96a69a20f3ab43b005341ccdee25ee0217b890540b7964be90953ea51c07b0c9661979b0a781a96c413765a8df98a0e7c9e5ed4d43c20ac69749d50a08d39b78613c20134a417882912031b3f203d780400c02ff844d0324baf33b482846bf9cfb80a107142a0300001019137190003441a1c00005a9768264a19bb2fd8c498cedbaa2aea798286b2cc5fdf8a09c981981740a2002181947941f41800a80b1326a80ff43540a25208af9404c0740b7d3043ee15a8240020008000069199a3415401d223ad11331a61a206776a4c1edc57cf23803efaa1325001f008098808000438d0e28423dd1b109828f152b0059fc909421029988049811744d7439fa440053c3f32f204e205002d03c50e910a8cf9825ccb4bf890ba407af6a03564cb26a000e8020000314ccd0c9d0d38696313a5791222014572124165f0ac181c0162113e32800f80404c40400021c4000d5489b0684bc240d60a13505097028001d7889a04e8fc9c530a640b5fe4d2b66ff2695b4249e11cb924f08e5b08a2781add5f75be59aa4a53b56611ec9743bc2334051c52c42824c11002d442661e7768a32738be1ebcf0cf15f7e97871e0d96e78b7d833a09e6fe58d03ad2bc42a35de7ad335481832d89aa2661ab104d5994bba814328b4899a1d0f0825c909c03528223e1cb90fe88083177c64f7d28128d938f40212026e2b283db00f06b2e4e920448535c5ce08287102a0300001009db67730a7f205c4f035babeeb7cb35494a76acc23d92e877846481a70a38a988282500599f0ec28738099b5246774b721a2ec05a488c6f8f7270db0b1cfce4d3dd4c4bbfeab91415fe02005e03043b8b944c82582c1e068876c3121b39908537aa9e1055baa34bdc0c1149fc83f0c2260aaded179dc2060805dfe9e44da601e671faa1ca2200c90b9f44d40e2eaf8b5f445df10105807089e06b757dd6f966a9294ed59847b25d0ef08c533932541d41490d304304e021176ebd23b8a0cd50540cd0328ab6fb3b07a8143cc346021984aa00039e400101c80e82c001b48d0e48988b76a489226145f094084af361da1611040efa4c4c063f3400788800ab8d35a28c0046028a1cdeb5db98912bb05c38a814542cf2a501422858f12000f8040000338ccd62adc80531bc21f388203cdfd13b9305b7d72391c0149a7f265001e00809880800042480e80a870d5e325321f4aa2520cf9d9dc6f59517100956ebeffd9432e7be7cc79b0029d5f6518ad9d8476049210d5e168a1ad2881b5246e4f908f670f0a285b59a0a747343da811f7ff08a1eba5e2f81b551aeba59208f246a3a9bdd34d9914c139d6)) <<< 16000) + 0xf3c8add6d6d368c15f11c8b8bedf25083c5ccb873b3628697e7001a606587b387487c315147f9572a74fe58447dbce180e325a645bfc0fabc86ef505b7beabaae8d6c8db05e75fb5262927aa200e9215007bcc43a1734d356ed06c3bf06efd6e25d337d9f9051c66934ea5ad32b5aaf967857a464ff9b454dd90e746d0ddb335b9545a1799305b542c7b53c856c768f2029e23c30f62ab363814b66b8833815d0ed307ba9202e2781add5f75be59aa4a53b56611ec9743bc23350e5075064c63c6443895e4ca620fe6de4dbb19bc5874f37a6fdbbdeed161847948f6bab6e43c56c50035b02488f54000a90d4f7955963b2634c219e7805b41453d5be6629028379553ba3be5016960b044af5008c83ae23974800860651e50fa1c00a00a153f947140550f24689baca0ef04ba835429ff97df9407e0750799400780200001e868774c63a7e485057c3aea80d21e6912580949df2bc8003c0101300100006f900039f2001c2a44bc3425c0a0011bb21303a12d0d0960280079508017fa912b29e9441483c3481cbbab7da10182988e252823bc7742a803f283b320701cdf9e598400c7ee8330027141f00803f02e0515cd1e3e201895433a114112086cdf200fdf156ec8e081f7f40d020c53d20c916006f1d6e88804e3040010000162225413d29697ec9f4070c7818f881da5c6bc74031fbb323ca0a2a247cc1c0d3263cfc200694fd19009c40780200fc0ba036d5633bd5ffa15167e157a119e885e087144004c405dbcdeb90e9a0546fd0557f934ad9bfc9a56d09278472e493c2396c22440a2072821412c0fda7f6f3fb67ea15653906cf8ed0ca553b6e8e7dc2e25484980a582e05e16faefbc05dd46a4e54797d045bf38f04aaaa218857d1290d0001c4902f0d0940280014c880212849c9424c3a11b010004501006211216842007d5a2010cc04022cb088d268070f403232008d6b207ebb12509dfd203b22ec97607800000000cd1e9528407458c34eb89abb00000000056e41c420f91629429028c18208c0051acb632bf3a22f4222e04eebd71c3fa37cf0003076e0a41578223c468bc9b91b22b8c511c3a5d5cc384cf69be60a8b41c12959a5119bc10c87ba018549816bfc9a56cdfe4d2b68493c2397249e11cb61119a38619208e094010003ad13d3356034665dee564c9a08f7ca3047a10cad9b98f09262eb5dc050a27835f097f32907ccc0a81320f4c39684e5d1e1b79ef5143a9a5e37720513edfaf840857700b7070591d9f09820128e0f8040000418d20a9075a10b7b68600000000222fc3880427458c34eb89abb00000000056e41c420f91630e20e18411801200201060e3e4b801befe50a77848de1bd2f80cd0cdcd7dca90b792e4491b4e5f9f677385969882687ba00054c409434000e2e4480b7d1630d3ae26aec0000000015b9071083f076267c46e2277a108458110a8982dd188000000000000000041852b5cf24fcd43e2191629429029020c18c10c000000372c01006e931747356ca1e12fd4309029ddc01bf2041256940028847d4fba090483812ff0e08fc17830200a2ca98bc8a094100f8042aac2e53df10167bedc18696e059d1630d3ae26aec0000000015b9071083e668e50e40868640638286e418dd18d3018de0c891fb15a3ea66600935d6136bed5432841da34fe5881f462a00049a7a2c61a75c4d5d8000000002b720e2107c4c1891870c40cc087089010402cfc0d31879c6275a296008d3bec7787a063bb07245b0f68000d390250d0002e4100080d22484b1231989106c0a0370288f4fa8f314188c5497a00c182c4b3d7f061c8ba0304a0a10857cb6200c000d7703fb0a01fd7cee5086005b598db72052040900500581211f09c0a2177738fe46a409b51eb206252dd2000bdf20a2dc38b79dd86cd84bc0def3f5c592ad7c94bac684c8cdcaef63f366ffa62a31a61c6c8bed4f6f180d13b43a906bda31e5aa42acb16b7acf3ca65440025a68e3275476ef3d26b790556019538641587582f2e611524628a03218b90ba4f8bd774905fbf29406cc8d7d29dad5aef96699a86490e83a2c61a75c4d5d8000000002b720e2107c4e20918618810d0890060229f35bdd2e80ac1d9c8ad447b84f63f58397a2e10ae1f5a41520eb4216f6d0c00000000445f871008523b9c151dbdb886cde6e8c7bc8c8b73858ea87ea4cac208b60000000000000000000000000000000000000000000000000063240a2c81c61863c43c0340b80008037cc018ccc5ea05197a60c08f2839a286605901f0aa5f5186fa2033881e2040b3e4a2600210080000979e2c583ebf6cf242228c524f184c954c3c517bbd8f5d8f0591592a8460053cb80366002000808f0080004f88002a090006f222421bc1bb9690dd246076edb8c7117f39dc00c20b6ec494c05fe2583218086818c0d09830780202380a11b010000a69000ccb22403b8148635fbfad998da60a10373b7dd5ddb4fe6281b02f2160d7b8a89830203a9aea32395c240105e2417a9170939ee0e0022c2fd641a2891018006ed67b3da6a555e2805b7ad7eeecf604bc40025cc56a2117763d248de7e10287e10002c0908f84efe901d91764bb03c00000000668f4a94203a2c61a75c4d5d8000000002b720e2107e0ec4cf88dc44ef42108b022151305ba3100000000000000000830a56b9e49f9a87c433347203341301200348f019699ba5fdeebb9c7beb034bc7d60758092720fe3cdc59f593d5594ab722b4c9e0e5c29bd4dbb5551dcaa3a0356db37b37d2a8889aa4585f0e14e531ed54fce12888a)) <<< 16000) + 0x1f36fe901d91764bb03c00000000668f4a94203a2c61a75c4d5d8000000002b720e2107c8e20d10910410d089009f2377711b318b4058be56294af3b07c3295c43cd91fa65f2d0069a313a682ef55260c911ded20a9075a10b7b68600000000222fc38804291dce0a8ededc4366f37463de4645b9c2c7543f526561045b000000000000000000000000000000000000000000000000003192052049640c31e21e01a0170401006f982d6f1226814c64a54fc590065596ac58c50db375a30d8fb331c87883dc6dad24c084001000012b3c590bd0a59285128afcae78950dd76a8f0535b502398011cdb159180222c6e644c083e01011e0100009d100053b2000fc244743783573834351c41d00b21660629f44470708aed8de68c0227f71821094407c0202380a11b010000951000df2200222e446884232421181900e0c845c4422c220191108a8280082ac88a1280748422642112210888e83b4242200a0033af2025eb2443ce6050620e93180200a873c362cee1c48e000d811c20acac080240ce44df7000090608002143e1bf9b281225c8f47338e2211ccf668e1293421bc160a6316afa02082a652800004c3040010000135221c3b10d01c8d86dcadf4610470c35e901edb1dac8183d359571830279ad2fd01030aca5c1884c203e01001d05081828430142160a10a050000ca11092988410c41c67c8d18fb34b02f8207c8d18fb2cb02f8208115a353cb3c6eb4b5eda7a49248f4caf032c40de5b22cc53400000000000000007c448c30a4063061842825000807670664f9c9d622ba9761d577770b0b120d1746d06b81cb709d6bec18a3d4dcebed89cce9d3068474e8f7293861c9c89f12d43a728d82f6c891a9ee0a41a106889041c4af2e5af51800238e268c1218a0987b4489051c3c40439085d7c5c5712c446480c27a28acb4fa6f5b3a1800afbc93997bc46591504019e9aa47ab03251fc101000becbca49965ee2e3f54abceb00f71c81242b143cc4cfe2e1224beb034d8e22ab2835388109f5bb95061022f6a9106002e2ba3000130a1000404183420a0a104010000b911030900024c11020d08086800224c8451cc400b61fe330fe1587e8ac3f0061f603e28269d8ef8e246832e540c180c1c4700e104ccbf9c1600201d4db8200204a60400108173f3c5e7855ed38a2413a2da399225978b2ce37854404061b93c38bc939ffe86a55ec56c18852b0f874e5199e01412dbf106438fa937a3b65c398d8c204fb7a520b707300e0130894b7f32f34a290a713ac367865c894be906b33800522edf57551be1fc30ffd8b7ceefbb4aef0c41b1c3900057450cb2c5da6334cba62e38ef42ea6aa4760efd8d6ec143f25b9aab52b3e7a25886264c12b254808515a47881888796d8942b22e8ffb205bd248012406a137d72000090707c0201f42a0f90907c00800046887b86800192887b1ac3d4461e81b9108758fb5f109845d8347aa8c05631a51c4cf4a7e115abb5cd34478c9a9ce717d87088637ac7b0b08bcf050c28c525012c71813bd634d85251875b7abbe91afa02418b02bc432024edaf2da2fc584b129ed1a601002c7a9841b59fe06a1a4e8dec19bc1ea5600ab9deb2edef6b17b5c2037c3c2200c2d7f85d9923e9beaa154665387a17050a48e06881f6d1b3dc46902eba41da7f6933e48a42406a0ec1b764fa63e271f0e12ec762a0e00130265922824d44fe28c73d43dba28e01ad95af5776705882f200006968814006d0f2ca2441f7312f2e81ca5cf7805de5894f40f4c6094160a036d563501b6ab153eefa2a69f77d1540856ddb960e8f5cca2b59a1015bb100cc91891080cb00a0020000b3abdb28282db408ecc92b8a36bc1b7bfdff06c181be9e337db3504daba1fa2ffac411e39591cd2156ddd778c9753c56153c362f91ecafde58d2d3fbb5ecad547481553b2abbc4e204f721246dd1d22fb9bd8590638f46692a0fcb6bff6192244b94a0703033ea5aa97e0c1fd37349f1fbc80d421fb1ec9da65442ed4e22a25a534dfb9563865141f600989c9a4de41967ee1937003fe4f0011ae4d4e2141f7a8b238ee399a20c23eda91051e54aa3f79ccf40bfdd92c1304d310468e000013088798e83c8741e22200079c20402a000ac721e03a000f20322816e56bfda2058877ef954430a252989d7385101736ec4bb0e13e8e1525e618271d23ea19a4808136193170600f22257ff4080054b7fb9f5011110101d8a37d0204e9442701c00011d10ef1d0770a83b42400330e43b0e61d6530ea2907492c3a0661ce2b0e60907280eaeb0aa6d3bd2dbd37d6db5cf11684650217cee2a547f910aa36fa54055b6cee614fe40b32893871c3082101240000b5eb3c76d712e0755554b9a5bd0f651e15b277905a39bdd78b4c88f1a579209dd06b273fb124d901644025fe4d2b66ff2695b4249e11cb924f08e5b0888c14e10b1100c60c50c40d004030200200d0e30d07200b460c09fed860a2407c9985107ca82788c0c55dc8964406886b96e5001d53ef640098507c021c3b949b4ee30b883d26e1211777e2dc384a150b411a0133e433e012880f00430b56d0b1fc9085eba2570e132c27459008c407c02000015240006fc800183906509c8e2903245670e429c71f0b1f0b3fbfb8c28dfb8b3e340167bef5e12840f804247066ac726387a60ae43840a6d99e6e8614809fb9e848103e0100000d23134ad8b4989a3551a16f330534f55e5c28b34078938710629213b0a226f03071300201b329204e183e01000015521c622d1817b7c321449dcd5c60804645702e)) <<< 16000) + 0x181fe4dd35cc0097a4bd10250c1e00860a17df12d0a272c962464025f80e500c0e8456e0e048183c0100000cf21c4030001f821c2330e0050002d61000a5a3e5806d65c21622f0f6f0e902120c9671061d12dedd1120210004037c0586db8f3140c089a230bf9e0ba117d5220139574e7c201a525ea6425081f00800007d1e281c882fbca0d7b168afc70c6eecf17c20ba3900de870416a37cbc9410800200ae020de0180009490950d04f868278341ba1a0dc0d84e808000efc86994e42b4c9a4265024c52c0507044e5f032040d44d32aa20003434830180308b16d40026181f008507b1a10c64e0874c650a961159ca15a0c2604b8690382245fedc0025101f00840c02312bfa60bf7765ac9010516a6f21a2080cd515090207c0210305033cee982dc560c4c1447e0d350660605686c4c90cb68b66d8c005af4b5d098207c0200002506c4908d2dda78621fdb06c60c1ed93c2081bb4253b41000be79e1c04a183e0100000fe200065c427c340008bc436c5403a220c01101606836814000c224364a61b0530d72186b0ae0214750a9870ac0cf80c2c09f8530a48027a8782800090607802121b43a21fc20316b5cb547045e9861c09091eccf430415b7ee5883005017f1a6004c283e010f0eea0b818810860f804035417a269dd7cbe2840093df30506aa883efc30e4682d6c1400c4a2d4f0094407c020000200400060880016510d41d8698ec348661a23301d1586804c33c070361b2c8b1494e13972970d02b0f48e8f7b41324102a4809b12f2a5def7e6eaa3705dcc4d976f300b814e632fd78ed69c44501ea7d42094d06b22401560a7e6cf66f47942cc5e365c959ba674a40c03609f36a564215f3baa9e7ff6911298c270e0410e3b41090537365257a78feb3cc4a16e6c2005684bbf855b66546befcf3722ced88cabc28026763b41e094ec24a9de9afaf4ce9a2c969b8864fbb95f4126b0d7b627e9d56a524901c85865014902381c167f371608369fa5c08c30740216184a84f4258222e82178a0cb254c562020bf9d81a0016d5b18e04a183c0100000f9219c230cd0d06606c0000580601667f084206c0210080100400001110cb0506502c324140fe03a2b3a07c646802ffce2a024183a00880600802000008886404831c27016c332d49204447b3386817048fcd0023141d0086840c53ddcc0a9bc9fc240be407c902618360080c6050628080003148000c3100028020006f040016748620ec30c27a20719e6694238c96dc9a1cb15b23860384db988202404c9804a1038010d121f84fecd0e0e49dcc8055443f7460211bec7424081c0080000629c0cdc1533c90c188bf4870d904c9e8c0b4247e99000b0140d4a014036a28100496022409c307002000027e6c2057e331420204b2845a2c10d229e580c00832a58b000947177200250c2000805202800046080202bc800d612a641118687fa8d0c2d4998f11820f80401fc07c241de733284021d9d84082347d4c8c106c0212499f154a2221f808628e0c9b3a951e0135e33c84020c682e12820e00400003ac8000cf1806008020000088861088304460005b242c86412a3209f1104f08827404000f9843005400267842fc540501a0017ce209e5b0782183b8ac13037444a6c27d7623029c2ada2f04242074a822d641820b10cc8fd620127fc1affd6141142bf01026300050240b2f41c02c1f45ab1e0009b53075fb40110036ff602ba968124c0a00a14400d9f19d00ebd8ce1218d80d561ba3a858834a984c21561761c3e81754242ef270881b33acbcc7ca6ff85081a53e0dab4b66c4000375ecab956e4e00346e6c9abae7b0401dd7a9d38399cb0233ea38c1c83634a0a4a67b9960c99f20700570904de88f943843d72a04ba9bf82e2040db6436119891642c307a3d954d25b6c81c3a5c1df776d215fe1031b06eb3832bdd0714217aa7c6c8644db60008a2191566f5c88211561a48143c07802b828000b6085f08c2f436178130bb05f14077738c10204c849ff4524610582148128144a837c4a8aca09897f1fafc3c127a2c931b030041116bc690003f44fc5c90b358c0038072e956bc821dc809808102451c57d3f58512fc99078fc43866e0255e95310305b9eb91289e12ac46f16250a08898f820598782f797246379300015f4d11a70085fd2214cba3230d30d4c412da080a40b0000468416857821d60e7328204c6fe8050e28967a5dade440d27aeb258141375c435331c25fe6d9cb248041f8cc9fc30054f2919f80b5295e44867d8f53490620708c0512281b96eeca10e28ae076001a1820803cf39341025992afd0690a26550d87d57081a53fc1f79614124b877e65692113476e5e8880e653bda772074da15447418340e14014000089c85d10815c340008b8400238480076f10b925edb3b9853f902ea5432dc4f2706502746841523c52c31032c1201141300140030180200df18135f26248afa4f9002c39335a80160b19dbaf050510c694a2030daa8160260c1d00800008e9004056940f26b1d081668037460a2025805311817283d9e412040f80438b005e65cb25055b2a0e162a073b3b5ea5b924d1aa7e84ca2b8eab5d04195840e29485fb7a3fef384900c32071b2ede980f21d49504c31bdca2b9950e252870a1300c35e558f67803c4e55fdb05ce41c72687ee6140d48df67a383be1c50e02af717aef95e8593502621bc70e02804372de956b367808e4974779e866c0146a07642550c1caa173d6f8f417bd2790d9113fb1daf557dbb80aaca634d8d2b27933791868d90d3c816331fe)) <<< 16000) + 0xef4a6dccb698ec01a2562c404ef34c48835a3ae60a1e275b9372c006f643e48023556dd890007802143c1415b425860e40226101a6362c56500c30a43348003c0100000c9200035c4001e60e8e2775d58903859ba3a83897c9e1fb80000c6e8392000f00402d004170020b70100008410b6118004de1920a997b77194a41c161e76119a017f6a56b5ed6a6ac5082598d501363019f9668035ed5b07ea86eabf84cfc081e25048801248907bf5edf14a60ec44d8d3c28b94514035289eeb8ee1e405ac7110b5bd8a40366583b3955813f61ba88ed72353f2f546dbbdacbb7b8a5c10fd5c0122b9e3384e5b2fd9094a76319f6a3b9ef106294870000836425c5616a1ba950cb713c9c19409d1a1054481ca10f0c90c804504404500c134d0428c448b38347c6e3bdcf21e5c10189a195b2826cf6a29228023d0782831c9545ca4864b7d211c50589dd4fb880c4c081980401192284a04e183e010000154203a130040562f6135a2de0e40f21cb0056a5432dc4f2706502746841523482062051811010814000d67eda59237ed128380372d813112bb8c375be420f319feae20d6285d20b4227f6924040cff2220664955efc80930213c04d043cfbe849208412c04818185a1e79c04e183e01001d058000b49c82e4a9c6417254d62c665f3316332fa08308b16472c780bb5852f9145ad4ffac61d7d6c190fec122eec08acda5ff40000000000000000f6fe901d91764bb03c00000000668f4a94204348206205201400257f11c8d9359bfcc07a69954068f5dd8fea1e01cd61e6cf50ef510e92dd55605a016c439050f06d1ce89ea776b9d8885a685bbfde216b99b7463ed7f0c8726f749c50d133defa68881000000035b50f7eb8d76be076187080462057724a8bf8c40af01ac22c591cb1e02f08bbd84a299c428ab5b41443052450813802003516aed20c582a51254f0a9b461973cb01c78bb560b81bf9a7e3c019b142c0009e7f79a293a735247282fd2ce508be28ad111aa505b0a1c23c7691a4310c0a7f528332401ea848083e0109103c5fea8cc20013e76794459475a462832fa508c8184307a493cd004421e2f93020f8040000498800108100056f21681a000a582001bdc42cc276b0a5f228b5a9ff58c3afad8321fd8245dd81159b4bfe80000000000000001efca033913935a56359fbcdc3f4b29cb16cf045a0c5bfa4a040000000000000000000000000000000000000000000000000c3845dec2514ce21455ada0a18a11a08a09a0140100121a42193739bb6764e3ad12e2e21bde18c60efc0725213ff2e2c97270d0af500ad0d167f7f55232dbde8225fc33ab4c00695095914e9d83fe5ed39be9e5d70704ebcb3e5a41255345b75789ad5b03b60c75910b4b2c269dad90fe1000c3af4af50b20500032710017882162520b0110140282bc0400513442b8f415a720ac310559882a8a41521a00509001d4910515d80e9ac14017032ce13a64d39b922b42aa4b6425fdf3c6eae280db5dc0ee73f8870d253931918d47b7167f6bad859a1ca6f020eafd0acaadeab0fe380357ccc0f4d6a96c6def9b934425aa2043548c29c68198ee1cf0400ab438a8478372c51cc4e35daaf0a0b1c1578246908404facbc55d393d7117f748fab43ec0075571c99bc8c8b5bc887bda68e882090a4d908d8391a67249d7870ceaabadfefa4c6906ef40a6b41bb7cfe6a72b2fce2e077b05b95d681d58aa31e5ea2467192560e1c91ebdebd8bd950815afaddb540c61c15f687e602b4e65101e09a9366e0a2974ecbe9d54bac049138c76ba30acbe58be4e42f7fb8ea7efd944c8aa01c3097379f565ebc0d71a4a138035e34b6b98dbd8e06d6370f2563e8a845c60183c0f0a4326a50a384f42b4c95df6fad134e4a951402331fce7e136a4c1001f435770ee2213dd9a75412923c4e7ebae3a9465265f9924d4fe37d2d208878940348bd08f5a047b267891181703e32ef96649102cff039ce3bbbb590ab12e14feb51470035c26823fe66b88b22e096b3b98f390939cc81431066243c30bdab5b331412cb9b39668087367dc16026c12fd60004a383c010a1d671c0b228631a9aa38617723f5dc1c31ecab5f4a0a0ded5f4000251c1e00800008090a81d00011910a11d85388ac74469c913037c8ab432439d1d67e0415c1358424026a36b225041c00805300a4301dedc5200cdeb1ee0a0118308961015d5cbae0902074020000192429427610bf0b8ac80854a24d05825b3bc550c021b4feb0004b0be3e40a860e802029014000210426817430458eca4289b8f56d58200a352d1e00118c0f00400002ac8518c82546413e2209e1104e8080011808510a80036688231ee061131644cdd50180c05280690457e2397ea673663617dc38e0d3fc746c3778d08dc2f92c58b78b3faabffd2de1d24d2186058c5c6cae0aeb98ddbceb7a6f0c65fcefa2dbef1e505c82380d2041936e7176a70d3f4fd3367c20940d53436128981da0102ca51429688bd29fb4681d656fb3298470fc861b9029dd50cdef9d5efcd258f2096ad975e0d9f839eee6828514a198894dd426315ea596d49d44c98bb9d87b122fb592091ba5c413c8f661d0d7ad70f9390bb393214745f6c4ae1c871724e0e1c85b7fcdef8ff6c53ed19d4074f21736b13e890c3799e0e06dfa681c3f23057773efb5a57cf080c68df8ccc51f46460ea51c1378996e1dc0ca8c030533a8f67b4b028158baa394b02d2714bea801d5752b0df6945d33bf1df21aaf2d87113888174e6d5d801287db58dc84b4e1642c204a1e04118ff20e53dc)) <<< 16000) + 0xc5bbef5ae351bf0de1f064e9bcb98b9069392e4240e80679a44f885120388c2c88656a4175dd2b235c58ec8803ee9a076c10e70ae8fa2ec8d7163b2200fba820c18a2dee3da6f982a814d9bd396957e0c042474412c45bfa1365a2f14f9ce35363c7c109d1630d3ae26aec0000000015b9071083e860c2884864064820004944000cb41e10ee111a9d104fd3a0290a32fac52db025d1cdcfbb340975e42eff51258f0f511f11640264147bcb29e490cf0d5d99965a993dca090b41f8930a6a7d89f9c4d46bf541a33d74c6a1ae66a2b01529544e68002d890a11deae61c267b4df3055029b37a775b5bb3a0840dd97718b7f426cb45e29f39cba6bf3282183145bdc7b4df3055029b37a72d2afc1808400000004660513136517357371b8ef81f42452032021c218001331cab6158249936e05afa3194d03881f0e2132d28e6bf71f0ec16972c2c9839d07372fbb165ee23626cb4d7a2fb515af587a4402a9c56cd37b38a41e46cd0a00d04f8682783413a020004bf21382a000f9421283a0015da209e4b09b1981408c13037c3997e59d27093ccfdd91020dcd8bd6504682bc18140317a4c3012840f0040268074321b7129848a4d53a5b881e3833e1a50425a32208c010e99de804a183c0100000f9324283d4e60920738ae5a6b5e275af715e5c556b86f8fbaa90bc927334969988ee70d241d22564dbb0286f29062a1feb63337afc0440b990c93ce5af7a03884e9d7532fce25010bd13fa34c3eec31f8c99f27803a24a126363a5170604dd15454a13f0be0a118a030fe738beb1270cd39006f8593ba394a717c89bf89bf1d1e23d5b774a8084e5ff04766ea85f90fb96ac219a3fbe1bbac57add634a29e9cc0438381d865fe1c6220e750000551212e2309909c8a01300bbef7f62888b14aebd6b8ba2546f4b8dfa70507e9428f270808acb43e73d8e3d4540846b629e5001475a1b607603f9ce904a7897cd47db5938175420030a5aecd52944e75cf06f6fdf3c257062d4b8dc1001b7eec678f5f9a7a317399387a98198eb407da40288648721efab2865d24ebbc0a318ed873df0fc1c45098c0b21391b85ec088675ed6381044901d42b877ac99a0a9c843948faa6d79ae69432707d12285556347184964e7716705f8cc90d4609de53fde812060f804000034c84c04825417d7cef7119d44fd061e19d17fc7867460010e417254e320b92a6b16332f998b1997d0410466e97ab7684d550da140f3399df204762b534726ac000000000000000001e99229020a19a08a094001657506861041aedd0fa860ec1fa90fdbcbdbc9461c9c1edc5d7dab9f4df4dbac3c1ab08af509e19fc916fc4ed61cd01106bf569aa2f686ce58a57f5d45312619063a680023f1000ad3208c43c22c591cb1e02db6cee614fe40bbfa407645d92ec0f0000000019a3d2a5080c810c0860870460480023dad283fae1400ee9284dcbd86759d820be30ba02c179e37f2c5be58b5d8520066a12e1b09609c8aa07fe2532d605e1659cbf730a1ca32c5b50ac891b885cc0e6040499378957caaf451928456200e123fc17e5deedc115d20f6f54105f582adf630c6c5fcc5d0acc1a0c7f4684d5af8fc5d6185436c28308897378f7faace9946c91500bfd2570d88a0053cec08ea707e391f4ebc2587b638a2f0800254173e8db83113e8db830a661c5c8b2661c5c8c1189228a19010e10811a08a094004b180905d3016e40c13015400055c80029a1094150003f0904c250499282489412242090210479082386411a2208c0900282822c1400373840e0a406e4a0361901a04801177c8450ac01425c22413e3c4ad369bd1be7b7ea001841fead7f673b24aa0ffeea14005047bd13c5532dc4602cfb1ea001204bd0d6f050543d585aedb91002009db73e240d1a31a9c124a3e0030022aa3126d5228593ae44914011019993e72ec582a71ac9c3db92800f965e5aa623c486aa1ecc321888b9daeca733f720063063110614654e14a8e0818895290c08709165289044a0a190c1021dc1433025082000848465ad8804e045b8e6f79208f329f3f3000c6209e85813cdbc02025081f00800007e10890de0f59c90d04b05403fc890c090f0bc1a0407a5e154612040f8040220140500a0000fb210e230861184286c1c4361081300509c030040101020305a0184000e0100200807f0184180e00802008d08e2ac7fa0054908b922041b0080000389926ea76b4aa1529ef8ebe8ec1a6b53d9eb38911221590acc00f612c5848630700c37a765c2a4255a77922f98cbef425bc2cc3e82340ef033daa9b531d1006208b3b3db2b08b2f7925eaa3a79dba316dccb27d57654db59f7e17f608006dd85b44affe055ee28d762c3528bd333a019b3dd8c2c260cc2c72d340248a16cbc7e0989b3f7c672a7f207c1331575a0cba1b970b42abb948ef364e5233dfdd0b33434d8a7ef85587e7a30c4c912d79d6e0902398c60000b2e420834000cea6028020080000222000e3270da8c33138582455ece621104100040204060b40308001c11591bf8091a180b55e27e44084401007f01c93406759a31c200b992040602000f67d0918211004249a46226cf111003f010c51c1024d9d4a8f00026bc679080010634170941088020000212400074483f02e0705a7db1b8e3cb9632bb0a140dda526a6000a04ca82009040840200001ba4000e3483e8c80011e083e0a81ec340f402000c67200208441e4c609e5b0781d83b8ac130460961ba149cb0bfcad1030a08f3d5b91101c2203074de71886109f37d7550dc60471b69c5f63)) <<< 16000) + 0x01021dd84857498240a22eefbe3d0900478f0df280c0700015f32e149a08cfc2e1fe0805540003f412885a068d0f7ef2f8f161cc865d561031729c3986823b56e648b07ac4329f802004a503e010c2a4bea8b01e18dd3a8e89a1a9203f64181cefd4ed092087607cd380128a1000401d8160ea0307401c9f9ba61e607ee507303f727315126ec08123b9c151dbdb886cde6e8c7bc8c8b73858ea87ea4cac208b600000000000000000000000000000000000000000000000000637519fd1b0b502cc81cd109106107041002bff41d31a7a56252de255cc41ef16df329a04125149c110611593386c4e8f6c704050349cb21089b647a184c341daf13c20f1c8bb65f17a20e83d597ef73bdcd89ce4a829726ca566d874b112ba2186bf5621cfafd8c21d8cfac0d8754b081b2c455dfa3766220094a897ea5e77150e08cb52c658a2951a00496ad0369993b11600bf9a7683d698f020200a94ad4bf09c15d51cf939d51753bc32eb8e1c0340000a4c8003de1920294a97063352c253ee712204247054830b6b97d344382103392f701abe7031c96585a1c374da402f5f93585c90435707b25a98808816a48e009ed403f99bf75b8376a1401b30abeb38dc7e0d919600301ec964ddbc098d4fd600c27030a9dcfae489e17800032c20018c641cc760e43b0711d80286f0ab5e629fc90854e58e598089da43522412e27ace02809c0c79d8003f6f2cc004c103e0100700183280c1bc07e309ab22fb00ba02d12122db02ea5432dc4f27065027468415298c93aa76d006835dd7aea4c4f947c61085092481cb1070470270011148bf61892dea25ee1ad42a4baa047482e6e22402f5049c592c5dcc0b63223935d398830a114846df184d5917d805d016890916d81752a196e2793832813a3420a94c649d53b680341aeebd752627ca3e308428514490404202781c86afeedfa7adea2e06505cd916d7c1d6b63cbacf67b2d86a9a889bd37d9f8e7b805ec7f54571412908db65dfa183ef8a24216a2f782840d946ce140002e78ffe920055ed79725002100840342c03eb921cccad584508476e6b31800e80400002748000dd10004c020dc0b8000080230f5d0c4b23c01d6b193a4003c00800007220da0a06c050358080003b8800473106a198348ac1a0260ce0ba56a1a7120702ea1b47b946f31c99bbaf5d4993e51f18420234328318340124118104108000c0800803418017a1b375d428506657a00a920b7d267c28017472a689a023c4547a215101e00400000800043c81786c198360ca1b8113fe21ba2015fc1296a20309dd0a00b006c972180048203e010b2e10c60472852bf4fd8890a449e14b4000ad055a4a020f00230ccdda486c2ca14cd7393486166f1537280287fac2590008002186411c11ae1630b0bb0328c20222705a14195f5b83dc800400100000d1200037a41902603a0b0002cc20c60bf143f58a92283909cb24081bf23323a0032e9c458b0058cd6a6012880e804267234a7e9700bb5852f9145ad4ffac61d7d6c190fec122eec08acda5ff40000000000000000f5646496bc62c0bc22ef6128a6710a2ad6d0510d10a10f0d10010080c919d94d7aa462a35bccb89f13b0eb865a97d011d802c400a567855fdde4aaa4f4f4eb06062b01942bcaea1c74f744d7c343592a11ba62580200802207747ce632049e0527b20082cc09e14086c9ae224041c00800006190001003a622c9be548196800da782ccc7b508c106c021c39f764f9080adca5134701d13a20c2005e6fada24041d0080000631062010000c7100068e20c2220007b420c00b81c38029da709835ea950220c1d0084472b970aece10bb1b8c6441bb14ef84e01ebfa0340240c1e008000068105f1102f08817444000020001b82001b0e40041b880e88a73734d60c53809a12e5269090436556a43241a05d016890916d816679448638648418230004ae7e63c198eed94f5c4693cf6a25f6ff1bd094bf627c8d87d9ebfc9eca61482196c8568facde3020541aae08190a2468013101c00402e0680002d4e14072766d141f59c0cd8044203a01005b0d00200800029482d06e73734d60c53809a12e52690904352a196e2793832813a3420a94c649d53b680341aeebd752627ca3e3084267944863861041823007298bde46790f25a85a06b17951734273c0c41b52cfef62b629817841474ce8ca1b53fae7567c813ce1dd268f24c198252d812d89887c4802e25bb2c40322811ac0401f8b1031090207c02184397fca63c0310228080075a6def08c1074021800244f952401f9da9a18153477ba3001b008400004010000044400034c8000c5100027430080100402c8480100400009841604404c220570900033390561d01008c1540400153a4150d40a60200263a20a45a003448200a220036f420a2a305009e11ea59ad4d6b421d143c4c252cd3d6e02202dde1b6ce1191947f4a004179dd4694ef6cb83553034b7765d861a7691dc697ef7cb6137b4a200a08d338bb569def9a8ef487f58e6cc8c57fd1585e71679ac553fb66c0a0049474b218a8e8176ca047c1af1245631b39ba3cd3ca1a04371b1c2019ecb25026b445bcedac386cdd869755d9cabd6f8acbb4eafabc50d99c2eb036ebd60866072aa7ae00de3b99336564c40d68820a6c174013c3609c1b04d0982604c12c1762b0d11ba9024da3ef2044103801004a0182480e4526b548102068315020180170dc39010066bb3750902078020090038102df0edcc0f11cbd28c044806c3c90542fa56e80038008c240a97b24cf1418cb8c4041278)) <<< 16000) + 0x0e41b0c0c13c34a18a0816b6662890454f6d858c008e1e6c8a700200080000aa902e050238280009688001ab9c3e1580790b000f19ea410015d36f3e3001e0084000040100000446000020080410100001b90400501f82c0f8040002d64118678505f62951016b47abec088307402008a0304401c8712f1eb6061a605f4c85846ceff1a881111e4f023015e7ef9f820012603e604c183c01004301d08de60f5a303c08f615920939bbb1c8c1074021e2adafa9f4a129a6f946606ac772b124191011cc9807704bc209410740200001e040b8140840a0001d3200064c748184d19f243ec67734100448868e23041c008587412d0dc90cf744c18e1027a9952608360080000973414b2f30721041b00802080800017c8200280fc1607c020002062000c0840f44400a12000bf520785203b2501d1080e48403a420382101b8e80d85406a1203409019828004aa48192c80c5540609a02f4d0171680b49400be6040440d0809c0f9c10805312586e18106e09d43cb0283021d2bc328840465e429d3ee060177286b0c930800cc51fa885eaa039203128b185000407ed260f187b18800418a998e0ac0a00580ae290498bd0420305318ca903870f6bd945060c00002eda0c00b1aaf90e10016b706faeaa0a13141180423d8dd72c83573b8686c4c4eacf6112d8fa8a2cd2e22e0000000000000000f0c969bb56e4554735231ae54f4a2b20258f44140558f9f69600000000000000000000000000000000000000000000000006122082062442041c404041b14559c6b8501b505f62cd48ff9a4566d6760e005284bb8b0605ffcff46b32c828803643e941565d141b3fbcc4153040101778c08b5ff0614ea33281588c0a8460522302805e6a5c2cd19b90f76cbae9a2bd85cb20660645f14f495a9500000000000000000fcbd2c2852eb8bd56eb709d03ec811166163aa8bce23884e00000000000000003e639821fc93549e866e1543edba3a4f8ab5a53936f973e0000000000000000f3b9123822c17deab54e220deed25162bb789f45142278c2000000000000000000000000000000000000000000000005d42852452051c002574c0b4c0a4d45dab30583302ec9a05449c2dfca2ad05852fd928041549d54934c014bcc34e7717501d68b311b432aa04993f65c40ab2375c56e1ce4a392b5d6cc6e6003e2b90e0d479b51b4f6289c391c9312c9a6028713ff68986ccec5e19900978f0447dd4776c461dcdfeccf30edc3c1ae10f598c9981924b43f5fe5e1ab477bec39982ab095c03f9241a38872e1929c386ef18514d553cf26903d28db371842e78cc160400003e657082018cafc60a13041100430a2699e712c6900a63195207180dd7d6279a084667c39a30081af1d3045800000176d026082300800009f9d34908942c118673eb089de348249cf07a46105a2af28b4a041c62ac059000006ebddb08022a93e32a1384118043791c97722cc1c4a10addd71dfca1da34b438aaff4307a00000000000000007b0350b71f870832d6f1e09d4f41f42c5391011f117d87c3d100000000000000000000000000000000000000000000000003091851a40e304114098016005c200401a000612400124881384f3603c86a5b00b3f6d968e0dd96a4c46abf054a6324ea9db401a0d775eba9313e51f18421330c2cb3072c72411c0376615bd1b70bb769e90e07ba4c480df5adc3a92543ffd0b9e93067ad5a304410cf6c934982d70e61838642a0c9f9cb1c0a660c886850e0000249a50185085875ca801208233eae5f1cb031bc2e9f7a4190e105204000019e204c1a0250100022f9000bcf20483a02309000aa41001a6a20445b02105e6a5c2cd19b90f76cbae9a2bd85cb20660645f14f495a9500000000000000000fccb22ef36c1c76148d078c0244f8afdcd543a1b4a7161d600000000000000003ec510010c91081071010460251393df8cca0b25b49b8794435014890a4061bb6165d37bfbb8055e4e31d32c1364d5f17a3413b54300ed9f4958e277edb88f30ff31ac0487ca76daf011a82829d168a16201c164249b9d7c34c02470004d57f6285084c7b74224535fa05d0a1c3000db24d508219c8c4178140000350114a00090021a149104472b46bcf274c81639806d1969c14c938968dd80000000000000001ea477382a3b7b710d9bcdd18f791916e70b1d50fd499584116c00000000000000000000000000000000000000000000000000c6448e50a3862041044804017000100680018710004ca204013cd4b859a33721eed975d3457b0b9640cc0c8be29e92b52a00000000000000001f99645de6d838ec291a0f180489f15fb9aa8743694e2c3ac00000000000000007d8a20022248c592a4b02f82091f29068b400000000046848840838830040a65309e1cdbdaf61689c9f2f3a75f39c86669b6ae11a3519ddf34713c3a1e1cf0367c09b70afcd4fd643bc11aaa6ec2dafb2fd72838a7f028381e7874738e3f295f06bc1c9e4699d85aa4a069be9025212bb450adfd0378124dcf3ebf3f12380026abfb14284263dba11229afd02e850e18006d926a841038d3b0f50a00001a808a140212004247244b4361a50a0a63195202081136974c1408530f04ec24083fdc0e164000000176d098108c02000027a4000bec80044c901f0d00f068074340381a01b0900d048064240300a0170100096e10161900178490153d00a1e804cf40247a011390081c803ce401c6a00d1d0060c802c64014320091500404801c0400c02003298200a9a004410018880084400202000010157371)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 41 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase5" = "QuadFullFiveCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 41 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase5 private def zz2217:"s08a9"="s08a9":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase6 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l17 l20 l22 l23 l27 l29 l33 l35 l37 l4 l44 l46 l5 l51 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x26fe18bc7, -0x59682c120,0x225b5926,0x3770d6c], ![-0x59682c120, -0x28fca821a6,0x107b4d0354, -0x5b2719238], ![0x225b5926,0x107b4d0354, -0x2c209b88f8,0x961b9d51e], ![0x3770d6c, -0x5b2719238,0x961b9d51e, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xe5473384,l5),(0x122b1733c,l4),(0x2e42e666f,l8),(-0x71c30b9c,l10),(-0x7cf47ebe,l17),(-0x370392c,l20),(0x62eabb26,l23),(0xea57e01f,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x93cfc4,l46),(0x5324dd8,l44),(0x2cb417800,l51),(-0x954e63c3,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x2e42e666f,l8),(-0x954e63c3,l63),(0x62eabb26,l23),(0xea57e01f,l22),(-0xe5473384,l5),(-0x7cf47ebe,l17),(-0x71c30b9c,l10),(0x122b1733c,l4),(-0x370392c,l20),(0x5324dd8,l44),(-0x93cfc4,l46)] def dynamicTables : DynamicPackedCheck.Tables := ⟨70, #[0x40c610a30178401400000150110060c0400000000009c0620080000000110f014c0200000000003c0520080000250982402d0030000000001e009200c000054148840590030000000340d00f300c000551241600b9004003c82282d018c40140000001609c04cc030000000002c009200c000000000d80248030000000640900c300c00001a01040098c0500000006c0900c300c0000000190901cc0200000006e1100b300c00000000005018802000000000058052008000a91501601590040002102404405c4010000002101300e0c04ed851c0a102ff1401c0000001c8c40d8c03002102182301d24014000a11903603590040000000000a40620080000002b8c402cc030000000000ac0620080000002a8c804cc0300000008e2100b300c0000002288804cc03002542102200c9401400000000a0603cc02000000003c1c0a30080006214c42032d004062053042001e140180000022011004cc040000000088140730080000000110d028c02a5442408602e55401e9c10c0220027550070000000000740620080000000000e01480200000005219024300c0000240a82409d003c70530088009d5401c0000000002101880200000000008c0620080000000c8440d8c030001183108403940100000000001f0188020000006c4824074008000000000b002c8030000000000640620080000000001b0188020510284110018d40180005c0a01c017500400000000026009200c00000001109018c020000000001c009200c00000000012014802,0xa50cc1140ddd005], #[![-9, 66, -71, 0]]⟩ def dynamicCode : Nat := (((((((0x4912592ab0e4a1d683b5e98923944969ca2284071d66ede381524321e8c200b87c832a9302118042c910102a31cd9249b765538a4092049a3fe663e50e0693f242472471244867a8114283a814c3cf4304000007b0b208212cec7d869280908a35f1769590429014000101904009d10e3cafd8030411787846a0d840e60d442e1c440c5fdab5877c48a47515af3ca4889b4b55a17658000000d2f00481fad7972fe000298c9329124041400c00fc0400040c40f82723be3021998c80e3dccf6ddb3541430ed3df62f478e306320217a8c142a1db49b6d8c902b0e7fc89f700e2a64a86edc2402083c1274fc420802074c4fbdb80291c48a1601400008ac81e84e06bc1de17328186e6109cf0842452fdbcb8ee92445d6ceb6f4f1c42cd2330d901845d4bc9dfb01c3389bed3bda1c25c72b561b60c01f657d1a700502c91c28018000103980e1552506ee65bc0ddc31fbaa4306a3c7398eaec4cd978e66ecd51810655a1cea2e33702be65c7ad88012f) <<< 16000) + 0x30a3f4d1fe494e44c2fe20300297dab6046cfa9afd292b9fa080249fc20e2181c86caf8f0aa404823fee864eb1b44c41ed54f10863f8300c1dd138d6620610fc0001ae9c32c9af99be1030d4392d5a385a851401a040883d98440800812121180400003b8f5a1cefb6c2592453a35497db7a06ab5cc7bba575c308b908000000000000000020eecd017e4dd9a02fc6e7671ee7400000000046428630218230028020021958072839281dc852a4431a06b08501e0a5b07e484206a45290bb29c7480594b98e9bc076822934b996a8a1e012527253f046b8252678506c51d265d0003d720783a03b0901d0280e405030554f43700f23854a5ff33225d0c1117332ff6c9e2842233588b53210008a6afbea1303809feb3b99d240a004438bee185c8841c5b11392f2126d4c97f117777142e02c545ce8dde5b2a517625b2a517508c000000000000000000000000000bee3c3ef202ed3652da7117a7e1bee3c3ef202ed3652da7117a7e2610c758003db4a61c1887f862fa46d22031c32421020c118006a699723cd120596a780b2cb65592a95f98b2921ee6eff2c596e6b9ce100c51bbde4207e8c86591f4fa59fbe4a01ed0f3ddc0cd2c42c099cb400e350f1ed674e17027e363645df5f24c59d90c227a8f5e21a909edf82850c48cd846ddc206e04d3c0a0a1821c91a342560810462f35e99c20b3e2d75dd38282527771403b0c02e4e7afb34000119e0e4711322400a4080070030370101b00f8d1874a5a03f2c122903ba52bd802828b7d6c3b9cf63c9020b2832df532982081aebd99e27698e1971ee08288cf01860f2d26c1aada0a0c41074df78d4c30066e42c6d0ff8439c120064090c252b139d1a973713b429839b43791a0d608baa3b2c71a0a51229ec8f062305847d2652d3eaf7738960808015c73e62ef3e7db8180c10476bb12539a88dc8637fd74c3002384a00008d8c0e40820820638248038020000190001006d0e5f96792498f6d903eb2700e44706ba50c2e961c84a666014201810cdeaa3e8c408b668de9413e5d0c21f69361dc6e1982080930380ad54500e09481944473a71000001ef04cc72f846838812006c0b0000287000984c04f978dc3078d60f66e858ee53c5aeec71416d8a1498408e87b1c83340028bc2a533001180400004ec8002481a1da6a5abd00c30258ed3ac285bf949247a48aca4bb7ed481406d6f0df8e187bba602c1c016aef5bc213841180400005b88005719000d4020024b440d46723c4a71f00cc910f2cdb94784865a2598a4120313221642e101157a96ae40906b8e734daa38212ae533bf1c0003770d6c340212804326d7735a287d5bb398b902a251050a48848650450210258000190001006d10bd352a11bac50f0b16027e24050934cd6900fd0488fd96d37d50830600001c8f48038440502b554b81027b21e25f84a3800000098580010003a9745423ba09002c024000110100032a324e3d633f9e891c07d1f684648c530bc85b224352bb6f5311018ada3c18e0300006ee1ad808015b2078506e084a008c9b5dcd68a1f56ece62e40a894414394292292206114096000064000401b43d6f736ec97a38e00002ad6ec142564908a627e2840f566767c886109412cb66165026f6b2b6af19400302cd170dc38000000261600c000000130b013a400a80700004184000c588002551e24b6c4f4245a28846db5798d80618749ea4e4803844115a24f7d8e0edaf38189e0302d49212e0480a011b6d2e0c602001de97526100909018540400001dc20680203301019008002fac8188ac0c04605e2302e1181688c0b0370014838c3262812aea33f68401a5b148dc8028046584401002b0161001d0476d203183bbbda080a000bff0e2c100ad68abc100c2e377a0409440880216104e481a59a3e4bd12fad55e89465b83a5f3e09e5d1d84ca7052eed55636f445869dbd11d6a8f25289d5dfdf9f313299b54cce2c80a97ccaff19d236c78fe621b3c87a7196eab03a8ebc87e51092d19fa2cc1eb1265c25540390c7355ecb7080e99150e7f54f0a9d81009edad8fe9c64b5c1f1d6ec2eafbd6b77e80aad90f7accdae9035fd16016f20693558e394730338db1877e196525c706713c485001616de392347235d2c92aeeb76d9cc30126629b4841109758aefe6a4c91859644fcc42f8ad94e4e49bf1661bdae47e40e58f644e4b6fcd60706b37670c210634b6b17106c4b22c63d339f564ce0851330da3105c1ffe8c4a1e7cd97abc62c981e7328c466579000105040a8560461b0220981084c08017862e986febe307518f09ff660449c75b7a0c02108d2cec480046010c1ee19464dc60d634dcb053057f3b7d8990000b998c424002100800006a9b1d2dd590c648e08e5dfc62c621ecc813962e23eece949010840200001ae40a42605003a14881be086509d62d36ee1c062766be60c0004e8762c064102100800006e90271581304e438c76e633d467088727893e34307043eaf39df504f7e86ff20537bb18000a1be2d72e99fc6e9c090a6a05005f3ea5806b875e9f19c009a3100176b008b907b7b826a72434fae971acd26e5fc8c26fe67c0c192332d98a581272cf86641c66118000183980a1761ab861410077d26e0b00309bc9a508030bcd07f90142420220080000749025150004231808008022010020089246655bb088212ffa04a180a2d12f5813081f004000052980600802000008880008f90241581186c088260421302005c14369ad4655ccf74a1e57d40a2b9611ed05f5cb3becb9c027616b1646a3979a7310c0ce477)) <<< 16000) + 0xee79bf993b7c215ea189b5df1cbf06521e68e5aeffa82c26c40868587f59000c67fea4b89231a5b62ff8935149016d89c6486951c4d05ff851f9747790ef0caf00202ba11be0d47d5001eafed80cc9de980a8361f4aadf910cbe80fb5a78c1b85abaf6bf3bdc6758fabc1598d4b2e633796f8787c45166ded250a1f9cd6f92fbd665b80909e1b0c8edcdf25e48848b0c3c01bb944870ca14a3d4ee35b83017b1994821ca00019348004169001a633c78ae8e74eb00e2801b1b66600710007d70f1b62840000005dc01c123d5ab1ca80000001f40241328c14806007c1601a0b01e01f8ab99fcbd7d8b64730fa7e1fe14772cf117f78972d5d5f25e8314000000000000000000240c004438a2884023823022802054f168d8d24ff8ae368d8fafc3c078d408280ed47ea06f9891a049a0004d44074140380201b010002311001fd12008240646c98cb24a58024438bf2e3738a1c40f6a430ee3e1c3444cd8d848014209de49ecd00082222ff9e6fc01810555248b5001010648f0a06c110030788b30a3d2404821601628a2482461451c41c31420821010c134080200d00009a20340b816e6bea0a7cb22040630365b1bf060c72e6801a8c11820090b84c92b0404264cd04501b04118466f570efc800a3817a5b239128f3f48e1960000028c9682a717082e03000c8080008d880c08c05c4723789846f66489987ba81b0e217f7af15c1842b687e878808821a6510300549b64dd8801eb65e2d81000b310e320501044010914c065b07d12277cfe9b6c1c401a515e16184023f5e2dc4042cd426d2840819e86d9b240be73d689613841180400005b880b06c05417641c4a66418454b1dc7ec72ec9be58d6c4e8fe0fa12c386e214f83c78a10000142e92a82087a05da85b98202002434bce0024000a264009e0040000005b8d801fa12085a058dd9a02fc9bb3405f8dcece3dce80000000008c4b20b1cb18b0c508408208600400c820080340004a8f93af58c7689e84f693600a89659439430c31429028818e0040064200401a0001e46c839087bffa6163b97247822a4b1ade7145932a48c00000b89202c387f6fd9212181000005c49004040048f60f844800147559f08002458720b5fa010a4071641c38d046a9058ee62cd800dc983000002e0ddc58d701caa09ee923000002e248060600000005a9161c41ab310a4c20200000f5f9d080000000f61807e48215010000083cd0e62e43ade1e50c855478882650b0986f35d7a5048867a7d17e58206816ae81e40200000f61804800680e07a9e30000003d8600354041400c000072480030390140100055b1000e1920262b00a0de0c66d8470107050c9180bac6066443a62604040000119403005e94dc1c82010b453391c00118a6cbe5500f965ce881542730094d6dc9090020000394404805c31a7e384c383547d861756530add0fae5e1846b7dfcde04e62316c8cd2b7cce07d4d0050286fe478670bcb9a08bb5dd795ac86eda080263e414f348a558a61d4e462712d993c50c00873cc396eff285d9e9b1850de52cf1d000a821c1d83ac7d926c21205f830e78c7e0885b701ca7d259e2fcf6229cffd1a36649c610274da77346577336847a994a20c61122fe510d6c0001546f512a0848608001135d9c76aca00b7bb8490324402cec3c7373bd352b918687b30e6f1ae5eafaf574542dbd0dbb80400000000000000000000000000000000000000000000000000006735e0d014eec42be48140b52c72462060804dff2b6835b40a77b0fc09214f3a15dbcb781ce225dd561b18e635ef85c718145f8e6ca66256ed90afaaebb165ffc31c25004a09df4895298e209be2a3ec9dce289a6dfdf600e740d2742ed08127a9b6238221fdb7ef2808ebd458e0c018c73b4dd4a0610802000036480882f8a39274cf18e4feaf7c869071ce800b0068388392792df06a66fc6345535f9ff05067bc2093dc0b662d2819310e736078d27b17c8102808697800a928e15c82662c63a1ccb185ee200866a74a510bc680cee05f82531afb4ebc247160d8163123bad85c906c8597cf7ff40000d0fb93c36bf5bd9452b531fc318e152045399073b4db44ea4a3905286420c800402401e0200048a200154040385601a1b914cc7226428808a78572aa041d28e9feb000020be3ffb10524182300850c8a4fb73318538db32650a155ceb39581007e85ac8c82c82842010dda035744635f72cb41608f597aa8f882264daee6b450fab76731720542840332051c41041c208214011e04acfc78fe8a4b78a5333803b740f4eb7bad7ec9f51cb3b7abf946fb998520c65a0004b64000d5480608802c24000906400401c800a431ec3c7373bd352b918687b30e6f1ae5eafaf574542dbd0dbb80400000000000000000000000000000000000000000000000000006711c71c51c41441c3101100fa025dc303802bc7b6264297da071412059ea94d203000000ea60070cde499b3113183000000ea60040401f4700b1f1c00b7e744d6185a3861500a000068c80502f0d23e6be488c186d3aae806100bcf9467ccd00414d918e1000000423472c97f91001821efce679a1a86843d23a28400000108d1cb25fe44006001bcd666a6ae427eb0140800000eb460330c3f900ad322409370c189e14800909004008000ba080388c01827432e76b71eca060411826442dd14186068079e9840400000b8920140bb54097cc58300118258b9bd1012d12eb73380bac5dc1de941857b8853abf6202a0180000fb10050500200800c040013064008b40020200001001a1f9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase6" = "QuadFullFiveCase6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase6 private def zz2218:"s08aa"="s08aa":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l16 l17 l21 l22 l23 l25 l27 l29 l30 l31 l33 l35 l37 l4 l5 l51 l57 l59 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x8f685dcd, -0x59682c120, -0x192f04434,0x271e41580], ![-0x59682c120, -0x1f2db9ede2,0xe893b654c, -0x5adbf7344], ![-0x192f04434,0xe893b654c, -0x2c209b88f8,0x961b9d51e], ![0x271e41580, -0x5adbf7344,0x961b9d51e, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xe5473384,l5),(0x122b1733c,l4),(0x2e42e666f,l8),(-0x71c30b9c,l10),(0x8b0487178,l13),(-0x381818d2,l17),(-0x813bec8,l16),(0x2e334f30,l21),(-0xc54e32d,l23),(0x5483b764,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x223cfa418,l25),(0x9793a778,l31),(-0x2aae7e38,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x14acdd2ab,l57),(-0x1dcde66a,l59),(-0xab81ca5b,l63),(0x10c3d19b4,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x8b0487178,l13),(-0x223cfa418,l25),(-0x14acdd2ab,l57),(0x2e42e666f,l8),(0x10c3d19b4,l64),(-0xab81ca5b,l63),(0x9793a778,l31),(-0xe5473384,l5),(-0x71c30b9c,l10),(0x122b1733c,l4),(0x2e334f30,l21),(-0x381818d2,l17),(0x5483b764,l22),(-0x1dcde66a,l59),(-0x2aae7e38,l30),(-0xc54e32d,l23),(-0x813bec8,l16)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x1583308c04b4010000000000901c802724618108046d401800000000250188020000000009c0620080c215420803c5005000000000940e20080000000002c0c8010000006a0a01b300c00000000b404c80300000000007032004003c0841400f100400000000014062008003c0841a0271004000002105003c3010000000017c04c8030000000000303200410c1c228406510050000000003c06200800000002a140cc010000000a4280930080000002a09014c02000042865024c3014000000b0e0c0d0010000000000903200400a71101202610040028c4404809440100000002b06038c02002bc44048098401000450c4280089004000000006400b200c000000019404c803000000006700b200c0000000013018802000128240b00f400c0004e0b02807d003000128560a00e400c0000002617018c02000007114404830100000000029018802000000000ac06200800661444100e50040000005221036300c000000000340c801001a84f06401b401000000208840b0c0300000250440823010000000011002c8030000000045013200c000000011c02c8030000000002c062008000000002102c80200000000074062008000000001f018802000000621102c300d440a104400635006001342304803240100a60a209804b5005001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0x891dc026301000000208e4050c03000000863b014300c000000000440c80104b0720c402bb40164f1c51850216d00604d4738c703db401412c1c230406490050000009e47026300c000000272201cc02000009921404630100004b218300d10030000009241014300c000002590c050c0305b0909010192401400002c4a101b0c04000098220b02d400c00961481101ad0040000006229036300c0000021870044c03000000d84900b300c000003692804cc03000000de4900b300c0000000035018802000000000dc0620080000000004c0c80172853c184045b4019c518510f0216d0060000006a2b014300c0000001a15014c020000006e2d014300c0001422040930c05000006514c068301000018e2840920c05000006915c0683010000001b8a40d0c030000006629034300c00001544501b0c0400130350740c84010000013090503d002000000028180f30080000000f07028c02000000008830330040000002106024c02000c82407009340100000002205014c020000000008406200800000000230188020000a4320a03f400c0000820ac0c18c050488818e200f14014000000001701880281c71810804ed4018000000170502cc0200000000014072008000000012140cc0100000009c180e30080000001a0503cc02038c6206201794014000000015c04c803000000260b015300c000000017404c803000164662b023400c000000017c02c803,0x1231c430c05e1005000000005c00b200c0000002315014c020000004a0900b300c000000110f014c020000000003c0520080000120110058c04000094260900b400c000000007802480300000310440c8301000001544701b0c040000035054048301000000941d0318c04000000000f00d200c0000000019038802000003509c06c301000000000d40288030000005827013300c0000001611014c02000000002c009200c00000000d8024803000006a0840163010000001b84402cc0300000000024062008000000190901cc02000068041002630140000019024030c030000006c0900c300c0000001a09018c0202982083102464015a51410b601e9900600005388102483014005413437012900402a04a869010a4015270cf04a01a4900600148490d80254010005611c3301a90040000ac4c1c01d400c0ac126184062900500170490c40ca40100a60ce11c0349005000000000580520080000001b07014c020000006a2f026300c000019c5b0218c04000000000540920080000184550218c04000000682d013300c0000001917028c02000000622b022300c000000231e01cc0200000891d40463010000431d8300d1003], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0xa26bbae45351641135c676c288219952af84020d77366f48009c616f908a03ccca3ecb098208c0216591bf2bd98b20514329e4db7e761449018045b55725101158acdc69a96380f3c833fd9050405c905d4779040800003920a60082157e6f086461605459db0fd7209804841701400008dce120408541719649908b9b51c4926b38b4e991241c549bfc3a50c2bb590b9c9419318861530600000008ca0140545d09f4aa08009482b468082600c05a0080007c485988c1084608013a222f09dd620c6163a462f4b6b4d52c62b0c1ca1835648c6ec6706230a0818e11cfef512c12204b8676cf1902040913fab8f41828065bb29554180005a4440e1781a00008488220ac2c80744c89852b76590dffc21d8944375f1723458cfa3149880c192b055abe4801fc402811002f13b913c233881100430a84aeb7b09f05103535e964984b1c123ac54717962296098823d330307d11e128345065386520c5acd001f448ecfad1605c861db410211f68102b0200000f39021158100ac07c2764dec406601ad406108982646331499839d657a1dd4dda50e7d4f468758c41239f3d9dc75c0c050a1a48b7760e280411495fbb0dcf10300709d2392e4300002dc644101902000008bcd10f4c07aa0c6f8170664056a6b8c8c3a271918b901f81563ca52d965ee6bcea5970055f690515e579c78f82ae1c1542c62462441c01800108b90fae4aa508f961870bdad1294b08abbef8e3d16b82c99de44db2879f4ae64876a16d96a62d87f42fa6a496a4c500033720012906a6b8c8c3a271918b901f81563ca52d965ee6bcea5970055f690515e579c78f82ae1c1532441c418214010008001011ce486b6ee66aa27a42e100267e023e0ea33a71eaa70498453f3353d57c22d97024c3bb62c9a1f28001599c794a5b2cbdcd79d4b2e00ac8572d438bb017bb3405f9376680bf1d) <<< 16000) + 0x8649dbbd00000000011bed20a2bcaf38f1f055c382a8406286282180080a22232de9d0b7d80c914b58242852119ada898a418f7f8e2cd949026b996867b641c036bf55efe0286c16fc15ffc3e602a986394f4000db8f0a9e42a8cc89757990da2df7cf9a3bc5c204f0aed283321c307db93b0b530c7cc7a0812ac4ac394cebb99c4643e35b2b20d4c8009042936f64b1499491a65ccfeb6a768044ecb9aa3b7e613a21f01fe9494141e610d17fbc1b714fe08279e009ff5d67b66781f75495d0778955f0e989b44ee5f05f64bbac101c098f6d1c635ccd1f45b0000844776680bf26ecd017e3b0c93b77a0000000002311431811010c1180140100003942df71307b9b4518e79c96ec3402a361c27461a5e2261f308b9c3589d400079085892c2c08415e220ae098568282b005c2f9bd88cd4e460a2e688e83fa1422321389134c8002511fc97ef180438c0fda6ac50159df888872509c37dca8b4922a3f9a6ba8d8220e1d552ea61c2a02004580b0a1a284ee85a8e1f936beb96c8306248087a2ad92102c48a3393020408fd7a64378609cacffd8d18301413f9a6d52080007405689baa890becff63121b10385404091236868baf3348408ca7a940ec01814301610ed8272f881807bc69fb6354304334e3c72c0543805688faea9b3008011dbaa5bbaa908416fcec167bc8273038c1881e287b53b8cc3dafe50a8420bd283da4917a3d8fef36a80e183cc5fdadfee143061ed3c0f2841043ce1cf15e040206a911397e9401cb1f301fef0a6047042f0386122699cf8fd938b21cb1d41809391436a55c16388101852e2aec0563124088b0de5d368e44127238a4d7a660e193b6e2f555182408b538b442fd56a44001781c2c8fc9d7b82a38e098a942d0b1ad098b87114325af584261850d6e945dc4082466242f870874d436664e004601000016a200071442ac2415413011090548080017d08004129000a4e21504ba2188fac5be8252870876f6898a508143b56998825f244a24438cb37c890dcd1dcbb2d0a20352d5fd1f68a0700a7cc83aa8b40c012766e1984e1785c0417016247b3829d716152051b06601a47f14500000574fec24480cdd2015a62431d94049226d203501a59b820f0812b69b98c7df0801ab37206d450000009b46099f40416012000086085384e8701b8eac7aef209128947c9ecec57204629efde85b13490c5521dbe12b2220303d6a4f9ef5505040e9a0afec8351c01a3e37ac73588300654d5441fed64ae610106407891d4f043a61581231381389d07314500000769ce0489a7c9c2cdff480e2208923d100a084949f0fa50240304dd11ae601005b016a691800000034bc046c40415810000083881a82c001180c8eaf35ee6e1081416629bed28e202c4d21fc620383469e166e385477c98324040403e90a11b0c01607173fa80800e9f3384b0e4021380820586302b4685861400000d2c781c32c5aee41d2c80a8a483977ec1c200000d2f0004041135abcb0d0419b9e2df5390800e52de511dc14000000000360912085403800020e214c0a0a50585200800109485186828824142020a0010006aa909f2d84f16c274b61385309b2984d12c264861304303319c07853491a7861081cfd366102089265b504004b05349e1204110042c709fb343c080eff792f8a143104016fdc6001d8364d70c0157b8cb3410013bbda2b0982088020000272785147dfd728a0448fd32748408ae68a94b1800abb386741800f56162502001e5eb44d8130611804000050084b80c138076412516d23480f3dd79bbc50004dc253f230421008618036c63be0c100503d258082bc8a2455c5800f250ab40301231a3f71928211804000043484b00ee0dff3f9820791a6cddc1bfe7f2e30b5a7a3504c8baf1dd6c3345b8aeb5f47a8feaecdb390b9db11058ca35d11f3e68000000000000000000249b00b58abb7931004f97682a638c2841023001801001824a5d334607ac9de8091e755def044d9381cd67377945e12b5fdace8207f02e507a4a55faffb2c762a71d53a62dc331145fc978d41cf0f10dda8f2d662c1405bd4c4ec1a347e50004b620701b0950d80037110941d8498ec248661222b038150480ac23c4611c2308d0984602822c0521da932cab842dece042367efcb0c56ed5eab2707bec086c7e4e609eae415e08b857762ce2451c2cb6a30529ec30946944a60400376683d1d386678bd16e3e6b9ca052cb9e43afcf3c73ba31279b5953ea14e4a330220f326b5f173da9428c0a14598202027d5b4875d714076c05791f213fb809519348a8ca62423f9ea2a55730160f888a69d1dd3bcbfb26b3769d69c134825d2ac66eddea63b310369c1c27ae48628a65aa1591146591b4e39bf46d3a8878cfd26e834c5718d9c0693ec32a097aa768519610670aeb6b3d726da84b65f0b6711b1f1dd6598655e09f601b1d9750176458ee27151ccc510e4286d935586e61304b1090fd4cd92d1b8d058c1701c0c3c2d8eff2c29c153edac0eca3bde74fafac18b6acce6c3c572f4adc752862cf4de9edbce7a2370d946c2fb00d2101175787207d1f9037594d1a9aa7eac94de8391305ba0f983fb47fb38fa0e1c9523aa4a5c0fc6ea6df7b22a66c6a9d3f80b6812f9817cdedcba0820830a0291297e0d3789db2ba64d583c992c902e7baa4ae37e25f73f2958e080e03bdf77208b783219a45fd546bc8891f5a51689cbd26e6498f4633e53b6e6e5888782206ce8668ddcc0e7576c3d5d7e61e65fb47c1aed20dbd21d8b661b4d9f13eb5adf4815eba622c06677ed623)) <<< 16000) + 0xdaba79bac3b96b376050d72e19948f20eeb2012bd66f6474b4e1e7cc1470fad20b638d209e6d916bda1ab24892ccdbf513dfd8b83962ac6184e1b4600023d884506e022b466b0756c513ba0411752f7d1b80c4a4a01c0949435f402f0d2030a0f69b444d1f8dda47efce00b318a0a791ade5ab681c13dda057bbea0ed24746b223c83d4a23950d9f50525b1a4ddccdc41e4d97c97094e5784b2f3f32a75c06ebf1c1aa8fcd2a0080874fed8baaad6bea20bc429380eab7090e88b6177f8bdb45cb15cba0dc43b3c2d4dc092333a6833cf2c1e5bf9e84c72c29097c132722923f199c46dc5163e18224e49258f5e7f1dfa486c95f07bfc1db42ac564723749db7e0c14e602b22dcebdf699783ef874b56595071f2f118e0e3b1abab5040356eef04532a7c483f179ef9223a3e3a12f40d5c975061b3c9e09296e9bec8804877d774de3999fb6ecbf3c9c2f271bd1beb232f402c65833cbe278a56a101832251c59e05e96cff393c4366311885a00004ad9089158440ac21c5610c230851181c08c09c441082308311d9419b770579633214e2c5e58bac9a93008a115c2639ec2000172849a8128611004386224693658e142b396e912c5fd88ce574a00586a55d51c0092539f486003b129e7114023a9a3c9c09c30880200002d27441d348c1ce6821c245676d4c837070ec2b5b561eb57c956b64d8a12b2bb1ca3d4b8950a4f6d0898b890d29abe75b658963e2a836c1012f72ac2d012df727487f6ec166919545ade673c96c055bce2fc5006411b1215978bfa2b90e8f8afc57781063378b9555df44c41a0084c8ebcb0a5ff7e51c28eae56a7b8fdebe47ca47a7c590c14bb0f25fbcdd9d11792361c6e2ee841309760d7c5ae74821945480004f221042b0811584008c1fc360fc1b07d0983e04f8dfa7cbd37ce204a36a87a3816dd65b704e00bb2c2500900088021c69f84fbe38712a57cecdd9c455cb9998250000076b6d0c00360c702f28011004000041ce98ca7d31fb1a42099173ae68f2f143b3092000131de284808440100000db385c469d6e2930613ec0acc640a029d82238a080437383b12004871c0ef1c0015c2e2e693041180400004fc83d86c1e8360f20b07801d8c303df66f162eef7c0d72404202f265110000974f80ea08c838440100000e720ee2b02f01e880da295100a12188a8ac90a00bf1b0a29511108ca08c020000184405444000d7a6c219ec075f7fc8f273fc2b35949f91d9da3a5d0080ad824a9de180a17b9c163b1623964d545d2e402c00311356d2b096b317719283b1141c2206e00e04005f771f6ce08a4dc68162d67b105f3048c3048080297511b60b8fba689d8b1858b454263a791a61444105ebcedbe6708268ec98a0edb7b5391aaa3825834176a9922dc8bc13bca1698cdb88f1e71e908800736fecb9e801aaf58c677c76a829a4b0ea0001410800a1410332581880f81e9c32027cfb55a5ce2b8ed4315dcf566cb24626c7d1e7a2ed5430017b1bdd23784016078a9c7968d666eb89a7e72b78b72cbb544a810edf2318a8802b5a6fb24241a51e6742f0e9c63368bea5990a102313321b30c0e893ef113c36cf7f37a70640ed74a2614d1c00ac2870bc4a9deae00b2cf341f7e607cdacba8a82da812d77f039356b49afc1a053180c23af75a20db86ff94a33353052064799655882025592d7c7028e536818241040008804008020000088f1cbead0db1008167ad2110096b299e0046183e0100000a7386062757ec100156c0cc01034e5d5f68046203e0100000a930140100400001110761983a8cc1d0560e61b0720983304f8205f14fc14404e902c4fa0408a8403fac041beda2f7d45803a0e534705001efff38a2a084c4046010b200914d0b890108f1f06bb082a9e95479c40001b1965a8000b5dee99b2a0928e1180424316ab5643861d833a61051090a1080201c4077a55e82c98f7ec97f31702a79958c6d7d901595ef58c0aa987778b22ef5ef046b89733e152f079bf5e3aa6405bc3b79219c0000000000000000008dbb3405f9376680bf1d8649dbbd000000000119b00b58abb7931004f97682aa612486186082dfc40fc34b3364fb7161543ec922d01384927e2a1b91232cb60c8af4d1df715668c2c79af9358221f458a048cd7295103bf8722fc3948a5d11fc3cc9ee4c19b9a2e46b778bd38ff3642d85f83567a74f6f106dfd055613da0e0120005d92000d1a4001f088378e81b8560da2200096620d843e0902011966384121075d12c072f05bb98404d61200f84090508402165095b6f23c708867b0bd02054ca25cb110231421008000059106b198350cc1a4360d0130670583302f02aeaa2af80348f50703f72a06b59a78eb33a626d91f13f352d7845538e21e10b11e34655a307a724e4398c5dbbba928cc5026ed55d3a95714e459f1df8bb5ae16d7e817b6efc27fdce848486e3bf8a37c753487bfaedd908ec8edbfe02987777d9100075069fffadd3576c64736f46f667a01208056eb08b43b3ee3e1979d50ae9a06f0317767b77fe569bea3d50d8147244ac50641e1bb77f6104ece51394c05d98d74e909e62a287ef296bb35b4d40a8e9cb833853e9144a44bfcd0c12bc4d8933b7842024840da2d718352e502195fdc982e44c33a507d5792887263f21afc0e47de7414e2484ed3d16747d0db3f09f7196bfac0019404000f924190240014464005b38e3ca52d965ee6bcea597005527f94f77fd0a0b2eb909fcd06d44c8f82b0b25593f10af0910da0000000000000000004636016b1576f262009f2ed054cb1c8)) <<< 16000) + 0x1c6041048003006d2995b192bbd7bf22efa39346ddd1ccdb143fa3a13ca107fc5a98100aeba7a0b5fa80399ed74a90fdd1af65e070737d21e69ebbb4b446c6c19d468de180a7cdace84165b96512718086341ecd61200ddf0645a82005d634fb70ca1048010920213de76c0e10954785a0082d6f6e43d040005d555a8c5000d8875570ca1046010000110200047e418c460c4230140983084c180240be1305e0982e84c170260221205b0582d008001d848011ad90052ed38d2c9f22769d7811ea97880b55f874bcee15a888248eeda96cc00000000000000000114c54ee1ed7d4b454ca767756c76bc3602b6fb51c747da3810b7e000000000000000000000000000000000000000000000000000006821861c310304118014050145359ecc3ea0444694f0b3c5c00ec93f219b62ec277c5155205fbdc138e22b84ed5f034f0afb468c910aba70a581cd59e43cec18a1dbe90aa044d99772e9ab3c63d053a682c868160240ae02056010002c9100644f200fe407ccac636bec80acaf7ac60544a1871080c60c40c70860860490032100200da18115aca22b438947d6b2358a2033eb2d809f10c1ee8c59556a040c09846889f8382308448d16f18119ef6de9098400f0d2eb61ac322020a40800003a670a0134472c21cf9a0b6ba13f151947b6e4ba24339fd5cac865cd088ba53330189caa3a0300e12eceea8473c58f229bf8df34f146f2e82a450a077c7332c489dffd8d9cafdb6ab2cad3e818480a81335492240715b88b8f732d0d5872b003da0969eec0b7248984119bac4298f911160617c6749126fe4fc38ed8414a19123400003fe20aa230541182988c148460a2230500dc86d13589e971831f1718cf88a162d8db8a10309d7404713e202a319d397f2400f66ae3618c041426c412040001080168e0a2520709405121bf0ed0c38384636efd638a141cc85702184825676310a0b7123801c2022c71ddc9020e88ba38180a24e3844010000171209e1a027090001b810352102700e46417ba3572c42e2e648f20318da5cc72429d109dda2c1011e945c200cb390a8249820800200400b01f0182600f0a1f5e10553051503f2b5304951d97b6303985c0cd60400001352200018b661aa98008002009203d2c7d752da0d1853e36d28d1654c30838d1261823c341040005225a5002000879e166f38f9069132021ca8468a33549456c682048390e3a78006b06853a6808ef11dc8c1000000dfe573801200400005c48001449c54ee1ed7d4b454ca767756c76bc3602b6fb51c747da3810b7e0000000000000000000000000000000000000000000000000000068134d30b3493461863803401800c040080340008c8d0c00005dc030260998d0d0411fc4f33b8501bb5c2b481010d79553d04046fd106420982880299830840200002ac413424000f6a68ac467d5105885d15576e2878a329450485fb2c15243025dc594521823349a76c1026ee2db98401786f248894041000400801603e0304c01cacbc5b5b85114398ee973a8d21fd703c93fca7bbfe8505975c84fe6836a2647c158592ac9f885784886d0000000000000000002324fe84300c681683f910dc48605a1c51829220c21606faf84628967e8e8f0577c49600957e1a6205f82eb868de15c81fad5ce36a111f687de2bf7eeb8bd5d95f706bc7baf3991226c0d871f8780c94d5bb4c36282811d17cb0219794b1a34f0efa8f8a146b333e9c30a1c2a12ad30200bab56304081391f728c00145b32bd380108042565e2dadc288a1cc774b9d4690feb81e729b168dd2c99d2a3f6af0548f3cf20a14614804f008002030000200d00016620005ba74de66aa89660d245c887c939346ee1d107dcc80c221cfff671030e06fb9c5ce0000003a9803406ebf55d46c6006656e29750a4041300a00006e0f140333c566305c9af1ed31220c7f3d3bc6103a5075c2504164d82662c00013255c92000ade92d59c108402182e2730959491076c1aff6504280d6ec52410569315a8e003c9dfbe01000878b9dccc084201000013132306ad730d163428b1d5dc00464116222074407aae040611ce8eb3ce60a195773b5515b84823b97c1bde680c0891797fb08ac7002b6ca9ebf551a01697e2792990bae59082e03400011d10004ff209612000e57200206a6c526333e570c39469f6f8142b97c3ca604144cfdefa24023c88fa21c05e38dcff1403b7d960367042000802100c1000609403e2152b50a2246015dec8861a11c6e489800f00201240723480dedde1030485fdf44020d301d58b03ab0fb3b820052859b425041f00800007d1814724fe841b6104d6687a48b0cb0c76970ea17024302d1a1698a0c0827514ba22034020c9b83f8e0c002538e2c0204a8b84150120000698f105df1f1d8b201b58c578c35db309a42010ffceb5b2000f804012407233bf094132421c28f8f440218ce8c94b0318441a202003b4537165041f00800007d1a2417a0e6b7446a40a0fb1cce445de104b2cc6e183a1a061852d73656c4f0804585f7b7390e86802008965cd0e830014031e3f150a14006d57db28c36568002020c410000043640010b48003e890480d0178080026b08238cc0f0460761ba1023bd5e2f8e0e20686df33cfc1411c1396bb8d01024253a3a83181067a2d41f1cb0e00ffafe1bae01400459e8c2fa8009756e2a5aa41f5f2c10bef16871c2b02458a163fd925e343043470b2008c4105833efaf583c3820022b22186c0820de95d71f045003e285fbcd523000034089f1c20005aefff91c7a801fde6387812351c0c16)) <<< 16000) + 0x0143060c6680499c246000003d860104147b6e398c28311265c62101c311a13c5be20c3c415e2f61f0c20755199900002cb6ebc3f92a7142801860c0fe26ee69e388041bbaf920208b303a04f0438661a6e5a312186678bdd892430202bd2c42605810a82f174c6a10b1ece8852517142801c0000e210003a22000bbc40e85408c1a038090004229b0c984382d20c22eac3641c80607cf35c91c10068136d4304802c940d2400113c62c0700beb607d7519c4088021a2a343772e4510cc54db48208ef271600283e9ebcb548a1a52c7d7c4b001484b69c4800aa72d132704210084acbc5b5b85114398ee973a8d21fd703ce5362d1ba5933a547ed5e0a91861840a21418a18e09801401804010068000b41c54ee1ed7d4b454ca767756c76bc3602b6fb51c747da3810b7e000000000000000000000000000000000000000000000000000006812cb2c71032421023002c02400c040080340008c882282800150c82206c10c1762942dbcf696192f61b428c18b80b7a68a1629a5d4c920237631978e0513a02738a00bad968ca4e10400100420582082c1000607e03e151bbd80c3086ab1026482c6f88ea2403f674da0e012dac7865001d00801f00f8428dae1ed182000507970820bae39a6380922bc68d2808400080000d23e59345990279236056a01429038528e5028deb6648e045005f98080ab19e3033020f00424ff29eeffa14165d7213f9a0da8991f056164ab27e215e1221b40000000000000000008cc3c10dd1ae8945a470aa20a91e79e31421e11611a01800c060000401be7da8d1f1bf0f2c089307004406000005b5010300001774e86181c0b0f8a0f083e6e425ac5840000029aa3c023a40ca8f50004a0100001a92000792400140ce2a770f6bea5a2a653b3bab63b5e1b015b7da8e3a3ed1c085bf000000000000000000000000000000000000000000000000000003409861841819a018014007d02b060680340008a4c0c63926ba3841f472981c11dfb1a71206c09984470394bd2383004c868a098007402007c03e1299d9def081959b5cd52020ad880d03842e6d472870426e3b049c05d5d9f530c02ea35eae4e083e010000150302518b635818488bfe040a04a6cf3db8c096453d0b340c85909ba480365d153c1006791767a4e103e010000151304b29410535f880c00000b89203020b6490fd3688040bdd7f91bd0c1141145e44fc20451b7e92b8c34021f22eb97494262866c5a0af4e18540480001d12000bdc40f424001ede40044dc81e06c0ec2723039ed0bed28284092f2a9ea3450420b836cfab050800000910501009974234963c1c12cf89f25220083f5ca36892ac00e4a711341c98c7142b02450c102584c674246063c90cc380e280000255a8070525e80cb8a42822f255dec6a0418ccb65c4a512017a1f177a5c5001c8e9c4ba0aa668142901c0000ec103a0d01c8280e00406e02000425206c12001cc420091a240d4940060281073e574d21927db2610947100e92596cfd20cf3c18fc605cd53f809d41ac226d6785060034f559339a8158421840500256183e39a32db1508400f528eeac59cd6b7173b1544115d39f66f2f19c2547a831d1aeb409b92ab72b5229a5edb82bf53142805e2041a099f96391c181850465522c80141340b3e2bb95710116f29389e97a20032534dc06d020405271185f80a955103711d5fb1e882b33dd952be60d2db09a55068e3898a0c00e000047240d0840663b0321901880ec71dc1d45b122950c39db4714da3bdc7a40044dd4ba31c09fa50ff00800cb53a05802610210085091d0674b840899e3533c202494cff224013ec52302120410004287c68a37522c411128e221c219a8ffe21015df29dd72c0436292d894008002162d38575de142aae020fb0e12ab79da2880888b17994800400100000d1203c020001fe205e02000303204c2b025158120ac08c56030230170df081bd6b42f8c0899ab6d78041e8c6764444801742c7fd870054b72b27aa0ca30460100301181780e4506ecdc0a84061e8e41f4c30e9c8daac6160828a257cf55090608c021639461f025340d6f3d09640098c0f52070002fcfc488027c27ab4554a8c0f802000040cc8a0083e4d0d690252a6488082d8b8644f78d5f45861610eb0e251f795ca4061a4a8f880b06cedf81877b8fb748a904650742841491c61eb5ca963e01841ec8616d42730bc68382099c1b0e51ea254b88a14cf3767540c220443493e1fdc89204616e2a351c2981291d13404eb078f9200b89ae0271c026094f8e55498608002000026a400107480031f90150d00a048001f14d0be72d300a0a217392b1144842c5217380c10083200442043924a41192002d4945e02002b4a3d904e0044010a1cbb138e8a3285ac05fc1a9060841fc799931020962187018d001cc74438930012aeceedb07001c8e72d0d14022dae8460e90004c0280001b4205c0292025b04596688cd7a3bd124235230ba08c10bec3bfa4a03d1fe57802011eab2ea966042100858de46b8aff0c2a1baa76645062bacf8638e180aa307322862a6dddc214002d79014c2802af9861e4e0044010a21e980f5418df02e0cc80a89449641630c28e19c01201000c064000401a0001de40009b48001dc981c41d2c2ca246303fc5860c0ce6bb03851c3007a46d709025e6feb710c03c083d6f598108802143a72325a50a17f68bbdc6289d299500e1001b7c842f4800420109202e304f180287641f34f8eca161826902ab1850430dac2b451020b90b5703002ea78b4b6470014f83c2fa1400f)) <<< 16000) + 0xc16f523e90004c0280001b4200054840b40400081640b0460562302a0d80c04c05c1701ace6bf5d21c316ffadf56584349126134308c2136da690092df1213e1810c9686e2e0836e3b719d1142718230086b030123d816def6c7d4870fbbd73e76fd6b0e5c2121c62052031030c218014058c32997c5aab2d4c67cdc61194add7157515cdd6ddce30c021d0001cf202a0a014010001c5102905014028003de481394a8520e09bc1f0c38ca5fcd24182015e2432f0c132556497924000b336e442000bc07eb441c0111bc81eb0270c2400840e20f186a590204bab50fe20875f8cfa70a1ca1369aaa5804a87bebc4a004401081c22ce94bc413e0aae040b04f088152c1004c21746640020008000068901e01c010040100320a00003720004b440984604a230241181186c0603602e13c3b4e3980c418110fb0389f0416f21875de0523142400860b1ea8d5f2831d4fde3bf726b712f4f127077d6c1384fb8a47c76c8903fcde7f0aab26dad164562911fb903019a3a66c7e6eb76b7913fe74e5bf3d8630cc7293952f1feb8043e6738526248d6cb4dffa778fb1e4074ab0241f5d17f883db8f0e3a4c4c59a545716b1a0794c80e0b61be6353edc3af3aed6f9056011ac9df08a7f52991b641c221444efb53d2f116c2aead7f992382adca5b072ca1cf52e43822e1d5f86abd31540110aa8a64000159480b0680541402802022010003469a151782fbc2861ea35ddd8c2c223c23fdda1842376125547045b2c004c04085d14ad1220000af53a242007244cc54c20024d7ad41aa2148e118042070a55d282344241db39d1432d70267620204bfa0e508141aeaee12c03f0d61f82808a5884516704200084903c33e7a4e1502fd6928a24a85dfbb3831d63f86a5850e7ba74c309aa0e9e30a000904e7b9c007c0212408637e7f88261986b081c1a345ee050612a4fa1b39c01c30f5ea120063f13334c004001000012920005244084260401301f0180f00f89b54cc0744921674580030c0e9a11f0c01a921ea990007c02003a0301c01f95635fec4058a112073485826131c76a6804665659e280114d784a4a0840010b2c06ae6aba2c3ca832b8e6ad0ca29d6f23d1e522c4060d9c94b202082bc4556536281050cdf5f640f0172669ce3da2c00104956d9d4c88042a0200000ec90002f332481153e71e348bf6f2d3d64110e681cf6080c1ba0adf3121086308e5f3800000ca6ee4801e1f9b9d48005fc29f2f0140611804000067cf9380f926c3c6935580b061f355b3e8a09479854830139d8c0f9400740200360301a01f129c27b998a10042b78c9817fffdf3f3013d3152a82022c9e9604a01ce7589f84c103e0100001273a6bc18351823adb797265e6aeff7df05d98fefbcc757ed00a5280000000000000000000000000000000000000000000000000000685893dd9d658a91412f1efd63edd2637b45de6a12061b4e4fb6dc00000000000000000000000000000000000000000000000000001a0c7d7642d179f6448363765654193981994b2a01bdde1923881075501d302af5b15fc4432082032420c13802404d986d9c40e820d02787e0661372de9f3fad1f812c98b96949d7c2f4aa294c454cd7f91aa5839e6a1922218f21b2d24658a0d8d40724dd63ac595e60a8dcc18cc6991d55aa32184752be319764544c067ac79fa4dd64c7b5460d6d5468003cf1000a1320321200100220028ea40603602e13e3000ec050ab6b32d71d081400b231413877daa13c28a713b2e397212bf80302c20b106f8fd0640d52c19009e625c6c7ea8b14211c6042a45129e49de482e6208397ecd224df5de12dfa041c8b62a295b220131d13ff5b3c905c51242718f294b6597b9af3a965c01511c62051452011811410412001805532280200d0000f9202c1a0150500a00804c040008a64006bf88090e804434004caa4010b3080245c9a1db5eb3b128cde3043824ab8ac5b60610109d5d9c43c0302042760a900100a0bf41de498bbda20298261ba8f6b1060292706270e98410016b6af5577e628a821947a0b0c80f1046e8dd22daf10300261586fe9228080ff50439220000002ee0102126e9c4af18e20000002ee00a08007f98b9486001694cf423940214004208cc4f22a63e206017c7d81f82440000008ca020423ace621e8141008af746fe2400019b0cdc72000303d440731800000002ee02804280080000e190100980784c0380601a03b2cc976478a1437461e31d824623cdae1ec306480532b1c8000368fcd38c016df1682a04002b90f8f01384118042cbc5adb2b5402c72034a3129e2870000009c402c1027a6048a1300003bbed3622400000001f400800006664f0c27042800849fe53ddff4282cbae427f341b51323e0ac2c9564fc42bc244368000000000000000001184b2cc1cb1ca1c308208b04b00c020080340006a48001a99c54ee1ed7d4b454ca767756c76bc3602b6fb51c747da3810b7e000000000000000000000000000000000000000000000000000006812492472852452802401c002e180200d0002283248748c8e9d6490192a9617c10460306448e24881884ec48110212c5b38714388000001770061800001770028410589e0260c006213ab44401910260040000f5100c0900049c900b0980502f0d02406dfac461015d5fa1b50c10f8415046e1420000005dc0082000002ee006005ea715276080002aeec50c0000e4fa6a520000003e8205b921380200007908048a8003e1c80404801c2400c0a005010020080048f8801a080084400202000010057e19)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 24 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase7" = "QuadFullFiveCase7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 24 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase7 private def zz2219:"s08ab"="s08ab":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase8 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFiveCase8 private def zz2220:"s08ac"="s08ac":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase9 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ private def zz771:"s0303"="s0303":=by decide+kernel theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFiveCase9 private def zz2221:"s08ad"="s08ad":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase10 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l17 l21 l25 l27 l29 l33 l35 l36 l37 l43 l51 l54 l55 l57 l58 l61 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2a9d47622, -0x596827038, -0x861c43920,0x6e0a12c], ![-0x596827038,0xaef4959ba,0x1cc2e2608,0x821c0b30e], ![-0x861c43920,0x1cc2e2608, -0x2452531800,0x596831ee0], ![0x6e0a12c,0x821c0b30e,0x596831ee0, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x93cfc4,l14),(0x1e7257720,l17),(0x5895ebabe,l15),(0xb53ef512,l21),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x66468eb84,l25),(0x2cb417800,l33),(-0x2cb417800,l35),(-0x17170ff50,l36),(0x2cb417800,l37),(0xadee510,l43),(0x2cb417800,l51),(-0x71ec4e20,l55),(0xb0d5172f,l54),(-0x952e2495,l57),(0x370392c,l58),(0xd1703e2,l61),(0x3bda0e18,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x66468eb84,l25),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x1e7257720,l17),(0x5895ebabe,l15),(0xb53ef512,l21),(-0x952e2495,l57),(-0x17170ff50,l36),(-0x71ec4e20,l55),(0xb0d5172f,l54),(0x3bda0e18,l62),(0xd1703e2,l61),(0xadee510,l43),(0x370392c,l58),(0x93cfc4,l14)] def dynamicTables : DynamicPackedCheck.Tables := ⟨70, #[0x780520080000000001f0188020000000000740e200800000000a0603cc020000000058180730080000016012004cc04000000000e001320100000000007c04c80300000003e0b013300c00000000121c0cc0100017031084035401000b00c610c0229005000160390a40ca40100000290d84c0950030001443308c0954010000001103c01ecc040000005e04401630100000001682402cc0300000b4360900b400c0000000160a014c020000000007890330040000000000140c80100000770550317301400001c614007dcc050000000220d034300c00000000000c0c8010000000003e009200c0000001e044038c0300000780410026301400000008828030c030000000000240620081d515c0c703ac1006070c55030405a0401800003b0c84c0a900300000f83215032400c000001d0d0a0150020000007c342c0e400800003e108640d90030000118660a00c400c000821a41600d1004000000006c1806300800000019830028c0300000cc321100c400c000001c8410134c040000005413007b301000000000f07028c02e30508195020bf401c000000000dc02c803050841820802e1401800000000005018802000000000048052008000021c2d40c5cc0500000818b001f7301400000014884050c0300000004219014300f9b11a045c0571500700000000000903200400001dc2540c5cc05000007189001f7301400a60c210404ed005000000340b007b3010000000000b802480300000000024009200c00000000016014802,0x230a018c02000000000088052008000000000230188020000000000840e2008000001ec220058c040000000000680720080000000007802480300001706229026400c0000166218011cc050000059082006730140000017443005cc040000005b12403730100000001689805cc03000000551180973010000000000b0024803], #[![6, -21, -2, 0],![6, -103, 0, 0],![2, -17, 0, 0],![6, -25, 0, 0]]⟩ def dynamicCode : Nat := ((((((((((0x926cc5a45392f3ebb0b18000008e6a7b5680918130c2a7c1e534709142a13c3a8e3dab2090360b62922dce71f8600029c138f890c920001bd684ecb2bfc2090b9d37d14518f8c271fb30a1e0323cf41a2c000000004470058de00000000044259261048a28658460040000180001006eab6c296239fec4460440f3d068b00000000111c016378000000001111e51a51a19818209401205c000401b76e800000000f521b0348bcc11eb02101826800003cf4c018aaf0548e10d10b0c704304b00a02e000200de2820f9d52e1da05670910ed9a082a6bef3440000314265a8601e180000835bb9c100d0c046956e00cc820380006f76f457c9641400071d0b4f4819c00000265e84aac692acd643a000e41800004be0030000f6c00a0002ae001cb1c1807e8a3a3410000124f80b0686f06181a2810000124f80000005a93a92ca801300a0000478e900f07c640110ea5d1000c004200002008000022200014c4134140980204b010004679e18cfa82638a08d425e550604d52e8ce02000b5a7f82a84830400100000dc33a3b909678000000000b0c5603649d763ab3b81303cf41a2c000000004470058de00000000044448a2064844801000000023f642e6b0ae3218bf974e1da87bac0efb5d902b2b659aeb612dead9caa21ad200936d9375f270bbeb12699b15db7c0112d0afc5b0fa1a74c41634a2956465a181045381e88213b7f42a6283f7c7f8d96604000007d00a019b5e7dac920000005dc098008c02100001004000011104e0502682813004096020001cc381531b8476aa108c10004000015c8002ed1f3d068b00000000111c0163780000000011090214190104110008004000002981401006c8675b080ffc30e831cf98b160000005dc0240730b898204000000177025002300840000401000004441281407e0a03e0101e808000674c196f066340200b4e80f8555088608802000010c4124040007164038) <<< 16000) + 0x87c28529b7d820bf4df0dc000b2186040a8013281d0040000571c1e0dd0343f92eec690bc60133979698bb6e8d8f162f386c880000000000000000086448497bab45a1244cdc58045030be5a62d357d5e2cb016932200000000000000000218f3ad95d259759a9739f3991f65eaa49cf319256bcf9130aec00000000000000000846302282300280200aaeaaf1e9728a9389b9311dd3acc80959067305500bb51cb9f8b248bc254cc59ad66d5c264b30577ff9b8a860ee92504d37c010c2a4339e9d63f818f04cb382b7569eb40e6069360b1ffe85b1b75ec698fc5e6079078306d88a9ef15b08e3eca94c22cd400404000d5e4120054405d6b2f9f2102cc52ab34e6922000001a5e010226f44375528e20dfeebd235841000000bb800a00dc10627a980029450f2840d64f91ecb127142801448d260a67bb302c915bc072fa48aa9028035bf35c9c02401445d0d5de8040001ae0337b60060000000b71b00080000000f42400fa0e005e05804701f1803117fe928ed15e1c80ae68ac1be48357fad070abea727ba22b4eadb48013e62b3c783ef522407018f9c54b754dec225800033ef2e475e2ebc693916c934e98011024164427481588cc1c00000bb8058f069e9dff9287006e0a12c0600044e20b7e5002500800008b0004c29702e89e13050299bb5a46148c8e1560104065c5185860d64cb08f63000d3aa9bf4602c26b46029c00880200002c6400137481f8280f80407a0200071338503347a0e88a284538bae787122c4e3d208406000005dc01c37d24c268c0c1803705096010014eaee45e2a138c12804000060c8070ce885ee6735c2a48d0d2f552c6881684efeacd512200f798dcb028301a6aaecd82060ebbaf4fd450867656f198900130b5dcc450c0102fca158192004e020a22e28020ec1418609dc7ab103348aeb59c104d34ab9618a000d24d4260e006a32f8131003790531273801180400005a8e146a1c710ab8514aae35944e8712e93e2c825880c00000d2f0070dbbbf43199860c01ef2d54601043727a641086001a130223681002cff3f735494821400a00007e482300811404088020430102100810404000c0a788000007512060d9cf0c5e2e0a17eb1c720b5181000003a98028299c5afb75c600cda12e7a00a026ae3086ec5540014c0022554e404e020040010000e99b2ea25857649ee594b56a2d2645d838bd5ea909ed7b4eb6350a00000000000000000045b8008881451480c50c500400024ae8342be7ff17d898508002b86a7c387c7c3080238f39fc508040dca7c9201fa26f350200036fd1ddc2800088fa6d898108c02100401004000011103f0501f0080f404000370702ecbdd880902bd4a5488206de096b65508c607c02000015a40386704046a61b43ce6184908300d0667f367a75ade9c52adbc7b9fbbe389dd9372beff22ea07d42ee259d2602a84cc895623a6cdbb6e7166357646e07fc55bd905d19930b669dbbe343e680002f33e0e80817d3f88f64f1bed645b46d7fd02a6dce9c66d3fc4f56a5a2798f99615143d0f1e617bdaacfac50e0b80ce9b6a33de7a9ffb616f1bee3ee127b27e1cea2e8ae99ef6e0403b9afe5da953e0ce1a6232626cf2173a5ef70340b3f13649911a6c0d2cfec869b343802f657dc687c3e08dbd83dd368ff81ec95e4fda57eb77223987b94e9135bac820e29ffe558ef903b802eab55efefc243004aa6041c49ea84275baf4a31b57f29ff2e668dcff1f78617314eb761dc8f80c94bb93d50b87748b0a78f39a81772841425b2ea9c10540d29ce82e11120c4600024ace0f06e81a1fc97763485e30099cbcb4c5db746c78b179c3644000000000000000004322424bdd5a2d092266e2c0228185f2d3169abeaf16580b49910000000000000000010dd2bed459ddbb403f5889bc356ec63b9e37e1f946e42e82091400000000000000000431e75b2ba4b2eb352e73e7323ecbd54939e6324ad79f22615d8000000000000000010bb089d1460f23c21b7215e93d6c6771deaef118b8960739f8800000000000000000000000000000000000000000000000006251021801405563ae5a609833f10b8783a34ee23d75ef8d7a655ca931268b97d660f6f567c8b1cc10103bf61ca5adcb927e991decdb154e985e93495e23ba2c457e168b0244aaa5fa2888b5a8fc702ecb7a17e2851504bdc9bdb6c5e274e1c189ac1f7c74dece65911fe59edeeb7e2e1ac3c604e55af14d7dec9cb7ac1897a356e7ecf9ab8c7e69201511be7b50fbae6b22fc887089ecf1d797995e97ecf2d7d7d1875f0adf415ed2649f614714dd703b0b925a6457f50503c010005d810019a820761b03a0d80166310393981c0cc0dc3406c039f1c1b35e83ee9222b12ad1615359d0ecda079ff524a5df6e300000000000000000088017d8dac5669b444cdc58045030be5a62c841e28a7b2ee1b220000000000000000021dafa6439c738166306284302282300180aa127636bc6c5ef507e1ce18f0423e31ff26216d20144066b3ab62813d187017fd05cd05c0ff6714a947f13ed0b84910f337c59c0f840dd6663739aad20ec3ea8d59c03fe3257ac21035884b113bb8284b02ce37ed9f374e697855d4ec019024c4653a5e0f85862b01b29092810517824d3c960a50a4860c50860450450020000154094b34d631fa773309e461a1def33a5440db9eef8e59aed4748ea2fced20d40450e257cc76824e516eac3905a92d4000c4c80710eed49155263676f82c9e957d86e3a2209000001f39dcbf2d4d4961d06abab2e19402135bbf470ae)) <<< 16000) + 0xe02cc80c50c8086085082051d263152b8cf6378dbbaa8ae683d0f70c400075edc264b8f3c5189053af194dfc89e4f9be8e9a636ed28c296849d0350901a0480cc2406412031090001b7981000003dbc7e0a0905939ccf60060800003dcc500c023ca76f314c0a04b4ded1be9e2aa0324c66a03cc0da728dddf70b12f7327454546a5058050030010000f6902f3181708c0b4140580291cb0b654cc56648af2d5c02236c1c2caa75cbbb6b8c1143c7fca1b20904a1e3dfa7488401bab5f136b071802fd868d80ea88a80bd9695813ee05cb1aa2f24d53d72c2d02c6150c0e0700e03083987a9b024123904b4c83e84a165c171e051c48a499ceb0094143132d3ac28c180250d98b0be860035fe04fbe6034c886d44209102052038c228b28a9d0f27142da8fa5c25a3a24520e3ab4b39486081ace7dfcf9a850c5465b9458ad1210ae895e3c9d130113c2b8971a2c18009d46d604bcc40558ea3dae644f3a040bc0d000047640ac57857960bd041003090116897f76061061e0a05e298b154547c64ab2142c0a6dc4b1021010447a20171a182069ca04d734a00d32676c3051001030ccfc93ea2480158123088e365877425142cbaccc0a8110c10341bb36424c2884c5b75107ff2420d16979bcd7040883e88dd04d0500e74c2eafdf818024a46b9f05d08000a564037f7fd09002d02c000115902a010148080a00404e020260100026310221d8108cc03807431bcc974ec8941842d3b65bfa3b440746ccb66098d870c2fc52fc258c0a10b308ba590990c10b3b1bf72fc20000387bee1fa580007c850eaa2128076439417818000082c8005d8181400001334f404081fdb2c2c1de10236f21edeebf8e0a36fdce1b97460773751c9cfb23803cc34a07b10155044b98810b44834dbd354fc23486282d0280098080940400042e4090360461bcd4edc95a2e02deecab8d8be12f37214acc1500000000000000000000000001130ea58fae4b2389cadd729fcb6bcc48642e6cd7bd0449b1ec54232b616ea29eef6e3632a901719cc504900800600200454063f80a60f3bcd958db0f20a0a4798f47eb0ac6298d6b28cd761e4c0b4d4e0e1a5e271f7d2e4f94d4c0d29cf83d288bb2491d01ea98e2646f3692296fecd52b68e15150136f5e299a086dfb094e6cb587e2ab343e2dca7661c61616e39ead11a674ebb3bfbd3e8df0da1b3c6a9a93a0f6ed40b38dfb67cdd39a5e1582fbe51409000000f9c772fcb5366ce791f57f75bb90022a554e59c78de5ff063f997cbe6ac64b659fb2084fe598d237e94800000000000000000119cbe5858815d577b2f5d68b8f50453d6eda39c495fab6810f7fa0629eb76d1ce24afd5b4087bfd042e28f4917bd863fc79ab5faa6ac6a43492421c22401806b99d8d4152280c1d4ac222160240e6eba3327ce09f99006f72d407c5552f62fb4d32ee442ee60557a014b8df0dc6bee0779cfdb29b94f1445550901189d28495c4e2a6c22c45f9fde656eaf90e387693fe75cc94a58b7082bd27ad0db6061637536045eb797785690dd8129cb7c8aa9c6c3cd56a05da895234a8cf6ba974766b4f5e38c19fe9463bc90896dfbd4848367a78f760c08e98dc1faa84a304201000010e3843cfb7c0a921751ff668c401265d03b41012228ea19550241c2100800007118180162c7091431fc3a2a54806cddfd9801410d928e55830008abf871550094808802000022e4088960424300e09c114a237845af8972bdd1b4ac398c5ae2c73d9ccf4184c5cb99dfcb8708a8fedb0994de8f8e36071c9acf419b7de25eb4c4e6af92e358b98c02bf58a25fe2c21f5af098553709a8a1eeccf2db306ba45b637f0700045376c6f7fa80dd284cd46eb141e004eb3674825db093ca59e34080f7e6d8e6746f303431d16b57d990a0b11e4afc6a0ed95e53bd9a194c394b6703013515e9c53f80fbcea40b093b936b92de9a6c383215490540e2051c2ee0c185f365d980187cee56c14959890734cb310459ddbb2c1612c4c538d0e14260f26588003818768a2120a1000400802403e12000105201443c10151899721fc2f41f26e0c76bf9e6c52e1c6fc140d2fbe2be013078c91c7e44a1511b193eaa1a018c0b733c5f52cfd15dd6a4d6d3a6617819c0e96230602b9e04cd66cb3d9b80bcf275e37298e39f5c60080721780f8470d96dd3d2f25e9e7b74d6a302dd28195a58d5b0a32673bb323819418c34e424981e40001e8980a0080200784403a1a01c0d00d8680680600011670ded79afa108006c0df17e1801e55d0a380028bb3673022c828440100190100c00805c0402c020150180a0080005808006a2100190e304afbdcf97290619e0c2dabcb140346fc8e3d75235839480000001cb7e0e4831f6cc1dd9387abc9d0620254ff6a00e0214c491ee27421e17315023c0fda495dbdf90c3e440018094e4b69ea577c2ba004ccfba38c104ede828f0de6f882aa00bb29f6beab1d7152937d6f2bc78ba7859e87a6900e819678e8197aa60330e4a34c76e682ed42167f10db88401682d272863265eb68934d7ff0486c7187449e62d8aa9cff401333530b0f113e9adc13d348920082185791a004c04024020005e52004a66400d678fce79e784977121deb6b6990d270087353b72568b80b5c4fde8eed0ba2908b9ed054c70c7045044003001004560b093ed79a566eede993a7706d250e9cfe73510fc3751688b0ff345c29636d8e3d5092e5a0ac49464258c0790cdcc23f110f2d7a7c4de5148fd134fd9ecd502e671f38f000000000000000000000000001b18545bc548)) <<< 16000) + 0xa44700f77b51301a21d3ebc21995dc3507f852ee74b99c13fb349c395f7de8438080000000000000000000000000000000000000000000000000064c1b9c5c281bfe8983196eb9c2b0a995769911fa21a0f718768000000000000000000000000000000000000000000000000018cc91481080860830107ba17aa539dd99dcb84bff5349060b86a58c0790cdcc23f110f2d7a7c4dea390033db1d99d9e09b6368825edee53a119e352a4fa01422bd257b684bf6fc13ae8799f86262a8fc7c281d869606bd0c43be06039df22544b62c3dce5012dfb51a69727374183686cec7a8b8dfb90c8000000747deb3eb46b86739185d7d98e8f102813d0d0c2c4f4edba6c8496e339be1c53f88e961f156fee691c6ea12179d72288458d2308706481ad258ac03b2bdacb0b311acdc506080000ef330412c348d7a858108fc386f1660823008610cac192900c14130591e9962d99f9912e2c2800608d2c280167b84cc565082300800008810110900013f9a145d128ea49418b812969c2438b8ac9b4c38653b09c014300b6996c410200b5a47a8a156614230080000a290100900040e900f0100073e900e0d803848034053a3b909678000000000b0c5603649d763ab3b81340decad4d959df1b3393202a0570df398925073b2c1ffb74e34000000000000000000000000000000000000000000000000000ca440638618430028018022a049e772b061fdc8157c447d6f4cc7acb988eae9bc9a1d38cec57bf91e4d08f07f89c04dc5eaa7329c913a935c4e8384890da61f534ab14440392c0018b76db035772bfe9d9657cddac632b53dee57af6c651cda70af819fd11aff469fc0c672f445f0a56ecdf661ea68954fc3ccec0334c62648a5a171850aa2d1c505bd6b5b07080b0288fa1413826e55d0602c10f81d6080149947b3c45402628220085783c7d0d9931c0bd3e3e46e28f3a81347af8ccd09a2e432f1b00000000000000000088f7655c6c5f0979b90a5660a91839220e18a10408c02318c667dd60980cf851d2fa1f11488d8ea5fb613ba3c1371186748fb720358a6b4c592fd568bfcd5cf21ee4302a438536b244776cde8cc870e113f27aee34e8a324c3c19571cf44349ae80c399c58591c323a2b3a38a1aa8639a1c3c3e3556304083f055cad109050840200181200b09000084900a21f0a3fb288f460b9079e3b88009873d47045408c908002000016c4001924c603c866e611f888796bd3e26f28a47e89a7ecf66a817338f9c7800000000000000000000000000d8c2a2de2a45223807bbda8980d17ae814f0f2b15b255f6640a8af0071308f27735eaeaf7472e841302dd1e4b1e676458293d14aa7ec000000000000000002276113a28c1e478436e42bd27ad8cee3bd5de231712c0e73f100000000000000000000000000000000000000000000000000c4a40620428089b15c1a649f1807f54289be8cd209fa24019229aa282c80d234cb4143c4e9953adfb70a4242109c683b82b7ac8731737b9017ab98061d182d69dceece58fe688beac92b7deea3b3ede9e624b7677af0377cdb41c8c4bd77d6cae9d7f045c3c7043856e634b4d5ef0cc69303520de937b96a1661c0a6d7a5d6ede4836866808a551f45b08c075fe3ce4d84deeab54e0d93937c45cce97de31c4b7fbafcd0c05256c09554b4f89b1b51ac927e6d1dfafa3b7100b61283645800eb5aefed7142c7318529213a77a801f81bee53f49a1f428ef83808f435abeb955b08e604d31e558d6c089b401370c0e225eb0a1411974bb6e1023bac6255024101f0080038480182400a12000113201243a045c9d61c3d45d528b8985cf9a3d509666b66899cb149f164adebff774d70a47f1ee415bfcdc5ba5df2aacf34886ab03f8cb5b1b3013f03cdd22fcc6d4c6ccdecdb2c1bde81018e0a3a466081ef4000d7944b52ed4040218cc9714c4081187ca1bb6be1d79563dbc2aa97c4851509e79b0e683671dcddb94427a304c4dddf2f3092fd005e7039e7e95368d4fed261c68a634bb25b8d3d816dfe57db758095af702173e3b438537ec57ebd4f5128e33746b432b9370a3a6d106af4aebe5f6a508bee8eca1bdd3b923c18a35a7be0e22e44cd5478ee143371f879aac72f6362343c7d1c3b13f963ffeae6f31227b1bb170edffc16d1897b8525c224e1269121fbc9032215b803db7a2a46b474d945e96bacca97a6871f8e80e66acda53800e709c197f326ef475ba311455063fbeb0110a68bcc8296af026f16f40ae9a3eec4c1c67a2e9150e8023f1ec2be262ab3af379927df17061fb0a58e6d67ce8f500d7a1be59e62f091c56fb96a6dde5db9bf272fb9ea304115b7b6ba7cbee67a1a941629e5a32226a92c4020040110597a354f4400473bd27e4810800110040100400001110000b53404bb3b2331c00d9fdc92048307c0100000f840203400e1200609002848000774800718900401000dd2100236c200538860fb1e156757adc29281b4cbe2bd07377383ad51dd65e0a33ae00000000000000000000000000000000000000000000000000065118118014010015530fd730d3a49afeba883c4b01cc4df1be40fc413567152848597b1c410db077d72f6dbda565d80723036528c6387780f0602dbe3179f17288b12c0c23df8631289b4a45ddacaf40d4572628420168fc7cc8f8d6b2d1788c6cb9ccf74417e76d3582dfde37a5de0a27fe54874dcaeb4d21acb716a2e8e7ba2c4e9decb2d8087d0655e808f1c5a222d47187c31ea0b2f81a7010c3b4cea006020020100035b9001010000080109948043409)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 23 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase10" = "QuadFullFiveCase10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 23 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase10 private def zz2222:"s08ae"="s08ae":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l16 l20 l25 l27 l28 l29 l31 l33 l35 l36 l37 l42 l43 l44 l46 l51 l54 l55 l56 l57 l58 l61 l62 l63) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2ce858bbe, -0x596827038, -0x861c43920,0xd374a8], ![-0x596827038, -0xb9b2ef179,0x26f9a1704,0x96ee65d0e], ![-0x861c43920,0x26f9a1704, -0x2452531800,0x596831ee0], ![0xd374a8,0x96ee65d0e,0x596831ee0, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x284081488,l14),(0x140924e53,l16),(0x6a9895b20,l15),(-0x37e66d380,l20),(-0x2cb417800,l27),(-0x161322856,l28),(0x2cb417800,l29),(-0x160776638,l25),(0x6779ef9c,l31),(0x2cb417800,l33),(-0x2cb417800,l35),(-0x17170ff50,l36),(0x2cb417800,l37),(0x7fddbdc0,l43),(-0x1321166f1,l42),(-0x15bb8498c,l46),(0x11b9e189c,l44),(0x2cb417800,l51),(-0x71ec4e20,l55),(0xb0d5172f,l54),(-0x6f4e4af9,l57),(0xaeb4afe,l56),(0x10d73ccc,l58),(0xd1703e2,l61),(0x8f254e5,l63),(0x37784d30,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x284081488,l14),(-0x161322856,l28),(-0x37e66d380,l20),(0x6a9895b20,l15),(-0x160776638,l25),(-0x15bb8498c,l46),(-0x17170ff50,l36),(0x140924e53,l16),(-0x71ec4e20,l55),(-0x6f4e4af9,l57),(-0x1321166f1,l42),(0x6779ef9c,l31),(0x7fddbdc0,l43),(0xb0d5172f,l54),(0x11b9e189c,l44),(0x37784d30,l62),(0xd1703e2,l61),(0x8f254e5,l63),(0x10d73ccc,l58),(0xaeb4afe,l56)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x13c21044039401000440d41d032100402542102200c9401400480cc13011100402602082100694014004c0cc130121004000000024140f300800430881201a5004000004c24140f400800440e4190321004000000360b024300c0000000a0603cc0200000003c1c0a3008000000013002c803000000004d013200c000000013c02c8030000000844c07300800002144600a4c04000000882300b300c00000000d402c803000000000680720080a210618808a900500000000014062008000000000e0148020000000002406200800740d02101e1004000000220a00c300c00511041801b1004000000005c00b200c000000017404c80300000000011032004000000017c02c8030000000b48406300800002ac6300a4c0400000ad1980493010000000015404c8030000aa0c300493014000000015002c8030000000584c0730080000154490118c0400000000589033004000015c490098c040000005623014300c00000148840d0c030000004a1d016300c000000110d01cc02000003c24180a400800000000e0c0cc010014c410c40964010000000b834098c03000002b05c0863010000000a824088c030000002a0c013300c0000000b05028c02000000000240920080000094110218c040000002609022300c005c0a01c01750040000000026009200c000000110b018c0200000004424063008000000000240c801000000001c009200c0000000012014802,0x8622027300c10614e0c005d900500000005c280e30080000002511024c0204043882800ec4014000000017402c803000000000b80720080000002521028c020000000341c05300800b12a45601fd004002a04208c0554010000531104c0b500300000710480b63010000001c8c40d8c0300000370b404a30100000d21540428c05000035853018a301400000d8290094c04000000381601d300c0000c214c0628c0500000320a0095301000000c4290328c040000758d1009230140001da3640448c050000007a35026300c00001e86d00a4c040000000786807300800811c4260121004000000822a037300c008209c1301b10040000000685c0730080000194590118c040000000068b033004000019c590098c04000000662b014300c00000188a40d0c03055c96092008f401400a9258440095004a88918424008f4018000000002a01c80200015c962200d400c0000000907014c0200012c4c0b014400c0004b1102c05100300000000019032004000000002d0388020000093064022301000a12644601fd0040000000000b03200400a12644600d50040000004c8870340040004a218680a900300000948838094008000025230e0350020000098843405400800000218680a8c0300000988c380e40080000184110254c040000006229014300c00001845101b0c040000007233022300c00000188ac088c030000000005409200800610f42c0175004,0x214210540484010008109411012100400294830640434010000002b83804cc03002b8830640464010000002a82c02cc03030443858010c4014000020c190108c040000000a41c053008000002883804cc03000000084740a3008000000351301cc02000000006c00b200c00000002e1c0cc010000000bc280630080000002d0e024c020000000b8340530080000002d0a018c02000000b20c01e300c00bd258120271004002dc960480964010000000002e01480205e493022012c4014000000002f018802000000005500b200c00001c4610318c040000000000503200400000188a40d8c03000104721c034400c00020a3940930c05000008474340e4008000000211d03cc02000000b213014300c00610941101210040000009a1201c300c000000270a038c020000000009805200800002642200d0c040000000009c06200800000000250388020000000001703200400031090280a9003002445112405a4010000000292503cc020000000a4280630080000028830078c030000000ac380e3008000000002a01480200000a90c80343010000000002b018802000000000a40e2008000000013402c803000000000980720080000144110254c04000003105c04830100000014884050c03000005110406c3010000002490c088c03000006438140940080000000001c0c801000000823b022300c000000001d0248020021c7d16405a401000821e0590169004,0x94260900b400c0000000078024803000184b652026400c00e224c83012100403c82282d018c4014000000000540c801000000000130320040000000210214804000000004c087201000000000240bc8030000000000f032004000000068004c8040000000037013200c000001509402cc030000005827013300c0000001b12014c02000005212001330100000001b13018c0200000000058052008000001608404cc030000000584405300800001a44100c8c040000000006c05200800000000b00248030000000036009200c0000001a09018c02000006a0840163010000001a044038c0300000000014072008000632904c05100300000c4a82c0a4008000672904c0510030000007229016300c1242083300aed005000000008850330064520518f0216d006049c838d503db401400811e033014d004000144921c034400c000001c8ac058c030000008231016300c1862921b40bf50050025431094048401000910d421012100400000a85c140a40080000002d0a038c02000000000280d20080000002f0a038c0200290860a40234010145218148020d0050029c860b0023401000a721829008d004000154861600b400c0000218290084c040001448616009400c00a12182c008d0040000000006409200814124226009310050000a2925024c301414524a23009310050000000001d032004000003684c050c03000000d213014300c1662521340bf5005,0x19027200c000000006c0bc803000000ba13014300c0005d218e808d003000000005700b200c0000000f0a01cc0200000000a87033004000001c8c4058c0300000a48c3c074008000491d0500690030000006229016300c0000210b050150020001042c0a011400c000002385804cc0300000882c14054008000002284c02cc030000000842c053008000002085804cc030010c2f04c0544010000000250e018c02000000920c01e300c005111c2c013100400000630a4042301000000188ac058c030000008239016300c000000250a038c02000000004500b200c000000002201c8020000e4541400a400c000001c830078c030000046064021301000000001e140cc0100000007428093008000000001e01480200000007824053008000000001f018802000000000740e2009410d00810232100600000510840b8301000000c4210210c0400188490980f840100000000000c0c80101a02082102044014003c0841503110040000002209024300c000000000d02480200009c321101d400c09009809406b100500124320880654010004b0cc2301150040013031084035401000440b0150371004024031843008a401400410cc23025500400120390a40ca4010000210d84c095003001343104c0234010f0083043004690060000004819013300c000000120d014c023a0224124031a4018003908c1301350040000000024009200c0000138110058c04], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x4762f9f3a0000000014d225d76e8ec5f3e781209238e19211400c00200002aa365b044f4322c08e4f75d3f19e219795ca1418b10d3b7246311a89402c13c171d8be7ce8000000005348975dba3b17cf9e048279e79628a78478270270060180001006f9fd12f267863cb0277bb1851e106df985f4d10400000bb807823f24e04ea381000002ee04c004a010000147227e0b13e01c0c02097743900e0440f22a082030e4ea79004a5586330340001c9a6bc200037e8c9126042200840c0fef6ff9a01c8ebc8f8020808911d48802ac993b9324042100800006c1c2064d125150eeed77) <<< 16000) + 0x612c7ee379810d5fd3b0c86d39298e2f5d4151c0044ee74ed951cbaac19eaa8d4180029f1ca8328d0263765af6bbc202326d5a25bff7bd9a102f69f220659c12f3a30b2884bec15d9a18814415c3b03117650463118071828000c288002a81e3b2b337d1a4714056c62ba50820001b94e00208436f0c52100000000bb807003dae1ab19340000002ee004e104a010f2ca826b6a0414562f5fe30108aea682080389b2c0890107c021c60e25ce7903fa049a79801a3907fc600380100e301000057100019820a61200034431d8be7ce8000000005348975dba3b17cf9e04923bd4e2c84f4dab1e6c25a60000000000000000000000016d47b75e84b9cfadbdb17b148ef538b213d36ac79b096962f11a48618811208209a018005c200401b8594cc7ec2f8c2a732cb0ea4f86933e190f7638ad9c2866826c2f6092a0a3446a48c19e5961f46329dcab904311f090505a38ae6c7ec216307508505a3e4bdeaf7bb0cf8317940046f20fb4cd6b63aa438536bac4e430d92c2d3723a03458032851dbfadb2acfe9ead8aba0d970fe52c7fd2305a17c3943d5765383a21e4c84ead1badbe902408af244000227113d0904f808001cac89c00f081575d4002c30ffa239228349dc03770c3218a1dfc2026ba17c04300815149b808011ba4b0b9c00800218502ea9a18185a89e42ce5075e433e3480b95e1e56c8003e0100000cd3e55540330000000008e9f8bb9539a6f53ee09031106e38c340b22452c41022411c12801c0d4a53e259b80cde43794f08740a58d777e82ad3063115c3ed345c11d457a0004284068242781201c0909d8484e8160009aa426c541321a09801000bff1c33b3719c4931e1840150d45550a32c50f934a2d47ea288000005b8d800e0c5d366297f2e8a182bcd3e55b2e3001e2ad08426ae580000005b8d8003e84041781634d97e86a7fe34900292e9eb28600cf52e993c418fadd52a1842a04c6ab63c00652e94aa3400f35b2db12704240086920cd7313c487d9f5a812e302862f7fcb0c5fb01e9dca2e001e2290c0d394d75077c1137740612b8670e69c5de66e20d8de05800af896b9b79a959b5c6db0037b76a0b075826e2d042bd152abfcd483da0504590e4000156100043a39a04c27030e0e8800000000000000068c8c60a469162046681309c0c383a187c261848a286602402600580080180801006d0c929598a41e20d01d481630970462dba1a120de4df364842b84c51e9e00a42a616668043e1509693821100438c0051d1cb943488bcafb0f1261bf4652309d6ef3f632421177a1249c006c90d1b0b000ca546aece084201000015e20005bc400120c89a80f86135463fc1210375ab14040421b0a96a180991bb5e2c1838e28130316012c50ed282806be4d399aa138a1100400005b08928a84c8442481a1300d0978084b804001a266880815e63710142c4140509d20c1000002e24803861c78c1b6b0183003884d5f40e0114fb578880100615e627f24208309d3e288382c2792344d7e7202901c690064a418f870510a7dc985f516509008e599a6443063251f2ad87220618c3ff07d60382a5e369d78fa102168d5aa0c1208331a0ba6414c221f42060b00b02721201a0500011011280582782f0b01008a6e4c28452893bb1423b59c2250d021a4597c914001a3c699e500220086143e8cc0f250b414b6b6428490bdb24a500b924b7ed200100040000344d92bbb3242a4890df1e29e2029ad8fc7a40013cb771d20010004027c040001cc44e0072bbbb9272280b42636744ba202cfd417a9ede80b4e8fdd0d7202a477a9c5909e9b563cd84b4c000000000000000000000002da8f6ebd09739f5b7b62f6291dea716427a6d58f3612d2c5e52c92812411818a50c6d6875e9d8a1330a68cc9970afb106853efb73ad55ba37aac2b49e797f94c7775d78c2ae8e7643182c1a5a3200bcf3c108d368ddce02dba91ac239d09c46c1360405193f6d937fb3356658abb8e3ba45028362e6144833ab7b30a382900beb3468037e23404500e79b589a4e0840010000157226e12000649224c221361106888826c44138220990d04c008002800c900b17901918380295f5944881c32d980921bbcd82c68603791afce486097a70f100100782d40d313821100404d407a4001955f0c51025b36c5494305db7a83c508c8fa97691a148f5b0b82204c826161a1009e235b2c02024a4f36a4140211004348061232983d288290083c1b9284a6567628b8342dc2fb7e5e8102a2561059e620139eb88dd2a1813aae7322ae1010f366b2db52401edb5e9f2d322410a00800003fa4000eac89a068494342661a1320d098868490342601a12f010970080017f4800a4990f90dc8ef538b213d36ac79b09698000000000000000000000005b51edd7a12e73eb6f6c5ec523bd4e2c84f4dab1e6c25a58bc248e60a48a506186300180aaeef88b182c29832f7e92375babce14be046ca985a4e12a2f553913521a58eb1a337cfe84d7a225e5fc5ddc10f54d571c03d24e45c9368bbb1d8be7ce8000000005348975dba3b17cf9e048230618648440228208200122f0be6857713489cb1b7a34322df7c7a4984077bfdcc5c519049a258020990104c0084ac0600043844a83625a1bc1c0000119402836951f0dbf89086d0b3e1d8301162c9fc0a090422d69c5572805b3001981c6004df342e080c08c354953f4000c45ff5a760550c9202601002784f340984e061c1d10000000000000000d1918c148d22c408cd02613818707430f84d34d24d18a08408d00c0060030100200)) <<< 16000) + 0xde3bcc2cc63620384abe8fea387aa77fc17858614a77311850c73780f2f9c00f26aa2fa26042300871d7fe064ce80b5360c9965866eabaef42860131a83e78006de7f665410800100001fc400095889380f507d6d111ad479aec4ef5ed66a0fada20844410408904404304a00800700101532200200d00012639a04c27030e0e8800000000000000068c8c60a469162046681309c0c383a187c279c69a69268c104680600300180801006c0e6a9b90efc8141811b96fd01fc2bf43f5a000e3af25a63800000e4f964a084601081f6548685938e589fc0c3203969e86d81015530f10c83802b0be5b6040011cd5a40000048ff68a700210080718080005c880014e112701f1b93e467d0712399b38c4209134f24807075ed30db64004eeae1e0381bdd3946e9304100040088140400a0001572000b90426c441321a098050005b99125250920c8003708ddd698de1bbc7f87b10c177553357e98083413842990e5565eae114c1591dea716427a6d58f3612d3000000000000000000000000b6a3dbaf425ce7d6ded8bd8a477a9c5909e9b563cd84b4b178cb24b18810a04c0080045806447971035b5d9ea1ac5618f22cc96184c4a04847703d26efc7ff7ded54e6d4d41f53738041d7c9a9747caca16da00530f4b4f12f13014b8f473de67ad4e1685316cb164772ff74c670254d161d40492f9be7890f732edb46cb91057413842990e5565eae114c1591dea716427a6d58f3612d3000000000000000000000000b6a3dbaf425ce7d6ded8bd8a477a9c5909e9b563cd84b4b178cb24910710c088082094599ab4cd6714634243488103beead8c06c40825a7c1f11efe6cfe9fed010438f7f13b7784f5b1d64c0b23080dee7c1c200d1e3d38c70b6ca6483840cf5b9f8c21b8072b4393af9864a108a046020004fb3442af0d7f4a38628e322fa0c187ed97f663041cd78c3e0e0962d8ee025011511c24d8007feb76f0ca2a93901100400005ccc8ec882fd24306cf10455c3856a4b4fea28425fcf71408288eab8e8b284100040344041360209c01096008264041300212b018000ca112a0d89486eeeb4c6f0dde3fc3d8860bbaa99abf4c040260e48e3042846024823001800008a864700401a2501304f09f138f7593e4205016a0e3390208485b8f4e0e77c979a45861b4e65de2410258959588022f1b73167002100809380fcabfed04e21840b34301249188557c26e5047762c78b10239739c72900aeb121e8470416435e6f3801080430735cd19b39230ca855748f11b93782685053286b6f410209cfc699900c8e34e1ecb006cdf9fe93801080400005708001699e2802af268a713e854e171244099426ec9020bce5db5c400d4794abf28010804049c07c4e4ce1e26cc14d1539a5440a0423b8dc2040532e47c0a20f7528128e08d7fa7aea38126a941e22704210080000af1000290224c1a0d10d04d868270341321a098050003c41125250920c8002480800b8010821d0015881bbad31bc3778ff0f62182eeaa66afd301034536999945817a09c214c872ab2f5708a60a99841238e20c20208c02a2424582b5978872f3a855a55f7f0daa1a6cf3d74aeb8f90c3f9e220a9012fc12dfbb8ea6c39363ed91e400c358a4b20235c3f92a021bb8df78c25c86f7f40388c0263311501e0b89b702625d029dd84a41c35d1f36184037872a3fc5689867d8e4487b731746b2c82dc91558a2275d0f33a6981af9f7d29a6313eb9ac5e97970f5914609a7c1faf98b8cb7733d27805e3ace45d4e143a47bc2a2c322c88a1f82d0e314dd9bdd493e86ce67053e7ad72a62ab812e9638a40f9b4de639c1794b3a328c5491200c8040009f660671e28a38860d41d74c1f103395b5ab485054d70bbec1400439844a800210041c06515498808802000028a78ad2434bcf8a144ff5e392204810049b2ac6104401011f0108f008474042460211c0108d80848806000282448437775a63786ef1fe1ec4305dd54cd5fa602012851c51420c22811012000800404540c90008036c6ecdff2d4190314bc2a520050cb8f74596820797f4d5ecd14200f053b0a8810dd54aa7842005fd87a7e6080836049184290084a028b198ad5494820420fb9eda050c01571a2c103b8c1f3f6cb0515fec46d1c1016629a28500329fcb6c2704220080000b291200908f8484782423a1211c0908d828000eb08161080ac54000a3844685422c2b1190108900800408881494f8f10076da9fb335ffe5bc6600068e3c401a2797e5b143fb6f198001a22041841820821c010008013145517f30579a58553e660a6465698105b9bf67a9cae28c6235f23a950847a92a17724b0e835694e8dadd823791d4a845c4f6db15258741aac3cbe8c0084d41f5b4446b51e6bb13bd7b59a83eb6882150824ea3a202434eb1cfd0550910908504104900b4fd9db7cb2bf2ae9eae5eb749070e1ad46e71c9ade26693b51cba31e54eccb83d6b9169dab71db8ee952baed6734f8f905750cd62da88c04845c14000856445845e4752a11f11b74854961d06abb9aca000215dd698de1bbc7f87b10c177553357e98081936916dae14856fb3e398153204144103082180100f67be3390d07b3f36009e6ebc973bd78f26fd0ad29aa508a3cd75bb964f39bcc00cd3269b31a3898ed11741608b8282c90010bd5ec12301643cbee48a02c1b7789225a7f8bfba120411004000037488a84845004226021120100024511112108810843c8421c4210d2108610842c842142a10915084088002f80e04f71fad8bc42825955c635d60811c61ad4116)) <<< 16000) + 0x8c00d26276bce85018ecd7e5b082012db5141c645550708b49b1650c826aed2fab85b1728974ce62c2901c0838c84186400032105150820a840c54204221010100014e10290988004c3fc141fc0281b6e969c0028c60a8b083a47964508718e99b66408047f8d66354908007f8d5f383907027134515ba6850061d0e55a6c955514004f61d098306019f1bdf0692e53a2160122c8be42b833012c7b5696a8bb128733858a93831c5000001d4c0340220a0527202002f59ecda191002c7c66adc86812ec135a50d0b2a582e8f3141400a3cd0fdd9402d734a917572cb3334969e6fabdc8309000c6c13381c2000502c5903c0000002bf203402476eaac923000009d294e003e030a004113c2d744ed5261e67cd927f27533cbb85149a42a271600295f1850040801f5fb0e400410261e5653803c0583bc14d57c60000000927c0322000ac0811d8be7ced348975db8ec5f3e78118a279e61e58821e09809600a060000401a0001f043f407c5b4d0a995b4e2acda56c65e694001a6ca10288000000fa00818059b9e2544000d4533aea930412804000052c80023710fc0186f80f09af7e5eb4c3308b4cefb21552c8001083e4a02060000013880082205544cba408104cbc85680140028fa280001000677f0a8200800dc0d5066c450a48c1400a00008108480882382411a020008da3853011ffe99aa0b1a9780347fea650d1f4a36d1aef3050827da0c0680c2010bb6b15d4090c4306a5e11d04832302e534f983008f71f1a73410e01a95f48f18c551100bd12585a0580002413649429229029621011009600c02a220064c00401a0001486048b145d73ba707106d89ab780022831f39d548662050c276ff61a53c1020b3e6d6663907042e00fc7d8cc2804e7e5e14c3f101448e630b3e440fbe906b4f7e500c30e685c058000236204e3b02501f11a1236ad6432d1c3c634cf3cba96c60c00408cbe79001020b5d77f23203860039be4f1358010c00b5d76c10503800033bc81a06780454400009c40e80640780001ff200251a43ec67a5848804d830c26b5f8a0f34690004d3e8903086fa641a311a38fc4ef24c0c1cf6c016e783062b019d7392c10000588300e000066f63c29002500869404208503c309aef6ac5d39a40931a18accc1f323ab4d7a20808f5f6d283014d6348cb88a0051cfbca1e700250080000bc1d2d543a075a85908431a1a1b3073182547e1963535d2bec7cb04119f168da4800b1fe3b6710002ab817ebce004a0100fa010000c69c240ede98482c164b82befda4802c82d182a8b89638f4a5a26d1740b1bdd520c4282942eca3115397030054d942824904000fd19d796d060038ec3b2e762ce2420ac09000043678c7120d5a748696790635132cd21ad1b44bb998467d0ac090f3471ed72f68a260f159819c47090dabbfab53196080006393601c0001cf540e1290027014718d3a0817186966c6361904690bc5955908611636dfaa7268e373c17b3860f073e5bc42486bc5afbd493801200400005c4e96d44d1034330907fcd58719839fa42d57f8b1c1374ac1b658d1dddfba3f2021fcebc3be880069748f2fa7002500807d008000634e1213d37ebc0e0b257445607600164185ab1fbee31c780007ba0d2058dc66361b35b4a17f9cae9bc5818021217b4f2a820012ec89ee7683001f370c63ab16712105604800021b2000eb274bd267634bde830a03675f26d7830902dd09a9c3730765431f8941d2c6cc3e56d99402032f740c1733c281000082006800c138ac18ce4182800012e735040bc4801601234b8fdeb5fab98501d9a17ae0c240508ee53c60e88a3db9ee2c68c38cda75901902ffbcd1830494d26d6cb3801280400005e0e152ac56cbac2c8010007e011632106345804a180784e134c50b1dddfba3e1c21b95fc94f860069748f2fa7002500807c808000634d9010e68d05070510516c015c80050e1c2ec7dd4c630c5613a9b6d2050ac6cead633da489285f8c591605802d4c8da95503801cd2ad45b6828013aefe28958b389082c02400011210f8010003d79c2a91f650226c58c971a36673a286073973dfd9942bd9f18e918070c25949256a218407edd739b62410000588300060883e525b4a890000337b1e0104801480c30aa6687c28196325731cd720a181115ab7a050afe56c8d4c1c30911ae44486101fb6d0cb830441f4543c33801280400005e0d933e3894ef2285401c1571814200240a123c912545f9466e1020a8cbc7e01c002612788e8600073ec906e70025008010808000634d0e171beeba8a091c670cf581670a28c34d7dd7002444217852113848624aa236fe1880e9b3fad345014006ab1a2233018010ab73e31a22001b9587131dd672420ac08000043443dc041ec0200079c364ef8196870ca1c956ae8df650a8bd9bc9dc2451a44f80fe12225c2f087c060c58809bed24020000b10600c10da26037a10000066f63c290025008593bf5e75e5d287255add3ea942a26dfdf9949145fc3801b84889ee46cc2a18315c5217b486086d14fb826700250080000bc1a23cebf389f36123822194c463a24634bf2a16df24884e2be42d18c8103a73998845101fc61fe5720c142075eedb3e0e300125011eea4b22000ac0801ea020001f432305767aac1181030db89f99b68102a22720ef9298820e17ddecd601019ba545970f68e15184ef97240120079c9d29e600a00a1a1aeb97c060047ffec59ac2ce2420b009000044843d004058020f3010003fd10f21d0788c83c0641de320ee150768a83b0541d62a0ea150748a8)) <<< 16000) + 0x3a0041ce0200275121cc630e5258720ce00302532db26e1c76f9669b3f895fc0e03a8b7c83fa59c395f4921e4ac1f68500874a8853af8f536e9e61225fe5f81001035c06cb5494a4b9ea330e56bf85554431d7c62ef625b3bb81eccd218aa7001053b04ccd4b76cb63ec38282000222bfad8b690d8775b9e349b8fe0010358af7b4c368858684f634bd64fe8258d32a9177f0fc3168f75b551045bc6e95c377f0549f00022a3889c23ab09057fe29b164946b76bbcbecb4e52f881111353df3aa677800000000000000000118dd2d3e0040c0b22c82082812001c01800001161fa544f1485fda812d77758606da33557a98a94ea3299f45350121e30a93b8badd85ce8c6a89fa1c92a48ba0040be2f317c29dc92cbbb99109600e28dc0741f272820c57f38330b0443ad0e90e3400085b92ff0b006aafd1c52280177b1ee4600a4061300a30cad2a397c859000d2eb5ecc082f2a09d8961055b2ebc9101016f742d06000372f3fa8b000c1e8de304e1046010b0b0888e5641898dfd33a64d679100b3213f5fb2c65fd6c7d549a0d8a53ecc2de56b04e063731a10057727fe16bf1e7e0c45e43b56de1111c4b51a54ca0e55732a26e6728d6558c614c169f4a4961be8898913f4246d4627b00f6a5f345e0fc4318a21a11639c967380212b9c845eaab3337409d66e9f03f33a075193c1b20aca858034e04762d2459b8b90146f67a7e4db661900aac40a5a8800e305000272900066e30000100407100814c041c2020e00100003b10df01f947ce5ba8e30635da10eec421a5459a7cd0c8a15499a1c8e2c515f60667f1db32f75de62c92181a38829d0f445ceb93641ac618516e961a78098915e0e17869e09cd3c69e294b7e4b7a0951418263b687aff5fcd01dcdcbff03a250aa9a2bedc16bc678140429120332bf707045a0ec5100f36f292f6c8d7bc585daf5e1849ae4304ca295023d8469bf684021189d4afaf61606077656dd43021d1c6072f5badd094573d51678133ad6d873339e5edc330916e40018cda99bfb51d73362f21e6f1cafd1239c7605d21dbd4b43638a441122b0a5d3302300800000d2486f048374241b8120db0900039c109011047048234040020f6420c461b403a62ed4f2895e3085a28640aaff39201d14b3ff31a09624fad94b6c70f84c4226a53468cec000000000000000008495cb45a6efe8a138b419e0aa8412751d10121a758e7e82a818408250040020e530e16e0ea29515609ecb1370d52105f16e8a43404d33e48307a5b1103c2fbf41255648f2df1ccded3f62a79ce7860ea8d77137b8c8988df9c4d9264af259dfe03019a74e641d48dea59119f1339e80f92c53dc2724684d148f36753df97fe1160299d1a76c421183e6fafd098a630b19e7133b0d41db6332429b6a73827621fa5e2ce6487e99540b9e9efc4085a5df2acac60368d997a2c00000000000000000114a5af2459259e1c4c0cf7a734b16059b81b9ab2e143ce292035b000000000000000000455fe72403a2967fe63412c49f5b296d8e1f098844d4a68d19d800000000000000001092b968b4ddfd142716833c1553040c220104151937612cd56b6957a672e4e5c97f3d71f507d97021f2ae510684151de51a9ea281b2ab1df15b3d9012aee267722d1ea43440edb4c1a07530b88690402df5701df4adc8898d72710b4ae916d55e56bacea8ed53c07f290cc4208341f997ce390e45a4b8f3252d47d190087920e2072a7bbfed1be2965c89785f4835a3eac3fbf9f8b0506851f6a1b2120940500047210d80582782f05e5fb7bf201ed93c9b3432f29f411d428511e4c1a072cbf7e96a87242288330925c47ec6e713a227b1eae48b383f428b61b9c003021d8673b790b00cbf455d6429833b011234105732de4f5389f52deac00f8a854e21370a069f54ae2c898e35e47c3c04730345d5885e45d3caaecfcfca4ce044e1a12f088265824ff781472531886c0253709e67e3888bc8a542735496cbe119b522e00756caf170b3e650cfac6dcb724d340da512026f98020afe9cc2482df75e19000c802030c040000fa6000020080c20106080800013086b80f462471cc231049913e0b414350be48383008a219c1f0c03cf60034650420008483f8999f3c50ca7551de24019e22a1810196e4f509000780201ac020000df3e6017fc804382283f7eb64840369be50b002eff9a700047a3e62e94007c0201aa020d4010000911d2c786e9ac2209411db5f41433631549b2410455edf28b087810610278048e8579230022d9da4b06018091c2328002100869668ea98d270846fd32562862ba8a2c2905ea6086325847c92e818202613b9fee480c925fd85380100040000554f0d2d97bac2183aa0d1774a20b9023909ca0499a1cc884822c4e646d2c00bda302694012f4f0e659c10840200002bc434c2400090e4001f608690a834444154220d01105406814804001de2652ae73401c4aaf4673db82a4ee09b5ee83762d1c26a60a91849649619211c08a0860c098cbd2d5cb8703496fc8b7a7c55d55d4410c8d22d579cbee08dc295dd2d3e0040c0b002b60cb0a399d8498f230548c24b0c908e04504304b0204333542c0bf78fc5589500be9385a3d0b8228869400064886784829c2419c120cd0906604816024196120ca01064808320040008ea40089f882186c31c074c5da9e512bc610b450c8155fe72403a2967fe63412c49f5b296d8e1f098844d4a68d19d800000000000000001092b968b4ddfd142716833c1550824ea3a202434eb1cfd0550c0c408104900800415e73e75)) <<< 16000) + 0xd6785af3b63a0c34e56d7751eabb37719c2ac521747e4a99473669f97497b6d56ac13040f3830aec6fa93305110ab0a55e9c91b0d1c889ede603e8756115210e3d2e4da45b6b85215becf8e6056020db735db78a05ea341ccbf2d667eb1ddd2c283ddd9f3bf2a800000000000000000445fe72403a2967fe63412c49f5b296d8e1f098844d4a68d19d80000000000000000108cc1440ca048042041057629e3a52f5da404f33a1a7fed2b977950a6cf56a3d38245fc76a59eea47e099d0bcfe19fbb2c7523d8c58a5e0982ea49c9eaf658a6605f01e22b5631d4cc00009acb45670686853dd6a6a8fdaab58451926a18c120c50906204825014000b7c413c178480e17c949602229b1f20601ab99e30ec60842010c26dd4ea9582026e9a0d6c400400100c30100004699169f3e15a5862f44fed2400e173ed020022256c24001d008061008304040001de68a091ebaeb0c2236a414a450aa9ec6b565808988bb221800df2900a840153d9ef6598108402184727e0d61142ffbd847b0810bfb25d0200066494b70403ffce9e3940080020180020001113a380ec6d278e087d9c7e3880d1303fc58e00ea686434800400100bf0105f0080003ec8001b990b2110580682a83415e1a0a80902900800199cd082d035140502dbcdb23668129cba7a0200b2a6a5c6081ce9d3e9cd4108001014e020bd0105e0082ec040b0020ba0105c8082e00416e020b6010000e810b509d015ecb544133a1666164e0fd85b131d52f503f5596f50ab983681b92b90353656710ee65d646b52ad5da9b53df4bbf8e13841a21573f584c8a7b13e87297ec081c7c4747b61a0fdd3d1731fc39b4bb9d9e03bce5a0f9488b6fc9dbdb5c9248a11e3430cc0d8910565635f9c7ed4a0ac26c1a7da9e3ff9228c8dd723b5ace83f01f86ff32ecedcb143709d9ac21fd7242a4cdf014f5ad58808030c36e3e494abb79e594d2a35a558c6512cdf0cd70a908eeb3702c2ba194ade451bf79c28673e6becb2a7d5e0bd01da649582ebf921f23650122df667600e3f67e411424fe39acf90f6d378bc84170d12f683f996b8279c62788c43922fc6a6af9277ca09e7bd0e385e30de7a00e35fc62a1ecae31a0db3ce413476dfeb3a9e40ce0da247191673406e648fc9f27322e9eace9ed0ef7a9f0c5bee68dd4551c5bb2369c9b21c084c2dfe8ccf507930d4a6ed81714ee02d71189f785e9596cd3bbf40c4e56cb823436b04995760c06f42744ba8cb03901f38593045da9285696c791483a3131782efd73ae8459efe318763fef8625a15d9d9709b53e371c41742f21adc4369ea8717509f7e31e2a35a91b0442580c915760d80621cdc36b8c664d3b4a037db7a379d0dc399bbb1bc5ee7d947706417ce23c62163a87005a0082cc0400126a641a4a2f68e481f0f1505d55522201f008000043904f09d8b0f8370d1c225688d90a1789a944890410d36f2281d0b2adf25041d0080590282c4141600a0aa050578282b8141500a0520105680c0006b4e100b113ead1c0873d6611c1c10855c7b2e28227f6524c48004be26b4b860078eb9dfd0805f6cb41800015c6dbc21155028202300858a2609eb343813604b7470a0c086b78542308210080560482ac24154120a90905404814814000254429c840b02a000317214c2a0014b3214a330a4050014031a102162f67ee1426a3a39ebc9dba9603064eb05c3ca940f3781c6d63a49f682829723e7a6c72a6aefbef6c9bf1a5c0617b9d273c7cb7b3e1b5c42613adb206018190f1e084cfc979e6e31cf339c8a8adcc0c4ab473e29b36959282d48c78c435bc26de52b52480fa5e3144975e21d38c60e046d181979481c4511a187b56d65e2821708336e218503ca476fc7044166e3bf0c084bf55a04041c0e0ea850a930811804028c24144120a10905002800065c84202f846d0ad584c7103092b1a2103ae17eff78804292db2f22c01f6eccb256508220087129a7217ec384abae7f820e204f4d9604b0c29c74fb22060b81aa090406f6a7db9330210804027c0400028c6c525f7c4470e127c78a29c1c412204a54440d6a42c8e1141075f4e2a0b00743861040402449bfee567082200858a18a695c4388d49352342823cf83cd2183f32ad42628199384b26ca084001009e0100008a1000296213a2209c0d04d8682683413212098010002cd90970584b00eeeb4c6f0dde3fc3d8860bbaa99abf4c040a62ed4f2895e3085a28640ae1b18090255058c55205c8ef538b213d36ac79b09698000000000000000000000005b51edd7a12e73eb6f6c5ec523bd4e2c84f4dab1e6c25a58bca60c40a308480aada79c710af09cc2607dcf43312ba35a1266b39df06f6323e1de3b12e0f19f3f72bf8765b1c247a2a640540e6d7847cf0bbafdc02109b0a9d76ab081e25a382fbc00716b9b3784e6ec26564505af7283614ded841d594eac0a30eca0291847bccd2c812118c37650c20a08fbed6caac828420100950104a008000424d8a588d7e4648a5082b018388223f6f68704811e0f3c3834bb0edf8400bc26f068aaa93101000400004e480104e84be45703e183b6f14c011030c079c84102d756c0915240c200080488282401411e0a09305047028234041240300016a3775a63786ef1fe1ec4305dd54cd5fa602012841831031021811011c00800005540c90008036848a61fa5244306eeaebed1386087311d735a8812b8bb33f3b24159c7927c98282035fb3536040599adf85fb800105d294dba43220309c08012212090090478482382411a0a00022e21184208b150001cf)) <<< 16000) + 0x108a150006c790891984402821c040032c6409cb604a03a2e6b14ebc52694603f1fbbd8b333bc9f04e14a8abe7ba9bbad6c2110073a0ed574ae223cc5fd3c212037f948e30604128fd4ba22668dbd209caa0a57459ce2502e3ceb92de51d146ae6f7eebd10958e5fd0ad238323c966bd8674c6182a713f0f66c66f46e7781ae73d9efc3ae79fc71df662f39116a9ffde65dfbf1df23c9a701c520a8f40a12ffde96707e7ae8b867db3de53bde231be25ef2054f6f4f36e6c5b6c90c65b639aba6448debd0d971b1ca063ef9229c451a36dfeadae39258ba728798aa1521465fc031696f4b9c46a9fb99e08eb089f185f8b2929496dea18c2595451c59a7e37917145189da1f80104069541b98604748fba950608e207b59938082f4b268493041180400004fc84302e084e650878c91c08444510145a83529b78c10b4afddb42c021679fb2ea0044008e202f932751208d3fbf26489145b905062145c4c8ed2109080b5f3bb294008802000020e78f3709afb43da741e992972f5d62204315e91bacd7ae52fd9b69786b6961c0790b700e5d7695d9a3b632de4d00313357334cf240630d5e9eced23809a3fed63a3a44d7679d72fb9d873909ee5e9a276f2c7ea1b4db7566cd20d1eb4fdff9765046912400018d9c18fae6e207186cf112d2b070d8922fa9a24017c5f666d24082200800006e9b242c9f91600269c2ae21f9025903145a82598b4b24c30545dfefdc4f909079d612f7078d9c0514e1bea52e7240586e24f0518c101ddac1da593ed09c410185e07800020c20010fa421454108120830984100e0884f239d31238199cf254c155f542d3a10562442e9e2c049ef27df150421004411097776108800491bc26e0801a5aa6bcb304220040000561e3ec2e434e10184f92c7bc800800101020208001000050907f05c939fc42bfa28806cd2a851a35c0794a1c90d0a2c86b26010ad90b9894008402124d80db3f2078640c957821219347aa1c25040544412a8400d4fae12d28011004000041cd861c0d6c0a2ff431a8598819d439327b5b7a210139d7fe14e1883324968b222a4c6b8a1acf867002e4224dd2def08e06a3a6a9d725a545918b1002b2afc0f0801270995541f0be4f508c4dea9367dd7e0bc836f5feca335ecff2890e22335b993b757889a297f1e00def91c1202470dc0000e14f1e6b72769440a090a1a893415dcaeb680e0d05b3191a4002100803f0081f4060001fc41f034000de470d0ad35a3a0e20105a377660435864e5f9e096bf81fc210341b33b9212821100401ec05c4056ff7efcc086d8c0a47081e0d8c2dacc00b24139611801a711fa70250822008000085107a0d03c8680009b083c02e008020080770183b00e0505d8818c80416cf9534206d073fd311820f8042050278aedd0815cb8b9a1400a3e92df623042000800005398040080200000888000d190751103a0881cc3400049241c814001d7a41c4a40e04a06f250371281b4840d82a06b1503508bc72bd28b5bb04c6cf6ab06ef48231a5f6d20f1ea4a85de6ce791f5d618a6c5e08d4c5da9e512bc610b450c81537b5f2a089102d42093a8e88090d3ac73f41551863032432005154db18a2625361abc6b8ab2416d10f49e4abb63a751e4b94d27794a443a7554463aa0d9dae56d41e622fe43d99a98d073e7a4780fafec09f3677b6edad8235d42d063a2e0c1cc98ffa9431bc0ae66a30c93c82674181c8ae41040502c6d8e732840cab4373ac08278f8b2bf2804e3044010069190340a819c540cc2a065110000ec18207f282f2d2230f2faf1bf2c40222d9c2e1051bdf19620b007bba74dc92821180425984302e5a01762e14159f88cb9ef571eaff087385ae9ef4c8c6baac05ecd61400000000000000000223134600ce75e5f8fe50e555b91c9e1d35ab01d817ede400d67000000000000000000088c152642a28e511e119ba60aa1c41042231608207848a53614849af1eba47225c0f5527d6dd533fc854b761e5ed328c8b284ecb25f2d370c9452372f1f471224a8700a0d15db78f7f7de13bcf6433e25fa302bdee4f6fbefc0bc066a023812e2eadf4468226f107e14d4158546a000ba278f4f80b0bc34525134e6b1220898382a58c10840200c8020000be20c60b90f090c1d203050197572d121df66fc324c01eb962ac2c8084201090ec34a42913c3474a343c121fc699d0b8c081ee9a944300a2bfd736080036c0ce833021080400004c8e268c019cebcbf1fca1caab72393c3a6b5603b02fdbc801ace0000000000000000001112b968b4ddfd142716833c1524462c418420208238020063f1510a32f9eff772e8a98a3a43fb99135dd2e371672d569294503cff9e451c13f4f6f5cd0272420b38c837e2789ee11925550003673c7fc48c5123450a0194d63413135cb6e1c11d3e4e4c4a04100020188140001d04001aa88308a8180440be2205e1102e86813c040b802000f403411fde96a26503b6986bc80e080beae3c45007094a3d68a0011078762081afaf3fe8a84c204401005b0902d048164240b0120570902b0081540409c02054010000fd105309c03004011868d1dea2a6896434428490c9c631314c007c01121a46868253008715fd6f2001f00400003b104f0102900800056c82888c1401721b1dca2fc07025432db2c90000d5584341007dbdf49b0006205527e001288110042c5df79ca8a2c4139ea48c3021961222c0c14b03046524042000858b2143eaab40304d3353d18100551ca90304b511c5ec80063bad3792504210080000821d1055f95f1250908)) <<< 16000) + 0xf1d6d008820840200000fe413c140005424138240007c04134740983a04b1d0250e8124740903a0471d0230c800199482282811004003cea6810929d54ad02c2556e92b15b1d25ecb58bf89b6703cdf08a547bbb04b3f0768daf9f5a17117b8444d36986aa52f87ba2dcf9400053e9ebc1b98bc5724eaaff5835045572ddc6132c1f2d3d433558d6ad92be6fcaf08c16d60f1e1ac4f24bafde4a883bab8101b2a91899b89b63152ee69f3c086a8ac49c816e66f5d2bc46c5d85a2eabbca051431817a27623a5237c561d4039d2b90572a8930f576a528b7e5593ab7725e4ca61c880344e233a7b6193d0eb683fe785acc8c79052fea906937f9713127e9cd8948bb624004487f7eaee7125346db35353a2d53186557b5a84f60fd6c1b02ce349e4fdfeddaabcd83947bc82250a5a9be85f639f1648d24122b502ea25e58d279c44b4b4776cd0a398c1df58c42929bd74acfbdea7ebff547287551f57403a51c78a14c29c69b12b4000097e200924640306d0c8c0da9f552962d3a591e5a50aa8c9a32c8c2af1f057ee182ea5c10764a00440108eac2415ff8a6c59251addaef2fb2d394be204444d4f7cea99de0000000000000000004616fdb5422f59b24a15836d4eaa49d0861855e9909b10d79de800000000000000001088c24b24b14a14614304c02e000200d0002ac20860b924a43274b51230087af33c2c53c3d9ab6e50b30445751c614a010ef8a84173e94184c1c15eec3e0604e0846010a9234e4b91442a4ccfeba9598ba3b5f137911ffc1341f80eae400000000000000000045444296309c2a03866b9d3e23145cfe4a37d916e76c7dcda4b28000000000000000001108c24b24b14a14614704c00b82008034000ac880021c90420982080ea48d392e4510a9333faea5662e8ed7c4de447ff04d07e03ab9000000000000000000115a9ba9a700303a5c65bb43f1fde8d1c79182a8ba475da488a00000000000000000000000000000000000000000000000006121c424320310328014009b78c4cfbad6cf89a77e2ec809da07db421ef120cf10a7fef9a6a8df7791b2697eb6827cd128a6e63e7c52f93ec12118532b003715e524ae86a07ac17ec59caec409df5fd91a6cc94eda038be1b525c05bc1c764d6b3d4615695268002e99040196268c019cebcbf1fca1caab72393c3a6b5603b02fdbc801ace000000000000000000111a9ba9a700303a5c65bb43f1fde8d1c79182a8ba475da488a00000000000000000000000000000000000000000000000006121832021c20c224010042a07b87c1922ac78e01706f4801dfd6f51d71cd63e6ad0c4c9b2a6ac9e12df36c65dd9ea6f056e3d78635c4076b901234ed374822ebb94aac5d0e4fc6acd3166445dc3866790d31cfa48b5a25587676f416fad74c6593b2bd61d6d5368002ee1a9234e4b91442a4ccfeba9598ba3b5f137911ffc1341f80eae4000000000000000000456268c019cebcbf1fca1caab72393c3a6b5603b02fdbc801ace00000000000000000011087147105086042043012f881e05e40c474473e06b09c6740afc351eb8a0172b1acbd171372935177ded8cf7c777ea924804d9b41f29b1db58c2310dac217a96c4096569b99aaf005554512f8520e50aae62cc76212f43e800278903f2501f1280f4940784a03b2501d1080e4840703a0371d01b0e80d4640680203301000d3c100e1222023b9e7864908902887060e711ac6880ab35578b90c02e0f573960808bde4e5d9515101594f08c0210216d155e0431ade51fb0f75c1ea1601ada60e11993fbb0c54533517b81f7a69a650d2a000a1530c8344bc453a4f801cb8b4cd0eb01e7e8804b6cfe9ff66dade7701fb584d480a22d518403820aca5cee88ad267187631af4a02504c88aa202b1093bab2748b28ffb6b900e239c22f0815058f111094db1ff270e5b13ca5388819c40849937594cc440774d2351261c3063c1cd775b76304096ca3a715438014138d588ea3000f1c48bbeb82002e6f0396d0608010b49eda00aa8a00bf48302c02448d0030fd77f22a10d8236c571eee3639bfd5bf68aa0c25793d432b8711e6be6c8d143f5768c93ca754042abe065eb61e307777f553970b0e006b73ab5310f2670f4384c532f5a328137c24254ed23c124411ed180583fdedf22e823ea290ee71004fda8b4bd900225dd8a9e6c05316aa80178d88958601c51758197f2a16391b881b3ae42843af2de9a0162838f9b8f52dfd0322bbf2ae39c7f57c641cd5a8df31490934cb21ad362662270acfc326a1716ddfff10df015a2e5ce732e400000000000000000000000000000000000000000000002e09851841231229608e0080000020181c01006eb4d899889c2b3f0c9a85c5b77ffc437c0568b9739ccb900000000000000000000000000000000000000000000000b8269669250e604502400280546b32831881e7aaf04fdb32f619b39e1cc1e27152eddf91ccbedfe26626e86ef6d1b77ae4df577585921f3b853b356548130a70cd92eaeb4d899889c2b3f0c9a85c5b77ffc437c0568b9739ccb900000000000000000000000000000000000000000000000b82718714590686584104300180180801006eb4d899889c2b3f0c9a85c5b77ffc437c0568b9739ccb900000000000000000000000000000000000000000000000b82798796714708786700601e8b55c103803ba74710794f4c156b5b951c9ed560dde9047ad362662270acfc326a1716ddfff10df015a2e5ce732e400000000000000000000000000000000000000000000002e1206a)) <<< 16000) + 0x061e59e2a020808209e060000401b0386852610ea0650616ed093ca38977f81478aee2505498a003570520c4a004601000010d200076840017548003fa1032110188880c0340017b46c9a67e9b85058f182aaf784a143a26757e902a3b7f6d751c0115e737382005563197195598508c02005e0202e010168080006108007d1102c250158c80054648150a8005d24800db910290d81400b884666ee4be63036358739620645f63470b16b076afb076302815cc97f0b0af9eb06d042821580a1050215f37f0d374300428cce403c073ef87e650280482500dea90a5d88cec96201224d2880ae8d42b9b4f96aaaa0025b946ca4691ade03d7614956c0330bf70e68a8190d2fb69078f52542ef3673c8faeb0c5362f0462408388206302202400080aaaa09105263c8b8636f991ac9c3be2a880bfe0a55a8cc4811f0267d5b76dd17b2f6995e31cd18c47a000466409c7604c3302501c8b13ab71f55f196063020ce6f131197cae1c5bef318513dad21f63192554233bce6fb2c4678c7390afe0e0162808e7ab1f0b8350e9e54ecd0abb9fb789654860179bc71a9398106f3dd7045b0b6e58e35ee78a16280a00a82115846e90a6c94200a23a5852d63b5acb5549a70e6d02a434fdf58519ccfdcda4b858e793f12000063ac06729d31c92f6932ae16c951887359fa7e2ad8b6fb5a2b205128ca1a62db21ebcca793a3d8d2559844aca68d948e1e4c18181a4ac81900298c3ff1d4510242821008697db483b89edb62e243bd6d765b3576810b26d22db5c290adf67c7302b86c60248ef538b213d36ac79b09698000000000000000000000005b51edd7a12e73eb6f6c5ec523bd4e2c84f4dab1e6c25a58bc8692612490388302b58413f393d3e5ada28c47cc6170fbbed975d02a4970ee8395609432e644990a528cf874411c5cdf72a052808334b0c0a12e1ba31ffdc2db0d8fea955d8a95d9c25fcf5b556998951c7d39d021883f5254049e80d0680015d4d91f31e442040e472c357460b6f1fcbd648a6a268c1e48522cc8554301788b2984a2a804c584001000013f3936916dae14856fb3e39815c36301327d6c75aec6fb2e1ad2dc1532c72071c52c41421c05de0baed944aed9c01c3d2c1f9150950bd1b72ab27ad6cfa81841ec40e02bd01509001008050040480300026d38449435a6841c10cd3eb27048007ec3a9305008fe8e02404000606a95f5540252423008714c291e806387aeb034259208bd20b760500878314dc028507084011e5c3df78b2c790c86581799228043296fe300a08026cd920211004204cd6c0cff12c301447d9dc38040723e9723002300840d07f6745be81349fb0497481c05fc24dd1618187da86990008c0200001bc40006a081184808824042120200900f848000c1cf14a2b1fd189c3e4d649d904862005f32c10109609b0681204110043cbb8bab7fa8f21b62adc4f284048c0e3906002108642124042200840c59d9f53ad02783c4c0852c50f4876944700bd889a6a14004249f3a25002200840c5d6e03249027714b945240219fc723e900077cc6b419000880200001b440007f4800179901e0d00e868070340361a01a0d00022a10008733847a71c670449041fe56049819daac0706480097fc9e58a031f5efa4412841100430c2ea6112e8c2279d9f97330519cd4eb50804429adf5e0a0411002000037080c8680603402e1a0160d00a868008140280a0002952026520121d000643100f19000b8899148e87f998cfe82ae001a1dba668c56f4f45d4ecb3d5b11bf97abee3c671c11f1ba3a377249cc87f568edb03d6a7ff713cbb95fa6b4204d4221f6e46897acb92db2cf81872e029a5035f79c8477b1b46e413a1d01d51f1c02d8409e781f4a6d37689a396fd279f4d491601c50302595455432ef9dd59e129d4ca657a7604e0bb191cb14466130cf76ec7e010c17bc5722d5bf8834b6b652f524c5e7c18168d848154cb19fb0b17a5c8b46d11309815b2171fde50d838c66ecd94c06f090a90f0cff6bafc65eedc0dd6a368b852334f73c35ad7c42054911c5b04f70a9373a8d21f2f9f4da07127cb02d35df6a457cb80947485608f8531cec253a52adf4aabaf6b8045a6a7d731ac63b48c189111e3bc98e49cb7f0bec6975170d11d9c374718f306cc48f02585a663245bb0ebe73c28e1123c03ad99b5a65afb94fbb567e4245c2c2de2e2e0a5a4852ba8db2d90041b7f13bd2621d530cd34aa0cc23b1108e459acba70d22155f25475a308f50dc6d7b6912b98133842857589e5c68f65ef97821fa063a9ff1c15257e61456400f1f5a1e0e236e909789877a0c06e5b197a6a0a00f76f6c4df905ad821038a9f190f565353514f84227f2e0579aee632904e616554b254a1282e4e466a01a9249b947912c696a50d65fab3006809d6ee9607cc9b877c106671a1754379086a7534f62cc960e8db725913e7cbd41f2b5ad7e8dd6e8287f7feb605d52f025106ffbc02c4ef4022194b0c716e5d44103067cbeb5c30f3fea64d82c2bcb815ee0b04b9f3b105198208802162321e4cb9e0c34f4fd64045851ce4ba208b0429584dc89200b6a6259d20015bf8c2a033041180400004fc80014990111100808803c4400160e40388401a3a00c1d0058e80286401232008150038a80050b880185a10036ba3418ef79472e67080902aa6ce8e642040815f98a3ca2805d4ba1e77991006cdb4070bc50603bcd2cb69cf55555002c74248bf89083b096511aa17eb46588e249481910b40b000c0200501000129100415001888008440020200001002b459)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase11" = "QuadFullFiveCase11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase11 private def zz2223:"s08af"="s08af":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase12 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) private def zz776:"s0308"="s0308":=by decide+kernel theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFiveCase12 private def zz2224:"s08b0"="s08b0":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase13 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz777:"s0309"="s0309":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFiveCase13 private def zz2225:"s08b1"="s08b1":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l22 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l5 l51 l54 l58 l6 l60 l61 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x13778b4d7, -0x1102bbc10, -0x19841b260,0xbd4dd3c], ![-0x1102bbc10, -0x3ded28ddc,0x38bd8b2a,0x10f6078a4], ![-0x19841b260,0x38bd8b2a, -0x6e91d770f,0x1102c19ca], ![0xbd4dd3c,0x10f6078a4,0x1102c19ca, -0x8815f578]] noncomputable def hinges:Hinges:=[(-0x1129f5e,l6),(-0x3aea12b3,l5),(0x1724fc46,l4),(0x1f70c960,l9),(-0x5ba6d1b3,l8),(0x1edaa61e,l10),(0x11b153d56,l14),(-0x1b7fa332,l17),(0x1593d9728,l15),(0x22bd2d0,l23),(0x19d1f1bc,l22),(-0x8815f578,l27),(0x8815f578,l29),(-0x11b153d56,l25),(0x7568385e,l30),(0x8815f578,l33),(-0x1edaa61e,l38),(-0x8815f578,l35),(0x5ba6d1b3,l36),(0x8815f578,l37),(-0x1724fc46,l34),(-0x7568385e,l43),(-0x19d1f1bc,l42),(-0x1593d9728,l41),(0x8e64c98,l46),(0x269cf298,l45),(0x8815f578,l51),(0x3aea12b3,l54),(-0x269cf298,l58),(-0x1f70c960,l61),(0x1129f5e,l60),(-0x22bd2d0,l63),(0x1b7fa332,l62),(-0x8e64c98,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x8815f578,l27),(0x8815f578,l29),(0x8815f578,l33),(-0x8815f578,l35),(0x8815f578,l37),(0x8815f578,l51),(0x11b153d56,l14),(-0x11b153d56,l25),(0x7568385e,l30),(-0x7568385e,l43),(0x1593d9728,l15),(-0x1593d9728,l41),(-0x5ba6d1b3,l8),(0x5ba6d1b3,l36),(0x1f70c960,l9),(-0x1f70c960,l61),(-0x3aea12b3,l5),(0x3aea12b3,l54),(0x1edaa61e,l10),(-0x1edaa61e,l38),(-0x1b7fa332,l17),(0x1b7fa332,l62),(0x269cf298,l45),(-0x269cf298,l58),(0x19d1f1bc,l22),(-0x19d1f1bc,l42),(0x8e64c98,l46),(-0x8e64c98,l64),(0x1724fc46,l4),(-0x1724fc46,l34),(0x22bd2d0,l23),(-0x22bd2d0,l63),(-0x1129f5e,l6),(0x1129f5e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x1c0a005980600000000382406300800000000784814601000000000d0901cc020000000002a80510060000000000a40620080000000001580c40100000000002a01480200000000002a03900400000000078b03300400001e8c45804c80180000001c8c40d8c03000003846080c9180a00019451120066401000668a5120032480280000206228094cc0500000000001402900400000005221036300c0000158843203c8018000000f090602900200000000140a0298040000002b05c086301000000000000a064008000430a011014d00400000012822043180800000002a0c013300c00000000000e06400800000000b05028c020000000150481118060000000028140b30080000000000481240100000000110a014c020000000002280510060000000000840620080000000001180c40100000000002201480200000000004e03100400000000009406200800000000002a064008000000000240308030000028c350129980a0000000000280d20080002886c0e012e802000000000003c0c80100000000341a031804000000006c2409300800000008c2a01460181440a1044006350060000000026120318040001342304803240100002a04e0a00da80200004d0841200c900402841480840066a00c000000004c2c0630080000000098500a6010000000000130148020000a41502401ea0080001582405809d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x781082801e20080001f03c08407840100001e0420d0138802000000008828030c03000000003a0a0518040000000078540630080000017088301c80100000311483004900300010c388c201ca0080000000000180520080000001506203460180000000002902480200000000003207100400000063048092301000000000d8301c601000000002a19038c0200000000523206980400000828cb021230140000000068281460100000000c834098c0300000000320a0518040000008118408c3010000000000b0606600800001c23040348c050000000000220710040000000000240620080005c0f03180f48020000b61d8610269004000000002a0c031804000218730d406840100000000001980c401000000000032014802000000421c1205200400000000946407300800c106304803e28028000000000050188020000000000048190020000000000140b20080000001248206c601800002424040648c0500000000001205900400000b0941024c3014000012120201a46028000000208c4090c0300000000442a07180400000000008409200800001c8a812044801800000001506038c0200000000002a07100400000000bc380e30080000000001780c40100000000002e0148020000005a422a05a00400000008239036300c00001011c203246028000002944401a4c0400000003914812180600000cc522101e400c00000090682814801000000000f0a018c0200000001f0b81318060000000000340620080002b0761100ac80200000000c844098c03,0x60640638404ac200c0040c7106f03924014000000c228805060202c91c91860258d006001d23182881cd200a0038c61057025a401400000000b0780a601489204040c0f339007812388041808f8a00e00000000006407200a0d8e60112079e2803c091c4020c09dc500700000000005a03100541890a083027b3401c00000000003606400838328324202561006000000388c201418080c0c80c708062340180000000108701e6010000002143401a4c04001c6294328129a00a0000000044240d30080000000fc2403660180000001e04806cc030000000000520710040001885310807a40100000000005e02640180000000001502c802000000000b00099008000000000058072008006304605601e480282961961430248d00605063062840311a00c0000000882101a300c0000000098301c6010000044118280a90030000084230501520060000000088440e30080000000108881a601000000221306019002000000000241819802f0862a09603c71401dc48c2010604ee280380000290c8280910030000a2188340462008000144440cc0cc401000000a1102032460282d61d61830248d00605863863040311a00c000005088100d230140004b0ac208134802000061150430331004000003045080c9180a0000000068340e30080000000000c81240100000000000903880200000000120c03180400000a43409022400c0000000068301c60100000000001a01480200000000001a07100400000003211032300c000188480981988020000740d02101e1004,0x2a120518040000000000240d20080000000048281a60100005210c3201e900400000000000a049004000288932080bc40100000000000580a40100000000390d028c02000004a413011b180a0000000ba0a00a300c0000000178300c601000000000000c0c8010000000032160518040000000420a01c300c00000000884814601000000010854098c0300000384218115980a000000a114409630100000000a436068601800000000007c0c801000000001a0a0798040000000018c07820100000000000380c401000001c208c0c40c0500000000001603100400000000000d0320040000000642204860180000000000d0348020000002888a06318080000000001040e200800000000f8380a6010000c22cca202f100400000000220a07980400000000842407300800000000d8481a601000002d209808d8c050000000002e805100600000000b4380e30080000001084603a60180000000002901c802a1248808181e67200f26c83008903cf1401c0000000000d00e401489204020c09dc5007000000004a2207980400000091104069301000000010426038601800000021088074c03000000000005819002000000b118409630101a192190100c46803000002062a8094cc050000000000240690040000000084180530080000000108681e60100000000001d02480200000000003c0290040000000006500a200c0005914649017880200000016110502500200000000542a029804000000000a8b03300400051924108156802000000001709034c02,0x44781980200548708c102bb401400001c8a4140488018000711441a02310040029239462818da00a00000a092101923014000000010828146010016920a3940c6d00500000038886044980800000000a8540e300800000150a8301c8010000000148840c8c03000000000042071004000000007438063008000318881a00f480200006110c3302690040000000612c81b180600604b091202bb4014000430a40c8136802000003025840648c050000000003c181980200000000c87c09300800000000c8300c6010000002d2a0702900200000000520e05180400000000a4340a30080000288c41a0148018000051188640b100306065041c20146200c000000a118c0893010000609041d8048802001031040d403210050001844083601220080000000078640e30080000000e46204460180000000001d03880200000000744a0718040000000000e40920080000000001d00a4010000000000250388020032448480815da00a0003183206409b401000000000170606600800000002f1a024c020000000512481b18060000170a62a01a400c0000016950b012801000000002b16038c0200000b8531501520060000168a62a02a400c0000017148a80a8010000002e2b160390020000005a562c06a0040000000a22202c300c0000000078381460100000000000e03480200000a6220e00d20060000144441c01a400c0000000158701c6010000000001e340cc010001023088404ca0080040460882025b40140003b0a21081148020010118220804ed005,0x3312805180600000005827013300c00000000d8880c60100000001608404cc03000000290900099808000000006c4c06300800000000d8900a60100000000001b014802000000002c240398040000000002c009200c0000000006c0124018000001a8110050c040000000370880598060000000640900c300c00000000c8480e601000001a01040098c050000000360480618060000000680900a300c0000000d02201c6018000000000160148020001424a890033200800514968900192401400000a311404a660280000592a8b00990030000000210880a1806000000746c180a400800000000c8b00a60100000019c5b0218c040000c22c026029a0080000006115408630100000000d05a026601800000001917028c020000000311681118060000000064580b30080000000000a8124010016528a220064900500000c25b15013200600000006229036300c0000000a432028601800000211e0502900200000005c1880518060000000005f013200c0000000000c80c4010000001b110903900200000000005a059004000000002e001320100000000170c80c6010000000002e340cc0100000000005c0390040000000000340b200800001a13020498602800003025840348c050034410c1200f8a00a00000000b45407300800820c314603a48028000841841e01590040000000311080a180600000000841c0a3008000518c41c80488020000000208cc058c03000000218440491808000000004c280e30080000000108f01c6010000000208e4088c03,0x7458198020000000001140e2008000000000042064008000000001b402880300000000006e031004000009190301d030141219010c1807d680300000000013c04c80300000000004a0590040000000026001320100000000001300e40140614d82240b76500780428904180f2ca00e0a249187240a6b40180000000000220640080000002082c070c030000000420d00e9806000001011c4096301000000000022018401800001c6328094cc05b0848904181b65200e0000000841b01d300c00000001c8a81e6010000003845101a4c0400000000621402980400000000c4340f30081419210e180e5680300000000270e038c02000000004a1c07180400000005221014300c00000000b0281c6010000000000110188020000000004c6819802000070c524081f301800000e1146057e60280000000001201c80204864043060395a00c000010c641c01a400c0000208c83803480180000000230e038c0200000000120e02980400000004219014300c0000000000281a4010000000000250248020000c21882605da008060843430808d040180000000000681240100000000110f014c0200000000001e0290040000004e044016301000001284c12016801800000000078024803000000000062071004000004186a0253301400000000002e0640080000320c8240890030000000002680510060000000000980520080000000c452044601800f208a0b406310050000ec1283a06620080000000074640a30080000006812807260200000000068004c804,0x24a21c12812da00a00000009229016300c161941101814b8803000000000035038802000000006a24079804000000d5110069301000828c310a04a6802d04204820c0db2900700000000003a0390040000000621100d300c00000001b0481e601000000001909034c0200000005f0900d98060000000b81201b300c1249030c4814d68030000031148480910030000c22885404620080a0c90870c0a5c4018000388c21b0190802000000003a15014c02], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((((((((0x4d0f86080000170438b33ebf39954e6b58222dbf69bf952cb2cb2b6de054c49acb5b3680b32040822011c12c01c00261c932cd4ab6eef1783f15406cf8da0cc76978aba7425a3a8b5d7831291d7e40597b8c292c3dd1d3058e682e8602acca710485e204b283b8f84b3082201ef460a040e0022687c30400000b821c599f5f9ccaa735ac11017a9ba78000017044f9cf32beef34a83b044450c2085064861047803001801808010068000d5905701d0c9ae3f570827a5a54b45069c2ac75041226c24186022b758d184a103c0109a1f0c10423e09f6d8937bf8fcef211fa608c4d0f86080000170438b33ebf39954e6b58222e69514842c9d4a7fa5f050ca18410e0ca0cf00302d045b6a765c3a34f52f03f26b00435c64fc8c245bb6f018c7203ceb203cb94d9ca1c286f1b922cbbeaa2fb11f3045f9494000d488e90680011e48c48a854c04000eba4714763360b9000fab0a4001244caba24083a0088020080200000888e882e8b92ab7601c176dbbe5e6852d41d3d1408185c0f2083e9516c20400009e8744c083c01082000057e130c35860108b63c50de5b792470a09dc80c6061047cbd6b50820f4722c3544100003a9807021768f05806045642fda054801180820800019252efc163015d4d8a88b461b5db3c55d17c58802c2f7b9e0d1042f376cff65922080002187fc006049822ab1d9706000a80be4862c040090bf4999d25b912005a07000022e200082668a2d97272450600e6b858704745daf7868448394cf20836b3b187c10000099bf13001000438e0002513004a1409425a86d8a2cb3de4b8c234406c7606aee1867febf2c9bcb040530e55d4a00000018b8201401c6ea7314208010a0f56fb21e4009c0800003e247401400069240022c08d684c73c2639c131cd09c00004011c71f9e3f40f0243c32c43400586ebce6003c00800009d386cba5aa10d000b42412300160a61a48c107802000014068b25d9e01870cc2e59c49800241d8cf2c01c28e0dc4800dc3e6c825081f00800007d98060080200000888e608f8e83d38740d1401180e58a2a0568c9c404875882547885788fb7c4000025bd1cc003e01092400076a33418380552194b41c7f483d064b680c2913ca3ea0d1406ebdc7c60a298c53cf06d48000004f1a0080051a9e5f500700218ace4366c4801381000007c8f1d4b0e49590111dc3db24f104b34377cf0616f4eb18e0402eef3804000012c1be6002000879e39383e6c9240008c9b8e3ff5a4f204061e1ff32228a6cef2aace040000b821208bd4c63848000005dc08006a7718432003e0080001a320005cc78c04ceb45038c0df5fedc61b380efbb22198965ca93010fcba5e21801a23a22a6001f00841176ffdf26550b18a96b96c8970c291a5641b471204d3ea54d5ce420874b309b2568c0463c9e46894080aa67d8fd00f44041e3c74da880801ffb1d0f9d37bc9002b03800010e11cb010001b79d2c2cb296ae1c30291ce3b0185045fac65428b0f7fa6db870c8a888888a010a06b264c3010da9ca72010013e6205b2900046028e39e00675aaf74285254f999ba6542882a5aad04af3880c4ee7608f4e70e1ce4696c12aba0c34ef84e8a54805021e61288d06fc90402a636bb62ca0017c7a21a4ac897c72400bc12000048647280439202000424217203000e0e231232153050008a811b919000db291c8258e38cc71856266239a1f0c10423e09f6d8937bf8fcef211fa608c4d0f86080000170438b33ebf39954e6b58221634b83b3c3177111a311054cb14b0ca0c30c909fd7abfeb500f9eb1a16ba36baa3b891b737581eb86389c7a0407eae19736ba27573e1bcc36094cec76c8e325c5c4a20dce452fe45dd6d09dc5664d3f046b8b54cd1050cb727a82b80e7ab0cc93fd1c20889eac3324ff4708244d3f67daa41ccd35311b233748a3b618104309a1f0c10423e09f6d8937bf8fcef211fa608c4d0f8608423e09f6d6adc1613a2ba3f968223e6238a660216c6d82d060550a18b10410a0c5013ac10df2449c5d0040f1124c23cbea8fc98842c503af6c1f658c4c8c41f54f0b13cf062c9c52c50cdd15e876b8ddd365f9a8be95bc9a412268b02c29b5117fb4d06ec829d44457a3c882b3f8d4ac286a1a556c40800d941f784a3636361fcc6286106097702b97e87d53b5544104a59884a6b59fa0929552a64450ad97d36107a6afddca647f9028308f23e4dc69f4acf1c6d5221ce1e18e9654bda97456e95dd640c00cc2e5ca9a9a55b51b25ea739eee4431336b0ef04c8fb27a6801da81167d9e45e1b60e3a2da34ecacdbf87937e1e3f22d7d3828a94d00b859e744ec6265d543dae33926013fa1f008de8ec20020e336694c6c2df565a6040dc575717ef684d3f94e3008f4a3bf0101f47ba5a783f94a468ae4675e970a4c3d4708199054800067620017fa6687c304286c183adb2eeb9be26e50eb81088619611211609408609806564db47be23752a7b95a889c2dc6f58e8bfe4fc59) <<< 16000) + 0xd5f3abaf0f26dec791cb882b87d70e4522e753055c9b4be44b21750b08176afd36b6c1d090430638bf89083985d14568beb977c5d153074808002b46f6550ed30e1b16ba948b04be6249ca3e5522a1437610ea8a0422824dbbaa4d477dd8b56184090410242f42887c9833b3502499c02a8ea4f76d9d39ec6b702502ca5373921fc98b70864e20c82280003de2000be24714663881b1c3098cd80f51b4e0ec9a00bd57538b43c11b5ab5f051b16ea52e700e01bd96573f44a2e0000000000000000102ebd11c378a2ac39661cd3bd81879b08ac796b881dad82800000000000000000000000000000000000000000000005c2e69514842c9d4a7fa5f0511014d1451450cd02e9ce7a056d318a3c7ddd8a34aea6e37975c4c7889279dee4533ec9571fe58f1985e797b1c112c36461c8ed7dbd0b99d65809c5807d36374902cb2184951cbd4d982cd27da0508cbe3f8af7439aa64594b56f136f1402c0eae02eb3aa0af6b05a2c0b1d0960e040e5d76dc580136e80611c005d046cc8200160f764c94108402000020660100200800002221801ba2ef9a6704e938b668a54e16aec98d131af2f07e132ac9f46613f00030c7ec7eca7ed74155d02239be432c5878ea02866fb60aeb94881400685248bb2fb144c2efa83c491b5f4a6f5802b968ce5c6dc42934550030202d92044c0be1a0db69fdeb0a876c00aef0a8a7a8089a8f878ac01a6e0312ba6c00d2acb4c0382387fe6dbf3958942935b8e8a9191ec421038184ca39675a220a877b5cde57c720934a35f300404d52e068e5f4d433c5170138d901810247215538117b6bc245805e6c9c84700401acca93020f80400004948dd04e094678ebb0c04a3d9c7596083053dd02c006125a40848183e0100000d22000ee64708563821b02509f0e00c3857238feb85870878c0249914e80a90f3dee278a2229e0202800000000f300100043cf8329dff5d43870743c3b7671044cefe2279b10308f6cacbb91010f36fd7ed10410000cf9d9b4800000229b603c0091eef6ba41000eaf8a12d1bd900280200000fd9f3403681c0038f1c76ebac4850c5d776090200850c3f8d041006ca5c280068b47b8980084021c481701970a6b3872bd2e5b22f4209ea5f11faee840d4d20cca3b21c0837cc0f07e004121edfb82c9c90000f55a8f8fc4007b1546075d04003dc36281aba8c4801581a000086c8001b29d1c463037ce0e80a0eed3d59e01c50171ee15d68a2c4fcc054d6100c0d743dcea818414641e031830001bbfb350f0c000d08ebf681037c32ade8514808290240000fe9a1802e11c2626983e74e717217265063f015409bf0848d3f207ddbca3753ad7622c4060490be1ec5683c838ed890c915e872438e801e42220edb8f3531f9b3afc08412127155dc6678cb098c49b024c24d565fcc51803f79eadad52a2301f4f845e83c210a509f394bd6a3a6e6f96ae9b7d4bac266779b60da329847659df83b3a6bb102e4d0bea1408964aa8fb1b39e4600e0285d48043e8de522939d1e75aeadf0fa070149586c9a7d07829443640442be750962078d9e33226c60da222067d1b6000184886206c7002637e0b821956f7512234c4d950f4062940ba6a78a01ea51964001f008410463551922044bab584dd11c5bd718dc78a000045781455679d4730a182f5eff54104000464dc88015a59e480c0000017705200420100001b730381ee6961904797d89484c62d6cde4e80a57bc0ae8e043ed0bf08c006a390de98007c021454551e58e88ee2f62ca942b3d1272428628f72f11e080008bc85032ad5bc70a0a06544a8082f958db6040000175519001e0040000cd10002d93e505de8a1c53c93c823925438fde8fe88c921490b45f301e2001875f804030fb9340c07021bb6fc9b85001b69600bd20008c05102caa38a17e121d447b1308c7128075ba1dce080000d1ac04092b29786a5204766c9e55ce040000d06809045f62d11ac405349ec80e64900240180000eb11be010001d111bd05f1a00008aba07961110086ac794440c4854470755d2cc5d630734dad7726700089ad70c868000002328030066a8d917000035782e23924801200c2270dd8e54282268000680b81e59547142fc10336cb7c0de2218ecc76d4c1c1fbc7487c38c18b13d86b5840000033c9000017611070e49200480300001d621be0a1bc050dd8080010148dd08e094501f2b7832ccee5f49fc2bdc21af2174780669d1edbd222b35d9a4fe3275a9cbff03c2a597bcddb6d5cc01bac5ce60acc6a93a29bcf17fabb86d9b7ba230a35ce0cdeceee01808c9d3a9fdbe42790a316df24ff3c4572d70c723fdb454778efdb40a67555bf610aa80b048ec4aaec3319370232ccbc3b9a3b540a57952b39cc436c2bf3be4103b70f8387efe280af218a8e377153080d8a41c09a08815e6981e2cc10922e4ba01d0010bf1739a3decb8b6224c0b0981fd8a6499fa853f317f14f2ddf73a61c968bab454417f9ef25a0c889ea0001a90800a2c90023b723723a003376203e5a01e2500e848070140094ce46589749b5b9fedd96b59c8d51650784a147046045049006003014107b4610763dd01583513ebe3884502c59b15e0135e448bdc2c178b74347a26302eca10e88bc21d0001fd23707b1b7298db0ec6d407581e2f8d0002d1e8e34721ce28f0d83d6da99739dc58e4b7f0442b82236359c00000000000000000432e69514842c9d4a7fa5f050c514610508904c008000d31f94324c25b1b3c7134c4b785b0377d4965825171edc22b1faf826ee7a87d004cd00f25672c)) <<< 16000) + 0x1924c94f03558a8f79931a0186350b8ba34639a8e430c540483c1428abef1d65048d3aa5614086339eea12840f004015c0742a344e8fa307e0f36a89411c4aaaa6600bd2970f8002c825c1804a183c0100000f92368221b30100012511b21985108c6941783a557406b77461eac273badd64457a3ad690a690db5e97091b50a5a43e53f6cae29c3d368764aae8490112b52c9a6065dc74a491fbfe0ce4763b7abed02990e2682eca46a5847876d85cb4dac860726fefe71a69cc3e86b33ffd70d010aee175ce2b886189d752ccba930601ed65a22390fece8b92d569009a54c5f64743f08bc09041f4e0f0dfd238bbfc76d6e1c08109b28ab64ded54bb6f5bf7ddab82f51204ed6ddd4d2fd10e20636959334f948f4e15462bc7b27c5e314f639e04890fd83f100279b9cb92bf43655da97c36e284bd9d388f21a2759c63b79570117ac9af61f193da2a71d1ce43a138630a46e28dde47a4de413130161a96a85b74dac83020a28ee188be72ebc9e543c029062ecb82c4fb94839894f8a6ca0222bb1375287e3640b935d31a92b0b7f526122c6492db85c76b2c10ae422fee49121c6d18cfdbba2466042e75230df53cd81920cae6d8a5981009647c30c015a7c44a4a083e010d280e36178d1761455e58f249cd844c60c31962376c680c00003cc2f760a181c9d694b6ac1428202d3742f6c1c54574e0001dea28a26acebef9f3130402515fa2bf7547b4801782034a0378fdf30beac28abf78fff3524384c6062375496134f286029bfb060c93c345088ca2c21f86028510b5b8cb0b32c1453b43535f602124c1035c41439049e3800cd2fdf2a9e48a3ae54801a02a00009d0800268902501d92127a91951c76d49e10520302b33718510a1adcd7a2684012bc91f0825d23769b08002ee9be1c9c10840216489dcc87bbf41c7820e182359668a0010c04759430ca6bc7249c71a1045e2fda09308285f0c827b3a9800cf75a7f395100130f62860d2000025bfe65052a7c8215816000086cd920bf6699c1c77406188e203052d166f910a230cb016104b3c534d21000554be4b4c004201099c0099b4d17659a500e4005c7e645150a152bb78cc26304e75b0ffcc650c0428b5d2b419a281c908632be050a358d84b8a590a2913f25e50e543020ab63fd3b0070a52005c07000023823620a0003972000e8c4398071293b704b34a2a853e6b0071d245029d9310298e5df830c504bcc384004358d5326002000869407524b8da9750515764d2c9887d9098c135de5c7c1ed050c09bd346809af268a0ddbc0bff5b6850a1c6f0fe277dac28abba70c6f876247061f2e8f1e58ad298002b5f7cbb77b5475ca9003405400013a105b01e1417c3ef7d2084686d10d2414747f7c60b086b9d591438007e91e639400840218510c87fe179046e362b7df082457db03fc0618064110b89c107702c365041715d615ada8005881f1f7a40041214e33a20000019e484a400900500003a870a0a28f8d21042970be558f1004ac81249051598257d2c21b24a73d8e001f7658a66002100871605606583452105978a297939b92a0a0e14e702cecd0a858e0d3505ed409ea70c0ba7dee973f0858c3089fcccbe4bc30ca65c3000a0e847881a39d2fbb4afaa0000bdaea8e2235475ca9003405400013a10003be2000d947d64aa163a86d19ac0eecb8c6b688409bb11a1581a0210d7480000000000000000109a31995b1fc7d71b91aa2cc723545941e22492881864830824413c10c0c000080370905276e7b79688249b67b2b0d666e048509ae56df6b00c245043b75657446d3040084bf5e610a42443066c3f7dba2e10440c63e193e4c2342012abd4b924054800490c46f9491aa3ae54801a02a00009d08d80086bc040009a246b844001f6840075008d68ac6b027838b27e87070400401e780090a0f80206ac5722c51046f3cb2dc2bda1508222e0c96b0f180c8ae4d541462b3511050021fb340e600200084511e4ab0e1ce38b0551c7ec702cb094cb5a320208807108d1eb4060000067920286018dea70f018614ca9ee6a7082b98435d2785000ff57f5250d8900280200000fe10d801e18e51d1c204936ba24df880e0593d782a8c37bde014a0407e7a51c60223088d043000e79f1cb380100043cc0551c7ec7018604a65ad1900926200ed4297a90e07c3bf010e447000006792016384881d8898071c34dfcab8ce1876403ca64705400ff57f52506c2400a409000040a70c2f9b43a6249d3d7bdb85461d3a70654410b79323d40102063d9f18006dfb391980080021e60293863a2e9a581059bb41a924c5d4bfab840820100f2e938061cc8527788b041051add6fb6220800008fd901609dcbf71764aa006b50949f1644801401000007ec80019f90006cf36498864b468e3d60fc57b1c282dd842e220d4b4d17d1a0833adabf8c0009a4cb888002e4b359ce0040010b24a9aa859830e3b8e4db6a1e3c5000006792028a248d80be79104122e7bc291a0878638b9d51c1117607ac56083036fc3d3893000aeb6a07cec9002701c0000f8905c0182d808000e2cd9208e229e8a1e89d9e2a0e3f8bf87243850c25d0a098868fca58d2083aad223880070c78369c007c02145518769f87e43470468c85ac3a50e22532d9a05cb141a75792f4a8a28743993bbea2830d74ba368183860d3b1739820504691112e0f3a6006ba78b5a8c96c9002b03000010d105c014100e3dc3c4e59296eae232071e893531b49e2800005c10402159f5bb1e6823585faa00704ba71076c820cf06e3e3404079e2764ece4)) <<< 16000) + 0x82118082c9210c84fa871e60d80c2c4c408a0eae1d1043299087a3410ef70a5cc70449d43d2d0418be230b60f0000005c102405255778819208440180001c2200075446a814000ee4787335649361c771b20812104ce8330a640135020da228100e9bee6340216cf9b3000083be0c8402714200080000af90016ed23523a1a805000be31003f7d21964b1a71d8178ac69847018637ef30030586d4d3c6083230636b6200024ab3470c001f8e1d042000532dd84a004c38420101a501c0a0d28e00282a239f58921523118300008c7074021616b96a0000000086ef46ac19734c224211145184303102082141300103d622e381800d00011d20003c4461c940343a1a41d0d18a806c2430c0a0003cd234453e46a8b28fe3eb8ddbb2d6b391aa2ca0f0fcface4a84b0beada43773590614df3bb548484302182500380280200a371b1ab1d8fed6cbbbf422a82af0bd8b17f51c0217609f3a5e0ecc304eb2314bb8241ef8b0a81c48a071a66ad873defe95ffeca27ce47fe20c892c3d500035020e87b0381dd053e787ab6a38f56be10465ad21e1987fa504602000025850d5bf3803000791c2261dcb8fdc10067bc93d963a5115e0003d68c9f3c87fbc2ca0000791ce6e2b8e033d0075dc5bebb744815c667432226344007c585ae5a8000000021bbd1ab065cd30890844c10a082083042040014008416fc9da55a651b80000eb5fa3bb432204f570c3c2d8d10022a000364468887ea52e842cff3b7b9820ae9b2c27bf4cbbf761542b00c44f77c00000000000000000435c784a05014eada790327a7fa0ba3793ecfe0332cbd85147c0000000000000000105c8d51651fc7d71bb765ad6723545941e0000000149b5b9fedd96b59c8d51650781616b96a0000000086ef46ac19734c2242152412801801001004a027314aad9bbed671d6b81ee6fd4c5502d4bd40f2f25ab4346e5c4bea92460aeb4b498229804b28cb6ce6c8077e99de50c9fea762d48219aaf0bdcc3f8f09224fe2cd9136c0eb293476f3b97df53ca26e22b01f9f9e0c190ac081191f9559b885ddf9bb92634c5a54287b5ac8500076521fc7a05c25027868684240018ac46810400b4a068843d404a6205910e167814324f76bbc201127106eb2c05c3543de1c009212d09101098808002164af1f5ce6246f63101cc3091d60cea0908efb8662860103f17af4094407c0200ae03a1ff529a390e2a2bced922834248176a5021e5e9e002048264907a12860f804287dd722cf838acd7dffbca0d220762a940a0285d4308112935ee66005c7faf61098307c020000252467c240004ae46786433a020003b123360be7835068847c13eddab70584eac02d33410b46332b63f8fae372354598e46a8b283c451040a2865823823800003349e0409388a029bc64feb1dc937d7a08c4840f11e44aac6543b09e1fe676a2eb47380f6fc7a03d9575651a7f8b957a60a68b35199c580de310c4144445e783506850d83075b65dd737bb356531021d46e2838a0c02da31995b1fc7d71b91aa2cc723545941e32882051432c12811c1403455365c80102e8ad675f35daa4c3344327bd81eac4b60b425370e2bb5032e8b49268b22a1a818728c89a33a0a00030023382a000688205e2b91c1cbe05a0711463ed8d440a45dc85689056a0b8dd48000dcb95bc700a943b1782608200080cd80e7ab0cc93fd1c20889eac3324ff4708244d3f67daa41ccd35311b233748a3b61810431343e182108f827db5ab70584e8ae8fe5a089cf06a0d108f827dbb56e0b09d5805a668215472d040e066447ccef20510710408904a0040021d024512890154755d66d36edf621567ac8b86fcfa7f38f62dbcafcb4d49e3525f8841f356c70a74886c285ac2c77f60412ca8bcfa4b84117163207ad426387c501594c3f868f1434a10ea000a52407c442102201e110cd088664343301201d0900e028001cb88cb92c658960522ba16c9946bef0c8e1815507f72ea1425d45b81de645020a64b956954602d2100282270a01745a97815c0c000ec0e5b7a280203bc9314354a46c8845c0914806bd3a01581800008888caa0c650f630c3babecf9a6db4d454538a1a056c933e95c865708e582e8d33d203faf3409b81cdf823a8a759c0000000000000000043bf713899b0568c59498852a03252d6165ccd7c238a5a840000000000000000f5c8d51651fc7d71bb765ad6723545941e42851c5142101400108fa56d77fd60c77f6af880b564deb6c5a96d4233dc96fd935c51c8fdc3566a6ee32d5a8e08659678da6684534241d0d42abebd1a68ac0cfa33b7f05d614cf94d4538d75ea824b0827203f420b5c8ae2dc307dbb6f747ef07da612f70196509084ccc3dd420dac9c69570ef6a4bab95763bdb6d11117445626a022a9b29ad47ed870d06d61fa5713109f84ea1ebcabb40a437923b6bd533f53fd6ff0d19d9093a56013f0c05a09e638f9c0000000000000000205fb89c4cd82b462ca4c4295019296b0b2e66be11c52d4200000000000000007a450a38a2842023002801808002097edad3728dce5f846c882af70f688c47663502321c2f4aeed2afc42bcb3d8f3001af6b558e81384050003bd23264a0670d0c9048002f88812a08644040043fa417027c28e389dbc4a038cfdf284858b0204846b3c5e8f22253eb0ab81c20204b9e36cda5e93d4cf8e09b33a0e00188c444bcad1bc76887237a41808dcc9ae744dd60eb207f47e6c200075672b1c536801aee7e8a969404445445233bef2f417b6d5ececa6a1c033393c031a65f5736a91267f802e)) <<< 16000) + 0xba6b145ad65e4faa4b50db1240261254d428b11fe33231888000115ce04e1b9014570880a4c656f8f620c10e22d5cb8c8300297a8588d20503bb4109d6230800c8a1d18a0c500111426180713e3c0b8d963a34a504095a111dd4148c776682b02c0001141190310c78e86382631a0a18c0140c8c2bb698f143840228019107c3050d5642e6af42841d1b2f3d744400153cdf1c4d4380937d524c5e628041b86b0ae4682a8a09febf33a38920339c7e243c15527442c02c526d6e7fb765ad6723545941e13cd3cc34a30928304134020030080200df300021ab1334a465154f2cd265cdf539e309167faa6e0a0c13661f7804135b058b98900000c8e392704220080000b29a4dadcff6ecb5ace46a8b283c279a79869461250608268040180001006e948b9fbd469a4cb8853d6c6122cf7eeb1141829e3fdc858200199573020aa355ce6848000113b0fce004401000016323160a00027c20301318a09d26d6e7fb765ad6723545941e138c38b3092c82420413001c00c0400803692482127b6d863d2158b1fa1f8d3600100c7bbe788dcf0a29849bce4a7da3fcaec73129ad33fd1c781680000000000000000086471861261059048458230240018080100680011391890d0a9808000d6480b0ac620460321bd2cf3c2e5c2c59010d2b4c4a287046fd8d1c1409187d5e5c05040bd5bf4cc0826cdc3d4942c0b982c1db00c0000002eda0034152ca32190204a020d2c01e6f7922c85c8c0f93cb1e40adeb592870e303bd70a05479c75ad141012fb7ad4700002ecfa2509c40880200002d6461c540342201b010c3008000ec88b38cc61467233a054d3e60a14000051fd848b6a98d8f10205052d20ca41008942e33660104f267a5d001801cff9ee51080134236cfa0200339453cc9055043a4c0940400003e864444a6c18e4b204b0575c7bbf1c406a7bc71c01c132ddf078bc28042f24efff818001b45833b30400c36600ffc415402b0fd2ec1a0039e8a6df0a41cd0a00800003fa4198160f803a4dadcff6ecb5ace46a8b283c23883863061820822001008228207d7f0a9309c4c4520cdc285e37403d0828000ac900129b23087318331d26d6e7fb765ad6723545941e12c92492872c518420328214070080200dfc67c5169d5f630f1e80eb6646262841010c4aa775244f570c2c5ee1a5f4b3547c1d3ad8f322e603c10900000000000000000088459258a50a308504482081299d732bc1fd2c1c167fb245e4b3d6225e35a12e91e36c339479b6daa24336b2832fb78237e9f56e7dac96cb8e5fb281d7e54bdfb704df3128001de918205d6a9d775b777de3987ec886a2def512fe9fb14f39a47422b90b80000000000000000022b01c2ef9c39dc4ec92f778c57755b22f6fd5e54497bb18b800000000000000007e451050a50848840648237a9ba7ab060d8034000ac4c8f3a7015119221eeba85f44876d3243fa90180000bb6830010a59de20202a17d0358205ea6e9e4cc204401000015f349b5b9fedd96b59c8d51650784b20a20820a14914a10910609c02008036c91f484b3d1651138ee42d01c6184114b00d81429bddf3a72a2459bd2414be6508d272a9850491096307b76e0c10556bbe82e1c0064201d9a00800a05af5421da8109c06000044a40641780e177ce1cee276497bbc62bbaad917b7eaf2a24bdd8c5c00000000000000003f12472442042432031c21801b29886482f39c8d68b4f7b760c764ea9a88fa52d2755b58bfb9ec52660f80f49571a63db864d1034000a7c81280c00183c87a04a936b73fdbb2d6b391aa2ca0f09239028c28e188088006002022e0400401b64a76379409160b200914b4f2ca84102d1d7ab8400287150758657ad9229d2004880d8c61000e6e5b7d583060ce449be85b2828dc84a6cc66060002b4899f909d812085a058b24ff68e2899438c508d6a1186096ee7bc448a96add2a04910101aada8141508b11cd22c0033b142ac08006a3c21c9a0108c0200003364064174419e1b79a0448e1dfbef12012316284788b2408c1beaf7e890180000752104838ac988958080eca148b151830980500002f8400163c8c080c60004000d8a45fc842fc4217d210be0c85ec442f412179090bc0485dc242d812176010ba808005ce48ba28c5cd362e4931713d8b818c5bc962dc4305c1d8b68cc19857020038fbd7dc99db7e0f69caaae184fd05695d7c029d47881173d642020ac7a704d01dfcb8371ac5e48801be0cec6585d5ef4c867ebffc0a06c1d046c1a84db9f1988a4c0008051818fbc1bdf033a7827eebf4a08888a86cad0a431ace9be5ce2a8321e41d97013a9f9eaa38d8c854d5c0027f7efb7d9f5a7f42cadab40c20cf9c3272bae7a52a4670631100b600b4100d274bce5741da0eb862e0b7b621dc57dc0d33d88e0279ba6aae50f92af1f5555010bb17a0f877e9d20156a6371e05819b0d9adb5d737783de179923a92143c007b12b87dbba10c6e65474af4ed7e372a71f05041a3f0152719fbf21c1d5043be947812e13e4f44ebab0c5b16734e7ca603c1c67f105d5914c5a5fc62e5511e6ab140001110053388853097dbcf5c36481966c2fbe8bf951ce7671e8f0a12072a749b2d1556a4d462e3cc9d4bbb3f07642379586bc18d74e7e605b7daad2f93a15ec3342a21d74075a772e28be331d484a802504e92482127b6d863d2158b1fa1f8d36001015aa75dd6dddf78e61fb221a8b7bd44bfa7ec53ce691d08ae42e0000000000000000008aa72bef439806451ad46240175f696ab469723d80bf61f54c00000000000000)) <<< 16000) + 0x000000000000000000000000000000000030391aa2cbdbb2d6b0fe3eb8ce46a8b283c8402082280000827052a13887272086c81e666e293ab98879d97d4ff2b46d371602a89d87ae62ae41df1217d7354d19c9ed7e2e82c2178d76791ed7d94795989968ed1bee1f1e850bb78e8812aec02a1aed2081efe0ad24690e504b52cde653149c77ce515ef26b198155d2fd0ba0c0d17d0253326267e471a868238d863d06b869af27f78d13fe6f17771e417a9fd085c153a00109241d8572023602eb100793f31c811060e00405ac162d40b16905c010040101840316801c01d6e856a602919a5188049d19de0409a3543724041b0084d0f8608423e09f6d6adc1613a2ba3f9682273c1a8344470b3e1de42f527f8b994bc2084862553ba9227ab86162f70d2fa59aa3e0e9d6c79917301e084800000000000000000440000000149b5b9fedd96b59c8d51650790e2c81830d000603f47aa1a25cd40bf1b947a5fa8348e32ce588e073633e08a53fdecfcbc3550436a897c4af932708d9933cd2203b80f5ec8d6787ef3504fedb4b307f232f55287314c87c8ef33ec372fd157cd58634814febd0a0aa69e50005ab206e1200069b20b2220580100039611081982504e8a1341cff10c180c358f847084c2504f0105bdd7763024002fc799b0ca104201016801e0618d5535840616505822187da39d7a031841000438b095651560c203ffcb4a480c39a773221876e6328c640010a1a2600c003f6c279866082100800009990001f7349241093db6c31e90ac58fd0fc69b00080c69e6b672f80b218954eea489eae1858bdc34be966a8f83a75b1e645cc07821200000000000000000111b13cf9c51a4832886506415428a0821c1300240a5a2b99649414cbd49be534c3c24bda238e1581cd6f00b7aefbae8b98231622104bf2d5e3576e17e9a6b1e656aa0f1fa912798bc253a599d03a33ddb24ecaed41710a1a1e7d5e7835068776e6ac56c49bdfc7f365a5c9b0464d0f8608847c13eddab70584f46769d941098d3cd6ce5f0164312a9dd4913d5c30b17b8697d2cd51f074eb63cc8b980f0424000000000000000002221450a18411808e09c7dae407847171c943a92db9cbd35be1096a5cfb56cc162f46d36daa7146638e8040d08a4132ef89ada82bb18db678291699570836898c4c8e89fab3d5830558e6345768752329a869421d40014388004e7103b1501d0880e40407002000d6a2002b58459c762cc33a4920849edb618f48562c7e87e34d80040248c30c40218258050020080e1f4bd526cd82686835fdf07413228dd01f0e84fbb18c32d22076a5d6dd63da0040dcd17841a00042e4594d62c8630cf2d8b194c588962c23305b150b008c57c362bc0315d01dea6e9e0a4fd771be2ccfafcf7e6bfdfa0882687c304149faee362057a7057cc6f77e8222687c304286c183af324c1d3f9de163de084ca08308304d00a0080103000bd709d7e2460f07fc0987b49839cd6acfbdb27796db5f594c012fba3585991d59a529cb13ebb44b6ce06cf8fadc50903624cf2d683b0ae8a26611ddc78a68eb0430c113cc807f8a27ef0961e28045d76ad840003bd7c08101baf06318000cc38e5e100a0607c0202b813b2c8b257c52030a528d9c185fdd71a4250019741488601769ef2a212860f804056c07860922325a2c601d8987838dcbd92df060496669c284088e84bb71c02ecff57804c183e010b201f11e7d2c654a4dd1071bceeb99c34091058d00602f386e180250c1e00800007c900023d22262a13a010001ca9e46a8b2f6ecb5ac3f8fae3391aa2ca0f09c21618818810409c01600c02060326f5e368ab0b27f3dc7e5242c00baecf95b43a0816440a00035e456834000e524564762b03302915c8267f74704a66b768c4a7df70fd07028f567fdeb28e667497060559e3f58d3e7e1cd68a78f3d2872af187bfb66fa4057492010076b7aaef349de1bf7262be680c93dd2b8fa3a3f09686a4ec0c01d529f839049975e585c12cb86735e914b78804ffb21c148803808099fa9e34c6c97e0a986a1724cffd5e5c404f1825b8a04ea5495b5ce4959ca64ec997a3191b3ce89721f0e310f77cc21e07fae84dd89669acf42dafb87d187af7dc01a3c20505e4087f44f331891c41ad0dcfc40567c7ae62a9e02dc21c5f94200019148ab9cc558d62aa631542d8a994c548762a2231500d8a780e050b9b5e9a4021e6779583059a2d1f11c0711bfe692c007b003104807c660f6d00040098d07c021cf06a0d111c2cf87790bd49fe2e652f0821a49208552490426a84f7dafc69b00074c69e6b672f80bcb5fc3a49e0290d18714d09000d0040b3ed33ba544979e28ca19c667d8931c22d9ebfbb6ba371cbccd19c6bf8a4f3d1b48e92a45a44ceee382a8e5992d782dbdba4e1810bbcb654e02564fc44811880e804053807c10a077c553021a95df58105a1c4c58870161aa51e00120a0f804000035c8a68c80007008a60cf40e6b5a113001627703200a612d370023141c00802b80e01802008a0987095e8800c80226281d1d182a2442fc58180515ddb04c00700100001327c0077697ae0800c6c844900092cf4b442608400080000a630080100400001110001f830000100478613daa9960334f9651c007e3df9280543c0b52000d80400002f4c0100401000004441701604a020001613004170033f201a96b23fc302b22f0760230c1e0085049f42254410f62a54880068021302acf0f85816ee8cf8800640200000d864203f786ee4801827b7a00c003b5c323000d70550d424042000800)) <<< 16000) + 0x006998850768d48f02040c819a066e6dc108c206c0200001364000a648a5828000dbc80039d912f1d0960080020e0f3c1a8344470b3e1de42f527f8b994bc208692482154924109aa13df6bf1a6c001dcb5fc3a49e02b12ebfc532640d4f012fba0bfa452f8d82089d198ebb9a00000000000000000000000000000000000000000000005b43853042813001c010290a12afe4fb322643c93a7dc04692d6460a17e2cfca70948b08bbb7cf1f473d718f6d595ae741fccd3b90663054a34502182c91891f0e4ad79ddf5c7c0165e042fbc22842f246c8762901ce42e8a36d2939a3766a3ab8a0dc12b42b9fc50263f72da24184c1aa08a05f0e6b8d0064181d00809600800039882a8a852844000dd47ca12b50f0afd167f1b5f64fd5de2a57b99c3388db5fc020462c5a9b924927f8c96fa73793cd72cb4550c5352b80c00e62c6d52167d2e1d2327a39ff5e303d43e7ad15a800e01762374f87d4ea3de5bf7ef57232ea79897bf2ddae00009fc24961e3fffb6fb3d319fd02400ec71725604720080029ce2b1d1a7d3ca0981801126c88107fd192dd256b860840ac751763ee536d2d9bd4de79135876e02965591a00014008a488800668c8a412c51c9628c3b02519d8ac2482ee0b6cb85833296a783810b04f8ee8374849653f1fc0840d9c1e681e4091bb4f17bfe70e008145ea5975b8af578d94a1810051678f25a62c7c84572b330000146dd0329ca7626ce24745e02012884bcbb2dcda3e8e1a1ba20c0766b48ffb73d69891743e1c40d3c2a38a220192f8cf9a2043ec9b21022313fdf50a27f6c0f3a2200bd07b5b1302100043880851aa7f2048032d5a01443eae86042304200080000539d1c39550df668834c868a9243082730f78e18b6095c9c40e996eccb4500067328890982084020000266451426288130030588982f063063ae932c29472ef0a0c2514c1fcb2c00db6a0891c02f6c2dab0000de22e20000261c2000800009b90761100027b11362903a14819ca42864a038110a106813c342681a0008fb2282931404589f90c4705721aca7763100ef72b88deb8df716f1dc922e6487a523ff3ac03771970b48d9c2e77517f0922224483e2d79ef0d9d01002c2f9218d24c17201f615e23f3325595f457afd678c144504267cdc68f6949d44c16359ff8f879ec28943ec9442801e2cfc5e08e32d2ef281f37e8036a85b62c42a85527591926668b24fab25d40dc029296d99cb6e2cda76f624454f11f7be85ba30071c5eca0d7a6f289806c57e1c7f34d4961702219852ecc98cf854f57f5d968f34f087d1e43ad8a80e1998b72324693fcdd8b0160da074023141a0080930084e80400018e40d07627c3313d1189e06c4ec260660b905d79fab280d41eecae79c0258c7ae0b9262556073e02decb3d2f2970f53473cae73096a402abc5717bb6425007b76f423a2de0711d69f101142d16f22b3c7cbf4cbe4e701e9dd84a240b0b1736312ee05e732d9bfaeef811a17aeea6ea81ae4cdb68e1fc2d12cdf9dc0349c6b800011d642f93a7d7114a89ddad1742215791d46b77ea998d9b46873901cf897bd98df888d5b6d839a924b234f25b3f36494353b6c9886e26a5be27b31d46c37a1e5c0d86182a7198506f1290ebf28805cfbd1269413dfa5dd1c796cd40beae758d727b8ae7731dd478cd464fd120a9ac6eeee69975f02b0673b1036892d4a8e60c65b8c76782fa600e7e29198e05ddaf14cfd833ded8f18f07e2cec609c837b276c05d2f1371a50000a768900bb7dba7a1f8fa28ef11575001502fc65b98cad56402ae3ff6405a3b5adee681d0e6b248274b24ee742ede9b7793b2f9a492fe8f2e346e9e4079b2c7d90d8feab8bd90974595e19f1e2ce817e070e9fd4921f8f4709d3057cccee7e3d680730e3d5fa791e0fe58ba965b65096e2b500498242740a00059d200191e40944627203c18f77ae0890104cee765182ac1bce2a182b06575c1024101f00809c00c124070403ee374c005ce6514f3e25825959e4cc67dd8e0659419aa3b33b4041526c0000000000000000000000000000000000000000000000000c200000002936b73fdbb2d6b391aa2ca0f19e11010c1060840920007b0408cfd223f72a276280513ef1644e2818c201b4d1bc32f47f8566e6ace0f536870be70315c2d2683685fac0678339e5510e56fbe63dc56acf7607a2a441599eca167ca2370d864990ba0009e044dc27c8d51651fc7d71bb765ad6723545941e12c53022021413802c018040b626daa937faf041ff3deae42774eb99a5ff60d35711d3162090e47449908705e7205d10a80010311362503a10819c7426a3a0501901c0a813c34268120008e822666a1322d82e1684c4642600a001d79200849a401533483304c1f007610fd42385034497705ea103fceae9efec04c2ee5e2c505ae413ec1314c484e9eea45b9faccbdf7d35116e2c41821c9a6f1b7a120fad39ff7c06a20c10dc1aad20f85eb14e8793b54313140e32d53b2ac4800cb81a2c76a73a18124a6aa99aa305a023f7f6b5aeab80d564610a0c0cd5590889b375412280002c480165bd789d3a565aa4ef5b8625e42fbb6039efe707467b1791f79057f7e77121399a01a5eaadb86cad12b89f40576ac6faa464738e369928a8005cabde86ef0a0a46fea572ff11d23de7669c1723c1546c8d2480defb50a2eac4377cbccbd0ac059a8e3d5b288f507355e05c7eca57201875ed499061cc96f70025589d1531141a368265ba9b17794a3850b234711882d10bc7c0ba8ce34c4f2ab603d0b921bd94fb07ea71ec)) <<< 16000) + 0x7818000000000000000020ae4d62821a77c107b41f8984fb6ad9155fbbb5f5106a3ce20400000000000000000000000000000000000000000000000000c6d89e7ce28d241944328320a98e19200c00a028000028e74df9d1e0a9ae0b5ef05e79375804c1e761a5a45f9ef11bbef789271026e6821f67229863295ef52f3e3a9c2973b1bf89d0a00958b1fbe1fb9c4f768af9665f3e65fb5a2418a3441efb721e72e2775526f9dec894ff7514f603516e944ebcc419ed4e080c04840a2fda0b1c047cca8bc3c9186b4b3877b05584189b3f7cb1bf9f03ce27ccfd930eafd53e283da69f7a5994e6c5a9d69dd529b96d87054c742b41ebf25ae889cc2ad874938b6985a64942fbb2b81ac9f340cf7adb46d5bfa5f0b96d305a9904658e5bef1e424e7830f055dceb5c0d00523b5cdcb018d0397dd0040909080021045bbfce87140065f9f6280110a1000420080200812f050970284b4142580200007622561a12a0902c84800054c83990c4a4862503b0661d8938ac4984624a0b12405c015f47219fb53eba5923ce7e895c73a88d1e6942e2b79ad84f49ba9cd5f090a38a4fc6c044a06720ce0cc2b919c742c08c32d0fcd587324b04970bff3776eb5c10b811fbff0f98524e0d55d7c50b9bf22667d64753183b239ff912eec461c07d894f702c737fc8ae56d45b8004f64b4de28648ec864a427e002d639a72312c2f603a4f150eaa153ac2f30ffb30000714e0ad9fb823a7546ff4aaf0f0e4e25dd92398a37e8ff5457d5b9b25bb9e969770fa099045c44201efe6a96a8e803b12c4d0ab3ca04ee59971c137b2046231de82aae52f4680ea045b980c07c16f3ac96003cc079e7896ce3356c5386926ad18f8241b8c7e72c501458064a811860f00420100200880b649f81c93100d611f81c022bbd5df08c207c02000014e400039089184c00c062440312101c1073f53ce121ebb4034668137986a41206cb0b0fe00012100f00400003648900e81d8440b21211f090001a0111e3908e9c84106423822000b0b22369311a4588c90c460570040100402c82c45c1622c0b05801e117e3e77e500b41789a48140f7bf240034b0028004828380100000cb222a1b1140988984f4188d4eee8780ea4df280702c195c66a00811920f80400002d088914844494220420a7210879081986421c3210d1502d868430342161210a01061008000decc8a7de147bb0ee59c63ec30e54a5ffc3762a91bee8d77755bfd2b2180613d55a68192dcabc3da4b96717cfe098f2bfcb6b2424a505b58da4a5d51b33205e38a64009941f108c58ae9ab598bb7949829f7ebdc2ec282cd349d65ea3c81aefadc43013a880fab6bfe1744ee2e2bb8090d77308a632458fb3620087cea88b40562ea000022bbea27d67e153c7f5396f446defa49708dda4825f95c2612907d4e7a3644a3bbab9e739bf0758e1f8921cfbe36ec5860d9fca79aed6e109c32f6d4707e4cd642d1446a18b15d33556e5ae3ba08d3f25a989d48bffdaeb8a529fac5a0c00114d940f386e8bc112f78895261036186e7b5f5be4cd88493dc5669183d0d7000100440068948011ef9919f77d40976a9f4b020057c07a3d2fa0718936110379a72f8432a61187a90e5d86083914fd87ecbd70253f8788e1ead96c50231dc55228208536dc3ecb866e16e4d400001d48cbd975567d85e0b826c52ecde6551401774c4d5dc5f14b0c980725c9ce52993f7f1d36df4ecaff5d22413e2a91ca0a147a0346a4ad9c39c8db5c49fbbda88328b29a8c7e6c9a85accd91b1e05a000093e400c42c8057359ee83fe140541f06ea446f7e9eebf32617009cc3c38540000000000000003b43785a914552853a16f195bc363b53389caf7103b70c3a0000000000000000000000000000000000000000000000170840c3046005001014004054141014ffaf6b16bd1cb85a6e32ba63573b04ef6f5530f2b9625d1d1d79fa81e0c74a91f9a021c740138b8bdd6134eea6193237125d9d7f137cf55ed13f022b5c6e369021eae761247a4687c815e77628daf316ed2065acd44469bdde6fbdbb2596d0423df7b0f5efe19b84ad52ae52eda382cb39a4d3c2c948fe22baa3a57442404000dae402e7ac80739c1a49208552490426a84f7dafc69b000764188e948f127cf9364cc1421c214208114010008050025660ce0a52736bf60881ca990167b5320a4d0b60c50854f672c9cea3531d8f313a4039702ef2218a53bab50c53461941f460b85ed7eb2953efc18f695cf7f7d97f9e77d36d5b5162ccc0688020484537831238b506fac390c70123cccdd728ed5ca918a011004075578a75e2d9ac6f1a148824127963d8dd4afb33ea271cc6010001030b955916de913c97fc206c7eeeb0a51316fbe3f930564c0974160ef87592b28be84cb39517be96b4542c3f7da78bf620840e298a7942ac0f6278172f746c2fddb9b13c6978c51425ffc13e73db7081167807e81b81c932f916bcbcfc6fbc0344c32945249042a92482135427bed7e34d8003ba8da70764d005eaf368a7ff89c319c56362bdb0ba57a3f35e2a48c7cd50400000000000000000000000000000000000000000000000bb20c474a47893e7c9b2660a20a208196094008007d0f7c615e0b98bcd7f4ca0e68dd1b8943971b176705bf6b08278807a59009a5814f225dc7074b6e69693f70dce6703981c84698aa1ed73f14fc4fabe32bf8e8b222cb5d8513b559691b9daa762286a0a5368894ce4dd220747e277b85830bc423b22805e97cfe01001584657a128410004023c0400022a40ec462102303)) <<< 16000) + 0xa1188388c4182620a130390581c00e4188e948f127cf9364cc147fadbe4e91851ffc5cc0d055c8d5165e46a8b307f1f5c668c6656c1e33061851442401c0100002a9775d40fba1cbb0c21759c49ac15b968281a25145374b0213eaea38b74a864400c2c31cb0e4e905607f77c90e438c7cf54928808de140f0900947a2ec70c1227a14ee6001c4b8c59098307c02103c1ffe8dc0e30ec5b9881010ecaafe090082ca378b060869e70f7a128610004000040c88204f474d96407838df9cdaf1c616086515a8e09903d6960c043e9f1e6812880f80401680400022a42d004000742440c862040bc19afb0de17a891557977ec8e4300617926019a839252cd4b45975f200512424f2da4571038653b7aeed5007041d0e2ff3d8da7af931c8543500b00a902361796318bf0315346a00090052a5d19d36578039735a9bf6007002ed515524b3bdbe4f4ae3e3e00001068271a8c947e3f58afc71d9636a4555d7063c9cbd807186812860dded2b1ec617f8a92cf0a242b4e3ac1c122455686202b54f8ef06009e2936d00930a0f80402b814000284440464200320ff0d0002d290761900064790fe350449883f4a41083200143321f8520f419000d0910f44587d80e687c3047a46843764398e3a02eac650fc111473dc990ae0f49844d6b5233a107f03c0b30dccef9bc51b0a990e5501b2017b190e7940e3658c1ed800000000000000002098c18e00c00a0280020a5793db4a3b2033034fec499424fe2f090305f4621c11f4ee4eabfc42b3e690b55f14885b064432b7e86716044ed40181750df75fa83ae0d846a79e3c05699896813421ac12f624955b722d92748e06f4c045ac18110d17fe3029abf8de51a8d3b1fab73a2ddc41b5065502f2dd6c9c278cb8d2c83e8449321ec76517d49fcecc62b844054510c3bec03004011c7260eb1a1cc00b28128ecd0ad2071200002b4a0602c8044533ea508123044cfb62bd40618155b5b6bc1410551c62f8388018043d0d7aec1282000e03bff7043c312005a0680ea01f9e9843d5f748f2400008fd90143884fc62c973c33179946b22187cff6cf8620904162a414ae8608314ca46001c044bcec446a00095af3c9873224009c081e79a894bb9cde9e480000de1c1a14386b7c288f8b942844f669ab191e18e9915b3e83861e566a3221e2860986f67085d9040075a24d9b530002ad1be87c31cd36400b00d000044840010c487d028001a8c87c84e02002008e280ea0a07bc0b28000040740061a67bf845530a0c22237bc780209a5af0147c0204924b96e8c0600788a0d212c2001044c5ae80000385abdb66a11200500480ea0187c00e0585cc28cf0dd2088f643b2498050a16bf714d0b441319bc5a350008196f7e4d29f428200000cb5e804004d399770950400384a7af0ff00029fc4bffcacd049002b03040b01c126631d472c8071b7b8f38d3208598ea42b60ff104b4ad55b9732a1031db043e837bc2c10d1717e894932800f75a00c83b414009ce06a2528a0005279ba0f30a09d9fc80180220000934f1e41e75093f14294e9e0c71d2c40af6b284b81879d21640478308838f3e86a1008df14cb9be1014f757cf0640822542cdbcd8000ed9072ce96448013810016c0400040c4001a9087b8480023e880049b90db1985988c3d8360ec1b0f50d82680c1300781e9cbc223e4040dc4df908411271fb8fc00462844010d3000009c4010477ebf69e42c53531cf3c640aebe35265c9108ddac211082182b1c8bc202655dacc122020b64f26f0104786131c7524008c051a60000073b90008221385726bf3658a1da3f18d7e024416e3b2e5cc00820b079741978080876d6ce32bce1040758c5e2e8304107cb1d40c6016009c1bf219f83b412005a06800022d3c7870c0c27234b8a106be465c868281c43e456c9d776a080c5b937e187aa00c31e46e95dca5e0a041d78305e5f681c129e57a8ff2c5cb0013a591cabdf000007718e49da182b55c4801902603d0040004e843a8260ae03822ae65049b1489628a9b40617b4020589e0f6a09a90208418ec62e938080c580cd97383412118e1eb6e70f80822b7bfcb585ae5802a6d538faf00000f3c5c1e03c0721048017820033c0605203a2a8005dca01a39a98ec80328775f17f66e58c46ed88188618c8f150dd0a100001388008218ef85c44500bb99bafe4001064912c8524008c051456c3cba5e3b6c2876a66c3cc8c1e30c2e2edfde95b0a1490897c5cb0e0e2826380f0de6a3430a135c75921e2841ebecf7b3ed0b00286d389b48a0002ab78af29018dc809002f040000121192679d94648406250a1f03a88b441014514dfcbf68b64122058d4708d5660a0c43994dd0d110186423cd55b6a5f30209e610646c2002083935a6ec5780c0084a2e74ab771d2a89003104407980c0009a880035699270f866c220306427e555af891a5d4d73c122852c5468da50514d367760102c30000186a0050c3ff6e17c12407b0e647f34000e05ec54d6c89002602049380fc896103c3072d9581ad1b99234104ef151f48a1402a69dba5b028a428b6d7517224423961dde8b10c200fe4c10e360a00a902017b7b0000896afa28ae482ed2005a07800022f324d2ed59dd0ce9830b351df8247142914b5521edf0a28da2ab6a64696180000577a880a1861e6540cb19808ebbd19f5bd92014fe213ed1d0000c993034e325996400b00d124f763aa739fee30717589c9ccbe250a2e3dc28fd6b051477df34885f01220a6970230c5630122ae2e857a045002d02ebbb25a050023f3b07f34e00015d)) <<< 16000) + 0x1dcb72390c4e09002f040000121100048121e4020008e4200246640064688698cc3c4361e0130d201e980b109f02e3c816404262f716c9b041140cc06b7b8d9162049b6499753804082925417effc80821c68fc817ef705061ba47387c2281010d105f7c9cea20001d413404b030428d89003204c5900eefe10199ee0822132d31765cdf16203918bd1fa748204123404adefa102085e83e5d2a91a0a0c2fcd63ebdcb81010afdf168da11730001a8e4a6d55e000009096b07b7b837c944801982600009a4d0e167654e9070e3d5c1e5cf624506019ed570160e19661f67954018676292913a212104726b50d985020cfcea1bdf0e0864cfee6b0e4801eb6a4cf424a49002a02c07780800089487504e8714c777dd30871fc797e6ff841c34e35e12364430d8dd92110a42c200000efbf00b041278933c641c02be31207228300025c035930000272e48ab31be84801501628713e0f0576a991c7f0c4305b00642851e8d971152972830168eac9b3241c34de4ebf06ae00c366cda102b7ac242021d7769c04e200219f247b71a00003cf2ff4ecf2881332400c012000049a4394040ae020004a221dc230ed0981282fce0324528a4100d2812d96eb346028aef76d439f4b4d18630ba196aa028606746f24ab00618a4a370eccc028419e9f64990944105d0259ded0d30018c2f2ea7e82be04801701e3ce05c5b2b19a41a5045436060c50a2a1cd8c95607c50c53e2c29342018614254373d9c14209b9f717e2dcc0c00002a2493018218f49a58d0c041074b149cc767532400b40d000045a74a05003a03a1a028aa0d9c044b2793460ce5f423d2802860e0beb5603e01861bbc19897f4028414c7ab94d7b110406844dc53a99381011c83b0a1403000d743d612c20f6c0900300406941c235f2750081456df42c205fc6450c840f4ce380740c31047397869fc05084767ca36057a981816838eab8420702078101e6e22002084609b66ddbc008015b164f2125c5f3709003204c00013010004c638483959d52ff6e493150162a2df4182814a86397d0048a452ecb487800a28b16f4c167c06060a288ce3d59921845f13ca0fe8582166822fea7416003288c9463f1cb04801701c22580000e6281c585e9227a618485e913d46124dc5bdbe831229cefb27760a28c071af391218dbde187c8608379238e6020042591c2652400900500003aa43880400087843b017a50bee1eb6d850c0b20044fe1ad635f64116bade782c3cd42c409bc9d2a6648c102061fd1270c30004109bc00d483137058408b25c1debb5f20209b00bd35cb3914004de523db53c63d09012006a0a881400003a42200d286c2dee3cf4164050ac784c3f208cec7621c13840809fbae160005110a61a8e328082094539e6a002c205a744f3fc640428fb3d626da882400ac0c000043643ac1418c0a0610100027910ea11e1222331c1fb22493b3c2495a75c60a068bc46ab7048a8c8a2804e2428a553cfee7aa06860799a66a9244824bb985aa8b008245c86778d60580068bded94f1b909002c034612213f1d312492700c9d504d122a385c04ed714524fb0ba4e06860763741688b08000047ec8120914551eb2d0411fdec0415c18004b5058a9f224009c0800003e46c81224a01cea98823e66859df7222c61b5f585753ccb1017424c5e7542044de4ebf06ae0410c7c6f56ef6728108b8f3de9f9090090a2f45e1de0003b1f24a5cbde04ce400b81001d20300024e21d003c241edd273aab4924f37b3b8cdfae3050d4ffc8760d048a3010a9b99848514f62b88497881a18256297843922c10d500817c35048042bd8bd557200007c08d68f8f8607848017820039c05a502d0b183d03828a8fe402eb33c4690203e21940734d18287feef1306143067b60a4d2881862a4b57223f0e5821d00b9f7ce3810483da1cdc8d7980051001bd595081339002f04069409550fb112ca5152f52684697a0690180c7f26ea9e68c149c5d7b56ac50c19ed82934a2030c526c4a340734604149c6cf823bc58223fec76b09980823dde5457d84502669003004400012610004a9313400005fe60184884fc62c97249cee8200e2448a5e8aa0190851536cdd2b111a181d8dac63e0c10c78b0a5984804364c09ce40007aef01c5e644801381022580000f7ccd1018486d93e9b095e924d5c35dac8cc818389550b1378a6922945b9792b9250a2a17686b3d01c06085e6ba7324b71400ac990f7fd2e00013766ee093c856222400c011000049a4398140008e04002e9887284815c14002534400969080c0c83301400643c432c9419212004ca121c8730662183386c38c27c3827644b59438494eafe8e3858c945612286b53dde88251a832230a0a407abfa9e0023437d5a81714200044926c89323db283ce0c15c17cc5e28a32591b16dab2860216069c579104f0abe0e9a0a0c120143d4a0202803ba2e011c0c0c000003e33ef800002d870248ceacfc801601a2492dcd970720286159c094ef070806a6020cd871181cf92edf0827ac35393db34206a72744025802e8e016270400e12a80d7e0000fbfae1825e1900270200000f9992539fdd113503ce085e34d69894526ca182841041373d2a9baa050643298961a238102d3bd191294019f2ab1db8030000010fdf400000d7611f760bd2400a40a1249421fecd881430a693e5ba03840407dcc2e0388dbe25854e84129a6ba80281a10157d5e6082c01176a5f44020059ac8d3b540005f7eb4739644801381000007cc80020a98a21766dcc51849314c0834d5088c2fed539c1e30d)) <<< 16000) + 0x9308d35e4c48a1f926254886861582b739d0582110b667acc2820f387892ec10041ea4e15d120900280244512c34041f809262cf5dbccc446222294f20c6198c2d70c4a245039f593040d0c17a4fcfd82421c3846dac0b0405794582e141077f77ea9bc900260180000f410e20500020a90e10d8700680032f4f7f1225e000000022f9e07c63fac2d03ca958bd51904630ba5f66a73dee61eda3d97a9ce043e5880000000000000001eb91aa2cbc8d51660fe3eb8cd18ccad83c650e38e40a288208502f5e0ae839d0277a1590bc8d605633d26ad43923fbb4e735a1566b3d11cdff3b0dc130d5e45941829b06d2b2649e8aa31abd76545dba94052a227df77679ca4c22087658200024dcb9c30081601d55d2eb14c4110ac319cc14e860c1c1657992bcc60a0c3f59de545210463d63319d6901025289dd56b9002000ac9fa3f648c080148d69c7cc1b9579200600800df0186f00e289e8a06c30e89273d313b40b868e05355e150e3461eac65e25b121bccf7bb4e0030945de6ca10c5820a8d3cf33e1810712a76cae8400e7515eb28be49002902806e80f0909a6465ac14a1c38b58d00721c65444c4cd06061b07541ca674303002827b18611080141ce79603820296d5093f060039d202087c0002b509959821c9a410a80a0000422400112086e048001bb8804068002e14c0a1a231f1c28a1a4d10ec3845174902a184c4c4e93a105bf6461bc0004a384001000010b3473dc990ae0f49844d6b5233a107f03c2388208304284102082400180c11a71287ce60320023b94a7030387210d0ae010000c110db218598ec138661b42304d0582600e8705cca1621c7851766802050e8764f728400a5e2b4104d870254830136a08edb3c01eb2eaad40271420008597ab389a47a21a4815e29ee874590d65cb716d59838a7221d74b638e118409a79e16204f004fea50408460c1f71892000233dda0368400374cc7df9ff989002a02c6127fddfc7e5381044dba3cc3ca5c9040e5b881322e1c10fa42133a24e4045957b320c901a0820475bf92204828460b9bdf918c0001df22f6b273882000b80f00003fc6cbb520e566e30e201e61bfa9dd2c831ef3e1fc30c1c7bdf535c551c71ed2fee13d0b1013cc849474381187a23fe75100013cdad35f42001cc20de0bf72a480150163096781b9c5208d050319a347006989da38234f066662027f828c0308106f33f459800800200002524000d50d1531e5d6ae2034705e10b23af9438810bc4fec4b181aad98ce8830c1b0da00a0c2830c62ae70e80e1841ff4454386045ebf12db0078018c5c659d0902400a40a1452c9aa640287656dc06e38fdae18e1121006993281e21f72879d4022d6b115e200139e996a7001f0080000a7105c018001c210d905d15c60ad00f5c0d1c0d2119c0b91630b2cfb7f878186342d36e880850a1280a367ab0a0c1c71f9ed121a1078fa2d24d934108e153ce78e7801a4301e9362d92400ac0c1643127082a8e3ed240959220ae1db5081a097b16f8c14097c266088a0008470be4c004001000012920b8020cf01f9810604d0c339867bb7a356cec6901cba3aa4e61041af3ec8de7860a297742f8bc1e206869084b1488020de6e0aac1800131b75e1b41000613a355e66549002a02c7980f71e77e6196e6f327c492ed060aac88c3cdcebd21862e9fec647023639c2503000fc48d5d380100040000554f980048e7d60d986634c05560c87921101952d821a40b2cfb7f878410685a6dd101182838e3f3da24782320c0e454722006e7e50a2806000cd4420a1c5b29002a02c7981265bf5e61938981b2c49211f6517c7100805a45288c3bb0d384186aa24536c3000d7acebb3801000400005548001c0181a047ed520cc716144c5a2a7a597048e5cb50e68e0a3ac055a260e0ef985210038e5676d3f3e658c09774b773c70211b774559a8000f1b1153e1e720050040e2c12a119ffa165d09ab54de230901e2fae81c410c14fc91c90d1c0c649b37a2028a06a80ec20820be7180af82800c65d69d1f220009c08000037e4360040007d64002c848007621001a2b323082c31f61867703694030728742edc008c507c0201ae2a0000c13a336c87bf3186f45645cc408419fa97c60c6fcea881009110c26138024f9c0bc04c183e010c36787a4f51c4086c21a23063271d6388044749785850207c0100b4020000e421ac220d50906a00800099c8698ec34817c58560199e1d9848818ea3cee924fab0a13b8718280a9b46809122a4a04d80b80a2b056a813ab12200c4cd2f5716180fe9988739c006fb681af079a400a009124bd760d5077050e5a8bac6a6c0c3693b0e4111c1861839cf30a21c1052d84c6f5a8826360b5aa699e0936603b8f04100157321b0497d08002a02c0000ed10d10186800e0682d43ff27d4e2c19d1cf62fe5970ef45b6e9a38707734b0cc116386187dfe44071d028379af2c68a1659f6ff0f400042769564e1600147aa78123cd20052048c256586c294823323bdbc051521ff262120ae2fd43f0e089fa17484208eff4249860009334e0a700200080000aa981a0b14ed44f338b06015059d1165c64ce107a70e1c236ee8ab3458e077cc290801c749137920131a286a4d1164cd0000fad5b453058005faedc7faf348014812309587cfdc1208c6b53df4145702c5d78482c218852638226060d740825a7b539c180029213639c00800200002aa4000dd8f980a66a4253e34a06364bb71714540a59cacb90d18236ee8ab3450c077cc29080186491379201314280a4e00a5c4c103)) <<< 16000) + 0x52688b26678009333fe202f34801481234a044536dc28acd4d88541c70bdc3bf010437edc7e83c315def5100c00b24ea9b980080020000252433c040006bc4002a00cfa6f89148d9c02b9b70c0566cdae3566280b3ba0ff8501507c1ba911bdfa7bafcc985c02730f0e150000000000000000eee2bc7fa297781690d0b1ec6dcd1c4b8ee3dbd343283edc28000000000000000000000000000000000000000000000000607235459791aa2cc1fc7d719a31995b0794a1c71cc0c60c0bb2d8d2966bf5a6c7b0ddc7f58115e1b7d277e2534dfb577a153949441069f88df3dec239bb3564bc3999810b57795c54e79694cc407d188b9d856af9577cfbbf3b957107ed37888015a3927827bff5ad3e782b993bc427531186051a96f8f0d250968a30c603cc51fa08d8b2d4001ce486708fcc050ed4c6421a5036e29e8ae8a2a0df7a5c68868c0658fa18582861c0f91a2b80c313e30f44238f14095d221f5a7800a8b445c12040065908a8e079a400a409164663d03f11c73a635964885c696b9d0d097c9d3e68415b10475a1400410603f3000f804000048c80a00e0681b76db8d58a7160a2cf6355d9965dd3f66dcc07870e1e07cd99ff116380a5ead6be1638e788dcf176581a087d89524f2a6800069eede09ee1000207af27b24d2fc2400b80f184ad0bcfbe104586a22fc241dc9cd3531c1937d7f8a861af2deb2a0c00144c1934c0040010000129303424e3b5036e38b091e45e6034b2ed0f1de98462c704fdea7660081d0a61517ff81c7128a825dc813180000748440400057e5787810b0016cdaba6c6a2120054058c256f825d5c82248aceed920ebcac19e4e0c9fd02c3c30d88649dc06000a2f115a6002000800009490003552000dda7cc02f286805566940a763b91ec4a2a1b98fa509f1a30576fa698c028603be614840030c607172791e0a140068e8de4b9808576fe0dae03c004c5cf7f075e62400ac0b1a501b947d89455ce879732418679c89a9e18a9a45d48410e13f7ff060051a7fa64c00400100001293e604625e4086cd28222610c0c25154dbfc62fee28604fdea76600e3214c2a2fff06184a2a09772090a00003a4220285036e772aab9e003335c838ea8890029028694086874145156d120da49061de93a7c7862d6aca6610449be508c18012e9536f3001000400004a48001a5105b0100036b980800802000008882d828004690dfc2d76a2d6d684f2ac8d29472a27e45ca7901775b9f800000000000000076ff5b7c9d230a3ff8b981a0a91028a28c18a11809008e020581fa0052548f5699c7d6cd78c63bd3f064a91ca210d5169c65fd7e56ac9540273f8454c182583246a1718b2256866828000cd480c0c8330340056b0432c941944207619064888012bd08641c831c7400d0a04298b4018cd44199178334a14d1c69975da862b74cf241497056eaa237d9ee0e9913f0c103cbcd27dffdd3654bf5d5a1c0b651c5a0fce749d2693b85f1801177fd7f6647bea0190a4831402898ed4f5cb58a9aac39ced0800479c0cebc9be76fa4ab04a504e0e344d5d31cf5e35f64e601063b00888c1e53b3212e68564502884bec89d69512ce88b81e881804dcc22775c7d0bfb6e629c90aa1701db53af4843d2b403b8d68646e050ba17d065858118f5210c9476a72afb47595320b76443062c4ab06c02686acd523c77e16387d63011e551d1196ab02219f3624788f299dd014c9d7dc4f2ca9b5b077f26c77f4d10417140877207deffb56a6deeb6bf247064f80e1f84fa9a136be319df685ec4746afbd3205004c3b55d6493c0237f0b49905afb97962721e1b9f57aa40dabd37ed4d1ac480034f54eb33181cd4922fad133a49f064a2e113b7500c528220070ac347d52642419093b44d65203ebd784798bf47db90cab513f9e32c9a3a54f29ce680000000000000000000000000000000000000000000000001844f1ce0cf08c08e04c00b02e99097100d006c08475b16bb9e2ffaa791e8d0e6d3d8efc680501221c130000002e0800005d54292821080a228a7fd9ae8111dc4898be238f1a89974c446000017042030b7ac09589102f61b7b40820002326e4000ad288d41c00000177029002100871c7d85e6422291fdcbb7405a8cc4b82708186dc2da4001f008000066100029e218c0a0610100020610c51100032c1c021e68867c3c67bd7875c14a260c6dd09271c1b24e840000000000000001e5f7c21fc0160e8591df8b6114a34c026d405b8b6fc70b000000000000000078eeb8c66d3f5cac37340a848bb739182a3faf5b4f18160000000000000001ddb5a1c56084816e46a8b2f23545983f8fae3346332b60f29030821610a127093c2a2148e81e01aef497291e2c156e47b5ee758b05db944bc2935a4f5224e39fcb139b910425816754c7023657a1fd2c361c2b612f8acb4da6f15a77f86f66fda098f5dbf0319974bd023951752559317ccd38c32261d7ef75323e4756ccbd4ba454cc202db14fb285d036dd9cbe38c8223f97c0c1429bc4d37f828b8bfe081f2030304adff3cc00610717b165400c0009cd7806fa58003516987fc180021da45c462098c057386b0101052048d1ac6ef5e84f15fc4d4940f1041336a5c40d40488704c0023970004239932869504200104519e00b535d31a381a000433251180e9fb0609a208cdf7d52ff21011d873f834d02080007ee05091001a054eb8a27000000549840100179103e86b73a400a4091a3808fabcd471ee6e7799888a03d22cbb405354bfe77c800420100000d520005ec40010c880032510c40)) <<< 16000) + 0xd06186830824001be6701e63d51d20100b4b350220c1c00878e6d36050491458791af0a2d08daa10244033a29865020ba1f630900d6d22980e00302893327041f00873c1a8344470b3e1de42f527f8b994bc208551cb4103819911f33bc814a60f6d4e7a044cae6ba84055dd718cda7eb9586e681509176e7230547f5eb69e302c0000000000000003b7fadbe4e91851ffc5cc0d055451430cf08d0b5e1ec0c1dbf3ee95b4bff9d2f5e1dc79c8790c45e11150eb273a5f699266332f33ba3426563f6c77c1ae605c590170e1bd81674ee34901c296f63aa9661eb3568171a93d7427c77922e2029a23340014f4860848001af4c02004011cf06a0d111c2cf87790bd49fe2e652f08216c4f3e7146920ca219419055c8d5165e46a8b307f1f5c668c6656c1e33c7245145281240040b313a38eeacfdc454214923fe67d4a76fba237f637e3cb6afb5895592e25dcc23ad5513e08886a2d2095e71f5812f0a4be29b28fc5f4cebf56d8c3eee838c1542abe402f51f5f9d6eb461ad420daf38cb678df0b0eb0095e50b140347a480325f9e76d37cc346c1f8f0eec2a22b49dadca634cd72973101db729e5b1c64992a01d028b835fc726fa63906b66e21e4f566cd335502a4d679e937f2adc97343998153280b69fbba2746f180b75ac3a8cae86d6d250f73a38b0ad3a3114bd573ddd132ad2b37f29a77f3204f0b10009eb19c2d57a76525d816e7761528ef80252d1913d85162be253a898d60f9407f23024c261a84ca1829ca34000190c8004cd10c00d0004f610bf1505f0880943400232a42f47718152c565d0ff925965440e7c5e467d14249c5ad6dd7c8c00000000000000001ff88b1e3d19a95fe34ba4ce5357ff2ab282e7463917cd39c00000000000000007d651499e14314e3887e1760a98618e11a0960940840012ee5159026f08f1c84157b2fa1bb44ba2251b89efa9034d80ce11699e639fbd1f3c047c55a55f4a8ffe3962754243896b36b1c215aee846739c82bd51bc41d4e21f49ea0860f521d99b6113445ee1a1c2470b010105720011a8e10baec0ec89a0aa3015a6e1608577959f0140b1ba71516060d6089acfa1803d5ae431410000e938188201c72e4e64e1220480300001ff3dd718cda7eb9586e681509176e7230547f5eb69e302c0000000000000003bd5e6d14fff1386338ac6c57b6174af47e6bc54918f9aa080000000000000000000000000000000000000000000000176dad0e2b04240b7fadbe4e91851ffc5cc0d055081890c80ce04303db8a6cf6ae357339ed8a274fcc9e41bcb4c3137db569b067b05063f0126be9a0f3acad05fcc3a2a915c7ed8d7f8241fce3fc815d56dc73ec64ff5620e698b642814be8d44c1712cb44eb6f73e9f9fa5b2f3c827e45857fa16855a86b9ab560667d130f16209a3130c80ebd3d644703916d7da04149b1985012860e80400003d0f75c63369fae561b9a054245db9c8c151fd7ada78c0b0000000000000000ee42e4e0ac36c0bb6b438ac10902ccd14d0ca0c808708cdd8e0328d303f71342d55d6b7de79395b4ac080d982202ecdf926981d1d9ca98b193c7d89e9dc83b91e7290efa9261dcc7180e7485fe76d8494305db9822f2865812b415c040007a44002cdc85e0c82ec441741a08f01000973103b2981d10c0e41607003d5e6d14fff1386338ac6c57b6174af47e6bc54918f9aa080000000000000000000000000000000000000000000000174441060c408d04b04c00a023a0db2b35989a179e8220b7305bf6f069cc921cca686c342c1a8f02dc31e461bc70d379bb20e20d7c9caa8e0a670b325c6041868671b1422499b0089a00619bc06c2182084041248000ed46683070a7086656c38f88da26a77cb1810804b0bd0c319589e5da11850124a08c108006b35b77380e0000013c6800e0055d6cb0e0d89002702071cf3b1ff422216c198ba40486f7704658200f09fc84000025d29ca003e0100000f732480009e2ef0c1c1bd6bbb9238f0927f7e982c602cef13ac14300552194b461892074d8988004d6a1b4b4380000034bc00e002766f9b9649002501871cddcb5cd2221872b55f4048394f3dc40200b05f444000025e764a003e0100000f720005e0400183c8003af10b901403004011cf06a0d111c2cf87790bd49fe2e652f0821274ea7ef2e029c8d5165e46a8b307f1f5c668c6656c1e31452441c40822c0240279bfb88e35825908f8db55e272b8c634c12910e3586df69c103b4d2b34e653fd1c9c377bfead8228c8bb86d713de1407fe8e6c481068011040849cf1d102d5a58dd9000f002200002008000022200016040004dc80021910b81100024210b715c0ca4b1e522420bbfd9e9013fe75964304445c5da1013a6b4fa0942074021640cd7814c81a369c1c44052d9189c0c1bf12fe9048103a0100000c9216c1380c06582b6306146638c2420899be290157d628e0b008b70c06500018038d0982074021015d0186ac0003b817fc11040e80400001dc82d00800070885a8a82d0040007e44134761660be38000f72957142849a1caf0e0a2ee9f730502882375f2100b292102ec191fdb06100b2b0aa421e00e1316bea618000002932e00a01359dc13f670a400a0091451708768618401637f0d082b306efb43c12470850038139f78f500400004c44d9800800200002506000020080b20100001b90b105c100002e57c0502c604949a57ec88c35b583ad517e8b1408cd24b391228a5d59e865f4628104c468df1521a000001ee628006008453527ba8008011e505361c0a8c2400b40)) <<< 16000) + 0xe186656b1fa03860939980830e00541a320125ca1c893c276bb29f61000013ab3e6001f00800009118200006dd97c2c6053624d6d861b15f20e56f1851a584eb9b851498c75ba184040ed9633728f00750cb1b803400000493e006004d18d3508c92004c038c340980a920c376138bd880493c7d794f09f1cb3c98e08178fe7a94007c0200001ee4000be8c820ed3fdb041ab498a992041d00405802800022480039210af09d836f8a54009040c3a141020d4197f5c1c001bbb2da30059dbc32030000db34b204c203e0100ae050000a010180d0568682b0341561a000ca821544a0a91d0540c829c440040ce42989400c14e4295041485a0a32105102801948c80994390a12982e0ac00c05c21a91b2971823f36a9b614229db5023141d84e7f6a2402b78b34c040a00e46b3404261c2000861401b00b6c60d6cf3f9bc60a52b0937080112d897585000f1ce700012518200086140cfffad880c0f07aa5070c2a63f87860d5d72d69460a5e8be335025102000805000827c0400025c400094484f0ec1486613a330671984e0ac26c460381b09a0984c82c2601612e03910a4ca7fb8710c1cace4c50c231f4fd440c5468505070a35f7449c6003a258cd4201b9f5dd0000049c9080021220810bf0e1c4bb505f863061a245570708c52551586141d1d5ba400251c1f00804b0082540400026040b896128230930d84904c2441751cb4103819911f33bc81412441431031c22411810c1180000023ad799d3e866d0881721367663a0fad4834490c6d0e33c3818838a221597282078c14641c484584b0a00384cd6334f248272d9c7241830a980d66800024e584001009009047828000654847128000cdc84680f8c09150cea488306025f83888a7eda9e2066bdee16228413b8c5142051acd5956813081000402300611603e3055c2eb292209d6ca430e20cd095f5081e2a93e978a10fc9aa358813e1337ee1001ca9399b8603fd0578400250304001000018c39b61d66fb5092cc13ed840a88c28c18a10610808608e0020007e60457226e360c0709a070c416a0002704228841123a088190438c82186410a2a0841104186820824000a224204140017864200c60fe6207e2183e908198060f803d89e7ce28d241944328320ab91aa2cbdbb2d6b0fe3eb8ce46a8b283c46104045823826005002808182a51b186a60ed5338323701afd03b44041637d9e78d4355a9e912f0537207e18ee9233df7fb890f535b1c904090aba7f520023a36d4a00920c0f8043493019b76090eef5970808140e824b5026203c00806e0103500800034081a04800076483d8ec198660f4320791583202f0850fe15923f33217abb407438fcfdfe7cf6bc754900a168d1b009adb5ca28308e97cb8d9b554ef68ca998602059a6740710515caf0e1db877a2b418baef0bb3f37060113b0627625706ece0e1d5c72f88ca8ab680d9649c1406958ac64158e0b10dd09bcdd57a9d5f8d8937b6ca0021965b6b4a530fab5bf6d20b853d18c645fd2bba5800bec902b203b1ba1061d078a3561bd59310a494a438e284aac9d64b105616ef30a112c35a91ce0cb4d14ef840fab52fe1490013e5a2f42608200087960fb4058c58b09c3a0fe28864fecba6460840010f2c5ebfc6b8c141289ad60b14ee2ab4288148df92ce4512dcf9b138f003bcd6730c00214ea7649c10800200002ae400086480182fd60369dd7802f0557d1ccbc97716497bbc62bbaad917772c8e4d3141555c00000000000000003f6c4f3e7146920ca2194190540000002350e062bcc48cb791e8e41c43492042431830c20916a812163f68cd8ffb514e30ee3a14132e788d3363315a78162472e341a137655100a62bce2958885c38c3697e931ae8ec71fa5ee6423712977eff241fc13d4441cefa0008e241e0440ee1a0760d01a048002158829948148a40382204f0d0006cb90753983a1ac1ccc60e45b038198388cc1c0460de1b8013eac5a33dc997515c9e3915863bb77cb03341a354ea16ae208136005b12ec55fa17f0548aab356a58c4dfca7bd962e7169d8884714f21434c0017f46cb9d201fcf36beedc0051f40a61c05054e7f8d09feb3da27eef3560eebe8864a872658bd28ae5820e2345228fbc7df7623141373eea7b8e50bc388ea564bb60942527e54e3673c27bbe7fd2e5249229d4508881fc73c541ee2c52cd6da2ef76a3015ba53ac70e7884e742a96121c56a0593350878c80c8b7b7ea0048606c0100dc0206a0100005210342183688c1b0360d61303305c02df20362404c588d1b9aafb7a4edb999c275785498879269fc80b7edff9de4aab14dd17c382715de0355f0f17acd370a4a318fd9e6fd5f05bb2138f0b9d675da6f1041f14798da881a4014e8e82797ee57f8d432aae13c4355af0e04260bbaf876afff0cd449f8600515cf6baa7e0001cc4f128b109d09ae5b19e6ea32e736d8e3e41fa7b1a76306b476b0bb034accafaf34e1c115a020a3ce5c9daf72c57623cd2b41fdf69425a781e199ebaa338392e2fe1ab1c1e60d047dcd0b026f08b4a3f86788d34a7218b933217ab82303c4f0e1f93aa6934191b1968e2002c679f63e4c2c9705af43816719a882dfcffd8d0486e0721f602d617d8fc1987d5846536d0fb771c04de11b6ddc2a25283440528628c911d17879fc4fb0157dbf24405777b6d82bfb0f8eb5ca21d34f0ec7c6426f0323db981a82893a90aecc8dc76f4805f5c6de785cbeded8260846ea7b3d6fe49ed2b6f2e0e6ba5c36ff914a0676ca89be0ab7d66e08e7581db642aa33d001da000e3f08)) <<< 16000) + 0x92a029db8954560c8f89eda683aeaabcbe16a31331ea908a8ff5f4d0f6fdba7298f44f9b7442eb8e76285476652888a90c53b4fcd7dfc4ece13b9e362bd331e589008326646acc44ff68199f480bc781e16f2e50949b66d0e92a4652feb1806a050003e5906925034128003bd483396c198860ca230640183180bf1a6c02a84f7db4924109a49208503b492410aa492084d509efb5f8d36000ecbdb68794c7016eeb8c66d3f5cac37340a848bb739182a3faf5b4f18160000000000000001da1230611809800a00001db4f3fba3d556df767c9368eac8871e008d5f8da4fc4714cfd7812bea66cbc2ca5acc58da789aeb15ad77461d09ba1fd57855226525a1eec02249b8ece378b9df5ca4a247b50620583082c180060be039145204ccc10108e30404d03aaf07d52c0066b52800064181e00802f04e410da041318044df3ec024103a008d0dd22aef3c09ac8efc9020d0023c23220d1ce022a4eef88006802151245181931136a9464003000800006920001e240005e8d8212460a30e0be82f63a9010c24f49020005c29e6048183c0100000cf20ba0b802008022219eebb363c301b6778a01db31335103b09b48c8003601080000802000008880007d905c0102d80f4051dbab78205110694424103a0088020080222286792c15611a7bf25c8024bc89784c02a51fdf9604656b0fe5001d008516ed4cc9c9882718cc4142dda78b3c6003a01000009b200034a4000788c030040100000444000ac08002169b00876bb00a0350f92dc7027f8ab94008c50700200b4020000b8200104a4164860b00bc2ba1e00c69f0b05b6f78f8573a1b72d10424524535f0e238ff58574452812c2bf07a16877f2b3efdc8b059531442a8d884cebe8b2e725d2d3886482af30695c97418993d813175d2434bcd76182345e6284f2fea54b4c24d02d29f3179a9946d67e2b87087dd07289739de12d34392f908c29739080223778d1c60c5f7acf09690f5196089ef2e25048fdf70e1cfd6000fdc8e83119257b3075403377fbb7e4dff24b1dbb4943b30ece5c90837cc21f8cf8a5a757d8cf327c99ede9624c81f7e34d805509efb69248213492410a074c69e6b672f80bcb5fc3a49e0290c0cb0c70c30c602a52f583248983eacebe43d030f6cdb27242a75d332600830f1d0ae0b2eaf6dc67c42d22fa513bd5410514ac252d8745ef80224019cd25210019f14c24503274abf2812080e804015c040001c4415867c6238fa586b33a337db612b265101a13da8ca33074ffd638ca041ce9332a35c57f0cd42c5f51e194bee625b51e658eedfa2c051d16dd0bc04648799300c12423a62bc328f0c2d475a0a4a022f176661d4958b99e2c417aa7eac39e19f8d80b124a0f2100c1978a31c3aaeb6d2b7c31d3543e9752973eaea04ddd7a727a8e7ca550ef2a6c78c3d7f4511b89baafae679e8efb63e687610d0b94c9a59b4aa110ce5d4817c9995b9072e89c0000aa8400264c82a8c8003cf882a06e4809d753f810334081bf33401cc82205280868f84b31c009c3968340010094c08002000022a40067c88299c8148d40a2520502100e0e813c54003f024118c40523a0035d434095b8c7c71924fbdc1136fae28290f517ab3efd537bdc16a90c00c5cc9d7f4cce003d7c60841818db2f9ede81e777394751a200ba7ef065ec3b8a218d31e7021c57b048f5011cef1436de46215f57a9e53a6bf38a4a3481c7a6ab6ba3469090e1683b10196c5ad11b1430c532ed86304059142d2c308ec1be0c216021c082be72004d0ab35e000146bfbf6d9001226bcdf919c708c03009c1304d0582602eca06eda98261228704b3c81cd2f2745943410fa1f708100304588400f1504db4600142b642013860f80438de66d3240c09d7bbb9a082d4dcc5b8e00bf75888050307801000019a6c615f3766a30bf6a179349003495b7a8c02a5e36ab4240c1f0080258080003a08250ac12407429ecd599334461d1aa1a289ef9af898700188835c8a013e92ec10809568d00800040b2a1d84027181f0080240480005bc82384e9248215492410957be0ed95ef83b81d8c0a962b2e87fc92cb2a2073e2f233e8a124e2d6b6ebe4600000000000000000fddc6db00cb26e4b34148498a376e21cab79248fb6f20000000000000000000000000000000000000000000056330310310230024018040a4ce94e62795da65d44822a130e15e0a7a10253660f02af9641874351e83dbf887009b823bdca60162f2df0631298c07d8f7a3014ddc491c3be6e4645ac86ffafe37f70ee9f4eb3f8118fc1eb25eb4d6b28ec0dadfacba3bcf6184c42eaad502f110003239000b6a208c3a0451d01488800367c8221e810ce40846a041310201680fc8407c2a03d1101e02800464cfe34d8048562c7e9edb618f0a492084840240618648238238030028080c60ee41f048835becfa59eeb1457833eee1ec422ba6b7cc881eaf4444b7f03cd2b9a2d87d7f19f145a757d8c3c7a03ad991898a1041e22c78f466a57f8d2e93394d5ffcaaca0b9d18e45f34e700000000000000001f64d2996ef24bc0cc925d3e0410a3551d0505015b48e2e0000000000000000781f8d36012158b1fa7b6d863c292482121021838618a11a08c09c21467c542a70462ea397ab5858be80256455431aacb8be0fcb0a91c8a1b0b58c6bc3b622c83575bcfd74f384bc0e99b6849bd76d7910bc240ba2e526a6e9953e011496ff58ed08da6965bc7c7529fe94f62c61e297c2e73376a2e0a1af2afdfc67c5169d5f630f1e80eb664626284104bdb68794c70161f8)) <<< 16000) + 0xd36012158b1fa7b6d863c292482121018e38c08608409a010032350055c0f48b3c6856d9d4e9579ca2b9a7636b0a99758b8519df0713080f83b0b9212a160d95832948aa0005ce748c4325e58823b749c9c1c41f42785c60e9cf33c62c0b7ad74a465081e0084101cc14e0c1c411c4f371882420cea780b041017a2a608215b16500194208402000020c78f0d11f103435fc5dec0c1d1abd4ac8008237f6432040e80400d4040001ba4000c40c0420187a24b3fcde20cbf1a56dcba8bf5c97ea165bf94be5becfd7d1be3d5e83753cf1af8175a7b6f13bce719ec5c020d1db59cbaeeaefe4ac0614f1f43040f5f199c1bdecd1246268f6806c5b56b09092a1508cbadb2c3b1ddddadacfbc006d56a095ed49d5082f1bce9228f7af8ade25c4d0ba53cb9b3fbbcd01672eb7fbc3ad58e8b432e1f08d06e436d321f7f05e1f0150976053eeb07ac351573bd167707d66b9106c6da1c053fb8b3473e69a5435e89bcb05a7b0845bd4f005e120005ef20763303a1581c82c0e017e22c78f466a57f8d2e93394d5ffcaaca0b9d18e45f34e700000000000000001f5fb89c4cd82b462ca4c4295019296b0b2e66be11c52d4200000000000000007b6d68715821205c8311d291e24f9f26c998281f8d36012158b1fa7b6d863c292482121029a41040c19605208cc93e57e7e9b7b3816d30d2f871048760c16d717e40e69519d73d29ddfa3a556e6c977dcc49ad064d71c85c30d56b3cd27c93699abff15b285620450e7b50eedabb13347519676f52e6f2ca461b28eb1cf4ec7af7e281cf31cb4057a57ec0e0ecf7e010488b78306018082c2b1800e00420000200800002220001ac40dc270040100401b0080d40400009840d04606603c313ef97681c0296cb424300050706240029ce407f012060f80400c8140620a030050000889800493c45ec76fa5223eb78669c82f49c8e5890e558aebeddead67141c8b012a160631a1803a72a55dbb2a16af8512fbec49c6f99d660f732d3e1914026f6fc080107e626cb6d9584bbcce091e84f2d1790209d61c32fba529109064473dc37b87536df758af55e187cf98b510d1828a6bcc0bacf7bc5127855a0bf56659bb2a0b3f61a0fa5f15a37c42b830039060a44e69133f8fad47a30759da3957167a80f0db2a967ee6165ecdc95fff5a69e6554589cb356eab1a04af94aee1a996008f79d31e9cc3eb3d1a345f9afbcb0aeddf9a753c7e296ccac15f13d93c0853535e8f7087ee88f6c6510ce736200bc34000ee640587405c1a0010c5205a3a02c1d0011ef902b390151a80a4c40505a027290130e8094660482a0231101102808404004ddc40206988049531c122ce9b77cf8181095be0fff60283f6abcf679a04057893909d970602fb6009f5d808013175a50a3c82a80368b067668101901c4153004765c8f762b2a31a15816247065431334b67098d80e65be4062798cd6361da6377c2380000000000000000209f151931ae4c0131a6b2694faf59ec5f1558a898b8540bd000000000000000000000000000000000000000000000000bc430830428428020018082a826b63492913776826c074e57cc152fa30de4189e1ff97d422fd5766559b467a62c079c176fe280da8f5953b7b7d44faca7e2b60a8745f461387e4982ee1d4abef9a3a334b87f30b61474a757af9040d9cdcac62a69ad927bdf697cf123800050c6128508df9eb8048ae747668a4208d62841a20a0000035b03040000026fb6a4e1846010eeb8c66d3f5cac37340a848bb739182a3faf5b4f18160000000000000001deaf368a7ff89c319c56362bdb0ba57a3f35e2a48c7cd50400000000000000000000000000000000000000000000000ba448e50a508104480400b7dd0acbcbbbfbc2a9f5256db309314b92c0b9a81510781d2a45d1ec75396412b29e703da0baf2271da60bbf7befcd9071078b21732f60ce232680024899276acf74601428470a471a24573a09967a1048f46cb518704000238398a0000035b030800001431829384118043bae319b4fd72b0dcd02a122edce460a8febd6d3c605800000000000000077abcda29ffe270c67158d8af6c2e95e8fcd78a9231f3541000000000000000000000000000000000000000000000002e91439239428411201003b4e4242b65619b5f9eac3eca58ac9982667b7e3a5d6529af27bd08fb176ba8f77cab75c412d136f4cf68e25ef1a9b323d9b288d8b86ac11c8655000492204012000630203e2b01e1180e80c0700724e6c2c3ad82870000137da48e0000ce260a14237d90fc122b9d23158008232b4d99a02800000d6c0c27082300850e03fe7f58491c9bf37742142807afbd1708224eeeb2f82020143d97889020baee1ca100000005db409c208c0200002dc406c3603403a28084ccdce2c8000026fb4a20000338982c611bec87e0a1b9d2315800c3c2d23b6f860000035b039c0088021dd718cda7eb9586e681509176e7230547f5eb69e302c0000000000000003b12c82882c60c3141041280240c000080340005ec80c82e8aabea81e9c590000026fb4a2000019c4c163046fb21f828673a462b001867f373cba86000001ad819382118043bae319b4fd72b0dcd02a122edce460a8febd6d3c605800000000000000076259051058c58a18608250048060100401a0002fa4000c1080c04805c24000cae40585402a22014090004e91013190090c8005b48800e439011390081a803cc401c5a00d2900612802c840142a0091100406801c2400c0a00501002008007f588018880084400202000010101829)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase14" = "QuadFullFiveCase14" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase14 private def zz2226:"s08b2"="s08b2":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l14 l15 l16 l20 l21 l22 l23 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l5 l51 l54 l56 l57 l58 l59 l6 l60 l61 l63 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x15283d87b, -0x1102bbc10, -0x19841b224,0x176ef76a], ![-0x1102bbc10, -0x42b53840b,0x3a20008a,0x108e230a4], ![-0x19841b224,0x3a20008a, -0x6e91d770f,0x1102c19ca], ![0x176ef76a,0x108e230a4,0x1102c19ca, -0x8815f578]] noncomputable def hinges:Hinges:=[(-0x1129f5e,l6),(-0x3aea12b3,l5),(0x1724fc46,l4),(0x1f70c960,l9),(-0x5ba6d1b3,l8),(0x1edaa61e,l10),(0x8f98182c,l14),(0x11fff03fd,l13),(-0x641a4419,l16),(0x7304ee6,l15),(0xa5b4f0a,l21),(-0x11fff03fd,l20),(0xcb1cba8,l23),(0x704e897b,l22),(-0x8815f578,l27),(-0xa5b4f0a,l28),(0x8815f578,l29),(-0x8f98182c,l25),(0x5246a3ef,l31),(0x17e823dc,l30),(0x8815f578,l33),(-0x1edaa61e,l38),(-0x8815f578,l35),(0x5ba6d1b3,l36),(0x8815f578,l37),(-0x1724fc46,l34),(-0x17e823dc,l43),(-0x704e897b,l42),(-0x7304ee6,l41),(0x269c5a2b,l45),(0x8815f578,l51),(0x3aea12b3,l54),(-0x5246a3ef,l57),(0x641a4419,l56),(0x227c0566,l59),(-0x269c5a2b,l58),(-0x1f70c960,l61),(0x1129f5e,l60),(-0xcb1cba8,l63),(-0x227c0566,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x8815f578,l27),(0x8815f578,l29),(0x8815f578,l33),(-0x8815f578,l35),(0x8815f578,l37),(0x8815f578,l51),(0x11fff03fd,l13),(-0x11fff03fd,l20),(0x8f98182c,l14),(-0x8f98182c,l25),(0x5246a3ef,l31),(-0x5246a3ef,l57),(0x704e897b,l22),(-0x704e897b,l42),(-0x641a4419,l16),(0x641a4419,l56),(0x227c0566,l59),(-0x227c0566,l65),(-0x5ba6d1b3,l8),(0x5ba6d1b3,l36),(0x1f70c960,l9),(-0x1f70c960,l61),(-0x3aea12b3,l5),(0x3aea12b3,l54),(0x1edaa61e,l10),(-0x1edaa61e,l38),(0x17e823dc,l30),(-0x17e823dc,l43),(0x269c5a2b,l45),(-0x269c5a2b,l58),(0xcb1cba8,l23),(-0xcb1cba8,l63),(0xa5b4f0a,l21),(-0xa5b4f0a,l28),(0x1724fc46,l4),(-0x1724fc46,l34),(0x7304ee6,l15),(-0x7304ee6,l41),(-0x1129f5e,l6),(0x1129f5e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x1d03044081c8200a0000007108c06b3010000000e81081b6602000001ca11009acc050000000492081b1806000009090101923014000012120201a460280000001c8c40d8c030000000002c281980200000bc4216034400c0000138641c028801800000001307014c020000002886202418080000000000070320040000000000681240100000000e844088c030000001a842043180800000003611022300c000000054120646018000000000090248020000000411081618060000002504408230100000000000501a401000000009824088c030000000000028190020000000722a03c300c000000a21180d660200000015021036cc0400000294220135980a0000000005500a200c0000000001480c40100000000002b0188020000000000540290040000000000bc0620080000000001680c40100000000000640c8010000000000098190020000000000900c200c000000000120584018000002319110290020001123288603220080000000000840b20080000000c422058601800000011854028c030000a41502401ea008000000004c240630080a20508220031a80300004d0841200c90040000ac1202c04ea008000000004c2c0630080000000098500a601000000000013014802000000268240189808002882b822006d40140002a04e0a00da802000a60a209804b50050000b81403802ea00800000000026009200c0000000000120640080000000000e01480200000000221603180400000000442406300800000000038012401800000000012014802,0xec2c822011200800000000000d03200400808c10480430802800081108270169004002103845081c8200a0000000000440620080004108e0b01b88020000000210840f8c03000000041110159806000000004c180e30080000288ec5c02680180000001d0b0024c030000000000120390040000000001100c200c000000000220584018000001b1513019002001ca324110088200a071c64c1180630401800001a8a44c02480180000018439016cc040000000311480a1806000000690fc01b3010000000ca1e00766020000001845101b0c040000000000088190020050480844021840140000000000780c4010000032108480350030000000034140298040000000005c00b200c00928aa09201ea8028012214813003d50050000000002c181980200000000b8340b30080000000170701e6010000780d42800710040000000390d01b98060000000782700d300c0000000e84c03a60180000002c9440d8c0300000042321203200400484708240110401400a4926106016080280000002c924090c030000000000078190020002886404409c4010000000000ba026401801282023040e4100500000000002a0310040000000942903e300c0000001245405660180000000290e018c020000000512481b180600000a092101923016418a0843e02a828038000000248e4090c030000000000c80610060000000001902c200c00000009032018601800000120310170c040000003c1a1403200400000ec220b034400c00001984812038801800000000002c0c801,0x2021081180eba00a00000c82809017400c0003a8460f805a80200000024c3200a4c0400000661606813a006000204710580394010000390520b00da802000e10b008c08350050000082390d00b200600000b1889017030140000000128880c601000002c220c04c0c050000000000018190020048c3104900f240141008e082300c4880300000420a02403100300000000000a031004000000002814063008000000108160386018000028218c04c0c05040a38a0bc0312200c003203082d031c40140c38a982300c60803000000014884050c030029e33c518078a00a0000000003900d200c000000000d0e0660080000000000d01c80200202304120088200a0000009444240740080000000008201a40180000000311501cc020001023884c01ca00800000000055013200c00000000a8701260100007118c120121004000000341a14032004000000004c280e30080000000c45206c6018000000002e3c0cc0100252418418058200a080464419002304018000330680e00fe802000000002307028c0200000000003a0310040000000000340620080000001448204860180000000110e018c0200000004118812180600000000048303300400001c8c44603c80180000330882c0d1003000000001e120698040000005311c0a83010000000a22080d86020000014a2140930c0500000000160a05180400000051114068301000000000a8881e6010000000000070188020000000190881b180600000000a42c073008000000000a8016401800000001a05024c02,0x1e80990060000000003c00b200c00610a310401e2802800c608c0ac03c9005039c30608e0274a00c073860c1c004e940180f00c082801ed28033971810324050a500700000484318098180a0000006314802930100000000541402a6018000000a8110194c0400000504418098180a0000000a23100e300c00808e108c0330802800e108408c075d005000004047080c9180a000000830c80293010000388c20b00728020000620a41601b500400182160118106a00a0714614178062440180002888a1a005080201c118d1410295d006001b02841780cfa00a00000005221034300c005406105a06388028000511141c00a10040000052210601a200600284420630198401400528880c6033080280007c0f02101e10040000781083404e20080001d03408407840100001e0420a0078802000000008828030c030000001082801e18080000154660b014400c000538d20880d88020000002b1b0702900200000004d1480518060000000000940720080000000128a80c60100000000013404c803000000004e2a0318040000000098540530080000000009801640182201c105003da500682e38206480a14a00e00000000002406200800930a208e0164802800000001609018c0200000000002a03900400000074382406400800d1982102027e80280000000012403480300000000522a03180400000c08a3013030140000001847201c60180000002506c070c0300000584a08069180a00000000845c0a30080000000130681c601001212021180661005,0x6b1180a18060000000c209026300c0000001983201660180000000330d01cc020000000650681318060000005110c02830100000000001380c4010000000000250188020000000000160310040001c4650580cc4010000000c888381c80100000002a06406cc0300000000005205900400000000a8340b30080000000150701e60100000003284802cc030000000064140398040000006115406c301000000000002a0640080000000000e03480200000000003c0690040a0c31810409dd40180000000090681260100009110422027900400010218824035a00800000000a81c0b30080000001441c04660182111c20810377d006002023182180fea00a0828608204089d40181058c4042018ba803000000001509028c020000002502203798080000000000240e200800000000003a0640080000000003902c80200000006e0c80598060002047105804a40100000000001a80c40100000000370d01cc02000000006e1c0598040000000b23103d300c0000014248805060200000028c5301e0c04000000508a202c18080000000007500a200c0000000001c80c4010000000000050388020000000000760310040000000000e80520080000001847207a601e092c4020c047c5007c3659804481e78a00f824b1008302771401c0000000001f80c40100000000003d0188020000000000118190020000000d24103d300c000001625080506020000002cc6301e0c04000000588c202c18080000000044240730080000000000360640080000000001d01c802,0x388c203618080000000360b024300c0000006a0e818860200004f0841100e500400008611024034a0080000004c24140f40080000000050301e601000000000f07028c0200000000022005900606045344040a5740180000108742c06c80180006114831021d0040000c82886805ba0080001043b0bc0964010000000000028124010000000088340d8c030000000110501998060000000000180d20080000041062060c602800000084150318c0400000104158183180a0000004108409730100000000078380a60100000491186c08d0030000000331480e9806000000007434063008000000000d0a066008201142049011890060001022906e02d20080000000742103e300c0000000e44405660182821c40c1022cd00604823041120231200c080450812408b340181210c2040811668030204148064011cd006040a2940da0459a00c0000000381100c300c000000701080b86020000001442201fcc040020a2a824807aa00a00000054341c0a400800810a409801ea802801431cc0840add00500000742f10806a0060000000742c00b300c000000000d12066008000b1244620265004002c248461012da00a0000000034140730080000120642801880180000260c8580710030000000003c281980208047346040a574018000000e21980d660200006114c1202210040000003a06206d98080000072864026b301400608ab054062080280000000c844054c030000001884204298080000000b649037300c0000000001681a40100000000003d02c802,0x210c80a1806071461443c085b4018000228620a00d0802000e1182230064900500000461b0601a2006003906208c02bb40140a3067847807448030000000148840d8c0300000d2490b806a0060003589210406b401000b212610605f680282862090e7017d100600000822105806a00600020c4806408f40100004088c0a8076802000000001209018c0200010c2183003da0080040c4902f028b401400001f0a44206c801800e3142204066d005039e28a20a042da00c003b0508810192401400760a41080576802800003426040648c0500352418310028a00a00694848630071401400000001d138166010000000003a4c0cc0100000d4430980620060b0890c2340674401800d312109e00e880280000036210901900200000c63a0980620060b0c9082340674401800b08e609e00e8802800000311e090190020030c3a4110028a00a00624728230071401400c30e906600a2802d0820602d00334d00706124080bc0071a00c00630708350091401685103c182034a6803800005a1c8640f500300000922a0481ea0060002e4a41540274010000410980880d680200008610c1301ed004059248c24e02fa200c0000164320b00d400c000598700c811e80200000612085c035003000184430a2035a0080000000c259036300c0000208e45c06c801801011c228c066d00500012c2882602da008081471453c085b4018000498ac0b8116802001011c22b006490050026428c1a00f5a00a00410720ac02bb40140000000110480c60100000001c8c4050c03,0x2c0690040000000622b022300c00920e318603a480280000492088c0790030000096190581a2006005108308302fb40140000000068500c6010012619218c02c100500000722105806a0060001cc4806408f40100000000078281a60100000000190e024c02000126408240242008000000004c380e30080000013070480c80100000000291901cc020000000000320310040002c4a10d803940100000000006201a40180000411484c0350030001062c052047a0080000007444340740080000001047206c601800000001511028c0200000000160c03180400000d84219036400c00618810c20336802818f1050c50216d006001982043080c9200a003304206402bb40140000001a4c206c60180000003504c070c0300000504908069180a006b09104101f4401400000001a8300e601000e314412403c9005058640418a0395a00c004a02083801bc401412c0e386600dfa803000003025840648c05000000398a40149808000018c3a16027400c0005906c1480da802001610c61600835005002cc49056009fa00a0000000001240b200800e61420c203e8802800002c25040648c05050440611a033a200c006188084f0074401414190104680ce8803001a60c411c02c9005000000001c1203180400000000d44406300a440e30168019a680382c91c405e0038d0060000005a120c03200522871e0c101a53401c0000000c45206860181c2147107016b900600248284408107200a000244521080b7401000001c8c44c06c801800e118220c066d005,0x32120398040000000068240630080000000000b00a40100000000022140cc010000092470b01a2006000005384102d1301400000a108a02226028000014810c07c4c0500000294240178980a00001047e0e014400c00000000f8380a601000000014864058c0300000000003204900400000007235022300c000000e232810c60200000001c8cc088c03c0650215781030a00e00000000d43806300800a21031c603a480280000530c82c0d10030001a44204204e20080000000d23100c300c0000000110880c6010000000389a40d8c03002cc424418058200a000012c220a01c400c00b310411603ae802d9220608e0083150070001501c04a00e2008000008189101133014000010111802666028000002a0e090190020000074210d006a00600000000783805300800b10c40d801ea80282c220304501cad0060000003a0a206d18080000007214c09a30100000000e45807a6018000000208680dcc0300000000322a05180400000c45222024400c0000000c44202c6018000061290b0029003000000052160049806000000e8984c0640081310e784880bfa80302581c708c01bf5006000000724c2602a0040a0870c114072b401814490307380be88030016624820c0bed00500014c2c8220112008000000641040da3010006108d09404e8802800000188430268c040000000311201e9806002043084a011040140c308786780744803000850ca108044100500000003116819180600000000005409200800000042088150602000000184550208c04,0x4062922300211a00c0000009118c089301245902c71404a5c803c171c3064c080f500704924123880617200c092082070408d7401a150e0c35005d7a8038000001d0210260c040000003a04601c180800000005221016300c007088104602ec802800000000011024802038229a20204aea00c003844084303104014000000000680164018000510e02102e10040000a21a04205a2008050436020408c84018005086808204d080281410d0081023210060000002884205c180800000004a0900b300c0000000088780a60100000000000f0148020000002702200b180800000048044016301000001284c120168018000000000780248030000000000720710040000000000d40b2008000000000ba01440180000000002e0148020000092421c8122006000254881cc0c840100003b04a0e81988020000000941d0318c040000000000481190060000000000c00b200c0000000843a06c60180000014416025cc040000000000340290040000000000640e20080000006a1380d86020000000000d40288030000000000360310040000000662500a300c00000000b0900e601000000001b11018c0200000002c138099806000000006c4c06300800000000d8900a60100000000001b01480200000002a12805980600000005821013300c00000000b0880a6010000000000b00248030000000001b00490060000006a04401430100000000d02201c601800000019024030c0300000003708805980600000006c0900c300c0000000d0120146018000001a8210058c04,0x21064078c030806784686052e200c0000000001240e200800000000c8680e6010000d11441103250040000000000108190020000000001040b20080000000001a81c40103893462c9029ad00607066845860395a00c0f0ce08c0c0a5c40181c19a1161807d68030000000001b402880300000000006e0310040000000000d80520080000020408812c60200000003e0a406cc030000002084a02418080000000034140a3008000001622300926020000028218c08b0c05058448611a037a200d4208180b400dc9401c00001488c1202c801d0a20783040692500700000008110813180600000003a0900d300c00000001f0a816601000000003e1603cc0200000042220e07200400484740c1017340140000000001881c401000000003912018c020000000000620310040000000ba13013300c0000000170581660100000002c85808cc03000122408840362008070c53440c02e340180000000a81203c60180002431890207cc060000048461815f980a00001486e2100d400c00000014868016601800000284730224c04a0440304680c24a00e00000000088903300400000001d08816601000000003a1203cc02001c6244398089a00a07184d43e408e6401800909050c40330802820e1c2053022850060000000005418198020000000000a407200800001411c6057e602c81181862c057010070000038c488089980a000007088c01333014000000000d0606600820114308b014a5006], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((((((((((((((0x7821517b73341cbf9bfea200adc5b9cf0204cd6b4680be8468b4025141d00815e04ea81b2000d502c56d23da1870368b8a400bb03b1d94041d0045150d0f870808fe974240c3a93a4b32a00e5b10704007cc33464a083a0100000ef304ca7e8748f0d5c4532a3830376b8282088191a4e50002435084a01b9ae8e009820780200002407c34e161ae5207193e01f38102aba5a0104780331424041e00850f0a0793c0209fce2fc80f0c88804900410426be54381003c6b7ea0065d9e995000281ea5d13820f804000054488882800093095b888ad804000b3a4ad0665660b9217427bf0005af940011060c8040aec2745130bafde80a46c9fbf0759e7c3333715a5498a195bc73ac8523cf16bc26b0557ab8bcf8e503a8ca57a104d28e6c0849624f41d0fbc1d7a61aea29f8b1c3589370ec114aa4e61e2684283000075d4e1905cb84ea4fd769746692acf1c01eacaf7e9531f2263da6f39f017a90408ac2c484794853f89f487c492ad69412246c1c7d06509ea546136f708a506135895841c52e5e003b14531befdac0820002326e24100001f401c126b09000240013da320a4008002111c068775872b91c782bdf4557b0511407a23d7b72d14529926e94c74c2080004b6f8cf4241000010c3fe00704745b2979b7c48006174a7f83e0100137d56b6bb489592005c078000239200080064803aaef97b5c2a118fddecdf8b261404a5d553a71e08138e3cb1c00e097eeebda1a2820e5d91f4fb8b9e00b7e3b355fd0de5c7082c03c0000dd9c31596bc06281a38caf3c2618e33f98522100f06d5c84147b40d644a004001080c073287703030d5f1a194f9098a08f5a678224080e6609b3ce208bba94425a088417ffb691dc082000366022840000003057003005c51a116c58c900280240000fe9920075158df81078601a037112103062df4b441102a841f0d1038a0c984647f0e0b06c08318f66caf5c07800ed9d3c1ebcc324e08580700001b82574120004fc2001e1041c8365721b887ebccd244106001145a1a06d69508631588d082799cdfc91002b30c4c40055b64aa89410780200001e8600802008a2e136bf325001d389fdc88017d130b48c107c020000146400038095c06f8ef287c94121413a09e48a29303ab26544ac7d91fca08298893de5001f00844708be9dce9071f92c3bc96b4850711b76c30e140b49329f014551e23123d430c0009e2ef05403ef270080090000008ca001c018a4aaabb242400980800003d4689000d10b08e3cf71f3340a29a3d62252a2362a39d026081f81a881a084d0f338cc0040010a240308ba51a050e0610f4af3038f176b834df6a8c27119d6f9828a5d69063d8668221e8c58d48b80000081a380a80467b5d401962800280240000e4900030e302f57c128c014502a70dc70a84c6f4d7201308d4beeaa80e10481074385401d88a23568807e7ef14503000522ee8f0488082301c0000d11820af00eab42160d05f4a2f0e0a06c80c260b304c300010669b02010cc230e4100106667e515fb60811736c6d61403b0577e3856b0e0852060b065537695e281974744b88986000115982010719dc028082b4d03a0ea60225a4b9b00010ec57fea18e08440200001683864dd0234eca2a14dfb15d0976984bded7f3d7c1e089f86bfadf050247ea6dd77022000003b80f501802fdf26459d01f522e34bf14943841501c000074c80029c9000d36256e2a2b6050007f092b115000ff292b511c1009f26a251e181ba9989890c00e921941871dac4da83820b77281e9282108043160eaa30fed1c639d44410ca701b5b6936950294d4940acbad06589c1be19e2d8027fd086105dbbdda80000172229963aa7fd9fd3661a08c176ef76a1d365145e2057a705bc6499a48220000000002a7288484d1b26180d6f59c080420c0453c30c3382240d5979ba65d3350bab0c72fccb6420032e35e5be5b5dcba31de7fe93f51b7e9d03bf29fd20b31299ae277711183b689dee30d7b60fa516518a702e2cc34cd0185b0bb3b09520e12168604a058f2551da4a94c42331286a5e0306fef2c7d41ef1850163573a000c9a74800398) <<< 16000) + 0xa893820651c7e7082fc31429a34116b693433c07be93595380001a7d2a198208002000025a4ad036566039a216eb35b914420319692020235d2cd104e2a70f881043da92ad6a003e0088080f6a170a209f90c22aca042d537fba80001ef12947802fc2f0df2801000400003f8c0a0be8da1c44404aaceea0c3d7993c684006ab0026a3c003457f9f65042000800008012b209d8a0f2d400a28bfd88f4449880e808364908159a30969868bdbe3b9280100042496fa29166f91143b6144862908023dc14b918228737751c84133521136901040004f1778a8000006978048009a8e789004014cb8b85924900250180000ef992023517699214c160db20a2fc2eeb94543017e24a08823efc9bdc3004c92b86cc003e010b2cd892ba75f0c3081f87b8d44451956a65c604044b923bd6f0608dbdde704d0414d31f51f764411a40550fb43003481127e282009c8e012dd4764009c0900003e64000cc8d17eb68d304c4747802e121017495534c35aacc5ad20dafd2bd32c22076c1de6001e00849286613e811244000074464ce025b0ad78515798b45aa4c412436ff09208fe57fdd92c208ca3e00410400034ba51c000000bb83900220080000e019202698672d2160d74af1aa1810639b24820f7e09f08823b9952283004cad9c1cc003e010b2cc8812713c226502a99aead9a186462d082196098888432fe8574b093435f6f1ed220800026112ae2c19193afd61ee102677a4215e1070000016eb87a53d2400ac0d00004364000d688003361000ccb25621a00103c2560321191508806cabc2455c0a00199f3c404b4617c8f103f9115324b89c277cc98aa7f2212cc60872721a101db6d27d08e16fade0024406113c766895598041e7aab887a7d08082802c7085911aa9c0204a9d74769a0c217ed2a53b16081806682b8107a73e04d7c18035d07fc47040450f4d26801667391ba289c209408000034c44402455a13f13e9bde5840e107839f6ab0709f60056e4cd05aae4f7dc4705e986938a8105b2f736970c01328bab680200a255655e50404367e78a74081200e385216320a0789d100045070974b0e8e08100001ed80c205810d5e8827ea548907071b6224c000033d0809c407c0200002ea4000d889560c832c545562a14015150868a8024000f68444487862f1367fb16150c53e3d92100003a23180ba20e9160a000001722040052d78c580009e13507208021396100040aa80455202051010000d510723583896eeddeed4641a2cf6cf9cf32bfc4eec23f04457d55396c820591e31831429419611401202012273f3b9ecc1ebe35f5e087a1a7589eed097be55675c53d09a38e388ab43d4161e80bc94f57803a6ca28bf8b33ebf3b6f45ba98224ce3f30907c0993fd9f39e657d46cfc254088c4abe7358b40b32c43031010812c004070a746a73ece1850fb032e9587d5d50e6198191e6e598b92214ed84666fd39fa654f9b1fb8921467bd832b892a2560b1100515402c4a417929eaf0074d945179f39e657dc98f89060885108708e04d04704104c0020000ea2377b4460590e8801b0cecdfc703c5bfcc911030b41fd99c7e6120f81327fb3e73ccafa8d9f84a81118957ce6b16816470a284882702682382181ef751f36b896feef8d1c4f7fc4805e6ea07c51da3d374efb8c3309940007f88001e912a7150003b090b3299478ceeddeed4641a2cf6b8b33ebf306fac4a6044000000011d7e040b10d1d5b88c652d40f88418086706606782602700500807f51624e0910ae31e10914f6b6d8c7a169e8f6f748ff8eb36c8697503e6fc60ba5b8618951e2f07ba3d91d303afdbf808004860740100000fc42905454c2213709152808a900400076a49f4d452e5a27b1513d088003810c0b01d8120df8d2c00012129040744d2c4bf747184208a337e284268714aedc4126217fe82e0800725d50cb0100158f1cccc100c88182602040b028864dbfc203a2f690c51b871872d8d1c9a05085fb1389c56104a5f744a51082084460de86d8b0000006aa0b8000128e5243781037540a148160a8c140003e44a8807e30783842331c7d94cf942868c335ed8cdb23c28c28154cb9e7755c97159218f21f0bada9d0285d9a173a106eadbe76f052981000081dba6a1292c802026ad53188f80e3886a8059d13e99247184409c150848a801400055844445626e2be38b49c0638e10a2840604b10a7491db8a1000005dc020a5ad37d50c05d10236d0b0400017220000084d107100100a0b08002000032e41c8a60e24b99c7e6120f81327fb3e73ccafa8d9f84a8112bf674f0ab0816470a288404702480280100cedad5c66c3e6b4097317fdd5b253004384199fa5fd4ddbb366ee1c61c859a26e13c3118a9de321d372503c8f3740025ca65098773686e87125464f5db420750aff682b1e47143bee0accd1f8abfdc8bce80f2b97272bd26c213c45f15e9548fdd35b750222e27734c508861f61a588db41337bc1a549eaa1273b9c325411bb5c3eba233ce1c7650cf86a50e52843dcf70bb105dc1f20bd582573bb44f6230ddc2799d876181352c7012fc63b73009f13082af3aebd7063da48a61f6187f961a9c590ed0b1d4fc83a7782e74333ffb336597e88bcbd67e943c521abbf66ae43e860bcb345e8cfa70f9976cbaf8662bbb87a33892a2df880704e5a75d12e61776ea81062b05cb0aecca3712dbba7faced22b63be561128e5b9e22d3c91e1425bf0f82876e418d957ef0bda732d30515a4534d925e738b7ac50a3de0c360a6f800b02bc34e75e3d850424c7ff1ed91c2e6713)) <<< 16000) + 0x30fc671e74ed3601583c09401f296a6280ae758da8b812aefaeb35cfb63e8885d029574be318286a4f9edb82bd78b9346a31e31850000594927d2114b8c8a20544f61a27a0914f8280037b894f168a7484258220016fb24ec0bb1945ef65e184042d83029882019d5e7b6200c09821a6c268a0055d5d0760380929abb72014035c292907880034ce9d1254001141f3fc4e7010210a652fce6c21409406000043e4a192613c7b0810dc4f4922a00000000c0f5009f370bdc4c0804c10410508b04404b0050040100040c16008034a704713d248a80000000303d4027cdc2f71302011450c33c23423021412400400030280200d89e924540000000181ea013e6e17b89810110806458e38e888788708582000170801006c4f4922a00000000c0f5009f370bdc4c0808840322c71c74443c43842c10000b84008034000474c4f4922a00000000c0f5009f370bdc4c0804a1861841100ce0cd0c2081000c0600803400045494d868000e6894d0c82cc640c41a2990514c02814404000a9841c8b60e24bc108b8deac1420544199ce06ec623c4240097f44fc502aa8dd861001299887c1007f28f3600009c80780218115b038e4205608506c0831494cfa24050e10f38002c2442e84009470740210140100402988e671f98483a6ca28bcf9cf32be9fcfb9b7044b6ca32d21f6a46b1e1dd261186494d37b75b5097a02cd79b3bc00000000000000000222c4cb58cb53259cf11755f1ac9a637176aaea26011dc309800000000000000007fe80a30ed6858a66adeff810397bcdebb77fdcf79aea30642c000000000000000000000000000000000000000000000000031208206104116002019ed081cc6d69685295cc91fac387061a7964751bbc050380abc84d287fff0911e7518f3f80653f1020023e85a36e56d32d99e407c6a512b5d133f900443857160932c2884bd36aa5d9987e00bdebc16765c30d914693dddb919ae752dd265ddc26eb1876634cf125a63629032740e03c80e276b0a8cec381400212080044d10009b124fa4a2971913e0889ec244f412279050005d09b0c92df8c800bf6576c6822d2828d125a633ed2c19e61b613d02b365e0e082299f361ecfddbb8d0067ce71a92a22dc2858043fcb8744cca5b0e28000002562c9af1d78280b8b095ad92cd66d2101ceddb67e3962084201c48776ef76a320d167b5c599f5f9837d62530224ce3f309074d945179f39e657d3f9f736e08913d248a80000000303d4027cdc2f71302058996b196a64b39e22eabe35934c6e2ed55d44c023b861300000000000000000fd0d04b04a04704a0140f30a401996faf6dff275a82d0f9ef6ff2483cf00ca35e1a415edf5b6f8a17cf03b1ecddb9cc1bcfd386101a72c6863ec071a0e50985f37ad1e513f682861d6aa03885f2c4aa266e17b28a2ba08a12da6614c5292ea000b4049e0c40e45a07125000460927601c4f4922a00000000c0f5009f370bdc4c0816265ac65a992ce788baaf8d64d31b8bb557513008ee184c00000000000000003f62ff4e3e6629fac2725ab41b4c25d87391d08ccb08b00a0050040100842523a610bd5770737ac65ac4085709bf734899f8b37e8513b1e7f320fbc47729cc00008104b096e2fae19db8a2db4ebe0eed6ce225308c9c9008c4bbbc21f26f211b75bd19dee94cefe652753e5316f52298e445a450535a7a06fd5aac169f3830ddb9012882a549153e28002e61296390969482cc840803a133050010e41f29634aff3185120a4dbe28674b635943057f31979890005fb1e784043ca9f210260c1f00814a82e059ed3715f2c7a5eb175038a0854ef6c70d690189b8209ce7b5b00c0076099dc4c083e0108167b8df7e4b1e9f898548e2830b86791c3592d230c20207b07594600b302b0793020f804000049894a048a4c040005226671f98483a6ca28bcf9cf32be9fcfb9b7044271248a4885845827002802000808264500401a00025a41c8560e22328b0d94186ca081651403f297cbe3c594345f681f618402b297325848da490e8a081947bd586112df0881281094f524c48015b890d828081f00814900ca4407338fcc241d365145e7ce7995f4fe7dcdb822312af9cd62d02c8b1ca1c714d10c0cb0860420530100200d29001cce3f309074d945179f39e657d3f9f736e088c4abe7358b40b240b2c71c53442c2181400c40b7af15163654d6115b33eeffe741da3b40cf069fa5d039fdceb863a8b540008548001cb128f0dc8abdf278a87081f4fec60286111eabba6845603b13c5853939ab3280128c10004000042493e8e8a246451c2a27b0d13d068001be889608f4bdcb1ed20b1de48154e1c3d6b184b4c0407270882c1a45b39c8a0007269a208030ed65ec027101e0086978a27afd163c74bab04508167b3be0e1d4f127ea5834cd64a89a01418d28e04c183c0102850100009c1d2dc6809642c7bdf8daa070ed92b65610199b66fc8a000e649e900944078021a5ad752b0858f6c84b588e1d7b4f3163820891894880db7d84b66800656603013060f0040a14040002704000938cce3f309074d945179f39e657d3f9f736e0884e24914814b1091050ce00400101032200200d28d051460280005548390cc1c456516232831194102ca280722eb1d9d0720503d91e2e48922873800e04334d676880cbe6bd5f240093fac360801a988c380027181f00809b86eeddeed442896e8cb3126f7f1f8ec512002091338fcc241d365145e7ce7995f4fe7dcdb822312af9cd62d02cc914e10d10b1050c1000299d76b9f32b3bf373d19d4728)) <<< 16000) + 0xd77bd55813a0b9a4bec1cba9131c27526bf679b22ade375f402f491f89872bc97a00063a49f4845123a2881913d8889e844000a20400309093b02ec6c8b39bf2f41823257f17182201921bdce4f02c01357bad6341c053b5d2e51a1404279eceffb1002546f01cfd40014bdd1b3fc9001912bf8f3e9256d79cff86871d00a00a000045a4a1d0650c7b09e3585992c2043702f3ca435934b73383280b1fc87750d2865fd94bb4619dd58bb81c39e5180f4a00c8e3dd2100271c1e0086962dee5a28b1d476a72414304e1a1f81868bba4eb65883f56e1b470c2896a2228058607c01050a0a00014321962b8174c31f330b1e20f4fd3943191a84fe1861571631c3863044d0045043ad6ebf9a007410fc72801412a11800940c0f8042c79d97b72270cc27cde34718bd42bb496226355c601c3483efc7a5840283e84030533583e620138a0f8040a14140002da40c8745081a000338250023e26b203eec48b9eb7b9214336697e29c0f6343c94b0678abedc282da9270b400102c583a00800012c20e453071219418aca0827fe8ad6a628e30c8adebfd8fb276d4ff16f8dae996ad41c200000000000000000203d93ed659aa816e9d1d4177c55cd61b9dc60acf70faa49a7b87d525353b4503c1b058f62d84886966065865804004e5abca45d987a00dbc083aa1382953b30a6c41b09f6a6034cdad44605e1fd861e84c2a62c4fc7bd7c0b726b097a2c2df7c7c0581ed6d8e3e9f8390263cc56a84829e36671f98483a6ca28bcf9cf32be9fcfb9b7044e9d1d4177c55cd61b9dc60aa7b71d74a970ec33925ff0e33060d6224068c45af03db46020660180baa59344880670a38a60658668438042e3c80cf682eb9dd5f6b3ca7fc5786ea235c1931ce20b39de5550b1de97689ede1f3f6d561f380e839d4b7a6b9022dcfda0eb1ec2ecaffd6615df680c11fa71d00044a34366aa03c048c14002978a2a08d9f8450680242609411b0fb6a65027821a5510082ac8a3204e183c01000014d2166230b51194084ca00264fe13a1b86ba9c62460a6ba23061066578d12834aa66b7ca08343db0a141d1814520204c26e69b000271c1e00813f02e86f9b88808a0c5e58f77282261b67005054d14ab40815ca81bcc1049172dce3003585db5400027201e0080000ab90002dc24fa5204f1d13e0a89ec344f4122790500071f1d219af671a005172009534b3fe1e620430d31c1dd5cc2ef533cf966344c40865498a795ad011ade44e638c222c1dab0aa016bb2ab024d1642973d47048299b477bec408e4777d8f49102806b2fbd2cd94d0ffd20c24f2064d406d24e2a9e46e11c61a00476c720100af492e8d2f06fe1f945cbfbcc5ba012465d50bbcc6ac3318350962671f98483a6ca28bcf9cf32be9fcfb9b7044afd9d3c2ac20598957ce6b16816669040838868258238280020574003c6dea2535d625f9fb173c96f87d5a3fbd12ce9e18d476b891d8e0ec318438d740009d093c1881c8b40e24a2771500037e927601e84103c830a06064de0be8c18e23ef92040f529e7650ec1d41dcc5d40ab17fa71f3314fd61392d5a0da612ec39c8e846658c282580280200a00008049a40c8fdf8df4612a8f84efee03cde62187a159911f488a71117b37447bc08cdb9da392dbd246ee4a973b45b1dba431d432db125589f11ee960180883d7ccf8517551a3e7926402a46315545dc2400089c4100744ea0a0021e5200a9227439001f049e195e3864c1f0a38c6806ec6dc6c27700109108073dc3ea9269ee1f5494d4ed140f06c163d8b61219631231418c18a19002200219194693eae4c917938db42e23af8e682ece1f72b16e462897f204c3f2878467c6b04510d46634a0216d8d664d858c30a10dbfc6c30763266fbc28632c669c6184638e83a608001b59b5e8000804c68400100001433ea53ceca1d83a83b98ba81574e8ea0bbe2ae6b0dcee30548b1860c30850480030108c4d4adacfc61d7fff24278af6ed4e040a34bd42140989e5022be10ca1f6312e3031fe891bf10c2b4c8cc18b1d85abc32bc70c983e14718d00dd8db8d84ee0021a492085524904270fc59d387e2cea075ea53ceca1d83a83b98ba81532c61831430c214140043e683583959d0ce1a6fe4aea7d8c5fe2fbe0fe720f70369f3f2a9569da3ad277152e9a3ade74c218590bdb93bb2b9332e6534b69dcd16b0b6df73654924d56ec8f2c2117ca597a51d0003fd24e65a2722100036310841de84103c830a06064de0be8c18e23ef920413dc3ea9269ee1f5494d4ed140f06c163d8b61211220e20809200a0040200067d4649cef2da67e0fb617b0ac74246231b877320901d45c0e90123685418b5624a8b759550e96fc4466c6bb29dd28de7d269ba0d2fa593e9b05500c7946435271050001c81031391381a89bc942583a26e1905982c9b4144d80226b010007d290af45f0a693e51c711f475f844c5081bd6f36b2ebddad7a544092c2dbf9c0f1a650de60204efc0d1b18876b92f9c8603c4bdbc4fe6d951f5d81404024779bc30a02428c0a2828061efd4f6aa2ec35244b9fc98b3d4d299b411a0054421c57b0fe879ad97a5083de6dfc2b6e95c1302c00006d47024588f582c820269d94c5cdc1820ee733a4283001ca2389c442811b30ba4114a0002a0ee73ccabd2822a13b2f8b577204c0da352b402b96d29ec4cb5742801c00010190af6193530c9a5144d0622670d93304c994144c80281900f09e54a9230505a630ffdeb142145533c036310080a3cfbe82848002d863f8b342380a2666bb9695140316ff8e5d9ba0)) <<< 16000) + 0x028a0a8d491062762200217c468017f54f4eb05a060bc17d1850b3b0e4ecc887324100a27a271c69c59818209e0140180401006c4e00051db5ce3b26c6fb523cc45c798f00e3004651d8c3cb9864a7c84e2c88100fe22c00003109c89c10880200002cc6f05f46142cec393b3221cc9040289e89c71660668208278050180001006f98832d4ca61c608fd4a038797394926509c5888af5dc288200095e80820a88cd72f85800005d40ece004401000016324c60a000282203413bc17d1850b3b0e4ecc887324100a072069c59a51441610209c0180401006e9b56c7649c1c5a1198ae8a6961113bba21c54e0a641b469434f7a7bb200800228fce500000592e59382110040000594880848988040005364070375394424268d930c06b7ace040279a61869461260238268040060100401b1484355187a502accebd9184507a7c34de08c7b0d2b7846c800000000000000000843f0e059a2aecf0c8deda20a91e69861a51a49849808e09201804010068000fb12610900e848078044c0020003512034330191592f8ac97807a52e7fcc9c3ce24919de75686933361737153090659a78870a2c516207d58f088859f991850404a1c22d408215e1b1b91020107e7ed4b410948a1280a34a7b9afa438d2753dc390a24302edeaa3cd08456a087a3020ef7a3300a082326a1f90821511c10204005875e8480009b6aee2b010a4508802000039264986f1bf143486fab9e8320754be80b81c31b980a9a3805a04588e2004e679e9404098608002000026a48e874472322380911b8480015bc84480e8737d5a4371143624bf6f1f891823265bb2030800000bb68041694e3e66a08002cf0099dc3005bdd41526100138fc10804041058dbba5912990684a0200001ea31d7e040b10d1d5b88c652d40f89631430c21211808e082020220b26a25825ba8ba7b9d4e6965a91added150a07c13982e87f6c629a8aa7ecd94350b2d57c6bc61034b9acae8048617ee2e80f8242496cf4d492180a1fd0b8b39870434e6ea426a2801e2e7272290c00d47cb5055a0220a4824c0a409000043a4100760007c04804c7222bade7f7cdc813ce7827f6442042326731f001c15b9c2b19c014031b5bd84380600c318ffb31e18022d57fd60041100ad081f8d120a82202d50b02300e805204800020d215e6b0ce2d86e02c36c07a333c34e65eba2a97eae178f74898fe5e3be14abb9b60b03f12471c41c31831821020c0080400404540030a80200d00017520036de4975064b84bbc17d184fd171ebdbe6483920804b24a1cb18b14a14910a0490130100200df9f4f9cb096cb1878f4075b32313142080c1c3db788d26cb78f9908d6370a63599e6a1afa1e1cd8ef2000000000000000004122c91c72c62c5285200040b37120c7e7db0a82f26a140090f5c1b871fc83d63a0e0ddbbca9ca1aceb7b5b65274ddb1b22b3e2e43492038b12fec9a215736be032e11c26350003b8230013c1c3db788d26cb78f9908d6370a63599e6a1afa1e1cd8ef2000000000000000004112881862852842442031c017c8a1e358c295234cf87348ca2600b4e2491b848aa1d8d3e35afe8fdcec13bb4c94d0f22b4b884f10f4000ac8e14d5b8ca8aad2a3964b75ad54190c2e258c474081072275e943359ed06f37470458b0907811ac1455942b44fc9d3a87f9838447405458c3cde92081dcc148fc3e00fa1202010d8151850858cbb1a7440b260660406c6d9e38e46ebc8e36eca2c6631f53f66a351431489ca01b17a4b148a3b2282f43450a7ee7cde8f667200070cdf2d198e8200241936fa08141d099ef544754e84482188200000a1c8c002ef9920e4bf45c7af6f05f4610000000002012881862852452842442031c0130180200d000116200a1300064324b63325a19de0be8c27e8b8f5edf3241c9040259251050a48a5084884021020e0300401b64b70699da7c4511045a53c0180c3059f06ea8b850a881389d7a4122a932058ece4508bffc7ce39c122333f519a3c84021999f72ffe8e005b1b2984880800456eb163883c0a0c2a024000125102105d1041026ad58123c781c1838228a11060e8d212221e47f6c5a408e52ebd66b921a1abe1265e40600001d48400809c391c1951c50980500003644964260a60200056724b02a05305de0be8c27e8b8f5edf3241c9040259251050e50a488306400180e0100401bf3e9f39612d9630f1e80eb6646262841009440c31429229221008e0020687262828d34f8d71a6e685f4d8337027872a2843a01008c82450001b920420bbe648392fd171ebdbc17d18400000000080491c51491081080c7046006d7995c6e4367ea85ebd965cc1139c31102aa0002ee409c25782fa309fa2e3d7b7cc907241009649439429229220c19000602e0200401b445747a3e8e50e4b183fc68c319efe5dbc50ae7b47712922bfd520aee488ccf5e54b0e004867bbdc0801342e1a98d01044010000195204213be648392fd171ebdbc17d18400000000080491c91851481090c80c504600430200200d00011820007d8495c644ac322550d92a02894c040011e44948c44a262250311279488f48449c3224d191260c892c44494222491112400891c04003bf649199648ac32445d921a8c33916484732413585798c9009647e4323e1de11a8828a2e6e647f851075610fd9a0f5a3040c32c8fe9cd574154800d651465059410487002d95021697b56045025105e6809ddd6dc2008ac5ad1316819e14100115043fff9a63ce54824011506b23afaff93a402002d8312a1e20f01c047a02e0074897)) <<< 16000) + 0xa63a8e86ee2465c8c5ad62a6fc9ab5729863b3afd8ae21418e389b7bf78062261dfcdba1e9cf277d18a0b0ba0fce853eda38f175b31ffa581aa09d4e7c104838dae3e91b8363394adc6cc8d69119508835c3d16de05031275ff01e35711e7eca379b75efafc4121460751463c0563a9ed655c946e7ccd8fa218585281530213e28a652d56c1f646b12efa55eff4ee46f046539199a75c48f35cf896ddc08c819ce28019ec019000ff2fbe32408380088083c8544304189eb717044083e01000007821860b80000802340003d89e4810b0a4ba4003600800006e20b00a1d00100006a904b09e0e1edbc469365bc7cc846b1b8531accf350d7d0f0e6c7790000000000000000020abf674f0ab081640f304e05be813b97e4be0a9b058f62db53b4503c27b87d5254f70faa498488694484404380000871cc91573bf7dcba1e91b5b0e433e046fcc91b48f2018ee3f22694880955fe6cc9779c4f368396674b2cd44c7864a1ccd07f95adab5166b7dff5ef58dfe3ecbf72b428a8a1f140012c4800375901a1980c8ac8f05647603c2407881689018b0ab1c018320dd0d5e703f7b5e5101066f4d8c710001ac2d9500098607c021338fcc2441a364aff624defe3f4f1553ec823a492085524904270fc59d387e2cea075ab55b2f11700b605857ae05857b1118333adca83a10750c2492060ce003003c1c6efde28b417572c7e7e108f33fe6d7879d09b5ad491241501dd3370f42b2c7b912d518104f1e39bbd237125eb2daa31925650003a924743a2391911c0688dc34000a8e48d87646a0b23401c91d8ca2680b53d237492cc1247fc9d6bb3f59b62166239fe000000000000000002109439830e31209800a00602000816d7090c3dcdd3308e1adf30d7ddfc884cdb33e7e29c9beae7c649749208952632b9f7e61e9216eb127260bc28efa29a65ef4cefaa4736565d0b1a73ca321e8001ba107e3591994c100944643b2310591800f253d5e019068b3db3e73ccafc860001a81102eddeed4000017224f9cf32befcba3a0d04440f304e05be813b97e4be0a87668c2cf42bc8fd9a5c980ecd1859e85791fb34b92f94c9e685c65f896cfa079b2993cd0b8cbf12d9f40f28ae880a28280068058082143bd843a21ca4aab2917e53e0cf86f1e3eb67381856c679e4302c47a9691718787c9920aac34fe2ac253532bfee31f27aa3d40b26609588b720e791ec6f929c7b8cb9fba5f66e64ce2520148a3d85cca2f1c8cff201d5d8a42d6a6dc1d1cd73e83003743fee25802d1f6f8060087035800003d93aa960025141f00811784f896e13a36820960d91147801d51f7c0e01cc22640100388f06804a103c01022e01d0d6aa3d50d0026156881021ba1d3c23081c00858a3f181d98e01ebf305e281159f758046103c0100000a320002b44628443b0020002aa245a120003f020e4430711991108c884164580322001cc42de5adf24064316e7553058c70ce6200840993fc38180a03a1c6821d7b90ac126101f00811582f882442781901aacbaee4983699ddb3a00c3e290827036e587fb160307e0fe6084c283c01000012624542b2290dd05a38f2c5bf725e12a5439d6dbdb07d690d37ab1d16596e0c2f984880ef63fd445fdf4046c4cbccbb015b45aa1948da82608cba87d890c7e7908427e8ab9d06fd15008a1713ed46d00608bb0d762d92e0402bd983ef134d8109c7ab71e38d82f0154101e514cda49c22d9d00baca2ef4b0bb4cf5b6aedc55b9bed4cd44c0188b9f0b78a60d419eda0905aeb07415e677b3466ea6c62d80db22419681996570a8c6bd7fdc521b6b2d2d41c00d26d7f508c207c02131c582043a8e3f032d4d42042b0c8e78502290da0b08048fad11292820f804388057221120285238e28811b7b99e450313138a14c0cc43eaa12820e80400003c080010310002c820362322801c06b000196b1fa0e71afab4c1009b4a41f32a1f69033d8c22fa2da05df35a68424b2785dc2a0878b61ae39ebf70ff7c5fdc26323a4de32ea0709b3d92a581824f36ed171f459baa99f9940f62a37a34ef94435b8dd860d46a60bd7a03a52e907bf7ea8f4485f671310e2d1815e7c9a13be17a686d0fe68349d4318e36a2b18983fcd7fb562dc6a401861ad1d45f45d61074ab4a958e7d16e48df78ca63fbb654d92905c4b4978b5a274e65f7250b8b138c63a0cb0000b44416014001bb4788fbe48bc17d184859d8727af9920e48215f3241c942cec393d782fa3081c47df24085e6c02804f340b5f92f6813bd3817040f2f05581615eb81615ec4460cceb72a0e841d50c238118134003ff00f036a53f676dae68b38f45afc39ec46070d0e18d70c401565340b171706cd82067edcbaeebec905dd5957b92fc5e5fbd6952bda3f05331a24099a4fad528320c78db1692511434c235f1ba7cf082a0b4e51c2e9372c3c024101e00811400e444823cc6edcfce63db39f3ac8dc56b53d8c7862aed24d0c3f225b7bb6e24183f6ad56cbc45c02d5fb3a7855840b207982702df409dcbf25f05581615eb81615ec4460cceb72a0e841d52c51c21422c003b10ef4d8472db80af64710bc62a0ec5b98c26e7f147cf996962f35281ef5e3b2b1ccd16ce012e8ca51bbde40bb6e878133d1e16c9f73a1705f273c2e8df9f96418a2d415153f680025f90005c0234422227090005439911208f31bb73f398f6ce7ceb23715ad4f631e18abb493430fc896deedb89060fc64a7abc041a364aff624defe3fea436c378235f3241c942cec393d782fa3081c47df2408483003207982702df409dcbf25f)) <<< 16000) + 0x055502cd08a08808eb09f530b646f49d27e69566633d1904e23ed3c6541888ba9e858e6f974765fde2fd7533613ef16e811028cb3b6a109644bbad8117b46745d29c2c585626c732b310f104835f8f50cffcb90d7aef650a50124a000ad6486cb409e5221a1110c88800847491314e8315c324cb013f5577280e9bde84023101a00850439b573082a0450d8482064010314121d80100004c1c3401529ce8a0402c234ee8000020b21d1001223ebed020086d26945094308402044a022240100009890721583888c88c364441b2210591000e0000200821f0190f00c8740724d6a48c92261023ab3c18e10f2dc9ccc6004001092617f1eb84384200cbedb4c009f9ba3e06000676b34e4002100800006a906705c1174913ba0d1e0636959943004ac6c4181472432f870011071c0025081f00800007e10002c124381313709c09225da6a80042303c01000005724363a04f1902f8a8868344321a000442200a522181d10b8c885834000f92485417491a4d73db58aba986a3f531f3ebe10080481ca0c30ca04704d0060040100005024852895d18e4650212fe6a3084a2d8bd864aad72bc84c5d10e8000e9105321e8e2908a7de38f98a8f82058a0b9a31605000f30c2e40481840010d1c3be86288e3c9557fd628300728c1c93081f0040ec0080002e8f1fdd5d36a8b1406b2fc34a001d469b7008c3080021008010040ec0080000dc80007e10a411d8a1d21970228be7f92bec48601d066ae6020c46907608056e0299081288100040850144260a00012f2034330191590908c844464200b20f01c00004011c4023725df0823a52cdda49000a7fd6cc0c000f5e696c800420100000d5300401004000011107e09c0300401000004448382641a138040080208300610002c36d0078cb8208c9a999e10005425f75004c4080010000156482c4400024e4828740f4322091510406881c341340a00038b20d00389e924540000000181ea013e6e17b89810684103c830a06064de0be8c18e23ef92040292482127b6d863d24a68b3a386857001063d8fca888dfb4f9ec6acc2bde6516526240155659be56c7d400000000000000000848508506680300200800201b4a77ec165609310f42c49f46e5581f3f6f6e8d1eac3eef6e48505b90dc582b4ea96c8eb3f09eb9795871310c7aa9091deef0a6f26b129c3b4ff1553832632ee32f9ee03d83705d7e873008ec1de9b7686a72a09a5182050002e29206350c0148814944082a17f05000752100449e2406b320255900a6c801263fe631fe15ddbbdda8641a2cf6dc599f5f9e5c6d659608dea5d75cc7c40b73174c1d401d944cf529d054c918510904504f001b5b63bccf07cde95095200f222802c256c8a4d75978dc42249a7bdcb636ff23c057b555154102b2180c952088d1a6068e0250afb1590de6202728c5090b713413f8f97d526b13413f8f97d5277610b088bb239eff610b088bb239f0079d842c222ec8e7c1d842c222ec8e7bec4d04fe3e5f549cc4d04fe3e5f549a1e10c29a19618c1120040000067777473911be308dfc01138e1ac5666b4964f1499e2eb9b8461fb29d7548f63adf628e212c3e5bb77bb50c83459edb8b33ebf3cb8dacb2c11b636ddef21fbcec8b6dfa8f6db7ea3e03eafd9d3c2ac20598e30e28e19c08209c0676730f30c900755cc308a641e9cc88f1d7992a67daead0ded7fb456ac1e79c585cf5191f70a2c604a723af1a9b69ff48e290e3a67c384542aadc2608844cdd5470d64505b892820f80400003e482c0487400400085e47f424000fca41c8660f433071158470ac7f0163f603c94f57808346c95fec49bdfc7fd486d86f04657d55396c8205a0660180baa59344c068c45af03db460125ff0e33060d62227b71d74a970ec33880650e30a3061843028000048cce890551cff095950c76ec9f50cf6b8d48f42d2141ccc31377d23751e00e051534025322bef3ddc27ea77c1ac6b24e122f0c2c26882e993314769a3747007be5b640eb3b5addcd148f49e28982915ccea72841a058f723895939d000b001c9bbea060378509c5401a0607c021244fdd15e0333178c386202f8a22f8f160478a4d1c668909af3c0b140883162a57e8a21c2020d2a335f553882440f9efacad4ccaf820447659f6068fb790e00066b30793512d99a009e514c087b6ec5403264d981228760e8b2a8c3b93b2040d8ec2691c3ad966db28022cae68644060dda81b04a103e010f300e91df8965541050aa4082ef845729064b46b5904059abff831a00d03e804098207c02000024e41e837b1b6ef790fde7645b6fd47b6dbf51f01f57ece9e156102cc4abe7358b40b32ca4c83c84062c60c1ff89713d9f4155d4b1bf24e953dee654b31a1e3487702d9245490f6c08f230509401e255f39ac5a058a051652642042030c22209a0140064200401a000194424c2400069040016d880044b188ec45c3810d1c66731590e3209daf401c280944e08701a9861cfc30130a409c820930e0f80400004c88fd0487e42400175a6c5cff683a5a0c03d36e1441382cc4511a20239f282046e3d32f710ddcfe242a8fe172bd7e630efa3c00407f12d5fb1c8bff2c044d730a3f7c3873e710067bb9446628813022000de9a033c791c249c60c1b9d00194e40881381f8090fb8487d8240006124714c400262640c8b63ea0bc3de4f6cd7accaccaa1b5046b6b5aba42e1517f7af3f040000000000000000f5e6c02804f340bec21611176473e0ec21611176473df626827f1f2faa4e626827f1f2faa4d0f0c918308a04904204f0102b)) <<< 16000) + 0xee0f60348eb74f3fb39d26b9e3bec069789eda5b36df8e07a22ba398b1dc875af76ccc533ec0edac50b10e4d61baddec960cc004c02e74ce3c7d1b1725d32cc704d8358c3236815c289b2906518412e566e4305eb6646883096eafd73920067a04e80802ea7c208004c283e010e2093040a7103070ac695245031e633a408737056dc2089ba4bcf1a0b7ae2c1604185393ae44e083e010d1ced923913442c9aafd8d0446fbc9b04153bb14607008f4f913180132cb4204030889a8d27041e0080000a49e308c5a1491c512e6d4a83875d907d0840d69737f3c8003e010032010fa00c0003d882c068740040007de40014d88390cc1e8660e2231f3058f900c7c40764550ce4f3af9949c6453463412ee4d08fc4fc68fe480812a3ab1cf0f2e968b12ae5efb47a2af36475a5c3fba0382713bb54f957055a78a99e9151bdd7ef3bc6cdaf0d044059025fa2fd0b11ea04f0447529f198736f58b03e200402ff220ccaafecc4bc9ce048ade9e8e7029302239bc100697da011ca2241ee8b9b8e7924a44459a2821f283701740c49cfddf3b9d7ef9110b201932f1e620520a923478e4522f189a3b1b1856e7096d25663960141f940a10072c37ff800128e0f00420513805af13c904332e4e51203adf33860ba8db3c02809c3bdc293c14e8531a84c083e010916629be7d38b0879ee828480943630f27a070042782947dd09041d4cde181804d9a28a89c107402000028647c0263de1304009e921dc43e83023156f32920f8aa9b4880495537ec18268688561c08c4c5c893020e80430b890ef0798122f51ad49020e80200001d0c0ac51c7b28e18779388c308a597b06500620a94f24020454bb8202bcd00b826081d00800008e10a10df16038942d44916e64239e4f2bb54610032be1ba6012080e80400003348001ee11a80100036790007eb23dc0b81d58302c71c495e9d4a880c3e172bf3820e657224708e3c6d029400780203da030ce010a580f88226f15250d1c160f7d081c4e3ff6165cd0804dc225d0c200ac3099120041e4b76f2800f854317870066a988fc0290184402800019a3492410aa492084e1f8b3a70fc59d40eabf674f0ab0816450e3066823027000800001bea442028815599b6171fffcc131d3709c96f8345726edf47106c1468000f910cb110e78287b0143d60a1ea010002ae9f100372c619826a6b9a342843ad3d19a2867c3f8b7470000751d30002012960f80400004388e2988004efc8f48e87a074003d2e479ca626e4b90d4b00a90a2c0e18c70eb5857024147beb0c19803027231c203e40c027d5d3d4b921001c3dab2e5ac14002469a97aa218025fb61278dd000033ac3b89984a800b360d1e3620f308482b0300dd0280009c88f326c795263c8731e32183f0ec78827640861d09cc1c305da9640c190ff03344bd9aa3216012e1524c002a303a008c243958c8e1a401cd3bdb3855a0e7a2a2002eb1466800307da66104a103e010c2423ae7343481089ea2ce1696428dc4c303b1b6fc40c0284cd025041e0080200280004288f086833836350020002602096331de0d82502ec88662d02344f5d862d3019bce4261c139418482c044f74360000a900e0022c84713e8fa905042c9728f08d8cb43c1a10f7ebd183013a4dc2668004a383e0101e00180008d91df190001219b184c79ac01c50f76c9b0e0ca23f4eb303831800c03062cd1d930250c1e00802586c778163ba0a04a05cce3f309074d945179f39e657d3f9f736e0888840374e8ea0bbe2ae6b0dcee30567b87d524d3dc3ea929a9da281e0d82c7b16c244344242182301300008888f0f9664954a73fbede553719cfc836b3d660f7fa5a6b1264c472fb1dc603e570c51ea71b91b44fa7ff50910119aef228c689697091e4776e0e1551a319224520e33d3850ee09364f3421089d044025101e0084ce3f309074d945179f39e657d3f9f736e089d3a3a82ef8ab9ac373b8c15893450dadb201cdea893450db1b201cde908a7b87d524d3dc3ea929a9da281e0d82c7b16c244405385283143340091364f61b7acf4ce43eace7b2957c4db4a49f9a5d97655462e22c8d9223a37a26623f4784458515ec68c307195139f1a6a751ff503c6296a99bae9db8b08e144418eca0008ec46a014000b424002534819108770643b622000af43418f4c705278206d89b4980b25ccb985038196608920aa281098200c3377192080804c603c01000013520e45b07a2983890c768663b213c21f6b8738d0f6076d44a0346549c81036cab5c00024181c0086920724c51268c02b63a7e5081d91de58900810734880018c4c13bc04a184001080200802209b6a7e9e041217f0aec78225711128808c30eb904001cd2290020011405ae4c083c01000011e3c502e7382a78607056dc8c1806235161870d986f314008f47b6c15081e00400007b100026c215e231d8010001da11d71d8658cc758363aa0b1d4018e980fc576d486b0b142a39264403916407e4f042cce17a300090adc900025181e0084020040112161e39aaa219d55d774011e3a7e86000dd2fb89014c56fd04a10360100000e921421b07a05682711f41180b7a7b04303b9bc6880462034010a1c7b9990a707036801c982cfdca6e702deb09fa480838010a1c805d0aa70700887a6983e9547f4400427a4c8080e409bf24a08380100000ec23a40b90833a9b5668538d87de580266be220801ef649604818380100000c820005864000de480027211d1058e802ec58afa6fb2c3385bd2234145a1ae934014779fa3000ac62d3000a8c0e00234a10)) <<< 16000) + 0x13816944054e51310182abcfb250ba6a69533821f88ee480128a0e80434a4089197406ff9319518508ece172c40b28323380ee5474d0025141c008000079900020621243b0c31500019f999c7e6120f81327fb3e73ccafa8d9f84a8110e23ef925e0be8c1b0a06064e84103c8040000000011d7e040b10d1d5b88c652d40f99438e29010c104088000012d334428d1fae8564a09d0705c704efdab49ef261db92be728262782a2196d6209661635d028f50ec7951d245b334c927a96b04628d92fa8001dc91cf110e70880036008599cc7346701d03d20c9c10bff9d78415b9e85a1003ba6364012060e004012c3619c1a1cc090e58287281609403c041ad04fa183513425800009100e8023461fc70be861b60a63a8c00f00254c381c8321fd0c0f8095f780004a403a0100000fe20003366c43775c2942049237b7a04196ce377820155c4b5d4000090a0780200001ba429074392221c80d0e3848718040008b8471514002ed66c54fb78ae2ed7bba959ee05cda5c8331a072048216068dd3285cbe0dab105cedc0751276650705c8f62e180b84ba478277ec74295b00c12a160651d594101b3dfc7a7d16dd471773447d30240426daa5e2e542e515312a7492cba8064fb0a00c5065621059e76eb49721020b3be99f76e01002e426182ed792bacf64a181b856b426363205b94cd6fcd25dd2d76aead2703a1b7d8db9d030e6ceabc4dc8198c59313b0a6916368c94f57803e04c9fecf9cf32bee85febf6045492410aa492084e1f8b3a70fc59d40eba747505df1573586e77182a660a40a602402382500800081359af25077e49a80aa56b40dc50aef80a023942c83b4f88d80452859a6e30c07ce8e67e2b5d5446c8ac460f5b1a5f1454000d48839168710a40e2421c3150e108800244089b92f42081e4185030326f05f460c711f7c902062ff4e3e6629fac2725ab41b4c25d87391d08c8b14914a08708608508b01000a3dbcba0891641759f1fe2b58e21ee2169e92c5f685dddc5b75605aa90de889ced54724951def0a097a4cb0b17a43b4080e10d6f64441825ce63cec28473540e843009f5fff10000b9f44be400027241f0080000b01a249c3e5be49c53ea34372a7d3c50853a81bd447f7d0acc492cb5b1411eb53d734254ada5c6f46766880a051d1873998e5a209e7d87d0d031ffc8498239edb162f95d212400398ac400a964c561ba1ca43c180305e984345e25d4864bc224fa2000574c9ca4b67dfda7a243e027a44d848a2f12a3cc7394308860000f488e0968700a437e4a1be1d0de8c86f04400a1a032090dd8486e8140011e241acb4372520531503402800f3fc85986c6e00400fcb442bd7619c9b0dc0586d80f0a60091820478b0a32f2f4a56e0a10d0ed6b98281020ca515340445801c407e043c0802cf0b7f400a880406423e2ce10c015e92f3fe70a0000002a00021b11649a212bd44205cd280184a1f0ac0b17e4bda04ef4e05c103cbc15605857ae05857b1118333adca83a10748a186189047049007010012a148cb2da34e621b8a79897f14503caf2140f2006f8a1a2d749e621d2da4dd5cd3444fee44f77fbc85fc1ea8b7fafb13dab18458db7253d5e020d1b257f96adc16137d7fab32c1190c69ca024a46e86650b28dbf724e12bf042478c30c6024823000808001d0f3d7820d47444c1725b60a5ddef25df042d90c09ee1702f5260ed99ed91d9771f12ceee34bfe885937883c5e2272b6dd78be384af8b32446309e2068001b19a192d6511d0edee62de59dd8f0cdbd927aa7a2a184b01dd0c0eb77d440adf3bb2302b19870d6f72ee1c62ad155000810c0179e4d5e2d9539599d72f0901bb85946da0a4ac9992298703eb35ffbff09d27838d5e100001f329d9f08db2a9e78798e9c52f8aa27ecb0e58a81b8d2821e489f9046c7e847a4450dd833fc6013552ddc4000090907c021840567080b90450776b6522294291a569c2962a2c9814282832717140824f5b780004c30400101b7190db08c6d4240002e878f77f6b0b8688c6460f3e8000c3031382001e040f120004838400101b4050d98286c81400023a4000e9881d8c8001cd88d896c6c0b435e4306b2189b8ec0144635c1306805c8a1ad45bd62d4054fb60e05155eef00edaa781540e093c6f7f4cf79a9e4042c09cac697bec54206c2840086a2b2a810a79be9e00002d3464e6729c468fa40006ba1101bbb1256a2781dfd1b507171b99edc59e393eced29e23850286012a4f666c6b045e242e89143bd356098c56967b2d3c2c2c858ffe5b1449a9d98f206086913d0ae313aaaff293a38146f41893cab85867b32689046c8d946122bc90b74a081c14610f9c3d30a8476c44b0000764415e67d770ee9ff0080003c1298dfac276f38717e23a21e84c838a9ce1483400763a0003ba231282188410c318861064080321820900039611ad598d62ac6ad063544b053218d486fcb9e1b4ace68ca67dc038a1a007509a9e01c96a892300be7200ce48184dc0edc7016ce17600080020939e0f80438b3ff7e63924f81cfc10203befda44011880e8042018020081a80100001b91a71186588c6984700001004410bed36080807d17c538800700200000e47cfdeb762a1454afa8df0f0001601242800062c83040798fb5012820e80400003c088e02e0018b5862c09e407f1000b804200002008000022234a0a1a40100006791a3010d1008684043400200030d233e2319e0d8ce84c6701700c0100402500e028d9a090160141ed5809029bde6f6011880e80400002908cd8a8668441482219)) <<< 16000) + 0x9110cc06865c2432c0a195010000cf11943900033f91933dfcfa7ce9291ba19285946df7f2cdb78080420c04234a2862c51453802c02401c040100401c20008034648040002b44644c40d6431902180288c1a007840190926a807a51312f961a8dd0dd0680467e7b58602ef862828004a383c01018f058c702c63417a486cfd3084448ed91b787089daae330b0418863ee80048303e01018c198c588862827c2029e38642c103aa5b124812beea4c100008c907c020000168400079cd8e96b23c9c8036a74b25ab0f0ab77a9b606c6b0f66cd451811b7b323064831eef82ff02825bdc8c2d48561aae01fcc780bcf16bbcff1b5532d0dfca03eb34b5429d7748ac84ed9003770b7bd5eb9aab0e0b20400007cca73e2d70f33c02b84d4e2957c23a5530e58a61b0000357207033d08207906140c0c9bc17d1831c47df240816a5f8596a4b962fecdcf3e971d67df57bc010b94a857d811000000000000000004123cb30b3c12012c00404000bbac51e4f12bd4ab517f9da36b40413740b4da51906112c2fceb4e501efdfde85190c7ec0b61ba911dceb35e3cd8486f193ec19c4d6b154a7bd08919a5d68e55dfd139353562077073c994de583047b630db2fafcfa7ceb096cb19e64f933dbd2c49903e914dcf016c1b5287eb0f70f28b9903924f5643c82d82b52c6640000000000000000022103cc13816fa04ee5f92f82a658e50248240250040080096d4a888333f80a29008072a6f62f070953b9d904229cbace88ac76deed821ca3b81cc6bc73ba572bf2c3e8349c85a385aeb951bbc1ebf64f3e4107ace1c50c620a73d00046b200122e4624e43106a187310c31486149430832040150c186860824002170460516300621372d0338c85fc1400366a426404006308420c17c68cbcbd295b8308194a2a6808860c6876b5cc140611802460811e280b3c2dfd002a3801c407e043c050057a4bcff9c080406423e2ce15000000450012bd44205cd0086c45926894000c25108560580002792006d7a4044428e1005d2caaa608c40c051bbebaebdc30435a42a520d4c700177f3649f924602685cf06d88bc5000f537561e095500105014150009c40ce86007817e250be9085f0742f63217a150bc8085e0040004c44045a9480a9d89e11ca5dbdfcc2a1e02c1b6bf015fd3767245e86050b6ce9aa2c533ede3b798d14228dfb575945b20102cb86e8cbe5b605bbd64206a8014f6c198332c140357b3f3f882819a8f2a58a87861dd4ff93b6008032e775f3c1b984253220bb2478bf1a67f07a0140008c7c37bcc741c453348769e005006d7420541202657e3e04d24ba4b683d8cf5e6d1794fd9e48838f4a98f30656869a0e76b7c928d637141053db278cdbfb5d1be5f308de31cab0dc29e4a8ec05dc07c6c277011a01bb1b4c1f0a38b86578e182173174c1d401d944cf529d054871080c40c30870050140fb3d8412c7d4ea07a98838117489bc9209e2dda93cac5c4a629ae7b5964fce6cfab52b0f46be36bcf0e8d1894b4c410032de264ff5c09a9bbe61fb8e8287508823f4bc2cbfc61e148fb61558bcea8fd2c0080cd97968984e1e23fdd76400019b678d11650ff5432deec79be23ddb270f8e0207fb47b098a6ec4502781cc4b25b9319f3c7253949d70da3465fbd0b48743a00c2301142597958b0229b9875160b199607bb6ae6d795e7783649627344fdb84280190e2743b141bf12702390580bbb40f4357e97d2a54557159a9599e708c9602cce0ba1e047bca785f9deadac6b287b623ad5c67e09cca1f40d382107a9ae00017f88bb10c5d4362e81b1730d8b902f253d5e01b7b52e4d8f217a93f80d594cec119808064406306206384102480180285531d4acd12faa78eeb1870c08037256371af7f08cd5f1ce17047a0003c24210740016c045c4f62e07316f258b710c5b4762d80b032050b582c5a807834909b0efe661812275890a7bce0f593aad11a12c0c12f21dbf3b95d0cf4350702f301e1143f7494131c1401cfad51364e43b8b2a9400409ad1e4f30700e52f709018dd3c7ab36f4e55c41961fa9f32f82d0a03a681182b3b19d0a63b0b98a5543480510a9894158169118b408c3443784155e9a81a2de5001d04f887dce64ca7a0573d3040c33acc85c0757b7137f07277cb15afc23daac462c0d5187b510de0a32309ae1d84cd055b43c44c1709004494910c641a918b4ac4aebe4bcc163dcc12741c003073805fcea0f701651b9e933d97541decd5810002798c2540f0dd5cb8e284265b1d4049f635457e0480a058e1a9e858a6c7e4c4cf70dad9e03138cba9fe8ddda6d5ddeb2255adf28b18fc5289a1e840cb13da1346146a732999018518c0311c227becf261825ff84c943032a2495000004c403e01081bb00683e185289139cc80c3ac3a531c23d96fd243065c61ceb000251c1e0080b3828000458c0c250a4a28c2a6e1a2fc407cb123be94088cce56a40345963ed9c0113f439a101050b181013860f00430100db9db35735a4177b3a748c1540cc0301754b268980d188b5e07b68c024bfe1c660c1ac444f6e3ae952e1d867100cc24718810f087001008ae5cf958fc6f9b84ea9b45c25c7d3a4af30f5a6af7388374eb2f4ca437ce2afdc78620a7e829ed70e411a3ed0c117e535f24cb3d1602c418165f2491049ca724240fe616a8c80375ed55609420780200001ee4001190813888598342ca1a164090b18480018d480045a114a2983d10c520562c41b1610d8a282e46e727835a486105e7bd1fc810388ccc2d2107051198b6e440811c4bdacef)) <<< 16000) + 0x0b02b4ee82a3f24026cfa4bf4070385dcf607c50014873bddabc623d0604c048b200a766e8163b08c897e20663cb3a7430a2e2e4858e0c98e963b161c6c2f475183617ed5d000093900f804247a401402850a160b961c715e86030c8e225c42e1a24343d0b2b2204946ab6c8904384763c00138a0f804058007e493eccf59309833eedc848f2e376dc0a1503412a18c10775a0122801b12c9f200330c0f80400004bc8af868000b3085990c57847c418fbece12c860e8deca40d4c584674910ae95bdf16086fbe22810094607c0202ba03e21f223e8e164245131a52069728b4e6488ae53b208b048d48c4c9200d4779b7000261c1f00800009890a4150ae08856c040005484001cb88391481c4842b4321590d0004c99005198ac00f8d84ee046806ec69878df80aaced346040dced9ab9ad20bbd9d3a460aa0660180baa59344c068c45af03db460125ff0e33060d62227b71d74a970ec33880640c30a60858840410001039a0d1efb8b8ab80d25e25b8bf69111d540d6bac13a96be47aae9adcc61f0c61e4e925ded5736a134eeafdf01d7c9de46558048199443f209224750c31f47159180f8fd171036f5bcef92047a8c90bc6040feadcf04050eefae78200147bbad4026141f008032848000508d0ef2e97c74715b016e1c901034e17dd2c18425379038299480a5090034c97540e007dedd854270c1f0080ab808558042aa0209e010000d41124218918ec4d856244231210dd0e4cc30ac0717556181a0a207736ade3432d09ead83869beab060301161ec1982019fb44d3409c407c0202300b11701d908675530881af2e19bf8c286beacb7243009f5ee63041ce01fe4025101f0080a782ec83d80b60240d7592f21490c4e1ee530c1169f3d092400764fd722800a2fafe8100465400000138a0f80400005608001441047190230a85345408a22044050a6028001284c0cbddf368230a108510c26080bb1a81058814963248707467741de6063738d824004c2840010e3613b811a01bb1a61e37e02ab3b4d181062d734af8c4816461248e38c78828448260184ca137cb247294ee328b2e8691282c7451fe6748d690650711b86388af64764d8f6d4287185a1f751a03c4dd373a865490c6124e84c720323908aa5205083f0d21d7224121fe1056bc2046f57983794c8808260200aa008000740894048001018e3d8fca888dfb4f9ec6acc2bde6516526240155659be56c7d40000000000000000085905cb2aa2be0591438e29011608c086090032f5922da0597cd13bf800be308cb9cadc7a1d806371f1d94cf28d0d1ee0aee8a2a45af048737a831f10e19604c5153010a90082780400069c449076246331511189106c48437b85ee26607a804f80000000227a491504081980602ea964d1301a3116bc0f6d180497fc38cc18358889edc75d2a5c3b0ce2011438e28a20e19a11a094006020981401006e1288b2a86491ea33b6788e30696e5f43c439eb033a38678cf375c10450c27c80a010373a1e27041f0086126dd4507c91eafd2ed08e3020bc7301c35ba88ef418026b2a404000197ae8513020f80400004948a804c53c07c40fd8c5822c85cd9c20a40ce405eaa060b171fe5812000ff5d8d0808cc4cfae0800071e73c09c307c02029c0a000169200087c411c5408c2214d11022868110142980a0006f922582a00104f22967a1003907f98809c841fc12001d5e21fa0a0035d1204e9b02c39fe7393ba91125bf44ab0177357b5f73cf470a0689544000000000000000000000000000000000000000000002c08c19208608e00c00a028057997a9ee0032a8ae93a4d204d159a4ecf9e17a10696dce02f58004501110a47b60c2f3183fa986162e473f1ebea7480ce0f9aaadf915b350426a67ecf529dcf5dce0182eae24015d098e6b9555fef3ab7a096ff44b61249ba80f4754a32cb0c08465b9d1ecb086499733cb2a1a21bdc2f713303d4027c0000000113d248a820b68f8fde944077d6d5634140af90041b44898cba64fb8b7e080000000000000000108e453fe5be7fe88f386f1b4ad9cb7353a81f85c0f9fbfd00000000000000003d3f39c9dd48892dfa25580bb9abdafb9e7a3850344aa2000000000000000000000000000000000000000000001610b08c04b00900100104ac2f752d42569370b9daebd13d78203fc9dfe1ba17ae4a22cea1a987c6111082d8e7dfb3a2712b58c49a2135779d53c4f0a92bf547608dea8cbefe2dad9c10d70073e7a33f608cfc5fe85400f2113328eeb9ec96191653c77e39e911a92beac170c1e0f785081002295ce040b2288ce200017a03dc01024181f0084050040100a61a000037304bbba32c1056e888e120602d5e70002638360080000a1381a3a483f4186966590114146d6652a38018b36d78a06466a70410055d58dc80004c403c01000012d200065a4528962923b148118a386c5183628a0bdc2f713303d4027c0000000113d248a82012c23012c12412c02401c0503e476af7a40eea1c082676edb3f7343b07ec0e10763a14046471816c81d151bb9a2824c936d35962c50bb50fee2d4430800002174ec804042a2eb0e4b89020c56e6329668c300024603f5d918380a3b8a36b1a3a2b62400bc10014c03dc2f713303d4027c0000000113d248a82013484873c71860c30c2340100c00008036480138ecb77024119e25e4b7d6121c000121290022397bdaa2225c20716562517af2284399ee4a6dd0209d93bd0dee414088ab0549aa804126cba9a44419012005606000021a200068641f807b85ee26607a804f)) <<< 16000) + 0x80000000227a49150406020191a42439e39a10209a0080170401006ee17b89981ea013e0000000089e9245410180806471299081038e70610470170001006c92fde642e3840c15cc3ff84209bbdedea1240641643ae54186b496abea84020e8857918200436014d8c0807da6254760018d06fb8fb7900240140000ea10003073c797205310038c2eb3bd4ec610182f23451210aed0e5f4082be7f2c6d4302152f140b4d0022ab891c98000ac09cc6200003c504b51200460200ce010660080007cc80032511440df1d94f8ccb51a2826c09bcc2440a877402a3080801523bcc0857303b190e1004b0a3e7082ccf78488838050d79f0540005a8cea43d4801180838fafbb5f73811c63893d325270c20ae12699e5030dece1eceba260441464bbb441c2ec254c59570415f9bbb6dbd0900d0e67e2a180008341fb9f66d7b20052058000206215e0b00505c11f615f252c50a5ad2daaa26864597b4f5c4860e26dd414407544d11abe1876da7643ac4841e4679b76402909cb4194082546de08cd94801200c2088a8a4a7c11428b5a5b5544d0c22e03a8cc48612a5ecc3a203596a33b81861b437537b089081e4679b7640236f29cd820411ae4b734b652004a0300001de214c0b823383303b97c81ca9a46d1b8871433521aa9c0410756f90d744d0c4cfa58292880d440dac6f2830f9f3050c1fca04934f918fb01047984b293a23f90028028410fbf194864e40e325e56b66c38a0f955b1ec82081f70983ee4686175fca54884065660765dc01872791174f3a5022bf7f600b80822403071a7f59900280240000fe1092018002149000827228602000c6b2064330f50587a02f70bdc4cc0f5009f0000000044f4922a080c040322853c43843c13412410c0004b8c0080378f9251e77a08f80c0c369f3e07657c961804e81ad6f08b1031d0a09bf995f86042e963cee48b309048a37b69e618c0209132ff7fcc6883000e44c7f4d0e08380136909067becacaba2400cc140284030a60184900a49e553578a01b04906991a1a2fa20e140e5ad78e5f80c2857c7d042b0e384157dbe6ee9da489825c21727a6cb0c4c73ba7e83f1610e01a3e324d00c202ce3387411f4a789002f0440a080e8a868b74aa97dc1448ad38ef797220f180ebda59a307038c09baa0416b123c507ce9c918972942a22957645d96cc103b5085eb78dc20601c55b2ea9f31800710a85f65204941120062090f2826af4411424b99e5188f143b26c8b8a15a1eed398c049fb84c002078962f120e000765f31e700200080000aa90003c63c4895d27ef0dc2498e4d0699b1030a08292769a70e1011490ab365922253e0ec51a92c31f1b39a138468418f885f4ba030881c2d377239c0952b358d9b8e109002b0300a080fca09715344f2a0a2b25b8eff44181c60485bd4ed0d0f144da2e31e6a128542d80b9a803cc10abccf91da2e1031f09e114f8c4f0881b2fdbf2641800c9738223b83e584801701e2eddeed44c0ec74ab3126f7f1f9d0d171d209064a7abc074aba0bcf00000bb812b907eee823234d3ca5092084c23c2282341c000080340006c0800201900064d200194245000763385e0c0e859474e9b1c97efa508d5c0ff9a6ab6ef3877f4dd390202d963f8a6e11829a90dd388386000050d3c27bc004438c88c0c0c84fbf2237a8b8d8e8f11f067802313add93a7122cb17745f88201de0f3944a180c04a1bc103f724a1bea38208166105e10400d048000d5c800975901d0d09f86800515085992c4f857a38000245fe73d80295d6eed6484065b65d65ead6c064c3b2a3e6a861c23af31db91b396299e7c4f203824f50332e69072ebcbada43b98a0860af672afa0b7296ce41d5485006f139ed623629e945160c5f70800ab56c034bbab936a02b13c38464a29e30973a80fb93123108804f4242780213b010001d5100316720e45a07125001990913a3589c90c09c7600a3313801e0e17bc69e841387439aa1c1025b222e0801f8b1c18000382030e080128e0f804285105e9c30e050e3eec729942c10d234fcd08a048b0eb1e910c131ae2d236c7002fda4ce50140051ad5a9f02016286c6356500c88182602009b8480007608920ec48c6626c231220989084c4d40765eaaa48fc2c4367537fa70400017220d0ba20008a16100005dc000008c0f82c013080f804047c0763014a7fdf5988100d96c40a94308159e0b5370243192da9cba39c100005a5cd00d0acc9647e62008070dc965e1d40fa0e2052058065090000dd1134158520ac4cc462641313109f574ff5517293b87809e2ee777379565967bb52dab240fe4000000000000000000000000000000000000000000000000be700202420806659058c3084861864008058500401a22203e2000038edac16400e1b307b42c6e4bcad0c28308589792654090ec10e60e65061a9b5ec863b2c025869e829c0802fcb6752310027640c1381600007388408884c03425e0209e0100024010472902312800210c89718c4b4862582bf12e27a84c37c8acf02fc87b8e85c7356bc128c1f32cb86181c9a156eb232455810701851bc8f95b05e105f7048eaae7946cad2a6aeca323f83c5675b5d2a15a7cfb7f6688e3409eae2144efaca6b654497e4fb0a4a5f3eeaa27e33c99bf5050aca2acf4388978f994eca0c13bd74bb645de399d9846acb674b5a7376864c451ae9269faf43eb124304d58771413b398a3b9b5dab8de51e9bb75ca27338dc80bd616e804d58d895940a1a890f0c88ff5368507209ef0b3441f4796407a4a9022ad8eecada1f6ecb23)) <<< 16000) + 0xee4802dc45be97cc774dd2825678b7c53d7b067a8b909420627fce717b5c58d94b9932cbbf8db04216ecb60e0d0f5398d2025551c95021e7973c46db54ae0d5b2e5ee8ab0802a946164d695ca266cff118291bea6b53300521a46ebf53f5adf58a28ed2bf01a8a27b3a2cfba443e2b1d6df3b3f1cb6f5b08a3ffbbe0fe8187977b4a41d58c6845f418f63f2a2237ed3e7b1ab30af799459498900555966f95b1f500000000000000000214726f3b586a77551ac62368b187baf98c23f00c7101c2ec5840000000000000000084c0358bb87de137e26ea1febdac91c294fc7b4fa39e960fc000000000000000000000000000000000000000000000002f1c00808878868860268048080644e76234397794fedbc6f84e264639e99eacca2f447738b58b1ed64bd05fab2e05381b6708ad408ab542f76aff2cbe8a98d74266485ee79cc10bfb9042eb70442f86349b97cc97cbea7faf3b79e02208f9bbe3e5bcd830fb30ed0dd6e855df4566529be2de6f08914e78a498796943608fa4519d76ea8003df10cb1583284c47c070146810ae046139460c0891664c3a2e050dc570c1e5bab1d00530e691b175470e042aee7bd0ddaa0d04d058a7f281fc8606f56d354a49b502003f4bc275633b94ee1e7bcc4cb4803ad9948183405876197a816652bc1f6396174d5156cc985c02730f0e150000000000000000ec4a18d0c60d004604104a0030000d78bf4d4d510f47db0b1a871d9d1ef773e7d347dc63539036afe2901174db24ca0623473a00050c716b9a57c6240b40cc0301754b268980d188b5e07b68c024bfe1c660c1ac444f6e3ae952e1d867100891090c408204a00900201abe5f400c30d7d967f98829a2c645919ae3398286fc77ca2554701df5f4e73d079a5209efc62dddc32a48da2560a11e058950284a414000692409c842502a0008a5224e33d16560b074b62852ff76f9e6c70c2d010b8341c224df3582f4b06a74f45be60c122b7a337188001a50348571c02ae50ea78d4000c8824260200930284941413c020002082248631232989108c4843765d139923c2c42cb3eab6707bb43b324e080002e441a1744001142c20000bb80004c283e0101200188f80e0290b190503c4e8800228306ba58747040c0000f6c06102c086af3413f52a4483038db1126000019e8404e203e010ec32f502cca5783ec72c2e9aa2ad9930b804e61e1c2a0000000000000001d89431a21620c19c09808c09402134f7ef93abf3ff1f21513c6ec674c7f8879afa6dbffc7a3b97215b369628dc1cf235810951ea8001489c18d5eb5a77781035f4104f2e7818433dd18b0ba8b04144567e4b4020ff4b985eb180801e0f39741d20809b626d96a000d8a50312b45b20e10560708101f1daae48197f768581e2420e83502c40c1b60986862b2b16ec60ce77018b8611e8b104e2804642883e94040f80400005f888f04c4742400073e447054000fe2446c762343b0a41d88c8cc4603622e138960000b910e1976d979e8049df3734200a5464774702000177022071eae73836081e0044842e865131f0827315deb111108594f1c14c7841ce3c486b1811ce2bdff320003a1a6cc74f008fb5ecd7a70004c97dd9a3c8042501848c09dfaade2043f8196a5442e764b77a3c20000ea6018113be6e682a821000600004048001661d8db77bc87ef3b22db7ea3db6dfa8f80fa6d0ead574f016dced9ab9ad20bbd9d3a460aa0660180baa59344c068c45af03db460125ff0e33060d62227b71d74a970ec33880889280858618688159a18ed9a39b0667ddda7e2f4ee2ff61e4d1a79b4f80e7a9c0996a36e28fb4d2c4844cf159749dd001fc033b54d154aac2a4943d6610d4139ccab04b21a195e3c2159fc21338001c1625130019d81cd1900080021238104a7af4c102fcaf5bc4135d532638f0821e7875e4002000800006910001bd222c12000624222a1ba95ccdecd45829cf9aa9b7f45555a5d93408694570de3fe8cc884fc19c5751ada4109d865ea05994af07d8e585d35455b32617009cc3c38540000000000000003b38010126be1009c3640b41820822814003802f4585bf03efbc9991c3417aae3acab26438ee97912bd42ad64bc4886ad32e43d296df9034ec0632133a9dc44ac5c2891861a697c26095f5b2a72d1a09912ca2dfa56d822a28490a09702041a549c40b29c412cbc8704d673fc03462b68584e971914e590513a74c2448edb6ab171ef4c5bc70254736aef6ec07c8cab58ae4b6347a1e5618f00775139b7be4a3cbfa9a6fca64e90e196e07bcab442552120c555cf6b954c7276bf5d1824b8f634319be1270e1930d8764c0807f02125856c6949724041d00800006390003fe22281a1130100049291121588888c4403421e0b10e01c810001cea8220a55568d7cf06a378ed466802733a31e2402b38412681450c210147168e72a9a5c904481d5d17440251d00ac13a20218ff95864f001393eecb44804b638134e0c86082502054f055bde43e2470ab782b2c1c790441b53450503098d90a2c11151ea3f75002d25e025c48000003a980a3801200a38f065e6de878c007a6740a08d74a0b1678204c658ca7021537613d2801000400003f0d4f0a51c3be91c78ea19fa2e2c604e158864505023bac1d64010a51a6d415002f8d5ac9a48000003a980a3801200a38ef172a070f181190881aa20de4df6d504a804bc212000f804000033080012e10005032000cdc68baa642fa0208bd84719220142d503f3c0048e56d248083e010802008020000088c029b739821e00b94dbe4)) <<< 16000) + 0xd02f4bd4b646083a010d129699bc10594e34824083200800006c200024c4434340004c244304723046672830827946e1ac30221fa52bc80002de0ec4f012142443860006c9adc26041f00851042dfd28302986c1579a0a6d2c0a0104ccc88700014edb2bc25041d008000078101d09e840834a9388165388259790e09ace7f8068c56d0c09d2e3229cb20a274e984891db6d562e3de98b79004a8e6d5dedd80f91956b15c96c68f43cac31e00eea2736f7c94797f534df94c9d21c32dc0f7915a212a909062aae7b5caa6393b5fae8c225c7b1c100e1b824c0ada4f9940826c84d6408c20740200001404000f6488588842804000cc84424662100bc20de6ab1e421054954fb75b26080003a8e109026b529e75ea008b817940527000b3441c309400353460c12d138213010287060cf26d6630d12d001e951e282044cd54a988027ca8d641418305085fde1872e7e3bd6f26014a8f886e0880000060ae0428002601c618ae7e0788e0c075676e030e3e33cfc140871f0f5bd3091ce5b5365002000800007e10002ce3004010040830280000dc88384f08a9134d95601042bdabe83909820002bea8c090342ac13f76880289d59c27487001fdf94efb650028fc0d2d949e61c20a00b153c2c032a2591c78dcc6a3a490180eab98e87505011f189af841165928145e2c10406b5d529400ac1cd9bfc480000030570214001300e38e761f10d88210603614a867e3edb3281c278f2227820444105060000aaa156001e00400008d9a9e8be8c3b280c1f04b6b63024b3f9e5ea010dc6499c9000001d4c03805db37079580080031451b9800ea546021474a5514497becf54387220e8d40fd2354c80c0002aadba6001e00800008f10002642000ad8648033239348f4ad1ebe001a9a446023081b0080830480002c08003f591050dc146760238b0448bab0418246f948130001b0fcd9405b8a70a0025101d00808208840c1400023c40684420422000e54220222001f5321024209e010019ce90473502316800f70c802de491004507f9c83f82400d06c43f414014e46402b1d480731510325507e20c2bcb600802810759e680e811448bc0695490840c466cea01b21813f1bc961348505749c0d27540c1027133c84d880048dffc81351802f313d326f050111ccb1419a504005020cbbcba040105fc9542a0207a94f3b28760ea0ee62ea056999de04d6180ba0af195af5f95ff7b11b6886f815f8fc1d0e1b621f7284ccc0000000000000000106240a442b89c0b893450dadb201cdea893450db1b201cde9089481881480ca04003e98500cdf0bbec740fe961ada4e1d0ecceff70b29de7ba71e0c5af3ef198c5cfaf6e940c60994cf6851f0ad555c6f24fedc2d82b6ba2cf8a948b0c42914486e9e8d899ae7ba084a4883d8182968a17102e5f4aae420347855d4c503735b31e0906a37bea688080f848fe3000c41516080084e483e01000016020e44b0fb218388ec3e8561f21b0f801e0e7989013ca1f630e78a1428eaf379d24006ab545e280536a39d810085ce27f0004c303e010a2034d1c2998395754f5f287d821155838c1465656ca1470bb824820c0e3afbe0c005a8e3b8004e283e0100f7010000b690f61d8658cc3d4161e803d20957628596469dbb31920720c3902c58c3c6ebc00c0834fe678141024e30f5280145db95c0004e383e010b242257ce2a1cbb66903383b53f2b1912c8a85de5ac22dfe90383bb7edaf74c0cb184033c501d71bc18401f4a60de758404000a8fb8d2d3060005f5e147183505c07980800087881d02ec9023c2488b239f9b11c207c177dc64b1afa70e5128106fc916070534fa4f72800928db5c60113b4ba70028141e0085922a2ee73cb226d634fe1039dcf0f6b2c63f22aac67862583edc8a042a53a110e08d475179009c407c0201e60a00016b219c330f21901c8a8000d00878888001c688780ae470e2d70f458c4fe5ca3091b5d9ad5a0c2874019cc244186a8ff408303a87350300178797a80138a0f80403bc072391985c38246980a81c230a7c8cbdc0910797f9ac8a01df06b3c04018bc9f1200130c0f80400004bc8770c8290541da1a0ec090758283a80400066a4398e41d212000dcf21d0830e711f147ffa3b1908491110c104a86707101cb37dbb50440c62e7fc4fcdc7088f79900a6a8b0426313d924b0604bacae8af50c9024837ab4d50080051cfbe945e140050026a79a49564abe1270580688176c0d2fe0a2240ecc283027c82ecf638479b773e87000ca75b808003e483a6401026241f0085dbbddaa0d1b257f624defe3f4eb7179c08a92482154924109c3f1674e1f8b3a81db0a094eed3402de6c02804f340b42852051c2182000003c8a93bf2b932d728dd45c5e377c148d17acd0305d59f41e024e90b2b5ab1dfacc30757cf5638357e7808a49c2925e13f4000d14873148394641c8120e3050002749072310711681c4a41c21a0007c3322b36b35588814426d209429a484c3ec61473470b148345b568c10aa51254561020778ac964448073c277fd00600955b8293a0800ca093853c501004001417e112efb5225409c0700004804007d04857a0c338c61c0630df3106f04c374241b8030db01d8e997cd15c8e1213253717cf7438424e1456d8c081229a12f0bf8401c9c2bbae650c00dbdaca2f0228043ebf4c0b3a110f6b320790001614263d9314a4394150183085cb9a2e4248255ebe5b283a0a0704320326d2bb973000b0825c50001d3c7136400026242000864a7abc041a364aff2d5b82c26faff56658234bb)) <<< 16000) + 0x0e723b2d5a0da60c53f584e317fa71f308d03300c05d52c9a26034622d781eda30092ff87198306b1113db8eba54b87619c4033082832033000c040002ab3e60f2cfcef7d1a9f488ff58892a0d6b3050f689cc772dbf8aea350b10c09c62914947046e53e1f0da7e42288348de7325c4684bdfc95c1faf54fba2d87a44755916b7f58aacc605a261bd8ad5e7e5075cb9dba399e0a760d10e222868db17440c236142928b9f3400173480039190da158540ac29c561b2130d80584480e86891b3874841c63168876ebb185086f5f97fd2812b075731ea2014371f8e6601c1a72436285f0c18a62831d1f2806837d90371140539a8a16bc4000456271383d24012889442802800012390d74586b20c354f61a86b0d31d8690cc100561a213c3f167561f8b3a69248213492410a077692ef25d5ce4af8f4e1fc578bb23f7e8a1314102270d1c6b00000000000000000413801011e6c02804f340b43051412802401c00100010a34f9728daa35e1c9fc0749d75dfe4043ef6136e8324b6f2870314549f4b4605245eb42220498d793b823615b5108ce2df4c00352868253ce732e86806c33c074ccef026b0c05ed25de4bab9c95f1e9c3f8af17647efd1426282044e1a38d600000000000000000827002024481488571381681980602ea964d1301a3116bc0f6d180497fc38cc18358889edc75d2a5c3b0ce202923080820880200053e4efc1b94b0b89dcaac5a07cc573e9195d731f7034dee32a5e558498de05f7d5aef3875b8c52ff19a1743626bbb9fd8911cf5ff84523b983712595769b67441464b6b388e828ffdacb43dec48527c925b20019f3aa263ddfdebb9eae8095e2203d52d99a88d7b10133aa92f90030d27e3eee31ce936b7600ffa2439f834e7f5d70ed00c9997be21b2600700333d3426603562df1c2e44d83d7608a5ba3c6d2b7cd3769cc3518b0402e87d746c43e10d6b0a2d7e39632c110adc680e9af1a25c16d813be0007e827c62a18a17abb834c295cb54e6e3db46197211506bb27813716025718a53ef9377702f60fa8a788f7a0f6c65994b3e3b119a108370c0186d8976bf0808339238618352abf1a000046403c0100000ad38500619c9982ce2594d2010301ebe18039628be012060e00402d83419c130cd0985a82833016168020001452000f26432c861940be64147ac7fbf0fb6bc3b30975d84aa5eda3279535abb0000000000000000ee23194b5310d1d5b475f8102000000001f380101103300c05d52c9a26034622d781eda30092ff87198306b1113db8eba54b87619c4042872461410810c0000381048a8270dc8c2ce8ab1866a73a1591e1a0ecffaa586b6c77ec8c89e67c96882a55de23ab8c70450ec130280e44d3da9d90eee4a7b253140b74581802a457e037dcbcd0764b79accf9b1a638c10235f5294b4c6e9427e6ffa512ac0cf9c69036e3cfa70ac74eaac6084dbd2fa3881a8ddd6681b46af2c004e2838010a275e27eb8a1319fdc44d04fa878185049cb624c009050700200001964248541922be107a635c910e6bce660b004684b5c20038f978824081c008551402e97e44380443c11c1213d444380f4aa5b004072044b409420700200001dc6018c6df653432d36192805f015501005737f52812060d8040000310c418b571f980d486e5c506e34af2013101900400004c198d0bbef3cc08e80f301a08f7b20b3c00700278500a5a77a825081b00840200401000004443202409e13000150218e0a0c60100027a9c1c63b95cd11240aa4ecf11be96f54c04d955810c00b2c01782a1038008a18c9b9cb4889c485fd13010361daa9a00783cc7c90107402018c020000dc21241b0c50d06206c30c341841b0c10900013090009df20645a0c0110007da90bf1585f08f0a05879f4060603e66ed040c089f11a861c254fa5c300130bfd3812840f804209b6a826f041217f3e045822570d198808c313e9a4001cd22f20200113f6d04c083c0108020080200000888000ad9b2411bd3ab8e3044e98773441964ff8e408423b6908c00cb820b90404444b64c0260c1f00800009490af1101d00e8878d89561c3e8134fd240f42ce7a040e42d89500090607002000019a42f474178320a41505d8882e834172120b80505b8082ac04000b0a4008b6c81fa2e0645536e822130134706b01c30e08f386c8cf88204e0bec1545c48131df49b5881c0401bbe45dc0600571041d1794054cd84759480a03e059ae8da8a20e7052058bb77bb51b7b52e4d8f217a93fa771eef9c1198080681980602ea964d1301a3116bc0f6d180497fc38cc18358889edc75d2a5c3b0ce2019029c1961921901880000e999eca420db966ec2a8b156e1dda115ebd59b86b527bec500a922b13d075149ba3f8f2dbf3c1c50240c4ef350108718d21be8203106d18564808df0ac91182241b672c65a96be68d1041de5a318494ff3fd8b0c23d0e2a30032e8095c027101e008490721c8352231a45ae8258ca2343c90c24b00f9506020b727af004a203c0100000fb3038813061058c22c8223202915e038650b022647f0a1c6eac87a480016ea2604c103c0100b60905a8082d0040002c0412817e21ff2faaa7108d44890b434201637361813f772ab69310585043816d11e68b810c103eeb0efe6128c50096d93f7f5bb1004007fccfc491250880f3692902f859dc12be35c71c36064000125100065a2166430b21d8588af8d833e91b30289d2d3b1212202b05ca005f6c1de048183a01081c3e6401f2c6127c07a86183f8e926285abf5fb38d0c07ac8ac25041e008020)) <<< 16000) + 0x02e07121b6d48b183e1c41a2854fe0013890407cf85a34042bd6dfc003c7346cb0b040f002000048080012290b01101d88c2bc4415c120ad0501d02f8dc37a8e32851a2ae221221fa8007ca05a0b547e50127b1d7b1406ca519b800013120e8042852f88246c9137b1f5f528108036fac604ddefac740009080780201580a0000ee200046242ac04000c1242a87400216e41c8c41245a07125054868004cc085412c29c960642b08901d9021b92c1c02c2eede52d012bfea8d6c680c29084cca940698cbcfe3a17061e7ef1da0709381f47f8f0e30b706b82e6f9230e9d60102139893578758b5fb306b1ca99c20e35001da28f93a6db4cc1c4ba510cba1e2a285059de840d96ba0d453972fde62a02ec3b05ed0205a828329dd6e58397c820a410c838d84ee0234037636983e147170caf1c304387e2ceac3f1674d249042692482140ed61784ce95f816638c28628438278000012b263885486b7091d59b8a1ebc4989b88fa9fb09dc7f7d8bff2b680ef36cfbd73a31109866880c214c4559206bc863a143002e555e20608b7b8923096d5f8244a0c0698e239a00960693b24016640a9e30004dc54800a0307c021032b06058e3092bd3a951218732b91230671e368110107c2e57f2800f004029804124030a50100009910002cc2000b9a429046146130960984a84c2882711c962fbd658fbf65b0e280d6290ba0046203a010c231471eca3061de4e230c22965ec19201022a5dc800c41529e080af3402e0982074021a6031b9edd9850839405e98389365af1900c6821e7c48004001081218ce0dfa5100a0be41e70e1595150ca024bcd4cf44036f33b2aa2024e1129728807a8acf27380100040000558f140dd8cbf0c28919a32e9a4062932ca2880cddb69e383b218883030499f727b4c003e010e285a92c101a407d5dea5202103d6db02040ba2368c707119b3cc0609729565d440286f4a033800f804000053880014610004e921421a0006343c382dec7fa58ebfc0a349609c9520780830f67cc314025ed9d78100de9d3ee93020f0042892700f88e58e08668ea091c0758ec18a1751b8e183813877d0fe5829d0b1af498107c02000024a42802400a1204f0900014f104a01c8ad965ddf101d9b88fd2500632b3328402b7ed3e400048383c0100000d73d5d3fd545ca4ee1e0278bb9ddcde559659eed4b6ac903f90000000000000000000000000000000000000000000000002fbcd805009e68167c972dd87a605db6fd47c5b6fd47a43f79d91b1b6ef783e8512506384580080811497f0be7418c0781a79cc9f9ca4230b8cfb0307ee28c1f0f9c424a799f6a76ace999a5c7b44c4a033350f910fc44d4bc3c6b105d9662ea9447ef766be8a485a60fbd7612159410e770629588a909da47400151c84f8082780400208041ecc7c612e6d4a838a2316852470ebb20fa1081ad2e6fe790007c0200640309d0150c76c968b942164d52f6502237e36e020a9ddb63c3802659a2c0c011e9c89e201844501893820f0042482267a73640e200d80dc8112a5a04b940b503bdd6041888a8f8c4a083e0100000fa20004bc40ec3607403c288a8f3c9184058116ee305dbc3078030a10fd0908a00b504f1c08028df550e004c283e01000012c389a09fc7cbea93589a09fc7cbea93bb0858445d91cf7fb0858445d91cf803c000000008ebf02058868eadc463296a07de6c02804f340b3e4b96ec3d302d0920408504204a0102473473d8e1acd27900a8af6fb55db1900707c0c713447e305d010afcb6a1630611038217fd07e93a119618d3d22c963ccbd5b86efe35c211a471463d0d8a000848411c640f42a0461104e00826c041340200099d21323b0981de173fda0e968300f4db850c4e0b3114468808e7cc086a55bca2d6bdcb31480a923f67ef9ef24c984a00101fc4b57ec722ffc601135cc28fdf0e1cf9c3019eee51198a204c0880037a680cf1e47092718306e7400653902204e025c2612c1309509fa94f3b28760ea0ee62ea0567b87d524d3dc3ea929a9da281e0d82c7b16c2422c61c61840c22413800800007bc2b57f6374870d195b0c3dc039e60e19b8200649a1a858b4d79b3b889ff018dca22870ba48cd557812c985ded28a910c1441d7ce200d5021a9a30812b9241851cd4c1b61822fdf7b20c0068572ed1200adad4a00a4207c0218b5cd2be31205d61784ce95f8176dbf51f16dbf51e90fde7646c6dbbde0f99649c41a41a3163060ffc4b89ecfa0aaea58df9274a9ef732a598d0f1a43b816c922a487b6047918284a00800093c84984ec999e3b4d469064f07b185057c81431980064e8fba240107332381806567d90026081f008593461dc9d8d206c761348e1d6cb36d93411657343228306ed40d825081f00800007e10920d0001299b1c61dd340123e0010eca285348cca224884377676440c84ea1ae9800d3c4f182c00ae8167e804e283e0100001583032a99641c3c56d92a85058a26556e3081463899e312216b8caa21848ffa578e38017d04c04301cac38e5a00d0303e01000018521220b09005cce3f309074d945179f39e657d3f9f736e08b1ec7e54446fda7cf6356615ef328b2931200aab2cdf2b63ea000000000000000004221c51c41431031c2300240003953a584921a61ab4e3b75671b474e9e49acb3dc7487665497898a76020d2ee115e268219f5db9a4b8faa1c20c1fbfcc1f6372728ae49b860d0003cb2001b70400414483d98f8c3a6d68d4716919255414207bf0e7f2443a94c68c386ead423b094107c021d5d3fd545ca4ee1e0)) <<< 16000) + 0x278bb9ddcde559659eed4b6ac903f90000000000000000000000000000000000000000000000002fe2d734af8c4817585e133a57e05db6fd47c5b6fd47a43f79d91b1b6ef783e838c48a38a3867817d5a6ba4a12db04cdb01ee72cedafeb1f2e5473ac3a72f4a0a2c4c14cfd4b167b1466993aedea6a52377851420c1522486cbd79336d50157be5abf1edf36c92f03053d8680700d4ec69568a0a6e8fd00053120761303a01e133e96b469c1f1f0486c2033f2f8b6e305094e86885007f5ad8b0400fcaa7230098407c020000254423c27338fcc241d365145e7ce7995f4fe7dcdb822c7b1f95111bf69f3d8d59857bcca2ca4c4802aacb37cad8fa80000000000000000108f92e5bb0f4c0b3248143201141280024350b4a9fd9c8d06613551600a3bbe730d5b0bf6ff9cf96e166798ce467bc358f8451d9b9d956c70522dac734f9630db1ba79ab9953efac40f0e8ec880b4637365b86a7e25a8c8f07b6b4a8e105492f721ca4fbd765e7801463c8d6a000a00411c640f432046150470a82340411802000d6220646208b09001098108a45044a08220c410e5a086210028e821424008c944210c40102b640142410603a216603cd64f01415581a6244111014d0ddabd667080814d32481ff0e037ad77305900c00d69066e2c30a003f3d7243f52000a2000ad23130534040456e0a5121b32a33041c17a0e98580600821584086f0dcc92a54a082358879883802dd9d58e01310200044020040100760208001800026107f11c03004011004010044118a6f839c3400650fd97c4004201080000802000008880005c107e09000085107d0903e0480005c483d8ec1e8660f2230780d83b84c1d8070100e4bade6822c3ac8a0204c2e7bfc811880f00401d4160e803e30667db288c345f6020c121821da773211861000400e817c6654d848c67564b4d01d470048a26397583372d43e7c0c630cd2f1231c7f3085c6f8631d8ea9fd4d11703b5d258c90f0779725322a609e76451d278ee9f22dbb92c41c32798ccc5a5687476c7ae584e5be288375207bac9bccd874739240843ebb6cb190e16db880c311f1f6f25b0211ee4ed7550b929ab46b02a6dd71b5ace7ef967f5ddd3d4de6f6442b50b94ae086ae0486e8b86c8d3b8e555b7bf484bf126fd97526a470333d0f41faa539b012cbc6d9823d6ab1f066278952631676176e09a866671647c510d8dbcefe7333d714606e85f67ea2f0eb02dddcf7617bfe806b3dabc622d4a7800074120e62200083020e432071150380a81bc440dc0a06d050004cd106c3183590c1a8860d22306801e89f3fb77010214c42ca60044283c010a1e1269fa31a1004f1f7d14245a039404800dcae95c24081f0085909bd97b4307f6583d67016eab0213001c0044936e97838e38302ae82d08c1876cf7e32300210080000541067050000b8106605032828000a18c000040100c80206301031008184040c0020510100005010501d8278cc17c4609c1b04d0dc8261213242c05c0539b060243e60d010272653d485030740100bc0305d01e85b55faf08420640200961304a01f1fc29a67628311e2c52ca007ce31d1008c407802000014c40004d48238a8118440b8220450d02202810c140005844014b60b63b05a1d82c88f0903822c9e3c40bc134ca3c389982c98343453c75f328300e30780110251c2000840491250f3a70881d0d65050957375cd0811586cbb34001b2f2a3048056b9e5180026181f008709af9a2568d0896c58fd0a139347bbd008c407c0200b0020570180006a100021f20ac2b05511f1b09dc002ea2fbbcc1f0a3894bbd3370418fd3f094642ce8674155db35a56c98c7ea1e9fdf2927c0000000000000001e5a34e11d8e9816660c48c3027806806000076c4aac42e1468fd9ae657001ac5acbc340608e911d826f6fb8c87f8295f425367ff4daa3c4598ccf7780557a1f688a99be932eb3106d97f7850a114be0e1bcf79d84806164f572981958e7b124041d0084c61609f58e30dc0c61d2870cac32c879008a42f2361c123ecb4a04a083e0100000fb321614e64479e2881ef4383400cf7786e4000e119b9c28103e0080000d13f3e9f3ac25b2c67993e4cf6f4b12640fe3d8fca888dfb4f9ec6acc2bde6516526240155659be56c7d40000000000000000084e5322a9c2e605afc97b409de9c0b82079782adca83a14460ccee05857b181615ea0ea9c41c210182006a213d6d3c17b99d3f909ba2492dbd15513e102537c26bba0b9d87bc7eeb5a6a43fb32c18042646462e06ad1585c1a21f2ffb8ad9653b683801465c06aa975b949c056212dd42277972fd761d1d5e81a8a95d00057120a803d1d080e73d9a1a385c7011c20438830c8011107c77cd00fbc141a9404448277f0426141f00800009690531902902800277082880800377482816c13c9609c2304d11c4597a1077450851c5c2d1803dbec5d850121d73f40902078021435aa8fd0300098557504086e875908c20700200001387896cecad120007b4e0da38073f796f8400df179fe12040f0040130040001c2412c4609403c1be3355d01c10b6d2d321821318f0f0a006013ad29202cfbad1118022534d0000130f5cab8009c507c0200921200016c209013ec32f502cca5783ec72c2e9aa2ad9930b804e61e1c2a0000000000000001dc5853f645beff3a975f9fccef658c3458536c5362832cbc2b00000000000000000000000000000000000000000000000000c4bf25ed0277a702e081e5e0a99629208a09c016010020846ce5fabf77aa27924f987f12bb)) <<< 16000) + 0x442eb4293a2bc9e256b9fe210694a233e4c60a29f87dc841c7939fb1e75a2c61c4632e7c03cae282081f398d9129b882e842e4d8775543889413e403fbe4d72b6f80cd16f9e6c60a62384b2c42e0a95000624208e420461902286811004086020420100058210412d000e7790401d00124a1033050019099e28271f577244c9133554736d72e288018951260fd281289903e6fc8100d10e740805588007482ffd17bc3806d07540d3f61802c84b96373a2000800c69fef41ce848c954028b126a520f0b40d12fba8b5b8d786ff1214c2acc1572e533b71ddd5aca35000000000000000000000000000000000000000000000005ba82a125823f02db95074288c199dc0b0af6302c2bd41d893450dadb201cdea893450db1b201cde90890b18a0c50c90030023d606115d4f172fe4c1c28e9c4ce3d3448e460a5aa51eefbea7f289f878b39c841290253dedb8d47b0d3acc04413754b3fe8c436076d898343865112e233f0591f6c8115ae719bbca55ad6866fde7e94a0b1305ca32b69f5a0d04590120e18e202d07241e584693a38006f5ed340024181f00800006c903f1d81f0cc0f4360781bc7b1f95111bf69f3d8d59857bcca2ca4c4802aacb37cad8fa80000000000000000108d46f55e842c0bc82e595515f02c7b6d863b2dcbc0ad5a501fb50edd2f8942142c61861c130014043dd680a1ea21845470992f57d94ff4ebdb65036dc737ed8bae240bcbc18a6104b56baddc3d0c71f21864bb6319ad80e1ad7529bed2a8c6f985789dd78dae493a6f0e948032436b54c006c01100001004000011103b0581d00e030c3318c84106c021401c528af10007d144d000a9bc7dc26083800800009920720a00011230100100400001110380d00013d901a1900c8a80dc5406c02000704206a420340901980800399c8191c80c4a400a53030210178480b8140022d640b574058b202b4d0152680a4d4050320046b8201aa8c403df18e090491cc18e88c08723cf624c0141adbcf2a8528202df47226d700301d8ea0f75fb040150305f582d41102325a668a5082529bffac7a540dd1268c7844e06402b02c6b3fb93b6997d8b16be23a39fea369f5aba36fe06193eae1c0000000000000000084240838630640428228020080882e0463a0e9796dde9935fddc0848fd4abd6df40a9ec1c651d4062fb34a2cfb715b944f2eacc3985090b713c54bc53882ea68aaeb556b934f8c94f3c1cc76dead10da00000000000000000423f75869c162052f15acd65b2b2cdea4c7b4c2d5471e40af00000000000000000fced6b38cc15679e3412848c79a1e88c74a5de8cecca5a80000000000000003c32031c31832021414044171041e97291c6342aa5d6adc0772a7b6e6248e7ba3ce84b69d67326e75320615cfc19e7a4f2b350262de387c436200bbbb347e87414e9812cb8360621dc5a7262955d244422c010d6451c3d316e98a0f0d837caea04bbcfdbf3b79d794c5f960a000cca409c85c7bf6d00aa207143cc62040620305dbbdda8070e645df0cba18300000bb68010561be66b4420009024af13c4004a323ebeb0800b141c5cd5010454849a1300a2455f9b9565102c66d7b1ac700b8bb5dc028041065417054906084021c8a7fcb7cffd11e70de3695b396e6a7503f0b81f3f7fa00000000000000007a7e7393ba91125bf44ab0177357b5f73cf470a0689544000000000000000000000000000000000000000000002c11228a11409008e0920221476c8c2a84885a673db0226a19350ee4c39653617bb64df5fd895db3c486caaf64abb5899e6a995fef484ca10f1a5046779fdf90f11094e6550b3b358cb83a7aa31974349e8a333418708d70b9b0ca1a4b400151c8130ec094660481302309e186328b35c0597a28f0d45859200ed4eda860e119732ece58e6c566aa20104050fb7a48080017b98bab380120043090345efed25924a175296cc1c0a5737b5983029566bf708226b408ad8581067ab5ef4a0000002eda4e004601000016a38618a4a6b37165ee7d9de5018384896e9911639b5cb032c041028906846120800be09f4840002f56ba14e0048010c24117962499649285d4a5b307017d6548260c05f3f8688208e2e38f13160419ead7bd28000000bb693801180400005a880017b10220981084c0800603e03c30ab4371c20c2c279e6b0f4b2f260f7de10c1c22ffd6a70b1cde4bfcabc9040005062e07000002bb2619c10900218481dc06b4b2c925fee64cc60e044760e242087b0d02700c080b66dc112c0824a1df645000000176d09c108c0200002d840782603a03d34852a94e781a030c8004de54be840c280000eeb5043a34805601acabb29cc208785b1b5f0712830000b2993d17c104102ec37770982000000851f113167104001901e34a04c05f49e9961185246638ef90ddc0d2019b0a1afff77c186863817a13024e1c1066b639f4e4db820a284dd257112d0c03e0b84b272472058000002cae5ea80f42408003505000011d901c05e9a64cf901e0698035109cde619a2a3aafb06940002c5dd0690118e20e5c6106f160782640000018796e4e0848010ec32f502cca5783ec72c2e9aa2ad9930b804e61e1c2a0000000000000001d89a51851a41a38618209801601804010068000be900030b2034120007c4203612000b182034320191500c0a805c040023c44058040031524006b0c80a98800913480a22804d040247a0113500818803cb401c4a00d210060e802c640142a0091100406801c0400c020027b7200ada004550018a8008440020200001010c569)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 41 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase15" = "QuadFullFiveCase15" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 41 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase15 private def zz2227:"s08b3"="s08b3":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase16 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l17 l25 l27 l29 l30 l31 l33 l35 l37 l5 l51 l6 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2748009db, -0x59682c120,0x225b5926,0x2ee0], ![-0x59682c120, -0x28b2e55829,0x10a2bf6bb8, -0x5b6da371a], ![0x225b5926,0x10a2bf6bb8, -0x2c0d06a5f3,0x9500b3a28], ![0x2ee0, -0x5b6da371a,0x9500b3a28, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xf5f81f4,l6),(-0x98a0e1c3,l5),(0x2c6ebc8fd,l8),(0x2676da0a,l11),(-0x73e81884,l10),(-0x3bda0e18,l17),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x726c50c,l25),(0x952e2495,l31),(-0xadee510,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x954e63c3,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x2c6ebc8fd,l8),(-0x954e63c3,l63),(0x952e2495,l31),(-0x73e81884,l10),(-0x98a0e1c3,l5),(0x2676da0a,l11),(-0x3bda0e18,l17),(-0xf5f81f4,l6),(-0xadee510,l30),(-0x726c50c,l25)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1c3182103029710060001d8a84605c801800000004f00b200c000000221e029804000000000f0148020001284c12016801800000001e009200c0001bc1d804e180a00551241600b9004000000006c0124018000000002406200800003502200a18080001a01040098c05000000c8160386018000006c0900c300c00000034120318040000000005018802000000000b00a4010000f85221036400c1ea29c4381eda00a0ec142204064900504204304603a4802800000005500a200c00000571880598060000000029038802000000001580c4010000000000d0320040000001e0e05180400000000f4028803000000000e81c4010000000007c06200800000002280510060000000021038802000000001180c4010000000000903200400000001a80510060000000019038802000000000d80c401510284110018d401800b81403802ea0080000000098024803000000088580c6010000000003805200800000000e00490060000000012014802], #[![-3, 42, -47, 0]]⟩ def dynamicCode : Nat := ((((0x40fd68c67b51237f6ef844a40d7deea4e99220ed5aae7a3820b8c9b430c09a54ff4d630075d1b83da4e10440108230254c4a5103c1fc03ade246bd32da4f440c871354924604051fc65c12053e4f5a7f20033229b1d6b3841180400005b881602e474cb5cdc24838efbef56b2507187fac623228e28ff5bed00d2041751615da84066ac4509b78a000000119401005493aa8b8a5320309c040056020001d6205413819d1dd2a19c061a9fe0c0ed809150e6d6e8dd89106de0b6d498711435db0a6d061138195b3ca09080e52529a2870804951eeff4300a335e2a36511609182801800010298102e788aec81443abc875c1080e8bddbe64718379f14ca4b8604e9692dc32141435cbe5e20400d94a23ec70c0198e7e6749104a40e1300a0000708f0c6937924f8e15091748801023574619ba302513dc184c2042fe1d56702084a404601000011b37199877cd26ce610e2fc88fadcc08b1f730d9130000000000000006d0d00190a18c08608c00a0080034d11c88fcdd1474146ec2687607b0b4d0ec02ca5f5977133b6fafcfa82fa7240f2c491439500027120522202809013828098050306d5f118af04385b3adc016e5e0c117158ac3aa9c2842e5da2967da1000b9765008468380d7c7df563ee0a005cbb4ee54342172dc33e476cb01a95805e653e8e205c060922a31b0b06eb4e50c71124beb2c341852dd79421382492203c0cd59f78784109e7b74cf48b03843fc4c9d1d863082264398c626920a08da3f8fd414d440084b32663e5ab301120062080922182931e3021856a58614e77461012649941db104842973f67e0208cbb6b4448e141204afce15007002621be56af08063908b1bb401000492e551e9e1480150120000838c0fae7297d6142a70566fe648b09cb43a90a22156d084858437e963488c08ed569dfe2805648457e9382110040000594c0a1a7c73e85518c2c4bd756a284a4082113243356008270a3ca72f9f04044db5d9c49300c11095e8149c401844b17dc4ca6a0a0a8f24364faf0100c58ca6acb9851012005c070c2a51833eadebc08249015bea33cf0e18931be328618081863e5a342e428c119023737566006126043a7cbf7d041129ebf0bd9840a09cbcab16824c0200341bad093a05c409003003c000124981ccb92fc35942b21ae1d2e245369ac63822882b6eba170b080fb6765b901565e6b1771401b0f8532e4e084601000016c2000c447884e87ec7715c2861b76622e48a206aad7d59ba663042939fc03d2a2040f1c1b495a810542e28d8c6502823f7050386c218047c577742c800035e6b71d5e1342400b00b004a0202401c0a6f72f56571dd185764e1e594aed9020f385f58fd428413420c31a43f0038625ab8f0f34e61823837ea28960e0410c6d39eebf200504af9a3d5165182011dc7224fb2409ab0480188223462ae14960c5dc824632f9d810830f71c6ebebe5069a581243100c7f612398e1c35c786ac0d74720c3368a8a7f8a730240016825c3128c00c006601f78e412400002960e9fed688e11809003405048c291b4fe66ac1c699e898ba9f60c31cfc3a256064714319cb64d01028ad0ca9d8c8941c336050dc8a180a18d55f408b26060004fb4325cfa00002221b2b16df309002d03000011600040004c6343c3547b553285ba3bd7d1a48ac57297dcc50c0e34654484105a4618341c011b56d2744c084601000013d200111c4002bd0800ba49c34b998bcdb0c19dcc46b640a09557547530e00000017700c0601fb0bdc0a000000177008d840900100460200015c20442b021158100ac07c5603c2b01d1180e06e00318dd15c8a07a80df6e820228e1a6540a20119410804006c05019476005684051c97b08d96082d73c8503820ae8b0ff82011fe27e2204a1844010b0894723e76baad49faba3ff913b173) <<< 16000) + 0x315f9d092d0edca3f51d6a3c47afd9eb053bc2c0e2c04367e1a4734123d0405a15260be74aed9c0da7d95476f3bf14a13bd7b6dfe3bad7fc591c9646e64dded910fc0ac1c67dfe056388e7e080b1417e480046be7a428b6b1a9d90014d8d4ee2b18d77378aacbfc08292dbdf4a41944941bb7651e3bd4b3e7a0103ad15cb49c07574cb4104360473673dd162d1322d876275eb54f6a79202d01e59e492418c101ddc4d35fa3e967ae4cfece6123054efc9f855eb6a603b17a39062cb8af90ab7bd01442782003396c123b81f8e390c3585420000e1e40582602a130140980984c048176596782173b16306ff081c39622577052779605c02bf9cc9202120042c64d2abce1962f4a5fe7f070062331a00c608420100000aa344c5e6c7eaa50871cba5618e00af4e5d7611841100400002bc80d02c064160300390fbc9a5a5ccb25fe10d7270760990c88ce82c508de1861c7ef30e080437ddb6c10b55bf0b7530ef7117bb39dce98560f57603efd1802325d1c66f82f01286f3816c400d624a14a21f7ee2c77f68ba0006e4a4f91d507b0078e8d08c4ee30a8c0aea27aef436af7b1981235aacfe37396d51c3e4f059f19b2d3062414222dc778135b50ebd61c7a476f50e1a6fd554601709720a4237f52ba418c729c000272980b84f79df8202001c3e132c00316eedc0e003f0d6e88201a95a82c60a24a3842010000110202e120008f1300c010044020040118604bef7041847252c33e28144f350d4118410004000029c80007210160980a84c050260261301205c103a4e11d8180285188ebc0032de28bfb028811921180400002f48001311001429303c21b37f6dbfa86dde001fa7251916357a65dadd197ad0d09000000000000000000441c74709c4a1645832723fe0d13e00000000009090901584a12ed76c096f503ca7ed436e9d79430658991720000000000000000000000000000000000000000000000005f176d9791a144f4de00000055030c70060050014539b434bb9e686864c4481febcb51246d2444138c1fa4b67714cab1ee0ab62f1646af8991f67fd1327e03066c42cd1925b8128612b399fb432b32a61c489596414525ab6a52afc2e4f30802919989a39c0b4870ebf00f0e6f3778eee268f5f1284b7de3bea0169358b10db0a16dbb35404404000ed04007260801c2318163b59d22ec2037a2426239460c5d532e2e61822dfefe03c0404022deffa80412a5c1d0e385003b74579240c0263f68a52d290104c0288159d217b247040699383044241831af852c65c8c1000004f1a0040423f5bd1ba60823efd1448c4200869bf53a6e000001a5e020e7ee3b7505b1c20a40700003de605dc375799ab91517d861224074665bec5a6df3d29867fc60cd7bef3877a0a3ddf60b58c10affe77fd556794d8f16a1401c520c51f9e5a4adf2b6c1805286846b58711d796f5f010008fdaa0d42b560c2b3d38bc73a53e4833cd69b0688dfc3d671a8cb9c214c321431ec3ebc76285f0a8528b440a0096ec528a0a0b95d3e70a000036be4b100051cb2e8000007ca0aaa27002300850c7aa9ef6422c5000003a98142c04cc91c58b100ebebe81c504a498416580c100000afc814015034fa25080000001d4c16000940300003546452cfdd9a704a5081329ee41fc0912858f28934d8e20000022ca400c20331aa9bda0482a9fc7a835c0100383199b16003d48cf39a0af8e08560480001d62000a4040021f080808c03c3601c1bc1c5d76a8fd01030000046500382c4f15d6c7460643bee9d73060086aa1ece00806278c04a3a00039016f824141165790e9f09238e1380c00006f880100a91158109ad9ca3074f3882b29ea0f75f320485db572cbe031096811d3e07c3980c425a0411af92b20138c016b371429b5d405a0e18610a0080060289cc65442ee9e5ebe36d1c9ede58bbf063d00ab2a4509d84c756ed24a813b5107e0ea59e8182755f62ecbe4d43c5bf1bb5caa41a059591626df29731000b74d3a680004cdf12604230c2200850d032f18cc30aef1a07be3013e823b100801732b6fe9204100042871ae9adca2075ad51c20246a7b583841c23b613447182190c06302000561ed1a980080021c739c7fe5491232148fbae0461a09af5f5a8384721dea6353000001e313a1604051d19e306009806662854700250140000bd181427e60ae00c3d3be0a0d85083055dc782c10b2a13f586047b45a45b2003da25cf2d98108802000026e4001040800280100d1180606c02c370201d6b0910881848f6b3c30a106d76c0160a0085e632a1860043d5328a8400070315948004d7ac0c002884e304801000a050000c910007b820016ba70cb7f9009ea18425d342a5e0c14d360f6ad050800001d4c0200000002ee00c004f39bec1acc104a010823139849894f440c1325c48b56624400000124f8010220c2efe7496871000000493e0040406c360e16f408000172da8725e438016810208ab712887307c10304e02a406468c910000002dc6c004084a5e4997bbdd1c4000000b71b001200000055d4a80080022d893bc10f3f41c00c40b00003aa608624eddab6f081c1c82b8b23f1c53b438fee18c41000000cb2002035195410c61470e925cffd8ae18300000724200408d98e19032e140519539e84149c9042a02000010790005d020121b0080980384f8e8e138942c8b064e47fc1a27c0000000001208a28a18c08a08808a00604b33d06ddc1584f6c2ac1bb811e92e6cbad8278862e30b61fd0001b6200c0a00501002008002610801968008b400202000010011f89)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 18 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase16" = "QuadFullFiveCase16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 18 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase16 private def zz2228:"s08b4"="s08b4":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l16 l17 l20 l21 l22 l23 l25 l27 l29 l30 l31 l33 l35 l37 l5 l51 l57 l58 l59 l6 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x8dbe6995, -0x59682c120, -0x192f04434,0x27e9814a8], ![-0x59682c120, -0x2353d4b00d,0xfd26642cc, -0x5d3525d92], ![-0x192f04434,0xfd26642cc, -0x2c0d06a5f3,0x9500b3a28], ![0x27e9814a8, -0x5d3525d92,0x9500b3a28, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xf5f81f4,l6),(-0x98a0e1c3,l5),(0x2c6ebc8fd,l8),(0x2676da0a,l11),(-0x73e81884,l10),(0x8ac8b2852,l13),(-0x37784d30,l17),(-0xaeb4afe,l16),(0x26e6a4c8,l21),(-0x6f231594,l20),(-0x8f254e5,l23),(0x1321166f1,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x15f042958,l25),(0x6f4e4af9,l31),(-0x7fddbdc0,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x14acdd2ab,l57),(-0x2021d38c,l59),(0x242e74c6,l58),(-0xab81ca5b,l63),(0xfd01fb2c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x8ac8b2852,l13),(-0x14acdd2ab,l57),(0x2c6ebc8fd,l8),(-0x15f042958,l25),(-0xab81ca5b,l63),(0xfd01fb2c,l64),(0x6f4e4af9,l31),(0x1321166f1,l22),(-0x7fddbdc0,l30),(-0x73e81884,l10),(-0x98a0e1c3,l5),(-0x6f231594,l20),(0x26e6a4c8,l21),(0x2676da0a,l11),(-0x37784d30,l17),(-0x2021d38c,l59),(0x242e74c6,l58),(-0xf5f81f4,l6),(-0x8f254e5,l23),(-0xaeb4afe,l16)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0xf02105003c401000000841400f0c040000000005c0620080000000000c0c8010430708a1019440140000000001c0c80100000003c28063008000000000f01880200000000a85033004000000290a024c020000000a824053008000000b0e0c0d001000042865024c3014000000002d02c802000000561e009300c0000158390084c0400000004c3806300800a71101202610040028c4404809440100000002b06038c02002bc4404809840100000011050024c0300114310a00224010000000019002c8030000000065013200c000000019c02c8030000000004c0620080004a0902c03d0030001382c0a01f400c000000009003c80300204510e402f4010008715c3303bd004000128560a00e400c0000002617018c020000000000903200400001c4510120c04000000005500a200c0000000029038802000000000ac06200800641181801ed0040000005221036300c00661444100e50040000000000d032004006a13c19006d004000000822102c300c0000094110208c04000000004700b200c000000000b018802000000000840b200800000000f4028803000000000740e2008000000001f018802000000621102c300c004d0841200c900400134230480324011440a104400635006029828826012d4014005c0a01c01750040000000026009200c0000001109018c0200000000038052008000000110b018c02000000001c009200c0000000012014802,0xc40e20080000000033018802000000000110320058a10f0610116d00661451433c085b4018000001a8ac050c030000000685405300800001b45b01a0c040000006e2d014300c0001962940920c05000050881024c30140000014884050c03000006915c068301000018e2840920c050000006e29034300c00001544501b0c040000006629034300c004c0d41d032100402542102200c94014000013090503d002000000028180f30080000000f07028c02000000008830330040000002106024c02000000004500a200c0000009030024c03000c82407009340100000002205014c02000000000840e200800000000230188020000a4320a03f400c0000820ac0c18c050408718c200f14014000000290602cc0281c71820804ed40180e11962280441005000000000140720080000000161c0cc0100000009c180e30080000001a0503cc02038c6206201794014000000002902c8020000000057013200c000000982c054c03000000005c00b200c000000017404c803000164662b023400c000000017c02c803001583308c04b4010000000000d01c8020000000011027200c000000004c0bc80300000000024072009c9186042011b5006000000004d00a200c0000000027018802000000068180f3008000000002503880203085508200f140140000000002c0c8010000006a0a01b300c00000000b404c80300000000014062008003c0841a0271004,0x6e1100b300c00001a8110050c0400006804100263014000001902c070c030000006c0900c300c0000000009018802000000064240730080000001a09018c02000000008870330040002b0883406d003029820831024640159f1470a4014990066945042d807a6401800014e2040920c05001504d0dc04a40100a812a1a4042900502984886d00ca4015270cf04a01a4900600148490d8025401000591203202550040014c3208803940100002b1307007500302b049861018a40140a60ce11c034900500170490c40ca40100000000016014802000000b83900b300c000002e8e804cc03000000005d00a200c0000002f06038c02000000be3900b300c000000002d038802000000000bc0620080000000003c0c8010000000847c0a3008000000001d02480200000811d4086301000000208ec088c030530820e402bb40168f2051c50216d0060001588239036400c15520e39c0f6d0050530808e101924014000000003902c8020000000077013200c0a40c610c0749005000124820c026400c000000231e01cc0200000891d4046301000000228f4050c0300010c760c034400c00000208e40d0c03000000863b014300c12c1c23040649005000009120406c301000861081101ad004001843c0580894010000001d850044c03001845109803940100c514a1300349005000000c84100b300c000003290804cc03000000006500a200c000003390402cc03,0xc0cb0890c0a5c4018000632912c0b9003000000005f013200c0000014884058c030000004a0900b300c000000110f014c020000000003c0520080000120110058c04000094260900b400c000000007802480300000250740c63010000000003c034803000000000901d200c000000005003c803000000001c00b200c000000007003c803000000000c00f200c00000000190388020000000006c06200800000d42701b0c04000000003500a200c000001609c04cc030000000584405300800000000b00248030000000036009200c00001a8210058c04], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x69968cc5ef34e2ca56690049a58fd67727938928cf0dd7258259b3ca524b00662b0a6b4c0046010d31283115181c5ccc0765ea34b094c7bdbc692dcc2f7cd4b04110050421c04defa9fa398008c020000276436417e60b3a3c17ed9c637322759db18628530f763e185a1ac61953e9a484792ef0739a3afd5f59b649a07fddc30ed00000011940523821400c0360040003a074ba6ea8e93b861c503d21a77d434e253800f2f1bde613b1fc5e130242c9298be3464f8163a05e34d53bf0e1470b79058f2040084f9d2528d8120a2030b40c00003f270afef5fafa0a834968dc887805d34865308edb5e32c8e732db5d1182885503e0120f0286357f2da2ca81c095b6c5f3bb8112851979d548ac0e20580580001e620502b0271581308ec98c25d15b077861066e08a3f4b8cc1cb082dd3b0ca943a583f72b4e402472b84abb6541050a5596c9291e8091445d252f2f6e0c0149fdc4271000450a444101781a00008508190cc35c67838322d200988143b0aef3b9cca1430103a9c836b141551c020779f180871406ede81920a93f756d5ec8c08c56e080e1c060042d96e885d00010944f4d6a32a2a841525058050b273b79e8774c803082c354fabaf124c1cf15ab4aaedef28754c7d0062980091cd740137fa57028532dcadb4710801048fc3f9f25ea81802d6aa5338fc0010142e3220a0c8100000466400120cfa17240f3269b25e052b205683256c227175457336b641522472852052031c3180140055103f96c5f69e32fad94770dec43ff901d503de574c9bc023ff34c6b7307716680010e10d619e11a8ea8a051d13ed9ecea9abd81aca07e50027d80cc839b25ca181792b054c6149106106084001015145033cc271363740853f76850f6c944580035ce76298fdd286258421b18a0b9d18e21c69a0004dc68889fd222fcc02034861e38732b8c1d13eabb96d3450c574c0447c082823be38f654be0402aa46e8ff470220ad0ab26940802215ba6e094802b637267b6c96d031e168160000890c0cc21d09ecfa7be7969f16b8070a1e016e3e0da98159180a3e45086a56670c7a96f63bb42cb604093b62fcad3f7acd36629d0f82047d9ebd37cd7b46e9113a1b0110100bbce6a347dddaa9f39418e2509c2f7cc2ec822538c148f0b832784a2b415345405c0e800019c1a182a0ee9fbcd8181518cb00129922026babce39266c304714e57ac0390c00e29ce0fd032140a8d08477b238200a9f58feb445814035fd5a54f0500028b0f27442f03400010c90d52d86a12834c341a4130d10506800b85adfcc0d4118262922af2f0a10deca8261c80030466e0363004524d3b571403b0f31c4b08915377d8b203559510b45235299326b31212806029805850ae8777486b901c0aa129ccd3870d66131607c203067180f6081a7242045a238d01e081015e9fbe32ac601e25a1e82408200002a80ee57f110d83956edbc489442090b40b122442c2528fa26408bbafd660ea30a1804f0b1f6b9a20607bce2e5549060869c7181384a38071900038663809177ff5d610b0141cc405c0609124d681bb469568f01a5da37a565aa2046728dd65ec02b18fcd655cab38ec0a0c02bc73192541039186031ab71746183048c5a2d731438ab34055e9c7692840c746f212bd97fdca30879575cacb2015c0ae78912cd89adce1dcf25bb6050219c11a4e6014eb5bfb6ca40e42880003682000a904001e4c86794f636c9ebfa497481a1d24ba40d102412882872442042432031c00c0570180200dc2919f4c4cb860f46c0723f92c611aa2e39a161136ee278a0a040a8980b4e3001c507791e0c0002a61b5b4e004a010c2a96ec25b4e60f0fe39a01e2c628985c5448a20edb6ffd1c50c362060b2258436bdfb578081000003a5d9800691820e8a800250080000d4994609dc7af9d4f277b6387a5be80c19bba49531d1a3aa0ca40000000000000000084259058a50a406584404204503800010068660080006a8c898ea0747a589db74e5d8af3277011c5f8a356083e352c5f50000000000000000010c4a304ee3d7cea793bdb1c3d2df4060cddd24a98e8d1d50652000000000000000004221862842442032811407e856080b00680015210007c0219c130cd09ec6d93d7f492e90343a497481a20483580191221021219018a08e0060285c400401ba58221253814e9853cf648b2921183ee2c824849916391271c38195983002498ae6ed16310b7e13c04414082b6dc7c3ef0c00798f0330ab060008ba14bc5456a400b0091853f8e01fc59b307bfdf213182e58d29af1647140a15c3dc45113610208a89a6a4e21430bf573a41a868200000b663f0c000425a81f9be440015810000077cd93668861410a1644711cf3bc7238e000008cbb016337c9f7cbcde58b52da337c2e142d00df7ad09038619c63b919c101000001194002046abd38a80c4848015010033004000444432c07a5b03df87f18d2276961a61a6103ddeeb8823470282b7e071838b4b650f2cb040b437625038015fb697eb1000105848b1d0004a010d2f1e4d4ddc4d22440851180d1cc8216390cc1f97f13b2bca18037c8846c9146e3c67ad8b09cbf84e5b4e0400001d2ec1041010d1fc2900240080000e89c299e9df36398410000008cbb0307a8175c50569831ad5f629c20b1bff2b4b10ac50bff959859562041807aa17e31a18000011940080827e1fbfc8f22400a4070194) <<< 16000) + 0x020002183c600974a7742c1a5c03e723cfd01a46889837a51818410be8f1505e1839303a9aea4c16082a2c750b3816000c60fabda08e006a1653d5140800080dd30503d42400b0091a5a49695ffeaa4221a442dd560f714b771a3980748e15516b7183ef73c2cacc6dbb9636f73afe7074ae194301c8b55f9da0d39228d98e79046a8c91c08000037a93fc9182081ea49503b28aa7a1202400e015000053070a7acd01f35610400000232ec0c1ecc20eaa25a60c5aee8b22a82c6fa5263980b142fd292e804588100897b59d8c68600000465002022acb1a07e3c89002901c0650080008608003831000ce920026e040e81600295c7636c9ebfa497481a1d24ba40d102412472032021c2101180080ffd3709dcd2277a20c9671e50e19e8c787f1f4fb7e7730fce10d827db2417a30d67f8f0a1d7e0ffea117846181243b688c5b0a16ad1aa770e9dc910f80379af234080402e3a666024020407db72d639f840045aad9e948c02000c43d6ab6a5a79920060068a202b60efa083fd6450f5469be28e0bf0a2846737e84dbd4f3b1220935e1db77ba82860c116adfce4dd9ba302000005b480e60c0c10935d18e1b6de49400faec4cd7b200eb20c1d000720a800025c323522e639243e18600000c5c97040869803eecc8c90f3413466e220a1026288dc09d082ca5c3006d204828e088c0f750a000000057e400a000000057e40b49002b0200648080008ac80038290c8050638283181618a020009222188120c30506100830404004ec24300d617e6b0be3585e96c2f0b61764b0ba2185c90c2e0860822b80f49830f7e2c20360adde8308397372bd1c000b3fe9ac2003100a82e25042200805b82e0380e405da8b080893a21b0c2528469c6420449723526180085bc5b7430121afde4f000d903efed82708220080000b39e148d3c0eeb10204deccf3650238bf50914204188c250a94006e9ea5f91801168f265004c1846010000140216c230b50583000ec813ff7ee2c40e0a5d4556c80c14ace0ef101418ae830124042300860c0f9358ef86103125d001082985d1dc1a4020d2544a40b000ec4f9f30600e24438272c084600800013b2168130b305dc4cf4bc883b1c9d533b899e9790c58aaebfce099226ce207da0911033db09601f77a4ef62ae4205c7b39cf236000000000000000004221c62021422801800c00800fb7d857099476867c2b8a59e498fe1e5eae49a81f0dd903ce32163c3c9444099b477da4971ca0600b9c21a4cf0683254dd707d4fdff5f8f3b88769a14000fc485908c11036000d2a42c486160430af218570ec2b4761583b0441d0558e82a876152230a80905384c29805c506429b5cfffe6db3f5bd7117a1755ed85f5b59844b765514e9891ae05a72439430921cb692066e718fada1cf2fe4717dea03cfc6b92dc4018febf5bc10813c737532f7bd71011638ec9624f63ca261fbe1a04da9cf5ea3e0c4073ef24086f62dc431e2f92145aa829042377fc9fff01eb4a373b58e6609a2434080257ced87fccc4bac2f735d42ce2cceb164c8fde1acfadd9fbfc9f52c2520295123b94662b33c68e8d74555333a3d2c7b3c46537425394fcd9131b17e701213970fc8391e5e64abf80d249784e683e998dc6817cefcc9073b0cc144929883a1650ac83a17369426b1bb596a408033eae08081122ffb0aa0800099d1af0004c3044010c2351d5140a3a27db3d9d5357b035940fbd0b92079934d92f0295902a7caa7a43fc9b0c3ed9d275cbf3f48882ad127696baaceed12d0d0000000000000000002325e3c48849b9dca4637a182a8688508680300280004e123345f9559275bdd29dd583de689e08b8ede8a94c945188f2274456aa39398e592bed16bd08103d807ee03ea27e904f545f32705f8604e7a0b4cfb0682e68a65f4343f64fbdda8c9621d400142880033310a52185210c28c861443b0a11d8500ec27c6613c1ba0927bccd0b37dfa77359017ea21769ec089846a3aa2814744fb67b3aa6af606b281f7d80cc839b25ca181792b054a1549247fb8d6ec4064941542432402001000005450f068c03f4ac41e82fbd9d39d04b060ea865fe6f17c7177db39c3ed4e99f8e7137010c19fb1fbb7cf1af4970a7585cdfd3219ae2d7a94701834274261381309b0984d04f8d84aa3032270604a72c0b0e0855dc48999c00bd3e7e8c090208c021c6f07f551ea710534ad9b41c0c347bacb840009e38d9f0c00bd0fc70a128411004000042ce995e691de8d17a9273398ea3658bfa9105834d40992cee529869003ee68711c925e62dfa37ec2622a538320d4424075ebc13668ec3f550b078dff9b72d0b3c5ba1d0b04159c58d4b8e526ad2586011818c764a2f2a86afb6a2ab5b88c620ab1e2d24853f1080502d6fdbaf14c35fef55a1b1dc6ff5379f7ffa103dc5f4ec7c5689e9a581ac81f120067be197384b9487e64a40cc027c00025a10991184c08c25c4612c2309509e1660d3e425983536e1427448c1d0822190400b738ce3aaa084848440100000eb21283b0931dc0439777342cdf7e9dcd6405fb49556bd02294c9a6db8f602e500214bfd88adcaed9065795db20cb6b9cb236508d0e14b14814600301d6c93c4eeff034ae6b71ec3416ce427d9bc021a8a21819141029259df9533560e9ee3db1507d06c2818cffd7e2985a1374000cd4d09d3893ca3bf38a669481bbd2dbcc486e7a397146aae10e2c32317525129abf489a1064cd00d004a30e30ddf35cd4c4c5cd03645b487a814b14027b8e2097f7a3d8a9a5521003c4e323f481200b08da118)) <<< 16000) + 0x2206c64194c20e59af03a32cd45ddf9c4bf219a60ba67be24520fd06a1d0fdf040828dfd7dd5798e4df86bbbb0a105fc3875c6b35651aaa2f5360d187a2951bf374bec791c8a08005c3714175ec4f8af53145c88304c0d08e518610eda1d09ef4352eb74b900eba17113bd42a1e8f24cfedc4c46406e72041330a2ecedd9985356eaf61eab41902017e615780cd48d020000e1c4004ba08490c8005d48d022f76475d004219bf3d0024ed717f961c1bf93a968c5d86939a88edb9ed59f05140063ca77d6491202a9b21388b376f4783004aed238eef323b286f7d0daca125c80805297152df81a83b29ff23a8f589bb2406b2433175104d1bf851703a650a112282001a5bbd783dae91e7397c137131fa6e85de18e2d04fca64545f470d697e8470405bf7c91ef8a7012f040a2a23c8b0000127482096c0f8070080100441019b4d662381dc2d654c001ca8883433002000440000401000004478e82d3608061b2bfc81028153b892591820f00400002808000ce1902d83cbca042183a01000005021222303c01d0820829dc8206d60e18c0022141f00840500401000004440002f48480ec23c7611c3b08d198460cc22c560fa1392428966adb06082bb4b5f808123eb51400083b261b74a0600149a6b7a80003e8af2965444098a08c021438422d32881450f2292dd43841d89886cc30802f62b9284144be69b8c544251c2300804502e8700992e2fe38420be9d8ec20b4a85671b2a2318e118040224040001a240f00400046042205602e22087110001ec90862984290821015430649e250440c1002eda60c212442d4e8506f48e416992043fa38c90a0032901100438347a7f2e42bcf9d7b16c95f15ffaeda657b07e2c51f521e7b1a4bc76f18e4712ba3e2eb3e7d2240e18920847744bd57c1ba3c2926e8d16c03c546984e702f35510684961ae3174786a186fcfa518070b02ccdd58d00342f4678d772afc4fcbcfa644c2090988b867645baa18890f9e52d8529de41315c9018100f2faed221f99ce3297d1e08e9cb8d5e6925d1b57e11fbec6596ab7b061c5c1acd6c4b0a2cc81179f7cf49a2cfc1590ec03303f56670577bdeb7859fbb0991cca9ebe43f9bf1dc4ba954502bfc8010511479801576299ba11a42af61a3e09053e209335284317cbd159fbe07300a07599420e9aa2c2ca0bb5ff321c352e230c8103457897a0280659180cb10094af38f6100251c2000800008590008a221064b0822584092c200760fe3b07e1583e84e48195fbb678c042870d305141242d187144022a13b2f700050c844769554040094f0880200f80a00013a20f612000bd1303838415c0a470c09785af0e30213b8085f5041cf34b677210006a862cbf05000027b25ea2130812804309003d60d261040711a29e2082ace4234ca3010e1b1a8732401de19b09204009120bc8c5260c2400849eb59c7f3dc2eb6aa72ec57993b808e2ecacfd8e4d97fb1580000000000000000010c8f6dd5f47c40b1e9ad5a022102cc920708208c045045020cba81e1130b4e971389fd755b7f95b1d54fdf09c1e8f8ddfc9e9f1d356243b553238f07718679939a23959f91ccf306639554000d94800263907a1583c8ac1e0560ee1b0760d83a8681d0340e61b0720d80a84c1c4260240a0700503782c001d5c800db510045ad3f2a9e90ff26c30fb6749d72fcfd2220ab449da5aeab3bb44b4340000000000000000008c6e7b523ad227c0dcc1d9f43fa46e49531113cca6e3e1fc740000000000000000000000000000000000000000000000003010c30c20818c00a00202a888a004c2704a4cbd8f09c281e853cefa7f8a8187d0b08e9b8d40cf0fab25a61c23405e959ebab038252d0e42bbdaf463ee1eba26517f4c96fbc710fabfd224b22809c341b8340da1a06c050358081a804000b084015d888044b598e536a1818a9da7e49d300a9d9bb76255818fe25f0b582a448a306384284184302282280060300401bc30ba097db0307247760f7050cdb2d7ee60e1169844c0118257692a006285dbaf273343000a521ba40200c27c6e280280c230080000cf10691183408c19c460cc230651183208c18c460c4239214db539df3527858ad858cf3899831891fb2a09de35c4d3f9b228206241ce59d2a5d16d942122431831420c2101100448604d834b64a01b212b3948dd56466bad450beec917a45defde122b35a3123c28b28041e158fb01fd86b7b7d4af73adf4b284952669f5d614fa5b3876794d6c495c48d90e1a75ede11c222eee914050a1b01268f0c268ae5f1d04054fa5b57704519480880200780200012c20c21201d09000288903a1103000f090a51a9e892344c85024090850439e18402b3be09eb20074b6cd434a0042010c24ed09f2f491c05640e4891a21cd10ccb10e34ab0309088edb607c805587c1888c00dc878500100628a3202800200080000c090530582902c1401604a0bc2de0e4bb00b29701ee108b20327945dcb13d835fbbe4002000802d80f0a2c921c14309173b75143059a3e7ea830481b413c82c1002d01510410167a11e980080021c7163650a74307b1f0d8d7a60a5f66867b0c04aedb2c071c005565b6f43001cdd38aec100002931d42700230080000b510002ae386312de7e45a24d8b28cb0117ba6f60061003ac37756e196305c85bfacb9cd168a291178c81601860d0000002cb41780060096eea8d9b5b5414019601d60cafc007a1208083504c00011f1a2ff1c7ac478adefa07df7a3742d6a5d281b74e4e6c3d7ead000000000000000000000000000000000)) <<< 16000) + 0x0000000000000000031a9816983c64bceac4c6be6e3fc05e26f19133fcaf312e8ed40000000000000000000000000000000000000000000000000c2448a584204200100080f3511634ec18380150003b420be020009ec20bc2303c01e0b64f55db475721c8c26d53f6ac890b14c386a6ff73a116958a0818d0d95cc568d21250445a68d3844e5660612b63c37155f9b12483736b16198348101602aaf9d1a53b2ab450104d460a0ac96b76c443e09003a06c61014c5f58e40a00cb86003091b53cb2a3866ff0e7fa505d5fdf9f0184769d041a482d62736566804d51acbf40010004000060481402c09c1604c0b03d05cc65f07e9e994ec266faeffdf141bf7cc2e2dc72b354441dc0000000000000000010928f4218462c0b42bc906f23902de35c4d3f9b228206241ce59d2a5d16d9421438a2453041442c09f134b968e403778ef13e26c9fb04177030db43e0dd254a33504e48bd3b91fa2b45e582d64292d068bb0ed9fbf0311b592910694ccc25b82be21faa0534282819d17cb0905de849430dadd3490d166b4034be30a1da97d0e08103a26ffe18002440788a6002100853357e999a22ecc9bbc7f864d4cf2703c7834dda4620a0f71648360a91e79e41430c29e09009e004060000401a0002cc4000ac0ee7b523ad227c0dcc1d9f43fa46e49531113cca6e3e1fc740000000000000000000000000000000000000000000000003009a69a49a31020819c01a00c0060200401a0004246041ae57eb677977ce2cfcfb90a5a0b9dc961f62905310c39605d3159ca55f88bd39c40c3da28857e7a33b5a8cce36c9a99f0564823b64a15eb49012ea9f714163ab9f00e0810e187d4b61bb17b8d6b758c7a4c509e0e001c601a8b2436ecb3d7bc7ce774731ad0aa1dc24ebd4027d2f368a621246f8153e0f17fc9af4fe05beccce73043e8bc38802bd2994e4a12460f894da67669145babaf76bbf282040a5b8c96b5461443c484da2840a2c348317a9f36c024122da0ec766433801e813c4749243401de5b2256d905e4a12106007800024e2000d3a41740400203c40c84783199acddc183faa40fce3044215428ca007fe56b41004315e4f118066994998cc083e0100270182e00c0980607a03f246ad6f84871e03f1dd309147424ed149000e73a69a4002000802d80e87a3310fb848207c0d06cc0396e593e0200714993024041f00800006799184537cada40e80a2c85148e4fead51040f9e0cfad3cc86061952558682368a0c0de1ebb20dd11a1007fc6e11e8cc380137644445e48068001b5f156bcef12a5410106608800022c20880b814032eaf4641150790abc50c2e3492225041fac307320010004012c07641d00a39b1618a97d68c94102e7a4ad820d6ea19d31a032c292d3040014ca5be33021000400004acd0c2edad2942c3057a301c14101cd7b8786042007fa9a0839a08fd5e280015e66694c004201004b01d9074028e6c5862a5f5a325040b9e92b6083ec623a64680cb0a4b4c100053296f8cc084001000012b200051472fdf3998a5fec4560000000023dee61210884b28918618514410904e00d014c060080340004708003049000a5020b40a000bf920042044124760b233046158240ae840dfe208eea070c000020f5801411c9e54ca6202042bd8ddbb1a041908000c45c090093b6b613050800684b010dd410064f020b60404503b782910638b48242a0207a1259719aab79c1b74e000a1f0b6c55bcaef2092181e7273000000000000000000000000000000000000000000000000000190840232fdf3998a5fec4560000000023dee6121088cb1481430c708608128d57c21bb7293b126fc16b60bd0f15b078950a84391894b6fe98e22ec9926be6481a820dc1c3d70b28bdf3e0043cf93bbb26b623f795dbec3418b4577d51d00392d8a15c1c6b6c0fed0fda1867da4d0ab0d3e9553030454a6fe420e13f3cd41051bce606f32faee8962820000040fe82fd86a05008eab4eace37eb1c2ca80be0abf3c6e95dc952428dd601961c4408c00013a103c0100039a105809022848110240013426c3516b6eb1450c000017702c10ad1ae054806332919830c1194b6b5ec9007f3e0fa31c03380e63395271022008694031a171328800d7af501a2a73ac5fb8510b7ccb0a4208ec051e02283ecce85f20a1a4720fcc49001eadf250500842010a66afd333445d993778ff0c9a99e4e0790210fc5e8e15dbb1d64d415230c3081442831431c130028030080200d000168365cd00c25a5cc58e342aba14808818c84d025a7a48434d19d8f2b0810c0f70087706000000124f8016025835f6227c4800000124f8006440415010000076c82b80800146482b06c154360a813c18f6e2c9491e8d01db85d260882988a33f6b5262cec4f18385fb95219f447914fb140e1041497081458356425408807ac66c23c9aeee69fe88e20224d2142d072ec98c3efb280dcdffe4da7fc8f42250c8d0384222c2fb917f7f4698b5e2588955ce08a219898cbe0fd3d329d84cdf5dffbe2837ef985c5b8e566a8883b800000000000000000213251636fb5a28c271a56582a460c608388306384402203c931db9174d1349606cb9cb4a23b73caa72b6570752b6dd2dbb1194ff966e5c3e31940ccec701a8edc51f82115381c1314aca0006b6414c260a4130510582802c13c17412d693070909efbafd44050d46053201359da1b9401e802de8800f5ebc613000e804013807cbec82842f00b4c65f07e9e994ec266faeffdf141bf7cc2e2dc72b354441dc00000000000000000109ac0c)) <<< 16000) + 0x0433c53032023013c00c09866724e803b84651ec292d8296ab8ea9cffe1b2cf73061779c732ca4003aa7983c696204f6aa0c094e475000305341b098ee5c80e61df1de4844cff72428027881d11202a6ee668800549fa1d3000e804013807e2b534e78610180032e288618d44c4671e08dbad6271e072a0be3b12821000400003fc8001231f24846c562142892e97393818d6487b05024840e59880095ef4c28e01dd4bf95040139ec8d8ce083e01098cbe0fd3d329d84cdf5dffbe2837ef985c5b8e566a8883b800000000000000000213251636fb5a28c271a56582a479e78c50878458468060030180001006f9f14d246e56feec8e81e7960388c1c1080e04d7a0406000004ceb51d8163c0386000035e38dc24153a818605489d148c7060991878417ecfc03e004622ef0584000001fc0d04961e0078036f93198ff4beba455863fbbf1d000901200002e320009e6408804000ce678eab82dfa8c38a0e14c80663c5011050d5638504d0e197f285000008ca0382353dc78841c00220d7bbf080000017700a00090021c76b205961381c50a6189b4681c12333f8cda004080000305701e0000006976d1c0089bd41dd61400000028488020000003ac64d9000500300001c53a6c2bfeeb658d2429552412e70200000ea60341140919c111c00000014820d004ecf97e984800000017709c00940200440200018d209a1204c090002a9981db028dde3848c4caca1208d57e138382094dd951202974305a3803c8e7294c003c01004b01f0981698ec040c7d230da9010349aac51c2113963623820e4c3bd0e02d0a2b4b860249f840827041f0080000a818127c410840c24a5f28f25024e933f18604b1b48e71a07119d18f2401a8299aa080305180c927081f0080000a8982776cb2a542101800001ec301810c07b8b14490081f78f98d50608d5ff3d1470408c7c5332489a016ce87e6dda865c1120f05f9c30a007000037e407424000bee4128040031a04007fe88248ec118460902390c31c07ebfc09044973c711884040000075300700cb8270ed80600915c83b380002e7db5ccab0102023d3b42905c4d8f13a6a1870a006008e2204601022808110040860200022420840a002986200c3e240e894006028103ef66d3871b0408245cf0ff3f646063b923f9de780505e9dc17cdf620404a7b94b3d4354401583a4f744f69502c71c2e17d224412217c569c108533c56e55f522cdc3181801e20417e9295a8897410307fbc87a4bf53181bf316ef0c12d01417b1468b16845c1013ab24feea67d52004ffecf18e72a00408372b856d1800545106cf6f389eb9a2191f34b32013a8d0290e60680980002722082330401501f8a80f80763c25d6aec122b9d024bb102a0c7f35b0e29c4c2b6a0e0bd40136a8e07e1d2b7b00130a100042632f83f4f4ca761337d77fef8a0dfbe61716e3959aa220ee00000000000000000084947a10c2316059ea68f6893429e0c5870882a661040c1044804000804f513b26bf02e338f3512e7d5e24f4b3f0429a207599e95322589c155daa69269721b9d0261443af16a4c9d5eb021ed785a2a610d42e6d8ad3975ac248b0840ac0a282e5bed230480b8415f700481840010c16543ec97101d9449b7b20201c0b004282a3e5bf74c021a209eb92820f804306e35d682d30511066dde20222ee72b524100ed23741412a6a661d25042000800007f903d01000114900031b2000dba40b86605a3301b198160ac0ac560342b01911d8e067f6fc203020f03184020830df29d3dc480057d758a638012020a0a4a8a0929412004284008640ff220407389b7a720302f283660242070573d031c20f714a59d08283c48c9b0101037727f0b44509c809002184076305929236b0d4436101a26fa8a88e1a392ded88e04b368c750c02e737b9c2a28cc40400100001392078020002ea202e120150900022a1a1d29f23d2c50b4a8f37bc144badfe9ff9211056b0e40408e757d476480022b06a810013b625f693821080428823c6dee27ca1def6dc035b285ed50caf4a46083094afdf310225e757dcf4d000acd0bc712000f47d975e8700a32de5f8a1400ca2c610b092410980600003d240ec0524046a8b224a1d7c2f9b8c688c1a0008e2422a9759bb8810049a28d0a027a5766ce2013acf14a5670421008590892d153b2c69947bdc80c2f5bdc86cca0c8a9461aa2863ed79c532800111bf140a0087b7cd9e700210085921605df38bba2890ff4db7bac29643a3b2994cc50b1a866d878863038c083bfb9f66f1c3171fa9cb56712005dcd657fd548006bf047ebfe03000adfeb148b0ca89002d03000011610003a32074120005313233236dbbbcc0d6b78d59a38607a82e372408f85d5bf060531a5c24994108402142d82e6dc38288de9da2e588006729613618003cc82da02000ce3adaf28011004248064466dac943e4f041fd84a178d41461322884d207459e202033b353c090006ada45d6470056157a5ee280669d4fcf0a4001280a00006b080016710390901c00800105c81b8ac0d8560362b0350d80d06c06427c2300b866f12810dc2b4f1510107655791a081160cd3a171c041c0fcfda0008fcd87bcc45419880900200302a0170100a80800063c81a0280cc14001e8e40745563411ec060351f88266194a04ab140e1835eb0136c2d0a103210433d6b90816ea299e9e8af9208aed48a3d0109008e07775fc57b1202288002ffd17ce208003003c58cb40724cd84123e1df81c0a10147fc5c510266e874fda482474f74f0070004bb4a918200c8b94)) <<< 16000) + 0xbf99c008c0200002d440c8160620b03001e0e7a98bb01204067b48a5082620953568904b0c907e410208fe77072c06bbf376acc0042010c1c907bfc7428bd283ce4c10458e6a918100842d7019e4002100800006a902f0581282e0100200801c0100001b900029b205c2b02d1580d8ac0b0460562301a1180c88e06048324ad5900e2ea42d0cb29737d6560c3950a1926392424d19f45b541364a1be04100cba4391445e2af0072189dafad7bf060435fe46820ac20c31d994fe63ea751d808286f6b998fbcc63b0341315efde76e4c040b55d4fe9076958eeb9bd5e1d24ec97264f0db265e35b0d4b3187c8a30fa2d0c12431d063b3dc0ab22258021c278f40d431db2268cab0c0ed6b58181fdd2a1620ec0b6ee0e32dd19fce4c6acfe8c03414a9225bbd7144e0c6e5b6c4fa825e88e582d2a28024e1006c0f0cf834f6eb5f50081a1098561a51482061270dae3125b114f0ff691ea4bdc79a336a808c62b08d000071640a84402e020160100a8080a404000f7a685b61217702649a6185002a1639721d752c23791a8a505a1211020f9eadd26e76aa1c13003332fe943f408108918ffc3670392400658b4cffa513020037027dec66f70e1003d845e0b31d8725140a49311240700b881c0d5677580d35f5050e1920e14ce16e7608084c698a8548374c0904443ffa870dc6e00204648739d509d0dc0b01ebff8218a7ce2e0a0292aaade70c9af282003af1a1d5c658dc02a7cc6bc6b11f1e669123e9010780e892018febf741948c67c094234ea71a861a9f1e721ecf22507da2fa457c10a21fc50b3d7e6dd773a59718e2392196c16ed8baa5fe3732138c474e5e42c29db10c79a00660c15ea17d7c0ef368ba1316c9954dc87c4a1544170b828047dad2b1df19f61cd74556babfbd73f26ffaa3819d0118892401a5bc83f0f7593038ccf109edcb0fd3af6148358c38cf0055b7a3f0b4994c0d48bf7901d84cebbd854d003e006789a83706869a8462ca56c404e3314690118bca8c511a43b5311c19a63b1ce2431695cfd418503b3c20ce012f697ae1201cac91f567041f0080000a810006f020501b0270d81302c09417e56b63f4a118325d6a6ee38269c96ab450045d0d9ac8003e010f2b1bfc342203aa0124f418329ad017e3820f4f75fe4001f00800006690240581182ec43a08eb2160d8046954700c9f1eba2809a3290d28083a008f2c1bd316e49ff41e5503b1cf0ac16228a977b516f22e045880f582fa05a6503080002c4511e9004106dd6880ed79e2810664a142515565802a3c53c5b1ef0a004f58fad7246f9fb00904330440001349022010001af9d241c107f0a1a45cf1e91cb2088916480144060de86b3ac908438dc1191c000002e3962400f3b7ddc0400305869e902808230080108080800400038e789a0e16500f18fa952bb180148f57ba6003c00801f0180f00e3db757d1f102dfeb30afc8bc0b22492833022421021012800400c040080340003d0ecc2b429da82afbd6fb29c16fd817cb5c19d57a1c2c0b68324f800000000000000000000000000000000000000000000000000000349cf2cc68b2f137dfa5c1db93e58b6170f7f1f6738fbccabfdc600000000000000000000000000000000000000000000000000000ce47b6eafa3e20599041019210609c0120269b80556b07443d5718b58da08861fd13e2e06b15a1f1b55f39372d8f38ce0fd1f49cdacecc586664e4737f37a48e904a721a7036266756fd28c4b60c19f87050005d7203a120007de203802000f4920032fe406c760342301911ec6d93d7f492e90343a497481a2048c2351d5140a3a27db3d9d5357b035940f90e31028c19611209008c082082a60600401b846a3aa2814744fb67b3aa6af606b281f11c6205145201181141041200180554c8c00803400048c80c08805c0402c020150100a008000cd4800fe990131d00904800bc2c8025e510051043439f4ecc151648060866b4bb9d44970c20cf79ddc31b6860433de89f4a51a14178d309712c480405136b42eaf07c0c06bc1a5ae59b2820024996676c0f3544510ca3d06064078e3c2ebfc3fb870e28029d718eab9018000001d4c00e18b73180a4b48c18000001d4c0080004b08929a484000369a982532851c40b00500220b01005d0d61bc4d0a491918fb9d8892283c945d611832850ced3240038c57a28c600a314ade4880065167b5f09c208c0213197c1fa7a653b099bebbff7c506fdf30b8b71cacd51107700000000000000000042373da91d6913e06e60ecfa1fd23724a98889e65371f0fe3a0000000000000000000000000000000000000000000000001808b2cb1ca1cb04c00900200b82008036cbe8e08b76fc3070000005dc02c722bd65f2662870000005dc00c200000e350c082006ede5e142c10135fed8bd2c003c16b85a32804280080000e190004f5324edfabf36be7b848e073735a56666942800000b71b00048a415da0f6ab199400000019bfcc0048009b3828546730e00000002dc6c0007d070c3202c0000f119243aa7824922480cb24c31c0822f8d994b962440c5b2076508109505a05d41c4000000bb8030c00000bb80142083cc08d60600316c7eeb400c881300200007a8807808002a548070ac034360181bc349dbce47c16308071f603fb20c1116da7bdd78284000000d2f0020800000d2f0030033a1e2cf5a08000d8e41f35000002b8c07f48000001194108b2e505402000020420162a000f002014520090900404801c1400c02005010008e71004310019480086400202000010067529)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullFiveCase17" = "QuadFullFiveCase17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullFiveCase17 private def zz2229:"s08b5"="s08b5":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase18 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) private def zz815:"s032f"="s032f":=by decide+kernel theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFiveCase18 private def zz2230:"s08b6"="s08b6":=by decide+kernel end section namespace Green24Proof.QuadFullFiveCase19 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1e8480 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz816:"s0330"="s0330":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullFiveCase19 private def zz2231:"s08b7"="s08b7":=by decide+kernel end section namespace Green24Proof.FullFiveRows open QuadraticCertificates ExpressionCertificates FullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decode [0x114e203dceb948005b8e08cfa01e2779ae5800193fa80ee6203e8a4807dbbe607a21389b48020e3e1f61fa201eeb5ca8002a4a6cae215a203dceb948003effbb5aa01a203dceb94800799da9d9e2201eeb5ca80398490ea07d203dceb948007f483fb921fd21ec2a001c896ba1ed203dceb9480149f84d9de14d203dceb94801081eab2865203dceb94802affc6b3de123bcdb2c005c0aeba9e07c203dceb948010d49283fe1fc203dceb948001b4e6fe921ec201eeb5ca8001c491c48e4201eeb5ca8005ccabf8de07825faf8403ca97e60203dceb948009ceafa3b614] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decode [0x115e603dceb94801689c8d0d614e601bede8807ba83d201e601eeb5ca8005c0f7b38e6603dceb948006bfbc87d607a65faf84803b8ffa1ea603dceb94800ba9fbea9201a603dceb94803391d1ebc22601eeb5ca8002b2e4dbd6563d84c002163d84c0021ff2779ae5800bcaedbdca1ef23bcdb2c02e99d3e601f201eeb5ca8008c7cfd2867203dceb948026e1d2a1e214b201eeb5ca8004cae8b23203dceb94802bf9de818e07e201eeb5ca800197e7b4a61fe201eeb5ca8003b498e88e1ee203dceb94800281a8b7f215e203dceb948001e6b3f2e214] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decode [0x11f8303dceb9480039afbc9ba0301eeb5ca807a96d5d27e3d84c0023e3d84c0021ffa03dceb94802ea1b9c5c61efa779ae5804de6d2b214fa2fd7c2801dd1bd9601fa01eeb5ca8005be8494d67a03dceb94802a98c496a201ba03dceb94801ccdc5863a2fd7c28004b7ead0b207ea01eeb5ca8004beb098961fea03dceb94800bfffdaffe1eea2fd7c28010c986826a03dceb94800bdedc8eb607aa03dceb948011d8d4fad62a03dceb948009b7fe96b2763d84c002363d84c00207e601eeb5ca800a88888aa214] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decode [0x11cf32fd7c28004beeaba732fd7c2800e8cb61cb301eeb5ca8004cae8b2335faf848001eae08a03e301eeb5ca803bebdefe1fe301eeb5ca8001b9b9cc861ee31389b48002ca92e215e301eeb5ca802fb2989e14e31389b480098ac7c26303dceb94801bd9bbc607a303dceb94803b8dae8a01a303dceb948039a3ef822303dceb948030edf28203d303dceb948007f483fb9617d303dceb948060bdf8c21dd301eeb5ca800180c3d3c6533d84c002133d84c0021fc303dceb94800488d6f38e4301eeb5ca80018eb7e6ce14] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decode [0x17b01eeb5ca8001c8df8e3b3d84c0021feb03dceb948001cdf6a2f21eeb2fd7c2803796b5ae6b5faf848052828dce07ab779ae58011e6a6a61fab3bcdb2c019defde22b03dceb9480019aabe2de773d84c002373d84c00216e75faf84802fd7f5e205e703dceb948008b0fa99da670ef3acd01a8a8af203a75faf84803b8ffa06a701eeb5ca8003bbb7d22703dceb948004cfaf92573d84c002173d84c00203f303dceb94800aeef0c9c606f303dceb948002fa94889a14] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decode [0x105e05faf848001cdeaa66003dceb94800f9ca217d01de6d9a07b92eace16d00ef3acd038fb89e21dd02fd7c28014f8e7fa1cd003dceb948007af8dc9ca50779ae58015a603c003dceb948001f796e4aa1fc05faf84806bf5c7ba1ec0779ae58001eea38e02c003dceb94800382c6b8d215c003dceb948019e1d0861cc003dceb948068c3f8ae05c003dceb948007f684fe4003dceb948021a27f3d84c0023f3d84c00203fb0bf5f0c02290baba06fb2fd7c28026c49bc605fb01eeb5ca800ecb8fb214] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decode [0x11ec801eeb5ca8050ffd7f615c803dceb948005bcfba1821cc803dceb948001e0de8fba05c817ebe18006a588b24803dceb948005dbfa86741ec2a002641ec2a002541ec2a002441ec2a00207f001eeb5ca8003cfd098c217f003dceb94801dcfca8bfe16f001eeb5ca8002b3dbb48a1cf003dceb948006ae82ad8205f001eeb5ca803dbf81fa701ec2a00203e001eeb5ca8001bde7a8a21fe03bcdb2c0408db2e21ee001eeb5ca8001c9d3be8215e0779ae58002cdaee18a1ce001eeb5ca80038ac0d68e14] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decode [0x107f809c4da801299ebfe17f803dceb94801eebd188ca02f801eeb5ca800383cbd18a1cf8779ae58002b1da9196781ec2a00203e803dceb948001f6eacc9e1fe85faf848061e1c0ba02e803dceb94803ddbfdc215e802fdbc900392b89e1ce803dceb948002ba9aeea205e803dceb948008cabede681ec2a00203d803dceb948001e0cdddd617d803dceb94800cb68688d616d8779ae58003c5eeeec202d803dceb948001cff2a4d61cd85faf848001e4e7cfae581ec2a00203c80ef3acd009f998961fc801eeb5ca8002809d8d8e14] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decode [0x107a13bcdb2c00aefb9a216a15faf848003ddb09da205a104e2ad8004e4f0f6211ec2a00203c103dceb948003aca28ef217c101eeb5ca8003f5d5adfe02c101eeb5ca8003b9b4cdd61dc103dceb948001f5f9ceea05c13bcdb2c01ff2bad24103dceb94801ef6038103dceb948005f5c6b7de178103dceb94802dd681d21681779ae58001d0a887aa158103dceb948004a1cbeafe058101eeb5ca8001c1fac3d2011389b480019e7c1ec2a0026c1ec2a0025c1ec2a0024c1ec2a00214] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decode [0x105c903dceb948003c0e0b1d2491ec2a002178903dceb948009e1eaaaea158901eeb5ca800697aaf6a6058903dceb948007e7d1fdbe091ec2a00216f503dceb948029aceecad615f503dceb948015b88ea9b67501eeb5ca801293e2e1a215b503dceb948012d4f38f863503dceb94802db5d580e2551ec2a002151ec2a00207e10ef3acd01ffbdbee17e103dceb94800ce0aeb3f616e103dceb94800df4f2abf21de103dceb9480018f92d3ca1ce101eeb5ca801d8f87aa05e10bf5f0c00b8c83ee611ec2a00214] def rowsChunk10:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1019d05faf8a030dbbcca1d3bcdb2c003c1c8ffca03e901f4928061f68617e95faf848077e5cfaa16e903dceb94800aa4b58fde02e903dceb94801395dfa215e902b196c00181fefa1ce903dceb94800495f0dae66901eeb5ca800fb603a903dceb948007aba0f0de17a9779ae58022b6d0ca02a9779ae58001e694c3ee15a91de6d9a00295f4da05a903dceb948001dbfec6b229779ae58007d607c9779ae58055aebf8e17c9779ae58070d7e7e616c90bf5f0c03cd0ddc61dc903dceb948001c5a78cda1cc93bcdb2c005b19fe614] def rowsChunk11:List (ℚ × Label):=PackedPhaseRowsData.decode [0x1089403e8a4020101010001020100089203dceb94801dc2fbdbbe089001eeb5ca8008e2ade2088c5faf848002b0b4fa088a03dceb948009abcea2088f0102088803dceb948005f8aaf88a088702fdbc900ab9888208843bcdb2c036ab9fb6088302fdbc900ab98882088001eeb5ca8001e7e182a67d1ec2a0023d1ec2a00216dd779ae580039df3efce02dd05faf8a038ecfaae14dd03dceb94800daddbbde25d1de6d9a00289c2e1fe029d03dceb94801dc3d3d1ea12] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 ++ rowsChunk10 ++ rowsChunk11 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadFullFiveCase0.base QuadFullFiveCase0.hinges QuadFullFiveCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase0.base QuadFullFiveCase0.hinges QuadFullFiveCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadFullFiveCase1.base QuadFullFiveCase1.hinges QuadFullFiveCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel private def zz817:"s0331"="s0331":=by decide+kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase1.base QuadFullFiveCase1.hinges QuadFullFiveCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r58,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadFullFiveCase2.base QuadFullFiveCase2.hinges QuadFullFiveCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase2.base QuadFullFiveCase2.hinges QuadFullFiveCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadFullFiveCase3.base QuadFullFiveCase3.hinges QuadFullFiveCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel private def zz818:"s0332"="s0332":=by decide+kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase3.base QuadFullFiveCase3.hinges QuadFullFiveCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadFullFiveCase4.base QuadFullFiveCase4.hinges QuadFullFiveCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase4.base QuadFullFiveCase4.hinges QuadFullFiveCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadFullFiveCase5.base QuadFullFiveCase5.hinges QuadFullFiveCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel private def zz819:"s0333"="s0333":=by decide+kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase5.base QuadFullFiveCase5.hinges QuadFullFiveCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadFullFiveCase6.base QuadFullFiveCase6.hinges QuadFullFiveCase6.normalizationDenominator theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase6.base QuadFullFiveCase6.hinges QuadFullFiveCase6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r30,RewriteAtoms.r61,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadFullFiveCase7.base QuadFullFiveCase7.hinges QuadFullFiveCase7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel private def zz820:"s0334"="s0334":=by decide+kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase7.base QuadFullFiveCase7.hinges QuadFullFiveCase7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadFullFiveCase8.base QuadFullFiveCase8.hinges QuadFullFiveCase8.normalizationDenominator theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase8.base QuadFullFiveCase8.hinges QuadFullFiveCase8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadFullFiveCase9.base QuadFullFiveCase9.hinges QuadFullFiveCase9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel private def zz821:"s0335"="s0335":=by decide+kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase9.base QuadFullFiveCase9.hinges QuadFullFiveCase9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r59,RewriteAtoms.r20,RewriteAtoms.r81,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r4,RewriteAtoms.r63,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadFullFiveCase10.base QuadFullFiveCase10.hinges QuadFullFiveCase10.normalizationDenominator theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase10.base QuadFullFiveCase10.hinges QuadFullFiveCase10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r20,RewriteAtoms.r81,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadFullFiveCase11.base QuadFullFiveCase11.hinges QuadFullFiveCase11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel private def zz822:"s0336"="s0336":=by decide+kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase11.base QuadFullFiveCase11.hinges QuadFullFiveCase11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadFullFiveCase12.base QuadFullFiveCase12.hinges QuadFullFiveCase12.normalizationDenominator theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase12.base QuadFullFiveCase12.hinges QuadFullFiveCase12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadFullFiveCase13.base QuadFullFiveCase13.hinges QuadFullFiveCase13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel private def zz823:"s0337"="s0337":=by decide+kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase13.base QuadFullFiveCase13.hinges QuadFullFiveCase13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadFullFiveCase14.base QuadFullFiveCase14.hinges QuadFullFiveCase14.normalizationDenominator theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase14.base QuadFullFiveCase14.hinges QuadFullFiveCase14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadFullFiveCase15.base QuadFullFiveCase15.hinges QuadFullFiveCase15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel private def zz824:"s0338"="s0338":=by decide+kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase15.base QuadFullFiveCase15.hinges QuadFullFiveCase15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadFullFiveCase16.base QuadFullFiveCase16.hinges QuadFullFiveCase16.normalizationDenominator theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase16.base QuadFullFiveCase16.hinges QuadFullFiveCase16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r67,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadFullFiveCase17.base QuadFullFiveCase17.hinges QuadFullFiveCase17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel private def zz825:"s0339"="s0339":=by decide+kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase17.base QuadFullFiveCase17.hinges QuadFullFiveCase17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadFullFiveCase18.base QuadFullFiveCase18.hinges QuadFullFiveCase18.normalizationDenominator theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase18.base QuadFullFiveCase18.hinges QuadFullFiveCase18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadFullFiveCase19.base QuadFullFiveCase19.hinges QuadFullFiveCase19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel private def zz826:"s033a"="s033a":=by decide+kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadFullFiveCase19.base QuadFullFiveCase19.hinges QuadFullFiveCase19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullFiveCase19.nonnegative x hx def pair20:Expression:=pairSlack (5) (1 / 0x186a0) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair20Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_20_base LocalFullFivePairs.compact_fullFive_pair_20_hinges theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalFullFivePairs.fullFive_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_20_base LocalFullFivePairs.compact_fullFive_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalFullFivePairs.fullFive_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=pairSlack (5) (1 / 0x186a0) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair21Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_21_base LocalFullFivePairs.compact_fullFive_pair_21_hinges private def zz827:"s033b"="s033b":=by decide+kernel theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalFullFivePairs.fullFive_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_21_base LocalFullFivePairs.compact_fullFive_pair_21_hinges x theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalFullFivePairs.fullFive_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=pairSlack (5) (1 / 0x186a0) rows 0 1 false def pair22Rewrites:Rewrites:=[] def pair22Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_22_base LocalFullFivePairs.compact_fullFive_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel private def zz828:"s033c"="s033c":=by decide+kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalFullFivePairs.fullFive_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_22_base LocalFullFivePairs.compact_fullFive_pair_22_hinges x theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalFullFivePairs.fullFive_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=pairSlack (5) (1 / 0x186a0) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53] def pair23Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_23_base LocalFullFivePairs.compact_fullFive_pair_23_hinges theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalFullFivePairs.fullFive_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_23_base LocalFullFivePairs.compact_fullFive_pair_23_hinges x private def zz829:"s033d"="s033d":=by decide+kernel theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalFullFivePairs.fullFive_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=pairSlack (5) (1 / 0x186a0) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r69] def pair24Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_24_base LocalFullFivePairs.compact_fullFive_pair_24_hinges theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalFullFivePairs.fullFive_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_24_base LocalFullFivePairs.compact_fullFive_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalFullFivePairs.fullFive_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=pairSlack (5) (1 / 0x186a0) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28] def pair25Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_25_base LocalFullFivePairs.compact_fullFive_pair_25_hinges private def zz830:"s033e"="s033e":=by decide+kernel theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalFullFivePairs.fullFive_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_25_base LocalFullFivePairs.compact_fullFive_pair_25_hinges x theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalFullFivePairs.fullFive_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=pairSlack (5) (1 / 0x186a0) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r47] def pair26Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_26_base LocalFullFivePairs.compact_fullFive_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel private def zz831:"s033f"="s033f":=by decide+kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalFullFivePairs.fullFive_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_26_base LocalFullFivePairs.compact_fullFive_pair_26_hinges x theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalFullFivePairs.fullFive_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=pairSlack (5) (1 / 0x186a0) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2] def pair27Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_27_base LocalFullFivePairs.compact_fullFive_pair_27_hinges theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalFullFivePairs.fullFive_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_27_base LocalFullFivePairs.compact_fullFive_pair_27_hinges x private def zz832:"s0340"="s0340":=by decide+kernel theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalFullFivePairs.fullFive_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=pairSlack (5) (1 / 0x186a0) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_28_base LocalFullFivePairs.compact_fullFive_pair_28_hinges theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalFullFivePairs.fullFive_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_28_base LocalFullFivePairs.compact_fullFive_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalFullFivePairs.fullFive_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=pairSlack (5) (1 / 0x186a0) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_29_base LocalFullFivePairs.compact_fullFive_pair_29_hinges private def zz833:"s0341"="s0341":=by decide+kernel theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalFullFivePairs.fullFive_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_29_base LocalFullFivePairs.compact_fullFive_pair_29_hinges x theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalFullFivePairs.fullFive_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=pairSlack (5) (1 / 0x186a0) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2] def pair30Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_30_base LocalFullFivePairs.compact_fullFive_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel private def zz834:"s0342"="s0342":=by decide+kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalFullFivePairs.fullFive_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_30_base LocalFullFivePairs.compact_fullFive_pair_30_hinges x theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalFullFivePairs.fullFive_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=pairSlack (5) (1 / 0x186a0) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r70,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28] def pair31Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_31_base LocalFullFivePairs.compact_fullFive_pair_31_hinges theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalFullFivePairs.fullFive_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_31_base LocalFullFivePairs.compact_fullFive_pair_31_hinges x private def zz835:"s0343"="s0343":=by decide+kernel theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalFullFivePairs.fullFive_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=pairSlack (5) (1 / 0x186a0) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_32_base LocalFullFivePairs.compact_fullFive_pair_32_hinges theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalFullFivePairs.fullFive_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_32_base LocalFullFivePairs.compact_fullFive_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalFullFivePairs.fullFive_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=pairSlack (5) (1 / 0x186a0) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r70,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_33_base LocalFullFivePairs.compact_fullFive_pair_33_hinges private def zz836:"s0344"="s0344":=by decide+kernel theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalFullFivePairs.fullFive_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_33_base LocalFullFivePairs.compact_fullFive_pair_33_hinges x theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalFullFivePairs.fullFive_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=pairSlack (5) (1 / 0x186a0) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair34Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_34_base LocalFullFivePairs.compact_fullFive_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel private def zz837:"s0345"="s0345":=by decide+kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalFullFivePairs.fullFive_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_34_base LocalFullFivePairs.compact_fullFive_pair_34_hinges x theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalFullFivePairs.fullFive_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=pairSlack (5) (1 / 0x186a0) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair35Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_35_base LocalFullFivePairs.compact_fullFive_pair_35_hinges theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalFullFivePairs.fullFive_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_35_base LocalFullFivePairs.compact_fullFive_pair_35_hinges x private def zz838:"s0346"="s0346":=by decide+kernel theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalFullFivePairs.fullFive_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=pairSlack (5) (1 / 0x186a0) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r18] def pair36Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_36_base LocalFullFivePairs.compact_fullFive_pair_36_hinges theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalFullFivePairs.fullFive_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_36_base LocalFullFivePairs.compact_fullFive_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalFullFivePairs.fullFive_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=pairSlack (5) (1 / 0x186a0) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2] def pair37Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_37_base LocalFullFivePairs.compact_fullFive_pair_37_hinges private def zz839:"s0347"="s0347":=by decide+kernel theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalFullFivePairs.fullFive_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_37_base LocalFullFivePairs.compact_fullFive_pair_37_hinges x theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalFullFivePairs.fullFive_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=pairSlack (5) (1 / 0x186a0) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_38_base LocalFullFivePairs.compact_fullFive_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel private def zz840:"s0348"="s0348":=by decide+kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalFullFivePairs.fullFive_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_38_base LocalFullFivePairs.compact_fullFive_pair_38_hinges x theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalFullFivePairs.fullFive_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=pairSlack (5) (1 / 0x186a0) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalFullFivePairs.compact_fullFive_pair_39_base LocalFullFivePairs.compact_fullFive_pair_39_hinges theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalFullFivePairs.fullFive_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullFivePairs.compact_fullFive_pair_39_base LocalFullFivePairs.compact_fullFive_pair_39_hinges x private def zz841:"s0349"="s0349":=by decide+kernel theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalFullFivePairs.fullFive_pair_39_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack (5) (1 / 0x186a0) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.FullFiveRows private def zz2232:"s08b8"="s08b8":=by decide+kernel end section namespace Green24Proof.FullFiveCyclic open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseSymmetry FullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack FullFiveRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullFiveRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse FullFiveRows.rows p q same x] exact FullFiveRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) private def zz842:"s034a"="s034a":=by decide+kernel theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack 5 (1 / 0x186a0) FullFiveRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullFiveRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap 5 (1 / 0x186a0) FullFiveRows.rows p q same x] exact FullFiveRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible FullFiveRows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials FullFiveRows.rows theorem remaining_rows_count:remainingRows.length = 11:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (1 / 0x61a8:ℝ) * mass g ^ 2 ≤ weightedAggregate 5 h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack FullFiveRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack 5 (1 / 0x186a0) FullFiveRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum,stripPotentials_sound 5 h4 h3 h5 g FullFiveRows.rows rows_admissible] at hs norm_num at hs change (1 / 0x61a8:ℝ) * mass g ^ 2 ≤ weightedAggregate 5 h4 h3 g (stripPotentials FullFiveRows.rows) + 4 * deficit g linarith end Green24Proof.FullFiveCyclic private def zz2233:"s08b9"="s08b9":=by decide+kernel end section namespace Green24Proof.FullFiveMass open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseAggregation PhaseMassRows PhaseColourRows private def zz843:"s034b"="s034b":=by decide+kernel theorem remainingRows_eq:FullFiveCyclic.remainingRows = [ ((0xe7c2093 / 0x1dcd6500), .balance 0 (1)), ((0xa72201 / 0x5f5e10), .balance 1 (-1)), ((0x36567db / 0x7735940), .balance 2 (1)), ((0xa72201 / 0x5f5e10), .balance 3 (-1)), ((0x2f855e05 / 0x3b9aca00), .child 0), (1, .heightChild 1), ((0x957391 / 0x3b9aca00), .grandchild 0), ((0x260d3d / 0xbebc200), .grandchild 2), ((0x8c4b71 / 0x1dcd6500), .ordered 0), ((0xec2f76df / 0x3b9aca00), .massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)), ((1 / 0xf424), .normalization)]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff PackedPhaseRowsEquality.labelEq PackedPhaseRowsEquality.labelEq_iff _ _).mp decide +kernel noncomputable def balanceMass {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := (((0xe7c2093 / 0x1dcd6500):ℝ) * phaseTotal h4 g 0 + ((-0xa72201 / 0x5f5e10):ℝ) * phaseTotal h4 g 1 + ((0x36567db / 0x7735940):ℝ) * phaseTotal h4 g 2 + ((-0xa72201 / 0x5f5e10):ℝ) * phaseTotal h4 g 3) * ((phaseTotal h4 g 0 + phaseTotal h4 g 2) - (5:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) noncomputable def meanBalance {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := (((0x1c11bfff / 0x3b9aca00):ℝ) * (phaseTotal h4 g 0 + phaseTotal h4 g 2) + ((-0xa72201 / 0x5f5e10):ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) * ((phaseTotal h4 g 0 + phaseTotal h4 g 2) - (5:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) theorem weighted_remaining_eq {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) : weightedAggregate 5 h4 h3 g FullFiveCyclic.remainingRows = balanceMass h4 g + ((0x2f855e05 / 0x3b9aca00):ℝ) * rowAggregate 5 h4 h3 g (.child 0) + (1:ℝ) * rowAggregate 5 h4 h3 g (.heightChild 1) + ((0x957391 / 0x3b9aca00):ℝ) * rowAggregate 5 h4 h3 g (.grandchild 0) + ((0x260d3d / 0xbebc200):ℝ) * rowAggregate 5 h4 h3 g (.grandchild 2) + ((0x8c4b71 / 0x1dcd6500):ℝ) * rowAggregate 5 h4 h3 g (.ordered 0) + ((0xec2f76df / 0x3b9aca00):ℝ) * rowAggregate 5 h4 h3 g (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)) + ((1 / 0xf424):ℝ) * mass g ^ 2:=by rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_balance,rowAggregate_normalization] norm_num unfold balanceMass ring theorem balanceMass_le_mean {q:ℕ} [NeZero q] (h4:4 ∣ q) (_h3:3 ∣ q) (g:ZMod q → ℝ) (_hU:0 ≤ (phaseTotal h4 g 0 + phaseTotal h4 g 2)) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (_hodd:phaseTotal h4 g 3 ≤ phaseTotal h4 g 1) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (5:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) : balanceMass h4 g ≤ meanBalance h4 g:=by have hp:=mul_nonpos_of_nonneg_of_nonpos (sub_nonneg.mpr heven) (sub_nonpos.mpr hhigh) unfold balanceMass meanBalance nlinarith noncomputable def massPolynomial (U V:ℝ):ℝ := ((-0x1c11623f / 0xee6b2800):ℝ) * U ^ 2 + ((0x9cad453 / 0x9896800):ℝ) * U * V + ((-0xa721e3 / 0x4c4b40):ℝ) * V ^ 2 theorem massPolynomial_lower_bound {U V:ℝ} (hV:0 ≤ V) (hlow:(4:ℝ) * V ≤ U) (hhigh:U ≤ (5:ℝ) * V) : ((27 / 0x1e848):ℝ) * V ^ 2 ≤ massPolynomial U V:=by have hp:=mul_nonneg (sub_nonneg.mpr hlow) (sub_nonneg.mpr hhigh) have hl:=mul_nonneg hV (sub_nonneg.mpr hlow) have hh:=mul_nonneg hV (sub_nonneg.mpr hhigh) unfold massPolynomial nlinarith private def zz844:"s034c"="s034c":=by decide+kernel theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hodd:phaseTotal h4 g 3 ≤ phaseTotal h4 g 1) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (5:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hchild:rowAggregate 5 h4 h3 g (.child 0) ≤ 0) (hheight:rowAggregate 5 h4 h3 g (.heightChild 1) ≤ 0) (hg0:rowAggregate 5 h4 h3 g (.grandchild 0) ≤ 0) (hg2:rowAggregate 5 h4 h3 g (.grandchild 2) ≤ 0) : weightedAggregate 5 h4 h3 g FullFiveCyclic.remainingRows ≤ meanBalance h4 g + ((1 / 0xf424):ℝ) * mass g ^ 2:=by rw [weighted_remaining_eq] have hb:=balanceMass_le_mean h4 h3 g (add_nonneg (phaseTotal_nonneg h4 g hg 0) (phaseTotal_nonneg h4 g hg 2)) heven hodd hhigh have ho:rowAggregate 5 h4 h3 g (.ordered 0) ≤ 0 := rowAggregate_ordered_nonpos 5 h4 h3 g hg 0 (by simpa using heven) have hm5:=rowAggregate_massSquare_nonpos 5 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) linarith theorem deficit_lower_bound_of_child_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hodd:phaseTotal h4 g 3 ≤ phaseTotal h4 g 1) (hlow:(4:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ (phaseTotal h4 g 0 + phaseTotal h4 g 2)) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (5:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hchild:rowAggregate 5 h4 h3 g (.child 0) ≤ 0) (hheight:rowAggregate 5 h4 h3 g (.heightChild 1) ≤ 0) (hg0:rowAggregate 5 h4 h3 g (.grandchild 0) ≤ 0) (hg2:rowAggregate 5 h4 h3 g (.grandchild 2) ≤ 0) : ((27 / 0x1e848):ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ^ 2 ≤ deficit g:=by have hc:=FullFiveCyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g hg heven hodd hhigh hchild hheight hg0 hg2 have hm:mass g = (phaseTotal h4 g 0 + phaseTotal h4 g 2) + (phaseTotal h4 g 1 + phaseTotal h4 g 3):=by simpa only [add_assoc,add_comm,add_left_comm] using (phaseTotal_sum h4 g).symm have hp:massPolynomial (phaseTotal h4 g 0 + phaseTotal h4 g 2) (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ deficit g:=by rw [hm] at hc hr unfold meanBalance at hr unfold massPolynomial nlinarith exact (massPolynomial_lower_bound (add_nonneg (phaseTotal_nonneg h4 g hg 1) (phaseTotal_nonneg h4 g hg 3)) hlow hhigh).trans hp end Green24Proof.FullFiveMass private def zz2234:"s08ba"="s08ba":=by decide+kernel end section namespace Green24Proof.FullFiveProfileInterval open FullPhaseRows FullPhaseAggregation PhaseMassRows ChildRows HeightChildRows theorem interval_bound_of_height {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hh:(49 / 0xfa:ℝ) * energy v - (6 / 5:ℝ) * (classMass (ZMod.castHom h2 (ZMod 2)) v 0 - classMass (ZMod.castHom h2 (ZMod 2)) v 1) ^ 2 ≤ deficit v) (horder:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(4:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (5:ℝ) * mass v) : (27 / 0x1e848:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by have hg:=interleave_nonneg u v hu hv have hV:phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3 = mass v:=by rw [phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2,classMass_sum] have hU:phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 = mass u:=by have ht:=phaseTotal_sum h4 (interleave u v) rw [mass_interleave] at ht linarith have hchild:rowAggregate (5) h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even] have hd:=ih m (by have hp:=NeZero.pos m; omega) (dvd_mul_left m 2) u hu linarith have hheight:=rowAggregate_height_odd_nonpos (5) h4 h3 h2 u v hu hv hh have hg0:=Full27ProfileInterval.grandchild_nonpos_of_induction 5 h4 h3 (interleave u v) hg 0 ih have hg2:=Full27ProfileInterval.grandchild_nonpos_of_induction 5 h4 h3 (interleave u v) hg 2 ih have hc:=FullFiveMass.deficit_lower_bound_of_child_rows h4 h3 h5 (interleave u v) hg horder hodd (by rw [hU,hV]; exact hlow) (by rw [hU,hV]; exact hhigh) hchild hheight hg0 hg2 simpa only [hV] using hc theorem interval_bound_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (horder:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(4:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (5:ℝ) * mass v) : (27 / 0x1e848:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) exact interval_bound_of_height h4 h3 h5 h2 u v hu hv ih (HeightStrong.strong_height_bound h2 h3m h5m v hv) horder hodd hlow hhigh private def zz845:"s034d"="s034d":=by decide+kernel theorem interval_bound {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(4:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (5:ℝ) * mass v) : (27 / 0x1e848:ℝ) * mass v ^ 2 ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,horder,hodd⟩:=ProfileDoubleOrientation.orient_both_children h4 u v hu hv have hb:=interval_bound_ordered h4 h3 h5 h2 u' v' hu' hv' ih horder hodd (by simpa only [hU,hV] using hlow) (by simpa only [hU,hV] using hhigh) simpa only [hU,hV,hd] using hb end Green24Proof.FullFiveProfileInterval private def zz2235:"s08bb"="s08bb":=by decide+kernel end section namespace Green24Proof.LocalFullSixPairs def compact_fullSix_pair_20_base:CompactPair.Quadratic:=⟨(-37 / 0x59682f000),(0x1f7 / 0x1dcd6500),0⟩ def compact_fullSix_pair_20_hinges:List CompactPair.Hinge:=[⟨(0xd1 / 0xee6b2800),1, -3⟩,⟨(-0x1a07bbb / 0x1dcd65000),1, -2⟩,⟨(0x176d1d3 / 0x2cb417800),2, -3⟩,⟨(0x1a07bbb / 0x1dcd65000),2, -1⟩,⟨(-0x176d1d3 / 0x2cb417800),3, -2⟩,⟨(-0xd1 / 0xee6b2800),3, -1⟩] noncomputable def fullSix_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_20_base compact_fullSix_pair_20_hinges x y def compact_fullSix_pair_20_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullSix_pair_20_check : CompactPair.expressionCheckPSD compact_fullSix_pair_20_base compact_fullSix_pair_20_hinges 0 compact_fullSix_pair_20_cuts = true := by decide +kernel theorem compact_fullSix_pair_20_representation (x y:ℝ) : fullSix_pair_20 x y = CompactPair.expressionEval compact_fullSix_pair_20_base compact_fullSix_pair_20_hinges x y:=by rfl theorem fullSix_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_20 x y:=by rw [compact_fullSix_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_20_check hy (by simpa using hx) def compact_fullSix_pair_21_base:CompactPair.Quadratic:=⟨(11 / 0x165a0bc00),(0x333 / 0x77359400),0⟩ def compact_fullSix_pair_21_hinges:List CompactPair.Hinge:=[⟨(1 / 0xee6b2800),1, -3⟩,⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(1 / 0x59682f000),2, -3⟩,⟨(1 / 0x1dcd65000),2, -1⟩,⟨(-1 / 0x59682f000),3, -2⟩,⟨(-1 / 0xee6b2800),3, -1⟩] noncomputable def fullSix_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_21_base compact_fullSix_pair_21_hinges x y def compact_fullSix_pair_21_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] private def zz846:"s034e"="s034e":=by decide+kernel theorem compact_fullSix_pair_21_check : CompactPair.expressionCheckPSD compact_fullSix_pair_21_base compact_fullSix_pair_21_hinges 0 compact_fullSix_pair_21_cuts = true := by decide +kernel theorem compact_fullSix_pair_21_representation (x y:ℝ) : fullSix_pair_21 x y = CompactPair.expressionEval compact_fullSix_pair_21_base compact_fullSix_pair_21_hinges x y:=by rfl theorem fullSix_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_21 x y:=by rw [compact_fullSix_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_21_check hy (by simpa using hx) def compact_fullSix_pair_22_base:CompactPair.Quadratic:=⟨0,(0x20bf / 0x165a0bc00),0⟩ def compact_fullSix_pair_22_hinges:List CompactPair.Hinge:=[] noncomputable def fullSix_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_22_base compact_fullSix_pair_22_hinges x y def compact_fullSix_pair_22_cuts:List ℚ:=[] theorem compact_fullSix_pair_22_check : CompactPair.expressionCheckPSD compact_fullSix_pair_22_base compact_fullSix_pair_22_hinges 0 compact_fullSix_pair_22_cuts = true := by decide +kernel private def zz847:"s034f"="s034f":=by decide+kernel theorem compact_fullSix_pair_22_representation (x y:ℝ) : fullSix_pair_22 x y = CompactPair.expressionEval compact_fullSix_pair_22_base compact_fullSix_pair_22_hinges x y:=by rfl theorem fullSix_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_22 x y:=by rw [compact_fullSix_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_22_check hy (by simpa using hx) def compact_fullSix_pair_23_base:CompactPair.Quadratic:=⟨(-0x21c63d84d / 0x2cb417800),(0x9412b0d3 / 0x165a0bc00),0⟩ def compact_fullSix_pair_23_hinges:List CompactPair.Hinge:=[⟨(-0x168bea1 / 0x9896800),1, -2⟩,⟨(-0x863fc5f / 0x77359400),1, -1⟩,⟨(0x88492573 / 0x59682f000),2, -3⟩,⟨(0x233442c9 / 0x3b9aca00),2, -1⟩,⟨(-0xbb8c53b / 0x3b9aca00),3, -2⟩] noncomputable def fullSix_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_23_base compact_fullSix_pair_23_hinges x y def compact_fullSix_pair_23_cuts:List ℚ:=[(1 / 2),(2 / 3),1,(3 / 2),2] theorem compact_fullSix_pair_23_check : CompactPair.expressionCheckPSD compact_fullSix_pair_23_base compact_fullSix_pair_23_hinges 0 compact_fullSix_pair_23_cuts = true := by decide +kernel theorem compact_fullSix_pair_23_representation (x y:ℝ) : fullSix_pair_23 x y = CompactPair.expressionEval compact_fullSix_pair_23_base compact_fullSix_pair_23_hinges x y:=by rfl private def zz848:"s0350"="s0350":=by decide+kernel theorem fullSix_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_23 x y:=by rw [compact_fullSix_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_23_check hy (by simpa using hx) def compact_fullSix_pair_24_base:CompactPair.Quadratic:=⟨(-1 / 0x8f0d1800),(0xd55 / 0xcaa7e200),0⟩ def compact_fullSix_pair_24_hinges:List CompactPair.Hinge:=[⟨(0x258b579 / 0x47868c00),1, -3⟩,⟨(-0x24a2455 / 0x7735940),1, -2⟩,⟨(0x1bd2c72d / 0xee6b2800),2, -3⟩,⟨(-0x845447af / 0xee6b2800),2, -1⟩,⟨(0x3ba1d2f3 / 0x2cb417800),3, -2⟩,⟨(0x43aed35 / 0x1dcd6500),3, -1⟩] noncomputable def fullSix_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_24_base compact_fullSix_pair_24_hinges x y def compact_fullSix_pair_24_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullSix_pair_24_check : CompactPair.expressionCheckPSD compact_fullSix_pair_24_base compact_fullSix_pair_24_hinges 0 compact_fullSix_pair_24_cuts = true := by decide +kernel theorem compact_fullSix_pair_24_representation (x y:ℝ) : fullSix_pair_24 x y = CompactPair.expressionEval compact_fullSix_pair_24_base compact_fullSix_pair_24_hinges x y:=by rfl theorem fullSix_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_24 x y:=by rw [compact_fullSix_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_24_check hy (by simpa using hx) def compact_fullSix_pair_25_base:CompactPair.Quadratic:=⟨(-17 / 0x59682f000),(0x363b / 0x7ea8ed400),0⟩ def compact_fullSix_pair_25_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),1, -3⟩,⟨(1 / 0xee6b2800),1, -1⟩,⟨(-1 / 0x59682f000),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def fullSix_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_25_base compact_fullSix_pair_25_hinges x y def compact_fullSix_pair_25_cuts:List ℚ:=[(1 / 3),(2 / 3),1,3] private def zz849:"s0351"="s0351":=by decide+kernel theorem compact_fullSix_pair_25_check : CompactPair.expressionCheckPSD compact_fullSix_pair_25_base compact_fullSix_pair_25_hinges 0 compact_fullSix_pair_25_cuts = true := by decide +kernel theorem compact_fullSix_pair_25_representation (x y:ℝ) : fullSix_pair_25 x y = CompactPair.expressionEval compact_fullSix_pair_25_base compact_fullSix_pair_25_hinges x y:=by rfl theorem fullSix_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_25 x y:=by rw [compact_fullSix_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_25_check hy (by simpa using hx) def compact_fullSix_pair_26_base:CompactPair.Quadratic:=⟨0,(0x20c3 / 0x165a0bc00),0⟩ def compact_fullSix_pair_26_hinges:List CompactPair.Hinge:=[] noncomputable def fullSix_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_26_base compact_fullSix_pair_26_hinges x y def compact_fullSix_pair_26_cuts:List ℚ:=[] theorem compact_fullSix_pair_26_check : CompactPair.expressionCheckPSD compact_fullSix_pair_26_base compact_fullSix_pair_26_hinges 0 compact_fullSix_pair_26_cuts = true := by decide +kernel private def zz850:"s0352"="s0352":=by decide+kernel theorem compact_fullSix_pair_26_representation (x y:ℝ) : fullSix_pair_26 x y = CompactPair.expressionEval compact_fullSix_pair_26_base compact_fullSix_pair_26_hinges x y:=by rfl theorem fullSix_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_26 x y:=by rw [compact_fullSix_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_26_check hy (by simpa using hx) def compact_fullSix_pair_27_base:CompactPair.Quadratic:=⟨(-0x6193d4f65 / 0x2cb417800),(0x1383f890f / 0x165a0bc00),0⟩ def compact_fullSix_pair_27_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-0xd02a4edb / 0x1dcd65000),2, -1⟩,⟨(0x7ce62f5 / 0x11e1a300),3, -1⟩] noncomputable def fullSix_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_27_base compact_fullSix_pair_27_hinges x y def compact_fullSix_pair_27_cuts:List ℚ:=[(1 / 3),(1 / 2),3] theorem compact_fullSix_pair_27_check : CompactPair.expressionCheckPSD compact_fullSix_pair_27_base compact_fullSix_pair_27_hinges 0 compact_fullSix_pair_27_cuts = true := by decide +kernel theorem compact_fullSix_pair_27_representation (x y:ℝ) : fullSix_pair_27 x y = CompactPair.expressionEval compact_fullSix_pair_27_base compact_fullSix_pair_27_hinges x y:=by rfl private def zz851:"s0353"="s0353":=by decide+kernel theorem fullSix_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_27 x y:=by rw [compact_fullSix_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_27_check hy (by simpa using hx) def compact_fullSix_pair_28_base:CompactPair.Quadratic:=⟨(-0x1e57a29c15 / 0xe8d4a5100),(-0x32ce5a87 / 0x574fbde6),(-0x2c7f25afb / 0x2e90edd00)⟩ def compact_fullSix_pair_28_hinges:List CompactPair.Hinge:=[⟨(-0x837f36a97 / 0x3a35294400),1, -3⟩,⟨(0x2c7f25afb / 0x1d1a94a200),1,3⟩,⟨(0x837f36a97 / 0x3a35294400),3, -1⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3,1⟩] noncomputable def fullSix_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_28_base compact_fullSix_pair_28_hinges x y def compact_fullSix_pair_28_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullSix_pair_28_check : CompactPair.expressionCheckPSD compact_fullSix_pair_28_base compact_fullSix_pair_28_hinges 0 compact_fullSix_pair_28_cuts = true := by decide +kernel theorem compact_fullSix_pair_28_representation (x y:ℝ) : fullSix_pair_28 x y = CompactPair.expressionEval compact_fullSix_pair_28_base compact_fullSix_pair_28_hinges x y:=by rfl theorem fullSix_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_28 x y:=by rw [compact_fullSix_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_28_check hy (by simpa using hx) def compact_fullSix_pair_29_base:CompactPair.Quadratic:=⟨(-0x19078532d3 / 0xe8d4a5100),(-0x215f5b15e9 / 0x2ba7def300),(-0x2c7f25afb / 0x2e90edd00)⟩ def compact_fullSix_pair_29_hinges:List CompactPair.Hinge:=[⟨(-0x2c7f25afb / 0x1d1a94a200),1, -3⟩,⟨(0x2c7f25afb / 0x1d1a94a200),1,3⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3, -1⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3,1⟩] noncomputable def fullSix_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_29_base compact_fullSix_pair_29_hinges x y def compact_fullSix_pair_29_cuts:List ℚ:=[(1 / 3),3] private def zz852:"s0354"="s0354":=by decide+kernel theorem compact_fullSix_pair_29_check : CompactPair.expressionCheckPSD compact_fullSix_pair_29_base compact_fullSix_pair_29_hinges 0 compact_fullSix_pair_29_cuts = true := by decide +kernel theorem compact_fullSix_pair_29_representation (x y:ℝ) : fullSix_pair_29 x y = CompactPair.expressionEval compact_fullSix_pair_29_base compact_fullSix_pair_29_hinges x y:=by rfl theorem fullSix_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_29 x y:=by rw [compact_fullSix_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_29_check hy (by simpa using hx) def compact_fullSix_pair_30_base:CompactPair.Quadratic:=⟨(-0xa95f0445 / 0xee6b280),(0x1bb71d08f / 0x47868c00),0⟩ def compact_fullSix_pair_30_hinges:List CompactPair.Hinge:=[⟨(-0x1198d539 / 0x77359400),2, -3⟩,⟨(0x76c79f41 / 0x59682f00),3, -1⟩] noncomputable def fullSix_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_30_base compact_fullSix_pair_30_hinges x y def compact_fullSix_pair_30_cuts:List ℚ:=[(1 / 3),(3 / 2)] theorem compact_fullSix_pair_30_check : CompactPair.expressionCheckPSD compact_fullSix_pair_30_base compact_fullSix_pair_30_hinges 0 compact_fullSix_pair_30_cuts = true := by decide +kernel private def zz853:"s0355"="s0355":=by decide+kernel theorem compact_fullSix_pair_30_representation (x y:ℝ) : fullSix_pair_30 x y = CompactPair.expressionEval compact_fullSix_pair_30_base compact_fullSix_pair_30_hinges x y:=by rfl theorem fullSix_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_30 x y:=by rw [compact_fullSix_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_30_check hy (by simpa using hx) def compact_fullSix_pair_31_base:CompactPair.Quadratic:=⟨(7 / 0x59682f000),(0x4af / 0x59682f00),0⟩ def compact_fullSix_pair_31_hinges:List CompactPair.Hinge:=[⟨(-0x8a9c07 / 0x59682f00),1, -3⟩,⟨(-0x36a732b / 0x3b9aca00),1, -1⟩,⟨(0x6c8a9d / 0x2faf0800),2, -3⟩,⟨(0x46b1055 / 0x59682f000),3, -2⟩,⟨(-1 / 0x165a0bc00),3, -1⟩] noncomputable def fullSix_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_31_base compact_fullSix_pair_31_hinges x y def compact_fullSix_pair_31_cuts:List ℚ:=[(1 / 3),(2 / 3),1,(3 / 2),3] theorem compact_fullSix_pair_31_check : CompactPair.expressionCheckPSD compact_fullSix_pair_31_base compact_fullSix_pair_31_hinges 0 compact_fullSix_pair_31_cuts = true := by decide +kernel theorem compact_fullSix_pair_31_representation (x y:ℝ) : fullSix_pair_31 x y = CompactPair.expressionEval compact_fullSix_pair_31_base compact_fullSix_pair_31_hinges x y:=by rfl private def zz854:"s0356"="s0356":=by decide+kernel theorem fullSix_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_31 x y:=by rw [compact_fullSix_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_31_check hy (by simpa using hx) def compact_fullSix_pair_32_base:CompactPair.Quadratic:=⟨(-0x1e11f064b1 / 0x3a35294400),(-0x641e0efed5 / 0x574fbde600),(-0x2c7f25afb / 0x2e90edd00)⟩ def compact_fullSix_pair_32_hinges:List CompactPair.Hinge:=[⟨(-0x4b9c091c91 / 0x3a35294400),1, -3⟩,⟨(0x2c7f25afb / 0x1d1a94a200),1,3⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3, -1⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3,1⟩] noncomputable def fullSix_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_32_base compact_fullSix_pair_32_hinges x y def compact_fullSix_pair_32_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullSix_pair_32_check : CompactPair.expressionCheckPSD compact_fullSix_pair_32_base compact_fullSix_pair_32_hinges 0 compact_fullSix_pair_32_cuts = true := by decide +kernel theorem compact_fullSix_pair_32_representation (x y:ℝ) : fullSix_pair_32 x y = CompactPair.expressionEval compact_fullSix_pair_32_base compact_fullSix_pair_32_hinges x y:=by rfl theorem fullSix_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_32 x y:=by rw [compact_fullSix_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_32_check hy (by simpa using hx) def compact_fullSix_pair_33_base:CompactPair.Quadratic:=⟨(-0x1bcf778fc9 / 0x1d1a94a200),(-0x641e1267e1 / 0x574fbde600),(-0x2c7f25afb / 0x2e90edd00)⟩ def compact_fullSix_pair_33_hinges:List CompactPair.Hinge:=[⟨(-0x2c7f25afb / 0x1d1a94a200),1, -3⟩,⟨(-0x44b6d347 / 0xee6b2800),1, -2⟩,⟨(-0x35a9dc27 / 0x77359400),1, -1⟩,⟨(0x2c7f25afb / 0x1d1a94a200),1,3⟩,⟨(0x1adfb41b / 0x77359400),2, -3⟩,⟨(-0x40e3d801 / 0xee6b2800),2, -1⟩,⟨(0xcc8b7bf / 0x2cb417800),3, -2⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3, -1⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3,1⟩] noncomputable def fullSix_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_33_base compact_fullSix_pair_33_hinges x y def compact_fullSix_pair_33_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] private def zz855:"s0357"="s0357":=by decide+kernel theorem compact_fullSix_pair_33_check : CompactPair.expressionCheckPSD compact_fullSix_pair_33_base compact_fullSix_pair_33_hinges 0 compact_fullSix_pair_33_cuts = true := by decide +kernel theorem compact_fullSix_pair_33_representation (x y:ℝ) : fullSix_pair_33 x y = CompactPair.expressionEval compact_fullSix_pair_33_base compact_fullSix_pair_33_hinges x y:=by rfl theorem fullSix_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_33 x y:=by rw [compact_fullSix_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_33_check hy (by simpa using hx) def compact_fullSix_pair_34_base:CompactPair.Quadratic:=⟨(1 / 0x59682f00),(0x2159 / 0x1faa3b500),0⟩ def compact_fullSix_pair_34_hinges:List CompactPair.Hinge:=[⟨(-0x10030445 / 0x165a0bc00),1, -3⟩,⟨(0x6679b4f / 0x17d78400),1, -2⟩,⟨(-0x6679b4f / 0x47868c00),2, -3⟩,⟨(-0x6679b4f / 0x17d78400),2, -1⟩,⟨(0x6679b4f / 0x47868c00),3, -2⟩,⟨(0x10030445 / 0x165a0bc00),3, -1⟩] noncomputable def fullSix_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_34_base compact_fullSix_pair_34_hinges x y def compact_fullSix_pair_34_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullSix_pair_34_check : CompactPair.expressionCheckPSD compact_fullSix_pair_34_base compact_fullSix_pair_34_hinges 0 compact_fullSix_pair_34_cuts = true := by decide +kernel private def zz856:"s0358"="s0358":=by decide+kernel theorem compact_fullSix_pair_34_representation (x y:ℝ) : fullSix_pair_34 x y = CompactPair.expressionEval compact_fullSix_pair_34_base compact_fullSix_pair_34_hinges x y:=by rfl theorem fullSix_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_34 x y:=by rw [compact_fullSix_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_34_check hy (by simpa using hx) def compact_fullSix_pair_35_base:CompactPair.Quadratic:=⟨(-1 / 0x1c9c3800),(0x1b51 / 0x3f5476a00),0⟩ def compact_fullSix_pair_35_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x165a0bc00),1, -3⟩,⟨(-1 / 0xee6b2800),1, -2⟩,⟨(1 / 0xee6b2800),2, -1⟩,⟨(1 / 0x165a0bc00),3, -1⟩] noncomputable def fullSix_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_35_base compact_fullSix_pair_35_hinges x y def compact_fullSix_pair_35_cuts:List ℚ:=[(1 / 3),(1 / 2),2,3] theorem compact_fullSix_pair_35_check : CompactPair.expressionCheckPSD compact_fullSix_pair_35_base compact_fullSix_pair_35_hinges 0 compact_fullSix_pair_35_cuts = true := by decide +kernel theorem compact_fullSix_pair_35_representation (x y:ℝ) : fullSix_pair_35 x y = CompactPair.expressionEval compact_fullSix_pair_35_base compact_fullSix_pair_35_hinges x y:=by rfl private def zz857:"s0359"="s0359":=by decide+kernel theorem fullSix_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_35 x y:=by rw [compact_fullSix_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_35_check hy (by simpa using hx) def compact_fullSix_pair_36_base:CompactPair.Quadratic:=⟨(-0x61997 / 0x8f0d180),(0x1a26927 / 0x165a0bc00),0⟩ def compact_fullSix_pair_36_hinges:List CompactPair.Hinge:=[⟨(-0x1a2487 / 0x1dcd6500),1, -2⟩,⟨(0x8b6d7b / 0x165a0bc00),2, -3⟩] noncomputable def fullSix_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_36_base compact_fullSix_pair_36_hinges x y def compact_fullSix_pair_36_cuts:List ℚ:=[(3 / 2),2] theorem compact_fullSix_pair_36_check : CompactPair.expressionCheckPSD compact_fullSix_pair_36_base compact_fullSix_pair_36_hinges 0 compact_fullSix_pair_36_cuts = true := by decide +kernel theorem compact_fullSix_pair_36_representation (x y:ℝ) : fullSix_pair_36 x y = CompactPair.expressionEval compact_fullSix_pair_36_base compact_fullSix_pair_36_hinges x y:=by rfl theorem fullSix_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_36 x y:=by rw [compact_fullSix_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_36_check hy (by simpa using hx) def compact_fullSix_pair_37_base:CompactPair.Quadratic:=⟨(1 / 0x77359400),(0x95f / 0xb2d05e00),0⟩ def compact_fullSix_pair_37_hinges:List CompactPair.Hinge:=[⟨(1 / 0xee6b2800),1, -2⟩,⟨(-3 / 0xee6b2800),1, -1⟩] noncomputable def fullSix_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_37_base compact_fullSix_pair_37_hinges x y def compact_fullSix_pair_37_cuts:List ℚ:=[1,2] private def zz858:"s035a"="s035a":=by decide+kernel theorem compact_fullSix_pair_37_check : CompactPair.expressionCheckPSD compact_fullSix_pair_37_base compact_fullSix_pair_37_hinges 0 compact_fullSix_pair_37_cuts = true := by decide +kernel theorem compact_fullSix_pair_37_representation (x y:ℝ) : fullSix_pair_37 x y = CompactPair.expressionEval compact_fullSix_pair_37_base compact_fullSix_pair_37_hinges x y:=by rfl theorem fullSix_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_37 x y:=by rw [compact_fullSix_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_37_check hy (by simpa using hx) def compact_fullSix_pair_38_base:CompactPair.Quadratic:=⟨(-0x9dabbba7f9 / 0x574fbde600),(-0xdf48d0ad3 / 0x15d3ef7980),(-0x2c7f25afb / 0x2e90edd00)⟩ def compact_fullSix_pair_38_hinges:List CompactPair.Hinge:=[⟨(-0x2c7f25afb / 0x1d1a94a200),1, -3⟩,⟨(0x2c7f25afb / 0x1d1a94a200),1,3⟩,⟨(-0x311dcf7 / 0xb2d05e00),2, -3⟩,⟨(0x311dcf7 / 0xb2d05e00),3, -2⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3, -1⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3,1⟩] noncomputable def fullSix_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_38_base compact_fullSix_pair_38_hinges x y def compact_fullSix_pair_38_cuts:List ℚ:=[(1 / 3),(2 / 3),(3 / 2),3] theorem compact_fullSix_pair_38_check : CompactPair.expressionCheckPSD compact_fullSix_pair_38_base compact_fullSix_pair_38_hinges 0 compact_fullSix_pair_38_cuts = true := by decide +kernel private def zz859:"s035b"="s035b":=by decide+kernel theorem compact_fullSix_pair_38_representation (x y:ℝ) : fullSix_pair_38 x y = CompactPair.expressionEval compact_fullSix_pair_38_base compact_fullSix_pair_38_hinges x y:=by rfl theorem fullSix_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_38 x y:=by rw [compact_fullSix_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_38_check hy (by simpa using hx) def compact_fullSix_pair_39_base:CompactPair.Quadratic:=⟨(-0x19070fbc6b9 / 0xe8d4a51000),(-0x42c08c0689 / 0x574fbde600),(-0x2c7f25afb / 0x2e90edd00)⟩ def compact_fullSix_pair_39_hinges:List CompactPair.Hinge:=[⟨(-0x2c7f25afb / 0x1d1a94a200),1, -3⟩,⟨(0x50301 / 0x1dcd65000),1, -2⟩,⟨(0x2c7f25afb / 0x1d1a94a200),1,3⟩,⟨(-0x50301 / 0x1dcd65000),2, -1⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3, -1⟩,⟨(0x2c7f25afb / 0x1d1a94a200),3,1⟩] noncomputable def fullSix_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSix_pair_39_base compact_fullSix_pair_39_hinges x y def compact_fullSix_pair_39_cuts:List ℚ:=[(1 / 3),(1 / 2),2,3] theorem compact_fullSix_pair_39_check : CompactPair.expressionCheckPSD compact_fullSix_pair_39_base compact_fullSix_pair_39_hinges 0 compact_fullSix_pair_39_cuts = true := by decide +kernel theorem compact_fullSix_pair_39_representation (x y:ℝ) : fullSix_pair_39 x y = CompactPair.expressionEval compact_fullSix_pair_39_base compact_fullSix_pair_39_hinges x y:=by rfl private def zz860:"s035c"="s035c":=by decide+kernel theorem fullSix_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSix_pair_39 x y:=by rw [compact_fullSix_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSix_pair_39_check hy (by simpa using hx) end Green24Proof.LocalFullSixPairs private def zz2236:"s08bc"="s08bc":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l17 l22 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l42 l43 l45 l5 l51 l54 l57 l58 l6 l60 l61 l62 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x16b910163, -0x1aafadbc8, -0x280784c82,0x27f0a81e], ![-0x1aafadbc8, -0x640647708,0x378a0746,0x20c6dd884], ![-0x280784c82,0x378a0746, -0xadad9eba4,0x1ab9076ee], ![0x27f0a81e,0x20c6dd884,0x1ab9076ee, -0xd57d703c]] noncomputable def hinges:Hinges:=[(-0x5f3d0,l6),(-0x1492017c,l5),(0x1ec69684,l4),(0x8dff121,l9),(-0x2a3e9d18,l8),(0xe16245c,l10),(0x1acc80a02,l14),(-0x4aa010cc,l17),(0x4e69ff51,l23),(0x9dcc85a,l22),(-0xd57d703c,l27),(0xd57d703c,l29),(-0x1acc80a02,l25),(0x4fe0d124,l31),(0x8bc3f6a8,l30),(0xd57d703c,l33),(-0xe16245c,l38),(-0xd57d703c,l35),(0x2a3e9d18,l36),(0xd57d703c,l37),(-0x1ec69684,l34),(-0x8bc3f6a8,l43),(-0x9dcc85a,l42),(0x189b03e5,l45),(0xd57d703c,l51),(0x1492017c,l54),(-0x4fe0d124,l57),(-0x189b03e5,l58),(-0x8dff121,l61),(0x5f3d0,l60),(-0x4e69ff51,l63),(0x4aa010cc,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0xd57d703c,l27),(0xd57d703c,l29),(0xd57d703c,l33),(-0xd57d703c,l35),(0xd57d703c,l37),(0xd57d703c,l51),(0x1acc80a02,l14),(-0x1acc80a02,l25),(0x8bc3f6a8,l30),(-0x8bc3f6a8,l43),(0x4fe0d124,l31),(-0x4fe0d124,l57),(0x4e69ff51,l23),(-0x4e69ff51,l63),(-0x4aa010cc,l17),(0x4aa010cc,l62),(-0x2a3e9d18,l8),(0x2a3e9d18,l36),(0xe16245c,l10),(-0xe16245c,l38),(0x8dff121,l9),(-0x8dff121,l61),(0x189b03e5,l45),(-0x189b03e5,l58),(-0x1492017c,l5),(0x1492017c,l54),(0x1ec69684,l4),(-0x1ec69684,l34),(0x9dcc85a,l22),(-0x9dcc85a,l42),(-0x5f3d0,l6),(0x5f3d0,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x3110812180600000c4420e016400c0000000088300e6010000000208c4090c0300000000002203900400000cc521a026400c0000188a43802c80180000000000e01c8020000002886202418080000090320b014400c0000000078500c60100000000c844098c0300000000001a0310040000000038240630080000000078481460100000000e05002cc0300000001f0b81318060000000034240a3008000000e618815260200000000000d01c8020000038c3200d9180a000007186a027230140000001248206c601800002424040648c0500000504908126180a000009090100d230140000000e46206c601800002d10870099003000000208420241808000007c220e014400c0000000050280a601000000094110218c04000000000002819002000000002c140a300800000005412044601800000000001c0c8010000000150600998060000002b05c086301000000004c120446018000000000090248020000000002a80510060000000000a40620080000000001580c40100000000002a01480200000000000981900200000f8521a013400c0000000000e816401000000011854028c030000a813828036a008000000004c240630080000000098580c60100004d0841200c900400000000261402980400000000004c0520080a10520210019a80301440a1044006350060014c144130096a00a0001582405809d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x64029005424910083011f1401e8d9260112079e2803d09244020c09dc500700000000006e0310040000000000d4062008201981961012b08030000002448100a0c0400000000000f8190020e24a24918096340181c194192100c46803000000000024030803000000528a803498080000000982201b300c0000000001881c401000c214620803c500500000000002a0590040000000016001320100000000005e026401800c608c0ac03c900500000000000a0310040000005110c068301000518890d000a080281c51981450298500603823242820390a00c0001b05105c04f4010000390c62901968020000000188a40d8c030000000210c80b180600000a44419016400c0003a0681080f080200003c0841400f10040000f81e04203c20080000f02106809c40100000000000480c401000000008828030c03000005883180fd180a0050c2082601b340141418408230107280300002011d301e90c0603a81840a203dba00c000000610c807f301000b78ef18601e280280000000000240c8010000ec1a05001da00800000008239036300c00860e514a07308028010c1c22840a610050000000391481218060000000000140920080005090212009080200141202110066100500014649022034200800000009239024300c0000000e44202c601800000001d0902cc020000d41303400fa00800000e46224016400c0000000000900e401000000002315018c0200000000422a03180400000000000b0320040000000008e01640180000000011404c803,0x7c029004000000830840883010000010308204306028000001984102bcc040000050c408188180a0000000000540e20080000000a41403c60180000000000a01c80200000039822044180800000006629037300c000000e898281c8010000000001d40288030000000000720310040000000000ec0620080000001d44403860180000000003a0148020000000000320710040000000541101e300c0000000c42202a60180000001184c034c0300000003b0c81f9806000007186101d530140000000148381a6010000000000110388020000048c508157180a0000000380b00e300c0000000cc2207e60180000000043021c80400000000001203900400000091104058301000a0901044055e802820f184082035c100600000000002a0390040040c62042023840141018ca045018e0803000000001b09034c020000000003680510060000000058140d300800000001a8b01c6010000039168280c900300000000006c029005624a1008302771401c0000000168c81e6010000002c46101a4c040000006890204b1808000000b111006930100000000150701e60100000000291503cc020000000001f80590060000000003d013200c14192106080b40803000000001709034c020000004a240a06a0040000000048140d300800908e1044055e802800e61421840a490050000000290c80b18060038c5106201b2401400718a50ca04e48028000001584102bcc040000000005458198020000000006500a200c0000000001880c401000000000033018802,0x14e498640262008000294910c804c401000b312410605f68028000001c46301a0c0400004a640203d2180c00000006229016300c000530c22881728020012f0860a801d1005000000308a203618080000006108807f30100c30878678074480300000000000440c8010001423302a01da0080002986306007b4010000518cc198114802000004e1c8c40d9003002583846080c9200a004d4738c703db40141278e28c2810b6803000028125301e90c06000000006c1a0598040000b4ca0407a4301800000000f028166010000002047101b0c0400014c3182603da00800000000000d03200400000016c6802260180000002c9440d8c0300000a2491f01b20060002d87104c05b401000a09211d803248028000b31d817022d0040000000000078190020a1491473c085b401800000014c4604a60180000000000540c801000000054158089806000006188603593014000000821100fe602000c3148088083d005001c629021011c200a070c5502280c70401800908e114404b68028000001e0e0601d00200000001d0880698060000000006850330040000000006e0164018000000000d404c8030014420c310078a00a00000000000303200400000001f0300e6010000003ec120058c04000000006a42079804000000d120406930100000020258812c602000002c408408acc05000000001a0a0798040000003105003930100000000188e81e6010000000001f402880300000000007a0310040000000000fc06200800000001e8701660100000003e86402cc03,0x360290040000005212001330100000000b04e026601800000001611014c0200000000002c0290040000000002c009200c0000000006c0124018000001a8110050c040000000032120398040000000640900c300c0000000d81201860180000001a024028c0300000340208013180a00000006e1100b300c00000000d0480c601000003025840930c0500000584a08069180a00000b0941019230140000249143804c8018000000289240d8c030000002986405e1808000000510c8058301000000a30dc05f0602800000010844058c030000072370700a2006000000006458053008000000c22a810c602000000001917028c020000000311681118060000000682d013300c000000ce2d810c6020000000188ac088c0300000000002a049004000012c360a016400c00718840620124802800001861e4046cc0500000823c0580a20060000000b83100a300c00000000016816401000000000019018802000000005c32031804000000000b8d033004000000005c002640200000000017c04c80300000000000b8190020000000a221016300c0000000148681660100000024c290138c0400000048846037180800510818e301d24016590e4827c017ae803800001c6264046cc05002c6488518109200a00490718c301d240140000e08c980f486030000001845301a0c04000007c291081b2006003b05088101924014007a8a710e07b680281cf1451050216d006000000518520271808000000a108c06e301014186182080cd480352820102f804bc5007,0x623a1a07a0040000000540901e300c000000ec0c803c60200000001d8840fcc030000038c4080ea980a0000000661903f300c000508ae09812a8020000000328a8070c030000000006604390080000000620a01e300c0000143142062060280000020c310220c040000040c30810c180a0000007308408830100000001b44201660180000000351202cc02000000002a12079804000000510900393010000016208204566028000004c4a10258c04000000008a42079804000001112040693010000000ec28815e60200000000411d03cc020000006d84400b180800000000d8280730080000000ec4206e601800000014884058c0300000000000a0390040000000000440620080000000000300e4010000000208e4098c030001023a86406620080028c3c85b011b401400000a30f2023660280007118453032d0040000000004c18198020000000004f00b200c0000000009a02640180000186264046cc05000102388c6065a008000204510cc0bb4010000408cc28811e802000c10c208c05d900500000000001a04900400000000443c0530080000000000780a401000000138110058c04000004a1304805a0060000000001e009200c0000000000320640080000000017402880300000000005a0310040000000000bc0620080000000001700a40100000411d8c80990030000ec1283a066200800000034094039301000000000340026402000000019894028c0300000002c108099806000000006c4406300800000000d8980c601000000001b12014c02,0x1c81c40102c9286209029ad00605865044060395a00c0d0cc08a0c0a5c40180000000001e81c4010000003d46401a4c0400000003904806980600000000001b0320040000000001a81640102c328220300fad0060000000000520710040c24b189240a6b40180000000088281e6010000001041400e4c04060658448601f5a00c000000d448140d40080000001b044036601800001c208c0d48c0505844861820354200c000000000e8b033004000408e22981b880200000001c864058c0300000823a0c81b20060000000000940b2008000000004c002640200000000013c04c80306065844860395a00c000001212440963010000000000220184018000004046401a4c04000000808e2034980800000000e4540f30080000000068581a601000000002d16038c0200000922d0501920060b0890c20406a8401800000001d0901e6010000020208c0d48c05000122408c606e200800000009241026300c0000249045406c80180000000015c02c8030000000002a809900600000918c102ae30140000000901601c601800000020864054c03], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((0xe33fa02cc0c0e14f30fcf075de15acc01cd1d464901070021c659080ad2308078186b082770807e060616a72fa141818055bc58430c6cc7820e378bcf84e083c0100001493c64cc3e988c0d05a41e64022194e46041d1a26c11801e34f6aa5001d008718b20a5328610078419f0823b8e000830305aa146c5060300521cb0830c398e020db00af1c9c007c02000029c46b4140004d8464427a5c5aa9fc0b09120fb4c602006f7491c110644f59601a44ef44941074021a5eb84e35430cd778c14584418fbb610204ec8501a001f6540c9410740200001e046982434a020002252358231ab0585c02f47033678f38d081154a18e341a3eca4f240000045db4b0a041100206a817212c3003032053d9a68fd5a094607406ab6012ce6863a6e586c1523c64053c34021423c124008030080200d8180fb76baa028a000029b981a3021b7f60e061bf972d189a80a12146a40818451d3375cc88207162c005530400001c2003023a05125e8c2400940614500001162a34604468a31430dc7bde7150d1006fdd53a0c216dce23791041641f59dc98200000bb8060466b9ecb31c004851a902a900230100000e510003c43e6833f67006ec0145bb8c156be3aa80605ebaa1a9430c0c05a15d82c100619627726a629340229dc61aaf7204822a179066f040900000237a86600000001141b82b0ea012005e07892400007d2c818282ad64bf40145bf5023bab260603256cc08050c9b645b52e86190864765a13410d8f4fb06090000000a8c005006011d0ae0484801381000007c88d482800118c8004dd1191098d400fc504c3fb57104c14623ca3c30aa6637f38322bfd8342020f08c98b094208002103819ec9e1e3e461a5e496a23160a103b595836d5c41059bc2524679108a483832c050804193c416250ca0000025e78d60000000937e491be82000b00c14500000fa590346073ce9e53830d5895528dace10076d392c31420db43cfdf610433b5124a2a98000000a8c0110069ec17ee820005497652d090900270200000f918105d96a418160000000000000000000000000000123fe0d960868e23c842cae8de1b221d12071030c322114088094000060000401b4500000fa590346073ce9e53830d544165631ce1008636de051420d1a5c0d621043019cca6b298000000a8c011006dc4eabf02000490cecbb890900270200000f910003b82000f9878d1a9f3b99c61c8d1fa0e230906e70308b51dd3f3017eeec2b12820e8043cdad414070e296f3d7f06172fc65287045207a1f2427bf7699240972ba764100453f5c13800e8042497a7079456aa0c14e0e99ffe564243f6b0c05e07f830f1d0523390963821102141fa5c83084) <<< 16000) + 0x6ae4424cfc4801ef62e57ca689000c383fc3efa0c0218cfe686dca59c32005c08800023a200072a469c1400096a46984434a12000de2234822001902233a131a301e980169d889a59b36170270a126ccbd061f025a16058245bffb81600c2d94d53000f00434b19d567ae34312ee2c2d0c38eecbb442c104ae00d39000800200001a24688163260303801f180eac100938431d1bc281a20062f60a84138861dd5c784059338bd3820e0d65f39302108043cd0bafb0c3e48525d3151c9145e5b01c59e1c403040d62718401df675ec10307838019c2400000c21230000002f32a6a4001200a3cfb5dbacabe3851ff3327ec145bcb10262c184391363c221043ede6d9c80820000248254800000062703c002ff9c5bc10009d298158ac801200a00007508001c99e30ed239ea711453931518335025a89a08806d18cc05d0021c04a083a010b24d5fd0000002196564ababae13cf4cf044000000000871fbe8ce8b2f2e3429eb8a161111e68a28e20c21c112124082060000401b23c34338fa1e7cb0e7f9d389000004b070a6f1443d8914f20120d0a29f9011621846f143b74208d3750d69208626c23964007c0100003484000d98800238919f090004c0119a05e97d2f7d82708685ba02685022d0a658311e08da580d158f972800e00434b33aacf5c686cb0e0eb830efe6a26516084ae00d390007c02000019a468816326030380184200fcd07d9fabd8a2cd2428b69210083f2b8c78828b39920403013dc4341e18727afa7c981084021020bb2d48302c0000000000000000000000000000247fc1b2c10d1c47908595d1bc36443a240e4481864c5280180140000c00008036081417b7b4840f00000516c8981bc503a313180b56bdd2a0327c43a769186e98a5275c98a363da77c870800000de884000000004fd200460180001ca20007207cdddd78183c9fe3473a3c470c5dd8341b5772392417ffcc2525041c00840e2cd2103d11f8fec43a40508931f44f08a95a87c28215700d704002f4abd79800780210405f25a52220780000273c44c1bc503a3098d4d209e224a159f2ecb7c1e1800000e104c2127446ab0804217261c7c50a734566af648011808000072c800182100040a30405ea296559030000018858e24456c89178d1ca8562ad4071c910cfdb68d0eeff889e4420975ed80a4840000000fbb8000094809647e40090040342021a00103d80800084c8cf868002d108006c210171d00b0c805454028120019eb34360badd18c0d399396e5027d9230423041d00850d8994ec73812960d6512080771028f032aa7afa080aa4d0ff25041d0080000781a142a3cb035ad58473123eb66f594ef12f307ebfb354bf255d3377efc30f06748918048a25770454359d91773b71a122d66fb41bb2629bd1cb8c99408f47ab185bd751f26c2c29f552b65b6d634ff72c56ee5afb5f68dafad5be256a79a52239f4c177f262434c40bfe3f1befcb9c89e4b3a9e65782d619aa72088db91afb1b1c4aece5e2e4a5766ee2cda5bf40a9ca7d5ca9afba0f53c030f028a7f5eb195e86d0733381d86e0c2424ec0000aae4678361141319d058ce00ffbd42ea585f3147617ff93becdee5fd0212c219b7136702c98aae60da4c0b32863032c208238028037591185cfbda9d11e0bd6b26b0b557fd2ee3a5260ebc825940cda06ad821fc63a3360ba1848be4e954864ce5dcc9f169df18a4cb074546063e54d40dd7e4b327794c1db7e5b516dc17972c208e656250109fc37d7e41596aef892fb3fe984144af852cd4f1cb9921f06979f6d29baf2eb38f003b908d75ac8c654961fbc943faf02440005a1ab6005550b73f482ea93e2d5b7e371f34c8835397f8ed95d9ba91a54b28d6077650c911c800021c908c118cd02ffbd42ea585f3147617ff93becdee5fd021262ab98369302c8f0cb0c208c04b04a003011f640da7dfdc5a51feb99390fd21e3b4716ce88a45f3280dbe38a370a770304d0f1fc63e63703ae1b959ceb7a389089792105202c7f334b07fbc0e5f922eaf371c18d325e0b045ae6d90b7bc9e5dff5f4051d2f54bca024f59e008b2d4000f61990fe0dd05f2e54a550bbd1790986dd0327b827ecf0cce077251b68c2525844105f4a7a4dd04a597a0b11511c263ddc2bbbd8db07f107e5604ed29d6eb33131fea414931d000021f900065e2001aaa4664843303a160190cb8680054ccec046f293f930b45845748ca7f0aa37040678a2ce19e28b371541a25a2a8344c0f1610cdb89b3816658c40438430438030020a0015226cb1017750468cce4c5f31007fca521983ce9a0a51307b64ac8086c29609a5007d67fd18d28484a0005d4418cc7649abfa000000432cac957575c279e99e088b0866dc4d9c0b000000009afc135ee74be8722caf5c907cca14714704900300111d5ad7ab63ddd178d0a1dc5bfefa341aed32cb3160850018dbdc86c939c6606a852eaca282d171797379899116a7aaaa086a8d82b1b00a4f69b0d0fdf834214f2a88ea0007584658d632a131940580980f4617bd101630d6f0e5f98a140c687019e10c681f780411c17a56810032f9c1480026181f0080c982c2e01701001004414cca032200050a4ad14095235e323041c0087982edc7c11d030cf46e3a8126225824746d6eb0d2c68211893005960156ca3a3c486000003fb7618288bb722dbd071697617a424228a165199d8fef32400a40a1e601128916edd80c3267fce1aeae6081603379dbe42483c7036eeede3fc318392ab889771004f142a6cfefe344c60a250aa0ada9811453be2868)) <<< 16000) + 0xfb54020008d02be5b7eb21c909003104800012b1000477311432017ffa40e47bde032c1c9d5b5a840009e6c31c5002718a7612820f8043cc176e3e08e81867b41666211112c0f741e5e0869636d6a4a2d02cb05860fb96a243000001fdbb0c1445db916de838b4bb0bd21211450b28ccec7f79920052050f3007476d4d914061946de6a87159040b015d65bb479c1e381e7d5b7b5448c1c827770612d5678a14edaf7ff1b2305142de145bb258a29df2a65407481000466868529b890e4848018824000095880023b900058d3869f71f318f0955610cd041b3cd89003006f6b8df900078021c584180ab85a082cbdd5042d4e7907940c482375af18e1812c73549f4d1630455ac1714c93840d79a99b15f4588475d72229e64411748a147f0601e110eb8c8a63feb4309002f0400001211c35de63e90784c150e95a40ba7a47ce5839b84d920a0069b34fd2800f00438b07bf483d2eb0597d3c00f881260f28173ddf50ce11c30299645f5b1e2c6026d663883767081a923de1f5f8b1097829a029c58822e931bf571a03c221ca9da7361568612005e080000242200069e464824000d4840046448c884c6400700c0100471d35ca94940523b49ccd20c090624f4c2e47bb260105b3f1dad0c00d633b92c003c008f300fe26e2f69867eb778e02434b021d773d0c5960586620ac0d14e58a7edfe96284de9e42eb14557e2b5f13c78472c53b11355001ebbadf1de44801381000007c8e960310c73471faff5f042028ef4e2654831b468286602aeb9d0201050b263c806005a367609c007c02186503b436826d0d2c4ca8c61a57c5960b7ef77fb503c70165c9921a51a2965e6f08b810b141820eee76fc28a8a0e1b1c0f03c415ab89643349e09139299469f673c9002d03800011710003973850fb6c8ae30d9e6becd221249845807832ee0efa0e006f23b5c1001b0a8054c003c010b2e7e6771b45b02c80316ad594f08b1c54418084b8c2c628e1947357fcc101d3d387342d10435a2cbbacf80e0c1ddbd873f5a50004d8dcdd6f084001e7a7dade9fef12400b80e000046e40600600070840029e4c0300401165b479d87430a01518e4430d0acca3c8f10770edeb840075d62e794007c021c581db6bff72a20b2fba8dcbf519bc79400d4dbca3a7f30433ca3cf4a5659420a647659f15a0411061359962708702679475e1e26950007aadc73bb1b1400073fead475eee18b9003104800012b1018016961d79799871eb558fb02a184443b4440255f8581e0823ddcddd030036d3861cc003e010c3276bfe4a3c34b0541f471a8c203204fab103075c099f8ff881c91a6822d01452712b9d2b85047b5b6626054001fd5bb7b0500308cdd236a32004c0380001e83c7cee9e20ca861509fb4520c2cb994020123d51ed4301b9c896cc0820a526998300352725bce003e010c3126bfeeabe81658e537dbc5783078120a9e925040e491a823eda4b14358665459f0a290854efdbd03c1027e8f7eb8aa800ef767b90fc50030bc5d3f08c96c801581800008688001c110006c320014b84002a648b40a863c24002b284009e9c8c484c638078381f9ff47a22061b0fa39a18a245b350e192bf4044861eaa49255080043f955dcc0040010e39d27759b648b2004656a1bd08222e663061e0c1c034c15212cd0c7994bce92470c916ca3d0f8808053fba277c408f32965f5902099749e04e025f200500480001fc3a6d7844936610a1c064eb1d4f038fbe2fcd6f1630600d0feb3ca163002ee25fe48c08b99eca9f283047062b84fce0c15ccf5dc3a3020cd3694a7e7b99900290280c680800086c82100f8e6995ffd041c6817d3335e071c64c3d425840a147c4b56038309e5508b8861f3fc436bb8d080892bd188384679d418821010a3e27b807240094051c7364ba26dd671a058b99d3c0e38daca06e8840a154eb15d81c183ad32722a187cf2bce07d9a10146f124f038468a4411180808553ad5de1c4801300c000079cf1c53f4d4587d13014d3c80041c600000097082c80378a0746038e4146da9250e0c498f1acf8861e1ddabbe8f1c20dc9fcde7070208953a725244801380e38e2ac9869ba113014d3c800438c0000012e10b200de281d181c722067975d0e0c4565f64990c3c4141a88487083901590aa38104c0f69d624900260180000f390003f321381200080222982214b090a50482682431812149050c58280038ecf1c88af8c91a31e657919285124efd6010545fdece8a000debbdf212860f804062817c72c7d348c50a0147ce3871415690270415d9d32e03c018345f52012880f80400003fc8c482c62007fdea1752c2f98a3b0bffc9df66f72fe81089860088667ab09908b306661d1eb2b8f58aa631ff8252474b3057a76c00000000000000000221610cdb89b3816d767fa0a373d08000e57204770cec8257dd0729376f357b7336cdc61813018b22029828a292208000163183242816de19c787e985a9b4bdbe6e795dc1f5aa9edad42e4aefdbd855218226f88edf09fcd5710768fb19d1b48a58b57f22f0afb70da01371732a74c08c2bf98ac825fa3e9ff60f222f56f45b323b77ab0bc50757143a000c00461c8413e32186190c2868002314ec046f293f930b45845748ca7f0aa37040360237953f930b473ab87af2603e6080f99e28b38678a2cdc55068968aa0d1303c648e38420458038028000800198c72e8ce579c66b589eeaf9ea863b5ceb737c2483bb9e1d628a9714475d8d9ecf5f2b44d67e031a549174000d248b218f60237949fc985a2c22ba4653f8551)) <<< 16000) + 0xb82033c51670cf1459b8aa0d12d1541a2607949c515fc58b8b4bf0c3764200cd4dcf232f4249df65234d8e00000000000000000422e21937634b02c000000026bf04d7b9d2fa1c8b2bd7241f52060c11401000414001916d7377feb01630a02860a909b8b6057e93e46b600a09384a9119698e523ac5ed131272eb42f60193a18bd18fd222f851146b77da03903ba901b1db0353906656f93ce88b0966c5af2b0645d65dd5c7c9effa87ab29e50005de23081318305d1352287a7cc002b642f111020f804226800000c63a838b08c956a52305975800cfbc2d0b28361893b79214524ae0cc0e142070464ac300d858831fd2625b5051126b6cc74308820af167f53be8dc9002b030597d407ccb68bf145237b4cf8e01c810000001cd6d0104014b994dd0ac70a0cf3794bcf99c205481fea5f7658844e1b10b30b08220c127dc8508780262a7dc11e749d49002e03c00011c100046e344d72fa1d6600152aa74c80078011a5034e4db175c428ae9cd45bcd2c8492b5c7f6a53290c1c08d0d1d5a961a2009275ca6e013430cdbc7da04da506499fbff447c030d51f16b8542a1c08ee519d80944a2fc9002f0400001211182050001731c2423255b77180926aeb4d7a72209203ccd206f85082103cf5e209c06141192b2bdf10908aca41c92450308cbceb956a6c20863cf240b058d04000004a55f2371200580680a9015137c242134e041552ad6900051f96c78c007c021a5046bb19abc78a2be3bb3d0043c5120b214144c46249589b16f69a318381793b9166e8d0c2b656fd4cdc506743113793580c35082f57812b9c08c348830c9a2d099002d03800011710002eb21741200055420e81318101d134ceb4584e0c20afbf318005dc6e9f8c007c02145644a14423084d242a37a37ab3c5126e052f46fdf2494a9878935689a2095212f28fe8b0cf36f413a4683860d9a46c9f2a0c3552ffcc879f1a08a8dea1131b310b9002d038000117118001d9526060451e206e1808268016d86d54c007801165eaba26667d8b28f4a40e0dec514864ed122fe3c800000146f41c28372abb4fc0c11186caa765040820630de74810447d5f56c531c09f9ae8752eb45900290280001031b2b0cdabb98618dc2fd863c14155da226800e139b9e4001f0085951bd6c51280a29b086b46e81c2876dcf0e822c5c8972b6e0030a624c3294a85158184b5a089820f9ed5b95010441d7af9fee30600000a8c02412004e0480001f320005b640016d4c0e5d57e9fe1c759114ebd122800000c80b08378a0d324043cf6c3051c204baa34d841550cff110904378a12ca0823d9a33baa400840202fe0217e010be8080007d48be0885ec2400161445e807c76f11446764c5900480db017a10455642c8acac38f724f25158b1a280901c2eba468462f37873d20e0a11a1f85f20182c5e6df9319020e4eb7c5a2a108720054060e3b788a233b262c802406d80bd0822ab216456561c7ebf9bed6014d140480e175d23423179bc39e907043d884b02a10c162f36fc98c8107f2a493fe3f8439002a0300001089d34abcee990c2698000002109c287022a58afe41430137c06e4c06192058aee4f858807095b2df434105d5a31e70820e0889bd8f8440010d41f11d9f9200520400e60100010c9082090bc84820424100121780903f828001bbcc090040100000446070a2d00e0c03a67d7b6100073bfa6618016a781d2000032140f80400003808bb82fcb000001b5030184843cbffc93b092737f5db87cd8410c692792cef71865c562cb16db8a2021e60785bd8904688e1247e66102a26e3af4a31041181ff078beb4e212005a0700af018bb00f8b03a5f477fb8c8b2e5945be14b84228a39c71859cc8c8820eeaae1fca8b21c6047a98d150594e0c0e289e3631782c329ab57838710430ca35bde43da543c207f6d9d8963133fcc90032048597baf3461665c28a4b7bd90ce7a1042ca36c28bf28e18000002673c070811ae86429d7383069f09c299b961985100f04fb030cdbfc541c00c7801cb4620615c93aa400b40e000045c74a05284f0bc42ca2a9503101737c249428e2c0d237071d1805448f66420501b81ad44d64d081aa72097d1028227236eca1684208d4615d438d03800efe034d2eb3b109002e0380ba80800093080038790740981c00e8a24ed263d5809272b8a0f2c381c74fd680d8034d0c3b8d561580283797376443a0b087bfd4703f008241f51c514e8d0400000441d8340101bf94371ab9c8015016249c05c55331c071ced267601b8284013321edbc0d0c3bb75c08e428361cacfe550030d272dbfd0972c20f2109cc9f0208b48e7d72f934100333134da244480150160000840d1506049d69bec249782ad9fd9c80e3b0b5a9ace24cd140000027bbe06860ff640718b82832f9bf7c2d13161152163372000208e66e3ceb88e680448f491578a9896400b40e124cc4d6c14071d1bac4abc30a000001903430de282e8941b364d1ab430c87106eb05841bc5089d08226f76d50040853cbf042900210080000db10003ff22e812173050b48280022508b900f8e8725d3400dd5ce2c0ab85a2cafe81c7c42fb9f059428514db40bcba6df53430172790d804905080b93c1fb3c583410f1be1eca856820099080ca05dae000adc2e22fa0aca0f9bc801902638efdb62f96c9871a000005adad0b1c2af4c2d5840e2c4fd24304fe343083c0e9f506606050246498943002b711f0eae02055283d6952800056cd75a83215a92005606000021a21360a07a0503d8285c4142e00a09705000289981)) <<< 16000) + 0x0008020000088c0e07cf6e8a48069414d3c2ba400a288fc308580c144ec02c73e8402825d5ade3b160104a5bc5a33e6850410efcaac6108087cf6b00180081165ff64d9b3b012005606016f018b700fcc06f140e8c0006184d51fad21370c2e158f8f77df81822308aa34ff231042e7c9af913e038606c88610cc3460c378a1ba100020101bc517410000c006210304323120012005e080f300f4209505b9c0c30fb278a3caa1b0c2e14ceb733b4bc0f102a84c4b4aac60c10ba5d80a271f5c410da1720deb8bc100c0b718c69d1b5070c09f8a1a5d03f50004397ae6f5f50250e01200680a80002743c582e41ca39d40c0b2c6629c01fb8a08595079af247737d038306e21b702fa7c161969669090b887430ce6a44fb17333038408ac585db90241820463b7af4894d9e008d3ea76306b0216f00900350580b6808000a4c8003bf989a0000038a31c583e7b482ec5964cacd3fe396543b796566e5144b21958d5a8481b35e30a4a0e0d3a0bdc71618b90490ce4206d44de82f5519002601c597b2f68ce1211655bdbdf68a2c514d083c27595284800001da9c070814cd9b582e9c18d4c5733f3a58699609b1e70061b859facbcb07805a30dc355a4bf480150180000844d149012346cdc8a269e4007d99d124973b3b25ee24c8000002835c06861e2cd7afafcd083928fe135794119322f1108c0825bcc050f39070056efc2f93c337a400ac0c02d80200022f21840200067420e81b916000003d4dc092408048acbdc924440d41136fd20828461a901726040badd10bd0c80861f064146c9409949d39f03f04139ac8661fce60059797a0260a73e400ac0c12421dcd5119040eb77a3c1233fca3366242800002581810de2828492177abb2019408de283ea88088dbe3df820b1b38b9b5200400100001ad22d60a16a010b48080e00400086e45a007c733a604154226000001770103c2d06f4bd0e396224227b10280cfb605d9a0915b2634c0a00289164a004022b649ca40003f6877ce15240090051c7721137c0fcaa22611472221390d163821ea74b4d6c16281e6007c1d52902c0016cefb1380a10195706e48ee9a00000014537fa0204af3e66d6e0e00028ccd0b24ab04d852400c0110000498426c140f40a07b050b38285981412e0a0004b93a2c4c8ca481a19e87c93d92081fef7fb80004640400100000b5200351c6072e7b341c582d92cd1ae38204cb77f0600f21ee1624002c48f900000092941000400004408b294800cf108b216ee4442c6b726e33971cdd16880e9d492ab5f2fc90f7a1c0759000000000000000000865c4326ec69605a8309d981dd8160000000135f826bdce97d0e4595eb920fa1030408a008002200343e486ff4808191a89f59bfe55b3bd23e7e1ddbd3e5bbf5d3fcf114465b2aef864927484940f27a757aca207a2ec099a40645a3f0a37dd7c52bb6c036497c2c8e35c496e2f7d669e363b2ff0be8284f69ae9dd2b866dfc8be774fa3f64f06821c831d140015b08b198807ca40843a005ae722c47200a52e3442ab7c06c102ea9ac23d8a11e5d55519a08fd8916b0048204001016105d1096c7d98c40b95f6e05e28487b7798a5822b21662a580242a758a38009dd42fc004c2840010000133207623c1c5031a0c891c3ce3597c71366b0e8f0408461a8f54900253b16207005d133538009850800202c01215f050000ae915e0d8ae82c0e01763166a85fc903140c0cba0c1e04a19cb8e0177883df8c01d77c090800024a504001015c0100009310632dd31f2b40a63e567eb13f36b65e497e03c250a40a38a284382300180200024756e12ac6478cca893ca2cab43bfb8b7563aa3548498620467416dfc95ac1a7c213ce68c823500022322b66b0ce258ad04c564178394389b8b123a70154a20e26e58e65c0c182a76c69061bd3a674d08012b492c1808013121000405601608a0bc1dbf049a2871296f70380b0108f513e070179679cac00012428200080ab8080003e88ab02f071a954df4247462825e61c4d4bb42a9281d8a672920c12d8d4de510031fab4ea00000262c2000860ef51953694410d56ca416f251c4cba6a08f182098a5a96c61c140f9ede13a811627b30fa0f7206048beb003b84722e938bb1da45800c9ae11ebc800b26df34b5f1c0964569462aa4c9b15bdd4080000902787109f26792ff039b6598a02cf9fb5b4951d4c58ba1f800034722aa420004b620c663a169ff85172824779420551ade279f8e551b07148fdc33e608e22501420b51ce566f9949e060151018106a8ef44c0c00834fb43cc88a9d010004405d8bc73a7111a8835ec6356b62bf3d8d2af55a18f0f81e00005264550d40a83a000a4d20387215301000941106b09f0affc815ccbe0c8eea16d6e622854144d1937e37cf6fd7a27b3102d7de9169ae1f1f735a83f27040a1a90fc71fa57494a5a9f1f81429f93baf0183b97c8265dcc42519ab5d7a522379faa4bc287bb9dfd9c0d5e34e91754d10607231dc49586f813da42a88119b1d4d19f1893bc47db287b400a42ba4148c8392f4845c5d0fc0002001c2015a4a4bb6406047a1e6b97e95101397ea621fecc3044fb42641bbc1800f49d6dafbc05032012186e6201003111ea99fc79141541514c5d52432fa0026f5df0b69a146d5aec05c06800024c22a4621512d0a804c53c1429c0281ab9eb6ed6f7070884f260fcc2860ac89381e1a80508734904f2e788003ea13f4f5a8701d5986096688500648d90e5124450407e6a5a75464502836e889e93aa33a0160163cd48d2dcb0fbb5b8798130)) <<< 16000) + 0xb7888080660d2802a3caefb72fc184842419ba72bf09281083c4cd50d1142681775f382a591fa8800002f8d7b35880007a1201c40dc151e6003495aa034a5ef6be8f061434ba85080d2658dcc1eb1848197dc08f24000000711a0130811804000050c8a682fcd4887d869174c300326a44d7634a069dc642828c241f5af7db801c10533541cf44d02512f6c7d392000009bd21040c87042a02079a1070d0108d29c2aecf7a1a4c3eb706b6309107765064382092bbe2a05000000b36f93021180400004f48a604852c2429412149090001a79b2222fc07272c7983df038c718047930970c30eabf6e0470401f7f79828006d2a6e9480010c5ea7f0402e384400800017022902ba1f78770235b458c1542351bd0286e8ec278c731210bcad75ab7440800d06f0df61043bc627921c200053355e3e808002f3eec0b601401c8824290200000f0912825cd7e09af73a5f4391657ae483e259248c50a48a4025802001802280260b00401a000204647fc1b2c10d1c47908595d1bc36443a12041c41431021c128018010423fa9a154f460de4863c7f98ed11496cad324230180055ec1aa69ba74d8adffab0b2e611e3a500021220ba0b05c01cd7e09af73a5f4391657ae483e248e3884063862821822000280210ef8bd51656e43df250c9e683fd649a943598dc6e78ba1ed0001972001f8a451cc735f826bdce97d0e4595eb920f89641441231420e1120900080380401006d10a4bf52e4c5087e7a376944880025659d8386080e2fd2648301aad24e630201743218404fe1503d4c0848010000167323c6cb770224e490e3b3d0c2f88e40600490a779e0102039be4f054688006485c294e981012545b7db12009c0410b5309fa0c105a0580001b134405c2bd2e0d143819e085203123cba8e0e7491220bb62227fc1025226774e3d121af3365719f101800fc6de720a08ba65b498a0e0014c2cb493bb4821400c2880c1dcf69c1247a2771606891451af69450802443f813397d22047cdef0deef24340dfa530f720307367b777e180025d8f7f5402cbb0ff53b3804280180000f7901c0180020d10ce094d7e09af73a5f4391657ae483e248e48c40a30a386202180080b80801006d10c2acdca8f8a1c08842029f12385e63fb48e24614a24023b2408776a77433c50c001c0c3620a103695cf86b2419811e47dd43800375cc8c3594821380a288382ebffc474a9238f8587bb4416c918757799f5c73428a1c03efadb9d02044ebee1590f8c101800b69a2b0b009064ad33cce4d4a061828a713e0a7103821881e000083080020c1146018a28080015348a20c850c6428432141190a00884fc2427c1213d0909e0484ec24274021390100077511384989ba2c4d90626a7b1343183592c4cc862643b1311982e8ae88e3f17ca4f2f60387fc3a57f1810310d1ce3414f02a2e801dbc24c100222818aa026627aebfa3040498703fe1f30ee0f8e97362967c724a280ac0e11f39ceb9b5f47c1e6dcb0800464a42a08496ac76cab1cd1b020210bdbaf1ccab8c25352b3e9bc8010140a350cd569dbfbb5b610d8133d0a05724c360fbc4cfd157c19288eafdec9c82787eb53e0cd8ca228e2ff0a4708700641c58b2c005d31c41207a6b81480024181d00844e0bba810c3116cd0c2c08ac04a48c1068021000010040980080000dc89782f81c7b52920af3f362001500840c26450e38005d5d9100d6d8becc006401000011c43901425c02000136225803aa69528b3bee7f37cd55e349a5c4e511b3c7311de0cb375e8e5000000000000000000452eab399266902c9f4d0b726dd86451a7da4155dcd4e9acbf5eaef93d16b328ec0963430850f28d28a28908b00216ebb85c4efaefcc28e03aa2e4ff0cf3672a79cb8ac16375d3a15c8997e643cd063068959652fdef65b508038f048418e56041d6a8fbc92e02f247ef3f64c1ecea2a1a7950004a82000e4c44b447c0463e5eaa842183c01080000802200420c2e9cd0147286471000e80400001d089600e8a9a20ce9238052bb17fc003f0d14bc24c207c01000014a40006188958880b044254221290d0001231c1c1560dfd53cbc4ca85e20abbb7a47bbec79eb72766109f99807142b0a342289630f3f20c7b44172a17b5e29b0793d2c8f9d1dc4085f5acb2d4ce09d5315c1b5113c74e7f49c5436155d2d99d3cc0249f161e79b2bbaf96854f7b6bd69a7516c9dc7e52acad2e6c10019ea7f807fa215528c147dc10934f89abae71c47035ef17b32efe25ffa590c3882dab08366d87377fb8dc26b02b2126214a000136889412c49c67b011bca4fe4c2d16115d2329fc2a8dc10531f2b414c7cacf1fffea98ffff5503b97a8666b57a782d08e4240a93803967d87b109c37c4682a859040e58020010022a00ea6fa5e55d14b2d1dbc10ad876fc592d48021a09e0fbd9c6c6006e7da67f69fcfbcd23532bb75c7469276e189e9453a2c5973f94a61b86050003d5224c631252d82114c49096246330541509104c484162400311f01c8c190db6a40da3c593f863ed0e718244124453f8ec51213a5c2f60544821ec83abd2331413f9c7f4fef51e020c2052baa80a0126147748858013882040b40f1e2955704291820412c82c8a25397b94692087d2df9f8a0acff384a012861000404280400023040ec4623c1bf16b9e9e071220d35b469144f8608d48202886cae40f0157a42ca1403b5c994c01098607c02101a18822b8142b9215aa01859c7f4aa8804139297e8c093b4a463a005b1ca9bc198207c02163031804071c6869846a618676deff0c7)) <<< 16000) + 0x01b1c842594041f00444c6e77a3b058cd80309c471a53fb8ac9a0450258a60400db1a8404a083e0100000fb20003c844743407a1210a010001b310004b022381b03809e900a87f6f8d0de8a6da20e151ccfede0c2398fadc06804fdd5e54901fa6a6128403b4354a2001027241f0080320080005d484394c46c77b4867951799e4f9b4867951799e4f735d41effbba1c3535d41effbba1c321e09208c0980100060088c409b0e44146ded0e7b15c31520ebb7af6627840f06d5c79dd70bfa78edc011c5c33c426997051051940a9fe6fe96050efdbc7da271026f8ab35103328c9cb4b52eda42f941ed63f7129ae56f32ffd02e0e806ed9caf7cf692c1bf2448cb05349a1f680022d111a3588c98c460b622e531161d88a84c4501622603a161d1bc84502b5d5b1e0a081d636a6800a0242279600ddc831800128c0f00428557dd6e7140b10d78e0282301cc2580118a0f00404380400017a4448562221b9aea0f7fddd0e199aea0f7fddd0e1ada433ca8bccf27bda433ca8bccf27c0f2cbc92fcd627e6d54c7cacfa63e56801e9fc2b143c8070e95e4f455e35dba04078baace6499a40b428728214210140010311966bbd434549988106c0a0d315b046666ac46fca0058ff92e3d72b4ee7c036821c3d829e10a5bfdf0bcdfb1c71a87a14d46593bd9f478031a2bb897f05d3511cf891d14846900b618337e718fc0362ac069f5163f7a0e0c17a2ce99d3b35d738aa0844ee52f401d7908928a285814dafb4c31deb590c801ef2688bf967e2356bd5bd96e36109f96ad6909fe938f83903140198c7f75ee2cb789ce18b64cf2aefbd46e624c3925a3f0dd18695b0b12fd64b92d645a409d787c63f4ea33e86137508b3a2cc5d60f3fb2ace91ca52f171fa9d81c1bdde7c14f4500695958c547f42ba92aff20f2238d361413947fcd2366cb8ea9a9734c29fc8ecc632347f0e20f5a2f3cd03b9af7f4044183a010d1c45c425081f28a7f84705ab549b0e03386352c24081c00844841d532f081419b15ac2023799181cb04178bef918081c0ec865001e00800c00a240796c6a290108196be8840571b26bd11821000400002a08000e610002ac22202210f050001b4910e010004a71000e28221a2310c0d82284e6ba83dff77438666ba83dff774386b690cf2a2f33c9ef690cf2a2f33c9f03c2c9357f40d243e918d532a500e914cc5fe08a98f95a0531f2b3f589f9b5b2f24bf01e70c00d0c0cb04304f000121289bcc91d8870365bc20598cca55cbcce2721ea0630d00fce2f3bbc6b8166b0de09f7b13f49649d4cf9955ff4d6dbe2b60b990ed8b49f41afc45228d70bb3724ee132a080d4ff53e6e3ec878fea4f892d8c1e5d3d8fcacd937acd39232fa45b878214250e3d2e897e0d4b0a0100ae50a2604eed27ff0814fbbd14c00120c0f004042c07a22582acc86049f218f408174b87c0a680a86f376900044ec2da0004a383c01000010122140a00021b2212521081d01280800204087b9ae84386a2e2c9e42cd62e7a56b865542c9411756628724fd88e20c682587140c14cc100568f7f235941aaba8a29983ef9c039ae33d00b2a5c28157e4d0127da3eef8ffa74946ae65bf157fb0396446f98987ef87f664b94c0ba300162e2b2bb65ea75e660786d4d8523635b53f224eb4622a675b353ed110039503f52cf8f8f2734e36a77602346a850dc7316b41061bd5247d8ac08004595306f9691536e7802da8a73f137c9560873fab2428a2ff63efe280104b928c7668539d1693bed92d70319db607e95c37bc860a0c994f384c20000d02441cf620c530df1d88284c41017a00666fea4b00a93e5d05010044b7200009900e8022c0933813a0044506c01100801004517d463295402dbfebfc9020e002200002008c3118102e6080a941d7231000f80400001d8800059900013f22061a102050000d3110109d8114bd22f000211c1d00800002c100029a22001b0ff0587f02e02de757c90022283800805b0dd8a2a07a77202d8847a716030a41cc40023181d00800005410fd01e8ef178fa98e0a9e8cb5c6001b2a9a890043044b7400012100f004000036482c1283f0740a40200027221f66302905c8381f09b615da214e862f9dcfb6e4c6bafd4486466ee252824072fd8f7ee3b56d8a6b497eae905f5d596e4091c374be5dcc99ded21e40099d44408066da13546b0c9bec4285d7dc0343c2fa02f59c4713dc3763bfb630430a62f8ac6921d2f7dc25f426176e23118e32c63c000060da4f4440f29fc8b3182e83f181fc170e62ee8c293c42f40613a918c2fda0ec2828ef4bd135f67add1368749f79fd1465724b5be45805521b5e7952c04b2217806dd36c1b8385ffd5c9ff81d6a9e62233ed69a5a90a90a57eb99731f8f672cfe255800afbf222da461c616fe995655fe82e1e1edf464d02a427672d13ea2304404afa52a98150becf9414f350e3f9bea152db446c1c708c0e60d379645d0eb72c34a449f2507b065809ed0fe4eb911a6684e6853a3cdecc5e7f2f000c1b86ade1e22acd3fb7eb404832c90624ba60c6ca317e1ff2266bdeeeedbbd04c04c64f055c8c795d3b29db393efa5b30ac4a3ab0f59a3de7d0d001fb244f54059b1fb9155896b6a874d26fa4eac0474c58dbe8d75efab740db6d339960a54c7621e258cdcf6084d5400115adb1e5bc396b34ac4014521140037f941685c5ca5286f7e5b60399924b4bf8e2ef832fd3d42eafee78ca5b14f00a40a00076b21f44a0f91107c08c003a1487b9ce84ccfe70c861459ca6bc3a213560dda9d7c26e525b64421)) <<< 16000) + 0x882f68438d19a661ae2f9834451802659c515a309a3bfc501b03146c9b5f35e4b1c4cb5d09b7f3302c937b2c4fc5fc59ec710600d64af220b6ecbce2cfe9cf31da17d82b3219deef16959d4933a27436c6980dac8f6a87a00210903db9b043a3f6bdd0563b4033cd695b98800cc9c7c613e62bb1d2826f058e8dfc0b28000e90ef1c511449782c064377db9519111f53f46b091551a461e82eb244b5816eb9700550a180dae67ffa04c90b489b36f275907b783e10dd7320c443f255e2d40edaf744f1a28e9fc0001bd087b1e83d4641e82a001c5920078764012df482e84c1700782099b246c6a9271b455ad942a340338ae87023e1d44ee12f77425897b3edbf6141c0053e6b89f19978fdc78e503280475889824a24ff8f7b798add373840a9eea6190c084bdc8fc43b0aa74029d8e8f7801dc8f2113a7fe6ea5ed6a31c8f897e1e8bef40000277f30d016df6632cfe5e9322578a9db26eb9ebc47ab28e51a50d69e9f7dd90a47cb0122698fd21556a4ae4d7b3fe86767adcd58a9d2ab82906355fe252ea3a8a00061c54f176bb65f231c3d552d5ef254b1471cea6f6168c52d88bceeb46f4396bc900c575f480584db1dd9d5f1b01529c01008e34f6454d7c3ae0d8d6d6370fd58ea88b977cf04d0752e3105d1ca4bbaaae26f754eea5224a88f65f6beb6331b0801c23035bb582ee60dcc47f9a42e4cae778603f2597275fc525e9add65bcbd131e6749203f19ee984a5e21ccff39ac56f33dc6d7e1cbf0838bc3d8f86308c71371a075c602dd1abecea640577ec8973c8f04054439933f434cf8b380c44cab54d9c898a8201034fe8ca36ef87a5b04f057f3f21256835f086ced8c2c9ec3212583ceb0b6e040045467dd47e2ebffd9644ab515ff32757a200428b38b54007533f67a977a93440007c8ddce844e74c97d7500e61612610a936518d65f6b47e286a642a700c983ba401dc645c07bae07c8c80f87d284b10c068fe4faa46f99e20ad4b268cc8b9f26d8b1cddd6ddc901468e1d282408f38ba9c000046483e010e3d4aa001a8b334a80535c07596fee51abfecfacba8c81d8f54711ef1eff3fbf8785b03b3893754a986946ee7a2c4effd8c74a461cf2d37f1a75b1c2029f94ff5603b620e18fef48c18cf2d53fd79f144a63954f96950c4fcaf586211a2b5b718a3a4c9abb657327a397915784d1ec973faa743b1f4478001be9ab3dbd4222af55452f5e75a6d14d6d677b88af44cd9ddff4c44d3f41e4b447ed903f1117ba8135cf1d9f0b4299d5d1743d04ff72fdf9cef6b813b757a755af9df2aa5d6b34a9938dce1161d16f803ea06a41ab8d7d7082d180728216304c90067cb22bfb5a8576a19611f326ff8d91778443a6da8029010003c490e8258798ec3c8561e2230e60de031b80d2147062d3b6211e031f7cfe52809efb2a50000000248783e0100000eb21e07b0ef298098ec3b8261da0b810008022030020080ec1907588800013087510c3a45702c0100400001110e82987384c398261ca13803cf409b9399605b1661f97ce92030da2423c9062e49e4bfe5182815a1c2c01fcee686c32a13039eb2c48e39996a042e09b2ffe5d5afb7cd24ccceb3dab07d34928ea8bbad02c160e2d85cf8ea85b418058db17e7fe3036f0e60d68d2be9864216bd52f45cb17aed46417ffaa579cfc191afd828475c33a84ed329ce956c4314b62301ba0887de93c1f51188001eb5e65781f737d66b079f1a59fcff0a3f7ab8abfbba1b066604820f371109ae8bce6f4e78111f2f29c426e390d8952d9bab3e3d2030bd07e98ac01463cb062cad7f1530d226d51b37465f395d013d86addd939e178c64cb6c3d606e15983f5b2f89ba6a307bd7836fdf7d88c8b57c6e02698f40b48f738b2df830a125c6d08fed654926a4af8888960801c803c223f08f972c1f4d77464a011a6c68f240bdb5cc2400109090780200001b6438ca41c4420e11d0700c837c541bc0a000a482146720dd1506e08836c440017f668919f63ac60134e52cb6328cc383b1fd3fa765d1fe6cd4a67ef193869c4704f0680f4fb224fad95e61ec91b4f2b4f7d9fc7039ead467a3870742d2bdd6a890a6080168d36e8dff3ec4e6fd9d6246c5be8677afdc39c787aacbe8fe49a80a249100c04d0e91c5819b8a8bcf5d3285f2311b963b65ba5d0346352eff7db933ef7a700100100068c2492b684c424fbc1a52c28eae6a57eec98545d86921d4e43f2a1a249185400f377c438167679f3ee6a308e1a679cd2fdf820bd741504fee14fd531ec21fae9ea7341c4f27861f5e9252cc39db4af4b18a99a3a0441b09698308b1ee6c800071e2003afe4009320d23000490f1ce69cab2effef7ecee1b0b61fa0580ad4134000000000000000000209a7d9b61912b727027d3382a448c30410428008000085ee55dd4607849e8ace701d926145b4428ad55d77531ad944dc80160bdcb33c362bccd9b51eb955349e2e1a27459c4b161d0b5ed0c9e5ed5f0ae311935989d5448b74addc545eb0c20ca1f798f49000911ce446cf1560a2d23854c30282d047e5db0993031aac99456500050720064b04024a78d1a4c3b63296edf868ca12501df4e4e6d1d3db2a2000000000000000ddffa4aaa77f5e9b5922aa9ebffee037db66d52056c313228000000000000000000000000000000000000000000000005e4595eb9373a5f43935f826b8000000007cc40c600500101001440114020b85bc935a77c894f8c387dc74ec5aea035730996c8715dfb528b6d78af17bdfe75b14812eabc04ed52749b5d03d0c5f5db91f)) <<< 16000) + 0x6feefebe47053038ddbd3eb95278e0856f95e8eeb54412d3324829bf99f3a83316fc8ea8c5c3fea84c650d8682205c8b3fd0fca0dc8635a99e2a17f6645ee3507ec073adc2136d55605b6d781fc1dacdc13174f7d2bd5952809f711c60562a000fbc4027c80806098980b4d6afda99d54f796aa79d1d8385750cf6d56babfaa7d686b7bd1421e5eb1ffcbb3a1ba3f10dac9840d14ff4276614911ca858adb2840261b6879c6a9bc845e2b6f5b40220218da254d136760eb40f7b7081193e1e057cc024526e93cf7ca408a2e4dd72c92b7eec99eeb8e23bf11d32cebf61762a43088627f0a81e627720bfd802a7ce5a39e3ec4822b2f24bf3589f9b5531f2b3e98f95a007a68654c5c5c54b8d44bdf415d9bdcbfa30bffc9dc00000000783dd2bd085071040c504800400000122f79431f3359701b80e73a7c417873693c3c97cbb4e529c7bc64a701106c394163e90d1c4e36d33b992f05327622bfd0b8197cecdfcdf9967737e25dc6aa620872d06505c0b8108a2a828947a6704c20612506af2202a392225230067ea7d7200083aedca000001314100042c5654117f42051f1d05c8144d592c07e1820bd8da43101260a9dda004025242000806d0280004908698680e03400054c4364c60383b911cf40f0a471047b45ab040e9a0317a0800e9da29a8401374cf2c810083b435e8000126282000806c00e0518307946144cd66e1b5103118d5fc52c00ecb38df14037c455dd0001a02063a0026142000806b84c358078330ab2db192303bd86f38c2e804c7b58a1223859ee92086e98292004a20400100d509e0d070cabe648c034ad18e30b9ce003f02847317ce145821f206a3410032bfe160004c284001000013320762200027d21a8220d30501c0280010d086918807c941a2120d0050002fa90cf390006c190ce3d82700f0691fdd59c7d0a67ff3096b88baf6a43a03673afd0a8b02c44d721cf44677e5fed0b3eb6b0be0cffcbf61aa5ee0e05f0e98bea0995d9561f5cbee5086f84150e22eff00bfa658fae604982fba9f71b654b919930963cfd0211bdd4280d13a44534d2d9a9d3c7c36f71b91ae72228c39fcf206de4144e2987dfed317c490b28f9da5c5646ac7a1f142808a000a2c908f458806dbf9db44d6904e3a992e0c71fbb6e97d286ff4b578c9be7931d28b591008a37928784a3afd5b117064eaf190eec76881bf3820a3047dbf271a6c69b2fe1279e6ad53bd4b85628489c4b5d92f5bbfd44692c4a20c4a0c591da39df34b1b5a1c18f7f81d6cfb883316102ddde6009ca0c0b4fe1546eb08ae91927f261680d808de5083690cf2a2f33c9f3690cf2a2f33c9ee6ba83dff774386a6ba83dff77438643c50c12401c0140000027522c72019795d770aedc57976e1e20ad3ea6ceed897350b0f254d022cca705d5e50e5d95f13246a63e90d7ea88f6b3e4ffd43fd69e68b59f9721b5301516f5162720c1eeace966e944313144ed0eb8f06286704a00c7506500ad1d8695a5c0b5d9b155c106d6ca8629716eb7164ff947817ac4c0d7a8d890000014958a3e01a35674db75583a7e9b145f0e92893223271a7c4fe55efe8dc84358c9069deeceb7f72d87146c18b033f5eeabd3fadf9d5b7089fc1658f23732678bfefd1ceb86bf7c171897096835672dd21e24aa4998820cb944ffb9102c000005e651a507cf0337992c60577e86b7040c3448a8932c810cf062bf41081818f66a6264003a481310f00010ef9bb894ad4801380e2086c91db1d64d3000000e10040da64256be71867176f48a39808a4e3cdb98a047e427f12e20050f413b2d0c07cf6a33e80007724b0ccae44801280e000078086202c30c161840b0cd0586602c2fc1723912d2d42fa838e3322efeed81c30000017bb0048aa38cff47e81810d2e01e3c584851d57ed64e494088c9577a6501821a544d8316820a16778b3361442400a80b123ca7000e1951c71a0c92517c70c000005eec0914146d4fa71981059d1094e22812fd674305818204b674e1101051c8b7a43f1801e43c53b8ea2900270200000f910cb0586500c2e00617803b2db91d31086102800000fd200b27e5ade8934092560b75ac520e1081b183b8e4e0cad4113b734b0c86cc4905a030e92f25df600d0144ba6a0dd2889002802806480f0caee099be92258000015180c29ce6722928514a84051b5a3c5071ef97719e2117f166ffcc1059dd8603c208bccb1d180380255dd68b16d2004a030f303a9393abd461847faaafaf444b04406ebe91185527a1b24ecca28bbd3ddf43489210888856343042029cd17d10a242585830640e0c000006a31b954801481400008188001ff9e2c267260be480c1658c21931fbc28c2c9938b53f61cc607061b886dc0be9f0b0ca7a5dc31e733861a3cc17c9642f820104ce4d7fb281828209e82e6e9a2d4d005c35e94a1d204cc8048019828032007e603c8c6e21134186322a28ab1716185648547eb26981e20e2c41918e4218218b6016c0b6b8822fb282d710801c101e4647dfa9a0c101ee0ec541149c00ecdb906afa072c02400c0111e607cf6905d80018616a197e4174a18561ba7fee39e818236494f89aeb488222dd743acee81c1829a7a2e18000e10a69e52e30000c1028b32464c938400498c24325a46c002400c011000049840012cc8003a698960000054f48716176e410048612176e3b11884921d41a01cbc48f4044d51e5a7060615951d8648221b30f9e68102dd2082118c0820ee10e93b14490028024063808318041640200023c20e81a001000218a020014a130435d92)) <<< 16000) + 0xe3d821e20580000120ef8e207066206769c2458c03bad92243a8611c64a51387f01410237a639a41540024299244acac10014248c5434e8003f74b644f46d44df48017820208362c41ed3f7b502c088c2f9cd70430d4c322876449a1042a42f3bb5e958818238dcad6cf38c0805ecf8e207946021377f73227060c0217a07170e92000478c907f5280b58c32006208800025621880b0c30586102c304161800b0bf05d1445d49d8b84118b7a6f19c30ca3545c010388000001f4068634116ae7e5062fc84af72187d41398af058422b64ac441044ff569e654900240145152852c4df2a6410a9f64dee4fe30ca18230046443880000018fe7068611bcbb1bbe65844b93b296e241046e8622c395808210c093bd3da6805fa0cc94d83fff2005806000022330448f067781580c3169fdbc5bbc14280732cb21e81a18885069ed331419cd3265bc25061a73d7cc27ad96105c13777e160411129a2ebd6692080133273d1c6e44801601828a505191cd91904459b742835c6191af4707f246861e4bec3b7728333ea29078a1610f9abb08308208ecddbf10bc68200000298743401faa375becc6f20052050000206200088842f82617a0b0bc01e9410231622aea928aacdee0ce7eff10421973950947c061933aa5e07d320488039605f5dd423420c7e574729f814110a5dd93e9490208f953f576d340600257b07ee5c58fff04801882202ec07c58202f6ecff54b2e56621e3a2a449253dff4b146c1c73e22624e90c14280726ff62868e0c2a82a828820586314896744680c328eab40146a1a005505549e4931392005a068e2c28ad99fbd7965cd8ee3eff1824945dee304eb838e948680f94a08140d8f37bece9619398568b0c71032cf2b94e94e1862bf07f16f18d0800000418d47d09002b02c00010c90004613134000008bd81848822b84b59249f6f732a29838ef0ac5a8580515ddb8ebd5a0c182b63e0ab32412512cbcfd2102cfe94139201047b84cf370644801381002e8041720200021d20e8120b8050004a410b7010009141001775200616e42d8a70240100479e3c82f82159e500000064b050e08dd14cfe14280059619c828a65cdf3ae612180c0d09d58083215e6146c9e003719668e418009fc2a8dc624009805008403821010abf526e081604705988bca30d01b150d1630508089e38ec7e46040be7a868a703022e9845ed73018246724aa6ed008346336ab79405800ced5329357e61200580608218a36b7901a81608abafc81c40c5becd9c53830cf3366ec0a6604267cc8ccf83028ac24253fe18284cda63ef808373cd40649e180000007116182900280240000fe900043c216a130b40985984c2c8261620b0b005c8e6babe31976038ec5bdf54eaa050a00e3022292048802a8fbdbb606062c889ec1f0c4862559e7ee6d4187afbe4f9d84a5041db06cfc20810446cc87dd7872009002c03405780c2b80764a99f9e1a3a812494e3a5cefd8183820c41d2a381630624c2d4ea81c28656f44e3ed1629960862581b0a2ca25325e3559820439f8fd89e08213ea99012f6c802400b00d164cca743270821503dbea68247b6ece8f000da36dbd0007c0100001986cbe46153b8508b251a608a32f92495c150596598d1c0000062e083851265e848d44c112423cb29b61c4076a9825a60411a6f9b09de23815b277fc0dfff4c80150162c9a0e71df734400b601a23c0013dddf128006c044b69000800200001a24000bf08003111927b5b71e4513183895ee8dcc0c2473c6189cd7d638ee135e8eadd0c0c95aa9243231412575fdba0ac0827c9315fedb060237fabaeb09c8041950c7465b40b2400ac0d123d1bddd8a9a003d004ef440040010000079215a020ac0100016c90ab0d85504f4a08118b523aa89454cf8d0ef584e8820e16ea9a524a870c039605f5dd421860017d916a4111a185eede4a18214a0c7127f24cb6da1866f2dbefe863330111cc9bcdae0a72206400c4111445089cad192003c9f665c4004001000007938486970126548124d0780250eb412385a5c9a3c4a0e3a079ebc41380c282325657be2121170b6761e9a0611979d72ad4d8410c79e48160b16080000094abe46e2400b00d01520300023921500bd2820d4713151828ab641e33737c482108fee7600d938601d2ea5ff0006180663e15dbe0343124ac09a2f64a0c3d8f53c299b0c34aac8eee1b84c046dc087e37f5826f2005c078a2280253658e001aaca7e49000756b1ca3002000800005290a701f16068288cb0b725976d0689b040b649256a2646aea4a78e01725832d78438e0ab0b9de8b1a70821652c416ace58818bd46b762d82087037fcd3c1fc68221652d7a973bbfe520060080b2691b7ad5cf001cde024a2002000800003c999e00000318ea0e2c34b807ded2165d0a19b6daec2c9099e7032b8849292b8330385081c1192b0c0361620df62d4f9dc14449adb31d0c22082bc59fd4efa372400ac0c164d2362bd19e0039c40ebc40040010000079200055e40016a48004689074090530280039a085280800690480109610a4050010bf100569321465b01c2982a0ef540e02964e43d6f0dbc9de7a50aed198214550689a2a8344b33c5166ccf1459c079ffa4aaa77f5e9b5922aa9ebffee037db66d52056c313228000000000000000000000000000000000000000000000005e6cfb883316102d0b14404900500007423f54b680359cfe2bb7a9878edfe77f63f641a5becc352500cbeb2aa7f4d4be21f8f9ed3e167e75fdb54c80059dbd658e8a85def52b17ad09b7fe8d5)) <<< 16000) + 0x6b1ea62c35e17d6fb478dc6259c7469571fe223076c3a6e26f1651faaa6d89cc8b13665aba21456be1ce8b0b22103c42fda26724b36ef596d7082666952af07cc45ff0086ab69edbb5d91fa8a8a1864ed13749771213339294256b3e2164bd857c74789ff66a36ac9305105daec8fd45450c327689ba4c2fe9aa23797f563ae9cdd65279d6787aac96825c81ed2dc000000000000000079806202367dc4198b0817b37b97f4617ff93b9617cc51c3fbd42ea10a9828e18600000014d5482259fdaa1309218eb27fa0fdc6568e725b9a72a86f4e2c86819b17a9991ab0a2fdee20b9475ed1ca8957914c96fd8d7c7fc01d708eb78d94a8bbc8cc5974caa7b4acbcdc187a1d4b2258865582f3f09292375aa656dd7dd4ac81a09572499b20ec92f17882aa5c5a581e5557e8011080e00434637a57efc4082c36e44ce08009049a8415702c1c62000147e23484a183e0100a2050000899091090508080007408500ec27c6613c2b09d09c108c914c087102c00000970834a08515f4ac0b203209984a02460431096ac0618f2fdf61ec40255a5aceda460859dd7efbc0c27f2436919644801300e20846beff687102c00000970869411de57a0c2c80be4998ce123017ab82fc0618ea5cc6d00804a8fb9ae6318216775fbef0613feade53f64900250180000ef98211b32c84040b04a0d93590380312af286187d05bacc40a115c56134023255e0920c11ea09c63430969a64f7c20212835c72a4008402102800000864d281c53b7bcb201c53ae5cf10343206f060d31444ab830fac3c83c8001842e49d6e0040008000155200064e427027e48000008646120de284298a10d8ece3e210534126de71400378a0746000713c2491130211004239b57ced04a84380000000009a869cb82013c930928730314208210100030080200d00011220a80200027921361b07a0984d04c1ec261320b0980584b82e39b57ced04a84380000000009a869cb820140d30918640234124138000030080200d8e6d5f3b412a10e00000000026a1a72e0828fc76c49315a96867b58303aaf1def5cde7037f939a49ced2000000000000000000000000000000000000000000000000006323cc1c7445382282041440b80008037cc107da10dfcd281cbd14c6044803e85fd01871d16587ffcc4430bfb1842c8e09391764c83041a0a25cf6c0300247b67e5bc8800260200000db900046c3c582bfca30b42cb2ec3b2913c76c69202a3e22062a30528dabb3732812283b54c12d300514fdc90391ee07027a902cab44040005b3120ff851200001160079ca5f89002d0387161bc46fa1658c08084461204266a71a2a575ca24903ff28508080018bc68e10028092bcce003c0100001472030030003a5300c010040000111b2f8fd9505e2e85900b7f7f78fc72c717bd1cc4649163104478b72ab4c1421a35b6fb9828a90baa334af03830eedec39fad20002b064ac9fb05002dfc41bdef92fc4801681c2613344c3b468335ff8081a003f045e8380232f09004001d6012f2800f00400003d080c00a068028664440c35a07daa879a280000037f201085cc68151c00456c8c968004286a01f094c084802083e2d7b7cb2beb0f58cf48f0e1e3925cc00000000000000005b777453f136735610639b57ced04a84380000000009a869cb820a3f1db124c56a5a19ed60c0eabc77bd7379c0dfe4e69273b48000000000000000000000000000000000000000000000000018cd138f3071ce18105102c000200df301cb1c8070d02bf7e3503478314490012079ec030069aae652800e80400003b88002529000606300c0100400001110009b03228eb8e5a4c0c0b06bfc1055eda0b0241515d2288800195cae43014bf176a04c183a0100960101c00800051c84a8ac25027e600056232ec516ccf1c627c6040000014fa082174fd60a61e088a2ce8800d0022b645db6001049c512d028e084a02883e2d7b7cb2beb0f58cf48f0e1e3925cc00000000000000005b777453f136735610639b57ced04a84380000000009a869cb820240d38b1863430c3041400b800080378b0f6b04f1a1d0bef26cd003cf6fae10051d15ef90007402000018a4000bc8c02004010000044424c272300000051f0901e600053234dcd3145af07e51f4a981041451a477a028f044378e604d5d1a0043cbfde0f300007f3f1f3540a813881c20bc0f107c5af6f9657d61eb19e91e1c3c724b980000000000000000b6eee8a7e26ce6ac20c736af9da0950870000000001350d397040489c79838e20810470288170001006f98283e54fa81d3e0feac1050358a5e1c087ea3e78700239d4e74a003c0100000f3307c5af6f9657d61eb19e91e1c3c724b980000000000000000b6eee8a7e26ce6ac20c736af9da0950870000000001350d3970404a1c89c79838e20810488170001006f982b1e39ea829c97a18aa06f3b21a70415673857870023490dd060002e338f3000f00400004748001a51000685300c0100400001110008ad376bb23f5151430c9da26e92ee24266725284ad67c42c97b0af8e8f13fecd46d59260a20bb5d91fa8a8a1864ed1374985f1db78ff964e43d6c36f2779a0f1171e07d46930ed8ca5bb7e1a328494077d3939b474f6ca88000000000000003732871c2381281041240432bff3a504625ab6b691553a9a22afe2fcdf5129a8e17098fb52985b85df2f3b03a16389df859fdba79fe53b292f39c4909014f7dde203c5b16317df71a861b9544628afb04c9c35fc776c95005c62fab616415da54b8ebda7689bb0abbab94001)) <<< 16000) + 0x8ec83a068248140028484244341200200295620067a4400f3d8847848238140088c241c0e40141364174f7222f45cacd368c439e0f74af80000000010a2caf5c9b9d2fa1c9afc135c000000003ed9f710662c20599218c19208e00a002bf2567ab7da784052cd104134e5e2b00264c6bc3cc84100622fb5d674586ad52ac3e354766fbc52a53b33a8d4376b9decb919a8d4b3d62cc3f4b7d2e2f8ba94f2a48db2478867eee4d29140a402aa341d1a6b0acb17cfe76c59fc00000000000000003f7fe92aa9dfd7a6d648aaa7afffb80df6d9b54815b0c4c8a00000000000000000000000000000000000000000000000179b3ee20cc5840b4fe1546eb08ae91927f261680d808de50810710a088007006000140038b26f21a5ce14546371a2d9a1f61814da815ff423e6f7bcbb298ab3f49d39584c9eb35230043572bce19a90013acbe9b3cdecb3871b1c9b9d5d3c363f3efe1dfbde3b9bf2f73805cb46cf3bfebd7e0863fe4fce21dc42c9244248a6af0adde0c467cac7b7c5802986689c9fbad4dd730dda8082a1598850bca1e70425fe6d6602a1d3c575580a045ae6d90ca72ed3fca9a602fc08e0defa7b442c01c93a359113dd2e54dccfb021f38bda4d6c403212c4ca1d5c52c986ede5e5d8b9601405ae201da5ad0f5325fb37392b87572a897888ea29693e9a1a6b341ebe4ab7f01027c648414921d069360cab898817b37b97f4617ff93b9617cc51c3fbd42ea10916184118096094090006022420515fb6b1d2b5926243ec7b83ba761f8a687e0a1d1b4360dc51bc54a000414648f10cfddc9a52281480554683a34d615962f9fced8b3f800000000000000007fa1e0715e07e05e858145b025816d9f710662c205a1031c1901041160064a671b1cf8006cbc0f30d44e04cb0a512609b070b54bea62ca796e7e4779995aae4cc5ea96596703ab0e8bd1a150cc12a2c0c203a75a74c3a964f2a1cfe8321acfa17d92070611225f4d106727563c878a66a5ff2e0f9ec05844a4bcedc99db77d9c8f9b74f8fc6985496a010594042d9926c7e48b9085634ec5f8559ffa0040006ce5ee1c259be82566e23b28e6d3848ffe008215fe09be9389dfb4bb6d48b391517fc48d267c5910d16a1d0bb2f23e525e20508901c404682800111484608820c240010026450cc79df1b7fc3b2bae442b6465645ffbbeb42d7661bba1b36bae05d2b26165b5108db8714614f164c6d965f4487742a835e154ae5842e1b528564d99fd8d5154bfcc7188d2fc4a342b3b25c43f951a0de2058136b328f0c652bf3c98896de9dd37cdfbffd6852101d61db10819dddc68e2c1be1044f66def9ddc035ce5590412f11217fd4af1cea3bbb42c087fa58d104ab94f194d371dd88888db30323ff6cc0aee5c6b8ebe2ddc00a7e7749421848b1f2206c3af14e9c18f2df21090440968304020b8a8db2c0a2d40f2820274030c0981074021c1da7a666100ec4ac9e91020e00400001cc8000d3908b0d0450481c824112020007ae21103b087198430ac21427c40000086470dd076fee9c0b35f519a582ae9129e9a06f140e8c580000025800cc203c0100780df926614b64430e69b3be81e113e52bc5241090a69be780058901da5001f0087927f80aff18492090cb85080203c04861e758809c7847390c5d1202f33dbab3000f004000047483b0281d40410802038010001421e20000010c8e187f94fd98d0c515849d8e0a9a76c0c4b08bfef16d0d00b57bf82cb00000012c019c30800200f013f24672bb734f0c5bc0a4c830e74fd67f890411b4c8c0f0008b19e12500200087921e003bca61212e3398c508004723907861c938ea41871578cdec4802ea63c233001000400004a483b0281d404070020002802106120004202104330811584008c1fc1703537426480e14b9d6d22ce0708f7f85860229ba56fe3006372fdf616006f45c0500a3061080a20507367239c860c207366d1abf6101a2e828f18859e06abe4756e881a000000b71b0004e205082c03c78a78c9f965065ce75dc40603a1b80805ae90222784a4f9a8c15081c004000076100025220fc1b8159ebd0ce28222915612000cc3f71cd0009034e92000e8042053dd86608d29225394a58a05e2cab2011112cd71405f2004a25001d0080000779815df4aacc104a6acab71418fbeb67cc0806d00d65043b700de181e633183cc003a010815435904634a458fc43960c9344b30a02e3460472000e80400003188000fc907d0903e0080e00400084641ec560f41383e2d7b7cb2beb0f58cf48f0e1e3925cc00000000000000005b777453f1367356106204382c4c2bbba234387cf8370bf9c18680726d1abfe80000000000000000000000000000000000000000000005a240a1042c32010413c03402e080200d8145676bc43c31a528b4a016a476388f0914d1c4e50262d8f8825041d008000078907705c4b0d0cae5b7cc1011663511d10469b80df11100670a486a3c38100000ea600900a669e7a393218109808123243083eed9a28fce4305544014fad34e078000003a9806018f6383fa64a0046030ead04a327b34d1c0181902024258607772c36d0c720096700d564152487446485482442481280080c00008034000588800147180a07f6c23ecf10004c6c339e18007f1eef401c8e80baa28000ee2e02e094108c0200f20a0001242000a7c41e027029402409388262002a442c315840bba504116d7b50107042a0d520000606a60340010f24613800f80420547609a50d290e26d8c5860735c11041cf465ad1405f0b5f725001d0080)) <<< 16000) + 0x00077907705c0a504b3ff6209884a3f80b0c55a2db6141045aed42341005461ee082dda621c0d00044481a13820f8042054fc1f904d291684f3a208f6a33122c312b3d929405e00d7809410740200001e2400097483b0681d414000a2041d0340e60a000ee020e41a07101000ba31001fc92006cf641c0c4007a8041bce40dc1a06d0902102801055c8074b7906c2983592c00c050347605b68c4ca2375daca1b71a2827b886167e6d314ac98985f1a4404d21099107e8289a3e4e185f80c047928ea76069703387d0a59a514048fac5cd8f8dc87a4c4c9a0f220062f9b192a4ebd6d6df5b010b40040014050f772f029f0fcb578999bcc5f3055c6fcaf15ed199118c431c51e3b7b6a0e202d63c17c40c4909ebfe384436fe1a91c10d57f7a8920468648ae80000262821008710a52e510081fcd8f6751c2f98c2ed200046383e01006a11034808190040001dc41a0a60ce3b0660d83282f88546bd12010302e076a20e10554b45e060443d468a42823502886f2408be1a00d0000004c6042010a63e56814c7cacfd627e6d6cbc92fc079529557279200bcd2c916717502dd0f43a2000000009e8b5995d812c6841f42441c410318110002d39f82d3bee8b8ecde1b5965cd8f222e69d3ef38e9800099e6f6e265b58320f3c2728c6a78c0aa135c152caa252832028000cf883194818834000992731b9e2209c00bce2e807d25402dd812c6869e8b599497ebd5df2ee6a74d42131441820812400c008000878e3afa570b5d0484c8ed4432d4f3043800050aa5694a6fb1c006e4a12d27da61902106aa0004ea400284c830a0c181040be4305e2102e80c170073f856287900e1d2bc9e8abc6bb74080f386006efbe80ba3c1fa7d64260d1bf1f3686622a1601115549d700000000000000001f19430c29419401000e0020080202862d48818c2780d5bb981430126ff96b7a6845ef140090330bbed73cc439d32b158bda6dd0e3ef7027ebe2ac157269c6ca99257dd1a570d5da40d06d9c6b61a8501ec5cca80fcdaa65ce1261f4c4c77ca5b729635054b435139e12f4a569679aa286174f99856f5ad563dc69707335ce198d18ed024f4f1fda8fc7b7e5c2f199e6dd9492520a7cdfefc0e5850b88013d35805de3bc6de95a88b30e9efeaba0277dcfa2850652cbd57dfab55d2f3c5636b079c699601b6be589000000029c05333c76d6b5f68f722d8688be45de1d6ff9e95df119b2eb566d26a8b1d38f1a9c18f3cb644fac67f0e088afa803ec442627b7638b0aa7abe091a28b9a9db2d31c2de3d3b833c453497fac61d43375e70d432d5a4f0714abca9d79412423bc24384238d5519c05326598c380c9262b982007fcc3ca00013100f0042c50f3a80f3045551418244953ac7f241389a4652c037a70e4002a2838008c13309efce6020d81285008840740200b6120000903a1f1c5033c4061a1bbf194001e3b1144817acf10e80048303c0100000d52052020002a220b04a0520100020a10512d82810c13c1700acf73e5d47119728d778628c6b7375a3d5aa114beafa36d36d4421b74a1ad61b0cc5725688bfa3662edee8200b5d8ea338d505f91decf31beae287c000a08612712b2114228b6da070371f04bb1f6b9c52919a9c27610aa000002338c5048ff73857d3704e663d4826c5c77065013ba6df285f5181b697874756d6e0cc6c91416d141a93b8a5d3ddc29b165907d0fb28bea96028ccb97c7a3b0296f709526ac095740102ec08ec4ee3133cee6231574e87168a82d1e580f66e50a00884074021c731fd02960811bcda1489020f802200002008e3cac338c90032de4dc71000e80400001c8800057980400802000008882d82800064c82d0ac164270479529830a0266cb503000221c1e0080000411e00010704258121ee530240e06d6db10025ae9a8000024201d00800006a90582502b8881481400083c41183408a1a0009f120ac730551982a0af421c3503986053b5826d081f4f0160cd02f691fda1801a7f7d780010949078021c1df8352c258402b94288e13bb49ffc1853eef45300120a0f004012807c398d10ae51c212af8832185113c1ff0b014957de980048303e0100000d920a622052050001031051298280ec13c071183fa763d46043fd0f0d01028cd9e624230820008446382ffffd01835728453060084b62c604f023a28140818bbb7094107802009c0b00010b3c603647e7871003a15792808997d0a008c30780200001484134460980bc2087c10cca0c16c992c30658f3b28102adc624f140226d0a600025181d00800007c904b01d31f2b40a63e567eb13f36b65e497e03d1aedd022f27a2afe403874cfe158a00f669648b38ba817b4867951799e4f9b4867951799e4f735d41effbba1c3535d41effbba1c321e21449210a106096008188cb35dea1a2a4cc40836050698ad82333356237e5002c7fc971eb95a773e01b410e1ec14f0852dfef85e6fd8e38d43d0a6a32c9decfa3c018d15dc4bf82e9a88e7c48e8a42348050004bf342abeeb738905886bc70141180e612c008c507802009403a161d1bc84482b5d5b1e0a081d636a6580a0242279000ddc831800128c0f00400003f882488812034000400411c5408c120450500058b10443902194810874082120400500077f90374500127299aea0f7fddd0e199aea0f7fddd0e1ada433ca8bccf27bda433ca8bccf27c0f04a0450470060030045881361c8828dbda1cf62b862a41d76f5ecc4f08028ca054ff37f4b02877ede3ed1388137c559a887836ae3ceeb85fd3c76e008e2e19e2134c)) <<< 16000) + 0xb8288199464e5a5a976d217ca0f6b1fb894d72b7997fe8170740376ce57be7b4960df922465829a4d0fb6036b1340a1f6829db37801c16bd3fe7caf320b58cdda618280599ff660d8652427e86d605d089b2d7ed851928230c241b67d2f4b7f5f9ad0340458bc8cd9b872ee558060d2002c6ffbd5a72ae311d2c1d59b0245c4f6537d24743bc100581756f4f781223030e1efdb7612bc605c69f5d988508075be29b1a70ee07605bc8a7682cf72a82aa53f1b31d0002905707532ea99cb33d58de2a60f37cf965dfd650a2436fdbd508cc81df9f4be3d67975c749c56ee624ac23801f80eca00c41b1660ecfdc253ca19113e3b20e357ec9b8a20011e2a54c30126519c9c1011992e1293820f80430719e5bfd4286078f99501c6948abf750c102990cae1c036c4ec7e25042000800007f9b1a1124a7a922b86a17ba1859c30c9d658409cdf41c7094c89cd69605837c4d7198207c02000024e40f83607a1303c01d0b6d46f5cc81078c850f8a27554a6002021eb586fe2026fbad518a01c6218f68e0381768100109c607c0200002b46852f12e39d344115938011449dcd19312010ef259461416001aaa70250c2000801e00e480c86db5206d142c9fc31f68738d122092229fc7628909d2e17b02a2010f641d5e9198a09fce3fa7f7a8a010610295d540380930a3ba442c009c410205a0780001fe20762203a0d0001ad90390901c02800240081b9480d884001e2a40d4e40686a033310191680c4840601a02f090170280050c8cfe1503c831b76210c0153e72d0326032f046625062c8ed1cef9a58dad0e0c7bfc0e91c8293c148cd6b1cbd4602a69f66d8644adc9c09f4ce0aa1231228e00c00a008a803193a6e1b3e861b8229e552ef27b389683113cd7e11379b6f4487b32f907d0616404d5f341668b62ceda54ee67a986014964467dcc1cff15f2a4ed366dfa0e21a13e175545fc3a49ef537c0a08997d22481af00ac8684bec0404b3dd0368f780c408416907c0c2095c2d49cd202cff43395e20e0795bda66422df581adf64f003004766c9decd1d5725b8f9c38080180b79d35947c3cc774bd19dbd83585df80800c43922e87e26d0a764c8afd9dee0000000000000000254f5e2303f15fa9f4499973ef4e8d680842f90a733b460fd827b908f047d220494c0df3e5d42b720000000000000000ef49b0655c4c40b34fb36c32256e4e04fa6705766f72fe8c2fff2772c2f98a387f7a85d42152c618614000088f86fd42e7d4bddb10e46967fe7ef6abfb94250a48ecc5fcb1d07142525eab95885242097470836a3b1fdf80b77f9b8324dfb375c377f2a7373733fff14dd4011a2195efcdaf60c2bc091d89683b8a5a6bffe25ec968b20e25feb81206be2bf608e61434c02080ebe3930b009ed351fc6003e010800008020000088f1f73e2ffb1041b0040000241025050000ab902d1181608c0ac460541b9fc2a07a0c6dd884600a9f394b954f78008b34b2459c5d40b34fb36c32256e4e04fa67055d812c6869e8b599497ebd5df2ee6a74d42142c61862811c114009c716a256977179653c9f1e22baa0e3225d429ae1f0ab02f71602939f28cc86476f5a417a6e5533276ca071ebb9b46c5d46328b0b02084aff0403b2cf7d88006802100d17788800980200000fc81482c0a0070000100401380fcc0bbbde49251519b42808abf0448c106802000012a4098140001f874acda99f1140100493a4022101d00800003d90250500015910241100033c9000eba20464a0221d00095590213501018807cb403c5201d1d00e0cc06c34034120190500c008005d04802a2910062993431f1522c72b727e3043099e9adb714c46042616fe143c3800a0c02dcdd5e4e0ea1011d7eb39b15b33a1804edcb3a48e827420013c1b00eab436882208fa1201cc0dc15184a29f5e7ae305013457a645083c7e92a30a015bbbe99c10004fe1503c1800712683384500498b08c0211c9688d4425978233b7a593f2d88c7bd04c1baede52cbbbf00000000000000000000000000000000000000000000000000c404ddda4995f355da1fd74e3dfe79486d8422546d4c800000000000000000000000000000000000000000002b10e28e18410608c00a00280ea1df69e1372d48f45b6344b68fca3aaf84449d81cdb2cc2fa8a1a8763213b715189fb6e81131402d536d96ad64c55f3109f624d52e2c0c5fa46c410813cd9d50b6061804566612101037973a0038018f2c4fec6001b36068a020130e118042c9232a2c2e660e3bfa5c7d0b1e2c86ffa78e00000062a00401332a483728011804309076743f7194d2c9649221c64d1f30704c90d570e73306098512e0fb7c082514ea0d93cb62c0feed9b8de9e1280002da68ac2c09c40e00600780001d2383d2071c3f658f1982b4060810913b2f9c4825dce6d558e0000007e7a100cec0af0b4c0044010c241f69c2f11220b2592488719347cc1c33d267a220f42096dda7bf34b60b039445be27eb48a0000b69a2b0b00100227ae55a94167103801801e000074880019110170980b04c0542602813b201bd2344d1440596624a72c60959f8c9250da560b7bb410428cb95650c0000000de20098408c0216402794aa3e2251080bb0c82f2163016d35c70be58a0b590065010209951efc7ba4501464edb96ee120000e9bb18600190e20540400001a920260200031c20013824048540016744044940020d0400474c8081a803cc401c5a00d2900612802c840142a0091100406801c2400c0a0050100200800547c80188800844002020000100b9ce9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 33 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase0" = "QuadFullSixCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 33 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase0 private def zz2237:"s08bd"="s08bd":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l14 l15 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l5 l51 l54 l58 l6 l60 l61 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2616c8d47, -0x1874d83e8, -0x24af44894,0x4a4], ![-0x1874d83e8, -0x6c1ca0593,0x2381fb44,0x20d05afea], ![-0x24af44894,0x2381fb44, -0x9f2f33074,0x187e31f0e], ![0x4a4,0x20d05afea,0x187e31f0e, -0xc3a6c44c]] noncomputable def hinges:Hinges:=[(-0x5f3d0,l6),(-0x1492017c,l5),(0x1ec69684,l4),(0x8dff121,l9),(-0x2a3e9d18,l8),(0xe16245c,l10),(0x166ef2f52,l14),(0x10fe4e5d,l13),(0x29bc89dbc,l15),(0x1ccc87b0,l21),(-0x10fe4e5d,l20),(-0x1bb62d8a,l23),(0x43c708e0,l22),(-0xc3a6c44c,l27),(-0x1ccc87b0,l28),(0xc3a6c44c,l29),(-0x166ef2f52,l25),(0x9e4d736a,l30),(0xc3a6c44c,l33),(-0xe16245c,l38),(-0xc3a6c44c,l35),(0x2a3e9d18,l36),(0xc3a6c44c,l37),(-0x1ec69684,l34),(-0x9e4d736a,l43),(-0x43c708e0,l42),(-0x29bc89dbc,l41),(0x3589f092,l45),(0xc3a6c44c,l51),(0x1492017c,l54),(-0x3589f092,l58),(-0x8dff121,l61),(0x5f3d0,l60),(0x1bb62d8a,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0xc3a6c44c,l27),(0xc3a6c44c,l29),(0xc3a6c44c,l33),(-0xc3a6c44c,l35),(0xc3a6c44c,l37),(0xc3a6c44c,l51),(0x166ef2f52,l14),(-0x166ef2f52,l25),(0x29bc89dbc,l15),(-0x29bc89dbc,l41),(0x9e4d736a,l30),(-0x9e4d736a,l43),(0x1ccc87b0,l21),(-0x1ccc87b0,l28),(-0x1bb62d8a,l23),(0x1bb62d8a,l63),(0x43c708e0,l22),(-0x43c708e0,l42),(0x3589f092,l45),(-0x3589f092,l58),(-0x2a3e9d18,l8),(0x2a3e9d18,l36),(0xe16245c,l10),(-0xe16245c,l38),(0x8dff121,l9),(-0x8dff121,l61),(-0x1492017c,l5),(0x1492017c,l54),(0x10fe4e5d,l13),(-0x10fe4e5d,l20),(0x1ec69684,l4),(-0x1ec69684,l34),(-0x5f3d0,l6),(0x5f3d0,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x82310601b200600000000c4580e30080000000000160640080000000000501880200000000620a05180400000000c4180e300800000000111206600800000001d0901cc02000000003a0a0518040000000b251036300c00001612820324602800000028904090c0300000000002c0390040000000000540620080000000011160660080000000002102c80200000000241a0718040000000000440e20080000000088301c601000000010864088c0300000000000181900200000009241036300c0000121202032460280000001c8c40d8c030000001e120c05200400000ac421901e400c0000000050280a60100000000000140c801000000188220461808000000002c140a300800000005412044601800000000001c0c8010000001282204318080000002b05c08630100000000641204860180000000000902480200000000140a0598040000000004d00a200c0000000001280c40100000000002701880200000000004c02900400000000001103200400000000d84812601000000001a0d018c020000000310881398060000000661302f300c00000008c2a014601800000001309018c02000000002616031804000000004c280530080000000000980a40100004d0841200c90040000a813828036a0080510284110018d40180002b0480b013a8020000520a81200f50040000b81403802ea00800000000026009200c0000000088480c60100000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x8423050152006000000000084092008000000000906066008000001444301a0c040000a221870034200807146605140a61401800670a107205b480280009615841026900403823242820390a00c0001b0510dc048401000000000d0681c60100000000000903880200000000120c03180400000003211032300c0000000068301c6010000000000190248020000621202606620080000002105003c30100003e0781080f080200003c0841a02710040000e81a04203c20080000f02105003c40100000000000480c401000000008828030c03000038232603d2180c00000007619023300c00000000c828146010000002a0d060390020000000034220318040000007118406c301000860e1182049880280008c1c46101b1004000000001c0a029804000000007c2c0a300800000013052034601800000000015038802000000004c2a0718040000000094540d3008000000000128124010000028410c07e8c0500004023a603d2180c00430728a50398401400860e1142053080280000000016140cc010021c3842c816d200a0000000000340e20080000000000880c4010000a81a05301e900400014c330a204d2008000000004418063008000000a21100f0602000000014848070c03002aa4901380f9a00a004b0828c50398401400961011820530802800000002e0601cc0200000000074a81980200000006209016300c0000000000580a4010000711843c01b100400000000140c0798040000008464140f40080000000000280e401000004118828099003,0x2c0290040000a4c90407a4301800002610c3403480180000000230e038c020000000000420710040000000000740620080000001042401860180000026230e0390020000004a461c06a0040000000821202c300c00002510c340548018000001841201e0c040000004a441c04a0040000000861201c300c0000000c414038601800000000221c0cc010028240461012da00a0000000004850330040000000000901a40100000000000e01c80200000001a0700598060000000000240d20080000000000680c40100000000000502480200000000002c0690040000000540901c300c0000000148901c601000000001205038c02000000005a22079804000000b110406930100000016220807260200000000290e018c020000000510e00f18060000000000ac0620080000000000360640080000003384402cc030000000062120398040000000c81100b300c000000194240266018000000001b402880300000000006a0310040000000000dc0620080000000001b00a401589284020c047c5007b3651804481e78a00f624a1008302771401c0000000001d80c4010000000000390188020000005092201418080000000000210320041e4964943012c680303c32c32820188d006000000000048061006000000000019032004000290861900f480200000001c86409cc030018c118158079200a0000003108c06830100002c066148050802000000022084068c0300000000260c0718040000000088440e30080000000108881a601000000221306019002,0x338b604318080000002304c0ae30100000000000a81240100000000191602cc02002c848c8180e9200a0000000000840620080000000110580c6010000000349840d8c0300000684c080c9180a0000000068140e3008000000184ba0686018000000389a40d8c0300000704d080c9180a0060c910d7035240140000000148480e60100000001d02409cc030000039815013a980a0000000084140a300800000000001a0640080000000220601cc0200000000423a051804000000710a406a301000000000e83814601000000014864050c030000000000220390040000007115c0c83010000000e22b8090602000000001307028c02000000005c320718040000000000640e200800000000016812401000002c418c07e8c05000000388c60341808000000000b89033004000388c62400d0802000025320101e90c060000003088e06418080000000098440e3008000000084320646018000000000190188020000a61a04803d20080001443308c09a401000000000c8500c6010000001441201e0c040000000290500e180600038ca209803d401000012090980f48603000000010848030c030000082210680520060000000421202c300c000000010838146010000001843201e0c040000000230900e18060000000621a01c300c0000000000c80e4010000000000170148020000000410480b180600000000003c0520080000000150a81c60100000000002902480200000000643a0718040000000000740e2008000000000188124010000c220c2600f5004,0xe0290040000000320a00c300c0000000641405860180000001c8c4088c0300000001b0500e180600000000000f032004000000e21b805060200000000190d028c020000000491580b180600000000a41409300800000162398112602000000020844070c03000004845180af980a00000000078703300412090883200c248030000001cc2b0338c04000000488a604498080000000001c00f200c0000000003a03e4018000000002a2c0cc010000000000520590040000003505404c3010000000a82280726020000000dc170230c04000000001c0c0398040001d8250740cc401000668a511801b08028000000001101608040000000002a00c10080000000004c0782010000000000b807040200000000000901c8020000000000600790060000000000d01f200c0000000006a01640180000000001902c8020000001a04a01c980800000000037013200c00000000340026402000000019894028c03000000003622031804000000006c4c06300800000000d8900a60100000000001b01480200000002c10809980600000005827013300c00000000b0900e6010000000000b00248030000000001b00490060000006a04401430100000000c81201860180000001b024030c030000000340480518060000000064240730080000000dc2201660180000001a044038c030000000512481b1806000000746c180a400800000008422028601800000001916014c0200000010822047180800000000645c0a30080000000c45a044601800000184550218c04,0xf8190020000000000f40b20081a1981141807d6803000000000031038802071268c5920535a00c0e0cd08b0c072b40181c19a1161807d68030000000001940288030000000000620310040000000000cc0620080000000001900a401584283040c027010070000000790481a180600000000e4580e30080000000b432068601d82184820c07965007069260c5120535a00c0d0cc08a0c072b401800000c60c604606028000018418405c0c0500000000260a0398040000004604404930100000000a822038601800000032044028c03000000006412031804000000000c8503300400610850c402e080280000000001e0148020000000210c80b180600000808c302bf30140000000188901c60100000000d05802cc030000000210c80a18060000000000140d20080c1086861011a08030000610c41302ed00400000000001a0490040000004804401630100000000088780a60100000001282402cc030000002702200b18080000094260900b400c0000000003c012401800000000005c0c8010000000002a80510060000000000a40620080000000001500a401000014111301e90c060000020c23808d980a000000430840593010000008c09405f660280000000000a01c80200000002a048139806000005302a027530140000e18848103e603000001c220c0afcc05000003844180af980a000060454c07a43018000000a20c80d46020000000188a4088c030000402206040a980c0000056062026f3014000010204603f4602800000c20a40754c05,0x1040e20080000000002281c401000000000044030803], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((0x10387017f91082280ed7b138303b1c9766821655f9dc1061927baa1c0095869f32c083e00881c38c0df52208950b81b470609444ad268404616cda682111d6aa20830986aa004c084001000012c30386af3b4d8410c9676cc8e0c10e50324d082ee9b5b01075a3aba48e00451e56826002000840e1414dcba4410be7209393830669cc9b0d0820c8f7a638101061c2c01067ef753ac4c00348aed6e9c00880400002cc460814000580460027a4aa286ad0d035da493e44083a010c3f0bbf383425a4a30604155d7c264806017f9708002a138725041c008000074917f090bf00800068c8b788c5b817e69229f2190072ad9bca6020c1e4f104126f9e2f9200001c1800a860e802228000000c348424639bd29048a5fd61c5080000024820d7dbfb382400001b7ee0000020d8c09c107c02145000022c543c605f3dcaa030d4cf98538121458c515720c22febbc63f1048a78ad76040200000bb806046a1b905c1000115682e2a4801180a28a00003427e061afde6e46673c4094a4446e061011f30ea81104894ec0484c80400001194018117395bdf2100042e38dfb8040022ad34a43c4801300e00007a08001e719480000011419be87573ed6f3181d0471b0f4d0b6d1c907f3353acda39f159d028a1ceaa2c8b56f9800000000000000002092278a29c1a4116082092000060000401b2480001ae48f870a06351ac70d8a2d44c78c18ee70613b30bd3bb861d2597204faa7823ac67207dc22002a1d7dd3f438000000910500a00c6d94c3ff5ef2400a80b00004204604140008a640026a08c004fcd0e2bd2a3061554ea900b34dbf40e00015d360a040d8022278571d4c91458bdaac2858607b1d66c30e9ccece62413c0817d52010aff522a4800002c9b27001f008492000093c6538508ceac5480a2d77d1809b490c9cbbdabfa187b013146573810440f60b5a400e5b2ba7cd1009cbbe337238000000c738ab2004a0380001df313c0291c9e240a0151aa05145286e5afc241079047fed104f662d35e582017ea897041dcc08c975c00840112480001f4b20e14071bbc44040a13c0880b5145baaf342389218c8ab136a830e9a07e2bf29003b7395b8c4401915643850e0000002a30244801280e000077c8001ab10006ba22fe1a17e050003df917d0d00095d117c01f9a245e9848692039b25c24861fa1ed501872c6b24a068036cf4fc9280100043cd00d715da4860324dbec30f40c44c11a085) <<< 16000) + 0xae53ef4800bb95bf72800f80400003e08bd82c5e807e68080ef1ccf0d81e1d5fa1876fc254c218200c1b0d99200000ae9b0941084021e6809157cb63c30ae40c8f448602450e92830e4439f8b19010122ace4c480000005dc08004b24d9710a704230100000b71179050001511f3545a5da724340a64a8030eee7eb823407251089a4001e00879a0592938243015cbbe061c73ef5a8f08c536e6e68259d657c4802e54d91cc003a01000011722f60b17a01f9a00087ca3406024158f99e1b7834191430e65dc9de4802000661d4240000049b01302108043cd000004500c3a59a03ca3c219ec03e3401122afb6d4800000096040022adffae26042000800009591790500014610004cc22f02a177110bb0685d4240014646c71fcf9eb240e1d499418d14589fff9982864f0dfb30218c1724638564a4a2ccb008cea202213860f804343c13861c607e28379c60dfd917513041b00479aa3e085a9e50f4f227470823266819227a238dd03061f96757820042c7e253000f00438727f25978814518189818938427f2543282448a1a782321c43622e6936104a7a1f484818335398f7950c3fc3d2c7110c035562823692400900600003aa4000c348ba028000f508b980e5205570bc13b6106c49fa635aa8f411a19248d6f5101621060219019c11a10411800e00612a1bff89b800be853745222f7aa7498f98458e5172ea019e8c060c7616ef06191e95d266860765c1b584064bcd90d44704fa6b21efa4047e69af32e105799dcb5883821d96fc0e08800765c791825203090050000354603907ea46038df22235202ab24909ba4082ca60431a88dc5a787085c675dc5ca038169054a4960cea459aa26dddae2b87834104360bf0e2c5ebfc9d376c36beff683000cf8341b33549746a1323efaa8d4cc1c013f2b449d38ed25fe66611453e65a801d7533900f827af5a05906177326f7a830cea0e0f158408e1a81860c7816868600000450406aefa81d01059a786d20702a79f8e5840234f4094e88000000db07804703f68824e184001000015b2000b0a40025e08b90c83a05407a221710d00079f9a0a633f1d8160a381fb4434011e7fea65002b1a594c70000001700080000354210252c1f00800009699480000011419be87573ed6f3181d0460000b1c2242aa82a63e567d31f2b400f1615111c80b8714e77d4482a638648238248040018000201d570251be7f600cedf633a6b56d99cd15df77ddb44fe35880c783ba229461211d666d6fa1e969cfec76bf8d8c2e49ea00067641a41784056999db3c6a68273186020c1ee970b002ddf6db8140c1f00461006521c1078c341588c830d0471b3986020beb81c212041000405c0040001d445bc362dc0bf1853dcdd109c2c605d3533928061a2a629440c008222099ad545510422f4012eb03810000032f10030017a09b10bc0802b212013af000bd1028540588040080222418dcfbc8e0d202381fb440411bfc0b42181045515dd8e08410f66da13813046a861bfc08020000136801009230f48fe122010940711211e53e0d9a403f1fff4208ab9ed7de208f39e2be13045eb02461c00000022808052247f18000cc93d9b8c020f80200005ec8001a3916d0d0b6028000eb88002d6916b018b500e487133e5ca48836b13251109b2abafba010ec8fc5034213c7921230356d514f4c0053627d4a4e103e0108863424783078688ba2c96105b73f5b80460840010a2422d2f95fcc80e3a88ba35d13070e1ef49e210e3f2b942170ad10c00001cc1707874c18df5f9a082c2330aae0124010d41b29ca0d57008520580001d4200052e45a407e1802cbb60bbae727a2b894a2588dc98e011544c2d18242472b21e0f089e0cb43324757a3f0e212bb373db2b01052cd2fae1993384103085d967b002ca658d084c45c0d0009ecbb27d55b18b7ded147a1c370b90dadaac243000acfadeff47cb31d527379754c70905f9abfbbe46684eec17d3a23a526dd32d52f63cd8511e08114e438c1c127e6206c071d2c0804ee90f0ce21ad5315030c2811d8dd4ce0800000a1b8090909cb43818020ad3810a936006ef6781a8a58e10500480001c0363015d28d172030c15b025bb8e201000000bed4070452f1a2927a0410285114e6fa0832f7ee0a4041002bbc5bc7ee0020bbe6901136238615014000074c8003f311681503488859c442cc1a000c6e3648000020580308012fe1be8c4060e00e787f830e3b4b8eb6c820b3c0fd08fc000114ad4f7c15016415f6103c14a09c08000031070a0000051f028a57c77a672144226700c402c09fa9876311c00cc2e48620006033ba19a0001f0d92fb8009b141200a029c440003226c70890aaa0a98f959f4c7cad003ccf1459c678a2cdc82db48d20b6d240ea6e2690172740d3af829f53c953379d3dc6f80a1b8657ee815b000000000000000000882106021615111c80b8714e77d4482aa38650258048005136f8e824d9267d6ff64b4034674c10e1734eab1406d9b01fc37b8546a2d2148e77ed457eba7120007a81303dd465c7dcf9fdd486dbe6c6dc1794c8bfc4e6e0ff13a2436f736a92c3e04f7ae8626c8d500053e21b052001d3922be1be12e34278400c4a46873f6d14090428850800119c2662f36e8b1bc10d6a5eaf43824f4ba474a0b2eb3272070a37ccecf141289b71a38e9c3e8824d444a53b506120656ea692e96c216a7efdcc7482ed70600eec60dc8d51539e91331b5739c48802a00026d7d1b4624ea6a4d26e2f479597244e3af96269da66915a654d3203a8aa000103882c84e086)) <<< 16000) + 0x078d646420404703f68820194de69ad9041b67a10460280000001c200001c47d39d20400000114232961200620156a474c42401f5732ca1002d15c6400c0bc5658a904005242c20008000073915e2d0b29480b8942ba4213a0d0b2028000bc08b19ef895cf0e00e2c9042a8e79246a87344a018499a411cd1002ea938dc0250c2000871228fbb3ac5921d1fc7a048d94a7dc5230852ba017e1204100040588040001d474833491cee28818842ab1205a5bb2c0514247eda7a52805ed4aa400094408002000020a45842615a0bc1cec82713091c7541554071322879f6c408a7c06f1c60069e1614000094708002000021642b0262c00bb1966003596c5778d7df4c8317be2d00073b57ad55cde2f02e30723f518a3260285aca5e27390b4d5c72ba7d020d672c961a1c00b8e5d0f2978d8bae59958ac5d0fa5f6b2f8a9bcfea3c130c016493d913e7d7dc272c719f7fcba48d297de4759444be984026192ca0ef75d149e4d6370e68b44c95be71d024cc0c5564001eeaae1913c155849c3f2e3efe70ff96b7891e572145e93c00012c88120ac57c271b0f4d0b6d1c907f3353acda39f159d028a1ceaa2c8b56f9800000000000000002089428e28a11409200c00a0020f7bbb4af35124723231d460949bdd8b4f252cd7c0202445ce5811db0ca235964fe00eb71b26903d99c3c656304b7398c4422f9fe89bbea75f3d5cc91cd29087a0006e04578d60a26305905d0b972c3d117855d303f0e1c6d915918e290e8bb4fc44b25641f6f882e127be285abd2109113d7bd7d4bd207b46940900ff328a8184e01ae636238df1f636a2020e7ad2b27a32d29766af24e0537384065b7647c6a202b251d86272a5ba320001c8cefc766477b8c9b5511ccb4ef4021667b339a3843cd9002d44c68e42a0a176c4b0b68ad388dacd8c15007692bf8efd086aaee0714556c4f45f95b74db850dbdebedca889fc7cdf1230508cc8f6368b2bd318130d7ca30d1cb77c042c1b8b5060384923f4bd63a364cbe74830154ef4d7fb329bff80500e4674ee7271a25c9aa7dd8784a5182f94a6e0df503007b370c1b674b585ece2ac45731395864799b837e0001ed576fd46607a05bdb5ad6060481e5a8e566a46e1011ebb1bab9d873675041d2e82d593ccba73928186e8af590059056eb30a7fdcf7db5d3fb05f831a5210a0001898817128574842b81a000a7320407a15b09000c0d903c11f0b8bf5e36f0503b581a4e040ab209c523b30f163f06b0205039b2f6909bf3fc34b08600bb0733377717cd7ea948005000bf232405bf253bea5e1a0c78b3a46f6156b63e2897784c65d14bd9c81c6ae2b9e25416ff41438feb888083f237fe988167e7fa50355dcbf31a5f48b0a018800037b3812c138aa84741012c0348561ae0c11745187840818017451a74668140df00b394f5210033fbdb9c2c8401414405e84d0643e0e48de4ccd5905f37eca79894076c32e1601600008ac8ad26c564e418c6a03c1d8ac0ec55c262ac0a1550140da678899cb58708de4613eac10c17433fbad93614218ae8ec49fc400315d196bd3870273c937d2ed8a01068d069b13004115052f8f17a9dd407f54b31c88ae31d30ac0a1e6b218a4e8abc3090c78417df5048e0000aa3ea40f08001edae4101410594ab98e65341e4546bc44d0402001ee37e400a0001a01ca4988000d9c5949c38028890c2b02879ab5afff166118c24302c14e136f923800027752f583c201663ee6670c504152d84d7de04d074d01d4f4e02100800728b9ed801c0004e055edc980002cdc3801d80009632430bc0e000048c78b000014848612dc9c1a9ccc2219af54ec164028e280fd241051c8abf040000000985402610230080000a1915405e14dec9d829286124122d7a1981860001547d4860218dfa954a0402002a1251305800244359b4a5002e2feda666180732fd5e4cc081082e1fa221b2400a00718602dc6219669521a9cc99985000130efc692de259275861800032716604c388844d1a08afef0a1860200142cfc10080063b9a5900220040000df1c25c60dbf5318446b78f5482c8000093f5208230cbfa9f890108c0200001be454c242a41209e090a8848001484c8e44ad94721d5103864497ba0edc50428f9aaed26290108ef2aaf18861048270b536ee00e0810dac164af010245e9741d2cc120070787a74d7808139ca95ea37a46512005c070c27905aa07088419845132db4fe38ed24700240b90014b030c1dd44ef61ce80a08003012e533bc0c1080c7995224800821e57470d06cc0603d4c6e99a651602008ad7a589ed7447f649003304c0001349d2c4dc06f4658f176c43d63412233d9549200e2665cb47018067f2a24a084201000010422a01214f090a7048534242980200064322880b10505c8daf7ff7fc3122e482d452b428800381a29c10094ad4a08d01821847cbd1614004e748d22c38000381da4c06003dcfb0b52100559d069508200a624a0980500003f4440c961fc0bb86ae8941a186ef2dce81252cb835134b3072c7287343202281200000c0c008036883724e4937a49062893c9f8cb14063c6592f9428ea6d8f225245b3ae1b4db458448d60644f09083abac9b50841301bdd640028130e399e18fb24009c0714424ac9aa48049083bc47cc0162823bf2705e50a49e4f1743122f7984ffc16584611d5db1412109d159c10010500949cc00140a0ae64543122400980700003d06474ded12b5effa40e8c4113c4978c618016bf2264ac1222ec2abdec309204fb3cc4b16ebe40262b3c16e6140604d5146f5)) <<< 16000) + 0x7e5d020aa3b6cad636e040210c710c779b32492005e0800200180012b91460902084852c142940a0006ba3e6a50fffa047e71228b1f95dac1a4cb6fe9f82966122699c378591e292bf9aa7f6450822a798f215081800001091405020150b7e61c0001ea97c5b5944e2410a8091e6a50fffa047e71228b1f95dac1a4cb6fe9f82966122699c378591e292bf9aa7f6450822a798f215081800001091405020150b7e61c00021cbba953d44e2410a80900004207870bdb96ae340091ca600d3da1882074ec9bd46f0e0a1174ecc359581244596c83de26c88135445f8d25bd28001f9efd5edc0800a84a54234700006e084c1648c273c4801701e05240429002000262208213e1c3f3ddf05c81238d21d67a5c02075417041c6e0508a7a1b16f96c91135266c8a7b1024257b2ec43f2012a0e0f2f4400822df72466700001a74252dd8441448015818051c07441e3530be15c1241fc974f8d841628d0eb53d7d3942a144d8e073f122e209025f8159610569f9388d81210f403ecacf804098b5f59eec8020896bb989c004022400b00d1c49269c3c62b9a4ecf7bf17ba1848da20109729e406fd9758ff9e2ade3e327851e20291cc911d94204129c08e59805a7f91f0af04009ecb2831b789002801c0000fd1000439228c1207c0500035691200d0a282c0036fc81586c5102620a13af547d5bf2e5be893c8d1f5877dcf3d204b680456d5e0ecbf4e423c9b6222fee23d4542f09429229028c21011608600400000a982c010068000de900419800bf0906e2d81e04c1a4260d003b2612eb0db3848cd710f43b728500381da4c122ba68cd8a945103be8e2b285841df474d440c0353f543ce0020080c7a9476080b8cb5c9d918e804a020b24769dca1325121208bb62f308169e1e50b9440806da6604b14f3e291f8050b55618ee280823e831ae721200491b1bea4000039002efd4900250144091fe7a9fe91140c2439f610eab54b289266c77697df90b15796c2bcc375c2859fa0618d27e4490836306e40052c0822256284c903a0a0071178c8a67f50002efa2c5b9cee33fd8900320480001301a20a0e5e018a9709209d991b35f124b1c4f6dddd0c5e4a1165a673d54a58913420ee923a7508045e1c8e790c501056b090e803c80b00666a1650d3ec900111e80a36baf89a2400c01002860200026022840381266f0cd63c7f0c24743c01d0463944a9091f01f7bd2c593e960d04efc50bcd711ddaf988a08d8cce4592e00413e2f9d6b9b1e24102b346fe5ff008270bed0dbdf0aa0c2400bc101024d23af957e761848e0bad57195b28951f38c25b87258b26f1202055d8a179ca57eb68351411b199c8b25c00827eea168e2dac48202632ac515e01050b63c69dc05541848017820000090cd90474cb7bf09e94408e46935b9144906dee7fa1edc9423128300563a448934372a3cd67101813195628af048248444c1dba0020aa4e0784b9e40004994ec4244f70212005c0701410100012610670900038e9b20051776c7ffb28823f5e47a09f09203be3f5419892c7269e281d1cb491c365a6d26cd328457507bfa9fc091385b756ee41004152ec4d69d240800415edbd2828d802400b80e1642127c73d7e44a20298fbd234f0490844db92345c284adc3a35a35a1227eff6145992c804783a4e746c8082450f5df9df82402f9e203a46b80030cbd94b11a2bc89002d038000117114001d903fea7f6821174a20969b79e45fd3124286ff88a9ebc21c73ced7e6371f58508f8a5c0e67d5589135415c051564f9209c5a7a6965b510419e7fd794f0e1050013a2c9b0b98be61152400cc141640d0ae214c933d2883da5e0f95db28490a30299c6448f871d21455ad76bd61422e111ab92e0fd244d91a27dcf8dd650438a378f9c1b84904e1a69f64717a820d40e0b0d3cbc89845490033050000135106705000282113f058004e490521189f088144460561313d0989e04c134262760a04c01c8f4e2ab804fbb061708b5341698c9228791a3c098e61c52a482ef5962c349c3722ddd186470f5204d9d77944c1d404c12a3c519608fceb85a3234040e07bc0178679b7b12005e080f38d8e7b7d07e20c2dc75f26fcc678a2ac4149cacd8c0e24ea48d4358090d262433a3a6d6b921c737cfe3ab2d0e1d54222cc7fe0cc1cc032dcededc4b062004f1b4537279f12006008800024c3e5dbb0c0a4a6941f9e314b16508e25d4de880197ab4431a001e3bcc585803d17ee1713021100400004dc89d04bce45fd0885b090c2e24aeb892a3328abec469a427212264acc51f6ca434936d346be91a521d739e77c25103873051ca7bd2d0c1d0fa7c523f882c18657af0c3afad484801701e3ce3d31da9bb74830b78164047006e28aa6db221a7eb0489809d9d755b883492fd7b5b4d8fa4874c9f8d535d343872ed07e73d7e33073b6c3c2bb9d12c17590e7bffc7c9e7c480180220000930f9727c8ead69a508a88f0f059436275c8722003b31ea5068020f40de11600d4bb251a4c084401000013720560a0006062272221380948b2f348cf02746161a6fd0c9398e286968cd6868185110923416903476fa49b8362260ff4a83a44e3cf1a336eee398b14329febce83a70803cc77d1aec5f42400ac0b122c7a45b8d086161034c404448a09b00f2a31850e7de1f948d1d281c3817060f3b44bbd303c618668ba9a9430330b67f84f02399cdd5134900250140000ef189446b6c143cf8b281acaad97911a48532f785c5c2c91fa82023b8849213ab40e8120c19398b57b43116356c5e7b9f7e24554466)) <<< 16000) + 0x03941628bc6026c7f48ab84801581604dc0400045e40ac1626c03f3957c636c7a4830ba07d2d2a6138a2b3fbddf6dfd03894c530ef262f0d264bf4ef5e5d6487567872875630e1d77d6798d5753074c6f8daac61cb0653128ea10ecd3512005c07813501c0f60696ac3a9440e1e1ac1bdd2834caf931b8647e3cb64962a1941e38acfe5557eb943c8ec5c344cce734834ad4b109c53021c766f9b32c080e6f617dc124fb44801601a2079e40d7bad8541a63c856164829b165d2edff0c31b8265423de6e356741c516eefe060ce91e43033e839289e9c40eb9edf6254d1a41b780d111f989813ae8586041a64f3e2400c011000049a4001234f9743102bc19a50ab86e0a659432cfbe5c220019d0c71668031bec4a416009c3cb61c13041100400004e489a068002178873888003c548310ac11455128333d2199ba069420f4894cc902ca0ec2f4842b822487ad0a072d00b2472c9c34196068c0a8f65323173065ad7bf1f21716353e0919cbf2c104d25bebdd4d16c89002d03444a0dbe40946a51a5083d22533240b28374ff158bec89220921878aba2c91bc378a269b1a301040abf18c4c196cb71a2f61058d555571cf5d70413496faf75345b22400b40d000045c44cc1722c6b151be0f68716275be5f266530b29a5cc010139a3b0da05cb4538c1e9873041360490413cafdc40cc3820040eadda83981099ba2151334208d481cc77441a289002d03448b1ab9bc7fcc21c589d9dc1ab5f4c2ca6ae44f4e7e68ec34577c3c06307a62e10b98252410533aa4eab68d0800d1a900bc26042583de189e50823254e9f254068a2400b40d000045c6250b8e422c3b80d285f4be4d8076594525310c7f2530662e6fcfdfa41635274e7ceb42110422b4f80866068203452f392f92c1130dd84b23b8209a90398ee8834512005a0680240180012190006d5302468918efd6a8a241cd8cc24258d20a5fc02d2b78a20856a652330082026155940898b14f738343ebd0a1628038021130d114497f6321c88100ecb2a58a76282400b00c005602d288f1db3acd7f2ca0249b40a3104b2498448f413402490fecaf1db260c19402eb0fedec2c693ff19ffcb50e14c98f57d6f6c2455848471a4e4000063b0db82cf09d82400b80e113ce1945efad9889c021fdd39c5840b01668de21779e5e446499e5230e2c279c17176f269415ede5970f130622181ff1bb91c01fdd16a0ab109004e8ca9ab4f95f12005a06000022d20008fe44c804000dd044b83406e0b02b0589882c4b4040025d078d3a575c67f99e16555ade7009fad49266fdbc06a9030890da1d95aa5eba3484b3f63634eb8a2318ec9da01eda0c191b1a5c125d4858c6b59f625c1c82814749b6e049794f3e120062090e34e92f3e3ad9a0b2aadaf57a0b0589266f98d7160201121b43597e306f0d212d822e54d4b9118d8ffe3c06028c1908f6a6f45f94b18d6b2107af164a051d3795d6497279f12006008800024c3038a90f30d871467611d713091693d463944c2369ac88c01ad7f8dc05003b581269260421008000099113005595d6f2f6dcd1e0d25c7ca53dca14124951d5cf46ca03489db0a30a6754610e467822bb98911a6ae95aa6c401a31a5de04f2ded2c6181cf05623fe0812cbaeb30737379e2400bc1016556302c35186f1a48e66e91a2bf2124cd7388e1b2a01a4505214774b501841b3e08be2533223266787ccd6c5183170d19d574929631898310aa0dc940a3c6d73b0c964f3e2400c011000049860764307669a068d02f2bc1c548b093341848e14ac31944ffa1a56d18066e9000e1401f5fd9c6b3821000400005608738480018c487386c0ac25c6ab898204f910595bc00a87cf17124e447d9f59f0089119d5429bf9e1a427a4d204f24c88cd7aaf213aa318321cd62e11c6658ca9a385a2fe79412aa376bd0e39a6a2400b80f1c69a32e5e2e48595042d1b6f3d924bbf6df3aaf0890a6ee3763631a4162c8c2845e88c8040f01867983141afff165e58c689191b54f141190fb6c41fdf448015014000083c89780e071179b7892ca4a281a35d32adba5af21a68e6b7bfbb3942c7940beeb88da3e3a1c55b173bb869eb0e51235d3266eae9f2202ab3660da03ca406880784d65b78d2490021617b7f280a561e8480908360540001459f35248a23bcd2652a17240b20f178fce4923f901268cb036a661828900c3144f4c498308002000025e44b84425a0200089120643a12c150958480056008179680b8840581a004493207a43005d84382a4fd9f8089d030ac69a1a9fbac10200088c8419402094a467c0c544181a0f37716d2e83864fda41eebea8c1a92b14aa7e0a28222b986a7b180608134e0a882055f04801701c30554e28b37d20615d86a55973820400150b1dc8041350a11996e8303584ebc5e59070cb8908bfef11835d8a4bc28845047e9a8f79b00c10691922806b609002a0280001079a1d90951f7d245c236599b4710570d1f071440e0dcde1830ccd1f23f02c022166c5b8700533968312704220080000b29025090120484a8240461202209010848080262521301f0100f0084a00403a0201c0100d80849c04000e384019ae880498d112629c10504ef223091a8d02d7bc922b96521f9f2445ccf890e04066c4bac05070c0031e1760819342290900c21571576142000000025229002300809280ec9bb5869a0c510202f43fb8a15e9d4a96f1421c4a8ec812445e630bda618035c55b7701001da0738ab3821180400005b0c47bea507ce606af4529c98992fafe1d91c33deca42a9c3db92)) <<< 16000) + 0x8000000000000000002289239221219018e10c00205bab4c5d8cb0a7b0e0d17e2d3e592e85998692a388247917e484348bb508c1a4595e14e0407089f21280015e11240d89186c4880624203b2e0a00e98f80b2400000f1500b1b51505fd2f4819c473de1380719fa25170fece14c7cfa47e58a14142385dce0717fc34f4510450a37c1236fe742400a008165a64b4084bd66005920000046cf71001633e48438ea1eace40c84c453ae18d800e325275181bfbab270a370513ed5ab4994282624e644eedba38b2b5c525bca6c40a129a600a3427091e8480900360540001431d2e274666d31853145b9bb4307401ec673858e9fc2aa704c196a88a71416323a00d6ff0c00721546c60800f1a28844a0108c02000033670a1f745adb14b27cc68b8cd41c725974a8340b19719ec2977286bcac6ce7ecb15a18fb79a4285002ec35ea0800000005cd00a4041300a00006e0d14b3705049540a2000000a5e70142c88cb51c2fb1c54dc3ea2b5a030aafbd8c6d3e4d106a3d1c4283122078bb3cb974184ad6ca84ddbe202bf5180ce54e3c4801581634bee814d68cc2bd6249b383075b7c4cb40b1f617f2a7f306d75eab918b1967ea78790810181ae95c1003c68a211a0008802000032270a31c0ab5f77e42c9e6d2a96edd481c71a61094f1a842c6538c1405484c286b83f2b336f132c56c867e026778285002daaca68402000000016a8c8027104021801e000084089004800181489006e8a6e6c802d2014400000198600a16e062540bf838abf6c19084018566a2ba4a8a1a2367b05ff018810aca9d29a823890d359aed391845fb609b978582400a4091453ebda5eb18144000001d010142e98afc9ad08e2b6619e62580c2b95f7074259a23b83c6d6781021a033fbc980e24d6365cde00c236619ccc4a644801401000007ece14c6ac87e88b261442db0716317acef5b828676c21337658ac5c9c2074a14aaeb24ba0e1824f8ac45040078d1442250084601000019b3648bfa366d4a511f5343867a0c312cba541a050ab8cf614bb922e2162d7436508c1c7ffcc2122001761af50380000002e6805202098050000370447c3423c020007ce204023001658205632818c24216c536c8146f3a1001a6c30c9ca8cee7b98a08008228ab2c8808a9c6323903c501971296b05e4302417a46183802003360dac706c100873436e71377b480160162083c3b2ea440a1e395775f1f24695281a3bb0818000006f6028543d7473f9491717652c8682448b3753f68060c01f2e43a40c1457fa0616312004c0280001e63442a62ae66b247e7f597c5648c39ceccb00911887cc19f9023b8b7b392203202a2de982843832890bc1001e345108b40211804000066cc0ddb251072d102c56e2621922085488ccce70e1e284eee056404dbd727c0f0e1001761af502021cf36ea080a0000000b9a014808260140000dc111d0d08e06846c26234020ed0108c8080020a888c14845ca422c421152108a0c844c44224220bf090888484400421e02002643221cab10d5188622c42d060786b10a2988492c1a4662102ba23a458e868f154facbf37784e1031c12699a437155e7a519ca4e40077dbf2a291ac09d90c95d998702f5fba3424b6caf8a6d7e59e8a02955be40b5a3da10a1f91c6c000504005100785bbc8f2ce17c67dd908a0a3d83a8ad15928cb777b95d49976ef493461ee2b5f49685dc00837c62ec062552e1106d092a7e3cb14668b857faba2f87e203002008a000f42427240096a90080026bdf9bf026183c00880000802380619ca4d9000aa7a91e344004201000007a206c0a03501000070910701f981dae8b4c5144dcb96e44840b7aabf23804b6011d0001885a97c4004a284001000010720005ae6c70890aaa0a98f959f4c7cad003d1bc019a3ff9248efa80ba91c756d3ef7f5ef272f75aa07fff7d24334a0000000000000000008a5c4ee4feb0a059615111c80b8714e77d4482aa590286680180172f8d4e06e5fd88c070c89505319fd7a40e7b395112b0e1c66f9f9ca11111dd520c3803d40a1776bf6fb8e1e83fca7cdb201b685988bd5ac250858917e3fb550e07483a227ad0004a23638448555054c7cacfa63e56801e8de00cd1ffc92477d405d48e3ab69f7bfaf79397bad503fffbe9219a5000000000000000000452c2a22390170e29cefa89054000000000000000000000023ee0a76e2529ba0b19d6366115e79e6c88d3e0645abe551e3f918625c16438f2b09c5b52872421023000402caa5e45bcd440afa0c454cc6dee38e2f216773f2d245af386e1848c0f78dde9b3db6346eda6bb00b1036513e501b332014d658471e29a97c1bed8fd61959fb80dc59d73890372c7aaad6a943e2813704b00115d5669cbd5eddef91a0e23d74c2f5a957b3fdaca09daa684368cbd000729220c0b10505f61b80d99eb372ec3701b33d66e95bc76b048d930e15e96fca55a9741c1615111c80b8714e77d4482a448c402182500380100080743c2e2788b1d396a1e166d68812a7b6a6f06ed146bf25aa5962d57a9d038d05aad9665610944b2e6b7927063c52df63ae79772fb685168c88fa70a9940b15f672b165a1314000f2488216c0f4a6206531022588090c01074200130ff0587f02c3f4161f803e3462c05f8162092150e296199cb221d0e0ae1f25152203dc104ef18011a6c9a00004c3040010f146b3eb09cc145e0569648151d82ec5880a53b368a02012d48efd4000a08ee1b8026102000868c06cb7bbe48d4b1bafb24864488883e460840010d1917e60478d1047f3c7a)) <<< 16000) + 0x080335508e70301a84204749010800200001a643e0241ee020001bf21f6020003203609f69f676d93c7587a3a4e976dfb00f00002c70890aaa0a98f959f4c7cad003d5b80221856d28ac8d59028d7b224da89ab000b8551fbf62d8000000000000000020a8127ea2e947084c92ca382a830a5063066001000541ff6e6ff0749c45fc2a48150a0aac51b6025aba23ac018c86984c3f0f767250c91e64b00a9fb090a8d26fead163da4da066114fb59a1853e57de6c01bd81e334c39b0bf5c3e380e6bcc29474d91ba000a6040cc274449deec7f2425f499180100b1c27fe5010023242000800005b18141db98bca9e015db81a05864b0b72143112a53e8f0243243fe51c7b905b38daf960fbc1600aa3f0a928ab94804a2db3edba1b0e5bfb8e181896c5bc7d4dd5fb8f780000111412c337f2325d8c247687f52a0534c509a1700002c421f44b0f91983484fc204edb9a1a0a211f8d050682067526813c301992c0186e45900128a0e8043437d5a1c607fa499422081700860e66b334480158effd83013841b7023081c00800004e10f80d07b808000530f035f877100c0967f0828200aa49824026203a0080ed0107b00800033487a82f80b8d51bb30014e0706009080e002200802008800136720688056a772171000f004200002008000022200016643d0241e60200011a301401004000011103c15d8a00ea75c2c220d33881c0481d513809860e802303291ee9a82076dedc6022081d008612e71b8ca001809a0b0409f5232a460836010c2540fcd91c08ec698c440836010000070200024440006d0f89f4f6f4528122ae10596017f37c74023101d00800005210f215076848000d648002b990f109d0475ec5f99a05bd2f98d0022141f008401004011869febda93c07a87d599000e0022000020080000222000158601002008000022300c010040000111043010000bc1057190208c83c0441de2200026721dc2202b0d40221494ba6921035366ad8a040d828ea618205867d843409b3a1333002128e10804283481950da203a5b635cc03bbef69e0046283a010a0cfe6e598e0b9a2118c30bac5a950206019443c201ae7b4b909430700201da0a0ec0100008c90eb090000f790411dc0229992ad44840601eb684083930fe21a04ef3d7df04008efda840215181f0047862009ce494188fe1cbc88180e0563940018377b4012080f00438313477e99600767d86011040f0042051823c432600e71dc9c803607516046083a0109188a10e24902b4366d8800eddec323001c00848d1f13f78c02eb4a64280114e58c60034010000093200028e4000800876008000aa0875848000ea482b8e837c540009e4439c7418c2b0ea1180043e10014422048430e91187408e8424d867de3da1a996492941846b3411416712f043314cb1c3624c08c241f9dccb175d3b63e4602e37f90c0814ba2fb6935955859ec8198e8af2802655afbb4c6a898bca99fc1d7d1c04a7c9dc01fa28ce1a98d1a0b060035e8ebec6f42069f72a845bdd20014c744fcc17648f7943b318340923c3927197080c19e701c3ac40c2c4dcd7e602885ef1fd3001ecf6619800328e10804347484d0eb2404e8bc4366304566c45af244326e0a051c40342bb6134252c29907000986080021a3be4fc711657696cf5fe8aa4cc5fce6caf70584e84e15982336552e54b51e8713fb834ab5cc00767df90bbe244810a268978a387b8150f5127475e7c693a441badd965314e912025e8541ea2ff0859e63f6bb0800def774fed2679c8c88005aa72931c73c5696392b9af574d368db325da425389541cb32542202011d21047b1f885ac6a956aac8316049000045d2000b5a40ac3404a1ac196882f520f0f702fbdfce0c68a02150b0f22fe300cf008435b10cc01203afd9c009850800218203c7570b0786099e2ce216182131368830653be1340881c1a29c4c4004a284401000011121ce2a0c6158730ac394160005664390740013ca4368d40a46a02e2d06c96816424001c12438d261c4730e10df0a2f04ff63f50812c2ca464ae12c8fd43560e42a39cf3b2e0ee873818eb19a0cd8dac9208b63a197a0882fe3dd3226004f0a4befe3286df1a2f39a38d103a12aa04d9f5b55f354ec19f5b70787773556904a0528b9b31b5ce5f62879d962808bb924c80e06d1bf88dd27c9fce6f1036d4740a860a66c97ac80ae668e1f551bf174ed8d142c74283ce5708e845805002ca48ca148c5641fad6378acc26ec606f4f61af191846579009313e674228a844c9efa27f82feb40273b5e7f8000d5d7e54b54f4feafacf512f093cf0f70e9f2846fe5886d7e3a266f64f2cc7bb8ad9d9d53df38f0dd70ac65adaa78912a25dada500898ceae2406ebb835000046403a0108000080238a06e7b1127010f9e9cca5000493ee5718010004000029087000ec0904b54811081b004000025980600802000008882b88837c341bc120dd050000f690dc21d95b5a1ed09817664625e404b45870b1004c90f9fc0014bf9372000004a503c01000010720007d640905606e2ba108f69885870916ce148060817c4b918605d9fff924a028e9b729c0009470800218300f2bdc4183decfb948180303ac5009820f80200801600003c18abed4aa860e532022941051799bf989006495e53409030800200001ae437047629777214714104fd896f8a14810f2ac90015d44a100e003495d7380128a10004000041c86d86c000c2c86d1081487405c3a0d9190168681642400095e4308c41b0620d71d06b0c8354461a8220d30500087410041c020)) <<< 16000) + 0xdc9b03c1183488c1a0078201c73d72daa2c9f22b368a8e657d91fca3686e4b91de494bbf96f04a80180c05480d5517a3e9dac1b2fb6d171f9b1ef3f0438a9e6e0f3439c5403659016000035d8c53eb5ae8c058eb67fdc81cb5cfb593579191c342bf5127a390514f835db0b6c460fd34510f2a37c7a2faf5a0e6741d1d918714c8b388bc6f6e20002fe31c4973fa2a4ca447a9bfef460d00f003a127e76dae91307e27e5d28c8015fde188a2d7ec20b050e4fda2f8d7212c1f04faa02c0a48ba4a8c89b574908af789583a5af441dc66d73aa78a32fa926a9435c3ad7d24300920fd706283ad361e0255e8cb8cca6af0a5ae611d967e47cb2660733a75d54439f4ee20e93a37e411303f304551c4d36571199bf7d92ae665e46c7592d6268f0340581eb3f41ee81ed780445a959ba5f67837a21dfbd791eecc166c279f588c6edae2734d9dc4ba6dd095f76414c4dd6baea8c9035a243205a4c6483444a117ac88e2eda1cdbcd3b39d271f90f800802e9364ca7858daaebe987ac737eed930ba7b1a4310a2187edc38e730e381d898cdd1c7392b8872c036fe2cbab2cf02247e7244faf9244999b4f5a41d178265940d03e6d0d0b74d603f7da1a8008abdfc6a48df6fe7e4002b889758a3bd2ddbc3125e3e9e69887e11fdfd69f40c3fc86904cd6b71df81e00b4490394c817c8a1ff46686fca24d59a597f7c16fbb2bd190825bf4166602aede2420cee667dad16c0f81e909159d425771d22395e140c056ab2472d27d43a3eaa6af937e93decdad0b4399818474a76a85a8c040afd13429c74566dc1fc4982b0430ef1687d4f12b0e2265b8f858e685645494009513714481302efb0808118e0f0043080922b308380a68f2bff2401849cf7700231420008403004011a48192367f8926ed1fedb460a05d28d6918008a125b412021080403481417e0200010120481200015321a2320002323c5b293847e7c740ec2d1793924ca7e58f1dab35dc2d43edd3526133a86958f8fb59899d02f00abf8954ffbdc088d0e0a466a90eab29e111ca1603b1346ddc7804176f6399cea818fce59cf758bf33db3e77f7d9127b8d849e3836d5ec850081fcdc79def152bd0abd15d06d4a4ec0405cba52d00cc005d475b2db27a8614ade66f96eb8c59b8800837223860002e3ca0b029771acae2fd1a7e85fd270b8be2af9a948de230f9f51ef0bcff4324b9b64d83e3cb75bf289277c9d7c5a250764ac9a09d6e8023205f4f05c2cfc021f90e62ea928f14a5284038c3f264ca0aa864dce55dbec4642d2a5000074120014ac40b89609c4b0d02501912c33c760483b0ce1986688c33046196120ca05cceec4a00a39855f5d0df5705328810e062ce72b677c786c3df8a1be9c51d9df1e1b0f7e286fa714828bbe9f1a0cdbff132288228fc09baa5a67157f08cc5a72c3a60000000000000000082efa8ac38a6a39010b0a860a9615111c80b8714e77d4482acef8f0d87bf1437d38a4cef8f0d87bf1437d38a3fab82994408703167395899dd894014730abeba1a28a9c09601000c00000000042b6b5c7aebaae02f958e83aa0600c4cd2da0e5cc2d591cc58aac5acd2a09ef86634216b22df8a642bfcea472425def37b6a63f775144ac2da3f4389184c4d9e6ffbba7712b4a269d7e3a09b73ce78ab96c632d5dd2a5ca6f4c07b8a473fb954106504d924ce1027971bf322e330dc1610fac35962153f4cb52302a0f6696d65cbc6ac3d82ee654462a82ec7e2e1c465b01acc4c920561ba726a34800b77d3e3419b7fe264510451f813754b4ce2afe1198b4e5874c0000000000000000106903514e50dc0bf5f9be495bc92b7afcd04d4f20c20e10900000021d61f4f02a119fe06414eba14a75130239553e58d2f61fe117d9aa5faa71d0c98ee29f60a716cb7f0b14fa15b9317309017ae5066a84218371c04c2c6470cd24310c3bae92dda021352146fcb6769e01755d7563000b90a812501e5c12868100094907c021e59066b11203bc06f362634f87d468e32c7df6d80048303801002411f9660082bbd302dd66e9d1c04db9a1fd000231c1f0080000581024150000e110c92106410c000c4486394c318a5840c5bf42f937bfd19270f56ec5477f4290e568f4922a0c51d52494047b735742cbb64dba10f059b46b76cbcc4fee2d1ec5cd3805ead72f26afdaba2c56a37ac0946606d788dd814f8917179f9113abd223eee034a1068158c610b7d0a48ed9818cc4f25932581465330b15a525ce26ef0f2b6c8034a108667ff40dbe58eef94f6cac042a78ea38d02f9d951525dec2888bfe1019accd9e500003afd7c0fc8ccda44c5c53c15cdcddfe526336a0dd699a4e289814680f050cd90c4039ce599a4be94a3949120e90a955811400098022e4c3f6920d73f10f2d257abd8282d57a24f27e7e8adbc18245842fdeb113f5b939aa1df1f187757f0cb0f7733d8b5b40003fd1c0eeac54ea1e064dfa61328004125cd8401b1d36a20000000024401f0080000769001103218a9205c390620880069b4861aac309061822b80fafc4318dc82e3c1dcb0036ee023b7ff1e5d65b48fa6aa40000000000000000105df4f8d066dff8991441147e04dd52d338abf84662d3961d3000000000000000004184100ddf5158714d4720216150c15f5f9be495bc92b7afcd04d4c14c08808600003a5d9e565748264833d434f9c00f20734608ab5ec5a7832a2e5fac1815a197e8f42d040737b44ec47d6087cb8fe436263e586f8a7239893ae41c5b7db3b4d4b3737f520d67ed1512332a0d3eb0834928ce5b575)) <<< 16000) + 0x14210af283749bccfc733083f1d8732859b364992008ec4b9f24041c00806002c2fc0700c01004000011102409e10048fefa28010fd3d65c5805025edc0004628400100000af217c33b1d5e895bf69723496b0908ec3c9ff2abe7e78858343d0a982b5a2be15842fb1854760c0930230666c8df9dc0ac387e2ceac5ecdf5399c4dbdaeb381005767845d7e864c4bc1765f448f728505520b9e62e9dce0b54c4b9ec05464e2d14fb267f25066b8e6892853815ea8f56a6595ad16545c47e1f84e401075bc0e5f93501034ae39d254ccf8950763fd67d832f5e3f430fd77ce14fa322765ec279454b2cfe7ea92aab2850e6c725f7cda52319f25c45d9237d6628e5d1001c6b70bccb0c753506f1e29beba0b3fca1e68d320dcad4572c9706a13c8c4350fff580060f49dca7b9dbcb0987b5aec4d043ba6db0000774200135a7020d21a807f0ed3b77100dc55a0ca5ec9058653d7383e3dc1747fc88465babd54e5e6e31ae6e3fec1c6641847c081c6d689778d775cd0a1ef914d02172ac763cfe136819fafac24de55d524470fda8efe0f49adfa9cec681b1a966d983167cadfd74a71061683eb73179990b2e3450d9cc972e8d0c01d307761bce02a58dfb9e431c075a41300d234722beb15acb1673d46301f254d6fb7f990c0e4608f8f1921343a4a1aac206d4163ad6e03b0ab000e49ce52ce105043865ffc10dd7723dddb03ef0346f0b4cde725f7c0c6860a36f2751b3542c072de3e46eff7722ee1e57725e3d0beedc3a343485f44ba776b8eca68fd82531a3f16b4b2c3fb6732b0995bfe4304e7cd1a8332f3dc3128f2ee81c3cbd13f43b16541c6702e041d1171192e3b50000246085e9482f0941764a0ba2505c92c2e09416e420241905b0a82d4541681a0b30d05902c2c40416002001a2020093e4646030eacd3e005bce71d1e9ceb9c35152848d371cf4883c8aa0dc91648281023b5785045dfb8e9d68ce3607d8f2583841ade1c9abee30d512abb80010a486434673bad2233884d71e35df5e4b21ee759c059ec85c9227fb700004269eeb6473cbe289f3d9fc0913095d0acbccdbf67e9314c5276e00904b5d1a33400f7b4b32c513e4a0be07117e1ae17d03f0ed58d74c98408ef1f50ba138c7065158da5e40353a0258e5305f36f00560e2add07480d56f5c12e9a81767b7612d96e38c8efe582f7e98b47d44940fd341f52bc305820567aea99975485aa3a30fa8a59b80734972904e140d596082beb18dd4971dade77bca2d94d1076bfbceafbfa5db93e3a09b37cc0000104a4016c1c8058ad99a930d0b5d32d2e668db4d2ff952bf07f332dfde4c8c223d1c000000000000000000000000000000000000000000000000003208a18818608c00a0020200280208287f2ec824657b0c57ccd44006f0642f2d4b73fcab2b98f85f608ea69982de76d12680e87ec36bf4c462605f35a979ad2277d9b4839a77b8d34b113002ecc6bd0bd7ab8fdc64f2354ef9daf4a91cd680ef01b0b1322d9678e832e80026e900ba98202ee7c60255aa6fcc9d38971562603847060aac136b48ae786a8508b6eb1c04ad274901903040a65a94537ca56f0fb922100b4b3450c5c640e8a88e80084c791cd37b0b5b00cb380067fd4cc371a0ad85d5dc08cb11cfcdea251733432811e435c649d7b366623c497b03314d7d2a22786030763ba719ed6cfbdfa1c6f834f5ca86e129d5c412cc102f7a3a0f8030a9462cd4b3fa5fa043786a46cf3ef7042828733d715ffa7658738840d2528071f15ee8382402e4a4fa2456f037db02d196e16185afe651002ce58f548028868d3ea489f7b690039549b6a5d77afe45ffc6c360021026e8c3b8de605d45d21490455dd2666edc8f0a6cbd5e0f2a7800002204672d29d397967ae7118a5d4e24883aa4272942979c871a65a8e22bc31ee9081cba95ce190002a2a6640801ad22a9e820072160c4020004a5040010b1476e3ff44814bc59212c51327f4734440447227b6860089ce21b83003282a218000987080021830c860484923194d2dbd0c2d307f09b0a123cb2a261802e81bdda140007c34dc804c2040010a1c4b5c7b9071b3358404c61404cd543c60c5255a85c24082000805780f47042a91232875cf0e01d1c6a87342a018599a414661402ea93b050250c200080000819000208215c1a0ad090001bf10ac090558480013e88551682a4940e00a00066420563a0890d0005f3902b4185404edf746160439418c2500d173613fb925049a5fcfacfd20000000000000000f144f0f6f0b7047059929e9417a2a73b79883b40e4d0523f1e80000000000000000000000000000000000000000000000000623801010c50880460040009a828a03f5d4efeffbad8cacc762a4d5829d7c68154bb18452b1d895325fa9f31d3224aa9ca2b0bda529c8500369a61b28b8b31f7941f0937a8c3d2aac82221083cdc17c693fabe90e4be32286d43e448b7a268d4f0bcce852fe6802eba2f35aea8e7bf68ad396dcd86d571abae57045238878f128c519227103163c40ce010c808dc2e089a9d6a5cf8db9165a1d15b2a533738a90884aee73d5051671b9ce091473a36d422f2c4934d539224ab2737cf0cc8162780235d2b3f8575131f637f1bd0f12a8cd586000000000000000000000000000000000000000000000005d38010121040332421822001000000404400272d84b8bda6a26bb1599caee0658801c61339dd6c1f8ae176c01b584cc423f0839f99ce0606d443a74aba8ed57107592c8d1540d72e6d0946166c78817fb52d24181240665945816)) <<< 16000) + 0xf83afc40400024301f008619167bb12861400001140306270ba8c42863ff0c1085816833c2623804703ffe810072d488b20000139410004029c57c745e28a38718000022810291c104aa4884703ffe88269b937e210562ee5f48208b8ecbe2085c50780112382356f40b98b1812927761fa80654dca69fac0c300f64a7f2a940800000b6340106635febd7d8380a667093c84009bcc08f7535270c29024590059979cf54a2026a1a79e118383d077ebe61c72220da8d588885e93a347b0b080000076981011768b2baec08291cb2117881ba0209c071c2ffc4f53e1780743f8d00affcfa7d9dcd8528fb5727af4c72e362024f53f69ce71939700000000000000000807002025009c00f1be816860e88840410468040a6dddce024377f0ca2f2b8ceef92c3ec5efd5f70751e19e651706f4aa1754b6e14a8a9398701c82926dea72be72c5292053c508d92f28001d9100058f350aad91e622e720b3e8eddc7e4e2a9ffe2d137beab47f07c000000000000000000000000000000000000000000000000301c00808458c30c806706686780680170801006c8eb515b84c9114dc3cbea01d88862cf3831ba052ba68706cbd164a0051a167804c103e010000127214c0200037920016104294560782b0041185206e85023b25081459bd137b808205b46c023c0000002283800b0f8e8a300023b276002c1840008e1435236f5051622ec418490c09e614149000d3304902810400080920100007490a30d85102f852ca60bac254a142e3be9d5e014594526c8a790208bc211799783010d5a5433130204f8021701db3c000000436200c002e3bfc256000fa102054058e17e8ee52d2853e0ede8c90d60b5dde30150f8e54c705bc948682401604d38c09830780201180a00013821421a00034a21400209f0104f008001800800971100147b20a25ba1510dd382d62d70bd7043da76858203885fe66f0cb4e26991b12f5d9f915211e140b53a745a43c3686157605d6204dbd60280486a0bd80583c15eac0abf0f671a869a58acebb6664ce1f352d4c328a65dfa81b797420ddac60f4548c221efd94418baeaec6631b55748ac7b20d277120144276fc23bc720e0baefcfa9b875ff05a8e0d44c149ea4078bac4cc24a2b9660998e36316ea3f5801562f65a2050acff8834db377b9a100708fef20daf7ed73ec32e3c180069352abdb4a26efda502eec2a3c56b33af0a01fd9a0eb62e41af958ec69d53bc51eeb76b3cc1d5ae90020007b6113c320311e45f3ba164e806e4c828ae06f946202a22d3d54b24d177e204161204f64eda6a15e1ecbd44209ce4649080c1987a9a4526a376d280601ab33877032a2ac1619093e1ca752a06c9e6defbe7ba87ab473b2ae5a80622b968f1f6c990503372f284737b6431b265468c00002280d0e7d07f1a1812381fb442801ef220c22000012c2424181f008608000005c0712bbea166a014719c1bd1c134f409907808e07ed10d00000036c093060f80438901b2b9d481c9374ea6426a208263a13f90ee5a85326f53d3c2009be43bcb19c1fad5b1362888e041bd4494498fadaa8fb125d03821fea97588e9ccbce3f7ad6a2800bda3149b2030d64477ede1100089a8eb463afc782e9273990072d3264e84471892868ab7b4e3e88c7b64e2f9470c5d0fc0001cf980846e350739c20ecb836b03894ccd4a27201696a1e60c385dc0fb5f59009d96fc0e06801d971e4609470c220147002026976dfb5d3f183841297c841297c8384388804384104580500400158ae8e7c8e07e7841429ddd2180c0130b9183862b07540006848001949f146e2851262431129feecc60e72d5877d1012253f3118e005074381c300112a0aa4c28c104402808f05f92225ab528818e73741d1a28538803430509ecbd8c78617b651f460fba1537212010b177e30270c1f0080000aa109d0100016a9000b1721383309b1584d08c2643702800004503c148abedb4f022adffae340000025809010780210280010f946790090563e70c390a7f0772011d58ad53cf04000cc3a838000009360260421008000099108f05c02386fa823842821594a06e18cb91a059fa0d490006c0210285422bc4709fd6bfd0a061432db8a0196d04964001c008000061108d05046008000714c0a048abe5b1c3048a1d25202091567263c09649b2e2340000017702a82100062050203bc73403e7506694284060d86cc7000015d3612020f804000034084782e05002004a91c302dab3ec18795b485c0a042e04c3d9a00591070f94007c0210282943c8269483e76ea1c380197549405c3050224001d008000063108d0504600800081080021010981184b86c2582612a0b8140c6392b640618c6fa4c304041ec84e7813185dc1068000002ee015420800310283d89fd850c2e4c954f0717c06f460000ae9b024081c008000063109409c13cda286030cff737a8b0954603a88061391c74e014afbf782004f697be6001c008590ab7e509201bd9f39c9606e0e4d663001d00800004e1c398647211611563c868c056e2cab87005446e8d08008b5b21ca003a010b21504f2fe581b1636ff8800740200000e640005e88498482480400070c4244461200bf3c3320589e008d74acfe15d44c7d8dfc6f43c4aa3356180000000000000000000000000000000000000000000000174e00404244b1043032c14404003802e080200d8978612880c0f00fed4960df6748620000574d84808360100000c0211c0b89636817574c0c24568d4a2000003c2c400b0b556507000000384035081f00844b244e118c)) <<< 16000) + 0xc0c306c367401ac9fbb08800002ba6c090207802000019c400079884784e258426a15820869696611818593223e5842e4c445020f3fbd5087002f1a1604c003c010b21506fc222869c6828a2c12feabb29605fc024124001d008000062908e05c4b10a9c4108234a977f0c0c596b2585845c9810e04186138a61c0178ca974981074021c5a4e41034b200931fa26061a77be41415db40991605d4785589410740200001e04000894846868230140008fa422c3400138e422804001f76406004003110400948481e02800bf188380480116148448880125d08441e80147f084398c0f0b6040220030151026be16a4509c45560f4507f12a7cc0700eeb353a45004cc35e8c009450800214400605eb61423bca35c614181943be004006f5feb64281840008086090428280003fc8420ac20c5605c2b0821184086c200360fe0b07e0183e80f8a2a69b1ec7139c34fd20e159a7db952407a99dc5c00048383e010e2800036d98e248ef5b0ca0110a1000401f0240f6020000ac20f43b0771183c82e03646b81af183526450621819a4f0a7514008b4a5ca1002c4ca48900000252c20008000089907811c0601737e7e306dcb1c2121845aeda7cc202064a1e34183fabfb23884a18400100770983b02f0a2ae04d50406ff9cafa830667ccd85c1853c4b85e22029dffd016183b3a4df362801a6080f6004e284001000015e20ea32074150398a8148540e42207109038028000ce48378a8001a3083718c1b4860d84206b118350880f0260d21306801e10512864504071768bd2c2863221279238062fc1c7000482840010d24a422f3309124fd9faec104b0130a588006303c770090308002186212c7dc8244e381289c30303888119100157cc99624042000800202800c040001f8419c44000406419835639236e027090ad8edbd68404808628981c2096ecd2b940c78c41bd4b0102cc6a6a0004c384201000013d20ca3b0511d8280ac13c460c81304d0983184813007a480597e6e86183eabc87450813ae17632445d72ee5a1a185cd9962040efee30f06004c2842010d25145843ccb1113a02618a128a7220dc6132dcc9cb8d019c0387e8a0014e115340098508002000026641885608a2a0611503000ac70890aaa0a98f959f4c7cad003cefa7c68336ffc4c8a208a3f026ea9699c55fc233169cb0e98000000000000000020a3a28ad434b816efa8ac38a6a39010b0a860aa1220c21a096014000161cbdcd2924287454f702be59cfa9dcc0221ce07582d730000a2f897d9e4ee453d54401153c8d4ed6ef9684fa3d097da0d79cf4a3ead658112ea8824862a8d07d47438f1b638448555054c7cacfa63e56801e77d3e3419b7fe264510451f813754b4ce2afe1198b4e5874c00000000000000001051d1456a1a5c0b77d4561c5351c808585430550b10a10610d0440000cc3875e0f601089edc24a870669ff840205f5fa07e79e914f5a2ad321821cd8cf10a3628996f3e49020cacf210783d41648d6c5e3da7dbf55bea30a7531951d033a6800237102b1182f84c0024d082f10e1ba726a34800b77d3e3419b7fe264510451f813754b4ce2afe1198b4e5874c0000000000000000104b0a888e405c38a73bea241532c72021020812c0180009f4cde0873665615e0ba7843efa04df931cb3985fdd12a8171fd9f002934eb3bfbb8a1f56e4e458b7262bb8f65d807abaab2e28b0c61ae5e50003ba205e6a02e2d01604800414c82ea0c170f60b66b05a3182c86e042fc0ab5c8020e41c5b0022141e008403004011448d30eca94020b1a7f022081d0084920a2d02830c34d108052430a0378ec69a0000bd995d848041e60193ca004401080000802000008882c0080005648000f510571100011e10561582a86c150260a60b8159271a3906145cc80bc0408ca178858e00b927ce28c004be7687a80004a5040010000110340b232acfe5c1ddebfe3db58db7122942e1b5aa71caa6200620b17da70db4b8060c8c035a3a419d12de87c514b558a0c3696332036df8a30008f5700b61b480160246bb76455d27c20b193c5c1b5ef8aad88a17d4fe2203086d021d8be2f38c120100007d09f2a8e9a4c5d0600dd4f5fdd76f125eb7e354665442e847b0bddc000bf6d71fd95d1c52e22c5ead4f64ef701c77505f10cd3a80b1809a96d72d2c001f618ffb6bf843d68e8dc1df9d83fcb817ee3fd5c09a971021a57042cf43540002ff10522982892c1405609e2b04e1502686c130076301cc23840d059f958c0bfddb171800d004246131f8880a0e4bf2474f00bb03ea44012181cfa90007402000018a60602a3a7624820f1e38b0806d632869c6003e01081401921f00c0414afafd49060f86c4a4c0014c946bc6001f0076de5002000800007e90001ba38199d2c53cb00658cf8608820780200000f0412007c18d2524d26067ead5209806d0ae236011880f004000029c82584ec22de8b76314217dcd6f71010465ff873809e74556e0109060800200001ba4128760922bc1ed9226218cfd3c7c3c0e273675c2fa0ac522498116f06cb131c2a4669c7762700a0829c0fa8b001ce331bfb3461bf3f09e8931f39719c475ac5888c42e54feddc95a484210f98124c25780c59fc83402d269420782d358547e1f419fdbf9a67f631977d0814160139a185c37d0804a069630e2dae7e77548f4a31b398ef4bbd61f098bb2c180107c64464efd3d208df6ea5f46dd6f8d0bd984edc3f1d957214e53835084a2a098c929f320e7dffdb1331554631283c5301862ea30dfbfa88ea50a6aba06809ca0)) <<< 16000) + 0x0f41609003c0e1abaf2230035a8d7f090288d9c5f0023141e008000054904709d845ee694da14207610dd61208147ed2e4e026a1659f60084838420100000e3208232000854208c3b0451902206a0180200880400802200002008c346e09ff8c022dbd9071000e80400001c8c0100401000004440003b0800094904301c060e527d89032286b0c0090a0e00200001e48210cc104560802303f0dd09a7d1c5ca050d8870050684599fcf0337145b40903070021844edc4da1c0c9fbc1f1805e4905b23041c0086103f7cb700408b11a1bc8810780200000ec78332ea2b00405b7f0b1c22081d00800003b90001bd3c0903ab228905049e90e501cedae6f008c407402000014840f85607a1380400802200002008820293cc590d00044f7dd42004dc62c3300091b0fa054800420100000d4300401004000011100014e206c1b03505d8035601c3280b815e5f00110a0e80400001f481e088000988f8321341140c080116b102028c0ef40026203a00803b0181d00f073359a32380ac77ce81809c20ab011840e004303f1025011081700400002390360d81a80e83f35d38e2c0208aa0694043d0cb7010123132520048283a0100000ce200042240e42400061c40e02400128440dc4605623000bea30383b7317953c02bb70340c089616e42862254a7d1e0304487fca38f720b671b5f301f782c01547e152515728e0945b67db74361cb7f71c20312d8b78fa9babf71ef00000222825866fe464bb1848ed0fea540a698a1342e14349a66e1f2025f6287280c0b3c819f901002324200086b13e5c80000008a0cdf43ab9f50b493c5823d2edbf62b0f4749cedb278ec13ed3e07a98f95a0531f2b3d1215541000058e01e1e60b30b4cb02d061090c60c7002000e6cc973cc8b8eee51205d2b9ffa0edb65b16224e85873cc1aabb1f69c2482372c0464d7a2ec30dba91cfe5701f877c136785530a1154a39c2635c1917e60210c1047f3d7647033550a7a8301a841dccc90108002183027d633c1234d79af39121986edec4918210004000029c81b04c0d4070146e7bd840b146160ee788151bc0532080a5d439dac20135d5de48000962f1da00261020008000099103401f17f7fa38894210c63fbb2836578ebfa383bfa58074c03de0647712020e7342f00098607c02000025c40011a88198280021f48004a71032290188e80c0240018d840bcf405c5a02d15016068009ddc8159480985400657a7bea2b0e29a8e4042c2a182a00003662c2d9f57a7f261681b011bca0f857a5bf2956a5d56f1dac12364c3bb0dc06ccf59ba1d86e03667acdc8706406482380300280080672d00c1ba0fc859e481c475659379a20c3682d3fb91720713a5123b3e39bae26e2d5b76f8d1abe41b2ead52d675dd7229c3251b2f37c5a145c04178677104a15dd2392680b392328db2e14b338b1b2920d05afea571f49414a77e4b9008a98f95a0531f2b3d1215541000058e01e528862a08eaaefbc0701a1e059aee1a58af0ac2b6be6ec12b400000000000000000000000000000000000000000000000000191df5158714d4720216150c1542441042021c007739e9478e9b391105f2c228fc267caeebf71f974e210e7394b0830b3a54cb5054a327a9c1b78eb5ccc24f6b0f58a200f7cb24dfc04b7571042c4d539a76cac068b9cd2f18a1fbe8caee69f3526d25d08c05bdbc51a8cb534346e37a088796c326c04f86e33432f65588795f3e9f563cede2d2d053ff8a357d33602b17f4554175eafc4a1f8a1119bac5a10bb2b368589b5400b145fdbd62b624375043de620051ace0430c01d73517b000251c2000870432cda1245009fdc0828002bf037b9800231820008702d1cdcca8800f00220000200800002220540b02901c118ff300224013e0c4682801a115af4002661ee84012060f8040000344c0400401000004440a0140003dc4000ae48001ef902709013028002f0c812988090b404652022290109280808603e1a01e0900e828070140360a001156200b45c40191d4c3360f54ae164a8e0768269af7a6a9c2c1bbdaf279644eec0000000000000000000000000000000000000000000000000c023043022822021801000807f9a4cb011e2701be100d77754edce7dc0ad67fbb1bf89a4dbac3cdc5c0ab55722b8bdc31403823b37fb150ddbfe2eaaff10213e80fc767c580656b4b6184f04d3461f6ae1e253a1a618b82743c0217903a768ed998d3a0c9b845dc5d3416305707157e4450800959b1a0a001ab10dab1000000012901804fccd1b9010052628230087157254174b0e1dcb4bcb060c10070332a840038736bcc460012acd0ac8a00012b3634040261c2300851026e5097fca1b0ba95c26041048e8789c1800000373a40800031bf3ca50023008510aa9c0ad40b18000004a4123000064cbb280c0b079c984800049380c6500230080000861b1a05ecdfae28674249a464208747727b22012babdde88201eafd9f599400880214428bbd403916300a48e2819628141ad0b290080a48d9399406055c2db69200012b2cec46002400c0000a110002642034130190980c04c05c2723899d7c36328500b3f56fc48b8458ecb8c70400e8247b8a000001bbdc0094408c02123a14e9b6ece1428002e776f78e08002e702f39204b43003b69100000e9bb1860064a2050030000131202c020002752000f2c4054140280a00092320264a0120500055b1011390081a803cb401c5200d1d0060c802c54014220090900404801c0400c02001077200aba004210018c8008440020200001006bd59)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase1" = "QuadFullSixCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase1 private def zz2238:"s08be"="s08be":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase2 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l17 l22 l23 l27 l29 l33 l35 l37 l4 l51 l6 l62 l65) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1b63d29ace, -0x59682eb50, -0x296e3b47a,0xd124838], ![-0x59682eb50, -0x2a99a09cc4,0xfa6b9c96c, -0x58ca8bc78], ![-0x296e3b47a,0xfa6b9c96c, -0x2f231e6d23,0xa1f622db6], ![0xd124838, -0x58ca8bc78,0xa1f622db6, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x4f26bcc0,l6),(0x1b539958,l4),(0x8f990117,l11),(0xa9cdefdc,l10),(-0x414382bc,l17),(0x15276ad3,l23),(0x18cfcd70d,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x35cbe29ca,l62),(0x22db5ec,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x35cbe29ca,l62),(0x8f990117,l11),(0x18cfcd70d,l22),(0xa9cdefdc,l10),(-0x4f26bcc0,l6),(-0x414382bc,l17),(0x15276ad3,l23),(0x1b539958,l4),(0x22db5ec,l65)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x2a014802000000005500a200c000000110f014c02000094260900b400c00000000780248030000052120013301000000000b00248030000000036009200c0000019024030c030000006e1100b300c0001a01040098c05000006a0440143010000000190901cc02000000640b01c300c0000000016014802000000044340a300800741181d037d004000000000b407200800002f4760124c040000ba0e300493014000000017c02c80300000871ec06830100000010864050c0300000003c1c0a3008000002202c02cc0373062440c0bb24018000000002101c802000000004700b200c000000000e01480283072440c0bb2401800001043101b0c04000043867024c3014000000004c0948030000000006407200800000000dc02c803000004d0480313011420a404200335006001702807005d40100000000098024803000000001c009200c0000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x22db6b406e7b48be8ee6b2737d7f0e41cd048008b6dad03dc95cd04773593cdf41f62b7341238aa42e8d7d8162748dc0ed1a05a1231220e20a008001b286a18d199cd4fa85f5bb736453a953f86432a80c9ce48a42d725698e062cd263c4077ca3ad7847f785462cc96b43c7867982424701e38131a484d74a2f524702604ce57604017a54eaa1000df3914fb44c08460108b6dad01b9ed22fa3b9ac9cdf5fc3907341209249241439239429420408209401904010068000929822d469e1c350b1c000000360081c235e1f97c4818222468d28491025abd11c9890c07570b66b09083e10eefb48b04017dff9ba090045141f33d074841400600007e881402c09c17c7bf01eb06ff981c60564074a931b2850d82a3a4449820500593e4aaa281c50cefe3ad72e12010aff2e3a5658080029f86b14b620400a04a9d69d8e1001e2bf0306f4b2a40a18016000090c80038d1beca860278c05a0cdd4c3ea4953a541d7591cda5099b35312db2672f627bca0000000000000000082e2a90ba35f60599018c18c108006002001ec9cc3070d3bf7a26143e64d656deca5178c07911318696f848dbef0de1963b4db2cd2345ab797b) <<< 16000) + 0x12cfa17aed5adfd87318a9a0006c67227fc7984cee6b27373b9aca00042d77c825216d77c825215a121458ed140000000000148c804630c3862063842041028085b7e03d76cd9eac2e6e414e5d11fb9d58ab1ee13b34b6beb324e34842ac658bb84192bf3b2b0e3b10559174000ba0c19ba987d492a74a83aeb239b4a13366a625b64ce5ec4f79400000000000000001044608604404304600500401000c9b6d9807c2474ac3e4b69454c357048b5a2427d9b923088140008e48130a80941404802e14f71d8db6450c117837dc20160a10a8c7b4fa251000a8c7b05ce50e0218d018a0548a005463db41f2a1f7f1b02a191d654c51787485d32ee706d7e1840b00912380915870a65203de229b5fd903873f3edce234c60c5140f181e808108679ae23b8180a53538e0bfa067019df9ca96fec83c932d12b061581428700a16bd1fec04898ce97774c9a88122e9e7b2a12e0c18876d32f968210200553eecccd22822796ad9192e4105a9b7f3dc8d98005a524e65802919602020bc0e1855e0dc7c0ecf081078ae0b79bcb18410fd1f5d8694412eead039a0901c314268ea89d308081f10e8597b11820848be81fffc5004a27b883eae0c00a1346cb329abe12005c068c303b8a94afdfda32400b21142106a914c5c1274b1b0853072eec913d48ca18cd0e2874dbe6fe20061425ceee91cd70dfb80a05936f4c16a3b10da006000c9a4f85ef259fe8218711a003802204600009c8d964bfa0e05aa2872a5e12a5130c30ca7f3b12e8a16ebd0e27ece48bb77cee07551440e35966f768c10296d4fa094208218e4cd31c6440214810000074480035710008d2200157878f606237768238a043a9338e83881b353bc6a430406474d72044020000001c203825b0c0fec703020000001c203000ab758cb6cf00850010e292ab48ccb5b471161e35c5dc9028874afbff4f22104158cf1ef5d7061911141594048706b87c77742c23035e0f4107e861403a57df65f0108008aab1c054b1fda410b40a0000456408c04044020210100022390201580f8ac0785603a2b01c1180d88efb2a1809e301694629ef95fd8ba5461bb19c777cad272458b2fce04f91397884000000000000000002220a7432e02d5f5d841d8a407f73ebe57d304197e7e61c195e000000000000000008262861864002801008367627215f42194c51bc1c2ac34e1207aba3748d6ca7ed5e053c8b4135af91e117a714803458563ee60943c71013501856d210a538827cbe70ed10a740aad3dadffad095bedadd3105a949c2140e739c7c64fb9ec54a1cac72d40922753788b739873416738549454f7a03402d2a05133934b2032cd6ec081829ae6308d08118c2148d01db78a8b060041fb0f46600200084000040100000446000020080190100001b90180980b84c0582602a1301409e1291fd87661824e3e1c12083e034cb340318810004004c07042c460ac3d241c07626a30e45ebe49db443cda8a6e13b606fcaa5e3b63ba04164ccd55285e42830661846a2968edf95e933ba74a057ac2116b7f25dc0f0c01ef05359a7ac71ebe383f1825eeedb0e06da7c0f560176351fcce5b1008c003db0406d0f0db37ea675e8960242b778e4cbe286cbc62abc84c7ccc8b5da024ed7841d7953ec3606fb9e45efa871c56f2b5e486c81e58e8783c7ff82ea0a4ab7b629c9e22a3ec18a58e73d3b92e98d52a563151d552ae829da6680005c520240a0006b73066ea61f524a9d2a0ebac8e6d284cd9a9896d93397b13de500000000000000000419798bb3e0622155989da23147ff9b708f65fa7f6a593819cc260000000000000000000000000000000000000000000000000001986402715485d1afb02ccebb6840d7d909b24f99c1551000c0080040016125b21aa59b8d7a0b1957de46614cf7fe031957a0d68ea4f5733e5250ef07a68baa060dec4d79fd80540878a96321b753d22f2a0bdef251aae3c6013ca242f703188ebbac19acd171ec307fb7844f0b9d7eee2cb90459618f34ba0103d19e6be7652e8854219c60280036b182064502375feebcab392c688dbd81542ceff3871579db104502b6183e29b904916083c12f96ff4f1783b3a57d80432306f5738115847b4005d21e3f332728d3567d86e1000b8a2d6c9646d30c2b8e7d058bafe9a4e7c599c918efdd896067a44a1cffd9d44690363d6330c3c71d3d86acee37c7101fea5f5ead13e2fdcbff5b1bb555e8688f2de02818986eb5b4a0aa1addb71f58931aaa9619dfb0d2ba5dd6aeb1ba415863dcf99cdf3709a5dbd83bb29edd40b621e1a445f92f72ff1bb22b243f6d867e7eef5bbfff3fd2d25beb409631f1d2c1fb2bec7951121814fb0a15d61c0145870a5e1a6beb7c77b03930b3bc809b08bbfad7c6df8aee7e99297dfab15d9fe8067ac0d84d07e226137d000043a900187437c012c30705590a54b2552f64f7d49b3c99e101ed39fad8ab419800000000000000000009094629ef95fd8ba5461bb19c777cad272458b2fce04f91397884000000000000000002216ac8bfed541892890bacdbc17b89abf61058981ef13840d205ea4000000000000000000000000000000000000000000000000000000d6630c18620238030082814d9cba7bdf0410727da0ec2cbdfa08764107889b52cf97615be51d2ed28ef3516aac4f019e049ece49d00b4800edc5ee9e7d29c2e0ac2f8f76c42a178f4eaeefb320cc6dde2aebd333ffcecd5f92444f1cd934d2578bae97252ad9b775d83297ffea94caaeb404404000f1840098f0801c0899140ac1cd6704440bf)) <<< 16000) + 0x874e6c62a010401e1e8f9bad08101c512cb9f8820b3c2a7e40ed4482110417a408e18107d8a879d000a00ca5499b23fc30032016947d00a7d090c2d02c5941b7e0272159645ce9280180238e065f985f0c123021efafa5ec38a0214ac98df0a2d3caaafa6bc48808c01edac5161a2bf45f7c6a3000421b32a8e080033b0ec005d9140054040b22d1a0d5ee732460694656e80871408c5dbf716145a7b036bb668910051b2435e02c365e3e51d198404000006200f0410cbf2ca37c0b004259c557c1c89002a0200001069b1c0000000a050a1e0228e8dc054b140000013ef4881412c0872f63461006402ca077c411dde968c94b080c03a35739104a093ec0aff0b80a0025d1f6e82ee3a9002c0280040080008d8c8cd02a4d0baa1420c4dc685998388000000ea60061d3d81b5db345040b9f7989aa0e105ff323e0ee482cff2de730f060008763b25140805774a7c62e2e448415010000084480047410101180708c03427450d3d57ab58e2653a0339585100000012c04043b39339f60419f827dc3088002a697bfd030040200f4a60001db56a991050bd521e0643a070940300003b8605b75df58b78410106ae6fea2430df028733460c0835737f508102aa411b6c5005ea19c9560c003c8765108200024ecc00f04009accdb15142d1e5eb548c91026010591f63512bee0b1c14f24452b8e3824b5fd04c2c611257d229a48c0496bfa098b0dc64e384a28a10125b074c618002f98b3d5c28000741c82e04002537b4293b25021380c35df209485b5df20948568485163b450000000000052259058c48c586284202082581a2480d2e0106c02a0002a2687851092dc372c50000008bec2853511a882ac2050000008ca0282cf2a359d80101000000cae42c00000000168280136a1660530082b68410bc80428018007808000810c8d164d6008678a1093c9dfae4112200d072fdead1c4000000972c01840c50d34bd2c905f0fd0607060201c5bc959fe6008c84345e121a5c247f762811c30ac0a000040c4001f4480708c03427c4a725e660dfc4042e6f7a542a03040000007b0c0c002b5b9d6ab0100033664b41641801737be5db30000383ca4ed77002ae3e3554850a08c2584590cedc70ac090000418400314080600b8670e2be864ddeca64da912ca1455a0859c3087b8f7506c880a012f765b55ba092091f8a0066ce7960dd8c8bb3a185aa65a3ad7ce4100fc088fb2aae5a9fe5f1330c0fe5417af0180889007b187f21f90a5b5b35da76313d300512e154f037f2b14f1990bd43fc1532d91172df39b121b6813ba82dad322dc138328159bd13397514eff9a1353706286925094deb6d0db9f7e18521a647da8a49063108b6dad03dc95cd04773593cdf41f62b734122e1c461f36a5ee7658f1676bcb6ac31cbb580badcb689983a780000000000000000000000000000000000000000000000000000ccd77c825216d77c825215a121458ed140000000000148c8040bd33e7dad0cfa299a5c31e1d1080a0f94b66b709aa15a90206190080002ec7dca80a26386c5f415c9150c331b87b4a2f712deae849639d2cf1b41c63b0f8b6d21db6d656740ade9acb6f2d715a49a2fa453f555b500007016033357f850fce727d082f985985d8a4b5767405f3a723b5bee391b64182953f91a98666262a16767fbb20f492855a15faf00ff5a7c84394d65c89ff1e6133b9ac9cdcee6b280010ae1c461f36a5ee7658f1676bcb6ac31cbb580badcb689983a780000000000000000000000000000000000000000000000000000cce2a90ba35f60599431428c28a18a086012efbeeec2f2b06cdca84163a2c2cd9ad8362e4586696c7477801c75797fb5d6c623bbf9222bc2e4a23a9c22fcf91bb2a1e6393a53cddc07a9f5b5c2e64e9f6e3154e55b1c30e585701a7cec226e8ddd20c5b8d01a491142968bd20610302fd50e29a61636608101ed79016386703495f42401cef421713821080435df209485b5df20948568485163b450000000000052251049050e38e406202082400380e4100401a00028275df209485b5df20948568485163b450000000000052248e40e48c30c384182600380300e4100401a01602000156363942213ca871a42b06ea230c30596ff8143485605d1860181cb6d14100367ce196acc18420100001352000af640284601213a22d47c41b2208007fada40c1c3eba040618625bc5ce40c00c3ca8bda200353f800186017b71ede48a8ce384401000017020018be4004ff8800c7f9c36a544752fa1840dcdf7e73238602b363b62840c0000001900e10000000c8018231b674e8de18008eceac03c49c309c02124c7e3a8f875422470ca444d3fc2250a0000002bf20091493ecc09331792181ed1beccf5c1c3000000075300182009db49a60143000119a0a9bff642000bc091aef904a42daef904a42b42428b1da280000000000291249247285245205081041240c000080340004ccc1164d62f3c0c288185b6e0e0a495922000000249f00204272bceb4684a480000001499700800220d192a79d0c00000000927c0fa380178120020040003b4608441f2d907438fd6612014d0714f49284ca090199e4b145321c36515581962306000000bb80408450c8518b0a019e4b1165201a713fabd150104e0200001e62000e88401c4600c13a2ffc12e57721437cdda04c6430200199a1cc0506838c583290808000002a3014059fc6e59e4180000cccba00017cc52e77000444bc90919718270100000f090051d00200800c0400402000b6420020200001001f569)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 16 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase2" = "QuadFullSixCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 16 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase2 private def zz2239:"s08bf"="s08bf":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l17 l20 l21 l22 l23 l27 l29 l31 l33 l35 l37 l4 l41 l42 l44 l46 l51 l56 l57 l6 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x6a3f403b, -0x572d59370,0x2777efaee,0x11bc088ac], ![-0x572d59370, -0x24bbf0404e,0xdf60a36b8, -0x584ab26f8], ![0x2777efaee,0xdf60a36b8, -0x2e3b37b1f3,0x9fbb4d5d6], ![0x11bc088ac, -0x584ab26f8,0x9fbb4d5d6, -0x2b96acc10]] noncomputable def hinges:Hinges:=[(-0x4f26bcc0,l6),(0x1b539958,l4),(0x8f990117,l11),(0xa9cdefdc,l10),(0x9cb281c4,l14),(0x787f1811c,l13),(-0x37c40fc6,l17),(-0x3d9933e,l15),(0x358b55fa,l21),(-0x34ce642d8,l20),(-0x13938381,l23),(0x7f5ca4e2,l22),(-0x2b96acc10,l27),(0x2b96acc10,l29),(0x744ebe66,l31),(0x2b96acc10,l33),(-0x2b96acc10,l35),(0x2b96acc10,l37),(-0xc2ab8803,l42),(-0x141fb28ea,l41),(-0x538eadc,l46),(-0x4d7885d8,l44),(0x2b96acc10,l51),(-0x4a7b3886,l57),(-0xce2479d5,l56),(0x7da14378,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2b96acc10,l27),(0x2b96acc10,l29),(0x2b96acc10,l33),(-0x2b96acc10,l35),(0x2b96acc10,l37),(0x2b96acc10,l51),(0x787f1811c,l13),(-0x34ce642d8,l20),(0x8f990117,l11),(0x744ebe66,l31),(0xa9cdefdc,l10),(0x9cb281c4,l14),(0x7da14378,l64),(-0x4a7b3886,l57),(-0xce2479d5,l56),(-0xc2ab8803,l42),(0x358b55fa,l21),(-0x141fb28ea,l41),(-0x4f26bcc0,l6),(0x7f5ca4e2,l22),(-0x37c40fc6,l17),(-0x13938381,l23),(-0x4d7885d8,l44),(0x1b539958,l4),(-0x538eadc,l46),(-0x3d9933e,l15)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x3406200800001c46101b0c04041472892018c401400000c41200f0c04000000000240b2008000000002501c802000000920e023300c000002682c04cc03000000004f00b200c000000000240c8010000003211036300c0e60cc11003ed0050000084641406400800002042201fcc040000cc5421036400c0000154410218c040000005621022300c007316041014d004000000000a40720080002e098300b90030000000055013200c000000015c02c8030000000002c062008000000150d03cc020000000741c0930080000000d05024c020000e4621e024400c0000002511018c02000148641402f400c00000000110188020000000784c06300800002041201fcc0404945a84a012e40140000000321c0cc01000000000030320040000001905024c020000065144086301000000198a4088c0300000510c404830100000118290048c0400000410c406c301000010e19c0930c050000004219014300c0b810610c08710050000000002409200800000208840b0c030000002609022300c00000000840348030000000bc740530080079144330091004000000000840b2008000000001d01c802000000003f00b200c00000188440b0c03001482a04803d4010005409c1401b500402882b822006d40140a60a209804b500500134230480324010005c0a01c01750040000000026009200c0000001109018c02000000001c009200c0000000012014802,0x140920080000084150318c0400002082b03063014000010421025cc040000000068303300400001c42201fcc0400000530880493010000291182805100303183304400fb40140000000a05034c02000c42104c04c4010000000090702cc020012c3106808c4010000000013404c8030000000341c0b30080000001505024c02000000000900c200c000000002902c802000000005400b200c00000000a803c80300000d1044069301000000000c803c803000000064440f30080000002d29028c02000000003900d200c0e210c09002c5005038c2382600f84014007109412016100400184530d8084401000000002e1c0cc01000000002b02f200c0000000c8004c804000000000c8072008000000000901c8020000000c428073008000000310b02cc02000000d82900a300c0000000015018802000000d21901e300c000003a8c806cc030000000010805200800000000cc0bc803000005104803c3010000000001102c80203085188200f14014000000002101c802000000004700b200c000000001f01880250c47830c046040180000000001c0c801000000000380520081051c424c02c500582c70448c02d14018000000000501c8020000076084049301000039188280590030000e4620c026400c00002047101b0c0400000000a8903300400001041200f0c04000000000340b200800033158240ad003030c54824011240140c315e0a00849005,0x5219024300c00001442201fcc04000053881024830140002a1206405500348435411403524018005611c3301a9004023c3182501b240140a812a1a4042900500148490d802540100a61221b403290050000000000b0320040ac126184062900500164480c8095401000530c82200e50040000000005805200800001c81500e0c04000007604c05830100000000015024802000006115408230100000001916024c02000000622d032300c000391482805100300000b21cc0293011cc11708502471006000000000b407200800002f4760124c040000ba0e300493014000000017c02c80303d45388703db40140003e148840d9003000000000140620080000008828030c03000002105003c301000001f0a0601d00204183304400fb4016c620905300dc1006b1882418c0770401800002448101b0c0400000c220c0293010000000003101c80200000cd218049301000032840c0124c05000000006700b200c000000211d01cc0204ac828720110401400001842201fcc0400000e4a44c0a400800000d4210218c040000003611022300c00000198a4050c03034c528680348401400001945301a0c0400000006854053008000001b8b4050c030000000000d03200400001b45b01a0c04000050881024c301400018e2840920c050000006e29034300c0001962940920c050000005221014300c0000000f07028c02000000820e023300c000002282c04cc03,0xb8004c804000000000b80720080a3106110047900502a444842009e40140002a110440550030000004a0900b300c0000138110058c040000000443c0530080000120110058c04000094260900b400c00000000780248030000006221016300c000000191503cc02000000044240a300800000148940d8c0300000009484073008000000c84c050c0300000000005032004000000d854050c030000003217034300c00001845101b0c040000005221016300c00000188b40d8c03001444b0f006c401000000c4110320c04000005511c06c301000000cc130120c0403c82282d018c4014000001e0d002cc0300000007464073008000000003002c803000000421d036300c0000000003c0c80100000002a00132010000000002a01c802000000000640e200800000d42701b0c040000000006c062008000000161201cc020000005821013300c000001509402cc030000000584405300800000000b00248030000000036009200c000001a044038c03000000640900c300c000001b84402cc0300006804100263014000000190901cc02000006a04401430100000001a09018c02000000640b01c300c0a60820c40919005], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0x84efe29c0e602d9e5db54ac2c0b5efdeed68942c392cf7b6cd33db47c707cc91071061060850040047b7861f519886ef39b98c0539b4f5127d91550a01fc66ddce32b257f1930e24031c410d36499049be794491c3f0a5bf0a1ee187e43192388310a9ff2837718c3dd04868127c5e4470009cb75dda4e1046010925c896db252c9235874dc46c0c1c0000023700a1c4c43a3bd6c91c111f4d2f00a0fc965bbafbc90d375804e758a01c9799353153f808280180000e490f40d87984c3c8061e20303b0187800ec62e40bc833c9248c47872a9fb9ec819a02df7c3b1010210319aab030c242e70e6d9b22cc5822d4d4ed81098a00d6d571d6c45080067759ef0cd8541576c70485e068000216205a5302b1d8150ef8c5f921623113ca15b1b7fc2583e0e29191c28369a71c397b106b61650403102ed646c3d040014a4e6e321102014008665c972150155028539237d9174b9cd0bc0d000042240021b0c069845810bd6a5657e4ffc23a754cc56bd580690050c1508441e607e24b0783b696f0ee68ba5bdae200a0daae75e4d9408997fea3a0d557e14b29b781ac00c0708e62973c7b65d912bdeba2d3b04e5061ae0001002a3b22e665bb613d19e01369ac240667bc3d5004445540049a5c4d9a5c62b0a20e2e74970e38d93aaaa4da1adb76a77787f0e7c55c1226b4a8053c9b1e400024a1c241fc2fd2496eb9a0e36be281eacfb136e5e24d829174a589f1bd7f603a6f9c98f0c37d047faa48c626b6a3a259194cedf310cb6ab00000000000000000fd9e5db54ac2c0b953b1ab565dbd3250814d055040c7085084082044404110874279191254b557fa42f7ec9fcd8c1101f45bd042b70fc495c855f345cddc50d8adb68a5c512e9a50fb5778f7329162415a0a335f23b249d1f5a7d6ecaa194e5d820c215ac48ca8bd504c912a000a9e69dab95a494ee1afc6531209cb645efea52cfebe4c5cf14400000000000000003f11431811010c11801401000003affd0a7db85b86b314176e23c67e7f7a43d73d672aa0314caf5d03a39df77a7b0b658a02d6d88dba25090d4000b2087792c3b8561da2a0ec098758283a805c2ffe2b1c3938609c618a4e79008101399cc10048004ea46f82cf18003acd530c8d10b503e10aae01c9367f456205643bef22887754c45aff2ea52c2a02005880acabdc8f417e712c82279c6030432072bda461ccfd2060454464ae511865cdc73a1a741c33a5b594224a1c205a6633f78a2400cb0ca471f608004725fca5e49c12005805806f01c90e2f5e963d7401638fbd062d03cf438f8c6a52129b111022659ad9fc311a40643983d27cd7694110fb7bc7191e45834f4279fd5e1f0c0823572a6c9a9018255ecc2b8089a4884120064090921c50e761b8da02c71ebc2134e598871f1f2393de6bca20452697a44d0bc480c6e3dae5209512822430b8fd984e8b0688e1df3ee2b6181122788706f0a0304ca639fe9830491082400c81200004be400136487482eca99a97a27091c6fb52cc42078b6460edca18cd468f731868a3fd9300708d7951c302811feee3b1c50542d0ca200812f1f290ce90022008595378934ec550848e486a5675fd5e40f55c75318e4b450c8253f056bfbe30d3f36a4292b483846e5858cad9ac5025e084da88c6c282d5907b28b3241026fe7502a8d1129012006008000024b21c00a0e8010002279b1be6e8ea9c94321a1dfdab305138cb3500486f10593a4ca0402dd05b20c00234a5883080159b5cd3aab3881180400005c88738aee91a0ddeaae18bc12b96ac9b7e7c5a536f824068bf71e1cf2155aa5e2c53b04c972e275870908b2c618a149148148085005eb38e4dd137f93bd96404676950e326780993c966ecb3bcbe8f8929c7de341fdfcf1242f2391d78e31524650002ea3c677c67dc7d30489c90531435388131dfb0318e81418d81efc62371020822b86173e50200467a6819c707361a329e420a0857d1715439554a22060ac0a01cc030002012142330a00984f80f8cedbcfe9a648ba3318246c28a7ae) <<< 16000) + 0x3bc53468890d2b4d044082103aae16302af88a03a62024d6aa122a30028f2312802008675f7b8d5200480200e501d120e6ae7338c1f60cb4be09a3020c1f46e1c607c92607248a0a6c7d8d85162a27958a160c964ed60d1810699b829a50084601000019b324039c9bc841c7006b845a458db68e8c59c6143602d46a90205f25f35f104484e6c7003000245c94bc100d7d01216ad0104601000019d21c8120d609871848388241c212c2e92cfdf804d42c818335d50206c923cc4e02f53212c7e12a8908439871e3c832f9acf83c67f120bc9e93091931e195a2c0a20341ef46b9ca5010682e368d7cc0eac2400b80e185aa7c94764a90b203f862cb61e249144393cee8d32c7a2866ed9e8f0e3b4c80c31d520f197034d63bce848c701cfd7907a2032c25eee0016020b42986e2f9827212005a06800022d20de0bc251c9899f00c0289c99da2a1f1e4c219a87a255a17208be8f792a43a0b1cbfdedb9e0c22442153717a37f0710199dd7be5e030266a4cfe88c10a093e36ba1e29ac242400b80e184a37189146920513939fe3c0ace9843d4e5b2e56c64112656404d75416395317630fa544883aca8134b960e211fb02188940604ba9427d07f614120775365f5158484801701c00008dce126c3866d949905132e9219eb5e9e610a06f9276ba724113a4fecd6f4b058e4dee9a7da8fc4882f0c32ce48483880b6902acef806048644da583f20504833e0967f1e5236120060080c24d7a790b900e0a265dbb2191eaecc217ccf8e434474821f272cea34e60b1c8b1ed56aa6d8910524dd2fcfed07106f7db01e5000c08f07980af9920a08da9efb9d030a46c2400c010000049640012c48004aa90e005f9038b3e1bf46412462d68cc7a8f058fcbcd814c0100e39b81ea49d55078c783f2a62552163175733c40a3648c71bb768733a9018b8a959e07c0306642075742a657c12005c070f207167c37e8c8248c5ad198f51e0b1f979b02980201c7403115efe360f190f152ea2bcc2c61fc4dd523834918fa681074f5320317152b3c0f8060cce5f167b254af82400b80e000046e7c81bf89b1ba1a491990a42aed9cb1f979b0298020e399a7682e4e03c6350ab7ce8ea58c7824d82e5289188d9560bd94901884f3c9bfb0183413976a1d115f2400ac0b1e40dfc4d8dd0d09233214855db3858fcbcd814c0101c73c7c11b8d4c1e31e58372309a0b18b4a3878534248c52434212113203109e7937f600c1a16080c34292be12005a06800022d20008c2437c2419c0200092f21282bd3c2d0e52a0174a94626509ba38e9f3d2c8c000000000f8345fb8f0e790aad52f1629d8264b9713ac3848659049058c50c60a30001d5242d048648a4ed8a402fa86ab3cb77d31757efda7932c49608bbf56335380e7e257f36ec4f5bb7d618b024680018690de01800d5a903509c88cf52bb65d16408625c78042e4388004ee2a2e5e506091564890983060a30614786e104a3f9d49b0b8280086f27326b000109b4a73e08801a8cc5782691b68102c02406e88c04c441b8220110d06d80c368040005344008d60801b0f90d935c1031d02fed48081c1a02353780122d44111ec28d20306950bb2556386b0fd8d278a040d94a330c18a861054f63b44e62411cc4b5cbc362002a6a8015d8322400ac0801b0030d701d0e39958d0fca50bad0328b5764880fd22ea9e850529461d08b848279d2880de8302001bcc0de050101d7bf67d018005460f42f8000000384058808280140000f8191dd5ca5a9bf5c1231dd7dd041c2824381458646e9b84060f616a5ec2587081ec2d3988cb120b0f3b9efb3330401763eda23816000000249f009fa0e185e0580001fc21ac13820f9fede412f081c1dec893a3d850ec9168f13e3040c9f6e9b2f99850bedfc820036c4049c49d076a288009ffbd4c77d87010e2a71e942c400b8477fa3812a09002c0284100ce00dd3ed202060b87fce307a00e18dc5ce06394cc50f1e5529c4105a3040de4e2ecd2561427dfbbbd0537d081153103156f0804045503779ddf40080524b11f5a960eca2400c40e00004a4434c161a40b91e59fdf4640848c4bf26590af145001f458f9c122632df21a6b880e23535dea5428219b2a51cbd24009951e7ab804016ce23d4ab80000007e9046d018520300001fc21aa030006e421a813a1c1db2f8f685d70e30089e5df54b14204b404682feb4f6286080637c9e877850851d8a9f9de5d8c0b0b26c33dbc1c0c13c1c252c08ff01802812b498d82802005be28b5f9f31757848019820034c061a40391c1535c4663091b8ce22ee9c451400a6c85340913b780c6326c80e10f198e010508cbff120c109010d28176a20100b0508769b0000000a8c0a4808280180000f89a1c0df79f93491871814028ca283109138da47f18dcbc810c02cf5dc0f3c80c02e9e91f4ad8504268713b5d86c105ebcc0f2eea1830036669f5ba62810059c354a2a1ca7df200600680d30186900e03a47abd483b14ef3fe2ba5dedc00a1df5ea0a141194ca8d000000000000000004112461c62042432030821412400c0400803400066080021290d10906800c33c0400123643386419a2a0cc150658a8328041920200173f21907b0c7398631ac314d61886b0c3358610ac30457e1273c168580b5c437d43cde538b3b03aca04c95268e4a8bcb8a92020926651a00000000000000000111b6996d9c2b40b0990410ee5102d7bf7bb5a250b0e4b3dedb34cf6d1f1c1f51841810c10400a5a72ca66cbc09fde59b31225410d24aed0339b47a33747687dcdd)) <<< 16000) + 0x977fc5a2bc4d2a5aac8e5f2a64bcfd1c8a47e2b9a8622702ce94b436f8c8321cf28ec812603ada06889f541fc260fc1307d0586002c2fc17ba3f7b325b00b6c877f5693002ce2f5abaf625b569f3518bf7c727c49ad86e75ca61bd1df4d33a600000000000000000046336afdb20d383e86d4748af6208b2ecdb980a3f801ec7d0e280000000000000000109092091070c30c90774a658cc853ddaf6be5eb7818a056aeb37fb63087da8b014b9feca49a777d5576d999ec568a08ee288298b4631d2ad61883190074d2348ef8e3070be8176f703ce457959a86156608a23b24a12788ed0be05f10167f2f31861f62c23f8a24127427938e600218cbfb5070005a4ced68200120e0a220260c230080000a01c1826a8a8ff1820ea56639c105a8076fef0b00002a7222004820460100000e438483f85fa492dd7341c6d7c503d59f626dcbc49b0522e94b13e37afec0749ce2fa8e83371281763ed8d24bab620511e87969b74177f7da880000000000000000022b6d32db3856816f8e863fe7d0d89b3090ba1ddc4f03df0c1d845aa882ac5cd16745da8c30bd0a949f7622a1430e10a10a004000594d35473d236249b21c69cd5f058702c9fa2a8f66587d8c885ee870ce8300aa2c6afce88caa5563a3591506d8bd34e32dbfdeb81eacda9d2a118b9ec48d0edd5e2319402fc9e3742e80976a0f0c255b6e4fce768a085f1e12c280e219263d35dbf1a0bcc0a4d23bc8a6a2b6acbd000719216a330bd0180079510bc2585d92c2e8961724b0b82585b92c2d88616a3a0b40585982c2c81416202e282a39cf7c183f9d5f1ff66322828c18786f2e9f3a3c1cb3c30832ee50243e05da08fa0a8023e0c4978bbf327225073970ae7899bccf2f2f481a50600241fbbd1b9a8174f5c352926fea12a090ccd8ae0f4c7f3222fa3d86d850026b19bcf6f022f01762a6882247fbbd0c0f686f06140347b2c64133b2aa3c2e3c21e1cabefe17e9923a211894e23e5bf7328c382637f0a4f4a06b448bcf08eef638a8ce28a3b736854a41beeaad6d977ec1510638cc2121f1ed4184001d1a2d1c935bfd61fea86fa33a67ed3d687866c9a9a5de0dbf6b79090a90587ae7d922ee0410a38b710a1756ca9eb53f5236b448dc44424338e1535794404003c3387e271b68e4ac7e84b58a4b81bb28a38c715cee9a3160bf6d6ec7ce0af082d8e9c77cf6596f829d4d545a24a192130d3bb574f9b6c0186923d5436af9bca32aa59b316a9484437b6d8427693e9c721419b86f898458df6033c39203c87f94ee0b05beaf646e599daafac73652794c26421741d8b578761c76dfba82c906404e00000c8042a07614e3b0b01985780f0c041d4996081007dd2a8090147a1f304c04111147b1741800560cbbac0009d0aadee222aa4c5046010015050000b190ae3185692c2b09615643a13299e078a87b36634a026c566336c9f910cfa7990aaa50de1f84834265311bc6081004ae8725528c7151d243aedb29b9c29832634374207aa4f19b090eddd1a03533400353773afa67a215d28916102148a2dc80ba251f8e7ba730fe79ad0fdbe46ce42001dc93dfa21bc2f289cbc3bd487e8343e457b635cb91bebce5c4c2b38a2ca30f111920db530f2c58a15d21e613ac5e36984e8dbd28a133813317cc80b844a62f512713d578537d570be963118faa5b71b0b02459371cafbb1c65ceddd39063fcdd1c6173bf215d30704565079060d82a5a8030c081649e64d9202118043c7036f4bed260d5e7bc0a54b0021f00e658e00c696118424042300800006f90340982502c2a807c28332473cafcc73abd1b83e2160f70dfb23b52a98387c85b0258ba3de43bcf505fc8f3cdf876d74788fe78f823778eb2677ef8a18192c2b6435a6c19ffe7769653b32bcfe60586c04aa54cab430007e728617b3b594e97f66264343736762c61a3f4d594d5b6a244b6bfcc48420a1632391c71b92724e1f1be86a6bf7133a44c18165c85fee2ab1434bdba7c2dd24a2a29d09c9905308a100009884001bdcc277f14e0730174ed5cad24a770d7e3298904e5b22f7f52967f5f262e78a200000000000000001fa6735451d6f9e2c665eb082abdfbddad128587259ef6d9a67b68f8e0fa1221218608c05f94318f94be980aa4d6df06b106b77d0396903a8a0c92a7b5f54f57afd5a80b7c6c42a410ed57e2a9a847320da49763a8ab43c96cbdd7887c989ca781b4a218ef3aec33c10d117263d4dd04e0ae420198e00814fe5da5acbfa7f0d0df035942ba1d9bd7d07440f3a000b2c42a486150430a7218530ec29476148339208d44d8c4e243e92a8110f450827107df0f2411600f25e9c604246c26827101037d33236010481e2f5cfa51454a3941300a028c561442390e85733be367514f0325347d55b2bde723db9b273e416fd8728b892c6e505963a1bd69edd0aff18c90a8c084f21928ea40a1335166e910996dbae350b12c95ef0b49d2f1057b23e65cf170e93145a708aa463b7218008d9f490b247eaeff3e89715d9033c9252598d34fbab615d1fbe95cfc5af5f450d4ab114f82dd91e1c2200cac4bb778748e2fdb6a91e3c70e64f438c0a8545def7cc739ac2d625a1a92c1c725fce8c3d85696a4551434bc8444ac1f138496455ee7f3a0548b95e8c578caf438a252485a7e6fa7bdbcdedd23168a1bb1c9731a2c777fcc674f84a4d75050821802ba4a23dd3f921832cd7ba1267ce44782b3d0f0f248cc51d250000fc64054140013a6407466003aee4284861402309f01f038b2049579988e52a26e63b1191b3eef09b73c3)) <<< 16000) + 0xe2e3a7acbd832753b5eb8c7bb2ca9e0b9fe507000dfafbe29a3ec51b04430b017b158311364732218ec602dd852ff69998bcdd3e5b542de767a8ac4145bfd80ca13509af56ca264632b3c45dbc9452c86138f18e054af955a67434ff6a629eda33037081316a59c88adb1e750ecc438638258536f009a25d5189e26f744629650c4f3cb418a3cfa95ad9e40e6fb9e44b8e440f92681158962a43eb466300937adf0fca9c289d2f5f76d1d4be71b4914c9121248cb630ab81056dcfeaf44014f581a0f23042100840100401000004441bc170238612b0e9024e2f807cb07ed6f156120d1dcee5490007c02160c04c1f981008d39fd852001f00400003b103605cc2c773da90820c8042041f1ca1c4501594d22f0807f42ed2923041f00800005190001072000528426817a0bc674431a002717f1db0204e85005200118a1000400002bc84e8ce010020080220984d00e20ead513fc20028410aa11040e80400a027c6b3706f999a130c0c4598e15f6502512203720595a2120610004000035c8000bf904a0d02182800084084f10f060d16577c8049cc09d90a0c3a2755430030f12904812080f8040274360941309c0584d80e06013756eacf0a60b4525c4041bf617c65023142100804d00f4c95046ff6342c50e9f5a2420acc9e734007e6e42e25009060800200001ba410c140003aa4000c60e9e168729500b55b9f5405868403e54748af6208b2ecdbaee98f3450e7d2078000000000000000010a299edce6831f416fd7114934332fd8b9942233492892452c02005010f739f83140fa376d211fc9072ad382660e3a75a8adabe038f18d8ba19822a8c9072feed29997b083f49915ff7797a57f97b8342dac4ee5298e821ed45883a9db7ad5699c7d67dfb99afc5e95aba5037e1dd71bea4a343da528f235280028210992d84c14c25c9612c4b09521d80f3b58a991e0b56cf2cfaa0e1054358c7f2f5d0f070ff76c57c756347f9844dd4dfd3892eeeeee38794ae33dc76be3a3b4e84638601e2a2a3047b94ae3c9f4cfb44c42034a670f08cad497103aae1620354b6168fc8dfb505f9c92d6f406f90b0c68570ada6f2548e88067bc5310564f1d116282f4c959433de7e45c6b58d3dbf8057060e737af13dd38c8247d983e27883685fdc9eb62776f60acd1c201116a4f537fccc64a5f7ef5cc3ec529e11239c05b98efd1f20851b404460c4c934f88dac7bc5766b5394e084f510b07d84437dbb5220948c077e37dff7fa15ad85524da7a577515b2ade57a5c0e93cc3194548d51d22fbf24c6fcec54fe07b71af774569642e427d014a43a4a30a69c36d01ef6eb51fe3e2adf972c0aa3a1c3364c5c8c60398cda8b090f0c1cf521edba9dea2830e325a844349c68336be80009e7200333840d4474483490aefd2922826be736670a286723f8b8a1018356192134861ca32901ed9060881e6236720a002998dbd2a147042801440616a89eac0c3834957040a123031e4bca0539e01b566804dd258942a084200800010321281380000802024c0612403800008020244071bc088ac413c7ee98572d5936f9d0047091048dd1fbd992d805b643bfab4980169ce2fa8e83371281763ed8d24bab620511e87969b74177f7da880000000000000000022931beab078814a7142087004819243ac47d6dc6aec3c6d8aaf32abf60fa733973b7ad7ecb4397fc8f9eb89d6de4d32da21920abd23c4dc00c0759f1d2d4d186f1c04ba4578dec35036d4e03af74880a247a50004b12000a0640015a8e122202c5e30b11814a5c3304145a5fb2361c10ffcfde74480539760b4d94108c02105b8b337cc0e080ec5744cc810880100000f842401411e0a0001cf211c2b08d158460ac22c46114230891184408c04c4410e220110d04300c2140610803083010005ad1002b73200aed66020000001c5ef1d88c07bdf21c9cc328780b3dbf343c66000dae7ec3b6f220df44e1e24e83f607eacd61bcd4a880d990d7b4618869ccb40528080172eed6c21ed8940d15bc7c501808ec596032afab58edabfcfc2da5b815237d1a3d6d9a533eeb573f9e0430e1d8516cd08ad3147c38e32d3e0350084bd06a906554abc4a64d80a0b395e404e220e8422f202220d200000025d3ed20bab4fd42d0d10435f564525445a5dd55679353af9e982bd45bd7d868aff2b53911d7a670e0abccc11f9b2cb5e266455c356001ee93c902d3cb70117250a5c08144404c23b52e230e5f955caf422cd1a953a3157408ada13557d56d99a26a35b68399223fa3798db7afbda014326fd8f2e6be1e487ead2fa647f3f153163e078461f0c4691d4069cc2002c8a123720a51426bce5e1c908f78effdf65d2e149de7aaeaca19edc0b056be39a3bd84e8742d6886ce16a7d932719d862d912902f5d70df30744804ef73d92232a34958c60d010402000b46200f07040322acc0400c5f8e0277dea0c22332c1e37740304012e03462f2c2c34b335ba022fe00284cf53184a35b22c81ac630944127a0282a83e41fe69a73fe40cc467e72fcc020354cb6ecf18c9d1b3b539411d8d9002000e91e5b6867f448e15746be2b060022003847fea65433561c12c34c0e545c12598b2bd5afb8a49bbe81881d0530102230801182888e02a9f69229e8b440733ab1b2701808170f4fa8516703014db586658aa00001b41d87744c4411025a834002213935f381360a1d03dbece5823ce13433efa9da54b0b80e000043a4138640fe2b07e1583e88c1f037652fb6107798f8a58a3ad8717672869218246831fd73a707f276f1ca14144a2950e)) <<< 16000) + 0x8f21929f6732c846b56d450e0fa7523dbe02763296dffc9ec90c2826ae7111f123b1067966ade9cc4899e55f35ccd6b0f6c1d070da72e08438f2ec6eee45a9011bf8085b1269008efff85ba58218c10d4260d1c61a4efc8912fc0c4fd0710085e96cca09f394751c700a4fbeb0020092da891c260820008000096907a05e0c53e54f8e407443fb4f630640d4b550483a785f0dc20081bb672e1801f2171aa08089cd42c401388100040000574e0d1fd99e1901b290d340307b6498558e021da3df34001e00403d8081e807c4274571bb90308f58f4b942a862f7261029896735b820f13c57cc14036b40611cc0040010e213600885942a96920362054ebc345648204683d50106f9f317754007c0100001ee788cc16b5de50b9443aec88148c8b3f78c0a42c4e0c14111835b32501c15ff9126001f0087114c637c4ca16f91aa21902b45b5a2e1811936e4de282a20633765001f00800007c1000236200091841e4240860a0005c320f033c33f0c6b3bc6ce15a828173647b498f9c85f7b38a3ad3bed0f1e000000000000000000000000000000000000000000000000000006943fd786713b02c8a0c90c80c9084082089042c9815a1cd230279f0ff1d2e06ec9cc41354f5b98567b9b322d8fc300f7bbde20e804ba29ebd0bae4c5adc45de3d9bb577013a05d361ce612c9168e21f06cdbdec4ab5b7d85dd28647a3edf35af7b12ad702530cfc31acef1b3856a0a05cd91ed263e7217dece28eb4efb43c7800000000000000000000000000000000000000000000000000001a5326e1cd01b1856581b8d4153283203102241100040a3e4a5ac2f8a9259ef5cd965c4a9a796881870c5a147f9d4651e0e6289e9d1969741c1a467400e24d5cb0c07ce3feca2b64d3c85ab52c0414c8b8f4c21dc4e8d0da9af33af0a43a8ad2bdb91d9820d1c018ca308aaa7140016a883b8aec700cadc026d1121c61e7c7a173b53b5640655c0e924687358386ed616fd18b80b04089028e69d5aa3969510e69067d6134f0e001f6dc34031c3ab0db074e0ddae04740008c19a169f49e06682c5f36385d9f20c242478b5c11ea141605d4eb85be8112cd2964046e21de77b2cca3ca08f62d8076015ef6255adbec2ee94323d1f6f9ad7bd8956b81293b69d47793816df272993cfb2c124b32d8c3a388899292d802400000000000000000000000000000000000000000000000000000d09d8f5ce8daf0dad5c634851ef8200000000012264dc39a03630acb0371a82a838a4882865004811d474256be161095d8b180a6f3c54c1c509875e70b3e0e31f66cc9ff2da8487b1f7abd3117c9d05f5e5b839fce7638db64c398b6e033277c869a85c69ea677011f9724696f8e97904b2a22db1eb0bb3aed23690415397e1f2b3131ab0943c73d025e6a82ccaf7644a229e48731f108ca74dae0878348a1c1cce92bb8eecce16959219a421440c196d4b12433971bd08b5491a67040402be75518da1e6505236f45bcae1c1133b33a9a7bf4766602c16facb08808c98ad0ef9da187c1eae679247589866fc272433c33ca78f537cc9962c2a8455fb417a0c7026046d13c0001d99000a8320ea0a0430103a008003a30800c5a903a2183990c1c87606e3b02901c8c56d583e792a6b5afc4319eaea25d9b2d7a00e0832edb3be42710a104ca8cba3e9b36e54c801826ea62a579e35a514a795dc8e599c290790012071898f6eb5ae61f87df5361635486bef03000801bdb30f947b595b8685cb6c921843ed6fe01c865740cd9276e3583d623ec407b0873045c70aece0ca32280f386b5f893de8050c8e1bc03880f0601ea914d1818429d1db0c10383e298008c408002000015a4074560c62b070158130ac18857a3d89aca6068600e679d9a10361e6ce4c1078011a3db4c5ed87809e591dc9a0021b0f544c107801000014070a177fc78cf014500d1f8ce30382a34142f1950822775ee54741c1076a32f0bd1411d10e2a3b63c002edafdf203802d1d33dc30080177fc71c70c2400a00600d40205601000111906f01e1802962b322c30f6de8bdc50c28511b8c4029b0254fdc9010880210409d5c24588181c66de8f2c314dd53260a18e307e14d00a50cfc4cc8005c906f7d2604210080000991f109db80026947f8ab132b1ba2412330d725fdfefddc01a8c00000000000000000000000000000000000000000000000000c6279e79650420478280078018018080100680010e982092656542385236d5bc4a02400b927dcb08919ca744384744f979f1423540332a1302108042060dfebdc79c2bc596efe1820af302949612d350cea8e141a298188a11ef9274b20037be679a1382100040000560f884edc00134a3fc5589958dd12091986b92feff7eee00d46000000000000000000000000000000000000000000000000006313cf3cb3c32811811014003c00c0400803400087480026e900095720dc0bf3ed7a2504c206008662688d11167f008328303a1f51ec80c2ffec1572504220087964b992d04696204d7be06899b08c5345061cc6128a406147806b62064caa3cba780f7afa59e4e08400100001573e213b70004d28ff15626563744824661ae4bfbfdfbb803518000000000000000000000000000000000000000000000000018c4e38e28708308a04f00e00c0030100200d00021d3e582d162c81a27672ae489019e8331420819c765ebf92021000434b1d52231e347053ecf5e344a2e610631035dba83552020cabaa483c0afa681182604200080000959e3a4de7fc01578438a0830f09498ab8c0)) <<< 16000) + 0xc1062a504b5c40c2049d5c299eca4504214a9fae736b3c001310c654a300e007aa3ed51cba43000000005b8d80027104041901e000088880022b102d050368080025388300cc17c670040100471404d9de69c110e3aaee505f06678c1806a0e1fb208041f3d9e12820f00400003d4f0a1e42dac5c78184f08e79b97548c191e656556e48909a1c104ca97e2841bb2781953a0823a72c424eea920dde8937c37541052c88db535887013e832ee5fb6d3a6400b40e00d8020610100012c105b0982d04c1ac0700401004796062df5b520504b04b271610aee276c420a9277c1ac080115a911e2504210080000821f18197e8d6fed38a2fa66c99f207a2830320017a0c7030621c4b0f52ac030c2f52100d6420e10186600c129f28120edcfbabecc30245e6576910f0f00b9b836bb465c6e09002f03c035008158040004d64160260d2138000080238f34cd56838873bc6f2780bca7a871800e0040000260c8681eb7f088105f0416600e02ebc608091ee59c4808380100000c320d00b819871721c0818b326cd9e0060a4ebcb0100d891ec8083a0108929dadfb3910b88ccb73a20ed9d444f0800259eac72000f80430a003b66873030008c71f442949723d0441c92c2d6c44008894e733400011964b0c0011ae6a39c00800200002aa40008f8833848000cd8f884edc00134a3fc5589958dd12091986b92feff7eee00d460000000000000000000000000000000000000000000000000063138e38a3833c0380300320416100b00680010a100074820016a84178240a80a000f7d2004cc06030792bab019d554290ceaf50e4d274d506d46abc6e4a42112e53a3ecdbfab4c3c27eb3254c95d0f581050f4a4044f09612250702d44b105667879942967343c879d1d4a3222d05a0ba024362ba6351b66f6316564e5f8d689040b8ab272817ec06b6b746dfe1b954488fd2b046145d3efee7e32066974b64550d629c6e4401489b7545dc5c589e8b866546b9ac7decba0c6d81b7e1197b968c4b55571bd11dff83cb3851a9dafbfa4f2d9779d0dd781e256aa5a005faba3f2eb329a79beed544c5f7de59e68d3fd3f81a9c9a3635dfedc86ca80aaae0ff24f08c256d3e1220d56f47b243408916067041b47bd5cb0b4bf535b900b0332ca6200425734024c083e010e2222f39de121e87b18eb2c2d56c3b8e402ba117d70e01c18ffd48602463609826041f008000092900026520cc1305e0583282c1900742cba5f6a72822faad0d2480b1686e648c107c0214203520c041849e764116504ee4c4adcf018d11fa01802085f59d25041f00800007d191c15dd4c0142c92a61512824b67768a4020d5a01409015ebde3212820f80428471c78aaa30807aba4b4a09ecca7c31e0383a621c3001ac7a80a2010bdb9c3498107c02000024a40008e882d04c0c80763233deedf9610178caff041583d614914097301e1a9202100042c6838f32ce502ac0f489d0003a657879a035d8ffda24041f0080000679f2c47d1abd9238599be822847f57be02502baa389b0f02652ec768803bc68f7a498207c02000024e7057623b6c250b0ef8e054610076a6ba92101d6bac52404c935c80080f99cb4fc26081f0085d1916d2aed60cb132203da794000017700896ef0c0d46f00b582e17013d80ef7c72c1e6030a49462c8d17620d9e00a0000000000000000f17b5d5bce491ce73888aec1542471841033c01006ba5777d7dc388d4384d02cb9fc12229f81ec230d63489d6db5c1865a64ac57ce55bc94f418346349589651a94565cc73420f9c755f4eaac0c86884c8f7a84819cd40011b48002d790550500046f1054050006a310631d8310af4d2d4bdf312c85700a43f99303efab1b1cfd3fe9c39f5536eb482c6b27b6ce98ca1b8068a00d249961976a7bfe32a8f0ff9799fd8b8e68c0a0d23af83c7f176057ecac8c0654c4b6ed41261c65bad452b45e4811b2dd527e596fecffa97409cad520b817be8c20d7d9eb2b6994eb06d5209127003104f69fad2f5323ae279708b041ece319689de15f5d171cfbf06a09bc49385d069cb16d57341d2417e03eaa7d694288c3987ce9bb08f4d2bedce01b885ee3951d64ec3b8f2aca9e311ba86cbb69a61f347d45a309756a2ca8c53b149fbadfd25b8bb35768fe8464052241059403b4895668c186088121119ef9224120bc717d4460e1863f78633e1045f083a513032410163b2a4912880b784d05a3310e006c20ebb3a1a2002e8aae25117bb9c801681a01840400048460637bcea24489d9a4000860dee1266c1c110512f472c2d9b56ee0402a4a964b898107c02186654d06165dc091206fd1e353fd1042b17a6f6407860d72b13990c0e2420e2d92fe8bb0408585e6819a2920115445d5c9f0820439c7b5bd7ea380396442f2f0daf889002e03803080800092c8001c590600d82f86c178160ba0b05c01d0a2765ea2f1a5d83fec4f0adbfb9ce7b546d02c1c28eb891ab373e14d4f619c5dc529c0d33d07b6c1189752a20f292e2ead23f780f9a27fcc0dd035cb9e8da8f8c43d5e3a448001086d6a3b49d49da33c7edd51a57d3abb0bf52d97e1bc4e6666db65edcc355d7003797a963c3fa9e0f596b53ff6aa7f92d7951a8499a503edced568d9a124110122b6bffedeb656198187774a1702310f25f45cf39a8eb8cf015ef6d4dc6408c1428e91c7d7ea2bf75fd4a17d8b073695b21851196c646e1707138fc92646fb80c35d0fa542b0b8a0827eb662e898082949239871aacf020092fd8cbe40c00d4e79f4f30347d4801701e015804000498685ad)) <<< 16000) + 0x60f8b75e5ce643f5868825a3fa1971569cbd1b1dbb99b07e8e2468c47e210b99844de07a2a1741d6d736af83c41a71476373f0a0878e8a6a5faf3f4d53238abad79ed9b38ff21c915352f6a6bc8202fdf4787c4ba98a531987883cab5ee5c47b00514d478752a1750a00c1df3f7cb08b61a442d3f79d3de95217d6c7e685124d635104d74deaea8825e729618d9b4bced84b0f91bf3f0901324ab1c773512da9192e50b06cc4cdf2bf861401f73c5d5fd0e237614a932cd20c3272936fd9d445040f0cd60891b02085943030be189e020cc22ea91920c00a088ff86e61a3ea400bc0f00ac020002552000eb2416c360b41b05901d0b73cabef438988093128082a15edb2848004e8df5e12041000428833f018672e44110a28cb55050b1a1c5306ed5e0e301545198e1a1867754df3253c20836fc2e4e474708122e0aadc9a00ac6eb7218f3101048b8410487c8e400ac0b103041e6c0f40e16851004ea512d6fc913470000017d7840016345fc0a34cda5bc8153c0d03be69b788029b1a1da86de06f42403001a82a00006ec82b00800101082c06f8572c52e093058f591121285604042b71c4848ed44e241031f63d710015b8694a04010cf50314270c2000851030ed558540b190044596e98e31e9c9a4129186a385c886c040ab2eb4ddd84b10000002a300c20bbe9952f110407c0a30160802606ad4279f64801380e015c076497642ab280f249c1044bfe4ae60f21900b5feec71c2c01540b6190281a0d32b0371c52c4b391ae0028a011b4fc51f0508139603ce8884015ffabb4672f4320056058b2453fdac481460ef5a446a1b92076220328e750e387e9109c0c891bb7974de6b838a62befc8285145000000a8c022021a5964cea8c0000000bdd814448014814000081880021d10560100033810007e620aa0a000d1f20a80a001cbf203a4a002a5a200838a414c7400dbb44148c60a24380b845200e0f854b05080000104531de40701894d97e626e0305013d9e081a4b69bc302c96621260557204054f3a4b2a52b8ac381778932ca70700c805001027808000828804af1104e2502680b7ce4c7861be823fd52463135b51d12c8ca676f98865b55800000000000000007eb83348426ca05a096d615b405b8d6a91d9dd8f8a98475d12846638618428020018022a2a8664f2872a1cc83d09ffa5d318a133ff09418d28f8a54f669883720723cc33e5612216875c9a1ab79d76d46da2abbaf1df2cadb5fbbf8b087f8872866c0480040b40d05e094722e724e380257a40a81cec0c637a511ae045b9e3f5533d8d9b8403ff1ce588087713740240129480ebc14005fc85e704810420100340982602c12c07628c6b1cd5c90cd1cf97ba2835d67aad720001ce492b4800420100220182300ec6e1137a879420e1a1174c6088c8abf5c202cd96ee6890008402005003a38ffa6b6e1e00364ad2c0aae0cd2109b2816458c5084043042027002011cb22df98f0f2abba7f49570e71adf4a77471704580ee8000d090002a6209412043050001f51049116f9c98f0c37d047faa48c626b6a3a259194cedf310cb6ab00000000000000000fd92ee43c018c0b5c1b8c19a4902d70669084d940b43082021c12001404e7c403684a1b04605a05cb7f5b0c38abc14e9e63a3cca4f3ae52260c1b5ca49a05327e36d1969fe82d2bd66e11d6fa098aa219c5ad0480582380e43a655867a306a735e00480ab5054998e0cd6adb040c17e3102204811cc5df3826081f00801104c118074204efa9078e22b5e38ea121ac9923690c16190ac69080e3be46fb1282100040114174203cf5fdd471072ddf2b248655df32ca182e284710b0809face025ce0139ab9d2220033f2d11909c20840200002c0411024000548410c1400084a4001ff481690c108877bd8956b6fb0bba50c8f47dbe6b5ef6255ae04ab941dc4214128431a70f40ab4aae3084f1016df3931e186fa08ff54918c4d6d4744b23299dbe62196d5600000000000000001fae0dc60cd24816a40a40638020029addd6b17a7c25bdda2d16ac7adb69a48d93a6e26d9b07e7b5d276a4d555f32a8ca829adc54074502bd5d017bbd224149e8c66df9e4290bf569b6e2373e060ed22eeb8a79528323c8350410582000e461ba6ea0f14243e203688911202f0faa3801052f4da0804f88f271884a204201003f0981f00f4aae3084f1016df3931e186fa08ff54918c4d6d4744b23299dbe62196d5600000000000000001fae0cd2109b2816bdfbddad128587259ef6d9a67b68f8e0fa096d615b405b8d6a91d9dd8f8a98475d12846a59040658018051de1293d8caa04c25c60222886a7f84cc1743b2e7f9e74b74752626f2df970b34eb7734ee0ebeaf510dad8e19bef761a8887b4bac87346711ba0fd4879e8e8e25b45f1c0403aad3f1d3a8126e8cdb1b1c1b72da4880fefa319183c8cb697b1c102f73d53c64082100800006c903d09d0b29e9a3dd9018365bd628286057fa15f0e113a8a19b828496fa04b09a0183c60720213081100400004f481e048001eb081d82800244081480800396c81d12c0e4860704303721e06d220fd03728a1f7fc2b628a09c99fd2bbc290b580d046d08173bb02a2e4601ad4bc86fa40136f3d7ca6bb29757b14cb8300de004624fb3b3d3d60a428201c33238c52a6d1a008999600034acd71aff4e6ccfaf59c020af8cb5b5eee0101ecaa278504108581c6acc504e4e78ae1b800037f206c520350dc12c14cfe98206d8a11a341819aeb8e5292018ce12730801a0114538200285215aa098208402006813)) <<< 16000) + 0x03305e15c986f6e0408ff2c51d090485ce56e0106bd177b78c0025a6adf4b01e69fdf4260020008616dd903a620447ae74a241619b634820b94f93828003a0080000c320440b03201e08718d5c0050216c5d54904198798dd11a00236793c4c0016dfabc41808c117b1a980084021c7b14e17a82868ed5c264a042562bac820afe82a2290007c02000019840c4174203810e120a1811dafa80c0a4dd9e1b98023335c078604451ce43328210004309b5d60a98e12f9670e20804ebb10ec6003c010c22f587fb54000628533658068333558602183b792c8003e0100000cc200030a4000a7c800272100072f36301609338880c52a843304842ab569400c13301423692066d78f25d9410840218483f85fa492dd7341c6d7c503d59f626dcbc49b0522e94b13e37afec0740ba468376267f5eab2b96ac9b730c1c3cc411b747ef664b60163ae0ad8d204a163123121060840c2824364d6f72a7ff40ac6b85dad3b43ac3b0f5b605cd2ae5b8594f742a9f6a81818b3b7f5e61ac8b76d2670f3b4d7494e32e939165fa71504e93428002031030010178080b804000ac840b4660583302b158150ac0a4070000100401100c080070000100401400e00002008c0c3ddd794090f95fbc1d8a003593eb84301ce3786d240020008000068900010e20002c040743604e1b0260981284e000020080240181180e089714aad160a6883b54d00015dae808051c35f424041d008794b0772f5208e04c53d2008a25dba4b05a88f580102b1d2ed74004f3b79093020e80400004648000fd9d2c3385c1491640090f48652089b1a0b91c48800aefb4c0d0046b7b5441200140a73e30260c230080000a09f109db80026947f8ab132b1ba2412330d725fdfefddc01a8c00000000000000000000000000000000000000000000000000c647b9da6e2860591861839438e39019a01800e00060400401a0004ae406c040340200065a345ac0de2b8c80807fa275c20004b9e7c906610440080220181080c08007004010044116f8fbb8e1420af87996a5840617f5ee200039ad3d0c6800ee907451282110040000424f1e45283e9643628fdc82755b4233a9e7b4e24f90d375ef9ac83c0054115a85e30bf35c80626de35956a0c437a5b228ce02df4ca00072ce9dbc3118e2a8e3d4c8f38f0034190b85da04472e3620077c605f6f02b4fd738d75373e84ebe68be74fbe0a7ccc62afb6352fc645a3bfa0f493fd188db5a1b948d5f4c611845080003ef203e139255008d1b4709def3f3fe30429dacbfb922511b56dd4100a0b23fe624a1842010a14ea638f8181d83c161c2430141d20e50090685504490307c0200001a640007d88003bb101e09e0e2114c1cac71e0a38881514108370ff3920207e9357bc20220d1da358100133d884024c1046010beabf303073af7311a75b5681f15e88f640f3cda8d71b4008846000000000000000000000000000000000000000000000000000006923dced3714302c8a1c71c80ca08808d00801f3b849dc72fed854b806c934c6c9603d207ea587786dea4b28463471c2ea9ba0bb8f127386b985eff6f4852c4aa4c313fbf58251c28d9f276aad6ae11f06ed000434203a1a01c0900d80806804000bc44003a3c80c88806024002ec8405ca602c33dcf3bc46595061f8462c7c338fec52ce472358370281cddb3fac400000000000000000000000000000000000000000000000000000352b8973e65ac2c0c861e2790c7eb04c4416912935d3203d5c904000000000000000000000000000000000000000000000000000ca99cd51475be78b1997ac20a98a20c18619208c0080080acd9aa3a305cffe307d9ce9f2bdc025eceada88e5705aa2661a9e69ede5d3f3a3f6185e4ad6854a640c50d8f0c4721b417df4594c4c5f6f8113ccf192309f9280318859db4054040280200065420263a0121d0088c800b394802681100523a3be7263c30df411fea923189ada8e89646533b7cc432daac00000000000000003f11431820c21811411010c008000555030680200de28e7a586ef7870e2b26e75aa43060000005dc01c0128bb292c80c001f529bc08c40009edbea3cc00000007d02140a3101480a38bd6aebd896d5a7cd462fdf1c9f126b61b9d72986f477d34ce9800000000000000000118491ca1491481440c70870008f9b6817b0b4fd8f829ccf565dd794000c11288cac3752818b236bbd0f681e6b5eb54e1c1b8236155c42bc91b65fd3a6ed2382c902dd0b425e58e8077d87224a1c0000007d0120000000032004000343e22a6000007d3191e82708270085973ac759a07e7284d9fd05321cb1c76cd2af57a3d966046f747a0e2000000025f0e3415712577c01c100000005eda382359addab605800421a86b3d1214ab01bd75778a894389d556ad4017c3800200200f0100014c1a2b8124f8dc78a2004bc4f17c8b180000002580a1881759fdf189180000002580b00007cf4b230a0010a7e6e2a409c30a002000032640017acd2a51899426e8e3a7cf4b230000000003eae25cf996b0b03218789e431fac131105a44a4d74c80f572410000000000000000000000000000000000000000000000000003291249041221020e20610c000371401006800154100e11006848002f508060ec02c378699244ec19218402917feabf1821e48691968142000000096018009ba61f914100003b863ddb0001dc32145a00029a637125013964de088662c280080000f3100a110007e49009190040a801c5400c2a0051500200800c0400243840084400202000010080e41)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase3" = "QuadFullSixCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase3 private def zz2240:"s08c0"="s08c0":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l17 l22 l23 l25 l27 l28 l29 l30 l31 l33 l35 l37 l4 l41 l42 l43 l46 l51 l6 l63 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2e97cb946, -0x1fde7e608, -0x2fcdbdbca,0x4d0aae78], ![-0x1fde7e608, -0xa36763542,0xd25feef0,0x1900a4924], ![-0x2fcdbdbca,0xd25feef0, -0xcf26389be,0x1fde7ef6e], ![0x4d0aae78,0x1900a4924,0x1fde7ef6e, -0xfef3f55c]] noncomputable def hinges:Hinges:=[(-0x4cac40da,l6),(0x52e606de,l4),(0x5644e7cf,l9),(-0xafe62dcc,l8),(-0x34b44c7c,l11),(0x5bd91eee,l10),(0x5398d804,l14),(0x1b79b3fc0,l13),(-0x4aa010cc,l17),(0x4e69ff51,l23),(0x9dcc85a,l22),(-0xfef3f55c,l27),(-0x7743a5e6,l28),(0xfef3f55c,l29),(-0x10b399f04,l25),(0x4fe0d124,l31),(0x8bc3f6a8,l30),(0xfef3f55c,l33),(-0xfef3f55c,l35),(0xfef3f55c,l37),(-0x5cbc9986,l43),(-0xc0243342,l42),(-0xcebc5036,l41),(0xdb446a4,l46),(0xfef3f55c,l51),(-0x400c1116,l63),(0x5fcf90e,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0xfef3f55c,l27),(0xfef3f55c,l29),(0xfef3f55c,l33),(-0xfef3f55c,l35),(0xfef3f55c,l37),(0xfef3f55c,l51),(-0x10b399f04,l25),(0x1b79b3fc0,l13),(-0x7743a5e6,l28),(0x8bc3f6a8,l30),(0x5644e7cf,l9),(0x4fe0d124,l31),(0x4e69ff51,l23),(-0xc0243342,l42),(-0x400c1116,l63),(-0xafe62dcc,l8),(-0x5cbc9986,l43),(0x5bd91eee,l10),(0x5398d804,l14),(-0x34b44c7c,l11),(-0x4cac40da,l6),(-0x4aa010cc,l17),(-0xcebc5036,l41),(0x52e606de,l4),(0xdb446a4,l46),(0x5fcf90e,l65),(0x9dcc85a,l22)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x304508780192401400611443600e50040000000002c06200800450f41c0219004000000003830330040000014864090c0303305286503984014000210e830089003001c4610d8099401000000188a40d8c030000b0440a01b400c000000000140c8010000005221014300c000000016240cc010000003211036300c00760d01f019d004000000341100e300c000311484c079003001d44805403a40100000000001c0c801000007119c06c301000721941300e50040000007231036300c0e118e0980349005002503308c08740100000000084030803000000002102c200c0000000009038802000000074240d300800951981501a900400000000084062008000001d834074c03000000003900d200c000000000901c8020000000b4340a300800000208e40d8c0302c440878008640140000144310120c040000004219036300c0a410a114024100501b422830008640140001021840348c050000000000303200400010a1940648c0500004386700d2301400001083200e4c040000005609025300c005410c230121004000000000240920080000094110208c04000000000840b2008000000000340c801000004d048031301000520a81200f5004001582405809d4011440a104400635006001502705006d4010005c0a01c01750040000000026009200c000000000e01480200000000009032004000000110b018c02000000001c009200c0000000012014802,0x170320041491ca3140c6d0050548708c102bb401400000289240d8c03000a4c90407a430181862521080865005000000220b00e300c1752902b0052d0050000708c100d2301400b22985900ad0040000728c5019230140001ce31c0348c050000072188039301016f2982c8022d0050000000241406300800310941c01990040000a4320a03f400c00000000050248020000041084097301000000088280ccc0300000210540c6301000721482301e9004000000000340e2008000000000640c801000000000840e2008000001582c090c030000000003c09200800000000c4034803000000000740620080000002506024c02000000000c40e2008000000002201480203085188200f140140000000003c0c801000000098280f3008000000000440c80100000000044062008000001b82804cc0300000000064062008000000001a01480252845832801eb4018000000001d01c802000000003d013200c00000000fc02c803000000003c00b200c0000011824094c0343031c16409204018003109013033100453048c330046b4018003c0841400f1004000000220a00c300c003c0841a02710040000000002406200800740d02101e1004000002105003c30100d11580840cb1005000000620900c300c000001a8240b0c0302944282f025b4014000000000503480200000004c240d3008000341502806d0030000006229014300c00000001a2c0cc01,0x3409200800000d4210208c04000000000c01d200c0f208a0b40631005000000064240730080000019024030c030000680410026301400001a8110050c04000000640b01c300c00000000050188020000006e1100b300c0000001a09018c02000000680900a300c00000249040d0c03000000078280530080000144310138c0400000611540863010006116013014d0040000000000b032004000001a0b404cc0300000006458053008000019c5b0218c04000000622b022300c00000188b4088c0300000000054092008000008c1302b8c04000000b251034300c000000026140cc01000007114404e30101241c630c07490050000008239026300c00001f150d03900200000000585033004006314c3602a900400000911c404e301012c1c22dc0261005000000000380720080000001906018c02000000883c00b300c000000221f018c02000000074180e300800000238fc098c03000000084740a3008000000211f028c020000000048303300414420638c0749005000008118404e30120618f14f00e8900600000000015032004006111c24022100404a4628a5031b40141321822840aed00500094c80407a430180001822840348c050000628a50192301400018e29c0348c05000006214803930100000104270120c04000000941b015300c0000264360114c04000000b251036300c000000000d0188020000009241036300c0000000013018802,0x5f013200dc318210300fad00673c62843c082b4018000000002502c80200000002600132010000000013c04c80300000000013032004000000000a01c802728654428092b4019c9186109029ad006708678408086b40180000018850074c030000000067013200c000000017c02c803000000005d013200c000000033021c804000000006f013200c0000204710138c040000007621037300c00631303302ad004000005110404e30118a1550ca024ad0066245183240a6b40198215e0c2021ad006000006114404e3010000000015c02c80300000000a85033004000000015404c8030000000582c07300800001c4610138c0400204510cc0bb4010000000000601c802028c3b043028b40140000138110058c040000000443c053008000000000f01480200000480440163010000250982402d003000000001e009200c0000211e190290020000000002c092008000000903405cc030000034090039301000009e0ec0438c05000002107408e30100000ca1140348c05000000078380d3008000001982809cc03000000421c015300c0001121d40428c05000104760a032400c0000000029018802000000000a80520080e518e0980919005000005111c06c301000000148840d8c0381c744278090c40180000000015018802], #[![-5, 8, 0, -9],![-7, 13, 0, 0]]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x148e6c122fcdbdbc93fbcfcc0f4752595f023000000b40000005baa7dfe07f64033cec084d3153aed4ac0b33072832431832821c207f46f0d4eb518f477cf51718e516f1a2720bfb7b39aee54577f348dba6fbf4ec331048ea79afd4610a623ada10030473553eff03f51ef84d5042698a9d76a56058f33b185537a4b964663982a660e4863843044003800e68380c51dfba4bd8fc202b7341b82d9b808eb5970d6fc9df6a687f5d8308fcb15f6b1842587da000524405447635a4526895b3f9f19a40ff8f6d985488ea7aee1101fcf4b47b37e3af7f346f71c1f274b6de8565e39011c7317f95782358edc565078bf4dff38068ae794051bf7bf58239b14cbc2e88f4aa9bba91a1c9eb88056d58f2b52ffc1c964f6d6c5a15919b94acdcd80a18e0a52c6fe7c8990fe31ac3d556b0e105ddc41b1351534fc238f92928b570500bebcff0c43b7dadc4cd3376eaad89428f551ca855946260790000a1043c037455539e3a79c7d4aff334290c46b9e471fe48d2203bb677f0b251fd7f17bd3ddb4f0637ecc906b4ce7e8aa830ac957b3925899ace57bde789dd0cd4347399c2e1968644a22c8c0f9a042847b39aa132ce6505d51d1a2ad83ba5daa2c339296fc10848543f49e32deebab8ab03a6014d9b23aaa3e186ec6d4487b3de1c959fc65dc74d6d8f30718a1264077bbff2045c93634d9aac29ce8ed9c5118432d00b10e1a06ec9b1cc7468c0cb307ad7c00c20cb3003ebfc020815dacfcf8d4d017c2c2c20a841000c7637bc69e000065909bab1c6ee92005a070d367555e901a50d2c4f13298416cd1c333a67cd724a1c00b19cf2458d0c536091d30183080dd1d10c4c870029e77a7d2f8300208793e6e780001b978929013f648016016000088800669207715a6452430c7de0b74c4f868aa390e63d9aa58207d35e386dc3027354299abd2580029bcb42cc0300e1d7c895376080603da76dc4400102c25f3b159a9520058060000223365f019a59f0712057f0a081629f65807b428a26e283941810b187dab4602106c0a1e1c000b5d9e205802acf232a1000000002dd9002200407c80800074c80045190e105c8f5f0dc907619a2c31ad0c0e925cc1d46cf95439a810187c1b1837102685cf0c2006c741439d834f3c9fe83800d6d705d2aa368d8b883044a8a19ad4831fa2fcc4bfba9525a966b10c29229a2544462882585a0000a74c0d212a5c1d7be4a45b92aea1b8e6c2020d4592b1063e0bb56d96a2f156c1400eaedc79552dcd8c671680c9bb5050058541939a147f69941c89fb5a782004862d0369cabfddd92ae42543044473815ddde921a20b7e31aef1d01066262044e953cb649d093b1d9d6cbcbd9a4bae3bac6f2428a3689a0000eb487c0883dc2400281043d8961ea2b0f40587982f07143078208283c02c2f2fe884e90c4d4c90680cb59a1b38173895b77e7a13b83c7b396e4cf15b7fd8d83844aea4d4470188004d959f2c4119e21a79b6597effcc85f1487009771be23e3a3f485cbee65fabe3b88c9f9b7eeabbfd66972506fab2964b8ebd9d96e1764cffb9e09e3aa9f8350845c1385db89ca5763eda5417d6733e931afbd4fe5185a823a2a125ae27392b15e2356436bcf9d2944feeab6bffb944a904a3a502d08018239aa9f7f81fa8f7c26a82142e0875238702c0000000051a92227a8aa17821ec842d42033071830c31c21c014025603de2317e0eb3d254139c3374fe816928eb486ee73d398cc1de6e6dde4c40fbf994dbf45d4b3cadcc11664a50002ee202a13b4200608e6aa7dfe07ea3df09aa084c2040422c62062421420821811004c5703dda97a8e1b7c374ed315622b94109562b58e0463883308f40006f88790ac3c4261e0130ef0187700e01802008e3b9e93d13c538d01a11e5ec8e24380c26ddc2087a5d0ec520e188c3a477362032771fccd003084515102d82012ed6bf1050104932830dab9240098061c70f74b25f651c68ec0b1a1751041168d233d50c345470581210610cdc20656c060858c6b1032020a9b45e6d52080148b5e5570020267925c655e44801401000007ecd9006594489f6061aa70337e6961020ba40b2922c1c208326d2718a1841e5b8e23068d04150c6dde980c09e8352a0bdc08109fecf797c2082c8b7eeba55b33480158162c80321aa6d168061a5c84bdd482420413d728dee4807081c2abbab9190c20d8aef5df528d04126ae022c5018135cf871cd0c0204220d49fb31904157a) <<< 16000) + 0x8b669da9acca9002e03800011b900046b3a6d1f491093c9102832b61f3a3c0a2834b4b4940a0e18afd5be5e5a2008137f84f18e9a08bd31290b2b940800000243060a080a495d7c3618008e8394e16e65520058050d37d59ec808bc60a1cebebceb8205149892def00a2800d297779070c3deadaa110802015987255f3412e43b0dcb894080000039e703007a3d8eb151452005204000020421da0200045520019e6437017419b10efa1b7b2a3cf7e814b2d6b8911caf928a112f11d7f397ed81800c929f2430b0a732ace9718d97dc2ffaa4a4a99455c92f81f0d8120244890c8387dba3326f24280bc2d84280933ebb2ba8d4eb08a380c012f389f413c35ed4329aad0002a6c44e68da0aea39a61bb74bf80045d88ca1ea63c376a9086e5af7f9dc5804e6623f39d29e5adcbad12479a0456bcd690a87b9136d3fd3d3dbb108560f3d820a68164000146cc8f0e0b07638e14548a66194847c9f02a12103e9ffba8cb1d274d6414d3a6e896326006a07665025ecfa72e7a5b675dd8fb20c001e677a9a2db65f2ac820550ed6c5f628102020da9cb4549cdc2b105ac9719d500a5b98f7133ddd54c1119efbbae358fd02c6536df66c08e514f7249400bd0555cf460ca0ad0aa8dac53a7e5187a16c00020c10ec0d87580f86e008ee54261eb988b0fddcfbc61d6eee90f5e327df7d44b100000136c5331f1f51bdf90c944d58cbafb5644e4fb4f0203435327510802913898ab44a9782c45221ebffa7437214860903289a04e2a6610217f2bb114c7c50164f728a8f84ef1042f196a44b4a10c63c9eecca6820f84b7f1a0c1e00a4b8a43a6d7a8903779a77e840f91924cdcd356d8c1042d898164cd1f73e9f810abdd09e1470e0b115547c4197b22149a5ae32b984064f9d6bec14e3ec07053246b4340c1740a14eaebca858d309c6c120136bc216bf049375a8d176600222be2c31abbe306f660c20a72f855d2bc1504ce89fb26a1b2a3418c9ffc717c970a20c221800034d34449f12ae15797978563757279b2f14fd2bcd0141b2fea0595b0c287dc38e24ec0d93073ce5e80e109b2f0d1caa546bc3f1f31d3356f8a4ec24c0e015ac200ddd6f09339225ebe96ed9a5177fc00c03afd80a59308f61acaa169adac724e1b83e002818ed27cd6d5c611385e3c4631631598cb01087184636cd8735fd74d75e78094291e8850de83735bc1ba2296a43b4188b4050514901c400026310ea0df1a000002a387186c37fef79df101849f7609a3c60c4889b0979a684147755939a30207315b21690c010aff553cdc50035c0a8b68000088c767e0269dc801481238c092910b807965c4f176b8f1f06f2646d860849485adc3801ec46400c0014d2c67bda8c004602800013e3c71dea8e51dc38a7541263144408f4ea7bda01a0d03facbb0f2c13f4a42b980681a5a0ec9a40800000009a6802016e2e57901000b3248a3401224009c0701d2020002053c603d644073e6030d3277d5fd0181028416c091e8e6406230dcc282d80e083d6437e06f410215b8ef14f088c00db8eedb5ee228017b7b2ae0648001bc8811987b9ffe9002e03461a175fff1b3540061408bca03476dd050c1b1eb5568966cb0804f6a74dff970308724229d8d2300704772976510b41030450100e7c9d4dc90084d10597f80c80008e932f5249a1b58684801a02600009c4c4a239d69cd5c401640b1721397878081c1d9a166b126030db0c02a14bb301813669779887c4020b8db400ccdfa4700000001fd75d0080822933df40ac00012f9a0af516bca3d12006209089601fed0a66ced1c5824edc3284ad0894338904bdf03716406bb566238e80410bb5f5baaf4b81c0cb55de284770a8807083a2972a4f86000b141e9c07880001f853a87944f573512006409000026000081d2020004f320013a043a017649cc4db3e6a7cc16a99b204b7a4c0e8f626867eabeed58dce3c95418c0b949bf3c63e035ee464936555332f62c884f05a77c5c8ef2b785bd64808a8ec85e6bcb5d4ae283e59a4e543719fdd874a79e856cafdff5251c00536ae195f2db9e7d6b6ae428792842698d7dfdb4ecffbe84f93c182b4c2751f5c2166f3ddffac2204f2b030b95e3c4bf2343e66daf42cbd14c46791f90049534dcf2092d282679c957eb7b621c6a410d92e80002a71a22fb020a07d028347d6bc3fea0b07ca577ed8b0300456b02f9538700294deb5bc91806cf072d77243001b7b22128004c127534a1089d988c5cfcbc038a150160000808873848005c6480f108009090801d8b905b210730a80117d0c0d8f4a0886306ce67c4ee304a4bc1696204125257c018031559c9c12841000403940763644184f39039ecd5156e8e38563ba2460795b286323344230f9a43d27a69e306654487f95dcd4c0af4a7e107a05dc7081701bfa3fe1bc0008c6113ce5fc20e010b9ccc4994ba43b9f835cd22de7f1805b473e498b46b13028742cae47060007e0a9bb8b1221317382da8f7044bf26c865c901d6eb132c42a6f04ee568d55a10de71288bd7b6cc18e62a0000459202a13b4d3529a2d838978ed34d4a67111538d6085c22618ab3a80b8c4012d9b0e02cc71871450850490030056a355e822c80d60516945ee8e89ff4da194a953e85b801bfa25ba3fa7eee6c290a35500026021c8130e30987100c00c0784062817f6123d1b5534c8e238ff6793881842b84fe9810a4de8950801b7187ab84c10400100e101da69a94d16c1c4bc769a6a533888a9c6b043717f75523528a2b1af2a40ad103596e4bf1aa6d46a9c02a650e48e5066)) <<< 16000) + 0x04400380135864ba9c25229b48e1e3a0a8d19aaa3ee8763457dd233f0049645e97824e55ac41da58a934809832a88ba0005e46d34d4a68b60e25e3b4d35299c4454e35821a206b2dc97e354da8d53805745f608213b6825a8caab01532061832422c1280100062e7f2546ddae62163894ce5e7e7800ce6c29c74ce16d9762fc4ef37e8945f335b842eed5752755869842bc93a0006024380261be130de01d9390ef687848c3ea67ae030a9f3785fc288917430583024b294e865001d6015804c0840010b2688e547d09187325c01cc1412d988fc61631e337206048c04c3e0c02bb5f54149810800200002564374161b80bd20afadec945113876fd2c2c429bf120e8a2219586b4040c6425b6326006b88f8b52800c1d6c459201372b510c02810210080000c89b4d3529a2d838978ed34d4a67111538d60844c1ca1c91ca0c40c308b0050112133d1cf3f3d8a023cfc9f89054275deac898759fa760518c47a00038e436c3700833d4ce3c0b704f500000c8cc051ae1050891c71040ca0460430440110feb6f78a4463e1fd6e8d18bda22fbb968d8b3d7fb8c2e88563fa229f0d8c0b704f500000c8cc051ae10508c1c91c40c30860460050010bcb54f407574c9bc6d7536e7ae1d749accaf693fc8e30c022d0001ba2000710400278486d1280046ec8161083645417e02001a83216c3be164fc5c028ffa897adb291f78ab5906420481a0129e6633bf698e0e0ab3ae55e4040972ef5cedb3c121e5597ec14a0e4c702802d15eb27390dae4723024bca44845801aa98d3f40a8ea45a91fd3ee1e900b22241ac126d916ef5ce04aa07de30c44122106712e6e48195fac598633f57e28d1004d6090b4b54387003b7e8090b4046d2437a0833bdd436e74296a944407a16c00024c9c20ee7e09df10181478510148c40c10f27927c93c180003fb366304140ebddf3fc6e41005a2e5b029d41405c29375736a441ccda643536801f9ccdc188e86e6b2216016000087886c14c35ca41ac4a0b60d86a86c350141a602819750677f08a03841131f45000018281e745dec980a110f0f48a7a00800612ada25388380abd2b7d087c1401201c15752628a0cfb47f66c59006aa17041ed177772c2d02c514fc7ba7b05cb2406b824151964090acc43e12870ad580c16850a0e72021ec8b04809e46a0002080000024e12c0900cbbcdc8300000000711252004e028b2005a93089963cfff37dd028339c7fb7a65001e5cbfab8700000004024a004601000010c21a40b0b005e121548643e099666100ab5f82b32f0248e05c2c7800d08830c0ca7a19bb266850408a42aa24323830401c55690175c02040f19eb1917f2010409be5529d0068603055b2e26c71a90bff4801a02430909e568d5fef5b30804760a8ac5ab124702e163c006844186061a946b24400282045215512191c18201f63fcdf7a9810206e1f549334e8082012c4d1788b04301845151e73d2fc85ffa400d01200004e2434417a5026830938fb24505c838a5028928a43c61d7469b3f4afa6b66900d9d91edbc13e5207a552d0b1e05105c7a56541af476bdb114395db58fc67a872759671d5f3412816b29e5bfb98a2a8137fc38080c34ce9142a1719ec23fd10a3746f68acc1c600af40f158f9cc49bc2ee747085b0ec0001c510008b7364053bde0f11cc28505df814c139a28a6e36d08a07b0d0895996b1c9bd1011b1c07df71e2182197a04a068323027cb42df78920b02a070b250a91040007a2dbfe646cf32400bc0e1a68ca5151e6307176787a0458304aaae8046044a61933792004e8d6b8c1c002bbdab0c2000ec8d5b12700230080000b51f54f7ae07140b6517bdb320f02c8920c1c71ca1891890cc04601c020080340003c8810828180040009f8429807025558744738a03e5e19077832603880ec2ef301e2c2d6084f8d471e08105a4c2dbbc7ca6897e28f7d0f83824241be13b8bc23a73d546def6140165bb374dfeca58d7794bf77802073c8f4509b0ee39484831f63406ba23466ae0e407306716b38c87d311cbd92134a38caf0e48357c0ff782f3aa5603ca8c330880000f6c8268ac12c460920be3289427b07311228a9f55af8fe8e288732fa4e9d8a2c135315e10e1a22652db5825310246b9f9c8c250c098e8acafd9d0c02759f49eab30801b1b36851607ec48016018208026607e4a1c5002d5b27310403c521a402c1820a9083f1c000bd00d7b94009002000022278e368ff8ef2c61d9674f20c2085e5b4bc60036a33074101299af2596a08420080001023c67632f0058648a242da080fc714a866251d48a2f12e4937de344823b25fc7a4099cf6090c5c60620c98d5748c03229257e2610059420af27d912004e040d282303b00490409336382a3071e32c5702583ae41c6a1060412db12d09a0019eac4fd240003c743f93801180400005a8e125b1fde6e8e3908d205c458d22b2747b0c200c71dfb0606234f5a6b8a080ce76d803000f33028504035653dd06d008440100001932000a4843402419e130ce010668080c40619803d1821729645a380e305b8b06d84802852aec2799aed638a7f68f92e25c0514b219c81a7f81420a4800903b032035c0cb9a341d03873cf599702e600018661148be8a48f09002f03c06580c32807243735cc9799e7d3c70441d02a2dad058e78e4351a87ac871cc1df9bd799fc1e3431f219f859de2863b990b250cdba48a6bc7368890d7080093b3ef83fc560a01be0b9ffad300f6cc120066098e2c188339d299b1c28a3ad1e72f711300e24c02908ced058434997d)) <<< 16000) + 0x9e4c33a2b74b20196cbe7a508342481a9a684d354d28a082e259e3f8630524010a3ad57d68a0fd09010006c0a80002443247198a74b05ee9e387569f9e0814163abf99a7819190e3a651d23d74dc1e37b5ac97cbdef14321bcf004257e9228df4a0e2636e10011b22faea9160a039d5f89a204062b82400c0111e60fb06a4065148e15b3311c4a381cd6d26934eed5e5492410441770878003fc8baf960023fa0ce048013be8a50d0004401000019120007f0400236c86484832015238620d040d34081c0b754540a3850c26616685e092061d72c4365419221b856885bbc081220f1a32456020006cd48b3d2408001e7848123e0001e57beb6b3a37b2400b40c00ee03b20475f6282767288147d36ac64c092159275716ee11c7390fe4d6c8c0a159e369fe98002458f8dbc5d6640b0412269fa2c332413ad6fb86c754104e73dd827df0d9b2400b80e164088fdc7496c25102947f3f6ddc1242b6d991710be38e713735d354c142b3c05e1aae5048b1f355044d3416084a8f589d84a4826c1d70b78f18209329fb7d7081b364801701c00008dc80024490c70981b02e486868061b91519e38be4e9dd63540b1caa93da42583c38e612eb29849483c6a1ca2b4afb251430c221a7fbd44c9153ff80f6b788840049cf7c4fe9741402fe4de6fd1207b662400c4111e612304c81451454e6a9e11a4e4d89012a5900380a7c0124103a892ea480230594394c004401000013532436647f3741f9e38b7b513c0e09638eddf20a2d70e393357d4139b1e348b227f658894302bc88bfd83922916b4713d4010008d6ff26ea00a019c5f3ad3fa62bc80160183cf147fb3121e613b7f25b8a28f57e2610693f8b3d12f2486fbf91bb9600d20ec1349007952cecb3801080400005708001cd10c605062808001e10800757101911c92a50030ab901028ef7d81aae4308c096c6f771082489b6262990486324e65bb941810b24838aa1c384d8c785a2e48c17c02368ee3200101745dc0566e5200540500c40186180c30807230916cf27ab2c7180c013e3516a68a0c508ff9db82851ac9c3235cc0e29efc141867205154fd7e3aa7305082124d6eba9c20358b4a95d3880e1d99b36f173c27012005a0680c10186000fcc9efc6724aa4491544fbd769e0b1cb6c96089dc0e3c73826022ce3c604e2127759c50d008d86235809164cee17f2161000c36770ddfc1407bb315b1fe98af20056060e2c6cb1f34f28a488153300d27e022f68c2481ab47a9e471c455c9a263c005c1eb938900286728c09c00880200002c670a5c3379914b82c8051642814f924880e93df2a232c748fb5fb933c1c79cc978283082866bcfb2be170245a025532561020010aeb32f0e414076ba30e64b0af84801601a38b33ba2b21a51444a89f8a8d260dd2b1f292404453a6a11c703723aa647800be21b8989000b9cece0ce004601000016a20007524001d708004e710bf0d05f0282f4040018ec400c56004e1e400c54880237010bc2dd08d7d6b2a18c080000096c141ed43dda5a2020000021c0602da3270650a00000022b050107a8d5cc9c02cc68460100001772176730ba3185c96c2e0b616e5b0b62185a8cc2d0661663304b19e1126ca42d5f80a21dd6b15c394103122e4b453e04006f13a93e280702db3cc956090a01becfb054bc0801f4c1ba653800aa0802dc23872d640149b92d4701004950db070b2eb9d60ac0a10000100405900ecbea957ada0a082387c82620021008490752d2370610c70e2bd9c01e80bc811008a68df561000d205e425001f00800007c100018e2162130b009e0c2ef70f010fa7403bd3838caddb45fe1c0040b3e6630449e70275c48ae132b002049a9d8bd31a4638ee120600b19988a9da83e68fb604005cfb7349977d0403488200020afb9457fdf72e47c162c364899bc5b2eab578c434efb1fc42f767941438682dd03fb882605c0000d54d9181e6cb56f714ca0bb206c5e2073271c7ef9cf4eb24aee077c8c21ee837ca33bc7899307726c0809e29a318705c4584ee7941bc58195956c956c579b6bd749b531009c630c7ced2a834335fb722a22d2426507a543437f0d3508d0460ded83fb2f7cf689e0304d5c0f1dc00090d86145d0fc0001cc10af198570ac2b456158230ab118018682a806152030a80185380c2980701950ae507cd123efdb2bca1028215da0e041178a824b0611442859000f165d53a60020008406919d10de689f11aff40610608fa7d0c10fdf5e272c18fc6140f2800f80400003e485282e0312de3cc61a243a808718c2087004ef8c024ad7540c8004001080c38c42bd268950f9df3a30812556e7c2802362078c20086da6dd92801000400003f885100800080085206c28c3781c8ee711e9e08351b018960ac0157d90608834aae512034742efa804a2040010b4200608e6aa7dfe07ea3df09aa0857789ae0588912f9c17028151e67630aa6f4972c8cc73054cc10c0c90cb04b0030084746ffb20db4d0d042e26d0e739b602d251b8633322a801fc8a2c7dcbc55e449ba3157176668cb06551174288040005de400103cdde26b8162244be705c0a054799d8c2a9bd25cb2331cc1522822811c134018010035782161201f75dfd0bbaf92ec868ccb146d0b38808d5f7c3571ca8190d08626eee01d7322df96c30dc27d00025f21423b0a0198318cc264561302b0960184a80c2500700c01004480842150e58122e36dc22081b008400b8d5da66018130ba22001b00840000401000004460080200800002220001d440005e484e82ed08018239aa9f7f)) <<< 16000) + 0x81fa8f7c26a8216517bdb320f02c799d8c2a9bd25cb2331cc158d62ba2fbb89aa5eb256cf0f8dfdadac10851104804304205100e099439a3323964b55bc096f07a22a49fc378a4e38fec25ad4fb704b7a62d4650d01d386332b881590b838e1e39aaea5099fc2886997964101a99b30705163d17b94105c87324046183c010f242a267a8a40140109d23805ec483c4481b0858cec490307c0200001a6400065080029f903411da10030473553eff03f51ef84d5043a2fb04109db412d4655580a8f33b185537a4b964663982b1ac5745f771354bd64ad9e1f1bfb5b58210a1831809e01000c00871dda04a5aae911243c4240735d926da44168a52fc97fc4761f5007a3e0dc9b123422b79d72b1f82ccb1f30c52ce3a6a0d1ee041ce694a39ca63d0003db30040100404e80e8113cdee1241cead82020149cf1828c0070021c40d3015a62c311af029e400e6029d00202bb045be48003e0100000cd213e0a000196206813c19bd680d7da7552516164e69f1acb8bc20477dda36d3198429f4288f004a8812355f577009d6aa3946f143cce84e3efde9285caf70e54c0800f7ed9f2af2fabc97f0aed2bc99ecb9441033fc16745b85f663a5060124ec2d16fac814db8f926e9f717765b2d045c4b06156ab9ee2d5525f32997521115d01ffd817953c0b00a5257ab3c683d6e813db69635414a78213c78ca066e661a4d34219407c19893c09e24821a85a8000530203c2a0820d04f048001e1c84688c0d8461180b80400802027407440d65b92fc6a9b51aa700ae8bec104276d04b51955602b640ffd4d5fb47ff57a496965bd55a7484507bdeb411946a0000000000000000000000000000000000000000000000002f98408083ccec6154de92e59198e60aa9419201000e006ceaa9e9e0de0f23f0a5a84d0fd83297b908c86540825232331426b750aa3b5c06cd240ddebe5ade18540075079413a7f9e28c5a2d75bcd66bdaa008662f4fc198208c8ba3d27b2a0688d73352524ea06a425d400162ce0c6a530c0520bbb92947c221320ba4cc88aebe19c90891dccef5508dfe48d5f89d7ccbf154eb22b7b890014f8eaa5bfb65f859eb034820e0cf55bc7255ef1805e21967d3273be14b5418062a0f1eb30d283e300801a1e47ade54f8ee623d19a2b7b5ab737e3f43212dda63301f41f4a9db8d17c1d64ea88bf1d56384649cdca336c9311df0917d293b464892884d8f8000120484084c22c2762bab7877ae9a7c3e9eeed4029ac6cf03bd556effd055d69a6815a3297354b6e056bce8e03720074449fc382c3e5d44cd54429e9222422866d87d8555acbf67f4ae0ef31d5ed17a4fd1f21e3800eb675c796f2c6991a99546ab512900e5b038b9e0843eb645b77f8db49658c19bba70ccd926a9b81b242be1e11fd362f0c98e12244cfb03859c4f0f6bacd1226da781339112ecf1756407e8714773862816d6ead5de3cdb8791a627645da29b1e3de396d4336e909967b318c91a08027006000be8426c84114320890d02e00800441884d0a8054540048b86d08c4b80f953efeeaee7cb09ec102d4b02f81628164e7229f8c4ce5991670420a99808a08609401200e000252b10c2662850548abb6977b1d175b14c2538595c5cfa8dc9fa3769cdd26477b0e440e5426426130130970980a82c2580612a0309401c051359f3c25e0d39995acbfc567cc1228673cbbdc24cf5639543c8a628e4504c8f45e35acd3719c4f4155505ea8018ea7292f2fb3e462c438f9719bc24005610d25c6f4e334751b5e9cd5680ae933bf51de7b01f3fd59e181e2a87e2014fd49f8477454a18da278914e89cad33421530d588b084e9c4fc141842b68e024081e00804900800038884986c24437a392107f2037a5e65063dbe7e6186a182bf80d511bc8cc04a9aa9592014ad5f84eba504732770ca918bd80346038297d8ed0b611aa7d62af64e9a162bfd2132199cf422400b839ec9ec850f86971e0492113ef250baa4234c6b012007b89e4bbd392bfea87d33db0a69667c5a9fbd4e27400176538e04fae44781bab1fa8d2aa8d0617e5e529ab43e02d9906e6a09b5f9b9117a11e8e1c9ce514a922c71021bc9208d089198df790143e432440c2485c089c048183e010f109eb9d79ce0c6c3754e4702df3a82b82308200087929b7ce2ec78853e4864c48637ba4c867017225936c0801e592a7012841000400004048000e290920100016410007c921042b813a3c921940196653c100a80e1ac04c306c0101220bd1c6a4ea68de97adb5d34498e0ce60d24df51da8c9eef261edac22f93470720fd697819e6223135b1b31082e4613a3068bb4b0da264a848c537d0001adcc80aac20b86537a3cdad76fc24cd5417734170bbd2bb4220d840586a5a06dcde8874c1e8c1aa94a4515bd02d725d71032420a9189fa947898f5569baf57e2e3f943a0d23dad188876b653b351f4619b85f8908059dc3d1010271aaf108101e6ec74600034490d0603172e84a054207c011c428cc5ae2204030e24646807c016454802609e551050207c0100001a0400079880033c901e1504802823c14000f0642387611a2b0361584602e04c372e354fc87bef1f0cf74f9eaafc332b127ab9831dcbc5bd620a3af9e3dea4eecfa49212d0acec01f951fd7d39a15ca02ace4208a6d8b2bb20ce1a677dd5e463cd1b379e982903b4718f5be7b618bbc11d54cc42786c4345cddbeecf4bb15a952a584bd112e1d998cf1792897a3ae1879578b023383f36f53da023ded38a872bc712836d77be75bdb1068a9f020486876e6490a38)) <<< 16000) + 0xaf4712c07cd98cb8603590d17a4240c1e00800006790810584582eca8db234801628cfe95c6070c4479b45c2860c493b7d0c103224e1a10022b5d15f81001760ede280138c1080400005a083c8e82285411212088090438481c404000f124006fd484308c007cd08027d5104d2982592c1241740a8e07894eb9d0119e16bbdab1844100a39739f24afea47e96a0fc9b9b3e0a0a31a31ca8f04c1c760ba4dd6c87a04043875ba61fd2672871c95ef0127800126992792c2ffdd4af34748220120a91afbf2e809285660acd7203fc610a05ad637306f81374adbe427403073001bccfeeec3f71aa57d74694a9d0107131ccf4f9eb3d8c37ae1141c051168400c11cd54fbfc0fd47be1354108f33b185537a4b964663982a468858840828238028000a4be273c1cf8de3bcd781ffd62e7089c60e126d0c12e5c5e11fa61995bd899d4fcc8ed404cd5341c94270f744d9c330787cc710e355d12ad2ef3f7098b063727adf9b2847c81efdc2d640554b5f070f0710a1dccd103617d291fdfb83b281d5e6f8ae1e9c044e38553bd8905d558d8d6fc1135e255cc9f014178b9a72f9829f420ece3f6b40206ea503cbee1095a3f09e20517a6d308efc1ead95e725f2a20035698080ff37662c31c2f07e0000ec884296821055a22c0668705399ef4b0bf257f1e1a73c9b69c58878d1bfd05975c2a143373d6209570b831f10209647159cf2329d65afb50b7b5e9c66a14438171f091ff6869042e3801bce15fdb26af390a0439f9d27cff6eb14b37fcc6d382176b65800028186b8bdadb5ce4f914420ba56c662a490d011bcc8d2c5b1159c40df57a28a79a95bd120b73a0dd91a5a9e232c3b06f9ae99eda56fc05a31595ddf3c8b7819cb878511a2a0450d8291cd8246938a0ba7f79f981e9bf8907c10939c8a7e3133966459c1082a479061041050448450000001057f93824a827279d2e3e34ac49d63d73d1057e76f022d22ce3b779eb1295b8c440d5649776683d85061245d288d03a4cb326120394bfe1704012ab539e004a283e010927ff363b71e1bc31a41f2831bad897010400717760024101f0080418080003a880010390341584084e01606d47b50c10d3a73d93001cd8706224059c0899e200bc80cc7e1402a3a048d000026242000800009d90821dc04004011c7024663a0481eea678c8120c1e004402004011004010040220280000dc80003a100010920682308105c0095921ba21d4b96af81083ed43d1a538be237bdf4fbd7fef68ef0283e28c29f36bfd7866cb858141d95234b302934689cc6798fd0f2801b1791e32a94109c859af8a5bd41ba2622467c0905f203478236713f246eb426bcd6c26a0b2698ae8b194b41375a1890ab54d796d240215c10117cb24bcd9464075a5efdef8f23f54a8bde802dd4d7b9461e08ef5436ff41af917139f4c7373892bd73624947b336571914002b6368a1823dfff7ff209a20c76dbdc63ccdf484d435c6a758f1eb709650b9e02b34b5463a9c448ff5c8312f5998fae05171d86922cb8fba2f300f7b16197231bc89180656d37a2d276b5c42f5c969da006f966b78101213cb75f3e7ba45120c41b6b061a8463b48c28000867203c420800d03f8480028c483f0ec0a4760fa0bf322847b43471f2e7b8190a0901700f606308200085046629b7d124d9ae8ffe8d84e2514b443dabfb1359bace1cbed1ec76946e96e1492cc6ec982f504e9ef78a864242db0f77c70174012e266f15e3679732598e453c3e6903186f870598dbdc53266606bf8f99d39a3d5fb4ec4a04d3c533510a8d420ca32580d084abbc016e91587c058b505a3b6850831fde8d0dc3636d9ea965aed4bdbee435de00d2c6df8bcb4f4f75bf8b425e1ec692d2bb6eb7456a68385aafb685dce651fffa303668e21fbf8e81ca59cd275143555e5354b3c6ddb0dcc60c85e2f60f3a53c4af9a6e075e74c81647677e11adbe2529c1af886b450722daf1dd4f34185c3206c6b287ed3de98d2339eef5184c22cc0001ef483e04c1ec27c7906d5896282284ec5ba2810fc58744026184000807a01da10030473553eff03f51ef84d5043a2fb04109db412d4655580a9cf5307d2935022aabd084b026769107c5d3b0015cd1be9200000000000000000807aa7bd7038a05a141140a001601200180a6771fca40a2ba125b3ed9a3eb1181603c6be01f42a8299980ca93345705a6a5d929a9deae566bd498a6b19d391b7cfdbf45ec02223fdf6c712fa25f8662d35d9876a22327ed0004932000ad841e4640f0320771503b0a81d4340e81a073090390481c404001dde4007eb080127f101929c0e172dda35d55c4ebcdb43b4220777682f883c1968645eabd7071002b99c79e505b7f179cb32ca141bf5d13702fc97cda977e81204006d88ee2426717db9ce3818a5bcbc4eb7884b1134f01b2a1801042c2699f26d38b723ca2d66024d92aa2045a415f11c4214002848e0a2322221b93b9f6a71073ecc45de01a56cc5c9204f248014179c9bec825565ae5e65dc190a87054dfd6ff840eb9330400046566b069b7fd3b1d6950dfc09c46fbc026a3aa610ea1b8962154ea6bcb463cb39b50a53783bfce5fe2ddcc42444cc328800033610032812006dc8402445ccb347034b4d516e52e56ad0b29d5530540fd2f9ac200000000000000000fd590ac63cc58f1951fa59f125d9295f687793e65ec24b72746000000000000000000000000000000000000000000000000006321031810c1180140040141500fe0dcc3f31a68739b331fd655d868d3784587e3174592c6b23ade2ef7)) <<< 16000) + 0xe726a0a1abee55b9b5eedf1c296e700002c57d4efc3143027429e7d605fe8ae0d6eb979a9266e0092d932cf8ce9979e33888561d7a1de9d3adccbaaea150005bb20132bc4039458d239b048bf36f6f24fef3f303d1d49657c08c2685573c2fcdbdbc93fbcfcc0f39d928ff8231cb7e399a0e08983520ca0557ab6356d9a5afbb38f4ec1542452031830c2140000991ac19128e88b532738e5eedaa27a00fe8c57622906460791914ffe28df0a3b02011af501bc8b8785eb2d1578f4ac7a2a399e5959a155cf0bf36f6f24fef3f303ce764a3fe08c72df8e668382260d48328155ead8d5b6696beece3d3b054c90c80c60c308200094e2fbe07a618bdc46f4f22b0dc3887548612e4526404c08932e907c1aba4de3688694eac2f38c2c942486bf7ec1acfcc5dcaf80553f65e9dfdea2fb551ca922a8001cc90701d80a8cc1bc67342ab9e17e6dede49fde7e6079cec947fc119f07fac0ed7016bd5b1ab6cd2d7dd9c7a760a99010a108084086020b4d7f1387587e51c952ac8b42b9f03847123b91122101795598d60ddea8d8a59cfc8adeaf5f59cfa69b3f8b6b93addcd545a6f5ef4fde4e63428296501054000d7c8161881b8960da3306c1583586e4505115178c55ed2e716f13e724076e8ca04a2b7672a6d013b84060c5709e594790399a7276d726121423e5c5522c1b8e2793eee741800728511c9ca8d2ae753905e828069b690e8b89ed9a6247adecd4041231e30fc5fec9b8c69adf014246944d4ac13745712e4508a00d69b93b24073494ac70be1f8a28c14802f254edb7dc44642c794901bb787fb16bdb0fe100000000000000000000000000000000000000000000000017ee01404a3a91c82dae780431e6765538c89243f7084ca1091071070030128c8a774c456d511a579287e39031305ad19862c584676a3dd88681c0284ebfb9ba30e29003069d87b6605ac6bae08d88d528302d3dbfe1852192593f6a40960a78c7cc23cdbbaa6c920333f455e1762b0348f2a55ead3e2aabe150d1bd640b3be88359f37ac7f7cc8585a968fa0741a877ff2e7ec1efec5be2300000000024f83ca5b424a2eb7acb00a42dc081c547c0cd290d0000000000000009acf264ef3d19cd0f08c18b18914b087000000067906cd473a0de462424c90589c4cbce9d6fafeb4db1cc76405713c7ddf2cd85614e17f1d25320a81b1b03f5fa4ac47acd7ca3106b9717470000014fa2871384f791130393b8983e22021384f61a13401bb8d91352805e69fbb3b040105a3359f000a7182401003482a77bed7eed31d4c9a26de116ed218fe4000000000000000a02ecb8950f471883e5ead8d5b6696beece3d3b0568badeb2c0290b70207151f0334a4340000000000000026b3c993bcf467343c33882c82430c320010002ac075e09493cc7eced4908dfa38cec601670034ea5db2ad969145ab72b4423fb6a413f07ffffbb34b1cdeefbf10a3672705bf6bbb5abb69b777d853d0d8bff2e7ec1efec5be2300000000024f83ca5b42413883442431431031012c088660972e5f47f1ccd8fc2dc01988fbfd74892f3ec0dc517447a00038041a004000d1a40020f081610c19c273bdf6bf7698ea64d136f08b7690c7f2000000000000000501765c4a87a38c41f51460a401792a76dbee2232163ca480ddbc3fd8b5ed87f08000000000000000000000000000000000000000000000000be4710590688704482282580170801006cef7dafdda63a99344dbc22dda431fc8000000000000001405d9712a1e8e3107c27105906881865841844822009808010068000c6106609f10000002191a4450d2378c590000002581a205a71181c104aee79e970c00daaae0ba18000001461040000aaed22836d107d11406110043094425a0351031c5e28020c3018995f22810980732824037f547941c02d4310e50c0c46ebbe6270420008792098c0dc951c4a83eda91e461200000189c081821744995418731e298e66940804bc1d8d07000cf2f71e9020042e8282d408fe4b48255804260140000ee1065090001b19000537204c1b0250981204b96fc73341c11306a41940aaf56c6adb34b5f7671e9d82a47105906882044822824002000181001006cef7dafdda63a99344dbc22dda431fc8000000000000001405d9712a1e8e3107c271068858620448228220258001810010068000c81e263352cb40c2501045db4f1c01fe8d6c50c648b4c08900740848c47007feb0edc10192daeac09c108002135121834e7340acf90c8d92dc4e7fb26136a3b98ac4b1e7c6000000000000000000000000000000000000000000000000006313c93893092830813800c0db441f4ae083800d00022d20c80bf244db8a3c071301a72e7f3091a82638b9e38f60a1c8c5049a69fa2038011af1293098208402192ff32c8907e35e156fd707fd43926ae57fe860fa7ba03000000000000000000000000000000000000000000000002e89e49c49848e11409c00606da20fa45c207001a0004304000d98831808001d288310c8184140015024084640c00200151920042a8417cd4004efe417897ff2e7ec1efec5be2300000000024f83ca5b424a2eb7acb00a42dc081c547c0cd290d0000000000000009acf264ef3d19cd0f08918a1091070c50850000001b8a00803607105db679162c4a0d70a4814857792aa4082411bc2e183137666930c1090f64fec500bdcb337c04e18420109defb5fbb4c7532689b7845bb4863f9000000000000000280bb2e2543d1c620fa8a305200bc953b6df711190b1e52406ede1fec5af6c3f)) <<< 16000) + 0x840000000000000000000000000000000000000000000000005f7fcb9fb07bfb16f88c00000000093e0f296d090ca1cb14a1481460c6080b06008034000e5882e8880014a082e02ec58d57d38190292387e37060c4b682e203800e2e6c89140320f8bbd128210804277bed7eed31d4c9a26de116ed218fe4000000000000000a02ecb8950f471883ea28c14802f254edb7dc44642c794901bb787fb16bdb0fe100000000000000000000000000000000000000000000000017dff2e7ec1efec5be2300000000024f83ca5b42432872c52852051831812c080200d00039232305e34e95641228b0c9075331422b00386b59922442d3cb6660e2000000ea600a10e5567dddc990c085004005b010000bb105a0d00a868164340b00200069620ae420561900a8a8154440a81a0530902900813c04001d90400e93080200a88a61f4cb1255468f85e7f60c384be9ce006af2a15b96928aae3052daa39e2f77bcdcf874e44c2859c0efdcba370cc8bc700550300e5489fa77d244ef7d25fb0a280f5028fc9b2168ca97dd43fa144b2fcea3791f3e748fada900495817bf82baed1cc38b81f0a21c6e3cea29b7b630560c76db92e1c24b9966086a44ed5099b657b965a304f56dee4e67eb0a0305bce7a735c50a8e0d63c4ea97ac88d2cd0b6d0e0400e6249546936f3f2ff552e062bc054130eccf5f3ba11da997abd9810069f071dd85a7f06fc3128e358980000cd88288ec140560622b818058261a05041526dab820339f6f1ec1c0393373a68a018c5cfe903002b3f68280003977d2c8404009ca08402009e02000184209c6204d158260a812c560941b04901d8f27e29aae2418065b69990089faf66fc40424121944012081080400d81763a31eecdaf186dcbfe58498e30383eec020ce212dd3850100911109fbefd1753a3e621880a609e938af31e3187370f16041ca374904fdd6f8057d40c0147bc16c77f37f5b9689901336c2f0a043895631bd0421a2ca4e50ab9713e72b111c4240a34ebcc614540d40001a31048158238ac118460181304501e93d3f06680c23b44f4123861153f658c1221a544e0048283c010e280ee5400ca0c9d2ed8f09081825cb744086d42f6cc002badc61c002510200085895fd38079618092536e2869246c908401d92c928048183c0108191f117a41239cc5bba060ad5e2b2894080a7256c58096259a804a103c01081827e0f6198588c4d56640c3ffc87a182c4830d8848a29e80e90c201b337b24c083c0100440500009a9000248200066440011488160ac0a4277789ae0588912f9c17028157557bd781ed02c8a1450c608504204d002000ffdf9afdd1e263450be3145f958b927e7a5710530def0c98841be69001eba2be046a09a6943ebc4de58b3aa0e3d114608d71763666890ec31ad6b6493dacefaac15b575438d7b5de030aa767c862abea713caf58210ddc6bb1b0de3a61f01830015c700161cb961cb5357d6de9b6fd1d38092a84b7bff4dd167456c299afb8aa123cd8087cc98a13a2ff816d504b63eef7192120bcd9f0fd4cfb397384d5a3610e3a423079c35b49903300a2169a6a5345b0712f1da69a94ce222a71ac10aef135c0b11225f382e0502ae714ac609660599c28e18a18c106112055fd7c592a676c03df6daadf2a824bd9baf67b839b9c8ae8fbe6834df7cbf9c2e0f7cbd8325c7ca0005504001de48218a810434080020009713c0c2943550088a0d00200a41742a0116d671426bbea67e283781a316423081f0085a10030473553eff03f51ef84d5042bbc4d702c44897ce0b8140ad103596e4bf1aa6d46a9c02ba2fb04109db412d4655580ad1460a401792a76dbee2232163ca480ddbc3fd8b5ed87f08000000000000000000000000000000000000000000000000bea50a40428268110b0663439b929cb0c79d9cc0400aee770a323681f675c5ac094eaf864b4aef202cafbdf04faad708419d5a9339525cbba2411418601a15a578518bf74b872f6d02cdc523d54c1f7c143a8419d548368425cd0b6659c4508c12d966b843ea350261d70a000ccc4108340820a040010003b3103f0d01f04800203c81e8a8005cd480a90c0648762182cbc0e28485334e7880d6ec8a1246083c01003601da10030473553eff03f51ef84d5043a2fb04109db412d4655580ad903ff5357ed1ffd5e925a596f5569d21141ef7ad04651a8000000000000000000000000000000000000000000000000bee714ac6096605a1011008809600a01ce035bcdcf2847c82681620a291c35537b3139b52656c486559a7adcba67492c72c97763b3a6c7add2e1d9ffd4f3d015e7a3385247a78cb3f9a49a5fb85a7fe1b35ff9fe575e7c291be0dcf70ca639b72ea12a49a500057b20781a03b0901d04c0e4260700ae1cbcf57004d56ea893d5c090632dae47bbd225a6a1f00e97e6dfd7e6684e45128384d26fcc69cbb43298a907d186ec5fcf687ea29cabd2ab642af635f0b304e51700e00a87ed7b48beec599e377561d148eca83e52e6f99d83148898d4da2a688ab5aa04f9d711d3da743e944e306db555899b28915faacee7e15a968f55bfdfc58cb291bceec9eb572d5eed6f20c37c969245c7e069167167d38918b636771a314fe3844864c725b0870d596a0140c1d51b6ed10c389ed341c384335301b82046f8017b004c203e010037110000a0103605c0488c659891422f0cd6ea8410eac46c48b02391c6b68300027aa5880c09c52697f813061080400d4340681a0330d01900800062480041c90161d00a08804c440241a010010007b)) <<< 16000) + 0x910033d01890eef135c0b11225f382e0502a3b8e6d24b0605939c8a7e3133966459c1082a6504302400380300280008159ad91e09c1364d5780ccc9bca3db32180909191353e380441f2a9087cac610231da2dd9074015f2dc7db115feb520ba3209357edfa21707326a5aae7b9c476708015dd40251760cdadab2060185527ce887eb3187fef25fbdcc03042484d02c41d07964f0fb1e53ce46567bdbf613affba068019f0803b38f75bce808adebc9a5ec56a6b9136019e9414c1626db2fdcee764607f5039470505ad5ca657b63dbf5e1d3b009d5c4180abb9c0e759abe506a123a4bddfa4a8aa2e5d382a34c62e7b9062e820d4549861460692d592203869f311840accbd4050496ac7844804ba3df1b020ee73af680405e75f82293840f8040070040002cc40b0360561302905e8230a1b82aebf3bad5943e2ba329937e4c1cfc6e314e5bc6212ea7ab8be102fbfbf37a6ef9cf16e1e6a3320e2eead084ac1774c400dd9c49b87cf6c680b4e2be863cedadf168cbc81afcf9d932d6d5db1d1416d7908a8b3e8e4581623dbe9ea8d5a39738d37b1a8e0fd4f6967baae471851ab3fc3834f5a800f05770f08fb7f9bc6e673abcaae9785b1c529084ab528a56202bd188533e2c2179822f726aa68bb76ed488ab12b9a1d1ce35f15c9ba0c7218c2c59785e64a504eae125f8d059a35765100856df09e0818d2d831e04a183e0100300d01202c0701400027a4001bb48178cc0b8670040100401680e00802008c378b4a58b121018d42a28414896629612083cc35f89c000e9d6d798024b3a7e293021000400004a88000b3902c0d81580c0a80405203028015900f11d5b84860f1307967000a6140c62814f999fd4920410004340e1c353e20034008800008020000088e120c8aff7440400029d9e304643cc8a6105365b22e45001e271f22480050c387930010004009c0400027c400077081304c094160480a023014020040100440380400802208827e4570e144cd9b292c110a8318500122ba9e8380bcfba54425081e00800007b9000134204203b08351e30f9a098268bf21012a9a5b968014e36831024081f00801000f0aee601c50842078021c143df6f4752b997852024539e551990bd01f1bc6839dd32ef8c82843b0e31389da779593ab11f409b047e7e1d6a2741df4e27723518050da3446cdecae674c035853c53aad620e5bf047160e87f1d261019765c4d4993771ee584afe02b366b90a4026ad635427c207a29a15e228f95887201937a04d9fd38178fccf723177561384073116c9d24ae4d0c87108d5ef71a07fc4f59a70722695d2046515c00013cc8002ad9b09e546e13c0c5c33da40034008800008020000088f16183f0d040400366a28831d22ffc601e24cd3e581b1816a92800e0040074040001fc407c1741f0039480c389415a4781e0ce3d63001b008400004010000044407807629d0604a101002161c180788f6369603e7cc8712020e0040074140001b0400076c8001e69000a4420380a000c0f2001e94406c940023384068b4003fde4064870149e816fe0610f2ab6968a0a1d5101e0a00202ffff82002c642e6004a2040010818d14fabd861873a29a71415a6f4cb790113523dad8a1025ff7df04a104001090c0fd56420e1c4fdfaa83016948b7be080bf239ddc90107c021038000aa832432d2f4742386a798a57c60c1a3c875861a2b8705e3018792cb1a4c083e010000125200041e40543400067e40605402e2a0161100a88805034026120120500880804004000a38403cb401c220027da200a7c44017380cd44860d39cd02b3e432364b7139fec984da8ee62b12c79f18000000000000000000000000000000000000000000000000018c450c6086045044043002014510293645e619d9ef1431fa1e7c2e6c4c1d258ad5df7f5e54257d72cdfa29230bc873587013de97b67c097dc59f12b9ce8f02b121fca08141730e832ad642b18f3163c6547e967c49764a57da1de4f997b092dc9d18000000000000000000000000000000000000000000000000018c471470c60c2086005004004714de4daf51c19543e511c119720a5ce19fdc03aec6995bdf574da291c0179dba0995727d4151d1bbd1f7d225c3fee62eb360741f25255c938cc7b590ac63cc58f1951fa59f125d9295f687793e65ec24b72746000000000000000000000000000000000000000000000000006312082062041c41c018004045d6d8090bf2582acac88b0bac8d082cc810e44e8b558686632a9a94e0c2edc720c65b265b8168c3e7b796d271f299e890447342666081d416ab800000000000000003f5642b18f3163c6547e967c49764a57da1de4f997b092dc9d18000000000000000000000000000000000000000000000000018c8820818910810711033adf911f71fa8172f9a6076a15765c8aeb4e1a3ff960a2c5b5b0deafd7fd4fd8ab656957f01a68a3c2c11a2fcb81cacbbb42cfa71de8c1559bb31634083d20f0baddaefc16d91b8381cf9195d68b69788f53c6cfcb9100e5473ccd4a000b884034840011f040306786dccf769331fec7896b11d15f7fa783840696be64528a8cb1e6645b7ba68cc609de4390c45ccd9615d913deda0f6f0a10000003a483baaa0a3935aaab28001c0044b548433557f3382257f2bb4c3420002323f30d5e69558665f8f8f94845402323ebe3c5c02cafdd9ef7f626012a2b8ddf7530a833b7530f00c58e62800003f120021fc402cc4014520091500408801c4400c0200501000ac2100411001888008340020200001005c941)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase4" = "QuadFullSixCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase4 private def zz2241:"s08c1"="s08c1":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l15 l20 l22 l23 l25 l27 l29 l30 l33 l35 l37 l4 l41 l42 l43 l45 l51 l56 l57 l58 l6 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2b69be299, -0x1da3a8e28, -0x2b8329d5a,0x3671dcf0], ![-0x1da3a8e28, -0x909573430,0x721e1ac4,0x190a2208a], ![-0x2b8329d5a,0x721e1ac4, -0xc0a7cce8e,0x1da3a978e], ![0x3671dcf0,0x190a2208a,0x1da3a978e, -0xed1d496c]] noncomputable def hinges:Hinges:=[(-0x4cac40da,l6),(0x52e606de,l4),(0x5644e7cf,l9),(-0xafe62dcc,l8),(-0x34b44c7c,l11),(0x5bd91eee,l10),(0x29677396e,l13),(0x29bc89dbc,l15),(-0x1938dc09e,l20),(-0x1bb62d8a,l23),(0x43c708e0,l22),(-0xed1d496c,l27),(0xed1d496c,l29),(-0xe604c290,l25),(0x9e4d736a,l30),(0xed1d496c,l33),(-0xed1d496c,l35),(0xed1d496c,l37),(-0xa1f592,l43),(-0xa0cc5fc6,l42),(-0x1495a3f9a,l41),(0x385a74ec,l45),(0xed1d496c,l51),(-0x5d0c6f70,l57),(0x333cb202,l56),(-0x2b879b00,l58),(-0x18f9e29b,l63),(-0x1f2caac,l62),(0x9996178,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0xed1d496c,l27),(0xed1d496c,l29),(0xed1d496c,l33),(-0xed1d496c,l35),(0xed1d496c,l37),(0xed1d496c,l51),(0x29677396e,l13),(-0xe604c290,l25),(-0x1938dc09e,l20),(0x29bc89dbc,l15),(0x9e4d736a,l30),(-0x5d0c6f70,l57),(0x5644e7cf,l9),(-0xafe62dcc,l8),(0x5bd91eee,l10),(-0xa0cc5fc6,l42),(-0x34b44c7c,l11),(-0x1495a3f9a,l41),(-0x4cac40da,l6),(-0x1bb62d8a,l23),(-0x18f9e29b,l63),(0x43c708e0,l22),(0x385a74ec,l45),(0x333cb202,l56),(-0x2b879b00,l58),(0x52e606de,l4),(0x9996178,l64),(-0x1f2caac,l62),(-0xa1f592,l43)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0xa0921019230140000000d0a01cc02000000000a80520080000002b05038c020000000a4140e3008000000000540c801000000000a40920080000000160c0cc010000000001303200400014e21c0930c05001a44e04408a401000631201701a9004000000054440f300800014a2140930c05000084320e036400c000000000240c801000154260b014400c0000002505018c02000000000940920080000026824028c030000000941c0e30080000000000c0c801000000098140530080000014884050c03000005110406c301000511141800a10040000000943c0530080000000024030803000000000902c200c00000208e40d8c03000000001900d200c000000000140c80100000000034062008000001c8c40d8c030000006229036300c0001822840348c0502844082801924014000001d864094c030000628a50192301400018e29c0348c05000006214803930100001d088380490030000000381c0530080002b10864079003000000028140930080000009824088c03000002504408230100000000009024802001582405809d4011420a40420033500600134230480324010004d0841200c900402882b822006d4015440a104400635006001482a04803d4010005409c1401b5004029828826012d4014005c0a01c01750040000000026009200c000000000e01480200000004424063008000000110b018c02000000001c009200c0000000012014802,0x140920080000084150318c0400002082b03063014000000001902c80200000008414063008000000c844088c030000008a0900a300c0000002107038c02000000088140530080000000023018802000000000840620080000000261c0cc01000000078440e3008000002284806cc03000000088280f3008000000002b018802000007105006930119e104042027c5006000000004d013200c000000013c02c803000000004c00b200c00000000dc02c803000000003400b200c00000000d404c80300000000064072008005210c3201e90040000608a1019230140000000011038802000108460a02a400c0000022084068c03000000084440d300800042118300290030000808e1019230140000000120c0cc010000c83609025400c00000148840d8c0300000000011032004000000002102480200005088100d230140000008824088c03000c42404c0cc40100000000009018802000f02105003c401000740d02101e1004000f02106809c401000000841400f0c04000000000b40e20080000000001c0c8010000000a42409300800912042603310040000909010192301400a218c1900910040000004e1f016300c000000d12140d001000000048380730080000012874098c030000004219016300c0000000015038802000000982901a300c0000002515034c02000000000900d200c0000094160068c04000000068240e300800a1244360331004,0x4438073008000000003e0148020000000fc140e30080000003d05038c0205108304302fb40140002023840348c050000000a42407300800020a3940648c050000838e700d2301400002087200e4c040000008239022300c000000211e038c02000000024180730081521c23040aed005000000000190320040000000031024802000000000840e200800001842201e0c040000004219022300c00631103401e900400184430cc09a40100000018848070c03000000c259014300c00000309640d0c030000c096101923014000000026140cc010000000f4240930080000000007c0c801000000000f409200800002849101b0c0406b091915014840140006c2491c051003000000088240630080000003623014c020000000c87c09300814420c08c0bed0050000008239014300c000000190a014c0200000811c406c301000a11902b0091004000000a249036300c14724e3d40f6d0050510920ec02bb4016852451cf0216d0060504908e3019b40140000024904088c03000000094880e3008000001c8c4050c03000007118406c301000002a2511015002000150962202a400c0000000025038802000148962202a400c000001526240d0010000071088078301000002926120250020000000098903300400000248680a8c0300000710e00563010000001c848070c0300000005424093008000451504808d0030014431064077401000000088280ccc03,0x1e009200c00760941d0331004000000000901d200c00000d42701b0c040000000006c06200800000000d402880300000521200133010000001509402cc030000005827013300c000000161201cc020000005821013300c0000001611014c02000000002c009200c00000000d8024803000000640900c300c000000190901cc020000006e1100b300c00001a8110050c04000000640b01c300c000001a024028c03000000681100e300c00000000160148020000008239034300c000391b8380510030000004211016300c0000000002c0c80100000611540863010000019c5b0218c040000000645805300800000188b4088c0300000000054092008000000191602cc02000002104408e30100000000039038802000004109406a30100000003519028c020410618a301d24014000492202c0510030000006221016300c000000001d0188020000008239026300c000000211f028c020000000000d0320040000002a13014c020000708c100d23014000000001201c802000006114406c301000000000070248020010c33058088401000410c41a0221004000000b232021300c0000002d1a034c02000000000640920081241c630c07490050000004448503400400000000050188020000000002c0920080000002207018c02000002405401830100000000044034803000003509801a301000000002a0c0cc01000000c259036300c1a22c612c0be1005,0x90c80860c03eb401a4f20a18f020ad0069248186240a6b4018000000000601c8020000000005406200800731704302ad004030842862017040140000000003c0c801000000000140d200800032118680b100360843430808d04018000000001e014802000000000240d20080000014884058c03001c44108c0bb4011c214d1020234100600000004c140d30080000000011024802028c3b043028b4014000000000d0248020000000443c053008000000000f01480200000480440163010000250982402d003], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((0x3486405d3d447d82652f7ab83a8f67508395e282946288d5fc4101fca6b2a18712542cb5895f84554f7aa52853cb1785aa5bc7cc02c6a2e088905121f350f85b2201096694d33fcb302b5e898c5e519405cddc977e8e2804104c0a27461d1a9d06f1cb2a46a15fac55b3d97032c3ffe52c60023ab1f2f95d63ce177461ff03321016650d95736bf92359556478ec94c69414e5a0889c6a3fef5af118d4838479b42f0ff2ee7290501023671dcf001e4a7dd4ed1d483ffd1dc96028230000012c0445f8a8ced1d483ff5efa52b208820aec3f03d49b32b4c4cedcdc8b3038e8210526bf6736f02c000000000000000000000000000000023c569096d42f445ab637208e84fd04344053052831420c202d4f3bce1d15b11082f10331ff5a4e0831802154da3a5b82fd639a4c31828b64e4d3342ccc9e6c17e8fe85107a22245c27b192e1f9fea361cae74d2e16ae70b82d27ce349b9121d00a44209e8e5fda796db4f209d915d0559148b05761f81ea4d995a62676e6e45981c741082935fb39b7816479460e60a50630418458010a0328aed154d10ba29fc0052e3e7053528d126d6a5b26d7cd58e28e82b500020d207c0be2504e1372018400b1b28b7efb8c590091459daf788c8a00b1358b336464250090992fcfb0255d005055a2d58c2aca00d036d7fc80acb800a038a69f1a6e8f0010142d44cc2b9f56d4b202070d01600004ee4002b3088a84f89106ac4d9de741699a0395c93e13c8d4e3b5d4e3ef93f8ff0f0c1a0387a1922abc99005f9b4173dc06e7ceab4aeaa033812ab96dbdde326038500dab3dcb30e325060c5ea5e70db113f7c) <<< 16000) + 0x1af7aba176389096d04042f91d680967a34957a687578393c07120f7907da7021eae925f3f6a5b7f7eeee01a584205de0481ea54db7d2e9a5208853d00c2360ba111c45c3f0ca038e79fcf8387baa843a058e02457b3cc01588d1ae04a103e0100000fd301e777a9a79e31e3be631346cdaa7730046183e0100000a9222803c16fe7170bc5b922a4129d5c3b82bdfd70c09c7791aec7908bc0ddfcfba3e3d898f2c023e14c7f34e390871ac1f91be7f71845000830c88e6a4be1cd8f751e0e4673734186c2e65feb1d64be980f0ee7b8e2e1015527f5b5baef8dd816d47ca4147b17400018e9c1006985005796257e290e9003010fee5c0b9670044b3d52e40c028982b71aa9600bd51926d043a299156f10390c304e04000018c3444e706e42667f140a14572537dd810740601968991baf2dec02404b4a5372a8fe4808008860e7326ecdc0065f3d4b544afc4000ac7089318d5a63761f6c5b033f05764b1028e1c834000092c88b8c845804001b824428176307a3cc1a98406cc60953780c13614a37158402be315285814012e4cb77942006833fc1e408d27c98925005c445ff1c0f8543b0c9504d48668c326cc604c03000020121903b91546d448c2936a8a61f0c1befacccabdc39ab385e97ddc5a530969825784b019117523d32caf52645a829a862a66a37ce9b7dc45f625242e08705705ce871505728807a4559b437afdfe2175ba24a63a8b20f92c944f2927af90af8b47df5f27bae492187d700df373801760ef1a8de17c9024c5e4e1e657ed654647ba5c7c4990e33753dba45b3c6760998a405bce3eeee76da3898464a361c88dbd46219e5909167bae9dc8c2968ee6d8242681b66281024a5eb22cd01e9e4a119200774588d4098407c02000025642cc170247afd37e4ffa7ed1ef87bc9409681447916053e8e64add58845ad0c91344021d8fbb787bdf03c1e91aea8e2ca0c025c57af7b40d38a50e2d4923023b1201d0ba312811c428354345bfcc4dc20073072b4009730710319b79446b9000eb9d3aba550289dc7c4fa82cf2049187d7d8ff91721cd8c507983d30f664855530544f30a85230c378a000010ec86904c4541700801004411220cd12465986bd8aa7e98863a564d3a8ac10bd3604765dd289fd422012dbf7585436a36ae74a1ae9086c83cee085fc5f9293bf518f414e47801f6a28817873fb6b69c5fcce5aa8c068dd55026337980a7ed8cd5d03513bed6e22029cf158f3d8039ff20876a0050c7937ce523193d0f117320defc5f3224a9d689a20101c8ab4be34defb9c846391846d17c00011b4c0300401000004468007ac1e95000d248676440884080020000102445017c04f6fde7f93482ad172f085d7305dd91211d30ab6154d7a8094d222611af0a83f0ea01a63144426d14f9c4a1642a795f209d08415e1e3ea8712e9d9ebb30ecb7b00ef01d388d9352c89451b1ae7007118ca7c024dc91dde03a25add9a1b24e551ce5c2d4175f657dfec973d40ec113e9d12450f8c166c5783f3a959039d63cffb2f27e7d1db79061f2162968d435c3c9fbac23312b600004b53228560a86c3459737b51459c18bd51124262d887828a0e186c1c75b697cd05781b6111e218ac919808ca9b08af7aaf4440400d6095f5a05184309046c6b8cf9826c81b13133b73722cc0e3a0859bb90f13a1772cfee09de25b2b312333a4c88a7bb0a72c4c9eb000000000000000000453bc06d99ad0294286ed5cc940b5557d44d60de54c7111d30554718f04e00a010fa9cdf288d888633839f27ebe3ce1460631aa19c753ad6ec661be404db13f20bf6c74b3c7f38279eb488f4d985b0c1c7b548ce1b2fcbd3f195b677afc2a9d207ddad8cf7f99082eea8325888d00050f2000e086810ebe995b4dd2936b19f810763e4f97fd61aa90ef9d598c95c538cc1b37a0180459a1705520bfba8eee1b59a7b3153fdae2861971000acd5a00c6edcd1b60600897c79fc5e3c3372378e1a2b5f28e6dcbf117524d91daf85a227eb1b652002d2193350969051fcdfec1a531e325e42d7865097ff8e1a3229422d5814210022cd4914a7a09ab5faaebefc498cc06ca22c4546e2a7cdebce61fdc69a7c63150993bedb2959e8f5988b9f578654246bc238016c801db87238404160bccc967556c90d3e14559c903acf751e52b9fe58d73a996fc6060641e26880006ca20030d84428170322a7970efd24e119060a0d4572466878ecf2184c29eda81385d97a628005713d3ccaed42e70a005a29d835667e69e840163464ba831cdfb0c22035d0aa4679d782e9190773e1b8e4776835543100709316208440000a9c88994844834004cd640b4776184a31252f20303c94fba8485672a037a450805097d1c8410aec1caf424018c068dbaa024c38460108183375a01b92153631f941280216a2ba8a3000e69380f004490708c0200001d6411c07338e2b689114236da1628acf85ce2a14787fd440fc3f9568240000000000000000043c7d41b72471fcd4da50b695952fb093e1e23bc553ffba3674000000000000000010484341d648840b50a1bb5732502d071470c804400300440addc67ad6dd258005d6d81bb0a1eb5a959e8f14cf8669d3b4d9251734a410076c196fbf4979d769f26160012069cf1b678a7140c78693d302f00b9018b459d5e800d4810fac8f9852ac3b62f58a92a1247400159c8889084405421e1a10e09086828430040010c8411c0764d0ac8516a22c84ec8e409ee99494f6b00c038324918d639f068e7f9fa9c40e16294031f49e2706a6f0484ff08c639749)) <<< 16000) + 0xc99bcc37b9f83cd6b5d8814573e21811384d87abc0263170cba46e59dc3aa09f10d3ef0c0153c8861be3d0195332d6386e86a8409d5c44fdc00d2faeabad569f070b857bc443b22bb760ae2dd04ef86f8592d6c533f9014a25ade2b7da5149d1fc415d87e07a9366569899db9b9166071d042ef50650e85205aaabea26b06f2a63888e982a659248c4843025004809c8eb413348fe7fc17f0caf3f7de4b03763c00c1c5740f4847b5544c062e03507edc999852587ba00054c42cc27640e4799cd7dde866990a23d14edc63708d67a2440a18ea46de5ee9b2f9a2410ebafffd5da475f49100b1c4e25eafd3cca6e0902c02b0e293e60a27bc001ed9e2165a54d6f346251245195c8ce042e5e8799da0a30e2284c0000b0cd937e894880919a2815c59c20552a1e718278f18c88303490fe51c0094507c02164b716822d2468de808c0604f8a31774a0040124901203494e9d10025141f0080000811cd52ca5dc789eb94c96160571f506dc91c7f3536942da5654bec24f8788ef154ffee8d9d00000000000000000416c62431136702ddea0ca1d0a40b42883432c124020000285f1d7b2fab0e86d04c39c3a1ba2baac950433b9a6c8728adc7c8eaedaf05c14525dcfa373e04b5b353a7ad3c5a7f4c82bdf4863d8d4518e632a8001fa90d209000322110a05d8d07dcfe66701bbfcf18b9032aa66b3c574ece9b5cd230621fb175dd38f567196590100b099972c4682f688fa2009fabeff4e978716dabd083bbec2fb466c06166d6402ccf083fd5cb51ff5e71217a1a9764add036e9015d1df25e108b2942705c0000c3481c88c42c478385d8bfa138cdbb257b524886f1238b9af7a58fa877d47af5877b18e20abdafeb95359e8c1761ad29c1414995e13145d5069c8ded8e4540c10206cdf03bfdc8993df1558aa88004537a9e25c78df8af3e33b4c000067561f80c044cf5f23c9f8bb05580732487b9d548a6206410c66a9652ee3c4f5ca64b0b02b8fa836e48e3f9a9b4a16d2b2a5f6127c3c4778aa7ff746ce8000000000000000020b63121889b3816660e48e304580400380005912f8e949390d62aa6ad8b120feab78998c5c151f443efca408660b3718227af384731584c9d7c9eb934c83102658a99b79e3106a9734000eb488500f1f506dc91c7f3536942da5654bec24f8788ef154ffee8d9d00000000000000000416c62431136702c8b18818504a0040012d5fb060c73c5c934a9f1deb5337536081dba158c3fa41cbd102a0aa529f3a1620fe816149b9ef87f276a86f9c600da3dd5dd121a345fb78020072b43d2ba185f02c1dda484c359f4513998d1e8bdeda5b4aa2c55acaae3b8528b525e80023791091908402800301cc15d87e07a9366569899db9b9166071d0439aa594bb8f13d72992c2c0ad5dde947732f9e175852302aef50650e85205a1631230c18a10400014b8dbb1f22f37d53dde344e3ab710643eb8ece8068647fdc1374b152e9b5e37225ae3a87ffbc07315bd7f3d938a417c525b59ef647fa3ca78714fc0531f506dc91c7f3536942da5654bec24f8788ef154ffee8d9d000000000000000004177a8328742902ccb1881860c700600005d649d74c5a6402724caf225ecad7e629748ec2bb4071b56948d918e1955b27947f5cac5c1242b400bffcb4eb11d19a75fc82e7aa3e6ca02e6420b006665db58fac8c49cb994efdedd01522bff83d48360bca0008f671f506dc91c7f3536942da5654bec24f8788ef154ffee8d9d00000000000000000416c62431136702c8a147145086003000105f6f74f8e79d3a22a6924673d2531e33019636af4f708022fd86a98b0d7c2017e72a67c3459dff351cc6901ad449a3cd145793c99383de29729e7115f670a089f729e134fd2cfcee5c8eef2cbcf9885093394fd2b7be29b06524b826280023b905e1501002c41c1420c02000ccb20a06a1051508204800b54c86426f856aafb6dbc27db551422d5b99b374349b688136a7ddd835becb682042654e37f3668ce430045614dadac9dfbc44170baa37a1ce7064113d0d3e79a2311940dadceb9aab5979482042aa94a2e7f0f0a40c89e21faa81e83a0000b10e04a76f646888188090f3173d28cb0c1046f322da16c3000556a11f0c7850213e50b6e06008006a6cbb82fd20400e1f142cb492a01996d98490e904072826068e312038b16542f034000122110321081108404262000a0ff0140d2e018c71d41c211f64924330c17c4ac21dda8508e851fb829c4005d6b0b20b61c097359d3a548a012af245d9ac1512c94ebf3712a01bb002b6ccae3738290207ef8317727c48830fa1189851431231211400a00838953ef3a5a8850c04f8532b80bf7652c3839e56ac307c115c2838228e15b31f78e215cdb69a972e415e73306120e1a6b3ee3fb6affe7ab35b13e5d3c3af138286cf6dd991379740c12207f984f47f2720e2a19231800f5bbd642280662aef8266b3a243b12ee460000045e7bbe1da23f4919625e68b79869c05e804013cec400dc61091207b89a5652e25af0245d34fd83dab2db5ca1fa17ee0d946518911c000021e90e705d9258373ed39712355028890e5250a170d34f4a6122cec36f293b228606c987ea74100b43f861bc705800e789889860800a19bf31af00a09508202a0240000f410df01fef8317727c48830fa1189221020e20e09400a0060029533bd9e8acaf3b158cbd80e48950b5c77cbfaa7c5d7285e1068000be10562d82900e4700073dd0c7113fdbb99f1c3c60053c4060c19a5b6f61820478777205040000019205406d)) <<< 16000) + 0xa9a4028056a4c2c202c684400800019220016b443f8a7451660ab77c2c7163f110c858c11057e170a144aad9ca0122851aacdc31851eacbd0182881a9256f8cb0e3247fe068c003671dcf0c801180230a3e075456230630385961f2c60c34fd2811c508cd9b37f2c38e07608df1810225a2e95340007be03589c00900200002e26c98472ae8fb3071c1a0be5aa722c53d416c4fd10a148cc0c86a0c1841a777d7e960a0b1e3190974c241021486c2f0810017ad1dc547722010a80800003b2688b4101e481ca1de0591f831186114eb03560a136f234fa992440000017700907b77eefd644000002ee0a8c104c02800017a323c6d5b0c981489184149d862690487556c3748e2e20300000124f800c1078cca2ec724101580732a0568800000493e027e83061681600006cc87e80e8adfc6b2ad8122c44e2cb34471534fddf05e30bfe76e7b602042793b059a8e24f8abebab46114207def662047ef8f34d318022072a1605240094051a5e047f11d130a38c895b1e60edbc67329cb1c39ec43aa9833022421592c6732d8bb5a1000b9e038ea700230080000b51c2a1423112b964c0fc4ed9e2c680d22550a50c3b562ded4b14f797fdd9142b7b1b7ece0400efb966bcce084601000016c3447d090c0a3c30cbb915dcb8142e930c62ff048bbf24c76bc1423ad0847ccc489240c7d129101c9031a6f243042da044f710e0000001356090c841300c00007acd15f77f12066050a89f36f8f2048ab030a44c5638b30fdf24daa30bb452551da03894306632460308f31f8f6158204ccd333ad983004c901eb1816920050040d2e29d6f3c19853537ca3893073e343a60c58ec1e43d798c19ba20abec16324e8309d40800359ac2713801180400005a8e14ecba4609cb262b68ba609633509af6a92865b36e0efa58a969a7da90a1518df7bef900008c610050400df6fa78cd0084601000019b34467f4a274d2557e30c3c64beda47d22142ab825186e4cbe848b38c86d48bf5269422336ac4832fcc24881ab8990a5103810186ae25b38728e080000047868c017a1203841b02800008ec8003c61050058007559821bf8d655b0287488022d65c919250a943d12859783b543b49177718611c12441546dd9cc060cb5770bcb61001103950b00300a47b23350a4801300a2c9882f1c666510dde30c3c4a1646921b359229870bdf6a28403131ce8e4890b1929dd8b000aca11b10400332ea97ea0008c02000033268843022c71c48f6e6387dc09185ca69a5f92239d0fb7cf204475d242424070a21a30c01003c12506633821180400005b0c0dbbeacce6c102d2adae97fa3877d32181f190158f1c4689038400000bb8008084d3bf10ea280000002ee0251c209805000030c43f0061f6020fa0100038090ea1d07c8e83e0541ee220f61107a8883d0341e6020f201000faf10f13987816c3bca61dc530ed258640ec3b0760ac330eb19e1300f9be3518aecd272121440be44b40e71dc2b7b66040861ef3bfe2fb340920e62003b357086e6061eb04fb07010372384a120e9f2dfa01408ad89b9959bf3eab467820134aeaf793fc8c0f779c40401410f7dcf6eb42ccdc60ee403c8852a02314d8408622002f8720d51c8775c4e0b807500a00002008c189b593690023786b6640038008000070300401004000011102005c1010b9c78103888b7a967011a39dd8011860f004000029483f84e0800f9b910c94186270107d8f78f29baa8151454f620886f485e535f119c2ddc5e44ef5ec38e3a77a61a5377923411e6f5cdce0da97eedd6f30e6783142f0891d91645cb2420836ea0cd036a9e84cbb97a2ae137a0d28ac8dbbc75be1df8d713e9f8ff770a50c306e6d1c2f2264209ff00a0674e99e72c1e3d2117be22f54d53594236efef9bf301ea86f53e7b46b47f2683935f8351b0d52df06d688d76f3d09afcb2e3b19cfc4808333cc60ca856578126cc546cfc0000b6a43a4078636c8792387971e7b2120c1a00406e82e8a6e3e1b83c0b889c080805aaa9dd049880e0020000280c8e0955a33423d8fe546d18b40abd6cf95cf06e9717df324ec1c084d9d7bdef898396551277d98a2ba27386ebfc95935d5930701249f2cd145aa7fd56b482a432b6e9bb4d14e1f2f25771d40a2c75e93db053c45cfae2e3494f78cad503c94491bfefc38c24a424ed57033fbe7b1d3a18622dad5993558ed9c52a372d4c96d4755f0aa30852dd062198b333769bf54540c52f89f000094478a61c26a88a0a0b341470a167efd55608009f002b6092080f804334b71109ccf090ebb4751c4fbc40a9cc0442f96aee048a0582935fb39b7816651238a784284780380623379cc93587bdd1501266cbd077f79ca24a4fd2efd192c8cf2e2b56e19d39d842246ea0004ca648324714b7a5ac8d2be4ee45c41840c9edb0422d8643d862be02438107b808f3e5bd1d0e508fa35810148b7cb9a35dc6d057a6e9c7438066e3f56da99d76993d9bf62c340b69b7b052dbf2fa77e13341014c84e5abcbe87e8644ee53e9e33c1b746bc7f2df50c28c02080003522000d82400336c87408c39c17841f94e4e44a58161b5f92e07c89af95a3ec807a07e53d277c673f05f73abaf7a169fbea2c05b854538c5d9ad7156bd92c3ff1d1b423440180a4ffa51b85d276a1d5478023d6d781f0801b1d8234c73d49aad99844f4e5294fb89454e0ce71e0231ee7130302054de41b489ec80eda4e1252a706e241952f16519a6e7ce6922dcffb81d42f8bfb634536cfe94a2186800009004398961ca330e4158718ac0c0241c40b0)) <<< 16000) + 0xe10187000c37c07e2926739c724673cd490b54140f6ca173303776a45c12849a9effe0d529efc0b6d8502064999946ed0297d31d6ebd0f0ab844f00d9e2ff95f5d41db13ef0945077fb0e140054bf4226cb709c24528f5a85d49f9014263104a0656a1e86267145f2f3db6344987153227197fe76465c54ccff84f6b0a278eda1799451f7ccc8d28c3d8b6258088bf1519da3a907febdf4a564113006ad4686a94f4f36f82f4d5710f9aa6b4c8043c9901603138000000000000000000000000000000000000000000000000000ca0a4d7ece6de05a76ce686eb09c9c49141482a868a68458430430009d0afdda2315bb34dd83e83502fb69549a2a56d264012440596d764a023d451896026483dbc0da7aee2e73f788273ecf71b79552c24d161ee6ee865f533f9eaa97c6f77177aec01ec6f75411688f1b75f79d70a8aac27974495513de2400c4eb967410073ce5adf15231420008000057900067621bc0b88e716bb64ce164a1e35d0e15e66e7fe0230c1f00806e82f671dcf04e6784875da3a8e27c8873998022210d075922102cd333bac51640b33853021c2440140080085b29d03651773c824ed6ae0db4727af863523fd1b7499ebb8a324eece9518421868a0004ba60583dbefa48f01fa24a920306d81f2b4d415d85e81a27ed3a6752a041190049c09281a4e3032a81fb391609c8e7ea84a332c9580a0074c92a033e19865b5f18027e1aea69fa632664b8b048d071518a561c33f16a7fd19695b8a240540000ba0c881fa9ce743c6986a21871c30d1ec50918341c4b3b609020800201b803cd2dc442733c243aed1d4713ef102a730112218a2096bb16ae9a496b7a81110803a421a0eb2442059a667758a2c816891078c38630690018388a82c29283f90de7804cd705c183183f043dfb912d6bc3bb034a6e09299b41784a15e9cc1aec313218a196e4dd000330311c51a7bb383751ead62ab630d1f6d22434070b677ff416660e7408759d4d3cacd04166f142360b09db3e53bd1dd88d2625ecb3119d322013de38bb7b77fc3c8fda715f9987489bbc500261c6fcabaaedefb486b76ab7c0cc2618052d79f246513365e362f9269500f328f22c16799df9e84f2903d6d534dffae926a46f3e5043750eef5c74a2635f9ca210a33000046d302c2468db8cfdb85746bfcd344b075401db4b5eebd578d0404c00e2d0be8f65c34db624000ecdd8ac631da670dde7cf01ce516d99ac25bde0dc1a3003c8a0b9ecd758b53fd74051c82a80ef685e8421a5c2076fdc12982daedd25f02c94a76d372660c28a4198000335200181c436c040024ee4368561b213a0a2d8fe70de2ce64a6938cf0e08d2aed22676d96857d4f31340312a77d8bee1d9dfafc2f648032371e9093d0033641af506005c97eb2434e70d83aad880800927233350b5831ac99d2c11008480e61bc5291633180f94a3871f364ea4b0effbfbdc8d36195d8ceb7a8c58ae1b800036c21b0530d71d86b02e8afe5dfb2c30c7a6a5ae18015b033309820f0022a0eb805e244106801000009268ae473e0d80c30d724e8e381035d04fa180107b9b972404200084010040100000444000440f849ca504e981928205080025fc28a046183801000009f3c7a9e182f078026541584400331a926000557aa9a00090407c0200001a86499b1e00311c18213a72302084de316402801091286d240421008401004010000044608e04c889868407b6c048105c71e70f20030913213090207c0200001a278701784a080e3dab1f59d8f0031e808ae0003cd2f8420240c2100800006d90d5090001859b189961c922f7098b9bff3343d1a049e809cc964dac02b3728133c50b608fc381afe0515e0c4ee77ec1cc400c7fb26862b9dcc1cdb49aaf3ce283bbef54cd4a0b2079df97801ee25f34e9241e06c46c4f6920cb4b2004ded34106ad43c7c65aa95b39281cbc27568fbfeff78a392ff5070de803f937c80e9cf8116efe285f960cb854ebea2c0a22356d9cdb46b34a7426b11fae2ee65e3c0101b281e9d94293142f7e037bd20865292e0000a9e42cc270418b112094f49198d225301e017b56ff6431cf3a4dbf778e038da88e1a5aecdd2372de420d5c4045cca87308148f423dde92a9e780762d1badec01f5ddcef868694a53e35db4e03c097d9284320550d80001431808008022008d7b2138042203a01000005221a80bf01afa0138de567dc242aa759fd3486755f3ed4492b5e2072aa7ce6ccab16669a8fc9e65305a9f8b9becec0e5659f3f92b7268b2c8559b8ccdfad1402806007352dac3e0e0276dc6ea17163fadbc112e0cc05d64aa909e8b43001c212c6edfed51ec429d2101740276f755624d72d16cf11d2b1fdbfc99e2b50e491ed9aaebb906a81ecb990282f442e0828ede0a867be0a075d07f9f84a265d1eb4da7eed1f148f0b3ca55c7147364a347673ac347070fcaafd3dbf10ed3529a91dfef604f39cba903d0c142752f2b564c808870e25c2fc5b51b0b5d36bbd512d9894fae7bb15cfd4b5c2670d847fd66abff7cad7211dc4f87219ee453d2271f54a82b23221db5cebda776d8e977233ab461056ca898f691e3e8b8771cd170a4b5127979f5107717dc4dbc536c2c41840d48434d8c73693ec9e774b488b795ee80f5217a8e57f089f7c3bce0013df7af38123c43428fa8000a8821a62a0d2090005b890d105d09dd8d902e9e98a2b377be02402254a8eeb3918f79a46f79608207f4322bf7afa70348f45068038049d5e8ebc8d85f01686300f05730e578a440f86e02aa200d8721de4e5d85c27)) <<< 16000) + 0x326d46222d6c5463720274cd5282848027315d30b59811d4c58b01d000031f21a01a0cf090670480078e086690c33086196038d8d719f304d9036262676e6e45981c74109873e12d6dd016450e288686506286800069126e2e0a1add18748f4ee6bd96b91431f0a41214f279ca2302ef1693db3ab434ea7d567f3b5abadaa61876166f0b4ee884e6784875da3a8e27b298b9e602258f3abef60be2dd1b8866c0a73f35da07db4d78480f340b31853841844420821800d4347b90186975723688b176fc580cb631488d9bd1f82aa8139a7355b9259e51a9ee8c5905d824b8b0a5611f6c79d5f7b05f16e8dc43360539f9aed03ee6dd63799780591642221e21c21620a008352c79866c509c51cf3ad22d32874835063b491847223f96c6976115383bc8249fc8f4d56775851b451a0004ba40015d4f0b4ee884e6784875da3a8e27b298b9e6022082bb0fc0f526ccad3133b73722cc0e3a08563ceafbd82f8b746e219b029cfcd7681f6d35e1203cd02d0614e10610b006002e61ef175ceceb24eda28a95bac65b640c3e799a865b9c9d7fbeb93069da384fef7eb8bce08ae164f8d3ee7da7e3e1f41b25a74a36530741d443b0d0b6410bb05c39e230fa55041c204b9f94016219b6e3220a0612b975888020e97ff6004c20400100001313438e44205070fe7165881774b50755ec199c18392df69ed14c44686f719837ffbf5ad14192af68e4d9b677a600ce536f3c3f2f378805090a3a6e534c7800b6a77f6a1cfa2d0e2b8c2031934d14e58b827143a06c00015110ca0100040e1c040765c85609a20205827c088de03164f40201158695f9fcce1200e00013cb318b00bc646000eaa60d8f72da8a2802eb2f1a8938a9640802240b9fc1bf9870009167c8068ff338fc84b655d4710e1fe11cc67790e407a0e00002c420ea3b0c9158640ac31c3618c0be6dd6379978059a667758a2c816f82c03f4249e3257491f32bc613a8779dcdb7a9b2bd4b158911111d11be1d99c69c40c1881a20003b36d6f014086f98de9ac356dd88ffb3a981cb27ef6cfa210ad879546970d1e4c2f6ce22df434b7e4fbb08993ab7dab794aa1f06368dbe842a9c69099b0c85134250a91c45472fca1b848ac859c60c111bd9c2406128b37d3184172204e160a065f404128004a3040010f246a2e447c30908970a95920821cad3411820798d78006022be9083801094608802000022640008dc8120cc314460460be16421b3cea738d2ca722f84d90f0494555579f7047f2291c0c08f3b1160a194dec2eb78223e1679004f896f749a034dbb821a5a06648c355d410425305e15d27c51088c3c4425035d4617c251e82b80c058b08666aeae59e1d97a178728d041ed60889bd661e341abcc8ce08ebfad7e05a96d1909102b70046dec2215ba99d5f2c36d56be9f90684dcac5ea9cc6fc221c03db10bdbb1175aab339cb7a795410ce9d9345f6b134b70d1e191094d32e3d6b48ba237e5c98a7507d3e14f4b73c545027c62a688c08216ea343e4010de4a4924022508d7c850026224c682055708d8325041f00844b2671ea4160858c6654b02b8956244c107401000013c4304240a0120a7050000f899122370bc219e48fa04957090203a15b570c08b27aea329001e2eb79e14002cdb4c143012845a47484e10440100a50500802829014146020001bc21882b0c30dc88350d86f961f718e238a00d935b7e11820f0042c3d0415e9d308ee81ce0401073ae0e4b048a66ae724041e00800006590c201c816eba8d15101194f05a24017b987d8103507c6730240c1e008000068103709e8cb5755820d0e011b8e6a4003a0209b23041f00868e0127fbf1a352b9d8d2687ab62a541e08a9af056182029131292820f00400003d4e8d022f2e4d600790a50fa6003c5d98f23041f00868dabf5bc91a19de0b518202786b6f891820f00400002848000b01b0f4918f1a583ec0de294805ca91a7011860e8040000288d061007752505e52bd1c880c105260011880e0040000284800254190bf2600204014bc356f1103b47d8f70403687d52024081e00844b5b82484162872178c8f0c2d43cba4847b9d4b94010a64099960cf8401a426081d00800008e10c10d06006829c1400048642fc2703c1cf8d38902813579740a1023f3018cf0773cffb2d001933a641425082000840a3c65fde1284071c132b3c1a57dcdba2c12204406609020800200001ac42f83417a1a0bc0905204828c040004b8400312485d808005ae8c02271fd752281d84a0fb420110c1000434405e34d6895e48f46b2e3e67cfbdf71254d206b445d3ff07946815a18e029dd836209e928a7ae1808c018fb9aba4c1346410f5e1f7c433be66af29bd517e4cd3768a188679e88b49376df9feb304cf33378100b6d842d96228ae6a924782eeedfb5aaf2dd4596e9e7ae0e2e26faeeca07f558b681760c70925f89441975af5ef956dc7e49e19f738fe9a5f6194c6d9420bec3dd372d7f3d68b5aefec257e2f3a35a789e0822e026a9da3d316062a93ba500249a9cce8c5821a36467e0df45745b7593d54acd5a1946327c8f800066621742a0b90905c0082dc0416c0200076f362e49ff92aff96038031dab78a80c203801472ed1f2abec60126051100fc5184002e55a17713f00040009f0d2a87c090757f7448be8097c3ab56e2b80410fe00a68660a00002212004e3642d4761683b80108de2c41c0148f4462580402226e0046203c01080ec19446b43b7106b60e9332f79d8e75bc70927904736f19e320bd116ab5f1986bdc03841606e75a9439)) <<< 16000) + 0xb3dce4fecb925c928fe280211406f3de55ddce1f5674fc5994ac90a582d324c76ef706e8681f1065d37d8574de19945b9ea473821aefd004ba118b45804740e814e99f0a8d016c758a2a50c8018c026808000f6885982f354b29771e27ae532585815736eb1bccbc02d338e2b689114236da1628acf85ce2a14787fd440fc3f95682400000000000000000436c62431136702f606bab161ae60fb092023e3b162ef089cc225306103181180ae0234d5e4d3b0a8732ea9995f2871a595484b91930e6eb8a78f4e6e86bcaea6f016cd44864258218b26a763633ddfadc8b0ddb1b6803fa4013c836058c947dc9bf443271b842c64112643a8588282c004000a5a42c81603c0b9100bc8833777bcc3772ac89e65e39abed00650d12df4e33ce430daeb265d61b4628a0804e559ab912ef446cce91c8748a5c9e8a80ac43c47b3b8b0d208f7cd8ebe6e2c440653642421231240e1e369688d9ac53ae34e1d962c451d4bb0f2b233e25dec15a6040903d6f232b2312f07e0171a3dccb93900c3c175c70537ef5fb951864ee48941a809003bb75eea5f581e76acf7746191379c2b64fc16c2e4bb3172b41f7918e821ca24469681b871b032455e0cb2378e79d143ccdd5f1ce20a08cb60eb9e0f3c62c143458a14a86d8518e9ec1c05b007c9db2c879d518bb287783f4a8df294280719612e670f14c462226ca89effe5dfaebf576d4fc488cd87110a29ecc1215eef86be9a3cfaec4b10160af8dd022f36009a6f95988d9db55b7941602d6dcaa73157de3c1d41ea24ec64a8b6ef804592912c0c1e83a18e7419600012f0c8302262068e0376b37e616057eb83041c048639aa63007584fb184025181f0080588682c02400025c4002d98d09514bb662583a250033e600e02175083003fbaf6f4200a5ac7002220212941000400004448579282b86415a120ac090558482a804002e9e40806600a4de402498c82b2ac1480761281cbd71379ffdc48505516f599d16e9060414cab91ef22ef0014fb2f03b1d35742431778398e8d9cc02864741a7b87ea5e4a84b079d9e12e51005dc8b3e5eaea711c54a408b63cba504c439a93543a06c606c6349f603830623b29d147848044e9f0c6ec2800b26e40f2e20132ff4c3136807bd222fc1004b7c8b4e440283f5f0e2e41327a8d77d3c8042f04209e1150aa050040e1712124eeddfef4838a3ff84fa3409c732c0482177a994961a1004fd617ab836d62070041c1cfd1ef637c30147644e4a7736e64010039a49f077a04ae480187f752e8a86f8ac3f2c23201c8362820148b8aaa864febabd751b7333b4a6b8b227243bbe8b422f9d774c333b6e2a8c9bf779c00031efffb0499b4eb93e225c968a586c140e9cf7a8ec3eea03e1b9f820ee38f18e7584c02f1351fa49ea24556f93e41f68cb406ca408486757590ba6fe2bca2c46f6875be76174241e61054fb05700bf05d71b9116871c853eab80a0ff35a6affcbb32685aa1d9fc9384202a270664ef1df21aacf7bc09929ebc219e0d7e27e8c494dcc5484d1ee6d7338c7454f8180a52c8809165bedf740b22e5b41493892765c2fc84363efc900dbbe9d891603398809e17077db18dc435a4c430a48e811c020b4c15d6b813730d979f018bb8a28f34f78c1f3c0b9a3b11003cb1672746efd171462547b6f4b1e1f42d3faef1d23476501ea3d2b3a0dce633f3f2a8c79afb368e444b8e5231cbc2740001ef10a91985402f8a89154a314553f4f818c033f69222046183a0108020080201401414e0200004c214c0a80258e660ed3029f0c93bc4003e010f3c0e366083820c2a9f05007c4b15628c007802000013e4294140200a0a4050518080006188510ae01002008e38768c6fb124e404cad03c060eb40aa11840f80400002988508682801413e0a09e0500009b909d2104e00800114084d96c268661321309801d291d8b5a3f55909f0c8721a1d405ede2f4aa671dde5872f330000000000000000010d338e2b689114236da1628acf85ce2a14787fd440fc3f956824000000000000000004306100cc911108c08a08c00400b00eb7bccceea094376e479065c0d4f4fdc2e37eb6162ae7598d6e4f376fb838570bc3576807d0e6b03f13534c4f1f9c1c197fa0d9b7392f96000ce750f10029db116fe48cf0d017e28de7e3e45a0f2146d14044c19aea4aea660d6b41ede0d7101214c27a1a4fa18f00a4a4483d99c715b4488a11b6d0b14567c2e7150a3c3fea207e1fcab4120000000000000000021a2cc24866a7709b8528d6e7f10f83afbb39d83a118279c5f00000000000000000800c2019f2d2ad80cb81612c8f92b29decf18b4b860aa9a4a21181141084439dc15fcc8bc21b9c70e82c1d97e1d3036ac0ea9790313b636afca3f07878ef535faf5580629b20fe5480c5369aa7594d12c890bdc3a025aa8eee0269e24ed3e80a40435740b7587e2931a25eb57c25d68a842a69bd097010002e69c786cdf69f602d338e2b689114236da1628acf85ce2a14787fd440fc3f9568240000000000000000043c7d41b72471fcd4da50b695952fb093e1e23bc553ffba36740000000000000000105166123c14427a68465bebed427f8d275fd7fcab016a998c00000000000000003f06100d500d004904a00400e1401994920de73e20dc487957ce417060558f97ab3f16473e1598381a58f080a55de5d1da438ccd03e14a70ddfa7ce742c4fe472517b644b5a6da874601b14d4fb8d0fe8aef6d5c2cd693e0d71fa01a5ea029a61ea291a185b6933e38c3080856a28136a44299f60e80038090)) <<< 16000) + 0x962904a8e8250541262a00135720043e242488612243b20618399f248c111bbb051867ce21ec91a174ff1767424082100801100f460c9e81eb1868e1231d824040de04a10230c2000800005590901184782ec79d5f7b05f16e8dc43360539f9aed03e99c715b4488a11b6d0b14567c2e7150a3c3fea207e1fcab4120000000000000000021e3ea0db9238fe6a6d285b4aca97d849f0f11de2a9ffdd1b3a00000000000000000828b309219a9dc26e14a35b9fc43e0ebeece760e84609e717c000000000000000020030806a402382700380042589687fa04f0836ee092ce59dde20e335b3ec3185cf439b906e0084925ea7f122cc7979f832827970f7edda5e7b142025d5463706638ea8b87a0e814f6be4ebcd0ef78f4d89161a1d00a2ff549e991fe3069649bc5394abc2a6498d31c318b8bea4de4c854113de60156f769edc258f4d06745b2a000f5a42386411a3208c190458c8228641122a088150438682183410a1205009042008002a888017ae90031933232ad3792cd238cf29708ad08c19118d6f2424019d68febcc0a03d78fdda4c001306f7c20480a10eab923612d49796e41001230b57c510182ac1300c000078c801b1f100e332368ea22e3e2cf8a446415f4942addf839f836000000000000000d93cbd61e3a71023c7a09e1adb0b664e49a6da6379fa8c358000000000000000000000000000000000000000000000005e21431030c1180140040041414429e0da873c5e4b1d2a1f9edc9a7e2841b5d5c585bdea00016dcb326c803d735e6f1c51b37f566e9375decc95846d00042d201d66c4046464f0abd372c69f4d9a75e8433d303ac6daf2d75114298472dc3a2706e830398f8f15a57ec2f6ed02058358f473b9bb56f0a3e2d46fe64320f28f0100ccc41d75aa6ac085640e3c5d9467b1dfea742014476e89a72375d48eb531c11e766cab18ef00facc378b15dae9a26b25077ba3dfef616e80000b6c191679ac23bf89ce20fb93e3e66e88a4ae652363812c4ce4a04cb24f047822ec4708a42c437c1a438cfb0ccfb92132c4a591c3780830984100f8404b847766e4e17dd385a1379fecf250bd0bf7799c8b8afc7b673f64d05115859e428504cf4f487f67de68f2b0982ce940689dd699b9116bd7689daa0c5ac783f00931c0102fc437195c5e82f699c4a81ae8565d592735346a30cd490a27f493c6703ea9bf754081462d594d3f32c27b0d14ecc7ffbf7e414301cd961ee32dbc61b60e65a1950d5328203f6f84fc2ffd8fd139980e1f3e036ab9fcbe8dbc5ac02dd5f5e1d24c57d2c1f34b00877acb74b2405ab047638c14179681d64be73da662c030ecfe504c110ae216841d00204140540a00069e2100730502103f8ac1f8460fa0ba4f7284b7acb31a50264980290d14ce645ec269e2400000000000000039656b0c42c61940ea833efdb8b99c8872075c366de825506940000000000000000000000000000000000000000000000000018db4d78480f340b2c79d5f7b736fcf63710cd8137c83ba7081090c60c70450400003258d879c00328281b881e5910161d1f59dd74db9fd2ff7d6f9f2f820c2dc4cd451cc9f6bf61db1e32028f88ab488159bd6d16e4810c3723bfe0e616d17b6fdccd855e2de8ef87d676602a2f87b7628a9d7ca6ead6571864c50aa4974bd81229525498083a92cdafd41f01721bd12483f060c94dbc4723839377ab4e08155b9a5b092024c06e20c10070e878a008a0131410804000050c83d90c1e8660b4230791183c06c0a8160ee0bb14000006780a1402cd96264814fe9e17088a0c5996f62e0608152e382e4308d4419fa4020949c1a18b0b02492b0cda000542dff842000c82c24010595422e3a4da0728f90d36a27a881ed66bc3b90264d8309540000000000000000000000000000000000000000000000000c352dd25c8e66e939be8c5a36fe08e7f3b820fbff8d38e099900000000000000000000000000000000000000000000000003091429028410808a0040087a3b8b4c232909580483a716b6176c16105b223c6e94ab9ecf275cd600293ccbaddc745690bcccbe19277363a5fa910828eb3436fd98a374c0a0a20200054f20e023a1263e4bd1a7b92205d191080c61c433c4c96128010267898c7f300106ba6e889a100a008c39a29ce908042ed0a46e500803123e97cc2840e7164bc3a8400095610685606000022820ec730750de0c000004502c68f2c79d01230000012c0b100001f4d01021414923a300683604bd8600000040e04385a703c4138c108043475f7329ec287000004b01030d98fd13342db9de3811026ddc7405082720a25a8141bee64b38000d0136f920280c20008710a4a232f5ced7aedfe76a771abeb93c5f89644c3c1b1e8e141917a7e3561fc4f3b3e8b8207c83ea8b953fb639c5095cb7a245f9b7130a0268fc0db4ad649bd24001df3b6e0e6a4ca180bf0e9500123b8ce2ba3283583872788c48192e744591c695584b11e7682a1084c7453b88e61d09bb20a18522a40146508861a47937dcca7b0c2400002581e203178649184a74eeb7e2088d61d56850811812a1060df73259c1803909d93a50083e010f245f7329ec3090000012c0f1349d28ab518400000fa68a0c5f72c8d80c1000017310000000009602704220080000b290002fb2000e0441d0340a01a0008ce20482b02309e0c00000ac80b1a23a5becf12337419a43524317684dbae186c240fea10308287ea8420806e832eaaa0028e2846028b2e53ca3d2a35adce0a932f20d42f7528791d05b826c5aef28000000)) <<< 16000) + 0x000000000010b9a6e297c82a5a2f9a6e297c82a5a3224480497a88157a24480497a8815743c23883082c81023811011400400c04008037c98639f0ee63090000046501850c7b212343c22d7266cfc3022a42c5393182141ed31dc1018639ece3630021836f06e18009a8ad18b3d20848028f25144ff66a7132862fc7e309000004b01422289b0194f0b8175ad0c30400005cc414232868e7c08080004c8c00000000258049042100c0000dc90003aa204213e20ddc4797b9c348c479b0f1dd8b200000124f8010231c6a9bfdc0604ddc468a31c2c0221308368c45002a90212f770fa0e1054058e2041f7e8078d2268ebce32cb2000000bb8020800000b73890420fb6fc746040000fdb1028c104802800014820e602000320200135641c8540e222051010005be107011e826d7608fb39faa61f226c93656b3863d186667904919458400000000000000000000000000000000000000000000000000c6248a50848838848408228026d905c602801a0de1206e090368281b0040d60200028f20d45a069210340e819c5400328c4198a400467e400b0b880200b85a77442733c243aed1d4713d94c5cf301123635c67cc13640d89899db9b9166071d042e6dd637997805bc4b8e40554be8a67b64f82a828838430428428203813397cbe6d615601477936275dac61211dd12833501b79e083e98a1c298ba84346d7f27e4bb9885e5ca59007203978603ff946354bab85398e5628203f592ec711c3560b677c183744f258a182edc9899828005bf40741026142000871821f865b87129454833070ed475e3146040bd1ec44900fbaa60fc700894f4b9002610200087188726513491252cce3f0712546c88b870ea1b8a0e84002614e044300fa77158049830800200ca02000143200051c4000f6c8320ac18c360b4130620982f04c184060c003b18f7b0124891996ad8ccc910cb54936060c528a2a2490abb7c98f030410ca7854b00be13aee0009c50800219a5b888505f0a36e768ea389e60edc9990479aa594bb8f13d72992c2c0abc4b8e40554be8a67b64f82a658c48c40a4883064844e46ce80b6003dc2dfeb11a3fe7054d6b1260c3d5f183589934f1140e64e7c33aa2648c7e6ae8e945842ac90a0be0200031139a5b888505f0a36e768ea389e60edc9990479aa594bb8f13d72992c2c0abc4b8e40554be8a67b64f82a650a40a5024023803006da180ddbcc67882336106a681413d4a66e5886198022b954ce990a2dbb2a9b97d1e8900a8916ac314644d0002f132c1399e121d768ea389f02bd5c8408b354b29771e27ae532585815dad4a19950029e25c7202aa5f4533db27c15d81aeac586b983ec24808f8ec58bbc227308949107107085008a4eee59b0aa2a4a4932d4aa4b0dab180f8f4463363cb2da813f25d3b6270120a23fe72976fb1e7f54e9bcb313965eef634fdb2503d9f6655edf786a821f46fd05b0102d008178060008e04174360b80b960a0be146dced1d4713c4c179c1e08d328a37bb9480b22051841442031022812012265d0ea8d62b6d0ea6f0769729d9800daefe6d338622c7948371e71c72162d0a01a4ac89205182d35ac0c226e6c902c510b63a899a204946e2533281ac080d6b900d169d88747004ebe17ac000503842010000197322196a54fbc40e4b57ce723848922996c241157379e59008dfdfa28060442f92046182887da951140423d201388050304201005b0d02d0480006fc82c8e8001698f36eb1bccbc02ecb94f28f4a8d6b7382a4cbc8350bdd4a1e47416e09b16bbca000000000000000004277a8328742902cc7086084042043002000101f46f06b424c0072c0aa737873cc19dbd1b4994e5c453732af12439c764a639a308c673419341ac0c4cd98a5f9e7d8b30ca7a0006d44160240ae120015bc20ac7b0552502a08c14c440a403b1c496c7c58384d9e39f3d2c09b17563308016eedd5e0001b040f8240204a384201005105f1465136eb050a6f65699a38b0f07e7321876cdcc4a43847623c6724802f052fdc013081000438a27d2fecd285a23540c11c2415913132411026f2bc09020800200a00a04d0100007f9d243e9b930e4887cffa0561841d15937888019beee0c41024dfc28c84a084201004f010080080e804072020001583c520cf97ef182a56ab1bc142c8a5f5ad840d15a16569200a3c62f0804a2040010e284a06eb7ca16dd6b79c05080dfbf4c0206fbca2bac240820008027028134040001fe74908548abc244beefec23101059356b8100df07f8e324042000801e0080ec0407402039010000939000361203a0200074f20504b04c1581384f84997ca77a794d84bc51cc96479d0f282042c5d4b7cf1f3f679ecdbcbb672f1ec302282fbbf9f700bf4549237f6f15b73418217de5e33d69ad5ca37e059fb6805141033c9c0b11d566eb9e0d2ce19233e7e030053e665ccdc9e3c32cc7432b17ecc6c80506cb13fc0ba3227b90927ee8d709312092bdbd8d3cd0febed75c61878164405188af08ee348567bb1cd070b2eada619943a2ca840ce0811d9f5e17322e57263d6381813b8413950f6d78c2b6d601826c338818c68d93d3aa670206f8899250effc1daf34a2202d552612de03c72a39fa1a76d906e00b150c28a61a801d01000180104b190250c81245409022047110003cb9046298168cc114660880bb1133c3d264d05d48cafd4c028f44c3ec80129dd3a6c009050800210180390e420811075118a083b7079af8101d40d58f092060f80400e804072020000fd2086230420982082f82f91f4e6c500)) <<< 16000) + 0x4408b88c0088507c02100c010040200480fc04000098641e979fc4248057d69154800397a64e0400327754410090607c0200001b240f8270080100451198de5b070c15cc504e03231b188600845f85840259c639825081c008000076103d0d01e0680ec2407412039050000c9100039e203a13e13572e53640385338d088044303c0108077fa71792c886ba48a75ac7817bdd18002eb762701d40bccac487eff29ff208016943f0cdeb6badb667f83be1de17725879d96e07a3386f758c808145a0b9c7020b925ddb9f724069a0324c2bed8c74f0f22e45080ca12404c52e076fe524413063bfdea808e35dd3ece21c8607e0e6dc7ebf1651b9ab28d1c7d7717852803df3504f6d83bb4663857e6a5a829c91e9c18fc6c7c7b4437db1f718c7a1ae00013d881c02b09fee08e91c1a65c3f5860702782e30417db583b84024181e00801b8680b4240001fa407074032020006e820506302705c0c9a0e9f1c40a72fa8c64204163e52f4008c50800212232eb68f180fa40de79957700e132493500c00645d2d827f234287070389622063a520064e1cbc692a07469bd9f8a26e0822f011db426e585a9d5fd22c42a88144f76c8870be2bd7a921df41d9666018c8dc2d78ba3db65614433a65077f0601760b336ccb58f7deca267a4555293aa29d4866cc35f6a1d8bdcb9f837682802b4178586b40445083b05eaab96a9ce6d13a8b2ca8154a3d9daa942ddef9066576aa805078642580717decbd5892cb89bae28ca5032daca662414f234c0002f3101d09c0e6ac415408162d34daa1c153dd06983024fb46e90304a85de86820c68db4180260c1f00848840de959c2066bce53f22055fee3fde382458627b01823fb121d460156786a9004c184001000012f20381a01b0d00c828000ac481b0e80d47406832033190190a809c3400141c40c4240541200178020605acd2dc44282f851b73b4751c4f3076e4cc8230e169dd10a0be146dced1d4713c13bd273208d697cc1d0b4b1c3ad8eaffeeb79ee1a262a2b507f64143db00000000000000000000000000000000000000000000000000613e5a55b019702db4d78480f340b52c710218110022c5fb8a7ef762a6f03b6f43f31870a8dd8192e11d78c9c6e56312762db272e7d6a2071ae8e35a75f54f60f8732f17f81cd6e6c109de1e33acc42db238c5ea6de07a6ac32ac92e27540ff15175d2b3246b3e1155a2081ac2a25b0ce291c8749085106303c40b371de71118c308002000015640a04605e1302705d154259e525a202594c6f4ffc70859e653439102b517cbfdb4b06b98fd2bcb08147a2888068901b2999f9c71c02f559a01f8413220609808161e0176d151212438868b0e12254833188154ed32f0160977e80e50c0857fb4510824c3040010000135200062440b86605a1b02c0d81586c0a8160520b80a008020074270314e9322b030edf67511618109bec1cd86002ece53d508001338abf40025182200800008910281d81384c09825c70063e44c308001c61f3407a4626e8600000f2ed080f1aad7e442a203c0088060080231f506dc91c7f3536942da5654bec24f8788ef154ffee8d9d00000000000000000413e5a55b019702e07a6600000bf3bc273bd41532491c70c310130014026af9eaf856fbbc9e0b5031c02c1235ff5e4ebaf50636e902a685f926fba60bf1247f12608e706f1e0e5efc11dcfa45182320b2b4514adf827891023a7a8d02094bb4fca82c10136b87b04011716500e500210084000040100000444094140002a840013f080029c90241181184e0200200802211c924d74ae38a08440aec0881363070223009e0e89fc4800e7f11ac50013cc95d84c103e010a294bb6da60c1035daf9c0c0b40ce44e46083e010802008020000088800070902109c92b3dda4e0f0af1b9dcc14109babeff300806b41384803af0569c094307c021c1816ebdae2860a92d480c0014b9b72181f8507abc8003c0100200180f80f4a30fd00f74e08820380200000b2400059c80014010004d3203c0200053a203a23c1800062818c01942bcd18a0178929860400001b9218004e826a8e01286100040070240361201a0900c8280600402e020001802001af84058a402a4a014210007bc901339009168044940203a001ab820086ae40187a0d0e2c5013184a0c118b8a7fa5891810000021a7a0283e7f87b88b104057e2f5ae4800602fc5ea4f5300801b9ab5c473a2a825ac5c25a180311cc82dc3172ee5056050b4751171f167c522320afa4a156efc1cfc1b0000000000000006c9e5eb0f1d38811e3d04f0d6d85b32724d36d31bcfd461ac000000000000000000000000000000000000000000000002f10c30c20e10c10a10600ded0d6c655b9065f1ee4dad632617ce6984c208988d39c27abc045150a245730b0b04113896689c6726ef80d82babfd8e0c31ab669eec49bc615a4f7284b7acb31a50264980290d14ce645ec269e2400000000000000039000168ea22e3e2cf8a446415f4942addf839f836000000000000000d93cbd61e3a71023c7a09e1adb0b664e49a6da6379fa8c358000000000000000000000000000000000000000000000005e31861c41841821421484cba04e33db66c76efdf62918a6ca38e4d044fb9b2446844e76295af55db55b61b459853803a728995e94ebebd2c3b2980200b1c2e85284bf598ff05f3a6880861fd5d07d3b2a4a4882d0005ec20014f6403cb401c5a00d2d00614802ca401442009190040a801c2400c02005010006c81004150018880084400202000010054881)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 30 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase5" = "QuadFullSixCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 30 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase5 private def zz2242:"s08c2"="s08c2":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase6 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l1 l10 l17 l20 l22 l23 l27 l29 l33 l35 l37 l4 l51 l6 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l1, ![-0x59682eb50, -0x2a80f773f4,0xfd8d1e8d8, -0x58ca8bc78], ![0x388290d20,0xfd8d1e8d8, -0x2de762faca,0x9f0297cfc], ![0x4b0, -0x58ca8bc78,0x9f0297cfc, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x338df320,l6),(0x1a0131fe,l4),(0x270287679,l8),(-0x2009438,l10),(-0x414382bc,l17),(-0x62a4a34,l20),(0x15276ad3,l23),(0x18cfcd70d,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x270287679,l8),(0x18cfcd70d,l22),(-0x414382bc,l17),(-0x338df320,l6),(0x15276ad3,l23),(0x1a0131fe,l4),(-0x62a4a34,l20),(-0x2009438,l10)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x1043300a0c0400000002201480200000110f014c0200000000f01480200250982402d0030000000780248030000000d8024803000019024030c0300001b84402cc030001a8110050c04001a01040098c0500000190901cc020000000050188020000000160148020001dc6b01a0c0400001e8d4050c038408608c074900500000015402880300002b8c402cc03000000f07028c0200000001d0188020000000f402880300000000e0148020000000210188020000001140288030460c42100e500400000002c0948030000000190188020000000d402880305c0a01c0175004000000098024803000001109018c02000000070024803000000012014802], #[]⟩ def dynamicCode : Nat := 0x8e06fdf2d380b4e22d876a9b673ac98d4b054871c71871061070c60c002a69b58a4a9a2380f91eec2ec98de5ae91b822806b606bcf607cb361228000001b87061484b6048c4a308425b0149051c31e79e1af010e1241a5b8dd80904215ced4ebe380efa4b25d6a76804290180000e790210981002c02407c5bc3e63224804082f7bd2c3f645103bbc39243c10196772b09977183587930bfec0286796e6fd5aa0200b720a89d78000136548b654450392050ac0800003d070de4bc013b070c5454b8c0081826dcec661c24584bdc9820434bd634982043757a3e600858608c01000028a6537d30f807c15602363e0fcd79d6c077b238f80000000000000674d419f7d535067df246bac2268000000001110a18c10c08608c00a0080000371c010068000f7901f2100f0480741403802818499100a6bb21c29ac9449156186089429cff485a1420bc8824d633880401431c01d682000b77baca30d8700eab784ddbdd14005e4413c7bbd10891adf7a22b7cc061701634634a58fff9fa97668214e8d13a31a52c7ffcfd4bb3410a7468a46944562977e9ebff99a137408a3508c29018e19210610c09200c0260200401b4f674a80ab7e68c6ac83ba873e1304c000000002277da3ded5bac65b600000000011800002e80473295a26d7182a0000000031e1442f39dde6a4033bbcd47e1121029018e18a1080254200401a0004d04001150e1b15245226c60d1669a6c30504b546ed3a0700000000c80602fa7b5e1002000000006411b0612002006c040002b44068360321b0180d80b86c0583602a1bc30485a03f4304241981f21001e2a3977428116bf7ac68400d2b0ffe000a129011004005005020068f8af21c40203ba3aa3860f0322018708787169328e0c14c152de040166957718004c28460100100580782e889c7645c4480cdea719e4202dddcd3e80806b99a05730240c2200800980c04807440347db69a203229d248004050b97ba4e050032df624f8001e27480180165142300800008b101119000127980a0080200401601e0bc307cf74f3c1820caa0c5741800bc7008782001b3335e28004c51bbf14005251c2300800008c90001802000ae87082b3e7f20c1860266c45bc38000000064030151ff2fe7410000000032000a0d4909001001c02000136200101640042d8f116911713bcd65f0b70e630808d89c21ce696fe447523ac70b5c7272343d88bd39956ec50936d563cf8ac37bc64cd9c5047dcdca0f9ec20ce437f4840149825bcd451462fe4b2c8201ffa6cad6d15ce54172e7406c284d325f2e1fc4b70888c89ba31f419fc678505a91830cd3bc71770c540d048fc52f264f1d20e96a02055bcc00422452441c41c32421c01000c030080200d9155b53f85a59c092e8d24895ab3f7dc78081961a71c400000075e46f6320580e18000007cbd88667840090908ae5e89c7823c82600821b5a3e58547194a8c824063ffd98d69520f4db000000000014af079c5c64001ad955ced087be1f16b4aa6a97e8044909c00019c981102fa88dbd901c0a0cf1005182000002ee00402bc27138700900000002ee01001dd337ae80180000000bb8000a02592c2a3821380a001c0400038e40018d480686c03027836ff884f94010300000070801c16c9004b3931818413a3c2da0c0125afb28600806c9006759300012d8ced20a0404ebf067ca590e30500380001c5201602e1ac458072cb812801573f0cca51bb2184b00e26247696b591ac3da967e9ae880c198fc1ad0375e8dbb490ba6bba48281f72dc277eed9c0cdb764f1f4a0050805942987fd4c767e850faf2a6d0ca21802d714b9ae7e8e905ec97fc3cd4c480b10fc12aa84c14948b9afbc6dc17e46661e95c10c8ffd69b5a9871c851122ea9be7cc8a2083d2d088c18414371c8a06d575cc5840248af4ff032861000438c2db330e060bea02f3b0e08a3a484f1c05756f0602001c87f46094107c0218637e524ad8814462d6a811459848d882060869423f1904120a128f286009f0fde441403088c029d9c10880200002c875ae6f51e94509ab2426502a0000000031e1442f39dde6a4033bbcd47e1110a28e20820a09400a008051d74cb2036aca8f3d717043306a80380800073080022f900a0d80484fb84cef76b805800000000c78510bce7779a900ceef351f84444083882061862842801800000ae0500401a0100200016a2000e584002ca8e10ab466623c38603d0fc0b718309f97f9b98818000000c80708000001900305279a7bf620c00b693c8732338612804208ebe92c8cb103060be38f4c910000000960408a66f4914d1c4000000258040009b834034b0212802208e37ce807a88180d283675024400000012c0810b176a0dd01c400000012c010404143669c2000919d096e00020000b4ae084c0080001a63c7c82f78a4687141f5bdddc82030000004b0070c9f42f9758200000000a8c0700246740bf014000000012c0001ff973cae084c008007010000dd10004de200c1b00509d16020cd2e9292ab9ddf2ec4e21433fcd8005a42e907171ac1a60604000009a38ad0b1fb43dd128141b59887a717e92e6931d456604040000018235d479215ff7cb0140ef9df8042ece6e573721207c3000000082154fc38d9e3e5478040f5943d7c6475e0e932c6e3869321d7d8f81b40b8c2f0760000ea480200800c0400151c400894002020000100111e1 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 14 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase6" = "QuadFullSixCase6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 14 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase6 private def zz2243:"s08c3"="s08c3":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l13 l15 l17 l22 l23 l25 l27 l29 l31 l33 l35 l37 l4 l51 l57 l59 l6 l63 l64 l65 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x13c852d67, -0x572d59370,0x302b19b7a,0x1056134c4], ![-0x572d59370, -0x1b6754f840,0xc97a57640, -0x584ab26f8], ![0x302b19b7a,0xc97a57640, -0x2cff7c3f9a,0x9cc7c251c], ![0x1056134c4, -0x584ab26f8,0x9cc7c251c, -0x2b96acc10]] noncomputable def hinges:Hinges:=[(-0x338df320,l6),(0x1a0131fe,l4),(0x270287679,l8),(-0x2009438,l10),(0x8f641fede,l13),(-0x8f2ea674,l12),(-0x37c40fc6,l17),(-0x3d9933e,l15),(-0x13938381,l23),(0x7f5ca4e2,l22),(-0x2b96acc10,l27),(0x2b96acc10,l29),(-0x2707eec90,l25),(0x744ebe66,l31),(0x2b96acc10,l33),(-0x2b96acc10,l35),(0x2b96acc10,l37),(0x2b96acc10,l51),(-0xa13e38a2,l57),(-0xcb83e66,l59),(-0x5743f045,l63),(-0xdb90724,l65),(0x87fba8e8,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2b96acc10,l27),(0x2b96acc10,l29),(0x2b96acc10,l33),(-0x2b96acc10,l35),(0x2b96acc10,l37),(0x2b96acc10,l51),(0x8f641fede,l13),(-0x2707eec90,l25),(0x270287679,l8),(-0xa13e38a2,l57),(0x744ebe66,l31),(-0x5743f045,l63),(0x87fba8e8,l64),(0x7f5ca4e2,l22),(-0x37c40fc6,l17),(-0x338df320,l6),(-0x8f2ea674,l12),(-0x13938381,l23),(-0xdb90724,l65),(-0xcb83e66,l59),(0x1a0131fe,l4),(-0x2009438,l10),(-0x3d9933e,l15)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x520390040001182304c04b40100000288ac4604680180000000015404c8030000000002b805900600000003613015300c000000000be026401800000000005c0c8010000000000c80690060000000006d013200c0000000002401e40180000000004c0bc803001862901100bca00a00000000035013200c0000000001080c40100000000011402880300144228310078a00a00000c4321100d400c0000000000700a401000000000006c0c8010000000003280990060000000344850340040000000943a04c601800000000000c0c801000000004a0c0498040029040841009040140000000130280a6010000000108640d8c03000000000004819002000006c2c0e00c400c000000ac1c8024602000000002b07028c020001462203201220080002bc440640284010000000000032064008000000001a140cc010000000003a80990060000000000b40720080000000000780c40100000000017404c8030000000002f805900600000000844406300a879228282042d0803800000184410120c040000b22182c02420080000000000940620080000000009a0144018000350841800890040000000000058190020000000822100c300c0000004a08810460200000000002102c80200000000003a0310040000000003d00a200c0000000c4220186018000001341200c4c0400009a1182401920080510284110018d4018005305104c025a80280005c0a01c017500400000000013004900600000000442c06300800000000038012401800000000012014802,0x5a0310040000000044240d30080000001747402660180000000017402880300000005f1c805980600000000000f0320040000000000a80c401028920608d01f8500699e39206d80d2ba00e0040c608a1019b40141078c28a2810b68030000046188a40d90030022a31c5381eda00a002903184301d24014000000420a00786020000000003a140cc010000002b06201798080000000000050320040000000169481460100000000001101880200000964307012200600000000001d032004000550420b009e802000000036994098c030000000652e81318060000000000340620081028e28a7810b680300000000312101cc020000000000620310040000000ca42013300c000000000ca01440180000003390402cc0300000000000881900200000005221036300c0005c8e60c8088802001671d20ec062100500000000423a05180400000009a45026300c0000000cc520286018000018e2840920c05000000328a60341808000000006854053008000000a22080d86020000001b45b01a0c040000000371680a180600000000000d0320040000000dc520686018000000198a40d0c030000002a88a03618080000000028180f30080000000078381460100c109106400c1900600000000420c0498040000000088140530080000041056060c6028000000001a1c0cc010000a62482c0442008000000000b8703300400000000000e0640080000000170901cc020000000000d00790060000000001b02f200c00710c314401e2802800000002707028c02,0x33809900600000000443c0530080000000881201c60180000000000f0148020000002402200b18080000094260900b400c0000000003c0124018000001544701b0c040000001882202418080000003505404830100000004a0e818c6020000000000280348030000000451e81318060000003509c06c30100000000000c80c4010000000000d402880300000002c138099806000000005844053008000000000580124018000000000d80248030000000340880718060000000640900c300c0000000dc220166018000001a8110050c0400000340208013180a00000000642407300800000000d0480c6010000000000050188020014c104188123200a06945042d807a6401800000a71020490602800002a120640550030000ac238660352008049c33c12806924018000000980a81ac602000a812a1a404290050014c184208069200a002984886d00ca4014000290921b004a802000ac12618406290050000b8248620652008002983384700d240140000000000b00a40100000000191602cc02000000338b604318080000000220900f300c00000000c8b00a60100000001a0b404cc03000000308aa04318080000000622b022300c00000129085014801000000002d1d01cc02], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x30b96563feda6143ef683d68c214c41d6ed1408631c0a5f28040ec4a88a38061766a52a600230087188d0c5e26030b2610da12998507f4068340d2419a1f) <<< 16000) + 0xf5c258201cfefaec14100394b0181a04d3786ea72700250080000bc1d2e1592beec421c500000014a542ca26a07c5d4365920fd0fc039b4c207d974852381828c6a824018c082035904a4fc40821253a8b1160c0159394b7146345208560400002183857c31381dfb0514740df6577e1a499f301b672a5123e08ce5d101a40f131da71565903d16e7d2281441f6ee7d678068a65d25383700e023d59bc42209392105404000021121661301d09c92a0bd4b28f1124015f7c8c45660e1af994650b18237e10c839945072647f7728d0411407ba7b6805027d3c229d6c96052f5c3f54cc480390531c8ddaa96922854040000217363459ffc6d42043286c48583804b6b761146008d7d055a8a8c830460100000e9207e3b03c1181d86e47ed5609e2e31433052be038507184ad66d46a450a92b8789f8d2050f17ff972b8e29dadec182f080c4296f904ce386723132b0101003dc0fd8ada88080e59282901c00010b9911e7dacafaf22028844d1e057d0e2eb888c153517084f85cde643cb61081eb2c8eea1401b7365cfb7823e9f082554755d70a9a62001d605bfbe33d5a54078375a48fe7d3bc200163e980b4aa676c3b531af5fe291a6b028858e3cea92b2046c37136d27c9cf1a9081115b5ca8fea4878802061f0fd8a04c126eb490ee584a05af6bddb3494b1fc5d000088e7f1778f12ffc1a680ba4a1ebadb6968eaf5dc5f5e6d439ae0677b58a9b45c4996f084df9e0dcd20c05b500462884062862821801000ba916d3ffd49209419eea894bb60c06215e8fc203e52f2328232a47ac7410e8437d6f555ce479311c2e34cb3a53185c13d4000cd0deb8fde223bf59eb4cd8903f51d8b6813b714756ada45d300000000000000000fe0f20c999463e47ebd83c832662000000000235bdbc4629fd02d7367d07acec0b9152faa94c5ca4e90d1c3055440c70840820410414306f67aba8e11315a368e5fdb668c1c61af25919062423979aac6dd3ccb086095c54aebc75035d511bf47afdcc7e02a2194a4e3300c1959aa43ef27d54d157afebd8a7c272d0d48d03a0009f460f20c999463e47ebd83c8326620000000002311431821811010c11801401000000511c1c0080340004e08591c82c4a61601a0af098570282b405c2df441a08a586092c7e7cb2a0201013631fc9382041950cb02b9200094b0f0b9903001950c9e4c9505d2a5c9570800d44056e72352ee3a756cadd880a808011202c2ae32d56a63880e5964216be0387d00ccea4982421940e2c4290c0903e5b735c830464766039c248012818ad5b4180d32e7d76a908001aefe503e5514272480a4081225f32782896a0408df10137836014184c70586a95e30611d742672c40818480cd7668e238091d159197fb040034093cdf5aaa0f40c7f8854101f5ce385c060f229a06847de647cbf229a06847de647ccb2c8997337f6c4b7d1104a1ca1491450c604104b01809eb6da1b927338b95e67d995acf9c271af365aecb84318896c8b52f60cc0270a195ece9e7e04f18512586ed1086881040c8c5738ee1c30384db4481207086e8c01c1ed91c103cc39053bd89009f069acc5306fba010b80c1646993ae2f62c6af1ac65be50cd5f7f659061404a546779020079c60291c223404a34a104f5e8d21f09c108c0200002d84000e1085606c2ac2401a0a0aa010002f69000805200146642a497028e9ade030bc248928ffb80bba11022043e535e6f648628cd52960990e11a7d05321258102596c616e4210e001b7b9cd8ce418024df957679d2b56e030b80b1443504b191049187511cfa4e50b1f035bceb2840d3310d081221460bbb17850c1727fe1ce20005fa3a31804000f6fc0bfb4021280400600764de2332eb88b2020fb758b450e0ea8bf7932c676bfd017b942978430496840cad15a9adc2021b1d81499670425008593827a5ee2d3859016dcaf65e2650e14a1715d02038e001d5026eb858cfca82ca99aa50a60f442e5f7c20658e6d1424142021eb989c483440000cbf0d45f043a410b00900004444000edc8002c910a805c890990175da4f9021ae9b54a12ce486159d8fde5881019bdf709960c43849802e7835490a0840ed37a02563801045fb2d096060063298954860a50780c2e02c5933abfefdad2c67bd47d5e2142a8666150dc70c0c92dc85c1021d004483f24003d23844c0a00013dfcc14200004ba17c140012804029c078568ff1c7e7184e346573f698387ef34c379837008612579633af38a9bf061009dbc48404090ea125f0ce0048010c2a5d91c074ca184c2ef8844b413071527b1afcbe60d26d8d173630b19500b465bd4102009eca2ebd0241000ceb28b5010237b45dd4c00d0001d254976a5a4801581000008588001d11b267fbb767da58d0a02a60e428547f79d1dd8e1802ef758dc9000e75dc98e280006bd9fc80800035b459d820055036d0228002500805380f0ad6db33f1a3098d82c6f5a3078dcc131cb3066912050362c67a608a6b814304371c0841412056530239c0090021854ef92d65e8f0c256d06755cc9e60ef271e8fdd81306362a8ae3a5a1632acac2658da081003905cd5c604820019d6516a01411c606aa66cc1a0003a4a92ed42d09002d02800011510003b62000b1e4002c9482288c003554c0ba754f8f976203eea86156480e1998bf75cc24709ad44c79af8202674a8c9ad31800eb4d329340400c8e7df0540100cc11fc37a8b3a020a40714400c5a3483891d3c6f2263e48c4fdc0c2d92050891bcc22922449b17173880cfca715598180044cbeeb00400)) <<< 16000) + 0x1b8aeb6a50004a01003c01d0fa7a572b232450275ecb40142392b759d589106ebb062ee18630433acfc281258b92d948600554a8b79e7002500850f228c35f68d28572684b43119228c9ba291380910087f5f47e030617569bdbca0c306acbcd5d8140aa48901c4a07040022731738380009b7187cef4801480a00008048001ca100056d214c1b0a505052008001e6485184828824142020a001000e9d109f3184f16c274961384309b2184d10c264661302be15f1ae04d04080c087a60502107218eb0815324842980010100ef5025082100870b7625c8542040d7721f5281151aa2ff040a13ea8064a000abc8886300184558760c004cd193b04e104201000015f212e0b04901c000040118600198b202183010324fce182003e1590c082cd74bf5560c00b0c14c77940090020000220425817507d2fb0ffeb378100aed3497c12d136fc5de3c4bff0699f93f39719e0f619928416f67cb5809d02c8718508204a0060030020394ac218a9acccf8898a4529951c694eb548d82c77fc71c3fca3844cc3bda8bf2edcc4cffbb2f55ce6a708b125680018310950d80786c0012b484a0cc24c561242b091158480ac23c5411c2b08d1584604c22c161140a089014063f3bf463080a34a600b38e082228343f1000846b172e10009965e6395594508c02164047f771f4511453223150c3060b99fa840815753b849017494161b03821839b656aab30a1100400004fc8440cc08c6401e330871184308c21446108230831184104ec6c50628e9cb17b8355115143330d8659cb0059a853640902088021635faac6ed058bf7c1b4331228015f929428648d34dd79208155dfd5838005f3aed884c104401000013921021306e01e8827891804823b33e0738301e760c767a73b9fc89e107e1f640dce72f5da0e942571b9a71b7341aa48eea58a6d3766c754414bf6888426be42b5c643d98824680086fea675e5199bc93598847ac03b73fdf12943f9717f1023706e8d9dda40a00f4243ee329e91f5b105c448afdc1549309b05df99834361a0706dbe6a74e20201448a40c174ca2bc247103d2ab53ff2d5105439525848500c0aa2ed17a5f9642fc58359fc6cd762de87de241ac5abe4950a5bce910c72d4829e46800005e338207337364524402303b760606127f8e5d490ef7c5992f1800939fb2360c01ff815a0020330c11804000051c8400ec1fc660fc3307d1583e08c1ec460f40bd24880a2d2a348805dd8c4cd1fc63066323456367f9f409010880200f203d30d46229f034782d36ca5c900295288ae19841100200002b883c04f0b868494ca3e80627e552b7449aae06e2187f00cbc283c17970dc0ce418318d3d92d43707222478153b8a0583e5eab046bfe7e598b596ee98368a042e3935bc50daeb875a6fd340a2001b4980d2d477b8fdbd50c271eae380064fd4bc3b34fcb3d57dbcfe508c7fefd7ebcbb9b18ab4984c8aa0700c4cf5bd77b6a67636ee65b371af27a4906275f929471ad8c0f053b44f28168ef9ac387de2302926de07717b442d4ce9373aa812086e978000159083b88ec5e3c87a2f61575a5b38dd464cd1ce9fb410fa1852bb380c3d0849515cab714071400c9bb24a9986d0d245ecb5c850e410567ac5b3c9eacc66b8b9e7508cf460c478409c514748c6c637b931d778ee8d0abbe69d708f98a2a3c954c83c304064e73701000839739695e917118e93498272557fcfec40fa8748a72f16cd93da423102ab5dbf840bb50471e6a2d97a1ab86272e267fef14e63c8394af282ac218fd37000028990761d83a88c1d0360e61ba130a670bc38c0017c96ae105050622c2300800004a990fabb150bf6686eb65641c8706ed758c36fcbb6ba073ecb665dce0041267d660033cb063ec049e2c5a269906c7ce6f1c32b1fdbe40ab07546c862ba4941380c015f8f12479c9a80406d180d7c515ad04b0eaf11e07bce76b629fe0131bc28281c6e9332f7b02d4c3206b631af0475fb9b20eb13fa39d6782139571822f21409964c3fce9a2c5df17321d1b7d59c21148e926b8f39a9525fd966071720492a3a4dfc201a68dd193303e810640e365b7e2a26f3131c2fa6c4661e26800005e020e4620013a42003c1a41c4074528ae0b88b6e70227a06ddab2d3fa6ec45a0fcbfdefb95edb050ff0b8ec6ceeffda90c1494bc7c804241c0de46d55fadcc8fdc65aa68ba234267e44e233fcc4720b64dcee92920eccb2d09c8ce51b0175fa84b220107b6309a7b25e12d111db24dffb3496030e0018fd6ddc610a28a750d08a88e86ce75345b8d9114409d901ebf8ba2fc594652008f96abaa88f822c867c6313d509fd4fd4bb8e45b88ee2e2fb72403094d58d65a45052a49ca891619816b40007f0d136fe432db379c62d6725d021a6cdd17c2a9f13c9d952fbceb3d76fe230cbb2837e964c451a61dfbe1b223a2d9360c181f77a6f09b2d94f0a29702b0963db4f2f5108f5212810000100471f1cca25312007a282230c07b11878f1800f8040000284c0100401000004441c0160de0a06e01c0a18f4a6022183800806d09f1e485156320158c85ca0d2d2de7995e9ff5497afb763a3253513fb666e302abb70e8a2ca93397907b55632727f862cb107850f49b7c0f6e99f9249c6e40023ed8c1b8b3d9ca1415d67446a518258378785f283e5f693ba88f74899e276b14db4ffc651776c428fe98f9904682771bec973dcf3fa463b9114c3fc01ccab9ed29b670cdb3ea14f58abe3f0dacafe9874c8668aafb0005f76b80cf9f6c253b881b393dce9fc4a279863d0b4f52e64159)) <<< 16000) + 0x3f7e3a6ca54e3e2d9bd1366d5686d5c1fbe4cce95aff08fda98590bfa01ec73ba5d2af8be28957eee09b88b9ab0f8c48b7ce7cf96521a89ac5fd29566c5a61209de6f04010040110453f790d2490008f8b3d292042200400003f10000bb30040100471e70ddc6ca440048d71c049021100200001f483600800033c8004a810009cb20d62be108688b689c0cb6081662c01286d5a4281a8735acc1033a54df2892860f80401a8160d2038060e8a351f2421cdade459a0768fd8bbc80082e96afe080e01a9f0b1650c2100870e42422c48801ced54c422041f00803400ecb295ff1fef99980b1757ce5802747a9d5fd54480c6b11d8ef75ed6b2622821060368af37f2506eadfc22387f379bb67dd8175de7652c723692040d2421eae40e43af29a539fb2f2c8f0340e7d549cbb40e402de641280331e8f7705a25d73d22cb57504a22ebc0124b5950472f04f7074e0c9a9adebaabdd4a7dab9f1c39ae29048b82119065faa74fff012abf4cced9bafe549c266e5dbb50af0c0b5798c035f0e15cf7c30496cb70faddc4f0259b90cbaae46356fa62d49aa990fc283c3e6658912a482faf83038dab371ff72f6e5184a625a0001a908003a61c150bfb2c62812f87a0881807a4a450c8c107c0200ce03a28b098cff47a385b2f9e506a480a5f0ed52022926a48a2e99c083b69ecf06ce8fe848f4dfcf3c36fba769a37b994a0a06aaff2ae47988e0b27e22878f5492ae21f61319863cc67b2784aac3570690a6f122457a90e240335da6d925c801d76306d0f3da46a5288ecaed775a324089b901ed608902ed6837b4d70b7798972ba82097362c7aa12aa165a165684f6343a57e0f4ec95f0eee02969f4dd6815b852ab4f286359d8063a9986ab7713c0966e432eab918d5be98b526aa643f0a0f0f9996244a920bebe0c0e36acdc7fdcbdb94c252d2c0000d3e419804000f0e40040488328080045a883210c18c760c42b0611183008c17c17811a4dbe200341a0758b032cbd4c4ed27639f36ef82d89e5bbe20818974aee343f09d8e32832432221233db90e8b9c85e9459e1e48a080e7bcbe31b474fd2a77abb8f22289112fd6554f977cb261c55ffcf8d58b05bf3070fcf649b9f234f89117ad30e55dd46383edb8106336440ddcaa5e490e43efab0f308414f06835ed575263ab3ce74d500de18deeb301a137d9077f312f0e0ed93e6d1520e8754af40a8a07f1bb050e863391c3c638567da927014d66a98287362f7692a9adf693c3d867f1106308fecd95f6c2484ac7651ee5350f9ba5d20de6d1606451dcf834b37981efae97886cd69ec500da8158dbb86f443ec36539a65cdee260f83e0209f8f298a35314ac6633abd8a245b3592485037ca3e34014198b2a1769a04196e9dd411144243021008000076905e310004b310026d930380f07f56346040557f445e0831bfb00e922000139ad0ae860006f435c809410940200ba0b05c05c177ad9593a18082607c91b920065ba15a782002da6798ab20212004016c0701811e578df0c38f0dcff264040050999da6004600805a01c080016faf0840603543fcce18712cdcfe00680039523bbec808480100000e320003804000b4482c88c160460ae230560982a848150260a61305209806828144160a00304f01000295100341d200ab44780014ae3c8957c501cd078a636484d2efdf8c819e5b81b93c5febf03602f4468c0ddffb593516ead2c288faa8180dceaa4b6f2398b7474b35a4eac1149f450707f3dbd99ddba9a7553ff2556b9a565beef8ea3881318a5c9c680400000000ab1f0c1cb21c1112d025a5ed8eac13472b3dea14eb6c17f8e4fc9d75cf4b038bc244ec1c14b5ce6c14045101fc60a658a1519e34ed197fa890265ab19648d58f44e4fb21fcd3b6a517340d489c8218e4acb8fe0bd6081400b28ceff37e4d5697bb4262a84587fa26358dc5e5446584552ac44c47593af1ac714fee0cd1eb45a54c67557b6c24150dcd5c806052ac474fa74810c88b7a710ef2cd4789b321de8425571c652a56a466d06fa668aba9c804e0102680800226080336e900916530202a59d443fd32b99bee4b4206015fa58e870619fca10bb8a11ef08ca5c080bad6a915b42047bd207964871a200d55ec880f0a8d26657619e5b87a43c182120ea1bb166f12d1744a90409be70895a6c80f782e211c0200634d051782248802e16f1125e8693a942d71c560d402606c12c360601b04a0dc0489214cce8a3bd012d70ff45c99d3efde722cc28414b66f5c6df1ad1b0599f7eeb3e17bc035060203c6d3a7f7f5bf724f72ac0c9f6e17c433d12281804b81bcdb94499c8c91634d93e05c3da3597e40009a784cab23f18494fa0b5ac5a54e6c78181300205494334fe49ec5641d591cbaacc5888a4e030a42390d1168b626dfaaffacd0b09fcc85a2fd9000389f9f01eb566014e6ab562a8413bbc753f659d5b704cdf757b2fa374908356852c941cc0002c210451102482e8602cfc9dda3232b2fb752626dcee566dd810ae3bccc9839e830dece08e996af98819595799bb7620adbfe5a14c08998ae4d7a22a06c97dfd6e12bc2d8687f719fc070606a952f2477c0342a4ac4312bf48ab441bf24aa9fbd56237248092b843e9a0c19c7efa2e54aff9431ec585e78ebbfafca7b4a96ccf694ff7d8fd375114ff8f800e51bc0571954c53600364475f23af3d3353d6bb0be6d05326376ae07ac0616870fd20c87e3c7457104301e9f66c9af541ef9aedbc31487d9a223c611fa6f0d1ca355a632db238a02e856cbf512439f39abb75570e11ad)) <<< 16000) + 0x259a9fdb8a057eb87f1618a102257b8f88bab24033a2f5193f1840149db3c946de7104001681e34747e5a4304877835583c70c6914dd50e12676c76d2818ca028bc10256a03c2440189696ec4e003e01000014e384237a4a428e18166404a430e297b0b3440426c337531823bc89c9b4a00420100480100008b1000490207e1b0190d82386c0f0360761bb2155478752c4d842b894b0e940050223041e008594181c4e8e6923275961e68b544e8dd64801b309d38280ed19ec9a4a08400100000ff3650e73d40e28902a0d546610045bcaeca0e67a94ed1804cf1b232194207c0200001f870c0e1e9b6ae8510247730a82cc1285c7398600820bff622e523410270bd39f05023edc4fc9a840487caafa300400b6d0febe600000aefa0129490027014692492cc97655b9448000008ba600208688d569961a081025e71a3929068269b21f4303d9001ee5e6df3cf820078b5d2f0ad10200e0e6a5d93100013b9ebde434859612005c070000237206a0a0340100023590460982280f456862a3012031ba15dc62c28794b90b08c2080021a48731fc6234562d2a81c48a547afe3480d21615548613612f80a340ff60d7fe33040f804000049ce9be064739063490618087dd16482b9035ce0d15177b64ac658a13d5d682838101f3ca94c1a09a79bc269050415c819bb00000117f668492004a018e2833f00e1d506c718342273f7017061ae52931b310d89141613a1bb3eb080c0eb7c23ec4e0b085e22d7755390e047f78a319401c9009cce119283805003905158f1c6acaf4801801e0000928821828108040008d440742700801004410b216e361434481c42c488a7630549a01f45105860089d00cf85420780100001ec6459f3e252880d3a479c03800b7a72a4b03f4e2d0d0402577240c09430780200001f268611e8152ffe621e283d8783557de46142ac13ed00830208251e15ecaf1428302942673ce760a186aebd34e4de030c0e944a65fdf8784361e2e824759000969621c8dd564ffb480188203cb1c8664f6e6de18623ee9130a4721040d8c2256dee71430000004df1203c2328fbc9aa4ba04117b38a1677a928038875b9d147e0800df2eb6bdb54000d0047b8386aa95a6900300400001259e28818914514408e045049002032000200d044010000509043090210080016808004011000ea220821200165420803b9d7557b11cb43f3a8f51c29ee705a95873ea81f30eba89d2b800000000000000000000000000000000000000000000000000644e30572e50c635f610d1b054c218ae556f1fd9db25fd6a2f12feb51742131430c21c12001c0080aac028a9fcfc124c6485b1448d7e3c3429635e5eb48e436d9a612a064614e2952e0317beef43ea8fba163d4b9b33ebf7a312aed409eccf3f9f956d5707526dd3055627a4b1f7a4b2e90d1f86d901d815112ca0700be2dc2e8c068a204337d121219c73a41f8e188e2fd37920c9ffed7cca0040010e2fd040104487c766d30920ca401790680448b34150007801000018e78a863a5644410897f80b121b438ae361c3a3548c4238086d4f5ba5001f0087161d8e69885100839b19090dc34b9694d00469412124002000800006810001e220007b640fc3607c1b03d0d81e04c0ec27452f96b3861445b66c66c282c97c75b71024a662de92404200085102a01f9da6883efcb114606380b9afa505957fce502048ec3f03c6010e3976724c084001000012b365c925756ff8716382543946d70081810e3771e4412081e51911efd86081300bf5fa598000619d910d81600b414e076c01200000001d4c00644041601000007ac81d04c0e4260701380000802380bf830c534002cb2b18800700200000e260838ad6be891daf49e7f20629663fa8a0268d0fbd24041e008000065901501f837497f4980a2d641812081a00450233cbea00c122b430384095a276dcf027a55d1050009597b209420740200001e440005f4e93067795d9a0b0457756102906b667120084b9c88000817a6e832820f004005407c5911557919c3004e075d9c14858aa0b9c08643c38032021000438a64891c8c70a1d69902ce0b256c699061031edf2a381815b84fe500076f47c83006ae70bab3820f804000054080011f10370d0001bc1d34d24d0ce08d083081041000032000200daa941fc50d3a7f6a000000007940efee1009c50c31a21219c10a084092060000401a00021e40d807c770f49c87d154cb208c7140b54a2668a5001ffb9c18fc188b5aa877d772420600962d6d993436d601c101ce047b4cac3b57fa1040025198e91f3960c0060803850f5616abf67410d3a7f6c1c011823155283f8a1a74fed400000000f281dfdc2013cb38a1c73c53c3282181280c0000803400043ccebaabd88e5a1f9d47a8e14f7382d4ac39f540f9875d44e95c00000000000000000000000000000000000000000000000000322aa507f1434e9fda800000001e503bfb840469a6927046847006804805c100401a00053c400198c81a8680d0040010e64003d88819828004fbc8190280077d881892c0c067430000005420cae0fdd30f77040407f583893c060991541425470012201940a6ddb3fc6843c00a00deff22f0bccf3145f7b4e50c016d90983701a66a340703a4001442cf085d93e7e73e3df4280455009761105449238e440e2e100d8d3108ccebd8f2019577a3e5080e138d40ac58b61c802f0d011828000edc8021dd902e2501680a8c4b4ccaba31d081ee8c4b4cca4c408e9eb0245cd9f41eb3b02d55283f8a1a74fed400000000f281dfdc2)) <<< 16000) + 0x06318b7285fc9b917cc6316e512fae95a39089070c308500400300054504493ec6fb38fead17edc2ab2baf3a0e5268599751e1e9e8779ac42de0062711eeb1bb1927d00acd7da15b96d61d8cd229ee74d3068c3804c5e0f84532a81f86edc20e5e93f208067b4f02a4a0049937a48801b0a95e7449030800216296b83c96091440e802b848440e568e52c00567802592048814652894108402005803c18f9ec855a50d4fd50a982831cdbbf188c08e66b7f809010840218275f68d912447461afb43879b352f5430a846ea1d1c037ba812c200a539044418068ae56509c107c0200002a040009088001bb1e1097068648e085008c5d14013e136770205e210eeea48104001080e9236bdb6fc2e878ede7bf768f881f77b2af5cb898764974550fdb12444d7a0817ae3f7888efd67ad336240fd4762da04edc51d5ab69174c00000000000000003f5cd9f41eb3b02d0a1480c808900602ae6a4984b87dd5d5033bedf7758e69c4611f891e71d8341c61984a97f7117de41a46610a55d86fd6064a493f2fa7d9f1591d5c11f8baf09ad904f0d750303f71d23cff903542a0a4a855b17fe72b16080807e58a8030932d288e09821000200002988002cc90190d00034e902011c8971d7c2ca2045ad90a068815692a25748047a383a261024038fee025042100801580e84221c689aaf3d4491322a5ab84b2a11201052abacb52da985040d2007607719a081269ceefb64aa24b00158e4dcf98afc1801f80122eeb53e44003b90383ed438c1f42404041b02a0000920c0a1941fab3080ec011680096085386dea70c10556c6afc300161bbb91030055a98c82093061180400005048150280a414000a0440a07602433027118130880444604a23e1d28b7d37009d66cbe633eec8137681f4f1bea90cab34b0a15f1a5ea3859400000000009955283f8a1a74fed400000000f281dfdc206318b7285fc9b917cc6316e512fae95a39089071050410460010c6616971ba7bbb4f5c154c1d8dd9d90484e42ad362d4c7aed3972d55a68953b6225dfff40b02b9cb262abbeaa98f8dbe9d14f5085ae9e2db08d6d2574aafbc7ad9a015006754acf7b88c89406b683ffcb55e22139c82ee47b12f5d78060e9947f7daa11796c4c2f8bcbd0a48502b4625a6655d18e840f74625a6652620474f58121c3a516fa6e013acd97cc67dd9026ed03eaa941fc50d3a7f6a000000007940efee1018e10c10a08209400400258d015a8dbb96fbceb5d87c9ca8d409d9f0d65fe71e7afcab5c6a10e15296b25e68cad6bf7c864428cb5ce96f389d54e9e8c9b41decc51ba60d0003c920485200f050004fe90231558c0557485588254574eb5c2062298cdb912003bc6160e40065a26ae212821100428935c46d36187463226c8484490e794e50223ea70f210204b27a86580d6118b173001000420000200800002220002ca4068260321302209c020040116301828dc3f104e56b35e8038406ac2b688c00018e181a9200339b51fe094208c0200002204050040420200017720402301f0d80f06ec617a7a22c2031c1500bc10224bcb4c10c294b997a620104953bc1240aee9a8632007ace95c40804d5b3e7368042000800e80c07007444659340830a94eda75301d4c55aa8b05f56ec910811d0ca634a00e9d9cd698007802003603a20c49ced986108cb43f4960deb77fd59c00034092906012eaa6a032821000400003f8d1032626da2071d8086b0c2799cb9594007cfbda24001d00800d80e07f814b2b3c1506c31c080d87b931e3001d008614da29c701031278e2c4407b2b4ee73c07448e23a4001e008000064100017e20004e4400135c80d08c064460301301709c00004011c7b0244e1e3c10234dc4b280192e7f3c98010002000028c80b02c05407c70ce84845884ba3744f0728c2e80461036010e26e89e96e1024e162922805b052ce840175555e024081d008000064900017d3040496f30d0e3ef8e8deb90106ea7c5d1408189703a9000f89c93280544080010000208675d55ec472d0fcea3d470a7b9c16a561cfaa07cc3aea274ae000000000000000000000000000000000000000000000000001912055fcf0aa1a809051b741522c72c62461861c13002c01800030280200d000286202802013010003461000d9a20244301115d10000054e3029c38030def06e30e4edaae0600a0d9cfc8091e00840090103c28723b1d43001e0c741a5e4e2cc003cfa0daf77593e480026058701d8aee885504175add915f2dab63f2726283c06800802803c1400053c40387401a1a00155b20060e6400d350deb8fde223bf59eb4cd8903f51d8b6813b714756ada45d300000000000000000fc450c60830860450440430020001550c160080378a2dba126231c3f942e62028c18091066ce020866b814b103800520b161d1800dc3881128a00030576d20400088b8567022940c12804208df3577d160818081f5f9512440030576d2081108008fbc31c400000012c002a204c00882209115f5148081805d43e3a45c910003c6d486808104f35bc8f1e47100000001770090000c6f3514e080007b16fa1a7c028e20580280001b420180200030620162b00a0de2f5ec044b4e9ec5221b5a4bf7e35f60fd289430e067dd00000000000000001f08c30c20c10a10c008001e32a91a0f34e0f54dae1b49c97e44c0d8b10fa2ced2d805cf6d9a198e1ac8d41a38d4ab4b7785d902e0e9f41e1cc933555f2db12460e54000c248048a80020e080410801c3400c1a0050900200800c040014e4400844002020000100469f1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 24 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase7" = "QuadFullSixCase7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 24 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase7 private def zz2244:"s08c4"="s08c4":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase8 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l17 l27 l29 l33 l35 l37 l51 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2dfdb4f5, -0x5f23888, -0x8eb5530,0xc8], ![-0x5f23888, -0x2c17367d,0x308ccf4,0x766f0af], ![-0x8eb5530,0x308ccf4, -0x26a67488,0x5f23a18], ![0xc8,0x766f0af,0x5f23a18, -0x2f91ca8]] noncomputable def hinges:Hinges:=[(0x570c1f5,l17),(-0x2f91ca8,l27),(0x2f91ca8,l29),(0x2f91ca8,l33),(-0x2f91ca8,l35),(0x2f91ca8,l37),(0x2f91ca8,l51),(-0x570c1f5,l62)] def normalizationDenominator:ℤ:=0xee6b2800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2f91ca8,l27),(0x2f91ca8,l29),(0x2f91ca8,l33),(-0x2f91ca8,l35),(0x2f91ca8,l37),(0x2f91ca8,l51),(0x570c1f5,l17),(-0x570c1f5,l62)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1284c12016801800000001e009200c000029090009980800000000b0024803000000006c01240180006804100263014000000001c029005420a404200335006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := 0x67800000750c4ed05b82a01c3b000007682a8ea1800a800000000000004b58d033960b1b838630c30a38830220208360001006c8a126f5e9220709e8a38910bfe58c233809c2305c87a65100720adac2805fdf368400679c214000d0040000544c0c00002d7bc4c10fc67dbea01228042b7e6b0b03f6a86cdefc3884c5bbbc0f606db664be5ea8e101efecfc62444381f88a5ec182003b4914a3a3a86514856e020c8cf3329f3f5f313fa5c949d1c030aeb60507a1801683f19d4ee92e9300b1304c59870102c87106106083041048005002030000200d0000f1200079c70d453f05cad0451b1091abad936ec585280e106d7545a5a148ecdee5aa52315182cc702045173e836fc0749a41265e44a097840d00608242c800696e826c0193df25fc4e1ac0c10236d8b4716d756c3659d40e7edf604cb80a03501e598408b2cded7d7b1ede792031494f577a90acc98a385bfcdc5c508821a40001e99a10f7be70efa18413dcf002684104bdbc8420302097b790840a09db5119eda18213dcc41068a066d14b2a58200772d482a7239cf41d910f0880c2602c0000f2900b0500500a068b1921c3f49028a464e8a038709b5fd4250943042f785b28651420ff32ff940100123fe0e1b785001fe6677910368083836686c09154bc17399c20a40d1c7a44363c2811028ba2257633c810a1f4643fc23880000186a002000002fd63a48a000000186a0000000002394d9f41c00a40b102b9b68cdc0b4081d2ae242440000106960afdeb7f3004091b70aa499ddebea435e07041f940ff246b8e63bf950c00000020d2c15fbd6fe600800bd64f8938926158ceb20801713efdf056cc66db247f054a516bb82380278660000b3cc8eff44b413c99c4711e5aa4ed7144810180003147cc8801c3fba8883c5c8261840707891a085684000e0f74c3a9bd00c9223a86e54bf14391810cc1800003cc4001a1ce1b211345d3f6985558c180000363136108e014123613797eb11fad230046c26aabbc4d3f24300000002420ceb5b404000000090833ad6d08abb6bafb001f842002404010020070100012010060dc0ac4d36527b78861630080cf606977eb1506801010073722bcec5dd3e22721c010fdd292189bf69346280763365b1c2c99750e4201d3c2a1d190bdeaa796cef0656ef5ee0bad891a7d89ed7f046adb450ce0e516a06cc0d9baa8adde0087a18311c2e104604b19a658a192c41b08203aa0012008b19199eb630ce97a5c1840b940f10160b0a0080525aadc200bed08a0804eba218201ddd0ea800190080000a4980000802246003a856184004f9d7041829db10100091671f08016513749400700200001d24000498c0a523be02090467980834315463803cfe6814081800400005a10003fd3216ac20129189ff8f45b5eba3ae106172fb0000000000000001ba12a7e3fe90ccde5f755e9a8a9800000000047600118818608c00a00206591c089f0f3de019516d8aaabe865420e378f349f09b9364c2f5931331474c04d3b86a6318ebc461a663beb8aa990510c42ae8001a91000a9f2002b82787ae85450c0b922ae22023d70ea0408569b0a28099d38c86036727a24c0834010e3cfbe7d01c5000032030a0002cb86080d353d0c0aee5ce310100001904c083601000010c200a0281407d53a2881a08a61c149512f8a0d9661aa8003200891dfa165b182685af8c704750fa4141a1544b03018ba8ba0805194e081003c463f9c0068020000256685c3872e1001700851000ebfb1c2118c20860a3a1f170c0559381820173b4379400680200001bc40004f0c0849a2b779c8d33540d8fb9c9d3821908272246437db237dbaa3d0270fe46970c045d2977555a2f79cc457c65a0ff19c5017ba3a25cb5f2ba0eff48a7a75b0042009d551c1b5673591c8e3dfc1cc24c219fb2ff6f6d432d4af85c33a6f5495fa0311c94404f8099b68dd4a08ea2e0822decc94a217adc352cd3a13f010313c60661805d4030c158e7dd46dc1817c399cce4c97fc384d46e9d8fcc508149e8e9eabc43912a669776aa7a3573ec9653edb8e7b53ff7e3aba6fa521ba38fd1c64b6da9470c1deefef35c1fd4869933356e1f058e10e7d849a214c12909a00006de4001c04800536990b56100948c4ffc7a2daf5d1d70830b97d8000000000000000dd44f99cc73d0000b0000001521451431411011000c0080b800080370cac1262c428b12cf8284308000003203060000032028600001246282414908562020000032138010004000055080202800c0400402000358200202000010008339 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 9 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase8" = "QuadFullSixCase8" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 9 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase8 private def zz2245:"s08c5"="s08c5":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase9 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullSixCase9 private def zz2246:"s08c6"="s08c6":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase10 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l17 l21 l25 l27 l29 l33 l35 l36 l37 l4 l5 l51 l55 l57 l58 l61 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2abdbf63e, -0x59682eb50, -0x861c46350,0x1e2e7b14], ![-0x59682eb50,0x17d4905816,0x187a5236c,0x77f56c8e4], ![-0x861c46350,0x187a5236c, -0x245275dc0d,0x5969a220e], ![0x1e2e7b14,0x77f56c8e4,0x5969a220e, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xb96af,l5),(0x2e5abc,l4),(0x35cbe29ca,l17),(0xd329feac,l21),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x76c79f410,l25),(0x2cb417800,l33),(-0x2cb417800,l35),(-0x23c309a42,l36),(0x2cb417800,l37),(0x2cb417800,l51),(-0x40574ba9,l55),(-0x65a143d3,l57),(0x62a4a34,l58),(0x5c2c32c4,l61),(0x26f0b5dc,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x76c79f410,l25),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x35cbe29ca,l17),(0xd329feac,l21),(-0x23c309a42,l36),(-0x65a143d3,l57),(0x5c2c32c4,l61),(-0x40574ba9,l55),(0x26f0b5dc,l62),(0x62a4a34,l58),(0x2e5abc,l4),(-0xb96af,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨70, #[0xa4440f3008000019418c094cc050000000000d00c200c00000002d1503cc02000284410580964010000001ac120058c0400000a43411027400c1480c908800ba90060000000001e009200c000000000b00248030000000000640e20080000000001a0148020000000028180f300800000000160c0cc010000000000030320040000016012004cc040000000001f013200c0000000f82c04cc0300016c3308c0454010000510cc23025500400000a43613025400c000001103c01ecc040000000000050320040000001682402cc0300000b4360900b400c0000000160a014c020000000003e009200c0000001f024030c030000000740900c300c00001e01040098c05000000000487033004000044198280290030000000660c00a300c00000001b06018c0200000cc321100c400c000001504c01ecc04000000003c1c0a30080000000000640c8010000067885027f30171b104847c083750070000000003700b200c0000000000501880200000000000903200400000000012014802000000000018072008000410c41400b100400000870b50317301400000000002c0c80100000000008805200800000000001c0c801000000340b007b3010000000000b802480300000000024009200c00000000016014802], #[![2, -7, 0, 0]]⟩ def dynamicCode : Nat := (((((((0x5129f9cd1484a1c86e2719f12301d655dcf2438deee28d4386069465fe07000026ddc94c004601003501d1576dc714f0f85920000007530050c0560e3c5d7848800fb821467250701b8327d1fe60000000075300500161c7524058643821601000006c4f09c0000079d7543a1f00aac9e9000001c5f730af1f02a32b54a3000000001e2afa86a000000001019229020c19210411600d8200401a00036440d00606603c268f6a8b718d84e33b041436de5b9e2c90506b7847fab0245e1cb27053578cc201f2ba23201c2392c875d0431de52145ee8d00eb6bfb71b78ef23cbc662606100b8fcb58f88e44f3382df3d5fd902400016a8543f7ba46ad7ab048b81d38002d1407fad3bb5f98d1deaafb3ca0e864110595a161c5cdd302390a63081edfbf905638a0ea8fe1bc77604f560145b5742d53a2caf530c9f5e60a1a7284d1c400000042a1261b1ec7eac85f7ccf04018401ad004b66df81ed7fa10787ea62df038000000257aa56f41507410b5b634724030067175f941fca0b09aaeb6302bc4f0f03ff6dce6d5dea3f38ede3763023e0b60000eb0f09c0000079d7543a1f00a8cad528c0000000078abea1a80000000040458e40a2083062865846803708010068000b01a291c65d1f6104000266d5a1c4003b1b302187209abe710090308c0200001c66c9c2875cdaaf5118bcd1153cfce09230812e5e0c6a88252035b08afe95e092052cf5fd00b298305e285431fe008914567d08327aea0611ab0744b130b7224000293edea84111fdea295d3e75500c076f36dbb40e83d33ab6fd9d3bbb100148272ee27a8e1208aead097ccbf3c3aa66ed81d89b2234c08e0288c2118aa197228a4ed20c1a283000002580c18283dc5d4e00000012c06016a4b2ebd2604210080000989e13800000f3aea8743e015195aa51800000000f157d435000000000808b1c814b1041050c908d006e100200d000160345789a268f8410051d42120e2001992c0818679dfdc8c8140c2200400006f100078a200237e407c0786643eb14763a2c90a8e0c9567428400d2fd30578904001a3f61de0a086fd1e430400c1000154f77a8600c94974d5034b0001d84a102e100008c37305ec9048015812309b2f86b592c90111e40830805b40c4f3037860a84d2c33d56bd63241006ad29a04017ac0d189c00800200002aa00100c807840274a4890c0ea1f246325860399e5a82c21a996923980df21297dc200000054bd3001080430cfc31fcb3d181878674f108b08078b8dc2260209688fbb53800000004b0180025c903b84b000000012c13801280400005e08001611a181770051d34c71000000186a00a06b69e7ce491c90400000927c00400025ac6cbd007e8284160160000518c0e29a5b60e20689906381c04dab11820d00400c41765d7503560c0007aafd644083a010802008020000088800059100017734205f5de3630366ce4de850496364a6080004ee91a0c0cbc871381000487d0d8166101f008000095102b05015028002b9cc900000012c048c00bc078923860d2abe230082726067b703817d000084418009bc2d13000076e405d7ca2ce2848010a4a8ae81e41ef96b8823593d20000038bee615e3e0578cd280000058e540477a41532ca2450c32402000c0b00008036000020080000223c30d1b396a30385644444504326a384060668b047964041f0080000671030090158280a8140005be40bc6405c3200049f39782cae2f152191251ced9d039a2902103db652baf002cd02d25c9ba6be83fc80a68a9c2d495c083c87c5f08584d06474a00000000000000000004728b4eebd2ba182881a3fe6e428d343e8aa7b6ca6980cc988699400000000000000000114288e1a0536562052ec6ec1550c31c21820000c4a97d8cd5d1da27ab792271a6d8f3861e2dc0bf88535ef9bdba1f32ecb314590e2a1130f97070cee471e51f21f1be8eca48811fa252f59a38c09e12130f3c5663921745b7b716649707cb7d35753c4c2f5960e6e514092a3f5bbdca9f23e45c1d096256fa000d70783072a1e16e006fc43380956c5d53e8aa67db1ce93224296cca0000000000000000004628b4eebd2ba182881a3fe6e428d343e8aa7b6ca6980cc9886994000000000000000001148208604504600500400154db108c87e533336b64815c163c91d6d3c2bd6913479a4e1b14ba5075b754fecc6e83d) <<< 16000) + 0x293c78e630735435427641c85611c37cd86d83cfacd89c757261893f4e1a002020004ae205a02e210c9da89aa560c5ee8c2030000c0418413347bf383868d2dcaa57ce1bacffa060c3acea10ebb6a0f24a90c07f169e8f09be4a459bf1000db97f64de681737c5400007cb352f7b45fc2285849da94884c2896138814ea0b172ab9e6475ed785fd3b29aa7d938488000273c390fc4f7553a6c7195c688a8cc2049c5e4364c606589b88527d294d81c79e60e200cc3562f6a21bc743e703034ee44bc12010001a0febfb806879fcb104989828230f3c0053046439cb04409fc8025876b761aefed8831739a66f617b56d47675284428c230c0d0435bda20584510f55e1220000b99070811e7028ee1838803c5cf62818102c08ea1f84001c4b321dc6708250080000bd902b05015028001678c11b7e255fd2060e600655d92c60a7ea147e8945080970f1026080405ed6da7701040a8cbdd04020005eb031b50000617ed586384429030500280001cf3832f7929ec8030cb89844250142b32abea0cc6040005cc8381414ae6f46d74404047679ab0180210a94766050101bc60a5851090304c01802c010000e91c20995679d431059c451706ee848a4aab93be2081a1cd4a053ef0b05cef8781e0c2feb6df68c184d01e42469d6be8f3115b9cb544aaba40a30144e9475a578aae492dd45ea7d193a5ce4b0088b5e09370d3f65b246f8afc893f12d6e4accc1d575aac18639225eaa6013505228691630061a129891ad1c512a830d17ade7f0200249dbc5e04008ac76c34941084021004010040000111a2d2899922c10209607cc60400da773b56b1841100400002b88158280a814000468689eb245e54421181b0080000299e0038806a6bc91f39a5fe079a4123f3bb3eb0964c8e1e70560fabeea42902ab5f79798cfd1b581a8ea3651560d2e222f700d4d7171cc952653901ab491ab26475ca632acdfdb543a68d32ded28e9edd67b8301861270a85b013414febbb3213df9985cd2593e5b34d48d46df63ef44d2529e6ac523da35179dd4176a92cedf05e1ece97251bda08a62bd851d0ff4e2bbd56d154f423343219ce54c50fd0df8f806ba430a070e08741b67fb1c3ff2667cc2045ad4a84449c71ef2b75a88679dd62ad23138768c76cfe304c0eaa95b049ab67cc01590d59a447a23cf3811a6245655ec1a1be41b9329d34801d6fec137ed7067676114aa020d440129d6d9a7c4dd71934f168fcd2c150dc9b6ed13401b46cc5ea2f536aab35d74020c590b1a1a9013411611cb74f922ecb3fbde8f3fae546394830f75b572115159770f2c05706b30df3f7210f036548e59b23b4859b64ff642bfa60a57199aa5743e7d151c16ff41ebca2abbbd863ad56d47ebe3b4cade9b8080ffed40a22968d5e5aafcf27d5e3e27753f17ee74c45b0e0bb1f874a1b4061794c6a0a61005202000ccc200262e40a09604e4b0260d800fd290251581206805c07a6a1398d4e2d40e21f06c1589d1a641b7c6878f44e8d320dbe343c86422d9169c01030c32116c8b4e008185100880850840840460050040051fa23d4fe692832898ebac6c61a1b324ee8e51446c7bc2611c15f92001ed2140447b81d8d97049457b07e1f75b1e3c1c8304afb031fe7ad581e90e6ad3355c6623c68b32a894aea1c70a87e7abb708155e020209dd6f0efc36983f0aa0b20be1bc68b379e41f639af033ea7741fb3a8d102d2b0e9032262de086aa330ba7ae71af437d6fdafdfed418b7ef046212c0815a90f31b3a2d228247d727b7ad1bf0973a33c3c22f94a1a8db68602fc21429142b11c850032e142cb35b1025b8b7ddb9bb8f0421043ca9cd91ac82004a08b79d85329060bf76f99e929b37286b908f00326f77b81646d57cb15e4b0db944a4731d9f2eb7675fd0b309f7c9b7429e087c7ea414e8328011828088140420a0006d13c40099c99b835870801f29e03c55102027d46fe21b870401f29e03c551412b35e0be50a87000298d16089c18062485db4eb505022496a5e4fc4144258759d33dae35a2080b80c00400200024d203e4a01e0d80e82807005341c530aeb54368034e7153e4841280000000000000000149515d03c83df2d71046440838230228220010022054bd1d3cf08bbd4bbfc35da7e19ec1c5bf370fda2b67722bfd33a8f61a4e345004f1670d5663e4c495244d81407525f9c8c04082a69bf0639a10233691e4f3828e0a4502f5a223c6071bec413188638038e29d1bb605103af24de58c464387bee7888d21870b40a00240201b01000108901a2980c94c060374108ccf265b4a16801f13140e3ef632010541df448071e0b86b84af557d4d9b3d9c820e2032fcbf98802ecb03b825ab74f9bb6b313ee269a252b61f210c01e176bd90cc94c021717e51421f3e7f2e1546d08001b1abc1f16c024faf0f1b12162ce3c1bfff7e0a20aa64353eb70a0049c6916ca35f29a0282560188c7f084144480f7a2a7f136c3e6b6c16c7ec5555da9c0fd4101142750d3d5b8332e252c971d450c14f3500a08260d235e1c3046f0bb0688e003f8a25da3017288e5220600e143d11c0a20131411004288bee26bb47479373d800ad4d896aef4f8104f3896b8bad41866f2c29b22daac5924b2e01820ffc87e9bd8efebab1060a5a66c2dfc72602c0bc3a763fa63e95e7b27538cef621a5681010a877e17734b389e09ad51cbfb759e3b3a3bd8a423667a68360ce533e478e621f312640539ff62e9c4324f0d4dbed6a7d7cb8bebdaf9f156342b58bb0f28b44067326fcf4f7223e2858cb3b56809b99)) <<< 16000) + 0x2837bd331c3b972b2cf6801ce98baa5d46fb53a1559df8831d183e871fec48f1c0304003b8b070c214b889fb82918a10804005c04008020000db363a756da2312392ec9ff5920807d135f8a08c67f46b0006c48ecc702884a404001000010d386a743986b87148201da6a04108af1fe3080010d7c22f0009b7f0e1801494508802002c020150100a00804c060002c8400252080055618454d697c1f1153b04f0d19c9b0573b7e7f8d9ca3ba476f3b7f3000000000000000000233cdbbdf6ef21cc6d4793b4375b66ad71b1328c2c10a84bc8000000000000000008041044003803000a21f9e6f32f89124d302d7aa73447eed3706dd83bc56b941c6cf567489a0b8d5be813340ef0205572f3b8461f66c8ec23f35db6e1e580748d5430309ae167b4d458099c033ea82390891ac9a06091a7b82b7bcdecd6033e8a2debf422ce6e436e50ab5445b4d613c4d64718ee5897874b98c92bd0383a173c4c34026ebc87ed1bb30bcfc1f3b319a73630354291b3f280900804404000e164005bcc800e1b1ca8d2c96eb8e4e6d64be80ab01b12dad8d016d921c6ea384c2561bd23a0a98e18e08a088006002002ffff4dd4a1f7ff35dc4d3e03b1181325ee64c2414603b7810e43c2769585e3230e448db7036caed1248ea7fca306d3689a98adb63f0a5e667a00b5ff00000000000000000000000000000000000000000000000000063dfc9c8eafe42bd44b4d1a1a862c8feb4e3c78c8c380000000000000000000000000000000000000000014c8918914614810808608300016e300200da266534a5f34b200c0219064b1cf72573410a18b1e1ebd848100000012c0a0679188d27080003152483c2708240086195912a6ada4c205cae0b5de164120336e7940c30000002a365847625caed7820400000038418028994336e30c0006b1b52f000038f7a9d2974801380600400784bc7b78847c8c1c10176e469c208000000da173038e65b412c4861000000122a030449d5ca286c48024af65a0621c01a9b7a8e3c800755aff7086fe90029018692e0cb0c0c4a184a0621702f3468e006ef010e118381f50fc6b76208000000da17181cb9d79cb0da18400000048a8060806579c1b6c2809c786516937c9002a01c00010610004292000c8c403c0763966c4d928284bae057ad8202000051474b023df69748940614687bed094208c021430662cc2f52c4190ae3ef4509302a44e4c40428d7273f840804ccdae21002b41421581000220654602708230080000b7100e05000157100d090005649000e5620180b00b0500500ba07345274349ce50032f0560032f0581fffdf5a15e27a53c5d3095d9d1ce5fe3b7a6725b00ba000000000000000000000000000000000000000000015a1040332031c30c21801400c00510b236b20e7e13b82f171515b68f472e8f37dd3cc5f773b28f9be9ddd14d839d10b9c2452ab7ff31a42de68306a2378914898d77c80bc385927f492620ac7298a410eab1d9e6ac8d69684e37bf8c1be779f545032091062be2e722a36540fcc2b1a0c602bb1fb268246546964b75c72736b25f4054288e1a0536562052ec6ec156c90e3751c2612b0de91d0554b1880860830814c389276e0ecb94ab9c1d2fa787e1cf938c750f77572ad2ffb23cee32e1fe4110397cf8623768d77bd19a6e49e200195fb1d5f33119d7991984217a3a986af8b867b836107468fcb63127a1776640c318062ef0e10353149ee305374c1e76861031d53eec0a4a2844010005010020080004ecd0c281ff475285998698c2100afc2c1a7460575babab828349c72a5f1c00eeef57482884c404201000013f34109c086dce4a38023e7d4151273ab6fd6d2a9d34cbbf3b6a909755ec224dbb7c50205821c95881145733b612d181b8aabd53b14c8501dd172af4c68895b8dca28f120300d15278b8d6baf2c73c552b563ca09ea8b896deff839a1be73fac40f937c9bcbd525767035cfc12eeede815a4c094bfa234d8a6bf0d79192f3356dc14563be5c1f953d42ad35ee4b3804eb3bd02a939f2a81268c38102c94362fef32751a3110138c6121c9db0346084e6680da50535eb43784848274c262a4818400100060100007619043647c30c604cc42cbf4204a951c0646027b4f9c31490308002000a02004010000809009190040cb0d5e568119e595f1ae4e559e746e460b3cdd30da30a3563da1a4114910cdb6aec8286ad6d7d84465fecda1aba4977607544300aaa30fa4e35eabd3eb64808a1264eb19da2e24080c305b16f47e98422262a17e23e67fc385cf296b5525476a100fb2c1e0528156bd9d1658d3fb0dcaab268c5cb6ad859b9d8772f17bc8229c5c7d078d7007b71f1f83865a3eb3d4ba6ec8f5366887f510ed3894243bcf38c575bbc0d39144338d22697476d640aa2ed197df6a064799c76380f90e153c16d321b94c22198559c6197ca59f7cc6142ee663e26612092df95342918812004001c1400c020000e330049345688180a7b1f1b20a44283e010005010020080002ac8003fd9000f952002e404006ea0ffefad0af13d29e2e984aece8e72ff1dbd3392d805d00000000000000000000000000000000000000000000ac23022823002802000a20d1f7292fe9edac38f579c232921dfa97428c19cc9ba5207498be3393db4b64bebae4c1135f3f9ad5e3f51d84dd845b273297630cd1427d84b0782f73c2f0de1dd0e2c815c924a23e70588d22736f0ae2c6be08290c7b02c46d1bee5f504d0b797c4eba7f214a344b0a006020020100029210010100000800c8f8802dd91)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase10" = "QuadFullSixCase10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase10 private def zz2247:"s08c7"="s08c7":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l16 l22 l25 l27 l28 l29 l31 l33 l35 l36 l37 l4 l41 l42 l43 l44 l46 l5 l51 l55 l56 l57 l58 l61 l63) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2bc920528, -0x572d59370, -0x82c405f80,0xcd8900], ![-0x572d59370, -0x697b666a3,0x3a537c3b0,0x899fd7aac], ![-0x82c405f80,0x3a537c3b0, -0x236a8f20dd,0x572ecca2e], ![0xcd8900,0x899fd7aac,0x572ecca2e, -0x2b96acc10]] noncomputable def hinges:Hinges:=[(-0xb96af,l5),(0x2e5abc,l4),(0xf61df6b0,l14),(0xce2479d5,l16),(0x141fb28ea,l15),(0xc2ab8803,l22),(-0x2b96acc10,l27),(-0x1a57d0c76,l28),(0x2b96acc10,l29),(-0x285657878,l25),(0x4a7b3886,l31),(0x2b96acc10,l33),(-0x2b96acc10,l35),(-0x23c309a42,l36),(0x2b96acc10,l37),(0xc6566ee6,l43),(-0x268d8aee9,l42),(0x80329d88,l41),(-0xb868f5c8,l46),(0x8f2ea674,l44),(0x2b96acc10,l51),(-0x40574ba9,l55),(-0x3b7aef39,l57),(0x669775e3,l56),(0xb18621a,l58),(0x5c2c32c4,l61),(0xd189d51,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2b96acc10,l27),(0x2b96acc10,l29),(0x2b96acc10,l33),(-0x2b96acc10,l35),(0x2b96acc10,l37),(0x2b96acc10,l51),(-0x1a57d0c76,l28),(-0x285657878,l25),(-0x268d8aee9,l42),(-0x23c309a42,l36),(0xf61df6b0,l14),(0xc6566ee6,l43),(-0xb868f5c8,l46),(0x5c2c32c4,l61),(0x4a7b3886,l31),(0xce2479d5,l16),(0xc2ab8803,l22),(-0x40574ba9,l55),(-0x3b7aef39,l57),(0x141fb28ea,l15),(0x669775e3,l56),(0x8f2ea674,l44),(0x80329d88,l41),(0xd189d51,l63),(0xb18621a,l58),(0x2e5abc,l4),(-0xb96af,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨70, #[0x940e20080000000c844050c0300000003613014300c0000000e8440d0c0300000005221014300c000510b41c01750040000004709c04c3010000440d41d0321004002542102200c94014000460841100e500400013c2104403940100000013090503d002000110390640c84010000480cc1301110040000000024140f30080000000d82c090c0300010c22048069401000000000a0603cc02000000003c1c0a30080000000000640c8010000006515402830138f18502f40238d0070030c5208200d540141c519214c0079d006070466c548046740180000000001101880200000000004c062008000000000110388020000000000140620080000000000e0148020000000000580520080004c0841702910040000f02105003c4010000000000090188020000000220a00c300c000740d02101e1004002844084600d24014000000000f402c80300000000007807200800c314409003550050630534314022440181981510c10109100600000003213016300c00002e0d02c0f900300000000382c07300800000000160c0cc010000000000050320040000000c8440d0c0300000b8340b00e400c0005c0c81901d90040000000003850330040000000c8440d8c030000003109c06c3010000000000a0c0cc0100000002209014300c0000000982c050c0300000002209034300c0000000a8240d0c030001702807005d40100000000009802480300000000442c0630080000000000240c8010000000001c009200c00000000012014802,0x7c1c053008000000001a0c0cc0100000000746c0a30080000000000340c801002b832857034e401400000001d1a02cc020000007119408630100000001e8dc098c0300000007233022300c000000c42d0238c04000000000687033004000711a45c02a9004000000b10440393010000be1584901690040002d05612405a4010000002043201fcc040000124461901d400c00002021880444c050030c3102400f540140000000015402c8030000000000a807200800000000a0501cc020000000008830330040000001584809cc03000208661240bb401000e614e1c005d90050000000b213026300c0000000110901cc020051c6204d023d401400000000024030803000000a124406c30100000000002e01c80200000000642409300800000920d40428c050000000220c015300c0000009c1d0128c040000020833018a301400000088180254c040000025833018a301400000ce11c0348c05000000210640ca3010000a12644601fd0040002a496110025401000000204410124c040000000044140b30080000002882c098c0300000000342407300800c60d410403d5005003183884801d540140000002686804cc030000000094340730080000002606402cc030000000000070320040000000002601480200000004219036300c000001043701b0c04000000b128406c30100000000190d02cc020001c4610d808c40100000000000501c80200000007a35016300c00000001d1901cc0200020c5604404c40100000000170602cc02,0x3f00b200c0000000000440c80100000000000f0320040000001609c04cc030000000058480730080000001509402cc03000000005844053008000001a44100c8c04000000006c480530080000000001b01480200000005821013300c000000000b002480300000000036009200c0000001b024030c030000000640900c300c0000001a044038c03000000006424073008000001a8210058c0400000000682406300801422060b40ced005000000b83c180b4008000000002e2c0cc0100000000088703300424520518f0216d00600484808c3019b401401242083300aed0050000044827022d301400000110160274c040001c46808c053401000000000007c0c80100604b0923019b401400000000361c0cc010000184a60901e400c000003041100e4c0400584a0903019b4014000000000150188020000000ca13014300c0000003084c050c030000000b20b026300c000b12581900b10040000000038240730080000000026140cc010000000000280d20080000000290a038c020000000000a40e20080000000002a0148020001c8560e40bb401000c610e14005d900500000084442406400800000001e0f034c0200000000009406200800000000027018802000000007438093008000010c11c082cc050000104761c022400c00000002512038c020000004209809b301000c508a0a404c1005000000008c180e300800000020828070c0300000008a0a01c300c00000000021038802000000000088052008000000c4170120c04,0x1949642023400c0000000017404c80300504840e101734014000000002a1c0cc01090c73460c02e340180000002684c050c03000000004c180d3008000002441101a4c040000000000380720080000000003101c8020000000006400b200c00000000000c0c8010000000005c00b200c0000000003102c80200000005221016300c0000000011402c8030000007c644405400800000001f11014c02000000b49c6c074008000002441100e4c040000000000a40720080000020c2400a4c0400000009213014300c0000002082c098c030000000000b407200800e118e1200661005000000000088072008000039150500690030000000074280e30080000000001d038802000000000078052008010114218c05d90050000006c48180640080000000001a0148020000000000640620080000019120601900200000000006c062008000000000190388020000006854440a40080000371488404d0030000006454440b40080000000110a024c0200000002428303400400000120b050350020000004c2c140940080000291086c09d003004846088301764014009009809406b10050001243208806540100000220c8440750030001102c0540dc40100000270c8440750030001043308c0954010000480e429032900400012c3308c04540100000210d84c0950030000e42304c04d40100000001206404cc0300000000024009200c00000138110058c040000094260900b400c000000000780248030000000074640a300800f208a0b40631005,0x820bc055cc05000002282600973014000002842100e4c04000000a40900393010000014a21005ccc050000000001500c200c000008608403dcc05000002602400b730140000000c848094c0300000000001b032004000000000240b080300000000fcc40930080000000000502480200000007419025300c01622860b409d5005], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0x1a49370704911840000001901a2c3707dbfa1a20249ff5db1820004483001a19c69e92741818006fb2a99410000002581400000b96af00005c8ffd482120043492f774674e6803080000003d0900345a4a2f852e7e93440594e0eb4749304000a75315400343455f73001dac30300110bd5b9400800000005b8d802710804300380001079c20f3068775402c70000004e200c1304589f1d1e302545b4d0bd00b0806dfdccbbd2810000003a98040027691da4ae0001c4a4f46528722020a80800003b644381621a0b10c0588580ec74bf209c22801a300000030d400a1800000186a00587faab6f7f8b50c300af270c454160b5de5103e5643000851b9031180001fa7b6fbf1a1403e840e16816000080088508c42437e598e5d2c2e6458e06679c6da40e3ce827bdeb7060a0333ce7c5a182000000342607849e353286b99e087f2ce1cad470209e2e0160e180000101d8b5c000202e0d3d6520854040d428ca7cb226900000000000003b727ea125db256a14653e5913503613cb1c73053c22c23c138118030080200d0001683a85194f9644d2000000000000076e4fd424bb64ad428ca7cb226a06c281471450c30c4082047021803808010068000b510bd01c0c3d78415e520421f81f3a38c204532f566e411e59ebf8a63450000009601a18493febb60f083d190d78a7822506ba5b03400002e5abc0000b91ff28904250106a14653e5913480000000000001db93f5092ed92b50a329f2c89a81b0a062041841041a19e11e08e01804010068000b41d428ca7cb226900000000000003b727ea125db256a14653e5913503613cb3c72c71) <<< 16000) + 0xc73040c23811001c040080340005a8e1b93a3c9616181c902942c11a2d970840366ae80e4c00f0ec1919200c471edd0660c1f008000094100064f2004138c109f789b42b585000000000000000013921cad614b438ce230427de26d0ad6122109841821020821211408000b902d3ad64178cb6ef569e57bb0b673919d928577251c743df7a881c00d9b91bf8daf0679ce718a020e80015c91080988380e30427de26d0ad61400000000000000004e4872b5852d0e3388c109f789b42b584884258e68c386186402580180000288060900401a000352400425cd94000002a30164038ad8d09e40e30d6c4ae2922883aa09d784837a4fc3fac8a091c1fe47640839aa02dc5616026e739f8982a801edd2e52e43282c260140000f810952588312c12c670438fa35ba2012d8554311ed030064c904709355a0e87e2d00ca04830d39a89645fd351900815177c74e74ad8116e0d0f0400279bf00cf6e33a97e30f000000623eeb975b533ade0d0000024045c976bf3129898000121604956d9bd2c7a6c4a1fb7b6404704540c04108d814bff4525d9103003e9106c65b8eb2080000737d094ac0100c63845b06376d3f3c30000002faf080010080d14effe02b6693c10006209efb760007000000002faf08003d0901008740a80002673043d44828d220606e06d491403bec7d1e3c18000002120810000064ca64a00460108216ecb8282f040c016dfbfa5c20190151cdae610080dee00dd2a9000000005dc03c00000002ee051800a40500002c640440400054078e8263a6538fc73d8e2804e8a89f72405340100000047868c000e046085926d11d7073c000000023c346000d000021bfbb3ff1000000369030caf4fea87d0900e10740a81050100011b91040583102e219a98d216910b1c21493c88223216edb10100e93c1a1c00042795d040021fde7884c08420108863b3788a2442cc395609a209030f04944040077cf88080006644062504210080000829e1c2b9daa448c15fdac34030f77531881c97007d4c047b18b982000a3588b04075b06ae13820e804204730ff9330109095b306098a06b64204a702e7810192846eb25041d008000077900024c384d61b351200cdaf0009c0e6c805991820e004040c04022020000c5220423d0ce145be93c2a3036594308096ab3f0c0686d5cfc901078021e1698010652045de688018357d2f290406c4179792020e804000031c87a02a0000200810101e940a8003c881c7b84f64810700100000e44044040001b24400240005964002250e100de7336142815c35a838b704af0c100daddbc0660090a539f02015af86ce4c083c010a171e8222914519a849a8a0c0524d0a201c3d7127c90107802000019643dc261fe0a0fe050738283cc040004dc750a329f2c89a40000000000000edc9fa84976c95a85194f9644d40d918213ef136856b0a00000000000000002724395ac2968719c46084fbc4da15ac244223491432421013c034030002e180200da491e1a799bf53483f144761adb48d6f2af04800987cb41e99f106edee3d80d12a7362810a4fddee40fdcea7da818ceae3f532d3d4452e271d3aeb1522f9000000000000000000880e0a773e53e05a30427de26d0ad61400000000000000004e4872b5852d0e3388c109f789b42b584884a70650658208075dc5e1999c410e8bef3c6944a9f67e18aee244f0275cadbbdf6fc73a7cc0e9169a456b03753ee1f77b06541d4b604a9e56df190f8213309a6dda168e7f202cd11035644319c28fc09bbffa959207e15366fe5e7b726437e5bf4b2b31b31425026256ebc1fec47a04c110754a83fbf064d193d361a7aa981c3716f2499cf4f3226cb7bac382daa4114c7ab1971fe9b8022150cf710330a0c2493e089740ee1ad6c6118c041f603af5d16a7a87d36b78c7b39819387ad90579c3910bda2324cf4c72f03cbe107280b8fc186ee4a5b3dd632c696656abcf0be15c57e5e56a68fe70630a4e41014368a6b66623696f665dbcd4ec921b07f272f541cee58e047fb15524aff524a49bdc4eb28b896b1c8adeb2107cbbb268c6135e730cf422379de3a3926994589fbc56e63cbcf28f3603712cd48cff721f0792e87dd9d884062a5630683cf9ff82ff891b1a567ffea2bf80428ba3012c851328fb2c9b9ed46131ab700007e92001db67086388569860326d6f3644021c89e07c38068980512320410004039c041e6020000fe21fa220fc11025848004b0087604e30427de26d0ad61400000000000000004e4872b5852d0e3388c109f789b42b5848842610386404104302202700580180801006cc3e5a0f4cf88376f71ec0689539b1408527eef7207ee753ed40c67571fa9969ea2297138e9d758a917c800000000000000000443023d3ae1eb02c1c14ee7ca7c0b48ac56010ac7dc9f8bbb6b22c1a34e4329089470cc08808602fe131d9e62551b5644f9d1a5426934941f6d9531524f17cb861f7dc2a50e80dedb703663cabfcf78fea8fbf3db08c685671021ad18fda1d52a2e86b15e5bf9c10ea53e0e156c827c8f477b785024f922a000aac750a329f2c89a40000000000000edc9fa84976c95a85194f9644d40d918213ef136856b0a00000000000000002724395ac2968719c46084fbc4da15ac244222c43021820412c01c0cf9cacfee0f32514881375f37887ed9f63323e41e2980f9b600e1689a23f99a11186d190af0c89408b4e0f12d304546ce929a405304e36b7f597b9cdb56b29ac1a1076d00045a2004220fb1107d0883a4241f2030f8010005ff90e805c6084f)) <<< 16000) + 0xbc4da15ac2800000000000000009c90e56b0a5a1c67118213ef136856b091084d34d24f1040c508f00d00c0030100200dd246853da587896e61dbeb103220d765c0a144aea0308d052ca218f41001d100915098208402000026643dc35215ae7ca640b000000000131e7cbccae2ac90fe263cf97970908c20e0c408308404a0070078649ca88075b2be3c516ec0abea1ba9a69e3ec2914a49eeafae18e42ad0f30100011318c109f789b42b585000000000000000013921cad614b438ce230427de26d0ad6122109a69a49418a18819211a0180060200401be2441303df070d94f6f82e2863093afab10329941b079a0a453b488c2051c28b1640800004edb309c20840200002c043dc35214ee88a2c0b03eac0f61a3a05bc8a3cb0540000000004c79f2f32b8ab243f898f3e5e5c2433831020c22011c01801c9de27f5f973a43b8992d50410d5f625a4ac35a1a5cc5b7d7c20f446d63d6a9fb506f9832607ca1e6020002c52000c1643d8261ea038c109f789b42b585000000000000000013921cad614b438ce230427de26d0ad6122109c71c51421608c08a09c01a0060200401bc2191064e4450802c9962e9c10c1e6a8882043aaf15c1900d98c3faaa282a9a6c2ca04000009db66138411004000059cea14653e5913480000000000001db93f5092ed92b50a329f2c89a81b09c71c51c21618a19c01a0080060200401be582c95f484c10cdef463630884684ca32c21f1d27de9e0474413b38100002e81b64c0842010c108e1e0494fcd517d135466389545bc8bc01d9d291a45dc11c610a7741a65b51029320e6f9bc08075e28afc20b172b247a134f0a4cc3cf990b1521693baab9e170e03a6e004ee20fe580268c048012a052b3f14c25d3734d3e2c0db846770e88e47a8192bdd4fe8a8babcd94016ff5cb6cddf357cc166f22304c02800001f290005312000d6c7023d3ae1eb02c86900ed08040b000000000131e7cbccae2ac90fe263cf9797090cc08808904604304701e7e20467e097e2df9fd9ac314f26ccfd98e64355400b42d87da216702c5560c841a28798280009e0c6084fbc4da15ac2800000000000000009c90e56b0a5a1c67118213ef136856b091084f38d34d24d0c208d00c0030030100200d8a1fd3565ba89857383b6488cbb92115a7821f21f2bc780b812a0181000031f7a330010004225b6f6622f2234f12bed4a229feb171d2224ac7254cc800400100000d2303eaf37134d02e5299598d01410f2f9ccd007696a9be4002000807a00800039c80018c9e366c4893e577834857891951852e6d49a7121355dc2dcacf8e1f582b0a7741ed9ec383165236b6fc8dda7ece55f7c965419ec981073226af469f8b21873a79980a6b3180d0086d4ae80c6d978e317d44e7c029ecc63801673103e327c4d1cb2c56c9101d10d80c5c0cf25a62afa917c6abc2298e6b85f2cf2268ef6c4df3e2451f66047d1740738083cc040008b64188140012b44008641e40a00162021e2420f0210728c80088248710883841400af4878a21ddf37d1c3009d178f060f23b12b0800231821008708816b8f496168050c7f54a6411e4609aa4608c69d30f94e89e6b7fa98fd3db1ff6d58c5080fefbb72b7169afca9497bf8142b9066c306dd8dbdcafc05a7f67a569e1a658bac444a02e2b14f123800c933972a1d256d447fd780968287c14bda4e00358591a8f9ffbb61a12373a11ba8f91520d849f29c5b0a49cedad6798dc22d14a5d5966822b99462106400008cc43bc541bc2a0dd150770a836c541b4220d91106c02835c04000be26dde7a748e760391ba87820dbd5b1055aa0880782a0a9cc2c5e4699e3c58f7a4e39f02022c62061831030c2141041106763ed5744c157516e29458d82d4b4031b62e31c083da1e742505d79c22763d24399f0ee14e61363e5b779e9d239d80e46ea1e0836f56c4156a82212c62061830c21410412c00401458f6d63f44b867432f55ef115508b50bee1a8ec924f5f7060c62250001d4209633c286ad93ede690140bc6192c720ceb27014397ba9c668d051a971fec3831e79d0313409efe6f981382108043081dd2ab1b8b2044abdb172071b16c41a8d041712387a38036dc542b8802436b21ed980088021841d2dca1bcb20bbfa839a404556b486a2c117d936d0160518e2ea54300d1a723553001080400004bc80013f9b2562753ccc4a18cbc002694918b548575cc30c3779db81860822afd3f70901d8a36b32840060650bae810209e10b76e9000480280e701076808000738d9230dcf42d2463ca1bb9d0618054bc0d0c005b2e7e56301448d9d352504210085924f5b2648060e945cf8b5848c33caa1ca21860567e841038235ce05320481a7f8816fc2000412c465f470024014073808000624825828000af480108c3b027a409d854c00a20434f225640a4f4551f52c03781f9a50a056420869c0943084021441261fe53163134b3bf0902949a22ed04108d3f82210047437fc11504200040758083a80600025043a4241a20200027521d00bc1c26ef6c5124718efac6647104e4b0d10103a7a042594c05b860d3d824102420a8e0900b6d25ff60027142200871289bbd1bbcf239b3bb25c918e220bf4c0b075616b38903056b99711b33b9dee6d138397f3c8295517e1632d1458225bc3fe7f727631aa6dcc008706e33d2d2e14fa9108c03ff1040b9331c69aa3bf048d0eb145fb6b9d2c4ec79f4df84971d70c4f0bc713febbf43e62f1478fd307ce90aba9d1762d85812328262a4c7c75a64654c156f5a62c180c892a0a3)) <<< 16000) + 0x0b289cbbfb54eaffe6414269e853457fa73c8c1860e54e190aa1afe0c3309031d4f2b47daa703f461322aa56b82021142701ce0a0002e73fb8b06022328f58af95088fc4651eb2040995aa5e262e0591659c51c49c39231030c06dcde0c0e8146b87d36e65864d3f29ba51f76e0291006ec2bfb82388ab78d3803a576800ce284264f50df733898e7351b475d0c1cfe2d585ffe524636f58e74e8fcc15f9dbddc83f118522bd165a3958900a8b1984b9341c03238a759fc2a3944801701e039c0400049a4398240c40a000491200159c43944412e12000c8021c842095210718c8388441c20a00188c3c60538b91e529e6038ae16dcafe06be0070c4686ff91077800a10a258d527a62e01819219d47301358028360a688a423f380304090a63c2a71f0040103b346d9f0b831c25038a1b82e207097a5989a206123a84d07244542a42e34204632b377301830f892384a1c2d24ee01ae182ca8a50b092c1fae6ef3f0200455ed626c04e2c4084f884881200a261f2d07a67c41bb7b8f60344a9cd8a04230c9275e4620591631020e10c1081160880180a395ca25facb46de66e3e2090ac53ef15bd40b269539d7a0e18e42950e005000109900042e21be2a0de1506e8a8370541b62a0da1106c888360141ae0200075120967a0024ee20461b818daa90fb70fcb4a2c97b765d0f1dd60108b6006440620640228208228018000139cf44ffed08c51c209a5731f04158e14504d21319d2e48c8235a93266cbcc02c986e6a94cfd9fb351246f181366c52f7a5f6a84380afc7a6a2d00000000000000000045342e4af234f02c44f0f4bc9c859413b0aa415424414420010000026836bfc8614b5428602ceab80fd04b4b2b4c8c010f20bedf56035c7ff7c98e24c2732a17c018afd813f252b4b2256a5a16ba118dbc6a11ca6350d60506a828350041a6020d201d0d04fdb269901005b620de2043ddb1e7c10004b218a5c00482844010b20545484b12c71e267dbc481c8e2389100c3c8009c5a0c05ba7caa762402f51146c010008c3fd28009c4088021a50200f5b98692ad8ec3731448b7c9d57e38a1d0908f1160063bdbd9e4815b54aa0a86011a7607c64e0844010a2a1d5ef880d24ea5070c8a27394db0d0714a1ab7e60907bcfa0ff4304d81a059498108002000025674c006276031a5006a74f78d225a5a0d726840051c3ed2404210080310080003b0868828000f1c8002a69a162e2461a9f6c5db6d5daa6d6d187144eea04322b6d45dfa7966004cc6155c1fb223c418044a9bc231cc74a00e11f8e06cefa1c050ffdf5dbd0700d91e0f1d578ea17d98b9887d30100e4e1e0b013fb7c9b07bcc9bfcc5082bc52e209e965348832c060912bf94a0abf6654fa017b7420a0a375c03ea3d47e1a841861a04800007f640029848258e8003bb886810833c8419c420cd2106610832c741943a0c911064048004678e0400144f8b2d818212360e994c60812866c041e8f8a036cc1aa59160403c1e6801dfa40aa80012dd70f11a0c0bba3274f408fb40c4c858a49af02203b75c09500b40b00000a0c705063028314040004dc431056046130c30506100a06b85619a624586099f86cf94f061421626fd7a029880447e97eb98b120011f9b9b02e94701da1f4d6fe1714019206346e26555440402ae4d9b8f7e0966e87f6ecaabce785c058d2d2c4bbf83b1646b1bf6553730700034309f858f6b71720cc4a1cfdb26a3d29a0017f9de6762003f6f5315ae8010b8c326b201c60e9c385271c2701479a13b42ab40469584f44e6320693065131bb3c61200275d0c6010400a70fdcd078000024429ae6808caf6538b260000494c323850000015ba882052430a0051a55e98b540fa349d5646262ac68216ec0b5248a0400179e3aa1200007c4fd54000192d167c628613808000053ce12ef770de3930894a94e67396400062e6d308180001eed68300001c0877e14000d2d445f88000f4a2fd4c46710250080000c01093010490080014b48608ae63cf97995c55921fc4c79f2f2e1209439431230c21208408a00600a209824010068000859a1610a8aaebde1491532f4a06cbfd48141a7b91ffbeb0b101a133f464eb08083a75b19ce9c0804ede84193def0b021d1cc1bb414860041b9e10b8dbc5100b49ffdf1b688207c8283003800012899117589cf356e6902672a005945f21c4548a99dd21025068b3a6fc31b8850c3b0a37ddecf8e090285ebcc3f4280ad3e78012de828829852d3a080810b0b37bbe8109aac72c2f03400011e901e1180e88f88d49e3ed7c5e3dc38e5203000172f4ffad8f173a0e1d0fa81cbfc16460e20c60c00335c2cda5a9e4c00300000054dbc68b1c2c6f0000aab6e9e8049d0c0620a2080023e8b54d63751325bbbff86f04ecc70921280002a6200202e430087648467149998a1e41dddd46a58c004d2d9582867c05290d59628db09b7c18a14f392e01a84820000eeaec140000c6138a50004a010a1ea1fda6b2258c247c97811285bd872d60a88200e09b6dc840c0787ebb005028e804114c100091e694a04e004a010000178364969be911049191c0857a4c50a56196fd2f2449f08b136912089e63bfebc7000c7859b9618003e642c4c9c009402017c0200018d3d38edf7f748dbf9e3794525f3e5bb0432ef987b980b098fd80c00000000000000000114fccfc1a414f2e479a367854efddc6d86afe03da987db1b59270000000000000000004422472462442032801801005b84008034000acce14d09eb7f04e2c921753caa839632189dfea2e4a1a512c)) <<< 16000) + 0x3a35fe58a37356b3d5d28566c1f68b2e0e1a16950af1c49040003258dc82800029c81f1cda400a4061853f7b8524c16494053556796327538ddb794355a91df1a96290746f735942bf90580188e1a752193c0800000009d505000480100001a1364b59e3d6ce8a1c140cebaae50a72438f82c2450c05f1ad792242bc250db060860ed165fe38004c09c9860c009d11b6ead0004a0100be010000df1a1c00214d1214091c9d03103d6c09184911eeddad4514cc0d5306d809118d79c95b36c80e11e15e8bfc0a0028eddef70c06002be1a902d40400217aa8dbac1671210580480002242000fac42fc17857358fe8c15c58cdb280a355114303c4859737e50b5b662877701820574ceba5b8388210822413a9208000598188020236b67b3eb0120000948ea78182400a807149579f2000000098c607fcf5c75e81d75a6b81c29843de1aa7060548c28b18a18a147104084040030000200d000161364cafe51cbcca15126729dea48a12a54bd91244781529d108c18397ac9c6430410515af2038004c09c98608003d32dcc1d0004a0100be010000df1a8d7fb7bfacdae3d27d2cab54c27e3dc17c0118a7484a5f93a90000000000000000002289439238a29221219018c00802e0200401a00034e70aadc2e7652e8b202d22a2af8b2c63f6e1fd63dca184076df2a4b28582464f2cca07104358951c41241000086424c04045211b8de08240000ded5fb4244801500e30ac291608a582c80c899e33df2c645f7146b642860f91f8aeef28593d882fc691c41273696dd710116cc06fe2800000000c4a4aa4001400a0000710d930f410fc7f288132fc32871429886e39e949149e7698b68488d1614abd71830eb772f3e860801c9ced3870009813930d4001280402f80400037c6a35fedefeb36b8f49f4b2ad5309f8f705f004629d21297e4ea40000000000000000008a250e48e48c28a488406300200b808010068000d39000786217a02000ed921782a0bb1505d0882e444170220b7110108682d82416a120b401059808007e4c85924c2c5261606b0af2d85716c2b4b701882c64936a65f515ebafe726c7002005e094dc1b761c942ff6cac2d0190381847d4bdefcb00de33cc50b1ff958501474756b1bcdfc6ff42ff90880720400efbfb43fce1cd72a83a040bb4c80555055236599d17f970434a67a100748010089c630cec5b81e0589126b9ff9d6152a70c17d95ee7f3799e0732229491a0ec115b354a5a0f64ce9a14e2e94e020c67e4df09d402ac3789a339a6472289c6bfeb66e432d1c3c96d79ff748fb63f2a69d28300000000000000000088bedbbbd4a523420189d860aa8a1ba27ad08adc8ca8f1d7990d3b3c83e6410388400380300000cde3efbdbe6ec9a225ebf508099b225187474fab8cdcd36b1c40122d74dc10a8db011ab9c32a3d32296bfe0e4294d7f794a00d1589219bb2251acf620f235ed1512d0101b0924349082c21a40c977f89028800131f89810401425bec8d03491efbac18000558199b240003fa2b5001408118042468162833c069bf19967b61a1026647cac184005f25b11809301ace9a18005dc53f613021100430203fd59d860341a30bcc2005e656a091820f8040000290e0536ed03808197cc4c19e02d8c9ec63001d008784bfdd338605426c3bb1000e00400001c48088080004f4c00004010158020ab010550080001848001e59f05b1c6bdb300467ba3e4102abdd1ab8c0078021e0d84e3a430800f004000012c8548282a01414e0a0a6010000ac909301049008001c94fe67e0d20a79723cd1b3c2a77eee36c357f01ed4c3ed8dac938000000000000000002231e1cedd2bd03f7374b5f7e6c7aed3fca7cbf7e90b341266aee000000000000000000888cd46912119a8d2232eb6a5a9800000000111904ffca87d816000000000263cf97995c55921fc4c79f2f2e1229208409800602c438648a2ec1a5141cce47fa30eaf0830186815100b094732c060868c7978b8fdf6111364f5d4b8a1774db412210b5233140aec2e29d85b4099dc48b3388e19ac3bee1031e0e2e7c75123f7ba5e7aae14b75851b81ab4cbb8ba6fa7b8758958ecd0364572a11a0a08c0101f80829404110020a4010003b8107d2983e14c1e8560f21b0780d83b86c28c27425bc1d396261b3589bc56d7a387b832002820344c8f07bf1474678a2f747967b9e5e4541804baa02d562028d80501c7defe2aa04e02e48065e444688ed16a2558ee769e71e789ed302a18b4e7e9e907bf8dd65a610be2cd2345b480afe494a0c91cfc8451078739eedf37dd5c6d3bc739f71e681113f4a76ca64308619c4837d66c8051baf0a89000552ec67306083984748ad5a47c8ccc4631e327b12a427a03a86000000000000000004247100d7db777a94a46840313b0c1542822020821011400534c24b6a8df1c6fd9e20addf582f6cb9e17a0e4a72fc1287a43927b15cc69002f7920dd863353d2be63866eba0c50947a48f56572492c9df299a987719f4001064e1045369d0a201513cdd344106de6f3be23806abf1aab8a0059a6c2d11400d9a9bed014504598d08802000029c400867a3a53d6e9f8e24298d2a99e039bb76be180007af5080e056c588b189286100042643de477524c1a1eb0cca7828c90d03840681b5524960424e912e25041f00840b519512ec80c2a38b06860b9503d3808101f6c01c48083e0100000cf21440a0001fa3858300de03a43ef476cfd9a39e657233080945a03f9180408f926102039ba132804c1040010e233f748050c1266a3bbc103da864e4)) <<< 16000) + 0x02010249d480c8103e0100000d021420a00022d3836f31900e50279dfd90860957e05aa5818d43b5c848103c010e092caaf3e080bf8c42cc8810780201420200008c21401204b050000cf109f1984f04ec59337c3745021c426338801358cb33811860f804207b4553a411081b00404e82800018084e06826c3413412061010000bb909905e1441800b784860fb9c6a338035e639c992005724e1c450250f9b89008128c108040260340c01a0970504b00800058484a90825064126220920500055d1b265833b4f8910aa77ef4840ffba282c0d08dca2f8c0d015d76a998a0048593eb45027a765e0840246253b30a0108002164a99f414e9821c01f82612218c5a6491020fe91ddd881c498a5ba1a0b455bc6e8e069584da6938210004000055cd10036fd2a24060553a07c307e417d9881853685285060268899bf6582108b1f664c0840010091010000a01b158836ec94708f5721e0060865f178fc50aa14a18c420591e84a849410800201200207001000094981c1729b4ece97c6444e43c1e6509fcab15e5ea88890aebe7ef420282911f283e151737ed097ec14098605c135b295a1e5d821ed4505cdb8e4aa1f71a8d9102756c6810207f4433e328dd798c203e100868be0a54681761098fcf6c01cae7e0758a4734e58621dea24bbf3d05e141047085d0f803582823c1400078e4238560be2204a11046888230341161b03f0d045068224261100a0870100052e9001ef13cc403342e4af234f02d22b158042b1f727e2eedac8b068d390ca42246084fbc4da15ac2800000000000000009c90e56b0a5a1c67118213ef136856b09109060c304d00a007001519d941ccc6d495ce1ef002e6054ac0837e88ee3811eb8f0e7ba13dfe4e1d98e409dae37b6d4ea4945d150e3677b4bcd060595a5ce6e702cb33d24e0f530f9366d0831aa6b5c1831b3981878c132a29cae820a63a3365c40254ccd2170c173bd170b828a084c6042010000147383053e1ad65e779d7118551c3a3203020d4d074cc7c5778f54d98b595b8504b61f38026930d774acc833c7d8820c337e58333205a18a95aa07e1e420031893f2abfe68031299d522253018013800c46b28837c1e8a016aa79c1451331b569fe953910d9af7bc010108d818027720f3cf0709cc60d6250086050001e5101119ea14653e5913480000000000001db93f5092ed92b50a329f2c89a81b06589b34e2e0160f61953281205a8a1ba27ad08adc8ca8f1d7990d3b3c83f60176d0a432a3d972d72fd718b111d5749162e1328c19810a1040028752370878a421e5449d2f89c4166ff1d7a90186661418d021565ed07df5f869b18405510eb2106907ce576312fd1b45fbefd84f0f175cec5ec57619be4f1caa8ab846adee51e5abfd4252e43ec0c6d5482cbc6a9c9c1137540b8cad2331c1196ef3d3a473b01c8dd43c106dead882ad50440000000033e3934ae033ba0dd9f1c9a581083d8654ca0481683065042846004000a09759c369c717af00ac7f69dc2f6f34a075f1dc57f9f0a2bd9fcb73a8d7342e36211d84f9983d995a09f10cd47fe7e587939086c7234ee731ea92779a340010748428e82107410632082110408280026e484000c0ec0400272840784603a23c37029cec9828dc8769a0bdbe81861f015bfc77e246ab0cebb192af98108f7aa1817ab6185b86eb11708c58ddc0aa035757c1e7c183d4e081898fdfeae64aa38487f3bf0293cb03de04dc76944ddd5bdcd2d7a8880c8264512450dff92b220bf27fcf81bbec088f94d5e9313f639720cb1ca501a08a0167b6330384a059fb5d51615683b77a400eba313205faa587b7d7425881f8137f902d2a95851b103c15720098a4a0ab2149e4cedfd4a8c8e0d29253b2b20fd7dbae479514b492ca640ceb5c77775cf0c3b202c20709421ec2355a4295289873d28816c19000fe038000080234a791aee000a10a1e4874c30acb57b9b420312d96213340f0ca0c61ca004201000010220fc0a00015420fa1b07c0d83d8681e8260f2130780983b84c1d805c729242629040813b9fba744127d2d8c7114006731c98764042300871e2134a1a72c502a547b784103f65abb820100267ab2c100576af3976a084400800010720ea13c36e2aa88443820a155d9d8c410440100740100004a907305c0100401004c0a072050388281c0040000ec41bc660ac0bc18038e3e90186975b89680c080918daf50803a833c57090108802186dbd91f0a38610c48d84204b4d673f13041f00400005118020080201b80400006e41b4240d81206b090350281a4040004a641a007044777c27b1832d504446902e99a36839220d3a12289c00b3f31f096035c1a1801302100042089e47529f8c18074dd185385016d2ad60904057242720401d8021f0c94108802000021278f2bcb9eef1a203820f6b240208434e01918211004019c0400018270332d9b28f183c92760462204200080330081840400014a4194460c81306305e1b26653fd860e9c7a95e4f078fa05150c017ca0bfcc101f276b53c0251020008411d0accaac70a1eaa457c60af78bee4c1823b4100f8181d328b06e4a0840010c160ae9d2f0304df78bc8c8810800200000f66008020080620100001b9061050000fe104411030088000d14c86bd44aab8bfec9fdda55e70518fe0a948b5e0bd1442872765d16f6fc3913b072c365fcc7437af8e98c283c0bceb8f166aef29d198f7f50fcd37162bd9342283a580afc05b4daa7e2f0de6e306abdd2224610cc400045bdd88d4b3d85bd017e3dff49c8048ac54f86beaf9)) <<< 16000) + 0x36e1bbea84f6848a39e68f52d4cc9175fe27c0edf572b704b155580ded470c497324d16300631bfcffd0f7598efc8c5d95bc55081cd2751786d31e101445a4d6a1c6326ff2f5184fe2a3b2837d09e62660255793a7f1b893c55c8b5be76d6c0c0e0bd4dcdc45aee88c5ab34e603af66a4fc4b991615ec7a503cc9072beddc52656ce34ff659bc5d5f2f8c7511251484b7c4af71f34e2fb02a09e1f2b6d44085aec352f5380a2e35de3e304df20c08437d7ca780fd6f75c8c5f6ada5290886a0000000000000000011082c91f58be3393409291d53a73667c50796e3161362bd15260000000000000000042136a3f084f8cd9649a3070554e04504204e001e30a86094349405414d0dc8384051e3e6f3a191563944534e357c7c186effe3b11ab82ba06327b007ba8e932d6f1c9e6c848dafa1239ae71768cf13eee5daad3ee65039e1e2e63923d0708325d54852ba7434ee95fc9b4b3f6d09a560aea0ea83b12b5500069d2001d04417c74002c7840071bc82f128174940b84205b1d02d0e8164440b0130570970c18ebc9c50c3ec43ced8080414e841502c0495e77714800001a16b805050094c088021b6da59becbc6a9c9d129482afb17da63ac119031b5520b2f1aa7264592f6ecd73f9aeb1046906facd900a375e1512000aa38806828a1867046044840a28162a96bd6376648231fefec4639aee0c292e49cb235503e10c7d87c95d5fb1876b511c66d096d8c38c302d163f8a618451500037920ac13e422777b2f1aa72744a520abe963c616f04629096f895ee3e69c5f605413c3e56da8810a41beb364028dd785448002a8e201a1228820410e09a0028a026b02ca8c1c4f5af54a28f65e73230c79335423741f3cfc4ae032f9dcfe068eb6ba666489807897083eef4b310b1476dea699a57d055010001ce9a2a0d5168dc38440f09696c58808f89dadc30e633a8aa316005ee4e70d14251423008514855f9aa218227953522d2c406f070b341870c190fae0524102300802a0080003e48298cc14817031b5520b2f1aa7264592f6ecd73f9aeb10462e68f43e8120591419018e10411a012004002c6f86c65cbc9e0e04586e7de3587b2babff32f0c532113a9c7146f14a8288281401409e0200024d209c3204d190260a812c4407e2204a0500029c90490582402e0636aa4165e354e4c8b25edd9ae7f35d6208d20df59b20146ebc2a2400154199551ab7002d2ec67306083984748ad5a47c8ccc4631e327b12a427a03a86000000000000000004247100d490430470060014126022be5f975eb9a59c46726686408a2c98c7ddf9ea8b72cce6c865d7814a2d04b8d590e8bd33188aeb8f996274e4ab4aff271903fe1e600637d9d30cd521f114d89a18891eb6035e58104a4d1853d8021858c7a8c29d7345198f91ed8e2d2649bd30d008b8f929a284c2842010e3855b8b4bc70dadc808c81a281e96a32238a945ff7fd8a4820440100470100007a90461982282ecb474e87a82df4cb44fcb76873be189a0c124786ace4da51ba6468e33dfc76b1c92cef802a04b4cf4cff8423fbedcd2f1a336cc7b102ab5cbef8adfc05475707c9cf78c2f747555573ae5ef6add77811a64a96ab9ab683900d04845c390ede46281020df60ad50b72f71451d3b2d45404c14ed85bd357b340755372db955064837c7092d5dc944efce066b3b66bdfca998a2874f9f41305baba32b9b5305a9893287041fd1ec672ac5361699ddbf1fae4e23a82756a2de1c25dae4bec40ff2158ae2fb06ce2d06205bba290ae172b307020b329505f7b93bdf42e4d53514c07fd94ee4b6b894bf360de1ce4b8c25e55a1a30f1544a8936792ac8bf0cee1a40aed539c96e8b1e8b68389b2e4fb772f401b179b0b453b85e0e47c73755b27de64eeef016315c5621fad165e3792077892ccab77557afd5ddd7e5c32af6c2f553624f0bcc4bf5ef633ff5f781f42c5aeb27fae69750166794ab24e88fe2f059d5e7de29753bec0854b6186f52e4014581c1d65a4006474f09aeee00da65c2f37de1fa0e68dadf4b47e0f73fad77e25005fd144327ba0837956baf230ea09d5880f4cd4e58f64aafc9ea500d3604140f1b1cf38104c22c800018ac82204810c2408412041050200080038d0e2c696e89e64adf8166531bb2e6f3c038d2412241beb364028dd785448002a97633983041cc23a456ad23e46662318f193d895213d01d4300000000000000000212d84eba70e3816878a50a3022020fbcec863ccbd7139fec93b7919ace6efe9bcb4e2f28a23a96f88a6dd905c560b5244320819637a00b9d64ae9e823621f9b19358800b38d62bd922a7b9ceb22d1be9ec27f68f7e244756c406ea8f899c7f902a9ffa1638d5e88817894169ec8297f559b0c760ffc5a108d9f969096f895ee3e69c5f605413c3e56da8810b5d86a5ea7014460a50a7826022027805800bb699e4580323879f6fa342955523ee3f4865ffab29c67f720681268000fb90007e73a01572f27c3168fef8c3e0d535fce5ade723d9201debd004e4c228d67af361b4758befd650bd22894c17bb3609eaa11fbfe9f8ae6dae58beb533c6140200f9d651fd2db39ca0b10cfbedbd6823e25c1471b086704f21b232ebd10a87b1b4bdec40bbd407e34b35306e5c9d999c52134345ae9ea42339f04eb00254f2ddf709183c539fec12306bb5300b9ee147ddc1cc48deb544f522d7ae4de12ffe4ddcfedac1842fba9a6d4938aa176e1950e67172fb0d47d48dd596e8050b7706f5ab1da6fc1e070469c40d1ce616b5d76479f1c069f5f77e6385195d0)) <<< 16000) + 0x8d646ddc5dc8e4470a1367ff8305833c6c42dda2003fcc1cc22530994ebc050e83b141d24eb7f0cf3d56d10533f365e6fa791df3b24a97659397fda0c6cd9d0626a583ae564937325043c4abe29a67aec0453b4dd000096d207e32002262201a5203e2901e92804084078220027aa2076020035d7200b84e4028b20f4e3b7dfdd236fe78de51497cf96ec10cbbe61ee602c263f6030000000000000000004532d010700a8814f422b5691f2333118c7a58050fa816e5aca800000000000000001092ec67306083984748ad5a47c8ccc4631e327b12a427a03a86000000000000000004206000d050870460420400264014f95296db3bc22f773e8cf5f0047a0dde9a7674e799874077cf787201c633fd9cb4b7b974cda466dcfa96a3be34d4d36ee18900285178bada6bed2711a464c1e8ab58cf0ddedd12d8691e26e6af2db4b62849054d085a148a0743203905cbb19cc1820e611d22b5691f2333118c78c9ec4a909e80ea1800000000000000001084508704604204800500300100b84f42d703ea9204388a13b7f7e79c87a521eb0be821bb63f29d0e48dca4c5afcf1f34c1ad76e514842d0002c720704a0372501b1280d4840683a0331d0190880c4340601202f090170080b4040014e4402c8ac8072799aef4dd475caac668716963976dda339fbe5f28010cffd0a75b2000000000000000000000000000000000000000000000000000198470c60c7046044043002001044556b7addc6b18f3ecedca6ea7b5990baabb2b376ebfa115e20b57b10f3948c8726d850a2ad68ee10ccc7a8f050eecf0dcc74a38d22611c454b7ba27719f69247869ef252f61ee19d2fe11b5c08b8341186589b34e2e016a286e89eb422b7232a3c75e6434ecf20f99031020e10a108004002a2ae18a098f0a0c58b7168fc0c7defa8fc3f7fa6518738448fdba76f4db566503b8cadd2fcaaf25bc59b18561216bbd3751d72ab19a1c5a58e5db768ce7ef97ca00433ff429d6c80000000000000000000000000000000000000000000000000006612452052031832421401000555771247d117c678461a21e86a7dd510b5275fed6cfd2ed11840806b1b07944c99637e4910418acae00832cfdb4a9743a70d865c4e99ca27e5cb3accdb5de9ba8eb9558cd0e2d2c72edbb4673f7cbe500219ffa14eb640000000000000000000000000000000000000000000000000003309231229421220e20619000c002aaa60a00401b854304fc59712ca34e79e4f564920000000060c20a1bff59fe9641e88b477272480000002580582c8c3d4c0e0c00bad32f69b8a01237ec0f00c9002701001600fceff10f73751791727114ef74ad4655dbe7bd9fdc31e789e8000000000000000000000000000000000000000000000000062130a2ca2493082c82482c104030080200d00021a20560302a01611458091ed9643515d1bb058dfadd836e0c09fb6cd62c2821174274a9003d84027063001233f0d8813861100434a36a2f027a693d5aabe878c1e600d5e2c1a303977e959300d94c2664a128411804349ce65ca33668e0f2608a04c1eabf775d20e102e3851211c0200a5c77a3001b83fd99426082300800009f900026a20007dc4068340321a0290d01404809c140011a84002cac80079790002901314809494048420012ae20460b022014099a0c9aedc40c5c533d208c09bbc940f214129a8a5cce202748bb9438300107b8cf3828a82a4c7046010814312d1a7190263bcc39f81c457dfdecbe3027904b190850490203bed8809a72ce7b605150598c08c02004202020010000be901f1500f02c0741603803a1ad5a3ef24140a40e0b8411410103d8bce400411c0729814501164382300858f499e3f7fee049bf54b67ed747907e4c276169710cbd900085f690276fa23b572dc94628dfa7ddc611a4a4706063000d6032c62e01d766e1730744da1acd616e8ddcee37100433f2af34c1ba2ab845ffbde4196e7b37871436262420e881cb94976d7f255774621a4c57db3541b18e571182c79ca5245605886e252213860c2d77017f8c1060957cdf110641c23008000075901b1d00d0e806454030220170900b028001464c8b9145bcf0461423f27d98921102665b0f101098aec2b028019beec6681525182300800a8480502402612012090088480402401e1200e0500682800075480602c02c1722c760eec5b14a439363d639868d7465e492e89080c09762ba470db5e68d044538bc29c4b9204821be22abb751c4c3dc822fc72e0a016725370545407823ee37a4a9b04b173e256a1ece0c41cd003166176dcc95eaffd7698fbf094b5d48f2257f5ffc832a13f14ca9b6a0371198468d6245db2db6391f7405d13be61441e9120803c7850c0790fabe54ee4abe0e90148d55a79efd0424209dc7f367bb1fccc0224e2e42922ecc8a745002083ae957064022c0f80d45fae46e737e508001abcbb2557427629d92063d89567ceb2f01515002b88a6465678ff74ca3c5e66d94eb1826001447091a58aa5b5ff923ebe4307c80c78b88b06b9bf59d94422a9f232fd94c2286800009424028a40125200825003908018440011584004438800a361f3bfc43dcdd45e45c9c453bdd2b519576f9ef67f70c79e27a000000000000000000000000000000000000000000000000018b009090afcfc621d8db79f5b8f6a3b05b3ae1e6afe6a43c20000000000000000000000000000000000000000000000005f21421411010811401000c00555055102e980200d00501002008000f888018680083400202000010017e29)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 28 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase11" = "QuadFullSixCase11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 28 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase11 private def zz2248:"s08c8"="s08c8":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase12 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l17 l27 l29 l33 l35 l37 l51 l63) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2e563366, -0x11d6a998, -0x105a13eb,0x258], ![-0x11d6a998, -0x8445a377,0xc8b7b50,0x1634d20d], ![-0x105a13eb,0xc8b7b50, -0x73f35d98,0x11d6ae48], ![0x258,0x1634d20d,0x11d6ae48, -0x8eb55f8]] noncomputable def hinges:Hinges:=[(0x105245df,l17),(-0x8eb55f8,l27),(0x8eb55f8,l29),(0x8eb55f8,l33),(-0x8eb55f8,l35),(0x8eb55f8,l37),(0x8eb55f8,l51),(-0x623b9ee,l63)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x8eb55f8,l27),(0x8eb55f8,l29),(0x8eb55f8,l33),(-0x8eb55f8,l35),(0x8eb55f8,l37),(0x8eb55f8,l51),(0x105245df,l17),(-0x623b9ee,l63)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1284c12016801800000001e009200c000002c13809980600000000b0024803000000006c01240180006804100263014000000001c029005440a104400635006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[![0, 0, -3, 5]]⟩ def dynamicCode : Nat := 0x186c14c4d60614539ec1e1c42483008061052e01df1c3041a9bb840400000c8041000001107001e0c193a0007802163479302d09738ca5ce201512061852441c4184182200140100c800080340003bcd47f98000010be77b614e05446189146147103041047001030000200d81af49c175d122862e3a35b1852dddc8f54388536956e546114bcb2d95820fd1e0257e2003a26e1c2c2801eddd25484000c4a1ba3fc9002301c0000e690002cb363479302d09738ca5ce201500000aadcb29a9448e72e7d49745b61569fb83060000000000000000dc27140437d4737d41ebd260e69b105506187084083042069f27cc9e7b3af38ecaa4a2e516a88bbb329c3deb34804c2d2e2b1727d03ab8caafe268bdd7cc5eeb1fd2057d81d08b984d2508d12e68001d51a10ccf0c6dd0c20988c51fe1041234bf6c06041234bf6c0a09a769172d0c10988b007e28184839f9a8400e4d1d23d1010fcffb8644061180e000071880582802805034d056930308709566bd23220304411f2fb3a21421c8903f5781000e447c25c407002ddcd44f942801c8907d8c81b9f253d78c1fb443f6d0a7d1c20a40c131b99f1284a1f82a238e40a40838838440028000180001006d104d2cb2b942056bea7fb159024cb372565440c000029040480033679edc18000000834004003b34df6301003a6d97309890004a0400001af3c40000456280050de18b3c06f91039767503182c20aceb416bc8018119ef3fe56e05062d74c6ea691016a7d9c3a98c3006463e43d7000079a02930b02c684801501e286748006bd1081a323f8e74c1044902e262c080c043f1cc90182b32e4d7198800000070801503001301400005508001c1100062d38494c1ca1b18300002ee01425b374d56141999aede31c0000007d01805775ad8a080000003e8ae00400180090100400801c04000328401837551d293c87005d29be4475e5fe30df6b3d021b0367be87b0c5340400000000000000000000000000000000000000000a241824003802801016759727e04624344f854ec345213a9194032e5a04a39727df4bbab3ea3123f885549ac153c06d875741959a01a6ff90d44a2ec82d7f1cd8426f6a0116fc6d6dbef84c3e5debafb98129f750702f09eae1b7d31c6cc030f681db6eea2d0b20a0fed2535157574a19a25bdb229a094288223a2d760b1824b232c618182a588b140ddbda0a14106733451009c493a7001c00858c00c00f18618f8c5e110c20bc6fa21202dd2a1bd44028c347580b00d7d00ab0801403dc660400400b8ad48001f0140000be18000080224628dcecb1010a99fe30106095837c20011a41100801b64791ca003a0100000ee20002566052787eef7c1f42b2ebf6bfc64b6b84182083e68d1cfd6d4c125f30edd7b5576b6050439e53bb1a7d55dce852ac946ba2f8b020e7f7aa9793bbfe9c5f9ea30036286501c0318c1f59d36bd30ca3f0e44f0a96b940b3aa53486825196ed59b44ca7951163ec5c28d0bb9852be7378bf14a10f63080003a22000fa667960804807b8bac22798c0e08827a8c3b8f8960ecd8000000000000000e800002ab72ca6a51239cb9f525d16d855a7ee0c180000000000000003776cc0014c40c304600500103f7e5591174734f32ad1e9cd1a0f7ce5c6c10d1b8a41a59c91d05ccd85bfd3f728e6e7cc35017cc7ba377fc97b564eca1f38489fdac2886f18b400100080088f1001b393c589a96fa1c35633f0018179138bf1011a5c45a0810b66266140004c58f10007077900c0691d56f28041c00871c0087ed8e280002581830000e2830417858c0606f3ce6d080800012c2c083600800010b200a0282012ca5a18346bf692384f6da47c5080a11178e0a335167141dacf7a628083e12227001b00848fb5fac72308006a7d8305dfb4b46282e49f688180a99a7b610012c87960801434c673800e00400004e4e0d40e0fd0e1430170a14212bf3382804e38bbe4001b008493ec6eba60a20039fde638402c873c0c1234ae02c1802f184700400003225d3000f00400004748000fa1812113f2c7b98a89b21c65d0d719cc0400829dfc6bc067e5e307f8b27650695ca80603bff1ce1d5013d551c1d0828bcc45d0140a824747a962fe0d436ac10a393999404021e7c1ddfe2f24787f2b71ec341259018afc393c7af73be3428e4fc44e00c69c0a3afcbc9c8a73d4caabf02823d0c2208fe01aef7208db09cc62a445a931745b67ca742842ef10698c912354eadea2ef9982d52dda0c3033741697e717a8a18b482b627bdaceb796ecd3f63af02cae70d25cab0737f5de8affd788124c8700004f240018b880056e9aadcb29a9448e72e7d49745b61569fb83060000000000000000dddb3000521451431411011000c0080b8000803708000297710e100004f48e305d86b98008a1000005dc020000003abdd14008805186a81af45b6308000015d74608761b9a4c040800000bb8041000005dc03000d1d43d045000000083408000000096000003ac1a69764008c0300003900010000be080202800c04004020004bc2002020000100094b1 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 10 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase12" = "QuadFullSixCase12" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 10 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase12 private def zz2249:"s08c9"="s08c9":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase13 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullSixCase13 private def zz2250:"s08ca"="s08ca":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l22 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l46 l5 l51 l54 l61 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x40516b400, -0x1fde7e608, -0x2fcdbdbca,0xe852d6c], ![-0x1fde7e608, -0xe10590e98,0x20791fb9c,0x1e8a70e06], ![-0x2fcdbdbca,0x20791fb9c, -0xcf26375ed,0x1fde7ef62], ![0xe852d6c,0x1e8a70e06,0x1fde7ef62, -0xfef3f55c]] noncomputable def hinges:Hinges:=[(-0x3b1d09a7,l5),(-0xab333b58,l4),(0x2be58046,l9),(0xbb55166,l8),(0xe08e10,l10),(0xde8525cc,l14),(0xcebc5036,l15),(0x400c1116,l23),(0xc0243342,l22),(-0xfef3f55c,l27),(0xfef3f55c,l29),(-0xde8525cc,l25),(0x5cbc9986,l30),(0xfef3f55c,l33),(-0xe08e10,l38),(-0xfef3f55c,l35),(-0xbb55166,l36),(0xfef3f55c,l37),(0xab333b58,l34),(-0x5cbc9986,l43),(-0xc0243342,l42),(-0xcebc5036,l41),(0x1b001e54,l46),(0xfef3f55c,l51),(0x3b1d09a7,l54),(-0x2be58046,l61),(-0x400c1116,l63),(-0x1b001e54,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0xfef3f55c,l27),(0xfef3f55c,l29),(0xfef3f55c,l33),(-0xfef3f55c,l35),(0xfef3f55c,l37),(0xfef3f55c,l51),(0xde8525cc,l14),(-0xde8525cc,l25),(0xc0243342,l22),(-0xc0243342,l42),(0x400c1116,l23),(-0x400c1116,l63),(0x5cbc9986,l30),(-0x5cbc9986,l43),(0x2be58046,l9),(-0x2be58046,l61),(0xcebc5036,l15),(-0xcebc5036,l41),(-0xab333b58,l4),(0xab333b58,l34),(-0x3b1d09a7,l5),(0x3b1d09a7,l54),(0x1b001e54,l46),(-0x1b001e54,l64),(0xbb55166,l8),(-0xbb55166,l36),(0xe08e10,l10),(-0xe08e10,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x612c81b18060000000922100d300c000000000506066008000000000e140cc01000000000007819002000009104301fa30140e38cc8290186c803000000184410130c0400000000054681980200000005212037300c00760c11020530802800000000002c0c80100000000160c07180400000808e10192301400001011c201a46028000000000190188020000062290e00b2006000000000038072008000000000220184018000681343102a100400000023866034180800000004219014300c00000009432068601800000000121c0cc0100000000322406980400000608a10192301400000c714e01a46028000001885200e4c040000aa20870033200800000608a100d23014000000a2188098602000000000001c0c80100008614022029a008000000002c140a300800000000000a06400800000000a0502cc02000000015048111806000000000024092008000000560b810c602000000094110218c0400000000005a0710040000000000980520080000000000260640080000000002102c8020000000002380590060000000004400b200c0000000001080e401000000001f0d014c0200000000004806100600000000004c0520080002684609006480200000000130b018c020000000026120318040001482a04803d40100000000098500a601000056090160275004028814208800c6a00c0001502705006d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x1a120518040000000520a037300c00000018c7403860180000000003101880200000000623c0718040000000000c80520080000001448405860180000000002903880200000000520c03180400000012289036300c00000202618112602000000384a30268c0400000000820e0398040000000e24202c300c00000001d9301c6010000000000390388020000000007498198020b0c30420c05e7401812184182080bce8030000000188680dcc030000000004c18198020000000000a40620080000000148b01c60100000000002a0148020000000310501b98060000000028140d300800000000c8501c601000000000000c0c80100000000000a049004000000410d406c30100000000000501a40100000000000440c8010000004882203498080000009705c0393010000001280a00726020000002441100e4c0400000000002a0310040000000000d80520080000000000360640080000000000d0348029484180c8817eba00f22481008302771401c0000000001681640103432432020188d0060000000002f80590060000000005c00b200c0000013018802660200000000002d01c802000000000034029004003182302b00f240140000000000280c4010000000c42301a0c040000981882e02420080001303105c0c840100a088906080e4280300007c0f02101e10040000781083404e20080000000000240620080003a0681080f080200003c0841400f1004000000011050061806000000000b8b03300400000000110e0660080000000361f02cc02,0x2702200b18080000094260900b400c0000000003c01240180000000000640c801000000003a32051804003c82282d018c40140000006812807260200000000068004c804000000000036029004000000006c4c06300800000000d8880c60100000000161201cc020000000036240298040000000000580520080000000b04e02660180000001608404cc0300000000016004900600000000036009200c0000000d812018601800000019024030c030000000340880718060000000680900a300c0000000dc2201660180000000190901cc020000041c738069180a000000821c803930100004890a1c00cc802000000002512034c020000002886202718080001845804c053401000000000c8b81460100000000191602cc02000000031168111806000000000054092008000000ce2d810c602000000184550218c0400000000004a031004000000000009032004000014124201a4602800002824840648c050000030c3c808d980a0000006110404e3010000000a22180d060200006c10427032100400000005b1900e18060000000000b40620080000000168d01c60100000000002e01480200000000000681900200000b094100d23014000000000b0a06600800002c25040648c050000038c4c808d980a00000000004807200a5b0e381be021e28038000001c4510138c04000000005c4e05980400000000088303300400d216328604ac802800000000263c0cc0100000000004a0710040002c49320c09a40100000000001a81c4010000001845301a0c04,0xce01640180000000019002c8030000032140481ba0060000000000c407200a4c0e90232067de80382832421c301cad006050648438601f5a00c000000000074062008000000a220809c602000000184510138c04000102330a2047a0080030444061017340140000000050380a601000000002506038c0200000000000c0690040000000000340920080000000088780a60100000000000f014802], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0xc2c12f3083679401f4b20e34ab4957444185114a6fecc10546d977e8500060760fd2604210086161ea0ebcfd034a8b22a3b2121a4037af4d8fd8d10c89f0e9d2c504100c9cbf1e101051ad136f6020c621ceb56e0f003e58db5fe26809fe8a0f9560800ea9487f2d90e5021481400008f486884c3402619e130ce05e16060de2d03ca008ac1321a5511f0d1a4c2935679fa2782002c164c3013ab3ba3f94001d7a13d812710210085f8588682b75c943e7421f955bb523299022134a30a3443032820413c034008004c880080340004a4849048000af486688c3303784ce75f415c8b185c48ceb30606b83300c9a2c211b2718561809df3694e403000f61744c600107288dca8020e81993240000005b6889dc709406185ab269a8064f2800000fd20694fcb62859d30a3dcc785a8983b2af1c2b30f0c00000fb70684e27ea46d53012ddb8446b080636462f40910da45094061a523d5d5f9d3444e01c1df460615c80cec8f08000007081a11694a843d3020000019bc601c97273160100d78dd4d400a20061c88340a11806000071c849048000f7c86582800178ce914d584cc0a209550ae90e080f8e2f80c13b4c9bea102b372ef9080046b8eb80a051315d5c50109c807c02165000001b9280bd7bb1384f9c8c244fca47feafc7ee30c35399460727dc7d28ed3c89dab0ba43a3019a3f0c701092e022cd9ee0a8408fe5afd1d920672d32c09944002d3f53ec5196bfda36b84cf204964426f9e00f5e4a092401807f2d8d9fe3ff0d175e0eb8319b6cb10c56cda8530e2e87c2ca000003725017af762709f3918489f948ffd5f8fdc6186a7328c0e4fb8fa51da7913b56174874603347e18e02125c0459b3dc150811fcb5fa3b240ce5a658132880037389bc97dbf1cb2a57696f4092c884df3c01ebc9412480300fe5b1b3fc7fe1a2ebc1d706336d96218ad9b50a61c5d0f80001cd90007512194120008) <<< 16000) + 0xdf21921bb1b416d2eeaa03ad9233029f78447d8fd206634bf5ca43788c380ccd1a09985f9a4600b81e60006b96d804368938d32a1524caf53393f930321231881ee0a901203f6c151ad5d54942ce9f54c0dc1900004f668561e20b727a1029ddc5b37cd070a90bc1b14843829ed0a926c02800694965a980c00760f577dc030153ff08e104005f4f1d780d904052bed9a5b10ffdec6b38a871cd0a40a0000462426c5602c0bca373be400000000ccb1b076625d62902092dbbdd80000000e3d7806d43ef0a60788d20b20a2071010000000c77597daa55d6703e771535cbbf4601a096169a84b100115d5888c8b5b103f0c3728dcef900000000332c6c1d989758a40824b6ef76000000038f5e01b50fbc2981e23482c82883451c42c10000000b9000803400065086404e72111265e34e828396f3f9d8443322c37adfae348038c2aad679bcdd7074a07d636d31ae97f8bb81964a4f3c651b9df21011839239228c18e08e00a0006cbf286064418652040e77616ea34e50318c71fa9f4343dd115ba25910e0705311f5f2f541da6b71fd2eaa9f1177bbf7b67b68f6c9ca36cbea00076270803aa76194f6c91c00000a78aa0304d1aa31405a2060d21541fa2d6a041581c7b2b4ab8a01907f085f58200049c40c405c07892dbbdd80000000e3d7806d43ef0a6079154059a706c0bb1b698d74bfc5dc0cb25279e328dcef9080cc20914c10a043047000200374c430d847f006678553095169a6ebf426db240e5d5267f2b18fbbe8cbbcd8822c6da00056e431c4405a12000496325b77bb00000001c7af00da87de14c0f58db4c6ba5fe2ee0659293cf1946e77c840450a38a38608250020018000a21833e423084eda1e96aa0b3a447f3e66ce2ff38c609e4cd7ce7bcac1775ac50fc06bcacce61343f50002b5218c320c30d041868003ed8f4296b617c9375454e843f2ab2bc18ae382371c2fedcbe202ec6da635f2c949e7b2c949e7ac6da635c2032c62462061830c001249aa0506242bd12edf2cb9a7636fec419836084e7e5905c3974919a365a54ddc068bafe0e7d591e5757071f59778f93d7b70c3b0592cc5db323f007a137eafaf6aa396e4bdb19bf2f6c65416ae02067447d1550ad48608110544829f013d00183a7c826ab939e800700af6f6bba851d6f1800cea0180f42d054200a1e3a6720889ae00ba4e7f803259d08ec6f3d664488de2365646c38e1d0360000a988628ae72111265e34e828396f3f9d8443322c37adfae348038c2aad679bcdd7074a07d636d31af964a4f3d964a4f3d636d31ae1011429028e28a10e08c006000225c510a8affc899c43af7832535d7dd8dff31ef16ba6864a032cd34361e677c9d40b8c4ad509d4c51cadf83fe737365c24c5a851c9368bda00075a4310561361b0c30980b02e72111265e34e828396f3f9d8443322c37adfae348038c2aad679bcdd7074a07c074296b62f926ea8afef3f303f852409e4111946e77c800000001996360ecc4bac5204107439bf4aa405d8db4c6be59293cf659293cf58db4c6b840a60e3883062000064a40c4dd9bc5e8eea9667fa79b4516ddb15f3a8ffa0eb953ed67ef3612d4548a6a25962f78a248e57d726560c20740555b10562b332cbbddcb9446ad1190b646e300293ea397c8b51612795d4d2a03ddf39a7a6da7ea2d0b59149b83d9c5aaf28b211906ee58ab97b874b489891c2903156006fc3a47308b01cc975fe58248a44f8dbed5e8a04fc01fdc7b2b5daa8f41c44d33ec3ea447cd9b6ea8f02699a348f1100106d4963d31cd235b71006e3552a0e838700a81e1f82336261397cecf643b5a387a6006bcd1592b77253cd8053747455f46d2283d0a03dcf1e97e0c5eecc3ff27f2050108124368088135feadb37c94657316408c4000139cc96ddeec000000071ebc036a1f785303d636d31ae97f8bb81964a4f3c651b9df21011631030c18609200a00026e69f14533d3d2d96d49cc4e9e9593668e1ff224179e4e901429b0bb70c375ff6d16ad0b63a218ad3c7b5535cf9f829b4f652a41f5ffa71630991f68001a019c84449978d3a0a0e5bcfe76110cc8b0deb7eb8d200e30aab59e6f375c1d281f58db4c6be59293cf659293cf58db4c6b840450a40a38a38628418002645ab1b6f552ccb32261823fd5ff3eec6997eec0c7c24696922ad20819b3bd0d8351c1d411b34061df2090dd2f9ef8fd40aa90ca0578cfc646459ea14a431c3b1ad43cfcf061bc4a9be4f5cc82f25b634d62ee80023c90012e62040420c211000ef0104d19c0c34a0cd2f84ac01c27504211bb5fb2040a59f3c9b7fc4be0814e6a0f243ed84804f68dc1ce9105c90d6a3b5e0342168013150a1c962b5e5f2b97654d8bba40c877d7d40796082444daa261b02e00009c4e103f7a2f6b30c0a29f72313a08085a10890b80608a4371f5df0c008ada872e40a05f2d90d7e10802ab13f899a00a20028122f7667a5c47ca6407dd0d47502801c00010410c1510602682fc2617c0a0bd0140dfb01a8962e0e13fd0e0dcc14305b0c6350fa60a118af6d4118440055dd9dbd9d0e04076393de6a2803959e4297988a90d3518e50908821d3e948875719ce0a80915a02707a04ce8eaae8dd1fdda11e05065972be9082345596885409b197f249c9da5ac0ba279a61669261250408268040180001006f98000004274c30c3c3021c1a53c2d893d130a0ae3f65c0693719f3f1541041fc9bd8c1200000039439c008c0200002d46b404e0f4099d1d55d1ba3fbb423c0a0cb2e57d210468ab2d10a813632fe49393b4b5817)) <<< 16000) + 0x44f34d24c24a08704104d008030000200dd29e8ffdfd018504922104d349b6eac16ca612037f58770f04000008e3980917b081ba24000000744b3801180400005a880019590530982902c140075a02707a04ce8eaae8dd1fdda11e05065972be9082345596885409b197f249c9da5ac0ba279a69261248e38410450268180001006e1852290d280d29da5e5bff1850724e93ca349b72d3e2ca78400000471c9040d97ab7a920000003a259c008c0200002d441e81617803e30933081d27fcd3004982489184e2c142e32e5a54c240000007c374b240000007fa4ca0c0660f99ccf030c5b2b499f540b040e8ac9a5514e02618a83eb92a889002c02870503b550f0b2bcd042ade6821581c2fccfeb745302c9038e2ce28d28d08808b04a030000200d00013320b20bf340976f295b8d29947925fe98d260e321a0750c240ae3e739e891c0000000410f0c000001b9a8c0482eae3d73420472722ad0d470007429b3bd030908280180000fe900059c20aa0a00092121761b0a305d0f535f9719f07858c05e888d4348050da9b592b96e084846a2cc8d3b04e40002f442fdb9002000d8e8edb615218006d57a16e9c60282978f292c7c113881c80c00f000042472dd1d8be59293cf1946e77c840259248c50a48a4025802000349ee9a71ae4be576364a4d0700768f4eb8392a77a10e48c021500019635a02707a04ce8eaae8dd1fdda11e05065972be9082345596885409b197f249c9da5ac0ba2488408388506286382500028046108bcbd14174dac008627f2386dd1e113b3f722b710b789a47ac17ed8806d4fc9799d43189115d08c99590a36ec7542e647fa80394709834000d3c82306c10c0723c3c071198a2efd2aa021782721018657896a45ed86081ab7546360e1e2af2cc4c3cbb79dc329826b406102f54ccd4c6474142f06f0e0508005127a6171fcbe7c8d77477c100a354657b6bf86c47088b7f78c10078b88b27305bfd93afa41ac7404a76f5e0a87d7cdec6171348c12a2a44dea73b6ebe94d1904300007b04006dec85d16f2dd1d8be59293cf1946e77c840259259051050a48a50848840260100401b64e9d6877012858dbcaed4c48a1789ee7f0a116c7617ac1223162226260c0167fa22d208006b8b8a6c9c108c0200002d864725282328cd14555c8cc56d6244c2ce73ba4c20446222d41c82431adbb6b0272036c7ac772761c260dc593f9418003df799dea0006eb2046a95010500380001f236401bb1f40aa6600288b85c6e0741e6a841055771f9a47ad90a148a8a461217e17122e17a498f81777628460dbd0d2a76eca488467496c65644186088a8a419f67f977a1202000dc1514471954be88450abb5bce9d8922eea9e1195a508c715ec7451221a8ad1a8a0304513087fb086001067002020800a97a8a4ed2000980500003686479a333c15d0b228aaaa65cafabb8912af004ae04261026e63f16f5ad824357f5f51d72c64069e5a5007ef187093a81306fb160c0001779b00ef201c93d7dea0561b50085e07000023620401300068120c822cb74762f964a4f3c651b9df2100944143923922102121901840180401006d10b52003edba923ebdcf26ec6a48c009f183e1d922413bdfe0548408b6b27f3fbd1018eaab105a1228443a1468da402001a7b259c4864402150100000764c0d1ff124b415d2058e509b293268c280e8da943a0870e2931fd055ea40535f1bb332431c20aa28be81b00a000dce73734f83e83841681600006f485c84c2e0040009ce42dc4416c120b50905a0482cc24164120b1090580482bc0415c0200110a209a730ad2d85614c2ac96154430461d8548cc2a057444a7ea51d6fb08180ead4db61d88009e34739050c3810823c949bfa14035062cd531604000437edee18110111998bccf28c480383712528005040031e02301d00d1be6b2f99abe265c2d03079811f057ea619e7a8c8946942ee291545142fca83ac082e09dc85c78009b806a7300100042000020080000223c00129917f0006841490192042000400003d10a70985304c2941606203e041c54d2e4824c2fc79320763238d9360b9f1db01234efa205de85c9f68f4ea0799b2312c276f7c87f584abe0aae85b86b0cfb0c3b35304aaa81ed9e6ed1b072c1848afbf4e027529c6d3fbeaad1ee86e0f15ae59cc9105a94b45e29b2a7c2a2ba5d099c7aa96f4b46d47b2c6d7ebb935e478db28f38689347165689a941e2950ad3ea412b1c88b741dc9507a1480a54601dda71f559ccb25ab699a759ec4153c5c3dbf3f93d80686b1c83b02c20b6c8115da40ed5207d5fdd31de633699fa246ca671fb25ebe9d2826a43f105cb5344bde7272c605ec5be3f596c5f142160a57243f87aaefb8e467436ff47a72828dfd6da70afcc46f39dbdfb8837d9d8014803e240644d620839dc65922c0004c0721401c3b6f10064101d00800006690320500048490a305f78076e8ba402e01d28b4a9a3ea7101d99e85a87117613cdddd83c1a000000000000000000000000000000000000000000055372eb3804ef0771ca04f50540000000196e8ec5f2c949e78ca373be42042432423000c001b9f36391b3303ebcbbdc43f2ac8e68de15df18d41242e1112b180084aea5e5f96241f18b3ff3892eb33c6bde66fbe1bfb4de991a68e6474b7191923e374b60aa3d696e212b874be39a52d182099c6e2c33d275ca3e9381b66c1e1796f232abad38ee929757d3f6f57f58cf07411df404da4afe842728ed00066f303c64eebf29630d654e200c20e361aeb90140f48475100910afbca1)) <<< 16000) + 0x607e92c0ef0802c138cb402a8139210004000059c84d128288661422b0341185006c27c2613c1309d0584e00ec028a2bb8dc985d6347ebea6780ddaf1fd470cadb45809fd683acafbf7a30f8aad20df309901b7272fcf7ae8aa201b83cc46ff39b96a6b08fde464419d02084740e1eb5b15b637981556c64f461bfb98be33fdbc5957ee60a642106e1f81c6fb61618d4c394d38e02a634b271bd00301cd369ce87039fa2428d3cc3e08232e0e8556b023b8c014057ca164c87d67b04a1df3094fa5bf24e21d96aeb7d22afa9690aec556f0785a23fdcb40cd25df46e88657d4101360be199acec990a005a4dd81c00329d3b9182308200084460edba25670ca9e4f30ca081b374f208100d1dff00829358ce4a0002a9d8d112c103e0080001273a2a69c6fb410287daca569208265a63506080293122020c91d68c30e018a817e50800337b6b12138610004000056c84d04c26417e3bce20c5c0c316ce4980081d75fd4dc8c107c021e3c76d200f9e18733b683141809222618e007040e61480040010034010000731e1a50182c1840c37e54728c04052a2864e03c284fd6424082000800006a9d169409c17810493f461607006e68bff4300be33543c09030800200001ae40cc44130120003b12000eae425c8605c3b09609cb84b7cd72ecdf9529f4f54f1a9f092b27008cdd38dc40b440b8b7e84d7f75b045485527054cb1480ca04304b00800000cceb885b86f51299c3ef978cb476e83c620f97d100cbd75d375393f5fe9aff26a1b4d8fd8926c7fb8240a90eb2b42749df7f8419d5c585bb07a885cfe090b20e678451cc51a00270b1f4dc5dbe4f428712bb5ad0c0facba80a161040c5ca76264c79e9aa6305094b26ab952c3561b702e01a5002a37d459c1c4809fb2ffdf6d12a11c4f5acb7efeaa598e2000c9388b8fe4e777a8a6bdd4539c628bc077a20e5f83d526db8622ed3a1d2d744c08e3fa560f71e1141e6d72105d134345cfbb214040313972c9f303244c21291430f57a290400241c200084b84b7cd72ecdf9529f4f54f1a9f092b27008cdd38dc40b440b8b7e84d7f75b0454855270550aa38d821d9aff345bf541543453011c140030000b252f670b4aaa7c42f449f4342e6985bcf85ce399081455b4102b7dd1d20d3a9f062e52138cdf0cef2e184d430f6a398254500035f20008b2400243c84a8a8003004c876fcbd2e1b1fd4a7158537604906e7870f0712124526ff7df738c080fc35a794b1587e2bac4417300b645d858689d9224882c93582805400d1974727799b5d09b4d8300f4e1a36810a334c5fe2984e800822a1fee45536e0cb87c127028a63c385665d9e8691988b1509a185b4c9c8f979dcc60be2000003b72128430931d84908c244361200b821acba71cc026c3e500241038008926406963782088cff40ba34004de643e91821080420000200808f0100001b90000fc3613cf5cd0040916b0e6e581b70f1370230c1d008000051180800802000008884704e00802008b03582d15f21041e00800002698040080200000888468680d0341181a0001062074238034a2c78400021201c00800002c908b2584512c224761101b804a0eaf9ac87af07956ad525ed87720d37065f1db637b4f0dd755bd52697fa914989b279b4217242050a7a22b04437a27aa8e71f08b311040fa269b68f3c8554b735ff6bb58329599cd0e88ab1016029bc1f686c0ed0d680c0d3751ad357d079ec41c7e57ed1e74fb3a6bc4fe2d8662122030b378940217eb4d7801155b0362e0695865fdbefe6101a6ec74bb45559aa084fb3061548b9370ec25fa517f7a9b1ab6c04c066e76b116b14e0ef8c7b0e56a4b511a5bc7ee017a8c9295d7ff319096a1c3ca176759c3445390acea710229e64ac9281eaed1701540688c10d5940080021c4769a012870f7b82df32819e923fba3001e00800004f1c1088755402004260f6fc960418cbc3ac600400100870100005c908609f8a01a324f461403e47f81e1822b75a714258f83300282a3f07ce4d0246ebaf784c103e0100850500009e106011d883bda1e345851ab8c2dac4084001080880b8359a5885472e724185630aee0c1830de0885c6000eb53b00181edc33e444c084001000012c302809e98561419dfce5b3281b4bd5c76103f8a47960d0199949ef90013a4eecd498207c0200002504210141060a00032f3c400b0325020314feb5904035065b290a01d7b8511a048203e010082090408280003fc81a0880022108100ac0e8578351e2dcf36083eb04f07c49364df323d486e7d520f4746d22eddad6b7f561181972a29b00effcad53ebaf6a861562787887e27834dd4276f5718fad3f580102d9a0b5bb6908803012b1e3288a8549c617ba09ba44878dda8bc6cb55f87090200a91c6cb95e64a620f4a142db34338ad0a0e137a509c0b0ef99f4b729b80006bf6f469591619f776f7aa3378b5287c13d72628958d2ea3b8ee2c875ead83b839be4b80a7c804dc13ff17999ed6e5c6e6a1bae21970752d7d42cef3480002f110801d000a789e0a076aa1e16579a0855bcd042b0386e5d67009de0ee39409ea0a8000000032dd1d8be59293cf1946e77c8406512508402380300000882059eeb1363c9076cd512e603dfe16486c3aeb0b022f6038b100628fc8574124db7ace8439452260755915731322b1c5f1414000d18d568d5b57fdc747c7f13e06bfdd13d47f3a52faeb8d99d56b3cde6eb83a507838281daa878595e682156f3410ac0e12035dab5c201664863026002801800021d73acd6b7b54c02d6fb17c87)) <<< 16000) + 0x436b968b1698c0d4fd5f79e30a1e8be825826e2fc1b802e82716d412ef9f6aa7221dd9c4946505bd5a0958b4d00121d7f7a757c23df655d15718cf38d387d0752a1430eb04f06a9e7098d40012c483f9e81f8340043f6400ff508230cc10c07822b95f6c7dfa3a319649efdfa6b114b9741037b293ab5c63fd41d355ec63579e04fbcc228704700a73c08dd03013c6e58961bbe8028f2c9db9bd8dbc0af443ea1e0c020620526e759feab5694e26cd3ecdda3d4b035f90044001022ca0d2689697549438399fe6e9d124062998e4f3b73d66ba7ee8eaa4b75c4c646d1f2388606f216ddfca141eedecfa05e7498c29d9a14fc6799a9271c4272affac0118d53240dbe592287cf72c3a14759795e42b1343a001760b828e8f00c4ae4ca37071cb0571b5e36c11e30e0aeec493161bb120184f4f7dce2b96f438821c821d0202551aae8bbebb16938cebcaa213fa78486e5b0e5cbbb5e4fe57504f8e3fedf4fa1b504e687f3c7f4106222590e053f2fc3810822c4c1767b1cd1b8949314c422c55def100a14e94563cead93d5b7ac4e7e567c0842d5c6bda2d9b2510dbfd92e0aa8475e64479bb03611c0c97740b436a9464508957128bc4e290e6b39da82515a4e8599aee23165372547f13e06bfdd13d21bd6fd71a401c61556b3cde6eb83a503e18ff66e6076b62c990ac4d1281e9075e3d39510811a3a5de4f0000000000000000010d6961f71c6e40b374e37102d102cca373be72c949e78ccb1b074ca373be42052041042811c1000a0230e184fbf4a0ca678718bacfdc07a5dd92775080d83ab31b29c1d739c1f459e78eb482362883f873f7b00078c8509d19737aae4685f4064516822c079b3ff160d1301e2cccb4f08a8a2b8bdbb254b82be7f090d55d39a0d813a06bc329b59c9b74602986a5dfc1353b128acaaf4382622ac0c9010dcfad2fc01aa0c3026f157d3be2141086ccc31a652c956b748116c1616fadaec9de9900525396782c973544468a4b17f4758442a4f78c86016f2f05410085ef7f71cc94234d8f1cbc7c00300008018c101b9302f9add76e4ec4d626afafac10f99aaa7a005cb40bd893c88a2af02b66b8f968c008443e10b03b9e4aa30f9c3dced87878e6538991ec000290907d2183e0ac1ec460f40bb335dc462ca6e4a8fe27c0d7fba27a437adfae348038c2aad679bcdd7074a07c9c84449978d3a0a0e5bcfe76110cc8b0deb7eb8d200e30aab59e6f375c1d281f05f8588685f9b7b7929d087e556fe38da300466f2738a60cf1f15425725409e2addbcf16eb44cb70d9600000000000000001ead2c3ee38dc816a59650c30c4008007593825dd0c00dd2c774b75ad578e669e4651de1a9e5dddc7496b37f29e36e5240b4416af34086d2d1ca729788fe4b182fa0f2d2f00047a691d113edcd4a258e76f814632bf13d55a56fff4a79aa6d065038576ca3d62812eb8be32a42bc760f820a6d4d4796ed0e68985ba6c3511e4f18409e59a18104713e5ee116008edc58d80000485040010a2aaf7ee158506381bb4c93401e40e3d8a91861080401e4160f00307701e19cf7d53a0102e3bbed10481905bad5aa46184001007405c40e4dd3d4c08860f00220000200807601f81936873dc84107c02000009c41d41400016a4000484c10de5a3a2a30009a35de91c09b568f165230c2000803a0081cc040001ac4000bb4f1d277ee65438a1118dc67a00215f31f18b002f4d9e0ea481842010072010388081c0040de0200012f20682206e110002b49020198368af0cd886cfc63083062ed8d1c776ceeae828008f652f824017c1fb2d11040025342000800008b90007c53a53be96dc6ecc4bdb51babc992a92f532cd90076954651d7fe61d90b094637bdc9d146b73cb72990691b0096192e515ef8656a02f1b1d896cf1400433edf802be8f434a134cab49b8f1892e6284eff8c8896caf83a8f4e8e536654771000806a7ff2ff53d9205bf7114673d5d76084162f68f1c5f60c27f490ec5d433381b439e9bbb61e5d5322751f30c2008f994b5bb1868154975e365fb87cd9a964b37a69ce5f0940061c7770caba1556b63ad5888483056819c15e3b6400013fdfa75852ca576fba5ba0e010753bf8735cdace4afed648f128aab563a2f5e033b95a49dffde78f18cf599470000e8041b0272035dab5c2016c2fc9dedc93407b4c7056fc1da80993cdebb906787f10d000000000000000001f9ba71b881688167c24ac9c1f4f54f1acbb37e54a4b84b7cd611a1249229a01000c000037ab9a9fa5f71ee46f5136efec6ac97639103366a485cd5f8c53bf67126ea5346c005767588d489bfb33fb4a702c25f40985ab8d7d72a2775cac90b19bd4194d408e5a0d62a06a110348681a014000978419c3400373e4009da4e0853337a173397a62de8dd472c104edd60cb6775613a11663e0281407e2a143b665eadfa7d7c59d300032ff2c8d1e4e1e97dba96f8e92dc2747564a54c616152897c47c7b5593ebb5d6921122f74680004163d8f79503a204c85ccb4900b729b551a682c35da6543efab60f68f06940e0d4a6aeb4c2c41303f6c9bf09ead06a8c22100004172006d884022d24e3fd9b981dad8b2642b1344a07a41d78f4e54420468e97793c00000000000000000435baf4794a996087a174fe6521d9bc62eaff5c20929e0a0d8c8800000000000000000000000000000000000000000000000000194840c3046005001000055403663618433ac1ece349538ece49ce27d0786bcf7d1c4d6c86e2fe55e9667e8bee4e4e75f565b4f5760ac5171971baf11)) <<< 16000) + 0xdb1331ea00ec91c2446414d20956df2929019cbabbe4e6fe43c5f1b5dc98a035db3c4ae928832645305a0005c012acce5f14abd391f391a228ca54c982441effa3b485b3d0cd84114862d1d0e99a88fa186d8028df561655228003aa100953520189b46ab59e6f375c1d290deb7eb8d200e308e5bcfe76110cc8a9c84449978d3a0a07c24084043842841022000a95f470a8a64f8c037f97ab70ab8fe1e41f547caa0861dd3f77b1d12295637eb1a2cb752df0b8aab64004ee9921a003d482dfea1e34e4cb143c158ef17da097b2322dc02d3fb97705e9a428349e6389d1fad56b3cde6eb83a521bd6fd71a401c611cb79fcec221991539088932f1a74140f85f8588685f24dd5156cc0f7b18c3ce609022b1b698d7cb25279ecb25279eb1b698d7080ca1071040c600400031d6a1f0da2b77c5d08b52fddd8b3e03d8e639f3435cdc69a1990a19d2088ab944654860ef726334cfdc699fcacdc1c655c8b1064103eaa30db21a87eb37b290b5f3f26e025b81029953918c7e828477fd88591137d2287009483c5f490b7e90f5d223e832cb054c458f8b55acf379bae0e9486f5bf5c6900718472de7f3b08866454e42224cbc69d0503eb2f528aa00902e625d6290ccb1b07400000000ca373be420b1b698d7cb25279ecb25279eb1b698d7081071040c504204300038568f2d76fee6031bf3487409590b865be7e8df2a3113ffe08a86d5a64fb7fe1559005040206662438d4072ada986eb94b71a84c1f8669681cbdb95264d2ca8f7ed9d19e2b03a988fa09400139cd0c3bc983228d15b934a11a128fbed00f83d30e22d64a146080b4c6c10389e06ae46f8138283001e7e3255f53b1a9c4002f745b736b09eca02022cb909b9d313aee0035c86e8706bf9d10dc644c7330408df84b25a8e3471c3f08058407885df726ff14aaae02b00e945a54d1f53880eccf42d4388bb09e6eeec1e0d00000000000000000000000000000000000000000002ad8db4c6be59293cf659293cf58db4c6b84064883882065021800081e418c0b21356f4970d79b8bc1f4929b42f4a1e84184dbb494339e16b0972a05850b0536f9820ae7021fcaa2eece67081ccf1868c5b5f954c5afd8a5ea8e418e2f6ae167f07c946318c37edd1d777a7df4553f65c126b852021d365f927eac6f4bbf4c1432c46e60ac5e71485e02451d314468003141066190328a80c0340c21204f050004c2100145b20c84b06311f08f028df6ee6c14244ffb07bc6b0806c320dfb84e61400653d75e178040148950f9df2600319a1de090216492b60b40247fdcfe36e3f8040260890e51e880cb1c0623a1a37445402e038556b3cde6eb83a521bd6fd71a401c611cb79fcec221991539088932f1a74140f80e852d6c5f24dd5156cc0f7b192fced9e02250fbc29b8f5e01b000000024b6ef76078ca373be72c949e792ff17702c6da635c2042841c41411801000068346905bb4380ba5881bbc408813f98c2fa497e1dbf31d10528896a8ef1ea02d5c82d8f5a519e050ac0810b0eae7586d43c731c3f19ec002c45ef49948e0993658afc2c051d5c465a2e7c728451fc3753d52d4e4c2d080000055c84880021dc6483878117abb0c2828e690516c481083cfe25c0803222cae5a00008518b0900500002b44188660c21b06009c88385fbb5e90711879628e321418923aedfc218011328fa0f42002926fe9740100bdc436a3800140a7967f48173049ae4c14f86f0b74201d9bf909f16c6302701c50fbc29b8f5e01b000000024b6ef7607a01d28b4a9a3ea7101d99e85a87117613cdddd83c1a00000000000000000000000000000000000000000005523473073030c2300022b284edc003fd5b8ab9ea879fe5fed17f6ad481f67b95a8e7b26e7fb8c4b10f40add4c7a89d6b55e5de9a7c12022e00d58c868a9687158e2d9804cb50f2ad3de232c09241631fb385f5dd467ce7947a6521d66b8d343a025c9a755a55a8c7f9c774715e1642c6850e77069940a48080e43b7d7f8a10774ef92450c2274ff678a80830458a45b187002fac9aff30c01ca0e38ba9504c8818270200000e5905f09d0fbc29b8f5e01b000000024b6ef7607a01d28b4a9a3ea7101d99e85a87117613cdddd83c1a000000000000000000000000000000000000000000055989758a4332c6c1d00000000328dcef9080cd1cc0c808c002026f49e6ea3304486b04159c42dc06e7a81f92bdf8966dfa3ee36956d153e6c211e5abaaf64a28d562f2ea89335a4c2e10862ba5eded8d3c8a069555fc15e499f601b5bcbfeba17d34382c8db1424f120ba3da9f6830828737b9a7c44404369139e7c3089246f461900844abc5130c124313ada43803f4ca5ac4601250768baa520208c0500003404178340ba1a0510d01006817014000e9c416c37a380000112983c709101f981a48051251a10742acd4820abdd567c180165b1da29400000012c00360020990171c20004629f09dd8a7c276838281da0e0a07703c279271270a7884847827001001cdbadae9987767c7a1851696abfedd97437b980c570f2d1415ca32a83c918feb4fa1c4e84245790e140059b83a7823b2bcae004108f308c912000ee8891819c30840200002c47c91f62c3f4c176e713b088b2ea06cc0f18ec52dffd9f5b9c2b92b60cd401e12420e831ba8f60402823ec57fbb3e1dce02cfc8338069981800e180cb3baff00801a839f1b53ea1e8481200660a0a280a8255207925bb2c836389b6cee2f498480e522024a24057b989630609b8ae55281365d199a4e004201000015c20b40a0)) <<< 16000) + 0x590502c02800108082b86815824000f0441543700e945a54d1f53880eccf42d4388bb09e6eeec1e0d00000000000000000000000000000000000000000002a89839439a31431819a10609800180c01006e91389c6af6e0e1d0033292311a2363a9b917c38316b016f8c0204155996870c8042f8daa8221a05422c98ad42c017176db1bc0802b70d6ce28c8904270207102bd0777b348c89b954196400dbaff64e141b52bf4648415346d8b2504210080000821054090001941053110290881444404022050050002cb1000ee5205a1a001dbb20602a04f05001006100276f20053bc41392609a8b0030174296b617c9375454e843f2ab2bc18ae3823328dcef900000000332c6c1d989758a4081f15b917ee380bb1b698d7cb25279ecb25279eb1b698d7082ab59e6f375c1d2a3f9d297d75c6cce3f89f035fee89eaab46adabfee3a3c3c51441421411400036754336993b9cf1a545e9f59342e1929549b866435217a1e969b6e4a5c4c52814e81888a7f9ac0587176a642dc4415c8d9eab4e737e95d915c471e40b6f57a05a3ceed36d7afd574104a484a668d5a20032aa44142cd69846e283a544e54420331a639f020020aa49d1b51bdef00012900f804013064000276412ca6094430491dce42224cbc69d05072de7f3b088664586f5bf5c6900718555acf379bae0e940f80c79aa50d41d8eb8ea17a9c53e13b81e71c2fedcbe202ed13df5f095c0b41031411010c004010bba85aa2d60f0d22584461fdd34cd8bb4340858fb67a5ebe56696fec341a35e00008f44b79581526b2ea7995927defadbe932ce62ce8fee4dd64aa2852d4d3e8dea0008844120e608e720460982280c1100408603915e04fc30eedd415db2af3159b1dc57b2f0f5362d868de31187feff1324211648a74bbe20ee70e0be9d5be0cefe37df28d1fcf2a506527aa11c07022621a4ee759f71486e31f7e47fb2751d65067fe06b56e546eef74501805e4022b9c100606febcd513f07268ce0a694103fdd5629f8009129a10008b4ccf739dcf973078328d6edfbd77719a295aa8ba63ec2ed4678fe9004aa94f65cbe527b14dc2a226cf5a69e6b65ad2789fcb447a451fb4881020ae35986c3c0f61455338916ae65c2e641cc7eed2b9fd8e7cb4316ab36becf9448ea654e638a0a6537b64170e284f265730f4f912378be1d0a5ad8bf36f6f24fef3f303e02fe9eb808d43ef0a6e3d7806c000000092dbbdd81e7597f42b36202d6961f71c6e40b43081452011c00001000217d5fec02ea77c2134f6a6a53b0c444fc8253447e41ef82d411e735856f8f4263dac13d9c84d35a594d91595605530c3296d0692a340f18eacb254e764a1ec6789c77e0f98c325dc63d647e0199622df5058cabb86110dd587f9f4798272fbb162163df019a3ccf021c5cebbbc1f435a73b0375bef63dc38347e26cee74361785cbf2d33b81a2c8bb6cd9b491c0e4f9a348392d3322cb6286bd1202c7111d365ea4827eb2534b3ae27e940481d08705fda5daf8f42ac29129902c2e7020014723d03f36e44321228f82841ca656c0ed2ff657cd83f65034abbbdb22ee1efd0d53c873cc80635072c570aacf77f21625af868daefa8613af6c91163022664250a3b440c005c08c260775f34850904d8176ff96037834fae4240c1f0086887c4d7324d0ab8d5df994109af99c4081da6aae9e600dc17705d25081f00870a45c0932858a8241d81a185c0e12f9c9002cb723441018391eee24a0840010e15139fbcb9c1f7acf8c30c2667efde0c6083e0100000a4200037c4000b5482106c05c1721a1c98530401fbd20d86580d9fd2120023101f00848304040e5e10188cd6ce4cb060ddffca86801a638ef42404210084060582dc223862aeb6242702c41cf4585832487fb77200100040104040001cc4100276388ace8b42470559dabe38668d9315c7090394116100c5221a163403d0913404c083e01081136b145e101a91cd2a1242b67a9da11800f80438922504d1260d250f9360d09b702c7920055a3084490007c02000019a400062881f828000b7c800274103b150002e110341101d0880027d48100cf426d90f6e2505ce0f4b508002aa28208e071ddbb9e441024241f00801f0080f404000212400472481a8ee050020089035a51070044406c01100801004400a2547c529082108043c0b235310f1001f004400004010000044400022080007a103a0d0000a3103c158100ac0c84786d72037d06089dcf5a4601357b905920026f626600120c0f004202002008b0c95e29b50a18819b453380f4e64d02046183e0108000080200ec0704400829a98515306b97547801c3a81881c001b8f2d4920210804000035ce0e00abda48e381d9e9d460107bdc04846103c0100000a320003ce4000aa881d068000bf0818848000ffc81c9080018788179680b8a40701a00069a206e7b03609da587dc71b902e2dfa135fdd6c11521549c1542a8e3608766bfcd16fd5054f84959383e9ea9e359766fca9497096f9ac2343842811c12c01c000b25402bdf6242928c8a38df2b3fac4718f3e8d7b51dcc475040ae13e1c16d738a0d928f576bac542f890a85308aa397e535e133eec9accb0c4e5cf2ec70c913051a440c3d5ec8dc4009070800200001be743b7ef2245e84a958da0ebcf112398246fe3e00d925874e50474578bfb67af303b97dbe4c56dc19fa90f5ef7732d09c6082e10a85dbeff8cade0b4dee38e83d146d1205e2db9600e00f02f932b7150bbc513c2071301b2fb88b8de631e676d10023c6387fadcd00936b575fc18)) <<< 16000) + 0x0b2bd25cfb68ca906d595392ea0138e5f9c218b67f7d306bb6c13db696841664a000047236961f71c6e40b42a8e3608766bfcd16fd5054f84959383e9ea9e359766fca9497096f9ac2333081c21410813001c0000266c346dbc2aba90cc8c79d94dbbfceabc3e02bd8c099b6bda026234491eb819472faecb23124f1034000b1c81a8af841a292a5f0810aea65068308020680307016ff9dfcf0240c2100878b54c519b8104727d960c20278968e465806da0918e12041000420348acb109162808753dd0a10a9a581f8c004bad90e48004001003401c0637b7f5ca101015c645c9020f80200001e48000bd900026b20662303209f0924057692608083f54cc18278d5d28a2804f76d1f40481840010f154793b4b4c144f19ca04a08076cd87c4083a7bdd0420a42a3a2d125082000858c02f1ff88f151718ab79401361d8c0000ece338da14081f00400006810001ec204012031010001841c006592d72e13efd97a0d01ca7cc06a93ea57ab4265d88514781e38e186cea9d6188964861f188a4a1fd5acf154100898b0e95e9d5e6f26f3e6a8366441d7f28930986e2341ed0e5673f5a5bef2f15d4582ea0def418d112a567f85044cf7682367c846578180cfa72a18f73be11588d3d5a0e82135d315b1290e2148dd28ba568e0f4b66a7d344380db6c56bdc78462d37a5460cc97fc08ef7bac7e0de59dbaa537eb610895625baa843e5791acf35fc16432c4a18030090002e0902f1d0170c80b42400199240b0840563a02a110148680a01400324c400d5dccaa9449be04860776105405540c0183ba3700421b95e41521862450c32421c01801401159a724080e955feae4f87cf59b3983157fe9ea9bb41333b58dc91b050b41551f1d6b8889b71682e2be3b7291846bde0491e838129285e2541cf84b0fd1f774aa5ffc766d4570ec0c004350187232062b080be7db6241153cbab66eb820800bfeeb1147c66b9c1f972013903edc62fb6327e80f7a5095e81f1cedc004d4ffe71ebabd769a65441a1cda00b562f3320624dbf5ee1f7febfe24c64d28028a94d323d9babbb6d5b8e225c95e140355a791f20657c570e6b9802e1213483dd76f89082787f123017b2704c02cbf6e362806d6d5b0018c407402186c20eda20c07755f9ca24107b80c3919860f002009c04000170409817860c54376c180050d04ec890007bcb4220016f0ebc28240421008400004011a6f9af13201a5047c9dc49838bbf33be0e38bebdd2c020b8372534140026e195fcc004001000012920002cc4094240480a02305011008000aac81082800119c8004d910202980f8e80786403a2a01c1100d868068240321201805000646100497c200ab1c65a215026c65fc92727696b1da11e05065972be9082345556809c1e8133a3aaba3747f0000000000000000000000005d5baf4794a996087a174fe6521d9bc62eaff5c20929e0a0d8c8800000000000000000000000000000000000000000000000000194860860450440430004632f6f5c3a7639789cc7c9c95795613a67891e47bf58159d9abf10a91425fe46e7e6ff191600432dc6a8f3eadd6588d4b9ae6b59007f31d4329df94a1cc44a04eb3f934f39f8be73114941d275520a69ccc9714c6098591fa6d7e6e9835209f143dcd3ce801c031661687161cc3b88ec1a79311cab1eeb0ac1647f2612e139087c7c9d82d5f665ddd029caef668a62c91439a78d2812b2d6737ca5342c1dc7fb37303b5b164c856268940f483af1e9ca88408d1d2ef2780000000000000000086230838630428438228020002b64108a596eed82d5184642bb8876b51c48cc19608ff34a9c05de8d4df2a10c217b5d10b4e3924d90b6dd7a3ca54cb043d0ba7f3290ecde31757fae10494f0506c644000000000000000000000000000000000000000000000000000ca238e38a38630610430028020002a182001006d963477a13d61454ea291e46c51000c9ead7b963003a14b5b050c4d8e4409e92300000012a828a0000012670a00074297c880001bc90958e052104c010c3068e1438582cba4735d04b8b24000000842307015c7de578b1c98955a1650410dc8fa527070000000319a08000c9eac36e800260084b442a04d8cbf924e4ed2d63b423c0a0cb2e57d210468aaad01383d02674755746e8fe000000000000000000000000ba259260e58e50e604304482581800010068001021017010001f29b2c148a434a02ca0ab75ddaeca2ac78d89fea2c6015c7cf350a18989560059202000000471c600000003a259c009802144222e09f388858c0c8cdc0fab9430b8202a003058a1919a6f28e90081b835945ee5012c061c627e920000000749a190e00540400001a1202c02015010001b2901405d9622f610375165013e37c0245156ebfe7dc016300ae3ee45250c4c4aae582900800000238e300000001d12ce004c010a21153cfd61112c60832d798b68a184f086bcda22c51065a69b088808072670f77e0414a3e2d0de48a0260bbfee6a1240000000e934322000a80800003ae6cb0a174fc268b2818b973b0f28ab586e9a398b2000000109d2c6015c7ecb80a18989559026180000000e50e700260085108a9e7eb08896304196bcc5b450c278435e6d11628832d34d8444040393387bbf0209f594095a34501305dff7350920000000749a191000540400001d720006e2404c140240a0110100039e10100d0078280043f48009a59001624201c4a00d210060e802c640142a0091100406801c3400c1200501002008007df0801908008440020200001005c259)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase14" = "QuadFullSixCase14" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase14 private def zz2251:"s08cb"="s08cb":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l15 l16 l17 l20 l22 l23 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l5 l51 l54 l56 l57 l59 l61 l62 l63 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2ad8354ed, -0x1da3a8e28, -0x2b8329d5a,0x498], ![-0x1da3a8e28, -0xbdf2c0b1f,0x11fbc2a7a,0x2382b2ac4], ![-0x2b8329d5a,0x11fbc2a7a, -0xc0a7cbabd,0x1da3a9782], ![0x498,0x2382b2ac4,0x1da3a9782, -0xed1d496c]] noncomputable def hinges:Hinges:=[(-0x3b1d09a7,l5),(-0xab333b58,l4),(0x2be58046,l9),(0xbb55166,l8),(0xe08e10,l10),(0x27c8934bd,l13),(0x1f2caac,l17),(-0x333cb202,l16),(0x1495a3f9a,l15),(-0x27c8934bd,l20),(0x18f9e29b,l23),(0xa0cc5fc6,l22),(-0xed1d496c,l27),(0xed1d496c,l29),(0x5d0c6f70,l31),(0xa1f592,l30),(0xed1d496c,l33),(-0xe08e10,l38),(-0xed1d496c,l35),(-0xbb55166,l36),(0xed1d496c,l37),(0xab333b58,l34),(-0xa1f592,l43),(-0xa0cc5fc6,l42),(-0x1495a3f9a,l41),(0xed1d496c,l51),(0x3b1d09a7,l54),(-0x5d0c6f70,l57),(0x333cb202,l56),(0x47498d8,l59),(-0x2be58046,l61),(-0x18f9e29b,l63),(-0x1f2caac,l62),(-0x47498d8,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0xed1d496c,l27),(0xed1d496c,l29),(0xed1d496c,l33),(-0xed1d496c,l35),(0xed1d496c,l37),(0xed1d496c,l51),(0x27c8934bd,l13),(-0x27c8934bd,l20),(0x5d0c6f70,l31),(-0x5d0c6f70,l57),(0xa0cc5fc6,l22),(-0xa0cc5fc6,l42),(0x1495a3f9a,l15),(-0x1495a3f9a,l41),(0x2be58046,l9),(-0x2be58046,l61),(-0xab333b58,l4),(0xab333b58,l34),(0x18f9e29b,l23),(-0x18f9e29b,l63),(-0x3b1d09a7,l5),(0x3b1d09a7,l54),(-0x333cb202,l16),(0x333cb202,l56),(0x47498d8,l59),(-0x47498d8,l65),(0xbb55166,l8),(-0xbb55166,l36),(0x1f2caac,l17),(-0x1f2caac,l62),(0xe08e10,l10),(-0xe08e10,l38),(0xa1f592,l30),(-0xa1f592,l43)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x2c85e00d9808000000550b003b3010000000a21480b66020000001444101b0c040028249c430069200a0000008434140e40080000198641603a8018000000188a40d8c030000000340f80698060000000641e01d300c00000000000e06400800005b1c8cc0d100300000000540c039804000000000094092008169148043009c6803000000000261c0cc01000000004a0e029804000304b110c099401000f49c818604f68028000000349840d8c0300000000000c0290040b24a2020c06e3401800c49680c604f680280000000252103cc020000000492081b18060000000000440d20080000000000c812401000002023840648c050000041c738069180a00000000000b0320040000010439007260239210606e0073050070000000491500e980600000009629025300c00001011c201a4602800000001909024c0200000000000481900200000041084048301000000000502812601000000009824088c030000000000140690040000002504408230100000000000481240100000000002102c8020000f22886603120080000000000740b20080002b0480b013a80201420a4042003350060000000000260290040000004d0480313010005105704400da80280000000130b018c02028814208800c6a00c000000004c240630080000000098500a6010000520a81200f50040000a813828036a0080029828826012d40140002e0500e00ba80200000000009802480300000000001c02900400000000442406300800000000038012401800000000012014802,0x120310040001f03c08407840100001e0420d01388020000740d02101e10040000781082801e20080000002105003c301000001051960424602800000204640164c04000000408c2046180800000808cd01d23014000000000d1606600800000001915028c020000000311481118060000000000b8052008000000e6090124602000000000005c0c801000000005c3a0718040000000000b40920080000000000e81c401000000002d1d034c0200000604b080c9180a000000003c140d300ac3062420402b9c8038000024a3ac0848c05000000488e802c98080000000074140a300800000122388118602000002423b40748c050000000003418198020000000000540e20080000000000a81a40100000000001d024802c0c2090c100ae7200e00000000882c0b3008000000154180266018000000000260148020000000000098190020000000000640e200800a78cf14601e2802800000003221038c020000000000620490040000000000840e20080000000189081a601000000002a0f02cc02000000002a0e04980400584a086301324014000000000b0e066008000a610819012d0040000000005c78198020000000078480530080000000078481a6010000014e21c0930c05000000002a2207980400000051114068301000000a510a04986028000000000070188020000084210980e20060000000064340930080000000000500a401000001c23040648c0500000004310812980600000708c100d23014000000b048280e801000000014884050c03,0x104188183180a000000000014092008000000420a818c602000000820ac0c18c050000000000620310040048871843020640140000000001180c4010000001043300a0c0400000000004203100400000004609032300c0000000078500c6010000001444501b0c04912408041808f8a00e0000000000d80520080000000000360640082081811440244d006041430c28a05a9a00c0000000000b40b2008000001022080b060200000000017c02c80304063281940618a00c0000000005c00b200c00001330c8019260280000000260e03cc02041631018803b8a00c087861030809f140180000000001680e4010000000000dc02c8030000000001a005900600000000035013200c0000000000c80e401000a210618803c50050018c118158079200a000000000014062008005288b0d800b0802800005a1d82409900305863863040311a00c0000000007830330040000000001500a4010000052198280310030000003182404918080000000000150320040000000150c81c60100000000002902480200000000361c07180400000000a4640d3008000000000d0e06600cb0202824009bc5007038a3160b00052200d22481008302771401c000388c829819880203432432020188d0060000005c3c1203a004089071436c033b40180000188a81204c801800000000160c0cc0100000000004402900400000a4420c032400c000000000022064008000000000210248020000000000220710040000000044180630080000000a442064601800000110d0901d002,0x3a06900400000000000d032004000000a619012460200000000026440cc01000000004a4205180400000009241022300f03060821202b9c803800000001309034c0200000684c080c9180a00000000b4340a300800000000a8680c6010016920a3940c6d00500000622906019200600000006229032300c0a306784780744803000000000000c0c80100206248178145a00a0002044605403b4010007a8a710e07b6802800ec1482100aed005001d82844080c9200a073c514414085b401800000000001e06400800e3142204066d005002c45087480fda00a00000b09410192301400b09411e405768028000051188340a900300000000320c0318040000000000340d200800000000e8c81460100000001c8c4088c030001683886405a200800000000001d0320040000000001281c4010000000000390248020001222a02405a2008005a4810e201fb401400b91011c205768028000059298a80a500300000002e54581a002000000b8ac580e40080000016950b012801000000002b16038c02000000000052071004000000b4ac580d4008000000001516066008000000188a4050c0300010c2182603da00800000009624011300c000000c22880d8602001321460d007ad0050020839056015da00a00404708ac019240141028e28a7810b680300009614413016d004002023845180cda00a00000007231014300c0000000000580c40100000002206c044c03000000388c203618080000000220a033300c0000000000301a4010000000088340d8c03,0x2c220298040000000002c009200c0000000006c012401800001a01040098c050000003504200b180800000006c0900c300c0000000dc22016601800000019024030c030000000340480518060000000681100e300c00000000c8480e601000000001a09018c020000051c938069180a000000a224803930100000000c45403a60180000000312d03cc020000000813c81b1806000384d110c0994010000000184b206c601800000001d0d024c0200000e6411981a200600000000d8280730080000000188281a6010000000002e140cc01000148418e603da0080000000b251036300c00c396110c01a48028000002d0d050390020000096110580ea00600000a4421a024400c0000000a43202c6018000000198a4094c0300000b4290580e2006000000651040a430100000011048280e8010006508a0880441005000c2104150088200a0000000064580930080000000c456044601800000000016034802000000308aa04118080000000000540920080003b0a40c809680251220609600bb8500700000504908069180a000000b10c408d30100000000110981660100000000001903480200000000320c06980400510818e3025640140000141242032460280000000250d024c020000000411c81b18060000000054440a3008006a8870ce07b6802800cc1081900aed005001982043080c9200a063c414314085b401800618810c2033680280000000360702cc0200000584a08069180a00000074241806400800000000e8301a601686101062405739007,0x6700b200c12a0e18a50186280300000000019002c80354c20c04900e60a00e092072c510077140181220ef0a1013e280300000000003101c802059438a30c05a9a00c0000000000b40620081419210e1807d68030000000118440c8c030404192086055f200c000000002c180630081419210e180e56803028a18514602d4d0060000000710c81318060000000000b40e200800808c814202e680280000000013c02c8030000000002600590060000000004d013200c0000000001280e4010000003484101a4c0400000000007e0310040000000000f40620080000000843202c601818310d0c300b8d00600000000004a059004000144340840b440100000000000701a4010000510e02102e100402821b01020464200c000000000034092008005086808204d080281410d00810232100600000000221e02980400000000003c0520080000009008802c60200000250982402d0030000000000f004900600000a0823022c3014000001221881706020000024408c0cc8c0500000000540a0718040000008308c0bd30100000010210811a60200000000f1a0c0d0010000000210880b1806000000250740c630100000000843a06c60180000014416025cc040000001a84e036180800000000006c0620080000000000b00a40100000014848004cc040000000000360290040000000542500b300c00000000d8980c60100000001609c04cc03000000003622031804000000006c4805300800000000b0900e60100000001608404cc03], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((0x718042782f0695c67e0d8e614a4125de26101b4607e80824abe62a050004d8e19c1304100042f881964eb2c47445aa57eaf881964eb2c47445aa57f6d6e3bc9fb8fa7744b1e006d6e3bc9fb8fa7744b1dff8b026946146086865041820827801001908010068000ff917e098be84c5f0262f61317a098bc82c5e017c5dbf00da11a5c96150111618038509b8e1061e3e288410b906188160818abf5e880338c1db008938a1000405dc07417d87d8d3ef60472f3824d5f76c2fe5a43f0250474999c03652836385e25dc6e5f8d07420892045d2877c00b33cc38c30b3810813c02e9fc78d7a4083d07f6c19c7d3fec177cb78c40649cd84d942ac5cbad9dd115172decc2609efe71463eb0a5712b6564a693349f4d6b200e4956a1ec141d144c3cc38c3893c53813402400400132280200d00011a20008a84250771d266700d94a0d8ec71f7833d9bb82398225f1032c9d6588e88b54afd5f1032c9d6588e88b54afedadc7793f71f4ee8963c00dadc7793f71f4ee8963bff160902ce2cd2cd14b0c2083044004130300200d17701e201b2941b1c2f12ee373d244e2904408e9333806ca506c70bc4bb8dcbf1a0e841111e61c61c31820811c09e006e7c0eb7ac8c4c7d65dd372d95257099ec32a2daa003cca4420cece30e42e5e32d2156c616c70d03376cdf063041823565640101830bac4ff81108f5ab0a0fc0703d3ab92ec123400c1988978e98003a7d584d349001408416b88080cc3a0a759a004d82860a40a000048e40013048003bd11760d0006d1102b198b888f090f14df5787cb26a998eb2f402c3aa66288bbc0c083b0bf6cbe030138c5cd6f9ac201ac3fa37f7c00012ed74dea00110000000c23d092973961501630a070e1420c1a20bac7dc604c12e8b752b0a7840000035e83422a15b3b559811dda9d04ec10428cefa61c180f547ae3a0150333cb55d40378242501471b929000000009a4fa6b56a1ec141d138b3853454033833430413800440c10008036130ea9d0e20ec86d7669a56dbb34d2b7021140b38b34b3453413002c004000020549050b74ef366e7aab117d01ed35a5a48a8a4d60817c43a00038a4000bc48bb0680014108ba828001c60e0ebc6ccf82491dd5402236140a083adf932416e7c3caf85814eb78bbb08017d968f2e0e0183c38b8c5001e4a61e65030125f9a904c3acf60d0639c1180800007c4cab785cc956f0ba5559a4ae9588e7c0794893ebad1540b424f0891142f8d2d118030555e0932d8fcaff071fbcebf60e0803b25ffa93155eaa9ac445693a50df4b2043e43892c9281241080003fe526acaef7f2ecd29242a11d4fa99efa788ba879f660cfbd3789acc7947c14e6361bc551f0739740e7b9fb942d3aa541ccb245c8e61fdde43f9768219d147410e8be51e5d13a9985446c883e16100567e3d941153737748208116d4290605039b3c8804c204001017001c0b02dadc4e9a5adea5ae3cb0c5b08c0d4683291d962d0240c21008696bd0025f52c315a630b89a0d054149c0704cb3fb9cc6000056e8972c0077f89730200de52dd7009c30840200002c445d0440004dc45cc240007c845c8860562b1710df1200000960b27504667c9c2981fe6f13019c73edca400302b02dc3000724f8e8401d83dc3354004b940f802206175792baabc60000000000000008b018aa) <<< 16000) + 0xcb79e39d6aa015338bf37d80f04f28d28c28d0840810430163364bf6da73f87ffbd4c776bc500d3323b8b005924390a71654e18ebbbc09d55a8ef71c911de8b800e05b204cf189c5e62d78fe9a58f253eea1c1cb1442fb0a1b204ca688e0958f488b9c00a70d9af88011c7080031478af034722ad482802053290e7585f42057824cb63f2bfc1c7ef3afd838200ec97fea4c557aaa6b1115a4e9437d2c810f8902cd2ce0cd04f00c00b00100000c0e00803400087c8001cf916f0d00033590007e7383a580c7ae90d0174dbc043639c91d094f240f83c07755dc1a4d784862477a8f674d31a4af215af7e2c0a9d4824c67b6006e546a31979000652f500edc543428342b51ec700d8e78cf5e062af2ff24ffd5a00159c1f2f233f4fa8a9e425ac2008f71e425a23a95119ab9dbc6ae5be7f5e197a1846a0539b803e865066a0f21d9e8c60c220800042922dc6a16d0d000a90116505d0b190cd3c6c838ba7c592fea0382c3e63528d050008dac5f1a83000721d693982003c7806de5a180dc9cfe39660089852cbfc424800bdbbf1e4402a68ba17e2d721d10a009000045c45b0f62d65b16a218b486e06175792baabc60000000000000008b018aacb79e39d6aa015338bf37d80f10700323482881041011c010004054004b9400803606175792baabc60000000000000008b018aacb79e39d6aa015338bf37d80f04e24c24b248145141042017fc2b00716f182fdf97056fc31bd2834aade1c01ae2d61d9d6390075c6765b6d1b222ae39263c501c01c0c2eaf2575578c000000000000001160315596f3c73ad5402a6717e6fb01e50b59c900000011cee0f871b92903630923035c1801a9000000000000000101362b760670e014c7216eaf1fc3ea61f19e51a51851230c30c188058600401be550c642009852332c5931c012fb4ffe9400c0eadbc8004830400100000dd20c2220003f722d01a0006c6342d6724000000473b83e1c6e4a40dc4bb29b95aa3f9ff2407e377398d4ef5448ad0dbc05c5b3dec0000000000000000084a3c5781a39156a4140102994873ac2fa1019839238619600e0000bdf9aab5ea806ffcc81e9f046b9d4806880fec649df28f979102804a356b82e1b688c5f6163882b1aa935c37d09656a5ddbffdd6585a06e55e2c33f83478d34a2214f052792dba726585e49951b10e897952eec65fbb0bfb419100ac57432d6d8296839d9400160c83914c1c0660dc1bf746e6a9ebb570381364600000000000000000000000000efebae4fe6d3ac694089ebd675fadb07b65cc6af92f72f617a85ace480000008e7707c38dc9481b23482882c21c22c11c0040100010b98008037dd1b9aa7aed5c0e04d91800000000000000000000000003bfaeb93f9b4eb1a50227af59d7eb6c1ed9731abe4bdcbd85ea16b392000000239dc1f0e3725206c8e28e24b24c0c80cb042004002e400200d01c05c0c2eaf2575578c000000000000001160315596f3c73ad5402a6717e6fb01e50b59c900000011cee0f871b929036481669670a50a708684700205c500401b02db4308420d2da2a23a21020e9f775b0d0a0548f388f00a087f904b005102867800985080020000268459c462cc0bf1ddf4a34218614660e1ce34267c1d00343c2861e9245f9f1801af6394b7ae5c89003541203ffcc963007478dc3601e691000c842beaf83768800fa1201c80d415000041640016448228c82b8340010da685ace480000008e7707c38dc9481b88565d5bad61ed82e4a5272bc64bcad17161ab76682b55a5570000000000000000010d478af034722ad482802053290e7585f42033072472812c01c0140000431da148dfd73b4aa454972daabd0474ba831b7fef8fd133a01d4cade0b56aba174f80800e8b1013380bb6ca351d8884740f47f004321b8aa0f99dc37ef95b68206350a3c280024b905a150007ec916501f48a0b3483a8f3ea5d4e8e36fb85d1be10b6908048816a6e60000000000000000082a3c5781a39156a4140102994873ac2fa1011428e2880820880060000220250ba8c12b5ccbfa5e1aafb121272818e365622fc6786384ae9dab9aad12fd37f083afb4df815d520a33a1645c8f3bebfdad1edc2774343f452f433b094d09a386d6d42873af618e8fc74e582680b2ec1be1f86d91398c7a000974416d242c82a01b110b1828008e30d0abef19416b3bb9a0384036030ac2b12c5512939b3ac23a53e9d4da46a25f08ff60b6b5b401b0040a5ab0dda9447445e5f2628a835b3c58bddb75812e8e0b3e2993ed10663ace31be63a8cf437b0028486795f6ec6ca9aad305e7d58d33fa45af818d2d033797a5521adb5872b7890add303c358f3001017a7fab3d371c90b0a088de8725e60fa868d266f1d5fd009d126cacc957e9188ef5328355030000034fb1043a1ec3bf3ccb3f0fef2332662c295d113ac827fe041979bd324899ece5d4be418ccc30017585f0392f0c0d50dcf35d106975a3bcf2819ba058c2d27a5c8aab2b7ed3f63fd60086260880a168c0cf17b1c00b336fcfd13439f7149f6eb5b4f909db2752c760b41081522d96c75cb45e648b92b234b10aa33e3e1b705ff07d8599b1a8db48509616342696c661d700533cd9658d22f38d1fe91a193f947de033e30060217658ec1bf4a3e3edad75776affb3f525b08a924f565c67f55e7db0501ba6658cd308833cea8cb08453bde5261e92346dc8192b2fa03c0dc0001be25e6b2e953ab9f6b9a2daffceadda290f1e247832e28657f0201800cac8635896bddb9bdb0bc4c8afd5596e8cb6b0292ed0)) <<< 16000) + 0x9e74b70cd6023c9d89ac7e0803d6f3c53b3f2367753c2491cefd40a2f38a61b85e800073420906b91273b3a6ab42512b82b8e980a4cec1fa77d972a03556299675d270180710b166b9e586782f941f5ee896bd44bbe8befd3f8097654edcb0a1f406114f9654745f0278be534170f75cba425615fc5a3b52843c1cdb4aac0405d8ac973520f57fa3bd2d0eac747220ce44c85add554a36ca61ad9c02019f9306debfbd6a604ff87c25694bcbe81e2fc737355f30a2d963040000f3e35409868391ac6a619be474bd36a10754c25d4ec957eabbe6ebe0008d1e25a3733daba8baf6b668475de64cf291358de04b8c646741e88a62d043afd4ec98f71faef1ce158912e29d95ba7ce04a0c0a71b85e800073822c47a161190b006857c242bc0a0f0058ae82857004002d8c427987c2ff1e01eb444abc17804c3409b8a14a503f3379cce29b807e583a5440b22fb36624b9e135686328a7f0102725d289eeb08238a7cf9a64b818048e4dd4a14572fba5b17edb982802a67da9ec25c13d419db2ca4d999950bf4c9ab0a1bbec5232f93520000a35fe61e65975a522af18fa1a58f9dd11482f036ed3c9f244be11bc863ffd62e39641dab23288c000117ce04273bfaa2e2b61014416a651de3b030439b2b738250818008e5c7cf82850502c6955c904aa01002b460aae716a000003af44d3fb1e9421cacad1bdfb941401423ce8c89dfc8818b143341902200009b48adb08569542b213158050ab80a06c92351ef1ee3847fa67694f3860acd3b333b948a1106894aa608201059e3ad2cea4003665d9cfe8c7023d7326b3a70a0093d63fe14a0415105033eb7f05cc959508856050ae1f5084b8df3312f94cbd7693dd6774e59c5fa9ffcb643a46715e0334a65859880b2269651259058e50e38a400000080982001006f18026c1eee6c612e19b3a42aa6111973c16cde5901e502ef17440c000000a7e830200b5c1f7b408217641b90004801e502da93c000d265bd1d03b40c1400c227818cc7f2a8f32c67d7cde2797d85855b8b38b1f76060de9648000004aa0e0ea806dc24c48603c95fd3c3001f7604ea28005d828cf2c80c250104d16bdcea90889a00d80e1f903400001296162801c8f1f5245031df2b10804e635e6814e04000004aa22069cbe810e2804230084d1054ea6679d13ab1e727a4f44dd3de83670d03412eeab82e186110a00ea6860859fac2c8d34000016a319820012ee975bc290084c0280001b732403821dd9171035a5f904db711300000053a31032597bab81e0a04200a8b86c8104d651e7dc00e000000014ac0a0000462030b4400509aadc1a836908280180000ff100058732410c2fd86161e8980000024702040c079dbd783b51e60c034ba52d18f11f6973433d225080abfefa975f4811806962b3e32005ed54ea831efe84001681624818b6171348192fcb83431e20b09bbef89042d00c1c4a40814c19c9a7000ea135ba180178e332df3801100400005908ab02e6896f56a9b289a12999ded2068bcb69018696000000c7202bff004d1a58a09a82365a20e0f2554d69802f2da28160008801134490ed55cd27f913c59a8a5827ae8618373d44a1b3c441008875bc6a8fcd0c0000028da7e060c01bde520e2291068b0381438020c04000001ed5b406001cea248f9afac4c9003003800012519206e3c7b86a064dfad5b9c7881c8b29392410b6a36b5c1040ff5e83a1c003813f2426005cab61e993821100400005988002bb9155050004971c24410ecd3eb9449fda3f49d90c3381d72e600602345a2e1b58b04b7825900614097f34e1bbe30034a62112e658159c0e1bf70a00d97858910c89002701c0aa00c54c0713dc4d55403159e581f3fc727ca38b0000019f0504860187517713870c1fccf89b92921008e5b0caff381709b911fb02781b8837b45f6ca00000001a3c410e48215814227a374dde267972657b1189c585f6179ea7067e7652aa221060cc8b346800d94aa2c16016bafa8ba4e084401000016620007384548142a2020005fc2002db242b8240032044540575c3ea10971be6625f2997aed27bacee9cb38bf53ff96c8748ce2bc06694cb0b3101644c28a1cb18a18b00800400300015030500200d0001ad229e03ae1f5084b8df3312f94cbd7693dd6774e59c5fa9ffcb643a46715e0334a65859880b2248c48a40a28640220010000a80638cc6b6d7822233be3cfdc7458316a223e6433cd737f0c9efb5e9f35957521ef25cb6b22d9812063dea62d85379a1b511cc344b2a00064e6b87d4212e37ccc4be532f5da4f759dd396717ea7ff2d90e919c5780cd2996166202c89020e20a18810e0940060002a00e2187a8ee5646139f29cea8162939cf30fd16cb6d42fad744b083b4a0622bedc34d251057843d52083a146dca395be1f17b639a6b1714000cd083f9cc1e807239667955ae6c3cc4adfe9471178da05a27108508adcba387d35238d596b90ecb2392183000001d21d54061b0c6008100c72a79cfa1b44c6aaec900063951f70b23fe72e9f6002a205e5098fce75dd6c46c0080979ed8a5ee20640510c0000177100267c229c63a2200c92b795cf6212328caef499474ee2850000011cabfa005094bea6dd841e86c91294cbdfd17a916861c20cc18cffa16c2414a7dc73c54ca0c40000000118615800f42404021b82a2c990159fcd0443770288465c2baf6a358e02871be80c25124b7372466c07ba3a0009eb0285db7e9992f116cf9244c9f65a221cdc4e00c02d704b95e685f50040029d374fb4622c028aa6cc4021e036000)) <<< 16000) + 0x09f0df5fc39a45def5b9d5f9ea8e19aaf13719419563d06fb08800000000000000004012472052442432030411800400c04008034000644d1142affc3889213d1173d790402c8e14002870604a32a848bffad2741070c455699c2081a7a22f9eb18228afeb6f020000000126290023008592e1984bc97e2180a22d10b283fad340142b89df9a0646c162452829738fcbfd705086b4f28ca76796091215e49203bedc30408a1e98a0136f7004002175f72f6b4f10442bc001b82c0000934d102c83548a451248f0bb53c83b00028a06cc6ded40004883c9d4c9c79c6408e78861a26f624867ac49d33db00406000005a10a402822f046b20ef86300000000b371804e212086007000024b229a130006ab229822b02e8d3505fdfb1a55cf6de81009441239231221018a10e0040180401006d10ab2ef74ced64c2247db83cd9129d2c0123041ddf740c3cf60911c7df80f7e9a1dc408bba88449305acb2032a037f99dcfc700a1140c07e30d797cc10006b1316fe24300681ab08043905c0001301b8a22dfd495cba1f34ded8bcd6d247eaed9c8ba4ffa559b0cd00000000000000000088248e40c4063864043842022801808010068000d0914b098a50080015488a48c85204428e22146090a28485102428612142090a08485002427e1213e0109e808004fa883fa6c4f10613c7b13b3189d16c4e4a62704b1372189b0ec4d4662682bc2173ec729bf0a229ea5b7a8808187e3e201881002964e1adc60e06ccd704cfe0a034e9da8fbc0400840149e5e2a0202a801903846564002c08cb6081320206f86c602550ee850040f302d8912586181b9f137238111eaaea49600b8f4b8e4300058d5d6e00111328d400260c2100840d0a04deb7181872fa677440c02ff5a7078422aeb562041bcc45f6918001a1bf464b000009e578138410804303089d767f88186e36786830c141ae3407840847b33c34200076c1b0408d121a99c1066402db94138410804000058080016e180c2e7e4cf040ccb21259140a2386b7a291880f80400002a889988c088362641b1140989884c480162260b81a40ceb3f430e6bb62ca1e1212f082a30154edf6142020bfd69c0c005e295329600004f2bc0670c1f0087859d1f6c562fa165a833f4f56f96e9a10f4880c08c71d6fb0d78c03f91c070c455e9f00a1a91861040d25fc542a4aa9715174683afbe22206823013a80fa741ba21abc26fac187164bb89f41200d24b6dd48dc4fc0f965e13fe57c86be8594ad277de1067fe6d812d4c698bcbc850223c74024c0a0003a722601b12d0588800c180062580391e1cefa30b3cd00168d6b8a28f577e0791103c5f5b747080078784d0c3f456079f2201163e3c2c049c5084021446635e8094c626e5e7290002a411d10801ca8514090107802144486a2b5c4c6849f2bf101803c37891801424dcbc90107802000019844bc17340d23ab23a3a3f36673303903d0381adafe92541f1792cb3e3a04f146f03edef3ff450d1e7e0ce89200765477d771d9bef8f02cd150d00487903e0edd6d364f5b461f4402d40ca82055483a8fd238b6b00177158b1beaec3555158db6aa2f8c5906ab9432dcc18c0218000351205812000549323cc6c5810a22298004e82433c888248a025b8f347d10714dc18d9c00d0ba2c50498407c021111267306891045b62f0783068cbc4fe4104f66b885049030800200580a0000ed225c12000249208a0b81a094d1d5045f0987507782a781ff42dfbccee0b9fe92c44db7a785163ada42caac038ae601d0a4abe9da701b870f05d10563a9fa28217e2760fafa3d45ba278e516cdeb4e9f17f4de6612715860109006e9479b6d67d2c14420e02dd460611de54c20c7ec858efc5a0080728549c02ae88d3185623afedb571241aae0e93f85a519373c1e71120e972079db31e8c883264a5fbddd276a360da420c82a40002789000e5032204dc3eda101e3ab975658009d8490ca0071c48db92020f80404b406220030600189600f8e1604e82058c1035d5f060fc80e4a30c11aed177790007c02025603b18085132f060e1b30e7884000b667f2420276a33e8000076ace6409410800200001fe44a8271d26670d652c5e762be1ae8ede4c7f182184c3aa74e014cf3b67b1309c7669a56e080ce677245d40a5bc7f3bdb78fe77c5fe8b2b959b7943f0811034a145085052008c2e11b418900866f254dc1c3d33d5533bc3f68ba94ab20951182e8c4dee31417ac25a7e929158306013078428e1138161727f201450cdd31e8001ed11291100030d906e190940cc49c6421c220007ad221a1a001bc822183391c139caa4cae55b98c4db32e4f7aa2c10526f72df999e018810348fb35a080449046070280d9d8bbf444bacc24380874330481c4a2e85d19d53077098d0097bd13364344676bdfbd706e40204140ba806b91a57ff3ebf158e89f1086fbbfb12c437bc33d5e83693d0f900e519ef84e8743e3005d14e1b84e000078e74a011463994516546d6f040401a8465450000023dfcfa0424142200809000c44c0701c60641a4208380101260183080c09406038038000080222700dd34859c701368dde020ee40a1f720003b436714800400100000d230000100444e003ba9411c7013218b51004025b3e220834324a602400036adf814a00420100001032000280449427e621c233401c7c5c3ad1068c0573a6c06050d760959c042fe7c3b0250c1f00800007f1124110001d6910d0900023d1123218860ae830026c0cd40161edf827d24d28d997b2eed5ac57cf8fe1437c2cf8b4bb094)) <<< 16000) + 0xbd5cfc3ae2f8d9ab00e01b11b996f03e6833d77b734899399ba1f8e1217d72f3a222a47853eccb633457b9d4dbd5f89d243409e62f396ab2d3819858ffef0c966afe0cc45e5ca779f9eee88b42143bc8d1be8258297864e1a900129662d1369d680760d513f910243f024e5df7fffd19a04925c86905c03fbc5821ca87d635b532a40d41d8d467705ada54774dc4836159baa22d5b802079a6ba11b35e59390390f67f4362d0ce2278305c1dc77f2dba33619d2ebe7fb3f380d721f29de547efd2004bddd8ba02de5e2014fc1949b22e0001df0885968428a424442035090006db912105c843a266d80a6af70120a275fcc661bce006004ed2a6be70927c0a012fa673e7a5679e18043f6a9fa54fb67820001b63ae3fc6c4a4a2a80e642966ffc4412333ab87acd95cc4077f3484650305165f201510e81b000054443f847013d427ee40084507c0202400311301e0c17ab2fea8c36d5f1591850a061d4f038600260365aa0120811004047807a38621d210438fa023ff0f16301a16d0f211841100434706de07341c7e891eb384430ca77273380496069f009020800200001aa447c340c2120001c9221a120002ef20562b856f82a1fd44748591cef2c96c2278bfabc69851958bd1cc49e1856f82a1fd44748591cef2c96b37f81619ebf4420909e03fb11a1a04309fdccbf88b577e712b9d59fcd6cd88b8cbfba030cc0a314300000000000000000045fb2c7200a9bd28fb7b16cf8a80612258722384a1139cb71e0000000000000000100ce677245d40a57824cb63f2bfc1c7ef3afd838200ec97fea4c557aaa6b1115a4e9437d2c810f945142048002004035514437e4ae282f23a92559b9b9bf4e44a89d324ccba7679b43cb9bff723752aa3d4a6f8ee3e60a140827fc887485beb1eeaaa0c5df0a6ae86bae87af61b0cb363724126ac8dcb781c1b09c9a3d8a6dfbcd0bdcb83316a9e05c8e885e7311a553fdc08d71c7c573906fc889417e35dc40b99701ade9cc89c444ebcc9a79a88387c62a86021c2689d1409f9c7a9d6e2931df25192b23c0a231089ba52b0140100408f00ecb326d64de186fd2f78880c23c5c74260823d0ee1d834048efbe0b2000bf9413400098608002000026a4434240003384002f8888e94e093a41bd1aa2da6bea3f2e45495a4b988e76f8b2f31a04b0538dd9d9e28239a8308fc8531ee423c1294d838052030131d463697c4399dc7d519a2e870a3c52a4a98369b67b8882f35c37d3bd98122e2fabf230df7d2180cbf1d6b481a594a6b206440e00c39f1c3c3758b8a41fb644d414164e226920750d9f845c5785a0f5e0480136ad608534c05c3bc0021617d70d2823fd4485686e8d5944b8a8f912b9bf7056bc771a05a8c1731cc1a92132cc9b0393a45c6cda72e213c0f5e3292a9a10d86b88a291d4922603e8603025b201f60b722d0a4604057266d266b7c1e14df1dc31a42395d13a37c4c5012922e1c21e22d4ac0376f1a89b2abadbbe9196a6a60000202081e00e43cb2db0c860403eb921041819b8398502b757a130c036c75bec005101a9a0f00200004308681c83c4d42385a11b150668280065dc88d20c464b6230531172588b08e031cff602dc61528cc06ba6872add8e3b241009686cc040931a15a8c402518210085a28ba75a389f6da28ba75a389f76d70440b02f612ed70440b02f613070ecd34adc7669a56db883b21b6130ea9d010a55bc2e64ab785d2aacd2574ac473e03cdb6e0430abbcabeaa17b20aa1428c29418408a03940c47329d6e706f836406ca07d706b1251b5bf6246ba8dc13b8da8c83d031fde1c0a7b5fd421275a38031c7ed57900a9a4e1caddf80d11f3011e1e1dde83d69f058fe53d355cb3e5d5192a45680028211140d88980e64a3651a33c921070c184a80d1a07f7b23410025f350860b4a9230a930031d9a058130410804264a4f5ea4a1245579191520363ec35e9860d708fc128c810400100000d63338053ec1553241e4cad4c921a90f2440d18698712f050ca6128e1c30b07c939dc80558442e6d300295da54d6808200085a28ba75a389f6da28ba75a389f76d70440b02f612ed70440b02f613070ecd34adc7669a56db883b21b6130ea9d010c261d53a700a679db3d8984e3b34d2b7040b78fe77b6f1fcef8bfd16572b36f287e1021241a30a1861100b0ff71368d486b411600e6e2332eb1f55d791a39886cbf2ca3e2cac149abb178af7f894b9f49e06cf87d5f517533ba78f2da6403be09cb1a00e5918c4cfaec7d6288bd891fb8d845ad08231ea126e91d00054b2000dd86d145d3ad1c4fb6d145d3ad1c4fbb6b82205817b0976b82205817b098387669a56e3b34d2b6dc41d90db098754e80849130718b1030510090060165e341c2a3eadda7c17946281f5de833835807be5f9dfb1f56711a26de4f37052adb23416bf9cadd1615894f86375e26f710cd2c68001bb906109c8860d595251039b910ea78f15d810ee86785d133bdfd301060aba452400a2dad769260821008488428d32f8207ab2ea9ed3c5a81895943c29e30d27819020800200001ac41380768a2e9d68e27db68a2e9d68e27ddb5c1102c0bd84bb5c1102c0bd84c1c4261d53a700a679db3d8984e3b34d2b7040489888e38c588300080b7a11cb18ac964e670126eb23e56a057b5a1ecfa72785e6cf0dc259db1ceeaf565a8343258b2e9d528ecc6025d2418c6e78888520d6738106fdd97767daadc7b5e6b0e996c216da054d84328afa000858409414000d2c40885421a120013ae20363ba56239f1556692b255bc2e9)) <<< 16000) + 0x2ade17307b6b82205817b09b6b82205817b096d145d3ad1c4fbad145d3ad1c4fb43823891032013802800c0504932162b5f6ef51d8d4023312ea6ebcb55e2779826720d224bf4929142438b5aca2272708e2224d4c3eb165285ac73f69d017680c486e4efac70d9ef3ec5b7df9ebf7ccdeefdfd850eec599255d00042c20d43303509f0c76498f547197060db6941026ff09a0c297badb501042c1f0ae9105429a798880485dbbe4109c407c02168a2e9d68e27db68a2e9d68e27ddb5c1102c0bd84bb5c1102c0bd84c1c3b34d2b71d9a695b6e20ec86d84c3aa74042956f0b992ade174aab3495d2b11cf80f36db810c2aef2afaa85ec82a870c60c504480300478576e0b9cfbd273c24d0ef8daa2302b1f69d036d1c8bf94156ab469b8130b29507d0faf29f041d83f61c8adadb0ee014574a42fe7fa7e96b4b444aa29951cc1d8496cc8c0c975f9f5112e44e8002811d154957ef90c2a676eb1e14334eaf6503055e8ee3d4308978ccea940898ed7362411a47e400083a8074120428101f00808a80c00065888a08c44c17e38f847f3bffc81d4fc48e831a28853dffeb89e3c300c48ffd7a2413c94bfedfacd0879ea02d216280e516ab9315040b6d29b72be9f42010a40b00a20ae202fb9d1f8d20275ef364920301ec4ed30cdad48f0050b736e141cb042d535ab8804b985d8613000d65162e800200087101864d76780d200e957c6de924058e721da24040ede2dc38c9865666dd8d3c50a578ea7766960812a7ebb17201281101e1c7910004e0400001bf22240200037022201381c1ec3cf08a21ec81d1e4826dcd9caa685fcafe194f05d6314d88a06aac55fb26041f0085a28ba75a389f6da28ba75a389f76d70440b02f612ed70440b02f613070ecd34adc7669a56db883b21b6130ea9d01091849e39a3a411a10e00205987155a46e04982f36d5dcc1954869fba5dfb4dc165f49e5b15a0c8e4a40d8991fdd277e14c83e5d143d2b66cebe5505c1330b3a0006e44444240c00a0004dc322040066f3840e36a4e42b20013733c980a01530aa770102136b1ca1280108042076ceefb502028cd5309870217cad4bc6003e0100000a222200b10f01c88015d1b8440fcb6a4620f040b5379d91820f804244091b6f439e3a7ecfa9f1400412ecb40e01ee763f282047297ad01282100040000400830028000754887088000fbc8110c843434001d68406c8621833b45174eb4713edb45174eb4713eedae0881605ec25dae0881605ec260e1d9a695b8ecd34adb71076436c261d53a0216db7021855de55f550bd9054cb28814b0ca003000016099a5f73b50333e45a0e968fc04b0ce552804bdc65de019462b41975df677ae5420c2b6814fb8c3e7e9470adc17c8f8ea5c65c92f4a808a2f949cba3b1a4179326693a326fa6be59cb508974af7589434aee89b83ae10a39e26ad05a05037028188141e40200055022166210a31000e6e10c539da28ba75a389f6da28ba75a389f76d70440b02f612ed70440b02f61307024864823026005804002808800b81d788c4d28b9e380d39fd716faeadfa3f454006a92d0d20e3dbc766fa29c13c3c61d72a136ad16b4be6cd76f5fdab581fb42d52ac3a04a0ed4000c848849ac4208620e3b1061987f06c414278096d646fecbc7f495e96f31495408f4fd54e796f1ec6d0470e5f4e6e3d4b1938b7124f065f8331305f8c47127dd848ec7d9411a766e11d8f2300c5fc080562d40d6ce0b168cbc3c2ca1e264dd50f8d7a6013655d6d65d8b7a93b292b8046022c19a243fc5374e0bd8a96afb4643600231357c7a98030e325a7000f61929c12e613abeb9269c28ff5ad728ef2206e0a0f8f853f6bf4ce5df0109c36b34e6bb57182cd82d2d6ad67295c25a7ee2e50d4a5d52f452cbd34f3853af1b965bbf3a88129c81a3a922076ecc64a45492b6f5fe204b7f1a9d44828f315302f1315b9eb4f6a78a46ed652c43d286c773d37084771bd10286878684b04bb748bf1c17ea51c106048735b270240c1e00808200c00038c80188c40c17308319b5e5060b674532bd3008f4a639423082000870a0feaee78305fafa44624020c75b8cc4608400101000100005e1d101f152258506bb5fd48ce0070a986288c1080020204021010100006899095bad510901cacb2af3c02682b4f91820e80420080200800002230100d6faf040385a7cd69e00ce786ea10061d4c7a92020f0040400040001c06000020089147f0e8ecf075ad20b8a0137b41ec20350f251e4001c00800006090ff050420280004a080018c90fe1507306800172c8158ced145d3ad1c4fb6d145d3ad1c4fbb6b82205817b0976b82205817b0983884c3aa743883b21b5d9a695b6ecd34adc087ecb1c802a6f4a3edec5b3e2a01848961c88e12844e72dc7800000000000000004031821422412801400000022f387763f98bf6f2f1cf13ee4f1d2fc9b492e2cb8064e8e0f10cc1c5030518bcbaca8c2659836590b571a95a9cb2943246d9ce3bebd7cd8074152a144785c2272b4cda41c6bcdb79334d3fe39f068da8c3a9a985c17d4940222811ead781228208671b4010652d44230601a577a5800094607c0201cc12000118203a0a0006c220364be201c3ad56080e26304238404e3ed9d763002000868745613df22040c158f522038a200ccc70051bc1abe480270c59832801000400003f481300fc908076cbe70863db59c0913ade37ad9e11e5e10c790007c021c24bf202771420b92e01f0a1a2be0bb008110d75a551e01df65fff140063c20cdcc00400100001293c400af2)) <<< 16000) + 0x0d1222740546789a1df6e4d6e9600443ad90120210004000034c80017f9f0b4b9cdd90b06af4946107048860b83408c308002000015641c8441fa1a0700902d0481b8240c4120f20500032290fc2d87d8ec158661f42b90c4d679092c249895690e02b907e432c0af253bac0024181e008405293f94be90285768a4fc507c179afe86000a481e4424042100848e046c9112205232a64d13440cf1eb76141f4900adf9000800201f2020000e731344f0f6cf0e2235aec9b3030bd72bb2681234de0ea4001f0080300083e0040001f043d8340061a0e60900019610f4198158ac368460481b0d909c8705d205bca041b0a0ad060a35ff9ee3809409c050580aaa86a4c0000094b07c021818460cfd5850d124ac1a4402dcecf7b2141f867e2ce80120a1080403dc2743f7c12ab366513988763637007e12a05460baef514fb986989d81a5a80ad56a2900208054754ecc56236505c7a6f68303e7e7182a46ce3c7cdddd86caa7d03d174a9d8b54381419fd94fd9b7cfc9993cf3821d31de8b7dbab38e3753de60d4db0906e86770cb7be740c006b9bc08852ad006afd38407b5c51ba4dc8b7400cbe5aebcf9fed21f94f3a9d99c0004a8246b7165e7fb41f6f6f13a57ffde13e73061b35b5baa39345a3949ec6a03a325e021505b609d346fe32424c3e7a398b81b8a8b4bda96ba01b69a8f116ca5b4106438f00000d207050b4c091830306a7c6b6381cc80e717008c40800201ee13a1dc17673b9c0948f3ea2140847211a3980088c679280120a10004000036883008800073087b10800c741cc220009c520015dc406cb7418659035e98150878f448e10bbe9b6b8e0878c3c8e4800400100f501e981cad312e60595bcd5a4680243cacbe500070ee94c1808f6da90a4a08400100000ff21e8130da0181200c3640760a7d29c728e0ab9f704f98006c718361200cdef95b84051416d430004a304001000010920e43a0f315038088168340dc120620507902800102c86e868004f78862a2ed145d3ad1c4fb6d145d3ad1c4fbb6b82205817b0976b82205817b09838e91416690751e7d4ba9d1c6df70ba37c216d21009102d4dcc0000000000000000105478af034722ad482802053290e7585f42032432c02001000c0000588aff999ed3bdfb875f504f838f2cb8ebe87cdb99c2a8c8d0e91340d01db5fb536807933093ce907f763aef77731fc84470fc910fad8ad67eb0f9260bb4b4f1d89d029156e6f4b2a1a7e6dfbc78d070ecb81fe0000acb72e4c6cc949df75897a91049e6021994f74fe3df15e6d62cdac92b4a855dc4fdf5f202dc5494a4b280036390d04d078a483a4f419a0a00379d21e01b00773a20fed307a01d840acbf09d3069c5a798849b4df7e287a8a96cb22428e3a63099a908e910b89d24c2007122d68eda50c11c75764c2296d500d4155b257bc98110b1dfef03023d157284e341065776ab142d40c2f6341f9fd80000aaa06aa1d8b5eecad9348ccb21e9d749072aa46d788005eca54439e8651a6181cecf4b16923e8d2453a102fab3e5e9e738cd4289629e80350db58c2721e27e80f0d55dd64114f87e9d5c4272dc468991e850e18a1002baf531c5fe214516ad8f106398e4b9769dc0e08f95ea21a1bf851069ad2c0b87de57e8b67e9365aac400e7834f6983ff8f7b404460068791f522e9102b922a0000b69dce1b9fb7dc91458802c781f2cb7d64c589e188a2d532b6b5a6ff2b78bc70a7a7017055c594bc0c9fbe8b1f9592636ff0f99d11ff3363bf619f596c089510c862238d8708a69c7da0b647986a5f3967f9d51bbe9b0de875ec6731037515c90541207f7a6b893ec5b30dda0cca295a026fa59a305cc945217bb76c899c3d744abf25bb54e8703a18dc2ced5860ce9e28ceb9ad6b4bb945236abb718c976ce7a321ba4411fe67d08b1efc761d71619561974b4467fcddda17ade6fe31de353e045aed5e9a97fd8a8e9b4af4f1b6d82dc1590172497459c195c404bb476f4d707ae6ba195550b488e8eb3856da3a85df8065ba4b3157e25bb0a55308716dee35d0900af405b713455663a1c040e6220e49333a032f2e63835cd903051e3f46cf3c9e533126516624ef151c047e32d7155000047090d03186296c06c961de3b0ee0d86682e81924f0c2a3830ca60b14d006d2dbd690016bdf60d18098e5954e0000280012a40f80400004708769cc3b0961d6430ea1d87488c3a037400f1b00e890258b3022011080e8042008020080e701073008394040000c24390460b40b0e305c0d0212290469b17aeefd8821d9e536c160038799df28083e00880200802000008887102f0cdc5d0f6270e0c5c1680900223b1718130c1f00400005390e109036848380241be0200023721bc330dd1586e08c36c170040100406d00c090061b2038035e95e62010880e804000014886c0a835c441ac1a0d50906a02834c141a40a0d1010000bb10d0398679cc338e6036730cd01d70fa8425c6f99897ca65ebb49eeb3ba72ce2fd4ffe5b21d2338af019a532c2cc4059000000005817469a82fefd8d2ae7b6f40812f3e20fc8eb150de637ef08a9acc480887551d19ea591900e68000000000000000004478f90c506f976b59f7412f28ad0d1c0db7876c7ac8c5c5b00000000000000000ff6b82205817b09b6b82205817b096d145d3ad1c4fbad145d3ad1c4fb43857824cb63f2bfc1c7ef3afd838200ec97fea4c557aaa6b1115a4e9437d2c810f98a18e04b0540c2900dd514a07eafc630d5aee60073220204e0237211c080922088a25109a7f54c9cb1571805)) <<< 16000) + 0x0b5d12dac0a97ed0926fdbd9c255eb114e923e4c23199802b71c2a7b66d4a284f8aedf500026480a5dff09e7b2b5ec30e996f0ac08ccc4c8075c5586ea95f48a1c3cd0f3b03233bd7ed330d772f6dff9ab336874aac4e7640764211e490fbe562248a1129aaf1f191f25cde2de4ee965f89c1ec28f0f0cf773f3435c4a4b4bfad424cdc2c399fc3e9af57f139339f01cec8b4cbba6cdb2f3e20fc8eb150de637ef08a9acc480887551d19ea591900e68000000000000000004406100d76c8d9e3340a32052023802401c0000f44d017fe1f1d366091835148395dcb6d8904be50992f9ba1364aeb7edd889eef5bbb97eb75e2c64a3c1014b2cce88039f4e1200537ff1a1ad9b81c48279e4f974f7b162965d13f4000fac86610832c74194320c9150640880883418e12001057218c9a0c549062248215041860a0016b120049a4646bda8d472a5af05d3fb203ed1e9590b5f2264a07181cc6e942322033118028f605afc01083d36781824be72e7775df53cdda4433f8db375bf4888710502fc1df059494474b8e59af00f461c0b0eb5d700000555011c91e6666d9a9b203c743a45afa865400964c80290ec8b4a5f0877115202971fd6a906bc8a156901fc6a42497c2cb143c61a664c0436bd0745ad8d4d7bba6d38b7891e23ba91d571bd08d92c3b80005162005e94403dbd8e43a46715e0334a65859885da4f759dd396717ea7ff2cae1f5084b8df3312f94cbc00000000000000000000001641e8cead000ff9b5125e188a9625540c944cf61f4a2e88323000000000000000004121431030c11801400400000155450aa047cdcb34f1c827137d29d29e9560feaa99c5f28f510c0002d32b915248b80e32e6eef962c68ecf95cb5f3c7678b926e80023c100fde8202779264c18c69d0acd283a50baf0caa5d12824000000930a0be146dced1d4713c4c179c1608e564a6936401c929a4fa6b56a1ec141d31c21420811000800001669f33273e5748719c8a3c797ab5d18d6ed3b61fb54c8193551288c40067c4eeebf904f7411e61f380a41c3c8ede23b3745699d3191006333bb820218b00e620497f410c46059e9336e1dbf83be96b114ed4e37cc0b261417c28db9da3a8e278982f382c118000009309ccf090ea92273fa332100051044c2a27b839200599018c18610e00a00600002130e602f6e1550799d9cd01d213764c6509b3c47c660901b3cba87bbe9d54209147859258254a0098c29c8eb260c634e8566941d285d786552e894123b34d2b71d9a695b6e20ec86d84c3aa7404325f4e9acc255db35b61c0a64571005584017047df3822479cb5d4a7f357659dbede8141fd563512417248000000000000000020a9018c186104000138fef25fd29cfc5d25549f3e4d33693e156c21e971378e5fbcef5ec6cffd99e6deeea0e536a23d1896180020d97093eaf731db391810b7b964337bff09d3909f8b3df8bc4f0a361d83af014948f7a00a0890c53530a000b304120d40011904308f61823b0c01185f86c2f82617a0b0350505e02e021ac7e0c800708124718b7a1423b7b0274c0806cfcd612a2180486b5404805000d7668dc0100227198954800554a77daef4680001cab2df17225d0a436164c1d6098061261417c28db9da3a8e278982f382c118e372528e7707c000000285ace4836873ac2fb4010299439156a40a3c5781a1019420e20a090008000009c2183565edd6f3775e0bf9bf04a7ac45d792ec8fbaa32480b7983a732b677e01294c979d5466611244f1c1710a1a2ef901dc192c058664da9396a7a73f65053a046df017a60dc023e97eaca799a595e21a1609d3cb22d5864ac090c5fd5a6ecc00f8441e1c800288f56200002520200086aa015338bf37d88b018aacb79e39d000000000000000206175792baabc60f071b929473b83e000000142d67241b23882c83442433813402c00400b900080340007e4e8e68c989b45d9f494388eeb9565bba1e40803e84b4178e041815333c0799e9f2e4041bea4c9a48c7f86030c85c8d3695a40801e8480620360540230080007948158ac2ec37aa8054ce2fcdf622c062ab2de78e740000000000000008185d5e4aeaaf183c30300c71b929473b83e000000142d67241b33062461c31c11c0080040004b1800803400082c8310af8845dc0c1e2c8a1f73bf330026180bce2001863cca0000906080021c407929f751a471a89f7896413ea98ef12289f54b4b8a2eadede6c1a0005593e20804c3040010000135204c1bd5402a6717e6fb1160315596f3c73a00000000000000040c2eaf2575578c1e09a39839439020820208602c66c97edb4e7f0fff7a98eed78a01a664771600b2487214e2ca9c31d777813aab51dee39223bd0ba0100014e90ae09e0d1a36bd2241c48c3bfd554a5e438603923145d9c186fb8e7d8e84618434d8ee5e0fc3800c9d5707ea41800a7e424598c100997bfffc144a8009de3050580600001ff210e5208519042068001da080078490b94185c08c0d43616e03b16129e481f0780eeabb8349af040b2c063d748680ba6de021b1ce2c22477a8f674d31a4af215af7e1206a96f0433703e664a7632a3d07012f8df02c30f2823ace31c660280a64fe4ee7238951bd83a5464000c1fafadc1f07867461d4417f3572df3faf0cbd0c235029cda011ee3c84b44752a233573b7401f43283350790ecf4318308843c955ad0e8c1848ea9bd114a0808f72d567835d901c8934006af431892007a88a69c10068330b440004e3842010f244bba3a921c4c1d4bce3f3093c5deae76704c764b544)) <<< 16000) + 0x4508f177942d9e08aeb1702f38007939697c20051c708c0500002f67886fe73d7b08cd203639eef0b92c839a96cc1c202089a433b212634136ff9758ad0404e6a5a0b7880c0c239bc15099400fa0e38540580af010000e39f247661043c61281d57c933c1a0d398698c099794e1bcd0000b4fe0e4803a009de2200007443280200debf82180a03084021e4ae1d2aae8c240613fa944842e6c03553c19926a0a80c0815418e00094308402000021042d847c4446c883e1641db0172e16280acfc7b8410116d429100958db5b20605039b3c8804c20400100af010000a310b519022888238240008ce42b837aa8054ce2fcdf622c062ab2de78e740000000000000008185d5e4aeaaf183c8c200c71b929473b83e000000142d67241b33470810413000c0d200998aa75cca076fcb40703493c72ea9a1e86da4311f2f0347665153824cd7d1689d70a58bc505422ac8fb4ac473e2aacd2564ab785d255bc2e60f21ceb0bed0040a650e455a9028f15e06840468e50e18440210208238167cba012d5c94ca3cb7dc8d11b0b8b0c6db3690cfd8c4786743e85b68e10fc31500026921581a0ab0d0550682a4341501a0a70d05302829414000ca04003f9082d9ac2d04762b7a6de4d20a1429f201aec40ac0dbccb9d2c15b1c263440c088376f38249015b704a6283809132b7660100966fcaa5e040050c6752814044030ca00e2901849c1280c2130ea9d0e20ec86d7669a56dbb34d2b702113c93093c53023c13402001800400000c9000803789805912021e28b5c53880e147eead08a7840f253eea3820f85033b1810000012c050426202100800009f9854c866e128a8ad52850c28ac1506d06c34f9e1e70a3ec780000000000000000000000000000000000000000000000017c4e20e10d10e04d04b04300548e92aad037241b00680011690b305c0a31a84916f334a2a3dd716f04064c58d9ddb8402b9cb3099b31c2071b3cba98341267b4805670c10209f5acb728004dcca538724029f6f581f20802b1a52e993000fca182802040a493769d43cacbcef1df4063f62cb9728306db72334025d7704c30c1304c10043c00f850fd60049c60800200002c46b50f60b6401c929a4fa6b4ac94d241d140a3ca34a4074022802401800800132280200db2c0087d3e02050709b7e493ca1b01bed2280411ff6d03820aa5a859151408074a5be808102776e92a78006244544044a0508c02000034640c8640005da76b71de4fdc7d3ba258efff6b71de4fdc7d3ba258f0017c40cb2759623a22d52bf97c40cb2759623a22d52bf45813c93893c51830c32421013000801c840080368a02f019265e0f269d52d3a379389a3240d541f0c240d3fb57e611830be907c69c430dd4fc2867b02811e78e68e89c405e90e4740611fa1010540580001de2164120b1050308282c01415e0a000462208a2a08e0d0005b410ae11e8f85e83f44c43076a58ff4cfd9a1e179fd911d0c09e99db4bec0102e9c9db8dd4041bb90e44b0b1802c1342aa9dc00000611e8414b9c40a40b1b5b8ef27ee3e9dd12c77ffb5b8ef27ee3e9dd12c7800be206593acb11d116a95fcbe206593acb11d116a95fa2c09c41a41c21a1861041100960020064200401b2483eb15bd1c4393956239a460003a5e164000e8b001c38eb0aa6a92180d3323a1210ec401fa04164a4b8730501040010000185215a120003b52158220ab110550882a444150220a71105304829414000c8c4005b80800c8d10a4390519482887414212002ddc21400a0041cd2008812427d7613ca300301711078fe99740e0e328309f26040ce88c242e340dfef72bc8660505a29bb1037e1cc84f4604c6c4049580be74664f406b907aeb46030eeba7a7d941ff1a0e6c0404008befcd09490c507eccf06d41014216054c6a50463d021d12824000062eb5cfaee474d0b21c0e72bd4328a4eee6aca64c5c0f0710d677d22440e445db1f07097b662594905136943ec6005ad15a6c2003483d39440261820008712c6cfb04881c39656731c2af922108483429a4be0706ea9286f84a103e01009d0504e00826c041340200014f2132330981984b88c2583612a130940584982c168161240309101d8c8a58ecf248ccafe432a386641d1a903072e1813684857f371afa4004a6b99581002751f5ae00004e484001091a7c2803189102aac95ac60cb0eeb604b088bcc84649098ead37880025182000804808823c4611c22000148211a4b02b218220aec6168b9a518a448c0791214680470cf624ea30030c1bde93e0bc8c242a8eebb5b3fe502376ecb8e554305784baf01fb10004979e942c108033a457a5c28000007d092c2b02c48cb7a897f648899379672307b87e7ff8584ab4a74624842329090e50280afd00c402255fe7fc182d30934440000141410004023044000354410814000812422cc742f2dbea6b205bc4f139640766bb8bb450b579fcae0c0b268ff5714145e701d813040f804022816112030440184400e8526d3c061901a3f7e91446080dcbc98c2855f3d94321811cb8085e920078a39f0c4005eb1e6d01004019eac9000a0608402000032a421c7410c2a08511031068210241060a08205040828000f4c8401a8002d14c0a39847640daca61f336bb80384954126d0c33fcf5aea67403047f1f808733b8e07760e60010348c5a51dd65ee7dbe4604040129f4fb8f59aed366fe580018091580d508be6f1df68f080100b1b6b0fb4a0527529d8540000aad93f062c2a76ec45c4545c0001c018786b101bc0748580e40001c8100127b20fe)) <<< 16000) + 0xa307e5183ea881f0260f61207a01c8a5e972c3a0d749388385112ec43d5d984f819381200ea6292d7f3189a2311c0dcdef5c6395645ad3c2803a707d5d7507c7b9644002778c9844ad50cd0128080a5377154d4f9a3158164000172db3ee139bacadfa46542a0224a65c4709c584f5cc510e30501e361f06800b28f504400317cab1208098483d9c00128c100043874b9bc1825023086bd2638208a3171e480104cf92a100148e83644a0840010e2810ab7e68a0e49b485149081e701670a0427190f1e4002000800100800039883c8481e0040ee0207601000129906205d844b48a97030571f724e6502c62500620461840010f2c05790688812fb726b74c0fa02a33c4a00221d6c80901080021c2a08776c8122d1148db39a2119985778a1129c16e02002b223e964a00400108181f98ac60c160522e89922d262b9424022309ee14284ea4dff425001f00800007c90002113a20a8307b1102539c2cd51e0156520a59800672aedb480040010f2c1ee907f8b12092aa7e62002000800003c9061010000bd100049420ea220740902d0481cc24000b5c41c8860e2330701583788c1b8360da1306c05e0610463da82860c42c76a5056f2f6348600162f069401208100043050e269146303099ccbed442059a032b282c51ba56e0240c200080358280003b0e01771b9ee011101c00440594acde322452822aad43030359a0c244281595662282482667ad0250c200080358280004648000c210600dd0e7f00c2f8a10cad117930011e6289a013101f00460a0e2f453a30304a01f0a8a16a990755808c30840200d60a0000c320a413a14bc6994918083a66f871800a3feb7a80118a10004305052709b1303106ae5ac24217d1c37a142fcfc9f24009040800200d6120000ee200036e4000db4c883f0c9d3c70cb445ff41005312c8cd8c007c0200c00306a01d0a0ec172ff204076b5fb50825819bc900a04172170c82021242e4709400840200d203810f249b184406702ca89cd0062cf60f0b000572d28c9010800200001a6400081483406800c340ce1a06509032048000d5483310c0ac760482390b23cf6fa241873b5b249008a0250a000023241e00868564db135c9084fcab599209b5d74492011b83a21e00048383e01006505032008000414831828074140003f64188378383250d370811b4ba45d2400fefbf9c0004cd67f32000906080021c61ff53158e08056c004d0007283f83011156cc9900074021000010040000111a141f8ceb38904807fc14c402041671c08c108002000014e4184260c013e154d08572382204d5f11400f2a6d3846083c01005f01c0100401101ea6a34fcd009b92b8c6008df94a123041d00800004f10000db3630460e3521418e20cb00500004576089820f802017c07418b82f37d1c0092781b5422082100800003f1000151200062e400c54000a68408876048238e933386b2962f3b15f0d7476f263f8c10bb34d2b71d9a695b6e20ec86d84c3aa74043b5c1102c0bd84db5c1102c0bd84b68a2e9d68e27dd68a2e9d68e27da1c18c18819208808209200186e8e2259b44e8a18ce9ae3ca38c15e74df4c3287f93803e8a55d40cae199d94ba44426b7b0f74921581491928601f84cb16ed15640d2533415234b96d221bd82c2a1c795a091485dd4485525e37b0c1a6908d2811860e8040178052116d646fecbc7f495e96f31495408f4fd54e796f1ec6d0470e5f4e6e3d4b1938b7124f065f8331305f8c47127dd848ec7d9411a766e11d8f2300c5fc060562d40d6ce0b168cbc3c2ca1e264dd50f8d7a6013655d6d65d8b7a93b292b8046022c19a243fc5374e0bd8a96afb4643600231357c7a98030e325a7000f61929c12e613abeb9269c28ff5ad728ef2206e0a0f8f853f6bf4ce5df0109c36b34e6bb57182cd82d2d6ad67295c25a7ee2e50d4a5d52f452cbd34f3853af1b965bbf3a88129c81a3a922076ecc64a45492b6f5fe204b7f1a9d44828f315302f1315b9eb4f6a78a46ed652c43d286c773d37084771bd0000f20400218882e8a80ac5403a0a000d3420b85205b1d02d0c80c8540027f040d4d400423c4101160b28b0353d81e00e130ea9d0e20ec86d7669a56dbb34d2b7021a85ed3cabe50c2b0db6df0576b82205817b09b6b82205817b096d145d3ad1c4fbad145d3ad1c4fb43832073053021400800016099a5f73b50333e45a0e968fc04b0ce552804bdc65de019462b41975df19deb950830ada053ee30f9fa51c2b705f23e3a9719724bd2a0228be5272e8ec6905e4c99a4e8c9be9af9672d4225d2bdd6250d2bba26e0eb8428e789ab4160160ae0b0560182a80f4a07a6cfcf4064b0e8c9f3401a0d137724000342c9b1803f8cd1e50808c990cc72604200086900551407881b6c6aa5e91020f80400001e4c261d53a1c41d90daecd34adb7669a56e043b5c1102c0bd84db5c1102c0bd84b68a2e9d68e27dd68a2e9d68e27da1c1185a031431a09408c00405987155a46e04982f36d5dcc1954869fba5dfb4dc165f49e5b15a0c8e4a40d8991fdd277e14c83e5d143d2b66cebe5505c1330b3ba401cd71cb922816c8e390a203b45826201188423cf9a099c8a8cc940c02dced40a03a3b0553938210004000055c80027210540d81284e06e13150484094faee78180deb389fc3002999fa3900078021a401bd392488182b07075440829b747ed2002ec8564e8a010c1a3048202287168193001080400004bc81502c14c0501c61b37124b1c14a3df9491c5b9a585111045cb3cb850e80ad30fce0923cf6b6c704dd3595a)) <<< 16000) + 0xa7002000860e0dcf164448e3322e29c8881759faa628737e0ade8704d8038e1a3827b58b38a70013a0be6738010004000055482900e030f847f3bffc8194fc48e831a28853dffeb89e40300c48ffd7a1a0bc94bfedfaca0479ea02d216280e516ab9315080b6d29b72be9f42010a40b00a20b0001ea20009c0409834000e9a4088660481be11498c49f0c22cec5b6c10327f59d3a3052ab97f7c308ff8b5b212095d5045c081365b066a0839037dd88428101f00802800bc5973bb0fc91574b63dd2821bbdfda4308f4c2c6f20020a0a298503ff577c010984078021e29f08f7971c558cab3c850404a5361830aafc9152980aa73b214241016eb11620128451478427101f0080000ab100029620402201d01000238901b1d00e0e8004cc081c18c13cc768a2e9d68e27db68a2e9d68e27ddb5c1102c0bd84bb5c1102c0bd84c1c255bc2e64ab785d2aacd2574ac473e03c448c204382480280100a212642c56beddea3b1a8046625d4dd796abc4ef304ce41a4497e92522848716b59444e4e11c4449a987d62ca50b58e7ed3a02ed01890dc9df58e1b3de7d8b6fbf3d7ef99bddfbfb0a1dd8b324abbd9a695b99ec4c27380533cee130ea9d020dae0881605ec26dae0881605ec25b45174eb4713eeb45174eb4713ed0e08c24c1c714a105001016f4239631592c9cce024dd647cad40af6b43d9f4e4f0bcd9e1b84b3b639dd5eacb506864b165d3aa51d98c04ba48318dcf1110a41ace7020dfbb2eecfb55b8f6bcd61d32d842db40a9b086515f74841542d87206acbd4f46405a756fabf4029b7245f01902080021a42f798d014818dd1a857a80ae288c54b402f3213a7e1608376cb5d0d0056eea3bc93041080400004cc8270080008e081282e130ea9d0e20ec86d7669a56dbb34d2b7021dae0881605ec26dae0881605ec25b45174eb4713eeb45174eb4713ed0e08c24714a10f08304c0050171cdd20030833023f1361ed3d5efe94a2abfea11e98b03b19db7e223619a37ba87d66331b8b203629a63a63f512323dbadce21a05ad84c3aa743883b21b5d9a695b6ecd34adc085d9a695b99ec4c27380533cee130ea9d02059b7943f5fe8b2b9b78fe77c5bc7f3bd0836b82205817b09b6b82205817b096d145d3ad1c4fbad145d3ad1c4fb43842473061430c21c161fee26d1a90d6822c01cdc4665d63eabaf2347310d97e5947c59582935762f15eff12973e93c0d9f0fabea2ea6774f1e5b4c8077c13963401cb231899f5d8fac5117b123f71b08b5a10463d424dd23bc580a7d82a9c483c995a9923b521e4881830d30e25e0a194c251c386160f9273b8e0ab0885cd9c0052bb4a9ad010400100001853c4a1805c53123d7598476223612a8d05060d48971928c81040010e251b28d19e48e83860c254468d03fbd91808012f9a84305a549185470018ecd02c0982084020000266400088c80049490260900066b90221581204e441d582f8c3094ba638d890cb720f4f040b80b9e71100c6f6d1d0a2128c0f8042c63b2d8b538c224dc0136ce0e59dc20e848200cbaab7081294a6dd50804a304201000010e20401a01d0100012b901b19000b1b104d1d01a868006a9c8261a812c840943a0491900d8680f02400680a41214400bf54406c25229cfdf0fca9526abfcdad6ae7e4ac9057d6e4ca851ee9ef24919418ec4a381140553fae12961f9e1085972a0e1803030fad3a49279583acff492d6d8a0039b17ca072f5652a834df5d42204100cd9de1d694d5328198fea006c10a070a2d36f5c036bd1290694e3b02405bfdf80d21b77bb5088c279496049dab765f45262e37928054c6d1346044570511f31d019a100d0624bcbc7b1332f2535f1a5cb000af2f6c0c9116657a261a347f391c0c10c148dad898de08f10741808671ca25ffad270fd7d12a986bc228d71d7bc57cdcc5ee25c0fc4b4371bd6a41f0aaee71d2679d22dc60ecd7052157086c0005f86efef7e88354713da02a12ddc7c8b4ca81ef804602dbc766059baf6edaae6d17bb47c899d0b2bc8960a1b608189fe4ae42cafb104536da12bcaf9677d7a3c1dcbc8571d1d7cd29f7bf614f13921ff6314990830c6800bc30ac996b52343b1ee3a5580878f8f76dd2ebeca699bdc89dc3623adf3cfdae6036989ff9a62b596f95e0e5222fe0bb358a91d495dde1c6831422d8a5b041084ad92c048804d5236c6024d2be2927011c0fd3be00120c100042028020080460100001b9e3cbe038af1451fa8020878091278e6ca0001472f6850207c0110384439e65071f911b65a450a034105bf09841080200002ac82386c09827c607f3034f061bc07505b2244015b7ca8c30015bcb13e0090408802008c020000f5208a220002e420881ba2044353c0a209354821520200b86bff9a0004638440100430502102800038882094800155482018c0fcc607c5303d1181e00e80e7b1d40686ac84f078ac3a8cdd6f6466a6ba7a0626336c7578f83355f7ef2af548e97b92da40240ae6588b17ecfb0e84f0097dbd9dc186a9b22ed5fb1852a68cf7b238b3d8b753e07da7d225998010f94e6ff688c1db86d3130157677666916b7774089477056658ab777470b6480166aae4d59a1a4167f21d76c086a92ae7ae099c405dc1cb661b49ff08be5a6abe76c7d17c3c5caf8763d6bc05e0921cde79321728df918a91815706f0fad26d08931e2ceb2da478a40dfea46a6c70d608a4c1121c4a1c30fdf1c7c6105b4c40a0573a91c5050d866b09e042ff1a570250c1f00840b003b8fdd1658132549c1104025a8c1e083432503e24)) <<< 16000) + 0x40036af479ca0042010800008020000088c0b01b9f9a52cb026e5a20041dc8194f244007686bdc90008002100001004000011100010f20761200027f20742380b0cccf890820e804009c0404c020250100e00800027881204f07014899178a2c9723bce01006a7b0a2e084c508401003c0201d0100006d90392100e0c800166c81c16c0dcb606c4b0350dd8c40f4d673a51bb324938e1014ca1f4879558bf78e6021fa9b1c00b73dad8880e0878513d587ecfb125b850068c0c5574adca6dc3a1204886b75bb6caad6fb5a208048765154a968e5e904917b88fa6588139e1e1201034a84526c18e1282b1e511025a6d0a187e6347d8a141badab40a0d507b31620015f412079a00670f16601306100043c60552f8743050c1b68784000b110fd0604f56343f0001ca2045654107c011658b0401e23c614ac9272306748d096c60bbe1b11948003e0100340100007110330900010590321181888c0c04405e2302a11f940ecac940ca265aa653fd8c270205fe9d2ab6e8690765e8bec8ed809d20d2dc6f4c8a1023881354d3b868011222e2952e2b644718edb7a03c8c82a0968937182c758af3088031c980ad5f87674a0cda8f7aad59ec926b84fcfc8de6f43ffaf5ae46e6d33c1cca01a01608668b35ced04c789d3bcb1cd6f3a65eb97b3b91a76879645a0a7eca872b880e62009716883683c9044a0316ff2f0a752b7a1c5e580f10c9b327084ad8012c00f851fc0688e1b051c6820284a7cc9301389c74093770fe2d4b348d1f93031e48aa4210a3ac4c350428cff51d8b538692d193ef74a6084c3c73c7ce34f020000000000000000083047df3822479cb5d4a7f357659dbede8141fd563512417248000000000000000020aed91b3c66814b36f287ebfd165736f1fcef8b78fe77a1022261a1a409e0960090ba6160f3e4368d969fc88973307692afe7a5f756cc5de93fe64f7fc0bdb84d2180fe726a6ee42fabb23f6c3221a08d9ed3324e33bedbbc18db51232dee1fe0585057581ba11c4ea225687d989d81ef1ba6153e59bdc8040d4c2b9841541d57dc32040f004246a26ef1642454daa4f549885f43ae7530adebbb742011a5fc95f3801ad6320433040f80400004a081602800089881704e262639dddb9e6029f0e850a2824e7aa51a1854d8ce0a404800c34196003cf529f00930a100042671089ea4648c0029ddc282c189352c2802f3bfe992020f0042674c6bd012a0a4dcbce51e0054823a20803950a2812020f004000033081682e068021d4210c332ff1e5f2620f17d6dd1c2003c3c26820c410d7f72602598fbaa1c0019e5c5383386100040000570816048000d50800251902b05000652100133b3031375579910112e541500c11bef335d100805dd7841240c2000801500ec23a80fa741ba21abc26fac187164bb89f41208039d1f6c562fa165a833f4f56f96e9a10f4880b04c71d6fb0d78c03f91c070c455e9f00a1a91860840d25fc542a4aa9715174683afbe222068206925b6ea46e27e07cb2f09ff2be435f42ca5693bef0833ff36c096a634c5e5e428111e3a002905f9440c96edc30e6bb2ad41612a749f3410205feb4e080284bc20a8e000076c1b1600bc601890670c1f0080000aa100051620501a02705013028094140380a00068520481b9041576fef040c6127c6e10058e2285a180def508e4524101f008586113aecff1030dc6cf0d06182835c681008108f6678504000ed8360811a243533820cc805b728270821008794140749a72c30e5edf52881805feb4e1008455d6ac40837987951a38000076c1b16001a206e642708210080000b01e242d8912584921b9f13723c111eaaea49400b8f4b8e4300058d5d6e00111328d400260c2100800009a900042b20461a0220d0108480802403e1201e0500e8080016b880e0e8008e9c801360101b0d00198b901a0500208010194500c18805cb402c52015150022dd100a8a32017ef46867256b62dc92304bb5227baa9c1842cb01c5f3203022cb0206c3c0283616581372e6202ee988591dcc18176fae6665d41002439ba8510480a00237b4d2cb6b970e8342c02c612e1ebd307a1c20000016f8060b5d77f5c26142000001752050111a9bd3630c0165d572958100054426363005440a3981300a38f13362714880714a22e4f5bb2101800000396c01c3546837d8db8306000000e93408003c7651a07b8c008e7b01b1290802afd7fc2da6008899105056040a2a470a29217c4510033f28a6de42861d9d5e9882e123000000182540504148edb5aeae480025eafd42ad2000000000992000190e285a040a2b3d0b4b9b6288004221531cb1800000093028627b9f6e52491800000095408200ef94d7b050401e4afe9e0000f95c22a09c509802000035e649f565ca6f2353048e007025d6147dca14000000b37180122984b9452cff092050000002d8c280202006299a43a04810408a1a85ea85212007c60b48ba6ef0419c4103066078000232202813822ba4ca1c226c1d2e062816de6116ff181230000000f9f5f416876469d1bce1a7e202060004b7c7be18b5f9057b53e0f163d37e40843f427da33a94185bd417568f30f1e847100000007ee4b21db8fa28a883cdfbc1c100007e3fe7241865936269d9dae966dd1c04003381471550b36f40a7da735550a8d909b34e494bce2dffaf6f3fd63103f8b400011288098a800299880900800322080071e10113900818803cb401c5200d2500610802c74014320091500408801c3400c12005010020080046b0801b880084400202000010092179)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase15" = "QuadFullSixCase15" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase15 private def zz2252:"s08cc"="s08cc":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase16 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l1 l10 l13 l17 l27 l29 l31 l33 l35 l37 l5 l51 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l1, ![-0x59682eb50, -0x27c2f49ddf,0x12868be0dc, -0x674ceedf2], ![0x388290d20,0x12868be0dc, -0x2d4fa35c4d,0x95c6651a0], ![0x4b0, -0x674ceedf2,0x95c6651a0, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xcc77837d,l5),(0x2fcc0aa4a,l8),(-0x3d7851ee,l10),(0x4e6d950,l13),(-0x26f0b5dc,l17),(-0x2cb417800,l27),(0x2cb417800,l29),(0x65a143d3,l31),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x2fcc0aa4a,l8),(0x65a143d3,l31),(-0xcc77837d,l5),(-0x3d7851ee,l10),(-0x26f0b5dc,l17),(0x4e6d950,l13)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x11c02c803000120110058c0400000110f014c0200000000f01480200250982402d0030000000780248030000000b00248030000000d8024803001a01040098c0500001b024030c03000001a09018c02000000005018802000000016014802d510e19c0f6d005cc10218406490058408608c07490050000841400f0c0400002b8c402cc0300000002b01880200000000340c801000000f07028c0200000001f01880200000000e01480200000002301880200000000502c80200000001b01880205c0a01c0175004000000098024803000000070024803000000012014802], #[![-4, 23, -18, 0],![-17, -20, 57, 0],![31, 190, -177, 0],![5, 26, -39, 0],![-7, 18, 0, 0]]⟩ def dynamicCode : Nat := ((((0x206d7cfc26af185200376ded1c4ae9cc07251843489616cd1c21b3d995db18202770b101000000009fcc9c0090021033e63e39eda030a2cd575d3a612200067baa7c03082cd5752ae60e18ccbcc84d8a3845224dfc83992000fe93035803810aef760c1c488002a01c0000eb101d05f16ce3802b1b020430cce55463880c34d344c54e1833b5250e3dd050cd4c0849d282010ca746daba8604279431b76d08020ebb439424704041500e0000764e1b10b48685070c6a2e7a58440c325bb572c709362479a7c4083ea1bc0b420415836c5ac498309002000028c687c204adb50282068cdf3f80048302be7714f5c022022da2453f7f21827b7bc50042c3007b7bc6a74ec2817a3bbed5000200e5941127cfc03694081601400007c080e0ac06c44034120190500c00a0601a015592a090283162b3f956870b1ebcbdb40e83043cccb1bab5b1420d9e676958110009e55e9d18f07016f5a8044d062800d9e67a373115a482afb0cf529a030b40b103b24e832680388341f12cd58a213f0ee32ae405123985d258c105e5aa70f42022dc094502100053a0ae4ea200015fddcda06004e91f0cdd49002601440e966d0f070e240a01dea7d1d7e4064752517c4aa286a59cfce1f6) <<< 16000) + 0x01866dd84ea7960405059c0f2c61e3042620f9b5ca028027f7f5943e000005866ea0809442400b00b000044400938c3a32504009123790807a90233309c2511c247da65c2a5021b9d9dd2070622f1d5bf080093c9abdd9c008c0200002d240341786041c405810da8a1560b3f241be341c54dfeb988ca400515ec39222802a42443bb594d558dc060e26d13062f670180023285094ad40500071f822b49b4040000e32f75a8cfe04120064088e301bd42897fcb7aafae9c28be48842998cb1199d1e98e09802f87e649aad6834ac28204283bb5304a1a59afb8208064fde388bd09c849963800fb73db40d17cb362e24143fac7ede8c009c17000026800294390394310110082092002000064000401b03d46eba335a04071cdb10f66721dc50c04c37d4b8da52064d3fac2ddf3e8c3631fc90ebda8890c6e373c07b4084020a7f88f12c8e0410038b934667800001b1ef227f7621391200620880002550009c6925f67fa241c98915ba51ef4af31781c50195f3459d39e060c058c78fdb4e261c1071e6b8369e0b01042f7e21a9a35ac18000846a504898e81001b68620599f97000043ab136d0881a145a890036058000143000c0005b5003902989e1fd3b90a229a47b7b3e8821d87c1ab670e180a52df51a8a190612e5b2b061c70d7334990c0141646d406040000002a30000033bd823b6c489002801c0000fd191a6a30f1cae244a4d3fc3b6c811c60155103182116c738f10408767633ea4041175089985860055d87dd4b28e084c0280001842001cf8400517cc0c0b41e80bd4902ae38216be8030a000000e5b01015ad1d8463f6384689e97d4370e09796bf172b8300689e943d770003e7add2c4b58a000a8071031451a7f7cc520535c3e82f28030a0000008598070c689e943d77101409113a7ebb1c20000010b300382029209f7d38001b0baf9b7f3728002b01c0000ef1e2238f674d954510c6cdec9fc02083bfa21a73a0c316850d95270e11690311dd9c706d18ffaac403032a34e4412014031b37a7f300800f49c27b8f09120852038000204202e020160100030c10151180a06c04c360241b8010b4dc34228189c2d6070805ac86fbd08846304201001101708c58975448e0cab5091b1040193d478c646084601000c0580580c02807444d28e8f37203124d078d8404d9178f1608055fb198544800460100100180780e02a81b7ef8e08a9679bfecaaa998cf97bfabcf485b0b73b078edff2e0d1cd258914010436efc609acce896e9ececd7a7de1c19a83f7d1741f78b54dc7152710d354100013577831f3e6091ad72657f5b8c3d3ebf03fdea4e96166bfc7896cf61b932c476c0f7289ddd62b204e076b5b917670a7fcae99813356cc5eeb7f3dcf86bd828e7b754d7d21d65d8c6ad1479eb19ede9e080645f147e2334a4c46c611f86d8000512201c12000649201a2b80200802201143e72791041e004000025900c0580580c028070709671b506046b34ebf1122141f00800003f100016020011c47081f60e45fd10100c5c64ee0e00000003200602af5d30626180018b8c6bc150651c250080048080004e080058c900285a3c4a22edb9870fcddf61861245994f9145cb9070a0316ae493e4dc6e8a10f16e171ab0049951411389189561c17cd020026942dca98adc000200859fd3baf0604b7a19a962e6f8ba2de22b4843a870c3f07848ab41b7e1d49136f9d21720e200070bcae242acfab46c0382000c3d184300190e59ef0000158d01a29c008c02122af1a802487284000000834048962c9db8064a0c18866a9f01214cb61061701c10000049d404803fa2b784007000000041a0720009c0500003784014150220822984f2921841f30da36101e4a0758d3b8c18000004650100d77de0d1fc080041f3166d6020002078ef1420081e5eed178e10500300001bd2000a5c40201783fbfc6d1c83044f6fc9c707062a280aa80c0ca6727f9c101000000e10280579d8ea302022a2811b028157c120ca7714230080000cb10070170c7f0dcd9c061214670ed81010d1d6cfda2815b436f4d8401f32d0a7a060093aebd0411498608c02122c5aef7398a23af104878c1a6615e138a040756cdd840025db4eb29286100042055c5cdde68a2ceb5aa3a0609d262102a284471c9eeb0800133b3314a0042010c3159c2b9d0816390f90ae28bfe22f9dc18279f1053d96000002ad30600246345fc280b4c7e8fb9c00840200002b6401415c44116fa2a820bdcb6ea4028112b4c6c54504ad9d887a1c03943d938c40086509eed59820880200002704000f8080302e0424f2b344e388408a1a76040c293a0f988a107b9dc8b61404606646fe18073d6df740003e690016028b38a1180400005d080035110008033842f760b104b1c300998873d21c20000005dc0182bed08216351420000005dc00c10124955e980c00460bb8cd3168e185002882292ad3029410302fafb01fe24400000012c040853637fa1087100000004b010103294f302198009c021044b1c842c842060d565cf28c488000000258081089456387d0e20000000960240000001194040010f2c4502e700270080000c3100505410e4fc372021c58aa184250101c747bb064070f10adea0603060000025801826f5a2529a8811cf62159e45023a3dd382002736348088808250100000ea10004f820080bc1800000258050d1930f5818282f0a533e341010000004b00a04f3cbc9a880005809b6d58009cd8d20800000064101989973cd998509402000037e400c04004020008c120020200001000d6b1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 16 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase16" = "QuadFullSixCase16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 16 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase16 private def zz2253:"s08cd"="s08cd":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l14 l15 l16 l22 l23 l25 l27 l29 l30 l31 l33 l35 l37 l44 l5 l51 l57 l59 l63 l64 l65 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x210b0f99d, -0x572d59370,0x302b19b7a,0x1416be8cc], ![-0x572d59370, -0x293a2ddad6,0x12010094dc, -0x5e4a5ec3e], ![0x302b19b7a,0x12010094dc, -0x2c67bca11d,0x938b8f9c0], ![0x1416be8cc, -0x5e4a5ec3e,0x938b8f9c0, -0x2b96acc10]] noncomputable def hinges:Hinges:=[(-0xcc77837d,l5),(0x2fcc0aa4a,l8),(-0x3d7851ee,l10),(0x779f86d0,l14),(0x7509c2772,l13),(-0x669775e3,l16),(-0x80329d88,l15),(-0xd189d51,l23),(0x268d8aee9,l22),(-0x2b96acc10,l27),(0x2b96acc10,l29),(-0x9fe2c43c,l25),(0x3b7aef39,l31),(-0xc6566ee6,l30),(0x2b96acc10,l33),(-0x2b96acc10,l35),(0x2b96acc10,l37),(-0x64afd474,l44),(0x2b96acc10,l51),(-0xa13e38a2,l57),(-0x4cde53c,l59),(-0x5743f045,l63),(-0x331678e,l65),(0x9cb281c4,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2b96acc10,l27),(0x2b96acc10,l29),(0x2b96acc10,l33),(-0x2b96acc10,l35),(0x2b96acc10,l37),(0x2b96acc10,l51),(0x7509c2772,l13),(0x2fcc0aa4a,l8),(0x268d8aee9,l22),(-0xa13e38a2,l57),(-0xc6566ee6,l30),(-0x9fe2c43c,l25),(0x9cb281c4,l64),(-0x5743f045,l63),(0x779f86d0,l14),(-0xcc77837d,l5),(0x3b7aef39,l31),(-0x3d7851ee,l10),(-0x669775e3,l16),(-0x80329d88,l15),(-0x64afd474,l44),(-0xd189d51,l23),(-0x4cde53c,l59),(-0x331678e,l65)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0xf02105003c401000000841400f0c04000000000170320041030de088092d0050000000ac1c0a3008000002882c050c03000000000d40920080000012874098c03000000344850340040000002506024c020000000098303300400000108640d8c030000003211036300c000000000240c801000000000c807200800831c46a00e5004000000000a80520080000000029018802000000000ac0620080000000a05018c02000000000a40e2008000000000640c80100304660e402c40100000019898024c03000006612402130100002b13058031003000108561900c400c0000002f0b028c02002cc540a40244010000002c84c050c03002dc540a4028401000001845500a0c040000000005c062008000000003d02480200000000005032004000000000f0248020000000c43c0a30080000000039024802000000006d013200c000000003501c802000000006c00b200c000001182c034c03000184321203c400c0000000000c0c80100000007c1c0530080000000160c0cc010000000009c0620080000000002c0c801000d421060022401000561043100e50040000025044082301000c928483018900400000007c34053008000000001f018802000004d0480313011440a104400635006001342304803240100a60a209804b5005001702807005d401000000000980248030000000442c063008000000000e014802000000001c009200c0000000012014802,0x6629014300c000001a8ac050c030000638a102483014000001b8a40d0c03000006915c068301000001544501b0c040000000000d03200400000198a40d0c03000000028180f30080000000f07028c023042441900306401800320901c024d0040000000841809300800310941c019900400000000883033004000010421025cc0400002082b0306301400410a41101d500400000000483033004000025110d02500200000000098052008000000110d028c020000000009406200800000000250388020000000075013200c00000000170248020000000d45c0a3008000000003901c802000000007400b200c000001982c034c0300000007c240b3008000000170f018c02000000000070320040000002b0b028c02000000a213014300c00023098280b500300000002c180d3008000000017c04c803000000000b8072008000000d82c054c03000104760a014400c007614c33012d00400000008428053008000001908c084c030000000004c0920080000003113028c02002287814c0c94010000001582c034c0300304b10900a640100000000019038802000000001040920080000000015038802000000001102c200c00000000f404c8030000000008c0620080000002209038c02000000881101e300c00001d01102f4c040000000002c092008000001883808cc030000000035013200c000001a82c04cc030000000000f0320040a211418803c5005,0x6824063008000001b024030c0300000000024062008000000190901cc020000000001406200800000001e140cc010000005221036300c0000014864090c0302982083102464015a51410b601e99006000053881024830140000130150358c0449c33c128069240180a812a1a40429005023c3182501b240140002a12064055003001504d0dc04a40100ac12618406290050000ac4c1c01d400c0a60ce11c034900500170490c40ca401000000000160148020020471098048401000000160380acc03000000aa32013300c000000291901cc02000000a83100b300c00000001e340cc010000007231014300c000001d8cc050c030000007231034300c00001cc6701a0c04a3070460407a440180000002521028c020000009e47026300c000019c5101b0c040000006229036300c08408608c0749005000000220a00c300c0000002d29028c020000088241c0a4008008209c1301b100404147288c00d24014000001184c054c03000000d261022300c000000000740c801000164a216034400c0004b2185809100300244810980484012051c514f0216d006000000ba3a013300c0000002d1d01cc02000000b83900b300c000000002f018802000007718406c3010000001c8c40d8c03002e473064044401000b51cc19012100400000410d4028301000721682d035500400000009484073008000000170501cc02000000b251022300c0000001a15014c02,0x2719014c020000000005406200800000000220148020000000008406200800000000210388020000000443c0530080000138110058c040000000003c0520080000120110058c04000094260900b400c00000000780248030000cc5a0e014400c00a214c43012100400000008474073008007318c260129004000000084740a30080000161109029002000032845024c3014005112c3c01b1004000005511c06c301000000d4150120c0400000250740c6301000000d42701b0c04000000003500a200c000001609c04cc030000000584405300800000000b00248030000000036009200c000001b84402cc03000000681100e300c00001a8210058c04], #[![-21, 22, 34, -16],![-21, -5, 52, -7]]⟩ def dynamicCode : Nat := (((((((((((((((((((0x164b5eec0d2c24911a8a3b88490b08839674a1ee32b91c41239045c043e283152910fd36002300459319cd937b342490bdd10cc161240d332cdf214c1c0033dd53e048e079986bfd52851a26e6b71b14193d972bf9f8c0007f4981ac0500fd094ba8d492400a406000040440f4160b40b0590586f00ec6420f13fd6ac91933d895b0b52060ad60a1737030cdd110d486a242a63d58be998b04a5a0f123ec2807fe8901721880028dd0b47a454646050a80800003c243740723d496669de050c074e3af750e322669e2c7050a8d2884d86102ff3b4f321838a2994372f00e1a6dcf1cdac5042676101ad88017bcd3a2e8008ec8e1300800007ccc027d11a84e669de171ae8fc706e09118b8f5d8b601b5a00000000000000007ae82ccc0f03205b190742f54ee3812eb6ac18a84574dc83e6488388304280200100aaddf91261ed61dde3ad878e6afe9a6bc1f882b0311315cf738551a8a37ed24847577654f2b12c2a892f6b327c7249460335adff82901d08c3620ea33e8001f810dc1d86d8cc124661b433e29f0836c83b040840f31fbb550a207d44432b5640685e17675f40c1cc3a0172eac28614803fb6008a0b5b62ffaef0100846a5af5f30000045249be53c88ce41a150100000868e1a2682dbbc0e1821aef1691033b56216b838516a005858508f29d334c8811e70ae064081178bc81dc0002a8139c118040000614c027d11a84e669de171ae8fc706e09118b8f5d8b601b5a00000000000000007a22863022021823002802000005e856d2d8f0e251b60163a16d45cd994714d56e7282324d3e3dc0af631a67e5486dd97f9fa1dcf2787fa0005644364a41b0430d70906b04c354141a802e13c5e361a0060923cd3bf902840f9d5a1941802d07b2df00a01545c8f5380002146d2740a8062eaf0a382b29156690c6c4883f628c484a0180aa01595fc84b77200a440e80d38780e65830c81499e21a26c306025efe0e0a246040bfc3467f33058410054c5dd9803840d615a1d817e48227685b639fb43802fff622069b35842400c00f1654efba8f706916d9777c49844726f36e440e32664098162dd60ca9244840bbc689092087d243492400636106ddd00044010000191343941daf92dc0c91c2c597fb75d040f2028f853c7d28634a90fe7f100c33f2992fec420708a7aad2783f0502ebca058e0101415da3533806a04085ba857d46c28812005a068b29524db8281a41a019f36b3081495c301e40e3db93ebe4b165c779ec516188dc827f6242056287b7e400347916b72800230080000cc90003e1219e139207d28a58da58ce0c40f24230511526ce390c2c0698baa2090e7162e2d683842e7034c63241b117d111782013edcb2b185a4061280a00006c8d13f421adfa64c1c65d7bf5566fb1a28098b191c1289140d8ce52287e28a7e0cd27869c2041603c45432d90184c572ba6028204704a8d2cc581000d5c8e8e7f0bf49002d03048c960f9328220838d9f0aff9459fa48af6cd03d1292628a71cb7323149040859f23c89e9b83843af11a21f7e81029ab65c7afb0048151996b45a4dc200d4466a414c99e1812006008000024b36342eddc7c0286a77b657bc30a051f4d2acc0c1f189fce121b5429ae1b1c217c2bb5b4cc084601000013d21a6130100980030a10d211c91bb2a12dd10287175fa1630ae534bcb39020df0f3d60208f47650a10e180ea490ac184faf01bd10a01769fd10c10058b0ad1f5200440100cf0186880c34007242bd1ee90a58c8678bb3a9828affdb73230ae65f0ad4921d518dd398184870dbdb3920927d3bcfa0801cbc6fa10340611004000065ce1518618b39aff930425181b60c4840811f0c7aa041c4d1041247171ed19c08087705fad70d8e0c29874ac57f56b080457fa623a5d7c1815e5ed2ddb86f01008e923693ff20f01048019022033c07243e8023e3c50d086d7703182846040c6e30acfb774ed98191bb) <<< 16000) + 0xc89544879511e71786124d0f5a504e0844010000165219c0b0100580020e10cd090003fe10991181f00e44bbde53b1e2da20476acfb49802014304eec2a365f71020198b79a96eb0c1071ad268e09e1c041f1f5f45a900805a89f70eb07a540607ef07bffd20dbf1c80c00e143a1200986224a14d0429e956e48a6ca3a38be014400e853cf900c083d935dcb402043e23f1fdc0083442b992cc040c05606ca05c3861480c2c8a909c8ff7d4b1950583d4e2b2868e1369841a0614364b6cee882041e4565ab5e041319aace17801c30e93c33edc07087b732e26682403da2e39c60125121054048b2312c4621d96345db1ab3d28631775ee8e30a29705f714240823008000070900030e21981b0cb0d80684832814000a884001dc0800ff210c929c0a0d1534c31cd9225d4d1fc18d38408de428f29aea9218a553c85c3483848de06a11eb00409b9eadd7dd20380132a7e5e0fe0600d23ad7d1d68abc92040b80b123fe6ab495db048c1dee83fd6e9028ba2b6f3dc828a000001dd101226ee58ca59f6407456e749fb20409a230ce41f81006c7a2675a600000003520431102054040000209322724b2a392da40865c5df48e69218119c1546f040781b05a81cf0e15d7892f5ddc282325a9376388e00f1b27178f81802582448fea2b3901854040918c4fcea328045140000017f18091258bc52c70bc80d5dafd865500208270a8a3efc050417752be0a40900e7c1543cd80200748ff24c500000000180602a440616012000086882f82c00109c82084e0576cebeb89f02038914c5e48ee1c314bdab585f51c2424afcb8af8101200d72375531800d29a2127e80800f66b4dda280401ddf465452054b6408160122056ab769f0bc30a000000954070c8fe08244f901440ebe646c1c20000012c0020201030ddb041064b96eaeda10016ab12fdbc14000000000200112204e0200001f62190130c70100021590c60d0628283100418602000d1721845b0c12986014c2fc9617c4b0bd1585e08c2ec479a857062c101521bbeb5cf271ad4d101f71ac6b1012302d4a4362bbc6e30570de1441531452031820c22c02008404f37ab818f9c51fc078e08e930ad2f1c9e5dac63f0b81528b9911998503f0349d23024c8f56449f5b967e881a0922df4430025113e471801080430803403968d6245019cb98032244f09e954cbe18401983fdaf330315dc19bb6e2001cf8b950cb14008285ba4dc10003bde7b4bcc8800280200000e3900028a21741380c87dd9d1b16100d13ede90c21758018123020a79dbce01061bcc4f4d04005840657a26042300840677b592845edb1b2c208648552a12f6186107525e511d4fe106040ac5d9424d8954282083ffabf3a3b5f041c31fc4f74b36510e006ca770150e68b040005386b9f8fa914180136ee8532d61af21902a2410e418000054c42e40400082642e03616e1306f05d903768bd2b20349e7a32d8c1022e90eb4807029de924580366b53e80942084021c5d79fcfb458c7e8a541961681067fa30000978790a003c08ffd2800f0043cc57d8ea6a60e0bbe0398c0e0ca21c49400025638400000cb21252800f8043071932131a3bfc4705476a7a3460d012602b68a5828b94171a38861800d1343d7ae0cdd5a7696f81820c69af3080cb4c92390008b0300006bf237e391dad6a1444d8fd87b065975526bc2802f87c00009d00020001c9800cd28b4cb4358a14808c7724a04b75e416c4005a280b6400390ced03a5002000800007e98185a928012187a5d2fd9312102d0f656c600023a704908010e9a9ae854108801000020e4001b9c85b02fa4c321e3d74c5b70447902aaf0b8a611db6774adb07b7efa298839feb7b1a446b1c269800000000000000002038d63588091816a521b15de37182b86f0a20aa0e30a104086004005c7f8fecb7c492b9e3c36795fe1142a3700d41a2cd823850650db86f86d70371c07967aa86bb21cbe4c1f99fd0002ce55aaf9a94262c3dfbb47c6d02887d1bd40010f085a8ac0400600193c42d086166430b22185890c2c08615e430ae1d8568ec2b0441560b0aa0150aabedd5d5294756343b6283c792c70afd08509bbf0f792f64af3ec08c3bc871fc0657df620615d13abdc0fc16468a8950a40926b879ea10402febaf4a038e5a954dc394d57b5ec5a8c18202379e2daf3d051da23119672ad2c85bfa8800bf0ebac1fcf074054f85e8127bd743140122b01fdd9f2262916121f87ca88644694e7d0fbcd6743abdb8c06742925148819c50a7e65731d0a12f61207fd90200218858610309f22a1582000508a9bd51094508c02000022c42a4578203096ddad24437960ca3a60609bdb5ad090f241ade3b180020bbf260140075b5636c18026afb7a994409c708c0200002f07591fc22201cbbcfce878ede7e416dbf0208a3f18333373c2a008000000007ab86b31821623912516470d8ba9e7bc055c1245c9a7c80b42032c2202081000e62cd8c36272869b594d9f718eb645a372ea29c27beb5ed41d46b22032e75ee97ff235fa0466307755d2d8f7751ac8cccb19718a90699754000ec085410c29c8614c3b0a51d83c8cc0b46744b65381282a48f9627cc0f66a2524987a598ed2086ebad3d20bc0668a17916d6e5c94ab25e0d6d70ffc40a143780ac7c81a41395dc8a7a9db810015df1abc896740739309d8436d155dc2a6b7841b573404408dd5105098fec4f5d1d0f47d3a5079cafd5036f763fdd4edac4c51e330a6760dbfb495767d5034fa18a7d56e33305514ab70a7a3004723f59e7851099f040a0)) <<< 16000) + 0xc29a3de208545548c096ccafe9a54997fca47264c7da44d9c2c670fd877ed787adf645fe15f337d8f6d8cb5f6cf3ed1f91fbbe96372d3515fcb930fd7f7f7818ca6a582893db44242e702fed5be3791728323af731abfa7695993542cf8d76492ba8c1bcd557624b9323585d5f9250d650994c506f1f8e678adaf1e2cd0fea3933f5c79a1be512ac9048a4e767d60e749150e2fb4ac6d9be8a28853424100191c96a4b0e4bc51cb77a0b43b1356df83f20646b9b55fc9c02382d2bc04409b23ae4526a37eb2bd259ebe2a8499feced46ca7eedd17a538cae32f92b3630a8d2b58b2cae265fcbe6fa18e2461804ade1fb9a48709d32da8a1989596ffe474b02346a9cc840d80c937bcf79cbc40724d843b5357de7731150e38c9152bb71a8c656d3a0000dea718e897fd7b6df84743c76f3fe20527fc10e31d12ffc3fb21e000003218c6023b03d009f446a1399a7785c6ba3f1c1b824462e3d762d806d680000000000000001eafdaf8a69d8148490488486600400ab5268cca0cad425de4047a3b0bdad7822db4b230fa7e01b3cc1ae1ffa8e9801e7ce7721832b907f3474201085c98df59cee6d4744e13a7d5a10122795849bb1784e6d5b51d193ea80025f90a4198518ac288561422b0a015d94bab3eac5963000e5de1858b8f28299d0e1895cd49725843e4a9de22128611004027c17630622c85a02c598216ae607004ae6fac1c70012763a73a24820460100000e5213c2b09d1584188c17c07424575fee60d2c3a2fd425e0fcc7999741b00c197a374dfdde789096422d510c25a3f378b21d53bd86d134ccf2de3a18b5c1ff40b518630a00365ff84641f514b37231aab29fc13ecfd0a158e29d5afa8b8cd742e28d8d2fa09fdf01865725dd667b65139f27d05ae708f4df27aed0a8883bc5c7c22d3412fa83ace14c084daeb6597f8ad8dad71d471081d22bf6911c08ee899fba485c5813f2e25274a4b9b468380170d7e75dcc4d1f28a4e3b2985ff8e064aefb3734d288b98ea7bac94a301e9f3d000e1b185b699f673a9dd91b4c99c6b48981d501ff6112d831c0001b9cd65774c75edb7e13a1e3b79fcedcbaa82004cde473af6dbf0ba1e3b79f1779af607d88e4494591c362ea79ef015804fa23509ccd3bc2e35d1f8e0dc1223171ebb16c036b40000000000000000f5090c604c005003005445931a3434ff0288c07cc439eded1c2dc97a23687f4a12401138dad602cb4550c5c8e661fa220dac67402edb945bca70b57ed13c51f69e602fb57c2f1fe55ee30e8ffc5505291c3fa80027c109c0504d828003ad484d10800879c84c8ec0f807a8c78cda3d98ba16f41802a6a7202b36fad2e0adb07b7efa298839fa230e071ddcd12ec00000000000000002029486c5778dc60ae1bc2882a2903efe8f73db279bf43e610096ff398a10a0c21609c004025c22e824d8f297aa12cb72310331c82b551d4d52460d484e43b3f897050ebb3b840cab78f6c0e7d2dbd6918476a5f99278c11fdc35cdbd39d67dc5ad6e2715f4f33d8ceeb799f67011735a30eac42535d7590725bcedef45b8a2e6fa8e4ce4f4f9cba57cf997fbe034a10448905b0000100444e016877b88e3df4e41cc8a0045d0dfc31801080400002a4f1e319c386c20474ab5a9a40040008a2812681b1142055c1ecb0818dc02f1850099461b224001f008000066900015f213013c3577a30cf88081ae3c36491021100430d03b1f04424300e4eac092004fb8cd8c9821080200002a08190080005588001f310971184b08c25415842a8c56e4cc164c1aa314187bcb223040c16cca4b53960412db21e851945084021a0276aef3206064b2a3658a442040010c63a25fef1ea304c743c76f3d1a04f3260887d8bb29c2899377b8f670151ac00d14740f2c853ca2d82ad6806afdfca31d6fb83f93398ff665482000000000000000000455290d8aef1b8c15c3785105544104089006006c758a04c1ede7513c5fbaddb21c6857eb228d8dba651fa29adba306f522e1f067635641c46f8b96db5d626c6ba43e5d27c37663fa741f0b4e74dfbf324f1f5880518ced872435b7c4112e44280028c90005b53e2e361f7451e15f07459698069c14a8b0c0448667588401537fc590b286100040250071153c4fe728a29054680a1c2a6046c32200f828317890107c02012603e28c10e65a4e1f5435b9cc514d0b3b1f8a0208dee78424082000800006a98084ace4b7d2430d34627e8c09d3ff0670d020f73ff422c818420100000dc200059841a404000828423834001640600802008b00b201acb04096cc2df88810780200000ee4248270000100404880e022ebd09d4802702f67222041e00800003b905f0100006f10900d84786f0b152b2d24a60a0d7de977830e0b233c630400543bc9ea24042300804080f080608732d260a35435b9cc30e82ef252810008237b9e1090208c0200001c26ca25dcee340e08caee74acb034328d0842c618420100000ae211c020120100017190890504402800145084690c230761163b041198450cf518f19b47b31742de830055c5241c9a7b00b42a52f0a618318d2aa76a11d6df310cebf0e377460fd0daba30000000000000000010ccb04404c009008000deb2c61279dca2a3369288e4ec114de6f2ef4a2bf097b70d7a9744a8898ca48ffc827bcc50da77d637128492fa2fcc5f4e94769c8ae6e70b2072b3c2ce4c7105aaad8c4c77633ccaebd5d97ceb5e2c68ed4d36cbcbac8fe11100e5de7e743c76f3f20b6df810446a31e3368f662e85bd0600aa28e81e590a7945b055ad00)) <<< 16000) + 0xd5fbf9463adf707f26731fecca9040000000000000000008a6512604384284104200aa2252de2ecf0a48695e8750dd4d74c6a7e16d3e49474e690d20f9881ab6f484381f95265e7c38eda8e9f90087fefb3d27f149ff2e8e1ae30b5a305ab69d019b14821cd6892be777e4ca0aa84d034c1c21354461d4d01aa2dfbe61411190a0880200001da4224141100a0005a9206842000a6e20663b81c3219173a8e1a09a9c1f41810a9ff5fe208380e6e310880012e2bfc40a000181715a0260c2300804384c2182610a13e38008e7f8f0a290973b970061c1e419c9d140026a1a365840051d4f4d7292861200438e108408f7ca32b4600fb90783f6be3a4b753ae2d44e4d0d621b606e8020424ed30e5184d5c4794c75c6d4875d8ffb9d799ffe7a76fafc80eaf8187173c5866aaeef8ce623776bbd7046b5be928946ede6c30acd2bb763766417bd99b72a86b269e7030cf4cbc0120dc8a38d658ac8ac3ab1233a8008a370d2b4447c190714ca5de6aeb6eaaab7b76b10baa7583564580010331819a2b699a0e5a9e0912d82d41dbeff688bceff3bd28d61a13e3260ae37280823cb1e4144cccbaea740ed590e9a239fbb774bb6497a7f613817bf276790bd3369b99dd0c977799d90d9d51d78c342ca20dc869c00039d90840de1e0a0a97f2342038e7352c500195a3e2302001ef7af3a2d0208c0101060308201f960453e16c250a0571c6a2828b10262a98878801bdfa366200003605c604a084801008101f06a380b7c87804a10d0c130017942c6c92003a0cd3e464082100800006c1acaee98de3d46099d0f1dbce88385e3e08514740f2c853ca2d82ad6806afdfca31d6fb83f93398ff6654820000000000000000004571ac6b1012302c8071b5346a40b1481f7f47b9ed93cdfa1f30804b7f9cc50854e28b285004006c85002577eb70871f1467880d24a24fd34a3acf0dc5bc15867aac2dfdaaabd372e03834510a86a522f0411e8422c68d5583763fa9beb32ca3760f146e930f261a88030720c6e4039cff7b961eea06a224b40015988003ce10008bf20022b64200560fe2307e1183e88c1f0460f62300d0d03d0481e4060f0030013c820073184019de4c468eda10d6118d5e0f8441f6a0fe6983bd7c7cc3ae2fb2d46000000000000000002187da5b3bf71dc048b07c220fb507f34c1ad04f85affc89b8ec000000000000000008429d01aeefdef21f887c14e80d77800000000001307dbafcd694176b00000002a830620630028008a89c62e6647b3f17ee3a3f21bdf8f1a8a1f6e7f36ca13a44836a12599e3aba2182f99c2259cd35b3b592d71d59001dd91d5f8013fe38be8f520981dd9b7ca46e851c9752d5608e312c5b83bc74f4a0dce67e93110ede224aca7b41dc040ec0200065f2010ae0402d558d0c31c43d388e2066244c7c406349d20598c1c1095b8e2207132cc4080e0011d93b6413041100424630543f03105284077a713e39f1c4348223171df20327c0753cd20183b72a8dc8fb710336426098a4d1c102cd0ceeba10400eb5b649dad0fa1010580580001ee3028d870b04e486439a26138e11bb8c43b028529b3942306132b2998b40002b83ab1a013061100400004ec83a88c1d0460e6230721180a08c1c44609213809150d9920100fd4ec5ff4c87e48edef3baa037402ee50fd926284330bf15605adf6ccbfd6b800b19b4477344d037575f764ce1101a36d5f6ed4182d70879018810c3bee8d2109ed9c3c8e57a4006010db4c0ee40964a1dc2b1acb093df1eb5720bd39b1a65e7b7c41fbfdcd658669729b95b33cc159ad2688f5a7f63772fad16e420194bd7278e6817e01c6dd2588e06575fd501f7f6ec5ffb06a41b104e084d235f56ae247e0d5083ad7ed45e4e5b185799aa4560fd1cb51c988cf4268cdf03a9fe7f2cba4b3558c8598a52000066c20e01b06f0582f82ac80b7fd5b6902a234cf36080c0c172a32386644189cf1c2f933a77e940855b702189810840210df4a2305fc0b4a4b63a5edbd599b24871d4ed07aae06b90888b1c40c708804604500203441f970936b79cedd10ad8f21cbb822855bf7d1744606c57046a14a8000ff106e0983680ec71c10320c8a1906aacda870bdb2e1070582034bda7e0c144efaa03900421b80b38100a5ef8e169384108042c7028bf11296290e1f815c50caff05d76385ed30cfe50c107c2ec8684a104201000010620940a00029620d82306b1183508c1a4460222302c1183408f0b4d7348ba7143ed1307cb2accca6671644f5cb32a2411892242a5010bd29014800110b011ce003e0100640180500f0b60e0d97461307eae640a09088e3a78612ecbeefb3c15ae5d678102e57e8c5498107c0215b1055aad1cd7418ce760391b505afb5f0226cfa892705802d2bf1c2f06b40b33093832820c2081280cb6421e55c386c110092e41d5c810f7674bfb9827ef3d16d73863337254aac091034d00025d200073a4198360ca13c2ecaaf76b96520d20542349310cddee5911198bbc4e140e7863e0c081fbec2e28052147a7d3800f804019c060c8030630183100fceaac5283271875b19734e1b5d0fc6a46003e01001401c0fd40b95b879c9a5c5214f321025f53a408426e54d3c12c61eb2a10222b02e0e6001f008798c2eb854e448751d23c62234302750c9100aac14d464004469b1180800001fd53cc004201000012f20004dc743fcfe91e5650ca851d55f65f58f629a83c1eb6ff97d1ca0a8000000000000000000000000000000000000000000000000001944f3ce34f2cf18619000f006003010)) <<< 16000) + 0x0200d0002263848109d1bbbc01c783af718c07a50a0213a2a48805143b5155a24e1c1838284b71883c223267b85b44500714d79268003004b2199b0a00080600841586d080c2b02800010910007ae20012d678820ef575e40c0bbe38a87191684f16961e03da1c7202854b1c68184661425f0a02b9e5657ce003e0100640180500ec39414c35a404070db748309c133ae1880d271c99c0c14351bb34700936a092810332336b004e103e01000015220cc1b06509e88252ed048b0d2f63bcc90103ddf0070c27fa4b4e61030ee1747cc0013ff5f814033717c2467041f00803200c18c060c403821df6caede407102e52d01c32574bd510b1463f74e5030a0c1bf2db2c405292384cc004201001401f1cbbc6e790386184098a3c6144debea1214400033fcac50867ecdd10400a3a09d51c10000041a1d2704220080000b21d0ff3fa47959432a147557d97d63d8a6a0f07adbfe5f47282a0000000000000000000000000000000000000000000000000006513cf3cb3c62841444003c01800c04008034000898f1e1643e0607a4a1402fce700670f10140f3c738a0c10a0300ed6b9090c01fdf08d520f08a8001d9b128a00fe18fb3dbb0500496ded8e0f003664a738461c790185805800021b2000e764002394800607903d1de8eef77d3c480c4e53202061d751e1981c0c2de91d048083e0100180183080e44495f77c070215fcb424b076cc55a1040a8f4db9824041f00800e80f8874bbda811e4189d2895642ae6d5f3197c08166136204882d6387e94742faa018cb8632253d46927c7cefb43c0b053c59cccc8bfe349c049bc2d480f8b381621b7e7ff80409ed2a752ce09f617c8bd3b8c5e1ee694df2886e0e802408727fe46835740bdaa30244cf2a6ef0f2e2c09e49400ca0e57cbc6431ada05a3496a5a9f6bca4795809999a66fafe2451403f991375486725caefcd540a11564680004ee2000bda414c360a41391d7e7abd4285e7ebbba87090661dcd2410a5cf78c901ef998f194007802002803ad882ad568e6ba0c673b01c8da82d7daf8112fdaf8a69d81486b97e23191222e8cb7a20a99428a29a21209800205523e52a595ae7deb26e422c554cb2b1003feb4b27fa45e374587eaf9382c20c96c34604961ee80015098fc60cccdcf0a802000000001eae1acc60844d24910c0cb0c604e00d02279973c356e6ea5a05cdfefc499e7ba4fd61961376e10be2350001b020c01b91046b17308826d203dfa182b7fef5b84835c720c488012b6ff868ca103e010b28000002fbc5038827f7286d9c5861b1fc4d146a5d1041c8ee874525430c64b9b50e1142414df066638168e0099c099551ca340025b2a7b33c07d1b0105c06800020020280a00032c20b60200090020be0200105b20bc4305d1de0c04d00578302512681b9081095fe64b0a0418651752483bb0c16be201008bf56006043533c5759c10840200b8030520182d80f4404bbfee21c30822ec2114366dfb671282efedae110c258a3e33b1413258783f2403f566f1967042000800c00c05c07e5813ded221c514b0ae850e397751f600e2bd0ddfb89827a6bcea38a22c6c840c4c004001001401e140c5e1a769e2883999802608b0bed3b88a203acf5b2440200010c430a08317f6e74701201ed5009382110040000594e87f9fd23caca1950a3aabecbeb1ec5350783d6dff2fa394150000000000000000000000000000000000000000000000000003289a69a48c21618819c01a0160060200401a00044c40013fc80034d903d1582d0ac164460b013d1d4db5afe12002bd5fc21c0ebf0b8181805642a4b490107c0200ae030180182b00f88247d081040434518ab420614383e891820f80401540603a03e2248473f6ce1025c6132420528772eec90237f2da3030136689a04494308002000020640007b082a08c14c460a413e2158922f8206350a3aa060a6f86c6f281b22f8f00804af61c3425041e00871455c5bbaa622efeec69d7a1472c4960367303f3bb0206b600754cd6afa928808981531f75722af186404f8140df72db34b1117508e1404fb9ba34da632b371f4000e03666ff0aa4968cf74e5f85292154d058765f91bfe008052c61d77275348ecf048dd8c5875f9af0d1b02e40049d49cab50cd4b8d04b8894919611785884b11e5dced5b85b7447309f506a4182465d9a9040a094a4400004c320a20b0190580c00c05c060a003b26b2e05f238a4eb782c22041d00802780ec93cb1ffe3b538174c70cb0444f69ec382c709df58fa3c511b08c87e2a6cc9013c42c52535fcfe80505109179e26ba27dc23630020129001f3e4565ea8f3be85fcf2d22080e6e1feff0039eb72e2d98cd75d83f4d040af9195dd01fd83d82f8ef687ba5c4bc03e6820f645320b5e2e67f8eda250722baac751e2383be2a817d87d66087c180000217901405c01e3e7943a04089d198974b000361a5b20800bd8b456090208402009e0b904a18578a13947009d9361612c3094584354a1206556641338471a08a8e39b4bfae4549e607fab1380166947e23d39dd949b3425780811ba07865952a39431150e7d000c4c9f754744fe3d70988bdad800c21efc35dbf2822f88420300001f12060c0001a37b442982cb2f5d10552f67ab134100000162110014e95c1726042200800009b904e09000220900054b3a1fe7f48f2b2865428eaafb2fac7b14d41e0f5b7fcbe8e5054000000000000000000000000000000000000000000000000000ca271c7147087807006004b1016140a00680010f191408132d8b82cafabe4)) <<< 16000) + 0xaac6a0f0db7f23fe15b0c31511f67bd8e042d21c0b44c2f0c648eefd4cc068771a3a5aa29bb70a4abd94a057b47e7dbf6401ffeec5de94500405ab177ba613c01c6ea9a03007da742ed6f867fe898a6e98448a274a06b7eefac180f9023c50301d19a56e38e20b81e889668e65232511108beccebe88c20eaf349a6c3037526154af820659f1b8806030faafeaeddc22123a1cfa0612c01bdec2826028040bb69af92424009c08112c30fc47b0822223fd27aad51840000007d006069d7e653ae040cc83ef84a8061f4b066ad7844243409375823000c7d704fc0300af9e2b724789002701c0000f9104d01d8e0620f937b230609511870000c2073babacd4cc0e4a971c126418682c7942f781821083681d0b9600a9f24ec2c8501016bbca8801002235c5bdd8e04801481222228bb3502da6071f2a94d180c184a88c38001869b4b790e42211563b080b2880316f7a7081800000008340300000000af006029445db011c4801300c00007a082602800107482582800218880e8280030a8800c669001f2420045264128140056d44015d108248ae84155115b980e20000004b00a0ca232226542847b123fc78082c26bdbaee040898d7107907007f8cf17202027e38ce738aba78bf31243901280828423f94210d8141914d3106e4870c00000546002848a7487c070082faf6b4dd8a020872a14b79c00003725ef1980201fe7a2e2778dd01d9b4ad2483901481000007f0d081a34e212944206701c21a817e9c4d267cb00a10ca644775b7a9220020bf253d418364964405021031a8874b02f1a0141003f7513aaaa8f080e003d1d1384a139a20060033aef480c367d04081bc164700f896bce163435b202051042017f70533a1340b5c17e6ed414a4bfa225d90548b1071041060c604800302dbe29cd9aaa037199a5b190c4e6c6bfd9cc708510e6d102ce652ddd52053d93e001488a2c924bc9bdc081001099ab15a384271f1ed59b1410106693d940e00b7bfb2483c20003074b3b6c0003295a27070d92005203803901d924d4a2bd1a048def9372741c30c73f5f3022850a18b61b647840a597ae994481868f141123fa4006b88425cac2007351c984f00001a8f7fe0f53f20050040b2c0000057e4069205d623db5e2c9000000afc8163253e5d7c50891978d0d86aa830d4eb149c99a2831f66bcee260a1846196248446006d8855cd372d2005204000020420008344001934c100000025816394830ad3440c0000012c1418e3ed93ee406a571c9328c19ec48ff1e1878fab16b0961054bf1786580493766ba64008801009002047010230080007f48228680028bc8220c810c0408402000d7b202832041150190a8100040023aa401c07080100b86036aede973fa3877165a4861102aef32ae956bb35ca2cc280bb125ac9d53e1d9a0e11488050c2414edadbacfcc1c81e1806bbd61e3146083e9b1e95002b73c906da84b50ad4c12a12d73e53739eb723c37544822050f94eaa2f46308271f049eb6d916a6cba0a70ac1a003f0501f00e0315cf30931c384be75b41c0fc19345810017c9205408004b1416e0250c2000801e86ec56602d99f245723e811e24300adbfe41c24f4512b51428970fe22241050923e398008002007803b0d33f7c5dc90c3b4e0fa470ae94241c4904b1472790800b11ea9409410800200001fe6847f066162244416c97842826ff7585318184ac0e0e1c00e4486db094208002000020240740400071240ec4607423a17258e39782874d3bc5270c235e4eb0b12002b091d0c90108402007203c9af6dbf0ba1e3b79efdda3e207d7ed7c534ec0a668b0b718fac323896e9f054ca1ca14308d00700502de733ea839e0334623f8552e7cad3266f4f36ba089fa65117f1313f94d8d383846088d1d6800138991184ec492d302131af1a2020513eb596c240a9d9e83cc59030880200001be603d30f77ca6104041e4a8c8b0452efbbaa0c007c82cc930c007ab122f82128811804000045081c0080dc04000b9640d8660282b0351580886f591fc22201cbbcfce878ede7e416dbf02088565774c75edb7e13a1e3b79fcedcbaa8201f62eca70a264ddee3d9c055d89990aa927f8d3b110ac00000001c79cfa0ab265a2deaf3ce7d0554000000000894704504104600545275fb65ef28557a67a7c5b505fbdc3b8c7d917e698e31c5fe51d72fff4785ca8ba00b32d73e6d0efbda74fd0b2b028f06a407cabbb1f1f022e97d9bcd1678a9e71e0f0354b9c4f02129621b68605e2546d58709ed798efac1c11b12d0f1d45050e5ff63e6041f051106f20a00919ffb53c08044b8c657785051a3921300a000065081a08804044000dfa40cc460640ac3abc777ff21c208c2197aa2011e029ab221c11349c17b920001982d2101c00f1a5455f14003a4fe93d09c20900200480b0220581002ec67fa70f0da42c102031736944da53319103ac4778f95fe8c3282481b4f40e6dc7f2026994476e30e9a70c164be89b062ccc4240b090a416b70b4820084ae375a8f9750040287138632ff6c05c46bd84841c03200c40606003c119ec4fd794255e6833e1431c6fe3a02052cb25c0da020f802006807824021302a2204261cd7a9920811955ce470030c905928802b4100fbcb28411004000042ce0f5e88a0dbede73792f55a6f2640da10380fb1fc49b4a8ea78bb9ca905d890586531f66698172e275c791d5b903441219a0a35e0c1021f9abb2d6ab04285c182a1e4456ab92bc39f31debca8c96708038d6c38d5d7f0b794748495870abc26ab17e4c2c148f2315b966)) <<< 16000) + 0xe4a797daabcead2094ea672c30e306390a40000f7480030090008e6205e2302e0d81686c0b0360561bb183852b19b08253a4963de103197b20aae302022a079949003b8186d6100078f8db8598008c020054030290181400c09c070000100401300c0600603e03802008020094078688899af9e48600c8d5a349001a026d2184c208c01000016040004088000bf10241181188c088460421b02005e122d184a4c08b7944b881675bf232c01ad3bd32000d80424305ee38a3029e5008f10106835430807ce9de50401f635cc9400700200001d24068078c744bfde3d46098e878ede7a3409e64c113151d7340bcaed7e0e3c182a4a3acdc8f1a771b8e7c620a996496110116092002012f3908b0884ac161547add9c67b195e91c4e78542296a08f91dbd059b017a9d95664d49c7e384b4db04561294000bec80c00c07c070040100400f00f03238b0533243acbfea0a282086cf2ea280374697f90c03329fbdb09420800200002024074078c744bfde3d46098e878ede7a3409e64c110d6007009f446a1399a7785c6ba3f1c1b824462e3d762d806d680000000000000001ebb133215524ff1a76221580000000382903efe8f73db279bf43e610096ff398a10a8411809408800e34109c4fe3389787cf9671fbbb817ae0dc4c1db42a29e1f8a73ddea3d4172a6fa3539909d9e600a0a2bad9406fc9596021f1a3ed563dcb14b73d26f9dc57cc737f4187d1abcd3378f8f6ba130f40d4349ae31d12ff78f518263a1e3b79e8d027993044c5475cd02f2bb5f838f060a928eb3723c69dc6e39f1882a2903efe8f73db279bf43e610096ff398a10a185142981921940043c19442f95f7d9f4024d01d11fc75a80b660605482591b11d58b19155b17227d37d6c68ead22b2f7a7fed44af0689b86082c93dd23e950ce732a8001f8100097920015f840704603613e10350b45160cf569fb91020e00400680760fe8b0b24d25404c24cba1497dfa0f618ba8770f5dbcb94b99b7b84e461a73da186cce03f5a28b4106a3bffc7df7e403ccafa800665be8a76f6f764f7e0faef32de6e326bf4480388a2453e8aa901da6724edded11acad16015e8ed22c130a2da4cd72c5d2b7080b5040879d127095510140a656f0c5ea64c21d7c7b1bd77d0068f96d8416f1c8be695305a8444290d510af11b0d1dc6344c0c0863a7d0f6074bd866b8ab0ecf69d26508a04354a274fe60d4f9de11208883ffa4caaa01b276554b83afd9b4dd73272314cbc8121a78800068520320b0180180b80c058070000100400a80e05843183ab165dc6d3f5c92280bbd7039800e30bc1c140420004000069901405e9602f30a964f288611c7a69a500bcd8c5328aae58908cc202000080178b00719e8c0c1400e333d7dd0270c230080000b81e29ac30ecb2de713aaea90fe4a3090d66969eb4924fad0453c6b8a08359a54fc9278000002848802802df76d8ab81201daf00efbe40322040a40800003ae6d72d8343bad4650b8396bba8fe4f120d4e5e78adbf2746c914000000000000000000000000000000000000000000000000000cacd1616e31f5864712dd3e0ac0e119da3d2e1599297a72931b1a5c2b32484666904107045804800809cb05451209c9e8659057eecc4c41c40017f92a86460b5bbefb97983728a2d65892efc5ed36eabe43ce4c939ce55270863aae426c5cabd2c9fb3150c257fdac6ae97deef577499ba70330622b0a9d23d40015808098c800291c8008ee9012010011321002610202223c181d017850c4916f83061a5df3d42591eed8621208804a119142cb531908083a035999fdfc888e0c00e14de26a900f47b88800a1cfef59dbe14434000471740aa4fbe03e71880902cd0e230a01d6308a003994ef883c8862579dcb00b5ca1102100201a00f05007008000d2880688800d3588023a99004af23d89990aa927f8d3b110ac00000001c11431820c21811411010c01141d24ba4c41459a00bf24d33253de22c1832571dcb15c39bc54093386e10e1e7c65b719860c0000038403806fb1d8e8e1800d1eda2b68a000000025804003b4fc8bf222a139012804206acee43210d9220e280fa4b808133aee8baf0e388bd3a2224620c3fd17f561c3061234f97340d0208af34d9a8e430238a03cc780180973d4cf401088629182901c53a035ddfbde43f10f829d01aef000000000002612472451420412402001c00801170280200dc285238ae08a86900000005dc03089585ca109e1640000001770041003344facac68003344973b53002d40e419340000280fc873a02901052028d3773554e3d58d24880ff7a8a0d040a18db4d60b04000000bb80204019a5eb7ec9000000004b00100019a5f740e7002800869bd669c5d34cd2c01aed2e0c1c480000007d034921984931f8488000000064030c0000034b7041006697218334004bfd9ad8400000000067232004e0080001eb20180a0003a8365f20a6dbfe116480cdd5d65298380000004b01639034291ec194380000004b01800000003390160038fe164730138614004000064cd9619a736f1016502b3ee98b0515c316b3e87963052b8ec37450c4a0546efb12300000009603880dc97cc06041000000258040014ae3ae85006440980100003d44002518800548100b15000667900a09e1b83e88c5e618407319ebdc8608e6c37a61a14200000012c0600cf944ce5f1000192bf3f10100000002588032cc35a7940779f74109b1413002000074480083910093100406801c3400c1a00501002008004a8c8018e8008740020200001006d2e1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase17" = "QuadFullSixCase17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase17 private def zz2254:"s08ce"="s08ce":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase18 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l23 l27 l29 l33 l34 l35 l36 l37 l4 l51 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x5cac66cf, -0x23ad5330, -0x20b427d6,0x4b0], ![-0x23ad5330, -0x119048aa0,0x188c95a4,0x28f88f52], ![-0x20b427d6,0x188c95a4, -0xe7f5c436,0x23b25f94], ![0x4b0,0x28f88f52,0x23b25f94, -0x11d6abf0]] noncomputable def hinges:Hinges:=[(-0x502fe,l4),(0x50301,l8),(0xc4773dc,l23),(-0x11d6abf0,l27),(0x11d6abf0,l29),(0x11d6abf0,l33),(-0x11d6abf0,l35),(-0x50301,l36),(0x11d6abf0,l37),(0x502fe,l34),(0x11d6abf0,l51),(-0xc4773dc,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x11d6abf0,l27),(0x11d6abf0,l29),(0x11d6abf0,l33),(-0x11d6abf0,l35),(0x11d6abf0,l37),(0x11d6abf0,l51),(0xc4773dc,l23),(-0xc4773dc,l63),(0x50301,l8),(-0x50301,l36),(-0x502fe,l4),(0x502fe,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1470cc08700bb5006000000000780a401000094260900b400c00000000f004900600000000210188020000630560338602800003506406e3010000188118079180a0000001b11018c02000000000d80a4010000005827013300c000000016004900600000000d8024803000000c8120186018000006e1100b300c000388218079180b99147046012d9006002104609807680200000000014062008000000001c029004004c0c4170121004000000441202c6018000642409016400c0000228520371809070d9052006d90060000a208601e460280000004c240630080000000026029005440a104400635006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x510190cf462074c0b840123600bdb5081970dfd340822ade95c1800000b8593020e8042e852400000f7b96bcb2382a000020000023b403a5dbe0a910392310310184096002017040100680009b9ba149000003dee5af2c8e0a800008000008ed00e976f82a438c50a40a38a40640210017080100680009c9ba149000003dee5af2c8e0a89030c29220e20c20c11000a00800190c0100680007a981906587f1812280001d4c01c4f1ca1355e309c6b65ba40708ad889dcb020c0c42a5f20c86082302040cf092fc8922011e97dc3888f0cd2d8c2471731ee1820a2f7da020a12fdbb4400901843504005039d8c14040f00400005d4810048000ba8e1aa328f43c78b00c19a8930436362010329cff70987060186285f381b66db070859b6ede648d70c106bcdd603f4e910207d2c02b376d21022eb13abdbfa6401513c4b528bc11de90840a1982c00009a4d0819bf2b3cd0c20a6f6f34c420825a25d87818104b44babe05048aa60462d0c10a6f5f62c45021fa8323281003ead65c6190178a2123da1d8818260200000f4101f1100f028074050346193db55607094f715853503044e133ad49c1421beffc4d401000df7f851a8070033a2133e682801c00a0cd9201b3d267898c20de02f148a7d388148162c819e244f843308823fb8464fed41a2461e286855ba2c8916141f739caf9c2050ca40dd653eac50c00110d693ab0180268a8a3dd4574a2b9470432050592670187970822ebcd75831231a2fb5fa920600043cce048b089dbbd0c5100010c458020800196cf20c0115e450780006cf659ac292004602801c010000f01d8f7291413cd125e05c481481040c208704a0030020030100200d0000d43c4000e1ce87a0286a326dc4dc9440dcc846e342884144f6e4a538818115ba0c94ce0282c7a850990944052c617bc6288600ae47f4766800058e462f28990a72400ac0f00360301a01e0aeeeb0fbb4440a6dd4e041b230bc269934ac6208cf097827303878ad14076323071414de602a404bffefe50a010439748a3658383bfb8d8380144c900280346159179ea7920b21633f94b3e163152dae133b286dffe3be762386575ccacff4704ba4f99fb80608691ccb8e220002e59ef8e62008c1fae23eb30900270280000fa1917895a41626a7204280e31292021028002128a04edfe1b917ea4c7d82c4012f) <<< 16000) + 0x9dd584580c1809f4669a9818636cb9a87aa6ecf9aa96850c74450804ae10df7463abe53bf918f6a06003d8611bbd272fdbd7a18b795e9c8023ac1c9bbc1d813003389200640400065e4001d648004dd1000ea6386811a2116060c000515c4141179f27208700000004b0180179f24c88500000507b4b001100200600402e020160100a80805004000338404c5601c230120dde5951ef71e000005d09d02b0e741ccaef327f8263c2e7dec56c0f2a2a6333ebac0000000000000000000000000000000000000000002a10a21000e00a00400037e906d11f42beb813e403dbae3ed90713c136a024820276520b7e13eb4b1ba1e17f89ec45fe3246e1f2eca2701e70617c2deba827c0b0ed52979b3942405a5383ca4da277365ed811d83a27738ece9bdd171b475b4bd345e87b6c0d1ca3ab9779238ee790273f59a5642ca8670d620e55c789460a39dc695e3d827e5e4859f84921202300012380655aaf8000690e4615081a00400882f8b4b985f69648386f0bc9240396a44104007f52a2c118130e2160500e52849810740218484a208c92403aeb84084bccce1c40554d88804bbfc709410640200001b8785a738e3268bc850440f05400004000004768074bb7c1523482081411010412801400000c040080340005108001b79c3424415610162e6c5b100c894a518a080fcb360801fa217904019e4be782006d6d06804e203801000014030040100400800e821199e6a2020824aca0829a915b02003885456101285924012840e00400003b080584803c140002d0608c9a791f90ce3ab5a6a21056bef6d7a86601a6e89be6a4a0720a0d3d4237b127e30df28664bb7803bb659e5fc32fd47c06137ae2007ed339b4aadfc5f5526ac19c35b27c81e157caa95dea66b578038cd8b085852aaa300c8782490cb8a8ed421acb6b7fb74ac99215c0af8053d7deccc0697a4df9973b993abfe5efd5a16bbf966eba72f349ccfa5e600a4ce0b355efc25fa5ff933b18c63158000136080062899466cce68a619b519ef3d983633436d855a81d9de2800000000000000003b873a0e6577993fc131e173ef62b60795153199f5d6000000000000000000000000000000000000000000150840c30c20860050010103ea47defddf9ba5d6fce49702989fcc817c230eedaaf3be9caf1dcf9a2042afa3e2a2ff4fc38b85ca4cb4b9946bbad312c3ce736bb70e15ce97ce1357d3ed741b5ae73ca156867d3804126213246280028a900175f200545061ce83995de64ff04c785cfbd8ad81e5454c667d75800000000000000000000000000000000000000000054b158dcdcad0a26b25fdc9054870c7046044045004003000b0d733def2add4cf0cfd7c7e5b9bac7a223ff571bed7f0e2d9ea2ea10db74fb8baa5f60afc5265726a51a583fa476caa72624e6e5d0f78e21ca685873a0e6577993fc131e173ef62b60795153199f5d6000000000000000000000000000000000000000000151c1403887eb50000000000000010a7a4d06cc7105108087083000000b060080364585a7d028b0090c030097ab44203f3c0e970ae060c0000b71b00241000a4aba1886000a8ba4c5db1000202020d8f027103841501e2f2ca8f7b8f000002e84e81512882462452842441c428008030080200dbcb2a3dee3c00000ba13a0561cceb7c55fab485c1df14fbc3f81bfaa0c43e4de50000000000000000000000000000000000000000000549d2390c8575df0600c14f53b070aa9836e63584000000000000000000000000000000000000000138cb1cb14a14b0ca00802c000200db2e0aee471163830581c82c521a344be50a60082f20b0c29f96cc8a000001fb198007c02000024640012988002d3900076e20013c640383601a0291599d9e6860c9568680705d40b71050672206745019e2adfc094307002123cd9599b28c2014f6f838c11fd1baa78e0a3a8806f0a0aedcf8ae06027e8daf484025a6cc1e0200d85b36701480c200140000c5100c09d0a0c77e5840989bffa140311fa4e31840d80424935d119c0e20117a69c60a3aa28301021a4e1d70c0374b46a8401feb889c26081d00800008d900b090050280007e4ca3366734530cda8cf79ecc1b19a1b6c2ad40ecef1400000000000000001d91eacf5a08e816f7ab8bb2352059aa7635c9ee816840840230028020001bb7b703b0221a2d6a05a9965fdd8ba8be654faffa270914e1f821785dcc3a6de3dcdd7ba93a5f8167ef96d514b827ec020040100120300801439d0732bbcc9fe098f0b9f7b15b03ca8a98ccfaeb0000000000000000000000000000000000000000000a904412a2f20b8e328e169a0a91430c28a28820809401000600180c01006c39d0732bbcc9fe098f0b9f7b15b03ca8a98ccfaeb0000000000000000000000000000000000000000000a904412a2f20b8e328e169a0a91230c31008209801400a0020180401006f1c190d78d110927f48114b688c30c5c8e6040854ed344033c73aa60018008694a7086d93470fe669b8e38069c53820800e966c682306649b340903991c4c003a01000011720004546cb2f019e21644e07e1e451440a673058075654e514005df8d192820e804001c1400020a4001694800402100086b20017bc40042d8d16c90cac4450c74915b245050560f16440400142b5040039169f28300000006402000c9984d82e1040008a2f893781a4308065536000c18000012c030404ad03798a0979f24c88202000507b404c1044010000138200c1a0050900202800c04004020003132002020000100111f9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 13 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase18" = "QuadFullSixCase18" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 13 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase18 private def zz2255:"s08cf"="s08cf":=by decide+kernel end section namespace Green24Proof.QuadFullSixCase19 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l34 l36 l4 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![1,0x190,0x190,0x190], ![0x190,0,0x190,0x190], ![0x190,0x190, -0x50302,0x1ad3c], ![0x190,0x190,0x1ad3c,0]] noncomputable def hinges:Hinges:=[(-0x1abaa,l4),(0x1abab,l8),(-0x1abab,l36),(0x1abaa,l34)] def normalizationDenominator:ℤ:=0x1dcd65000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(0x1abab,l8),(-0x1abab,l36),(-0x1abaa,l4),(0x1abaa,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨29, #[0x11018802], #[]⟩ def dynamicCode : Nat := 0xa21b1ee2860190081806402840190081006401040191080d030201905382090042886c7b8a18064020601900a10064020401900610064420340c08606aeacd0082401000011220000ba2e4450f2020790142c808164020b2390b215820240114500c88a18064040c0320284019010200c806100644303575680642b840880200003fc8000e69 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 4 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixCase19" = "QuadFullSixCase19" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 4 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixCase19 private def zz2256:"s08d0"="s08d0":=by decide+kernel end section namespace Green24Proof.FullSixRows open FullPhaseRows (Phase) open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x114e20003dceb948008b492ab8a01e200779ae58001e682b0d2620003dceb948001989488f607a2001389b4800db088d21fa2000ef3acd024d191aa15a20003dceb948007ba8ecbe601a20003dceb948008acf39f822200779ae580468ffeca07d20003dceb948004f2e581e21fd2002fd7c28004828f91921ed20003dceb948003acadabfa14d200779ae58004b3a28b92520001eeb5ca8012ced8deba12005faf848008acbaf3ea07c20003dceb948016b7bcded21fc20003dceb94805ad0e8be1ec2001de6d9a01ce6a1f6420003dceb94800ddee4f1ae0782005faf848005ae86b79a02005faf848002e5eaf9fa14] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x107aa0001eeb5ca8006fa8aa5e62a0007b9d6a818ddd79e760004e2ad800236003bcdb2c004979fce07e600779ae58001f68efdd615e60003dceb94801aabf498f601e60001eeb5ca800a8ae5bc9e6600779ae58002b789a5d21ea60001eeb5ca8006ccd3fed601a600779ae5800eecbcfd82260003dceb9480048a98e192560004e2ad8002160001eeb5ca800c91ccfa1ff2005faf848009c7cdaac202f20003dceb948001bef4b7be01f20017ebe1807cf38bea720005faf8a035dd8eae14b20001eeb5ca80089c98de320001eeb5ca801590c5fc921fe20003dceb94800de6c9d0fa14] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x103d30003dceb948004f2e581e21ed30003dceb948019c5cf8e06d30003dceb948001869ff1be1dd30001eeb5ca80139be59e530004e2ad8002130004e2ad80021fc30001eeb5ca80018ee2cb8643002fd7c2800ea3baee1f830003dceb948001839dafee030001eeb5ca803bb7c7fe7e0004e2ad80023e0003dceb948020dddcc607fa0017ebe18017f6ad921ffa0003dceb94802781d09aa601fa0003dceb948004ffc5c49e7a0003dceb94803081ab86fa1fba003bcdb2c001d1928e3a005faf848009f0d6f5b21fea0003dceb94801ac2edf0fe6a0003dceb948010a189dbfe14] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x116e7005faf848014acffae15e70001eeb5ca8036f2879205e70001eeb5ca80028ffbd4ba670003dceb948002dcc0e6f6270004e2ad8002570004e2ad8002170004e2ad800203f30001eeb5ca8002f0e8faf206f30003dceb948001bef4b7be1cf30003dceb94801dcb96de730007b9d6a80292861cb30001eeb5ca80089c98de330003dceb9480289efeae03e30001eeb5ca801399b0de1fe30003dceb94748a9214e30001eeb5ca804b91d1d2630004e2ad800216a3005faf848009cab0b601a30003dceb948036e8c6d223002fd7c2801214] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11fc0000bf5f0c005d0fcda02c0002fd7c280089abd9e15c0005faf84801cb38dda1cc000779ae5801bb6d5ea05c0003bcdb2c002fcfa400002b196c0027f0004e2ad80023f0004e2ad800203fb0001eeb5ca8001fba1a1de06fb0001eeb5ca8033d2ebd205fb005faf84800496e2967b0004e2ad800216bb0001eeb5ca8008dbb5f63b0004e2ad80021eeb003bcdb2c008f4ccb66b0001eeb5ca8011e999ce07ab0001eeb5ca806c809eaa2b0001eeb5ca803fd796de770004e2ad8002370004e2ad800214] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1740002b196c002640002b196c002540002b196c002440002b196c00207f0005faf848062ad879617f0002fd7c2800397ef8e961cf00003dceb948008c2bed9fe70003bcdb2c009f4abbe03e00003dceb948005dee4bdee1fe000779ae58001eac48fa21ee000779ae58001d2e8ccbe02e00003e8a48001e2af9215e00003dceb94800ae4a79f9e05e0005faf84807ad6cd92600003dceb94803ad0929617d0002fd7c28002b195bf9e16d0001389b4802996e8a21dd000779ae58002f0d8b2e2500002b196c00203c00001eeb5ca8038aca4ae14] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x16c0002b196c0025c0002b196c0024c0002b196c00207f800779ae5800480ca8e17f80003dceb94801a80ebf3a602f8001389b48002e386ba05f8001de6d9a019e3beb2780001eeb5ca8001ae03e8003bcdb2c070a3c217e8002fd7c280069fa4ba06e800779ae580729189f215e8002fd7c280469e808e1ce80003dceb948002bba2e29a680002b196c00203d80001eeb5ca8005a79befee16d8001389b4805bf3c2de02d800779ae580129beef205d8000ef3acd013e4ebe6580007b9d6a806480002b196c00214] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1610002b196c00216a1001389b4804185c39605a10001eeb5ca80019be1b5ee210002b196c00203c10003dceb948009f2b5e6ea17c1000ef3acd00ba5f5da02c10001eeb5ca8006fab0b4ca1dc10001eeb5ca8001ddd8db8a41003bcdb2c02e038100779ae5800297c3fbaa17810001eeb5ca801aa6b09e168100779ae58002bfc1d19215810003dceb948009e6cffda205810001eeb5ca8002aac090e6010003dceb948002e617fc0003dceb94800daed606fc0003dceb948006d7aa7c0002b196c00202ec0001eeb5ca801ef3ca1cec0003dceb94801ef3ca14] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11dc90003dceb948002b99c8e8205c90003dceb948003be909fc6490003dceb948029d38de217890003dceb948010c5a29ede15890003dceb948002d2bbaba60589002fd7c280349b80c6090002b196c00216f50001eeb5ca800a89f8f1a215f50003dceb94800af49fc18a750003dceb94803bd2c2d58e35000198cba014aacdb6550002b196c0020195005faf8480349d9ea6150002b196c00207e10003dceb94800cb2d9dde617e10003dceb948019d9ecbec616e10003dceb948007b7d7bcf206e100779ae58055bbc4f61de1005faf848029f497ba1ce10003dceb948004a393f2c214] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x114dd0003dceb948008cbb6cd8e5d0003dceb948038dfa9ea8a019d0003dceb948035e5f8d3ca1d0003dceb94801ef2abcd8203e90003dceb94800587eb9217e90001eeb5ca8003ace5eac216e9001de6d9a05d869bee02e90003dceb948006eea2ffde15e90003dceb9480038fcf8ab61ce90001eeb5ca800188d0f6d601e90001eeb5ca8007e5cad6690003dceb948028b1d4ce03a90003dceb948005e5f2b38617a9002fd7c28066bced9e02a90003dceb948004a7a5e09215a9002fd7c28066bced9e290003dceb948002ee17c90001eeb5ca8002d3d0edf616c90001eeb5ca8007a2bafce606c90003dceb94800aa28cea14] def rowsChunk10:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x10894002692e802010201010101010208930003dceb9480089cd8ae0101010001020100089300779ae58041a0a79201000101010001020893005faf84800486b1de010101000102010008920001eeb5ca8012b6ecd992010c0101010c01010109010201090102041389b4800cbdc6e2010c0101010c010101000101010001020401eeb5ca804dffffd601001156010001010100010101000102045faf84805cbfc7f601010100010201000100010101000102043bcdb2c00cd8e9c6010c0101010c010101000100010001020417ebe18069bfca01779ae58005f98eaa088a003bcdb2c006f4c5c6088f00779ae58001e8bcbbd608880003dceb948004e5deabc67d0002b196c00215bd00779ae580318ef3ee3d0003dceb948037bfe7fe17dd0003dceb9480088e9ee08216dd0001eeb5ca8004d3ecf18602dd0003dceb948006dacef0ce14] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 ++ rowsChunk10 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadFullSixCase0.base QuadFullSixCase0.hinges QuadFullSixCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel private def zz919:"s0397"="s0397":=by decide+kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase0.base QuadFullSixCase0.hinges QuadFullSixCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadFullSixCase1.base QuadFullSixCase1.hinges QuadFullSixCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase1.base QuadFullSixCase1.hinges QuadFullSixCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r62,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r58,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadFullSixCase2.base QuadFullSixCase2.hinges QuadFullSixCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel private def zz920:"s0398"="s0398":=by decide+kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase2.base QuadFullSixCase2.hinges QuadFullSixCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadFullSixCase3.base QuadFullSixCase3.hinges QuadFullSixCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase3.base QuadFullSixCase3.hinges QuadFullSixCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r62,RewriteAtoms.r19,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadFullSixCase4.base QuadFullSixCase4.hinges QuadFullSixCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel private def zz921:"s0399"="s0399":=by decide+kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase4.base QuadFullSixCase4.hinges QuadFullSixCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r45,RewriteAtoms.r80,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadFullSixCase5.base QuadFullSixCase5.hinges QuadFullSixCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase5.base QuadFullSixCase5.hinges QuadFullSixCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadFullSixCase6.base QuadFullSixCase6.hinges QuadFullSixCase6.normalizationDenominator theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel private def zz922:"s039a"="s039a":=by decide+kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase6.base QuadFullSixCase6.hinges QuadFullSixCase6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r45,RewriteAtoms.r30,RewriteAtoms.r82,RewriteAtoms.r61,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadFullSixCase7.base QuadFullSixCase7.hinges QuadFullSixCase7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase7.base QuadFullSixCase7.hinges QuadFullSixCase7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadFullSixCase8.base QuadFullSixCase8.hinges QuadFullSixCase8.normalizationDenominator theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel private def zz923:"s039b"="s039b":=by decide+kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase8.base QuadFullSixCase8.hinges QuadFullSixCase8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadFullSixCase9.base QuadFullSixCase9.hinges QuadFullSixCase9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase9.base QuadFullSixCase9.hinges QuadFullSixCase9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r59,RewriteAtoms.r81,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r4,RewriteAtoms.r63,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadFullSixCase10.base QuadFullSixCase10.hinges QuadFullSixCase10.normalizationDenominator theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel private def zz924:"s039c"="s039c":=by decide+kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase10.base QuadFullSixCase10.hinges QuadFullSixCase10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r20,RewriteAtoms.r81,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadFullSixCase11.base QuadFullSixCase11.hinges QuadFullSixCase11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase11.base QuadFullSixCase11.hinges QuadFullSixCase11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadFullSixCase12.base QuadFullSixCase12.hinges QuadFullSixCase12.normalizationDenominator theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel private def zz925:"s039d"="s039d":=by decide+kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase12.base QuadFullSixCase12.hinges QuadFullSixCase12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadFullSixCase13.base QuadFullSixCase13.hinges QuadFullSixCase13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase13.base QuadFullSixCase13.hinges QuadFullSixCase13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadFullSixCase14.base QuadFullSixCase14.hinges QuadFullSixCase14.normalizationDenominator theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel private def zz926:"s039e"="s039e":=by decide+kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase14.base QuadFullSixCase14.hinges QuadFullSixCase14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadFullSixCase15.base QuadFullSixCase15.hinges QuadFullSixCase15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase15.base QuadFullSixCase15.hinges QuadFullSixCase15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r64,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadFullSixCase16.base QuadFullSixCase16.hinges QuadFullSixCase16.normalizationDenominator theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel private def zz927:"s039f"="s039f":=by decide+kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase16.base QuadFullSixCase16.hinges QuadFullSixCase16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadFullSixCase17.base QuadFullSixCase17.hinges QuadFullSixCase17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase17.base QuadFullSixCase17.hinges QuadFullSixCase17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadFullSixCase18.base QuadFullSixCase18.hinges QuadFullSixCase18.normalizationDenominator theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel private def zz928:"s03a0"="s03a0":=by decide+kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase18.base QuadFullSixCase18.hinges QuadFullSixCase18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadFullSixCase19.base QuadFullSixCase19.hinges QuadFullSixCase19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixCase19.base QuadFullSixCase19.hinges QuadFullSixCase19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixCase19.nonnegative x hx def pair20:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair20Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_20_base LocalFullSixPairs.compact_fullSix_pair_20_hinges theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel private def zz929:"s03a1"="s03a1":=by decide+kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalFullSixPairs.fullSix_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_20_base LocalFullSixPairs.compact_fullSix_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalFullSixPairs.fullSix_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair21Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_21_base LocalFullSixPairs.compact_fullSix_pair_21_hinges theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalFullSixPairs.fullSix_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_21_base LocalFullSixPairs.compact_fullSix_pair_21_hinges x private def zz930:"s03a2"="s03a2":=by decide+kernel theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalFullSixPairs.fullSix_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 0 1 false def pair22Rewrites:Rewrites:=[] def pair22Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_22_base LocalFullSixPairs.compact_fullSix_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalFullSixPairs.fullSix_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_22_base LocalFullSixPairs.compact_fullSix_pair_22_hinges x theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalFullSixPairs.fullSix_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53] def pair23Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_23_base LocalFullSixPairs.compact_fullSix_pair_23_hinges private def zz931:"s03a3"="s03a3":=by decide+kernel theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalFullSixPairs.fullSix_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_23_base LocalFullSixPairs.compact_fullSix_pair_23_hinges x theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalFullSixPairs.fullSix_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r69] def pair24Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_24_base LocalFullSixPairs.compact_fullSix_pair_24_hinges theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel private def zz932:"s03a4"="s03a4":=by decide+kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalFullSixPairs.fullSix_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_24_base LocalFullSixPairs.compact_fullSix_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalFullSixPairs.fullSix_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69] def pair25Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_25_base LocalFullSixPairs.compact_fullSix_pair_25_hinges theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalFullSixPairs.fullSix_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_25_base LocalFullSixPairs.compact_fullSix_pair_25_hinges x private def zz933:"s03a5"="s03a5":=by decide+kernel theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalFullSixPairs.fullSix_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r47] def pair26Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_26_base LocalFullSixPairs.compact_fullSix_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalFullSixPairs.fullSix_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_26_base LocalFullSixPairs.compact_fullSix_pair_26_hinges x theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalFullSixPairs.fullSix_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2] def pair27Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_27_base LocalFullSixPairs.compact_fullSix_pair_27_hinges private def zz934:"s03a6"="s03a6":=by decide+kernel theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalFullSixPairs.fullSix_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_27_base LocalFullSixPairs.compact_fullSix_pair_27_hinges x theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalFullSixPairs.fullSix_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_28_base LocalFullSixPairs.compact_fullSix_pair_28_hinges theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel private def zz935:"s03a7"="s03a7":=by decide+kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalFullSixPairs.fullSix_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_28_base LocalFullSixPairs.compact_fullSix_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalFullSixPairs.fullSix_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_29_base LocalFullSixPairs.compact_fullSix_pair_29_hinges theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalFullSixPairs.fullSix_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_29_base LocalFullSixPairs.compact_fullSix_pair_29_hinges x private def zz936:"s03a8"="s03a8":=by decide+kernel theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalFullSixPairs.fullSix_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r51] def pair30Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_30_base LocalFullSixPairs.compact_fullSix_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalFullSixPairs.fullSix_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_30_base LocalFullSixPairs.compact_fullSix_pair_30_hinges x theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalFullSixPairs.fullSix_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r28] def pair31Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_31_base LocalFullSixPairs.compact_fullSix_pair_31_hinges private def zz937:"s03a9"="s03a9":=by decide+kernel theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalFullSixPairs.fullSix_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_31_base LocalFullSixPairs.compact_fullSix_pair_31_hinges x theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalFullSixPairs.fullSix_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_32_base LocalFullSixPairs.compact_fullSix_pair_32_hinges theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel private def zz938:"s03aa"="s03aa":=by decide+kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalFullSixPairs.fullSix_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_32_base LocalFullSixPairs.compact_fullSix_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalFullSixPairs.fullSix_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r70,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_33_base LocalFullSixPairs.compact_fullSix_pair_33_hinges theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalFullSixPairs.fullSix_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_33_base LocalFullSixPairs.compact_fullSix_pair_33_hinges x private def zz939:"s03ab"="s03ab":=by decide+kernel theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalFullSixPairs.fullSix_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair34Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_34_base LocalFullSixPairs.compact_fullSix_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalFullSixPairs.fullSix_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_34_base LocalFullSixPairs.compact_fullSix_pair_34_hinges x theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalFullSixPairs.fullSix_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair35Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_35_base LocalFullSixPairs.compact_fullSix_pair_35_hinges private def zz940:"s03ac"="s03ac":=by decide+kernel theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalFullSixPairs.fullSix_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_35_base LocalFullSixPairs.compact_fullSix_pair_35_hinges x theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalFullSixPairs.fullSix_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r51] def pair36Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_36_base LocalFullSixPairs.compact_fullSix_pair_36_hinges theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel private def zz941:"s03ad"="s03ad":=by decide+kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalFullSixPairs.fullSix_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_36_base LocalFullSixPairs.compact_fullSix_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalFullSixPairs.fullSix_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r70,RewriteAtoms.r27] def pair37Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_37_base LocalFullSixPairs.compact_fullSix_pair_37_hinges theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalFullSixPairs.fullSix_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_37_base LocalFullSixPairs.compact_fullSix_pair_37_hinges x private def zz942:"s03ae"="s03ae":=by decide+kernel theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalFullSixPairs.fullSix_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_38_base LocalFullSixPairs.compact_fullSix_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalFullSixPairs.fullSix_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_38_base LocalFullSixPairs.compact_fullSix_pair_38_hinges x theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalFullSixPairs.fullSix_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=pairSlack (6) ((1 / 0xf4240)) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalFullSixPairs.compact_fullSix_pair_39_base LocalFullSixPairs.compact_fullSix_pair_39_hinges private def zz943:"s03af"="s03af":=by decide+kernel theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalFullSixPairs.fullSix_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixPairs.compact_fullSix_pair_39_base LocalFullSixPairs.compact_fullSix_pair_39_hinges x theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalFullSixPairs.fullSix_pair_39_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx private def zz944:"s03b0"="s03b0":=by decide+kernel theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack (6) ((1 / 0xf4240)) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.FullSixRows private def zz2257:"s08d1"="s08d1":=by decide+kernel end section namespace Green24Proof.ExtendedFullPhaseAggregation open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows FullPhaseSemantics open FullPhaseRows (Phase Potential scale expressionEval_append expressionEval_scale area pairProduct) open FullPhaseAggregation (area_sum pairProduct_sum) noncomputable def rowValue {q:ℕ} (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Label) (j k:ZMod q):ℝ := expressionEval (rowQuad l (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (rowPair S l (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) noncomputable def rowAggregate {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:Label):ℝ:=∑ j, ∑ k,rowValue S h4 h3 g l j k noncomputable def weightedAggregate {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Label)):ℝ := (rows.map fun t => (t.1:ℝ) * rowAggregate S h4 h3 g t.2).sum theorem potential_aggregate {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (l:Potential) (hl:admissible l = true) : rowAggregate S h4 h3 g (.base (.potential l)) = 0 := potentialRow_sum h4 h3 h5 g l hl theorem weightedRows_sum {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Label)) : (∑ j:ZMod q, ∑ k:ZMod q,( expressionEval (weightedQuad rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (weightedPair S rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k))) = weightedAggregate S h4 h3 g rows:=by induction rows with | nil => simp [weightedQuad,weightedPair,expressionEval,weightedAggregate] | cons t ts ih => simp only [weightedQuad,weightedPair,List.flatMap_cons,expressionEval_append, expressionEval_scale] at * have hdistrib (j k:ZMod q) : (t.1:ℝ) * expressionEval (rowQuad t.2 (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval ((ts.flatMap fun t => scale t.1 (rowQuad t.2 (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)))) (quadPoint g j k) + ((t.1:ℝ) * expressionEval (rowPair S t.2 (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) + expressionEval ((ts.flatMap fun t => scale t.1 (rowPair S t.2 (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)))) (pairPoint g j k)) = (t.1:ℝ) * rowValue S h4 h3 g t.2 j k + (expressionEval (weightedQuad ts (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (weightedPair S ts (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k)):=by unfold rowValue weightedQuad weightedPair ring simp_rw [hdistrib] simp only [Finset.sum_add_distrib] at ih simp only [Finset.sum_add_distrib, ← Finset.mul_sum,weightedQuad,weightedPair] rw [ih] rfl theorem local_slacks_sum {q:ℕ} [NeZero q] (S margin:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Label)) : (∑ j:ZMod q, ∑ k:ZMod q,( expressionEval (quadSlack rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack S margin rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k))) = weightedAggregate S h4 h3 g rows + 4 * deficit g - 4 * (margin:ℝ) * mass g ^ 2:=by have hw:=weightedRows_sum S h4 h3 g rows simp only [Finset.sum_add_distrib] at hw simp only [quadSlack,pairSlack,expressionEval_append,expressionEval_scale,Rat.cast_neg,Rat.cast_one] simp_rw [show ∀ a b c d:ℝ,a + -1 * b + (c + d) = (a + c) - b + d by intros; ring] simp only [Finset.sum_add_distrib,Finset.sum_sub_distrib, area_sum,pairProduct_sum] rw [← hw] push_cast unfold deficit ring def labelAdmissible:Label → Bool | .base l => FullPhaseAggregation.labelAdmissible l | _ => true def rowsAdmissible (rows:List (ℚ × Label)):Bool:=rows.all fun t => labelAdmissible t.2 def stripPotentials:List (ℚ × Label) → List (ℚ × Label) | [] => [] | (_, .base (.potential _)) :: ts => stripPotentials ts | t :: ts => t :: stripPotentials ts private def zz945:"s03b1"="s03b1":=by decide+kernel theorem weightedAggregate_cons {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (t:ℚ × Label) (ts:List (ℚ × Label)) : weightedAggregate S h4 h3 g (t :: ts) = (t.1:ℝ) * rowAggregate S h4 h3 g t.2 + weightedAggregate S h4 h3 g ts:=rfl theorem stripPotentials_sound {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (rows:List (ℚ × Label)) (hrows:rowsAdmissible rows = true) : weightedAggregate S h4 h3 g rows = weightedAggregate S h4 h3 g (stripPotentials rows):=by induction rows with | nil => rfl | cons t ts ih => simp only [rowsAdmissible,List.all_cons,Bool.and_eq_true] at hrows rcases t with ⟨w,l⟩ cases l with | base l => cases l with | potential l => have hl:admissible l = true:=hrows.1 simp only [stripPotentials,weightedAggregate_cons,potential_aggregate S h4 h3 h5 g l hl, mul_zero,zero_add] exact ih hrows.2 | balance r s | child r | grandchild r | heightChild r | ordered r | massSquare c v | normalization => simp only [stripPotentials,weightedAggregate_cons] rw [ih hrows.2] | colourChild scope | massProduct a b | massCorrection r a c | massCoercivity c => simp only [stripPotentials,weightedAggregate_cons] rw [ih hrows.2] theorem rowAggregate_base {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (l:FullPhaseRows.Label) : rowAggregate S h4 h3 g (.base l) = FullPhaseAggregation.rowAggregate S h4 h3 g l:=rfl end Green24Proof.ExtendedFullPhaseAggregation private def zz2258:"s08d2"="s08d2":=by decide+kernel end section namespace Green24Proof.FullSixCyclic open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows FullPhaseSemantics open FullPhaseRows (Phase) open FullPhaseAggregation (quadPoint_nonneg pairPoint_nonneg) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ExtendedFullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack FullSixRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullSixRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse FullSixRows.rows p q same x] exact FullSixRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) private def zz946:"s03b2"="s03b2":=by decide+kernel theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack 6 (1 / 0xf4240) FullSixRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullSixRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap 6 (1 / 0xf4240) FullSixRows.rows p q same x] exact FullSixRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible FullSixRows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials FullSixRows.rows theorem remaining_rows_count:remainingRows.length = 14:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (1 / 0x3d090:ℝ) * mass g ^ 2 ≤ weightedAggregate 6 h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack FullSixRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack 6 (1 / 0xf4240) FullSixRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum,stripPotentials_sound 6 h4 h3 h5 g FullSixRows.rows rows_admissible] at hs norm_num at hs change (1 / 0x3d090:ℝ) * mass g ^ 2 ≤ weightedAggregate 6 h4 h3 g (stripPotentials FullSixRows.rows) + 4 * deficit g linarith end Green24Proof.FullSixCyclic private def zz2259:"s08d3"="s08d3":=by decide+kernel end section namespace Green24Proof.ExtendedMassRows open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows ExtendedFullPhaseAggregation open FullPhaseRows (Phase pairProduct) open FullPhaseSemantics (pairPoint pairProduct_eval) open PhaseMassRows private def zz947:"s03b3"="s03b3":=by decide+kernel theorem rowAggregate_massProduct {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (a b:Phase → ℚ) : rowAggregate S h4 h3 g (.massProduct a b) = -massWeighted h4 g (fun p => (a p:ℝ)) * massWeighted h4 g (fun p => (b p:ℝ)):=by let f (i:ZMod q):ℝ:=(a (ZMod.castHom h4 (ZMod 4) i):ℝ) * g i let f' (i:ZMod q):ℝ:=(b (ZMod.castHom h4 (ZMod 4) i):ℝ) * g i have hp (j k:ZMod q):rowValue S h4 h3 g (.massProduct a b) j k = -(f j * f' k + f' j * f k) / 2:=by simp only [rowValue,rowQuad,rowPair,expressionEval_nil,zero_add,pairProduct_eval, pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] dsimp only [f,f'] push_cast ring unfold rowAggregate simp_rw [hp] exact negative_symmetric_product_sum f f' theorem rowAggregate_massProduct_nonpos {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (a b:Phase → ℚ) (ha:0 ≤ massWeighted h4 g (fun p => (a p:ℝ))) (hb:0 ≤ massWeighted h4 g (fun p => (b p:ℝ))) : rowAggregate S h4 h3 g (.massProduct a b) ≤ 0:=by rw [rowAggregate_massProduct] exact mul_nonpos_of_nonpos_of_nonneg (neg_nonpos.mpr ha) hb theorem weighted_phase_pair_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (w:Phase → Phase → ℝ) : (∑ j:ZMod q, ∑ k:ZMod q, w (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) * g j * g k) = ∑ p:Phase, ∑ r:Phase,w p r * phaseTotal h4 g p * phaseTotal h4 g r:=by have hi (j:ZMod q) : (∑ k:ZMod q,w (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) * g j * g k) = ∑ r:Phase,w (ZMod.castHom h4 (ZMod 4) j) r * g j * phaseTotal h4 g r:=by have he (k:ZMod q):w (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) * g j * g k = g j * (w (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) * g k):=by ring simp_rw [he] rw [← Finset.mul_sum,weighted_colourTotal] simp only [Finset.mul_sum,phaseTotal] congr 1 funext r ring simp_rw [hi] rw [Finset.sum_comm] conv_rhs => rw [Finset.sum_comm] apply Finset.sum_congr rfl intro r _ rw [← Finset.sum_mul, ← Finset.sum_mul] congr 1 exact weighted_colourTotal (ZMod.castHom h4 (ZMod 4)) g (fun p => w p r) theorem rowAggregate_massCoercivity {q:ℕ} [NeZero q] (S c:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) : rowAggregate S h4 h3 g (.massCoercivity c) = FullPhaseAggregation.rowAggregate S h4 h3 g (.child 0) + 4 * (c:ℝ) * (phaseTotal h4 g 0 - phaseTotal h4 g 2) ^ 2:=by let w (p r:Phase):ℝ:=if FullPhaseRows.parity p = 0 ∧ FullPhaseRows.parity r = 0 then 4 * (c:ℝ) * (-1:ℝ) ^ (p.val / 2 + r.val / 2) else 0 have hp (j k:ZMod q):rowValue S h4 h3 g (.massCoercivity c) j k = FullPhaseAggregation.rowValue S h4 h3 g (.child 0) j k + w (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) * g j * g k:=by simp only [rowValue,rowQuad,rowPair,FullPhaseAggregation.rowValue, FullPhaseRows.rowQuad,FullPhaseRows.rowPair,w] split_ifs <;> simp only [pairProduct_eval,expressionEval_nil, pairPoint,Matrix.cons_val_zero,Matrix.cons_val_one] <;> push_cast <;> ring unfold rowAggregate simp_rw [hp] simp only [Finset.sum_add_distrib] rw [weighted_phase_pair_sum] change FullPhaseAggregation.rowAggregate S h4 h3 g (.child 0) + _ = _ congr 1 simp only [sum_phase] norm_num [w,FullPhaseRows.parity,ZMod.val_ofNat,ZMod.val_one_eq_one_mod] ring private def zz948:"s03b4"="s03b4":=by decide+kernel theorem rowAggregate_massCorrection_odd {q:ℕ} [NeZero q] (S:ℚ) (c:Correction) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) : rowAggregate S h4 h3 g (.massCorrection 1 1 c) = FullPhaseAggregation.rowAggregate S h4 h3 g (.child 1) - (c.retained:ℝ) * FullPhaseAggregation.rowAggregate S h4 h3 g (.grandchild 1) + 4 * ((c.even:ℝ) * phaseTotal h4 g 1 ^ 2 + (c.mixed:ℝ) * phaseTotal h4 g 1 * phaseTotal h4 g 3 + (c.odd:ℝ) * phaseTotal h4 g 3 ^ 2):=by let w (p r:Phase):ℝ:=if FullPhaseRows.parity p = 1 ∧ FullPhaseRows.parity r = 1 then 4 * (correctionCoefficient c 1 p r:ℝ) else 0 have hv (p r:Phase) (same:Bool) (x y:Point) : expressionEval (rowQuad (.massCorrection 1 1 c) p r same) x + expressionEval (rowPair S (.massCorrection 1 1 c) p r same) y = expressionEval (FullPhaseRows.rowQuad (.child 1) p r same) x + expressionEval (FullPhaseRows.rowPair S (.child 1) p r same) y - (c.retained:ℝ) * (expressionEval (FullPhaseRows.rowQuad (.grandchild 1) p r same) x + expressionEval (FullPhaseRows.rowPair S (.grandchild 1) p r same) y) + w p r * y 0 * y 1:=by have hc (p:Phase):p = 0 ∨ p = 1 ∨ p = 2 ∨ p = 3:=by revert p decide +kernel rcases hc p with rfl | rfl | rfl | rfl all_goals rcases hc r with rfl | rfl | rfl | rfl all_goals simp +decide [rowQuad,rowPair,FullPhaseRows.rowQuad,FullPhaseRows.rowPair, FullPhaseRows.parity,expressionEval_nil,FullPhaseRows.expressionEval_scale, pairProduct_eval,w,correctionCoefficient] <;> ring have hp (j k:ZMod q):rowValue S h4 h3 g (.massCorrection 1 1 c) j k = FullPhaseAggregation.rowValue S h4 h3 g (.child 1) j k - (c.retained:ℝ) * FullPhaseAggregation.rowValue S h4 h3 g (.grandchild 1) j k + w (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) * g j * g k := hv _ _ _ _ _ unfold rowAggregate simp_rw [hp] simp only [Finset.sum_add_distrib,Finset.sum_sub_distrib, ← Finset.mul_sum] rw [weighted_phase_pair_sum] change FullPhaseAggregation.rowAggregate S h4 h3 g (.child 1) - (c.retained:ℝ) * FullPhaseAggregation.rowAggregate S h4 h3 g (.grandchild 1) + _ = _ congr 1 simp only [sum_phase] simp +decide [w,correctionCoefficient,FullPhaseRows.parity] ring end Green24Proof.ExtendedMassRows private def zz2260:"s08d4"="s08d4":=by decide+kernel end section namespace Green24Proof theorem negative_parent_mass_constraint {a b c d du dv dg:ℝ} (hdu:0 ≤ du) (hdv:0 ≤ dv) (hdg:dg < 0) (hexpansion:du + dv + 4 * (a + b) * (c + d) - 12 * b * (c + d) - 12 * c * d ≤ dg) : (a - 2 * b) * (c + d) < 3 * c * d:=by nlinarith theorem negative_parent_ratio_cap {a b c d L:ℝ} (hV:0 < c + d) (hL:3 / 4 < L) (hconstraint:(a - 2 * b) * (c + d) < 3 * c * d) (hlower:L * (c + d) ≤ a + b) : a < ((8 * L + 3) / (4 * L - 3)) * b:=by have hlinear:4 * a - 8 * b < 3 * (c + d):=by apply (mul_lt_mul_iff_right₀ hV).mp nlinarith [sq_nonneg (c - d)] have hscaled:=mul_lt_mul_of_pos_left hlinear (by linarith:0 < L) have hden:0 < 4 * L - 3:=by linarith apply (mul_lt_mul_iff_right₀ hden).mp have hcancel:((8 * L + 3) / (4 * L - 3)) * (4 * L - 3) = 8 * L + 3 := div_mul_cancel₀ _ (ne_of_gt hden) have hb:=congrArg (fun x:ℝ => x * b) hcancel nlinarith theorem weighted_mass_mean {c d t:ℝ} (hV:0 < c + d) (ht:0 ≤ t) : c * d / (c + d) ≤ (t ^ 2 * c + d) / (1 + t) ^ 2:=by apply (div_le_div_iff₀ hV (by positivity:0 < (1 + t) ^ 2)).mpr nlinarith [sq_nonneg (t * c - d)] private def zz949:"s03b5"="s03b5":=by decide+kernel theorem conditional_mass_form_pos {a b c d t:ℝ} (hV:0 < c + d) (ht:0 ≤ t) (hconstraint:(a - 2 * b) * (c + d) < 3 * c * d) : 0 < 2 * b - a + 3 * (t ^ 2 * c + d) / (1 + t) ^ 2:=by have hratio:a - 2 * b < 3 * (c * d / (c + d)):=by apply (mul_lt_mul_iff_right₀ hV).mp have hcancel:c * d / (c + d) * (c + d) = c * d:=div_mul_cancel₀ _ (ne_of_gt hV) nlinarith have hmean:=weighted_mass_mean hV ht rw [mul_div_assoc] linarith theorem conditional_mass_product_nonpos {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : -(x * y) ≤ 0:=neg_nonpos.mpr (mul_nonneg hx hy) theorem ratio_twelve_child_cap {a b c d:ℝ} (hV:0 < c + d) (hconstraint:(a - 2 * b) * (c + d) < 3 * c * d) (hlower:12 * (c + d) ≤ a + b):a < (11 / 5) * b:=by have h:=negative_parent_ratio_cap hV (by norm_num:(3 / 4:ℝ) < 12) hconstraint hlower norm_num at h exact h theorem coercivity_three_thousandths {a b du:ℝ} (hc:(1 / 0x12c) * (a - b) ^ 2 ≤ du):(3 / 0x3e8) * (a - b) ^ 2 ≤ du:=by nlinarith [sq_nonneg (a - b)] end Green24Proof end section namespace Green24Proof private def zz950:"s03b6"="s03b6":=by decide+kernel theorem mixedFunctional_le_twelve_parity_product {m:ℕ} [NeZero m] (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : mixedFunctional v u 1 ≤ 12 * classMass (ZMod.castHom h2 (ZMod 2)) v 0 * classMass (ZMod.castHom h2 (ZMod 2)) v 1:=by have hcorr:=odd_shift_correlation_le_parity h2 v hv unfold mixedFunctional calc _ ≤ ∑ j, ∑ k,3 * (v (3 * k - 2 * j + 1) * v k):=by apply Finset.sum_le_sum intro j _ apply Finset.sum_le_sum intro k _ have h:=kernel_le_product (hv (3 * k - 2 * j + 1)) (mul_nonneg (by norm_num:(0:ℝ) ≤ 3) (hv k)) (mul_nonneg (by norm_num:(0:ℝ) ≤ 2) (hu j)) rw [kernel_swap23] at h nlinarith _ = 3 * (∑ k, ∑ j,v (3 * k - 2 * j + 1) * v k):=by simp only [← Finset.mul_sum] rw [Finset.sum_comm] _ ≤ _:=by nlinarith theorem deficit_interleave_parity_expansion {m:ℕ} [NeZero m] (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : deficit u + deficit v + 4 * mass u * mass v - 12 * classMass (ZMod.castHom h2 (ZMod 2)) u 1 * mass v - 12 * classMass (ZMod.castHom h2 (ZMod 2)) v 0 * classMass (ZMod.castHom h2 (ZMod 2)) v 1 ≤ deficit (interleave u v):=by have hm₁:=mixedFunctional_le_overlap u v hu hv (fun j => cyclic_overlap_le_six_classMass h2 u hu j 1) have hm₂:=mixedFunctional_le_twelve_parity_product h2 u v hu hv unfold deficit rw [mass_interleave,profileFunctional_interleave] nlinarith theorem negative_parent_profile_constraint {m:ℕ} [NeZero m] (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hdu:0 ≤ deficit u) (hdv:0 ≤ deficit v) (hdg:deficit (interleave u v) < 0) : (classMass (ZMod.castHom h2 (ZMod 2)) u 0 - 2 * classMass (ZMod.castHom h2 (ZMod 2)) u 1) * mass v < 3 * classMass (ZMod.castHom h2 (ZMod 2)) v 0 * classMass (ZMod.castHom h2 (ZMod 2)) v 1:=by have h:=deficit_interleave_parity_expansion h2 u v hu hv have hmu:=classMass_sum (ZMod.castHom h2 (ZMod 2)) u rw [← hmu] at h nlinarith theorem negative_parent_profile_child_cap {m:ℕ} [NeZero m] (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hdu:0 ≤ deficit u) (hdv:0 ≤ deficit v) (hdg:deficit (interleave u v) < 0) (hV:0 < mass v) (hlower:12 * mass v ≤ mass u) : classMass (ZMod.castHom h2 (ZMod 2)) u 0 < (11 / 5) * classMass (ZMod.castHom h2 (ZMod 2)) u 1:=by have h:=negative_parent_profile_constraint h2 u v hu hv hdu hdv hdg have hmu:=classMass_sum (ZMod.castHom h2 (ZMod 2)) u have hmv:=classMass_sum (ZMod.castHom h2 (ZMod 2)) v apply ratio_twelve_child_cap (c:=classMass (ZMod.castHom h2 (ZMod 2)) v 0) (d:=classMass (ZMod.castHom h2 (ZMod 2)) v 1) · rwa [hmv] · rwa [hmv] · rwa [hmu,hmv] end Green24Proof end section namespace Green24Proof.ConditionalMassRows open FullPhaseRows (Phase) open PhaseMassRows def domainForm (L H:ℚ) (i:Fin 14) (p:Phase):ℚ := let forms:Fin 14 → Fin 4 → ℚ:=![ ![1,0,0,0], ![0,1,0,0], ![0,0,1,0], ![0,0,0,1], ![1,0, -1,0], ![0,1,0, -1], ![-1,0,(8 * L + 3) / (4 * L - 3),0], ![1, -L,1, -L], ![-1,H, -1,H], ![-1,0,2,3], ![-1,3 / 25,2,48 / 25], ![-1,1 / 3,2,4 / 3], ![-1,27 / 49,2,48 / 49], ![-1,3 / 4,2,3 / 4]] forms i ⟨p.val,p.val_lt⟩ private def zz951:"s03b7"="s03b7":=by decide+kernel theorem domainForm_nonneg {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (L H:ℚ) (hL:(3 / 4:ℝ) < (L:ℝ)) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hodd:phaseTotal h4 g 3 ≤ phaseTotal h4 g 1) (hV:0 < phaseTotal h4 g 1 + phaseTotal h4 g 3) (hlow:(L:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ phaseTotal h4 g 0 + phaseTotal h4 g 2) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ (H:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hconstraint:(phaseTotal h4 g 0 - 2 * phaseTotal h4 g 2) * (phaseTotal h4 g 1 + phaseTotal h4 g 3) < 3 * phaseTotal h4 g 1 * phaseTotal h4 g 3) (i:Fin 14) : 0 ≤ massWeighted h4 g (fun p => (domainForm L H i p:ℝ)):=by have ha:=phaseTotal_nonneg h4 g hg 0 have hc:=phaseTotal_nonneg h4 g hg 1 have hb:=phaseTotal_nonneg h4 g hg 2 have hd:=phaseTotal_nonneg h4 g hg 3 have hcap:=negative_parent_ratio_cap hV hL hconstraint hlow have ht0:=conditional_mass_form_pos hV (by norm_num:(0:ℝ) ≤ 0) hconstraint have ht1:=conditional_mass_form_pos hV (by norm_num:(0:ℝ) ≤ 1 / 4) hconstraint have ht2:=conditional_mass_form_pos hV (by norm_num:(0:ℝ) ≤ 1 / 2) hconstraint have ht3:=conditional_mass_form_pos hV (by norm_num:(0:ℝ) ≤ 3 / 4) hconstraint have ht4:=conditional_mass_form_pos hV (by norm_num:(0:ℝ) ≤ 1) hconstraint norm_num at ht0 ht1 ht2 ht3 ht4 rw [massWeighted_phaseTotal,sum_phase] fin_cases i <;> norm_num [domainForm,ZMod.val_ofNat,ZMod.val_one_eq_one_mod, Rat.cast_div,Rat.cast_mul,Rat.cast_add,Rat.cast_sub] <;> linarith theorem domainProduct_nonpos {q:ℕ} [NeZero q] (S L H:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hs:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm L H i p:ℝ))) (i j:Fin 14) : ExtendedFullPhaseAggregation.rowAggregate S h4 h3 g (.massProduct (domainForm L H i) (domainForm L H j)) ≤ 0 := ExtendedMassRows.rowAggregate_massProduct_nonpos S h4 h3 g _ _ (hs i) (hs j) end Green24Proof.ConditionalMassRows private def zz2261:"s08d5"="s08d5":=by decide+kernel end section namespace Green24Proof.FullSixMass open ExtendedFullPhaseRows ExtendedFullPhaseAggregation open FullPhaseRows (Phase) open PhaseMassRows PhaseColourRows ConditionalMassRows theorem remainingRows_eq:FullSixCyclic.remainingRows = [ ((0x265bcae3 / 0x3b9aca00), .base (.child 0)), ((0xe878eeb / 0xee6b280), .base (.heightChild 1)), ((0x6e9163 / 0x7735940), .base (.grandchild 0)), ((0x5f2395 / 0xee6b280), .colourChild .whole), ((0xd2fe5 / 0x2faf080), .massProduct (fun p => (![1,0,0,0]:Fin 4 → ℚ) p) (fun p => (![-1,6, -1,6]:Fin 4 → ℚ) p)), ((0xcb1a63 / 0x7735940), .massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)), ((0x5c7f1fb / 0xbebc200), .massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,0,(43 / 17),0]:Fin 4 → ℚ) p)), ((0x4dfffeb / 0x1dcd6500), .massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,6, -1,6]:Fin 4 → ℚ) p)), ((0xc7b1b1 / 0x2625a00), .massProduct (fun p => (![1, -5,1, -5]:Fin 4 → ℚ) p) (fun p => (![-1,6, -1,6]:Fin 4 → ℚ) p)), ((0x936d9649 / 0x1dcd6500), .base (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((0x40cc6f / 0xbebc200), .base (.massSquare true (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p))), ((0x41409c9 / 0xee6b280), .base (.massSquare true (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((0x839617 / 0x3b9aca00), .base (.massSquare true (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p))), ((1 / 0x98968), .base (.normalization))]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff CombinedPolicyPackedRowsEquality.extendedEq CombinedPolicyPackedRowsEquality.extendedEq_iff _ _).mp decide +kernel theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (_heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (_hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (6:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hforms:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm 5 6 i p:ℝ))) (hchild:FullPhaseAggregation.rowAggregate 6 h4 h3 g (.child 0) ≤ 0) (hheight:FullPhaseAggregation.rowAggregate 6 h4 h3 g (.heightChild 1) ≤ 0) (hgrand:FullPhaseAggregation.rowAggregate 6 h4 h3 g (.grandchild 0) ≤ 0) (hcolour:rowAggregate 6 h4 h3 g (.colourChild .whole) ≤ 0) : weightedAggregate 6 h4 h3 g FullSixCyclic.remainingRows ≤ ((1 / 0x98968):ℝ) * mass g ^ 2:=by have hp4:rowAggregate 6 h4 h3 g (.massProduct (fun p => (![1,0,0,0]:Fin 4 → ℚ) p) (fun p => (![-1,6, -1,6]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 6 5 6 h4 h3 g hforms 0 8 have hp5:rowAggregate 6 h4 h3 g (.massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 6 5 6 h4 h3 g hforms 4 5 have hp6:rowAggregate 6 h4 h3 g (.massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,0,(43 / 17),0]:Fin 4 → ℚ) p)) ≤ 0:=by have h:=domainProduct_nonpos 6 5 6 h4 h3 g hforms 4 6 have he:domainForm 5 6 6 = (fun p:Phase => (![-1,0,(43 / 17),0]:Fin 4 → ℚ) p):=by funext p norm_num [domainForm] rfl rw [he] at h exact h have hp7:rowAggregate 6 h4 h3 g (.massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,6, -1,6]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 6 5 6 h4 h3 g hforms 4 8 have hp8:rowAggregate 6 h4 h3 g (.massProduct (fun p => (![1, -5,1, -5]:Fin 4 → ℚ) p) (fun p => (![-1,6, -1,6]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 6 5 6 h4 h3 g hforms 7 8 have hs9:=rowAggregate_massSquare_nonpos 6 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) have hs10:=rowAggregate_colouredMassSquare_nonpos 6 h4 h3 g (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) have hs11:=rowAggregate_colouredMassSquare_nonpos 6 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) have hs12:=rowAggregate_colouredMassSquare_nonpos 6 h4 h3 g (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p) rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_base,rowAggregate_normalization] norm_num linarith private def zz952:"s03b8"="s03b8":=by decide+kernel theorem deficit_nonneg_of_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (6:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hforms:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm 5 6 i p:ℝ))) (hchild:FullPhaseAggregation.rowAggregate 6 h4 h3 g (.child 0) ≤ 0) (hheight:FullPhaseAggregation.rowAggregate 6 h4 h3 g (.heightChild 1) ≤ 0) (hgrand:FullPhaseAggregation.rowAggregate 6 h4 h3 g (.grandchild 0) ≤ 0) (hcolour:rowAggregate 6 h4 h3 g (.colourChild .whole) ≤ 0) : 0 ≤ deficit g:=by have hc:=FullSixCyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g heven hhigh hforms hchild hheight hgrand hcolour nlinarith [sq_nonneg (mass g)] end Green24Proof.FullSixMass private def zz2262:"s08d6"="s08d6":=by decide+kernel end section namespace Green24Proof.ProfileChildren open FullPhaseRows (Phase) open PhaseMassRows HeightChildRows GrandchildRows noncomputable def child {m:ℕ} [NeZero m] (g:ZMod (2 * m) → ℝ) (r:ZMod 2):ZMod m → ℝ:=fun i => g (parityEquiv m (r,i)) theorem child_nonneg {m:ℕ} [NeZero m] (g:ZMod (2 * m) → ℝ) (hg:∀ i,0 ≤ g i) (r:ZMod 2):∀ i,0 ≤ child g r i:=fun i => hg (parityEquiv m (r,i)) theorem interleave_children {m:ℕ} [NeZero m] (g:ZMod (2 * m) → ℝ) : interleave (child g 0) (child g 1) = g:=by funext x obtain ⟨⟨r,i⟩,rfl⟩:=(parityEquiv m).surjective x rcases zmod_two_eq_zero_or_one r with rfl | rfl · exact interleave_even _ _ i · exact interleave_odd _ _ i theorem child_mass {m:ℕ} [NeZero m] (g:ZMod (2 * m) → ℝ) (r:ZMod 2) : mass (child g r) = classMass (ZMod.castHom (dvd_mul_right 2 m) (ZMod 2)) g r:=by rcases zmod_two_eq_zero_or_one r with rfl | rfl · rw [← interleave_children g,classMass_interleave_even] rw [interleave_children] · rw [← interleave_children g,classMass_interleave_odd] rw [interleave_children] private def zz953:"s03b9"="s03b9":=by decide+kernel theorem phaseTotal_interleave_zero {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) : phaseTotal h4 (interleave u v) 0 = classMass (ZMod.castHom h2 (ZMod 2)) u 0:=by unfold phaseTotal colourTotal rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type,sum_zmod_two] simp only [cast_four_even h4 h2,cast_four_odd h4 h2,interleave_even,interleave_odd] have he (i:ZMod m) : (if doubleResidue 2 (ZMod.castHom h2 (ZMod 2) i) = (0:ZMod 4) then u i else 0) = if ZMod.castHom h2 (ZMod 2) i = 0 then u i else 0:=by rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero]; simp · rw [h,doubleResidue_two_one]; simp +decide have ho (i:ZMod m) : (if doubleResidue 2 (ZMod.castHom h2 (ZMod 2) i) + 1 = (0:ZMod 4) then v i else 0) = 0:=by rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero]; simp +decide · rw [h,doubleResidue_two_one]; simp +decide simp only [he,ho,Finset.sum_const_zero,add_zero] rfl theorem phaseTotal_interleave_two {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) : phaseTotal h4 (interleave u v) 2 = classMass (ZMod.castHom h2 (ZMod 2)) u 1:=by unfold phaseTotal colourTotal rw [← (parityEquiv m).sum_comp,Fintype.sum_prod_type,sum_zmod_two] simp only [cast_four_even h4 h2,cast_four_odd h4 h2,interleave_even,interleave_odd] have he (i:ZMod m) : (if doubleResidue 2 (ZMod.castHom h2 (ZMod 2) i) = (2:ZMod 4) then u i else 0) = if ZMod.castHom h2 (ZMod 2) i = 1 then u i else 0:=by rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero]; simp +decide · rw [h,doubleResidue_two_one]; simp have ho (i:ZMod m) : (if doubleResidue 2 (ZMod.castHom h2 (ZMod 2) i) + 1 = (2:ZMod 4) then v i else 0) = 0:=by rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero]; simp +decide · rw [h,doubleResidue_two_one]; simp +decide simp only [he,ho,Finset.sum_const_zero,add_zero] rfl end Green24Proof.ProfileChildren private def zz2263:"s08d7"="s08d7":=by decide+kernel end section namespace Green24Proof.ConditionalProfileRows open FullPhaseRows (Phase) open PhaseMassRows ProfileChildren HeightChildRows ConditionalMassRows theorem odd_mass_pos_of_negative_parent {m:ℕ} [NeZero m] (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hdu:0 ≤ deficit u) (hdv:0 ≤ deficit v) (hneg:deficit (interleave u v) < 0):0 < mass v:=by have he:=deficit_interleave_parity_expansion h2 u v hu hv have hm:=classMass_sum (ZMod.castHom h2 (ZMod 2)) v have hc:0 ≤ classMass (ZMod.castHom h2 (ZMod 2)) v 0 := Finset.sum_nonneg fun i _ => by split_ifs <;> first | exact hv i | rfl have hd:0 ≤ classMass (ZMod.castHom h2 (ZMod 2)) v 1 := Finset.sum_nonneg fun i _ => by split_ifs <;> first | exact hv i | rfl by_contra! h have hV:mass v = 0:=le_antisymm h (Finset.sum_nonneg fun i _ => hv i) have hc0:classMass (ZMod.castHom h2 (ZMod 2)) v 0 = 0:=by linarith rw [hV,hc0] at he nlinarith theorem phase_constraint {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hdu:0 ≤ deficit u) (hdv:0 ≤ deficit v) (hneg:deficit (interleave u v) < 0) : (phaseTotal h4 (interleave u v) 0 - 2 * phaseTotal h4 (interleave u v) 2) * (phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3) < 3 * phaseTotal h4 (interleave u v) 1 * phaseTotal h4 (interleave u v) 3:=by rw [phaseTotal_interleave_zero h4 h2,phaseTotal_interleave_two h4 h2, phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2,classMass_sum] exact negative_parent_profile_constraint h2 u v hu hv hdu hdv hneg private def zz954:"s03ba"="s03ba":=by decide+kernel theorem domainForms_nonneg {m:ℕ} [NeZero m] (L H:ℚ) (h4:4 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (hdu:0 ≤ deficit u) (hdv:0 ≤ deficit v) (hneg:deficit (interleave u v) < 0) (hL:(3 / 4:ℝ) < (L:ℝ)) (heven:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(L:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (H:ℝ) * mass v) (i:Fin 14) : 0 ≤ massWeighted h4 (interleave u v) (fun p => (domainForm L H i p:ℝ)):=by have hU:phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 = mass u:=by rw [phaseTotal_interleave_zero h4 h2,phaseTotal_interleave_two h4 h2,classMass_sum] have hV:phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3 = mass v:=by rw [phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2,classMass_sum] apply domainForm_nonneg h4 (interleave u v) (interleave_nonneg u v hu hv) L H hL heven hodd · rw [hV]; exact odd_mass_pos_of_negative_parent h2 u v hu hv hdu hdv hneg · rwa [hU,hV] · rwa [hU,hV] · exact phase_constraint h4 h2 u v hu hv hdu hdv hneg end Green24Proof.ConditionalProfileRows private def zz2264:"s08d8"="s08d8":=by decide+kernel end section namespace Green24Proof.ResidueProfiles open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics FullPhaseAggregation noncomputable def embed (d m:ℕ):ZMod m →+ ZMod (d * m) := ZMod.lift m ⟨ { toFun:=fun z:ℤ => (d:ZMod (d * m)) * (z:ZMod (d * m)) map_zero':=by simp map_add':=by intros; simp [mul_add] },by change (d:ZMod (d * m)) * ((m:ℤ):ZMod (d * m)) = 0 simpa only [Int.cast_natCast,Nat.cast_mul] using (ZMod.natCast_self (d * m))⟩ theorem embed_natCast (d m n:ℕ):embed d m (n:ZMod m) = d * (n:ZMod (d * m)):=by unfold embed rw [← Int.cast_natCast n,ZMod.lift_coe] simp only [Int.cast_natCast,AddMonoidHom.coe_mk,ZeroHom.coe_mk] theorem embed_val {d m:ℕ} [NeZero m] (x:ZMod m) : embed d m x = d * (x.val:ZMod (d * m)):=by conv_lhs => rw [← ZMod.natCast_zmod_val x] exact embed_natCast d m x.val theorem embed_mul_nat (d m n:ℕ) (x:ZMod m):embed d m (n * x) = n * embed d m x:=by simpa only [nsmul_eq_mul] using (embed d m).map_nsmul n x noncomputable def residueEquiv (d m:ℕ) [NeZero d] [NeZero m] : (ZMod d × ZMod m) ≃ ZMod (d * m) where toFun p:=((d * p.2.val + p.1.val:ℕ):ZMod (d * m)) invFun x:=(((x.val % d:ℕ):ZMod d),((x.val / d:ℕ):ZMod m)) left_inv:=by rintro ⟨r,i⟩ have hd:0 < d:=NeZero.pos d have hr:=r.val_lt have hi:=i.val_lt have hlt:d * i.val + r.val < d * m:=calc _ < d * i.val + d:=Nat.add_lt_add_left hr _ _ = d * (i.val + 1):=by ring _ ≤ d * m:=Nat.mul_le_mul_left d (Nat.succ_le_of_lt hi) simp only [ZMod.val_natCast_of_lt hlt] apply Prod.ext · have hmod:(d * i.val + r.val) % d = r.val:=by rw [Nat.mul_add_mod_self_left,Nat.mod_eq_of_lt hr] simp only [hmod,ZMod.natCast_zmod_val] · have hdiv:(d * i.val + r.val) / d = i.val:=by rw [Nat.add_comm,Nat.add_mul_div_left _ _ hd,Nat.div_eq_of_lt hr,Nat.zero_add] simp only [hdiv,ZMod.natCast_zmod_val] right_inv:=by intro x have hd:0 < d:=NeZero.pos d have hx:=x.val_lt have hmod:x.val % d < d:=Nat.mod_lt _ hd have hdiv:x.val / d < m:=(Nat.div_lt_iff_lt_mul hd).mpr (by simpa [Nat.mul_comm] using hx) simp only [ZMod.val_natCast_of_lt hmod,ZMod.val_natCast_of_lt hdiv] rw [show d * (x.val / d) + x.val % d = x.val from Nat.div_add_mod _ _] exact ZMod.natCast_zmod_val x private def zz955:"s03bb"="s03bb":=by decide+kernel theorem residueEquiv_apply {d m:ℕ} [NeZero d] [NeZero m] (r:ZMod d) (i:ZMod m) : residueEquiv d m (r,i) = embed d m i + (r.val:ZMod (d * m)):=by change ((d * i.val + r.val:ℕ):ZMod (d * m)) = _ rw [Nat.cast_add,Nat.cast_mul,embed_val] theorem residueCast_apply {d m:ℕ} [NeZero d] [NeZero m] (r:ZMod d) (i:ZMod m) : ZMod.castHom (dvd_mul_right d m) (ZMod d) (residueEquiv d m (r,i)) = r:=by rw [residueEquiv_apply,embed_val] simp only [map_add,map_mul,map_natCast,ZMod.natCast_self, zero_mul,zero_add,ZMod.natCast_zmod_val] theorem residueEquiv_affine_same {d m:ℕ} [NeZero d] [NeZero m] (r:ZMod d) (j k:ZMod m) : 3 * residueEquiv d m (r,k) - 2 * residueEquiv d m (r,j) = residueEquiv d m (r,3 * k - 2 * j):=by rw [residueEquiv_apply,residueEquiv_apply,residueEquiv_apply] have h3:embed d m (3 * k) = 3 * embed d m k:=by simpa only [Nat.cast_ofNat] using embed_mul_nat d m 3 k have h2:embed d m (2 * j) = 2 * embed d m j:=by simpa only [Nat.cast_ofNat] using embed_mul_nat d m 2 j rw [map_sub,h3,h2] ring noncomputable def profile {d m:ℕ} [NeZero d] [NeZero m] (g:ZMod (d * m) → ℝ) (r:ZMod d):ZMod m → ℝ:=fun i => g (residueEquiv d m (r,i)) theorem profile_nonneg {d m:ℕ} [NeZero d] [NeZero m] (g:ZMod (d * m) → ℝ) (hg:∀ i,0 ≤ g i) (r:ZMod d) : ∀ i,0 ≤ profile g r i:=fun _ => hg _ noncomputable def selectedValue {d m:ℕ} [NeZero d] [NeZero m] (g:ZMod (d * m) → ℝ) (w:ZMod d → ℝ) (j k:ZMod (d * m)):ℝ := if ZMod.castHom (dvd_mul_right d m) (ZMod d) j = ZMod.castHom (dvd_mul_right d m) (ZMod d) k then w (ZMod.castHom (dvd_mul_right d m) (ZMod d) j) * (expressionEval area (quadPoint g j k) + expressionEval (pairProduct (-8)) (pairPoint g j k)) else 0 private def zz956:"s03bc"="s03bc":=by decide+kernel theorem selectedValue_residue {d m:ℕ} [NeZero d] [NeZero m] (g:ZMod (d * m) → ℝ) (w:ZMod d → ℝ) (a b:ZMod d) (j k:ZMod m) : selectedValue g w (residueEquiv d m (a,j)) (residueEquiv d m (b,k)) = if a = b then w a * (expressionEval area (quadPoint (profile g a) j k) + expressionEval (pairProduct (-8)) (pairPoint (profile g a) j k)) else 0:=by by_cases h:a = b · subst b simp only [selectedValue,residueCast_apply,if_true] rw [area_eval,area_eval,pairProduct_eval,pairProduct_eval] simp [quadPoint,pairPoint,Matrix.cons_val_two,Matrix.cons_val_three, residueEquiv_affine_same,profile] · simp only [selectedValue,residueCast_apply,if_neg h] theorem selectedValue_sum {d m:ℕ} [NeZero d] [NeZero m] (g:ZMod (d * m) → ℝ) (w:ZMod d → ℝ) : (∑ j, ∑ k,selectedValue g w j k) = ∑ r,w r * (-4 * deficit (profile g r)):=by have hk (a:ZMod d) (j:ZMod m) : (∑ k,selectedValue g w (residueEquiv d m (a,j)) k) = ∑ b:ZMod d, ∑ k:ZMod m, selectedValue g w (residueEquiv d m (a,j)) (residueEquiv d m (b,k)):=by rw [← (residueEquiv d m).sum_comp,Fintype.sum_prod_type] rw [← (residueEquiv d m).sum_comp,Fintype.sum_prod_type] simp_rw [hk,selectedValue_residue] simp only [Finset.sum_ite_irrel,Finset.sum_const_zero,Finset.sum_ite_eq, Finset.mem_univ,if_true] apply Finset.sum_congr rfl intro r _ simp only [mul_add,Finset.sum_add_distrib, ← Finset.mul_sum] rw [area_sum,pairProduct_sum] unfold deficit norm_num ring theorem selectedValue_sum_nonpos {d m:ℕ} [NeZero d] [NeZero m] (g:ZMod (d * m) → ℝ) (w:ZMod d → ℝ) (hw:∀ r,0 ≤ w r) (hd:∀ r,0 ≤ deficit (profile g r)):(∑ j, ∑ k,selectedValue g w j k) ≤ 0:=by rw [selectedValue_sum] exact Finset.sum_nonpos fun r _ => mul_nonpos_of_nonneg_of_nonpos (hw r) (by linarith [hd r]) end Green24Proof.ResidueProfiles private def zz2265:"s08d9"="s08d9":=by decide+kernel end section namespace Green24Proof.ColourChildRows open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows ExtendedFullPhaseAggregation open FullPhaseRows (Phase area pairProduct) open FullPhaseSemantics (quadPoint pairPoint sameColour) theorem eval_ite (P:Prop) [Decidable P] (e:Expression) (x:Point) : expressionEval (if P then e else []) x = if P then expressionEval e x else 0:=by split_ifs <;> rfl private def zz957:"s03bd"="s03bd":=by decide+kernel theorem selected_sum (P Q:Prop) [Decidable P] [Decidable Q] (a b:ℝ) : (if P ∧ Q then a else 0) + (if P ∧ Q then b else 0) = if P then (if Q then 1 else 0) * (a + b) else 0:=by by_cases hp:P <;> by_cases hq:Q <;> simp [hp,hq] theorem whole_value {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 3 * m) (g:ZMod (3 * m) → ℝ) (j k:ZMod (3 * m)) : rowValue S h4 (dvd_mul_right 3 m) g (.colourChild .whole) j k = ResidueProfiles.selectedValue g (fun _ => 1) j k:=by simp only [rowValue,rowQuad,rowPair,scopeActive,Bool.true_and,sameColour, decide_eq_true_eq,ResidueProfiles.selectedValue] split_ifs <;> simp only [expressionEval_nil,one_mul,zero_add] theorem whole_nonpos_of_induction {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (ih:∀ (n:ℕ) [NeZero n],n < q → n ∣ q → ∀ u:ZMod n → ℝ,(∀ i,0 ≤ u i) → 0 ≤ deficit u) : rowAggregate S h4 h3 g (.colourChild .whole) ≤ 0:=by rcases h3 with ⟨m,rfl⟩ have hm:0 < m:=by have hp:=NeZero.pos (3 * m); omega let:NeZero m:=⟨by omega⟩ unfold rowAggregate simp_rw [whole_value] apply ResidueProfiles.selectedValue_sum_nonpos g (fun _ => 1) (by intro r; norm_num) intro r exact ih m (by omega) (dvd_mul_left m 3) (ResidueProfiles.profile g r) (ResidueProfiles.profile_nonneg g hg r) theorem phase_colour_equiv (a b:ZMod 12) (r:Phase) : ((ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) a = r ∧ ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) b = r) ∧ ZMod.castHom (by decide:3 ∣ 12) (ZMod 3) a = ZMod.castHom (by decide:3 ∣ 12) (ZMod 3) b) ↔ (a = b ∧ ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) a = r):=by revert a b r decide +kernel private def zz958:"s03be"="s03be":=by decide+kernel theorem phase_value {m:ℕ} [NeZero m] (S:ℚ) (r:Phase) (h4:4 ∣ 12 * m) (h3:3 ∣ 12 * m) (g:ZMod (12 * m) → ℝ) (j k:ZMod (12 * m)) : rowValue S h4 h3 g (.colourChild (.phase r)) j k = ResidueProfiles.selectedValue g (fun a => if ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) a = r then 1 else 0) j k:=by let χ:=ZMod.castHom (dvd_mul_right 12 m) (ZMod 12) have hcast4 (i:ZMod (12 * m)):ZMod.castHom h4 (ZMod 4) i = ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) (χ i) := (congrArg (fun f:ZMod (12 * m) →+* ZMod 4 => f i) (ZMod.castHom_comp (by decide:4 ∣ 12) (dvd_mul_right 12 m))).symm have hcast3 (i:ZMod (12 * m)):ZMod.castHom h3 (ZMod 3) i = ZMod.castHom (by decide:3 ∣ 12) (ZMod 3) (χ i) := (congrArg (fun f:ZMod (12 * m) →+* ZMod 3 => f i) (ZMod.castHom_comp (by decide:3 ∣ 12) (dvd_mul_right 12 m))).symm have ha:((scopeActive (.phase r) (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) && sameColour h3 j k) = true) ↔ χ j = χ k ∧ ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) (χ j) = r:=by simp only [scopeActive,sameColour,Bool.and_eq_true,decide_eq_true_eq,hcast4,hcast3] exact phase_colour_equiv (χ j) (χ k) r simp only [rowValue,rowQuad,rowPair,ha,ResidueProfiles.selectedValue] change expressionEval (if χ j = χ k ∧ ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) (χ j) = r then area else []) (quadPoint g j k) + expressionEval (if χ j = χ k ∧ ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) (χ j) = r then pairProduct (-8) else []) (pairPoint g j k) = if χ j = χ k then (if ZMod.castHom (by decide:4 ∣ 12) (ZMod 4) (χ j) = r then 1 else 0) * (expressionEval area (quadPoint g j k) + expressionEval (pairProduct (-8)) (pairPoint g j k)) else 0 simp only [eval_ite] exact selected_sum _ _ _ _ theorem phase_nonpos_of_induction {q:ℕ} [NeZero q] (S:ℚ) (r:Phase) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (ih:∀ (n:ℕ) [NeZero n],n < q → n ∣ q → ∀ u:ZMod n → ℝ,(∀ i,0 ≤ u i) → 0 ≤ deficit u) : rowAggregate S h4 h3 g (.colourChild (.phase r)) ≤ 0:=by have h12:12 ∣ q := Nat.Coprime.mul_dvd_of_dvd_of_dvd (by decide:Nat.Coprime 4 3) h4 h3 rcases h12 with ⟨m,rfl⟩ have hm:0 < m:=by have hp:=NeZero.pos (12 * m); omega let:NeZero m:=⟨by omega⟩ unfold rowAggregate simp_rw [phase_value] apply ResidueProfiles.selectedValue_sum_nonpos · intro a; split_ifs <;> norm_num · intro a exact ih m (by omega) (dvd_mul_left m 12) (ResidueProfiles.profile g a) (ResidueProfiles.profile_nonneg g hg a) end Green24Proof.ColourChildRows private def zz2266:"s08da"="s08da":=by decide+kernel end section namespace Green24Proof.FullSixProfileInterval open FullPhaseRows (Phase) open PhaseMassRows ChildRows HeightChildRows theorem interval_nonneg_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (heven:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(5:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (6:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by by_contra! hneg have hm:m < 2 * m:=by have hp:=NeZero.pos m; omega have hdu:=ih m hm (dvd_mul_left m 2) u hu have hdv:=ih m hm (dvd_mul_left m 2) v hv have hg:=interleave_nonneg u v hu hv have hforms:=ConditionalProfileRows.domainForms_nonneg 5 6 h4 h2 u v hu hv hdu hdv hneg (by norm_num) heven hodd hlow hhigh have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) have hchild:FullPhaseAggregation.rowAggregate 6 h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even]; linarith have hheight:=rowAggregate_height_odd_nonpos 6 h4 h3 h2 u v hu hv (HeightStrong.strong_height_bound h2 h3m h5m v hv) have hgrand:=Full27ProfileInterval.grandchild_nonpos_of_induction 6 h4 h3 (interleave u v) hg 0 ih have hcolour:=ColourChildRows.whole_nonpos_of_induction 6 h4 h3 (interleave u v) hg ih have hhigh':phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 ≤ (6:ℝ) * (phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3):=by rw [ProfileChildren.phaseTotal_interleave_zero h4 h2, ProfileChildren.phaseTotal_interleave_two h4 h2,phaseTotal_interleave_one h4 h2, phaseTotal_interleave_three h4 h2,classMass_sum,classMass_sum] exact hhigh have h:=FullSixMass.deficit_nonneg_of_rows h4 h3 h5 (interleave u v) hg heven hhigh' hforms hchild hheight hgrand hcolour linarith theorem interval_nonneg {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(5:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (6:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,heven,hodd⟩ := ProfileDoubleOrientation.orient_both_children h4 u v hu hv have h:=interval_nonneg_ordered h4 h3 h5 h2 u' v' hu' hv' ih heven hodd (by simpa only [hU,hV] using hlow) (by simpa only [hU,hV] using hhigh) simpa only [hd] using h end Green24Proof.FullSixProfileInterval private def zz2267:"s08db"="s08db":=by decide+kernel end section namespace Green24Proof.RatioCoverSix private def zz959:"s03bf"="s03bf":=by decide+kernel theorem interval_to_six {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (horder:mass v ≤ mass u) (hhigh:mass u ≤ 6 * mass v) : 0 ≤ deficit (interleave u v):=by by_cases hfour:mass u ≤ 4 * mass v · exact RatioCover.interval_to_four h4 h3 h5 h2 u v hu hv ih horder hfour · by_cases hfive:mass u ≤ 5 * mass v · have h:=FullFiveProfileInterval.interval_bound h4 h3 h5 h2 u v hu hv ih (le_of_lt (lt_of_not_ge hfour)) hfive exact (mul_nonneg (by norm_num) (sq_nonneg (mass v))).trans h · exact FullSixProfileInterval.interval_nonneg h4 h3 h5 h2 u v hu hv ih (le_of_lt (lt_of_not_ge hfive)) hhigh end Green24Proof.RatioCoverSix private def zz2268:"s08dc"="s08dc":=by decide+kernel end section namespace Green24Proof.ProfileEnergyOrientation open FullPhaseRows (Phase) open PhaseMassRows ProfileOrientation theorem energy_comp_equiv {ι κ:Type*} [Fintype ι] [Fintype κ] (e:ι ≃ κ) (g:κ → ℝ):energy (fun i => g (e i)) = energy g:=by unfold energy have hi (i:ι):(∑ j:ι,rho (g (e i)) (g (e j))) = ∑ j:κ,rho (g (e i)) (g j):=e.sum_comp (fun j:κ => rho (g (e i)) (g j)) simp_rw [hi] rw [e.sum_comp (fun i:κ => ∑ j:κ,rho (g i) (g j))] theorem energy_translate {m:ℕ} [NeZero m] (g:ZMod m → ℝ) (t:ZMod m) : energy (fun i => g (i + t)) = energy g:=energy_comp_equiv (Equiv.addRight t) g theorem orient_even_child {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : ∃ u' v':ZMod m → ℝ,(∀ i,0 ≤ u' i) ∧ (∀ i,0 ≤ v' i) ∧ mass u' = mass u ∧ mass v' = mass v ∧ deficit (interleave u' v') = deficit (interleave u v) ∧ energy (interleave u' v') = energy (interleave u v) ∧ phaseTotal h4 (interleave u' v') 2 ≤ phaseTotal h4 (interleave u' v') 0:=by rcases le_total (phaseTotal h4 (interleave u v) 2) (phaseTotal h4 (interleave u v) 0) with h | h · exact ⟨u,v,hu,hv,rfl,rfl,rfl,rfl,h⟩ · refine ⟨(fun i => u (i + 1)),(fun i => v (i + 1)),(fun i => hu _),(fun i => hv _), mass_translate u 1,mass_translate v 1, ?_, ?_, ?_⟩ · rw [interleave_translate,deficit_translate] · rw [interleave_translate,energy_translate] · rw [phaseTotal_shift_children,phaseTotal_shift_children] simpa only [zero_add,show (2 + 2:Phase) = 0 from rfl] using h end Green24Proof.ProfileEnergyOrientation private def zz2269:"s08dd"="s08dd":=by decide+kernel end section namespace Green24Proof.ParentParityOrientation open ProfileEnergyOrientation private def zz960:"s03c0"="s03c0":=by decide+kernel theorem parityEquiv_even_add_one {m:ℕ} [NeZero m] (i:ZMod m) : parityEquiv m (0,i) + 1 = parityEquiv m (1,i):=by simp only [parityEquiv_apply,ZMod.val_zero,ZMod.val_one,Nat.cast_zero, Nat.cast_one,add_zero] theorem parityEquiv_odd_add_one {m:ℕ} [NeZero m] (i:ZMod m) : parityEquiv m (1,i) + 1 = parityEquiv m (0,i + 1):=by have h:doubleResidue m 1 = 2:=by simpa using doubleResidue_natCast m 1 simp only [parityEquiv_apply,ZMod.val_zero,ZMod.val_one,Nat.cast_zero, Nat.cast_one,map_add,h,add_zero] ring theorem interleave_swap_translate {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) : interleave v (fun i => u (i + 1)) = fun i => interleave u v (i + 1):=by funext x obtain ⟨⟨r,i⟩,rfl⟩:=(parityEquiv m).surjective x rcases zmod_two_eq_zero_or_one r with rfl | rfl · rw [parityEquiv_even_add_one,interleave_even,interleave_odd] · rw [parityEquiv_odd_add_one,interleave_odd,interleave_even] theorem orient_parent {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : ∃ u' v':ZMod m → ℝ,(∀ i,0 ≤ u' i) ∧ (∀ i,0 ≤ v' i) ∧ mass (interleave u' v') = mass (interleave u v) ∧ deficit (interleave u' v') = deficit (interleave u v) ∧ energy (interleave u' v') = energy (interleave u v) ∧ mass v' ≤ mass u':=by rcases le_total (mass v) (mass u) with h | h · exact ⟨u,v,hu,hv,rfl,rfl,rfl,h⟩ · refine ⟨v,(fun i => u (i + 1)),hv,(fun i => hu _), ?_, ?_, ?_, ?_⟩ · rw [interleave_swap_translate,mass_translate] · rw [interleave_swap_translate,deficit_translate] · rw [interleave_swap_translate,energy_translate] · simpa only [mass_translate] using h private def zz961:"s03c1"="s03c1":=by decide+kernel theorem orient_parent_with_child_masses {m:ℕ} [NeZero m] (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) : ∃ u' v':ZMod m → ℝ,(∀ i,0 ≤ u' i) ∧ (∀ i,0 ≤ v' i) ∧ mass (interleave u' v') = mass (interleave u v) ∧ deficit (interleave u' v') = deficit (interleave u v) ∧ energy (interleave u' v') = energy (interleave u v) ∧ mass v' ≤ mass u' ∧ ((mass u' = mass u ∧ mass v' = mass v) ∨ (mass u' = mass v ∧ mass v' = mass u)):=by rcases le_total (mass v) (mass u) with h | h · exact ⟨u,v,hu,hv,rfl,rfl,rfl,h,Or.inl ⟨rfl,rfl⟩⟩ · refine ⟨v,(fun i => u (i + 1)),hv,(fun i => hu _), ?_, ?_, ?_, ?_, ?_⟩ · rw [interleave_swap_translate,mass_translate] · rw [interleave_swap_translate,deficit_translate] · rw [interleave_swap_translate,energy_translate] · simpa only [mass_translate] using h · exact Or.inr ⟨rfl,mass_translate u 1⟩ end Green24Proof.ParentParityOrientation private def zz2270:"s08de"="s08de":=by decide+kernel end section namespace Green24Proof.ProfileInduction def ProperDivisorNonneg (q:ℕ):Prop := ∀ (n:ℕ) [NeZero n],n < q → n ∣ q → ∀ (g:ZMod n → ℝ),(∀ i,0 ≤ g i) → 0 ≤ deficit g theorem deficit_nonneg_of_ordered_parity_step (step:∀ (m:ℕ) [NeZero m], 4 ∣ 2 * m → 3 ∣ 2 * m → 2 ∣ m → ¬5 ∣ 2 * m → ∀ (u v:ZMod m → ℝ),(∀ i,0 ≤ u i) → (∀ i,0 ≤ v i) → ProperDivisorNonneg (2 * m) → mass v ≤ mass u → 0 ≤ deficit (interleave u v)) : ∀ (q:ℕ) [NeZero q], ¬5 ∣ q → ∀ (g:ZMod q → ℝ),(∀ i,0 ≤ g i) → 0 ≤ deficit g:=by intro q induction q using Nat.strong_induction_on with | h q ih => intro hq h5 g hg by_cases h12:12 ∣ q · have h2:2 ∣ q:=dvd_trans (by decide:2 ∣ 12) h12 obtain ⟨m,rfl⟩:=h2 have hm:m ≠ 0:=by intro hm exact NeZero.ne (2 * m) (by rw [hm,mul_zero]) have:NeZero m:=⟨hm⟩ have h4:4 ∣ 2 * m:=dvd_trans (by decide:4 ∣ 12) h12 have h3:3 ∣ 2 * m:=dvd_trans (by decide:3 ∣ 12) h12 have h2m:2 ∣ m:=by obtain ⟨k,hk⟩:=h4 exact ⟨k,by omega⟩ have hproper:ProperDivisorNonneg (2 * m):=by intro n hn hnlt hndvd f hf exact ih n hnlt (fun h5n => h5 (dvd_trans h5n hndvd)) f hf let u:=ProfileChildren.child g 0 let v:=ProfileChildren.child g 1 have hu:∀ i,0 ≤ u i:=ProfileChildren.child_nonneg g hg 0 have hv:∀ i,0 ≤ v i:=ProfileChildren.child_nonneg g hg 1 obtain ⟨u',v',hu',hv',_,hd,_,horder⟩ := ParentParityOrientation.orient_parent u v hu hv have hs:=step m h4 h3 h2m h5 u' v' hu' hv' hproper horder rw [hd] at hs simpa only [u,v,ProfileChildren.interleave_children] using hs · exact deficit_nonneg_of_twelve_not_dvd h12 g hg end Green24Proof.ProfileInduction private def zz2271:"s08df"="s08df":=by decide+kernel end section namespace Green24Proof.PeriodicLiftMasses theorem periodicLift_nonneg {q:ℕ} [NeZero q] (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):∀ i,0 ≤ periodicLift g i:=by intro i exact mul_nonneg (by norm_num) (hg _) theorem classMass_periodicLift {q:ℕ} [NeZero q] (h2:2 ∣ q) (g:ZMod q → ℝ) (r:ZMod 2) : classMass (ZMod.castHom (dvd_mul_right 2 q) (ZMod 2)) (periodicLift g) r = classMass (ZMod.castHom h2 (ZMod 2)) g r:=by let π:=ZMod.castHom (dvd_mul_left q 2) (ZMod q) have he (i:ZMod (2 * q)) : ZMod.castHom (dvd_mul_right 2 q) (ZMod 2) i = ZMod.castHom h2 (ZMod 2) (π i) := (congrArg (fun f:ZMod (2 * q) →+* ZMod 2 => f i) (ZMod.castHom_comp h2 (dvd_mul_left q 2))).symm unfold classMass periodicLift simp only [he] change (∑ i:ZMod (2 * q),if ZMod.castHom h2 (ZMod 2) (π i) = r then (1 / 2:ℝ) * g (π i) else 0) = _ have hp (i:ZMod (2 * q)) : (if ZMod.castHom h2 (ZMod 2) (π i) = r then (1 / 2:ℝ) * g (π i) else 0) = (1 / 2:ℝ) * (if ZMod.castHom h2 (ZMod 2) (π i) = r then g (π i) else 0):=by split_ifs <;> ring simp_rw [hp] rw [← Finset.mul_sum,sum_comp_eq_card π 2 double_quotient_fibers (fun i:ZMod q => if ZMod.castHom h2 (ZMod 2) i = r then g i else 0)] norm_num ring private def zz962:"s03c2"="s03c2":=by decide+kernel theorem child_mass_periodicLift {q:ℕ} [NeZero q] (h2:2 ∣ q) (g:ZMod q → ℝ) (r:ZMod 2) : mass (ProfileChildren.child (periodicLift g) r) = classMass (ZMod.castHom h2 (ZMod 2)) g r:=by rw [ProfileChildren.child_mass,classMass_periodicLift h2] end Green24Proof.PeriodicLiftMasses private def zz2272:"s08e0"="s08e0":=by decide+kernel end section namespace Green24Proof.LiftedHeightBounds open ProfileChildren PeriodicLiftMasses theorem of_interleave_bound {q:ℕ} [NeZero q] (h2:2 ∣ q) (c:ℝ) (Q:ℝ → ℝ → ℝ) (u:ZMod q → ℝ) (hu:∀ i,0 ≤ u i) (hAB:classMass (ZMod.castHom h2 (ZMod 2)) u 1 ≤ classMass (ZMod.castHom h2 (ZMod 2)) u 0) (hbound:∀ a b:ZMod q → ℝ,(∀ i,0 ≤ a i) → (∀ i,0 ≤ b i) → mass b ≤ mass a → c * energy (interleave a b) + Q (mass a) (mass b) ≤ deficit (interleave a b)) : c * energy u + Q (classMass (ZMod.castHom h2 (ZMod 2)) u 0) (classMass (ZMod.castHom h2 (ZMod 2)) u 1) ≤ deficit u:=by have hnonneg:=periodicLift_nonneg u hu have h:=hbound (child (periodicLift u) 0) (child (periodicLift u) 1) (child_nonneg _ hnonneg 0) (child_nonneg _ hnonneg 1) (by simpa only [child_mass_periodicLift h2] using hAB) simpa only [interleave_children,child_mass_periodicLift h2, energy_periodicLift u hu,deficit_periodicLift] using h theorem of_interleave_certificate {q:ℕ} [NeZero q] (h2:2 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ 2 * q) (c:ℝ) (Q:ℝ → ℝ → ℝ) (u:ZMod q → ℝ) (hu:∀ i,0 ≤ u i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * q → n ∣ 2 * q → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hAB:classMass (ZMod.castHom h2 (ZMod 2)) u 1 ≤ classMass (ZMod.castHom h2 (ZMod 2)) u 0) (hcertificate:(4 ∣ 2 * q) → (3 ∣ 2 * q) → (¬5 ∣ 2 * q) → (2 ∣ q) → ∀ a b:ZMod q → ℝ,(∀ i,0 ≤ a i) → (∀ i,0 ≤ b i) → (∀ (n:ℕ) [NeZero n],n < 2 * q → n ∣ 2 * q → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) → mass b ≤ mass a → c * energy (interleave a b) + Q (mass a) (mass b) ≤ deficit (interleave a b)) : c * energy u + Q (classMass (ZMod.castHom h2 (ZMod 2)) u 0) (classMass (ZMod.castHom h2 (ZMod 2)) u 1) ≤ deficit u:=by have h4:4 ∣ 2 * q:=by rcases h2 with ⟨k,hk⟩ exact ⟨k,by omega⟩ apply of_interleave_bound h2 c Q u hu hAB intro a b ha hb hmass exact hcertificate h4 (dvd_mul_of_dvd_right h3 2) h5 h2 a b ha hb ih hmass end Green24Proof.LiftedHeightBounds private def zz2273:"s08e1"="s08e1":=by decide+kernel end section namespace Green24Proof.OrientedOverlapBounds open ParentParityOrientation ProfileChildren theorem interleave_overlap_bound {n:ℕ} [NeZero n] (w z:ZMod n → ℝ) (hw:∀ i,0 ≤ w i) (hz:∀ i,0 ≤ z i) (R:ℝ) (hd:0 ≤ deficit (interleave w z)) (hsharp:R ≤ mass (interleave w z) + Real.sqrt (8 * energy (interleave w z))) (hparity0:R ≤ 6 * mass w) (hparity1:R ≤ 6 * mass z) (h12:∀ a b:ZMod n → ℝ,(∀ i,0 ≤ a i) → (∀ i,0 ≤ b i) → mass b ≤ mass a → (2 / 5) * energy (interleave a b) + Q12 (mass a) (mass b) ≤ deficit (interleave a b)) (h18:∀ a b:ZMod n → ℝ,(∀ i,0 ≤ a i) → (∀ i,0 ≤ b i) → mass b ≤ mass a → (2 / 5) * energy (interleave a b) + Q18 (mass a) (mass b) ≤ deficit (interleave a b)) : mass (interleave w z) * R ≤ (61 / 32) * mass (interleave w z) ^ 2 + 8 * deficit (interleave w z):=by obtain ⟨a,b,ha,hb,hM,hd',hE,horder,hpair⟩ := orient_parent_with_child_masses w z hw hz have hR:R ≤ 6 * mass b:=by rcases hpair with ⟨_,hB⟩ | ⟨_,hB⟩ · simpa only [hB] using hparity1 · simpa only [hB] using hparity0 have hsharp':R ≤ mass a + mass b + Real.sqrt (8 * energy (interleave a b)):=by rw [← mass_interleave,hM,hE] exact hsharp have h:=overlap_bound (mass_nonneg hb) horder (energy_nonneg (interleave_nonneg a b ha hb)) (by simpa only [hd'] using hd) hsharp' hR (h12 a b ha hb horder) (h18 a b ha hb horder) simpa only [← mass_interleave,hM,hd'] using h private def zz963:"s03c3"="s03c3":=by decide+kernel theorem profile_overlap_bound {n:ℕ} [NeZero n] (u:ZMod (2 * n) → ℝ) (hu:∀ i,0 ≤ u i) (R:ℝ) (hd:0 ≤ deficit u) (hsharp:R ≤ mass u + Real.sqrt (8 * energy u)) (hparity0:R ≤ 6 * mass (child u 0)) (hparity1:R ≤ 6 * mass (child u 1)) (h12:∀ a b:ZMod n → ℝ,(∀ i,0 ≤ a i) → (∀ i,0 ≤ b i) → mass b ≤ mass a → (2 / 5) * energy (interleave a b) + Q12 (mass a) (mass b) ≤ deficit (interleave a b)) (h18:∀ a b:ZMod n → ℝ,(∀ i,0 ≤ a i) → (∀ i,0 ≤ b i) → mass b ≤ mass a → (2 / 5) * energy (interleave a b) + Q18 (mass a) (mass b) ≤ deficit (interleave a b)) : mass u * R ≤ (61 / 32) * mass u ^ 2 + 8 * deficit u:=by have h:=interleave_overlap_bound (child u 0) (child u 1) (child_nonneg u hu 0) (child_nonneg u hu 1) R (by simpa only [interleave_children] using hd) (by simpa only [interleave_children] using hsharp) hparity0 hparity1 h12 h18 simpa only [interleave_children] using h end Green24Proof.OrientedOverlapBounds private def zz2274:"s08e2"="s08e2":=by decide+kernel end section namespace Green24Proof.BoundaryFromHeightCertificates open ProfileChildren def HeightCertificate (m:ℕ) [NeZero m] (Q:ℝ → ℝ → ℝ):Prop := (4 ∣ 2 * m) → (3 ∣ 2 * m) → (¬5 ∣ 2 * m) → (2 ∣ m) → ∀ a b:ZMod m → ℝ,(∀ i,0 ≤ a i) → (∀ i,0 ≤ b i) → (∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) → mass b ≤ mass a → (2 / 5) * energy (interleave a b) + Q (mass a) (mass b) ≤ deficit (interleave a b) theorem overlap_bound_of_certificates {m:ℕ} [NeZero m] (h2:2 ∣ m) (h3:3 ∣ m) (h5:¬5 ∣ 2 * m) (u:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hcertificate12:HeightCertificate m Q12) (hcertificate18:HeightCertificate m Q18) : mass u * overlapMaximum u ≤ (61 / 32) * mass u ^ 2 + 8 * deficit u:=by have hdu:=ih m (by have hp:=NeZero.pos m; omega) (dvd_mul_left m 2) u hu have h12w (w:ZMod m → ℝ) (hw:∀ i,0 ≤ w i) (hAB:classMass (ZMod.castHom h2 (ZMod 2)) w 1 ≤ classMass (ZMod.castHom h2 (ZMod 2)) w 0) : (2 / 5) * energy w + Q12 (classMass (ZMod.castHom h2 (ZMod 2)) w 0) (classMass (ZMod.castHom h2 (ZMod 2)) w 1) ≤ deficit w := LiftedHeightBounds.of_interleave_certificate h2 h3 h5 (2 / 5) Q12 w hw ih hAB hcertificate12 have h18w (w:ZMod m → ℝ) (hw:∀ i,0 ≤ w i) (hAB:classMass (ZMod.castHom h2 (ZMod 2)) w 1 ≤ classMass (ZMod.castHom h2 (ZMod 2)) w 0) : (2 / 5) * energy w + Q18 (classMass (ZMod.castHom h2 (ZMod 2)) w 0) (classMass (ZMod.castHom h2 (ZMod 2)) w 1) ≤ deficit w := LiftedHeightBounds.of_interleave_certificate h2 h3 h5 (2 / 5) Q18 w hw ih hAB hcertificate18 rcases h2 with ⟨n,rfl⟩ have hn:0 < n:=by have hp:=NeZero.pos (2 * n); omega let:NeZero n:=⟨Nat.ne_of_gt hn⟩ have hparity0:overlapMaximum u ≤ 6 * mass (child u 0):=by rw [child_mass] exact overlapMaximum_parity (dvd_mul_right 2 n) u hu 0 have hparity1:overlapMaximum u ≤ 6 * mass (child u 1):=by rw [child_mass] exact overlapMaximum_parity (dvd_mul_right 2 n) u hu 1 apply OrientedOverlapBounds.profile_overlap_bound u hu (overlapMaximum u) hdu (overlapMaximum_sharp u hu) hparity0 hparity1 · intro a b ha hb hAB have h:=h12w (interleave a b) (interleave_nonneg a b ha hb) (by simpa only [classMass_interleave_even,classMass_interleave_odd] using hAB) simpa only [classMass_interleave_even,classMass_interleave_odd] using h · intro a b ha hb hAB have h:=h18w (interleave a b) (interleave_nonneg a b ha hb) (by simpa only [classMass_interleave_even,classMass_interleave_odd] using hAB) simpa only [classMass_interleave_even,classMass_interleave_odd] using h theorem boundary_nonneg_of_certificates {m:ℕ} [NeZero m] (h2:2 ∣ m) (h3:3 ∣ m) (h5:¬5 ∣ 2 * m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hU:0 < mass u) (hratio:16 * mass v ≤ mass u) (hcertificate12:HeightCertificate m Q12) (hcertificate18:HeightCertificate m Q18) : 0 ≤ deficit (interleave u v):=by have hm:m < 2 * m:=by have hp:=NeZero.pos m; omega exact boundary_nonneg hU (mass_nonneg hv) hratio (ih m hm (dvd_mul_left m 2) u hu) (ih m hm (dvd_mul_left m 2) v hv) (overlap_bound_of_certificates h2 h3 h5 u hu ih hcertificate12 hcertificate18) (deficit_interleave_expansion u v hu hv (overlap_le_maximum u)) end Green24Proof.BoundaryFromHeightCertificates private def zz2275:"s08e3"="s08e3":=by decide+kernel end section namespace Green24Proof.ConditionalProfileEndpoint open ProfileInduction BoundaryFromHeightCertificates def RatioToSixteen:Prop := ∀ (m:ℕ) [NeZero m], 4 ∣ 2 * m → 3 ∣ 2 * m → ¬5 ∣ 2 * m → 2 ∣ m → ∀ u v:ZMod m → ℝ,(∀ i,0 ≤ u i) → (∀ i,0 ≤ v i) → ProperDivisorNonneg (2 * m) → mass v ≤ mass u → mass u ≤ 16 * mass v → 0 ≤ deficit (interleave u v) theorem deficit_nonneg_of_certificates (hratio:RatioToSixteen) (hcertificate12:∀ (m:ℕ) [NeZero m],HeightCertificate m Q12) (hcertificate18:∀ (m:ℕ) [NeZero m],HeightCertificate m Q18) : ∀ (q:ℕ) [NeZero q], ¬5 ∣ q → ∀ (g:ZMod q → ℝ),(∀ i,0 ≤ g i) → 0 ≤ deficit g:=by apply deficit_nonneg_of_ordered_parity_step intro m _ h4 h3 h2 h5 u v hu hv ih horder by_cases hhigh:mass u ≤ 16 * mass v · exact hratio m h4 h3 h5 h2 u v hu hv ih horder hhigh · have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have hU:0 < mass u:=by linarith [mass_nonneg hv] exact boundary_nonneg_of_certificates h2 h3m h5 u v hu hv ih hU (le_of_lt (lt_of_not_ge hhigh)) (hcertificate12 m) (hcertificate18 m) private def zz964:"s03c4"="s03c4":=by decide+kernel theorem profileFunctional_le_of_certificates (hratio:RatioToSixteen) (hcertificate12:∀ (m:ℕ) [NeZero m],HeightCertificate m Q12) (hcertificate18:∀ (m:ℕ) [NeZero m],HeightCertificate m Q18) (q:ℕ) [NeZero q] (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : profileFunctional g ≤ 2 * mass g ^ 2:=by exact sub_nonneg.mp (deficit_nonneg_of_certificates hratio hcertificate12 hcertificate18 q h5 g hg) end Green24Proof.ConditionalProfileEndpoint private def zz2276:"s08e4"="s08e4":=by decide+kernel end section namespace Green24Proof.RatioCoverSixteenFromRemaining open ProfileInduction BoundaryFromHeightCertificates ConditionalProfileEndpoint def IntervalCertificate (L H:ℝ):Prop := ∀ (m:ℕ) [NeZero m], 4 ∣ 2 * m → 3 ∣ 2 * m → ¬5 ∣ 2 * m → 2 ∣ m → ∀ u v:ZMod m → ℝ,(∀ i,0 ≤ u i) → (∀ i,0 ≤ v i) → ProperDivisorNonneg (2 * m) → L * mass v ≤ mass u → mass u ≤ H * mass v → 0 ≤ deficit (interleave u v) theorem ratio_to_sixteen_of_remaining (h68:IntervalCertificate 6 8) (h812:IntervalCertificate 8 12) (h1216:IntervalCertificate 12 16):RatioToSixteen:=by intro m _ h4 h3 h5 h2 u v hu hv ih horder hhigh by_cases hsix:mass u ≤ 6 * mass v · exact RatioCoverSix.interval_to_six h4 h3 h5 h2 u v hu hv ih horder hsix · by_cases height:mass u ≤ 8 * mass v · exact h68 m h4 h3 h5 h2 u v hu hv ih (le_of_lt (lt_of_not_ge hsix)) height · by_cases htwelve:mass u ≤ 12 * mass v · exact h812 m h4 h3 h5 h2 u v hu hv ih (le_of_lt (lt_of_not_ge height)) htwelve · exact h1216 m h4 h3 h5 h2 u v hu hv ih (le_of_lt (lt_of_not_ge htwelve)) hhigh theorem deficit_nonneg_of_remaining (h68:IntervalCertificate 6 8) (h812:IntervalCertificate 8 12) (h1216:IntervalCertificate 12 16) (hcertificate12:∀ (m:ℕ) [NeZero m],HeightCertificate m Q12) (hcertificate18:∀ (m:ℕ) [NeZero m],HeightCertificate m Q18) : ∀ (q:ℕ) [NeZero q], ¬5 ∣ q → ∀ (g:ZMod q → ℝ),(∀ i,0 ≤ g i) → 0 ≤ deficit g := deficit_nonneg_of_certificates (ratio_to_sixteen_of_remaining h68 h812 h1216) hcertificate12 hcertificate18 end Green24Proof.RatioCoverSixteenFromRemaining private def zz2277:"s08e5"="s08e5":=by decide+kernel end section namespace Green24Proof.LocalFullEightPairs def compact_fullEight_pair_20_base:CompactPair.Quadratic:=⟨(-17 / 0x2cb417800),(0x7cf / 0x77359400),0⟩ def compact_fullEight_pair_20_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-0x2b81fed / 0x3b9aca00),1, -2⟩,⟨(0x686b305 / 0xee6b2800),2, -3⟩,⟨(0x2b81fed / 0x3b9aca00),2, -1⟩,⟨(-0x686b305 / 0xee6b2800),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩] noncomputable def fullEight_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_20_base compact_fullEight_pair_20_hinges x y def compact_fullEight_pair_20_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullEight_pair_20_check : CompactPair.expressionCheckPSD compact_fullEight_pair_20_base compact_fullEight_pair_20_hinges 0 compact_fullEight_pair_20_cuts = true := by decide +kernel private def zz965:"s03c5"="s03c5":=by decide+kernel theorem compact_fullEight_pair_20_representation (x y:ℝ) : fullEight_pair_20 x y = CompactPair.expressionEval compact_fullEight_pair_20_base compact_fullEight_pair_20_hinges x y:=by rfl theorem fullEight_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_20 x y:=by rw [compact_fullEight_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_20_check hy (by simpa using hx) def compact_fullEight_pair_21_base:CompactPair.Quadratic:=⟨(1 / 0x59682f000),(0x18d / 0x3b9aca00),0⟩ def compact_fullEight_pair_21_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(1 / 0x2cb417800),2, -3⟩,⟨(1 / 0x1dcd65000),2, -1⟩,⟨(-1 / 0x2cb417800),3, -2⟩] noncomputable def fullEight_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_21_base compact_fullEight_pair_21_hinges x y def compact_fullEight_pair_21_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2] theorem compact_fullEight_pair_21_check : CompactPair.expressionCheckPSD compact_fullEight_pair_21_base compact_fullEight_pair_21_hinges 0 compact_fullEight_pair_21_cuts = true := by decide +kernel theorem compact_fullEight_pair_21_representation (x y:ℝ) : fullEight_pair_21 x y = CompactPair.expressionEval compact_fullEight_pair_21_base compact_fullEight_pair_21_hinges x y:=by rfl private def zz966:"s03c6"="s03c6":=by decide+kernel theorem fullEight_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_21 x y:=by rw [compact_fullEight_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_21_check hy (by simpa using hx) def compact_fullEight_pair_22_base:CompactPair.Quadratic:=⟨0,(0x15f / 0xee6b280),0⟩ def compact_fullEight_pair_22_hinges:List CompactPair.Hinge:=[] noncomputable def fullEight_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_22_base compact_fullEight_pair_22_hinges x y def compact_fullEight_pair_22_cuts:List ℚ:=[] theorem compact_fullEight_pair_22_check : CompactPair.expressionCheckPSD compact_fullEight_pair_22_base compact_fullEight_pair_22_hinges 0 compact_fullEight_pair_22_cuts = true := by decide +kernel theorem compact_fullEight_pair_22_representation (x y:ℝ) : fullEight_pair_22 x y = CompactPair.expressionEval compact_fullEight_pair_22_base compact_fullEight_pair_22_hinges x y:=by rfl theorem fullEight_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_22 x y:=by rw [compact_fullEight_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_22_check hy (by simpa using hx) def compact_fullEight_pair_23_base:CompactPair.Quadratic:=⟨(-0x6a19ce1e1 / 0x59682f000),(0x280088ab / 0x3b9aca00),0⟩ def compact_fullEight_pair_23_hinges:List CompactPair.Hinge:=[⟨(-0x4d574fb / 0x2faf0800),1, -3⟩,⟨(0x2f1fa253 / 0x5f5e1000),1, -2⟩,⟨(-0x15e4af / 0x5f5e100),1, -1⟩,⟨(-0x860bd6f / 0x47868c00),2, -3⟩,⟨(0xac9d0e9b / 0xee6b2800),2, -1⟩,⟨(-0x2ae479d7 / 0xee6b2800),3, -2⟩] noncomputable def fullEight_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_23_base compact_fullEight_pair_23_hinges x y def compact_fullEight_pair_23_cuts:List ℚ:=[(1 / 2),(2 / 3),1,(3 / 2),2,3] private def zz967:"s03c7"="s03c7":=by decide+kernel theorem compact_fullEight_pair_23_check : CompactPair.expressionCheckPSD compact_fullEight_pair_23_base compact_fullEight_pair_23_hinges 0 compact_fullEight_pair_23_cuts = true := by decide +kernel theorem compact_fullEight_pair_23_representation (x y:ℝ) : fullEight_pair_23 x y = CompactPair.expressionEval compact_fullEight_pair_23_base compact_fullEight_pair_23_hinges x y:=by rfl theorem fullEight_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_23 x y:=by rw [compact_fullEight_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_23_check hy (by simpa using hx) def compact_fullEight_pair_24_base:CompactPair.Quadratic:=⟨(-0x33965db9 / 0x165a0bc00),(0x149862b / 0x1a13b860),0⟩ def compact_fullEight_pair_24_hinges:List CompactPair.Hinge:=[⟨(0x2505965 / 0x59682f00),1, -3⟩,⟨(-0x1966e893 / 0x77359400),1, -2⟩,⟨(0x45f3ee7 / 0x3b9aca00),2, -3⟩,⟨(-0x225f50b7 / 0x3b9aca00),2, -1⟩,⟨(0x60eaa13 / 0x3b9aca00),3, -2⟩,⟨(0xe34fc5f / 0x59682f00),3, -1⟩] noncomputable def fullEight_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_24_base compact_fullEight_pair_24_hinges x y def compact_fullEight_pair_24_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullEight_pair_24_check : CompactPair.expressionCheckPSD compact_fullEight_pair_24_base compact_fullEight_pair_24_hinges 0 compact_fullEight_pair_24_cuts = true := by decide +kernel private def zz968:"s03c8"="s03c8":=by decide+kernel theorem compact_fullEight_pair_24_representation (x y:ℝ) : fullEight_pair_24 x y = CompactPair.expressionEval compact_fullEight_pair_24_base compact_fullEight_pair_24_hinges x y:=by rfl theorem fullEight_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_24 x y:=by rw [compact_fullEight_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_24_check hy (by simpa using hx) def compact_fullEight_pair_25_base:CompactPair.Quadratic:=⟨(23 / 0x59682f000),(0x15c3 / 0x342770c00),0⟩ def compact_fullEight_pair_25_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(-1 / 0xee6b2800),1, -1⟩,⟨(1 / 0x59682f000),2, -3⟩,⟨(-1 / 0x2cb417800),3, -2⟩] noncomputable def fullEight_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_25_base compact_fullEight_pair_25_hinges x y def compact_fullEight_pair_25_cuts:List ℚ:=[(2 / 3),1,(3 / 2),2] theorem compact_fullEight_pair_25_check : CompactPair.expressionCheckPSD compact_fullEight_pair_25_base compact_fullEight_pair_25_hinges 0 compact_fullEight_pair_25_cuts = true := by decide +kernel theorem compact_fullEight_pair_25_representation (x y:ℝ) : fullEight_pair_25 x y = CompactPair.expressionEval compact_fullEight_pair_25_base compact_fullEight_pair_25_hinges x y:=by rfl private def zz969:"s03c9"="s03c9":=by decide+kernel theorem fullEight_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_25 x y:=by rw [compact_fullEight_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_25_check hy (by simpa using hx) def compact_fullEight_pair_26_base:CompactPair.Quadratic:=⟨(-1 / 0xb2d05e00),(0x15f / 0xee6b280),0⟩ def compact_fullEight_pair_26_hinges:List CompactPair.Hinge:=[⟨(-0x1af9a1 / 0x77359400),1, -3⟩,⟨(-0x88baf / 0x17d78400),1, -1⟩,⟨(0xa9997 / 0x59682f00),2, -3⟩,⟨(0x695c9 / 0xee6b2800),2, -1⟩] noncomputable def fullEight_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_26_base compact_fullEight_pair_26_hinges x y def compact_fullEight_pair_26_cuts:List ℚ:=[(1 / 2),1,(3 / 2),3] theorem compact_fullEight_pair_26_check : CompactPair.expressionCheckPSD compact_fullEight_pair_26_base compact_fullEight_pair_26_hinges 0 compact_fullEight_pair_26_cuts = true := by decide +kernel theorem compact_fullEight_pair_26_representation (x y:ℝ) : fullEight_pair_26 x y = CompactPair.expressionEval compact_fullEight_pair_26_base compact_fullEight_pair_26_hinges x y:=by rfl theorem fullEight_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_26 x y:=by rw [compact_fullEight_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_26_check hy (by simpa using hx) def compact_fullEight_pair_27_base:CompactPair.Quadratic:=⟨(-0xf3ef33aa9 / 0x59682f000),(0x821932e5 / 0x77359400),0⟩ def compact_fullEight_pair_27_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x1dcd65000),1, -2⟩,⟨(-0x10432593f / 0x1dcd65000),2, -1⟩,⟨(0x27078d63 / 0x47868c00),3, -1⟩] noncomputable def fullEight_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_27_base compact_fullEight_pair_27_hinges x y def compact_fullEight_pair_27_cuts:List ℚ:=[(1 / 3),(1 / 2),2,3] private def zz970:"s03ca"="s03ca":=by decide+kernel theorem compact_fullEight_pair_27_check : CompactPair.expressionCheckPSD compact_fullEight_pair_27_base compact_fullEight_pair_27_hinges 0 compact_fullEight_pair_27_cuts = true := by decide +kernel theorem compact_fullEight_pair_27_representation (x y:ℝ) : fullEight_pair_27 x y = CompactPair.expressionEval compact_fullEight_pair_27_base compact_fullEight_pair_27_hinges x y:=by rfl theorem fullEight_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_27 x y:=by rw [compact_fullEight_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_27_check hy (by simpa using hx) def compact_fullEight_pair_28_base:CompactPair.Quadratic:=⟨(-0x14756e72529 / 0xae9f7bcc00),(-0x1f304269b7 / 0x2ba7def300),(-0xb4f8ce1fb / 0xba43b7400)⟩ def compact_fullEight_pair_28_hinges:List CompactPair.Hinge:=[⟨(-0x276b6979dd / 0x15d3ef79800),1, -3⟩,⟨(0xb4f8ce1fb / 0x746a528800),1,3⟩,⟨(0x276b6979dd / 0x15d3ef79800),3, -1⟩,⟨(0xb4f8ce1fb / 0x746a528800),3,1⟩] noncomputable def fullEight_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_28_base compact_fullEight_pair_28_hinges x y def compact_fullEight_pair_28_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullEight_pair_28_check : CompactPair.expressionCheckPSD compact_fullEight_pair_28_base compact_fullEight_pair_28_hinges 0 compact_fullEight_pair_28_cuts = true := by decide +kernel private def zz971:"s03cb"="s03cb":=by decide+kernel theorem compact_fullEight_pair_28_representation (x y:ℝ) : fullEight_pair_28 x y = CompactPair.expressionEval compact_fullEight_pair_28_base compact_fullEight_pair_28_hinges x y:=by rfl theorem fullEight_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_28 x y:=by rw [compact_fullEight_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_28_check hy (by simpa using hx) def compact_fullEight_pair_29_base:CompactPair.Quadratic:=⟨(-0x65cbf3f1d3 / 0x3a35294400),(-0x43dd4b15c5 / 0x574fbde600),(-0xb4f8ce1fb / 0xba43b7400)⟩ def compact_fullEight_pair_29_hinges:List CompactPair.Hinge:=[⟨(-0xb4f8ce1fb / 0x746a528800),1, -3⟩,⟨(0xb4f8ce1fb / 0x746a528800),1,3⟩,⟨(0xb4f8ce1fb / 0x746a528800),3, -1⟩,⟨(0xb4f8ce1fb / 0x746a528800),3,1⟩] noncomputable def fullEight_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_29_base compact_fullEight_pair_29_hinges x y def compact_fullEight_pair_29_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullEight_pair_29_check : CompactPair.expressionCheckPSD compact_fullEight_pair_29_base compact_fullEight_pair_29_hinges 0 compact_fullEight_pair_29_cuts = true := by decide +kernel theorem compact_fullEight_pair_29_representation (x y:ℝ) : fullEight_pair_29 x y = CompactPair.expressionEval compact_fullEight_pair_29_base compact_fullEight_pair_29_hinges x y:=by rfl private def zz972:"s03cc"="s03cc":=by decide+kernel theorem fullEight_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_29 x y:=by rw [compact_fullEight_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_29_check hy (by simpa using hx) def compact_fullEight_pair_30_base:CompactPair.Quadratic:=⟨(-0xd218b3d / 0x1312d00),(0x17116df7b / 0x3b9aca00),0⟩ def compact_fullEight_pair_30_hinges:List CompactPair.Hinge:=[⟨(-0x1d67b0cd / 0xee6b2800),2, -3⟩,⟨(0xe4a6f63d / 0xb2d05e00),3, -1⟩] noncomputable def fullEight_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_30_base compact_fullEight_pair_30_hinges x y def compact_fullEight_pair_30_cuts:List ℚ:=[(1 / 3),(3 / 2)] theorem compact_fullEight_pair_30_check : CompactPair.expressionCheckPSD compact_fullEight_pair_30_base compact_fullEight_pair_30_hinges 0 compact_fullEight_pair_30_cuts = true := by decide +kernel theorem compact_fullEight_pair_30_representation (x y:ℝ) : fullEight_pair_30 x y = CompactPair.expressionEval compact_fullEight_pair_30_base compact_fullEight_pair_30_hinges x y:=by rfl theorem fullEight_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_30 x y:=by rw [compact_fullEight_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_30_check hy (by simpa using hx) def compact_fullEight_pair_31_base:CompactPair.Quadratic:=⟨(13 / 0x1dcd65000),(0x31f / 0x3b9aca00),0⟩ def compact_fullEight_pair_31_hinges:List CompactPair.Hinge:=[⟨(-0x7ee33 / 0xe4e1c00),1, -3⟩,⟨(-0x31c28d / 0x9896800),1, -1⟩,⟨(0x48791 / 0x59682f0),2, -3⟩,⟨(0x192160f / 0x59682f000),3, -2⟩,⟨(-1 / 0x165a0bc00),3, -1⟩] noncomputable def fullEight_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_31_base compact_fullEight_pair_31_hinges x y def compact_fullEight_pair_31_cuts:List ℚ:=[(1 / 3),(2 / 3),1,(3 / 2),3] private def zz973:"s03cd"="s03cd":=by decide+kernel theorem compact_fullEight_pair_31_check : CompactPair.expressionCheckPSD compact_fullEight_pair_31_base compact_fullEight_pair_31_hinges 0 compact_fullEight_pair_31_cuts = true := by decide +kernel theorem compact_fullEight_pair_31_representation (x y:ℝ) : fullEight_pair_31 x y = CompactPair.expressionEval compact_fullEight_pair_31_base compact_fullEight_pair_31_hinges x y:=by rfl theorem fullEight_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_31 x y:=by rw [compact_fullEight_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_31_check hy (by simpa using hx) def compact_fullEight_pair_32_base:CompactPair.Quadratic:=⟨(-0x4c80aa0b75 / 0xae9f7bcc00),(0x13b5b4e5c7 / 0xae9f7bcc0),(-0xb4f8ce1fb / 0xba43b7400)⟩ def compact_fullEight_pair_32_hinges:List CompactPair.Hinge:=[⟨(-0x1ebb50a39f9 / 0x15d3ef79800),1, -3⟩,⟨(0xb4f8ce1fb / 0x746a528800),1,3⟩,⟨(0xb4f8ce1fb / 0x746a528800),3, -1⟩,⟨(0xb4f8ce1fb / 0x746a528800),3,1⟩] noncomputable def fullEight_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_32_base compact_fullEight_pair_32_hinges x y def compact_fullEight_pair_32_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullEight_pair_32_check : CompactPair.expressionCheckPSD compact_fullEight_pair_32_base compact_fullEight_pair_32_hinges 0 compact_fullEight_pair_32_cuts = true := by decide +kernel private def zz974:"s03ce"="s03ce":=by decide+kernel theorem compact_fullEight_pair_32_representation (x y:ℝ) : fullEight_pair_32 x y = CompactPair.expressionEval compact_fullEight_pair_32_base compact_fullEight_pair_32_hinges x y:=by rfl theorem fullEight_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_32 x y:=by rw [compact_fullEight_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_32_check hy (by simpa using hx) def compact_fullEight_pair_33_base:CompactPair.Quadratic:=⟨(-0x7bece2ebe7 / 0x574fbde600),(-0x5673ba4fe1 / 0x574fbde600),(-0xb4f8ce1fb / 0xba43b7400)⟩ def compact_fullEight_pair_33_hinges:List CompactPair.Hinge:=[⟨(-0xb4f8ce1fb / 0x746a528800),1, -3⟩,⟨(-0x331c99 / 0x7735940),1, -2⟩,⟨(-0x3845939 / 0x1dcd6500),1, -1⟩,⟨(0xb4f8ce1fb / 0x746a528800),1,3⟩,⟨(0x20818355 / 0x2cb417800),2, -3⟩,⟨(-0x1f4a0e77 / 0xee6b2800),2, -1⟩,⟨(0x21951ef / 0x77359400),3, -2⟩,⟨(0xb4f8ce1fb / 0x746a528800),3, -1⟩,⟨(0xb4f8ce1fb / 0x746a528800),3,1⟩] noncomputable def fullEight_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_33_base compact_fullEight_pair_33_hinges x y def compact_fullEight_pair_33_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_fullEight_pair_33_check : CompactPair.expressionCheckPSD compact_fullEight_pair_33_base compact_fullEight_pair_33_hinges 0 compact_fullEight_pair_33_cuts = true := by decide +kernel theorem compact_fullEight_pair_33_representation (x y:ℝ) : fullEight_pair_33 x y = CompactPair.expressionEval compact_fullEight_pair_33_base compact_fullEight_pair_33_hinges x y:=by rfl private def zz975:"s03cf"="s03cf":=by decide+kernel theorem fullEight_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_33 x y:=by rw [compact_fullEight_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_33_check hy (by simpa using hx) def compact_fullEight_pair_34_base:CompactPair.Quadratic:=⟨(1 / 0x59682f00),(0x1b4b / 0x1a13b8600),0⟩ def compact_fullEight_pair_34_hinges:List CompactPair.Hinge:=[⟨(-0x4cdefc1 / 0xb2d05e00),1, -3⟩,⟨(0x3d7f301 / 0x17d78400),1, -2⟩,⟨(-0x147fbab / 0x17d78400),2, -3⟩,⟨(-0x3d7f301 / 0x17d78400),2, -1⟩,⟨(0x147fbab / 0x17d78400),3, -2⟩,⟨(0x4cdefc1 / 0xb2d05e00),3, -1⟩] noncomputable def fullEight_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_34_base compact_fullEight_pair_34_hinges x y def compact_fullEight_pair_34_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullEight_pair_34_check : CompactPair.expressionCheckPSD compact_fullEight_pair_34_base compact_fullEight_pair_34_hinges 0 compact_fullEight_pair_34_cuts = true := by decide +kernel theorem compact_fullEight_pair_34_representation (x y:ℝ) : fullEight_pair_34 x y = CompactPair.expressionEval compact_fullEight_pair_34_base compact_fullEight_pair_34_hinges x y:=by rfl theorem fullEight_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_34 x y:=by rw [compact_fullEight_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_34_check hy (by simpa using hx) def compact_fullEight_pair_35_base:CompactPair.Quadratic:=⟨0,(0x15cd / 0x342770c00),0⟩ def compact_fullEight_pair_35_hinges:List CompactPair.Hinge:=[] noncomputable def fullEight_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_35_base compact_fullEight_pair_35_hinges x y def compact_fullEight_pair_35_cuts:List ℚ:=[] private def zz976:"s03d0"="s03d0":=by decide+kernel theorem compact_fullEight_pair_35_check : CompactPair.expressionCheckPSD compact_fullEight_pair_35_base compact_fullEight_pair_35_hinges 0 compact_fullEight_pair_35_cuts = true := by decide +kernel theorem compact_fullEight_pair_35_representation (x y:ℝ) : fullEight_pair_35 x y = CompactPair.expressionEval compact_fullEight_pair_35_base compact_fullEight_pair_35_hinges x y:=by rfl theorem fullEight_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_35 x y:=by rw [compact_fullEight_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_35_check hy (by simpa using hx) def compact_fullEight_pair_36_base:CompactPair.Quadratic:=⟨(-0x1b3f025 / 0x1dcd6500),(0xa37a657 / 0x3b9aca00),0⟩ def compact_fullEight_pair_36_hinges:List CompactPair.Hinge:=[⟨(0x1b3f025 / 0x77359400),2, -3⟩] noncomputable def fullEight_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_36_base compact_fullEight_pair_36_hinges x y def compact_fullEight_pair_36_cuts:List ℚ:=[(3 / 2)] theorem compact_fullEight_pair_36_check : CompactPair.expressionCheckPSD compact_fullEight_pair_36_base compact_fullEight_pair_36_hinges 0 compact_fullEight_pair_36_cuts = true := by decide +kernel private def zz977:"s03d1"="s03d1":=by decide+kernel theorem compact_fullEight_pair_36_representation (x y:ℝ) : fullEight_pair_36 x y = CompactPair.expressionEval compact_fullEight_pair_36_base compact_fullEight_pair_36_hinges x y:=by rfl theorem fullEight_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_36 x y:=by rw [compact_fullEight_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_36_check hy (by simpa using hx) def compact_fullEight_pair_37_base:CompactPair.Quadratic:=⟨(1 / 0x59682f000),(0x641 / 0x77359400),0⟩ def compact_fullEight_pair_37_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x165a0bc00),1, -3⟩,⟨(1 / 0x1dcd65000),1, -2⟩] noncomputable def fullEight_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_37_base compact_fullEight_pair_37_hinges x y def compact_fullEight_pair_37_cuts:List ℚ:=[2,3] theorem compact_fullEight_pair_37_check : CompactPair.expressionCheckPSD compact_fullEight_pair_37_base compact_fullEight_pair_37_hinges 0 compact_fullEight_pair_37_cuts = true := by decide +kernel theorem compact_fullEight_pair_37_representation (x y:ℝ) : fullEight_pair_37 x y = CompactPair.expressionEval compact_fullEight_pair_37_base compact_fullEight_pair_37_hinges x y:=by rfl private def zz978:"s03d2"="s03d2":=by decide+kernel theorem fullEight_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_37 x y:=by rw [compact_fullEight_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_37_check hy (by simpa using hx) def compact_fullEight_pair_38_base:CompactPair.Quadratic:=⟨(-0x1369579306d / 0xae9f7bcc00),(-0x4010bd1029 / 0x574fbde600),(-0xb4f8ce1fb / 0xba43b7400)⟩ def compact_fullEight_pair_38_hinges:List CompactPair.Hinge:=[⟨(-0xb4f8ce1fb / 0x746a528800),1, -3⟩,⟨(0xb4f8ce1fb / 0x746a528800),1,3⟩,⟨(-0x88270d / 0x59682f00),2, -3⟩,⟨(0x88270d / 0x59682f00),3, -2⟩,⟨(0xb4f8ce1fb / 0x746a528800),3, -1⟩,⟨(0xb4f8ce1fb / 0x746a528800),3,1⟩] noncomputable def fullEight_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_38_base compact_fullEight_pair_38_hinges x y def compact_fullEight_pair_38_cuts:List ℚ:=[(1 / 3),(2 / 3),(3 / 2),3] theorem compact_fullEight_pair_38_check : CompactPair.expressionCheckPSD compact_fullEight_pair_38_base compact_fullEight_pair_38_hinges 0 compact_fullEight_pair_38_cuts = true := by decide +kernel theorem compact_fullEight_pair_38_representation (x y:ℝ) : fullEight_pair_38 x y = CompactPair.expressionEval compact_fullEight_pair_38_base compact_fullEight_pair_38_hinges x y:=by rfl theorem fullEight_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_38 x y:=by rw [compact_fullEight_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_38_check hy (by simpa using hx) def compact_fullEight_pair_39_base:CompactPair.Quadratic:=⟨(-0xcb976830bb / 0x746a528800),(-0x87bb15de75 / 0xae9f7bcc00),(-0xb4f8ce1fb / 0xba43b7400)⟩ def compact_fullEight_pair_39_hinges:List CompactPair.Hinge:=[⟨(-0xb4f8ce1fb / 0x746a528800),1, -3⟩,⟨(0x572d / 0xee6b2800),1, -2⟩,⟨(0xb4f8ce1fb / 0x746a528800),1,3⟩,⟨(-0x572d / 0xee6b2800),2, -1⟩,⟨(0xb4f8ce1fb / 0x746a528800),3, -1⟩,⟨(0xb4f8ce1fb / 0x746a528800),3,1⟩] noncomputable def fullEight_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullEight_pair_39_base compact_fullEight_pair_39_hinges x y def compact_fullEight_pair_39_cuts:List ℚ:=[(1 / 3),(1 / 2),2,3] private def zz979:"s03d3"="s03d3":=by decide+kernel theorem compact_fullEight_pair_39_check : CompactPair.expressionCheckPSD compact_fullEight_pair_39_base compact_fullEight_pair_39_hinges 0 compact_fullEight_pair_39_cuts = true := by decide +kernel theorem compact_fullEight_pair_39_representation (x y:ℝ) : fullEight_pair_39 x y = CompactPair.expressionEval compact_fullEight_pair_39_base compact_fullEight_pair_39_hinges x y:=by rfl theorem fullEight_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullEight_pair_39 x y:=by rw [compact_fullEight_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_fullEight_pair_39_check hy (by simpa using hx) end Green24Proof.LocalFullEightPairs private def zz2278:"s08e6"="s08e6":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l17 l22 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l42 l43 l45 l5 l51 l54 l55 l57 l58 l6 l60 l62 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x185d58c29, -0x2390c4a68, -0x355927260,0x4369a01c], ![-0x2390c4a68, -0x7adb31bea,0x95218c4a,0x24026ff16], ![-0x355927260,0x95218c4a, -0xe72d00244,0x2390c53c8], ![0x4369a01c,0x24026ff16,0x2390c53c8, -0x11c86278c]] noncomputable def hinges:Hinges:=[(-0x6080b4,l6),(-0x1b3672fc,l5),(0xdb9ca96e,l4),(-0x7e23ac7b,l8),(-0x55185f2,l11),(0x280b6918,l10),(0x239db7946,l14),(-0x7a8613a4,l17),(0x61b58d2d,l23),(0xa0cbe79,l22),(-0x11c86278c,l27),(0x11c86278c,l29),(-0x239db7946,l25),(0x7549a63c,l31),(0xa267a8fe,l30),(0x11c86278c,l33),(-0x280b6918,l38),(-0x11c86278c,l35),(0x7e23ac7b,l36),(0x11c86278c,l37),(-0xdb9ca96e,l34),(-0xa267a8fe,l43),(-0xa0cbe79,l42),(0x555c7b2a,l45),(0x11c86278c,l51),(0x55185f2,l55),(0x1b3672fc,l54),(-0x7549a63c,l57),(-0x555c7b2a,l58),(0x6080b4,l60),(-0x61b58d2d,l63),(0x7a8613a4,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x11c86278c,l27),(0x11c86278c,l29),(0x11c86278c,l33),(-0x11c86278c,l35),(0x11c86278c,l37),(0x11c86278c,l51),(0x239db7946,l14),(-0x239db7946,l25),(0x7549a63c,l31),(-0x7549a63c,l57),(0xa267a8fe,l30),(-0xa267a8fe,l43),(0x61b58d2d,l23),(-0x61b58d2d,l63),(-0x7a8613a4,l17),(0x7a8613a4,l62),(-0x7e23ac7b,l8),(0x7e23ac7b,l36),(0xdb9ca96e,l4),(-0xdb9ca96e,l34),(0x555c7b2a,l45),(-0x555c7b2a,l58),(0x280b6918,l10),(-0x280b6918,l38),(-0x1b3672fc,l5),(0x1b3672fc,l54),(-0x55185f2,l11),(0x55185f2,l55),(0xa0cbe79,l22),(-0xa0cbe79,l42),(-0x6080b4,l6),(0x6080b4,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x4a241a07a00400028c3207402c40100000000068300e6010000a32481101a10040000000491c8121806000000005c1407300800000000e8681660100000000001501c8020000072311200b20060000000000480720080000000000280e401000002b0902803100300000000002a0310040000005311c0a83010000000a22280d06020000014e21c0930c0500000294428126180a0000000044140f3008000000e6188152602000001c619006c8c0500000000001a03900400000000001d0320040000141242049860280000001c8c40d0c030000000391881b180600000b4421c026400c00000082108090602000001f0883805100300000000140a02980400000025044086301000000000582814601000000000001c0c80100000000000281900200000002a0c013300c000000560b810c6020000000000090248020000000130481118060000000005500a200c0000000001481c40100000000002b0188020000000000520310040000000000b805200800000000002e06400800000000000c0c80100000000000981900200000f8521a013400c0000000000e816401000000011854028c030000a813828036a0080000004908403230100000000098580c60100004d0841200c900400000000261203180400000000004c0520080a10520210019a80301440a1044006350060000ac1202c04ea0080029828826012d40140002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0xe4318a4065a00800000000b4740730080005b0ec3100768020000001444301a0c0402a81840a203dba00c00000006229036300c00001488c3404c801800000010864058c030000052220c80b20060001d03408407840100001e0420a007880200007c0f02101e10040000781083404e2008000000000024062008000000044140186018000000268a4028c03000000004a2e071804000000009c540630080000000128a80c601000000000002c0c8010000000002780590060000000004d013200e108e1011601baa803800000190d0903d00200000a4230d81720060058ca10810209401400b19421260676802800000000a0502cc02001d83144281cc200a003b060881029840140000000c442048601800001c62ac0670c0500000000520e039804000000000a890330040000001441604c6018014110c08c083100500000000221a071804000288430d809a40100000000108580e601001632841040929005000000004a0c0798040000000941b01f300c0000e08c980f4860301940c205101edd006000000002c0a05980400000c4521c016400c0000000000700e4010000001444101b0c040029e33c518078a00a00000005221014300c0000001047206c6018000761103800ed004002183945281cc200a00430708a1029840140000000168580e60100000002c84c098c03000000004a1e0398040000000064380b30080000288e44403c801800000001e0d03cc020000076130500b200600000007211016300c0003506c15003e80200000001c8a4090c03,0x2b0501f980600000005621037300c0003888e09812a802000000036888070c030000004a321a07a004000000007c480e300800000001c8a81c601000000002507034c020000000000220710040000000038140b300800000000002a064008000000000210188020000002286e0141808000000410cc02830100000000001180c401000000002d0a038c0200000000001a071004000000005c340d30080000000088781a60100000000350e038c0200000007d18809980600000000001805200800000001f0c816601000000344610258c0400000000521a0798040000000054480630080000000000880c401000e3188108083d00500000000621c0718040000000064140f30080000008868281a801000000001e05034c02000000001c0a069804005048082202af40141078c206101ae08030010318818808e10050000000310880b18060000000000cc0620080000000129081460100000002e06404cc03000000001a120798040000000006d00a200c0000000001b80c40100000000003501880200000000221a0798040000000000e80520080000001848207a60180000000000840c80100000000524a0518040000000000190320040000000a4420666018000000000350388020000000054240798040000000003700b200c0000000006a026401800a210618803c50050018c118158079200a000000000014062009d08c1011601baa803800a31121a00141005038a33028a0530a00c000000006c380530080e08c90a080e4280300006c14417013d004,0x28c19e11e01d1200c00000000000f0320040000000c45202860180000001184c094c0300010c2183003da0080002044605403b401000838e716a07b6802800003e148840d9003001d82844080c9200a003d45388703db40140e78a2882810b680300002011d301e90c06000000005c1a059804000094c80407a43018000000c21900fe60200008610c1301ed00400000000000481900200000009624011300c0000000c43402a6018000000289240d8c030000082391701b200600404708ac01924014000498ac0b811680200009614413016d004040a38a29e042da00c0000006104807f301000000010c2604a60180000000000440c8010000000440d80898060000000620a015300c00000c310c06b26028000001042201fcc0400186290110107a00a0000000058240f30080e78a204101ae0803000e314810808e100500000000260a0398040000000000440720080000000742201a6018000001e0e0601d00200000000034281980200000000241c0a300800000000002812401000000003a0601cc020000007582400b18080000000044240f300800000000004a06400800000244110214c040000000003a80510060000000000e40e20080000000001d80c40100000000390e02cc020000000750c80598060000000000e406200800000000b0481c60100000000003e01480200000000000f8190020000000f821013300c0000000009060660080000001182408cc030000000290980e18060000000000540e2008000000a61101346020000000d823012cc04,0x360480618060000000640900c300c00000d0082004c60280000001b84402cc0300000000341203180400000c0961024c301400000000003606400800004922870099003000003842181a9180a000000530c80bc3010000000a21900b0602000000010844058c030000072370700a2006000000006458053008000000c22a810c602000000001917028c020000000341680998060000006716c08630100000000000a8124010000000188ac088c0300000062241a07a0040040c32031009240140000000000480e40100000430902803100300000a64909013200600000000a4440b30080000001442202c6018000079208880790030000000510d80a1806000000a10cc06830100000000110881e60100000000350b01cc02000000003214059804005108308302fb4016590e4837c017ae80380000002c9440d8c0300016c2c08801da00800490718c301d240140000000a43202c601800e718e2540f6d005038a30a21e042da00c00000d84219036400c00660810c20324802800d510e19c0f6d005031e20a18a042da00c00000000d4180f300800000000a848166010000d214c3602690040000004884603418080000006424140f40080000000188380e60100000000260d02cc020000038c4c808d980b2a07040be012f1401c0000001683603e601800000110d0503d00200000000241205980400020c731500ca401000818a209a046a8028000001845301a0c04000042638203d2180c0043c2182a007440140000000a44202c6018000001845101b0c04,0x68190020000000000d805200800c19422460516802800000150d05035002000000004c0a069804093062031c0ca1401800a11230820494802801412420900c490050000000410880b1806000001211c4096301000000001c8681e601000000003d0a038c02000004041181a9180a00000000e8580f3008000489023181b8802000000024904098c03000106360a6055a0080000000000640620080000000cc3206e60180000000002502c8020000066260d813a006060c43430c02e340181038e38c1812c88030000000208e4098c030000028c3c808d980a0028c3c85b011b4014000388c2298196802000000000260c0cc010000030c4c808d980a0002047118c0cb4010000408a219817680200008119851023d004001821841180bb200a0028c3b043028b40140000000000681240100000000110f014c0200000000001e0290040000004e044016301000001284c120168018000000000780248030000000000640290040000000005d00a200c0000000001681c40100000000002f01880200000000005a03100400001047632026400c0003b04a0e81988020000000d02500e4c04000000000d000990080000000662500a300c0000000b0420266018000001a44100c8c04000000003626031804000000006c440630080000000000d80a40100000014848004cc0400000002c13809980600000000005805200800000000b0880a6010000000000b00248030000000001b00490060000006a044014301000000000c8480e60100000001902c070c03,0x706684586052e200c0000000001040e20080000000e45206660183c338230302971006], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((0x20580fe84decd2c27464d1658e093965ef2c130920a931c06b848c2c4025102100840b20b83ae8706208cd71ca0c10d3209160e37512c12c022670a96280b3d4960c098307c0202720200013f2190230c70584b82f8c08d811151d768254e565e78ffbff45bdbef2ff57f3826b208c80352537eebee00975812fb5ad03f58a2113c1d4321ad75427b1e06c1bddeffe13672ee88f145d31011566ee6c6edf36449f036da864ac617b633e1058a0c1d71984328716b416e5e1b0d8959326e0cc0ff448a00513f436c1ab86fe018a795701b6679907aa58048bbe97a9c62b75f16f6c35e041b334d4332845210a060c170386790886028b9ae56b561440af00e2aa2116f28ca98508a09f15fe0820729dd963800000637b93821080422788ee00142992480000711151c302c43a14fb8c36f90c51ba42808000015f9022083fc6b24700c08d8bbbcde48c0091fa469bb80002dbc1198f4b4801401024900000bb44ac9c30272ecbc30ac61aab61610757c7040d46636cd2a501000002464680c08c5eee1340bcf0034566b726820800080a27d9560000d84f31fa55fc3c801681800008b0800221986d3447c2d4e4f797822730f5016f760081c6924c1ccf40b240e145343442281201041380c000080360800000d9173450332321751850fdf333e3145d846a27b13810b6e1494b0411f241a4f54c0000002a3040007a7341d01401be9ba8569900240100000e99182050001a49000921203e1318101c056862c456208731309c8f0e805c3a21a10d65bb2924041f0080c002e2786fa0eacee8c37a9ccc7d672221a84ab80bd962104270ee6f241254f85bcff100836c0f2c9f8c0811228a43d9200000bd93d3e44001401024704eb380465738912821ae5c063b00c49200002e01e0b8038606e5838114acc1020436f5adc3296c106633010feb7244a00000008f0d18004802d5449b64fac00c00ab7069388a803d09012006a0a800027e313c19b583ae2060641efdc861a5950daa2444244c205b8b104e3e2629482310256098104210b94442400000f2a8e8002200848e094a11638ac89a163800ee4c892400005efa101c303b28d26b7e2c1083b7baf3d60832540196a90940000001275002401a236bc49921800b24ae4a339f82400ac0b00004344000f1c8004219f3408550c9d01802f016810154fadc30c4129dcba4f920c6291105070b2362c07ce0470aa09919c1080021325a7721325a771ab0d39aeb3c461001f20a1f34e40302c903911c514a0c80cf093041030000200db2884b239e8701442f7be588cbc34515eeac415b838a6c7b93d5e10514ab6b4826d21e115c8f3f7303282020134ff9084052e821e5d055300532aeaf1c36ae4801581800008688001bb117f0500027e917e1109c848003a148be8880073b08aa86c5c827e514ccd15e30a031afe266084cdc5bacd082a93e29180eee12236280bc519efe4000603a10509c307c02018e0b097018bd00e23021a0226c80a643f9db5142811cdf83228b7b960ec02220575a9a448083a81dd1513021100422785481e6b4b1897d767d030d4d5e04ee48533174d39901051c0249d2048eb55fe07800000c6f79c00840211463767c5b13844e062b6398f9101884412d94ae0c3000019cb2647091e82cfe214082cca7fe1a3594000000140cd04400c9b32180f82006674ec945688f20054058000211200071268b0e061270444168cea15a02216b9231d004ca5bb5c05020090ef2125042100844f00b070864873a22cf2644603c0a2f22c641b3af55485be4957b24812fbd5a783c00000c6f89c008002113c0000076f92345d0da4cc111a083e96ea030c00003645d1084cede1d20b084bd70634020942f492ca920038628d4284000000054626400900400003a84000d148002319992d3b90992d3b8d5869cd759e230800f9bf151b9994816481c88c80c78a28a688784504e0100401b13c5342b6d291005d684ec4871046bc14223882d4b24861ace041a64a0a00c565e62c3185ce4bb820030cddace8002100840b0318e3a2f173cb04875350dc12c64bb4418196440305a7535aed02c30b933a2e4a62030bd29d689701c243ae39399f00828124a68d6e010002398554b908704801601a00008948001e5181c2aef23164462588d282a03050c16a88f14215da9d028b3b9d1b04344006e03959e1004f74d80a0857f22a32d0084201089e228001039849cca2615733dda2c7266490e5a56d7550351522238590dd8aa485f9480c05bb2376f12c408c3492bafd6cad60905864881c9f91c5063280817a661d17f01a008012f236e8197b0866a9ea89003a06c48d192a28992965903bc666f12287f23b83c2910c9fa9ac073c4000005af0201800002c100b0d57454f630585cc2336eac0c2d0121ee8c509002501c0000f010004ac2000ca64002e58e96000002221838000004b038a0b2085df9c2075402da07065a817c8204153b3efa14000047fb90a004e204401000016b22fa220016a622ac3a155190aa0a854c140031506c7167b255258a81f94f84d0cba0f959960ce7c248d24041f00858e2f1cf7b43430aa23064041504b68eb0f048dbc886e582394d09a94002472d94393021080400004c4c010) <<< 16000) + 0x04011a6cb510fcc2c711c1adb8105134dea21000f6508a79a02803198925041f00800007d100013722f81b17b0904f84c5cc262e40bb1c3a39f990686541c53753020d4ea8ea8e104d3e8ff420a6f8d71387821b8baa8c2c1212ba18b84e1042010b1c51d8f506105135b526e3c128614d89960899629a11000986c1aae0801efcaa45098208402000026643203618e1317a01e8680e1cd0061cc6f23ca92081e00406202eceba17467d02c6ba2a70da440b00000005016f76ba267bf9331a810700000000000000001d06b4ec016403346bf645f960ec7d25c0223352ccf913e43f43432030c34403807efb348937a3c72ba506d55fd6a25b3de754e4b3a8ea63eeaf547be0a5db9b597ec0b00a9d0a16c75a2bb57abc0c9d3950ccb2be8001e598080080200000888bc8880013148bc0c8001f888b89285c0642ee12000c1236788ab469d08fb4b40ce434f5ef89a7810a64b4ee4264b4ee3561a735d6788c2003e6fc546e66520599838e19209009002803a1697cdbc7d12d998f1a89a23ee920bc09c89fb6c900bcf01a24ffdaff3797956402587a5737e3b1dd1300714bf50c4f221e0a2999e05305881039fd466530ab2368b1008000edc89498f0809ce4df8f182be93ec3c2978442d8401f2e7add1090407802113c100a901430d1cbe5abc443310be5cf820803f59d68f000c52fe921800763afc926042100840c09f5b0b8d6e9e5093943899150a2a84aac395778a920f80d5d68843c700db7373d9b8e38a3b8de501312040a49762d68a50029ec521e6cd1c05044d537e06dfa2400b40d10302166eb40680d3009dafc02fccf28331b330e088a2a20b206a2080f1c0cacf23f36cf0c5421df85b80d00b4f0b4e406cc0013ec07097940009668939746a882400b00c000044840011b4e1abcc0ab948866d181b273810390d39982098f86af20f000200237e1800e58e0d126042100840c0e425c7e64f286d9105aca28afb0c61de515243246af1bd3c7012244ab8871c6a2c79e4a4810366d2cf18a00807abdf351c079a3eb0f3e44801300e2060377f8038b00d3013f80f318167941927d87e7b228a88e1670d0401e381af0e8a0920f0c53bc1e7d2ee6805a785a7203630005037c8314680012cd1272e8d28812005a06800022e200086440015f4e161051371461bb996a441e12ddf546a0412a50f82478002ec68603008984c6d4c003e0109269042cfaf247070b25d90918b1823cfa1c63c7a7b840618e4926aaf3c20779645a4c083d29da9c0822a7c012dd4001c2ca574e4008802000037e70b08289b8a30ddccb5220f096efaa35020a941f9043c00176343018044c2636a6001f0086161c686017a249eb9e271b312323a368c8c8719a82ff634830c8a11dcb9f3023506016000411fab5af378e042b87a6424a00087ac4a129e400940600003bc4000c708bb0480019248008db18df16a50000000010647fcaa222ad1442042bfcc71ef6ab5393d8bedd800000000000000000000000a11687add671c462e58c67bc9ca3769fdf396d234c5d871178902d020a14a04504404f0040b8a008034000a3880a06ec601c289368885f7dab1cc0a44e103c88003366de264041f00841801a15fe638f7b55a9c9ec5f6ec00000000000000000000000508b43d6eb38e23172c633de4e51bb4fef9cb691a62ec388bc489871841058c1864047805c100401a00042442a8160d80b9204b90e3b8618323e5c311101b6dd574e101cb23ab460e5a69c538909a708370cb041037ace8c001b9af1250a0308002163006685cb706198124bcdf858617aa03059183348492c97061f3096d6ce880a3b26bb0ec88004ce501543c059924c74b1c011bf84aa6c092430940600003c84000e188ab8a823824000de245d4262e40bb24000006660051439c85f5e4080c1cccbbc140c085b6567bd58e0456664153c0c0405673b9810501d866e8f800002c1dc1d94b0001aeafea3ae003020a0a008000040660180200817401d8e2e47c59c336749dad3355bb7b53ed157eaded14e626c1468ad3435ba5c2eedc705e41aabcaf784427254778c7adf6d0de6f92a1be67f7430b136c3418b5f648797efff6aed55a8120004078d661985fc547fab987f06dad8e9ead28303282362d937befac067eb252b1728d87a19de8dda5e727c91dd200337b64de96c4b653974e39dc9f18d29f09a118403eaa8028938a1ae1e2e978a7f91824adc1ed93527d05d2300d758be5b8f51cba74458256abde0a3836354d3ffa0e6c33450f284835f8c087aa018707829f7896319aea031cc4100e2499f692cc7b0ac0fc108f0e266ac1812e925b3401041baadb8d361d56a440b1c593792d4d0c225e3115000be5031f509030800200001ae40021948b982c5c807bf151b999481659d742e8cfa05854eb5a56551cdf9744cf7fe4cc6a0783e0000000000000000e835a7600b2019a35fb22fcb0763e92e01119a9667c89f21fa15fe638f7b55a9c9ec5f6ec00000000000000000000000508b43d6eb38e23172c633de4e51bb4fef9cb691a62ec388bca60650028000084d16e51a5a7bb1e38a7bdfae735996d6951693236292f24b36bf8485d0f8f0f6090f18c84f36853b3990c484c50a494d45980cea02347d0d44b2d2634237434ec1f36b419f3269593401162cbd649112f24e17a2a212f4e62bb45144e45040d102ef4d001683b3ac0d0006f922e2421701501c0280040d0f0c7850a78567fb9a71ae60896fb130518a2b52907cc0819093a0d66223e281414a99e30f76b720f9408e7b5c0411b88e0748)) <<< 16000) + 0x72e798a3193d8f6b8673ddc57052f49b4581a4dab9c2a4190347a16d461cbb4f4eb51f507f0b1c500156a3bf1dda440197abae7f54ce44faea7b217afa08287a57b0e2dac0dbcb42d851e55885dc6d9d6e57a1ca029cf875bd6c7284cdb2592ff9a9e57ace34a594e4481620100027c116f250b706800d10083c1ce1b4d00e0000004449d475a98eb299c8338234f60dcd03b4aad6b96e8b23c2ef751407cdf8a8dccca40b32851c21412401000c01401205d796a2e8b92a648cf87328d9111199bed631054e700219ba946f16ad40ec1d0115d69798ecce1533b225691d4000c6083586c1a8276496e3c52ff840a0c1318d670a2ecd2dd501448603621387f1c08d098b95e04003d0a096f20a07812cdf080001191e65268802c23cc60cc018e0809807182a3f41d1afb0a29a12ee4710121800000258018109d8645e8318088458226da160800000ccc00600874b680970004412e2c33da0809a42c599dc608202801c0000ff1b1264c14286a376c26dd2c74897188d185c870f795fea1b5868062afe4bc17440564a3a50e5cc1abb9b0774543f0410d69c4493d1595745f7a0462fd40df408808be0d99ceb8834e4d8440001da4771560f346829ac44ee7c072f43eb6d2b9a0b6b1b75fd3de63d16f51ecdd36f8bc28b12f880887c8f79d3c8b9c382a4d8003b63f5d690d317b9feed8e13e5f96b081db8ec3d38cbd7d476e53b31b96ec73bc80d24b82d272b83f0d563074a4ad34370acc79b992c3f52208b2ba06621800bde91e101408950f71827fbdbe3195b66276e427bbb4d668ea5889a890b9a32d1ac325aa97f813a4fbd104f576dc4d2ad477ab72774038843027444be0e980007ec3325a7721325a771ab0d39aeb3c461001f6dffa024054d5381c200b3bb4cc5b8a31db482178bd204b1700000000000000000108df8a8dccca40b32831c11012c01c014003e9f0df70644c17cfae7c775c72ea204b969e6c309b11a113614456d1e0800756715998425b70721fde66539fedf648f564fa08fa993cc7ead628ea33a800203115405e14393273202e1e4000000c738030d5cfeb0e88808228ab14c073868622278cfcd2120098867d013030109cdaef8170003745b963f70025da4f9ae0c01fe40e15014349034b053f3ac61a7b77459d1c3430f2584149a0b0800000189c00820087bf45820d0484e9afa99f30100000219780002f51e9305f05413f1038540480001e63020010040000111c287a4ea4f9869211e1f53b0186533a71c341a26fb99d80a0f0c00000960048028c4ded08180865b235b3000419c0ea130062bb478bf00410384a030f28000005dc03468c85a926e46187bce17332344abfb855558d0c70acc9eb034124de92b8c0c0400000aaa0000e30f2afc41104a20709806000038678901ecf4130601efe58c692318b11e5f6e289dbe791a307cac266d7e65c8f5ed2816a6468a678bb783f7c99252c67dde0f1573ba5264c167aca44452435dd83e488184be85306c57cca5e03aa9ed83fc3f718c2c17bf35a11532f6060ad7bdda21520d3b857d3c1bfd5e89ac303637b46987b7bac769af35c9bd1017592d8784d3058df38567ee715f49ceb74ad4443dd6d341f27d2fa869c047276a817d80df5614c01809953bfd9aa378d721eea7fb655baea0f6542b93dee8265d470abbcd037d1845134b916ab0bc02c2acbc1083c41d9b024a8636c8181aebf648ceb19bde42922cfb5a141f30f7565063f6c44a458bb915eaad7310cc9c773f618fd17e0d39523dd5746752428c849af202d18d16b69d8ec4414135915e5686ad0079f0c40530dcdea518b7bfdc805d6cab1fa4191bb1f5c4d28fd2125544924f412321a661800050b9000df0340c781f70082a67a47fe11e55573103a60a96af334b4707b071c3ebd253211c0652c086b2656e4699095879e40d09c31ca08ed58b5407d74b01f9619a9186d69cf92038020b9a1174fe06ea313aa3e62ade9e3162871941c0ccbbf7d8cea81b984e503a000a1621af65de884614a3d9709e6eb535fd7c179e1bd7ebc3b3a6cf67696bdac20060dc2fae6379a4ecaf8273cf68fe9df00780b42cb838f23cc1d7d121f4e02930919a6c1d8983dae0e9e5fccd153b02ade4805086d1fc4541ae9ecbe5b5e51e32d9f35c34f6d70782c473e74315db0cd072296a45c49a61726060f8b84651fe70000073122da520019bb20f05bdbff40480a9aa70384016776998b71463b69042f17a40962e00000000000000000211bf151b9994816c34506466e60599428e28e1900880060222002fa237b64e07846113901c19972319244f951005b134594b12f62a21b39e68df29d6691b1a8f83692338612b40cfae90c719256d00037c22d86216b2d00a1485a8640260a002e2d3a402cf65b7ca20dfeda80640b189f9217142307b8b751a08c23400440943084021a40d5b2e994a2062af0ef440b04263c3a1423cca284f9609b8830c54c002d2a3aa804c184201000013521b6130da01f1239042b152467e5da044141044c227009085ce17ee4183683f585925042100871252c09e2c24679da39dd1410caa7431c908360c74a018394198c373400564428f160099186b8c9c10840200002bc437817c48a55155ec91a51217db6308197c359b0816bd9a16f00000cef4f3825082100871240c1f269246879c951a0c2075f5df3860c3b71f7b8484008a2e9c0817fe5c0129600b659a8d82708210080000b0100028122d222168090002ac11670d8b304c144176310bcf3404818416256a43070da7caf21c023beb3078c00ff0)) <<< 16000) + 0x8fb3401009490840202ca0200012920f053d8c120af6660338d7630482bba58187ca085c6924c1ccf40b22852051c51421c10c01010ec4e233e44165592c1de241cdc329c0d0b155d3ba6f48b3867f6ddc11ab94a57c284d95a8238dbef45483183b8b74000a488b218c050860d61306a05cc969dc84c969dc6255958c8b3a34c407dc2bb877b7db9067afab801523482882051040821413402800100c100080374826f14d08902cc2fdef907141385cffa2085a4cdc4808201ad85a700004a404201000011222c62303605e0e6fd025b61c48536186a86182cbad0681040b154aa8580597c0ecb1c0278cba1b800804c5042010162010000ac116105e0edfe8c47b5184e0d7ce9da1f30e26df51d773e22f279336cd37ec502442aee84c4fda7ad5bcfa3260c0968d367a80ada7c476d29195a1820544a3683cc2c0e623379e821802c4c12cf5950170384cf7472400002034864959ff13bbc6c6c7279167f45a9962accadc98b188431325a7721325a771895656322ce8d3101f71a4930733d02e315e8c00755de59c9f2bc1533071c42811812c01c0004035505c192467503519f80033b208fc12286523a7c6fd0592f2f4acc727678cf64d4e1e5813164f9014000aec8b010800196483c18ecbba6280f700bbb100efc01f4423dd12fa2769ec7bf7c45f0ad042fe905dc0dde7ebf007d108f744be89da7b1f05ea2b9ce3a5dce8e9f331646c6132852051c51800c0040401ead18c652af3256acfb99264c7bba048bcff26c6e72a475c72fa2213af9409422839bd40d906da237e65b81f3e1915f04146d63bf8f279eb6e5aa6c9fd8d9bf634e045d55fe395d1b1ba60f0de3be13b8853a45aad5339b0ac2289320a79fc70d00053622be6a00104722bc6a0201d0ae8480074bc84308f85c4f1faf3bfe121d05013e7bde2856f91a6968d1f5b070c22961e620580c0d9de812e34838950bb540102c8c35ba9b8780092ca1b30ad0300c3b66a19d03f0aa4899dbe5f4aa0a1e99a4a4c857d61ae80e8963503293c2c4a666dc30d59e83a649fce7738e1898f080e6a27e66d0a0a022fdbfe83a7dc072d61efaef463aa87a813aded3389571904500008a27024477b06eaa6880abce3224ca7818237be90d14580c00e55a12c0fbc281effcf77b3500801e17451863d0828a0f9f8b07e5c414ed9029894c8a92de6ad2ad6b0280d281980b80d00004824571042b65a15a098ac828560050348035dc23703842e898e88490c162293bf5510284482de68a3f10009284cc6dec380f6cc566f390a0109ae8cfb22aa282b87ab1626c8a05534622f1fd0e7402a024741ad3b005900cd1afd917e583b1f4970088cd4b33e44f90fc5039034d28b08b04304e0090030100200d81a00005029cd34dc70c2551c5a73ce7d7834b22c57cf88715630d1e224d283f25b12d14000000b0fe09c208c0200002de40502703936a6db561c58bc28679e34a2174416965842133b1fccd04ee8ca3a5900859e27495380df0be6e08480000000c80a0108c021c5a5474f62c34b2be1f69ba7156afe63c04d281a7a7f2420080027075a3410e321a90c50000009ae209c108c0200002d8455c2411c0a00034d211c13f3502e90323498603d9aa8cb234a07f40812fc61215110285c07041c16d63219a04b5b5886212000000003e8051c109c051861d358d80234a92e934028693587b67e1cc244bedfd848e0854349a0d24000006bef44c084601000013d22ac12155090aa04854c0400066e6c88a50be2b72aa4660e05578106753180b1f2a3ad99c0b7ee9438407a5d6f5e0e00c3027a66a0bc8b0c68005577eca40d180000f424030e1b82a00007508a906fabf0242e76e925741ad3b005900cd2b98dc159523e5ca1e89439430c28411000800603f7c0c33c06eba8dbeed138e46066710d5dc006410626dbb768e50bd5ad2a718c9180adf93724971fa80012f913425f6b0a2cb82b95ced2ab02ec07c4b24918a14914804304b0040040104c16008034000404c884bb31822c7b204ad6f0e238600e20b0cebb803b450c16923764c5a3823f2f3aa203d2803234f14c10a0c002492195f7b8441047e839816816000074483904c1c40735f14848989fcafe6976b7aa1808c491c71070c60c504304400041047699532cb4117c0f777a359ce0c0d4005477437d8a839e3008b40006bc8009a6115129d9021b4d00e091a9d48f0c3942800000960245114069ffa509a3a9fbed0912bb3c36e9120ab36edcf827042300859330c17d454a2174b4105b942c6825457b284720ffdc92488e376c5284100492a214fb3021180400004f4ddadea86189fcafe6cd7c521220000000001189238a29221219018e10c036979fca57c9520e1a2abfac397fe2e108e15d000183364f67ba76542c810da680704102be67a240a1404a2f1c0922ba7e6e6bd284da3cea660488b0efe2f8860804a2ed10d00046010b2589f8b50e1445257f641d18611a36320050a8c66cdc809166cee74c89424056bdc5c2444386ca7c60801c2a62b9a800230080000cc991f11a2f08ebe3748a297a7dfa9205dee24451d97421077ffc4098de06d3766accc90dc49c1e5a0c0f81018537f35dc2ec0d1c20a6fe59d6ba81a101289dd4cfc02f42403821b82a000090881004c0016fc80a08a88810fc40742441829bf3292042999807bd243283f773a420348fd9d2de142080dea3431c103fa405831c00078b3532680424008510be6b0095091e5c2295081230802640aa244646340afc408da3257c3480e5c0d1d1b0e081984931304011b120)) <<< 16000) + 0xcbad0084601000019b3d0a775482e82fd4ab9102a00c86dc76e76eb9eca235328800000000000000007e240c40a30a40638638428062ab99e0af5d994d51fd50da34d38e165bd34da6fb37fdae3921a6c35d98c873fc62af027089d20280014f1150098a78080018f08a70c8534642983214b190a50485242429012147090a30485142428802143010008d21142498a0a2c5010627e7b13e2984312c4f4862783b0721989d8af082cf1043c9e0288c408fd13fa02062102def0100400475a8eeb38c3815e670838b2a280b0df30d2cb4a80a81b2267d1d47000a0947143a7c214489e6f9bff50022fce83bc6f60366c2c02c7163d175ca958790613e5cb0d5e40d80c61272818dc84845a798f9569c9d02ef2f04204005102860cef443800ccf14bfd7568dba5aa306854209c0193295f822a124cc348faa4597b61e8f0c7bb8aecc0ae8ac95e70038b8406365a24ad9b6f4df3ad8d4f69655494ad4c75fa5d799cf6be7bbb716ef5ea048a5b432ed89fa69f4bcbc58440ea29ff8cbea65b58bec5058efed2c27c186034681be5f406364356f92675e4e127242530948cc08a2ac392464991ab7ad039b6bcf596c814bc93fe1362f989644c4b29ad6d2b215ceaada89ba9b77d2a4438ef8db2abc3f96390d4e2466bed010f0d838a8e4801e272aa8ce0a45689b74922432929580ce11f83137ebec3c003c88fd91020e804302aaa787acc040d94a4e2c11869f69520014eca491c00d340c849410780200001ea600002008a026327c1040485e7fdc4003801000007022740a0000c2202813c20c57ef90c006738eec3038ab87d884c3074010272020000b421d80bf28017f5bd4d28b03ca944a2809009e989084020608cb0060170fa00023893a6a80426182000800009a90004ab22701be032cd540e024450740110080100459e22ad1a7423ed2d03390d3d7be269e04254cde10509055f6a67a3f08c3eb1d6ff1afa2c60ac9799bbc6b800000000000000000229280450996ee02e2059675d0ba33e816a71640c3048004e7bf7a89d5ac067a6ab8e91f9884733fb2b7bc0ed22b6fc5c26805217453485beb7195394adaefce875746da62aca33786e62895e48a36949a5f00e79766204829db40011c487602f012b189bca083e77e795822081f008717b4ddafe5c81102bb42339c8fb9678ea562e5595921ba56b4ffb5925cb3b3de74a03c41fbea929008d14bc6d5d56b641dc20310689987265bd34b7b02238e0b620655fadec598c42781da2758e660800d3159185fc759f3c9eca1107345e83d6ff025769c94af26a96539aef615e8e563f4a297bd691015fa2b1cc6c986db9e88cffef7b05429744394a0bd48bb9f067ccd9427bf88612f501469cd0116c0b0e716caa3ea1aec173b4f9b1a8eb840cfa9400e4e64d55aa5fa46fa8392f2cf5c612648a0000623226e1a0006ce200175844d86426a2202b0900062c9bffd67b89dc95058640af111f38b52a388d0484f60dcd069d08fb4b40ce434e7b5752081095337841424157da99e8fc230fac75bfc6be8b182b25e66ef1ae0000000000000000008a43966f0e30e05a0e292108118010020801f4aeb0087974ee38b3427703ab0ccfaa7ca961ae603349830e1419c89f641f1aeec1e218cba26b61440137904be88f5382f28eb67d4998baf52b6746237ee029d4ff64db39ef89b2faa9499a2b40014d889a14c4cc57841e51c2d061032dd8fc074304452a9f9c3f3b7c7a5920da0b028acba0cc777ef25ef97a346d841b714c351cf11753d8f8100776a2e449b7100aa43611ee47cd25ba2062605001a556a0200e45cb2898b82d5e758cac33b1ad1e776efdc7b5d99750810491afd44bd3d9ec89cc92af89bc08fcc6e262fceea5682a2404558b0932dbc8105e53df23b084573b6764debf8c39ad37b1ffe5154177ed0a938da0cff11441ffbf20f4610d2e89c0000ac044c8d626263130258779081b05625e1312e0589682c4b0078588ee7b89343339e25f62812608c443181590ae33a40031ac38472c02f4761ec00984080021853e83a1ab3430eaff21b1839197aaaa2811c82e1f11815c0be30d4250c2000808f00800045c81d08c498160700bc2afabe8b81418b55e8b50c19a7c6d0a060948acde820041e781b8160231455cf800930e1000438c59b7f8b058814840616389579bf9746005b3a4dd218039b8952612841000404ac07038650e3bd98283c86ee9902c676aa24860a3ebb5d61003765431d04a104001081d685870a4c14f1c8d824c102569adfce008c79a3687007b7ed894103127ac258260820008000096900024922542203d0908f048000ee0800284910b1581b04f398157a825099b5958d502ada103651a9400366451680a91be2d4a0000000020c8ff9544455a28840620640220250030018080c63053eae5a9e786578d8e9b261494cebd97b3e544580232a455908f2d36fef4470c7b54942dcd236628ab23a813808000c5089496c4a056168239ec1b9a0d3a11f696819c869cf6aea410216d081b28d4a001b3228b40555a28adf0a08fe2fc4e038150da711cf6ad02ef515ce71d2ee7474f998b2377e00fa211ee897d13b4f63e0be22f8568217f482ee06ef3f5f803e8847ba25f44ed3d8f7c6150c22c128140000ae2c9a46dd343198dbb5d974c36a14f38e2379e3ee043aff6e5ade282a64ebbc0d49cfdce0519f8573fe3aacc58c138ce33d16989c495ed93ae2ebfc9098995a1fdfbf3f9340d5b128840ca91a00e7044bf255c01f8c5c10767f238832f0afdd147113a451823db2411430)) <<< 16000) + 0x9c54ddba2816e98a860306634afc60025141e00808f0280004488938ac4982624a13f1c4a423c93ac6f1c4a423c93ac9089f2421710bb3089f2421710bb41c13d837341a7423ed2d03390d39ed5d482042ad1456f85047f17e2701c0ab3dc1c491c68168559e32cc0605a8a1941061200000409e8c7aaa62ee6e6615ee7bc28cde3dcc4264eed6615170886cea18e52e072ec944c60a9d42762cacd3362704ca65103f5bc9800ad83f5547f1eca2f32dc71b184192128a9f37820f00284118009c12e1a040fc749ac0408c4080021020dcb214e9c12c8140c72008c0bf580846183e0101240100005f11210df100f1fb3a0a1827cd9ad103018283c5101aa9a349e7001cba8b70094307c02102035f884cce089d643144d080333cc25004fb5e41e4800bec771dc102fecca1480983080020000260448c442440a00027330200b90d177d663f713dd2689dd20824b6491d8ab4047f8bb589d8b08078f9e925c79517f76934c7c102d0aee2e2c0b457b726316ea80e51445f4880e8517052854a94cd29a528137e8b202300823882a1f9bb1022140ae1c8023bc32584c107401000013a448417c456ece4d4c09950f010202dcfa97e3000aca1e98006b4bd8e025081d0086900889bf5640c0b1a21608024d5ac0d44005085f72008181a2380c128410004000040480010711201100a04847c24000b504478340014024003b488858cc4744606c13c2db8bf9254a13144eda62dff00fc32ed698301cf5489e9c7e4884321a7b1570a54a530474be9389618a2b1d9b73a869f2b2b8ce5825dc4daff79e473dbb9dc009d476100dc4073b4202af407f5ec142bd3b622857a851e06798931c08b99744d876cacd374f8a370353a12631eb6ff1e4b2c0be2cfff955a40015831ec3bf1f295e465b6e7fd3143f8c4345cf6f2ac25a7029734a48fe51e5b2d80f7b8e55e05a80fea357372074b569187b302695f8a4f1b8e95fc3d5ed6e6f76a4629a73e9e709d549faf974bdf102fc2d11714275bba2a33f7a7535aa68807cb6d9cabd7648c33072e8d3c61bc9d93a5e92bd1c000f7f681ce24813403d9507dc629d85ab56d7b6abb041a51a7575be6b4587016a09a5e45fc05fe11cd4e8e2bf8e2a9ca172e627990e4902bb4213b865bc6320071811c0d88d84f45a905c8886049a9d8d9c509cb4c8f39a01be2ed19000090807c0200001ba446854000cd24154b4208420270100058c900221022327bed6145970572b9da55605d80fab4515be1411fc5f89c0702a4f5205739f0059921920980160120080200e2da5ec36cf75dfb593d9bfe06e24cf1693064001f2f5b25a072030468b8f1803585a531e488eb44601422e0a0002b4222c8b1153188a06c44c27e0130c1ea825ec7203a0850d45719c1bb2c51abaa489ae0b594d3febf9fe3f44e133bb4d667555e7a0e0f684c03ddcabd508a6bd94c55755a6b922972d5f8e18f5a9928fb22fed610a8e46b1d638cfdebef686ddf643d4d2480529f1021e95a96b3df31b31c78a613eaa850988baa222464c094d7cb1f7f07a016d03641dc4b3700891cb008795e69f84168a4470f2da67d6c43ac039e164635a134ea1d23c1d9f478f7714c79f6d42a6c6f35be964501e7a1c135ffcad1e85f3619b7f338f9bd617f611608d65aa402a7ae4aea07ef46ac0c9a68015088c75553716300bcff108a013f66a378007c14be120118610004220c1be78ef484207c0202240200006622120b11101d80121e56bb000a46b565a110210804044007051145261cd00475cdf048007c01100001004000011183390f9ae340b3e140591020e80400001c880009f1f063f0fc486100200086010d7ee591001c004000024110f050870080003688868884184400061440011ec8860ec42c462141b03605e8683c0194203ae328959a091d5e9c8c0046b3080300a64f9860250c1d008406defde4410081f67d7a40144023b4811860f004000029488484c42017c210fde3b4a101d8119e489803d91d3020f9fed40e11c15cec0705a5ddd4f3000e8042c7001f7480e1202382e6284010f6694705262bc4a30027b61d2cb002ca530a98007802000023a407c1620e03814023c63ee50a29beb7cc4061a16d020785006e6b0c4808400108140edbe80c78a2bc0acf0785115bf9d4680286b84f24808400100000d43e4d2c7e23210179f64278002e50cf8613081e0040000511000280220c1a1050900029f10ec11e0d80b4c9a181d5d40f41e0623cc56cc03f628de4381242c8cf00009480740200001fc4154942083a0270100045211033182682e01abbd53c4083441292467f5c5b373ad9d89c4bb03653683706d1579aa5102334d216434ba0ee83273338040e090fcbdcbfd998e67c551ec2814c4ccba37d67e8e65cf9dfcd223fb03752ba47d3e795136f25f54d3004ff4801b60a038fc8c136fc8f7335b36b7a6eaad33f935ee6be83067cb5f6f1b760ccea11964c14dca335a5c5f020000552c239addd815cd7ce02d1cbd636a67423ea899802bae8967dd4bde29279f7ecf2cc2e5cca57e89697ce6382dd420e76c5e044563698f832ca89a8408eda8f8194d63d22f2aa21112bc57b0762643afc4b5196aaa6e2caadb8ae9dff25d976dc370a4471fc8e5f1a7449e6c68a2196a31ed3bfc6ad2427994a34503dedfde3602dc8140c76991c3991b88aa3062775cb0554ba0b9fcb77100b3014222d4c8c8eef0d9a1b4f9dd0a8015097e583410007c6875f104579aea338b88444179ec6d916c743ad0324aeabcdc1b50fbd2fc41031883a35e428a321401382)) <<< 16000) + 0x80010b08299284087620222000b6a20a07390fb6a45a1e6000b8528702403c6153f60a01a8780df440050a7ca6ea02000284a884201000012422007a0ff2907f0a83f4140043b84014adc83908c1c40721401a0f4d76974d52a37c75838847241c7fc019e28cb818207a487a366f2a3f9ba08186e48cfe5c6907d4d6fe8281810bf03b0200ee7594ae66ad472f854e278b3e84c9eac80001f4a2ea87fca953460b942a825532e11609e5706099c1d19582d1b8e3b502e2baef463e30c18c7b6f2011296047af78b6cb3528c1469d23b1bc30c4c7bd59dccb68dd400a13abe1b53d3670672ec352c2a1598fd8204bf35cdaa3a007aa0c45019734a3d059ef8f0e8c98997228abc5ead01e961b9e5fa0620a79ffeea507581564fb20fcbb93d28340f086ccbcd9336ae4c1d971e23a4e3e8e360af2404369a01cc42efbde4000004b06b22753d02221b4d00e22ad6ef1b520723051296e2ca60895a28adf0a08fe2fc4e038153a14eea905d05fa957220540190db8edcedd73d9446a65100000000000000000fd0a1c514808b0080040008b294d15e60daadbd71224244b8859060e694ad355a71140bf294bb2ee1d9b335cb2d3d0d3604ee4d38c10570ba9e7a27f04a039eaaebe5e411af25c62d0e31ae1ff6026ba5b945bb1fd344d97875296a42537a14eea905d05fa957220540190db8edcedd73d9446a65100000000000000000fcdabf62c3ac0a6e79185030d02cca1861880c70c9008000000a609ce7f98ec8c9c7eaf06f7c263c45b14dd145ac695542a27e8e04891b1116d3e3ff61a26659fa1f8e7c2a4b145e1476860cf5fda2d540078d741fb9757a790f49eb861760c47c061a2c218b19682651b214da1a48b3e33c866b780efdc2003034ea8b4eac24781888d11049acbce13bdbfc59e407e87070c1503d54c6ebc544b3140bded49135b83b06daa84e548400865ae9b112f4982793c86f356bb0daf5a4bd9d9a9d2617f2612182cb3edd0ccc86f015b940ecc315c749e2ac202e8d4b6cc42971cc12e30c3331422f8c151c4424b22480268080014d080044d90f12d87e0ec3ec561f4230ef1187682fa14eea905d05fa957220540190db8edcedd73d9446a65100000000000000000fcdabf62c3ac0a844f9210b885da844f9210b885d978e25211e49d6478e25211e49d630e0ce04b008007006000123ca56015018b7ae3c2176626b2b590327a5cfa421fdb90002f8baf5e40e772d754b91dff6a37be338ff394fe6588489cb1e2ae9d7d3e7a0a909e7211e596a90400df47d8e0064096a623f69ccc5d6b7280f1a4a820a3c1fdebb9c260bff3c0b524ef1ea1a9a889e77c712908f24eb1bc712908f24eb24227c9085c42ecc227c9085c42ed070ad1456f85047f17e2701c0a9d0a775482e82fd4ab9102a00c86dc76e76eb9eca235328800000000000000007e6606386784504016630a6c590ff3891ed75a7548282008edf19d639092fdadf6030a3a801765b1025d3e1d7ec3e2f3b436cb5b1c5554ed20451265ce221fcb04a0fbdb49033c4a8e6f51941a966567b2afb82e55c01b76eb6f7ee2b181896e8a1b4af9b8804e318abd204e6fc06f7fda81b79c2e73fcbfe16698008fe63af366e42cc307ca391a64fdb8f518c2cb99374e2459ee3ee0ad14e108ee6eec68625e89de1b8b190e3c3be9d226d181fc247da608fbf69df25d6421733324900d83c09eddb5f407d066ba48a13b9dcca5d4baeaf80f68a4869ac227454e7c500756745dc4daf500ba62fc55f7e6a409575a049e471c3106e72adc478801b87d37eb332354774b69c708efaeac188a6245d6e60f7dae04f811c85c5598a5aacaa6cbcddff2f4825a6392e21251751624c2fcc855df1800617bb1f2936d1817a937993dfa61eccf781f0da9573d78cc21845905201022bda5e2be94319b1bc5a5d2d24af3801e7b397f52009da430df3040003309000dd621d6720ea2907c84839c240027ea43e1261ee6b0f61187a86e0400200880c0080203d0641e62200004c21e44305315d0e026bbdce28b6289cfe48080044584001000008f21e2530f01987784c3b8261da03b1c63051eb5505ae579274086264351eae77cf18473e5f8e00c229a6e4fab92a368151da87c77d3e25a14a3170351ffacff0a15e8c28c7b4f0a135de53e12ae3693dd1ea7964470fb6929afcea8a7be2fcf30ace18d35971923c89cd19281a745c7165a689f110ab3335f750a19d1170c080c90458b50a2c37ea63bc19532e5f10157f8b6cdd9b90387027b1c1cccc15950d11c8524872a68aaa4ab68e2427eb92015845455c88d900367d257b9fb45245efcfa578ba2fb89a7e6aa7affe79946b3bf84ae6ab5adc002e4853d86f66565e692815c2d0c3c15ec8549b2e5cb8a4099f42a76c66316fb3d2f3291c3ac1d522c3db726cd7a5560cc0ed1c790701cf83b2c4c43a97f570276a8ade5a98ac050b7fab192da32a03b007108571bab0e30fab33cc0a2ab53b08d81c498774ef0ff0f6c60243a72d7d2b85a8bef5be80000000000000000086d2011d915dfc6c814858e50448448040000204ae812660cafdef234af57099941898a3edd2aa5f6585e3502589ad754705c7d1a262e39ceea73ac9e7b1c50bb1935c01662fb8854a378c1a000790782201bb9ec9aff8ce9dd8371b28e9490a81423efcee7cf973212d146d724750b22e46ce0300074ec6cfa7c82c945d350cd9c9fa8210a8bfd03c91df323e0d726f15e9100a08a8e00cd327b653bdcd3a1afa9afa4d18fdabea9536f7c09537bf101a8094b2c932c56db8100)) <<< 16000) + 0x075e662d29b410384005c918bef5cea618f3d7da454b23a73437b7638668a94b911702aa9180e43005c7bb1c4ecc56bb00b31464b311dcac1867990cba4848c0e184c51b28fd1580569a1cb994f7c4fc291d4338de6a841a1031ac595682dbd10bfb7265a1e77800069221d6620ea210748c83a0541ce120013c821cc7a0e5290720a838c541c40a00161220072646464f65b15f082484dce264a3be9a53b986f047796948d43042088f4037d103aa1fda1b480bd53c439c6f124012c38502817160f8c78b52980182257775284ba697ed1df40380201330999c32f0c7367429e45f72e08739eddcf5a1c89e00020a1e5075741bce386bcb169e70881fa1c41de4e753085d44b09069c42794a153e084ee69da11cc018cdecd385b81c865c3417ad3218bde8dbbd66465e8cd800bbc541427c5d91946b85ee1d43ae5c7ba21a58d02216439a39019ac10affb6d4c0b49d8e9a217969194e76a6e0747fb0a0205bfbf28f5b860ad963122b392239cdaa3641a32579200001ce08023e5100bfd330128d37e72e9fdec9032481409c4191e2aea5d8510a398590b80000000000000000022a33d6f97a2c82816dc454e30bd383a7dea2fbf77ecb3aed20c00000000000000000000000000000000000000000000000000c64206182300280080a08a0208a070e18702b80aa1e3a43739b7638689b4a7d1de4f80e0fc795ebbaca0339e02db54137f5949a2d52cf42786fe493e1e879e058092005d556356e4f418d2e5faedc2d5d0af83d9a83e4f0c0dfa3a882b1eee38ac04c72de7ee0776d0fc02caf4f9301e9861427ddf46f0a67e0fc58cb16360a1dcf339699ffb3be84e677f8971ac7a90586ce89e035716d53e8003b9100c9da201e4306023744fc19d86ef07cea53d8a15c38541abc63e9cdb0efcc51923954c5085395302c7224350daae6a70330409436fa898f85a11c32d6ee1e0c18005dbbff6f1341d94d9c7b8e41a2008cb0a1cd682da1bfc846a5fa10044424113e5084294e97365ae0c8c433a8b116b7e17743b39c003a4e04aa47f05e3bd621f61be43eb072055be195f4e5576425a6446711c59e22ad1a7423ed2d03390d3ad0fe909042cff67a4de925f291f79860ac9f32177954c00648c57582a6388206282400300200002012f2661de486b5434ffff76b3fbe4be9f9924abf5dd78acfb6bff850960ef0d9fe57c2711a5ebae298c2b48ea0fe0bb3c46102ac34e6b9325a7714c969dc80fafabcae41de77bbd70abb02acf70712471a0599028a21409008808c000001246cca5a3f108c77abb3495046b2c23f09a5eda43517cac97519d598ef1ca092114d628961e6c8c932c5880e74bd9fba590b9420a8cbbb4aafcd0b225ebf8c132fde2bd50604830ba5659b6a4d78503eb8f9685e2f6b4ff85471d5f377332f40b1b0c29b539be83863f40cdb73baa27f0d854af82a5c03d8fdee02ca470cc23b6771973b024646208248c3113a921445e0a5c047c2cae9ea928911ee653bb3354169203b24044c74002467db5f0fa59e062608ef9341cab128c255ac69e13819d4398f324ad3516c016a8036053887c83a5860ad4ebc91e01c9fea61569c6d6dc3fce06a420f836448d67e36fa830bf1f2fa423861954771c284d5a4a4806001145b6d048060b1f3f400813101000400004e4870828001de486c8c8144340014ce4380c78d03712c33f738c2518fa19da357c4ff0a28ae970c799210000000000000000000000000000000000000000000000002fb48055218f3a066a0599420e20818c00800200024352e1ff92c7fee291a40c25ddd059b923a4d527fbd3ba6be8b4cf6f1880c1970c0814c988ee3e93383284e0561bf6aaa91e01a272f8c13a44d624f035686f80e872060f9348e343ce4a8d06143afaef9c3061db8fbdc1c20045174e040bff2e0094d005b2cd46c13841080428714aa30908e34a242db6c61432f8793a102d7b35dbc000019df30f04a10420100001063438d8007fb471a136f9bd63062496faff1c208324d29860c43ba7b3cb005b9ff5f04c0842010a1c780295b638cfd4d53e72c21463a0c08e10d1523278306de2de4ac08014fc36ed26042100800009890de0500014910dd1186e04f0618abc3bd1230d5b2e994616084c78742847994509f2c13710618a94005a5475500983084021831bfdb25d0918167b438c30b189f8ec4142307b8e539208c233ea8c0943084020000210436c241b40200028221b21a0d80d0288280020d086b96807c841141208905000665108835000d5610d63980a10c354270da68071156b778da9039182894b716530447429dd520ba0bf52ae440a80321b71db9dbae7b288d4ca200000000000000001fa6599806e8182114959079d43807c1ca2108add03228314000000000000000007edcf230a061a05a0a11008c008028828b889d0c7463bebc050266bbd6f0949928f6798c61eac6fae3f3692fec666c33e642a2f62e1ea1afe2176af3b50671eea9cc9a20866e982d27171c826f497a4ac0877dc459ee44298ad75f08ab43ae724f0ef84fe77e79a6b402804a5285bca62e0347b3e568ab8578c328a44160e5713968dd9aa32dcc548b1cc35bc080194b7743fbe8a2c0a1586d34039885df7bc800000960d644ea7a0449966601ba06084525641e750e01f07288422b740c8a0c5000000000000000001fb29dcc2a0df816638648228240020001725288364a084fe44cda5a70a990c27328c126e5afe6bc1607bae1e39800732e444651fe052a36ab84bd855b74debc527d3d026ca7198233f76fb1471)) <<< 16000) + 0xf033ed7e663b2e18f4105a91e4ddc330e3128d7a6eecc01129873991648039c1b2cf439e45590b78370b7276550fd6d42154715431c977f63fe95ceac6fc63a2d9bcad964896f969fbf080cb487c2298119fcc259c79d6e648c07afd083abd80060db259bcab85f5bde81ce55279c6372130233ed293c320f1c03f51ee22b6641f2af5619926550fcd1aa3b9533cb4eaeb18237cb0e0525c6327cb423ed35cf14be3cd39e544bad7b42501b3bbcab6b2f85932d20e8f7ae529549f5751bea7fbadc18b09e0be0da6094c8c53b1cdc1180000285b1069822304f85b34d204dde92d2c2be139ceae0a4dea5fa82d4d71cac5382447ff27ac0445a5267865e8266c0d2f5deffd06c69d50b542ba260858cdddb38fbcbac94aaf169212b15996fe2d202e0ef2ed9f05998d8f18d599969dfc8c6ca45b3f2ecb5d5c33c163e979efa35068db49e604d6020f977b6118cecb86325ab38f957df268b812db182e342ad0546014858b1c43d0378acf415633684b64f9ccdf7841161da78ba1c276325d36cc792000001f7e080c24c2daf41c8aa8c328311e393c7c2840e2d9d5045e6306056dea302e5040c0695f185794141002a7363e2e43c01d63fd9179580010c71640748a3b109002f038792056f9248ac29430475c225c6e430cad4e1588e2418284a66f9ba9386062228aacfb0812083adb6d2506620054f40e5c39a0600a13359370a000115d61731e5048912005c070000237219e0b0ce0586682c350061a6030ca01e9489fc06f5c302c7008f6665cb70e3dc1f90ad0fdcb145a7ef07d5f8686176686e735c2c235997b4a21e0e1034395496368900d665f598008000a4397f466ddfd24801681a2c7139740a0168e3f0ac3279b9cd189041d8f1506880c7835f2a43432cc04fcb8b14093def27a8c8b004f7bc56a7a38062ff8e5f2b00051fa2679edc392005205000020621900b0c70186900c3180724b557c0f71143c80000017bb00688264d4a2315c912045d50e2b80c20a667b2896010405cacfe45406860b6fb6e3eacc004689fa0b3482019a3ea054f4a21200560580d101c0b0000020f58028ade42f95ac7e3853661d854243285ecbd42008ce14528e85b798de381170060d874934021763446f570804019ca14f220000e7d0fef8eea8c4801601a38a1b47a2a7a4405153e3b1eb40bc102452334600b8d203a35c02f18f34285ae4df66068da28bb56e195c0bd8d0c05663222bda1c000732e7340c814028e6d6dc85971c112005e080000242200090474905d627b401c924908e6e4c7810d1c16eda88243c6880c99fbeed9e244a5a4f8c06d210200d5fa5ffc506102f60b62285830239bd1e40f8c3000e2a2921f07c922400b40d01a003e28463bc1d0e110a28ba0b54dd58b8a16e68c459785a0908093c34aceecc70879ff20b9e48860809221f471898e04354c5d40b780d003af181cd9ab00000f45b40addcac002400c0101c5099e627415ac9452623d13cd460142f9f4e2dd346e1a18e61cfc18ae81210a3346564adf0e10d38090562830c1061909fcfb059c003fc1be88aba8a00104af0b7c3e70c048018020000092c800258900070e3028290da40d0e469419f3f9c9d212c70842b63cb9e0e3aa63aa2431c0d0c7263679948e3843bacc51522610206590e0284c0414f2f93972d504001c5b84783ddab92005a0600c201060808254040004d8405034002120433834002ac47c9000000fbf0450c131f6358f3061414bcbea8928c2173705cef3e1041f81de72a3a48413a92d2c0f8f044a9f3b0a6e9e00450fb160ad0008a6d2349349d8c80158143cb0b6e68a244030dde5a4c3ed406140e95c021bb0c201cc61fd8221044a7f590c43a30611616b899a8b080e34f8ec1e06011259af230c000f7e49552d11e16400ac0b0000432433c1619c0b0cd0586600c32c0619403c2064162b3a598208fe2055aabfdc81c3857688a456206447458b8517861a4da6dc4c9d0344116183273ee0c0d6de9a66f1542805b7a6d86dbf000262444793f09eb292005c0788921213eba88fd10449c2a2c6552688e13e2db3f380922000000215340208424659a8999161020582fca3306001b8b63465f510001464b2079a60007d9d53aaf7afffa400b80d000046e78f3c7470c2211c6003f0b2f530e2091af45a9c0c0c0466cf5c84586092ae491a90c304b369238096105e929e4e0c2099709a3ebaa50217a4a98031e79002902006480800086086404c31c1618c03821e00b1865de291038399f0247182034403e6545fc1bd4608001782f97e33c410594d709d376c181808ef2f7bbcca1c3057216940812c18758feaa3234528b040d1ffaad50ad63015200660900c50186200e49cc2290df149230a5aa1d76d051424d6bf3d8c68818e7ee687a24409098b8b130824cae3b6f0b8d04296a8a2ae460016ce9b05480001c2c2010d4cca400a409018603a2a327fdab41861141d22b8e14597a88b2285103fea1c45159140a58e382000000960a044032d43c3000ee9c28d00001e26a976a40088021456f2b3c3dd2d1c3012aaac62c896300c05bd3c190c303d1004d56d1c28dc338c80a00a2d34fb3cb2b71a186e19cc065a1400e2e6f4e7d700003428b7711356a48016018000088c8001fe900063230301c5f9aa79e9f2c700cb8eb12c7c471e49298aec767b1c60c82992bca050c0c133e616f004a0c30bfd9c8f267cc40805bc952bf845082c334a4032847440027b1197dae2aea60c8019022030804182020c00100014f10140d0005d690bf0d00096c90017be20064)) <<< 16000) + 0xcc42f8a761db6a552cab1a5a292f279930d371b804eed65cdbfca84e40da02d8cb67c4bf0e0c545dde103b06e169703bab7402d408369d23cfac43b2f5545aa869f8ef1b8f0b542975d9771e0854ecc302195314cdd26edca797cd2f192fc41389ef25ba7494efdfa9bf65c2dd5863a1bbe1c1d6e61856f79fd4112b9dd3852c8cf742b3a7f9560b83701e0f78c97b0b39e4f017f44cdff6ef11bc80002f5066151a494b29a23fbecac228eb3b24a1b1865aee91e74804b62f64451507851704821528cf7e6611b9f55431615a9d1216f6daf1374a99fb7004d73a086f777fb6d2adf46707419ad75412b6642358a294a03fc6d1ec7b3ae036788f61e6ad8c91519fe4eded26bc70a01e042cc505eb3b756f7909d41a04838fd21899040df757615f385445a064c7d0848792b2f2226528cc792000002ea7c28611cdf9c0b60c31969cc07330614331da0a21c408518e5c90d81041ee218a4fc02087a5cec2b20f001b33d8226610101088069b1af480148123cb0661da15d51430023e67e20861a0817ce5a0078a028b8b4ed91850519c5a4a792201cb3117f786000dd75387521802b622e60fc000915e430b49476400a409000040a6451533fc703d1851599b4e8661701c319f0bd33c150e0807304027f5714210ce6089be787044a04c605fbd041e8ba2b7c6d38900289a7e0349e1400f5cc13d769e6169002e03803600800093085e84c25826118130950985e00c25007638573e80236c61c7fe5ef5835bd680c280bdc5c665071823919043af7182846644c75f901450310982ef0985866d998b5756b09008b1b684e908000415fe0428e999b3c9002f04040809ece73a2d5858e14fa40e8edc471ecacb4aac0da90283a0eadafffc302200423e28a785020badfec0a8d8b0089811c61d868e004e6d4b9d7a50005d7aafce4f9bbcf2400bc0f000048442ec17638aff9d83ddd1c7b2f97b0173a38c22feed5b130a142f09a082c21228e920f5fd442c340f576a57c448081eaf2ea9e850060003c694c80028aca78b7e1a8c9002b03005d00f083343f7562664113e745fa2dc4d1843cd169c7f923013e02af18f1c60506603585a5866db390f5058c046db38a8017900baee161fa790415559a3f706b83920056060c2058f87b89630d7c90512c343bb4af45077004c050c046c3da351a008e32c5598007c0200002464000d608002d110920981502c2e4078403a1527b272087555303fc858c09ae3299e8c1060d9f060d10234a5bf202c1441353978b00209699de55130b0443c09354c82089daaaae38d92004e038818328815586102593c9c858c2148367c209374d141c58234c2ea7a680098abf8b3001000400004a8d8e1583182f21c7add389d9c1428787b1cbccb0cb3b57606438729ab3eb680c3e00b9f71c1408bd587d4d4b0004d17e4e8180622b20a3ca240094060170030001f3216e0bc2042cbb3d610821960416afecb182c87cf33a0c101f8390f2608105f5e3c948851028322cf84041391368ef838b0419ce566a48104d12c9095268a400a008184069a600f658c12c5eca0882419c7fd1c68003732078c800440100000d9212003d243dd90ecfb0492bbf86951723070a4ed842781a284ae3faf8749144effca20a828b9381a42e7a34206f4b0ed3198083e0fb143a410456d45c68052c9002902469232b28f1930710cd0b1b8a2f794a4450e000df47b63200108040000354c8e0000009713069225231b76a58924f297a93de09c381510d1bdc8307086de226f9028b619fd06f25490417eb4391dc0a08395051b40b04106ad2855ef7a94801581434918e332b81838830761b451788a83c48700072602739000840200001aa4000c2480030c90009382028120b60500076b108c0d000cdb10020db216a0a002a7d200d0aa42d0b61665b01f298590cc2c4070da68071156b778d8de398d8e703e4e430444f60dcd0f813a37a80181fc8d75175a6010c4215c6eac38c3eaccf30289966601ba06084525641e750e01f07288422b740c8a0c5000000000000000001fb29dcc2a0df816a2842044803808081968b4b96be243810cec848765d35b7a432fe785d0423f3a7e2d4d667fdc094957dce2189ef5a6283c221943f6ca1fa8984c9602d7cc9b25d0d6bcecdd6d289d22445c650848c9e69f9a52ed0b4e51ca14803e01119a9667c89f2d7ec8bf2c1d8fa48e835a7600b2019a00000000000000000fea277c3b667acc7fb689b925e66a45d9b6c1ed9803ec0000000000000003a653b98541bf02f55ac80f2f5d3eb90de2b5ba5aeb374c1f41c4184203100000436dbdba4ddbdfe09b3a731c15d7b689cfa9334b3fb430c2d989fea87aacc040ffe716397c68fce4e6cf670119fe9dec44d798c4e72422d75353931f43169d105f44490283667349fe1bbcca943783673d41894754537b233f2c99fe50aa7c499a1e1bf0c348e78362996d1860bca8664e600fcd9341013060f00420636ca13d8a146a7a3443c1dd82322009860f0020000290c0300401016002000037213c0a08b0500012f109d1d84e08c0e01723041b8f488418626327b626050a0d7b6921f8c10046bee7460a203c12f111214306924a5610484000001998020a581e95dfd82083695a6e85c24009c061230428f59bd0c312ae0b16d14283228dd1a9820080177b40a2044de17bb0a182c325ea11210000006660414ae5ac809020838780a9f69002400c0000e910af0583600e0584a90d9f91c710547b8e430a148cd234c61042ee4377061dd00308c414209343787620400778879070)) <<< 16000) + 0x5470c09840208387884d6d200460188200069497dc81612a4367e438e1ce42faf230a142df57903082234db3301877689ad25228412a4334b4382a2446cf2e0820c92862eb9200480200001d4215c0b91cbf796fc319871c3628209d748b183b8f6b607a06145dbfb6fa590c0c452be526b0070da6bd00ad308404cf839b4553010691e351aa398b00262a425168a5db200580680ad01c0a00000159846940c8fead548b1821402c7ea1e288ef9d2c473c408c08357c868808205cc2d070d45c4df613861f6019580060002cb0e50d7e519042701c0000fa100044820010624258361181309f0984a84c2b00612803f30580238987678c1d67217d403450a5360b5d00a2f23ffd4ca78b10529b157a50488284a84d594241357cb47d8b1a00ead2a2cfac00107b6569ab076a410a4091e6012404261c348134b4be2b478c0afb682ea8517866e18093a41000001f314442148ce2eb6c7843911aebd08403a8930652b0004b448543fb3ac821380e00007ccf981ad48ccbf659202aec9078028b2b8d30997c5883ab3dbd8904888f76025ad07841bda5bc3a06820eacf58b906802c30c0fefe000c4de4994f0d5482140103cc02486914c0d202fe65c3c71458970f82e55208194914b7c442098b8343b0f084ac7ce1ba341019490a5204026a61f2f780006869817ead9e410980600003d24001004c8e1f2346ea8081caea2e4688050a912c3067f2e296e485113c9830682226c6fdc50004bda10084e184001000015b3640285a8564e30706308f0ab238fc063a0453871449f3817070e2102e4527041445d828072606861d817bebf0b0c62809520710002ac300904f12004e038a2264cd07c3078f4391ac71c5c40b522c3f99f392c20be52f9884415cbfe9d0100ef5ffb49c007802000028e64722343a3258c3313bc2c61b0c984b91a20f19740c282969c4b7808338099b3198107c02000024a42a8140d80a0004bd21242302a05d90163a519508510386da2b43e38fcc34d6ae0c38a5314c798ee389607f61bc8e288fa668fd71068429bbc4c5d840411bb9180b47000683983ddb809002802444b2d94a87651029ec9f50c1cef4d3498e1f39ec4ef2c001aa6cac080529316f66001f008000092181458054f2491cfd7f27f96316733a563c29883b7703053d777940e04c9de61433020f804000049885582c2a81615203f303a167efb1459a563fcd8c0800000222082091cb3b88f0420f499d634012a431cd8401595a06440006143fc830a01088021111568a28323fe540000000046f8b528100a069c48c31229a1861820a0060000401bc486c92eb853080944584e08336fc136234002297a600400630eeb8a50021008000081100022d3443304905460e65b4ea70e3f1778554104a0397f00a01be4991692840f00400003dc85404e460000008887981b9492278a2cba45eb707821367a6861a0095218c4a200b0b01be180030fc704e41384110042222ad1450647fca8000000008df16a5020148c3cc3481452044413c10000c04008034000450d11b6de6f93073afd87084165263c08e0612344f0280e01ffbe0250c1d00800007a10003a62001186405034001b5c429c2411612001c9c2005310400c81885314c2944702a193f021600b3f7a1d959412019d4509bfe3dc42ebd848e626bf056933605823368d4bd1d479b86bb6a41ef9c84240e45e9610a6a0febf27f7c988d43a8a014c31bc2a2d0c41803f0a0c7b6f98201629dd87119d0d6bb26ec7428bc7aa0a43ba83aae8f214127fbcad2740da034794079293fae23f2f378d8aa549058e0a87d533a1ce0c1c726307114c05200f3f2e75ce5a00be01119a9667c89f2d7ec8bf2c1d8fa48e835a7600b2019a00000000000000000fd32ccc03740c108a4ac83cea1c03e0e5108456e8191418a000000000000000003fa89df0ed99eb31feda26e49799a91766db07b6600fb0000000000000000eb48b8645435c0b524518208230062b677f110680feb00b2a0d0e7bdedb4301139c7a34e795088b1f6d498c271f0110a831dcad029db9100e0abd4f08616be6c960b7246b9cdadbebbc563021c3c760939f723cddc3b02fa5412d345f9e66fd447d938867ead86a46dbeebe89c0120d5c411945e2e0a5a7023891081d004051828268040000ec42644723153e69cc0417fd798fc1a0a4cd5ec31209f1a74f89802548499a84a10400109183b53443e786427f7ea118224f5f44684145fb90068d04348e18585820d0490e224118058b7784e1042010000160202c1a0150904c028000aec8510ae4622ffe851e05a41b8b4c01c6b473e4c10740110040100400001119185d508bce10509186c703412b2387801208c9d3935cc00a2d08cbe4a084201091883f401d1e18633c2d7241c5b4b25846083e0100000a420003864284341401b09f0904f04822c240006424274861382b09b05f08135e8da2070e0d45b84d4a408c12301a407676082accf77e75bc70259ac441759cb00000002c6f00c00a7b56d03dc000002385c101f41c40ac0b1028000008887880d115b441c321b478d09e1474c6f541000f4f6762a00000320894208402112c9804034e08e408ca93689656e1812600fb9e803a00440880e4d458e0000002dc6c004e205042d03c4050436d7aa5110c8627cab204023ad6088412f6c0a0ae4431d3ddde9d00c2bae2b0426042200800009c10002a12134020003f9213223b207ccbbed1c202a2f30634237360d52484086d0e3ce056890afc8a081a12142200cd3c3f6284e183e0100150504c00825c0400)) <<< 16000) + 0x03264258661182b0951184a00fc42218a827734416a198fba103148e1b857182eb91454753c138237ad490c11b88caaad380180b75c2a340333afb86642901848028c681b89619fb9c6128c7d0ced1abe27f8514574b863cc9080000000000000000000000000000000000000000000000017e8f495aba5a9a87ebfefbc273a00acc2a94f68dad2c01c00000000000000000000001010c3f62405e3cf1b864f45a244b1841441042034003800b8400803602a7f530602834676f7c43870164c3f900b04cff59848103e0100000d220008c6423c37e492d3e8583091589b39450613804028504c53aac81206ad8a04d4250c1f00804700824c04000250424856054138231354d92498c0d1c1e5681a0582470799cad020120ea15cb2b020e993f79d8d500370f7d22a207000000124f803e87042902840375823eac60f1b7513b442c1687688b06dba3fff900078020122020000df21200b89608af9f61b4481510b1c9b8826c0e308190c0c115f396e6800a90ab5ee2380000002ee00518209405112c14adaf8110a0850505100891447cdd00519ecaa70e04158c5de44045fad06cc2608200080000971000298211e13f240dfbf0f261212bdfc25246004ac8311e2829254c84e067ea11c2a083a96a449a24031a51aca284e204201008e050000bc90140d046828001cc884606822c34001e424005d1480129f9035310014ef108a0d0448480187dc844208033f68806ba310873984312c00c0565dd31407b805d731b82b2a47cb97a0d69d802c80668757e0485cedd24a00000000000000007b7e00fa211ee897d13b4f63dfbe22f8568217f482ee06ef3f5f803e8847ba25f44ed3d8f82f515ce71d2ee7474f998b2363098818c08a08808c00800808002877b00e9d381fa790249571e14c89cf483b61f1a42337207fc81dcae56622e5d502fd29ffcc87e08db90457ece974f743c3efe2fcc560b186b8c68cfa7de97d05cb8fed992e0ed0c9c776fc55519950cd45b7060746b1329915a94db3a37ca8529841e736ffd79ff20b56c0f5b20a9a60bde76400000004cee90a03b0820199438e20818e10e092000016b1bf6c3175047e026e0c58583908333055a9559bbcc275a7195c340f09fc4f1dc517620981ee84286f8a031fb5144881411ceee3889c3d29ae286054f6c30206f7e1a986385038c24fc00130c1000401f0441080207a010000b990832584112c204761001b07f05f10ba932be4206119fd7201c20d04e4140c0912ad8a605049e69ef92481bcd047b01c0044f3aa8000013921080401f8260fa139124f13fd30e27a66d70f103d321793638405f46e8860777c3ce50801ca8ca11400098807c0200f82a07b1103d0280005c883c9281e0440ee1a0003633441e0156351c2fce1b9871825b9989090819345ce12240add4efb20c078fdbf93080752f9317404000509d00800200002e840026fc83b20c1d5040e8630733103904c1c407434696606e05025178ae5a100aba4739fe3824650bae38a08185bfd0a80a002329c110042868052f59d4a04a911febd2013fd2abea4704b7a931200c10cf563e00a0045d9be541400135018890140046738220080000bf90703983796c1b8a60da2b06c1183586c1a8274407476b686b83bb68bd84c54786da70130c17e9cd985d470698836f2e69ffa03771b0380fad3c43d547256c83584a247bc8f608c004eb7e1fe406622d9163085ced22679f640037afea053dd55dd5de7b39e7b9a87ffba26a7e5f06fda464d7fea1f34194408c601a437a492c4c20b242370d0e8a6813635cb346006fca9b10200afdeb0a000094807c0210322d08684943809732042450a8fa09c080fad6e324002072d02f04a103e01089a020b296250c31ec808c507009f53166001f2ea91e48084001089a0b6f78ecd18b33d2e594300b73d69283932fc80248083e0100000d0200037e6c4f42461f2c1319e6fa2408380080560103400800027082f08c19c176301195b9a48b0213c7e8c133b3ac6e5806d132ea48003c0109160334899182b854a3d0b0442ce5d88c007802000013e4198160ca03b1340c31a4408338fefb1418642ccd90002efb97024081d00802b02800037880a068190240005a0413444000d7041549404e0200080520c65b0622183082e8a018a7ad93a4d6dfb871a252250ac2bab9c43086bf6e74a04d0fe25324bb6f0837dc5945da736a6c179a38f0c6cfa4d11b9510ac486f12c5a1d7070562a66c4eb642753aad4ad4db0e0bb3175799b650395688e78104233db3ee9561012528c87165b606937927c48d578e2b00618410768070ad6488e04e9b7c13aacdbdbb2aca1594881834d2993526b79dd6728fa1cde308c53bdaee509435ad711c6b0af40110062695b8fc60864fdb6a887d4717a800001503abb55e81d30673664d03a8bb8d37288bdacc6d3a755645ddb2b6f1ef1e839124f2b49e2639bbf1445164c9599b15d1d71c7531f7a77b5008549c5d7beb131c9cd75fd9eaf7e67e3a6f73ca38451d2c74cc8477b648941c2b434f22df80eaf5b21bab0f894d7e9c8e21b223c3d6e7e329cf6c403006e80d07949c8800e00228a747f6360f065595cef48007c0100000ea417c160bc0b05d0182e00c16c070583b7d5a0d00670c560c4003e010800008020000088d140334c5e81072bcf96f9800d37fa6d26083e0080000a336300342a9f8e008cc1baf0004ac26c6713042000402d0280002ec82c86c16037456585e3d1a0f2d393a522081d00802b80ec60257e962380526abd3c003fc78b4b0130c1f004000)) <<< 16000) + 0x0539056090000b110003ed3a0763d20852801b2a74b24007b9b77cc0008c707c0200001604154840a822027050003299053250290e81443400200a4140e609e530201582700ff905ab69b7febce94c20f39d1be5401e4cb3300dd03042292b20f3a8700f839442115ba0645062800000000000000000fdb9e46140c340b844f9210b885da844f9210b885d978e25211e49d6478e25211e49d630e10d0c604304d00600043bb8f49297c7cad1ac79ab4c7e7dc912b0520a92c5427862469860222ea69e53ab6daf28b903003dd50c04775352ace0ec09f09c1651bf33c1c300d474e8c25fcad068ff1591e678f911971a34da010b8a94a5a61784d008598845f0fdad62a72ded1756bf8f5d3d0a6fba870f9dd8ceef5fcbb4a4f2384d33703fabb4ad798920b8bea203089a02b4d80b916847869d26472c1e2194cdc409d54a713129f167891d0031fa37d0bbd1abd4c88e18a8303bc5e8b3adcf9a748000884c57d393869edc14071e9fece68fed4b24dedec5c9610b2b49ef7fb5aaf7209a4f65b373fc3bf8744e59a0b0a69fdb26ec40e72993584008bbee318c63fce200761be1ceff530717163644ba7792627d09b00e1188ffc8c85bde2ce6dc9fb649034380708fde0293df4e0d6c11a4e69efb3bf8040a710769a89f578df5fff003d3364800b02725f72d88a7ca3e03b1582c534b080bb6cd05b5b6752cfee130b06ce02de005e202e46f5fce6b124eda221afc37209900424f9faf214fc95d680a38f02d800040c209a2204c110004c9904b2d82510c100078382636c428e3012e997da21127505428e016ae1f4f040616e247604a1040010b1eaa9b37040b688d780c05f9224580031d6ffc82810380080000c4203e1388e2267ce4a60a037aa0088843401c00e5823ec319663805dc5569810169d46d7004c1840010b1c04193a11a303a2624028607610b2a2057835231cb006371175012860f80400003f880012490491582404ec71c0208ec7111e3935a1c0b05fb96c8c107802111c0b90d177d663f713dd2689dcf0433d5863ff07200e9d88e28a4d04028534dc3a8f52b15cf5c238202d0aee2e2c0b457b726316ea80e51445f4880e8517052854a94cd29a528137e8b2023008200009cc82384c07c1608c0b88e6cc12facb0503ebe1d0e0494206654230c1f00802280ec10ef30e1a24105b9353e1800e759312080e36ce4c1409040800200001b240006c882206800154081e06e064a66c78765c060fff1f259251c9207587020f7cd3e3b050f1e6fe6263a63b689086d467de6cc7ef16e8384373e3ac27af0e97e1f5e5dca406191b741a7e17b7c061180b407cfc356fe7d6d92eb00eb2ec0f791d0ba5a1e990b429cc9b006cad77e2c0e2c5353b63d75f5742695212859e0628db5f8f40867bd1d29b273d7e438de04000a3fb4f3e1a88724168b40a0e9315f5892f243e564e5316cb93c4cd53c1dc4ce097ba14953ad35dcabc07d47f5bb43f44018d63d10189516e4e68a6d1093ecde0000c4a7841171dba030af1880f024175e6201c3062cd1e470024141e00801d82e222ad1450647fca8000000008df16a50208842b8dd587187d599e605201e9c0f84140b844f9210b885da844f9210b885d978e25211e49d6478e25211e49d630e2fc01f4423dd12fa2769ec7bf7c45f0ad042fe905dc0dde7ebf007d108f744be89da7b1f05ea2b9ce3a5dce8e9f331646c6150c22412012c000852a8c8d29bbb0cc9d25307c3833aee158ce53d7dedeed472d23f38e93dfbfe84d12939d71360939aa95eb6c71bad991a4b19b30edf4378c813ca1b4f58bc515becc4378eac939c93686cba70a670516d32583cfdc66d2bd818bc7945dae80dbe0672f3193a1cb00cf1dfae83370cfd00074a2086220390902102800223081b8a81045406c0a0019293111568a28323fe540000000046f8b528104ac6ee1334cbd3f56730c02b108571bab0e30fab33cc0a4227c9085c42ed4227c9085c42ecbc712908f24eb23c712908f24eb187082043822022801008108670bbbdfec0ce3fdca03c6cba04eed476d038095e55b215235e49e8fdd1ac3ab93b201e8f2710bdbcfd3c795c157a190a2785140b62b1bf84dc25e457779245db63a948a1ed410007032cfa01e79629dc4a8d7962037308021200df7c2170c0147547a1020756a23a904c10400108182c29e7d8b141e3a57088162b5df5f03051a1100e4801dd42b3bc2508200080000809e2987398731420702fab98e24153632a0810e9647730602bc9b7ca04a104001003f0100008a903e1181e84c0f0278464465c182430c495b2418329d22baa24225d34c330c11c87b20b2c09aee24262005b0ee496001271c200080000b11c21ff424ab9c188f889c88c1c7a565e69208e5f64240c0ad97790b212861000400ec0763007594048c2438f742b1c1914d365092091d031a40c0b1a5a34c96015453c549001cb8f2e8004e204001000015d20741a0390501c028000b3881b8880d81400109040d4b406832033150006b11032410189880c03405e1200369a204a920052f13228aa9f8ee1d6973d0b20408aa736e2d73d0bedb08e06796ba9e7eb55705058c01c8a3d3a1c9db979690a01493dc7e6c04e8fa6ba8053686492ae6bca20922ba672e1e1b0c5683050085d9a995c3b75661d958f22d9189c534480a462386ace21a05986e12b588981600000000000000000968330ae3531906a8abc34b13f4781f0fd8956b6d0cb2298d45e2299220e21410610e006020801b50b06cda00e7f83c6a9c17cd098de043b8657107a)) <<< 16000) + 0xb0b7c6a230aca11973a25690cfedac5bacb114ea51c8463145f943748d26d71da382464442ee08244fc0c2c1010802dd3f2c0586c66130942080021c230245dcc20b484094d09040f00200001dce05a7c4ff2501642262b08034c054c031860e804000028481706f48ce3d43bf6a69b6328f7761312be08167b66f1560e1ee0536e55bd1cb13a1b7a09f3d71761072f68461c750e6d8a842020c0b0a5b54d24b7973d993811c4b330e82ea6cb9a07df3f17b573246c3f202a1eb30dacea80d6e07814d4f1a8b040b0177aafe5477e4c485358c62aafa0cf04d45cc7faeeebe3f426c3c1b454b13cc87b7ec46d702b98c069ffae251a2d500538713674b6d5b9723c1f6ba4752cce095e27bc392212d489dac647c7493c3a5baae94433329d1bd7fe7d9f51ff888c2e3300bbbb794a7aa12b5b612bffd7323c9a4bbb21b8218e2b7af890a88c6cb778e500c980795b48ee184b9aaa20100200800002234055708ca0e06b942d08403650767831860e004000027c8138480021d08168cc0b04605613a040cbf8d6238211defcb714012b6f4d30006480ab5600009070840218218af32e8c0034976b0181ce3a9e3211860f00400a80740c64b1da10024d368a2001b00840000401000004440a4176159ba6d3058218d87978e08d7947783801aaab140c0024c694c4a083c0108031667f6e40003807e791020e80400001d88000c3101f0500013b1d285f9ac46c8b4e6e2c686da1245c602a3c6e82949878458faa193ec99d6f42d88d5e10393ebf6e5c474809e6a2d2c79a161bdb49280097aed68f769e0a2f55f825a2acdd49b0c4fe9642d2134475a3b63008f8bcc41f59a028e753296d65e5e944aa930b63df61efac4868fc8d360397981d232563ae949a0f21cbd240cf50097fc6a2f42e047d74b9d6e81e33c0aad3b96e1b390d77e39c0b642026a6c8f37d53eb320a4bf914915996edbcd3008003ed407a0bd5bce20dc3a2d02f120abab3f4e7c35da6c47b343e79115ac42334bd80280d00034e90270900050b10260d0005949001676204a5202419000d121023390111a8084a40404b01f1900f068074240380a01b05000eed1007451201099878158a843c2cbb952cf48cc6bbcbdc4dc54b0013c7a5be05700000000000000000000000000000000000000000000000000c42304302282202180100a28fbd30205a2ad9d0bd10e9e5196673a708add52be42889014e31b102d5e104f18ed68c11b0c104764b923a92d3e6ae78480a7f837c8dee2869e0fc86344ecf2a2a44724ccce2e2f2450f1b93e7b712d43e19c99e2f6898c3accdb84ab2c0ba2e3057484a3974508651e74da020b0106e69c140166742e4020010da6807030048bf0143288209396118042a277c3b667acc7fb689b925e66a45d9b6c1ed9803ec0000000000000003a319b848bff22d0ef9a1fc9bbd0d30226deebba0ebb2bd4d6000000000000000000000000000000000000000000000000180871470c2083046005015046a68b944e1927b466caa0f5fb96daf8f59568f5b6e567272ef6db56924e5e27e548add7f6cd1899ab3ae252ff6660b189a5cd06e33d5afd302383ffb259e82a21ceb7a8d974e611e017ba639fbc6b12a324f6a277c3b667acc7fb689b925e66a45d9b6c1ed9803ec0000000000000003a9331a81ba267bf5016f760000000070cab339bde646a653b12c55cbd460309ec981aa21c965aaea200000000000000000000000000000000000000000000000000632bbec0ae22fbf7f9983a71e1506403998e722cf4c71be0000000000000000000000000000000000000000000001690818810408700600100a8e008036c901da809d860e651eade20b1fe9c3e67c0e0000009aca04003b49b4b32801180430907914b079a5926aab31af2cc1c0bdcd9e7198302f72bee0208240dffa64c4581541ec31af4500000000fa051c009c050000312707328ff38f458ffffd67dc89040000c14f8e000000a56e080000072ecb280118043090ce2ebcdd1d964a9aadf686d48c1c2adbeac0e6c104f88f74a82502c0f44a34015dd8a000000030d4001001c92708f963f41c00b40b00003724000b8080d04c064260301301701e0e651eef004b1fffff718198107cbb32212420000273161820000c14f4700000052b733021180430905d8c14bd259270eacee4e4c1c12befee23841157a6aa316181095f6bd0945814ddf25e53ca00000002ee014704270140000c590160980a82f09000005e489938e31c58f0f440a52d38b365a7a1d932787b920168fdbc7cba112cac002c900001363de5e60860694d30f69907c9e322e2d5afe954cfb32e44475b7523ff3b5900307209d8c67ca73c676f90962b60c0de36558c07b2059b9b553d6c420eaf73b5b865fe002c7a5247e9848781c013c9442a0ca2dd8b5d4ea6936515a7062942cb5b66e0d139af0f001c000000d56eebf5b88dd066889a1cc0700458999b831ab3beace7ef03711373b9ca3200004ecdaaed0c94ee62c375d34a9bfd2ef313b32c076ef7ab98b1589d03c13f9cad38f6a524766660a380b0d3810c4bec6d82b4f83c55fe53de82e1631a4e3b5780142450f218485e98298590cb254d56fb436a460e1bcd5d0f31e082655df752d6e1607b979a151230a0000000493e001001288d442ea10fa0e105a0580001bd2028120009b620260a000cf3200261a404834003042404494003b724007d4c8081a803cc401c5a00d290060e802c640142a0091100406801c2400c12005010020080094e08018c800844002020000100d0d19)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 33 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase0" = "QuadFullEightCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 33 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase0 private def zz2279:"s08e7"="s08e7":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l5 l51 l54 l55 l58 l6 l60 l62 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x224a246d8, -0x22cc3e870, -0x34325df4e,0x2b8f38b2], ![-0x22cc3e870, -0x7c32aa016,0x67d40d62,0x25c96c134], ![-0x34325df4e,0x67d40d62, -0xe22f98578,0x22cc3f1d0], ![0x2b8f38b2,0x25c96c134,0x22cc3f1d0, -0x11661f690]] noncomputable def hinges:Hinges:=[(-0x6080b4,l6),(-0x1b3672fc,l5),(0xdb9ca96e,l4),(-0x7e23ac7b,l8),(-0x55185f2,l11),(0x280b6918,l10),(0x20bed7a26,l14),(0x600e5bd8,l13),(-0x3751d142,l17),(0x2fa7be40c,l15),(0x169223e6,l21),(-0x600e5bd8,l20),(-0x13435adf,l23),(0x110ec745a,l22),(-0x11661f690,l27),(-0x169223e6,l28),(0x11661f690,l29),(-0x20bed7a26,l25),(0x89a5cd96,l30),(0x11661f690,l33),(-0x280b6918,l38),(-0x11661f690,l35),(0x7e23ac7b,l36),(0x11661f690,l37),(-0xdb9ca96e,l34),(-0x89a5cd96,l43),(-0x110ec745a,l42),(-0x2fa7be40c,l41),(-0x10ba7f12,l46),(0x9902e062,l45),(0x11661f690,l51),(0x55185f2,l55),(0x1b3672fc,l54),(-0x9902e062,l58),(0x6080b4,l60),(0x13435adf,l63),(0x3751d142,l62),(0x10ba7f12,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x11661f690,l27),(0x11661f690,l29),(0x11661f690,l33),(-0x11661f690,l35),(0x11661f690,l37),(0x11661f690,l51),(0x20bed7a26,l14),(-0x20bed7a26,l25),(0x2fa7be40c,l15),(-0x2fa7be40c,l41),(0x110ec745a,l22),(-0x110ec745a,l42),(0x89a5cd96,l30),(-0x89a5cd96,l43),(0x9902e062,l45),(-0x9902e062,l58),(-0x7e23ac7b,l8),(0x7e23ac7b,l36),(-0x3751d142,l17),(0x3751d142,l62),(0xdb9ca96e,l4),(-0xdb9ca96e,l34),(0x600e5bd8,l13),(-0x600e5bd8,l20),(0x280b6918,l10),(-0x280b6918,l38),(0x169223e6,l21),(-0x169223e6,l28),(-0x13435adf,l23),(0x13435adf,l63),(-0x10ba7f12,l46),(0x10ba7f12,l64),(-0x1b3672fc,l5),(0x1b3672fc,l54),(-0x55185f2,l11),(0x55185f2,l55),(-0x6080b4,l6),(0x6080b4,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x622204811200600000004219022300c00000000090e06600800000001106038c0200000000000181900200000943214034400c0000000000300a4010000611481101a500400000000002a0390040000000000e805200800000000003a06400800002824840930c050000000003c58198020000000000380d20080000000c45206c6018000000f09060290020000056210c80f2006000000002814053008000000005828146010000430a011014d0040000001582e043180800000003209024300c00000000000e064008000000c4110230c040000000150600998060000000000240920080000004a08810c602000000000a0502cc020000004632220520040000008614c07830100000000008a0144018000000000210388020000000000460310040000000000840620080000000001500a40100000000000540c8010000000000028190020001443607009740100000000000501a401000000000003c0c8010000000036120498040000000068340630080000000cc2605e60180000001884409cc030000000230a80518060000004908403230100000000098580c60100004d08c1200c9004028814208800c6a00c000000004c240630080a10520210019a80300000000001301480200009a1082401920080001582405809d40100002a04e0a00da8020000520a81200f50040000b81403802ea00800000000026009200c00000000001206400800000001109018c0200000000001c02900400000000442c06300800000000038012401800000000012014802,0x62290a01a200600000006229034300c0000000110300e60100000000000e01c8020000006084e0251808000000c30840ca30100000000108380e6010000000001a1c0cc010000006185a0161808000000005c340a30080000000000500e401000000001713028c02051248c10c0330200c00000e4440e03f400c0000000000280c4010000721101501f90040000000005c78198020000000621a037300c000000104460466018000c22443102a500400000000521c0718040000000000a40e20080004e1060a80dc8020000000000090188020000003a1a120720040000000c20b026300c0000000000881a4010000a118c2601250040000000004448198020000000a233023300c00000000001a0640080000000001201c80200000000001e0290040000000000680d2008000001c21b80946020000003842800ccc040000007186206518080000000044140a300800000000e8c8166010000000248ac08cc030000000000058190020000000000580d20080000001443206a60182c92860860198100600000000003a03900400000009239024300c000408e20b00d8802000000001205014c020000096421281320060000000a20a01e300c00000148e8281c801000000003b1a038c0200000000002a0690040000000054240d3008000618840901b880200000000110502cc0200000000421603980400000000a4440a300818496306300cc080300000000002101c8020000000512081218060000000000640620080000000090681c601000000000011038802,0x88190020000000000740e20080000000128a81260100009615841026900400000000054181980206c050437c061c40180000108641c06880180000361486c07d00300000000341a07180400000a43409022400c0000000000c81240100000000000903880200000000120c0318040000000000680520080000000068301c601000000008824088c030000621202606620080001f03c08407840100001e0420d01388020000000841400f0c040000e81a04203c20080000f02105003c401000000004414018601800000002d0a038c0200000000005a0710040001c433060045401000002d0842404680180000540c82806900300000000320a051804000000a834180e400800000000d0880c6010000000249040d8c0300000062421e02a004000000000c9103300400000000110e0660080000000210f014c020000000391101b98060002206d1440a8401000000013052034601800000002615038c0200000000004a0490040000000000540e20080000000001300a401000000001307018c0200000000003c02900400000000001c0520080000208842402a80180000000001701880200014631884014a008000000a12440c63010000488c41100f0802000000001915028c0200000000000b81900200000000a464093008000540d02980f480200000000001101880200000000001a0710040002986614409a40100000000088300c601000000014848070c030000002884403c180800000000002c05200800069142288152802001862c820c0fcd005,0x160a0398040048c810a5011240140000004c0a003260200004608c19011100400000000240e029804000284910d804840100004a91a13019880200000000001e03480200000006408805180600000000c824063008000000014928146010000000001b402880300000000006a0710040000000000dc0620080000000001a80c401000000002f0b028c020028c404308149200a00000000881c053008000000016858146010014320418806c90050000000410c80b18060000000000f805200800000000003e06400f06342820c09ecd007000000000011819002120ce0cd08095840180000000169481460100000000003601480200000000000d819002004887502a022d40140000000000320640080000000013402880300000000004e031004000148430c807a40100000000e43204e601800c608c0ac03c9005000000004a0c07180405904042dc072040180000000001281c4010000002515070390020000a82084e02420080000000882101a300c00000108983012801000000002211038c020000088230501520060000000000840920080000000098301c60100000000002201480200000044260c0320040000108460a02a400c000000000906066008000002448301a0c040000003a1c0a05200400000000a42c0730080000001442604c601800e908408c0c2900500000000522e039804000000b128c068301000000018c4a02c601800000031884098c030000000490980a1806000000b458340a4008000001221180d0602001690c61080c29005,0x6207100400000004a1400a300c0000000000980c40100000000110a018c0200000007113011980600000004c0a01d300c00000008c1204a601800000019864070c0300000000006a04900400000004416019300c0000000148500a60100000000000a01480200000001307006180600000000002c0620080000000130280a6010000000000f402880300008215026023200800000009a0900a300c0000000128280c60100000210882c08d003000000004e0a03180400000000007c0620080000000000481a401000000012074078c030000000210d00f180600000000005c05200800818e307c02ac8028000a224c8202f10040000001c8220219808000000004c1c053008000410980c806e802028924608301f8d006000000001c0a0318040000000084280e300800000000c8301a6010000520e013015900400000005404805180600000000481c0e30080000000150280c60100000015c4b01b0c040000002888a0361808000000000013032004000000720a804c6020000000e4110118c04000000001e0a039804000000005c1c0530080000000681203860180000000250e038c0200000000520e05180400000918c401b2301400000000e8481460100000000001901c80200000000001a06900400000000c4540a30080000001845604c601800000344510258c040000072330501a20060000000094180630080000001241803c601800000001916018c0200000000002a0310040048c8183e01564014000591464901788020000962105101e5004,0x411501b98060000000821a037300c0000000150a81c60100000000002902480200000000643a0718040000000000c40920080000000001900a4010000077290ac07500300000e4521580ea00600001c4ac2c025400c0000248a82a028801800001a0b0240710030001d0518a4012a00800000000bc6809300800002610c3403480180000020c2202d0c040000004c461c0720040000130861a02a400c00000129107012801000000021848070c0300000000003a0310040000000821200c300c0000000118701c60100000026210d0150020000000410901618060000128861a02a400c0000000c4140386018000001841201e0c04000000001e0e0518040000000034180630080000238a422026801800000001509024c0200000882908809a0060000008454240b4008000000821100f06020000000002e140cc0100000823108817a00600000000068b0330040000001443604c601800000001512014c0200000001624381a002000000544c34074008000000000706066008000000070a0c0d00100000000120a069804000000000034062008000000004838146010000000000050248020000004402200998080000000008830330040000001141201660180000420c84408900300000000440a0398040000000084180b30080000000642204460180000000d844050c030000000000360290040000000006500a200c0000000001980c40100000000003101880200000003b048169806000000430980ab30100000000098681460100000001087006cc03,0x1263602a0372008005207084b026d401400001231c603a0602800002861440248c05000000508520371808000000a12440a8301000000001a8380e601000000000f09028c020000082220701fa0060002084405407e40100000016250815060202c4243203028590060000000005c381980200000000581807300800000108f03814801000000001d07028c020000000290c80a18060002306111c0c840100000148841c024801800000001511028c0200000000220e0298040000000721a037300c0000000170c81c60100000000001903880200000000005a0490040000000000b8052008000819843180da802000000039884098c0300000504718135180a000000005c1c0630080000348641402a8018000c42042402f9004000000003a0a05180400000000a4180e300800608630a0021280280000522482808d003000000004c22071804000184440540e64010000298681200f48020000510cc2302690040000000290500e1806000000006428063008000000a20900f060200000000321f024c0200016c3b8d60352008000016c723301d400c00000000e8c8146010000b81c46d022900400000b4390a80a2006000000742c1406400800002d0f06e02a80180000010c2202d0c040001083083c02b20080000000461201c300c000000084240186018000000108480b0c0300000000420e0518040000000621a01c300c000000c21900f06020000000389a40d8c030000000732080e98060000000b251036300c0000000129081460100000000312d028c02,0x1a04a01c98080000000003500b200c0000000000c81640100000000068004c80400000003312805180600000069104032301000000000d8980c60100000001609c04cc030000000036220318040000005212001330100000000000b00a40100000001608404cc03000000002c240398040000000002c009200c0000000006c0124018000001a8110050c040000000320580e180600000006c0900c300c0000000dc22016601800000019024030c0300000340208013180a0000000064240730080000000d02201c601800003025840930c050000000005458198020000007114805830100000000000901a40100000411e8500d10030000003a360c05200400000004211014300c00000000c8b00a601000000001917028c020000c22c026029a0080000006716c08630100000004609815c602000000084110238c04000000034168099806000000000054092008000000c22a810c60200000000191602cc02000000006a2205180400000b192301d0301400000000a8681a6010014310811008c90050000000022120598040000000038140530080000250cc3a04c80182831c204d010890060029a38c158188a00a000000000094062008000789c23301188020000028640c0740c0500000060872037180800000a4420c012400c000001825881506020000002c42301a0c040001c22982c024a0080000000e22b023300c00a21031c603a48028283202055012990060000084270881b20060a3072025c08da4018000518e414819a80202861c408502569006,0x721b08811a0060000000562101c300c0000001c45c04660180000000f048074c0300000001b08812980600000000e4240a300800520630a4030e80280000000d058064c03000000004a1402980400000000ac2c0a30080000000148581460100000000003d0388020000000130580a180600000818e301d0301400000004c120286018000031148480d90030000064230d01620060030842862017040140000000843202c60180000000150d02cc0200000004920813180600000000088b03300400000000e8900a60100000000f12140d0010000003a261203a00400000000b4380e300800000001a8901c601000000000907014c020000003c2a1202a0040000000054140a3008000000078b0a068008000000000050348020000000210c80a18060001f86114404640100003c0c228808c80200007a14413009100400000000003a04900400000e86229026400c00001f0a416028801800000001507028c020000c21882605da0080028c3b043028b40140000000000681240100000001282402cc0300000000221e0298040000004804401630100000009c08802c60200000250982402d0030000000000f004900600000c83209022400c000024908720488018000018620c0740c050000000311481118060000000088340e30080000063050045460280000000c824094c030000001882c04d1808003c82282d018c40140003b04a0e81988020000000001301e08040000000002e01c1008000000000440582010000000000a80304020000000000dc04c803,0x386608b18145a00a000000000385033004000000064280366018000460cc190111004002b04941901faa00a0000000f209034300c16514785b00fc080302c228309e0138100600000000722c0718040000000000e40e20080000000a422028601800002a20880098c0500000000560c031804000000ab04801630100000000148300c60100000002a828038c030000e230864024200800000000a8180730081e19c1181814b8803000001c430408acc050000003288605d18080000006510407a3010000000164a204c60180000000883006cc0300000000521a0518040000009448240a40080000004c08809260200000000d044070c03000000002e0a06980400000a192301d030140000004209012c60200000002e064028c03000000005c1a0318052188120e600fc6401c0000015611002860200000002a858070c030000000570900618060000000005500a200c0000001442c038601800000029848030c030000000052140318040000000000ac062008000498f83181568020000000408a40d0c030000001482402b18080002083808c0564010000000520a002c60200000000160b038c020001442603201ba008000009190301d030140000000001680c4014061c4839803f190070000038c6180e8180a00000009a1a00a300c0000001243c03460180000000270e018c02000000004a1c0318040041c690a70293401400808c814202e6802800000231d1502500200000000462a04980400000000b41c0630080000000150680a60100000000290d018c02,0x1180520082019e11a1814b8803000000000049038802000000000032069004110d008e0c0a5c4018183963941812c8803000000002e07014c020000000612c81318060000000b221016300c00000150b0301e801000000003911028c02], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((0xe28afc071f08235a17a1c382b4e526de4842eba780cd0036646d30002444d164098207c021c50ad16c283870f289bd070582b23614d080225cb3000070736da094207c0200001f840a427a48328823c3471c6e59d21861c278200d070a7d2bb812060f80403a4040001d04a28461ce0b03b05c460592153c9110073b5df54421fa82593d1023f1c142264042200851419244a343042099fc70082b68ff6cb1e0041a2c2149010840200001ac4a241734cf131c8dd24200007245f483f002f9e7a9842873db4192082b8e796b240c7296c75508000000a286ce08460109a21e6b23dcb251400001c445480e0413b30a8a38fabc0438334482000002bf20382309b26b7ce4800ab9c0594038022f7267a2a0001cca35ef3d2d20050040a2800002ed12b280e034c4a0c8ed1c7a53f8b03187a010398afc9b5089040000048c8d038229ee664f54b4400b07a9c8a87820007b515fc4780005b63249aeb7f0f2005a06000022c2000886648021749bd861b24128118984b87a88aa441000c9b66980857e430d41051034f368100000059f39c008402124800006c8b8c3677a8ae1a0c2866b4f0f32008250c44c19a081646cf990209e8b14caea400590e36b7900000000a8c0c00b317d9b7cc8012008000074c944028000d808004a310290994380e27ea711428a29e42406221c41966b9e13b0a9c992020e0040a18173441a07267e38ffaea10804c4515862ac1a20b25b96e54095943196460203c1de1298008402134411d98e7ec0071e8b8dba70c01414322b5d4a0e1311554bcaed73cd1066ee3374f04c0411d98a370c160000000927c0140063122e34363e84001601600007accd103d1f9decc1c0d11cc591c782f183819310e15e3e5350227940c6d4d0418ef960f980088021b5450d4000000034f0808992df7a580f8a689838e3a82a621a0ac028060000401a00021040009648002d518870a2cac9a60803d470010) <<< 16000) + 0x3526499fa46103c010e523a1a0000000646506deb7b6be01d12851451434422c24c15004800c040080340004188000e290ea110748480022a093f888005114e101fa636b8c1524747221c0921c62c1300a49ae29012040f804201002008000022250a1a27e0d942048a0c244fa13282050000c612810d89f86fa1d8ff35281612775037afe38a0233eae0a91841c11010411801601400e02180c0100694002c0ec1713c2aca7eae80a00608ee22c50a80fa450a2d16f8cbd09010840212400f45c7553060a730379861a9e1df6842c302964816130498516e5294008802124b4cf6505d1888c2ca2d72f66143256e52eb4b861c2d5404b7703082f17f19b861040000239dc64800aac41dd4e100000000dd7c0300478304a85b7a90029024000103100032933f131ad000000003b4393626325f6bb8402508208884482182780700dbb37af316a087bec3d846bb93ca096ccdf7887d7085b10a8000d1189e5fdc5d41114c6e974b0a2c29dec1e2c21e9634aa48083e01092011e5758630dbf5a2cac988d1c2bdf060654bfd7729829e70f5b728010004249076aa11b3a491000003e40c99e13d6865ea121a5577e86d392189303a61040c323543995881040000145a29300382eb05da040000000fd20da4009c0600003e24000c28cc969dc84c969dc6a3e5c5d9d0a28b807d5a9da9275a80b1760f33646102c9f898d6800000001da1c9b13192fb5dc20444f2c51454013c1a5018e30df4c19bb00fd9bb1443a47a719f5ea919995035cb5e9301f6d38b67196a5a40d357d4883d9504ad266c903ae2a70e30d84391f4110816a9f50a01039a10b4541194e8bf4080300b003e6001f0084ce453808ec249345620c2243aa8699472034441dfaa44200000dc224255a069cd0c2780b40260829860a1d61c0000024e4a4008002000035c4000bb48003161000a3c24fe1a00104524c413c204adbe68c68424b63dce202181fd3c98416de1a5ba90004db6b94660049125a320098408402101238f5d9f420a897c59b00110810804000020c93f0ac9f4460003fe45188427e3a145190a20480050a0f182fbcf7ac70a5c3d79624070733d66a3863138173a105c13d2d847824b7a69984c0840010f346caece18912c80df53c30dbd5b7ab1009423a8e412040b77285c10014ac00c66002000870ca3c01ff6568c3403b43a640c708b89adb790b0c243f06a522b028803e3a67cda181a64b1e5c80c1849a8f8e8c7b0a00536b16e952180677b9a2c1bc5c4801501800008448001aa92780161048f15ce920350c6b99404155a4a5919000a3e0fe206003577be5194008402101ecf4f3fc105c656f284800780100000e849f0161f60b0001bb24f61a0f80993d04fcd000525b0091082adf89420407ad902f490c355eaf060c38c09c6b19008619e971026042200840e0d9a5629942abc5e88d8a10320f75202098bcdefa644328fd3a6b020016bad6aa6002100879408baa2285101860f68b6b1a6284548155c13c5045d4e1cc830a4d94d06920f10af86d4c6206129848204a8082dabc6194181002c5f3281b28a4009c0800003e44000cf4f9a0caa33289e30346ff65a708036964ef9220e43f52b640803bd3df89219252d51121870f56e5b72010a1b5e60850084401081c1e8aabd12854b8ab40f9421c4b499cc41382445568886635398854c105b7b70802001cbd3e527002100844c26ef8504c3c60000029463c500000285c2053ebab4a991c50dee06f70284a619264441442a378d2fa104f259e9b4e2823b9f18fb294801200a00007548001a690004fb24f2122620593c00b08153646b5901a8d43e44c8091e7b3dd81052bd4f57c40041e01afd98008e686cd83001d5711d6884e284201080d59d864be9f2bea3ccac2ab2cb37a693d0a9f7d45fc3a7f619db9aff6c3a5ef1dc80a35d9092f5336f05546983ef3f881710b80726ffb324aa5c0397edd3034db8d3ac20b561a00fd38ee535cf56340b086ec1000111015978a562de9e86329ae4ecdb9889050256c02e4686770cf5d2a267d451576aec05514df345723edd873817fb37d5a60ca4579afb31da80f361e4525ba6125d8fa0eda86ecb525432c054878718a821ca000150880036190010c224ee4201b1d02b8c89d8544ea1a00180b21c63bc32c8d9a21a3036b8f3cf7c30d6a9fc1203021a8bbdde8a08000011d60c21a1d5b798d04cfa81ac4040000006ba00006fdbfd48a40088021867bf96c47ae0c0e4c963e262050600000b496c0c372bc80d1d81a0a0da292a240c0040c93e9bf2500000002c6040c01608c3cb8e040094d79b60c6892005204800020524bc0a23201c0300401000004449d0444e61a1910d1390680a4344b41a271051380289bc144dc02256010002969e288996fbf44791c815746013beb04c23041e00871429894e8223cc60f2f238e099a2578a125bc011e20201ec0f695041e00400007a126d05e162cec7540822c2627422810ffa5958080211cef5e48083e0109200a7713d78402440a1e19f5406d84a1e48d85ab0ab2f0e09277d078e48e519879004d4959005be720603382e4e622759203458fbe17a8340800ad6f03468c3c40009a86ccf55286497a052400d41610283903707e10b80f243fd82c7a3d55c926d852dc4a36000f10159f756a9c35c9101e109fde35680f08513e16c0c92588040651aa3e6ff80d00e575cb94915440010e1dbeda994bb79a02400d01400004e84001438e161d3cef7244169b8b2c411f1002af281206864541007a1d28aca003c010e2021ef3fe3e6411)) <<< 16000) + 0x5f85902d68205128f43f1409c1817101f9c0880c72b213349c2863b8ad33ce00c30bea5d5a3a1809d838115cf87000b2e835df56890029024000102926c05000194100093b34492e0511b40663b6851e30c8e481d710087c845c6020ca537f140c00399bd84cc083e01088f022b96d8e3d38bfe5898295e7d360201b267fc72000f0043880ca0e4eeec238f31f5c117d50d14104c1d82760e28ea2706c8d91c42316ccee1f85841299b838cb880810baef06780411f05d6f6a60180037465c1d250e2400ac0b00004324000bf89358489a8140008d07080621019878a9ef333bc5174df1f0906114df8a2a341054e90ba6021d2cef1998107c02144895891c6186aedb2ce46846ca7abc92046d8694a0200baebf3794007c021a381e02f9f7b860c088324ad578c34c0580088c83080bec08781b0c197c55c381f62065f2dba44801c1052bae106306844d1af0570e0a0014df5b9e515048015014000083c80019110e4090718281940400094268605998b4b1c401cb7736343221ecbc00c3be609e0000058abbf8a59420800204d2022680193380814c040002aa406c564cc130ff0993280f080b9232c344315f015902c305835e161c3181c6627142802df2464942080021c524b75e753470dfdc26e98a4a9e994cd14702a04f8e0da8328b10801509a5e93000f8043470703d8395c91c72cb9de5a1d23860f1df35a3ff3450c280b81bac1c187e406b519304169c07be46241c0096807efb711800339f6421ca04013bd30dc52cb9a4801601a0000890f145b5e5ff84d1c6b61f4ca08250de7c5684c205305c3087822609e1280a04a9fc41fc900c5fcec0140800929218d548002301468e1ab20d88a931c724511d88d9e1c3055c12c9e37870c0606c5ebb927820bdcff23f582018247e81e182020a3eb1b113d00700179ca3c983c30004935d3d2d483a2400b40e000045c4000f948003b11c2464d50a21841a8b381e3060286086278ba01b29c110d09961ce1c1a26da8c038188dd215e4e083e010c22893a7b33c5b35078e4e06c0b4f10440a2a1b6f4400fd3816925041e00800007a91120980013a90f80593202fcb0a37f4d6824807df0469c18600c48aa6d2c5029fab424202a15a5267c182046f183a0082f97a5ea3f38104007a7f82c001557d5822641090041a307b36575fa0a2cc7e9747691820ddbee9a0e221b188d33488861bfe7a8976b0a0c6d680e11c1a00ddbf0ae910c048b39dca920005b58b753ad79a400a00904c60200021121f60a26205ddd7d9758e294d0d24108054dd86ae0cbac0b1ce5e029eb7f2495ac6825709f5b5074cb1cb14e10704104d009da7da3eb1406ee1af1d4429c6b154c672b0684c9d13bc3fc4bf683a9d5870666108b1be80014012611100036d92601d12f8a822c442a41200128221c633c32f783cd1c78c10598b3ab254b10a23b93f8e030f0c705040f0c095711f78f1470800000db2403054476fde7403007ed64fec70000aec7ce70f322400a00818662d2a75fb0c109e286d39a50840e4a9ce80c39c1670f8e060a0724f5460c00851a396cc3800000057a8100106b895b50400c5bd5038692004a0280001dd24bc0a23201c030040100000444974444b81a25b0d014868968344b20a2580512b80895804000a2e4954b42d622002e2c3c61257efaf9a2153ec2480412b0e30dac04618420109221bda6fe1e322523fc21c00604ae321002ea049b490107c021e580be5a49dd30702f968622438f2263eb2568c1805f2d14dc8e30a5e154cb41860213f5de0038021c34b662060027d30bf780000476749fd8b4801380a30702bd6d78836a1c7ad44b4e77d90306015eb6e59d351c6183caffa0fa018602252a2bd74030206668fe4533934003a579d773c028006e0e34cb2c70000fb13761eca2d3c2400c00e0000492400114cc91d0b0cde9e329499ba23801505c2104015c3ca332000f0042c60df7861ce73e186f39c92c715cd2c501f9b0df35d01851502065c846614502678e41f85c2c306c41cc8cbe80c31ebb85fd25e82413009302546760c009c0185e6b72b05f2006007800024a24a80a0003432001136601002008923f0f95f53c6db3ead307002c5cdcd0802ad07cda4001e0086100b164c9f8de0658c05109d8c69a6c30da0fdc8618883c58a0440323048f2030a37557f0f507b0606103df5b995f041860221fa69807505820e1ddc465f75c0826264c78a5d3fdf2b24801a02400009c4c91afc7f411e35253f7ca38012f9c0b84013fcd4c32000f004308012b15b3574b8b1816eebf47bf6418684adb795d5dacb1400d628f3102e1850f5ced578acb8b101224df4597a40c305c43a3fb1e4890437afdcc56fca0411dfcb3e625ef2cba6400c81000004ba4000d0480035890570d00038192530d92900c944060d0032500187f80e00802008d265e6dec430732b8f110d002087837200045df5601004e2651e940078021c4832e8d4a12c3070098e867cea38f1336cc4d530d18074c16c20a1828309ed603031c493a1a372ae8208991ef666ea040c79e3136fb0061012c26fe1b285920056058000219200064e406c17833c3b816d34100a494952415752c5dd201c19ff37e090208002165448939c920594801bf47068fe818eca0f8f9d5d7900c7ddff6738009d4b85e48004dc36527001f0087140767c993412669010d52eb5b9e24110970fd74eafc70e0667a252239460e03a921b78f5c68c03d124fb7cfa40273babcd582b4082378f4ed9784c3000071e7c4b031a902400c00f000049478a1fa6e38c)) <<< 16000) + 0x594b0d6ec1081795f8544161c36f38592834c6e101a5032ac6a8ac9005e1b69d4e003e010d202aa7809ae270823cf92c03fcf24e1c1cbcb0a081f8d145215b640f9c0b04a841a2ef3998704ab1b2adfd490105495e03c016907000681e65717585001a46cf026372da5e400c01000004964000ed08003c110008713c6607a8d981a24443bea68c00a6ccef6a011881080400002bc82f04c38427a4844359a7d0e302ff761a41a28a99ff0501220177d7a590824d24c60cb8a180b40913f8c0d424c5746020e99e3352198000b40a4f884c8412008093c1449c0be31d93ba4dcd128b4272f0208b9de3ab21810976892418004e2c2900025102100800008490a711126828000d3c912908014641e62a0010a221c233b2c36738bfe0312ca0414b07baea0a1432e21342f800c3b80fc6773384808072e99b6ccb0821b069bc414882041d5642c28f704014e1e35f0ca8001474ce298144b77c801701a0498078608a6bc3d680616019fe4dd3492202a95f97d324860765b84d4698089b4864188e0830566253cdc0e0065c3bfbfc608032355bf03e8000f25b57beab3b9002a024618681a5faa7a1e505ee7f4d6cc488095e689fee88104d62c0f7fa6020b0bce2c660c0971a18d48280834c7dc859501200000005577020077fff6dad4752400a809000041c40010dc92604892c1701001004000011124a1512488892044036220e01112382800c041be020007ac248c5a2451105380800a75c90f82e80b7baf3c11398859527c6f4ae3ceb8c108c92b1bc213f131acd296c4fa03bd39506844440630438230220240030099c47fa85568a29921d9bb923f23cc53166cff9b203dd8063ad4e8e1a7ba7107d547f8f2880e4138405c92b1bc213f131acd296c4fa03bd39506844240638618438220210210000920690ed97ea4ec6161d2a3f5728f86e823c1fd0cd9c40ae90c84be078a66cce32271c6210e8538280008c890f12882c8443a3a2441910d8a806c544342a0931111808890c44000bc2425cb612a3bd37a1d544561850000002313462938df64448c19f50420870433ea090902088815cec834021188551630011f3453cc0002df2036964008c0100c203e3abad51b2ec70e0a00ca70c28709bbe1a3910104ddf0ea60208319306b5e48200000017638015f2073cb0a000dce8acf80002421440fdc801280438ec8b2fd15c70e6d0c254c8a1c33ea08fc142024a8f1ff202086564312104205dc38b01040c4c90bf90004951e574000088359dc3900230040000e390003bc3a6c0fc243fa8c28000000d746920453808ec2440000000c81a08f1782d8541041f20d637c680241665f61040023785e6580002df2035329002500869b10711204aa9069202215a2786984860ad160299e0e6823f455190c7844820133b5430b8208210500d3c44e85800ad160421ddc100003d5f5dd9b0000096c274ed2cd0c5900300340001241132058002291c32d95114d89c1650688ef66ca82c901277d1dff440a02c54c82ae0514661a2b87e71808ba6418d3f82010097837fe6c400065261afca80000c91c3fa16759002b01c619f8f441b2094184004f36f6d3b240a04ced50c2e08a29b6f6cd5b9ac4040e6c80377d6980946af3e4f974102007abebbb36140039b201609f40000c9034691915979002e02c00011a12420589e80800123892086c0a4364800b23f05f9fbe346e631640cfa823f058a0000005d8a20335a492c7856ec14985101053051c1248233ea0a21820908a106420002e1d7798640088011e7f66163caa3c8053051c1259033ea09598f0ab7fe69df1208cfa828860411ccc9aaf448000000118810020983c420000eee2c2e2a4008c02000039044f415042cdbbd4eefb8c1c09fc7fbeda8d181df57e59cd8c0c04a3f346f55008970dfa4c8483084058dcf78002081d994447e40c0008708368a340000678fc3f1ab072005804882102b7ccc14ec60e0000001b3f060602c5ad8dd5c804324eeccf008184039bfc634d81040d11b1497586020899a88540870009fc7f73448000012558d66dd179002c0240001109f3f56535aa4ca58c00000033902c208ec39706a1e094be020d6442043203c8b51c08218bba21768340008a9f57fd92006268bf3d080002bbe032a230a400a407047c020002182000d2044dc276416c5a02618d058a09b32e1b6540a2abe86ced63c428814c40df9e5192099326c461220082aab97e214b8160026ccb3f4350281242a658efb88007ee1af381c018804801701c2c845380fa60c18502db1be286153f15420f14b3f5d8b51450e7c7123810503972b140c033ea0d6b010057eedf39000a5900b002900220080000df9e3a132f0a86751c500f71a0cb342850a2da26a5e020809ace207a6840c25266981031008f4473f5d66380386ba924e345000d922dba24000051a36f7b5b4ee400ac09047a0300022c24781223b05000341180a008020000088e9a75d06ffc49a4819f50358868d0f9f6b2f8122000000125840600000047c04101e75eef5868237f24068e820844895a34a30012b657dd069002600c69b062c9294a91a4803fa4bb10268d203e7418609420128fed6c6a484020ffdd12204102d5fb2f99c48211a640139b96004cc8fac82a0000185dfbd71759002a01c0001061c330dccde9f3bc81404a8e873ddc90c24d6fcfb18080c06e622d0fa870c0985ade497880419c4750d84c1041c08b25b5b06003d78b6ac8480001a15251f4d64d2005804823a0100011a913e0589e8084f006472030006af227e2200182f20402b)) <<< 16000) + 0x2381591b88c4d017a6e9c2846634186057ce51d0a923022020d41912204dfe20ab0061b1f3b81f378e10a7d9047660410e689fa8e6040816254c53b12004dfe1e9d15b200500300290180d80c50405e7c75e745d5b16410146db45a9630457b4b4ad0a2c846b0b02e0822034164aff12095e248d14006082e18e92c49e008852ca03c160022bda3977da9002801c79f240ec07c20e38645b866f89640a1bae789e2c5093c27167028ac4ac53e3cc30450dd75d1f0209e0e7b34ee2400dda3b59bc080352f71e3f2a900270180000f8100501c108a73836bd1e6026ef88e44f1895cce3f1260c09bbe166b2c500000025820127f775e8d0f08027c191b81045c373105c1802fa2aff7d4c80128082082cd681a159e7c292980b11831377c42e72014feeec67a1e1009f0646e0412e1b9882e1808000002581401d33a71bb000040778c46cc80120080000750c108a73836bd1e6026ef88e44f1892a9ec1dc60c09bbe166b2c5000000258201299bd78d3c208a59c931743005c22681c4080020ab6bb1cc80128082083582c451679f6b6b0b3418319f50561458a000000c82016c3bf5d4830415c79d2104137343107c5009bbe23910000347fc9ebc801100400007008001dc100079f20017a8602002008000022246c2a23511798162388f89c1460e2d492f65cb1430db9c94fbded9038a0020260bf49828a0898194f13347042d492fad84047801429ebcdd84c7000fc3036ec0dc50005b5e68719256f3c801801c30d4f40147cca830507211b9e14a0a286837e251c98e080b55f4b5c345041b1d68843d21020229a4742c318001302f50a018600498d3a66cc4000037af6d71dc8cb2005a05800022a3e7e9cb3c9efb8e2c0a8c6a8c3e58c331910a2c73c5474f0ce52c0a2f66e1ed05b8b102c9d1dc01c68252093f35960c10285a83e2e02083d455df7fa96400a4080468020002193e60c2ad9bd502458000002ee01e30b3c1a7e308c370b99875131e29477ab6b210c29c40b07a730a28ac4b8ccb01e0012f8f6ce91c006156cc8be7920050030916000000c80c1814c402f80c37d08929e218545015466228a2df203690c0006ec017a0c0133fe2a7c14015caafd9000017d41ceba900230080000e49f2c2f968622471600000101244a0000008981e466bc7bdb988191c49751bc40ae28c57af4145a78a3ab3f1c08489c3170000019638160d72004a020234010000f890005e9205213e2833ea06b11a500000046240900000096070ffda6cf1e0715362197070e2361e0d38310493ea783786860993ff394e002aa8e2ff720046010e362a0bdca4c8120000012c01c54d8865c1c1420cfa827ea07102c3de8902208cff56c1f03835e8521be40818dcd1ae9148009bbe2139192004a0200001dc22f20a0e10100d808000ff8e0adb63005e40a00e648d010577bf5a94004c508001000015c48cc240023a44794461b21be38605ff86fe32c80adb39e505cb183ef100216a2c208b471e663420b9e80f783c8241153c537b1a8504bed65b469604178c353993c4300545d9e0931a8e400a80a1c71b830c19a9671601a2c56d60961073cdafe35e18415f6f265b184161fae075fe848261e4f32f3d0608180fe68f6a082be357ab76896008a8be40d6b24c8015014000083ce9a885951743234a000000aaee1a280b15f3367cb0c528057dbf61840c677f3ade041b0b2f3ae8b14007e8a7236f01002965048f08000a20f54cc36ea90029020002808000864f141b62db1f30a50e2d75594d60268a8f5c767349850a0000022c9e04061ae8ba99000083cc1d0de4b00400128ca560ec20806607e78af5a000f7c260d4a517d120058060d34d1234726c5861aa3edeeb2030c4b9d305060808001b8c82040000069300830fca22c3e34008889fde5140067d41c1800010056015d592004a0200001dc228e0a00042f246413808008020000088e12069fddb1581e4000000396c060811e83fb4218821dae36f42b8604072503695312001a7f736a58200331e27b1e3040121f595c7a000102d7b7f24a49a400a8091860f99497e4f2882adaec648c1e2270eb34477a9d9a41a11680e5f3c90808f32fda3049f9da75d040000002310006ddaa349b200420080001b524640b8040080200000889188684f4240008b44380641b2320df190e7048003f4881090807c04006178487c07c2662739ae101ae2762f2140b5be85590c0b3612a4045000642c200080498488c0144320a2180500009d12203d1179c8100d445c3a0930900c0280169e891698fca076aa9379852f199fa5ca1e08b787f038a9cdb47fc24004e73e4912821080430a55ae3c25943c0c319870714fd233d203841cfc49a63c103aba3b406087a4e47349810840200002626c941b94d90123437076584610c3f6a06c702047a0c261810e19e67fb2821080408b00400023240dc07a404d049710816320b6bbe2862ecf26c120012d0f5de048104201022b0511502800040c91488c8a02644e0385b7f6a942188efb4f0808992df7a580faf357d3624e816d96dd64d6b46836a149920a8000000013f131ad3b4393626325f6bb840848e38820418008097978c72aa8551609ea556338b51bed4d59fb949a6a5e959c8d802f522979dbaf92e4102c5e27b8a3b047c5028780759ca399256d11a050001ce9226198aa00f4816add5f21441d1a4827481640df7db6286089580e51c214be48ed9a012c5b61f000009890840218f31fb00000002ed85b2148b4fa0eba1042992d3b90992d3b8d47cb8bb3a1451700fe34006fe41)) <<< 16000) + 0x76e4e84443e1c19fa0aa1c4964923081860007449adea7283c5efd9b7409b98c6dfedbf614d41e90ad96ec9bbfc926f91e37bcf7258b1b983aa3247fae3838a297a51d992d3b90992d3b8d47cb8bb3a1451700fb5823b7add6016fe4176e4e84443e1c19fa0ae64c5897b8a632c375acc82a871248c30870058001e733444f5e7032fb6fb001e487d3f11415c6cf495320c52c55e14c1a0c90464f1855886e8cdb46c0d3695452d89ba00066648946400a2a0f31100036f1992d3b90992d3b8d47cb8bb3a1451700fbad4bcc66424bdefcc99a02afe4176e4e84443e1c19fa0a99838e218188112004f206686680ad3d5bfe5f3afecfad3b8afbaf2ee2d08597f112cb2ffceb5dca460a8f92c71c59f4b7012d7042bd649b37c40510c5288a29aa4bda59200a514c45500038c20017c24890760363321f05d8c5d2d11fe8081893a5c01090c1a4078edbf61c1aa54295dac3020898daeea04040b806e35a16018215b7085200474a9b4188202869d0e50a3ec4d4c0156a0509c07183ca27f83c891c2786c7a6388706ccfa2202a22645330e13e7d2693c525102100860f001a3abd0e2075ab9540606625d27911610336b36864058425dec216006fe7ab8e28029129f2a824e204401000016b20005204878644163221d191118a886c444341a0930d11106888434000afc4880f612e4b0882184a8cfad4bcc66424bdefcc99a02ad608edeb75805fd2f1c12b9d34dee38aab5f4dd77124c5a69b3b9868f9340ffd000000000000000000899931625ee298cb0dd6b320aa1428e28a1100880a0a0013b096bf86799e2321bcc222ff7265439dece727af63ae1eedccc9d91f7a2adc1ea40fe8ebbc1495e50b81e06aa52b90dd948c7ef92b62f25eb6d0043dde714aa0839d3487c074648b23c2333db2a430680af51b708d1b69f852abd655170211f1b3736accd2592144c00000000000000007cfbbd3390275119d9dcafe0a99630c18a11408e08c080fbda69582132f98224fa17c14b0595add4e485246240b5c765a6868582d563e72ff77ff7541bbf72137912a29428a375b8f3ef6c375b0e6f98f68c9164784667b654860d015ea36e11a36d3f0a557acaa2e0423e366e6d599a4b2428980000000000000000f88b1860ca04704604a00400070f76b0b4881e9e00087548ff0d992c92b357518d208f759dc19f56f5d6cdc3afece3ef5f7d8c5ea2f6853d1104138e6194d4000d4090f10882c7443a3a21c1d10d8c8868341261a2190510c02800201c8201c885c140019ba4859240524a2151100141b907119f0a8fc05b3bf33348fb2c9428421662cd41e4562d2c06010249b8da1c249962a1793e0409535bc17ac2f23c506500601c813aa8ab4aa65834e18808a8492e1d74fac372c3dff20050494d677e60f1322f705f4a7b7552337c8e6948ffc92540e3992bb8b648f3eff0138e642bee7f6568510c40001cc1c0930f7d2840a10136f3a41b0241821e1c35b0620600368d50c3d80a05b9ef60999a1001378ff5b91088aa80f54dfc5dc901515031f6aac583120bf0fb6c88076ccd85604800022820e29321449909a28849060be5a2110990802883c0503566778939121c229b068b16e4305f70446396585086408e0ff651000d9b21841ee1c0a35506587cc2806f25154fdfd55010115383cedcf64d0225775f1715aa97542b0284fc4c6b4ed0e4d898c97daee1009e69e61849419408409a0100060200401be60000133b730c9f5fc4af8694cdc74c980c28094a12a31a4d3dc403bd3091e587391048000002996c2708230080000b7101b09f9a7b9019e47a9a5087e54b77706122b1d783c4a123800000271005061a1986b302180a04d82750ae3820b58035f419a0582a4dde4d6644021501034a62ed5d2ec614285514b90d26aed4776a984863cd6abd3c1000266a346028491f9ddc9000000e27813821180400005b08d304822c140007146c89da8cf50ed18388749798678b1f87cd209b4050e459a6eb33114305764a24e688180dcdfaef6480516d6e0de2e68021d25af9be0002c9d3ca8bc001752285204000020e241c1b0190d80e06e7e2635a768726c4c64bed77080000000000000000000000000000000031ae41ab7f42e252a8ca6e589870f03e440238c2cb3092c81823001c02e080200de30002d1525184d04217eb13089b376782059014126c39cb0942a9281a8c103c5b39592000000996fc4e084601000016c241a1320c09d915d3b51bda983820ab7511858fcc9ecb0298a082fe17b02018231118840a020b85a3df6c468005fee5d06100008afd34400003719a76c2004a440980500003dc4380541b22a0df150e70280017f090580c7880743d23f7c42a286c370317bc48c15c79b91061000000190121170dc4c110823df35019420228d8da9b430447d83cf9034061180430a33117f3fc50f738e14110b18571e76141433d8b4ff86242678fcbe7060015c79c59050073c8cee7833861180400005c09050888244410e220d20d01d868820241a012207090001e911dd218ee0cebb860b53f131ad43c0a4b20f09221020e20e0940060020222002300407a7aee4716df93205ce3d8b5740d99748673c5b0ea8000c79071298560ec1a03615203aee182d4fc4c6b50f0292c83c240a40838828620218210000088800088061300401baa42c279444962626830f48b7044251038c408506304280aa8000b79ee0dd28558cdfb71b2d8e164219492a8483bcc39fd1b2e789b1513fa6e91705cc7903263288d400084c80019e900184b240c932051dd9279)) <<< 16000) + 0x819160abf2c80aa277577501234f8ca39a0d5ca1400000493e0050985e2a15869f244c5678558b00120a0e95f974e543e8384168162c993c3f7b46510c1c6ce0f4a166deba2bb94232a319631244738a3c38208031ae215b166082300800009f901c09c8e69643e6cec40a2baf6bb874d5c48995f06106c32102142ad553b4d44867be037bd423101ae94a41944a4384ba528dd417120756d9047534803a92ca9a894615c40b80d000044c4810364061b2020990084f548584f28892c4c4d061e916e0884b24b20a20820a14914a1091000c0a008036c981c43387c5113ea7284d0a155452f46e122c4b7da2412847e2fe16ca4888e8be1df8100543a117c20138a1180400005d080e0ae8a1277b5ee3c891f8cc616e6b22850b3805789a45148a411b5e3e2445b9099b28b8812fe9edaf67324365cf15f46d880c00000448e040004fa1d3a56aea81c2a020000107902911800271903b196a90b09e511258989a0c3d22dc1109441439221021219018a17ed45e959321f1c44a3c7a1898df7f691d645165306e10be23da21653655de923c8d48635524657b50c088488cea99d1f881116fab552901d47f8b7fc040213a01e3eb3841180400005b888b04e06d59f9fa4240b40a5623706142b8f38b20821776898a21c3b9a0d11ec404f90fda77c70882adaec6204e204601000017224001a0610d0ff84c7f8243fa121fc0100029e11fb310fd1887e4c43f0521f7110fb08851c443ea121f4090f98487c8043e20200112723e0c31ef5d8f72cc7b5363d8631eb2d83894c1a0763d4331e915e11c28a4f18da0a230022fa35d410303c23e2adee4003a4b874e4e87028a0645a11b8a02c73e88e958505550400500e96a96e3a7083d64af10c4918fcb2e6c1b4003ef72a8055a916842b028680061d182d3fdfa8bd4fcc898589e0f0a7c3ccb91cebbaf2e5aed16b5b051f7d400223878e2765dfc9b6cec942a971f794bf554c19b4f12a1ec146314f858e4ad30000fb445125f0852d7b149679a99c06124004d84614258e6bd3b08a17a3e3fc5480b9fbf9ba0673b7e7cb9a7ecddb067b5ecce7f1abbef6f6288ac080a228fb370799720c50cb0305b7658c0009253408c206c021004010040f40280000dc80d84f4006e6202200193ea1e5822081f00807204838c0400014a479c17010010040f30280dc040000984794261401391c04ca3eca40406f76a9c1c20010388e0c00933afe140026faf412000004a4842010000114200072c687df32af93c511dfb07005ae04b55ebaf9ee6315f3a17abe8fcfe0d8408a91c6a2e3642c87470c475074e8c8587a9de2021acaf7f39d839d3005965e23674f3d99c71f6eca57342ca8fda05c71759b4734bc1bd00200950283d23cc8ffb0e8e7dda6749153c68ee6904d7387ab9b6c3304107e13bfa39413cc945dccdc5bc7703f1da056020e4d69428d0322a008b9962d875fc266390f28b38ddc7969838ba4c25852254849ac5b81e40501c8080015c08f180c7880796f9b784afef828811d8d869feaf756a298bea0a310561ae5450000000000000000001184918b14614804504304b00201454100c7683ed8768382300e8000f311e1398f016c77ca63bc4b1dd25802908770860ae3b1db198ed04c764163b003a1c8ce5994060e23b98744a08001e9f3c608f0d7cd98606be36560d0039861b5100000026302000851217cef96a70c33650db250c7da3bf0850bc5ac877e7020ea59450400be916a081304100043860b75198f286677ad7ee285b5ca90fe3820d4ef93009020800200001aa74a0797f93722283adfd280d1479eb5a6070822e25914081484787d790042a542368400f27418e204e184201000016220f21b1d7058eb02c11007c306e092e0943355e8ea2942c3b7e0979210122f0400a0c952b54092821000438b02fb2978d2182d8b24a23861006bfe5890812146668141847c508d0900c8f4037a14024b5008309c10880200002ca406c260960b1d505d0e1cb08aa470c0bc2c54850d29afba9650ab1bde8381025e8c6df2012881000438b08e58c082231a83ca190e187e856bd878a0822a63f4411e6e13c0040c5f84a0c0902e637d2760138810804000059080014211d4190e988800161cd9003b47d820e320cae628858a01c03e0a18103a7c6d7a5840cd92cda0e10b46e23627010247d1f4000013921100400005d480d88c7144400169468934c8e826482752ff9c42826d52611c58067a9a70a2000f9b8654080eddb15e00001310100040748263a2121d0050e782800c04000342473847438c5c88504d0c651fef08204526864e12c136a5a54c0408184f54d50022a535b84000004c584201081867bd3823c573e0bc14616d1267663833ea4d4a860d28c27e138007c951cc981078021030fc5612278b0b3eeff8c2b774361070659c3d968c1be49858e4a083c0100000f520ac0a1b501f089ae7c938704605795606841ff846504012034921c38005982e782003734d7ba013081000400004c481d84fc59a4e65b461485bc92a383218b7ac0b0998fcb44181b4b9191cd001cd8ea226041e00871601f638e9e2c38caf4c7062331cb49811c3c073e584435985e9e086fb19f8303aafe5ea13820f0040000524e940354fae3862df122c9c269a16ec4d0b4b4beb6602110c23f2c12ab76481e058603f0c9c107402039a020001572036121c60182b80c0010d08e606c14c17c652cbd3c2305571978f4f002bfdde684043fa1e4090007c02100cbbc810cc60bed2fca8c50415b0d9d81005a28f29e40020008000069)) <<< 16000) + 0x105e050e5828728063920381a0509647688e1709d49e3871e4e4af05844af5249c384be73012880016531ed418156f49aac4e08400109920bb6b9d94490c93f3992c20161bf00870e99eb5c763845bb260e925042100800008290600504100e441a1713bed01887feb39c50800e221d054301d2824b0c1742f4b274a0081e075d63000726996d009c40840200002ca4001088e145c7f3f20f091a12f0843075790acf82308200080e480e030756ebb70f181d1377c89047bf22caf1028e1db2f614099407503cf0001a3dbca13041080423828f077fe63c75b70900158c7281d8e01df88aaa16e8b553ef0708f31028f21018f19208408a0030100200d00016220005624720340961a0003b334498c4c13421081e0080e38280ec143700b1c60582b82c0002dc82d108002bfc8e2888004d8881d96c71017e293c893480e195f482728a1c6da415d9a0990654a99600230d780012861000406e807a3126f8cdb185184070ee309d5b9346c804d2e0d438c09bfe1f331006ccc75ec04c183e010d2809da58be80d46458e363c412c1b43a8e18aabb5db0801139c531204a184201000010820004986c415d6285a30497710d7840a1616c250130c1f0040e180c014060001a260589775665162808d709008100912f0898085cb2d1e0a0b5fbfa05860ae82c0d99a0378647d68205a33f1fb00850304001000018e23843a1c1150e00a86fc340d0121be05001808001a9c800dd71f060456f92502d3cf6283c004e17bd800033241d004508100546d660245a0c1c058219736d8c50208c5d7163019139a4d400128c1000430516ba86a72841333ae034410b23ad9930101c2c1972c11decd08010083339ce500098608002000026a46f437a302311d101869b1e80b098039f822dc7005f59b5848003e010a2dc8bcab04c23024425b1000f80400001d88de0281d8140ea0a07401c8473ac6fc06880154add8407c4befad1600c1a4d374024141f00800006c100501400004010376021ba01c000040100f80298a6016ce3851681503311a11b403d5230017b1fb8e48083e0100000d0200024446e4340361a03b090dc04c000774800259100073b236e4b0710d8db02ec90f8c97ba58862773c7c70a1b3df079402e2c32b2000241c1f00878a02dfb272612d32e206303024660d0a001a8a4de12040f004343077486908040a7f00b0819e654ad010141173f024041e00858605c57019203161b93a48414340e9b30b00002543ae4808420100000d7200037a40a4378105ad1f3f3c10916f1ba40002dbb08810264d80f1812060f804385599d48d9e08db851242820779c8c8e0008746d612040f0040248040001c2400073c80282ac5031596d9181028ad23d3c0069a4c6c00090152e6a2404200080da80f051d8a2d1802529729204190044821a9dbc1860de2fa26840016c3b5502021744e032000f0042436cb44812085e3fad10018d176201b061e890006402000016a400066480010f90290df824d5a33827800bda3b38080f1b1a88c0015004a69012041000406d40783716dcf81c003541be0800bd286003016c5f4ce48083a010802008020000088c003f41321013d9bb488105c0201040200007f20003384000a848da08800182080056e1de869650b1416b3e3439c0ab5823b7add601716aa7df15542dd1c03bf118e503a0e19418610809800e000000015439e95ff096b233deebfebf917461cb19fd03419d04f49fc9e63bc97704232a6208e1c680014491b3250148e822c7436402000eca23583a1aa01000ba891b13180d94c6c02635e0bd0818dcde30b4e665d69c143170266505267b7677aeeba7e51d9ff82fd460c27c0e1961b6bebf1b66a22aa8c51980b59a318f53a7112731e360a8f3c0b04e2f0163e65156fd8350ccd61f0e40274b5476d1d8934163aa82a22ac900a4619ce0137f0e0a7acbb2965842156cf163b080fb18aac6ad118ca8000c9511ca1fa3eb19c94b31a3689a37a1a5942c505acf8d0e702a3f2bb69f7b5d551dbfd2c0a91629410611609009c00e00241d013d0167571429ba420c0bfe60001bc43540c94fb17248d3b7346d14280010591ae2de8e01b432066080aa424a4389b66883e6289d75d007c012081000406081600a0ad1c5d992ee66091f991c6e144373711081000b742260400241821008000070913f15e0c195326271e24f3fc934a58680b103499800198471bc48003b7d0b48e0048f76f820001310110040000514ea63a5d147f3ca2a10c477d42188f00787e576d3ef6baaa3b7fa58156b0476f5bac02e4868988519599a2b1e9966966d0868696ddb73e31fa7600000000000000003d42c52821421c005396010089a0df14aa329e9b03ba24434573fac52848c1b821da1367deba32c85200299adbace31418b86bb7da76ebbda2abc72593b01281d18154d0a59d6840a94287b698bb4a92589233ff3c904eeca35bc92e62aaeac03a023149ee1d73e5884a0c74d00056f235a421ac150668486ac243540a0009672336820403904b98821c8412a3a00105c2352ab1a8498d39ec698870199f652c27eecc8274c1a76c95a73e9ab3a48d27de0def911341d335196b1c075ca146beaa9e522fa4b237066da43583b0358f93081f8bc2dcbfb77feb080870fdc23453d2b9ae447c748d9b6d2142049069a8ec9006a1b39074f15c000f73395e644c4f99ed9ac45ff1c943cf146d3b368dcf9836bd0869ee1d24d4a80ada3bba38704a4d8fa491e6eb90920d64273f502a9e1f708c3b0cd142efe0daa868192c79b494052600dcc0020)) <<< 16000) + 0x46483c010c1e649ad5d980b86607f74409dd94d120046283e010e26331d170700aed923809040e802200002008f02b9644161001c00800002491a50500004d91a40de8edcc8c6420c0d0e322bb799c42ce8b39f592a30711940000d71f5139c64740a9aa9cef7ac2d1768562fb4d9a116618576426332b5d3c195a1d5e29a9bc7b147ed1858eca8da3274804c9b32fdbfb2777013398ef41b5fa26814ba049edbf1fe861e44856b99895c6af3a40bbb197631ebf512a772dc43844d0e362c3c6270343cd67395805111d4aec640b832f956af02213cef744c0e398e0e54885a27bbe653c7550fb957b670f5debdb8a9aa370529741253257bab6b8d3b6124e220aad25a0e8e599a323713fb4014958cc39de0ca92094cb72579988ab2740001b7480041c91a315e0f15984bb51011a2268c9e00dbdc8e0040c80141b60048283e010800008023809f062d984007002000009274096cb5a422083800800004a2344130b2098490280004a88d08880008c48d0108002dd8c8170d08b74565f2cdb7788f01d7e1adb7cadf9fb58c3ba824c72633341eb1080013cb0acb715ecf0fe7ce847ba9e5df5045782d176b7bd2059301991245280352c997247731329e2d8379cd77c057c73ad4e9e7dc57988904167ff003f84ccd6fa1e86b8cbbb4abd4da06100c34f93927d1e99b1c176d72a292fed40389a8cd84111ea23ec25090b824df5c6d0869bc8d35051956cd5f114779a400013648458c800452c8350ef823bc98a1c2809e0da1e38e004de3918d044004233821008000061901b158cf84e0355ba2def142932bc0a00816e38f98d2c0348c5d9d09020800218300ef6cad9020054bad10c1e7074875118210004306268bc3af183ac2197fd0c213db5ca02002240468f2404200080000699000195233c1b03b0983504c674063380313401d092255aec0202f79861ee3809faa4a022802a4ff9c8001eae231d000024a484001000010f233652040210cd0e825c6410e1a0950d01e0280013008a49e8664740843a0be190cc06865c1432c0b19505000e691006fb820e28b0ac398340cc2a4074bd809cc987a14b6372e438c6a8a60ce0e78d29d4810061b2f0000000000000000008864b6f4d0475730f53bde40f88588e9d4f9e3e0d6197b4bd5f000000000000000002111611210c1060222aa80802806bf7d3715a20860591ea43f80653f677a7ce696d0e00ce604cf4e7a1c13112182b331e62230938a73ecf14042552bdc363426d9c915d45c2930dec5f77736df1a595f9ca196f66a6110887388e7c9273f47f7228740b824c90b295fefc055c4046b775ff33c94653f14ea09391d422712b1fca3c9fb159999ab64c7c64c554d8b3b011706583fa7656bc016f320c1b86dc35a3c0464c971e29b68733ce48b9e4da53e1327a3de80f964b4ce13f2e9ac80e2210c3f08f24a835e14657bd7801454ff592080b022e53e86b2002744d88ec0004090b088021c7a633f19a729722fe8f6d983a5550bf42fc8d6e2482e572eca564cf17510e2a9acaba4fb99eba84243f7273b548e185a12210b00fd5a2e1ff6155e47dff341fd2466cf6087c5354d0d0be054909755416c03a1aa00b6eff54defc4cc04ed03c64b0202dba050000ebd68593f3d0a3f871036a51812eb7f3186ad47a9109b5e681e55a7d1b826f69d96d25deec9c203defa6625ccc107cfc7eaa5ac440b44a488c23d76480919a69bcb1d0889e4c6f0e9dcd3b86b3c919e6819fcf5d555161384c3fa22d0c0838f110c72de2c713dc44fb1c7d7a5caf8241502c3be7000231c200080ca008000320c010040103260a192010c88086400431e0318e010c68084d00400019445f8040010784630b63164318a1d00d8cc624542062b040158428ac6204630e13186098c282fc60a5c73d706189d2aee502820da35d014c063464c5c72412704acd34041000009510880202fe0bb0539ab4e7f8362b4280a9c4a717e7ab43fd00e6ce9b0e800000000000000007e7ca3fde82e605974bcf200f881666024823827805004000a00000436a0e914cf77e1e6fb8976d48d49c8acb4c00789b2e7fcb04c20befb83290cef84429ae782de8648a622e8001989820c669cd48e10444016c4c136db61960a00bbd76c880040090b08002124b265063c34505197a3e681f2a30538502ab88d82802012120f80420280200818409f962bd37aca51545f4a0b0580b7ada06e3807dfae18e00120c1000400003748c188c608340002b24604840004d0460097c7a75531e2404b7bd1eb4204bf904ec43409d07a39b0401002434200080000751061190bf80ff2bb69f7b5d551dbfd2c0ab7fceeeaa04d3e951f9a302afcf0574fb15ee22bc60167f39b3567ff089d247c2fc70400000000000000001f1f28ff7a0b9816861658e6067804000a020005a51d177b71c4183fa7b5ee9cee78b907bc544293daf524e676c6bdfd1c2ab8effa340fbc94676f966a6759252727cf7c97d6c28832f6da8d503b4d2a0008624070862fc0a00092422faa2096490be20807484001c3a45ed8617cab17a498bc92e00802008178058bb80c0d4062ec03175010ba00c5cc0626803e2fd4c675a120c3c69471000221c1f0080b900f00be3e79d0484f2de4f11b3610f183987324236d308deaeeb7ea177e0f02a872c8209df8edaf27a99ef87c576efbd4ff5bae7b3dde252e8000e5f7f29594cd1b685127e0b5b4190be96c4414858a7fe2f97f22a3e14d0a37fbc524b86121eb840c20993573b7a4b514e0c112adaf28a1d9f845107667694ca83db6de296ad)) <<< 16000) + 0xffc08863f9ac5f5cd7830c839306f5c858af8a9b941f3f8e0a4026012d817a2a5b372a890d8b2600014c08002f2906e01fe576d3ef6baaa3b7fa58156676cc76bda6e346863f2055bfe777550269f4a8fcd18157e782ba7d8af7115e300b3f9cd9ab3ff844e923e17e38200000000000000000fb2875642474974052a26fe40e71c4797c1e1786680aa580000000000000003c52891813401800001090ed7aa5d5f17153131a2d96025fd62a9f030f5bf1832bd5a94eeb29d7f05f15eda9f7df642306d1282851e1981ea49fcd696e2182d68790385f9d998aaad0d4cf220df3f9d65a332b21726b76a14d5d1387d5c175d43e43f9606695e18285b0ab4500066b22e262170290b79485b8942da4216c1980d8a85ac542d42b169150100a85a0542ce1a1660d0b28285900413a02000eca2004f66646ed07a840f1d2b141017dcc0643d12d87db9368e7a3ff15e51c63e92ea1be2e067ceaac110b682e62ce8f720e9b6ebbf9961140b6ade84b8d54ae210a962ba1dd5e5bc0bd737919f330bd1d50386cdafe7a3fe293b90842103727201c285f456b6e50bc89555040050b3c2e7dd95a9da7004fce391d2c8db636bdccb887ba76dda3317c3ee717ec14a6da8a90d685d731fec8dec9265427a58610482f143e2d7d5ba88085ffb9fb125b2a4cf3b3448505bcae82e5615853c9ce0529624f64be9d8874befaafb63c6f9805080006622006d40402dd74eb61ef8aae5564d7717b81865de8e28516f7771d74191909dc0000000000000000043369a406f2756714bb4823cc1a91452938d7c4bf4c000000000000000dce4483281dc13b99b5ba2263664eeb65ff18d18c990ea68000000000000000000000000000000000000000000000005d31030c11800405554f1847903a5862abcc1f91bd72600064799f3486c10b4918627510b6d98dda342aca777664ac03b2199804b78225591517822c89e0d9330714a0000a835af54a69e45e02aa5980a1c74110099fead09d90a18a28f7a044286d589703ea2d5ced93f44acb288dbf1a0b33a9212abb6fed0c38c479cfe00018511adc44146901a1c561418a11950f568130daeac8b922e8684575e1cdb2a275a32cbd61e827a4fc74ded168dc7f9ef20c67c2fcd2170da6a2c60200094f2018684403c0acd08808d66aa1c4b6621afd881a63771b20808110612fe2048787478b200131135f30c04e6a2be284409c7084021420921ed5bc711fe453b66206b7d79215202840048bb881652078338504c6475e802204c384201000013d210e3b0b1058ae82e842b3bd0d95971c41160518662a1033097d6980b62028cced2480411822c31d3ce0cc1022a8af4c8e8128122581af740d08170316a100da20032e08db2bc5543e848a1601628427f566bb0710455c337f103325a7b7e48090db950df102411016ab4a04722db7050818962ac6b1509c50880200002da44a46416a221520d0590685883600083a4584b62c05b15f298a612c348862bc330d0158a486e4302ba2242830a0f4a6d63ba5341bbaf805db488d8c1b603be1fc46e9515a5a8f4542f793fb1f3ba367c30b140fb686a61d52401e6a223e50c0abf3109850e1028864834a6858b8b8bc2a3ea0aa78221ed84c6be1007d3a3b1551e1de4e1bd6ecb63de6a95d5a026e48822006a9814bc84902256ba7e178903f10e6f1da7ecc8e68aca6a8d339a0677a7fd6a9281b26f170ef59015fae0fbe82fad7d85fb3a88321aec252a04e8fc0574071ab615d743a7c19973ee4707a0e1fa974119d0a28b8a8f971764c969dc5325a77203f9931625ee298cb0dd6b320ab833f6221ecdc9d07f20b82a848c30a288486600010d3ce7ea4145f85464f59b9b8a063791f541bd79d20b7e17c3acf8fd02234d6dce37c1f397967a3a0ce3ab55c3fc3fd4120ea645b567ea8c73997687774e203fe32fbadb64fc2325bbec17326cb9264540eb91d1189b969b2c8d638d48b9d460b4b854d849a75812c942214c9ebaf68fbd6e092703016ccf12cfc617d6c2c49e46093bfb5c99c099c1bb65af16928826b26d8d0bcc72e3c5bb099a064e13c3c795d4951d7d43b6778d052842221fc2eee41134ff70eb996b5e500014c10b9f6203be11b1163fd2a37aea7756da628c1663aee5e84ceee3dc8016d06c4f33e8dbb81386d9b862bcf0a4574c561e4d3721dc7e85ed20a799a83472ac8c210f69c3e12a8a9e99302be2baf6a0fd2b238d3c21ae08e691301cdc467b78e8fd082b9456cad871042fb2ea441efb06c8314a87cd3184f5b1fea9828e10ad71b87f7bdb3aa899db1e2adee6b8d4e8f748a0c081ebf9f8bf780463b38ab2b4d589929143b8c5920006cb3efd363f73cd43f46ca14562641187359522f2d834e08483b7cdc7af96999efead04a293e3f800049e200154a4570760362b08b15d8a82a42beb205166f4c398a24682078a840c1ea174163024461230d2002b93fb67800004c5042010000143325bef4b1a784044a84311df42dbfb540fe325f6bbbb43936213f131ad000000000412766c2be5e605c213ce307e4cc0a06dfcb82a858a2882061000809fbec6f60ba69797707fe2985a058fa19d5ae210d144df9803007f49e85efe37710b272357c1e2cefe3b3181dec55c28e621514468172304d05040c616320b3ae82882ecf5fa218012d0fbc7048104201015b058ad02f4741702cb60e3437e9108c614c2ac558450204394f2e1810e50fec5328210804056407c42b3e59cfc81e06797d2838c7fd5e27c1c20dbe255c16081f91394c3043be145324c0842010e231b9ac)) <<< 16000) + 0xaa8b206452f79081fecd9516871ad105f870d083cbed69c601256a9a3898108002000025640009dc81b808000f008ac08855c242ac0200051d22aa3a1540500047b1129310a99082d4742a4320b215000ce3103b2506f028007d908a8a6c0eca62a023c798fd826415bcea000000c847f34be70422484184104382282400300004b49f6f05c421057b6e56e852028991d0c51720a919241b4cae4132bc0886f5b942d87942fc1741ae4ca25b86090c13b768203cd1e44f8081ac4886e110077a4b1aa06037c079b748345e67fe535504e33f046202100c5061bbc4413880965a364c60c107cc795ca1020f22606bc2027347913e020693547a2f20345e67fe56aa09c67d0118808c03000032442d45416422000359229e5b14e298a692c530861a43b03b1d8a58cc340562942b14911c0500401184a6ef8a89070a84256b128a282a896cbc7021c63a1c89408cfa835100825ab58b6f1801034fbc421000000046200072d1919894801100430b02bc744d85c6285041aacfc91d91451b2c55a89d7a2c305415d1f6a6c14122aec75602990411e7ceb55fcfe28010176448f8660405edb83772b48000f11f5d89d48aa04e9003004000012591480584802fcb0400b32683dcb18000001f12ce18610aae4c57060a084c0144d299908108bd0bc786801066ec268c8f742c011888a9822f43000bbe30d3ac4000405b96d11bb38b92005c068f30064d6e127c058e71f9a8726d0286000000da0b80c30d9fdf7b75c490897f792647003020e4d1136b04041fc7b4182f660200feb0f8d4608001c6dcabb5e6f8e09002d034000116914705d8c028c592a91746182fc22078a1114105e147eda1102c1016988ae1474182048b3ecfe600106111fa91cadc16005aaeb0656f10400d87307eced800066944324b7badc09002f03800280f0702014669c954c871c24586e85ccec33020c9bfa540e5b9040826f19dfc490400829d6a25304799d0a047115d0d63a40c1410e700a82142b881050c2b3c36541913000d77a2451ab683b92012006c0a8c20471cb158215a871c1df3c349e78c4c18202a747b1b878c080fd28eeb36ef840820afc498d6b0020a03f27d9c21ef0a045a4bbe87eef1050416206a08b4e58104ef6884e1c30aefa804801a02600009c88002899000783200186244902400216045186627e33145198a204f0481d10bc6820d1bea8fb0000887084021a6000000fa00c352e5d58cb16240e48c7920c23890966220c12ea84e5bf881752b4b9a7041111daa13212040e48dd7c000269f662ee5240090051a602e25647458c114e03538c32babf6c443045b590e4a04101ef2ad4c580114e023b0c03b95516001004f50ae258006425bfd614801100400006fc87502c3a40607603e34056862215183810392375f1c70e02f2580060a081c910ba87146310a354f8a2c57b83082c1c30c3e29385a2863894c89b2430c10c118792524009c0501ce03f38000001901040880c931634607c9811d040c5042d7e1c61b6b31b4061020b6f081991842f534db702080bad229d0d000a620237520046010f38122d750cea18d201b442d3f2e24d18140b54937dd881869b7290340d861b997cc78d2e208105fccfe55d5f4610bc5892a478b841015618ee3df00b0016fe027e4963f9890030038000124900042c3838267ab8a9c1838e094c0814d390e28b3faa3245d828b467f84043b718184021dac428418618a68b7d8e41a08163485b31ca582077248d2c1b94081bbb058d91f3c52005c06014301e900aa307ddb91a10400c7e9549513040c352811f367990c359e2c94d42df868811b15c70d98e88205a326f415400704094c772103a116103a52ba6bba38702000301a9b10a5755c801902034806107117d6a088186dd6a8abe830186c480f58bb1e60d10258ea6d11771204006204506b290410312212db8d8638204c1188f506b0b08223c0052bc4a2c0007a7deee05daf7b2400c81000004ba400135480039d1029090006da914205c10df6184a09903466a5f4642b00162047b7970a1f0d0811ede249dbc4045f7f5e73d3d18296a130c6b510413a25ee1d2b58b01a97d22c779800007841f238c08e32400b40e1a401c051188b88821348c733276470818b5bf98cbe342115d6e90afb90100a48e800a30208d7c56afe928680070143419972006ebae24cc62000618637f362ca0ed2005a06800022d3045a3dc72851a9a350ff05c97401a10c2913f8c1f1011d5dd40608c0c162053f838950416d60909f9bb9c0881b631d77a1605d281c6cfe200002b44f9f8b672da400b00d1a40270c00cbd608212013338dbea708146bf0c5cea3420db07424fb3901038f754587dc208f57ba88fdae68009c2ff1260d2006afe3909f0c000616c148cd6aa0ed2005a06800022d20008d870874e03dd95508e3a72b11a85994c1551c409c737838b1b9ddd1036a28145090ad82290808470e5bfc990107ef3360ceabe500a8e20bbe1a6000e8870b1eca564152005a070c1c463b85c80661c75ec19ed10534d1872977192c642813412014121b840443b93d1c6fe0419b6bae477004c009c2d16e5df61c075bd6fa1fa90003e9658f5634ced5a400b80e000046e40140400092a6860c6b3132edb228a2198ed1234c0a1014455b6d2930a18e6f5f4504400c3a9680ae156c04021e127f264ab8504024da5dd4830208c7dfd95ff8a2800511566f91a58949002f0340148080ec042820300027e207a231400d800838100225d20ac1a13f0d0011959b0ea68707c990080ee3cc8a00088608)) <<< 16000) + 0xc021a6d57afb7a6b5f3490146877f44085060ada20b9d3d090c03f304629c090181cf5bd7272b241070fb2f93b7c10205beb76ce37070032fc45dc46e000028e005b9ef98629002f03001a80f8ee7563a648a61430022a3eaf0dc91022a1f3bfbc85040b5d213dd0b08203105cd340a14081465d4fc91820405e2c3d5ab04001257edcc87c0000317a47ec5e4d52005a050e39019d630538e281d33a3c390e1b11aa96e9f0b14000000d740b10000000dc2020816d8733820e04f246d711bc20012b657dd001001122568d2a4900280180000fc900043e227c0a13d0189e00b8ec40eb2f00c7140cbab907f05144ea87322d1420e2dec0026142110837921a402716f62ace8e019296d0d879400973f28c4c00026664e2d213c801380c04ec0563e304c032a10400f1927e86bb2aa2e830c026afdc5089c63052d730c5cefca01628f6c1762a9c2801053db4abef44560480c60986cf7c30004039fff4bcacf1e80015581f009c7663d09012006a0a8b1cb3b10e42b782c606e3fa20b5f0618a7eb7c079b21830c8f2ec40bfc9048a2b52eb6780413d1947e58ae0b001b8fe5e3b981805dd7dd566e64002e13e1f77fb09922400b80e000046e400133c89d04c4e417e7ca24733ebd4f2c0327ccdf4458a0000003a982c2088fcf33051e08f8392884282041b9177c29408212bcb13388240088fcf871a00005d509420af29002901809c00e0867d746648e40c043a2be73060c000000465100897fc55e7806103fdba64340820b3e03ebb86020b23861320a001db4114010000266de35baf90027010410a6253d6db0206001ce70b78cb1c18c0b90ab860c06302e7aee40228cb1737ec06104ad95f9c4020823f9a62580602094845134d00003cebddeb06120052030000203200081a7cfd04c50f4de2c718d23c0c0f3c240f156fdec2c203bb439eec0825d509420ac241108c28562a04110fbcb810824003bb440c7e040091fc270eeca400a0061e7d34f14c22c2c70bb897f17060c0715997fe8208da13ed4ce12085ad991baa1810318a678c2082181e4c72c0f0011ed16b2816002a81980a0e900270100000f710900580020b91370900054310011ba2003180429c4426c1a1350d09a0080066e880e10ecb9b37122279058e03b7fc5b61470c046d01d0b006193b8abae7241c20351c1e365a58231e89c078c820407bb7fabd20a00236814cf2a00006348e66305d6400ac07165ce54f81cad060c11b40a67950e18150cbc9cf618641ae040ce4160890fffca43038200367f8d6d8e00179ab83b3808003bdb1ee11000026c432e0e1b4801500c000082c8998284c8078650c31d79bfb8c200d26f659eb640608e7eba1157301260a211573c100803f54b9aab03040b993f81bb008215cecfe045a18005eff28a34b000047997ec27baa39002d028619757536f1df0c2005deebce501a385eff28a34b3011d385e0de7c40202a38813ec410427658f3a2e10001faa626ac304002ce45728cc0000e8993145428a400ac08000042c44c815a6d5c2e08ba91a28b3baba41e1228836866bde122029e3087fe0e103bae4025804105856c0ddd82081dc9c39a60e0037d961e6100003e2d69f676e400a0051a6d8f9f3adb89142e98a02dc3841377c3a980820926211db9008179d53db8d001be43b2a448005e754d3d0c00011ab5b880005176e46bb900250080000ed1c33af4ad4b30d1c000001188c10374ac17988104ddf0c61860433ea09090104369557078c0084621545840035348d39c0002df203692900240080028080007988002f71000a7922621a03b0d0980684bc1425c0a12d050960084ac0425402000fb62252731283584398c49c661a0030bf01c04004011858568628e101457d7469892060800b614375441083b25a5c70a1103922175018138340d00d80836bdeeb2de0500c97642c6d0400000015ea0a12004e038a140fd652c9fe2c488025ad67f374310413c58a369e52141831dcd51ed1a45084148d02b57c808390928e5eed38200112ce03a40df020134867608e97c0009f7f5fc1bc8dde212006208000025434284c13167553888251700660bddb94180985020233b86183c270ca4b2b121006b1073c7250410aa506f3e563840856730ab9b7d82009cf31b01f158001fd7270898a44ac79003003c09300800097c89284c49014000e08448c4600a231130580180f8b78a5378a4885f99a8e2208d286324c70072816c54012081000428ae141122cb4f0b1001c53cff01b9420170c833689a1041a1f0038484040634af546e9870504b6610da5eaf9600206ed3cc66e0c027420fcc1d2000160fb5c10b2a21b84801781e2c612237c752f7028b6293a85b6164a1006709291b0608213805f7c9b1f2c20544193dc950282666450acb840502e58689f45ef0200b1e6d648f480002dabce280de999c2400bc0f00004824488162420b1200500026d90f31187882f8bc297a696488779099222084c25ef904820a2cf62a7009033791601288100043480e1a2ce6274208a517a3a3e7930607a1eeb3dc0345174d9681baa2c1245d803ff5a181205894f095c0414d5ad80aed420002535dfdfc81400adbf341da2a4f9002c03044d060cad87964a49dad010d20919140dc68a0fa8e55f145a1b9a88e1618928f2578905a7557a41380108040000574f121d557878fc6903c896472d64110eab6a17a468e062a708a6058c18be55a9c47060006de1dcc402febc75d8de08264db65214440004156371119120050040b25818480626905ee33396145ce715035161856)) <<< 16000) + 0x8f638890eab49b3266820464ec772011a7e6df7ce004201000015c20006e47cb18f780592870561674a2c6230ab38b183be2fb8a528109c0c3f7094208002000020274801f51e91d3b8e3a79394a455d4d1809e8456042a60c04850edc7543450103516f8a18e217a728e0f5304120240404a6dc184085ad93c7b310010af23862d64e1c801681828878842eb5407ca7304f53070c76b8fc3c636d3d9db1c20ed44b6e3400359a4f698008002000025260080200800002220360a0003c2200184241782423e12000d6a222c2a001392223c4b01b1d8100cf8a02ed3bee489c2bc001766af0a145dbe74daea28bce1902e8722841607aa7e95101176f9ef5db830880984d646810453d19ec43210002cfe7d1ab412400a4091032b6953b38a14a83ef3c228bec9eb36c0824c135cbe0e001dd5689a500210080000811802008020000088e92170c57d194d1164ead2de50825546bc62252430557ab41743842259196b58208250a345d112083c4def8ab04135e31791502800cfa6f40ca7900270187155b4a9d9c488541f79e1104f64f59b6020986e74e106000eeab44d28010804000040488e80c000c8481484f8c004d03149861abf79df4a14cfa82d3628b39c948bc2c31aa549ba86191356b6a09087eb15e9e404b8caee6c0c017e43bc3e40084011032ae0ed12ca14a5acd46228b460171580823358c3d00e001fe6ddbe50021008000081180200802000008887182fcf54f0fea243cb1226ed56d3c6a9bf4b6ba186e6f2457972c50000015182c321262724d2810dee95ad82411055b615204133e68c3bc99002401048eab83b44b2c6296b35188c351805c56030c6089435040007f9b76f9400840200002047cf54f100bbe2060000006930f2c74ce8f0e4696000002a303c6a9bf4bd4d0c3737922bcb8d04ffaeda6ae302902d227830c126c43303f4a4009405123aad6c4990b18a57bd14030d46781ad60c316ec39231000200e4bd65002100800008110002fa3c50d4220e612203d28ebc4412723b085413082100400005510006ca200141242ec340420a11c0108d8081c404234021190100f8080045f088c18c45c5622c038060080224533ea21720827cdec0c7050c97d4e3bc186e3b0192e10167d4310e100000002310500367a565e18003cff77400026cf778d520042010914cfa86b7c209f37b14a414325f54df8861b7fbdfec8908000008c4184096171ae10167d4284a080048a32154000cfa0d4854801080400006d888102c404040007624454360ae1b1140588980f4901b853dc6a1a30fc4688feb090c0f9e89c9a46020449ea68d1140a018ca8f29080042825aa6b8003204e236f26003855d1f018002dbf4e4b7481c60a409143a0ce3a0058a3680ae6200c1f3caa21811f0ad8c12020f00428736f7fd0cb14d9df1da40472892394d12e5c600424041e00800006591120940c05e79677c28ba9314da3c508045da545a2083d8a37eb86860000057a8606f1c8fdce020308ebbb040700ef47d84b08520309005000035443e0142220a0003b52038220005de2220430291986c8ac1a0378410a75ca26951e9545953ed7325971ef2b4cfd8495c43255d980f310059bb22404087fe7d2ad179c9c259c8dc3d04a3a0c9244156ee0e9bde4bc71faf80f86a420a14f6508808fa6e63202ff886d8ff7c21b25e0f34091fadc53920fca27d8c51a00557f9887f41d2f9326e61618234d6e92e032fc2e81e3f72c577a753e0deb2401cc91dfc18ccb38ab3201d9ef612f890622b3347f81ee7bfb4e235f8e79dd460d12755bff89161906d5f55f8d2adb45c0dc853fbabd571b3e12408f73640878084380621a0310c01d16caa1dddca1045380bd8410778f8ea0904000008c46051b61f128505b377e3a4c008a702a70b82100022060141adc8a105b2f3480c282fa49ccf06979a0fd241dab4ea1d9410780200001ea40d81606a0310b01d8e304d3dd0c861bbe07cd05418283c153ff871852f9c80c7163087ace449d80a08280e2f93e0e10113f94bac082662b98af50700103048b2ab64801380e306011d2bca212b333490e04be84e340811b64ec590007402000018a6472ab3468258a16417e68f090800ae1020d5dfc66c64041f008000067910a0588480f8f788d8910306114e02988c30694b508060f0737adaa582000002310414665d8441c0114e04f089c1084021442a8897a260c35213958a116a5fc74105472dc3d32020f004000032c88402f8f7855e27a60c229c047630c1a52d1f0307846cb0d0082541e1670880000008c47004538124c1708200045115b7a7993062c7050c1c0a73a3aa05057728d8a92040e804000032480011d90004ae200115c4002db481d8a83803420e121060908280837c040024b04410c62062b8060080238b1855b322f86160000085c50f11516204132082452675a524143062b9155ba206a04cace05830d4cdc2a3b30200000018a7400013f9dfb69d6a4009c071e48000017c8e1c92462ee460d70371beb381434281a90e0000000c8250021008000081110205880808000ce088006c15c361fe0b0fe0587e80e4b7de9634f08089508623be85b7f6a81f8913f2945f09336d5709f725d2dea5e2db15215a3d888f80000000000000000fb192fb5ddda1c9b109f898d6800000000208c39b01e0bb02ee13eb6aad634123d6fe490e72f0141d51c44021c20824ecd6f8bbe47bd408560bb9df38c835afcf2428d50971302f734ec650fb5fa652dfc363eef9c4407d7f04801c4668d72d0f191c8cf1ecd5f381b0e179e)) <<< 16000) + 0x56a8c4b84961bc7818aba41e4c2a852d9bd0d20aa3a5968718f7d2588e229f636cec70944a4f6c41053738e2fc380481a5f4c94008842dc8d109850840200002727c9000002bd438743aca9bd63c6113458d73183552d3976a181bab01248d3803e1c66fd20000002ee0828c28480280fa018000c39e268db8dd9082ad0ce8b46802413ee8a3001f00850e4ae8f6611c45130a1660414cdf43f38e00a7177ab050034a51ab494008402000020443f0141f60aa1838fa572ef35030d1af94c2517b03450f07563e39e80c2ae85ecfd878e0c10012c7fff26da5880ed578e0e305144102c7ca2c2ff0612258adabd24d0300183bb2ede791074048018824225902f6c25a23079c26c7102d6a2b064061b7de9ab82011ebae58d18100471dcb02003595f9fce0040010000156375f060d46ec0b7577b08f35702c9029014c10810710208f04b04c020080340003cc87d00c0013a887c86c3e0241c61200072c21e62a000fea21ee4b03b2187b0ec384660d01bc11ca52c81420a1fdec51c011081080424617428cae0c12239950e820b75804b0468010c7d4ee28009979a929200f0232f14026102100800009b90f01507688a05000002310e183f391f61e0e7d40d6220003c21f8b8e0279c150a0000019041286100043192fb5ddda1c9b10000000009f898d682012041044022410c13402c066bd27d4b7ced77648d64b1bac58b98bedd26f6f60e10bc22d918201d4d2e8915f3f14ef4941100ea11cc440a33a5ac88780000017700a2821180a24655a39848916dd4aaa0200000005523041d00800004f90001cc200072243d4378482844a3e2460b620b22784ec45bc4060813a08020413955d964240d266a71484c183e0100e10501d82800054c8398480019a087a0ec3cc661e42b0f105c02004011230f375f833c12108ec26481c8a0054c23081f00800005310f00d07786c3b8361da120ec0987580e850179319c00a2d902a6555890cb174c774e7020053d2be84403df2252541e0003edf85e028c104a02890510192a8860dfbdb0aa10214df1db246103c0100000a43230179bec485102f37b58090c3ea1ada080d3578f835102e0310010f000000258026082000848cee7167d303665fae3482443932023041c0080730280002c48000fd10e50dd0e2cb1b81d0043f012590e082273313280cf0ee090848183e0100e30100d8080003f48750ac3a42704000006c8b8c3677a8ae1a0c2866b4f0f31a10250c44c198101646cf990411e8b14caea400b21c58572000000015180c005a09ad8c4c8012008266842e937a9a1000c9b661410b15bce7240dc3d445502000002cf94a00400100000fe3838267552180a0d15ed24003a0080e80100004310e705c9200002355691e382aec48204e38fc91ac2ceef1e1878f0c388367021bfccf162782095179338434880000006ddd00e00e6cca5b8480800ab9bef9b05dd20054050f1401c039c930af59f00b4e040bff8400b043b1e9a24200000167ca5002000800007e9a1c15017b36e24900000f1361e382876a703871f489f2a35c38232b01fdb9041112f6323a2600b70cbb50110000000bb8038015c79d718a4801280a2698f131c8dd28600001c918282cdd8b9f94a8102b904282a61050e7b68328091ced2dd08400000028a1ce004801000017220006d664500e76bbb290c0b242a94a418e053b3ee90326c96830b202110040398140001e24001ee487284f8b0540f27059021e364f4308a8fffb4960e696f0c2090207c0210b48e9bd5fd037dbb7e193bea08d25e8d2a19ad8dcf676600000000000000001fea67f63ac1c8171c73203614605c67d5e38a001bd7849dc82887166045826000007903a73d4f03236497f4f0d08b0d5e7c6ed8e16494d1360099c7765e06b5a1eea804440615a540cb8cb8740d59f124e1724a119c5d50003b921c81a0e305000267901b0d03282800427c800b1990e20d070868005f648700e837c040041e6400d56880295090b5290590c80200f486f028037cb486e9880397088149e8370f60e24b003017291d0d00000003232836f5bdb5f00ed7961888213016c587bbdebee05c63940ec700efc45550b745aa9f7838840a3842842824800066e42b6c203cd7d04d5b4acffb45169073c8d83efaf6a2100b9a49595e8bb4b11df794bd2cbdc441e8d472c494b85034a715c0c1afc9b0f0860a138735d240025c7de8518008eef161ca00420109180837c24c80c0705db0c60f7bf9317c60b63cd3c624002000800006890db0506d0280ec141b20a0d80106b8080009ac86b0ec354761a82b0d31186906c344360801b0d00986784c3380619a039119b32cdb0712929d896c60cab8098cc50cefc73394709fe62c95830bfd501cc0b0210586e581029916af8844001a0b080021943ab2123a4ba0295137f20738e23cbe0f0bc3340552c0000000000000001e463940ec700efc45550b745aa9f7838448e58c48c38a588488580177248900c9090a13132f74776cd23990e0499909738c4cc6d460020166fd8c1c7d97ec8ae085b0c44f3cffcff7692ca61b906595f7481181805f2c89984ea242473fa334d32c6cc69b0d50c13473bc1b34039908a5526042000869000c12d10591436a00da48e01e1fcf840ef333d98e58d1bc65bdd28010004033004000224432c24194130c90586400c31c07a58032ed40a9a9dc2892bc3dfba41dd22690548fce82f0eb9c92001d4f75019e561a180ed0932c6d39b243a3a6dd894082726040676c97fa29934809e71bbe35435639e0035cca9fec4d4c24f)) <<< 16000) + 0x1409043705861200461d678a248cbc31f29e400465664e34822c8b031a4900e40f342c90e3abad0ca18100000de532028e1d422e34001180403180400035c42402418a130c405f12032b776798483dbaf224490872be8239c39efe0ea0460e75706f7a101577e8ab28383afb3c76a16002deb503650001075c0504006cf77b80005428440100001f73850032466d86123c84762b1241e1170cee70e0381e3891838abcab9604053d6067ea06080899437b3801100403100784907d78c94510058a239f1240f9fb5ab870e1cfe658d983867a7f7784054b56b522860905952a22500112a3159940211004000064c86184830826182120c0050001bd1000a412001a3a62d54fbe2aa85ba38077e231ca0741c12062051841442832031c018000009df43e21377864c7ded2f56bb33960420912433a00031a42fc640024d842f8778418c35479bb1c60d42f884053ed0c24bcada8e78c4805c42bb40884c1813c9bc9b4b8902065464faa77001c0ec0ff657a5840019d93c48cd1e444004271041a1701e000085c85e98c2f027c600a2b54e9220167ca6ec71172b780762055c6c0011900084021c623f27eb21225db3d0ff8710297ad736207650a68201425fc76d258812282987ac60018c338a338010804000056c85d82c2e8160760b01c0585c80c2e007852bee69a7101d8e1f4de860c63498bb01853b644ca11012ad0b7c6060abd8cefdc701b640245a0004e3842010000169216e420871905b0a82d4441681a0b30d0590682c4140009e842c0e415e1a001bc820e2530ae298569482b0a60d0130ab098550482a4071ab615cec22602b660db815f534e6f52088a22a95eba680b85a474deafe81beddbf0c9df504692f46950cd6c6e7b3b300000000000000000fdd5dec23cd5c0b42c71c21800400000002d05b7fafeb28793a59548b87179026ffe1ac457012849d9c472640a273cd99a8d7c9023b118a2831fa7ac3f03631acb23527cf7b7db1ca4ca5baeddd524fe382e924186207e4895983f972204910203ae40022255170480840010d240502289091338c09b2c30d8e8130208c108002000014e6038533de3c1c24416802a0c178f3ff0130037c6ec3a09020800200001aa42a034036120a709053008294040720200030321144b0a41984488c220361461b0860985100c21006106030a10158f1f308307ab3ce4d30fcb10994b64f1b986835cfd0814a3794cc8caddd8a7921810d3217b33d230d2ea6e58045e35f5e1c9b0c80e18903c6a910fd2189be7361900401b7d7dc5702bfbdc405124108d86cbb31be00b50002716946a74071ecf959280185047b8e73c4b0b06923196d70118486dc6cbf1a1873120a68a0fa9eb526a6800623dc8b2000ef8a6dc80004c4042010e288b445f9238b12d9e2dd1442323779f9c00bcded6d0700a86427d400128c1080438a00da2284285db4ac0001c5051653f2144ec0e87ab009040800201400a05705800081901c15000120909f1984f0ac274261380309b01c860a2ff49a8cb9ebcdeb0df92c20e8a1c0d19e663d021a6f54be2892c6f4184c67f3bd456f0a7e006173e4534c9801885cf7347d754b534fdae2426e83808378f887fce19a93c774c2ad9ed0c007ad8abdb146f75b6f741eb5d4d001196ac5b8be7f21170185c93bdf404a17841b053287f0dee774e0f69200056cc4a683069f163c14cc68dc27009a2d00022a10008732082820403901f1880f4740018844265461308b0973984b12c25487c31ad03ffc18046c29511c7002ad7e8fa20800319810804240b7e3b457b54f680134c4ee031774462bbafa98ae7f1452f2448eb5eae24e411d56080d15b369609aabfb9c56d75f5d7fedb7e38ad78476a4e995891dac3f2bf6eac168833f8ff41846e4f7f4678991e74c9692ecec477cbf15d3f3cae179198a2a121073a860107cf03321041d0084483142f869a04020bdfa2001d00840000401000004440002c484a04824c2412403b1aa05641e20002e700fb38062405f1408180bdfe840090507c0200001ae424437a0325ab721b90de2d884280a69267f1297533a730717584fbce1e5ab875592c8dc35b36cda1e93537f826151015fce862910914c4a6254ba8ca2616d17b5fdb045cbfb650640b05226d0e8870a8571e16257de63a104e732c48999013b04e00a65b1f08800780210000100400001110000b321201208f05c07a0c7a4aa18006845859d02210210080000421f1a90b6e77c58237c9fd0b3802775b0c400118a1080400002c88470a80014fc8003dc108d21f42897329b678cb6660db815c77adebb411011ab615dd844c05705ce6f63c7701ecd042dff3bbaa8134fa547e68c0ababbd8479ab816a02deebfc113988449d4655726fbfda0fa9019a01000e0000211ca041cbb936f12b766ad6fe55dd8882b3dbebde8ad1d52fa187620c1c9ee176bc0d2db3a8410e912bdbd31a5e7f28afa9d82756e97158783995807b9c97e6d5989e8522c7c50004ab211832000ff621163bc090467b74f73ad239af1c64bff48c5fab9899f735a3063ed50d57f476274c3e4012d40feea3ee5af612cad343c14f617cafb8d1a7b753e358a1ece3cd50de47a026252fcf8a37c3bf4dba7a515e95879a98905face7bde4b5b0add682ec3784200221e7804d48db581e9b1e4715f3294f2681be2a7b31c4b250f637ec901268946b71c74160883e061b7df6642b4f37c2ebfe66a8ff40ac32adaadc471ec6b000050021146b089158440ac21c5610c130850904200c20c071c14783bff31e3adb84800ac2d23a6f)) <<< 16000) + 0x57f40df6edf864efa823497a34a866b6373d9d9800000000000000007f18e503b1c03bf115542dd16aa7de0e19438e20811a00c0000000166a8891db5cc21cc380e9560203706ca76da96313efac245c261876268b2a035ed183c8108645a632a0516aa79bdf7564c09e17a24b2f3a11d883c4d4b607c9f0c302db5a21012cbb723041500802f80e0080200880dca865507000fbf636200a3a79430c00b4894e92020e80400003188000819a093e748289400430828e000a7c7cad811840f804020404000176420047410c552d6228405c807e0411dd2ab5440348a59d3100008f985212840f00402080741029ff03138123e23e7c101071ca84c08c307c020000150415c060003c8684873dd41408ee0e0c3037b27491800c8043440bf9e8b4a04052ac4d101c31daf7810136b5353900078020000192707370dd11802485d31204190040000359f169bfe191e0134ab3528068655c64608360100810100005690800dc85853d9231c0002a575a44083c010d08244ead724103eae9dc3060eb34b90404fceeec0901078020000196705c723f2e381c45fe098a007ff17c423081d00800004f905701800116101b110002999816f2c445e2431b5df974a0becd5ef02013dd5bdc0902bddd5b7000251c1e0080000809000b0d20fe4b01b1d83f0ec1f417c2a4e9590cc0a27310c2600bc5990123041d0084000040100f80300003730000100403d80c1e80400009841e4360361b03b0983c04b446f08d798203b7c2f798b004fd1b160e01cde696f4024141f0085172a258821c10b676e2b9000f802380247dcaa10048426dec50151f28e91800e804000027083b82c1d8160ea0b074010000c010050180014399184f1b0b0ca1056fecd486104adcce58a048450b43c90407b060984028e7ed0680026182000848c0d58f29a5081f48b12450227bff52848242ac6e922817072baf400128c1000400004248398680009b8d0302704410e0b4e512ba50009dd67a800031920f00400002c48391081c4240e0020007e120de3b06e01d90238ffa9c93102015438f7d2428403984e8b620e084f5e5e054c202d65569ace8860ade21c21e24700daa9b786218205679ead3358021f42060a80b1420aeca6da8a125e384dc08142bdd82d811861000401b40400a02d300b5806c111a617f8168a103bc8bd7461032f25e0480c3d1d7494701119c6eb80b0610002203160385f6983016110f08c29181d4368c2413165818e08a16ef51080161aa29a813061000400004c0c0522fe2c2e1832ff7b3f21438ec4678f28132dc1384380142fef0b0250c200080360080004648001d6900049d20d63b029158350ac1a4360d00b0670580002e884a5f6a48103af8123646800e320eca1184100040188040c202f3803fdeb226921a76881238800b9043b9c3031c51cfcd18539d7c529860232b624103bf90c4a5120123a2b44428082100870c0b363b8a3460553de180e306cb37f6530c698f72002074a65a2d4241289402ae84c10420100001333851e2e5dcc0c2b28e29873012df745be08c20800200b6020000bd20007664198460ca23c1803e114b461429ea1c106084a4d3df4407161e45f49010800200c80301b01831808188040c202990685c4efb34621fface712200388874060fa17a593a80403a5049624020781d758c001c9a65b4027102100850905db5cec9c48649f9cc871299eb5c768860586fc021c22dd9307492821080420780581afe8e1c1b2ce44e3891cb1dc712820192f46e0e11e7e34d90f00102178fa20056a869d32704210080000af90600582f808000aa4e0f9d69e5a0d08aeae50ece04096b51bc100601b40b6400200087194b45ef08c1d293b7253800af762fe1811923ad4a4001f008000066105e0582e82c170040b60200020b2000c9e4001e9882d10f4c01a29d796311a9dcbcb1382c819a605a5ff6633c196000299405832d9fc9810740200b203e3407d12ec60bd9ab321185205bbf31a191811088e0b34dd99c50393a370b181fded2d693820e804305a55608506147d1bd3c343217538c0e09ac2a966181ac9ef83cd00303c47c26041e00800008f900027c2036130580102b80ac44d72bcee3020fe340592c230bce973200021614a71c0918081a110019d8caf800984080021230fd7974260bb5fa5950c2d485571e6868d769ce92020f00424626456e2cc16937deea185d8018cd8d0d26327eb3401387119c9410780200001ea4158160aa0200020520761200036620a81a053010003d7905211d1232ca097338319a477d48a114b278e48804d8f4a11c10202dcf4ce2c08ad430dc00000131610804000051481d94814404002c1263828f077fe63c75b7090015ca1d59091d25d014a89bf9039c711e5f0785e19a02a960000000000000000f1fc82edc9d08887c3833f415d6f6d7c3232836c00000007291d0d075050c80450460010379c9d49daece34c92b527342759266a955c8a06efc1b0fc3924b948e4cf531b19500010c817312dd90c493a0bfbce2777998e1ae87e67ce9d4c043472ecd7452816a42127a50500902784c1381609a0b00005d8c0be02aeb7fd532cd97ac3bddaedaea787980f7f5b6f27ba50000610c454202ff6c5ba3a11bd90dfc2c462072679b24fc0826c0a0000c082932914ae8c176acba771ad2668f01d3773e5533f991cb2400038087652d42a19ff19a1b72b09d54de0570b4e7ddebbdf973110000800067b256b5a1a16bd54b3fdec7093591d14fcf16c36e72ed6c68019741799a671a16caad1cf9468278625bfacb)) <<< 16000) + 0x86d648ac95cc8dc16ba28ec8a7a7e812765825837cae19df40a6969f505fe298002026f9e3667080b29f9fcb48e420ecaa8899fa71cf400042ccf2b802602f8d09147612a431fee997ccd1877be481c9023385612c08190f28c6c1005e213cc94026102100868c0c5487ac50d2f7809a650ad7bf077a1023e4687e401208100040000364f1a07d080a3e346162eb4197983015dab70b88080b8ee03c6283414b1f3c22004151976898a0172a1057c4a3821280a3460dc125202866abd094b285877011662020245a08214192a5198225042000800007f902905025828128140005ac41246609023d303af1947d014062ed878c14f0b84418b109a889e0830670cf15dc703fbca0e8c401ff4dd39809c3080021a305ba983994333bd2c3e142dae584489a106a781230481040010a20313058f8d1866e235cca18fbc7b3d0a1788e0f4e0d041d4c77489017e1fec3c260820008000096900021d208e1204605022828110040007ce40a4340861bb286619b7f8714f085ae2c70e0cc58a3c70b02401e64c030e47b9ec90027576cf8000b1df3ec8000009cb0800200002d64002be08008f2104215000b8f900348f20828a0403901f9a80f8c407a3203c0d002675103b31017828018f5cc07d104124e59d0fdf43a820605aeae882894c58a956482a0e12135d31ac67d408382b32525f2ef36d4bf53820205af532b6edb84cb74030176ce6e78b9e591b3f3028072ab7d9d6d5027d6f748a84555e1c2ebec0e76ce408037e622e559e1109099351db108b428ce7098160913ba815d6e3622e51780e09871662f3d03f74328ec8189ebf8e03e930c3f68683dff2dc14d9c202752a4ddb76e7bd264d8b5ce2baa07ede3d96e66c7096e8d9a66f15f47e0b1bba40a8c60215870168a68cfc81a29b9f49e89fe9bbc582cc98c69a1c4137b5fca1ee149bfffeb8eee57e57b3e208020f9d0ae675e7f6f38a4fdf179f93eb48308aaeb6cf3803691b65158c18ffe9182a35a232e10428a22caaca3151377ece73e2e09f45c71adf75d34d5a7d819cbcbf142c600d0d2caf0cefa780240cc4c8d4fa38e780ab0aae1e4e05eede25be23b43883f302ac128b961b84aaff22129521600e8160720ba17a1508b41810e97b400b015d09f3f1005beb79ac002d0165ea0100094a0780210100100401c02c0dc07c00367c4ac0019d4208b848207801006c1303501c010040100680be2697345225007fa0b0608820740200000ee40a4140001bc40cc1400036060380200800002220641a0310d00013f10003a020600a02f010005a6902e3d0169880b0b40565202a2501492c0a084036420271d013048094240480a000fcb20111b8402b014f2241940ee09dccdadd1131b32775b2ff8c68c64c87534000000000000000000000000000000000000000000000002e88c10c08a08808600400002a20023e813cd9b7f3853d5bc72996cf49a799861b7e65121c29ac76c8d23c72b0b26ebfaf6970ce5990e893a7e6646c1be45aa9e3c5ce79b45d5ad0a4abf1b3ecd2ed208f306a453543d469625f3c00000000000000370e755444d27fa55a6bfc5b56040e7f4e2169afe6666ce38000000000000000000000000000000000000000000000001788608508104400301503df38631c187a158e618de11a944ddfcbf2ac946d274c303c98c90bb59f184f417d67e72d20ff1b8057dc3a8e52161dcf3dd26ab0014bd7a5fd4518a620f16081c322df14b3e9c0207b5b9acdabdf07d97a41164ff3f463b6c942c44edcd974c2d71776f271051e9ff023aab7b91cc105c430e5526a989f23f606135a9cced204a09cf7cdb10202b8f46c22401018457971c0032c63fca18002b8f3d6200984090021456d29598970a200000172a258c1055c010128643a6fd2ea06186cd7ab8d060000000eaf3300128042c803cfa57d72882d1a246bb2c601a24198d2c5034471ff00c32ec203dd828086dd7030d2400000009609c00900200002e268ae4c1d1e35163041578b3cca190e9b69bde18621cb71014201000005ca88c0000001d5e430000002cc6b380128042c8056ef764c451070c15b0d3cb1810789b974061a494340bc2280a05893f0b648000000177001000afaf5bb151c009c0500003124000c7081184808824000c684084560402b01f1580f02e49f697f636d0168e2851709355f1e032845376982a36173600000000000000000830b48e9bd5fd037dbb7e193bea08d25e8d2a19ad8dcf676600000000000000001fb02ad40f0ec32415cf75805851f79b48fe062ca0994ed2000000000000000007ca8ee83a7824f27dedde34424a56082a730596dc62223c0000000000000001e21221020e20c08c000151401006d15cd1142aa02c6082af301214321d3752ef480c0000177321860fc97d36c180000003991020000004ba509c109402164028b4b733345109180cd76ed96301b5b1162ec1866b11143ce40a0836b54bcc8e501a0e4e2f222920000000753006438215010000068c80e84c07017456d295047f8a20000012e9458c1055c9a4628643a6f88cd901800000913c30c366b8f75430000000732209c2094021640261c76ab62883860ad869e58c0c40c127b430ce9ca138e01405034d7910b240000000bb80180082b1d1aec28e104e02800018d2036120003392000d6c4068340321a018090005c590170100b008004ef080a908050640034f6404d040247a011390081a803cc401c3a00d190060a802c440141a0090d00404801c0400c02001f63200aaa0044900190800844002020000100ecf61)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 39 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase1" = "QuadFullEightCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 39 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase1 private def zz2280:"s08e8"="s08e8":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase2 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l17 l22 l27 l29 l33 l35 l37 l4 l51 l6 l62 l65) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1d728a784c, -0x59682eb50, -0x319ae899c,0x7a9b8f18], ![-0x59682eb50, -0x2a965dceb0,0xfaf31fd60, -0x5b2521508], ![-0x319ae899c,0xfaf31fd60, -0x303c9f346d,0xa6967d720], ![0x7a9b8f18, -0x5b2521508,0xa6967d720, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x2bcf2460,l6),(0x9b7ff8a,l4),(0x6d7dbe67,l11),(0xe937f384,l10),(-0x2dd46ba0,l17),(0x19c77c894,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x3a985eaa8,l62),(0x146f41bc,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x3a985eaa8,l62),(0xe937f384,l10),(0x19c77c894,l22),(0x6d7dbe67,l11),(-0x2dd46ba0,l17),(-0x2bcf2460,l6),(0x146f41bc,l65),(0x9b7ff8a,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x268051006000000110f014c020001284c12016801800000001e009200c00000001b00490060000019024030c0300000d40880286020000680410026301400000320580e1806000000190901cc02000000000b00a40100000871ec068301000000451e80a18060000000f07028c02000001141601660182844606100f340140000000044039004000000088004c8040000000002206400c8830c10405364018000000001c029004000000002601c80200000004c002640200000000013032006c4206082029b200c000000001a01c80200000003400264020000000000d0320040000268240189809420a404200335006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0xa184f210ae45027c06b0f4a7769dff90b53115a16b6e8a150dc8080479104778977c594a78dea9a2e432824530817d3fbc89ab6f042eb5d476b59e5636d00033b28abd050122157a286279626f42913b2ee150d716f2f4aa93301011faed697a5b8797cebf18826d74451cef82e47e7b8060d8869201a7672d850424c990940c71404c213959d4bf25cbb61920934c982589d769ded978a1950438822fb5f69afe2070a5f926c0491861f82d80b2060cc42a683080826442b08724116505f70242000489f44ab09c20980210454a23756c7858e00000013b010384183a85c1240c0b5988b888922041ca707e3848605e7985031161016b6eb4a004821b68217b6d12006cdeef0d38959082a01400010710003ac20420bc368c8d6ccf70245039864c72c030a09b451c84489102daa4c6f2d0e20a79b964f4c1840c501e2ea2c18013dfb9a703c10000d964cc2380005c6b943ed440749142b01800010e9b78fd8b3b40520a9bda9734e356060a6bd81ddc9582214eddcedef6c7353000000000000000000084e4299ba35a20599018c18c108006002005b03637447ff6519f6aa561f98340774c266d8db4bf8061500684a8d5742919422bb0a5ff4b73127972473fd965e081358632caea0006d66f488328bca02dcabd24c305cabd24c3034322ba7304800000000002919008d33ba924fbda4991ee1cc1541861c31c2102081140a0c6063b335bb528149133c82496c43f22860ab6e05adbd7be9fd7f1c175551339c35aa06be16a39524450002f23054ded4b9a71ab030535ec0eee4ac110a76ee76f7b639a980000000000000000004211821811010c1180140100100c805ce371347112dfb2c137eff3ff495898476c17a087206711680012310200d00f82807805c2a56eaa5d920c116e8c76f9305084d8a06fb5c40026c502565e1c0471711fa560a004d8a07c03d0ee4013179478fc70631191280314fc57ec205203091cadb3268bc0901bac1f69e8c01c3ce97225268e2040a0f4ac9e70304979662830a0c055eedc5a0c3070fbf188f84f8126dd3d4e895830ac0a1238ccc37114e0205172478cfaa23882960fe5bec080e7042483ff78e1a03205710300c102f946c7680082d1021aa7b800a78480380413870c2b0240000ed10003c43868af18d6f5c306269727a9805080d20da0828a083bac977ab1c00000000c803007e1d768a4020000000019020055fb357899c409c02003a020001c920383301b1580d0ac064560302bb78fd8b3b40527a0025d44aea6ffa158827442f9feeae6b83b0c445a4fa89800000000000000000847d6cf15a0b337e4282b104e885f3fdd5d33613ac78ef6559a000000000000000002118a19000e00a004009ec8b06f123d5021109edbe71c71c5013b4806b3a2a729c02b46a39a90dcff481047b63d1ac9ed53217f89efe88aa0a3a393cc9bb5a4a8e6e9bf504e3c7a28f741f5378c5fea68acfb302389ceafcda086c0616ec2f83e121ee445483e0d9a02e028225a009344656a1717fa0184039604f64211685d3400b00c5b9a2bd0d2fd6b9adc1c0005513b36ecfea15fff04002caf3cca0d36b46cf9d0800408af4f5ed356e4ac8c078e49971fdab7465f821ef548f0f9704a289dc242e2373a6f4906184e0b840300401002c0b01505c939bc9b5afed60a5a0438c359cdffb3db8f553c3e38fe59404eb545ba9af49c3021a30c0060f1543fd71964b6e7f79ceadd56d4baed7efb9fca849abc968cdc0779bd42f7d7e0010381523dff9b86d490f05f1efe6d9ae8ffc19bbcf9ca377a98354d8aaeb87616b060023aed492e0b1633077950aa7745aef21e471c464200533e358cf29c57b13c421deca5732ad655f5d2197c5ee9ab1077ca552d6abb07a53ce489f85f3a1272ec4c5438ed0000ae44001764de91065179405a0a9bda9734e356060a6bd81ddc9582214eddcedef6c73530000000000000000000849ea942a5dd2913f4af41f483e31734d0bd326d9a20de74dcb0000000000000000000000000000000000000000000000000031b90a66e8d68816699dd4927ded24c8f70e60aa8a28600400200482713f01c2a393ae9d59b80af4f8367a4493c29183df9a4ad344470f10a68aef3e4c6ad3613a88d28854dfa452c91a9540018d290903bfddeb29b9f8f26ae0d153ce23eca9ce3a4739159c36a45d3b4f80412d08eb5612d3558f9c4c273aa95e5bc193c35b0a8a83b4ec4d0007033040285a18bf2f31a3df6cc08aa8e4a568de3ddc9394d640ec8af78aebd940edc99c78a3545496fa7808484777baa20627db569c54981a16ebf85bb020a5fc2fde60a0afa506a5c052ab5c2be44afb18ceaa4defad5bb06a5b14438115189516ecd19fb491f98b6a4e00ca66527839803d8278576b2c6a04000912014609c72062f01fee885baad02d7269553d2cf7573ff47398fea504150ed48184760a0ba1179f91fcad6eb1b8cd013d0155beeffc5f460a0a064ef44e12cba2d374d6c685722c06183439276236d9de3fcb8055755ee7fde7) <<< 16000) + 0xc1a79484ff0f16a0e84079c5875c723ca1d2ea4f99fbc795f8b962cbc3cb32cb99ebf8daeecc0f4c466920a0a2951b3b402e4bda16b412c5649af7925a2f9843c8bd7fc36a2f611d144c435320f5f3412d190e8b62000251c800cc29ce890f4f4d32db645ac50181ddd91c6fd73fb979ed0c8c8567000000000000000000443eb678ad0599bf214158827442f9feeae99b09d63c77b2acd00000000000000000109298914d4ccf14e36361d56e85f75972ad2d30e3ff0427a56231800000000000000000000000000000000000000000000000000006831860c31011c018015027f3c9eecabef0a413de01647e616ef13cad7a72e5185dea2b83bb6f444c8da13d2e5cc0c12380654c09a77fc08eacd71a849dbcedd720a3e6648447a6cf200300636c54af480f9225145cbd0cd6ff5495292aa028020006d02004c5e400b96cc8c13e82f9f392600245050f987c4cb3d1902d0ee241a7afc650710098dc6f1c1f70028803bd1597fdaba00828ac0a2795d93800a009f944a836a4adc30019005cbd6da70004477b43831f00a7d9804021c82e207051bd13701c729d2514502468fa4335990c367dd00bbc2411ea8ff2a308000000221900004a4f43c49c00900214300000029fe01236832960553f8e20150d3452c0061e0919a995e8141000000295cc0e104fa22808b0120b40d3e96a8812003f1938d5d186000e08caeca06b920058050000221200075a404426026130100980782ec551b37797a15b27bdf25f03d81ed8948b6f1e0b66bb9d421000000000000000000000000000000000000000000000000000c8230a28a38808220018038532aef84960558691b2eb2a0ccdf2343fa3267d3642a6997cb609b122f1f9a51739b549a5f8130715b08f183a0297d6ddabe446c77698c2a4fc4989a4216805349337fe1f0af16f66d5ab90373d8d9b535e5ebf1614e9336809008001310f2af4930c172af4930c0d0c8ae9cc1200000000000a4491481441090c60c204500301d452197ab45c603c658da551e2a13627b9711821c675c9b09768087315ed0f1bc65cb0040a00656eab8206036fa514050444d14e4181820000157480820992d39c820002fe8f87738012004287eb26f413230c0016de040a147da0faab9028005f77dc28260ecd5d765821c4b5b0a030403d4727380000003f98ca0008c020000332646973e8dddaca10000001c1424417ca324750710000001c200c2000000a270905e0c3775e828000000000609002c9e56ac703d4dc3a42c804260100000ed900051b20221b0100980782f891bfe6ad518983e0bb807474008b512d5456d672279350221863ea2147c0a1800000262900eb3ef2b834a56506fab840f2b20a7e5f66a862bc025d1d04040ac2697f5476841ea2e0bd605369bc5479d45719abd0e3084e194df6a60c008be8cfe5e3360bd12b54a68dca20197820089b9a7e0ecb9d2e752de1e01800ac26b7c21d81a109c78d0a8411c2097dbcd9cfaeb739122c7e418257e00532d64f14e46fd0df9a20dc04c07b1198c2c42631d9979f660931960a405839b1bce91123b39183f8511465e6f0ece7315868f87b7b45841bac4490481bb2e0d4c97972f1140b66821c74ec957e09aad4cb18e6ea29d464000e010003d39000f37201a02c81c2b1f4cc773593cdebf246ffe046d62e0210e18610a008006002916205ee85910909c03fb192b5d90370df2a741c4e894a29fc2ea1453222365147d29facfdf07413db54b77ee4f7e505c49ecfa903609968de850838563e998ee6b279bd5fa1fd6208cd30c00572af4930c172af4930c0d0c8ae9cc1200000000000a4640241452040c32010000904fc3915f363ae5f091ab3a7d5efd5c5e7b789fd8fac9025fc88a32ef59258c42c775884708442e5c1d6a8e5a12f6c551b37797a15b27bdf25f03d81ed8948b6f1e0b66bb9d421000000000000000000000000000000000000000000000000000c8d62e0211431428c28820a186004076109f7e95d2f400ffe979641cef85488fe5b1304427214da9fc264af26ac11b17bbf79145ceff0d8c833778a169dd539e9cb62b10337708e532ad15c995f04218407b14781251081a7428e98280bc6217e608117e72650e10cdc4ce402805bb1ab404e0044010a1ca9b46d5f20726d3f31b461a051cb9d41c2224a74514c045eda1aa2101009541300b0104f886b91802609818ba800220080000c89818852ab545b9c7183ed40ed477c8160bfd78eef505166756567b93860570766606820b0000006de891c60020ae7620160500b071ebee04dfa1008580580001ec2000a2c4030360161300a05f1009f9d2f21445c32122a04104687f04a1838b8a5633830cf3a84d84180225f42a68300e74b2a25152714220080048080006048005759000e2e20021be70dc2c393502eaf06105a4c6f4f19f30e180eb176c887d51c200000016e360030471b83d3eed7685080000005b8d800600173f5d1c3891040008ec428c46c8ce2100866070c3586f63a40ff136e171190c2028f5f40600429f417138e100000006257df1e7c5300c112c580ed1e41695303e88a100000006257df1e7c530020806b2e3ac51cc855ee4f0c00712b4cf061e6e705822800000142563a11b547054fada43f19382280540000c7880404c01c2600c0ba1c556c4d40e80410000001514a0c081ae8069a200a0da54dba0d100808000002f7600a0443dea6db0906001ae803a2c0000063bb74969c0811f006b557c3448142c02400010e90051500200800c040040200082a20020200001001a321)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 15 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase2" = "QuadFullEightCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 15 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase2 private def zz2281:"s08e9"="s08e9":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l20 l21 l22 l23 l27 l29 l31 l33 l35 l37 l4 l41 l42 l44 l46 l51 l56 l6 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2ec79d8cf, -0x58a3a8958,0x731c6130c,0x4ac85f00], ![-0x58a3a8958, -0x2407b8cb96,0xd9e0a332c, -0x596316726], ![0x731c6130c,0xd9e0a332c, -0x2fecc8b7a1,0xa5d1f7528], ![0x4ac85f00, -0x596316726,0xa5d1f7528, -0x2c51d4704]] noncomputable def hinges:Hinges:=[(-0x2bcf2460,l6),(0x9b7ff8a,l4),(0x6d7dbe67,l11),(0xe937f384,l10),(0xad62205c,l14),(0x6417f29a0,l13),(-0x639f7332,l16),(-0xba7a412,l15),(0xa78eccac,l21),(-0x40bae57a2,l20),(-0xd5c7c16,l23),(0x1813e4f92,l22),(-0x2c51d4704,l27),(0x2c51d4704,l29),(0x2449df82,l31),(0x2c51d4704,l33),(-0x2c51d4704,l35),(0x2c51d4704,l37),(-0x5dde2b65,l42),(-0x54685d58,l41),(-0x4d3698,l46),(-0x21c59e2c,l44),(0x2c51d4704,l51),(-0x132ab960,l56),(0x247c896c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c51d4704,l27),(0x2c51d4704,l29),(0x2c51d4704,l33),(-0x2c51d4704,l35),(0x2c51d4704,l37),(0x2c51d4704,l51),(0x6417f29a0,l13),(-0x40bae57a2,l20),(0xa78eccac,l21),(0xe937f384,l10),(0x1813e4f92,l22),(0xad62205c,l14),(0x6d7dbe67,l11),(0x2449df82,l31),(-0x639f7332,l16),(-0x5dde2b65,l42),(-0x2bcf2460,l6),(0x247c896c,l64),(-0x54685d58,l41),(-0xd5c7c16,l23),(-0x132ab960,l56),(-0x21c59e2c,l44),(-0xba7a412,l15),(0x9b7ff8a,l4),(-0x4d3698,l46)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x11032004000000015c02c80302844606100f340140000000001c0c801000000000380520080000002d0603cc02000148561603b400c000000002a01c8020000000a42c0b3008000002a85808cc0300000002a00132010000002a04c04cc030000000002c092008000000000540c801000000005f00b200c0000002e0f02cc020000003211036300c000000000240c8010000e4361101c400c00049220d80b1003000000545830340040000000029018802000000000a8052008000000002b018802000000000a40e2008008312c12033d00400000a478380e40080000198490048c040000000642c093008000000000140c8010000000b42809300800000002e140cc0100000c87c3c0b4008000000003101c8020000000065013200c000000019002c803001cc5810405340100000154410218c0400000000098072008000000098004c804000000000130320040000000000c0c801000000360e009300c000000000702480202b040841011440140000009824088c030000000002409200800000208840b0c030000000bc74053008000000004403480300000007c34053008000000001e01c80200000001e001320100000000003c0c801000000621102c300c0a20ae08801b5005001482a04803d4010004d08c1200c9004001502705006d4010005c0a01c01750040000000026009200c0000001109018c02000000001c009200c0000000012014802,0xb894b0092301400a20981302ed004000164a214036400c00c3230550355004000000c64201d300c000003110c054c0300000c9218045301000003348200d4c04000000ce43015300c0000304890194c0400000c42180953010000431c858091003034c528680348401400001945301a0c040000006629014300c0000001a15014c02000006d16c0683010000001a8ac050c030000006e29034300c0001962940920c050000000000d03200400018e2840920c05000050881024c30140000014884050c0300000003c1c0a3008000000210702cc02000064240e01b400c000002283808cc03000000260e009300c000002202c04cc030000000982c0b3008000000000502480200000210540c63010000010421025cc040001304219012400c000000110d028c02000000000980520080000000025038802000000034280d300800930981202510040000000542c0930080000001109024c020000000a42809300800000002a140cc01039c6582c00d8401400000000270188020000000009406200800002e1b0f02d002000000000b4072008000000017404c803000000005c00b200c000000000640c801a0c62c22406a74018000000001901c80281c72c1900198401800039158280dd003049082050002b401400912042400ed0040000000a4940a30080000000084034803000000000900c200c00000000240b080300000000088072008000000088004c804,0x421d036300c00000d42701b0c04000000000640e2008000000001b018802000000542500b300c000000161201cc020000005821013300c00000000b00248030000000036009200c0000019024030c03000000681100e300c000001b84402cc03000006a044014301000001a8210058c0400000006824063008000001902c070c03000000064240730080a60820c409190050000005219024300c00014e2040920c0548435411403524018005611c3301a90040000a84819015400c08f0c609406c900502a04a869010a40140a61221b40329005001504d0dc04a40100ac126184062900500164480c809540100000000002c0c8010014c3208803940100000000016014802000000000540920080000184550208c04000000622d032300c00000188ac088c030000b88e6008930140000000b8004c80400000bd1cc02930100000002d1f02cc02000000000170320040000000d09028c020000008239014300c0000000223c0cc0100000871ec068301000000218ec050c030000008239034300e5818d14d02a910060000638a7024c30164c18b14b01e91006000000220a00c300c0000000005018802000002105003c301000027a4440448c05000000984400b300c0002664340248c050000009e41026300c0000002521028c0200000000a93033004000029c9b01a0c04000000a64b014300c00000289240d0c030000bc94d01123014000002f95c058c03,0x4e0440163010000000110f014c020000004a0900b300c0000120110058c04000094260900b400c0000000078024803000000044240a300800000148940d8c0300000009484073008000000d854050c030000003213014300c000000211d028c02000000000e807200a011d1058036490060384688b200d2401400000188b40d8c0303c82282d018c4014000000003002c803000000783400b300c0000001d1901cc02], #[![0, -11, -25, 22]]⟩ def dynamicCode : Nat := ((((((((((((((((0x38cfcc8f7c04a15150287e7102a5107027e1c5188bd753c38731fa640c06005f225c000a00de0ca29005459c808c02164c457029a0092032c04e4b050e37e7131b324719bd1a8571228798364118a088c1fc85463800583416300c000b6186dc2aa50304a010b25e9852fcbe8c200000013b00922392d080e78a1c0092954ab89144cf2df95ccc0c4ee2d008b0a0a9d0f3fcaa8908f8abeb372ca011763c79f78452a91828018000102981ead8875542c6a4004a1a091a83df625e20655c058178813ddf52897241ba5ea11d44013ab2b2fb014671c220080000b8900056120a23b05b1582902c168170357aac8d99b06141fd0cc8f5a488288e77c6561c4243314ddd70c210b21e238bc60830be5f96484826937a9126a0c01f0e19581900008d05fdd3804510419a4d0a406000043877e8fa99608829c5b86e6057616ba94added5daf616ba94400000000206653fddcb7302da5f1a834a8bc2f92ec8141541442031410c008001445cfee54f4ed15de2fcc0626586e8a981537621715d84597c044c36ab13bc49c9d270204b4064ccfe86b2cf93a9c5c9394000d30c0e150e53775bbe4b077449d991ce6f7758c13ce0e1502163daf653f9589717e21e8fcc02f623faf014255a7f20fbd45b32c4c80c75c1b28afccbd9a5e20444d6cbd7045947369b3ce97e72d29b6d91976c2042b4abf940505eb00c4f9c26db3c1db3cb2e3b00a20157fea64781938c49f6d9d2868fe9588ad6fe40020dd86e52ff211f3afccf86672bf3253c971d800023c1d85aea52b77b576bd85aea5100000000080450c608604404304600500400011440070800200d00013021a6230d20d06886c3402619e0a0ce015108532153cc0e16937e4472a182508ac26ba810242b12c6960800205225d9c0e0641c303fe004000090c65d0aa8022124ec4a164395ebcb03e72c2701461788f3eb554f512415774c6aa1f058e0c04958a17e0e3b8423763c52860c7e188dd2e1c143005dd9932e5c408a83eead54048c2000843b7e3b650030d5b853fb75852400b80d1441259c3e25e30491186457716449639086400afdde38fdad8d18eb40143047adce08bec408675764b908e1010c6a8d87ff3058112a9be31cd70c039191247f1813684801701c00008dcd958c8067d0d9b66103a47a6f2b7a3a0650c109afccea70e10c36ac3eb4b507bf448a0d765166d89bf0e1a9bbd3c95d0938582222b0ec989ad80e08c6965dd5e3242281638ad3cd0fc09fa1202400d815012e0200029b344d09df0a6468c303923988e324a43163c50a1e3f17de14245e8b816a5074503b0660c131b4a5f7ab38411004000059cd12d9ed20772e5c38c6585fdd7857848a04184c5560ca28b4efefd0677fc4080e7e7be5e94e30454d759599946202b9788facfd0c5003cac670d9a1030025be7d40112b2de2400c00f144d0958d1a268c1c9b99478e323487e94850a5440ff351425bf957552506c30a36868c137e74d0d338011004000058c829028144140007e4433447658f95b79c440f85d9f23a8c309130602048a14054ff98a22d83a2be6405e75a85fa8a0121859af82ace284401000016d3c6865ea8908a1226a411805f10812ba2cf44bd85063c04c4d7f21430720dd49e90819615076d73c70abdaa445cac383e93d68ec461411584d1ebc0aa3b1228520400cc01800111108d0984602c22c07c65f65c3a8cec48b33cf14dec00517c0a52b56661a21) <<< 16000) + 0x7e0805a7c02040abdf60a934302f0e86f04d84404d9fd03227d8c00c575ecc04110014f5c2e9b87442400ac0b0196039590be00e638c2618b147512af53b816a720904c24c1cd18718914514b0490224ff95e697de618b50da4bd41a9542231880867d8045d10e8000de9920031bdbdf9634a82709d91850e9287f0a40821f2ecc586000444751c0202b752018d198208c02000027e432824192120220506100f4ccf035250a006124751f3b411ca269bff96f7229841932f0a3880208edf6bf1567058e1b5423f2b38a1c278a65a39112112efec95b8c1c206e5a5e7551442400ac0b1849162aba5efb8289640ef239856a6104ad11fdd586c82247f8336b6f416383a55ed61822242145a38f208983840e5d5407ffc0c00e9320b2baf714003c4b2936658c242400bc0e00004807c8264fd5155ae1246257ab4dc830b1e9aeb57e2a0038fe47ac9ca2483c60b909bcb038163260bfac06474918c67d8836cee4023329e39a90018107d5b14c8b257c2400b40d0098020002423a530da7cd73249003ce8524691675d07094c222e5513c91c385dd6ae482070080ce7e45820434df1cca000b99525cad0104601000019d21901bb29643f2d63fa1c382f4645389e247104cedadcde40f02ac96fe73ca18e849da77030c349fc3e19158205287770e6b7c380119e4806cd05001137ec382c6c1200560500c701e94a786fef34b28ad2a95151a441a8572bd308597d828f270e1a448b26c81c5d9dcbad94000055be6d2704230080000b6102805015028000f78e16076014ba028c2478eb80deab1440e698b647392488504297b44658ead30380134071ecf3c726e141430204fb3b951246452193aabb600034adf846e03689002b028590443d994d108e5101af3b8a3af94490eadbaae6b49858e4372458e51ce38fbf8c7067ea2050c10b2be1e52745802595d74d556448073540bd782d800006eb0a6a4c819a42400c00f00004946ca1b72c3f9d8e1c8a505a80e287009ab6afc481dad6c6dbe52862d9324f6208187f9d653bd186bec10ae46091419068b5af2053b662749eb12004c028097010000fd90c601d9446c742cc6291238988397fea1840ee608818711a143240aa006efae30d21dff49e8a412282da264ced5440a63bf7caf7908e0031d86ac9a6028009bb9790d3e5e82400b80d1a5449ccff353489f19998a0610ada8516d0e1c0fb5806610387fe3f5ac280094f899593001180400004ec8140280a81400076c43144600151c431016002eaa40bc37233df7fe5f4b244705565655a408cc8d5109c0a0c19db517b008180926e4e1c182011b357e381050a07ef1a805003dbe5473000015e716f4704100312484e0280002012003ea8400c15486198e08152f0074270122a72c106e427c911f56baa138e640749f47ec26ea1c35d62facaef3881b34e558b33d4906786e552990820014857c11c000800d71ecbb0594649002d02c06080c30007439574ff977250b9d30700f1922000fb4912650543d8a3bbc920a0a890b6763020000006e414042d3e800a41800014f07688000000e105a020980300003b8647595365cdb2467ac5bf5be14518976dd60243f8f5b0cd92036254f63801c26254f5a20082ab59764dc04006af421d60000002582680c240080000e590c201c1026990e7e0050fd6a66684c02078ab51a95d858437fe3e59584040fcda74daa28431d8a72368204fc353f0d204027ebe9fb9de20012b217c00104801400c03040618003a2310ae80d95014397bc2cd52bf1860000007c08050b68634a8f65491249c3782a0c0c1062db0927640c017b0135d6900801920367be800000007e9016c404158100000838c1026990e7e00a1d244e0cb998a1e50ed5c43e2c218e71d240040482ac211870508ea730b08f8813b0102f9f410009590be0000808cecd138c212004e0280c10186000e884228c6abe02874de74c6e4b1860000006e40285a24809b6c924477b2833e981820cbab6b4642801fe2d1b5200c027e62b9a080000001c202c4041400a00007c080021210bf05800450100a0df1c84ae21d120040a88bdd71b15d204ba3951818fa101ff24075abbf05080c3d9abae2230350491b42fde0c1497b8b3366406008088634800020171991148579b82400b40b006a0303801c8e6e2345e738246ecd27a150e8a280000052b0091371ef9be6364071c0593c84814232b322706c120141e9093900100bd590c4f300000005460291010520380001fb3234d3dcffb49547140824490e940488ed79f38a35b2040131b438392101a495f61d47c050854f112e4da82820c948b664c80c003e147401b00201117cd0688c2889002d02801a80c0e007441694661ed28d287c816a25f0e7c508caa5b7a92bc891096370ad06fe0c1827f9c3cbe790c3104cadc46ed02000000027d67ac2009636f94fe081f42010bc0b143f34b1112a98c30000006f60142d6d2eaaf4c92296fdbeb2ba122000000e1000c109b00c7d2e140aab8030ec614048731716e60e0000000384018904280140000fd10004192000d1042f80617a020bc010005a610bb1905d0c82e454170020b701000d7390b63585a9ac2d0b61664b0b22185890c2c08615e3b9241ba92ea12380bb755c2448bb18d3418101be0e2e4001f0084882c08ea386104692c3388046ff6b6b000009fa98d2000f8040000334d900190d03610191619f1d258407a723c88a003f0600be001c773701c1282110040000424d0e2b1c582838a006d763838528598bde2843033554618003170f829284100040000)) <<< 16000) + 0x40483004c2b8260be130ad09f160188cb8659409b5868258b35f370ec5841fe7b28d20010004246002e262a724500698a9171458e7bd223a2c1001049edc18004e5349cb08000264d01c980090020000282605020d20d08209f86cce7685005ea0badf8200171ab4b724042300800006f9c200a53a5a31c403dbc6e6030fe213e47304107ffb146c000027201590a84110020000428f398c3c73799c74d4fa0b38aaea51f83d025796bb3ed550c8000000000000000020a9fd1c2d395fc697a8303c229423cf60ba994eb54f68921800000000000000007e7dc4d61459e6a2a8fea0a0aa6ba231ed553be63f797bca0c7444d74463da84a830618410458018016b251afc5025b364da9ff50c0fed4827592ff5b852c7bf6205610dc2a2867468d9c1e35069dbe71cd595b56d02d4d0fd5f68ecb9893a490259c5745d33c437d095fc0c9208502e4b1e3a7f4145da06b66e0e45534a1abca250006173c211a35c70bc5081401b867a0414db99d0bf85004992f9d3808014456b359c103fb5e18dbd013957b75e22e610260180000bf10a20185600c00310485590c2a886152430a8218538ec2985614a230a41185188c288141420a0a0014083d01586b8610102278dc901a9b8043712028d247b22e58014497473440032510b5a02aa04c5046010c300010353620427c6b5e5e406880466d0c80a8f716261820a6ae7417a4554094a08c02000023e427c9613c3b09d1584e08f4e9c769e41d8f0226d7c76154218c37c59c958410e5aa97c9e7a74e3b4f20ec781136be3b0a9c43186f8b392b0821cb552f93d0ce6fd1f532c110538b70dcc0ab244d394d26016cca7fbb96e605b4be3506951785f25d90282aa4065844041009410b123706cfec09ed92e1d30f4c2ca1f60c3bbfeb993f47f13e935753a63494aa2f09f60356dd8b61a654ad7c423aed5b81e6dde264ae212c26620e36bddc05bf290c68a29b546d4cc58d78078611d668710753d36a1361309a0184c80c2600612e0309601c8a178ea01209103f9673a3121ef6eca2b92416a8cfe2368a84838460100951584a06c24c161240b09105d0acd52a761942693ec5c9482a12202200404806c23c1611c0ba1538708b3733964b8a96eacb17e31121e2751638e01ed0da528f18f556509091d8185ec34c5ac8564fe80689a32a2249c85970dcb22feea505c7e1c115f32a08378626207512f3597d0ad628f9472900480579219fd5f55c0e00205a5107cc6f73b113d8e1c7e5251310789573b34620001428ac17a905504fa2790eaedafee481d0e4ee244f309c06f2cf2662eae445fa82b69ca5eb3d8947fa63d96f1865c8cb9dcfccd73fde94ca269e01142ce12fc0002c4900066f2000fbc405856001c824234361180b08b01d1428a8cd3e2040f2812f9c7005d8ab3080008fc9e82d00155100288044008d0445fe1941cabfc08d56b8c8f37dea91fb57cf813b8a456a8d281ce051f9ebed00847b1ad5b1359eac3f2eda6ade7455800a1c507524d5d3c19e9c149ae7223664a68142bf5fc637dc292f1eb450c69db6ed001464a40ea78fb786dd84218624591b63b6fb5e4646277298097ca24d87dc69ff68e5792919f06281190611460228361120b0880184380c2180602c03b0a6b4fe2797e4661d2c22480c636cbccddcf10055e97bd48410c1da3000c1666db72fa8a1e451500d43dabb29913874cafc3b613f2b3bef19e53841c10780e6879b199b1bcf5cb357ee7a4942d25bff57047c8374a5d1a20b830249c0ab84775aadf5e641f4d0a7a3c69127cde6f1620a51b6180689f411441707aac6a2be3ea7b24c4f5359510f0a559be9a532623ce2202cd3c5c980ad20701ad9d4e9be215280481c50310985dce3d7ff7f190849c66200851184204c20c161040bc0e20dedf9e7466dd6c9c7af3e6cd269fc3dec55b60c4b47c02ee32f7b21c3accb5f849a1fbb73e0d298ce25ce28c526984f3855817229e9183e3708082724c48523f8554d171a40401fc20c1a6b7b42ea8f649052a3676bf324123b4266cb508bc40ec801dcec2cadaa57e33bb5d35f5a8885b80dfedd045c9a278f05807598e69fcf60f3dcb095620d3691285206c7a4dd0f77a07dd53f74cbaed15fa10404f3dce2b5f65ef5be5ebd5c8d231d4bf7324a34f9ae98b00c3e5d185caacf0eaa4df390605bb99cc4752c849c46180811184004c1fc17001199b9e2e0ceb63a74c04106878c7af9761141f7fef6fa4e128d0dfd700e43fd93f142f04d8dce1013509b0abd81cf7375f2f10ef5da51fdeddbe6422b6d1eb99aad65cbdf5b7ef1405d35339a1e0180a2b59ab296044076c1aea41d2b0419eed86b4d606b0cd0b26f9d0485a0c2833da846e95d82e58872c9f3f5887ffffd55a438f8f505751ec31835a65936b2d2ff368a3e79e1b248b60c58683c4626c8c000050920017a64004758c010040112384eb58320e0588ab31491021000400001ecc06fc4ac53c00035b684a08820780200000f441f83782eb4ece5a0de56c50eafcbf6e35538783ab23d3baddadc702d7c85634f598e295f1ca75c87a91c1ffada9f4e27ad2e0deaef33867b701ab01c710e44141e00cc30709f12d39ff16148f0c1a3983f8cd105fcebbb8ead3557dc71f37b10002a156bce9699def4c55e1c1f3304cbdf153f69f00b614fa65ef19bcafaa00416b16e60d328f98bf1308b9d53f175e374cc629a604efb96cf16cc9456a7ac2ceb696ea8b7e5e4d9edf44288c3f80553ff4d7f33887d2087619800016fcc55a7a870d08073dcb147512ae5ce60379012104e32a)) <<< 16000) + 0x38e081626959b1f67ceded0cf0e60aa11ebe88e80e7ac98dbe6755082e88fc30844861638a4824020825d98b57d49467ec3b0e75b0f471b0043fd8724fcfeb473ce6ed8c7b50574729f519eb5d68d73035cd7d4c9f1540bdc7ea199657d07d0de0bb4f7bcc38cce7a5dea4f48d3bd33c47fb2efed2868488f66994031ca96a9ff8e6d71a8ad81e9520013c23ce5ded34d1ee1b171dd1480a14f653acd42e3227b7e2f13902fa1f60036b98399dc5d4632005c52be2b4411e13e9f510491b032e4d62a74c8474d30c6d95b64eed177b7d880ea0892b60bdaa1f6719ccf27e5ddcf8d07c4a4f70d65b53594bfd392c88fd5137c4d40b512e21cf62b2113545800027a10008bf3433069aa5e8e51066863b522fd7ee7e213ae9d523f834836f5e551b25300303204080684c42e82f50d1893148eae791bef71fe7d2853cb8c98a280020dcf8b3c09b8f9fc8f4a2f871aeabc74d7f82d1f6d393e11e3961140cd51e2697a8dc76c9a16fc83a87a233658848c9b1821e721fa28f6442dbef0ed64d572461775f9143a3aa5f09c11639966676a266b6145c82341d7a9914b85980a9b0a929f8927b12eb02c066fd625a44554b5a4c254aecc24723831b0bcfed311a6a8d3d582b14812526de418dc2f000031f107c1d83d8ec1e8760f22b0780d83b84c1d8260ea130017172005b3e40bc470040100403a02f0e9186b7d30a113ee71b613410b5c8314a50019aa8bc3190108c021a485079fe3c18750fd2d0c1008302b7f2a202053fb17e320211004000036c8000e99c0033c6df55eadbccc3bb6b713a83c21f627c626f87ca42b496967c460dd5db63254b07da0eaf680903df6f628215a487bb784915f88b84adb8c10403376643ef8ed2813c9c5e83d63d9de6cc4a02b69f6e0a1291ed45a1dd24dbf3645705a98a21ef18e253d264b5e6759986d9af90e56c45224cfe8205d885a05e091fec02c066c185d3a7235553522f463db5dca2a4c70441249fb448c7d03606a0433b1803aa04c87311409f37893e9f6d75bd52a2a3a4131c32acb73b574a8a98f5bbe2e7bac904d009e662a4687d05402f9a7a252468eb6dd8f6be2dfdda72dd2cf19de78baa1fa1e0c6f8d1f2c11a3bcb48411c2cd4d0041113bb6810b015165a12c970a23fd0f174cbf6e8e290c123646929942ea9c3821f6dc0651a956fefb5285dc630dcc6b400049290731183908c1c4460241a0700d8088681bc260dc0b06d0583602c1ac060d4030690103400800322c801db61004cff384060e6480b9747a538ae6383d781041f4f23265b55e8b046fb6457283f5df10302ff1cac4c84e6dc24c2fed602a64e8da9c760611b2ec26a744c235263821809b78dae0004c9b615a02f94b81b6b4e1341b8898760daeacf63972ce62b904002ff1cbdc90d17ab2005062ca8a84f0aacec8f11de80fe14357653b050420000001750b596694f02b4738802ab515986e8ebaf184f8d018d95d291008455540041ba2f952c01d6336bafda459f059fa74fe3c603d0331dba1334977db57169b30fb008477d8569ddae28fac2af913a4540bab4dec43f5feac450f0330033808001bdc8032e6900b40339fd8d4d2498fdab8970881581a339a51b5bcd65f742b3c4c6f7f3166af78c1f410ff68400000000000000001014fe8e169cafe34bd4181e114a11e7b05d4ca75aa7b4490c00000000000000003f57ac0c2556f79317e90b8a9808f4fb765308aa80b5d03f903212e6ec5fe1590457550154235103142181101cacddd7e83567dead9f3b47ac54863eb6e217ab1caeac6ebe2f410a7cc23a9c3b67eefa46c06d76ccc7241b24e6bb33bec3ac798b2483236b67662856cf74b20b5223bc7e61da57e4ba871e59efdf952f1323e4f1729d08997668f97c950aae4bdd48ba13f8ca8b7e340dac65a83302c194160c8030630182000c188060280303f01c0d19cd28dade6b2fba159e2637bf98b357bc60fa087fb42000000000000000008084d4e479162c7256426a723a0000000010355523955fecdc29516b2de1614dc7f83e6288486306284382202823fc0066bba7ca3609a495f40eb520d9d54beafec0f46b382769ec0752ae787526013c9b47a5a446225d543328900bc23fd39952ea91a0023cdcdcf921fea7fec26d89438f3a0c20b8143dee5be99aa8fc0cce25acfb08864491d8f4acc869372a486addef7d9c6148d947dc522cfe456625c53a433c698420f142e6e7dc98a6c54f573aa4340e8034bf86b575a5e20237b88801999d86ba60b458a1beedf2e7b994b00ec5bfa3d1709ba804090e9face42a400681b48808e285c948acf9a177e8888d0187236a12ff1ad2ce6830de1a5ce88f10017168dda84ca0a0e75f0fcd8016e86a2a19a880ed664c0ac711f306e794219ff79e486f21c836832845fdd6b93c0eba25d458fac74a69728c83ba2335b970d26fdabdbae83b64ad3c851724c80006c4200171c4180660be2305e0581e02b491bdffa491438819f3e749129bf85e1e50217fa26792800c7f3a0b86001a519a68981084021a487ac12d68d1c510986304895240a26d28100ba3c430e00af8159481006efcdd384c0842010000131384055958934c1875143c504074c67592218302a411f3020a558f8b589002284674813041080400004ccd3fa385a72bf8d2f5060784528479ec175329d6a9ed124300000000000000000fc4b1450c808708b006005002003d8c7c88cdf406d5cc48d59c33e0405156077e741a43b1075de15fde1636f1df79dceb880c991fe8001541b40f6b4076e05ad7f890b467bc6b6e20)) <<< 16000) + 0xe7fbccdb60ddfd5400000000000000002029fd1c2d395fc697a8303c229423cf60ba994eb54f68921800000000000000007e43882043823025002001001b218be07cd60d729107c022239c49ef1573105402d9128153cdea634ab9ecb3d5b5c5d1a8eece2292b621f5c600e0013fbf03b886b977400108882e8ac144560b82b05b1182902c16817c507c35fee2c86dbb01a470a12388fa4a0e5dc1cbd96083fa334f2c07d46d8f24c083e010e2112b600c3851ab6d2d4a0f369a41920394fced70b04be5d9b3040f8d658f498107802000023e7475583b8f890a55571771c2e8b2fcf08042026320041e93758e00000bf7a3c0982078020000242706417dc5e48066ad0dc9181cf358434102209765209020780200b2020000e23230d649be98e1010cbab6840b21afdc196010e97ff792060cf98388401e89adbe81306100043842424084c308bd9d2ab040c99ce01608c207c0200b0020000ba2000408415c560442b0561582a88c1501722ef515736caf6339e4422dd43b2a4b429296e8877b41f7e0000000000000000041477d909505302d1cf6425017c0b32463021022012c024008034fdc0adab97754f0325749ac569baeb71d57c3716ac8bb56dbcdde847f3703eda8a7a35153b3033065712b414c37a506a4991d349182f1f5c4847b6322705051edcc8294054c7070424000509728080625906b19c107c021a48c1fdc10710535451f9031759511450700f63590413fb2a7e52800f00438a4045c401c401f22190819c85ac4a507ffb7f1a380756bf4e06001dc519a6001d00800008b900022520a40a051050001dd1050158278ac1383609a03d1496148071a0f483bd0219040f80238d13d860ca796108e6c18d28badc1549a1244df8313c0bf5f56be2000027911826081f0080000939f3fc3d9b120f0c9fe7712cd08b06ae278a0465dfc7d42043fabc794941080021e59c29f368342540df78a50256d56f48204a5af4c59e06b328ba1100000f750e4c083e01000012520980a00025430040100471401f9faf782b70173e6b7c924303327e4505149dd494df0494104143050fa9a79c79d3d6dc20bc966cdf8985936c223c49c600003fbe448aad83dfc6ad620c0132e499f692f2bfd5ca09405d0374c392b572988479269c13a472dfb5404c08b21d800031320960a04a010001bd10491582408fcc21468e4448a00c300a4c0c6b9591992105c9cda61c2237777986034cf42498204692887293820f80438a1800baa261437dbc0ec30861306e7980c790910d0812c49ae5c701b26e0218300003ab4193820f804000054082384c11817000010047014845a61001700800002218010128b416054dc7c608064958791820d004000025882284fcb8451f98b8d0a54cf02c0dcfff4afdae87c0ce35a617648c7880c4585c58b0fdc52b51c36e4f9922d7f856ab1e6bceba8ee7d00028359b0a66efe7f49482299efa3c8ce0b00059028caddcf87000046481f3e6744cba187a142dec85437c24d3058ae10f8450370496acd36d545ceb40e92ec6ed4ee00f8d91a3253563c5dac1a6d59e0a9cd618ce3e44ddf1565d68e1393da404c12947960cefd2b07263c18887de79dbe0808003f807a8fcf00d984c230ac658000000017154000009080305ec72821681c00005e48220280019908003e3102809015028002bc0e1968c0e0731c308007854b3c59a080000017700c047d1f3ab0845020028a61edc30005b1238de7900000514b823940041b4d1bd151c50a4051319c3c589c3d3926cf10f7da9de679b60c55e3d06260000000000000000000000000000000000000000000000b2269a692704684584302580080b80801006cc670f16270f4e49b3c43df6a7799e6d831578f418980000000000000000000000000000000000000000000002c89a69a49c11a11611a04b08b040580340007a48140280a814000848410c540841a0006332003286400832c80140310412d8200ac0fc2709a9c8f22c58e4ac84d4e474000000002012041c41031c21420820c14113e9a2a06e48d9d25628bf8192898e2feb17bc6978c5f5a21a018e5f660abadb98e50ba20d01601d0c314005a2201b3e668cc0a0800002580901a0ff1972100f933665e04000012c1063a1cbca45194b0840200002b47880000057e402020a6a6e25d30e15335941e33450a72c17853fa502b49af3a1c0408ab5d8c08401560f8372821961490a40a007c139140dce5c9f438a0000031381c23102b09100a12cc17f8120903c0717b4603802880484a40807aebd12b3008405ba288a506ae504a0280001b4202c4a00038e20281203d010003b71003b3220780a03b0170c5bfb7a95081039fce5870c20a729a72e2024e5572248500e3aacd5a0805b10fe8390c054cdc9af082a8a80013a411804245208edfe382880ca4a546860c73563cca0e0103a0063f180808c4079828000731bb3904515026382300840a11de6e8e203e87b41c68e1825ecd130702f179cf5c048184201003a0dd8e1ec51dadbbffc70591e2cb6a3306be9d798f1a03065dd4138f7460023901e04647799cff96a9737b98d2ddafd565c9a325db9eb37109441802f7fa58032a019b5867b094c5aa955e362a33043b026749b9d4c5baa425544323a004e3eee8bd9236d7eebc037c4885ead57d3794cd9003ce76383f228f45c2e8d05b571203bf81dd38cff7cdfcbe0c9fc98c6fb63f4ac621cc6200004a720722b0381581b8ac0d83606a0b0340181980c0c807c6049a3a3ee41019747bbbcf0470f5c7e1c7a0a286404bf0c6f628)) <<< 16000) + 0x1484d7a13f49009521cf8fea450444f93907de08362b03360f841104c88282902001884c0c0176208624df76203b17945cf05002877b859460037e410800200fb177e2305554594c08c0200002484000d2c8004e0102f0981704a03238cfb6e2424eae92c6202ed31f647200b857b58c24042000801682e83e194f1dd24341bf274110141a9b7640c166dd012f24057efed7a9400800216181dca62aca0ee87f488040413cc4cbd041112449401a00e8fb454c301d817287d3001080400004bc816008000970d8e2f3eaab0403735eecd23824cc06f50100d0aad230d010800100360201a0100007e102b1181508c0a4360500b02705e1b1e09a7e048820f80ba4203031797f21600558ed6c0a008914952b2801080430ceb013d31c21b29362440796130559c0042f73032000f004000032081302ec33854a12c80f9a3be772c235a953742056fb561e0409580ee265001e0084067bb9bb64b0964a2c01120039a5b220808097832f2000f80400003348128080007c0d8cb8775b2c906ed30dfa0c092ab3ed21c0338d4c6c0803a064ef425081f00801202800044481188c088460421b02005d03e578b0a6800002a6650118e2ac91800e004281abf88749a01d2fd8f0103aeb4f1f1800e804000027080f82c0781603a0301c01f13a7dead8efb058e4c799558d0791fe714b536018f647713b4eaf793ea8c4d455873cedfb5c95b1058cd0107f2aaa7a41c45c1e32cad841a2aa0340bb3ddb3a79f684a7197964ac02ffaaf0419c9f59d5193bc380646c458fefcdd0e4284f2e30000f39eeba90486bd2aa2bec39d88c806358bf999cc34226540b8f0c212a29b0e266443fc48bf2cf7b909a138f794f601de651b95dc55b46c41024087c6fb2807d7ef7d5e93c8752b15d9790b623d4ab98f00ca7887fd70df0ee3d47569876f63b5c4bae256fdd5fd7c100b28cd2f6c58214b728b5fc2e00f4e5fc2f8aa445fe89fc1a8542f136ff23015064537802ee8cafd76f2212a978e6262665e73dd871c63b586e43f2edb3fa1bd152ee408b82780002449d2c135a6da41a4008ab63322c80001f48ae4116286935a09000cda9cb310001975c52b040000c467b804e184601000017039ffdf3b07039490000000a9319c3c589c3d3926cf10f7da9de679b60c55e3d06260000000000000000000000000000000000000000000000b2441060e50e38e402680400380018100100680012b1000ca720361201a09000748100142f20324b0181580b84e0206748c38182a02c40eb1424af1636e201948ef1d30c04347587b415251c2000800b00e017f42b7c7f77a2e91cc493bb318b7b4dc993fabe3a0fd7e332a9221417cd726f53ededb13a501bcb877d7ae0846c175656cdf79b2629dd1800d1e51219246ca353a2109fc6bdeb760acfb9bfbcea89bc7d98be080fbfdf10201701ed240abc7eb7f3421307909c0e7dc6bf039007bb0066c6880920881cf3fb4f17d2eac37c35e0f98d218bf4c4aab3a9211ba3a77ee73b615e01068d8da6175ed46ef99ffb322e832106a16a00014e0f1000069e82f38f3cc325708d6930484003b22f12b4ad442b661c55498001049f0ef61f7ec9a9a35fe478169f8e08729aca65b4a5912e120cd7b75000704857e0900535640e732f926a8099c1c8a77a2fed929e689748529a2c001411c3bbcf8992360dcc7ac1b2bef2708103a7d84bdfb371a79a2a6c27800a001c4d4a1e1539e639627cfaa47a1c2684f268c02b907fee02a4272b3de400b1be39fd85bec0b6a02e857697f22f9e35dc43de0e079e6ea964f60080588a939d8d66606a411c9aa53518952ec76d89274f20e098b53c035b913a599248e166a44b4f73574c166f460f2df917e4d63fb3040149398c40000ef4405454028120130100072390122900892804004005012400ce00801a94181a339a51b5bcd65f742b3c4c6f7f3166af78c1f410ff6840000000000000000100450c60860450440430001503294a3492ecfb7f759d2b93dbaa174b21e675378c5b877d77c24ebbcc4ada486c451c17015a42f6a0b9685690ace5299d7f7209e3dc9f8c69343dde295b3e7dd6470f8046c4d36306000000960101043c9c6c28c00f9071e5604000161999c8000000320914261c2500840c87232a650a9220819068e86c4088c1732af9e8e21d216e0aa54486445201f00e061dc98f59c718484183ec286810c0881906551ac300b54de9edbb0098a450a8071238a67b35f7122fb550d1860a1000000bb8020858e719a9940020e2de7d90002bdc4eaa8e000000070802dc409001165cf1b52bce01648039b206f8163907de6080214380000007d018000073e71ab9200000000190020000d5b17fa84e10500109200000004650050400d65c7c3c82022d8db411f940414058d003a79010400000cce52050000137c899e0200042427c057804006215363ccdc00004be2058b71912005a040c32d7d6f719d8c280137c5208cd200000002580c208484fb5744b2000000025804000000001aaa600280080000ac800400f01007008000f48d152869d1d99045100061707515a58c0000000bb8050c29698bb05b648c0000000bb805800000007841650007d1ea6b5bc051c30b00500003644001d2c80046f100d11000592100c1d80588c0282786f73e26579461008c7e46a21c201076832a8608f003ad5e614200000012c0600837a9e97e100018e7e9898044041da0f02900ad620d9c9b9613002000077c804808003c1880414801c9400c4a0052100200800c040025be4008440020200001004be51)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase3" = "QuadFullEightCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase3 private def zz2282:"s08ea"="s08ea":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l17 l22 l23 l25 l27 l28 l29 l30 l31 l33 l35 l37 l4 l41 l42 l43 l46 l51 l56 l6 l63 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x372dcd0c5, -0x289368078, -0x3cdd1c38a,0x9b2e5dd8], ![-0x289368078, -0xf55cf8e74,0x1f235c0ac,0x1c7e7adfe], ![-0x3cdd1c38a,0x1f235c0ac, -0x107be27545,0x2893689d8], ![0x9b2e5dd8,0x1c7e7adfe,0x2893689d8, -0x1449b4294]] noncomputable def hinges:Hinges:=[(-0x3b28bd2c,l6),(0x635bcd9a,l4),(0x38846002,l9),(-0xfa12c9ef,l8),(-0x8e852b9,l11),(0x5a774948,l10),(0x4cc77fe4,l14),(0x22add17ae,l13),(-0x7a8613a4,l17),(0x61b58d2d,l23),(0xa0cbe79,l22),(-0x1449b4294,l27),(-0x915ff1c8,l28),(0x1449b4294,l29),(-0x10f744fd8,l25),(0x7549a63c,l31),(0xa267a8fe,l30),(0x1449b4294,l33),(-0x1449b4294,l35),(0x1449b4294,l37),(-0x7596cad8,l43),(-0xab3d9ec3,l42),(-0x24a8cb24a,l41),(0x1b488c10,l46),(0x1449b4294,l51),(-0x1edcc986,l56),(-0x266f7e0a,l63),(0xc38c8fe,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1449b4294,l27),(0x1449b4294,l29),(0x1449b4294,l33),(-0x1449b4294,l35),(0x1449b4294,l37),(0x1449b4294,l51),(0x22add17ae,l13),(-0x10f744fd8,l25),(-0x915ff1c8,l28),(0x7549a63c,l31),(0xa267a8fe,l30),(0x61b58d2d,l23),(-0x24a8cb24a,l41),(-0xfa12c9ef,l8),(-0x7a8613a4,l17),(-0x7596cad8,l43),(-0xab3d9ec3,l42),(0x5a774948,l10),(0x38846002,l9),(0x4cc77fe4,l14),(-0x266f7e0a,l63),(-0x3b28bd2c,l6),(0x1b488c10,l46),(0x635bcd9a,l4),(0xc38c8fe,l65),(-0x1edcc986,l56),(-0x8e852b9,l11),(0xa0cbe79,l22)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x44340a30080000010864088c030000000945c0e30080000002515018c0200244591180d6401000000268a4028c0300000009854053008000000013c02c8030000000000b032004000000013404c803000008208c0da301000002082300e8c04000000881600d300c0000000000c0c801000000064540f300800a1204340121004000000054440a30080000014884088c030284408580192401400511042600e50040000000001c062008000000c8440d8c03000006108c03830100cc14a1940e61005000000661102c300c0000014864090c0300194510580864010000000002d038802000000000b40620080000000174028803000000000140e2008000000002e01480200154410500c640100000001505034c0200000000024072008000000002902c80200000831080ba301000000249040d8c03000092905019230140002424040348c0500000007418063008000001c8c4098c030000006229036300c0910c21600219005000004108404830100000009824088c030000025044082301000000000090248020000000008c0620080000001f0d014c02000000000740b20080a20ae08801b5005000004d0480313011440a104400635006001502705006d40100056090160275004001482a04803d4010005c0a01c01750040000000026009200c000000000e01480200000000009032004000000110b018c02000000001c009200c0000000012014802,0x3d45388703db4015cf1451050216d00600000530880923010000000002d02480200084c70407a4301800001842201fcc0461843c33c03a240180000018848054c03000004109c04830100000001b0a038c020000063088092301015621217008e9005000000b21902c300c1612581a408b100500000005c4c0a300800000000050188020001186229036400c000000000440c8010454638a703db40160f1851450216d0060000008239036300c000000211d03cc02000000074640a3008000001c8c4088c0300094c80407a4301a981cd18d024a9006002eca615c02940101732982a00525005002907118406e401000bd2b05e01250040548708c10375401400b22985700a5004000007108807f3010000000000f0188020000007212015300c0000000f07028c0200000000007032004000010421025cc0400000210540c6301000000088280ccc03000000000140920080000000004c0c80100000000098052008000001182c088c03000000000240e2008000000000d0188020020c610840ba40100000001909028c020000000c4240f30080000002d0e024c02000000000ec062008000002a85808cc03000000000740620080000000003c0c801000000000740920080a210618803c50056145604140a614018006214c42032d004000f02105003c40100000008828030c03000f02106809c401000740d02101e10040000000002406200800000841400f0c04,0x2c04484f028840140000d61440238c0500003785b010e301400000c42d0238c040000003415017300c00000108640d8c03000000088380d3008000011c3d0128c04000044875010a30140000010870054c030000708c1019230140091210730311004000000621a02e300c000000190e02cc02000144961a032400c000000002d02c80200000000015032004000000002902480261c544178090c4018000000c844098c03000005511c06c30100000000d05028c02000003505404830100f208a0b4063100500000006424073008000001902c070c03000000640900c300c00001a8110050c04000000680900a300c0001a01040098c050000006e1100b300c0000001a09018c020000008239034300c00510c41a0211004000000088380530080000010844050c0300000611540863010006116013014d0040000000645805300800000188b4088c03000000682d013300c000019c5b0218c040000000005409200800000188ac088c03000002304c0ae301000000288640b0c0300284310700544010000000000501c80200000000084062008008911814005900404d87485c023a40140000001d0a018c0200000000005032006521c105c021890060000007229014300c0000000005c0c801030c3304802a8401410c18225c02610050010c330580aa401000430cc1101690040490718c301d240140000001706038c02001e03604405640100003e148840d9003,0x24f20a18f020ad00690c80860c03eb401a49206189029ad006000003508803c3010000000019c04c803001cc5c10c0ab40100000000015018802000000000ac06200800000158440dcc03000000000940b2008000331306c09d00360c43430c02e340180000010864050c03000000009830330040000014884050c03001c44108c0bb40100c10c208c05d9005028c3b043028b4014000000000d024802000004e0440163010000000110f014c020000000003c0520080000120110058c04000094260900b400c0000000078024803002c86314c0c440100000000007024802000000000840920080001822840648c05001d46714c0f640100000014864050c03000000078380d30080000000025024802], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x10caa54e1cd2df2fba0a24e93f586f5ff4d2e886ca8fb083e5199631fb98d285146658c7ee634a13ca19232443c6baf728648c910f1aebe0f86c135b075500b47cfa88ae90290a1c91c908a04700863ef49166dff3f5cf5a8d32786fb5f098ea8e3a0d6283488f2f24d0950548502c411a133806b63e5b2c8221e30ca36a719ad2a3b8357270a1878c4e18524b7534ccd47d4421c14649108a1bc0bb2fec61ea7861213fb372e3065b3bdb581624d9705638c0b852451ae84a1842010e3807bce670e69b7955860bd38a0854848f99a30c1fa0509861804c0bb2aa70469b5b0d83342011ace840040808d66ee18e00a269033d36400940301ba03f29d5578b9267a2085c9b12ed2e20f1611b6aa7251d30205a0a59f55c87096f240c55d4534101e03812be0080710bee8800530810d2d7587f8cc106f821d42bd449e7d2005c07) <<< 16000) + 0x8898ada81c46798986f63f6719bfeeee2878a84e37cea8864a7c57fa7028be27266600a3ee05553801000400005588001d49d3764fd77737e205811e577f40038b052a27b89b468e639d9ac82fc71c2957830b1e1c194be6e99c013820bc94ccc114682426911ec828a040000012e106c2400ac09103040a5a10d02d1efd0940e2d44020fc4d2ffd8343b8e109072c3a4b015025775a6002000800009510dc010001b8900094036684d6410297c5debb479d9851f72c80fa3e7d44574814f6884ad1c2e0599641441a196092010021f0e82f4b9dd369872361700927c6688935d1799567ab8d2b0e76d0d066a6108419e80012710e01506f8680033d886900ec6b811d8560c36b840d8cde8a72591a80b0c5a114c118271a101c3f86bedea89802809ca41c592f88dc381ff82c64dd14c8003ead1dd4f4ea8488c4fce332ffbb3860b4e9f40e9bb4e249e43121b8300000a0084814f070176c71f2399af3f9a8936f3cfdbc8778400cdd59f99abb8d164c0fe091fc9aa10e045d12d87b451cfcdf173b1c92f4faae09eb1304d20bac4691820afeac7bc57ec5b288a673b0134bb9599418b988368ff9884714eacf07011a2d249463de8665eeef3ba4673cfbfb1e9f3b64f2c4abdadfa6fd2300304e03d4c5c311abda2af5269076742c0b8f89a79dc73fd76d1de5c6af4988b84686d4a5b221b09ecaa2d91a00e202eea51002eeec829c46180de05d92f4b41e4c60705f1cb18604905dd3e25000e208b2a48010b16aa2212881000438d4a28ac8450411052cb2ebb071c880b83a7e0e21ddaf450fd1c314b34cec6c18432b0d905e07049530598e5860947ed17f40041713341d059b24009c071c6a0a2b7394a269011232301de104473afcaefbc3886dc24ef3a70610e1560fa0cc382254cc9e929860911003ee584082d69bd770518800f135f4086d99c8015014000083c86e80e49a8071641cf08151e14dda2c434318dcd339c4060c1e845511bd10304262d16728e082e16abca9c2423182286c6403087e141ae111082931940c8f93729002a02849357bfee584220547853768b11a18c04e3cceb860c2216dcc6c0206080600f7963820b85aaf2a7121189de79b8a83087e32411c7c105263c8e506bdcc80148120000814f18178bb1d45960e14bb9878bb0a5da028867fce0ad67035a4de244600c495c7a24c084001000012b2000aea78edecb53529a44c05d7ce4a1b3480926cc3fbd30804c1f83ab42080d54c5a3121c41e6e8e32881c301fc341bea3821e6e8e3b642c20000004b84da400a0061c76f65a9a94d44c05e1db089469011e9190ec0c2013a8acd26104072d087dae1c41e6e8e328838603d0353df0e0879ba38ed916100000025c2dc801380a00007bcc0b17e9d86134b42fcd52928a02ca89d2384aea9ce762c0635725cb25042000800008010dc010002999000f0e34461d4bbea2c1ad58945e38203803174900626952290030177fb11065141f008000081100114b21a403a480469b68c05ac5aad13990ca9f794676677b4c0907ca042848694b005ba0000000013be1011347b82083161219631030e00c008001ca068edb6e8e9e74647ce80eae889a996d69245b5ba0e1b6ff896a5b2d4d97f3d97ab7eb9feaf7ea569876eb3814359458f4f1bdbc50182fc8dedef04dd7565a204520b52668001ee90db2106d0c8006ce081c04c0d81761d8566b2c8406000004320a10d2971ba21040d08d4b70208c40fc9941000820962aa0330a1100403480749008d36d180bad6a78c0aba9a77e545eb6f63dca5f55ccb852fdd3bbd8c52c20000000000000000011162d5689cc8654fbca33b33bda60483e502142432060820c118010011eebf01715a68e8bbbd491f658adeed7f0f708315940bf56fd30666538cf648a185e8e13e5a9273848fca255d22434b9a69d0a516627d43899fa19c200dc43e5e98196a0de8e09880aeb6b18d80a9e22adda550bf9ae23dbc9a241e1f955190039280029d10d905c804694b005ba0000000013be1011347b82083161211619019209008a084092020a5c600401b49008d36d180b85c826d2abe02eb5a9e302aea69df9517adbd8f7297d5732e14bf74eef6314b080000000000000000044320620424114118010012ffe48e125ab94feae3bf6b599edab6bbd9dd07b27875605ea932540f97953c7953cfcc8ad3c947c30deb43bb2a9d0f2130c669614000dec86c08800136486b928358941aa3a0031102b00800306cd0b6246d4d8e27afd56e72aa20c6c566318d2c071744b22adb20b9ba7885a6da51d5dbc72c5f40a169b53f1b88e91c1d3d6756e4fb47f3d758e8080abb5a66c6468f71231c60ba20059fda9d326006f9364926a8b0e9f26866552eb49e52b0d1a2269b79d3e1a13be4d5ccbaf5eae48311e3880d401d9a1359040a5f177aed1e766147dcb203f231685d03dcd296d34a5c0a91428e28e18a11408c00a00256f2cb88313b9f39575fae5875b08ba52c35ead0c8ea7d932bc5a4a9cac85c721067a0004ac434c460700b03601e0e6fbf30d98628a4dcbd8eabc8c6c08bf5bb5cc1554123f64f76f6aaceeebdbf6f280d01786aee130de494663897ad952a2cf0243e2a94f838a77d4bb09613774d8088087b38ab30da8e3abe6763d99f4ca7370cc4fd71a78028c2db7b2bfbfb0c557203d91abc65d7a3d4b23bbf78f889d94d57b8bf2e479792bd4166a73a410a621c60fadaff11c48efc5f20ac388e3da342a4002e4a4236380a683035e0328810004000041486900eca2acbe87b7efe4991f9015fdf7dd)) <<< 16000) + 0x08ff6a32833db59e860b85f78ccadd149da3b23336000000000000000010371c510973a343ffccd1fb5082612213642132c62061831c018010000a8bfa2330d3b122fe4819d60cacd9809b1d724faaaa194beba3ef541f935fc13869496bc023e82ce14e34fdcdca5621ff01da9be4d2fa7085141364b0c7d9bd400112086882ecd09ac82052f8bbd768f3b30a3ee5901f984db9144f1bdcbd2df4e055b33210a932f0d707995b3902a42f8e0f3a722d833dc405c68e80ff28dbb143d32c62061832411410c000a7837f7406c84b6e0e8f4266a367ef2293941b3268c049f25cf21685710004a97241a5a8d5ceb81df29f8af27dae1da22c9dc1925bb92db8e8605b0ceec030e819d16ca2acbe87b7efe4991f9015fdf7dd08ff6a32833db59e860b85f78ccadd149da3b2333600000000000000001008b1881860c504700600400029b546e888e7484662a53605623a7d2387bb350f8bf20e43925de6ceb92b6d617456010966712deb1d1c5f04cf8b8e609494000d508003db90d02500188800471486796816c9419c0a00187b20e033e1796fea1aedb5e21262e2e6e9a84cf89046d93243657604ac5c34c942f6a040550dc1c00535bdffca440a534f349ba4990f4edb305bf61b4996b62334141561910e24156fa60a3fdbde45d5856e155aaee294102a324499ec36f5e5ee73e15bf5f5b0a7e3f027527461ab4c2fa7e905d6e48b1bf4b1d939fdbe77b02004267021461a8ec1b6b70f30b38a0e6ba6133979098a0309d0b3906520dddb7789cc9f2e4e25988a5020508a9c1449cfb2586839167d4a4b267c70667a2f3e232e6eec60e56f70316e847e362bf926490d30243373cdcde5c4315ea8b6c8519eb1f46faa96dfca632ac8f59fe7a5cdd32c51d5928f5d609ee56969d05ac99f78f3b0309a5300795c56eb595d20cb0eeedc637ec99c19821c8048627ec9690002c68a8291000090c3840d6329a18fc86049830d2c89fe0608780ee17713a18008504809f3b028110dea9a930c840104694f621a2008a02990f1b574fe446c047f02ba4021a2bc51538206e68c905e06800023d219a5b0cc290658e81c036194130c90506400a069f45071f7b41c21215b67c552182d9179b191041423b9fe95b01e200222a9682b761c09499f10c3bd14020a41a7133f1038d01f24b685500b0ac190d6aa9f4e6058058b2e32d0aa66530924d46e4d44c2077bff56b92c815d2856aa0b183a3166d303028649a87580708000000e103011d57b06060000000004b579900260106122ca1fc85d0703081cbab6c68eb61238294de264a72461823d71090e8f6605c60bc9883b28241057cad342bcd8e081b1e6e1ab96410454293615de8c50034ed1cb80fc1ce8f2006207800025336480d5a20c2a444b1c21a0984e3fc640c0a50816c738014508318bc1e1d3160c8f4bcf41ece09000227284b29783800e652d7183b4140084211ee056b000018fd0c519ae3b8e9003103806200800099cd9028370f1ccb1f2bacbc2d141ba31654f5281066f56a1a382000005f7594108c02163ddb34f44050e4ecaff8a9208887852f038252256cc71a011a8f2e1c4a08440100001092000464431c2613803b1c9c4484374103060fcfd9501860072b1dd5828a1ba5cfe1a050c19ed4691c1211039b49e1d1c203eb7520262840968662a60b02805267c80524009c05018c03a24fe67991730716611a698b1e55214ceb2870500c7694a103ff4265d3426d7648754700aced4e250c01b8b01a31a010880200003266070d453a06865c58c1106d301b0206190c23f8ce5d11218e66b2cb43ca2821cdc7ecc944e4846ef2971c368c705236b03bdfa4180594b5cc604980800f39bd3672f37b34801781c348d855d4d1207ff6ffd631c12c9485da28064bcf8ee2004987eac3140496f4367980080020000252689296916088c1c5f8a41652c7948f5e1b8a10e83f27f93429fac4eeb06041ccd89701c03d13d38a99c10880200002ca4001410837068314240011f6424c0765522fbcc57fa24704c93f53be840e93ca093243c81889529bdbc494215f7ae7902a24486f07d630f04094051c56c808405118a559e44020b3e228d4d30c612005605891cc49641892138103b5a91a8a4a8101861a5627c6521f0488f7faa32052f2081317395de0637c08096101288f62f004168c3f71a18dd0500bb790a746b6bc800d77c77c4cc88f27209003304c0001349818990040ff3ca0e327e0e3aaa9ac1451eab97517de4406a031489ddc8870e10711d5a48f120068a53d6464f1c039d3a47230e22804880c6bd451800059eb9e4c1594e209002f03c06200800095886182c308070318acc5798a0e30df6c0d9030e29664b5c4440a2916e929b911019cf00091d00e1de44d76e1a0a108b6e9cc99120bbe3daf3090a08c9883784bc848014010030407c5c5ba39322931650ca41ee9ebc103d101bcc08ec8c3182bec7590910205ab615cd8b1c12cb3e1ef5181410d79868083c8804e8b522605a02005857181c98f47480160182ca6b74415598430bac4e3081e87bce782500415a828220018f8cab80602b8e090ae60021008000097900036d20ac120c0050002e1186552a70e696f97dd0512749fac37affa6974436547d841f04804461449050c48c308604080b70801006f14ea444498a8c28cd400f5731842982b2f46e2083fb2f5a0687087753651a70c1651556c37a1c10799a9dce44010400e9cc444006acb70903c89002701c02b0083000400043442fc260ee0b0003b020061b0010f520882b0410d82000)) <<< 16000) + 0xe077c7eae115cc143246bf42868dc8180ff535afb1230cdd7cc3cd6983859b566dba604122c714726b774070481c0bb54e50380c501ed6461c14042a355f52787ec2400b40d1a50065068fb8a282e611fb2180d06b8f8c9920807d0160510000d3774d84a0048010000111347669f90f78cb38ea24da01dd9ee9815c089c15f31a0e380b0dc25c97e56bb808aa0b105536de6bcb29b6f35e58fa49b436165c3ac95e442643072871c51c0080bd032880cdf912c90417f9b6ac26bba1133f37f4b4433105f5a61b4d09c22a46aabd2a5f240f7e0f63f6689d546a6179f17506b42826e9854000f1cc0ee92489cc9d82863c7100ec09b90308321a685a24619fd1e59b453070b459a80352c824580b96a29c080e0a75ba394dda07013d4e7c75db82808b3f5437470fd84801681a24901a90b3963480b1d8f1ca1c2015e319f23019dc2374ba241003e880d838000bb48a3528000f6a318c9c00900200002e274a642756ebcc1ec9b9d9283440cfe2d1946040bfcc8e21c009b683a70202682a986c66042200800009b900050b217c1a0bd0905e0282ec0417403b2eb77059fa50e1314b8292860b2e8aad90325f980298618b7ab66f05060b17b785243663a600b901db1ebb8c800049345d799002100405c80e48ad2b4f90a43b9e38d8e1964ef000b1de8824c018f1c38e69ca9c8cf4c83c6e8f89e8787a914333b8f184a48fc911adb9d0efa2e84007103ae49f8d41005ecaa5fce3385244120062090e2c849b0eb928a0ccd74ff8d2692e2fe4824832619df7ca04eb36b13f2401b71a74a66002200800009a90003a63c59a90de640db002caa94d2bccf032840f53d3cfe6efcd46189bcd4fa9526c1c2821428d75c3c22458c23ab6ea24ae40644b97b477b8707005e6d8d3d2c9e0602e08548d60150f6cc1200660989256e43cd6a3484478713ecc23d590ba9b207258214524e00274d20e7280060d7ffb08002479ff8d9c00880200002c64070040007f842e03416e120b6016161d0cd74d738a203c443dc6c01638ec221f73222472f5e708ee0e48c001182fc024f101972fc063414225450c7cfdc244c2da2d08b38082a7921d65ec3f09002b028590071f6cc7e9e2880f55efb84a0124158699dc6618b1c72fe26e36685089e37878c2f82448982bf3a96c020a7347554cda0b00222104b0eea4805de0c8473038044801681a00008b4f0e23e84096482872c41939a0f103c25264f0908619067cb9b8e84874cddef9550203b7f6573d9c1400d0342d393c8016c3a348612000df6b5491b8812400a40a016a0200021b21680b0b30185900f0cdaa3822d2859016ff3d13609200c70f9d6d123c2b5ae6c621c76c1d636e1e30c4b9b8c0c7cf1253f29260714216e88adaf9244f947efa3ab8a4009c0701620381aeb69afbc3ec034cba6440c997a6144d1b290f6afccc820d461a805ead080e40fdf8bbccce2c78b37fb73db10942caed7c7ad5910900e1e54a1746c8280a4076e799e70a4882400c4121c5427cb788530900432d9c05122334376ccb0c59e5595714005c22d89994008c0200002184000df8c91452a8b7208da4f1cc97e24ffcbd01639f79dff8e31121c72719a8b694d7078dd3344795f5d38a1831b03e31fb209222117109787c8c2001794ffd7eb1d8200a4f6ec1562543db304801982628a0d9a81558712380d9be04d26023ef11a924099adf55f3c001d1c49a85800e7a64c4090010a0328ace004601000016a216002000403215e1a0ae090004f390010d7206e23001ae8205433919d18b1e38060a3b40c43c21c52c4cbea0f0c2e112d2f4f0412f5e6526b04064daa0809f1c37f40c82738c1b2fe7ca8585054f48ed94189002501448d22f6f2e30060abfbf8371d038a53b75feed430b8ab80d458c209bb60f9bad040608d19f6f6e387236053939430771fcfab52e200402b4c89b9e1200500400001fb215a0b05205f1a766f7cebaf068a714da0dd8a8205027358e756c0a2cb85b11903a09106d24d5d6866408ddd09f277c41c44bbb9ea6b648c01ca9cca225f0400eae02c71b318609002d0346124fbba9cb0820b98d7a69163d3fb028391c60cfd2504828a0a3cdb5c8d0014c33db112000b2eb20a1c00347335b7400118040000664f1a6faff42e25068a4ad6af0b91820515aed1d05340a2d93e583402a091005d25e3c346408e040741698c1c45982ab29b008c01d15c52dfe90401008b7a49cc18609002d0346129719104c0820b39e7763163d9c0b85fa1c607c56287048a0071dcfccd0021ec0d7012000b44f9e61c0009bb51614001180400006648001f010ac010003f81012110088682ac26020020aa01054808003298801a51900588421505ba10f36965fd86040000064b02832894054021010000002240c039a58832582000000015102802560bff1990058c704a018000188214e7b0a63d8529ac290c6146530a21d8380ec28466082330a019e10a976d1fffe14446d2fab4eb040c33885b6a1520022bf1e87a08702dbe7dbddb91403c0413d8cf42004646ad0f8610040151a30f2491f681af65434f0a0027a4c6985aab13ae150123091d4f8687241982583d1240353100c758c208002013e1309e05f992f34bcb0b0c4a23b170a18a777b063001898e8a32000f80434a9a28f6b2792093e9828f007027e068a0200946e5040147305bf2800f80400003e0e13cd289e7c1f2290d5a6cb5f553b17fa13000f872237332390eead0f80fc8bb0d7b2c41029d9308504b89f31a6038f2c7b2f7efe7065c4d9315f3eedf387344191c2a7)) <<< 16000) + 0x26993e31c03fec9a642be56bf12cf3858f8b878d4b19ca80c09f8804a635e73616ef3c4f2dfe88857dcbf4f2b1503ba106271866618a8959619b5de87a951172d449cfce6fd8790155f474a09c3b78b8623751d9e5191e888b875c6918dfb411e4dcee920d01d64e182889e800015f484e80ec829960ccb9f49fd56f6494553dcd8f40b7a3a488401a45632ff07fef04e2c17ab615ef83056d00753000b79dd6a6e941e973a3ec8e7f53af6dee39d867ad28d409586b24e6f95c4340a8f3d47634b48cb9877f502f5e04a43b22e3763e66da8f9ea5f48adf37097f04bd6708049528b04513cef14e90ee44704aac35b286eed6b0abd61b549776853664e7afa0f7f86b3f4440a883b193c50706593cc65b8310dcd7ba66221f88d3b4d6450f6746861a2c7c800059a2001a84427017640ad13eab89195d82d10030c0e5b2c8c2022e73968a90093128f3e030482d0cdc05816a042b100804738ff4c82250304201000019521363b0371184d08c264461301b0030d04b84c2580612a030940184980e033a99ebbd9a25a56d0421a1e2dd85211608b8e9b56a00396b44391600e61264804c104001080c3de212fbca3fd199dc6e0542cc15069d9ab9b18419711b99d8124817e942ccfa6bb6327f14d301a1deab029bd74c489296b37371e8a99fac7753c8608aa6aced953db7fde16a13115e0bd49b6056825829d3e1cf3a1232730ba1e096fb8e8ade27627d0c6931f6cc11c51cd0e6dd36b09f23f443625361eecaae8c042e71ed1d9816f34564a112a3b000045421241b09109e10b2d26d04d0ebf77697060cb939058830463c8adb40903080021a26a2a09d93438d480a94506bf3d51b90007ddf1ab8802c824d4b0250c1f00800007f108301000102108905f4301d50a7c0b4db79af2ca6dbcd7963e926d0d85970eb257910988b0cb04804e00a0050000ba6b529137fda4e9d71f05b032873e214ac29a561313150da98269153b97724f4f364f6c5659a97d4cd34030e3e0bb4000a9484810c23c5611c2b8020080220b7dac76e98057b54ff9000e802200002008000022200015a60080200898426a2e6f2016952c98c980ed8f2aac6003c0108041946945c20b109503344003e010000078200026640005c082b80e02002008000022381c5c7bd93901cf403ff29eb93723daf872aaac32aac4618998901ef48d7e08e8cfb5808becf02f8adf2949f9ed816af2e89a115b7664fe5d3886d58cbe73dd77ce1eeebf212f5fcb2dab418005fcdc17d6a7d9a05e8858fa6383f10d33fc3cf84f6a34b91ce98e9f716c2adb4de186c1000890f67ac79093b84e670b08d9acd67b882eee4beeee60b0d400e52ab15b0422c41d41f11189e981c7f6b8e8c97d6104b5ca707af9ebcd5c60c237e2ee4c424e4470f0a5ce315214140002eb108d0584480f043f13bd2c19a5666c003d33c794d810ae4ceab07353d5ee349e3e4daac3c1df965636bf257344c0e5ff7be0b501ec7c3d6ce193a92f198f4f4709c2c11609dcf76c1f71b1dd54baba5cff94b26e03019af680ec09f43192dcd181fa1497de4abdd591459b0680514dd249f01ffa9065eda3ebffc2c752901a8ec4686ef3565397821fe40f44020d51b96ffadac1193353f6e7efe827f938c5327fd64687c8369a76600ccdbed78c0b3c6234b84e414e431860c05c084468904843944120b8a41c1041e609719608f26654ba20cd1583bfaabe4989f4474a35b5630365e8b6d43394a5a8d859e8241af0ae74a87321e004b65832602c94fac7b4de8163337062a8f21640063964da4eb85fd80512a53ced3969ce407e4e0208007068af70ddb0912e2adbcce4224aff7f2f505ab932f3a6ab7e4ecb84389de54e514961dc00023010881103e0280028e084604822c140026be4200660942b07f0d83f02e01002008a10cf44758801c4ca2e308820740200000ee60180200800002221141308901e0c3855917024305877b8982042e9083ac23082100860d4cee913490d6b8f5c40c0c349b09a20079c4413a14081f00400006810880d0438681f0240003ac41ec460d60b9dd44f74c26e45d31a2e230b58042c14822568f51cac5d2f3f70cbb3665749ffee1163ab4f3c57da4f087078000000000000000001187679cbc373d08dd27ed041532062842822c02001801002a7f7f9b43ee3c5e048360210f86177f00255f2a33e3dd01fbcffdc76694d3f9f5cbac306da0731cc95a03bff3e8bef0504f67fadc6a28dde857d79f13a008d3f621103c284304c00127883d148214a40e042079110420481e0040010da6349469953d02d6ec42cc6ddd9d391d42c144e1fa59ce85f74f493133054c608408d00b00a00700000cc445d3ca27e1a957e2489ec97a0018bba8fc1c78da70df486a2dca3b10400bf70b13f6d60c38bbb8478f83a6660a214db02292049c74b30302ec201e7b9055dadf422cb93aa1fc02351b411f35d081a6c8c8017f3d18e30a9d6e86ebf8430b0bf9519de943c0b02888e9f581146e5b9df5ba9c62c9c7f1a47fcc906000cf59733290578146573452115ea9843c9ad60024b48944def0d717c9aac28f5b25fbadda1dbf7920c5611a3030bbcc2fa10344adc64e1019381e79700231420008041808000310d8a78df63f56555f54029c767e4d6c941d632c78ca380ac1760173249382355bdfed15dee4209adb20e357e97e7409a59841facadc2832e64096104b1d16a5f71d3f0bf1bedbd5c1ce9a4c6b83fb921cedd1b419bfc4a03f7749251f9aa68b02236ca377944cfa6bec6fe416c4183d6938f840007ebd77)) <<< 16000) + 0xd0c79a388e680c745a94caff468d8d2c8dd994f7153e0ce08c34a6414f30d4f89b356c6e1095e3d5dea5fcc4fa5833906364ba01040a000567200154a41c0561022b0801582508c1fc360fc0bc0c6f1b7d82023739c8c00024383c008b146a55ac0428137483e8f0022142100803e8681f01400015e41ec360d60b9dd44f74c26e45d31a2e230b58042c148222d8fcf1923b02c3b9589257dc90d83a52cc154db79af2ca6dbcd7963e926d0d85970eb257910990a24408b008006001400e880f71e82500ec8d92c5ef9b3c51bb6a3381a16f5dc004c7397e62e2f9548c9792a39b1ac18f5491c1be306e36554064e7490275aa51c461d0003dc20f45a0790d0370481e004000b7e41dc660026ea400eb8082216c1048608003c17d8eb8ab5e1dfcded37151cd6fc8b1f08605e80fecf1a7f6d901962929acdf68cb88041361ee43063068f97e180630da7c07d0a1fc289e732419419fa75ff2b2b2b8fe1d062b2512703e4476cd6ecfd3b844f7edca036b9662282d05e8eff541d559e0cf600419d5458b7c16ae0d47d0f8e0f126400c4243d89727734d5bff474d0c5331ccaca046990800f30e3da81800000000000000000000000000000000000000000000000000065549b388862553fc16de0f0942e2ec3307c8c0c90c60cb0090040004104c5cbb69ccb12f21e2862c632b28ef7779b60d61fe239251a9e146d5af416cfb1e901e83edddd3630aa3c2c4e33bdbd48b4381a97a2aeb1ed091693876bf75654d1fe22059add8e710cbd4f0d947076af0e3ad2c8229c1fbfcb515dc8c5d20956490439af0a6b912210240c29b4911c274bc105c60c709f9ecb00e3a437eda5354b617303749f5ed74429e033d49003ce922f15b7547504fe1cc123b159f9694c0fd41809dbe7881a6a90514831d73542c55e5eea1f94c000967c71a9e2d98d0201852ca749ff1fac6e949c80383d723f68e9951cc97ec802a3c1f7fb9352bc921287303d2fee3c47b04a6cc00128099642c9b1f471e0217e02c7829ecdaa152c047c1efe100462042010e3d0a622bd080c97ffdb767826593084a0401e950f9301206108040068040001de41d8460ea1b0740d83582c1a81710a5ce8452180f6da7198009080f8022bfc69444876bb30db744ed6fb67e76d64085704c04eea27ba613722e98d171185ac02160a411305b98e9d1d01690d04dfb033cea9cd22d773fba8fc04cfca6d3939a334578420000000000000000021a180a201801400188b167e75c6bb5785d40168380607770f1b3d0d392c1e2493af4901ea08ee7fc0295d7c11adacca21cbab044014fe269b45e3649f3c312a9affd3bbd08b257f20d18e3f17cb6051e0d23044c8b14344d0e97ef381a99cb573b3eafb1e79bff74bd8a54afdbb0532edd416958b79769b8373fb83c8227e90500067a20e6230720de9203d8b2a64938a57c15078b22dd326c50a367d71180481840010a14c9ecb214d0276b38c6c18830800200000fe41c417103df75c9dca95103fc540576ca488860146cb3d087b84cf18903e95365815b16a2b9753e857c5539aa771130a4601d3620bab9b8e22fea92dfbb044cfe53671f5c43df5f71db33a98b44b8823d6c59f2a812ba65ef42cabbbd2662807866d6c1f37e092b6f3be4c06328273a73ef0c4a539c45bf8d978dd3a2f59b6bb645481be3ed19ac20c9f218027de76f4c25ac8b1bb8ffd954b8f222e6d2ab3bd1ea6551340054b13f4a3285fafb63d80504e74bdfccb200f069a372fbeea68400a3f958b01a5fa9202800cbc08e278136dcd78cfe4d371e88b2d7bc169143b213fc3156151000038b101a0900046610691903408800413c8009461070218378ec1b8660da1b06c05e1a00cbb3f63801d8c006440008870880200d60306a01d060bea42eea001608a82c440040987ae9c00209d361c901084021004010040000111902e07dec6438fb26aa24366684fffbec1621e4870d799e42bf2ef5a127ce1fd1d67078cf3e82c8fcf7a212b40ceee317a827f7690c78783e53fe59f00077902d02fd4bea0489eb155bc96552dec9ab881c8b05e0f2ea25b01ddc1ea3cc28c45ff180e906ab752d6f1fac5ce8e594a0a26d77806e1351b7ee997f008c76b4248fc536c616278fdeac7c82821a850ce4798003ff3f2f632ef0904bd8fcd3d27eef633fa3140c71470e86c33106f90880b109db6f00002d0903201c04004010000044620741e017373a51f46b4614602b59ce426f1218b8a62811b57cacd2aebfd12d76ba43f5142320510b0796a3c5e01180110f847ecdfdeaecd7ad4c504b483730ea34954bcb2c0c61d65470a3ae598a973dfe306e09ee5f036ac4d46cc68164de18831b45c0f7da63918d6f267069f0c62b8b0d4a8ef07c94e18cc2924838c1c2956eb205bf9dff6b0b195010cc1ba846258af309a603645795f3a4b47142b28bdbbcf7db9e46f3a7c8459daa4f39980f719122ab910ab42940001710c00d00d99a6a4ecfb1f355efa4220e867a8e11c5415adda5ec4d8e25f7d3367a438bd90f0fd6608ff5693c58667f426d365a13a705fff904c559d1200420cd61dc43aa1fb2078ece1a0f1303fd7fc1243566a81b3363eec5358e5a027dc4f4c5f2e4641ea5ff6994a1c90fc6ada1df28023947d0c3c0b6bdb25d0fd5c9b57a5931a8a5e36935e2af564a0160a5824e9b4f5ae72d679ec37b508a1ff04b02f4ce8f54882755d9d0d2c9b40bcaf2ace4035f539c2733292886fbc0ae6e2ff06398070bf82658b691125d5f69701b5870a8fa61b9eaac77a6134ed3f131764485be0112)) <<< 16000) + 0x789d901788af1e9bf39f91b5c9967fd552572199f54e1d9b987b5a3f8180b913d4f070c0caef4cc96f5e001afdf429951660fccea27c22325654e339886725aa000122441a4640d01a00165720ce2b01a05d8f1d522fc882be68cf75be7cb9368e2554935d8dcb88cdad3c6cbbbd731f265e8571dbe1d034607de3ba1023d164139cf219ca289fff5118c9180369df6b54e34a8fdb932680977edc1369337bb40060810aba463fcfb2b936f681f94f31a431b4e804c693bca64c4f81a1c4d2da902039920b77762f9a19abd6c08b37ba47fe90cf1eb499cd716ec94bc77688b03b3f15a04d9dc1575579e38ebed9dead2bd880445bae2a8e0a5be72c009ec6b5e746a2bc20c711520c8c75f64cf66fa9a84a6a9df81c8edc3c8abdad31f323eff6ce79e21fd7ce5660a8eac7a4200fdefd032f113fcd500895fae2b5acd8bf0101199bdc98e453ad664d548470e15228264118076bd21ea8d4aee9b7efdad6a337b1725e9f15657462376ce0803191280358a9cac8318b9690528b5f9d2f26bd35ceaa74b245f344a84d0f2f2be4e451cd629487c261cb5eb11e3378a80e45859a4f3da3fb6419a5fbf93439bc22c9e4c14adacad9c76a61716930fb0f84eb8e0eff8f54d34a216aa008064e96af1907302bb07988dd136f05ee4746d7d6c192a2f7d22525e8c4c9eae31832c3aa49cb17ca3b0fc13ee499711117c5780002449066150328a8190540c62a0620d03086818004001c14417cd40bc2a0560902e808009724801ebc10043362054639187d2084b7be847224423487118a45be6eed1c2921b8e3034640565d30467fa86e16b1fc18cc8b608ad7813c18201d1f01d78f62635fb388300a481f7e2610649fbfa28113b7d22f696dee0c147ab1e6a3b4b0fa347370e23440093e8c2f27b13595b4fdf2003efbe8b6521c72c2450012d9c83a2aa61cc6b2eab143335ffe62468282c5de040010b78badb80802e3b05bfdfe7c6277fef639fc21bf2020644a64e0065ed19b1ade0d3a8b14de4bae554a721c0002ce9004cdc201321a69e9a78582a4efa09abc576bff89a5cd17374f2944d71564e0400000000000000000221622438ca18edb39d45f49af9aa305e32790c34e9e9703784f200000000000000000088420630028008006f903f0ec8dc832d99fc2dfdcdd125cecd89c624f9f1ebd3cde2eb7e64e1570bd9a43df4a11400fd5dbf5013025d367ae616e42a9d8bd94d21644e4b6fa7e68b0a29f4a416730716936bb154815656a0caa6eebbcfef8b17d129668ae581de2f8b48a2c5a4fecab0cda7b0cc5533a808efc8018b892c5274ddd9c1a812f0743d24f65fd37d20ba013876f29358f3db6e4a4ffae28ba4a83d05c0100039f900a2cf202006a68ecd3f21e6e8e1c4d449b403bf3509336d82459cde54b50557046f8e0605575e082f0ef40b31c21420811000800027ebc27c6c4a3ccb756788e16f22e5bc2943abf1181427cf3ff7e02cb1c1fef7879e8ed977d578917c9c6c52c5dff496f6f3ff989d2f8cba48b0e2530a2212c04d30e29c31dab9b845a3aa21e434cec12c8a8741c22d84f9ec72b28bee3b6b6a3e12e4f8110aafdc8a149135348c627b7de00829e39180a22b208cc1b0206f8dc18b873d636d968338fc0c33d44001cd19e080c0efa40421b3bf15bc71e441286e4d1c5879e8000ec454953204427093afa804dea14d264ddc1bd02eb8271ec7779837308c8b14894a46290e703348233edccb627bdbccc3a095afdc31c2a530991e800028e105b3502d0cc164460b02305709df12adc4c3a02e85132a318b33a2c61ae0cc6cc4599d162c2222021c21422011401004106fa219f2fd1d0fc036feeaf5e437ea4045a44d91f46a1096b0f184309c2453a140a13493124476c9ba7edb3aec88f22dd9f48ad92d6a0faa7d22b64b5a83e94743fb5faeb31d51d0fed7ebacc760ea7a0aa6e40d10eb774b949af38c1bdd750a0d8fea14f244d9e0000000000000000042a144ca8c62cce8b186b8331b311667458b088c90c80c60c90060020010404dc4b75da19874a7af3a2fe0dd319b2fb044bad4bc6dc8d2edae490437e1496ea3b7ba583b3b2a02f7a826ae9a6a146a01c21c29d9984568c6380c88026241c09649a1d4232724a513607533ab31a0458e5212ca08c13811631af37621dbca70a8d47cf02a14139479c2d981227862b5898eadee1812c635d8cfa21774b2d0293125940832e0862821e31d4c4068e9ef39a0b00df0111d0bc593d914a249bb42b9000ba313f48a050a9bc45ef3c87780011044e18df536ec4e9a952719d6fe400000111f537731497e67d83ec2c0ac75c446bf3a03e118b1ac4a16737952d4155c11be3818155d7820bc3bd02db33210a932f0d707995b3902a42f8e0f3a722d833dc405c68e80ff28dbb143d32c62451c21810c1000b5afb6326498640ec4f2ee43d564db8750713a0dba809685affb1c8d4410eee3ff03ec925bfb315cbe99741a1de25f61ff1035e578a6bc545649472038fd5c1bc835f9c6a8ee01b811cbdea524d12d2e05095131c0a12a264000000000681c3c7670904c18b18914b0c708208b0000f59c9e6a3270ab09849c2a5ab1ce488011d00018720480a00061120ac1305509d8e0e17e7682c6e9bb25b89230a6a04c402043fff86920832d4951680800ce900610202e21297a5009c50840217c143365925d6a9cc325e05f1b4c3680000000000000031478ef7175c6f181e89a39839439821a10611808a00060400401be4800000ccc0e25cdb27753e612000003840386b5c817d4d1c1939)) <<< 16000) + 0x3eac8b8f052800e663e282749f6443b3c01b9e0ae958a0051d996201c4821280a3c9000004950e26eb00c5b8386187039890f0462f7aa4b14100000d7703000000096066042200800009b9f259d96153734712aeb8b9d80d309160fa940f00a27082b0d3e5ce0deac72157606060b62ab9e2a2810b374257318c0d373984f0f8b00426b80fb1d9e480148143c994fe34672713752d99d94f131ef724b30a224a8564d82814bada272230218d49bcc8305e731b27e060000003840c800230100000cd9054050001e890520100039910008d92048330231581108c14c4404023be0a19b2c92eb54e6192f02f8da61b40000000000000018a3c77b8bae378c0f56737952d4155c11be3818159e82a9b903443addd2e526bce306f75d428363fa853c9136780000000000000000108cc1ca1c70840870480042411053ddec371f4e27e494bb1f2f9a706ac6c15f4324e6b66505c20b5bd58e9c31108eee75ae10c6d0d8a758850a1dfbaa850a89114cba16f3006fca56392389dedfc587a5ed6fc95e702546193b47ecf4154dc81a21d6ee972935e71837baea141b1fd429e489b3c00000000000000000851e69a00000524f41b62020ac6798d1371afd798d2acd40184ab3500584342899518c599d1630d706636622cce8b161121839438810e086089679228d3aec6dbb38be858204465c100f2e0e5c66722019c04d3c16043910db358b3572e4ba05d31ca13d1e133e93ac881e0e19e619cbe752e796c30512e745dd72b6fd6c5a403a0727710a226c90504b010290080015e482886c140278142544c70284a8990000000001a070f1d9c2413c93893093831032811810411070280200d04f05df050cd964975aa730c97817c6d30da000000000000000c51e3bdc5d71bc607ac0a12a2638142544c8000000000d03878ece1211e49c49849409400e01fff24e225bc20590b85d0fe51f3f65c4e70cc78d08a829e39864f53601a825adb7439689b4926df6a5fbb0fbd19dfdd455cecb13727b0c6f98b4000ed4c0a8613513534ab19378e03c754c59f041c51ccec14a344280400bd2805859c8f01c046672fac0270c200085f050cd964975aa730c97817c6d30da000000000000000c51e3bdc5d71bc607ac0a12a2638142544c8000000000d03878ece1212051e38e29e21619019a00170c0100680010c104f05e05095131c0a12a264000000000681c3c7670904f24e24c24a08608104a0060001c0a0080340004a48270a80013f4f1333037c9a8309142fbdda614207f3602afc610a778a339c706a8a1f31801030594931670a104fa44aa302042ab4720665801aea502080c4841280a3c9558b66169c4fda507028c240000096050861c66f03103495058e604100000258020430e0430c138410804000058082680f8866fd4589e1206912124bf2ced10b20000005b8d801c207753615b3c024312829edd9af42861dd4d6823cec9005cc04d7d34480003713cba2636049c410205e07800020e20982204b0500e00800176480080d10240d000da4904a2d0248e8009944801870904841001b5c900397720080281b9de8ffa8c088cf8a610a0e81e89cf880f5034b5e0c0216fdc490a06a29ff300804bd62d538008204e6040010a21878f93f75cf0f90ffd629b304e958f1b230c6155162bc46dce18286a4097e91bc1b8fff97b25e943dc8b1cc00f16efe550a0b8f2284e933929df29aaf777b916a60d83f17236dd3261ebd8eb2ce9ac204b780fa8803dabd0694e427a2af2e6b1827c9ef03dec4aa2bef000014f467a2c48ab73cac6abc4b13666d16a3f51646ac6dbc119e8bfeb87e6b635d3aa909cd85fc79ccd0dfbcb5fdfb9121265956011c4608c13f137f002e06e18495c1ab594da45372ee82893a4fd61bd7fe9a5d10d951f6103f38e1fa93d9202dcda687eb4900b366702b0d1a02d0510608508700400008bfddecb3504b42b452171ffa3a749664d787670aa5aec10e0721c006ca93dbe059d6a524779bf89ffd537e89fe4aace4dc81252cd52de8001d490008f0208a6a044198218a8108560822b04001d0d4041f14b940a1c093f8a4028d7920198e084e7f066618213e0c528800ca3044010b1f9c8e1c04ba78a9c258c75e160d0493c2425bc7f5baec77dc0ee28ba7442620b07080a446830e1f1e05aa5096f76963e4645810213f0206c8bc0a06489d9478d6d039cc00fee38048288acc1fe51cae315a35fe7bf57c449e9702eb4ec0223a840c7e17858e44566dfaf4d5be5801e7cfcb100acd8f55233c691b83f7af8e10f769904cb4c19b79504c7d1021c4c2ffe4d358e83a33be381028727f65139b9d9408273204b020ccf20ce8edc8056b931582b09ecef144af51b6ad81b32b70fa765f5fecc13062d8760000c9481f8880f834000d2640f4760782b03b1581d0ac0e4460700b0370581b00ec7c9dc297e382223e0dcc4040bbe796000046403e0100150581882e886e94507af7bf633abf6a88e7b256ca738f4cce41c8d624184bd335dc1bcb78527b9150dd2795394b8ab10e3afbff33068348b382d3fd2440dff1321ae06466272fa33870e1a7ad2e2002e009cd9d0e53b784c3bac0a1b0884efdd94642aa8922a04aa82357d308a77c7b1ae0de456b7df69e6093960fd8f05148ef8ec404ddcad1b74431c360294ce4ccba9032e099142b3e78150770d6bcba07539b545ceb3ca830a0cf394eb7f15f5d1ecd68ffe65ead2293417a0a1db69da18248248148c7d8aecb40430524a6635f02625c881a637423edb5f1410c06a34d54285319efbfd9808fb4)) <<< 16000) + 0x52f2652d089dd2427fcd0d6980024946e89699284bd72d2a1a147a6a93d2e853e5286410c60000f3c81a88c0d0360661389a1ded9e68d30de40e81943b43d5d601c614f32efa78114d10bcca00090236b93020f804226969c6c7068f11db02e143829af3066879ff759a90188ab70d44a083c0100000f632312b51befa119ba8d2e81b8344bbfff8439225d79a75714bb580e302152081f4063beecf8bb1a53dd7bf32478d92329cf65ceee61fa05010f703a56ae64f663c765d6916addc1ceaee10b1a93e7aee4c4200e25de61e6e2d0be1b30ac206a4cff03a40cfaf84b096ba619f35e1e6a6ed77920a787c3243ecd69c7ac854930afe3961846796000010cc81900e05a0ce67f4513ed18aa0240cde2de38003c543c96109040780200001a270a07af314ca102e991330e21c3aaa60180e74250942015a8604444094507c0200002027060485db0f142bb5b5a2d0611a696216cd01a10b9be83802c59f8eb0c00b8f0eb40804c304201000013a20013ee40bc7405c220012ea20503302609d047bcbab912c1e7a1e3aa800110e10804384d76b3474b07d3f2f601805dcc92af2401ea3b0b600848383e0100000da202a0b03105d0151e28ee280688f4a0092101c0047127545e93c508414985cc7045b5ca5e423082000801800f895df6b03450a1e1734c18010c441342803ea54376048183e0100000d2200035460302dc2db40a16c45e2330d019cb76d504000f3c063b1c008e963d682128a108040000430c0897590357a30305e77d9a6c13c239d500406142da222c78e056ba859c3c256b22f40700b0f1c8b836951b9cf8f5341a912a1ac06001207eaf1a85b37119418da7d890c14c040046400ad701ec5c06a783db709bf0088006dd47e25ef6cf76b951773802064732e01f0dbe477fa7a3fb87b08993fb37a984b81fac54d2ba4a6990ccadb814620060000088c40bc7403e3a02e11000402102d2d0160280027c48158c80078b0801a080a89747669f90f37470e26a24da01df9a8499b6c12232192310120347bbb11a02aa2b22b7439e05975c6b00fb2ffe563ff9582a848a48238030020080201a03b78e097c65668fa1c1eeebf8073e1942c752bbe73b4dfd215f9e23e5e8dfca1756215ef8295986b7b21208befa9c6214d6462d0ba07b9a52da694b81516b599a317aa6d24f2bf050bae35807d97ff2b1ffcac150dc25c97e56bb808aa0b10550b0c804304b00400402471fa27392c9b09da1e53e329aaf199c31a2881bee1ead5db8a4908d9a2f582b58e598bb5f809d11e51cb0252c13d72152789084f4be13850879b19afc423102000857f8d28890ed7661b6e89dadf6cfcedac810ae09851d9a7e43de32ce3a8936807767ba605702260b731d3a3a02d596516946e40b42462423001c008012912bc2615bfd29edfb9c4123e8f9c683ac2d751164cf50d467c2ea38db792567b6fe1a16b1c7875d8d5e7fd1442eca3a0006cc40842602a120004572052330281581388c0981740901668019a054a111118c00454c40a1182100043480491991b861e64127f98b000fd672b31801080420000200800002220001ca64608082903301c64be2e21410000a2210419c4645f01c0209614351801084347726042000801282800050081206c08c36044130210901004c07c1403c0a80a00802206f359a0e042183c010d0497ac2fcc00ed0d8b4800062497c20208474f490107002100401004000011101d0580008a901c010000c9901b0d80184e8b3c9ddea8d059b6601d960b079d76c201298f151c100aaf8342804094707c02141c467adb04022dad56c820841e6a38600d038f348502078011848f7b39d250704abd4a921a231a41c0800007109048103c0100000cd20340ba0e548a0141409043681c0413aff98b8600b5c5249430036c026e12820f8043092070ce38a0d057832c301000f59b8a04a7cb5452411ef2c8fc40753d468a2c083c00800011e2032120180900012e90170d00b0080011ac8002c590150d0003da9014290005bd1013350009cb90123500892804024002ec0400f9548024b29a19ab463a1c9bc3793bb2842645e0b6bcd2a869c617277440000000000000000000000000000000000000000000000000003188a18c10c08a088086004020a821fca9f166ff274f57343cce83cc9bb7d9ba3edc092d6577af6c60ea07a16b408fa4ee940530d7bc6b94b2044b1e6bf66e67ea24c4c5c12e61d0655b1121c650c76d9cea2fa4d7cd5182f193c861a74f4b81bc2790000000000000000004411841c21821420411400c00401140430580200da19ab463a1c9bc3793bb2842645e0b6bcd2a869c617277440000000000000000000000000000000000000000000000000003188e38e28e18c18c00a008022ec1f4c7084d768c2277dbb47a4c75530480fe8e38dd2640d79ef99c5f576b90418cb403c17622438ca18edb39d45f49af9aa305e32790c34e9e9703784f200000000000000000088a19ab463a1c9bc3793bb2842645e0b6bcd2a869c617277440000000000000000000000000000000000000000000000000003190e38e29018e18c185c5d17d3808e3ef39783cdb666e2742e75c84707933561120c8bb306240a76897ba8f2dbe415041a68f231a5dca83f4f6cb3f7ef089aae443786f37bea8a4569006713f4dfdcae4bbf53b17df0d0f42e23648b7a568aa1d65db294e485a907f1c1403864000c204034a40012b64002ca880616802cb401442009150040a801c3400c02005010007e2900415001888008440020200001004e3d9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase4" = "QuadFullEightCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase4 private def zz2283:"s08eb"="s08eb":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l15 l17 l20 l22 l23 l25 l27 l29 l30 l33 l35 l37 l4 l41 l42 l43 l44 l45 l46 l51 l56 l57 l58 l59 l6 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3858a53be, -0x27cee1e80, -0x3bb653018,0x928499ac], ![-0x27cee1e80, -0xeb3d3c3ca,0x19158bdf0,0x1e457701c], ![-0x3bb653018,0x19158bdf0, -0x102c0bf879,0x27cee27e0], ![0x928499ac,0x1e457701c,0x27cee27e0, -0x13e771198]] noncomputable def hinges:Hinges:=[(-0x3b28bd2c,l6),(0x635bcd9a,l4),(0x38846002,l9),(-0xfa12c9ef,l8),(-0x8e852b9,l11),(0x5a774948,l10),(0x386267022,l13),(-0x3751d142,l17),(0x2fa7be40c,l15),(-0x29c36e5d2,l20),(-0x13435adf,l23),(0x110ec745a,l22),(-0x13e771198,l27),(0x13e771198,l29),(-0xae042fa4,l25),(0x89a5cd96,l30),(0x13e771198,l33),(-0x13e771198,l35),(0x13e771198,l37),(-0x568507c,l43),(-0xd36eed51,l42),(-0x1cf2c2754,l41),(0x37607e0,l46),(0x6645b952,l45),(-0xf017040,l44),(0x13e771198,l51),(-0x7fe575d7,l57),(0x5ca03ed6,l56),(0x5c02134,l59),(-0x3b9e0ffe,l58),(-0x20532145,l63),(-0x894c8aa,l62),(0xa71470c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x13e771198,l27),(0x13e771198,l29),(0x13e771198,l33),(-0x13e771198,l35),(0x13e771198,l37),(0x13e771198,l51),(0x386267022,l13),(-0x29c36e5d2,l20),(-0x7fe575d7,l57),(0x2fa7be40c,l15),(-0xae042fa4,l25),(0x110ec745a,l22),(-0xfa12c9ef,l8),(0x89a5cd96,l30),(-0xd36eed51,l42),(-0x1cf2c2754,l41),(0x5a774948,l10),(0x38846002,l9),(-0x3b28bd2c,l6),(0x6645b952,l45),(-0x3751d142,l17),(0x5ca03ed6,l56),(-0x20532145,l63),(-0x3b9e0ffe,l58),(-0x13435adf,l23),(0x635bcd9a,l4),(-0x8e852b9,l11),(0xa71470c,l64),(0x5c02134,l59),(-0x894c8aa,l62),(-0x568507c,l43),(-0xf017040,l44),(0x37607e0,l46)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x2416029804000144450480884010000000084320286018000001043101b0c0400000000521607180400000000a4240630080000000001481240100000000002a01480200000005508805180600000000a82405300800000000e8700a601000000001d0e024c0200000000005a0710040000000000b4062008000000000ba01440180000000002e01480200000000422a07180400000008239014300c0000000070480c60100000000d12140d0010000000391881b1806000000000005032004000489020981328020000000000090188020000084110500e200600000000a4180d30080000001441406260182c9286046019810060000000411c81a180600000008239036300c00708c111003248028000000188a40d8c030000d22703000d200800018c4805807a40100000198a44203c801800000000a05024c0200000012822041180800000002609022300c00000000004812401000000001d07038c02000000003a0a0318040000000000740920080000000000f00a40100000001e824028c03000000003c0a02980400000000000303200400000000d84812601000000001a0d018c020000ac1202c04ea008050829010800cd40180002684609006480200004d0841200c9004028814208800c6a00c002882b822006d40140002905409007a80200005409c1401b50040014c144130096a00a0001702807005d40100000000004c01240180000000000e01480200000000221603180400000000442406300800000000038012401800000000012014802,0x520710040001885310807a40100000000005e0164018000000000b404c8030000000001600590060000000000540720080004b0a60901288020000000158480a8c030000002982404918080000000000540e2008000000000128124010000000000260148020001242982404a20080000000982901a300c0000000128a81a60100000000016140cc010000c22886c0662008000154410c80cc401000001d08c3204a801800000000d06038c020000062220481120060000000034180630080000000088301c601000000000003c0c8010000000190881118060000d4210480cc40100001e0420d01388020000740d02101e10040000781082801e20080000002105003c301000000000000e0640080000000150a038c020001043182404a20080000000000140920080000000c452044601800000001915028c0200014c3182404a2008000000630480923010000510c6090128802024121312401e9100600000404708126180a0000000000180520080000000068281660100000000002201480200000722a0481120060000000054180e30080000000001081240100000000000440c8010000000000320710040000000a83101a300c0000000148c81a6010000000000e0c0cc010000052210b01b20060000043867024c3014000000058706068008000010a1940930c0500000000221a0798040000000000090320040005484609006880200000510982807100300000056160c0720040000154260a01c400c000388c21b019880200000250c858049003,0x2a4c481a0020038c5802802fa4014000488a8090174802000000014884050c030000000430e00898060000005110406c30100000001248206c60180000000003502480200000000006c02900400000000d8840e300800000000e8501660100000001c8480b8c03001ce31c4a81eda00a071461443c085b401800720c41180576802800e118220c066d005000000001e0e051804000011c5211013400c0000228a82404680181010d10a400c490060000062210901fa00600014431064077401000000004414066601800000084150318c0400000104158183180a000013c3209013400c00000128682816801000004d0d02808d003000000004a1607180400000000942406300800002606412026801800000026844028c03000000004c12029804000000a9088034301000000014424038601800000002b0a038c020000000550900e18060000000094480f300800000000882816601000000031888070c0300000000420a0498040000000078240f30080000000000f80c40100000000001d0188020000094210c811200600001283409023400c0004a864088092802000000010864088c030026e188108044a00a004cc320220109401400048868090112802000000002e05014c0200000000000a81900200000000b4180930080000000017060660080000000026240cc010000000000520310040000000005500a200c00000001682814601000000000d05028c0200000823d0f01b20060000000000cc0620080000000f424036601800000001e0a03cc02,0x210880b180600000061154082301000000000c8b0126010000000188b40c8c0300000000002a0490040000000e21a01c300c0000000001c81c401000000001711028c0200000000002e04900400000000078903300400c096124607aa8028000000001a1c0cc010020830c5180e9200a000000003c240d300800002184812048801800000000220c0cc010000003082802e18080000000003102c200c0000000000480e401000000000002c0c801b0c48904101ca7a00e00000000a43c0a300800000000003206400800000001511028c020000003982404a180800000000088f0330040000000108f01c60102861c90d9039ed006002a438460815da00a00524728c5031b401400000150a8301c8010000000000210388020000c62206803d20080000000064280b3008000308861981348020000000188480b8c030000000291081b18060002446c0d808940100004b0ac1501ee802000000001609024c0200000942a08817a0060002c4a10d0068401000002d94c3806880180000002c9440d0c030000000592880a18060000000074380e300800002c8e43a054801800000001d0e018c0200000823905011200600000008239022300c0000000108e814601000000002e1b024c020000004182404a180800000009241022300c00000000882812601000000002522038c020001022202405a20080000000962202a300c0000015128880a8010000054258880a90030001262902206aa0080000000000940e200800002912c44054801800000292612025002,0x221e02980400000000003c0520080000009008802c60200000250982402d0030000000000f004900600000000001c052008000590c6298090802000f208a0b406310050000001283a06318080001d8250740cc401000000000e8c8146010000000108740d8c0300000000000a0390040000000000c00b200c000000000026064008000000d42701b0c040000000001a805100600000000006c062008000000a424002660200000001609c04cc0300000002a1280598060000000058480730080000000b042026601800000001611014c0200000000016004900600000000036009200c0000000c816038601800000019024030c03000000037088059806000006804100263014000000d408802860200000001a024028c0300000000000a0310040000000064240730080000000d02201c60180000000001601480200012240848034200800000009241034300c00000000150e066008000000000840b08030000000004c2819802000000007c140d30080000208fc140688018000000208f4088c03000000000006819002000000811d4086301000000001d8701c60100000000003901880200000000240a03180400000000c4240a30080000000158901c6010018818623003d1005000000003e140718040002d8520e40654010009090d09004a08028000000249140d0c030000002882802e18080000000002902c200c0000208d03a07a801800000002613014c020000a22086c04220080000000720a037300c00001488434048801800000198190048c04,0x3902c200c1631248cc81cf680300000000190502cc020000000002481610060c3cb2893c082b4018181961121807d680303092c6249029ad006000146460e6055a00800000000008406200800938f218e0526802801211d030405cd00500000000006207100400000000281c093008000000038506068008000000d0b0703900200000000000c0690040000000054140b30080000000078480a601001031ac28c0a2d00500000000003204900400000e8562202c400c00710a510402e080281c214d102023410060000000190880b180600000a4381102a400c0002887010817080201410d8081023210060000a21a04205a2008002843404102684014000000a210817060200000000000d024802], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((0x125fa94400dc7bef2fc3e2d24e0f2ea1dba8c1287330c4881c9c864d3a7cee1e7fc93a190f7048cfb552ecd27887277d883f37e987b708102112f52a2dd81687166966865827008040e3ed737ce1dc119e3e24159de8a493c28e940ae163fa17018dcf8dacdd34849989ae55ee3775278e5e70db84e20563ff5311e3685603730aa8c791a945780702c8db49ba9b1da74e147ba09c7cc2e81fd04d2d7bdd5ed97fe08c926a338696974c929604d0f2c40accebc342961065ed4696caa6d1370b04c3709c48d2d1d00552951af671b5308d28c002f629b95cb7643a6d6858c348ce2bb63dd001d102871c32631c93b622083a97fce1e3e89c63f33abfdbf4a0b79ac3dcea6a2428cab603f9e14c19f5599fb6e8c42928e440d2000122c8ae90c158662b80315801c073c25765da0295769a1a8f164a0d22be8065b372a124006b340a0328328a10804056c07ccc3122072721934e9f3b879ff24e8643dc122112f52a2dd8170d1bec5860ff14cf8d4a0a1a069e6a441e3a429a0001feee903de2bce5792d736e833567adfe745f852cfc142ceb12b70a36ff6d5e0c843a32ec31363fd0002b93c62fc309f20e11de98f1b678741aa73fa1c174cddc4b9c016170645800494708402000022040a887c58bb953f584e0c11498db86686f2974acd03828eb9e447420007f43097c0e01bd8d695ac6800000070801409c09e0c71218724250140000d9115a150ac8a8001cb4c97ea5100371efbcbf0f8b49383cba876ea304ad086615d000000001bd1092f1bb228c6541103080667125865826805002009d91f917fc2f458a125db9d6ea197c1637b6888d75fc0c6d6659e32b49e1a56b89c3e188962e6b926d8fa4f156afe2455f6b0531fe435f83d7464384ef00a695447500039f3851ca7d69598276a49c808a251baf68c84124ed11eb040b2104b309401a8655cc0800045de7008021392100040560076a0f0c4b092fd4a1fb50786256497ea5100234cdacb8215222f15bec41f9b828f6e700824ec33e50c92d2f527a32b341af17f98859608c72f52a7bd200000000000000000414b25312b2a8fae2f069505572132cdbc94aa222391fbc0a25019f64f889ee02d100000000000000000000000000000000031d211682392f1491ef83ce8dbed02b5440534b3450c20c100080a9dfe137db518a26362e5630cb8e9c4b8dc99490d9d169c603300d46465cbf640179f732910ed0601d6edeb1d3002d498c34e8dd1a3c2ab3d2f41359211534c5b053d09aee2b47304e64cf6293cd4f9a4d974c4459e29b81d5f5b28a6008aad718fe37a7d698c705c3a6908276daa30930908498ee480fc570461ee1eb648a84c16f75d14000017700d10943edbaece0b9b9a8e8ec3086d8639091000d7936b9b0e02f28e7c0641010a3121200a00005588005091d086615d000000001bd1092f1bb228c654112d41e1896125fa943f6a0f0c4ac92fd4a2004647125924882065004800008dfe326c7d15ae119a1ef332e6c46a2a3ca963b7e8071e7dcfa12f5534869d777077498a6248b9de0309e4d3e02b3f0d6cdf7772d8c03bc40f02762ca32168001ba91571d0ab0e8003d8cda83c312c24bf5287ed41e1895925fa944008d336b2e085488bc56fb107e6e0a3db9c020aa47745155d02d2c94c4acaa3eb8bc1a54155c) <<< 16000) + 0x84cb36f252a8888e47ef02894067d93e227b80b44042c92020812400c0000d87a6b10f89a3d1e5920ad6dea16e65a27d5800681226aaf600a0937854e85b010bfbc2609782cfb82dccd46069100f482c0f9539e0e6aa1f05182155e16dbac026fc0fcdac73eb61494b110ba10cc2ba0000000037a2125e3764518ca82200000000000000000000000000000000c74845a08e4bc5247be0f3a36fb40ad5100840c808208c04c00b00128b0402e0fc195c413c9f69a591768a1806709b1fc41c084cb51106610db4a7b5dfc5be9a1f55d49802060883cc068a9b3f038c48bd89370c2a0007706d41e1896125fa943f6a0f0c4ac92fd4a200471c8a235b4adbed32a1c2a60779bc3be70aa6f849f797f99ce0000000000000000021259298959547d717834a82ab909966de4a551111c8fde051280cfb27c44f70168806510684600480400000db5e535b7a7f0ba4d8ef79ec5215d2c41a7ad4fc1e4df530ec4a6d5cdee56439227c0cda868bce664af9a5fa335089a12931b1510df35829b7750d2882f8a100afbacd0c2eaa18c6934913d061e7bb1a69e6d48b6d3d32d0c0a4f7b7342e39ec18acc528e5fcdaa593bb473913798975a68553dd9d33e4833dedab57197b9e9c294aea814001c808aa8c85506429e0a15301000838192fd4a2006e3df797e1f16927079750edd46095336b2e085488bc56fb107e6e0a3db9c0204225ea545bb02e1a37d8b0c1fe299f1a94144b25312b2a8fae2f069505572132cdbc94aa222391fbc0a25019f64f889ee02d1014e24b2490c305bbe25921810286e52459ecd8cd5f646241c33b328e005eb0a3ac6114a4377f4d60938dba1c7018a29a707221833fb7b1c3a90499b1ea52848d9e2103a2dd737a1ff6b55533b35f38d4f4c6fa9adde56da8229699510601da83c312c24bf5287ed41e1895925fa944008d9f6aa5d9a4f10e4efb107e6fd30f6e10204b25312b2a8fae2f069505572132cdbc94aa222391fbc0a25019f64f889ee02d100ce2490c304d00a0090003c208b019ac7d3811c8c5a2a3aaca3dec9cd08e3093ce6643e7f21ec375ca7f0b594b2ad0ba5bf728968840bfd930bf527714933539eb2732600244b1c48751f28501615163ea8002581152118a880e1a37d8b0c1fe299f1a94144b25312b2a8fae2f069505572132cdbc94aa222391fbc0a25019f64f889ee02d1008d20a20808a0490080000399197ddcee97ac4be3ba58c1c28f13e7072fbfc8795c0490e0f43004ff4e5dee0e33864124b1ca9aabc2be288691e781f8f6741e978695aee5546d878b650978719e9a3554c98830ca6a00081a45409629e0bd2072721934e9f3b879ff05b909b041231b44ce06f00178b55a8a094bf6b978e7d6051ec557449a358dc3bd571a00000000000000001ec346fb16183fc533e352828964a6256551f5c5e0d2a0aae42659b792954444723f78144a033ec9f113dc05a2029851219a11409b43c21c3e7175761db485dba848eabd552603dc1a2327c37a4fef33431cd75e24676bced3a0f5df08af58f3a1f745b0a31383993d21b37a7c669ca699b80b9e5a44c083509f0e52d810200a80f3836ae979b6806ad235738c41343609f34843b04118d5ca87700ed41e1896125fa943f6a0f0c4ac92fd4a20046c6d13381bc005e2d56a28252fdae5e39f58147b155d1268d6370ef55c6800000000000000007b0d1bec5860ff14cf8d4a0a259298959547d717834a82ab909966de4a551111c8fde051280cfb27c44f7016880a614486502500017deed43a18a266ea1e76995b66e39b3143f8cb23dd082e1e5eb22c9cb482a60dbb2c3385a5a916eae844bebee61dcce9db79a943c177e5305827f6698bef808cd59499847f3585128420c6ca4a2488ef82a0d3328d6d50e1d0d63bf8532111056216da000d0241584629c0399b597042a445e2b7d883f37051edce01031b44ce06f00170d1bec5860ff14cf8d4a0a259298959547d717834a82ab909966de4a551111c8fde051280cfb27c44f701688085921826001801000043ff072450f7c5af5ca6865a0d7beda47538e6ed613a283dfe0e410cff0b6b8f590c1fa7d56bb6ba5d294833f8fc228a1a9600919c71f9e90564aaaf1bd04fe2948430efa00091e4534971c8a235b4adbed32a1c2a60779bc3be70aa6f849f797f99ce000000000000000002162d56a28252fdae5e39f58147b155d1268d6370ef55c6800000000000000007b0d1bec5860ff14cf8d4a0a259298959547d717834a82ab909966de4a551111c8fde051280cfb27c44f70168808690510480400000a2d1d5a532c3e2efcb5de645ab16bc733a8a70f51534bdf96d5776c534c33faa49a2115dd6b2d60047fa30e7491a12b7b59fbee150e2a168fd109d0ffec3f0a7600bd940ff26e671a81801b7018e834aba66bf72a8d6845b30a419926bceab09d284858915250d1249552ffa706bb2572a490ba649e5e0cd249c5da7534e22984f892cd92d1b2467cb9053561c5016a5cea879074aee40fabc6e689f0b14256429b164e8004691001afc22983a1131d09d06c52c140054be40e4a60703bd086615d000000001bd1092f1bb228c654110000000000000000000000000000000063a422d04725e2923df079d1b7da056a880450430460248260050009d8e178cbdc481feba8b0ac3069fadb8f4f56be9e2377e07d64bfbac081c532870120b925718cc73d0eda16b4d5857e24cd8688c04ec59b4605964a6256551f5c5e0d2a0aae42659b792954444723f78144a033ec9f113dc05a2009239410c11809600e)) <<< 16000) + 0x000007c928d35e794719af07822d01905830e47f35ffde9288fcf5bd1b3cc71b0cd75bc55e029d09dc2eb6d0746380f60c2d2114c5d8a5c7d38f62d6dc47ad70882a8dbeeaa938fa83d64c6ef97d2a8cb43165190b4000fe889d02b71159f7400000002e3b84061ff397f48204b25312b2a8fae2f069505572132cdbc94aa222391fbc0a25019f64f889ee02d1008c1c91c60870410000071e632d78f51efb14e77cb165f0f69e5e0910be266240ca197a6f04c4a3bd3e3236850c6edc5e2b4fb04f99e913199611c8637af4fcb9f721e4475b5bdcc5b3d6069de66a81fc3464c2c3f8c60ada28ccf1ebf2945182d52dacdf77b581607520876b61d74aef48c9f1924c50a61ba6158e4511ada56df69950e15303bcde1df385537c24fbcbfcce7000000000000000001092c94c4acaa3eb8bc1a54155c84cb36f252a8888e47ef02894067d93e227b80b44023072471822c02001c00000a6e5605e640c17b8dc174396f83e1fa439277e7311b06b9c3249641201feab7618ad31d007b05b671cc096d6e2ef7023261e99d8ff8ed73bb659209ad80856dcbaeb7e2488b39a028fe11ec44c989c8051a5a95ee805c2eddde2427fb199664631de97e5c7154a0c62367ed0005d420016aa4528942924a1480902a02814014002776451c472247e88763e65f0f3d6587103dd79a344d1fd49e9c303a517936d8c5c4ec9962002331e902dcf8f996828a00c9f35bb5bf40515950200c7009c03e0d7a65500208039cb84d5340d77365482636cca8d388e83f82c885ca2ae7b9c2c63550e940a2d50c9d4232a248520000d2cd8837b2c5280174d88aa6f7760a02a60258e5813821960b30353584955d9d800000000000000002049d533e182c3733a9638382cb6f0ffd82a210600bd4666d60000000000000000080964a6256551f5c5e0d2a0aae42659b792954444723f78144a033ec9f113dc05a2021220e20c206082000200860b9d7e00be680a0b5f57561b4affa5873c5813247f46b40c2f09e634a7bc102765fee16d50ad13e5ac5545a1f25afdea61dc473ffa18980492e0ca786ac3eadb94ec9d191c451b58d47c34ca22ec91e054cc403815d3921d4d5d1329abeabb6391446b695b7da6543854c0ef37877ce154df093ef2ff339c0000000000000000042868df62c307f8a67c6a505089107106105004002000000c4efd262d7c4911b2f70179fbf22158adb813648d1b701780eb80ca4902c43b2e2f15d7d3385af729f971e17c92ab7d701d06b2e29b054c063e30db5003fe0975fd9b28d4c1474b6be0118d338aea00087a45189428a4a1440900902c50c142840a141050a0028002ea488faaf85f368da4340ac32e2a08d1425e9886bcdc8af38790c888143930657168c61aacfc08204552a546a9dcdb96b7e9430031e36b5440e51b492aa014500ebe257fc1a4a169e08b40a3896448d246fa8a9dc5a905b3027b95e34ba5bb38f140405f09d5af82a0328a758e27e05f1e442ab0288620000e50e04be117f9a4ae2028c9adf574970c109df6dda93b0c004efb74ea6385033b9100013382003b3c954bcf2445000db57eae1140aa0a31548c7c818802c66c8391370f6b6642d02c00011c113f2909f0e84f4262780a13b0140d488ca71ca2c70812ace39f7e0c17d98515ca6114245f0e9601284003f46a40cb3070296355596d28a0189ea99a818514596427af8b672206472982e1eaaa5cf0ac0a1a6c80ba418f238b34a4884bee71457a66f0cb4d28526a9751c1a406de37dd7e38269fec6ed484840000007080e0077cd8b0ca00000000096ae94801380a38b367d4c7610d1c51a8fbe7c6618b241018d2ed8784100d167fc20ca382c8b0005578414006094e953cd0800299e1b121ee20012974c8764a000143c84e98767089002d02c000115911801f1638440bc817cc9c50f57bab57dca65920957fabd9b05104046486640dbf4705bc814790323c1808d3408ecafad45800c641aaf053b12000ee4ab376ba40003f66084be3f167474801902038b06b6654039a19c50746368c4e0a4b24137a317ceda0410102c34fc0a6a38288779f3ab4b6180005af30d2af48a001a5fb0bae32c4001137fa543f9e0000928f133fa92771d2006207000025220ae0a0004df227413e3028a5593a38b1e2062954c2308ee61632c81383933f48000003876444a8811002000043886706f0806000000000000000000000000000000018e908b411c978a48f7c1e746df6815aa2011a59641839638e2920024b9344e01aa9fec6a2b66405c44abe5e76b38dfdc8c30c021500023634363dc29f350923081f6c99298c208136f09f6980237ba80dcf0e0041a16626a8a07bb9165e541479ed4ec92fb0803b46521470a007000036044e4861fe0bb24bc6fc305b624652bba896a60916c2a841b31a2051a093c6da0050c00000154a010008cd08acc8420049282405d7401b7ff51722441369ca0a80800003be71d211682392f1491ef83ce8dbed02b544012442041c41c12800c0411a0e2cba6ac1e49ec6c2d661da2af7457744afc83ed6701ebccaed25d0f77333bcd020c5824844de1ba47a652b49ec3f7dbafebf2a678ec19a96f316511074000b5081416c188072385e966c6501c433f51f6546387155d355d5460c3046987ec0a081084d6eec10002109aa598828804d650cb1280de610fe090498e09c050000380400572c89c20c4dcd626c4bb2d85ab3262ebc594126efdee2183084a9fdf1377e96302eeaf920b04a185c4131caf8438c757aa6cae0f18416ecf7a8eca181ee6c42)) <<< 16000) + 0x4a3b647003d80cad017957e400b40b1a5a534d19659a408266fddf1a3a05dd222c983896f16f18981db030d7228e0820fc3edd9c00108ef99c4e004801000017122660b13205e14cb43208106d90401355ce68f1460c772cbaac7bc9630f94b2de0ec438a1c17af2409816153e0def7a0b45020e4f8dcdc1082001b59638a306afd080c2e02c00010010cd11d93536f20c1d4112438e048a08e653be1858ca0a1be21df31b458a42d9a29d47a2dc50a0000011e1a3000502fbafba1170bd0a3822107a9049a4ac48a0000006422c4017a1201c50e01500004a46887491d586065091356b4fd9c910180c009a990183017fb5931400402ef9f4e0809e83360fb5140000010684d18609c05000031268a9893cd5d8be0a2449c4bb3fa382453adbf84801d4715348338c76231857eb051b9314080ce8181151b321c38e1c9d93df5860c331d6584cf818017f24de569e25092005c068d2e009be2f4c185192b3df3092080e9deb16f060e9185c4b9acb1c4fbc901381832c42edb95e2c65e0fd396aa1000ace141bfe90004e0280001bc22660b13205e1568481b490164eec0bc584438e2cdbd213a16375b9037a3e50c6a9a1cb3b162b4e663f37a50b3b4246d8e0200c958dab64ad20309805000037444d4474463e5f19bb0619cbe43cf9c50bcfb74e15124590411ce4194227d1a6af5091264afafa9c4073257cdd7618101e9826e28e0000000906114b914250100000f310460180041b9925a30bf52cb809201a1f097ab2081054a537bb04c6118ca43f12634510b16c97cf7a070c39c01d4ce1860e313ca6a828830847e5c3b0fa05004298dfc4262889002c0286154b01b72cd964f75750bfa838e17f4225131634567aedc2e50d0fefd1d8c962bd42fe30fc50b4e9277c2a8400a93c3debb4800260140000da11330589902ec9465f0117e511bf2efb9586186b24f055142ad33bb739245b9df588f85090b86bddd0910b7129a2c020062a287565680c230080000cf908b11d14279cb77176091e391f4822f98a28e8329727622443a0ca6790a8408f63e63c809890cfd25ea735e9018ace2b869661c2159c565dfac8a0000007aa3295c0a15812000085489a00c1a00400108660854bcc5e6060a1d0cf0069b512462afc08930508184059925fe02858f1daa779bc916e2132f05041832b3b5c3cde040034681815300c02a4a7052e0332400a8081551a5ed876208ec8823b0544b24a20618a14914a109102001032000200d0000ed22660b13205d1130a5db96091ea9ffa38c123058fc1f56244da219748a40893d6f7a8c80e547e418c0e085938a97d0401393b5d042d0184601000019f22622381bb59809cb902d12217a77185000000d20387a0e48b16880af27c4eb88e1000001d10452614230080000a29130018978084b804000d5a44708425a4212c150958a84a8342521a12809093808498040044ae4494e6248731233989116c484a6240530281d88f8ec4787623a33c261109996c22581e72202041ea7b3c352af6ab18a9002684c1cf7cdcde5c27838115870d45d7dd937b450a058c7cc06353f0f357bc100b30b0e32bbd8c190620a08287e9c5d5139c39a4c4f4880a8a15ed88907d4c7a3d0027852f02edc0be80dc5076a124ca9eccd89415011c017165a31530a43bc56aa5a97b90d4932e36ac455049d08f11052410bc4ab5f194418c927e54d50aa96e88cc00f4f54be082006c376f9df055108ed92f71ea6d6cd8bf5ef078b911a19133f9277f5143f9ed07f7b51fa5b1b083d451c2cdd1a88caf0b2389d19db16f54dfc111290afdefc5abde05f4dec5a7c729a90867153a4653958548e93833c592c87c5c57dd155c864f6da0c79055ce3de22ce298e0b3092c75c1f6b98f4eb226458352d0476e6a20bbfa82dc81c87c8845c15300bc1381c171749abb52c8800486b188e6bba4345d1ff36bee2ecfce2a329496d11b82712fa7ba7fa8973c757caa884d0600aa999c406027fc7d0287ce681fa6c9a10fcf67e97317a1f6c7280cbee0b9bc8f7f2a9e281f460f627eb2c5fdcd07f1e7d98b9994f8380e185169a98f879b84e5f78a9d15bca64e0ea690ffe9a4218ec79bf39a2359f4532af4806edf12bb0143678904c34355e52a2132562179fa7c3214ccbf6146c9b329cb996ba555c8137fb53e8c54670ea1c5158f06b975fbe8aab0867e0080df53cf79acccc7bbb809b202b01995024e48d9fc166b41a2397173534d65916ed6dd0e127869e3959daede53ca2f6cd623223f543529a434b03704d84003aa83b92b2e364463dbd141355bead6f5c49754d8e828e9069b9e0ebeeccbf8e56dfa88862b0ab3000094c22363311a11e9806c99dc8e185104fa23067b71e8b1a04af98cfeb2040f00438bd906eb5640bef96b81c19e571317942605c7f61276fd13b40cbac2e56ce81007eb5018ed19437951c438e04ec1079078fafc701d857be2387bc2d1d25f804021f27a5e4dd6990616a3fafae5ce82dd65afa61e746da069027753d387300451d2331f194bfdd1a5ca099dfed4ffe12904a20662fe7ef46f0c6cbb816a4e1ae9b9c5e79d0d9f1f45f055205db646d2a9d265c5d69d4af0611e06980004da22320311801e9524f0331c368f4787dafe04449b33d9ec51b4c9e6a1323ae786e709324e3073bec77fa760e19d0d6fd27236b94aafa3d6585e204dfe1dff8046d755cf3a270735aa969e16ee4caa4a7818510aa7b8f00e57a387294e1a95c43d1a63fa2bf1f9ece5b2d0eb26ede01480f2136031991e061c86485d95515da3d030697584051e)) <<< 16000) + 0xfc646537a3aaab3a1eecb5a1d53e9aa8481be03a02478a8510fee11dade81b4ebe477139bacbfec3b97ec9f128cbbe6f1a95d9dde11ece56cb19e2f9955320fa3935bd62acd2f91e5c8c6c08925b5c14d89312a4abf17374b7882a3c8000006ef222e33e920ec265e058f5a318006f9ee405011a82b2acea8e9c47c93879ac5109e6b14420f19239610c10409c01a0222415793de49a9ec793e9c8c0e0af1b2e435d1ab3304490982e58ec6ef1352ca8a0c391e38d00028c2001f644458760d02b1150988a04c44c2402c0b11201c0426c7a436b63e8e205ab4284ca12f7ba96270103113e9b17b5576ded80343981b6d61b1b2e06cedf6b0f8ba70d66fd82d37c587debbd41560cd8e0400368cc1c16bed4a1d21ce331f67d5862c00e86a7b04889d978eae605582c013e5c73b752e6261fffb783db8904d68f3ccc6b52f70d0e776c367390107c908840b1fca741c5a36c59fed522f9570053662a59b2a56af05c4d897919a3f96bc8d5210a83517996e7fd2b21177949524699e82087218a34697d61444808edd918a4d0f7bb9f9c1613eb38ff01022d9daf48292880f804000040082f06e66eaacf6706d0b8ff9a600371a8a3915838a2253b1a3e20dd378a2253b1a3e20dd3844868df62c307f8a67c6a50507ad18c0037cf7202808d41566790f5733c87ac6193cca413950ab0790f28c08f04f0042e6510a8b9dd9e095ca0cd2694b26c37c6daef8f6279277fea10fa22f4080ef71c63f1afd246d48f0407d311e22ed8d7802d6da2d8e33bf0840c53eabe751143ce67697fa5bdc0e5adfac22b48df15cd2b389f80283650b233192938e47138d8be33080c274fe0193a8314192441a80030190fa1d8888cc3e4562202b10f01c45053f517214448cbe3cc382b0ddcbbc0c211f26d9b0240c2000808700c3b8073375567b383685c7fcd3001b8d451c8ac1c51129d8d1f106e9bc51129d8d1f106e9c2207330c4881c9c864d3a7cee1e7fc93a190f7048c829e8709b8058f5a318006f9ee405011a82accf21eae6790f58c3279948272a1560f29c116122008001f83d47d0a898c686b148694e3dec4519404d6a279364598d36149db1dcd942764e510362d976aa6de3a31c71c808e8d2eadf357eb9a59432364e442d52e58232c7f6a8830cd28ae1f2f4594304b7bbbd32aad0555939a000b704214673375567b383685c7fcd3001b8d451c8ac1c51129d8d1f106e9bc51129d8d1f106e9c220f5a318006f9ee405011a82a4816686682502800780600089f58a1d1ff3d2bba748ae406ff0accb2e5d107d8397c7d0e8fd6bcf8aff30dba2b9a0e393065d02a7a9a0b2acb8d2fc5c732caea0006f044346610e2380604016908063bb49448106c011004010040000111a2ad980235080b003c7231004496522446083e0108020080200000888000709e2061140331047bf6bc2e2850393df12202539307f120197a6c94012860f80400003f888608c3b807a3929c42ac8e3990e8d3112205e7866aa205367743d00044bd312f20128a10004042c34000238442857eb463000df3dc80a0235056559d51d388f9270f358a213cd628841e4b25312b2a8fae2f069505572132cdbc94aa222391fbc0a25019f64f889ee02d100cb25000f00c001418a67d5f994bb0232a5501e97fd5385398fdf70adf237dbd3e4740583b9bbb1081146834fa8e679452cf7144a758a52725852a688383f67de1ac83044862a1b880b4141e224d593dffd1c862fe5e0e0000dad5bfc0cf9f2eec761996eab0b5c11067030f344f550a10231ff191adb01383c3a29a0f2466ed77678420fb37680030d10f71500054090f309000aac11091188408f8e9f097aae58802f4f6dc2099dbe615a13082000468e052047fb0e3c09d5ba587002fae54fb84610440100000af220e1b10601e0c621248b830ce338e7d880059ee5520681e252636a04818400101050507a02800040482b08e8b3e7a0f412afbb79d1d587b331b67f87e8430746d5c0e249004dc62168ac2303791fa4806ad1d059b12ca300a3add108979fd9d2dce2836b7a1ecd1e9bf047f3316a308191b7ccd55afffbce208dcc372c3812124dd8b8227bbffc62b7554fef29def8fb6b4a3588884aead39000a2b7b46f6566c244f16e8ef46119dedb17692f055056c2ee1272175065fb8c7a7290749d03202debe4737d9292a82c05d908b9eec8015f5aa00f3a2dc17c6f48a64cff378c094bae3c574b0bf3c02fe3fa2cac5c45aa9e94be3c2a7fbab7d9c1f961e64978e119aa0a30e413742a78e3e1b815c650bf1e5bfc51b61d3511a00772811841103858f4693ff9fffea3e4a225302519feba7e10b4e12ffe4e0b96e323269ea067ff33a98126cab2b940f1f9e3a708c8c31cf15d85bf3bb388f1ef4f3c1435ecee952c32578279144f1a40183bcf18ed4b1600028a088202ed41e1896125fa943f6a0f0c4ac92fd4a200474d88aa6f7760a02a60258e5813821960b30353584955d9d80000000000000000200f5a318006f9ee405011a82a964a6256551f5c5e0d2a0aae42659b792954444723f78144a033ec9f113dc05a2021211c01a00e000885f9bd4c74161e661c6e30c2deea1f78dbf2566d94cb65f0f01315e29345c27180e7be348bcc953ca6d5770d4ad19c9b37a9945ea73ad235fa8f7a62117ebb8368a3193a59263edfff572efd7993c0a2f091c7466c9240cfd53202ccd37d5b1075c05dd6b663a4ba51b5cece538e74dd6122e7c45a2d331abe33d91e773598c21cff239e0e5b51830d7d1c344257d57e8003e39103190308)) <<< 16000) + 0xc83a0142040210101000ab7900386f22008b0ff11c03d28dd7bb8a8d9311fe23ed45c110048b2a3f01dd28b280b01733e199a7b2153275a0077db4d609e37deed30ac9371c0801e3ac397f9ec33ccbeff493107919860a7fb0d89d881300803ff275c0ae4e60dffca1f2f72defe33a01428ccb296c702280c5a8d0362eb560700cbff6587cc40dceef7e8419d02584455ff24966e716f5313c223f2352da793a7fdbafbf001242319fa43a3614eb559d4e1c500086a491a11e1ac9a8a9aa93722ef27caf3fca069a56f80591efb7c79167522de790404c4ed41d62cc411a50fd4067f5b56f0ccea8902265b9300001b1487f1ac3f4a61f84b0fb05e102234052030743d8038b4025aa353729610f6c1865420850fa80a868358153d511809ff665520204e3042010a1c0f5e8513aa8ffdb7ce0396200b228af5b7187f9d872c2c312ba9785a12cfa6a46edc6824d5d1c94c7aeed1e68518a0421c0c24343e120d284f918002d1c6c1da77c14251a971008e784d0141c3f246837780039970ba07edc4e054cf490e82d6b27cf2313f8a291545922b8e4a10e30a619000039c33375567b383685c7fcd3001b8d451c8ac1c51129d8d1f106e9bc51129d8d1f106e9c220497ea5100371efbcbf0f8b49383cba876ea304a000001a4135985e364f9dc3cff85d393d941199a1a010810410e082004055f31ff5da91e27686fcead11179a2d588d3fd14c76a6b2b637f15ab9076ac1780c1aa83133a1e6d2d5632503f504b908163b4ba756600dae96e44607fa58c320e75d8064af3430f16acd13a39b4836d77785513a944a343464e6529318bfb627a42b89ae22f5cc4a5cb9961812fd057fc37e79d1897c2c5736771f762640cc0093e85761e6bfa80992760bfab7e0db59c91882014b5fa0bd4ddea0cd67f82dbfc598e778f2a0f002adee60bbdd28675fe64e7f65c51870be15a2c0b0390eb448857b7fea478f1f31cd0c759e84bc750e46f4b30622824cb4703511d9462547400009de400270c87d10c3e467846e2a48ce818310f2a056c38114b955d4e3419a905ec7c2c112bf749621804dea93472040dd54f51e3185090041438e1e09ef2bcffe2d668e104e1adf8204e1ae001858857057c3fef82e16f1534328063ba98eea5e6a961a0cfa2b87d1a29d2b48c0a04ba5ce8b70953fdb6d26018d57eb6f5298ddc6101005901befe050eab460d0886fe929f49fa93ffa4aa1bdb386522051242a000068843e0661ee23e2898a50839c209c8f5878e2681dc6fe0e032197ef4812061000403d8061dc03f166c715340d14a49c9900e044c6b7050606eacdc7e4504ba8a92a409430800218485cb5d959e2f6fc07631a285e39c1b0a099f6a24c9c0134065370c02e9dae92813061000400004bc87a88800098887a0cef151dac2ecf29319cbe102b0d1bec5860ff14cf8d4a0a259298959547d717834a82ab909966de4a551111c8fde051280cfb27c44f7016880669880668660020000072fe56fe50132e4d44d873179b42137cd6ab9dcdfea16fdfcd97bc965a72c08785fa8b447b8646ad693dae6c982a86f44e99c6f4dfee62fd4fed6fd50cad7940f375c8fb05e8cb7636771c7b8cac5e2d264abc51ce7326800263900087421e612000d9d21e44b0611d87888c3c04762a58bb6da4304ccdb6b767005cef8607080d893b468a0002048604201080ca8e5d0c900c1f593850088407c02100ebf0a147240291d87c0011080f80400001fc8778ac3b80743513bb66200d2963dd008840700201da239107c621703c19769f264e007b3e3210230c1e00848b05b2ef6963e19aa608b0a679c9aa46083a0100ec05e8e091b0a70e2fd7b2eb0804ebaf37f9c026b67f8c12040f00400003348000ce10460d00013890eb15000197105619e06a5238243a2b838544c5203932e4c9c3a680962cae319cba472190ce86741a3548b7a8930708a604751226389c7bd3edc6b88ed53c2014006a4266ab3c74517065b83970ed0e629bea79612a781712600bb3f345d59b3389fb948c64bab7795b30321a0f77bdaf21feb8f8e135001001029af4b4c58497d8d3eff741895d9295561310c62afc9af2baac273621cee92877f85c37805eb7abec2adfaf4433b2889c70a7c229c05506a81d229ca3e3e2fa4a1f3547df50428d7e5fa8e4b9dc9f3def746b26682ceb73266a7c2ee6b55890d30d6c0716522282f114d62fe32e89c5990199ca617886fdf95f25d2fbca25d80f2555853536f7879eade7a3eeecbac21d7242afd72c0512029fb7fe8c044b5ec7800089321d40bc1941df6e58580296d708b1c0419ddad186066e13aa6804002428210080748480003f880073e90e809011028003ebc873a0c338a61cc3b0e519c845ec2f48aef5e1727d02608fbc50bf0732bae6258c2c6b1099fd519863558859c11b9e88150c41304b6a88d25448e9f7c82eb57c92dc5c0872e62740bee056203c3bd6bb57d6808389d742b4d66ef04bcc7be1f2ebc2f5b841b4b2bf914054f207815a83bd086dfcd0688d594d3e4eca15a99d3c965037499967854b351a8ea59703991177da6b615f30b05ff652667060d77bfe2dcaecdee266f5e8558afacde0eb60a240470ce45af98b35a4d56505e71f09eabab4cb5a119d6247767b66a6607a5a638e7b13f1e08e4fdec8ed50fd5bfbea76c49afb5dee04361577707d74cec2bfb39428fba969681866483fed0a83f9a921271197c8d56a8b539d23f6161f7c015ef6c41270b34aa747115884bbac3362b1fe3002c020565c95392653af601b7b1ae0daabb0c83e)) <<< 16000) + 0x70b23a485b3c31c31bd1b4dc90970b4ecbb2b65bb77fad2af77b1c2760224ba8f74d8794ea1c5566daef7ddd88a9e5ab87c6b7a9409e75bd5af4af51b2bc34d23b42e991d80e92e02fbd4ec0ddc33b61e278f8ef998ee9a286f1e6bcafa3fcc0d0dbaea1f9c66073774eb4dce084631ff94079d088063dee24d2fd11680a945397e30176082cfe37225166fb4e7be471f7648593794cba225da9a6b6e19425b72e71c885b8ac514c435d039390c9a74f9dc3cff826dc3dc20918da267037800b8e4511ada56df69950e15303bcde1df385537c24fbcbfcce70000000000000000010a1a37d8b0c1fe299f1a94144b25312b2a8fae2f069505572132cdbc94aa222391fbc0a25019f64f889ee02d101491890ca08b043eee73bc423b2a991dd4a6a06750bba3b803ee76cd91f8aea890e070176bfa6964f1ba67874a71656706a3a5e7acbf32a2fa0a0804c5b9c59612a7f20844af39f54e9a5385851b050d2d402ad69b37feebda7836fb7dcd8674e387fbcf76ab6578d32d056517aa000d584390660ac230e30d87100c1540605603818c92ec451602a59cc9ec800521fd6921006428bc1000401090c0840200001d66c5970f4e344048f6f09f4a043fca9ba0c09af71985141f0054e30012880f80403881605603834f1f07eb9ca276cbbadcd2a26764af2199bf5b854a17e400000000000000000000000007d00ab5350d2477f824d5a1618666eaacf6706d0b8ff9a600371a8a3915838a2253b1a3e20dd378a2253b1a3e20dd384406100d2c94c4acaa3eb8bc1a54155c84cb36f252a8888e47ef02894067d93e227b80b44041c2281181141200025a9e25f56784530072334fa08f7152caa6b2d74a6481216e740eb16a75a3cec6514e69e11d7fbe0f44d986d668a2bb12fa6633d0da657427227ffe18225260c831ede43d7d19a8aefe55e58fbc8abe31c4696f46d550e5b3fffafe7b829721eb82624ea7c5c90fec78b743137d2896e8d55728daaa33bce0d0007d420d232038190708a8148440722208b110004cb90902507012837c141bc020dd0106e008008424f14144952bd0b31f2003c4058f66d25d9bf31d1dbc2c03d0f403a82fac339291001d7cbc1fb0c10e5a268400120a19f65972da60b01805bc46853cc0fbe45341040473ff0e3bc84d9953082888810288061d44654490a400015c10121586d8480145c48142ec18807611a9d968516a238badb78f2ca8b6bf9522517a121252d3ca77ef6ff3c55c4218887429952b77310c1032b1b1d8290cabbbedf7ac84f98213ab58e30605590fef6e3422caefe0532fb8171c6650426e0a28284f5ba845e512d6387fe9a0ffb3d90cc53ae49219fb530a0ba6eeeae76eca40dff39c7e10e672224b7b35a113eb2c947bd8124da0cbe85ab846100156939e41b4186816edc15b4d9fb388c9283a0c2417022c40582bb9966cc1c1883dd44d9a03124cd868900551cd4e60004a3842010fa6f30711b3a2fc5f63709393905dc3fe4f2a852df58bc000000000000000001f830806ccf0413473205bd65d7445ab9b6e4c35736dc96f5975d10844838e8044045823825b3370cc6f2615921b8f5d9059e3debc927055e5c9fff6e3180c3b0e8fc005098f59b44dbc729722a08244e016b3cfa9bd6506a50fb725027828e741a94001038d0c1cd834e21865029a527180e13dc38ec8043a6d464a3826d981c40000251c2100806d00800049483812c364861b03b0d71dd014da2cbf13d0ac6510dfbbaac4668311555a20fb9738427ef05bcfbad28cfa0364f6e956b3eeed8a1af10e7e662522180a12eae8e67d5bb0a364cf40453fe8361f3a7b2b52876611966488ab971a041363ba6e2d93b79e254847ead67c9d44801e91840ef325a498cdea3d3f42956d04198ab129e7d5721cceccc05b648721bb17fc175dbaa295b1d553751c1213b20d8b4652727af491f91beab6ef304588e0806d2dd19e48091b6602ac7bafab8d3c6ab051d386f74a8cb4108875d55601ac3b0d51986a0ac34c57047487ea8814016e19a68804420400109269c3a83585800974a2030220c210084020040100c21200003720001a64348561a22b0d00de103b39d99471ceac5dca1605267bebe008c407c02019e1205e01067008334040001fc4330840440a0002f121720a00096f2196730ca218648ac3205618e2bd288f36235050e0277a8243018fc0764f8046204201002b01e0379a0168987b68d1ecd926ae7a7df28a4ec7277615fe6c1afed5ef0a984a25b0a6eeeea066e524547b44dca3b705cc6bc54c928c21a2cbe6eea740c878541002979a4d1d4380a150fb3c5602cc4df32c9a5a90c99e74d4b58bbb827bdcbd7a387af9e8c20442bde4ce73ba18e90d7f7c1210169797234718bf677d79552ebd33c4f6301257a1ff0966c600bc4f2dee47df14a6844aab960a7c439ecc95d5469262fafcc6ec87401e9332a3113e9a5b9f60d47dd07f5b6c24e4ff5d7d2a4b19a650a1ceab34d6906692e955b838066156d00c272ad7f0571215da6f72e7fa344611dec6084607600c349ab1085cba623a7244ff334eb9d0d6c4d3523d7cf86c217aab3d98dde746827a8bcb0d72c6c8e2162080c00045210c6150628a831044186220c2110608683003417e1a0be010440082d40417a020b40100054a90bc4985d92c2e847c164704f0e121028423950e129b0a6f91001cdba0898e008bbe03a8c03b346fa582200024c7040010fa6f30711b3a2fc5f63709393905dc3fe4f2a852df58bc000000000000000001fe2d56a28252fdae5e39f58147b155d)) <<< 16000) + 0x1268d6370ef55c6800000000000000007a0c2019f49ff558f8816ccf21eae6790f58c3279948272a1560f29651c10e1040822007f104bac7aa6a8e12be9b50dee0f57675aea75bbff33660b2e3f8a448cf8559c32e89d7c76761bc172946ae7044c816cb9fe190d45af35cd0cfef5594e54a3571acb0916fbf0b3ed5766a037a1bacfd0e230be32050d57941a1720a0005f42170430b71d85b0ce896db189ab1a0d4f9bf8d47041542a4a630229829ed51c0356453ca8220088929e1080402d4040c2020b4010000af90b3410591482c4a41602a0009612040120025403235684c635e0b18d900a4a98ff77249b8728f94ec9f8e31dc0e68d39cddc2dbc5d486c273f7c8e1fcf44de68a0518bbcd0a910911a889dd0e28a684bcb7984b1cc00a00de7b813eb3080fd748c2644949fa811bf27dc609025f62077679774ea75641aec62f22bd127fd5bd342367a09dfb26dff1a6e2160d6102c3369ade9d88a50a2024650481b0a4fbfebb058cc4ef628262d212d05664ac1539ab8ed2958e374eb078ef16af378b29fe7f9000570ef1b178a1b567dcdc8b90cd4d4bb211b452108000186c801849100e2333647ec4266b0c31d50e611f9c20ddb4d46811afc8f314c89fc000000000000000000220e3c995969445cba5cdf1abd4a9446eda3df49498872764b0000000000000000080420618230028008080a882a8106132ebae4f414a710f29bb6395761da5ff82ced491a0710c5d8749b1bb9f2480ecca4959891b0201ce223cd29c65d2a8c761d6fb4b22725db54d1fd6cb92628378969f1d1d14fa79d50000d2d0eaa413dee3e3e3d7508c3d7aa0c7691875ba10bf4d727719c10b7d78aa80615c49505a15e0200061d201d7f64049e74fcb72a621cc7a4613d3e770f3feb2aa04098241f2dca988e869b58653e770f3fd15bf382808d5e7fd496675073dc3b0a81531c214208118010008000000ebd64d6d03cff3bb0562da83ac6e64c6c42b08bced4673651c812fab96455881538a641864092370a4ab1604630b5931e6295542b82615a13834f1f07eb9ca276cbbadcd2a26764af2199bf5b854a17e400000000000000000000000007d00ab5350d2477f824d5a1618405310d741cc7a4613d3e770f3fef14d231a8240e6618910eed94c05d3e770f3fe6073f65a08df7d644b0d440baa47745155d02d460c708308204010021dc93c963018c5e5f75da6d5b7bc25aa5ed71d979417eceb239a2969b241e5cc25983652485ee99fa9f92ce09200f1ad457e410355f0e6b60a0bf4219eaaa307b38f838cac3246e9d03590f9d91b3d4dfb507f4ee32e91f46d413d0b5e95ca054030ac0185580e9886ba0e63d2309e9f3b879ff78a6918d4125491fd4f75247f53e41d4ed9dd0753b67684444063061841023802000069b424c80c9619a170d2ecbdfc03d370c39e54137e8000298020ed8ca89ae70fb674862627ea7a1266977d1e1627c5e329d33bef9b623e76eef7875f662d2c715247500038e2154020120100053e90a94182f04c2a0260c20a0a701d086199739d1c4724e0a5c8a1113fd1ccc2081080b1cc30344bf33da10108078cfb9006de08acb84009c708402199e08268e640b6e22b3eef65cb7ee90567b4c61e02956b0848a107105082088046044044245426fa1d3b4448f3770217fe14d60e28c57df75cd98d9ec1dfb8e3a0ab400084c85310c294861483b0a3198510cc1d4660e81b0a10d85006c27c360540b918000002a300b0e0076ff438020893a4c51ca0b05f04a2fcfc4404cfc804003cc00b42da950e09005006e86ae0000000006930a438c1400e24600000232818164905d413020aea9d941945829b7833f82101c17ef69bf060472cf8c960102f4677473e0017b9a8f272f38c1280a00006b082f08e0d3c7c1fae7289db2eeb734a899d92bc8666fd6e15285f900000000000000000000000001f402ad4d43491dfe093568586112461c42c324104130004002ed5c402401b6201e8d53f5238800f7adf090823005ed51cc6053f723100d0413605b69fb030201ef5ecf2040c942076940180bd28256ca203f0d63a26544081300c000078c82a0a8144240a012000456213c4b09d2584e10c1fc7610e3b09b0984304c0e02743bb402de5c8141483d6722060cb73d8e302b0a049e010117b1d0c6c7002197bd4a00004c4842010d1c535b72d6094389d4da92d814505ca96ea2c608224b86385840ca6b6df5f310109d4da27080c279bca3c4e21057fc0a4f8a8c005f7e8336b0000174921380c000080884d14c158861320308201c1a78f83f5ce513b65dd6e695133b25790ccdfadc2a50bf200000000000000000000000003e8055a9a86923bfc126ad0b0c2f0a0191831228e20e08408e0000001c28ba8a4e65bc3f5d1e605998eb28c9208353cb0b8ab18a13cf31a471824804d990ded240a975c0327575761f106f1a0bc96bf684a4aac71ca64d0003db364728b9bef246184e7d1428837956c888003b54f2a8014141f00471010477caac01641fddc9c149248c6951e6afd78c318503cc4910386a65956b475061057c49f6e58681b8dc528c680800823bbff1f0004448142a02c0000f21834f1f07eb9ca276cbbadcd2a26764af2199bf5b854a17e400000000000000000000000007d00ab5350d2477f824d5a161844d1ca1c81451040c2082048000030300200d00022021303b08201c1a78f83f5ce513b65dd6e695133b25790ccdfadc2a50bf200000000000000000000000003e8055a9a86923bfc126ad0b0c2f0a0191831230e20820208e0)) <<< 16000) + 0x060000017240100680011810542104b8e8178440a222050110003f71096050007e3107e01000c5890954984a06e8438a2d538c71077d52ea6282315f961e8807bba884500c158c72d19c2047042c6d1200392e760b41409c7088021b1bb4e03388ffc957a3679a29ede29419f94f32fe74294000000000000000001fc31f63fd8a8335a1569884737ca2e969ad714d96ea23ae74000000000000000000000000000000000000000000000000bfa256131bd491fd4f90753b677347d3df8a1119420e214110086084086e22ce7b2c67e079e74852727a0c6e5f84bce049a2cf8334f4d681366571a4349078a8dc9090ed1541e54fca611820b567e9026e724defe6b7d42f5c019aaa5d1b57b597baef851ee494e5e61f3b6bd4330c764dbb176704ce95cfad2212b414c2c3b16b8d0006952126430921184888c1d4460e81b0900d84786c2383611a0bc180000053d2448c0c5ee261a52c3f7817872f208113914a73bd470418bdbf28ea082255fdf3d3a3007a991fc0ba920109af1953a1026502052048dda3779db47cdcf8c93d9084bb040880000000000000012d53249fd08a4fe07c230860420410408230018084bebb7675b881000540006888460ac048561162b08a1584482f47000000b81450e00000189c0c1255e029cec1a18550fe49b014305cf53e44a68276e7ceea24a045dc24095e0a00449e12540006290b0a9028154101380c34700000231183e75ae46c8a1c0000096060854354d143430ece0e9e1a0a5a4d7f64a0400004e2406ec066081409c808402000031a707407a8dea30a1c00000708034396b40565ec50ca8eb0c2c60c3bdcfcf2f88704184021fd41013ac51e7440200c11a61fb00005e86ee508b08182601868e0ffad62a63073d70ebc2d1438000007080d0d1f740de0228607e4ff39e0c3b023eec85100800c392e284043f27bf340029882640810c818250100000ee10880d0230480010208003df907f198438cc2182607013e200d230afcb225669447c5109dce7e306082a2daf80800ca2a2de400945080021c40e6693ceb8d0590eb00cfed44d8c31597ced4e0f84864f66c2333e58a1cdcd02f72940304434194e6f361a0562eabf06be820073348fe1cf8001a9c2050b80f000041060d3c7c1fae7289db2eeb734a899d92bc8666fd6e15285f900000000000000000000000001f402ad4d43491dfe0935685861bf9e7801e847c80c7df1931f9a3d84bb9e1355e8e8c9fd3cfc000000000000000000000000000000000000000000000000001908d1cc1ca1ca14514408a00002e300200d0003ae20243b08201e0cbd57c5965b648c8e2ee14601e2081c4ea503cde1831c5dba18bbc08266837069b423803f1d408baca080048d429a860000208e96e87f800007364121601800007f484290f63769c06711ff92af46cf3453dbc52833f29e65fce8528000000000000000003fd12b098dea48fea7c83a9db3b9a3e9efc50888e20d20b20510e0c604304801030200200dd2160843ead2cb20912251f82c511b782f8664460894f124db78c046834d32ff0b04b105beac2ca043e053c0ff8d038dbf813e484008d05fba43c430d2205004800020421082b02809e15a839601d827a403617341705f763a33cf873ebfa6e4e2f8000000000000000000000000000000000000000000000000018ec18802b0b29fc91cd8eed7c7a9eb678de9afa1ab068e1558000000000000000000000000000000000000000000000000602347307103081300200dd80cc200b0a0d00341fc341060a0003db210403c1a5c15c97c552c65f88747b588918000008e62030510f3d8507c83084fedcb71b81c03257262c59c0004c7c5fc425440020514ab4584f31c90a80a00003be4048940015124204841002a07f05000a16907e01001044907d3d03e1281ec940f4220029d62008ecc40100501e8b1e1d25d3471d2b03139098b0e14f3ad4f42ab55333c18aad41320c12cdd76a6347921b2d8f09082e97d05a2bda2f69e058aea13bef271f8c0e2ae2861fb82f38d44be3929c588ed00a0d97df10a9c92edf330d930202e5972f63d915729ed9a65e2d216beca34edc693d22664ac399397c0003587050f54f2b50005fb58816c197e479acefc4bb1c22fc3ee0a60d417a949cf2b863443b7647d8cb04ced3fd2f2dd62bb2986906370bd1223999b342c710c57b71dc386a38f2ac61c284e0938112019562b5c800945084021c5140d3456244c74c0d5e1c4887aa8531c37394b9f91c2d261e99110251420008000083100022d20f23b0781d83b8cc1d8460ea230740583982c1c8160e20b07005c0c2f408d999429f1cc7fc440a006c97660c189f00b7fe4050062f375940130d8c4fc0004c3844010a15b526fe98817d167b17c70d48f6f6f430b3b6321dc1009070800200001be41bc860ac3306e0182a80c08007c4550893fd8e18603c481440895b481484828c9d559b1c188c9110b1000d59ef0206008c2884b6100ad043e940040042834210080000d119131939d0523880688c6911c368c521858a1219522aac4083e58f99a282b77508960260c2100803700c1b4060400391218f2888a386d1ce5ffc142072c8c8e8813a9b007345056c2361c4300350757350805abcdec40084e304201000016820d832015190358a81a8540d22201611034088000e2883394819804001064666eaacf6706d0b8ff9a600371a8a3915838a2253b1a3e20dd378a2253b1a3e20dd3844a923fa9eea48fea7c83a9db3ba0ea76ced088840c50440480020010001041495fae2)) <<< 16000) + 0x53843a7ac8aee80359efeb48a460bfce2bd73884f2f7f727d49cc6805bd72112b33a8301d3477d66d0428ff5863d47262e06fb722e8d599e04afab147d9699a47e6d93cc20cdf0c9608b5edb409a4a44d9746fff2648f034a800277902845832888190360c61206201d8e3010b2741c2077d2e7b0e0ad3a1c9784047096596e58157d90e8f1003240d99580037032a47800109c9084021a48979bfa608100a064d5648647b33c0a1835c1ae65b840c2d68a99080047d93d98004c2842010e284deda868a13301924b89000a9f0ee408c3080021c506a1b3fc284d405996412081f00403084800023c82b8880005a88300cf0806da0da5202d5eae19324012430a1d080d5e2a83e0240c2000802f828178040ba0205c01000095902005000217105b2982d10c13c66072330380d82c86c1383609a1b80d00515b920273903ca8802252d98600008c8078021227a2bf7c12041cecef800443038010d165a900ff2850a5e92b8f002a5e6a7008c407802100c010047015217d7e580534515e04418380100000772000168416044000316415c640004704104960ac3b0460182a80c0ac07cfa071c9369b029b68ab13aee51bc43ca98cade798eab8ce42974fcd476b7a7840014c435d0731e9184f4f9dc3cffbc5348c6a090000001a40e4e43269d3e770f3fe0b721360824868df62c307f8a67c6a505357a44f97a3a6d8a64d0d6edf3090d6edf3042451c10812c018000400263d91c0dbbaa983963d8eca028aa1e4f3dfa9b8ccd19db0057c1bf758d2ccffe3294a22ca373525a5f374e784181548c1ae050bd65b5fda9713874bb64d8a962404f72c213dc952a500fd16cf43226280194367ddbc410f59158668c3a1cbfac54001a0cc0400401144159a062480409909c802ba43670a02ae85770090406c0200001886040bcdba500039218d640024283c00800007e2082330460581580f097a39465528f8957ea9bd7c0f967a82a57b20d014e711d8b09afd149fb0ce283807458243e671fc73f12c0c7b8304851c6f34bbf42bed57634eb2a694944bdec180863d653ce83a59c5e1e3845e97bfc39db2a16516cdbbe42e6d950a66397a21000194d53df91c39adbb142e8551084dd254c8f86abb992d5775f34adda6b881ae0b9534f88cb441b7065b12d07cf75583ce12f1d280e345d321a411fc649f26d800051220a8420531d029088144440a02200076f207c0a02a010008de903d4581e04e66eaacf6706d0b8ff9a600371a8a3915838a2253b1a3e20dd378a2253b1a3e20dd38445e2a3b585d9e5263397c2054880c608308804404204b001003f43a2f9c458604c39cc883fa6595068a21d26c4e6efd96620f48f4098cd765483ee6af277f07690616efdc86e27d239264959666eaacf6706d0b8ff9a600371a8a3915838a2253b1a3e20dd378a2253b1a3e20dd3844260ba6fb3f102f57a44f97a3a6d8a64d0d6edf3090d6edf3042432c2182142201101081040375288e5fa4adbe78937d4f26d016f3e497a7a2218a06e2451a184fbfc83d3368e2838184178164ef795492a06d52b807fcbbf75c999d4e2901c87c8c41f86fd0200500022b904f1581c8ac0e04609c1b04d0dc0fbca42b2081060dd99f0c0005ce2f80004c707c01008c0b02b01ccdd559ece0da171ff34c006e3514722b071444a76347c41ba6f1444a76347c41ba70890d1bec5860ff14cf8d4a0a11818c18818810408e00c00000510bcfc6f1c2c7dfb318192e7a5c1c8518ce0f3bd8b992a2932f5195ab485eac9a9841933d7b135172fc3ec09d56b0b926495b4000dd481010e4470dcc783881bdcf2ff60c068f3a47e40004638420100460581580e66eaacf6706d0b8ff9a600371a8a3915838a2253b1a3e20dd378a2253b1a3e20dd3844260ba6fb3f102f57a44f97a3a6d8a64d0d6edf3090d6edf3042432441031023011c0180140244a369f8bd1aa3975811366b0071bcd78e1d40c476d9547bcda81db314d1f3e8d2aabdd0ace3b5963f8d3fdee402d1371686a3446809e7a6f3d04427624fe382800223904c250002ab901e150258280a80400145c4128d409262048210239080f03400260a411825ccc31220e63d2309e9f3b879ff98b36e12c12099e8ce9e3108c6415422118c82a619a6cd1a604c82b39b7c37e05b33c104d1cc816ccf21eae6790f58c3279948272a1560f28c10e09201001b97dfb105959ff25f31c11c03e62c4712dd8676b01d7fe01bfcb5c78c7ca38bd99885746bf8d2e8636d621f92557f6d1e7da837ffe37152b269f40725b080840d093b2e08270790e490638e7b480807421478c41011cec07bd09030800200001ac411446088230431181d86c0e8360721b0380982104c0dc2606c1302a05c0c08eadb521004243d121400384003a38000448ca0880210140100448ac8e4eab98250ea74de70007e35b61802531f4c4480c3cce8700128a0f00400003f4c087cfd1eb81bf4b556e11b71c2154254192bd32d5fccee7ae457b5032656830782dc4314fa4a2373db573cf076c6e8b81ea866bcad712428081c07c55e2a653d8a8710852d2041975e6f90719d25146d337ee5be563096a6078db472d5f38c1e86c708259026f96fae14aa84654a38004c07f8fcd4edfc4915f7bfd723a7f65436e0907c24a2eb79878accd3045caa68fab88157432f064d9d4a2a8815570e7fde7da6165c02b3d63e86811fb2a9e129bc8ef74c977353a7ad1e3f2f2580855adce9fed1aec7d2d7a1102f87aab8c1ef7d920ccd417a4536f10cd8b260001ba48208ec0ac07c3842452d1a)) <<< 16000) + 0xfa45d2f35214fbc004ae84c2b5e8f6320c2ff92f457171df871905047c6b5c9a23c22f5b62010d584502aef78cef6ba9d08e37ba75c599ba1c0a567ec15c73b376d1be003b142e683852c009f36d502426620ef97400a05e03ad2de942ee935d4f3f6b5295de9321f769d446569abb0495bb208f31c2000661f16a0374b80e8547b4fab766125415e52454c1cee369407202dd07b4c216cfd32b569e0ce6d06daa0f7838c60f27732862841f594a1606e44b80a7870cb3a7ea043945eb5c56b47493d8db8d369bf9aeeb54cdb4d47e1aeb129652a13686eb19d266f4c4c0b788cd7f35361fabaf8517ba2201bda844bc8e480007bd200208041008407e2a03e0500e8080045b481e9cc0f0376114c220fec6384a2d63b5598693409189bc814304bdf05575ac704f916e7a637bddbff846be6a3ff897c6df704733339f35c7604813d9e195a59355408c98cb55bdd588a8e779063e47a2f4fd3f200517a487d98b10ac6ed3dd7092e891344817a625b6b98f50c7880270bdc6328def1aaa6f3de0aafad73b95b4e42bef3e59ef624d336234f4f718a4272bb92676d6052ba51e0dbecc3a5e581106196dd86d3c8aca611b49a5192daae9ad92baee2b509314a5142808e641a27b0c5c7f90c51452d5e646aa6a014418858493c03fd68da27cc74dd241183eba2730a577d6674900f63df4bf817533189e9840c952af4997585f2eb900f9e0be5d3c200d908c80f5f28fcbeebd455c7d01ad54c1aaf185244d0b4000181103b1581d0ac0e456070230370d81b06c0a8178610ce6efe84119dff902228303a09ed90c057b1268e61411e614e704106e9595d5600109880880214c931bb0ce659424d44f5f7fc3c301908218e4511ada56df69950e15303bcde1df385537c24fbcbfcce7000000000000000001093f6bd57058c0b868df62c307f8a67c6a505105f11c2395826cf173ad7e490675afc91c2253823811c1080025e0a423444e8ebc357227fdc71ad29d783df3d440a3c570114f058e6fa96fe8b967fe57e093f00d084d50a5cb0e0bc6e9b243d21a7fe8e4428c858d67b9903dadfa540fe07ef0f734b0b43363b19cd4a08a6a616c80700274d0c3ee615860381cbcd18ba1c10004b54f2400708212d5094408002000020a40d44406822a6498dd86732ca126a27afbfe1e180c8410c72288d6d2b6fb4ca870a981de6f0ef9c2a9be127de5fe673800000000000000000849fb5eab82c605a0be238472b04d9e2e75afc920ceb5f9238448410706386186100004bb38bb7cec548f3ac06740948fd64257f4e3463faddceb842a2c2a9adf28981e4935bff5e7a9f0cc1445365ea040dfb836572cf58b5c583f78bdef0c53a11b7193bdf6cba8c902056c801bfa35d4e0d01dabd541c300012e7b030f407eec5c24001c1a471500945088020046120001262000c6e40034dc8198ac0c8560621303009c0500401005e038000080228347454280d017f8d80114099819f923001e00800004f902e050118280b4140500a02c050000a290121d81100e0101ec9a0abcdf33f62df9bd7c335bda01794aea6d5680bd52d89d1f6aedb01822eddc58f0c5e237ff5bc2d27826f3280568e4857ed35d6b25e4992b833e8801113adbf40056243bad55fe91c30ec905c634280f1f178d9a4f4e2dd24738200458e1f42d23ed41aa5ee65cc70c128a07f2fbeb5214d1945ee2ca3e20e3eb94e1d1abb32f5b46b103d47013a0237532f27723fd961141259c649de6880004e2205643d0c7148b878c0884e26210c1e1351c9678037a2e94c090307c021c21017ce4d1c23fa8a9102051c77170890085bf0b3048103e010f179fe0f51200a1f9a7062001e00850fc49a013c2003e01000004b20540b0000f020003b840a4460500b02701c05004011a5004bd21c50436b91e61609c13f36680149d910c8e0000961e64a083c0100260501282a821be14a2cb04e0c0e412c09e98157410001e1b0a4240c1e00800006790240100010f102311000138102201e82fb8100b0804003ff7a90040a3808f1c023dccef2180a7922d7c0023c4427e22004c403e010021050000a4101225000390902005000712101f2900f0e807404003ad04009b5c80e20806ca40345201915001fa31006af720102a06869b3af0f9a76e8c6088f28a85acfc5f061034b2bbcd8a7e718106965841f6d7ce2834a97be8f4af3ec405120c1fe0234718602c2306a38148980801478d8a5f6b928882a809e848083837054716b621bb611018000006901c3fc7ca8ecc306000002580800253957b08c00b40012b210031567831c8a4e2846010e3e33f62f79038a081bede850e1989956023c3060000007f80c081705edf7028200000034808081c39791628a4e284c01000018820301b0170d80b06c05436028130130980902e37052b09fe05453fa57446cb6d6f18382bed63ef3d6e25a00000000000000001009eac88126d1772d2acdb77f32b5eee6ce9e5eb51ead997d8000000000000000040786ddb69bb6b7074f603efc3facdd9a79f3a9aa3025ab1a80000000000000000000000000000000000000000000000017cc61861070860850910096edcb457d51eef69b24a70b7950cbd49d967b4d21251145854fdc455f70fceeb8e405ea00df71cdcdf3c04fbdbeec862831ca1c294c896c1e015b87f9ce8cef036b27861759c48f77bd33e896dc9605fdea96a8a69404444020020006be2001504403cd401c6a00d3100612802c940144a0091100408801c1400c02005010006f59004210018c80084400202000010073101)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 34 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase5" = "QuadFullEightCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 34 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase5 private def zz2284:"s08ec"="s08ec":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase6 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l17 l20 l22 l27 l29 l33 l35 l37 l4 l51 l59 l6 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2bcdf4244, -0x59682eb50,0x3bf179b3c,0x4b0], ![-0x59682eb50, -0x2a9defbb28,0xfa6dedd54, -0x5b2521508], ![0x3bf179b3c,0xfa6dedd54, -0x2f39d08e10,0xa5266835c], ![0x4b0, -0x5b2521508,0xa5266835c, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x135d25e0,l6),(0xb41df64,l4),(0x1e8495529,l8),(0x5e0cd2a8,l10),(0x62f3a4c,l14),(0x200bd04,l12),(-0x2dd46ba0,l17),(-0x2782b6,l20),(0x19c77c894,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0xc0df7e,l59),(-0x1eedb14,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x1e8495529,l8),(0x19c77c894,l22),(0x5e0cd2a8,l10),(-0x2dd46ba0,l17),(-0x135d25e0,l6),(0x62f3a4c,l14),(0xb41df64,l4),(-0x1eedb14,l64),(0xc0df7e,l59),(0x200bd04,l12),(-0x2782b6,l20)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x1043300a0c04000011024038c03000138110058c0400000110f014c0200000000f01480200250982402d003000000078024803000018884090c03000114250130c04000010844058c030000941d0318c040000000f402c80300000001e01c8020000000b00248030000000d8024803000019024030c030001a8110050c04001a01040098c0500000190901cc020000000050188020000000160148020000160380acc030001dc6b01a0c0400001e8d4050c038408608c0749005000008828030c0300000002901880200000015402880300002b8c402cc03000000f07028c0200000017c04c80300018c1900acc0400000001d0188020000000f402880300310c84403500300000000e014802840c208402410050000000210188020000001140288030460c42100e5004000018848038c030000000190188020000000d402880304d08c1200c900405c0a01c0175004000000098024803000001109018c02000000070024803000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x1037139ad95b8e25b686ad558c20e049bfa10e188872cbd28c11477612d58800168634d5020014af2f9f813861200420681f98701902450000001dbe185163556012c18415ccf376941c3144c86a55e1c230a0c78392182001b1f6db82410e472899071c04af3c11518065218500280001fe20602300a01f16fc87c020401020f9a0bf5511144110ae626288406444ed546b7c60d714b8c50800a19dfbfb2fa8c141002af1c30e01005724add3de0000cc754420e02087248c158100000884e1ab8603c46438611f24f7971030758683058e1139ae8e1bc4082421739b01020ae37ee8a004261c250080000aa1a9ece1c77bdf1ed8c076919c50bcef89af0c482971a80000000000000001dda42ef1dba18892aa78593ed1000000000424286304302182300280200200372001006800106902f218170ac0b4340581202b0501500a0604201d9d3f808141301fbab43c1c2979f15cc9fc860894df37dc0e41420c063416d0b8800431ac9fb93a1c03320c826a2c4500187c7a61407045080af8ae62ab7cc0c170162036ff40381410e1c8e9e3d2e309082b1778571e2040619642e5318124e626306206087037d9a6f490000d1a82b36300f2c8108cf8047640a1480e2079da4fe93f0aa50ccf076e4dc7288184f0f983de3b0c36ad9d3f40ada24518542344e7aa2886148ac357ec07091a1ffbf4b558a10ff674ebc33b1800386989d52a53882400bc0f103ceb2d4380614332cb4af37e9030abf443efd8c36c706803db1228bb2797cf10a2831074e4f00a217eda2a1f88e12334ef958a0a110bd19e9cace4801401000007ecf1a7592a046282456591d426138714560d28fb92145d8efd5915408105d96cd030e104065abf1bb3840cbf35809295181466adf89960404861d62affd9c2400a80a005202000223364410b37f292c6d69f23d8650c9edf1d65091829a71cdb8618ad9d3b5e28228613c3c22024366fab2460011246759050104601000019d385aaa06b15388408e85a053a4b46104bd3cfc315882727d42f34ae1c31b1fb6399041846572a0b10147040b30bfee000a026cc85342dc0c0233e7b78203532400ac0b16470cc5e7092c693483014c50cb639e630881001bd57eb1411d22563821c117dea4e6a60000744ff006000010428850004601000019920500a027050001fb1919f26581458a283ebc3294244b42a884d8408d6e32bbbc710535c0d6a0c10a706430104119b68f1e43000a11be77c02810230080000d09000e1a200201a40985721c5957c596e5101b653c95e88d901324934bae8e8e09f00f2483190c0954d80171e002081704f7e0761000744d2bc4918e00000003f48001b080c2c02450b675c4b47c914ba849a53942698abed36244be36fa6b24874a49e63cc709a3b532e70409ee063270040005287b82140411804285e46e976dbca5087218fcb2b7891295d7d93843121ba019d892d918300c58e401d83847d1923c3c10204cfc1a7510e0e0000e8b94050080047b1685e1216c9082b02400010d90003d3323541c6ee25e4888dca55708921bd42276ce0406b6744bb101011c5c37b8404029d36179e00600000004b000803a6bb8350110084c02096f392c350405949b732cd2add77441f7782a450e48a50848848630450208180001006d0f398dd9d474648a411fcaf7d7a50948b1c9b41ac48800987cebda04861014d5f96a830600714a41d2c3041802ac9ac5a5023300e7e3d0c3820010f15ad613e9002c0240001101000354204a12024090002a7181e3805d30973696de085a3eba685d272ecbd50939f2facc3e000000000000000002188a20619010e10e08c08a0080021814010068000d29023010110080034bc8108ac0804603e2301e0d80e86e003e7cc3be10224574e4346f43d5756907840b09c9073373906e2a22276be5dfed6b58c7cfa7e6a281077f34c24fb7bb8ec7037043aa19c1c8da9fe39fd3aef35032835bb3cff349075a825a75772d02009bebec7288bfe8c77e484f89185548d3ccec684c2333782fe589045f7fb4f227901121ac248f00004cdabe603c660aa37660db7e) <<< 16000) + 0x8a13ee2adc247956dea052a68dbb5a5b6c2fb7aefce1f9226fb4902764901b65ba2980f6cfc12c6d14b4c8f8473fa6b472e7e42736cf65d4412ab19ccd719699a26007005c5022e9e5344880f4b1fc5490e362fdfab02082aaaa4d60c0140d2f9fc04a1846010910a342dacc243f08ff5d18c08614d2fed0c208312f4d89023f0dd0500650c22008000086980c2c472b2d9014982447fe0810eb7fe7a22804a609dbe8001a206e17400ca204601000011420361b0160980a84c050274469e14367a408089612ae90176cae17b8403301f1c7400920a110040068060320380b694ed985821081f964f19f7a1bea3650900809f3046b526c6ddfde366c320c2693591403d4dc68786cdc2cefc6880a679e174daa000a5aa80c50843416592ebf36b2eda3c9f000016fbce2110bb1d994327f70055b05a85381bd944c2d8e5eba32db641f20e418c40000d3880c02800122c80b8ae01802008e30802eeaa240603a49c2ca01007601c467815bc6b49d9202110042008020080000223008010040000111000154301001004000011180a008020000088c0600401000004440583602a1301409e082a5b741c82081e1a9caa24006576c564180172938d640026603f3c3000284a504601000011f2000782400314ce1bbeee2ec806042827e184030446d9342147000051d5da0603083701970200000000640501406c6048008013010000b61001442200690278925f9fcfeba081008537984808722fcb5db33351797aa8c0e13026074c8014e5dc2014ca14239f5d4fe7781cf1eb758de2820eddea76486dcde09c4344400ea36f185a472cba2a3f9984015abfbdc5fc666db5fe573042de88d89315803bf110e845aa40d43b29a18e28ae1b0c30875d610aa8757d10295f26b3c14905ee90210091ccb8be26c6141e504b5124fcf36d0c188142604adac5be8a09b1dfdfa731e8f188089a148adc8480c60a05118663971b30d88600fed47193699df2064843324841e0382c646ee66eb32c4a79c4aaeb2430000008661420000010cc082003a45de2241000000a832c01933a2c9c270424008610221a8536060f03c54cb6a60aa2593b5ee386000d363a63820002437b02020042d950c0800011393753801200430812ccd4d643078166064393054fb295fff1c300216195e340001a4660220000002824a0c0000c750819c00900200002e24000bf480024598200be8833aa050fb75b70b8af20700000052d01431a0ed2b97c080800004aeeb0582000001f0e02813e168f9fc19402042a6aed400000000174091aa400a407002403b1d0eb6847ee58d323af530d2c479ad318a212180398e8bc0c08000004b005847d1a9788018100000025806080051babd0100003037949a4009403163aa9b9de5b13060000015f9058d800617447cc140245a45e11624b6f532224243004cbd85705849c5708eda02000000023287a0009c0500003784000ec88088080017e8c865508a617924071944e26676306000000fd20304255c46c1dc40316790ec6b220030367bd5b60802d8414cbc200515dca9908172fc96815b3881400c00007a48007c290101180786f07b4594a31f060810422aefc8e0c7f39f789c181cfada1ccee202000001fa405003427200330404838adb89c00515dca9902025a55d482876720270180000f3900e2500680b8633613cf55e56a830713f7ec82c95d302840afc07c345d0141845a6abba087766e202c63e3b2b5837622816491aecc2508ac200eece386a266ac618002b0767abcc4c200a8a2669229805fa111ca28a0a0e017122a27f8975c51087edb25e2810a3518a608013adea5f80920a1080420753c6b5823877a6d38b48051ab99ee8604b9e44cd090207c021c3b8265b9f183bd34244f1c038b9bbd1040040eeae549020800200001a870cc9ba506a2055a1266de8a2fb509d908609af971c86580051dddc0180351544f60a02c5e048fd19c30840200002c26864cb0be978a0959838f3c404acbf7ef83802f6b1a3014017b49ca28204f6567d9d166102100800009b900048e20183200b1180506e04075cfd86003882913102ffc40c17230632f86182f91da7d814208ad2d8f7a2802b2c36de443003f5f27c4f0004d955790a05054a4101380a0024040003c24001f0c80053f9d25526f35e0b7e0513f5387ce110f0d05b56c7a05e9879368000000000000000000000000000000000000000000000000006311861841831c21821420c07b366c92b880b0076078e0174c25cda5b782168fae9a1749cbb2f5424e7cbeb30f80000000000000000086248e50a48a40a308208386380e0100401b658f022402a1c51077762f7586943658dc08d2d648c4f10511e068c2014d89d33ee584031ce4d4ac100007fe8df32a30025825088d5644001501028aa1c45861d458c000a3ac7c0a1894efd0905123000000096008200412ecc740820006d27d00a00168ef7d1bce004e01000018620006f060897856e0d541103034ccdbf8b84910000ffbd81c04083e9a281608f1c40000000ea601200003ff553e0080019f9088737cb91c20b4070000372608cbcea99a5840e305904399c7146738b313d901c5693702151c3bd2eb40ddc306000001e780409723126a570a04547f7f8e5405065021c46a0309c0500003d240024208040a801c4600c1ba2d8d86e125a1830017044170286716eee8140506866003e660808000002a30140b6e368e02ea0037a863ec803231caadc000000384219620270100000ec90051d00200800c04001b864008d4002020000100170b9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 18 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase6" = "QuadFullEightCase6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 18 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase6 private def zz2285:"s08ed"="s08ed":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l13 l14 l15 l16 l22 l23 l25 l27 l29 l31 l33 l35 l37 l4 l51 l57 l59 l6 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2a332dc3e, -0x58a3a8958,0x7551237ae,0x3673af58], ![-0x58a3a8958, -0x17bb713090,0xb709b65b0, -0x596316726], ![0x7551237ae,0xb709b65b0, -0x2ee9fa1144,0xa461e2164], ![0x3673af58, -0x596316726,0xa461e2164, -0x2c51d4704]] noncomputable def hinges:Hinges:=[(-0x135d25e0,l6),(0xb41df64,l4),(0x1e8495529,l8),(0x5e0cd2a8,l10),(0x19a681c8,l14),(0x8907433b6,l13),(-0x26afc8c4,l12),(-0x639f7332,l16),(-0xba7a412,l15),(-0xd5c7c16,l23),(0x1813e4f92,l22),(-0x2c51d4704,l27),(0x2c51d4704,l29),(-0x30c970bbc,l25),(0x2449df82,l31),(0x2c51d4704,l33),(-0x2c51d4704,l35),(0x2c51d4704,l37),(0x2c51d4704,l51),(-0x20818355,l57),(-0x4879100,l59),(-0xc97eb9a,l63),(0x19490538,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c51d4704,l27),(0x2c51d4704,l29),(0x2c51d4704,l33),(-0x2c51d4704,l35),(0x2c51d4704,l37),(0x2c51d4704,l51),(0x8907433b6,l13),(-0x30c970bbc,l25),(0x1e8495529,l8),(0x1813e4f92,l22),(0x5e0cd2a8,l10),(0x2449df82,l31),(-0x639f7332,l16),(-0x20818355,l57),(0x19a681c8,l14),(0x19490538,l64),(-0xd5c7c16,l23),(-0xc97eb9a,l63),(-0x135d25e0,l6),(-0x26afc8c4,l12),(-0x4879100,l59),(-0xba7a412,l15),(0xb41df64,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x12888681280100000000098052008000000004e0310040000000025038802000000009a026401800000000b4072008000b23315811a006000000017404c80300000000b8016401802c4580cc0dd40102023ac1c00a8200a0000221109035002000000068381c601051c9387c015640140000000148069006000000015404c8030000000012018401800000000902c200c00004185602698080000000021018802000000008a01440182884506200f14014000621908806a006000000000e0148020000000000606400829040841009040140000004a0c0498040000000260c0cc01000000642206c6018000000bc2c0a30080000308aa014180800000001bc04c803000000001480c401000000000a805200800000000560310040000000029038802000000050280c60104302882800ab40140000408ea014180800000001e1c0cc01000000001880e4010000000065013200c0000000320059006000000000240c8010000000090a0660080000661240123010000002b0f0049806000000000f024802000000001280c401000000004d00a200c00ac2086201ca0080000020884030c03000004a0881046020000000007406200800000001e80510060000018844030c03a20508220031a8030013423048032401014c144130096a00a005c0a01c0175004000000004c0124018000000442c06300800000000e00490060000000012014802,0x150903202a801c9c33c1280692401814c184208069200a0a61221b403290050540950d20214802801504d0dc04a401015824c3080c5200a005c12431032900405306708e01a4802800000000580520080000000005819002000000191602cc02000000441201e601800000064580530080000338b60431808000001a8bc098c03000000c45604460180000611540863010000000005a0310040000002d1d01cc02000000088481a601000000005d00a200c000005d1d0099806000002e0e402cc030000000001e064008000008239014300c0000438f603418080000000223c0cc010000010c760286018000008239034300c21831052015da00a0a40c610c07490050000004414018601800002105003c30102981481180b5a00a0000000005018802000000001880c4010000000c4840730080000000328051006000003290804cc03000001908201660180000000011032004017239832022200800001043500a0c040000013c8e04c601800006514c068301000000331480a180600001444101b0c0400000da2d80d06020000000685405300800000351580a1806000001b8a40d0c030000c714204906028000000000d03200400000331481a180600001544501b0c040000000783814601000c8240700934010000000420c0498040000000220c0cc01000008210812e60200002082b0306301400000000038190020000000120c0cc01,0x5f013200c0000004e320298040000011024038c03000009c08802c6020000000443c053008000000001e0290040000120110058c040001284c12016801800000001e009200c00001283a06318080000000028034803000000000c80c401000003509c06c301000000001a8051006000001609c04cc030000000b0880a601000000002c009200c00000001b00490060000019024030c03000000d02201c601800006a0440143010000003708805980600001a8210058c040000000d0480c6010000000642407300800000003c28198020a60820c40919005000000a432048601e945042d807a6401800029c408124180a005611c3301a9004], #[]⟩ def dynamicCode : Nat := (((((((((((((0x1856df3676f928900821cd9a50db29d17df880439391a3f1002f63381b694008c021853d5f4cd6a4a2433045429e58e0d1d2d2e3286163fc96e0920809dd075b0b0238c74b9305005c57121509c00940200002f07c51dc2100) <<< 16000) + 0x000000b091001453e3ebb70804b24c2091ca18914c0ca08a01c0200803400044084f02c27407e28ee10800000005848800a29f1f5db840251058c40c408586104482500838100100680008b1a15e65cf35f0e284c5e915a1c3bade26b6630002f2e23d8500426b7e2486009dd09209152614230080000a2900f1581f04c0f40607803f147708400000002c24400514f8faedc2012062452441841822410c000040410c14008034000488e853ddfeb1f02dc22625c9dca76e1ebb413650549fd52acfc9ce3baf054c71480c50c504300200158502813d90462ae78019da5beba1ae34c28795ac761114acd6cc1fd3fe1eec59023350002533d8ff49575e9461938e47697e09c9876be608e490e879f388f150bb3470156d6b8d803e1e22185c062054c70c40c7085084082040519b974944959809c85df9e8e2f4e3fb301600c3b61316300cd2875253924e9761971ad5a542c32ca4237ab630b325e80018f1fb0e5b09291f45ccdfb0e5b08c00000000088450c608604404304600500400011401c1a0080340004c884e16c26c76134220990d04c04c25c1412c02814060f8455202883f452ca4471c2a9decd68c98c12b87cee6c8820489dd453f8e4000766c154901c0bedc202616020010fc5fc00051074a3d0ffc40f88242901c614ff35a9b7880f6a0340fb870f71818173090854eda64483082ae473eec6073508f5150900273cc4310603d21f254f04000679444f54143490120062057223e208f461431c47bb452037702ef741070ece64a12ee242046aff8f783083ad9b5da704152446216f051428e404c028000192200071c4254a764f0b7d0ae20ba709f339265b2785be857105d384f99c933266833708245da0bd59a4a37c6112882872842032820c224110070080200db247c5fb126fcb1af866890198a1400000084d0411e62fc8e2d080c1b8e6eb098a092c87505094b0591bd10f12820000000018d6900050028b20cb42db182c8e50ae191938e78042447082ee5c08c20c227f232d3e90bc80c4a4d1167d506505afe5413b15982c15950a7dee0341008003e17e43e00c0001266dc4bc81d884801881c0000948800218991c751328b765f1452b9f59480d6890c2c0c1df3b2d203c29a0db60b9870b0a6834f5f461021ce7d0999100604755cf84bc5b10012b31bc6e5740062fdec2f09cdd0105c05800022c212813b2785be857105d384f99c932d93c2df42b882e9c27cce499933419b84122ed05eacd251be3089239231221021018e10a0860260200401b64c447f7f0ab096400ac9883dc29632b150433f54142a397d1f4e9e08210a7a087cdc0e181b7f8c95a58408bdd45f8d8998000000001f0be4400160102c9cfd87f628d902c8237e78a9b5232c65764a545f3cd28599dd45c3c550184141387fcd5601c3094124cf94202020005b11f96c00813338ae6b51b03000035fa8633a0ad44801801a0000920d934317da8ae59099a6d41fc58da6c2ae3b250b51a91b11e3861493f87b458415c09e10c204708db38d460000000013f400120042c99a433dc505805907e102defdeccb1aabf330c9832942cc966aa1557018403e0e1027f70386129617168020808001cfa152e0081197c9b02f8103000044b3367041b912005e06000023e20007f4400217c82080c00291883384e479ff8503476979237da5d39b614d8913322735635994486035ff6ab4040203afa96ead654d8a11dc4ff346e10c300213c1bc576001007ee8f93d8e7d67104021881e28828269ea19943c4d1496e00a14bd1cc289a50852125302f2443d93bb8fe8c18b85e9b6fc204521a4f47258000000009fa00094021442b4194414860a1f00f1b27631650b5354da5737d2449c7c278968c0c1a1740103a7a0809563dcec470038200117a662c0081178a04258e416000297028f682144801681600008ac8001f79b2785be857105d384f99c932d93c2df42b882e9c27cce499933419b84122ed05eacd251be3089239231221018a10a0860040380401006d0f0996c1f4324525ccc2b7e9423f6ac6d9a49100f645aa461870f86a58142812bb6890f386000f64707767002500850f5a55422cf249229d1080f173de5096503fbbc98312200c13bc2a6001879579d8196160c1004e0429933250280b9b0576570e08002eea3aac0380006f3a88e685949002e02c00011a10003c72000b2e424c2412403091010006099090150478682380411a02001f5521186308b3184514c2249611033087198430ac170570403cfbad9103009709b91018e500b769611f1456458614afba41d80005d3f51a4c004001080e6d5fe718a1809104c02c2521aa7e03044eb44f7430bd19d90308002072267080316f2eb13800f804000053884280f47b5dec696ada73344561e9c80beab3a81945c1fddab581d33a0000000000000000008af588a44762f0ff56c0c8725275aafad957acc1def09f5e86640000000000000000021b65254a6635acee808af482a638c38420428210220122d43aaf5546875fcc2baff30a122167e8427fe1902bbe6a685ad35cbc3b9c3583aa6fb12e2fd1aa3887f220708b77f2d633e07bd60360b8c1c7cc636a24f997b00509eb1e60d0035010e7f560d60c128a95d0005722108130830982104e00002008820670d914840c47b67b0030edd5fb2e840084f0c086400200080000689b200206c528080c159b3c99820a3d6646d2080400fa94224600005a6a7f42006e8fddae098109002000028642081743009cf58ae14201459ea101025f715f4e4106d7db59f20a0003f)) <<< 16000) + 0x353240800ea8468ba0801057cca5009c308c0200002e04204060ea0300043621003b07f1d83f0ec1f4740f83b07b1983d06c1e4360f00b0770503b00a8883dce6ec24086ab7e1d38610069b878c9013f2c312642c007d36e4902001fdec334d566102300851188cd44e1430c171a7692840806ccb6eea4047b06ccea23820ab7ecdfaab28812004000046483a8ac1d0560e6230721183886c1c0160de0b0140503702e857ff18725e5096c10688b440804c8b44f080080a7127d1190408c02142c12b044cceed5ad808f0475ad148d9b2951508a27dfeb601a163fe1425845375b8938efddb3a74c95a7047e89527264f84f68ddcdac9a611a100f816d721c096813e44b67100f37d5e547b709b8afb94bf84f29408103a45e4da4107a8a6d434bdd3f5afeb10b22c4494c7fef01ce25f88804b033d1ec52017a0773ae93fcd48e4233b115ca820f618cd975f4f7b2eba0891bffe9f538149c758910d5cc4dfbb99c36fc821b05b0000545322452784115243b3ed5fbe418228ac02330600580762d388920a11804000039c8368cc1b0660d63306a1583488c1a0260ce13b27075944b2922119b916a5243ace2427a4482d994bc9cc104000242700a328a118040198460b81b0650d83204c18c060c403c286fc7ab68942b5690c0f8284a9a43fe703840c1231fcc704442ef94b022ab292118040184074295bb6f4b5c5b35d6cc30087637d22c5feccc0ef78796cb933487b74a122f97177cac83a87341bb1497b2db005cbe2934f883ff0e48fe924c3801dc12364bf33fb105c9dcff7b12a8ac12229343d60120fd45efa891800299716da679f1961f6b96bcb0ea48730c02baaf793d2e6a5aa3f4822821893aaaa815f0d007363041e2fe01e23115c31977e4958d1e9ffb8ac9fb4e9c5f007a90a78921160b7944c5403e6d5d1d2352146c96e000155c800352906005000434900105e20be3b05e01c8b7a47dae7c6048332c24feadacda645d80d70135fd9c622df42c668e22bc810485327ce39f333031bf9687479b289993500b05b97bf59d229b265bfe60e0753a2e9c406a2a95aed1335b16db06377fe857424c0e77e5731970ccb65000b67197c8d593e9f47eb169ceee328eb4c5fb24e4aa790624ea462cc457c0055ed61b83cd1f00b8f1c495b42f846d1f4ae7e96e6290fecb271358bbe045364180986315295bdb501338712a2c031f0d6bdb2e3b9c4e60e002185e10071942ee76e9f1bef4c3ef5da8d96530872eb3621e48c5ff4342438eb32c70e229c5afc38eb319da2078a35790fcc60b16e3071238bfbdf681460015d48efc04c184001005d0de0bf63c96901c59f21817f10003e3b124d02310210080000581c24994ca0b32c0696f3463f7761c46ff6bb33d32b3b4c28e41701b9d18906dd5d82d27d0b015e01ece52b70ea97196dae3f7f3e847a28a2275b71e6c36ac3d4def364713896798543800173401e430bab0c053a80a9844140650e14cb0cdf475bb84431055537dccb780e3b3401e35884ce6f34a439320be0bfba100cfb4f168d9cd24cefbcbef66e7ce4644660b1ad0a647ea24270a68ddeb213389c3ca6a3e811dbf252937929379d86729ce49467bf02bac7e62c6b2fc4cfa4ac36ae232dc6efc26e66c501d6ce9db2f42e57b84560d18a8a9ea0001aa8f8a1bb9964860bbff8084e38b44e6e0cc48481b3c2fc600057c19ba84a1840010c17d161472e38bea7947e02420b98239c1000495cd12109030840200001b670981dd65a738205aeaf78453c4eddeff8d962506b7f04a71a5645964af376caea83586a80859a2c0df4d3af8cc8e73d2a3077dff4291f8b12a5ece657500cb01e0016586774800574945fa5821da2e301a151e45a69cdd60ae25a79e1a90b4a2c885b3e33f57fcd7129474b69413af79edf996e8a997eba7d2c2a78ea820437a3974cb04be417a1fe23639f7a7373606114583b0bcee2c589468b47b45c9221e18afcd9de8c6789a41c1d2c9cc9cb5fa3ca56d1b5c712ed853fd7086c220cd8e7a8b57a3384fbd331f643490e22d28a598b52f4861ce97a8dc85ca775c8e9d6a371be73770ccd8ea4c52bce22628e093a3cbbbf435d2751555e7db5f08479fffd0304a44ffd9d13e1ac812717107a6ded0af81324992ab745759ce071f3b52ea2ebfed2a03f61a8d257af8527a51c4a9251f4847adcb000136a4170440017bc416c760b43b0591582c08c15c260ac13c0036e139d88073bb0f78822aa8111a100040000248800afc10231dc010040100aa0b05401c9289a695b6030e27474f6c101003b341af141002c5761a100056e83f1e5002300802980e000020089240a4c297f0825634785821827cea923847000c924a6464002300800006e900011a3c00d17a8097bb8dbf1e37dcbfc9328e27ee8d43ecec38ce95f9a397c51145dfbb16baf0c00559bd3785fdcd699bc68d8151290970c5fe48d1ccaaedaff6b9e5feae01284493e9080dd8ba2bdfa291e7b40b1e8c4c257dd3fdfd264f1db6f8c1eb1434d6e4032fa2d194d434318499bf09e24a132c7c4582fa7d69cb0a4a362b5278db6a28136b20969cdc3df2dac0d5adbe6619a20b63dd921eb38eb2a4076fae004ebefde7e3c5f83376309103c00002bb10007e720a4230511182806813c360161a04e0d82680c130060960304a0182480c120040012944009914801d1b99b9d0ce7092141f857e25ab79b7ae61d9ea70f297e882be152000000000000000002193458fc13ac268b80000002a1c80df3977040588000000a98c20818c00a0020082a8a004a9c521)) <<< 16000) + 0x5fadb648bf044943602dde31c195f25d9c64acab9c4c2bbc050fe4d2199583b9ddcce1ed0770ec5057c97422c62f6e8986eb4b621ea91e0675047010002149004c41200e476606250eb2950a10b544c1f4204075175ea0c0b960c4b9a203ee52633c8408f234e47000130c11004011846056230450d82204f881f0c63a82e50171254ecdef141db283570645ed0c9f8d620b2c07208082e02e815518d321a767292dcc99c7d86b2910c2b53fe438175174c080c9db20796a2976d1b2efec2d19bd1d60c15f3a6c4a52fb2f2d604d80811412c00c2c4cfbe47075b3084eff04beeaa3076fcf408219e3531180827c5adc97ef634f28d9a6bfd9504f864b021109466ff97de2868c484119ca46f7935cc0ba484fa48dab11b656f97caf6cd7b324710d5404804257873ebaee47e23aa1aa4400beb4256cf15a2fa3f4396b867338a4f97b96bf1b5bc2d102eb67f53ce25cd0a089ddba8dba10a36cba0000e32410c46084230410551200403e1861019e7728448c0002604a2882c384dd640728c7225950020004610222182421840398b770901c967842b49081f27128a30011f21c440c006d7afb24c004201000012f34308404b7688181086da6240a0a1317721c290a1e36710088f89c5c03011999b4b84c084201000013120800bec7fa4abaf4a30c9c723b4bf04e4c3b5f3046933ae93100a05a11523a300a40e490114982a620430250028020008051e8495bb9a0076ec2b639276b1bb60e611de29a6cfd1be102a43a46410197fa06498324478a000546403c4607e2303e0d81e80c0f0060360391adea0a10694d2fe76d41542b63008606c163a3d728c0e812966c8d0e93202019d04ae42d4c875658d4bee41b0d8860b65aff40c76500eb3575db42f3e00902c8c6586dbf8e967674aa016582c6117376e6f4fa4985c792a8fa286a8323fce296025f7a84b76eca18e22a8e1581dbad72839430207c60938a4ca02c0ad538d94200d48155f940078021c423745e9848a070d69c941cb798f420001102d6e48003c0100000c93a4a362e7b18e14a20ebac05073d6c0dca182750503b68c0c056adc38b0374f199085000568cc120803ff676555200084051a484526fc871000e312310330fa3a7c70a1f3c5b8141c18ffb772800f00400003cc80014d103b09000250903a1181c88c0e03606e03e4147ab10463df17984c5186e2c0805508cad7c409989ebc20000000000000000042426a723cb563640d2135391d0000000008117e3fcd7e2249eb058f0415441baf38a9890a60202f70550e0cd04b0490010029150e5ac41e47682b4ac5c0f0bc018edb505606ef5b41053622a173b2e5159047a2df4551a637d3c1f361bbc8e582cccf161bcbb8b99b7d482d5c94b1719eedc280a72aa1a3680501305f9d11767a071957b62c2705a809d36460838010821afe38c3480809a57bc258600b55d8070427bd0920580102be6904a08400100001003c6938127173cb0d5f9b406942bddd6dcd04d044d919e070b6086f100001029f413040f804000049cc01004011e5dec0ec10b0c2f8892c20149d55b923041d00800004f1036050000781000403206a23bb691b9d2a133587557e0aee8f6f9381f39051eac4118f7c5e6131461b8b020154232b5f1026627af080000000000000000109499a2b86d6430fdfaebf340431b62ea1efe408dddc000000000000000394f34472890bead0000000430b46f0710818308b00900302287ec928cf845ce1cc65c744623cab0f4ccfc3937d21ce46c0270f916b8848beab9695e62d8fde1f7cba37e4eefa2395435912c625733bb589c765b0a830d933a812eb6dd643325241e660841d7471cb451bf97d2b8f65056853281a00c04c06066028206349ddc20357812a70d06fce7db70c12c9bd0c4d0010979fa25041e00879659a7c948d2c3a72c3d101860cee873413b5179aa1824bd7e034f03e694b390800008ba3727041f0080000a8103205c00004011e0557e358800b802000010cd8800fd950910785e849619b3510e08116fda12881dbbfa24c00063b6b93020d8040000434c0c1425039740182dad7661410001cbf68c0080021030df4f500d14d67696c507d1cf4311014de0610c00035f340500f08bac66001c0080000891031050000f410003ab2000c7640c03400197e70c98f5011ab16500000012c0c20022ebdcd86820000004b0301196244406180003340a11d00244d1f91583094011a6c98517e808d2404053045c7040000004b034218770b04416100000012c04040108630e458000f3f8408040005ab80f338042500471d1287103d59fbc6394e28035fae0750644a5b1e1800000112d789e9b038316916c6fae461e27060600000044b5e27a6c0e04007c99d456bb829b02080000017e65091380ea8823c5c010c1e1c7497592700471402cdf581f9e18000002ee07062f575b4a51e0000b8c0f6c7000209921df94000000004b13801300400005fc8002001030050002ed102f110170480b414000f4a40076e8f913130ba474b4c85fc9a69f75ae6c6113f7c536feec31c11faf0000000000000000000000000000000000000000000000000000034a3a9519e6141ee5191d4a8ce80000000040b4e5958759eca186e78990e598000000001118a19008c08a00800913f16049cb7c84087a8a1575d76d2678c52b5e69fd64d54f01ae25a3dee37169dd2dfd2da390b5c13bf0a78ec858dd932e87bd19a422e98e7280a4345f22ee0ad98a8629911909dc99fe6c3a2411d53ea0409fe15a6451d6251ed0c20c9e4286c1914c)) <<< 16000) + 0xcdff81720600000098642ce1757097e00a1812d9191631fc6170c54ab430efa9bd2c3840ab0dcbb62e4402384af9102d5e6f69d409f41811ff80682a512845f1cf81896011f3ba9f4b556803211ba611540614852253e38e60d6cb6d410531de7d337438e2c8700000e048080080026448017f6902c2d81592f861c99a855c8b8fa1430000009d226e68101051a33737bf0a6c70115d563f6eb55562804934363e0699a10c0305198127043908006d0bed9c418028045540f8301e576bfcd290c2d1ce60720c002a0100013f90039af2052620280170c8f078a7f4fe2b6f5a0c18fb75fbef11b75813a101757493e01582efa09a18204a6ecf0cd0efe886c500ce9de4912b252487c0805f446cee8a2eef6d020c05b2599dc846dcf693e28a828000105aeeafe8a965a0a6628c76be74047098510488ec62b2430151c40fc30ed3f39584181ab12a46bc5071833d9b0100251c220080138cc0985401c2b0251181204eeda46e74a84cd61d55f82bba3dbe4e07d69cb2b0eb3d9430dcf1321cb300000000022650549fd52acfc9ce3baf054c91460c604504400000111665e13ebf8e44e8ac7124248de997ece67c8cc9af103a7f626433211ad5f37e35b6df7bed2350dabdf49dfde7e434b186214f4000d908118ac0501545825d49da87083e2486772010ced68618704f9c575031c00873aed8c9410880200440b02101c883d50cca64860fe54c802048fa89a765803d459a584812a241b39280100040080078512571f2614310deb89a0c3234cde7c101cb477daa2800395339d94008002185827fc3461431204317f2421131ad2f101c7a61f163800d8ffeca9400800200001f8400084cd59d813c31d568a458a3a89565ae771608231b5cad4818302c00000000000000000000000164f0b7d0ae20ba709f339265b2785be857105d384f99c933266833708245da0bd59a4a37c6132032422020810c00006f0148c83e94a44a6ea4b1b4122143d4e43882218a74d2742120155bfc3185a71044665c946b2dc61896f4261c4f4c82d2355748e848a0a9cefc55903761889edb26f21723e58248509a0009dc400212480f88c0783603a0301c0180d80f074b3914c6dc5b0efa7ad2d4afa85176e3b1bbd2ef5c8b137145b8f014436ba9b81ad584d4e006bcd225880c29ee597a64e432d56b8d438c31c01eddeb1e3360cf2127c4a602bc30202b8da12407520196157724aa0172e599cc19cdf709b43444c2d9b2100f3aa222c89e6046612000d02c06407850e537ef0800f3a8dec4003a010c0cc3f4a5c0906d32e2950f0024c70d103004bccefe6400200080000689c0e764d4d8309b33abb8b00bc40c6e3001c0086076c5a82d3c026bd3f194005cc37f03016bb75172000e80400003148000bc90180500018310171180b06c0540786aca0997e302762f25262420eb9ae6b240319e8dd214904080021a0969a8a8f281d2be7b18100043b5e3a3001f008683bd0dcecb01303bed86020a662d040511db612000d80400002f480a02c04c070040100479a5f630ac9244f28ae1440174080208d4740848813eb0098100ad4e2613020d8040000434f95aefc6af88cdb6267d6780d797eb98e3fbf4d0dc7237232c380b087d47d099afc1fa07af9a00570fce35f920c21af5a436b00b1daa443482c0534ddbe590c03bf94308f7cc9dfb4ac14ae00bf4a93826c725d9fc7b1759765040a0b0bb4f5f7e6cb42ffa3f3b3ff54a2b204458de0000de480026f100069d3842b7dc8f345a3183b5939a3dd36d94382541bb6f1040e3e78b5ea42745100821bb789c8ea1a001c316da3e7d1806186be3893d38e001aae3fda8750093882050c00f00004304048340013b06417aa279db1c11f363573181e5cca64d1423142000848c0f366efe73ac687a461a7b60b58d986cd52f0e103cd939431e27bdc9241120595d4747e4c76c3822298d15a63ac7a14860415eb32c1a9722f12820bec66bf771a5d8e703001333b6684ca8351f80a03163b589e5f756a2fb5a4b4640a218420000c14808868040040007f2400543080794c0388744000015673a89cbd899c41006444c1fb9e3e778ae0c375b8cc48d3985f965a86005c91972144bb54d91b1002abd1b61bdb3cf96b883003b2f396e5a6293412d0008962fb32ddc821435180550511da2fca702fc898252c3be9bcd81cb12828001a0200031520185200b2500115510027eb20055ec6d396561d67b2861b9e264396600000000044228630418430228220218002b5f581afbc4873f0dd4d2b32413954dc585f39cbf17305b0faf149bd738536387c874b8a0d18300b8c1010041138e8ac348600700b5551428000b8c0b6010003acb835ea22138e12804247179bda0db922f9ca282bc45080454869c04000b7b66ac71c000b8c101002328a1280428aab81c1637828800934c54772c6000b8c0b6028620d2b8f8312460000000960019440a0021456fe2a9791d144005b8f6a7e1630005c605b01431057733bd612300000004b0160000b8c311794002c0b9363380ce205001000019520005ba64902ec2c6ad84112cee0aa61c9100e69fb3cb1020b5c9680a21c40000000960284037157e934308082be727a8c001c77961e60000cd3378443818270040000f5900061e20144300919e1a5db28699003080622d3711a1c2000869b4ef8c10ef715547e050800000025803002872168e7b100003338758f828006699bc2080021a6e67f231ca0a40300003f4402084001424401c8400c3a0051900200800c040018a24008440020200001003d5b9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 24 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase7" = "QuadFullEightCase7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 24 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase7 private def zz2286:"s08ee"="s08ee":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase8 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l17 l27 l29 l33 l35 l37 l51 l62 l66) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x17c01750, -0x3121752, -0x49b2391,0x12c], ![-0x3121752, -0x16c4dc0a,0x1912713,0x3d292f4], ![-0x49b2391,0x1912713, -0x13f59f33,0x31219aa],l66] noncomputable def hinges:Hinges:=[(0x2cf3cd7,l17),(-0x1890c3f,l27),(0x1890c3f,l29),(0x1890c3f,l33),(-0x1890c3f,l35),(0x1890c3f,l37),(0x1890c3f,l51),(-0x2cf3cd7,l62)] def normalizationDenominator:ℤ:=0x165a0bc00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1890c3f,l27),(0x1890c3f,l29),(0x1890c3f,l33),(-0x1890c3f,l35),(0x1890c3f,l37),(0x1890c3f,l51),(0x2cf3cd7,l17),(-0x2cf3cd7,l62)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1284c12016801800000001e009200c000029090009980800000000b0024803000000006c01240180006804100263014000000001c029005420a404200335006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := 0x61b3d52aa18500004b071191277718100411ac404000064041000007a6001a00848a0edf439a48816b7a1f8388dc15dac8308a6318d483057055ac3c401700cf3fc2804d59d20610014eaf7279100040040000187303000032af913129f6e9f1b540914061752f10ea629fc90ee0fe388758b32d763888273519a3451c205aa16ab3bb68005927f368060802b4ae4f762b564784116f8107b8939989bbaf237c7ff5b4b5a03df2d7e0d10af8c00ba220e218de7ccf228c207ada0e6168c11b3e8d041906080897ddd85020ece720b297100174c88b2bd8a003c39e29460400b36e319a34e208002803c0000e690004c13868bf88a8df323b1295b76bb266229f4a121c20bc699415f3cd6b161c05d6b3ca16eb6b102230d45f067133cc5f9a33aa012680d2a80c103e45bf550d3ffa080208d11273747ba2081179a3b8c875d762a104c0391914dedb32113cb5004f9eedbddbdb582383d15880488936444ad360c342a9eddef167e508841b00001f11a10ffe1c785c3082907dfbc610413963ca1018104e58f2840a09eaea8fb9c3042906d8106281a8c53a47c1003d8b4bc4924c845ef021e110184a0580001dc20160a00a0140d7f1b190ae9028e2643c3183852d93e23580c11057bf5a2a2842bedcde4a1001921a0a89028015f6f5ff712c37d44391298d4ee054d13841301838f608b5c11028bf3ec3c408570bca20e2000012c0400000c9398a0000004b0000000034b4e003c010816f5dc783c24400004e2008139fdb0a0c1c10cea2507060000004e200801359e391c1004bd3e3e1c8700220200000b4991da6203cc3817071190ff0764b56c80c0003b226fd8070f3fa03f84d64c3080ba13a9fd8884000ba2272997e8052f9b613dfac9d889810c016000039e40012d0e1afb5d738183000012c050486dba0918021b6e1e4300000006408000000322c003c0080090100400801c040002b440183702a59bb155c01178203279811cf5379204011d9a943c743688700366ff29e84c408a012d1075abed2950804a7bdaf659d055144b1685bf32aa2b8056e83beb192af369fcb38ae2b44badb460c3707858d582c57b8c21cc410612000480438132f26425c0b36907ec633502c8b186186108088044002001030000200d0000f23000010044040048a4820c210f342c008a7cf420011768082005d5b594a00360100000e320002406052a77162090cf8dc1069b6e30e00fc0360a040b80200002c08001c41f918fb60616b2b01ad56cc504701169b590000000000000068890544f94ac6c9b0761227205000000000115800462061823002800813f5499e1b4165ffe4fe814abe794b0d3adf0c9dc343873f8e16cbca8d88721e1cb7f3d750abc05efa8675faff9955a88619574000d088004bd10011c73c3d49a758c0c5126484047317441020d96ad140526850880090c588301b58d484e0832010e280008301beb9845ac2124be0e7a19ac0e9b183eee89adb75682117601830002762ab7d118599f7a93998826934c4fd46d7d0443e61b3bacfd903040ee4d1b9cf312b9a138d9b71f1719a78cd2307901814facb0f69e78c6069edefd1071657f4b93a6781cecf3a22253b6d942bbc332affe22ffe88080004180df5cc22d610925f073d0cd6074d8c1f7744d6dbab4108bb037e570188a6429d8051173e560bf89417ff8b52a2dd958cd442826f98e00015f880280a0503343a8a20679780705211ac22837564e990006402123c159384609af1f783823c71f9141a69fc08603314d082015109b60801f20789c006402000024870de362a87080783e8a13938798c005c021c21228490c148d01e8301620dea100c088ca9000640200001684000560c086ffd7b2511d14981eebba2606820ac4e8fc20b283869beade186bc0c06c119938908b65283aa952ecb814094defeb761f4202aa699ea8b18200f4ef5db5755acfebbde5a03c20a1ab0afb2027d28a8e0bcd0a0d7c4bc58e67108cab2648a08ce280c305b367fa0563474817a0de48227888ad9ec617321425e5289cb9ef63e4bb57ce963aeb303f2ce9ef424afd94cb6c3959b71c29bd9a688dd027e54766153a12b172308131317cf4adebaf71a61096d3ab588128098000055e40017848004b19a2d3a07049510a18620b5d6638a09acbdfb5048808000061a80080074e4e333306000000186a00400119c1fdcefd07002802c619bc4ce90c28b62c8fa5d184000005dc0c1800002ee050c0000885c2825448e8bc101000005dc538010808000057480202800c040040200034c200202000010009f11 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 9 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase8" = "QuadFullEightCase8" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 9 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase8 private def zz2287:"s08ef"="s08ef":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase9 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz1021:"s03fd"="s03fd":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullEightCase9 private def zz2288:"s08f0"="s08f0":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase10 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l17 l21 l25 l27 l29 l33 l35 l36 l37 l38 l42 l43 l46 l51 l57 l59 l61 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2c398fd28, -0x59682eb50, -0x861c46350,0x85324bc], ![-0x59682eb50,0x158301758c,0x25ddb1f0c,0x7e2e3365c], ![-0x861c46350,0x25ddb1f0c, -0x2452531800,0x59682f4b0], ![0x85324bc,0x7e2e3365c,0x59682f4b0, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x3a985eaa8,l17),(0xafad4550,l21),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x72348d6d4,l25),(0x2cb417800,l33),(-0xdd8ae6,l38),(-0x2cb417800,l35),(-0x30173397f,l36),(0x2cb417800,l37),(-0xb121f7a,l43),(-0x7d051865,l42),(-0x4eb86c0,l46),(0x2cb417800,l51),(-0x2e5a8e55,l57),(-0xa99970,l59),(0x55973244,l61),(0x23b68afc,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges def s1:=qPath 0x59682f4b006335d133709776c7c3000429925e0861c4634f8b2d05d69f78a9cf1fa1229298bffd92c876034058731fa4f2703 s0 def s2:=qPath 0x59682f4b00fc5c66cb809776c7c3000429925e0861c4634f8b2d05d69f0b2d05dfff229298bffd58301758c058731fa4f2708 s0 open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨7, #[0x8031c0c1010180002404701080c0e2418201041800209c0001804401080c0e0000d022018207098000200460104100e240c601041800106cd072c1c20900546f0000000140400101460114281030030330000903140c1020180000c3020700201e0000000141c201034000101820104080e2c488010c0c20808c0000000704080405000060204040010280001008202000c0e0000000401c9020340003008b0314040e5008b02080c00305c000241430b00404a000000038082010140000000b02080405000060c10043020380000000e01080c090000c0a0c0c0121389011c0c30208040f1410403040c00808cc01242410c00083b00008020804102038000280850608242e00005080c04003068b042804201000c130000c012c08301028a03142c10300343700008011c044020280001c10401001c1a00000002404701014000101c31a0090560000206041c0070a80000000f01080405000000038043010140000000d012c040500004010c080010280002c0820104040a3414b050c240181bc00000006010404052418509087c00d21c00010042060004122c18301080800306c0000000a030004050000000200410101400000001010008052804901200810606cb0b140420400182f00000002c04002034a041c0c60308243700000002c0c001014000000080104080d000071a100c008098000182030300242a000000018080010140000c1010100080e,0xf0724040070590072c5421e0070c34004b030c1800a0cc00000006060404050000c0e080c015178b0528109010c100b0000b0d241410c0688081c24601100c0f0000306041c012078b03240c20400101b2c0c9030c1820204cb0c202c60700484b0000907082c0070c80002c0c90310100a2c04801180840202c00000010021c04050000b03280c001018b03203c70e002023]⟩ theorem v0:V s1:=(S (K 17 nt 0x4308afe1c4022444a31a4461064211880324060000012898220c4831920348128010080539898f00c9018400004a26098330d00324062c4bb5e57760864c13cfa2cf8f20cee2be0959139a1eaa885a5cecb150d351f57bcd44b5cde73bc26885a5cecb16187900d223f847f0e3a4c1c3104500cf12c8aa1280918874056e6386c7a3fc4318e8322541808690105120d24c908796122a0c014400ee611b0032406100001bcb34affd2e14326094114410f439094007640350d94cfb88edef175f1a0ebd592bb9dc9d5ec6019fbbcd3afeeedd7ceec19d23e9065095b659629c36e03f757454055a127e27a43dcca1e4038813c1dc835286208a2087a2684a2483a02432084a66e7eff5f39b992ddf64b4876c6d6c7fc262b9883c8061b1e51a5f89024119406208a2087a1c84a1a83a1685201623131a31920308400773dedffb0ad800020ba600a86200a933b1a188c90184200104c0250841d0b4290450d208bbf21086921f03142e99cde78e534591091b06604a1083a0c82a08803bc80c910681202802) (S (K 16 nt 0x43be9367c08631d0644a83010c28be06901a033c0c670a83010c2848077c3902bc1c88929841064001dc807919e121da24d2b010c28481f81a414244041e5d2188228821e872128f200e022d9952ac3100c90184200104c10c28481f81a504bf18244494c20832000f84ea9e111da44eaaab942b6fc3f33fe91e7fbdd807fd43d7f7bc20c28be32053fd1620797406208a2087a1c84a1a80588cf0b8eb627d3f176e5dcc73e8e58376f3ee35eb7a71f76b8dd6da9637ad79d594bb3cfa31cea1ecc6fef6616eca40272d0fc674dc318d7f15ed3f8adf3ba8c900cf852861210797386208a2087a1c84a1a83a02932650289138e784476913aaa8bd52ee239cc72b08fc28f675fc818503cba0310451043d1a4250846d4f0b8eb627d3f294022fa57fc6d398a7cd6257b57c29f35895ed5f067e95317d6aa33f0906504185081e5ce188228821e8d2128420e806b49941143c9bfc12547d3f1100c50587f3cc7ad0916443524198128420e8323282200ef207da4c22e80a) (S (K 15 nt 0x5493846480d20caa16900c90184200000613044d59c6480c2100082604486a006329199401c651b950b00c9018420000061304a08a2087a349121080114cd9a0fff0ca0bb05101122bf86142220c822e90c4114410f4692142107401d44ca08a6535632406108058972d59eb30b1032e69810a1083a408ca088033081509308fa) (K 15 nt 0x28610032406bddadce7b1c080200042149b4c14b4a31920316231d6bfee0401000214064c065004d146e3b47dbfd7000fe119c257176b4f782244893e0832098311666f5b865aae83bc72981e3569877be5f219c29764b9ae8f159603defba9e725a27b79c8796dcfe1d54561e24799e31264739b745441140cf83840352862007ccad459474f12a784dd43c643f0e766c4548d2dffc0d9eeada872a7fe270c5f3725b31cf218a0d120c28bc079458994386215a2087a018f225ac56e378992fdf0772fee02fcab70ee7bae43fc67ad9671d1e3b5b0830a2f0b0dee229830b20310ad1043d26528548821e8d2003122100d318da18a46480c210008260528420e801c8994114cd0c523240610800413029421074a11941100481078229d430a2fe124dfd2046049b3495f76c683484aa91403310c28bf926144823f0fc12594c8a04190328022ca370c2818482c8861008888642d2b5a789ee41dcfbea521ec5930c18b9bc03310c2033e430c0f0f3ccc366541088320410f49943cec79d16f9192738be031c6e64d5fdb0eedf87c9dc526bc7b12106143f114186fd20f01cd501884a8821e8d20167221010f186143fd14241145fc420de41a282110640821e8d2428420e80308994114940c26bc8423f2034ca112b7f91feb45910ba0cc214210748119411007010501261033a1)))) theorem v1:V s2:=(S (S (K 14 nt 0x887b0847d19068456598d735ed035b56b15a24198846200c901842102697b7611e6f5c09b1f9cbf696f4108142e578c17f8e3d05101fc34f850cfd396aff09a90c19876a042ce32406108001289800150874811941100971021c31fc936482be047e0908a0f0a20c840c5106480c2100071ee277976562aa0c0010c60524632406108009d47d7cef7a0183860008622d99544890245fe10fa124028530820c84081046480c210008260004f3245961f4955d8261f4c4507051064001dcc471846480c21000826074ac82fe47fd03b0d03b861e504220c81043d0e4e5004f9010b31b1671920308400209810a6ac3a006d265018316ce8884ff0c201110782452a6104190810208c90184200104c0009e60324232406108000289800150c8b1006480c211098226b883240660e1104008a5329d9164c943c5e7c282150c420c84f1f4261d5358f32f1efcbe8c668bf7555db72d8718feeeb9d39e0ebe4974ba88e1020041212048a201a40990c2860c41144100ca16e80878c225006480c2100082609f3aa4437ce3920c6b6d7c9097a269d2fd0c29bf5c36962ff5eb94b075924b65d545ff0c63e871a1e47d2403189c310451043d1a40346408148278195c800c90184bfcebf6e7fc20c9824822648af2a3e428b0f84d28211064082008624d21553c3200463ea24185087c2304822e90c4114410f469214017043a01f426504532581192033db5fe4b1ac0401eea39de7441d9810a992a60c901842017738ff2ba96886a61810a009021d2046504402e84278087671) (K 14 nt 0x9c4100c90184210c6d1fd337f002108401599820017bfcf2b387db78f7f1878288045ff848451c311013b6907d7d5741c5aff03f95ac791ad5fda7334d5e1917e9ffd69484802c56b9ece5a0fef3e7edcccc3af4f7e947634411715fe10acc18801c12b5487022561c39480adac84961e9170efe10a193406222a20a3b00bd285c6700b750fafd85035afb200f7d184efbbccd685bd6e6faefc311df77a112c3d22effb223ca6670c44544144699401b5634d529bb173a9c35795762c567ddf3da086fb1891231f0c386215220a233480434c36051860314632406108400080e260005e26504533d281920308420209814a85e940c90184200104c0f5002c90e9423282200ed20f3263290032406014771e7a5fbc13b85796c40219e73ebefd2904210a5da6090c518c9018423fe7378c031b47f4fefc00842833019401665b3861ab5ab9c0a34e7372f9a31c7f13eddb78f7f1878288085fd8c4b09c3112800093094177783b89f1a5dc7bd1b170f6218d171ce33781ef5cef18f551a8d79ccf2e4f6a95d521419223f8853fa89044ce188708828f7836321ec431a04911fc38821f811888924310e110401664092ca1701ddc0eae7c697b1c7f2f57980fa94f669784cdfb52f1f46aefc311df77a11223f8837f9c308111240621c220a1e5b921e639fbb5df7033a6eacee6de0ea15944f6b47a5efa527703ab9f1a5ec96c1a590f727b10915fd9064918450c18870882019e2994a08a20a5045104003a5ba00572fd81c618d0a48c90184200104c0f942a4986480c2100082607a80164874019e4ca08a64292324061080041303e532149192030840020981ea005921d3c46504401da4249885799)) (S (K 14 nt 0x910500c9018420000010852260952618c9018421000200a04c065003696ce75a0032406108005cc3fe8f6c132a0c16948219203309a88298932bcded0a3617f610920488fe1a402624c30a24310951052d1a4018e6460603192030844c0410f499498ae03bc42bd35ab88af33b503137b428d85fc8861c5c911d49059ea98a0310951043d1a4024c406708171199818346480c211301043d1a4853f41d0040932822992d50c90184215daf8def30f10fe6042a520e9023282200b8209d264a) (K 22 nt 0x14a0a019203016f7bd7f49f17ee721880454947108f2c1084290c9821498632406108ff9cd710080210a0cc065004596ce001e3bfd7bdaddb78f7f18782717f2190bc1334080c4003c77faf7b5bb6f1efe30f051038e1b3782670101880078eff5ef6b76de3dfc61e0a2038c8f01f82678101880078eff5ef6b76de3dfc61e0a2038c97f17c260c0080c4003c77faf7b5bb6f1efe30f05101c64ff8be1306204062001e3bfd7bdaddb78f7f18782880e320cfe2f84c190101880078eff5ef6b76de3dfc61e0a2038c837f8be1306604062001e3bfd7bdaddb78f7f18782880e320efe2f84c1a01018b7b4007d7ff661877b2000f1dfebded6edbc7bf8c3c21c30937c23f87b151c3117fa217fbf0c7de106fd106fdfa3de12fa25f7e4b7845e88bdf8a5e10ba2177e187841a8835f9fc24893f1d84310fe190849cac438a6b41f4a30b1339fd4d385627fce9326bd2e0796e5f8199a87dd832e8751152619c8f3911131077e4497e718310031456a9a19f003ec4fd52d2410f204c06ff65c901c8311203110ccd43eec197421e40980dfa8d8e0e44c4048620027cd1402de6199747de032b8423d0a950a4784a222486228220a199747de032b803584fde8f6310e331df7b8fddd0967dbf43820e2a11e854aa043fa2a80c450441009f901f6225df7c6801f6219992700a201a489614f4480fce2a031134b9d0e2b1807d28f244cce9f5e31bca3fedfc958f781d5bdec0666a1f760cba6c0afb0cfc7a6881a483c81fc182e41898310032856a2ca199747de032abb1ddcebcc58028631cb4e51f8006cf756d43953ee10beafbb92d98e790c5061c4881ff1105899438622822087a019e2258212190316006480c21109824c7b619c3940fa7384893c7e61e4a1880b9ef5433cca2bb7ffb1326fe047f248c8922880c450441009f94ca5fe649e4af80f3d9874b9cc49fbe03ad7fb74cab5aaf52df832373e2b5c5fd0c24804ff0f348822870c44f4414b46900bd9967bc861cbc83e9d7f424b9ac8487e12efc9203f34926512188a08821e9328793916158c9d6c5aa3846a4d7301d675cba6db8e579ddbc2250fc25c33c92e63cd31406227a2087a3480538812a9059c31a8c11920308400209814a846d48c90184200104c0a5002c90e8033c994114cf5046480c21000826052a184c215e02c8a243f3d2c208320a5003b90e94232822010b232fa672))) theorem v2:V s0:=(S v0 (S (K 13 nt 0x4c44006480c21080210002016b76e77b4e018260a0c508c901842000e9fc5b1cef68000020507cc1008a1192030840034a9d9e37ddfe4000020516306000a93004a41920308400080000800b1300039101e02cd3252449024034b8ec2264482ca77b4b99d0651f47bc8f2d61425439e41989224812019f543b08905a4facfe9dcd8508d0ee0cc00549843be12a7f1043e84475060216344324069051001d9896308c90184bafd658edf1ae00040ea1a6012a163463240610800413009400b240418c90240e185090650770934944bf28ea97858d020abe0cc09508da51920308400209804a005921d009c1031032acc11920308400209804ab4e308c90184200104c025002c90e85a148038cc91240905fc7e0849724d22c7bfac729fb1619820320cc0543100661ace600c901842000f7bcf63fdd6850f98231f4848061764c772547a6a984106404a008621d0b4290451f4648920fe84e8a21f795bd0b1615920540cc314110057102082c12f4b904691) (S (K 16 nt 0x210e2cbb90251d8a948659f4716fe7b29069228e71c066215b4032406910b4a2192030927ce4298c78002064c000f840300d631046480c2286676a47f4d42400117bc41804ab58b28c90184200104c025002c9010b22d9951a56019203084001ce3ea6bc03060c12ac611920308400209804a90905fc974409119227ab60a08441902087a1c84a00a420220635b023240610800413009524030b04ff1e902240772714c20832025004310e803f099405705b38edd36a4388a9709208812c3d09102603bc3d2188228821e8d2129aa36a759823240610800413009521204832ebf884bb324e504220c81043d1a425004d10e80440994114aa5806480c2100030872b3f571b84ec545ede60996d60c90184200104c025002c90e832328220133206ce5a25e972) v1))) private def zz1022:"s03fe"="s03fe":=by decide+kernel theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v2 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullEightCase10 private def zz2289:"s08f1"="s08f1":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l16 l22 l25 l27 l28 l29 l33 l35 l36 l37 l38 l41 l42 l43 l44 l46 l51 l61 l63) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2c51d47e6, -0x58a3a8958, -0x84f57d05c,0x4ec], ![-0x58a3a8958, -0x151311f68,0x4caa97d64,0x8684039ee], ![-0x84f57d05c,0x4caa97d64, -0x24027c9b34,0x58a3a92b8], ![0x4ec,0x8684039ee,0x58a3a92b8, -0x2c51d4704]] noncomputable def hinges:Hinges:=[(0x8686790c,l14),(0x132ab960,l16),(0x54685d58,l15),(0x5dde2b65,l22),(-0x2c51d4704,l27),(-0x14a0b5144,l28),(0x2c51d4704,l29),(-0x2d4f0dfc0,l25),(0x2c51d4704,l33),(-0xdd8ae6,l38),(-0x2c51d4704,l35),(-0x30173397f,l36),(0x2c51d4704,l37),(0x8ceb9172,l43),(-0x2f45efbc3,l42),(0x9930a05c,l41),(-0x26afc7e8,l46),(0x26afc8c4,l44),(0x2c51d4704,l51),(0x55973244,l61),(0x335cc11c,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c51d4704,l27),(0x2c51d4704,l29),(0x2c51d4704,l33),(-0x2c51d4704,l35),(0x2c51d4704,l37),(0x2c51d4704,l51),(-0x2d4f0dfc0,l25),(-0x14a0b5144,l28),(-0x30173397f,l36),(-0x2f45efbc3,l42),(0x8ceb9172,l43),(0x8686790c,l14),(0x55973244,l61),(0x335cc11c,l63),(0x5dde2b65,l22),(-0x26afc7e8,l46),(0x9930a05c,l41),(0x54685d58,l15),(0x132ab960,l16),(0x26afc8c4,l44),(-0xdd8ae6,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x322c0598040001845804c05340100000004609815c60200000001486c058c030000000000760310040000000000e40620080000389385805880180000003086c098c0300018253072016200800000000000503200400002490c48044801800000002112024c020000000000520310040000000000280d200800000082138190602000000104270120c040000000120680b9806000000611540863010000004f076021c602800000a60dc0638c050000001a04801c98080000002107408e30100000004a0c819c60200000000c8440d8c030000c41b05205da0080000000000030320040000001082602a601800000224260114c04000000458480329808000004386700d230140000001042806a60180000000250d01cc0200000004d0d00998060000000000980520080000000048281e6010000430881201a500400000001b0581218060000000028180f3008000000007838146010000000000110188020018c118158079200a0000000000140620080000000000700a40100007c0f02101e10040000781082801e20080000000220a00c300c0000000000480c4010000740d02101e1004000002843680e9180a000000410dc06c30100000000843206c60180000000c844050c030000000001c281980200000003a11034300c0000000641204860180000000150501cc0200000002d0500998060000000000580520080002e0500e00ba80200000000009802480300000000000481900200000000442c06300800000000038012401800000000012014802,0x5110404e301000000000001a0640080000001182c030c0381038c08d0076fa00e0000000000cc0620080000000001880c4010000911102101ed00400000000003c02900400000003213016300c0000000001780c40100000000002d018802000000001c0a0698040000000921b026300c000000e8b0500c80100000000001d01880200000000000c06900400000000006805200800000000a888146010000440b01503710040000044190880ea0060001243208806540100002586611808a80200000210d84c0950030000000240c80998060000e42304c04d401000000000048012401800000138110058c04000004a1304805a0060000000001e009200c00000000e8c814601000000120d05029002001e41141680c6200a0000005804c09b3010000000003c0026402000000000003c0c8010000003384c04e98080000000004700b200c00000000000e0640080000000161201cc0200000002c138099806000000006c480530080000000b04202660180000000001b01480200000000016004900600000000036009200c000000d410802c60200000001a044038c030000000032120398040000000000940620080000000001100a40100000001a8bc098c03], #[![4, -15, -3, 0],![4, -21, -1, 0],![5, -16, -5, 0]]⟩ def dynamicCode : Nat := ((((((((((0x2440000003a98030225829ad2aa47028d052669ab86009fb8bc53b00000dc1c71019c000000781e0804dd633ef440585d0426a7915c85282b0205974d30429c7458e009f2aec38208000000fd5e584209be24d0850400000020d040200000020d058000743c60a400000021a25dc20a003165f2d27366238b1c04144786c86840000002ee02c2166db4a0691410000000bb804040305bf2db668003b49e21a50400069fdbd2a0d2020a40500003a041b8160da0ba2acefb175cef1430012c8188143010018f71f4d250224e769f50b890400000049d414002707e43cda1800010a4b33ac2001bd0bd9252fdc50ac0600003b641c827a6ca3507ff1a48053e6271a0ee4ea8d5080800152649a018dfed97940000005f50800000cad3938210004349035426d3341c944405610100184628300000358c70000e466c7625042000800007f9a003e8cb22081259688b9000e80220000200800002220e20a0000c4384158346040a119ca6b15061000408a49c0a6dc685c8408cb8ab659804243439d86000044f3d4e0040010908af113118a11c23e1f6381c08dd4247012d566a6e4001f00800006690700503782800099c83704c1b4272183a5e4b99810ce4a2621010426bc3d8416c3042301600822d7750600167d88384c104001080400802000008883604f8811bb5775a078a453ed949adfdd3de38233164a1843c51e826cf6a038ae95838144e6386d2ce6d9f3e8b49ddda7b51380460ebade30534ce99a90d44a2286030086a2ec8ef06fd5eba1099364b20910c000080c15bc1996e504e48b836915218cfea75862c028750488822411ee9a252ccae9f83b0f85809b260c74158705382f10ace06a062e599c025df8ea61630c1f00800005410004b2209a2200066120018f066afc3d7867edffb26191a8cfd2f70bebd0460000013b219fb7fec98646a33f47063696c11835006562b968283dd732ce0f9c9e610966290b7e36dac556fdae4d5c000000000000000002221428a1041140060086a56f52427e1673e42c15368b1efeac470e2cea63e5ea3334bb0930c8bf36fc8b70736f6a32269db254c4a1b6b41360f804db6b204d5ef0f5fe4b857518fb3828320481ac04000992418814002ecc70a7efd2c5380c228d07c9dc048400000177006081674da7f41026ba86c56306051e3ccdda0000d53e7304b88082eb3c303d2306c36fafde7242601403500f487ce4cf03f41f64927ded24ae2f046036bac537100591838c31020a208114008013d2b727916ae48ddc1f58c37b1e295f4b162f1aca41386cbcb84378ab707001a79f3204034a5b1c144863fa5e31025661a2611c02f9f8c380403a4ce08c0b041000200004b083482c1a0160ce0381529a64f1a30a0c6fa235143ad7098e58e11aa0441c8b01a6c6b27a280f02713cf08000fde8c004e1042010815277807762877cf2d8913021eaec75e8c10c8f95fec80110fdff42128410804000041883304ec66ccc9a4c3be60a524f388157c814c779f221af0a1ee6b24934de1c204b3c251a666824630c62f020b0279a95569f284011e1987fcc503e8406158163cefcfb6fd785c5992f3bf3edc02305f202ad37902c8b1881461450c308d0) <<< 16000) + 0x49002d642592544e0e9a81bd01bac97c02be3a3c196f1fc1ee2a8a8dc31d056a0003e24000fd081b088001ae8ccd7d822ef80b01b5d629b8802ca35178eebfdb1fa9f2af492ac4780ced7b3961f101be2a083df7c0000000000000000004732851852820c22800c000d1162ace3edc0915293bfcc0548eb1c48428f3292c4711ec3a5994838acdbb665f9befba694f0cc92d354e2149a614c429a83288819024000734418c140c40a000e2e200207a4058370303d482d08a082082e6ec402a3cd8856181e1578319010241c2100848823704d619b46000e7e6fa1d6eea2569e621a51cf4d2dfdd14411eefce30d1f50eeae73dbf02cc859f3c583da591909d2a06005dd72588f45d6ff6be571a58a9759f203fd79b870b0a1580036083264216dde1c07d3061d7008b8657ea37c968f979f200130124a6a2a9a36b20ab610dbc8c0804599aae109a8d3a08044fd6e658ab3165eed3d79b6003cdc30d329c14d46e7d927c7ba011c9679d2b88f37b2ba04cd8a3e1136aa418bd26c71c134a91b25e7c63b1a7ebe75d18bcb2af182e804205efacbeb450c1ef278e37373cf38fd1d7b69ec8ff5493d91e9dd0410da8ea033f778d00bcadfdcf2005a038c7d84b8569f635407f13dbd0858826727b371faa9ff5ed778d37ac0484cfd78a09305a670d108393d242943aa464e44b4ce743848f803ca1ba9b16a58e1c399361a09d0f889f2696f1c8c2fd8c253a5b3a9fe9867599a208387bf79c2c7c57816d1145103bffe2041468189e0000014d723209420800212490f45c0c12455c4cb49140107e33ce9002ea89ec1120210004289b0fe25242c0093ba01628025f4a5c624017a2e5d3900080021c4c6a1b8053850045217670400a727463001f008000051100018e20004f84000e60e1858f7607d81722b9d5c6b51c2aeee241862160241147e4f1ba32c94396038eef1857c9b6b8f5fd4782209aab762169b489922684a0bd438a7f4cbc37332ac20e3d4303274fde7c0dee28555ccfbc994ffda491abf6ceb3dc91a42aff233a4b3ed91bd01fe67c0d925fa50760f4a503a6583c556af34a86067f3cf964d4b5ce21a1a28a4c099ae78e90db498396223c0761d6a8341f7fa434a1dfe96b14b2652fc9e94ed18c62b647aa75918987f1735c418472e2dbad02c158bb1d0f6b592e621fc6f800061f20c22a000ec320028844180740be2a05e0d02e86817014002b5068623ae79d00819836b540a1040000012c0408740f4de028116a0969e0806847c81862031d0d7d520ce543504296282200400002816c140b40a059010000ef90581980b06c15c140ac0281a3d16107b8b78e1026126a27cba1823700c242e3e62841ea301ecdf308041fadccc756d90004c0c66eda091c0495654f8bf2428025b254a17c405504006802b675ffd6f98302f02c5929dbe59c6e091b32e8b160f922cc05efd8fd2054da55d0c602860000007080b0015c2da3500c026d2af20e0100b3a32fb1d352ead5f56a4e304e028d2c0d46e0e342c8f6e664e9bcb1e5bf8911392870000011ee020800001fd5e3400000003840b00e2100c7442800000015720340413006309ab415c0ed7308a316851cb12c8000000c03030010987c62002c0000006a1e42400000005dc00400000034cc428e0850028e2d1c43a0a10d5ce2a0756d1a6ab04d2899de48d65c608180c154ae3d55081416a7325a6b8cd087093e99189b4b08334a14cfc2210001546cc348188b001e034aaa989b84120060068f3376991ad67818f2f92bc36c7cbf4e2c2a7c5178548ce0c5125d2320ae0b0c7f74e14fe62430cae1761284fa090401c9fbc564c1100036ac14e9448c0027118aaffbc6478900300385880000065595003430250e74fc3d0181f088f21e01d4cb0f55981fb8154a6044f43313cd9572c2308693408db08410271c19646f001040135106cf7a008004bcc98d4368a8c09003104000012a00040004c40019a5790927caf17349ddd46c09b6a288011c97ae7b0f0c0000042aa4181808eff7b0231c300471727fa4482000003267c04000d958597346f40015810000077c00a00180800253880057d905509d0e978d640d01258c0000007530050d0a60756968e48c0000007b0c0104207982498a0200010ae79d1681801c511ddf4100390e20580400001b720820a000ec8207a03f3bf3edbf5e171664bcefcfb7008c4a14914b1050c808b046048005430300200d91682e41a41dde40a3e34e35fd562c43fb662a51340a1904df8dc2bb88087c4782c9c2058208c059789582c08e4b67d108e8a118f3533cea98a29b97f73313d5c60b40b000043e4150660006a640484602223815b2b600cc64880000026e82049ecc001f094080000027607040cd402cac08202923b94000043b56071e02a001bfac8a32a7282500848b38502cdca57a40a1d21a8b5b5f65882437b5238e40388058fab3597c82860ca5b8a0c2b21040f180f602e505822bb5ebea52d430277915e1224da000aee5b4599048066f2090c00d164a6251a072d245c1416049ba40a1e46827c5cb10492d3bd740e206c8a586e914310b95976a43026f2607fffcb00b45dab8c280017a0dad1240250484e0280001f520008bc40018a8800d5c105329e180000024900e2682ee7d7b9203000000a8c038709542bf90c8096198f27bc0e173be1094981c056edd42510000001626293821380a20621a85ba4f7026f2052571f0ee424f981c47b6ce3ed8917562038a41b60e048aa71c2dab57b8410c6b314009393f4c49700004016d509743ffb917d0900e08)) <<< 16000) + 0x700a800021220a4120510182800e88aa5967b88491c9a84db05f1c7000000924091159daf962c204ac13c152d490cc7141775d203908e4d042050959daf6bfc000000b13298042601051a8bc775fed8fd4f957a495623c0676bd9cb0f880df15041efbe0000000000000000002389441239221021018a10c00803804010068000d6104f0902700ec9c3725ff4d528805c41d5a552080000006db02852cdd5f56e624579528d16872843c88901cdf2446c6ab9c3181832cdd5ed85600000084e4b700850028b2732a01de645928822fbab40931ca15d3e9e1eadbe245592a3036a284a105b7332a05f924499d146d0320060c79fe1bcc6071c00971eacd1801fa10085c0580001fc209a12b269f6f30877ca206c318e02ec820000001b6c0a14c76d73536091617bca1be9ca109d0127d9e4911b1aae70c6060cc76d71592000000084e4b701050028a35178eebfdb1fa9f2af492ac4780ced7b3961f101be2a083df7c0000000000000000004712c92882852452441831c01401c040080340006b88001dc90007ee20017aa4130440961a04a0d0030481242409012047010230080042d48229ac110d60865b814cbdcccd620080da21ee7fb780808347bcf5d6808017352f01edf0703b76e137b91050120e757028f82007f90e151ff0555500869f9f617584960087503124ab29c4d244a103a01601630c9c99195a4f2625ec202840000033a9767a09d80402251bdc28476b91ec3248157a511c1dc5603efa630002c028b9434ce49c882002efb696c50edee49a00002c0a009aa249d7852e00b00a483e6c87b59a41e47b4da8f5a06f4df2bc446065447184809450d8f2e590039698994957d455c890dfef1c3ab7f54b28c9d1d8600000000000000000023897474a0955d0cc63c37682a459659041058c40c580500380060300401b8480824e900c4048249a9f53504ff347471000e4521c8e6388c1c016aeb3e96ae7923803928eb3149c63001d59598ae8987c40000e6aa115b1f1c1000005b90d0fd5987a1202020dc15100801004000011100028d3034527d9860c6e5211c1d12e0c6877a08a23a037e896da1585c59065bd887ca2d9d25ab55a93488bdf25511ad58c018031f099778ac3611a81e225ce957a54da0836f73f13655aac43290245fe845dbf7ff8604969a8dc4502488e0605be1aa294ffbe5ae59ab7831532b59cfe6eb01e4b331e4e6bba1a8de6d1bca4908f71913e8ed76a12e998b4b40102f523d346521a32f27e9bedb7a2915d6db27b4e26d02b9c10c0adbdc09eb15ffdbc2f4b5a032eec1a6ee37ddc79aedd7ea55aae8d00e305e33dd5b8a9606d5dc21b7b05e2001b62f21ae7f0d7e8033849a2dbe58c258d4300840201e0100039f10410500061210401581f8ac0f84605c2303d01f1c8e038f530218301d2baa4688c08abb01808c324113573b05a54a0132d74bf19d1800559913914450088bc5f711c000a754594a1d85455c88242a02001e00fc5883c2ba0ca140e63b82020501b94ba5030d803f4c882403e4a617fc650822008515ad7549783c527fc8fb9121037c2a51050934c8b65a28302ab29c70402466441f04c104201000013320760b03a0581c80e42894c738f34148e969e108120dd5ff928077f23e4b19020800212113e9912e081723072ca0815e52652423081f008000053103809f9df9f6dfaf0b8b325e77e7db804699b509e159805946a2f1dd7fb63f53e55e925588f019daf672c3e2037c54107bef80000000000000000008ea68e0ef037605a1230e31211600c004486bd6862958d6f35457ad2ecfd001ad951f59bbafc4bb5595332b2255a447636e6eff2c87d57436dc0e9cddf590de54e8f86b3b56513b222e5f441185bb9ca68a1a2279d0370100024210361100032f9910366ad1861416bc3e5f08401b13ae6b9040853434d8c24082200858a717c5728381a4220a3e8a0d8d6849e8e0096a1c256280e8708041494208402000020c40d83406a1303409819848000948819028078140017527cefcfb6fd785c5992f3bf3edc02342100e129d7412505417d2fd58c15202aeae5842e3970fb541055090c60cc046000013daef92f5988e52dab84cc236f1caf8010504faa8f4f2ab834220ebdd78b5af792c3aefab6b042ba5c1482b48fbc72d8fdac8060d20bdb0843018cf66a708a04404486591414fd049fa910594708802003c0200012920624b0300580022f900123b20242301111c03d015889332be6ba56a880fdb27b0939e044fb267e54d2c550d0d85813475d0d95b7cd8216c4a205b4984a06c129be086af014cf1d410e6998511fab1f44ee10564447a55c93bdf922d24145cb72ff5855282c536dd179789c62c81991f9e5d24af49ca8d1adc1c1d41d4cba99963d2f296b6631488e374f63d50cc0f8b74dfbb35c5850bdfb9fcbba546cf009e93ee82f31362019925d40178480b81605a0a02c0501582c0a8040520202801eef4566535850c111565daf72e64081a0e0bd2fbb6f69910e380000000000000000044379b546f9e5e4fd5a667b23e28e63969be10a129aa985137980000000000000000108a4d6aace3940b33031c31c00c0080000102bc6023854c4baea80acd07c5ea2e7eb4394968b9d5e0e202621ea3907eea28c1fffa30625fedb90c801da8847ffe5160b7af5325fc2fdba0f334f680eca67a551e071b961d1c3faf0a8a7cd06c8e6f62ebc46da47ddb84ef8e18277b6d25ff5da490ff86497d46310c37fb8bbc33f02cbd8aa8374e9562f211def79abcdb3ce6cb42708489fac93bd1762)) <<< 16000) + 0x5bf0920e4a5ba61cd33db357bb3fcbc599d67ab274d81e499b54c5eb2824a40e86202fefaf61331f4893e887c4b372f776184d86fc400aa017ed319caa02b9020ddbbb6500dcc2a55c5cf860bc9d4ccb97948e72192e1794d56800a5b36c0b41857196f78f9a858b7ace16a2a93bbd25cc80ff45be3f5028dbe2f0104c7fa815b8547dc28b3c1a47840dd6f730095d72e55017558a066a47bd9f10ab10be5e98c280d445a34953e753bee97ad1e1d396339b85983b0b0d7b2c8d5faba96bb87c98010cb4d2057b37bef2b4cbed7558eafa3261dc940d636acc0f45677bf92ea306a1538c4751b7100801004597dd271489a026c1b348481078011864538c5f892000d70e8b0000a7bf7764c00800110000100400001110000e120002e4409c34000388603cf18a81ecd97f109bebc9bc5d5b59207937d9ef6e736949ea1f1084c1e2b370bc64f0ce7af14208204539f05006243d96d2f55c7fffb3c4e9724910c4bf3cbf2d5b7573ae46e2e3242cc70f9067c07882177fecb6afad51c1006c078df734c47030d4feb0bcefd71b59cba926b9eb8a3e34114bc2ddacb35a16cf5c4044342ef92032277d31a8c5405296878c2610a28231dfce05af6e797dd81e5e73537df221d1068b2f202606c4603aa34f05fc771a23692d7fadd79edf74c78aa7f57639398318cff65c7b7e401dd597b6bf745d3328a81e28ede4b608556d3c0000dd2409864002494409444048120230901104c08405c72b3d5cafed253664dc7a082b348cbc12c2d25850d36468c0c319777a88cbfef3408ec7401f91b932e6548b3b76fc0d28077b312c62d44fc41612e0d635f95ce26e71233ed5d61e87009d07f2036f39eb6f1b285ac64ecd55b5f4de880a54c2100086358651556b5913eef8d345c4e6ae791cf6d761bde58044096f4c96583d4fb8360bc921754801d55d2a7b34a6ef0a5408bb0f011e859b745d8fd88c3f37533ae502312985b12a26afc9f0433f6ffd930c8d467e8e0c6d6482300164613b9202c80a1b727fc6e7c336e0a415000000000000000000000000040d6ad8aa30a176023f00f5faae90c9692d11a0f87ca1e727d8d2a055d15191cc6c26efd23f1195071c708c049047044d6dd2dfaaa0ec03400c5b6d9ae846ac054c65f0e336d657a414aab347665a8dcf53f1214cd8f3b88bf60b840b5a2258442d7aac9441fd9a71b3c5e262d9b1b2da99c54f2870ec14d14381fba37ddc7a60ff7c94955136a0402a01f0d00f0680018008005b3100234320051944012ce0d03f256541f35abc197e609f20ca7ada6c6c2bbaedeef9348e4400000000000000000002388410808c00a00200828a11b7b4f5b1681d05966ee3d3f0be820e925d26bf10b1faf99490aee5ce5bb5ceb2fe482066865fa9327b4a6f92f14032ce1f88a06e2e58a4511ac56cd2467bf87c72e65f361c032a5179becbffa8833ad15be54c2b08da03a1201c0900d8480680403202000497200a4b640202d8ef61e28f997d1b0c59884008b8328ccf34e555e2fce360f22c00000000000000000000000000000000000000000000000000c6238a388208386306302202100a820982801006ef61e28f997d1b0c59884008b8328ccf34e555e2fce360f22c00000000000000000000000000000000000000000000000000c6240c40a408388384282180a8f498e7a1c31c7f10f41959966beb0ea6a89053e323fd37e025ccc63dcc66bfcb54427edb2d0d1db295a760111a89d34c014ac9eb5a638c38e7499777b0f147ccbe8d862cc420045c1946679a72aaf17e71b07916000000000000000000000000000000000000000000000000006312472072461c61862452052005470280200d9161dea403808102b0142d3080f9547bf3fc90606e2d412890021929b8bc1000000f0f880000001e5f59559c50900200002f64044040007a24060540001a0007e7202e5b0160180a80b395051ef9c99e07e83ec924fbf413e23608f481c8a99f330f42266ad81542100e129d7412505417d2fd58c1542041811411010c057dc24042d5ce22cb646f337184057424d3496280bdf09caed53e048794ad39f5caf24e605d45111137e21472cc95b0467fbf15481032235639d510241565e7bd8e219ddbb33c8c0a8b384bbf8a0839cd94fe880865f55677aa0ce3048010006010000c9101421809868048160220b01005d0df329b9623091f7f4d63fcb27ca88fa67e2b2d623fd44a9267370e010415d9d828152ed36680a9812cc4a6618b6aa234c281e27db3028008a7459e95e5bb74a1ca73d9204ee0b2fb0d34d7e35e1b5ddfa2a0845efcaa7fad5c0b6bd2a80c99e04b5964a28852dac81a41401343728ae388c30cccfb32327279091a2ef1d848f22cc8c7338ad1440b4e08735286937afa64e506df94be22840801f7800e8a08fca3df3554194608c02001e0200012d201c0300d01c8ec812b4170915c42d6af3861810814b6e2428b198a3324823f1e2252d51094708c0200182200b0900504800056480496e08dbb0463122049845bb75514400942ecdd2010ea1c2028100067d2d48815102524240080040a801c3400c1a000162200115c40037e0f1fa7193aea816e3799c8bf1e55e218212f2224a65ecd920100000000000000000000000000000000000000000000000000c422862842822021022001802a8a89583b174242efe9e417f44c3aab6ce670c0639447cad495ff690dfeb7e753493e0729ac33408f196a12f84cfc66be47c74cbcc589bdb34e69d065500501002008001004801868008340020200001000e7a1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 25 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase11" = "QuadFullEightCase11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 25 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase11 private def zz2290:"s08f2"="s08f2":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase12 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l17 l27 l29 l33 l35 l37 l51 l63 l66) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x809b2ab, -0x3121752, -0x2dc9e6d,0x12c], ![-0x3121752, -0x16c4dc0a,0x22be019,0x3d292f4], ![-0x2dc9e6d,0x22be019, -0x13f59f33,0x31219aa],l66] noncomputable def hinges:Hinges:=[(0x2cf3cd7,l17),(-0x1890c3f,l27),(0x1890c3f,l29),(0x1890c3f,l33),(-0x1890c3f,l35),(0x1890c3f,l37),(0x1890c3f,l51),(-0x1104e1a,l63)] def normalizationDenominator:ℤ:=0x165a0bc00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1890c3f,l27),(0x1890c3f,l29),(0x1890c3f,l33),(-0x1890c3f,l35),(0x1890c3f,l37),(0x1890c3f,l51),(0x2cf3cd7,l17),(-0x1104e1a,l63)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1284c12016801800000001e009200c000002c13809980600000000b0024803000000006c01240180006804100263014000000001c029005440a104400635006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := 0x5fe00000769a56ab2bc1511861851c41841c31010411c0c00008036069578085048a0790b77c614a07cfd192201e42ddf1c421b6da143087da12594800bbcb6ec0a0059886c710003a0804324800f80c00006a0cbaf68000011ffdbb954005446189146147103041047001030000200d81a055be80448a11059cd71851f65b8418e20e5bb6844610e3b5b78008358991c662002837c64d0a005580f05c40008b5cfd1f2400840700003764000ae4e42535dc20c0fefcc3a9381a000032258ceca8303e2d06082a0696262d300d497606a5d800155d0615ca61d02d06187084083042068b226b67377af1de6f7228e2db487b40b912a9889e9f1e220478214560ecb21496e6a21404b4843713b8508b127680018c1a10d2893bfc0c209d8ee04410412cdaad8060412cdaad80a09b42b43dc0c109d8aebc42819179c91c8400ec545626108eebfa18761018460480001c820160a00a0140da84a6bea11c275df498110c1166b1758745089d2a33c0c4004e94bc90e1c00ffd0a1358a009d2a71f5c981b2721f0aeacd87629f4e104a058e3e56b69b1bf74943d120581c9b9e3c0574c9a84096b70faa2b55ee79a07100001b11bcb6168240e10aaecb6f3268a93762000b6cfda6998805bd828000002b4f94568a6a0000000059d325525321c9eacd607f20010c2914413c2911492056fb4707f64093d0c9cf4840c00007b0c0c000000c4e00c000404c41c1000fe892b001003c6cbb3549a0008c0900003407880001a04f001437c53e9ada7881ce3126101b420ae5a20fba3030235d61cae051418ffa00a4e5880b6e879640b03006817d58648000fcf5dbac00853848014822286c5c04d07ea7cca095620706c7300265ec5f97fa104e066e943e9dce20900282d7223f3df296e45086202f56486db188f5dc3ca1820174e29b83f41294202000000925a9dcf1fa401b51c4b605e81c01202f000053240013008004aa9c2515978d8c180004b00a1329088e0a0d44b17b0e000000c80c030ac42684000000644e00380100090100400801c040002ee401837559d494286005ecf02b771fdfe47ad5554f210fd35abc0a703c000000000000000000000000000000000000009641824003802801011d31d61954c872626a67efb25ad363fc89112d8c3f8d4125868933d0ce2501712694a37d081475dc63068da5b3675f22518964fcb3db2397a4ec4ac9b98ce3f4fede015ae1b0d7ffc5dd72b23f91bcc349eb7967da61f355037e54044ce14a65412866395f6c8df426910452b9858b1833911e30c169faa2c5053ab814281f3e985100f3d573800c804366aaf0f8da8166ec88dd90f5d3dceab360a11630c30c210110096008002060000401a00022a600002008c20645af0809588c0208350dfaa100127f9104008beb62a00320080000d8200022a6054a82f8413466501410bff987007acdd0a040b00200002b0800225996faeb47c8598a84b9685336aa683d919f603170000000000000003600001d8a428044d55319e3e84d5a2151fc3fed6000000000000000d5db3000531030c1180140040a118b56ec00279f06e58337120cf9f0a969260d659d1404d8de35c2d8923edb3f514bab1bf3f6fcd39d6a4fa7d85d93e8743900a21aa5f50003d82001a6040068c4f16f75346386ec3ea2181a7d0c9080922afa42043ec4f8200133eb70c091136813820c8043a311237690000027af81398c060163a92991d1fbf69a629c8a97b77f73efc4396f8000000000000000000000000000000000000004c31c71c51831821811012c080200d00021e200a028200c9ca860cc0fd12384a9db1d14201e1d70e097e9f385065b09722805a2bd39c006402123caeabd848a0319630c152a684a2829ce75b8601d356981000ce82602003769253800d00400004ace0db5228070addaa04508687ba0500d5c2ca4001800849346ec08828800b0aa2384021e8fa3046116bb6180206478c1000009a973000e00400004448000ee18122c8821434ce51644f3f986ad4ec48c724521106c0104db51e55cff9556e705e757681f78ec7e639888158180d5708c3a702ef0016f7d9bd2b840161009f9f02380a04eb6b96022bd26a74e0e651dd62ccc2f63f2455130401cf22bd6887fc25bb0e9a9b52ddc8e3e04929741a4294d95261c79880239f26be950486e5bac5ac2787b325b3bd96a69eb157174fa38e575e9ef734504a523870a7fddd22162a59f62a108c03b727046738c04545381626afca74263d75cef4d08c4f0c96bc85a19e583fa268464f1797bf282bbaf25b9e18a8d2234a0642100b249d71c8f638749b3a8c560620681c857eedf5fc61ed93fc4f7a48c6f279922e2e141565508ac7bb2b319983f7c7cb15cf9ac1da40042dda2c63515c387a501055453000021010009042001afe68b550a6c98d0ba0a1869f13c35d2ac2826183644e1e55080800005f5e1000200150dd2cb3e208600000017d784001000534c1ca2a647a1201c00c8151430001500181000012c14182045ec101000012c00000003fba800e002000039c80202800c040040200032620020200001000a3c1 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 9 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase12" = "QuadFullEightCase12" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 9 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase12 private def zz2291:"s08f3"="s08f3":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase13 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullEightCase13 private def zz2292:"s08f4"="s08f4":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l16 l22 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l5 l51 l54 l56 l58 l61 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x492929074, -0x289368078, -0x3cdd1c38a,0x16c802e8], ![-0x289368078, -0x11c164d460,0x2aedd2a98,0x258511416], ![-0x3cdd1c38a,0x2aedd2a98, -0x107be26242,0x2893689d8], ![0x16c802e8,0x258511416,0x2893689d8, -0x1449b4294]] noncomputable def hinges:Hinges:=[(-0x565cf224,l5),(-0xf4475256,l4),(0x3fb6e30c,l9),(0xe2f79fd,l8),(0x21da574,l10),(0x1119d13b8,l14),(0x1edcc986,l16),(0x24a8cb24a,l15),(0x266f7e0a,l23),(0xab3d9ec3,l22),(-0x1449b4294,l27),(0x1449b4294,l29),(-0x1119d13b8,l25),(0x7596cad8,l30),(0x1449b4294,l33),(-0x21da574,l38),(-0x1449b4294,l35),(-0xe2f79fd,l36),(0x1449b4294,l37),(0xf4475256,l34),(-0x7596cad8,l43),(-0xab3d9ec3,l42),(-0x24a8cb24a,l41),(0x3224b63e,l45),(0x1449b4294,l51),(0x565cf224,l54),(-0x1edcc986,l56),(-0x3224b63e,l58),(-0x3fb6e30c,l61),(-0x266f7e0a,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1449b4294,l27),(0x1449b4294,l29),(0x1449b4294,l33),(-0x1449b4294,l35),(0x1449b4294,l37),(0x1449b4294,l51),(0x1119d13b8,l14),(-0x1119d13b8,l25),(0x24a8cb24a,l15),(-0x24a8cb24a,l41),(0x7596cad8,l30),(-0x7596cad8,l43),(0x3fb6e30c,l9),(-0x3fb6e30c,l61),(0xab3d9ec3,l22),(-0xab3d9ec3,l42),(-0xf4475256,l4),(0xf4475256,l34),(0x266f7e0a,l23),(-0x266f7e0a,l63),(-0x565cf224,l5),(0x565cf224,l54),(0x3224b63e,l45),(-0x3224b63e,l58),(0x1edcc986,l16),(-0x1edcc986,l56),(0xe2f79fd,l8),(-0xe2f79fd,l36),(0x21da574,l10),(-0x21da574,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0xe41502403fa0080000000000680720080000001047206c60180000000c844088c03000003846080c9180a0000007218803930100000000541204c601800001c23040348c0500000000002a0310040000000000840b20080000000011160660080000000110d028c0200000000220c0718040000000000440e200800000008432044601800000000000c0c8010000aa20870063200800000508810192301400000a710e01a46028000001484200e4c04000003142200b9980a00234328500192401400000cc08403e6602800001422040348c050000001e120c05200400000ac421901e400c00000000000e0640080000000b834098c0300000000160a0518040000002b05c086301000000000000a06400800000094110218c04000000015048111806000000000024092008000000005028166010000000000310388020000000000440290040000000000110320040000000068481c601000000000d0b038c0200000000003a0590040000000003f00b200c000000000780164018000010a11005ccc05000002302100f9980a00000000007407200800000000d84812601000000001a0d018c02000000000026029004002882b822006d40140002684209006480200000000130b018c02028814208800c6a00c000000004c240630080002a04e0a00da80200000000130a014c020000ac1202c04ea0080001482a04803d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x42049004000000004c180e30080000000108881a601000000000120c0cc01712308041813b8a00e0001443106808c40100004b0ac2081348020000000000e0c0cc010000000000068190020000000034180e30080000000000c81240100000000000903880200000000120c03180400000003211032300c0001884809819880200007c0f02101e10040000781083404e20080001d03408407840100001e0420a007880200000000000901880200000001105006180600000e8520f012400c000000c22200b2602000000184410230c04000003044680e9180a000000a834180e400800000000c82814601000000001a11018c0200000000320a0398040000000b251036300c00000000151606600800000002917014c02000000003e160518040000000000130320040000000130a81c60100000000002502480200000000002a0710040000000094540d3008000000e2288118602000001c22b40748c05001821881b810c200a00000608a101923014000540d02980f48020000a619851026900400000000220c0318040000000000340e2008000000a21100f0602000000014848070c030000000003c28198020000000024180530080000000170381660103092c810301b8d006000000007424039805818512202015ce401c000000000b0e066008015524c11c09e50050000000005c481980200030423060033401000000000d0b81c6010000000289240d8c0300000000000a04900400000000883c0b3008000000001d2a06600800005b0e024035003,0x310d00e180600000012289036300c0000020261811260200000000000d024802000000071298129806000000e128c09a301000002c86c2403a80180000000411f01cc0200000000000a8190020000000000a40920080000000000e81c401000000000031024802000000001e0a02980400524710c201fb401400a90e118205768028000000208480b0c0300000002644381a0020000128861a02a400c0000013118701c80100000025220e02500200000000461c0718040000000000840e2008000000c20900f060200000025230e0350020000000310500e180600000000088703300400708a10c404b680282c31c31820188d006001c829034009da00a00000c4420901d400c0000000f014016601800066104110229004001c228431009da00a0000008104406930100000000000b00e40100000021c1700e4c040000004202801c980800000728840173301400000ec10403e66028000002041100e4c040000000000220310040000000000c805200800000000003206400801221c618c0b310050484198086050aa00c000248710c40a4401000818e212e04b4802c091c4020c09dc50070000000000520590040c0c80c70806234018000000000ae01640180000000015002c803001ca2881100b9a00a0000000881200b300c00760a104203e680280000000002901c8020000a42186403d2008003182302b00f240140000000000280c40102431431020188d0060000000002c1819802000000884c1806400800002108c14054801800000002211038c02,0x3a360c05200400000004211014300c0000000000120640080000001a8bc098c0300000000322e0518040000006716c086301000000000001606400800000184550218c0400000003116811180600000000005409200800000000c8b0166010000002488200e4c04000000728280349808000009090100d2301400000102298134602001431841240b3100500000000004203100400000000882c0630080000218501201a8018000c20881a01fd004000000006c16059804000000a22480393010000014124201a4602800000001a13038c020000000004c58198020000006424140940080005a1264180f6802000000000121c0cc01000000005c24039805a18504209015ce401c00000001305816601000000000905024c020000005890604d18080059091903025640140000000108e814601000000001d07028c020000000290c80a1806000000b120c0893010000000000d0e0660080000000190f014c02000000000024039004000000004c1c0a300800000000002e0640080000000001903880200000000005a049004000009090101923014000308820d0118802000000001d05028c020000082220b8092006004a4610a201fb401400990c114205768028000000108640c8c030000a61a04803d20080001443308c09a401000000000c8500c6010000001441201e0c040000000290500e180600508910c901fb401400001412420324602801412423480aed00500000002109016180600000000841c0a3008000000c21900f0602000004110834029003,0x17c02c8030000000002e0059006004086284201734014009284704a04b68028010119810407cd00500000000005a039004000184510a808c40100000000001480c401024320218300fad00604864043060395a00c000000d108406930100000000000c80c401000c210a18805c10050000000000078190020000000000780520081018e10a180e56803000000010864050c030000c21882605da008060843430808d040180000000088780a60100000000000f0148020000002702200b18080000094260900b400c0000000003c01240180000000002e01480200000000000e81900200000006229022300c0003b04a0e81988020000000d02500e4c04000000000d0009900800000000006c0520080000000a84a016601800000001b13018c0200000002c138099806000000006c440630080000000b042026601800000001b12014c0200000000002c029004000000005848073008000000000580124018000000000d80248030000003504200b180800000006c0900c300c0000000dc22016601800000019024030c030000000032120398040000000680900a300c0000000d02201c601800001ce31c0348c05000001942200b9980a004147685001924014000006c08403e6602800091214380319004], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x1650129deb246131346aeef164800034f32602285b98f602091a61211c4800683a4529302110043099d1341914c458c36d9f47e58cc128f56d120421618b1fa96b4802420b0f19ee3302021248a4199041067092253cf11c00a8adf685003006c24847f04c1002609697f100fa1408560580002522268131330989904c4c4262600b12f05e9522e7436e98510fa5f82820402c2b0db140819d35ab868135c6d3b582b28a1100438b3d94fd978696215d2e6c8e1801862957161005e36dd408112ad44e8608368954a21816610230084c3369fea3b751551dba8a9866d3f83a281671669670c6823826005800800b9100100680008c10002763a5322c160860c29fc56783e668a024f8275030445644434b94184f455584860867807b32878225c8c27c0341558a3352306088852e28c0503f8ace1cdc0af285094051c5a6c9aa10669641cd541a9620247ae5d470428e7695408107ebcb6e8683284aaa6) <<< 16000) + 0xa9c01227580240b3881100434c040c8fe3f502cef703849438b1e843ad670d2c018aa0442348069b8bd830e18b6cf020b64020442503e18d07a063f25be300030cddefdc800ae375419c0192840980600004424000e9c8002ed112d0d0004d6112e1589588ec875381e0572c8a17f664befb88d2c3d1245ac6ebf0a086f3c823dd752c170e7ce4bbf8430152218e2a76f000355d14d91c4014000000b71b00927103921701e3095ca5f792d459282849e79d4b1981ac816381820e4364d55a3022fed2a7560282375f1566bc4038bbeee2e9024e594e28f200000075304e471c2701c6952cedb2d71820b6412a08786000004b01a1a52c4f09c60600000432180cc4f7728210320a352759a03b4f8ee6809912541b9048182200c720476d5bde02e619b4ff51dba8aa8edd454c3369fc1d230b34a30a3073012c0280403b7a5155b4370d1ba069e6d5fb6b768c9f9c68a224ca5c8c7186d13e8000fa10003cf225a1a0005e622580a00081a20d81391ec4bf5c09c9f201bba166af9ad0e48c873c422f521c60b6b6840eba2141028849632cdea77ff482a9c9388b9a64930f689463b8c798d522c2fc0813259575e4c57ef8ff7e269de539b72806b4514fb0cadb924cd29f7b838077aa1e042d7666a27342bd42d36c311e649cb8d71d6a41a6ae338a2001ec680f5cde1b3ae57e76953b6ffacc4731b2f0961752c9472c40b2b0101a484abec308f8e6e575281dcbff7c27c2911783249496763c52ee824cfe3f8a9e70ba9f8d005fa7c17a48443c6780ca924dede10937cc002561b0d705f1719d6d000000002dbdfbebe8b0ca4860844b20a20a14308b04300000102f83533badbb9f83e6d7af4f8590842a3915d263961a64b943309378b8ceb68000000016defdf5f45865243042261661468a2886863042800866bcb526a51f2fa280821ac66710731597a34fa9171c5d10ae9407b035434f1c000004b018380000086434538c9543706866b3dc12bcf0421b90a489808f622dec83000005e71040019c8696928101a4708c0200003ac78b8ceb68000000016defdf5f45865243042261468a288686482480280085d611b1113c86031d4a49c5ecdd5baefe66e2d35dc71c6010ef8e595a19757798c1c0000051f0901a2918dab23aa9814423def54a6e58686287ac672bc6c40c119c2c042ee82095d65250d252000facef6be3c2c080ce210385e07000021320007ca44a844000f72400267489486800414889208e85e18d6eca4301c56cac38d465c1c32ed0dad917e180c1ebd81447014030eba723dd40c01c229ac11fa003424b9d4df0941580f9d1fe8201ed046656040534cea5e8a0a490c785806800024a20bc6b05c21f14000004320a09679688540804d75debd0040477dcd4fc0106bb2cdc660803f623d63c01000fc7215ae40862c2401009202f8b8ceb68000000016defdf5f458652430430a9dff03e5cfbce08d90a5d75b7da94d0b498138312f95841000000000000000002110e28e19411008808a006000029e751b82eff58a3b8e2c9fb8e6c18a56dd7999f3bd7194c0bd10a35781251be0ca05acc87101e0890dad29c72bcea342cd6f21462101dcc390c5a0007b240c8642501a1270909102849814000bdc7d88b7b22a97b3c4166be0c97f75d2dc308231ec45bd90bddd13ef35f064bfc65f5f3c085c811db56f780b9866d3fd476ea2aa3b751530cda7f075091881860c30460010f2753b987774ab95fdae6a145ae89907b5bb5a2be78f77515901446dd8708b2889dda07bf958c17c02703de7b6f764aa498e56512511c0da7e7c65e1fe7eec699388768677eead72ed581325d4f7060eabda84372da4d07010c29f8d8cb21a4a493e3036ab8630608fd67818f2bb74640e2e90bc642d8b1e575b7763b7b67a140059618b0d945b801d19254d08dfac61dc70a42f19e6a84040ba52b9913542668ffd0a2a8dce9585a7c5f7b42cd8a20272d3e678d2e4b68a737be7c10ce143111ee21137242490a8d7de49d1004ebf08ab8a66c71826dff11052eb010d980a10c077e07ca0e32f36a62d23a20c392e93224428b72600002fe10212d89206e857eac0c1ed8102aab3b2ef2b071637f57cc180386351f240132142532ad1e0ce0c0523521066003008f2d42bdac80a7a5def80f2813a84e62270806d2222b742fc39a1481200008c082f16c170670edbbb43b6eebe22a03bc454080d5622c0efd4b209234a41702b0a9dff03e5cfbce08d90a5d75b7da94d0b498138312f95841000000000000000002119428e28a108084000059545cd240a3c4afb13cb2d96f535a8d0745d11686b0257ccd7d140ee673ca4a9964f6950540338786f7589a7e224c07a39fb07505b6ec48416fc099f002d70c093b8162b94a55e2be4ef1359ae7466dd9f1c0763425cbc2f3c7c79904530fd386c3b6eed0edbbaf88a80ef115020350a9dff03e5cfbce08d90a5d75b7da94d0b498138312f95841000000000000000002111429028e28e18808c00a000038dce77b7adcf5cfdc35d838e470d66a69102ca459b2b1c916c95d812434874a343eac9e7b9562544f3760674ea1e6ee3ba712e730d52ea8001d210321909184848814001268409464178120015fe210a238187b393a07c7e628709f22f4606aa13f02052a3e264bfeb67e0814dce04cc22eac0200a80e6c2f54fc1222a8006f1c8d6106babcd9d23f1765464a93fb2785e4138e141e132844543906400012c9c0a6a8a546fa810104e8cebc2801823895abd68d060049469ce9000a05e6ea5945b610054e082fab7800)) <<< 16000) + 0x0fe9d57304a50109206d74c8fc542179d788a0501859960ac0a000043e448564240aa11f0988f02847405034f386441c68384a4919d701c0c1435c0c897b428441e505ee261000df2d629128380a277a4d2b00a00a16e6ba4f820a289d3c4290d950155bb9bfa7d71b9e1501038c5ab8049a2616501338c57cfcc208f92c5f31859026bb0d8c09387000000522612102d3bd160e01053b63aa83b0601843f5e8cd01c0000000023a6c9002901c7160000032b8b2e0225ada6184c96de9d472c9086597f94611cf4767ad8b2022c1e4ab9000000036bd9c008c0200002d478c454ea5d04d2610363d8e586e4b203ee6c5b14c9c38000001ece4242040a5992726302026718af9f81051e635fbe4d180484331936001c000000001ab9449002b02461329510515cb24289d6c0618472eb83cb12c806eeb47d0702000003784b04d6e6d601900000003b8d9c008c0200002d44000e7084684c230162060b1010184400f8c4dd3a690d1d0d2000000021d0e30824c5c8fd5c14b2022aa4f5415b387000000445f98608039aa5076f408218756f2ef6e090412726a30ed5300a0f3899c67bad92400b80c165a3c5f94b23098f5962086592224148eccc23ac6e56311c1000000fde201000a99cfc4000000107ba700230080000b5111c0586a80c064060300389e674628b6533cb0f5cd51d881c58a26516d63d128000000ea1a59200000004d3384659970aee712206c436650011044350a8c54a781164e2262db9d20052038f32633eccbe1e5e75a74b9838b1670528587096201810e89100b08a4b598086d057c362c00000098e73801180400005a888d82e070139b7565551c5b4b68c4d7139c54693fe421739a501cd52efeda1440000000140a0820a551fe56da2008000005b2a210001338cbd1b008003d006912bf0511210580500002263e68064435ad01a52efb0a23d49c480000054601a4bf4f25f61f984819a1034501810bdf1079f20e101e96a18c0041436fd269ee0e0005c96268c0124861400c00007fcf1816e517d74261305f8bfe40e690000001fa406117b38dd0148590099c6139e03022cad8282962024093ef5002300067d702d0c08032bea163f001b4881400c000080480050a908f09000729911a1187f02e10e009ea3b75148b87a4d0744b24918a14914814808804200014130500200d0000fa3087004f51dba8a45c3d2683a248840838850628638250020ea8a4c53a2a01c2e58609e70212a45dc4d0a81fd23962d07d400061c83604c1ac07c4441fd84b48dee0a5b92c2d5480c0034d5a8a6fe949cca251d01c39e751f3944f82fba2a6068f450406866030be04846e314624404105211d96de7e539117bad8a84000697fbd7f40cd0f144612a4005100cd44d5a4f04392ba0fb9662024dab6ea9e0e8d058e1783c00006a0400723088c96e88cc4f114c504143800000927c0091b1c030eaa27c48b729d7e007622848bedf7e36131223332b7c6d12ca097777669795a402058fd4b5a403e8402168162c9acf82e8b8510605bd4398918d46a3ab7142f79efcb11244c6f8e297c18049a59cda810047f5b18c93821180400005b0c8e360bcc76810a296cbbc09ef448948a4ea5964121896f87ea836407359cfb0c888e126881dc4c6230008e62122a00200abb828fbc0191010540400001db3087004f51dba8a45c3d2683a259051041050a48a50848830580001006d92af743cd5aaca328897e70104710cb942b786d3d8e7b74891572da902ba951a5087940657c39013244645b81ed8ad2a0c1055912e2224df81003995d6559666996a96000d4130000474647a0d3b4cde11455d69fbecce244e619c9cbf9204fb8c2d93352435ded9a3bd52038a8de06ce81c2701fd33db014108086ba36d18008cf591fb831c821400e00007f081284c00159c81808a10e009ea3b75148b87a4d0744a20a1c91891081080c508200c020080368846de9fdbe3447c24781e0d8851d9d782460990ab9d09c9292445d0116c11243532042d4317145204782033d545d9f630ef01420dbf2194e8548404008cc39a268c1703e20f9008700a8000256303722f7a2b5240bacfe00e550821863e9a51c387c5a2710409017ca77744fe3842ab7086100a0038f40744014708260140000c311180988b80800149088b088454442281211309089048444242201210f09087048434042180200112e210a7b10b3988516c424a62104b107218830ec1b06620a2b854eff81f2e7de7046c852ebadbed4a685a4c09c1897cac2080000000000000000108481051040c80070050020110014110150b7b48bda7df65845c4168759e2e96cfea895700a023badd22f17525dfdb1d0524e8f2b835cbaa504c72d5d90cf8f57815474fefc2398f5f9f7e0bb25210b6cb90fa2fe638000d047de90010002200002008000022365d7e1e0da820a5560a499c00069edcb4c00800110000100400001110000e122081303a0988182c408162020303801e820773b93281a59d1b68a0866495bd48c3074020032031000180c00e8a3fbc876c60524f58c4c708286cfc800c6203e010f33b0a8e99c792567fb75aa316ec25b02aec65edaa83caf5060ec0d2879df270ce079d70c4ebab6cdaea3f5c5b5e5336552799e09100a293ab914eee30c01c21c1119f0c178d1d31e9a8a5b803e51a9180f02ca7051d932f5fbbdcf993670aa6615be024e7c33a69a39d96c0098eb442238dd8a49ac3703a46ec97fb82cc7cc49fcca3183bfe260d7566c311a1b728d38cb080eb9b66f877b14993102086615e00014)) <<< 16000) + 0x08f167f5d3078924a4c936c1018d88888528103210734202ef0660f4e02078fe3782330a0f80400004b4800387903b0900041010ff1187f02f0c6288b63c20228f6586b100b9fa895543042cf20ece581ae9825300803791e5a1000a2931610804000051087e9683f0861f62b0fa1187c86c3e0261ee0b0f60587a80e88d1d74f88c0b0c962248a1790320fd0c153dcd1d80835f4ddf69025101f00848c1c649354608d6f3954a60503295c9648469eaa84c201540d3c140128810004000041487a08c3cc261e403c2bd1cfda268705c1d799418713188e307b81ff9ca140c1e00450e28160ed068a9823c51468687360fcc5067e8ec3c0281510d075204a184001000010321e21b0f005e0f74c5eadd6758f082e9ba161336b05d73dd6e2cd055617f0f44c1575aec795abdbc1e7fd2726a890506ecfdefa075d65a6c98cda923ddbe180bc7c2a460031af6f86942b4572a9a252b134b6f32ff013ed0461644d952dabefadafb2117a40b74913c0fb4a3f279cfd60adb88dc59ed4733e5726410981e801f06faf24fd3d2d4c2e606974bad32e513034dac0034f0575e4afd8f285750721ec45bd91c80c183eb35f064bfe626dbe3811b22c66ce8c5816a91c0c04a1e05a1439a19419a08a0005222b6b1ee83df5a4eca2a76706917283165a1ea72d5bf9b5db055e619091d1051c266c8972863a1650165df2e58038d5e794feda46ba6bdc5e9453d0d7a00084a400207486904800298887782c1b0161dc03c0c7705076460c24b6601c30ef2af1e10f09bb999375024102000858609a7000e785ae5309529004eff514e3802b94275a81208100040000364d089c6798f81045ab4985e38145379e1312082c00bcdc50216d5871a812881080403b40600023c43b037801b04c735df41c119346eea50b85504ff8f24035c17035507c5785ff6e803cdb1154c8e06bc6b31890b0461812d72d6946e88e8b25c12062dcd77d6cfb3d0f9237f930f9a19c80076e515becd60b9b2630222d71dadd2706fad61c90675fc7745de23e30f1c160687c200aaae525155ab08f3c4a4788f55ee2867be641c74b2d716e6dd933db452c98738a2f53b71a652947963886d717666144948a42576996b011526cb12c06c0beefb8c3440f31a2d2e371d0442070011a2a74044d240ad54e2dfa2052554cdc6009f38138048103c0100000cd200026870369ee0a8d202464afe928017a95dc8701cf80fd3009040780200001a268201a520f48a11f5529a7ca00110f624e2810f2e0c22009040840201d6030000f221ba320008d921d43b0e909d0d40a2e82d216f83ec71aa01c99117340026744df12000f804242a677b2d39a2834ffeb69c0803a7682860d54150eb4800400100000d23436fb2730d281740f4994800ff3e88523001f00848583fcb71b281009157938800800200000f440004dc87404a01db98ec6ea600bfca8f41000f568705a11861000400002b086f86c0781700c6eb18f1a30642f46620401dffa28008c0007d6d5200241021008403dd28aac440192d004b92005e16cc95008c408002000015c439c5400037870c685ebab072dc171ba03722fc0a5f42a0594d139e68c2bf5e81c7f04ddea729ab6b4ee2c8784c8587af33c936a5d8ff66270c0288276851243e5fbae76cd21d2dd383f7d8adf5948623d181c89505c1752c8b8276db8de478a07ad23f5cd464a0398d55662dbf2089ace40913f7192f003ffad606e8e92edd7e1c509524c0891a1a213e9c945c70ca1bb219bf29bc7fca3dd80d8a87653d0b1bbe55e18f5c1000d72f584355e4319176c6818a10a8ebe01b0d51b38c34850201cc03c29c24726f8f09c9d901a4582029b861c2810f3b3fe69208f7894ae0f02c86a15fe5004f00bdb8009c40840200002c64394541bc2200078a30080100407204a80e2b88e50882430ce5998088e12ef2680a68d81792020f004205022657ba00a0515a911000f004038c0400011243881400030a74606e3f7a8701c36c1dc4900ded268a91820f8040384141c00a01e05000071908315f0c2fac952e3062a5b8ab40820cdde0781808886a308860583969386083b5315368080225826f70138610804037c378230a5f5e0301238377661818ac8d02c1c0ed929483009040800200001b04378440004fc437474000b304314440026ac6c3a53664ea2c22dcbad7c1c027551363080148c851f4010090a0800201ae0a0000fa200417e4084d61b8430db11d08d250562334107afcdff920a5881e3f840443cdf8dc1038313dcc92801bf53e8e0e018362f0c0000427282100868f526fad1880993c1915a788ffc302786092718271c4880b3256aa683b471e2ae00130c100043af24fd3d2d4c2e606974bad32e513034dac0034f0575e4afd8f285750726d0c16b768c0598c6738d190816a91c0c04a1e05a1a61a39820a2120011c620c98188e58b5dc734d211fb8fd420f9d08bf76f80f9241abb330d3947a94a88cb15497406a3f3a1a3f2aff2a8c6114d4000d90f921dbcebcb24683da9ae38e31bb1fd2823002100806d00fc95443cb7a1c313b75a15c71abccde9ec382b872a4ff3804d4410621400271345d070050969a164e084201000015e20860381465a44b4e50f6261333840fb53a0d6a6845d2ce15e3824ac738a8ca084001081517596bae78f5650f976382ad623ea47807e94f7225801310edfa4003894657e4c084001000012c3e4c8ce46629c3153a735e1232d491545181814cb24d8401204ed710201a07585d04c104001000012d200071e747204a83edb4ef3689f0)) <<< 16000) + 0x2f6e761a32f2b68e236c4c0e24df6d7ab3a3d03b2b01d98a5a73e12e2ce537c97c5105b7f76a233f1ba567cfe3ff3db555966b22a3d1c8008eea02b13de08f006c469be5cd0f78bd252994cd240153d76bc8b0ba5f0ed706272f1ea4ff06e7b0f5680e5adaac341ee125846b4028e5ee754bfa613a7e220ff0453d659f28d3178ac6c4b6b1a6b6510a120800025590d90d06c068002b94f1719d6d000000002dbdfbebe8b0ca486084de72f165440a22c53832c31420c2200000040fb95d8f147d72edb9db9d9d162f9d9d2a81012522ad09f07a38e388a5435c0400043c4358840024044178740642a05c150290a8330240027ec4354c61a84b0d321c06459298a9204d1fa804380166bb3800118a0f004203859e4e39017813d2b8022101d0080690480002408670ac344460ac1b0cd09f0379e723c008011281d00400002e10212d86816e8448add3231c225970200082109259d4101d1944ee7090208002019e130ce0582b00c3340742624d3f420c116f526379a0c622dae88c09adb4d2c8809289a0bf8e00b334a6b8405995252a0004e304001000016120bc2a03311019068170240a40a0cc0500019190cb350651882d4341921b0c80d063828001814802451906c1183580f0c7ddfe310e1dd51a001f19ab5978be48fd54451846083611c11eacb65f5c4a98c8d1708668949f202500602638fb8e258c2e7ce6d032624179847b8f35831a000170a229a19cac36b1653a2b112d3f7bcf140861d04c55d16a211f3c63c55e424265a3c46edd3ba1f240343ba6039e36a4ab5129d0b0b2098996268303110011de607eea8bdf2fe94c997582b719491501a75088615b29cc8e6c94c2a463d4859c7ce102f2f36a10b31862215ba88b9989443ec118a6cc142f3595ebdfc1d32ecf860299421ef7e7b9e85c73589f1f8580e9d85aa95736095f4dba90b62ab956c65d5a53d3384f8b9bed161800743e2152e3558535aa557fbaca0470381f381ad371d922f944009fb4dee15dadaef59ce1843d9035efe3da95e6ebfe5e9a9491e46c66a1ba4e1d1f73a16c11b578f3659c08606a50b2581b6576d48301c3f5e02d7f80ae8c645bab2de6ea7f8eadb6b91b8db40a79b97fbd090c3ceb8abd7fc740bdb23c8ae3fb6d01588d12ea272bf45fe03120408b902bfff2ccb27eb2001e9fa2687b7f610c3e6cc065806350b7470c1dd13bc6d6d5d874a8d9519d5220570e9f3763354fbc1c88497d01cc12f5348381ed584d74e5a15c20d890559887a912686498904b1155f1467c39d4e19a464a7eec4bf82e657e1c0d6ad71ed364c2c6d9f013b6e73c673de446fb69d2aa564bf9006683f0b1a395e71a6b1a100e56394fa96983f20c3159031ec2eb190d230c38ba10f64031431e9bc932861954723a2048012e9fde8200191f36ffa00128e10804200f347dbb3358c66a0adb869c99729d3f513ccb7248a3a2af6d54135f3bac41d7083b57960ee698ae399a37352ebbbea1e11df8100b3fa511716438ae5c81ee1d9d12b88d15eac2b441be1eb3b6181b7d7bdc9cf3e60c175794fb95ad3b201b968b052e2ed39614a9cecec5bcaa14d649fd1c1a3692725d96e825d4ed7692b2fc4433c1decf393fb343b41e59f49c0e27aaf5f1d6c51c210d985e8401004011000010040000080000dc859848000224863048314141880a0005be2000dd2408496186430c21581906c14c361821b0c00585f82ec008ee9a8b714eda1fba8e9688d8092f4ffd8e367ddaa14bfee4004290dc24a5f722bf88d993f3cb27a59dc254df183970b3f5c6011c43f59e5b7706936ed0fcd1a68230ab1ff9184d00e1f02b000d9a670d431ceae7340402d8551905aff64914fcfbcdecfc48189e3f07d1c21f2346dfca8dc627d7fabdbe0a1c99c01b8795c42cf86e40904e0a405b93b138c0025bf113269bbb897ebc903e1f44e7e537c004994478ca0a2105f1cd459c2dd7e7815403a1027d88a5f8c8626ab3bc1da5807753d31a45588cd30ca31d4898b4613c6ae35386985d65ce87d7fa52b98cc663a4c374000000000000000008457992d9288a0592069a4a221821e01602a004f930e07055393fb63581db9b7c089d623535061dd7c0a3c42f85fd5609a48f70bc3df7440e334d411ff3fd6cc0b9646e6c0ccbb263921348038e9cd1a58a2b08db6484e103a8acbc1044a681914b736cdf768520bf51e575da8d45b4e152847a620b4b050c2d265b3ad7579586f8285ac559052be69c0cb3b9de2db217757b6904a44c22ae20484682979c54d3cd1270f5decd66c4511a32dd308747005535b3dc218e3300cf79b2428095cec2a914a8ac33f9e3034850778cc9eec760d0c8ad0a045a90dcc1395cc366862000133a26c9eb7b3b9183a3e094ee21b18bbae2900d0b6fa88926c9938ccc52a358a1ea960f85584e029366e549ae88381e582a7ee636d4f74a197a2d467b60e109424ea1008010044d34c3e83881c71d50fda50a0e12d8744a900264e480e2404210084d3899671ac71cb8218c19108755cd87b3041f004000052100019721761b0ba09e9bc1106145100ca871b00120c1f00440000401017c03e3a4c756d20f00a2abe9ec8810800200000f642f4140001c442f00400031c410c1724aa66d026923811d87fb4d365899a09030a0001f2bd9010800212488e260a90d360cf3a284e280a30e900e00475e5944a0210002000034cc0200401000004442ec241740a0b90505c00800094cf9e3e7ade938d14d75794372035a85c251c88d1f5eeb8ecb43f274541e720d7b722c655a3e4ebd6c629b18)) <<< 16000) + 0x959d4475f4cb84ed3d1b1e130067dd9b7e128d94325e283a374b8d95d33b1bc2afd47af4fefebdfc91f04e2aa75c19106fff52fe6301a8010d9be7f3dd0434a701ab974d48f1f841beb4848278c5bb17bc701a6d3ee705e9848642ddd3a30602351a720de23dcaee327539fb750612bd3173530798003ed1c50621e790d252f383475e5a378a95872c638bbfa00666fee5c1a527e73d742c50a54a0558332b458cf502f8b2bbae37c5a415610200ba6ba103e207682413d25cd53e11298b6fe825c2d88cdf7722d70bdadc8d9161551fd74b871e382565c7c240c6433cc0000084b2001d20400548cd79c95bc4a51fc8fb18f2943e07b4d927738bb2f5e7f877068000000000000000010a2359164c5740ba2100dc12a302cc6339c68c840b428720428024020051003aae50568782b847cd5597e58ee660fe825b8a5fe48468d6ac9f99119765513d3729ee4d4d5533a1cb1297161f372ff6d07d54b354b7a00076c6c7330aa70da4fcc7da7620525d07ae25bf9bd3e29a96eee3b1bf56a88099d44c8a01488521291a7a01535a26c2cb0bb10add25fb4c1b1d8c1eb2689c0a682b2e132003a6e64f89ce6a9af291398f3de10fff809af7775641e77ed0760f61ebb492d0001d6bfc52bdab68b6659a36739ee2db16a837586ecfb2880e77355ef823159e99985ec03f061f4f3feb8f0dbef492c587aa7bc3e477729bcad0a914b8b0f9ca07d5a710c97bd766fa3d538697044bf16a028e65eb9d9a8b353e2458c129aec80a7b7452720819ddd8e82be198cb373ed508a40911097f9dbe9914dc661f46d800071220047d042dca40b6420b62100154b90953585a94c2d0970000100400000e00802008000022216613a035fee12f9001360a32e0220c1f00800003e90b20981d82c2c4174538a43c368a18b932f4b260b349fc1dc200247144ea200120e10804000038ce80a16c23dd612fca003bca35e501bdd41b037e68cc3d782791bdf0b47ad16d3459d72e7ada2b4c7effdf65e260f327010200b5a95d26d7fc5e69262c9aaa60b4fdd3b02c8737cc3ffbc842c943d27784f0ff4671e4f1c68be234056fba208be34788c02b612999e03dac6b4a64649102590bc5f06bf80ce74dbf20aaf7a2fa004e8b84d152b644ac8dbc4740a23f56b0751dd00425791d38805c8fd7f22b57769fb436172a1eb2c619908a4d22267b60bf89016f6fa6dc1e23059f997b5b015f79696bf318f792d83526a7ef7c939fc1975c8d8c4e003250e45952d93ffea2c0f32d16b29070763efb7ef3773915d95c8c85f55f0000f4c4084841603a0af1d0570c82b454158220ab0d0550682a424150120a701053008002c6c8023f01c10f8a0db20ac86f5c2ac9cfccf51a3f7f08245b7f9f2d25e34ea040d58fd5b6e57de280ef0408d6696b5e5408dcad770ad840100005416998b99c306cb102040b2d0eecddabf40005f87f7258fe49ef5715ece595ff0852a1f0d2ad8179bdb589eeea43e306e60f372c51821a88e423541132c5a06837ac28c432dd7dc9a016ad0b637d9e6b8fe2f8000448200a5c2402a250ea59ae55a41cd3b8a6fa3c89faa2dc11d9220d3c2a292dbde000000000000000004256ce5b67c3d0b1b1249f954d9a7f7ba1a5390a0eb8676195ee00000000000000000000000000000000000000000000000000190840c3046005001000005414024932882f7e91c6856d45ebc4ec1605d20d000d2726bdfe57e26353e3b0fd8340ac3a31399f970c19266d2d8c4500a570eb10a2aaa43e20ec68d82f55867242501bfe1b518d6197e6f058eaebd9bc576f2dcd2f67de39e499b2005da1085f9f17306d00321427aa90c16b8ee7959c371b97f23916e10daa5ed5838d6d60c9abb2cb4df6ab4b1a8b4001d248059ce900e48d3016f3dc1cf19eac16428954670438514265585e6b8e9a5bb61c639835e26210316e1793e95250bd705422b941f40501e95743cce4e96c79823d2ac11ac8803c44cd35f2eef3ea5040a67b531808039e206d4fe8d40ceabe6b9a555a8009aa9e367a5c8827776782b58313a95eff79eca931f9e7a3553f9c4fdd0020490803ffe08bf1bfe23d320378a02434b82f8ed7306372c05d890ede60ab46d656e6c133360c1d3770b13fd8276900492d3ba2787290fa543fbc20f00309aebadf249e9954941ada9d03e3466bd9f26d99bc6c6102c010ddeced78b048ad8a2de5b40f979233c88349a41000012877fbc3188d581165c98300c902319421dc37f9bfc018a9b4389335715fd58dfe77a2b550f9f45d5d61af58f2838bb90d2f6e5d564debe562c13e983ad21a5691a2c58d9ac6dfc8ba6d0a93ff81f6c1b90288f430b8d98343454ee81166500f33440c06be9044304cde4ef815516b273a04088afebc5ee5a14ee3ec120f8c53aa0412242ce3cb187f9652ff1de1467598400080e237ac1b5d54935cb6d172d384006eb0eff86530c4eafc069d49659ac34315534983a320cf28b3c4ddbf7a0df4be2e94ca0081081594c40e629887e01f1b4b0a3529eadb6ce3318114b395806bc8e9e000000000000000000000000000000000000000000015a619b4ff51dba8aa8edd454c3369fc1d22c528520514410308104101ed06775623e363a62038d4cdab7a6d895deb068443b04d7f0af66a29a5ace555051fa177cf7ed52b9c72ac91a0f61a0003b8214a23f7ad591d72005c3f00f8da5851a94f56db67198c08a59cac035e474f00000000000000000000000000000000000000000000ad30cda7fa8edd455476ea2a619b4fe0e98e31628a2141860954cc)) <<< 16000) + 0xd873d9c22cc0c5536758f206a9c814fa38aaa9a4a1258af822b1abdc9f14dc09d045a45da6263001d21faf62e29a4fa299da0c248205a58a9e7048e13dd4ebeccc3ac4f64133553f102d4eae0a0e30b7fc377951f43e86d6d545ac56eeb762a2dbc90a22287b5f7ad591d72005c3f00f8da5851a94f56db67198c08a59cac035e474f00000000000000000000000000000000000000000000ad30cda7fa8edd455476ea2a619b4fe0e99629028a20818608a02537e10753fa2dfa26bd825b285d74a4101907672fb6707a709c789af1301a20d2fbe4a71057252e05e3f5791c97b6b80c88b166ee8b2bee85ebf549729a8e96ba0ac1a267ad0a40900025290a3150510a8284541401209f0900056290772903a8a8004d508181c821c3400313a40c076086138091141066d19870952b8f260c64509cedb38d46ec8055c1423066385004ac877773584024f17f1db91810135cdc1fe81800917cdb61782531916c5f8ff800404638d6772ca207ce9058068a484ff780fe322c4f338d728fa81e0dd523b19f4631e52642000000000000000000000000000000000000000000000000018849086088047006001000406278dba883b19a833530f5788f483ae626276522e7e80357d3ad334c2026fdfb694fcf268077faba2bc776f7bec87c44aa7a74234dbdcff41d28e93b778c50771da22546bd94e59bad8413e530109282998c81ba5fd84c84db5603985884dc5466f84dc0c2a649b616f9cc7a8f6000000000000000000000000000000000000000000000000182d5cb3baf9b7e5db271e8315da9cdb32b4068cf21f9d10060000000000000000000000000000000000000000000000005f22c63052452c41022c008004042e480200df11502788a80f0edbbac3b6eec0d3deb56475c801730cda7fa8edd455476ea2a619b4fe0e99831620810208c0005fb9ee0f55c9fcde23253ae53a8e3f35d698a79eeeb108e5e160a28fcb45f5c07b98b4adc15961dc7523a1c76edbe17660530c68232acd19a8e4e90142402413a02000378213c238b0ca486b6f7efaf800000001c5c675b410c3f00f8da5851a94f56db67198c08a59cac035e474f00000000000000000000000000000000000000000000ac460c5882042020825805e3a4bdbe227ee9096210497cdb61adc580ae60276a10c1324c8e0e3448c10ffc4e5e61f928d5973c4649842d097be22a04f11501e1db775876ddd81a87e01f1b4b0a3529eadb6ce3318114b395806bc8e9e000000000000000000000000000000000000000000015a619b4ff51dba8aa8edd454c3369fc1d33062c41c4101041180abc91cb4abb2c3c59e2b9632af8b96ed8af806aef9a3292aac6ad378a1d09fe552484f506972f03e70ab0c1d89a2df2a9aa89eb8c11b85fd08e0504e80800121c84e0a826c541342a08a1504c8482602400119e425c474909fef01fc64589e671ae51f503c1baa47633e8c63ca4c840000000000000000000000000000000000000000000000000310962962181161180160120026449506f085c907801b47ad892f20405aed8960f9f7606e32ed5aaf06119d367a4480ea9085e782a00000000000000000000000000000000000000000000000000c326581ffe047edbda41f085de0fdba585c8bd0b7d5557eb4000000000000000000000000000000000000000000000002f19c41a41a31c210104003be19236be3364d42c37eb83c52dc06d146919bd9bd431962ad9d0e76a2ce9daa93ceec600ff1c3fed740fa5eeacd21e3dbcbd34e66c8a59853a8cdb65032b2ce81cc3c96d72aae247671294677ad4cf0c24c23c85bc291e175b42f82d7f182203f83d7c9048048c3fbf3a9c60076f6088fdc0401280e3789b505fa122056058a28090718096f879217da48068843893e41bcd17d01e103e0f6d0c01420bb2a8aeb96f048202dcae16f4e081072fca8aa769c0003ca42af0b017e84081681600007e880021b1e219326f1d9899a44205ae2f8d33465798d2f32e228652060a334c48082c3c67b8cc0c0e4c9ba69f8634033265f7dea65802a2b7da14002004c12d2fe207d09002b02c710c1df6403348d6fed8218a182ea72bfc9051265176a30200ce2060200069dac2dcc004201000012f212c0a0950504a02824c141240a0003cc2122220900d0006eb108f11c58652435b7bf7d7c00000000e2e33ada0861f807c6d2c28d4a7ab6db38cc60452ce5601af23a7800000000000000000000000000000000000000000005623062c62c43021012c09620b06050037076c01139f5169a361a67c5aafc8c16e7267f05c9e686379e4f186801424119a6877230e086e97034dfe0c037e128fd44f650034b65d0990004017c5e1ef6a013884821681c208065ef7580d1c3b9fca35307833a82d5cd100267726d1c00247844109410880200002124238240006d24234441182208b110450880e4441121208805000342108509000b7b10773103a8e8009df884388800b11880175e908651842a6c00c054408b13d2b0a12fa7a7dd46056d744fd0283417365a41c00c32a0940800381dae3800985084021441792154b8e12250c862c6082c6025b0284b9afb38814188fe720d02014d35db5c098308402010802083010000af10821980d08c204361001307f0583f02c0c8160fa0307c01d0c1fd20e3c207838c4056242280662d80e17299982e06001322b8f81002151459f000098808402143173b6d88081e0d50dea4908b9db6c52385b1cb1368000241c2100803d8880003dc83d0cc0b8576c802e8552f67882a24da)) <<< 16000) + 0x01de57fe2f3804744201b825460591230c28611008c08e0040004ab7319ce1f99f5b6a0ddf6457e178c001416b675337e8a0a9ccc40b9cb1e05ba00045041e4c7850b22bf01880cbee5aa7f0c290ab0ad5040413a1c7460c1589d12614094308802005c0307801c066e64ae4a0c2ca1a26a7880af0f522c8306de2cec8a380670bbe0e0801499144c00130a1080400004e483b8a81d8440a41a0750903a0281cc140e40a00031d20e26a00081f20e08306f4103708c1b4440d81306b01d8ee2086924405272043483852a293ee43020719c5c43001af727a200128c100042c7464344931c2be7b6fa318125d679f808c20800200d4120690503400819c040001fa4154760a8330660d83282c144160c80a05001fb116f647203060facd7c192ff989b6f8e046752262d184f1ab8d4e1a6175973a1f5fe94ae633198e930dd00000000000000000212a58ab986e81466104066041845003802016d3bc87508c81d6cf6e7d2eb2dd1090381c712ad84e3914d3d3114896657d22f0c762111f6c72b46b4ca90153d8811ddb85f0b12cabf6e0c21873c8d3a0c60be52fc80e71005b22c66ce8c5816ebc95fb1e50aea981a6d6001a782cc0d2e975a65ca1d7927e9e96a6161c99a49a31620c21601400146ca60fd70aedec1794dd6c18eaf3b1750e0abd1d8c7c04009ed4cf40f4133f09b55fc56e73d462ae4f4c39644b58190e042cf860ed3bb0e0848e52aca54258402af06cc1803f70d140128410004226c5d2975994455c1b5de903a810245a10096b9bcad1c0039a09511402f6827d28e0138c8b589382100042269b7b81641a453f743a1103f4ba60d59811932773890096c5d8e4328210004000040080013998189d218b762473443fc540e354bc30708e00196679284808be97f9f1801d5527ba1302108042060523eeb18c1e56cb3d0e38c2e177f4e8c00840200c4020000be203c0200022020c21b06005f14ef27b93460a98ef020058b3b5da84a38bc15e54da7019f333dda00128c10004000042480038c9000a5020be4bb1da4a09aa24040f5f6ece1c210f39dd98812587ff18c20706296c4858037ea6826180306c6211000024e504201000017020683a032150188a80041d482f14c174760b83305b1582d04f8199a275c00088e0d802288475d14f141ebab8610408209097a004c50740100b2120580900006790571582b08e8115146ce40c1c29fc3cc18026093fc31401689b2b20000090a0800200001ca4154b60a85b0532d02906c144260a003d0fc8d0d676fe7c16e47f1623b960d90fa5192334d9a960145944ff6e4491753d810c96209d9e04ceb3de2a712000bff9ab5cc6ce177769944cc5a03fb9e88abad3b1a2000fc6182e086b99afa3ad86ebd46c090f6487db946d4000f5548bf1e3c8b7157f47f218c728f00a9324ae9f2d06319fc1b8da447f9f00bf5396751dd3e48494e440e11954873d8c0f9b5f6609601107a7af8e05a9fe8c001206100042c702cf946024190f3bec32204200080278281381600014a41344608613e20a974442c6102fa5239010419be992208122599b7896008869ca1470183914632001b5560af00270c2100802606e07446a3d296080933d884825f90cba100af70bc372000f004012c0720464b49ae9e0b9f6e99b3c081c9e23846083e0100000a520940b8040080201242600006e4000810822088000ea88240ef8a533f990243b684025eb88a19a3afb200f119b56ba5d07c9049145b3231091a202299c9b88c3dba0814bc90b872331e1c00eeff5701ddf08c009fe421fe6886c007a1202050d415110f849399cd10a56d594fc7016c33c064200786fcdf802410200084431de059dd0c190336208110b4cc8f6d61052a7fcffa18000e6e45c804a204201000010b2000400411c6700ba10cbd39c10a6749501c10db8026070111af226cc00e5f6af3a12860f80401180510ed84237c1c00b5d2fe41c01f27b70e84c307c01131612050fa9208046d36b9000f80238e40e664993169609db2081148d35f6340186e791f4001f004000065998a886f31c088a25e05ff2702010904fc2035a23cd4920010004264a2624bb1880fa5dfc089a016239625c600400100000a620003264114260006404000f8c82206810c24000a7840027308007c0903b15fbd6ac8eb9002dd792bf63ca15d53034dac0034f05981a5d2eb4cb943af24fd3d2d4c2c3923431c32010412c010050024f31fa3f13cb65d34b6922140bf75eea83f855e513211c7ed1877f38366c98daebbcc9cdbd2d1e8571b0614dcf0b82d14abb4f9a804a9c309d0f620a521ae0e2cc5a318d0151ecd8ac6035add9b54023102000802100ac45bc25fe4a10ac97024340d14e7c7c601609806700904078021a311c522c8246dcc83cca7812fca046823081f00848d012c7ed422103e00800004f3800e2fd03f172fc31aea3a1b5d8154ae29bac23e221073b67874485867014fd5f4f8fa7cda31c01007afcc3e863daa72207bafdd95dcbdd89e2f2b22ebb0634f32fee0b08f0226a8279bdf37881900001c9e5106351836af271377a55e98b16e31e54dcbe560bc2519aaf00af161ef37f96695a17f7001325f7409b75d2467ede65337472fdea1f54b8d0584737e44c161c758d2a935d7dd0b8e17561d6a0a02e6b41b303cf28f31a2bc3cb21e6186d3b10fe26cdb85796bcb6ffb360a495018698224000186c8003a31000832208233c1b1c883a68618a48753c1e0cf0c85dc0c0489d4c00a04820400100400158805e71cc038841891a428059f95ff766803446d6)) <<< 16000) + 0x443003c9e8afa81288100042c41d8b413e1c40a75897f104bcda67d04026e77785d409040800200001b240007e481f868000c5880062a103a1d01c048004024e82eaceec41f0f52b74d8054c6339c68c840b75e4afd8f285754c0d36b000d3c16606974bad32e50ebc93f4f4b530b0e4ca24e0c90ce044001000283cfcacca24166a3f9e6d64486c7ddf47d503534197bd3a43b3b11fdf3c1c11051c474986a958dfa5108ec0f257985318a8b83ebea7df1922b7eb738b4c76bfd33212aa004ce056cedd29f1aa33302aa9420d37f770982958a101c7b505ad53c2269d4da11156518186a119fb860035021c6271243c6ce1b51c8e10b96ad99b3e412b02fb0036c7fe08c6a7f659f259c7ad641aa657245f427366215eb37c308dc4390424874007c120003b934488e3d11f1c22ca15d341c1b57750009219be8afb90a0c7e5c42c0804c9d6cb08130610004308f473dbfce0e0b83389921871319da183dc100a3c848183e0100000d2207a1203c05000123103b09c9026142a52686c935797c6852cf28e4640462683a8c2026a57c0ec18134a95c180130810004286d1d7324cd0b0c954b50a17903306110153dcd2460835f4dbfa9025101f00800007f903a0d01c8480e00400051440dc2406c0a0350500064a1034290199280c8840623a00310420608a02611001a179f622dec8e4060c1f59af8325ff3136df1c08d52c55cc3740a2bcc96c944502cc91430c904204600500ce41ba77ecc46f0b6804d09606eb042cd022298367391f7f788bc4d56be1945ac5906345c24ebea9098c31345a7d21c31e3ac8be28204399738405b43bc9e920405a606b1066141f008695e8a0a951df1e845ac9bfd21d71acefb54037161ee9644eaa4ac4e70047901737c20e3bd5cb85c205114cb51bb24387fd3e0a52167bbc7af1b7bb3b0ce3d06a6b1ee3b1e8501465c62e032c3d2b65202f1cabaefcb6d9b6b1b4450ef7b780bf0c59644097e262302602fd5696c7b47f827e9cecc7f3883e8efd131391a1a849abab6648f7e92e7ef7c13372f225f40d2ec0c31b32a2e40afe78650c2a91560381c6971e54433c23110a3b471d2aee4e48d0a952e18506080c8e2a8506310200080000561000627360e12d01b240202488a00c09a6c43ba2826dde39ba2c8203c01002f0100c0080003ec81704e00002008c32d50f042e0c2007a371a8900018ccc211c0029a6ce4a4002200800006c98000080230cf5e47b24183056e8048c6181443b8b0600041fa86224001600f644a0042010000102200027e40b4240580a02b050150280a404050020002ee204e2a026050005e690253181212808c640442a0211101006807c2403c0a01d05000786900571f200c6c07a913168c278d5c6a70d30bacb9d0faff4a573198cc74986e800000000000000001095b396d9f0f42c6c4927e553669fdee8694e4283ae19d8657b8000000000000000000000000000000000000000000000000006421821811411010c0404031103e9612d00ebdd05c2be60b739495b4df7913b10c1caf2f83a48c68b4adc9bd9d1b09c6372a32c705b6f2d04ca9fafffc69ef6b2239a98f5ab5f61d4d3a3dc32cfaae868f2a2f14980dcb66c3370b677fa26a7b620936fcce608d3e54f6165f3002378db8055807f33def17851302057ef071a044007a7130cc9cdd36a465d390c0b614b5a54ab8480aa540cef885a305ed46a31ba9b34c50815b9db5df1600020b0293f02a296a614006ce48fa8368f62000adceb72c45000300b5565254371170028a7a1201ca0dc1515b396d9f0f42c6c4927e553669fdee8694e4283ae19d8657b8000000000000000000000000000000000000000000000000006412472451041431012802001c000c080080368afded41fd7860a20b3d015554a92869333bc000fdc514768a461b00618402c7eb7fca00b0051391a069e62400b23ab9c328c8000b1fabb538003e84061701630c1da3da8cf165e2533c7498b2401efc2d6860e016c802e82c730b52628f14380000012c010400000240430002d902e06000111591cb58642094011a68ee6a015ac619996f88ee1185000000174669004458499498417a7f8562c0821e46efbd3100000000651220002119ce95d0004c010af392b7894a3f91f631e5287c0f69b24ee71765ebcff0ee0d000000000000000002109851a41841641a39a214098060000401a00032e4070040006f040015c08003c59a2823c5f94b22890cd87b58d09275c184c3262850222c154d8914bd3fc8b231c20000003f785000000041ee9c00980215e7256f12947f23ec63ca50f81ed3649dce2ecbd79fe1dc1a000000000000000004212472852452050821c1240040c0000803400065c80d8080680403202018010001c2901709d1435b9b5806144807326c886493bdf987a0c142811160f7e848a5e9fe28840e08000001bc2280000001dc6ce004c010af392b7894a3f91f631e5287c0f69b24ee71765ebcff0ee0d000000000000000002109239429229029420e102092060000401a00032e68a10112d6d30a241930c7ebf249dc49bd7d68a1c000000caf2850222c22488914bd3fc3bfe140000000dafa70026008579c95bc4a51fc8fb18f2943e07b4d927738bb2f5e7f8770680000000000000000108491ca14914814a107081049030000200d000197200066240581402a0a0140500980804804000dcc4044440200a0014ad2002dc8403ca401c4a00d210060e802c640142a0091100406801c2400c1200501002008007ce08018c80084400202000010067b51)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 31 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase14" = "QuadFullEightCase14" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 31 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase14 private def zz2293:"s08f5"="s08f5":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l15 l16 l17 l20 l22 l23 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l5 l51 l54 l56 l57 l58 l61 l62 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3e3f37d1f, -0x27cee1e80, -0x3bb653018,0x444], ![-0x27cee1e80, -0xff9d10744,0x190a099d6,0x2ecaf2a4c], ![-0x3bb653018,0x190a099d6, -0x102c0be576,0x27cee27e0], ![0x444,0x2ecaf2a4c,0x27cee27e0, -0x13e771198]] noncomputable def hinges:Hinges:=[(-0x565cf224,l5),(-0xf4475256,l4),(0x3fb6e30c,l9),(0xe2f79fd,l8),(0x21da574,l10),(0x3640a95f5,l13),(0x894c8aa,l17),(-0x5ca03ed6,l16),(0x1cf2c2754,l15),(-0x3640a95f5,l20),(0x20532145,l23),(0xd36eed51,l22),(-0x13e771198,l27),(0x13e771198,l29),(0x7fe575d7,l31),(0x568507c,l30),(0x13e771198,l33),(-0x21da574,l38),(-0x13e771198,l35),(-0xe2f79fd,l36),(0x13e771198,l37),(0xf4475256,l34),(-0x568507c,l43),(-0xd36eed51,l42),(-0x1cf2c2754,l41),(0x29b906bc,l45),(0x13e771198,l51),(0x565cf224,l54),(-0x7fe575d7,l57),(0x5ca03ed6,l56),(-0x29b906bc,l58),(-0x3fb6e30c,l61),(-0x20532145,l63),(-0x894c8aa,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x13e771198,l27),(0x13e771198,l29),(0x13e771198,l33),(-0x13e771198,l35),(0x13e771198,l37),(0x13e771198,l51),(0x3640a95f5,l13),(-0x3640a95f5,l20),(0x7fe575d7,l31),(-0x7fe575d7,l57),(0xd36eed51,l22),(-0xd36eed51,l42),(0x1cf2c2754,l15),(-0x1cf2c2754,l41),(0x3fb6e30c,l9),(-0x3fb6e30c,l61),(-0xf4475256,l4),(0xf4475256,l34),(-0x5ca03ed6,l16),(0x5ca03ed6,l56),(0x20532145,l23),(-0x20532145,l63),(-0x565cf224,l5),(0x565cf224,l54),(0x29b906bc,l45),(-0x29b906bc,l58),(0x894c8aa,l17),(-0x894c8aa,l62),(0xe2f79fd,l8),(-0xe2f79fd,l36),(0x568507c,l30),(-0x568507c,l43),(0x21da574,l10),(-0x21da574,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x18190020000000003902c200c169148043009c680300000000002502480205925101060371a00c006a4c4083027b40140000001387203a60180000000252103cc020000000492081b180600000000003409200800000000c84812601000000000019024802000004047080c9180a00618b282301b2401400000016492048601800000002215018c020000041c738069180a000000821c8039301000000000001606400b83101067c0550500700000004b1481298060000000922a01d300c00001011c201a4602800002b090240710030000000000048190020000004108404830100000000050281260100000000000a03480200000012822041180800000002609022300c0000000000481240100000000003503880200000000010816100600000000009805200800000000002606400800000001109024c020000000000220490040000000000840b20080000000008e01640180000000011002c80300000000000381900200000005619025300c0000000a43403a60180000000002101c802000000003e1a0498040000000000740b20080002b0480b013a80200000000001301480202841480840066a00c0001342104803240100000000098580c60101440a1044006350060014415c110036a00a000000004c240630080000000098500a6010000520a81200f50040000a813828036a0080029828826012d40140002e0500e00ba80200000000009802480300000000001c02900400000000442406300800000000038012401800000000012014802,0x488e802c98080000000006830330040000000000a81c401000000001509018c0200000000003a0490040000000004102c200c00000000c8301c6010000000000190388020029e33c518078a00a0000000000190320040000000001081c401000000003121034c0200000000541e05980400000000541c09300800000001d0f00e6010000000001a240cc01000000622c1a0320040002984206404b4010000508880b81168020000000002e3c0cc010030c59016015ca00a0000000002902c200c00000a710e0498602800000000b05028c020000002888a03418080000052885024c301400000000a8881e6010000000000070188020000084210980e200600000000643409300800000e11820324602800000021884094c030000000411100e980600000708c100d23014000000b048280e80100000000160f014c020000002c85e00d980800000005221014300c000000aa16007660200000014429016cc0400000028882036180800584a38a600d24014000509262100908020000000000c40b0803000000421a0a07200400000cc320b01d400c000000d068500e80100000001a07c034c030000000311481b18060000000641e01d300c0000000170500e6010000b129c1601b10040000000004c381980200000000941c0530080000399a81203a801800000000320c0cc010038c69016015ca00a00824f40e3027b40140000001c4d206c6018000b1284330265004003d272061813da00a0000000d261036300c0000000188780a601000000000f09014c02,0xb43b0481320060000148660a00c400c0000000001500a4010000a218c1202510040000000054320718040000000000a409200800000000002a06400800000001b0e038c020000000052320698040000000006870330040000208e424028801c89204020c047c5007912408041813b8a00f2c080a090026f1401c0e28c582c0014880300000039290501900206ac4ac4060491a00c0048453821019240141a192190100c468030000002e1e0901d002044838a1b6019da00c0001c46414c0cc40100000210ac3204a801800000000160c0cc0100000622a04813200600000000008805200800000000a8301c6010000000000210248020000000000088190020000000000440e20080000000088300c6010000000148840c8c03000000221a1203a0040001f03c08407840100001e0420d01388020000000000090188020000e81a04203c20080000f02105003c4010000000420a0078602000000002515018c02000000004c2a0298040000000000940720080000000000500a4010000020a32c0848c05000000408c2046180800000808cd01d23014000001023200b2602000000001505018c0200000000034581980200000006229022300c00000000c8a81460100000000002e0148020001643982404a200800000000b8740e300800000000016812401000000000005c0c80100000000003a07100400000000b4740d300800001251d6042460280000000150d02cc02000000488e2046180800000908ed01d2301400000000e82814601000000000d0502cc02,0x562c0718040000000000a40e20080000016958b01a8010000000002a2c0cc0100010c2182603da00800000006229014300c00000012c480226018000001845101b0c040001262b02e045a00800404708ac019240141028e28a7810b6803001041c82b00aed00500012c2882602da00800404708a3019b40140000000000580c40100000001c8c4050c030000000440d80898060000007118406c3010000000044140666018000000000060348020000000110681b180600000208310306301400000000002812401000000084150318c0400000104158183180a0000000000c40620080000000088280c6010000000000320148020000000005428198020048871843020640140000000e42204460180000000002301880200000020866014180800000000008406200800000017052036601800000000f0a018c020000002888a03618080000000000d805200800000000003606400820a18614502d4d00604103022880489a00c0000000054240b300800000000016816401000000204410160c040000000002f80590060000000005c00b200c1018ca065018628030000002783200e4c04000000488680349808087861030809f140181058c406200ee280300000000002d01c8020000000001b805900600000000035013200c0000000006801640180000000001901c8020014420c310078a00a003182302b00f240140000000000280c401000a51161b0016100505ac3ac3060491a00c00000ec4419025400c1618e18c100c468030000000001e0c0cc01,0x2c0690040000006115408230100000000c4560446018000000000150248020030849816015ca00a0000000084240630080003b0a40c809680200007115017022d004a0640211781030a00e00000a092100d2301400000128b0680c801000000002e1e01cc020000000044260598040000000064180d300800a21031c604ac802800002824840648c05000000002a2205180400000008239036300c0000000058300c601000d510e19c0f6d005001982043080c9200a063c414314085b401800660840c80576802800c3102184066d0050000003a120c03200400000000000503200400000000e8480c60100000000000340c801000000004a0e051804000184520c8094401000000000132206600800000024904088c03000000004a4205180400000000b4340a300800b49051ca06368028000000188a40c8c03028c19e11e01d1200c0002184306007b40100004088c0a8076802000f514e21c0f6d005001d82844080c9200a073c514414085b401800760a41080576802800000000003c0c801001c62844080cda00a00000b09410192301400b09411e40576802801622843a407ed00500000000320c03180400000000b4340930080000000e462044601800000001d19028c020001683886405a20080000000054140930080000000001281c40100000000003902480200000000000e819002000244540480b4401000b91011c205768028016920438807ed00500000b453150152006000000b8ac580e40080000016950b0128010000000172a2c0d001,0x210e81b18060000005105809730100000006a1380d860200000000001b01880200000000002c02900400000000006c052008000000a4240026602000000001b13018c0200000002c1380998060000000542500b300c00000000d8880c601000000001b12014c02000000002c2403980400000005821013300c00000000b0880a6010000000000b00248030000000001b00490060000068041002630140000000d81201860180000001b84402cc030000003504200b18080000000640900c300c0000000d01201460180000001a044038c030000000032120398040000000068240630080000001187203a6018000028e49c0348c050000005112401c980800000009c4101d300c00d216328603a480280000000312d03cc02000000006a1602980400000000342c053008000000204f206c6018000000003e0c0cc0100000e45b0480ea00600710b302c02b94014000689821981328020000000309640d8c03000000003a1a04980400035cc109806c401000000001d0700e601000000003105034c020000000005c2819802000290831cc07b40100000218441403880180000002c9440d8c030001865888402420080069cc08a600d240140000016868281c801000004b0882c0750030000004c1c1203a00400000a4421a024400c0000000a43202c6018000000198a4094c030000000311500e9806000000651040a4301000002d0a41603880180000022090501d00200000000441e02980400194228220110401400308410540220802800000001916024c02,0x3380590060000000006400b200c12a0e18a50186280329c101020c0550500704883bc28404f8a00c092072c510077140180000000001880e40102ca1c518602d4d00605903883020489a00c00000007209024300c0000000001680c40102832421c300fad0060404192086055f200c0a0c90870c072b40180000001f062036601828a18514602d4d00605103082820489a00c0000000e219026300c0000000001681c4010010119028405cd0050000000002780590060000000004d013200c000000000980164018000000003a1c0cc010000006908203498080000000044240b30080000000843202c601818310d0c300b8d00600000000004a059004000144340840b440100000000000701a4010000510e02102e100402821b01020464200c0028434041026840140a08680408119080300000000110f014c0200000000001e02900400000048044016301000001284c120168018000000000780248030000000230c81298060000000421a01d300c00000000003e064008000028408c0cc8c05000000005c0a071804000000810840b830100000000842405c6018000000110440ecc030000000210880b18060001d8250740cc401000668a511801b080280000000001f018802], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((0x1e503a240e49a579781e9498557b686c3944806eccc99820c2045668608cf1a725820be040f7804e10400109015708c65d4c809fd83f30bfd83f30c0804d28c28c10d0ca08304104f0020132100200d00012023661b1b2098d884c6c02635e0b1ae058d682e0580a74cbe8e2e17240fc0696a19c7bcf2ca01cdcab28e1010d0a9e82083ff8c2bc2004c9aa5fc0670c2100809e00c6b0063560388813f043dfbb4d2c4beff4248894a09029b908de04fc10f7ee142669d7e5e6917248243089d49d8b2aad4ba6e9a44e60c4ef9f7d608d138610f3f5263b4dd8c301543cc38c30b3813c00a45268a5819a8cadfeafb7f9668ca0b194cf9e09a754944d97bcba434ba27eb3d728bd7707890c8ff41f76acbb620643b99d23db95b067133637c1e6c8a86809cd44980607c03ae5ddf6673d4d62c87ade3ab9777d90785130f30e30e18e04d008001010a4f4ae1ff4ac3857f90ff9462c99bd67367ab0303028bc20d0001b02000ca642e867202ae118cba99013fb07e617fb07e6181009c59a59a2961841200860880213bd825b87a40d942e5f1505956040fc26a278031ac018d580f72eae6f643f80372eae6f643f7fff30a83f6bf749ff30a83f6bf74a0e029b908de04fc10f7ee8e4a1302ed88cc04f824240d3cd3451433c240140042835fc3f2d0be883272d88fcc300eafc1cf6e04b608b374db46b2b2c934313837c8fc6877e01d2613ac1ded589408c3dc4328b0b4dc846f1c9c864d2ca6a00b1d469ee88c11572eefb339ea6b1643d6f1d5cbbbec83c481a79a78e68a78480248010081810010068000cf103e01c4c298e3233307184488207988e1932cf2b4a3221115d1c730a10204122145307024aed54d70880415f9c08fa1a007ea9c356f3000f2a1807fa08153d6e737d0002a50c1380e00008c48003cb900096d2352220011c22100331a615d93719732e5b161dc65dbdfdc702000004650180a04c71a360400068b3ac2784038b0c658ee000036f8d830204e4dbfcfd24e3ad25364021e3961300c30a37e03ab434449e337c2304d09756753c2000002583425d886b6a30232e7a9250412c52489c0c0d58fc3024529b8f8b583038400081a4018d180fc70000495cc80a1c312db04f0e2665e25a8618640a728c402325f4c16e1822b2233651000872d633580ce20460109015708c65d4c809fd83f30bfd83f30c082b9777d99cf5358b21eb78eae5ddf641e240d3cd3c73c34021c13400c050c080080340006688d500fc654314ae471386000090140338260671a0e7b0c26b3952fcfc3c1b7cf3cecc2440000003a9803c0812e3b426e380000003a980514c8818280200000e9905401d72eefb339ea6b1643d6f1d5cbbbec83c281669668a5066826000809f687cfaac056941fa737e81005dbb1e1fb1e80e821515206f1ae7a77aaf6064dd98e40bc22500020b2000eca46a4440012da46a0140017047078a0df642848f29d202eb8905a06c231b0c093f0da37e2c051c7555c8401e9ee7d8347008c71dc23a801e26b552790a91661264403874f64831ce08c0400003e27891344ccc606c9df4607b3fdf2a3cdc0963b5402c792c9fdda971e467a26fa82f3f335239c1abb60ad42eef24135593e987f87807216ee526e08d30cee74e28317920013df553808e0f5f19b12b74b1ad2643cbe2f39fdc0003e6ef12f4ef50b2d01acdbbb6dd6a5511fd6db2520024fb609cae740c47af7afa6bba64d9623808bb2ff8352c7d6d0bdfecdc108a35d39ac7fcc0eca3948428cac2964c6ae05ae53256ca1a8175cbbbecce7a9ac590f5bc7572eefb20) <<< 16000) + 0xf19e518512214102086012186735538eb5de3b763f02dc63d3368de27df6a7a0a2a9d5dbc662b6c18fa31d1a4018d180f0a64176a17942079c5073840c52175a90504595897233009191084096005e55c984a00d2908900004e2842010000166234e1a000400225a43080158d308f8900000363c43950164e15b718ca7db0d0e149ee4eb98de647858a5159797c7beb523019fe64ba3a9780e1000aa75cefb0141c4201078c48c0f214ca898de50b99a643a4010b91f9f1ca0e41a1a5c149a3a6ce0c07793f70286386470f93421c1f2a30080bd2f12d44700286622b21304108043c8669a5800000000b92df17aa0108f180213820031f45b02c902cd2ce0cd08404e01c90caab9cc0a71accaa509ba69dc360cfe7b4dd9bac725bec9b304398b1400080086d06c3643634a0b1a4018d180f8c7405fc910c20ae26a440e0a6cb98eae680035125592401530774390000a3cf590026102100844c0000016e3600718000002dc6c0112022fc32eae149e216a5c41b39b63828818a8ac2b6c782c9bf1086b574f00d43db4d26fb824e207102f03c0000ea105401c0b178d85681a5ad8a848d500c07c533e870688262c6d3c0164a02b0960023fb9b9410269f1fd3480138c1080400005a480d8880013508d10880022ec80059f9c1e1ef02ca4ccc331091dade4122b0227b1890c28b763eade4b854b0373439ee64fcb13c80114b4a4a1ccb5b507013f457e0e8555b88004ed05d6bfa44ee898f049a6e87da8c20e139c820a274cb2026b8a8a0c60780e80002b82342621a00d000bbb919905d0ae1ded9180e2d2b7b9ae038299284cd21201c8b9dea43000c472ace08007b40996a18091f0441788222115f88522010dace69009cf7d26d147442200c0000f6119f398cf12c6748612c1bd20788f0029fd43541641c54afe39e171182887fcd3934f863b8020941782a05acdf680404788ef768a39cc40e006a32f5b9356df90402d605ddda29d7aa86089545211814190043bc4f363941d8363cabe4ecb426159d3cf5cc905b1b2208940294e32fd090207c021e588305f3d6985000000bb80c313659c06e9a1902a4e76f8c0979f1371d1a05476c61630c008305e81ea53841200800005dc87206c1d8363380b0350181a00e0c00ea8aae2ae9826f8f0e5460c2fae4f9e43c0b06e75a6bd69d2bc70000000000000000004592e750c7c7e6d78cba43fc17f3e85ab7a814787559f2ef100b840000000000000000011595852c98d5c0b5ca64ad943502d502cd2ca1cb02bf1e23d7d39059522ea0511895463895ddcd248d2e040ea7870d1ed21ad6f7758396e242ad5ca7ef017295b5a0c197e2e3719312a7d961c4bb8476b4be1d9aa3dd9edf5d3718d72821016dd2a9cb411414a6e960000017701c70abcee5231828000005dc0515601a972b270842c49f710142c14f6e2fb1c08109d320b8e0166f0ee3fc0950204a0200001b320d403f2a266bcddc6140709e5402460761b7eb0c30ae816c88e0097487ac45001cf1854b4009860840200002764240440011a2466c4400179a72b0a5931ab817160ce9e832ea6404bf60fcc2c1cd5ff561091839238c18619600e0000e63f1ec7156a71b694bf95c5ce3898826aa9a92b13a3095b9cc1541126d5ab07f6bab00303400bf30bb8a8c58f22d500029221184b0891184406e88344d400e614490d16c3d4df0c55c481c23afc66da42e36040985d5c40de17ca08238b2a0785769ecb046cacb799cef001c00b9f633645f920100402bbfd47303605871234985995816481fd14e522606049cae0bf90188c40ec8c018747f859ee89810748b8b80c1808f26fd58f84003fa2959c4080640e1300800d4260680b818026f91d935d2e34b0000009876078204248438b55fedc0a1464a002c40cd4828baa2145f02e2a73841a54d205ff66802082af106a3aab78108219a7143505002a02e05ada41d064e16915b5d56580532c0c9308039dc747f0004830420100000e2231223f28058feef1ac5185000000b71b00344185cbb6dc46c48801daa312f170d0fc6f84521cd61a075676a953465180306cfb9a9ed808213881c80bc0f00003b640014888cd0c835454000ea4641b306d1b194980cf2b96e831c9b77fe00183eac683ffa97150600000000000000000046f77757ce035c8d17a7dd6339b655cef829b0dbee0fd03c2cc000000000000000010595852c98d5c0b33072472812c01c0140000c576937955e2f16cc008528fd330b053c7f0b15db6078c1945703fb252236a5e174448f4dbeae040d740f5f36f618ce4dc67e1a614861a85658602b689c4b03fb6c071e187ec1b0f67eeb31a9922b40014d083c0e8003bb08cc80e8561fb46b068141285868f1f71a21e0e2dbbe2702bbfc49a3d5a5cd13124504044ec6ce4e2d55955b36d086650c760827c88e542bc29f86e55768d9b5c7c100262dccf643632abcc4af4a5b44ad0601ca28e7f71a23736f9b0dbf2d7a48001011c71b2e01f5d42a7e542aa0deb829054a751c695773ef99fa6d12d017a87e23bb6eef66020ec3b5cc88e2288000462203a8a1981501388865c14004a76622731e9184d94d40163f795e55a0229015708c65d4c809fd83f30bfd83f30c082d43b9ae7f4dc634399e012caec8a028207820652591b6f02ac00000000000000000435ca64ad943502fb8cdbadf9454d085bb8cdbae09454d0854225285205142080003ec77a0e782dcf736b4cdb777d38637b93c018a2b4cc30041ecf84b65770c3caf51cebbbd08c3e51d12a5bf3955804258d46779cf75c4e)) <<< 16000) + 0x1a03bde6219dfb3004e4330b6c132c26c1d4444677f081b47db9d770106f680a66864316a53ad0b04ceb853f5cd6156a4eae1bc90c97598ae432faccceb5e8dee4ff6a9520525e82eab5317503ae92b5baabd4413525489e1bbca828bc81121d167f0a12356bf8c29888f61136060ff2ce5a772dee6f057807a9a1d0cc7a4a97c601c3ae8f9206b7233f87e7a80cda05788fb594b23cb62e12d14d2681cec280891114a9b1ca83f1aa815b877c817f20280232a48fad216ae241558c40003cc39593ebf37e172bf93c79d2efb72f482c8ab4f784291eebe828b1900d9ecf4b01f7dc6bd329578ad2a06368f8eff45e7f1c08d6eecf08b92e0269dad17d17360c9d29887d0bfdeb332fc4276a21112f8c484a61ca62800077b20c86b9147fdf4ee091e44018912a4a67bec3af4978c71146c8111c591192e0610b3091d3965dee51440571ec27406ca9e018201e181c31f19b85d200000402a85728bdc2f6468b81f25bd98e1002000004c64658e432a421940d0c98480d81407e0b192050c8808004360862aef851749faf5e950cfcd8da6843dff5f8c5097e9d8d3b0199df7589519422bfa8f8813d00073e9dbdffcb27a9b481786c6e0812604872bf5e6a0d7bcf948ab93afb43009bf3a2f01e7e52d07feffa32af75b95014eeee516217a25e40e28796e588db14825c7e00a66921341180ae2e7ae5f07a0005075048bdcbc8570b3add831c615bbd4606e56fc9c6d1ed9257b565647715c00024d9c0863a7a1406d6202aead055df6f860882cd50c0a9430016422bb1c280a06db10a1790d42006219feda4970a0014e25526f372a088a39e5588e7280284b90fabc8ed03f3ecd05c0600002442320d218f5d0c704c634143180281b5b01158b54070910638fac7a860b315cdea12f050897fae11da388041d5cc7d22a08007a9e14567387028e65be965745005c26f33dbbc50514140ea45fdca26a94d08858058c2c0000036be26953f58c7c725349bbc37b414798486fd1f5bcf0f20000001442451000000006ae28204a8bf729f8410f673fac250d000acbb56d7db2400a4071e68000074a234abadea0b8a693b5a44e5e4c2466c67bce1e1000000c3c28208908182c082a44d4cd3890000003504d000460100001993a54febc99bce869379e383b27498485fa0885630790000000a21214400000001ab850407f80b1caf04113739b05d50582000000daf89a0015975d2b71b120054040f3400003a511a55d6f505c5349dad2272f261233633de70f080000061e141044840c1604167bde2f2c48000001a826800230080000cc90003c121a6130d20580b82c62c06314030cc01c0e2d85bc24d44e30980ed8fa302c90000004e200924000001902c28303b076ce87460c000005016c0c31793c5816a0b082c458d20b7380f59a11e728b22400a8081038000028c7da38b8b1fa5d242ce2aa164444f6d34a16db4446f24d0c8d767f663f2c216db333896c20400001cab9428000000a5ace722000a80800003b074a9b9f80b41669374a54ce7c49200700dd1b30e100269dffae0821773c27e5e5021c036cb150b0000e7af43b9400012f56b2324004e0ce3011b9002701402500c00081087204c1d8160380301b01c90502d355c915030291abc5c043cc21eb77fbb8122c0000015f2730a000000039e4f1205ba0685df284169cfb05a1920487addab80a400e71dd54223faa400a8081240000015281206b1a1cd003540c837f62c1a8798218043183cf119fd959e5aa408000016efb34110c0110914600000010914e90004e0280001bd23120b9a260a44e5d3e22685f81fb153881a41986d2ae9a660000002be4e696000000073ca02c0478af013858a2bbaf42d94220f360d0549ba98041986a8f7ef548015010268928ff418e9d489e3119454075620780000047d98a81a0000007dab5a660000001a96f4718000000046230c3077cd6189a688835c6f8d5110d0c003ee6188a7651b92005c0600002363036c259c774a067b1dc29163cc0000488ba28a3874bbf981052a2abb78180000002d6426042300800009f10005b8313c02714a6e43cc75e6a56338f2e7944a7c2438b1422ef0f54b2400894c9683837482f22ea890c0337d54e84410066f88fe0c0055e8ac5f50c9082601044f0f5571dd767991cdb790e7102c00000527a1e5e4d88ed4c53410000004cc8482009a740b103046fbe532101200528a7215600046e88fd1bc1b908270140000fa10003f9203e03f31dfadd67583cb9e63e464d8e2c5181da2812c90009a15240e0ddbc6fe5fa24300afd3bb6110800738c5700821035b5dfa0c00528f74ec10c908260107980901fd38fc39a61f7268a240f230cf0870c841081e2033959dbbe4e7089bb1b92c9191a23af2ee17324e9808cd0faa40331c047d7f46f1242680f5c94011eacd6112005c0709a26c37c1b0e7089e4316d0acc5030c2a6c3129762688000001620f030804689bc75dc186084f658561e883f2ab7a148b060200000114390300150f28997ad95480160140000888c904de0571410339015607a3cc00dee2a8920c333795d3380074b20c58c00dfb6b37226042200800009c10005c73a508cc3039f5a165242259e0536082232635b4e582209bbc362e5371808cc22bed9fd9609ae76c7d183a203d862311f0118041b8e94fea69601e03d44bdc0f989002c02c0c400c61c07344b987a0e95444d0cdb46418e90347f291240054057f734cefba4b145cf811c0004c300dc9ca32d51078e7900c43430100931372db9300873418348eea9002a0)) <<< 16000) + 0x204d120f2997b70c8113c535933ad15601860d72213742670f0c00000135cd202c3003697338d20ca0c00f95e8280a1441989ee07d49680c040000019055401800671912732283e044801901e0000974c90559fb94390338ab03b3a3cc019172a8120831d8642a38007c56b228c00e064454d26042200800009c10005d92001080461814002076400793486a8680093c48868af0b3e75e2af1298546c7869bc68c256987514c224903ac648d6222c329b4f3f8c2141973a3b1a788a005877dfcaf810118c7a7dc94040beab3b4ea2542400a4091e6b3136093161a52bfc3289a11a4cd14cc3d0c082057414e261161800000ec0a0e1911e0a2d9a9a10795c5bb9d10100000078de0e010fd514a4f6d200500300001f93c63675ee63c7163ca41fb51846fec9dc387049f98402d9001de734c704a08440100001093a5bc64908f300899a1a5416c3c52c318c0c1a40922b52e2e8dea7104007fa492c58354f163cfa76097ecfe6968e321c872e6b967b9d1409bc4f513295d1501a01a61fb98f4287320e0145fb525df85ffa85001ed04841e0380000b1c893028078141440203c0100e80861404308020008b223060391a6d810d2b4245a4238f1ef08140000020701430000004b00805854ab039c1000ad7bd2c803001043fd12d0800660627f3c0144019fd2fa0aec830260100000f89910007f927920204cd88002d85050c368d8a82b31020da3638d6ac704c649b36b2428051f436246683002e29576f480042494b6222b84044bfe3f3240b79cd0a808000041e4270c61320391c48d7c461527f5850227bbd380710db5a53b142a612996f19c036080c000009cad46f62a9acd0ced7070e55e51bf24f099bc86de8eca104081012fb23608ef293df11308b09001012fd86f687ce405ae6caa4010510eb22c59e7ccc6a71ef114c8a807048f6b68384d3679f4c49602023d80715507048889640641080001f49003e7823046382061c9b51d20246bf8190a29f89163549b53bd2244a669f85e5c080dbf5d19f1a31c3000001b51c040cda4ad132cd0c227046c4b6104000000035520c89002a0200c080ec9b984a702e51052ea090289195f1fd9e2942eae21c3e428415b85d5f6489aa8d25ba830116d41ab802003d9cb7292804230080000cd9a21ea8a3d6a676850e365216ca97a5207000000a6a0401422f871a5ba232091054a9b771ac044062a54d662de82240e5806e6b9b344e207003103c50e5016cc6f81207000001aa9014285824c00c30a1305174f5688489d8622ba1ee203ec310efc870a0220a8108c842004c06c2ed6191000520400001cf2300020003d8364b06a3af5a4a231676dd60241036c2e04dc245db3ec93d00e18972dfdc0440dd311e6ac43044b96f739e1023a623b7b08800000007773c801280621ac86ef0ec8167451a7581ee19049077f60a916494414292294212204082060000401a0002326880f11c1cc0c91e1486b61991450db0b813709109cd9fc9d62046a9434544490cd5022fc3b203000001e9905042f54327de1800000007770f2084c0180001e622fe1300052522fc22a1c0a986e82e4818a8d47fa510a15663f2dafdc60cb86bca24e08096c1edcd3a8600ec21f98adc403525c37a4203005ef962dce410294f0388ec764801400e2481192fe3c1d91040f47844c8d00a1e731e50f916c48d4687d77661d245ae614793a54142333ce981e3509122cd23adfc88202000002153400c14e63c7fcbfdfd09002d02c0001159a20feb82707091e9fb22774891160aa0286881149504b29090c0c50d1bbc80c93b90b03050865fad622c1000f672dca4a01090020000346606d5028ad1820506a2390f310409879f69420354945bf6d1c37ce94c93b1c20000022f8101190bd90271400000008880a0209002000034a45f4262f8020007e822f62217a110bc8885e0242ee12176090ba8485d0242e612172090b88485c0042de0200163421388b0c5418b71ec5b4c62d85b16b298b512c5a4862d03b167198b30af08678463bee8511194eb099208182a9bd22fe200302ab10bdc3814febface545012b3023d21840029c395ba2454005050b6fd0fbb100099ac07078f900953d306c3553ba1380c3832360a8c686210d6fce0706b6b2a60016c61d340a8751712800d8042c603c22df4c12061675381b86f5783415591406900070020000182459407808b8bde3f2c107713678083f0796d988c107c0202a00a0000b9330803c0550820a5d3c79a0e041a149fd0e0004a31810d001208adb4c00009a427e60020008414dc71a492608111cb161c0870172b11a082282796c800400100000cf22ca038020080205401400006e40009ecc06028f0101081466884510209d0712ff8603b5faaa9e1800865cb5b08002eb2b9ba24c204201000013722c82b1630d81684c4dc262900b1470589b02fc49feb1429e09208aced4003135eb87003da1a89900074021e7e44e7db47885af2ee9a8086a2216c782c39b1451c0844100a72800f00400003cc8b100e008020081610500001b9e3a27242c6383410d223c304a1a992c4c01960ee34e0133022e4340163ca27c26081e00860fc40aee4410680102c20a00005b200032e4580462b01301b018ab80c1ec07e2070a01a0411e1caf12800dcf2a41e063287a49c02aaaf7984a10380108000080205740701530f1899608b7e9b4340bf67b5446083601000009920001d6457c242bc13f121bb623c4063b210c1401701d670f02eb569cce01f39efe8025101c00840526959dcd11b792b8142ebe372098)) <<< 16000) + 0x20d002057417015a7db73c50ad3269e0d01a70da3423081c00800004f1042090000bc1000284224c0305401e1ca7c7b742a000776e0d20004f73be21e003aac62e88482040010c30427402f961804e96039318713a9e6ce1406d004153104a1e2990412359c7a112608200084460d75708b1048945bcec3c20083866738006b5e29809020800200001ac4114240004666cb40a55970d2001f09734854a1eab3cd10180ef87143466cb08c5069a92c7726041e00840518152e8a287e42c57b8d003c1bf4711820f80400002948ae04c56c242b40200021e363043b2039a01c0ff95771c18b7bfc3b260050ea074200331408500603aa10b740804c304001000013522b2120006c3200178864403be647c3020ce0ed5c407d4e82f814001311c1424041f0080ac02c06c062ae0307b01d0b0965e6185061776d4d02004739f3048c10800202ac0b05401d8c008822823078a26a71c3049a4dd74e082f23fc61d20010004055407630357fde8101842bf5a00c1cfd8bf3d90119626a8c260132fac5c92821000400003fc8930280008548aa068000c548a98cc548641123213115000253913011000a85991c1564ff65cd9ec7371e58805822ca87fe1f08a2293584fe4201121304de21c3b4ad35d9d81c04a7b6116e115509dabe4c10d00aef391be6ad553e6a41ecc20811ea26602dfb2d4628d244909c4041eefd5783b6842ebb022b1e4a82c04ec66898e648a6c576e3ea0eaa29a2c8720000dd88a88ee8b06f85e0b875ffc73c6a006e99a94b7a15f70a9aaf0ddcf12d7c8489ff31dc97c7961e1db2283d342427f559f5c8692854985a202009f4b6f92dba40674c2e2badd0fdd3216a2905737e98586ea338a88c01d40337a35d2ce4efe1734f0e8b98d3cc598105267cc2e00006856131c32c0e811676d49d1c52b915dd93d155f4dad2eeada2b8db9c80ee4435eaf302f499cb7494af25b0fdd82a13b129d80428f9ce53f37ce7cfa027795107a8be17a0975cc34a102a491d7cb00a756c5d1c16a8d85bf9b8bece341f0d3e1ddb94ffe9db1016149c6f92e18e944ee798f99996c1e32e1d62a99b2ac7ccc61c3553561f355540cf2214ba24c330a0eb22c19e175a1188cd2f405200628e0313601e1b965f40830c54b4ab8901181efa420090fad0424081c0080a804c0d4060680380000802053c060d40380000802053807046d3221e78708ed8f33d678070fd5a0823042100800005510000fc229a12036090000c691300d000160114c218a58ae1db7756592662ccb370b0000d3807353c41a6a0a375ba01aff8b6f84336a3741f6bacf2b8472d8800000000000000000000000000000000000000000000000006265614b2635702c6330cc6a8dd6dc01b3274152d5ac34e93f2fd0889df10554a0c60ce00d00004b7d765f55313a7a5765745a4c5badaf6913385e535a8d6b32288b8c0d619bce87bd35ca51e97db44b05fbd8e48f7826fec187033b2ca85f89065c758ee7a738d9576af2d688896104180e1079dcf5749baa0fd4f13b700faf24297054a800313912f290971485289402e1200120622920b908e08afcb7316cc8337c482ed0d8e881b0a04fbdc300558a9fe7dc7687e8d60a0212a3a1545d7ad71638300e68329e2c4107074542809c427d2ad1f1fbd8280459459b1d4c46a38b0ac41d177285cfda84d49a5917321f51d701862aa158089024a38a8892150000338224823a2d738f6d8a244010240378400041e3b13c20019b4c31a00482046010148018a380c4d80783021f49ab8186a3f9d3ddc50a0182dbfc090000191dea812061180405180606803d1c12efc10d8e3d4eca1e482c600cc23674482016404cd4000006770a112821180401a807c4025df821b208a9d943c9060e019846ce8a0802c8099a8208ba0f5eee2504230084118b1ced1430703c4fe5e9e01a793c6748c1084020000154400074c8a28482402400067644c0340008f064b9d431f1f9b5e32e90ff05fcfa16adea051e1d567cbbc402e10000000000000000004584100d95852c98d5c0b325f1338fe71f59ca13770550a2851491080480103780fa206804122b9d5f12cfb45ae329b063a1b92a47eeb105255cbbe0c240f2fbb4d4e16e7b6db01e04bf455dc460e766c024514ea947380c6b65a3e735840a292c49b831410b6aae728417781233f1603d36757b0a008318c6720130a100042cb332cd5801451f3e33e02820ff2485f082bbe797f23002e6380da0025142000800008391300d000135100066222884b14319f0880c7b0777a462e8dce8411d1a6f362a117b9f02873423a0e0243359e6052ea6ec67890970f19c6f5227980ca49f8ce213d090d47cd4ec5ba63bbfb6ed4b0d0412df0b418c0c37b0350f4228c8feb592b255937469d5ae06713eb4141a19f6ab53f4397efc75e78a15970426fa493ad4cab896084ba321462b4fa452c56a530180e9befa2ccbd939fb7ca3eb34edcbde8bd3a608763f7b7a81364c7a53466d1fc17cd8f39b3426c6358ab046d43bd463c8d71097568c26c4124053c55494102800264a7e5735a5b78e03e933f75a0720725427869ad4630f48cdfdcabd6a210df2246379e2d89fed04133a8ac9e79d3dfa2d23fe9a85287f30af83a750a256ba78080cd9e76c7a5ecdcbd585313678842fc6daf08931a4063a07c67c9c94fe50595d39ba4c991df9bb2825dfe582a55be906538af3729cad4b4652b430cb7ddda000141c415c0761c30894f1111a3c760624f16425b34900310ac884525dbe6a780000000000000000022b2b0a5931ab8163)) <<< 16000) + 0x198663546eb6e00d993a0a99219210c08208a00600008a05fd58b39565c252aeb3168986edc201b5d912835e2b058d8531a36f4e961253588b26cb7e18fee6c8504f24cecc277bd84cfea43c18d384c2a0007b8446cd41f46a142310a08a83e0140035f64500e627e5b13e2989e92c4f0470190a3f1248617f28a5804d0f639f23b8a0415eced309043ca23580104f0c99e410098508002003e03f3753f11837c45f3753f11837c46ff30a83f6bf749ff30a83f6bf74a0e029b908de731e9184d94d40163e2b961fc022240618528308104140014010200a98d7493eb47eaa0a7e608e2a459722b6be1c2737757eb3d56dc56ad4146bd8201d844f00519a2d7ee58d8444f8cb2a38c6816b4000e1889b86c4d80722194e3611240ea3e5e6e13c5aa12b55698080b1fd6d080440ad72ac1035d9054204801ba916850ce10420109100d5dea3d2078c64b8461e2a9dc902cc204a8a6947a920410804000036883500e6493aefeb4c92101ced9e868c24683a10202315c3d1d060c53cc07653001c86757e70013bc465a19c2084021324315ee3d649097786c063460f81842d261019582d28808df0c1a5c18300973ebd49820840200002687cdd4fc460df117cdd4fc460df11bfcc2a0fdafdd27fcc2a0fdafdd28385e6e6498d44931834cd70054923481cc14f0c40920070168825f718130b4ddd494481e547a66cd07ff9c6ad3e7acb5389535956c13bcaaf2e2f369bdd350351a07cbae19724f500031e2000bd240d827324bdea4aec24824301441100f7095013b3410df3e2a8c904504b985b4c00933521786608220084c918ca29049242d461461d00e440b6c386821be1cd86241443b4bf5a4a10420100001073220ad1768e840e8204f84c3c50a78ef5e98286bf549045016c58ec2a101c0c4322f4982084020276020001493e6ea7e2306f88be6ea7e2306f88dfe61507ed7ee93fe61507ed7ee941c2f37324c6a2498c1a66b802a489888e38c588880300080a5598e8a136c1622a40d57a843fbf6b52aff18c8c6e2d1b5287576b8eaa79ccfcb6e2a83179ad16a192a2e21664cd000315206802000705205a221300d0007e7102721ff98541fb5fba57f98541fb5fba4f9ba9f88c1be2379ba9f88c1be228702712486206402700500180a20e901126016f4fc83ae16e94767e6ac401ce511ac212f7484dec92843d7e340ad589e033df074ed966fc49a644ec0fe7879a82d1cb24071a000614405c2783022a8629471805cbdf3420633b5e7ce0c222a35174a209e98baf2c40206b40bd6100613515c70270c2100809d00fcdd4fc460df117cdd4fc460df11bfcc2a0fdafdd27fcc2a0fdafdd283820c00eb9777d9c87ade3acae0278c420b3bc1e33863060c22401805816daa0561ab236d88cd7dad2b257b04622235920914a084c1d98fdf94e9990942c7789c7c678b07228244fbcf36fb1c6da4c8f371f30e905abd0875945beabf9422885b13b4000fd0e8abc0f710780c2bc1a7f79f2286219fe566a0c125a24c3bd018569d247fe212094c601f3941024a51352ad820e66210d4508644061301004e406270030001e7226e2313605f8e0e1f23f408c81c380cb0cca10a22676f1aced43c301922b016f49048503ef32f38d083a2952e5078a019cbdacbcea0409c727fcc5a3f42000ac0b026a021260182a00ef37324c6a2498c1a66b802b5cbbbece43d6f1d39ea6b1572eefb20f7f98541fb5fba57f98541fb5fba4f9ba9f88c1be2379ba9f88c1be228706490986706982402101b2b239158a3ae50cd6f156cfdc02d325066f803092bfd3d4277fedaf3903d4c0a193a804cb80fac5c8777f0fa37441cdf22b026997341c01543c038dc311be538b005088f3f524a242dc5110dca15047cd35272a380f1007fd9d786c2183062d5d10b4fc904cc7cfbea0670c0ea7847c5a66c9c410085c078f2434b6c18c88a1164bff350417fa53760c1cbd937550908e8bb4f14602080d30e724109afe9614e0042010134010000b8900038d2000f026071ee2629614456d4da96482934d580534237882c4a3c1ec268cc71406161aba7980080021e6ea7e2306f88be6ea7e2306f88dfe61507ed7ee93fe61507ed7ee941c572eefb390f5bc7595c04f1884167783c491a61278e904684782380081800010068000f911330500d8281ec040006ea6441a3d919b10393fa7fe590020aaa3540a055f606988204fefd00592821000420780c36eac203a5593518702fb3e55006000d0da5524041f008000067913205c0f35e1718a40008a80c3b10010004246844639a89e3b5908fdb2400f9b048e1400184b5e78e02a66463b820750be6954c004001000012a20360a07b010000f411311100020b902d150980880046a481392fcdd4fc460df117cdd4fc460df11bfcc2a0fdafdd27fcc2a0fdafdd283800000088872721934d4fd3016ac2731463208c00000444e4e432696ad7ac1fe65d3e7b82164e2b1cde2202d0b0c80ca0060030003e8768b265774467bcb6815b1f4c71414e33444dab4adf3e88f0da25db56a9f075f1b676bae94ad6097b1d8c955e57e1b1d38136c638c4524ca61c628e7c9b94220140fa0a11c01000263912f2d097168007a5c8789cc4b487e6ea7e2306f88be6ea7e2306f88dfe61507ed7ee93fe61507ed7ee941c09219208c09801000a00800a0044406c26ef527bfb34045b52c7483ea8327e508055a453c6d3c552c08ed12f809ae2f37d03c9b455a3241364b18ed0405fe49c34ca3a0490e94000c6c89616c4ac862543b1291989206c4a027828d03)) <<< 16000) + 0x68f91422be131693805b01a594280089ca9d21802ab5fd4c0006951f8d0000261c20008610154ef5847860f05a9b4182dcfdc095120b33643e5510005837d687002cbedbb909820840210280dd86af0c1530d596b8a14fed0f5814001f0af7704810400100000d53c40b3c0ee8141e0e6300a1015adc0e6f380915b36fd090208002024e020000e9320f4c5e49070098751359a00b157d5446083c01003e01c000040114131707fc200399eaf88606f0f31d460038010000099224c0a0000eb3000010047830034526160811d1f4e7802e3c0c604024c16cdd2000f0040000324892828290040002604000c1c8920a844844000ce4705c4e0beae50221a360425002613a6cc280129a5d860002649aa4000128c100042c352c8fdcd182af1013c03417b6f294128108e6f903041cbb188200025142000808906800047081482800095081392c48c77c4037571b5901e3b37a35c40040010e2014556522686c07ad2f0101bec5a918220038a55af0e0008fe8ecb28010804000040887280fc906866995384b7846f1e2442c888e963c21ca540bf900080021e5003804549c2731937c28a18941de609e11759ded98811b9519731e00727378ecc00400100001293c407ffaf12a220839619d1a1f224d7a70609df275799c00254caf400020f355ec13021000400004ac8001ad9f094af11564b07bd51db4c7042ac719589000d3f61b009030800200001ae4230342441a07809044848220240fa1211c0500035311212983a8ec4806623e2bd3298ac2a72c2b4308e3c308477bad4301182f1cdcb0260979ba2403ca69534002a8becf20009c6078021a206d8b5cf401e0e1d898682440a4258d01ac02bf012020f8042470fd44029e70c02bf81628921f1f9a2408db0a1c1a2cb50012820e00400003b0d081b4b575384145b6c2411d814cc59358482c0f2d735f8afa0030365ea79a736995849762c3414733f751f91c8bc44af5f779f008198c70d68293eb0c3314f37b8f28fcd55076ee1fe5bb7585880e026a69867efa95e08e58145e6f62ff26f036b59477a301798800103f2edea12ae31237f2baa230beb3e64fa07d9505b66239aa6d54d7839933de47adf2887ed002468a0f54bc7808098a54807b01000274111e0d04206844834000e304474661002b0331188286c4102721a7c88ce70611ad1f7459408a6ca87e860e0a8ccbb96012d39f7d9400c095f720001941a735000001396100042c50012daed0a20ba061b84c0c3d1a2e7a28725eaa0eb0c307b382a61a0a25d349d4c043ce9c7a600138c108043cdd4fc460df117cdd4fc460df11bfcc2a0fdafdd27fcc2a0fdafdd283884100d95852c98d5c0bae5ddf6673d4d62c87ade3ab9777d90790d1050cc04c00b0000a4f8cf32596a9f63ad50c92befe7b6ea9e81861c271b5f891bf99ab77fc28de99884917ff16a91f2aad0bffe4de518c429a8001c79b14c96c0013033483082c50e92b9cce0c3e3fa08c00090507802164016b8944b179366c96688f00889f3002cfb5521605df35760009450740200001f041ec140003f64478841083a112190003b390008ed204e6bd1c3c76a870b1000aacbaca0c11454b0870a7f0b093470400f7d37e5002000800180f470fd735073020a5dc6082020042343d1c2996fa1f70c0242e87cd000384350c4260420008000095911d0581980c4140620803b063b15ed0c7052e4c405860435c76f48c0052a943b89009c717f5c200cd2ef9f00026182000800009a908c1903c8a81e0441121a0880903e8284701400091e442434002d9643c517e6ea7e2306f88be6ea7e2306f88dfe61507ed7ee93fe61507ed7ee941c511fe057619c8ec1d700312dc0244e6c0c7169971ff1e5c9600000000000000000826a9a7e5655605b2b0a5931ab8168486600400280200000e1d2955699bde88fd5d7fddbffdd2360ea7c7220489583aa85ba29933fdaf184f1ec3ce4242502800634cd366299f0110d10145da5fc0b5d766466ff581edf88db987b81f5a81c46b472aaa497221400149c88da483e9242288a0f805001701103f0d803487109c6184c80ec222c518a53f2fecb52d9d66c69f8485c301da0d98af1ad268b4e702a80608a937c42cc5f9d5084889c6410e0605d373aa5181a5856523628f22681400444846d3143980a7a1666641d344a0ae83da78cf7e5c16dcbcd03b48920030d29054f77396d30af57de973ed12f75746a2784f4e5f4c414e662083894b8e2d231a104d84686b1307efb5a5f19fd8fba900718f1a3ff2a9a5dd3b8f10d6d3ee00000000000000001f9aa69f95955816d5f2605265605c2e3e20f1c49e35e867a882bfe61507ed7ee95fe61507ed7ee93e6ea7e2306f88de6ea7e2306f88a1c28a29601000c0081fe4b774d843b787bc8c630d9d28e7bdc69688c00c94139302e58df9a36f2e347cb8357bbbaa26ab1ef9c0047c4935914643ccbab5c7bf335a81db1c14484c97dd14d556805f0cb405383bb1433d7b10cc110b53931be6ea7e2306f88be6ea7e2306f88dfe61507ed7ee93fe61507ed7ee941c000000889c9c864d2d5af583fccba7cf70427efb5a5f19fd8fba900718f1a3ff2a9a5dd3b8f10d6d3ee00000000000000001f99228a29c11610e10c12809982ccf8c0b9752e404610abe7c3d54ffa47c4d46b368868f90377a60eb5448490eafba254505f457c04c5050e71131c9c2a8ae18d13e324fca69471df5032a5c00559ef315950e600123927adb4316a1249400159c87898c3e8b604e5311a1d88c86c3e01740c8162b601c1bed841c82)) <<< 16000) + 0x82324686d4d027a1dbd68c06830a06a05001100095207c0200002384460c622e4b1162188a8ec450462261be1c06eb35b238f13dce6982401205e7680046204201080200802044804222021100100003090780588782f4d92be469310430f504230b000a875e0f18010804200002008000022386460298a90e3ca01830e1000556d673918210004000029c88704821c2421a1210c090858080008408850ec424662102b1071188302e008020080330188280c41007a3254b19ca0c37dd3997d1a086d2bc3b100155caf7e804820400100000d922062a10211080868400241fe0a0fe0507e8283f0040003fa43ece61f4730273987c9cc3e007654616d0e99455f01e1d81c0b9c982be160c2f15f210c097e8fedda808812961000425812c7d39d7c5ed2d0c840724381ad6a3f06a22f62c1425fe160000000000000000008aab32ab5035205800b050088d07a77f881f5f63980b43a5d72094502986b8e602d0e975c825140a61b18e602d0e975c825140a61a8b6640a1864043827003802004abdcacbdacc0bf2d61642cd57de8be131aa2439528b4b3cb70c2cdf99b78defd9a286aca8b6031f827cf24817e1e0374a01680751c8d90b9adee2b9a5a0bf8b58565f152c45188cb0746d87e9da31459866da2f724311b526962d7154a80030790f72107b0e83d4641e82a0f3110168683c824000fa043c5341e0920a345077a283b814001d7e40070c4c8d31d9b3fc73f06a501a41692664b0e30bc9da84dd7fb996d0f057d4f1b030439495fb5ce8ffb39fddf227f8730a03f0fcd03ff64fcd182c5a93e4da082001770855f3a88d6f03fad71d31364a8289dea7efb435ede42f9bf2d7ce6e400ba0686c75ed46b085f02a086ece507d7106a593274b8620e44971fac058fdf113943079b481888d8dc27000044320049a24037d30c46ab55d5751ee7d5404dd689821c4449ed7f3cd589018e00000000000000000fdf33d5e0f184b928cbab306cbdf74b6e8d2fabfee39a807c4800000000000000000000000000000000000000000000000006221030c11801400400100150571b3c1c4a45755aa50d9b4397f5f55c8f275cb2985223361c6ef4b2a253a0992e88965c0291f065c1e6e4fb0c010e7e90bd454fa66b9b984bf6ffb0987e8a14289afd1c94d01008c336bde972a30fc1f33028956a9aa712cbda001798f72ef82559a02bed0004bca3ffaf607f7b193c6debedb03ff3f7f2befa71cd8f993a8b9fbda2eabcafa7f4001cc4807475901411c311398f48c26ca6a00b1f3f84169c110537211bce63d2309b29a802c7c572c3f80455cbbbece43d6f1d39ea6b1572eefb20f19010e10a1040880000051d6ef8aafa15c12b7e5a561297f677d3fe168be75bea886010b2bd716f57c3d5ceaa3c714a529507a210c28086bea6d5dc5a41c544a98cb9cdcab5c38e18fad676a161695c529c6094562272721934b56bd60ff32e9f3dc108a6e42379c9c864d2d5af583fc24c3b480435cbbbece43d6f1d39ea6b1572eefb20f19018c18610e00a00600014680a20010692fc2784d2687b08ce5ae49fee1e2be1d78042d33ab0ea4d8e32277553f9379f7a09afa7d1a98c2d498b01870518aead6893fa308384cf9157fdc33d70ddf346473b5f19e1060d99d67d8b05624e990385cec79199e33805523b0955a0dfe5a7f618495efe4d5fabbbca993491b9f83a22670a1c9cbdf2225c392d03d0808fa5faf8d3a9ef7ca7bd5070d39a8679b10d0a4663e75e4324d280021579ab606f67022773d60570fcd151a6ebb94505b40fabef1608103cf5853a572b129a9559c39d8c4f03785f365687f44a90c344b00000a584190d400116a43b4e61d84b0eb1187506c3a4261d00b0170507382e020969f24a8838401d8722870508beb3d3197100c4546379041803556797eb228008fe95d5504006719869f72800d03b976520a0018f62d2828000e376f3f6393275827018444e63d2309b29a802c7cfe105a70440000022272721934b56bd60ff32e9f3dc10b57c98149958175cbbbece43d6f1d39ea6b1572eefb20f21420e20a0900080000081bc8dc0cc0d52372788abb55045e125e0446e7c2dfb439a4dd1adaad4ae023b38dc792ca85cafb0f5a35d6d05af4cdb9e45fbf537f4cf0053ce732ad916ec7a1e658f132e7812487497f2ca24006a056e0a08045369f58000129010004388000001d4c02c7f20d54ea52344275aaa38432437906a8a0690c3216b3cc1323401f957cb61b010321870a00800a80a0001823a38981925fa050c9e7670fb210201fc2c41344043f59d4fcf0413998485a541804c0c900f0040438363ce0202051c70980500c40a034010000dd1080158730ae0108f182e4b7c5ea00000000f219a69604308201c5bc7c000e0816660c48a386382082380020081630010068000af907d1dd911c3554d12450a4cc4cd8a297993a448c00966a65fa400287c615a040097c586aa004c3042010c2c0000019007920000012c0186106a39c961c28b65c08518c104e3ecc2c4205354be4478381039e1760a9c024df47055412204094041e4abc779b4184c0fa1fba9430c66036c92015606c00204820400100000d920a8020002bc21ca1be2000000927c0163da9b7e39064245158e5d35fb228a0adebba0d20505ff0851f4551a03bb53136dca1402f7ec1832009f41c20ac0b1c449663eaa2c8cf5e0d1248a0ca887589048372e9f1002f7023a7094207c0200001f84390340ec1a0e3090710083840400065e435437834f0043486321d54b198ac19d43e69ca048c2)) <<< 16000) + 0x6ce214493c1ec1c309b386f40020fb061d9f8552a7af29307004d7eca7e3a6f4e100852c8ff5166c4043f29c1df2fd87f20084a7be80e50720d0000269214c4a0a41105186800292480084e10e03d86f88c05c361bc03b162642a69d586fa40b5b7afdda295612c20d077c223997e120297361c374c9447024093ebd8ac3ce2801b3dfbcab926b100797e3271fe585800ff5f1b280506c99386fd0a201950018c81a3981a82c3c92db2fe321849ccb89e40c0807c534ce50416b10534340164a08771200d983c53010269f1c96a80138c10804205000000b71b0034908bf0ee009527864918f6f7763500a2062a2b0adb1e0b26fc421ad5d3c0350f6ea2d1ee300117e18073aa4127103881781e205366b522386140397d81630631e33a37402a60a627f9e0864f48d44900541989d0013081080400004e081f008000cf080d86e0108f182e4b7c5ea00000000f219a696043a9e20d35051badd00d7fc5b7c219b51ba0fb5d6795c2396c400000000000000000000000000000000000000000000000003145bc7c000e08166792612704202700d59b6d0511b2c61525f30f02f2144c4952307fc091a8d76f92bcafb86c0c5fde057ee1b9da88d012216d18824794f3bda343e30cb3d115f132b8c2bd30a80c2fc47f034e0ca51eb5e850930456f92f8512ac73c320ff692594101d3f0e8450853958cc220330d93ca4180103c6f6884c104201000013321b41a0d90d06e848360041ae020006b63c42cd87b0648103cb83ac420628f8a7862020a6269eb900965cdd3cce027ec4eb603809d6322a2002714210086a78834d4146eb74035ff16df0866d46e83ed759e5708e5b100000000000000000000000000000000000000000000000000c50d6d91925ca05b57c98149958175cbbbece43d6f1d39ea6b1572eefb20f21c4164122100860106ccb993375f9c34c2936f80ff3f80de3ece50745654ca224d6eca1cb55f88d547c913b835152a22c163c2f9fdd841adea685b655fc3aeb1e6560f424f618fa917554683bb4ad93eb9b18726a1a7690d0d80106b8080015b486e0c8358441661a00072d21aa23d4f1069a828dd6e806bfe2dbe10cda8dd07daeb3cae11cb62000000000000000000000000000000000000000000000000018a104038b78f8001c102ccd1ca18204c00302226c94c12b4fefa61752c6a5151eb9dc93a27aec82b593641128868d546ac5211198b5b08ef600970a320b43d5d94864c2a3a386919fe7f4e60a11e66b5d4f1069a828dd6e806bfe2dbe10cda8dd07daeb3cae11cb62000000000000000000000000000000000000000000000000018a1adb2324b940b23472872030c22010811c08c2040be2a45c976006e074cd70ae292ab41b52b4a4573e6ee0dfca75566fd8b03740bbd7bd1642fac3448cd5dba3ed29c6ecd1b93498f7e334ca8708f837280020c90d30d069068344341a01a0cf0d067028334141980a0008e8200380a4074c61b623b15ac73182f102cfdf990182c18e12363c430239efa4da09003b9e66e08e05411d3b381007a9c310461005a35aa69840112812f3af00d8f66c8c80c83823010572eefb390f5bc74e7a9ac55cbbbec83c279271261278a604504782400080800192001006f8a0000f0d2c385aea6c22449e1000000bb80e09952141b46604000002ee03802fd3bf4b92089461c2501401f0080005b4f1046f8f10c2583847aaf8d171f99a2177b03694354e047444011eab2682736b1725ce72c10000016e360060408d775f878914197725cc79444e21c70b40d01b0020d70100011010b405c0a30f384e918d28ed75b12484064900d76db9009faa6205ee1c207d9327c70d0458ba662eb0c10ef55464e4901191cb9a261c0099ece48b020338af22358000f286098061992328ef06605d72eefb390f5bc74e7a9ac55cbbbec83c489681671688e5888868024008181001006ff98541fb5fba57f98541fb5fba49b975737b21fbf9b975737b21fc00716774da48b20703d81648a0a9225a05962221881200a0021441bda36c91c169a29c2af97a23134ad83de155d5aeb029014f0a4690953b55b36d7c6bab416a561c42ac92a00060c41e8040008f86b9777d9c87ade3a73d4d62ae5ddf641e140a3ca34a4064022401c0080420e602fc8a672b876f8cc8c544d51273c43877028ae1d589df3efad74d2273056555a9749844ea4ec08efa1418b69000bb3ba6d24590381ec0b245054d028f28d29008204b002f9727b5a8a7d6066c77b9f4fbbe96b72f4b6dd5a40577a1c1d87d52aaab0a9fec191a39503f0103d008000b1881e0a8001260fec1f9867ec1f985b2ea6404c80ab846041a9e20d35051badd00d7fc5b7c219b51ba0fb5d6795c2396c400000000000000000000000000000000000000000000000003111e49c49e292108098004010cc31e5767707bdfe93dafb381d45255832a0580232d0916fe72149a959a4f16bb3589171a13638c1b5673d221e47a99edd2b8319b117834a45ed4ddc9c23fce6be4e52aa2aa9c4ffeaf07098484083a408c181b18b41061d8ec82fc140a86ab9da8809e974f2c8ce104001000015921b41a0d90900d828360141ae0a00065b21ac2a0b31100090810d515ea78834d4146eb74035ff16df0866d46e83ed759e5708e5b100000000000000000000000000000000000000000000000000c516f1f0003820591a39839a198104098012c416100a006fec1f9867ec1f985b2ea6404c80ab846041a9e20d35051badd00d7fc5b7c219b51ba0fb5d6795c2396c40000000000000)) <<< 16000) + 0x0000000000000000000000000000000000003111c41a41c21a1861100960020060200401bc460c994b19a4721da6191640455894892400766f2b9c20c91adc59210a12aad10610cb47e4904e104001000015921a81200042f21a62a0d2110688883404419e220ce0906684833014000e744007a4480105490cb350651083247419012003fe0218e0a00550b200aea243198618ab3003016557200596f017447f815d86723b075c00c4b7009139b031c5a65c7fc79725800000000000000002090e20818a08808c0080200201bf6afb1016b1c2973a9aa2452fb4a4280c4bcfa09c828007b7a9c787d731c08a9f71713a511ffb2ecdd69c5a7fb5622297e01970f322bc982231b80fd82019a6d932c093bc43e0ee370103d117ccaa1c285beca8a2412930cbc92015563429018022a2daa40801c476f260004c8540a6000a06080021c4e94efbbb103121ed9941c215a7babe24108ef1fe61c1af0ec4f1940080020188020c30106100830404180020bf010000bd10be1d85e8ac2f0461761b0ba0985c82c2e0160f00b0b70185b00f07147ac8fe9439c0ccb8d0718abab67004080d1de41d30303f3a8f0941d731673509043958a36818257ab4ec8000a0608402016a03c1c18621d421228732bfd568e6c711fe95cb197128350e8b5e4270904646ff702860c10ee5ffa12101049d35b15d702c0a3e193bc200402e4a0a9cc9800032091c2a02800010e90b405d8c004a9b2e48deabc2d3c386112f6a3a3061c13b3ba5841896d6d2484a1b22d3800130c1000402cc44164120b1098000ba10aa2584010c1847723044cb3119f3461460b6c14e6d0386a9cae83c573183856b1bec899921703a3665ee6c504ac69f1c26f01822cf58b5019e20011c44898e760400e9917f0533000000fec4961681a287226c5e8a8050a0c67e082e0710f787783d7141a834084a6634226b24423aa584096e67d9048081d8211150881248876bc8038069e6db227c1813628d43a40000914384e038d280fe2d33651048d5bb7c1c4e16a98de981857ebc6e0a0eaec7eed4604313307de18220e10fce8004e30420100b0050000be90af210570e82b464000812417814000cf842b0e742883b9bc4102dc80163510186ec20da8a1496261ae0c080f988608a0fcea4841cc00400100ab0185500c2a4060c2030a80185380e884a1a0163203674b51860a15864da6306045f27e9e648026c2568b1c0007b62f8880157402824200478a6a6e00140c1080400006508530c8294540fa220a40d051848288141420a0a0050001ff109f3d00084f9814a7ee6be44051033dbeb579870a4e8814481c609c81ac0b394207904d48166c400bce1b520c8302184c49cbe82018f06d5d2bc001741d27855881400391090500480002142002db842794613aa209c5184d84c268241320391478990cd3242883af10f42e12400261a4089e8e04428ff2c5b06000905438d6e100039e57af3f45001414036f5d8d3394473281481002604612e1b09609d853a75e76e3057bee86966805fc6bfb64003dc9574200120c1000438a0faafc3928399ab77f61c30a677e970802437ce77000380990b42504200087141e3b543840a005565d65073f85849a48408a2a584502007be9bf280100040254040002244250141260209201048808000a0083e82ec24813799e182e911960534126cab4220230c200087961ffebc4a409c8935e9c60620e5867420277c9d5e678009532bd000083cd57b04c084001091798715ae040c5146d37d008bd11291c508ddadd37100039b812865002000840c0622d8d93052cd0fa92245b76c5e804021daa8d809000800200001a440007a8f9608ac4ef23c8010c5e97102300fdb6a8306f92856c2780044ab88f3000744f01fcc0042010f2c1cddc7a4b12d7cb7bb88103680f4d230020008000052909001000102100054f211e1a0780904704823424000cd24230761163308a1584488c2203610e1308605d8c239245c22aa756d1852d20adf87f87223511f0e9ae95d201f942a1a4b949be73b6bd9bb3475e488a0d5ef43e1fa90cbc42d83c701eb8e5c93459a0c628e8063df074daf75fced698bde676355796026082c03bdbe75cb0de9f2c336e7ec5f96cd00f507d42ca3300026faac79105fe033c3b41e8b8b0dd86bcaf5ffad1fbee82b45bdf9450ca982e2caa4bb756d6cf381918afcd1b1e6414c62a458826d4a3d85130f3e8de961099bd3120023141f008000056107b01d8c13f1c4f2b0c65df860073df543a58c231c87235bcee625b41302602e54dd23f5d40fee34a41f8e3b53cbb2f26160bbab436a59804a33a2993c551016f83027a8dfd15efe3aef504988d3c6c14c3000f15694916be4c4d22c9c843ee06887784b90ef8ddb1e2e8e007ccc66369e3c04954ccf6f6506cb0debd59108f8d49b8dc60af56f7f3af4cfc19b96700547c245b6b4321ba4ba9905314a8182a011c87030b46129c2981914855d860425d148b80120a0f004000034cd8842345e9c0a20f41b7792584026a7098880c73e4ca7a580116884d014003f4632bc00130c110040000504800392191236f4968ceb3ce9071719d16bde5a860a0c4a621667b5b46b266ba1955c0eb6a6040d3f62d27b358fb25242cd1ce07bf0908f0350e838fd8f8becfddd7dd001446b0e002cf94f1ecde98f3bafff4faa6aa506ed1f4886510826ce86917c444047c18003d80f4963d207050bfb5124cb110a59ec921562e0aa24041b00850a19fb0ef4f0728be96b1409ba926e728069a3180e48083e0100000cf2000352)) <<< 16000) + 0x4214341081a0830d0410681fc24000abe4204861003b03319c842714e77c18534cefeda4822bd77fc4182c7eaf1a648036eca5d600004a4840010888776ca602f4f9dc3cffcc1c3409e092843255f4c52f19f0c36a8156af9302932b02ccb1cd08908d0480410402932f1fcb76004a0739de2a824e9f86cee322adc0746321b7d03de1aefbc3534218e3ac898826c7da0fe0a0002c020fc1a0290500020a107d0de0eae0b3724809955c4a9ce0130b10530900481298f400235a6293800945080021108114caf528282bffae4a005c80c210404973d5924001e00840000401000004470a16781dd048322b66dfa280b5b81cde201c1cc60144808400100000d220f81307b05d06c5c57e0580e67b434101bc39e871800e004200002008000022207e0b90ba067cde3001686c4b8b012f0cf3f23041e00803d0080002d8f1806ec35786067f687ac0506986acb5cd000f857bb8240820008537211bce63d2309b29a802c7c572c3f8044d5f2605265605d72eefb390f5bc74e7a9ac55cbbbec83dfe61507ed7ee95fe61507ed7ee93e6ea7e2306f88de6ea7e2306f88a1c21421210e10a0960111bfcfff09ec04c03c92e4a0b0b8ad9aa6df0dae394bd75fb02021cf4aec991d50169dea125f964da4f01661f23c472e99ddda31c56c0d1c53b72dd602847f1cd40011e48002b4100073f20012f040b4660662ba14ea4759f0c2bfa13a22601b3241800700d843b278005e8c88be000094807c02000020e4078940f2420781d01e0c80745400189c405cf40046ec41dd160b48b0174582b80f10b9c156ca00bb0e1844a78888d1e3b031278b212d9a48018856442292edf353c00000000000000000116258f08f67ca2a67aea4b1949b92e931da03f95912cb260ca93d00000000000000000045ff30a83f6bf74aff30a83f6bf749f3753f11837c46f3753f11837c450e10c08708900500200026e234719916742fdeb42f7a71d9c389f0e63129ea3f53ffb36443c023698409b88f7c45fe99545b44baed153b6ceb824be797bace493de050a2938156e8f88efbea96ce9d29b6656e3373ec6659af5b09ead51003e12a4fe4b1a0a3aecacd0760583a80c1d007a5044639a8a0335908fdb1a010def179920024710db0c028a0c75804076909c7ccc004001081a4f83c63a010b5a7c5120006a6851b3001f0040000509c420b3becae0278c87ade3ab9777d907bfcc2a0fdafdd2bfcc2a0fdafdd27cdd4fc460df11bcdd4fc460df11438230b34a406402341281180080c000080360635e433a81445c56b4e5402c8d6d19e3417603a97128164ab203814037658cf69800800200002524000cd883984c0d8260680b81a0301fd408169552929180bed6448c180033eafb490107c0210309d5fffe8810bc18f6aa4005891418714042fb7ad68404a1b9a82894108402000020840ec260e40ac2062aae1f521411bf04746136cb19d60f0d36eb7be08096be99758508892a3b34804af680e167002000803880f8d005088f3f524f30038dc311be52880b714443728461018b57442d3f3c37cd35272a380c0c07fd9d786c2201331f3efa819c403a9e11f1699b27104021701e0000800f9ba9f88c1be22f9ba9f88c1be237f98541fb5fba4ff98541fb5fba50714cdaa24c1cc98d9579af40ad72eefb339ea6b1643d6f1d5cbbbec83c648e70458470238218124d954dac3b377a702ddb20143088dd2b3ab8b12ae78a4b9b1d27022607a6fe1273c986b4b771bbf3e1fe72c8af4c04c0994585070058001e4180c0e1f23f408c818380cb0cca10a22676f1aced440301922b016f46828503ef32f38a043a2952e5078a019cbdacbcea0809c727fcc5a3f42000ac0b00de0303f0101f0080008888004d29000bd8205a2b03311f08ebbbe34c612b7f29450c126fcbc490c2f87dace0482746acad8206072ff17820da138e944270c1f0080370081b405a9e20d35051badd00d7fc5b7c219b51ba0fb5d6795c2396c40000000000000000000000000000000000000000000000000314208078841677d95c04f190f5bc7572eefb20f7f98541fb5fba57f98541fb5fba4f9ba9f88c1be2379ba9f88c1be22870848a18460240028087246c70485adb5d2cc2b93c19a95ffec0389b7b5b6261e74992a2d1f9694813494c87b5f6613e570d3926c32dc67b436ab9122bbd4cb72449f1bf2060bff1a013e0a9ab0837e4e384cb46fb9a9270d96c19bf2806397905e88aca22e4ad59141154314a38a02e5ef9a10319daf3e70611151a8ba4c04f4c5d796201035a05eb080309a8ae381386108040150040002ee4001f6c8160880a40400133c409c840036c041b0b609e5bf3753f11837c45f3753f11837c46ff30a83f6bf749ff30a83f6bf74a0e04918608408704900500201501d20224c02de9f9075c2dd28ecfcd588039ca2358425ee909bd925087afc6815ab13c067be0e9db2cdf8934c89d81fcf0f3505a396480e3699b5449839931b2af35e815ff30a83f6bf74aff30a83f6bf749f3753f11837c46f3753f11837c450e08c24c1c714a10c005001014a4cec0d362adcfd6db78c9e7e7e19c96f94e3e22f1e3eccc3af8f02f72e7c11e647fa872fe50b4d96d5710b2262e90568b310520641032388202853f616c8b1435f661c4280b629d115080e06183a6a4c104201006b01f12319ea5cc2475adf4710a21c87172ef8c04388dd1544828646de854942084021239bcc5362005d870c2253c44468f1d81893c59096cd2400c42b22114976f9a9e0000000000000000008bfe61507ed7ee95fe615)) <<< 16000) + 0x07ed7ee93e6ea7e2306f88de6ea7e2306f88a1c19c4923a219809209c0491ceefd82b798f0051d26e60ff79da23c041b5ab4defa8d72af70c4be468110b423cc349ecca6592a34a82b6b1e2a5bcb96f20ede40a39f82905b724f377c32c1a855bc3ea662c30494221400139c800304100076b206803a66d51260e64c6cabcd7a057fcc2a0fdafdd2bfcc2a0fdafdd27cdd4fc460df11bcdd4fc460df11438234a2062c54031023401805a2183471be1b27342c996c5bacc945b0976b69d562a7afd4e19b4a1ebe88c0d6d868a458583ab29461d34a3865c93d789075aba672479c6127093061baefb241c27791bc690c1fad348b54942080021c493a21723c91d01b8913260c245fb05d1c2316cac26060c56545300e001c86a5dc58013c8d8ae19c20840200002c040009f0e900dace0d02068c4875e3202a9d9b19f8204b26920a29204108043486538d84490328f979b85016a84ad55a58202c7f5b4201102b5cab040d76415080d006ea45a14338410804000058082a0080009a481b04800213881688c0cc37804de208cfc1a2ed090800aea78834d4146eb74035ff16df0866d46e83ed759e5708e5b100000000000000000000000000000000000000000000000000c5fe61507ed7ee95fe61507ed7ee93e6ea7e2306f88de6ea7e2306f88a1c19630c21218409600800810cb73170b73dd981c2e2d28f2248ba5144bd68bf79f0e5f61747db84e21631bf17437936cd551fb97b06038fefda7944ff76c4c3521a9d4a9b60933df2e245c6131e72514ef2fef48bd77d2b64a4930f5e1b6bfed007003630cb6aa76c64a06ef6c184fa68dcec383c6a93bae34147e988c6241159d31cf041b94166fc402614200080350080005208160680a404000f40409c74003622405c34003c9641a4a40d04a067210330e81946404e1a057090020bb90645500381810270948aa5d2c7d837e3b1a89e120dc1ecedb57563b2b8703810e27f20f140b271bed8c0437bc4e886f2d3edaf82804d7d4a8df6d8eed6d90800ac8f1044061282d8708a0084cf3106afee22e004221eeef642bd2c7da1e6481c4b3f850cf23ff4ab4494cedee9ed79931282b111398f48c26ca6a00b1f3f84169c110365d7679e4154275393c066150b154ca8e119530e98425d0000000000000000080d5f26052656059b33eb5b70ac6a5418cb982a8206302480400300002480ef9091f5d4112731c27a2767c3b8952fb0da2d12326d6914a4fd1cf8546197761b80eeb83fdb31cdc524ce7c86641a4ceb1ab75b574fca624de0861c6a75b159b52d133d2f1ea4637b11601f54be0b0807d58250280118c0f804208f2bc7a450b180959ecfc18619816cc690006af1deb7240422008490096b239d90455493ada658c01cedce50208bf0fa93e5010880100001b460704b591cec71eaa49d6d328500e76e72800002e795c92808440080540100007790630980104f8c089d6b5b061ab287d0241220060e3c27104010d3aa884800014ffc3c094308c0200c4020340100009d900045a20c223e10adba0d0380aac166c02062b58cca0046283c0100600502f828178140001ce4174940b83a00066320b66305a2d82c96c160460ae03c080dea8625aec26a46283e0886311625ce3a446b9817bcca563f6a11dcd2f5e0a104eaadeff9bffb60d17e8741ae234ddc5e3e634f0c523236d58cfe375d9930280e2e4b4fe5aaf735543aedda49dc99be6dc18c7814107519d1b2e99eb37b0a4481e786b77518c27e32b4ac35b3426cf5e4ee46732fa09f2fa7d291d838e1ae6000483f2f12bf9a09b10f223323d429f68b512a7fef45d5b7df78ccbdd1e73329b07071e9f9d486e435592902e19d777c228cb3af832b2c41e6ad95ca2147b9b0208cbb389500c1249f807c4104c4c7b2f48005c7740c32404210084000040100ac0200003730000100402a80815004000098414c2606c1390034e0bd20c0fb72defc22081e00801b8480d404068020000b820661ba2d0298e24b7440d7b263729bf693a6ebddaf8e7d3eea9942b43c58b6af2b664d59741084c07d6c03255919e81ca855ba0195a082400192ccfc3b0a96234313afdf58ba550200be37980145d56ffe63f6a2909bd395cff10ff413834aa2c3232947343e8b4b6f913e744089b5d8268f838ae8bfd3cc0e40d2abcd08982f6562e50ec6ed03eaf059b9810448832dfb660689078b465368a5a05355bdf94c175597f56afc1d6d9bd2dec1e2dead294b6f2152ec546f97a5e9a5898d24352bbff55af7df43329f12228ff1fc873a1c06c0428d011885fed14617af0195a9632a569082cecd34fe9cfae8de82fe501ad2d63e42901a52789da8e1da81325b51cf4821ac2d59d54b4859724e8486e1cf1090e3f800ac0405402029010004669052210288c8002ed082816c13ca609c530170df181509a63877e803c711e384147da35cba5ee94064830123efb2ed8f9828741188e0802d1628730232df89f8a00e0a90a78cc71514051c4812d7d1f23735e986a53f4100335d55796c307008dcc8501ebdef0ca3cf7210b835ea8fd95339c56662705582414826698d1342d1c32c7eaf5818334590a72182be97566244015a8def83800ea4e14925042000878c020ec3b6306c9f2aeb4305937da2580831c325489200100040134040001cc40fc17c2802f34c48a13bc920020a0dfe84bf38200e34188312021000401301407c020000fd207a2304b1101e08c0ec460941bf185736483d1087b6aadf42077eaaa7b51018a204464e002f0633010025182000840e5959a1c430)) <<< 16000) + 0xd136aef31100342de28c8c108002112004e7507d3141b89e07d31042dac6d040e0cfccfc89010800200001a84124260901204705d0d527fb420c3ceb5ca24e0422ba2544c0836fcdacc005cb47a240a880f00224481b161aa834cd571da829d36b6f9c2c666e3c882320238812820e004011817049764a3b05002c20ac0b4400183079f380073c8f5009020800200001a841142400040a4000c64800284104409e07b04660b860c593809c900b56ef5c16030a5b21c812080f0043059e717fe205ef5a29488106c0200860b811a18f5f098130c19b52000b06e3166802d7afde848103c0100000cc20841200018238650239ea0c0e332198c6824fa71e4400ceff95696013fe9ae425081d00840000401130321ca53280019365c434028d096a46003a01000009d20840a0000ef20821b04009000113103f0101f00800136480059a9d100a2b91c0a0400af96dc402063053f88c108002007a0b03c0581d82e07910366920075085f22041b00801d02e07ecb9334880ca4c4b23804f939f418006885c34b015264a7012840e80400003c0c010040100740bc0de233fe9206330b888f04ad0c82cd052011efa4001c0086876ea289c6822488ac6780f984360600af4f9c52000e004000030481c8080006c880010210003ae2070220370901b0280d4140680a00051820662390463ce82fc2050365d3e0106a3168fd840192b2fe703006ea2933112510200084010040100640b829e637ce4381018cb027301044dbeda2c10f861b659000800210533c43e48602059cb4ba7000128f7c660005e849b058009e451352801000400003ec8180080007e8d82645f6db880a060b9d6083df3739f1000712527a48083c01003105d08e854271104ae7ec88c047154bf0b062229ce680038008c0d859f8a980d9c8d464405250510700d240d18b03851b59ca00360100000e42060020001d3200059c40014d48178880b82405a1202c090158280a814052020006e8200366040a084003d84409c340062464098140079a04094f4048620232d0111480845400814c402cc588067381f99eaf078c25c9465d598365efba5b74697d5ff71cd403e2400000000000000000000000000000000000000000000000003108a18c10c08a0880860040202080e7bb8425ba82665f01bcfa69b18dd9e99ab7d5dc707176ffdb0f8577cd57e70d403dbf87136d3182db5a8afda64bd47611c9abbeef97d5cd3a0cbb4c0792ea0241c27419fc7b33bee31164d43daf5df75c8014000000000000000010511aad5755d47b9f5501375a2608711127b5fcf35624063800000000000000003f21841821421401000c00051428c9c3f0dacb56c8b5e19b5decaf8a2eff188cebed1a2128f723bda2a08899809d237dfb7f93f83da4a37643d4baa381f24f8a4d42f7bfd9905dee602c0f706098c434f1bc54ae445ec61c38a1e45f621830000011e81803a3a13e5b14000000088810000fe3b0640051498a0900214543f96636d0510106fa17f01431684691c90306000000da4160025d49dde648005cdfc7e510000000023d0004e284c010b2fd4c09e71645920988ca076c2c73dcc66b3120e20000002dd20c000db09d666650002f3ae90e32400000002cc401470c2901479e2a53d81d638eeca4cb15d1c600002a4848e28d364f9cda10427cdf46e9280000002e7b820000033006ee004a008e3119e185b51e50000004443c524734a1f07824b1cf271ce023a28a9d51a00000004b0b001180200004e8f9e29441d5111a871dce9206d0c8e0794000184f6c90071467351ed4839a104270f55bc1f2860200009402591250000000e950c8e1000002e33f20ebf42000c00b1fbed697c67f63eea401c63c68ffcaa69774ee3c435b4fb800000000000000007e271879471469478a48a602701800010068000c510003af3cd5a643655fc170635dd05400034e332cdc2d9649988876ddd41c238e34d3893492042c1041240c00008037f7dad2f8cfec7dd48038c78d1ff954d2ee9dc7886b69f700000000000000000fc4d2ce24d24c24e10810b04d030000200d00018a204002000315200138c407c0400172674fd204246eeffc755404dd689821c4463bbfb1563b11f9280000000000000000403f7dad2f8cfec7dd48038c78d1ff954d2ee9dc7886b69f700000000000000000fc8a20b18a18918514804800b820080370c0f5fe43fe8b2fedd22ed102c9000001b7ecc1c00000f1a72c734da381290908000002cff1c0000001c89a70026008592947721812b28307087f3f5248b41638a9ade3d60118a1c000002dc6c003060b54535e9c35242087f3eaba8741604e0a87ed7f8aa7103801881e00007648001b9901e0500e828070040360200066e20341ba2a0bb977df11440000007cfc2c6000001895050c34da388a94308000000f00020824efe3c6a180000000e44f38013804367d21abe118adc641befcf908973b931080cdee5ae07000000000000000078251058c50c48c404282082501800010068000bf9a2a0bb975644144000000847c2c6000001895050c34da386c9430400000168002081a244553a180000000e44f380138042bfc63c1a4eb3b30aa9ce1a84f0f023c5feb0365b6ccafe00000000000000003e12882c62862c52020412800c0c0000803400062080019490190500c02805c1402c020150100a008001b888098a8006b9c8090080071ac80108d10113100818803cb401c5200d2500610802c74014320091500408801c3400c12005010020080098c8801b4800844002020000100ad3f1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase15" = "QuadFullEightCase15" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase15 private def zz2294:"s08f6"="s08f6":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase16 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l17 l22 l27 l29 l30 l31 l33 l35 l37 l5 l51 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2cb417800, -0x59682eb50,0x3bf179b3c,0x4b0], ![-0x59682eb50, -0x2827830adf,0x133051ccbc, -0x69b881f0e], ![0x3bf179b3c,0x133051ccbc, -0x2e924a86a7,0x98c571fd8], ![0x4b0, -0x69b881f0e,0x98c571fd8, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x10432593f,l5),(0x2dad16693,l8),(-0x4586cb6,l10),(-0x23b68afc,l17),(0x7d051865,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2e5a8e55,l31),(0xb121f7a,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x2dad16693,l8),(-0x10432593f,l5),(0x2e5a8e55,l31),(0x7d051865,l22),(-0x23b68afc,l17),(0xb121f7a,l30),(-0x4586cb6,l10)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x110f014c0200000000f01480200250982402d0030000000780248030000000d8024803000000009018802001a01040098c0500000190901cc02000001a09018c0200001b024030c030000000050188020000000160148020731043103250048408608c074900500002b8c402cc0300000000340c80100000002b018802000000f07028c02a210618803c500500000001f018802000104210120c0400000002301880200000001d02c80200000001b01880205c0a01c017500400000009802480300000000e014802000000070024803000000012014802], #[![-11, 22, -6, 0],![-29, 346, -249, 0],![31, 190, -177, 0],![1, 16, -24, 0]]⟩ def dynamicCode : Nat := 0x7160b47c4b0c51107bd6b7a060ef8883840450cd95c0d0b860850aa92a485040d107d344300000000d6c42710240087160c583465d414415ce5af260c80c01521c19ec14315ce5a9e00c60868e87708441812c1a2af86a88001570997b381808668e635c584244081500e0000774e1ae00618e003860ffe2173210308b2987880e1112f8fbb1c408336b367ea1020b56b158e006614250080000a81da0741b9a1a6a12e0ded03a0dccc0000000001288a18818c08808608c00a0080000e0600401a00025e4070740361201a0500c80a06039d4a728dc90281636ca001e870b032f4fcd290304400a6d216631420c65d7d90071000796583559a07016f2df7daf1a2800c65d8131b756e02ea2d9254a68082d02c475c9e390d1e79620a88c29018e19210610c09200c0380401006f14513912a77f3b41844cbfe378bc6200412d6f08cbbdb0d020333948cc98979c0509b018a5dd5b93c0c124d39061df96005000c16cbf413de1100003288050b6a8c10002b0004d60caae88f04801b02a38c48438448238208210008000190001006ccf81b1406cf968fab7a2a4376fefb12fb0b44514410708208704700202e000200d00010b001800037a0052056fe7f7547759e016c161f8c2f504443bb0e374a775325450855408f7861d5674644408302283ca8f0afc85a68c559c20015fab5901758423e17f6d8c004ca06143d6ebca9d0706400012c0d7793f788be4c31e9982f31f64b21c700550d440a310a70c4f3f2a8c2cd86eaadbfece6408e0d4fb3dc2e898c2032ce377ba742e306731e66a266f89040819fcc6c93231808204ad7e69030280200021840034d1ec00007922008fef3a515b212006c0b00002870008000b520072466ed9e48a628a04d081c6091246350bf690232348de341020351000fa300055b88f126002300800009d9000b8f20018f47080136a54351833f5d43de80a08e31e29290700000000c8030182e4db8830800000001902cc104a010018010000af90170d80b06c054360281b0130d80906e00645c1fe9140af226de00805c9bc4eb041263840008011017080b0501bd8e0f2e4079112800a753feec0800ac01eec8090308c02001c0b00d0180600ec6458a8b37a58ab2b8a9d4cb11f176efe4160689aee79590008c021a5b3a23ee0f2c61840f2cbe58b0f7c6ed808002f6600218e000ff5410994008c02000021868511daa5e5250925ca990b07002a12fea98c00549278dc24042300800006f9e2806ecd08b2439e327325630016f8527f0500096dc80604810460100000e0202013a28d5fca492202a4350c8765803feb7ca1c40031987435884820460100000e4201e2a0005223036545193800297e721e22041f0084000040114519168a3c301790efb562001f00800003b10000b3300801004000011100e0580680c0300781fc1035e020c460780100000a840008bc8004541932202dbb02775d05270c7719624ef0cc744783d22680000000000000001d9f81d9e300767d74149c31dc65893b968320adb8383a00000000000000007640ba700e3b9fe168147e332f45c6ac24af3ae4ebb9b8739400000000000000000000000000000000000000000000000030000003c75f442d470000002a83082023803001808823520010068058080011688006ff9001eca3c6611da2ed0713aca0b4451c29b4fe9b44508d6b24c031411645567ec40071911d1208036c4eec3410029afb0785280c220084089e4effb12167d86e4080f2c34865a7408eb8728c180000030837fd73e501820000021c8c029e469c403880c8c163b6932164800018fc923d1125cbff40081956689af4480b2bce1410e1cc088e12881144fccc6f7901d92b48bd811820000041a00403689fbc9d909000000041a0100073b605784180000001068001dcc4fb92e3821380a00006c880500800118480480f072296249b80c10c9646adec3828681fe57c8c09f68eb5e50202000000e100a00a0b55c56010086820019c8a871b75c5df638a1300800006c080100a75b8074a270161600db53c6050000000006df81ec4128ab2d55128ab2d5484663861842022802001802b755f400321dfdc763ba85a094753757a1a2349e933fc1ed2009332520d6e97b0c458d7645495ca5c3144a70a7ad0183779f163a0c31f4e938a180032da8201408855e8551260c2000840bad05d7bc28a9a41e118388d68853962096a5932442836da26b262036d93ce860800006332cce08400109144939300814537c496d387114090c1e01048d93c43b850512c5331c2800000232809008411abcd1002dcb87bc9a01088020000326402004000634401c07020912499270e2087fd284e08183a1aea5b0a10572745488a010f48ac0c8600d52e8030800403d4498f0ab38a1200400005ec8003079000896386bfd195620c3061ae7f2acbc7080000004b00c11841b8067814200000012c018001b7a9c900100018885a13a93861380438f7fd3637860714141e8f6f490180000009601c32b7bcc311e306000000258070422462f20d02080000006b267042700871e7d18f30cb0e28783648b4520300000012c038642f94deccc60c0000004b01000000008ca01c0099e4ccafcce084e010000187200c0200033e200a03e31e29292eea72940e2fb0a2dae00000000004a2286302282202280180000464d095ae56731e40434acfc92bdfbe126db766363a5b8a3108d400071880200800c04000e084008840020200001000c0b1 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase16" = "QuadFullEightCase16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase16 private def zz2295:"s08f7"="s08f7":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l14 l15 l22 l23 l25 l27 l29 l30 l33 l35 l37 l44 l5 l51 l57 l59 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2a2d8987e, -0x58a3a8958,0x7551237ae,0x354b65ec], ![-0x58a3a8958, -0x2e6301df5a,0x1379cbd370, -0x5dab9b430], ![0x7551237ae,0x1379cbd370, -0x2e427409db,0x9800ebde0], ![0x354b65ec, -0x5dab9b430,0x9800ebde0, -0x2c51d4704]] noncomputable def hinges:Hinges:=[(-0x10432593f,l5),(0x2dad16693,l8),(-0x4586cb6,l10),(0x13ea30168,l14),(0x5b8dbff78,l13),(-0x9930a05c,l15),(-0x335cc11c,l23),(0x2f45efbc3,l22),(-0x2c51d4704,l27),(0x2c51d4704,l29),(-0x3a64a838,l25),(-0x8ceb9172,l30),(0x2c51d4704,l33),(-0x2c51d4704,l35),(0x2c51d4704,l37),(-0x14866410,l44),(0x2c51d4704,l51),(-0x20818355,l57),(-0x95443e,l59),(-0xc97eb9a,l63),(0x19c5ca40,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c51d4704,l27),(0x2c51d4704,l29),(0x2c51d4704,l33),(-0x2c51d4704,l35),(0x2c51d4704,l37),(0x2c51d4704,l51),(0x5b8dbff78,l13),(0x2f45efbc3,l22),(0x2dad16693,l8),(0x13ea30168,l14),(-0x10432593f,l5),(-0x8ceb9172,l30),(-0x335cc11c,l23),(-0x3a64a838,l25),(-0x20818355,l57),(-0x9930a05c,l15),(0x19c5ca40,l64),(-0xc97eb9a,l63),(-0x14866410,l44),(-0x4586cb6,l10),(-0x95443e,l59)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0xe807200800018e2840920c050000006629014300c00001544501b0c040000000685405300800001a45701a0c040000006629034300c000000000340c80100000003c1c0a30080000002106024c0200002082b03063014000010421025cc04000008434240940080000020838070c03000000034240a30080000000021018802000000000880520080000023828030c0300000008418063008000002c84c050c0300000000685033004000000011404c803000000440b021300c00039198300510030000000641407300800051248880d100300000000007032004000000013404c803000000001900c200c003c0841a0271004000000220a00c300c003c0841400f1004000002105003c30100000000000c0c8010000000941809300800000000270188020000003211036300c000000000240c801000000920e01c300c0000000025018802000000000980520080000027828030c0300000009418063008000000330b028c02000000c213014300c00000001a1c0cc010000000001c09200a8624408d0367500600000000005032004007316041014d0040000005621022300c000000002b01880200000250440823010000000002301880200000006c24053009440a104400635006001342304803240100a60a209804b5005001702807005d401000000000980248030000000442c063008000000000e014802000000001c009200c0000000012014802,0x443c0530080000138110058c040000000003c0520080000120110058c04000094260900b400c000000007802480300000250740c630100002c1106c03d0030000000000f032004000000015c04c803000000000a807200800000d42701b0c04000000003500a200c000001609c04cc030000000584405300800000000b00248030000000036009200c000001a044038c030000006e1100b300c00000000090188020000006c0900c300c00000000050188020000000642407300800000001e140cc01029820831024640140000014864090c038947044d807a6401800014e2040920c050000000000b032005270cf04a01a49006023c3182501b240140002a1206405500302983384700d240140a812a1a404290050000ac4c1c01d400c005c124310329004000000000580520080a40c610c07490050000006229014300c00000001a2c0cc01000006315c06830100000002d1d01cc020000842e0e034400c000002e8e804cc03000000000bc0620080000000905028c02000005710406c301000000148840d8c030000000ec2c0a3008000003884c050c03000000000b4062008000000002e014802000000b63201c300c000000312101cc02000000ca42013300c0000000033018802000006714406c301000000188a40d8c0304bc848720108401412b20a1c80441005], #[]⟩ def dynamicCode : Nat := ((((((((((0x81add4f3aa5c71446f809cf461532a0d017c7135640d9174610cce2b415c60842f9d4e487042bc022d1d5159c70900210351e7b12ae418511d8722356388051d1eedb06103a0eef1258e120d9c2fd1e182073fa0e2004800ab3eb6a40701b594316a72a28385f47a48a20709c0400003e040c04605e13e2e2dc63bb5588106783e9363028807b19bdb8c2031fb81e14c80c1a50d209e24050c923618d74828211ab1826e008026986b5b14020a0071cb4c153a7828290180001049c7731340014058cd73bfdbfaa20eaf99ae77fb800000000044cd7329d49d78f834a23ddc4dd9ae653a61098e18818e10a108104083bcb663cbd175c7670a194be2c488f50525bda0412da9b24c328319196e5ff50781f6ddd8b24c78a0005c6745359df9037d025204738c211d20c5590c0deedc6344f5000000000000000007e22862063022021823002802000a2003830010068000d1907b3103d06c1e4340f0130770503b00a07193d00a29720506acd4747f1c2c46882bcfc1828793f929fa14200935681882010cab0ebeb7101009356e8a8501a4f8ea0420141caa4a48084e405003805701614e89ca97c7c101d4b377bdab81c3876cad2ed28484292e2eef89c30833756f98840c0c9aa5de87e82400915a0251523017958cde1b615102588202b02848e1d8276d39d102952f6dee70a407b6e67974dd8e1d47882c2d2c4841b413c946c0a083035d4791008373fe44156028843c57f09d901447202a0240000ee10003e720ea53e387ba3dc6160409f6405a495b92194d91a607243859509f9aed98c122539cbb01a184a3153c91a7840a1240d640821800ee28ef76a0200d4ce29ac151f200540400720183a00c1c40723e95db5342e0918eb3fe90bda40a2ff657c2541450000009fa4122616ced48a2c80eca15e1db181024875b5f8c40803b81d29d2208000004fb0289018520380001fd3c7159d8ac7a00e1674e7cae58460a990dc2bd40185c35449db9f1c13cf772bee28a0812e9d02c8c40593b021225a1827c9d9d051b0c00a68b9e818649002901c03900c1c4072320d8aaefbb228a000000c082122440147c8906406babafe448c04101ac663a5102820ccfa9801612019ef1ecce501003e3e5481740000000c03054a020a80700004084094260008c041cc07c70c097dc353808149c76c186d2320442a46e89bfe480e6464645347c1c10375234340b060530488e513a00c12196aeabb5b0300172fad778c80803246ee478df37b4801701601c8060e20391aded378502e28a000001231c244bc7ce93c20901b8883bf13c050899bbf201081041b6d7988782403b7ea4103c02012d813e2dc000000091505f4041480c00007e8c8c586c031ca79028aa5b2b518438a03e4099ed012270a79e74d7a406e1594d53c00a102c0309795c0831cd57c939c06001d677783e00805db5897da06c9002a01c03900c1c4072342f5c3e60df1e5080000003d301010217fad83901bc048738e37bce5ac9901800000b71b000104f8559f2232530408e38ea380c2da48071245e16e0278c00000000f4240013882420c80f00004c040012c483806c1bc140012d041b8440da1a06c01035808004b288350ec1a4560d02b0671583308c194478cf68967b7ca5249c1c201554e8618be5e4b17912e0034bdd00000000008daffaa630cccef014f641332c82862452031430c2f98db7d153b8a2eb243113df4eb0ccbe782fefd6dad117bec8c9f4563ca95b5b048e2d5fde2b0e8604a9246c0e1aef502860) <<< 16000) + 0x20d4c16388007c021222352dcc43860e53f9e081e129914240005512c10a0001cc640200b061b91060084eba553800f004000051c8000ec106409e33da259edf2949270708055c41f5cbe8100b68a6b3bf206fa04a408e718423a418ab2181bddb8c689ea00000000000000000fcca187084084000027cfa53e2112e0103c0978ea7512f0c23a30cc6e3e3aa17da5b77169cac508656f252d96753c5866185b5c6ac21f95a70d3a8c96135c6b552995dd54e4fbd5351d5ef08c781462bf50cc62b280021c10630981a84c18817018037d2ab3b60c18110aa204fc8c101b9149684b0416f95ffbdf8016002ab6a2bca40e004bc4c0278c0109d2dc678116e9830b00b100001004412343a471e8a0010aa89f9100001382dd130023004000056106101f1006f28f650818da0d0a310c39182a675c60002962f1bc400380d705284a104601000010f20004507a30f568320147abb4e77bb702f87541118e5f7e810d3de6232b7b6baf5728000000000000000020aa4006de5bd61008a05a0e10a1020840020164a66570a3b1190e4841f09981108d8650031fe9725c253c17714acb0d70104e78ad8ae1f94752d1b3495a64b2885f1454000d508300ac17c06000f104178860ba3b05c1582d888168460b21b0580982b80b0800052f9449c0dcda53586b5289bed836cd1ff19155aaa7105e02901e110f0627844351b41085bfda679545efcf1f80e77f58e11377de405e12351f6ccdc81db151c2caf896fec7027c740cabab62e899dd404003dd3ff3011437ac2fea1347f9457a0016f25c8b262d53ff22ac28a01e153d75ebf3c5f0cbac6e541e21a34e718c6f971e016d57cefc853d6383f6b7221905bda3c54ce44cbc1bf47e422bab8908348b1164c13c7157649161d9ab69922353e46b62487d282497d2aa483044010c24183991be12450b4385a32437181e5bf2280013e79c3d552418230080000749056190000ff10551182a04c14c178cf68967b7ca5249c1c201568a6b3bf206fa04a408e718423a418ab2181bddb8c689ea00000000000000000fdb032a965becd64804cb641532c72032c22020410802a320bfef72860690145cee4bc84565f40c005a825dcd7b799463b5d6e483bc025260e00e5ae60646772df851e854890724feeb948694610e432282900c144060a00304f01d130521bb288a12173d7cc18e189d8ee6160c3768a1e6c85000149650a55465182300869416ab37a9ca181904b76314265da02e2a180085d9a5502a320c1180400003a4e33da259edf29492707080546b0036c0caa596fb35920132d90559ae653a93af1f069447bb89bb35cca74c2142c924424330014055190c41d100c50832e6c9cef172ed64b5423d32d3ddd45e2f4ad61a4aa0fc148129dd089a5c8959f51ca723e800182100053b209c4204d0d02604800272c81084c07c07419792977f7ada98d1b062b7ed34356958e8b66ab2ec0fef302570541973e68c446642400ff1beac3080ad8a79aaa4afc5966384c53c3fbc3b0a72687e2b483bb9559ae65b2c801e5c66b26a0179ee75fc28881909a7957d9a950ed2d0daf1ca3fd8134b9dd1b938ed3d8ef9c016c1a2558e704ddd03d85000118d80f57681c312812d3dc2b2d31225137555372ccc43cd4711d1b01534506a8cd34b6ca443a768d880000802204e3398d786196d35e4c5002e9fef99800e8020000270c93318feca8e1c7ae5bf192394ba44e61c1066e08952000f80430d0de360b47061ab053c2102056bfcd88800bbb4abc50002704a6b2801000400003f08000f21f14474615bc28b690a1e7820101cb415084610420100000ac20961b04a09d88dd27911a743040ef2c95ae78c5a4d85373bb5bee12c3b42540eb92b5b695c06609ec1fd367184905a4f3e1fa3c93f4a066422e2e674588fa77be1bb83692fb5e82efa335cfafb72b7c024f18e0037a7b95701aa1c6d9c8e0379c6e288577ec3a6455c2364bc3652ec1364c9c1f6ea750ff6c910020381ed411374e99021b7c353721f493df4c84c8cf89428d1120981c3dfc75f686131a5b94c137e31387e2f9ef1539b94ec66f752cfe923ba5ab69c59e97c2b7377efcd1d828c54a5090000bf440c0040013e6604089f50f51dcc9d0ba674fda818dcb3b4820ea1a7da53a22085d6a1c42cb93498e62245a7602001df6eca52b92195ef68ef71d54dbeab68216fc02cf9ea6e7015ae1f013adb6bf86fa697a1600156871cb79ca5ebe34f9debedbdc908d24b73bc829444183bac55955db9c8a9eab52b6070480a81d9c865c453debf01ae0558ace8fce036acc5c775e2253181dfed4d1cc9cefcf8bb029f094140ff916da23a5647b6208a29f56266af35b14def6a38f0dcb9556733561bb171b8c84a1070000bf24124460901304705e86051abe54c50c2fb12c968e1043e8b66c082ef437752c500071740c0d1094508c021003fb36cbe39b18ec5f16e33cff650104235801b796f584022816651250628638410430089a8d3905a73f82b887c7c02ddfd355fc64f773601a8602545cc6c28e42c5000215208c0b0450182200f00bf1a7e8286f52ac51d44abb5dfec96008c0801fd9b65f1cd8c762f8b719e7fb2808217107d72fa0402cf5769cef76e05f0ea82231cbefd021a7bcc4656f6d75eae50000000000000000041424804118010000047b7ca9cd6b1969ca4d12aafc1a9a9f49c2ab24791bf254f4f004669034ae4567aa111ba4b70ebb3c2bc7c734aa730323bb2fb670f79c533155ca49d868d00049220861a0420900042e101b09f083dfa71fc08246)) <<< 16000) + 0x1f9ae004067c08e8cf24013ec7d12542410220084010040100820b04005d140acbc38b0413d26ddeab0c1829be4936381005a4f45e0800553513bd94108c02007e03b2c1ca6761f851619ea38a6871003b075d1020800e4b69e0f04000661bc4c040072afe8198109002145a63a44a80388aa7ac0d1cf000074e88c12001b373aff20002a3ca2604a084601000010d20004d64000ea4800208182304c45ca880b15af26fc5368f16249f9d0bb662265ff419893270f47faf2113f212a8914dedbc4c0816265f7f9f15b155aea99e44b583e52a767b16c017d3c2a40a2c9c5a67c64abadb47b24e37dd9e7ea09e56012b3b0c79caf8983a012a08b8d4ae1abdd29707f9e8604779c790c35c0f99f7118320223906076b72a67e0d191dc82319c67e6f1e92bec37a24daadff0b37525ca0cd9a997adf12522153c46c000286903e158058880f4360781203b0981d02c0e40607003000adb20051e8400ea80f32a7cdf7414eaa0000002a3d3b50392cbc48b4bbcb2ed766fb608de736612b85c00000000000000000000000000000000000000000002b10c20818618c00a002008aa2205d3fcaffddfb3ce27e043b86905df83524265569a9a11b866a40376047614cc8b59604c98e9dcdfb5cd530996a5b06228e7ccac6f82f7feaac81e06750370100020e10050c9200d4ca60607684d8b67560676c042171ad868a2cef2dfba142116cac3be7182c3d08b3e5806cc0a814a2a02a0c089a413d30a4ca25285f217a9bcbfbe20999a3484066f0dd387b31f6defb8ac487c8628c87de9088a88001682913f718ffd7f1b5b4c2971fe55836962a94e9faaebe32b5cb96feb491f69d690526478003c030360180500f1dcc4d0005016f8e449b337c546c4737ce0abeb8e6de498be6482146f82acd7329d49d78f834a23ddc4dd9ae653a610a0c29010a10808602325a31850574bd153dc97940bfaf8afcf3356bf02077401645e45470b01cc1d3f87526d9bae0753adb5a0f3058a41764fd00034a206a1b0340581280b63b37a1f7c6ae9596c16d01a27737e42a9b037ec0ee0dee00000000000000001017be806481640b4efcb0e907102d18213c8c52318c9049de41542861c41822401c0250dfd72fc002d6363d74b84ec87857e549552fb0bd28b6e17cb95252bd2690fee59842fbd441483e1280cf497382f560769a84699756841db4df021979a6e2305edf6bf6a540c8a2c4082d1459672427b548a002c2ffa5d803f14c100271d27c3e845c28e10058d55991ad18ceac10035178b17b57c0d3801ceda2b195b4552e4841344e107e0f800028e3f3a7b06a4ccefadddd1688fb4c4a6499bf1e60f6f123ca448000000000000000000000000000000000000000000000000018c787474745cc0b425de736f44ae48a02053054c60c704604504900300e594daf1b1ff8bbe94a65e4c0bf629698cdbfb6d772c14df04b16d106b2bbf6f53461137dbc420768967cdebce8fbc2432418cf7bf617e4530e01e096b3a0026f182c1a267c50004a52066230321181888c0c02605e0b02e0581680efecf6c9c200166c766f43ef8d5d2b2d82da0344ee6fc8553606fd81dc1bdc00000000000000002028571ae841c16593777943d6e68a2be2384fcf7442d33e400000000000000007cbdf403240b205a1230e10811208c00664fc42093baab1499cce84782f0af1f88c9ff9c5fa5780760fc269e1e61cf667e09f103d84cf12510d8f80f3532b77c4cac8f2039a50c57ea48c2867b1b96c716c93f7cf458656a78e111fef495d3231b66fc4099747f5b2b5d0984103820079df91c5c1fa022300340f10a10a9092f651200435c0a55ff9526828202c1cb2585787aaed540176362add847e6c7aa8bb90aef270c45098000163902c0dd100607dc0d16112dfc2c30dac336b58f7539210180bbb65b29db2d27450e72415dbefdb0c0446841293cee7c2ef122c1c12462b990821da0759400980c2371cd2e6cac2003194957d1cf2efda511fe1f3900882110b0c0f49633ca0c59a1482850ff338765c704ac08581c604919d1c849410800200001fe40ac1721022461931dcc57845d2193cced0f991b713f29968dd3c84205334f0c35b9dc2bdedcbc579e4c4f9eacbd144a88ef51fe98021146897fda02be1214d90e852f51ec9d0436fb3bb4d258100539f23ab74d95ac2ece8a7cf062b90478aca760b8b68d40027c1652f4ef8a03ab106f5c39509218f752de73de466443554bac3d59c3fb48efd2830da672b8f30166e488cb4a450b77241e23ffb23a2e2d2c54aa65c40fc733e09032e89b0000a9840a8240012ac40a46602203b0c3cd4d062c215a4def4b0407f831d2c09d5b09f990107802100401004000011102509d120d8697a797e2fcd866c201ffbe35f230b18401c6f8eef9ce85cd2aa31375af254bfce4601d5112b104d716c1a1ff196ce7e66dc4b81400b063e96623c7a0a947ced147ca87e9844100000d4c187657409ca5bb31421fa85dd19206cd7b15b5b513b6713d465f736fd3fb9b5aacbedd58182756c6f227767450c8619c0001f610281181386e040ebb62b0a122af5ce8b03b529ff410048083115a040e80220000200802601f03b3915d2c1b70ec8100a0cc24a3001900850d1c6cb2ca1042833b200adc85ed2c106bcf0e8009a200a25001b008000072100018f20003c2409427a48715335a880801d37f842840c2fd3e4341bb1e6ca70608000e84b0b005b4fe9921000f8a62b05670c210087e0ab8dd55cc832b923b6055342d9fcafd511567ccd73e55b000004b002)) <<< 16000) + 0x2491d34c980702d09779cdbd12b92280814c15438a244382381000a9bb0b332365d8c42b7baf12e6f6a80432a897accb53111fd50b10a45612ba7fc7199e117c8236a113a4b5e3b46216ba4714028113a5382d842d5009c00abef080ca0000001cb220000041a61198208402000026640011a48002f31024090004779f4ed40e4b2f122d2ef2cbb5d9bed82379cd984ae1700000000000000000000000000000000000000000000ac259651258e602582580080a997b83bb297141f012fa76a0725978916977965daecdf6c11bce6cc2570b8000000000000000000000000000000000000000000056130c308342302282101280040570180200df4ed40e4b2f122d2ef2cbb5d9bed82379cd984ae1700000000000000000000000000000000000000000000ac2618610684604504601f492c181200d0001dc20480a0003f720460a00062c200293e40701721974e5eceb9212b1ec1f400c08000005dc0c014059fd930802793102488200a3e67b4d8006be140eafa2a2069a4b3df2d7282400c0000d510027d62006762400805d187ab41900a63b989a000a02d9ae653a93af1f069447bb89bb35cca74c21310318214218114110155b4c41d3564ead344dc3cb9261ca2c4e52e55a423fd5a5e2b37bcad9c0d871fc61a01403fae39b79262f9920851be0ab35cca75275e3e0d288f7713766b994e98424408206284302282202180a91568b383c3f900d2f573a8b0803ceb363095831046e32ac3e76a38705666d4dc82246aa0004ce4088840420b0200100f80e883a91720a181f396e4a38a0af23827143041a59d4aa8814182100400f02c0740603803ae02d5baa9b819cd73981563b989a000a02df5c736f24c5f32410a37c15324514418118010000048db351069f2e6ce308cda0e39953a7805705b23d606cf4b9b54baa2bcc48f02ed00024020360b01a0158e2a6f9c042020c12d5640e159b38c7a8700c54babde300029e4ea75250c210086103a0f406240762b81474602102ca04008225dbb3a84015eb18c10b2841000430818a51b73203aabfabf904103578c2224005f1d02e0c0d88fc94659420800200002024000874f052cdd442786f96f8b89f715e7ffdb3a296ce3038d58b93aa36a164716e3e8166fcb113f6052800d3b2a7285515bc1a1b2c97645c4a459c978200b91749f33769d6b36139139af05f4c41365041d5d3f312e4b38e7720040e88d03a9ed6c04f3c0c1dc9dbb1cdaa768a0f1e2ed97fd08c3f2c56906c15756ae34c1e6643208468da000104480c88c0602602e0b0160580a80e04620e21e545e8fdea41e54655d751277da7cf6d38cec1cd9b28593ac271ed57521c22703ded6fc59fec42fc6cf66ccaf9c8a50e419951bd22f1acdea6da48b27d96f101e6b6ddddb3177c226be04f0f039a99c6cb318e418b1ef455c830c0be6021bfad062a5cffa8c96aa0b2df5184fec4e5351eb3e0c6b27abae1ebde67c049c0d34b2c2d896b3b71e55fced87e600f8658cb7599665438c7919f5f255ed5ac61200718d2821e6838c8203c9cd3d870986228258d02ceefc4301005ac257dc65082000800008090140d80984ec3d6fe01f830a31fb7cf140774da0582006fb4b92490207802161c1b3ad112c114f72fe41804e15b748100fd38fd3850207c0100001a074a03495e212082ce7619a282d49603f81c20ced46a4200a6247de90650c20008000081901205000175901101c000040100200380000802202d3a21144006c01000008a400020880782e550dd6cbe39b18ec5f16e33b49875504286804e65f9966ab4000000a91641041839438e39000e00200980c010068000b79b2ea45cff1db970b18058a9b88a2c4918010675347e9061853b2ee1e8fd870c018a32013ed8c00000001b771fc7000bd8df664a246000c5bedf111ac43e840818016000084880704803414000994403017bcae50ae71ce58c8de4a60bdcc678169e90edfb073c8bbfc308f12d1b66dcc34b044311851c41042821c01400004120e0affcc6fcce3d4cc3024ad735a0b45ed4baa721f56e7dacee0323b12ad4168e58ace2e9c7796714951c5fdaa5a2334bb1e2aed41266724981fa8001a710011ee2016420019f32003b624008c1cc26f0d657a05b5767d4f89dbc0b25459e796e27db1e7196c8000000000000000000000000000000000000000000000000184450c6083086045044043000142bfb2ede13176ff61883a5e27748e3b661fb57e1d849e0ed150fa61e9d4e39fa605f38af1488db22792831214476b9663a64aabbc13927198570839e2942a8182ee3ee05000a100000070805007057fe04a2000000009600c0087031b9a08a84c404a010818704b37b9989105e61bef8407118d3e833a3890c0140b2874470ed4c95e25b06085e61bceb4030434af528cbc104c85688cc706024a01fb03b807922050028a202ef2ade1650dfee6fdd9d246000000960160039f3c1cbc8000000012c032841280428afbbd8ab4e14510003695b5270b180000002ee014314d21de29f42460000000bb80500049faeb151810000001a76df8d1c20ac050000352649976a55d4da6247003f1273c9928500000005dc024514a0b0dc1f720500000005dc028000000018eb824002f76bbd0ac128e18580280001b22000956402817c7f2a0d8c7d440a0000002580714291ff95f88e19c420620b718300000012c03805adff0e2c400000000961009d282d5e998609c02000035840245400116e40028a08040e801c7400c32005010020080039a48019280088400202000010036c59)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase17" = "QuadFullEightCase17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase17 private def zz2296:"s08f8"="s08f8":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase18 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l23 l27 l29 l33 l34 l35 l36 l37 l4 l51 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x10136556, -0x6242ea4, -0x5b93cda,0x258], ![-0x6242ea4, -0x306daf36,0x4480bd8,0x70a6c5e], ![-0x5b93cda,0x4480bd8, -0x27ec43ed,0x6248a81], ![0x258,0x70a6c5e,0x6248a81, -0x312187e]] noncomputable def hinges:Hinges:=[(-0x572d,l4),(0x572d,l8),(0x2209c34,l23),(-0x312187e,l27),(0x312187e,l29),(0x312187e,l33),(-0x312187e,l35),(-0x572d,l36),(0x312187e,l37),(0x572d,l34),(0x312187e,l51),(-0x2209c34,l63)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x312187e,l27),(0x312187e,l29),(0x312187e,l33),(-0x312187e,l35),(0x312187e,l37),(0x312187e,l51),(0x2209c34,l23),(-0x2209c34,l63),(0x572d,l8),(-0x572d,l36),(-0x572d,l4),(0x572d,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1470cc08700bb5006000000000780a401000094260900b400c00000000f004900600000000210188020000630560338602800003506406e3010000188118079180a0000001b11018c02000000000d80a4010000005827013300c000000016004900600000000d8024803000000c8120186018000006e1100b300c000388218079180b99147046012d9006002104609807680200000000014062008000000001c029004004c0c4170121004000000441202c6018000642409016400c0000228520371809070d9052006d90060000a208601e460280000004c240630080000000026029005440a104400635006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x81cbfa8df2468724e148190dcef220303e064c1045c68d41800001348b020d0022073be64b18b18000177024688402ec081984920da203062ce318204208f8bf04012b9e508a3820f00a0000530f1988122728500009608177dc3a31c57d3e9e4804ca483528011f433c2000c625209c206802000025c624652000008c35948b70c1512061852441c4184182200140100032180200d0000f633482d000001469b2e31d40ad118071232900000461aca45b860a99031228e20c20e1020858200401b0366102ba1c46566d6230943f1b3c6085ab979820ba0b1c220052bed62100239ad3027081b00800009b1020090001551c3757a400f96980c1a4bfacc6676c0819d339adaef080618e1732182d6e0e10f8b6f8046db0c109de2d9e214e88105a4e8b831ea840902febc941b2803aa20986e2e11e462040a1802c0000938d08212ac8b1061073ac2c080820d072ea803020d072ea80504bd7ffb71060873aa31c8140bae28c03c200ad93a86a102059d70d70ec40c11810000073480f8880781403a0281b032079f000e139aa94f93018235e1380b302844cdf2a9c1080099bd9a9920e009093abc90140133c5752d404aebbb80a616ae503e514fa388138182c810c3ff92d504114dedb1baf1891853487b3c37922ac0c84ba53f20508227b17602286000246cf380600639e1cb9c493881c10ac0f16494c5e7621044e0193f992315d4b0269030000c11a122b6e845738a20000b30a020800090d386006fb444700016e3bf016480100080070040003886c9575c4c80040e7a7d7c0fc91743c48ff10a207e49400c2031a1264a9e5822f4f6798040422c330e28c0350dc58e01400a50d57264524108c09164e6fae0ed22462e8cb376648b7490f922c510001077cc1608000ba348101042eeed721021de97af343010af9346c04004ab) <<< 16000) + 0xf08423624108c0800003a04000ef0f1000217eea901437027ae33e8040e7a071eea08082bdc540bc6a06047838a191971418955e39a1d04059cf6994b8d0c01e19d4e13f0001ed1bba19d0853848015022006c0603403c1546d5a16ea2052613f22a686166c097dfa310446d96557b070e1eb565cfb1835efbb17550809089752e8608213d3f8ca7070669384329aa264801301a30aa51e63f130ad2c848f7ccd6c8302c622ece8b416b7286b8a5c6582c271c323f3588a82cd1c12660e10bf2c50c10ac11e4bccd0200026dd007fbf810039a12eb6cd90f42404801802a0000940c8bf16a2d91908140007db79816200a834e09f0c31e05e12afc284029d2f03bc300220f952f3fd06002702c00c8080005c48002f2900083f2001f8270d631eea7460c00030468a09040ba881c0000004b03004102d7605000002cc2d8007c010030020170100b008054040280200018a20262b00e1180906e19791c199926d532b9cfabc59fdbee80da4dc8000000000000000000000000000000000000004ca96fcd09c18b16626c64505485108007005002000344c5706b55705b62372185c31f45f49958e61b02669059fb389b4af32c3c36c5c10dd11481dff230e3f270a880105e0a55247e902b120f2fb7739c2ef045881e339f933864733d15fab060c3dbbc75aaa8b96fd2af5e984194244f9e649404d069f3293f0670efbf737431e051cdd316e13ab15ec8e387689684809f612a8e00165b460000273bf04a103401001105f16f9b1f616486028564920a40fd04100b7f9c582014a1b96058f02e04c083401092420afc3880210cc810bbcce1c40b6694a003002b100cee0bc9810580200001de608fa9d15141a5889bc80cc0186a20270006d0813ade34820917bfe850245ebea13840c80400004a08001aa1c32d69cb84050a0365100b1860e628202ea3c880158c1661004a4d8482004d03fe013880d00400004c8c0100401002003a0890cea81059b61e020048a75d080cf243484810320100000b820161200f0500009a18235b6823849b16c386b6ff2deb06ea651f0606f531ec4da6f0ed9028369687f44453af946acda5f80d14b36c9cbd39b2d70340598280e0804b48f3233024c33d2671f41231cb87b9e656798e90f7869905520011ca9e9beb0367c97bf0cb804028549c51b620d0a2d9ff9d78317ce389a5202cc03bb3d0b101d630dfabcfbacc41d53181f12c4a085797f32576c22a006136491b29dd3409d337a3299ea981d0c6348bb0000a464003104c4e47e708f354da2baa9cf132d10a8fe1ff6b000000000000019432f23833324daa65739f578b3fb7dd01b49b9000000000000000000000000000000000000000984206186104300280080811af558b1911a9fdf5bf984598291e2d9508079261913ec03f4b2380de70ebecbf72ed6169a0d59a22972588b5445bdb3f5808e485bccb3396e71752e6f982eae163ca7c3108b9ff4001274800b3b9002a3830cbc8e0ccc936a995ce7d5e2cfedf7406d26e4000000000000000000000000000000000000002654b7e684e0c58b313632282a438638230220228020018007454b3889ce1248a1aad4afad9ebd32d7ce474ad460524436d14bd753ce684dcf62c6c8cdb9f2cce4ae4452a0fbe277166f5423886a185606244ff0e871061afdba14400003e80809e5880231c2869fe764000894d016028c183c0289151f85923c448600a1177df203878dc202e0c18000249f009040051d3eea30001e897af410000e127f2707d07082502c48b71230d62000008919502a251048c48a50848838850010060100401b639f871082c5110c62850b0e1a52c81400012c16182d764428003e8a353000d8042cbbb43ac42c708fcdf72c52b4e3bc28543843842c30dc97fa1400000f2298007002000022240008dc80019c10004d82000c3240383601a029162357d030666470e1c19e267c8a0ecbb2c0502380a0804a183201091f589636230615c0067182446955b8e0b16b9830506056844a180d03dc570806e0965502012fd368c0a4060e80a00005c880604e856dbea21028200da28080872011840c004249e7abaf8a200d209c60aecaaa61024ae6020c066bb440401c4e7a02c103200800010220161200a050000eb9811526def318bf7ac8823146d56535df0cf15ff9b1e72012bdd6913852df451ba087f3c673103a5441e4765886033c2277d18189322071b296e5dbe1a3a5a127886c114092d00a56af32fd6f918de4c818c3b7bd3dc5a0ab30401b17c5d46a6975a95e7b43427fde8877148aeef46c00673c3ae006387fc392bb5593d8d451bc47481db21ad4f4bdb07d09b73c4ae5b57773791c76cc99452988e10080100400480c02005851e18dd8413410e862811c26b544043cd52a2007c49a887012cd4d30260c1a00861a6a0b46e0f87553f33602b01904a3957b91890e2fda0a91860c31818c1900820980140180401006d1005d6c0e3831dac588361039021af9cc300153208805fd03f3000b00434a7cd2128d1c37fe221c704b9a5820805467e341021a2bcd02c71e8e98006802000020a4000834d962edd701646ae5ca028a21ff18160253ffcc2800b343192820d004001c140001ec40011f48002d1100060920015f64003e28d17cc2687c143282d00cc5056762b7d1010002d8a84004f133e30c000000640200115f92c09c207802145a57b8ab030804d7fcb460c000012c0c100bda97c14120816bb0202000166142c103e008000125200c1a0050900202800c04004020002f320020200001000e751)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 13 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase18" = "QuadFullEightCase18" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 13 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase18 private def zz2297:"s08f9"="s08f9":=by decide+kernel end section namespace Green24Proof.QuadFullEightCase19 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l34 l36 l4 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0,0xc8,0xc8,0xc8], ![0xc8,0,0xc8,0xc8], ![0xc8,0xc8, -0x572d,0x1dd7], ![0xc8,0xc8,0x1dd7,0]] noncomputable def hinges:Hinges:=[(-0x1d0f,l4),(0x1d0f,l8),(-0x1d0f,l36),(0x1d0f,l34)] def normalizationDenominator:ℤ:=0xee6b2800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(0x1d0f,l8),(-0x1d0f,l36),(-0x1d0f,l4),(0x1d0f,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨29, #[0x11018802], #[]⟩ def dynamicCode : Nat := 0x28880bc50c190081832014206402040c80208190080d72d064147040f00c5110178a1832010306402840c804081900610320101ae5a181d0f190081e0180000fb20000ba2e40a1e4081e40a164081640416464591582020011450640a1832040c1902840c81020640610320303a1e8322b8406802000037c8000d29 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 4 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullEightCase19" = "QuadFullEightCase19" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 4 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullEightCase19 private def zz2298:"s08fa"="s08fa":=by decide+kernel end section namespace Green24Proof.FullEightRows open FullPhaseRows (Phase) open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x114e20003dceb94800df5f3eec601e20003dceb948005b888afd26200779ae5800185e48fea07a2005faf84803db699ca1fa20003dceb94800bc7d1baba15a200779ae58002a2dff8f201a20001eeb5ca80049ef4a7f622001389b4801ac98ec207d2005faf8480018adab9d61fd2001de6d9a0028af5a1de1ed2002fd7c280018685f5de14d20003dceb948015c9e8bab6520003dceb948024a886e6b212003bcdb2c0059d99bff207c2005faf848006c6a4b0ee1fc2003bcdb2c04084e4d21ec20001eeb5ca8001b4c8c7e6420001eeb5ca800ab7b7acbe07820003dceb948023ceedf2c6020003dceb948013aea2d2da14] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1360003dceb94800bcaaae607e60003dceb9480049a8cf98615e6002fd7c280028884c3ba01e6001de6d9a001b59e8dfe660003e8a4800d8ae6de1ea6003bcdb2c001afd6d1aa01a6005faf84800bb5e9f7e2260003dceb948006a7e7b582560004e2ad8002160003dceb948008addee207f20009c4da800286d4c21ff20003dceb94802dd6c5cd9202f20003dceb948033cac2f601f2005faf848004f0bcb5c6720017ebe18001c39ee3ea07b20003dceb948018debaa606b2005faf848044aede14b20003dceb948034d792320003dceb948029debf9f8e1fe20003dceb948012e5ddf5b614] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11dd30003dceb948004d588be530004e2ad8002130004e2ad800203c30003dceb94800185e9fe921fc30001eeb5ca80039883eaf643001de6d9a018f9c7f61f830001eeb5ca8001e3d0d28e0300779ae5804fb0b79a7e0004e2ad80023e00779ae58002edacd207fa0001eeb5ca8004fda380da1ffa00779ae58007d0c9aaca01fa0001eeb5ca8074e4d48e7a00779ae5800cfdf7a6fa3a005faf84800a9df9ebc21fea0003dceb94802495c6f2ce6a001de6d9a001b287c9ba07aa00779ae58004a39d89ee2a0005faf8a01990b7f2760004e2ad800214] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1570004e2ad8002170004e2ad800203f30001eeb5ca804dafe3fa06f30003dceb948033cac2f673005faf84802a03b30005faf8a01fbebe16b3003bcdb2c054e6ae33005faf8480029c93c203e30003dceb948029e2c7861fe30003dceb9480019efdb5aa06e3001de6d9a001a087d615e30001eeb5ca801780a19a14e30003dceb94800290dcfbc601e3003bcdb2c001ddc0fe63002fd7c2800e16a30003dceb948061e391fe01a30017ebe18005baba9a230003dceb9480019e03d3001de6d9a006b8dcd206d30017ebe18001af92de14] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x17f0004e2ad80023f0004e2ad800203fb005faf84801d989bbe06fb0003dceb94802d83dfb205fb0001eeb5ca804d9ba67b0004e2ad800216bb0001eeb5ca8051dec1de3b0004e2ad80021feb0017ebe1800b9091c26b0003dceb94806fa1b0ca1fab0001f492800188f6b22b0003dceb948001a48bcfe6770004e2ad8002370004e2ad800216e70003dceb94249ea205e70001eeb5ca8032c982ce670001eeb5ca8024a6c7f21ea70003dceb94800683befe01a70003dceb948007dddb8a270004e2ad800214] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11cf00003dceb94800aebdbccaa700003dceb948001e4a9e7c603e000779ae58001b4f7a4d21fe00003dceb94800ab5dce2ca1ee00003dceb9480018ec2caf202e00003dceb94800288fab3de15e00001eeb5ca8003c491c08205e00001eeb5ca8001ecd1bd96600003dceb948038c7e4ce03d00003dceb948006f695e617d00003dceb94802087ddf7aa1dd000779ae58002d6aeb2a2500002b196c00203c00017ebe1801082a48e1fc00003dceb948005a0df90d21ec00001eeb5ca802ac68bf202c00003dceb948004c9d0f0fa1cc000779ae58024a4a6aa05c00001eeb5ca8001c180da400002b196c00214] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x105f8001de6d9a009d7a4de780003dceb9480029a03e80001eeb5ca8008bba5ba17e8005faf84800f90e4e606e80003dceb9480058bb4b6f215e800779ae58001feede3861ce800779ae5807393a686680002b196c00203d80001eeb5ca8007a4eff3c216d80003dceb94800dd7edf9ce02d8001389b4800184d8de05d8001de6d9a015f3e4c6580002fdbc9002480002b196c002740002b196c002640002b196c002540002b196c002440002b196c00207f00003dceb948022e1d9b617f00003dceb94801eb9d988e214] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x117c10001eeb5ca8005d7e5f89e02c10009c4da8028d59cd21dc10003dceb948002b49aebbe05c10003dceb948003bac7a2c2410003dceb948002f603810003dceb94800a939ed1fe17810003dceb948035ccd3a6168100779ae58003d593a69e15810003dceb94800c9bacb4da05810001eeb5ca8003ea8c93d2010001eeb5ca8001b617fc0001eeb5ca80749e06fc0003dceb9480749e7c0002b196c0026c0002b196c0025c0002b196c0024c0002b196c00203f800779ae58001bc8ce9aa17f80003dceb948014ac98f1c602f80001eeb5ca800f819fe614] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x10589001de6d9a016f58dba090002b196c00216f50003dceb948004888c8daa15f50001eeb5ca8064dfd79a750003dceb948053b6b888be350001eeb5ca8020abe8818a550002b196c00201950001eeb5ca802cf9f3ae150002b196c00207e10003dceb948008e7aea2f217e10003dceb94801fc1fda58206e10001eeb5ca8001cca0b5ba1de100779ae58001cdb9c18e610002b196c00203a10003dceb948058c8befa17a1001389b4801ad5f09e16a10003dceb948005e5d4b9aa05a10001eeb5ca80018eed8afe210002b196c00203c10003dceb948008cd979b9614] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x117e90003dceb948008e7d2bcb616e90003dceb94800ffeabd7ae02e9002fd7c2807bc1cfb615e90003dceb9480048599858a1ce90001eeb5ca8001f780a9f201e90003dceb948044d391aa690002b196c00203a90004e2ad8009b48ea617a9001389b48024c481d202a90003dceb94800c9c90f6ee15a9002fd7c2803dbfcc8214a9002fd7c28010baf09a290003dceb948002e617c90001eeb5ca800883a8b58616c90001eeb5ca8002a2a7bf8206c9005faf8480069bd1ce1dc90001eeb5ca806af1f8961cc90001eeb5ca800289d4cce6490002b196c002178900779ae58004a5fac2ee14] def rowsChunk10:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x10894002692e8020101010001020100089300779ae58017968c8e010101000102010008920003dceb948031c7daa3aa0110010101100101010b0102010b010204779ae58038fff1f201100101011001010100010101000102045faf848021feedc601000722010001010100010101000102042fd7c28042ec97c20103dceb9480089890aa088a0001eeb5ca801adcaf96088f0003dceb948007b1be97d608880003dceb94800488eee7927d0002b196c00215bd003bcdb2c008c19c9a3d0002fdbc900ef19617dd0003dceb948003f4d0b9ee02dd00779ae58038a2e4f214dd000ef3acd00398f2b25d00779ae58014d689fc82019d00779ae5800ed385f5aa1d002fd7c28002e8c797ae03e90001eeb5ca8015d0d0be14] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 ++ rowsChunk10 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadFullEightCase0.base QuadFullEightCase0.hinges QuadFullEightCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase0.base QuadFullEightCase0.hinges QuadFullEightCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadFullEightCase1.base QuadFullEightCase1.hinges QuadFullEightCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel private def zz1045:"s0415"="s0415":=by decide+kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase1.base QuadFullEightCase1.hinges QuadFullEightCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r62,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r58,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadFullEightCase2.base QuadFullEightCase2.hinges QuadFullEightCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase2.base QuadFullEightCase2.hinges QuadFullEightCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadFullEightCase3.base QuadFullEightCase3.hinges QuadFullEightCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel private def zz1046:"s0416"="s0416":=by decide+kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase3.base QuadFullEightCase3.hinges QuadFullEightCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r62,RewriteAtoms.r19,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadFullEightCase4.base QuadFullEightCase4.hinges QuadFullEightCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase4.base QuadFullEightCase4.hinges QuadFullEightCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r45,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadFullEightCase5.base QuadFullEightCase5.hinges QuadFullEightCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel private def zz1047:"s0417"="s0417":=by decide+kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase5.base QuadFullEightCase5.hinges QuadFullEightCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r61,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadFullEightCase6.base QuadFullEightCase6.hinges QuadFullEightCase6.normalizationDenominator theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase6.base QuadFullEightCase6.hinges QuadFullEightCase6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r24,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r61,RewriteAtoms.r19,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadFullEightCase7.base QuadFullEightCase7.hinges QuadFullEightCase7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel private def zz1048:"s0418"="s0418":=by decide+kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase7.base QuadFullEightCase7.hinges QuadFullEightCase7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadFullEightCase8.base QuadFullEightCase8.hinges QuadFullEightCase8.normalizationDenominator theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase8.base QuadFullEightCase8.hinges QuadFullEightCase8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadFullEightCase9.base QuadFullEightCase9.hinges QuadFullEightCase9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel private def zz1049:"s0419"="s0419":=by decide+kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase9.base QuadFullEightCase9.hinges QuadFullEightCase9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r59,RewriteAtoms.r61,RewriteAtoms.r16,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r4,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadFullEightCase10.base QuadFullEightCase10.hinges QuadFullEightCase10.normalizationDenominator theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase10.base QuadFullEightCase10.hinges QuadFullEightCase10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r20,RewriteAtoms.r32,RewriteAtoms.r16,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadFullEightCase11.base QuadFullEightCase11.hinges QuadFullEightCase11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel private def zz1050:"s041a"="s041a":=by decide+kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase11.base QuadFullEightCase11.hinges QuadFullEightCase11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadFullEightCase12.base QuadFullEightCase12.hinges QuadFullEightCase12.normalizationDenominator theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase12.base QuadFullEightCase12.hinges QuadFullEightCase12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadFullEightCase13.base QuadFullEightCase13.hinges QuadFullEightCase13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel private def zz1051:"s041b"="s041b":=by decide+kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase13.base QuadFullEightCase13.hinges QuadFullEightCase13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadFullEightCase14.base QuadFullEightCase14.hinges QuadFullEightCase14.normalizationDenominator theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase14.base QuadFullEightCase14.hinges QuadFullEightCase14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadFullEightCase15.base QuadFullEightCase15.hinges QuadFullEightCase15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel private def zz1052:"s041c"="s041c":=by decide+kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase15.base QuadFullEightCase15.hinges QuadFullEightCase15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadFullEightCase16.base QuadFullEightCase16.hinges QuadFullEightCase16.normalizationDenominator theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase16.base QuadFullEightCase16.hinges QuadFullEightCase16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadFullEightCase17.base QuadFullEightCase17.hinges QuadFullEightCase17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel private def zz1053:"s041d"="s041d":=by decide+kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase17.base QuadFullEightCase17.hinges QuadFullEightCase17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadFullEightCase18.base QuadFullEightCase18.hinges QuadFullEightCase18.normalizationDenominator theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase18.base QuadFullEightCase18.hinges QuadFullEightCase18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadFullEightCase19.base QuadFullEightCase19.hinges QuadFullEightCase19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel private def zz1054:"s041e"="s041e":=by decide+kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadFullEightCase19.base QuadFullEightCase19.hinges QuadFullEightCase19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullEightCase19.nonnegative x hx def pair20:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair20Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_20_base LocalFullEightPairs.compact_fullEight_pair_20_hinges theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalFullEightPairs.fullEight_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_20_base LocalFullEightPairs.compact_fullEight_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalFullEightPairs.fullEight_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair21Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_21_base LocalFullEightPairs.compact_fullEight_pair_21_hinges private def zz1055:"s041f"="s041f":=by decide+kernel theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalFullEightPairs.fullEight_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_21_base LocalFullEightPairs.compact_fullEight_pair_21_hinges x theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalFullEightPairs.fullEight_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 0 1 false def pair22Rewrites:Rewrites:=[] def pair22Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_22_base LocalFullEightPairs.compact_fullEight_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel private def zz1056:"s0420"="s0420":=by decide+kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalFullEightPairs.fullEight_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_22_base LocalFullEightPairs.compact_fullEight_pair_22_hinges x theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalFullEightPairs.fullEight_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2] def pair23Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_23_base LocalFullEightPairs.compact_fullEight_pair_23_hinges theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalFullEightPairs.fullEight_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_23_base LocalFullEightPairs.compact_fullEight_pair_23_hinges x private def zz1057:"s0421"="s0421":=by decide+kernel theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalFullEightPairs.fullEight_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r69] def pair24Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_24_base LocalFullEightPairs.compact_fullEight_pair_24_hinges theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalFullEightPairs.fullEight_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_24_base LocalFullEightPairs.compact_fullEight_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalFullEightPairs.fullEight_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69] def pair25Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_25_base LocalFullEightPairs.compact_fullEight_pair_25_hinges private def zz1058:"s0422"="s0422":=by decide+kernel theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalFullEightPairs.fullEight_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_25_base LocalFullEightPairs.compact_fullEight_pair_25_hinges x theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalFullEightPairs.fullEight_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r51,RewriteAtoms.r2] def pair26Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_26_base LocalFullEightPairs.compact_fullEight_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel private def zz1059:"s0423"="s0423":=by decide+kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalFullEightPairs.fullEight_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_26_base LocalFullEightPairs.compact_fullEight_pair_26_hinges x theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalFullEightPairs.fullEight_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2] def pair27Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_27_base LocalFullEightPairs.compact_fullEight_pair_27_hinges theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalFullEightPairs.fullEight_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_27_base LocalFullEightPairs.compact_fullEight_pair_27_hinges x private def zz1060:"s0424"="s0424":=by decide+kernel theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalFullEightPairs.fullEight_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_28_base LocalFullEightPairs.compact_fullEight_pair_28_hinges theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalFullEightPairs.fullEight_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_28_base LocalFullEightPairs.compact_fullEight_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalFullEightPairs.fullEight_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_29_base LocalFullEightPairs.compact_fullEight_pair_29_hinges private def zz1061:"s0425"="s0425":=by decide+kernel theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalFullEightPairs.fullEight_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_29_base LocalFullEightPairs.compact_fullEight_pair_29_hinges x theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalFullEightPairs.fullEight_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r18,RewriteAtoms.r51] def pair30Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_30_base LocalFullEightPairs.compact_fullEight_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel private def zz1062:"s0426"="s0426":=by decide+kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalFullEightPairs.fullEight_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_30_base LocalFullEightPairs.compact_fullEight_pair_30_hinges x theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalFullEightPairs.fullEight_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r26,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r28] def pair31Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_31_base LocalFullEightPairs.compact_fullEight_pair_31_hinges theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalFullEightPairs.fullEight_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_31_base LocalFullEightPairs.compact_fullEight_pair_31_hinges x private def zz1063:"s0427"="s0427":=by decide+kernel theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalFullEightPairs.fullEight_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_32_base LocalFullEightPairs.compact_fullEight_pair_32_hinges theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalFullEightPairs.fullEight_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_32_base LocalFullEightPairs.compact_fullEight_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalFullEightPairs.fullEight_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r70,RewriteAtoms.r27,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_33_base LocalFullEightPairs.compact_fullEight_pair_33_hinges private def zz1064:"s0428"="s0428":=by decide+kernel theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalFullEightPairs.fullEight_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_33_base LocalFullEightPairs.compact_fullEight_pair_33_hinges x theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalFullEightPairs.fullEight_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair34Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_34_base LocalFullEightPairs.compact_fullEight_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel private def zz1065:"s0429"="s0429":=by decide+kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalFullEightPairs.fullEight_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_34_base LocalFullEightPairs.compact_fullEight_pair_34_hinges x theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalFullEightPairs.fullEight_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair35Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_35_base LocalFullEightPairs.compact_fullEight_pair_35_hinges theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalFullEightPairs.fullEight_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_35_base LocalFullEightPairs.compact_fullEight_pair_35_hinges x private def zz1066:"s042a"="s042a":=by decide+kernel theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalFullEightPairs.fullEight_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r51] def pair36Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_36_base LocalFullEightPairs.compact_fullEight_pair_36_hinges theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalFullEightPairs.fullEight_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_36_base LocalFullEightPairs.compact_fullEight_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalFullEightPairs.fullEight_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2] def pair37Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_37_base LocalFullEightPairs.compact_fullEight_pair_37_hinges private def zz1067:"s042b"="s042b":=by decide+kernel theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalFullEightPairs.fullEight_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_37_base LocalFullEightPairs.compact_fullEight_pair_37_hinges x theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalFullEightPairs.fullEight_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_38_base LocalFullEightPairs.compact_fullEight_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel private def zz1068:"s042c"="s042c":=by decide+kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalFullEightPairs.fullEight_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_38_base LocalFullEightPairs.compact_fullEight_pair_38_hinges x theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalFullEightPairs.fullEight_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=pairSlack (8) ((1 / 0xf4240)) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalFullEightPairs.compact_fullEight_pair_39_base LocalFullEightPairs.compact_fullEight_pair_39_hinges theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalFullEightPairs.fullEight_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullEightPairs.compact_fullEight_pair_39_base LocalFullEightPairs.compact_fullEight_pair_39_hinges x private def zz1069:"s042d"="s042d":=by decide+kernel theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalFullEightPairs.fullEight_pair_39_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack (8) ((1 / 0xf4240)) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.FullEightRows private def zz2299:"s08fb"="s08fb":=by decide+kernel end section namespace Green24Proof.FullEightCyclic open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows FullPhaseSemantics open FullPhaseRows (Phase) open FullPhaseAggregation (quadPoint_nonneg pairPoint_nonneg) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ExtendedFullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack FullEightRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullEightRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse FullEightRows.rows p q same x] exact FullEightRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) private def zz1070:"s042e"="s042e":=by decide+kernel theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack 8 (1 / 0xf4240) FullEightRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullEightRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap 8 (1 / 0xf4240) FullEightRows.rows p q same x] exact FullEightRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible FullEightRows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials FullEightRows.rows theorem remaining_rows_count:remainingRows.length = 10:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (1 / 0x3d090:ℝ) * mass g ^ 2 ≤ weightedAggregate 8 h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack FullEightRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack 8 (1 / 0xf4240) FullEightRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum,stripPotentials_sound 8 h4 h3 h5 g FullEightRows.rows rows_admissible] at hs norm_num at hs change (1 / 0x3d090:ℝ) * mass g ^ 2 ≤ weightedAggregate 8 h4 h3 g (stripPotentials FullEightRows.rows) + 4 * deficit g linarith end Green24Proof.FullEightCyclic private def zz2300:"s08fc"="s08fc":=by decide+kernel end section namespace Green24Proof.FullEightMass open ExtendedFullPhaseRows ExtendedFullPhaseAggregation open FullPhaseRows (Phase) open PhaseMassRows PhaseColourRows ConditionalMassRows private def zz1071:"s042f"="s042f":=by decide+kernel theorem remainingRows_eq:FullEightCyclic.remainingRows = [ ((0x208dd9c9 / 0x3b9aca00), .base (.child 0)), ((0x3b17c5eb / 0x3b9aca00), .base (.heightChild 1)), ((0x1ab8bcb / 0x1dcd6500), .base (.grandchild 0)), ((0x830415 / 0x3b9aca00), .colourChild .whole), ((0x42d85e1 / 0x5f5e100), .massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,0,(17 / 7),0]:Fin 4 → ℚ) p)), ((0x21fdb63 / 0xbebc200), .massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,8, -1,8]:Fin 4 → ℚ) p)), ((0x38ffc79 / 0xee6b280), .massProduct (fun p => (![1, -6,1, -6]:Fin 4 → ℚ) p) (fun p => (![-1,8, -1,8]:Fin 4 → ℚ) p)), ((0x18c7b48d5 / 0x3b9aca00), .base (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((0x172c307 / 0xee6b280), .base (.massSquare true (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((1 / 0x98968), .base (.normalization))]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff CombinedPolicyPackedRowsEquality.extendedEq CombinedPolicyPackedRowsEquality.extendedEq_iff _ _).mp decide +kernel theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (_heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (_hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (8:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hforms:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm 6 8 i p:ℝ))) (hchild:FullPhaseAggregation.rowAggregate 8 h4 h3 g (.child 0) ≤ 0) (hheight:FullPhaseAggregation.rowAggregate 8 h4 h3 g (.heightChild 1) ≤ 0) (hgrand:FullPhaseAggregation.rowAggregate 8 h4 h3 g (.grandchild 0) ≤ 0) (hcolour:rowAggregate 8 h4 h3 g (.colourChild .whole) ≤ 0) : weightedAggregate 8 h4 h3 g FullEightCyclic.remainingRows ≤ ((1 / 0x98968):ℝ) * mass g ^ 2:=by have hp4:rowAggregate 8 h4 h3 g (.massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,0,(17 / 7),0]:Fin 4 → ℚ) p)) ≤ 0:=by have h:=domainProduct_nonpos 8 6 8 h4 h3 g hforms 4 6 have he:domainForm 6 8 6 = (fun p:Phase => (![-1,0,(17 / 7),0]:Fin 4 → ℚ) p):=by funext p norm_num [domainForm] rfl rw [he] at h exact h have hp5:rowAggregate 8 h4 h3 g (.massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,8, -1,8]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 8 6 8 h4 h3 g hforms 4 8 have hp6:rowAggregate 8 h4 h3 g (.massProduct (fun p => (![1, -6,1, -6]:Fin 4 → ℚ) p) (fun p => (![-1,8, -1,8]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 8 6 8 h4 h3 g hforms 7 8 have hs7:=rowAggregate_massSquare_nonpos 8 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) have hs8:=rowAggregate_colouredMassSquare_nonpos 8 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_base,rowAggregate_normalization] norm_num linarith theorem deficit_nonneg_of_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (8:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hforms:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm 6 8 i p:ℝ))) (hchild:FullPhaseAggregation.rowAggregate 8 h4 h3 g (.child 0) ≤ 0) (hheight:FullPhaseAggregation.rowAggregate 8 h4 h3 g (.heightChild 1) ≤ 0) (hgrand:FullPhaseAggregation.rowAggregate 8 h4 h3 g (.grandchild 0) ≤ 0) (hcolour:rowAggregate 8 h4 h3 g (.colourChild .whole) ≤ 0) : 0 ≤ deficit g:=by have hc:=FullEightCyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g heven hhigh hforms hchild hheight hgrand hcolour nlinarith [sq_nonneg (mass g)] end Green24Proof.FullEightMass private def zz2301:"s08fd"="s08fd":=by decide+kernel end section namespace Green24Proof.FullEightProfileInterval open FullPhaseRows (Phase) open PhaseMassRows ChildRows HeightChildRows theorem interval_nonneg_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (heven:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(6:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (8:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by by_contra! hneg have hm:m < 2 * m:=by have hp:=NeZero.pos m; omega have hdu:=ih m hm (dvd_mul_left m 2) u hu have hdv:=ih m hm (dvd_mul_left m 2) v hv have hg:=interleave_nonneg u v hu hv have hforms:=ConditionalProfileRows.domainForms_nonneg 6 8 h4 h2 u v hu hv hdu hdv hneg (by norm_num) heven hodd hlow hhigh have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) have hchild:FullPhaseAggregation.rowAggregate 8 h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even]; linarith have hheight:=rowAggregate_height_odd_nonpos 8 h4 h3 h2 u v hu hv (HeightStrong.strong_height_bound h2 h3m h5m v hv) have hgrand:=Full27ProfileInterval.grandchild_nonpos_of_induction 8 h4 h3 (interleave u v) hg 0 ih have hcolour:=ColourChildRows.whole_nonpos_of_induction 8 h4 h3 (interleave u v) hg ih have hhigh':phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 ≤ (8:ℝ) * (phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3):=by rw [ProfileChildren.phaseTotal_interleave_zero h4 h2, ProfileChildren.phaseTotal_interleave_two h4 h2,phaseTotal_interleave_one h4 h2, phaseTotal_interleave_three h4 h2,classMass_sum,classMass_sum] exact hhigh have h:=FullEightMass.deficit_nonneg_of_rows h4 h3 h5 (interleave u v) hg heven hhigh' hforms hchild hheight hgrand hcolour linarith private def zz1072:"s0430"="s0430":=by decide+kernel theorem interval_nonneg {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(6:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (8:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,heven,hodd⟩ := ProfileDoubleOrientation.orient_both_children h4 u v hu hv have h:=interval_nonneg_ordered h4 h3 h5 h2 u' v' hu' hv' ih heven hodd (by simpa only [hU,hV] using hlow) (by simpa only [hU,hV] using hhigh) simpa only [hd] using h end Green24Proof.FullEightProfileInterval private def zz2302:"s08fe"="s08fe":=by decide+kernel end section namespace Green24Proof.RatioCoverEight open ProfileInduction BoundaryFromHeightCertificates ConditionalProfileEndpoint open RatioCoverSixteenFromRemaining (IntervalCertificate) theorem interval_to_eight {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:ProperDivisorNonneg (2 * m)) (horder:mass v ≤ mass u) (hhigh:mass u ≤ 8 * mass v) : 0 ≤ deficit (interleave u v):=by by_cases hsix:mass u ≤ 6 * mass v · exact RatioCoverSix.interval_to_six h4 h3 h5 h2 u v hu hv ih horder hsix · exact FullEightProfileInterval.interval_nonneg h4 h3 h5 h2 u v hu hv ih (le_of_lt (lt_of_not_ge hsix)) hhigh theorem ratio_to_sixteen_of_remaining (h812:IntervalCertificate 8 12) (h1216:IntervalCertificate 12 16):RatioToSixteen:=by apply RatioCoverSixteenFromRemaining.ratio_to_sixteen_of_remaining _ h812 h1216 intro m _ exact FullEightProfileInterval.interval_nonneg theorem deficit_nonneg_of_remaining (h812:IntervalCertificate 8 12) (h1216:IntervalCertificate 12 16) (hcertificate12:∀ (m:ℕ) [NeZero m],HeightCertificate m Q12) (hcertificate18:∀ (m:ℕ) [NeZero m],HeightCertificate m Q18) : ∀ (q:ℕ) [NeZero q], ¬5 ∣ q → ∀ (g:ZMod q → ℝ),(∀ i,0 ≤ g i) → 0 ≤ deficit g := deficit_nonneg_of_certificates (ratio_to_sixteen_of_remaining h812 h1216) hcertificate12 hcertificate18 end Green24Proof.RatioCoverEight private def zz2303:"s08ff"="s08ff":=by decide+kernel end section namespace Green24Proof.LocalFullTwelvePairs def compact_fullTwelve_pair_20_base:CompactPair.Quadratic:=⟨(-1 / 0xb2d05e00),(0xc9 / 0xbebc200),0⟩ def compact_fullTwelve_pair_20_hinges:List CompactPair.Hinge:=[⟨(-0x910904f / 0x77359400),1, -2⟩,⟨(0x105103c1 / 0x165a0bc00),2, -3⟩,⟨(0x910904f / 0x77359400),2, -1⟩,⟨(-0x105103c1 / 0x165a0bc00),3, -2⟩] noncomputable def fullTwelve_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_20_base compact_fullTwelve_pair_20_hinges x y def compact_fullTwelve_pair_20_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2] private def zz1073:"s0431"="s0431":=by decide+kernel theorem compact_fullTwelve_pair_20_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_20_base compact_fullTwelve_pair_20_hinges 0 compact_fullTwelve_pair_20_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_20_representation (x y:ℝ) : fullTwelve_pair_20 x y = CompactPair.expressionEval compact_fullTwelve_pair_20_base compact_fullTwelve_pair_20_hinges x y:=by rfl theorem fullTwelve_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_20 x y:=by rw [compact_fullTwelve_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_20_check hy (by simpa using hx) def compact_fullTwelve_pair_21_base:CompactPair.Quadratic:=⟨(7 / 0x11e1a3000),(0x329 / 0x77359400),0⟩ def compact_fullTwelve_pair_21_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x1dcd65000),1, -2⟩,⟨(1 / 0x2cb417800),2, -3⟩,⟨(-1 / 0x1dcd65000),2, -1⟩,⟨(-1 / 0x2cb417800),3, -2⟩,⟨(-1 / 0x2cb417800),3, -1⟩] noncomputable def fullTwelve_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_21_base compact_fullTwelve_pair_21_hinges x y def compact_fullTwelve_pair_21_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullTwelve_pair_21_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_21_base compact_fullTwelve_pair_21_hinges 0 compact_fullTwelve_pair_21_cuts = true := by decide +kernel private def zz1074:"s0432"="s0432":=by decide+kernel theorem compact_fullTwelve_pair_21_representation (x y:ℝ) : fullTwelve_pair_21 x y = CompactPair.expressionEval compact_fullTwelve_pair_21_base compact_fullTwelve_pair_21_hinges x y:=by rfl theorem fullTwelve_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_21 x y:=by rw [compact_fullTwelve_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_21_check hy (by simpa using hx) def compact_fullTwelve_pair_22_base:CompactPair.Quadratic:=⟨0,(0x10b4f / 0xb68a0aa00),0⟩ def compact_fullTwelve_pair_22_hinges:List CompactPair.Hinge:=[] noncomputable def fullTwelve_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_22_base compact_fullTwelve_pair_22_hinges x y def compact_fullTwelve_pair_22_cuts:List ℚ:=[] theorem compact_fullTwelve_pair_22_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_22_base compact_fullTwelve_pair_22_hinges 0 compact_fullTwelve_pair_22_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_22_representation (x y:ℝ) : fullTwelve_pair_22 x y = CompactPair.expressionEval compact_fullTwelve_pair_22_base compact_fullTwelve_pair_22_hinges x y:=by rfl private def zz1075:"s0433"="s0433":=by decide+kernel theorem fullTwelve_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_22 x y:=by rw [compact_fullTwelve_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_22_check hy (by simpa using hx) def compact_fullTwelve_pair_23_base:CompactPair.Quadratic:=⟨(-0x29262a7 / 0x1e84800),(0xb5755677 / 0xe9a67400),0⟩ def compact_fullTwelve_pair_23_hinges:List CompactPair.Hinge:=[⟨(-0x29e0fa4d / 0x165a0bc00),1, -3⟩,⟨(0x12d044c15 / 0x1dcd65000),1, -2⟩,⟨(-0x3e8d8af3 / 0x165a0bc00),2, -3⟩,⟨(0xb16563b3 / 0xee6b2800),2, -1⟩,⟨(-0x4c6b6e33 / 0x1dcd65000),3, -2⟩] noncomputable def fullTwelve_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_23_base compact_fullTwelve_pair_23_hinges x y def compact_fullTwelve_pair_23_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullTwelve_pair_23_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_23_base compact_fullTwelve_pair_23_hinges 0 compact_fullTwelve_pair_23_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_23_representation (x y:ℝ) : fullTwelve_pair_23 x y = CompactPair.expressionEval compact_fullTwelve_pair_23_base compact_fullTwelve_pair_23_hinges x y:=by rfl theorem fullTwelve_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_23 x y:=by rw [compact_fullTwelve_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_23_check hy (by simpa using hx) def compact_fullTwelve_pair_24_base:CompactPair.Quadratic:=⟨(-0x413f095 / 0x77359400),(0x15f9093 / 0x77359400),0⟩ def compact_fullTwelve_pair_24_hinges:List CompactPair.Hinge:=[⟨(0x41a3f1 / 0x23c34600),1, -3⟩,⟨(-0x87d571 / 0xbebc200),1, -2⟩,⟨(-0x2ed0f68f / 0x77359400),1, -1⟩,⟨(0x10d43a33 / 0x2cb417800),2, -3⟩,⟨(-0x19f24b59 / 0x2faf0800),2, -1⟩,⟨(0x21a0eaed / 0xb2d05e00),3, -2⟩,⟨(0x10f84997 / 0xb2d05e00),3, -1⟩] noncomputable def fullTwelve_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_24_base compact_fullTwelve_pair_24_hinges x y def compact_fullTwelve_pair_24_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] private def zz1076:"s0434"="s0434":=by decide+kernel theorem compact_fullTwelve_pair_24_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_24_base compact_fullTwelve_pair_24_hinges 0 compact_fullTwelve_pair_24_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_24_representation (x y:ℝ) : fullTwelve_pair_24 x y = CompactPair.expressionEval compact_fullTwelve_pair_24_base compact_fullTwelve_pair_24_hinges x y:=by rfl theorem fullTwelve_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_24 x y:=by rw [compact_fullTwelve_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_24_check hy (by simpa using hx) def compact_fullTwelve_pair_25_base:CompactPair.Quadratic:=⟨(3 / 0x1dcd65000),(0x323 / 0x77359400),0⟩ def compact_fullTwelve_pair_25_hinges:List CompactPair.Hinge:=[⟨(-1 / 0xee6b2800),1, -2⟩,⟨(-1 / 0x1dcd65000),2, -1⟩,⟨(1 / 0x59682f000),3, -2⟩] noncomputable def fullTwelve_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_25_base compact_fullTwelve_pair_25_hinges x y def compact_fullTwelve_pair_25_cuts:List ℚ:=[(1 / 2),(2 / 3),2] theorem compact_fullTwelve_pair_25_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_25_base compact_fullTwelve_pair_25_hinges 0 compact_fullTwelve_pair_25_cuts = true := by decide +kernel private def zz1077:"s0435"="s0435":=by decide+kernel theorem compact_fullTwelve_pair_25_representation (x y:ℝ) : fullTwelve_pair_25 x y = CompactPair.expressionEval compact_fullTwelve_pair_25_base compact_fullTwelve_pair_25_hinges x y:=by rfl theorem fullTwelve_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_25 x y:=by rw [compact_fullTwelve_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_25_check hy (by simpa using hx) def compact_fullTwelve_pair_26_base:CompactPair.Quadratic:=⟨(0x5b5d93 / 0x47868c00),(0x6aeb / 0x490404400),0⟩ def compact_fullTwelve_pair_26_hinges:List CompactPair.Hinge:=[⟨(-0x7d24bbb / 0x165a0bc00),1, -3⟩,⟨(-0x11e13f9 / 0x17d78400),1, -1⟩,⟨(0xbd9ec5 / 0x3b9aca00),2, -3⟩,⟨(0x158cf3 / 0x7735940),2, -1⟩,⟨(-0xcace5 / 0xe4e1c00),3, -1⟩] noncomputable def fullTwelve_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_26_base compact_fullTwelve_pair_26_hinges x y def compact_fullTwelve_pair_26_cuts:List ℚ:=[(1 / 3),(1 / 2),1,(3 / 2),3] theorem compact_fullTwelve_pair_26_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_26_base compact_fullTwelve_pair_26_hinges 0 compact_fullTwelve_pair_26_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_26_representation (x y:ℝ) : fullTwelve_pair_26 x y = CompactPair.expressionEval compact_fullTwelve_pair_26_base compact_fullTwelve_pair_26_hinges x y:=by rfl private def zz1078:"s0436"="s0436":=by decide+kernel theorem fullTwelve_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_26 x y:=by rw [compact_fullTwelve_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_26_check hy (by simpa using hx) def compact_fullTwelve_pair_27_base:CompactPair.Quadratic:=⟨(-0x52697dd39 / 0x1dcd65000),(0xc9e8e435f / 0xb68a0aa00),0⟩ def compact_fullTwelve_pair_27_hinges:List CompactPair.Hinge:=[⟨(1 / 0x1dcd65000),1, -2⟩,⟨(-0x107b7f90d / 0x1dcd65000),2, -1⟩,⟨(0x41edfe43 / 0x77359400),3, -1⟩] noncomputable def fullTwelve_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_27_base compact_fullTwelve_pair_27_hinges x y def compact_fullTwelve_pair_27_cuts:List ℚ:=[(1 / 3),(1 / 2),2] theorem compact_fullTwelve_pair_27_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_27_base compact_fullTwelve_pair_27_hinges 0 compact_fullTwelve_pair_27_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_27_representation (x y:ℝ) : fullTwelve_pair_27 x y = CompactPair.expressionEval compact_fullTwelve_pair_27_base compact_fullTwelve_pair_27_hinges x y:=by rfl theorem fullTwelve_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_27 x y:=by rw [compact_fullTwelve_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_27_check hy (by simpa using hx) def compact_fullTwelve_pair_28_base:CompactPair.Quadratic:=⟨(-0x13c6059933d / 0xae9f7bcc00),(-0xaf89f5a69 / 0xe8d4a5100),(-0xb5dcab23f / 0xba43b7400)⟩ def compact_fullTwelve_pair_28_hinges:List CompactPair.Hinge:=[⟨(-0x24785e4863 / 0x15d3ef79800),1, -3⟩,⟨(0xb5dcab23f / 0x746a528800),1,3⟩,⟨(0x24785e4863 / 0x15d3ef79800),3, -1⟩,⟨(0xb5dcab23f / 0x746a528800),3,1⟩] noncomputable def fullTwelve_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_28_base compact_fullTwelve_pair_28_hinges x y def compact_fullTwelve_pair_28_cuts:List ℚ:=[(1 / 3),3] private def zz1079:"s0437"="s0437":=by decide+kernel theorem compact_fullTwelve_pair_28_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_28_base compact_fullTwelve_pair_28_hinges 0 compact_fullTwelve_pair_28_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_28_representation (x y:ℝ) : fullTwelve_pair_28 x y = CompactPair.expressionEval compact_fullTwelve_pair_28_base compact_fullTwelve_pair_28_hinges x y:=by rfl theorem fullTwelve_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_28 x y:=by rw [compact_fullTwelve_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_28_check hy (by simpa using hx) def compact_fullTwelve_pair_29_base:CompactPair.Quadratic:=⟨(-0x664c204437 / 0x3a35294400),(-0x16bb94952b / 0x1d1a94a200),(-0xb5dcab23f / 0xba43b7400)⟩ def compact_fullTwelve_pair_29_hinges:List CompactPair.Hinge:=[⟨(-0xb5dcab23f / 0x746a528800),1, -3⟩,⟨(0xb5dcab23f / 0x746a528800),1,3⟩,⟨(0xb5dcab23f / 0x746a528800),3, -1⟩,⟨(0xb5dcab23f / 0x746a528800),3,1⟩] noncomputable def fullTwelve_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_29_base compact_fullTwelve_pair_29_hinges x y def compact_fullTwelve_pair_29_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullTwelve_pair_29_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_29_base compact_fullTwelve_pair_29_hinges 0 compact_fullTwelve_pair_29_cuts = true := by decide +kernel private def zz1080:"s0438"="s0438":=by decide+kernel theorem compact_fullTwelve_pair_29_representation (x y:ℝ) : fullTwelve_pair_29 x y = CompactPair.expressionEval compact_fullTwelve_pair_29_base compact_fullTwelve_pair_29_hinges x y:=by rfl theorem fullTwelve_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_29 x y:=by rw [compact_fullTwelve_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_29_check hy (by simpa using hx) def compact_fullTwelve_pair_30_base:CompactPair.Quadratic:=⟨(-0xea68f9f7 / 0x17d78400),(0x3f909d9925 / 0xb68a0aa00),0⟩ def compact_fullTwelve_pair_30_hinges:List CompactPair.Hinge:=[⟨(-0x191c1609 / 0xee6b2800),2, -3⟩,⟨(0x1976c59f7 / 0x165a0bc00),3, -1⟩] noncomputable def fullTwelve_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_30_base compact_fullTwelve_pair_30_hinges x y def compact_fullTwelve_pair_30_cuts:List ℚ:=[(1 / 3),(3 / 2)] theorem compact_fullTwelve_pair_30_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_30_base compact_fullTwelve_pair_30_hinges 0 compact_fullTwelve_pair_30_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_30_representation (x y:ℝ) : fullTwelve_pair_30 x y = CompactPair.expressionEval compact_fullTwelve_pair_30_base compact_fullTwelve_pair_30_hinges x y:=by rfl private def zz1081:"s0439"="s0439":=by decide+kernel theorem fullTwelve_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_30 x y:=by rw [compact_fullTwelve_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_30_check hy (by simpa using hx) def compact_fullTwelve_pair_31_base:CompactPair.Quadratic:=⟨(7 / 0x59682f000),(0x2635 / 0x2da282a80),0⟩ def compact_fullTwelve_pair_31_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0x59682f000),3, -2⟩] noncomputable def fullTwelve_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_31_base compact_fullTwelve_pair_31_hinges x y def compact_fullTwelve_pair_31_cuts:List ℚ:=[(2 / 3),3] theorem compact_fullTwelve_pair_31_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_31_base compact_fullTwelve_pair_31_hinges 0 compact_fullTwelve_pair_31_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_31_representation (x y:ℝ) : fullTwelve_pair_31 x y = CompactPair.expressionEval compact_fullTwelve_pair_31_base compact_fullTwelve_pair_31_hinges x y:=by rfl theorem fullTwelve_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_31 x y:=by rw [compact_fullTwelve_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_31_check hy (by simpa using hx) def compact_fullTwelve_pair_32_base:CompactPair.Quadratic:=⟨(-0x4f444248d / 0x15d3ef7980),(0x5cfde7dab1 / 0x1d1a94a200),(-0xb5dcab23f / 0xba43b7400)⟩ def compact_fullTwelve_pair_32_hinges:List CompactPair.Hinge:=[⟨(-0x2389ddf6737 / 0x15d3ef79800),1, -3⟩,⟨(0xb5dcab23f / 0x746a528800),1,3⟩,⟨(0xb5dcab23f / 0x746a528800),3, -1⟩,⟨(0xb5dcab23f / 0x746a528800),3,1⟩] noncomputable def fullTwelve_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_32_base compact_fullTwelve_pair_32_hinges x y def compact_fullTwelve_pair_32_cuts:List ℚ:=[(1 / 3),3] private def zz1082:"s043a"="s043a":=by decide+kernel theorem compact_fullTwelve_pair_32_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_32_base compact_fullTwelve_pair_32_hinges 0 compact_fullTwelve_pair_32_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_32_representation (x y:ℝ) : fullTwelve_pair_32 x y = CompactPair.expressionEval compact_fullTwelve_pair_32_base compact_fullTwelve_pair_32_hinges x y:=by rfl theorem fullTwelve_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_32 x y:=by rw [compact_fullTwelve_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_32_check hy (by simpa using hx) def compact_fullTwelve_pair_33_base:CompactPair.Quadratic:=⟨(-0x132e465740d / 0xae9f7bcc00),(-0x16bb93d465 / 0x1d1a94a200),(-0xb5dcab23f / 0xba43b7400)⟩ def compact_fullTwelve_pair_33_hinges:List CompactPair.Hinge:=[⟨(-0xb5dcab23f / 0x746a528800),1, -3⟩,⟨(0xb5dcab23f / 0x746a528800),1,3⟩,⟨(61 / 0x23c34600),2, -3⟩,⟨(0xb5dcab23f / 0x746a528800),3, -1⟩,⟨(0xb5dcab23f / 0x746a528800),3,1⟩] noncomputable def fullTwelve_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_33_base compact_fullTwelve_pair_33_hinges x y def compact_fullTwelve_pair_33_cuts:List ℚ:=[(1 / 3),(3 / 2),3] theorem compact_fullTwelve_pair_33_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_33_base compact_fullTwelve_pair_33_hinges 0 compact_fullTwelve_pair_33_cuts = true := by decide +kernel private def zz1083:"s043b"="s043b":=by decide+kernel theorem compact_fullTwelve_pair_33_representation (x y:ℝ) : fullTwelve_pair_33 x y = CompactPair.expressionEval compact_fullTwelve_pair_33_base compact_fullTwelve_pair_33_hinges x y:=by rfl theorem fullTwelve_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_33 x y:=by rw [compact_fullTwelve_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_33_check hy (by simpa using hx) def compact_fullTwelve_pair_34_base:CompactPair.Quadratic:=⟨(-1 / 0x39387000),(1 / 0xf4240),0⟩ def compact_fullTwelve_pair_34_hinges:List CompactPair.Hinge:=[⟨(-0x2235db91 / 0x2cb417800),1, -3⟩,⟨(0x88d76e3f / 0x1dcd65000),1, -2⟩,⟨(-0x247db7 / 0x17d7840),2, -3⟩,⟨(-0x88d76e3f / 0x1dcd65000),2, -1⟩,⟨(0x247db7 / 0x17d7840),3, -2⟩,⟨(0x2235db91 / 0x2cb417800),3, -1⟩] noncomputable def fullTwelve_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_34_base compact_fullTwelve_pair_34_hinges x y def compact_fullTwelve_pair_34_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullTwelve_pair_34_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_34_base compact_fullTwelve_pair_34_hinges 0 compact_fullTwelve_pair_34_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_34_representation (x y:ℝ) : fullTwelve_pair_34 x y = CompactPair.expressionEval compact_fullTwelve_pair_34_base compact_fullTwelve_pair_34_hinges x y:=by rfl private def zz1084:"s043c"="s043c":=by decide+kernel theorem fullTwelve_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_34 x y:=by rw [compact_fullTwelve_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_34_check hy (by simpa using hx) def compact_fullTwelve_pair_35_base:CompactPair.Quadratic:=⟨0,(0x193 / 0x3b9aca00),0⟩ def compact_fullTwelve_pair_35_hinges:List CompactPair.Hinge:=[] noncomputable def fullTwelve_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_35_base compact_fullTwelve_pair_35_hinges x y def compact_fullTwelve_pair_35_cuts:List ℚ:=[] theorem compact_fullTwelve_pair_35_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_35_base compact_fullTwelve_pair_35_hinges 0 compact_fullTwelve_pair_35_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_35_representation (x y:ℝ) : fullTwelve_pair_35 x y = CompactPair.expressionEval compact_fullTwelve_pair_35_base compact_fullTwelve_pair_35_hinges x y:=by rfl theorem fullTwelve_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_35 x y:=by rw [compact_fullTwelve_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_35_check hy (by simpa using hx) def compact_fullTwelve_pair_36_base:CompactPair.Quadratic:=⟨(-0x8e41f81 / 0x3b9aca00),(0x8515c96e1 / 0x16d1415400),0⟩ def compact_fullTwelve_pair_36_hinges:List CompactPair.Hinge:=[⟨(-0x32a399 / 0x2625a00),1, -2⟩,⟨(0x6eb0cb9 / 0x77359400),2, -3⟩] noncomputable def fullTwelve_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_36_base compact_fullTwelve_pair_36_hinges x y def compact_fullTwelve_pair_36_cuts:List ℚ:=[(3 / 2),2] private def zz1085:"s043d"="s043d":=by decide+kernel theorem compact_fullTwelve_pair_36_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_36_base compact_fullTwelve_pair_36_hinges 0 compact_fullTwelve_pair_36_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_36_representation (x y:ℝ) : fullTwelve_pair_36 x y = CompactPair.expressionEval compact_fullTwelve_pair_36_base compact_fullTwelve_pair_36_hinges x y:=by rfl theorem fullTwelve_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_36 x y:=by rw [compact_fullTwelve_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_36_check hy (by simpa using hx) def compact_fullTwelve_pair_37_base:CompactPair.Quadratic:=⟨(-0x92b1927 / 0x2cb417800),(0x88edf13 / 0x490404400),0⟩ def compact_fullTwelve_pair_37_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x165a0bc00),1, -3⟩,⟨(-0xc1 / 0x77359400),1, -1⟩,⟨(-1 / 0x59682f000),2, -3⟩,⟨(0x1bf0fe7 / 0xee6b2800),2, -1⟩,⟨(-0x6fc399 / 0xee6b2800),3, -2⟩] noncomputable def fullTwelve_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_37_base compact_fullTwelve_pair_37_hinges x y def compact_fullTwelve_pair_37_cuts:List ℚ:=[(1 / 2),(2 / 3),1,(3 / 2),3] theorem compact_fullTwelve_pair_37_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_37_base compact_fullTwelve_pair_37_hinges 0 compact_fullTwelve_pair_37_cuts = true := by decide +kernel private def zz1086:"s043e"="s043e":=by decide+kernel theorem compact_fullTwelve_pair_37_representation (x y:ℝ) : fullTwelve_pair_37 x y = CompactPair.expressionEval compact_fullTwelve_pair_37_base compact_fullTwelve_pair_37_hinges x y:=by rfl theorem fullTwelve_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_37 x y:=by rw [compact_fullTwelve_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_37_check hy (by simpa using hx) def compact_fullTwelve_pair_38_base:CompactPair.Quadratic:=⟨(-0x9a9166b109 / 0x574fbde600),(-0x162f885e2d / 0x1d1a94a200),(-0xb5dcab23f / 0xba43b7400)⟩ def compact_fullTwelve_pair_38_hinges:List CompactPair.Hinge:=[⟨(-0xb5dcab23f / 0x746a528800),1, -3⟩,⟨(0xb5dcab23f / 0x746a528800),1,3⟩,⟨(-0xeb48bd / 0x165a0bc00),2, -3⟩,⟨(0xeb48bd / 0x165a0bc00),3, -2⟩,⟨(0xb5dcab23f / 0x746a528800),3, -1⟩,⟨(0xb5dcab23f / 0x746a528800),3,1⟩] noncomputable def fullTwelve_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_38_base compact_fullTwelve_pair_38_hinges x y def compact_fullTwelve_pair_38_cuts:List ℚ:=[(1 / 3),(2 / 3),(3 / 2),3] theorem compact_fullTwelve_pair_38_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_38_base compact_fullTwelve_pair_38_hinges 0 compact_fullTwelve_pair_38_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_38_representation (x y:ℝ) : fullTwelve_pair_38 x y = CompactPair.expressionEval compact_fullTwelve_pair_38_base compact_fullTwelve_pair_38_hinges x y:=by rfl private def zz1087:"s043f"="s043f":=by decide+kernel theorem fullTwelve_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_38 x y:=by rw [compact_fullTwelve_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_38_check hy (by simpa using hx) def compact_fullTwelve_pair_39_base:CompactPair.Quadratic:=⟨(-0x199303965b1 / 0xe8d4a51000),(-0x2d7735178f / 0x3a35294400),(-0xb5dcab23f / 0xba43b7400)⟩ def compact_fullTwelve_pair_39_hinges:List CompactPair.Hinge:=[⟨(-0xb5dcab23f / 0x746a528800),1, -3⟩,⟨(0x1f5 / 0x1312d000),1, -2⟩,⟨(0xb5dcab23f / 0x746a528800),1,3⟩,⟨(-0x1f5 / 0x1312d000),2, -1⟩,⟨(0xb5dcab23f / 0x746a528800),3, -1⟩,⟨(0xb5dcab23f / 0x746a528800),3,1⟩] noncomputable def fullTwelve_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullTwelve_pair_39_base compact_fullTwelve_pair_39_hinges x y def compact_fullTwelve_pair_39_cuts:List ℚ:=[(1 / 3),(1 / 2),2,3] theorem compact_fullTwelve_pair_39_check : CompactPair.expressionCheckPSD compact_fullTwelve_pair_39_base compact_fullTwelve_pair_39_hinges 0 compact_fullTwelve_pair_39_cuts = true := by decide +kernel theorem compact_fullTwelve_pair_39_representation (x y:ℝ) : fullTwelve_pair_39 x y = CompactPair.expressionEval compact_fullTwelve_pair_39_base compact_fullTwelve_pair_39_hinges x y:=by rfl theorem fullTwelve_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullTwelve_pair_39 x y:=by rw [compact_fullTwelve_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_fullTwelve_pair_39_check hy (by simpa using hx) end Green24Proof.LocalFullTwelvePairs private def zz2304:"s0900"="s0900":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l17 l22 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l42 l43 l45 l5 l51 l54 l55 l57 l58 l6 l60 l62 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1d5109629, -0x2b4041b78, -0x40e062c04,0x52df6604], ![-0x2b4041b78, -0x912e80310,0xab06a2d8,0x2b30c06da], ![-0x40e062c04,0xab06a2d8, -0x11921ad149,0x2b40424d8], ![0x52df6604,0x2b30c06da,0x2b40424d8, -0x15a021014]] noncomputable def hinges:Hinges:=[(-0x10fa62e,l6),(-0x22d212bf,l5),(0x127276ec6,l4),(-0xa5868d88,l8),(-0x884b066,l11),(0x3546f792,l10),(0x2bfcc4c00,l14),(-0x97808a8a,l17),(0x72e31d7a,l23),(0x3f8b8ab,l22),(-0x15a021014,l27),(0x15a021014,l29),(-0x2bfcc4c00,l25),(0x938524fc,l31),(0xc8659b76,l30),(0x15a021014,l33),(-0x3546f792,l38),(-0x15a021014,l35),(0xa5868d88,l36),(0x15a021014,l37),(-0x127276ec6,l34),(-0xc8659b76,l43),(-0x3f8b8ab,l42),(0x74b8350a,l45),(0x15a021014,l51),(0x884b066,l55),(0x22d212bf,l54),(-0x938524fc,l57),(-0x74b8350a,l58),(0x10fa62e,l60),(-0x72e31d7a,l63),(0x97808a8a,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x15a021014,l27),(0x15a021014,l29),(0x15a021014,l33),(-0x15a021014,l35),(0x15a021014,l37),(0x15a021014,l51),(0x2bfcc4c00,l14),(-0x2bfcc4c00,l25),(0x938524fc,l31),(-0x938524fc,l57),(0xc8659b76,l30),(-0xc8659b76,l43),(0x72e31d7a,l23),(-0x72e31d7a,l63),(-0x97808a8a,l17),(0x97808a8a,l62),(-0xa5868d88,l8),(0xa5868d88,l36),(0x127276ec6,l4),(-0x127276ec6,l34),(0x74b8350a,l45),(-0x74b8350a,l58),(0x3546f792,l10),(-0x3546f792,l38),(-0x22d212bf,l5),(0x22d212bf,l54),(-0x884b066,l11),(0x884b066,l55),(0x3f8b8ab,l22),(-0x3f8b8ab,l42),(-0x10fa62e,l6),(0x10fa62e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x4a241a07a00400028c3207402c40100000000068300e6010000a32481101a10040000000491c8121806000000005c1407300800000000e8681660100000000001501c8020000072311200b20060000000000480720080000000000280e401000002b0902803100300000000002a0310040000005311c0a83010000000a22280d06020000014e21c0930c0500000294428126180a0000000044140f3008000000e6188152602000001c619006c8c0500000000001a03900400000000001d0320040000141242049860280000001c8c40d0c030000000391881b180600000b4421c026400c00000082108090602000001f0883805100300000000140a02980400000025044086301000000000582814601000000000001c0c80100000000000281900200000002a0c013300c000000560b810c6020000000000090248020000000130481118060000000005500a200c0000000001481c40100000000002b0188020000000000520310040000000000b805200800000000002e06400800000000000c0c80100000000000981900200000f8521a013400c0000000000e816401000000011854028c030000a813828036a0080000004908403230100000000098580c60100004d0841200c900400000000261203180400000000004c0520080a10520210019a80301440a1044006350060000ac1202c04ea0080029828826012d40140002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x5a3a0398040002d87618803b40100000c08a980f486030000001444301a0c0402a81840a203dba00c00000006229036300c00001488c3404c801800000010864058c030000052220c80b20060001d03408407840100001e0420a007880200007c0f02101e10040000781083404e2008000000000024062008000000044140186018000000268a4028c03000000004a2e071804000000009c540630080000000128a80c601000000000002c0c8010000000002780590060000000004d013200e108e1011601baa803800000190d0903d00200000a4230d81720060058ca10810209401400b19421260676802800000000a0502cc02001d83144281cc200a003b060881029840140000000c442048601800001c62ac0670c0500000000520e039804000000000a890330040000001441604c6018014110c08c083100500000000221a071804000288430d809a40100000000108580e601001632841040929005000000004a0c0798040000000941b01f300c0000e08c980f4860301940c205101edd006000000002c0a05980400000c4521c016400c0000000000700e4010000001444101b0c040029e33c518078a00a00000005221014300c0000001047206c6018000761103800ed004002183945281cc200a00430708a1029840140000000168580e60100000002c84c098c03000000004a1e0398040000000064380b30080000288e44403c801800000001e0d03cc020000076130500b200600000007211016300c0003506c15003e80200000001c8a4090c03,0x6d1100e18060000009464340f400800000000f8901c601000000003915038c02000000004a0e0698040000000000440e20080000000070281660100000000000540c801000000000042031004000000450dc028301000000082198050602000000000023018802000000005a140718040000000000340e200800000000b8681a60100000000110f034c02000000006a1c0718040000000fa31013300c0000000000300a401000000003e1902cc02000000688c204b180800000000a4340f300800000000a8900c601000000000011018802001c6310210107a00a00000000c4380e300800000000c8281e601000000110d05035002000000003c0a0698040000000038140d300800a0901044055e802820f1840c2035c10060020631031011c200a00000006211016300c0000000001980c401000000002521028c0200000005c0c80998060000000034240f3008000000000da01440180000000003701880200000000006a0310040000000044340f30080000000001d00a40100000000000840c8010000000612081e980600000000a4940a30080000000001900a40100000000000640c8010000000291081998060000000000d40e20080000000150901e6010000000000dc02c8030000000001a8099006002884186200f14014006304605601e4802800000000005018802001d0308170058a00ae8460808b00dd5401c00518890d000a080281c51981450298500600000000361c029804070464850407214018000360a20b809e80200007218c52032d004,0x1022302a01da0080041c738b503db401400001f0a44206c801800ec1422040649005001ea29c4381eda00a073c514414085b40180001008e980f48603000000002e0d02cc0200004a640203d2180c000000610c807f3010000430860980f680200000000000240c80100000004b1200898060000000621a015300c00b312410605f6802800029324101e90c060000000512481b18060000104722e036400c00808e1158032480280009315817022d00400012c2882602da008081471453c085b4018000000c20900fe60200000002184c094c030000000000088190020000000881b011300c0000000c41402a601800001862180d64c050000002084403f98080030c52022020f401400000000b0481e60101cf144082035c1006001c629021011c200a000000004c140730080000000000880e40100000000e844034c030000003c1c0c03a0040000000006850330040000000048381460100000000000502480200000000740c039804000000eb04801630100000000088481e60100000000000940c8010000004882204298080000000007500a200c0000000001c81c40100000000003b01880200000000721c0598040000000ea1900b300c0000000001c80c401000000001609038c0200000000007c02900400000000001f0320040000001f042026601800000000120c0cc010000000230481198060000000521301c300c0000000000a81c40100000014c220268c040000001b04602598080000000560a03f300c0000000ac4206e60180007111c130255004,0xd81900200001248a1c026400c00000e108606a460280000014c3202f0c040000002886402c180800000004211016300c00001c8dc1c028801800000001916014c02000000308aa043180800000000645c0a30080000000d05a02660180000019c5b0218c0400000000002a0490040000000622b022300c0000018890681e801001030c80c40249005000000000012039004000010c240a00c400c0000299242404c80180000000291102cc020000000510880b180600001e4822201e400c000000144360286018000002843301a0c0400000000442207980400000000d42c07300800000000c850166010014420c20c0bed0059643920df005eba00e0000000b251036300c0005b0b0220076802001241c630c07490050000000290c80b18060039c6389503db40140e28c2887810b68030000036108640d9003001982043080c9200a003544386703db40140c7882862810b680300000000350603cc02000000002a12059804000348530d809a4010000001221180d060200000019090503d00200000000620e0398040000000098340b300800000e31320236602ca81c102f804bc500700000005a0d80f98060000004434140f4008000000009048166010000831cc5403290040020628826811aa00a0000006114c06830100001098e080f486030010f0860a801d10050000000291080b18060000006114406c30100a306784780744803000000000003c0c8010000000311480a1806005108306302fb401400000008c2604a60180008610c1801ed004,0x28448c208125200a0050490824031240140000001042202c601800000484710258c0400000000721a07980400000000f4280e3008000010104606a4602800000003a1603cc02000122408c606e200800000009241026300c000418d82981568020000000000190188020000000330c81b98060000000000940b20080000198983604e801818310d0c300b8d006040e38e30604b2200c00000008239026300c00000a30f20236602800a30f216c046d0050000e2308a6065a00800000000098303300400000c313202366028000811c463032d0040001022886605da0080002046614408f4010006086104602ec802800a30ec10c0a2d00500000000001a04900400000000443c0530080000000000780a401000000138110058c04000004a1304805a0060000000001e009200c000000000ba01440180000000002d03880200000000005e0310040000000000b40620080000208ec6404c8018000000148840d8c030000ec1283a066200800000034094039301000000000340026402000000019894028c0300000002c10809980600000069104032301000000000d8980c601000000001b11018c020000000000360290040000005212001330100000000b04e026601800000000016014802000000002c220298040000000002c009200c0000000006c0124018000001a8110050c040000000032120398040000000640b01c300c0000000d812018601800000019024030c0300000340208013180a00000006e1100b300c00000000d0480c601000003025840930c05,0x3833422c3029710060000000391481998060f0ce08c0c0a5c401800000000001a0640080000000003601480200306508918145a00a0000005434140d40080000000130281a601024c1880c703285006], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((0x34b09822ab29638384d2e20d14132742b6582867f12d5281006eca501c0793f87829026102100852df66040000004385b0db53a7bc3e7c8d704814b7d98100000010e181f748956d9166a4c4120e90a5ab9f7816681658e506582580281133d10c208a82e5382b774c1ae1e9850f6e04bb8f1c165da9ec298c3e5a4d2d0fb06b2bd40f02c9a9832a893a27e0200032b2196230ca0584d02e710a97509c42a5d35fe70d1352df6a3c0426f44f6ee62a0590f0edaa1f48160935b0a4efe3bc20126b6149dfc7783ec867c7b9906de46d90cf8f7320dbc8a1fa1c61c11e09609805837da9f6769f525b31b8a702150c85d633b35e3f0875e771e5557178f1be1a4c5b7c1b7fab40799363fd8f46c6170ef6a938594a67271d942398d3a3100b81c1032008810a2c9f6354c6068600049642b2210b676d2aa42841d01a3ad98a0878ca0040c18212eb482b404000001124b4520109805103c17f9a606681415d1cd85e145d26e6e2cc22213f610fb5c5082ff34180c980000005dc04402afe630fe94704250140000bf1b9f483c000000002004431317e9d234502200000000000000003897a7e6d57f757d30848f34410c092050049000002e100200d0001982000a06407c2630e0380b18e4ace841116653aa1e1a59b07393423bf51d9648083e01018605d6dd35f039e8ce9faa385066384b15e03e3a4296ae7de0592278c32221622411008209e060000401b2385547a390a24900000f2c30e180f005d9ee20412248dc2e46042720e881f041a7122337d9400000010fe048036bf350700600642345ef8ea400980600003d06b6e9af81cf4674fd51c28331c258af01f1d214b573ef02c913c818619110b11208104f030000200d91c21e79ecb8c91341fbff8150f1248000083d84038605cf65921845821f374c6a644106b8190020b32800000024ea0048045df2e49f6c3000cc38a64c53f04801581600008688001bb90006d7338854ba84e2152e9aff38689a96fb51e02137a27b7731502c9014c14c1041120cc0c708e05c02008036238f956c9e481a2804e1e70870a28ec5843a4b14181f307587e101ca4fc487e29e104865c18aca608623a50a2302002b933867f6440014010207053f17ec181a2819ccc74430e28b08d6c1438a2aeb29dc1632221e5d1e67b0141968d290651101eb9f1bbdee1e1041a7946ac2600834f4dbf87e4801401000007f08001ef9185050002ad11841109f8480035d88c1888005c808ae06c5e0274b7d98100000010e181f748956d9166a4c4120e90a5ab9f7816479450c608484602582700500860300401a1940b09a018c000e2301671b225d4054145c4043250a06e4dcdcf4517ccaadace622202d19b892240423d64f191c000002513284c084e038b9f483c000000002004431317e9d234502200000000000000003897a7e6d57f757d30849038a14515110705301100b82008034000658c0e02a15ebb8a2f2812915111038c209cc8088937f9184c1065ef7fc2009b93942e89810840210380000069780a14817b1d1354516d78e4d0981111f68c23814d004ec2ccc46bd30000000ea6011001fe89961b4c8704280200000cb10002e330381c3e19df40b089bf8d8911801245858406105197b68f1409a95f27145a58af8070a083f3c3fd367042200844f1351d2879ead66892073d1214f2ecc521c2d95eb445f38f2238cf83bd02bbf74186c7e8f9b9768170a0a07c53f3db9e248b0c7ab13f3e9129d0a00019c81aa7efd304005c56d89f154e1d4400a400dc171e584f1e5671c2c9018076ec08a816058ccce122aa16714030101f1dc1d8716189cce494b2bc880c4dda587ef674384a9d10d3df64c082a5512aeddd0288000587a796697232ad9003104800012b100050330383139f19c8162409c63c44623436521a030941e54b0f14322ab26228ba3ae96d62821f11c76fb38210804227922d7d66ac225c88923818eeb783f6a6a439860277cb44b9f888e3313328b288a8d20302a89137be7949e30d451c58987a04b816198d59ebe830d5c4a020c5ef20811267e0200505b019a88caf9971f1b2400e81b165933fc7622e48a0c44e6af9491143f34b70e4d1000000cbe82018000024ea02c3640cb66eb0585bbbf98433430ac2e8679a50410dc86096ba874801381200007cc80025f900063920019b070700000075300e282f9ab66a10e1022238511e47066379afa51c343000001a5e00e1006d4edb4dc20a995d4165140190e20520400001a22306220014f622ba3a15c190ad) <<< 16000) + 0x8a856814002df86c70c4b8cea58adb7a149cd0cd5af606160ecf0c69224041f00858e3de42582343060179150416a837c8e0f04d8821b1c5824c9cc14940033ac6d9c93021080400004c4c0100401163894788f1082f31b6b0c800b73d8a08d018717f4212020f804000033c80008611820d8c0848288262f21317805d8e23f345aa3430e5bf94d9810b3fdfc2c20be7196ab05825e63e37024108ea2c6b84c1042010b1c79fa703a105717432d03c13ec45cdd9608f4e07d1d000d75f833a0800517ce940982084020000266432c361941318001e1000a48eec68654396f8618792be136c918410004031c174b7d981071a066d97226cf9387a487267341216f5dcb933d8163b522376d1e0599a1901861840a20080341486e9727c23b5ab8ef9200790a5ae330f6556d3c6ff4046d4dc40460c7b18a80012918080080200000888bf888000df48bf0c80019b48bb9285d8642fa12000a7234b7d9810c8cd46b16bf35ccdff99dcab9ec122710a97509c42a5d35fe70d1352df6a3c04279d71398c020599838e1920920100281513ff628d13ebf6dbed1660eb7c25456e345d4d46ed0480491cb376beadbc8649d86041937c3117d113c34ddd01fc5d72e45b5b83232cf67055dafea2ef4acc61b14c2d095a2d0020003e5225e6392012f02d7a7855232fd6218214ac2cb398000a0fb3fc400227b9a48a12881080430d4277db404433e064fc4841069e6d8d010465b493a478005ec546d0c004a5d09e130210804206065b76471b49e50ac6cce93661456448c90de5a2a4837347afba01e380d6fcac9c38e3908bdbe1c982408284f7993fa9400cb23679a708e02fb495af968dfa480160182060507b02e45f00f2835a753beea0051531ed44fadf003c70291c732036a94381e9f61ccd500f0c5bfa789e9eae680611e0897a58330004e5515ed1d0000145fc2a795eaa400120062088000256200092a70deaf416584432cd29e700410f9567268e0413aca35a08376b7ef200c00be194031302108042060642a3c4ee88f2855ce265a2a451595851c004a05490722c10e53b9e380d1b657591c71c7fe2186716490209d49265d952801989a8b69130e02fce469a28b2fd12005a0688181904ee513ae01e50856f98e73a0051583784f9183801e381a448703787a50e0792382477a01e18e638b053209e68079ad7be4ae6d98003268060f914000065ced092913d5a00120064090000260200095240017d0e16139fb04061b35e0a73281825257c83c266316802082571916903009b050814c003e010927c784e9f4848e1843d065c2462668cc25c0e323f7f631c0619e325e6fb278404e206ab03021f15f14e6041209c51ac354003087b09d9b900250140000ee9c2c188a309061a00b9dea8f08ce7f8a18208061c046920424bbf2c49044ab122b03004e5ace5a700200084933d550e1fea247053c7c6e4a9230f1cb2d4aac718cbb92d1afc30c8a2d9d6dcc302197726d31f84114f0b9d3320e0402bb39b82ca000e91d4b6d7904801481200008148001ba917c0900036010012ca3b3179d88000000010f1ec976f4554c1c842c5b815d24000000001f7896b436599ed63321212059a59408a08809e00860b764744261db9d4d10c8bf0038b273ea2b7573f8d0559f0b1f350024670227c791bbf6d9c790614a823680016910140dc44371af2c2186a740f178c0a4c5e1ac080002ac4d164041f00851205fa84e4d0e241e7029e0a9b28801340030c79a430009f5e49410099bc1484c003e010d240d0ce5af01838072446e1a1c799a2d08e1038c0f0414c55c71096a7f26998a21f590438cc38308710516146862dd000a4f120012933137e489002701c0000f8900032f215a0b06c05c902ff2aee230c64a5bfe470844c2b99c307560e63ca484b13cc8c05820d12785038203870f30600051f83528501840010c31f610223c222000001c201c201425d3a796183dad93700c1a82ff9223061cb8c4f2831210a4e2fff89012736fd1669e0334f95c68819218480200001d820006f44244541201200080322f61317805d920000032a005143ec20447810183f57bb8f03021c59b1fbe47022f81d3b340c04013b8ca560a04b24e8f080000d6ff422e88002d83e39d6600304141380e00007e4d8f259da884430600102f403b1c47172700e148e562cb4d060ec047bd08c3080021a6e2f6fe3416388d5053d1a180bdbc5f94101e458ff200209c6cbaa128610004000040c8000e49179058bc00e80019a1099baa2db9500bd4f98646507810dd0cc68eb56d88bd2d79031145e9c5b11b85012a99fcbfcbb13ddd52f8c69c0e8fb2c507c801e4d3f27cfc31ebfdb499e760e6ac1000a151a85d8dc5178e3156f2dc5233791cba77d2fa185099dfb6d45b1d0095077d34a100c293803338d133f8e58462cf5a49d5769ce3f42798e7e66ac6804078d36fc65290602ac27f3f4256f27a9cef1835a6b047b9812f57cc00eb00bdb75a8d95575331d0e3b80002bb9177210bb0a80e01400107c6384b15d35470a0d572791bc4dcfe6b0010a710a97509c42a5d32fab4cf122a3aa1a042718a1bc30a0535a74ec5698816838650208258028020255cfc58e36fdb56bc2d0ce0c992771e560b617231ec66ca4060971f24e6192a4feafab0cab273a279f068819d52cbc27e8b4008000da08ba9285d034005aa641e0e74b7d98100000010e181f748956d9166a4c4120c0169b0e298153564fb602a6f44f6ee62a0599428e10e08a08800600a008857d40a2ce72b10362b878b937b0da77e943c8)) <<< 16000) + 0x43843c1a1ada5bc5a6d7fea11d89e3afc65ec89363ed0002d120d61b06a09d9232eaf0ff2f508140a07540e6c80a2bd801eb244182430018ea4b2f707021ceb0771484080043e3e7eac5c0a0494b6e396d320004219dcf41b6800c86f7bd5265802e684101781e305b23b4c0fd00515a794abb5002430000007d000c08449b68702030148967382f00b0400000a8c000c01a7d3da1280003fdc2574c804103b1d1495c4e2808202a0280001099b119979f0c234a7b56911bc161771882780568afc96ff4a5d483f588bdf0421847231b419e5f1091202373813e0bf527f7525f8974e5a79b53bd56fe357af8010444e1c24e508db3319772569c220c4480870fc929a1940c7840aaad057c094dfec0a69a88543c4eda96e96b75f24c6ef0b882bfa0562fd20027b29ae10b2c0e4ed82b269012da511a1f3776d15500863e4f8ca7e27d2d8672c57e25444a6c8c8000504338854ba84e2152e9aff38689a96fb51e02146b4e356a1fb9c8f2d82e5f1405521e59f25e3da50043ffbea421dc000000000000000000124fdc5c88a09f7692ab269dae690ebc4337bfeeab8d4b07fff706a0000000000000000004638c50de1850290a0c404b007010080042f015d838e638a9cf30e390887573d60afab13412983de8c4a81761826cdf1175f9024de2acfc51ec387d658c801a51eb468eff8f968f2dada85a1b622fee9a8491d347d50bb9031fc54b0a289caec6c6a6572a02cf00286a89ee1db26b8cab478e3ce797952e40c59440dba15aba5bc9718cd144bf7993dfe10da876a247da021801c243f5efaa4429775628003df115b05e14333f05674e1e4000000ca26030dac340321f30823089e1d650a68633c3444cff181825375d06d6480285de598f10c056554bf70d4001002b6e3758820102e470a80b1a6aa393e64cb1a482032850bb8c36e28dd644716100000036b01a0a8ba58023d980800001275000077609fe29f2a039522da064918e38500400001c93867f3bb66d8a64a588933fa7e03aa99e51350f5b879179174eaf7618b53975b97d90b3decbe7326e92de11779a3d6b030073d3e72f3453ca825c5ad6fb22afc5968018ba138a0afaa9acb591668c32cd7dee89cef1998f82dc8ae3ea4e7cf279006482f949f4f2cc9da4b0af096febfcf92967a2742e6bce82645ecf923bf6f7465c0ace5f77b44ebf03f80936fb4e07f4222c4878c02f3e47c981489f7f5c0ea93fdcca7284f410de199c790bc37ec8e56105e2b4015c60792ee7fd890bd2b8000180ce1446b778c280d18764f587e98c328cdd69e76344f4903a3ae47860000046500c0c12e74f0e81200d5c84b8e0180a5f34b07a0000e46fd247a1100f12384e038f28000003840346873385e1bc618446b2406e3447271c5e168d0c14eb51df034135acd42180c040000065400009206e4b4a1104c40e1300a0000708f12152846bbe21089997e6419785c193605016440c7e2a7ad2f49acb14f1a990e88d99e3053441452d6c4ffbba42c2bd00cee5be0099880d57ccdb017f975c85f51be27b89ce9c181cd3249d6ee6834f5dbe313b00fc3c2988c0d05c06533262f4e39ce0f4b7c7ceb3143c0353c33b73111f33581b629b0565cc0fd58d4151334c6876a8e58285c1d9a529967e302e565e8c8c88bb8b3cf82a41a3f11aa4c4538a53edb0e68ce698446ddacc79e6b7f180a0d2968a085797e4f4d0f4fb4f088cc96439decc57d9e56c1e2191c9ac4d190889e20001a648005481a0623ec287433de1814473e6f24c7536fd6df932e74f099e98939eedb660b055ad957e99b5c101840ecbcd97b1167c66a4791cf80887060d0701a88ca79fe0b4b0225be5cfe845f7743aa3c152a22e27fe8ceb318b8a0af2497ad0d6329ce635300ac779bf7b9e8bb5279335ca2abf7e4e50c4e690d58f8ae6af3e253c3c9270700263a93870ba6eea77d901a15576a048a1f872d1d36323bf4e8f544eaab3a9011884ff78566ecf1c93e73b5236ec1849b837d371283916902bc7e01fdf08ad500295b86ee7ce3c4baf04078867690f9273e604e46788a431b4769b2693458bf796c778b9d7470eede8be98395b59f2824a659dd66205e3abf65b0dae4f8104a43688e09cbc89613a91cbb8c65ace65058e49e65b8f91612d816cb37c7053b3fea666ea8542a4633539a0f68171222609c9515897ffcb60a8bfeeb499317aa4c1b91fe0038610f0bf2b8b5637166c54d9ab262becde9a5b38f77b344e4fbb523a5b91e7a3fbba76d1dbfa8587c4f7a6508c52223f5718bca0bc653e8ea8000bf022e6520020eb20f05b9c42a5d42710a974d7f9c344d4b7da8f010a710a97509c42a5d32fab4cf122a3aa1a042a1c9732e9fcc768e59dde5772b5bdf1afffa381fa3c8a1bb79890000000000000000002319428e28e19008800602a2002d7ed834762c27d8eb7844826c086dc1d29f397a48801bf5022c5c3e73e73025365f1db6bc9020c376ca74d0e80d785fa7cfc17b5910930ab9d2c2da2c9a6cc8c72147650004bc22e4621712d00a1485c0640260a0037db34b7d981071a066d97226cf9387fc114e3ac12400886264fa52747ac00886262fd3a468a0449c42a5d42710a974d7f9c344d4b7da8f010cd137d344dc8ca709df8f02a6cc5e7620000000043c7b25dbd155307210a9441028a11a0ca4919f2d2c8c67763bf8bca117d796cb1f0fdfd159ce7faab36b7f218a97389803b80e2374d01a1706bf4a9a27378f029d90fe45c008bf7f0331cbdad85ec086196b8ba44ca264a016ac406bccb040d424aee90498d8357)) <<< 16000) + 0x288120cbb19902cf1b9b0f45093164e036582986f68373000b83c7d91200191f218009c30840200002c44378261ba03e249033b97848d354a24cd2820e6fce929210c177c31c3078ad586b84a0842010e24ae74d6cc48d32dc31d628219b8e59d921070a6b600307e8f5463e68037f1349e26042100800009890e105f122ab31216246b91eb3108c207375cc6c20566bd4fb4120410804389244b125d123541b73f14610444fe90a306254a585e081891243e79601130914d4260821008000099900022722de2216e09000268916d0d8b604c14417002218993e949d1eb00221898bf4e91a281156dd35f039e8ce9faa385066384b15e03f76201b5a74ec5698816858c40c30638030000c8423fe4d602c594843d92924a3faa9f3405ed07bafa480bb4c0f3d5f29f9dd8a2fb532cd52c6d487e18d492cc96a2d60200033520f05380110c4c9f4a4e8f580110c4c5fa748d1408ab6e9af81cf4674fd51c28331c258af01f22852051c51421c10c010137f8e18c4d9403d2588e05c8ac0ea4a84915023ca05133bea80bb7fa70f93b4fba946ad220b9acd5346bd9cbceddf24a10a8027e8b4f1747af0ac614041d00036022d4630142183584c1a817a4289663f8c8167c3781e21040e198f101413bbb09b69a013774bb48a002f5a0cca820131010804348173c8a0e902ddd2d09b0710119380c600811901080400002e08b488c0d81783a081a6b247129a10c45a5803d6697f91c0275aab0e0a003bed30e000402528210080b40080004ac8b382f0779945e5b1fd7ba5abf5247046bfad3ad0928462ac1c4dcd1e72da825c2488602811175bed4f5d0f218a861813425f36c0f7e491a52530072735009ddf09e1c5e010006b2a478c81890b88b400000d9d16bf84a51d07912225e517b64414e58981689c42a5d42710a974cbead33c48a8ea86810bb32917e194816460e38850230258038000617037cf555d07ba0ca44eda88bf1c200ef2eca75b9e68040b7b14cb39b950f7199708b11da400d279830604c58f62e500029822cc420005de20f063b5ae28973dc02eec403adae57857aa98bbeb36380c5ee1546eadae57857aa98bc2b00da375f1845eb0f8ca148147146003001010062e2d4ece07eb0ed8367232b4ba2809243891864f5520907166b8e091631622ba0f4b7290659cca45d8c0739bd322c3fcc4f104c574bfa39afb95d66deff3e5915a9e5a92f4000f388b29a800368c8b21a8080742c61200216d211023b828c127884ddcb5c146093c426ee5768d59fb0885cdefb46acfd8442e6f80f696fb46a4ed26607d1503e83a2a07d081f21c2142102081180550501f0b315fdbed7e484589c6a72af63e6c9a4f4cbb7b88848041693d45ddb0b5a6025dc59c2d8d0b265e9898172ba9fee8dc7afa1e850501a8a30937fa419078c519e31422c6784559182f9477d5549ff288d727eac982a8b0f7f7ae1440e4d23dd242e072eca5aab99c57d00052c38113e20c6c3664404ea456de1ffc0c10f6464bda4c060043fbb98228614096f447feb7804009b5316153e840450272cdd1a8e205dffac69fd645460e26f3175181406941980b80c00004804589042c25a160098af828578050334afef6c08187083d0e7d06d003052fa9f2e0fe61421b865cb579210006ef160ad830701788c4b96dbe28035d955afc4c55141126ef875bfc8a0411052ff34daa33a0168163120437f8ed2c70f5326ac5547ef6b7366f1871f9424876281c81a694584582182700480180801006c0d000030f0869a95bb82768e2d649e48ac9a594985a69838ad460bd5a669429ecf4794a0000006d4204e104601000016f202813c4810dfe3b4b1c3d4c9ab1551fbdadcd9bc61c7e50921d8a071c59a51441611a09009c0180401006e9a4cd639c00e2d4f6303bd9a5992d1287b38ad9bfd6c186941779408a100400169b6914000001bb752704230080000b6109109048028000bc884804fcd4b7cdfb13e6180313ac99f0d28372b4b9d698486797417901c108a1f69edc68169c64b0bb0800000000fa0147042701479a003b450acc3133acc3221a5553c878e7349cc6bee43061232955e20c70431267e010a0000064d042704230080000b6115d090ae04856c242b40200036631c258af5c2a1b8378f20cae0f80000000000000001c4bd3f36abfbabe9842000000000000000c4810dfe3b4b1c3d4c9ab1551fbdadcd9bc61c7e50921d99641639438e29a00542d5bdeb34dfddf6989e6f6380bdca932f298aa6bae5f0a0abce83c7c016bb5ea73cbcad9468e48415569c71eb68fede3aa37f8c72c4147390c7a000808456437c4bd3f36abfbabe9842250e58c50c3082041044001808821820010068ac0080003dc89d12f8fb80b56b0017fee7412bd2410896492314292290086096008008020982c010068000839e25e9f9b55fdd5f4c2112041c41431021c128004051041396278a1b9f4ba069516383cef76aae7187972f9e7a01ee60d225500019020e41307101f11c26316d0168ffdb40cace89a3a422c940add8e1fbd6199f33e97dabebe8cd2ae1be9527a433d1830fd33a49ac2d03455186fdf14f9918c2b6f3818201713740f9698e1959ec042d51b1610d48ce840002e26d349288957dd89ce1a7bbc32397e0fd20093d596ce7ef14460e68c831fd8c78c83bf9904110245722f6d04dc91bd3f7e0465392debb854d06aae2c5410e9fe72c89c0a1e3e4d14f24c7100009dc4005b808ab94ec80cf2e7f0a048cff5bce709ca14000002ee012289fbb54ca9284a2adf4872a488f57711c8)) <<< 16000) + 0xf4904f50b0d93a1470427014593574902814a21eaf75f15942d881744872848774392c24890994a06a0b0016d3159c0200aa479c5c6704230080000b6191c16fa80843ae28ad7d29fe1296244d1fec677c1410200da735570e890c959f8c16f2e406f93504eb8461c2677bc4e98650c003851f6cd7d1054a9133e515b3a020b40b0000446679e47afbc990683d3ae4bd1c143c502812c92c8208285245284244182c00008036c942bc29926af28887fe0ca922d18616dd66a86fc2854863e7d4388245558f5b4e87128447911f49f8f2444ffb4e1fef020101e5d992eda1c00d548ce7258040037425f6b1c9aa800b00a00004b268a16f5890b492247a1d26c7a2a5145223653f222e244446ca89377c20495cd0cf46da2434e641dd7f5520304132ad76ee1c204132a283ce060caec26aca568042c02800010b9020098002e19014114f3c8f5f79320d07a75c97a382878a050251050e488408486406284382e0100401b443c168fac0247aae28e13648c11791bc6c911fa706107902435598043203b34bafd623820acfd8c6410056378d96b40211804000066cc0d1ca53049a4e902acddad0c126630a153e8486c680821181d28a9724386e92da267c009011d070481f4763843fbb8ec7f1808084edaa85f88e10690105c0600001ff22ac13155010002821154190a98c8548642a232150090a78485382429a1214c090a5848528042920200115e229093147458a320c514f628853088258a190c508760e43314115e111475d25bf2c288f70c3a817fc1030e1c591467290013675cb7302070370fdb841370280e69a792f3c0540541110ec96d274002824b477394dd28c4bf2d67b510024821c279f4b0199b0b40c1c580cd03c4c777a6cd1152e83ea825d70d1b00c8918e7b9e0eb961012a1037e99118771af92c82d531a86f7acebd68acf0bf3b21c000287de940bdb76041e292ed60bac9a3106bfabf6f19be5b48000eb1e53efe45b63603c39ebba36dd4cc7c5ced802261dad1622cb2dd05ba9cd3bad5627fb7f306019702e75c5905d1cfdad14559fb280fd2da418601395d767aa82c7200754b1f20c62148034447e0d23d5d29e001115ad92041c0046058da404418082f5e3105824ffc1ada4018c9988048083c0100000cb300001004500659e3f3080b7940e022001e00800003a114005000063101409e105028831180040b77fa18186d244c908c307c02027e020000bb21de0b9e27e80c1919a8d62d7e6b99bfe4a48ed2982416e5fbb439cf2b99a62190d0edff04820cf5e1d8cf0dee466e39a040000000000000000001251ab4c6617b40b2a483331acf58f8c4caeb0550d28908808b000000876dd0636a21625a66368ecefbfbe0dfb4733c87f7ed73169ade6a554714096c453d0a7d6095e92f1afdf0b572ecd843376205e1060188bc2d226bc62ee1752cb2281a4cd4814648906a0009de400210c89f06f80949b5c580488a0f002201002008e2ecb1adbf470e27d6e2427c9e4994b159a42c48f93dcf74a63f0edbe4a4168facda81f20cde7d8032060d7c2bb6f6ca3adb3c168e25831b0b009a6bc71cefe6c0c9424698ac98246ba8b6840fa91b00f9d001485cd4cf61fa2497eb4fc9c6491fa011ea7c8982caa565ee509ce36366b482d5e4ef5a07174e3e0073a4d32410fec6a36a0170d6d27287f01c4533995ca9763d78c057fbdcbc107c06921bb6948fab093cc00b887f97a8824946f246995727b34a7f422464e95c48629746756694b152f5531849d236000192887782e0126d60cba083b033f72024103e008e2e9b0a7e9c77a6fc74b5e2849004eb7f327a0390bde80a94d5c2dad9b581ae4753f09dd9c4dc4b3bc80476fc1ac80ad0c6f683b860cb99e8ba5d5ff14a648f6f5721c8d4795c876692c8d705a51434c7435001167603a3786a7352f6fa835278e09be3c74196868c66bca6eea986e467a2f92a8202d7e0ecaae640d919225ee8bad8faa948eb377b3692e61167d32ff67e47a1ddad45f9104cb8b80065654effdfea25a706eb41ebee38dd8aee05e6b99905eee0c47a26bfb15e126c16cb2f3e9cbe8694e284612788e8000654227a1a0006fe2001b6a44f0642762202b0900073199e27e80c1919a8d62d7e6b99bfe4a48ed2982418b8efde2e3b628b8a24769b0166fd61212fe4a670aa3d8c58ca32c000000000000000000124832c9e245f40b32871c624210230020041002a986d77eb92055f7f6f60fd18d1e64a6275d5982d7308526f68daf822715e8aa6cc7ec7360b6e20dfa09383e90408017d62f89742e6a3937a0c2707edc314821cb400119889d14c4e457842e7a3ca3023ab3b725b10311707fcd2130b8be58192478a2f72c60d82f198d6ef9d75782a1c2b344025d9080dea805e77d80aba9ee9f1a98837fc748401ead74e97657dc04c47b3f061a68f61861e112001f8b83aafedc73dcd780fe70f7372a1643712095d9ef541234548f3e612bb6bd22bb743a665da404407e1182b4626cfc6702f2e547e02220fffcb58669b1ba45eca90490d6b41d68314e434971e400028111383589b98c4d8961e84206c1589a84c4d0162660b13201e168df487dcd0c2d780e10a04acf3778c60625c12b51000d4dd99e4b013a895d34026102000861525a0271cd0c2e4abd9060ef6b100a0a048846af0c605a4249e6909430800202480200011720742312c0581c02e96fb3021919a8d62d7e6b99bff33b9573d8245c3ed7399c8bd5d86d3605000000000000000189021bfc7696387a993562aa3f7b5b9b378c38fca1243b3185)) <<< 16000) + 0x2831830c14002c0002fcf72759fe481f40ade33bea71402248672f5adbdba6e6b2972c0e130f9934c7f92ff78c61c0f684f86dff42340b2379a8c0976d1e2ec1552afde030e7d9b978c6efec8f858816f294ec389ac9b3e0660059a534b81801e789f9e12841000404c407038724d6c930508e8ef4440b584cd740306717970090044c5c5af0a840f8022073869094f1829252fcabcc1014d9fd0670029147a7d1c0150816e282041e3c460c260821008000099900024922602203d09092048000ee080040591111581b04f7fbd5973f0fadd990ce702ab87dae733917abb0da6c0a1b3179d88000000010f1ec976f4554c1c8426206402202500300180874d672bfda1e92d366c1573b6d899720d21f257799402032b9f1fd402b5e2004c431b3cec2c81e18a28c88a04e02000306225e5b12e1585b88f7fbd5973f0fadd990ce702ab87dae733917abb0da6c0a10f0edaa1f48166cc5e7620000000043c7b25dbd155307210d601b46ebe308bd75b5caf0af553178566c7018bdc2a8dd5b5caf0af55317787ca184582502800016c0a5b57c9680b8131cf9b8629436726a3432b13e1ed99682b389b3bbd43acb9ee962b4f88da6f1cf5230ff240ce92cdc273e01f135dd28544e278489025736997881c9066120c90a13704f866e680c25bdb8e3940c5bf7da030733a66ee005050740102480a0000e2225a2b12c0989584e789fa0306466a358b5f9ae66ff92923b4a609170fb5ce6722f5761b4d8146cf8f85a32902d1ab4c6617b40bc46fbcf6f7ca856237de7b7be542734b6fd54d240559a5b7eaa6920290e5450ca0830900000202b52fc4be5eab2ff209ff9ad2f112d9d65a642cf40d28d3f96a8e76f1a4716c25c2e834340b52433bf2b7936b5552490eefea08de2a142d5395e0ab1c05b895b1cfa84a2c7cde084fed453208193aaeb5440884084021a406d0656b206003393769842f97790ce087bbc3ee0a08bc372f220099b1a8c284c183e01012a0100009f11270df101c04c414a182d90759080d687c50c38020c05516048183e0108102c1948f668a033582e270437ae11568020885b2dc4007416c368081ec85e84e04c1840010000130225222128050001241d28021146de60405f5adad040ceb934f21182108043883d2c4828810f73e827200b09711808c1078020000142449c17c436560d246844f3478a880dc48bf5c11840f004348016a7f3c40c6afe853d00593504bf10021306a96040ca561cae12840f80400003f08000dd11261100a0484942400071e44903400102640033c08888cc48c4606c13c2cab859ab5f9a02f34a13b541ae0821a048c00f55c9871ca59c771fcbb267fb8b283047fa140c4c5abc5d8b576fe9c0b07aac160961553a4bb051faeb62d98ae38d6cd604068133ce3cc47d14092bfee5b4a2d5f6078122d95fe7ef7c1406d9b3601e9fa2eb8005d96defe452fc4ce6deb710e1479fc08007008f00dba77f729997e22906287d17c68bb739f07843e22d3154a1b7139778a744ca3376e90ba40e92f1812235dc2d9f227f28f09bd735dda3983c4940d97a5403558c36404265fab0088057c1b524ec1e770fbc630b9dd1b867b688326c0a13d356c83afe3c3dfb38f41739f9fd0c9146d9df0b67f47141e00991a9cbef3a54c8eaaea124cf0d3fc24f815403138b6392f10754f85180bbc1c1af7d62507aac4c7401de57b4a2720c6315004883624213d17ad6a3d018130fd4db314284b4f8f668045ab01008001fcd49780004a403e01000010822402a00064320aa5a10a21013808002b88800f45911f3ddc3ed7399c8bd5d86d36050aea4eacf3d80b2243241181300240140100401b522e168bf5d06e75828b5b2000cfb290a46f4463f373c5b0fe88f028474140003d44471162366311a0d88c84e44018a06253c007fc7be4300aff1b9cb24021a76ac9400241c2000858c075488b428036ad23ae180b23189a000140b4dfac0481840010c32a7c009a20fafcdf0d24103a00811801000044910f0588b80e40061b908286003af9d4820016905880423042100808b00f40df23ec11001b00440000401000004460f229573c680352acf098025375eae46083c01000009e200027a7c1b465dfc51001f004601322e4911001c00400002411150508a0080003608898884304400066a40013d48890ec444462201b03605e869c81a72203bf769a69a0f7e66484601d0d4dc2048183a01080e236ace2400c3df427024183a008000078221e1310e05c89eff6e561840ce82a418114cc7ea470519dc7912000e8042c700547c90e1276c8fbd1c106b2abe4c017bb10f2900078020000192407c1621a03814036178c4a14d475d041e110f000e6282be39863648083e0108142c316a10f14e31d3311e17b62abcd340442fded648083e0100000d03e4eeaa5e23080470ea31000015a567c023081f008000053100027c22181a10b0900024a10ef11e0c49e0b3646050cd834d1e01c2d46c2300981aa1a438034cac01800025201f0080000841055250850e809c04000f5c4424c609a0b8060f7c3338764a9294b60566e2f0b46d97921dd9d2d0fa1886e040856fcccabbfa99eac2559c241386d6e9537afb69127500c6fca62955ecf1591a71ba8cc870585e30f4470eba6a236882036c27ea796d249b9e06407e05bdb1b88f6fcbba6a5627574d763c9f4967266cb4c08c34612e769bef5bc40b5a6683291bc076c80228da9beead66ce6b7c9d13c184292da65cef6291eafdd8a2360991b0096d7fa1ae2d7e65003c70e3f6251dbffd3c12)) <<< 16000) + 0x4811dc5514e31379f4ce5ee0a21dc9000091dd52300fff1c2256bbda888e8d5aae1328d14121743d39b3b85a72408efc89cf4e7740d124ee461f170a7f781d8b31adee26289abb2053cc55119006648c9d5e9d273e7211fcfd382daca7168bf4e931ed8640e0b3fa6fa3e950a3ef0dbfa13ffd49e18a5efdf0be940f74e59433535b8d1d0c849efa1e78cb7c1d21a50452d359b69ffc83913501ac66c5e1012d2f4306d059565366dbec241e29584a5481326fdefd9685d321749a2881217adcc07722bde6213ff2c98c4da2dadd751ac402c6b29bf329262a9fdddf5ca5fc86c4fa0cf80f4b5a080057f8a8fae56262e1ace25755957ce428eb84ac187da027ffe86e1828a82f58330f5a45871ce90a29887004e0a00043d20a64a1081d883888003a088281ce4396964f590900ad4ef4801402030cd9e8400353713495010001424442200800007d91063d082948410542060a001e522009ba441c8460e20390b77fee6f7151f5b10b82f2b9c674709c3e5b7d9a32c08cd7c3db01ba9a411f4bb9f5433b2177d43040a5e21f26e695f4a44e039a38556ff63c91a77b5758186d8f6b4d2559ea68e40af98ccc490cac0c0cb744817377e0d75396009a0a6bfa76cf8b5e99b1266f5040d19d9e98d546e3f0923c404f78b50000d6783920de7307808ba252a1cc561ccd4f86c2280dc37f18ac4ed118a0b420469e39e740e61da41ab4353100452e5d5410e10c87565f9f1083bc57ccb29c3f4b4a407bb6b0f98e8cbcd73060fc349a9a9d3f8285640b1e0377a63ab7f358b0234eb040b32d771f47a4382beb24020912d61ff9cbe2004f141383ca2e49a856f8349481301c06454ff00fd03c0943df9e194533ca45c23b256e6a2185d287aeae7e6ab06610b50d77a4fbf8bd7e8a576e80fa3a747b6fcba74e695f3931e815661f8d6743202b17aea783ff7444ea08257c303c572511bd92dccda967a5d96d56c14259fd08985a27361354585173e53c08f6fd37a56016b3e1dd9f91686d02d6df6eec8c4042cb7cb8410ec5f8cc005b646ae2b2e8bc3f18a2707aaa2c0e6e2544bd291f477a02fe5906c2897d434ef838130f5c9001aced766fc78005454539ed29431a53cd1df1e7e1e0cd8000be599c104ef88cc0bcd8eb7487241cc539ec55b7de16904c9ccfb01b92466ace43d4e2362e18d71ab716137b2f7a272b59da576dac635d381177dc4f80a34a0c8242cb5258600b4d8714c0a9ab27db01564f67605505b0ed03010c055b3e3e168ca40b32861862031c3240200000039f4d88257f36bb2cb6b4b3578bf42f1748161481697ad60a49ec0aab143e8c178f441db244204088a87ad1600f2f0b3d4700af02918e0806f1e098a000251c2100871ee97aee185dfe84de4a784435cf273d6739e39154b40ce5516fb021504434fe77840237934c0d116dc52aa10d2c41ca4b7f1de31841ddc459abc910850c45cbb5739479027945a47bbf9c2f79000c0023944b564378da73356154b2961c342292e0a17c818984169cf692592afd90059806599831469924ab37a83cd88abc571d2611b56e0b968b0a0cf72f333c31e43dd374a226a0864b10c0204120004e721f24204d0100031d90008a321ec5b1011d8800ac3fc461e8230f205f026065549b781db05150ef18a96010baa42075224e95217e83b6400ae8b41a2b01581f283e6b6e0c0203ce540c27f4d59461364ee0030f92edab567a7cad80c593411dfc6d5ca8e97bb125a162b16a4ae64065eca31d78e37d90064e853bc16562560d2f1ad294483e4138ff87fb64345e0fc60755fc67190653a3a11c72e07824abf6f41c7ae7cf0b6afd14f46a81ba3ee022388e1de3cdc9eae5c49b2cecae2124ff38c0635e52b5d80e63582db07436175a60f3a8785584c5428d2f1cda947406ce6c016b2ee87ca8af84716fccfa77d39900a4a4f0a141516bfd362556916a635455dbec45ac52a3874d170bbc4db18119f9064f06f213a012013904a4dfefd0d5d67d7a0a83b6f28688745e26e76dbb542f72fe55c526a3f400064fe9448a597b5ab44272c88297b8434d97d6cbec6a591fd8ff0e85bf218811c8303283b691791e1522db81f5f5832b4d235b63862d767a42145c5d91ccc49eb91fd9e30f64f001d2d4cdde61012c8ce1c0e13d17364b4d14014c4d4c4a35e3b5be13fc721d3a219a3ae200a3627e9f1ad303f88bb592b99bc2fa4454000ebf95d3a63c839e63060d0e9d9db1466486d697716e896400e490294c5c56da81aed00740f0a0283bc2794ae6c4a617d298438d0000123080057e10ee390769483f8241d412000f0321fa930fc3587d88c3e837020010044060040101f2320f81100002610f7218298af4a27791c8a28b93d4b1f08001008a8b20200132c1f00400005b90f62987a8cc3d0261e6130f201e10406b2b2100fcdffb4d00848607c0101e213c00bd0c8537783b3773eceefb2d5e3d6dbbf378af87f391969009987ccdc943601535e78d3fe2006a6ef122808b2a8de050df3f5066f3d4541b1ad855202200ef7303e914e89739fb4a339d281028b2f838fd24e43d38be6efe76f6a52fc09a7d711cb3060f0ab959a5e5c10624e7cf6ae8b800c5dbb0155e94304d1e527ae260c6c5504eeca322366a8647acad29ce99ff7bf2d5850824580a4f63e27121efb1fb76323fff69eaefa665dfea5598bc22e4b8a870f8cc95c939431d264200002f890f02187780f005a6c38a6054d593ed80ab27b3b02a82d87681808602ab9c84aae5c2f0eb8da9e1867dc1f10db87f4493915e762bc6a0b000000000)) <<< 16000) + 0x000000000233291698f9b3816858e48448040000358d8884b3c7e17ba6879bba04194aba8449044900d56b15474cf3b5f457c8d7f3480baec20cf73a198559bc9ddc3c03cebe21058d7aad4b0f9dfe9bffb0e9ed880a6f395b36ed7ee1d6b52f307fd99b2b6bb7403d5c0777d09b3b17e0c2c45547450a42ceda000afa6ca04cbb3ef2313ec3af6f6a94e3b8720a3ebfe208643123b6b3cebd49f004c47043da4a5b3d4827366c42fab55b5ff5cf9697960bde864b0d58ac26a9ceec8380acf3c07f4c1ee5b2567cc8c6708bd8dc0196ee2da4bc266128680f2380d307005c9544e38901e5cca85fc5255652f83dd15dc286f06434c12ce06a7e3d5e00017891141fc8197c91e25a9b6534922fb1c12c422cb1e90a2567e32fdc781e04ee87f0cca33f45dfc0d4ffe99e8ce7c52189b1ebdd12ff932435c3635b4e2e548f97dec114ab1507dc7b70d025a7f790b761f9f6fecb6158e42cf234800037190ee310769083b0641d62a0ea090009e610e93d07414839c541cc2a0e505000b1f100343f3231cfb9846fe3c14e64cb48875ab055f58ce64585694c9b83042f1390213297289dc1e55ceacd451d7f6cd2c96ce30480a047aa53d2138044859fe8667d548bdbc24a533abc4a71400804528053c45b127777d8f614902fd67eadfe80ee1ecab9006add28e8e3205b1eda12a15ce4e73d56c0cc7c53a9090088be0468c218ffd759b4a5b2915d0135d4df58c309dab95117275fe66d2d7e5b066ffd248648c2ceda7b2c2810c170413c351eb47ed331d950222c004a69978afdc9486f9ec4800ec4fad33fd02e1c715583266e95dae2fe20803bd024f0a020448e952589a9d2c0e08c5bd0f980a371497a10464b625c0003bf100472420177687ac147cb706c902605c401667ea0189604ff7af16dbfc038b02000000000000000000000000000000000000000000000000000198450c40c3046005001014114041140d72f37fbf2a41bca520f5cdf2979795f7835123760202b5853044af36054d44026c1a45fb760c6d72d95e0b91d631ab18ac610e569055ff502be0320058a60c9c1ed5b22cffb172f7ac586d8cf17137b81b55ec0204e62ce1da67d0004ee2018684403bbacfe9d23452004431317d293a3d60044313208a384b15e6a8e141939e8ce9f5b74d7c01fd1503e85a2a07d067693303d2df68d407cc80870850820440004469961f361d91a8501852e835894f1f6aae42f9312a7c07ab967a14200917efa80b3694c9619bd80f5ead31311760bbda0325db5778bcd8140db9aef092ac27a4d1a4d66701752b3a1edf611e402cc37d51360bab4b7d9810c8cd46b16bf35ccdff425283d7412329bf0521d9816cce2fa3e08266dc1ff6d20a98e20818a09000c008000080459cdc4aabeb7680ce0c64e195ecc3cdab91bbc7c400ee1bcaafaedf26ca4565ff62972de18c28081a1000ba5bed478aff38689938854ba538854ba810b67c7c2d194816440a28850240220230020fc6b1e73eb54c0be436afe9bf1802c0180b0ddbc9647e3d8a6d742e945ce85f88bbbda916fa40f88724c62876166c8c2c5d0e67185bc08d55b8e1828a8ac1404023202100848cdc1043e61859b60dbc18e18494d5abc508f7fae4d66002286e1f524017e8e67e88204c404201000013f21c80a00022721b8320510d00027a90e331f4977cb191dcf4216cdb4c83db4c099e3349a3efaffe0c44c0000000000000000000000000000000000000000000000000c2d20153262cea1ac8166488388206300200080009274a4254589c3eaaf2022377977c99dd17ab0f9b3f402d6be995d089c32b1c820e9ffae4cad71201c84ac557fd24ace76039446c4bad0ae356efbf7624f937a87100e87244b125d0e3541b73f14614444fe90a306254a585e081891243e79a01130914d426082100850e2ab306631c6b91eba348c287375a7f020566bc9d941204108040000364d0e3ea8710f1c6a0fa4ef58c18a16c3bb8708382d9af018345fa8e532c0205b0a429302108042872096fb718e34df1f352cb085b45dee4384439545210c1d6c777ba928210804000041087082800099487008c37c278305a2bb5d89189e1678b830b385b4c841424d43cadd960a59f3585850414412e2a50023531c980270c2100860c951e1ead185aead26cb8a11ca4e019c9047e9c6c3084818420100000db21bc120dd0100014110dc0d06d86814414000f5a4368b403e4208c090458280031748451a800525c86c9cc050861b013c9ecec0aa0b61da0602180aa577111e8d85f191289b2e866c4b8498858d125d4dfd8e400000000000000007cc577709e37a059b9fcd602b93c8de26a8e141a11c258ae8428284402300200a20a47f6d756c02571679000f208a583c70218be41600c8d59f66f33aab70e7c28a54e2d2bf9f0c28f698a3894217bb89da38d9d29dbad6b8576ae4a46fd3d2070b10f6d69dd00a0189efe18f874cf6d9369bc24a84f8046a53920b60d33a4f50c258eba9923514438efb3c4fd0187313b4b018032eedd9aaf477f430481b9fccac4fad09176000001902e35e8a7c11367c7c2d1948174c98b3a86b205a0e21208a09000802000194b3b7ab43370cf14cbced4d95c771cf34f37c70b03ba7e4916fc479bcbb9fbb9c7a6e5b1d0e458122244c99d7152cc429684002e4801fd535e4480d7fa9c533cd425e04ca7620fdcb22eb29881e7bbe81b2f254efe1ea50f52c2c3c0631d9a1e4180d146bdaab8ccecf288f1cf3e30edd59d596aaf890be9980a6299d0f1b5c2c1845097993a441ee7bc1)) <<< 16000) + 0x0c77de631d4fb448728fc5c966ac199806a36c96cf5085db3558b404001dc3aad10eed13f4c1629af781a874f94fe2ffc3302b48b998df6dc9ab9e34448b297fc61b44e85e6c14a2c111994e1fd439573c418a0d08643f12e55e0a35d580356a892e0c9491041e4800000870612850709a98c3333d8ef2c508190e6c838c20079dd8603060dcfe6b014103aba79747802d01b4cd0005db9aa39d480110043c90dcdb99977a50c063af39d73c61a1486f738ba1420257afde9ae303289228f5ea03005465f3419cc40091d9c69b368600dcdb81dc7a000c6b5d9b0009682400ac0b00004324348161a20b0d00586b80c3580619a03d28c9819dc86798e3c6709028e9e02c50ca26fb5f8be68616031ed16298b0c10a173d7f7916116c42bfe9e201c2028641035a604805b10b28da680000d7400e83d6c4e209002f03c58e1d942d738471fa3d676c2c9a30e2b769118344027a8497286866517b1ccc8a04de44598a51600de44526bd1c028983541c2000866802de8764801380e00007c486582c328061aa030c901c9301e4e6994d0f20000005eec01a20afe9170bf32449e40fd5e3903082814634030041038694445b01a18619c0a6e47300161adf2a85a0807f05beca8b2884801581603500702c0000041eb005150ca3c58a5ae3851f604adaa35942c932e3b14e28514b5bbd7ed98c7021872f5c52e9340129bc0abecf84013d8e61190b80000cf562022dd5189002d0347141ef6555fcf70514c1a48da0cdc08120f7be79ccb5c80e62e1a10ccd1850ad986cfbb65ae28b265f1ce535e468603000ac9cd8870002000669787028024eaed9af0031c112006008000024b2000928749040ac02ecf49248c6185ff02b0d1c1c999f4c79c6880978e0d5a4a244aae9457561e102043a7288f418804017edcd265c302399294fc7a03000dfad972d4bf4448016818034c07c50874f3fb76e48ca28a27a76d8d88d0710006009e02d2be285ca0c9fb9f19020e11131f00c188a006080a245d55b8cf070217a07b8007e913400d9b7996879bb0c000517098f396c24ea012006a0a8e282a88bfca6feb94512382a7f2bba04c704731e6130aa050b30af151220020d0c3772db5cc060121031d50debac0e1c216abd43e48aa43040b8d3df87a254e0010834029237debdc1200660900002682000a004001d70c0a0982fe60606f1a506584b4a5fe7cb1c209efaabfbd038ea85ca64918683431f0b4ead0d2e8e10ed62fac656e84081229747d6db010544ab7301f154100073dcf19875156d648018820031404188020980100014a10140d00088c10d10d000af49f24000003e4ae1430544c4e7c94185065f8e51f60308763030973404108ef172bfcf92105a308395203c10045566eef678028cfec9d064002b4ada13b84f6320056050f2c1699123669830cccc9a040e9e1850a3e24a946d0c21952dd174e004106a52fd682e6584091acbdaf181400180d7b97f186006f88de37218003660c34419a32759002d03400011690d20586882c3401619e030ce0186680f080d7ef8215e604110d9b2ff2755481c1977dd9968d1031b60a649afea186537067f2728068811a7f25126a0c0d01a09284e5614020341348a0dc00050fce6bdc3afd652400bc0f112427eda19c0508236d40542d67d11c354ca763f5891000000148200410cdd1bac1e30b08514f1ac0b10c00614017aee3080016b02e0860c0013be2f63675e762400b00c000044878f2f25384d0a0e207db777aa9c606065b9a1b40161803c2389bc41861db6253bed961093f31789ea38433792dafd00412b7841b5cc250224fcc7b398ee6400a8090198020002222196130ca0586480e08ad4ec783aa30440e03621a11764708141f0c113a00951a20206444ee26721041fa573eba2f026060ea3cda49ba9070c1b529b84f597061f744830cf279d2c107134754bd00fd25cc801982403200618e039262edb4202c42460dd5b3ef7d85141d24b5a29f34408589a86a4c910368938d7601046d83c1e524cd041bab69815730007a1bad19ec0003fc3eae8deb2c801501203180745525c56b80618578af40670a334ecb1c2851f3e8f3e8a2bd4dbb1a8e08000002585022301b1b5300111a44cc00003203709320042008a2a38779f4bace338602b4b4eeeea706180ce9f8f31d05385103c3b3bf2b30515ba69796e75473c300931cb286008d0c1d05cbc0ac5928011f77ecc2f56800005badf742ca2b236c80190220000978800217100066c303017715af40ed42c7008f407c4363471e0a8dd8c4f0131c60aee43c5e5180c0c0fbe99cee2722c3004a73d9d424030c243e122a7569082afbe0cf6ee014400232a05a3db82a94cc8019022031404188020c30100014f10140d0005f390c20d000989900180c20065384304a761cd003e3ec13e72cf509152a15fb0169b1fc3225de1ef94c88fabac7c63d8d50969811ccba8efe73a95992cc00ae095801810cc407f95d8f6c85990b752bcab04dd7548ee07ec4461d5e566472ad88848fba910bafd25fd13e007166b0597f179c20010e2d057d68f1096ddbc09ba0f05744d318e2482df42ee7a12ac6ceb2bb67a9d2bccefe67755197e2688bde851108d3780096199f84e908464688b9b1858e0434a4057ab747522655556906f566787e53d46978eaa36643776f0e14e6a02257f580792000005c490a1837f11f3280c37e4a10637a1853829724618408bb0f49cd0041016cca6649820b7eacf5234080b898ff90d20013530cf0ca6be4009c081e58199d92bab37861a15f55d36)) <<< 16000) + 0xddb478a0a24a4c8f0611850441e4305e7a12201bdce4a0f7f060c07bc313ab8182800011eba191aa0c013adce4948040004b699ad88e95b9602400c41000004a86450aebca6aa3b90a2a77d92794b38070c31fa2c984698704077267cf2b5b142091ad9995a2d0e0843db5e0e91c410637305dc32e744800c349e680e4614010b153595ff7cc2c4801882001b0040004d24300261321308e0984c04c2fc0612e03b1c0b43c8eace6871e8b578bbe4d050183bb6edbb53707180d6b86acc4c8c140af8966a53c05140dfc08c5ca80b0c996757b3b2509005db06f1629200012f6c45f656be6cf2400c010102022d59851d1c16384d418de8fee1c7e49dade4425a40a11d3b42a9360c08c4bf2ca5d481408532fbf708a82c0309edffad5443801353f3d3b5640019a1219e317eef3c9002f03c00012110be05d8e3cfebe880e3c38fda2b2375064238c1bdfae340a5448a767deb3f8e408081353bf01c3b0586d6fa3d7b35b8480cd5064a3f48028066cfe63f4f18000d74dd0e50caf944c9003004405e80f082ff78fa0fa8208bbd0b051dcd2460b5232507b81c60eff155e3fc3041120ed0efc82c33cfb3d7283830115ed26ba080201a0c4c09dfff041463b53865f9b224801601a3080cdb44362c60f4a62782c32e4e363d28385403eaf3011b0558fe3400c75f09c9800800200002524000da08002f210950981502c2f0078402cee1fea3e410d6701086e516301df4193b546082bc7ef149d10234071ba00402881fc7adeca008253369dbb2605821dd5e45b2e820869844335254448015014308c5db39a16338a016b8b075e53784380c1d5c9390007402000018a6c704fe038bce0e3afa7201dfa0a141f956d64d65862ef3566c261c358f6731ea0061c0f620d1f40a0436d0268a1258003ee66df360c011d3bf7432482400a40901760300021a21740bc203802cd48ee410a7943b8a0a2c60955cd35dd182029c5f0cfa88104c76e2a7c02880d14c59980104c373835f70160821f7c19094104abf3f48ec5b120052040c22027655e96324424d463400b724f503801fb639aa4001f008000066909401e921c0166a47724953ca1dc50518384aae69aee8d141a6b9f140248a22f63fed80145bcf650395f1a10298173b4a0c0416a45cc7f608223511adc3ad8900290206931b369668c1d21ab7a99000e949f558c007c0200001446470000003bc40349110929883404927cec7204e44e1c063172213a1838484733db52145b3b85ebfbce4820ab86b7d6a850413b8f8bee882083682fe74a3aa2400ac0a1a4c61d94d63074784012040039eafc963001f00800005110002d62000b64400233880a0482e414001c984238340032ee40083d485c028009d2c80300d90b72d85b16c07ca616a330b401d08bf6d2a1a976957525cf1d8819e28ab223058c3575344749008ce6ee68f9661673544df28b3f120746378c8b5f0421e44c26b09d0e02e7a9e243d8e39ea9e21c7aadc8278714376974580f9b27c40411356c7296e6e973a34c78fb2940db7aa09780aabcd1612a727a20d00a44cf67ed97f3f347cc0616b4bb88b668d1efd57b7e7372556976f703d8a96e77640416f9ff2cdb3db3d2d64ef3195c208da363a8c48f57bc16aea7bab39f39aa6d7fe2bc9940c64c238c88649018cb1de0c211697a22029c070187a729444f362e09626932fb81a7844df2bf8530cef99888383c1079422c9555055902345cc247ae10d2013e90f7c4100d91769e5df6e565396845a3f94889c76d20a6d4aef6bc0e03b7c568b713d67d441a0654bff920d22806918614b40e0001d3351b9de49f72c526024c7ed418561c7b669990b9ced225d6f810372c513f2d2281c473b008a0248444236f2323c10208a0451081269bf7660cc3fd89704f0e9b4c677520887be1da87a1a63c81811e22ad860d5dd4db83ffd17741e2f5b010fbc1c4a1fccb462ca8276340fcb2c281ea44607688bd25f5bd468311fc4d9d0e0eb9224fcf0ca9f424b0831d7756448c3f2d5ae1e19a34ca006010e26202a130c1e00448c385a6738a145573a189e0f84c6a424230c1f0080000541816874b23244326188509060d00202cc0400010e42841411a0a00023321403b09f1181c02e460f2cd173f10300dbcfec50618c0a336f1850a1d52937f514523051457a0a19167f7af588080000097e0105d135301750411ce9125ceca400940512307b62e7f5081804e2230d030c5fd2846362850ea949bfa8a29162c4667850c8b3fbd7ac404000004bf0082e89a980ba8208e74892e7652004a0280001dd21640b06c01c0b0c067a37f038e24fa10505c6141ab637aef0c2115f60faa40c3a65c67748a2841656ddaf5040806d84cc540e0b9fb7b97bd04132249f320fb24009c07102800000556e0d281d33e07048b18253903a90cf1435c4707d84f106609d54170d10100a524f0870da86481805c30f715e389538000c3c487ffca8a400a00800003f842c4172396947e607168e383fa286bf1c163011bc792b518c28d4148992b918185601d443518e1aa79ef2879e88090205622cac820c849ca36e5f16008376d47fe464f4801601802c00712c1e7945ffb61041e04b29d506307016410d57d838c1cbb2c5b38cd1016c79a94349021e343ca4b5b1421090abb2bc810554bc94667403003f06a214efd269002b02c52df6604ad7d14b09234c4d5d29aa2e70109a5bfc024f0394fa861196f193603523040459060e88c70a408208580281800010068000ce10003d12000c48400297484c86c238261441309809857)) <<< 16000) + 0x80c25c07e607dbcaf6def3c612548daff5c68a2a53aab3378517566250ec1f1621529d74274c3c2039a5827374482a0168a2bffcd00707f9b098480026cb4bbdfce79f4821581620683a898d52288e24453c88ea19670c141b1f0286e186afc007a2e6b182885644fbf7a8507af6bb1731d0083447f56ab4b64c0036e982f0e120009fdf24f2dcafad2005a068e185cb97c3cc16ba62cec100c1e601b58a08a2898b2820478c7b1c4105ff909f40300593b5f0a700200080000aa900039e3e6081a9218ee659217522d81120a2e48ad3318b8588969a7b2bb0122455b38e5b8078431dfde57a01a08969a72c42068053d823fcc18004891ccbef28ff92085405081a0c5ecdd528712217ecb29c030d08f55fc1d060a2efff61e808060fab28ade67040bbffc254028387a8c8d50008321bd4059448001a94d8224b5120050040c28238373f07120e1ef09c3055a2ed6b4201862d72a30e082925c77e2831fb90c7a0c007d9612fce004201000015c20006e6400167cc8e230f21810108e3f4700c1bbd8b02224286514b08682371c2ef50a860f80200003f4d9006bfe409b260e0812581fc838faff9a3a66838a2212d6d5903883aec1c21fe288a52e1a321068619530f423c5862c9a792d0e4000b9bfec2ed6920050040a21160806c98392612eec2c3a984a26210550c28371104278ff0b9c0819d3d0d040292b47153800f8040000538c8e6ea39dc16309b833d2688a05306e941442d299c082e18de1532820f00400003d48568281b01400093c4254460540bb2003a36532d428827f13570aac71ed6de3f4d3e1c524006a4d38c712d130ac58f314468d77834ca0d0845e4fdf7dc2020c84c827c88e00139977e3d1901200540588961929b51660e4ffc521838760beb0387840872d0de7020685f52808037fa9fc13001000400004a8c0a0af989f324727beaac52c619acc1e63c257d51236182a198241e38126caa51b66042000800009610ae0585682c2b007e6071c63cdc517095729e66040000010e0820f5db82d9e0865c518c8d005583527a200b78d6503000845378fbb80421004493e3c274fa4248013881aac12384d8726eb091894c129ec038c8fdfd8c7018678c979bec98191fbfbfcb030d04e28d61a8001843d84ecdc801280a38910c31e71261012e3af641070bfed97c6800376a3470800f27120a4a004201000010220005f4688130f7bfe307036fe6951c7802c98862c001d8402c1400c715425494208002000020242ac27e8aa9839878f64bb000000000d98bcec410c20806491879828a782680200000970801006f1627cb7969c7944f96ecf78515f4fdf3ea078e16f1ea01a50e403ce7fb0788a87845ec270248504a43a6825f4bbd8e0082e50fdbd9549002401479422e41042a0615ac07dc88604a8d1181059b26baa6180203f40ad5002000400007e1d2d4be107956c16583061c56dd63ca52f83e720e0514d1c649c0d5071fa3c67bc0e79e080b7acffde82812fd7a8a45883834253a72e469400227088d17c5e3c80158183ca118d69f428185dbb9b7d10c0cf7c6da1059bd885960c00fcb524a4a0042010000102200066e40018f4d10bcbc03e30710f74e98416acaff7ce05631f91428065b890442a183a0080000f3200111040039cc80a068004df885504823424004a98400d170801f4510a92985408e052038bccd5a866d5768a12d7dbbc0154c524810b0499dafd00544042b0058060607b29638128cc924074557d3c0f1ad31d50a015c71e4fc4c63759fc201100bcd1f99850ea9ea0a04325dd44bc6d4211f20b7c2d58579cc11426014e038058c394403a77c9825d5656ed8d320ab2105896e4092c0000000000000000f52bb888f46c2f8c8944d97433625c24c42c6892ea6fec7200000000000000003edcd9bc61c7e5092f5326ac5547ef68c4810dfe3b4b1c0000000000000000ef47b764883b40b424518208230018079ecf05a4b00a8198c30ae3cba06d9f427a7c358998fbefc45eab1d5e253163015ee4b172515bba731b6c6ffb367107703836a99ac5b28fe5af6c86952e7d6f722109952bc0a5deee116260e41b1a12e63c349173e00713dee8444a1b6a619a88c32d77051449ac48414af8b3e091040f00402981413a020000a221382391869ba75aa105368518423412bc80a9e94081cf7d53c904b2e40f10600636be354098208402123079ae31c4608765a6cca10521d1641e2c10c68f8c3920968e8cd3025082100800008310160d00a84826c14000526429457230f635b4c60224a84289e031c1db0e60142eea2712020f0042008020080000223230f871eab8415d5d61a51a09f81e066920911b327a1801b7a8c7895042000448c1acb8dd67862f63d8324832057d4604608400100000a720003804290341461b0a2090508482342400069842808613e2b09e05fe9d23452004431310000000000b9f483c0884e10e0c608208e04b006024480b88050036050000010e070c9155f172785560d45b04003a3f57f89a0051a4769c000006411284108042259014e06e102317982b48c09014de522004a896cec1c0000004b0128210004202815c60dfc8887e94fa3b10201abf1662209d794a517221915fd83288060aeff79193021100400004e0800129909d010001d5909c11f10176835e05900fac3eda484150b5878702a5229c0a282025983ae082a1cf77504012f5ab63084e18400100150504d8082680400033442646611c2b0981184b80e98db7aad939274d9e9ee42edf2d71d53f17bdce4613582d15d00000000)) <<< 16000) + 0x00000000000000000000000000000000000000000000cc2788688206304782182700680860300401b52bb0ec44039fcfcbf05faa4dd3ece72cce3170732cec54411a00000000000000000000000000000000000000000000000000006797a11ae1aa88747260ea9bcfb059897592439c162ee62975800000000000000000000000000000000000000000000000018619cdd4a333367b1c62527fcc81c20625b8cf5c0c0f7e4d0000000000000000000000005bb90d3efd685fbc959723c5d344b1842031c34003800b0400803602b88efa4458643da608a2142f2563c28001df42994041e00404982800038080030f10920df92139e25a0612151a37ea50610ee1a3428225b5dcca4812782b71284a18400100900104b0080004b484a8ac0a82712c30af4e886061857a30c20114b789c5a0049577fe60e00000012c04a08420108073e891d60c1ee185ae4884d1eb041960e7d92e6b2000f004024c040001be425017a205acf15fc208da08b04088337c8412c3c1000004b018001e450cf4900373ec4ba4c0842010fd3a468a400886262000000000173e9078112a3a57fa26b5de5807cdcd48aee5f8d7708d43d9d7f2ef0fda78c00000000000000000000000000000000000000000000000000000d2499a30c70a18690080030170001006ccd33d334e74857b4123f6385001d5b444829207562a1825cc35e230800000db6f9800800200002544000ff8c4b8bf63e7a209d273885860c2d4c2dca21085420063814f44b46c0824dc5f88050007806b493820f804024c140002cc4001b2c84904fc908026a49923037ff0f98f141a1158dc703efea2776240438b8a8921286108040244341200a00013220281a08f05000543108e0d0468680052e0800dea10029b0206a62002cce21181a08b09003908108a41006b35100dc302112730882580180a06631397837dc604a10e210d700a08ff1e6f6f50101050be59f352301134aa04330050013ee7b82840800b379f41e2c500002153a2c92000a02cda11191c2901d10ac0a1642257849988182a0e2836288b06659782034a6a9242140c6161030470043a8347000130c1080420651ef829e2051ae8b20a1449bfbeb892036440337a0009060800200001ba421c3610c1ba1c40e9a1989104d73b520711b7d78f0850c065e470c40e35043c1470a3fad17500026182000803e088214040f40200017421084b083258410ec204361000be20d83917802060e0c02298e1043b288c23022ca281130a08c4dd89dc4811885d8930e000ffa26a400004e484401007f0983f04e85f5ce87d92056cd834a81441250b0dc2039bfbeb8900090608002142ff5a9d3810280c4eb6e0c211cfcd110a229ef8cfb101e705e0ba0c1121fec548e021807fd28004e304001000016120fa3a07c1503d8881e81400055a41e4940f0220770d0002529a207c9c90e0d0e149ec9a60bf0c11164ed78d80409eeda2a44d1202ddf9bfd62900010fc367a08601bbc32abbf8401d7f3093f4202000286442014010000079880058b10764183aa081d0c60e6620720983880e86b102b6804a04e1df5d382016d8dd57b07049508f5801410411a02a501400465382200850d3f500abf1409a7abcf6e4029c29a35c8e09ccf5aab61821f6cfd981400914bc50028004772580a028008ce704401000017f20e07306f2d83714c1b4560d82306b0d83504e880a4a35a3a1d1a6217eb41834787d51892305f9e9b28c1dc172b5819d12fb9e05788c01c0780781d77de0c40b549011c8697719dcf004ee2c4ffa5da6de152bbc84aa147a41f78007a2dee62cb6b30871fc84bfe64760c86ad00e5de4cd1acc6b96892afe9194420ca01a437a48ad192d0242458b945e681d43313806001ff93748200e249c9b000094807c0210329599d2f12287b1ffe3040719dafc40002e185c5824081f00844d0f4b907650c753f68b0a0f5fda2d3980106a80c324041f00844d06bc59ce68c63025330a180d63c38141e077771324041f00800006810001bb36246d8b8fc582265701790087efb1ec4001ec188f860005b7bf04a083c0100560103400800047c82f08c19c17630155735c48b3e562c08c1090a579c580839eacdc8003c0109164df1d81182c5e87550b0442995ad8c007802000013e4198160ca03b1235009ac580357861709040e8020158140001164050340c81200027d209a220006b920aa4a0270100040310632d83110c18417c16437e14e4f7d7e8c36385d6081a37dda905b26a8f313b90c3b3ad4f6661ebcd9a59b656d4280f3ba8b9bc6d951b46591a55c702f4680182573b90606832ceed091b2a4cf173d9d2055951abdef99267af4671bd3a359f1e66f4819be64796642b475bf79fa100020c1216ff525ec01e67ccb5835b87dfea0714298a1fb40a6bf1fb47ae6c9bf8bdce2bb9905197760e7b7ee9c7666dea32574a6d416d257180014aa5f17de13450d8f0792a644dc8e9d5a64cf95844212f83e76bb389a23aedd3aba4003162146c8a6397000c01ba02b78187620038008f070ca7320c4007c010000096417c160bc0b05d0182e00c16c0705761dcb01a03640a8871000f00420000200800002230603a75e3c60021757ae522042100800003d1b18048e47f068005673b031c0142867080005b83c6af09010840200b40a0000ec20b21b0580dd141e6245b1a0d9404d69488207c0200ae03b1812ee2a6c7006a9924d050185714a4c0027beb291009030800200001ae41582400032c400109cd2df6604323351ac5afcd7337fd094a0f5d048a5bed)) <<< 16000) + 0x478aff38689938854ba538854ba810b27b3b02a82d87681808602ad9f1f0b465205e237de7b7be542b11bef3dbdf2a139a5b7eaa69202acd2dbf55349014872a4066805004009db4c609924dc9cee0c6a47859700937b6a761ab5ba3e69d522a1dfe4195283858edf828a4b5ab79e7d0052e60d6649c671d28494df01e1a4c8a897823c8235411e7c7ac72fc95ccc78279f3ae3e99c8d075212da000afc4154840a822027050005989053250290e8144340024084140e609e530201582700f34b6fd54d240539a5b7eaa69202ac46fbcf6f7ca84e237de7b7be542839fe99d28a8bb776799d4f1c5f8b31b5700812bb888f46c2f8c8944d97433625c24c42c6892ea6fec7200000000000000003e690090d0c604304d00600042d45975ca0a1892763bdc7b539873582fab2fa4fce3eac1f0b75707bf21f98bb1e9b901c3f42f08fdc816385529622f3803a60b269d956fac9a3181c1666fe8259fea52227a5e13be617bef185d4cb0de90eee19194c8f82ff5e667aa943ca7484614f55c5272740de384eb1376354c6954d495ba1264a14929594eb80806a61fa464b4badb393dcf493a0521028261e96f114e5fc2ebff8b6009f202c8ea0107b7544ec41769284cfb0c0ce3c107680159e985d66957251721ab823a6b964062e0b211c4d4546efdf9b56d2815f7bf28c08234aad786c51020895d07e15273e68eb12262c6ef234b2a4728e64b431d68c6434f000761be1da165e849a3b4da502c99136b48e6c259809a24f52c6dc81c24029ae645bde0cc6f94b2f3c2bbed953ca97d91d32c61581c24d2175368b2f8f590f8d565dbc270a2ba628c704903d304205d4268cd767cbb4bcd014ffc890af2e7b10bb504a374beccb0372717f24edce08aeddd68ebd739c1fcf71e48cacf488d7a00abac4e077404f75e6d83a4178aa04b241e860bb6794b8a82b6e6dfa93c12dc8487ac35b73797376979556e251cbb2780002b4904d11026088002cd882596c1288608003c1c067d9488e31851e42a442761217c638095cb5328202e70e4c104a103e010b1db417661102ba6dbc50c049430dcb08c2078020000146407c2711c52b303a4c14092ba24d1080cc7d6dcb047554ed2c700e4d3225c203e11835ec09830800216386db08283460c3bcb9620564533bb8b007b001c7812060f804000034c80010f10491582404ec73d2c4828710f73e8271c0b09711808c1078021a6003e333b4f040431d136602051aed11080c9acc5ed920210804000035c82384c07c1608c0bc1c36832b58e30019c9bb1421786e5e47022f97790cb047bbc3ee0e04cd8d4614260c1f00802280ec116e8c2e08406db1e7e75022102100800004190001dc20881a0003de20781bcd2dbf55349014e696dfaa9a480ab11bef3dbdf2a1388df79edef950a0e61b53f17aec7397aae1e7015bdacc1a623502e79551ed5d150539aa35651a9a74f20c42042c31032420c22c0000a15593c95413d1303b99b9ebee7f15c7c8708734541ef569ae1ac1a6ec82001615cea2a86b855b74fd6154efc4b79977d5215803b92e83d493a0cca000866704bfa1a468612ae6956e482e3f0c0a860f8bbde260048283c01003b05e696dfaa9a480a734b6fd54d2405588df79edef9509c46fbcf6f7ca85073e8aa9839878f64bb000000000d98bcec410c36a7e2f5d8e72f55c3ce02afa75407621e05d6d72bc2bd54c5df59b1c062f70aa3756d72bc2bd54c5e15806d1baf8c22f587ca1844824025800122fcc4f43c4584ef231f696dbf2171b7299349869911f166b6a492853489f8d1d6d16228724b7b1fb54d3cca96bbc5e8ef9bbdfc17c4947cddf3f2c34ab79453d8f1737d332f3f24129e9d10fad0c288a7aec9456389416287df78a594197d59280032a10431101c84810814000f2a40dc540822a03605000a3e9cd2dbf55349014e696dfaa9a480ab11bef3dbdf2a1388df79edef950a0e7d15530730f1ec976000000001b3179d882186d4fc5ebb1ce5eab879c05711973bb0a4dd9b03000000001c7dc05a42141021c1101140080430bdab94292dceb707c66e92d2d31faab85b401fff07c149bce8aec6c91f8394035f74f8c9d9c0da596ac655aff1074abc05f06705b13cdea34bcec4528f636a82000e06386905509629252fc708b1014da0640480291476da18015081ba482041e3cfd9c26082100840c1c8005e658a121a92ea40b4f3953f01833ce817224011e9fa5541284100040000404f14f2a070e0a1045c96f8071293ee1a8c40866cb21cc3019102f59425082000801f80800045481f08c0f42607813dcd9bc61c7e5092f5326ac5547ef68c4810dfe3b4b1c0000000000000000ec461090c60c908304e00b0080000aae520795cc65c661c90bc8999215addbebb4cc6b2be9cc0b7a8b62a89a40223738211039323d500029c3844a0c45f13830c900061183b8fd8bfc24121f5fcb118171410b164250c2000801d80f0949c462ec70601547f42482625c82383030883dd7a5806e113cec4009b90e2f6013081000400004c081d0680e4140700a0002a1206e22036050004ad90352d01a0c80cc54001cee40c904062620300d01784800d050812a480149f0c8a2208e246ba054f48f937b142c0408d6ac0be20f56e73b7329956d0381a8cbab47d58d826ccc419d4440c01b7abcbbf401464c83663b30502805b88ad4ab884a58566a029bbc2822be571f72326f5708f10f1749c402141599e4ef9fcf269ed42383bd4b3e44e38fc29b2b414d19847152bb0ec44039fcfcbf05faa4dd3ece72cce317073)) <<< 16000) + 0x2cec54411a0000000000000000000000000000000000000000000000000000672fdc456510502c000000000000000001050ce854a797e750234b08246b12ae5e86cf0fc2fed9260a86a76444931442021422001c00c041003c715328b4fbded74fc43f13a5aaac3dc9d565ea2873f0cca5a7e78f1a1f807323ac03c71bd2ff6ac96b57c94a0558cdf2e9fe77a2d16d1e177fa0b35ec33ed0092e97bbc10dae0595b4996b352f5a9aba0e655ac474b4dc7cdf242c3e0b14c22cb748a59ffb849c11c3b7c8647081f7e65c6104000a26661010e82c45c1601b36a18cc2608210086903a26add63844f69668410578aca4d811841000400002a4e0612782a53401bc8ee88a012c874ed066183c0080000a3205c1bd2279bf7b0a38c0f969ea11810462dac5880843216394b00ea59798a128410804201002008000022307e89f552340ee606328a02df630d50630c1e00800005110270900010a902d1981608c0ac27630850ddc2c7043d68e7c628035a0f212000e401dbe1000120e1080430428961798c004ba4c4a0c0bda3cce4846183e01002a01d011153df42029d362ca4003800880000802000008881482ec2b3e8525160ea2a8edcd016798e0c30029a2cb224041d008401a55f7d820000f606448810740200000ec400056080f828000924e9408df864dc69297646569abb9769a56000ac6e31d552fdead934829ca00013531d238e861a02288aaa9e12eec819ce081ef00fd38b2c3770080011980b98ff315dc738cd79559e4bf0ef0af5fc244cef9626577827b0130af9f9a574c2c499e467701ea82021bffcc9dd22c9bca363bda75556c2678737014fdb25e0d739704af6beab1a7014a54e1a05cd89ffad6a866648c9031ed4b9f387add4dd6d004047b255233449886d97600a034000ac4409c240011624098340013884003c6081294809064002ba0408ce40446a0212901012c07c6403c1a01d0900e02806c1400345c401c0c0803f0d9a95d8762201cfe7e5f82fd526e9f673966718b83996762a208d00000000000000000000000000000000000000000000000000003388c10c08a08808600402891ac4b476c261315ef8e0ac5259fed7ec51276c2cfa3cc197a4d4dfb00585c2091446f3e58d64c72d9a4b2b11591b340139fa53d0a71abf4579bbd58f13d2d4177b1adc8fa7716b6e3003501d1f28564aa42bd5c0198c7abe1e58c3d0d5b849d3e4fb2dcc60ad1dcfc3dbd142184773cd8c0105981133fa0e14014574c64390400205f43d9900c011c4bc4936944104c872c2a02060409e90ebc9d2172a93d571651fbbcd120d5be6ceabedb00000000000000000fc9289229db6898de18457b4e7a159681f2a8e8627ddf38800000000000000000000000000000000000000000000005c21c51c30820c11801405411998a5ab2cd5b1298605f8db5d8df916a2fcd1722ca6da7443631b9f4c12792dda0c06b688a4a55ffbefa1f05ac63d3923bff9e6933f179155f735427f2c69ec1bab92f7ebc71c2264b068db8a7aa0c2c4a9896df51f06053cd25644aa4f55c5947eef310008c48f5562e3400000000000000003f78f20caf70a86e0d1c258af0000000007d290ab16a68ef7675504a63cfeb4d45d66f22731f52565c14e00000000000000000000000000000000000000000000000000634b5cd3ab14b645865a5e6553f6e4567bd102705795603c4f600000000000000000000000000000000000000000000000001890818810408700601100a8e008036c9012664d5f3071f13d941c2c793510adb51c000000c15a040024c7fbe69400900218483e6177511649920c7f8a9838147df1d3183028fb617684120c18b91c16052f05b78b8a00000001904e00480100001713838f8a21c3d963cb61826eb841027f6be461208000105ac0e000000680a040000027b7d4c0048010c242085cb268b2738b24bfb639a8f93f64c1c14fb43ea49514c209355fdca60d2b28b024ecfb9a621bb10a000000023c3460001000dfcc4bdc03087d0900e00700a800021020006d8406826032130180980b80f071f13d63232c796c3f58eb3020b6199ad82420000179f50c1000049ed81c000000c15a6604240086120d52b46d8b24d2e25d1218381d94944e0822e40799ec3020eca2bf34b028da6be791400000004b02e084600800016b202c1301505e1200001408d9b092480dc9690e51ff2ba079a313d49f3e35de6bda48f6c023a42c0f757cb2400006ad9bfdb0ff1fa6627135e28a475c33b99c357a42c65faf1563c34fdf7caee4cb9839635331bac81606e94957050cbad853da4f40ebb0d6f0369b05867c38e90185305aacc2c7d7793278def5128e18854ca58a50c3845ff34fb017a0da11350ef911a472137132c67e3800000252c4e14ff1df1268ee749db8f328270584389adea44b94fff7c05a2a3cfe22ff0025a1658284a3dbfb579c1401ce31fc2c018fc92ea994d18fd8a5028b3d5bd43f44a135b77f4aaed641bab0578cca6507e6fffecf6d8b4ccd08cb763405b602c71994245cf512bb888f46c2f8c8944d97433625c24c42c6892ea6fec7200000000000000003ec1115443e5e5e6b238591b9d91d69452f6c0bbebee37cea000000000000000000000000000000000000000000000001788c24b24c1c208b00a002002e100200d000301202812000b0f20260a000e32200298a40483400342e404494003f7c400863c8081a803cc401c5a00d290060e802c640142a0091100406801c2400c1200501002008009e888018c800844002020000100ce261)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 33 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase0" = "QuadFullTwelveCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 33 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase0 private def zz2305:"s0901"="s0901":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l5 l51 l54 l55 l58 l6 l60 l62 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x237543275, -0x2aeb56de0, -0x406102776,0x4397dc0c], ![-0x2aeb56de0, -0x8ff9ef492,0x878b8666,0x2c9c6031c], ![-0x406102776,0x878b8666, -0x116f9b68ed,0x2aeb57740], ![0x4397dc0c,0x2c9c6031c,0x2aeb57740, -0x1575ab948]] noncomputable def hinges:Hinges:=[(-0x10fa62e,l6),(-0x22d212bf,l5),(0x127276ec6,l4),(-0xa5868d88,l8),(-0x884b066,l11),(0x3546f792,l10),(0x2a8ab1aaa,l14),(0x1f4a1bfc,l13),(-0x4b9cffbe,l17),(0x4002f231c,l15),(0x2bf8ffba,l21),(-0x1f4a1bfc,l20),(-0x22c38877,l23),(0x151d2fd10,l22),(-0x1575ab948,l27),(-0x2bf8ffba,l28),(0x1575ab948,l29),(-0x2a8ab1aaa,l25),(0x9fcf151e,l30),(0x1575ab948,l33),(-0x3546f792,l38),(-0x1575ab948,l35),(0xa5868d88,l36),(0x1575ab948,l37),(-0x127276ec6,l34),(-0x9fcf151e,l43),(-0x151d2fd10,l42),(-0x4002f231c,l41),(-0x2ecf17b4,l46),(0xfc3e6dc6,l45),(0x1575ab948,l51),(0x884b066,l55),(0x22d212bf,l54),(-0xfc3e6dc6,l58),(0x10fa62e,l60),(0x22c38877,l63),(0x4b9cffbe,l62),(0x2ecf17b4,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1575ab948,l27),(0x1575ab948,l29),(0x1575ab948,l33),(-0x1575ab948,l35),(0x1575ab948,l37),(0x1575ab948,l51),(0x2a8ab1aaa,l14),(-0x2a8ab1aaa,l25),(0x4002f231c,l15),(-0x4002f231c,l41),(0x151d2fd10,l22),(-0x151d2fd10,l42),(0x9fcf151e,l30),(-0x9fcf151e,l43),(0xfc3e6dc6,l45),(-0xfc3e6dc6,l58),(-0xa5868d88,l8),(0xa5868d88,l36),(-0x4b9cffbe,l17),(0x4b9cffbe,l62),(0x127276ec6,l4),(-0x127276ec6,l34),(0x2bf8ffba,l21),(-0x2bf8ffba,l28),(-0x22c38877,l23),(0x22c38877,l63),(0x3546f792,l10),(-0x3546f792,l38),(-0x2ecf17b4,l46),(0x2ecf17b4,l64),(-0x22d212bf,l5),(0x22d212bf,l54),(0x1f4a1bfc,l13),(-0x1f4a1bfc,l20),(-0x884b066,l11),(0x884b066,l55),(-0x10fa62e,l6),(0x10fa62e,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0xe81900200000a0921024c3014000000000f16066008000000188a40d0c0300000000240e02980400000006229036300c0000000000701a4010000000f09060290020000056210c80f200600000000281405300800000062088118602000000000b05028c0200008614022029a008000000000007032004000000560b810c60200000000c824090c030000000150600998060000000000240920080000004a08810c602000000000a0502cc020000003c02200998080000000007830330040000000f412016601800000000000c0c80100000000003a0490040000000078140730080000000000f00a401000000001d0602cc020000004632220520040000008614c07830100000000008a0144018000000000210388020000000000460310040000000000840620080000000001500a40100000000000540c80100000000000281900200014436070097401000000000001e0640080000000000a0348020000000036120498040000000068340630080000000c42204e60180000001984c0bcc030000000230a80518060000004908403230100000000098580c60100004d08c1200c9004028814208800c6a00c000000004c240630080a10520210019a80300000000001301480200009a1082401920080001582405809d40100002a04e0a00da8020000520a81200f50040000b81403802ea00800000000026009200c0000000088480c60100000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x2884403c180800000000009407200800c316410607e68028000031148500d100300000000440c03980400000000841c073008000000000d0e0660080000030c2d00b0c04000000002e1a05180400000000002807200800000000b898146010289246086019810060000072220701fa006000000000014062008000390880a80fc8020000000002e3c0cc010000000310d01b980600000008223023300c0000000148701c6010000000000290388020001384182a0372008000000000024062008000000e868481c80100000000000340c8010000000610581318060000000000440d2008000508c613009280200000000022240cc010000000511981198060000000000380720080000000000580a401000000001105028c02000000003a3205980400000000000b0320040000001245604660182c92860860198100600000000003a03900400000009239024300c000408e20b00d8802000004b2109409900300000000240a0298040000000a20a01e300c00000148e8281c801000000003b1a038c020001862102406e20080000000044140b30080000000108580e601000000002911028c02061258c18c0330200c0000000000840720080000001448204860180000000001901880200000000241a0718040000000000440e200800001888812044801800000010864088c030000000002438198020000000044180e3008000012864280688018000000000060148020000c42882404ca0080001845204406940100000000000a80e40100000000003a014802,0x488460341808005a431842030a40140000000000220640080000000001d0388020000a219848026200800000000007c0620080000000128a81260100009615841026900400000000054181980206c050437c061c40180000108641c06880180000361486c07d00300000000341a07180400000a43409022400c0000000000c81240100000000000903880200000000120c0318040000000000680520080000000068301c601000000008824088c030000621202606620080000002105003c30100003e0781080f080200003c0841a02710040000e81a04203c20080000f02105003c40100000000441401860180000001c8c40d8c03000000005a140718040000000000b40e2008000388660c008a802000005a1084808d00300000a8190500d20060000000064140a30080000015068301c801000000001a11018c020000000492081b1806000000c4843c05400800000000192206600800000000221c0cc0100000000421e02980400000007222037300c000440da2881508020000000260a4068c03000000004c2a0718040000000000940920080000000000a81c40100000000002601480200000000260e03180400000000001c0520080000208842402a80180000000001701880200014631884014a008000000a12440c63010000488c41100f0802000000001915028c0200000000000b81900200000000a4640930080000000000880c4010000a81a05301e900400000000001a0710040002986614409a40100000000088300c601000000014848070c03,0x24640c1f00ab200a0002c8a32480bc40100004b1082880f2802000000000b0501cc0200246408528089200a000000260500193010000230460c80888020000a124436012100400012a4684c06620080000000000780d200800000019022014601800000003209018c0200000000524a0518040000000006d00a200c0000000001a81c40100000000003701880200000000006a03100400000000bc2c0a300800a31010c20524802800000002207014c02000000005a160518040050c8106201b240140000001043202c60180000000003e01480200000000000f819003c18d0a083027b3401c00000000004606400848338334202561006000000005a520518040000000000d80520080000000000360640080000000000640c801002443a8150116a00a0000000004d00a200c0000000001380c40100005210c3201e90040000000390c8139806003182302b00f240140000000128301c60101641010b701c8100600000000004a07100400000094541c0e40080002a082138090802000000022084068c0300000042260c04a0040000000088440e300800002208c1405480180000000002102480200000000260c0718040000000000880520080000011098300c8010000042118280a90030000000002418198020000009120c0683010000000e870281480100000000290b01cc02000000051098131806003a421023030a40140000000148b80e6010000002c4a301a0c040000000631280b18060000000c621026300c000000124260286018000002d160d029002,0x261a0518040000000421c01b300c0000000001881c4010000000000160348020000000250a005180600000000004c0620080000000088500c60100000003889808cc030000000260500e980600000004609025300c0000000cc3203860180000000003502480200000000521402980400000004416019300c0000000000500a401000000009838030c030000000000160310040000000098140530080000000007a014401800000026824028c0300008215026023200800000000941406300800001084416046801800000002705018c020000000000120690040000000481d01e300c0000000843403c6018000000000170148020020638c1f00ab200a000288932080bc401000000072088086602000000001307014c020001042603201ba0080a2491820c07e340180000000070280c60100000000001a0348020000000042140718040000000064180d3008000000150120146018000520e013015900400000000240e07180400000000a814063008000000ae2580d86020000001444501b0c040000000000098190020000003905402630100000007208808c602000000000f0501cc02000000002e0e0298040000000340901c300c0000000128701c601000000002907028c020000048c6200d9180a0000000074240a30080000000000c80e40100000000000d03480200000000622a0518040000000c22b026300c000001a228812c602000000002506018c020000072330501a20060000000920c01e300c00000000c8b00c601000000000015018802,0x643a0718040000000000c40920080000000001900a4010000077290ac07500300000e4521580ea00600000682c0901c400c0000389585804a8018000049150540510030001d0518a4012a00800000000bc6809300800002610c3403480180000020c2202d0c0400000000003a0310040000000821200c300c0000013118701c801000004c218680a90030000004a441c04a0040000000861201c300c0000000118701c60100000026210d0150020000000410901618060000128861a02a400c0000000c4140386018000001841201e0c0400000001b058121806000110350740c840100000000048281e6010000430881201a500400008c1082201ca0080000000028180f300800000000783814601000000000d06018c02000008e2908809a0060000000054240930080000220a42202680180000021150902d0020000002084403c1808000000000b850330040000208c42205e8018000000001a2c0cc010000000510d813180600000000544805300800000005890e0680080000015130d01d0020000000001c181980200000001c2830340040000000000680c401000000000905034c0200000000120e05180400000000001409200800000110088026602000000000220c0cc0100000004504805980600001083211022400c0000000110280e60100000000210602cc0200000001908811180600000003611014300c0000000000f80a4010000000001940288030000000000660310040000000000c40620080000000ec1205a60180000010c2602acc04,0x50c288049180a00000000d41c073008000000007848146010000041110380fd0030001042202a03f20080b1090c80c0a16401800000000170e0660080000000160601cc02000000423c0e05200400000000741c0a30080000000a43202860180008c1844703210040000052210700920060000000054440a30080000000088380a60100000001c8680dcc03000000005c320718040000000000640e20080000000001681240100000000002e014802000206610c6036a0080000000e621026300c00001411c604d4602800000001707018c0200000d2190500aa006000310810900be401000000000e82814601000000002906038c020018218c280084a00a0000148920a023400c000000e2218112602000000002611038c020000c22202a073200800014c3409007a401000028866118134802000000014828070c030000000032140318040000005104807830100000000190f8126010000b61dc6b01a900400000b6391980ea0060000000074640a3008000000e858280c8010000b81c46d022900400000b4390a80a200600001687837015400c00000086110168602000000010848030c030001083083c02b20080000000461201c300c00000008424058601800000002107028c020000000310d00e1806000000610c807830100000001c4d206c601800000029904074c030000000592881b18060000000e64101d300c0000000129081460100000000312d028c020000000411501b98060000000821a037300c0000000150a81c601000000000029024802,0xd000990080000000662500a300c000000d2208064602000000001b13018c0200000002c138099806000000006c44063008000000a424002660200000000001b01480200000002c108099806000000005848073008000000000580124018000000000d80248030000003502200a18080000000640b01c300c0000000d81201860180000001b84402cc0300000003204806180600000680410026301400000000c8480e60100000001a044038c0300000000002c02900400000009241034300c00001812c204986028000000002a2c0cc01000000398a405e18080000007114805830100000000000901a40100000411e8500d10030000003a360c05200400000004211014300c00000000c8b00a601000000084110238c0400000000322e0518040001845804c0534010000000ce2d810c60200000008c1302b8c04000000034168099806000000000054092008000000c22a810c60200000000191602cc02000000006a2205180400000b192301d0301400a1884088046480280000000110902cc020000094330e81320060000000038140530081418e1026808448030014d1c60ac0c4500500000000004a0310040003c4e119808c4010000014320603a06028000002c42301a0c0400000000002a0690040003845305804940100000001c4560466018014420638c074900505064040aa0253200c00001084e11036400c1460e404b811b48030000a31c8290335004050c38810a04ad200c00024c6c05406e401000a40e109604da8028000024638c0740c05,0x5a0e03180400000000a8340530080000000148680c60100000390d84408d00300000007117011980600000003c1201d300c00000006c2204a601800000003909028c020014818c2900c3a00a0000000094280530080000000682c032601800000009824050c030000062290901b200600000c8461a02c400c00610850c402e0802800000010864058c03000000002a1a05980400000009241026300c00000000111606600800000001d12014c0200000001e24281a002000000744c2407400800000001a8901c601000000000907014c02000000005a1c07180400000078542405400800000000a8281460100000000f16140d00100000000000a06900400000004219014300c0003f0c228808c8020000781845101190040000f428826012200800000e86229026400c00001f0a416028801800000001507028c020000c21882605da0080028c3b043028b401400000000006812401000000120110058c0400000000221e02980400000004a0900b300c0000000000780a401000000138110058c04000004a1304805a0060000000001e009200c000019064120448018000049210e40910030000030c4180e8180a00000006229022300c0000000110681c601000000c60a008a8c050000000190481298060000003105809a3010007904505a03188028000760941d03310040000000002202c1008000000000540182010000000000980f04020000000001700e08040000000001a80590060000000000640b2008000000681280726020000000000dc04c803,0x886804706052e200c0c1cb1ca0c096440180000000170380a601000000030964098c030000000591080b1806000000a858180f400800000001c88814601001c330458c0a2d0050000050c9180e8180a000000000385033004000000064280366018000460cc190111004002b04941901faa00a0000000f209034300c16114184f009c0803000000003916038c0200000000007207100400000005211014300c0000151044004c602800000002b06018c020000005582400b180800000000a4180630080000001541401c60180007118432012100400000000540c0398040f0ce08c0c0a5c401800000e218204566028000001944302e8c040000003288203d18080000000b251026300c0000000441803660180000000290d028c020000004a24120520040000002604404930100000000682203860180000002e064028c03000000005c1a0318052188120e600fc6401c00001031c603a06028000002ac220050c040000000550b00e18060000000ae1200c300c000000000aa014401800000028858070c0300000005309006180600000000a4280630080000000001580c4010000931f06302ad0040000000811481a1806000000290480563010000000520a002c6020000820e0230159004000000002c160718040000000000b406200a030e241cc01f8c803800001c630c0740c0500000004d0d00518060000000921e01a300c0000000138700c60100000000250e018c020020e348538149a00a00404640a10173401400000118e8a812801000000002315024c02,0x8c029004100cf08d0c0a5c40180000000002481c401000000000019034802], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((0xe28e3154a19c17cb1aabb3420a3c679e8828ef4bd14d0035f85da04a103e010e28217f4e61c41b742635382fceff6ac6840a7261711056bcf61684a103e0100000fc206413d2418b58938d18417ccad4c0807247780d0616516748c04000ce510d008a368378600c04201b909c30800201ce020001702506230e50581402e240037fe9dc88c1338e69c22200a51464688146be6542b2021100430446d2ec6c508f0d44568414ef696033c015f8eae450107c01000019a4a081734d626036ba4840e5fc197d20e954288a74c22d291c699208144371b06504220084d109ed79143794500000273d5101c046800804a38f25b7eac252241000000afc80e0884677e7dcc9000d47e74c863800f69f10a8800005bb1143304b4801481028a0000081fb1920381224da953c471f8ef8c94039e8040dd594ffa29241000001232340e08e41061412491002f6448d216e08003d1776fa0d00014bb13319347c3c801681800008b08002261920021c88218c35750ecf1c98476dcaacaa2080d0537fa8020125acb382089c8c8039300110042490000046a191e3001d3a23e5861a0e6ee6cea230a0d2d8f57cc40103f6e5f3da0208d78802fa9d20017e7d389be4000000013c681800e8f666885c3c80148100000810940828000da880047b10320994000e8a98e915a484ede42eda21a0d64bd8f0b76b610648083a01027f05cd103aa214c471f1fc2583c4c436d985cf8d105407bfb250239e0ecc00c0403b2102898008802134d30e8bf90a201e1d78d24d00b4404920e3ded74167430c00006474083c394b1e35005a8d0d20120000001c2070087300e7dc801080400006dccd104f53014cc1c147fd0e21c7c33ec4579310ccc1bfea50232ff53808d0430bfdfd89800880216f1679700000000a2a00359e7743a220805344c1c71d311408d056014030000200d00010d20004bc4001604f10a02a7f2103e1e71a804117f1d08246103a010a2c755bc11224182300006b961177098cfa26080000046222086c3edcd3a40173a292c6800000626466082400c0000b4900022321d0220e70900046f927811000a119c201e0b584182b1dcd41904143f967dc601d733fdfc24081f00840200401000004449f8344ec1b27d0913e0489d4264f60a00018c227a1b27a0de1080291c34e0a2863ea41a107580d34300f13da9525801cf9e8d5094307c0204f20b02805c4f077fb1c2d1146c3492622c50b4ca1154516d1004f7e2404220086998d180000006fbbb2df9a20690380000000000000000000000000000007038bfce46672a6ae8d5357f511ee061e92279628a2a419412802401704010068000f81802008022c536e5219005c83743ee39954a8a2ca0a676f1ae5082d8bce6494920c8720e5105301676d8b6a059870402467e923a6769c0196030db0c101233fccd3f87e4c1223f37da800091a0b9b84444ae5e7b11fed2000edb9bc4e866a7fa470ed1425a283a092fedd418382308800000d708001cc989e22b454c94454c9da14da0280240ae9851747eaeb745) <<< 16000) + 0x841c41298e25042100849005935ba9532c0165621f186a570415993101ddb711c30305ec212fd304bbd893d398008802124400000dd584cf025c2536b5338276a14fcb486956f68d8f090c6563c84b80c32aa29278802080000191d04c00e305304a0200000007080c4801300a000079c80019c181c000002bd48926de615d7e410075b48660508250b377ea2092972d3a808843b885227a50288671b0f4000000bb854e104802000019c2000c1e49e0340019b449dc17840a2b683924d0825e4a2768404340dab0fc082c49ca284a1c082c44d6d68c007802deb405800bc53e06900a3881280a34211cf732f90112f9f83a020ba0bdd144011881080400002c093b0ac9d4460004f045108427a3a143190a1048004464e101b5e7b6f3852f5cd46c101ad514a7b870c614a6084105ad209b6438108ddbff206082a5041899c10840212407008afcd9870a13b3a5a523101938310bad1038616d1d8a43e84157fac38ffc07820cfcef493d06081ee6e3637e78000da2ccb290400f45c7df090e62410a809000042049c405840c80f9a908862736a89410191bc1be7210517ebb1cf2000f66c4c026001e4889ac860051eaf4a3380110043081184e7d530609301b1e443363f820c20371b78d31082f9f50c0e9400800200001fa49d0160760b0002a524e61a2720987b04f863bbb9bf9734406e8a3d812830000012581c241c86cf621420b41579561c1a2c15fa1f041f23df615438029ed08d310800000035d00032450900404e202c203b047daf20339fca08348090ecb67ed08297a7af4e9000b8a305a53000ceaf9cd830013792988442714220084397dc0c366d85b431fc5a26c6afbf6ede0463cc2f69a8160591cd86cb69fad019963568946255f0704cc18480000000000000000000000085f0bc27df2a38fbddf3bdca026def7ff8decb9e4bece526179b1fdeb825b5c2b28be2e21c29019c110104124523ae98678ea7d58529e2563cc0c7bd59122757f517217709d9ff530a8be80d9cdd4145a08c6c3bfd0438d7c1f5959a14c56d4fdcebbb159956eff309019d12aa96f60ee89c19f4817853685951d9a85593ed774294558143a000bd44001dc88004bf92702100d8e8178644de2a26e0d00085010e11de19c87918d163039f5c3e893861caffe07740c0892ea9270a50400000b25c0c22a0d76a621a0aa5b99ffe0100000021a2000073a653c10a4801280a30cffe1c48a9c181d7c5b72c230a0c00001692d81872fbf69b68c34155c66ce8d018008c7c60bedca000000058c0818038c55d671008015b1dfa053d12400a409000040a4968144b2038060080200000889368889b03432c1a26b0d019068954344d4122690513402899c044a20200054b3655bcee83110e4bf762a7025d5e47a1010464afa8c03e5b1ac8941074021650ad37101e8d0e726a167156999f0c261942038fd25fdc0a259746fb8ddd8ebf60586491b882218f9ff115030cbd99f3a0ce81f91dd894884038653748a840ccc5dde3ed2dca4dc8962534e81c001a20dbbf37c61498802c9219fe41bbae730027c4a2d0dc6e8a04819784bf41bfb70a07d27dbc09f685ccda5db31199dcae0a091c38000042124cc0bc2c5e161e0d2122eeeb3a51081b3635acf0000c1cf3c200547fca349410800212400ceb833d449c040a14c2de02c00450f244896f463e5408249882cee1a2c9360f2006ad5b4f385b32060173ba8aab6afc901096b69ea55d542001afb93ff9e98f8000a26b1640811f097a052400d81610283a051643999a03c91026c9950a05b4926a9ef13d8d09803c405798bc3cf73b491026727157edb603c211e70d419f8b48804060a62bf9112034034bb9c5255272c000dc10c96699edaa6ce02400d816000051040014ace175ad4892780020b89e10159315a33001c00471019144e27848236005a772b10289df753be5383050d48b3b24064500ae19c850c8b35ebc4a86184e69562563014cca04997838007680df292d4801380e00007c4932828000ae480048c9d24109a8f685120345184d18684c057fe201170125ec01043972cdfcca0842010805ea1ed65040d9ae6fcc4003a010e2041c6b9d913068e0192649f7971c7d5088ab14e01a28350b7b5ecd0714b247095aeac3885bf340fb3432c20f062907f860412e9be9a01430600152770042092b49002d03400011690002bc24c812263050002029f144ace3c7c517b4a10e6830865798254c04bfda73a8c0006a35b49941080021c1160a9c502065ebcf4480070011a381b51f577a9830346a8b7f28c35ce66e9f6e0c20079ac8eac8c19d76957eb0881a06b7f32431c1046c15f5d79a11cdc9ec8438a001ba69a788544801401000007ec80014310e209070828198040007be68602ef4bde9a1920e3a40830e211f95bcb184108040988044c2032600102d80800040080d8ac3f0264be1325e01c90712417a068c0749325c406bde4985a3867fc1e7402856e253cc818200fc37b46000e1f83081384100042ca0bdb9f77a62805b3538cd14268780d03830fc9fb6938000cb8f5b04006c21420a6002100868e15e6ef662108e388f2bf73d1dc70c26371e6f44f9a28779941251a8383aa85fe9c2b7820a780078a42f038013522932eb08c002bbaf8390c40802e046d0a4ee5cd09002e03c00011c1f3404dbed77bca245df97fa334c182ac3b8e33cc0c0f0d66f0d430e329a286a69204195dae1160f0423706636a4900dc8d1b341c70192f2db7b29b4904280200000fe900059a3834084ff173c538bb338c887a82a2ca05)) <<< 16000) + 0x08580ce9f84125bac59025041f00860c4a64953c44314c9dc720a11a93df09420a686c0678702017d73871001731ba2613021080400004c488784c00096c92e82c3d817a2899b56cd58286260533ff2121008b92b956300fdbfea752080318cf5787c001544bb94b8801f1dd73900bbd08e73c0022e4c8a1d230c1300c000073c92e0e896c5410e22151090005f610e119e19200e1b80c588514b1498e508036c38a0618782cdf54b86049d6a0ed70504000002bd4182a96e89a181803ff63de2400074282aba9520048020c3274cc072630415ad8d8f8a10878bbbe80c39ab8c42283050f1754243001dd0fd488700000008c410010b2e89a42005ec272b7a4008802000037e4968144b20380600802000008892c08895c344ac1a0320d12a868950244a60a252011288080013449281685cc4400526078ce8c3fb984128bcf3840a0072a29c30230c1f00849104b724ae58c204600647043e14eec4600027eaffa380128094884a0840010f2c05a5d1634c1c0b4ba088871e0f6f42368c1805a5d0a847184d757a9b461807cdeae707003e337747860023c6af4e400019e028f429002400860e075df2138ea871f611eeb375a018300ebbe571f951c61f1bc1babb4030c05875eb272e0c081f14436e85c9a001ef074623b028009a5819a49ee00021f2a703dd4b4f12005e06800023f2000856648a563c3be602062f18941049281a8f18005effa050800c9e17692800f8042c608c14af848fb430d32c1700dcb774b1405726516b6330c2871f653887d9d14501453ddb839ba586086b592f9c77430c441a6eb923f29208e97aab4abc340c00577444e0d1a760bc90033044000133924f050001c790008ef3008010044911d5ac598b185d4786e020961cdbb230006b3f10b4001f00461007f534e9823396300f23126dd0fc30d2a789b4b0d0b16280cd8a06e808030a28976e5484ae18182faa16b0eb94186077db75c774a1608293dc5a9822c082408fb745a3d7473e480190200000974c911d5ac598b185d4786e020b8eeee7130006b3f10b4001f00461002c7512622ae16303b1ced5b63a430d4b53f3366da8962802b15650d48430a277179ac1d7c96202e516a8320ec186163facdb2ee592088efe4412c2bc08243626663d744d974c801902000009748001a210006a320bc1a0006f5249c1b24d0192600c1a806496030fc01c0e202f7b189870a138d7d71e450a121253c85428ad06b8ba6887860000013b9068621d0fe27901048222407470281028cd9a4fc00b03c20f7b4880c2801c40e5cf8d34d82850f7ecd0140a2d22e41b450a081a6aba42e284ca528e63c082562aada1e1c084f906fecc8004f4038a52380fc4c362540252184a0280001e33c6637fcab5120815bcdfd4407f4ccb61c082fb5203c430044998ee7004a204201000010921c01311c09e0600cf4f8e7040c7f12cdffa061f52bdc058c242028db45a22404072f4c18a0308572923cb60a04cb48c02ef000bfde6c9f74000a96e89a1af20509c0601442224a0500010c1229210020c83c454000f6443806765025043e5b06e1428649277482d3061ebf7bb95eb10101005218739e698411772733fbce40608451d9f132ea0408329f0be395982008c0c12ba4fc0002f2fd522f43154569003003c09200f0b0176a56e3d58910256ef9716af24307133f7c415840807b9703e3153011bd500f1ac58107acb00a70de21c0182707607b08100ac0656d7cbc0004002a73b7cb38ad2005c068c3077671123487941ef96a5d1d244063f35fbcf881061de021704c040be687f92a3027842d35e13041cdb48629461200000005577040120bdeb8b23d52005204000020420008aa492424490038080080200000889238a89184448a2201b1106f08891014006020dd010003ef12432d121088288040042b2488817c3cdb967992f39cd75963a7b73d9b32644d5b279f5292000b096e4df6f00b6d6f797f2fdf9b2994dd84309f76f735000202ffca53e3a4bcc3cce35e3b92704cb1ffe64e4f0543c0009055651ca12c409a502450989c1f7ba94291c6ba82a5c800457c603a3b867aa8154bd18b4015cfbc62cdb4f45be20c124cef76c7015fa69642cf6e7cb8508861ab5f18b98917ee02ead90205bc693abaa419fc5feafec1e82661fb9504d2919a13f22f8c8ef5d00a5b254b0d3afa2660008396c4b8b43fa02270ecb4b7273924fd3dc4d110403e94ef0e3ba0587c09865f08e4ed05b3716744d8dea86680846648e3864042843008b9592703f7452187295def7d6efd0b30e8396baa142027519a243482cd12d218b723a4eb7c572cac2ea0208b9762b471417df4e5c8b3aad5b1d92206f03b919cc442a8e5c1314000f28ce2152ea138854ba6c2cd9f7a7702d700084470c60c30c608704404204011fafc5a9d9a882f6aff0665192a2c5989394a8e3bdcecf0ea111dc379686e50ce30be1fd242090510280008e4910928838844403a2411900d8a809c5443c2a02511119888900440019f04248a61203bd365144c0cf461400000046234616d600a60923043c5c4c3070421e2e2c5808215e99c33034014e1672920c002744a9700000194bf85354801280401a007c75376bee43538701fcb5b7c450e130f9f79e8808261f3f8760410620a0419c24100000008c470026d75ec05c50009c48b889000046395cdf199002701071db76c2e06ad71c39af9c9c7c40250e1d09cd0e6ca142027a3e9abb5e4041320d2f930a8410903607af58a0820b93c3c3bc390004f47d497ea00000ff38a68ef56db9002)) <<< 16000) + 0xe02c00011a100043d3a6d1c5431020c28000000d7469205a5d04442440000000c81a09305ffff5c10425a4ebd686802d0886e0c0400293d479880003297f090a9002500869b13f9c192b4069202617b28ae44860abae93214e682403440340a04820131364873e0820fe193794605800aa9f6dc4943800021e4d30940000ad70ad79b9b12005804000021f225e0b00042938656b561aad7f05941732ee481a996480c450d906c240a02e3a089f920a28a202b1788386022d5873034ec100803ee2ef343040005d643e2b260000131e747341d5f4801701430cc251e1b98f0308009822701d320501c9d16cadd145239414410e0202055d74990a73012022e5566c02800554fb6e24a1800010f26984a000056b856bcdcd89002c02000010f923f0589d00800125c91f06c0c83647a0b23c05d5b48cdf88000000006303229973b17616bd048269261068c2085841046803000181001006d5b48cdf88000000006303229973b17616bd048279679048468220278058040180001006d90930460623f018307c96605779450c34be761a92a1e29526c179f12628a10ae3b09a12020a0be3e0d5a281806e434b061680200cfe23f60c620014a9814b3d366822400b80d000046c78e8ae3dac6f40e28091f9e5c2b28509d5f530ebc410021117f8e21030906466b7c880476078073493803973b5457f8a001a3a8d962a00013adc39b873f4801500e08ec0600044248e8244720a0005d7386559f9bee299b0aae6d0755c4fda69bc058362e1d13760b560e0da63a7eb6b3a7ced1def49dfa83bb329e9744048ab43433b9439134a9afec92e4b022016a24c01ca6ab83492d32b387060d0c6377c59e307fd94002084442b99eb621827429918c234c55f1447ed5c6125818b3ca08a6d6a6a5cf7bea2e5ce661f1c51f87a0c4814db53c3e1b56b0c91c35072b7a01a21d6a5b5ae568700051c05c7c6532b7be57ffe62c3e8102b7ec2a5982ea54a3f94162ac8fb580c9a496e48514caf7cf82922fafcb3aa3f11d37fce9f3d47f42ca65e795d331bf20e2782b55ccff6a213714c10344c5ea8da7df2f978b625d3001ef13fd0e7fe1e3e9ae55693ede8497ce5020555b3a0571051385db719e0653d23ae2ae74d132da2170a97871249a1fa537573f5949e197222b66f9b8c121ac57c8e61fd47e15e58dd11d695ed7f3aecca76357ef6098cac45f58e853a271381203b1a0e6de733254eee612a9df7052ab50657407b37879af7ec3d835f414ca7965335418b28c640002f0ce9ae71a9966a26920cb514999068dfca9ae5cf84880000006e104060000006ba01040a17e84fc8682675f250bde08216b5cae81a3002877b2b12124801400c34ddcad6d4c9861a480115565d27cd19cc900b5110e5080eac5aa0b872420342bec0e7e0410371ab2586e0904219c6fad23258011ac6c9cf871c00405e994f936792005a05000022a3865c1a3afdd1d1102809c246f5f2412184faba7ccb7010181314a89ced28e180584d1816759008308e4b39224020832dd58152640c007491dfebd000000267fd3dd6976e44801801808e0040004b844ec16274021390191b80c001c2489e8880068c48100ac8d85646a2b13105d073cf483e7d060400000177000824725aa6ac050003fe401fe4300070f445550180a36acb10480003166c29520003b88b21bb000070f44ca31143941400c30c08e3df92260bafa1839d0c101c262dba0412106c85b928100782a83c0822b92ff934c00201cef9516000000046214002d0fe808019102300440400401000004478d02d0ff16861807c434298c176e4857b218202d085f1a082420d90b72082194bf8534c0021fd99a416000000046214002d0fe80819082300460b27a0f5a784150d47ed2840201055b5784610440100000af24681a13a0500015f90de1906b8c83746439e1200053a20424201f010003ba122201ce2152ea138854ba6d2fa8956872fc0dc08579022c311bdae0db98094ff5c376927d3ec02b67e77727a9640000000000000000043ab5f181f19e0109576772ccb1a050dbb251bda39be2a55ceb5800000000000000000000000000000000000000000000000000194c70850840450030114002e81eb730743061e29b8562ab143f7170f0ef9437e37fe0fd9b8f94727e48819b337c68dfb3f61e88960c12933c3509e59f600d01a2be8046961bbd999f602fd92034dec97e9f0cbb40735023f1d806802ddfccbd7455befa97d4cd41631f5b77d12a8a6167d2780fa780ea78eb69df3e084d5cc15409b9fb1a6cf1ca6eab0f62af3e6ad5a9d982b5c08c2d5166a2d01963767437009908008c21d4e14b6a98aa04a122330510e828870140011d4488cf44647204a351188e8094240320a003b5824609bf28093d3afc6150fa74192287a859ec5d0e2b68150a38f102e1dee924800f1923432604210087940b21c81130a7ffcf6d5943d4b0509f4715b4c8fc367820ec7fca924102a902ee13021080400004c4d92ce2a8443246b11041ad8c22add20b2ce042cbd319048084201022f01000076104101e900f978ccc288026df780102e0054a34450c77de32f84000edfe06f094208402045c0a22d05000098122c1191584c8a8078385904732491c89fa4cb23897b5a1d6a102238f2e2c06006bf8a480101a876251e8804c3842010117050000a91227198a900f482004cdf8144222be67f4816f5c1e2fc38447d49730082638e846b1a0290fbd6390000989084021e511baf12c4a1ed40e35f4488010068491040b58e8860a11bb659c74d003218)) <<< 16000) + 0xc0466000678e3861c0212ccef180502042010f28eb696a4e50f4f0805cc1c52484082292204ce7fc34e0825a0e4ba6041c7b386a28005815d1b804e2042010000164338854ba84e2152e9b4bea255a1cbf037021e2c42c5677bc277bfdd1a3c58858a076ebee43668d537aaf123b793ae34621133e2db0d5fc42a6ae7756000000000000000000465f688ab743f02d0e24918610e00b00022efaa0df9e4a7d3476df04740ec916f5256e1fa43dabf38bb8d83549c46974ce2be5bcef793292309c9bdf55a7eb9f5ffd32918a32c4a885a14c0e563377ffed12540bee78033d8fea2a6089d000511245232004150788880021ecce2152ea138854ba6d2fa8956872fc0dc0878b10b159def09deff7468f16216281d765d7aaf4cd2c48f68fc6054cc1c710c0c40890118ab9aee9e8d6ecc7fe9f5a02aad75eb6ffeedab25c88d8d610e307286fe9c4fb6a1115ce420e976743dfdbba82b310009a82974206c6c21e1e4f140f78793eec8184038bcb7d2946014740010048006f992281d80d8ec88817630d1c54546f124645e34f9854a306592d02106587063fcd18db598c085dbb5a18eb10116474bdd44e58066551be51b480130b37bab7e200101db05629a5884ed36d5ef40815814089c47c58858acef784ef7fba3478b10b140e9dbdc152c78ccbf5c3fe002b5db001a6d5ca23f53eb6c0add8806860e48a3884043840d114e527948ae9609777213348de968112c23540561a0b763249b33124631ba580c67b0e94e1c3d2885591f78b10b159def09deff7468f16216281dacfbba5c7c06472c4d549c2d2fa8eec1a55a4b246835d097d800000000000000001088c1c710c0cb08808b00500db0b1c7e918c1edb71a1cb9230ee5e738b28ed44b3e4ca35019e6b93e0b396c873ef295ff33cf8cc16e84df3148b3cf1c65cc9b886c1774000e908003591221191070c88806444c2a0270d10f0680943444a1a2240d0004ef12233d8429cc2488612033d7d3b83e0716b7d6be3f8b44d8dac97ddbd8244626d8782ec4904f5470a0cc70962bc07f7cd7ecc06ae875629c430a4dcc32a6ba5b39614e6b76e00000000000000003d5ba7aacd43502d0a14714508804405017769115d781d348fd55c80ba279d4cbd8754bd4e8498abc5876b1c737e2b2fb59fe992b300a05a784555bcd4630a77d36d12224e58486fef571ec55a3b9bb5449b398bdd6fab29e8ea01406c8644403e2c42c5677bc277bfdd1a3c58858a076d1c8695d605609b3b38b015acfbba5c7c06472c4d549c2d2fa8eec1a55a4b246835d097d80000000000000000108cb1860c508a04704604a1649a551294b5385d3fba7f1775073a2a893a2de3b3d4155003df894ed549c20591f8d86c351067eb4bb16b240632e096c04a93470590c73d37b91b0ec39f2715b4721a575815826cece2c056b3eee971f0191cb1355270b4bea3bb0695692c91a0d7425f6000000000000000004222c61831421c11812801002d836413c0dba49eaf34679a7aa6583e5130f9e72c712a49b4eb840db79a3118f12a91dbbdbf89a73acd814a793da97e6435c7338b2a0006ee48848441c3a2201910f8c809c4443c1a0250d10e828870140011264128d44360a000df02434920322510c88800b6788390cf8579bd5b1253e840977cfa51b59404092122a9668b21c02ddfbe70a17c300fd86a305b61c4005adb6acad73a808a20283239393dfb6a8c6a67ae83bd49214af02f6876038b86682f0380001279c09183dcabf10404f794845b3c1822e421c0c941800a538a347a0a065a1b2d99904003fac081be8a82aaa32bf78a1ac85444c0430ac2920bf1090ee2e01b4cd8520380002142430bb2174903920c8590642a5a2140990982884805033f520773c5a1c2349da71f3dc3059277e25f54850834d037b3931000eacaeb45861c083c592d342a2805c7d1cfdc1d414501150180b700511020ee20e4abeb8cea856048f3477a20cec6903cc1183dcdff328c24382f68aa51a24700000030d400a0c5289eefd13728102acf1df9fb42044a1c69502613408b047903ad543e8404170163cc00002d0d66191bd649210d29a0fdeaac1850a55779fa349cf7342eb26123c0d01998900000060b304e104601000016e20361385f0bc27df2a38fbddf3bdca026def7ff8decb9e4bece526179b1fdeb825b5c2b28be2e09e69a51849239419808e09a0180401006e18d2b872c90d298b782c831850ef4a42e5349d4d85c654612298989288f040005219692000001162d2704230080000b611ac09043828000d58cb7539caddb7608e48a4bdbc8e02312c83072c72871432013400000030280200d00010324221b01c0d80c04f8c480e3a2226b918487ab0c0600084b202941710277003040dc0899f7ebd082004226ef9862180595925f0f13b4700000000f424004e207043103c718001961bc0c2702ee46491845f6970d812c80eaf86ada58492a185614608300329f010000004cc9c2704230080000b612100990780ec88a7d0e85e4c1c10e5fa8702c7bc7b1a47dc504101d09f2c0c118b259e880105785d5177834001e7db45c0800094689ec000015cce081b0032440980400003da4378541ae2a0dd150e78280017a090700c78807f4cfe8b6ead44fbc5e52b81e134b2c82c71c61433423022c00c040080374a3e266006e9849cf2b16228820f837ae7ac60f685ff3ab1346021ebb96d0e3156e01223cd0252fe5bf184804a825648f1c02dd997de42d2420940500003c268771f001040214341a50f036709181c1279dd50308000000)) <<< 16000) + 0x70802422e59eb2b5204116a8ad18660500192b045cbe1802d9cec2d6d00d43ec0b44322030a40700003fa483444418220831101406834024416120ce0910504800169c8f016c77067428a9b5531df8245b8fa4f6e76040a58807239f00b1003a665e9b39609e2c4740b162c010118c034d230028a719506000009c0ac99f8400a8f7a9563211760e6856048a14c16945cfd248b954441124020512bd52c8ef8c201d8416521cb04edaf631e3c100996c1c9083410072eb9b83c4063161e64b844104344665d726342901c0000fc90042180022110aa358390ec1a83614a039199243c4f82a48b08b241cd5b1440d4bc484a416106a5e2218204081a70d74c484004f6a4b3e9c0c00b248ae7960001d7d15ded114103b24e1e884080a8152120a407122f585cc615730c205223bc2a440a10382228e445081099114b0254860802be8738790c00253a0348448a0028cab01c688001f0696ed58420209e3e62a34502022057d0905805000023935d6500de16d33788bfa04206ccd3de5b1ef95da1cd47873c585cde11175da07438121be23009440e31021418c10a028282038c9ac43f50f2feb2a63ea6ec91c3316a3f6a83b9f4f78052d5e01c86677c7ff74a4b2473f413c295f521f43d1eafb05bf84abf89d2e891be54d18ea4895e5130ba394dccf453643957247fccc15193358b7a00084040022a88010fc9209419040eec8101d8fc5986c004104cc7e25d5f336891b52adf392e49331428000008f0d1800245241f2a979a87a4509e09820d3ba893c9130ae32dc876ef7920a9be2c0eddb9e40f42404041b82a2c9c3bebf2b2510ad7ed5654a16bca1dd2f94246293384d2448cc81aefa0804201e939566082300800009f901c09c8e4331c873e97451648f57189d7b1227c5d032acfb020426a4b86b014c4869401a20bee6480ded04258feb30e13da0840dbe8641815f6bca524801c153ebf46a30a7102f0380001181207159030ac81426408139ee861132264bd354df92fc514f2440a04b24b20a20820a14914a1091000c0a008036c9a4f35a36a511798b2d52ca15526bc647122ccc477bb72849c50f29b4488f0de2df94100772c24b882138a1180400005d080e06e8809ee05c31c48f55c8a57eec51481823a0e01221c0367b73c204a569c60880486cb2a492d5480c000002ee002002a3ee9878a8e384e0280001be2064230004a42050329ee861132264bd354df92fc514f2440a04a20a1c91081090c80c50b529eaef4b1f0f97bb9afade22d4cdc7d76ebfc2d25a44e2ae10d6295a218e982b0d123dc94c9a74246588ebd564488cf5cadc508115b876abe901f3b12cb9e0402906afcb6b3841180400005b888984e06870a89a45205621ace2a41850872fb818104127a03e901c36ff546ef7202420a453731c21958f31a8409c40900200002f2480c544042a201099000481a0243fe0200056c23fc621fd310fe1487ec643f4221f9110fc0887ac243ee121f6090fa8087d00400236a47cd863e4bb1f1518f81ec7bcc63dc5b072298350ec7b4663d82bc253147ce24c202abba5417d7f96620600de6cec9d5dea8b3c535427ee900221e5af100b227e65f9e7eff28e28110747c60e3e513fbbf67ac7177840157dd3a0aaca1a765ef4d58f9a0a002a814bfabf02a8d799fc4f79f9e894802826341287ca26ec9c0e89c35713308e41f89a8ad1bc2babf4a7ea40d2005e140f87b5997cd2b09601a84903d602d00136a8e5881c4ed7afb146a3e161456f09e1b5edae90126aefb5bc891275b97e14005a9a2336e40eb26749c5f2dd86264e1033e1820a4c6cc4f26814307a659039c2000f157ca38487c53b63c2092ceee9c88d75b1a1960c7b02a8385e30631568ef280010d19f3669f89f8e1267753c9866c45469ce8600918030735b3edc5983453676000340c70532cfb4d6b252467a385a41adcc3c09e12c4784a6037e55c83d9a03030a586e284cba3891abe05b8c4b2355459d916f1d3042da65d5e725a0a016e1a18032ef6050093ddbc01b8317d4bbb59761343a546bcfc417667427097c2127f9be07a87781406775c583e3e22091020d004206f3b816da60474cba7e18099acaf085824153ee68e031420b184a083c0100000f630000100460371feac30179b3a22001800800003411e90500005d101b09e0829530b430023357548205eef261611840f0040388241c2020000cb23d00b80600802079c343cc0a04101000030909b098f284eaead74093163dc6d4ca56deca908ba3b334213233870a8972f05e00b25d5460fd38854ba6ea63f8beb4bea255a1cbf037021484d1460ccc959936d3e00548a9bfcdcb0653fb30be9405fe0f68d8fabbfd37a3990add5339000000000000000000456c2e8a0d46b02c000000000000000000000010be1784fbe5471f7bbe77b9404dbdefff1bd973c97d9ca4c2f363fbd704b6b856517c5c62021800000327594ba274c3611f519c5aa9764587a6c1aa990000e802806af50644fefdbca7ad7e3c19aec8288166d132add7495d9eeb9956cfd890cbc0b66fb1fab4259a2c4ca20ebd3f40c347400705a18e6be560b382c2d16f39ba35e6c06bfabc4932b0da629255cc456692767b2c001167372c0dee7ce4c6cf39fed9095704431c2cc8399944f002aa5a6f7efed2fd0657e64c871350009822001b5063f89eb51263379931a2e1c3172ce1229042a02638cdb30058d91f24b9f1891af05033037f2e066258f409b65b3ccc9b2c880000000000000000086650e48e204600380100832070263986680f12911049)) <<< 16000) + 0x31eeef14ba4abec80968a11c4349c41b0ce1b50060078cd720e778c3e6d31a0e9c5b81ab349dac2c51b0ab4673d92d893c0d5a3c80a0440100022391e3018f100eaead74093163dc6d4ca56deca908ba3b334213233870a8972f05e00b25d5460fc6c8f925cf8c48d78281981bf9703312c7a04db2d9e664d9644000000000000000004321852011410c12c00805140b06ed12a57ead44332c6dc5f1293e0cd393110909f45a1bc87e9cbd6e9d35b75de2c3dd080559f55199518f9283251336288aa790bd3445c56b50329e0e48a97e3a19f112c18149699a09afebe7a7a5ac0b943d8a5aa36663d19fd53862b92f52bee787fbb70af0c7218e47d00a000bc24784e63c0631df2d8ef14c010943ba431dc2182f0ec76c663b4131d9058ec00e870fe7fa418c19fa5a76c4608c59c0676302f3f656744008608e07696001500501000032100e74000001398108042481aad42d4923159a890d4d1468167e6448911677a4308130cb10c50e010df53a18400a2e3ba9804e1842010916e7ebfb78912ff4ca2c0d042d6756e090402f0b5ec204f1bbb335094308002000020641e8363ae031d60182700f45000c97508914a2b83e89181119473f145045c5a023f1009164cd9e800945088021848c25313910200adcbac661080f14617307405614b1881c891f8518504714823841304108042068271c12a68101a73655c261e1ca2e77c2060e7f805720084127b12628237ac21d91603541e4c7413841100400005a0e122b0b60264080179f2fd9842372d0be4c1c902fd48c40209feaa810c185e0b4ed84c104201081a0553994422400369f24c810278995c622381ca3da66804062e1698060c2a0dd744580ab26bd5304e1044010000168200056c78b0be1a8f31449828fed50e18db44ae601022fc1277524053f32b0a0206b4ab4f5c026102100800009b90006d923aa321d40d0004179b2005bc8b861c63c09a5ef8b082663ed561c230770b424e021c7eced8000025242200800008c91c81100d86c0031f0d111f4c6ba0509c4b94c4c90509b04b70b0074c57c084019f7177bc10364072cd10002620200080e9848748163a20a1d0050018080006848e788e871f049e359a19b2cb5ee4b0c1cd8e85420477d27bd52c1328842c48408331b7bc5002d31626dc000004e584201081802898b14f160a796d4c6154e0e98a0e0c849661a4d00240035ec500fdc01564001deead9e809c308002103318b4c933c5afa72346786a2ea9dfce0ca9d66ac0c19f71a5c93c2c993767084c183e0100001293a5013196099c304ac6e821c263223d329c109ae63a31a10e01f434900298e8b238e001c41cb3804e204001000015d20500bf161f5bf0a1c187ace85b2c28a8d15e07826fff5b506062dd11179a00408fd1b20046236e48000f1f88660a0107c021e2fb9826e22c2683ef872782a6e9a760e04814100b8c08c3b993d25041f00800007d1e131f459dd1c104e060db3424a8ff55c58265a349bcb0092fae4192820f80407380400021e406c240bc131c9018001fc91cd0982d82f8c3adf132c403174aeecd8c14d1347a650001a6c05de3801748edee08060f0b96e84c1042010b206615a440408072bdabc4030f4fed158c1692f1bf3c80005bc26ca12841080400004188310282380741c0870b218447343ce1e68f14426a01ea20108d012ea45064fb2f24334000813d8c09006481102d002714220080000b71888c1e1ef6e287c4c3eab24041396f74240040c2b2e648084001088e1047275940703acad8190384c75780c50f81caf6ec58036d9010c2504210080000829f20080df6d43c600fda828500c28d383734829ddb3b1bc201a5373ef8094208802000021678b0216c5299e386cd44f74f142308b88870a054a84b734501339f20060f81f268b8900d94b2cfc04e18420100001622398121cb090002609d153d5ad87205f1cdfe78900d05643708c20780200bc0b1ca050140286f4163920b00010c20c042000a1e23902a0012b820505b1c705e0a4791851a288128989e67064704078a3868206a84828784912dc001288100043090323204c1e2e5ed70b5cd1400c901347063ca41adf1c05cacf87c804a204201000010a3620b39bef18819a0189951a1132ef8b08c1102eeba08814b93388810005aa840f804c20400101c6018000a31e2c42c577fba3473bde13bc58858a07617b1a70f2880bf2f83f6a2cec570fa659050000000000000000000000010be1784fbe5471f7bbe77b9404dbdefff1bd973c97d9ca4c2f363fbd704b6b856517c5c440b1410c134004000bea2f79a106daa52515184a58b07953ac67efc3532334cc02e6eccfeb470881d7e8609d9e69bba26c519240ceec4af10c67e52e3a6b0379c0d33cad15ae3226a56edc794342c86f3c75a417c7928ca0a4940015688e28e871044386221c21103504870414006020009932003c3a7c199b0be545024398d6ccf01883dda1800031920f8042c40ab276db2841172f4cd44115cb97433012b9a85bb2c11a9926681809dab6fd200098608002144b4fce049301006ca3c92c12db3d9221001da57eb30009060800200001b847002780119ad70c702f00cee32001d0044c5026b8b48a2f19f8021308249bcd13001d00400004e11bf0503b8281d8140ea03d082bf230720256465ab94030e1e0533c0049d7f78090307802141a00ae9ea78c5fe8af234262bda51211860e804000028ccc5ae16ef9a602035109fd001285389316005199e7740a080f802000035480013e9004114010040100ec02909ab6)) <<< 16000) + 0x3f6f301f5f65d21603f62f68423081d00800005091be0d00d8680a01437a0b0001472000b184001fa08de12c1c8363760bb24232a59a1621d48e7061c2d74b35ac500edd4dc0c00090707c021028248cac8e086cce55c2858a697611400445908048103a010d0c1815c0e10080bc12be081b91e221e0808c6e8dd890107c021a1e24d8e68001a999991020d00400001bc8000ac90320de0405fed2de40000d5528c08122dab5b204c3080011811cb6dd7a00d230f1a90087d43a68e005fecc0848103801008e0100006d100019f20081a81400b37f0a0e39c2e514005d8a10100018a27424081b0084020b696a78207c1e5bf79e00103e2eb040436616fd2000f80420000200800002220fc0a00011f20641b81cbad7efea0000e9fe8422081f00840200401000004460100200808e0100001b90001082374220003482000f0878b10b159def09deff7468f16216281d85ec69c3ca202fd4c37cc583cc583d4c341432882830c23001c00000003740346b7e718b85c70ef619fbd215bd1f8372e9b0d8f0050c2df58b74669f076208d1be80014391b9250190c821c6437002000b702364421b001000a5591b72d80d96c6d82636a0b9180f9b7e53171326a8a20459c95931cca5302c397a870780cd0c432206e4254d723d56b5209087aae1c30a2406dd18005f8dc41e1f04a5a2401df3c203927af40c028511d8eb9e67fff0800111252997a3f50b14a957f407303f07c4a270ec6a17816872fc0dcb4bea255ba98fe2f938854ba61091859831e196188198112100bc0423bb77f685efca1928e99f38938002752ee736731c1ac575b485cc1d458a0004446c5152755a9dc3ca0a37f19bc37742c11ab823d157e08045053ed19bf838011c6ee134ee07009b75b907fc7004977d078e681264a4969652066af3ea8e1200006e973a1520876d8c685c06800025a236853d1427c92ae8609f192a000144fc64f46288087440f4b40090508402030e13d1c6e944d7e6098828d7f0144643dcf9b900125655d4000241821008000070913d11e0c1bb5e82a1e268ef6c456586aba52f4892003ccdeac638011deca2680004a4044010000117338854ba6ea63f8beb4bea255a1cbf0370214e2152ea138854ba6d2fa8956872fc0dc0868e6b111002c96c8d6d8e8b9f22176e27d060490bc3015fe1eb900000000000000000045944e1d8d42f02df00653a9b19c8d1d51c28348e12c5741f52c52820c21c00100a5ba7d7d029b1eee704898e2cffaa800d6004403e10c92db2509434aff0c94b1e97ed80ff19947721a8d7a06c6f3d05fd7b49d3f0f1890c2e2a63c4a8cc7d6d5daf38f6d4978104d7b859cc3cb57998484a9a9850005d923663a1b2150658486c4243600a00099423408204a3504912820c841203a0011c0235eab1ae458d698c6b087c58858acef784ef7fba3478b10b140eda390d2bac0ac1367671602b26179b1fdeb825b5c2b28bea026def7ff8decb9e4bece485f0bc27df2a38fbddf3bdc000000000000000000000002e3e00ca75363391a3aa3850691c258ae83e8e4ed05c000000009a91b851b72f59061029c51019c01200869651e6dda7fa138944de5a1f20cb3bdfb725e927c431485b3f0bd975c987a21f25713bd14b8cce8003ccfebe024f473cd7ca19dc000f8ba4b8d1a59e09846c070d016dd441853bc5027074d63707e8ba51f598fc5f4bf9984d09b87e3b2b4874aa21caab4c09431a060ec8b7ef068ecb000121a9e14029d4482a001026483e008c1e0ca255f0d0773685554707ba8ab689101a40415acf00b78ee1f000945080021c49231e486490ff946d2de7801aeb856c3800b336f3e048104201080000802384adfeb1b4f020305d368800780200000ea46ac1400018e46a837c3c8edb2848ef57c1c73978958fb6bfafcb0d85ddd5ebea8e4ae5243d98c8dd63470679d90142697681fbd74d26a184a1e82d3982a94395571b5230c3ca86ade6684d29902f5a4c2e02bf19a75be29cf9ee23141528cebe981121713272c0bd77cd01f3890b996b08bc320cb4d2707c1d2d4d5b50e4e5c71e0a3ad44ea4a7ed26e8034eb81d52104c35799d8a9376c3380123a90767032598ddef88fbde5089d4a9260d0fd1a6eb2811ea9c0caea928ac624169985c9f697c3da01389043dcda0000c084001fbc8d48af0758ce60fc3c04e8298d32c007c951c80409fc75bf500241420008400004011c05074767f0800f004000012ce81734e77822083a00800004b2350130ae098470280004b48d38880008e08d3108002e38c81dbd4846c8270cd31f6557f44e1456ebab331c28b552d276311017e963167388865d724311a501000315241cf3ff14af35d729822ec667500cbc0ea0e24ff02b85144f11e758e8d978cdd779edf14a1293dae1c2c8935151f6bf5e494893d67e9d46628db6a601895d0cb5c7e36a8b3b6b02b20a2c2c785aee42d12b1cc4622b29adddfc17f00178e582b4476b6bb2d8e9c307e30db292551a87b1b14036b99b3d9fb283ea1b2b5b96811fad2db4a909bd8996efa865a42402751d599085ff922293245400031410871900095a106c1df04d984c10835f9d15606daad2b11e0b242ef8b346ca6b862dc6234718a804ddeab3197a2a6bb52b4977d1856ea95bd6efee451f8629e781c0560cba58841ae57798b9d914be43e277458e050061afc40d15bfbe8e094b68ffdc1244ad89840561185a1e9c9abdafb3219d61f897434002ed53979b80a4c0b73b9db0f7754e7b3fcdee7ce03de0288c7a133ae3b830923e6e6b8ae77a12106d0)) <<< 16000) + 0xb58e6f0ccd37bd85ccac2b093a24110012944d695607c32305b4128952ad6dcc8fa0a4d91ad8d5f587b610fd530f9ae78b3513ae6f6edbf1c067be70ca0eb7679cc44aa00301e2214e78178dc5da8800198c415d915ce7162f54cf255a24ee48685db73361145e4afc8f3ad0a5dad3fd770098c12316f26242319cd932600022e480d90c69427c3dd9b4b3e3427962724a282af60e3cf0814eb43f692c088c79fae094208002161d21fe34361840bac42de910211004306080d03e6961cd8bf401c60c639a2b9818401b4d19520011b2143512821080400004108000cf11a40d81404c1b026346131a20189880e710a97509c42a5d3697d44ab4397e06e04359f774b8f80c8e589aa9385a5f51dd834ab49648d06ba12fb00000000000000000210d307da7a07816658a50428440230200000127cc5f56b453ff939d9c85297de88730852a84b8e17b87f9f7139a7732ebffe1f19fb3e4bd132b7e1e3ff2ef7be83310bb05e2faae8a10ec39d667d1a10dd8a43892c571c3165aff498a12f1a84b30804694783765814d1b336118025b58f8180004c404201000013f2000af24680a40944219f1d0490a820c341201a046050004af11473d0261e8678a41783219d0d0ce02866c163340a002cf920104e242a9760e47306a1985280ec2595c29ff353990c4d7561c7c466bd637d76f1de08864843151346812eaecd457ee167f2c12d8a37292b46e2f450841a324e56b0c14a8a7bbbe7c0d7c4c5722a157cd238604e2be479bd2cf2855720b3c96b24521327ad0f1467a5411955948ae094534706aa04c277232ae2509e1934940aa2a00a6c0f67e45bc6cdb0c618ecf8016f68580236dac413a20ecd65ed16afa132e17e2d0ed55780cf820173821840c12d21fe9fce55a960f97077f464a39f46c60aef2a457a5c513f466d2a9f24e2af5cec1689ca9045a39544019d47909920882be1f960c2eb40f79e5d8111e2ac8b122920523d9828a26d5cc8c0808f9442e3a5817c3ba2031001a2b5e744800204a5844010e3c03fbcb9a2c9d1b26d7f4b23952ca291bd828d9047fa986e3039d609925e38fd9302d286caac733e76b02f5fc494c661338580b31b9d7001a221b961f2897fa70a933e56fbad0e2f8751fa9e45a072b516aa9fb28e9212105fe67bbfd95582bb77f2e965800069742ae59fbb4d720b831262a6f727f74eee20ed7ed0d4a13a332da876e411d701e4a45a1fdb9309bb2496108cb52f7736da3059659aa1722733470985867674e83b24ab165984d7ec1903466a2df2e55a2c3e935d17cfc3e5d1b1483be1b110c52d42c74e6ee7fa38fe89870f0905e6995c2000131c1f0040cc808000310d0c02118d990c3507ee870c3860417b3021c100c25c412480844010198050cb8086580432a02194010c980c64804262020001832304020008e023225b1902908014c63c860364318e190250ac2045631a2318c098c584c62817afa7707c9bf8c85510000004b052461d3d60910e5f81b9697d44ab2710a974a710a97502136d7ee2c1d702d1c258aeea8e141a363391a2f80329d41f42861862823012410085b6beaeb9ade80c063dea59ea8c0861cfa012f52b5cdd0ca77365e53b7650000088910b797f3e08c4b99b7d8f187c0e89cef0eeff03844a50e2feaa2771a3460c178095ab01a3862ec6df8ccaea24129e9a15f5b01672762ae6838273fcfff22207e5933fe604f02a86dccb2f4c6a903264de1001ca973e84226fc8ffff07000500001da2bfa95c2ee40e84908102cc22e8e3ead7fff39ca8259bece48359ed817120b4155dbc34d8f2c20548570dc0001b71820b781ebac708544b7da03049453cc92a20057eb24e4a00940d8fde020004a5842010c2391d7bb7b2aed2345c386293d042da08538854ba84e2152e9b4bea255a1cbf03702139e07029e163ec16dbdf18a72363f1949b4bcfa9a61db2f6e8000000000000000010bd4c37cc583cc583d4c34144397e06e5a5f512add4c7f17c9c42a5d30854924d14d0050039932ae5060f6806b7fefaae6104fcae1c60530e7cefd326aca4dd23d418782bdf02ead9405f65020bedcb9a91a9a2d1800234f81b21e39d2f98f288fb1b6cc005efe66e8c47c519f7c4b8d971d1a59b44453d888bcb60c0004ca7ec46924257e58af96c274d347144608efe515635bbd070c9b1bf9e7821f8a796012880e00406242631012f2cf5f58620a2ade106710b013a32339c701f29e34040024182000800006e9187110c306c0008f48c29080023188c212f8e7efe7700204bc76da5e1a01bade57c4a0089e726ba0820004868420100000ee20d06218301c462ecaddd8c31b1daad3cfb1772eb401b64a9362192820d95f000000000000000000114ec457bf86d40b7c0194ea6c6723475470a0d2384b15d07ccc2cb1cc0c70cf008000775b18a864182ec44cd9bf82713c6ccc33d38fe93f3d66c122ede836e49a3c2000053372c0220c19edc1e031a919bc1e07fcf7f1b17978104d4fa78e2c81e66b500042f203873182050007da918151048a08600c403a420017e522fec30bc4d8bf1cc5f49722bb1c0f18a2a572fe6181444cc5711820e00405f0162f60303f018bd00c5e4062f0021770189880f8bcec53e84301bf30512324139539f4c000231c200080bb00f012a0b00251c0922e4d68000188808002000011240005b083780e3832f498165f8459c1af015930bcd8fef5c12dae15945f50136f7bffc6f65cf25f67242f85e13ef951c7deef9dee0000000000000000000000017155186731e315abedc089c70a74)) <<< 16000) + 0x406fe70da5d97e285f93300000000000000000403b115efe1b502df00653a9b19c8d1d51c28348e12c5741f528918134018003dc3fb087010fe8a8590c8b68df61be2fcd84860c93b58e74b2fcca3a7023ac145e679755ae56c2bece7ea356776abf3ac4951e9930f106b78040cc2046d7c8e012f92c82d557d99afee7a6b3093ad0b3b9680c5ef01b35f17114db8fd8f5087e3b664c00d77c9b064f4a3099927f78a16e13534001dd08ba9885d0a42e652172298b89485c0940363a16f1d0b70ac5b4540402a16c150b58685a8342d20a1680104c008002f4c8017ab1aeb2806f0b699bc45fd021036669ef2d8f7caed0e6a3c39e2c2e6f088baed03a1c090df1180491871870c60c90850154155140145dd91ba2654b33886a3dd010a33e54fd171ee9d381328add698c6254a34b0b129a0533aac15321d6017606a6cfbd20b6b40a39890686fae13c8401f60b2c405adcb2f9387a9c9008be4ea3714eb252e88482354b1f34a8285b4981531b69f99efcbc9c0457b249023729e0426ebeaf1b3e7118740014f8801df1900df74384028ab0ca6440404c721b7a0c10acf32ebd460270a908bf70c00131c848695415021cbeece20500550032b613006059c742cc32165150b208858c342c40216101000105100e5fc2023a406841f425a3a0711fad03cd810325dbd07e480a725998e91025c58c9af880048a840b51803d04dc9581409c70880214202d956fc0388de14510b081951b31c6e404e6f90fdc08149476590428213cc482c028130e11004000050c8418cc2b4162b60be2c42c577fba3473bde13bc58858a0744a1071040c808608408a0420480050c8a0080378b10b15dfee8d1cef784ef16216281dc3ff833303552c0c76eee0548a1071040c808408a04206e572e67ec0b716134997326f86105919942c8e5e0946059031493eec0a68e290432d000246224e32151190588682b8342c01b0003e422be5b15e2d8ae92c528861a03315c198670ac51c37218160119e3344326f3cda107c6323f460c26a95fabb2498b16bbca5c84bebb41848366b849aa475aa3543ae24651e0110018c22a167e58b198e689c8bfb5b2e840062565dd09ea47aeeb811cfefba16c002df0459cfbb3db9a1295cc572e5b942021b8b78ae43b8e74e0f1c0ab45a19a90140a886bc5000a403fdb5fba640751500ad80e46ab587adcbe2cbc958f23034d3b218dea04812355ac3d8ddbb40a848d313578b05d1ab811f162162bbfdd1a39def09de2c42c503b68e434aeb02b04d9d9c580aa1230c28a21219800060b2e945f0ec659b300ed619d42de0ee76984b0c7f9d33d092d5e92d48559ef7109a0aae23cb1e20513f5c42856990576abf473067d14a3e0f40fe616a8c7f1c5646ab587d3a39c9abe55d6adbbf933d6780704a872fc0dcb4bea255938854ba538854ba810f162162bbfdd1a39def09de2c42c503b0feb72225f605a1438e30c29a01400076fcbce2b55bb5857aa83af336f99092fbe24a454f22a403b41947a2bdf230b9bdcc34b661097b5e0a6e2137b3dc595a4b9cdd7a319545390c7b641f8fba1f081e92a8057438c5324076d24415289e8a981835ed487080020f33aa801308108042c82525a36b903d9ee91c0c910007e1d5830830cba9ff18332d86c141a00951146bc7007a1f6b0a0138810804000059080015b10006c222b43b01b158438aec55452cc099028cb768184512f3c311c820603be5342181338153858208e0be80f880142ee2020000013941080400005c0d8a44fd26592050b208e648a25ed6875a840c8e3cb8b01001afe29200406a1d8947a20130e10804045c17830136fbc009181f2f199830b801528d11441df78cbe0c003b7f81bc2508210080ac82c56017a3b38aa110c71ac44106b630aab7482cb2810b2f4c64120210804055c07c43ae280714b200d6e705240f54f3377f1c665728aff9a108b1b18c0b042bca3d384c0842010e226963dfac59003de30d5207a38181f10e33aec51fbcb104a7571783006f43fa21260421008000098900027d20820200039922ac22155090aa00800148c8a98e854814000d74449cc42a252150210588e82b85400287240a0a41b80a0018a1229e9b028298a708f5f4ee0f937f190aa2000000960a48c3a7ac12313557d8ef426e915959cf9aaffc4aca59288cd27bd525672bc000000000000000000000000000000000000000000000000000cb08a0199210610e08a0860900000d745529fd75de72d4aa00b0d44e2c31286bb42f8ddac28687b3e559acdaa79cd18b23bdfecdc83c95f11571125b20614090ce969a1a35b3066a513753d7a0dc4dfdd7a9e8016c42488350ad0586702c2f417419258cb328c135eb14e2880cf6bbb02040c93b597f1006688aedd8c02b83328b2a91d30bd7f00164c34d588080011418eca8c17c404fd6900b88c10dd81168e2029ed77604040ebe9dc1f0ab1d30bd7e4001dbaf11129011004000056c8588a82b8440006304534b62985314b258a510c0a0861a03b149198670ac5205628e23c12bb5f938240807c28162041c56e2f1a860048c0c83400a0a1080230926d544eb60a1824b33bf8e38520f5d99ed4e0521f37350f28108d47251482040872fb8180411d29b72388200000004ee4000949e859c0a52004c028c2c06a1ba24a88c50a04f94a23c7991450a3a801cb50716182196bec177505045e006fab0fae0821ca66f3c6bec2800b458d3868810201da9ee03781b0002567172053a45409d20062080000254228c0b08c01f960c3b70706b4c58c00000117a)) <<< 16000) + 0x93e30c16039a17d736504375671a2603c58234b3e3fe912a182054518fe5f90082af950a231bde10015547b11b938001b6c9700b63b5fe7a400c00f16300c33aa5ff248c303c392183085141098ef36ecc38160894ddfb9ec16820a320a0be16cb16000f59eaae6610600121ac609be0020073a4e47ab860005f1b162acb3466f09003003c000125103205d8e7c185f450c60a18000002acd080c304ba7a98a7c018502f4695ee04248452baecfa95c0105c3e793b15250c002d7dd9d66b70401ae061f42daa001f4438acaa4e27104801781e051407a39839410a104118088082098064000401b840cc6783c3d7e860c1885c5df5c3008180a3b0937da365043d4784199c290413172cc031d3786020bdafe0f69db080859a0ccb3161a0837f4704b3dcfd08000bb562de31d7b40e9003204400012f10003052000aec4002954891028003c108a20cc4f4662863314209e096a35b607902042438d8040213d061c1820d8149847c000483844010d300000064030d2a02535c2c4878b8cf90c2349c7406460986eb65e4205da248ddd082137a4bb012043c5c7950000f10bceed4801080434c01b365e5aa06940a6dcd680a0b181f0ffaf9100c32274e0a3e2018227d6b29cc905800f87fcbbb00601a26ada0ef4840100c7d4a9dd000ad21e974e056048015814000086087402c39c0605003e34070f45c431838152dce5e91c70e5c75159060a0a96e67ff87147e0af78c80a2d735afd0001c31013ef0c2a28646ab8c7d0c30c0ba1b29c2524009c0501ca03f38000000fa010405026b3dd6346065a8a5e5040c3fc77ca0d861aae2a40157102095d43f0f51842506f2f8d4208046c4a74f0d000878b8f2a524009c051e70184b4542cae8d201238728c612e68c087a3eabdaca2061730de9468050c355c310c121e6081048f84357de86308457f6cf2c82210401e8678f35e8160019fb334372e26284801881e000094c80022e9c1c17c0780bbba0e3812d103e21741c51b3b290736a028b82e70ce76734c0c27961bac6218e1804c97cd80cd0c30d08a84d2e3a6820bcc30620e58a041838bb533a64ac6400bc0d028203d2015b5252e3a0f22061af28eaa5fa80061acb20a00978d60344094a01b3afc1d481005eff82cf60881040bb7fb11599b48e0816c6f6cf6d5642c2051cfb5f2f652850000a6bfdbf41b28b1f4900360506900ed84b07554410311f5c83c6298e30de0af5a3b04071a2062f7452ef53c40804772ffff35488207d08580928a07040f1c6d8170981610382f87fda1f840001210410cd32dd7548019020000097480027e900076c206412000e1822800b821e7b48a2774d1a3cdb1edc30c10036634ee50b1037b6aabc60d081f4186a30080910ba1ca3c460b1140d2eb3020a3e2c3ee144b023cdb2921e25920050048d20125e89ce6fa20854bc397cba14e10406469a95b8342169dc6676cd8808125790fde330823e60726cfd34d00125e878d4642008c06256ba740003d1ce4f8318083b2400b80e000046e6089524fd96a7a68d4a92ffc34f0d08752d616c801011f7ab57a1f51829aedc5980a8105e5db20a3a04e044e1e43f0a0160614a6e409d8000073fe3a91316f920056060d2021cc0b3e6322084669c4501b04e102864bcc25283420c54c5721fd880853a723e058f08253294f075e24d0021cc08fd39c200819142502180003cf8532dace083b2400b80e000046e40011b0e10a9f3ea851900e39470e098537260a8d0b3b818360e2aee198ff67e05024fc747c70530808861808abdb4083b5f9cfeefbb9402342cfe78d7000142f46066b5c78192005c070c1c2ee7531c461c71cbc06e72b54f4d1840e6d47ad2b0a045ddbb5f674304044336d7f7bd98105bfc5d8f9cfd4c005f9470704648701356323bcb9c40029606714a90b3b564801801e00009288020080012c4d0c18d76093a70228a1a2f5ba5c91050808e0bf18eeec2863620f8c39ea81874052ecac10bc40219df2e9ed1101020286bbad67ec0823407913b148050008e0be7759f126f4801801c00c8040500213f0180014410471189f06c0041b880117c913d1109e068009094d87fa429f54441142a1cbae3fc7ecc07396a1d103511f25ce9116bbf6e13d60024e7082fc42d2d36e58548072ddf0a68837c4990cbc76dcb201163f1313c96dd074b4adb91c9df91050a76469c7631c0bfbf20cd2d883f4ad1220d47bd28def166ea5e789b6a58a6c4d2fd01299d79368013b00f68e3cdf4eb5ce5a6b234cef0d01a64a6a479fa8d95ab203b579d49c240b1a75b12c358fa1cd9dc938321457b66b86ee35dae9650a61f8cd946539e727ec962c6480fb7d1e1bd1aaeabd58712248bd680b31943a19c1ca73796141d063f322eb0b5288fa9b7c5df10cdab2e34df0a9ac6b8fb6a69203fc3c4aca1a0a0c1780285ab398121813dc4f2c02fb20306b5604dd3c02482142fe226a32782040f45a8b6b91a0e009007cbf5656800005c0c5df183472dc92006608003f01f1db31fed6f6e7028600841809e72792204061c6466ad0a0814c5cc87abe6104040f9e872ff8281026c84cb18cf04080f5ea3d85c2080022635bfca1e0000042e5bce1e08e7c4801881a38e530074d0f91c504c3e7b9960e1bd334180c4058a0000006ba02c400000037080410285fa13f20e0533f4b4192a1000d7d3b906004003c8f726af489002901c000101900046f22760a13a0189c80b8e80f1fd544707140930fbf81685141aea02ea3b1420897f4fcb121420a56999a6fe40244bfa93b650e010097f4792)) <<< 16000) + 0xb94005baa343e4c00017218ba4259389002b02409c00ac78998cd4ce46078c4725d5567a44c1476a0bb173161628c28108b02760413677d02231104808039e244aaf040012bddce483a020152cb0c275ab00019f811fed17903e2400bc0f1639be800f6c4dc16304b33747b4e40c312e7a5655aa50c187a4875c364192095bcd0a14780020a77e10e912a416004b336f3d11c0c03c86516ea688800735a8190da404c9048018020000092c80025391370989b02fcfd1e4ce5e2fd9e580aea3c4670cb1400000083d6058418534ae1e063c12afd33395e384085e06ff19ef810430ffd99a3f848018534b9f0fa0000cf57dc9699f092005a05013501c10f4b19f8fcaa40c054bfc5c34130600000020f584022bd3bf72dfc0c20b828608f1a0820c3ff6668fe3010672597fea928008987794488000040f2ee0f7ee1480160122084e4d51c79d081800ef581b6d96382dd7d316d860c05bafa8d0b20112d694b53d0184143bd9601c04103eb820c57060208987757be8000142fd09f9122400a807000041a4001124f9f27b8b5be0b458e232eefd88e67846225eb6b8145840653c98d41810467abee4b4cc4821774a03d9840821851d8ca12c4800653ca0885c0800ec0cad1aa5c29002c02479f2fd8b64b0842c709f0c37fcc818301e6047cb7e8208a30bf9bc30448214d916dacba18103005774a7c820858527c30c28f00077a07fd5e65800b641ac12ac9da400b40a00004544230160008f444d02400169a4004a00800cef90a2110998884c83426202002147203843b2e5114fa92e5016380efe2ca9ebd1c301079b9fd9ee186404c43240a387080c5b4d12dc09608c3a8f681601081019ee8745ac6280083cde2c9f50000195d52ed32e57c9002f02c5972a5b6f86dc0306083cde2c9f50e18152e89bb0c430c6abc3d84d7058223d4b6dcfac1c10008612102d8e0015f7a591288100068631c9ae000008010992694a24801681200008a48980284bc078679ab6f083a10c2014dde532f444060d5c2ae51283013996f1a988d100805f01240f783040f8f1df69aa0821f81862b77218008e81cbdb1e000075112ff7feb2a9002d0286195f6296e23e4308018bee5293c1a3859111f68f2cc046e99c60c3f440202795d3202d04108eee2fc49410001db05f74e5c10009c94aae8500000c018e5b9def34801681200008a489782b4da46b8869cf30d144313174b44f24510152e9da68091013d1f4d5daf1c2076b210fc3d82082aef1ce337404105394960fb287001a6d46e8cf400006911eb68e9a884801701634daa1ac30a5248a15d75f939c708261f3f8760410489fda0a8201036007dec668004341f02149000d801f4680600048d568df0000a67ed822332004e0200001ee3864b41b98300d1c0000008c460809e72ec8b2040cb514e490c0843c5c58b0104230a2d1d460029c2ce52410007bb7d60c80003297f0a6a900250080020080007bc8003239000ae5225c1a0280d0968684b0242560a12a050948084a00417402001068224e731263584198c4946619c030bd01c040040118582a539271e3661206d31e19ba5942827e09b824d020811fe8a45cf90a1065d24155a9a3026da7e319423820c67d81c680de2805e2d9631e34840000000bbe0fd56f9002e03450a0937945a9ce891002b4ae9272688203c9d4af0ffc283094688a2af4e2842032555e9ff01071d20380d2dc1000aa0df1a5ae20401f4ac521cd820005fbae34606aafd09002f0380001201a142909cba68a7f104ce00cf8e344e8a0c072bdd9496d90c30048bd76ec8f890800901be3b65c0822b4e28a7a441020431acaa967721040177503ae9f0dc0014057c7015f78958e480190220490040004e6448c26244020007492242230041188802c00c07028eda07eab2f46c929a4c72f066b5c54ab45b14ba14d523c2b664ac5d2b3a5de03d5f33cc4e380e7dd50505fbfc9b00b6243147923c7bda26344d2685fab7228f75d06d60e06ec199e7c62f13e72a8cef0a9b14300833e85c52e21868388dfc77f515677be00c27ffa20069e36fb3174806324dfe493be52b4131712493ce100946d3d4eaffbf5eaf5416b83c3e9c8d6bb76600159c26efe39611ee08dc097870475caa54a0fa3a0506a41e3f064c9baf70e0f341318ef229910950d476aa82297b5123b407b5818ec4662ef1252cc45252914583cd06335330b1003eac7a1635284038570bb87f84103c6934c66e82031f7dd18c6cd0504d402a5c214d2c003d7f7291de8300d15c4a07668000e20abcd135821b89002e03858c2bd9309502e0a2e7ee7b2d65ae50806eb51664d60820987e4b6e1025840a04887dc320a09d6d39dc6e78281d7b6830df110200e6eb603a8d80007b68a0e5f8a66712005c07000023722400b11f0588f00800131c87888c3bc17029e79300a8e2a84365b51a23fd7be8b880cf6cdc179c020df673e004a2040010a209e2a4d318460e278a9018111c7a03416b7151820d2f5359bb0710611013148c20924a5871c9a443006089940b1411a2e6368ef8801e8e194d85657a410a4091442e17b3b01183970bd8d188e3d1be7bae50824d4ab309b161040579982141125fc8fd8101751e24549180069aae90b8e01f459cac31d208480200001d5386a1096fa316187f7c87e860e46a060565024d3890cd1c17e95458a04a1042010000105383804a1db57fc91c77985b0c184b868c0c31c168e118c1805acfd85c4a9a281db777a23cd1c47335eceea61a2096b6d17734a783081948712e3770800c65ab5b052bdbf24)) <<< 16000) + 0x00bc0e14431936067cc1cb25c555420810bf3e701c2e4fb6db99a00128b966250021008000081191ca8d03cd658c3a2890ad1869072d3db0c0e89f3497c9010840200001ae406c140008c8400265888e848470240015c0444c54002d68446c960363b02019f1406f8a89141e70ae1889f9860c50a2ca6fdbd48a28bb600da173bc5082a52bb188c4404594e00b7f4418454099df1be81041ddff9c594c20004a888db88d862400b00b103209a936b050a435203d18a2cd1a7bb0410463649d8f1200017e2e6128011004000041cc0100401000004474911755780731a2420e07667a8413cac2b9575c486100e0ddbcb1c21978c154200410aa2b17a1909042c4e26ba560828c17e48be2140096ab51e355a4801481038a826a4dac12210d480f462093469eec10209024a2b40400005f8b984a004401000010622340300033a206413c30eb61169f4f38a003444eb7d0a14e3195b00681459e726ac58a4b0c75dc5d2f7e0c31e0576797f09089cae55802a2025bfbdd64450300649da65b56d8480150122067e6448af142a18b9784451627de1acc10447e1d12424001287b7f4a00420100001023c552d4ec539221aa5fb758412367589d008236cace5a24042100800006b10e105f9ea45aa8bc3879624dc69a7a678d4583ca36e030da3e0b9b0a058a000001fa405863cf75eeffe50215a235637448226056d025008256459a5089b2400a007123bf3224578b190c5cbc2230d13ef0d660c3011ed5d314000943dbfa500210080000811f3d242f6a76840c0000008c40f2c65a8a4cc834b000000e100f1a42b168968186ba9cc44e80d04d6b1e5d411813e1f74f68430471d5ddd52c4801300a247fafa581d2c68613f777186f96662be28002ab22c99000800200001a24000b48f152a211a3c910c58b8d20412ca26ec242610400080000a72000d8c4002c4885b86808414232021180103900845c0422c0201f0100096011153188a0ac44c0700c0100448a3b90e8137408243fe323135c28616dd0b4d8d86198de91c86642027721c079d2100000000f688828015bb791ab906001a76ff5c8c000280f2e87dd70a400a8091228ee438931042090ff8d0791b0a185b74772bf61865e19d4807d1210000007b4441840d711868f60809dc86e316382000e7cfbc9c300012d9e6a68d5c29002a02400010710ff0587f00800118488906c178362221311001e8c60e54cf04060c57e4193d412080d15c1601140bff2a803da201294dc0d2e8003f6584b329002eacc2d48072b0e81690008b93571eb630c1380e286266383789a218b5243a8b0808e4a8c21057b62e34e0c011a11c661282108042864ccf4c5334477737f4c082e8a6dea640145c2e310240420008000069910f09641fcea5b9caa6933684835d1c2c014794f2e559a9455841078000000000000000000000000000000000000000000000000001944514410d0cc0c404e004001010c060080340008a48870283d8140008ea407044000cfc443486064330d71583506f861b0c9700c0985b76ad84165bbfafc58c207c0202180210b0188500c4240745807c67198a102d2e83981041856e5370904000004621812fc4fa92450428d1e4133001697442409c10880214202c9d3e588247252b0006108ed6261920bc4618068400115da1032821000400003fc82002c0fc0621003c37f1720bd0b145a5d044428a615b9da014282613eb5a00000002310d00b4ba1b484c084201091c57cd156658a12f900851029da54ec102090b5ebb699010840200001ae441c1620c03e3c2df06d1460c169741110c30077adc70306ca04fb358208d0876738880000004621c00b4ba1b484e0844010a209fc90938c1847c615d900f9169dc785083d298a5d9010800200001a64414170280000036c9048e313781c46018626644de49516286768572d6050a34a27782ac680223b0c65931002351ab25c280002c2273edd10c880c290200000eb10004582000d7e400265c8140a8378342081210309081008374040016524404c62002b8060080238b1578a353df9661200000ae2dd80f111a613a5bfe80824e035ad552961035bad5355b7ac18696f9cd2ad398e044943fb308af940000000ab34200001492923ba0093882400bc0f1c58dbdd8c15ea2098f6d55732a10180000164b8020757208426e2061b04feffdc887022ee3d8eef09600000005bb8020024250ce0080001f737e8a5219048015014000083c87f82c3f80400092a43f4360bc1b0fc0987d82c3e80726179b1fdeb825b5c2b28bea026def7ff8decb9e4bece485f0bc27df2a38fbddf3bdc000000000000000000000002e47337d86cde7a7eeaa2e5df7aa3ec3717bbd5030a61feac00000000000000007d02f4d05e1e605df0704cc1b568946251fad0199611cd86cb6848880a3883841041809de8091c2eeaa2315be4789c7990986e163675360d74f3c1dc7f48c56612690f03675af5fb85430011c81f64a6419db5f00320304117a75d169df2047d6a044dcd51ebda5e3077eb903dde87ed7f66511dec95f02c7b40bebd9ae48afed6baa5ea036bb1456617db4384b587df43886399c2558e12238a20701051f4582d11c0036c619a85801af0931714009eed8918884e284401000016d3c393e933fdd3c4049b1b55e30657b5eb33850c1e0381e114100000092c1816c80e8e4a08342fd4b2b0e006fcd6cdd8600000011f000248a1180603e0060003d068712398b15142822506b34d10ae3b556838850ce9397082ab000eb44a0042010a1c6407cd48344139b544a0)) <<< 16000) + 0x7108de0df390828bf5d8e78e007b3626012800f2444d6440028f57a519c00880200002c643e4140760ac373dcae2b5d01a287f12da9c600c2c711da773d418200fa48a97bc9620431a9c97d88a20aa21875ef30611ee7d6722ea0800191e0d51e606004d5737db664382400b00d1228316866b8815dff0da621872f38afac4422ae5c6e61600290e27ac100190b65a93001080400004bcc052d8853c510205a3f2514711b0c6d4241051dc34efe4010cea6a80080818fc7898a000ff64e84ce084201000015f21f0030004fc21ee1b0e10907b0480020008788a8004a1c87a92c0a0861e83b0e01983506f04a4cfefdf082992a2ee100442042010918406df6d118228eb4969420a6f6e551a3c1002ef22ecd003387d90d2800384793889004ed44ac6009c40880200002d643b8541d622814000004621c31609367c1e0c3c5c33310006a822ebc3805b1d859300000190412861080424539785fa5438beb6b426d4d2f7145a6dc96800d85e5fc9d2430b964432904873aa049b0219afe5943b3420147a73240da2b7c0e461b7b30c100da700a4c15ec5ec058cee8644004bef7feebbf5df036f2c75973c000da71e36fabd10e4e0cf7fa63277d96012b9c81fb382320862008020080000223230673afb676ad7d7245dba8db2c832e294a08ce75c487d1ab96440e9e1849720da218f00000035c5cacc402de2cf31410e81c1231dfece104859172a67c916d32a0f023041e00800005110002592000c4a43cc3723029568af87846cbe721b0c1063641fda105163817fa1400167e3dde4803e54a24aa1306110040380140500a00016520e80a00091421e43b0f1198780ac3bc170080100448a2659b8089113da93d7020802feb3e240f567d1ba12040f80400003448770683b4361d81b0eb0907504c3a40703840575cfc516e5641a9e90204cd6fda081000000bb02080e1bde211010f170ccc780000006260b84108023c43d7bb190c1afb376a0414bf125049840e0020000270c8c040393f0c60a15a14284039130e3d1dc5090d634c0153befab0a881340613763fc89543c0000005e1a22e5700504cea94a107a0f0889c07e4e5303d57cb98a412deac3d08c10740201c80a0000b420004fc438c374384d642c7943035336229610224d0709408078066296000610bbc14045e5f89404c10400100e20907080806c040002d843a0561ce138200000178b31c30035f52e94186aed26e978630a11fdfed238d081524ca69e04111f6003f8d4800fefe0b5f48000000034bc06002d37d2f005b2004e03099a01e03b580c3589da0fa0684045b2fa094101d50b0101042f13645d2409ddcdfe933001100400004d8c43191c875460e369763630157e3ab923001e0080730080002d487282e49000006e5c711e381f189fb0a2871ecde8ec5cf2e78610ef4017e5438108cc0acefac0208b176cab5eb9100000007b98a03802cb081df3a004003bc38aaa53697c801681838e56399971262dc75de8d098470dfe59aa00806d2f4e6702016fc1ba4a00440100001063438233d515b2092400001a28e0f1c0e1dd87b8071edb6e0845287043ce811b88c104243afc31a530046d4ca452110000000753007002a3eeae62324801400e282d25660ba6a081c73d11f28102ae245c29845a5269d7c800440100000da20005e06438032f8e0690c1336902124200a7f07c890346929fd53202110040390140001e24001d9087184ec80304c549680424726855420a11e877cc1808059ae0b32c110270052a1284118042c812ec426d2c18a6714c630014b379cc08c20800200001524388341c20a0001fe20361a066050006fe900148d21c01a0df0d000b2f10de1d06e808008960801d5c900522121624a0ae1900423410dc050075d090db4d007a8390da418191a81c89600602a2098248ca4708b78c7876284e8be68c5141a026bfd51202441a94f47003452b4c20024c3842010c28299548b860dd00b165630540aabacc20016c1b3f48c00ac8e295650021008614029cb35a306fbbd884b1829d9ab5bf840049cd32aa4002100800006a10d90506c0280a0141ae0a0d60106a8080009b886a0ec34c761a42b0d11186806c33c360941b0ce0986684c33006196039105ba2790d8e20d509bfad1830c72cc4ce18534084826cb00fce27b0b8400d1db82890000c29766bc22000ce5846010930bcd8fef5c12dae15945f50136f7bffc6f65cf25f67242f85e13ef951c7deef9dee00000000000000000000000172ec403f530df3160f3160f530d050c91c918714b10910b01139f57c4fc6254f904021c5de43e7852296fb91c3d4a0711c81406278b61ffd07406bfeb98f604de50c8b40bc5bf9827c5822c739f23c9173cc698c1111b620ff38ed922017b22e5919f1760ee58d3285a2e04023295dd78182815ed8e4680f1e8bebc4c0840010d200385e01cb23d0819bc0b190f680908804a039a9303040b96782e500200080650080004488648483202618e0b0c60186280fcd10349dfee8d1eff7468f9a206901d140d34a2893482433022023c024032080200dd2899e7fb5fe8ca2483c201d520cd2083c201d520c90e252301bde6080a252301bde63e8280160160310040002ae423024186130c205f12417f71f9092192c5a90a183a9e9df13d207044b967be60423679124c80a72b677bb96086f3d07a81c1ef5c16dc45801201fb90020065fecf3620128508c03000040470a000c9dfa4c24d082648e2482527e0ce880a77e9f9043010173c8ba050402a8c46898008802018403e2433b67d8)) <<< 16000) + 0xf3092a555b2e8a203ca9a5832481c3fff570c1c40ffb47d202a83239af030434893b2f28008a8b6190a01088020000326430424180130bf0905f028000d308004239000b2332355ac3db94d365d741845c86e5798b9c08bd4c37cc583cc583d4c341422062051442831031c000a23627859e5804526bf106e58302fc110f00645525236499455d99224ca23b8d0534272fba0d490c4508ef3b21862cc42f312448db4000b9c85e8c8004a7885e0ef0828dca030183634ffad70611b14d6d44807fb63be221024dcb77271c0d0d4174108010fe9ff7800046f8b510888025058420100bb0905d00800072085c98c2e0272200bf3f8b4711d7f01de82063859ed4914202ee3f8408150e76a196500210087184ce1217a488d6435f811c43caf803b881c9fa3428c5090a32ba2a205044829ef18007122c724e004201000015b216e0b0b60581402c0701616a030b401e149f7b0fa04079e31506d1835c16b6ee8808536966a03051ecf9c9038035d72ecf10048cc8296000138e1080400005a485990820c641642a0b1110580682bc3415c1a0ad0500029110ac39055868006f0885520c2a4c6150620722983504c29c2614c120a501e103fc2b016406c936ee363825258b0a86017251cb2000014202000448d56b0fa74739357cbde22179f3915735420950e5f81b9697d44ab2710a974a710a9750213c7e08dfdacaf532159c1c01f905dab1072cc4d7351bfd80000000000000000f95b41ef40eaf2bee4331fc639cdc0a443829ab7af067cf9f260000000000000000000000000000000000000000000000000063817a682f0f302d4c2080c50c704003fa8bc31b2c86f1a03d53ad560715dfd080e05b1e482903df8397cce7c5ff9a1e8e2957fd2d9ed4c09122842057eda25c2dc1c80aa5a8032694c86177cd543837c189d32538c78d8e20460f2426f34db6d78c17275ce1a6f6fb7586a259b3a4165d27a9e8dec4a0ae881fd666efff407bc38007dd327bbb283bd6e850a40d0004141d2428ad443e488040edab4184b66e8ee20810e145b3b4800473d6a644a0842010d240d22c09030cbdf7745a2444fabd05d8c246addc63840843cc255a4a0842010000104343bc04cb971c29ecd67ad0c1e6ff316730054cd4c8309020800200001a8428c34036120a2090508482800408802000390210c4b0852184f8cc2106613c1b0820984e80c200060fe0309c0158f21b7eb5c9f921f16923abe2c427c8cb8ee676e5dd279824081449b268942cf8923e740790604a1a825d808f84881643dba580460c88d34b3ebac7baf39f240df02ddf3cf4b66380d3327100485e379e5ffae8b23f7833805470bd61f1000144c563ed6500020ca99b3e65ecad91144d5fafab28f0f288954e78b21c8d243daf7dc418459a292274d0c336e834d28388b840498d0018182cd82000b09979340002620220087144670f7ab1c5bb2bd4248a2333a5f9c4e00867503f83806aea6848000946084021c5005aebc0438e1d8b92d0142a15c1f09a7080c8f6a770a24819ce5182821208708b00130a11004026c240002a84070440005244268561322b0980984b80c2580738854ba6ea63f8beb4bea255a1cbf03702185ec69c3ca202c8d24d18a1061040cd04804078084776efed0bdf943251d33e712720013a97739b398e0d62bada42e60ea2c59200f9b7e53171326a8c24bd4383c0668621914308b392b263994a60206e4254d723d56b5208047aae1c30a2406dd1a005f8dc41e1f04a5a2001df3c203927af40c02144763ae799fffc240044494a65e8fd42c44a957f407303f07c00017090952900029910009a820968204a3502412811c74001c04425146126830922d84892c2408741883904d0070cb46a6b2660022efd1e21c0567ee701000466cf11384100065302100848a498092aba8c514139e99f701b94778f3f9f0b6aa8575532f9385a24606cae88ccce39d6184addd18a44dd24242f7df79685936bf839e75b1d880d84812ff264786d713bc549a3497550cf905ea608c350ae13946fad2a8ae9ebe16f48000b6e7a98a0504f20c7982d74309c5d18ca82acb1d5bae4d0f2b890d92490ce9873fc7abde989e4195f9aa0c928674aef9233bafb18b8260afbfe10a503c76ec6adb31de69d9a4a07aadcaff4348a564fc1063005b4300f4c84c11a56993afad7f53eece6f1ef5df45e1bb80b284bf4b0c622db0d46e19f3b830682e4468775a88648cf19d7ce11be16b7498224ed8f54b6c1f71fa4705d4e31e0c484f8611e3605b521435b5c91c0436c308bb0d0febbb74de535bc89f03dd79c6cc1faaa7b036ae59231fa1326fefa110ec374300b9a76c4c841078021a040eb46422003a008800008020000088800043108f0901284823807e3713d1af01034a8ec399120858c14069c01c0e0d8404008d01cd10204568daa480130a1000400004cc84686f40bce79e04841078021c24f345cfe700f6ce0a5c4003c010800008020000088800059108c0904582e03bf478398460e0bab6d120e16cad8d4ce6001617094d04002ec385de81288110040000440f8d42e70e5f16080dee3f8a50209d92d55200064336b3c700321dc1f71a0008a4afc8004c284401000013f21142a0003de2000d12422487c58858aeff7468e77bc2778b10b140ec2f634e1e510168e12c5775470a0d1b19c8d17c0194ea0f80000000000000000000000217c2f09f7ca8e3ef77cef72809b7bdffe37b2e792fb394985e6c7f7ae096d70aca2f8b88406206400380000f1f50421cc75e8c5b4567f304b20548efc)) <<< 16000) + 0x55cf40b6b7abb958d284afe2982a9ffefad69fb37c170fc7b620c12322f6206e246cd60ce52bf93e9fbb80685e24203db7c4d544d7653e243a09e524a803f015a50617c93613dc574b33082afca878a78731e35157c89fddf2aebf89c966e0c31be162d1552c19fde40faab68892852b49e500070d211032001757210e3bc0afca311288025667199e2808539fc9341100108ce0840200001864218d610a63084218418ac20826102120800183f80fc7e08dfdacaf532159c1c01f905dab1072cc4d7351bfd80000000000000000fa513876350bc0bf2f83f6a2cec570fa659050ca1c710408d00600000000dcd9a3b49dbe6ebcc33413888dc92c49440eb089a6f2a127e79ee7f0f56eb64575e710252e5e9688b8bc81d154f56e84620ce2c2c020040100c20380400802306d8c1a5a1800039766b088207c0200000f240002d883e88e85ec38ba4f046aa18c980b76cd1620018c983c12040d804018407410d9e05c118083ee10701e0006d426c8404b4b0a098120610004000035c82f04c000770c000040112082d9bb840c1f05e5c2a600040e93e01010da31e3c8003e0100000cd20fc0ba16207a03140063e56c08003542a023081b00800004c907d0df85e1f2bc9a1508cfd64005f8b6311820d004342079e4126482031ee098306e75928a82022b54f1324041f0080000679b046a2f1e22834edff4614009af39b846103a0100000a020bc1300024f203622000467302b1f5d6d1282b1194cca2849a406ac8901b04f307000120e0f804000036c800446107c2580d8cc0f0660f60bd12e21522e583e23b7352c08f64ebf8e04abd571024081d0084010040100ec0300003720f41b01b0d81402c1e415c2cacba5399808376fdcfa20238668fc1e000de6945a0482040010f1b29cdc18684c79c090242cc03886a11860e80424297bbf344f03404e03a0220c1e00800003d9000138345e36bfe7238200d642d2900100023820d2e73f38087802cc4800740100000e241e0160ee0b0760583a80800055c80208c000ecce12d25645f1409762e5151002200e5048013181f00450848200cfa308041ef21c50243ce13004825f713fcc2813d43bba200128c10004000042483a048000794d02f6fb2a70704b605976940415d9676000063241f00800005a1073210390481c40400109641c0860de03e2c42c5677bc277bfdd1a3c58858a076399bec366f3d3f755172efbd51f61b8bddea818530ff5600000000000000003e944e1d8d42f02fea437b1a43da333cb41c1442c81010c138004000f0b1972ca30ec5301def536dcac60f701ed5cee1ef7537a1789299ea30831b72b1a3d39105b9bdb46186781e9e1802936e2d042e74f497d08eec512b1a328c819cd68414d362d71033c2436bc202191605e414248773d27102851255b92c00b801185009840800200dc02c2c0c8cc34a80b97b4e3fa2850032648e9218f28deab860172b4246a01288108042c520bf206c14412ffc5e924316ec44591835e87a6c4143b471f4dc0094408002000020a40008a88001c5906d1d81908c1b0460d62306a0583482c000176380fb6f95c614639654e210303d6000f3400943813512021080401a0040c8020630171a042636873070e421920a228da8e4a14c14085bbfe2185e22eae6c2003649c1b601306108043880408825d1c300fcebd0c40f49c600fc68428d2575c0c069642c4784a1042010f1c2096771c70e08cca93b144f68f906a940125af61a490108402144e24e641038360eeda5020209ca8e0b200206526cb24042000800006910001c420005ca40010d483386c198378519866c3d8c1023e25a204074aeda53c118410804019406036030640103180a43995ab7c4078e061b40e718288585806e48412f51d428a14954fce22780033c25741000cb6f9148004e2844010d200eb162f65902bc03428183d22cb7ee1a107b0131d080013f9f49012841080438ca4190fcc307de21e3ba6845d80bf1a70007ba3ce4680225c98c8181e009e4ae13041000400004b083102c184040004ee400100080028d106021d898be25624c08d4754b29610a26d9bf3c1b49c2d5450037bab7c094107c0200be03c17dd00c973826812fd00d04814529430153855a6460461783db2a083c008c159c4f4b19a18366b1ca3828898e1e66029ffae2d06064760f4e9a00069924f240507c035a4e083e01000015020004be406c260bc1205d016980135b7de58c16aa38005896d0d82ce604642a8c9640049ed8eea380a1b8e74201308100042466310d13860b5f4d5130d0ca9ce3e9981896daa712837d807b9860593bfc591098307c0212302bd8ed7182c50f76860c2a53155b79a19176743d1201c728e5f0a015f2484d80035fc40cf0138610004000056c80014f902805000200105c0902d80800203482d0ae891ea665fa1c19cefc901080c1c92f45c2847be5c185201313895cd0408339e0548b02d6a3d260000004e584201000017220505205901000a671a1c0352238900a136096e0a09c4b94c50c00e98af8104067dc5def0203892b6a2a0004c40400100580982b828158160aa0b00005c626d8782ec4904f5470a0cc70962bc07e94cce45ea280b930bcd8fef5c12dae15945f50136f7bffc6f65cf25f67242f85e13ef951c7deef9dee00000000000000000000000170cb18610604e0101509d819edfa52be30a967cbf479edf328bf4e7cce9e95b656744e1d67c5f42ebe211f501138a402a810ff71687987e2b8a3448dbdc6c20f40f529ce185bd1245a1441378b3cedb220849af)) <<< 16000) + 0x065f27d8e942dd8e6421c2507e043e48cb3feafcdbf57fd5158da9b7cb264bd97febc182f79c04e8dcfc182e2fddea2baf493cdab5bc378978b07a986e197590a83d8810b48503a0a80be3430ac087051060c3310634636ee1a858408ce6ae19880122682e54081c93e575b0098408402103c0b8b26693c8143bfa5d0e1c11573f773c2026322f383060f53890e280552b6ba1c2608220086120de55d263c802207b0998424a196460c1ce28e03a21831a109b58094208402000020c607828c9580a790199053b4281eb429518e7820fdb2e538c08f215db50500d1feb05f04c1044010c257940874c79005cb06aa3080ede0872081c316e9c70c04b0ceb05e30249b24ae709820840200002664000a2080027f19149b3e7af824401a0b3f306043f3cf9711411963b5c98402385633280025142200800008890531982906e45b9fe6722244bfd1e5f73010b5a43e924100b988d20c13c6afd104250c2000848e2f3469c324628507e5e1828dc123020912364ad2c41825acad8002001286ef4b880197cb1f1009c30840200002c44144240a00204f01027008000b5082686c0c825650d2cdc0b8e2a38cd2938e1d41408520e173b45ab99807eeec40492003f7cd1c00023c4ca9a0000013961000400005ac800622900137b20982a00154c20065de412d140946a0493102414811c6408c1a00489e20507203705003185180cb82051ab371655ec44e20633dc96b3d30c1691a171c16a2104e3e1dfe79139608084116ffdfea99262e4dc602b27d52e944553544a3e280ce5162c00dac47cc05e45400249820a9c4896bb56420017fedd02f50c4978c8eab9d718630198e1342c10e5f7032c9c6031c741845c84c50861ba08b8b10b159def09deff7468f16216281db3033663a8002cdea86680cdc59d13608e4ed05a1f026197c2342440c21c010008041e7ff78288798a7d76b68267dc34554d6e63fe0f01dea387ef24998513004fb4461a13a11ace8edc4b6a43735fca99c6c1375178bdd041d4938cc9a08a0b04405db4f68959ab18335484d202b1ccdf61b379e9fbaa8b977dea8fb0dc5eef540c2987fab00000000000000001f15438b67caebca442564882a872fc0dcb4bea255ba98fe2f938854ba610a1428c096008000021555654e788cc9831fa5032965734fd98e41f9fc86f6c9351c8e2652a424fc3242a9327c0015d967a57a2c3f7837ed7b409cb4a44f8f6ce4cd6479b5e29af3c909569c45c45291a3f6c030040100861b0420582080e0414a368518012138884102f6150e708c20780200801303f01e0345d5c0301d1be8e2001800840000401000004440f81761347ee4d0b0670b57403830c6204b1c0b4351aa92020e80438342e136a44107001000009240004ac81902800085481e828000c40c050040100782203b09000026103a0d01c86800107480048810380501b8080035dc81b1e80d4c4068620332d01914c0c4940604201b210178e80b82405a1202c050008d2900910b20164ae7d8e652a378ae2cfc35b1933cfd20d8f0de4d465b7d2cff464c000000000000000000000000000000000000000000000000000ca2308206384304284202180820da20feb70d9a2685d5f4cba99d0999d1ea31a569e4399c99776ac97e832c224ac23865707520455f8c6086ad22c54b4cfc31cddb73deb9dd54734ec33ee103a75351b8438454b41663c8182b8fa4f6e760a10dfe974de78404e054c1982c2003830058eb80401639ba9344000013815933f207b7e8712fc22ec7342901c00010210282571593b23a43161c3efab469ae2860c000003a98020218bd43a3ef420a606368305418019821009c0c4009d5dbc185004668da8c821c870c2a02071488a0fcbcc80c21cbee06070edf4a1abd460c0000025802083ea137188100921f23990198309002000028c40ac46054230291181404c09c2604c130250981204e061776b72e6204c2840eb0210204397ea1c240154fde1b91c00172f702618004397e0bc009840900214400000bc799630cac80ffe1434dec8ff7e86184093c35a0c0000004ee1020000002bc8cc0048010b20205f11327944207809067c2c60277f6d0c258a09dfa3d9e430d41359e5fe14067c4b2a494100000000bb814700270140000c49b18656501de8a1a6f62acd7030c49713ef608040000534a86000000277083000000bc796600240085900e136b92e9b144195dc70d113a58c07474f16cfb061a6f868a00bac50135b837efeaf920000000493e0008004da2770cb67d07002e02c0000e0100031c204612022010003231021158100ac07c5603c0b910297487bbd204fa273f91b8710d2e03e5ec1819365d78d44600d2e03882c0028a284c028b281d053484cb2000000af24a2000003d660b186563e7288a1a6f64e24306000000277099810900216403b0366bc8a210c3e5e38458c065e9b14a0c33d14846188a0832f45e118a0335a77f2044800000017702b821280600005ec80e84c07017440000087af9630cac872ba1434dec8f074901800001141861840916d9e0c000000525c84c1048010b2018b287914621714418c59462c2d3572c605a65e856320621867a881c677e0990a025b3848223af7592000000047868c000c003c43886e872be1e8480e106e0a000020c2036120003812000d3e406834032120180900041090170100b00800419080a96805064002904404d040247a0113500818803c9401c3a00d190060a802c440141a0090d00404801c0400c02001be2200ada0044900190800844002020000100f2899)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 39 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase1" = "QuadFullTwelveCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 39 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase1 private def zz2306:"s0902"="s0902":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase2 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l16 l22 l27 l29 l33 l35 l37 l51 l6 l62 l65) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x20c5cf7b86, -0x59682eb50, -0x62ae81e3e,0x1f21b98b8], ![-0x59682eb50, -0x29b1953b42,0x10414b2c34, -0x63ba9ef5e], ![-0x62ae81e3e,0x10414b2c34, -0x30b51ae2a5,0xa94348484], ![0x1f21b98b8, -0x63ba9ef5e,0xa94348484, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x1c163d9e,l6),(0x628e17bf,l11),(0x100dfe92c,l10),(-0x5baf140e,l16),(0x16ebc4dd4,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x446b12582,l62),(0x530498ac,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x446b12582,l62),(0x100dfe92c,l10),(0x16ebc4dd4,l22),(0x628e17bf,l11),(0x530498ac,l65),(-0x5baf140e,l16),(-0x1c163d9e,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x9c062008000000221e029804000250982402d003000000003c0124018001585221024400c00a62282600c2008000014848004cc0400000000580124018000000036009200c00003502200a180800001a8210058c04000000c81603860180000006424073008000000002c029004000021c7b01a0c040000010c760286018020c770a006840100000001e0e051804000002282c02cc0305088c0c201e6802800000022001320100000000008819003220c3041014d9006000000000700a40100000002600132010000000000981900362103041014d900600000003400264020000000000d0320040000268240189809420a404200335006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x921badfce7e1772076eb92392896be48bcb2b9897285a7678d5f0cfba57d9840b5f134e0ebef2b015b8910944b5f245e595cc4b8a01b10a30bd68c46cbe1040a46adfe39bf603d68a9da38e20453842384c287accf706ba48e15dd798eca0b5c3d5ccd12117006ff821c001678bdd418016f233c3a60023008493f1eeed51543080000000bd012403e00181138a14259acef6ce508168f4a98d93030572185bcb12182ef5f15708a084b237a041450023e56459ace900290100001001823943958169c40e0fc9dd84042c60078f193ce123047a0c72b70b084eb31ba81840458136e4b1a2413036e9fa64140010f1f8f98080067dd4b715ed2410a405000040640015d081104f0d1c88879c30122816bd37b86e4880d332855188e2063ad81631030808db7127080e0812a6ff65201800b1c4eeaae020011bffead780000f2872afca00c2440a80500004226870c9969e1016cf7e71a24225af802030fe2f990d933959fba0c7aadbd6966b4000000000000000002210e29018c18c10800202c669123d59aa05161f8fc3208191b8777a63547063c1d118974df231ac0b4e34b22743a83ed68313a64ad54eae6c5503049474457d0705ca683cb77caafc7f62e94f75a84830a5f9494000fa0e48e18f1867735939b3b9aca00081d41f4b) <<< 16000) + 0xd657b5ad797e305f707d3577e8f70d5d90630634ee8a000000000000000000000000000000000000000000000000000651d6185d86cf02d08d066b397e1e97121b0c1541c31031c2102041043f72d2847cc401a0d4656aa4abf9d98ebec7a2ba7a74655d6bc24ff31b9eb53ea2b8dc6463099b63d9fbcb938e30a4135c03c88ae782319cf581e53518fc3728002741cf7e71a24225af802030fe2f990d933959fba0c7aadbd6966b4000000000000000002208c10c08808608c00a0080021ed830f633086e8b5712c2dc1336bf1485b639e690ddc719043a00048e4084340400a01f0170a27091344dc3043a04cb11241420b480b53cf10005a40571a78700f8e28703062800b480b794f41528ad06c90fb5185580a37c617c6b1583081480c207af4e5e7acc142884990be26112450c111c09a8649861962223992d2c182044c5a83383c3020492d4ad9908106f6d736f4f7a0800f2178b76dbc080058da7b9fd698a09002f0345966900629318623027a22922c58eb917871013f14c8c288c049fa1c0823763ca85d8008401000025c4078170281a150fe3838e28ddccb742c10c2c4d39a0158f9021b0d04f82300820a10287621210139aae6ca1780611f1689a6f550a002caea66742040009cdab80c07509002c02c61838346b80212463bab8f95a58d1ad628f529828750059f7630a61cf2281a922134ab44f024871eb24ef2d0a08b36434dba00025d5c48b752400980500003cc72470c78c33b9ac9cd9dcd6500040240e58c30c58a50a2884041839d3ee0729c08c6a3ef8b866175ade04fe9c13099960118045a00033a400176cf1956d776767d028619f6bed86931033faf37417768c11d1a9cfd103020849f878f8d00282371fadb55ed1010e25b1a37cf860030b6c9cef68003a24beb85489c02400b40b003c0301d01e1700b515596a1024e3bfbf27601049858b4ebc503868ff71263f30809362301aae28c103d9635be0b14025a62155ff81800a6835198d02005219c287e65a09002b02c618979a8d1ded350a00b217997e5916dc9446963676fee3590880133286355df61e5634bc2050290e249e613be738070403077e8af2450c877359401800fc1d00003fc72470c78c33b9ac9cd9dcd65000403a23b62d2e40591438c31629228a20618414a1ecf4a06735e708e1613dc1c6aa2b0b3b89ea5ba9008f3ae08de28d0001e22000c5c400227480092598184039f500d186000000e100816f7521e7a01c50280aa31186145d652c5781c312fc5e5bf080b04ce4dfe71c14cc80938e82002eb29676cd2004c0189242c4dafdc4081923b0a91da0815cfdf4e3cec614000001c20080fd81874793470c55f41d84207080000070800404281c9a92e080180231313231200500280001f83c500a923b46d1c42e5cedbbee1443465c94dce10418ec9809030c31d6b7ca0d11c18076481f7d1819d315c634a1403465c8d3ee1000e20ab7dae75208500280001f920380201b0100d00800192880c8cc0606602e2b01615e7bf38d12112d7c010187f17cc86c99cacfdd063d56deb4b35a00000000000000000110ae8a04f5d040b21430822001c0140080472d78d1fd13b29a5801fe7890fb6b4a6d32713833243c8653c6a4898be144c504a7608ab61776b1be31ec1fc286ebd617200b594ea73b0f6f0e5ea17077a89289318e602624e8b0e6194b40540543864cb4f080b67bf38d12112d7c010187f17cc86c99cacfdd063d56deb4b35a0000000000000000011075861761b3c0b2ba2813d74102d0610b007004003039e1f2b4c3c2ddc3b2ef39dcef78fee9bcc1bea9aaa1e95a433ee1d4c81150664b58bfcb7c10cee254980e664c5542c94b24f04501614537cc3b0040100400a02c04c160240bc009aa268f20014f356de928442044010000084200020073df9c6890896be0080c3f8be64364ce567ee831eab6f5a59ad00000000000000000088b2df45eb7468a032a03f124b2da786f309cf84a233d0272ee3c00000000000000000223a83e97acaf6b5af2fc60bee0fa6aefd1ee1abb20c60c69dd14000000000000000000000000000000000000000000000000000ca84683359cbf0f4b890d860aa0e08c00600400202f1b6f6929df616075aec8f323caf82202efb255342bb9a6f58bab1ab4e2ff8ee165634a68d5718389bbb7298d42fadd92bf016df669838acb8d7109ce07083271581791f1999ee3e595f503192b4c37865ceb76ab34999f7930f6477dabd27ca5198a5b68003c99c2b67ca2d0aab11cfa4ef432c87a1d079bfddbab9d690a502d081be68084bd2af9515bca51a5a33855ed23ddffd06a4eb25193261afd124013c31df4491683f4948c0ba5f721721b97a92a18f38b75303304ecd90855bbc85861330fce1e960199687d76637d657449a8ceba3fa10000d4e365f2cc3f945a094520dc0ecb9fe9ea08dfa6806d762ac41be3a7d745279a6d054ee9c07df055316641bf2906c005715121731449f698f7f049f88fbe86c87b05a44eac24a6c9ea235a332d66978dddab97b20f12d387cb9e9a5bad6966cfb606cd077f380578811ac04d219c6c0d446cbb1b60b3b38a956d044e3465e5db7bf2a7433af23e1f3c3549712b4628966b37f6e8e3e836eeac5b45f30408651d5aa8f837123416fc514194054d9745de1e6d1d53a902a4718a27503008c35d8d8ba1212b41b4beffd2192fe9b63307ca480718ed5b1600028c8800b6f19648c0e7a94cd3660a6b99b57b5d5f7837398dec8d7db0f9c1ab400000000000000000047596fa2f5ba34501)) <<< 16000) + 0x9501f892596d3c37984e7c25119e8139771e0000000000000000011126b10c2fc576cefd9e8652dffc8381ecc4f17d7ca84b9372c60000000000000000000000000000000000000000000000000006531860c31011c01805408099ceb1674b0fd6e16a50c38ac2a762fb36d920e8084360de3259d9068cb3d52100891aa959534daec4e3f73166ce5168d93db1fac1405f81d86517493476269a40d32ffe2490541b4652103514f2b2a429a9750110100036e90021fb2007a3464639b343aee0436d281228538cec5da90ffdac817abcbb171e5b27710208080c9ad300602bbe082d2f9c5ea6f4f7a230c09ac42c9c3a6821450500424aa8454dc79e0218024cacf9f87a79a50073f5be59f6284bfdbef1bef2011041f126b10c2fc576cefd9e8652dffc8381ecc4f17d7ca84b9372c6000000000000000000000000000000000000000000000000000651246186205185082181200a2eb8205003400088c80704c0401601a0bea0fa5eb2bdad6bcbf182fb83e9abbf47b86aec831831a77450000000000000000000000000000000000000000000000000003288e20a10208600201c83202aabedef04249aa3d982cbd3b1a735037e13752e156c2ceb50c6eaba4e420028025b412f29f297acde175e9d914e300bc1d10b8651fc7cfd2f579bddea6922f2b480a8d55443f0151ac1315843fb5e6eb7c2d2e1630287238551137634c147d3c11ceff01baf5bd241d7aecf6141118cd652a21de68d00f010002dc9816184f64d38b0104033478a5bde890c1ebc3c182eb203159d2f429d8c60c0668f14b7bd08103186ec9fbe05002013c50d2a00c0102a59d29e74200136ad18ba6009494b26e2826522420b80c1440000005d6049007d38498d9236adb39dbaa388000000e1014183318105a0184125bb5f20120a1cc3eb5d63802eb29595c0000000e5964021300828a2102349c1f1231c827f501d8a100000016e304887beb0364b81c40000005460141036c1828e44308000001f110483223492f1e700000000012c0122410a407000040a4000fec80706c03417d41f4bd657b5ad797e305f707d3577e8f70d5d90630634ee8a0000000000000000000000000000000000000000000000000006511c42021c21421000c04df4c1847b90eb46293a6e46f7ba5f41380dbd38351778fb3216388807940f968a710d41798ababee04682d58c0e951c397e216a0972862018e9b23216fd04edc8fd6ac8c3da4d5a61be23b02871f671cda3e7245610e932a80600800130c8005c2900b017507d2f595ed6b5e5f8c17dc1f4d5dfa3dc3576418c18d3ba280000000000000000000000000000000000000000000000000019475861761b3c0b21c30c21401000c05036e9ad7f1d65c0d2374eba9e373e7270d0f36fc049be6c3a3a056bcebb2bcb484d72cf7cdb12cb8af8961e4a29068527136e6e25b34d2d0376458389c6070deb89669db72c26d406df6ad607694e9ef35b560e0946ed1a100e137bf2bf237d1cea9249f5eea35595f93c096a06f58888fdf3393328d0480769ad3eaa328e801bf70c91ff8d75828befe4529504084122f2f7a08204a7e73300007ee21bd74a0128c1200432470c78c33b9ac9cd9dcd6500040ea0fa5eb2bdad6bcbf182fb83e9abbf47b86aec831831a774500000000000000000000000000000000000000000000000000032ae81efa3c7c9aff931d2fde4f86014d3d145bf152216d0a5d00000000000000000000000000000000000000000000000000c4648e50c40a38a30a180c0c693c764b256e717436293d328f7b3f1ef7a54992fad34aed88e934a90dd9ff576dc715f72e5d45fb0bba8e3ab360644070ac9cc4ec12cb74f6f3ae297fc6a3bb71b12ab04902056870c9969e1016ea0fa5eb2bdad6bcbf182fb83e9abbf47b86aec831831a7745000000000000000000000000000000000000000000000000000328eb0c2ec367816638c40a28a586302201cb774b64b824ecf48c5d3bd1a6506e8976f670d921c9a2f600eec34b8f1d1881c12e81cf5ac73e46ebed3049a5fe200686ae6b29b18fa2ed9ad28bcd18a5834658143cf2bd41f4bd657b5ad797e305f707d3577e8f70d5d90630634ee8a0000000000000000000000000000000000000000000000000006512cb2492461c61452c318118014032080200d0002312000d8a4028360120bc91c31e30cee6b273677359400101f9232b6d4eb3c6dee81c9a43f6d3d40e0f87d80e38f7b08f5f0000000000000000000000000000000000000000000000000000cc9ede7217d0f6d620415e021f132438ae6fa60713812e45d0000000000000000000000000000000000000000000000002f99028a20820608c00a02c48067377b05e1758ec4958610aa702be5b855cd32b9da95f89f3179e78c51a3929b6d8d33c7d9c5d216b3f38a9e9927a1767667ebba79a2057cc876bfecee76b0f36611173e28040080018c88009c590014c220035fc70de129d5c5018467fccc1470e1000000258060a22c8be4042840000009600c101b9da8e58a006bfa35f083000c90a7c5ad0084a010c36fa92d4e7228c20d3e4ef7ff78e10000000ea600c121c3de2e2188a10000000ea600c006c6d82f2bc8000000000ea60000000253e6591c10b00700003b6401c2600c0ba1bf04e569c970820000002a300302027622fe97c506bb89e11dfe0808000002f76014073023312c1e18002762240bfc0005a0033174e2027623e42561a28102b02000010890050d00200800c040040200064a20020200001001c4b9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 14 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase2" = "QuadFullTwelveCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 14 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase2 private def zz2307:"s0903"="s0903":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l21 l22 l23 l27 l29 l31 l33 l35 l37 l44 l51 l6 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2c89a682c, -0x591343db8,0x859ce38e8,0x1650], ![-0x591343db8, -0x2232849eca,0xdd7c53be0, -0x61f1ed124], ![0x859ce38e8,0xdd7c53be0, -0x30929b7a49,0xa8ee5d6ec], ![0x1650, -0x61f1ed124,0xa8ee5d6ec, -0x2c89a2134]] noncomputable def hinges:Hinges:=[(-0x1c163d9e,l6),(0x628e17bf,l11),(0x100dfe92c,l10),(0x31bdb6434,l14),(0x19b533256,l13),(0x22c,l17),(-0x15caa9ee,l16),(0xcb8de20,l15),(0xfa362b44,l21),(-0x428605632,l20),(-0x2148ccee,l23),(0x1e07ed1d0,l22),(-0x2c89a2134,l27),(0x2c89a2134,l29),(-0x1a9f7982,l31),(0x2c89a2134,l33),(-0x2c89a2134,l35),(0x2c89a2134,l37),(-0x90c,l44),(0x2c89a2134,l51),(0x8e4,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c89a2134,l27),(0x2c89a2134,l29),(0x2c89a2134,l33),(-0x2c89a2134,l35),(0x2c89a2134,l37),(0x2c89a2134,l51),(0x31bdb6434,l14),(-0x428605632,l20),(0xfa362b44,l21),(0x1e07ed1d0,l22),(0x100dfe92c,l10),(0x19b533256,l13),(0x628e17bf,l11),(-0x2148ccee,l23),(-0x1a9f7982,l31),(-0x1c163d9e,l6),(-0x15caa9ee,l16),(0xcb8de20,l15),(0x8e4,l64),(-0x90c,l44),(0x22c,l17)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x688ab024e30140001422040648c050000065148097301000001b4510238c040000005221036300c00014a2140348c0500000003c1c0a3008000001116140d00100000000009032004000000016140cc01000000098240530080000000d0a014c0200000000005032004000000026140cc01000000094280930080000000021038802000000000880520080000002306018c0200000008418063008007218c52032d00470860c50805e14018000000098004c80400000000013032004000001c86409cc03000000000380520080000000029038802000000000a805200800000002a0c0cc010000000000d0320040000000000c0c8010000000b8340530080000000001c0c80100000000b870330040000000b8004c8040000000b4380930080000000005c0c801000000000940e2008000000002601480200000009c180630080000002506018c020000006221024300c0000184410230c040000b4421c016400c0000184410130c04000006511408c30100000000a8004c8040000000001503200400430a011014d004000003104408c3010000000c824090c03000000000940620080000000044030803000000001500c200c000000088004c804000000000110320040000001b09014c020000006211027300c000001984c0bcc0300134230480324010005c0a01c01750040000000026009200c0000001109018c02000000001c009200c0000000012014802,0x1e009200c000000252101cc020384688b200d2401400000188b40d8c0300144480e4039401000001504500e4c04000003505404c3010000000002c034803000000000c01d200c0000001d1901cc020000000847407300800000108740d8c0300000000098072008000000001902c8020000034094039301000000000d402c803000000002c009200c00000000d802480300006804100263014000001a044038c03000006a084016301000001a8110050c0400000006824063008000001b84402cc03000000640b01c300c000000190901cc02001504d0dc04a40100a61221b4032900502b049861018a40140a812a1a4042900500164480c809540100000000002c0c8010014c32088039401000000000160148020000007231034300c0000001916024c020000000005409200800000188ac088c03000000622d032300c0000184550208c04000000005d00a200c000000002d018802000000000bc062008000002f8c8070c03000000000b40e2008000000002e0148028605344340aa440180000000d09028c02000002105003c30100000000005018802000000220a00c300c000002590c050c03000009722c068301000000249040d0c03000000009910330040002b24b40448c0500000000024072008000003390c054c0300000cd20803530100000304890194c0400000c921804530100000310860254c0400006b8a5018e30140001b62bc0438c05,0x1340288030000000009c0620080000120110058c040000000443c053008000001282402cc03000004e0440163010000250982402d003], #[]⟩ def dynamicCode : Nat := (((((((0xe3615ba895128656285744eeb4c4e765440a191bec5ea2b53c71489b0fb853adce8e1ad198f1e2a6fb2281054f930324aaf63004d19be6d1934845004ab445f5eff5e81e848080c370545116da4b2133e40e4ba843eaf248c37d0d85c9840c498abd4fd440800b56c6d0a4825c733ea57230008ee07c85410004d9b09170148082801451103cd7b26682c700000017a01038cfd79fb38081867ebc8fda040800000460382c20768e61ac4841037b4a5d7d8904e8e032caa44802649465c8a0e4841480a00008148001f410861180684c214260360b01a05c0d4eeaca82e9061411aed44094922013f1d7d4ba1c4135884c50743083db2a1a644c608000008e872120a52631603f20c01a6d9d81dc40000902f8e06f00001e5248560380002273abd89fd6f026a0809db5ca73031cb803ebbd00eb3bc0543b6e56581a816638a28840628218010000a50716986fec443288437e9dca162d50f822b4ff7cce4069777ba3e759f26287f19a8001291f16f2b69fd5cde3293c782c9823d3c3b0ba72f9a0616600000000000000003d6156875a54cdfc195855a1d6600000000084ce703334a440b68fde13ebd9518f2c2f56ad2568d38107d070c40c708508408004031291d74a0f965727ba7724dde54fdd61e7536ea23ca9ba38a27397e5e426e1c121e0cfb4b5b4610ffaf1b67a8ad390dee8b54fc320d7f05407c3f80e05bd9be4dcba072968e9f94001358f92c6040d3b4b385b00c704d5a077dcce14c5e41108aed00000000000000000f8450c6086044043046005004001000070600200d00019f2108230831104106c204261000a07f017101fc9cdb1a38506099529d1826b00eb7680a1000002178050400000f3e4300000003258140000003b0d2043115e8fa83cc3ef00b0671c2500c02f00b0a12c73652a3c80de202f445658e1c45aa4705e60c203f4c25421c3034489916ec709001224fbdd290c05122690bedc10000e594a325e81921affda5880f040e1581238c5db76845eec48a86c1c1b93c028b315e7511a1868825d203a7a604082257adeb494302609b02f304a20207aa2c8ccbe30022b8161cf4a2000a74ef9b90f442400b00b00fc03d28241a8e391d4e9c32418493993ee98013c85db33079c343ff1578b35411a68c120d4736a7516bbca070c49d6d9ee6a72ec23c160be41d7ad7437c4eae8340000000045971af9b406f58153021c111c2500005166e6c89a12f8ed88b4f33b622e30042261861238e60c58c30a28220208019080100680008590780583b80f460290f98bc449182bf064b6b41c652328a11fbcd1416ee59d0372453f11e1d9de051637b7c07ddc24428dea089bcc60037b1d3f3ae080088b8ca7d2a892005404807e01e13be38b5cd072894cbe87d745183d1d3a1dacd0b1d0897a0011c68c05ed6c5c591c6314b4ae34214088a717cdfe8900123f2a602a6440214810000074482380eca1f597491f0070e143d7d81dc891c1f437a4d18903bb1e31688912864a29c6dd30030db2fdc732ae091417cae28b2210293488b1de3c1c00ddb00bea99b0480158142e6c89a12f8ed88b4f33b622e300424421083dbac803fa3a1760a91c71a51249a41841c390394060000401a0002b2787137485d57d850e05e9310d3ec81dc625c34ce69432ceb4093140186ecc6c9f55f048a16907f02b00814b5e0c92e500e0070a38da4cc1400370175a9c1b04801581434a9bb0f8ec08339275c24905aea52aadaf7657a348a7c68e6fe1255653530863b2001472c69f5312070885f445174b6b05b242034ed870eb30d549020002d7516c5d1923ac9859ce7ec0e0088118000272200094a41f4260010c241f01600196a7888213b0cc7c30510a7f0bb9ced88e1a7ef0c874af60c3be3c0b79a9a0304049f6eaefe205086b8f6881c438c0935a0cba376c10003b66170493) <<< 16000) + 0xc1000355891cf15a4609002f03850f855768287076ed2cc186008203817cc1038651428d935e8ba775f507b4914cec629be2bb3e1f522880186070989074415318112f61f207d518dce80a00020809620c09b01c616739fb03802284600009e483d82c03c040f40300e0103c8080014f0800c299001a86304000006385080244dc345b31571a4076a8d6e5a5ef870d4074cec0691881b871ef4927d90c3314a7f109c3c483b33f2a607944400000011a64800400629d81580d7ca84801781a01d80764000000537f0143c24d2adde9f12255b98af029e8a1abe36331a8b0411d37d8c4aac120b91c90f930b9600000000177014012a90839f318601c932e32c1f92c48216014000088cc8f3ded17555c9194bfcd91600e30000004b00186201bfc04004879cff24768480ce151fa08c0e11c2a3e1518241541aef14b6080a7a9e65b00612104e0280001f320f00b07701c10000013a88080f2488864e68e18aeeede8a41434bd2bf9eb8206842f2f3c4c6087da62f9448a11f023e6067102859cd28120200000006f90292004e02807601d113cb30a89002875935b2dd488c300000035700a17e8d8924a464895033bbc0c81820c1c0822da0e00000001c200300a98fbeb9500800da4aebb78244821480e000081482380e4900000b0ec8024495c535b8e362046de6aede00014496dbba9f14a2432db785ba4ca1c30eadf465e771835a6dd554b491436898e716f76140000003ec100b42400b00a00ea03b21b7b14fd47dc71c0000012ed00b1a3391e2e2114a15eddddb231606102a057a52b0070c3464115adf0c000000009f600b0049fcf384920400a49f486c520cc482160120000888c9200001f740913824d0ad69024e26e2c00144cafc4c0064863e5786c3870c997e132f0c1b78eaaeba143b69bf3d3428000000b2829002300803a80ec8b81b5f20568e380000035700b19f5ec13fd6650b90d6affde018420b540ad780e18a6759d0f9070809142c9f88600000000708010042ce727210122410a407000040a4000ff480044590740580067a1e310dcee18d4030c000008d8a01028b857d96e1a3880d72479090101d38096774e638484f7835e60020baa694de940100000003234002010b39bd3b4122400a80700e6038178087b68067921800000140a01c33666efec24a405d5ce4a23098708000007e90008082e4ca4017b041813fa2fbe384009006e9a22f8500000000a8c01b12085604000021820e402071018118081c00400094e41bc040dc020018c520da5306c2183590c1a8860d2430682183390c19867275d8e7e0c95d70538173c01f8f4a68c000000000002b60a9481506f80b30000000549f8cc1ecf75a9f5a5e6a1f11ecdad7787777a77e25c5f6737800000000000000000000000000000000000000000000000000642efea04480002cb74afde67410f4280000015520514414114039491af5c8df92e3c4f202c316bee8377f3e56928bf1f36a6905006164eb5dc6aa357c74cd5360a0fa49062b12000b2b0933e480ef0421130435075e3dbbf818b08eafe5759b66d3abc09bf4b93324d5a90534635bbeb6f30d95085915aa0ca230641183188c188460c2230600502f8281780564e42403bb80e280cfc583b92204c21c8cc921a1304412c8a00377317ca01286120043090ded0b34c48ac063705b490e584b457384101e4ae6e80240c23008000071905d09e2cdb86ccfb7b24809d150548842107b759007f4742ec1522c8288204202180140000008018ecf57ab803d90b58cf3e90b47144709e8000d6105c1982d88c168460b2230580de2cdb86ccfb7b24809d15055ae812873cccf7a30a0694156af082ff05edfdae8f4b5054cb24c1091090c1043002a071f2ea65c321e78fad9fe1b5f18357cb7cd571baab29046ff1fb9902abc8306448e16c90022a888648963ec1338490ec84ba506120002873b3d4240c2300800007190571182b04c154260a8130530982904f04002eaee904893ddd08ed0c0c09c9de43121ddad32d1d1811a530961e082d82c58f9001498708c0200a203b26818c21cb124048884c1d2445b8e9ddca4874cf4fbd4c104478e11300a00159391af005198808c0200002964140040005b24001bd482786c1381609a03b20016ade101020b182a83f1c009075750200162b9407d801440090d08c021a285ca28c4142a390d9789a087c80f07140ff5ef09680048304001004c0982584c1282609213b280b1abe76961005a61be42010f7aa2f7e0832550a35f001490708c02009003b1c0419c0fe70a049b7f4e0c332173d17020d196b3fb460014df53ee00a352021004000088902201000120904709c0700401008c1b0450d82206c10c360841b00008b200089060800ce649f8908090c916802006516a095000ba82ff3e000b20c118040104060800303f0181f0080f4060780303b0101d00800064080038290012c936b8520c27b1e1a94d70930339b62266fb1d205bce48443900000000000000000400be6e3c8c4797a1b0282d61e867e0e8e4f17f20867c31ca00000000000000000000000000000000000000000000000178861070c40c30c600500114489d8c0fe6a9915b2616ee15503de2df5a809bde7c3a3dbb21b57973c2ed0ebefe611f5b6b1190429141a041c1ba1f0c98047782af4336680f492ffeaf8844a30db36def254b0edadbfa9983c114236ad04b20a725b40e404000b504007ecc802aee18140000190038890d83c6a1430000048488180000c8e050800008df8203189d34d6100aaefc876802ce30)) <<< 16000) + 0x420100300181780c0e00606e0203601c8c4ad92c469028000056a038a00000aa00e2000006370307026c43c30a100000594040050b5371804e1044010918150e9a1a40a00002b501c500000aa00e200000c6e060e6025b56e484f1ac4ec814200001650061284b4bb682808210080000c690350d81a06c0cc260641302a0981882c0a4172283821a5b305100000221dc3060000320281820000157e30a150003c100020478e764ea430024e86651110012743e3a98002cede1e9500144292504a0280001f12000b5c68600001030142000022838c007dcf29e85000000939020102f5c8da0059460840200600302f0181700c0b4070300000d54814000aafc2880008071104afcbae7012060e8042c7019d619230014018a03c0f83448001213b090206402123449b6fe3a00f809201574468ab8f775399b860cd6f77ad0d29f5276a3bd6c8491bd2d4f90379850e907a4d101e774a4ad6b6cd0eae409e70ed61626b35633c8fc62c7e996da57fa40381588292b0bb8b54341f097ada6544e24f0a782e33cac2d57110f8f93e52803220dda2b6d6209114dfd0aa2cb2c14dba7be64076db79e7bb234506245c1fb1fdb1949393c2f7ea1ed2b2336b9bd401a7baf23966d3d5cc45a940a2db5e8ad750393328196f4109a244213b8e900005b92000d1a40b0460560ba2027329d3b1e55d400e80eeec4d22ee523a67b44e75c8a1827849c368f6fed6ad034cfdad48f371c429c63be27481800000aa91c8ef393a3728129e5f6acd86ecccc1e10ca06d5143170eee198dbb69fd1bc849bab19858b87514fc80000047832f300616fc9664c571232341d2363e88aca400000143d9a48dccd31d796aaf54caf7cb5ca5e1c422a1cccf34440a2a1f9c095d79d33474f5eda50cac2305153fe915d404a180000038839028000000507281083016beb05800000003840a0018980acb710000000004024000000cb74000000663adc309c0200003b44030140160200071420541302901c080000145560c20000006270400a024c98a50c01a47378f74200691ce257d00056cb4aec8680000057e2480b7f49678c0d31dacf0495624260140000ea10010e520501200127620400a027016af627f5bc09a820276d729cc0c72e00f88c20e18810610e00a00800600028806efde2e2678137ee82b42a8e2da1bf1dd8198907a0e17440b3798664855cf1cef4248c0339e94a2194d3ca786a4794e000000000000000000000000000000000000000000000005d6156875a54cdfc195855a1d6600000000084ce703334a440b5a18a0ff7ed46bc8ea3bd7af6f038c060b69091091460c90870060001448a1f6a43865a36061ed7333a1bf4989460f8e027f739425c74cad272c84bce42b291e76e8ca7574db07b136b25905759218483cf384c6bdef6c90c26c921c8eeccd9a9fa2659aa56c22c3603ecc7590c4a08f23594260fcd4c5ad4db850eb781420e201dd500bc609a8393e543800c032790180dac3ff12802ca30420100260181280c090060460202201e1053a747700e10fc52fcbe481f57c725b811861100420703ae4c67c9105eae817e1c2051a26fb040acbc9d5f00240c2200800006f90211181004c07c2603c1301d0580e02f8c1b9334194a205205006a8461018503ca4beac70cda6832b4cc18238cbbbff462004d3f2cb7ac8c006186e5deb0002b9f8889ebc00a2191050520400001e2200084c40016dcc8a1528ce8220331ae84de861cf295626810439c1c0203006eefbf92140675c7e4500b30a10804006c06034030190180c00e01002008c1df34272650e28745381c7fbcf75a1a01310d9bc901074021004010040000111000104202e1b01605d920658ba6d1230095e1b10386038125af960c0df31222302012179ec82000050d5864c0844010b1e38ad776c9634715b25212c15757c9f1038200000d920c00000035ba8e00576cc02e1800aeda111c4e084601000016c202a0a01405009808000bf480904c0440745000004acd111638816551d540aa844113419343f61e98a0859548d7f0b8b240a474a16c537fc20016550bcfba80c0007de48fed99758201d0bb0d9738180000011e3ba3511d8d7203304400012f100072620204200f09007008002434800a8310016e3337984957d0a187d0da49047e73d0a65bafa62ef4bf078d780000000000000000000000000000000000000000000000006011431820c21811411010c0014403354a2d9020eac86c9df9ff6d8bb057abd93784f91c66825868e1342f694c46c835a31c89a33ed6882adb21d0c6f0509103e99eb21cc384c1b8434f1bbf090c16b2406ebd85080000038403005055aba5914006ea161e888000000025803001f1e9764002884e484a01082289d3491f98818004ef16a149100000002580810854df37a0c71000000025809000016c44c98000002662f55009c30a002001a0b926328f8c4261238094ad3dd428500000012c048a834a2fecd08140000004b01208066ec985004000000f821e4e084e01092661781860c81a6247006a9ef5749e44a1400000016e360024513f8a1b79a83bc81400000016e36002800000004195a1d49000eff875b68ca627103821b01e00007f880602802c0400079640282601203e3dd839ec157a96638a09d163367b4d210180000016353c3c3864d8a95cc1f50b0c180000006212d603802e374e6d238920a000000010140edc20001410d9196b1014ec2e386c08000024020103a000828200e12006010004fb10052d00200800c04001c184008440020200001001fdc9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase3" = "QuadFullTwelveCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase3 private def zz2308:"s0904"="s0904":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l14 l17 l22 l23 l25 l27 l28 l29 l30 l31 l33 l35 l37 l4 l41 l42 l43 l46 l5 l51 l63 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3c120f4d7, -0x3183ffb58, -0x4a45ffbf8,0x112f37184], ![-0x3183ffb58, -0x180efff124,0x3c3cd6e9c,0x21cb2370a], ![-0x4a45ffbf8,0x3c3cd6e9c, -0x1426c172cb,0x319c7a1f8], ![0x112f37184,0x21cb2370a,0x319c7a1f8, -0x18c200004]] noncomputable def hinges:Hinges:=[(-0x3d10e71,l5),(0x18fd7d738,l4),(-0x18a5ca13,l9),(-0x8fce70ac,l8),(-0x10f0c930,l11),(0x30d2129c,l10),(0xfcf67134,l14),(0x19438cb78,l13),(0x231cb8eb4,l12),(-0x97808a8a,l17),(0x72e31d7a,l23),(0x3f8b8ab,l22),(-0x18c200004,l27),(-0x10d075768,l28),(0x18c200004,l29),(-0x8a2b9834,l25),(0x938524fc,l31),(0xc8659b76,l30),(0x18c200004,l33),(-0x18c200004,l35),(0x18c200004,l37),(-0x9871fefc,l43),(-0xd7f02c0b,l42),(-0x2bc57027e,l41),(0x18559134,l46),(0x18c200004,l51),(-0x446bb720,l63),(0x21a87466,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x18c200004,l27),(0x18c200004,l29),(0x18c200004,l33),(-0x18c200004,l35),(0x18c200004,l37),(0x18c200004,l51),(-0x10d075768,l28),(0xfcf67134,l14),(0x938524fc,l31),(0x19438cb78,l13),(0xc8659b76,l30),(0x72e31d7a,l23),(-0x2bc57027e,l41),(-0x9871fefc,l43),(-0x97808a8a,l17),(0x231cb8eb4,l12),(-0x8a2b9834,l25),(-0xd7f02c0b,l42),(-0x446bb720,l63),(0x18fd7d738,l4),(-0x8fce70ac,l8),(0x21a87466,l65),(0x30d2129c,l10),(-0x18a5ca13,l9),(-0x10f0c930,l11),(0x18559134,l46),(0x3f8b8ab,l22),(-0x3d10e71,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x6229022300c00001c44201e0c0400000000054062008000001c888070c0300000d10cc0a63010000000001901c802000000000a40b20080065144140319004000000000940920080000000d0702cc02000000000140e200800000249040d8c03002185407c0674010000390b03007100300000006c380e300800000188a4098c0303b06088102984014000001d8240b0c03000007104c03830100000018884090c0300000910d007a30100000000001c0c801000000000940b2008000311487005900302c44083800864014000000000e01c80200000450c4082301000000288c4030c03000000000440920080000014864090c03000000044140f3008000001c8c40d8c0300007186401b230140001c61a809c8c050000000003407200800000208e40d8c03000000000190320040000000031024802000000005870330040000104210120c0400000003c1c05300800000ac170218c0400000250440863010000000c824058c03000000000240920080000000a0502cc02000003104408c3010000000002301880200000007c34053008000000001d02c802000000641200f300c000001884409cc03000004d0480313011440a104400635006001502705006d40100056090160275004001482a04803d4010005c0a01c01750040000000026009200c000000110b018c0200000000038052008000000000240c801000000001c009200c0000000012014802,0xc304409130100000000031034802000000000b40920080000024844054c03002b49c138049401000002582100bcc04002889611c02940100000184210124c04000000860b025300c000000000440c801000000064240730080000021028034c030000005221014300c00000000e140cc01001c8631480cb401000000000210248020000003a1100d300c00000000050248020000000481409300800020629006c8c05000000064140a30080002062a809c8c0500000000054072008000000190503cc020000003a11022300c10318408806c9005040c62825027240140000018824058c030000000000303200400000000390388020000004a19022300c0000000006c0c801000000000d4092008000000001d02480202884186200f14014000001c86409cc030000c4321100d400d8115210101c85006001704109c0c84010006214c42032d004000f02105003c4010003c0841a0271004001d03408407840100000000009018802000002105003c30100000008828030c03000000098540530080000000002c0c8010000000945406300800000248ac038c03000000004f00b200c000000013404c8030000000058303300400000000150348020000000542c0d30080000001511028c02000000000a40d20081431c42540621005000000863902f300c0000001106014c020000000645c0d3008000000000d02480200000007c480e30080000000005018802,0x640900c300c0001a01040098c050000006e1100b300c0000001a09018c02000000b22902c300c00000002a1c0cc010000000001407200800790d814005900404586485c023a4014000000190a018c0200000000005032004000000001d018802000000004870330040000018884050c03028c3304802a84014003308c1602a9004000cc2304405a401000001945100a0c04000002104402a301000000000090348020510818e301d240140000000d07034c0200000004c180e30080cc1021840649005001a0260440564010000000000340c80103544386703db40158f1050c50216d006000000b42301f300c00002c843029cc040000000442807300a1218105c02189006000009208c0a73010000000130a038c020000043088092301000000000290248020000000004406200800001845101b0c0451833c23c03a2401800000188a4050c03000003105c048301000002c4630224c0405588487c023a4014000018c320248c04000008110807830100000000019018802000000822201c300c000000000d034802000000c259036300c0000001b13028c020000007231022300c0ec14220406490050000000000f0320040f514e21c0f6d00573c514414085b40180002911030039003948704170086240180000002a17038c0200000710c80783010000001c868070c0300000d214c0a7301000000000110348020000000442c0d3008000000190e01cc02,0x4105403c30101231c430c0a2d005000000006f00b200c00000c41500f0c040018c4c0cc0ab4010000000011c02c8030000000045013200c00000000270188020000004219014300c006111831023d0040000ac3c13027400d430cd08300b8d0060000000443c053008000000000f014802000000440900e300c0000120110058c04000004e0440163010000250982402d003000000001e009200c00b218c5303110040000004211014300c0900d20bc0a2100500000730cc0bd301000811d44600a900400000410f408e30100000001e06034c020020c7309802a4010000000002102c802000024835010a30140000c21040348c05000000220c015300c00000c82200e4c0400003384700d230140091210730311004000006108807830100000018848070c03000164a632032400c0000261507035002000000000b40b200a071d105e02431006000000001100c200c00000ec270218c0400000350840863010000000002803c803000000038240b3008000000002409c8030000005223014300c00000cc130120c0403c82282d018c4014000001b024030c03000000640b01c300c000001a024028c03], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x9202243c1683070462d2d14a1ea1c9d73c24709f90d8bc910cb7d158828301efef41c700a31cfade4270c2200800d00c1b8076508d) <<< 16000) + 0x0051fc613548fae971648b613b63e60e16a48912963055d18d9260a0f031af89c000000eb484e0844010c30ddd61c6c30b00164a120d2ac34df8ed307448583df4d0d7721dc443410fae0bb0c600000cf54b9c00880218654d40caba1a50316b0f4a1a3076cf98de183112f395c19a20fd37135e8410000004ae1e00000004b01a016689294b1800000004145200480100001d1200069e43c41784c0d5f6dbc592c727ff3d9820e876659e6061ebb499f1608a809fcbe10203402d1a14001fc0eca813841100438b833779ca8d2d2a155c85385207a2b70840c300191f03820609b6fb4b002da86d4b980088021c4c0684bbee09c41015ed3f5fa8c1818000003fda88406a79d1e894de861a8f1d9fbc3c07040b55fab54eb96080000053d75038298bf8b8f11a860845172561ab3a6a9002e03400011b1f2c00000d38606950bc035365e348243eadff86183a292d7f240471cf6329b56dc7842178c0a7581c229b2072b2a041248e64218c84000000032fa191200520400f30100010c90005ba2000e7843c8240018a06c66913468abbd79f943d891b1d10497469e4e353142062d8223f0ac3538168b88099826a077e8b03bae3b1c029686262d5125d29ab86007e65eefe2d925cf3784058cdabd718f0bfde0e8544434d536230aa0da2f3824988fa9861282a00005da43ac0742c36c309ea82058df17de1c038b37fb666f80705c4d60bd781201a80777aa6180b070c885608030b525af48418ddfad45924b05e8c2249223b2473b18809c07000040842e4861360bc241baec34a593ecae749024016b3e35406015ad39d512408210086971e8395ba386e9a457999c178b21a93cc002485695058019d75302940084021a636b7a53f6cd2e4eaaf08cc610129fb3a2220850a69d24a0e2382e53f05430ea6a07a6d83843f20505b21c05c331d00306055b356c79a4900250180000ef1d2e36db03f070dd2694a1e382f3c4c2a018004b196684b00304682292801080434c759500484d2f4f329153308313294c2882092799fd81c4629edb1a030f88d5f8921c287dbd2b884054e038f8a0c0db966bb4348011006000070080016e90005f321e20be241e60be9c61217e670302c9f09f88d486022341c8150903084021c6529aae670f1e5603d9f6787f2235a2f3401aabd67d480042010925955f1f2b9040a7445f71a503441a5a9f69a01224806ac34a20413a577a944e0406fcaead3d6834221f4980aba981168da1ed54c40881210060cd26480148140000818f1948cb0bbf3c7943b903a9e1fca1d5764d006ac454a320010804249675ebb622c2053b267558cc3441a5a9f69a02448f09de9da0104e9a01bac5a2037d53dcd31034221cae477b73022d44f76dad10220ab8a20e6934801401200007f08001761818483cac01655024c7f915028d18411dc48ad52428706e9ff3126468675d9e1b66d8a0c000001a820101cf4f8009b1a0c383cca3b74d8385585bbcd55e7a84801581620611dbc92b3540931d78c382061048b2d52364a1c1cba068ab1a19d7deac7dc2830000006a084073d1053db1830e0f0ad7a688e15633f9fbbaeb2004e0380001f221e00a00043c20014a84002d28e0f4abab1c3af9a16b1a3d09c29a7d843782f135048efec42390382851b5c4cc714cee16a440b2245c4003dd7af2db58f7c70d56825b0b9be773aabd6a23805bea0917a6cd5679e06f6fc6911095bb1fba9800acc62b36a69da275d67e7edb8f68cba4ddf5847f24eabc6d57d8777e7e8e249be50520a4c0f00000f24f5b698b101fbbda1d6da62c407eef67f5dad0bdb3619487d76b42f6cd865220fa2f6e06604da26c6a2b441457bed9e468296a6d20685056328678eee841dee65648df511b2a2ea6c2142c62060821800400031af6b961976f05bf6d19cea3207e1ff4a621679d8db118f5b7aa6a9961fd0e84dac3b8add5aeb46919cdd574bfb2193c57bdccb26a4b5618ff0d6f11739598e145bb644c5191f40680026a10eb05e0dd20f510f547671e0dd20f4f96feb1ab04576d4a6935db62dfca36c40ae2eabc6a76350cfadf63af3707d8ebcdb842650a40a38a3002800139d5b527f713aa4aef1ae4f897924181ca5b11f505f10f16e9bd1115c8c7fe2d6f2ae3b98063c3eef4b502647632137e9c507251668a728c537e8ffaf5adc665d724fd33539e663072906495940010b48778c826c44003f7643b8261da0bc1803f1ad99a0a186bfd40af2920c94104ecae06095fb1c119896055719cc610100000000da2e00eb6102801c58d9d45a594fac0532d268cf8b548780655c3607c6d67e90367a2f9b355ad1582aa3dd96fe3756d36e21fb710b3983012e05a0c65c2d655a7d46234e8c8552a2b8fa99e758a820257b17cc2a71ff4aeea5faf894da7c62cc3824017d6801528c192a4a6f45c298acf83b96d1cd4abe36abb632d67fd3922477076a34b74144f8edf694b6e2e410ae23c00022610eb05d0b43668574f6ccef36e763728a677ebdd54d7388c01c53c3f23d9643829fb5fefbcc05f9cd68565de66140c011e709420b91c0a1d87f6c6fefa9bc4a3a5b64de050120d8d0a0f36bbe66657af8ba1a12832be14a960c1803c635e922da72ff43978ff2235b4748cf32a035a008ea213228652fcd91d4b4874e547af4303415a84290e1ed3daae9ecb36a4e4e64573294558f235af939a3e51ddce1a6e50fc6b380a3ca51bf146284800000a9c43b017c5210f777519aa30980b1609e4d0c5920000027d35008186d1407dfa9c8a287cef7fad11230455724fcedee67)) <<< 16000) + 0x043ec061af0808000dfade8adf3413882010bc0f1c5210f777519aa30980b1609e4d0c5920000027d35008186d1407dfa9c8a287cef7fad11230455724fcedee67043ec061af080800131da2cdaf9413882010bc0f000041074958b46a579a0e5e8455748011e62b8d611841080400002b0d4e9591f2e1fabb4fc98028ef086e275b005c2817e83342b2c4c44d3cc621b01124f71a846661060e48e186380100125d22a74e1bd4470ffe025d86f4ca631a479568622222e120f3f1e1e0e4567c8ec0198325c7aa0005546c6000000bc1ac3dff89b0091928818ab00926ee30018206000000a3a6a54a88ed4090667a02070fd12fb646b0240ae266ab9392af87c5114200134639fa499194b01d101cf653a5df9463eb5f896821043d6f10c209c1680002be21d613bb6a5349aedb16fe51b62055c267600000c8ad928c9341522851c51011801400c00d977dd41f4e6759771fe368f4ff7aa8ab4b00589906217b9bf00e907400f90bf133cb948054f0122067f5861e05aa0004fe43a874001aa84360841d23a02a1d0740c81d80400326e410047c2c089b107d5fbf0fe07dccbaa01ee01b6100c2790be65f282e0c14b931c6b865aa784c82b04799366bb39e5cf62519d21f4c708409d81243aff804ab820a437c2ee7e896830fdf4f542fc33f090102491716ac5631541bbd3c5227b1471dd2c80fffa4816ff44924045965ae3a2162cbf82cf091467f0ca772b7edaf4bbcf68307b002a2ce5b8ac15d383af836a5ce508a0409b5905aa8af3194121424720e1b1259f470c9ab0faa7ed7bbfb5d947cbec8778004891e63f70d2d525ce1db3b2dff8197bc31e381a250b4440c529400033b1c20990d5313d70c08e0ac4638d80304406f848ddac3000d1618e97b81408132b18047f080268311d611301140565c460f09b025324dc63f8900482925c44443291910b40b000044e439cd41cc620e52187206c38c26080130e20507080a06904a2c26d303843f60240853860b11dd3c41540a112ba47ebea22001545a73f7c4381378eb16474c500521a6af6b4a882ed3c01fb7f200d09f69d73f5c67302b02459716ac2a451e6128822f0bf10610b773700a505904d792f1ba058c338325206460224bb625fc80820000de42a2600a66d5057d03800024b72e8124801400c38c0a011bbea38b1e0665fb33088eb04862a2c80d5063a349000900200001c27084c450a8233f048e1e0e7ef590206184ec78f42246140877fda81329720108379b892b32302060f7009e3c01042ff8e5cff9c180744d8f79a0101c0008ca24d1bb192c9002f0347184e4afba38e2cf509e96a1c48005755562491024640f0611500c172f8b206390baf69c084ca3e1f9200141a1a4074001180400006648001f99a279b44a644e2060b10341bb07191af67ed4d1c539333f62acd054e9731e9c20177ffbc59a870750dfdd4a604037edab29e0001c46afc490c24009806103168f6b651041c659cc0b34cf428a5e8bb51e084805528124cfdf8e0c1f332a821f2402c1c2a63d00380633163b535850019c6cfa71f80011211df7ae088320056058000219214c0b00043021c0130df05d5702fe07802847d0c1270dbc3342512c92462852451c0080345ca89e80610217b509fbf6e1a38965a82abbb3b5c9ba1ee7a093929695dd3e6e390914c28cc24d000203215a0ba271389bcb0aa28784fab1f0158818d1a9f028c21c66de64be59f890cf45d2bef172033d8b79fc9d070de17c4e60d50c0107d8f44e500016f96ecfb509c2400a80a1a305c23c2bbe6206771b18572f238d8d137ba950480cee89d468440e1f87f933aaa834007149c9d5d0480d7899dce2247013648f48587800252b7dd20a8e7120056058000219344e2fdaa79c2450f07c39851771031ac1b0e8c5438cd99acc3c8b1219407b61cc464068ca5506eda0e1c24fe20fd121801f8496d5520002df2dd9f6a1384801501434625368c815bb02064ea0a85364441c6b2c9c44d5f3c1450f12a7ccf2d420349feb227fc101c3c318d0833a18240638289dc99131c048b94117d1ad00040ddb0805998cec4900300400001259000475303bf23710b1a102bc47c1fc8d0c222661c3e920a23b367d61ad8618c87e7ae960e095cb5741240c097eb646f420a0c37cb77d010e035f7932ed0ce4801401001c0040a803000225218a1b0de0d84b84c374240016ce4150260a60b05205f19e3f8bca4c81a28edffbc4160245362dfb806c028a7d576bf1ee0910f33978c7e29024bf37b25db81c40ff7aaff5563008e935dad880400ed05e6fb1a4e09002b02c06e00e54d671433f02c6bb6b2a26dac14329f75c1522083072c71c61813401c084539e2e0bbed9728d84fedc58c9c44e281c41c11643ba000342436c0544858f847af07834510289df43df440a1245753356fc7152e9c21236bf8a2ab193dd9cadc2842b9aaba7f3c8402df94f809d670706f9b41858de60c001342c04ec44d0b2400bc0e01b403e2ee9e6d423cbc059515744520623e207cf6affa466a89432bcd4672d04cc6181c5307f7a57048be0ff850b51d820281c308363cd60e0171dc6d192ab02026a7880245e6149104801882434a2ae7ea6ee4927efd46838d2097f914db9844a762bc092070e7d4c4584821e8e67bd080024748da0ce004601000016a20007b6429826000cc06061753c0e80ee0e36f807387dc109161e1b84fcf8638a01b7935d71d14546c1731f584122498c5c50dd30813a90ba041f78300b5f7dce52741005b6925127a87ec2400b40d01b203822731784)) <<< 16000) + 0x8a3078ae74551cb1f792c463a1c62d1effa64d001792d50c24006438ca8c7002d046fbe2704220080000b29e351f675b8352cd14f68c3b9332048aabcecf306e6145037514ed0f412228d7da0a623481281de7608e203823b1eb9bbd24180082ab696052020388db2d3ee430c12005a0688210d53b3df18393e2ef46f2c78f397c50e38c322ad8ff8d000854ec6b9200289b23c61c0043a210ef3801180400005a885302c000f1886c028001ee086b868358161aa020d40186980eca1bbf3e687a448ea986a9af04c81ece13122bdc1431c15e97c89620618a6f4bf38a48ab067387ffcc817c602135cf59220b4f1ae42ec0007b48d137ae1442400ac0b143d2b3c87460903e963d21fcf942050a2a65f11227062b51b7c102365d303e3b140325c2b183392000ef168e281003aa91eb864800412cae459c422400a00900003f84348161a20309b0106800f4c379a562e341649749e2f5f9ca257d608dcfea6101365a381da28807b15ea2c110404a8ad854d0b1ccddd5496a650ed75bddcf650c38627cfb2ba5448014810033c07139dec8e9dda82ca935a36fec00d249f6b17ba7e309219ba6645d8c212dcf5735262c85b3e6516778a006cfab360b320004c48416b0c701284987249c9c2400a80a11440592c8f7227177c3f50530c201b2991879768f4ac1f0d2817698d4f9650950e318d2c008ccf9a3b3801180400005ac8001cb1d313926fbff70b257901c67d04a26f65d84826cc2067ec18b7d8a20650b451eb0820b3e1031690b1dc33af935f4a1f77c501ee0430fc7e852d412a2400a0081a63ca74be3068b2569d2e3643e51382c633cd993080334b188cd1440d435cc4de4820f09c8f79a858ee4254d1f1b287c72aebd658061aa8aca5a832a120052048000205219c0b00043030377ca6b0f6c034c0274ccc0710a267848ebb1e03080fbcbd17c18b1ca760bda3b028738685851e1890063739370f31c011de500058c6010bb427555c9c2400a80a1040dbc981994d481a61e21e3a3142cb124ec6c11e71c5431faae7c798c2400f830e374a51244028b4328d30009abac89307140029a4116107be84001681600007ccc0deb2b403fb78289c437aa6e65830827b24dd3dc62c80598d5978262c7482abbfa3b628746826e6659e2401e648e76b3b1c015a65463d6b18056f2fda0bacc309002c0304100bd0eb65c81a5e826d8a4b2c719d33fb1c54bbc405cc30903005aa065124080a8678c001dc57b9714001de94cf8a0008c0200003344000f6486682800209c84e0680049b0f0f43c504b68103e58734049240ce86b8d52e0c378f650618470b3a182f68c122ad23ccd77c40bd2c9b43df8e003f3b756d00806f32efc896d2004c030b28decc829e470e92f8437ce247226945461103d1371e8ff8818e8ed3ab9e30d14a46bc38385252ffb7bf122b308147ea8816f3f4dd1eb4900250140000ee90cc05d935290df6550207c6435b085c9433b6a4fc8b50914f78ff9378040ab49df7f81520417f574b6c20e009ad0f77b58500281ab728ec200fabd456718d04801481238b04287dfec4926ff596f70c22f50928601038ba2f3ab1186158e97688500057d7edec80018a7704bce004601000016a20720200039f204a120cb05011808001fb4c8f19943be110081427e6ddb7150c2c9d3fec6aee204bde07c053b0386c68abeb768060adab16561500a0116ff60e8c90c018620cd3432100dc7581f97d3a8480158162c858b95206e38e7b4047258a1b6b0a79378c283ff91d7f2040105802d6600074c6d4e880006597caf0c00103d7116a0008c020000332432804192020c80102100831c0418c0200044b218a430c4150011d190036732009ff4430cd786ba07e10063060061eb1f0508ab7d77150a0d6a174ff41c00000003e83017d7906670200000000c8228003fa94520805b9c11802000069c8611ec1d4f6182730c03982018c2fcc617c430bd1982a0cc2f057446a52d981990818cb4ce16b7080097f9606b54381619a1beaae14050a6203f058400091f87b529010042a6598f70082b2b4706559a0644307d52d000e455ff34368d65c2902040d8590346734564d4ebaf283026c32962c039e77ef090008002017603e1b1f24f741c2fcb24f1e382080f815a7008e65f67a4001f00844c25fef2ecc3227dbdb8386c42cd55ce17dd8e4ec140ee69e6aa5001e00800007a10001dc21740bf2855245b8c341d154358f550d74abf8a288ec4adcdeb57c8efcb73ecdf502b8c0e3743b474d6ae3fa95608a3f96ff2090c13c2f8c003671aab930dd98b99e8c70c0ef65bc8d9fbe2b46e1f144a3ec6cf00fa0fc3b7ca0b095c3f4d0aa84fefc1492c9d3e80b4928d5ea26d3d62a98ac68052b5fef5fcb169c63063a0aa0000fb883b06b448253d4eb2011ca1d1d84e00d0db8efe580a97237f124000fa015304a1042010d129084d3765081941be4040217dea98f8a103c32c948901084020156020000ec21740bf285ad03464c10393334c0c0f6563717890cb4ed4af8f0103f0f318400c4e7efa04261020008000098900036e21640ba0665646d1a609272bdd0ab2c63b1c10a0a23a14bc770dc5e31bf0aa0d011e1e212dfa3ca1f2b567838451801b90df16e9fbd346088384308440115a529660c9f6178ec580798b03abbe0a0b4b9fb869e3eb1d8c858ac35b1681761e32aadf1ac8812ba9aacf584de67cda51c661180001bc90b92185c10c2d0470040100468018f26dac0028c80e0948007c0110000100400001110000b320dc03806008020000088f01c8)) <<< 16000) + 0xd3afb36d99e267a5017ad2a019c8616a9ec5b0d3504d74ecd8940aac977fb47e451dc56361a800cb20c03b7246ce022faf19a5b8d39cf93141ceef781052854537817d6b98098ab3fa622d6f9c3d4e9b0ab8f29005dc2d4339a67462c62b4c83b894479286776f2905f45ae075f54e47ab78aa23821429ad60181d94bece33ecc100d0c1c03eed2358b1269712922053bcc50927a6f87bd4f22d2ba007691b3cf1a99d0a884535300000aac42dc4616403b112dd1646c76b91e9cbff5a6e03c21fd75b77e912d6629191552b2c00084001121c1c0c77f7134e47db508c789b915ec38dd04d8959002e3eac7a58ee5cb8ddac3b4c21c1410f9f0928ca41bf6370a76d5b0b857d853e91dcf9648525192bdb45f347924485f6080c474a3f272d845c8c0f07d38d535adcbdf53cdef3ee6ea373f44c11972a1ae72c401b2df0ed309ae18f05e20099e13585e31b1c602f8310b1dbc01a437c74653909d31b53c3eb483d76ab1868fb3abff9536f310967e93ce015b9b130f2617990541ce7176d4a6935db62dfca36c40a92a6b38a19f816e133b000006456c94649a0a8000000000aae05fc0f00508fa1824e1b786684a858a404282700380556779ad3995b409dfcc61eb23335c1bcc101f1b83df89ae1f30958a4288090a44a96ce8ba86b15c1619529e19af2ced28a6515d4000dcc84e02800281885b0a82d4441680a00113d2150630a62585284c290170040100450b3babdd02409f1686d91020e80400001d4c0100401142db7fd3a8f00eb1991248104d6a4023041d00800004f10000db322575a3f6cc07f3c7cfc482109d7b523041d0084899c31f349001d549f9444083c01000007721660200014521401b0b201d8a34435b0c20315fdc7730408d7a6e72c10224fa14740481842010b1718b102c080d9b70b32c506c5e03304702376e5d6c49030800200001ae42c4141380a0001f720400bdba352138bd4b77a1220e054c394a83a9606b7caa9c333b45f6b1159f8027b283b72bb800000000000000003f2d1a1393f56fe3fcb03df05400000000055702fe07802847d0c1270dbc3342541c72432421801400112f9b384a637a6d7fae1217fca6e746fcdd1b308df970f98f59b69563fd4eb3e6dcd5e727a4dbc58b7ab73e668774d6845d43fd5a18de43cabc4a2328458aca93488834c63c6fa3f8365484cd13a000a2e4268841603a099190578a81005415c1a0980100058f10ad15c861e0df15b2abb38d908a10ecff5eeb7d2b16706184134667405c32c800e0408bd0287bc9495fdd9c5007c809ba1664caa5b1120684f86262f430880883800e8f5480ab5eb45ac80307aa77da818a09e9003111c735533902304c30414e6989e1441b9acb8c142bd87febb14022dea28800904080021821811f83b142220a6a84200ed3c4d581031a8ff3c0050407c0100001a842b035822716bd27e0d5c27b87cf63e4d463b369a69c3c290137aea3a5c62e94a0040cd63a1cd22011c15c16a14da9cbbee4bb8b80caf8532a525db5ff01100060057513587b2f91a7c505f2c1cab547bd5c401047bc47641f8eb6cb2c0006bbefe752b7cd59cf1b923cf864b87a06ada123bfca5cbe17b7a5713f7149f69b543e536bc046e8238db6c4414b00b774248e1a42048030ce832468a642d3dfa50624c3268e283167f63b68002184eeea12041000434568ca312e506cc7d65dc60d60486931808a317879141be2dae1c4a083e0100ab0100008790001ff21201b0aa0980037b1a10fed8a3affdfad9720151bc23bbd086081a1094b68820f755fddc203e9f55786705182821ab89fe795db1908e55912c46351299d048183b1749d880d3629112bb537eadb45c00001992e765d195bcf09d7d9477d6fb9e8c52fae6fc4b271d5198bf75b304108318c0548482700413603000388200192242a09614e430a61d82008c294261480b918443d5948c1eb36abc4100044ace5246083e0100a20183700ec87caebdb902dd497854d05f05a42c402712258f24041d0085902b72a434816e0a5eef98012c7f95023041f0080000521b20aab7fe1205c509c174881078021640e63c130205a62822b25022cce4918c00b24f9e812020f804000033c8000b090003023c49717553518459518e700c2442ac8e91410c1f7db43001045d14a94008002182044ef3850e26900dd748611c01a6bb0a083546e584800400100000d121460b0a205f13d64757e8b0403e5ef0c88108002182090234c08e27e9b99c596008a4753e918210004000029c8370080005448001bf10901140200401145067bcfc068f6b6c4401a1fd97cd56580c65489f04070768ca04a083c010a1c387fb201c18f1087d62c394b7a88246083e0100000a42000368428436026130470580011810a019d8a68d8c10628120b125658a0dc8e529d523082100804f80ec510bfabb9140adc986bd4505e03c23fe581e3b25a650c02c4cdf60020003e19054098308402000026a42782413a0a09c0104d80c00099481002e489ccfc21980ea04d2eca2a21c090c40ba2ae8468cb0084e0e626814203378a579831442e7f9eeb394308d20a1e16a222e930da86d51b2804cc73571f6f5f2b2bbe0bd7f06015ae937f5f234d524436a7d8c00501578f7c191d35fde6dee1b30262e250c726ea929673b580462c85c87a72c06a97e18a18842000079a4268a41323a08b1904c00800432884b8cc1cc640042244150560a61305205d0313cc10cc151c1580273d06a08089330a8cf54700d818063e94101a7f8e89ff340037e8881c84895fc9b4f0200)) <<< 16000) + 0x05fac7cd179102433bea40820360aa852048e15a0c73648702d791447f9f33ac32b0d91b2c0fb3baec64b6f4a5f997384610e4b6d9d88801c8195a6b496a71635c4bdd3c4319a8dfa1c031b4dad6b348d0b93273de5dd4b0aa7b48602acec27376581bb24f95a9a36591d707b900560474af63c351f18637fee71c7590e71a048a27790042689dc489a8f3161fbc7eb9612d6cd9f5048088b84f2a5d17fe94b218681638237bf83e38f0bae20321020a75aadd24800c5f94ca0120611004208e1a611bb2015908ba33cc01287c6d3c11841080434a0887dc0810473428f5c0914970a26b4101307c424b24042100804b0080003b08000d990950d81886c25026126030920104880f4907ecabb6764d18549e4b6d8bed872493c5bea2bcc797f58f8023f97b8523c624b4549f62697abfe63fc1de0f3f2861ed4fcce3cdef61296d62264d913281a0cca952792d2b5c509f03f142cb041a79139b0109d49cf050192fd48d000557582c74bbfc107caf2faf7f04895344008ff80cacedcdb308380a23c64051ac9a48051c0fd69340b90417ee048c408002000015a424035450205d2f7212f88ea9bee1cdceb9878c89e5cd73df9a7627d06bf5e110e00cf0621787bd1a2a36932ae51797a78970f63bd394308cee40eff0d005001d45fd301fe1ccd303c80e9e73089f254b3021e069afc131ba9270ab10084b5d7c08193906e5fbc12ea5c3b4c702a08a41692aa3f43839824e2800490ba18995293dcfc36638e83fc93a2e29331337f9f60afcd035ce28fa70806c6cd4d15ca92d12db463be2a15f377f50d8ab8bb2067098228a2649624fd3cbe626e06cff7f0ebc977c808182ba384c593fa2ccbe89414bab0316aed4e1579f0dd44cc0da587426d8aa4d85ed7ac793203e8e3791e3d947d68b187cf243d85cef66e1897d0c58da66350a44cc21ccd3fd6fa54a7ffa32021520dd86de00a857825f793f2930b27cb1f99bbc45ff74e140d8e725026587ae28e7bf011483d0580c4b6ec82965bc187c4f7841f3a8ce5dab68410db0e14cc309031f4cad278200308d9f9602deae8dad85d8db72b1c836dd38b5d4f8e6008e23ef0b1d0982b872a2b4809f0649c9c080c5c01fb7b470c6440a5ee2ce5ad905967b15383324f6c7a82983731b3dcaa549f3782bbf3bc353373558351c60458d95d119ca046d27a5dd705fee0c1129782309b16500478280022d0f8c930d140450c0df8c47e900fa680884681d8bdc20c0920810004000036482508c003d4c8470ce00471d0ef7155388f3bfc869287c827eb541b066585c665f92f37792da060d08328ce1a6a1602d64eead9cb59f607aff1533a841ad7eff754ada65d093682ebc89760777b7de27631d11204b3d21aa67e605acae3fbdfbc1e5381b2a2e6a091a72da6e84f3bd650bbb437864d67ae802252d1c35ae93b108c7ebdab12fbf02fdbe1fb9b51340b498b705e086a2b06ed44a09bc84585cd66f1d42e3b8a275d58aac778657042c16e7f5e32957734b9e4489e650b4642387f00005c2211a1a001a222003ad06891e73792c1e894ee5fbbf28e29172817ad313ab1f4d1e3873c9e91397d1414b2ea581879820bf0154623027b200dab2ef4f8924270d2001c635736000ccf8727c065e4343c2e4f53cda8027c5c3edf6d3a0ad2698d65fb58a31e5d2b159d702b9c60ee5914942b0e2c46b2565e3676bd2183609a0000ea08461ac22ca60a83b08a1184484e01002008e3d23c0a928f086ca3788a8001f116c19230421008401004010000044400039884406c21c36096130860584280c0f40410803a157dd8a01a42104001008301e920953c7de492e0a9b1b05804afd7fd6081ec2fac2c04818400100000d73103bfc0068fb0cafb4008a21ca54ea04cb41c46ceb7e2013c170e313e2e54f79cb8d0970948345784747508992780adec9971806bc2cac2f11e87c2bb93c61e588841e07ff59d758f6d9d57bdb0b0142ca663a7828e9c08a015996121b4470280d65afd0a0839978e671b5bfd7a82645d67e0f6b7ca4aaea332ca81b89c5c8660ebadad8a197ac402ad3e56e9dd9550d13d0d3c40ab0105c4b5f90f8d8142f266eb4b195c0a3f88a0c855dedab8869a79445c99c0771327904b798e04cde71c9c037525908c3ad400018fc84106820425e04281746c441078011004010040000111881566dfa2e82ae501fb687fd9b95eeaf4024cfe058065f14ee2e1b2b9685d05c48706df3ddf890640b37032479a78e2511d1e437a60074d1665289939edcb671655ce0dd07894f9d60dcc24c26d05b18b8bb385cea4cb1501f33bd419fbb75ce899b7038a67a4aac7a413abf24b7e53f3b2245b44ca380a3c0724345ebc853720d2578a0552bef9a533859e9448c29afcbe5c48b5cde859cf94606d08e53195bf8307e81ef958e0c92404865ddc5da2786e0efe1bd9cce3762473f569f236187b3b8ca49c5bf5aaf62ff5ae9422099c5f400034690800d83f86c108260fc0b00078538593a2366685e699cdee7776513e8f138958227ffd2c23c72ea8c12acd7d5134aa270179ac5da29143f5107843a9e29ae4e315dc59bfe708f496d23863c0d4fb724fd23368af892c2be183cba5f3986bab4cc1969203b812f1ceb529f58ea4bc747f2c8e4a28c4c0769c2129c80db40afd27665c607fe63bfda4000ce58d27ad532698dedb042c8dee4a7a0468e5c5198c122505780c099d235866ad16409da543f6c5407a6518f49ca72db11237c51597cc4644d06cd011e668374ffb6941cf44ac5d01439201e71ec2584da75dbc70c4d)) <<< 16000) + 0xf8a71d25a0fab9eff4c8af2bdc4da711c2699c265c27afd2c48b4b79546087869da47c6c0477a60e3162102d91071acb73b16c44b4c9c2b02cd51354ec59660a7695a55273396c1e1f7837655a37494a292a287799afa28239e321db6ec0004bd107d0d000c92901c09e130b5793aa2453cbe025b162045c6cc64810734834bc380e57e041e1800a900e3e8020cc404201007c0d03d8681e8260f20200019320f0620772503b1081d4040e803001d223038be61499f40cca5ca289fb4a9cfad4285632a5964b3cd7a545d7bc6020013bee9bccb8af795e91a3c635d6ccad58679738fb4f292f322480c0e9ce6182a7af01e77bf9e482538fa6535d5af910f1e9735cec844004e3cb1842a9deca31e8f8713a323542a5b13d1ee92e7f14a67c7e105bd04232e1df28d4498843d38f9a1d9c24e16c4cb55feb6e70795a086a97e54a10e08fbeb98756638ce13aa773ced107a67fc93354b60000a7841cc940091b64012bd4804bfc19a10ba4cd57ee4f9750c41f2300cde1a15fbaeb195d50e1f8f93e9cd8000359783480a000000000000000000000000bc22862061843002800808c85167545b0b230a8b2ed8413806ce98feed5de0080cda87efdb56e9105101e2c336f0edfb240cb64f929dec21871cba5ff694cc8755167870280002c5298fed7b0d3d9dd2de58eac4cdcc326505bc47eec2dd78660db2fe8002489009ef5201e7ca776902efdea01730f219fbe4b5937d0000000025fb7aede10d646eecc9d646eecca2b237766530d61dca78486404384284102200353edd8a25c3d97ddba100b13400e712a7f28276bcb5886833c16c26531ce6653179dd534c5036cf3bc867c68219ddb200819772faf0c877a2b4bbc2b464e5e36c6347b70d4d4f2e49fbbdbee9242f9864d99a9c9e5db5c764974670480c2ac93018c1ffea7a102aa78fab5bc109c11af06a2cb4a68f0ad74e6f02b30f219fbe4b5937d0000000025fb7aede10a1218c186102000201d708e4b6298f6d0d67be83d119406540e40ac7e3895beaa7b46435f294d26ce4d0a90110ee5f2c8ebfbc0ee83249892a8a3268f1651b3b3e61c65dd85c4ee82aaa8350b6dc978a06c825a666ea7c7541c37d84ecf4f4104a3ab88edb91cba4c35f8a942d103c683904c10817224f9c0124d5d13320438850880a97ec24b34c88189532b8b46794cca85002a00f8ea24593b11100024f9140e0eff4d8a200352e79cf18eee4af02018177eab1a5cef140801f858f1047efa2c1080140ea42ab3962104401c41785592603183ffd4f420554f1f56b782138235e0d459694d1e15ae9cde056b2377664eb23776651591bbb32986b0ee53c2432c51442022811011800000d18f5d4049639169052ed434f32afacefcf007289cfb59846ef451ca46d06bb61c25f550bd833a1ac920fc3810dfa1c242c49a25a591a50052ce86170778e3b8510273715d4601edd3d9a10424182000801506f76902efdea0160d2a2e315ba5771b3af1fd467b8701ebd6f4a907e6136c21851f5f05b5659403f62111831230c29610a1180160120202181c010068000ed90700900017e906f190130a8001b3c8004dd105d350007d5106e11c057ef9f4b5f46558142a4f38777bddc10100a2e92b6a809bb785040b597355d133643002f43aa7971efa21400e8e04e4f0c4230804a89562590430a0405005a02696e8d5580d007260820444647adc4cce73c3906855ffe9ed8c2d998f3666702a24864063064843002801801016de11a5c686fb9ef00200140d456d4a4830400a682c04f7b7dd248b2c49569f0000000008ec92e8ce090491070c90450010100a3c5a5270ad1b09933aae5845a00000000995b9907286579d49c8622c95c36616f43363b53457d37f52da1bdf5422b2746194aa983509b6f06a2cb4a68f0ad74e6f02bb746a42717a96ef42441c0ad646eecc9d646eecca2b237766530d61dca7848661260e50e382400643c3d2b77c7e2108067dd87eff77a009230fa1844d6cb2638683b37dffcc52bc629b654159203b51a818c1f111006730881812f8d1ed63064aff0caa1dba7c510b0256ea1359a42e9b744bffd8af7855cf58e81bdd7c2e358e91dcd1babf8fabaf0a07cbc1a8b2d29a3c2b5d39bc0addb529a4d76d8b7f28db102bb746a42717a96ef42441c0acc6a9ea64e5016a5904864041001614796dd1c0d0d8015630f398a042601b89da5f9961a93bfba4d32fc9d941c39212e2ad75141cc772c0ecda3485d2bf8c10fa43810d256f177294972edbdd96d48a57440d1a3f6ea1359a42e9b744bffd8af7855cf58e81bdd7c2e358e91dcd1babf8fabaf0a07cbc1a8b2d29a3c2b5d39bc0aedd1a909c5ea5bbd0910702b2d86e7ac5b1e60aa1a4e20acbb761792fddc28532b246fa886ca8ba9b844a5904864042805a265f9549449e7bd52ae151f79d43c697afaa4f17b00fd6a6ca7181aadd586af3548de4c041412b0930a7e1daf2747d3f4fadbddaaa70d7c0932c26a1a658c7ecb28d48ffa4376d5024b911a0da0200055b200147441b0560d62b06a1183482e084199994b6986836cb363956e30ea65d3de869933e4a264800000000000000000000000000000000000000000000000006213062c62451c11010c12c0002823341c90d2788ba3568f6a114ccf1e87086c2e7ffcf1a9813b6023d405ced0dba1dab39ae9ca31f1294e6d26090b2a00a09045e938ae49c66350003c6376d4a6935db62dfca36c40aedd1a909c5ea5bbd0910702b591bbb327591bbb328ac8ddd994c3587729e1219a51641010409602a)) <<< 16000) + 0x51c9952a9b69ad84ba26a8b92462addcebe64916e0c3536b55405668958621d45dc6cf5b71f8b115c51defb48163dccf6ff83235f52c1edf4e3f91df06649b581422d899b76d4a6935db62dfca36c40aedd1a909c5ea5bbd0910702b2edd85e4bf770a14cac91bea21b2a2ea6e1119a41641a31c11011006493dd84cc8c358d2913beabab90136fe8ea59a64544599893b4a1874e62a042b3feea4c271aa8d0ec11584950002fd20d013c1f52d6d848a1d4ffbee30d057b198788705c095ac7c400df992e2819430800200ce0200011820cc2b0650d83200f892db32b679309000002c10386aa23c73273c20e6c3ca301428ea2f47473c13e00d5c5a3c013e6b91bd3001b457857828000000087008908240107960d60af18a050000008707956b4b688b9a50000009607886e039b200c0000004ec0180f5f047828400d756aa2818558c8454021100422599950aee10281636ded0c6889c584eb4c1a43080a70699bbfe61c285b840dc8f83870c1a7e5cfa180800b5ae74ba402c37fc7b95b1a0052f9d0ea499e48015014225d19d1ed38340bb8d1070f6e716000007530110e5825a642c8e1aaf998a65e0c317cdd172d46029a8ebe64d0506af96d946f644001381000007008001f590005bb20c613815407a48a36cf2b909ba8cff9a50b681c10603c4f7c758d92c58444e3fe19c4808667a00aae0e14de6fe21c01817bbb82672a6001e6aefa503c24009c08102af725f0826795e226c73173c435bd049031a20000038400b093a060a1b238453570950c1028b38e38ee0c09bd204fdf70800250180000d71814e0a5b09f43cab86fb19cc9a506d810d6a0f11e7db35698306f5ed8b04e1c2144779f471608f973307ec7048d7dd9f58600124029630924009406102a5652589713caa9eb647ce0d28000008ca01450000046500f1053462114d1835251949accb04868609ad71c11f156da288404509ad03eff2400980600003d04000f8883100818404000fc64180560be1b98790cfdf25ac9be8000000012fdbd76f0844d1cc1ca1cd18c10c04800100404c0e008034000488800893904005000cdb105e0d0016119002eda20ba6a00308320b80a00335f20b63a0030140d477cee6c30238c90c31141a1a371a3880caf96fdf860156a08d3828112b8c3db1005bea1ed1a080084e6042010a1cd8f409c01c60d3b37f58911194a63971c1b5da0ba0c9006c3d24e50c074c61f2f8002618220087180e0665d10818d114764424102b3c7600100204a704fc10337503fa080128a11804004c4600025470a91b19dff203efcdd49f061430ff0c34401925638ba18193a40c0b000251c21008000087905a2182c90c160174419fb02e78c178479eaf050aff50094420079ccdad800000242c2100800007510004f420ae620562502a8ac150360a60b05201d3cba9a20a3d2290e2245e22f1cbba462e3f7c7487200000000000000000000000000000000000000000001593468365469c0b787755f48f5382dc67a0b054c9145109007006002010002e82fb7998e8366ac39ace5a183bbfdbed349c8ad894bc36edd1a27a16599f04f398d69854f6836f82eeda055a5946eb826c2b378243ee2e4a348c59ea6b50511d8280ac13c5609c1a04d0d82602f0867a37b9b1450d0571d80c089769fb6080d0f10cb60009060800200962303e0181e8080f007e581c574c94b288ed2f2006829e07fc5c28124b32e510c0c7971be30250821008408212b5cc90c08457c18001831e9faca61e01817a02862000ecdc85184a104401000010b2094120490502402811c15851fc0a45eaf622093c036fc80a04659f5d805a78eb9342d440178278beef05432492c8bca01376686b42a021774f6adf140408c45de712a905be61d8c1016c5dcecbee2e2134a0b430128ec732947287aae5d9ab646bf55f8756f3042b06e24710028434c7101fe710162053b72cfb83c01166a6ba1600170e1f2c400ef7704bc4c0842010e1d6b86eb5383c3ad9a1c8810780200000ee4000710d0a21c1b364a004840850488108002008c0204501000052104411c0812bad7b628728c0be0c2063db55e1048062765198200a09ea5ce0128810004010c24000234410846000df068905e22347c70c5014cca8202126c67724e04d46daf5a2410a1d595f0804145b38fa080ce363035c009c50880214483447ab0c80802ad1eb62059fd0282e0c230a87ccb9c0c1aecf71c80488f46044004c284201000013920821a04005000175903f0d000657102f2d81604e03002008c31961ceb6973198c8261948ffbf7a92084907c80b82fc0770609f656d33af9f4933ba14abefef4c1a26d5eb4bbe849aa771a0644ced40e79474c4665d2385cbda420ea79bb6c417c420310004f1e42d07c048e50fbbec03185bbbbe85493a68b6ce83482cec6e701d6b413c0da2c3877fb261ec2f407317690b63400711653303df3a943a282ce38c0cd996ad528ccb9062f09d000094640f81607a0a03c01d080ce1c752bb7645adcfb585d8a6a7120f3ced5759209cd5d2c3411aed9b1220591db38d10c70b4e306defcb3b9154d41928e7b8adc66492c75f4d0cd6600c3f780e207d10750390da99a47f8e2f796cf0d75a84c64fefea980ee840607e85d03be19749054fe11bdfc1b8008ae9647adfab159cc577d1699dd3c003eb314d8ff54f841b6c364a4cc2f9c99baec9c8cddc02222f81f98fd625d5be80958afb7ef92369f81f50ec9b03e603130fb475e7d01d20a7519420100200803b01e00714868a630124740b60044184001000)) <<< 16000) + 0x007f3c58a32d8f8383e257818d22081f00801d80f8a3025435d0c11a02f8851800905f80046032002d8a204818420100000da200030840009c0e156498103489067c20554f1fe02bdec7044dda40bbf7a805bc556b6ca1815c96b26fa98790cfd8000000025fb7aede10a14212214098006007bf69c751267ab657670e0258d4182b145e01fa0db57e975d2a320a51e78acbe1b943b8cf76c5a661e70854b80a6a198a53ddda40bbf7a805bc556b6ca181453199d7e8b205f25ac9bea61e433f60000000097edebb78420d2a2e315ba5771b3af1fd467b8701ebd6f4a907e6136c21851f5f05b5659403f62128a18c1081140863f05a2ab27a01f818e15e3e32d80f71c7978a75ea63fef79c9ee744115874bd2631d7aab0cb709b7cfe45097d02cad78b03c5efc9c1869dabd05575375f4ec132681a247b50004a020041203a0900041e1b2819561770282178d74284804091b3ab71000e9103e90303d17cae0900944088021650226979f4a1002bcb0062878351a36a3c20cd013831410e6900924908563ad67a013081080400004dcc0a4b0498f055305dfa9296d23b10702401a46897b7afab1db828937412c10e92d0906bda621733ca580aec100832e3c8611794763741c28bbb849004c0381b4c326d834828e1d159a40012b1d8680b4a190338896b470600672fd4391e1f4441442ff771fe5994b0dd5089dd8a93cc28d224000039720721200062820702a03711000b821036250130e80071a081a94a4129a383a081a874e95db881540a8360f6725433ca482822753da0684c5113c24ec4a5835b2624fef1df0f058e019434667ee684c748718a22b4e79ba4b1f6a643e898e0776ba62940072bab49ad7e9a964ebdeda94cb3dc89037af625add22ff6bbfc81af7b531cba7a51109e87d5bbe7242daacd2c554dbb60a7313c32a8890329c89141202aa642081749736e6680c48e2310c0248137dd8c0031faa6c25041f00840a3a9db55660863ee222c5042ab3d33a1055f0258804808400100000d320680a0001fd3c303a806aa0608d7c2227ce01dbe39d1c38043ffc0fa000ce7f48470328610804304275462405870eccc42c304e4bf79311820f80400d004066020000ce20003e040c857230065dc56193c7a69570e84c82c8241dfd5120f3126470bf9b864364ef4490554eed46341800ab0a69115a58b8f333600fd96476f1e208e04b704949a64e8d0fe8627b10a43d21b7a48206d4b1298a707220c59c7f2c6ee111aef1e89fb05d98fdb4b7205997819a86cfe8e8e4049d159b645ee8962d1a2b2ffde6510881ac0188280c00400085040bc7605c2b02d0981602e0200200802b1181504f4013f650f650004662f9080287c5867a0846303e0100000ae30080619350283e7f56e682016845422813101e00401502e85a6eb821f341924b601d1410dfb936f20069d8a0ee1401980c01b002514200080000839029050000f9102811013888098440006c24094440481a0230500085590183d001dcb9d2c5d93b1b7170a1c5c241511862451830c32411c0180140544aa0e50ee31184993b812dff1a3f47c162204f7883006ce829d93cc414dcef1008606794d323c1e8707debc141630e91bd1e45ae989f64de2551b217af3e859c3ef99316a3818017d6d2a9b3dd30bc5472d7919fb43fee559145f9a2a721ba393d576b8b86b9c2bbbe58d711a1dd6413bc6608fa0c0824412390804fe9d1a621bd03fa018ad77a6c545c696b901e104e4fc117c9e9b9076b94715da650884fd9e4639744e002201d04509116d4d032e313c58c0043e9b14040a7116a0648083e010d24001bbbe9a4070d57c3082b42d75dc48215937068e0188ab3c09600027089e98007c02100001004000011100016020420be3025c0334e0262105f8580033957e9800e8022000020080000223c60153d98ce02217e1a62c004f02bd23001e008483b1bf298800c802000011480007f102001000102901f1180f04c074074384cdc725901125607828e108ba08c89a052cebc8f0481040010a1c471ee2820292c2a66c709bbc9ca2141002e81f0901078020038020000e020361b01a09c8c0ddf1b56304000512068e0892bc816460411c091423802329391e18085ee32d480930a1080400004e480c8a8000d8c80041e10182100b88800349080b068054340281a0130900904804414001e3e4013eb4802b641a7975344147a4521c448bc45e397748c5c7ef8e90e400000000000000000000000000000000000000000002b08c10c08a08808600402a20292bafd2d3236659d50325fc5051c5a7c9df54e1ffd2a58cc2a71de287bedf29d66f10e519ee9274046ed16c1cd625d175e42f20fb436f3f4bfad08e7c6a1ad34703d15ffe6aea551e383d834c69a6595c248ede0df461c20000008ca03054d4ea07fa8508000002ee00e099c6e2fe630415afb6d10282807c77e0ba45110128e504e028a7975344147a4521c448bc45e397748c5c7ef8e90e400000000000000000000000000000000000000000002b08e38e28e18c18410c00a0080288181c0100680800e0892e120745c81801521fffb2440000000e108107baf1a6611c400000012c030c0000008a500000e8d1a515102e304c0088239acccefd3f10300420a694312440000006ddd040860a0cbfa71c900000003d86010000d3b4d527e1800000001d4c0881938c1580c00006c88078c8000db080710800169880686803014000f0e402c84014320091900408801c4400c020050100063a90042d0018c80083400202000010055a39)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase4" = "QuadFullTwelveCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase4 private def zz2309:"s0905"="s0905":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l15 l17 l20 l22 l23 l27 l28 l29 l30 l33 l35 l37 l4 l41 l42 l44 l45 l5 l51 l56 l57 l59 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3c06a31b4, -0x312f14dc0, -0x49c69f6f8,0x10a06abc4], ![-0x312f14dc0, -0x1806b7f5f8,0x38da5b994,0x2336c334c], ![-0x49c69f6f8,0x38da5b994, -0x1404420a6f,0x31478f460], ![0x10a06abc4,0x2336c334c,0x31478f460, -0x18978a938]] noncomputable def hinges:Hinges:=[(-0x3d10e71,l5),(0x18fd7d738,l4),(-0x18a5ca13,l9),(-0x8fce70ac,l8),(-0x10f0c930,l11),(0x30d2129c,l10),(0x417166d46,l13),(-0x4b9cffbe,l17),(0x4002f231c,l15),(-0x3712d634c,l20),(-0x22c38877,l23),(0x151d2fd10,l22),(-0x18978a938,l27),(-0x98acd16,l28),(0x18978a938,l29),(0x9fcf151e,l30),(0x18978a938,l33),(-0x18978a938,l35),(0x18978a938,l37),(-0x1278c4fa4,l42),(-0x28d1645ba,l41),(0x5b436ba4,l45),(-0x1f437270,l44),(0x18978a938,l51),(-0x73c0ebd9,l57),(0x4e01f2b7,l56),(0x192efafa,l59),(-0x31bed88e,l63),(-0xfbf3e4c,l65),(0x13619d48,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x18978a938,l27),(0x18978a938,l29),(0x18978a938,l33),(-0x18978a938,l35),(0x18978a938,l37),(0x18978a938,l51),(0x417166d46,l13),(-0x3712d634c,l20),(0x4002f231c,l15),(0x151d2fd10,l22),(-0x73c0ebd9,l57),(-0x1278c4fa4,l42),(-0x28d1645ba,l41),(0x9fcf151e,l30),(0x18fd7d738,l4),(-0x8fce70ac,l8),(-0x31bed88e,l63),(-0x4b9cffbe,l17),(-0x22c38877,l23),(0x5b436ba4,l45),(0x30d2129c,l10),(0x4e01f2b7,l56),(0x192efafa,l59),(-0x18a5ca13,l9),(-0x10f0c930,l11),(-0xfbf3e4c,l65),(0x13619d48,l64),(-0x98acd16,l28),(-0x1f437270,l44),(-0x3d10e71,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x9c140630080000002507038c02000000098140530080000000025024802000000000980520080000002505018c02000000000b409200800000000050348020000000b4140e300800b31481102510040014445060028401000001444101b0c040000000844407300800061188240a9003000008110c0833010006115c2c01b100400000009454073008000000260b024c020000009239024300c000029190503d00200010c7222024400c000000211102cc020028c912040784010000000000140c8010000008239036300c000000000640c801000000000c4092008000310d04807500300000711840c630100000000009034802000000074640f3008000000000502480200000004434093008000001c8c40d8c03000000044180530080001d088380490030000ac421901e400c0000009824088c0300000250440823010000000000902480200000007c140630080000001d07038c0200000007814053008000000001d024802000000000780520080000000000c0c80100000007414063008006910423018900400000006c240930080000001a0d018c020013423048032401000001341200c4c0402882b822006d4015440a104400635006001482a04803d4010005409c1401b5004029828826012d4014005c0a01c01750040000000026009200c000000000240c801000000000380520080000001109018c02000000001c009200c0000000012014802,0xc40e2008000000002a014802001c8520840d54010000000000540c801000000003400b200c00000000d404c80300000000064072008005210c3201e90040000000683c0530080001422040648c05000000088440e300800000118280a8c03000000084440d300800041118280a5003000108460a02a400c0000000022014802000000000440e20080000000120c0cc01000108460c00a400c0000000005c0c8010000000b4240e300800000148840c8c030001785221034400c00039188380d90030000708c1019230140000000d0a038c02000007844280e4008000210c8500c90030000000000f0320040000000d0a018c020000002209022300c0031090130331004000f02106809c401000740d02101e1004000f02105003c401000000841400f0c04000000044280e300800031148300490030000063064022301000a218c190091004000000048380730080000012874098c030000004219016300c0000002615038c02000000094540d3008000000001503880280474c49007a44018000411c8380d9003000000000180520080002023840648c050000000003c0520080000003109038c020030c62084094401000031148300890030000e45411022400c000000000440c80100000000084092008008218c26037d0040000000c44409300800000000e140cc01001a44e04408a4010000000151103cc02000052885024c3014000210c8380d9003,0x44340a30080000000019038802000000000b805200a011920e101c890060000000a43c05300800711502503990040000a44214032400c00000000290248020014c3409007a401000510cc230269004000000064540f300800000188a40d8c03000000008830330040002824840648c0505108304302fb4014000000190e038c02000144621d02a400c000000190e018c020001248214012400c16424c18c0bed00505208604602ff401414420c10c0dfd005000000074640a3008000001c8c4088c030024458044047401000911502b00910040000000542805300800001c46101b0c04000000000740e200800000000320148020000009624011300c00001845101b0c04000000861a02a300c0004c218680a9003000124861a029400c00000208480a8c030000004c88703400400029108580d9003000009488380940080000000021038802000000064180b30080000000221c0cc01000000620a02e300c0000000f07028c020000000942409300800510c41901dd00400000210540c630100000820ac0c18c05000000000070320040000002305018c020000000841c0e30080000002205014c020000003211022300c0000002105018c0200000003424093008000000003102c80200000003414063008000000250a014c02000000000840620080000000a06014c02000000000b40e200800a224c8202f10040000009a1a01b300c00000248700ccc03,0x5848073008000001608404cc030000000584405300800000000b00248030000000036009200c000001b024030c03000000640b01c300c000001a024028c030000006e1100b300c0001a01040098c05000000000140620080000019024030c0300000000024062008000000190901cc02000000681100e300c000002c9440d0c0300000000b850330041241c630c07490050000000941806300800000000250188020001906c09035400c00c12d45601310040000000004c092008006314c4602210040018451128088401000860a4120195004040476832011040140000014864058c030000007235034300c0000002a17018c020000e4582503d400c14126226002190050000000883c0530080031084160211004000000034240a30080001908828091003000000000580d200800000841102a0c04000006115408230100000001916024c02000000000540920080000001707024c020000000005c0920080000001e16014c020510818e301d24014000000012140cc0100000003c1c05300800000208f40d0c030000000342c09300800000000070188020000000002805200800000308cc050c030000000002407200ac22430970246500600304b5170046401000a220c1b033500400009090101923016441c3183028590060490718c302564014000000250f028c02000000b251022300c00059288480d10030000c45212032400c000000016140cc01,0x510d80af3010000000003501c802000000006f00b200c00000001b404c803000000541a02d300c000000c8240b4c0300000360440fa30100000014884058c03039c59087029340140e115020405cd005000000000a40e2008000000411503cc02000000000e407200800000001dc02c8030000000075013200c0000000031018802000000006500a200c000000002403480300000000021032004000000003101c802000000006700b200c000000019404c803000006424180f4008000000002d018802000000005d00a200c00000000130188020000c8461a02c400d8210d0c20234100603084286201704014000000000e0348020000a4381102a400d410d80810232100600144380840b8401000510d02102d100402843404102684014000000000d0248020000000443c0530080000120110058c04000094260900b400c0000000078024803000000084740a3008000000000b0148020000003c68303400400049208580d1003002c86314c04840100000010844058c030000608a1019230140e118a118091900500000000013032004000000011002c8030000000045013200c000000002101c8020000903609024400c00440c41502890040000005225036300c00000941d0318c04001d8250740cc4010000000002408c803000000421d036300c000000001a014802000003509c06c3010000000001b018802000000542500b300c000001609c04cc03,0x39024802000000000340d2008000000390d038c020000000002903200400001c43602bcc04000000000f407200800000001fc02c803000000007d013200c000001d0680b4c03000000520902d300c0000000035018802000000006d00a200c000000003601480200000560440fa30100000000035038802058c91103028b4014000000008c0b080300000610d80af301000000190680b4c03000000420902d300c00001181103e8c040028c8c1cc0ab4010000000004403480300000000044092008000000000940c801], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((0xcfe1d3ec6037a0d5b12f14dbf1b417cf40440d060b7bde405a7e81d5c864f0d14b07a382a6712612592604582480a21f61d10dba004cee8094b00aee94571031f27a6a592b94503089d021490549796e43158725c7aa2b013157098ab02e2749f484d5481c6f94400d22595bd7db708140d834f3d20487576fe8c88410ed1d2a94000000febc0000e1ad9cd08d02044010972ea4da09c03e0bdc4bc5405fa8a7ff2902309008934d34944533532540c9000030000200d9a7fbb4d2e82511205cbaf102688000005dc1324c78529314a0e1af0b1c33503277275934a809182430ccc10400000e0ac200000000960d2004a0180001dc344604c3db9d4d14aecffd15420224a008150536534469d40c0c85048a481020a651e51002643cea79c008802144566864b24c6287c42ac3ff59e2444976898fdfea076b22574a0cc30800000d12e02408000020af30241d8bad067bd82024690f058658107829b005a5042f48015818000086c8001cd114205d11fda1956aa68d71b5246141cb08f9ec6a0a1b0e331f48203cfb3899a1064a73d851006773b5f138010804269000001518143f8da5b99409984199c3406589d96397735264d6b1e83874c242c516654090c000001c204) <<< 16000) + 0xc2ad53063901a13d348d50ff12004a0280001de3248020cf70e1692200000278d04ce6a996bbf58245860eaf385c95227d1013bf904100dd96ffa404450000006978180c66a4033e10104d38ae98edb69200520401410100010d1155010002d01000ca83e7d69b81822610349e09e7703c78a62a6e9b18e2450863a695418a282486d0604900c61ccb4c1646840000034bc03c007e2d5eced1800000005460244801480e0550042a602152010a8808540040004d86260b28b254d5313c980264b429de1759e65d20ca2fb47a91ff2112bff8bb65c1c621dce638725b28c9b8470f0be0e9e1c21a85372b0601f0c906edc063af6351a004122d34fe76d77b6d59ac475801018005f6276d48205d586a0b11866104f2805c74c7355f9ac4fb414f2e5c000045a9617eeeece93bfee86130c3a0a80000fd0f1d7e84ede08689a000000a8c071a000000a8c0798308b18698088829a96ca760708442d08ac707844f6035af5070212943451020820f824fed9724801400c22683a69035a799000821cc9c619f550e12890d7224b4b9c2045a2c3b87840d281ef59800901bd3ef3801100400005908a78285381429a0a14c050a5828528140007ec63e16ba36e480b3fe691df65902ebd6a07daf5a81fb1519594c546564c1e33ca34a30a3022c028053355e0157290cc1d415c1180aab284a09032d2fdfed301a43006a66f4ac6d881f868a0004a245245400370a64681775a574ddacde284bdc05e72ceb66966f58dc95b7281a69f106d51cf46f35e697d26c70391c10babc933587f9e6ca163ce2dd20d41a25046a63adbf63821615060824846802b39b9e6053153c11a4471d2bc809a7d5ed7135d30b8805a687864b0ad94cf352f9ae5c24537d37d5741e3495406253486fc823eefda2b451855db600bd72085711c2681c6b57ac5242b9f751bc9930dd480ba4c3705b464ba0014fc35fe25002100849161a6e85bda5501f3e6ca68344b2a789a1e1a2075444cfef03404188a13010720387ec8bf4f110318495fb13620178de232479041be63e6c930a24801401200007f4cd03ab43771a48509a8e19d32616500d4a986fe30c12c400267faecb4a00420108964210efbd0c103893bad891d84073196f53e220818e1b80d78d038490c9649b68220a77de500dc680218707f0b2e960aedb0bb0c7c0822cbf0452907e120054050000210200065c450817340b23a134c9215dd6630c4c98ea33d16124006b8d95d30e3fd799ee8004816d42b980084021244a6015b171bea259691ea25a6743cb21f9f407b56040ef97e20d99e81010648f6cd8f691019476809511f854217da8838977090535bfdf9edd811080bb481a1126d5c89002f03c0001211a20362bce2cf87a051691ea25a67471443f3e80f6ac0e33e5f883667a078632fa8022ebc8e11476809511f8a0301ee83fd6fe200887f159e2b8c082c9d7fefefb055c92005c070141010001269148010003051000c9e3c745323b101b9c1c68482bda71c389a3844faec0a2be163829173fb30ba081912f577c39a61810482bd78a3589c00a3c8cf8c801080049aa9bb240b00000a8a6e415584f5120060070147010998084c8042620214601000159181793814ac8efec62fe48069bebbbb5ce4a38e2d4e0655e15bc5837c92e11579a030c1fbc1a593c7881e8da247356efc70c4554aee96d82c0696d77e8b2de1a33938817c7d6b791138811445a7d3c43452d9f67c1445fc1a830c18011d61b5d32d37af18abf556a3ad6090be450c1a35925d77a46b642c9059e20c438d00000fb8e9b7f9570c279040c15d83a63ecc9a600000037cf8102c03d2ba291b260c129edaf62122860499e23d840061138194aaf590d04c02198c1dc018220bd9a881ccbe92005a058818cb0574a481764a0f15a717258328bc6960c0439cc80e61ab13fe581920ffa5d3001000400004a88a28284c01425e0a0a2050a20281fc140007dc789d409a5a8d3342ec893247a75d7222542860c254003c3d5bed3139c57a911e264d5dfa4412c9c85759c90237b224e266f01220aedcc756ca00f8383831c4de0e38d616c733f64fffa6ac2401ff416c77701110e9c02ac7022bc6317f10007924e6747e3c829a0c8d8d9e3a26d3e62c80be1086a086e24705574ae48d124a411435800041222862a0850100101d9c1f31f0b9ea484992f58deccfd5daafbfc91e004c6a28b8afb956d98b746666116348036c66652a856fb576e9a2be3591b718413f76ef6060e34ad50ff557ead9fa188235e3bf324f4ab01c81e87b89ddaf42040119ca528e52b27aa26cbe36d4f59c8291c9598f98b733107319382b4881d8d27c60ecbfeebc16bed7b7bb765c4c040b2bfc8b038c56ea3596318e8cc1f05c000092e44e0076334c33ef35cbbcb909505c818a66788acb2ff50cf4454402c659809d6d749b4f554228001557e9a9fa688d43b258e007ced1d7ea76f59f9e11440066387d274446a80090c20800ce0906345e18a3e0366e00c1bbc23c0b9dd65f69b9578f89310c32986ed9cfe6d9755cdc09318e144300000718626265b0ca2a9123799271368b24f3d112e8a05e274e3ab3d4bc9fbd5c32cf0248edace328fc6d9fe0b092d1c4014373953061ca8bbf41cdf669ec41ac01e0ed60a14ce2d94600351366ed606929bda9e81747f03b1eed0e21a9ad27512693f665505de40fb9e9880152dfdb05ff9706500ed726e9b2f966de8d7608345ac76e544a66dd166171906e5074a512aa1388196305e59ad7dbadd952200a916f05c212a7743cdad48d8c4424e91)) <<< 16000) + 0x43c92d2d32e89f5a7e8a2720402e9150004086796d504f01411d0f45280108042279c50573dbe902c754fa8b2b051595533926ec2876a809d8c239e31c505694fe8a0c9052968c0a5025219419f390810d0dd007c00209d4146cfa024120052048000206343cc7aed5a089f4807c54628301cb9475041092c3be38f01323f5f372801080428af6a77bd6782871ccb1804b03c414e43bd73028363203614201c22274fb7a2e0c22cb71e1532401195d8acf8d3c143bc0c6a730411a9b1f32e490900280200000fd900031922840ba1e586c4d9c44fa4aa11c8a41853701220a0c10b28a58282146912413c049cdf405cc0042010816781035ca0685151a61b78317450eb3de796315850a912f894d6bc7886be3dd64eb45062f6b0f49bde8841027b7f5f1880447ed3f1637810497b8b086cf10e1200580600002243e53c9dc391c5809261391b296c2848db9766ddb0ba385013beaed2e79c1a2c8950d9c809080c75e684f9c7823fa02f804b904172bf56a40f81a00ef9fddb4862df12005a068141010001211140010002f09000c693a6c438f406a98c34c096ae324f4d460e7c72ba112508a1824b29536ac20c1a5a2d680ed1d2c2195de968cb686806030ab58e954a001544092635f00007e99928a326826a400bc0e027e0213e0109e8084f004276020002a93010094578c1941bcfc00171600f834182def790179da01bccbf52e35d5044e6820482af2fb545fde53a74823d991a0bf3c7c5a85db3e2b2353ae2f9630fac0ec2ca61f29e5185040940004d0ccdc567377a79bf9766013342a5e8d93ee6fdeeb5aa83371d13bb788e53fae5f2c4c302a676ca5e10e276a501260135a996538afaab1a03b562d520e3fcd12fd2832207d500048538641587d71500f2c651b7560ea616000000ce403ca03f097dbd196309deaa2c700514b7076462a828461e9924b9830143a0bc86480a085ce7123fa2c4801480e3cb653bfffb3caf7c559882809fbefd0c040362e3d9e9000800200001a244e8142500a1270505e8284e4141060a00036d3a445bf715a8ac07e41798ae65e02a9c87e1a46589b7fef140c9aa33f4a9150a20dcbf84e44355b4dc09c549353dc48690ce2b21f5c6f123726a018e5bf904802926311403f94a53fc3a8d84bf7efc38996ecadd9f5738e0d9b92d6c60b20015ba4956008f7bb1814d7ccc124086974107b9022ac6988559bd977900ba001fdb0aa66e83aaa0655836161181aafc4186dda76d8549e49b251a62e7a02e29663572ba5698061cdadf8fd8ab962fec284e9c2eaf1aa8b4841da6680005cd373e7fe7356a45902d32c894805ff494d304ce9fe81a136c00000000000000000203ccbf52e35d5044e6820482af2fb545fde53a74823d991a0bf3c7c5a85db3e2b2353ae2f9630fac0ec2ca61f19839238411000e0000755d6b93ae8d4acd463eed19e0198161729d8f88b46934c5ddf9711a35ff86d09e033c2c93f2dacbe33276e45e39e6a760e71581e6221b2c005ea6cbd61911288bc44cede52d0569b45db7bceaaa000813436e09e818daa19f5b3f704b8b33beb6492bb430df2a4e35f5900ef9f01b43c0016745ffb292a0a494001a0c89c00ee7cffce6ad48b205a65912900bfe929a6099d3fd03426d80000000000000000040797daa2fef29d3a411ecc8d05f9e3e2d42ed9f1591a9d717cb187d607616530f88b188188101045004002001010ae1075b098ea9b9ef312082142be55a15d97b5d5a2f461fce05b09d7d07a549045f54dfce192983ae8d998ec31519cd77306ce18f3b064f14ae58a8b9488c3dae889fbf1cb474fda00096a44dc8426c1a1350d001739903c1d81d8ee07093d681487dba0d2956d0f9a768afc88f04bedcf18ad782876fc4bac7cd0031c3159f2f6e818ba4e148b3ebcb47b42028b1570a97c1ccc1340041b4a68350b00002945076bb023f2447cb2006a0a88981fc5aad9dc834a9119273cc6c2248a244fc39440a24a3549ec411c70c90f6f8b1db7145a01ed9fc3f39a0857afbe71a30704b4083dbc6047807ae6072e0cc92bc801681a00008b889702f4a5a55aafa0e6a44900be9fbb580c2890a5f6f6d515444761bcad87d316386325a8dc5f1471458ae0706f0aeb3c100000057c0d81412f76eeee6242041439959754b18e0a720060078d2967c88d02ef691240524720110b0a242e2cfcef059111d8092a92d4d98e18cafac742001c5162ab708621d6cf040000015f0360504bf05b6944488105084caac03d23829c801801e000092889a008001310f1a9738b78db920b213e52d14b2d31029862240a391e3040464f09fd20a18747bf7a7b085c5094c4fe9174281c00337a054869834003bbcfab7b402005b822ad5ecb2e159002f0380998084c8042620200027f302e764c8126810caebd58c30102236e5488091cfb3494b00dc7fee1e0128810804000042ce9b54464b87d0698000000f87050e3df7e86dec708751719bb783884f7b89ee145860dc1becf7a6042bb8b909a810449d0ce170e682963542f94dac801400c205a6c3592a038316844a339600fb03c1e20804c2fe2a0c800440100000da22600a12f050510281fc140006846074b938c2a5f1d226a01f167fbaed1e35b42dec7cf899c316ce42ad3c471a2c6e307ed21150e2ad865aa117159a119312e50361b020c376b27c978a0a008129f2c91ffc2ee6400c011113447dd9e61def0f1a86ac6dee6d10d16e45192319200714656b64d52704514d3cc80a43d40d08005402debe6c909e4264747bc1cf01e47a4d6356080011140)) <<< 16000) + 0xd594dcb212792006008800024d225c0b89a3a6ddce4f045489241f4a4df9888c78d9cfd1b2829c4068b05ee3e6830f6438a86892e99bc04a6841b59666fea8c4384a4f94fb5f553a7828954f25584880082308201a587cb9d24c9200680a089a32cd231066f92248c1f1b9d7e67c78d49fd86aaec001a2b3f43902dbc3438a6e2fc016ffec9a104c2d6c6a841438488e3c9d6fa689e09b9378b3589c00821c74f2d87e465d429200640900002602268020005043e5b1c4bb37ae0d11ee4f16870e6092f4c21f5e12c3448bffd5d40a1dbffcdb2c18509163a9b09b87007e86dadff634022c75488870005f5d5948903f120052048133010990084c404000488605e8e601008e084849123428215d1bc4d1011a5fe41d9601c6181c9402510210080000859d34fd9446d05071447b79eddbc2c35303b6ab651c10a625ee1cc0a082299aaf1f02048c142bb86634149dc37829c9608000005a3c0107f92b28a51d3520052040817380ad6be1c1c05e8c3216020f42ba481011eb7c27f2001080400003588980284bc141440a07f050001a490010d23c6bc161dc09084cf2d828dd33228ac789b928bd54b31b2c4162952fb0101102160154a7e9894708443164b9cea05801eaddc04c0b61000f18f47694ac80010c786bc57a53226a400c4101e5aa44e7d519d481e250e2809ee20a0162087f8c4021c2c102202f109705dc018107c24bbeb334f96085136f509a9510a08c861ff0aa3730808059cd3da89849a0194f798a30a39d5b969003404c000139112e05f969bfd73a9440f111c497f286a1621085e089578204b03cca17dd86042a66ccce9ac7087b659dc1b30a10adfeab25101021c98ceafbb268276f71f2dea2ee9002b0287967259ad0b260f10d221860f941620c209faba1020480d3ce43f306041f63bd7499c7085d6a7a82d30a1076195e3e28102153df537d8268257514baf982269002b02800010c112d010002301c2d12d16136fab3493b38f7f0e1a091813c4c97697e342e4bf39f11e60608b7e57baaf9c0c22ec60ef7b99c9042cb94dd639e0c148956e7d15d8b00294d2838b1ca104801701a04b0042560212a0100013a912901e19e38a4727430b0000005dc1e40000002820d1a0652b46be6864cb0c42003422b78f62168c10d9c31bab0d0105c482a783000000006a8b2004a018f2abb0dd28468434f0560f30125cd971e8c08914c68f8a00f16b66520809a844ce298008402000025e44a01424e0a0bd05041828000de4893008003efce0fff4911282474117e4630c1b7e0bb628700a7ebf39e0001210108040000394cbea70fcbb3f98dc98d22f407c0a6eb02d317c9229703d120000000000000000080f2fb545fde53a74823d991a0bf3c7c5a85db3e2b2353ae2f9630fac0ec2ca61f11631031210a11400c00053ac5724a20a2d8a118df534da10fa3a0af608a2a536c0a2226b013d284c4f2eddee26201ac6a2838c82092cd3007f897e89c6655fcfd0eba93cf73a4ee4943d835a4d789c0d23f5005f76a4bccd30e35ff0d7b7b63580a6d4472d22dc5d6fb42a2660d9967064625193ee8002dc105501c236d8b60000000166890384bb5b41603ef2fb545fde53a74823d991a0bf3c7c5a85db3e2b2353ae2f9630fac0ec2ca61f11428e2900880880060080134dfe0c4d2a97202693cf8c4a0440839acf8196fbc0846333090086af0acae03b0a2522579cdeeceaee35f19b0c0e704c09289f36cf350764a4401be53441c2991f8c93352050b8b74e285b16689614001174837988494942484a1230d00986818c04007afa6991c99f69c80b97d4e1f9767f31b931a45e80f814dd605a62f92452e07a240000000000000000101e65fa971aea82273410241532441c418410104010041ac9d9f3efb98bd70e0762e784f56d757eb2e59e053da94f7134204aa56f63dd84b9a158a3ad3de75d4419afa230e74c85b265c6bca7ca973605279d6301d5b0698d54ca31ce7f305e85eb13e45ba946d1736e7cffce6ad48b205a65912900bfe929a6099d3fd03426d800000000000000000407997ea5c6baa089cd0409054891071061040450020002b130004d912da14c1ca1d2d027381a7f48377d883490754e08100e585158d9d22272a0e7995ece5826957dd8f1ab27382f801fb9bb9a01fd904d05c8c124a7e48baf4767d93db94c61fb146615740010b0891168484842404211f0908f0480481623a0211c010004b79e1490304339d012959610108601423f9412e4b077b581fad2008c204cb91570d3b4e6e83352e52102044ea165a7153b55709e308fa2a816e8cefc038ca9551ea033220a11f529de4e7bacb71ce8c92031e18e8d17decc2f06ec0ac904449e6683ac60a852f16e1b7a4c056751c80a30492aac0e2fe0faaff535ee33b8411417c3e00008167024704e780d7820269969010230182162c8c04858300162c8cf1e58281428f87d13e82004285a580768882a80f27c35afbc8220f9b7ad904f083b187fd13c0cf2ca85805000022621eaa311b39026948468262320a1180140d4336c2367850e106d12d8d2f5c305ab1eb724a050a120277b9976944001fa102166f10e04ae10cf360aa2805e2add5db26a2a84306c92c8bf2a054d132200cf5ddce685c060c32ed7357990d296aa02cce0d25ec1318920c24c7e6e94f0c1c84e8e0be8d0868f67e3e0d05c4698cdf08040061e87c0000000942c6f900240086942ddd34e840a434956fe57ebd5d214405318e3f0b40071c32d48bf8359050404af5793917c202046e7018fabf041107c54b)) <<< 16000) + 0x635f70d077438f525d6c858047135b563068ce8f200620780002533c605688278038b1cf4ac37c6111df1b2fc8b2034b1ea9c800000385d442a084600800010d222e13c2401b2fb7d4830c20b7b8f06890f091c23ab4aa3cd606182d91e721ba20a042330ed1beb1080411f4e74ba5e0604094d0e92256810433b6a0b40748c022a98ca131ad3b8f2006006811601f185fec26f00c221fcdd00396409271aa3d3810b6a2d7ba5000dd7c185c80078e8e147b3021180400004f4888828000f2888a86f0a002df5a76098c2680d3d2b6916308bfd58bf4d41081c47bfdfe102e18627c0bcfe5c0030c0b321ecf5362825c0419c0a7d89080d7cb60dca01c00dfaefd8ba53d16400b80c1c60aa94c8d2b9e1c5c1787e0b7bcd9c4804f2b47fd8f1844e9fd8634e80980b794665d39198e08c88fac201479c002b8f33c4e0b14000c059a6cd789000506b8fca06dce209003003c000125111401e962d02f0b44a24a1f671fd9a404d64b8a92c788361104450e0a4048164d04c37de2ca8e010fb4a15959c208c0200002dc443c140780200066222263311201d923b5333099848d776c1d8abc48beef2f05cec40a3deb57d7082860f43e85db8403537d618f585800f0098887820018bfea490caa00fccc6ae4cb0a080a00700003fc43688785c0a41c6fa793094b11b1258ee510325b5abce309210bc5b0bef21e2bfac706b9542850ee81f06cd448b0aee28f6a48508757b66a65a0411fbb5121880d82400ac0a185c896f5dc1bf184b196bf14ea1144142d6d1a9af1242935c1962110412260428efe016012a4dec3ca89401778bf424aa12031ca68c258d840063f20ea0d67509002c02c0001111a20faf261b13d0490bb1478e77b83c50c89b8a1b67142a053ef77ec34917c184dac245a4040f10dcd32f00825f92ac51a40160b5ca8ed21e1c904ab5ef360f231649002d034510d157d074010922a3be1a9a6e0414ad60a727c03c1001e90154685832c6779058309057824752810160027aa4d341b2803cdee3eef88481bb91dba3c073c4801581600008648002309e1c1a2c7018899891ca3f396600f9481d08b99f3ac8746181c94738abfa0910ad1153a6c4508127625dba581d0a04ae620abece5c804692e4c844c04104c02050394d22e2c4801801e38715876e67bcc5891d0a4b68dfcd1520785831fbcf93546180bd889998df82814dbaa6ca97864804c76efb4f12f704151aa0b1865800900b7f5bec1095e2009e61a92db4dca6c4c9003204800012f91110100026c911009d95016d8af2af1039d72b86f41c508982bc36ccc9221bbdd4798b04083fac6e39c08618d96a240d005042330e524400e084bce96d4402022f55b4c2ac4b2400a8091c580bb3554f77b8b2bb8847660c4c040ea5979cbf88441860cdd05aa55aa0e090e4f3ea324983040b409d0ba9bc500a2f08ae215082403a9a470d77439001357ec704ecb787aa400c41000004a874b30a9d4a7c6902696d6068b1e9312f1878e30941f445b1412610f6cde4802eef945a0700284f247293821180400005b08878080f004000c5c70ab5d231f3eb09215ff2f33d962c633809aee1b8a1bb588b7479818503d0a076618c086bbe695f701410d1666d846440454a82c9a850802386f7bc740a24821501230a265f22fe460e2251894a0a1a4b81dc158c28d1563d7b1010dd747bb0182110a8b0608008ed05c620c0012df9e592804230080000cd910e010868084300400080a442c66214231090d80902c00625c82e00e47363b8e20403884da1c8480c70e61498e1228c188f6ca32d014101e368b7821820799b78fcc4001677a3a0a22a020c9914c392093981380a000072080167a91082988390e05075bafee7891000f4c53602436da0666a8880fc157c67ea1c26bc70d3054106f3620032d200848ee3b3d470032123d9fc5404f6c6de08a8142601040fdfb1fb7605d5ecefd5e9fa35a6e10275d6db5a07372e1f84000000000000000002209238a29221219018e10c002008b814010068000d4110615c8fc10394a45848862a95dce12409c9c34f735c486f5064c0e704062b32df293c3842b32dd673c28262168114123801e0af1c6408a02fa7752016102850030a280b031e240d091e84124034a445149321c19e1b09112728384dde081240fa4f912d090d1b7ca2b269c80c8fe7785e8f87088fe775a1c78100000012b00995a050b00a000043e44141600088c6470f1de5735240d452e80cb308140a779189e901a3e14886e71c353fde7d2fa384000000bb804049483b99310c0032123d9fc54027b636f0550204e0209242ac247678e206cc78b13730081565b264933518500000096000410a8ae426dba1c3d3ab221847080b2805ba6b301c2000002ac6004722040a80800003be4410442060b102010002119101110800483fc241fc120fd0907e0083ec040019da43e9161f26b0f83587b92c3d8961ea430f42187990c3c8561e22bc20aae3fa1be20511908078035882062eb3d0b4d5220025bc6e942040e044919f6dfe90501027809a36eca2021fdd3a1089441400a6eccf4e6a43ef56dab4c694000fa4f66b6e17476642d02c44f09d9e0cd22601ee31768e1a0f2b89905840e78107d440136fb069128210804227721d65629c328c6552b9c13bbad4c2181125eb65b920210004000035080904f457e27ec79467b355b7369ead848a0401d4044075d16a5ee7103da02f76eb77fb64dd1a154635eb7c82f4bb1e5b6b9340cd0454af14e983bf9b38eed6cfc31db67480af29bdd002757ffb27a)) <<< 16000) + 0x33516eccc9b72c69cac7890f5ba2fcee24d3828fd36d7eb84d775cd53a2804287398f3931ae7d5817460248667a32f0401c58bc3e635385b09928b9d6370319945ea49cf1f71de62ba8e7826b198631b6e71004d9043cb5d5b900bf1e77f9e8eef8bd01525018dbbd2bc815bc4fedd6f0898fbfe469793bf03bd404bedf5d3b0c81a1a78000068621121b0f00dc8f394551fde3ab13401ef88a1008cab2ce53ba334b06f351c7991f723074ab06d6393c72159db7443c69250dbe177ea96e0cfbc2af1cb6581ea0380a981166b66c75f71f83c0b645449170e28b1cad9b55b065d71a930d9e3244b221a893ed5e0de1f588ae210a0aa1aab0bfa06728924e785747844420079371dd7997654da94a20079ac0b1dfbfaea5bcb16015e0bce63d1dcc621fe34f58b204e44ba97208affb17296d460a10748d3559db1451e27c7a0b7528401a0216820102d8f83890107c02000019e6260a2a3fd830c4154be00707269aeda430b6632b99848103e0100000d221de13cfe1d3ec81be99222c4bc536ff7d0e1cc5046469a0e3069a05a7e81d5c864f0d14b07a382ac88aeb227222bac8a3222bac89397ad8eee11a2059659a1040a003009f40757f485ed41d9551a83882619f8e22fe1635d717ae41f77c1adc27437b77d8b0b9a0ce9a3984fdf3dfaf4cf3ebe9edc2886b1754000ed8877028002c848768ec3b0070475cf117e483002027ee2802908ed123001f008400004010000044600802008000022209e0bb2c43c0e43f89bd086d37fd3934d541ac0c3433bad2ded54d831e300b6575bc4c484010f4d52c2be13b43d57b9dfc4db49968682179f8733c9cd4e43029457915aa5e3900089b2a632d5319fad0f6350682bcbbc05fd8f7b059f4a901d645171d905e3c80ed4c5b09d62e960e54ff710fe11efc5de343039a0162e209b1fc450c7b16c00020c902811c010040101d603e3c4d73e94123036048eb2200659e9c31c05762337f84810400100000d421d41bb2e7600dffd973603ac21ef402dae14fc017d696202373a9be101b01f9517d847b1c60545c20312d8a97b1018609aa53d6801beab150c032f2393116de38d06a3d1736951d0d83c394730b07d47c818bf692bc5cff27551002db357f13c989715a2a6f6cb6036768a5558de23bc71ae5b9f2b1f3b5634b4162737c2d7c05db391de304478f03ca14cbce8ec473b65b7a58fc404066786066e137db9814124557ca639bf075f2329ed79014da456431cc5bd64e7fe09153165914b957e55e92159f93695baed5ad6e955b0fc6070c6ed7f630482ab0c4549340000d8e40020748748683a0241ce0a000df121cc338208e864ceb14ecb9414e82f37a4fdb5f1420063f744fa30f26815363724888ab14c01c08e9f597c9040c00302554cf548d815b0b5d33ceb5f20091ef430fe83ea5001d54b8c240bffd66b9318b0dc1700005064394561c803e39697d7bbaf65987ae2c54c23121b7bd4feb777bd153b705f5dd120e9ac157a466e775273a8830918022ee38c9294f2252898490430a01386deb89ab05150b70a97fb8600850c917b61db80bb337e24189cf7371a72b43110d7f40d5480a0021580ee0b25205275de8a1bd0e33144e8938561b5b1c300800000f0887196e00802008c30194594501c7812f9b2286185127eb7d3800600029d09000609e3d72a08440080001083c588513ed0cb2c304ebd4a30da2c022c014565ba066912002c746ad82a104200800010521c41bc1811d66fea81f2568dc92cbd8c063954f3261e4b77aade03933f687310d830d5e7982cc83fd6bccb0342f3937c8bcd089fc1c031c30e5e3b3dcfca9443412c21e16172095439aa1bb3d5fb3d8b97c0ec42c8b78d1b3c39d297a1e7030d3109b68ee786d20f2a8eca61dcccf78fc6f6b3f454490aab7d04ec62925e471e2c43d8ef3e08841d8424db3a8d4733d36248bf6d70c23a4c816580c96e09a30d007c1a3c8a2971715fea6823a02f2b69000114d9d0215082200400008510e1090002f690e005c53528f9e58f0e2956796b9b500640fd8a0d11a3eeddac59000000000000000000821094aed059a0591a6838c1a68175eb503ed7ad40fd8a8caca62a32b260f3222bac89c88aeb228c88aeb224e5eb63bb846a20840618670043ff102220defac3907917389ccbba0f18a169436c71bd3156af5068ff09bc8f9438b875f170be00e34f27af311fca6f7dfd4d31c7e8e3e67394783c15e83645f39da43c10304a72f70d25419354628002a010df05c53528f9e58f0e2956796b9b500640fd8a0d11a3eeddac59000000000000000000821094aed059a0590618e10411a00c00200861633e4cfadd745fa74e6007a40d8482ae05049ae72b24d767a9847f504b085f9156dbd2d40751975fae253c05dd12b54feb6b62aa78712d858450fcf76033c8620b12568001dc103401c53528f9e58f0e2956796b9b500640fd8a0d11a3eeddac59000000000000000000821094aed059a058a2b28f17f3cb2383553e82b27e981755eb503f315195943a7380a60fa1218209800a0060082818a3bb962853739e9d4c254c215accf6343001109c60ecaa5d39a9ae912798050aa7bbf27538d0c2ed323eef07a6a7cdb1e0e4a3dab67c7212575a5635cdb7f0a521a76d00049721bc420dd1506e068048341681a00170a21b68b0da4186c90c360861ae0393282fa7decb06e29c1e32b371152caaa0864ca0be9f3194dd69c1e32b35e768ef0020068305bdef202cc614d04b0500050000003d49567bb6d102552b057bcb692d31a04dc3b30e42)) <<< 16000) + 0x5afd6426f9296f63c353876c291c38d93282fa7decb06e29c1e32b371152caaa0856cb055a73f466c8bfe2a015068305bdef202ebd6a07daf5a81fb1519594c546564c1e42871851823412c1024a197ae707965787a5230b5c1f3d1376d064cbbbaa374cade7fb3f65c5dc3cba21b01794b272090763617f3b79119bfe4c038510d92ee869828000ed886b08c3544726505f4fbd960dc5383c6566e22a59554109f97d575d891b025a3dee02a6a16acb2a9a05d7ad40fb5eb503f62a32b298a8cac983c8688588102800280081dcc4afdd5adf46198bdde9a2a6367bf3bf3364254dc20a975b591a27f9154fb52620f9feec02c8c85c528839046151cc52aac90f24e1fd680f531d30f44823492edac203515fa59698030a1215212841000420500cbbf7c9652753631d163890dddfc8e30058e7cea0093c35743960d26bc0d04c0040010f300a5f68220518f53f6040190c09412583040b5e90a01a463a1402027032cf498007c0200002466c9c7a1b98d2c337218d8b241299ec63c8c00800210281ba8a43891316a814bf40901654b8d9e1822f0fc1860cc4cf60de50039f4673a1c01a281aea4e004201000015d200043a4001280c0ea36d63f0f1b5c9e65b9a3228500f61c085e2434e050307c0100001a443502764015fc3f48c1827eda5d670b90acaedd3401c1a23d38c00625f4030500d5337edc004c284201000013921a60a000827200178843489726505f4fbd960dc5383c6566e22a59554109f97d575d891b025a3dee02a46045844046805001800078c293b98a2f08cc48d98e3b2074f2dca01ff77425b3d2e5b8181d0029c58e28beb4a2318b04a8f0439a240d55b8314408c94000b4c8688ce844d6dd4e266d1cc0c8e096a113b30503adb63587a183fb2fd5c88523fb9c60052dd70e50e3ddb8a2f10ac0c59c0a00baafe85de7ed8ddd5bd5e71bc6d10016e2e2c219394fbbec8178617a5010074b8d0c76d21072b6bb93200d7880010169da3e7e2c5d22fbb5b40c439384bd438543968be814dd37e94125be9cf935608b23da9d786cc60de27800044621a0430cf1581406f473efd15bf2820defe7811029957c05840024f6b4271405ad35e79040801ca9a00049860800218382aadf8ffd2ca950117db20bd62d5bce9d05b6d48259f7339818ccfc63d8c9f447030ea238a395712de93a00df0e88ac2b65abfb0b14e58c46567d43cee11651c698a89e95970a01b59c0cd7b234e7de8a1a516f18cc5cd4c0719988c7fcd20f48b1d583261f2387e639207e5979811304a41ff8e1ec70170758abd5ade81c8fd63235ee2d677a3155d95916118cf2da504cc6e8d581ecd4eeb92474af944bae95b8aee1042d250e6cb7c2b4d5702244b22838c2479011436eabdb0440d6a7f6fb1e011615f1e680412c18f92020f0042c38a71e9d243db390e788007002150c49a77c2807e02347238028d42cf46003a01000009d2000252400083ccc2eae2230980a01880c24103600880000802209a8cca48a011245440202629d56c00111f252a4001c00800005f90ce01000088900019f219a13e201224a0734006cba44480260c636e0230c1e0080090482c80400019e4002a8c8090ec30c360441ba1419bb38a103167bcdde58a684e6d6940ed022dfc68042a1d7c12820f0043463fa8273306ccf4599244e6d62cc2c2cfaad92900070021e2606fb354e00dd02f0a381f3dd7a18c007402000013840005e0c8a2a57fab9c1712bf986580b19130308076c0c34812040f0040000334c09382f920202e9b7b801601e461bd009860e802000028486608e00802008c24021f743200284789f22c011176f962012c5cb12890107c02000019e432c27642e435690a0557797c66014300cd10230c1d00800005110ca090000f990c905e061b358c89c170f2054e50421f6ae2046103c010e0a2f4dd95be458954bdf51bd11846d5121d7d2959bd302e0e3bf40e46405650e77385c8b7f28201281a329b4ce70f8135c077e71b339181f065fce4c6382db52ec3e19d700f38d5271453cc00d63cf2dbe3aae273bfb6caaccf6a549240b9cbc7f5c07988e171f4921849391cbe3742df082c762625112b8cfe26fae9bd8a0494487d79900602913d23d3087dc62742448fa22b0dbb0195daae479f30abae22fd667b7759cb7dfcb6236bf3bf5cc1e1d40ef5546a39c612448280005d43c6a6c19681303965a86f858006597a7020199e416c012060f804000034c86404813c2418e020007bf218c220c50100073490c40de0c780c6c1d38167910044960cdc3ed86040446b1f3540120810804030c06044030c201e0c2fa4de753812d1ace0e960ca176c6684069c047a5a48037344fb6000251c2100800008810c1190360480e4141800a00029b3f97d575d891b025a3dee02b086778dfdf29d1e5e96800a9e1bee4488d10c7bd3e5158339a45daeea2846f2fb545fde53a74823d991a0bf3c7c5a85db3e2b2353ae2f9630fac0ec2ca61f21421200c0080040001d636808b9d1569aec7d45811b8011081043ec7507f8f6cbc99102b13ef160c545b2d50c2007f67d1e905ab790290d7308879630dafddabccb9c88243b05d4867c82fb6abfaa6a347f50004e5217e3201e0900115590be4581c8ec2f4772259d6dc9e9209994bf849008393deb700000465040010d12993356290231b3b75324242960f64481160f78bd004024281f0080000709d327cc07601438ff96670285ba6005165861cb82f940024181f00840c8d21c514b0e08b837f280725e960c0023181e0080000561813849)) <<< 16000) + 0x46ae9a12ad51eb8282059ea59c480e5cfa7c504090707c0200001b642f0541762a0670d00016a9b2a72628d7962d07acdbc203147141d43875410c24c606b8da0fc80054607c01162c60920260e1f7f316e8940ba2ffc8e0a09f324e5810018295cae0004a304001000010920b6320ba1505c8a81f034170020002903086778dfdf29d1e5e96800ac53528f9e58f0e2956796b9b500640fd8a0d11a3eeddac5900000000000000000082f32fd4b8d7541139a08120abcbed517f794e9d208f664682fcf1f16a176cf8ac8d4eb8be58c3eb03b0b2987c848628228020018005867e68f22124427c254aff4719cb45c3e70b13eab409c4e39ead3be978a9e8c2424f4dd3f22261e0ea4aba2a010426493663338877d39f95d0b086f8a1378b1c6fffe7ed250a05025cb854b27f354dcf82fe8ba1c67282a6ac2a2d0005ed21164a0b71905b04828c2416a120b4010006eb10120d8025b0905c01e1802faec9949a1d02dc11a0bc8ce6782c21825c446945baa5b561ae6b188d23090978aebfdbe2684fa866897274de115182009fc681148b802301250a24e6284430246548ce8032b686bf759ae2c3c1be5145500e4037afd837a5ee57c9900a18df25005ff060b0e33a7c9a26a8eabaf46ec881bbd644df5a0e8777c7bc0f0be2f203eab04e552590b86f761a4ab0ec2a8a6d05e1240df4c911625e29b7f9347e59b8233dd9e5c21b902ccc500f8a31ab2973753a415499417d3ee1213442383c6566c54a24e0d0890914514b04804605084b6adb15c525a24e2153f576e744f4ceb141dde1661420ae7a70ac00005d41e9a07517fe3d52924f0479339f1a3d264730bc3681f429a6c9814290076096f4162841454f90eda7f39763f3073cd65d484021403cee4b8b3bcf53b18ca5064164c7be6e5b0c0c6f69f462d0d7da785dcaac570d3c72dffbccc7013ab1a2b6631653cb3c5e60d73dd4727a0a3f90e00f445ee07d8269a00ecc391eb5948c52339ca41fc90d993c1f3b3be068748928c633b11fa70420200869c0c951b3818f47efa3a16b8bca6427c0139d0034a7e3d0807fa38740bc56bdf1d14e258770000a1042cca605023c31b51fcd7c186ce62f7303c181dfdc3c9602af2731ac0024182100869a430f669018402dd64f4e4110a73fd580820a36e9db85001438e900004a2044010804008020048241640200004c21620a00018b21603b0af1185700f4d4772a6990821b8c56a382064111d902600450a8fec080238648468015142100469af7efd3582080cd50ddd040f196ffc8409861080202b424158020000d7204413e3e8f201b4e51a1cfd3aacc936c78b6bc07cb17f8597fea851349c4ef525c8813a1217777d1687cb4934270c4f9574941732eaba5745a160a7b26a7c7c1d80195730416dae6112a85e3563e0871781797fc5177dd06c4c2a42633a29919a8706305990826334a871ef028f97df69202ca1f3e62794cbfc8c8ebd775468c3bc738c11362fb688890f32c97261f9c99d8313d48ef8a9e4eca332aa15d1a52c2eaf5f153da1204370934b2a546236f4c2864f286e45d5529aa7ce0b10db5e7247d6a7a2c822f83b9874db8d444c430d213ee3cb64b91ef860072aad5018175ef325060c089b10f18fa7227c143c96bb58a872d5029c2b487befe0460641108bc1acef7cfbdbf0ff8c87fc8ab6181718ad631c02ac04154020008b421521a0a80900058590a7290530ec2944614803aa660b68dc8b081583186a7addea77c7ea6fdbdff82906850000000000000000020c53528f9e58f0e2956796b9b500640fd8a0d11a3eeddac5900000000000000000082855074127e051366d78819a8168594700380100083ac8c9d7185b630f5fccaa2aeb9908ea8fcf8a3f675f74c98418f65d1c6e1de97dc45b9e9278c3bb0c3010118a0c9e774aa6d865a21d00cb888b156f8fe3bf0ae4d994cd48fdafe549570df509b0fba910004f3235805cf2cf46a4aa0e20f0c1e9b5ed2d4acc74cf233dd587aa54ac492dae074e105190f4f921a000d26409c34002a06428d2604a430a221c8c7fb2ab8e2c46495387b8820ac5bff28706533edb8000120c1080402840614003a2474603fd2583000c1b673404d4decf10c0192d21668001242021008000072909f2104f0e8274741383a09b1504d0a826424050120980904b8482582412a02000307200435e715ce3f9f516aaeab6d05b16994ca9abce38b9353cc45fe0e13e71726a7988bfc1c2808ca6d05e1226b4e077d8978a6dfbe20b42a011134a121d3af9db4c035f3b697e3370304e044648c38c304280a2888144ad576e60ee982a587e4d41c826066c6f05c66fd91689cc3b9b05dd52a63abde47c4a590325f3acb7bcf2ed15f1df3da95d259072362fbe98fe19b612a032c9a75605106e6455d3fc6c05695b16b76ce0d8b2e79f248210a7f1095cbb24885c9c7db21210c1c48d22878bea4c803122980b81eccd7113405e24ba0e8f44f3cf904c081092e41cfac4df0f1d28cf11747d00a000e42400b644805cf01924a684ab877ece257aa0604d77cad4cc3db9c25ce18efd80000000000000000406e3e27f2d62cd07e3b96ca56f2bafd6af12ae6219a4465e00000000000000000000000000000000000000000000000178840c30460050010104151500037206ced212465a254e0e970c58761ecc562d379666da75d3a62078164a72c937b25da354530d04ad1dcaa4cbe2ce3abecd330f7f730291fb097c1b909eb2db23104765883c3b0b05709a7100f6c4b6200170911897801f99d315efe390ffead)) <<< 16000) + 0x863213c05d38214214bfcfb10a409975f8b3b285011d4ed794bf465d0cdaacaac9bd0940100038a900c39020201ec65cba9368a70dbb8ca625e29b7f058314bb81214da0bc2481be99222c4bc536ff268fcb37046b6582ad39fa33645ff1500a98e10a10408c0080040200906594ad7508cf9f458aee66ef90bc2e073e8924eec1315096c020669dbf78cca5ce93a8e30465048f7aadecb71341ec31e6315173f874fb14e1b77194c4bc536fe2e7475a20245b2c1569cfd19b22ff8a80565f5387e5d9fcc6e4c6917a03e0537581698be4914b81e890000000000000000040c787a3c99851dbce012190564fd302eabd6a07e62a32b2874e7014c1f52031830c20814412b8953d7095f78de76f9513ef198dc128980d1bbece7776aa426f089b91f4e59ed039ea754ed53d523bb90ba80da527a352ff407eb97025cc0131c63e33cdc0f1cc873759e2011d8de9844e6f7684767a217cd9ea342d5e50284982f3f874fb206fa6488b12f14dbfdf438731411800000200acfe2182a0ca0de7f2cda7cff044b6582ad39fa33645ff1500a99018c18610408800200000045fb38a4e7e6e99e8bc06e08f329d11067c5d0b2baa892baf102f2d92107aec67b0c033c2a445f90e5c885e00748630c22a68001b99092150090280026e081002c244161200b08f05793900612a702de8431cfa76e3255bbe000000000338644f1cc2521832421c11811410811c01f47a058d0d684d45b39d70b652801a7842caf2d150c6555dca18c4bb14d4a3e7963c38a559e5ae6d401903f62834468fbb76b1640000000000000000020ba2a075b3143cd9e704061366c0844b7ce15b6992d5920bb40000000000000000000000000000000000000000000000000c32d69127a50a0598c19210e08c0840a80975ea3588530bf78025a96d84098cd580ee82c6d8a27bfc1195e96b667e4bd2ef472e38eaeec25735b96878a0903cb25af8f6f5ff6bc40f5648800224f0c9af9d07dd380ed217ed1eaeaae6646167e5fcf2be9c5b259fdc8fbd9b513c3e8d1a89318e9a67114ad79644feaa11742b5ce7ed2f507cc61dd2f002bffec8436f109a8174ff7054a5a54ba000ec84238b611a4308c218458ac11c560e02b0121184508ec8fb6baef82452660a31d2411f468f162003eb30ef90240c200087a10c73e9db8c956ef8000000000ce1913c730944b28d18d10904504d00b002eeb8604003400049480908ec8803180db122827ea4c849112a54cc4840037ebc9d90240c210087a10c73e9db8c956ef8000000000ce1913c730944b28d18514910104d00b002eeb860400340004948440680008c08448ac04857e8431cfa76e3255bbe000000000338644f1cc2512873052850c3141300200000001c0c00803638470ded937ecbc5b09dcea1e7fd615ee818b6a5f3f44615a00000000000000000000000000000000000000000000000000636af3ddf56c714479a798ff05b32364e495283ac70488d79108000000000000000000000000000000000000000000000000018c8a1880c50c30c70450430406e200200d01211044048000f6083f8680014dc83612c04896072330221983588ec53fc910bb49cb5ea6d92b905846b102583e12ca1f01e3384994c1fe22a060560f845f92dcee9c209d456478d80825afe3d69f94427b45e0ecc2c9ee1803f1578e9cb92c18711a4f01b251060184987a924e61a166449cd858080000022a2b5ffb56f35a6ff0bf605cf1007dca5af4d8c1be93701f875980a08d944a4ed6f1f908b6bb1c3689a00010e0d0f20ba8f3b20418bca6a9082074667d00d042603f6a21825ee52f411c0066de1590201ce8de54402710210087a10c73e9db8c956ef8000000000ce1913c730944a1cc14810a0c308c00a000bbae201000d000127210e2b0120dd0f0c43b23920414155c528a08062a0298700505384921000908ec4b00944084021e8431cfa76e3255bbe000000000338644f1cc2512873052042830c230028002eeb8804003400049c8430881b0240004ec41b086072230221183586fd08639f4edc64ab77c000000000670c89e3984a258a50a40a3041043001801000802018300100680009d90631900a048001cd484280f470e2844b0287ab5a32242030a42f81334133ce60ed1c04db771a340944080021e8431cfa76e3255bbe000000000338644f1cc25134728730520314334210230040c080080340004ac8140ac048361081bd1c0a383d38a1f2299e4a450487603c287010774d0b420132e5b59802510200087a10c73e9db8c956ef8000000000ce1913c730944d1ca1cc14a1080c50c504c00030200200d00012b21022208011036048000a2883612c0e4560401bf4218e7d3b7192addf00000000019c32278e61289629429028410608c006002002008060c00401a000276629a947cf2c78714ab3cb5cda803207ec50688d1f76ed62c8000000000000000004193f4c0baaf5a81f98a8caca1d39c05307e9479238b6be6f00a519c57844c0ce2bc225c2432c82463821011000801290246ac984aee60fde60bcb10cfa4ccc3f41d7c0eff3ad1d0474783039a5c61262ac12c118682e62f4e2e8fc2579364eaaf4822d6f3e100fd0b11edae6f0b849318643cf3b243f7a052b26e3f14277a0ac9fa605d57ad40fcc5465650e9ce02983f4a3c91c5b5f3780528ce2bc22606715e112e1219c49849210611c08c009a4684955c2ac5d13030571464229bdd33b336c33debc665316b0d2504ccffa3511de5da5039916498a4b420f78614c0296f928124caa20712386e8)) <<< 16000) + 0xe20c61254b1933b06061ef4b3800484300ef8afc20565af5ad8c184b794dce0600021da3a5e42148102401403f82800070480029b1b20000006e10d1a676df47ece0db22bffcd0b08c062d4d585082ba3bcbd8d068ebaf3c94c00000004620b00bc66c809840073111438881424010710000006e11a445ea8a30068c1aebdcb30a1000002fe268230d445f10200000012c02130811004020c140002a44208040006a640485714d4a3e7963c38a559e5ae6d401903f62834468fbb76b1640000000000000000020c9fa605d57ad40fcc5465650e9ce02983e471059049048c708280180430396078b30950a5d460d1cd63dee80462efbda447a4532fead4e32ee4deba8b6c3a7206073227f2504195d038f73ab1b800e19aa5cd921fbd02959371f8a13bd0564fd302eabd6a07e62a32b2874e7014c1f23893092421421020c1180299a99eb4fa1e424962e772f20cdb2c742d647ea299d5c6064e304be33843e8c97c963614e523896f350dde3094b6bd53424235cd69b6102f698d5620c12ed71a4326042000803f8080005008001ce9d20e7cd018851640bf160b6f21433680fddc7030498e8037efcd06f4ae101fe040898b7c9c413001194de79305801787293c58a002840d64c20e49082701c7109dd4e8d41a4778bf87a82065eb02b4d1210fc93a0bc102bd5fdee5020000002ee056042200c041808000534841008000dc88140a8204541002a07f0d00059d106c2981c8cfd08639f4edc64ab77c000000000670c89e3984a250c58a50a40a3001800000d14fc363f38b463f019c32278e9c70f823a0440a07e050100281f4140f8020001ee200360a41ec740f41a07905001111907801001c3390042b720060293282fa7decb06e29c1e32b371152caaa08610cef1bfbe53a3cbd2d0015476a722bd8202ebd6a07daf5a81fb1519594c546564c1e41441c214214124003a2445834ffae1729913818e458accf809805f62148c09e6504e320c2f12f738f57f34af642b3510ffa16e3f12eca062514cc2bae1413ee0d9e3071fa968e318296fb45da10020803a124600141ebdb2012881080430a146113532033a9b7b268c1cb3d20a3860a29544cbc20001d63ace2504210080090281dc040ec0200014220004cc41d4660e8330730d83906c1c42608e130700983780c1b8060da03a14e660f3188174e56aae0511552a8f3480bd3d9e454c07553a6fb0a0271b89f04098308002142a9fbb8a888155c585cc03088b9ee7c6202c221c505a48104201006701000077106c1180908c0e4260441306b0583502c1a4172304279f1ee1c51cc47b41a30a36baee21490cb86558a31610d4d26e7a14284183519258234a2122f800009c908c02163234fbe19a38ad7f1661b0c2845872f1a4874e4db1790a12815b2f124001adce6598000131211004000051ce0e175592964a1c19e258d390303b4da05e1c61ceb87aba5088806b7d1cc0c050eb40516196405b330183b3102720600502846010802b3f8860a8328379fcb369f3fc11034182def79016460e40c38c5083064044804000060500401a00027e6c64853092fc715e3fa1de72439b2d83410509241cf8da1c1074f8fd6080032fee4d400098608802000028241a05409e2a0670d00024c100079132246c3ff12830611a2f5060a18b05d62a23845c3ad216061196a4c896282c747b32000130a11004244d646b4bc8a19534535a040d1ee9403a3852fbcbfe60c22fc3bee50a092256f1a460069aa5452004e284201000016620cc2a065150320a818c34028020620100019f18a6a51f3cb1e1c52acf2d736a00c81fb141a2347ddbb58b200000000000000000106bd6a07daf5a81fb1519594c546564c1e21c21821010812400c0080000410a95b7fff971db0721763ae751fa3477fe27e7e5909ede0752feb16c41f363d215eef0ad8b8e48afa794ab60d936e77f2f528e69ac5bd0003b020c2520600d0008e2905f2502f04c174140b803c212d21995c80cd72fb93050fd2a077487050501a654c0375cc20605024b9bf68c002618200086922884070a4880bccb77c309485fd1b64001f9f7024014102000469213843b00489d66cad5e3083c2c026a11841000400482409c020000d3203c0a0001db20b63bc206c0ee87240641d7ae4d1435c30b56b060f5dfbec18c00e9bbcaf8280821e32600026142100861007cdeda42032e3dc40b0a1b28e23760c04938ead861837faa37690250c2100802d0480780400026441202408e0a0002b020b22b0580d81a00f833eab17f218142a195c20608f369b39ca00213e87c62805f3c3e7110014af00208206d767ab9840409c90840200ae220560902a8280006b082a1ac14c960782b03b1582906e043bdc8e14400bfeb007c003a948db000118a0f8042010020089039c8f6cc21081c00800002690510d0270280002d08130cc0486604a1b0220d82604c12c17433d9c5c6d100d38ae3fe0809a47923890027053b4780002cea9a500000ca504001082038cc4d2050605155df924381d36b8680118a1080428399db0ca2809719bc10024283800800007a3211ec481821a8adbda5035824243f307ff72dcd241e2e6de84aa72beeebc553225102d4056a2d8ead8ad0ee4db11d75e40519996395ee280c3a55393bfa0f05746cdca098b6eb383e8311f0e7f3ca61f9e36363608602c5b3705e62e7ee20b871201738f2c5ca10bf6cc9f94fd85aeefc556e7595585949df57e4b1e1ef1484a73696d57dd4841fddc3912f9f4adec2700010fc8b18439eb3056df5841e40cdfc01ea07)) <<< 16000) + 0xc840bc5f15205b932372c08a664bcf376d58fd8103dcf01f0351db63956dd80c8089e956fb2d584914eacbb7a054f47b91ec8ec4a03a274c7827029c0363bc399e33a054b652d8c23197655c0003bf1050150278a81383400123e408c740014c06010020088000080230105d1a5e20036008000046209a02000098300061eed5c18109f71b6811060f00400001ec81308c094160440b04c0582580e8413ef31b0c804471d7d528a082c7b69140c10a20937e8083ba2f72d602000e14042d80130a1180429b417849037d324458978a6dfe4d1f966e08e4ca0be9f7b2c1b8a7078cacdc454b2aa8215b2c1569cfd19b22ff8a8056bd6a07daf5a81fb1519594c546564c1e41032011410c1200009583ef50197dac1ad64ed054758b44e3a120bca6407521bbb9b45d78dc5a6e74029ec9ca88e197cbe99c211a975966e7793bda93fd4a7cb1b02e3a9514fb37e8002239012150250a808c54000bca4124840902204705000409903401c0c11ee5bd220510cbc086080024f7daba0118a108040094260400b04501d10acb5fb941431178e0bc08041d133c15101a0458e6ec204c17646970c00ad5fd5b0026102200850c0360115c205a488d3f520013225ca4040149c81f9410042e1bdde0128810804000042482308808c440441a00029f3222eda6255840ab5a0bc766031a0657a00403870240420120a1080400943608a03a159581bd2050fed45133cd09fbbc600c407b77461f82008173fd0009430800212400c4136a0a14cf4696ac28935327fc334326f041b08a1b18aed6e08007af93dd00807d710d600270c210080000b110230d0110480802400057e4110740007f0410c8403a42042150208480d01400104c41008402422001d2220080a9a5090e9d7ceda601af9db4bf19b818270224d1a8d7c18502c8a087046043048011e36b3c57fe1bbe9ab7b26981e92da40440f2b92d6f6ddad5478bf8dea777affe467ec7be495493d85f2250af1989b39589b6e24ef6b91a53052076162e2b9c7f3ea2d55d56da0b62d329953579c71726a7988bfc1c27ce2e4d4f3117f83850119b8f89fcb58b341f8ee5b295bcaebf5abc4ab98866911978000000000000000000000000000000000000000000000005e37b7d5e85d029346a35f06140b42822011c10c105ea08cc1796d1f879a77e61885745015a40fa6f8e69c7344efd519d31ae3a1638cb6015341d66dfd63fdbdd5ae6cb44401f167afb693dc98c0da868558929ea3b69b2faa5779c6011147aefcddcaaa6fe239398136e90fec190ae17478e8a267663c3ee360865683f40f5f9365717a9eebf6acc84d59f7b08ea74780b152fba888929b38ee3e926a8c3f3676231085fd60a000f9440fc9607c3303d1981e06c0ec360241b03a0dc06004010072130380981b84c0d81703c9ffc73f1811ee5857c180d34b2e1b040257ef9b80000090a0800200001c840d4540680380800802201802008f024d7b7c90820d80420080200800002220661200009c20001b240985604a1b0200981902e8bae4f25504028f064ec20441840010c29cf963b218305ed2c82403072feeb4b02043f0bc812060f804000034881206808c34044120310500f0080007508180aa84437547ca785758ef044c01ffd6d920a0654944150090407c021c1c9ccc466486a8a34020c0663a69162813846c1a12020f004201cb3d4514706d03b8c991020f00400001e08178480b8240003106c8193d3366704c27e164c40800092f89c0f4fffffd24032800a8c12840f80400ac140540202d0100009d901215d08a44b6e48c02cfa42428a0533dfd770230c1f00878d0ee7d2547020b63c7411020f80430367bc68f484107c02000009a60080200802c0100001b90001333642c7b5de12064d64f71000c3d793020004d9af14041c0040158080a8040520200010120502a0270d00019e1026218128ce02a700faf00419fe9425e84000d0a5ac4261042008a1c062a2d9638604c49077342000125f118081e1726047053f6dc43c0830f5c1bac2000c9fa0a804e104201000016020481202309011028084140400a01f0500f008000ae080051b901d290006ea901c3100d808003ee480d1480646403022001b7c20082c64016a38ee3e27f2d62cd07e3b96ca56f2bafd6af12ae6219a4465e00000000000000000000000000000000000000000000000178450c608308604504404300200011504c1a0080378b1f92428ce0d62030000007530000e1d6e3243ffe3a860c000002dc6c0010275c156d0e996200036cde9800440c02a62a8f9fb6fc20051ac0ea9adc2233882040c40f1c79a793b4138406000000180070c821299eae0c18000000960181028e68137e202000767361420419dc3d67488ce204e01000018d202e2b0161180a88c050160260b0120580882f2e0bf507844a17799df7874078b998daa1834f8cd781d29800000000000000002092494d09570efd9c4af540c09aef95a9987b7384b9c31dfb0000000000000000080dc7c4fe5ac59a0fc772d94ade575fad5e255cc433488cbc000000000000000000000000000000000000000000000002f18c30c20e10c10a101e02e652da9f05db59d15d593e98df8c0047b46da8d16faab6e590a8c7043217cc6ca07a27e89305c68800adbf1907891de3c84e437131e02b14f0cc58af437dfa50a0b42f924b47eccfdeb470bdf63cedd4952532a0202a00f11007008001b1080059b900d3100618802c940142a0090d00406801c3400c0200501000718100459001928008440020200001005cf79)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 31 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase5" = "QuadFullTwelveCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 31 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase5 private def zz2310:"s0906"="s0906":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase6 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l16 l20 l22 l27 l29 l33 l35 l37 l5 l51 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x1655c90ee, -0x2cb4175a8,0x2331bb5f0,0x258], ![-0x2cb4175a8, -0x14e9a21fc5,0x80e032414, -0x31dd4f7af], ![0x2331bb5f0,0x80e032414, -0x18160875f6,0x54b6b0599], ![0x258, -0x31dd4f7af,0x54b6b0599, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(0x1bf0fe7,l5),(0xc5713425,l8),(0x50985663,l10),(0xfa49776,l14),(0x2186572e,l12),(-0x2dd78a07,l16),(-0x814db20,l20),(0xb75e26ea,l22),(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x79302,l64)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(0xc5713425,l8),(0xb75e26ea,l22),(0x50985663,l10),(-0x2dd78a07,l16),(0xfa49776,l14),(0x2186572e,l12),(-0x814db20,l20),(0x1bf0fe7,l5),(-0x79302,l64)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x1043300a0c04000011024038c03000138110058c0400000110f014c0200000000f01480200250982402d003000000078024803000014864090c03000114250130c04000010844058c030000000b00248030000000d802480300001b024030c030001a8210058c0400000190901cc0200000000501880200000001601480200001d8cc050c038408608c0749005000008828030c0300000002b01880200002a0c402cc03000000f07028c0200000001f01880200310c84403500300000000e014802000000023018802840c208402410050460c42100e500400000001b018802000018848038c0304d08c1200c900405c0a01c0175004000000098024803000001109018c02000000070024803000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x81bdc27d86f8c28826836f11c46cb3cdf8c30858449b7e870c4372ed8d0c10b6d4b42a10019791efd04e084601081ad3436a5b41228000001c201851f7dd1e25c3083ef31d817870c5c998771f8e11c160464dd2411ab7d4f2f03812952ada230c4021380a00006f881200c02807c5d4f97d46a808109b4b7291931440ef005833a080c7770ce11d11835c3139b820050cf2d40192a80802dca0a995e0000afe476634c14e48102a0200000ef1e1aad939d9c206371f45080e1586f5170a28401df147088107c8162fc3023e52ef14040824bcaee4004e284401000016c34a7c4032867dcc49e3fff0c4c773ad3c18dd471c14381950000000000000000081f3b8ba247cee2e88d9e35336c000000001090a18c10c08608c00a0080000dc600401a000438408c46044230210d01004807c1403c02814145b0adeff21c29c5e07da6de86087fbfcf7cba8142086bff003458800360b04dd5c81c03687f2036e4450010d7fe5626b4007210c01ebca443cd5216caadb87182e03061436822b9a51080fd8ebe08cfd070ef773b27c9f0908239f2fc5894604cd1ce5b36c890012e2f51317c6036c943450ca901b887142c03040ef5279895f30a19470053818c9030b38ad283df186b8afa3057e848a1bf1e640bb05107f86f57ac20c08173889b07f1c030c45cfab402802a9817bf613e84801581634a5d205980c0a89472a69104af1f5c7143a61fcc20a3e5f7efbb76d0d41038001fc457e97fcb8c304371a03031567f9628685b1bac45fd5693187080000054b63fc3ff74259682f000e008611000026a303ceb56155f943335be6e8e9030f53189288c377f5aa1e412287a6fedde0a2818d14) <<< 16000) + 0x4ce0a21566c773a8e01ef3aed6a0a00dec4bd6a5240090051a52edb70795a4a6c39534881c1083c44b58f0fe61055b65ed12a09e86a081c000fe22bf4bfe5c61821a9c28cb37a05cb14342d519ff569e6618c384000002a5b1fe1ffba12cb4178007004308800013510004593c69959c443a7048ac70e551cfb87147a051e88d90a2f5f15bd1c382040f052f58724208152cb84df2840c9fa9da394d8c01e3e5a700d81001cde63e788738120056060c260cde100b307ce4319e20b1d3c4cca8b24214834eb4c508001cf74c0c14efc44db87000007991b9c00880200002c640740400075870adc78d599c5c408a6d6427afce3081a3038cf80a2093e70209cfd838619f5f6efd1418435bb1367f8c3820949d31b8f02805ba40677e5018027655a92c35c4120058060b2375573f132c6a2ac42a04a193a5f8c3528225a295430704554b82f53000000736a86000005d1a69c00880200002c6407004036020003ca32326b23e65028a0c4158491222fa21c30a4093a138cd10c113057d77c204249b9b838208eb7de490013881100400005ac800922100141b3c32e97a1e30480b642fa885b1c23ffbda00dc4080000025801c14b847abffc600ffef6cb371403558cc62c00007cd5bfef24210184c0288190c4e6edd229a40afb430be368c61850000005b8d800e1905392b64c0f880ada39484f2d66384000002dc6c0010009510f9783f10000efd3aa49d91909c410186207800021c3445118c838adf0410a7a577d90940c32908b44fa7308080da19a896fd1c25f1e80d53054705876db412b74181f34a59629bd0501444728560dc100207d2bb84554027612205c06800023d2034020190100033910181d80b88c0583602a1b800c6e657a8502d58249942015ecb0ecc00408c908002002802e280bed01b091037b9b662487213b10e40c019568fa20140c210044887af21eb2243fb6eaa5598104eb69080902810c96c804818420100000db30193fd76783cad86ab7f6f962dac543202927adf115d5acf2d88e77ecce11b610220a2b7d315373b7799665032c1978500b9cd2e28c2a7d13b554bf720b4b40003b7b16709a52fd6181cc02eb7f78c00416a8296a2303d48af162d5a46725f28e163e3e7af42b6c1f288398a40000d9c80808c03c2702171cdc26880cef7fa5da405cd7842d1201d8d16a77a048204201001301c0808a754eca2e5e19aabe543ce6c880c01d860b93fe1c0b35ec7791a821015424af63770624969ccef6bb266140361533294a817c211dca268847c000288c52f1cef59bb415077605af000379703f501c32c6b543895e064d24ea950d058e9a9d0d1451ac4b00006644048140008a8404447440bbd67f38c08087617c8d02abc6a6a6118410804201002008000022300c010040000111808008020000088c0500401000004440405601e13c10bbe43d242085b29a0e8180349d73b8000e7897d6d00084840420100000e420005904003388e108e3213031b0230644699dd23195101000ca5b358a78e00001bc0ac6300603578b4cc43a8618000194b29a84f001019c40c506207800e010000e21000fa82005a066c234a2f347578973491002a2c988e1d76c0590e21010e10a10a08800400de6450f4bc88e7e906a22cdb892d97eb0ad86b1dd1c417c42b228e3b1fddc91389b64cbe38800000198242c2544f0c0e000000a3396a10420089150533db324897b2c2a95242c25549118e08000087d8a0000000516480c8d768221c00000012c0001e28226e10420080001803219bf64373ae4072a1c615868c180000054603043c74fbe75100ef3c9d155c200337da4b1282012d958891420f09fa74f523861300c00006bc800235100d11f1c2a7d5da30e18005af28e183f48af31703041bfd89ad0705ad6557248c0ccc0a858a101000000e10100d6d4c49f410740c1180600006948060a802c05c31594eff90242c0c1ca79f470a048205081d6394469317c1844ad56f8302ae7101692864340c7280a04a1e0aff58e848402071e9f7d940a01801174a7da9a8a9054377cd9ff2e96b447c8e2080d4151445ab5bc85140ccccedfb04884080021c3d1bcc6b04028e0df1349012ffbc8c86003cecac624041f00848c063aec5a161d443fb6fe38608c135b791821100400002b4e1847df961440a616f08ba145aa1e7e5b0c12075f802cb0000b6d3ee5018e3999a814020680c3e0ce104201000015f34321cbc4b386141536b5e03880fd06d3e1c0178271b28a0091d50900101ee86a72e0012fb550de1670c210080000b1100048d201423009114080e8922ed88189d59f50e2843af56ed68a010e3a0720180328e1bbf84005918379400199da0d7b02a4e3044010008010000c210006f1200131870d8c7efbe54308539248bd8305456d31be8284000b5e45018205d76f30c280170bb26ec2000005aed781800881ee7722501848010822557fe749c81849090cf889100005aed788114ff66d838710000000961a8212002208801915edf110302dab658e089100001c6a358408347d11bfde1c40000000bb8120000071de11c8001ebffcd336d382148080000660c11bfab74832081c2aba5b1568e29bbc37d2ed2038f5430029e387668bb76cb860c000003cf00812fc6bad79e1408f4af3e46e0cb5b371e234808270180000f410004c8200e2300611516bb58ecad060c000b5daf050cf48af8f305063d73fc0504040000012c050233b8d5fdc407d2470b200000028b86618240080000ca10051d00200800c040011424008940020200001000d6d9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 16 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase6" = "QuadFullTwelveCase6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 16 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase6 private def zz2311:"s0907"="s0907":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l14 l15 l16 l17 l22 l23 l25 l27 l29 l31 l33 l35 l37 l5 l51 l57 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x1644d0712, -0x2c89a1edc,0x42ce727e4,0x258], ![-0x2c89a1edc, -0xae667fc7d,0x5c53d5e66, -0x30f8f6892], ![0x42ce727e4,0x5c53d5e66, -0x1804c8c1c8,0x548c3aecd], ![0x258, -0x30f8f6892,0x548c3aecd, -0x1644d109a]] noncomputable def hinges:Hinges:=[(0x1bf0fe7,l5),(0xc5713425,l8),(0x50985663,l10),(0x11aff2796,l14),(0x2999d1d0d,l13),(0x116,l17),(-0xae554f7,l16),(0x65c6f10,l15),(-0x10a46677,l23),(0xf03f68e8,l22),(-0x1644d109a,l27),(0x1644d109a,l29),(-0x18b93f592,l25),(-0xd4fbcc1,l31),(0x1644d109a,l33),(-0x1644d109a,l35),(0x1644d109a,l37),(0x1644d109a,l51),(-0x262,l57)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1644d109a,l27),(0x1644d109a,l29),(0x1644d109a,l33),(-0x1644d109a,l35),(0x1644d109a,l37),(0x1644d109a,l51),(-0x18b93f592,l25),(0x2999d1d0d,l13),(0x11aff2796,l14),(0xf03f68e8,l22),(0xc5713425,l8),(0x50985663,l10),(-0x10a46677,l23),(-0xd4fbcc1,l31),(-0xae554f7,l16),(0x65c6f10,l15),(0x1bf0fe7,l5),(-0x262,l57),(0x116,l17)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x622b022300c000019c5b0218c040000061154086301000000148840d8c03000000005d00a200c000002d8c8070c03000000000b40e2008000000002e01480200000891d404630100000000d09028c02000000220a00c300c00000841400f0c04000000000cc0620080000000031038802000000000c80520080000264850118c040000004219036300c000001e8cc050c030000007e31034300c0000001e19014c020000738c102483014000001d8c40d0c030000000000f0320040000000f07028c02000000084180930080000820ac0c18c0500000000007032004000010421025cc04000000921601c300c000000250a018c020000000a4280e30080000000025038802000000000980520080000002506018c020000000981807300a422031c201785006000000000380520080000002506024c0200000000009032004000000c8440d8c03000000000ac0620080000028858070c030000000a4280630080000002d0a038c02000000000280d20080000000029038802000000000a80520080000002906018c020000000a8180730080000204610230c04000008118404c30100000214650230c04000000000bc062008000000d844088c03000000000b40620080000000064030803000000001d00c200c0000000027018802029828826012d4014005c0a01c01750040000000026009200c000000110b018c02000000001c009200c0000000012014802,0x13402880300000000094062008000000110f014c020000000003c0520080000138110058c0400000480440163010000250982402d003000000001e009200c00008a0dc0638c05000003409003930100000ca1140348c050000000036009200c0001a01040098c050000006c0900c300c000001a044038c03000006a08401630100000001a09018c020000006e1100b300c00000000050188020000000642407300800521243600950040000ac4c1c01d400c0002a12064055003001504d0dc04a40100ac126184062900502a04a869010a4014005c12431032900402983384700d240140000000016014802000000682d013300c0000001917028c02000000064580b3008000001a8bc098c03], #[]⟩ def dynamicCode : Nat := (((((((0x91f14b6da8907147c7899cc08100c741617c80c15d06ba8070c28d38eda46000259716c450037b7c6b449c109002123ca9299c2930a18000000834038c2a56af66c91c5152b5771c49020e6ed4c9228a04135f7cda840822af9c6da1c2004af9b99c593c4021480c000073c83004c17c0600c030200180f80e068e1eb109d0122884f9407f946140c22bcdc3048816ab8d03b31841a1da4786412086aa81c0b803005c53d5e6600001dcaed3) <<< 16000) + 0x9cc1403081c290180000ed9d3a35a5d9c4310e0d7bf40ab259350cc217fa825a4a082a438a28840628628218010000965f509021db0249decc6bbca800f58e283aa2cc50444e913b6103903a8b34000848f6d770e3af0d6a77ab5f80a8dc4e79a72d490fba94a75b67c0000000004432ba8a3c2b605abc33cd5724e64ca360fd1a55267b383c8386206384204102000749a1c102b534d976032c6db5bed486027ad47bc4b359f7291f29b1ce09927133ec63351c91a99dd1a3f576ba960fba0cc14149358b7a00074c6d70a4357f83d97d67a0d9a250b6b58b4564ae79a6862e4fbc0000000000000000084228630430220218230028020000003828010068000d5905e1102e888170360b61b05a0502c80a05000000fa00144215dc9c8c51c262b172e149182166fdad436081215dca07451c08577264174001ad8f0ba20084bd33e421a0c3050038923e7d4c3fa58507141daa7c218c88610162e4d9730ec41314631dedf2c0408f2f964aab7bc208287d8818e4205061b2aaf0a86a4900c518be5a3ef0100e296eeb5448bd4e2400c010124080cf487bcc185027324e75624086fce37d5c344138d1a8f9d790818033b6d47b5141add4ffe8db840025a2ea368bc60085486f33158601c4ef912ae2d8120056058000219365b585a161881f7dc4efca50ab121a48a14413b36157901ad03cbf9080b2d6c7690284ab0e478b14040101c50940210804000062cf198c898d9db1226f5d4f46462047a3f961cf05064429f7d69440cab8890b680e177046cf64828109ce7c828e383dc11b3d92050431731391d1a24109c07003203000207206a0b03405e1018428b1a63865b6c0507514314f8fcf7c861d9201190f06084952c9d7210458e00e7cc0c104d5195f4080349a09b55c200690416dc7490025014619bf407b605113d4b0ad070ce8439cf890b2f71f28c501aecc1d141019df9f72e6002000800009410580502b80c15807241e47975fe1c587144c532120ad2030ad594eb68a5552043c069a0559250c202a4bb962da14412d67ff593b2803044e1677202e9c080138aff7c66580000e7bec659edc3570120062088c147989920fa0e2860afddc1e1855f38a7c680408d682ebd44c61079be52edf8827695ca22101826b360487a8382013e8bdaf0400a3ab1e692484801381000007c881780e8781528af7f4a15790404b6d245480241af60510000001dba1c3000000b56830dbd6054c081820000007d0060408a305fa61800aaee83a98292104c0280001ea20321300069120014144004a58e1a7d0f9a8a4308362430da11832802994a10a088eabe6f60700000000960300d5159c25b1400000002580000d45d3ca867182500802a8080006f482a10c14c760a43b0511d8280ec13c7609c3304d19c0c030e714060c33941e00c10000e6130c10d58677830102b58664400b62e7f182040cdf304009c407c021230096081801bc30c025818200960007c26402a20220080000b920982b04b1182508c12446090230471182306c1140408802a20253034ae1860089d6e1080ebaa0c5e9202b0a6d264c1070aa57e562c003cfb1ef498108802144188546f4480e786171d84055768cc411c1020085ac020d32e3f320a8210802000040c82184c108160820b0400581f82c0f8160320a03d01d0c028e7110142d4468c3605095ccb13010e180b2b0986300004cbcb108007b2c133c4c0844010a1801dba458285b138b4beca12c60874ba34102c446bd810409eeee1e280004d777bc98108802000026e6c949d7745ac9124aa9411d243a3b384f04900a9c2830464042200801e0080003c081d86c0e8260121300b0981c84c0e02764820506498912b987f7e448761cc6ccc04105bdb29d00250608401006e03b2437745785244ab8761de890eb6bcd38618116b433a98106522239ca2400cbdd50ec6000c0c38890005e4f7ab98011a0708802000033e40d8140005884001bc481a82c0d0172c42ce727e4591343db6591346888232f13bdc0b622567a8826c055a746b4bb388621c1af7e8155ae1486aff07b2facf41b344a16d6b168ac95cf34d0c5c9f78000000000000000010883aef25e51b55181fd2c41552041c3180000001e71bd7ec44cdbb7096813a2d651b55ecfc231e9d42974a87133acb4e26b9cb785bc880cb915ed800f5e0fb82db79511d864016cf7e50ccac3f74fb18ca787daae1b2c7e3c7bba9fb8ae0c543134462e180f463ed18200868e793010f7d20ce48305a1323c0028303e0080330981904c0c4274280699157c6841280865d1410c051295e38223bbf2aa060819b55694083407aebc1002130e1100400c0174300ec1b38068803ac2b258c200a78bab408357dd57690a000c40d5aa0005fa2907900224c4044010000145200057040bc070140100401702c0b4160580b02b0581502c0a41600014040012e480051b100148438416c367d1c020602d9a598dc30c3b8805b108c04546b6bd10140000000bb8008002d9a53b1c011004698e09c04005002000185200324c400c0b0f11a09c2458ccc00dea156c3410307cf913e8b33993d1b3927c508065e041a2145b0095aeb2b1816bc8c9ad92d7edfde07ad5440662c7746b801614118fadf50810a9487b0933ae86a612a7c00400d5ae2bd8be600388fb7f2d1d5f947624fdf9861683a004e0b8141b8145e4a5236242fadb6d08ef400c438881425310b05588d7a3ff2521b9a177a20206e051792948d890beb6db423bd0031080c238f29d9a4a2e06b601e8f62ea7a34c00079d99ac0a78d7255c)) <<< 16000) + 0x6220f2325f23104f8a3b8f8e143890764c68d0db6c38226f48005bc133c9fb16d2740838fa2e80003a8204c3b0250101200e4600000540c08e0b3481228486adba1f1635459081459f47a056cea696083080000012107423ef501440000006d28ab6f5080e083450ccc1855163a305023cd7d4daaadee84ea100afe35ead8923b746700b1b10bf1420411426000c030200180f80c08c0604403a1c00000e98714000001e480812fdaac490428638060504000002e8206253f3e10002c30400080210980982fe0066e88e66c5fd3523ca7151d48000000000099855a1de0a7df0e675855a1ddf00000000022578679aae49cc9946c1fa34aa4cf67078c714a0c70820450000001ab25e44d8aead89ea7d28429f2af6f65275ba4d8a4377068766bef93dc9c2b09e6c0dcff103585c524b587457df24d33c145c1c3106c17f4000f208002a0991800001f14718000002cc610000003007002074256450211a70990019450800200400301f0180f00c0740784fb92891a448e2dc023100b00800e02f0a08230a6d145000001c18c20208bfa385100000038430195e0dbcf8200000416902608210086199c1f3839a34a00000025818500000006f0a280000009605100000002583010b6786aca9a000000012c0c001db42e2ac94041280400006b480402801c0400064a688450de81b1c410000003cf00a18331aa310c90300000079e0141384738ec0a0837127efd780800a9f64dd9b0c031626724fb4400a44985353a20609c0700003e2405c572399ff4cde1071c000003cf048a67fd2ef4e1c500000079e1203eb1c619607005c896f0622802e44b96a90008e46d8bfca0801e6aadec936080940400003c04001f7c8004aa900120a203602c21a6ba8a87f5286cb483864041bc59290e61cd20c19ea693644540b651b62032a5979fea2cdbc6ee0608b348519bc0eb902ec2805fd175990d8f8167d0804d1700c0d7ce9d4d0a1805419042aeb4afa8a30022002d0de6d450867bef1deec8af7928304609448a5862a4f00c1898851192303e631dabc802118e110040068172290637283a288041d3d8c0c1a1b2c905c3033fe780e98c006d54211a20014fd0ad40003b30cdd5000893901100400005cc80c808060078513f622451c405a6c8721c11acfde351c003f5c44a180eccca72b0094408002002e030120180880c0580602a0381400689b004040b5cd1e718102571dd7840c182650300024182100800a04c04c1702a19ad31be0328425f62889f593ff65ced462c6c91718848558e7a6990b0bed7020289bc8c601c1d6750f35456a3832cceaba64b087068e1ea2d6dd1c0fc988f384a300a59ba7599f11aac0ecc7616d0d1de7bcd0a84fbd657bc499f69d648353e27d04003dbdf4921311d16509b296a291f7e9cbc1502d6554513b4752fb934397d146f60020c5a591dc718a70d0232cc956dcc31609d40ba8e9640278e74a54d02eb22c8e64a470220777eab1721b353bce0452e59f9e110fbc993d5df28c4b7d8a420ff38000031d10007603408a94166c1c03590144c301de4d6f44063101f00800900c044060200300f01c0300401001c0bd2c0adb51e259001e6a494244016cb0a91a0c8f3ce85880401dad79c0800002456926042100869312b816251a444ae10424682b67a1cc1920800009880700000019f61a01db28b05c400000039301382110040000594806828030040005b6658859ce4fc8b22687b6cb2268d1104632ba8a3c2b60590e39230e11601200c0000087010a2e4a2ade61f50972a6a353a237dc05b14612092d714641368000f3900b15cb10b39c9f91644d0f6d9644d1a2208c2b507cf55016e900000014678eb1001cc3e24c71bb9217aa56445c5069f3fe76d7b4880000000000000000000000000000000000000000000000017cca20a18814604a00500108193a5b3efca0f378de99cd7628816877292dfe65216b7a3c2fe3610faaf9deef84383d8ef951c3eb6c60349b97f4fe54fe59cdd0d1d1b0f24f98551bd9cf999e22c1b8073f530e8e2234001414800532100a210005c910014952002e6c4006a08e1169a80db4b9923f06490beef4b4258ea1948388bd5ae34a0000000000000000000000000000000000000000000000000188450c60830860450440430004422d2a33eca5f19a142a62d15b6460af83a026543215c1522b0856c81058b2822ae7e90c2f910cf5cc8d2db02255a71368d71398286a21ca398c6bc31b50a19ff260a19c72d6cd531040c02fd1239c18384017e8a41d8c142ac3b57674c20e08ce1d02ac28c1041095c9e1fe02015cf2490042801103e84121681638a4160ae32070faa25d79b0c18000007080411830640e43002682213ac5000000012c08002e400b8e0110b901180228abdf9d51fa2880148ac6e62c600000025828684543a1182460000002582c00021d4065000009a48fee02e184800800905d9701a8f418b916480531d34dee60e0000001770163948d66cf1c250e0000001770160807a5d2af4e080000023f7a4147042a014597ef4df69318b2402d9ecaec98380000004b02c720b0be744650e00000012c0c000000019f61600311054ea22704270080000c4100805003808000db4d72fb566b0fea0f4572fb5680000000020128a2492852452051811011c01030280200d000117200c2b8226ed0961138918000000384081816ad167a9c810b1be4345347100000003840100000000de48ca385001800015c2000fa240025908005c110052900200800c04001f4c40083400202000010022081)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 20 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase7" = "QuadFullTwelveCase7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 20 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase7 private def zz2312:"s0908"="s0908":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase8 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l17 l27 l29 l33 l35 l37 l51 l62 l68) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x148660a1, -0x2a75474, -0x3faffda,0x258], ![-0x2a75474, -0x13ad43bd,0x15aadc6,0x34daed3], ![-0x3faffda,0x15aadc6, -0x113fb42e,0x2a75924],l68] noncomputable def hinges:Hinges:=[(0x26d8f8f,l17),(-0x153ab66,l27),(0x153ab66,l29),(0x153ab66,l33),(-0x153ab66,l35),(0x153ab66,l37),(0x153ab66,l51),(-0x26d8f8f,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x153ab66,l27),(0x153ab66,l29),(0x153ab66,l33),(-0x153ab66,l35),(0x153ab66,l37),(0x153ab66,l51),(0x26d8f8f,l17),(-0x26d8f8f,l62)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1284c12016801800000001e009200c000029090009980800000000b0024803000000006c01240180006804100263014000000001c029005420a404200335006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := 0x18696ba29c61400012c1c42b55d1c604004b0d1010000190104000036b000d0022450a4715b2440fb46cc1c4982a12e18472d9ca4182fea81e0200fe6953414035775610800e7c5c5a4000e00a0000590c0c00020d1f1869631140a3b74048a009f5f9f2f0b5442d7f9b1ee38882d7ff04266c77bd40327d7a3840dc57cac6331589e9bef5db81820023303c5d13409b28cff6bc083d6beb9b85909c048342f71c7c01a88e276abbc477180180471c42251d33eccf6662e9a1840a96b70390e42fd4521822599a78871f70555290c100bdb60bbf35f257050419648e1c54d2baa6d282002025b0acddb2c60d6d14005317b2d6e8a2ff5550800f7a6b1b8eadf5ba81f98206a1fa0a001202e00005d840017d4e1bc7be2b157f9598fc0c985dd47cefd2c070851685f96d104dcb5704d2bdcf1dd4558408f2526c2c5ae202e2a03dd2b8e6d3f1443041ae93b4967863a33f3a93fb21c72b9bc204a32c192f9535ed120e68ac501a98b280772f8f2339be06d6f2fa501689433296224d8b631aa4873fab4297388eca11003480003c73421ba4892fb861046eb59b3c20821da488e03020876922381413507bbc43860846e73b03c502de2b215e82006a5ef735a3f9327f1443c22030940b00003b8402c140140281a4c9663e49028adea0e121c273d4f417c304323751774508437d147c100134e1b4da140086faff0839a78c28a1c924e849449c208c091c7929f3fd88144f805272042665738c71000012c0200001fa37450000004b000000002aa27001e00840ad15c7fc4880000c8040900cfc183820e54cce30000003201001571e6a08014ecda93800e00400004e4c8e9e4dbe5af2a6388c5de0eed353e4060003b830fc8038770d41555147018403b3614161d220003b44f4da0f203387f623b3565912cc08600b00001cf200090870d49d8a938c1800012c02823a45ada8c00e91652a1800000064040000003216001e0040048080200400e0200015a200c1b815688e7fbf5422dbeb003040a8f08661d60f2e750803d59c62ea0e35b10b587002d7e550feefe18809c500eea9a20d1d784f7dec201b914b5e622ee70becb4735605bf6c7b4fb0267c228ad69492b8d1a9f7fa4922f9b731b5dab1a373ccbf0a60c480c0596470b1b5396296318406220820a5000b0086d20fd8c66a05f25eca3dd200000171dd828458c30c3084044022001000818000100680008a1800008022461026be4808053a37041f65d5d840042846808026a105e5001a00800006f900011c3028fc7ce8822fea4b020d0ce930e01009fb84810300100000b5200079475d12e14c48c146afe104759c5accae99bd000000000000000d4ecd4ceea813e00e4e6259152200000000022b0008c40c30460050010324b5c2ba727252aad9eae781dcc03206cc17cafb86bb0d8ff0b04e59639ed64535b088794b6d35ce6b3821f4308cc6a886295d4000d3080053890012703c3bedf40041000cd886059a360c20232b5f008109c24f0a0230d6c8301827bda4e0832010e3c2a05b038a0002580c2800433430405fb4e0c0a9d4cba20200012c13020d004000041880280a0507b6788a2052612c7050afba82833d314d90006402123b87e35460974929c3823439931418ffe6e0602c251c82012344220801ae6779c006402000024870d5655605098d81dc4002e010a20034ed0e10fbb8e8c17f11628604c70d184052c89aca00300100000d420002aa6043c9077d3ac0cc3ff09af59513eb037082bcfa9db2ab44f2744dde107ad16a1c180e72ab8ac235e30f13c53fdb14d91a31409bf7fab149817806cb043398f23553100826623aa0938c0498b6f3381c7e1042b01a00535afdc712ab6120fae919ebaa288c02b1e889cc3041e15ca08f0308e18f91ffac2088ec8ee0cfbf2ecd44769aaa59b5dc1b65b514260f69c944e1f7ae12bb46250a1ee9e55be72ef0862553d4748370fa75078c04ce641c11819ed3c8ddd070d8c9b0afa1a14d6df6e3725322e210de229933de37edc9e54b1025b95a0000c288003599000a323458de2033850c2bcdd9d1412f5211b440400006401000d2aa910300000019008001e087ba7001e0086197ff6400c516653125e461000002ee060c00002ee050c000110f450491acc37040400002ee2b8010006000055480202800c04004020002f5200202000010007f11 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 9 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase8" = "QuadFullTwelveCase8" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 9 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase8 private def zz2313:"s0909"="s0909":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase9 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ private def zz1128:"s0468"="s0468":=by decide+kernel theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullTwelveCase9 private def zz2314:"s090a"="s090a":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase10 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l17 l21 l25 l27 l29 l33 l35 l36 l37 l38 l42 l43 l51 l56 l59 l6 l61 l62 l64 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2d8ea1ddc, -0x588e87e56, -0x861c46350,0x498], ![-0x588e87e56,0xe570e023e,0x5ec285b84,0x6a92b5248], ![-0x861c46350,0x5ec285b84, -0x2458a17658,0x5996c0c64], ![0x498,0x6a92b5248,0x5996c0c64, -0x2cb417800]] noncomputable def hinges:Hinges:=[(26,l6),(-0x6358a1,l9),(0xdf8732,l11),(0x446b12582,l17),(0x96a88436,l21),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x65da241d8,l25),(0x2cb417800,l33),(-0xd1727da0,l38),(-0x2cb417800,l35),(-0x1b6200787,l36),(0x2cb417800,l37),(-0x839c076e,l43),(-0x4e974b32,l42),(0x2cb417800,l51),(0x16761c63,l56),(-0x11c6e278,l59),(0x4c6b6e33,l61),(0xd5f6e58,l62),(0x4f38974,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x65da241d8,l25),(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x446b12582,l17),(-0x1b6200787,l36),(0x96a88436,l21),(-0xd1727da0,l38),(-0x839c076e,l43),(0x4c6b6e33,l61),(-0x4e974b32,l42),(-0x11c6e278,l59),(0xd5f6e58,l62),(0x16761c63,l56),(0x4f38974,l64),(0xdf8732,l11),(-0x6358a1,l9),(26,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨70, #[0xc8361202e400c00b210a11c019d00500000bc321101d400c0005c0c42100d50040029447855012740140005b0cc23011500400000a43613025400c000001103c01ecc040000000054280930080000001682402cc0300000b4360900b400c0000000160a014c020000000880900b300c0000002382402cc03000000000088052008000000941d0318c040000000620b01c300c000016620801acc05000005f082006b3014000001544401acc04000000007c580530080000014846026cc0400000000007c052008000000000f80248030000007a04401430100000001e024028c030000000740b01c300c00001e01040098c050000000094880e300800000002722038c0200000000009805200800000000009018802002b030849034c40140008818c140059004000238630500164010000046198280b10030000110660a00a400c0000330c844031003000000006c18063008000001504c01ecc04000000003c1c0a3008000000000d402c803000000001a001320100000000001902c8020000003305404930100000000000240c8010000000000140620080000000001201480200000c4561c016400c00000001711028c02000000631040893010000511042c01b100400000054442807400800000000d0601cc0200000000000303200400710a2090013100500000000382c073008000000dc290098c04000006c260c014400c000000000e140cc01000000340b007b3010000000000b802480300000000024009200c00000000016014802,0x33041054016f40140000015120902d0020000009e05c03930100000000c84c058c0300000000000f0320040000000230f018c02e186120e6020e8401c00001822840540c05000000007818053008000531241402310040000000004700b200c00000104370130c040048881831024a40140000000000140c8010038460830015040140000391883005100300000708c101503014000031148380990030000000004f00b200c00001a20880098c05051033c210096a401800002a0d8480b9003002b43604d01554014009c09809406b10050000004b0c803730100000124188019cc050000002c0540d43010000000108700dcc03000004986600473014000001103900dcc0400000004a1e017300c000000000780248030000000542500b300c0000014848004cc0400000005821013300c000013e198012cc05000000480e403b3010000001243600acc040000000002c009200c0000001902c070c03000013c761300e400c0009d1cc230059004000000044583034004000000000230188020000000004500a200c0000000001a0148020001704d09c09740100000016c4200dcc04000005908200673014000000148900dcc03000005988600473014000001504900dcc0400000005a26017300c00000000a0603cc0200000000581405300800000001506024c020000005804801330100000000007c04c80300000003e0b013300c00000000121c0cc01000000007c680e30080000000001e014802000000003c180630081840cf084025a9006,0x882c0d30081f01950b303ad5006063041c1640a6d401800051114140265004000150450440694010000018819405ccc0500000650630253301401021c60c40929005], #[]⟩ def dynamicCode : Nat := (((((((((((((0x2881e6333b44b1df2b57c5b2c4e61e1e1d47100dfb0d8c2c36b136eca0a0c4c440a582400035082848000946e9a61a02088021136c2c2c0430f1b185bd5810ad7c861e3630c0984c30c20b1cc14b10c04b04200000c8200803626d858580861e3630b7ab0215af90c3c6c6181309a69a49849a31829811a094010064000401ba48dfbbf4fd186120c60c5aa9b183327fcec0e4e30daad426658916281cdbeb552438a0529c938c6061800000fd71038000000038400c003df57f5cd922400a80700004184000d60800253189b61616021878d8c2deac0856be430f1b18604c258e58868650638230240030018190001006d9766f1c4a2ba2c72fd468077e1228003b6bc35cb13d7dca2971038800591f3a3810402e942c0b016007b38cad1aca00010b5e5732080002c8fd565da400a4060000404421c0410c02000378324b0a92177ba6245237273824dc38600e22de5ee060c082d0cbbdc9215d3ba380a7e1420305135687810400ed04ead60500060a26ec57040007494cc3daa29002b02004280821004106020750100013510820584082ec90d97735686106c8e1a5f081417572d270a2d9aa5a6d224400966b8ba584187067628a00006a9db69200095e16a21a0208c021136c2c2c0430f1b185bd5810ad7c861e3630c0984d34d24d18618d04c04400200000c8200803626d858580861e3630b7ab0215af90c3c6c6181309c71c51c38e39231a11c096012064000401bc69826785b7c8e28729a3ecaa068e9d4d23af211c7ccb3338c891430000002261030c000007eb8870214a724e3182000000001c200e00000010b392490029018000101100034e200093870840de9ca7460b330f61c74515e8bad9a51220045bd8ef1c101b7225d048001bdb761820009a3b83a138211804226d858580861e3630b7ab0215af90c3c6c618130076d4be1c15429fc779d3e0070f3a0e161a704a469268c48c30c70440018008180001006e9b34419c72081a48aa5b3b2a4858e000edac6a71a3269f329a89048c0042d787ce8c312d1ab216d06820f50d16f83040800591faaca6000042d795cced2005403000020b20007d2420004000b0a41e007c4065182a84a8ac39e39781ecab33bcc6ae7b995c4b3e8b86e3330929c00187c7edcbb6369f1e01a08b8e4cbbcdbf44f4cc3744f65779ed1b03557000b00db74cddeee891f16e9314ce7e01680fc77292e8beedb47d1d8433ef800e010b619d484f2e202aaccc9af2f05f2e0c50b0cebe1f171d82f785bf18000020d2a59f4089ea7a194e80aae10c22a0e518d107c1144fa1c670b9210368fe9fa7d71537724642ba039ffd17176ffaa30c1bebbc21c29612d8ebcac2aa324bbd3840e8d0f79df1c04dd7ba02e4bc17345b100414e73200003451a2a9c5c1e82ad450c3c70c7a56ca20400af1a840c00e200e14b25ffbca0d91d39bfbdb8306059b091fe740c32c1c0b28105081001d25330f68604059b0956655174801681401e4040f003e202fb5abdc30e53297c486022f2e5b962c029958c480e003a2876a0500231bdffa33041080400004c883f8481f8240fa120003e02002d5241f0160f603b2472ebbb8d308608ec2bc45163cbb38fe2040b5f587a8b0863c95059240024eea290200013513e419c2088021136c2c2c0430f1b185bd5810ad7c861e3630c0984d24d14914514c0cd04c04200000c8200803626d858580861e3630b7ab0215af90c3c6c6181309c51c314) <<< 16000) + 0x30c31a21c09a096008064000401ba6a7a6ca4e5a1a506267481ae9a304f6dc197d14311c479173c0c36f570aaa7a0e1973c12e47c061800002f8531a10b9e04bfbd9000000002a306d200500300001f9200068a400124ce110e6ff517204019978ed9610bbed4ac07043d8327ac48005038d531c003b1d80c84004e5195089c1084021a4cbb061597ce1a2efe1434e19092282051c86952981812483ef92f101023c5be12cd1000077e6804f4860029d357ded4820007f9a96f767d08002c02c69a6f4e90b278692a8447eb3dc58e003b6b1a9c68bf71278884c48a01647d91a028a7392f005106823d4345be0c602010b5e573210200591faacbb4801400c00007e48001ff107a010002c6107801c4db0b0b010c3c6c616f56042b5f21878d8c302600000000146be27fab51cbc53d43a7800802861e2c2fcf006312ba5c15081078f81b3bb0c44f4290550710510608700500136472b0b9aac2f27fe75e8df713e8435b9f5c8605a24879e20eb8102cbedf833214dd5573fb1470fc7af7f6f052c09b2f61f83d97714ba41453accfa00081468633fc0becd39e408016f8a95a2c07100d4934b146508180bd71cbe42428296d202d148743040a499f156cbc2087ad486f73500c0813a0fe801ac24000b5b05a4e8b0749002f03403c8081e007136c2c2c0430f1b185bd5810ad7c861e3630c0980000000051af89fead472f14f50e9e00200a1878b0bf3c018c4ae970542041e3e06ceec3113d0a41541c41823011c014035f6948c60f292bf40264593fc2a3b5b69276d44ae08d06b304dbe8d91a3422e0506f49d0aa40ea0c950cdb0ab67e56d23e2d45d6030ae600a11da69500040920ee120760903a848001b3083a00f4db4ee97f6690d281a9fc6960430a001288ee9c8d2404b46b7681342091efa97fdcc08004d5a650328000050c1e4bc2000022d4d6701a4041500a38e8c40e6d404714034c1ca2bc61801a8b97b01c18435700dcb342000000cb7270206e2626284200000000cd70000000c68f2e28042700849802a853f8ef3a7c00e1e6e8a319260944f3cf2c71cf10e0cf04e043001032000200db5cd9ecaa000000000221181d583910b46e30209c4f3cf2c71cf10e0d100f00e030000200d00012820004b440010c0e9457c5da8e349e22e02b71a12aa56a8f8904046b4dae18202f5bbb9081058d74a504005f289dcc9c1084021c75d6599a1bce28214a8533270613cfd5a2b0c2001bb58481c082a0ab7fd040000009827218000110d2beb80128022d7367b2a8000000000884607560e442d1b8c0827138e38a3443831020c2101380c000080340004a080015d107301000224106f01f6d4be18550a7f1de12b0f7324653b720023000000312e3ce1f0203cd0542861e2c2fcf006312ba5c150474a8bd053bf3a04df510550d28d24a08204a00d6347462e3f173edb3ecbd32d5ffedb0216d466c8d78a41e39f58fa7318d172478eff8593c97765656c71c76ec5432f8a8bdb52f8615429fc7784ac3dcc9194edc8008c07c2fc80613582fec4902494f50e9e00200a1878b0bf3c018c4ae97054cd28d24304204d0020036551d764e21faa2905e27c5ba45986ff47d4f962e0eada4b8293f770c7aa583d7908ace0c15049bb4d8e3065993d4000cecc083c7c0d9dd86227a1482a166952463076c5c8a63fa0a91a69a49419408809c0180140260200401b64080036d0585fe4394e960250f219a20003d8a6d32020f00438a65ffc454b10394ef10244014b4ed4b0b59e8569380a103bec0200f13f86726041e00800008f900020520e41b00037720014bc6cb919ceb76d0c2c70598b3ef555143003c30f14c80c30000007e7e0341007447d18c42c101e052ccae8340000000151802c009dc99cdd21280000000151809120058038071010380081bc0746be27fab51cbc53d43a780080000000c4b8f387c080f3415230c3081843823023803000400c04008037080b2e61918918096db81e3038464ffe3ce082f24c30a3020621c14f89000cd6b36b0c00349e65202708220080000b390002d120dc1206d090002b99e318147e629020ada54700c2145b51f28c19d1b99c988057b45cfa06001f6394b88930a100040150140a60a00015c200383241481400667678e92e5bb461c70c8e23c89461210000000e101c10693a2604e0829770f16d8c7021de091563020013ffbfee80000000a8c408174cdef2e8971c270104087ac495c7cd9418000001a5e0404130f40a4b4841470639cd1324013b6589d78f88000dfbf304661000811ab39b60000ebe6e31f7600dfbf4aa4730f01854040a2a76e44f95363070000000bb80a181ad3d24c2f28402027045750410542d4e06f230301cb09933c02080000023230280097dec1070c9000000005dc02920854028a35f13fd5a8e5e29ea1d3c0040000000625c79c3e04079a0a91659a41639628a29a216002060000401b63a0755198628bd9cdc5b41a1005ea7796584ab30e4f38a000ec3ddc410009a214244c0044010000135200053664508e05afdc814000b535f2041057cec6c80c0cbfaf180c3eb82c6548400560233a59800880200a802053010000af900063c20d822019090290280022748359081a8840d242000ada20221bc2d81d5eaf0a12868ba578e00e2cd9ce8461040010e3125a6df28412fe57c56030630ceee4f18004d40a4a12021080420400802ec8820250758880d09ce72e3069a90d080c085d8b0c92820e80400003c08000f09a2798560a718105f02d26203020451bc60247c206d832060f80400)) <<< 16000) + 0x00348c00004011041c23babe041f66c6de70c01c05e590630021008000053106b050350281a41400024441a0240ce1206609032848190240c612062050308280015d8df38f6f1f9670d9ed4be63b61a44c53c7cad6c7193d0ae2fbf15e0000000000000000002388820818410c08c00a008002af9c5377dce97283ca10056ece100ab93a38136493569f6e68c223d0010100013a10600148e23d0cc24f0389105f9a784a4060068c7fe10386763e8d5af63063776a3c56848004b8d79cc820034d4898030882b74ff984402231ee20912718280145103c58a47e01438010028ce840b297d7aca69220022ed54b040896cfec6408e211b890efa43820ec1a5ad10a011c893456c0039f154cb168102600c61406b6c1b27287fccc2c91e143346f7605d4918034641a9818607faa1e903000020047351401a2f6816a0700009758d84003007003ae02094021645c8cdf76ff2c773c0fb9fa250e00e8d99700b002315b55ee1400174dd8900200003a3637d008003531af6c0a704270105908de0b6e71307002e91c64163d4df50187ca1c000001260486002b9ddeb08000bb28c2a93021280400005248001771e382344417489192c467f20248b4afca005f144000f85ecc0800045a9aaa430006d1d609a000a597989660c250080000b8900066720a40a000877202213821cd1f605295d4fcccf4306ac7eef810dc4085b4f8c15979f20b6a6ba3ac3fa102062f00876b5e3e5d188600182cdd35cae4d397ea000270663c95472e306b80002fb7d9e26d8ffe7928812715347ad58812827000054640c067c416038b40ba6020869302c080dc060dd0b386cc3dc8e10016bd2dcd401c11eee916856c03032315cf66cbe8504033d8f809100c013cfaaac98ed00000017ed017d08042f02c54b4f1f840337311b11a507946fa3f0b8cef3f9e36194f5761fe0c0000000000000000002408e28e20c18e10e08c09000803804010068000d8105f0502f028174040b8020000102d808168040b2020004a520b05b9c6486b14470d2ae264c162b9e837552d8e1d70a906f307fec00000000000000000433a0d57630d902c870c30c70830870030020000005530400200d82040a03a8710180c52fd7208180e50559290045e30a9c488001af2aabe060021c1d7460000de81abbc0aace3048010e3fefee5600e117dfb6e590088b97c139401765467c8e0218359d2812861000420896e7898881c2268a3b2c0244a569c10188eef190902078021805d547b3080f270a8244083601080200802000008880005710001963c79e97f09d09042fed2a3f3000684369944001b0dbb8c19020880200ae02056010000831a183ff0cd20c0eccc28ee12081f00402a828150140a60a0000b8200094e414814000ca640442700401004401b165c630800e004200002008000022200010c701bac5da4842103c01000004e20a212050090278481381409a0a04c010258080006fcf005bd8c21b0eadcfc13847290781a583c49df08c89d11f41414fcf028cb52940d2b2307899fd7ddbbd2ce1db0c4782f53c131e9970aaf86c737d7e8c3376f64fb3bafe4f7d85266c1f3d985029e17a42baa0c03a65685fc35ef7d89661d7f3d95716eee899706a76ffe4c6258b7e9260e2a2d2f4043ca6953125fe5ce94e23aa6efb2b7dd1e2289f4b6277b3bf84f5047d092c96bd6cf41bee6eb8c8bd708e73b341c6f0140a118ac5218388861b97912d3433b1dfed9075cb1af9cd74eaec95ab5a42f972afece51477299a7e6838ee0ebefb7266c70aef43d18382a15fa7c7f3dbb54b349d80529b0214fe69aafd214206d231dcba42a0819fbe9f446634ffdabe09172cfba28f728e3fcf5d104a3415ec689fcdff8a45424ee9d0d7935977d84af86ac2e5d064e257b0ce39a673f726bdcc4295f1f8e9a6c4f2b417484f01906035c4116d49839fca003802818bce7cbc38f7cae0ee24d8ea0237e29b6158908580a3ffc313372874c4ac7cbcb94b8db8962afbcdd6d8dab175fd985708c622151fe5eb2c8d2d6d44c346e9c7f1d6cafb1eccd7c8732a879980250080033b4800ba29049358241ac11c360053b441186608a1a04401cf0048a22d3c0387a33d141353fdac710d6717c05a1291420e20c20c19010c106000ab76bb561ffc6d5915a8e0444a34119a3499f872dc489c8c8b923609d6464a2dcaeb461015ed14fa183229b216f880b5173d4b8182b537d2c184045117d849050261c22008021868108140002da78817ab9842351d25f03080fff92cef2544dd0306153ea83bb8d20332404642883b1b2a425f0384036975e9f181ce683045ac808b7629327660832db988cd2964d490a885368e3332ac090d44be721a0e38800f0a143511fd150c212dcb04c2183281facb7e4057556f724060877ca406a820cb3fc7f3c54098608c0200840a00015c20804203f2100021f90110df182676191c61534b91f84a1239daf7c8612e5cd3bb470407a4592040418bcdde030000fb946c49c3080021c61d06b8f818554c444a82849b037c3f184a01a5cb514301cdb4111033b7fb8971c10ae4ea6c1c04d8acd871280c200080000c310410150a06bb6547a408383d24fb8206053e64ef60830072a235812041200420707e0596f9630f162f1d4716037ef36428803ae851f2420db92b6b04170f4ec16898108402103814aad3492c6092d5016e38a40cf09aac51005c9dbb1041440f39616200044aeb19c4c084601000013d200051241003407e1a0003b3207c2203d1101e0880ec440741a039050003ae1c202ce707263)) <<< 16000) + 0xd1c10cc69ef792d1410101358a7eb0c11220eee232f1c00dd2d83853418077b4deae0a0140a9c7a3d480e154067958f815a1087d23eb586a0834e60580580380100011a90373101b08c0d4140680291e2357d1a7828708e3dc9079a786085651d1a4bb09042d1f52e6b989002ce1b7631f880155535ac7e28600371cc4934d1502090d30c359500c6377da958bf9ca0b00814332329081deb0203ca19d9aad8683861f8d9c01c40840862c0ae328bf8608474af178aa51c0164510ffe458281145ef914946046bbfc81fd1011c76242f03459358fdf85815f20810cca3780850e2996bb2c6536c912d191fb5a2bc4088de4f1aab951830bbd2df621708102af8473fd9c1047a5ff5c54b45808128a6031360000ac32405a058d2d85e8661f1585156282a69424c247488a935d83618309e34128ea14b1b62306ad512c50ce8d29bd0cdd20511ce5a9832e86191f848c3f110d018a6bc9228c0072c90c2d02c796a5b572b13bb45927908bc59ad8a691e865ed89406a6102474837ee7ee78e1bffd5d3647050e26329fbea4bc40c1dbdf3c53d3e0012a87e19186505e8100860070f2c99f74f711e22c929537b4b9cecd22798efd7ebeb3081ab83608597cf1c5b01f374f3c28703f7b8a14c8cc0046f3ea0f4af1400c6638ec8d68000a84fb4f82ee3c04821701600008d8f1839692bfa8ef0e290bf98f5d2d1144270d57e9c015307f587363ed74a58e6123721581f4e18415183edeac123101eab8c77a52c30e586ac456985807eb244f98e5035a12105e0680002432000d7c7084b07aa9bcbb1031ddd305d4184a17055741d8daa48a443cd1d70771c432d6cb781fc0a1885c31b2d5042085b4af40f8606002cebfc83bbc00bd10205a0580001fa20662203211018868002d788006da1000fcd206043a2236dad82cf1943800000396c01c70297a4a7ec050c0df0b39b19861085b809010e12194578fe9ca220371279efc5ae4845b3478e62008099defbb37d8191208560409c6486b14470d2ae264c162b9e837552d8e1d70a906f307fec0000000000000000043128824718424320324220214070080200d00019c205e02a1c05099d58e7e0e38f8e20774a382860c0972575c943086778a4eb987c90d0037392f4f4901d89b1516b1d124213dfadea0ae81800284cdc90ff02001e56ae4616e0e30484178182c9785117fc2ecb2000000396c0208052f494fd80b1d52296b6a3a1c53e0391c3af8a124c7dd0a718244c027f48b27490f3bdf766fb02815b3478e6200c89042a0205936030137fcb1c150577090e28e63f765c284611829840488c627126b890e9b8cc4c514091b5abf7818005bceb70ce0108c0100003344000f10800310902e0d0168680b0240561202a090148080600405002000ac8204e6b026358129ac09037200e0c6ba48b5180e9a8e1e9c7b721076c40144e6e017c0ee97e7e77992ab3a23ab88c015ca3cfef4ccb576687b110221ae25d002201105918d1d145ca35e99d713556989420de55aaebf471809b9fd2b980c03850c2011c2e98ebfc32c23450c74ab678e0cc99f2a703d49fed0f46924a8531e3b1cc55496a6f4bcda2082e5d62a6c6d9164d0839f46ca37899eb9467376678fc2e081028c2148624278bf9c2a050847ca4d8a2014764dd0606044dc0b0171008d2b5fe70002f4479b98015549ca088021020842c14504051bba38e68a112d9e93484023d95dfa20c08020b19da0204a38440100230d011068084140002a878624662d41e3495464d84fd6b56c14becbf48b88df0a3182f66af446df0668c5148bf0d36093401be79241d1874e37dee13489345a6fd6cb8718a3dc80fed55b60c81e355bcbe5010b873fa2d0d61ae6df1f50a100d839ce8e4e1e6cd185bbb9ec714cd946af9222157ebf1fc249f9fdcb13f1b552a24f04d537357085e0054144a8288cd2313174b7c88c078929aa12c51c4f19e2f249e712db841735adbfe3c7d8f5bc967e66364876f7ac8759d6a17543f27ede32ded67982f87426a5fb2e874fffc9503b7bbc5e07bf3f8af8cb515250000d224080360221391dfce5a838ddd149a17a261742ae511b358801c18b415a77cc92177e3e046bffa2208461052b637ee549a2ba1f54283186aa587d2d9a79fbc4149a881d3c40edfad95124a0007491ebb3d48fe1f88ded8d138200de786c8d2f44a539d015ddc8ff6c1019c5b74a17b248fce90360d008b322360efc03a204787a0df4b15aca209cf394c7cc2c63327d431ac2074d3f50c8f95d73df13ef16d830e8d96fdfa26be4ee9d2d22cfff8a881d282b55ab41e97a52e45a577e48c5a54d1c270cb4b579fab30cf3c6a5774905a7024048f3e3c2ca739f54e332c02cdab6131a0941f2485892cd280435a20bf5f2a024d2cd36b9f0703973145d32c76dbc9a693d187e9e343888a68512aa0a73a575247cd8bc698c2b747a831fb5a41b3d2c0b766f31df48d7298e3ac51880755c36f26038f82b8540982f81ce6bf33594629dfe20ca5b1ac5e541f00989bd2eaf626df8d8a6002781efd86bc95b120276abe90f20af73033d67e3ea4ce82d70d630b0ae132a41e0fcf0afd610a831f0daeb27215f74ad386b46989a9437342c18584292b7c6bc866a58e1e581d6a0ac593468e5aa8a2b380d7f4589a67939d08120a0f0043cb55b070a0592d9d5f0d0b1127a55519e04a370f1a3001ffbf574204a283e01000010220003e074667de8cc609bd8e0300011be4d2808131c1b004000051901f150038a8018540081a0009e93c50210d988400318cfdd08050221c2)) <<< 16000) + 0x200800f068074340381a01b0900d00c0640400021040043f8800d6a9992473e8fd9b1e794e2c7bc7b465a7a0eb69307c8bfcd72b6000000000000000002108810411000e00c000a822c67ddac003d1301af202a81ec6bd2d4cc0b9826102e5a873e67d870813b13c862c91ebc9fd5d4dcd0f3315b25135126f942489d3772b0b73f87d83f88a9f295961153a003eb262db044f274b869a9714e29486a030020170100021690023e5200829e7b6a5f0f47661d37be72d04797c79eff0011e5e77c372e705a651b97502bbd5b606619e0598e18e08a0880060020009db04e1964c6888256587658ad656a3b19c1d14cb22691088a7539502c48440d9b7360f1ab4c9628a021efe714731214bbf5024ef31ee9688596e2afd5d3635aac7c60270000000000000000000000000000000000000000000000000000cd5c1a527a334dd03d3c9ca9ccd95472dd448df0a15459339868c0000000000000000000000000000000000000000000000000003311231228c29021010c10600002372401006d706949e8cd3740f4f272a7336551cb751237c2855164ce61a30000000000000000000000000000000000000000000000000000cd8a65ab5101f243845459fd4358acc16919064657ef843aa500000000000000000000000000000000000000000000000003091431231228e19200e000fa68f4156141c006d0e8675ff5b650c0f98129c448a3348fc77048809e33ae48487a41067e62000000012fe402cc284801000014b202c120150900a0280015a48004aa1013058090280441602002e1bc0c64295ca8892ffc71fadb19fe8d2657a3ea3a3f33e2e000000000000000000000000000000000000000000000000018ae350f23c3ac0b22031c30c21801400c00150401de6ce9c7ec580c0e286fc17fd12786db9bbc9089be2bb065a2209c22deec44531cc1c3883060c87c38d06b797355c23b58f4c334e4f468b5c7e303a503779a03ab920b5073697edf25a18097facd196bc7675a78679a5ceffe09638fb36ae054389022907fb7df133c8803ad290a50a487fbb413187a8ebe601c7a233ad7b329796c19348a5acf84fc5b44c24ea93a1c936cf5864a6f89cc54eb01937490a0d139b61424e550f6326e36b45b78bbb438e55dfb4de22011faaee2a7fb647d56b0ff6eb093105cbabc0eb7d6cf79bb944445a5d48b0e70179c34fbd24f218081198ab32768bcab744468483938fcd9c74e8cc93f14f4a5475269d5870d3eacf1dd1f071d2ccc4aabb3fe5f99c1a5577b632dfcd058becd45d282b5b02366602a0672a6fce77b7595d574d3b1bfba7eec3856f58e8a31a5fc5e3071141d3593c5da556c55177187af522236cb45363a03401f34d1141f3a47a6938096cc9e9a02eba463fe1eb25d70a757aa19f00f0b2e1bd64e2da3455f2f7b587ff7dc42badc223d376742ba6712760defe930f2766708b359fbfb648eea7a4b198f9ba63b208f96b3852906568c464dcf7cf1c3d6817a92e20fee58972243e01bb29b5f996208812b98d2510a9b87d6ce340ab2fa9edfd9d01703bb9e6939fd1562e68de49cdea28c26cd9f8087e53eebce09b00000000000000000022888806a38a28210228012af0fecbea148f2f15faff31b1db2943543f8166e68e36b21d5ab18f141e58b91202a63af9cafffbc15c0774a80113ba0689d268c17b2985d6def94a7c59e8df0fe997d09d2840b1b6c9ac04858dacadccf3222af2f1a50b57947a0081a0006063402d0ca3c3240ff55973630047abf2645423181f0084153a2e93d12086adcf088a844304001000008320183200b1900480e086bd37a0858076f8103a5010637e01a0a8463840010c30025b160430ef697f4360a848708401000010e403c6545033e5837544a8abccd61a63932d3947b90b6dae9572b4917c579b0f36088b302ade4a138ebee3f9f080fb0666deb8cc88a6b763a98f820af8e4c968f2eccb6078543340be5488b95d128e7fcd4c1f416ad556728bf930c6668722fc20182fc28df7ec8d3118d6a735a5c7919380006c3a5fe3a22c3fa1716e9617a0b02dc91a7f78d2568852f445449b89befc56bb7112a3c4b502b3ba2a72772935b9f5d1f194068ad0943717d5a3bc3ceb51a9d8fa93920bfc716b2e6eea07aa3470566f2b5b51a4618fbc6415d37f567a10be3122966adacb4953ee4435cc6800e010003791000876201a0bb1e437b885f021cf840d8d2ba05e0c00f5c19c95e3cc5f7c61c0382f81c19be8f4bdbceb308301e181eb2718ad972acfeaaf8069655d45519680b4753159826305211eddda568d708ce79428502c891fe7d8c49609aa95fe2f5d5b136ed9c6c67a9b03d915f5623d05733c1fc8419b45e8c303d2fedd0e151973a600e092b987030e02361636e8120610004000035880606802c3500c0100458a75c9e5e0614a931c809403deb28191c09d7c6ab6048183e0100000d320140a0090500009d1008110038880184400a220040d00033090010ad20041c44009878e2c245670583d5cf6f120e63fd7b6bebab4c93c1ad9fa92278c000000000000000000000000000000000000000000000000000ca230228230028020002a0849f2ebfe5efa28bb42f979f5c60f3158f0642fe50f135f5761387fe0cff80d219f1869a9678b9d7fdecd0470f5ac2a4f28b5abc48f56becbb8fdf39492844d36f02d130eac2941b352593ca16297403fa2d3c3058d443633b4aba8f77adef5af2fbdfbe5d61f9e13c4aed6b8eda6ecd014a7860914e3bccea00602002010002f010010100000800e3b080463c1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase10" = "QuadFullTwelveCase10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase10 private def zz2315:"s090b"="s090b":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l14 l25 l27 l28 l29 l33 l35 l36 l37 l38 l41 l42 l43 l51 l6 l61 l63 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2f0ce7bd7, -0x58399d0be, -0x859ce5eec,0x4b0], ![-0x58399d0be,0xf883b044,0x66efa1314,0x859ce38e8], ![-0x859ce5eec,0x66efa1314, -0x2436220dfc,0x5941d5ecc], ![0x4b0,0x859ce38e8,0x5941d5ecc, -0x2c89a2134]] noncomputable def hinges:Hinges:=[(26,l6),(-0x6358a1,l9),(0xdf8732,l11),(0x5442b8d8,l14),(-0x2c89a2134,l27),(-0x127aa473c,l28),(0x2c89a2134,l29),(-0x3029fbb84,l25),(0x2c89a2134,l33),(-0xd1727da0,l38),(-0x2c89a2134,l35),(-0x1b6200787,l36),(0x2c89a2134,l37),(0x52ebe862,l43),(-0x2cd7635b4,l42),(0x23b692b7c,l41),(0x2c89a2134,l51),(0x4c6b6e33,l61),(0x703ae6d,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c89a2134,l27),(0x2c89a2134,l29),(0x2c89a2134,l33),(-0x2c89a2134,l35),(0x2c89a2134,l37),(0x2c89a2134,l51),(-0x3029fbb84,l25),(-0x127aa473c,l28),(-0x2cd7635b4,l42),(-0x1b6200787,l36),(-0xd1727da0,l38),(0x23b692b7c,l41),(0x4c6b6e33,l61),(0x5442b8d8,l14),(0x52ebe862,l43),(0x703ae6d,l63),(0xdf8732,l11),(-0x6358a1,l9),(26,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x161201cc0200000001b01480200001608404cc030000000b00248030000000d80248030001a8110050c0400001a024028c0300001902c070c0300000002d0248020000000260148020000000210188020000cc1b02b4c040000d0160274c04000001916014c020000188b4088c0300008c1302b8c0400000000e03480200000002a014802000002512038c0200000002501880200010816026cc04000000009018802000008828030c0300000903405cc0300008815025cc04000094190338c040000841d0238c04000224260114c040010e19c0348c0500022c240194c0400002104c054c030000208500d4c0300000016240cc0100001488c058c030000148840d8c030001444701b0c04000000000c0c801000000121c0cc010000128640d0c03000010864050c030460841100e500400000d82c090c030430881201a5004000000a0603cc02000000f07028c02000000011018802c608c0ac03c900500000000501880200000000e0148020000000e140cc0100000c84c058c0300000c8440d8c030000c42701b0c0400000022240cc01000010844090c030000000a0c0cc0100000a8240d0c03000008824050c0305c0a01c017500400000009802480300000000240c80100000110b018c02000000070024803000000012014802,0xc848094c0300000001d03880200000002502480200000000a03480200000001e01480200371488404d003000000019018802000001511028c0200019151102d002a30ec10c0a2d0050490c822019500404b0cc23011500400220c84407500300210d84c09500300000120e01cc026e0920a4066900503908c13013500400001206404cc03000000090024803000138110058c0400250982402d003000000078024803000000001c0c801], #[![-1, -5, 2, 0],![5, -16, -5, 0]]⟩ def dynamicCode : Nat := ((((((((((0x3a38e5e8ee33e49efe7950966f28cbf60844c24a18a08a04904b00700600cb31b2fc3e53b7) <<< 16000) + 0xf5bcdf56b59fead6acb780af80856102d8e893f7ac0c50c00000187c5878e42180365843b03de44250401acd8e605820000038be1820000009604800000002340000018d60a8520848010c2116cd42e760bb8b1c000001e4aad20c132902ae67fbb4cc0c77e1b56b3d434b0c0367261512ce0c040000046950df8404000000cb23200a000000002af9e949000000003e05346080890034048714000000550271200000053be6109a676f8f2058e000000bb80609c00a59975c60642645b97d458601e27401246020000027720202000000708124801400c00007e480024290006733d1c72f47719f24f7f3ca84b379465fb042250c504304104402202580380659b672e03c999caa8709e8c77bfcd4d6c1399010aa1fdb1d8b59b0c6742c3eb350ab91cc70c192983970b0c371e5d980d589080000013880142064a6131bccb0400000d861c2400000001b8a0000004d9ce0d0322410a80813c2fc6f60266327691eaa0744c20c10810410a0c60cc04a009032000200de28000000e2b38900000037d4c217b895b4a8304e1cc88a6088101827dba061046d578b2750a0c0000012c01830609f69d18c04000008230c900260100000f290002f12000a364001b6c82982c158060aa03e8e397a3b8cf927bf9e54259bca32fd821134a2c72c21c208228130020021de5a76cbfea83c73fadf5f39a9b87f30315b010aa1f5c219a5b137f9420000009603032cb710ef4406171b2519830e14ee84d316108aa2e3283010000038be5000000004680000063582a148211804349a04b97bcfd162800000ea600d1117782e9988488241a6aebff104d02d2c8ea01818d89e818a50d0400000d929c580000000421d2800000002fb4e4480148103cb000000017bb349873fc8636943c800000082d8e2c50000020e5ae3443af35bcfd042440f3b25e7c9a104afa61dcad8830316d8b793149341000002f9685a8d2005805800022220008824001898cb04cafe7ab3bfaec81a53d4526a904600205cf22a0511839219010811408a00f9a5e926311a96a523a1622a774e05b073a2cfe19b0d593a0a8b541ae3bb95a3084e96ce360c68146800122104001e1940f20070a1840313950f3060220925a4a59608002c96b16680001718a25960000019888e4800000a8a0c8ce104c010d36a373ddb483490611aeb940d0842858110930200000046347000000005bd1000000000b74000000a3880427042600871de2d9871258384351ab60add1c182cec304cdcd0c000000e0587020000005af02c0000000017990000000006d285000000003beb48002901471d2783235f222060000000421e81600000010489c502a7bc1941080c00000041a00a2800000313b87061d1a6db0aa1a1800000083407000000007ab872400a80500004144000fc48002c69c201195ea5acc0a1364cf3e420401ebbe22ca0000291923890000294742c4000012e2cd0300000d78ac067082400871800001a224f0c0dbb7ba7e194c3272fac8ad9445290f84766f718400011c5cb82b91fc27c2099338200000128ee3900ba1b51bda26048469e657b52156c7bb6f4e140000000b5dfab1d53df2f3dd63d473bd6c663ae5085f0ec00016a10004643228aaaeb4bb4c24bb4983a98a11d02cad3a3a83509474593d1323e9a4c9bd09a80d5a30044abfafdc2e316f832872c12cde6071b023f036fd948b16ee2da48ca8c1b2838366500f3ec9bf5896f921fa03d9fbe4d4ed3cbcb900130efc8c745e436b283ffd98f8d1b0803442edd546c74f7d0af1bcbf37a97f6a4cc833052e79c939d0b482d1f839bee4b298a13262de12d8c6a2367edb53e87a323df7b9135f209351d66cedb0c467035e5e75ad74341a45edd6bafc896d54331045686daffd8ecd3a86c436c32f3e39716e4090b3d0695300916b19210ae3401d6120405804000020482a008001cbc80097a105209000ebe9a083856e2b2101070ad1a94082368b4cbc890000000e10040523aa30811005d22f112e5142300c02800813c0409c0200017839036d9623b39bd7ddd3ed4e01fa98231aba7d4cdfa0b78ce40150548718a1471480c508204400170c9ad548698049598a219044a5e152579962b3ded0768d42a8b3a4c0e568080e311836d96187493bacdf0ef2b70b9a0c9ed408c941243c709a8bd35e8902e487e0be7d2b50b834228e19f07a943f691b0b30cbfac4222ca1c41841443002801002dcde73357b147d878607293ba07f28c0b8b76a550021946d664ddfb0b12e8fc85f8bafa131b6bd5ea59a60aee1aadc22f0b6b9036d9623b39bd7ddd3ed4e01fa9823000000c86db2c4766969439eb17b59226084941243c709a8bd35e8902e487e0be7d2b50b834228e19f07a943f691b0b30cbfac4232c41c41441032001c02845973b90887be768bb27f44243abaeda067f396bb40066cf5dbcd922e8894eb6ce96d9bdc9723f7988a28f7decbe4602cafebc8aa5eb904bb4c11d071d00045932c30e927759be1de56e1734193da8118000003206db2c476737afbba7da9c03f5304600000190db6588ecd2d2873d62f6b244c1092824878e13517a6bd1205c90fc17cfa56a17068451c33e0f5287ed236166197f5884851240c3062061844fac1c421da04b71224feb956837aa93777a9e92afba81e7789d31590bb2d4ae3f416a12a9d961c959d2648d9d0c22b825384c456a0cd37c9db87d6039abf1e8ee54241901a0800200053520a612052090006b6991000000d343080000021e1c2eceb0d780608c4b3757420546db769c2803ac873ad1001d644b)) <<< 16000) + 0x02840764b3fe941a030840200a20205001027808138040003c64134640023e840406702800001c2014101518031e08247d5c4de040182eca430060305d8f2f8000efea43e7c200ba438a20330c1180638797ec040c2bf2801904282604004d0d000041904c11025868128340921200025d3b40b8f1e11ad5db50ea3ea059bb7b484080022bd56c06a0000000000000000008a0000012b2279ade8731bfcc7916ff3eeb9c01b040aa96189b068000000000000000002290c18818c08408a008004c9091ae3bde204d6ef7281c8979b526bc2760b4c5644f51ce6876ef1332fa04508ee7fbb2a57b14780405cfedbd621b6012d1014da441559e29c584edf630a70f7a7032628474c3a44855048050238281181408a0a0440100029b10432180806c108140820281b77677f22cc4304adb0846dd6e14218eef484ec31008640f214dd5480031b43fda3c2380e549e0b9f501401d988ae4b0620a081ca0d1e408201e173f51ae555ee585a050c29d3eb45516287dc32c7e254b1801a31ff8428698d1aaae0c918de8586deb1020020047350c00004004f221c037915fd26403e69b610e09810260107168bfa0c4b0b25bad94e9716457d7337e6207003e17b307027985b009c9072f1f381e900adcc80ee4040083a08c4200000aac26729002300870e01a3f0a67201438bd8493230e240e9e4bb2acb2b9c0cec61b31a34048397def3c283c14012e7431c7f0c4806b8a24213151001fbc377ab620000124ce944bc24d5a400b80d000046c410007e68b3360d320d2bb48393de26931a9e101d33090068c86e90618090160134f00004008e6a6806d2863d9730000300755b9400009758d87900250086958b498fcc99a4c431ba2a0261200746d2b21a0b571f81ed860201e049595940801d1b1be808000a01aa5bd7002600c0000c01c2404367da056977c100503f36dd51c6f2c0d85f241e8b4cf81f1b2e011494016d46ee02c1fef05cc900cc240269d8422bbea0001154a543297df8b40b943fe9a060045090561f4bb8fc8648b205587d2ee4046271671451230c50a20208258180001006d61f4bb8fc8648b205587d2ee404627167947145102020823002018000100680007c0004000217001806e0200047c200101840d8240018d4646868fb1dc594280174872a091612a86207a28600000096020100e377258020829ceb1d8820036267dfaab3841280400d40406802033010000dd903001d0d9fb25036cf648c626ea7e80a860a0170a0e9c0430834627eb60de6057abe42e4bcc3845055713398e4821d7edd1c2c2600956083d9bc28095ba5bf4548655028580509204974b2f0807154036d7de806142fd0ccca94610c34ed1bd0cc093cc94e1ee07099635d8ccf060afd35b1d30080063442541883002ea4b2b72244801400e00d80405a0202c0100d8080ac040004c668569e6e76a3c9c91610c5a2c756220555eb2c39d2ccb1145879c919ee184048944273c14808720d66549982c0b58a422d47610aa92821e75241e088fe33c36b2d1c60b80c00004524001b848150ec0a477c44d3a3e09e90180174953a070ef7fe2ca16480000000960180054be75cb000045d5e9b3105012628250080000ad10018ec3c50958a94cf14283a1cb0801020000004b0181002e91c641417e3f5573518023ca97e48140423ad565651032a697ae22e384800803f0d01f0480f4240780203b01000105103a3581c9ac0e0d70328018de914d9028fcafe3395110197a196fe39d90016c60c0021d0e04095fff4d570a015e0a019f4104006fb0e1c87c00825f0e7f01c6100895ad2e8a9a45e59c614a61444e7058050c1c2c25c62e0c303a9f745a18505ca52c92500bbf0be4547000f9a76dc0a0195d5b6e9000a56fff9e82a4e2846010a5975e4498ab1f998546dee58c0759a5d96480f99d273e8742ba000000000000000000465727555db4d8ccb2d49719bcf5e60f1cd8bd0b5147d9459768000000000000000000000000000000000000000000000000018e364f0b51754602ae95cd7249fa7d42bdf036274a03397068800000000000000000000000000000000000000000000000006233480c12c01c01800001d7daf4033a0b1732f2ad6ef4c156588e6df227c0f661f4895fc2bff6724337dea6bddf7370e4062c5bbc1756689110de767232767a6a07db397cbdc81ed3d397f834a400c1a3e7f5d268675ae822490b1deb6c0a205fddaec72417a8c84960d006ff541a330001b9aac3ca0083a5a41b2704220086901d8826c0144034a743546831edb3bbb1209be5643da08011adf47a1282110040000424c0100401006e0200003720005b640d8240013c670d718b6ab4101008c0d346402226953f89600da2f971e100bd3e3bf40b2861100400d40406802033010000a590321d8188ec0c007231f6dcde896f834f58f00b9e00ee61b3a55a40e0866f4c308000000000000000000000000000000000000000000000000006413482081c43432c0200180000016e94043795d441f9546937d67d702208d77f6697701fae0766ff356669ac798b954a2b447cad52dfbb9f29b0c5609cdef1cf75691f9f351039d6655f295b64ddc13c57ef24c1a020af5cb013028123d036e0cc017867986a240500cbb56c0983088021e52015ca48851536df32b4123116e5a0a078a497476e8940a65ce9a2440256044cdd16014ee9037404e18440100001693c482aeb817e2498734962dc40a10b6ab1f0e106f198cb9081225648d310250c2300800180800049c8178480b82400085670705b15cb4e)) <<< 16000) + 0x38f2a984207860c25466953181062b783f90c20b557c4744000108ec2283014f8d626680ce204601002d0101600806c04056020001c639036d9623b39bd7ddd3ed4e01fa982395551c2a3c0ed155631891f894c1879b09c41bede4d5405380000000000000000000000000000000000000000000000001848b18618b08a08808508b004001500c12008034000a8c800663102a1d8148ee0e9fb4a341e339a9e62a097bb4964df3896ca247a8979c612dce5a2a740e191d337912e8738fc61702fa21194a8e2233c8022774c3b7ce28c11c048b073caaa65530c3017bef1e7362c65ac73f72b950f945f1512d1bb44b48c34df9f0be0bdaa407c72bb3a19471169477a49bdac11c600629f3d2f02ee64123a576ebcde78f3e9a4c918b480225f64d4acebf61c4adb85ed774b64ba036f2a288aca99cb8affe25dba6f35b442997a92b1e2ba9761084817c43368de455ca8e5f00e138ff2bb33f2096b3a3078040dac2bc311caa0ea83e7c5ffbd7d8cb6ec221c5d54930e4461bcb94fe7989e26a14021dc67127b97d98970ceff49ec4702987694cd3071e886ad6a4d5ab9510f073e000a00404e020260101280803007014010045082ba3645a082826adbcb0b000835d1642402b4d482405004d9e7b45094208802100801004000011180600802000008880d80800066481206808c26044120210901002a890ed7d9d58821ddc99ef8247003dec4f091834bc372a181395403260b0395bd648f2000b2361df8152718220084114c315863080c0246647e0c083411b9170419daa02db80320811804007c0403c0200010f203a1b01c0d80d82f8f3cae36ae473fb2f66fb7e51e07db71382c7a2a78850a02c22f0d6724ed88db0b3a8c045350f0e5a9fd7c9bee70796da33f016945c15d8cf75d8aa64e37fde52edd2548b192082b6d9a85e1dc41d39cd2f4393262dab4537fa092ad313a3d9a51585d23317250e40002509f6fcce2b0a8896e453345cb94c45233e1310452db0fcfcea0e2082ccfe0cd00431876d16768be38dbe7cdef37322d69d62384b4440592acf2489789e2463a1675001a1100c84806024000b4a400226080057910013d22005c1e6965d791262ac7e66151b7b96301d6697659203e6749cfa1d0ae80000000000000000011923f9812b1e101072255dde770fce8357c77f57c09a1a6e43678000000000000000004448c7db737a25be0d3d63c02e7803b986ce9569038219bd30c200000000000000000000000000000000000000000000000000190c20860050020005121647c9537ee03c75f51e72daf16a5a23973a25acd0d6f654f419704f257384959a65e04cfb40d93e4dc061ad0e19d42517e7c3b132d20db30e56ad426c67e8dacdfc7106266d0b7f4e6e6ff4c9192f9aa5aa767ecdbfc0b9af2ac9ed7f28d0ff0439ee96ad72ce3d824966e5db9e84c18f460edcd96d8cc14afc3b07d4980946a3626695ccaf008603bc9e70e5aa254ee48ed2e0b164b10a6717ca02e1a0160900a848050040260200095a20073e04015e78fda72698beeade3965ac928e95563961bb7e119127751e5000000000000000000000000000000000000000000000000bc238a3883863063022021000031bbf0a717201c006fda72698beeade3965ac928e95563961bb7e119127751e5000000000000000000000000000000000000000000000000bc240c40a40838838438028005250ee089b8a0f803606604bbf23e20505ab7890920490c0de0601c3301ed47a91c2e765da03a0165142400800008d90000d009008000e1480882c0401601e02c81b6cb11d9cdebeee9f6a700fd4c1188e38e28e18c18e10608a008006002820192c01006e40db6588ece6f5f774fb53807ea608c586116c6e000baa932d6b14002d5c9d5576d36332cb525c66f3d7983c7362f42d451f65165da00000000000000000000000000000000000000000000000000633d5072bf33502d4a1890080070006f90d444138b31432bb45f056995e0ccff13e0e846a79cbaa8f2a8155162e0ceea310e9877ee2f5dc6fa8ddb7b41ade4ed87152091f3d9d320fb514fb107edaa164c5f37d56758ec302be793b7a7f0d6a41c010555d3bb9072a33c0a39bd7ddd3f4c73d3478230000000031e3d09859209a390f523ae6c608aaa4cb5ac5000b2c5e8c8d341b927f79b19d2239d213fdfc3913f046aba39217ed0000000000000000001190a20a18508a04104063ced675c7bb0ee9d1fbf157e472b48c3a217fad39f0e5c1f22eb39179965671a913d12592a43476f7c16a17aa5de8fa048675b1d0dd8196e194116657a3580e4df7bd9f93d0c625380039128a9e23b40014acc8bce75318d491028a385ff880882b8a8f90414b8f231382802461329ac16510230080070080340400027c4030360161b00a05c8ea1ad5ce0891475595793861806edbf5e242da2d6e7d448180df9c1500017ca7eec000130a11804002407455b94ab6e4286b2e731ad4506ca3fc2b6ca0177b8e15b02120a1180428ad4cebb60050df1389f174a0c4f3865858c00e49c8b380424142300800007390001e920102200709003048000e7480081e100117c32aaa3854781da2aac63123f129830f36138837dbc9aa80a700000000000000000000000000000000000000000000000003088a18a10a088084088006002a2cc94c8acf0c6d77df443d6b9cc0983e0f1c7819920de3220de5de856082eedcf57ec66099a1c369ec483e6cf5d717d273c58156078cae59c662d00501002008000fbc801868008340020200001000dfe1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 22 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase11" = "QuadFullTwelveCase11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 22 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase11 private def zz2316:"s090c"="s090c":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase12 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l17 l27 l29 l33 l35 l37 l51 l63 l68) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x6f1e33f, -0x2a75474, -0x278d7cb,0x258], ![-0x2a75474, -0x13ad43bd,0x1e051ae,0x34daed3], ![-0x278d7cb,0x1e051ae, -0x113fb42e,0x2a75924],l68] noncomputable def hinges:Hinges:=[(0x26d8f8f,l17),(-0x153ab66,l27),(0x153ab66,l29),(0x153ab66,l33),(-0x153ab66,l35),(0x153ab66,l37),(0x153ab66,l51),(-0xeb48bd,l63)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x153ab66,l27),(0x153ab66,l29),(0x153ab66,l33),(-0x153ab66,l35),(0x153ab66,l37),(0x153ab66,l51),(0x26d8f8f,l17),(-0xeb48bd,l63)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1284c12016801800000001e009200c000002c13809980600000000b0024803000000006c01240180006804100263014000000001c029005440a104400635006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := 0x81a27e940dc9547aa9d048a00009fa5b1b1a6ed818510e795c260628dc94122000027ec5b14bab92071171078c98fa120009030821be4dab4c209d3d81c300057eccfe3577ce08e10bd804853cc93dbbfe2101e8231b10008a16881a04cacfe12281a264ab18522ae1d0c488068992ac710748aead0c21b249798200289149502801356d4384000c88af4492003e0300001a836000001c9c61af4f905448189146147106107083041070000200d819bf31d5ac48a0eb58a031851b23b8580e20c6887ff4610c4ca705208329ccbfee20022c065b90a0049e0618040007863f5bf2400840700003764000aacd89a24c039a5d7d6975e605400019867e334737e2805a96dd9c1799085ae7000000000000003309c5010ddc44ddc47af2ea3a32041541861c21020c1081f39e71ce21bbdc43f29d497ec515f0cdbc91c26b9d3602860638ce8865c3696aa27b0fe7330d8a63363503bf532d270a118c58d00038734216bf5cb34308220a9175082081fe8740604103fd0e81412f1e977f430422089735140ad795c7f0400cc3b743e1c9f02af21d880c220200000df100b0500500a06b75612848870997746441818226bf77e74850887d26f94820021f43e95a070037406684a14010fa5d7fd08373d7bdb84b7973350a7d1c20980c1c78355beb0167c93ba420554a898f14e37244f7204762fdf93bc7fcf55d1c40000a32c6fb13aa701c20de5cf295ec253d74200077d0c67a10885b50140000020a27cbd0bbb00000000299a1c9ac8f60dec94cb8a240022052288222aa18d02056086ab4d720488fda191510300003d8601800000313800c00037c0f4608006df731e60400d0dcaab0932000900a00003527880003409e001436b71f2c861881c3929c6b02420a80ec5176e03022e83a17b521417c6c151f25880af746ed6ebc30059eefa3b30000da92790b508538480148222868aa5cd38840d4e8f947304115926e01410198f63f190182d53e6832c4000001c200540c004605000014220006d2400203ce1a66a949a18300002580504748b5b51801c17819430000000c808000000642c003c0080090100400801c040002b4401837559d494286005e96f8c3ccc61ebb6aada91c4735a7aa2473b29000000000000000000000000000000000000000984182400380280100e6df7823bb5e4883ce904e4d80b4e9dc37479feef0dac8cadb3788e79a1723a4ae95ccf3e3342249fb805662468d090e139e546ffa7d17ebf388afba141823eb4b3cfd28bee367735ac950d5e2330b072511aea7fb1ddeacd705f101bc35f09ba2e286641616c8c1113390446906b0b182c87d830c0ebeac2c503e99914283609545100a47833800c804366aaf0f8da8166ee226ee23d79751d19020a91630c30c210110096008002060000401a000232600002008c2056d7684049260ce020c9db510200202904840079227b2800d004000037880008d98149603e3817b4b716d8ed65b5222db270820ed2fba7d846e25b93b46a7697782381410dbeca5c8742a1c4527726403985584083883f2b1bde19dc78dcf0b02c1444280700bc5075b9b62fe1b51b2e2ec191378a02a91da39e48d81b95eab546b8e8d318c86eff1ab0aba62fbf329953c5087b1900001d2900074e3c2f6b6f511d4bed5c21a739f27e0c582324f2ba000000000000006a0000cc33f19a39bf1402d4b6ece0bcc842d738000000000000019bb66000a62061823002800810b31634520e0c64560399dcc4b33c52866908818e81a5d63360c2d4fc5eca2b9a828860dfca890543175cdd3383cca7c900510ce2de8001df1001021200379278b482a921c3661c088c0c880f944047d954c1021b1e111000852198603eae4389c1064021c7dffa9e838a000096060c0003700c08f01e87101000025854106c0100001c840140504015c490c194e2f2470925914e284033b741c12956868a0c1247fc5009be76b3800c804247818d28491404f8871828ecc11c5050f42180c0327a6ac200165ea604005fd2867001a0080000959c1af452a8e14f43fb8a10b488f8a017161848003001092635bf450510013075870803a70f4608a7ce2d430037fcffc20000113f26001c00800008890001dc3022c45c7e2b12692787dbdd7c97b8d980413522d2f074dd7aa229a7128854c8900c050d4be9150110eaeafaabbce6ba4a80a0390884a00ae8245386d506ef3f1da80802e26b478a8174c69b314cef8776718084cd4b71ed0c5b6e7a40660f1e87fd632bb18d7674f16b0c201f605047818470a8f10820a2b8427212087468879eab6fc76aeb5203d4c171e02e994583ced5d8834305e9d35114f85ce55d51301283e03fafb7097ce7fb2e4df0bf6da24bf954fd3b14aade889a805efc34e355fa173bebaac71b65f1ea8b360aad39f055866fd88199c45cc226e276d1339be887a48a0db1ab19658e432d6eab2165e83de1488a75c415755400008744001f8c80062f1a2f8b8439760a189605a3850a0a284567af0808000138800800773dffa4860000004e2004001d7c21a1e4380120102860008ba23020000960283c16efb2202000096000000017112800e00400003a080202800c04004020002b8200202000010008d79 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 9 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase12" = "QuadFullTwelveCase12" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 9 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase12 private def zz2317:"s090d"="s090d":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase13 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullTwelveCase13 private def zz2318:"s090e"="s090e":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l15 l22 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l4 l41 l42 l43 l45 l5 l51 l54 l58 l61 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x54870c5a0, -0x3183ffb58, -0x4a45ffbf8,0x256f0806], ![-0x3183ffb58, -0x14fceadd6a,0x2e13afa4a,0x32bb3a650], ![-0x4a45ffbf8,0x2e13afa4a, -0x141d79c7d3,0x3184004b2], ![0x256f0806,0x32bb3a650,0x3184004b2, -0x18c200004]] noncomputable def hinges:Hinges:=[(-0x3ab94065,l5),(-0xafb9180c,l4),(0x2c016232,l9),(0xe91a5d2,l8),(0x1754fb51a,l14),(0x2bc57027e,l15),(0x446bb720,l23),(0xd7f02c0b,l22),(-0x18c200004,l27),(0x18c200004,l29),(-0x1754fb51a,l25),(0x9871fefc,l30),(0x18c200004,l33),(-0x18c200004,l35),(-0xe91a5d2,l36),(0x18c200004,l37),(0xafb9180c,l34),(-0x9871fefc,l43),(-0xd7f02c0b,l42),(-0x2bc57027e,l41),(0x155a0d59,l45),(0x18c200004,l51),(0x3ab94065,l54),(-0x155a0d59,l58),(-0x2c016232,l61),(-0x446bb720,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x18c200004,l27),(0x18c200004,l29),(0x18c200004,l33),(-0x18c200004,l35),(0x18c200004,l37),(0x18c200004,l51),(0x1754fb51a,l14),(-0x1754fb51a,l25),(0x2bc57027e,l15),(-0x2bc57027e,l41),(0x9871fefc,l30),(-0x9871fefc,l43),(0xd7f02c0b,l22),(-0xd7f02c0b,l42),(0x446bb720,l23),(-0x446bb720,l63),(0x2c016232,l9),(-0x2c016232,l61),(-0xafb9180c,l4),(0xafb9180c,l34),(-0x3ab94065,l5),(0x3ab94065,l54),(0x155a0d59,l45),(-0x155a0d59,l58),(0xe91a5d2,l8),(-0xe91a5d2,l36)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x320a0518040000000068440630080000000000681240100000000026240cc01000000004a260298040000000098540e30080000000000a81c401000000002515034c0200000000004a049004000008102301fa301400770c107205b4802800ec1822040a610050000000002418198020002986614409a40100000000088300c60100000000000d0388020000002884403c18080000000521201c300c0000000190981660100000000001102480206926101860371a00c000188450cc0ac401000000001d0d00e60100000002c9440d8c030025840460814c200a00000000028303300400001212020324602800000001d0901cc020000000003428198020000000000540620080000000011160660080000000002102c80200000000220c0718040000000000440e2008000000084320446018000001885200e4c040015a2143800c9200a00000608a100d2301400000078483014801000002b1086407900300000000160a051804000000000005032004000000054120446018000000ac170218c0400000012822043180800000000002409200800000000502816601000000001b09024c0200000000341a03180400000000004c0520080002684209006480200000000130b018c02000000002612031804000000004c280530080a20508220031a80300005409c1401b50040000ac1202c04ea0080001482a04803d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x823e0398040000000000a40920080000000000e81c40100000000003102480200000000002c02900400000a102301fa301400000010424058601800004a218680a90030000004c461c072004000000008c380e30080000000001081c40100000025230e0350020000004a441c04a0040000006104807830100000000c414038601800000000221c0cc010000000001c18198020000000000380d200800000000000606400800000000005024802000000000024069004000000a10c40693010000001481a007260200000002a08802cc03000000002412059804000000a10c403930100000000000880c401000000000006c0c8010000861882204b200924881811701f57401e44902010604ee280380000000002d02c80206864864040311a00c0000000005c00b200c0000001303401660180000000e844098c0300000000005a039004000148430c807a40100000000000280c4010000580cc2900a1004000000188460341808000000884c1806400800002108c14054801800000002211038c0200000000260c0718040000000084440d3008000000000108124010000001444301a0c040019c2841c816d200a0002585610409a4010000360a21b809080201c119214101c85006000000001a0c0718040000000000240e20080000000048300c60100000000c8440c8c030000000000320490040000c42404c0cc40100003a0681080f080200003c0841400f10040000000000120310040000000220a00c300c00000e204603f46028000002a0d06039002,0x36029004000000006c4c06300800000000d8880c601000000001b12014c0200000002c13809980600000005821013300c00000000b0900e6010000000000b00248030000000001b004900600000006c0900c300c0000000c81201860180000001a024028c030000000370880598060000000064240730080000000d02201c6018000002087200e4c040024a4343800c9200a00000808e100d23014000000e8d83014801000000010844050c0300000000322e05180400000000000b0320040000000c45a04460180000019c5b0218c04000000308aa04318080000000064580b30080000000001080c40100000000220b018c0200000584a080c9180a00000000038503300400001812c2032460280000000290901cc02000000005c3403980400000000a85c0b3008000000000d1206600800000304930268c040030850c91812b200a0000004434140b4008000000e23180d0602000000001d07028c020000000290c80a1806000000000987033004000000000b0a0660080000000150b014c020000000000320710040000000000b4092008000012208603f460280006114c3801a1004000000308a60341808000000000a8703300400000000e828146010000000108640c8c030000a21984604d2008000000006428063008000000a20900f0602000000014828070c0300000002109016180600000000841c0a30080000208841a0148018000001843201e0c040000000310d00e1806000000000054092008000001c251813460200000591102c075003,0x6400b200c003304504a026a80280000000003101c80200000000005a03100523072409f0236f401c1419210e180e5680302832421c300fad00600000000003203100400308428620170401400000000001e0640080000000001e014802000000005a1c07180400000004219014300c0c1086861011a08030000610c41302ed00400000000000381900200000000003c0520080000009c08802c60200000250982402d0030000000000f004900600000006229022300c0003b04a0e819880200000000068004c804], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((0x1a68389944a234a5105db70060c07213520cd0452fac4af180c150ea70030005bd1b94850000641f8e59c108c02132584804c96117d573087eab98440784d28c28c10d0ca08504f00d00200c8200803400043c86b04c354261a80bd2a19120b7c30a196893f98d1445a73206181062f720a0a0000e3ed311250c220086952dcfeb5d046144f60e892306080094732aa0686883bc7e54c5040b2c21fe76780099c13c3aa6802de106aa7c1001f8f567e62264406140100000734869848000c2886908c3443784c7b2099db9f3ea592000003758f28f18227ef3f9d2690f45863f8148f38043c181235227ea3e151860275694a1e777188004db045595a821420000003f9e258446c9306e306c0b0c26bbb92fd38b24000008280b0c2bce070a4c0a1149ade68c04f57316da0500234f794740022caf51300155a040508000000960220e30480280001c821a00a00043d38f4b00481a44833a5e76fd6b25f763da0440264b0900992c22faae610fd5730880f516169ff5d3ca7b574f29ed4585a7f83c660e50e48e482400380009f2679a85b557e10f48ee6e0a37baf926d132b1ad5b847d2da8b7825d10004dbba0e7e551a26f6ec2dfd7fb6f9641427f92312689674000e4c82180ec981cb555b901843a54f50900d3494810008463842010c2804dea27a2d49a2de87c12c32d234181a4998b01e2280019f89d54118001783dacf7c8700000000b71b0089c40a305e078c280000041468b2f82256034201ee10d71a0b5401231c000de305efa00000002588a8c1080200004b880016c9d2248cd34d65102b1d51a91c20b79b0d59200b4638538800c1795b900081290108040000448d964c60320346788638921f8c5c2009b1f164800000f66526608e1b0693c9df5c2f04609599a438c2416a620257322884ff752d0003541bc1198e4a90003c6b31ae30720c8e24ca9c32a6e782c90000027d3500e1bbdaacc3283f304da7ef138db88809c64bb389a652c010747cd613b800131bc522a3d20009c40e305c0780001d03a4537d22740a22ebe1daf9801ee064101003a5438da002120e10004000037c8358280014848678880028a086504e8580800ec20fce038a9fa61042758d070c3dd8ae552ef90e122f9a4cdb99901808b059d109a80428059b7135ebf4d81444febc40d1354003e52f09a77e16429ef03d552e815fbc86343304c00012f903711d0459b79f1c0e1000000828402784cfaf60808779f7bb00835a0f1e3b10045b9781840010a46c4f0258808801019403f92e73a8a808515f3859f5d880cdc498b3ece2596068cb8a000000000000000010152f886eb0c3c9ab4a260fbaf23fd308dcc2221c51c32822011011400c0010bcf545f8ed1c37322f296cc7ff766055042f394632627a59ac9004f586200b29599dded5b014078dd67651971cefd332ba85fc10e8392701874000f2880f0c833854192220cd05066028001724ead983a033ac747b2f3b7eb5a3022fdf0420264b0900992c22faae610fd5730880f516169ff5d3ca7b574f29ed4585a7f83c658c48c40c3061824000019a2fde8d5f066e0cdb756b08ce5960393e712a6b0725a0a57c856b76b97e03c242d6c1bb5f7ed82eaabc3fa8095341445198734cb6a1961b06e05e3d2c0106758e8f65e76fd6b627c718a0871459aa0b06c88e048b9bbbd71cbd5756021677954c4e02d55aae9e53d99de5531078cb1881860c3045000000003a283f17148e506fd2f13178050391136285ba23ffa298134d4cfaab1f10813603946c50be8be198384d8cd99e2424df794e7bac49b45ed0003af2) <<< 16000) + 0x1940ba15700deaffb41820531f8f2f1e8c9871690b95ce6fd2a1c31523741804da85096b9423285d56180a8200929ef288142bd1f5117c7e8030ca4e1a437c8517fcc3369b993100862c3204800012890370de28b354160d911c09173777ae397aaeac04397163c9a5daacedf1c2cfaec4066e24c474c84bea10a9d228000000000000000020fc9739d4540428af9c2cfaec4066e24c59f6712cb03465c50000000000000000081020133bcaa627016aad574f29eccef2a9883ca50a38a284100001c808fb6b437dcea950c6293027652e868e5c1ec9cb03789ac60d7107d7d261a2da232961eda87309cfa041c3ea1563426371222caeed6c782b3e35aa723334c5d600614663f190398c110f675950e1a04fe1aca4255a4f6dce18f24d35017f25ce7515010a2be70b3ebb1019b893167d9c4b2c0d19714000000000000000020516169fee6a9a94574f29eccef2a9883c650a38a386284300280021f0c5923bcd746b07860065669712b034bcb3fd52529247effeef973aef0f156276ea3ffef6d8071b9704fd5a4fec17ae63684a9d3a8822624e832e8001fa101e190648883201400150c431c8407a120014e720b223ddc4c869a58efb30676b0f112d0fd9ef476f266caa9d1d2cd1dbc99b2aa7474b420af0052b5d0124206384284204102290a076cbe64515ee7273c89a0f1973d8a46d77f0bd3c80006320378f4a7f13ec418bc634a959fcec75214706bb94ae592bb6cc557cc03bde862d477f7714b9200f50dcd416f3321a16d1891d60e55f3e293e245112c0548ac2368002289c20f035224770604b69cd8811010116ae7cfb3a030448e4e8c1901800b6631cd3d0502f79da4b8e210063b5a603c101440006ea75f8a80a231f66da38501e074c2a02000010c90c64d06284c310141860281b54aa71da420e12fa357a1dba182a6b14a82fa0284501d2e360388007f08e84eb50e03401edeed6f140159b33361c62a0aa78766b7b8203155680a251719cc0ac091a501a0c160f364698b21f2781b2850c86851004afe28e7c82c6307000000b299f7fa163d7478ffd00cd910a01b8b1b3f0e8c7ec01182ef4dd5a9f9664b093061c82e2c8acd3708ba6cb1f674197c945287074fb0eefa0b040d427e1554201000000749a010400077aa7c20c004e387f8a1000079e3e348c600d002dc2128c880c2a0200001039bdb7fd7ae9e53d99de55310784c28a1ca18918908704400200030200200d0000f02184230ac01dedbfebd74f29eccef2a9883c248c50a48a4021823801002856d4eb214b6bb063387c95df3a47152882efe691ce38bc2050001873441209be7e21318dd144e59e8592210f96c011c049222070545e910249085b91b4294f32d0cece4f881030ee8ea311cfe9c07de21520e09774bb6307855b2834c999771401a26265e235e80cb6f026b21081d952a6d316f0f020a836f5c02304fb499dff5a0419ff8746553a883429bd15b8cc40c01f00003b520861304201f119eac1c3f81b8e17fce6f71401c3879bd4d69f1ae1b6352ba3a657f218305cb51ceee00d482a6d6d2e9c00810000001ecd6a5ed2574625dfd001043a7151e069eaf0ee299edc0cac10001a6c18cf445944a0a933ac4a115005a63cfd39587a2f36fbf588381013d006ab9fbca378d818b1a44700007444003b0c86096e870274338005d0123c31e481d06874814142f97d2722c4880000016c6140243aaf36f585cb1901cb0906c28b9d48025848333b9a6a38003420da9649067104021881e32a01f7e2e085ec6477a9216d4672071fd729fc29692e100000000000000001f09238a29221219018e10c00201804010068000c3991d516cbfcde01c60212b4504d0910890205acb72049b1105fe10c90d33e8caa1fa203250007473f87087b1fa6f1ba141224080d143c70005813770f2612410a808123dde055a14a8a29b8f134c8312254b1e79eb7102735ded7da2121adbca5b36c901b2a9950d6f0e1242fa459330a08a468048af0c004d35008c610a410a00700003f84001098c8ec7020878912460212b4504d1037e839fa6f2480e182b320e80386e346807a0320204cb4923f78e10000004cf50404b2b90fe24830002c09bb879614821480e247005a75f60f040df057d0c0a008144f56cb734f8820dc789a64182037a60b353282386f67bf18748070839e7c2d0f00808b4c7fcefe014004d35008c60422410ac09000043243000400089c42fc4417c120bd0905e0482ec241741207b0905c8482e00416e02000d3620b2730b62d85a94c2d096166430b21d8218cc2c4574454fd963b411040c098250e95b020041daf0617418702cbe7429732f1402f0b5b7a080c2001e5c476940240410b55e72a26900100d31fa663325040b4d8a3fba00b48d75034f2aab0ca85c068c2e1d545003ca0146e1b090895f0f182411fe2be34107f5802663c011872e8a6001e008798058fee6a1850927445f8514008e65aa184037cba8b060543d96a31ca00440100001073c483aa487910101c4ab9f1008a2094e014008b3c8ca8005aeeb7dc12821000400003fc85804c2bc1615c03d207e6ab2e283944fd6c070433b1af00c0850d0ea4109050780200001a663b79336554e8e96a3b79336554e8e966ced61e225a1fb3de6ee26434d2c77d98082ba958097804b19ab147aa483a8c66d7ef470b3c58e3b6fb38c57c0bea7700000000000000000806619fe465d605a9a19e9a1a13a7e50ea7282aa61260e3026002c77aa8f4085a1363b35ececaa47bf7f71339b7e37067e222415827d5cc5f89)) <<< 16000) + 0x3f49b64a6241654e1d0cc054fc13dc899c0206fe2d9953315e04d3729eff793b055b4c71adc7b1e9a70d04aa4d19a93f6e23e44a8020cae27d400175085688c2b007f55cc223eab98420264b0880992c240f1b86fb8f950816a97c4375861e4d5a51307dd791fe9846e61118c31011008609600400ef7d03f7142af064c4c7db1344a47df149d11ec69d4a836b286320ac5452ec048a7ec8956703d7f6b624a823680017f10ab1585508c2a436150130a70584102c29807036f7a15e92c1958ba7d82010ffcdeea10183692acb0009060800210286f9ee8e4b0c2e27722c58299ed344c20129e565898604083884c01025182100800008710a50985202c10c079bdd5684a841136f7d6bb13081ecf82d8c05360ad4d3b315e6e3ed120395d4ac04bc0259de5531ae9e53d8e02d55a677954c41ea2c2d3feba794f6ae9e53da8b0b4ff0790d0830890040000098b1a6b632b7da39c8ee5efd3f31c2b083f0880f8de6ab67e6bf9c042871c7bc451f753c2100d90c2a758d991cd44434951ad2514d52eee845cc4fd1141311476d8185525ff108046203c0100a30900005e10a019e6f755a12a1044dbdf5aec4c207b3e0b63014d82b534ecc579b8fb4480e59de5531ae9e53d9cd53528a2c2d3fc1ea7662bcdc7da247c16c6029b056a6defad7626103d8cdeeab425420890e4cf04c04a047004001000f006868543910271044fd32eb3a6dab1c508b7234d7da24dc3ac074e6708ec642fc3aa742216961351cc6f0d576e8336b30e66961400115484b02e800a05cbe42810ce93acc0090a0f802201002008c39df1716cb00bc2375b09040f00200001d8851068284240001ba60300200800002221403b8857a083021210c959900304bedc2ed16024fde9ba8048283c010a0ba26b5b02804f67428a78064489af91820f004202c643fb3162b69de2f8c0b815688c6003801009f010000579e1c1f189cccf029cca49e0b00145786963002000804f0082080400019e4274370221ec4ce51808da356398e0ca0a88a58a0085ea464c8004001009c01f10028c224840c16bd00d87040c48d7068033d0296a3200100043880299a6ae401b6bb3c7544018aaeebf8c008002000014a400064484d828268140005784001508e8a356873c0506ad379fb14009aedf331008c607c02000015c426444000e1e40023d080094d10982184b84e842c71ec5a3e7deecde13ce8b54f85ee6900dd230211a7a336cd10e674319dd79132454ba8f3ae84049b7cadaa91b82d2d3a827021cc43d7bc48e0840d26d53b3e90199d264c8a443075bd68e50666280434ccb667ca0d50e42b734c53b10c41594f1e380270f097934282298b3ab03db6929f4d66cc5c00125ae452a5b55e1282a417ec17fa06908f0ecf461d1141df155d674b22d5da98f1e620931cc60c7ea1c947591fcbcc1e3018221e40aef9934520991619dcf6248da94fca05bfee93b199e4abe63d0509ce4063905fe9a4951591314af25d888173558a6aec3d2081d57492116f436232b96257615c5905450a31f6d5a6031faf53121a88f2d338912594fe2d60b01c1b2a4b860121272b5bf0b81e3ae80cfc4bd7052d853cc9f4d4007da2a8506ba6b24588b72202efe28d34aed688731047883e47091a50a7b7e353afaa91e20985288831859fe7ac304c19bc680e0a586f56919be1038118377d180841bae2d48011497060c024c2842010000139212c0bf242b0e478248d61cc45901c60b7fdb48c60042010f259aa55a3270c66d3c4881c6cf3f5a4fa40802c4f43c705aacd72ea700df333e01280067fd27b4e004201000015c202403814171b5e4f2878f1d27f0903a64fd011cd0821058a7f2001080420556cf6b659e3e2a905798e0bae7fa661e03985b97d1600334670c4a00400100000fe3e4d4eb4cbc9c324e0e98a9233188dead18203a5d57f8602ae6215192821000400003fc8001849d1d0858d47480a3fb79965144f1ab860c080bce41cdfca000a4c4c7c04a18420100001083832cb78e96860db2a559f6207c7eed1a6200394a02be884820420100000dd212a22094110003ce9000e83203c2a030150460880dc340027c2424c9612423c0faff9cfaa40613ff8df11c00dfb936e000118e1080438c25c67149a25d195a10486c135ab4846103c01009105c8683ba4981200932d4ee2014505240011860f004000029484808823c3411c0a0001b63a4a0cffc1650225c46aa0e0c7d79b6238084dfc438005bb0047408015201e004000081108d25e0c7c0f5fc648857c6167e307f9c54c1e18000f16c732001000400000783513a9f0e8c1d8165be504093eea33a90011f133e3120210004000034c81b00ec5f99c3c9f203018855fe1c32066d63d1c27aa2e8851421817f6be2001c8ce5ca0c0c317e7f00270c200080000ad9a13c5b1b134604f13b4958405c82530747003f2ea264024102000800006c901f1100f0680c024118120370500025e108b2903e8a8228161120a0880500047c900325d20862304201e19c3f30572b7f4f8afaaefb04e4ba5ae88312de782143041afae525de32c7f67793e6fc0604c742432276442c0c06b15e04ffd7273713ea53ef109d1fa0cb0371a2f930206f76d6463bf75e009f5a097baede04ec6ff6a55938101acffbd46e4983e78e2cda52b2e99182d2865a57215adacdc166dd9d3f567eef0db17b5fc9e5807bdf0a00023f897948304237a5b12a7b1a458bfc93dc73191c047fc70d913e820f65e0202f5cabd8780c77418a09e8a049f0f5278aac7b380fb6899ade43735a3b231)) <<< 16000) + 0x38d9517cb67901d15dd094594defca52ef523e3348a922466f755a12a1044dbdf5aec4c207b3e0b63014d82b534ecc579b8fb4480e4356cc1d2069120ce102aa78fc254c018206335628f54907518cdafde8e1678b1c76df6718af817d4ee000000000000000010059d45f034f8532c4c7c54677634efed5f623f323feb1e6400000000000000003f00000002ba794f62f6dff5d9de55310794d285148006000081e5bb09a12affdf52efd3a3b5c0f17e06bb7f8f4db05ca418f425a8a9458a9c2a0d33429ce919c01adf2dd178101eb120397be40be67d9baf653c390d73f39dbdb32e74285f567964d5b2b598abd42c5e519485e0406e658e03552514015e71cbb1940088e8b47f85ba1638a2436b37040068e8db4128d55d8a6ba20cfebbd70cf484b984702c1dd4490012141f00470e232d44058e3deaf928a8480017aa9a880462044010d341dd3106641139f60dab280034986020130c210044010040110000100403d8080000dc83d0080002248000a8900021f2000572421c7610c2b01e1181888c214361081308305e6f755a12a1044dbdf5aec4c207b3e0b63014d82b534ecc579b8fb4480e58cd58a3d5241d46336bf7a3859e2c71db7d9c62be05f53b8000000000000000040167517c0d3e14cb131f1519dd8d3bfb57d88fcc8ffac79900000000000000000fd5163d6fc6dc0b0ea7ace9f5e9a1b0a686d0554e049048006001fa94344fd6de395ca586864a0758934e775a1ac9f9c619542e193bc579bc4a8ad0ed475aa399216c57a95573c99c039619088149f7780c3c200e9be1ddf23468b4b3bd60ef2852ef0dc1e286ae208ed78385048cd88a9ff6bf8793ce236eb4529e289c027987cf7206e75f0c42e50b6f5a1b9bdd5684a841136f7d6bb13081ecf82d8c05360ad4d3b315e6e3ed1203932c64356b6202d8cd58a3d5241d46336bf7a3859e2c71db7d9c62be05f53b8000000000000000040167517c0d3e14cb131f1519dd8d3bfb57d88fcc8ffac79900000000000000000fd5163d6fc6dc0b52c74032c32000cdc1737dcae92608d9a3bc249a11aefec376a93da7734f5e8e4170d09cf3f25fb37e90497e9463ef97d80c5d43d7a47f24cbb98080026cc09c54d3b08277177a0d81698f5946faf25a300832de79794323c9bb3ec97d9b09ffc6eeffcfa2c9f0c4ccbe6b71cee5425a062ac06004011004010044d3846f80e838efeb440e44802a89da302803edf056790008002134ea7f8e431c710d509cb4821cf793cb3001f004000051100018f2102139248f71be3c69b2e8fa8c8880394a29424c1080011000010044d3757861621c741bab467140073a3453278017cd99ce9000840200001ac400044c8410080007a881e82e497832384e247037f120b9a6e27961d41c125f21c5dc80040010924a881f45834d95d3ffa91e10104c9d3ce00799067cf200108040000358c010040100000444204141000a07f0100011f9000655301c010040000111d363a6cee390cdec5ed4bc92aebbd98af9c8da739848aa5797e25fcecdcd2d814403711e1af20bd1ff178e4d4872c3183bedb006a7612c7c25d479fc1be884888c00b563385c2144109f028310e805c555b0778bfc6c4dcd90f54f0ab3b0c39762800652c2472560e3c0c242b67d80a485773c360df052b8118ec4420815aafdfc01c1449ea4d25cc524a30e58557aaa994c7d379d4f7b62eeaad024f501a4b4900c41491880f0938cc3debe589981258e9176db3f6c9c17998a08a0d083d8d60000c0640033b4e58c86ad6c405b19ab147aa483a8c66d7ef470b3c58e3b6fb38c57c0bea770000000000000000080a8cb8422277532cfa0b554824d47ad4bb6becac50a0e0000000000000001d99867f91975816858e38650040003a27ffc462689be87b661a1ad9ecc8d947b1620562b639c052c428cdb5ccd6a86120171c78211d01864aed6c96f87a16335288bbfbe1bdee7e78ce6a3a2c8bd1bf356096f78ab81c0b0b02d801ab71db028b0b85b27906976788d41d70874b0b595883b732910e518fb078fe87d38e4ff40429344568003281001a6d20724207e11001106107d2983e0ae0000200807b01c0100401000004441e807e6029be02b2619578596120e381fb7e3b8500056133f50120611004000037cf16335c4e8c2cbaf41d0198c302190196c90009cf21740001b15d25200a88108020000424d14b1a6ff904815ab99676380152c62c4004628400100000af3002c93b2e1af6500032e9808bd1f2e88296b8428b2092f63796c31de522baa299ed58defa02eb3c474ba58b5f381b87558302e387f7d355c1e06026f0c83f8edff052b51513f668d27670f4540d60b002ca417bd675a5137c93d5968ea4e431cf83501bf84e5329a7d624d11d53c137f7a4e700c5411c479b16319d94cce337c69aa6a2a01ad94e54cc18e1b2fefecc4a0b09825ce834004b78fc7b61f763a7e8742c3267fc838b5fdf997a03c77a16275496e0e495ce7b64aa3d05b065ba85eb0dd8e33c41e2d1c934f2171973e9d21607b161b60e90f6b079c490e3dd3f6c59193c73c3623e64ae116875e4ca54708525dbf74ac212f002656b2e1e4243bc2b51a3b3f6dc0c1fec7e6be41d731b96c0f90a473b6a9e93574219c168c00047510791903c0c81dc540ec220751103a0881cc340e40a07101038008003520801db01c10d28c43a2a179bed2cf351284933c2b20c14179bc9e87c6bd6cc6408230190865f4602546844207fedad33518330d947644231ecee233e828072f02200aabc8968f62504d3031744)) <<< 16000) + 0x33daeab7861156d0b0771978014180483aa8cd56654544eccbf1c54c6fd4087f20a49150a9c73c18400003e29972388cf243473ff4afe177481cbeee410ab78cf88f1af6546360906f0d0eb0a0a8de93e7f5399b0b3ddd4e9628819233dc09981487e26c41ac5e47ed160d9aefa7a5c208afbcc5bcb6a1d1f3aa82d8c875fa1a466591c4587b2f9d9bb6988bca3c8ec9fedfa0d335cb60000dfe40125d480453e9b3a8be069f0a65898f8a8ceec69dfdabec47e647fd63cc800000000000000007eda665aa036d99c78e6de3a06e34f51f4edba2f04eb29fb02f000000000000000000000000000000000000000000000000003190818c08608c00a002000aa8503b6a2e3e592e2d15a14c7cdb939e41028f73ae62f8dbc9f1b581b2358b1bb7219f9a6e4b55d1dc15e4e76de00001603dbb0db9a1e1d7696784bea5bf3ba8dd24b3df945c83d94c519cf1c20a83c89d13a47dc638c829319658544a000bae4024bcc8059089cef2a98d74f29ec7016aad33bcaa620f516169ff5d3ca7b574f29ed4585a7f83c44084042841022001002a0009415e6570f7f8e80de308dd27f5ea0da16d324e9228cd8b903717b637dec2f274f4dd5458caf9ac1c6e1650c68f82f590df1fff5c87ebfbae5efa02cbba75f5df5e2ecf9322d4306a18138f8519604cd723ba2a068c0cacef41dfbc22080c2810f6f9afb7f083475b0fe006000eed648e14da3e990408b470c9e2220c393fc91cbd14946205f654f1f7a691000022890e446c4496958b471b664daf0402d836391c45500f6e089623277c57b51464f6b37e797ad5a1e382844e323452b906f033e483c8fbd69e38940cf2288595a468faae6111f55cc210132584404c961207aa2db3b4dac259f43720a3481c65c4be8ef2e2b6651bbb00560000000000000000000000000000000000000000000000000063677954c6ba794f6380b55699de5531078ca1071040c3085002000003d58d108109e0227f967dd5da4568df2447e8a34fe4d64cd4f51e8c6ffd90aa88606e3805b22497d5c7bddd1a5190b1a80db808182d9a9921b2d16de7c1395c39bdcf80327dc83a30865c93dca97f11d8426f98955d3bbf55cc223eab98420264b0880992c240f528432b731a4698b1e47e02b4585a7fd74f29ed5d3ca7b516169fe0f19421220e2081861140000516bafd3fea714104a20bc5d02181073b34829db4dd2fd0eb93d82a0001157a45d5cac20f45af9b32e51872d097a0de2206e090001a9104709000496905a0500072e906d2583604f8486ab83a831087e76d595fdd0a126372ff5d94010aae9e47f54403974268a5d624a44a5acf2b90a00575229a02435184d46c23a0200e5eec868d128cf225b555ac02026ce8aadacf955112e8703c000aaf8b36f939b9c99374f5d28299d3cdc0d1b57edaccf48700045afe22ca171a3e36424871c21ad23a2c2d037c1931e2f07c369996a80db6671e39b78e81b8d3d47d3b6e8bc13aca7ec0bc00000000000000000000000000000000000000000000000000c7020111210c11008e008002000587f815eaa85b1666f9b0589ab21bf9088bc7150358c9fef50be1599d0208c969b7e2ab25c4351bb073a64c43dddfe0446406a67e87cd7ec69c4635da665aa036d99c78e6de3a06e34f51f4edba2f04eb29fb02f0000000000000000000000000000000000000000000000000031c08044588408182300180000013bde291f4b96948b5b6e116295f7f54bd4bf76b38cbfe288d1e608ec60662cb6a0ef6b66c33c7453619e814695cfbb31722a23d20d2858838cc8a0d61391a58818bae38416339f46200051096388c01fc1b921c300c608e2bc0201290108043880000019e864ff91a37766ed14db1182891003487a5d655c06082e06dd6376fe3a4340a3b12ea41e23738800131a98c37b463000335738c3fd223c65a5595850e4191c47eba6e0f9a305912bb1922077664600c20c588294100348d78ba80928a10004000041c83504f8800000137bdf3957d7c5a38d1acd896470a6d5be0d1e43424400e7ef23d5004184d41f3c10584ac6682f6dbe3acb6cce3407fbabe71601b2767a0c480039fc2289feb3faf7a917898e28d098ef36d42158361248350921f8e228a76a328488182e9ed31813a435286900181fa521525082100800008310690d03406819c340cc0a00040e2000ef240022988328afeab98447d57308404c9611013258481ea2c2d3feba794f6ae9e53da8b0b4ff0788b14a14814b045002001bb3d0a0502319364f7cdc83213c6b844645bc93c55e511138e85d7777f719d2112a014d55ee02e1b3740eaa738289d2c53caf32be7624931dae8e000003758f28f0c1e739dc860a01da98283c77d2550267030268d8307ee8c010202152b18512ac14010630c11b267a350180179293fff8b6e904000007f3c4b0841b24c19c60dc171e486f01890c27123df58fd2f9e2828bd5d8287085048c2d4112100f88df23078398f55dde49c01827369d2c1000e2a635158d2020980515b5426c904054821112502d2e25400e10c74bc504c2f90ba938507333fdb0000000000000000000000000000000000000000000000000c0451479271270e7087824800803808010068001231f2703d4c228b9c4e387620038387b6a920835c306a35c9eb9dc9082dfeb385e080dee0a6ee163807770f60fda6002ddcfc2e742005b519de8de44801381028a0ca417891e4bcce766c0e274c91313e30638f206342813b74142388099f91b394900019d69ab38010804000057083202818c1400072)) <<< 16000) + 0x64188340c2120007f120c01bc1e35bc752d8285d346000003758f28f0c165d582bf35b5da3431fc0a2bef88d68c0890da0cf7bb4ec041a4ccb9a70b0c70c00ed6e86d25deb9000001fcf12c220d9260dc30d8161f55cc223eab98420264b0880992c240f09c41a41c21a18c11009a0160020190401006f1015288b379a44957c267a7080ceffb3b9c1836f18640705909a59f392104267d51040000bd30ffb38211004000059482f848000aac82f088174440b82205b050002ac9000fe320b202001332208e1a00201c20b412002422200509a41651600602c7a58026307ffa9d2f3b7eb5c64c7b450225d4ac04bc0268b0b4ffae9e53daba794f6a2c2d3fc1ea7662bcdc7da24b7c64136ae9691b7beb5d89840f6a75ea06fb184870e1081451050850470341c8af7334194e6c2a325360dc9d49bee31c9884a4ab97ed524557dfa1d5f808544fd239e385621b94013c46e83109463e5da4611dc8b9618895a61443d8deb440befff2e8e112068af28509bf2b236a2837202fb5504022f6bb6d04a10420100580902b8280004bc82b0ac154360a8130530980f04c148160a20303301f1812f2a5af1039f0e5230070977ee569e0008c60880214306cad4ecc40e125bddd82420d95a9d9470a2d87318b002414220080280880003dc8278cc13057019c6d06ed418459e143b790090f5925503031cbaae1f0a0067b1bf9a20007e0bad68000131211004000051c82714f0a02f59c339018391a9e0c306338f1da58612dabfb93a20203ca33e5860c18724ea81304110040134260980b80f813215ea1843a71b53e101a0ec0fa1860f52fa234850035a2f5102001774bb1b0098408402000026e412c440601a04a090248481202408e0a000332208c5a0006cb208a130440902184c1080763bc55481e8e16859d9df0c008908a1700462040010c202c8dd0f240704d30c9714301cf1c448e002ee0bc380903084021a4a738b4b49226f0da3e590190b9dce210001ffd45a92021000434951879552489dd4eb3f0c0f00509038a1920fce95a000f802000c040001c24104040003c84000b688190ac1003607e1302f0181f0080b8074ebd40df63090f6f7d6bb13081ed6f8c826d5d2d234ecc579b8fb4481c2ea56025e012c66ac51ea920ea319b5fbd1c2cf1638edbece315f02fa9dc00000000000000002019841019810611401204913bc1a215dd4cef796bceae0951f553591b1c0fc4efcf224ceedc67072bfc42963c201b5f30693358a5677b42e934272087c00f4648af64783d42b357c03786f180c3a207a5a75ea06fb18487b7beb5d89840f6b7c64136ae9691a7662bcdc7da240e00c7a580240d22419d2f3b7eb592fbb1ed0220d5b307481a44833840aa9e3f09530060818cd58a3d5241d46336bf7a3859e2c71db7d9c62be05f53b80000000000000000405d9915a019702d4e28a14510508e08fa4500bd0423183b01ec38e2be32caa9b65c682b698ac609ba0be498994f78b0db37959ef1db713a803fb659607d102b08d2e31159b17291571b28098597602407ae4df4b57396e2ac53853bfe2d77067183e32649afc59ea0fb1ee7086f3aae81b20bbd81945e0050260e9f32876048edf6293505860b797c8e200a03e30c44a084001089b590ae22e5118f61e29c402ee247a8c7801aa99406500f0d0534b28010004226853cc3b3cd225977059440e686d28253c219b6d5d2c800420100000d620003de60631357463091d0d02b64038d70f0b95834109f28a811c005cb5fef4901a7c26f093001080420604a008024c1f0ba364531001080400001f081e808000770800280903c1181d84e9d7a81bec6121edefad7626103dadf1904daba5a469d98af371f6890385d4ac04bc0258cd58a3d5241d46336bf7a3859e2c71db7d9c62be05f53b800000000000000004033492841841031013400c2e9e3f9b519d04ae6ece734b1c8d372b07a9de6dd9fe47671e81b4d7fb30916e219180ef80e7988147a74976897888565ca3d085a6fbfeaf1c1807a13fd1e5dcc120619143e280025390010b03639638f62d1f3ef766f09e745aa7c2f734806e9202234f466cc7ca9922c5fb96ec832215c21c8763845f65fa0b89b2da8710b454d382218bd1e63b0206062d83ec28e26a080e56c6662e565d6a111596021a665b33e506a87215b9a629d88620aca78f180138784bc9a14114c59d581edb494fa6b3662e0004b5c8a54b6abc2505482fd82ff40d211e1d9e630e88a0ef8aaeb3a5916aed4c78f310498e600013bc80f0a80743400354040e876072330381581b88e43bc77a2d060164a536e009080f00220091cfbaa044306c01164f85ea93162470a565848207001006c0a00008920001e240d4460681b03305d03507da1780c1266d360d12015c4c05282009a7ab2e2000121010804000039481912c0c4940602b02f0181700e837d1582ffca5f19fad0896bc52b57df5051dd57ec5ba03dd597114a4fbc70d0f5692f64d60250014d8607d0cd1542e7f92d0be6fe725f7df956594e2b4c36beaac101d1fe3466a8eb89efb0e3005a4a7e039a6ccea43e50b0f8382752881fc2900bb0095ef1eeb1442578a5f327771d108d32311cb111d3d71ff4cff076ad4496c82e240b3f2e864e8cea608879ee59f381fe2cf085d0fd004edd40d1af0f5a106ee2fe24fae7fc8efc2d774d7b7471e14d4119a7206b943de3462a50850d2412315144b0a9e8b94792008556d46630020008692028c224848c16bd00d85853d0296a26820c48d707200100040000344d900ef85b448820a34)) <<< 16000) + 0xfe1a5035dbef2891801000400840400017440b4260580be22013aecd0a08a40b8109800cee2b791005516976748004001002b0181500f856d3acb12c58c88d93182702d34c8c007002005203f174e28d903c0a15e02d0c00c34d81d23041e008000050900016a2050120002942000a7e6c1cfbfbb346e54d81509ae531c35012dd990a98a6711993d79e439cb335ff7d90ba702202f8428d146c877ea767aeae9e7f6317216e2917c821d7a890f3c763e3849a0eece84490130f6b09af4daa47c08b6e2349ad303961a5b1b3747454a7a86e96f0bfd9b4832d9e886e823e14e08556a743b95ae9c98bee35efd0e2c4d0cb9e752a87fa364826f4a193600e50bd7611bed7f317dfea1568f2ca471d88eca91d8164bf20885bb8d10218c643cf20000afa409c4700c0100461b0c72efe400cc70547612081f004412780a5523002ba0fc349020f0022008020080000222000164400051481308c0943720014d13738a067828cb600044304001000008520483200026139bdd5684a841136f7d6bb13081ecf82d8c05360ad4d3b315e6e3ed12039ba48db3a6e9236cea06710db3419c436ce08a8b0b4ff7354d4a2ba794f6677954c41ea7662bcdc7da247c16c6029b056a6defad7626103d8cdeeab425420890e50d04a04704d003000ff3c0eb8a857007a73573b1fefe5bfdb737e960fa2c0e204d4c3de66fb74859b755010a68e0bc28bcc328e4657c92a34c73ff79562b100391455207970693743d4742cefbc16c962dbb242176e1202184539494c4023101f00801284f8299debdfc2cb7bb41ceb44fa8ffc5680280c311bfcf8459dd881ff2c77610c206a34af99168ccbde9477fbdab762041bc2f6ce2e8ff43ed22b2a4182b4140694c1885db678f1465fa321d9404632859fd9a3c47fc26dc5ac198d8db0000144aa9e21b9500c09b2460f5b8f9203ab4c66e311671c1f01a3813dfae2051f902d8e8b83e2cf1ea169b4400b0ee988b27ad32bcb097f70d97a2f8a027b26f5a5e0b9e46912c92b5d3ae341e274363c8ef90d83b0064829d86680005c220482a0006b1204612000c393f55cc223eab98420264b0880992c240f2a5f10dd61879356944c1f75e47fa611b98454ecc579b8fb4496f8c826d5d2d236f7d6bb13081ed4ebd40df63090e1c53b315e6e3ed123e0b63014d82b536f7d6bb13081ec66f755a12a1044872840e38660238210011da3d1d9ad407d4b017fcde12918ef417af688046945d7b1507509bbb59a40aa1f5b674a1bcf593e021d8a593134c8ed837dd88543536f293f89c62223c84f329912da98385796fe1061bd448da8c9fa47604db97c756603321da4023821daa5b9c203091edb4600120c10004000037081106808424040020006f1203e4a01e2100e868009c6080c04800a9e0cc961201325845f55cc21faae61101e5458f5bf1b702cff4c23738983eebc830f26ad254be21bac2232450c32410811801404637a9e7b9a30f055e3f8eb5b284dc696b32adc6c4aead28342a3711d088163bcae8d41b69abae46f83daf624b1256d0f083a2937a42348b61ca74df4cd269ad5fcacf74144daa20af9fe597b871007c14798fa9cf290d6a031e5321dc6d088e2dc7366fd929c03ed08390a0828fc12485c05a6e43f36c0032d0f561f9f8d8896f3ca847629b856641c058ffffdd11896957656a55a466aaec183fa1bf72bba2ec4101df816cc39043fb6b55c19eea1fce63d8383aff50411e6cf5576e627cd4e67e361722090be445b7695d236b003965b02ecf7e7283f41e76ba61bbcd7b8907f4e08b8388a9f8eba01ff58265e9badc90c5f06cab1edd3620c719882051ad0594cb0fbd9d189181080280b830192914870424141e00848c0ea921e43840712ae7c3822882538028022cf232a0016bbadf704a0840010d30a0e6a9df34a0d3d13e00d1c204145851c7004674bd8d0a9353bc5b9400880214380a370d868d0eaa28010112be1e304023fc57c6820feb004cc500230e5d14c003c01000011d200047e4070140360a01a010001cc100048620322a0180100059e10171900b0a8054440281a0130900902804414001de4401633c80333c9c66ac51ea920ea319b5fbd1c2cf1638edbece315f02fa9dc000000000000000020369996a80db6671e39b78e81b8d3d47d3b6e8bc13aca7ec0bc00000000000000000000000000000000000000000000000000c64286304302282202180200ccc59bd038d15a595ad103a2436f5a6d75cc434fc458d1e3ef7a451eb2d72952db671f0121fe6caf60af8bfcd748883bf1fbedd750ad77bd7b02bd28f2547045f66c719ae3e448f4f49893c2324c70bc5b1d1635e62160506e118d2dfdc93d94d470811d98ba16c6c0060a2c8800e04ce32c5080000023957f4007045c78be17de192c10540e1857e72155050097bb4effe3162c300504ca79ef8db2c501f424040e1c02a38fd254cc438c38a55f2e5c99240605d95940f0386e2902c34ce306000000ba901043a623d09683001928837a12100001f6176ee2948102801441141df43b248818010bbae7a122004ade100c2041efd5fdf88388000000255030c000209628060002ecc73e50270c2700849003c9f5a814b8bc4822ea9bf9c79bd1fd1230034182c1e6c8d3244004afe28e7c82c64084acb49b105734f0710000000594cfbfd12006e2c6cfc3a31fb1664b0970c3b05800011610003d320202200f010002f1900085f201c4a00d210060e802c640142a0091100406801c2400c1200501002008003c788018c800844002020000100581a9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase14" = "QuadFullTwelveCase14" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase14 private def zz2319:"s090f"="s090f":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l13 l15 l16 l20 l22 l23 l27 l29 l31 l33 l34 l35 l36 l37 l4 l41 l42 l45 l5 l51 l54 l56 l57 l58 l61 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x48da69949, -0x312f14dc0, -0x49c69f6f8,0x4aa], ![-0x312f14dc0, -0x1467fd5bdc,0x24f435558,0x384bfa306], ![-0x49c69f6f8,0x24f435558, -0x13fafa5f77,0x312f1571a], ![0x4aa,0x384bfa306,0x312f1571a, -0x18978a938]] noncomputable def hinges:Hinges:=[(-0x3ab94065,l5),(-0xafb9180c,l4),(0x2c016232,l9),(0xe91a5d2,l8),(0x3c30ed378,l13),(-0x4e01f2b7,l16),(0x28d1645ba,l15),(-0x3c30ed378,l20),(0x31bed88e,l23),(0x1278c4fa4,l22),(-0x18978a938,l27),(0x18978a938,l29),(0x73c0ebd9,l31),(0x18978a938,l33),(-0x18978a938,l35),(-0xe91a5d2,l36),(0x18978a938,l37),(0xafb9180c,l34),(-0x1278c4fa4,l42),(-0x28d1645ba,l41),(0x3ee63e3,l45),(0x18978a938,l51),(0x3ab94065,l54),(-0x73c0ebd9,l57),(0x4e01f2b7,l56),(-0x3ee63e3,l58),(-0x2c016232,l61),(-0x31bed88e,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x18978a938,l27),(0x18978a938,l29),(0x18978a938,l33),(-0x18978a938,l35),(0x18978a938,l37),(0x18978a938,l51),(0x3c30ed378,l13),(-0x3c30ed378,l20),(0x73c0ebd9,l31),(-0x73c0ebd9,l57),(0x1278c4fa4,l22),(-0x1278c4fa4,l42),(0x28d1645ba,l15),(-0x28d1645ba,l41),(0x31bed88e,l23),(-0x31bed88e,l63),(0x2c016232,l9),(-0x2c016232,l61),(-0xafb9180c,l4),(0xafb9180c,l34),(-0x4e01f2b7,l16),(0x4e01f2b7,l56),(-0x3ab94065,l5),(0x3ab94065,l54),(0xe91a5d2,l8),(-0xe91a5d2,l36),(0x3ee63e3,l45),(-0x3ee63e3,l58)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x2a07100400000000008409200800000000c8681c601000000001906038c020000000000320710040000000000130320040000000001281240100000000000640c80100000000004207100400000000c4840d300800000000018812401000000002e1302cc02000000002a12071804004b0808c102984014000001023081186020000000000e0c0cc0100000000160a05180400000051114068301000000000a8881e6010000014a2140930c050000e232844026200800000000583c053008000000aa16007660200000014429016cc04000000288820361808004047384600d24014000000d068500e801000000019078074c0300000000000381900200000000a8340b30080000000000060640083092c808301b8d0060000000000220490040000000a249036300c0000000000e812401000002424040648c050001022382204fa00800000092208039301000000000c8280e601000002424040348c050000056120480e20060000000000090320040000008210809060200000000000a03480200000001304811180600000025044082301000000000004812401000000001f0d024c0200000000003a0590040001342104803240100000000000980a40100000000130b018c020014415c110036a00a000000004c240630080000000098500a60101440a1044006350060000a41502401ea0080001502705006d4010005305104c025a80280005c0a01c017500400000000013004900600000000442406300800000000038012401800000000012014802,0x104158183180a000000410cc02830100000000001080c4010000001444501b0c0400000000002a04900400000000001d0320040000248a4320588018000001982102bcc04a12488041813b8a00e0000000000c40b2008000001222880b06020000002b84200e4c040000005088803498080000000006400b200c0072082056027c80280000000003101c8020000000001a005900600000000035013200c0000000000c80e401000a210618803c500500000000000a03100400000000003805200800518890d000a08028000001444301a0c04000003045080c9180a0002886304809440100000290cc14018801800000002a19038c0200000000000a819002000000006c380e30080000000148c81a6010000000000290248020000000003438198020000007118c06830100000220641a06e8018000002e1e0901d0020001183886e027a0080904848704072140181211018e100bc2803000000001506038c020000000000088190020000000000440e20080000000088300c6010000000148840c8c03000000221a1203a0040001d03408407840100001e0420a00788020000000841400f0c04000004881180fd180a00000808e10192301400000000a8280c601000000001915028c020000000311481118060002c87304809440100000000170e81c601000000000005c0c80100000000003a07100400000000b4740d3008000000000168124010000028408c07e8c050000098190681ba00600000000068303300400001412420324602821414205101edd006,0x311581118060000006115408230100000161282032460280000000261702cc02002c848c81812b200a0000000064240b30080000000058300c601000cc10218406490050019821032015da00a00000000000d0320040c7882862810b6803000c3102184066d005000000003a1a05980400000c09610192301400000001283814601000000001105018c020000c22906404a20080000000094840a30080000001248204460180000000130501cc02b5048205f00978a00e00000b104301fa3014000408e61c00d08020000002047301a0c0400000000064381980200000006229032300c0004088c0a8076802000ec1422040649005001d829042015da00a00000000000f0320040e78a2882810b6803000e3142204066d00500000000642205980400000000641806300800000001686812601000000001d19028c020001683886405a200800000007231022300c00000000a828126010000000000250388020001222a02405a20080000000000e409200800000000d04816601000005a298a80a90030000005c562c07200400000005ca8b0340040000000158b01c6010000000000290388020000005a562c06a004000000b4a858094008000000001516066008000001845101b0c04002023845600c9200a00410720ac02bb40140004b0a20980b6802000000000002c0c801040a38a29e042da00c00404708a3019b4014000000e23080d86020000000000060348020000000110681b180600000208310306301400000000002812401000000084150318c04,0x2680990060000000000940720080000000001a80c401000000010864058c03030621a1860171a00c0000000000940b20080000000000701a4010000510e02102e100402821b01020464200c000000000034092008005086808204d080281410d00810232100600000000001e02900400000048044016301000001284c1201680180000000007802480300000000000d81900200000528630130301400000a10ce016060280000014c3501e0c040000000210901718060000000441103b300c0000000842202c601800001c220c07d8c0500000000001a07100400000004219032300c0000188b41c06c8018000760941d033100400000000003603100400000000006c05200800000000d8980c60100000001509402cc03000000003622031804000000006c480530080000000b04e02660180000000161201cc0200000002c108099806000000005844053008000000000580124018000000000d80248030000000360480618060000006a08401630100000000c81201860180000001a024028c030000000370880598060000000681100e300c00000000c8480e601000000001a09018c02b0648215781030a00e000000b22880393010000016128201a46028000000349840d8c0300000000000281900200000000c8240b3008000021844140388018014724211803490050000004c1c1203a00400000a4421a024400c0000000a43202c6018012c1c419804f500500000000441e02980400194228220110401400308410540220802800000000016034802,0x3304208813e8020000000001b002c8030028830825809f200a0000000000d40720080000008c08815e60202c328220301cad0060000000000620310040b0ca0880c03eb401800808c814202e680280000000013002c803], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0xe2efc7d1c9c696b9e66d472ca0020a5e21a2814b814ace0c3b1a467820203c2255904165481ce11382108042ff2c2e124c612fcaa07028271669668a70658420208280010064100401a0001da442426210131070588302f8bc80f837b34b54f9b40e2ca002359ce383105f941d04156a1658240a881000238bc5b58e6d1a59a2af4dfcd1416fa39c07065148e1d92c2046a2f198208779593f0200645234aa81388108040000590881868000a608828cc41047a55211ba186c30a7ee1b4f2b8608fdc3ac93e8d097d7a14f8d1a0a7485916760c054967665f000174f0164f34167b15e1cc0000001ace882ddc709c08102c00000a8c0e2dcd05032c4d2f00a03e538d14198ca3d98e0864b249124d050121407047047bd8a434830300a033c7811b0ac9ba00940a1200a2ab3edc1bfb5e2080000000000000005f919bbfd407ceeed47d2e6087ea8ede1f89c59a59a29c1a011c1020000201814010068000c991030d0001cb1102050002d719410bef3eea2c34545f023eb32f1854e360c0cadabdbf1f158e71f14f9403c000000638acfe2182d2d769a2dd57df677208c8d20b20a20b08a08900800010e589a810c4a50ebef65841756f7b9799b2d41539b4c2b74ff19c2c1073489c6750a8a38cb69f629efc84b12df62abe8b627992e51aa5e50003ac328217de7dd45868a8be047d665e30a9c6c18195b57b7e3e2b1ce3e29f28078260e50e48e482580400088353e9df80fbb39d88efea40cd3c35a043059c7c47b69ff16fe10383fb2f10f1e57320d3070043a04f120bedba23a72a84182b575104bb15c6442ee352357bd74daa54c33f8571fc81786f003164e1014000f3cf126b7af7fc2c993c0edf010182346eb2c30c54a059a04805a18d48a0000948084021c4ca782cd230965120ba659200000960c04ef3267906090ca9073300848405e6180e6b6681c0002e403e00800015d3a45025139e9cfe3ea8e08a112cc3f8ca20896b00d8ca4277165640e22c005e38400dbdcc36e5701fe69ea7620bec808228fd3ba522c98d4dea585e8f10331200e7f50bfec71478386a22f32e79e48007a16c522255e23cba6a1515d40260047ce9832a01d92793c412b776547803a8f9e394bff63e4e64acc48e22880003e1383dc6de4347ac284a1320247b22380a8b8ec3916520082d274618f9f17c6e6e00b017b0fb4dac8c897d428100466616ae2db343891581c05d9c3e821c53b5f8ae0000f8ff35a607137d6572801b7a6d3b3ddbf4837774cfaa615bd8314258580000bfc8808880026d487e02e8545a536543c1029045a995758716bc06b55a002880a6802d6301c15837fc34f41200d085d657ec400159e8a074e180a413ffef9d0050013a0b4f2a4d20feb3e351fb61070520480) <<< 16000) + 0x0023e22004b0ff1187f06f48602ccce0c129bbc7f713897e1641769abab955d3bbfed37f4398a200000060f4b23b08622b0126038805a2cad48faf3c793de7180f1045080d7de59611bb4ac379af704179c4d3e14118b350328a75e044055ee26c785b67d3c24633833e00014af14f4b348247b2720611046914956467828824a9aa9f0e208c56c5704101dcf6dc46001147df3d20023b371e280004c404201000013f35ecb82bc94405c2986f64d02f37e66c5ac31fa5e815c2e6db8510df682dc00000000000000007cc240a6626a20599839238619601000e000086d2c02301c26c65d7ce3a91ec86c666594b1cfb7f65709b51e5b7a5420de1f1db2e73cdf98715ac37c84d1892dc9ca00068041204608a0be280fa3db4574319897875d418a592000001fb2755838e50436878386b6dd9ef64e7a59616cecfa1d981a9b2fe23f39f22d58e6b8881080cfe3f637d2c522d7e8075988e6047665b1ed68234a4ec9457aa30413b1b577048b3844defc7dac88001b0c567b11d47e79ae38c2200e2640ead6ce592117d5020303b3357f8f1201d83024b00009070840200001c643f437c4b866183b259200000258101a5996518c18784a44d8b1812304a60bc182170145ee820a526658400001390110043899ba817141d4e309b635c16712de48601e00f8cffc3cd12153dde9182769e09a4b53f9199b391dbe0863e14c04f46a14491c4821a5710a8ca2b467166a385195ff271a7d7912125d7f236cf2a560f6e1c8b93f23c66471424045872835bca0bcd9f3ba71c8e5b13569ba45345cc44b684c40c19eb4be82bfaf77a4c9c668e33ae98d5db4000fe05ec0eedc5a5e9c4f68070e8491003292a6ad8bba3056243415e5d3b1fff54b36092b454f08f27bf9880957385e59022165ccb67cb93b6213a0a47317b207d1334ebe7430bef3fda2b61f90e39376d593c642ac9b80006e220010e06bd9705792880bd7756b487d50bc4099f158725cbbfc2d24b591dde01d9dc40000000000000000010706f104d5d9c9a13a8405ae4423d9ac86d87a7dc1ea5338400000000000000003f6120533135102d0c1c91ca04b0070001020efacf89bae1adc1dec1150b77d358dff65709411b69cc26aa94adf48b794ab39231b39875ab2b885b73ba7a8ef3ffe87a6d896ba233946faf95ef2e4c639b0e0d9a428f858fdc0848eebf14a4e91ea000a9a40ec7400250643f0070a61bd9340bcdf99b16b0c7e97a0570b9b6e14437da0b700000000000000001f309029989a8816450a38a20208248020018002200425510dcdb3e9ebe36e65ca44eddb4c509eade2f0f6dfc31cb58f92ed20b63922521b4a0d9bf3ca46514738b425680018b10fb1d00b0c83e814003cda65042fbcfba8b0d1517c08faccbc61538d83032b6af6fc7c5639c7c53e500f2e1660b6a61da2c46fd473abefd473ac02020c00f06f104d5d9c9a13a8405ae4423d9ac86d87a7dc1ea5338400000000000000003f6120533135102d4a148145082000003e51895f1ab49d3fbe33a6011d722e72cdf1c3339e547efa2d0ea84bf547cbcb8bf042fdb4fa743000af71c5c96838a08f8bfbd8d8f43520dda15a7542bda25d45be6d086efec21f3e693974939e9732acfce890a55d3db70b305b530ed16237ea39d5f7ea39d60105856d8b8b07182a15173b02b8378826aece4d09d4202d72211ecd6436c3d3ee0f5299c200000000000000001f99429028a11200c00a0000041b94105325339f51f9d49098bc88cedc87e2bfd20c0cd89e14aff20ec641b5bc59252c316938790165d44079f6fae467ac348e38d07508b24c34ac6546290038e80022919143a7a83e26679349af1bec842b0849b14a922358545a82bdd63544f2b83e32eae6f4a801c4a75bfc74c1a0c2543980777b9588d55a7c3083639205e36f65122b57ad6240453140bac400823f0b714941b7e8705f7ecbd289ff8ef8401c74902fd5de45f920e46f3d43397c009a00130f1a413d212897d08c1ad42a8e9adde70011f1566228d91639ae2ecdb5a407e973f22f6e5b6a1cc24fc18c5ff9d84518b21c660000a3643e4841f02a0f71107b028084161ea0a0f40100080398192e60aaf594b941a5a442d1780e168bf48672788d6f930a49dbb40a15feecde3aa419ab1af7f23e260816420e3d80b806046e3fbb145e0409bcd5dd4fe555f5812260a088283ccbc9ac7501b6b6b6a8da62529dc5f8e2b42dec69927da8db3c0000a1c1aa1a06a49023ac92fdb64b04eeef83ed532e02da4e693c7c4c2dd6f9c1ae7010f55419045000089670806882617f8e181122dc54e7f48404fba7f33f0bc0c10f96650687e860037d17188a5c140c1affe0aa840400cea5321cc8811505261530b2965000508e82f2fdda207061d50b80c000048a43cd341e4130f10507800a06afad69448ec1c23f23bcb068a1828a13cc6b9fc1421883569c95620101bbb640d8820016c79f8b9aa1c071850ef161b1400c7c257ecbb4540502c4dcbab3d8aca8342c028718040407ff8612e20abe6f461113ece626859015761a92e40c0000006387000001669ba4800725f75300002ae6aaa9c01408120043cd34a3492882081c7241041280c800080343bc060f60389e07a8ed08635554f32d13c38b43f5a59e5fb981bf2a1c6a038b206e2d746e81c0592000000bdc7fc00e0aee44df6ad9936020800164524e1f2a300206e2cb6a685c1e84808003705444f027ea5ea58f323680ddf153cbb50fa2e824e2c000003e3030a0000003e30a28000152ec524900005575f430c34997bf5)) <<< 16000) + 0x30c014e07ae23aa400980400003cc62781ea3b4218d5553ccb44f0e2d0fd696797ee606fca871a80e2c81b8b5d1ba0701648000002f71ff00382bb9137dab664d80822537fb177f5aa8c0081b8b2da9a1707a1202000dc151e641baef21d3367974b8d4552e169850000003328b050800334a42c46082013ebc382438186197fb05f9361608000004436401820428eb9770a06008b5e62864ed2492005c060000235200093a400241883b0480027b0f0e312e295869081cc24d8ae72e1c09a798095d2228106ff02c5fe0402639b5cd4f18104ca386f209414000820809ee124097a9c69e762400cecd8f0469a889002b02861328ab1085afce6115cde3e49648240e000001088a3030c0443057dd400402000000d3a1c0302072dcf3be228082029411d6934830020cdd138abe808032e55b50d7093da4801801c000092487700819c041da020ec01000268109a19d846dbb752f3ef7bd36840d041089a59641638e31a098094096060000401ba5d7caa796fcd9fe34aa0179e7898d9dc514bc27dd0af454f0d207404c555b7294163ea627fe509031f1c6686fa2811c710468062c2d0be9151349003019b1e863a5b0e01c8061db5c7127be5f192006e0b80002912196020560101d0083ac041d4020390100020e10e901c8d7f3ecdc17f922eb6d5d5c5a240a00000136f00a180000026de0402d1638ccfcf880038eaa2529418008f3fad6de040050c2d95e168a00e44121501000007a4f18e5442136720b28000002229c184483cb731c302c80324cb148c240c14da875d91ce1092b16cc8e912102b2486de2d24002b9d49370200034c864405e009c486158123cd89ac30327c6160000015060d26cde81147398481833817c72470c7421df9278a5a45ccca68a0c1f1a069978208e8fea2b8828007b4103112624109c051e6cc94590e3901a4d9492c74cc61848a9ff7378f392387665c2b90d1e2a2374b483b21e10469d4d7a6f141019846ca1469804a292a1390a0e008d3aa2d71e1b048216014000088c874048001110f19a2b133d8e76308f18057ad32e1640480ab8c4df481841b3426c268708628ce13e11418106baab8ee5a1c000e1d2f3b3989001ad99bb9cfa000557f329490420d2410b40c1e6b9eda12f79a0693156bb5f10af98483683dd08d9a48e116400baa5a1e28d0b003488b83840912440790602088c2b97af8b07800ae1c1d3b251400508cd32d6ef2c12005c060f3430c37b76866932edaffe0b53090f8d5f1a929e40832fb9bf3491c307a47e66478ac1a72799ff2830b45f90a63180358de110dbc7004d1e0d4a956a400a4070000406400114c83404819c24000d8c432c57449255e12ffa21031bc27316eb48e32a57d3624798a284d8aef2bf4101b0a1cd071238e1ec842f1b817120b528d642aa790001646ff317384029e7d6778267089002c02c512a10fb8d04c428744d983b49ca1031ef794d34a007195dc8cf2243068786d90f830082434c8a9a3748b8e1d81679d383a4208b047497c4b02810a1310075809304801681a00008b482b0080e8041ce020e60101c80800134c8728eec236ddba979f7bde9b420682084491481461050c808b042010437a0067ab26e9b7a1c76977ef9c2bcc0b4a4078e0e00e40c423d00019e20420b00144320a003b08db76ea5e7def7a6d081a082112471c42031c30c22401004540d5f90823b40fcc0b2fa3096603ec60345da2191587305e0fa8000cc9002d2721c86b82008d86ebcc0246de3c8a747d09169fed1b2e8c244c31be1a110080e13477e42371c3000001bfc0040cf92812c0890c22e57664862c4000000037f80c09002a020592df61c9a3048c80a4c734a50b0d86d830248916ac69b5c4820c585aa701807e72bda2608000e75b2b13801200400005c4c8f76225a85e4890e967638048618c5b381a406f2c4b3480082820a037d03000000012a80807962574f04e084801000017334474b3457a4628578f22688e048aa694760620a109cfd5553212232b0d94dfe182173ff24c4410261b231525c400000002ea4520009c051f704b1cb1ae5bf434c6282a698d872e01e39608fb8120a91441429229220c104086002060000401a0002806881f1bbafb16247ea6c72ec0314501ef58394a24434330f690f204cfde5584322436b045f94c12030000030f9014130545b2307180000000c3e42a904280180000fd900052d344548167cd892848e04f4bda8fdd1231de5a2a74bf8488dc8f928d84e101bf9cc36affc62842dbaa279ddd06000000048e0401007c5869d47a97d08002e02c510997afc59648ff06ca4430488ec832000c408f0bcc66ee4860912ff65a4060df3f9ee62846f47ac2ac08000eba95f3400120040000684c8e71b717d05381037cdea76896c0406d993a0ba64a8e1c28d7bb804c6404089e09541e00e100000123810020264c5398c58a0a000000048e0407d08042e02c0000fe10e3010002f110e209070848380241be120de0906e848370241b6120da0906c808360040022a641acd61ae630d62d86a94c350961a6430d21d8688cc34057444f59d3614010311b3fd9b9220057a3f439161c0d29873a40d1404ce9ad008b0800b3ced81d60454483c764e46000059eba152bbe27a808c0ea803d18b3ed8ab032e1400e30c133ec75e2c1181fb4d00c11fec31710419afc194c380606c006b0942080021c74f326bd62440d7209c20814a5fb19b0410844159e10088b4410e0804685967c4982080020000258433c3619c1b0190586682f8e7d7f78a20151da73e0d090fbf)) <<< 16000) + 0x72e800b03f6803401dce9d14a003a010e388e84d08805a9ad66f3422dd8be09808603c3045001bb803820016ffad598007402000022e41ec161980b03e01c43963d42f9c1a343688cc082185978780246c65338031e45e292820e8042425ecef295010474abea788431061644100928f398083917a582049da9c613000e80424249280e4d010b2fbe4e7884752fbf2c1535843d04081b47b48d0037217013000e804000046080012590cb09f86f4fd92841069d3b4b924020618a24380028d69ea12040f8042021d0c43a10810bcc59088414ee6a42d160821590a892021000420245b8c2a9082893a17146801e70c71c8c107c02000014a4000650800140100060738600553569122030bab20880418df8d10118610004032826176120000d5217a1a000986381318c7f2aefd63d2bb39a7cceae3c03c15bf18edf329ee137b5e827ddfc06124224488e28c8cabd4bdc94135d5eab3d0068b755d27b74401a6663898ddd5747816cdac3b604030347528a8328e2336f833cc3baa5ff52dcba43023a1fa30044002f0ae434b4c15f29c5b5c3f15015c7b00e120d46a53ed778364f2d74b0ba011580f55c6c023a92432188c2d0e5ead0524e5dcd8902f099e173642ab559900b24a331ba0ecac535c20802e55456416c52160d1491301703e85b210799aa00017ccf122d9cbf19d1af950c242e2f1632f97bfb161894975560cef480203050dd17140c207c30212fa81ed31bce50e0311608d45e5ebda0e009c7881e2c768dc4530fa36cea56eab30009141383b74a7e6be16e78e48760d80002b321924bc1a58ec4178405b009c9d0088407c021c7e1440648410d1ccb3e2c02060b11426103c00880400802000008885e8480003cc86408ec502c4a6e90516be4be4ba3c00aa3dbbe4c0038e0d65d0409060880200001ca431c678378826aece4d09d4202d72211ecd6436c3d3ee0f5299c200000000000000001f98c66798960816c240a6626a20599849418209c01a00e000c45e4f89daa8b9bf542c719def0a3a925f5cf172842d5f256426c5d89699ec6554299d185bd61e6f075419f342a310609474000d4c8630c808c34000c9e4314172188ad0b4e55f101ed29f55304826d5a954e319a7d24fe70c41800ca9a099ad4cf537924b7b8280295cc36e24c637172de4ee0600cda1f06bc7f65b58bbee9800a81a32a333aebd6dcc0c2bd10121ce16ee5d049e6e6c9608c1a0e8d3f56e3d31887f95050cd898c3a6a6bc29a2d0740000dfc85b0af0810a8580d0824a68af4d640605ce555306081d3544ce201418220040620ae845bac6f304064f4cc76830e26ab126160157a03fc18018943dfa0804a383e01000010621863bc1bc41357672684ea1016b9108f66b21b61e9f707a94ce100000000000000000fcc6333cc4b040b6120533135102ccb2030c708d00c00600076acbc8651957f7f32feb4e983e2adb0733635440b59968e00b3763fe3377c7670d73c6c32f53c08fb9e847e51892f09ea000696409c078378826aece4d09d4202d72211ecd6436c3d3ee0f5299c200000000000000001f98c66798960816c240a6626a20590de29de933a0b8e1b28882a848630208228018002a01cd3ca03c9a109653e53bb5c8b3a2a7cf2b5c1ad1374a00435dcda75835b71bb13c41647d06a83367a7f9b3040923b5cd784c4f53a20b7614b3b0cda0008004308941823208c0500050190c02d85f94c2f8560f62380c8d14501c30afa0d8a2068761c5ca384801d14fef8000c64ea0dc0054508001132615294714490add7b43e406e11e2e679a082d5c28982078da0534698033b2de4e38003f0970c4e004201092270b69aaa80cd4d2e235081841070884600420100000a833255c9ea1ac92215663bbcd18c6909e7c509d1e5cefc40bafd5278c80606013e60e00696d0c2e700200084c907fbcce9248a1d9d27e346260850c3142ce1b889f102b4606b992018f2cbf959800800200002544000a6c80f84e4429b50fb0640e425da0119e29fb08bfb860a0239171818187b4e298e783ff276ccc2400d0af94cece084401081e547a888478abf96b5193c1263578bd91821080400002a880e80800090085e848001d6cf8a477f27e2288ba7ee02a484b9b79dd27800fc2e5ba380164f4bb820145c5414a08130c1000400004d480b0ced12c8524f95ff1da2590a49f2bfe4e45e82af527b9d3c8bd055ea4f73a83be45e82af527b9d5c8bd055ea4f73a6d12c8524f95ff25a2590a49f2bfe30ec8e24b0c90c80cb04804a0030011030400200d00028220461bb44b21493e57fc7689642927caff93917a0abd49ee74f22f4157a93dcea0eee1660b6a61da2c46fd473abefd473ac020bf51ceb0bf51ceaf98768b11b85982da080d018d1430420010000230d92cb62a4e0daae557370354f4cd0910722ba2a1ab4451ba123bb368c440c24020027fee288cdb69c5163c82121d4607c3f7fd8afff8a2fd2912f983232c320074de18327ccb08e35215cda5102808e22b2880da7d8c30c0207b0630012860f8042480542407b49145423dc1b14106c93c418600b9fc474a0408b2c9c27c9410880212430b62c07101ac10198a401124b74b08c107c0200001486071d0f9ab5400209989e8c22042200801f00800025080013b90300d05e868000ee8da2590a49f2bfe3b44b21493e57fc9c8bd055ea4f73a7917a0abd49ee7507770b305b530ed16237ea39d5f7ea39d60105fa8e7585fa8e757cc3b4588dc2cc16d04041801a1a29008a08400003045870f03e3f2e32d2dcaf6cc97fe61c8)) <<< 16000) + 0x5d89662a9be17da3eda55e781223cc77dc16ea84e06910fd96da21dfe5657832b0dfe14baf3d287ac608a4a21f3c4b75110a3c6c08245956639c40366b5120b102487dd224083fb0d5424c2144e86c90a0db65f13b93001043ff324e0842010d280399457c8103c7957d1388075cea48162045f6afa481084f55b8e9841116701b141948778751382108040000578e1201b46af278e228f22ea386cdbd72ee902b7f3ed3a7804cf1adce1813e1f0cd44c08400100bc010000a01e1a73b677f921103df202182b7a39cbc1023fc5636490107c020176020ba0100007c900054720bc1a04e0d00050810161dd8a034310eaec5e371abcefa4490dd69bfc948f325a3860007aadff1d1fe7ff9f2ce2ab03d907553792e3dd2d591ae0ab2bd66821c15004161a7f5158c33de822f2e2f4f03c391fc079bcd2eee80bd5491df0381a40073e9aa5ba9294b7b68f086e46f45bb034b83fac1d9331e2e6d0501208b9d5ec8f6e8b479282d8867c89a7f7d0a6cf5c722ed6a4df32975668060f5472f9ed41ce62c4731fae2fe116260f50bd797d470620012a71a78167800e99e891f6692e5020a0ecd535a05006f564d27ad5b382089d5809a0ad2c33699b2c32e0715f3cab053cd4380444b3fc638c156eeedc77eaac269e7961bc2e83cefa996ff4ff8a91b1744723d07d59e28b6adc5caa9bd0ba6c637576be1b1fd21f45062b64c900480501f8282980408a020008fb200372e42e4a7689642927caff8ed12c8524f95ff2722f4157a93dce9e45e82af527b9d41d89219208c09801000a0080001f9d4cd84c54547c159eb79f52a8514f94b3fd49003ab02f330ef604bb65c5481890ea7ffaf08300ed2787edfec2f5d7e232fa874eced2150e61363e50003392170430b71d85b08c2d43616813b18c38ccae60544fee572807912c2a00118a0e8043480122c45f4c142f6d5fc181abb9b3ac4c02ab1e1723800087797625042000840100401000004442cc07c482398f144a0616c3d4e8a004204343b3c00be5a4ea12021080420080200800002230040100401c8080000dc8000b310b20d0001739c0fcab2fe2500e0e97bb0001b49306c00118c0f00400002a8e021343a70100aa964b4008850700200bc2204e1100005210b11d80b0ef880461cb082038ef2b3c6900100023881000b2c120183889a948d0e0febfe424060b784714101cd6bd7b692001a99f594400542f767138010804000057085802f880327d4bd901c6aff07ace0422cb3bfc460842010e201d1d824a687118ae11c20318bcae2396082635020c9000d5a0d7020000d45d1626042100800009890001f63e1021c0608ce0434ef94ee5834972117b181020a76a18120610804000036c8578880ec240901203f0905302811404000b1240dc7615c330ad05d89af4f158284aac48f09608222316ca0713f038e012080e80402a8261580bb113dc52452813305bbd8b024bd7bd60008c607802000015642ac67c69fb1db21c4625ad9d1422111f19920808f69104810380100aa05c0e6818eee5807cd355a0220c1d00800003c10a9110540680702414e0a0001c1208223f2d2c79785185a6f9dbf13c1a4110a4e68242a43bb4904b366d8f12046fa13210040098a07c02000026e405897c40a54981e943801c647f942031405579a187673479901e6dc5e011282100043882911ecd0284065721a44032956c0ed3431f1f8bef203af074dfd24006ca4664260420008000095904401f8432f6f87c60444b5ccfe3857588a36450011d646c4180ab83e45404a184001000010320820bf2c378b4bf4c18cde9ef2460746759c24a001fb9704c900701fa7e00094508002000020e40f064076220480d01f8482982408a0a00052d21302a000a8732347f5cd9f639cf73c6a4a5e7efb96ec310dbdc4ef3ec2e9800000000000000002098c66798960816c240a6626a205f22f4157a93dceae45e82af527b9d3689642927caff92d12c8524f95ff187684864002802001800382fa3a57ce4db14500c0881bec5f483b5c361e02874aab09860464dd6a458153cc6dedab9207ca000112c8eb5103a0fb32f721a0c63e71772b4f799547aa90fbc5ee012f00ca9a64906672353d3245680029b10a235046028006d5881086c011e7882800f049fde52ff375a86c6ad17e7731bb6beafa04a8826891380a0cf71fb0acc4ba9d3406073f29dabd59223762ad0f3486dffc00af9400c12fc4c9f65dce2db6bb4f3a23db40027b49a3b77c6d3f0ac093b64a7837b148e1957097a70a800ba8c1764531b0ed8f45e29ba695372d770a2a2f5af7f64ff6390819140df12fab393c02d4f0bd3af0c64a0000c23c956ba211f33b69a185531dafefcf887c59cf491d52159aad1d9519d8b3ac1b052123e96c89c2d266eb8aa01d33cf7515d0ac1ca91e928ccec8d015ae366f2589132b13526867dc702ae31374260fa43a4071d0b7876edddb3b017456ea894418e71a22a9d9976041289d54ca8502b196ade12014a4e11290e0874ad5530404671b9e6400a004c58420100a51184602ed12c8524f95ff1da2590a49f2bfe4e45e82af527b9d3c8bd055ea4f73a83b000000002c236ddba979f7bde9b42068208501f5132c281727750d15264b231ee74b40e4a07888a6262800000000000000000414da1034152f3ef7bd611b6edc000000000850a04704d00700600027f8cd1ba86f1dba5dd8a596d8701edbf42f5128fed55c33fd05d229f4cca85c0b1e34f94d8614ddc1ace7253aedc80015d1c0526e7003fb9b5bfa76e6afd052822def5cb420)) <<< 16000) + 0x6d1d9cefe000019308bb3ef9ed88c12650ccbb6475356f54680032d90a42585190c28856142230a00df0e818f0148e3fd11399e400b25fe89804c40780110080100404f8280701400009840ec2613c13d36c2637c388208e760fd8b00250d51163002000840000401000004478700f95b531c78ced1df42001219ab07230420008000053909d09023848270241360209a0100010690991d84c0cc1e85612e1309605c0200401012a0b04105c818b08b4f008440740200000a4425054126220920d0488482402411e1208e0504680800058480b18c230074494363224c4933442c5261a016d062e2a30002c5fe620a00d1d04f681804c89347c80a004c504401008b1d0450c822454110220870d04304800071c82b9c821414000ef44003f8ce09587db94c778ae158d01a1adc92a1c18e6e11e9153ac788194503ecf405ae5f29c3de48c18f3baa57ad591ba456d06e20fdc3000cbd0b971fd6f0954b9527aa69fa462b5944e46d4516e674fe15386c1ff3a97238f156ff6c8342ee0aeae0db4672e46e46b9400023bcf1dae075e8f044ed5614530c24632d7fcd45f7a073850e40af0be938f82858ba5d29a9d89537e7cd8e097fb9edd3f8668a624d7871fe40616295b89d686fae4fd92ca0fbd312a6214a0001674800e8f9008ed636264389bd7e1567a5ea29e46655fcc03a285f426926fe16700000000000000000021bb7a63176238951f0000b089c34862d6bcc822b8e161d8230000000000000000000000000000000000000000000000000c0428620618230028008020aa8095efc41e71a797c676f5058ba96170db01d629c911759f7ef80005bae0cf606d904b2606bc9775e6031e11ef39d3b0ccc18251d00049d2012ba84035e80e38debcfa10d2d769a2de82587ac608c0000018e2b3f8860b4b5da68b755f7d9dc823d3b2b26fcd33ed2e996015a76564d074c80850820440020000238e2e768a730b9020c23d8acd7239bcf792a388b7f5137ffa00f91ae3ba97ca9d716d2de9ebf44800a2b7d8c26f215f875b9abfb12ad6a40976a1e23401387fdc71790a7f3601dd4b318a6b4f7768159fc4305a0ca0de7f961960d6411b52862eb62c017a76564df9a67da5d32c02b4ecac9a0e99018c18610e006000134f59f5e986088ed27324bc1c821df81dae9978f18d50076b35d6c72c6f994c9e4ef0765b5728c2af2cedeaca34c02b265714e21146927682a33affd14117b0a5160495c71bd79f421a5aed345bd04b0f58c11dfa8e7585fa8e757cc3b4588dc2cc16d0412855d96faf805c208078f8ac738f8a7ca0a71b060656d5ede2a2f811f59978c24a085f79f75161a1e29018c1861040000018309e301f4ff2abf4a7d6854c250efebbc0cf8a674392639316ee1401bd9cda84cad2a1d73b705f8fde6f7fe404bf247fcf82485a27e455aaf04bbb4c5546a70cdd9daa464291e41680026c900089d21084b083198410ac204261000b0230503f82e0201ad3498c03842d7dd089405087bd06095c100de2efb42a4180243329bfc228004a00142c0400757cf4fa80084bef742d4940001e4e855c5502aed3de0c93074827018638acfe2182d2d769a2dd57df677208da8e62028c240bd3b2b26fcd33ed2e996015a76564d074ca10710504800400002157da9ac9bfe9c18ba44f7d43cfe596a6fd9d4ef560d00221113204356ab8d63016773a82e24c062025a57cb3d887cf554accf92f9c6a16944238941da7732f0a616249dc188e15af02cee0b3d59d3edbab5002495012cf36f36f7ac06727df576a1491a51b5fc728c15c0d6be76a9db84ac3ff14d36c119b884e1d0f4ecdec5a470548527abd7aa0173c63428ce17ff91698ec6cab4c0f084d206f509919f0600cc9bd8b19e4fab3f340027d0ec6d9bbafe279fd3201fe2e63c43c21dc8000047882d1c68fcab8936d992529feded8bb9e0658fd52dfe92eac6cbfe8081bd44700bf26387062c79ff9fcf2f693c93eeaaa365b009292127419232ea0c32f462cff5d0404944a2b3acf0000000000000000e3bf9eb3fe74b583d9c144be82faa9a02b6bd61508bd781c19d24b952268f83d1b60000000000000000000000000000000000000000000000000001948c18914b08308704104b000000b92008034000ca081f8ef062965cb08123549eba40470c60c793e2500151ffb1518027aa78a800004a4042010c1800000597f69719195b18ae8058c552586211a086c3284fbbb472465935e069a9aa28245efc6d130e18168b2b523ebcf1e4f79c603c30d1ed692e7a336bb93e2365e88184a726285e38aa4ac9949e52c8041e0cdd5ee9f900ff684b0d99e00004c5f124c6e9437ee1c81844100006d6415c4407c0a0004c22001bce41f8660462b07d01d8a95cd9613a5a07839b23606a7b2727240a7609b11ae10ca2b7f43cf6832632023020b7cd81865c41681494a387bdc996e48121b0a46e3a8bf09d62e3290970a5042806a67148ec6c299e5122a9fccf7bcbe00895736e0c416f38eeb070b380470a40f3589b8c92929825a56fc116d09d24003e0ba92be99e64dac702ee617b2aa5d401ef6b73862d0ea413e14a1e057183258051179f4a5726ee54092567b26995246df81f76878d46184e663a8f346490f3a3840c5c2d47b96fc64c0e7dd8199be336a4a00f448a74dc2452e001f2f60fc32236ae0c021bf65e4cff237b034b973f30a50245600cebf8d0cfa5216883c754ef8edf72fbc00585def9cea8cbed02b83c0652923f8c0388000001aa9059040b746d8c8b14974aa36af9a1012ff15e42102)) <<< 16000) + 0x205ba1c1d42823200a29490104d97ceba019a0478ae48b0e000b70304e0389ab7a04f18d02da8e62028c240bd3b2b26fcd33ed2e996015a76564d0771f158e71f14f9414e360c0cadabdbc545f023eb32f1849410bef3eea2c343c43882c824404120002cd2413c84b69c27f3441877963df54474fe9eeff00783390e0bc8618bc060e192cf0f108a18bd23109593584a3fcdd2194206897508255ad86a8c781ab400105883b06f8875129969e792d8bc7ecbb36d2c753054e3a99738ea2417a77343431c76a6bc0091d14f44ebe664241270632011f7f1f626b359217041ec7e43af94b45843275ad2dd3405339b3c46c1900eae1553b7a1007eb645617060cffbb7265d1d4b9b6d835752bc4e7b8430082351cc405184817a76564df9a67da5d32c02b4ecac9a0ee3e2b1ce3e29f2829c6c18195b57b78a8be047d665e30928217de7dd458687867105904881820824010f5e0505f320b6226801311a10d37c7a385294efbc89ce6a8b5e2def177562d16bf41b3c5c5d0ea6b7a0cd32a896fe9fdb985ea68d82380c3a00078241d0340e61a0720d0388281c014000f3a40037208008d5107c15e3e2b1ce3e29f2829c6c18195b57b78a8be047d665e30928217de7dd4586878258a50a40a582480200100220b0d72545cb497698199dbe44515a5eaaab1bea2031351dc2608565ee8ddae396d8318355d6d348ddb672947c48e1c41152c7b542b2825003964d8fd7069e5e02342c6862d8442246a9e1347e302bbf2ba3f1c2069ae0c83005b3fd1b4140c07f6f6d0c01232936501000a0a080021c40000012c0d23ed4b035670800022c4f34222dc0c321a004b96ed24b00000009602004c38420108145876f03c3cac65e0496203007d39990f10b750cdb250407919b41401a0bfb57e0400cbd0d67109c308402165805218153e40a01a9edb93a794533c5331c0f1009976655c1620005643349401064fcfd79a083c3bc052668a00003b3f13d21480c270140000e118154c08b4e73ca5d084c70a0489a4b80bd00ce5564a443863756ca5f282075bf3c3880d7d488138f0026e396506801d5cbc3a0800e9b2a92540042010b2c0e713abc902a2b830b898f2ba5802ff7cd2802beaf0ec70c2ae27513c30e554527df8b04ef3fbb99840503f6d2dda9000480280001a420f60a07a0503c828000f8883c0a81dc34000ece41d847c429078334c0690ce1ce9ee61640000011df0708a41e15b711620000011b146848b06003fd0609b5a56b9e0083014a297ba9a01b3ffa108c07b2184c030954244613057092abfc640544f24e24f14e0c408208904c00100c820080368a0866c4fe1e4abce285a4e271f96a5a27083b805d2a28400a48bfe1410d877c61840800e758e010558f252622804210080000c59075090001569074110398881c8440e2120700500028f1000e0d2001f7a4004c548379081b8340da120029cf20d80a003bdf2007c3a41ad260d402ce4f745d9ff02fcd4cc45da05fefbe699f68d3b2b26c1ee45e82af527b9d5c8bd055ea4f73a6d12c8524f95ff25a2590a49f2bfe30ecc40c604504404600400105400036f7660a39c7a2e5522be329ef7ed9aeb387c707cb37826940eb2c6d953ba9828df04537ba445a3f5efe2e69107b44c899055de28d0b29a507109a60d25c206701670481c2346377a80e0c82426d8c900e3fd2ec2204c2842010e23d53cee3081be1b1ea58e1457a6b8b8e0ec1d5e2182026f0b17804a10400100690503402819c1400027e4198560ca2b0640d83184c18826076130610583000c17c0784ad3cbe1392379ef89b48c1c45875c69211a8e5796960305ebf1b000128e100042c600101b87213824591fbab899891b2e41002cb1be9e7e2be703ea1c3079baa1627d90f4b4dc579ba060d48493a3093efefef8102266e2c2099e63b83677879fa65aae0c090a6330b35d126203ff36376fec0000101b86bf7d7ba5fe65ebab6cfb6b79c32b85b648c28c421805e11027088000e3082e8ec168660b22ba15522b1d4240ab63b3eca281cab59132900c6db345787007e4e34c83001f8d058000000262c210080000a2905c29d0a4eda97532054be66d2a90193dca498450a3f2ea77c28321b6401109420840200b60b05a0582c82e85ebf7e18392280ef67e2080dee108c96284af23eb6a18170b8c0b00e009eb891280098508402000027241606407e220570d02b048154240a81203e0500019610532d0004e11e1036c25224c7d971190f79c480c1183955ed62372329cf24c94a86081a816d4ca5a5a5f75277ea5840c74da5d489a95d98a7cb680a080031dc21e251f800cec22a5d006026fe3f469601f23e3e17584504023380372540a47a42d1b38ca0014f10090ea19a4624ea053e44a80006b0c4d422ea9f1b63a0300800000f4880088c905209828848140076166166862c0be45e82af527b9d5c8bd055ea4f73a6d12c8524f95ff25a2590a49f2bfe30ec891451090070060020000585e1852599cf011a0113f444a3d98f4b7e7a058172a00011b76549d34576022aa529e57fafcb7f28a77ca9a4089e2beb9e336bd3a879b298fff80c0de9ca32454913749520a724828612d3e1292c2584702ae242b02622062001383afb21c00b3f781e002614200086060ee81dbc5079a7a5ae03861e273ef47000b5a54604800cbe075a04a1840010f2c7b531624d1055a2f76cb130af0b5088103f8a8798a0c23046950c00387baf3c981080021e58bcdd45c142800a93e79626651457d1020684146b94185f50dfe800001cfc9e130210004)) <<< 16000) + 0x00004ac827808000a18827028000ee481f84ec207038afa0c15586d4ec4a0476a372b00461842010f2c339fa600b10fe3ba018813ebb282e4a0427ec19acf003922884c300a6200790981080021e5835b91408812d92cd58a5020ac005f82304210080000551f2c2946034c5881d578a422047f4d1c9b060de846dbbcf00060a88886000a4b26080c00f7f7d10ce0042010f2c0fff2608b1247ca76f0b0c2d84f552600400080000a4209a0a000230200087640ec240981204b010002a1904a1d8248ac1204608e1b0460982282e89336bd8324fda4704cd5c2929343b14019e4aac992241c39bc762a101b35893ca05f9139835a37f8855b988c990b1e7ab511ba1ac73bea05e6b8d039f416503cd77ed316448128e9d6791c5fa924ba99137f341f5e3c832927f3ec03eaf936a719b6ebc1c6a68e0654c8341f1503d944e5f01b4ed40fe242ee2ab2cff85f9f69d2b4d5474414ad24448806d2ce1103f3ce2c8140151d891408c3074021e5d88c31e9e42b20063941a14ec50901051a2ea84810380100440500006d101c090000d610431581908c0c4360840b905d7dff06ab9a70a021c89ac9ce436282674ff1f941982318b67b600aae4f49022eb346525825b9685d3b53c4f13ad119cef4641350eaf2b17243d8ffaa98800a41a4de364cb4eabedd89447179964bd5b323efeb067d9fc4573333c8bb800835fec21359e4bf01de5554bef70db4dddb74bfa2260bf361ffb6c0be99880cd5f862a2a570b226e31f430725e036cf75dc160cc7a856f4dd9a324f03507073986d2d134200fb8e4b94108da120a440811202532004828420100410df07322547220b04ec8dd47b5c138434e6d7bf172207a9c84e48fea59d36a2e2e60709810c3dd6f2c7317027724ed45a18da26c2a91ba269c610cb4a40567a99dbaf7be1f65040a2dae9d7b9ab5138d5921d817f838cf098c4a97051aa5528f4133d0f38627ae492018cd4cb5285ff4d9570e03e2c7482d6e02d054fccd7c5be75fee526ea54f117adc0c04aa82b1a0928d2019b5ffddd1082dd142c3b7187cdd9e5e3eabed17b86b89990071e230e608c3101623712c880e7800aa032ce3f504b4e305f0040a81264190639c00033010401d00e088001e6480064e903f15e182ce4360900712019c10103c4f3b0023141d00801908c0c4470100100440100401007c0303d01c01004011a402398e1f0a0a16c5071878042042f8b3000be5a885120210804000035cc01004011a40091622f9e0a17b6afe0c0d5dcd9d61e01558f0b91800043bcbb12821000400003fc80009e100026b20005a4407047221c069e808065fa6f42481269eda00008c60740200001504000f9c81e1080ec74074320390500029210232d000c4390233581380e49041dfc90d89b20e42f770098e96c77949538762f53a85b57b546210901f164536830255020ddcf178a7eedd1fccd74ba6aa6fc4e743428549540d21ca17415b9abfce2e14096a272cb488000b7babe9bd6c3cf8df53c173fe9ab5b3764f6e217b3b05d12b7a0080031f731a8d649bf90596e199ba29d70b4ee71757f884f6f734431ca885a3f4e67200279b3ec50f38471412033cb4bfb03718e89984967af720c1b978955f0bc8e70c0634787d0c67bfc389ba8ecb7fe154cb90a1a46531e3a73ee972c70cbaeb105420e800700b0370181b00c0d407e2a779505118101de33601011075a7f58a11db5c51e8405431727704a104001003405dc2cc16d4c3b4588dfa8e757dfa8e758041c8bd055ea4f73ab917a0abd49ee74da2590a49f2bfe4b44b21493e57fc61d91a52031631431218c1880e897bb38e99b12c991b5880700603ae264c1cd00988d19f742bf50ec6535fc6882c732eebbe23f49a9aa0fbd1b7fa44385c1338b5ba50241cc6a5018af58da1450c0d204b5b243112dbef50c187f21ae050080ce535c820386585dca3400d274f49340210804000062c8198080014e4f093a6623cc704adde823880d346c4a10809474bcd20010b4e42f1425101f00800008010320d81886f8bd062171c21081f00800e82e473f88716e20597be712c702c2581b591820f8042451a9d7b1c4910010736dd2c000f55ce4c600cd61f32a080947759c009410880200002126030618dc4f9031ad1a0468a1a785e6e1860c8eae45fa0000f58c651a01a93821f9401ee2668104e104001000015a200067a40c0360381bb85982da98768b11bf51ceafbf51ceb0082fd473ac2fd473abe61da2c46e1660b6820e45e82af527b9d5c8bd055ea4f73a6d12c8524f95ff25a2590a49f2bfe30eccb18e1030420010000230d92cb62a4e0daae557370354f4cd0910722ba2a1ab4451ba123bb368c440c24020027fee288cdb69c5163c82121d4607c3f7fd8afff8a2fd2912f983232c320074d00046c20010da4058640020986d12c8524f95ff1da2590a49f2bfe4e45e82af527b9d3c8bd055ea4f73a83be45e82af527b9d5c8bd055ea4f73a6d12c8524f95ff25a2590a49f2bfe30ec8918c08708608c0470450020041030400200da14672367a050d8315412c809645c72a8d00aa7dcf6c302c19cc5c8102518200086902ae5ce152068cdb4ad1a02ba55e513d0052feaefdc480842010d20dd1e2738103056b4bbcb40509fbdf62a58a0a446af40b0c2cca12b8200d4e03dd7b3401049f17c04e084601000016c203a03d30011904fa7120637f01f2474b63bc06183095bb70bc508397d65f02053f9e69511c14cd05fcbce0042010e2432d9d2d848e8d8dd31b3061684f9438a10e3f36fd440a6c)) <<< 16000) + 0x84beca38297ab55153800550edfa4e004201000015c323cdec4ea41119b2126ad8103195d3cd78c0084021c4c2a528e2891d5baf687c88dc23c5ccf30105ab8513040f1b40a68ce006765bc9c58007e12e189c00840200002b8400087c80f84800148880e04ec6236b257f8c24686f943ce0dfc31fb8a48023413109000583f4ebc00128a10804000043080047610161500051290231100066b902f2d0171080b47402c2202c0d013848009250802439901609407d44cb0a05c9dd43454992c8c7b9d2d039281e2229898a00000000000000000105a8e62028c240b1b288682e1dde94043791054fb8258e58d72dfa1a63141542452411c0180140545100fe1430858af05ac548a87b2f8785057ca1b9879bf5ac9f677028edadebcbb492219a58d705b0d989478f59747b511138f5bd12e5a99e47f5f66a1d53cf836ae38acfe2182d2d769a2dd57df677208c2c4c87137afc2acf4bd453c8ccabf9807450be84d24dfc2ce00000000000000000043407d44cb0a05c9dd43454992c8c7b9d2d039281e2229898a000000000000000001056166166862c0b6a39880a30902d440c60490080005c37999973dc66dde20f4ca6190fc27176b0343763491126910dd8e6d14c23eb2269f11073073cdcd11841c9fccd86d70113f65b19f1ac11c9ccf2d7c8cca76ea90794494abbd54fb1f56af20399c08649d88f868fd636af031254d9a084af6b05a20d2932bb4413048037c038415ccf3910824a2dad361800ea1878e4a001836c4f60804c3842010a1052a028448827b27159b01c20170c13c6102176996154402418230080158a80003f88151080009a881490c0a05604e03b184c0932083bded675b84c49c11bc7004250284145257fd6255a637912e17006c1202bac604121e2e466553467b8703d2db0f23d7a25b41401f923f7e9bbae8cf48363d36d48cbfd6d189024b601d4290e2260cda77052d51aae5e45c0246960ec153eae243b32f9e810fd062dcab9004a3e729d6e0032eb54461f511cf77c3814772fb36999adf5c191628161b1482246918502c4a6e90516be4be4ba3400e3835974a002a8f6ef90409060880210080100450028e33ae86060b77a0811040f00400001e480e04f8cca5216f89001a8b8f00407e5ade7d008c407c0200001524098440003484094740005704090760462391831bbf9ab7d4f9030c4a0b740caf47803022a4e00e016701c0e102244a4ae44e040a04587954edeab020500fcd75fe56c4f06240dd373ffd8aafb428a30465c71913e76001e4bd5d65796d97f25431c90e41915e9826d17ded293718af751900000000010ac2cc2cd0c581636510d05c3bbd28086f220a9f704b1cb1ae5bf434c6282b3783a8ffc1628b14f227722949881ef57225d13aa4e3c1d5c89744ea938ee1ea9a110114006016cc37532ee2424c45f429310a5c82c8af7d99fbfc1069a89ac552ec1d92bbb6da0f351bc308073d35989d0db12f6ade9aefd69a040eabfd2d6c4fcb70f6bbbfee1aa4b06d9669010849109b014e6343098a109a77854140cac2215c11840f8040080160440ad082d43eeb4306622725dc2046b608598106771b68812013ed31cc02508200085fa8e75923f2c1b346fd419b46fd41a07ec2b6c5c5838c150a8b9d8155859859a18b02e6f0751ff82c51629e44ee45293103deae44ba27549c783ab912e89d5271dc3d44c43831020c2082cf447ac2d89d5ac86f9442de4246bd71281bb585136dbba360f69d02d87b859b52585dbcc4da41cd550e21d22bfa919888f2afeb3f06e00e7a9ad2b5d0b505013a6f0613de699a2054c43133418412538b0a1052487e4fc7000f6ac09aca08400100000ff2000afc6410f3c40f3342130b4cc29013c2a75c0b00001a97f12020f80428ae73ff6c40845985909877c12a3a7074529c552000e00428b18e61c784880421423e98611aa3e98706135605b4704022a05a40833fe37700980c6bce32738010004000055080011790210900019790009e43c2907944082c10f1494aa281c33d1a763001f00801000f027812d718812a61479d107e02282e602679939790007402187e5cae8b0c0a0d6373e2208f0d77113011319f4b46002cb1d0425001f00800007b10001d6203e1201e0500e828000b9c80e06fc424e1f5b60c1a768dfe00413c93cf7214046c2f28d0802a975fbc4942080021c4831fe0649408f36636806084a8ac41020d480bb691e013302ac4940036cdb3404c104001000012d20361a01a0900c8280600400053a400427c800ae5101729000c4c90161100102c9015050014ce101431009968048640222a002e5b200f5604023fb8d0cc8dc3df75a43049ba1620d2460c218d89500cf80c08c6c4b122840506a16cb6479a8202be241a7181d0c0a99bcb17ae6840053c530a394104017e841416816308f09d85aaa3840000012a830517ace200e2840000012a82804c2234dca1802296745ee8a004c4848010e3e316a21f99648715d03e2affae004060000016c61401c3c97fdf0681600c18000005b18500800871230b0470430075c5d969c5130807813eda94d10a2213882070c40f1044b9f5a5ed8206016d8f07944083e2e2ee6487100000007c60e0000cf30d97180000000063828000bde41974409c509c0210452e889297e20600407a8aea48800000025508108110afbf38e2000000095400251427008000095101019000175100f0100029e90006aa201c5a00d2900612802c840143a009190040a801c4400c1a0050900200800c0400138c40084400202000010073081)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase15" = "QuadFullTwelveCase15" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase15 private def zz2320:"s0910"="s0910":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase16 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l16 l17 l22 l27 l29 l30 l33 l35 l37 l5 l51 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2cb417800, -0x59682eb50,0x466376be0,0x4b0], ![-0x59682eb50, -0x2a80066b83,0x149dd1a498, -0x68ecc3a70], ![0x466376be0,0x149dd1a498, -0x30db8e59f3,0x9ab9b1bbe], ![0x4b0, -0x68ecc3a70,0x9ab9b1bbe, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x107b7f90d,l5),(0x1bbbe135f,l8),(0xbcaa1a64,l10),(0x76af6e98,l13),(-0xd5f6e58,l17),(-0x16761c63,l16),(0x4e974b32,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0x839c076e,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x1bbbe135f,l8),(0xbcaa1a64,l10),(-0x107b7f90d,l5),(0x839c076e,l30),(0x76af6e98,l13),(0x4e974b32,l22),(-0xd5f6e58,l17),(-0x16761c63,l16)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x9008802c6020000000443c053008000000001e029004000250982402d003000000003c012401800000002c009200c00000001b004900600001a8210058c040000d0082004c602800000064240730080000000012031004000001b024030c03000000000280c4010000000005805200b9820218203d2200c007310431032500404204304603a4802800002105003c30100000054188059806000002b8c402cc03000000001580c40100000003c1c0a300800000000480e9006000000001f018802000000001180c401000000004d00a200c0000000036031004005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[![-11, 97, -117, 0],![-29, -50, 129, 0],![5, 62, -93, 0],![35, 164, -183, 0],![5, 26, -39, 0]]⟩ def dynamicCode : Nat := ((((0x1c5ecdb053b61442494e5725183c054b4f781433427f9baf1811e2e9c3f21410193252e350984090021c594bf52d4c70510515062b9b920300a13cbbd5050c51506168391821961773509c604d7417c7483200071c7c57120602160cea70c25091020540380001dd3c35573307082065cb558edc70a2b7df29908112b1416e308111f86ffba00ca28460100001153be447d271d483b837df223e9360000000002311431031811010c1180140100001c0c00803400049c80f88c0782403a1201c0500d80a0504055ab82241c2895e66b9c281821f279b65b501420506ee7aab41410085b8521ff200090c48b43d81c04dfd21a8ee814001fdbf004db04668f90324cb6101858048f4d6ef27da399fc1411c62442041031c22811c10c0c000080378c92a57f008a101140411d9021c19a84a51032911db6d43841b78007c87063972a6f0cc004601000013a201c0be31bdc178be9750a1543832b22243038aae23d161bb30145b14fa923cdf00e21d2db076c910060d66d460bb093830002059beb81e314000ed951461bb0200004a239a50ffffc2400c4101c6306ae23ab62cdbee2aac28be178d5ea17189e5caa4c704b2e32e3e28cb3ddbf530a0806c4db864cc16f2ff37041006730b91905d1f641163800f8b5d26712fc0de58739354a528ddc6004f0b8000137001cc32528d16b56dc041511c61862411c10411c0040000c00008036482052c32430412c0240040000c800080364862e1dd1f770b01041b955f60d1a260b1c2a8c69a771a0848e8466ea471b9dc1c78c45302772e15121823454b7644a00704029ebab1762162020053ae3fe043400000147af8c7260570304801a82800009f000240e50c40c4042) <<< 16000) + 0x0408220008000190001006800046000c0003e200280009ae009205455a1f8750511c0860ddea104478bbb8f5870c2ef1986411431f0aff995430f12b345c2a1802468d58b6020000001c2000004122d2036312004c0280001e63231bb26897f186168189c6848870168a1308128557a6228c105de7c0781020ca6df7ba0822aca0c1489c108c0200002d840035b88007de98183a7b4e3965b92054fbc001656f006140000016e36002028c15a20be092c708bddaf61a8bfe1c123a07f39e4800600bddaf061b3fe000452e5fa3756627104001901e2062d8310ca38815dda09a5c01c3119a43414c908000001770202d21c9bc3487080000017700c012e1210974001a26035549b0004c0180001b2344455adb6c30c104223ec3294500c3223352f95b0202056e186f8c91c2318456f43491c1649126c6dc4181d01092e8a24140455adac820c1001ac182b30692309042c028000111101a0100c80800194880c0ac05c5602c2b0151180a08c04c37001b5ee982470282d7d08428169903c6408005592b1d280848404201001201406943ed5f2480a58ed852e040085ba12ef08c208c0210385d74a3082034504f998e40528e7abd38b0406c50ac30408138b2f6c094208c0200002204034360181b00b05c8990bd5d98121f9a77907a48502d51df29202793d1c86480844010c24ab1a7d7b1c7062b2fa0090e8af3053514004b503e64a0211002000036880884c040270380df475a524518841282840630f5bc17c80a8681d5ee16014d687e5c10007c1a3c68a130811804000050c807808000db480708e0084762ef0088410002340026e7f1ca0018901405e088108c0210040100400001110000be300c01004000011100d1180608c02c1786876cdeba100a3c20ca540490e0f802000020c8001219000817386e89e6d9278c2000c042fd430c01d76c7483800000003201806627d658584000000006414441b12128020028040002d84002acc8011d59823608bf66d797d51d44c0aabdcace7043016448a40a208486306280180bab599249b273f97790ec216c2d1747b438c6050e18b61fd91a6b192b53ffdcbc400e700a283823923a6a48d9d875ce28401a4623d0d2875f59fc72488085aede8dda6a3e9b4c8471079f00357e4d59350b6d38800f35bfca398e19378a10704011b6e0e8606cefa411c500602fc329c66ed1ff16326e338f9784cb0e10a6188b1c83725fd112963399dca5941b24600281e833c048800504125280b0b375eaf20ac0c000140f9982010001d7f89505018000a9e9714925900056048b1c9cd19b850097f963334b262e1e65092460000003797be9048800000288c39e40b0b085ac7ee24d9c0a0800001a2eec37004101dc173d680ec05803a74fefa4e1b4239a490006e0a800024c343f050797c294348acf8b09142b6c49fcb71018000025800618000038381600000009601402639bb80890000000096048002400c0048080006dc80030c90009743c4fa1cc03a01c31467bfa3b20234f997c401c24b8eb36851420000009602010dc259e5c141000001c200c034f9972e0059020480180001a920100bc1d87a1fd8e030448134ef9b0e096ffedaf563027e421a2ea08080000038402801fe3ec27404016ffee1fd6aa2cf48ae1ac638c1300800006c880100b86190d71d145088aac62a18611fd3da86c101173227650281028447bb8401b06dad30060114c26d83554271c2300850ce25e71dc8c283fc863bc50600cba7160e06b6b2f70ca481844010b1def87161471ac79cb95c814ceb6e654801c32f6fd4703086b98a16508200084102ef58b8228750860f29901748bfe1e8709f108940c4800a2f5ba39400840218c305f4d3e10500907590544c30820a1c71c8085041048007032000200d0000ed363a2f85b49c410e38b48c8007c912330bf7b641500c341d4eb9d8d40e0ba7f40760f21800000114e3051601ec923a042a8c0137f64a606e9f42010b00b00003d8400104480029699145c5cf2700c40bb14df297f11440bf1690219882063b6f64f3860c47a7c9279c300667dc870df100274da392dc80055a4ee6f5295722040a40800003ae401c17020f2305e951c42669b588a2062da8e936030c4b5ef9620a1111f49b71140380a5f5ec180426c09ee8003318a75632aa5030460100001a520013dc4002e00f1764ed98a20724084e824508ba018428672bfa6520a20f85c57a63b080c7c2e2fcb218387704138d0f8b183538538c0703041352eededa950502c29f6283154a6c690c2d02c411e6e2d1d9689140256c1a878c280000003202440000001900408663fdeb80050025c21bd1bb302138040018074549f8ae0381e28800c92e9c4de58c00000017700a187cab1bd58892300000005dc02820cd22edcf1210000164961f828e0056028a2a9793048fa144082d631c512c600000012c050c458a522dbc9180000004b00808000016d9804100357a0ff05001c5f7d409a800270080000dc9926f68733ab8448e2ecc3953112850000005dc01229440e73cebca000000034bc048017a505716e1c0000000177014e08520200001982000a584001ac4f1c03e1430c32309289942d4621c233024a41870c1429df9e98d05080000027d8018244030e16f404151a93cd803880198124d113810fc34a32b0512040a40700003fc401417d483b839be447d26c5ee1b2fd00000000008c450c604504404500300000c66cc07fd6d6a3577419792a654745b76e58b7cb8c2b87940006ac80200800c04001a3440086400202000010014029)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase16" = "QuadFullTwelveCase16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase16 private def zz2321:"s0911"="s0911":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l14 l15 l21 l22 l23 l27 l29 l30 l33 l35 l37 l5 l51 l57 l64 l65 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2c89a1c7c, -0x591343db8,0x859ce4fc8,0x7e0], ![-0x591343db8, -0x30accae52c,0x157f5b29c8, -0x61d24eeb4], ![0x859ce4fc8,0x157f5b29c8, -0x30b90ef197,0x9a64c6e26], ![0x7e0, -0x61d24eeb4,0x9a64c6e26, -0x2c89a2134]] noncomputable def hinges:Hinges:=[(-0x107b7f90d,l5),(0x1bbbe135f,l8),(0xbcaa1a64,l10),(0x1e3920eec,l14),(0x4a0a738de,l13),(-0x23b692b7c,l15),(0x12a09e4,l21),(-0x703ae6d,l23),(0x2cd7635b4,l22),(-0x2c89a2134,l27),(0x2c89a2134,l29),(-0x52ebe862,l30),(0x2c89a2134,l33),(-0x2c89a2134,l35),(0x2c89a2134,l37),(0x2c89a2134,l51),(-0x4c4,l57),(-0x88,l65),(0x220,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c89a2134,l27),(0x2c89a2134,l29),(0x2c89a2134,l33),(-0x2c89a2134,l35),(0x2c89a2134,l37),(0x2c89a2134,l51),(0x4a0a738de,l13),(0x1e3920eec,l14),(0x2cd7635b4,l22),(0x1bbbe135f,l8),(0xbcaa1a64,l10),(-0x107b7f90d,l5),(-0x23b692b7c,l15),(-0x52ebe862,l30),(-0x703ae6d,l23),(0x12a09e4,l21),(-0x4c4,l57),(0x220,l64),(-0x88,l65)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x841400f0c0400000002e01480200000002d01880200002d8c8070c0300000312101cc020000000330188020000188a40d8c03001422040930c05000001a15014c020000198a4050c030001a45701a0c040018e2840920c050000198a40d0c0300000000340c8010000d41d0310c0404c0d41d032100400013090503d002000000a0603cc02000000f07028c02000000023018802000820ac0c18c0500010421025cc04000027848030c03000024858070c0300000250a018c0200000002501880200026c120058c04000002506018c0200000260601cc0200000003102480200000002b018802000000000c0c80100000000240c80100000c8440d8c0300002b848030c03000028858070c0300000290a018c02000000001c0c80100000000a0348020000000290188020002ac120058c04000002906018c02000002a0601cc02000000035024802003d1889008900300000002f0188020530e021014d00400000d844088c030000208840b0c0300000002101880200022c120058c04000002106018c0200000220601cc0200000002d0248020000000270188020000188440b0c030001341200c4c0404d08c1200c9004a60a209804b500505c0a01c017500400000009802480300000000e014802000000070024803000000012014802,0x2201480200001282402cc0300000110f014c0200000000f014802000138110058c04000120110058c0400250982402d0030000000780248030000c4110320c040001544701b0c040000000d802480300001b84402cc0300000000901880200001a044038c0300001b024030c0300000190901cc02000130150358c04000000002c0c801a812a1a40429005002a12064055003002b1307007500305c124310329004000000016014802a40c610c07490050000001a2c0cc010000188a4050c0300018c5701a0c04000002d1d01cc020000148840d8c03000000905028c02000000005018802000008828030c03], #[![0, -5, -16, 5]]⟩ def dynamicCode : Nat := (((((((0xd61b845688a4326d2bdba2deb5ef819c62ac12210310aa8afcd5730ecae82a440c30a388308386304000161c055c580509e83873b08c42fa733e8fc91bcbd7556d9df59cb8e388380cd6069639689c0c1850c8c7bdf791840c8c7b5ab91c3060e1c253e1c23443e3482c18200000072c02400594a3df281c0530247ad22040578703b12c810280100000f9905f0980702f8b665677ff8e04083485828b9fa4061b2df70159230676cb1313d3c2864117961c418402001c3eafe8428200000117b401004133d60fbdc08018bd113ac057540e160100000880f0d99b1) <<< 16000) + 0x9d94103bfd8f539070bdd4220f11427143baf8c4090c122d2f08122990893c0012620220080000a21a9c491a7c80c227523289dc0dea0000000001208a18818c08808608c00a00800800382401006800098905e1d82e868170340b61305a0982c828160050284338788f407103cc1e82c56385aa49b791b5182e0c965d3100808219c0f63c020410ce274bc0300326a52aaf014000000408c0201f39f43b0020d881c2902002480b8c9fa87f624b2447fedc89b9b902482562ffc48a0c32ffbee4b82062b07b6236f1c2cec9e21ced9408cd3f597d887073b2795e63618027d10de39e42d2430a40814516aedfaeb050c0b768c4dd0e30b1c0f855650800e4bffd7122377eab82244093c5c20d1b08186dad2f0a43856a4f7f1b60e0e93d156986052430980500003d84104160800303f01d1010ce0cb2b012307bc63fa1ca488f7cdf3b25590238325ba2e80204000001245c0414b283f7c1c02820000022e240400000045186080360ce5fce846c40c150102c90bae062be41640000007b780a1faa79be303250b5d77c120172458f02641ea40e1800000cf48030fa74a327a40302426e669d700c00000062790215121852040b224e2d8e6af52c61998c3ba1bca18c1c09154a4185000000152704114e08421d701c300000086910708155f464db81c10d53e493290900000001eb587c4821500e2c8c01d7fa2d8fe8e38000005183ff8b188550f9b37cd650c7e24073f61fd1850000005708e988231d80beae46f87081bd408e856f238222b52651cb8f30000000051840013882410c40f00004aa404004000926415c140ac0b0006e2200121440035d0e1afc4a4bf428c207391bd937183187e91217428400ef01aca850433d1dfe470e0000000048018055c3752d7a280000000384140078202700802a80800077482a0cc14c660a433051198208ac140570300003de01830ac9d540304000039603042b27d30120280eda99180d9598ffa081b2b38fb40027181f00848c0254061403380c1007f318100ccc001a5a5000251813008000064104f1d8270a8134560982304b1182506c12405648597fba511c50028744fa489523b8db3c90ebcea840b1800098856f90c00a646926001308118042c902a5cb74a4895f0fc076490ecb20a119024620460100000b63441777d7c412038401eb4c04057a36c8b2c50000054c3d0003761184ce0094408c02009002000129208e1b0460982284e880580aeb9c86a8489d522f753a4a8790e8d73d37c259d88dec48870d43d1bdd09310229080df3adbe3cc80350fdc6a410472ff1d5af12aa4116d75f79882766846d663e0cde01dd8a20288c56af91a8cc137c23721c7e722c29060d193a98f94f6819511505889cd1bc8a1fd81c104bdf442bd9fabcb5c2bc75f035b862cc774311009dd410121983942c908a504d23e2b4800029babdeb1e07000f541c26a978fc88257ad2059f19a41119ef083448bf9ada40784d8b284725857d93438f4f87178c65dffcd070602db1e98ae369512f5ed67c9e5904468f800880301201d1248d4fd26ca13103f22218619fbf8732208227e254264500a8e1c8aa80000fbc18c2004c2046010a14f98899621425ba08f9b518031fd19dd0000e4a906ed0024102300800007299118ed204ea921da8f0e330300353fb9f2e38000b2d25205002fc0f99780128a1180400004588001ba10430d021028002ad08208ec1000607e03b04e1c2f28900febf31fa1c01713cf0000046383e01003e0d81e84c0f0278101e6e38062421208952983820693b5b0410743364e3800248304601003b0581d02f030d3150a0c2860bd210c0c6043c92ee48820d09844b002c08234f84bc2001905a86680112620230080000a5903911000147101e01c05004010070120370981b02c0d4160680b0330581902c0002d480023e900133d36b0fb5f6dd7350234b5e20aaab5ecfd7f1b8a6935340533db80000000000000000086238a284402382302280000273d49a544a389c36a5abab8d201870550ceba6c9beee48bc205e6cc335a5ad7f4a0a2f4fed0fc56e7b28000000000002c0e969f9a998365fc0000005429c027581e6b19d9ec60a1fd5f768302a160000000000000000000000000000000000004731c51441c11810815140a0a61873cdc17c6e74a319c9db3f6ebfc60d8ae5400efad00e3cb7235a96684a322741d59fb875cc4e8277116e105f82f012485a296a1e999539f7bac52c8bd2a4373b5251b3ee8002629031290181480bca405c0202d010003c31001dc9200600878840ba41510a180000184230231509a27880fb100c57c10200000b99024a20440100200581602f897779df310a182be18372206151f2b849010dbbb54e22038b572ed386010b37320e000c681bf110224e304401000016e20562b01a0101500e4600000466fe2ca9c02053ebc86a413d9b6601840000034452978b3214400000363c8d5973018300000377f9f9973e1c1014e7478038679481412a1f79280c7ca03a140afe4b214561af2c801b451a0bf8104008001300c0a4060500302701c0c00000f2320500000598121865c5c2e480c00000d4e3865730fe270c2ba36898316003b7f122009c30840200340381800000f8e56cf1c600000269232808140000039bb3ca2c4c83eeaf29156c3099a688fe36e1c240671f0ea322540800980b241e83b21802602cc291b0c8010580dc1203b2803ca040c81200004b64064260420be2800003bc400c2800001e1401420000035458141fd04fb2e03840e9fb6d315f8e00aa42843)) <<< 16000) + 0x180a00aa42e08700200c7ce83c0f808991038500400001d42000c0c646000001ad9228042e93586100000264230000000c46140d0a143e000ca20420100260181280c0900604603a2f5ccafe77a8ff5e6c27cef5ea1000000000001384ad3e3357e4f3e895a7c68000000003c14e013ac0f358cecf63050feafbb418150b000000000000000000000000000000000000239faeaa74c0001689a8545f6bf1ebc2036db920000002a0fa9239230c21201bc6f76ec406535480b0ad8479d35bba4a898e21c7a8143d269c07220808a0424acf865652c04a0c67c346e526203556c3fdbc4dde85f4dbf62a17b7aa1204bbbcef92ca4db8cd8ea4b9db58fb26e31e63f0a2850353949a04403c281a5b456f995db40cfc7ee08a811bdacc201a670cc789ebe80a61b038fd88a24a0a2000000466384d29d4786a84ba2bb78ecc0789804014bd17f2abd0056ded29bc450804000002fad075bc2c2bb5dc95a04bbc8a00000064a98c0d403de860b9c8c519fa40000002840dcd553e76a2acd3c893d78c00424af3db6ed96ed87c09831f05a1865449012352a799a500000016e36001850000000659fa01440000000895440180944a774ca18761a0000000089544018001d842b78df050000000177fa011d4c1c30d00f000045040019b8cb0ed9ed2d4eda638529d4a4f4142b796dc957f18b94e4ea18000000000000000000000000000000000000000000000000018c4a20818b0ca08800600000000bd90d9cba83bc50ad3b0d9c7fa81947f8bd524073181c1a058421c643d60ed2246ae66fb06c856f6c8e2dc39f986fb48a08b3224956f22aec57809385473181dcb497d4c0a18deb7c7772bc803762717b0a7318b400127481082e4723710baaaf5dc9148dc41db9b4371c5000000b2872009047da4e07338691c05b459a2e8ebc05016d16702a86f0000dfb96310e95280000007a3140214d8c258c845588985838e1902200009508009ea900154e2003d0a40688400402c127a3e68b3fdfddac622f23880ea8cd952e19be82911841c31830c21011401000c0007998011cbd4ef8991bb801d8dcac900256ba752ce019610928b60c1b850b44115b2e7e03035e34a8f18504273d15918024630460100200580482e45015ea4410668a208573e658ee060d31c7442d290302c9731d9df391410216dda4a760c0249b516e91604007d78488e6d2001cb80ee79f420154fa10405a058000202203e0201e01c8c0c6b8606c614094286d608257bd0702c18110b7e0e243007dc8eb084065102300800c00c074060380301b01c0e08bd8404246112568af121a071e587c30ad1159738048184201001a01e042ce727e4591343db6591347218230f648d0d54a5102ed428a0554fd797c0000a32463042432401c0180028e17bd2e3465734a585afc8c324ce536fa269d6b02a85a0cfbe598203621e57a718424076a00050c4064260240bc0859ce4fc8b22687b6cb2268e430461ec91a1aa94a205da85140aa9faf2f800014640c38c4043002800000327b3afff854319528c48fbd72d415dfc08f7244303bc69e64fe0a10b4bcfbf612b0e480e14000a1880032e1a180178f1518a28024f9248104b10c07d60380022c0d658600cf3e36c98ca10460100180180b80c0580602a038020080200500764810933a4cb201922493448810d58a6e241be1b0b27900e34049ba01000027987930010804349f57cbdf50d23d5f3bff7241763495b28805d8d1456a38000000a8b49002afb084a2000abed852a700220080000b19013050001611c0859ce4fc8b22687b6cb2268e430461d2d3f353306cbf8000000a91648e39230e10e00c00000463bd4d82decb6926a30e435448506fb01faf5d9689f39fd2e45c31b05fa000446404817810b39c9f91644d0f6d9644d1c8608c3a5a7e6a660d97f0000001522881862051812801400000035c5ce481bb1d2125bc027e2de521782a00c0598ee0f6b035f51737446f9518c9582d5ff888e53edf68835016148319280015d100083c202232010190004f2900f1d0008fa10015392002eb6686f2cd35968830454874510641845212539270302521254abb028287a981fae820293ac5e8b3018189e358294020e789e00374076808b91471e7202801461156e7c0ed9870c1fbe4ef58450c7dadbc319470800000396c0608789879fdc050ba8abf50748706935a6dc140105a927930fb8403a8abf17089503191828018714ed92e9eec3879faa25082183000000e1002084c0b4f0106004a31354b228000000096010006b110550b3821280400380601a0300c0180580f07000000bb801c1686293b627041c5f7cdf0001c014e08403fb040259761cc2200008e74b1caaa3001400a2cb99d3e8a4762c90067dad1d930700000009602c720ff5ece1f28700000009600c0000ab908b69800a00200002b200100280765f1f6f4a21c2c72167399ff86020000003844b042c537392212080000017701c000000012c00800000010686e004e008b2fad79bc5cb16480ec681dcf307000000177058e3f1cd2c8b4208000002a309800000000e102c004b38a25da48000000009630004e0080001b820006b06569f19abf279f44ad3e34000000001e128a2892492852452051811c00c0400803400042080482e08b13048444489180000002ee0206082f71e2d7c81086465894791c40000000bb80800608549cc1700000008ca0805f7d472a28a6102a0100000e1900097a20016c4402074001b2c401c9400c4a0052500200800c040020124008a400202000010024d19)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase17" = "QuadFullTwelveCase17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase17 private def zz2322:"s0912"="s0912":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase18 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l23 l27 l29 l33 l35 l36 l37 l5 l51 l54 l63 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xde3bba7, -0x54ea624, -0x4f1af96,0x4b0], ![-0x54ea624, -0x29d9ae44,0x3b2e0e4,0x615b946], ![-0x4f1af96,0x3b2e0e4, -0x227ff04c,0x54ee716], ![0x4b0,0x615b946,0x54ee716, -0x2a756cc]] noncomputable def hinges:Hinges:=[(-0xbf4,l5),(0x24f9,l8),(0x1d6917a,l23),(-0x2a756cc,l27),(0x2a756cc,l29),(0x2a756cc,l33),(-0x2a756cc,l35),(-0x24f9,l36),(0x2a756cc,l37),(0x2a756cc,l51),(0xbf4,l54),(-0x1d6917a,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2a756cc,l27),(0x2a756cc,l29),(0x2a756cc,l33),(-0x2a756cc,l35),(0x2a756cc,l37),(0x2a756cc,l51),(0x1d6917a,l23),(-0x1d6917a,l63),(0x24f9,l8),(-0x24f9,l36),(-0xbf4,l5),(0xbf4,l54)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xa21b042047a008000000000f0148020001284c12016801800000001e009200c0000108260341808000000d02c038c030000000d8980c6010000000006c052008000002c13809980600000000b0024803000000006c0124018000006c0900c300c0000037088059806004208c1300ed004000000000280c4010000000003805200a822241820390a00c004c0c41701210040000c8481202c80180000004c2c0630080000000026029005440a104400635006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := ((((0xa202eeefa55a0e39060669820743b6cc1a3e73ab29ba3f8b180001de2c228e426f8f5f246b51dd314d557a85c033fc81932e48e442d11734e60d418500001d5ec5295f6d42cb8104a82319d95c2cd5ee00d8312cd127d5ee180e08a41c8b24a550218492ab0f53a24819df68118380004be4a1d616009a48e33bd0e23010000363140806d12f8002c48bcbda40074031649bcaa7ac248164f165260e00012f90a1d616009a1238b271aa93010000363050201b44be09005587a9d00058929858c4800f80a000069c8001aa9e3da0f9bec1c608c8ff7a50a000041108144389ad40e287acd37b203087867e0380548f9fc820008c143500000363288081f0100000ce981bf380b8a422668c2b46b836a329db2440e2f593eb47ae388eb37394e470446129b0b406195270c1014505001c7eb20086d457cc6f32c280243df9cbca12840005cdf4822177817a1b6c4861983400009d8d1077a57b4a208737ae63290391eb2aff8b1801742cac48cf92f8c9e206241279570a1800a3aa0030df09ede12001f4983b90879002102051055efef142c70000862810387b9367dc9190e2ad32040c1ee388770c3422c2bfc14000f6e4c008002150652c0011922762091200420380001bb3c7e3a89fc38a18438354541c624d3684d48148fa1929c1c501a3d0f544080f0068f0082288ac5e48700ca9e55b7334021100e000065cc8982f1b18e2357c7c2309177b7f0c108edee01821a26b4900209f25828004d3ad84028463f614040d004000055480c848001b24ea9d6d707c60599f6cc8dd82d112830b69f3cc42da7cf2842430c3062063843042041020632eadc83408a8e9a214007ea8f488fd1949257afe687714631328000fa1a103982e7db0c20c7df60461041682c24a060416850ba40a0947a6dedb0c10c7d77746281430b26a504012be162d12037eadb8e21d8818230200000e690181100b8280580503534e1ba2707098eb48eb703045d1a1c29a14221389662b100109c1c89987003e6beb8e0280213d2d0280205f3deeec2733451dca7d7102502859044963d2d5410471709b44b1048c72abdd1f069428002a3c1fe048b6e12f99651902854ecd1c45030059d0953ba817821c10a80f164b370ade1ff02089f1490cd1b048d24d54c59d9ca14001fad17e8122fafdff784992050000a54a10040070a1ec1b790300892c7a5aa811a188042b0440000f51b252de71af8081cd3d6328c4916d1f43547851036936550080c5a0c84c90b0451cd990204041e00d9e406016ed47b70050023d495f26289002402859337876e0b448c46613e0f248b19b87e8722880004cb7f85820001e2fe820206538fc48102169d2f3e818064f5476f41000e230a6657a900240240000ec1015050001f09bc10d08ddcba8202a251040a408388104282082500180801006e0a8d4ab20411029070598cce30b0bec843c38821ea0b4b840386ea85535828c1a90ca7b976404724ec3aaa0410890) <<< 16000) + 0xb8bd783830aa8a7a865132400980d182a35413849881483765c33230b0bee2204d1043d44488e80e1baa12cb45460d486a1eb5e404724d8e6120821122cf1bf0e0c2a9757f3a89a400940c00003c8645be08301455dd1fe020a23262050001498130a5607dd274fea2c4010115617414ffa356eeaa20c316f12ee3aa8814d9d684adb14201000ca20710551e36aeae80c006815e410d4afe1f093b7acdd096f5e9616db296005c10000a008000b9080037610007d42001f3470d32e9e84460c00023c70a08e0bc70a1c000000960300382ef6a85000001cbf58007c01002602012010088080400401e0200018a201c2b00b1180686e88147a59e585583a520940deefcd1fec040104953cdede8c7bcb35d27b85917927c380477be6496404cf0723d28950078b53a2805843e449cb1378e3067b762f95f3d961008b12308e08bed0dc026bc9f28a590ac00901ed775469e8ce6385af46a7f51f7111cef15c0f657d94ea754b714d535e64acb92418f05353427bced7b862d60f976ba4d610305bc1700afb1808a38f8310c276d14e638e234a2224231c5850c10002074a00078c424807bc9441c0056118093860c8042cb12350d124830b620b10ac3b3c5813f9cab24000076712820c8042c48334b440836cf70a004949b91820b8040000230fb3ee791d995692b190400a9ca549cd4074c5807c25482a4694690590410506386280455014196ac3c0d086a5cc16bdb39061b54a11362c0f3842e8a340007948001c19c203ef7524051eb40d100ad2a5f0200629a05840010ba0208020faf8004c203401000010c3c714d2020c63201906088022822ca83a083a03e782006be8c8100fde136050306001000016a4030140002886053826c40465c2ac60dc4ee33a0ae38c18b9d91a3104652f196a61e226d786005df00ca749215ce22a61c0078ee1826a9664ae8a55c7914d36c1d0a6a06f6100c0d3972bcc9fcaa4cf4b28d5699ba4ae5936dc400229a222c7e7c1a7ae8cb5e6e036290bbc3de0cfa151c4734a5e17df93a072c24ee8bf6731e14442cae0bc9f2147ffba9f5cf5f87d496f5ada0c4e10a00012208005f89eb5746175e0e8483c5971d196b263c58ae9100000000000000067975046846e817820000000a90818618410c00a00202040584589afb3eec4b7b71354aa93b4741f9e5442d79805701e4df4c4cd4d16c8569bbb3eb104c1014000b188009cb900271d3c3e414aa6c7a3430e3697d5251c168f68ec9510ff644974b1e7181af3c7023f8dee9742ecf8fe101086b243b3a478ec36e839ad1407c3a989a154aa21c3f91b631000d467424d451a42f56184500c02154fbeda7704994c04db65000e3234b09e269e46ade88f2f1eaaa831c628291ce20b8218ad5c4267d0d10cdeb26a86f2a0e0a419c752e60000000000000000000000000000000000000001367e337dbc0dfae6ae4a4fbc5129ba71c32737c0000000000000000000000000000000000000004c22052042021c214204000002e180200d9153e3806c243005fc9d480e57902d21830000a2a89040060a7b180011136e440003e1cf50000877a28e103c028a18eb8cb74508098ae492447814a4a14100cbc50c5080000ad8500586ca7b200037062c0007cf7b3a00001b1944020e8082c7724713cb1458f012285eb955bc8140006532c306a83608000002420800122dd67001a00858ed701c996290e2eda50bd7acc71618408f3e28000004f4a00340100000df200044a4000f288002a8900086420161b00a0148e4f3044245c0908b0e0bfb4d6c5073a172428092c936094206402123c3b19d6308055f8f8c186f9b883829ea6020a0abd4e7a1807251e98402c832e80803f82d5850103401000015520121300809f081622ec50b3c15ac2043ec4e050056a0bc0903060021440294e3060adce77f0811c545bc30162c8e00802bfd4e809430680200001c8401c1400039469e78a4631d0163ad5d185d783a120f165c7465ac98f162ba440000000000000019b62aff028df8168f8d15d913149248a48a0a21020410c00a008000412b2b9c3680c7c38f6677c9386daf4b70973140b62fc686699e5f6faeb206c94cdf15fb4951868f40a098832182a298255d820978001e52c164201e008c6410156929e47667b3ee055f09554c57f735021ca54415ec2e99376174ca009192c0123257070c910710410a04504803c39caefbe246a1447a9405dcd2064fcc3b7e0a547b20f34ec338f4f8eb8ebcf21a47913064810b70c3b7571a04046666220327aea546f495a384291b0e4f14c0ebbe0abb1d7593bddb2a64f875479300f3f706db64e050e1802775cbaad761626bf32c41a38e16c0438a82a93d760300869b0d3c74608d32a468713919ad442f4f620e98f11cc500164a0505d2d64d7eddcf85f0aa88486b54dbdf017b1dc003ba4086878a9fd19649ba043f7dac514ccb8753574d71dc1b58245efd822aa092954feaeba04fc495ea09664e0d13c38182043844088041558b1801ca0944001779f940058021a6895d48071c17d7246885416a8340a1d3f19000000da25001900800006d10001c03643e89b710300011e14298e177961662fb88c004067f24a10300100000d92000ff24002b488005a49000ed6200269c68ba43580f0a1915badb82829b4d23c0808000f278200222976d060000006401000781bac84e103c010a2c8a153ae0c20046950b0c1800004b00c100e16e3f8a08e0bbdaa0808000397e04c104001000012c200c1a0050900202800c04004020002fa200202000010011771)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 13 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase18" = "QuadFullTwelveCase18" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 13 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase18 private def zz2323:"s0913"="s0913":=by decide+kernel end section namespace Green24Proof.QuadFullTwelveCase19 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l36 l5 l54 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x39d,0x27c,0x190,0x190], ![0x27c,0,0x198,0x190], ![0x190,0x198, -0x2d50,0x132a], ![0x190,0x190,0x132a,0]] noncomputable def hinges:Hinges:=[(-0x3fc,l5),(0xc53,l8),(-0xc53,l36),(0x3fc,l54)] def normalizationDenominator:ℤ:=0x1dcd65000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(0xc53,l8),(-0xc53,l36),(-0x3fc,l5),(0x3fc,l54)] def dynamicTables : DynamicPackedCheck.Tables := ⟨29, #[0x13018802], #[]⟩ def dynamicCode : Nat := 0xa23eb02863200818cc02843200810c8018415b080daa01ced1c1038031447d61431901031981421901021900c26d7101b540c0c537008180080000e120000ba22b6143c8020798050b200816400c256ce7673b46080b00c5102b6143190040c66014219004086400c26d7030314c439da3840700600003a48000e49 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 4 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullTwelveCase19" = "QuadFullTwelveCase19" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 4 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullTwelveCase19 private def zz2324:"s0914"="s0914":=by decide+kernel end section namespace Green24Proof.FullTwelveRows open FullPhaseRows (Phase) open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x114e20001eeb5ca800996f3cbe2620003dceb948009bceebdee07a20003dceb948007f3ecf19a1fa200779ae580028dbdccca06a20003dceb948005ed87da9e15a200779ae580049a87abda01a2005faf84806ec4d1d2220003dceb94800a8588fa9a07d20003dceb948018efb6e49a1fd2001389b4802beffac21ed2002fd7c28001c895d5ba14d20003dceb94801696ab8ee652003bcdb2c004ced0b7ea120003dceb94802bacb28ede07c20003dceb94802ac5acb5aa1fc200779ae58029dc89aa1ec20001eeb5ca8002dfe3ffba420001eeb5ca800d85a7d7ba078200779ae50affcca6020001eeb5ca800bf1cec19214] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x136005faf848001808af207e6002fd7c28021da92be15e60001eeb5ca80099ed4c79e01e60003dceb9480188abfbbc266005faf848003b798e7d61ea60003dceb948009b5a288b601a60001eeb5ca8019bba2a0f6260003dceb94800fe5c5c996560004e2ad8002160003dceb948003ce9ec207f20003dceb948011d7fccf961ff20003dceb94801bddf8a6de01f20003dceb948018dccfeb92720003dceb94801ee3a794a207b20003dceb94807d92aef606b2005faf848011f0cff214b2000ef3acd001acb3e6320001eeb5ca8015bdace1ae1fe20003dceb948015e89df3c215e20003dceb94804cab9a9614] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1530004e2ad8002130004e2ad800203c30001eeb5ca8001bb9e97da1fc30001eeb5ca8005a0d39ec2430003dceb948004bfc4faea1f830001eeb5ca8002b7a0a3ae030001eeb5ca8001d2eff8827e0001eeb5ca80663e0003dceb948004f7a0a607fa0003dceb94800f8ea48ef61ffa0003dceb948018d789d0ca1efa002fd7c280779bca7a002fd7c28005dde3f8ee1fba0004e2ad8003958eb23a0001eeb5ca801bbec5f0e21fea003bcdb2c0058284f8ca6a0001eeb5ca800d8ea0aa8607aa0003dceb948017aabeea9a2a0001eeb5ca8009d68e84a2760004e2ad800214] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1670004e2ad800201a70003dceb94801ea682270004e2ad8002570004e2ad8002170004e2ad8002730004e2ad800216b300779ae58023c6f19e05b3001389b48065b3ca330001eeb5ca806203e3002fd7c28007e0a9aa1ee30001eeb5ca803efebea606e300779ae5800ab5f49a15e30003dceb948001c9bbf5fa14e30001eeb5ca8079d7cec6630007b9d6a80216a30003dceb9480028da1e8e601a30003dceb948061ab919a23001389b4800603d3003bcdb2c0221ed300779ae5802214] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x103c00003dceb948003aa9bef921fc0003bcdb2c06eacecf61ec00001eeb5ca804492e0e602c00003dceb9480069389f4c21cc00003dceb948001b9daeeaa05c00003dceb948008beccae400002b196c0027f0004e2ad80023f0004e2ad800203fb0003dceb948008f206fb0003dceb948003827b0004e2ad800216bb0001eeb5ca8002cc8998d63b0004e2ad80021feb0003dceb948014fbdac26b00779ae58002cfbbda1fab0003dceb948071f091e62b0001eeb5ca8035b6b0ba770004e2ad8002370004e2ad800214] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1480002b196c002740002b196c002640002b196c002540002b196c002440002b196c00203f00001eeb5ca8005f2d49ab217f00003dceb948012bed099ea1cf00003dceb94800afebff6de700003dceb948002bdbceffa03e00001eeb5ca8001c3a492ce1fe000779ae58001bfdefaf21ee0000198cba056de9602e00017ebe18035a7fed21de0005faf84804eefd4ee1ce00003dceb948014adbdf6600002b196c00203d0001de6d9a068dccfda17d00003dceb948012a0d5b4da1dd00003dceb948009c6dbb8e650001389b48001b9ddbe14] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x17c0001eeb5ca8002be16ec0001eeb5ca8006fe8eb21dec0003dceb9480069ae2c201ec0003dceb94801a6c0002b196c0025c0002b196c0024c0002b196c00203f80003dceb94800a89c2d9c617f80001eeb5ca80089d839aee14f80001eeb5ca8009a8959a780002b196c00217e80001eeb5ca8026eceec606e80001eeb5ca8001eaa6888215e80001eeb5ca8002e085c4b21ce80003dceb948002b998d5ee680002b196c00203d80001eeb5ca800883bfe99616d80003dceb94800ca8f0defe05d80003dceb948001e0d8fb9e58001de6d9a01214] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1610002b196c00203a10003dceb9480089cf08eee17a10001eeb5ca8001d1c9dce61ca10003dceb948077e5d0c205a100779ae5801adfb796210002b196c00203c10003dceb948009febcaa9e17c1001de6d9a070cdeab602c10001eeb5ca800ad5ca8bda1dc10003dceb948004ac9ca1ee05c10003dceb948004dcf3ffbe410003dceb948002f603810003dceb94800cc396b6f617810003dceb94801597a0f2168100779ae58004ce8aa4fe15810001eeb5ca8007978cbafa0581005faf848001f2b3d182010017ebe1801217fc005faf848009ee1cfc0017ebe1806614] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x117c9001de6d9a001a09591be1ec90001eeb5ca8001d4fdf38202c90005faf8a036a3fe1dc90001eeb5ca80028aa399ee1cc9002fd7c2800bcfd2b201c90001eeb5ca800296490002b196c002178900779ae58003e8fdc4ce1c89002fd7c28030f2fa92090003dceb948003b216f50017ebe1807a75002fd7c28008f494f2ae35001de6d9a004a1aaa8ea550002b196c00201950003dceb948026ecbe9e150002b196c00207e10003dceb94800597afd0e217e100779ae58007bccee79e06e10001eeb5ca8005f9f0e3ea1de10003dceb9480709db9da14] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x108880003dceb948003a9c0fdaa08850003dceb948055e78eaa08800003dceb948055e78eaa7d0002b196c00215bd0001eeb5ca800edaa2fa3d0003dceb94800885e39a5d0001eeb5ca802cc4e8b496019d0003dceb948044b5c4cb821d0003dceb94800be7d0b19617e900779ae580038a889ac616e90003dceb94800ebc87afb202e9005faf848002dca889a615e90001eeb5ca80038dfbb18e1ce90003dceb948003a08598fa690002b196c00203a90001eeb5ca8004e1e3fefe17a9005faf848001e6aae18a02a9005faf848002f5c1efa215a90002fdbc9006ebe4ca290001eeb5ca8001ae14] def rowsChunk10:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x10894002692e802010101000102010008930003dceb94802886c7f201010100010201000892005faf84800ad2edc0fe0118010101180101010f0102010f01020403dceb948076e29796011801010118010101010100010201000401eeb5ca8012316001043136010101000101010001020403dceb9480089e88b9fe010101000102010001000101010001020403dceb948001b096f7c20103dceb948003c4f2a2088a00779ae58010daa9aa088f0003dceb948007b691b5de0a] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 ++ rowsChunk10 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadFullTwelveCase0.base QuadFullTwelveCase0.hinges QuadFullTwelveCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase0.base QuadFullTwelveCase0.hinges QuadFullTwelveCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadFullTwelveCase1.base QuadFullTwelveCase1.hinges QuadFullTwelveCase1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel private def zz1147:"s047b"="s047b":=by decide+kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase1.base QuadFullTwelveCase1.hinges QuadFullTwelveCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r62,RewriteAtoms.r19,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r56,RewriteAtoms.r58,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadFullTwelveCase2.base QuadFullTwelveCase2.hinges QuadFullTwelveCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase2.base QuadFullTwelveCase2.hinges QuadFullTwelveCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadFullTwelveCase3.base QuadFullTwelveCase3.hinges QuadFullTwelveCase3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel private def zz1148:"s047c"="s047c":=by decide+kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase3.base QuadFullTwelveCase3.hinges QuadFullTwelveCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r62,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadFullTwelveCase4.base QuadFullTwelveCase4.hinges QuadFullTwelveCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase4.base QuadFullTwelveCase4.hinges QuadFullTwelveCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r45,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadFullTwelveCase5.base QuadFullTwelveCase5.hinges QuadFullTwelveCase5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel private def zz1149:"s047d"="s047d":=by decide+kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase5.base QuadFullTwelveCase5.hinges QuadFullTwelveCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r56,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadFullTwelveCase6.base QuadFullTwelveCase6.hinges QuadFullTwelveCase6.normalizationDenominator theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase6.base QuadFullTwelveCase6.hinges QuadFullTwelveCase6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r63,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadFullTwelveCase7.base QuadFullTwelveCase7.hinges QuadFullTwelveCase7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel private def zz1150:"s047e"="s047e":=by decide+kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase7.base QuadFullTwelveCase7.hinges QuadFullTwelveCase7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadFullTwelveCase8.base QuadFullTwelveCase8.hinges QuadFullTwelveCase8.normalizationDenominator theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase8.base QuadFullTwelveCase8.hinges QuadFullTwelveCase8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadFullTwelveCase9.base QuadFullTwelveCase9.hinges QuadFullTwelveCase9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel private def zz1151:"s047f"="s047f":=by decide+kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase9.base QuadFullTwelveCase9.hinges QuadFullTwelveCase9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r59,RewriteAtoms.r30,RewriteAtoms.r61,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r19,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadFullTwelveCase10.base QuadFullTwelveCase10.hinges QuadFullTwelveCase10.normalizationDenominator theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase10.base QuadFullTwelveCase10.hinges QuadFullTwelveCase10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r20,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r19,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadFullTwelveCase11.base QuadFullTwelveCase11.hinges QuadFullTwelveCase11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel private def zz1152:"s0480"="s0480":=by decide+kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase11.base QuadFullTwelveCase11.hinges QuadFullTwelveCase11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadFullTwelveCase12.base QuadFullTwelveCase12.hinges QuadFullTwelveCase12.normalizationDenominator theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase12.base QuadFullTwelveCase12.hinges QuadFullTwelveCase12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadFullTwelveCase13.base QuadFullTwelveCase13.hinges QuadFullTwelveCase13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel private def zz1153:"s0481"="s0481":=by decide+kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase13.base QuadFullTwelveCase13.hinges QuadFullTwelveCase13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadFullTwelveCase14.base QuadFullTwelveCase14.hinges QuadFullTwelveCase14.normalizationDenominator theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase14.base QuadFullTwelveCase14.hinges QuadFullTwelveCase14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadFullTwelveCase15.base QuadFullTwelveCase15.hinges QuadFullTwelveCase15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel private def zz1154:"s0482"="s0482":=by decide+kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase15.base QuadFullTwelveCase15.hinges QuadFullTwelveCase15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadFullTwelveCase16.base QuadFullTwelveCase16.hinges QuadFullTwelveCase16.normalizationDenominator theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase16.base QuadFullTwelveCase16.hinges QuadFullTwelveCase16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r62,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r63,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadFullTwelveCase17.base QuadFullTwelveCase17.hinges QuadFullTwelveCase17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel private def zz1155:"s0483"="s0483":=by decide+kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase17.base QuadFullTwelveCase17.hinges QuadFullTwelveCase17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadFullTwelveCase18.base QuadFullTwelveCase18.hinges QuadFullTwelveCase18.normalizationDenominator theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase18.base QuadFullTwelveCase18.hinges QuadFullTwelveCase18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadFullTwelveCase19.base QuadFullTwelveCase19.hinges QuadFullTwelveCase19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel private def zz1156:"s0484"="s0484":=by decide+kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadFullTwelveCase19.base QuadFullTwelveCase19.hinges QuadFullTwelveCase19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullTwelveCase19.nonnegative x hx def pair20:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair20Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_20_base LocalFullTwelvePairs.compact_fullTwelve_pair_20_hinges theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalFullTwelvePairs.fullTwelve_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_20_base LocalFullTwelvePairs.compact_fullTwelve_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair21Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_21_base LocalFullTwelvePairs.compact_fullTwelve_pair_21_hinges private def zz1157:"s0485"="s0485":=by decide+kernel theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalFullTwelvePairs.fullTwelve_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_21_base LocalFullTwelvePairs.compact_fullTwelve_pair_21_hinges x theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 0 1 false def pair22Rewrites:Rewrites:=[] def pair22Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_22_base LocalFullTwelvePairs.compact_fullTwelve_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel private def zz1158:"s0486"="s0486":=by decide+kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalFullTwelvePairs.fullTwelve_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_22_base LocalFullTwelvePairs.compact_fullTwelve_pair_22_hinges x theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2] def pair23Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_23_base LocalFullTwelvePairs.compact_fullTwelve_pair_23_hinges theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalFullTwelvePairs.fullTwelve_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_23_base LocalFullTwelvePairs.compact_fullTwelve_pair_23_hinges x private def zz1159:"s0487"="s0487":=by decide+kernel theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r70,RewriteAtoms.r69] def pair24Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_24_base LocalFullTwelvePairs.compact_fullTwelve_pair_24_hinges theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalFullTwelvePairs.fullTwelve_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_24_base LocalFullTwelvePairs.compact_fullTwelve_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69] def pair25Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_25_base LocalFullTwelvePairs.compact_fullTwelve_pair_25_hinges private def zz1160:"s0488"="s0488":=by decide+kernel theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalFullTwelvePairs.fullTwelve_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_25_base LocalFullTwelvePairs.compact_fullTwelve_pair_25_hinges x theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51] def pair26Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_26_base LocalFullTwelvePairs.compact_fullTwelve_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel private def zz1161:"s0489"="s0489":=by decide+kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalFullTwelvePairs.fullTwelve_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_26_base LocalFullTwelvePairs.compact_fullTwelve_pair_26_hinges x theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2] def pair27Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_27_base LocalFullTwelvePairs.compact_fullTwelve_pair_27_hinges theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalFullTwelvePairs.fullTwelve_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_27_base LocalFullTwelvePairs.compact_fullTwelve_pair_27_hinges x private def zz1162:"s048a"="s048a":=by decide+kernel theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_28_base LocalFullTwelvePairs.compact_fullTwelve_pair_28_hinges theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalFullTwelvePairs.fullTwelve_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_28_base LocalFullTwelvePairs.compact_fullTwelve_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_29_base LocalFullTwelvePairs.compact_fullTwelve_pair_29_hinges private def zz1163:"s048b"="s048b":=by decide+kernel theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalFullTwelvePairs.fullTwelve_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_29_base LocalFullTwelvePairs.compact_fullTwelve_pair_29_hinges x theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r18] def pair30Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_30_base LocalFullTwelvePairs.compact_fullTwelve_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel private def zz1164:"s048c"="s048c":=by decide+kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalFullTwelvePairs.fullTwelve_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_30_base LocalFullTwelvePairs.compact_fullTwelve_pair_30_hinges x theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r71,RewriteAtoms.r28] def pair31Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_31_base LocalFullTwelvePairs.compact_fullTwelve_pair_31_hinges theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalFullTwelvePairs.fullTwelve_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_31_base LocalFullTwelvePairs.compact_fullTwelve_pair_31_hinges x private def zz1165:"s048d"="s048d":=by decide+kernel theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_32_base LocalFullTwelvePairs.compact_fullTwelve_pair_32_hinges theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalFullTwelvePairs.fullTwelve_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_32_base LocalFullTwelvePairs.compact_fullTwelve_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_33_base LocalFullTwelvePairs.compact_fullTwelve_pair_33_hinges private def zz1166:"s048e"="s048e":=by decide+kernel theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalFullTwelvePairs.fullTwelve_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_33_base LocalFullTwelvePairs.compact_fullTwelve_pair_33_hinges x theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair34Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_34_base LocalFullTwelvePairs.compact_fullTwelve_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel private def zz1167:"s048f"="s048f":=by decide+kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalFullTwelvePairs.fullTwelve_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_34_base LocalFullTwelvePairs.compact_fullTwelve_pair_34_hinges x theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69] def pair35Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_35_base LocalFullTwelvePairs.compact_fullTwelve_pair_35_hinges theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalFullTwelvePairs.fullTwelve_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_35_base LocalFullTwelvePairs.compact_fullTwelve_pair_35_hinges x private def zz1168:"s0490"="s0490":=by decide+kernel theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r51] def pair36Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_36_base LocalFullTwelvePairs.compact_fullTwelve_pair_36_hinges theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalFullTwelvePairs.fullTwelve_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_36_base LocalFullTwelvePairs.compact_fullTwelve_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r71] def pair37Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_37_base LocalFullTwelvePairs.compact_fullTwelve_pair_37_hinges private def zz1169:"s0491"="s0491":=by decide+kernel theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalFullTwelvePairs.fullTwelve_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_37_base LocalFullTwelvePairs.compact_fullTwelve_pair_37_hinges x theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_38_base LocalFullTwelvePairs.compact_fullTwelve_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel private def zz1170:"s0492"="s0492":=by decide+kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalFullTwelvePairs.fullTwelve_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_38_base LocalFullTwelvePairs.compact_fullTwelve_pair_38_hinges x theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=pairSlack (12) ((1 / 0xf4240)) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalFullTwelvePairs.compact_fullTwelve_pair_39_base LocalFullTwelvePairs.compact_fullTwelve_pair_39_hinges theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalFullTwelvePairs.fullTwelve_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullTwelvePairs.compact_fullTwelve_pair_39_base LocalFullTwelvePairs.compact_fullTwelve_pair_39_hinges x private def zz1171:"s0493"="s0493":=by decide+kernel theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalFullTwelvePairs.fullTwelve_pair_39_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack (12) ((1 / 0xf4240)) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.FullTwelveRows private def zz2325:"s0915"="s0915":=by decide+kernel end section namespace Green24Proof.FullTwelveCyclic open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows FullPhaseSemantics open FullPhaseRows (Phase) open FullPhaseAggregation (quadPoint_nonneg pairPoint_nonneg) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ExtendedFullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack FullTwelveRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullTwelveRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse FullTwelveRows.rows p q same x] exact FullTwelveRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) private def zz1172:"s0494"="s0494":=by decide+kernel theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack 12 (1 / 0xf4240) FullTwelveRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullTwelveRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap 12 (1 / 0xf4240) FullTwelveRows.rows p q same x] exact FullTwelveRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible FullTwelveRows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials FullTwelveRows.rows theorem remaining_rows_count:remainingRows.length = 13:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (1 / 0x3d090:ℝ) * mass g ^ 2 ≤ weightedAggregate 12 h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack FullTwelveRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack 12 (1 / 0xf4240) FullTwelveRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum,stripPotentials_sound 12 h4 h3 h5 g FullTwelveRows.rows rows_admissible] at hs norm_num at hs change (1 / 0x3d090:ℝ) * mass g ^ 2 ≤ weightedAggregate 12 h4 h3 g (stripPotentials FullTwelveRows.rows) + 4 * deficit g linarith end Green24Proof.FullTwelveCyclic private def zz2326:"s0916"="s0916":=by decide+kernel end section namespace Green24Proof.FullTwelveMass open ExtendedFullPhaseRows ExtendedFullPhaseAggregation open FullPhaseRows (Phase) open PhaseMassRows PhaseColourRows ConditionalMassRows private def zz1173:"s0495"="s0495":=by decide+kernel theorem remainingRows_eq:FullTwelveCyclic.remainingRows = [ ((0x55ce395 / 0x3b9aca00), .base (.balance 0 (1))), ((0x55ce395 / 0x3b9aca00), .base (.balance 2 (-1))), ((0x1a981f55 / 0x3b9aca00), .base (.child 0)), ((0x3b622d6f / 0x3b9aca00), .base (.heightChild 1)), ((0x10b4a55 / 0xee6b280), .base (.grandchild 0)), ((0x389c91 / 0x3b9aca00), .colourChild .whole), ((0xb02dde1 / 0x3b9aca00), .massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)), ((0x41e10e7f / 0x3b9aca00), .massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,(27 / 49),2,(48 / 49)]:Fin 4 → ℚ) p)), ((9 / 0x1dcd6500), .massProduct (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) (fun p => (![-1,12, -1,12]:Fin 4 → ℚ) p)), ((0x76c45cb / 0x3b9aca00), .massProduct (fun p => (![1, -8,1, -8]:Fin 4 → ℚ) p) (fun p => (![-1,12, -1,12]:Fin 4 → ℚ) p)), ((0x552db03f / 0xbebc200), .base (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((0x280d1f9 / 0x3b9aca00), .base (.massSquare true (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((1 / 0x98968), .base (.normalization))]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff CombinedPolicyPackedRowsEquality.extendedEq CombinedPolicyPackedRowsEquality.extendedEq_iff _ _).mp decide +kernel theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (12:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hforms:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm 8 12 i p:ℝ))) (hchild:FullPhaseAggregation.rowAggregate 12 h4 h3 g (.child 0) ≤ 0) (hheight:FullPhaseAggregation.rowAggregate 12 h4 h3 g (.heightChild 1) ≤ 0) (hgrand:FullPhaseAggregation.rowAggregate 12 h4 h3 g (.grandchild 0) ≤ 0) (hcolour:rowAggregate 12 h4 h3 g (.colourChild .whole) ≤ 0) : weightedAggregate 12 h4 h3 g FullTwelveCyclic.remainingRows ≤ ((1 / 0x98968):ℝ) * mass g ^ 2:=by have hbal:=mul_nonpos_of_nonneg_of_nonpos (sub_nonneg.mpr heven) (sub_nonpos.mpr hhigh) have hp6:rowAggregate 12 h4 h3 g (.massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 12 8 12 h4 h3 g hforms 4 5 have hp7:rowAggregate 12 h4 h3 g (.massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,(27 / 49),2,(48 / 49)]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 12 8 12 h4 h3 g hforms 4 12 have hp8:rowAggregate 12 h4 h3 g (.massProduct (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) (fun p => (![-1,12, -1,12]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 12 8 12 h4 h3 g hforms 5 8 have hp9:rowAggregate 12 h4 h3 g (.massProduct (fun p => (![1, -8,1, -8]:Fin 4 → ℚ) p) (fun p => (![-1,12, -1,12]:Fin 4 → ℚ) p)) ≤ 0:=by exact domainProduct_nonpos 12 8 12 h4 h3 g hforms 7 8 have hs10:=rowAggregate_massSquare_nonpos 12 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) have hs11:=rowAggregate_colouredMassSquare_nonpos 12 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_base,rowAggregate_balance,rowAggregate_normalization] norm_num linarith theorem deficit_nonneg_of_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hhigh:(phaseTotal h4 g 0 + phaseTotal h4 g 2) ≤ (12:ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hforms:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm 8 12 i p:ℝ))) (hchild:FullPhaseAggregation.rowAggregate 12 h4 h3 g (.child 0) ≤ 0) (hheight:FullPhaseAggregation.rowAggregate 12 h4 h3 g (.heightChild 1) ≤ 0) (hgrand:FullPhaseAggregation.rowAggregate 12 h4 h3 g (.grandchild 0) ≤ 0) (hcolour:rowAggregate 12 h4 h3 g (.colourChild .whole) ≤ 0) : 0 ≤ deficit g:=by have hc:=FullTwelveCyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g heven hhigh hforms hchild hheight hgrand hcolour nlinarith [sq_nonneg (mass g)] end Green24Proof.FullTwelveMass private def zz2327:"s0917"="s0917":=by decide+kernel end section namespace Green24Proof.FullTwelveProfileInterval open FullPhaseRows (Phase) open PhaseMassRows ChildRows HeightChildRows theorem interval_nonneg_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (heven:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(8:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (12:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by by_contra! hneg have hm:m < 2 * m:=by have hp:=NeZero.pos m; omega have hdu:=ih m hm (dvd_mul_left m 2) u hu have hdv:=ih m hm (dvd_mul_left m 2) v hv have hg:=interleave_nonneg u v hu hv have hforms:=ConditionalProfileRows.domainForms_nonneg 8 12 h4 h2 u v hu hv hdu hdv hneg (by norm_num) heven hodd hlow hhigh have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) have hchild:FullPhaseAggregation.rowAggregate 12 h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even]; linarith have hheight:=rowAggregate_height_odd_nonpos 12 h4 h3 h2 u v hu hv (HeightStrong.strong_height_bound h2 h3m h5m v hv) have hgrand:=Full27ProfileInterval.grandchild_nonpos_of_induction 12 h4 h3 (interleave u v) hg 0 ih have hcolour:=ColourChildRows.whole_nonpos_of_induction 12 h4 h3 (interleave u v) hg ih have hhigh':phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 ≤ (12:ℝ) * (phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3):=by rw [ProfileChildren.phaseTotal_interleave_zero h4 h2, ProfileChildren.phaseTotal_interleave_two h4 h2,phaseTotal_interleave_one h4 h2, phaseTotal_interleave_three h4 h2,classMass_sum,classMass_sum] exact hhigh have h:=FullTwelveMass.deficit_nonneg_of_rows h4 h3 h5 (interleave u v) hg heven hhigh' hforms hchild hheight hgrand hcolour linarith private def zz1174:"s0496"="s0496":=by decide+kernel theorem interval_nonneg {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(8:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (12:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,heven,hodd⟩ := ProfileDoubleOrientation.orient_both_children h4 u v hu hv have h:=interval_nonneg_ordered h4 h3 h5 h2 u' v' hu' hv' ih heven hodd (by simpa only [hU,hV] using hlow) (by simpa only [hU,hV] using hhigh) simpa only [hd] using h end Green24Proof.FullTwelveProfileInterval private def zz2328:"s0918"="s0918":=by decide+kernel end section namespace Green24Proof.RatioCoverTwelve open ProfileInduction BoundaryFromHeightCertificates ConditionalProfileEndpoint open RatioCoverSixteenFromRemaining (IntervalCertificate) theorem interval_to_twelve {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:ProperDivisorNonneg (2 * m)) (horder:mass v ≤ mass u) (hhigh:mass u ≤ 12 * mass v) : 0 ≤ deficit (interleave u v):=by by_cases height:mass u ≤ 8 * mass v · exact RatioCoverEight.interval_to_eight h4 h3 h5 h2 u v hu hv ih horder height · exact FullTwelveProfileInterval.interval_nonneg h4 h3 h5 h2 u v hu hv ih (le_of_lt (lt_of_not_ge height)) hhigh theorem ratio_to_sixteen_of_remaining (h1216:IntervalCertificate 12 16):RatioToSixteen:=by apply RatioCoverEight.ratio_to_sixteen_of_remaining _ h1216 intro m _ exact FullTwelveProfileInterval.interval_nonneg theorem deficit_nonneg_of_remaining (h1216:IntervalCertificate 12 16) (hcertificate12:∀ (m:ℕ) [NeZero m],HeightCertificate m Q12) (hcertificate18:∀ (m:ℕ) [NeZero m],HeightCertificate m Q18) : ∀ (q:ℕ) [NeZero q], ¬5 ∣ q → ∀ (g:ZMod q → ℝ),(∀ i,0 ≤ g i) → 0 ≤ deficit g := deficit_nonneg_of_certificates (ratio_to_sixteen_of_remaining h1216) hcertificate12 hcertificate18 end Green24Proof.RatioCoverTwelve private def zz2329:"s0919"="s0919":=by decide+kernel end section namespace Green24Proof.LocalFullSixteenPairs def compact_fullSixteen_pair_20_base:CompactPair.Quadratic:=⟨0,(0x1367 / 0x12a05f200),0⟩ def compact_fullSixteen_pair_20_hinges:List CompactPair.Hinge:=[] noncomputable def fullSixteen_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_20_base compact_fullSixteen_pair_20_hinges x y def compact_fullSixteen_pair_20_cuts:List ℚ:=[] private def zz1175:"s0497"="s0497":=by decide+kernel theorem compact_fullSixteen_pair_20_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_20_base compact_fullSixteen_pair_20_hinges 0 compact_fullSixteen_pair_20_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_20_representation (x y:ℝ) : fullSixteen_pair_20 x y = CompactPair.expressionEval compact_fullSixteen_pair_20_base compact_fullSixteen_pair_20_hinges x y:=by rfl theorem fullSixteen_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_20 x y:=by rw [compact_fullSixteen_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_20_check hy (by simpa using hx) def compact_fullSixteen_pair_21_base:CompactPair.Quadratic:=⟨(13 / 0x59682f000),(0xf6d / 0x2540be400),0⟩ def compact_fullSixteen_pair_21_hinges:List CompactPair.Hinge:=[⟨(1 / 0xee6b2800),1, -2⟩,⟨(-1 / 0x59682f000),2, -3⟩,⟨(-1 / 0xee6b2800),2, -1⟩,⟨(1 / 0x59682f000),3, -2⟩] noncomputable def fullSixteen_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_21_base compact_fullSixteen_pair_21_hinges x y def compact_fullSixteen_pair_21_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2] theorem compact_fullSixteen_pair_21_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_21_base compact_fullSixteen_pair_21_hinges 0 compact_fullSixteen_pair_21_cuts = true := by decide +kernel private def zz1176:"s0498"="s0498":=by decide+kernel theorem compact_fullSixteen_pair_21_representation (x y:ℝ) : fullSixteen_pair_21 x y = CompactPair.expressionEval compact_fullSixteen_pair_21_base compact_fullSixteen_pair_21_hinges x y:=by rfl theorem fullSixteen_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_21 x y:=by rw [compact_fullSixteen_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_21_check hy (by simpa using hx) def compact_fullSixteen_pair_22_base:CompactPair.Quadratic:=⟨0,(0x2beb / 0x1dcd65000),0⟩ def compact_fullSixteen_pair_22_hinges:List CompactPair.Hinge:=[] noncomputable def fullSixteen_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_22_base compact_fullSixteen_pair_22_hinges x y def compact_fullSixteen_pair_22_cuts:List ℚ:=[] theorem compact_fullSixteen_pair_22_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_22_base compact_fullSixteen_pair_22_hinges 0 compact_fullSixteen_pair_22_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_22_representation (x y:ℝ) : fullSixteen_pair_22 x y = CompactPair.expressionEval compact_fullSixteen_pair_22_base compact_fullSixteen_pair_22_hinges x y:=by rfl private def zz1177:"s0499"="s0499":=by decide+kernel theorem fullSixteen_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_22 x y:=by rw [compact_fullSixteen_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_22_check hy (by simpa using hx) def compact_fullSixteen_pair_23_base:CompactPair.Quadratic:=⟨(-0x282f4bde3 / 0x1dcd65000),(0x170f9bfc3 / 0x1dcd65000),0⟩ def compact_fullSixteen_pair_23_hinges:List CompactPair.Hinge:=[⟨(-0x14aefedb / 0x8f0d1800),1, -3⟩,⟨(0x5bc9345 / 0x7735940),1, -2⟩,⟨(-73 / 0x3b9aca00),1, -1⟩,⟨(-0x1df8de85 / 0x8f0d1800),2, -3⟩,⟨(0x8fde035 / 0xbebc200),2, -1⟩,⟨(-0xf6db7af / 0x5f5e1000),3, -2⟩] noncomputable def fullSixteen_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_23_base compact_fullSixteen_pair_23_hinges x y def compact_fullSixteen_pair_23_cuts:List ℚ:=[(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_fullSixteen_pair_23_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_23_base compact_fullSixteen_pair_23_hinges 0 compact_fullSixteen_pair_23_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_23_representation (x y:ℝ) : fullSixteen_pair_23 x y = CompactPair.expressionEval compact_fullSixteen_pair_23_base compact_fullSixteen_pair_23_hinges x y:=by rfl theorem fullSixteen_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_23 x y:=by rw [compact_fullSixteen_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_23_check hy (by simpa using hx) def compact_fullSixteen_pair_24_base:CompactPair.Quadratic:=⟨(-19 / 0x3b9aca00),(0x26e9 / 0x2540be400),0⟩ def compact_fullSixteen_pair_24_hinges:List CompactPair.Hinge:=[⟨(0x14f96bd / 0xb2d05e00),1, -3⟩,⟨(-0x9c3323f / 0xee6b2800),1, -2⟩,⟨(-0x9b1e251 / 0x1dcd6500),1, -1⟩,⟨(0x71dc71f / 0x165a0bc00),2, -3⟩,⟨(-0x6999dd61 / 0xee6b2800),2, -1⟩,⟨(0x25313859 / 0xee6b2800),3, -2⟩,⟨(0x8921161 / 0x77359400),3, -1⟩] noncomputable def fullSixteen_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_24_base compact_fullSixteen_pair_24_hinges x y def compact_fullSixteen_pair_24_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] private def zz1178:"s049a"="s049a":=by decide+kernel theorem compact_fullSixteen_pair_24_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_24_base compact_fullSixteen_pair_24_hinges 0 compact_fullSixteen_pair_24_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_24_representation (x y:ℝ) : fullSixteen_pair_24 x y = CompactPair.expressionEval compact_fullSixteen_pair_24_base compact_fullSixteen_pair_24_hinges x y:=by rfl theorem fullSixteen_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_24 x y:=by rw [compact_fullSixteen_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_24_check hy (by simpa using hx) def compact_fullSixteen_pair_25_base:CompactPair.Quadratic:=⟨(29 / 0x59682f000),(0xf65 / 0x2540be400),0⟩ def compact_fullSixteen_pair_25_hinges:List CompactPair.Hinge:=[⟨(1 / 0x165a0bc00),1, -3⟩,⟨(-3 / 0x1dcd65000),1, -2⟩,⟨(1 / 0xee6b2800),1, -1⟩,⟨(-1 / 0x1dcd65000),2, -1⟩,⟨(-1 / 0x2cb417800),3, -1⟩] noncomputable def fullSixteen_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_25_base compact_fullSixteen_pair_25_hinges x y def compact_fullSixteen_pair_25_cuts:List ℚ:=[(1 / 3),(1 / 2),1,2,3] theorem compact_fullSixteen_pair_25_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_25_base compact_fullSixteen_pair_25_hinges 0 compact_fullSixteen_pair_25_cuts = true := by decide +kernel private def zz1179:"s049b"="s049b":=by decide+kernel theorem compact_fullSixteen_pair_25_representation (x y:ℝ) : fullSixteen_pair_25 x y = CompactPair.expressionEval compact_fullSixteen_pair_25_base compact_fullSixteen_pair_25_hinges x y:=by rfl theorem fullSixteen_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_25 x y:=by rw [compact_fullSixteen_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_25_check hy (by simpa using hx) def compact_fullSixteen_pair_26_base:CompactPair.Quadratic:=⟨(0x861f4d / 0xb2d05e00),(0x2beb / 0x1dcd65000),0⟩ def compact_fullSixteen_pair_26_hinges:List CompactPair.Hinge:=[⟨(-0x13edab87 / 0x165a0bc00),1, -3⟩,⟨(-0x375ac5f / 0x77359400),1, -1⟩,⟨(0x11a91a1 / 0x3b9aca00),2, -3⟩,⟨(0x18b252f / 0xee6b2800),2, -1⟩,⟨(-0x7b1df / 0xee6b280),3, -1⟩] noncomputable def fullSixteen_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_26_base compact_fullSixteen_pair_26_hinges x y def compact_fullSixteen_pair_26_cuts:List ℚ:=[(1 / 3),(1 / 2),1,(3 / 2),3] theorem compact_fullSixteen_pair_26_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_26_base compact_fullSixteen_pair_26_hinges 0 compact_fullSixteen_pair_26_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_26_representation (x y:ℝ) : fullSixteen_pair_26 x y = CompactPair.expressionEval compact_fullSixteen_pair_26_base compact_fullSixteen_pair_26_hinges x y:=by rfl private def zz1180:"s049c"="s049c":=by decide+kernel theorem fullSixteen_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_26 x y:=by rw [compact_fullSixteen_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_26_check hy (by simpa using hx) def compact_fullSixteen_pair_27_base:CompactPair.Quadratic:=⟨(-0x5fcfdf83f / 0x1dcd65000),(0x265327c77 / 0x1dcd65000),0⟩ def compact_fullSixteen_pair_27_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(-0x3d51d6bb / 0x5f5e1000),2, -1⟩,⟨(0xe5f2e53d / 0x165a0bc00),3, -1⟩] noncomputable def fullSixteen_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_27_base compact_fullSixteen_pair_27_hinges x y def compact_fullSixteen_pair_27_cuts:List ℚ:=[(1 / 3),(1 / 2),2] theorem compact_fullSixteen_pair_27_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_27_base compact_fullSixteen_pair_27_hinges 0 compact_fullSixteen_pair_27_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_27_representation (x y:ℝ) : fullSixteen_pair_27 x y = CompactPair.expressionEval compact_fullSixteen_pair_27_base compact_fullSixteen_pair_27_hinges x y:=by rfl theorem fullSixteen_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_27 x y:=by rw [compact_fullSixteen_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_27_check hy (by simpa using hx) def compact_fullSixteen_pair_28_base:CompactPair.Quadratic:=⟨(-0x1987ff863f / 0xe8d4a5100),(-0xdda0062c7a99 / 0x11c37937e0800),(-0x2d638d607 / 0x2e90edd00)⟩ def compact_fullSixteen_pair_28_hinges:List CompactPair.Hinge:=[⟨(-0x2d638d607 / 0x1d1a94a200),1, -3⟩,⟨(0x2d638d607 / 0x1d1a94a200),1,3⟩,⟨(0x2d638d607 / 0x1d1a94a200),3, -1⟩,⟨(0x2d638d607 / 0x1d1a94a200),3,1⟩] noncomputable def fullSixteen_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_28_base compact_fullSixteen_pair_28_hinges x y def compact_fullSixteen_pair_28_cuts:List ℚ:=[(1 / 3),3] private def zz1181:"s049d"="s049d":=by decide+kernel theorem compact_fullSixteen_pair_28_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_28_base compact_fullSixteen_pair_28_hinges 0 compact_fullSixteen_pair_28_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_28_representation (x y:ℝ) : fullSixteen_pair_28 x y = CompactPair.expressionEval compact_fullSixteen_pair_28_base compact_fullSixteen_pair_28_hinges x y:=by rfl theorem fullSixteen_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_28 x y:=by rw [compact_fullSixteen_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_28_check hy (by simpa using hx) def compact_fullSixteen_pair_29_base:CompactPair.Quadratic:=⟨(-0x1987ff863f / 0xe8d4a5100),(-0xdda011598079 / 0x11c37937e0800),(-0x2d638d607 / 0x2e90edd00)⟩ def compact_fullSixteen_pair_29_hinges:List CompactPair.Hinge:=[⟨(-0x2d638d607 / 0x1d1a94a200),1, -3⟩,⟨(0x2d638d607 / 0x1d1a94a200),1,3⟩,⟨(0x2d638d607 / 0x1d1a94a200),3, -1⟩,⟨(0x2d638d607 / 0x1d1a94a200),3,1⟩] noncomputable def fullSixteen_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_29_base compact_fullSixteen_pair_29_hinges x y def compact_fullSixteen_pair_29_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullSixteen_pair_29_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_29_base compact_fullSixteen_pair_29_hinges 0 compact_fullSixteen_pair_29_cuts = true := by decide +kernel private def zz1182:"s049e"="s049e":=by decide+kernel theorem compact_fullSixteen_pair_29_representation (x y:ℝ) : fullSixteen_pair_29 x y = CompactPair.expressionEval compact_fullSixteen_pair_29_base compact_fullSixteen_pair_29_hinges x y:=by rfl theorem fullSixteen_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_29 x y:=by rw [compact_fullSixteen_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_29_check hy (by simpa using hx) def compact_fullSixteen_pair_30_base:CompactPair.Quadratic:=⟨(-0x54bcd7679 / 0xb2d05e00),(0x88c7b152d / 0x1dcd65000),0⟩ def compact_fullSixteen_pair_30_hinges:List CompactPair.Hinge:=[⟨(-0x72163cd / 0x8f0d1800),2, -3⟩,⟨(0x4d4d9415 / 0x59682f00),3, -1⟩] noncomputable def fullSixteen_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_30_base compact_fullSixteen_pair_30_hinges x y def compact_fullSixteen_pair_30_cuts:List ℚ:=[(1 / 3),(3 / 2)] theorem compact_fullSixteen_pair_30_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_30_base compact_fullSixteen_pair_30_hinges 0 compact_fullSixteen_pair_30_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_30_representation (x y:ℝ) : fullSixteen_pair_30 x y = CompactPair.expressionEval compact_fullSixteen_pair_30_base compact_fullSixteen_pair_30_hinges x y:=by rfl private def zz1183:"s049f"="s049f":=by decide+kernel theorem fullSixteen_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_30 x y:=by rw [compact_fullSixteen_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_30_check hy (by simpa using hx) def compact_fullSixteen_pair_31_base:CompactPair.Quadratic:=⟨(9 / 0x1dcd65000),(0x191d / 0x1dcd65000),0⟩ def compact_fullSixteen_pair_31_hinges:List CompactPair.Hinge:=[⟨(-0x214b / 0xee6b2800),1, -1⟩,⟨(0xd5 / 0x3b9aca00),2, -3⟩,⟨(0xd4f / 0x59682f000),3, -2⟩] noncomputable def fullSixteen_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_31_base compact_fullSixteen_pair_31_hinges x y def compact_fullSixteen_pair_31_cuts:List ℚ:=[(2 / 3),1,(3 / 2)] theorem compact_fullSixteen_pair_31_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_31_base compact_fullSixteen_pair_31_hinges 0 compact_fullSixteen_pair_31_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_31_representation (x y:ℝ) : fullSixteen_pair_31 x y = CompactPair.expressionEval compact_fullSixteen_pair_31_base compact_fullSixteen_pair_31_hinges x y:=by rfl theorem fullSixteen_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_31 x y:=by rw [compact_fullSixteen_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_31_check hy (by simpa using hx) def compact_fullSixteen_pair_32_base:CompactPair.Quadratic:=⟨(-0xa816013b1 / 0x2ba7def300),(0x61c9933743b5f / 0x2386f26fc1000),(-0x2d638d607 / 0x2e90edd00)⟩ def compact_fullSixteen_pair_32_hinges:List CompactPair.Hinge:=[⟨(-0x8cafe7802d / 0x574fbde600),1, -3⟩,⟨(0x2d638d607 / 0x1d1a94a200),1,3⟩,⟨(0x2d638d607 / 0x1d1a94a200),3, -1⟩,⟨(0x2d638d607 / 0x1d1a94a200),3,1⟩] noncomputable def fullSixteen_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_32_base compact_fullSixteen_pair_32_hinges x y def compact_fullSixteen_pair_32_cuts:List ℚ:=[(1 / 3),3] private def zz1184:"s04a0"="s04a0":=by decide+kernel theorem compact_fullSixteen_pair_32_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_32_base compact_fullSixteen_pair_32_hinges 0 compact_fullSixteen_pair_32_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_32_representation (x y:ℝ) : fullSixteen_pair_32 x y = CompactPair.expressionEval compact_fullSixteen_pair_32_base compact_fullSixteen_pair_32_hinges x y:=by rfl theorem fullSixteen_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_32 x y:=by rw [compact_fullSixteen_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_32_check hy (by simpa using hx) def compact_fullSixteen_pair_33_base:CompactPair.Quadratic:=⟨(-0x1987ff863f / 0xe8d4a5100),(-0x1bb40233486d1 / 0x2386f26fc1000),(-0x2d638d607 / 0x2e90edd00)⟩ def compact_fullSixteen_pair_33_hinges:List CompactPair.Hinge:=[⟨(-0x2d638d607 / 0x1d1a94a200),1, -3⟩,⟨(0x2d638d607 / 0x1d1a94a200),1,3⟩,⟨(0x2d638d607 / 0x1d1a94a200),3, -1⟩,⟨(0x2d638d607 / 0x1d1a94a200),3,1⟩] noncomputable def fullSixteen_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_33_base compact_fullSixteen_pair_33_hinges x y def compact_fullSixteen_pair_33_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullSixteen_pair_33_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_33_base compact_fullSixteen_pair_33_hinges 0 compact_fullSixteen_pair_33_cuts = true := by decide +kernel private def zz1185:"s04a1"="s04a1":=by decide+kernel theorem compact_fullSixteen_pair_33_representation (x y:ℝ) : fullSixteen_pair_33 x y = CompactPair.expressionEval compact_fullSixteen_pair_33_base compact_fullSixteen_pair_33_hinges x y:=by rfl theorem fullSixteen_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_33 x y:=by rw [compact_fullSixteen_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_33_check hy (by simpa using hx) def compact_fullSixteen_pair_34_base:CompactPair.Quadratic:=⟨(1 / 0x39387000),(0x26dd / 0x2540be400),0⟩ def compact_fullSixteen_pair_34_hinges:List CompactPair.Hinge:=[⟨(-0xa30d2f / 0x11e1a300),1, -3⟩,⟨(0x1461a5e1 / 0x5f5e1000),1, -2⟩,⟨(-0x197a0f59 / 0x165a0bc00),2, -3⟩,⟨(-0x1461a5e1 / 0x5f5e1000),2, -1⟩,⟨(0x197a0f59 / 0x165a0bc00),3, -2⟩,⟨(0xa30d2f / 0x11e1a300),3, -1⟩] noncomputable def fullSixteen_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_34_base compact_fullSixteen_pair_34_hinges x y def compact_fullSixteen_pair_34_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_fullSixteen_pair_34_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_34_base compact_fullSixteen_pair_34_hinges 0 compact_fullSixteen_pair_34_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_34_representation (x y:ℝ) : fullSixteen_pair_34 x y = CompactPair.expressionEval compact_fullSixteen_pair_34_base compact_fullSixteen_pair_34_hinges x y:=by rfl private def zz1186:"s04a2"="s04a2":=by decide+kernel theorem fullSixteen_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_34 x y:=by rw [compact_fullSixteen_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_34_check hy (by simpa using hx) def compact_fullSixteen_pair_35_base:CompactPair.Quadratic:=⟨(-1 / 0x11e1a3000),(0xf6d / 0x2540be400),0⟩ def compact_fullSixteen_pair_35_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x59682f000),2, -3⟩,⟨(1 / 0x59682f000),3, -2⟩] noncomputable def fullSixteen_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_35_base compact_fullSixteen_pair_35_hinges x y def compact_fullSixteen_pair_35_cuts:List ℚ:=[(2 / 3),(3 / 2)] theorem compact_fullSixteen_pair_35_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_35_base compact_fullSixteen_pair_35_hinges 0 compact_fullSixteen_pair_35_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_35_representation (x y:ℝ) : fullSixteen_pair_35 x y = CompactPair.expressionEval compact_fullSixteen_pair_35_base compact_fullSixteen_pair_35_hinges x y:=by rfl theorem fullSixteen_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_35 x y:=by rw [compact_fullSixteen_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_35_check hy (by simpa using hx) def compact_fullSixteen_pair_36_base:CompactPair.Quadratic:=⟨(-0x5fc8831 / 0x165a0bc0),(0xf5349ed / 0x1312d000),0⟩ def compact_fullSixteen_pair_36_hinges:List CompactPair.Hinge:=[⟨(0x5fc8831 / 0x59682f00),2, -3⟩] noncomputable def fullSixteen_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_36_base compact_fullSixteen_pair_36_hinges x y def compact_fullSixteen_pair_36_cuts:List ℚ:=[(3 / 2)] private def zz1187:"s04a3"="s04a3":=by decide+kernel theorem compact_fullSixteen_pair_36_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_36_base compact_fullSixteen_pair_36_hinges 0 compact_fullSixteen_pair_36_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_36_representation (x y:ℝ) : fullSixteen_pair_36 x y = CompactPair.expressionEval compact_fullSixteen_pair_36_base compact_fullSixteen_pair_36_hinges x y:=by rfl theorem fullSixteen_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_36 x y:=by rw [compact_fullSixteen_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_36_check hy (by simpa using hx) def compact_fullSixteen_pair_37_base:CompactPair.Quadratic:=⟨(-0x1392c07d7 / 0x1dcd65000),(0x31152ecd / 0x5f5e1000),0⟩ def compact_fullSixteen_pair_37_hinges:List CompactPair.Hinge:=[⟨(0xbd / 0xee6b2800),1, -3⟩,⟨(-0x17a75f4f / 0x1dcd65000),1, -2⟩,⟨(-1 / 0x77359400),1, -1⟩,⟨(0x28fe60b / 0x1dcd65000),2, -3⟩,⟨(0x5e9d6ff7 / 0x1dcd65000),2, -1⟩,⟨(-0xb878b3 / 0x3b9aca00),3, -2⟩] noncomputable def fullSixteen_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_37_base compact_fullSixteen_pair_37_hinges x y def compact_fullSixteen_pair_37_cuts:List ℚ:=[(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_fullSixteen_pair_37_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_37_base compact_fullSixteen_pair_37_hinges 0 compact_fullSixteen_pair_37_cuts = true := by decide +kernel private def zz1188:"s04a4"="s04a4":=by decide+kernel theorem compact_fullSixteen_pair_37_representation (x y:ℝ) : fullSixteen_pair_37 x y = CompactPair.expressionEval compact_fullSixteen_pair_37_base compact_fullSixteen_pair_37_hinges x y:=by rfl theorem fullSixteen_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_37 x y:=by rw [compact_fullSixteen_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_37_check hy (by simpa using hx) def compact_fullSixteen_pair_38_base:CompactPair.Quadratic:=⟨(-0x1987ff863f / 0xe8d4a5100),(-0x37680183a0ad5 / 0x470de4df82000),(-0x2d638d607 / 0x2e90edd00)⟩ def compact_fullSixteen_pair_38_hinges:List CompactPair.Hinge:=[⟨(-0x2d638d607 / 0x1d1a94a200),1, -3⟩,⟨(0x2d638d607 / 0x1d1a94a200),1,3⟩,⟨(0x2d638d607 / 0x1d1a94a200),3, -1⟩,⟨(0x2d638d607 / 0x1d1a94a200),3,1⟩] noncomputable def fullSixteen_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_38_base compact_fullSixteen_pair_38_hinges x y def compact_fullSixteen_pair_38_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullSixteen_pair_38_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_38_base compact_fullSixteen_pair_38_hinges 0 compact_fullSixteen_pair_38_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_38_representation (x y:ℝ) : fullSixteen_pair_38 x y = CompactPair.expressionEval compact_fullSixteen_pair_38_base compact_fullSixteen_pair_38_hinges x y:=by rfl private def zz1189:"s04a5"="s04a5":=by decide+kernel theorem fullSixteen_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_38 x y:=by rw [compact_fullSixteen_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_38_check hy (by simpa using hx) def compact_fullSixteen_pair_39_base:CompactPair.Quadratic:=⟨(-0x1987ff863f / 0xe8d4a5100),(-0x3768044ee2255 / 0x470de4df82000),(-0x2d638d607 / 0x2e90edd00)⟩ def compact_fullSixteen_pair_39_hinges:List CompactPair.Hinge:=[⟨(-0x2d638d607 / 0x1d1a94a200),1, -3⟩,⟨(0x2d638d607 / 0x1d1a94a200),1,3⟩,⟨(0x2d638d607 / 0x1d1a94a200),3, -1⟩,⟨(0x2d638d607 / 0x1d1a94a200),3,1⟩] noncomputable def fullSixteen_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_fullSixteen_pair_39_base compact_fullSixteen_pair_39_hinges x y def compact_fullSixteen_pair_39_cuts:List ℚ:=[(1 / 3),3] theorem compact_fullSixteen_pair_39_check : CompactPair.expressionCheckPSD compact_fullSixteen_pair_39_base compact_fullSixteen_pair_39_hinges 0 compact_fullSixteen_pair_39_cuts = true := by decide +kernel theorem compact_fullSixteen_pair_39_representation (x y:ℝ) : fullSixteen_pair_39 x y = CompactPair.expressionEval compact_fullSixteen_pair_39_base compact_fullSixteen_pair_39_hinges x y:=by rfl theorem fullSixteen_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ fullSixteen_pair_39 x y:=by rw [compact_fullSixteen_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_fullSixteen_pair_39_check hy (by simpa using hx) end Green24Proof.LocalFullSixteenPairs private def zz2330:"s091a"="s091a":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l17 l22 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l42 l43 l45 l46 l5 l51 l54 l55 l57 l58 l6 l60 l61 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1f99c6240, -0x337cede60, -0x4d3b6502a,0x5ffdf04e], ![-0x337cede60, -0x97ac49f7c,0xbf6f2c86,0x3308b39ec], ![-0x4d3b6502a,0xbf6f2c86, -0x14eac0c434,0x337cee7c0], ![0x5ffdf04e,0x3308b39ec,0x337cee7c0, -0x19be77188]] noncomputable def hinges:Hinges:=[(-0xeb1ec0,l6),(-0x101e0a7c,l5),(0x19011f2ac,l4),(-0x126713fb,l9),(-0xd9bb09c4,l8),(-0x21f81c6,l11),(0x408306de,l10),(0x36f46b566,l14),(-0xfb8f8da0,l17),(0xb081d748,l23),(0x1ae9683,l22),(-0x19be77188,l27),(0x19be77188,l29),(-0x36f46b566,l25),(0xb081d748,l31),(0xe47efa30,l30),(0x19be77188,l33),(-0x408306de,l38),(-0x19be77188,l35),(0xd9bb09c4,l36),(0x19be77188,l37),(-0x19011f2ac,l34),(-0xe47efa30,l43),(-0x1ae9683,l42),(0x50d65a3a,l46),(0x35d2d06,l45),(0x19be77188,l51),(0x21f81c6,l55),(0x101e0a7c,l54),(-0xb081d748,l57),(-0x35d2d06,l58),(0x126713fb,l61),(0xeb1ec0,l60),(-0xb081d748,l63),(0xfb8f8da0,l62),(-0x50d65a3a,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x19be77188,l27),(0x19be77188,l29),(0x19be77188,l33),(-0x19be77188,l35),(0x19be77188,l37),(0x19be77188,l51),(0x36f46b566,l14),(-0x36f46b566,l25),(0xb081d748,l23),(0xb081d748,l31),(-0xb081d748,l57),(-0xb081d748,l63),(-0xfb8f8da0,l17),(0xfb8f8da0,l62),(0xe47efa30,l30),(-0xe47efa30,l43),(-0xd9bb09c4,l8),(0xd9bb09c4,l36),(0x19011f2ac,l4),(-0x19011f2ac,l34),(0x50d65a3a,l46),(-0x50d65a3a,l64),(0x408306de,l10),(-0x408306de,l38),(-0x126713fb,l9),(0x126713fb,l61),(-0x101e0a7c,l5),(0x101e0a7c,l54),(-0x21f81c6,l11),(0x21f81c6,l55),(0x35d2d06,l45),(-0x35d2d06,l58),(0x1ae9683,l22),(-0x1ae9683,l42),(-0xeb1ec0,l6),(0xeb1ec0,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨76, #[0x10844090c030000000000d0503cc02000000000002902c802000000018c2102a4c0400000018611006c8c0500000018612809c8c05000000000000901c8020000000000006c0c801000000000003502480200000000249040d8c030000002424040648c050000002824840930c0500000000188a40d0c0300000000188a40d8c03000000250c850099003000000000012140cc01000000000110901cc020000001c0902802d0030000000114250230c040000000000a05014c020000000094110218c040000000000b05028c02000000000a824088c030000000000001c0c80100000430a011014d004000000000000140c8010000000000009024802000000000a83004cc0300000000ac170218c040000000009824088c03000000000001f01880200000000001340288030000000000025038802000000000002701880200000000000260148020000000000025018802000000000002a014802000000000000540c80100000000000290248020000000000000c0c801000000000000440c80100000000000b002c803000000361084804d0030000000001b09014c0200000000000b404c8030000000011854028c03000005409c1401b5004000004d0841200c900400000001242100c8c04000000000130b018c02000000000130a014c02000004d08c1200c90040000000001309018c0200000000000130148020000056090160275004001420a404200335006001440a1044006350060000a60a209804b5005000005c0a01c01750040000000000098024803000000000000e014802000000000110b018c0200000000000700248030000000000012014802,0x740d02101e1004000003c0841400f1004000007c0f02101e1004000003c0841a027100400000000000090188020000000008828030c0300000001bc130368c04000000001a838034c030000cf1540840aa900500000001941300e8c04000000000000340c8010000cf09408c01d100504211c2062c03755007000001c119301e90c06000000001c8c40d8c0300000001845101b0c0400000001f190901d0020000ec18214c03bd005000007c1842401fd00400000000188a4050c0300000000248e4090c0300000760d02800ed00400000000208e40d8c03000000018c5702a0c0400000001845501a0c040000000000002c0c8010000c315e0a0094100500000018e29c0930c0500000018a2940930c050000000144310120c0400000019a2740c70c050000001822340938c0500000018622c0670c05000000000110d038c020000000001d0b01cc020001432441040929005000000020833029cc040000018115301e90c060018115309201ed900600187159092030d900600000001444101b0c04000000000120601cc0200014f19e28c03c50050000000014884050c0300000000208c4090c030000000001906018c020000000000019018802000000000150502cc020000000000f0901cc02000000000000d01c802000000014c4702a0c04000005311c1402b100400000001444501a0c04000000000000240c801000005311412021900400000014e21c0930c0500000014a2140930c05000000210c8300590030000ac10a1140e61005000000014c1d02fcc040000ac1021040a6100500000015808809bcc050000000014824054c03000000000000601c802,0x250503cc020000000001916018c02000000000001501880205892830e700bb7d0070000000000110160804000000000015006080400016328438c064d00505a428c0e440af7d007000000001187803cc030000000001505018c02000000000017402c803000000000002d02c8020000000000b8004c804000000000211d028c02000000002b8a404cc030000000000194028803000000000003301880200000000000320148020000000000031018802000000000003102c802000000000003601480200000000309040f4c03061b2cc02240f3c500706092c4020c09dc5007000000000003f018802000000000003d0188020000000000008c0c80100000000349240f4c0300000002cc7301e0c0400000002c4710160c040000000002521028c020000000000005c0c801000000000002d02480200000000108440ccc030000000000009034802000000000260e03cc020000000000031038802000000002686806cc0300000000000dc02c80300000000000d404c8030014810c0c8007850060000c608c0ac03c900500000000000050188020000c814413802c50050321142042c03755007001451180c5029850060000000001306014c02001411120c101c85006000004c0c4170321004000004c0c4170121004000005210c32032d004000004c0c41f01210040029d19d14601485006000000000291901cc0200000a61985200ed0040000014111301e90c060014111309201ed900600000001043301a0c0400147119092030d900600000000148840d8c0300000019098280990030000000008824058c0300000019090240590030014a10f0ca01185006,0x3d02c80200000001c4660168c04000000000003a014802000000003a08404cc03000000000000740c8010000000000039024802000000003b88404cc03000000001484c0dcc03000000001c848054c030000000000021038802000000000001201c80200000000118280fcc0300000000118640dcc03002011c108401689006000000000150503cc02001cf146042039d1006000000000150902cc02000007114c1102750040000002b108240fd003000006114c220221004000000000001101c8020000000150f050390020000000032868070c0300000003243200d0c04000000000170e038c02000000000001d0388020000000003511038c020000000003711038c020000000000004c0c801000000000002101880200000001143700a0c0400000001043300a0c040000000000023018802000000000000e01c802002492060c302281006000000000001a01c802002432020c1016810060000000001506018c020000000001513034c020000000001105018c02000000000150903cc0200000000d09050350020000000001a09034c020001211c21080abd0050018f104042035c10060000c310808808e10050018311404a031c100604892030a700bb7d007000000000003502c802000000001182c054c03000000000110f034c020000000003106038c020000000000906034c0200000031090340c90030000000003306038c020000000244510160c04000000000001601480200000003046401a4c040000000002207034c020000000002d1503cc02000000000001502c802000000000311103cc0200000003044101a4c040000000384610258c04,0x25230e01d0020000000020844054c03000000000000a01c80200000018e0b80364c0500013420c19c0125005000009d2303e01250040000000018828074c03000000190a83009900300000521182202e5004000000000150901cc0200000001444501b0c040000000000e0903cc020000001461980d64c0500000001042201fcc04000000000120d03cc020000000000121c0cc01000000000210903cc02000000000000902c8020000000001607034c02000000000002102c80200000000001a140cc0100000001a0a0502d002000000350902404d00300000510c41800e50040000000000907028c0200000000000050248020000000000003c0c80100000000000fc02c80300000000000f404c8030000c214620803c5005000000010c1d02fcc0400000011808809bcc050000000000d09028c020000000010824054c0300000001cc4102a4c040018514d04c024d90060000001c621006c8c050000001c622809c8c050018714b04602491006000000000360601cc02000000036c120058c040000000003506018c020000003620880098c05000000000110903cc0200000009208c0440c05000000000001601c802000000014829007cc040000000860840440c0500000000cc210220c04000000001887003cc030000000001d0903cc02000000000006c03480300000000188a40b4c03000000000019402c803000000000001902c8020000000190230224c040000000000c8004c80400000000001b4028803000000000350e02cc02000000003686402cc0300000000000350388020000000000037018802000000036031004cc040000000000035018802,0x310701cc0200000831cc44032900404a81c106f804bc5007000000000260902cc020000001c6264046cc0504b61c7077c043c500700000000289240d8c0300000001845301a0c040000c3152120094100500000001842201fcc040018610f0cf00e890060000000018848054c030000019314101e90c060001090d410c0755005000007908c1301f90040000cc10215c02610050000001480a003e4c05028c0ce84740510900700000760c42102e500402980cc846401d09007000000000c844058c0300000520cc2300ed00400000014e0b80364c050000000014828074c03002851920910209d006000000018c4d02fcc0400000a21bc2c017500400000019820809bcc050000000018884054c03000002011d301e90c0600000001c44201fcc04000009614c1801ed004000000001586c094c0300012f0920a4055100500000911581500ed00400012720e3540f6d00500000002141300e8c04000000000160a01cc02000009614c1301ed004000000000016140cc01000000001c888054c0300000049208d80d900300000a319817022d0040001212023300649005002091a705102dad00600000a618413016d0040024520518f0216d00600000001c42201fcc04000000002586c094c03000000002608c044c03000001d318101e90c060000000018868054c030000000025890044c030000004f2186802d0030000001880a003e4c05000009e21834016500400000912303802a5004000000000230e014c02000000020c2d02fcc040000004c2186802d0030000004d2307004d00300000021810809bcc05000000186164046cc0500013720c19002a5005,0x2d038802000000000002f018802000000000002e014802000000411d8c80990030000000001d19028c0200000760941d03310040000f208a0b4063100500000000d02500e4c04000000000068004c8040000000019894028c03000000001608404cc0300000001a44100c8c040000000001b13018c020000000001b12014c020000000001b11018c02000000000001b014802000000014848004cc04000000001609c04cc030000000001611014c0200000000000b002480300000000000d802480300000001a8110050c04000000000190901cc02000000001902c070c03000000001b024030c03000000001a024028c030000000019024030c030000001a01040098c050000000001a09018c02000000001b84402cc0300000000000390388020000003426040930c0500000000309640d8c030000003025840648c0500000049228700990030000000000221c0cc010000000030964098c030000001c210c0d48c05000000014c3202f0c040000000144320160c040000001461b80be0c050000000010844058c03000000391b8380510030000000001916014c020000000184550218c040000000001917028c0200000000188b4088c03000006116013014d0040000000000015024802000000001a0b404cc0300000000188ac088c03000000019c5b0218c040000000002d06018c02000000000290d02cc02000000000170501cc02000000000001501c802000000000002d01880200016424c20c0bed00500014420638c07490050000000018884058c0300010f0920a4055100500000001d41300e8c0400000002c853029cc04000000000110902cc02,0x730c41303e100400000001509050350020000000002a09034c0200000024210c0d48c05002831c30c102a450060001471ce20c0dc100500016228618409290050001612821100c4900500000a31cc3102f9004000000000002201c802002831c30c1019a900600000000190a80b4c03000000001882c0fcc03000009b20c1102690040000000002506018c0200000002e44200d0c040502241843408da90070001412420900c49005000000000210d02cc020020c1c30ca021810060000003b1708c09d003001c314d10300b8d00600000912046303710040020e1c511002bf900600000049208a80d90038221c5441e020df100800000000118240dcc0300000000000f002c80300000651183501250040018710c0c700bb500604021830a2c0818500700000000148840b4c03000000000001102c8020000000001a0903cc02002472071c3025910060000000024904098c0300000912143203310040000000000222c0cc01000004a0d826017d0040000000000f07018c02000000000a82c074c03000000186264046cc05000000000120f01cc0200000811c463032d0040000000014884058c030000e110210c05d900500000610c41302ed0040000001461e4046cc05000007118453032d0040000000010864058c03001840c404c00b85006000006111831023d00400000621183201e5004001850c504f016850060000a30ec10c0a2d005000000000000d024802000000000110f014c02000000000000f0148020000000138110058c04000000250982402d00300000000000780248030000000000031024802000000000000640c8010000000000174028803,0x4201480200000710d4110161004000000000000840c80100000079309240950030000111384b10325004000000000004d038802003832c204102161006000000000004502c802000000001c8640ccc03000000000000d0348020000101344a1027d0040000000244310160c040034328304101aad00600000000000410248020001481d018c0dc50050000000001509018c020001a32c450c0a2d00500000f130491027d00400000030238c0ab8c0500000000288ac0fcc0300000028228c0754c050000000204210160c040030324304101aad0060000000002a0701cc0200000002849602bcc0400000000208e40b4c03000000000001d02c80200000e12c481027d00400000051090340c900300000b32708302ad004], #[![4, 0, 21, -6],![8, 0, -21, 2],![-1, 0, 1, 0],![-1, 0, -25, 4],![30, 0, -29, 3],![39, 0, -25, 4]]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((0x3070551430d98180f3de844c0532bae11c302002d453914102837daf9e0446a4b8000098508402183810452e71c2001a633f16201759755181877022a3980cfdc73df98005a66bd0120130d2da520ce20400100fa010000b9121d1590e0ac86c264200b02805f8ac297f3f20088b00c507825ee9f048a001592fac081621c8c0a92860f0040868264180b88880df82aa886aee9f86e8847496ac56883687d7376b204100040864174513297cfdf8992000075f5f5050858f3ba928104d8fad85130817fd3165e9831c6dd8cbe080000002010338212804288013fd42bc0249000006dc20411ea7cb62d4d5144d9150e3828282406356402040d4a0ceade208055a3e1cece040000025801008840425b20c24009c06124800001cf0a7089004ef253e9541044156588db00e2080a8c678ea709c0800000278d004021ea0332c984240014e498c6458280007279a63ba02000f353222ba19512005c0600002352000882668819a9666bbc38f910d8d7372a83029fff3170280a00b142a77aa811c508108b2c6020bb4720fee0208b6051d00341000001a91757e0e000a809104000003372f101c1528d60f5038fbfe709b08d0c30c9f661195a2083e530f8798404024ce64044980111b74d79c3400000008ca00e00d12c32adb2d2400a408000040848601400081a40027fcc4f1373c60028bcaf57bf070cc42c1c82810052e9c944291b8f54c78232dc91981060a220164e003e01021701c9001c8b55696030d2115175999d314220bffb2482210005a092c782c202dcc020c881041b9d1c45a853049a8e40c000020000029c9460902000ac0a1c700000525181e3029163e085061aa95dc760da80408d363277834200c7e50ce60410806c62260d50000000546009801ed44c64301800d69801b0c4848014810000080c80020010a50910b0280016a480086492151181308c85007c15c7968b23040797f8da0084c59a2208042e8e6c248103c01021301d16825b07ac1846a8fed3348110ffc0f6a20955a0937c24082100871f83760322506230eaa1f53144979d1ec485036cb2700c14300d4f505023772bb1b2600220084d30d1e65fdb134039da6f7e820800000db84141ccb0225ce14070676c6bda070639bba2fd950038cbc323c0d00000004b001c017ff7c13830900260180000f41e3f03394920a0c4bd3e0dc2628ea244f6a90a06c5b7a918284bae27baa0468d4a7b798080aca65481000000caa25000440109a6a75efef932038f854a92ee20800003529fa8196fb84968498645d09c020180a744771232083e26c506662600ba794efb66800000048a85d9002601c0000f490003942000dcc4001f6490906e230748efb3346062316ec30618e4a8d46067bcb1d1212060f804084407d3c231db4c4541fb1d39a7cb235c47c799913866e28d8bbb7198ffabd99d9858f4886290e70a28a306784384304a02080864300401bc28804c8d650a2b1025fe9a0c1f84baef501e101b47efe51a1007d21cff8e1032465f788c1017493e622800804cb26124017acfbac6019218480200001d92000740400129087e8c83ec341f412000de9241a3200205f23e84b09b0d83a84effef827000000237398936b04deb03723d824382ca19362b02c8e0ca0cd04c04104d00b01861a934074ecf64b389ff2ae38e049a24275ae0aac8c3cd745c61a852a4200b0280190780e43803d679c8445168c7d83680a00b2ae7f4b14149eff058a2d64ce82fa4440e45ad50810000b055e412708230084900013069dc60c052c3de34b18024575310c34d4ed83064850b142ca2298211708317d2040f32201693821180426880de5a87e347051c1f21a38f33bb2f0394186eab39d6a80870a0079f04000004a49730011804269ba9639430e921c6cf249b6dc20800001914d5243362f5840f7061f378625c5693083246664fca98000e6ae03c214000000112380600cf029544e2bf2005204800020620006ba4001394c4f0c1a1d13d1146af16133145dadd1d6e11100e4d24d42c107556f86470001d62500498208802124018a1bf99186c9cdb2a212141cce36d0302038c7d29130437319ce94810bab8c7e89810880213440e3a1aca4c72fbe9f640d1c026d692f1c7fbbf80c814194cf581f9343097ce0db8100000464ca9c008802134cb07348fd934800000d7b943c9bf6069d131fca2f9088c410000052518d0c8ffd2f40070fedfe0b2b1408c4c91a4205000000070825200480280001d520006a8400129c8002fe10bb0d85d06e4387f9f2a8f405021b7276450a1419104bc5160173f1cd14100a697eb71c206ed1eb3e84c184601090e63b92c5234050a3c698ea685830a54b5a4796dc28bd1fbbce6fd83840c243f165d830419149d9be5e70200369c320d62021fbccd7c0a618002060b51644041d4861601800008a890704e2350c2e6c8884885640fb1630a21cd97992b24822159dfa238c08000009f782820457b38af9200a313d3bd020094f1244ca800000dde9006d0284c0300001e62000b3a60835e37e68d1068e00000249f00f12ebca6162b01c200000229b603832d9c4c48f2838425f51411944309c0398424cc0415df564407fe0003e840e1581600007c09068a800522085) <<< 16000) + 0x814826c7415e320ae15056828005d608759ce880452935e20161a10eb4c10430063fdc2046284201020c05e14ae5709486199f3a818a0472d10c0a2158bde5ba10000438da084a203c010b860fa0111010404c326dc0834177e2bc1801e766b9a5010800113380b0be1de796103847e8e4b3f5d0f2c1bdb0af7f7f12285a8622093a50a2a6587529ea42151800000584cb20a14851eba2068409153faed2585b9c51428e5a85c6c9a7de2400c010133822354d12f62848a0b6718ddd4780a2a6b517eb2ffd0489030414c6c57a8a244b81e71be2af4850b8e12f0dc8a8a14668dbb24a19f1452ded8e48308c13004b5c9cc1cc8487242400c81200004c0400131cc101dd6826c482c04faa4c083737c9d78180459dfd6e48084001099c0542c4542ce40e1210b18fbb89e58384f5b435152285a5b8ec766651533cf6986e7a5460000016132c94290c25a666d749153e1c7c5d7c028a14f8f0d72b89f7c801681a2670444006e418612282d80014b6f405153744c7f02ad0489030c5481ecf1144893cae91c5b152142e2be0d03f0450a338f45e0ab351452dedcad55af8260096b4f7969d721c9120062088000256200093e4001634dc307bd97790410a430d5a01067f9527ac1801e685cd39000840213340ad867a1b9148d0959ff9dcf0cf341eec6f46394449153cde4979a09269a8ca13931c4440e86387d3640910894a7d0884410439c4acee930120882b7ff1e1769cf2400b80e000047064102460c83120c49d23f8820b5c190ef0601014c0d348004001099a057ade0122b48d0926abf4d981e684098c7999a112454f37925e684934d80f95db184440e86387d36412211294fa11088410e712b3ba4c0904415bff8f0bb9cf4801681a00008b880018d920b0900033a10011ec38521f6171030c46249ef061f7df1224a04972bda5a21020c31fa782bc1b3298400052375ece083c01081828090431a599b8ea8c209bf9afe72012e7e47d0a8222810b58201fe900ef3000f00420601006f574bc74b2c17165719b64678e231b3816db9e1c780dd36095ad49e205804172bd4c0d0884062530a3045840aff7f27424c0822d92f91d76cb9800145ae36c6a134bb6400c41000004aa4000e38905048098164120a000531200309c482047a48074c344830ce976368880524d2564c102e4d7ea658a00039af36d094308402040e032060179603706c1e8a2a64ba3680908dcd65d410c2439f92e5698600ff1e23a8101eb5b136100045a08cc33821100420601168c22230d0664f851262a37848f8638b524a43f2a820000005e81800228ae94820029269ab33801100422580ae84479e42058ae35711c371a58148bf96eff1e38b6b0db91fa0e3c80219a7446202074be0fc1aa1e104dd408172b0e1261385212a204105b45fa817f4e7c801601800008908001d190260510282fcb02bd4d4b0c28645036112123b34989430984cc0f8950206b943409e08532f3dac2000257d53084e184201091c07d17091248101f3a3daa3c786f314c91ece68f8d690815787a2214001f2126b86002c0407da7002100869a0f90d3ffe7c44907baff3e429124eeada399e1911201e3ee2050ca88e7d29fb3cace3c44624b741be99a2150215b4d8f441053c6b0836b47000f7600e2952c484801681a00008b4c8e05526dd2aa3c8a74efbc91f05e3029290815787a225411fdf3c0da2081205be705001183b3833801080434d07d61f78434222483bff396aed189275ac8dabc9b788900e997ab7fa374473ca70bd6f7751e221f9e52604344d10a2ce52f3889e20828942444d646380077fe856cd635f2e2400c41100004aa4000f34c4d03e7907b90389cb9aa6d41a3b34989640d76b1b2734430a65e7b60800125397602001477b9333801080430c073d5d56bdcc4080782f54cc196208d6cbe083a1a4407074c6a19e2c74063c92f603a52238343df61369bc1303298886af32370c313320032741a3400782f6763156be5c9003004000012590c7010001ec1000b8020019fa40049949020c880c340027b8406057c252b4a6fe061311c5633920843cc1fb0046204001020201d9bb47bd2bcbc1b07b01b1776000000000000000000000000070074e7c0527370d3fe47754ad0ca6aa75bd0558d4098e7a640328a221e21c21619610612200402018140100680011610ab1901c0480dc1413a0200035d23e83b1f30983a82fc200415bd4505cd0ba3acce1ca7b30200000568470090400571d79f5d0415308c1c882405027322f58d519400409c40c505c0780ae091008483241415a020001f224004a01c0500199f9c1c04fa7118e108755bd98c0ca6a901dcc06603f9f2000050a950b82508200086061cbef0e680212955d3a602c45e5596582097f97828802c7df706081249e2bca13041000400004b48ff82e0000200804a01f015ce292220832008000047381bdf5f6d2105d1c95a41000a3981003803080425048103c0100000cd20500200019623fc2b1f4118fe86832c363f81307505c03008be7da961033159e64c0456d95dd25820ef66441041c1601fad1601c18acc203007e6a9c3ca085c70840103f6131fa01c060b327c75fc9f93947b9a063dcbdabb8139fd22b0851e20381b9ffda9da86b4fbd2896a20598cac7d478492589102f310c9f1c3d1aa530c4970e70f0257d9aa906d762209b6fcb963cb1960e6171840ddc51a867ce5ac90e91c0017b1aba132cf3a862db83a9dd777d449dc41e36b974ad13303ddaa6c99db43d4872873a15f9204549103850855b52992200cdf)) <<< 16000) + 0x4e00412da84149c2801b69dff508004edbc0a04a104201000010621b21b0d809f8a7214bad8d11cac74350810ad641640811be4562c401a7ca10503031b67455a0130a0f80400004b4e8efd62b329a1d48c0ce200110c0f00400002048fc8880a014000f0447e07400128c43acb7008010040fb84c7d8263ea03f0e08984c6882e01e04a0400f75d3a211860e80430735d14fa9c251c66e7cb0a982e7704015d8bad90240c1d00800006590de090000ce91f40d8f980c1d40704b29646538deb9f6b407013661b1ca6b201a26902f880cbd3c91568840f19e89a5be01beb62c4306acc7ce3c11fba6362ec07fa06d0458152e7f00e8a14266d1ceeef3364efb077867f091082bb1f05cef521b264d6d808a07f406e0f3706351bbe1b30854e803549e84e06d0a8884d9afbb8ef6766724aa7f53d37866365f1a98c21fc000ebf85f48f0df8ee68a5a11a594c9694eb725882e5505cd11b83bd7a02b556120aa10f3adb494707b65a5005954a7d5951909ad9cddd3532823cf760d72ea49ce3da7b25814bc275df124190efc335da6dcda325554dc00036f11f2150f88480701400132047a4e43b8421e71d0c4068006008f0a317c038c4efca63d8b72184dd51a2ae93c1a13018f1cd2b1455cb295025ce12004dbb1ac1fcd5d7e0572225f98e37c39625735608da5e0d6f88f69ca3610c320075f689984479b7e30c3b96df6e7ac752dd01613c664fca5b762abcace59ed6380210183cdf7b974bad77fec6dc85b35d42a33f0fa819ab69a0b46f4d5c99831400418b3066854bcbc071a3cc6caf66f8405d2247bea90ef4282ffdcb74a8e81848013bd63061852905fa9c08a32ad3460a601b720e0e307d7501f1ca6084f13c1a25f1ba6aef7ef1a8ee7f4807eddeb5f8f8d36f9a190ccc365f63d89113dcd801ea0a1d40100039e11d349e0903e75234fed0e0359fe19c07cff3337ac75bbf1b98313b70a8039530349710090468f50e681fdb206f49d8e8c6c156d9e867c22a741ce1641c4d9687ae331404132dcb5d158f60972b48137014e5ed82e07fbaa7fcefedb85cb03e73b55a2014387c5cac5b66ed35d26be075692b5da6d012e4e35865e3d061049fc1c94c500144141565c808e2277ebe4f05a278ab64a4259846d8ac5cc5a565cd8dd29f7613112b5595d2528a01849f7332cbe33a92d0efc2e1bde39c618c312d3899bc8013049d3437c57cdf0934de52479dbf1b449665d4bc3b26fc154c909153ccd40000dfc7c3a13774c000000001bf46d63100e51bae6284a248a4087026025824002000000020060b00401b2280000082605835a83f8b295ad492109120600180fccae3a70d645d8511381404a16ddec88b080160800002e33bdfab1dceb134b8c4a296411b6802005b8b9cc76a0ddf5005ccd0c3731a127ec9bf015a3e1b49f9dd720ab0077a17246d299350fc05b60efa78c84b643e5300d3b7a561558a5ac54dc3712d33d5df223034a9202bd8031c941d40df0486f4243e00a18701000249191486cb1882c16017c9c0801614da84100c4f6ce640090507802120794d170110c180044020040103de0a00003723dc120000b123d2321ed150ee06879c343d8121880500010e9e18797f8aec8837fbfc7054185987f889d66fbaef6c8625cf621709ce25b3b3f2c0f3a0b4aa43d08f301ff52197aacff73dcc8f211e1f2b4f484a3e3968cf7d92380129df5bace7263ce394e58c28d7bd8d446d00ba81e369c4321852318731f700000465951e5166bee9c501452fe04b6936a59794c85f5ce292596c071482daa150434fa8670f47b687dea8efe1f1057c34b59f6ad277ec7650546ab98cc3dcd903a80200052423a66398c66406e529960dc777dc4abffbe978101f30ee158c4a799f8141b46ddb12a5ced553b0312067bc27c8c8bde000000000000000000092c3600224d0d5c492d816840c30428020000098677619d201d9e7c98298aa33f6623f7a949c9d98f25a9c991df78dacdbdf8b0400354228bcf0112f91ee39d96e3cfddef714db011dfc8fabf0282047a2377bd384f756c49ffba01a6eb6da56b38820702d44db7e42041aecb09061c48e555087a08735000568207a6a1eb29013128198843d42201a0d0009b9901e0dd152b0531f4c1bc547444cb20913c282000000a5fbf44d02367cedccac0c044f03d3ebf9b226c1aa86fc9f2e2c1458f94522477ae6b1a7993f8bfc8005cbf6b86aec83bf8f498e513f9000df234fea9eaf78b2934b934b6f9010e322c00a7ebaef35c6371b61e200d475b395c56476f2f198a1a84a182c1a31e4a02f12619b0e6d9902800f3e4185f7d6de22a3150a2c4b056439d291e080892171c0808931b2542c150486e51d180b8889d539ad04f5ac70a8e1608000015101438b4ab27cdc22a80df9e4503ee37fccd8a1a844c1426b9db96023142c0700000c6cc012b1a9ca8042203c0108060080201980400006e47a4543d02a1dc0d0f3868798243100a00012337ff7f9780000000010c540ef76412e67d3c1229a0e800001c5c71228f402a46825823826805805008aa0932bb8be0e0ab033b06d9945528d6916913d8b15035ba08b2ce4f2bed00c5762f9000db267998b11fe2cf4793d097bef8ced54e5d38bff9c410a658366098e2ea9188350fe583d00d18468cdea4213f5a2329a0a8b0b2a443dafac8a77f9008e081dc9829be08b2ddfed5ec7e822bf9050e34e128111aa2d6b385613abccbb5090ab1b008aa08aa0cb109a7e5e81d55641d983460df87416db9038d733c6507755b5732a97c4d57410f5fc77)) <<< 16000) + 0x65d0148e377ccab56fa84065195e1e660428a6d6d0981774e19508273632d1a3e40002dd10007d53402a3bd79283eaaaeac34785b7be63901e7a265cfd9b60dcff92c070160f9a1abd90c1430bbdf2d11f87dafb09989243f4403002bcc45cb594b20df59eadc275eeb05a8d38b8cbf76d29de7fb97835e3b61bc1f82c214e132951fd8e98cb38eef135d8e588001e38a92473a98039d3f8415f790e875b0ee95b30946d4a277604d35e0a5763b1cb9d8f959f86036f92d460b9e569d2c2a000018d9f2de88bdc153f6e03846d1c9684a1489037c44b653f5ab3bab16088d9139d771523f8335faa66f751580e90bd477901228bde6d8246bfcfee00c53d88b4a7b4cc28a7a3fa9b848ce95de42d1f957264482604e763d0b8284f9df609b1b1db180514d6c8cdd268b867aae3d8e4de07494d5581254a5125a6b7dc89b5ca98fe65e68a6d8f95e90b76686d4d0cd558cc61967039e0a000975239c6bf3bea0521f4b900cea173245b122ff252c7bde8614049d585d03d80000000000000000002427d667df361903ef5d4b3132384cadd90974a600c042889e78fa0000000000000000008a934357124b60598e29008800600008f46f5777c5a153222cc24f393ddef6f3809a66ea8e1672fb72e972eaedadb85b2574dda88338b446d40030a742dec73e0f1f9bd9795dc790d5125cb5c72024f9a37787a73421ca8c7582d2500dc9d98be99b999377cf75a883c971735215137143705bddac90e59fe59e120ab3dee4324a7c89b4a33722289ba0d62ecdc99e391948e95357831e301670f03d0ea1bcf3c05245cb25f318ff611d516969d11fdcf10e43d484a68003f891e53d0f21c878cb4398521cb250f10a849044246020022673851fca99824a1f100039f4386b017a2f13c218782baf9e081c37ff84a003ac6818a013081080430a37e6dcf1143de7232c0c70d7594559c68404bc6bc73406f277ec58e0017037e5c026102100800009b91e10de1463a7b1e7670a1ed4fd1d407c9a1801e1ce1ca31c359113ae78fe684ca2d656cf28c085071be6b639600184450aae62800a0da72184807d080c2b02c794616fea74e50fc41b679a46862938bd90c38710ee7baa0685002e4769a60421f966f8810201b7ed4827801414450e83801c57ba052052430900500003b44780443be1200040723122318801e940e234cd5287bcd9d60a161069f39034a0857b31f64183cb015dad2800b61af3184c1042010f281b2581412875793c9dacb0839d99a51282027a1fbac306f835bf463402e122c67c26082200800009c91de05d0fa6ed3f771c415ba8f9f040cf7cfa894a00234988ca0481842010a1f2e655c2c48e030a8e0b1c417bc0b3f040edfa17908d0082a910ce3801a6e1f620260c2100800009a900022b23ba2a1dc090ed84876814000a6c4764763ac1b0f505e0e3b657b90441cf3eb7e562f9f36bae5d50c80d561c54f123c6e3cea1c4c129f48a6e6da11b5dd5eb790a75453627e617f9fc3e4d239e3af990019a62eb4f3de50926e879164b8bf29667da9987f1c6ec8cb2766a18700a053b40972c42df11e53ed1f9da7e91b098f18a536f1159ad5215200003353852fe2bab74dfdc80bef43fac3aeffaf7a7d44e6210e54baba40eba7a33b2d90fc9d6bcd93e65b272dc805e21ea58496f32186c972075004000ae4474cd63b023bffbe50a424b6a5bc1894bf5810632a4081a402f289fdc0e0000000037a843f666a564c72d08ccb1891881860c8044000000401f6b1406f59989163d152640552e03b0aa947a4a50effbb14badda4c20e2e2c6e921c64160cbed902988aa0005de475d0604c53d20228b19ee51049bd1e3c205eb1860e28618d377aad0504664f527a6804a935ad72806234f9b4000804e5042010d204fd30d4840be3bdf8d70000088a08402000011e4758363aa130f505e0e27ec55d81c4e659102e0411073b5c78b0061a8deae3803e24724b14012c95cdc800020131a108040750040002bc474cd79cf28567b7fe4363422698b1df9ffdaf2eeebb03fe3fdce1c2135d7607fc7fb9c384284674485ee8b1802f15b266507040be529960d318cc80d9bdc595d0426e3d07d0b1881860c20840000004018a9cd3f272e3939d7ba33f2712d71d2e477bbf2665aea52eab5c935a20f2dbbcca6b61a8e25a30f6cd2ec9b9f3d644ca082b2f656bf39c1a640979032af4cb2a821477d00048d23a4720662100045c91d10de73ca159edff90d8d089a62c77e7ff6bcbbbaec0ff8ff7387084d75d81ff1fee70e10a11955d47067c5f208c0fdaaea3833daf904607f02573e51de6da202cc71060c30c408c050047288ad5950619dd3ba7f223a31ef4e5f740155c4886241f2f7c097a42a550323a603ec5d90adc21f1289ca0f64b1516eb866ab459793b461629326ce171edfa3ac6f0ab487485afbea804210950f139f3e4f10eade69369677aa486c039a03b394b420eab55d47067c5f208c0fdaaea3833daf904607f0257294cb064c633203e3bbee255ffdf4bc0808c1c710408a04a0060100576698fa6dec0318345efe5ef52589b2889aa5fe4a3015222c5233c589226480d9c4a74214c9e74bb837059aaf6a5ede4fdfd6f192406c48528eac6dea98b2a48ca0007104740561bc13ce7942b3dbff21b1a1134c58efcffed797775d81ff1fee70e109aebb03fe3fdce1c21423394a658326319901f1ddf712affefa5e040ce358635c4acee7ec091e0a99630c19210a11400c00001c095b2f9762f4f8f38dd4ff361d8be373175628c750398ae351d6ff8b7)) <<< 16000) + 0x2ee3bded300151821b90125c4d461f40f53de6ca169c359d97abb6c013a4491707c7f9218d430efa39e0a0004a0239c6ba16c76f89751c51257857485091650e7b71011732527e83013c1a062c0000401095008802000024e4734e4398521cb250e5008003e648e49e80a07439032002e41212a43e153bc36b97a11426ba7d3ca4ba204bf3722e53a8204e2330714510c02e33e2ee6a850105090f3b56f750005f7a6eaa4923c27eafa0642a80dd5b3370f2825b2b6158160000878e044deec9c60f4880a76b900560b50c111c331af9e88300296adee990d8502e97fa36340c0801558b99d297e40145503880b87c935021b3cc26aaa915528a11886a4a9000d3219c0bc0d00004a4471d0438c5a1c5098e202870c05034f4f3da2a81c21172e17474305d6dc4dd5505089eb0a681910009b64c77f81c09a4125f0a0280477dde859511450820b7ad6aca2060b9f99ab6dba41380a2071427f3f6e590346d2125154c7164f9d960a8134a194c7d3a689440000001fa408200000014c285824aca3475590c1183139c7af1c06794492e5d00a32185203881a0000648d8d355a3512051c5b2c34150934b2f8e9feee715f39e872a8d2861bdcc8314000000d8350270c230080000b890180dc0e4b3932bc30e2c918d295aa34a24b84b009ca200000012c0103000000dd70b084ae2b8f3f3413adb8325088042fff03a3c380ebbe71c1f0c904260107168aaf9cbfa7150c6df10d66941036b76048021299322886823a9e0b9664a0848010000113215c121c1050e1028000d548e084fcd44b45f3e234a118d40b953090bffbe3bc1c107ffdb36604109932a478340aa469175120000000032027042400879a002cb28e8c318cea91da1a560012afcb349e81b3bb8261246f4b61cc70430b18eca13021180400004f48e00486fc2437c121bd090c3808000cd0d90ef3299d703232c7c372a2a1282a9438294a3f5fe3a071403cb5d7b4af868005b10acaba740001a1ff6490a1a00004e206203103c0000d611bc218dd86e873616c4d88286ca716d5c02460bffbdd7c184000000320100007dcfcc60c0065b11c940800e77d4aa555410672c240080000c391962de3013d47d6c8eab03384ae29290bd503fe4171b1bc2da568bc259248c50a48a4025802000800839f12bce252bc400d1c42c578474bb5cd00d18dbd14555b7ee7e4d4c99cd1f863a00047463ccfc20dadfce3a3cfabb404361209020e20a18810e09400202a36ecba9ef5c97e0f1b274836b28e0411aa7484beacf0135f76ef7386b1428000e1907b1183d00e470fc541bb71e1c43fa42913c631c3a417dcd89d7183048eb3481060c1036a87255370410ad4dffd30424002eada7ffe2100007fac75df504408a1ec2987a041403cd0885804800023620029aa46e9063725382169e02cb1a2070d7fb5caf891a62e8ceea2285000000a8c0a1231ff97a672447e277052ac80ca177de0eb28284c7a78f34904b5295b1564264309804164d405678362888191bfe3c48cd4798a7aca16a15b45ce94251a428759244c9fd6b4ae0801d64f4c2019c308c0200002e068a03dc290a37848e114fb22bc645157af178da48122509bacdd2d22040f69f78acf848652ef59f64b480d4caa12e4190e129954204ea21412af99472f52b8102b0240001099b203bfeb630c1445b05cb622f208648561bf9050a404331fd009178115d5ee814240ea55e05f24402edff50ac40605dbfd2a586088086610c02524209c051318cc80dca532c1b8eefb8957ff7d2f02031183e281cd02c8b24a20618a14914a1091010030100200d0001493451d6aad6a232247ca0769c875e28a4f8658d90689113e196620e21025a2ac6747de2435ecd6610d0e40601dc2d9738870803b85871a908255f328e5ea5701856048000211205013000598203022a221d7439ddeca1c317eefe83871d4bb828f8289196d1563c8c891180dbcf270c8110ac28371c880cfcf0984a0850884674eaccc2007593c17f91186430a00614430b61691a8f261bdf891f3b72d43bba9cf624048ca85b34187787d62712447dc9106f7d53e89869023ddd717d1a76e0a78080dfd16663f507f727382840e15230b77c7d6eda0400c57467fbf638c46803901a0466a031142300005a0606b44d945dc0814e2436ac66185060c487f5041000fc2c6e22035a37f7628c70d6598daa041403ef5d600b3081300600005f08dc04c6dc04000d5646d88436a421b4190d98c86c864362121b0090638486bc2435c121ad090d60086ac0400268646a956352a31a8458d3a0c698f634a530952583d90c690763462b1a215e10ca5d9ca3a9614471712617a37840c4d6aaa53f6820024eec48a1cf070347c1fce2c3e14063c3b8e0253941015501f1fef8d09e80049b3682067ca942eba8aa63f22000d8ba067ba22970b3e1701a2ca00a8ba9d00cca0301c8be7324f3eec721a2a5400a07683fd18c42b96885b9a0605380b040cc0d4d953ea470ec1aca19b1a57a8acd625701c84f2a0979e069a6935c22b7cfb203800136ae6ae0aaf8fa997f70a05b3b42d3035958ae51c2d83459770b963ac87ecdf1cc010719a43257b3296464baab5c3ed6d87216fc6fe46282c12d07f8e220e6b109a6c62f6625fbc21554c06f37614c64adc0f726714201e5a0350c25b7da53228788ac1bf2d8e48d9decced82cfa4c13f789ab87378bad8484f8b63cb86311bc33f15e3d6f018e891e2068457007b6187c6800304a0ad22041d00868709020599a0848db00460227d7a508e013de6d8848083c0100)) <<< 16000) + 0x000cb300ac401503422caa15640034008d0f1f7a68cd0a94efa20c080ed569c8013d1cc364001c00800006091a0050000af180000802302b4fbdd648012f67c01c0062398b8c0070020000132467c1433c0200010020301bc205edbf2460157df2e50c08c59780d08c30780200700203701000066917905c840c2cc8991600615ccafa00139ee1bd8008118e1100400002e48002eb119d218ce06e0280200802605c0200401033613e2e1f3574a0c116b0cf9c4004ac4427e3001a90f28c090307c0200001a645e41780d7ca6d2108860e80238ba17f287e40e47b02adf1a6a87bf229cdbc6cea097a72438e1c8fa2457612c927d34b7cdd9e44c3e6067a65c804842e17641baa8439c8c774959c09595d99b2ab44d13abe9aa7b502afa9da0541474c0608d1b93a3f30901f400306816f6502e59db31edcbc952b22f90745a7b939aee534f654eb64c15896a517586f6f7e9dfd26947b4a4814491fd9ef3fa1819d58c92fb77eeb911024f70619cee788ec94d747c8b467be0c6ef103d8eff7c0033cac830c7fe7771289f5333abca44826848bb2581bcf54993aa9cc0b68c11bcb8a339dc23ca8929cf505186ad2760001bb08cd068001dac80046011991d0cc08865c4409c1200096639cf28567b7fe4363422698b1df9ffdaf2eeebb03fe3fdce1c2135d7607fc7fb9c38428463989e42c05520bee4a98ea87ed9eedabe6089318cc80dca532c1b8eefb8957ff7d2f020264c577915d02ce0b2864d8ac0b52871c51023000003bfb6491496a135be514c2ed310b88b7fcd9a835b334d9d7f017e994a699db1ea5cb4fff370096ec13a0295bdd3693f10e8bfeb6e5032187360612885cb6cdf8a965654232a795a0fa4f90214e17b5b50b5212ca1080200059d232c631952dd90ae7d39e230859e55ffe4022f3d3a2e58140dabc04200e382831e10095fbf22a8a0a2024c784001000014723287b193398c912c644860943a190198330ac63c3631c1318d018c600ec8078817081c61a7891501c5b0c0386e2c23e49ac831c27769b7d638176548fdc440c13e5dcd00271420008717a74ffb88b092a106e18708d3e52a2ce063c0e011470402665c6802510200080c30080004648758ac62c1630e0be0870ef7238c0800f37388b08bca5410c30639cc3d442053ebec0c110143686d1c00026202000860619043430e08bd618de1612acb383e1c21c59c37c183e1ebf4bc206ce69514a00130e0f80406182400028c4000a688c510c624863101be2f8b0a2ea16188be2da7960844e2bbe0408b4c71d6a202fdbe1e018040f5ed7f000013121000438ae3147922383a2dbfe4e1023d08bf58080336afca48001210100040618240001ea43ac9630e0bb200cfac288c1880b79cccb0c1158fc485044e742d9c304102c82a110245dacea84000098b080021830f817affe8b6f468f246a9ee7282d72170dc34428d5a060acf83ad5c615e53b9590b58ca1ba7bd32bd8edb9d36068a0cd9e49f4fd91bab610c66db45a33d3f86272b0e25aa28182ae39a668b0702604bf40ec2a489d3932bb0c0e2acaaaa00413c229f971634528d954cc5af3a63d0654716ac6f4e4015f6b84319408d834d57a9b99bbf9bc43e666b2145912c0618340009104001788800438917d2d8bd8ec3d43742028a5f1794d54949afc9418fcfcf306aa4001c0758a1a9a9e1d9a83dcb69f30960852c9264be0105c3dc90e08b310358c6947beb1e0060dadddfbee4383269c1192033c02b9b43d7f0f23c2a002e46f8771a975aa0bc790010205464dd1b39a2605c34cbff1d7da6882190976cc08cc744a8101012901131420b05a840205f46c9715002c31098a2002004e603e010d1280067979d3d8584f4d5ab0e075f11be1f951bf302293b6f6515f71c33aec7242317c89a6b0381fd88086017f451c6c5e933441be165c2a588a004254610252fc475a4f0c1607e84cd1dc85f2f0456208648001ab5b0f7bede182f307976e673a2fdb0967380880f1ded004fe9b1c5799332002a52022c851343d81850d0130680010288002c59072390bc1281c4040012004611163063ba13e01a459d219e7497b91c40ccca4de2a2b54a560ca04c42e334e527d5653de3407d56d28a1f62ff9a988a0088bb9d0a8578d92f731801a599da9c549f8f56d4500f330c5edb14b5c1223400142330223e07f5e165f09000530529a297fa7504a0a800018a91823589298f00e74be1dc2801e2357c52402d546c39400008ca08002101c010040c082c60007010010046017d0c82e011101c0040000281b140d73277ce00ae21bfb82023400dcf4008c508002000015e45fc642fc2a018050000cb10001fd22fa4b17c258bd88c5e8361ea0bc180488a52f8fc2ec45771f69918478561948ddf607c405ee209cbaa7739d90ee693c730a8ebb2c14c20dbd2c84a6b2790aa3f5f379d67f7dacaf9c7c35fc6e0163d088c4a0b4c2f67eaf4f746c6072ae4f58abebb98077b74f3ad96e03fdde0be92e76c3af4cabcc8c2ef5e1df5ad0701808a86001b6e1db77f4e0af4528c7089d1149f7983556bdf38c51ffda6095422f73d5ed58605cad157200913dd7d85cbf770d0c248fdf4d84a3b3fa1ec60af481356959824da4efd1c24a0598c94a90e02f21304a09e0ca82a99996084569b50303aa1a0461807178e04c3802a688e60000012960f00400004248391885e0842ee22071010003d6907041d08f2b7f6c5980418afdb10300183c905388002721d1168008000092241100400003f48bb2285d48402e1a1740d00064191735d81906e0)) <<< 16000) + 0x32e1709f946ce7b1ca4d8e48bb593ad6de2bcb7ec1e38ab4ba7f8154e14514bd01a10366ed2714ad90b05a93d55f4751fb7e870402610e26265ce257404054a4f808939774b132158c74aafe48032bcca1ea578bd99e58832e960cbf8943e3f500e38091715209d000003cce8d83f8b9c03a1f862a4f52e93016c04d7bbef6dbd144149eeb633f9191b33aeb4e6a78e614821b26fd83fa35e79782c218dc8d99fc318bacb4b82cb901d1ae2a65181833b44dd63b589d3a75eecd143bab0c5e89f66d1359acffac3df66bf44f845b2ebc0aaea3833e2f904607ed5751c19ed7c82303f812c7fe7671add3aa83f6ae06b19b570358d04298c66406e529960dc777dc4abffbe978102a14e52ae9101674f08c76d311507ec74e69f2c8d711f1e6644e19b8a362eedc663feaf66766163d221a9219009000e0080807aab4c334dbcffe855ca3a40a0fb61e4f2d9b68e1f948ff8c7681d3fcfa208bf8931ec6e0824ee0fa061d76d3ca91ad2eaa4f0ce0cb1844e3d3c4f5bd2bb06ab1ebc932f73591c63efde1eef56b1d8f65fd9d1180ff78350feec30550b5f55ea000c8e45c8861bc13a26451e134745ebc8a4f7b493bb2621872b1fd4f145a73526c91d3a24c7f33842d7dcc9519adacc15eb64a118906b9e1e65dff5afd3a2c16f4736a7a5bb1f0fa97df4bebaae938f4ff5178e0521b8dad41ecac7b5470a3d4ce7926fd5a3f9ec111b9f399bf2e1239baa9c099117cb529c1cfcba8cca5a4ba21f80827e1ccabd004000f460c4da4bf14d35264d682266ddd9eb4fc21bc83dab5cbd09eb20f21b3398261ed2d08f6d7df89f52c278f26266b0b8db0c24e3d82592f5e53e90db373c4b81bd65e1c1eb72756e6dcf3cfd675519aa425200c814000d7645c477240cbbeaa6648725c6bbcf0c08f19305e22822838116d9602a88865ae4804391c08f8a007ef85892802000213a011004000060c8b81ec5bcf42dc6216d250b61085ac542d422169110b4008005970801f37907b2183d00e20e433021004fac60a0d9d6191852ae4a062c8b664ed5d738cc800000000000000000011c7eee68eb73e30a95860e175064e3f35422746015b34ba413995c0000000000000000004622421821c00c0100051557023ac60e1bd069b2227b7c975f92d259df087783e0cf3fdaed4982020ab236f9dac1c9ab9283ec9657ccb9804943931a3c916a510d2d73163df4e79eaebf2ed509d3338efa154eadac4a065fbb8304b4a4bdebc3365bf760330683e8763210ed1a2a2feab6816be5b29d425961634ed403e00294d04e90478e3783ed2066e66ab8001cdeca761248716d2e0240fb7e759687c88d69c86b23245008cf8617e3c6aa497dfaa260f06139be91799c6dc966e91e9929ee5d3e4752ff53d73c8e26089dfffa80d440b9a292a63aa1fa9ece2822085318cc80dca532c1b8eefb8957ff7d2f0204670d09ca5c93d48b03dba2bf954b969188168ac5988281f880000000000000000108cb1c71c80ca00900008472a942b11048e7e1c4ca775eac9864953f83c64fedd040cf83f18bdfb8b3cffe9a813bc4c173216f3eb88a560f65e046f10a635b21bca702c4b45696630ff3836612be361b9a3824b40fe7b1e15cb4e2728c9373fcb3930a25a1f271490ffce2948b1ef457f13ffefa8e91a0774a1745f5469046824928e8b1016c076d6580a78e58a80009060840217ff7c139d1acf6acb3a903a9ffba55865011a6319901b94a658371ddf712affefa5e040a85394aba4405a333d0a8a81f46ce97fa85fad55fe0be1c3a1ecec55bfa76d4000000000000000008470594326c5605a90414212214101a079f7262b39139ca1b930f3ef3a1e68ee1489bff52b2002bb2f019885df2b190483663453caaee099d079e4ea1fa8a2195acd14d3d33c53361d9569a82dffbf2d47b32ace305a691b800facff2d189e832989750005752000ce2459c662cc33165198b20ac58c37318cc80dca532c1b8eefb8957ff7d2f0204667a151503e8d9d2ff50bf5aabfc17c38743d9d8ab7f4eda80000000000000000108e0b2864d8ac0b40831951c1894bf60ea7bc1d7c239e990810c2471cd0cd00a00000ff7fd4a0e9fa4788dedddef9649c9ff743dd9f8c98b067e7d43be8a7150bb85e2477377812c1f62b96f324b82a981f3fe728a22eb129b418e67841b5f096bc72b3182321d12e6bd52929436dd7607fc7fb9c3842aebb03fe3fdce1c21322698b1df9ffdaf2ed9cf28567b7fe43634118a9407f7e1d1acf6acde49b63bcef5dcba7082465e325feddc02dab8ef7df7280b4667a151503e8d9d2ff50bf5aabfc17c38743d9d8ab7f4eda80000000000000000109471cd0c90c80c003ea1a39e70dda4529a69e8d423aa7d126c662e4279b8e8f1778e9d87a873ca7f8bdae464577289c7ce05a856762f9b49934404818b6d8653f95c8658ae322e0921c0faa50c9a7344a9e90eba03a2db68c10f37b60dda8a8ca8dd7a609b81eff6350a62d71a000d3c4588b40d202000be922c26b1602d8af8ec578562ba23066118ab86e333d0a8a81f46ce97fa85fad55fe0be1c3a1ecec55bfa76d40000000000000000084d2012ffefa5e71ddf712b94a658326319901841a95931cb77a843f66000000000f289fdc0e11a1e09801201000e0000014bb53bf4b49af5254087ed7e7c7ddfb8847919a96db5ded2dc0e0f8ffce9aa0701ded02c2006d3fcd6ffa9668f1abd19ca9fe96f2d8730c98dd628433b4acc7174ffc726cfbaaa7a4682dd0eaf8347f901f708d357402e077e3c2585b078cf68001400243)) <<< 16000) + 0x81f0087ffd406a205cd149531d50fd4f67141104298c66406e529960dc777dc4abffbe9781062b64cca0e0816bffbe979c777dc4ae529960c98c66406107944fee07000000001bd421fb3352b26396846a68640658048000006b2d05e5e1e6e11df9dd763c8e9aecd5471af20178223f870a4756c60508729fb45b1ddffe2200deb19fed0ab17b81ef49334338d703800471aa57e25e31f236560242cea355d80ca68725a87d0005172000c364559042a852075290ae00854404001712456ce602e6b81a008020568662b2231580d83302c55c1763846400a03c1fb078ca2000812281f004783235c8b78ba86d2b1e0d70ad2e1b59a95b76e9c73e9cf7a1019d955c95cb1e34f5cd81257ab340ecf7a748e8d6b763bc7bab7313357cf1a52919948099f333c0990ce5e8c11db4c0ae652f023d9e4ab5d2d985b950ad25481f6f3ddd2979436e9563092db90e33048f43113d6832edb23bda9c234bc2f8baf6b4d79b759c10049f9d4e9f174ff10acdf8ab380adc043f94f804660bfd9553b645ee3b577674e75e5108a22e0fce84583818ada65261c94a505590e1ee8e608032d1e2e1ec0004acbfc57cd4d72a6f3feb129ad17165532848dad34801a9e427e6ec7236872a8d183a2b040b4826cc360325840194228e44efa3a427d44935e74377bdd92c1d2b047f8884f5a6c2298f2d602ba12b05a92c02a8f27ed5b45b1504c2a540147f38eabbd004b1e60426b427ce1de5bbb76c37faa7cb25f4218d1194f8ba400027b48ab168554a42a83a075190a9888548342a202000b2522a08a14f210718683dc2429c12000c34229ac30710dc8c3f277f3899f20a2e9f65ef9fb9c36fa4711de1a7c8cd32c0a011865a460f285239adedf59911c37444d17e41a988262cc7cb258f2251457479df5e95a06e7714522fd2fe6b200e72e46b937b1bd71c12cce07b21ae6f387bad0a5c3001694e105fd9742e8e2ae0fbc44f2c02f4126b3c8e5bda6cfc53d1bc79672e33ae5c4ab215ce7c30ecd76e356c95054fab9501cdd1e60c4ae563efef0e5ba34a20927282242c2fe93039c635c587181a9b35d6b26d1bd8a22196a52c0a600c52c07638bafa67a20320c3bc7e785f69423c80423181f0084044455fc3e40153fac5de20110c100040000214d0c171c0243cbe7b78970408e8ef18f1faad4738d516ef5aaee7f076e5874492b0c75ed1a17faa3c49d1201f3393ec31dd8ad926f786a8551920813f1695d7f2fc190c87d4a3dca0dd6569d10e44a965aa445a8ae28280b0f95cee0b4e261406bf203f14a002086c17d0b73dcd3f7976d583808928858d08f5b73b8db25ddac331dc7a5f297c3a5ae80d1dba2cd242138de0b79060c4fd6bc319a9ae8c7a75428cdf6c29974fb4d6c63580011fc30024898776243ece67319653ec6525e8f96cd84129b4e77daef7e0eb1c08715e87e1f5955c1fa816f88f4675681260867389cb811111ba71a4266ec3a15297a7f631797a62bb08ec2f9f41430f6e3d49b38a041e290053eaf777bc69b4694f3ca5b957161b447aa576ca3faa55d2c64c1d6527df3a772831afd69980d4669f67c4de506ba27607b4adf6b9c4d96e52a0b1e1da337435d9c6fb0de16bab593c518edd3340002a348005fb114a250a48e85207428e3a1461d0a28e85107428632142190a08a85005427e2213e1109e8684f0242761213a0509c808004e048022a69fffa80d440b9a2917b6de3325365cd2e084af6f162c4c40b5ffdf4bce3bbee257294cb064c633203080c91860820850010100015539b79bb08439559ccf3d29258cb9ae6680f4f2a42667212b408cdd951b661383f4f40b5ab42bc5f076d6be9998150034993643642c3ed69d691bc106e21b359eb3d5d2b490a00079e40147e080579f9d94d14d73fde318f865fc4fb2fef6ec613f9a6f0dcdad54c00000000000000000000000000000000000000000000000006111431030c118014004050145501042b08d4c66352308637709965340f4ddf12c692b1184c6a670215c624adb772a09017ecc8e0bc2a094c16cc32a92bd61c148ef4688307155ae50005cd3835afed335dc6c772234d2568f29b21b8f0bbb63dc172b407018340012e8805b56100e22138eaa6780079eece0a23e40ac72722cfa1f016d2016a564c72ddea10fd98000000003ca27f7038468486406306184280002b635f84a50b92a931a4387a86ff6846af8f21395210e23824036a8f6e7b5c7f0b0c9c699ae735349f212c8693436fe456771a45659cb794d7e460c51184c2109a7038154a4c1028bd86177a9c50ce3eb4ac3e4bf9b0e3b721c112315f7605b3048d4dbc95cae3242827cf8abdfc9d67a5cce09c455e0543045f97d5ee401cc98733ac956a34d22084986acd633cb92fb9bd8a60868290422b87b4ad3fa75bb646898d1bc5000007b44248d6270530902189b8ec47c5626c2b08d0ddd7607fc7fb9c3842aebb03fe3fdce1c21322698b1df9ffdaf2ed9cf28567b7fe436341197c82303f955d47067b2f904607eaaba8e0cf825fabb404368ef339c688f33f08359a0d1b0208f3db6250c44c0b420524414418218100000ddefd1635fb7f22f3ea5dae16574a510f7bc963b38b4766506d3ee6a25c91fff3b8549a3601edd38bdf0c30ee1b295e3c2cf51ac1d365aa3c840d1a977102e2fb5f02ed8252d1f40edd7607fc7fb9c3842aebb03fe3fdce1c21322698b1df9ffdaf2ed9cf28567b7fe436341197ff7d2f38eefb895318cc80dca532c182022051441032811812c018010140bab740dd478502f734074bb893a3c)) <<< 16000) + 0xcd2cd136a4dfb3a66534ea7f53475bb9e21ce69514a0bf5f18899a8280aad48c0dc75d7671357c72ce331e8001f211351dc0a1e105482289ea2d1ef2000012282000440a86b4fd10144d999f46808196129072c60820e42cdc580bc5398602002b687fb4800204c504201000014322681a1330500010a1132318140ee8500b9bb001028f9aafc90616e3bd2a68103b78a89372c01e66325d8a0099afd5500983084021428d0e3778c8141588d56a30bb73349f9081c03677e68120610804000036ce15744bf9c91440bd1f2314608095ec0e510195f5baf10b0090aa01682400479b0d3426082200848c099671c50c2b0792580c50417e747428c1059c2ae7220312054d818c001b2a2bc213041100400004e4898828000a848698ac348261a20b13005e8e025eeabd2873b5efb728e358f556c88615eac2f206606c9d27c2e300079a24138c00189a176827082100868e82e3e1551c6b4ba57d818285d7607f86157a554a06606c51292d7283013ada830e0065f848f84000ecf94a41404108040000634c8c8015ef7a185b89159360a23ca293fc0c081e4615a65847ba9fc111c204f4a98f8e002397e03809c30840200002c444bc4625c13c19719d413430bad36514314446826a089210264944249041d18cb7e04a184201012d0160ceed06db6185d5a76b218a2207654e14908217804b848200d18a5c1001c6a0239804c204201000013722581a000284209e2204e010003bc112b29095108098642521a0990504c00800353084b9c84a0740802208001000ca611274180c10c498678eaa6780079eece0a23e40aa333d0a8a81f46ce97fa85fad55fe0be1c3a1ecec55bfa76d4000000000000000008491755b380cb759925539f79d25bf6b48827c2d04ff76af000000000000000001f93d3922f32f684465359c08a40b09a9e145051170fc79000000000000000078c70ebad4ec2b6187048a0a28c18c08e00a022aa8de64aa4d0440c675a0f5301c07df7bcfd5fa14f4953c42776af7667fb93697393671bea567e2fa0d4b7e3b02d035fa835913926556a41412be4a10f40c6e773c662ec6e2ccd77d5051e50e7b6dedcf1af1ef7060bd791d611ee87b7553ddcb9b7f48d08699256b56449ce09e9e8789a8e743dcd6c2dd7607fc7fb9c3842aebb03fe3fdce1c21322698b1df9ffdaf2ed9cf28567b7fe4363411922eab670196eb324aa73ef3a4b7ed69104f85a09feed5e000000000000000003fce8b9935a4302c3946eb98bbf46d63100000000003c3a13774c25663feaf66766163d39913866e28d8bbb7074e69f2c8d711f1e1d3c231db4c4541fb10d471070c8089010000fecea62afcd7560dc83437a91e6bf99456672eaeeb6dab0e796601d1caebe84e7731cbd46936575e406cc138af1871266d5fa920eb05271f416aba1c094975ec04f83f215538393b252c8a28c4346c076f375b28d7ec096e3cc63450f133e65098873e073ea33436773a90bf55d5c2431e29aa68e21991431e972689284e825de109c9a4196d9b5b09cd5bfa6debc026f971e726202542b509db84ffccc8260bfd506d7f54547239ab97610231e99a6f7354a2c2e5122dcb9e4a1fd6faa53a13e61006c3d8f1f475eef50ec15dee13f671293570b37dbd00804acf72e576ce7315dc74c0ec3ab2e2febcbdc2705c40100b04dfe1ba2353256d9cb7f53617d29994997c9118246e48ea710d5df73364df3ec2b1a35efb6360ae912207939bbb80b5baed064d04bbc19f181078a5950448124010918080016f08911880038c48491ec484a61204b1202188f8cc478560802b08d0dd813d136a6aa71fba1139415c56f91dd3ea99275929e7038c4e687cec900b57d9db4e61108374e87568122f32a8138b2347781d15d7d4f2018e0035bfc51414091008bd3ac6f57e78e6db26ea7a56c6ab2dadb86f95151a656ad53c19cc9b42864c7bdb24753af7f7a482ee9114792e1514cef749e0129823e3a050d5c0a126aa6111b25a588698e314d72dc607e69fb534299a06ac35b495891d05668d4167d7b91c674292ce1f3bc5b0deacaa5ecc85e913737fee65c7234f9d8e3475a487d853027f24bbfd012837720408b187524e9998df8ec9a533be8b0c8e9496e7948c95a8cec44dbec00016b935967384cf6289b6030f171291dff0d37fb23e4a02ff941ea061530a1869d7cfa294963088f95eac5b87a2ddeb00fb92ed65136383487755f77562f1eaf78660ef9cd058ef88ad11ead1a3ee312014df368ca7db14546615e90effca3d94202515b9f990fbf601aed4457f4384b28ab506ffcc96de96b143a58f7a97d8e8b0118e6682597112a51153a151a2b01c3e5357388bfc6f0427e8cab7256de7516916fe9cb998c36c9ae6d33a1b82ebd29af21699ae89048e6b81d6d6d575d078c019eff03b9fbdd188e8b64200fc7381c804440740100000a240026b488e8cc470562362311a1188c84c3ac2785104ded205a05e60d2fca93f5518c9e200e7601f783383082f97f2bd2635020cdbf0204a34047800801e4a8d4161c005f094b02a6d05000073af9547c18c0035ec1f8b9e7dba4e9003204460d0893a0ab02186399955665e18218ed208c89061063b4a046881832982a2c0491000000006ebe060089090a5a0721c00a408000033400b38803bc7bfabe20a2d19b7f21e63491002d728eefbc7064546d9857b02c343de904351a121054cfbee84a0502357f1c80f0a1805438c27ae2e000d2a54c67ffbe48e400b40d000045a4418162300b1170588182c408161560b1160188a80c40007868b)) <<< 16000) + 0x77c77e7db278834cda6d2e640c101acbbc23298181927f1cc8797e283011dd236c8505043b4c18ef32706083495f72ccc7100083951cb4ca800031a37622f50f7e64801781c3946eb98bbf46d63100000000003c3a13774c2513c9307286385304082201280c0000803400048087e82c450161f80b0fb0187d00c098061f203e51bae62efd1b58c40000000000f0e84ddd3094512ce2ce24c2101c41100cc0c30100200de51bae62efd1b58c40000000000f0e84ddd30944f30f28d25120515110d10c00c02008036070000008ca028a6b85735e1070c2d7ca62a64a1a202efffdc0c323c0defaf038206f62efa026801d15eb5e00700408b048e8060048c6d1d54f24009c06102c1aeba776494515a5ab60483861430b9b22250d6fec78af546183312559a41a2035d7470391c41ad422dce22060d27dfcd5060826815cb1b6d2004e0300001f120007fa40014e885d84c2e827044260cf2ff5c206081bf2681437f50820f9bcb02e12a66062c0e7c46a0bc0e08d51945af7c00302000000d917001400c00265484f5828005588c49f9290000492312d1734b15e09003204408980c448062220311001d15e7977b498b081c311866f56a1b9650cf0ac19ab5de8161800000415e6004865e8e208dd4c01c109fe5d18272fe18423d42af2ae000410333e7abda1006825f030f338f3a53ac120064090a2bd1577eb62f903862307f1304fa8ca19df64a6b8c0d02c300000082bcc0090cbf8b6df04100382140b82a729bdc3084614a8ca8c00082066c8a5f04900d04be54f6365b14a7582400c81200004be443c1621c03c33adef5d47004081665f7e135cc21c28c9a901840500000075300c1443740fda282c522e73d263a10104b03d5fc2f144125fd4378c0f0068e122d504962400a80a1866f768472423040811f767db9adc611b730f76a6d20f184cd8d93bb741a302ffcc336a9b34508674576f48258a582e40cf510101041ae519f1c30a20f91174f9200b7f12005e07800024138649b08f93aa208101bf85d4e8a8984231d3958031080a000000927c01828541486a646058a2c4e4afe7d820205df419c45f2288168ea9867381e00833f43c4c897709002e034619174c71cea64010202cc8cf10e6081844480df6770e783c60c08631b633c068c077f1fe3f83acd14150a9ace6a8c9628dfbad67e3b504040a4ba9e5e3af028826647f576296397b09003304800013410004b93454613179cfcae070c16b51eb53f7b1434450e3087291068818754c9233c416201b78409bc6565860a711f9c02289218e01f204c7e3070414469c9efae706109a64802305d1cbd890032044086808430040005104002f8880088010013cd3e48000008dc60e3fcfbbda14307f9f730430d059a0299181a76d0ddde304d470facd041614324c9c10026b2f0ae800083ad292148011004042c04214020ac010848084200420e0200023d203022001cf822061a0021353e201f4ac5329c6b0c209b9d24a4723114180eb816c64c3d0818b29c557e533e061d8d5e3e6175f4020ad761bfca2d9e940005371eb39ffe86009162f29644c2800018fa928d0329ddd2c9003404c7e4f4a72f8800002994fe0a89832028410a08408208a000060000401b039832028e28a2020a0002000064000401a000118007000065401270c2882087062865044803000019000100680004611060588282c410162060b1020585582c0a0062020310001e628061ca375cc5dfa36b1880000000001e1d09bba61290c32029a2961861921020dc000401b02084dc004f94163823e438ae771c7d96abfeadee30c1724f88aae8c1007f9d504ee020b83c6892ade2c0109b7f57602380b952c411138000952f20618ed0a9002b02c00010d10ff05f1ea9f6c5b752dc718cefb3c041e5861865af1afbc6d07146e08b1bd8eb8b0d01d12a0a37c0c04185f808d6bf0b04001e51b3a780901267ec2196d980000474f85ce1b67f12400c01001fc03892426e0027ca0c2011f21c573b9046cb55ff56f71c70b927c4557468a03fcea82770208f63733414d180884dbfabb012015ca9620889c0824a979030c7685480158162249089d6dd93018402499e02dbb1046c50edc91048e385c7fb31c961a28104466426c0411e77374dab81808844eb15805100aea8bcf526c820925b83fcc12d0a48016018000089080022c90006d321fa1b0fc0987d82c3e8161f203d4ac98e5bbd421fb30000000007944fee0708c3946eb98bbf46d63100000000003c3a13774c25234c40a2c71860c33c22c200b88008036088124d9ff0638182802d9a11d93405145001d154ce806082149f3d1d00b1046d66d50fbb700c101119bc05cf80c04082dc900b53e4021d89d5fe7ad02c009c93f04d7ba48d84801882003e0061ee03a2b20ad2c751fa38700000057f3a071c79260f34df63861336c8b076e461b0da46338bca3830a11af652424a0c4443ceecb8e3c008af4b5e9a98b000dc95b94af4e12c801701a28ad0e5a9e838df81c382075b7aca183071c6601a3b4c9d6070c1f788b1eb1937186bfe210c8221b81a202dec62711a7f0b1019ba5e3fa5b507060ddac3643a9b728312601f945b3d86e5f84801a82800009f0c93a22645d6a8f503460407610625dae0c30cc1b67a87ab40d143f5f1f44da29628b7ff5cd5d10cf030305f8aba3af036141830ebb36095ca0d081b38d1e221896484246afa5e79650dcbf09003505007b008000a448003bc90f5090005139c2c4cb35556a1e48fd148eedb2860e619f15de28a3fe42d447820bb657)) <<< 16000) + 0xa388e9408fd148115f003230a1380e000058880c06809814001b3e43d03400313c400792c80236d10f335c020040101e40bb003454a44501fb050710220c1d00800003c90f109e087197c6f301ecbb2d54701ec3e12c0c0afdf2e34009050780200001a443c0561de230ee0d87686c3b0161d60be3a230e30e10c0820a200e000064000401b11851bbece02c819670308210f17dce931f0257610c28c0366c87814b0f98210581febe3413a97c32d860405d68f58ca9f8b25d08082c033137700a30ae318002eb483c7e435889d1ebda49a3bb802384c0000a2c0027902eb7bb5aa7112070297c72bf79c2028000026a18de0f16654d3df2e24c30a06ea168801e00c36c9f50a2e6802000ae157dfb4bbc300177f99786b1000020877c49aa908b892400c41200004ac00330cee31afb6145380d17c31e2000002370e12fdbcb218608000009601809033a1c1cc004201000012e0029458b827489f0e2002689b9a8410963b71d1070647494290d14300739bdb78c004b950732c5006692600e2180217eb9fbb000efa1e2df64a400940500003b8433c17c190e390f23d70fb2ac614332aaabb3b60fae7a5c40209dc5c5fec0901167c5046522b800f1ee546860608bf5610013ccb7e0260400115a483435f29ebd60017b7f6df7a90397a7732d1006cabb802384e01980786603401c596848a017e8c3ac508140802d0366d1e20c90608c549184053edf64e46382085b6f003ac604ea90e760c78808862a8130bb04184794160f9dc24801581430cbd731ef8e7091402fd18758a10281005a06cda3c41920c118a923080a7dbec9c8c70410b6de00758c09e0f5610aa710110c5502617608305fd9e2fadb849002b02800010b90004492000e0843a8361601b0e90984d84c2bc2615c130e80185680e86016e4614abfc91868bd0cf0cd823520501e85e2cb17cc3c41ac506b793ab02832cf4223323fde2011f919fe18e21a1410c627557014290412b48ddbd7a3191400d38ae732ba54f061920068098a1831f0b956a8a30d9bd956211532050ed44aea31f9e21c7e352fb2a85100745273363a5068a65f3a930b1839693fc94dde900945a637525981056dcff3ae2870684801681c00008b887382e861282991d4ac8c344b6a17c92487143badad0d03028804e3f012d882424f69d69e60f9409547757954b0605992b5dd76ec08206ca1b44eee24005b400ee888dfa2400b40d01cc03b1c500d2400a838fbeba8615382060b42d6d0870e20c3a19f8244a0e1cc6b50a385848731aaec8c1c268236fec2808101f3ea59bac60010a58014290e48014814204006127e70b1c30e328fc50c126839e7243ddc8f56e1611b50fd9f870886f1ae90600031507419c00840200002ba4000df88002ed90ab0987282c0e00606e030e401d1209014228d8746101434a00f311a68e0000015a11c04081186c0eb191e386072e8aad0bda08264c62b5d9d50601c5994fd6bd44200508e16b2639600013882080c00f000043c426c2404c12000d922003d1e438c140042144388d61c25b0262981412c380561be1bc116f6e4140812b5f1b9b0c0b49dd402000023242000840a35d28221c21d6b2a444851b5415216068582cc6048183c010d0e0c0f89c582e0161550400f79e97211860e804000028886f04e010020080dd0906e04836c040000c24270441a80209a0100012e10be1986d02c2f41701a6106bc5082d48f39dc0012181f00448827e61d5b0c38757a7e3081043990d28204223a0fee300689148284025142100850a0ed7aafe10488dc2ef00a006ee1fb4420012fc5ff41204108042030322b425e3883559af3088271b3555d011841100400002c086c8683603400039c4000bd485908c0a0073606b640e1b1b7a77ea675792159847fe798081309418e11208e08808209000e0060222191c0100680c8482c4140002d8435c67019eb52376242012048da105127a9c60b0047566e00a0092da9bb094207c021450b73019a780261e400400363355fb93041f0044000040100940200003720001e840a0070182fc93ce04107e2812d12082e88786100df027a4c9600502387e82022a4377ca4c104001081403d9e8c0e11081db4d44101bb597308076fb4c59824082000800006a90190500011910d61504e0a8354461961a0d40904d0480013ac81c9680029cc8699ac348761a23304e09f14b37846eca145266d9c44d4e1000000c75610359bc202a9030ed3304997f1423cbb49bb0c50429f131803081449b841934104b86def449b640098061c512fec0f076851404d64d0d59103489c0311ea830ee3d93b3a1b08227fdd05d4dc8040000043d460811b789ec324c104774ee07f91200114f44e58f7d52005404800020d21a00b0cf0186700f8e4a39900eca80c2a96b699c830a765d21939828a051717a6d84060e5f6505b03060dd7e3e79038517ff0ed054105b594410f2458004b36f8ebdf520050040e38dadbc0977203084f0e7ed010280678d9bf38c2981e093ee10a286e81b420e10182a6f956db8c183011a16210e136c926ef69841562e9f0559644801401000007e8f1c54ad84c727101833810638d9c814096288eb2a0614814aea9950080c0c3a23d779060c1499c7bdd6870956619ffa68820a0558e84ec00c0402264ed6f1e522400b00c10180313140a6278c54276b47bc3460560116a1d16281ba65bf5784087bf877f4fc1040012586f8c30100419684d588040f56d3f510000a1bc9dfdf9512005204000020520008844334270ca6aa75bd0558d4098e7a641c0)) <<< 16000) + 0x1d39f0149cdc34ff91dd52b0000000000000000000000000166ed1ef4af2f06c1ec06c5dd86513843442c42430c31422400c0030180200d000229200158a42c0461981309b0986584c2bc26194130ae0986480c2b4070ca6aa75bd0558d4098e7a641c01d39f0149cdc34ff91dd52b0000000000000000000000000166ed1ef4af2f06c1ec06c5dd86513843442c42432420c22c00804030280200d8653553ade82ac6a04c73d320e00e9cf80a4e6e1a7fc8eea9580000000000000000000000000b3768f7a57978360f60362eec329c356a952e07006263077f6cd405616c6042a98b082216cb7006ee6e22e4d52a2222e22252463fb74a00000000000000001f0f617ba99b273a241345f82a870860818618438377cb9ca2eaae3e4ebc0ecbbe66b9ed386c5ca3da0a4f92496e2d1d34a6ea6bca5029770826e8591fb613b47ec898dc37fb4ae2445d724809431529eb447bd4e3b121c5f21ef8d4cfa2d37b8de18202453d67517862e2d9295a06fb7b20a4115518cf963f8e5b0f22fa566cd446d59ea1900200075c21562b0380581b80c27407a50513b55c9f63881a9ddbb653a411934d4df76e8e19f988bbebb01822a20bb070b0284218d866bf202085783a68ca610002ef417ddb3140003842c0d3ef3120056058d28250b421e3880e10a471921ade16cd05206291c17c5cd101695ff2a0800344603666002200800009a90c701f161329dea0e4249a4742fee731e40adc591604cf1d4edd98e91a68a8c957833c22c51b0dd2e2010a292d2ce475b4f045f2eefa9ba88012877c909acac801481226784da382dc6962c3e8e5ca63df040206c70a0cfd731d9e089dbfe0ea382b59948e49c000d493617380110040000590f9212f32cc48ac49278899bbdcb691e4099785572cf23c7636f10c4c01c68a9e28273a3a40b1479be34f90480a2952d281046a84401052d340dfcc58002a05daf89fb8f44801781e38b0913b8f1cf2436daf7094c7b733c632091c8ed9304c38505baf5dc83000d4402f598008802000026a4000e448003981a204165966c3060f56afb150129ae01aa0184417a17314b0813c7a4fa3810190b07b010000fdd48f4270c220080000b49f2c18c3c34e50e09f0c0822c5048ef4e41e1f815e7f6850fa6eb763404a18420100a80100008e9b20c4625b5af0c18fe6826f26061af40969b940c1419554433e06148cd6389d3cb0c8a5c83e600c0881eabec29060a0c479f26fc20893c6e19de28920050048b200415d881c5101e7a6f34e3060eb9cf81e2026a109da0ac612925df35a45800625de192040039487bf551c00940500002f6687085e9e75891c066303052c50b1448d48f0dd6872c8314383ac63decf04456ddb0828002b34cf8d9c10880200002ca40601618c0a0c5018002a890c41586184ec9241bd7eacf12482ca1027300d1d6c05999f8e38ffe2396443634430db09a620161af7663df20030e8a2ddf8a30780182a1f39520c002c94d6c6851120052050d1c1a600fa871e22e24c004109c7e3cf8c002da10e7c20045cebcba5002000800007e9a2145341d11861047a74830f5d200dc2c01b41930810137a26c365041e00800007a9a1cc41dc3a3460e142e44b143a8b3550829d905651901078020150020000e02184130180906082f8b0d0efa00f40f246877ca18e024991a8d24fdc0f2019748b601d24804d0ddcd7a8f145ecc7fafb124512a49c8e3a851516820531c038326bb42014d2889002a028696a6802260410730406fc782c9a48b740830155ffc070021820fb660006f2b14b3001000400004a4f161a2d174c830f2468b457434c124c84c2b887b03c8064c1b2418e4900ab236d9db0f145ee3349f99922893b995734c14545a0814c7007064d7684029a2884801581634b019359d98f242e89dfd2186011f880081060a7dba7a08009206a99650022008000083900033b364a3f34a3238fd8ce2291420386b1de208274e80304031ec07aa92840f00400003dc86004fcc0b8c23ec1c40a171845ddf828ac2366dbfd040908640165a52893b324725c240620227f3e592860743ff28d218656cabdccc03c122ee805508d8900280207196ddd98a951445f0c9a20167186c45082b385129478027242cb0d00492b86fcc003e010000123323412f024e103cc16a1242ac8e30682247c4e40a4c06e087a8a2b23af687744870e6e4a177ca18eea5ddf90246c189ceac3151400000b367a32004c038e32e0bc86a2a28aae55bc402cdd415c61055ebb87e8f0048971cb9a0098f72c298007c0200002464000c9cf98172c76e65c40a172c74ec1c14560658f60a41024213531d6f251277cfdd4a0c406202a10e3a69430383b8ff3306195b2af7330078245dd00aa10d84801481238c03683a8ea050876b3be0924ee01ac60105b2300f1414002173df786007f25069660021008000097991a093b854614f305c68f9fe81c60ca97538fa40a4c25271cde515906c653d1921c3a3242b2c9431dd4bbbf20246c189ceac30a8a0000059b3a8a4009c081c6013e9eb0d0283e2d821c4929a0fa1fe082d93752e90a000f2a0f5430042162aab3001080400004bc80019e90006a736494841d5c1c790017a08782418a3908c0010d56ba840158c72b04250c1f00800007f1000e56362c02245d56ce032dd664954e7de7496fdad2209f0b413fddabc000000000000000007ed1f780982b205b1c3aeb53b0ad861c122828cc7fd5eccecc2c7a732270cdc51b1776e0e9cd3e591ae23e3c3a78463b6988a83f621a9239628411a0a1ee531f)) <<< 16000) + 0xa681b868103121025bdf83d8e062ff700cc7794073bf2e5d505f0490cc9772e80a615f40578874018300d6f8733d813c1f9e89a85c2da700da9260e656a31eeaedcfdcf6654be9136f10282a8293d00058920037ca42d0440042fa40605400699042708417e1209a09001f8d10be2985e84f0b0000023f91c70ed179869820c618e11e1fe572081d3d35ebce2b0c3ab65476380c4820000019d9f44051dbed86946820040c68e637c00041514e2f01b183200560600bc0185d80c2e806172030b80185b80fc6a185cd9110710493688a3f1446b58a9e99c41253c49132a1c210acefd11c608000004fbc142022bd9c57c7005189e9de8000001bbd200da0509806101c977f67f6d81028b7709773bd1851ff0407776a28b611160a458870c125bdf4e550c184c28ab49cc301002468215e420217e8d9e2320200030f511a1b818f486158142ffefa5e71ddf712a6319901b94a6583040d1f780982b20592039839028a29619218e18c1a180c010068000a590b60d0001cd100059a3e48000011b86100000043a3063c3df2ed382bf6f2c861e00ce78bd08c008efffe5c000003208260c210087ccf47c82f58df1264443ab83feec10932e810e0e9f0db2fd5a800000000000000000000000000000000000000000000000000019f9bff8e3d3f0e52595b6183eed40be05e23371bd96a858dbba0000000000000000000000000000000000000000000000000063240a1c42011813c009d43ba5080b00ac0a0053dfc9278c010f1e719010742962908e204398fe201049fec2335080619c52bea42000161183724e104601000016f2000a8442d4341681a0b30100037910b215d0601e73d74101808467c3a68285096ba28808941ab3260838e7763de1000191d6f383804f97c4b2a024e3044010019050588080a00400035c42c096136330af1585708c2b407018781dd7b90a1c52fdfb5c18152f609268680173f455f870034d368df08045ba6193b40a3081180a2c60d2ba60630407d47a786066aed8f6211860f80402880400017a606004099553b85178b5b0cbb9488844659bacc520412bf973139221800000dd7c10045736b098848003c535f8650380000001d4c00644041481028b412d83d61023547f699a20955a0937d00443ff03da1204108040000360d074a08bfc8c18d6349968021150f488200ebb57a692040f0040288040001c442b0340007b2428447e36c70aa3480b48baad9c065bacc92a9cfbce92dfb5a4413e16827fbb57800000000000000000ff15b266507040b574b0182b0f34144c01b27ef2e058a23b2308d0814e1080c404801a5ea80a91490fa2f8f18b48f9f828a59bb3b66da728e3e6678e812a0b829ab75a5fb7868b8a6970c0044aa5d7edbbc04d8843b4482d258b544390d4a1400209f0102500800119c8558ec0e03606e1391802150283781e60000005251830dc5e069139a9a28085403d3304860b3fc26b9606189f7cdbb5d68842fe3694ea222008aa55b1d70780000000b9345a2400a8091230061786658c340349d0a244407b011bce606001d0836090c0a5cd1698618629fe2f2441225144ffa080000065512800230080000cd189626e78c005174c5a6d21220c42c1c82c2196e48cc10529d9460910646e3d531c08052e9c99c007c020154020001643e1e3985562502613b9e944003c0100a90105400800027c85384c2981704000002dbb8e1c21daf018838f5575b9b431c405c5d374888205c8583b90d081ced37bf4800000002ee01c016f45c5b204002bd2782a2a400940413340b0564a0c51c7958d13cbf60e18035b8183b948502d2d6a215ca08117007a60d082122ae321bd1204a9e3d0898f040000053928c241000540480001d93428a520e5048292afc67268400a73480c04b3b121d820989374fe94007c0201480200010d214a0b8653553ade82ac6a04c73d320e00e9cf80a4e6e1a7fc8eea9580000000000000000000000000b3768f7a57978360f60362eec328a871041e3a62061960a6022060000401b438053bbe641044411b8b9e4c4028d0eb7a18616d9d840130893bb49b39c080106a62e2c10297345a6100000065512800230080000cd18653553ade82ac6a04c73d320e00e9cf80a4e6e1a7fc8eea9580000000000000000000000000b3768f7a57978360f60362eec328a871041e3a62061a602200e060000401b4280000ebebea0f0171faffc4c72eabedb6828102ffa62cbd30826c7d6c28a0267f9fd4c00800000020104e004a010000179200076e6440553a76792172afee3d6904503743b948137695a833202108040290140001da40022c8c0a8e6c003b4dd007bb696c67e8ec2e12e5f6502203248a846938187b4a28f06605aacca4fc43f9957eb730b31cc205a9e0212595f292345d3e6e129e18001cf519e34f1fe10681015d7790723e37230a2264dcdc3b56ec744d72c101ddaa2c26145fb2808b27fa35dc07bca7d821443d0d919cf5fa6f28b1b41ed4c761df2c86ec5e37887d5521ed202547bd6b2a242ebc6a777f8d1b30a840156c64c539c7f937373d4dbb7beeb93b7743e520f67e408e632805184828814000b8c4004eec85088e45d56ce032dd664954e7de7496fdad2209f0b413fddabc000000000000000007f0075503e16e05b9fdb812870816659068248208248040090eaa65e45f3eaa3e413d0fa5f3a877f2d691247f7c1616b6c7c38c25a02e3326db91a9ae8d7a4ea614a624685004827c140006924278640302a09d05000eda909c2904d868268340051f040e4e40075924022)) <<< 16000) + 0x8b484c8282600401317e425d34100020110572024e404258e612a4b00301511dcc37dbc708bc77074850bd615a91470280d81f6c603d7849488503df57392400000498d08002143ddcbedfc47185b8e20283883e63425a10276871741920e78740920901cc06498400004c4842010a1e8d962bce3889ee8e26f1025472a78c000011921080400002e884a10c24c378535e031732031d7c4b12183fb27f6620c1928e3fdd0c02765b06400000252c2000804200800049c8001c110923584896c2409611e3308e1184684c23017439d56dfae1aea8388deb0e9d4197d5d563263eb1c442a6d5d214d05a8acb8f6247c670ee1a84ca1028618a2c1054e7fb0c1735d9545ff5a068d40b33870802445cb3898508f7e5751e9739a0847d92f5e920f7dbbfc7dec646f9c43c5f67c28982c106068f000001794ce6145f4520f16b4ed9066d8eff7e092315b5d0dc828f4f372ae736da71bfdca52c971dc47fe7671add3aa83f6ae06b19b570358d042250e488388286384482300003c75d0a58e40d66b8af8afa70480314772de3685d3b52cc94486285363f44f367c8de2d9cdcb19c4ba00046c422c861141308909c8961912b811c44690b3280a181e1b29547096db2a9560000484842010bffbe09ce8d67b5659d481d4ffdd2ac32808e3ff3b38d6e9d541fb570358cdab81ac682122441c41831431c214118003090874593d67f2fb634a81180283be0c561c809f0019bfd2fe1ea7f6bedd9cc341f36bb7cf283925090d4000b4884414821c9410c3a085110420280010f4f0b26f35d9b2a9290c11ca5e10b8a75a910134e7398ca005c8182320c3a21050d4020497d0760c9804010026e2a931de00d00c028553036aea6f01006b093c978ae17d0001b6e553bb7fd10000855b5048403705c0001521083310410a82044410002000e6d20fea307e5103e98c1f0c40f63307a01d8f8542bd7716096a0d578648316e406ef10088ae7325e30218e8a6a4a002200a4a8044010bb6ff86533002f15c220089b80b68180125798020a8f5740ccde64db61bfd6a2f516834596e0fe000000000000000000000000000000000000000000000000000198cb1cb04904804404b01001bd7f6f1dbe55d14a59b3cdc965a5562e7f177ce429fe8137349128712bd95bb3cf390052b3b79a4a23257b7a1f904ff38f7b81a9c678c737d35ada3d510986b93b6590430f0a00092e41e4b60f04b0771983b0ac1d44775d81ff1fee70e10abaec0ff8ff7387084c89a62c77e7ff6bcbb673ca159edff90d8d046a432b138aa202d199e854540fa3674bfd42fd6aaff05f0e1d0f6762adfd3b6a0000000000000000042690097ff7d2f38eefb895ca532c19318cc80c2052882073051c00000033f25b1635875eda4c5d09605334061bfefc6dfcb88188d93246f26ca533d3d47dabec6d102e2a5cc47ce4439365a814f605b10ac7b24a109096a00798e66a9f60cb4e3efec964da9d134162f4574d5eb6ed552d0e6db9d16c5f0ba18bcab941d0440e61bd2483791e792237e65792340853b65a20000046583e010913779334d184148f624400008890780200d212018090000589072310388080006b88381cc1bc760dc2b06d0d83604f089bd05a826843aed74a6204b8bab016681605b2ee00008012181000438b3fa61880e0f77fb65290180b769e31438a99ffca80048383e01006b0983304f87343418951c51aacb50338302ec6fd4203007df1ce1438aa265892c05e739ebd400026242000800009d906a25034888000a10d0d1f0170fc2646ddf00268737060445f86f1e86718d8a0d68be20406249bcd59901072d0a5949068306f20507ad549f9f737ec8f6e470201fa7a31e17ca37d09017aad00257cface3df90c45dbcaa1d12406a5e15c4da78db2b929424200a5398ecf55db54c894d1804200006ac41a0e40ce4a066250328c8190040c60200077620c49a001049208ab30433d81f86ec1c3ca7feafa064f81076ac63a204c9946bc26d686c9be11537a81cac34aa1da160657f234b806a0c3d9874bee3cc2bf94bc670e08e62ce6110ab7057c318f96c4db680e20a938f699169ad744b01041ee3734a23e64f60533c3b605a660820a7917d171cf94640000047063a10127e99c6009edf2bc153412bd79f8c92f421bb56ca109353d27a658f43af2aab0e9cacea0bc9aa1aee1eb77c095d6faeaf1ec33177d8134a884786b4be3be0cac28c2e86d7ee06f0c0e765971f0ad653d532f5e5ecb55b519ebefc1988b64571175d81ff1fee70e10abaec0ff8ff7387084c89a62c77e7ff6bcbb673ca159edff90d8d0465ffdf4bce3bbee254c6332037294cb06081318cc80dca532c1b8eefb8957ff7d2f0205ffdf4bce3bbee257294cb064c6332030810b04704c00700600400029abe452acf9c982984b16cca3ce42cd74d67ce191720a6d1978f006a8e2a80a1f17debf1dadc6714ed5ac0648e2979f63d43e532071daaa472b8bb24352ed14d3af15c8494b677b2c9312ffa969ea41400164c83090c180660be1b80c0353a06018606ccfe62340140cebe88200c2b82c24002ac73c87a80015202100402f00e02002008a020d609f6011101d004000028905d1582e08c0980701c0100402d8480000dc80008f9c036b789b009008607642c700ac29d88060080a57a210000242820008000072905a2d02c948160440640a0003b420ae730562d02a8ec0a0360a81ba1d13b0c4356c6b4b8271a86966883d3d6a589990e06da1c3a5ee3f3a5e18ddba0aeef1e5d41b7b9d9e1069f1bcb0405d0a3d70)) <<< 16000) + 0x76a494d16ea8b0b53e65470e054e32f3c5bc0c1cf00fb785b08d044de4f42f81a45ce671406f199bfe9002b828d3bb842eb5aa49285cdc7008e40ad7f5ba7f21600ea4e5936049e952b9c572579049fdc15b36d90a2b89200a61b92051e925599dd5322f4b4799cfad2f4a5d6c247441438c99b17981dec04444dc5673d3515f3ea454413c181004077a1b5e0636c1b0e40df1ad953f0df7fe4c818226ee535bb26f96ab59295387d1472082b6a8eff0a0264d614bbd7ff33f9b43cc7e35e244bf064651e808000a4ae5fade690b6e39f8e15991a793a958ec740f8322f4d381f3328c36fdbb82a0c9b270e14b27c800000956686e1b889fa283acadb26e1022f25488808033d3e880800121010004014c270207ca764f0a1f8b50a0110087399c7a0408807ba14940365cd0540e03852e0f1800013121000400004ec81c928144240004ea6883208685cd08bd618de1012acb383e1421c59c37c203c8e7c08c206ce69514a00130e0f804014c27a10e1dee471011794a8218a1003cdce2880c73987a8840a7b969a7140286d0da380004c4040010000139343e79aa7e420247fcd9211423a0b4c2434192432d5c009040800200a603a226919b6b8a1e6f807da10124a5845d8a102f813db9a0d8e388429405baa463d00130a1000400004c881c8a8148140a20a00027920a04204f1d0270480015b08269c8130c40964a04a210248c81201408e020011e0205e9a046290200a80b4040045ca688223d750a402e577b04a3831293cf64401af2ce226300caa184baa824a384001091755b380cb759925539f79d25bf6b48827c2d04ff76af000000000000000001f95ede2c58988178ad9332838205affefa5e71ddf712b94a658326319901841e513fb81c000000006f5087eccd4ac98e5a11a9221010610e0a01a56a8d9d7952b68d89d75cdd2076c0224037783730f02e5412b27b81f24f46dd0087aef863715b7591d64b7b6b3d290b05b179a01082cd6f8b33baa679d2b52055282a0f3d6180c1074b10fa000a5e411486088230431182108c104260800b03f05e0f88911b1a1821ed6191694010d7dee1808c308402141981825e460bceec292844183a010000079300c010040140080000dc81f06f07f5e39caa5007f431d1c701e1c9530011860f80420100200803d0900001b98060080200a00400006e40c8240002c240f0760762303a1181c84e85c493272d24105d2f4ad18115b53dcb10032b75af201009080800218383f836fa1820a790918a02f1bad741810a96059212060f00400e00606e03a0b85c7860d00c22f8262001c00840000401000004440d81606a03b0f71d5924b0a9f09eacc013b221f070046a59ae4001c008585678fcd102f8b1fe020188857630019008000048103405d87c951f50582e43dfb0600387a3b63803a6c952501070011007510a0e48002af5d9f62041d00800003b100015320005de4098240007ee7090577553f1cb8d7c88f6269b643824d20bc1ac36a574c8da2637725a8f325b4de47517f8b499853c95873e539ae95f4a890008b0043c37986fb14b5559f7e5256915cf54aeadbe7bdb50f1c21889eb7bc560de4c0a64f3116372e8f876dca0628a20019954f79df887466369033abee44892567a3cf93c6c20ceeaef7d8388c1c80347bc02bedd3ffb8fb37e689e78a929ce7a9ee63d1f6dd930ee07c9fc62308aee2b4fa46d2785c82de4e185a300748d6228487b184d2aa7d7992ddfa413081326ae4fdbdbe27d83c3bd9a24db1d269496d4690e78e1bc886ff0052b93422b2d354ff5bae3867cd0d284b12cbc2157e578019888001eb081904800339c8189080c034001c1a40bcb405c5a02d010008f0102c410159e80a8a40524a028218138e80986404a1a0240d011848088240033924014f2480342e1fabb40437adfce3a3c23ccfc20c0000000001208c10c08a0880860040222961c4b9a230e1d4466bb54f57e92107a4e331fde2200e454a3feaed14d155d984866e7fa0bfb78b1c3689d70817494372a38417ff7c138305e9c7202e62840000012c0082135d3dc1c1800f3734a9caaa08b31812004008417c523ddf5be31c3dcaa3c12518303ffea9942001e03c1af114003ffea034450094809002165b4a9a1b0a288312eea30658c900a3eca8a1b2f024c1402011188d7f594008c0216406c3bcaeb1288493219906e58c02f0685d9cb140bc156ad704136f9a1ce12280f77824b43248000000177028e004e028000189365be5f1918428825edceade58c900c459b8a1bb6099b540400cfef677894008c0216405c8ee7fc1441d473d6cf9630036f0852162806dd98fb84135d230a2314062fcdb7b49200000004b04e0048010000171200053040802603e1301e0980e84c07007658a705454b2c80566957ce510118e3fe24b184de595469434ad1ec2061c1001b965643000000d5490b8211802245d56ce032dd664954e7de7496fdad2209f0b413fddabc000000000000000007e259051058c10458228250048060100401a00031a406c260340b01905d900b1ff9fe2510113b843f058c269fd82ca50d2b9a7d25210415e6958443000000d268204c1848010b202b4b1dae8a20ea39eb67cb1804b3da788b140967791cc2095fd73f8b8a0317e6dbda490000000258009c30900200002ee4060340005dc405c14000ce0400315c80b108054840281a013010006f31000f6e20247a011390081a803cc401c5a00d290060e802c640142a0091100408801c3400c1a00501002008004c3880194800844002020000100e23b1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 40 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase0" = "QuadFullSixteenCase0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 40 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase0 private def zz2331:"s091b"="s091b":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l15 l17 l21 l22 l23 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l5 l51 l54 l55 l58 l59 l6 l60 l61 l62 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1f165d25d, -0x337cede60, -0x4d3b65024,0x60354768], ![-0x337cede60, -0x97707be90,0xbf791836,0x3306a9878], ![-0x4d3b65024,0xbf791836, -0x14eac0c434,0x337cee7c0], ![0x60354768,0x3306a9878,0x337cee7c0, -0x19be77188]] noncomputable def hinges:Hinges:=[(-0xeb1ec0,l6),(-0x101e0a7c,l5),(0x19011f2ac,l4),(-0x126713fb,l9),(-0xd9bb09c4,l8),(-0x21f81c6,l11),(0x408306de,l10),(0x378fd832e,l14),(-0x9d0b1866,l17),(0x56e67c004,l15),(0x898a750,l21),(-0x8b32e1b,l23),(0x1094514e7,l22),(-0x19be77188,l27),(-0x898a750,l28),(0x19be77188,l29),(-0x378fd832e,l25),(0xda2bc98a,l30),(0x19be77188,l33),(-0x408306de,l38),(-0x19be77188,l35),(0xd9bb09c4,l36),(0x19be77188,l37),(-0x19011f2ac,l34),(-0xda2bc98a,l43),(-0x1094514e7,l42),(-0x56e67c004,l41),(0x39bab18c,l46),(-0x4a4cd410,l45),(0x19be77188,l51),(0x21f81c6,l55),(0x101e0a7c,l54),(0x39a46b86,l59),(0x4a4cd410,l58),(0x126713fb,l61),(0xeb1ec0,l60),(0x8b32e1b,l63),(0x9d0b1866,l62),(-0x39a46b86,l65),(-0x39bab18c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x19be77188,l27),(0x19be77188,l29),(0x19be77188,l33),(-0x19be77188,l35),(0x19be77188,l37),(0x19be77188,l51),(0x378fd832e,l14),(-0x378fd832e,l25),(0x56e67c004,l15),(-0x56e67c004,l41),(0xda2bc98a,l30),(-0xda2bc98a,l43),(-0x9d0b1866,l17),(0x9d0b1866,l62),(0x1094514e7,l22),(-0x1094514e7,l42),(-0xd9bb09c4,l8),(0xd9bb09c4,l36),(0x19011f2ac,l4),(-0x19011f2ac,l34),(0x39a46b86,l59),(-0x39a46b86,l65),(0x408306de,l10),(-0x408306de,l38),(0x39bab18c,l46),(-0x39bab18c,l64),(-0x4a4cd410,l45),(0x4a4cd410,l58),(-0x126713fb,l9),(0x126713fb,l61),(-0x8b32e1b,l23),(0x8b32e1b,l63),(0x898a750,l21),(-0x898a750,l28),(-0x101e0a7c,l5),(0x101e0a7c,l54),(-0x21f81c6,l11),(0x21f81c6,l55),(-0xeb1ec0,l6),(0xeb1ec0,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x6c02900400000000001b0320040000000001a8124010000000249040d8c03000004848080c9180a00000a0921024c30140000000c4520686018000000188a40d8c030000000290c812180600000943214026400c00000000090a06600800000130d0a0290020000001e120c0520040000074220c022400c0000158843203c801800000000a05014c0200000000160a05180400000003209024300c000000560b810c60200000000a824088c0300008614022029a00800000000000703200400000000000a06400800000094110218c040000000150600998060000000000240920080000000050281660100000000013402880300000000004a07100400000000009c0620080000000001300a40100000000002501880200000000005402900400000000001503200400000000014812401000000000000c0c8010000000000088190020000007610c0783010000000f8a86814801000000001b09024c020000d22084603120080000000068340630080000000cc2605e601800000011854028c03000000248420191808000000004c2c0630080a20508220031a80300000000130a014c0200009a1082401920080001342304803240100000009a090062602000000001309018c020000000000260290040001502705006d40100a10520210019a8030000560901602750040000a41502401ea0080001702807005d40100000000004c01240180000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x522e03980400000000000b03200400d09691a8013080280000000390a014c020000005a320a03a004000000002c180530080000000000300a40100000002d03006cc03003425846200cc200a000344b119004840100000000188f00e601000000002d1f028c02000000003612029804004d481027025440140000001444604660180000003088c098c030000006088605318080000000000540d200800000000704812601000000000e09018c0200000005120812180600000000a4780e30080000288e8480348018000000248e4090c030000000003c38198020000144740c01e400c0000000e4520486018000037168580990030000004a83e01718080000090823028e3014000001260c809c602000000002511028c0200000000002c0690040000000940e02f300c000001220980dc602000000000d0a01cc020001464904203420080000000000280d200800000010462048601800003918890099003000106388c203c200800000c82609026400c00000000c8281460100000000190b028c0200000000002203900400000e46222016400c00000000111606600800003b178540b100300000000002a0310040000000000840b20080000000090681c6010000000000110388020000000210c81118060000000044180e300800001888812044801800000000121c0cc010001063107e05320080000000034140f30080000000000701a401000000015070064c03000000318420549808000006184401b2301400000c309404e460280000000000901c802,0x120310040000000220a00c300c000388981180dc80200000000120f014c020000066260880ea006080470421804a44018000408e21300d880200000001c8c40d8c03000000541a0c0720040000150320a01a400c0000014868301a801000000001a11018c0200000000003c029004000000a1204084301000000001e8d012601000000000031024802000000005a0a06980400000000b4480530080000000128980a60100000000026240cc01000000398520111808000000007c2c0a300800000013052034601800000002615038c0200000000004a0490040000000094540d30080000000000a81c4010000002443301b8c0400000000002e029004000000005c2c053008000418420c008c8020241201086012910060001224084c036200800000009213026300c0000012211814c60200000490f04c0990030001221e0460532008000000b316404e3010000001622980dc60200000000001f0148020000000531480e98060b0c51840408bc401814092086300948803001211c21900661005000000408e206318080000000044140a300800000000883814601000000002919024c02000150340a603d20080000000000340e2008000530cc288134802000000001106018c020000002884403c18080000000521201c300c0000000188580a6010000000001f404c803000000423c1a02a00400000000c44c0730080000000000681240100000220d8240d100300000b2431900b20060000000000880520080000000000260640080000000001e034802,0x3216029804050440411804a44018000288820b00d880200000000160b018c020000000441080d1806000000844c180940080000000110881c6010000000000210248020000000042220698040000108460a02a400c00002208c140548018000041118280a500300000000260c071804000000884c180640080000000009060660080000330a8300590030000c610830023200800000000842c0730080000001042604c601800a908408c0c2900500000040846053180800001043c13026400c0000010878580e8010000810f023029900400000000421e039804000000b118c06e30100000258a41c04c8018016318c2840751005058630c282045e200c0a0490441804a440180000298941802c8018000a3104180119004a0648210680821200e0050c9108d015640140000000e4260286018000001c42301a0c040025218c210185200a0000007108c0e8301000002484c1a03c801800000250907039002000000004a2a0498040002585610409a40100003885009809480200000000110b014c02000000000014029004e0c60408d01042401c00718c205a02ac802800000001b0e018c0200000000341a07180400000000006409200800000006422064601800000000d06038c0200000521a0481120060000064220c032400c0000000000481c401000000000906018c0200000000003402900400000002209022300c000188480981988020000000000050188020000f81e04203c20080000f02106809c40100003a0681080f080200003c0841400f1004,0x540a02980400000000a4340f300800000001483012601000000001512018c0200000000002203100560ca0420d02368401ec4941844e06ad0803d0324106340410900700000000054581980200000000a8540530080000000148b01260100000000150503cc020000036130501920060000000068140d30080000000050281a60100000000250e014c0200242384110157a00a00000003a11022300c000000e6208152602000001c621006c8c050000038c450139180a0000000000e40620080000000001d80c40100000000017002c8030000000002f80590060000000005d013200c0000000108e81460100000002a84402cc03000000005214059804000000a8084013301000000015c240266018000000002a140cc010000000003280510060000000000cc0620080000000001900a4010000000000310188020001a661042065a0080d0cc0820405e140182219a1981012b080300000000003102c802000000005a1c059805a24c1010303cce401f0d9660112079e2803e092c4020c09dc500700000000007e0310040000000000f406200b831a1410604f66803800000000008c0c801090670668404ac200c1024c24b180963401820198196100c46803000000002521028c0200000000000b8190020000000000b40920080000001443406660180000000000d03480200000004c0900d980600000009e1201b300c0000000001881c4010000000268500ccc03000104398c405e2008000148430c807a4010006304605601e48028000410b01301b9004,0x2904602e18080000000742301d300c00000000c8780e601000000108310124c04000001882080b8180a000003304302303014000000a21c80dc6020000000000070188020000000000078190020000000661901d300c0000000000280e40100000000001601480200000001a088061806000003504501303014000390c62901788020000000000090348020000000240e80f1806000000410d40c630100000000843403c60180000000160603cc02a064820c6811b4200f42490c1a703568401c00000000c8481e60100000390e8480d90030000000000240690040000000000680d200800a0901084055e802800000001205024c02000000002a0a05180400000000006c0520080000000001680c40100000000002f01880200000000001603100400000000241c0d3008000000000da0144018000000000350388020000e41183804ba0080000000000dc062008000000001b0606600800000003605014c02000000006a0c049805824b0c2c103368401c000000000ca026401800000003909024c0200000000522402980400000000d4380e300800000001b8701c601000000000035018802000142488900432008110cd0cc080623401800000000001a0640080000000003a01480200000000000e8190020000000000e40920080000000000881a40103032c20410178500600000000621a0518040000000c21b026300f44982010604ee280380000000351903cc02000000688c20349808000000f12040963010000000005028126010000000002a0c0cc01,0x4a441c04a004000000948c380d400800002510c34054801800004c218680a90030000092430d014a006000000008c380e30080000000001081c4010000000208480b0c030000003082403c18080000009884340540080000000c414038601800000000221c0cc01000000001e0e051804000011c5211013400c00000000a8481260100000441484404d003000008a2a09011a0060000064260a032400c00000108a848168010000001042201e0c040000000510981918060000000084480e30080000010890701c80100000000120e034c020000c62082205d20080001844204807a40100000000090301e6010000000090a0c0d0010000e228870034a0080000007c341c07400800001d8681c0268018000711443500e500400000000120a06980400000000241c0a30080000000000281240100000022011004cc0400000000044181980200000008a0900b300c00000011c1402660180000000c844088c0300000841908811200600000000881407300800000001083016601000a110a0b006490050000052220581b20060000000000340720080000000190300e60100000032c120058c0400000000620c03180400000c8822002630140000000198300c60100000032012004cc0400000000661c0318040000000ca1a00a300c0000001843c03460180000000320e014c02000000002a0e0518040000003208404930100000000070480e60100000000036240cc01000000006c2202980400000000d4480930080000000941603a60180000001504c030c03,0x608860371808000000006c2c053008000598620c008c802583241063404d39007002c64883680cd200a0000007104c0683010000000e20981d06020000711201301a1004001c22401180e4200a00000000a4340a300800000001487814601000000001d05028c020001421e0460372008000000004c3805300800002d8782203a801d03201043404d39007002864082680cd200a0000007110c08930100000000130881c6010000000108640c8c030000c22202a07320080000084320c032400c000298681200f48020000510cc2302690040000000032140318040000005104807830100000000a414038601801c824619c0249005000000744e1a03a0040003a8960c8059401301140c31a0269c803801822861b4066900500000006b1c80e9806000000b11cc089301000000086110168602000000011848070c0300000822106805200600000000841c0a3008000420c20f00ac8020000041108340a9003000000021090161806000000610c807830100000000c4340386018000e12887b009100400000f2711e00920060000000e269036300c0000001cc8203a6018000e22845b009100400000a22d0880520060000000b251036300c0000000150a81c60100000000321d038c0200000000003a0710040068c8406700924014000001b910680e8010000d6228320165004c065020c6809a7200e0060ca106d019a40140000000ec5203a601800000244530224c040000098430d00d2006000000830880b430100000013118701c801000000021848070c03,0x24838c6180e9200a00000000882c06300800002104c18014801800000000021018802000162528300362008000007189c027e301400000e314603a060280000000250f028c0200000ea490d809a0060000007111803a30100007888609012680200000000000f0148020000000000320690040000000048240930080007088c19809280200000003886c08cc0300000000140a03180400510818e301d24014000000164aa0686018000054188740ad003000000008a3c03980400820c18d9009e40140000000001180a40100000041190901d00200000000140e0298040000001041401b300c00e118319a033480280000002c8ac050c030000054230c81a20060000000001240920080000390cc160768018000081258c8059003e04603186809a7200e00001e4e244022400c0000000070580a60100000000410b014c02000000588a60341808000000b114c0e830100000000000881240100000000391301cc02000000003a3205180400000000741c0a300800000108f03814801000000014864050c030000000004c38198020000009c58340a40080000000188d814601000000002105034c020588486406050b200c000244580c4053401000002c8b41201480180000000150b014c020000000002c281980200000043064022301000000000983814601000000002e19038c020000000000320710040000000000b8052008000001a62c809c60200000000390601cc02000000688a603718080000000e62901d300ec1120c31a0269c8038000020228c09a8c05,0x311481118060002c86314c0c440100003b04a0e8198802000f208a0b406310050000001283a06318080000000004c0782010000000000b807040200000000002901880200000000005603100400000000037013200c0000006812807260200000000068004c80400000003312805180600000069104032301000000000d8980c60100000001609c04cc03000000003624029804000000006c440630080000000b04202660180000014848004cc04000000002c240398040000000002c009200c0000000006c0124018000001a8110050c040000000320580e180600000006c0900c300c0000000dc2201660180000001a024028c0300000003204806180600000000642407300800000d0082004c60280000001a044038c030000000492081a180600000c0961024c30140000161282032460280000000000640c8010000028c3180e8180a00001047a14026400c000000000f0a06600800000211f0a0290020000c220854042200800000009424019300c0000000088481e60100000010c2202f0c040000002084402c1808000004184e02f83014000000e8d8301480100000391a8300890030000000210880a180600000000645805300800000000c8b81460100000008c1302b8c04000000338b604318080000000622d022300c000308b00980a6802000000184550218c0400000003416809980600000000005409200800000000c8b01660100000039250502d002000000004a0a051804000000e894140a40080071844062012480280000000090601cc02,0x722c02980400000808430352301400000000b028126015822418634095c1007b0c4890d381bb8200e0050490844031240140000248742406c8018000811c45303710040000000411c813180600001047222036400c000418d82981568020000000000190188020000fc308a202320080001e06114404640100000000000e812401000000002315024c02000000463a2a04a00400000c45212036400c0000000158900c60100000002a888028c030000000054240298040000000a22601a300c0000015611002c602000000002a0a01cc0200000544210013180a00000000a42806300800000150110026602000000002b0a018c020000030c5180e8180a00000c8461a02c400c00610850c402e08028000000090e0c0d0010000028c3e013f180a000005188301d030140000017868580e801000005b0d05804d0030000002886c01d180800000000c4480e30080000018890501c80100000000120a034c020000e23088606e200800000007231026300c00000000c848146010000000001a1c0cc0100000000120e02980400000f46229023400c000000078b0a068008000001e15090150020000003a2c1404a0040000000000140d20080000000843202860180007214c190191004000007431148132006060843430808d0401800030862098176802000a30ec10c0a2d00500000002504805980600000000443c0530080000009c08802c60200000250982402d0030000000000f00490060000000005500a200c0000000001481c40100000411d0c4091003,0x69260c5120535a00c0d0cc08a0c072b40180000000002281c401704304820c0db2900700000000000f8190020000000000f40b20080000001e44406660183c3382303029710060000000000820590040e18c2420c0a2940181c118184080dd280300000000390a02cc02000000075088059806000000e80840133010000000001d0a0660080000003b84804cc03002c6488818145a00a000008c260a032400c0000000110281a601000000002109034c02000000006a24029804000007082303523014000000094220446018000000003a240cc0100000000742202980400000000e44809300800911030820494802801212020900c49005040e38e30604b2200c00001047409036400c0000000e41202c60183833422c301cad006000000a092204b18080000000124740f3008000002423880d260203422c304101ba500600000000821a0518040000001021b026300c1e19c118180e5680300000000390d03cc02000000005a1c07180400000000bc380e3008000000000ba01440180000000002d0388020001241183804ba008000000000b830330040000000170280a601000000002d06024c02], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((((((((0x286084ed73394201868d918a053a2218942820871c4be3409a443e5e000081e6210800985084021420a26f13a9a18bc6bc9692180bcfc2e) <<< 16000) + 0x140d0bdff5e9400d46c8ffa0ca20400100b00100008d114c158a584c528165c80b02905e88b2e4a599a0db8f4cf02000e535470202f1f56c6a48183c0102ef0997702fc716cbf5e93c60cb29e3d3c24a4b84613c1af5b34e959020800205d00b924995f8737044800003ac1fa4284292b1fe920826c71d4088840c05853eb4418f0cc63b3840000001029d9c109402123808611a01851400000b6ee208cc6905f832628814522d292140ef2eaa2840816f4cb00e10401ac96950aa0800000bb8080437091db8952004a020a2800000e785383c80277c732caa08220bccf6c981b10405101e7384d5504000003b53802010f50a8d41ee10000ac371ef10c1400018d90bfcd010007fcfd7f370ca89002e03000011a900042d313c0ebd860dbd05871ebf4dec3ea74a12180762cbc98a8bce140324443a8f731208ca54e83295984b0428d10e572b15c10440667cf386be820000018827676f2a3b44001a026249000004d2c6870e07c50aaa01071ea16c088ad8a420030a553a720c309337ecad767820c10f32af09400000004f1a00e00abf8063cdc040048255cea910e4801581400008609768280011ec80052c9f3464aa4cb8a2e1abb6d8183250ca752785282d48b4d045094054020bfd4fc5c98007c0205d80381c06a201a329186cb7695c16a22284d9d0f9f5071002c952bdc65040f691df15a0820fecf36a0d2209b3b8e2d89c1000001d04a999100052040820000014946068c0a4727cec4186aa596502e69c102625bb9ca88080260999a741041f96e5e2934c0000001518022007da2ad9e4060034c63efae1212005204000020420007de4bac245d40a00056c20021ca40a4465d20314901e0501a346f8a1223162727021e210198200f649d1692040f0040b4007450a72abe07896eee8eccd0c369fdf79e0b1dd6b6424041f00817402e28805931db838fc2d7620b22303d6adc0258a4181a926a418d909eb8c90439d7c87bcc004401092451b42d5291c2278d61689c15612f484920000249690e66cb65a8383807c3982a00000009609009740a44a380402384f1900200040000d6989e053898db0e3ee08a9d9090c07d954b82228914df7a29064f493764a21011ee6c8a58220d03fe04e00440108a28f442449291c014fbee4c70e0ba46475420800003004e906d66a2410088611769c8824829878208c0083c68a51c34a0000000c4e15900240140000ea90003542000cda4001dac97380e030e3556c278d0018cc68e1e7de627230559b254812020f0040b98165ca0388e7eeb55c230d887a32f0409511bbd1270615295150386361098d098224a4a138080098e6f7a9384100042480394e0ebc4d184b3d39b7c50d20fe1472b40504a75b2fb1c28078ecf68d2081ecab7b3c7820ffd2c53e08006c46989e5200094051540046678bec6d28a24a0e4e895010140221f7cc8623850090825a99689145b6dc5afc6e5430bb55d6a89ccf04092a71145de0c10fc68c3647ec1061eef51021389a22400b80e000047066581a420d4a79010cedb5494344ca65b0e80a0a19c377aa101f7fcd0c9041ccd602c84001c3043d5380110042a800fbb17fffea79009eb88fb194202808aa1b794cc48a2c6c011c7d22a18619527be326406461ad1e651e1409a8a5bb9a7f20832beace5d1f70a001f9c22cdf41c684801701c00008e08001db90007d2200128e7cd0b42cbce90cb3bf4dad01aa0652130a292f6490034345907332582369df96c60015d8256b3820f80420701e64dde224bb209d3aa6382342e9310262fbe022200ba5cc1210e001be0987820022399d24e0040010b207797e6b79041184bdd33d0034615845679980e32544c6815106188c7e02c1907062e04b124932033fadb0ff9aa60083b739a9d03000160ac852df8900290240001029000376229a0a05f010002859000f7e223a3225c1105806800615496f8e800aaf480006cb6c265021305a0996c84f01aa3b4000000474e624dac12f374152602313022022c12811410413402c024044c88008034528165c80b2e30581482cb88165c2032e001c0e000f199ba88e037a75ac10185e924cab14308e855e01186a8c637e8880a1879b08901000160b80c24e104601089e01d06b4fcb1c37b349af0e3ce6f5c7964860e99b983690208547c4991041d9dfe1080000693f3c6270423008490012c4c908610218079bc082239bb8e332638f5eb1ca04c10ac5dbc7490202e7fd0ac10000012925ce0046010924a30f0cb044813d1405492213b8f5f00412a2d3298a1860000124b482093d42612a00000012c120000e35a7820025c7dbdec801080200006d880019e10004c42080039101f2236568b1c6ceaca5a8e3cfa125c163c2006cc7cbc58403bc7fef090800e81c4e10101f171f0449c208c0212203019bdff9c2c7255a9f5744071e4f7748bcec2830666dfa58f0a0802bcbce2d120201731ba3f8c2040b8cfff21e50000c6c1322692001250f955a04d89082a020000109189e0cdced3d2840557c380091023e892852240037adcb058e1dfd0ec08e3d11c34bf0782060175ee1a080da48f8ed00844010920268df251581b26de62a4811a9307ec67f807f099239c9c55e660ade5a82448393681b9da590fcea411c6f9f7bc6df6d0def240884823ef52654661da48001597895aa5bf4a3102001b285e526edc8c0a5be74a3b084002304c2250281839c08df44807f14c2b6f984883e6cf988c1f44127dd8cd0d7e92218013e01f863a40305bc9fd1249650602fa2cd4d8506000258efcd462080096cf0)) <<< 16000) + 0xff7d71ec42400bc0e000048240014c8840008001bd8800556981c18517ce1203180d7b45430ddd1f136620281c56f2805042c0754540e0003ac957693041100422783c3b81bc91000a1a4d58e3ebecc656058616ab743e24087998c7fa8821c5ce29093021100424801e64bd324118505cad8263a8f3a719e90828a1f7219820e923f160982023e610582000004a4973801100424957a4c62f92440000250899c459292184849f345b02982301aa56b88133f34cd66186000024964c22b8e9e89060000002582900210080000db900033620009124100070208b5be9818c2031817438f838145de78eeac2204827f187f7fe40900235ba2b7d81000000005262008001d68776f9c000001c8b82005199aa5ea36f0e2056050000209200102e745127a2a7a460a000004b00e12fde499181a20000023a01c35a6c736ca2877e98fe4b430d127117660e024098dc5200c5a6e309c11030460200001ca22241b11309e0802a40eb5d1a1afde460d806060000047400c11c8b6c8ad22045f782be4b841531602da6400000096010842b7e8a31007ea7e5194103121300c000075496f9280075c4941188a04b44ee5201f2513c028007ed095198e86000a4c0c28427e8ea442819146e5c500002f9bf0209020800214225806c38281ef105b66482076a9ab8102ded4d27848103e0100000d1229413802008020114070000100458e1b3e62b0c141a8c45c9a0ad13c476041a1cc14bc8000d9f323ca001545d694c003e01000012320080a0001752052020001dc25bc2b2dd1109888cb7046000132db0596d02c168165b20bf19767d82e145dbe747249a99b81cd5043a0904a18a1060cb08208c04a04904092ab5a4f74c6423856b1a82944654ee9dbb7014274b028c2235f19767d82e145dbe747249a99b81cd5043a090821cdb3940926a1db7f33b02cca18608208e04f001000be4662a30dd517432cd6745ae31323f454099c15799a45ddb30555ce5851f461a00049e4530662962b14a1196c06cb5c265ac03b1c0a16e40b1c34db434e2030f84ca7aa8408c40880200081b0d30df8cbb3ec170a2edf3a3924d4cdc0e6a821d0484dc3c6fe672058b0e99fad14156124d556672eb25e4846842668a60a58a10238008001e4617de29ed00a136b12e8eddd3260b85c58be166db189c088da6afcda5fb43ffede481d64b8b44c30c561254000c4495e04caec27430b628d255fe58fc01f55e1024809337913cba40d462203b9620356c6b5a8544ca280c332a28a73f8d0d01636db70558061420d3bb3a18b433cfa18bc0d6c5fb324dea5d02bc6d35eca08415b39ded3265a95ae27535708b718eaaf72e9b61d5bbc340002aa3f62e6d83d9856b1a4464508082a2eeb9a28a4ddbcb84424593c44c8f10587125aa2d8ca38e3496fdbc9c8b7b30d01a19ad80d804206867e1dd1cfcc8731f307ab846424bc2740002b312d52501488800277896a188003b089699e8adcc45a4522d1090009dd90bf05c9003111e919e141414fe460820d9c9b18084620440102d005d94d173b5e8618f58bfb89844c9b848201632a17f81000a2d13e092860f00434cdf7949f52124bcb4105420ffc8129208405439204169a3ed90200f5dcdf426041e00858f03515fa21cdfc81619eab2e1231f0b2f3bffdecabc222248318354f53bbc40805e587a2b77d8b0a108b1b4b8d545314236133bb89871620d78d4e7e767420462c05acab913b5443a400cc13102c4819faeaf0402cbed9a8775338711245f01f49d0b6a408069eca3446d8d6140d250b15aad640410675109bc22cb10bbcece6cc7ba1044336a9deb50711006fa97cf47e1ac7ed2400c81200004c04001394e99be7c799a42490bc144a841e27b95a410743e82a083f6e45fc0401f0765773000f0043ca0856c7661bdc31454e99756078ca090201962dafbf88fa78e0dc2e464f1b7554406297581e77661e184951dc294b1d4a0c78dbef67b90d01865c49141a6b45840119c81c1df0faffe2e04801a82800009f0967828000f248005019b295faef6d0c3ecf97d693093fac1ed40206a516cce0571c74680800033b16598107802185e18e5b822099b1c7d31e12a77c538a023308650820217184172800f0043891cf99affc84c249fcdee1308e7438413e87fe7cce05030d2cf8ea73b11830287e5fbe3503023d696f8532981c2133f624fb4bc0825557e2f6edd050000d963130ec2c5fa900300400001259000359259c122cd0500025e9000fef3e178f7fcea613199f1344bc023c5fb70f4135e051c92fb06882183ca06de42c131d94b4054e72574011096789f05facd8430572cbe5cfccc2f504e46e2cf78afc97350f90b3d831b4fbd08d4fcaaf78eeeea7546595cbd28176ee5bde04607e34ed400c13e85ff6258247e99ef165293c3c8208101932086f7c6209dd2c55b56c08d192f09deac5faded5cf70e32ca7a2f8f69aed201887c4998206c30d57d48fb8d11fce6e7c4227ad835e249d12a4972a71d6baa9e7059bbad2be927aa2057e57c16600e891380664a882089512ed870ea05d76768840741deb3481060c823c1e0897b1e869981084021650b2628fc05171e9163d8409024b9f4748306739d3e2010a7c7de9930414aaf9ec0800df02e7b9c008402104469499918e38103876b10995cc11c307f9ff6d52421a280ae26ec8577902b22eed620bc50e29bbf90c9d2da9a20084fe2655cd1618a730066f9e026001ea13685d3d44d648018020000092c8001e1100050e25961a2ca09015028002e3c80e0ac0981628203f19b12)) <<< 16000) + 0xcfa48c180aa8f3cc71236d55900a0d6c7b99299010800205920398e29bbd41a80e8eccdad840b5b7305c458874771a9c9821e10f038682002b8fb0cc0840010d20427bd312c20382321e38c3186e1f7d1a17840a9c29844050516ae363b12d0c26b05b33fa4342083c561bbc980324fbf48b9000b4172ebe09924109c0700003e64000ce88a684f8f7686f35890c988fb6c8388046557b8506ba7cf61c602095dad564022895c28a3000167a64c938410004307055a978710f180810e705d145a6f23581b0c1002b04a68f1c40e980b1c20413c22aebed014320e67c1411200403f2288c4001f8d373aa8392104c0280001ea20be02000372301000000a8c01c21e4b5cfbfe344178eb45472186c783e9b140a081f68ed1998a14b187ac5360c14ed8e2b7c8800459a2767882001945c66d0001224509c0700003f84474644b8220b00d0a48280029288ba06cafc26590132bd05e180879dfea870602c3d30bc40603f0d53c27040bd2820c66043c450cfde5840000023a00810ca8ad8500002eedef8008a208cfbe7f840482c2400c163888b183408a0a161010001181c280ff8a5a48e0803e13a8c66041e3dee53e2c21165b5676100807e90565c104db89039704801165b426c0409e0bb2a70208820dcd75ee400260e094041a18cbef9cb900c0c0de106f300685058856019a242007da1ed8186101ddbd587dc6054285772d6008285a6990de0300071a23533c140006f081ce000c12185203881c037a922e2880803a0f438bc34413d120232f141807284d930030e8ff9af2854384a0408b07f4082eb96fce259140034d851bbd83003995e573081572105204080c00000384070c34cb04ed67085acfcd3b26880000035701877044505e83848b69c87b03803ea2401201001586a18dc000c844e6b681a420900300003ae4000fe896288857844588221601116188881844584222c10d16002858404000de0417c940012164a8cc7004010040b380e00802008a0d2eebb3c082abf05ee1600563d9cc4c107801000013e400037081504f846e21716b24102bfb280080dfc930660f007bd8d4a20806c39e723009440840200002124578562cc1b1740595f82caf81657a03d1380db4e68a0867a440dc6074da96ed8204593142d0104bf2be30900a8a100020af0165760be311db3c95b30804ec5452ca9d8d1531b7eb73271677de0e8d3cc03968d0a4e3100ff1d3a44da582a00414edd06e2c37625e330cc65d66268dc9f311476c9610e339c49bbd86282ffabd05a4d7bbd14289a0806002c0ab7fc7eded5386dde98675a02e889485cb41ee28887ce24a9fe473627137468d1082fa5bd6530195cfac482a17084fbfffb9972a6960efb09d23030831ccb39416f4754d0b548fa0f309070ea39bb000e5f242008da7874fa6ca148d7a3c4ff57032808ec7a561b9ce6356d34c8eb132eff2c1eb9ec72b41a74f4a2fe45a37105f2c4b489a27ec29a134c74264d5a51b2e10dfc94119058631c2bd1c31d404840003d892ba1d15c8881141400127670a282356f2041087e01cfc602c96bbc2d020bf77a4e20480079e763690000b80fc840815a44fedf80201392110043812f531a6fc179490b08f6e0cb133cfe81f4acc7a872e89f6ac9fc5d428d3542380952ba9d3f1bd01f650ffafa72d738b8b23e6e94364cfe8b695129690a08468fa7be3ca53aa689239a2c7ec58a61094a13193b6605444ceb4d4b4d3e6fb116983d10d65cbc7a4148bf1e9d58d2bf75325d891e1908871bd8d02c5027460e5b1a7d5d52d0d9e4e678dd5b2c57389031dbd3bf666b83cadad6033d54b7ea455f8d06545d471f275c16ca6cf589a161292499a6db807606eba2000012a2a72f563e7b0ce9a0d50197aa3ab2d2f9e644eed056176022d44dd3f21705c52ac2048b15bb28d51e05ff89fed03e0d6b377e56ea29a8725ba32ad14d358a2c521bfbed579ec52f8fe04a8ac49cae51968c3c843c4416d6da232fe3f4271b92f9f508da3b33cd8f769af41445b8a102209378c9785c00001332417c642d832000b5225706a2b72d15b1287d0640a612001811256a822b40d0025a8128d0de09731f1c37a319d5e8d94999b244ad8107060b88ae37cdcfbb07322a0a71d63c018404c385ebea5e0d0b02943da700dcb3a38800fe31e5b0385ac9846900f3d2adab29c60072d271e2a1224c95a9899b0100c3511106600f6d936ce02f066ce9897653a229005b2171d449906dc7260ef985b24f8a8d5a8d08cef018dfa828e921f6f1a522488a5f6628110d3d3eb57a4652c7c1707294cb064c633203e3d2a3e960354bdc0804cc0873203ea421102c041521821c11010812404023ee5d098ee199b1515efb40a24a3b9a8c03b1f0f3c5add34b10d7ede0e41433af57e9ac164a205f444d9e2f182ca7694c9a8fc4d29db6f86387079b7e581f0254b21465a0006a44accc44fe5a2b229158928a4894560422af1d0148c8a2c4455c1a0b30500048010a74581084ec7090040cec14c2c4842ee467faac3430000016e36002810fb70a6781ee2c04413fdf95fdd1c0053d0303de7a100e5cb39fbabe7000241c92265e84045000271041a1801e305903aa12613840000009600c312bfd7f3e2c207fa6190c041593a3740420002a8cb00c140281f5ea6f0000134a57920a0209002182b4688e5b34145a6096a79a860807457f9234a0c02011c7281810627bf3cfb2c20000006ae028406035476801000a6b059170000f4f218b541c908270100000f912820d1408689dc3403e122ad09000048ab024556022aa)) <<< 16000) + 0x0113c00800121095196e83abba1d1074128cfafabd901dfcc36bf59fa9266a155fdc23cd6628a13737d3ff923ea853bdf5eebc826fb88a8529560500c3e9431abcb07cb27eef6f442aa582c899527cd9004414001419d6e805a3a33b46d8ee3038dfc4c1a874c495a24362791fa0191894ee2a905d6fc3c6d9eaa729220ceb2bb2cec2ece008d8900a59c2da13fd3ce5a4b57b4edd7d7cb7f1a38303cae96ea3bb8dcaf1902f8fa0c65e67bc60482538eed79813f2f4e84d4f5d5fb94a2a7f1ce8c90a8780853b31d5a2bec7fa7e827eb723ed2910332ac778382ad2009f1841e0001ae0d8996333f2888686000001518058604a9015f7c502189887f87a3800832d7929e2009071a7962c000462f20e3c0080b2c69d96483930a221ac00123981400c33c087c40000000aba9b248bc8243c1d13052c33822c2041200140000c000080378a0140b1c7903058fa1f908d230401358bc8f71430b6c1b9fcb3020b3e86e9e12c200000059101420281633160040034e65ac6a000173e598bfca4801400a00007e0941028a04144ee0a01f05154828aa01454e0a2a605152808a90044f0020003fe254653a0e1608aa731b35ee466576b549bb325e4ace87786cd657c9cf5378be0b2486022661741a6c1b0251baae86f07f5b9fdb05e9028acd5c0344b98fa681bc8281044d632e44d9a9b2acd0e232a25d74a045da27d8233795d423202a6c0840c0800998247ad7a409386836f5f57fd0216ccc5ddeec21124d08b3e395db01514008f3920daafef016ce7d254df033555bafee409049cb8321fe40c7f76110200cb5085d63ab18cd7fd47eb0ae7826323fb197e2a12da14fd427ddc60c68ab47272aad2cb23c0f8bede62326d945b5f9673ee6d38aa110871da6580006c422be5a000d1b251a1398c66406e529960dc7a547d2c06a97b81026508dcc8ec816f99347aa196b58d3831297ec810632a21018c1100880920060228a002dbf5e1b5d1e350fe41804644b4b69f1d083efbee606071b954745763b007a4452180babc059073ca175e20ff4694525425ba56317539998e40123755e79b544ad23e859828000f28947248a89140988228a351508a85dc341660a001f72323b1dc1c9247133181f9b62053f60991e3010526dbbc140c5aac0f88025102100814d04c59c1634a0b2a001e0ecca072d1cd48e27393fa4fc0e0386576986112760815397341f246450268f9be9f4c8120ad64504bcbda202077a9a000da8405789ab8d70180804b18ecbceae20004e209202e03c000124129f2194f0cca74365380b1920594d82f89096cdd26cc241919bec524662150d534a0c2133fcb22431a13136004032cd0176e0260c220080a080e87e40d2c198e29a9e40eaca1046f7a7882029ada9a0200002ee127301286108043ca0df9ed2a156800d2877911536cdb72287aed5b7e8ccfc087153d423a08c74ee2840652fefea81adc40c2a8cf80bb51751420ff35f2e2c2494404ec9fb4d7ca9271802036ed569c87080d6f69a430d816000051a4000ec0c827f7c82ddd6c2376ae06b19b570358d042d41c7c1b90c05a0b698e1ae5816669040a286102500100043efb714dc2c4ad235f16d59f0d6c5a8c891cc1310a9fbfcaf74a1472c5ac290633d00025b25342b1671194c86ca602783941d44bec713a41e5abc386245050b81020baa6f768c00a2be82e820064c4b5a40020131410804000050c94b968a58a452a42294150004cb9293198148cca342742a076b0df4e20547e77b08da28452f8d06e84a042e23417330e09d2c23f3c3180a34900250c18037ca4fd068100245ab195ba2002b705fdc80033bf2cbf25184181380c0a48745223229015147868a2c242c6120b30100015b128e4d8539ec08417cf219ba6c680bcf728111c3883c6e255d4c65e60deb77a1aa19f69f439b25ae0000000000000000010ebe292df415d41e3c4fcaf21dfea91622b941f4ac33527cd800000000000000004090a80aa62eb02d0c1c71060c408901042024ea6d5b3be626a5feadd6ad94349357dde891dd03253f1113f15762aa11817881084bea422013e390002583b0eebd29738f47dedcb1da13737d85254ec10530cb0293bd668396bca18d1c6f817103b53d464aad0a8823461e28bffc7538a4ef80470303ee790cdd363405e7810f8800000015753649179048783acf0b371ae23cf362e54889cea98da0d1983e1220e20c20818810e081f6a1b97a013925cc0998ce03287bc6401b53a9ba3478786a940d09e000002db5b1c0785fbf31a3a4445492ad62c913abe39d4b39ded22a79b660d0003ef3ca532c19318cc80f8f4a8fa580d52f702073c866e9b1a02d2a68ccdd959c1312606a1c9a6c029f6c2032c61831430c12401404105400388da5c3bcb38933f9e00e523ccb3cb09f589422515f72b7c13fc526006fa2226bf144f2922a1bafed8d902d096a00064040a46651a13c18c85ac9d802f3dca04470e20f1b8957531979837adde86a867da7d0e6c96b8000000000000000004322851c51421011801400c041050006adb0d215fdbe992c3afe266bff74a9f9c8abe91689c06bd1bfb7020a9fc2c1f7aee172606f77ad42c2f67ce81764e528c0d1458682cc140006f64131045146a2890d00085f1288550150e8214240044b0431047209fdf20b775b08ddab81ac66d5c0d63410dab81ac6ad5c0d6336eeb611b904fef900424384284204102380300a08a8a0097f490ba2b8de95918a8b13e3d1234428b9a4b1dae057eae40aa913bf5fa455caea5f892bc61c821d08094813b96)) <<< 16000) + 0x64494ef0062440a3ad9e039c84dc6ce94642500038d3812aeed0853684404c98b8ab10690c10cd97e15ada0600448bfb267e0140aaeb4e92bed0400329376eeeae445403cd4e613eb95044b90776ae21441151a050f29aa124062459e0b80c000049843119650ecb2864111a168a14265080a2830140ce3b55be37501c226c3b090daf0c15a04d7a4b9105083bbef70b3ac4002f4b5c2ecc61c07354edb16558a016247666127d105514153974e8bccbb406a357574832aa93aa168163cd2855561a64c3cc1b355267cb634a27da29e06db3091976117298f2470000003f4801c7000000530a02812572f64db850c117f9c97c72c340cf04bfb70d4028890c2c02879808b059344c31cf848c861a531451458530a1c849df38693f96d9ef58c247a6b8a8f0130611804000050480e06fcd4e54471ff84d289733c58b70309266531b25f891c0000013880282139aca0e2f8c04f1eb18e2171c10c86f35be3cd03d5de8928b3322010a8081a5234eb6f2c1a4c1fc2160d184848f5a1339e0847e39a989808f4a23cc3128212004000044c90304842c142140a000346221613e311390a9bd0c24443ab073cb20301aa47c0604201207c841043659b8da8c02aa451ac74700000000c809c1090021c60100d0b042cb6aa5b12ec6136e17389b8c239a30e2da96412fd188d41810b64973024c084601000013d2504122810913b84807c244f00200033424b62b28011d911518ec5e921838b4d94ed0aa58ff0e6ff4e121439b2914734ba2060f720c49da1a0866e47f48fc402137d313eeb82098a39f6a200400be294cd62e021209142a024718760338e2c6122aa8d8f48590180d5176040c0000006403020c6caa48e082440c07810601605c2a34c24e1848010e307c675e3e6111e1415b9382215952539010de99167c802feced78e200701479ee1260c2100800009a90461100016e1254191298a8948440800a00056324fe3327e0d92782e0418ca944309132c7250531e1089231229028a18208400202a2208c1555a14ce8a12388ec65dccf9d8e893ca6339a2a0754208040003424930c72204935d2dbb1025e7da5b4ff0e20512cf43fc0e088bb92e3cb140022df2c64a0a002656a282906010b9907f802a2882097816b3274a33cb6d1af56dd00a00500004004310d617e130be01f7b105507a4af59ed12298548f85b09ac1ca4945b82e383ac1cd3263fc818d12e7d42d08e20e18c1881020860040220bfacc4ae5ad071f73985b6dab597972410100b61ac75a25a28bce51db50b75077172800146100171624fa7327c3593d94fbd882a83d257acf68914c2a47c2d84d60e524a2dc171c1d60e69931fe40c68973ea1684b24b20820918a14a109109044c06008036c93323066bc288851e23cba2856dcdd1466284376a9d7532445fb11fd692c00a8ce5bcb040043d9dcf94670c240080000bb92780d93b84fc5ab9b74f4e6b8410b1e649e7358d0fc2eb668ccffc1d6a4844180000000000000000002410ede0874381daced09fb48cbed78558cc1c4ca66e57fa15a1adc0000000000000000008c448e48848640638430008082971801006800167927a1d93c8eec90200ed4db05901e10a65080a22ea7b1423c9040097a26da82851ec4fa056048bc4aa97be60a121819800639220000005dc01821ec4f949e0034910270145927cc828d40511075a1ea6450aa53fdd18048a8bcafbd7a5087cd30556c488b4a4a5bb838013b3039b008004a4f6b12094081200400006a493c04c9dc17b48b288d080a9eca484e8442e47863a4fe97e82f9e92347f44000000000000000004312472442042432031c214118004130380200d0001a92054130005be203822a21ffc60f6a6450e18cdbc68d01c700fa32682212343b562d8ecc9119df0faa71640871e8c83da42033f3abf22860a10a6cb2904282007591e2ea402c290c2901c6d22ca234202a7b29213a110b91e18e93fa5fa0be7a48d1fd10000000000000000010ca76038e476c0b22882472462442042030407083fb0f7c5ba6220ebaa3d20a2dfe66f32ca7673358246720f5d079919d7ac02848cbf12b6e613045a0903865c1374000c7481006c08827b48b288d080a9eca484e8442e47863a4fe97e82f9e92347f44000000000000000004312062051041c32021c2101140410c0c00803400069c93b0e8534744ea13274010003c09273311391889c4c44e05226f29137048588244da1226c090ba0489ac244d40226901000a87926865933b0c999764caa32644d93194c310964c4432611d85f8cc980578476f67298610288eb25399218840c09703a08131000dcf930c0e81c09bc7015ef48280f5a7cd8dd014541540840079f3d4820319b5e906b800454bce28b72b39000e61731b202dab461581228103f4e91eb7e014e3a815817c30c9dbcb57b55a453e680000a6cc9b595aa95125e4c32cf3db054625a1cc2a0a001dace7e76fc00522c8874d5afd96a0fc0535b86fe8000df82ce0c3c18536c36009512e859b0fecc7ab25ca4569c0494752c4599cf5d52a37e1dc15d1603689d290440179380146d5685df465505feb0a8617241ca721c12f8afc1859bb294f003d13eb222041e008607621901a9608a5c1d26380645cd7111820f0040000284d0ab141b9820118aef288006c02181ce817decb0883f1694380c3641ec8c0074020000138497814000274600002008b09a95241180be7bbd22001a00800003691ce0512e80800035080e06f08134c6ff0c0d3f2e96422081e00808e84897004160020000b620780b80)) <<< 16000) + 0x818601b2a2800dc4d6a14002d5e49dc8010231c2200800005c900054624b62b25a1192c88c96037a04382912a9faca20561d0ed63b374402e7d900162708034b62f086a285faa72ffbe2f60852c9bdd9a6c3085dc301cd10c1b7a960f49a836cb83bc19a801251e61f780b6a1b5d98560275852f3bf563b7d4aca83fd38bb5dc1a87fe21d615230101c1c7e0fea82d96cffb63d24b3619d07f4bf40b80b2ff1a9cc19714d75cbbdd260757d9f44f53d555a7038834007f01d46b0f907f4450c72369bb20b94eaaee0efa8528ac69836f944ae4b9c4ae4a4ca34823bbce0025705c03004011a573f48a071420a6e683878061a190b45004f56de1012060f804000034c8b384c0f0064ac03f0c80357cf07048739c77c106b68e1d583004c5c4a2800905080021a5416ff636c7143a4697e038241e3c0900417784c7141e01dd8294685005f05a114084c284201000013924aa32000244200075c4950944a63a2521902004800279c9288ec9404649e0bf16ae6dd3d39ae1042c799279cd6343f0bad9a333ff075a921106000000000000000000090474ca5b19aedd0f8a98460a90c29008a08609600402080867d5abc3e21ac79b8e41c147ea358d31098f9005759ccb0ddb4a80012b61f28e92825be8c84843e415bffe6e26296c9d92bc80f92533b3dd4f5ff7aa06106dd52ec3a777119c30bcd2f7be133e8c89a85a5000470249c8b24d399261cc92cd649463249258021081f856490132470592302c914072302bf7bf285129580b18c60442213e851423318026b1208def728f85051a759d4e780a5dba9700009c6084021450ccf407005122341e5bc6042d21d1de1425fe8a2351208e4f041fc504bf143e78804c284201023f010000a7123a1991c86c91026486132420582982c8d817008e13c1eb83e7ef7b6de333f48b6ca904279d335339ec0590a20a18a10409e018014020800571f96dd4b955983410bd35e7fde3ec18e17983057873011e212e439a3c0b570a89bf40ce283057d41be8c1c734d04cc3085534882600048384201004505f4a98e440dbe155bef3c936c779c830e368b82565c2bb820cb857703f7c2265e03ba3398d06091318cc80dca532c1b8f4a8fa580d52f702040831951c1894bf60cb5ac697cc9a3d50811018614308d008000433085b81cf55e491e2554856264d3c3af7b1706d0fe11b9f29b930ccb15dfa646d06958fb379afbdebff955b921791beb68ae13f48ad74262432c2eb8e1d2c310099c2908b1f34001324920928900740523b23f0d0003179000871247c4323d1191e06c2fc176ae06b1ab570358cdbbad846e413fbe4010aeed9dd60751cc05814b202b029578e5f73ac12d777180afb690f8b7278b727b6908288206504304184800001e3bccd97ba4ec2310f6b50a42621bb6c3df893be186a3c841d123eada3f574dc9c66656983393647d837c4fbe35bc5b520c82c6d92101b546a5881afd4f96206ef3e1724504638ff6ca1856037df880204a384001022e05000090122d1191d88f01c19fda7e502df6ebd8490685c1e2f1003e171d660c057b2b1d8800084a583e01000010e24745b2392191c06c8dc360a61b23609d08d708384eda24b9704104eb1430bf14201c277f280a04dab081ae0831102ba697a004323d83045463e78cc3cb6fb662f9fa1029e094db15aaa5b48ffc248400dc6f50229e32f8a9feeb76160166c045785420939ed9972000000a49083c8ae264ebfff34bb017b583496c7e13539c2c8743080e480e338a2134d17f3498200c137c19c087304739a381458c74c700004a404401023501c0d01ba6f7c48e87fd8a0130dd36ba1ea21246de199441d0336d744821845884898107c0204680381a1488b26080e2a72b31a283c1a0e886580da7331c01811d4db336128410004000040880d86e43011f024da032018389b0e30e5a19512008867b87d0c00e3ce23b8407bcb80ec004c20400100001323c580ff35e49e4851ac158222808e396c9c298840426a000ae25c520a04bac782f0205bea03b680138a10004000057c90d888868244660a0005733a5002c889c4e203decf14c288af3bc3c81c08f7b92aa812061080408c807e288a5ad4b1c5993ea3a030a9323cd0cb091db12359e021e4607d0250c1f00879245de03035a2290e522cebc70a5ab10fa820e2a1b015b5c2584f90173cdd2000d052782f628166787820602037d54e9acc0644061301000006f480016b1029111188888c0460901a00409000225189844b268523089f9e92a4289eb8b09c4184e56ac95c7008e807d224807451341c082004c5840010000140245e6222e11000651922d2191608e8470194793f72c49e0482469cc42ee10e2ad5591095412ebce074dc0bd4e5e0780203bd52fb17fc55b51404f67ecba1848ad66973fea871172b4b1384b09e4df7c1a880063f45a5f78636a6792a3945cd3ed91cda3743d8e6b6b02be6585bc48b5226e585806598878ab3dc5c571835ae15e2ac204c8daf6f3de5fc8d36cf49874735622ea80002e1c263f818051c1b59b914f9e68d0cfb2137a952f64a116258b15e4b9718e67f0070bb2d8d5488252aeb6ea84b6ddf135fe9814b33a1f26581c8ca791e9e1d7870075dfc000a1da610b1c5551bcd3e084eb3a10c5ed31aff4ad736077c6887a0071080e00802221f6ffe4580c2cfad1e287805570ac6c303e7bc25d80120a0f80420c435adae4001e5e3b12044183e010c16042239048400f9519830d67c5978026183c0080000a422161a00014e2456320002563408032ecf2238202f)) <<< 16000) + 0xa455fcf040cbd4759201008ed8ac01065ffaf7de24002763b556600220081150088a40445002227010698088980443e02225010000ef102921c8529f1f820c042bb1a1f80045a5856e008c407c02140847ab8d21c1089179e9041fa89152c480267de464100031d8e8012860f804034c040002284890544361a21a0510c82888c140004844888464420b80509946088103744562f4a809b6df5b80800d922fda048184001008001c149b4e563400128c2e3e48107c0110000100451337ab629441187c05d1860c4096655110000dca760c0017cca7405025ce7040660020008000094100016534168e2868a8007b9adb8844103c010000079203c1a00029f21a61b8863d955089044cb3d6a2056f7779418141f308c1015be895e4a0838010b092dbd7a2c0b644abc9020d00200001b8d0e19eca4da80442e2aaf44857b79b74c502242c345a7000d5034e812841000400004049100680841443e020002d020523b21e01c0100401043a030030190e00e6102668ff614222b85b502052716180c2004843379048103e0109880a26f243104a22cfae70810c101b4a8c0011fbb4a61204108040000368d903928798287e9a2727160a67c1c543047f0b786780739f3c90250c1d00800007a10002d63426ae2b4848d200a8fc9f91049ac4d1e5100847c5924009050800200001b8486c544341a21909000244121829014928010340017666854f9a25b6f4122ab4eb81517ab1d34df0dfeec5263ac6c6080ce4043f9687d4ea4e2700b9db8b3541690872ce5a48562474366c8e59f8fee73ca9c47afc55b20ded871962a48048e5cd3434537f9c9ae1352e2e0c3f29b7c80c650ccf249fbe80dffa420c9028eca0000ab4f9105847061b0243f329a345f387391684d795fffd59bf8e10c5a543eb9c7ee1001d07c09da10022897eb66edb722a717ea4c576408d4a5e96828e31be3b723390c3b40002bd900188c242e3200200a200613c400dd4c90b16c854a6052532140de101ef216e641d5a4ad4181208135ca911876c192c35a0809eed1ee516d9db0e7715840c1f4c4b5eff8823273410e00dc8812b701f2f6ecaee0001e26d9c0c8ca156fb13013f135c8aae246854b2c800f898f8c62230a72579d00035f04604425e6b131c071c598fb0f3edaa22805c2eed9dd60751cc05814b202b029578e5f73ac12d777180a91831e19c19618c19e098080b56d49226f42350eda7cedc28185800aed3f8a9ebe456017084e58da27dc2c26ec01a9f30cc4e71f7060c5e32207d0e391ef89d512c393efd1b2ff60934cf21308198d3e4688fe64438496a8c05046f9f7a247bc81e3a444005355547cc76092e3e7d501271b1bd5c22d8121320843c6652139df947b87db08074cd2eeefd629d6403cc043cf330197e418b14431000070e484c964243bd144191f0312053a8b4d8e061777483d981420cf683d64b00013711da28003e18be14026102200810882c84007e48653651b8f1c079be1ca70d9e43ce94246085bb4fe8e323d4b2e08600f7e6769c130410804031c07e493b976234f1c59141ca270d8efa546c0406a2498e28120610804000036c907868838140004d045d03641a1b1ce0df294cb064c633203e3d2a3e960354bdc081776ceeb03a8e602c0a5901567859b8d711e79b172a444e754c6d068cc1f090cd1cc10510c008000303ff716ac4ae8883b63f8cd880817149ca8c9b5eeca1a7110e0051a311a8e1dce816f7c1f9f12f1139f231db1bee73f5ac0f3a296f100916022ef2175f593b0560a061737059a86ce2946415740010c4e0d37d8f747d0e9cd09582ca184ce5d41b0e197410d102ee1b20d58a794b0f56cd8660baedd260caa9221b704b99bf87b8280edfefbee1befe69788181c4b2e1c15e61b303c74d66d132075b500801e4d4c363ddf597afa92005ccc36537c042c3b8784abba21eddd21849e46dd1fb35ea972ab07340080522610f5b8dc99c568cb0ba870c7cce69ae3d3ee8504aecdb1222f480f1c61858c38d4eacb281347a7c678972fc5c3c309687bb3c859be5f800057f24184220b0500071c920a251048e80051408f6a481310414e7a1ec3d0470c8084140030c448218640eab10a4d90304e03c4c036de2c0da443b6c240159560e82003dfe7a730004040024442000878da56388f41927b68f7dff13004047b29e616c575879e51e9ca7e75d0323c891e692ab05163914300614c2201b8864dd1581726fb08711a2bade47a2a5cc666e4538419e1f27d8ed5ee9be024d12d8d0903981eff38a08045213b348e517773e245a487b9c525d474666830f7daba158c6644c5a618a15ab84198a9601c958f098a022ebcaa6c371cae0ca4b6ea4ca80bf141721d2bbeca873d0f62f0fa232c4de192c8fc6b73f360666c0300042f747ce223b6684d74e8681047e6576d39b575c9d1f9a60d4b16302304dcd93401bc1d7eed23254e4bc6905e20347300bc5b2b191020e804389f56bd480d164c3c1fa50027ece134d0054966e410053561fda5001e00840000401000004440004c090284c81024406130980910102ec3bff06b24c013ba5d5e00024383c0080000822402020002db23f80b8614eb27fe1b9b0f155d2055717746411845e8bf546efc13ef2b13d0ea4e55b493e581bca0000000000000000042f6d21f16e4f16e4f6d210519e166e35c479e6c5ca91139d531b41a3307c2442842813402801400000b54c4e48bdb39f78deac7c6a976dc10852a8b4237f70944535563814461a3f73ed7e6c757325918309591086fd2738fb12288280c97bf5)) <<< 16000) + 0xd079fa750bd99d39f0e5b9bc3a7ba66d96863e9f2969c23740014b890016c0a4278509a81f31001c0040ff80c588043fc02b03121f3f6042183a01000005023fa230a31183c82c7f0063f603a10239f5a94d0203d0a040503f9213f0400008c908002000016e47e8843f2221f80d0fb8280009fc8fb1e87d4440023fc6007ae5d8c256ec8d8541d99f12ab9be99be6c42362807dc4447e25d6c5092758788cd36b601cfc2c4579ce285a38703a3f12516fcf83d02308c4757d1564ac9b6f32794e38b2cb4f4d108294e6ce555a8fc0efaefd1a1bc0bfc0cb4b180ab3a1b4e860f095363717618bf6d1dbe27d5d482d0a57eeef74050d4de933fe9401f8ce123ac0c5208b5e9196841002d56a89f53b67d4907dcd594c783f610ce403351dae255d87c7584bd043f6edf3cfab6d8c6b2b1c7bf7527a1a39001c91edef050cb23218af7383b5bca2aca653f11026d93137b95d587f88d1fa9d8f9a2c1adcf10eaf1eb1a4b32920001d208148ac7d02785801b65b38c1836f410da30753116ab90c03aa5fcf2a4810420101f3018f90087c406006031f0018f780f0625cd871c0c1ca197a9844046eee2fac48029c96e9600009080840200001ca47b81762dc82241990183ac860d0e1f9f8e9c70a16e57f7d90c0458ce78a800004a50400100001113424798af864b09183a5c98304890dd5bb30143a11349880a4b67871c7003cd5177e30061a5024a00040272c210080000b911ed3102614829c843d83a04a190f58a87a83411c12021050002f111984d0f48e872c443d01a1e70d8f306879414004252401f86c86230c2fc4617c03f16ae6dd3d39ae1042c799279cd6343f0bad9a333ff075a9211060000000000000000000902584484304380180a0a0aaa024b4d5cf4463937162f371407a2cfb67b51bc30f32b195039083797a3a3a3094883a52555e7a1ba9d0e778365a5c055931aee7a646a97afe88d1f096c3f3ea65f1336cc6d900b2c82f70b47cce93f8de6a6540d54ff52f66a5b719427b0163c326ee5ac9355486e6bc4e7a929f26c089ab01684a598c66406e529960dc7a547d2c06a97b81020418ca8e0c4a5fb065ad634be64d1ea840448a28a68220258040000004d45e2d2a6ff43fe06e5a623025fb3aa048f058c14dce7604215bb6bba23f5edd61635a5a72354f74936192035ff6034582950007385e3836349c1fee1a76ec03e5541140a01ed2184e5e0b8b7125b979e57d6f276743b70b895c0a6e559776bd0f1af8c574ee9cdb070d6ee695fdc141015019c9100e18215d6d3ea79bd5a7a9de1833b99ae0d37e7ceb6def7fdaf9c7401fae2feb9ad0ff150155c870ccac06dbe3af7ee5c4326ef3cc33fc8f3464240412f551c060229c41683928639c7985fe53feee057717754a9296216124b4b5ec52127882c24e7d408f4998bc01036ab9f22409e8973f24a80002eda08a258fc7c9a083b35439f06db5deff3d22e04f44b23c24fbaa4ab38f5841ca07409c89a07d069a7d9b07e4aa4c7567464221e8bf899601766b2e02213de3f081c2906f6096395f16da9fa2c0966e18997604a89fdb6a4322b79abfd77ed8f3f55d9a3932e43ea0e33ea09810c5ebff04d587323b300373edc7c39d5065b57b2d3af67e6d5821b2021c1bb8da58f0910fd275089b9e04c0380f4ce24a088f89e4bfbacf98331c368c78cbb3ec36f8556fbcf24db1de7619c8699a095318cc80dca532c1b8f4a8fa580d52f70203b0d6590e0c02d020c654706252fd832d6b1a5f3268f542042c71c7340280200000021eb32a2523805a7ff0806c544acf55b0818c2090cca4373aceaccb954b196e96423ee31805df2a0483973732d494e5c4f67ecfdcf86e452967499d6089af3245c10108c31d3953001ee48e80020011070fcd0000090a088021a481622f4b24936122c5cf16003298eefa800463844010d240ba3ddde249bf462cb38a1820cd08e31800190c6bb92408220080f200878c043c4021e1010f00080005188ef8ac778140004884000d308003bc100125f23ba6b1dc2d0ed90c768763b233029198ec08c13046118231d7118eb06c7541780d52f738f4a8fa5ca532c19318cc80c2013852453811c12c020018040550d197545ddb8a5b64f7d802d2a044cc6c7a093457e75e3e44b3a0006d3e7cde8a967fb4feea8c422d91c936e8005eb3d2558f7e20fa18fba8827c2d04ff76af000000000000000001fb01aa5ee71e951f4b94a658326319901840458e48618280068048040000b0293cfb6f62d1f5c757e74fce1ba674041db36e2c4d064c126b2410000edb711182846102fbfc17a649ba3aaba08689f88e968a2e999e5bde529960c98c66407c7a547d2c06a97b8100e4cb66353c93ddd4e8c62eeed18bcc343ff5aa6145f10b77b900000000000000000088b107bb90819b7075d9602aaeb5ab58e6ce7fa3d276dbca584a00000000000000000219b4c27100e2816890a30a680280000147e3a2d93c7b7ec7e206de78101f59aca92189d8cb5123c2324e5fe0aa17b38d0935d9788044d00c5db1b454923350d135fd1116a40b77f4e99b8ffa2a94874f9b32432f31159064cc932d915387d616aca9a973cf9dbe7bb88d0265f208005de1490dfe0c2cd9f4521a79eced1500d4cb68ab961b3a691a9d84198f336726c0e811dd954acd96b15e0488ae8ab5f2fed282c2714ccdfa604c659f2c771404185a7c00009070740203a8230b3118e988c74847209fdf20b775b08ddab81ac66d5c0d63410b01aa5ee71e951f4a6319901b94a658304098c66406e529960dc7)) <<< 16000) + 0xa547d2c06a97b81005748e32f2dd746eaa49089984287b7ee7edd9b428412ff765cc0000000000000000008ae07a53d3f725fff2a9009d40e8a48f7b3103977199c8c4600000000000000001fa9452039600e00072bb8e23a93ca6014952fa1d51135fa7b5b5e89418919abda5912b6413fd81a04a687c2a46e0c486ca5b31bb3ae7755c7a449d80a40ca95aa2cbec0011434a934f129d2400eb05a6117e6d48654549d2d8ac0eb053572158ebc566bed4c32b800dd9f6c3fff2e24259089804680431c57001c990b751b7a000f784744963a04a174210e78e8738540012ce66319901b94a658371e951f4b01aa5ee040e790cdd363405ac41eee42066dc1d76580aabad6ad639b39fe8f49db6f2961280000000000000000086669270a880600005ba47d3f112047322c85df6e09bde33b9e5387e29cdd5443f915e65ee9aa3c39a9c9533d9ae6ecdc43d2cad7e9eea22f21c7d49c851ff7715720ae1f9704405f3686c0a8d51316b4834499e96e6a43127b3d7637d2090753e1bab9b763850005f95da0c71699120215a7490cd6590c29ff7b6c966535abc4fe15ca247b1b14001820800ba4998c66406e529960dc7a547d2c06a97b8100ab09628b56d0571c42716a5a77b15b03e458e60638678050040000cf3ad5605ef154c63c7be5d39ccb915cc28432b9280179a3415eaed30143d1e01e146a6cfafc3c5fc85c0014f3b9f6f3078b65092fa79a9fb51a70c3284f1054000d88800f4a91cd59052a880752403e120021392398d31cb5d85828c47437a4cab59bee7919b682b71008021464a91840f004072806392031c8018e380c718070361b8fee64d24155e814c82013318fb0e0160ed7cecb0055edc1010009470800200002184714543880be38915968220047f07961900376edaac000004650400100000b838585b117fc805ff107a5616bfe8b711bac3a7df63b3dfd32e054789922f5ec1f285c0106273a6b14ca95ac013e0f0de82a03edfba7efd2edd4ad7bc8fd87516383ea19bc4262f0ccd1e6f56d4d532208a90b1a4a4e76e076776edf5ba73f1a98275a5ba8d2a6df8c6c2ae2866bda97d3e93fec6f5bd9498a7c687d54b7d1e0487b5142a399601d305bf5b8e8577be87583e7a080bc913863f47072120bfc578d556996cc5f0da5efca11447ea82b33e086175e33c6f65313f1efac9fb000000278dc95d6bbd042e66f2a31f9aed8b62af8179393d327346b7641d2536d66db855e2fa1024639a620ebffaca079c39c0338aef573c08cfa19b0808a0ab164dea017110e65d265264bc7602bb16360dbdf9db129dec9dc2b313e826c99a6bbe27fb644cf455a7008611ba0149313801378598ff8096daf0cb7b1cb00013a86ac258a2d5b415c7109c5a969dec56c0f8576ccf41f74c5137523db20beace011137b700eb4cc59e81e7500000000000000000008c21ac6d7c9359082a9b8fc86dba7bee32571a4d6d82dc73ca89400000000000000000222c41eee42066dc1d76580aabad6ad639b39fe8f49db6f2961280000000000000000086e07a53d3f725fff2a9009d40e8a48f7b3103977199c8c4600000000000000001fa9430a28e00002019752c1b4ed042385593ab9d25c124547e0b6e81db037cf1b7872015c1ceeeae567b159c00805a7b6778a56a4d773e78f89a1877bf08b5d939324ba6c8dd70905be0f10fdd1a8588b4ea14a528d70526140ee58f0a95da50f4c87cef0795479cfb8eee75ad18d9abf70e219a45278733a1cea795e8eedb5845811e87c084887a43ce9a1b65fc7e8f7d98ecd0647ba5a8e616b5c13e45aaaf06f51d3b3e7910552c9e36c848b3d79f3fc351d6ebbd035d99e50a6597ffc316c97ea55025077a8039d353c8e267133e36277787a1d6a4863c7487892d1eaa14e09fc2495a20a012933326090e80061f998c66406e529960dc7a547d2c06a97b8102dbb9c879e2efd6276580aabad6ad639b3a3d818fc5bb2eeca80000000000000000086c06a97b9c7a547d2e529960c98c664061019448c09a00c00000055e21a4354dc603a8fbbf9e411172dab5099e5b484f2b873a3b6d4ee004f65ef2ca0e59194aebc6b249c2aeb593d275ef10613151a654b2885e9e97d67bcbaab1bc2b2139b35ee3305442febe38cf2b316324ee4881b9f674b2b21dc211a61ac6f7d0be07b0ddb8978db255fb1ac4d2e15636fd061c189a9c55da0f869885952bf764f1c4465c004f57f964351c3f680037491c3390e1188704c4380531bf290df1286f4843783a029150dd8a86e844372221b80d0db8486d82436a021b4010010f11005a6c3234a75be4991c4daa038c3e1d5131a21f078041036cca86c348ef8828067f8fa05d40557828282aa8203ee9d98884d712b0867136944b88d9f004b1ec4a16066fd240a1464e1e6d360a2d105c555ae573b40b9050a3d081210f81d00005b84018aa8807d799ca317f90a95d1f0a827231c5194922676224f0d00000000000000352028097b1aef516901aac15382d2e72f96a8ec3dbf996cee000000000000000000000000000000000000000000000000180840c30470060050155415504041852baf5cbccdf2dbbf3f81e99231dff688fa5647e6ef3602145410a33fea0eb49a30ab05caa57e6a0205022efca6213ebd74ded73261db29325c0bfe6a764f3377c8f95f6c597ae40bf46e5aa8410129218f62601a61537107fd215aca3eea54aa2d1406939046afdd27221bd47bc25be19b443a3c82d8864516351926a366020006d420208c0404d0e4e5c2bb820cb857703f7c2265e03ba3398)) <<< 16000) + 0xd06090ec3596438300b63574d0cb9e02d2f4973b152461c94da77c1541830c21410c110000001f4083451333a9f47549d7429caafc02e981747637de28c099ff71b529f76f9219b60478c6522733352cae2428d604e4313aaa09840c19da30d2cc03093f235c3d43825c46f3a2614135f92df9a06085f274e554900a6cfc9404081a473e795f00052ccc5cf400221252aff9c82c250100638080008808d918c6c4c63605b0f8298d792c6608632e3b1ae158d68ac20817c419840415d340240bc34d693a3a83dc06c840cdbccbce96b0af67976ce1c62a31d2cc490c206416af3963dfc63498687ab831a693ef090665e24b4b208588936e0b2c935e30b7b46141061b604f9bbdfeb482ff294fddbc47092044001e19080cdfc8f2acc1bcaee2a74f41fa280005165ff70fbac08b42a5a8b80ab3637202bc1bc8b94a8892a2951ec310e9502186418d5d3432e780b6d068cc1fa444e754c11e79b17267859b8d7090871040c308504204a005000405000fe92074319763df0152471e334ad0eaa0d663f7a841254cf887617d2e80f830d000245211c7316e2d8d604e051915f8fe0a2768cc6eb040c08ae3fe4284507f2d311800eafa7a40602bd3877ac01002628210085ab81ac6ad5c0d6336eeb611b904fef9004321a0db8f6a005dcb70cd3105816648c30a288102600100043efb714dc2c4ad235f16d59f0d6c5a8c891cc1310a9fbfcaf74a1472c5ac290633de20372990ae0029a403f7e6b977a42c80a28ae827f7640f075b898012d0718e69af68980288183ddb828b6111820b9812ee96a620255ff489a55445005da9b91a16f013882430bc0f103ef7e5dfbc718ee162cd24083499e5191015098deac0120610804000036ce0e1f9f1c572870765044f0e3314be1dc06145c9b123038627628ce8140b8b40db00160c210040d580800052480025091aa150b38886a4443501a00076b234e5b1a6258490ec1205702b4447bbd4512f862a80a2071c24dd5a2c15c3731440c083433ab2030277c75a440801b0826b740009c808402162b1dc1c9245133181f9b62073f60991e2818b5581f110082936dde0025102100801a86859c2434a0a1a4010000af11a3210b88c86884434212192050d0028000d8c8b8208338c433e3a0c705000677901c2108106800516c8cf2cc0708633a139090d7b0dce0c102c52b5891c17ed1359da2820bb9f65c43040e02a2b89005308fe755000111498e08c02101288c4410ecb4a8e83867c185ccae0118f2f91f1e79ac8ac4fdc4faa23f007200a226ab9d5bb060953fed38dfa90b4c5d66afd7a2308e9834f90f9fafacc1eb390bf8d357b120855fba16994b1c2031331dac4172da7f91b311b6fe8c766a9d7579ffa32acf970cdb1590d01cdc9f8cf4c7db4452081a52b1527d1f916874798f5fdb5cba186cb12a29aeb78e6f58ad6d9bb0c52d4a819badb4b64a0010cea672ba4168fb0c328be47ed0a1c68557f92dd443d4b41d8719b90bd55a81aab639ba46b6016cea32bf8c30878cb68ea935d6ad63946b0356d202d3549f0cba37e30d64ac394b5431e4ea50f9f67fd8ae76ecdecf091b734160ed62e5500f0d50098d9efd85cd11404a73a2a3a21696a18232ff7c2b786d21f8398d49666e58e56b0a97123fac832400000000000000000000000000000000000000000000000ba868f3b0d656ebe3fb37fc169ea1065bbad43e87bf6e6e00000000000000000000000000000000000000000000002d91010c10808409400802211d0b6a2264c5e658cd22df776b4eb0c0951119f5a4ecdad2a3d9c90303fbb3c72412e76966f0c09347edfcee8088a48731ae0abefb19ff0f36d33cf04ca7a2e53b4f9be581f491e71b3ea2f55767ed8b364b9a000bc243389418e0a000ea523387319b358cd18c3e0b633253198258cb90c0708632c2b1951584104e41b9c277b8791a1e3bb109d2a3160aa3c30528b16189f04fc133654c52445ef691855625e28a6a1e864b59a780aa0113202f1468cfbe37d238f66f36796e1805a34cdb1c1055f5202dab613f1a26d01338db6afe7abccfc2969374988e40c0a567318e7679c737d1fa846f138fdd87c2e42b1e623b77bada89d798e42e2714e8091afcda03f2d04002fedf66a3e002e7771a618438aff8030400387959e06099eea23f0235e4658b187273d8c3c5f44e020fcd33b93d016f1824c805d8042f556fe6ead3df609d3eb8a84027bfca92a169048c396b54b47dc6e8b51f78de2835704b6f0f984f61d25859100e5550fe3d75648bbd525392fc9c6f94341960fca442ad3ca95c1fcc64f9062275a41011ab671a678722a4a1e78318c33670758dcdf26c416b44335f4e339e8427dee48e43cf8431437de2d97e4926d4e01a50a16cadc3b042ac5911e67d215512e466420f78194158c988c2442632413c3254322e4188a240361e00138c20036f4b2568d0c00000140a0c0c2b9998f3a8c08ab770226084082a9f9f2ebc3080361df90b80006b7b519e22520050028a246208bd08ab6506014cd28b507342419c083c653101062e69c02c902088edae74a848482270d1e7a7702001d49d5e3dd8040274f24a38e18003a58358e0631bd92005a06000022c223e0b1050588f02c474163220b190058c782c6381631a0318c0188e00f06000d5f50e9230000002580b0ed1b73bb1460415e6fa5302c201d2ac8d20e002c38ecf34300eae3131ac00036d998a8404065abc88ec80048302500c0000f3915f29e9bc9c4691d9a48231d58c27080000023a1a2120aa2fca50602011c72820afc)) <<< 16000) + 0x507d48680e169f9330800180d523e0008109d715640088011a6e0377952048a225a745b9c20000008e868831ee9c6908185b9be4141863469610a020afc507d4808054bdcc4b0001255ee967900220040000df100b01f9600608ed058ff9e2829536b12877e58802b5bb6f5af812205ea963852ee050405bb428f5cf504144160396ec5185001bbaf1aa7a6404003f646ac78b240007664c2fc66fb7821480190203c50c8953eabd85851006f00dae9cfe28213738d9d6b28c5081eb068fa556a082c85f0a2353318a044413c6872c5b200204de0713bda030042bb9d7e72ca0005ae575112a42310e72006408800025e322927871e59871c2049a183666888183b9bc2bf9d0e10317f49d88808100e483b983c86122be3423574020d43e5b9b6a60e008968ff727d0600bba4b53e2d4389002c02c0148080008dc800394111f0d88286c4783623a13003098c584c62816312031880188e00e451e72d6a16e14537f5e9b90c2c4865d36a629102f1de11e63c0826a8408f37c2c10f396ab4770810e7f9320b12407723cdaf02000a5915c453ac890028020796222f158b61460a0bd99e8b3d8588238cd82b14858411c66d1a0c420465192491878104e00c5f21208800a1374ff0c06201dccd9cf95d6100c214ba55a99d42400b00b000044440a8062ea039243e93fd1e6346812756216a4223e3e1bdd4610adf3f66ee60640cdbd23f3412066dde938c0991a9b1918106a42c5657a581431c6d28adc801280a228967843420248d000000a05089a35da0f3fb0e1c000000960220ba27a89d800413859070c78881052b4664846002dc3955b90200650603f04924009c0600003e27494309950d951a33dcc346e3b1210121086ea9c3085dc8dcc0101044ffeca63ef900965887b44f0105635cdf41a2580f730d5a2e004090b52d5a8570a400a409124ab981cf490ac1c7b0f095b0beb0d10d7c426abcb8382ae3d248d3a40e056272cb686112c1b6c9752aa5508041ef3413b2e9340b89ee3f29db800153d10f1ec04825d2005c07800023920008b260600c0d430bd6322298888d3ed31298283f1f9266f528a2d494cdc768b51a20902992bcd5c1a0810488346e6c160880b201da7a598006614837b8c5000128cf53cc56054612006007018701692f9b8ddbc1f668c7982f3632fe6046aaffe98fc6582055123df18840212ea1e8c594083370ece75b7c580e432f4eba3408010e1727119800050eacf029bd5192005806089a148261ac022638ec4520e3bce886884bb73e1f413440802c340178d4c5829a31bdeddfb488191cd22eabb006804d18dd0876da300648acf471ebc2000febdd4c342d05012006008000024c20009144001c108007be99147ab4e7ee809470c0db2ca16bb2830c4c977c814d3820a711f9bb0c7a0a041ca3865aa160404324bbc72f2c080011ce8ff39750700207e06bdeef010041b6b83a5423fd9200600680a30103c8086180430a0200029c207e2b03e1181e86c610263060b18201c8a1d2c3cd278201451371b2f3f6ce1620440f44ec8be0412cc22e689e2a258604dd5b85d120102135b80d7798d841014500ed73c244040e4b35387c0058015e12d51ae1882012006207805f01e102170e5e02f6050c240ba3c4c1c030c351aa553ad8828ba9bc8ce75aae6080dc05eb26b8028632dc3a4d463a18603eeedfb38be60406e02fb00bc0184032d99c934013804801801c2860f0b1713d36018613b09bcc8fe4305073c31322a34145af9bb9e3206f14316ef1fd523a50c3004c87036b3730207858b7085b008204ca3428fd80300029a4c7781648202400c00e000049240012b48c084c010261a613c141875b2c34480a2dd9637f8780630300808bc1b63028620325d972c8cb082336bce0dda9a08277e80582ac3000877fc99152a2800a60f54ceae000069692c224594cca400bc0d1840d70fe6d4a218282cca49f3140a2e1486f81a3718180eee19bee80a1836dbe2f50d84083442aaa76b9400a34813daec02000c1bbdf8b58000d9e4404d345e92005805000022123000b17f05f0e095d02f3acd40d1808af1a7b2f440c343654aa0196bc34400b94249923d03082077a58aadb94408027e623786519a08345204d53348181098262be18f580821cd076e0f14a379e2400cc1002fc03f201348d00c3c381c38104ad3af3be01c78777afe5cda1870a015b91cd36ec071441a96e0570808a1807ea69b0b21738206c772aa7539038411974c48741f02083912239d00046f3c480198203c804d7da8d3e4e070e0407cf2a73d8071e1e491b9a35061c28055fbf8862301c510689a0b73d82286021844c1a495ce081b4489cb18e40e1045a66fe70b7c0820e3ee25d10c11bcf12006608000026620009ce7491ffecf20f27034606f2da0794c6186e6d53a697d403440250f3827a6a1840b694a0de32d1030514ffd81b8410202a1628a8d872c1186b2472fd980412801207d70f8e5b2400c00e1a48ff62650740434606f6d16c294a30dcda10338d5d8d10094917e55a58c205bc51542f5f103048c109d08002040789ec037294b04618242f070e02093a709607bb4e5b4801781a00008fc8be82c0012e0800628117c01000892917b058bd02f87346186304343341181041200c800080378703d1b73cd2ce83070365af3413bb8186b7a3afdb144e230406d91b19d423934306d91b350032d3410b68a0479877b18104d54a0cd2c7e04118f9bec1e6f6e0c004be92343e8369271a400d01200004e245e405a490b7235eaa09068c073a3f48dffa8c3)) <<< 16000) + 0x5e6aad0f466c460802059d74cdbb9a1811b97600acc4386037b71dc2bcb0c183ac6a4466c5c5822cd520a3ea0402090db1a558ae49863d20064080d2484cb67e9b08668c07a7f5c6fe50186bb618109298198200471e39d9320d0c0753963998b43860314be6fdd281830926fbf02f691608b4e6d0695b38104860cd677a5c5863e400c40f00004a645e0160009c0746068d28cf7ed00c1403fd8c56741114591d2f6dea3e08b0c01b532f2a92830200c26ddb7510c50840f5ba508c3b30009dbcba85f23c50031250c9df817000116b8239a3383f904801901e05e005a48f0c31108056b34603a3d2b92406030d51d9ac831906cd0c04da6ecf31a10c18463f5d9254ea2c114df542826c1c08237a731d2bfc8870009adf7a52e280800152b8f98c108b083c801982234924048fa6dd7acd1810861f7e5f78186d2420db6b772cd0c10dd6fe4120a183035a1b6c5a6d840c17e4be977cf42c11ad29d6a0e4f810491f9ca64b1a230002d6d930df743645e400c81000004ba400137c8bb828001e00c0b0bc4e31814ad0101818d93741b5a183050724a38c260fa4614008eebb3217f1104ab197aa7464ba890427aac476697d02c00c6ff0301cf6f840040d19897ca1ec00015121b8d143f1a5ad4a400d814102c2fd0b07b31f2c727a249e5359901413c2078d8ec2c40197a3bf8044412f60efda493440201fc715bbc78a040dd0b53ff5a240181ebe06f020000828008d3ea8c809002e03000011b114d050bb0285d404000a2c45d0242e61217201000a99901c2101486800b9448828680116c08028c611712d002c7c9170458b7a0c238f62dc6316d1180d84c20807e32ecfb3222ca1458000004b062872217c1190d655c0cc88b2851600b055e3cf9a4ea9f0476e213bec581bb8b0a4275c2e26d18b5d47adbcd1c81689c6d00000000000000000215c0e3a02f6e47170a95a6703e4502352f1eaf68f2c5bdd679c000000000000000008579a372671ce05a940880840880080121f5e7fa1e860d738f7caf43d2ea394031928aed5f2157a1b8c0f58538eaa79be69747fb962e7b374f9c51e7237caf1458bf1d04d85ca9cf59c45d02159d9edd44e285a1a6f0efb0dc7e8b6c6188c9aaf3d51e63913dd20b9134fe4012f9432e50425905d6e105e5aae4108206d9cab308042905211b0416d23474888000a5821811c003b2585401037443d80d00402724220080000ba105f198b60af8a0a8aa8815a914160d332705e5ae054e8cbc814e02b9fbe5b608a45b959364f0c958fdfea3fae1899648806cd2a6bdf29b4ea68bc20c05e42029d24ae517d95dc60857f024b149b1d9684978ab32875b64f922105bd117ba59409a585b2bac9c5944ea92080a68f76ff00c568896fb02d07cab1d1be26401f3c227c1c407f2c6b50cad5033993095013505a9e7c2e84ec914a65c93ed5efd88c9d2964a84248af214d426b96c01026dfaceba267e3085548c1d0fb7b93fc3d94b9489727c192be39b02f1bed5b6244212d48c079ccb05359ed02d294e5fdf2397382dce1544478b7081029e6662535b299a027e0f00d3895067bdcc7511251a2636797d1cb102763d996404274a5c01141deaf0e80840918d16a65009450840202d60a16a0500009b11691d8b406c11407c2646da3532411d35b6cf2c02385a1c61403570bcc604091249634009440800210429ccbde50048b55171141a5adb924106ae1cc84340205b42eca820f0022008020080000223004010040b38080000dc81504800065c8af0a85983400012153050b28285901400066840032a089698c4b0a6256431631582984f4c01ed90fd7fc307116353d360d186afad0750777185312929931c314408c97a3b924041cecd6a2d1e31802a4063ad795140000002a024c00012847041b3996f9002c03002000f8f01f8ff9e18e31431c774f61860a9188a881a1023e6beb0e10520779dd8794084e9402ab830207480a97e8408b316cc20e08206cd1ddffee40098051c78700bc9ea5e1c629d05e6a4780c311e80cedbfc34205f1c14601608269bca81bbb028104f6021a309181012fd9c79b30810f490d6533934003e52216a0ec072005805800022120008427072559b6bcdd186434b5b63583450787b57afa1853ed2bcdec9181b98685fd4e1411c6108ad440419de4b23cb82c00e30863792180488fd98a2cd89002802060e0ddbf23f3a247109bbfd8250c292b2d4b11e061106dcf3b04a2084340f640fe30300000094700c10949b2133442080df31af6b80834e01b0c93cc89002902000010211620100021798259c95e07f8706072626043081b103b9e9dc205a8f7370078e09ee3a07ac4083c95697b1512001773b74ac4001ad03a2d7840163621d5bdcc801300c0584042c00215f01000112915e118ae88c570462b62315a1181f88c564362b013157018a800e87025d2dc5f7124734307400d74186c78bc6551da405000002bd5e0345015278a62cc1853a3d4550aa2183718eeff1aaa0400350b5bf64c0001bd0cc013889d89002c0300ab00c260070458a93d55751b590332b6544cdb95a1a2923004a5dcb860e1984c718a569041610cc6ccedf2a0b0408445b7290ec06020f7ab5a49588ae100062f087ca9a38040057bd7abe66b57a1204801a0282c9462b15672438f2e1af1cd18637c4cd668a3de81d01185eca11d301621e29abf9c90404aef4ea60001a47387a00084020000312748073910adfe4410812c724e510e0c0eaa8ae28c981041e177a24d1c2021faa55cf6403041d01f82cd20010c1699cf29e0)) <<< 16000) + 0x005bb5cf03d200140d9020be514e400ac0b164b65552b50d18d99ee65e6085d287e622c43edd4ce992215587c6bcd049a8188d23036c4ecc9a9c00840200002b84000e408003e1100405f1e77b5801d007183d1fb96cdc71402f366373c6105ef3feb7a84101529a88410b0c5b393bb688c080e9513487ce000afc9f379070008312da6a644801400e2883af88d6a4e181a51b0503051e74caed8c1012df2aae1049d0706730a0c5d5c0d0824000d268702700220080000b19c06a97b9c7a547d298c66406e529960c10339dfc1e09b816448e70a68a58820858618648460100401a00028e41b0142aa0200050322982314b098a504c098262a813d24189592907386000001ab808146df02bb6f1c5048a8d74909087705431c11022251901538403333d13d7808001b6acd4300003064054fe80c4141300a00007b88000a854c4427c1a00120e20be53eb7b45508907d18fd13f6e264fa4f9fc591a53c745f86c780000000000000000000000000000000000000000000000006043479d86b2b75f1fd9bfe0b4f50832ddd6a1f43dfb737000000000000000000000000000000000000000000000016c880c50cd08c08a0810148644ea493b065e90e483a9834b83f9153e26ade0a4393a02ee3e6450252c691194e76d6632561c33562d1f289e4917213c634e062cd22ea8a906c5442608a0315001d8c31e71e579101408a930aaf1e286c004cf0c34531e7227190586022a48453c60cdb9dceccb8618d0825e2141c10b901c2eac201d359ece0e0e12084e038e2c3479c4b5c460e1932d6c27f1c7009fa55c01181001639413c070607c5a3ef7008201d038095038009d64895560e0051743c06c81000215591b212090029024510d8935e71493e03860fda334f0d2a10a1ca327bb22fc514f08f28dfb3f0a5e670403e14032510892420077b03115f2918096a2b4db8d0144705e2e0aa0854fd230001bb8f3ccbfdaf42404801a82a00009f480024e9004018a780c44807a40205e56af06196930b7a5268a060a88e8a145961bda3340c20871867339204182a28a5088222fc77f563c1081796fd40c0068983648899042501040d10a052fbbc7122f22ace4749265dd4aa4a32040f2b8f2ee024171754a45200832770d069013000000140a0200041ad5028424018aabc2fcd212004e040e2428e5e31e38ff548d2e418647fe3e721a299fe8a74d30848866772804300d70ed3810e49d64b040021c641fe800210080000c49000397383899e3ad91c7db1276e070d3819db90710744764d941e6f47f8e3c1352ee3cc93040f804000049c82f80e499b6d9463e049047e337af00d1c08f433ec112302e8f81f841866032f673c068a12198963a8e100c110501d20103c459ce0f400045517a1adb4801380c26420de02741c31072a3ef92314f7e72f182c4e548432008d815a24020064eaf64cc004001000012a321cd69b78bcf1c6910820c8169629ed08b11938aed88f04245558381000edac18d9810800200002586233ab5ed623c623d55baa3881ea14f98a0e1ed26f932020f8040538040001ca453424000b22400324c8a60ac52c362941314905c11ca0c1737131038b404e2fcec60c3334b843e29a281ab08bc27a40b4606eb9bf70e2ae00d43315068805d57302d1961916b35b5ed07800c44a74c8a70920054050b2539225f8cd20a4ceac7911389738754811f4673c552088e760bd0c000a9d54081002c4fc232700200080000aa9a21181f8ef4c1c988bfbed00f993740ac70dcb8691d51049ae31bc0e04184270e8b0001e536899c10800200002ae605006441f2891c2f2878ba58c012291903c29775c61c8c12464dd7719410840202900200011a228e131460581500e30aec6d680447ba2b3920d028d30a2df9a83426258917d9e00000000000000000000000000000000000000000000000006175882fe0fe76fd31e288f3878884406fbcf2ef9c1673a308000000000000000000000001a3dfac7a000d38962e59f5317c8c28e2471c618b15301002e000200dc2845fff73c7122a6af2e51c7d5ab05c10820832a20913048e934552080150d52cc98008402000025e6c9491cc6006900a91080030e7a32fee2409271762b3c10a93e7906002111e98010046638c9b3820f8040000540d10746f5da500d7956c251c1068657e50829b0d763c30007dd808994107c02028a0200010f22881314305f5882fe0fe76fd31e288f3878884406fbcf2ef9c1673a308000000000000000000000001a3dfac7a000d38962e59f5317c4e2471c618410b0d301002367d422c5596dcba2ad1fc1d274213998fbb4e6984520a86e1cb0568030a137e34a2b09da0b3b3d00818a601db98d272c3ed0f704d7306e1509a2a5a0e247cefbb60822c01c6082c32231b3889843f3748948004f92fe70400bb1883e67041f0080000a8114205f5882fe0fe76fd31e288f3878884406fbcf2ef9c1673a308000000000000000000000001a3dfac7a000d38962e59f5317c4e2471c618e14b053010025803826312449d35504f85bd82f7c316a9b37b0fb70e78e1fd847a3688c7bb77e57c45e6ac2d98383be8622f826460db8a43eaf708d830ae1579d97a38e24fb2868b08219a7c7c64c22ced16428025bbc53d4b050c35a729a00f323db949c207c0200002a44001424d1079e5fd898388514dc07028def800920ea3cfc0258033b5700224a203c0100000fb20016a44004c1080e0a809814282020019c322802213f0d09f0484f424005c3c400ce68881988014f6089e22c4ec47235bfa05)) <<< 16000) + 0x884fdeb510bcb3a7a44190e5591bf3300fa4f06730619bbbdd8a988ad1ca61af2cf2ebedb390c80c85924dc9245cd407e5c2aabb1948206a27f9a491b2686e42817513ad73bbe03109ea31afb2c70f1508f2ac1e38850c057058ff84018639b199e808b4c8bdedd19568b0c7c241b1f5b031856bd1301bb572e27542bbb64f05d402e839473e2c47f60a296cc80264ef289be56c1fea9f355caea6e69ad52657aecf63b92636bacaa9a512910af7820a13b2d87bef07328971d8d9e1257896d0ba4973257f87fb5f1339adce5da1df669448150c85629ab22aea47f28eb74ae31a49254794d63e4e39ca7baa2b4d6de65ce9f5e69393f28f3fc4be7ebd330d58d9172b5e6b3ae3ec57e2d70c3ae00e05f0555ad2c19ad108c75dd5c122aed50edc1830ffb27826036e1206f42008245398a0120a0f80404e8142720a00010122701b913ad09dd4ee58aba6f44faa54f4264c52f44006c103ecf8400000000000000001065a6f9bc9972d33d4f4d672c4537ae738c8cfdf65d11c5b7800000000000000004072ed838410259defe0ec4d40bc62e296f16702d4e0c508208101d925d04f2a3f7da12698d0deee4603a602d667f874104440ab9ea24692066238b93867941e31bc41a66b8a5437b03999c583839f821f4d1e7eb53c8cfc98a9820946cc38c00b1fa3fa8d0e0aa089ca4540a8340f21a1280909382849804000ba64494960521b969be6f265cb4cf53d359cb114deb9ce3233f7d9744716de0000000000000000101cbb60e10409c62e296f16702cc814208c04b005001000b7e05a5ebec3464c6ed2aa959313e909740b8ed056af7b512199fd7f56b2a18a4050c5d3878174bc2810b77d852ec9fb0283e2e09988102fa992b87061f2fa043143061eed030a11c62dc9b820af35b3b58482189ad3002011b4d6342001814210040000c9101f1900f0a80744426e221360d09a8280015a889a16f0a3d73b868f06a3f7ce408080a59b9b0411ca702646001ffd82ea5001f008400004010000044401017004010040228080000dc81480e0500c007162410b6be586201ba6fbf782c00fb63a690402abef86909420800210281b2933c9c19448e1308618f3d6a2e100e537c46a00010dfcd1d04a1040010000101203a1200023222662a1321589888817c440061a130090978284b8140b40a0004ba225a7312c2d89592c14c17c1800001f2c06874f13ea5e80a133afa79a4020528b18ddca0412e736a8d982804828bcfd9880055dc38e56000002bc04080158ce3f6770e384c03012a0d89484fc822d6fa6063078a605d0e3e0e041379e3bab0880e09fc61fdff90200000000a4c4038011add15bec0200075a1ddbe7000000722e08014666a97a8dbc388158142050000008e83883ccda80808252302b8a8786bf7918362008bf900a323822367d4e500000064101308110040000580c06106ab5400386026a6fc9e20526f75a266145b48dea0744040cd2f21142420073ef1c318201112d94910204b06d8e0100031ac5ade42486120062238b2a5879c442462538cb8601430d47e5f12e198d0c0666dfa58f141008892d037c1020234e0d725210201ac186315d1001b01f825e31e0001a710640e4f348415812301aa5ee71e951f4a6319901b94a6583040e5db070820492239a39230c31811410e1081260200401a0002824000de0c4b0ac5feed92058308d84d5242158bf84a24005759bab29000001f408a2041200a22580078ce0140601bd3af2c88a2f492643c8144742af650a2d4631c3524440c3cd793808000b05c0012708230080000b7904001000156100083322501a1270909300800304089292e82022aba07c8080324c4af34139192a80040495bd25fd041daa71a9888000e4ddbc51c026c9512d5127102200800e828490142460a1220501482848404240020001fe223e5b1052988f12c4748623803d798d99bc19be2c301212a8dd2887871b7eeb987ad59aa8000000000000000000000000000000000000000000000002f08c31e29a28a20c18811c01a02060400401b37765f832a0bd061fd3c554c98cbbad0907986d2679ce41abe8000000000000000000000000000000000000000000000000000666bcc6ccde0cdf16180909546e9443c38dbf75cc3d6acd5400000000000000000000000000000000000000000000000178871c710908205000502be68bbceaf0b860249f87a879e4e906cf129b4eec037552f9ced4cb04113cd3594d72a5457631ba1d11438bc516995d77d88b25c40c19ba63588c1700f001830ba305803894adcbd28c1679e59ec48083c01011b0508d0080003d880032518c2bb1b5a0111ee8ace48340a34c28b7e6a0d09896245f678000000000000000000000000000000000000000000000000185d620bf83f9dbf4c78a23ce1e221101bef3cbbe7059ce8c200000000000000000000000068f7eb1e80034e258b967d4c5f244b245145204403400c8458202401b0300754e6996207814ce2443af709816882c9d63e4c90107c0202320a0000e5341fd2736a450e472ac3a8023ac06c10403b4d5d5a48103a01010d0100006f1118010002ce910c15c0a0a45e46060605e5a82c48608266d2240164be6aee848184001010b0108500845c040540200012b207e3b03e1181e86e2585b2811aba2abed477ce3e250d31348cc102d93fde13143dfb76621f5fecca572e4044ee592ffe27485a12e6d0bef73bf01e400d4bddfa53728580c15adcce502971331c0000002e20f2d2e74173d77fd7a211a809d73e0adc004f5385161bb)) <<< 16000) + 0xf9411f45e122304e8f141840c7200e45845c1a5889106398068598080024ccc94007c02022c0200010d303e60462b4a04ac083fe2000d4c592c5001dfa76990007802022a021140100007911130988902f0dbff49ed91a281f588a2c60203eb12629208c06a6b54880b7a2f7e51e00000012c04c0844010c34242d8a02851d6399745061f52414920a38fa45e9809ca73c6704181757c413000f80404440400026e444017d620bf83f9dbf4c78a23ce1e221101bef3cbbe7059ce8c200000000000000000000000068f7eb1e80034e258b967d4c5f150e2083c70c34c22c14c0440c000080368701dcbc9f7d19c823549d07a1d7ac78e016eac4404184c6012b5d14bf01861866f5145e3771308fc907504b8305820f6257aae633080000075a56bd4e55b400188200000860d0e08863dfac4115cb3771d8f1c0edb225b861869f2fcf64c214360947e980153783da5100000004b00e004cf74d56a0008c0214240000eb07ea0f02568c4a74c72eaa380d92810301614fad30826c71d408a0268caef4f8080000002053ce004a010000179200065c6450df94984a42aec51401a41215ed6e8240fd11a73b320210004043c140001d2400222cc0a797cc4a202999106e0f05aa92bca30016e873d0408d24ea1aca103a01010e0908682800047480063d910c11c8e49b74002f59e92ac7bf107d0c7dd4413e16827fbb57800000000000000000fdffeaa07c2e40b7afb08210c102e854411a30f145ff17c5b39e1bc5eaf41f420534124108120048371716658e10e9e277648928e7111b03a49f9d70045ccd6cf94029046c60e1540e16a5162fa98fcf8cb5938bcc9f9065507155ec1514db31e8858484281400085c4070542120a10805000b5f910711083068414242081205a09001384910331001c0110c40500299f10ce4106384802f5cc8810880488a08099a0902a590809cc3109600602a2072b8c3362846fbe57cc8a0c3c3fa5a2381023f1cf50c00089c75402800911f49982881312110043080fc2e0f41838dcbdb580c1665f0adaca00b940d776280043705d8000251c210086140bf86f5a3072b2c79712023269aca90c164557db6d2408210080800083fc041a6020fe0107e80800050487e008000a0087d92c3e8961f23b0f81987b8ac3d8461ea1b0f40987984c130261e4130820187880f8a217585a42443de849b88e23eb87bdd460d3c8523e63841b024b6e240910b9a3f100288adbbac100100027402100858c004c4294246886af4678e282e3b27849113d29fe4e6809c27c686100035496db00020a80f6600027182100860ebebdd7442874d31b8c7142d08ab45f47082503507a204ffb0e28d2400d2af1ba0a0646d0e7027002100860e02a4903428785e1ae96182834cdc090a150c7e43a04040e746b0b1c2101562e9cc004201000012f21e00a0ef0503c8282e8041720200030f21dc330ed1587608c3ac361d4130e90587400c39c0764006b1bea12aacca2470d06377767a15fc40e30d73a4f9e4f64cb1898618b282ccbc49a18ab43b10613d2101c39e7132dd15400cc304cbcd99d9a75a838a000b8a35d26951dc04003ca3ce7f7a4fe410002f5fc19248760c8f2801806c071449bd8c490a3482ef3e27a248ba35270958812df7ce68698000dbd7efa0260c2300879c011aaf364c2cca5e4bae1e5184b140352c7c5717679e50d782ae90f11000965560f8c0043e0eff09c008c021e680261f85cf3211792a166163d9dcff43ca1007a4b6163a6f4048bca1940a2f4fb3001080400004bcc0b03595c27e5946178dc778e24cd99ed0314357da6e502245c437d28186800158261746002cd16e9c13821180400005b4873048001144872888390461c61bf6d21f16e4f16e4f6d210504f30c24920c1c810b0c70cb00801000c8e0080340003e8871008001c5886f82e87087fad6531d6d3838c25d2051f773221cc14a3bb49f13a0a0a142865411998dd9c65182452577ee202192c4820b1297fb4e451685065c32c0b7d74b5212002314f0002b5c000800e8c0fd946cdcd88000858b3ef24b0ec19000059a40a8276480781bc20b22051bf41c40e832208fe1c37f5dbc64161088c0f8b040818ebbe67300108042c9060cc23dbcb20669d3bd5420728a29f7e4870e3161bb60c1021c2effc22cd00296833a9c280002a84e0a470028a74c135a4001300a00006d087082c380160f20b0df0186f00f0701821ea726dfc8a1cd3075952dcd291c62f13746d7f3ad460b60fc12a9f69592810824ec5d39bac43046173e3ab5a2492c0220ad93aed8c740002200166fc1320000f424040c1b02a000094086e8e8370641b62a0da1106c86836014000ca04070440027184006384e104612c13149c31c10c18d6a40d3c420d9c40c21708ffc0ea1f30b2403ba35eb8e3c163918a005d8e68982f269f60a00a334178c3c70ffb00008f4d0d71c09c9a40899dd0819cd1046a800094f6a1e806fabf256268e623221f83c0000b7486ba0c358272205d7e7214712058421b62842bb66b5f102fdca566724810420100d50186a00c34c061a4030d101f1830aeb040488d980e0541c479adadb58a1149ace30c40a3a8b2a5e2804af9dae5000261c2100800009e10d001c827f7c82ddd6c2376ae06b19b570358d042230a4062841842021822800438b43a6696f19a3f5d4aa4fc12a9851e3f8efe37146ba4cc5c055d94f16c1579e6721c918845a000444433ca411c420ce1d0668c833054196220ca0d0648483202418e0a0005bd218c920c50d0011cd90c44986194c308a)) <<< 16000) + 0x4182230c01105f84c2f80780d52f738f4a8fa5318cc80dca532c1820703d29e9fb92fff954804ea0745247bd9881cbb8cce462300000000000000000fd80d52f738f4a8fa5ca532c19318cc80c2032c7102281181180001a3dd5a4a861035fbdc7b80db7971c7f4f350e95d301491f5ed5b4744c545e10949552399fdbe0f2258be7cb6d2e729ce1e397613e607fed5ac0247f4828c63613c7e7701332baab446908977dec4ed89c3ef9d3192a3b6f50dc14b3d8d8b84218ee6be050f2acf47ee384282e1b3d1405aa3eaca02017447fce000002528210086922565ab7c24495fc7d0e0c20778342e48003bcb14b40001210108043460802bdb30c320808b8d0912fd18c4341821199e92810029b626e3a4a10420100bd0105e00c2ec04000020ba0105c80800061085c028000a648001e510902d85b8ac2d84611e230b50982a84c234261160b0b40504500f08643223dc044afcaf59aad31c5e5c83056cc2f8b13dfe0a4ac5b7949df325614368a44a8d7fbcf0c6e06e57025fad8280e60019b404463bfbca2ea3302efc224064ac943a4c339a8a391fec53874cc005019a754c863617e41723167435ed7e02b71b7b9d5d611c87b01f55e124f800ccb06877a551de817780fcb1baa36b0f784bb2dfe103b3651c5387415040a55e397dceb04b5ddc602ada0d1983f4889cea9823cf362e4cf0b371ae1211c50e28a21c01600e0080004874f7406ba296276694a41b5290ec19d800e1d501b4f32fa5f65c03a761fdca20c66b030a8f2014648f8632a5314061017af1b82039111210c090308402103032a4ae3060e10c7d0e3247cf145c1820300f3c96e07191e5378d63807bfc19350982084020166020001492164230b101d8c7a5d29b410306eeb268030bac0bb2ca8c186deaf87250006f45813004a20440100b0050578280004e48000682b8340781a0003fd215a330ac05e9212165e6a8821a9b46d6c5088d569ecdcaa8f7f6e77448898138bd536632361329c308394d82583b978244ee76206f03146eba8399064c6266811ee16884be3063bbbb0c40001c5766962d57baed7d00029e6b16399f3a759e6648f4c367266035146530cc20047e16734ecea39a280600000e3480052c10ab2185510f847bb3d3c38687a699cb73102026ba18c595ba2f26dd486081ef1e5a27173dbf45eb02060fa349710d7e3a9faa863003721c196edfc29e68c6a0003c4db73ddcdd3283757204fc4a0289ea71409db2801f12f936a190f6539c21000035f00743cbb6f210ae16b8b2d9e6906aaa22885e0000e10826a48131040967a0480500097d90a95985426c29d1614c830a51d81084f04858a0941048ec7898ff522d857142068206085e0cb3c029d2ec4d0a4a6a7cdc28c98b982a0fe409c0491e9e88f36d399404d48485bc900f2a4aefda94b5d430e4a7c4cab51cf8c505dd00c2049d819b829d1e983a76cbd06dc02cd7c13028127db685c443eb21d1ae94a7b7b8e040a0c0c947d604a05ac37bb3d108417ead9033c3c3d6dc934eb8c6bd50b4f43d6b8793317fb004f611912d93bb7f2d3ee9ad8c4098d440039829c54e02eacb8ca6b440f59108398bd4d0340e445a68718774aba9275f115f68287ca4735c7e2e32aa03cfe4173688cf1ac9833429a507e7296e4ce00f5a97370b3a89e7f95ccb65efa232481499ba599978f81f51ea2e70c69313bc744200b97fcbfd04b496eaf1197a0089d46e3cd429bff1f68d323cc5de5e7212e4e154167143c37fe828d11caec9c433ecf50b88baa68b741b497ede14d9b915b19ed5b1a2450a07dbb43807c7aede9100e94c62c2000023242000870b5b357bbe2800f1edb25811061080438a0038a4fd628b238fa9144784049047c684040290adacf20012004029004146030a20180008f90a1110058881e4241400209f01000112109e1d84e86c2702613603a183bce04fca09a7f735dcf0269d428305030b5669e8000090908002101e18ca663860833cfc36d3000e51cec200118a10804200002008d22da04b019e0254515670c0489b9b951800f804000028884d028264141300b09705000099909611d8cadf1dba841737c2c10581e459d1e800118e0f00400002b484a808000bcc84a02f4491631c898e10e04ecb21a0f792e1388e2a125bc20ae1449207b8d8c7c04e20580806d868ef2154418bee3b6852d962d8fef05a82251a49d8cc17718752b856000034bb15f8c0cd395235d063fd3e1eebee50152179fa5ccc1915f67fd2a46d828000f87f8da2c4403c109fb3e2d1ab0ba022c34361174c1eed1a46e0a9e61512183c2450f5ce9dd9c086ae7937eb04a55dd189154c77329bf29e535032cf735800028590932d00e04800255880065d90923d84888f036c4bc9d018d6d63249ca47cd1bd0dc2e8ba88f2e94024488a9d2c75491324bae2f0f731d8169592719317fbbff81605cfb74e1c8b31bf5b026445549d1171603a2de32208078c7920a4a292b7117abca0578b0f4157a81aa2a593c4a083005a85599924ae79ef7ee31c31ed3762060dac10979289a5210aa331bc458713dd840fa322b070fafd2fbc44c851a000082039ff3a4e543f8ec361b25d9fc21743bdd84a562cd80765e7f60f1781a578eb816d93f55635db62aed750cb339dc00268fbcafeb4d9c67da1e2727db567d91fb7c5118cfa5f27bed6196878c4902dadedbae4fa10d9fcc177424f171e3426c05e73fe33ad5466da13936a34d406e8fa8786def40b5d4a28f51050fb32c810eee49ad899835f6e83496e53c00046d9090458478ac2383611a1)) <<< 16000) + 0x308c0904584c2280741db7b1dd91f9342944c3fa02f7f2683d4906536a35ef2d17aa320ece7f5d6d5d973b8b18c87dc1c06280cf26725dc20670a6a9702680a1f68c9303e95f37a69c56d2d9c30efa97d1f290f39b105d0700798edb2911cd2e0926f267f35ca22f48c5ccede9888292ce27768c467d3275974a0c64e51420036b14853dc83358baf6f4db8b3687a60c3709bcea2978f1da395ad72f80f363dbac354df6ff8000649378417c4f97b62d790d5906604428e5079e7dec65677cf45792574f4f3af685385f54cf46400129065696a63fa15d5ee5a6d30f27c3bbf2e4850ac78a312d8b23ad3a266a962851da0cf4c5131c500ec6d70a04d6bb046ca61930ec5d3a6010f5d03580482040010d0a10b0c10a0a27e76912004b0b124f01d6a91ac0903070021c2956715d450f133983a58047e0d1209840e80238304b03d622872a253a8440c970ddc08600919c45c090207c0200001a2400062c80013698020080201e8040f202089010440080001d88148cfc193925861a097b493cc801283ea78101a1c702d0240c1d00803c80e018efb486e0805aad789800203c90f50046203e0100000aa20e80a087050000e79086218380cc1bc3610a1b0840dc8e0026bea2686369e1d44507280757c04823e82305a7000d83996a12841000428081d2fa844106c011c20f6b36d9a1132db9a0615bbba25080508f25684056f737912820e00400003ac8000a790830d84100c1dc0781d24829521045ab05a72001639557446083c010c26395b0da8822fd0ba3b0a186b95f491a00416d9298c0397d892c4a004001080000802000008880009c9f0c274795e0813220d4390823e3e0d940834f6d8a68f009991c5904a103e0100000fc21021bd0e4103c168306d1a21db5001461a99dca000e945800000b08bc33009430800201000a00011820f21a00046920fe3b0291d83f02f02d0b1d2224228816603c132f7861341be894b12009d8cbac9400700200fa0307c0183d80c1e8060f2030780183b80c1d80762237c2cf2143e3f4b03c2061e82351c30cb4a623c8140c1f00460703ba4e6820870e1034800375f42d811860f004000029480f06f8488e834dd443023beff91024240d3ff440284e69113c00bed26c21004e95172b00261420008000099907519c070040100000444000d1c83a0880014208149281cc2400197470523f51bab161946a16c31690357913230df89f28e22faec5bc8c82d446d6711ba8a811a98ee20a68300176066af2df4848ed0814631bc7014d442ca94c9cc9f96e420c878421efed01ffe120aaf7cc7c9b1200f3c6908ec31d7845e1833a858543c7f937e515bde124c575b61a8c9908a80d9f073cb9d31881f0002ca0ad8dbbcac8fca36fe858c45d70f64010afc5878baab0b4d9ed81237261d3cb33da3165d4f9000881323a789e5d8e45701beca78f9f4746bb4157f0f401e8a23babc493387c0d835b7cccefb261e8d8017c21ed7f018b2316235ec7f9570a7496a0997ba93c231f79b95e9a8154ace19a7604faa881f12b07769089b539233a8a00d280191758980f6bd7ae81bb424c05a814e572a2832f502eefd086727a8f00008ea200386841c867bb7898c8e3557aebec1d1e5065a740eb01aa5ee71e951f4b94a6583263199018404590586286206102700380000820820183801006e1037e118a492146c4491871a2921fd27221c535ef2f6fe702c71b24534b00533ebcd18a047b2fc8040805966e9dcc0520308c05182b81ee11438b26090d98c2fc34373870323ca9f098047504b8a04a183c0100000f92052230710d71a03fcc7ec610146bb9e890a02373f9e68a6210a2245802b89928c2812eb166f41016fa67628004e284001098c04e4872668c807d6cda38c38f4096868221bd708030038fc2f54181eebe6262013081000420784aec3bd1c5036bce171e38b23b4758c0ec0864a8140314000748805a6cba5804c104001081e0374db5891d0ff9d082823a6dfa9038248dbe178703a067d6f4904308a23713020f804002c04000276406c240005324000f988002b010701583786c1b82704002b5eba0a19506a0e4040cc043b5e6381e5fa6d7c00002424210080368280003ec83616c1ac37029578e5f73ac12d777180ae0c642d64ec016450c30828820418460048000001d9210db4cfa4ffba66572b270442ab064e7b1e4be039a30089400072c8005e0106a250348a80036bce82944933c24029e1059b2382419003d440032065644201db337af4800084a5840010b2029ca95b461517ac7da450d5699a2fc908c58e7e9c30aa2ab0e040409470800200d00b904fef905bbad846ed5c0d6336ae06b1a085776ceeb03a8e602c0a59015814abc72fb9d6096bbb8c057db487c5b93c5b93db4841441432421820c22c000080b2212f9b3f994bd86543a6dce086843327cdfdd0327e67ff489b1279ece5392cb443ca5775db5fff6e96ece647fa5fd520cc2d28001ca9067150330880013e882c148194840c81a0540d02984814814000d4c65cb5f18b411f57c1bfde48c52a1a857a00a92102759200000000000000003c7cc9a3d50cb5ac69c1894bf640831951080881861060c4042041043000e1fda922ac4b8313ac690d7af021a7d02676000bb65a0860b887f0a794119047cb8abc58a06bb82005475172738ee298853d9146e6176051846e9d97be430843cd8099381c9ebf21d0e010f393cd02c020d5dc0908003c1dd522006714220080000b69063198310ac184560c02a05f1582f0ac174178445599ae312182d0151b0)) <<< 16000) + 0x60e368d2cf41842bb4da8540009080840200b82b02a1502d82f092f0aafe924309daa6900c1a6a92e038308949218e85805b78affa2001e351a5f80000131610804000051082d048000a5cd0e345e962668435c6653a1425c99ae031008e3cfa9b4504c5730052804a284201005901c90287acf02143bbcdafd71a110a88ee145086535d8b0402653ac03b14135e08b139404b8ee3590002718210080000b410581502b868158240aa12054050298281480400066c4144940a02a04f11027028002f90826a88131140967a04a31024968120240089a84070b4062220065e6300d9ba903273666133bf82a54c8adba2cad8b588e92a0a91018819208e08808c00a0228b98fb9cfab09c9d01310168b011b00003b525f1d5a15722d6d421d11b04fb83e5e8b6e4a1c816cc8fa3fc5d67baf8aebbea1850d6eaa5f85dfd93b2ff3d34d755cb87202b0105012d5304017deeab42d55758b7362cc120f8504d6e42d40f7177f115d5ed9e6e6355a2b0109401872fe1fa8c8ac79e380f1313925feb8d1da0223b31bd8a6dd5039bda7bda90ac9fd3873f058d495b6b9f9539adba3a99340c25148f1bc506304e3079238686a17e83268431c0177a830424a81619a1052c0c377d81020f80669fe1800203bf6ce0051c50900500002fc6420772244e2823f8d3b34902f0fd1da80918a0f804011c0400018241186783f0b883852802dba1260380ab96e0cc08c307c02100c0100400001119084e688bb240d2a06d40064203c00800007c208a1a038050220280006ec82192c108760823304009c82008667ca3021c7eb744200305377ce001c3e2fa3802014202000471c54249da0c1031fac343037880b7a08c207802007e1303e0181e80e824865e2860232b97314072b14ca3001a00840000401000004440f01607603b0e5c43d56584117dbfe1c22b06e220e01a5f50268003a0088153cb14608034a0fac800680100000d640e81761f0ede37658417a94840e0a654f5da380783376812020f004200fa271512000dda2b4b2041c004000039900015920005a640a4240007fa7090147460d1f51d6e68b126d66127ffc2d93867841422887c39506c505962bfde058408af08c080241ed2bb9a5118afdc2dc6bb800a39ff0799d841e1e23aac5cf147225fad4dfd17a1c9a000121315fa72c93b9b487a53850422b30e10a93a358e1f1bab5e1cee5dc0e7fa5b9ed266e30163a934378ea75c999d39f11fb42a5efbafac1b252962106bc8b17624f571cbdd9c3955c72b4f43820ee2718019d74e1292ba8f9601d72b41a16204221166f7d7a74d1e6e3662a44808039110002f590380900058a10371501b0880d4440681a000c632066420321501882800567c8182480bcf405c7202d390161a80aca40544b0291901406809c2404c0a02505000c631009c812018bae70434657156c21810f386dcbf40a0efe176ccbc04048685b82c201804342da9a60080322cb17e80000362f29f4a4151441071a11065d52936c48ea1baa2e8052038c14ad8b289f32b91b8c6d841df7b4978be43f0f9a24aecb341a7681c0142070496d6464a600a1f20b927327088b78492e53be10c940c947a1400822b4f62e24667533e3c31802119e57876efcf1b254750a2cd69298704001c1259faf617367de02b6145466f195e924311a4b97340434558b006009b424851b72bf34ee82458976816cf47137a38f7c75ff1024751f2540018ea740f50b747ac808e7c4c3d3eb7d5df83f0ca2ac68065ce1fc88221bfb4ab59e1bb9514754d9230ead18b55784c0afb4aa19f472593d26559130471c595480955b01c51dddec65312368368015714e36cb81c9414c7c4309132c810632a400000000084a160f09916313ceb654aa3b48e47cc454f3b3ead820f68000000000000000000000000000000000000000000000005d21c51c318320014000044503248829b593ea1fbbd8515846a6db31e79eb16eb5b3f34e6b2fbd0e3f667b515133e3dcfa6c4b0914956ba6933a8d2b560fd34df661de31583ec51e66a5b2d552e7ff914417ad681592c6482ab00de50da250ce2b860000014b1b8201027dd94198008c02164053e591d31441d45683f796300c4fb5951628189ef3408412d0fafc7814062fca69189200000004b04e0048010000171365b4e61037228824a26b7d658c905280ae0a1bc54267678c0000060f9f08018053e36b3001180424724dba0017acf49563df883e863eea209f0b413fddabc000000000000000007f1857636b40223dd159c906814698516fcd41a1312c48becf00000000000000000000000000000000000000000000000003091641441630411401200205c000401a00061a400118c81204c08c26044130210981000ecb0403012f22c80558ecdac288087e8ca992c61409e03152869620181a6180000064ec226042400859010b626ad3b4a20b9b7684bce163008510514530823c1507ec19428204286b1e8eca0267e5744e721200000003a980321c10ac080000354407c2603c0b01d05d900a96d4a9a51011575b3d258c2864b713250d2b31ce55a1040e50769f03000000bf24e04c1848010b2029f2c8b30a20ea2b41fbcb180627dd590b140c4f77b58209687d7e9b8a0317e5348c440000000258009c30900200002ee4070340005dc406c14000cca40685403222000e582030320170d00b028004c0c80a98800697880a22804d040247a0113500818803cb401c5200d1d0060c802c54014220090d00404801c2400c0200501000ee99004710018c80084400202000010119741)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 41 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase1" = "QuadFullSixteenCase1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 41 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase1 private def zz2332:"s091c"="s091c":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase2 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l16 l22 l27 l29 l30 l31 l33 l35 l37 l4 l51 l62 l65) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1fe7d1d350, -0x59682eb50, -0x61794a440,0x23eb31710], ![-0x59682eb50, -0x2826c8cb56,0x1001a03600, -0x69ba78030], ![-0x61794a440,0x1001a03600, -0x3118968bc7,0xacc2b7da4], ![0x23eb31710, -0x69ba78030,0xacc2b7da4, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x7b421d22,l4),(0x35cca889,l11),(0x127de2834,l10),(-0x58d496e7,l16),(0x1613e760a,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0xd3c74f3,l31),(-0x336c6846,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x43acaa7e0,l62),(0x5fc88310,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x43acaa7e0,l62),(0x127de2834,l10),(0x1613e760a,l22),(0x5fc88310,l65),(0x35cca889,l11),(-0x336c6846,l30),(-0x58d496e7,l16),(0x7b421d22,l4),(0xd3c74f3,l31)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x25038802000000001380c4010000000443c0530080004a1304805a00600000000780248030002b0a4420488018014c4504c0184010000029090009980800000000b0024803000000006c01240180000006824063008000003204806180600001a8210058c04000000000480c401000000640b01c300c0000003212039804000000001601480200000c22880d86020000008239034300c00000431d80a180600831dc2801a10040000000783814601000000000c00b200c00000450580598060a111818403cd0050000000028016401800000000880720080000000008819003220c3041014d9006000000001300e40100000000013032006c4206082029b200c000000001a01c8020000000001a06400800004d0480313012841480840066a00c005c0a01c0175004000000004c0124018000000003805200800000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x510700893f5f31e5294ee2e5b60532c6b9ac978809d337cbc5841ec01d1237933400db14e86358c576453e28a14e01127ebe63ca529dc5cb6c0a6300acf87eb8e7f2b6fef11b5b103a080bf6314ab5a1f87356995fce16f04dac4dfc313f1d083c9821a449124c5662696a0248019e6c78c060e00000012c0a1c2f1b936bf923817af987602810d7d9260ac48014a4a5e4803000b048f305800013cfdd1fa690427008493a064e787c061004fe6363be49004db456a4060e12017d801250e0b468abb9848e08e1d92c405020a8262cb902000a5252f2400800be47a3460e9042800c0000fc10004013c78fe69eed7b1428186ca873008142484127200406172653dbf02020b0af9d51802089d0b5bd760a0003b7f22d74480061b2a0a001c00164fac7aba31218520200002052050230270de1b862ff5a620048a0cf33d851c1244090eef2a2878e209f4c) <<< 16000) + 0x0aadf806101dc46cf0c00382042aae7b3000c008e5557bd8e02002308da3b5300002d480b6a2b8209a12305a0400002333c67de1d33b2408256c1b68080db2b879a40c1ebc03fef318244b7fea40380d011a5380400bf9107b002011f598930000281c230080000d31ae12c2d4bebc1f55f5e1000712147908b090d600000121ee1ade06c502cc61870c40c708408104004992c1de4a3ad1ad7391706c04b0e5d38fa903d4aec825df29beb63a69058821064a00049e68f1d2d8cb1facb700c4d305ce9ec17f90d7c64ff2967cf800000000000000007e230430220218230028020000274f8ab90da2d2efc30146f9666b25802189ee59745c918440a00046240983404a0a0240170afef5d8e130c3043a1966ec3141420d69ee1ba7b10006b4f6c3ffd870143c3d5aea7e2800d69ee4cdfb410ce1511d6912a679fddeaa4a989ff72055f83081681420790e48c2ed20a20e8504106f070c06bfa7a6222860afdb84e7d0c32310bdb2680c1014c9815ea8106594bad5d602002edc4e90640800735f71034509002901c5962962b18c1861ec0c8aa142b0260b99c710eac35460289b196000e940084020000204408c17028105975ca811c529f0cbbe49430b6b595a97354c1005b0b917121022dfe8b15a1c2029b5c9e2fd901849ebbe4c8df05000c3ad69e6804001dfac82a1c9c120056058c30dcf10e02e248a7b2162c68b1b2f9c78d923050f8d0c85b46149ad33800f2443cdb7eb2a890e64b11cc1e14110b2a9f4e0000407e60534a4801300a0000798d709616a5f5e0faafaf080038240e58c30c58a50a288404183d7642461c414841cd98146a4f7290974745cdf008b21ed00017f2000b6878c67eb3be88480a1835cc1face5e2064488c228ef88c1121d8142a2301040561db55cd40a0882008fd8c422020d691e4c52b8600153e7dc3574001003b91140637d09002e02c01180c0880785974100b1b308409328baea28280411348699bb5a40e19ee6522debbc20244cd27ee099230402f487fdd79c50073a498954a8060030739ec16e0080108fe8f626a92482400bc0f1861a905d7366bf002c841e5c8d88ab9fc58d1d7ba65594637ca1861665fbffeb3494092afbf3639f1621c101fb5125dfb46b312d0600370540000e31ae12c2d4bebc1f55f5e1000711ad8d5e3500a21862c52852451c30c31c0ae9fb48f903da48362353742978f7dae8017a34f7045e1028000d690005e920010c24004600e180000038400816f8ce0941ac6146bc194080081017736f8c3080c27227a29a470c3d475b356080ae18ba16d007054486a4f4a020035e0ca4f0312005002892446ffc45240818eb21834020815e34ae6906c614000001c20080fe867b990b470c3d47568560708000007080040424568022e080190f1752aa31200500280001f83c413cf47ad8f14432fb53c9601041d4abff7bc0c31c787613341c2055a455f191c16894d7f3a018198f1fbcca014032fb5358e01000f0331230871208500280001f92042020200100f80800197480f0cc074660383301b1980d0cc0645772a2ce4a7bae0e6592e902aa3c74b632c7eb2dc03134c173a7b05fe435f193fca59f3e00000000000000001f90a18411000e00a004005bfa62bc6410cef9dbf4a15f9ded80f743e8bbeab7247509c8e0c8a11b71c412ccfc452568e053f1a6f2074af9ab60a31a6756c0468acb2f0acafff55804a5088da6fd6b5c27c1de6bb624c92ae80c00a08828e6e1a061009b36dd22c02648203407002655b3130800656172bc10094708802100001004586000dfd6316000dd26f58480003614f7100002f831fa0012b12647c4a0044010000107202e0b80400802000008880b06c0542602803c013b35605507ae6810a42415562ee93a46e5c55e39a6e2c42272b41299cb52fa007053cb4054000a920e7454bfcfbdbc33ce419ad92125049ec2041b108dd9561306a2d2b206a8eb1efe629ff403adf1b8ff41d0bf2a6c3bde100dbcfc925a334ce2cd5c74efce608226213c6c4f1dc94bc8560311cea8331817121c03612c8c06ad86d2f9621910608ebddebb0513db5133402d1e2192b42800026690006bd35c2585a97d783eabebc2000e28f1d2d8cb1facb700c4d305ce9ec17f90d7c64ff2967cf800000000000000007e5c51b6f879a648b016b93c6bda7035340539efa3000000000000001b1e8b89c4cefea4b016b93c6bda78ce3d1e9d2db6000000000000006ac8e891e0e96cea8215bbff3d877335cc5ab3192fa754000000000000000000000000000000000000000000002c29200c0040020021d3c4a86ff8a2e250722f3a6f0e46d035da896088bdb7e2b6582931707a3447f622fabd8c28ac0fcd853e9e4d87cec5ed4f0595f44203ff1e503122b53217b01b01a0bc416b9f3d46e407e37b6f660e4949c0b177ef75a17d01007e849aa72b6a589c6aee2d7ab51eb6a52100524381ba2196eb7fbd33fd5cdafba0d6c9d182650882deea0011e070bac908627dcb4265616185331b0429b9188464834c05c8b2e054a3ef6b1d8521e57381f9ad8508e541176e6fe11f019c13e6fb375e705a9b470dce4fd8859200f63cc386fd348a23993ff0537c996b53273f48408dd2626b96a06380726f8473fa9bb4321f6943aacb5099fef4d80441bf89f536c6085d0300fbf6d57e61002e2b6072cce8a70e133cf0c6591644be571539938b51f2bafc9f6fb673ab96b3dfc3a1325cac7709fd2e996af6305eba0d2c18d880361bcd2c12ce239f80206ea38ce9d8201cc59ab6fc65ee961364e)) <<< 16000) + 0x096d2f4f2caf92b023fcbe1123e697f53df18fcc99c56be57c743017ff2f4c56d2392a0af41bfc54788e797e70407fe4fdbb659d187196164b11d95d5ef536685f0dcf15c28be3f68953f749b265889b22e6d9e6107e3e8cbe60d81748ae36e5d0bcdfbe3eba27a3c4990e050103e3735ce7465f08791ffdf21e73229b63bc70a718c0b3e851ed2192b4cefbe92197ce5940fbc5f64fa579bb508b97a74b9559380915040688c97b9cf00017924007370c63e0a6f8b243d8f2998cd2ed57058927f26b3cbeedf7fe313800000000000000000221424a00370a143d2c45ce48d4f04063f12eb0e9503f2b62382b0000000000000000000000000000000000000000000000000000cc430c1862020823803000821ae28338b23488953963790effe88c13f27fde8d633ed873df3730356bac4669957415c24da2505da92e8766b3983146214d404c0400097440097fc80205c190a3c8458486b000000909231028820411208c08a006033ce4aeff8145424ff1751c0d6f10f8101098175b2c423f24885bc1641bf310bc0a83287a55bd95a11bc30c062daa729f1081403ec68cb6a9882496719ea23b220320fd5bef2b6e30403266f5bec2850009d28824a19060038bccfc50509875001781a28937ce36abd5f1641dbbf299e684a1edf7cdf1bc7050a21e2c2f771320500000062e080825153b543800080c8cf4f8a497e0820c4346b93b0a8d0005a0580001f234396f6a81fd01430000002c4c1234ad5b930ff8e20000002a30061c56626a0000e11171ef7f501209f8dc8bb0b9400002810f10120008086c2eac9200500300120100010710006b0201c1300d0580882f891132dfbbaaab87a79553274dda332a28cc785f696c3310578ad01420000004387241dcacf6cdf1b6897cb4b5eef3b48cdf29c84cf0c020bb37c4a05cb5bc1147621f67376d91fdc4047667d370f57e25f2030022400dfae8f483a9e0732112b2f8ba7f66a2ed5526b45abdd7300800801a8b746ca018713485d2fa914e2d690932d6982a4885199184089204f830a0ece0899aa4a517ba6a3362eb3fa29c5c59873dbac03acf949b581e5e458f4d2e06935b1b0685864c862612539d1f22e67ec65edd3810a0cac7ff4c1928bc861739d9207da545344ae0020020006de302fbe1848282a0410154972437ec4861be4a5835f92033ac51472e488c18154972437ec2041624aec5978280444d92eae700c002a92ef675d8200bedc0b9920118589112eb64ca44861681830c0d2cbc86a38309089e2ebfd582c884566423db41c702d8419f94a24600fbf16a56030504577b1f9342440dcc68a1c1624210c5c361e87180013d8afc73c10005702c944aced500160122ca436459557546124cbc78537acb23d4a67ecfb41630d0c923665124600000083d60488318a63353d49087e46d819d002084166ce8690e1400158120000780d9200000189c0b203464ac3cc943c8c5fadbca2050003572748588027fe7c0c440c195eb79ba14112e409665120111f47b85e8080000473d06212004e02800f010001021a28862ba3651c48c716306f9a628400028193f4122201dbef0e2071000000151805040ccfd5a2590c20000d639bc120c56bc0577fc0000000004b00922420a407000040e400225080706c0342771a148687423a2d1d65a38dabc4c43053c7df00a8f40000000000000000000000000000000000000000000000005b11c42021c21421000c04b099d485d48fc0e6c042ef059bd3645ae959043684c1e71967298c7af6abb48df8f0fbac36be70386c9bfe0ac65939d804ff3cb74c02a4528afa02d2445a2df19c28f4710bc2f954724c699ed0c29aa5bd00c010002311000fb5200402e1914ec3bb28fe4c330743229a184919275f5f57ab019ba16f470a02f14539129665fbe9b1d10de201c67efab3e9e55e05c67e41b06020fce15b6c5d8d82a54530560810347ad8689bc4c8e7ab2e54b1cbd03ba1b291d58963bbac4ea634d2ca640ffdafd457556063bd3c760ef659481783d145e76d0268081202fcbf4b0c30e900688800109fcb860040241c220085709616a5f5e0faafaf080038dc758d77b88fd01c1268e0a91431028e28c28e2060210a055e01b5ad52019f8dba8907c75c4fd6f6812b7057291f9d457f83101600fd4741b33805a99aaa48e0bb4298320063b2147908b090d600000121e61cddf6c502c8924718814514b0c6044009a0349acaae515819b538450858c1fd60f79a5c21643bb2147908b090d60000012460ba82bb56f4e21c46066c62bc238cdf9985fda76ef8000000000000000000000000000000000000000000001648b2c918718514b0c604a0050130100200d00024920007f8402c36014138169557081d8a204a1f2ec0104034ffdbd81820943e5bc470067662b700c004a1f21b544661423008004808000568800426100094d20019fe70cde76f6f63c050c247c0d37ee68b6384000000b71b000c14a861022eef4a284000000b71b00060829de74f24d3428035f79ba98848860005f86c21565a33882020c80f18691c7a7a428c356e030826fdf811cdd3b54870800000052e033a800c1175af81a79e4dcae14200000014b80cea003000ffa069a5a72135500004f2d2eae376146b87e0c107e0d000023d20101300705d0df2e7f14c058410000001518018100659807eee28362ce36889c04040000017bb00a03c335e8aad30c0006597a902e0002e4a634e3a10019c04a9c0c34502856040000213200c120050100200800c04000e4a40088400202000010019ea9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 16 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase2" = "QuadFullSixteenCase2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 16 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase2 private def zz2333:"s091d"="s091d":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l21 l22 l23 l27 l29 l30 l31 l33 l35 l37 l4 l44 l51 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2cb41783c, -0x59682eb50,0x861c46c5c,0x4bc], ![-0x59682eb50, -0x1f657bc0f4,0xda268f588, -0x6b63d669c], ![0x861c46c5c,0xda268f588, -0x3118968bc7,0xacc2b7da4], ![0x4bc, -0x6b63d669c,0xacc2b7da4, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x7b421d22,l4),(0x35cca889,l11),(0x127de2834,l10),(0x23ce17048,l14),(0x1c93e9ffc,l13),(-0x15390468,l17),(0x46cd4cea,l16),(-0xd19e31ee,l15),(0x12bb8b132,l21),(-0x4370118d8,l20),(-0x2f743d5c,l23),(0x326f97baf,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x208b4f34,l31),(-0xc3713aa4,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-12,l44),(0x2cb417800,l51),(8,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x4370118d8,l20),(0x23ce17048,l14),(0x12bb8b132,l21),(0x326f97baf,l22),(0x127de2834,l10),(0x1c93e9ffc,l13),(-0xc3713aa4,l30),(0x35cca889,l11),(-0x2f743d5c,l23),(-0xd19e31ee,l15),(-0x208b4f34,l31),(0x46cd4cea,l16),(0x7b421d22,l4),(-0x15390468,l17),(8,l64),(-12,l44)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x84062008000000002201480200000008c180630080000002106018c02001c8631480cb4011c21831420178500680870c60809174018000000002601c80200000000013032004000001c86409cc03000f02105003c40100000000005018802000000220a00c300c000000170501cc02000000000a40e20080000000029018802000000000a805200800000002a0c0cc010000000000d0320040000000000c0c8010000000b834053008000000002e01c80200000000b870330040000002d0e024c0200000000017032004000411c8b00d100300000811c406c30100000000002c0c8010000000541c0e30080000000025038802000000000980520080000002706018c02000000094180630080000018884090c03000006110408c301000001c4510320c040000b4421c016400c0000194450230c04000006110404c3010000000002a01c80200000004428053008000001984c0b0c030000000000503200400430a011014d004000003104408c3010000000c824090c0300000000007032004000000002701880200000000094062008000000000540c801000000001500c200c000000004403080300000000088072008000000000440c80100000006c24053008000001884409cc03000000661302f300c004d08c1200c9004001702807005d40100000000098024803000000000380520080000001109018c02000000001c009200c0000000012014802,0x24062008000000190901cc0200148490d80254010005611c3301a9004001504d0dc04a40100ac12618406290050000a84819015400c0a812a1a4042900500164480c8095401000530c82200e500400000000058052008000001c8c40d0c030000000645809300800000188ac088c03000000000540920080000184550208c04000000005d00a200c000000002f018802000000000b40e2008000000002d018802000000000b805200810614220403490058605344340aa440180000000d09028c02000002105003c30100000026914050c030000009643014300c00000249040d0c030000009241014300c000000026440cc0100000a424402930100002b24b40448c050000008239036300c000000000501c80200000cc20c02530100000031908074c03000000ce43015300c0000304890194c04000000c443015300c0000324860114c0400000c421809530100001ee3140638c050000007a32017300c0001f633c0438c050000788cb024e30140001822840648c050000075188097301000001f4610238c040000006229036300c00000108640d8c0300130350740c840100000000a0603cc0200000003c1c0a3008000001116140d001000000005850330040000000d0a014c0200000009824053008000000026140cc010000000942809300800000002e240cc01000000000b4072008000000000240c8010000000441c0e30080000000021038802,0x134028803001343704c0234010000000009002480300000480440163010000000110f014c020000004a0900b300c0000138110058c04000094260900b400c0000000078024803023c3182501b240140a60ce12c0349005000000682900b300c0000001109028c020000903609024400c000000c844050c03000000034240f300800000d42501b0c040000000948407300800001444101b0c040384688b200d2401400611604900e50040000005225036300c0000001e09014c02001b0460a40d74010000000001f0188020000000007805200800000000f402880300000007464073008000000211d01cc02000000000901d200c000000002c0948030000003215036300c00000000b00248030000000036009200c0001a01040098c05000000640900c300c00001a8210058c0400000006824063008000001a044038c030000006e1100b300c000001902c070c03], #[![0, 31, 63, -83],![0, -17, -21, 41],![0, -4, -47, 6],![0, -8, -45, 12],![0, -16, -41, 24]]⟩ def dynamicCode : Nat := ((((((((((0x103e56a14e532c6589a71a3240c3e13c2e7c81195480377160927e0ed321c01907bb07a3003f2fe1a3009c308c02184027f59390248e0e44af0260e595dbc33091c644f4903922b4b6d27221c05cbd7c656100c0511ce1c27082300861822bb7a183964a2bb422a4c61000000038412415f350f8ac50c04d0c0e0b12280000000d818618bc4b2999404e31e518ac48057cd436ff072104c0100001e720006e0647d21d5134001c612cf03909028518df56e83820536e8e0e97c1c52363e7b2d81c300000002ac28110e9249be604117607a39701001094e47d20059c881400a000080085406c040260441300f0981084e06a8183c15e5030a08dbe0af4dc910083459a5fd0e208c4cd42cce1841ef7208374a304000000040209052e0592fe730600d449837f7e000014ac11190c02009ca4a0ac070000452689600ae505880d947ec2d38a18194396a6141818ddad00180ff195c96c20051d38cdc8200cbc1934e04010272c230080000bf981ab7cf4cf52c4f47a304c7275e0430389264b5a1cea8eb03d7553d1c29324515c30d00dcfb7ffb5328a173db29f656b464353e3a1cffc028504e75e1e463152e6025f2ed96f0d6cead7ffaf) <<< 16000) + 0x4bf3502463bb4b840814f934df4899959d9dfcf62454bf2712f722ef953434c224ca98000000ed29ee62a778872175ee36af51a0d5ca30d379a72cc344ce975eaf2f40efaab960772ba1ce8915fa7d5df01416b8c27252186996200014d8d0f4e1e8e0dbde3040726eace95b0c20075da1f1ca0c08f0e135dd2904043d63e6afe4218228bfeea860c18013ea1d7f5840a006335cbd4414400fa05d290ae0000207ee4b0b409014e520a60100013410a51185208828c361441b0a10505000a06139cfb7acc08140a9dc9d8001c45d2022d4ff470ad0ec5aa24318241429be39c0404054ee1ee4c0810153b8fac506001fd94dca40140000000065400d890c2a02004f86c278160480a09d0103a80a489b986541aae18536cc69309042447db41f3c702184369cf582dc9104e6ce5aaa8e4243f11b4ca39641c30e28cf439891418d401f7e60a280002064831a89889002c0304909c99059a874458d26d7c5077a2830a0a7b446f438260842807edeafa648737f8ef92e450306004af7d5656c28289ab255cf8806000db38fe7c18f3882000c00f000041c42701765960aed52e2c867ddfa8b050b8d0036760510226624669015d996f1f014200f33af282800123b247c2708230080000b71e32611ae9ec8448963de8f863d1021a7429d47805062c1df4f37c08191acb38ea423855f0555620d140817af32b7043835f055574550a087e289ef30e4e2410a80901360b0930180011c90670981a02c0cc178531cec5e984e20447e5fd89f181840cc1f65a848104c6631ea69ce20302f916b943a1c320d103e60a61413a4ce40e38f140114143c7d0b0c004eae109648c312005805808c01c1026c1f79c0da038c8e53f723c73c48ac3134cea6ce638a137337a5b94228bb77a009cc3c04082c2abfd7375c286478f309e651030481e0622ccb183822240ef1430300821dbfe6943bc1fa42800c00f18495b448fb8904069cc0508183c3d996f471a300e33e6a1922800d6084a86184d21312b0c101b5a72db1a003782eb55d000480100001a1200088470c55abe163b142f9a99f7b7828800009da5b861efc23aa1143040005246e8080961b86ae981825877a84ee82006528126e614808260140000db909a0584c80c26007a303ac241d047c40c00483c5c5498e33cf52e7cfbb668a340e227e8a8122a95934d6ae0028bb29d03ae8c41221484bc0fbc6030028b85ad56aa06009b0adca61c1e609002e03404b80f09938fa41bc5124d3118ea0c1e58e910f79638e40fcf941c616e1f26ca50224c916ff89000c47bd0a13821180400005b084b00eca06dfd7cd2f891c1e707d5f982074b24136e260a18ec4fed9e211869295986d9e09141212091c0a2051560ac2a1cc700274cc7dab014000ba646bc124120054048e2c0a0a987b1a5426976a4f2490384034d86918cd01f228c211a19909590382e824183380007b409c850004089f98a800230080000cc9d280000068b20309b1a0a87487cc1f20da7387c12c7552b267b340718000001a940145b866e0e088080c072551019c142000000288008042af5fd164c21120854048000210212a130006023640000009360287fa0693c6aa50a9cf352d6ac914d3f541cf00a20000002f401c30000001b001870c388ce9806040275e16d00c00cf88748c0312084e0280940584580822804000460424c260018c8400548c800edd991e17c26e818838e000002a4202461f614f13ec9021a35c0e327890d0ce72f19383840000011ca01821f22983a339008ef20198340300000000e34189002901400c00e46c72fe1912d0a280000026de090f51046d6ba4406000000ea602423f512258878410f6420d32a0804a700b8e6405000000004e2024044f26b20b1194821480c0000810c8c66df8aae55188c2b60f920cfaad428ac5fe6dcf97ba0822606d3c3136984845f71a67f0bd9881360f92391359430140bfb2fa1ce58a01b744629285a0101360e0d3a5416f0e3480190200248041220200028721200b08f0184700e080000034d280c18b050f8bf9c50c9d1d4d4a52206c92a649f202029297d24b0f0e10a4c2c4e230508cfc2e3cc082046d252a37421000000008e08792005203008d01d10220b2871600a1d565d0291758c300000029fa0285ce592c95e6a488c5970f1290060c185173a1901402fe6c2cee401c00000002a30008020ee81da580d89042b02000010c105e01c9200000d34a03885f2ed086fa3089616f923262899254c93e40487e806af07d4406d0d34d32303065150f90af02873ca2ee92ec2800000023821e4801400c0230076460702ee924461c700000044364058b3be37f2459d0a14fc97c4003d00e203ae82da99371c2006e17f788b2600000000448e00b001b27f5c65e20600a8652c434602be2410bc0c00004806490000069a501c4302fd278d11844a73125c3f144c92a649f20243dccb29641e2038bb03b70c91830561e7adc7143b589a569421400000011c10f2400a006011803b234946959285f0e3800000221b202c59a42ae68352850a713c480e3bc0710038e0ac503b8e103ff1e927be13000000002247005801d184af10c503004b7d84d5b6815f12085e06000024020008d240023b4f1c000007ec602468e225c6c344910a747eb4d8f2432f7b4d7caa080ce680b71ad01c21047266c620204ac69bf37c00c000000055380100783dfb0de0912005403801801c8cdd255b24a0b5cac8105eeb93d83111c0121c047a1c78fbcb3f2030000010a6cf4c00102103df8e0e8340cc105002897da982a)) <<< 16000) + 0x0a12012461e9ee80088b1800000001633bf10071acc88043b05c000138108b0104500800135484484c0049b084400821c0400338e42188610a430842184190c20886102430802183f90c1f86702f048a20460a0882000118e0600401f4560f82b07b1583d0ac1e4560f02b077158120281d8040ea02b2615633d434920b3031da58910419664a2090cea9a4710420478b3d8b3cc000392e69ec5001e2d1ff98009c509002144cdf4758ac28524ba7c7e6509073a958c830e640e34ed0610064ee7790094408c021a51f83fa8d230aa3d4fc1b05123e4fd4da8a12770b1d1e8619f132fc6c1c01da71dbd20130811804000050c80013910740dc33df9a3213c42d6381e40aa80181b46b3220093f23fdd79011ff43d53964657ee523a000000000000000007e4f1ae0d9bfcd574ec98d81c6ff355d20f99641021010e08a0000000427de2e7e73774915cf4cb83f20b820f1584169e0c103730bc97989de288b3ddd6e325872a14a8a1725cb87ae0861ab22293d3e23fd119882559541873f0dba00087441cc660e42b0711183808e4813334839660800d7bcf189127eec6d4a981808f0938b243a1df58dea180339b8c4f002610230085128cdf4ec98a15ad6d52d39424fca0376f2800eca4d1460481846010c28f6801025142adb490a40284e2995c8e6200011be8fe010017238cc801286118040000448800108106f0d81606c1b8360da1b06c0d83586e484474d04ce488b5e508784c0c127bea8d121e16e58fed181121c098080831632bd1681026182300803500c1a4076494b9ba1ea2487e6962dd44884945816dc90e44c7e3998c08579882b4180095bc6134000001a562481006720230080000bd104f01034008000cc080039b90670d81a02c0cc1743885245fe238686fd26f60c025d63d90c001ab49edc00202800121e1100434502aa78c6285cb63efbf3411a0188f4281efef3ff90024142000803306c044360ca1b0640d83186c188376510cbb786230db6ee5788161034a068a630427724bf48610c1c4302a4023ab96296820e6f7fd0f008138c110040184060c003f878f609287d4b1af5b6815711d938ce86de5c61c0140551afae1afaa5f861edccf44abec00000000023735c758fa5726e023b5654e3eff1ad5a1bcc4f14d740b5f38000000000000000000000000000000000000000000000000184c470d3809a40b52c71860411c00403a4ec4dd98e5abb4fab25a9e2b57658309a13362b865836a935f4d3f661a6a0dec8503d6d06f38782431ab41061b409ef9c4760e1d2d5bf1163722d69be14013730dc471c7d93a3ad488e8175d239197f94bff72ccac35059085b551a000c6e417c040580200081520bc1380c008020174460b82305b1182d08c164460b0230571180005a9e3844f11c16283025be96663860549f00ac30ec116ce3304003044b2f30008cd4c25fc08130c118040158160aa0b0540582982c148040a203050018278080007b880063b9000d892003bf679ae3ac7d2b937011dab2a71f7f8d6ad0de6278a6ba05af9c0000000000000000000000000000000000000000000000000c2238a284402382380280200000200800183801006d0030368d66440128f2bcc88dcf95e6b0549f71883bfb188000000000000000020318ff19f4c002b44fb31bc2c7aca84b8d0f0656a2b022767c0000000000000000000000000000000000000000000000000c260a6c5f10000598c19010e10810208c0080a00163401006df9ef9d4c04c2600000028240c40a30a28a4043841840002028218300100682700800042480023c104d3902600812c04000e0240099ec8030c3981400000ff01c4333e3ebcc50c00000048103000000fc0604101656511011fbcefc40402229b479c08000000294010a050880200800303f0181f00c128060840204901c8d266e25e48e200047af243840037faca10015989df2a380002c18640c037b3db486130411004287000006a30e280000076060e0c32bf04206000001242428cca49c78610daf488a426082100800009990480d82384c0e02608c130150582282c0dc179b3e230ca1aafec6ed149b0cd8568fe0ef8d6ec749ce576891077817bc01843e12c72062021820c20822011c10c100c8800803411026086130420982080e877107cebe48181758c90b1c609613a26cb148ef4c39f0c1e506c3658600504f6b300c002b3ed06c1006720220080000b99e2d4aee29c083d866a4101511c51c31830c21c1141081041280040132480200d00010020009304001f34d0c00005d3a3001b2461dd100d880434c04000000d508109050840200800303f0181f00c0f40607803f14c18b95be3af6aae93931042d23421eb2aea8c5400000000000000039158d32e6e6ccf7c8f2053cc5a800000000088498bb2b022e70368efb3b75366260b647946ac6ff22e000000000000000000000000000000000000000000000598b0a9af680002d03ba81c6fb1be3f3433021e000001241f52c824820820600002a180200db2000000bbb288067dfae58a1819fa5d4620600000012480400002ec5280a6720f4e810000000b640270c220080000b4903b0981d04e8834b96d988a18d2cb28552060000001cc50800005dd2281c7d5ef7585000001113f04007b13d72827082200801c80ec900001aa5923800001c24b13f8d259fe585e83328a9241000000a48208000212a0260821008597fe4df55d23090000004c816483b64bbe949240000011a058e0ed92f4fd2470000002581610f4d89e8fcc0002e4eaa90140412804000)) <<< 16000) + 0x06b480017d900d010060080012f081c08c0dc078c7f8cfa60015a27d98de163d65425c687832b5158113b3e00000000000000000000000000000000000000000000000006112061861842421801000000442b2fb80c8bee8fd6620652f3b9c37d1f221b5fe0de7260aa5ca7724eb2b92400c74000bec8006ea9036090007a610110500180b08bf6f13420e089bb3d1471412d6a0048e3801a1e4c954500be38cd2788064a0dc16b0c042a72338c080204e58460100350101a00c0cc07228a260a0d6288af732d808c196baf6dca380e843197b0c065e2cabba2005713fd9a8200813161100400c805850623d1f6c38805669a57c41241d8aa840c103d8b792b1c00b7574d803008bb87a6f81098508c020062030300181780c0b80605a0202c01e101e17d9289038bd62615a48c3e7f8d4e0c32e5ccbd983840c05a8021205b73eb6f204c1844010c35224dfa9824401a04f350408357d04bfc708198fe6f988108fbbd53e0250c23008000088902b0981504c0a4260220b0280581382f49ddde8e212b15669f8a82a269249050e38e504404104502482019100100681304c094260481302301e359682f2e9dcd64e6e77359402084f878f609287d4b1af5b68156d354b5aedfa934e5d6d354b5ad000000000090c470d3809a40b693bbbd1c42562acd3f150554d28a04800200109794189134b8722741fa23905c8755c6374f46e68b878818c3c3f57e32fe57fe5d94c5faed3560dae1a4090db641eaf307045c152a431dae6c1ce185fe841fc71d0004473a4eeef4710958ab34fc541511862442041022411c1081041300040132480200d0001012000d9240027248005d3191418bc83be861c2964a54808101287aa3c300366b126a0500a8f3e7e0884a20460100220180780c084060400301f01c02004011c700add84a891812b408da186a3c58c0e070c07e7dd6a2c00d550def870060d58251098208802000027040782603a13b18b38101d12322585fc91c3689f9a84383ce030430607f11a38a8201eaab3d298007c02003803c2aaac3acf4a1ce39cdb94810c0c45f688094c285f2c706529c5860104000c1e6a600200086192bac04d6918380ee461ffa50e013cd928d1020076c6adc86041ae51e93e0e100278df1fc68000b942296ce004c01000017f2000586406c24034020190100022a90181180700f22cb417974ee6b27373b9aca00042c63fc67d3000ad13ecc6f0b1eb2a12e343c195a8ac089d9f00000000000000000000000000000000000000000000000003091619008c0820a5c9e9d1d9b35005c42c8a5193fd33e20d2028509ad057c2f83522052f8b32fb62a496826f64eced4ee3459b2ef6f4704cadd2bc77ef9804109b1f6e359682f2e9dcd64e6e773594020842cac3e77ca08507000000152288286246205182280040079d876e0317059f345b671b23865d6ddfa892a3b6aed8a7924388d3883b8bd40008a480b8a80582402a1200069620019d440509402612012010007609001bfd2003baa79ae3ac7d2b937011dab2a71f7f8d6ad0de6278a6ba05af9c0000000000000000000000000000000000000000000000000c22286304184302282202180202816a47a26620a15929df6dcf7f55b9e78a99155d22be5cb0681376e2f534f1c44b5a504da14b1588006c0c06d2ef80e71ef4c0c652b730e0306d9587cef9410a0e0000002a2308304284082300280200180202860900401b23822f4fab3250a0000004b0122c0ded3a63e40a0000004b014000e42ec2b64a084c010e38004079f0aa830e300000064ff39810102058be5a87d60c160a5522a7205a0417535be83fdc569000049542fcd5040c00c0c07881c7a60400fa6827b0550a000022302e0e7758f8a8720068090920000012082e300208002e0420090980904081f69fa3e2b01c173e3934048de4010433975cf20f35524004d50e9f7283c07039c072fddbcc900401aea0883c6fac4000ea6b7fb500c6dac56612006c0b8a24924a08808208a008002000032000200dc3253822da9d54657de09850035673317ed1f206c30821740fb4385487e7885900000001f91d5906100c1002da0b8981c6028011020000000194177a6b400c3000003a41c336428d1029e62d47004708400014280140003380038000bce00900440400112640402601e13927b7ed1ea5fc48e0193fa7cda24520bd146a4b0410001a2f2f88a04000afdc83248207edefe66e1c10000001c200a0000000177001000063294c852400a403001c03c32b572fa9818c20861c4567e0c084ad903f51c808000000d980c040696303e1c8040000000f0010400000999d270028008619734bcc9a314d0308b19fce6a7abe01816ea215cbbe6b20808000008d8d4e0028200027b34ad5d230008b094a19000390000000009eef800200000b9e2f994760000000d7bfb0f4aa9884801a82200009e40025970d4ffbb8c4a88b24042cce550328963893803f6c40ff1c5000000045ba00584069bd3543f03c7040000000d12e004080000cb1c37251000000101fb0c3e00000002c0bbbbaa532400cc0c00004c400328ae1a5ff748e28802ca2806252c600000025802861ebce9a2930c3000ca32dca2c0001727a04828003ed9ae39e2000000000960a000a00200003824002248806808030040015d6402c4601403ac6997373667be479029e62d400000000044238e38a4063863063802812eea326b0806dc708005a000276402484002d2040202400e020017c7200c6200501002008006f808019080083400202000010029e89)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 26 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase3" = "QuadFullSixteenCase3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 26 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase3 private def zz2334:"s091e"="s091e":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l17 l22 l23 l27 l28 l29 l30 l31 l33 l35 l37 l4 l41 l42 l43 l44 l45 l5 l51 l6 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x46eaf41dc, -0x3c55cf710, -0x5a80b75aa,0x197e3dd30], ![-0x3c55cf710, -0x22e68dc296,0x61075ade4,0x25c3614e4], ![-0x5a80b75aa,0x61075ade4, -0x191fba0e43,0x3e1f7eb34], ![0x197e3dd30,0x25c3614e4,0x3e1f7eb34, -0x1e2ae7de0]] noncomputable def hinges:Hinges:=[(-0xf5e2e6,l6),(0x829f9ad,l5),(0xd104d842,l4),(-0x104e6c2e,l9),(-0x637a4921,l8),(-0xa8da7d6,l11),(0x376af0bc,l10),(0x1a1c38bbc,l14),(0x17e566792,l13),(-0xfb8f8da0,l17),(0xb081d748,l23),(0x1ae9683,l22),(-0x1e2ae7de0,l27),(-0xf9a03bfc,l28),(0x1e2ae7de0,l29),(0xb081d748,l31),(0xe47efa30,l30),(0x1e2ae7de0,l33),(-0x1e2ae7de0,l35),(0x1e2ae7de0,l37),(-0xf18980b0,l43),(-0xb4d76fb8,l42),(-0x44fd0b9b8,l41),(0x48e1bbce,l45),(0x75d4f244,l44),(0x1e2ae7de0,l51),(-0x32f41eb2,l63),(0x1c771c7c,l65),(-0x8d51388,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1e2ae7de0,l27),(0x1e2ae7de0,l29),(0x1e2ae7de0,l33),(-0x1e2ae7de0,l35),(0x1e2ae7de0,l37),(0x1e2ae7de0,l51),(0x1a1c38bbc,l14),(-0xf9a03bfc,l28),(-0x44fd0b9b8,l41),(0xb081d748,l23),(0xb081d748,l31),(-0xfb8f8da0,l17),(-0xf18980b0,l43),(0xe47efa30,l30),(0x17e566792,l13),(-0xb4d76fb8,l42),(-0x32f41eb2,l63),(-0x637a4921,l8),(0x376af0bc,l10),(0xd104d842,l4),(0x1c771c7c,l65),(0x48e1bbce,l45),(0x75d4f244,l44),(-0x104e6c2e,l9),(-0xa8da7d6,l11),(-0x8d51388,l64),(0x829f9ad,l5),(-0xf5e2e6,l6),(0x1ae9683,l22)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x4884e02518080000000000050320040000198a42402c8018000000188a4098c030000066120500f20060000000000940b20080000000078280e601000002a1084c05900300000000001a0390040000000054340730080000138741c02c8018000450c41c01190040000052210a00b2006000000000028072008000000aa1a811860200000000c844088c03001582142281cc200a002b04084102984014000000a60e817e6020000015808809bcc050000000290480a980600000004211024300c000000000d0e06600800000000d0503cc020000000311481b1806000000630840a9301000000c308803646028000018612809c8c0500000000001203900400000943214026400c0000000088480e601000001d0883005900300007a1283002320080000004509408c3010000218500880a68020000000ac170218c040000001282204318080000003104408c301000000000004812401000000000a0502cc0200000002d0d81f18060000000521b02e300c000000660e817e602000000d808809bcc050000000190480a98060000000000180720080000000000f80c4010000000000b002c80300000036241203a00400000d84212013400c0000000005a02640180000001884409cc0300009a1182401920080000004d04803130100a20508220031a80300005409c1401b50040000ac1202c04ea0080001482a04803d40100002e0500e00ba80200000000009802480300000000001c02900400000000000903200400000000038012401800000000012014802,0x6c02900400000000001b0320040000000001a81240100000002782806cc03000000004a0c07980400000009a0c033300c0000000001881c401018814c108007850060000000390c813980600000000883c0b3008005188905004a0802800000001e13014c0200146224140028200a06145604140a6140180c08a908080e42803000ae1020e40b69005031429e2140230a00c000188531080cb401000001104812054801800002408834089003000000022058151806000110210540a240100000000090381c60100000012090601900200000000002a0490040000090220a00a400c0001e0420a007880200003c0841a02710040000e81a04203c20080000002105003c30100000000000480c401000000008828030c0300000002b0980a180600000000038303300400670a107205b480280000230902c099003000000002c1a0318040000004104807830100000000000680c401000000010828070c030000000064360598040050c7a8a20188401400000000000606400800000000d07034c02000000000012071004004884503001af40140004b0880f80ce8020000000289240d8c0300000004b0e8061806000000910cc038301000000000d8301c601000000184410120c0400000029852012180800330528650398401400660a10c20530802800000014864090c03000000005a260398040000000b223026300c0000016221814c60200000390e0240d900300000000000a04900400000000000d03200400000108a8880e80100000024c2b00a8c04,0x621180f9806000000c210c0a7301000918b50c40310802800000204310124c040000003185201218080000000a623025300c00000000002a06400800000029088034c0300000000421a039804000084c70407a430180000001047206c60180000001c844030c0300000aa2905805a006000000930f40bf3010000012c0c404de602801221460b403410050000004c220a0520040000144540e013400c0000001243202a60180000311487005900300000000001c039004000000930e001f301000000e708e00e0602800001ca11404c0c0500000000004a049004000000003c1c0a3008000310ac19017280200000000190d01cc020000001882403c1808000158310440a840100000108742804c801800a20c608c034100500000481e0900da00600018c410840ba4010000308841100f4802000000001109028c0200000661207005a006000184410a00394010004086505801a4802800850ce09806490050000661103e023200800000000000f0320040000000000f00a40100000014c2d02fcc04000002b0210137980a00000005211015300c00000000b02812601001412021880abd005a1248611381ab4200e0000000054240f30080000000128900a601000000001105028c02000000025048111806004847084202af4014000000c61881526020000018619006c8c050000030c350139180a00000000001d0320040000000000b80a40100000001584c088c030000000003280510060000000000cc0620080000000001900a401000000000031018802,0x340208013180a0000000068240630080000000dc22016601800002c420c0cc8c0500000000000a0390040000000094380630080000000001280c40100000000290901cc0200000000422403180541880818d014ff401c000001023880d860200005310c3602a90040000a62186202d200800000004211014300c0000001047202860180000000016140cc010028840c7180e9200a00000000342806300800042854098074802001420c609c0555005b0c48410680a7fa00e0002c4a110c0994012540e0827c025e280380000002906c07cc0300000051066053980800001484e1b01f400c0000000000681a40100007318c240329004001862a4140128200a0000008504c03a30100000000000220640080000421307c0b90030000004904605398080000124562102b400c000000e218809260200000000130b028c02000000218520111808071853c43c03a2401800001488822028801800000001d0d01cc0200003a630203d2180c00000007231036300c00000c508a02606028000000000210248020000001882e0241808000000004c1c0a3008000000860c80446020000000002a0c0cc010000003884202498080000000961b025300c00000000e8480e60100000441d06c069003000000463a1e0720040000114721e032400c0000001083605460180000431c86c0a900300000000441e0718040000005108807830100000000000880c401000000014848070c03000000443a1a02a0040000114721c022400c0000012a098074602000000000004c0c801,0x106360a6055a0080000000000640620080e18a6881805c68030000000000270188020000000110480a180600000000443c0530080000000000780a401000000120110058c040000002702200b18080000094260900b400c0000000003c012401800000001d19028c0200000000001602900400001686229024400c000590c629818880200006114c1203110040000901b8220242008002403482f028840140000000a44602860180000000211d028c020001023a88c079a00800001047a26036400c0000000001c80e401000000010864098c03000001a42a8085180a00000003214015300c000388c6090188802000003a1a0ac0790030000ea338a607b200800001449622032400c00a0925058048c8028000880dc1c00d100400000823b0901220060000000b251016300c000489163e00d880200000000002902c8020000000210c81118060000000622b014300c000288901c80728020000001504500e4c040000001b82e04618080001d8250740cc40100000000001801e40180000001c8c4058c03000000003c340398040000000421b014300c0000000001280e40100000000013002c8030000001a04a01c98080000000000640b20080000000006e02640180000001609c04cc0300000002c10809980600000000005805200800000000b0900e6010000000000b00248030000000001b0049006000000006424073008000000d408802860200000001b024030c030000000320580e18060000000680900a300c0000000c812018601800000000005018802,0x1c22041280d8200a00000e4420902c400c0000309246204a8018000c124461027d0040001c258902064a0080000000007400b200c0000000000881a40100000000000d0388020028448c3481efa00b43092419702bbe401c000000000120184018014320438c0a2d005], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x5120c4b532c4b22a051093816283673a1b82840e052f23c5062d6e4fbc8800321b8222224c204601007d018a580c5280608603c30166a58201a55569fce363470f4b89f8a60a65146d798d082dbd7e6818004e740b516604230080a482c52017800000003f6f1573e59ff031af9882324e2caa958f02c8e38e34f30f24e1cf111082030000200d14701f9ea261f97f0f380000f181206d0e4ddc5440a0f5fd6dd279065f70274d014c4a6232b800001eb64709c008c021e7f1b885fcce81a7cac506a89e680000062ee78e72b82925b20310925104868061128b3f61841000001f19a80014648802b0800000002a3132004c0200001e520006d478d0f9dd4c6cf33ee857d7a38c4caa8b6cce183e9e805a3c542c6be38cd040a8e9a9d1c1050f13670c003889681d680422008798d7b33d50058a069e69e3a031c11a11c01a016064000401b0368625746a1f0816724a951636a247194e20abf708c200000081430900c36cbebde29a70400000276ad4202285a51405690e10cb562cb6180208e5c7b24e0495852005a06000022d200061c40012f08004d51129018a300fcc8109e2bda718816ac1bb0f24871e73469e285ce4772a0820133f5cb45820017caf74a0006a6e57e920008c04e051a0208c021e635eccf54016281a79a81480c408604680580080e4100401b13a85841562c40e36358f79050200c1591dce44726f71aea54f14010be7ad0385040caa320ce000f6e4e354300031dbcfca290004c02889d0c80d71e43848983783f7772ad85122a647680995e51009eb73c1c29a78a000000b6dc4e50a170926509e0048a4bb1ba51fc8428a5a56971247407080000013ed0ffd014801801c000092880020d10004fd3e67fea12eb4718e6a43ec99e484715a8cc78a79c23ee49c0853b9e37420202aec5df94005a24ed7a4e084401081b0c0f8197cf34a81c81919e381d7c5) <<< 16000) + 0x5f34061fabfa2fc28417093d66ce00008d192f96001de0238b9c008c02103617b6475327c902c6fe4de349530920571f4a5f740c91c11247bc7fec4e100000016db89c91027110bda41208109bf668cb7cc8410c08b082a77a0d0c0000027da1ffa029003003800012510003d0228a020005653a5415cd370d7553481e1bd48dae4c58c0000008db2386180b75023cb108c28c1c62a24a6f2c1000000264b523020b4b82420e3c504a5ff7d3d91382098fc407b89d2e80c801781a05100428602142010a0808000a4c843068003be08a00880069f8c9012f06d2679838ab168696650f2f674f9d39238c330420c25082dbfb43f51209793d3f02a400122e013840e005210712768a80520909805000038c43eca7453d69245c86905c9ba6ab9647c99fa7de510000001fb0e1040e9ee5c2848887d5e2000086cd82dc0804e3844010d20a9dd1debf45912efe11c08b288000000c60c16298521f646b8d0c79f4fd4880284a9dd1a42742804277845952820190e38520400001a83999c89b6c2bb76cac8b20157010adfabf802d119f66799f40b996a9b24d2f4fe563f414f9c7e829f307d0c1ca1c91c8007000293910ff11a33c82f85d713f830fd9ea475caf69c780e757481ce2b5db62d3afcc14c908439456ca414c45d0002f1227e2a13e050003351a156d39d929205c08c00804714000003f620275377696c2016d39d4790005200874c8100066282200809e8282e4040002e644f0172233d37c69af3f0f603018e267c97d4c5516e4a86438c20000006f97dbe996ae00e0c107462a646bcb839f70c0137c84236b4ed307e740600b84546bea791fb22ab02002a8f9419d2f91bd8d57c4470b197e55406384c0ac000161113b11c078c3dd84f2a245441836211afc8e71407c8a1c2f25af30c47ae503081015917517ca43c201a9d30e88c352f3e00014be7f5dd23215c420cb71152f1bdd9725ccc6c3c38bd19df3a0f7fa15210fbb208ed99fa2a01e83a0000af488008f8551eb6878202e0ee8f8ebacb65cc84741ab79c2441ddfc6e9188efa0305082ed344d987f5bcd29e8eb67d935c5f717337e00c023ef36acbf602056f1afb2c76a23382bfc3dee82bc55981db5098a83523a4c6bc6af90102bb6bd198dedda0f6350c2ac7f453a63e58091b6fa4a27e8d6d4ce582029237770ed0ab78e55196e1efb9661882dc504219d2cec1bde17ec4908122cbc24085c053106c4ff6c5b33dde2d9bbf6ca4410431faf75fe2b6b6e6786991d561a11e9ed1337f81a3e032c477865bd242f400b58048101923902931870227e96bfe5fb2c4d142d596fc7906c824448dc2f40003999d7ecd9a7628560316a19bdcef646aa9ddadcbce131f0d1bc800000000000000002088610c08608c00a0080000aa0b4f38d3122c7debd6d45d314d432d9e35bcdf472cb3c32803e0575c3bfc07ec7544ff48e39644f09dd23fe844035502f00f1f3fc7e9db5200359bfde5bfff43265711d4000e2889d1484e4a4270431000989b84c4d81426a0281ac7f4a67f3f1c23d56bdbd49860b5ee0c63189142390e77c6ab88007a785a57221c09ed270c279050087a7a8c13d5511c8269f507d6037546468b42e37302a020514c17a537e34b2482476091f963847e76aa2d287272234382050a33c64b0198b040fc609776020802c4bd87f2c0950db0ec4830001c9aef74324009c041a583aef70279a51790264d416403bc78d99963d827c6ca314389e8d04a7ca004801000011122680bb1db8ba18a61f620d1824962956e12d88182d4f899e8bdd47180def91a33e9d4514483af36a88e409046576f3b75b1847041fa4a3668bbfc10457c6062a31400b037e960d2c6c362f9e89003404809980f4b3397480686943a35a64e8b1edce5357a1439b0b3b7003411ef672a824801aa5ffa5c7007a72d868b3821180400005b080020691320989884c3c807648f88261ab2c48cc332c39fe6942882c82331c048b59a72821768a183390282e1040296d748a6121600b831de11c838011461c11ea2019aba5b7c10b210305404000020d399d85e036f46cc58f4503b033046261461249249058c50c30860580001006e0ac8c5bd0e9f0e29479b53fcc230ba54f5141c0981158cdbce7e838499a72133450c1574129611c4401159d1830588c029d76c6865e000c72a7d78f86312005405000020f22600bc2b0fc8e705e09217ec113994cb19c52544fe74a1b5d668cfb206141d448cf420c08782d98f4008046963d230d44041eeb77fd202005182cd2fc244801400e30c023778afb6950c1c997a2a27f5142c66f374e38fb868a1b4fc00cdf9f3a3051708aa594e9e840439249a0f87860c11303db96cce0c800b175e73391c11800293fee54d7860d852006408800025e21a802000488225e1312e0989684c34c160010584188260c21306001d956f03e03120387100f083b1d1239efe654f1f481ea5222d74da50c334b49383018626b95d21ec122d68899495f081629fc8e842838057e6c08dbc904801481234a6f783044649255029ca88d2196dd9f451845d239a9d81450a0e21d28700463179854800341ad6524e004601000016a22580312b0189500e8999033e2abef1020b2a094d6ac43084a9411e5567082108ec16117e43076cebd1b48cecb1e0a4c2912d871c2492cd6ed80b89051da33e994da1c13079704926424909002e0386ccc676b2b4c8bc5322f82a281a798714612704584800500081900010068000761f301ec1d8d74d2492aec6290b20140dab8c4d070e16ee4e4a041e3804988900)) <<< 16000) + 0x0d5b6cb4d98109002000028640f817c5a37a655d0690d4225c2098468f36e39240c32400cf61001c030cab8181989a74222b3061100400004ec8003039921c27dd166428b1d17a5a1cfed4a1c2650467816c71c944f46f7098f1aa4d5f9de2a4a18432d4b31f8860813034f4e574804a9323e96bbc604a4a57a722e30c480160163cc283107d1f3492048653302480b0d900fc342aaae1de5728200a13128b040057005c2998009002000028244a407c580fed8b531840d212316c1038546914cb980dc931122f14002f7a6c16aca10480100001153a5201e9878728919052e36860f25398dbd4b1d36a990df9a205ff36f9c181090eb9a6c3802bfaf0ca820133ff9c6c2b40611804000067c894008001a488938484541624c02a24b5fb6c33482873577f5d7bb8d1818b584254a20645e6e77504471a3986197ef524526918d0c0148116c9c7d0ab61c4a1da72fb17c00189c24b8d40d8480150122469a1062d88fc71b17b63b3ce13421f65ec8c1d080ae3aec32b4a1c24e1dfda1e88d0058cb072c0024059bd93cb744701ba343d4a0f0008d103d8dbc3189002a02800010791250589202c48c1618c030c50186200f4ca4f14e7890184961ab34ccd4b24445abee944512bc10110d1530719a021d92e963b3472767d28a1cc310e694ca4804334cdf4401400c9cbc641860480148102bcefeb93eb02c5034f30b2cf28e28c24b11000a032000200d0000c6224403e3667b7a93b6c0e32b77ddbd18f0b2b6d02ea33ab0d24f50e5a75f48c21912d110fa40b220cbe7b78ff8a04b8ea89b622480403b96bc14e46058d1bf2a29f30c2400b00c113895750dc7db4d4220697b1b3fccd85d3530c2a4a5549a1b61148162bba816230c2fc8f2e98e1bc3b3aa8a396505d51524bed75654400db3231ebbe03485801276c1f987fae3c1000a061a3a73f5d061afd62400ec1900005706068d0d596c03cc11705a29459672d9be5d0e2b93e98e3b9448a4e862402c40caaa987c5001bc649bc99c108c0200002da40019f8d91000012d6252884800ff3fbf9245e2f4ffe37091e722343820038ffdd97d45043c6ef3f23e7a114322d26b1e62891b93770e196818728a02a2dfcc048014812048407a676aa6821730184a031e8f7c439648caef5bcd57144c26366f1657983843df30f5ff963c7a37550e73143a5361929b2f9200f54e4ff0e00a0109284caa88420480160183cc4dbb59468596900d43ed0f287c0d69aa9c57dc600a002890561cb8708002fef55f80c0004e0a14214005fdec2c9a0008c0200003324000f5c89002c00188488f86f4c82a0619e878144bc1ed41718b0c201aff8b155e4590479ac10f05e2c755f302a97771438f8c4dfefe789045305e5d43123821ae0a0433b91412a8ff70f2be618480168182070cf8fa75940d504281fd859639a280bd0e2a3516817a14498b96d8884000baaa42945001211611501002e9a0266d0004601000019a223c03f30cc9a7b599450fe2a198a3892f1da2b386932b35b5d389209731e45a960062752bcd240073da263eb3841180400005b8e98e26b1cc54d8513df18b4b74f0610b94f51f7d24590c22cc6ac62058f63ee88af60050ec53164310144822daf75b6ef2382106ad06935228306199e1e4298612005806081a685027e85878030f309ecd4f1bf6461a965922fc281731222a3ca0eeca1889ffaf547151b179404dd612bca2465265bc89c56d6a00045b7ea95ee5c4c280027059df07502ce080124ba1f4d5dea830d7eb1200760c80002b83e6032b8b4e728a4308e3c3c7122a739c610d273a92faca1240f1ceeeeb2c00e34384104800a79ca4159c108c0200002d8447416000d24447014001882446c340038aa44685600427664741bf607ccb8081419e9b967899185ccd7214c443cc11b8d57abb3d0104f2c367ed38a070e150c6750e681837f26010c68605051f5bc10573c0c16321261f85e2be09002e0385910ccd68a8c71cf9694ff6163008959d2a286f8acf7aba30a18a029594c005cbc3d458200454767a69c008c0200002d46c808b7e8fe0af943ae5aaa200cd061925be183505c48bfd72f847fcd1440b00f2f73cf8e187a2586b1a6430c34a3d382fa458005bee440ca41c008ece52dc69bf42410b40b000045a4464162300301c0100d80806804032020180108b808001ab0801c7a1004b53222c5b924afc102ee7362481846177f891891c2ae0ae76b6128672036eafe3ec8103fd918da21914430200d99519c40c2f6ce3cc84d282b61073720c405003b31368b959fa12005c058c247d5010d60b26882870a00b18c9cb1e9c0a184528d1000b1522dbd8f68a15559cd6120a0af018f376c1001ae58901e800240080000d091140188980ecb0259abbe9b31038000001cc800a1447c8d4d1352508601635069e724431d636cfeb090196abc11629ec9063a28b3faa0a302058591a4d05080007fdb1170b0b334861681400008c0f18f2c131f1d9c5145f22f181b10910254ca54666490f12a5b264ed480fa81f4677774708cfdbab8aca0400117a680ac483010f875850e9c101c13d7bd40c1562c4881601600008a488a80e49733be6cb2462123a60cf44dbb318810d7a06e31520e3096336ad23dc271445d476385b2a70e189981886013d860f001c283798601824e0f77074920140240a8b1a55fd46624801882030ae5f241866593e1ac8d02cb1ae3fd18751432ed1a1be62c5962d75d3c50bfdaebada4c007231e36782008507050ea0008c02000033244500622603b259d13af2b76c510c0fe)) <<< 16000) + 0xf40eaf01860ec509d6a00142e640b204e138914d907713c46a488fe7a7742d0818200a5474253b8e0000000120000100a9a6f79b8b02c8090c2d02c000118991daa8c58f105040895f4f3ebf5f184b684da9f6908a2367df12aec4070c8fb5b1b6cae307be95ea71af70c10d9cbe316d50a0096b210721602010c95a4b35553b12005a060c29e49ef0074b25e3abf0218b19ba273781ca185184cb320b14987a9bce4a16a04181d68c0039886424c10028523322a800240080000d091140188980ec90bab27a3eee288b125b3e02381860ec509d6a00285b84281000362458dc646a097924439f16a724181821167e905b831c0000000240000c01350782c808164090c2c028000113900065422240b000d0232326f43bbbc744814bebbc1abbf038a59aae39cb10244b0d49958f239025b03a22cf180508805c94cf4703820dec394d6280c0023020b0b10040189ad979fb4264480168162889b61cc3d12871706dbac6247597ea02b214500bc9746a244664c9b287203d6e0a2f730400aff5ebf39c00900200002e24444062200381bbe1dfad192901b3c5bba47c11c38423c3438444040868937acac70800000558c008089a1659b513140000000190002e43861581000006b888780c4380421a020005e922181a10b0d085048424242100210701000e2e91063d8829ec410f6206731023988096c400a60c23b0ff1987f0cc3f467447e4db126f2c103152112c0abc200353088342361c0d1a3331b2b814051af75a8bd5080013722409aa101040109d1c4e4e44e50721d48cfd5d806a0f300b4b2906cc058058c30740451987097baefec43016abb80aa160845a57c55100d27462b52801080430c026fa7841c28264d1ea4e12889716265840027864f381c3a5a94d9808da82f69a6002100800009790550587e02f842dadfb011c1bd1250d10e085f847d367018753fa44640421008707ce4857399dd927721f7b7a9d620e4335530228f787661883802b4170a7c44b44c179cba661a55bc13c3f0bfa194b2a9c01803406fe0b0fe21e7d88cc43b9e06dea6a29790d353111a7012a040ec1cdf9bdf5663108cf65e10f0f2dde98aaa1c10f44dc856cc16aac9c4ca1688a842d120554ea3760c12f09d00007a443bc040009b243402707986ce08eca57afaf1573dc3f8d14bcf7046ef8d4b1c4088934dce6700aa2d91d097f8bf9153272983a3c41312c78b9318e2f907ac8a0000000000000000082579dfd727d605837339509d395a9a6a76d82aa514602482180054328837c7d3f5333dccb73c376785df8d78ec9ac1dbdee212a38c2f1f9c4caa32ac43ef87fa90a0c8e247ec618090fcd11c95e36f796a2f3baee56d986c91d434fee70d9a341d825afc01d93a3a0aa1a4b400156c87d8cc3e8461f21b80400802200802008827682fc63c0445964f8005a87218a6003a00880000802000008880006a900011220860380800802000008887c04f8a3994c9d54b02e7019bd9a6f38f490483a95323b0891bf266e934bde80fd3528e7c5d7749cb8408e604e7c8d14c5288c2c6e8a14719d74d3199e9bea7d7cf7bd5e9e7bd56859e2ffc4b159101ccd658656181eab41cb68248fbde8f96a35c05edd75cb01c52d12cda6fac4537d24e38bf087b77ef0dd33bdf09c004c5d6c292e3fd7c098816dcd47183e101225ebe22902bd32da806d30f0bb04145717eb5c42d5ee511ab4d9f4062bbd42e83039f0dc9c0aa6dc4436ed41016ececb904355d1d81391c5659d123193c48400032f90f70500102800216887112c384761da3380400802240d2b5990044207401000009a43d807c53b2d0c00601b4cf1eb4022101f00800003f10e905e129228f922012187cb68601ebdc5190008c607802000015443d4741e82a0590506d0283cc141e20200029021ae6b0d605d85a6749d2ebdcb1bec1f1518ea4839c6eb3b01b023e0ee20810d9f30a4a4dfcdc8442dbaed77f5e3f105bb54d22f44c83008307c81f0e380aea6050acf5b1eb6ffb1ff9700a5fc540a01e3d02626f4e498cdacc191441d0b38f6bc6370907918002bbdc37b51bddf304ef7f4680ae08c782ab71f627c31c000220d2fd77391e4d0a169134af02c854fdf4b1c0449babec811b4f735539813bf03f0600015eb6ff43e2f9d61102d8970000a9443c84716c8e84bfc5fc8a99394c1d1e2098963c5c98c717c83d64500000000000000000418e100cde45da60dd40b32491c31430c22c0180027eea515fcdd2c0dc70b9994d3a0841c3ec1446179cdd4840785de5462272a277297af0bd105be958835459d8a2d898b67700d7deb377ce2c9ca60e8f104c4b1ed57e4d824e87f7fc00000000000000000851c2018acf00d6c63c26584a6e782a658830820828618458200025d87a1a1c9aa1ca7cd5bbb96c1fb47f0c7ae87f63eaf244266a2e15c42942babe181727550833f4ab058f01bbfc18a314a6a0006e04388a61c243bc57f035448abd44a4c83c59e187f3a8db26614bc0fc05da2c00000000000000000432cee01afbd66ef9c59394c1d1e2098963daafc9b049d0feff8000000000000000010af22220b1bb57919e01143879f69a6773bb1fedd52e85cb6292000000000000000000000000000000000000000000000000000658e100e365c60bbb0d492632550a65d5819874ba04235283242102081000012b03198bdcd070d782137b63b0663dbf64461f564cc27775e889a2204d9f5fc7861312388cdeb94e8eadc050fa3a449e114ffa35ad0c4b218b777b9124e9465072d93f45a517f2a04a1cc9fddeb)) <<< 16000) + 0x11c3f26f5616a90d51c555ff128c8e09e7cf3746c8506a92b10dc8410ed2a72a5ca22939c283fa6e48218f439343c404001146435cd61ac0b90b6218fe37167d15e3835e90de80811d2e6dd86d1cb5a832e22633bd1414eb76550701dfe4b457124ff2e30043f3b87ad202d46af22a9162b85008a4eda7361bfda34f190ee301200231bfdc1a7f70964cbabe3fb6082455b46f6020eb71efe439ebcd855175f2c7ff05161a03a95019c4700007264350540027106043b87117b4116709f55ea15a298dd2680a1bea20211ee641ad497c7e3b60cd028ea3705a63b6aa6003effdad059f2c30cd77256ce559b900d44c3c5817f3c9c07bdad43ee079a07518f54df7e8a4e240003de0f62717ef5d6cd0fe1641b7360ee4f7f2008223893873e9bebc9e281609755563b99fd1514685376b7bdbfc61e52ed018613a128e4a0e820318701cd98cf409f686395bb99eee46bb14294155d61083432d9eb7bf77fcc49c746c8bffabb5788d1121d8be5b9ea102b1afd55e9d0795af10484a8acc7d2013d2b33eda51eb9002686b5576181f1d7dd0b32ea62f10a0709be8e1f208e1089defcc3eeeca4c3760b00fd08f65c2c1aca8c85f641b282df821dab6780cec3762d0a802b72518b5332085992a34309d7c4e4307b541305460470153a4011860f80403bc0400017a43c0278572bbda2354a42bb407f6de6bd7a2ed9e5df634391e5fcc02c8c16af21e4274dfce1845b9aab30136d48f1d2f2f09cbca16680c8e755f6352580c10cfd480b63f154dabedafae48ee1c76baac84008f25c7972056c2af986595fbaa1f055da8ec001b5495b643fe9d73410f81d82e94c5081adca0d83a09d0260049e01e4b443c96a514901c8687c8cc930cc05a43555e08084a1560e0c16f2eb6f2012080f80403bc040001d440014ec80055790e21d8708ac3b8561da2b05911c030040101ce030ec0182180e01002008a1cf22ea5a581a44571608820740200000ee43ac0700401004785941dc6c841137fd090600ae9257e11820f0040000284f00b98d7f5c8404dc7f3b20110411004000020487504800063c872068000a2087484f027932f1c8c04c540178200ca48b0246083a010d1d810f880c298929941c0b6cb2184c106c01000012e43a0261ce0b0020587302f4337045dbcb08e6708351c0841f13888c10780201ca03b10037553ef2c21027c3fb4e0060bb95682400153f589c203225a3b8709420880200002166c5a3000df60815846ded80018d30fef011860f80400002a087206810c04000592438c6400093a4374941b40a0c00506c00800209486b9ac358178047652bd7d78ab9ee1ff6380a00023396d860b23fa000562de8d98b1e8a07606608d53044d2ad000b06e672a13a72b534d4edb0546c3adfb34de77521d621c1a86f92b95f9f242452481811801404000041cfe8c2914e37194d47a54199bfc664d36ce34a7535e5e621c28e9c9e48f9337b899f0c99b7313d8791bece5c86344c16f9b726f3889be805d67030cd913cbfc8cfaebfcb243d2040a86a8080013acd8a9d2281eca0530c9810afd9ef6403f3431970aca7fc07a3dc6930b62cee03c941cf2b94e75740312c7042a1ba337100308d5b51b94f16b3fb3fb3a2595d3670580916cd97aae5848e138b5600af644a2002320aae782c888c92ece8a5cbf797800965ca6ddcd943e1bc7aa54d9e6e894a26bbc41facf37d810bbb30e3a8aa287132804140610faf35e2a7021c35ef6b9609f95fba56182546301d3000928e1100400004508710ec384561c0230590dd8a2b662bf61c309401a2f8a1f652df34c23082100806f82c37807628fff9bb1870c75ba6f3a2879daae8632c02b413cab90022d027a58025102100800008510dd15025888370441b60a0da0106c8083600400051c435cc61ac0ba982269568005837339509d395a9a6a76d82a361d6fd9a6f3ba90eb10e0d437c95cafcf921219241218608c00a00000113def261d3f6bcef05557f5dc2b29f9df9cc21e2118430e65b5d253d1a93c4913ea9bb884666b60612d111655d4dfb33780160c35975a8531c2d4e28483a1aa0200038421a822000c0721a62b00292e20c4330611583000ec28b613d6d786482790ec00a89a086daeb0e440495f5f298a19c96ef23bb7d11cb9b70a9ad05083dee7c5de67f654e7e87e0ac87fab2454a100089ba1ce1e37c96513b5aeb1d1e46d79bc20c0eab3f042906345f87fed65f3b949fc0209c2000880321813d8366239f5854b636e7b757fd69e0a9bd0bfc0e2afc7e2bc772aaca8bbfa588fc8169987d228ccdfd5cac96c79b1115522c6b107986ce08eca57afaf1573dc3f8d14bcf7046ef8d4b1c4088934dce6700a95e77f5c9f5816650e28a684582580400602c51d5296e10a2a8be50fe64cbf66d22ff05da02f1fa40695bd41fa1cb619d8ca28f855f6149d20ac8a1c1ef1c9a0829c74aee0e3f762f8a2d44ca9de0caaf4a94766c95102206842580f9a564a21b635faee4a90aa1c08432e386d78cf53ef4570f82998858225498fb1096bb40e3aab223e0450c091c02c8fdcaf201db06d0f32798a049ff6d1e3247c989d7858889bd0c158dfd98620332698f8d30a3709c0000f0486908c3444700c0100450c30f4f21f186fa9aaa771e0161795f0c8c10840210040100400001110d00900007e10cf110670283001419a0200018d2198430cb218650cc32466190330c71586304c314261880b0c30586100f8e277e5aa3c9edad333accec0bab6330c057a82c2c48e8a8feda4daaf49daf2d543c3aae9e4ab8e2a)) <<< 16000) + 0x9a03b126423655bd5eb4b6749bc3026cef76c14e34a00d0f18c8e160a865afeb499d8cd4f0304470266400b431aa92ec13cbdc87c15a271f7bd8be9e72a3110b2784d62095ba3ae6755ee6ced9aafa7ae3e3480436f93eea3dda247d96bf3c5df81954a51323d0d2481560e47834621f99dd6634882fec0b39890ed7de30d9b1cd464e060a48ef8ee9a0ad35a91c91092509d92fa7577ca8794d611647cb4487577c992e08c78dc4856135e0b5da0f6f26b2293767b08f28f128d7370ff1bd3d21e84fdc1ca3ed129c9783c8d11bd5503905822b66f468e3663f0bad9e9db457c00012afa02186a8821686388e1a717d10672b794093075af54ec728159df8b10baa3835164fc5af0e29a009efe0f063d330a00f9b90649d0b5447a08006eb7c2323809eccfa911eae5de4868c84e1181e23030ac054a31e1778c2355231b806b26344ba9e01033690dd4403f2cb7d4d3e2ba20fab63844552c724805a20316ebc51bfd8bb98d102edaa884fd4dbda0486142ddab9b119e9d7ce1b67f16333b3c276eb76e6681db4573b98305ffa3ef91be12262a16d90804dffd811c4af3179fe9b9d3ebfb3e720ec7acf4d392776008b343b4c9b6dc0246f4201abea77feeea8dd6c127c7f7b44234b9cef64821bc5530150cd8b5919f8730861b07cbb4b6cf275ff0e721ac41ec5075764b3ac1a0ccad0cbe486e0712d718c80422a408d190a3a500001a5cc1046bc8c14300a601f3489002cd1e7bd804408c90840200001744003748e034d8ce59d79cfcbd87526c96da2a61e001c1c10ba5b00eab39a91e2e03e3c1abe8bb012b140439117c968559dfa1a54f0bfb24d939be10801eb6d915274b4c4a28d26476287ed4b5b60022be50b7320837f920efde0b02b05ed0daf90054819b3e3d2ef38e5e17488e5de08714bf55232d1617311f23b3ec28e1d72216448d4000101486096c300960b23390617faa4fb1817986065b12005d24f9393c006ba8ec5024082200868d7a5408c22103600800004b217e1b0be0982182f0817cbfbc6904070e6f2a0901149adb96081972e70330024142100805e8080003d0c00db96e957eaf021f75e39980f3ed569cb717c1a7a9e3b4a43acc7b855aa45008cf39cd7364bf8228c6ae13e99be04dc2e00580a55d99931b6b3fe98d4e1640233be62345c710b1d202994aef3921896abf2cf6aef5e32501e2ab924e8c358da6a15e5c0004fa03a7b52b8bfbe428fcbac9007309314513e648da56cd3cc5c6f64d539d0d906fe89fdb94ce7779291407851eb84713b09372761d0b8b84a47c2aa396cb450a910fc772c833cf60849995bef0b47b85a7949293a02206f90bfda18450d0043b0eb400006433858eb289968ea62918e1c41845edbaae032fdd9521587c519774696d4a8ccf32012864734fca2a848d9e76f4119f078001e06bcae9053b4ae1ccf9550f67384e49189979f7585a25dfb1b8778fae7ea42d115593fd33853995ae43066b0b010532010004005dbc499e00b99cfd9317479d54ff59aa24f70a5d4fd358517ac1f7f0a8b5367597f9085434be341f5c40fd5be200088e3f1f9fc6d29763e7408ffdebcdb44e14a05d3c2513d87b7c5645194a9328510e3af3c894691a3090af7e1776d7302f54666b87c11280f1fbcf2618536daf3db0479f4a71e6e2714db1e0399320e04af276b350d10f786be73c640190be2b80001e7c85e1282ec84174120b90905c02c2dc1400224e42d8f616a0ba1bb2198a7100d2719a6e1c16bc93362031880f804380d0842c4405ba468a276fc28477725994b0d3f206d18ea714e3f93fb0bce5f673833f59cce5d37fdfb8f0eaf4697278ef2f4ca274546d2e11db6295ca12dc54c381062b647722670026ee48533655650c1619325d48109df41a1f37d10e031376cabd3029c316328fdc4ddae3b6ac5cc5d5e29e069925d9bda5b6cbf371deb31c1b5f62c0ede13f9c85f97fb644b1f6116735ccd4017bc18954223077f360bd8189c780b7fb1378e05358b1daaaf707b9ca25dd0da6c4285d3984586f1c1089013c4000186085a0a82cc341641a0b10d0580682bc3415c1a0ad0d0560682ac34154130a909054008001fb88538e800c150801ce11c1033cddc9a0048151489aec0a70d16043772dedad6ca93010502fdfe81f5ff5a378cbb507831cb733dd712b2cd7764a49ae000a14e16c482b640464541778a4696f5bc9bb472943d52067a4002cc48224f4c84e420905f8bd1e1f9ac84b7d4dedc7e48d010cb382764baaf7bfc6564c5b69697aa8d41cbbf3c357eab2fc406fe0f6eb9d4bdc8968f9270db7abaa2733182346ad8c010f6792907c897d903d9f92fd11eb096a2b0929e92c5e93c00015b88022119009fa03b3b27deb9c664119b4c6c33e7ad3a1c93bf0ffec98e10511790000000000000000004571135ca6f39f640181fd456f04c4d74f8186ba2d3c56c000000000000000000000000000000000000000000000168840c30460050010040550100a22fceaf8acbcdb60bf4aa507fde7cf43bcedcc6338ec2c5a8c2a7969bff901f2a63023b79d2c7df672c7b708663ebd575cda99090f9410709d0f2acbf457f17c42f79e0a9dfadcc354f32303a3f33435a2f8dc3a3e1e8bb5818c3a02eb808fef7ed67bb1182370399c4604ca197546c08086be8a52ff0466ea23a7d4da33ee775d5615f502853008001cbc805499101143c38047652bd7d78ab9ee1ff6380a0002377c6a58e204449a6e7338055c042b7eafe00b7410f18f47f02d091071040c404600010844544b7c2ce7b034e3e7cde81)) <<< 16000) + 0x9bc49fc4ecdcb606b48480493a5fbfd306b0f4d469d216421e00520ab22ef11adf8902d0dec2a94829f3f71786e37570ccea9f62707b30c554e0040e8169d7f85125c87b8e2e8edae778171d7fdd15492d3c2cec8a1800508ea9cdbc898df537b570cc04694d3c36d0cbded8adfe6ea0e90cf80405200806fcff5173a605d79c8df54e2e867397fbd1d4643f4a47d2800104c96f59162abe57dbaf2de30a4a38de22d009dc7a950bdabf561dfb4edc80d032f1e7a9b04890e0c993682d436120ea7e350108360b80000a9c41c8860e2430a51984c8cc260661482b06e05f8367aec93c7c1db4a9ad99e34941a037cf281228f98697eb4914de488a1186b3567f0118460c30840420410440020010140001020f62219b371f19bf16fb7de4e3795851a204067a4f6089642a6b994db2f36974e46396e90793c40d06f0100017c10a311d080a6c29519226049eff903885bb54d110809507e1fda3006a1dab54840106de74de82a1310110042445670a0846b41f2ffb40a6550e254dd9d3b702d1bb977c6350040de33163c1dc7383465df695c202f6f776e571cdf539afaaa9608198776998863e6e4428194b82054f5ff23a15d26880891f8d93e6e865bc4bd2c720a461efc13783cd7dac5aae72902e87c0000cd083910c1c486144330a11585008c1b81702c375ff2a05124af9f922204240fc13b18018bd922980920a10804285525bbada6f72ee999253cbe76586a878ef085bad0a9b2d27e8d902a93701c4420d341466a5bc46be1b1b70b684d9dade3e99249d98512c514b16b352230d0b39bb4fb34db74411a8f14a98e1f4d9f1c228229ad4cec6e6ffed8806024fdd8ae26522e59ee00295442972fa220a2934189f4d3e8476dc638da88b70602d5aacf2081ead119904d6c8a1ef3d905595f7a0bfd4eef2598b5332d798d648219a57009f0500028d909e1984e8cc27057c042b7eafe00ba4b036d7383be5262b2083f38c32083f38b08c8a1071040c304a0090070103cd5322cc7f86805c36910b01e27058c216b7c6f807549675115b93957247b17680011710782904d908268240641206f0100048310671103086800397482188e84067fff0e4388167158b3090bb4e31aee841329b3a7181810b9d7e58c202124b0f45c600457aadc0204e2046010e30827b50e2245017ed5a523880adb3107890b008666e40a101c631d321011402e7c068130811804000050883908c1c4461281b0930d84c86c2603612e1b0920d81904c1b817c44d729bce7d900607f515bc13135d3e061ae8b4f15b00000000000000000000000000000000000000000000005a1183201041200040513a1a0a3a4942dda48a5acdf4fe968b10a24bc50945174edf0414c241390f3fc7fcd40717dc79b1560a67fc9ade54f089ee8b4966ea000000485939f5781006a9b39f7f2ec2d3d32d932de182a24cdb0961fef3c0f94ff35a58e2dfbd4e53bddeea921fd8394ba94e33cb5a0de02000525212c1b0950dd098374d55fffb94cdd99fc35d4871165ce4ff8e9b4ea23b0bf0cab88098462504f7cdb8529d859091b08185408cfa793037fa1935af1864007dc17508713b38dd55c7d3e546012bd7d034e00fe6403c0992e7a217d494642bbff0d3e736abd124c682d5bc58a0f114a7f2f52c4107ad0f3c0650d5804c40c6220a12c360f68a4e4fc14dcaf3f77244480524071238d107b15d23d0143fae4ddd0cf8d7f00a0c214f99da275edcb07ff9f5651dbad4860406295b18e0b132ce361f440d8ddd0f1da00206d5082e5630b8028c79e09749786bad0212a7e9c3e744e7f5f32d20d221b672a5d8a14098eba47edc8900d36b414d3b19b04abdb51a1b16d5c70c188592e028e0a410832800046c20e4430712184a0ec24c76124230320d83702ec60168b7c400e719cd2bf50e65cbb63b592365a682fda9973d8f6920c7b4d323bfd091461cb3910152fd1b18cf1a8553c03cd63041670409d700135d2805a683d6a4ac4a1c090c2761375c6f0e382163b926f6cfd9000aa5328e7b3d968efa1b092511334fe62d41e4809a391d868cba5509fa4fd79453a0f33722736e584ae30484a38fa2f0a1fb50757d4a18142cd92070c0d5eccdc809b73e968ca01d5340eb8500150a9770303069dbfa8012718200085b2d758592d19e06f5cb205729bfe4602040b8b63680f641d59e969bb052d527a8b79c11f7589d22d673c4f8e892ac2242872861c32021000b72ca334d4d62a308e43f82048c95ea63e59becef84ce32362dff9826e031546e52161b18916bdfdd31d65a885d1374244041200200036720009c6729bfe4602040bda4e5c7b8cd02ed527a8b79c11f7589d22d673c4f8e892ac22334a3482c82041022c01ad0fcffa3f88edaae568c2c5b3fb715bd77d390cee5c71a56e71b89856c1902325e26ae259daa6124402343224515688a868a1907f7fd70f00815a1c403802025b01f66042100871393fc9b4f24517400c3a0e10ce2ff92050821fc95024820f6f2b29650421008000082108f090001329e3a72325dc0d22d1eb665cb21c984b7608106896bfd450593f2ea2ce0034290b94b00faee245e70020008691c5acf8ee590b530ea6a4084cc244b22826b9d5d7d2001000400003448428280f81410802000280211c23d35ac5c1bf060f2be123d72873718ed97080a6c616674a001e847c8a28031fbe0d726042100860f3bc5b31c28731706bb68e1803873a70405128a5a384808420100000d7211a1208c05045808228040004ee41640400145a4224961104b0871d81b88e050e3a)) <<< 16000) + 0xda3b908121e544f066103417bb16d90b0400000ef34281f7de024218600ca25fa04f0804039bc57a9000db54fde0876ed9b58284036730260187100000021390d20162dfb97b1640000008ca0345d6edb04a6868855d6ec7b70e08ec262a1fd1609e58947b062c01614b6a27a22b880c64aaf20309c061e48000006a51c48237cc5bf9848000007081c3534b6ae819c29685801da1e10882e99ed9811a8deae829e00ce395d638e006d5292ad3a41090031c44d729bce7d900607f515bc13135d3e061ae8b4f15b00000000000000000000000000000000000000000000005ac8deaa52443b28857c0000000010ad6b1e308c8e28f24e24c24e1430c709b82008034000a0c84304800121cf10591546aefc6903ebda172085901f417e585668ac6f68cdf3868934f1b8d6303051295355b48282979837b9d86003e82f4c7ac3001e3cf81d7bb120050040e22cd6523e19a4567bf11773447e580eed058800000e100609ba83801c120a25c4144b1410d9f98e242038404a8e9320008c04000033642141407c0a084010001f81083158410ac1e4461022308005f10197ca6e593484e6512d231640daa5336a0d14f35cb1ec4689c4319ef8c24211bd9f6ac8a118d4fddaa0605a14d3ff406006d5292ad0312084a028e21db8367e6691afcac3172c8000002581a23e78c0a9830c000012c048482f790921026aca1ef30609ab28a584a0108402000031641fc260fc1307d05e8f8e4a68e18983c89e91726850e0000038401a29618679a8a6062ac6bb3a1141000000e1002024007b1a151004d7a33bdd818030b3c9ecb003848a1300c00007c483e0881ec240f40a079010003121059010008aa100135620f07206f010013b3906715001842107715001cdf90030148c6ccb296e8c282605f55a40450ee6cf20c163ecca9d240060b3927f8c02721ec0dc00013101100428756acde8b470e3fca50e210146450d8406000c689cf4000241c2200840e268792a6142010d3adfe409475f6df50c1000f2a9ca284a5a2cd258600b2558daa4c08440100760580102e0714cd55ebc8127a86e2f014250ea9ac5020092a116510240c2200800006f90751103a0881cc040005344000e7083912c1c4960e02b06e05c8e1bd4e2d405bad49e2ae7b87cad49c03a04862d0319e914b9846dd9540ab93d59b1be87b77e811a028222551112a45a73b1c24e0aa0e10a10a08800600000013b0b758f5e88de157b3e76c4540a95f29c9ea5099f57b114d655a06863ca51f34017255bab4e8ccdc1bbd5dabd91e5a50a986716d41bc0400077c6884c1c3d5318299c49cd20a15d6c4136c20551f9c1de080a7ceef5d409440840200dc03e5b6182c8fe800158b7a3662c7a281d8198237010adfabf802edb419100d7c0b31c21820c10811000c00080e92294c2932904ff8053cd521ab1ef537b326feb36e7b408088793239ebb0a438d940009a88368881b0440d61a06a090348481a0240ce120660500022590653d0320c818c460c4230611183000ec7f73381f50c11e40674c870415f5151e2020c6e36f2240ccc1fd001001c08b7c3c00026202100858edb2fccfa2093bcd849838229b1daec101b15d99aa00048384001005f0900007a104a2582492c178760ba3304805c09004011041caa79500c0860052f64b02305bd0903002da31a644000242421008000073105c1d0198480c8240620200017720b67a05a0d82c86c16037ba05d5b1496e6841e9f54d8bf5fbe3acd804a96781400000000000000000000000000000000000000000000576499a55d19d02c8b1c718b009008004000814d349ce924c61f0e52049571b2ce9b00dca3e12dee71427789af01dae2b03a3ceca7f8f47f52b85c66ae94fc3493537f5bc81b1e390800723d901fb7b97ccd098798cf6a67493c113fed157d6b71318d35cbcbe5881bdbe3f6c8b12441650f1d08146595f5bd7e84bf1a42eb843a202b04895f24641f5d70a1723303c0850ba366d97f053ad6abc2f78c03ca4e231c829686880d841ecc0028c3d5f4f95f07c8e1ac203d1118081a920c01dad28c30884226c4b5752d14381f61fb91038d9e6bde140c9a934139e00fb620ac140236144a384c104001091ca0a8aa8859002d47712186044f3cfc584b8ff15ae7017187bc6a4a0840010e23a8beb802c8545df738e107b563321c4112a5234901078020000196400079882b84c06417a3000299a38918c000b75a38c2642a621280b6e8af3b00482042010056010000791000466302ac720b6c0c2b31aa7690a09abc332d9e06e5fc6ac00120a1000420531267fea141b21db7cb008840800200aa1200009620a8120001a120a6128141a60048830a2f4dc2673c2041c482f88085ccdacd8f007da271243018c045c8f04984084021c042b7eafe00b45b23a12ff17f22a64e5307478826258f172631c5f20f59140000000000000000106384036499a55d19d02d100c70c204d00500d4a9393f1a11b03f5b82997dcfbe5ff5287e331ce0677817e3400cc5d365f0a44a42d15f222626e23c6ed26111df14231ca9ba32ed24f43b662368fbab440790190a6184038acede6a3638e883bae8438663cd6700386781cc430b8ec9d7b9de9b153d7059040b08b0265a70c81b32b4ef79dd19e6d686c0074304803fe918446af4fede5dbec276a78ca2341bd6a9a419d791704087f18000019710500100036110520de1792feaeb0f03e3b7ceb460365c1b544048c5080021858f99d2b756b273aa49801a50f011558a0c55a3c414c944cdf7854dc09363e18923f458)) <<< 16000) + 0x1e10b821df6834d3d45b402746202f8104b8d276cdd13863c5ccee0c789b0e2f29b9d30b3c6090c32ae5d6593c99f1dd13323b3b0a9f1a08f2887f0b618a4dcb50f844a7d3c118351d604ae3697c009cc84ab05cc1043df175e584f91283d113edead00f42f9e855d71c86ee1634167745d460345ddec4586193426a785386832bc95d65f4c9c880866f4815c61a327c80510102800800173c80034c104f1982706c003c18e0c20a535562c825ea05ac327504043e3d565ccdf56741bdb66f73810e0c621a0c177b827792d26be564bbebb2c009f463a41d29ae701004be608330dbe6a1c1051cd2cf3dadb194f708d835d2cfdd2ce51c13e19a7e6e91dec5ebec2526201245de1d9b2b161c0284bc08bfa1f3746ed59eec600c6f105a92a000e34340c11e52385fdfc215dc6f15e3de4dbd023feef45f7492de20ff212fc22fe409a3ef3b0903dd4991c3cea5e112b0f912dfcf30c54770261f71d20e7799c2880129d1914b81598dbd3f2036fba12bdc04b9254d1d081c1a0884981b2ed96b9f011a698ad2023081833b1eb84025adb8cdbdecd61b5dd89aa214ad98e4afd1efc89b08a0831bb077960dbd8068fa2e3741281ac54226d31d75018239ed7e97a02905b8e639b3f6488c8bbe41f5aa7f9e08425072f8593f12de91b205f944b30aff49498ffa4a472f3961ea7db54169722f0aef388c18ae84a295445004f1182704c0014508268880f01400165c4130b40965a0023d520946b0493582402e002334bd3b0e02f467db40207df3cc70c6004001080000802000008882382c1181608a0b04301d0214a423b4a025b2e9a68044203e0100420500004a1c1468c6c8c84084abcdf80800c602d33a1186100040114178400efdc01cc080e2aee211010521172a85024510f09d009040880200001c041042400039e4110550029441b4e8d01674833fc88108002100401004000011104301c020040100840a0000373876e7ae7e2003f43356e48107801100401004000011180400802000008882084800040c8200ac0fc5607c2300027d3020bffd4efcd04e660ab0020112d680c68402632db42a000906088021e301fbfa37c78678999d389e082a96135218042347b368207f8f68ac64a0844010a0c23b14d7470e8800d8b4701001506548c108002000014e6420964d424b63465068de9ba7910fd351822ce4b7b7e30db38f8dd6b926edfad60c207557973d7215691ab5eb72921769a20060ccbb9a82d3b0a78b621d53bea9fb100af259660fc88b3df8d78314b2c29c2062267cb5b3e4b722e9e6309aa7bda29c50701fb69b4aa620e3a6508781600001c390400d81f86c0f826000b5840f4340780a0006d53c1cd9df4d6302fe7ec6a8a0246c09f90405f1865e900090607c02103b8a06ae30e0a3fa566b860494cb6f5a20245e1602710024b50160004a204201003b0501d0280004cc81c8a80e04406e1a000265206c5a0352501a0a80cc440642203101000835903019001cab1a0cc5ca9730a0b878133f87047c932610801c346a0dc702948004b0601c2f81c6554985080021c410109b785efa7dcd9d4d01687adb974e3278b77f344545291184fa2855f0e4756d083d9fa273e4bd14221de9353a5057637148154b617641484500b2c8392cd64b3a141549aa051d922dc4fb465be67baa5dfe265d764329a39fa529d48706bb680dd33826466780eed6d302377f3f71a52d7c0c4d7806df64155b4f87ce289276dc2b8c2fd5ead99a35d4e57aea8e0f2acdfed187512174517831d0ca867f9200f73ab82d767fce8fe5d52661f518193ae67a43978c9ec3253b0612f22105faa82ccbc7668187f7c11a2d0ceb6c835777edcb0679798171ccc751145c1ba5853bc2c0111478c55bd500000eb040bc5605c2b02d158160ac0ac260240b02a05d8c2544c10c08349ba08c02801a81cdb71801000400a40583c79d647e0822151eef65007276878a6003e00880000802000008880006f102809e1212afea4891c0c827491636cdb261524066ff86a648083e0108000080238154a0bd961001f0080000259000088204e02000187204c230251181206c08c27409a7dd5be20134f5100904088707c0200441a00009920424a0201500f8880780400098c4074b40381a01b0d00d0680643403002000e9820099824016ba4f1135ca6f39f640181fd456f04c4d74f8186ba2d3c56c0000000000000000000000000000000000000000000001684608604504404300200405bd0dc6554fe04d7f0cb539c2359785e8f3d6efe1a7787df87b6e6ca02e6b44020f87764b0e391a7446115efc4d2d0563d0edabd8cde6cc38880cbb81e01d0b97686c3f874dcebee246f19350073edec631c6d97b78b1f6dec4fbceede406000000b71b0000387339f897c473b223060000011e1a300040462befb18a09882104b2c2636cbbff6810202c7308a79996a3006d642dde7617a029e84808103805471fae61acd9f81c50031198d01c70cc2383a9f0118300000021700604051c2d5f011410000000500040401aaf81a0354a3881500a000069480b88c0584602a230141180984c048160220be3e01f59160638a00913402390180000006003864d6d72b898c18000000960000013b40828208161c2600471f0c3b3099f1c500489a2f7080c0000011101c326b6b92df880000000268e1c0030db94fc05000000004b04102e384c00800018b20204200f11007088034040006a6403034001062402cc401442009150040a801c4400c0a00501002008003584801928008440020200001005eb11)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 30 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase4" = "QuadFullSixteenCase4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 30 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase4 private def zz2335:"s091f"="s091f":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l17 l20 l22 l23 l25 l27 l29 l30 l33 l35 l37 l4 l41 l42 l43 l44 l45 l46 l5 l51 l57 l58 l59 l6 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2bb7c0183, -0x3c55cf710, -0x5a80b7610,0x1d47faa9c], ![-0x3c55cf710, -0x2585744fd4,0x645a17ba0,0x25c157370], ![-0x5a80b7610,0x645a17ba0, -0x191fba0e43,0x3e1f7eb34], ![0x1d47faa9c,0x25c157370,0x3e1f7eb34, -0x1e2ae7de0]] noncomputable def hinges:Hinges:=[(-0xf5e2e6,l6),(0x829f9ad,l5),(0xd104d842,l4),(-0x104e6c2e,l9),(-0x637a4921,l8),(-0xa8da7d6,l11),(0x376af0bc,l10),(0x1d9ab73a8,l14),(0x27cd34e44,l13),(-0x9d0b1866,l17),(0x56e67c004,l15),(-0x57713b518,l20),(-0x8b32e1b,l23),(0x1094514e7,l22),(-0x1e2ae7de0,l27),(0x1e2ae7de0,l29),(0x18f3f4b40,l25),(0xda2bc98a,l30),(0x1e2ae7de0,l33),(-0x1e2ae7de0,l35),(0x1e2ae7de0,l37),(-0xdd32799c,l43),(-0xd3bf5ad8,l42),(-0x4ae1148a2,l41),(0xb3e7ea8,l46),(0xbe615536,l45),(-0x5850150,l44),(0x1e2ae7de0,l51),(-0x34e018bc,l57),(-0x102b59de,l59),(-0xc56727c,l58),(-0x21bbb865,l63),(0x25947aba,l62),(0x3c67d680,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1e2ae7de0,l27),(0x1e2ae7de0,l29),(0x1e2ae7de0,l33),(-0x1e2ae7de0,l35),(0x1e2ae7de0,l37),(0x1e2ae7de0,l51),(-0x57713b518,l20),(0x1d9ab73a8,l14),(0x18f3f4b40,l25),(0x27cd34e44,l13),(0x56e67c004,l15),(-0x4ae1148a2,l41),(-0xdd32799c,l43),(0xda2bc98a,l30),(-0x9d0b1866,l17),(0x1094514e7,l22),(-0xd3bf5ad8,l42),(0xbe615536,l45),(-0x34e018bc,l57),(0x3c67d680,l64),(-0x637a4921,l8),(0x376af0bc,l10),(-0x21bbb865,l63),(0xd104d842,l4),(0x25947aba,l62),(-0x104e6c2e,l9),(-0x102b59de,l59),(-0xa8da7d6,l11),(-0x8b32e1b,l23),(0xb3e7ea8,l46),(-0xc56727c,l58),(0x829f9ad,l5),(-0x5850150,l44),(-0xf5e2e6,l6)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0xa40920080000002907038c020000000a8140530080000002905018c0200000000003032004000000002a01480200000000483033004000000002903880200000830c80ba301000002043401e8c0400000000007032004000331482809900300000005418063008000000000440c801000000000840b20080000001207014c0200000000005032004000250c8380490030000cc522101e400c0000000e09024c0200000350840823010000000000d024802000000000480d2008000001c8c40d8c030000005221034300c000018c2102a4c0400006184401b2301400018612809c8c050000000002407200800000188a40d8c03000000004850330040000014864090c03000004c34280a4008000250c8500990030000000038303300400000f09060290020000ac421901e400c000000a83004cc03000002b05c086301000430a011014d0040000002609022300c0000094110218c04000000000240920080000000a0502cc02000003104408c3010000000001e01480200000006c240930080000001a0d018c020000006211027300c004d0841200c900450829010800cd4019440a104400635006001342304803240100a60a209804b5005001502705006d40100056090160275004001482a04803d4010005c0a01c01750040000000026009200c000000000e0148020000000442c0630080000001109018c02000000001c009200c0000000012014802,0x2c062008000321602407500380c31814806ab4019c318204d01e810060000004211034300c0000019870028c03000000024180e30080000000d06038c02000000000680520080000000906018c0200000000064092008000290d0240890030000002209022300c0031090130331004000f02106809c401000740d02101e1004000f02105003c40100000000009018802000002105003c30100000008828030c03003085309808940100000000007014802000000044180e30080005c1082806900300000b444180d400800002e1106039002000000b251036300c000028c490088c040000005488b034004000000250f014c0200000830a40223010000002a0c4068c030000000a8640e30080000002919034c02000000000640e200800049110640550030000000058703300400049110640f5003a0c31814806ab40180000001505028c020000000541c0a300800001843203e0c0400000610c807830100000018868070c03000000000140d200800051110440f5003002443207c07c40128120d09c00c910060000000000903200400a1204240331004002082405c09a4010000000000501880200000000589033004000000002d038802000000054180e300800000000220148020000000008409200800039150240890030000000000b03200400002f0b0702900200000002c1c09300800002d0b07029002000000aa0900a300c0000002b05018c02,0x5310405a30100000000d0502cc020000000003c06200800000cc260168c040000000003c0520080000000005c0c8010000000008406200800000000230188020000000a82405300800000000210388020000000a42c0e30080000002909018c02000000aa1100a300c0000002b09018c02000000004500a200c007218c5202f100400000000044062008000000000d03480200000430840a5301000000198240dcc0300000b106404630100000002912038c02000000054140f3008000000311503cc0200000c11440693010000000350903cc02000000000240b20080000384710258c04000000000a4062008000000002b0188020000000a4380630080000028870078c03000000005500a200c00711841401a100405048084202af401400001cc4102a4c0400007188401b230140001c622809c8c05000000000440720080000000036014802000000000d4062008000000003a0148020000000001d03200400000000390248020000000001903200400000000250188020000000009c0620080000000025038802000000004d00a200c00821cc6202f10040000000001c062008005210c3201e90040000007219027300d5c1030ad010b1006000000882101a300c00000118280a8c03000000088440e300800044118280a9003000104460a029400c0000002111034c02000000000440e20080004211830029003000108460a02a400c0000284430298c04,0x2830330040000026824028c03000000003850330040000002705018c020001284219022400c00000000250248020000000941c0e3008000210d8480c9003000000098140530080000002505018c020000004219022300c000000002601480200000510c80f8301000001443201e0c04000000000740920080000000d05034c02001885310807a401000000000050248020000418260230301400000001b4028803000000000dc062008000000003f018802000000000f4062008000000000840c801000000000d40e20080000000028034803000000000901d200c000000003c03480300000002c14063008000000120901cc02000002904c05a3010000008c1103e8c04000000441400b300c000000b0280b4c03000002306c05a3010000008c110168c0400000510a406e301000000130680b4c030000004209014300c00000118640b4c030000004a09014300c000010c310294c04000006914c05a3010000018c510168c04000000000900c200c000002104c0fcc03000000421100d300c0000000015034802000000240901c300c00000881500f0c04000000003400f200c0000001b0501cc0200000000034072008000018c110124c0400000006c34073008000000d02c074c03000000000440d200800000000c405c803000000440901e300c000000000601c8020000000000d0320040000011824050c030000000068903300400000118240d0c03,0x9870330040000002d2901cc02000000b251026300c000002f95c098c03000000124140b3008000793910c05900300344c51b00464010000000491a024c020000000012409200800000289240d8c03000000064540a30080000211e070290020000000741c0a3008000000311b028c02000000000c40e2008000000150b014c02000000005850330040000001307028c02000004306402230100000002e19038c02000000000b4092008000000002e01480205843182a01124016431c204d024990060000005219034300c000000150e014c0200184440540e64010000000c844088c03000000000740e200800530d02401e9004001443308c09a4010000000191503cc0200304831240ab401000003a2507029002000124520d02a400c000491483402900300000710c80f830100000002507028c0200000710c80783010000001c868070c03000000f271036300c0000003d39028c0200000f4a8640a400800000001a2c0cc010000006229022300c0000002522038c020000009241022300c000000026440cc0100304840ac04e40100006921044051003c0ca082340926401800d92182101a1004000000962202a300c00052258880a9003000000920a02a300c00002a251101500200000a4984809400800054258880a9003000000721a02e300c0000001d0e02cc020000000098903300400000148840d8c0300000003c1c0a30080000000a05034c02,0x3c82282d018c401400000941d0318c04001d8250740cc4010000341508c03d0030000000007c06200800000000f4028803000000074640a3008000000000540c8010000003215036300c000014848004cc040000005827013300c0000001611014c020000005821013300c00000000160148020000000584807300800000000b00248030000000036009200c00001a8110050c040000006c0900c300c000001b84402cc03000000640b01c300c000001a024028c03000000640900c300c000000190901cc0200006804100263014000001a044038c03000000000e40e200800000001e0c0cc010001047a0c022400c0000211f06029002001c46808c0534010000001c8d4088c0300000711940863010000000000b0148020022c630740d840100000002523028c020000009241026300c006316428022500400304b509804c401000071250500690030000000e4980e300800033148300950030001a4ca3e016400c1812e236002190050014c430d8088401000511043a02210040001047a16012400c0000001e0b014c020000005219014300c00000188b40c8c03000000000580d20080000184550208c040000000645809300800000000150248020490718c301d24014000000003902c80200000008418063008000000000f024802000108260c00a400c000000220b018c020510818e301d240140000000160c0cc0100000006c280730080000250d0a015002,0x540e2009c214d10202341006001c44104c0bb40100c312c18c0a2d005000000000380d2008000290e0440a900350436020408c8401800510e02102e10040284340410268401400510d02102d100400000510840b83010000000110f014c02000004804401630100000138110058c04000094260900b400c00000000780248030000008239036300c0003a1a0ac0790030028c9305804a4010000000211d028c02000000000e8072008009320c1600a10040000007231022300c0000001905034c0200000000887033004000016110902900203045282602464014000391a8580d90030000903609024400c00001c43102e0c04000108782300f400c000431d82c03d00300000000683033004000000252101cc020000002a0f014300c0000000906014c02000000220f034300c000000882c050c030000003211014300c00000d42501b0c0400000610880f8301000001842201e0c04000000621201c300c16529a3b00c49005000000d261026300c0000030964098c0300000887448064008000000002d02c80204848284c0246401400811d41c0319004000000000a40b200800711ac5c01b1004000000048340930080000114310208c040000000004409200800000208e4098c0300184581240394010000000e85004cc03000003b09c0863010000000d844088c03000003508408630100000000e0902cc020000005225036300c000000c824090c03,0xf409200b49306289029ad006d0cc08a0c072b401b833422c302971006060ca1123028b40140000003325014c020000000001b032004000000290d028c02052c930670254401400931f06302ad004000000000740620080003a158880b1003038852882017040140000014884050c03], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((0x30b05d73802a794021a6609cd2abad9f0a69a4016a9f53f3053ac85bd4a688049a895fcc0cc17bb94494004e236dea40a0408c02039a0be2ed8ef8b109c382e6f39b1) <<< 16000) + 0x3463b8b6e79c70a16ba82b40d10e2babe051a004ee78411000000074e113801180407300639603e340f0950a29e65e20085e6387453efab5478c14c2f6a64e147f87532f1e081b48a9ed04000d79cab3380118040728073d7a0d64070bd6c9df8ab9f2cffd92a8f2d048120112069e51e42039e32018c000060000401be7f5c122e7f1206b0bfc0473320589d0e812371e4800000969c1e32eaabf0e0ca020e2aca3a82882000002c0efa01107eae85b28a00000003bc467200500300001f9200068840013788e48280ec06000d6e4398561ca230e40d8e400f8baaa454f8feb17265fd8668e85f5938ddc4aba4ef288d103de85be5816ce45a3790c104b6a65b817e91a9c280381047364e462a91c0d825e58019eecedcb6f94799eb5490012cf13301825600fe44a0007cb54e9d488c9b2b6e948a1b9f4926e9c813c2e1a6939a54bc034c00000072071791685ee80d18996f58781a20cb7e7c7718200a1e581c0a20000006422620230080000b71f28360679951a54bda4e34d3060b18d23806066e4192d0c5040b729c5d9600081a62022800c1027e26a0284e484601000017c2000c92471c7764426770da5dbd56ef8a1440000002a40f14bef201610ff8df73eee57e2f6c1409a5777ae0940d33fe114000da907afeb4f46776800066a239b3277eb20f38200000004a21179bac8100a5ee2ad9410c609013000029d20dc03e2f1cec224434b8ae1fe534e146b66fdb3144033589728c0006477e642c012ce8f9902608220087996ddce0309c645c9de1e6710029c54011e3063b7c18030a31274fd49a0024367e306004d7e60b8138211004226081791d537c76a437827991e5d6e4e2e6c24699a9c604cd2d3d74abe053edc78c1ef284221e8eb2b0bb0c293cd8f11d78ad7da3c4584044499c2f57ed5204e1e01683390f2280488a074ca3f6d20119c112829000054a400109487304c394161c80b1c6018e280f90a6828ac5681b3769b502aa5d27328c7e0580db306991abbbe8dfd0a82ad6b9126d6b912913eff2d13eff2a0e2246a069e69a0120005fc1afa651de785bed947495e14f6a0893a68c300af10d81f396ae37c213fc3b57df6292804c51db8d51a8a5a13564682c8eecb1904e80bf206f7e8a0251b69e7d4c9e68000006295e30e5b0203920bf35fa1b2d01a68e306315739d3230c64a20080c434ec371252c83a0022f619d320144c30fa23bac51b331c51102300004fa62631f3e014884efe81dc2459a888a63e1e8a0b7d3eaae8ac09e667b1458144016a1abf47bf2085e2d07e5b6d25af6202dea04105af690a75eb1c10dba3e6f4a89b172b9c20453e22659c41801d64ea7eef993d2a24ac21f2f317be6a5bb310832e349caa001703b23cb3653adb3bd7560ab575db4d3f9b5baab23532c070ee7d694b0c287985750c31708eb607a832ddf647145349b6e6353b79f2d2d87b14d4c86e16e05f4b6d720c5e1380001580c0b3c5431b28e2f0b8782f534b360490f7501c4ae7c130300035038034b007390d0e3004261c220080000a21000c96212a2bc259028d6e61c2830324a882c5000000e406076e82360c0308181920941c097c01e92e2c133d08fff258073262e47410012828230080000d69b22f82592b5e5100000023a0344ffc7c7556040b7f14d8d28700161686658100fea88901e0400428c584a02800016023883a1c311000b0a90270d8e004ec65f003144a10784a141a2091a31ee5880c1e29c4ecce1206808d195644162861cc038b09b0d9db8872d62935b5f71c0c6e59bb2df29f3110bbf80001f4007a1d79ce1ee3b7f844ddf60c203499351a76d81b2261d9d3535d780d989483e2e8bb9fb07333de7c918b071e962f44d5114832000072240fcd607413918783b202f1ff0b0beaa1816da754808000004594800504c0bd51506198902cce7e355c0cc101a86987c3aa8c0015127103181801e2c62fb8ad02040c53f1f377c8102395c40e96142f4d5c411411044dbb28380b35f3d7646000276b6e9000aa24e604601000018220a66a1bf310e11286f8843823a03209024028000f78d8d9887513ad6f4a15d28b9afdd26cc5d4acaf5aef2422610b7e750f6d99653ec6d840d7977dc60e23dcdedd183913fbcd7afc72a844494ff4588bbcd573010879149a5830a03ffdddcc1426cb0f23d5c047e4c2505c12223124fdc6863136d639a956ab022c808359a3f281fc4fd6d0dcb5b0613db85e6b932fef961951eca55d86db502235140508e1c63cd1a0cbff7ea5e5f555f733d5b9cac9a5f2090b6b61aeb48846181ad11c2ce1c9123ffcd71c51a424820ed0dcb932fd1c106b0019c724337b00bc3220d29211891a22f2ade8448b908589e4ff4b33be8992a36f43a07586903184f4331043940e002f3c0d5ddf0000000005dcadd25aaa0a0747c0493aafd610c08a8dd16ce18a43d812c15860e6d825838249a7934000000000000000002211631030609400e008002000231686d6fc468defb1cbd84871660eaab75acc663fd30b41ab1a4b9354572892b03fbcde57d2c5c3c0c4203afa0696803e07ea8f07ccac75f9cd3a0cba0007f2414ce607e5303a05e781abbbe000000000bb95ba4b554140e8f8091ad7224dad7225227dfe5a27dfe541c22c620618524114100006c5954008b0aa3c3acfae19aab8ec996539c426e828bfcf9853379e5471800ae45670a69ce22685212cb388198fb205e2839fb5cc006ea3d648b8b71e9f779a93711e71dd44dc9e477b3378e65349e202e781abbbe000000000bb95ba4b554140e8f80904)) <<< 16000) + 0xb188188109045045004000081a557d03b768be95c476f3daa4e4aa6704b8fa05698414d46f2e65132c7019cb805b00415d47346913a80012611bf310df1086f424000d1c46f0c409e4a189090009541911856de9bd3f851f65baa458375d375028fc8e7b06ef82fdb87ac1aeb893730c148b1ac7ce0711158afc8d13a7dcdcf9452b27ba8b9fbe98fd9d95e9932d5b35a251e9d07f86ac2333f6c4c40468f56e23185b0d08359a2822572e8db6a9a4f2caabd4c537ac1014dd2d188cae3deb552101029158b2d6f93830dd4367655a0657a05657013a43a46828bb6ad0e37a25839266aa50fae1c000041c1c43ef2da77c75157ead7350d1fee9648a2318be92fc305b74c1497512e1adbf15a137fa2945b55be92213ec1aef205df6df043da2155c5e72ff2d4b21e627091bd662d92189220624486be8a00e08371fad3901422d9e9eb7fd75ebb2576a8d56fec510024dc6a40e2182561eec8dcd8a963d577b28201661695b3c8639a2c3c2d9d16aa092472b84043cbf1f80467d9bc346f18f4d62aa63d3184bf97dcf344709f7723f53ddcc828103c234cfdf75f3f29cfeacdc6aac9acccf55229fae028b48dc86b5c50a2c21001a584f3ed3f350c7dfe1798797a1c2e8af45cae7e4729a3b1446311a567520002069173e045d58956a553d655667e207cb13e8d775151626608460a5a8064582714eec59e39b704797fd2ab88a5a115f589880607dea2a0a573620d4e2452102481fc63a8a155bdad1d7621b1daf739dae7f3ce22396b0d1bb8a61ea6a00007fa23765a1ba210dc8e86e064076131b7090db0280a80436a02000ff0209823e179f7348b2dd58a6bc0873bbba1f1d7d54142bddbdac094bbdbd76c66d3b9488d36550205b8496326ae090a0c577364656fc6a2d30204e4720c76d8b62d4560d486aad7d89200000082cd4d5d252b547fef290cd74832dcc7490403ce9be3eb735d6d16a14d0fee09d218caa4f22527d77c4426fc1ac265e29c761a4658d54ee81e9329eece8e2a8f7ee97264a8273ba56de2bf7ffa019fd331754608318c00027c9c0974ea15f2b6880a4b4cddc59986088da864a2b30c008da867c5bd0a06fef2649acc0801a8f93494b1002008208ca292faf328364ce059c95125be6a3eee48236cb321601400008b88da1c82ece4366231b20d8d88286c0050346130c10fa610282ff141d0280e109acbc37c950c15e5666e661c0a11d443ba4aab100073955d90c70e04802fe4fd168a0129ca8e9fa7aaaaa8810c8249744f56541e160142071584ae293c1a6c9c6fd4a2c1a61114e9f6919c52707c7c25c1a51087b1a51e9c18ba3c015301c146c2d770e812100aba19cb80000109c712fa492005003081c28ff1e93f4071479f1b14cb1c61203ac0a338f87060360f2e735e4860c77559208e705175da8e3cda082156014f797060029c0894b64a00009a8eb488ffdd9002c0240001109d2802da180b8d069260b227bc1202c80d9c6f815c692401351d6911fcd0829230baad4840409e634ce914341c14bd3c6d8a1600eb484141d00000406f3ca4091262400b40b035e020002403c603ff711d91c59bd52b8971848851dc32098458c8bc6e0964076fb9b720ca10480100001153a5a6fa1510a34a004b1292858f42de40e407186ae157dd9a0022ce273d1c01dc65c8302cc1846010000141235c231a91189380c53c0785a31b4ab9fc31a545ca7393c8c1a4f22c122fd571240a1e15b665e8e3843a349faa41619731e6bc620941839da6db8fd1a01842f933de0060005b73e2d5e7212005805013d0185d80fcf50e2444aed65ba0f345a51efb95fad8e3cc3dd35bf43f52d00f287d6b112dbfbeaf28a171b78469941868d27cbe673eecaa15d248515a292dfbd5de8b00f8864b140785d0240215bf96370b5ef960b0f209083a0680001599d298a939c045e034912ed9edec240b20dbbb186e60b2483d7bdf1e9e5471c7b7587d47c02c15158f44e5f58a046989b3319ee3408b948c462b4010019a1bd424fcf489002e03009e80c6b407e7b44530e5079a3f7927099e5176b3f4fe51400a9b9771a4f4d3d3d84490ad68b1a596029dd1f8764801f1298162d01044010000195200081e46b047651ea66c3d860830995c752113542611d6e236261bcc91c14eeadded3810391a20b0edb471860b8ca7cbc5f85049a02632fc2a4c00b03b7e8da1f02009584b236c36fea4801781a06ac06290031aa01f1cdcf806d05c71809a3aed918712d240ae7c34611710566225240f6d256dc73a5010e2f9404fc4003a7f099db62803ba42135782e440614010000073481c0080011ec87a0883e844001c306ca8de5d0f095189891c4e6dd095ab10d2070555a4e79a2640a1816d5ff61b64ab20664bb908c59373090e65fb9d9272be9203e303bbeea8454c3003b065b23db2a20003ea22713cafee3d09012006c0a8e1c0b5f7f1254a123957e5505fce22079280cc5ae03430c791fac47aa5090f75b99d4ce30101cd8e56efad0004175ed9eada0a0500bdf78e9f385c8015175c6f7b54de749002f03c0001209d18f0ee0d64cc10304ab56a52401c6bcad0e424b028aa04574e031080b934f0720dc0e13a063001e682406550d4992f2380cd9cd5b4c1c0017525fa266e60c9002b02c0110080008b88d484c6a00624e0314f01e1709d1552a4e24828e7a9aae99238d2e2b5bcccf106225a9cdb05089bd53b445c244401ddf6e1e1618723987378880003828233a02001f126e15f0909002902079e96cf4f031e6a1dad700879900b241e6145211f0b2)) <<< 16000) + 0x10692556b0bcf9243776d247e5805a43caee92013a14fb914001100400006448d382e4848d83a1bd5c1cf1d474f3fb7d8c82c712364a836dee091c32ee1f58516328490e16301f6a10911bb7480bd729c2c147010b2d90328400e04a96cd59c804006b2b5ef8fba355e12006408813d01c39fc777ace1e74131d460a89e79e69e61451a49e4124160120390401006800078100037e3655cb44ba3b6440ed21b3bf66090300a5361674a7063a98b57be0121b9d587d8c3040650acf2efc81412bc775fdfb458038e3150968060110cf8c8061b09002a0240a400e1cfe3bbd670f3a098ea30544e38e30e24924d2081ca00800501c820080340003c081c008000d0c87a0683e8340015cc46987608a230012aa344e569591b05287d10538192640c627b0d8f407198c4a4e3f41a1d7bc359f0e2031a98d6501a387c58fcd8db4100536ee95c2000101599a410912004e038818984392893c8718e6da1fb9f38d0c5306a825cc080c8f9767fcda070e44a9571df20d0021cdc85e5709006fc8aa411b4700a34b7d1bf1c000c3fcbccd8d252480160160000888e0ad4d174c52e1c508588b483c8c2d6cc6aeb224c09c3b72eac30384ace6d22ad8182e9b84316101003eb5ebe85b46014200755b86000be1f752f00b448014812040804000434444c2634a0307b01e97785c223ee0512b7aad8d87a60ed4c4d0dcfe58fdde1d93c3838c0b1330a0d46865b7acea0504845af027c01a2840543c34d701802f7c45add122400a00715a1b6b3efc7e3a8d3ccd015134d3483072c73461c61422401c0c800080340003bc8d202f4bd0ffe8d16101449fea67aeed6cc1d8484220d4ea58fb587332e24034309711a6bd8e12117712e076f34604201ce8c95d81803a5e6316cb408004943f8faac3f82410b40b15a1b6b3efc7e3a8d3ccd015134d3483072c73461c614210124032080200d0000f1200067241202408e120006972346331810d81d82c68804001b5041b8360da1306c05c0cc0dfc3e59f81c6fd2ae12979c122d83b1878ae005140184d7f093048903314df727b204d34c725cf390e25dd7a619307c60082b5846ec202002e3f9d61c34bd04801681a0678062b6031a101e12a22b51ad08207a48455b183a2cc31b3c2c7e1b6b281038c0fcf8e75060c0b2933899a011e7174cc1c00017263e02d0184601000019f3031abf9270b57f3838d589badbe61973922b8fc6ed242ec0028a007d92745f78c122393bb6cdb9319a40910f1e1ddb31658e2247065daaada783002a35f924a2b3e8801041dc5b8e5059e8480900360540cf00c56c0634003bccf563c9d507269ebd41c9a9401090e7f1ddeb3879d04c75182a469441060e58e38c6804803783d8f960a86a6ef413d1f317af09d3e89dc5de5335b684189730c272e18fe31d0002342000a2878cb70f1cc53c268a07dedd60f9048b69d6d69d0aa38a8fdcdb774aa488f74257adb16408853a43b63e8405f65f4b0ad40385cd85c664b18300133b8c29aa17a12005806015b01e13fba10eb6b04119b3ed7002860ff36b4da1d258f5d2fa1c85838cb93fb753d8306bc528325fe680f19945a4b038037f5ddd6fee44021401000007248cf84f8d3eaceb9642648b665bdf2d7b638a79f60af36f64894ade21c87ba408a40d81d37a0405cd29ab6089038515caba391182002333dfc3ba0100196ccbdb9617a12005806019e018ad80e08684a1c39e23a30786714c4043cf2c77e6416f8d0681c628f57762c9e12450a8d580e5b1e1451a45951a44f2340281cf89e010d2400a0adcfded0119c410106007800021220008f24114260011b24674443382219b0901d848668143320b19801e9606abec851980d2843961a7f50c14553aee29fe5d42c78cbd6827182850e76a92ccc0c189183fddebc55698e2807eb760c845104036d0f9af1a84065e42b73500614085e48a1781a065c0632c0319501c4e125b0005d044a6b3e2fdd4834a07e66f89732cad28819c705349aa15bde618348c83e2abc47308c17912d1dc2c89d914edc752803eacd133c0c09002802044f0317aebf8f2f458287d634a37190c390b2928935f2d440281526554b00d0c1ced498008802000026c465017138c06437be41128a6a8a37b58c290aa64d5ea4b2bcf24255504d266cdadbc4e0d224956c6126cc22b34624a1b0b2365092b22c4a0090f313570302400a00803260389c77d728040c300b8b1db61e5c55e271ad34a15d1b9004594443d9279910038b3015d1600a061df906704230080000b69000399303415bdbf23a7869934a0a0ee5b03090579f75dd2d964966ef3cc0238a25da497e32ef658e9c3295c4968287601eed804341a0020ddb2b7150900224ab6eff195f12005a06019201c0d6c20df39059637e94db00e2adcbea2fd98485b8432fa2891fb50c28680012c121020a0034c79186b3821180400005b4817808000f7c8c888f090c7544bbe747902c3ec2411d0b20649d3a0f811242d042435bae2c74298aec8b4678d37d81cecc50b18974110f5819000a3ab413dbc1801bb8fffac59384801581404f80627a03f3c4536a5dd1e6866814aa23cc4f000711051449c98b910d2607ec4ff51241b06bf8782c01635e7fc04800e00f2bc46808230080000ce90ba010c800800109081d0880fc44001f1c6c8057a42dce3b2883cdbbd872a62488a7537955c72c75e8875a5df01c70d3063892e83c65e893fa4bf22862effd28bc5d2469a052e5d3990002e479a9923cca920058058b2015e90b738eca20f36ef61ca9892229d4de5571cb1d7a)) <<< 16000) + 0x21d6977c071c34c18e24ba0f197a24fe92fc8a18bbff4a2f17491a6814b974e640006577e3432332a4801601600008888c782ec83b4908170941242402567592a0b1d2e81787930038e1b86f27c9b83c6b7e50b074721630338f16a7dd49183d9a6b8c346400411022bde701801eb4447ee22510480168183cc28d36524ed4e2d204144d1d828a067473958f8d26c1a72b5fcf2c808482b47efc920380c1d38203c012149572b40900098ec3723fc88002a0200000eb904a01000219918e0dd954a00623d388e1c191f12094c1239b12bd1b20c2079e051f1e43850c24ab748783c6184967dbf6f4122b27453381be20576bbd74686a2801a3ba16f173609002b0280a400e33c3786d78c5b4212d141521cfe3bbd670f3a098ea30548e2cd28924d20c2081ce00a01c020080340005008bc008634040007644630563162218a110c48080033e0e0aa26ec89cce071410c1940e260c2c2854a4273c20464d5d2d3100208889e1860ea0c0ddcd376c0790e198d0dd904e51837cfa79ecdda1802ae2a87fff3609002b0280c400ec8312e47c30d3871c809ff5d458c286852ba586a460614153f035668b2040560cb32af24410271dc9ae8a43000af42034429c800092eae186bf7e84021701600007f08c384c6181430a0a184010c18080a804304020e50100027611811d8c00280091d4801bb61006ff222fe7317e398be92ec801a15697ddbd90413c82922ffd2081c743847a6b6e250a6d776c1a907c245d3b163a9f6cf1421f02f40e472e82099d002b3485e848220e43c9bb8e51001144b8c0f43a68d1200620700e60187280c390062f8038f2a9c7658e059688bb3d05ed84903612382a459251030c50a48a5084880800b8100100680009091780de2c3085d4cd5118340326be6c36ae547f0b78258d7ccb4456000000000000000002109451238e31221021219018e1020e0600401a0003446083b86ad07a2aa2072bff3decdadb285c67cb6ade71d2844b9475dbf04a1823ff2a7f899ca1422a2e2298a2381021d69564caa95100195c206ef94d0800c0b7300d8fc979a400c00e01cc030e50187200ec9799e81a3d694e92885854c5a3c2905b1860e4c4734dc36a2285ad9cff087d7f6e2845159ce022b78a22444d4e33a2bf1fde182032e0b3906088e0400a72b2992b91d307d0901018700a800025a22f013c58610ba99aa23068064d7cd86d5ca8fe16f04b1af99688ac0000000000000000042128a2471c62442042432031c20470280200d0001a0206a130006e222f60b17a01c8e5b0eb07980323096d204dc745b2406a5318bb3d924306157a6b0bd0ec2872c9ba954a75a4821dba2672bba62025385d3cf99dc1820c601b5a62102801e59dbaa09b38b54801801c0398061ca030e401e14291aa18963a862d2c9a44e95c17e3a4508e389b61205652bbdbcb1928d8a9ce3053b8450cd928784775b793c2c54cc9fe5b42a11b594290def2fb7c01deb01001c132cd54d2ba4c003d192a2d317f8e7584bb680c3d068000162117909d96564e938e6a05118c322a2056230c58585ad008050ab90af30b2f048b4e2b8cc8540508d820af8074e48856de8c0841c40256de8aa9ddc0000001495e48cad0285805000021f32390607a6538721c40a0c14046ccc3092cce2b0135f080d475901494818c1807da3f6f86d14374f390a2edd44821ba6b97a68384046309a1d3f8e0a005af20531e829ce4801781a0398061ca030e401c7954e3b2c702cb445d9e82f6c2481b091c15230a2c91c72c62862c5285040070180200d00011f22f213b2c96298f21b22070000006e280619298448c6fa285a718d5459e8916918bfe7490284307b432fb349127c6abf25012029f1aad9468411c88142a0200000f090005c9343a36e380f6684a17d1adc93bc2e48bc6860ec927018354d33ba9744081a87f0e49610030841aa560528040260083b1116810006e8d22bb0804021e830db548384480168160398061ca030e401da22ecf417b61240d848e0a8964944143942922922100820070c0481781b5d7d273abffe450b5fa0311c2ca0002b445e02723e69a654a91233130bc9af8e3000000234102512e27ba4121c1a6a8c3d101800000b4c0a084f5d648e02338a1200400005ec87280800167c8bb88c48c140026fc45d8742ea3a174150b98885c8442e222170010b78080084708b728c5b5362d88b16b458b520c5a4f60986b168258b392c1b8962cc3ba25158ad7af15b8dc6df89e1032983c7270ec922c5e22bc40088d972a76664024c377c8703807c8287af862f9fcb940a0336ff1748cb2ab6779a15500049fede308fa68039d4042a00a222ae9e2f3cbffb21a5785a629f9468f8e8147272670c08037898ced9d125047ebf4a79785f3142c9574530c8594282d5e624b0e3aca4241120038147b9718c208c0202ca13d3031bd43601a2d036afc4334007e77196d18011804345b64286870914013c698e1802f7f90934500628e2d289000880200001b27043a5803ea9220833ed748908785d343e2032e5825f52c015ccc230928210804000041081d80c000b588ad88f04e080b9244802d23c8a6101b583fd08004628400100000ae22c8331631189380c5880629e0389270ea5d8e855a3cdba95f8c55c80766f7ae26d0fc4b4d76f7ae26d0fc4b4d81023440334d1ae8b39702c873f8eef59c3ce8263a8c154307241181300140014161b045cfd92a4a275bba4653845dee7de698e96af8f5cdce99553dbe6607a7dd5030fcc96c1922e92adef3f083b1f4fe83665372a59b85)) <<< 16000) + 0xed0003c422c253160218618ec114642be0b07505f98da8d527d2842e07476f98136ff4c458f00d70f7e4e601ee44da1a28058da1aa3800359a5b05012710210087980b363f87302b26b4da3844104201003b018a48080002a48a40aec1c6448c8a302dfc712b8a015efc75a80118a0f804057814000182451c762ba2b15c1585c88c56c07c7d2acb605001103d762001b008400004010000044600802008000022227c1313d098ad00e000020088229f6da5863c027805c2f40004435e17c8c008802000015640bc050080100400001111590de1a26d3aa00417e22630b4002c63ec9a013101f004000054100021222b02315711c0000401186be13f52ec1041106d3b20900038763c1c600460100000ad227c0b13d0589e02c508062ac038020080220869e0ed748824231a91fcb00079c127e4c108401000015245542700801004411f871d96f1042ce1108396001b4fd9542610420080000ab20001d04550278306ba3c5b25041805cb408414e86ee71c8001520cdf71a005813be0e084a2844010000111200067e413c240009844518742a6121520900044d11512d89384c5402629e1390831f9335fa0e295993a52d5e88bcbfbc08109a2031be18d057b92c79bf52dad8ebd3008fd1456cb08a280998110c19c1f65bbe2800e621f621d47ffaf0198dad4b430539c300be644ca08ba8202b3214b78b13427c78000463ba14604caa2a358406ec0e9b7fa841104115834ceca26ba8ae743522b9d5ec4b145325c511b24de4aea2ab4b4a88fe2f000045420021f445393629a9314c418a586c528174499bbe2be18165481a73c9081051859c2846bbd094814184f1aeb79e02d7161b780983084021447f7cc23f4f0ca17cf6d1f3c215ea3487e5adf537018b74c51c62fffba9816a3aa69d16012936df1c010f0e1aef3d4ae6fc0b605dda48448234319850865b332264ccf0be5bfaa6c99dcd10994e14ad7f6baff8525aad0e491c28253548ad5bbfb1c7af97314d318c14b0f7b38526e370d21a38a84602ac030c15453887319b351ff73b7d84cb34de24bf2470aa8c4fb74e7abee94fef195480b4bcd412f2917a9c2329ac3eae23e47702fb949902394c50292020005a522902381a50a5167f2c1852862846580512b172b86000c88628a06000b2a19230125142300800008a9147198a30ac514562882b0b91183700e249c3a9763a1568f36ea57e3157201d9bdeb89b43f12d35dbdeb89b43f12d360405686dacfbf1f8ea34f334054d346ba2ce5c0b6b5c8936b5c89489f7f9689f7f95071040c604305000ce9ccc016ad818bab4d549c00bf732ba656b4ce8986e75faa5fd0c2dfa355dcb59f5ede1b8e143424a56de0bdd07de1dce3d1d4228767377327e90713f4879e8511f751884283ebc4ca9f8ed4ff3826c4d537cb55514ac472bf9f8726a8a3645f8cba08869e364602d9f6292c100cd76b11819943519c09841000200ec06286020000d2227a2ba1cb0869524d085465ca30c05271bedbc20462dd07bd0021b6a99380943080021a2066c3c52204ad131ea6706120a592040eda66ecda400a8950ad25041f00848b582cfef4a101fa14cb0a26062c1808c007c021240370652680bf8028b41c2af30a7326842be5fd39e03c9733a75001e00400007910001af36403aa22478e0e015e735c606157d68bf34000c3572d920028036d9060122a5ebe813041080400004cc8002091142090a08280015688108ec5005627e2b04f11c0be7c2a79d0947c6c42747fe1d6585884bc5c4f6100b95c2927ea5e4280520601b5314a96c33a458270550b5ae69acd2437bb7936fe32a228f144f54b0a75b31a09066c04c7b04e7e105f283859b8400469c180f5bc25e84dfd04302ed4cd1b11efe940ce3106ecee03b547d4d289085200b309666c20177c2ac18292fa7f2c612a122029bf43baf3c1e7482cfd3d65e73f2ee240a1b05c9aafdac70990976dab3a6331ae80c8b12078d47136b90371fd64734c47761ef10d3522c27c40566d862a62898c0858b81a7470a1634c54822082000809902f4313500e2b203992e77d11817d371b998c008002184c3fe5c706869367e6c4b0036612b34c007c01000014040ec1405e0300018a20760300024c227c3313d1989e0af47566316162870bae953740098e14830140360f4578015090808002100401004400004011800a5bde18003d4a44912001d00400003910000af2276131370181a80a02f0f15cc87020a675dc860692ee15b91820f804206c000680f3c106d6818638103f8499038013042022240420008000069913a09c02004011a53b3564a0b142b14c4a48321d3e0d3407502cb6048103a0100000c9200020c40bc240005ba44e4372187c45854906b6f6cd011040e804030c262700313701f8458757c15019177e89d70cba5a6bb2f6fc67f3b4aa9a11f38a2409f90808862f86db872033d372805de86383a2ec9d5e5c823a8489ec5b2d5b21a0e89289666eb2384bfd3b84b633c68369f4d9cf289d03c516a7fcd5900ff5ff1e189dace38bb2109011a70ed963e013afc3fb21c6f9787caed06837c56e4e27d129b7a7c1c882bd6fab8280ad145045df21846f984202a82a4c79b776592ef786ba759efbc6c17d71285178779f9be3131cf1e2dcddb7cc37d236f50b228de4f87c1585501d8acbe397bb188a78a2ba7ad8d006025f70acfb32c7a7078e94d3d1e37d91688407465d4eee03128006fed40b4b7366b12884fef3832275ed2db13c9642b4b33c0339f675a9b6dd96035cbbcdcbd600a3a48e3298e4bdf5c8)) <<< 16000) + 0x23e26ef0f6f77a645e3b22a5c5a92425e6bfba908a6e7e89b6b68296591218bd323241fb01d85f2cf78c6aa27f22f87b0b6d4806d4dcf2103db4feefd1976fe8ae27418557235cf7186712e71a84564d62f027f9e03d6365f8a8136e6200f719a308c82759b80000eea42f82405e12000c3f226c0a000d2520022f040049d089a848006db48013e991342d89384c4cc27d937e00b518e8d05f599e44129069d75edc2312892843412410813402801c0004114dc9fc46650180093b5a7512ba42994d02eb08e06148346011ad8a2ef879191414b9baad002840d4de47786119944129e700a0e756519601fc0d603a008093141100438823f3ab71a02b2236b4acd17d23400e440a3a3198af09020840200a60313201f100b85303a20287eb9ae2c68b1155c2c690280c78097a2844d9b270e1c01b5b2cf6a580105d8450004e204401000016b3d47faa9c00000039078ab9f2cfc9e2a7f63048cf035777c000000001772b7496aa8281d1f0121a68d7459cb816ec9bf005a8c74682faccf22094834ebaf6e11a1a39821200e002001257b45b9cf5270a3fc65584a0b81a8db60c2e6bfe8e10068231b8e19b450ae3ca0a650ec5c6fe3f1cab94878ea66acc7f0b3e33f07b62c0155ecb71453dce0a00088044c4575c665d913433b59658ca66a230d2adcb2000000000000000004b09943fd6cf239ec21b3c0d5ddf0000000005dcadd25aaa0a0747c048ad0db59f7e3f1d469e6680a86fd64b6528c74682fda29dce3c20d3aebdb848860c788586306480001640af8727248e90e1e142d826804bd0c2b8d0dc56f05a57c31db3e5f8674f268a239c94b4dd2c62eb0c94d24a563fda1bb3a2d773d73054a4be40887bcb297d819dbf654b57e78a36f7ac66e2017c1dbe7f751d564e68002d311301d0978480033908970884b434001ce443d0841f43a00109122588b05d418959cc4a82702173b10e33c0c0b4e1d0500aac33ee400048c907c02142c4bc52bfb3cf6717f5cab1ac3c567fe24c1dd2129860403f25af2f46bcede8306ee615d6e00c149cec9937a14ddc95c47ccdf3b81c9aa4a92db1752ab11565ba14114b3f071fdb6b0900a0bd988d58ad62650e2a672e7e10f789edcef6bf74a9f2d045625f4ba894642c7d2c17b652f352a9390d33b3036361a63ff3973b9ed84388e712b048ed2531155d24d4dc1a4cd622800078e1b8d8a4ebe5924543ae9381a652cbe9f5c83366eca1c3c95ff4efec4b7b79ffa34f86a4b4d62432a24f0d849b8aed45bf4b6ea49e5e9e4262cfaef6f9cfbe0d6a62cc0ed52932df445ee2bfa0976268ef1c19c1c18b3a6b510af6f52a315badda9335a9b82b5c26313e4f9a28fd0c7ffb8fc4b602728416c846924df2791014b43a630329ea78868a581e8889062210310f445408f31745979ccc245b6733f4a17a4f63fa1000907080020252020000f5200147844a0675c665d913433b59658ca66a230d2adcb2000000000000000004b09943fd6cf239ec21b3c0d5ddf0000000005dcadd25aaa0a0747c04939134f9a83c8aaba40000000031a81b730112b436d67df8fc751a799a02ad6b9126d6b912913eff2d13eff2a0e2921101160060000026350e58d35bfdd62385ae9ccce8ed7d0e879b513841a92683fd9b37a7a67a9fbf8995da8d61fbd6d129cfa1ab606466e31ee26967a386a16852ac92b7cfef74d8b9a0fe5b50e100d5e4303abf414b2507d8fc67e81df48f0bc499242d7957280032d1ea3fd54e0000001c83c55cf967e4f153fb18246781abbbe000000000bb95ba4b554140e8f809000000234911b7fb6bc55cf70faff83ddf02234d1ae8b39702dad7224dad7225227dfe5a27dfe541c51821c11c01804002ad738b364d7f7162ba14eff2b53b00bac3ec3d9670c9797b8780d0fac8735fd6a017a6e37b2060dee9241b28236d767390bfccc1a18a0330e1173516fe931e0c8705f9e9369cf23368625289500051c224e13b1573b061121c318db500e8d0ab27efecc282119598ee420021fe1b3940094608802024c03ae332ec89a19dacb2c653351186956e59000000000000000002584ca1feb6791cf610d9e06aeef8000000002ee56e92d550503a3e0248fe26f3773fc715fd1e481a202c2c9c2d066869d0bee250f1da0000000000000000011037eb25b29463a3417ed14ee71e1069d75edc2442c52031420c0000000f8566919be8255aabe13744c9a154571d57dbbcee17a68fcbd7b46ea642a7d95a95a24aa895046f18cd39b30cf5986c213f7c2fb23735b70307925e900719d65696f6c8e41f82819fda20ee8e2185a027074a6d072baba441214db0503304fab54e54e0a5f9cf3bb6a3b5ec9500071434242d99743c60aa21ca79a482477d703510165a2a5bb8e01c4cd7ed80012520210080000891078210348e83d0341f41a1250d0004f69124250918c8488542422a0220909002800859c81d8ac4080400c72041b8460da1306c05d0240d9a0c125d2bc186ccd47b3b12633b32060088e797be51b4aad5ee3c734edfbbe47bc10142b3e4dd8e6ddf6f493aff46500f732110088812d3e61f9e2ca14cdcb6a07b69ff590484008150c6a95da57d755d50cbcb066c47f5bf47bb111eaae7d3b441283ff3a37a05bc68c24eb63998037ef154e9996d414666d61e8480164c965edf823e163d01eaa69436c8619447d209c72a73149ef3c55cf70f1863cb9802334d1ae8b39702d4ba4e6518fc0b5aea4dc4fb56d31c053551c9cc66a006310890b20618c00800700000ea7eae8925719dc0ebcbb88828d69ff68030)) <<< 16000) + 0x7d7df481ba96c63a9f06c2b849a3fe73d5b6d73bd1f844635954eaa8880a419856de39aec3d524282ee415d50211ed15c56f5be636334273629545bd28852cf755d1782ea5426e4776ce1e12f4223587f9e7697a7538fb4ad5c5e3e2c9eecc773ace662b4349b8b8cead6dac13590741696f3710051c6ba108319f2808ab6c8dc31aee4bd447bca2113246d60bb358bacc1bfc122ad62a6286b91c7f8000b7148ed439c3a503a7af338b15b97c827e28e47a20fbbae8d94d88c013300465a8647edf2cf22a598091081ed8620a0efb2ded85b85192663f773f6b4aa5680cd842fc66cdb2103394e3fc63a788e0c20476811e8fd94dfb9d2011b8ec2e7bc755b7a3adace824ed1d643b64177fc7d9a8f0b3bbb6fd9d87453d75bf5629d8e7449a1a3f0a54b90466667ace84a348964cd98ac795e1fbccd5f1a8c3c00e50e989c06c61f90b4348dfebf751e7616c6b05e38b28501a2d3b613dec55b96762801b51ac61eea27b33809c1b51544250f1a7b1823503ec98d7fda909e64b02a054e803533480c3c56f8252f3d39bdaf286ff51292adb2320351b0039f5c665794b5e71047a716f7d9ed33c8939a9cc6e79030d18fa11c70403fd549e1512e5ba42a63cb962d9be622e4d2fde526ba035073ec65666c1646c020913de72f1c35b3cacccdd97ca5381e1b81eb20a88dbdbbe13eb61e8bfd66433c2ac287f969443c9718cd9b2620200200811f0905d82800013080048a9000f8c20924b11e2188e8ec470760663311b0988d04c4642623003a25080b9d99fb5df3e86a14b9ff13dce4f1f75a4e660764993c7dd6939981d92841086edf8b2446dfedaf1573dc3eb4a278d4088d346ba2ce5c0b5aea4dc4fb56d31c053551c9cc66a006310891008d00a0090080141004a7f4bf5cda0ac55ca9fe291acbbce4d705dc004af19fc967c105477ee93960512b94f2aad83e0d4dab059c9a0f9a7b8689b6ff041b497cca9444fef15bada1a1b75c9658b6dc5e6185392e442c482f10b362c45c21272754e3010b5bda9308013e05f03074f9223633e757bcc708244339732a4c4e8208aaab0efbc5a53c47f10348db71bdbfb5242426e84ce6c3a727b240b1640efe1a33089dac9be0a9bd65daa005002e34d461db4b911fae79cf08047c6e203a7d53be73f88976b442b24edc5fc67a51b833580155442569dc0094d1f05c151e225b43bf1041083d32d8f004caa097d010231c2200844d0652cf9b34d1f8fc3e64488abc5d781455fe9158e4408363827c010946080021c708953e38e509082a917ae4812593be52423082300805700e6788f736b3d238977d7be871c45c388020c0d0c0f2608120610804000037082406845c040003d04000c34c0c1f7882d380c6ecea2032ce2672031ac03861b75cae52359cb5fb3b085521e7f35a7bff5f5de68e35a95e06c007334bde4bf5df0a804f2059e4eea3c557c60689769ce12693763e18d0cb2ecb1b60d7e7a87bf7e9dbf635d657b22b47416b17444ef6a7d2f03bbb8fc4f029ca19be1011a9918ec097f04860c0438fc11fbceefc94a5354ece5fff95a3e9176e061a99e7cf66b38fe78f5390047ab75d5612001df9a0fd8112cbecd2caa065513a55cd6cc118a0ca89e8b7d9909a787ad28d64cf5ae46f9ee251fea865514b75e3a360cef2d8201aa24fce46185db85e4b89aefc10db634abaf9c2c8f7c8b7d7790e110128d841f8c8eeb3471561361bdade118588294d46433abf8000847222c3b11515cc69399e40de1ed1ef77d05d021bffd1f2b749ce6d17032582c016c555ee54ceca2fa114c388d74d762b96172a63262362fa34018c08f5d9647e45a625ed4f9a2ccde22312bad8116193106ab8d9096a4d82a84b9ac832633b880885054be35e8ba31c110000af41c070bb97a765c0350423683547915861fe50c93b50298f69fef0c1884f81416d9089d1826d9b7780796936254596212ada0870bd8fbcc18623b10af44a860442b6685a7b04d0589118aae6503f394580d3dba7da16a964740fc2013445b08b2800063f3c5001c35ae12ffa6f1a36a6afa0cb534031591adf92da4de582d2b3e09e0accfaeb21b9f929c3762640f370512021d9d42b2b37737ca14de4ed5c79552e675466b174071ed1fce9840a73cc805dc8ed7aac6a5b56c8ab31250680265d5ee77edb27d504d59addac2e161815ce41c66b37f9caa08c235be1a52b6da8356ef1a291c4c96159a800068f1125701dc429c3b53a39391e39c44338d69168dbce35b80f87b5fb0612081a9f43357a6f39b8fdd8cac00874dfb8fd7de78b89e68a36049c7be1ed3c5c698626f86c664f10b53015fce247b2b2409fbb15d4198aca700001bdc800ced1001e2b3858997d80f70912b77caea6ff81cc14605e48c69c12ed616e93e33973e1a4a1e00001ed06d609036cc3ea110cbf2f45005528286d84c1a95879db631e028a9001c1656c19c17cca3f7c662900790c0009b9998836dc08001d58d1f2a029400801152042842919e3d33cada8823a09415bbb0d4e319f356628ca78e42900003e9222852113250013ca91124d85b24c445062201b89d60489cc538a03a896669a498813b96cb15663b188e1204108043051cadfde5480b7a0caef08820800200000fa443c3621c1b10d0d88606e03802008000022300280aad369e79188fdd3a1392a8e1e67127f9053112988d5b9fb6f16b25089962e1cd7e26db8f1245446a77c652487a228f595bfb5e48d0367948906de5dd7ee3c5288d8cb1c17949f302450000b0f2b523e7190125d7ff3706aa955bfad891d3)) <<< 16000) + 0x9f1b1fdda037332f06b3a19fbb95f6c6d47094c0a4e681627fa08ef2e55b93252d957adbdf1f748cbc775b378bf81b11ad86148b3ba01f601acdc1aae7474517ca6998a29681cdcd88f49eb77ab31f05c8739f62bb5a80192c79e097ad1d5c6149a2912719c754de3fa435e02bb10f9c67a1a11632ed15f7c074a9ebc005c20b215490a2a8c8c7dc5f677350e8dc9c29bbc2bd54c60800f9a3ae9ea4e2564c7ab830e8006ddbcf962d3e5f41cc38ca65f5158de1af005b127a2b7ff0a3b0b01db45cbd207b3cb96154f5c489623800012f868b85ad273a7e707cd8871cfd1462bf60a62e9db8af59107cde63726f406b013f2ec2bc9187c2afa891eec30cd39ceec2396af66e34061d3ad489895b386a062e2a11d09052323261ce0cf961d7748480202849a70fb2fb58484479f5e0d6fb793687b13c6b7355454836a5f032988f04f2f7e7cebfac74d366f9b1056411df0314b344ef101764a1bdfc31a93dd9d18bfa6949ed098a86b1cc1fd22f0a36002029b1d6b16f55051fa49c916a434116ed548d3a6235b76485f8705720c974d63e53b3a9569fa393ff42f53300526e055c91530a8be330ef4f024b0fba0c5678511447ad02b32d8dbc1c4d619a18322934ac958acd85d21302a271aba816c5995cde655a4d11edd2d426ce81a4680ae21f59adc46bd956abe2c783541a477abc9a9a51b410b99df629b4f605837a10f30a3b86e328b1cbbb834899be5000013ca73c0d5ddf0000000005dcadd25aaa0a0747c048dc579065cce1b765f0e8f9a44aa52b0a0fe4e83b3485e232efc000000000000000002223caa71d963816439fc777ace1e74131d460aa1650e09c00e0000104408cf204f5c4284952d6af14cc2200ff469732e6907eeac2b49bed6ac05d14d8e71a438619358e5078239971620876351277a9286f2b88be91ba66dd10de2051891e8d26d3e7927fd0e7e188a3630ef2bb49e43320e5f54a509f821cc76144c873dc8c707875cd233810a48d07a000bfa442ca42144a1091d0840a82405420e2a02f1501d8a84185420a12104050818080072b8d902dd2bfaea73cbd0dda591ffedbddd5c1b07a942159048668921043f36b47dfcee95e5f5255710428052dbfb05f8f4db9879020c328f17c5c4f576dd7fcfa581ac6baf659696d0feac931d1c0adaea5fd21e31f74429a0581e02f58b3916308800797db08a002a00802e1b95071de352ef4164f730835f6cfb8f21146eb57591abe701acffd33c84825e8655df30d6cf0eb9df3f46923fce4b90451516640dff88edb466e38f3c020066af91037e460bf27c0002cc181cc88494919f84d7c8dc8133ec11e4feeeed20de0e1838da0217696efbd5b25a905751a66774630ee0180c880e2c064214841ae85622263bdf9ce10e9508000220091cf4b6deade9371b70ba10ee609d56c6063a70e0a97ff9b56a81a670be96a8d4b810627bba9839b5f7a830aee348442354ac635a2ed44d725b3fb18fa122c095ba130fe1aecfc2007b6efac83f74dc0473aad86be83b317ec9eb95b0e8b1321b24d8f800014b8881028018ef4803430100e73f34c05d7e4f8ad52957559e654a648941d1f2ad8e976ec37dc00000000000000001053f35c5c29d80dfe845a52bc7e389aff2de4fcfa9706e4640d8000000000000000000000000000000000000000000000000006421030c11801400404050500441350d1b1826805ecaf379818a8774ae1a029c9ae9e754257cc63160e3b6cdb7b1d1665e77143c7f9a91b07d4c374334c6888a276d44e122bf0ca3b577bdc7ad98f25f155e1a54b6362647de4c165e994a9d7dec3f92b4f5df36041acda11504d2e265d9ef787b9997075f7a693529f5830d2cc4289fb0b19411a3ed088cb84b79b7ea015d58542a20202000759201e4fe4061cdccf5e83592a73149ef3c55cf70f1187f2300235170fbee6a1840a7e419051ad7224dad7225227dfe5a27dfe541c32431830c21c01400c0400150099d5fd0374720276647b1cbe59fd74b4bbaa34c40a6c8b30cde6e87eee2b6177cc509bc257fb94871977ea5cc89764f5e21137e9b07762db370e6a394b7957869344be1cec6d1d397b4e3302613871d0e643dc2a150879315f077467ff8b6bdfc16090d8206cdfd1a7021a1ee7c6f6fb9343a41161b8b1d5e3c5ac160c111339a98f986ba3703adacc4617ac076388a26cd327168825f833840c471186f4918799d00e41d2fdb97c6cf38a3e1d318ff4cfbc96b283ea868cfbfbbb3ac917baf0069938d7f62792ecd08280d0e8000203276a77736196c326ddce6b9bed877b9266f2fb14dc84fdc9d4928d77d6eb9af8fa6a058d3e269838e94bfbbc49b77f5971bec74ee9a6edb673677269b3a7edd0f94f5e02884bef33bfee0a6b6c083670acc233477d3cb868faebb2ce7f7c0a5db48ce6597513d7a0d64a9cc527bcf1573dc3c461fc8c008c0b3e7f647132e1a7d41c9a7afc0d44a9a82282d1ec523dee2a5ce9980bdad41980bdad308cc71040c40820450100017de436d8b0951c682b72e39ddbfde151f88575bc8386c761e40e476e78bdc17b704a267c48ccc17bfec94ca674d63baf340062b664ed4d55e7d1c8b5b656dfa50d85e9dcc8cabee4a718c54d00046d205e1a03b0d00066e91000d87f84c13c2402a0bb14e9b7e2042059cd35c19890866778c31142605d5e1786044bc5cb4a1c059941c2e8166102200858a364d7a2094287a1d232840b11f6830e9213359e77f0384140cde0c8a15a10914be3025bc3e9a402ce204401000016b20d22b0f30587902ec51ca6)) <<< 16000) + 0xc1f825942a7e781efc2081496669752ba5861adc270a32242a8e12d8a680e106d27ba2dc830bc37747ab5410253134fc70e2402c278ade880a19122852040faeeea61b893aa2de55fc0ae5e732a347f017ed9ae0083de94dd63dc070c4c07f22221127f3d1c9f3380000000000000001e99629429029210610408a471c412309550a77f950744495776367331dcb250bcc37549f7bd0eea4e2b6e6880859c9c6c9f825698608c2e20d8f418532cb0a0007064048541e22a0005d621fc4b0fd2587e12c3ec861f4430f92187c10c3dc861ec3b03b1587a86c3d01708620b2a7f805eb62eb6acbfeb83fe590008403b319f80940a6007125360aa000000000000000008362ceb89d1b29a738bb8d60aa8b87df7350c2053f20c828e02ed96dac0166338a745e2769db10d51ed377950499c15c0c78e6a5b88572ee220a9028a20c08a020001998f61ba301b92827cb9f6a28e8df553adedf0c964763c9dbfe4c17dfe40d89f536aff7337df041d4348b006fff0b0012616d520688ccd6f4ba306ab8b0a96fc9e9489f83f8fccde802c33ea3e3c85d1d206762ff86565cbe8ea3643d74566c7d209c70c3191cc7b3c55cf70fcf95bec268255170fbee6a1840a7e4190508814510408604b00a0060000b188aa6afcd8c428d4d30fa5aa1607ca4a170800155dd50d43bb4722ae2aec64ac4efee791e3a500028f21e6130f205d0b4824b87c3a973cb2bfbbcfab08154f8f9226237c0e9da5e10c3d0a24b62f8a1be23fe4a2353cf3521024a8dd9e4b9cca751718883bac20292622811d40b711356579fa7050040efa0afd695803c1e2676aa0600204309ccc9cca13b4a34da7240000af6aa085f541886d78f61c870018190e8658fd4697d8e70c6220faeeea61b893aa2de55fc0ac6acb610080016d6b9126d6b912913eff2d13eff2a0e19028a20811600c00802000004139f82262ca35147d42e414411c788fe14d38db414e266115166abff50c8442433b1c498eb4000a788090c83c4541e0220006e3205e3a0ef090008231001a5021dc1be02ed96dac0166338a745e2769db10d51ed377950499c15c0c78e6a5b88572ee22088a11008a08208c00a00800202800a80203bee659df7fd51c74901f9748cede472b44e646c7fcc078172fc9f5515520c264e567358549a1ee82404f8805a18f0cb6a9f967d8cd35f40cb05d4cebb4fa5db1fa9e12e03e0e9665c1fbb69a5cb845b929e366625fc512277df980a19eac1e316a60efb0c12e07085648817a2b463bf4164c30cf22a2b57c1390fd53646385e34cf59f6c5d3e0ffc9dbee3bb4e6acb1d56acb9c4b426fd0d87ec2001d55414cd17e698120d50be56859b21e005a659ce879e26ecc67ad7ef3eee9badfc2a93e572d348c7ded7a020916eda240759585df821e5ed0c3f146d1a6ac3593074c00c000001e88f4e4456ca8e0b5a7e34a2b1815e3151fe7c3b971b2bbfe687a46d2d128a5a6a0f585e2f2d34257fa735a0eaed2b3e8ff099ba855fe01a69ecc014aea97bd20cf5e11dcd6881faadd1413e483340cedc19ca0c6b602479dc770d3bd6232a1b94294dad5f35a5cb51361bdd53bd1ed4a227c6919ca60003ac8304b0643557c3d324b7e0e0c88d8f594746b43ded44e0059a1b5681f32c044039037a058f8150951f1e797f08d954e495fcf01782a0d076db81e5834da623b4694b8b60b0a49e31bb51342c030a000001ab804147a78bbec07829dab70d071608a832c5466302270aa2fe80209be1c5b6d189002601479822d735b73a2e278c5e9f93ff96c2a48a00000192fc6f028400fdd101eda401050a3761f9cba205823ebe33eec4ed030224e9b90b01ae008283bce9571a8c850051331144d5e2969fb2400d01300004e478b374a677f4a183777c243385509331b7c510000004741030a46a4b6810657e631de200093ea1878101983dc3f200039aac4f9a9002200804a808000750e9837d96f270f800142904c2368f4190a30a252b28f691b7b16117bee2d549fbc0304912169110c2200416cdbb5e0f37410103dd406db175269020ae2e564d90c51028058814cc9e58aefdd0012006c0b0a14614b08608208b04204104a032000200d00008c3620a21419408a082090004000064000401a1da020000a120007d443b0361d61b0e70d84c06c25c27030d30b14b0cb043041049000032000200dd322a415663534058a390c94054b213028f4bfc55b7101609de308ad8e7145054be488bfe6ae08238bf1b89fca62c087ff4629223c82049b97dd519bfc00243277a9b6701fa409003104400012a9c145700c24c6b0c518518b16073251bf4b10df609dddfe8482c3acf49985962e6090636ae845c3de540417596357f264b409006caa07b002004040241191f5fd11f8002b529f8d7949fcea9c02400d81618296296218112082096008000064000401a0001184000cb884b04c254261280bc2c000001b7740040c7bc997e5622030c3dc84ac93f00a08d2aeee560fc0309d01cc525d1f020a297bcee967d49000c26a614eb908007427545bae600002963dfd9666e3284801801e03a8061d203d307bee4886e882c40f7dc8e950104103e974f195e02c31af24cf8fdd440cd14f992a5800c3b1f3e24a0ee0b0413305161a2d3000487b360f020a0018834ecd9f8ca89002e03007400f8d20610d94f6c703051030869d29d3814512f86980458903041dbc5187d9f731444089513f8e7e8104dcbad53cfb60030202fb6637f0d432c006e25b31932b41c00139f2ff4bb70e8082400d0121c68dcf2be0441c60500b)) <<< 16000) + 0xb961860a19f36e56405142748bf83318208fd39388814420a9e5a496209166e984a8050802348ca1488102c7f6da2c94801380a00007bc80023d90006e020760a02f018004cc903b0187380800418c87310c394761c83381079e2a3e130b4c40c337a86a9642e89080a8324b16b25c3081b8356e39300c90411657828ff2e860441e91ee27c3a810455d8e700a0d281004c0923ac58188002b325e96a5e3da4f369003404807180c388061c2030000187000c37c061bc030dd0106e00c0ec05828c298214216196104112000064000401a1b603d18a666290de7fe38c2a99b97fdb9f34560a3a3b441b3181bc4deff5147fc30f90f7edc6054c6850dd53076a19230165c1f3aae9cf8609ea0b4832c690107d20f2607c0dd5888480188243461aa6c8ceca58e306d3584c98acd14f6c76e69f3c60699e1e31fbeb0c38d84819eb6f1a12b2bcf7df8e8c0505275c59956182553333a52d404199fe0eb81436e42400b40d000045a400127886d04c364261b0130d70186b00c0d405a29b8222017440609005113369400824542bc8a177a606a50cca51458081c0d3b4787d08187374f02091281600613533cff48500e84ea8da84c00014b1f00d4af71942400b80f01aa030cb0186a00c31006192038102ae77af098078e6dee3548d3638f2504eafd10878c405b3795f4038ca55a96f120030c9f5704c4a20786107d25cfa5e18606f4fccc5d87006fe070bcea90e1200580600d201c491706700ee8620418410184b13c823d19101273a480e45134f4c9a22075725bbf2d220e3aa3561e4af39010136be57fdfa7803efbe39cda22c002172cb7d4a47ba400b40d11244d1d982b8588101639144b67e20899d16de64dda038a02ec050c3881c9a7c4683d2438e3a96baaf2d544301669e3e2e61e1849010fdf030b0c10ee8f390b1f2e400b40b000045840011d486982e040a8884f23601e39bc40932cd58e3c6b66aa83721e30fccc7369500e32b37d12d2c00c32694f9909081e18423e9ded7f86181b3fe5d3a61c01bfe476878a438480160180348061a2039141c4680608c788923d5fc5e1e73a4932ad622980c648902a69c004bf5449071e8a5e875c8410662fd7aad2cc88a061a26d038a6800275d3ce83e6460002aad9269549669a400c00f122865ed317bee224879348dcc76249ca12ef2d8ea89034b937b7038920d72438dc0010412bf6e876c748401d85fcd3e6808185d65fc8e8c1016b9f7c727d332005605000021931244c33570e12881016e8c5217e2208970fa74c137a0389d6ffcf86a881ca28a0d4d06038e380c811a6e5443015a84d01649e184941977f838b0c113f38c1abbf2e400b40b01a0020002412000db64002510f0e0f8814fc9a881c29a5df90751c307d129d03083450a42197135028b03391098490d104754e57dd00a20ec9469d7281041b53b2abd4c28212d2d86003f85200560480cf010630083380419a0200026b20025867457a1900ed860a29c08c9cf7ecd10bf38c5763028845ec3c29a4104c180e0eab81a187b4c2e9d20c08bf38c81930582b758b62d780412ec48d0326ec2400a4091a2c5067c0f6960a29b41600aa219a21a790e8f16c0a2177f49793820826a3e425ddf81a1888a74c06c41811a790eee02c160b3b5f6943dc0209a21d5f2c42f9848016018000088c86602c32c161940b0c901f8f1bb5de711c471f3c535cb5b21e31707bf2ab601c66dac27076c030dd83126f68c0e10b83dfca1701e18ad4d17534d0c318981559098702ced7da50f721c2400ac0c1e3c70e95a42711c7ccc0ba9fac878c5b423476580719be73a5f6300c375b97ea9f303842da11b0e1c07862b7f6ddf53430c60d2ed05a61c0b3d7149c1dc8709002b03000010d10c805f8e37b7fcb79b5a38f15a4220e8f7078c21ac2b0197b830c90d54b3679d4708367ba992be587860ca4932887aa38611540e64912a306053f87b1443880414cf7e1c25812b8a400c00f018e038105b500e27f4822db47086392038d798d4f9a20705812e69ea38ebc5bfddcb8f146bcc6bce52020269c46fdf1c40d0bfe981a78028171717cb69002701840831ee1bcbc14411f851a27327901c792d24513c0e3c130ca72d683c531476ad75e080817aafb673588103924c668fb8e20272076a1c444312fc21599710e2400ac0b000043440010988003501e18c387f61d49186818866556d0e143c699751e418535cc91fc4805156276d16d143430f1a6626810e0821323f4b453c001e9c93ef40d0056e4db1308d2480150123c8156a81fe816a9240094717a671d4e187f5340dee70230d9d8e99e56878385170863bc55fd0a2ad1cfa4874230d0c87bc80c4bc707041662653e7d0114207a66b56a6a4624c4801882000009508630083140400094e431014001fec40052a081786800a95ce10b489bac22e0fc163195576c87e39c238c4ccecbc8860f30e298223dcdd2f6d8608e73601dc497a91419d3eecf69e803818753bbe0814caaf060b208a96a4cba6e083228eeb29fc36641d3909003605c610b3cc068c5ef0c1631956bb211be99a38c4cea99db286370e29803810f6af9f8608e7996c30a94751419d4135135a9ed8187489d475225483060b3f0ca660817d60831d42775361ece41d3909003605c0001441d19530e731da411c71857f62cb4477eca14e4f0713de10e0a0e094c99f45342030fab57b98b31240c0671007123b82087041b0dbf81106b0107ef7dd7cbd6ef0c011e65607e73af2b9fc1200680a8c21ab8f353783a48d18b9918d74bb2947188f9d)) <<< 16000) + 0xdc0ab8414a140d6a9993d1b80a0df9106696888a030e6cf7d2e75f7f0c051731ff85aed18704873930310eb60106169293838bca3c4142400d01400004e6400140886184c30826182030c001e113850a9246a51823d0536c23e1a3888c3814f9dea941b40d7256cf3818747747d13126181080751138750502e6dec9a68f28608a6a8e53884608222c5e4938e742cc9002e03c6113850a9246a51823d0536c23e1a3888c3814f9dea941b40d7256cf38187462cc3e5246181080751138750502e6dec9a68f28608abc7c9f03c6082217e2b65a0742cc9002e03c00011c10bf0180900f496c5a50da7d0068b6763c00b5b3cb134f016ffcdc00827b4a49e2cd00342542b91e691a628403da083df370209b33b8b72d641c0a2e108f73bc03003b25a41b2f896da12005e080d24eb37fe70e1a2bad88c78122c4999763fad02092f936e8c00d08ba3e047840a10e6c42baf4082368b84d8de702594a546470c044b4b2b41d759002701c0000f89d262986d29aaf883871953054f60840d15bbe3fc2c118b2c475942a0af19004127eb4882e58b0342539fe6afb3fbc2094ce101f852e83805f4a8c7fc7aa04001e805ad060e485b1120064098d25c310ab69d01c3c78907b0d381c60389b6aa32868b197836c7ea051705dfe9002b9626d1fc1c4658104efeb8b2afd0684c0515fb2a3020966ea20f0b7dc348015818000086880024a90230900048990be0901784800383485e8ec2f0140031dc401254c85d82801331885d12f4dbb46f5ce6740d24e6b62499d0424318df3f9d7d68d0a8aac914295224202c3789784183081d904aad43508236c851c340c870084a6aa150300001c956f7cda7bf4a400b80c1a6d929dd8038834916f809b17307104253550a818d08e30b01d95712101d7a5db5600821981da29508480161bc6d66a020014128be7348000786f46046df39002b02000010b1d3712444712c6434939ad8926741090c637cfe75f5a3429961085a5af89080b0de25e1060c2076412ab50d42090049b6e62c61c02129aa8540c00007255bdf369efd29002e03069b6d927220858d245be026c5cc1c41094d542a06342344d4266840484075e976d58020877dd60e4891200586f1b59a80800504a2f9cd20001e1bd1811b7ce400ac08000042c400119884684b4dd451496faa4e34954b829d1e5ed2457d1263f647592432fe57a90269b1c233734709d6d40825083aa8994820411a5f3bda8ed21c03fdca426bbe40001f45331bfb7efd2120060078d36c4afff1ee058d24a4fd34245d3891476d6554de94c708858673c23b702088dc4a1ab9f80a04058f1638cf20804491cb4e0666c90051735589672c0006c835245007ba02900300380001249c3312444ace574692000000bbddc3082c9a38957d31021be763344f5860494d212a27e80825360e3694e93007fb9479c09e8800fae7d3f952c0007d73e942c5ffa6400b40b009e0200024021740200071e21721a02f0d05c0682dc2416c120b50905a0282cc04164020b10100088390b029003cdd10470981902c12007230c8cb7c6450e9fc51520380566a1b38000108ca084021a49fc1fc08964228ce7e0102b46004e712208993a5a160655bcffe800128e1000438be5788ede4881f2a4a044062b804b2e702435d8e2a582a049992a40012e0ae8e0004c38400100001363848117755e9018c3d5571830d31c5af3838451b73d8b001241c2100804f8080003dc81a828000e0c84e16c26ca60b04b09a1984c8ce7e6b8b853b01bfd08b4a578fc7135fe5bc9f9f52e0dc8c81b000000000000000000000000000000000000000000000000000c8248c40c38a7887085023828335e87c82bf0da143eb4de50923c18be7e979e3ff2b8e1744a69055cd5c04826786933920de80f2324c64242ef4f7847c8093c10d3c9e96b90731997c86f8bdc5fb1a4000000e101014000006ae078aa071d0aca104a60ee55240e043c13fcbb00016ffb26298001a91172fa03245dadfc18e384a020d2025fc77d11246481cb883d86cae270714c195f95d673e0d10a8141a14db8ec411b67718000f034e0c31440853d7de0c0c71d527e75f77cd0805dabd130f574003827510284d88f8bc52400d014015e03920d5cc39fa06068d173530850043851c0dfad3a5a8a2fa723ac96fe0d111abe64b0bf44080dd7129fe103816687e74a6598a0bc25873c5be8106514fd3c67e9d884801681c24835730e7e8181a345cd4c214010e147037eb4e96a28be4b0ecafab834446af992c2fd1020375c4a7f840e059a1f9d29966282f5ae1b6783a04191c7f5b695a76212005a07000022e20008ee42b80615a03ae332ec89a19dacb2c653351186956e59000000000000000002584ca1feb6791cf610c4e3512ca20514c0c104c00300030200200d0001a42024220ac010004969000b1a33f35c5c29d80dfe845a52bc7e389aff2de4fcfa9706e4640d8000000000000000000000000000000000000000000000000006411c5184383343182082509ab787039981caad1fdd45181b111054404837f137123d3d4974402f59027557358714b473aee2677643b1208c2436b3705838d049d70918008762b199c5ef43ddac13d67de45e2cf388261461ec6580296bc9a11883a0caa156230004c521545304f2581c10f0bbf1a1c2d58cc24558454db8c304021abb0debca0a0ae87dbd48281dbe7dbff1005046ab761668604181fdf227a30802b936084200000f56a2b0bea3cc4801501602a00614e030a901f92b3595e85309242057211c3dc1b81af8)) <<< 16000) + 0x81b19c92100502875978e92801de439ad813061080400004d4d0a759f038f6b0608e02ea589f1c288df2bbbffad45064bc7a3645885042634bb5a6204029ab07bed6c408297bba903d7e40032f0fd0874800119345152fc31679002c03405400c29c0606a03d302478974e3b0694a6f5b085fd72c657fae36c44814110ddb2efa878209edda43132625829947eb0492918110efc429e01020c5cf8350d8d4a01328fd9b479f3c6c801681c02980614a03e342511ac7cd2a1c5af99a876bc07347035f70f2f32860ece1e894bbddc71807dc00dfa30061cd3aff82ae583025dbd49ceda041056b8824709940b02326fc15d5c9dda848017820029007e7044c830cb990f30e30119f827c690b12db0608e8304097885b8d230823fa9eaff89a8d0d3aadb4bf8d040605bb5d0cafe0c39e00cb232e09802755b70d5c3a78d9002d03848c7e627f9e46cf30897abc58843486e220c81328f1dbc230a2a6c2c4143effab860411f328b937343432a20d41733c80dbc23130ada0c3beb02edc57701c8015016000084480022d10006cc200127e4002ef48518882883406a1203809026028284141400a09f0500080f99f9ae2e14ec06ff422d295e3f1c4d7f96f27e7d4b83723206c000000000000000000000000000000000000000000000000003208c21018a19a11810208802007d3fc09e87f5c068750d3728a093875d0a2f6ae14a769aacaedd333dcc80db33493436e6871e0b5bb798ec193ad36194bee718e8f58820f730e432eca3322eb90f38ecb0f6cfcc08cddf792a7a3bf078dd57b6117000000000000000000000000000000000000000000000000000c99f29c0b357c5e3e5eb4dd11d76204dafeeed95ce7e9a0d0b9000000000000000000000000000000000000000000000000003191a38c21018a1981020800012fbecd6bd5417b432b3a6dbb381231f481f837f49d903507465b0bc361a3cdbde2d2f1c05e472ec9a7e07bd61b8615d9015973f999058c38cc6a000abc40d4140012ce4238a4005bf26875ad3b7b13052abbecf4343995d00aa1c236e2fdbb101fa37b52a2809a65b132000986080021a386f8704e143aa492e941a1c65487498e114babfe78c10cc2b0e4880d259dd828004c3040010000135213c2b02f11e8f1d0eb0ca50e4724add23845e8b636a20069291dd60120810004347bc9845c050ed313a194709128f0a5011860f80402740400017a4248541222a0900904780800081484e14c26c961342309911c8c000003e3a16220ddaf81e21845b07b06e3160eef5e4069e48045d996041080000000a0501808697fdb36000e162d250000991cb49d400c8e604c030d1c000008e860f980bc3dc2870000025818133ab245a0d02a7575cbe200000024fc000c1761aca0059f3cfc209c50840201300b09705c0a49bacc83721e2a650bf19ce0d1427f41bb9e8406bc65f6d9311435339a2c659861cc957255770704ebd9f6eec070013fa05f3f41c004be5d6ee06c2400a40913f35c5c29d80dfe845a52bc7e389aff2de4fcfa9706e4640d80000000000000000000000000000000000000000000000000064140a3ca3c53452c3143181b8000803400084cc0a85a66afe89e503484089b4d28199c209d430c004f83a343c5679ae0dc88c1361c14b604b047ec25f080282b2f4930c73800cce0b08a492004a03081585fa90de7954f5cdaa26940000096030c000012c078accdee51a304d079bb7e5825ac06f18282d079a9c74001000400006088001be10960984a84c25007c474908da94d205a3fb4be590000004b038531bce3bd9c200f714b74510000009604816aec20b50c06756117c02140a10804000064c8498080027348490e8244641202208f010005f6908e21000702108d09026028004db083b9281d484008d1042303401985a422c04019e8640100544070d485f0a155e7cf25c5076d8ce1c2380a898d1b01400ba1b1c082128a108042880c94186b1c236a192078a151036905c507b736a6da0481842010057050450080004108448cc2206610e33086158238ac21446108230830d84100c204060900303901d0a7c4b4fce102901e9c64e30834f49e578a210defdcb8407356e72aa18014b4b129008012aae005000004e5044010b5d49b89b89a7a4a144bf6c3fc16e86120875b175b565ff5c1ff2c8004201d98cfc04a0530038929b0550000000000000000041851421abbe2772c8e49dc270ac65dc17ef48783b6690dc0000000000000000f6f48a44f54c0a50ac7ac0b2a035e95309b0554918814910b010087f999dfb58999dabcf8a5bd4d24c056fa45f587d581abffa189db5320d7a409051a404f1e59484dacc989e59c36797dea031680ff45b3f2e034c36cc5ca50abd8bd77d4bd04e3be8cb36c5f2fda033e3d07986ccd692859e2c46d9a34afb6a12c32d7707352a7406143c8be78d789181653207250aec1b4b5d1c002fa42ca0128610804016c0610003c1c069646211438696a5aac1c6371da966650a65a91dc04c00c02533b88c05e249e8830800f420bfd8004e284601000017420fe3307e1103e828000c008004ce907c1dce44d3e6a0f22aae9000000000c6a06dcc045979cca8d1fc05b5ae449b5ae44a44fbfcb44fbfca838648838820648438440000018dba7eaec444f5896f22da21f29c77872245601c5809fc143683b62709331bcc7b1a5618b8dead8c2948aa0005ec6cf9fd91c4cb869f507269ebf03512a6a089ad7224dad7225227dfe5a27dfe541c22031831020c2201181140000307ffc1aae4e46320)) <<< 16000) + 0xc2ceb6af9418d3b91e4ddc006ae4422953c5dd743b56b30939a80a5734971ee800155907b09d71997644d0ced65963299a88c34ab72c8000000000000000012c2650ff5b3c8e7b087979cca8d1fc05b5ae449b5ae44a44fbfcb44fbfca838630a406284184202183c786fcff374fc7b0913d99b8f1b9f81bd4610dc91fff84dfcad639ba10005a6996b0cca711090e57028af45113fda18e6a43e5c181f2f05d87390cda0f40bc281199ca2040711e1fea70a12c0ae27e818511d01cc7080b85e7628a182fbc4a79a8a00a6c65ce400013901100400005c883c9081e0740ee1a0760d03a8681d034000c2441cca40e42a00178720e23a0700d8378681b8260da0306c01e108bd84e9a142bce381168e08f4ce2d80a00e94f358c38035c6adcd4009460840218402787861080a45ec07f62842f660dfe008c40840200d61206a0500006d10691d8340cc19c560ac030660182a80c15007e5a736b4b30b143c8729e440afcb90108144ed733dd79a04473c43b1409450840210308daa62ae48d78564b0c185fccb8b469c027bad537890015af37c20128810804206036feb2fcc18695efe1648d6e2b38114051e64e00a8c2f8b6a278c09430840200ca0200011e20004884190375a1b6b3efc7e3a8d3ccd01534d1ae8b39702d6ba93713ed5b4c7014d54727319a8018c422338a3041c41033802c000b08bec551a9add70587dc5970083c686eff1d38f5e6b54516c82380b475d35e65e2226c31303dd06301000163106201c4938752ec742ad1e6dd4afc62ae403b37bd713687e25a6bb7bd713687e25a6c080ad0db59f7e3f1d469e6680a9a68d7459cb816668c50630618468003ed06333a8108ec71119739c89478e27a9ded061d4ff2436f77e2c8dee72b327061f106ceb58731bb850d79646a0e04204e17ed1600044d5e7d1a0bd430900f3ed7b988a1ff10d13ab8577a2d91949350b9a0008e4418487124e1d4bb1d0ab479b752bf18ab900ecdef5c4da1f8969aedef5c4da1f8969b0202b436d67df8fc751a799a02a69a35d1672e0599841038a10409800e0000885531c44f2bc74b6ea5f838da5b3657a78ebd2621d1a74a190f6d2c9bae88bc7cf72c98a81ea09e2e2628387d7e25071fbe79dfb166d9774000edc8240e811c74001e284180f60be7303f3182f14c1749607413d0e7b100d4ce0139097670900a88bb36c000023282000868b1d58c943d319f3d4e9554f0e068f53428716e588021e41ccb0d4fac91395cbd0d9a93e00c03d596c450037f9e4c57d5c389e83270d03f39ed53471d574a94371be5f9c603e2b93555d919bf012b343a85622a0000c8db4d649ee5a6af608bf4fd9074c9f4415dec2f7c8c479a43ad76b6f874e32c46347ca3caa323100000d72e549f85f4b51db8a966a027f9cd4f33b123ee902e69fff00f864fa38a400751e515bf2a98322404383fdbbf4914a5345b3e29ebeed46b739667964101c6387fd13962db720a5ae63125005f192a22483070dc382708811074f95422081f008401004011a04aa70974841074020000098400022482286c170360b60305a01c920ece13349e00f51223065801cea5e308a047edee6240005070880100001cc41641400051240024b4e047185344f22612c70a0f1c167e6afc5b40d0dd9603cd4bb60a661539e8953d9e417e9948d3aa4a6db9cabcc3d2320284a2e56c41993a8501163f043caa667cab97ce03bd70b29c2b4a408335a27d3be790d950ada13e4a122c9a1f0e1402c7b31d8c97ade3edaf6f16765ffc80a5721c552d485a35e33c0fdbe6689c3af6727aed82326166363a1249796c0000116b1287ad9f4f261609eb5c531f6901cb7e90e95d8be41593a15a443832e0d57206ce8184f9512b3b6b0d722995b8fe52219d5875019d2117ec01fabc552dd04e3897e65ca81524c4e80bad165b1173f90c929912a44c65ad2a5000074720b06305725c4938752ec742ad1e6dd4afc62ae403b37bd713687e25a6bb7bd713687e25a6c080059f3fb2389970d3ea0e4d3d7e06a254d41128b87df7350c2053f20c828d6b9126d6b912913eff2d13eff2a0e06fd64b6528c74682fda29dce3c20d3aebdb848a382600380300002001ec83bae2b74b196f279cd610761098af110405b6c6ed3af9086ffc2135aabc8a5fbec76620eba88ef10ae09221e5a1691f18bd4e902d5a1743805822d6db3bb0f3258a59c599ea44071362c897682e820b6a1e2d316cea2fe3538a6cdd0e60163a000cbc4158260aa0b05401c045ebe630a40692fe8a411040f00420000200888127088784006402000008e78012c598686044be31e88810740200000ea400045082980c14807840d44ac26304b0902018c026b73bcc020106535090028283e0080000d53240d416753242a9d0aa101001996a75808c307c021e4d2669fa9300405821863001027528c40227665ce812060f804000034cf0c9d4d5070202065d5c370812e3b808518001fde75987021b6b087e0128810804000042482882c000b3c8280ec13c6609c33c180b968078c26e069915341bd23c52a6006ae3b2f1000024281f0080000709c24ed341580204121b0f20080fa7767134008c608402009a0304c01e12c8daaac060009b1e3ea2401edce1e0a0004640420100000b720964204a050000ec9ec5e5b3841451638f06e02a69a35d1672e05b5ae449b5ae44a44fbfcb44fbfca8386508206182680400080800015041215bd801d47c4a52a83f50bf16ff37988c5e730b351fe599c6f701119930c611a37d00028c3c20b5b86d69d13ea0ca4da)) <<< 16000) + 0x26453fb73ad8d70ade2acd860f01873ee4263cecdd4a0760e78942d6856c708418e4c02f62d74e004e888a7159b27c4feb76b7ca35125cc780000000903193f7c79bec44306931dfe6898057aa12cb3c80ecd69ae3513e9d703dfff13da3b7f63eaa9e7238f5c8deffd56d5aa650cbc08e1f7f0520710c6695244000043120925a048190238a81185400204440bc740763a0028ac208a2289270ea5d8e855a3cdba95f8c55c80766f7ae26d0fc4b4d76f7ae26d0fc4b4d8101029c1a08456165d1954ec155aea4dc4fb56d31c053551c9cc66a00631088cc0c908808508a009014de7ce2436be5259a94c3a9853bf14902d897c54b7f3d114a088fe5122f6cc3e66e0a01e0db47bcb01bbfdb1ff8163524342fbdbb6a67dc913e48cb2bb8f16186418eab81b1ed229ca48535c9c28b8a11eff1de0a82118c1100400002dc8220ac10c5608413a25080b9d99fb5df3e86a14b9ff13dce4f1f75a4e660764993c7dd6939981d9284147954e3b2c702cd346ba2ce5c0b32011c11012c0180011047389d13e093d02ac927b41333672df3aad1e9d4c885a60566f91c3b4c8782aafb5f80cc4b7d691927146f1b63f453afa21460a505bbe7c2374a5d79a745419cc183da0c14a2fca0a0008164104b60805303f2181f10c0f4760783b03b1981d02e0300200880a008022018020088038612c90210c1a00800002698080080200000888000639000104301c0100400001110391dd800365987410275c328f800110e0f80420380200800002220700a0000d7206e530362581a8af90a6828ac5681b3769b502acf6bcd784f982d581f7c60a96ac4b159d2f3d643cf5b82ad6b9126d6b912913eff2d13eff2a0e20c20409800e002020000143aa87c80043a6d19139e8d6891cb24f1ba0ba9f37434dff8909fdcd09927e30c65f9ed1c1056bdf4bfc032a2fd4d304a6a0006ea60212d547450c00934283042021838f65c00118c10804202054b57f62855eee995850188750d78004c607c01000015a40dc7606c3b0350dc899f9fc6ea4abcdf4644b5b3b5a5eb6a40180de278661b98df144c2d531faa7e69bd6e3820cd9d67f0ab78a2fed9ec19ccf8516f10809a98e006fe394a33ed147611cf6ac3024380bb8870024fdbbe19689017623d6133fc006cc25a471aaef321cbf76ede4555eb450007237538a109a520dbeee36b7a5248218c01a008000fc48199480c8240620a00060620606202f190170a80b42400199240b0b40565202a05000bb2980e93825bc218310e68f1e4906bed291341c11419acd504040cd9b29c1c06782588cc603a0da0c6f1400076af1594045005a0f08802142d4233610090de11910a240098f926050c0481a05eb000483042010a00088b3ec28165396f700884074021802ea691b140b86542822041c0087016f6c0c6200360088000080200000888000421029050140080004ec8138480007988130ec094760481b0230dd128405ceccfdaef9f4350a5cff89ee7278fbad273303b24c9e3eeb49ccc0ec94208000002f33d58f27541c9a7af50726a50043554d8348dbca759529d5c0ad222ab49545017e467c0beacc9052f8dfd7f74588febfba2c21229028c0960120213ce5bad6a1481682efbb75d25fc617ed389a5021f7d3a96d18b06662fda6e928fcaf8d68b050d91cd059f760860c7d79454413ca047501c271a1387e358852c11f2d304cc68d2416381cb13e579da0ca22516c10000e3fa6d9baf665959caf517195b4e3eeebb675a1c9040cf8a0cdb3710182b47e974786cf8f98a836abfaa07250ae49e291b428e3e8fefbdc570e40ca06cbc98c97b6bc13d7830978350bce2d814785fd3c193804a934a51795f216b143f73d31ce60ece800655658d0c6471d6d257c8a5fa5584631477689a721410000143d6217b4444a5e35d584cc71b501ea162cd6d785de9c74375cc2a77cba50e4fb0f84c5ec566b7defcc4f601fd66f14e385e2536054f84545f98101baf5b112e2c68a6a83b17a8d150764b1ba88e951c3285763ffb7186d8f8a5cae64691adb690cc1705df69fba1cf15484397dea8d3f22ede92043744ce376a75fc73b99bb3e9a454535aeb7c57da25e42ffa2abe29a9608ab0905df4c257c7ec368c8f86236b98ce602b5ce8f35fe44d8e091f676a2918af338e0088040013824084540402a01f1100f008003f1480e968070a40360a00135520343a0191900c08805c4402c1a0150500a02804c04002b8e401a2048041f119f9ae2e14ec06ff422d295e3f1c4d7f96f27e7d4b83723206c000000000000000000000000000000000000000000000000003208c10c08a088086004020a080b12686d1c39215f9dbe5a4a8116a1325b86521212278943493df8d6cc4de4ea8363b1f7c40ab77efa3c8d2c2725cd6977bf0a3e4d505294c6744acfe59277741c5cc0ede9f341633829a5ccb66fa82f2728cf40c24e8c81da665c366a1734e3243080269211dfa8e10000000582030466bf87d7118a10000000bb8008218e9053e980a0031b8c8b98c080186c595b46208882b48342a01400900f0d0e2b19eeef70b39f2295808b430800c5cc43a34d645774deb8c2a3840000000b5a780bf8ddd031ef0304356b434141c64856168eafa3e2840000001827f9f8cab1d0c16403000088ec336a8d045bcdd5b5f828222000000019c5136361989b8cd3c549cfe44f13b936b3183207c0044140200a0003a2201e020005d4201c7200d2500610802c64014320091500406801c3400c02005010005c690042100188800834002020000100c54e1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase5" = "QuadFullSixteenCase5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase5 private def zz2336:"s0920"="s0920":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase6 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l16 l2 l20 l22 l27 l29 l30 l31 l33 l35 l37 l5 l51 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l2, ![-0x59682eb50, -0x282033c8e6,0xfff4ea9f8, -0x69ba78030], ![0x53b8290e8,0xfff4ea9f8, -0x31084d13f9,0xac9237abe], ![0x4b0, -0x69ba78030,0xac9237abe, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x5e9d6ff7,l5),(0x846a332f,l8),(0x124306a96,l10),(0x4fb6ae1c,l14),(0x29841474,l12),(-0x58d496e7,l16),(-0x1ff3f140,l20),(0x1613e760a,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0xd3c74f3,l31),(-0x336c6846,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x124306a96,l10),(0x1613e760a,l22),(0x4fb6ae1c,l14),(0x846a332f,l8),(0x5e9d6ff7,l5),(-0x336c6846,l30),(-0x58d496e7,l16),(0xd3c74f3,l31),(-0x1ff3f140,l20),(0x29841474,l12)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x1043300a0c04000000021038802000000023018802000011024038c0300000000f014802000138110058c0400000110f014c0200250982402d0030000000780248030000c42100a0c04000000024054803000010844058c03000114250130c040000000b00248030000000d8024803000001a09018c020001a8210058c0400000000901880200001b024030c0300000000501880200000190901cc0200000001601480200001c8c40d0c0300001d8cc050c030001cc6701a0c04000008828030c03000000f07028c020000000f402c80300000001d02c802810d810403cd00500310c8440350030420c41100a900400000011402c80300000002102c8028c0c2084045100500000005002c803000188230064c040000000d402c80300000001902c80205c0a01c0175004000000098024803000001109018c0200000000e014802000000070024803000000012014802], #[]⟩ def dynamicCode : Nat := ((((0x81b89f7a6084711ead667628611414e6eea470c3725a8dec60c910c7a63040055c190d44981090021034c0476388d0914000000a8c030a2e8308dbfb184174184199d8e189180d8e6c4708adc4d2dfda48234d986ec061c0670f987503124021480c000073c81604c0ac2605413e2f5fa66b2ff00810879dd8f09f22881ecf6cb42f820321eb9abca178c1ae27ffc509c050cf27c59374d01005a6ec0f2a700002958b6e6d5e203c840a1681400007e8e1afeb268dec3860d56a841c1030599273940e1195d5ffe6440821c0d5d8000128c128040000484eec8752a2b94594ccd102b510933168d94e83c2a000000000000001b2f694f1a53717e25c0000002c4286304302182300280200000dc700401a00039440a4860501a0270d8130480941404802814200c250e8da1c2a99362c4a5986085baf74b977814204dce531f828800337fb7d3fa41c036cddbf7e9fc50009b9cab9ae5000f8ca54c19a91f2fbbbea36b6e38a17016207a246eb31e648144c91e3af2914450211f0ff7850c49c5e9e8370c3a9b92f21c1080953725e438218222d52261704405539a6b5eda200d9a557683c3f12005404802301c90625ba11d6448c645108679c30a911d6ee1b84880207f1d5343085eb66c30e0209ea2ab4973c486f71d4c20d22849445a2ba2818321fa232783c2400a007124183cf4c5b3123196e359b8d0c2a4398506f2122007b111c8f0c217ad9b0c380827b0e24bbe9121be02237a838a1251f3f6006060c7b26a0ffbf09002801c0000fd100040f3450df63deb01c61606dc1764882569eb7e08116ae78ab80818fc60fbad1c19b5cf96e02000e4bd86a02708230080000b7101305e0a097c63962b20507f85c5a4b8c29d01ce7a62851456304443203085d8f4abe7c1048153be3f380c184479cb1eac3083d8d3550ca2001fef4ea6d7d92005203802201f1907bfc7f270d1862029c34eb320714bf2449c9d7a1458348b29d4ce0710372265346bb103045e474f436090834b3b5b6e4c0c1162b840cdc00500346b4693a88ea09002e0307196ab226b8654618a7f85a5500071526760517b08516d61975cf000710443c277cb4c410000005dc000908118c29affb0208cf22f9729003049c1fdc9c942804801601600008848002381814def7ae832e85c18408efafcaf613885127d5a030fe8bac1045f255ef4f85d2070ccc4b8fa487e5f1432b9600b05a603c30fd7a87b55de8b608111d) <<< 16000) + 0xf6290dca71060086415dd32e038f42404801b02a008404040020002b0345063e989e45080716a0d789116a5b9b391024f7cf6d3f1824bdaaea4028203c0a12f010472d7da54013861180400005bc80057c10012fe3c3242e6a6fe4480bb7d73088ab1c2540d6413d1c408000002a3001c15a0d2ea483c60150359595471403e5f8729a8000060886d25620908082a02040cb122d71d7f20591eb5255cf8c280000035e8070c800930d06e405c11fe7ecf11c2000001af400800465264fca4000bdfa4d1410174041480c0000744deb50a62987c36d98f2fcb06459889359935929b9f289025a6a00000000000000000110451041030c7087046045004000c0600803400069480f80807804000b604074560382b01b1580d0ac0645603023a2d3c02ea0100177761910a066e19dce8402ba052b80080050a08001002e02a2002c096e91430139427d43842413e1c4c70686ebb05986004531251f0400f6e5c6a6020131011804289181559bc250a874115044a1209e1cedd140185c3077a000000003ecc12841180430a332f23d8a50a619d3d734a124a66494984080085bde71c001428c3b818002b98b52826082300800009f9914391674eb1221a6da0bd32438f8c9820e3000fa62b574000492ef8d60128611804000044880b04c054260280b810319798da2470bdfd8a59f46efa84057e9bf7553b80eae51fe655140181401bf5c2207602adf63cba6076c2c00030a19446bf84803ba941c40488a00171caa0f384cd79fc8a1ce81dd6c04a7b396328c1391276c20e368980000b2880035d901309d0471d09c8820dcf49f5f010009140f802000022480046c9c36f679325446101fbfa1e861860d1fcf20d1010000000c80208040c1528c700000000c80300c9f49e685410006e584a008012010000d09000ba82004e9664be21bb02f7bdcd4c94602a2388404384284402282200101b373f66108dfa6fb50b2d483a03f885f20313031b218f73059e51c5f38b648cbead5123a4123061492748bde6e9b9fc6e81d1eac9e9e4900e482727abcb5c641fdcd8d661959c9cc2021591901d42584b7bd24bb056298e2ce0601aedad53e4cfb7073d9042f3d79e683a0802122fd197b5353bce92a27058656e9c017250cea9743e6a3fcff374e37cf7e1d1b44390c30b79a51241537e6087e174497c437605ef7b9a9928c0544b2ca1c618a148148105004002032000200da1cd9c2ccafe0a18fd19211748a16b3bbe603588100000057e408080000057e401042b99df0460a025f13ff3c065b801400e0000648c8a6045da070a10000003139224cb6bfb5f1c3000001f0e485f4482165c704000004b0140000473d06240423aa12794001180400240400035c400119480045d10110980804e08000002a300183c258092e830e090e15aecff8605f5e974080c20200000151800c00608535cff04010e15b95bf80016d5b9dbc308488c0c27360642050a408001e02000216201c3a0020170ccdb3c13a1c9b48cc5706118e9d9834df0e3728a010154b53d70dc507397de82810be5874439207c6b8744021a21c99940f188b84486014c4854289333c0fb594411869d7652f3a8fdc03f11f4a8cf1faf89e5e08a67b57889266204b0a848afac473c3786c5c25946e783ec79c5109a1ade9b955100fb5c41cef4d9c0c18ca415a9f2bf8c2a71b522507e4a0c39a709382c92dc16cec8eb146313c30153c864c8b9fea98cdfbd9ab6a8045016cde886d313747473825bb79094089002c980a121574dfa65dc7fe33bb4c04f1b466788a5e2b3063789e286434447860c28ff16d5a0504f89099da3813af11cf00400874a4b40ca1042010c3331d6ae7870f14eaa1502044f1ae6cd241136ff8a69201bd50a6425002100850ea75135ff1c71986059912314eacede861a28049e40380a67248f4180533844db4c004201000012f3861f346e8d8814fa24de1e145b04190f686094d850a422c00011e9c14600584e978e1403fc3d1a9a700220080048080005dc8001ee90004fe201a2200c0980584e453abc8e340510441ce183101041af9ab410657727fbc180563d967d110945088021442474f316e0e89422be6060cdabd611011d1fcc122218126e8e3081a11f2ed4790404a47125493a800f3d785041bf9281ea1ad1f43b70009004df9a9aa5817d63661851d30a9df86f0c75385ce0c904a451ec130a2705a0000afc80500800100080069c100104b3b65e5ec176555e6f28a1c215899cb8ea4253e81a28000000000000000000000000000000000000000000154461861060c7086085083001005c06008036f5a85314c3e1b6cc797e58322cc449acc9ac94dcf944812d3500000000000000000088238a308406386306204282280380801006ed9797b05d95579bca28708562672e3a9094fa068a0000000000000000000000000000000000000000000551249247285245205243100080c0000803649fb46f42b9c91c0fafd25fc28500000012c0914ca249d2ec20500000012c09001f354aa6bb00130020000530c11b1d094f1a88182ee6cba5612200000009602042abb68fa48388000000258090000023d38a10005fa6241479c009c0200120200019b20009fc4001af080408801c2600c13bd6a14c530f86db31e5f960c8b31126b326b25373e51204b4d4000000000000000002208a18c08a08808a00600002cb5d92bb03cc5f904d1b3b6e6bddc248d016919b816049b1c8f542c36c85e834c892da55dd271c9f20a80016090050100200800300c8019480088400202000010014cb9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 17 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase6" = "QuadFullSixteenCase6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 17 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase6 private def zz2337:"s0921"="s0921":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l14 l15 l16 l17 l22 l23 l25 l27 l29 l30 l31 l33 l35 l37 l5 l51 l59 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2cb41dcd4, -0x59682eb50,0x861c42090,0x18c0], ![-0x59682eb50, -0xed36f20de,0xa74e6ccb8, -0x6b63d669c], ![0x861c42090,0xa74e6ccb8, -0x31084d13f9,0xac9237abe], ![0x18c0, -0x6b63d669c,0xac9237abe, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x5e9d6ff7,l5),(0x846a332f,l8),(0x124306a96,l10),(0x12c305748,l14),(0x670e9b6e2,l13),(-0x15390468,l17),(0x46cd4cea,l16),(-0xd19e31ee,l15),(-0x2f743d5c,l23),(0x326f97baf,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x397cb94f4,l25),(-0x208b4f34,l31),(-0xc3713aa4,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x13f8,l59),(0x1414,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x670e9b6e2,l13),(-0x397cb94f4,l25),(0x326f97baf,l22),(0x12c305748,l14),(0x124306a96,l10),(-0xc3713aa4,l30),(0x846a332f,l8),(-0x2f743d5c,l23),(0x5e9d6ff7,l5),(-0xd19e31ee,l15),(-0x208b4f34,l31),(0x46cd4cea,l16),(-0x15390468,l17),(-0x13f8,l59),(0x1414,l64)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x3c1c0a3008000000210702cc02000000004500b200c000002283808cc03000000000840b2008000000250a024c02000004108409730100000000001c0c801000000000840e200800000000210188020000008e0a00c300c0000000022014802000000084180630080000020838070c030000000a81405300800000002a0c0cc010000000a41809300800821cc62032d00480870c60805e1401a422031c20245d006000000005500b200c000000002902c802000f02105003c401000000841400f0c040000000941c0b3008000002683808cc030000000a428093008000000c8440d8c03000000000940e200800000000250188020000009e0a00c300c0000000026014802000000094180630080000024838070c030000000b81405300800000002e0c0cc01000000000030320040000002d06024c020000007229024300c00001c4510230c0400000811840c830100000001a0a014c02000007515408c301000001c4510130c04000000005d00b200c000000002d02c8020018c480c4053401000a920463018900400000000009032004000000002b018802000000000a40620080000000005c0c801000009c74540540080000000074030803000000001900c200c000000013402c803000000000940b2008004d08c1200c9004001702807005d4010000000009802480300000000038052008000000110b018c02000000001c009200c0000000012014802,0xb03200400001544701b0c040000035054048301000000941d0318c040000000000f03200400000d42701b0c04000000003500a200c00000000b00248030000000036009200c0001a01040098c05000006a08401630100000001a09018c02000000681100e300c000001b024030c030000006e1100b300c000000000501880200000000024062008000000190901cc0249c33c128069240180052124360095004001504d0dc04a40100ac12618406290050000a84819015400c0002b1307007500302a04a869010a4014005c12431032900402983384700d240140000000016014802000000000540920080000184550218c04000000005d00a200c000000002f018802000000000b40e2008000000002d018802000000b63201c300c000000002e0148020000008639016300c00000218ec050c0300000891d4046301000000148280dcc03000000034240a30080000008828030c03000000000c40e20080000000031018802000000c63a01c300c0000000032014802000009520802930100000026914058c0300009e911011230140000024904098c03000000a649016300c000002992c050c0300000a9254046301000000188280dcc030000006e2d014300c000001a8ac050c030000006e29034300c00000198a4050c03000006915c06830100000001a15014c020000006629034300c00018e2840920c050000000000d03200400001544501b0c04,0x4d00a200c00000000270188020000000003c052008000000110f014c02000004e04401630100000120110058c04000094260900b400c0000000078024803], #[![0, -19, -45, 23],![0, -8, -45, 12],![0, -16, -41, 24]]⟩ def dynamicCode : Nat := ((((((((((0x14448bc025c6081c27594238640c24f731e7420416146abc88c00632a81ce0400085270f56130412804288957dfe991e1038aa66f3b77c81855335a3c3e48a3952521516204000004f0ec041134d55a37102040aa06214b858000000083402403c6924126f072420a405000040a6478ba497f4781c60868d9f4f82850c831804861c5165a06e9d81c30000043c3828210cd6b621428110dbfc5f5f041020c1f833a1000df133bba0072430a00400003fa421c2610c130230981104c08017037175bb76a1848a1a7c9441e88c2844fcf2616848847bbdf978f8c214ae878ef2838604f9c912980c100000370ed8180417af7a960000199a900c52000084e9242a01c00010f1a098aeb37a26f00e740c8156a522669a7502da8474b58b3c5d0a8fae341531c51442031410c008004218c4a07e13999138c648d8d7d760b3183b086d86d32f3147d20fda28738c04d8a22469a0004c67861e74dd15040d06edb7cc8e14521fb4ea14244747fd1220461ed965382049f883559000203316118040000540fe498bf464b304b36d9338000000038228630220218230028020097cfa963023b27f8077e3e30000358930cc3) <<< 16000) + 0xa6cdc38e60b01e500019f210a2a0841104188c208261020a08001710658b25d66451000001bd80070b936e77a61c609e0f7e19080504000005aea0600000018a08050000003308a027ff95377080ec5de73f4290e285003806401491be47aa757b048835ec613c75a209c01c3611f2848715fab2b8ebe30621f12a9c0083046257b6abe6020461b23fec45810459080f4be302839c56651e1a914920058060c14a95aedbc1841dc34428890c4cc945e718337fb722b45060fc5ed0320015be420f830123b4a9f99c00880200002c66cb1962f62fcf7bf8590c95b8e0651395061870c61f27bd4c5142af0d54a08888b714313a74ce786768640549d2f00b0ed39450870280d3e28e998a005683b0a8735c23d09010086e0a800024e3c6475adab44f8912fd71c321d6204388e6505ba0a0c5a41e0f14a1031f8a20b244c70ad053c268de281069a51acf50706d053ffda0e1410aa5e88e4349c48215012003c0600044841581605003915841459e8af10e280540ce1dbfa145d72bb68d86bc4087df5ff3e33189084c9f95b3c340a10102bf0e29c008247d71d5bdb203031c98b8580e5c600496f21bc885f4712005e070c24e74d5197d7ccd164236ac5e135fcb3208000004c5caab9c58817c87f31836dcc4100365c929298810e1c0daf5caa61efe1420518ad8fb4e4f4583419ce768dd39c3d09010006e0a800024c3c784ce7bab8614d1f2ec3f20140ca6f95840481927a0c18014a2e02d8100729020b026042200800009b1920ff8f220a1d61c504f8c2b5f0c86157a74cf347ef30406fa18a18500810b2727b6048f104a8ac838ea9a080416d0f0d387c1400fe480562e10100113c2e31f20bd04801701a2c8a1544a176490350363818b1a1884dc919430b7491f1818519f2569764841f84e78a08001f6a8022ce004601000016a20fe030003d020480b814561aacd49708c2a7691ef6ab6b2044d7aad66ea30209a53abf8a240860c4f2825a696e0619cdf471550ae1010b1f0010d9402801cf1fd2977103004634e630f0e59712005e070b23789e4d3e16351eaad0c928650375797630a00000482c7086aa9848104113dbb015810100000e7613801180400005a8c0a64561e6249f0614b6942f732d79022879f9f17aba104b1c8b05346e038604f6b01fc5a060c427f61ce4708e091ee15cc6db4140068c71d3d104180049adf07ceaa4609002f038591c8089c9c9470c681871c016d1b0bc08c6cab16325e6c4a3369d993692862fbef8922b28ee3be30a0111c9c4207132bb470460f1db668750d2dc0c00016d0d058096ee4fb2d071f83802184200009a4800262107e0583e8080023388009709001b6f20f8339240000170b650162d8216e581bc2244c9ac0badee3040889fb3b18fb5c5100efefdedc6d08193ac6a746995282bd2182304fba280000005fb68003005b4c5291db17bc480178182c984fb76330962c65a7e691e64b28508fc0388cdf10332c5b16900328211e16b7f2ba0410000000a5c42c01388393bb8010002feaa0a658c88002c0200000f39b2000000a4d90511f827876267287703eb793c71426445d15afe4910000001fa40186955c5c14401c21c18370e43120c0aff1282a8b0000000ca2f0ed2085203000020434380000209c7c123d8759f7b2eb8a2870fe73b7da122157b2c4e5321218f443d51cc49018000001d010120baa7f54ce1d0c083dbaac5a6e020003d89fd07826348416010000088cc1000000c1aac0b0d54c1ea3648901dfdef8bd9cf1c31b05b47690e2070e4dc09aac46086b2642582c881400d40b91aa0810991cb77fea20000000648c020920056048a2212370694050b00b85e0a124443d5625b70a1806b3b47d030cfcaf4c0ec304034c4ad370410000000d40600b4e39e7a6800250080000d49a1c00000f438123afa8ff11f32468cf1baf294488b2777045f890e780aea574901e84e2784f21c2d09c4e4e642822c88bacfc0a00000012b8834904270140000f89038018002fe107b05c1000000a5eba40918bf0750d658b9229181f1724b53244bf7f31aab9f440464929d630ed870920b8e3607da08110be3c085696100000002b1220018047d0fc5dddeb7b2400bc0c14443e1bf6d5943b3673a3c9142dd4c6ff5f12242c799f410c1929fad6028e10e29c63ac8208000000d40401642865785000480100001a134380000186c048e5f8089b2812371fb6adb064885a7df7f56921c74e2fea80406e6b8496e80a11ab8701640382e6b848428140000001df40c48213008000079cc90639329fef0208000003b9701438bee94c403ca16d12c5c2502508455712f7e0244326a0fb1b8041448e793aa00400000007bc0010042cd1ff3a0a2400a406143c3a7280999c32e48a3a41bbf8734401424f39cae0da7136488000015442786006119a5d9ae2512f61041fc80abbe0f050808000000946eca0500594b2c66b562b8200000000a552f2117122400d81300005086474bd639a34e923405c9d67bf8718000004f5f04082b6b9ac3202436552faf9239018000068ade0209613b7f46a048028c4b1c25618000000185643a9042901400010190006bf20f40b0790100068010780103b80800703883b0ec1d4760e83b0731d8390ec1c4760e03b06f1d8370af0648a591163040000ff9218248a760ce480d290817230198acffec08198adda80004c2840010a28f3f025321820000029c43020000162ec100000079328005907f68f40025142300800008a906d158360ac1ac560d42b069158340ac19c560cc2b0650503)) <<< 16000) + 0x200a8a1f8e544d870c3c5b1ee18e14f4a099851c1ad4ad7d183002c41ceb6c00230825ec60228931211804018c0601e0206201e4b662bebe71db8258d5e055b59f4d7c0000bfc9317e8c9660966db2670000000070c92091491090cc003002518baf021b1ba67489271e166f6a8ac771ce91d128ceae05358315319c28610851a6d12a980b67e0a1594c3d1f79424903b39ab2800a60c31d22481846010c29f152011e942954ded2b0284e987a339430001413052440001829e5a0128611804000044880010810610d83006c17c360bc1b05d0d82e06e4504b5242ac48892f654adc90f4a83bd5e9800065a94bb0424142300802d80c168060b203c2887dd5c88142b1eb891f8284c509548e238447eaca4487043ac1c7fd82094b25c736040261c2300850a38b9948d9eac482b45069337203902ef04670171e99c64142471db2765db284efec7897e4911209378d9833f5f85957840001d1f3c7eedbd85bda2d0e1d2627409af8e998dfbd17640c00277873f83da435ef53cc742488a553fcf9d4e0bfa4d7280804113846de7b37185831f5d3936c76807a81831bc7ffe5b14d320869aee03346b1a367cb57872f0b2209d0839744c00004972000bf64160040ae02000766200193441582605003b214a876316fb455b39f0dd92cc016b3441fffd1185dd4c54953ba15db667efef23122bea394eab622527d31eb065316d86b3e56d5699a73c8be33ca46f8a31af4212972044300e494d1082807593fde311140bc5338c5c08dba9f7ad2f5bc52f31d7d0ce3e381e02749c706c6ab37525071a5d38c98616f2c83fa7fc6272b57a12ac427c1e9a5801408a7d1d2d9b97304e7697a568a5a7dbb5db367fa587f84900b591066e5b22cf5908552a11c8410ba5a794f283d9b785d5f12351205f17460cc4c60a2b6964310338c6080aaaa7933021c6ee9dd1214431b5d8880062e3abd60804838420100550d82a06c14c360a41bd1407ed0592942811a3978534309f1fff94506400513864804087515a08e0885dbbaec041ec72d0d98084e28460100510182800c13c0609c03b281759b8b658e0e80ea52082da2f53a400005af252ac10a0a108020134060980304b01d940ca4ec4f0e142715b20384171ec837c81c00e85f89e43002e646c3180000978918e0200cc404601000014b20005064128140008f6400173481204e020020080490982404c11c2608c130450982204c10c260840b041018200080003d08006b29001bea38414541dda50c1900e61607c40c000015150301efc8c04861400000101ac22088002ca804a01003f010000a5100209e200b67c7887d2395f30a1809fded3e20628f39ab08a103d29a96c30344c466a2880e1459e0aa10232bb508d02138a1100400f80607a0303c0181d80ef45462694ab88df8af454626600000000044248a40a308288306284382202086913648203fe2667aa8d5a7e25124799cf9360ee60717440a07403bd15189a52ae237e2bd1518998000000001132aae2f354f816448a3082884863042842000852684387b11ca0703dea09dfee8b1a18712ed64cbe362b60ec73ab903a8b3400087880020790390181c00a040807c3c5db6ae8405e3b30b3bbe2b989dfbc685d60c50c0000e6675175582666b4e77aecd5adb2c837ef531910300001e7b675c66d5704af8acefb7592f61e9141fb105080000b32cae9cfb3b89ab65e90e9b8f0e72f55a3ea0100ccd2b14ef8b31ad65b34160d1a0f888924f4aebe534100674a32e34adfdec7399c7f529e03972958f1462feae49061991c15dafc38760831d76afe8956514aa22801b82c0d81606a0b0340581982c0c817c5000059d30e2000000438a0827516142284000121202010a1a430e0a08000388e02064e2b7eea04e18420100310581802c06c060560302f0181500f8a000023161c4000048cf141d45d345887040002c010103238c77e51c07085502a8a03842f05d4200911fa0fe080250484201000019a34400231650e024678e2003ee82092f18194081212015081600460ced01c011966011f1c6001c010800008020000088c928a962c8bc83102f4e10e01dfc85803f8325041100800005a100017b37dc250954c4802006e009e168f16b2645fb1800000286bbedeaf4e1359d00000e0a99851829809400600407cdb0c8ce9619f7de0f44b8061d53accb919ff7905a2313d9aea2ce1811cc68b850001461140afadf536cedc2c5ce684332c2c3460a25f9010e51f0e2a9905649db04c11c946f8d80e1000005ea51deebc99712b13e258a5aecbc75526033d02939030b422e85084b2ab7fdc210c268799000000034e219ec96227f95f44526702735a2a8600000e2c41c9bc486cc8c3da1b8426bdb8b115fe0b7344e986e5d076f1e372c3e52504961d400022b100f0100036f102e0981684ecb6adcc5e48b24d09d390d2c73428acb3491c0000b4b418200003bbb0b074de18a3b1c100002c0101001cbb2d300a0208802005803d240044f73facd8b0b570069e2ddb315c2346e77929c56bd5d6b669728e4bed07ee14d0f0a9741f0e19b8658cfbedcb78acaa0808200003615e0ccbc146515efbd7590a430b04000011ac6ba53ccd2723001a58320500800000003c1c72b8e7530f13670e7d3728000025ff167e354f691e1e464eaecc4b62f46f5ff641c03112d82e66047e1786933b960da51a1b89701fc0104000249eb1a027712a16e480000001bc02000001368acc08440100001373865e0466257234a00000406b06140bb2c069e4c2017658f8a49440000000e1030)) <<< 16000) + 0x21729faad3e6800115d7ff60000003aac467082700c0000d91000758201402009010004a3902b0581500e470000d23ec68c828f74b320c925a6d927d30555bfdd79708468e6fa980e28000015ff78592a1eaddbf760836ff138bb9ca6338c284b8584614a80a066e27096787d961fc41869faa37c5c6960b49c3a9560062a7a543eae4381e41b171daa40f73227510a3719e6a006c6785edc3a58299a2fff8a40140f20df053a89517356643e1dfb06dea2ebcf28413d82b7e1cdf95565800000b78f7d4e6db05b1d4644a3cb12e7a05c92ae229a31eb315959c21402c9374d9d852a6831e1995bc7b844799e22d01cbfff8e600cf77fa5ac4b1615ab3a6f8b775a08944411d2b6fecd7cbfaf16429e4f8a49c2610000756200350840078cc8011db90030161153fb2b4914140a6eead62024b8658de47003bd942800a00c6c88108100b5446ac801807c1e1e15c100409cb08c0200520202801c8a2a6dc472c510242a132c8c0fa712fb6a141044010b96084828460100270180400c0980600e03c2a9f50e49071178d3ea8638561a41e81182e74446f90e0b23861958504d771a3e4083fbab8b24040271c2100801280e82b7d65d81dde9eeba0a0557a2a3134a55c46fc57a2a313300000000022471d374c7209c18999a735a66823ba0127508cca1871070860850000010e6346394ac7beb52df0655beefce6320633790671cd02ca771860b6f16bebab0468a25072cabdcbac9a589536fc028620c82aa8001b9900050c20480300f01510341ad78e40656afcef51801635e1c78a07d5d6e150109050840200460b0220581082c0801603e0b01e05d8a0c84659918209afc29890083db04ec850568ba833e103153fc7420250c2100800e82c07016036030130180d00c0480761bbb17098e40291b046b290025048174a30094ca74900a0043ce52a60017d3346840200931211004000051cc01004011000010045164e47041801579b2d88006c0200000dc40002acc90054cc88ca1cb82f419902098bcf4608100076434401b6b037d870000fa25484c103e01000012720321301809e1132401f79983c1d6c20e650e1368e8181020789b04a8603835cec4e8e0804978bae0800f8c9507ce004401001701d923b482516590b1fc384e48a69d4ad8c4849d574a2a40320e3ff62180000854ed30010004349c6491ccf8d2395f973022c80a66f06489143e6a0de2342d7d98eec080814cdb62138005ca40a8e700220080000b190002a7202c120150100a0080011e480982c0480760ae5a5f2bacb2ec70478a3421148aae4d677135d004116d20c5c31c692dfaf28802411a0663e7ffbd5d3d69661eaaab6b9cf1e9318b568f9d53ac950a4fc938c0301208d0331f3ffdeae9eb4b30f5555b5ce78f498c5ab47cea9d64a8527e49c6013182e32b9e0acd01c4d00e6ab66f8ccdf28d655257eba8174859d640ea30a0400d48f47616d160df15191c5302a78946fc7fa8a6e524eade6eddcf6d54726862cc1415967dc15625b1f861394999707decddfa6a5a6242945bcc00641f26c800060920224a000d4b200209c4004714800c361001a2f3c0107c589f5f571f9d60af2ed0f673251566bcd124913980000000000000000000000000000000000000000000000005f11431820c21811411010c010440aa2b49d5f0656d72ef5f237ce50e7ae17456a66982314bae03690cc6eed83a737a86010bc5e0c745b57b256b4e5c95957e1f8a9af72ce2302e10121c103b1ca068a735818287716981f59e48376a205080000169d60d53b3ebd01800adb471463d716d68320500227be630362339eb667100000002c01a5dc67610603001a531d19707ab5a33cd1044016904037fa37256656ca165f3d8a6e7284e0a870041f1627d7d5c7e7582bcbb43d9cc94559af3449244e600000000000000000000000000000000000000000000000017c471480c70c60c8082085045004010c12008036880428892544a1a07ceec7cf246000002c820b00088cf1a33200000002a2a025082600859794fa35250791abd2ecb24038f463c75fd982b41838000005f147a2835002c721e2cea25818241680384000bb3b2e4ade2eb00b00014743cbb2ec1f61a92000005d9de5335acb980000000f156c4077aa2b70a6cf4c0800470845adf7e5cf60941700000015130c348308203141101300280c000080374d8c704bdd2149ff24326923271ffa6c12c881200d100343be334c49ec99612200000074f382d83840041000002c87a24fbb02e680008e186680ddd00b4090000000063f853f1f40604b45c83802384034dcb3e79a73a0696017446e2258e240000034b481a4949758f22aa3090000000bb8028000014ab7a340000000dc154851c00ac05000034a00100011400060002ac00140100100780800220480704c03427456dd305922814400771d8b941630000005454143104c6afcfc12300000004b014081ac69404b820000f8c9c86ce005001000c01d9719cd251c058b240bb5a472c9183800000752102c726fb6c38b5c6020000020bbecb040322f77efc12080000005dc004000000d5fe6548002b014597b9d2e705f459205cf8c501260e000001515058e3d3e95d22e50e00000012c0600002e52054858007b8720c2f3801400400006348001c2100b0900500802404000b0040201600e038152eb09923fe08ecac6e8eb80000000002212082062442041c4200180362abd3190025c807804a000276400440080099c1001673200c6200501002008006a0c8018e8008440020200001002f9b9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 25 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase7" = "QuadFullSixteenCase7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 25 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase7 private def zz2338:"s0922"="s0922":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase8 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz1249:"s04e1"="s04e1":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullSixteenCase8 private def zz2339:"s0923"="s0923":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase9 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullSixteenCase9 private def zz2340:"s0924"="s0924":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase10 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l17 l21 l25 l27 l29 l33 l35 l36 l37 l38 l41 l42 l43 l51 l58 l59 l61 l64 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x30abde5ec, -0x58497fea0, -0x861c46350,0x208e480], ![-0x58497fea0,0x1d14df3e8,0xa3b0e4264,0x698cb5360], ![-0x861c46350,0xa3b0e4264, -0x247bf5722c,0x5a9ba31fe], ![0x208e480,0x698cb5360,0x5a9ba31fe, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x28fe60b,l9),(0x5c3c598,l11),(0x43acaa7e0,l17),(0x474de602,l21),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x4d4d94150,l25),(0x2cb417800,l33),(-0x7a03d21a,l38),(-0x2cb417800,l35),(-0x2078f0694,l36),(0x2cb417800,l37),(-0xda8aaa96,l43),(-0x490d0625,l42),(0x12397b0ba,l41),(0x2cb417800,l51),(-0x1a7da718,l59),(0x16b11226,l58),(0x4d24966b,l61),(0x2e2b3a0,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x4d4d94150,l25),(0x43acaa7e0,l17),(-0x2078f0694,l36),(-0xda8aaa96,l43),(-0x7a03d21a,l38),(0x4d24966b,l61),(0x474de602,l21),(0x12397b0ba,l41),(-0x1a7da718,l59),(-0x490d0625,l42),(0x16b11226,l58),(0x5c3c598,l11),(-0x28fe60b,l9),(0x2e2b3a0,l64)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x250982402d0030000000780248030000208e4088c030000941d0318c040000000290388020000000fc04c80300016013026cc040000208e40d0c0300001608404cc0300000161201cc02000001b12014c0200000001601480200000001b0148020000000b00248030000000d802480300001a024028c0300001902c070c03001a01040098c05000018884050c03004922870089003000000261c0cc01000001d05024c0200000002201480200000017002c803000001d0e034c020000000090188020470981f035d0040000188b4088c038e08a0dc0d390050000841d0238c0400000903405cc03000ce11c0648c05000a60dc0638c0500008815025cc04000094190338c0400001a0b404cc03000001e1a01cc02000000000c0c80109119834035900400000250d01cc02000000026014802003b0c854039003003b10864031003003b0d050029003000001f0a018c02000000a0603cc02000000f07028c0200000001502c80200000001601c802000000001c0c801c608c0ac03c900500000000501880200000000e01480200000c84c058c030000000e140cc0100000130d028c02000010844090c0300000190901cc0200000001a01480205c0a01c017500400000009802480300000110b018c02000000070024803000000012014802,0x1086c058c0300000c848094c0300000000440c801000144470130c04000304510258c0400000000601480200411c8300d90030002b251d025002000002b1d024c020000188a4050c03003b15050069003003915050069003001e20880098c050001ec120058c04000001f06018c0200000001e014802cd1181b4055500500001483809cc0300015013025cc0400000130a018c020032118680b9003a30ec10c0a2d0059c09809406b10059009809406b10050000b0150350c0400220c84407500304b0cc23011500400210d84c09500300000009002480300001282402cc03], #[]⟩ def dynamicCode : Nat := ((((((((((0x5921fa71a54cc227485f55c98270d9edce220400145f68870603610c01cc0cd146019116183dbf864124003d3133583404118042c9000000384061078d98af8f49140000004b01824a548d149b30313bfe685a058601cb0d5ae85040000004ad1800ab5d651930010475c29190104e0200001e6344041b38e4d0e0b1cead381ad750408000307a2f74144040289625d8161c5162e17634c70c36130b1ef005840c173d0493f2820162ad481e00e00202c86f54601c62430b40a0000460686544677b565038607cd092cbf0a0a0f671622cc8c10299ad966d0281190fc49702a48200ed0ae5100c0002c880f6a80c0014cd6d5c28040003b57be2108bb12205604000021e3648b3e7c6d7861162c4c4f4d982618db34a924081af0758cd0824639b5ad9048604394f0210c183abe21ee2480098fb005bad202098051abc248f048e5f0df64f45bb5e92397c37e08c4d24d14914514a10710d04200001c820080374967d67b565e14300000000090718000000e07068b295e11538d245036250fdef8a2aacb8c226e8a10013dda32003880586c83a5f34015a0a601fc322410a407000040a4000d1cd8f26ac1a41ed04080078f5cdcb0288152fae100d85878f166164d7438644ff8d7c6d818715c22d5d2ea4040c5e2e2b884380162198f055800002a9bc96b1a0f7f21858050000227343455a784ca0e1835fa8946141527a9b2030c108a58ba56041347dbd37690080b2be80b080826e86b0a180005a02eb00c00268c40c72af220480100001d920012a04174260b80b05b01d92840265eb9847c3f19f406074caf65461018bb97ce5a1865941ad5f1608a57a0e884800f0287822ce1044010b2474c5b8f289308e0db0321b989140000015f90303cee886f348c80c4dd92337e60c37e819da0318e040000041c0d2c11a4878e578cc0191a2e5a2604e1484150120000848d10468c308f5c963b696b6d10084080008a163998a204a7ec800ec48617367db38296150a3e3f36f038463e3b07bd604100235763a2c38012b0f3eb1e231a90c2a02400010a1a19b05c57436c91483f42f1ddc70c25b0ecf1c08081922ca18c0a06316b2f5970604cacf1d3ddc10467c097c160c0007031d06c06001b0c89e8c15644881400e000080882d02c03807850030092cd1a482e2f1e719a1ea2ffac010a08056bc7a79400193eca43880002ee41f0020003986bac0ce1048010f3e60bc22309485a6679600d96076cf5aa2d18600083faa1073cd71e2950a80b00d54dea8f0814732882e3d4966302000001ae74f51fc041000eacd20ffbe031c00005d6f12c2fb3ec100000005addeece536f3f532007a0c0f2c4c9652600f174ed54af38f082ba4dd13060400007b23c1040063b70c2500240080000889d04cd100000016f8d894d04cd2036279e79630c78a88278270270180001006f9f71a9da5a56dc7960cc15b07827678a66e2677601da882000000249f00782095a232068a2702000000249f01f41800c00b00003244000a9880035a9d242d6e6b350d0e67f089620d042f36cf64030409864805410407dbf8f68a000122d6b0830014a4324319c1090021a099a20000002df1b129a099a406c4d34d24410d0c304204d02595c102401a0001f04164240005366cbb985f29a38b1c1cbc3332a1440000000c8040800d2ff0520820000004b08b04f12d2ee6a2810000002580d0005728a7692c0042458cda916910260080000f5905405e1208f05b6224285ccd3f492081aca4de08c108402125d72de0199e8bff0ec3621e03e7d7720867baca6d1ba078ecd87b681509917887463cd5ec06d1105437dd2a2f6ade9dd1c56841543082452422401c0f9b44e0617daf308ed39da95dde69f4f9bd07b7361455b50e957c8e574f00ff556fc40900f2bdeff6d5cf59d2676c5dd2a09965b500038920b013c2018063a2b12280bfbf5b824200001568e7020de760138c043296aeaa180489ff93cb66042300802b80a72929b37ae0a201b80e415128628320320218220128014008072080200da1974071b7792830df22280ec80d13745f1c9202228fa9deb460810827fef3201982ceb9dac704d897fd8003c000b00e2e15c8804260200000dc90002c2200085e4158440aa120008d72002c10413814003c846860000004b02044faaa3c961c30294a85252010d70b431b0418409a0084200535bad2f41000ebafa2810400474b0a9800043f69279c545291c2400858e000000960122978e51ddae4080b1a69069921068ae19cd010508c92200c0e086af08fe404806544103c20a00d4e73d60600000e4d28902c4841300828aa4ccdd33f0c200000004b02860b3905b36ca0c0d15c339a0c32119244018c080d5e11fc80410000004b08a00c0b583e3724000000025829002600802a00f4c05a8898f734903dac1e1e2c71470aa83710482bc547362c030e68358f04000001214d980090021a501a38dcd0104eb66b16b83021d1b9d81c6002d27dd364800460100000dd200047240011308288681403409e1204e0500035210491d0268e8002320f14e8c4b0c5fb923) <<< 16000) + 0x6cf1aaf6d04203ed26fe6be8c74af47328e5c58508aca251294044da21e3bacb001022ab581812cc2dd2f383286ca8309721bfe8696ee396b69083050100128b02416ce0a06851266327140d51207b0f4630c939bf5bf2835a55fe6831aa2aa7a2627b98323778614ddccdb69a87884094f81a19cdbe0cf950310310822c6065e12658818a6f667e4244defbeef548100c06304a1833f34c99f050c8fd44eb01035171bcae450141a1818545a04088021630bc4ba59624498920c7ee5061ce92c5e870c2d6b68b08a1902aaf7c91033bf1b09ba3040ee7cb19c09c308c02001c0200018520a62a05211027028000de0e1f264a23e5a1e1c13af2d7a37afff5041a2ad371a328f42d4b00b00a90e29018e18a1081061020aa3924864360ced2303bb1e067e1fdde5f51cc5c31731744f814c83a453d99ba838e450d96c709213608448990a7939688100d75b9a58c18e01c7bd114323bf84ed22062c2b929fc20bb27a8fd40a005320b8651a0208c02122809a92d50244ef0a011c630659b6128d050caf89850d8414cb25785225042300800700800048c8288681403409e1204e0500019790491d0002e01048210006d6100c0df1bb05c1670a290f1bec41830a510a5e30491e9765c8014a98469b2820f8042451189cae028b9f4d17807130deb64c8e1bab8fbe61c0165c1f442802d0900066001f00860a0cc66e424501ec917121a57794d470f5c4e11c1810fe4627080099894f4c003a01000011720004aa683730b37cc2855d6bafe05066472edf9401b8b46971c0921cac80b2840f80400003f0c00004011c09a73d5f70800f804000012c8248281341400016441302409612a15ae4b92f87083cae24cc608e7d8e57050a1bff3b8870406bd3f5c5047d5928b526082000850b8dcdb3ec28851dc773a38437188f1830496fe84fc284db64c6cc382108855d8380a3a1f076938410004000056482502a865df33f391c2134539a7142bffe6330201022d916e1c10c9ba89204116d7c5d609820800217bd07719de3693f5999302bc70fd213482865c8391a60a85386f34e14c103c59d0982a650c38428438208238043637d24e8f19ef5d27e950ae26d1e88bf75a8dfa80166fe05abfcdfd4cb858a095ac0c11303e500029d20921a0003fa2090220006e0208e3a046150228881104408622042090006781c08a8b5e1d7a8808ecfed9ede8c007a8fd7f240a03ec53ad03f08071fedd43d42a803aa68239d28162b6afd6400761d13a89358a5397315fa9a1400c0104040003ee41008607e0a03e0140d29d5a20c8d0609003f0d55f80a10be0411c02a2010dea4c805344001aef9bd8e9070174c485fd140a008298596ec451041cf029d252a013ca07743628f72c2b020592df96c221a891aeda5db4ec122b5f2fe44c42053ac080358a28601cd2e2fd0b00184c813e90c01e7213deff50908c4c1090046e85679a24e304e028c2a97f248532287c23b5e1bfca1a5d7e77ffc246451c50732461004cdd07f81010394936ad0c000d59c6c8a1c04297a808dc0302ec40588c8102601071823c8e33f560c260c646622ee9a4009265706dc30839a6f6f04c25900007e485e186100142cdcd101801438c9c82822c00025b76ca5c38000102deaad212400ac081c60c9038f62984e92ae9e479843a62df42d980823e997a9120935c997391000674331a0cc0048010000141207a0302d01f1734be80e1ab131c521c935bc3025e408007b5f2a27c91a18311bf7f8106c58601ee884d94f01c09f0ae40c29e627000dce8ca4a8dd1200067c33bf33c13882000c80f10380bced5c98e2fc9052a784e29b56c86b1ce0553315f0049040425a323ca0015347b57e600240080000a11d2a97023a4f4d2611d129b10f040168d44e8904107cf9b7c9003cf71f75494109002000022674afc26b9e6c3496eb9ad0ec2480070a75ac1c3018f035a5302040d7650b3c1032a3defc301026edd26d3406e9f4db7020002787a0502904240086955b840b5ae69311d8f838249004864c15040203b263ab4480180e43b562800389ec758cc084801000014320006624001fd48005d61029050006de991cbe1bede5925b9a91cbe1bf04424083885062863825002800173859632a35813718b7c3a5f3ab050efe21c5605f35ece32e38d82750001b020182302609e149c0341cfca143cafeebea00058c07b6f6f8641028a138fce20830a15812588778e1a12f448ffca2041ad008c3501402da87ef76b0280464ef7dff913920854040c286c6ce1c18a1d92c8f0fbca1a2e70f72b8c14012092f0030cfbf0e5dc860042190a64198109002000028670a584020e6ed143d351b3e9368b180f6dedf0c840a17a8af3a1518513654ec36a8e19d2eda905d840835a01186a0500c0e07bdcb41401ad4b3f0c613a410a40718565d399eba286b8fc4a15440a07be1898461431664f2b8618bd8f47d21801db926c7408054a80a77c9c108c0200002d84000e30811028084140400b01f0500f02807405220c3849662e1e92d501204af100d8e761cacc34a3882d0e4564793b8c9b80a0c5914712c4b71f5e7014016ba7fbddef9c9e21e1402b5b5f94524f40b3d600a515dce973d700f6084081cbb261a3122384a0000a3c80051e1001c0720784b91ac6cd76cd648a64e01f85c284239ef33381222992d0a3a8810002debc505065827c72042410b858e3fc9400099ba0ff080000823920148012804246aaa723a2b61948285012535eab5fb8024527a951f6586f582841e6808057684802445dc3ef8de0a1c02832)) <<< 16000) + 0x1a22521528f0024112173ab9624b6bf4240700380500001079815d7e690232486441ebd6b7203937b094f612104ca30d4448049c5133e1e180002f502f90800310410ea4e004a01003b010000c6991d9852fe4ea5206021d73ca070711865ceafdbd203584afe9e4e880841ceceb8b61c28d5c87b0b00500136cb222ea040042b62ce8816ec041500e000076881d00c0e40523001ec680100186139925a6878406c041ca952ac70eae228aa4899010fe8ab89c001c216c62b7c2604825bc8b2d4708404bfdd11506684004be5ecb74c04f29102b0206962c7dfaf84460fb0cd42be6658f2b20cf5e8258d9518048b7068b4e3dd86f4c40a5a741a77f2608d7368080d8502004d7ddc70500008e428991b4801400c34b14b4cb9921619a307c119ce517377632c7848aadbe16a8b92c6b5f1dd0ed08948345953632e55b5d06205284526222bdb8930460133828c4ad2c04100002297d96cc0c0da5a000e01600004aa70a14b4cb9921619a2c6c119ce51737763286848aadbe16a8b9285b5f1dd0ed08948304953632e55b5d061c4284526222bdb892c360133828c4ad2c00004462ca48e1304c0da5a000e01600700200026a364b333881020861822c35fad7050adf72adabc724531c2440f5c922438e0f55000b0ca42202a54c30622e469b1d52821f3ee1c61e0e002d1d7cb43176908290180001031d2ca881ec28c0c1e0634b51d8cb1dd23e0d413cb1a1c20060f40d15636934248881497fc6bda24c111ef3560120a040067527b40a0000bdae0cc249002801869698b3685862db00c1f9cc2accddd809963e76812a46b2eaf2c6f297d169160c6068b3d53010711d1088150ecf8e8acde4c982400cd01b2dc8c804100002e1fcc9101012324001b82c0000934e1498b3685862db00b1b9cc2accddd809943676812a46b2eaf285f297d169160c606093d53010711d1087110ecf8e8acde4c961c00cd01b2dc8c800005b2e630bd6eb1012324001b82c00e0040004c46c9a3d53ce2701860b967539d0285863fe0251b2455332439a9f244b4257e38002c320265b1b221831f1b589a7128229a92d08281c00784ea1e08592420a00600003fa40023d88009101001459206e220360d01a8480d0140660a032010188080073488181ac0bcd605c23800991ed9c6ce746c9ffdb3d8eba1ec94b5b9a6722e3810a2317586219939341834be8063f3de5ee0837351402b76bb02c0f6c2bdb0a86a37823e6d7e584b12e504004a6b5b69b313217eda4efb789f014676cdd6318d044100db9aa4d760c0126124655f450900a70dcc7553c925d9d9466d96bd86056017d2e7342dc955e47370a322598b377be833cea74f556ddee330089c5afb1df70b57029a0fed7d96192b2a94427e521e508fc30d48b0a0e012234176497e28813bf61ae92007370c86a280ecdd16cb0801cbdd9936000d0adada502aa4e4044010c1c249c478b1c7ae1ab4ad86143e9b67c81c04c64a649c6016f2f16351403bbfa94a00003a5e48a84559c608802104677ba030c38e9b6a25f81630b7681b2640c1fe3d88b9605d1d458e450040c57cc40e024b98a08404e184401002d0181600f8b4facb6f6cb2eb791cdb228a12ad9b6d83080fe298ee3400d150dc78941088021004010040000111a2bf3635143c037b96328100aaffb0f23041e0080158080002d8d030cc548808840f00200a0140000c440a844000552400115c8148280017d881210c0700721c0d4f596a30601430fa90e08435125301029509d9bc0a0389431ff4000a321cf7a20aa931211004284feb119868e2007e0f3c440d4d886574184bfd900d334036714ee88c0730b084f9444987084021028b2d2b9a0e11a0b463d8389030e8720240469d6091880291b4e48912510210087109edde3622883dcf7793103282e665f0a042ad82290000132fd4b404a18420100280500008e1027150070080009ac80b828000f60c84824dd36dafdc3ddbe576dfe16c66c25c9372f447c7c2ecd67ac2c18c0ae427397d1424dc8e67d414a781974110160c63d89daacd44f25fc58690424208ee9ab34675ee2021caf4e13187d0b49e864518a88bd513f58c15194d9a284021f45eb4a9bc5de2ce3d0708ca5238b3075970d0b5238812d6029bb337594ca01ca12261952b5ebe7afa8732085f30e2200a1ccf4e1ee443419ef0802f8abe2f6ab09fdc50680419bb1113bb3dd98b277faed3fdf3f7d550610a1b5c54b145a2a5fe36756b88d2b2ea72e0c693b22e8a80e12cae2415cd71825ac536123ec2b63a4a1994b12840001c8480063b100c1581306e00802008d02bd0b1b22003800880000802000008880004298028ae0ac708840f00200001388128680903604612022090108280801603e0a01e0500e8080700702028c2d91b1464816e1ce6a16af6af272bb4aa160bed6ce07e9367f5586a2fa5f26482025747e37fedaec230c5de1494064018db83879b75cce62d9c2a07560621b3b038c00c27c906d2ee3fcabf57eddc7a166874f144f6112482e659c505785febbc384eea8a0b3d6d3bf87f745946fab49e78cc3b60e91eb3ac54663c85b363539139d7fa3a074a1677af554e9e59673d71b459b0cc72789ce7a4ecf18828a5ee9fb49a94324d3d08403b86f76b8e0ebf705d7cb9330407a960aea93c91388fda83e22c824732d0639c48906f9bd7e6b463e4810c930a96baca220a9a4639600ef83c23680d605315e77973b807dd4e96625004002d43524376e18f010031d18eef3c46473041d8215c79eb31af62a71f2b22ee7f937406e21)) <<< 16000) + 0x279e483539523227befdf568a3e5433700499b22040253d1e7b95c4999a04461fbfd9059c82c629343e0f15c1b4e2c982d83e418c2853e2ebc187807913c239128203e008d1e28ba14f406f28be3e8b1b0b776b01412054c3348020932682494207802111e19d7971cc1d880be930e00116ab9a4c001459d50080012d495c19410800212238f863429a43b97fe27281028b4ae44000a42b0fe4001f00861841da46c6916f09de6386aa693d65021396934701c5ea8632800e00400003a48000e910002ed20360a0004142000a06406817896239dd5b0165770dc8a6e71f1df141099b6523e18fffaf4dc4420f4e5a4ddcc0000000000000000002322e6dfa58828166775636530605a1018e10611a014036d7e6cb7690aa9f2aa2e2d24c9bdae4c43bad9848d706039cf292a9008a9aaafee50ac0dcb285f262b63ad9a9115ea0379ec00014547364c2a0007984064840301a017090006921c0f89ad57e8a011201e00400b04805426028120130100005690014652002cfa400ac00de91e959e87d65ef2354e6a0be01afca40337faeab0cc38c41490000000000000000002308810e08c00a0040288221e6a83f5388cdb5368d74a1928ebc498a77fa76691956fb0c98bda526e9f772598b9b673e6e1b299fcc4085e8586ebbef24cf67264b518fb79e080a908e094cfa515ef1c4cd13ee154402f76897a868197b9ea715446501201008808001144801a6c900706b3837a9232f78d53dac8153f2c4249a0c0c72a48a86bfa01a99779514e2080404e4ad6fa09b74838af1b666819062804cf977a808f5e9fe00eb1180c9b0c03aabdb9854d60a30467d09c22ada0884e4befb156e9a74fd5ed2e3a0fe4c8844bb41703c87384ca48da258819b7a3d2d008140186ab60071110dd1f9e870b8cb11154850888acd73f83012a64940840040e0951f11b6202400853b69525677cf7a9d42f69b7ef93796f4c039ccac1f15683da5500000000000000000000000000000000000000000000000000000d117b8f6750a152f86733c45eaf860481f3ebe3eb6fc79038681c0000000000000000000000000000000000000000000000000003311239039028c19000c020c74b0a9ab0a0e803647528b298f720532eddd8cf2040428ba22f203c0a64b10c41241424008000075901009007828001444800350900e0d00684c0301601602d79a6fec633e03c60f4f8c4df568cfe7bb24d1b0369ab5e0000000000000000000000000000000000000000000000017abd5313903b40b21c31830c21401000c0410402ad90b2c0d4f65f17b785aae327891ab417543769f0b445c314cec94962481dded9d00e64a8c93d3cbfc18dc3d0ba87e057d7acdbb6885d6060bee0e516a705b6bd088933e50129e2844fcca006e08da19aabd61778c79ad8d3ccd2b419dd96e2051b07597333b04b0fdfc7cf214cbb43600e95b62f58b8b8c5167ed2e15e112fc1c205575a716094d98f46a658fb9c06e095ced9415c50f8e2a3b3a1329e6caaa18d16ccd15e24f410d3509a4eb8b2bafd47c0fdb3e5ba93249f099aac81270f3f2ef86ff37ef0289c598f1444020e233733f65388bfed260bc0828f4e6ddb32283bcb10118b61c2ca582e8327bef3ced8550082f160c2becb5c8dd13f915e087fa47751cdd69660dd6105ea3d0ef4bda3d0e407a22d2641856f5a5e3b2e02e24d6b138ad07b9e92127bcfa1ab8b9fa5df54ae9156a12cc6180000000000000000044f324b58b932c39cc9af04dd0dc1ed53196fcec6988f30926990000000000000000010c44403182301146145042045010439e7b3081bfdb9f24a19e6b280b8740da6d28a370ee3a993ae2f598814d614fa2e2b695a19f9304cecd49c72808d15d95a653f5a93f36b0f5cce8a68af6051ba594dd3ebb5693be9e1de84a628b500a0d0048480015b4d03788dcd992012f499b5f020e3db87d48500748fe8508a08c84842010804d4841cd09b854e71d4f854e9a5f4593c2cf599d7ed4cde7eb211608d1674cd5b96a8c50c2e4ca3d77f52f52c847696b80be7a63af09724e5e78c474c10179ef7fe0f829aaa7e3a6e7850d82abb3eb367c9007e50fa4198bdac7003a5d451779d4f4468408ea799338de5ddfddda8693c9f729cc50fd984582d17a6d4ffb84709fb511b3e07c035b4eb47c44939bc4c96c4554f92747b100f7f79ef099e28fe98838f1267ae13bd0beb4724c78752e6a042cca30008010002de900705e14111feadeb54e89180a638b1a968fa937ca8286882285acec0c5bc29726c3cf2cc8081b1ec182025084d32bab27d61b5cb4317b774d7eaf50a04dbffa8dc1562d3fcff12c0fc32a3a3c0a4914067f443d1c00ec0a4e2b74a005511bff018304dda3fb49c906207eacb08f4574c4248d1bc003068014240007744002aa4800b1b1001b483417e8d1f6ba5d836d5217f4fe3b38eef89d2420c68e2908b8e9da3eb2f6822024e2dd7d64739b72db41643414870dbbb61b1a3e211d4c26de09e5729dcc500474ed3be218065c2b85c46b8c1d184dd1675dc52288509d0e327a39f9a0802a851f39a7b7e7535919ba3612646c150ed53886e5545981a4bd42a0eea0c08363478dd28b97f13c570f45e0a634b7dc2e310891e4a8d6361d6ace3be820a84c7c8d64a022cf769fa8283352b40179296711bd17743185b4004aacd78189a2953ab369e40f1550f9eb2041413dd7e2d703a9eaef6f6b2df6b7ebd5567755f161b94d67b06e1350e6b02a6d17d0e0900ebea1775534eb32400200800c04000fa840083400202000010016f31)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase10" = "QuadFullSixteenCase10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase10 private def zz2341:"s0925"="s0925":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l12 l25 l27 l28 l29 l33 l35 l36 l37 l38 l41 l42 l43 l51 l56 l57 l61 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2fff7e910, -0x58497fea0, -0x861c46350,0x4b0], ![-0x58497fea0,0x20077a80e,0x76cccf170,0x861c46c5c], ![-0x861c46350,0x76cccf170, -0x247bf5722c,0x5a9ba31fe], ![0x4b0,0x861c46c5c,0x5a9ba31fe, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x28fe60b,l9),(0x5c3c598,l11),(-0x171c58fa4,l12),(-0x2cb417800,l27),(-0xa16606ea,l28),(0x2cb417800,l29),(-0x3779a8cb0,l25),(0x2cb417800,l33),(-0x7a03d21a,l38),(-0x2cb417800,l35),(-0x2078f0694,l36),(0x2cb417800,l37),(-0x66486114,l43),(-0x220999af7,l42),(0x20862f5a6,l41),(0x2cb417800,l51),(0x1f9fc19b,l57),(-3,l56),(0x4d24966b,l61)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x3779a8cb0,l25),(-0x220999af7,l42),(-0x2078f0694,l36),(-0xa16606ea,l28),(0x20862f5a6,l41),(-0x7a03d21a,l38),(0x4d24966b,l61),(-0x66486114,l43),(-0x171c58fa4,l12),(0x1f9fc19b,l57),(0x5c3c598,l11),(-0x28fe60b,l9),(-3,l56)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x11024038c0300250982402d00300000007802480300000000540c801000000001c0c8010000000230188020000000b00248030000000d802480300001a024028c0300001902c070c030000cc1b02b4c040000d0160274c0400000882403cc0300008c1302b8c0400000250a038c020001043300b0c040000000210388020000c42300a0c0400000210e038c02000c212c0920c050000000210188020000c42b02a0c0400000c84c0d0c03000000009018802000960c40238c050000188b4088c030008a0dc0638c050000c42100e4c04000a60dc0638c0500008815025cc0400000903405cc03000094190338c040000841d0238c0400000002601480200000250d01cc020000108640d8c03001822840348c0500000000140c80100000d84c050c0300000c8440d0c0300000e8440d0c0300000c844050c03000000a0603cc02000000f07028c0200000001301880200000001103880200000001101880200310c844035003c608c0ac03c900500000000501880200000000e01480200000c84c058c0300000c8440d8c0300000022240cc0100000982c050c030000088240d0c0300000a8240d0c03000008824050c0305c0a01c017500400000009802480300000000240c80100000110b018c02000000070024803000000012014802,0x10a19005ccc0500000001d03880200000c848094c030000001b404c80300000000440c801000001d0a038c0200000001e01480200000001903880200371488404d00300000001901880200019151102d00200015013025cc0400001483809cc03000001511028c02a30ec10c0a2d00500270c8440750030410cc23025500404b0cc23011500400220c84407500300210d84c095003000000090024803], #[![6, -19, -12, 0],![4, -7, -6, 0]]⟩ def dynamicCode : Nat := ((((((((((0x309000000d6c2864e5eca90c245003c60f16282c8ea200d9281192717ef62410122a69e82c0013373a031c00000001686804240086140000003b80c2400000257c18300000012b82863b66678b8048a0000004b00a0a5daa71ccf940898) <<< 16000) + 0xfde40cb24100d2d9b7c00000000012c804270100000f2105409d0c92e34b3123314149fc32229782304050e3fe766b841244762bae9a4402000000d69980808161961417be58002587cc002c0c00000002bda903f42020b80b163a5bb357bd961cc14a6fb18e18166cba61861a54b90ce81010000003738a10166cb96293021200438c0000003b6038b0000012bf03880000004af030872986cfcfc304c99cef6608204032749b90310497d46d5fae38100000000180c003274a0403c2400a00618252962d3008101d19717e209a485c2fc38100001a3192000000843870089215f8d60021004000097100034220009404001ae481d82c14c060a403d2c000008b834a000002580b1f5c17796528264625f190b068170cfd81c1204eb1f5010704032bec30004cdd07f8680822008611b1efe97a122000010e7a586c7a9ae3e98153dc00d9c404428e0110841610ea37944c0844010c2c00001259280f240000042abf0c25678495fb3c4a14000001a8290815db1587c085490f7105dd94c7830f163745f3880f0800000002010c008b43240eb02ac2400b00c1e7000001931e48000022e12195050443061a9020ae41e1000000011600000036f10026ca073b08049a6ba04d00040010000181200077e4001444e154fcdf7e19ef6054aa1b5ee43c40b22cb2c72c22820413002802001c040080370cd8f7a61048c20000004b613033b6660a0ecb0c000001cdd2c000000005c40000026c2ff026042600879a000000128e1a6cf6dd0d4de47980000005dbb1e480000005dac6921646677c890618000004662c78200000000079a00b2332ebfd460000000046507a400a80518553f37df867bd81513ce34d3cc3c93493443c22c0100c8000803400035c80017e10004662000b0c406817a603f8cad8914062e2764860780d633008895c66940006f6690800094563ecc083a010d28c3e5766f402c29b8261ab7adeef0f55cbcd968d74fa15f1f13f8414372f8cedc0dcdd421ebcde841537d4c4bb51f8476a0df081be98b4090b80955fd3e7cd59b3ecf2388c43a875092b742241e79e378ba8c74281926dc6a22674d6f676c26627404e8cd82e5ecd3cfdc774142ad0f0f200dfcdd7e43be7f3bfcfe0e7354b4be9a60962b2126166d5221bf2918a4d62429d2e8d1cd99731596afa220b23ef8c9a19214a101358cc0000a966cb3b0c7b1951044674e2fb28b10e3409390e4025b1facb7904128004b0191001d8b0bc3905002fa5b83aa0802e064a47e00017db6c9bb52400940500a203d28792b7eff49ddc81fcf5f33a7ca46c65cc4c32cc3ab920d05900257c9b9abc4162b3eb652af2b5b387389d975481435115de77f6e2c8640f2950ba4510f90c108b3436539a776f8d003877799e62e4f857bd07df0b36a5733f56e45161c3c903fb86662cd5a18c946f73b211981e1747e10170dac421e381995d8963781e98905c9e4033fd7cbc84683c501c43cd41773f8be6c9d6fa1d1d36cfb9b6de3c61977d18a91dbac27797d25b66d19be96a031fa3fb86b02cbe86f0fd763213c0d3f3c3656b5c97f4b89a7acfc8aeb362a81bbe8d1ccb35de43992bd35156cb3fb042a30564560000396900093a20a01a03b010007ff104e09000e529a2eab129328685bf9537af5980efa61091ba12934e00000000000000000400005ebbb1c502c0000000029852aeae95142076a94ddc3cb2c2432441821020410802698eecf8196146cbc4853d071b0b229854e7a81af9f61c687a9570833b607ec1bef3c8d939031462db86f7aef22dcbe28522a9f54c6b5e4eb6602f10953adb96ffa1b784884107c94d29a10fcf6990407acc36104a19d267d04d0102600811c040960204a0100029a99616cf66259fa9b9c290d4cd450ae08d2b3b2b88bbc0b22861c61c5203081100000000425a6eff860514ae68e4107594445a1ef8184b96a09fc83a202958111861fb8f9237def98c8d59e2226187b17ad9000000243134401221488312c8a0a6c5068b751df4374640c180000003d0b6c02060000013a3098b1213f8775e7f1b598481050d140971896000000047cf3e9000000100368b7141c68e186c0a0a0cf760834638c60c00000d2645040eff04c830aa8909b45b3e5bb1430bb73d330643470000003ccd89c00000135eaa09393061601a00006b8827888138240008cc770dc6be8f3327071592cf67518118000003203b2d74e173cccd2f1cd7a0a959046959d95c45de0599230e10608408a0040177101672d0ebacd8f4b3990bde595dd607318cd6b393d338c1f7326566e1c669319408f042aac11344a504d0102600811c040960204a010001a390461900053c900e19c88024e7ac10d6f35ac1c124048490410cc6d4f2b31cc2244d36f50a2bc2820fdd9082a4b66a35d66eda2be1880848b03071aebd5e2653574c2cba0838516ee6d57b9e495b06788275900003a3e08b1b7b9289e53b7fe8ad000b3b2317f95bba3ac9bdefa9a401a5738d024e24737a4abc380c5e5671cb51797ec1d18c10d4240c0a501446031c5b49633fe9f0a7b4c5b5c9259ecea2c25000000000a614ababa545081daa53770f2cb090c910208504404104601cc72179eda5355c87dc5518c632d8a966a7d0fb7fd5f05520f2c09ab79a7f3d12fb4aeec190c058229c8da0005ee41240409002961b9acab28da22abbfcbab8dab2e08c00000280effb59f21025960933c5ad5890f2b0a5117624c00000000000000003f4acecae22ef02cf91f0181694c2957574bbcbe224b07d3296c31c274246182082200000ae)) <<< 16000) + 0x96efc611a42c266e28f885e2b784df867affdca2f419a5ee62f63683813b4c92f0d6904d1cc33b28060cde4e396b2ba1f12a28c70eb460b8d7a0534b62f05ca6e8265664ce750d1b44ed0f3af13c5aa6a4cca05205183fdbfb078535f64713322a3ca091f85c509b1c8fcf02162f575d0bd6dd888be53a77910bc0b1237a9b776b00dc938fbfac58ad44e8430f1acdfa207ba1fe7106c441ec529a52a06aedcc9da2e20efcf79f042ca73371553c5c899deed4a27f2bcf1e4ac216352cdd6049216f0aa5a0a7d8a798d0622bfcb77676bbd2e9e48b0837718f829b42f56524d6ba2595be5f0d58d7be118e110875e4882a2e1d2f7d1a54e44a659e8bd4ead5f7e1cb5250ed9c42c98b292ed4581a3d364522c7053ac562a807326143158f3befe706aa14908323c7c320de2df213f389340dae71bd176f0460000014077fdacf90812cb0499e2d6ac4879585288bb12600000000000000001f8605280a959d95c45de05800000000530a55d5d2a2840ed529bb87965848a30c186380181665ddff97562f3b23da4b8f479b34f3154e72369c705930169a9a2e034cdff40bd75cb3ac79e2ebbcfe60485d1e588d6ddbcb8a0a862d90bde4db85795d812d46395a1507b98d0147514a0009f2411c0400184441183400228e411464088220430d02104810424003214680effb59f25c7717bc058772f74db3b660e5f86dbc000000000000000010400000a2eab129328685bf9537af5980efa61091ba12934e000000000000000004021811801401000103446bcf0ddfd641fa2b067b6acbf8c42c21e4c496880151d2a056b0f6b73a4cfff41c0a20b8960eac1ef55419c05d347d067f6237c620879e6f2fa3cc26637f3a1e27005ae1e446adb536e8fbfd4eae187cd8e42ecf9b71d6062c7ccb80d3ab8feda34bf55c036e7ab7a04194c604087141aeffe4a3561c7d3315d2c5226527ce7e62770d1a57e39b9862285a367e504001000365903f258070ac0f81407a0281a4a561edf1c43046cf7094aaa2142136ec5443b510084f29c7da95c80026263017466380919719a659714012a9ea6ff608aa205962e794ff8402a9442593f5ca7302d0246151ad687a35e287d3916b08449434193719275c918eeb75a5f2230801cd2e2fd010200d36012b61800034d785e78700f0aaf7ec8600575d219b082440a1480e38c61082e4b74184c45753204bcd20081b4fd728610c4a76ec1d82c82831a151798a28034d804ad860818e96e3d4c70011720115962401f78a0481e9b4821480c3cd23e7b9ee48d2a5588b5fd334952eea5d82cc24099ba22b00c308ceaef750f000233aadcc3402d09bf8be0c0008ceaef7028000a68968b2480130063cd0373f05b59a55445d0f844d2580e3ebe78684c00acaa322820266e88ac1010070bbf2c490004cdd1ab82800233ac9ee0800070bbf2e52004a0100001da20007b240681784c8756d69dcc21ed36c9c825900133743da2010099bac45160008ceb27b89000266e93040800233ae60c9c0094021238073d321e7f9947d0a02818788d9d5b10888784f4482f8b776d226332de7ed8a0111e82442963b1d3a639201ed915700f15a85c3d90000324da943f011436769b1fb6828786004b0a46953ad81a6470cd263a198b8ebe92400734bb624018602277ea24e030a0484ad0d44090401cd2f81500c00068696482014004b907d8e90000063b5f6bd3242400ac08000042c003000123c81e0280ec04000c98407824001912687df2fcdf51d47cf4a1b67a98c04e370842460103e941453f2e09080db8107d181ed03010241498e74c7ab0604028ffc178535ba0c10c5445f095000a0700029b7639de5145d86991000740b8c28a77708d4c92e143f2716f564037d286b391b562ad24e38a0411b78fb9d4090c3e2d6f15f8620c081046e2375bd00c1050ceccf583e820004d1bdf48fba000002912bb34b7e6c6c48019820000099800201d0080bc0405a02035010158080d004000ae240cc5606413915f2e387dc562051ed8b9ebed850c5cdcb76f5e20218c5ebdf95cb06b725e0675418101481a70038b00d83f9c7c1400065912adb7821ce0c9a60e0907202a02048b686a65d786e08140a635881c01162002757d0f09e18417c8bfc8939a2862afd33dcbfa4808c7b9f10613a160baadfc66094818110c461c49188003e0f89ba5a0823110305e06802a018148080009a480024490281df105b1f963a8babfc207037b440601620cba045342f798d9a41c383a79a9b9713e1e42a34570c1800000159776a9f47b61e806000dc176517e56a4238f96c40000fe29f5e39add3fedcb9560445005342030755fe838c2720cd26cc4d54b812e62c590d40001901001c4f3c510c7c67f9c285025cd425b44080000012c00c08099ba0ff01417a425cb34a30055bd5cff00500f00e381100a220f0b43027a021cb09c04007202038010000f710373581b1ae053e89c6a108420378a21ed1be92021c5ce78eb0f2006cd1754d9b41c0b60fe40e20a14076ea851a5ba0802e47afec7f000540d214ecc6aa9088f12ceb5e09c0be6ac2aaa888e7058058969d38bc4de100652748bdc2ec0b81e0388c8f1e1b7684c270000000000000000004336900108c1c618a14614a007005000001470300200de385ca00cd41630168289079030228949c382081ee17606160491ed761214001f6106170e0043fc017b804e2048010e124ffb1c8202df060a6011080e80400001e880f048000888c0442b0260a58063a63572101f67a98d411841000400bc0405a0203501015)) <<< 16000) + 0x8080d0040002244098760662b03209e50480ddecd55237932ce58e9b75ae47dcb8092d161924ded4d24b115c556e3cb788c845d6e819991c3096000000000000000000000000000000000000000000000000006123072431833021c014000000524cb43982298789dad7df1a97f4cdbcba6bf1b5ac3cecb82f5ea2ed2fccb3ab6f7cd3c090a6331307b2033acea4c958e4e77e4155ca45331e2f294b861226b7ddff3feac53cb13929420f6954e5592e262044cea954e55930490d48fb863774d59588e47e19aff9b937457671ee980681509f4000000000000000000000000000000000000000000000000000331b48008959d95c45de05a1c49c204116010004019cd3ffa6527dcaa1750502ff820038754a4cd2d1a47133419800bd24dfc36936aa2e40a9c7acc271a8b878fbd94df1c9edd3deef45ac11bca8592e8ec3b7e1414a237b641e072a6ade6b945350511464a6f12052032114e108658fc9d8a205fcbf05e3038a2f32afc406000001f5840cbbc07a45804c20460100001433421390191ec250390d9f33a725051dd93495dee38856953be47ed51e44027e82b71d7524558f261a02d43bb269f1d053ea7a974b599a4c1a93f94450023299f1fb4553b05bd3973be08b67b6cb8a60c01a707c1a9b72ad33ed99a3037f7ba3adb26e6211fb540d8313d4b2e9ae82e2e100f5709a3b355e34bb455cc5f418f948dcd81d3a514921c400022110311901806c078340016726c60e70e4058a112062659cb0512d74fc01036fc469c30808759ae73012861080400bc0405c0302d010160080ac0405403029010000cd90011eb20503b8020080238348518449003a22e82c44083c010000076204e120260981282809016046020220101080802c060400201f01490144e9d0390303014a0686061255fcf50a0ad270a38c50114da66910e039470f72008204c484401090c80a664b630207bd98894504da5d1f9e1011451c1eb81072f571d5000094608802001c1301e0900e82800054880e0af0302191a9f8006df372ba10022182100861a4f0de788c0024a0a310a016fddbfec6007dcb6320901080021004010040000111b0159963af0a062e86443088207c0200000f6406c16034029262c3992dd122009388d5638103ef9d510700129aa9a008001d9a011e804a2046010f0af86ce681816452264f1220c1f0087857dd0dc8cc09e5e817a18054b1980e0230c1f008000054100014020004de400116480c8e80605402e1a016090002a7900083320013a640085c8e033db6a41bba38cf402ea0f6cdeaf923d47577279eef6e5341ed0cabdcb8cd4c798e806cef9411d83dc8597a0c35ea6fefa727d8cc280a079bc16801e15b4e78d61dfb8d36ca5c82872066eaa874ef2514e93d37f59d76d145894d5ce14a4837f409f0cf879ef28691f915ac160800000016ae45c37880c3f93b6e54e4a9d79c68ec7329708106a05fdd6038100781753e47c644a255d8b58bb959632d6aa43535b2c24000054d69a87595d0928603648f8326990744607ba048111a6856c599d4b1b03bc49b9452eefddf88367cefc3a371080fd55e07676828511278afcbb69bd30cd33d02d8e2a742d0f92ee456db10f47398efd910ff629f32100569bd76880c108f054017713c2f56d50bd5ed48d70bba53fc590c03c819cab127542b3ba91b5df8d1a6bb15a7d18f17c060fa5af2d1c6c6baeb03163937dfe29e988d6f87f80a6147ea1826b55f2b785339fb46b578fdb80cfd49419eff0b19a4e8beea746d5562249f229ca0e25cbb78ad4e0921167d4c302432af6335ab62800a80805004001824400c0308028769d4849b2281f17e4e5ff9a2edd7c49708806df099187a06e00000000000000000000000000000000000000000000000178471471070c60c60440420000b6c52bc22e383c00dd4849b2281f17e4e5ff9a2edd7c49708806df099187a06e0000000000000000000000000000000000000000000000017848187188148107105087005000c0600803606befb541ac20500cd9458720472f7bdfe71c35902ae4b81c2ec682d1870400000041af0260c240080000a39013110090480440400075e40404401e1300e0580680b8f5e3344e5210714d1a26da66a0e1ad84a87cab518323f260c97b83841203a7b43383042206146617880177bf12a89b0c01773195978e0808064416158102880f3808eb0286544cc8fc82833a946ac9a2409adb6c6e11c000e07892014001e5006c00109860900214446ec2f6a428647082b4985072af66af04508a8898459940c8bdca5bf04126532c11408330c11804000051cc932afa70b8c2470b3e1fa78922a976adfa586140a9344ffe2021252bfcf404118ee62ca30a00034ff19d01067182500800600800066480586c0282723d1d2141922456132ef8f64852f7c0a60c901cb84fd4e0000e73d5b7e1025142300850c77a75ee7c71807086ce08c201f78fbc22839217da4425017f1fb41ac9000114fadd0a002f0022b9109c408c02165ee78c26cd1648d732f1b1963ca1bdaefb8e106a18bbfa09206120042cbb38ea359c2c92a37eb4872c78ae91f2c42c4023febc1d1c20dc49f5cc1c1003ad838920003d216c671270c240080000bb9000279200080c402464010220070900302800162c8005199000c42345da897ec28a614304c4add3c67142024dcd9daf21416e2b5641233101032dc89ff9a081024dcd3fef21003a31f3e3be40c02bd6412c4020544205bb798ae24281058580480050100200800094c8018a8008340020200001000ab29)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 21 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase11" = "QuadFullSixteenCase11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 21 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase11 private def zz2342:"s0926"="s0926":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase12 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) private def zz1254:"s04e6"="s04e6":=by decide+kernel theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullSixteenCase12 private def zz2343:"s0927"="s0927":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase13 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 private def zz1255:"s04e7"="s04e7":=by decide+kernel theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullSixteenCase13 private def zz2344:"s0928"="s0928":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l15 l22 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l5 l51 l54 l55 l58 l6 l60 l61 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x687cd87e8, -0x3c55cf710, -0x5a80b75aa,0x7b6ddb2], ![-0x3c55cf710, -0x183f77dd70,0x31a05af58,0x417c95dba], ![-0x5a80b75aa,0x31a05af58, -0x1882c9dee7,0x3c55d0070], ![0x7b6ddb2,0x417c95dba,0x3c55d0070, -0x1e2ae7de0]] noncomputable def hinges:Hinges:=[(0x1b33ee2,l6),(-0x191fcd12,l5),(-0x4ba6e480,l4),(0x106df07a,l9),(0x2f7fed,l8),(0x3ab0595,l11),(-0xd5612,l10),(0x216072010,l14),(0x44fd0b9b8,l15),(0x32f41eb2,l23),(0xb4d76fb8,l22),(-0x1e2ae7de0,l27),(0x1e2ae7de0,l29),(-0x216072010,l25),(0xf18980b0,l30),(0x1e2ae7de0,l33),(0xd5612,l38),(-0x1e2ae7de0,l35),(-0x2f7fed,l36),(0x1e2ae7de0,l37),(0x4ba6e480,l34),(-0xf18980b0,l43),(-0xb4d76fb8,l42),(-0x44fd0b9b8,l41),(0x37f62741,l45),(0x1e2ae7de0,l51),(-0x3ab0595,l55),(0x191fcd12,l54),(-0x37f62741,l58),(-0x106df07a,l61),(-0x1b33ee2,l60),(-0x32f41eb2,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1e2ae7de0,l27),(0x1e2ae7de0,l29),(0x1e2ae7de0,l33),(-0x1e2ae7de0,l35),(0x1e2ae7de0,l37),(0x1e2ae7de0,l51),(0x216072010,l14),(-0x216072010,l25),(0x44fd0b9b8,l15),(-0x44fd0b9b8,l41),(0xf18980b0,l30),(-0xf18980b0,l43),(0xb4d76fb8,l22),(-0xb4d76fb8,l42),(0x32f41eb2,l23),(-0x32f41eb2,l63),(0x37f62741,l45),(-0x37f62741,l58),(0x106df07a,l9),(-0x106df07a,l61),(-0x4ba6e480,l4),(0x4ba6e480,l34),(-0x191fcd12,l5),(0x191fcd12,l54),(0x3ab0595,l11),(-0x3ab0595,l55),(0x1b33ee2,l6),(-0x1b33ee2,l60),(0x2f7fed,l8),(-0x2f7fed,l36),(-0xd5612,l10),(0xd5612,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x609620631808004b0828c5039840140096101182053080280000000261103cc02000000005414039804000000000e890330040000288441605680180000000000240c801000005049080c9180a00000d0260a01e400c0000000000480c401000000001d0901cc020000000006488198020000000006850330040000000000a80c401000000000222c0cc0100000000241a0718040000000000440e20080000000088301c601000000010864088c030000000000018190020000003c24180a40080000158843203c801800000000001c0c80100000000140a029804000000002c140a300800000000000a0640080000000a824088c030000001582e043180800000025044086301000000000004812401000000000a0502cc02000000000062071004000000000017032004000000000168164010000000000260148020000000000098190020000000000940920080000000000220640080000000002102c80200000000000a8190020000000004700b200c0000000008801640180000000011404c803000000000042039004000000006c2409300800000000d0680c6010000000000130148020000000230a80518060000004908403230100000000098580c601000000001309018c020000000026140298040001342104803240100a20508220031a80300005409c1401b50040000ac1202c04ea0080001482a04803d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0xa03100400000000582c053008000000621180d06020000002213060190020000000441080d1806000000844c180940080000000110881c601000000001306038c020000000042220698040000108460a02a400c000000000108124010000001444301a0c040000a221870034200807146605140a61401800670a107205b4802800096158410269004000000004a2a049804000000006c380530080e08c90a080e42803000000001a0d038c0200000000001207100400000000241806300800000006422064601800000000d06038c020000000000320490040000c42404c0cc40100000000441204460180007c0f02101e10040000781083404e20080001d03408407840100001e0420a0078802000000008828030c0300010221850022a0080000000000280520080000c08a980f48603000000001905028c02000000541a0c07200400000000684406300800000162488108602000000030964050c030000006096203618080000000009890330040000000128980a601000000001f0b028c0200000004c1480d18060000000098540e30080000000000a81c401000000002515034c02000004882180fd180a000070464c07a4301800760c510a0730802800ec1822040a61005000000000241819802003b86083902da4014000540d02980f48020000a619851026900400000000220c03180400000000a4640930080000000000681c4010000001442201e0c040000000290900e180600000000098d03300400e31a410607e68028000000309640d8c03,0x7094604d180800000e0943026a30140000000208f80e6010000003e2919029002000000724c3205200400000000a8540e30080000000001481240100000000321d038c0200000000003a0710040000000000c40920080000016898480c8010000b21cc1600f5004000052648203d2180c0000000821202c300c00002610c3403480180000020c2202d0c040000004c461c072004000000008c380e30080000000001081c40100000025230e0350020000094430d0152006000000948838094008000000c20900f0602000000018828070c0300000000044381980200000000241c0a300800000000002812401000000002d1103cc02000000588820349808000000b110403930100000000148700c601000000028870078c030000000000560310040000000054480630080000000000880c4010000039188300d100300000006408805980600000000c42407300800000019424026601800000000008c0c80100000000008a0590054b495008f01f71401e849220106023e2803800000002d29028c0200000000007402900400000000001d0320040000000001c81240151b24c02240f3c5007a12488041813b8a00e00000000001903200400000000018816401000000000007c0c8010000004a90a01418080000009120402830100000000149281460103892892460258d00607065064840311a00c0000000006700b200c000000000c801640180000000019404c80300000000006203900400000000009c062008000290861900f4802000c608c0ac03c9005,0x34088071806000000746c180a400800000008422028601800000001916014c0200000000322e0518040000000622d022300c000000ce2d810c602000000184550218c0400000000002a0490040000000064580b30080000000001080c40100000000220b018c020000000004c381980200000d09810192301400002d04c1401880180000039171202d00200000c2591601a200600000e4220b02b400c0000000000160640080000000290901cc020000000003c581980200000d0943026a30141a21619418142c803000000001e0a01cc0200004023a603d2180c0000007118c068301000000000c8a814601000000001d07028c020000000290c80a18060c10a0c90c0a164018000000000b0a0660080000000150b014c0200000000260e05180400000000b8640e30080000000000c81c40100000000002d024802048618610202f3a00c0000006114c068301000000000150e0660080006114c3801a1004000000003a0a0518040038441870010940140001098e080f48603000000002611038c020000000210c819180600014c3409007a40100002886611813480200000000c844088c030000000032140318040000005104807830100000000a4140386018000002513090190020001a64902c01ea008000090484c07a430180000000842405860180000010c2202d0c0400000822106805200600000000841c0a3008000000c21900f0602000000018868070c0300000090a2203618080000000f271014300c000001e27080d860200000003894c094c03,0x521403180400000a8842002630140000000000281c401000000002b0a018c020021c3d410818fa00a000000ab088016301000810e305207be80280000002a848038c03041039808a037f200c000000a80880133012060e4812e0577c80380000000130501cc020000002302202498080000000c81900a300c0000000190680c60100000000000d01880200000000064381980200020c6c14c0ab40100000000000c80c4010000032118680b1003001842143100b8200a00000000000f0320040000000000f00a401000000010864050c0300000000000a069004060843430808d0401800030862098176802000a30ec10c0a2d00500000000001a04900400000000443c0530080000000000780a401000000138110058c04000004a1304805a0060000000001e009200c000000000be01640180000000017002c8030000000002e80990060000000000b40720080000000001900a40100000000003701880200000000006a03100400000006229022300c0003b04a0e81988020000000d02500e4c04000000000d0009900800000000006c0520080000000cc4a0146018000001a44100c8c04000000003626031804000000006c4406300800000000d8900a60100000001609c04cc0300000002c10809980600000000005805200800000000b0900e6010000000000b00248030000000001b00490060000006a04401430100000000c81603860180000001b024030c030000000320480618060000000680900a300c0000000dc2201660180000000190901cc02,0x1c330458c0a2d0050608592086074fa00c0c24b189240a6b401818196112180e568030000000000410388020000000003b80590060000000007400b200c000000000ea02640180000000003901c80200000000007c0290040000000000f40920080000000002380c401000000000045018802061e59449e0415a00c0c0cb0890c03eb401812110184f818328030000000168640d0c03], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0x1e65feb242f27180862fd769c28123f262a7822e58f3c01c0a8ad053920ca1844010f30940bb6e638c45fee49b8e18609b59823c531b403a307048b68f5943c08079018c82001c58349909c20880202a00a00017c22962314a118a486c5201703582771e203cd03b0d77ac908036e4776400d50923d28c000351b21800a881100220824dda62be20698081d22d9e6809a3049f206002c4e2ec02000e2e1f33000670f23977004c204801000014a3e6594bb8890e306127264878ad028539430201443636820d597de420f02d7301214100135c482a009c408402029e0a00017922302211709000219114e198a686fcc297ebbf20e31738cb4363c780d927cf8f0870910d831c12d314b6fc0000013ecea0260c2200868dc3451b343924ea5274bd3580860e8a27207204223921a210209c0040190401006cce000000ed4e089c3c9385b98f50380f388b249da64002e28d114f40806db35f7cde88ece14938aa4890c0a25b001af020e7daf7761ba4402a4fce5482c6552085605000021b3a370d146cd0e493a949d2f4d602183a289c81c81088e48688408270010190001006c) <<< 16000) + 0x4e1e49c2dcc7a81c079c45924ed32c0000076a70264002e285a6df40806db35f7cde88ece14938aa4890c0a25b001af020ecd2e163cae4402a4fce5482d954801581400008648a6028000d5c80035c114b118a508c5242629003d1b868ad9a1c900000002e7f12006cd1b868a36687249d4a4e97a6b010c1d23ce40d3cd4033c21810002e080200d81e7b16c97e044e14f02b48ba0730ea56c6511110ced0a6825061ad3e55a31c2a06907cfda6080346781a81000265bb5114800250144cf000001c20207b45925ea55039c41d917aa994015e19b644443f5de4e1c20195e031a1b8a0c12d2fe6a0385b3735d6e244021551c50662400940500003bc4000e988a384c2302628c0bd1b868ad9a1c900000002e7f12006cd1b868a36687249d4a4e97a6b010c1d240d3c74064044033c100000b880080364783c9141ac5d13c82d88cc9ea9144cb6da2f2f4851139bcfef0221de49dd15458b0c8a13fca0caa04006d6fb9b428120b622bba69e000009e3b85020000c221c1a1e2800a4071440000002ee048f0a11a811b513cae276e88f50b0048f005f9228ce1b7268948516ed04814910fee5bd09622c32df300e9dca04ae276c0f3a4801300a000079c8a282c5101713c0318ad77a442104afdcb48520578e5c0887f9c2558fcb0c007ca41128100062497944104dec9f20100009daa4882808230085cfe2400000001b3439268dc34506c513d22121510c30d104b0540030100200d0000ff20005704001ce080046491181108b8480039f88a188850814002e4a709c6816bd60b24000003f62c3430189dd030defd7be682c08bfb9e4305017dfd10c80c03c91dfbfc040000012c219c80880202821a0ed0d071848500140003d268a9d60d102e62c8064d6a2b7a3450000012ea0342009938fbaa2821d6af59efa102075b465d1e2c11eeada0ca62800e58e88ad51c00000001fb0c4801400a04fc040760213e0109e8084f0042760213a0109c8084e00426e021360109a80827c04000612707355b927b95b6c49e9d0c02d6b002a96955fe832b5d943ac771ad1a176b8cf4cd040353b261d7013b6de5a42891e945287dcbd7b9295a70eba835d907ae6878af12e4240035e54eae9bc3d41b2d4d84231f620ef8fbe6afc6721c023b37b5de6bcd084d583db4da4c0f725d8fac11134000088160bbad5413e1ae8d3a973f68d9e4e0d6f28a7793fa210b45b89e4e83833ee7a9af36d89af3db6538a922800027b903501e970e202b872076c5a59129428f43162b0b00acf78dac02120c108042244955e800000001c1b4482d9c50f95a042b9fc4800000003668724d1b868a0d91e69a69c51c31429c00a00885c600401a00031244d0762663b03815e972fa4f90e207670134831428f4cd46acb00a72ddf1400c82842010d344c8daf28698000003f6386f1900b7114285e8f5c646143b274b3a682faf1737c380c8db71c582338a1080400005988990884c4242600a12f0500015a18912557a00000000706d120b67143e56810ae7f1200000000d9a1c9346e1a2836459671270c406206600400020025cb00401a00032674843ffefad1442ae87f41c51299bb88ec384423e58eb24009526a4810019f2a9ca4001002630210080000a398912557a00000000706d120b67143e56810ae7f1200000000d9a1c9346e1a2836460e48e608206504300100020020dcd00401a00032e44b89425a32000a7f225013a1500d0239fe5efbe108715d3d5521e316588ee8708a54ecd2fee2faf96c6020f51022abd57248303001e91b2631637770b400404888f6cae0542c208007e74ac89b6840b40809662cc18bdd048a09409fb046e3c0c60260a10c02f0815211024000060e4068471224aaf400000000e0da2416ce287cad02197cb7f3200000001e953b651618ed3807c8a18a14714a08804404800000046e600200de2877989da60e1845f15db5900aed83f0c3080842a363ce020c32479c470a00b1f6248f0600459a3bc9002008ce6048010000188224e5212c250171084ac7424c3212a05094828000f6cd0a894dde96210d3d99ddec68a71920518c6222b1a4995e9a076fbc6710e2d439e116c5f76c7fc0598c3078c50a617d0d475b121efb18d4ceab3c2040f5f7de477a1ff760af01d599108052f6431dbd4f27c4c8660d0cc180080037074a1f5a9646c40b61cc5ec98d83a7d416b5f64b1f531a3489204a01742a388f1e544a744b102ef5cfa57a16ec480e2926375eaf5c178e0e18c31271ae6bd244140991786fd0da2faa0c0408306a6e0510440a02c66717ceaf115600000002302e56407a6bca7af9af47383c06c00014511273180d06e5f2dfcc800000007a54ed945863b4e01f720042edbbe02d73f89000000006cd0e49a370d141b8561642ef4a9db2ac64cfa84be5bf9907d0a1471450840420000003091fdfda3b6f3c973d02e60d6774da25b42a156946d1e53c961822186662d5c379667e402a89f24adb39d58dce1532d2656bcc1a0a69bc60da15cdeb1f47721c5afe501b40a520580948266e48a6990468f16730714530ec2023ad8b3a89c4cd9a7041eb0196472a89443b3d9dd46a0601815e4d21ca2b7afa3803a5c7140673e1cc7a0677b7ca06d3722c00091d8dd781a0402e62656c4c2001285ccb6960a0fb7cdfa3f7861cab7a161241bd02531a310820000f488171084986424a0a0007fe22486a02829091848003b9483f88f84fdb369e055845c27c981af0a1072a8321d461f0058578d1c2057c5be2a93fc99991dca81b040a7fffc24818fbbb86cfd69)) <<< 16000) + 0x000021212fc04948817eca7deaf9000aaa23f1788d3d1596a32dc00ff749e9971aafa4bdf4c234de6d7ccea6c5416716eaea506175103394758688b8b41d00003863820ed6713f61cc3081394b2a7cdc181283d0b7d1b3c4045b40a71ecea0c1205ae0fa6aa06007498c0f5094140e30c1af3b3a0401bf00a7cf94c40144010450721f4229de207812180b80c00004b0448984242ba1200988f8284780503426530b1c268708f89623d17a4304ccd4f60c5921421592124d0ef1000a5b96bd3a1870107c90346cf628019b7243bb07101445296970a60414043fcabf82d6b8c7402d0285ef082b668724d1b868a0d8a071a61c51a51618609c012060000401b034016989f08e2e20d065614e2abf36393a8d2809575b5c0d0615b722aaca000006b0e2a600240080000a11bde1056cd0e49a370d141b140e34c38a34a2c3082380240c000080378b8b92b8f2338aa0c8b8fe534a126633b962c305a2292cc3010017d145a280000273f6198009002000028240008e8def082b668724d1b868a0d89e69a49849410e08209a010060000401be6800b88d671a545c5c7aa09a4d052881d31848952d517914102cd3f5b60e0801725da312000012bd614e0048010000171203e0200027f223a1b11c0988d82c468077bc20ad9a1c9346e1a2836279a69261238410450268040180001006f9a005ee8e0c6950c284042e69341de40e28612242e578303840040e1fa050220a4edbaa4800004aa8313801200400005c488c82c2380616c0381cc613e6d1e49e50000005b680714160e00bfac1a50f4733444c46852174628b751010a2efebf2a08021d618ac27a9c0710b14711b1390005404081c01269319071704ca0861871535b04afd869424c09b2c46850d9e70f9a40401491e400582116543b165000004d038940012004000068888c02c45c0713cfe7fd8cdb29e5845d15fa9af38b1687c3220765920000005b680e0dafdc5a48e592187823bdd22844115a61e7b24e781530965af08baa000ac08113c043ad3920f31e6e494510f2e6c379622ce2c48115a1c4e0e1791dc5e490801491e400c04442532890b000009a0712800240080000d1109205c4f447ddec3ff1c58051002835090c009894fa9238601a013282f38216b49aa8a31c0955d23358b4f0220fa5a930c50000000041a02a8042901844f01f0d41c24799580129f850f2f4c1300a4a1c581ddb905a71032de43cd4101867798952ad8b000005b31ca820013beb93ab290084e0280001bf20007544001ddc8005a8901e0900e8280038fce14094ee0cb21d143c89a96c1c28e50d359c3ac14cf923007889913b404846fad115fec98e0800000493e00480314c28443008800163b78fe1c82001f42080b80b00004144458161fa03b240f985b9144246921d4c11714a1403fa4cba88245abb70cccd7c8047f59b6da681c000fe9293f203002ad7393ac60801648e5b95a8404118482c2a0200000f698835c55cd72d5ac202c248840828620438250008020008cd165435a777460f1c23972851ee6dbdd6e60a4195000160206a1306001f118d1f84bc0080c0b924ee30070f46cae0f0206081e7741536030801124a13b840004edb8ecb82000340400ea4405100ba9506ee08081cf0a00600003ac400771488a90e8702e493b8c24663e05516e284750d522de244cf9c2d22620336c421a230c2175fc58bf2416b03fea0710000f6dbb6468042400859334925b88e48c50604262050b84122b79e48a12e3ae5c8488fdb8332b01805f690f5ec0800b1f53a8e4e08480100001733f2e04c58fc164fa21a601031e10bbf9394fa98989d103aa580000000000000000108491c51491090c80c70860010030100200d0001993648e100134cd2c80115b72d08511a8bc21dc80a1497aef88e4922e88b59b74c284730004cafc4885e6f638f3060897aef5eb4ca0009c051648f49c5757a288e07d45b4ba50a9dd07ae1ac9174b2f4d8aa94238eb7afee32442e969e4f3630440a33e43441001d7cfe863d20009c0500003786478c6ac9d0514518d7bd91624449251d954204acdba2e722434f9767c0920320e8245d61c21e0390a4a141139a3303818000f6dbb642904240080000e99028098002cb102b115112d02fad0f22462ff1695cb99222cf6529f618810481876c9e6406c7eefdf6041420d0dd523908e00054db86a60200839b690ce45900852030a21279d1d448891e96654d6f4c9181ff56d88549116ff32f79948111157fdfef480c779931fb785085d70e89300100130ac191d8a4021400a0000718c0d2ec89629c780814014d84bccad08200b3c4eb23f6203409ae8495140386b2ccfcd3efa070805a67084d700808252b4f4ef8d14000788947fd409f42020bc0b000040c445026226020005fb2224221111108808843c4421c2210d1108604842c24214121090908400841c0400237a41fd0620c7b105398821ac40cc62045b101218800ec0d4661fe2ba22d205f14d13f1e788017f8b866ae931f1c381e2f06a3564ef4db140388bec80447649884007a3fd21620b545000011000eb1d3110f855bc408a3cc3e0622228090804a5475f3b635bc457a613c0ad87a0e0b04103d7c225817098da5d1144888084021c5e1e5687280321f68e00011100d80400001fcf08dbfcce40e08625d600340befe1afe000046483e0100000b33c76de743f46be8d0b007833c5bc0ef081033b66877bd45c4c5418399db221060594314f582b5e654922aa2ddee5e8601ce3002be1b19c4e82bd0e99b30b1000528266149d0edce5)) <<< 16000) + 0xca593b5e583100dcb2607aeda65336d9cf9214388a80000bac87f02c3f4070114293ad74804ec5685ae38230f99e662c0ffb237a78403d5da89b800145194d08402000023840e0d41f8530fb1d8768cc3e8561f2130f80587b82c3d80703181d52dad53f6518529347a77a7b51b90763e91d548e64669a4331c3a160934ced30eb61f8d89b23eaa7f372e637c85274fe7e1fcf66820e1b3790804323c25f685e82a9eba330bf79869285da9dff570320e9b01224fae370203140dee0998f7b01f96259615c65de825da154a5d7966e30f7e797749800000c151b88f241b2edde015963f38d7e3148ea268a0a10d255b9c0187d5b7f4b773ec38d9636bcb8125b2dd500e1088fc072eb5f7f6e610a394c510282ba87924b0c28afc9705826bd8bad820142b63b218607d9d11edc000025282100800008b10f50d87a04c0d40780fb8a3e88102b7e52ba80000122c1e004603e6626c44402254571e00000122c1f00400004610f309c1354c9d862c0251f364a300d2a3d7202035f699c000120a0f8042c2095a1b3a3040905b1e820b138543a004c407c0101e40a0000be30180100400001110f11581a86e018020088020080203c01782002ee66b0820ecc33391a0058f01438605975f5c804810400100000d5200024e60200200800002221d02a0ef150770883b4440003ea43b0a7a09f7dd8b22012540bf6c8010bc4aa8c0004335efe000048403e010a0d7eeb3ae1c3cd888840d011d2c4cd2c018e2f184009050780211192edd01044533aaef3d006e76b9ca5408613ec664001e00860d3f593f44006801000008c43a817024771a692923db1101963415df1e230a80a0229d0490107c021a3874e11a2905df7aba7c4003c010d196225086904039b1b0382153b26b2604e67441ce00290c9bf5001d004000076900017d20004d043ac3722c265717c603cd5dce9960a3c9d7b6780496d7a112020f00403a8072381c98c6f0a180e584862684343f575830222b0059ea20cdac0cc4094108402182a4f8ffd678466cf20f1a0bbc214fa9014b4eac912020f004000032c8000f510e90500017d10006ed3a101349ca624204cc73843055d08b724b002070bd080048303e0100000d921d0320008e421ce3a0e61500050310e5310007381000fd1204a7b0e40d87184e8411496b16980c5785cbdc9076ccba93620256b94587280d7ab96570e010a58d7b0000016630210085096a31f69e0c281bfdc26ce0023f5b5d42c06740ab168000064282200840a5711f8b49e3ca3b2ae9081dba39f17868a0ff98fd01c32594a2e3100c4e64596c300e45ab24c04e18420108960bff11432c8f2e07c211241fbef884490833234d94120410804225a8d2d154d022168d45664919a46f823242a12b501f8811ce53d2cd000b3b5337e6002dd7910109c20840200002c24000958c0a0808050d287e94a08ad207639add573410110c4550a04100022052430de9acf1e700b357640f89d6c3961c3209a4aac9e0188d8975cb00275f460013041080400004d08710080008e4f106db33bee345c390b9b490285c238a505058822916e580097964bb002514210080000861d1cfcadaa786096e59f16c1c41e9c4eaf8200b166dd8c002418210080000709c18258b2a047a6ac7c04094d904765278da02c326343ebcc777f06ec43bac139ab1fb709460dcb0fc23494f0b3e7b52cf4efabf02664510392befdadfbe75c3f745046ed5742de1ac08005a6dba6ea59403ab3a1e3a87f2dfcf0d400006fb9e69eababbd440a3bc35d357760a3aa4dd28b1e63952ee57e6103ec9472186600007e64384641c012000c8321be52000d9f21a84a02e1d0228e834c640341a000f6a21bc730dd2d86e08f03a7f720571c0068bd5e4000022242000850a05d19ee64517c7f9b0da162023166af2302011f89e9c120411804036c1742a38d65ec5006aef4978a06fd50d7a046183c0100000a5301001004000011104e1506d088364241b00a00024721aa4be0cb78fb6743b1127a7375e286e290f13571e4baad8616d2f9dc59f5a560dc2ce4c43a551ff5450321c044b8642183ecc90b9329505432a29bcef86dee4aa97ada8b78981c15fc04c8a5bda0fc16a9b66c000195caa26ab10ddf94657186dff2df540e72017f03ebac95921ceae68542cc3b1b1f23f93cc2ea04003b768dfd09c4f2774cd98ef7a7a625ee3e36fb2332e892495c6250eb49ffe9b7260542cf2848d1300017dccb16c0a80a18dd1a17b82c76000ecbd9a0d90851e3588c2a588be6f318705d4ee55e1969da3c000198881298c35cc7a383b879789145a989bc3a83886766b866050061bdce5f480046010d1de962354c50a08ec7ee0145ddb6b98f1823317f7114c02353532f04001372ed2398008402000025e7061459486049106966e7bd2040c3f90eb460ce73275470c11dc4067ac900081fc68c10099366a7b09c10880200002ca4358260061302505d8b049cee75203406a8ebe1410a7bc240850980966e3a08294e760fe2002050d3e480130a1080400004e486a88e8441dbff6447282d1f52c3090b63f8e109fade35c9c2ec9f5b6382809d60406d1df3b61bd651daeea179f741f438035b4a7e970d53c6093c6ddc83520006d3ed8bc1c70d9de0ec06a2d71b00004ac9a68c71dbfa741e785f4057e928304c8a9fb29158fb9471b44e000068a43506405c220450d0698680b4240340a00092d21a4720d1350681482dc7419e0b0ce05066828004e10801d4f10351183000f0d2f19a9df9da94e7b2b4fdfe86738b6841f2d68b48c3)) <<< 16000) + 0x4886089f93b763fd0cbf9d14170a12087188c8a7b800aeea8db06034ad2584c7829f2eef66ede6fea774ab478c88928d8e7d00000001b42b4caed38b76a55e5c3725db0db50e559f3b87aef25000a142074f6b0dace4d3e854eb0f74642244c115d1ff374635d6520bd945d6ae9fd82aa7b62a25056afc01b20927a9c2cdb6d945f2d1d5bcb35aa246a96d528b8294640fba8da9cf09792afc11bce34f1ee7f2a55752ea7126c6c16e4b8a1c2b51e231a573f67cc37e2e320a310be6eb09fa97880ef30c78e2d86d905167cbb0412473daa3e63128d38a2382148275d4fc8789ea30cb970839c20b00cfbeadc5a1948c3cf3f7957188dcbe081d435f5e3c23f64569a65c57f880094090fe1735d0f58d1977f1d1c7e8b0841b876d093edfad1899af2c3d80000fc1e4f7d518b9584b264407c0b4af2e729e359284453a40fefd45cca26a9b6412b1b42e88bdf5c328cd4d78358f53841b4e784e13714424e832059015eb41fa186f9e53a551e1872bcae84508d0e26a5e780222776131c02bb8973e00004c404201080e008022028020088020080228ac044dae789181c555e2e4c00254d49463002200840000401000004440003a0866048000241960a0001642194220001b620003e64000d3481294c324961903b02e158238ac31c4618c1b0c50986202e003f3534d04bb6e05ff4ad91e571079c7f21a51b270192a38004475062dc6eb585acdf39b31cbace06d81adcf3d593c600d7a01ddcefcbbbcfc028d00d7d37d468ec1e79912de3000000e2058f2a90f5da11846a806d5d4a3c909edc8300dee0807d86e90455ffe9453296a978eb537f7bd7e88581aa3ed7662acdc50483632766a42ae80d08f1b7e9932fd69faad414fd9b292aad7a626b43c737c090e520d5c67966498c3094afe2d071d1f9a86d8d0c6e51deccb0ee2f66a0090024e9b358802f6ff791c00000098d080021024010044925fb086aa1a6c5b7c45a90041d25d478782069ae4d14400400f3e484a104201092482b1876234da0dcc0b4121270892cc460484add98a120410804000036886006c2fc2617c0b92470f23c1234d8928e633220021b82a34900729a99f60048284201080200802030c0734f2026ca89c77a0bfaeb1860182e7eca0029938cd828103e0080000d12184120c1050000a690002483146281fc0a889a026bc36430c51e0b2790808ec1c09dc2408210084518a4339bc1863bdd6d33041017d1dd10702167600e44800b5440cf84a10420100001072180120bf0505f0082f4040004a042f004000e3c42ec1702c010040000111d368bb3aa5479075bc5f562c801f9440518017add82ecb000476c1a200000129810804000046880047118aad6289c5fcae7b88b1de5a9a2d03d4dd601510ef189f559e00000000000000000110c200306100ccb2cd18f00a00900800000026468a4d8fd89304c8b8edcf2215981dc494e15e990ebac3c1e3b448553fb4c9c8c3803360cad8e28886a0005e6400353885d188144a4172220012ce21707b0b73185b0ae00002008e3b08c81f3a249036259fc8718145a8d023c00254fb6d64002200800006c980200802000008885a84c000261680b80a00802000008885988e038020080000223457f02fc3e240bb54c0904004c4e8cfc00023201f0080000591e2010ec2fd95e1a18c9a7f49a582b2cbbaa249bc7812d60896a852c96cf44a148c075151f95007a3d09b165531aed63633da5782d72182b706ff38bd4e6a5dd308001aaff97565c06927ca2f16709f329fe4582b0ff7ceabdd852c1f9c1a7cdfb34747eec379fc06dcd27ad9f910241bced278c80d2aa64c6850a421901ce7c6f5760a5b14cc25f7fe7cc0c3aa0106b82e3225aa461aed43f1837bd11127c1b400014088129282c884162420b0190578c82b85415a2a0ac150558882a8341520a0a80105380800247080131a9c11b00e66f047bf1b0e913f91a938955f295a068c2102087531f07331e66a817e77be2b1340b16b2a5b5187c2803a5726bc55179094078b486a2265edae2c6aef121000000000dc5db062f06b02bc55d3af19acfb9cdcf4903284026f9532a8ac31cf34216b0cd3a22bacbbfa2a77c800657ae679204fc176f2896ce728fdc1104c6d32fb95b78faf49fe13eb0dfb5c2cad98d23235e949541bf84a00fcf9a1722a822419aaccb7665cd9c26a508011f1d76cf3d5b3c6305f9e5f85ed6f122c66c94a420000620200652a401d2a8ea8b5fc3bcdecb4368cae3bfcf227da7ae6752de14651cd4300000000000000000212571d60aee5db24c5062272f993550b8634d74286f208ade7000000000000000000000000000000000000000000000000000c642061823002800808000aa0201b45985ab40817f0dfa571f217539337bce8466700d962e320d92855cb65c94356d28ec263f800a40242cb39738827e0a5598cb6167dcacca110bfadec0ecd9429ace470bcae2944615609c6a50fd0b9cad3026aa990049d49ffc02ffac3a31d5400fa56b656b0ad5050d835ecbf0b78c9f2f6039a89fbf308817f19f493611a81aaaee28ae2caa3500074f200fd86402c6bcc05e848cf261788af63635b788ce8a050916f718243e9697a365182e588aa040c5810a477e356c145908fe9b311c18014c65f561653b185bc44cd771600201347919b76f515a31c1e541376460200aa51778b4e4e98872313a5f6b5800080084afd4c5a277a6ece5687cf3a6dbe134818a7c95d8e773140c3223789e2029304e7647c1fb4fff39e1617271c2089ef50e5af87753ce954c5dc81)) <<< 16000) + 0x423cbd81601d42ac3566a3521caf181147f5285ef7ce015173287b32f08180f73c20de8b8e9e25fdb2172504047e2d9a2aba70a04c71139273100100005d52326e87d1b0cd119299fa7e0b71befc8830de59e0e64068120040828000ef08531cc0acb614a13f4d6021cea527486cd0e4868dc3450765f2dfccd8c99f507a54ed950ac2c85c1f22021422011801401000800004001119bd4c08a2784011a6d02ce0fa67958354d713426b5b2fe3c07aeaf9ff7e69ac3a8458dd67143e569c1b4482d000000002244955e821d1b868ad9a1c900000002e7f12006c880c90860880410000011001004fa11af6e9afbbfbc02545e64aab465b682c23908fb101eec90d6275b140000063060814fe520a0f84812dc04dc8078601126b49b63c302b3d24e8d08100101c85342802060d7cf4ff8e48dbad4d92028658449194384be72872e5004b96f50e300b6e81dec00200131810004293873c4aa7742b0bb7e026973786befe6aac903511c8fd235bca000000000000000000000000000000000000000000000000000006912861841430c30c13402c004092a2488bc87bfd64270de2574fd1723025f86e673470341f9903f640bbfe10951a9f6aea3dd8a89ef5bd66242679e6e1b09d58c9fbdf894ed91cb3b8d2be4800000f1c1a600e1edb63c0ff3ada850a2e53207a759e93c14d3ee0f321c898208a22c01b1e0890e035d424303f972c28001988ae91eb1753d0900e186a0a8f264da28bc86121d3b24ed2063171c1231428f7f46e98900b240efac24a184201000010821481b0a309f9a000004f383877684a34df14286bfc739001048f7ec7b447011b87b20f9140023450424225184094051e4c95b7ad8cc24343432dc40c6189e5622851becd32312016fb6c09c125102100800008510a20500014610a11d0500e80a05413e0200064920014c24002ef484f14c2747769ec799138368905a8912557991224aaf4114276416107b82e602ae6b900d5ac203ad2017a6b010e75293a43668724346e1a283a858a50a40a2801000009ef2cd6f7a2ba812a530bed8bee861539f88bf3383b5b8072801b59783a7c31324c5bdc7bf88640e004f6bd099f23a9c6094b6c6c1da634efc060a000003de3c0c08253bf0efdd8411c9cc4fc3343007238eaf88be1804ae82f62134200b0d8d7dfca82000000927c084fa1c80ac0a0138230251184d86c268261320b9180000013ce2255361d3e63c28a0661ba5eb222145787bfc290712728044212181d91c4974902b75025c6b1e0000000bb80148082601448c00c6132468950825bc5e9110815e709fa41bc671910c243001f62ab878400189f2752051ba13c318400027684680a0208c02000033c64615c4ed98de89814234fd869e60000005dc0894670dbd9949e4802478be7c8882dda086c9241fdcb7a83444865be600f2b94095c4ed49a749002601448c20b623327aa2603c9141ac5d128996db45e5e888227379fde0483bc93ba2a8b12191427f94194f0800dadf7368502416c45774d30000013c770a04000184438343c5001480e00008e484c02825c140008ca7d3580873a949d21b343921a370d141d5cfe2400000001b3439268dc34506c8f29018f14f10f0900400002e200200d000176312e85c5be6fc20590f455f2d038b000001de20812fdf0d1c208e2002e805944a223a3022891e20437dd0d6c98806730feafe0460a85c5b81fb669002701c44bb12f40d40908167d0e9ed75e502695c93066a6a221c3ad9eafbe2043517e74141c8068993569fee460aa24483fe6502000be458cd1cfa1000560580001e33e9ac0439d4a4e90d9a1c90d1b868a0eae7f1200000000d9a1c9346e1a283648147947908067842820005c100401a0002e0424c2412412091050002dd10960d84a82e0501f8e0ab5f026cc903ca19b2111941334d0b878a361ab529a64fcac0ca080112264c84ad9ff3200be5cdd276a096eacb0418b0a59a25c708d56c78061c047e09492ad1e020007b9da55adeabb2401a188c88480c4308404a02fcb14e1c43a50281dc258c03caa9404a738f1407ebc72c040056d308fc02510220080000879d9957446ccaba101f8cea00a844d0705028f28f2070ca08504f00d002032000200d09401f962ae9e11240a91bd1acf9e57586cd49470c0cb8005a58305ee8f8c1410460fa3593021080400004c4849848248241220a0002ac21202208f09000377908e1984686e2581e7116493b40b1e49c2dcc7a716000001da9c111c1b6cd7df379c3802e28d114f406670a49c55244880512d800d7820b66970b1e572001527e72a416caa400ac0a1e9ac0439d4a4e90d9a1c90d1b868a0e8a25a05a23a0312204120096002064000401a0002207d3580873a949d21b343921a370d141d5cfe2400000001b3439268dc34506c9028f28f2080cf08104000b820080340005c084602e260f24e16e63d3cc000000ed4e09160f388b249d92200c344cba9a1e4002e28d114f447670a49c552450a0512d800d7830f3ed7bbb0dd2201527e72a416caa400ac0a1e9ac0439d4a4e90d9a1c90d1b868a0e8a46226245a23942861a2118004064000401a00022062617c06ef96b13cc0000019b54091605ff78107392200f28014bf29e40050027b79a447babf394fad468200ffe8705c45054838e4e178220256b675fb88af920056058f4d6021cea527486cd0e4868dc345074523113111ca15108d04504c002032000200d000110200068a7d3580873a949d21b343921a370d141d5cfe2400000001b3439268dc34506c9028f28)) <<< 16000) + 0xf2080cf081040002e100200d0001722001062422c2611403f2517fbcb593892502f2eecf14609b011838431b404a007088b68fc6f3808078d8dac1001c5843a509c20880201120be281dcceb383c904dbbdd40e26e17882ed3c40227e2744f096a6236da0650c22008000086908811043848000b388430e821474108220830500084b9082010013be90029e620fe02002d9920ce1a003b10210212003d8e200808e4201660feab0030151030f509a402273ca054240bcdc56372018fb3928aae0b2e620838a201421806105747efa7562818f96b529bd754cc14d7a1c26534241b86ee80507b032085bddc7d7ce99f087d787d9a94e1705cc5af60199c68990c601401efe2ca2ad7eda8fa6c4506aaccaf39f74a47fc86d762c85932448000001ed6cfe6835d80134bd6ca36136705296885ea009063feaa1d11e768fffebe975bbff95d8eab7498efda68ad049a777b155330106378be1440fc01e1dc608b82c8b6514227b425db050695d8e27b080011f1fb74100ed622829009840880200fc1207d090000b3107c1d83d8ac1e8560f21b0780d81706c1dc260ec0b0750182580f8a154c9ce77845c6261fe4c1ba33687b82cb80710c8e987f222430d1b8af845970919a9f481e8a18862b93862c1a4d2b6f7e321e7dd6b84e296103e16d14744da195b155430b67ab8f54ed5daa385353554d4e8a7716b339a3e86777b2ecfe54000091fc7f2a41b2b0461514f145d3a45dab06410e51504b0ff6e194bf0a3cda6254a391e380910006bc63345afa820deb9c83883756cae9b6563ddbbe2d3314313428c6a91e1c19f3b03c5881bd57e947023d4c14889bdd89089721f7eeeb19ccdfa6381e3851be4bdf08acc072aa5dfcc00001af18cb80dfd66e31998543d958cbe52e6a614590e403a0881cc0400068641c8760da3307105c060bce3b2a1833f64b62006138518f7048059ca7129a3039cbfa6c41000197bbff00000131610804000051483818c1bca78504546d6c480c4fb8765f14201c0933d030a7b75262910101960e6dc3072e0be375009840880200dc1306d09e14089d9a872031d74400b860c16339e390c26cd930908404245058650c1ccee62b2c002618220080000a0106c190228881ac340d41a0690d03404819c140006a84198e40ca5a000cf220c8930634903104c1842406a1306001d8e5efcf5251c2a06104ae1408afa13a403048370eeac3000a5fee44000251c2100861051382e1f203a20752890e109cae9360c005e9e94ea00482842010d2445daefd2489643d33ee30322120473900015a34a64901084021c528578abc942ea55b3458e2c45af7c79221e1edabf940834750d49c0036e58ef0e015f6f7ec4e0040010e28645e732250b301f72e51c5140930b28802fb477bb24002100800006a900024520be1205e09014028000dd882e88800121482490c1207608c2b05c0d82d82c110060b40204301d422680fc67536655d0eccaba2038cff74bb3cfb861887fac60aae7f1200000000d9a1c9346e1a2836661050640628650048000005d582be57759a9851b0ebda644375899f9805120a5d503bbe9f327f3b534aa349da3baa2bd80f64cb145612578a45e10e8a94288c24f438716fcab4e4e10037476472000906084021e59ce1af35881b1bc6269e30a2b6ddf281816beb09081400295ecf100094508402113502057b02511499afc60207a781b0429019720ee77cc04155ad018780015f9e8228033616af304e104201089a131700cb348ae6c92dd903ffb0ac15cc0423a792cc120410804000036882c82e269ffd794fca22a67e0ade40f23305bea203293d7b009e00176822dca00c4269ff604c184201091c0ff8b0f0389d8256a9812443e996fce3002100848e51150b6f964d3fa73ee89219d34e7f268a0c8b4d6b244218e8a4e88019d9d867e6002100800009810580502b8280008788001b790005f52000e384158660aa03d25306fc08c508cd1ffad5184961c1f85881ca4a15bf4404e8b2e18e680c6b3133e00002624210080000a0900099e20a85bb1c452602dc48515e1dcc91c22b5cc1b08816d9954804b035eade85a3004296463700000598c08402000028e40bc9405c3a02c0d00073a10533182912c144860a03b01a11c060040110100100458b09e838e1a2020b1b38308ee2fd6212007f6aa86048183c010b1c1647dd787082a2071bd24407e36e70082640442e985048deb57fe128410804013c1400023640008148270a800095c8268cc130460961304a05d03edab92b49004fa56bf84033aa3b4800000232c1f00800005c10493182418c11cc408c530451d82200c10c0783a7059d4670011197aa8b00154b07c00118a0f80434a2f377404c18a04c97330247d119d1302e9ba84424041e00850e07478556246032a122a18150802c235104cd4aabb47825df03cf7250421008000082104105e0c3fef90d9e295907bae60453ec2d8a6066a524ec48083c01080e1d1e6a69a1fa9e0cd51000f00438b161c8364d1d2e97c374063466d2611021177fc19000780200001924000568821048000954c0a879f210cc04437d11fa00734919b93805152cc632000f804010407e34f27b911001a00460c99ed2a31829997de4e6856e3acd020043404eed2000f004000032480009510400901f82800094480036d9c0b9158b4028516df46e28043928b4120392decac0024181d008000068903b1df02657b1c00c0557e9b2916080d81ad72c083c9926c00012100f804000037481f0ec0f45700c010047080d814b170c3234ea0fd220)) <<< 16000) + 0x5c193f898300928ea9e412041080428a56f67c508231d9bb76283b076a1c9a00a00a4e420182d1e3ed4007801100001004000011103c050000a19000237301001004000011103b1581d0ac0e45607023c0aaeda8a1820d98ea9cc00110a1000400dc27053d116038602c81dbe1c10066985d540023182000800005710361101a84800062881a1280012fc81998f41f39807910c08921629400000222c20008683ea1ba8ec2057a098200000011160f8040000234819068000530c0e0ae9dd3f3020a2de65a9809af625f147050ad904a2101f67368b10000094a084021021bfba772c3226425c96e2b885d36023cf0bce4296385e0bf8dfd4cff180968d14076410c305a991c0192525b5a2acc6754d13cbcb47cd4b8f82870439d03744b6798541674cfb1970c6b84d3134dc1dfd27776c397eb3dc203419199957fcbdb2587ca99863c8a3c9803b66ecb4645b8e621d3cc3a00000e15aad72269d303a38b13e85d7890886e6797a601611762d1c044bbf4a1503c75198e353f49ffc4d7bde0fc4b77f03dbbddd36158851c26100005892062220300d00c008001be48179880b89405a2202c0d000bc1102b4d014848007054c4892abd2244955e6e0da2416da7b1e644110fc674c05a172ae6b99ab5840306a8b5fc3bcdecb4368cae3bfcf227da7ae6752de14651cd43000000000000000002134804b332eb3032a05a9229208c00a000028dcec2fd64a99227adee85ef8729911b206b853c1eb3becef7d63d76f83f670067ffeee110c1e3bed32f694b967d76fe11976e6d3f519c4b3a7579be9b74797271f7958e3a50d47901b416d1e97b93b550795744755cba110470370f5e814e0731d2516a0aa0ae338000f756348f03b6d97b7ba068ccc7aa1d03f76ee80d613c34d8d419016f281b4b5a462632f03a54e5ed114390aa304bf74ec7c6040f8340f1005104d621000023241f008613879f930a0190c99400012201a00460208227ac66016c4ca03a0a2922020004000044100011f20003da40a824052020004992050730272d01310809474048320230d011048084140400a000a5320077dc4014554f70a5903a4a5a0baadc269d4b6ae0431bd1c4e38a16a9d00000000000000000f9d79492970044ba439526908df3e86afd0241e06d8982ebb7a000000000000000000000000000000000000000000000000006321431821811411010c04000474821c882ada8c74193ebc6eb70cf540047b3362eee44b037a8ef61b849be95d6b21ae5fa94005ee991b5d8f6ad83d1f6f5f6ff361d27d5a41e0cad5ec7e1c998618c0a0a301713ffb8b2354d3b5a1915e99957b18aea79708ed615002e3058293e5d3a28401edb8988082b120cccf028045320734c20001edb76c8180423dc46f880208ce584801095c7582bb976c93141889cbe64d542e18d35d0a1bc822b79c000000000000000000000000000000000000000000000000003188e38e28e18410609000c00a0200a60800401b2c211c08dd813604060500a89c71a69a59c49a48411200c002064000401ba5b4190041e1c4807b6ddb21a480425bf021848000004b01c21232153fb90200f5093ff9c13111c65139a067a1f143a5000480100001a13c705d3e1e1ad4779e6cd3678ae5d7d520db4747120279afc2631d1fea349286f5ec75e1b66860410961726bfb51fdd24b040100df3854bd56e848000006496b16e98d22000000084ba54a24a3040006534a40a8a6b22a30788ca401041c1a5b418959151c4807b6ddb21a480439c01d1848000004b01c21233c001f90200f5093ff9c1310fb0de69a067a11be285000480100001a12000958658423811bb026c080c0a015134d30c3483082810412001c0080c8000803756b095735ca20d700000002c261469061059038868450260180001006800073901f010001039b2e859edc14a164800b39316c307007172f97a58e4d7997b2d07000000c6cde0c0000001e9300800039dd075f38013804356b095735ca20d700000002c259260e50e60c60430448258180001006800073901e0100e808000ac8d1542f199c0b8b20004d64685963000c77093a28627147412724040006c5b02c6000000c506c8a000000222139c009c021a370d15b343920bde10500000000d894416314316284110094012060000401a0001f84070040360201a0100016e10190980c02e58423811bb026c080c0a0154ae3ac15dcbb6498a0c44e5f326aa170c69ae850de4115bce0000000000000000000000000000000000000000000000000018c8a28b20b18a188041046005030000200dd1b868ad9a1c905ef082800000006c4a20b18a18808504104a009030000200d0000fc202e0396108e046ec09b02030280552b8eb05772ed92628311397cc9aa85c31a6ba143790456f38000000000000000000000000000000000000000000000000006322cb3093072c70822411c0180c00008036c95afe67163abcc1c2e8aadcb1512c7098bd08b5944c185cc4f48c1872430390881ac4ec209046fe60cd782c0c4ff73729ea850000000249f00fa10005c0580001fa365e4865e0b6a309000bf2af0460e009b35d8d8b1c9c008c07c18088591d5e5d1c000003585d930013804346e1a2b66872417bc20a00000001b12c93072c73062430c12c0140c000080340003f08001351000714202c120150900a02804c040016524006b1c80902804404003a6e4007b6080816803ca401c4a00d210060e802c640142a0091100406801c2400c12005010020080096e48018c80084400202000010060181)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 33 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase14" = "QuadFullSixteenCase14" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 33 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase14 private def zz2345:"s0929"="s0929":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l17 l20 l22 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l5 l51 l54 l55 l57 l6 l60 l61 l62 l63 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x52f08fecc, -0x3c55cf710, -0x5a80b7610,0x4b0], ![-0x3c55cf710, -0x14a7457fcd,0x199446d3e,0x4dc056bae], ![-0x5a80b7610,0x199446d3e, -0x1882c9dee7,0x3c55d0070], ![0x4b0,0x4dc056bae,0x3c55d0070, -0x1e2ae7de0]] noncomputable def hinges:Hinges:=[(0x1b33ee2,l6),(-0x191fcd12,l5),(-0x4ba6e480,l4),(0x106df07a,l9),(0x2f7fed,l8),(0x3ab0595,l11),(-0xd5612,l10),(0x2004c29d0,l14),(0x1f36c9cad,l13),(-0x25947aba,l17),(0x4ae1148a2,l15),(-0x1f36c9cad,l20),(0x21bbb865,l23),(0xd3bf5ad8,l22),(-0x1e2ae7de0,l27),(0x1e2ae7de0,l29),(-0x2004c29d0,l25),(0x34e018bc,l31),(0xdd32799c,l30),(0x1e2ae7de0,l33),(0xd5612,l38),(-0x1e2ae7de0,l35),(-0x2f7fed,l36),(0x1e2ae7de0,l37),(0x4ba6e480,l34),(-0xdd32799c,l43),(-0xd3bf5ad8,l42),(-0x4ae1148a2,l41),(0x1e2ae7de0,l51),(-0x3ab0595,l55),(0x191fcd12,l54),(-0x34e018bc,l57),(-0x106df07a,l61),(-0x1b33ee2,l60),(-0x21bbb865,l63),(0x25947aba,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x1e2ae7de0,l27),(0x1e2ae7de0,l29),(0x1e2ae7de0,l33),(-0x1e2ae7de0,l35),(0x1e2ae7de0,l37),(0x1e2ae7de0,l51),(0x2004c29d0,l14),(-0x2004c29d0,l25),(0x4ae1148a2,l15),(-0x4ae1148a2,l41),(0x1f36c9cad,l13),(-0x1f36c9cad,l20),(0xdd32799c,l30),(-0xdd32799c,l43),(0xd3bf5ad8,l22),(-0xd3bf5ad8,l42),(0x34e018bc,l31),(-0x34e018bc,l57),(0x21bbb865,l23),(-0x21bbb865,l63),(-0x25947aba,l17),(0x25947aba,l62),(0x106df07a,l9),(-0x106df07a,l61),(-0x4ba6e480,l4),(0x4ba6e480,l34),(-0x191fcd12,l5),(0x191fcd12,l54),(0x3ab0595,l11),(-0x3ab0595,l55),(0x1b33ee2,l6),(-0x1b33ee2,l60),(0x2f7fed,l8),(-0x2f7fed,l36),(-0xd5612,l10),(0xd5612,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x4819002000000000068072008000000000f0e0660080000001d838030c030000000390700e180600000000001c0920080000000000c80c401000000001a0b018c020000000000160310040000000000240620080000000090681c60100000000001103880200000000024381980200000004219022300c000000000006064008000531043102590040000056210c80f20060000000000070320040000000050280a601000000000b05028c0200000000000281900200000002a09022300c000000054180266018000000ac170218c04000000013048111806000000250440863010000000000048124010000000c4110230c0400000000140a0598040000000000d40e20080000000000320640080000000003102c80200000000005402900400000000001503200400000000014812401000000000004c0c80100000000004a0590040000000000170320040000000009e01640180000000013002c80300000000026809900600000000009407200800000000d0681c601000000001a0d018c0200000003108813980600000000004c05200800000008c2a0146018000001242100c8c04000000002616031804000000004c240630080000000098500a60101420a404200335006028814208800c6a00c0029828826012d40140002a04e0a00da8020000560901602750040000a41502401ea0080001702807005d40100000000004c01240180000000000e01480200000000221203180400000000442c06300800000000038012401800000000012014802,0x5e3605180400000000003c0620080000000013120660080000000230f028c0200000004c1480d18060000000098540e30080000000000a81c401000000002515034c0200000000004c0290040000000000940920080000000090780a6010000020408c07e8c05000038232603d2180c003b0628850398401400760c11020530802800000000120c0cc0100000003110812180600000007231036300c0000158681604c8018000a81a05301e900400014c330a204d20080000000044180630080000000148c81260100000000000d0388020000002884407c18080000005108807830100000000a42403860180000000001101880200000000542a049804000000000e890330041e49c406181f46803000000344c10318c04000000001c160718040000000098140b300800000000001e06400838934808303e8d006000000006c26059804000000c12c40c630100000000068481c6010016c28a4140e61005002d850480814c200a0000000a241024300c000708ac19814680203c938808303e8d006000000000242819802000304a1050048401000c0941048033080280000025120902d0020000000006c981980200000009239024300c00000000a8681a60100000000120b038c0200016248828024200800584908240198401400000000c8781660100000000260903cc02000000618a405d1808000000c115007a30100000000000160640080000000001e01c8020000000000088190020000000088240f3008000001662101746020000002c44401e8c04,0xa3649804481e78a00f42491008302771401c00000000003e064008000002548500a0c0400000048902014180800000000a4940a30081c4944923012c680303832832420188d0060000000003380590060000000006400b200c000000000ca02640180000000003101c80200000000000e0310040028841862022a4014000290861900f480200000001c86409cc030018c118158079200a000000000014062008004186905000a0802800014111301e90c0600000000341e029804000000410cc06830100000000a44206c6018000002213060190020000000441080d1806000000844c180940080000000110881c601000000001306038c020000000042220698040000000000880520080000000001081240100000421183002900300000028886034180800000006229036300c0e28cc0a2814c280301c119214101c850060000e4318a4065a0080002585610409a40100000000128a8126010000000108440d0c030000f83082e027a00808147606140a61401800000000f8900a60102011d218101c85006000104398c4065a0080000000000240e20080000000048300c60100000000c8440c8c0300000000003402900400000000006409200800018848098198802000000008824088c030000861884204b20080001f03c08407840100001e0420d01388020000740d02101e10040000781082801e20080000002105003c3010000000044140186018000002448101b0c0400000002b0580a18060000000064140a300800000000d0880c601000000344c101b0c04,0x924e039804000418c304c07b4010000809884d804880200000004194c094c03000000000010819002000410c11ec02440100000000150a81c60100000000321d038c0200000000003a0710040000000000c80520080000000001881240100002d328101e90c06000000003c0a05980400000006623025300c00000000001a0640080000002d8d0044c030000000410901618060000130861a01a400c0000010611016860200000026230e03900200000000461c0718040000000000840e20080000012918701a80100000026210d0150020000004a441c04a004000000610480f83010000000c20900f0602000000018828070c0300000000003a0310040000000821200c300c00000000110e066008000000000e0c0cc0100000000001c0690040000000000240d20080000000000680c401000000000907028c0200000000000a0490040000000000480d200814192102080b4080300000024c6102a4c040000048c6200d9180a000000000064072008000012319404e4602d89284020c09dc5007000000005a22079804000000b110406930100000016e2380726020000002d04400e4c040000005a88a0349808000000b1104039301000000000a8900c601024320204101681006000000418a2054980800000818a401b230140000000000a80e401000002062a809c8c050000000000118190020000000001140b200a9692a011e03ee2803d09244020c047c5007000000005a520518040000000000e805200800000000003a06400800000000039024802,0x708606586050b200c000000b306404e3010000001620980dc602000000001d1302cc0200000684a18135180a00000000b85c0b30081a21619418142c803000000000d0902cc0200000000241e071804000000c108c06e301000000001902816601000000000322c0cc010000000044220498041018e1050c0e9f4018000619662201948020000002448301a0c040000000512481b18060000000074640a30080000000a4320286018000003c4e101b0c04000000000026031004000000007c4c0a3008000000000d0e0660080000000170b028c02000000005c320718040000000000640e20080000000001700a40100000000002d02480200000000261c029804000009104301fa3014000000c22980d06020000000002a1c0cc01000042638203d2180c00000008239036300c00000000e828146010000000148640d0c03000000589420361808000009102301fa301400012990080f486030000000249040d8c030000000430980a18060000000098440e3008000000084320646018000530d02401e90040000a21984604d200800000003211022300c000000a20901f060200000000190a018c020000002882403c18080000000520a01c300c00014092980f4860300000000360502cc020000000631981298060000000c83b011300c0000000842405860180000010c2202d0c04000008221068052006000000610c80f83010000000c21900f0602000000018868070c03000000021090061806000000000054062008012306308807a6802801c608808c0f4d005,0x2c281980200000b28ef027f301400001611c602be60280000020c21031cc040000000591d8129806000000b11cc09a301000001611c604d460280000306424044cc0500000604818099980a000000d124c0893010000014319202266028000028230c04ccc05000000588e6044980800000008a39034300c00000010472068601800000244530224c0400000000001604900400000000783c063008000010311202266028000020220c04ccc05000000000098069006000000410840483010000000a82280726020000000d4150130c04000000001c0c0398040000006a04401430100000000c81603860180000001b024030c030000000320480618060000000680900a300c00000d0082004c60280000001b84402cc030000000034120318040000000064240730080000000d02201c601800002424040648c050000000210880a180600000000645805300800000000c8b8146010000000188b4088c030000000341680998060000006716c08630100000000c456044601800000184550218c0400000000002a0490040000002104408e301000000000c8b0166010000000000250188020000000007498198020000000000e40b20080000000130681e60100000024c440378c040000004888c04f180800000000b424073008000001462a01bc602000000284560278c040000c62982c0442008000184510680884010000001460c809c6020000002841301b8c0400000b21e0881320060000000b255034300c000000164a20686018000c119843028d004,0x828aa03498080000010114403930100000000208a81e6010000004045101a4c0405844860820354200c0a1c91c80c096440180000001449204c6018000051248c80d9003000106360a6055a0080000000000bc06200800001908c34058801800c210a18805c100500000000003a0490040000000000780520080000000843202c601800000002d0e038c0200000000005a07100400000004219034300c00000008432028601800000000005034802030421a1840468200c003043082302cb401400030862098176802000a30ec10c0a2d00500000000001a04900400000000443c0530080000000000780a401000000120110058c040000002702200b18080000094260900b400c0000000003c01240180000000003601480200000000000d8190020000000000d40920080000000001d80c4010000000000390188020000002986405e1808000000510c805830100000000000680e401000001461b80be0c050000000000140390040000041859023b3014000000861080b26020000010611c046cc050000023025017d980a0000003209409730100000006a14819c6020000000e82b00dcc04000001ac288127180a0000003d0bc06e301000000006c2803e601800000e615c0638c050000001c8580139808000003785b010e301400000650ae031c6028000000c42d0238c040000000002202c10080000000005401820100000000682a02e60180000000c828030c03000000029088111806000000610ac08630100000000c42a02c60180000001905c02cc03,0x1a32c450c0a2d0050588512086074fa00c0b24a188240a6b401816194110180e5680300000000003d0388020000000003780590060000000006c00b200c000000000da02640180000000003501c802d0858908181b65200e00000000010c0620080000000002080c4010000000000330188020000000000620310040b3ca2883c082b4018161941101807d6803028220304101aa1006048e40e38604b2200c00000009241026300c0000001042202c6018000049210440d900306065844860395a00c000001211c409630100000020e2b80726020000004105400e4c04], #[![0, -9, 11, -19]]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((0x4ad36be1522929f4d643b055ab584ab9ae5106b800000016245144e44d40d444104041040c0000803628eddd15df11399838d1d671c00003f6644d0032a30d2223cbf01688e10000000f8208c761244d3c00000008a6000840100003127cd0ca5ba808333ca284e16da83d4051b151b6f9e54017879dd9baa030107c62f75d88041cdb418f45264002f4e09836f93000000fcf34393e84021601600007b0c10a6890b1d14cf8c81a96eec0a69d8004d3400005dc45db10a01aa667a412d4abe303004ae3f06577b81869b4d06836c6598a04054409898674b0e08000006eeb66a8bd4d7e000dc161e6af1f5bc966062583bb331208f0e388f838214c591b9820e12aba3d0800381480d49800000976f538011004000058c8ea028000f84f320b309c5546e227dac60a89a59c31c19611408c08209c0040064200401a3b00a00010723a6231d2118e886c74017e6195c505a238c0074c46ee404004bc9504208a1c1fc101e0486d1a9a02c0004c9a5800130811804348443081ace9d66c9c340ab56b095735ca20d700000002c489c81c804104102082300000180801006c4ecc19436ea0700015b60d11804bf2c2a2089f7d1c684003e366d808006925cc1b826082100800009a181a4aadf6b78f3400117364a028390b7718041eb14199e08000da6b4898c000000686300000760c7d80270c230080000b8900042232c01c2f5b275edf7f41362e4872e302439905984e2aa37113ed630548d2) <<< 16000) + 0xce10e0cb08105000e00200030200200d1d7050000c111cc110e5848001d1c8eb0cc75437a5e52bd8fb1c333cdf51a94084f2646c0c0a31be6398209906f5e40000004fb3a8160c2000479a12b338662041e668aaea80aa58353c918180a97a4048045a4e331e820c4d715a70100017512869382110043426cb2d61e52adc000000000000000046d951b36c6e887f70e5b94025940d747084291a79a90e80c80a60608280060100401a00032a7cd52d11d78d020de689af840411c5e3d50c0c48550ce5241263e37240106ffd1792e08000cd9d94e70022008684d965ac3ca55b800000000000000008db2a366d8dd10fee1cb72804b281ae8e1085238f35225021010c0c9041070000200d00019323a80a0003262000cac474c463a4231d1098e800fcd232fb9d60f289f516f5e4082a387e10d014160db2fe343081e3390450a00121bc0200000002d327002200879a4e5744e641b7c178abc8a794588cb1192142c3b2c00088105e04b5847e00f2f45853c80a0c6298dd604678770f4a46861222bb52e981b46dec7ea2851d2adaeffcf954100e8a8082000b17f9509853ee4ef111d0f4295e770ce00a81a00002f3000839e03f363482158c3501032e172524890caf707900ac30d7cfa5bfbd8c08628153244080b31a28342d100422d90520d0100050b3df41722000a0081e6d4d7481fc00d40a24000011e1a300048e0179cbfd239e94041978d68ecec181219b5ed68d75f0c830db75b6ac469540604392f6ed26ff90202fd95f6dd97ff87a1202000d4150000478400107886104c304261800bf1c77cfdb69e3c43eca62c008f0c12af11264383000004398ce060a93ed5600416a599fb4c8000000c7413600a3881300a2073d1819b010d403c894ec04afc506d6f48250d551088bf575dce512091ce49818f81c128850336ac47000003cc118e420006038f3c537d08002b02c40e4e40464c6b30b2800000b71b002880003e78dba6100e3dfdfe3a92428337cdf2d25a94905217db58bbbc18105e0d7d32a411003c2cdb9cdfc9c42000b80e00003fc47381639a0b81c06bfbfa444787dd84fba229e589d6b100ee28a66a88040bcca9084017836a56e04000c2e921c27082100840e0000011d0223b56816bab531800000bb80807d4cc116494010d2fc534d220151534adf828c104a02800014f20005964001c3080045891cc110e58480048008e5088724140034707895ef25f146125f86ef585043bc7b9f060e6795ab124050b3cd6800128c0f804072017a644429ab02bcd8a93639af10b1e04f7b2eb75c7dd172b7b44d71cf318bc3ee44f00887320b309c5546e227dac60a9a370d146cd0e493a949d2f4d602183a000000016099c8893f0b59460a982e0f21649631c19209c0006363feae35eee8abd6112b278571af82f917c3b8f98b06643d25a0bf0f6e929b300c646b0485fc1413ac92160469a714fcd3ac87feb5a55bafcf0c200fdb4cc70f2aba4e2524fa6fa403f1474d11ba000a68471c6438c1a1c5090e2028001af0edb301c7095ec71a921302a174075aeab2059a370d146cd0e493a949d2519cab583a000000016099c8893f0b59460a982e0f21839239221000e000089bb295dd7ef1273b433aeef57dc109c4e40760f3abb47972406db9b5cca040b988db99745997c8d48df7b1938254d2f8a1a0006d440dc0606c03c297f77b6c286e35c7d389107511f083c1f54d5594a02b62d7d0000094807802038613c20d8e53d3a21801161dc2c10d1ec4c860118d4c59c7006a5d4ca012860f80434809338794d0c75693f8380835b5c389024860a2b14028b914e4201330254026041e0087121fcc6b6bed4124bddb438b37e6a0e52c8820c03c2828a2686de679288a4b0ac32ae3012292ebfde4ef1a70810ad0e1d03812224ce73d210e020991c4bb60f0e41b59002e03c50f22da496ac3fc4a1a15f71ef5ad1f8e244821993a00cc124be5d632bd5285245184705115a1867082837a122106909106f407764369008253012891f240a3c01e29b96253e5dccbb6400cc1300004d440012f4e901352c439a18ccb8bd248617a700b1c050cfbd62480cdd97f30801d7512833000f00426713f3b0efef71253302c31ef5a217e8690263ed62b04f5220871bd404912edb1020de57c72be2570d0c4e76d60aa6ae840635772f94ca0840c3b062b99f0c4981c096116c99949257997692006a0a800027e23840a0003cb20013ba470446380231bf098df00f8c409d1ade66258c150376a7468517af1279dfbb9e11d223f67f0b04196788daabda780f56b0402980b00ac4d9908930c01b0db1b84e7040fc29af061f6a78142b02c69262c57ab4d021418382100010259a810014d0ce3a012080f8042071a5d141e97a2ca1e158878f26690140e579c04471f809993f15d22237d2a88a6bc0c37a1a3b0f20c504556602fc324900d2e8994475000521b14776260628a430ac0c165003f6262a4c992007ea480bda24b1ce6d3b76e690007eb71d958e3e05aa3e177c8891658ada240202000000d3860186dc06623e2d00055e2b1676b80f6d2185405000021520008a240015048de8886f024000f3a4004c08f942dac2220a1991045de8e342fc7bd32441de6274c500aac3a32c025101f0080dd80f4c88853560579b1526c735e2163c09ef65d6eb8fba2e56f689ae39e631787dc89e0110d1b868a3668724578bb38fa6b01101d0641128c5e902cd1b868a36687249d4a4e928ce55ac1d00000000b04ce4449f85aca3054c170794718a04f0010002ecaaea85e34f4)) <<< 16000) + 0x0fb5e5e871df93176fb243028d72a1b3331083c98d75bc21716b5745a997843496bdc17a0990e7c79845461b0bb971297860610f69c4285ba4c54705751d638d03d3e047684153c4828002c391ba110dc848358143700a00070b3a434557d131024f624b2f0e1082f89c1920118f4cf49001400fc9800020129610004000044c81700f426cb2d61e52adc000000000000000046d951b36c6e887f70e5b94025940d747085020103077dc00000005d817655f8674c838671259270c6084041040200162801006d4da7904149b84b320769a03831e400d37640924d9da122528c15543666815346e1a28d9a1c9275293a4a33956b074c614808208d009000038738bb3cc23ef9486ac510a0379dcca3f408df172de855b01eefa8a0ebd89291addbd29e8572f92660ce6b8012c44842c8d20ed2784936ba462ae0a0b2f9932499b68d3854a2f4a2a00080c78a060bc801b583892536a844eef2c9000000dea80304460f1bf240b082ffc03088a682010e6b7a608ed01003e8312160162a6d3c820a4dc259903b4d01c18f20069bb2048ef2293e06f268962f1e040ac9b3b4244a5182aa86ccd02af71780b72958aa55c3e880a9a370d146cd0e493a949d2519cab583aa71230a18248000015244c62eaa7e68bbe9ccbc452b652c2ecbb892c876e2612b13d19ef80171dcd7dbd40bd0e03c0d06cd472670a5c1d434bb48c27d5af00b4ce32c8175304705509428efa000922411444000c9a43683400197246dc940723200299c235c1b1ad09f15e4627cba3852a1a01f21413e61a22e1204ca0a9e18601f2592848280681607c80c04aa7b45900088022213a610804000060483b8ec1d867248e00464781840000002581238000001c814300622ef67941e123e53f9141186db9f078208c56235a600004e404801091ec7699a595388c3dd2b2665a331086ce59d1726703d91e6dae0f3fc354163a90d4537cc53d41e739e6919e6655dcd5aab26d565dca0d0ab4660599ef321101a4ee22a71fcb3b05bf3d4956045c5d68368606fd934cd3c75901874392da9c07c7a3936a43f39edce1ca387011f4ffeb3a79bff160ddb703acf084f562234a1d3b2c25e01c3590cb7ea8d91e3113feeba68f0a1dc838ac9155695a2549a5d3c100000edd9c3161a156cf177f0a7c27c69e3e06da36c82101707a620d6d4ab13b2178993bd1a66e2b7c9992fdb0849b21b39acc3dc7cfa34c87dc9284f716f489dedf212dc172de410d07a5d3fc1352895fdbbfc6c9437ea639af9f9a896e27ebc615da0a8db56321a060800042a91b605c922143a88d4661006716cc07c48e000000591050735047e2d7c306044b9d8788504430c84bf8408223dba1c0b8000065c90a0051ee2f016e52b154ab87d10157a2519a4dd402e6483e8d51380b549411724f878309b1bf22090173301bcba118725f3848d5eda00000000000000000110d1b868a36687249d4a4e928ce55ac1d52472810c11c000039a0de6ffe17312a026d19841864244836091ecdbe41f7c30d374ead9462842a22d52c479896c07e43e838b203c00916dafb73c175b19098d1e674d0d37bc8f28bed4d0967c90948906a0009e04001ab48d700c6b407fae085a24557eb82168915a1f7afa41b6d87debe906db82e748a2d41ba3fbd859279eaaa92a5821d78baf550aa674b9f000000000000000001071e28819987b14878a7e678c482682a4b207072576bd224400000000000000003f346e1a28d9a1c9275293a4a33956b07507148049005003000004dd2fd83dd21220e4db3adbaca7f0ceddfa7baf333d7020562823bb66e91caf7603e0c39eb2f1c175296b89bb143086285d914b949f0b4707c6f63bfcc22c0dbf49e63f2ff75314dffcc756cb7a2b8e4715829e043d4520d0bcbe7b30ac11e91880e5bf1d596b1614d69d8ba000e0046b0b436a52034250da1086ac743661205d050d90280062ec8d884f07145a54d0923c6d6ae8c87129d9e7e322044a77d7d6000241c2100860e8e76d06e2477540cde28e2407ff2118408268c293a40018bd6e4c1c0345e5c92000130e1080400004f48d808c37c2635e039367684894a305550d99a0542a039acf6800b39905984e2aa37113ed63054d1b868a36687249d4a4e928ce55ac1d42c6206183140000000035091e60d23ca5343e6b294e80f351d811520c347f7c98b0f72e99b878ad012012dfcffc4032aef204a052cb2262800198902b318d704c6b41742b4ce8cfa957df2c1c5c26ea34eb34c7a828497d809c7af61530a05ebaa5d606588e01200b17770aceef5ea180f27f6faf8aee6e02804a28c980bc1015000001a963b467f52bb103c33fdc439bd0191321234039e1d8360000afc8d61ac1dc660ec2b06405f1413e4c19ec5089f2d30a7040412371c3742045b3e978b8106dd5469f18200033e3dbc0100545ece3d000414149cf09002147a1a40779c655dd77c280ac2dee6bab0327a28a187c46f1fdaf30d439b4ae7e250e6b7700000000000000000085a21da9eb1e20599428e28a10c00a0000070dc3ae5fe5c115b2d4a3f6cd2845cffeed3f4162cb4a905e6b61ab3818539e9741c1c36fa58f597dc77891688f602c984d4c7b37c16b898b0a67826c435335b4cd3ad7cae54bb3e0e983fbdba7457c8a7baa79be6150004a52068521ab210d50686a424000d4446a10405c6a1a70d00081790ae15c0ca382d9777f81b5f31c4038485226097b7f511f49a2d142660485577913a6b2065b88140611f4e66cc6501cee382049e188920ab4abb755ee00002200f5673f84a02)) <<< 16000) + 0x1b0b107a82ab8a04a8dc0dbad5ca1000de387f6f3540410a396e14364bd4dee4c9ef7424b74116be7d0916f0568510c40001cc1c092311055ab002025657528280b06089b09783d93830026c25f9ca8e0a05fcd61ce7c7020074471bbb72a2002062d3bd5535480800bc4a01b460424220951f023ca00d4c3361701800009188d3368695a43482b1a3098d1028684050349b653ce7240e119751b7404b0c13a829f1b2340a1087c5ea8579100087c5e65d690e02b43c0836d78a0043ecd0b861880a22a025335dcd9ed012432eb7ed35c674c2c02444f4c05e9070accf2c11c5e8641bf38b0abdd78acf90d280000008e62028a0000171057e492400005e8831930303949cfecf3030c47934d0d3d63c097f00382f7cad94801701626c6058cb1c9802620db050513cf30f2ce2d10cc0c304b007032000200d0000ea313d300f08add313cb080617474c2cd280000008e62028a0000171057e492400005e88319303039b1191914830c46f85f4b0b22c1039b11c10748f025faed72f2eeb652005c0589b181632c7260098836c14144f3cc3cb38b4433030822c01c0c800080340003a880019d1e30a527eb75e6d4d3000008dcc4a58e2c7dd9b1bcccc0c240000008e62009240000bac99120b080e177af228602084af1e73c6420a041522f2a1db64e029434e20d76d2d91200600689b181632c7260098836c14140e38b38a34a4022c2041280180c800080340003a8811008000d8885b86c2d82616a0b0b401c0e6338f7f89f50e280bf1d598fd034a11794e86b9448080e23cead9432c111794dc369443047f92a0a7b53380d0f05479d5ac900000000c3500fa10005c0589b181632c7260098836c14140e38b38a34a0822c10c1280180c800080340003a88d002c67c0633c0389e33c54c80b3289c137ba36550c79a4f3e8e1aa3220800046bd90ec186300acbdaab46021d32d13b0707013f1122cc6cc5000000005eec00808c13911fffde69002c0244d8c0b196393004c41b60a0a279e61e59c59c12209809600e064000401a0001d446741633803b04ce4449f85aca3054c170785240f30c28f0ca0d204d050030000200d9b181632c7260098836c14140d40c3cc3c3282481341300200c800080340003a885e82ec13391127e16b28c15305c1e14d140d34b4042c44414c0380c0000803668a5d52f509e28227874270f384a020780000058fd401e6000000163f5018600000ea58a6e96580000e89f43e8a28069ace558900a18811d7774d9e220e8a2c420462e71ea400c00d0000492648000cabeb18b281b24d9d739cd82065afd006f5d2679800154499f161e1a242dbd52be8082a697812d7ae18000017540bd16400000021ffc5d1f42010b80b00003fa40015908003c09000aec2042120200500073818835c55cd72d5ac202c00000005ef082b668724d1b868a0d80000000582672224fc2d65182a60b83c661261059040c702480258300401ba55432539fbf349c456ae51a6612179d38621091c072ce9b839e102b0d747551c10ecdcf176c78033d8b73c20a000f4a17c610d20209c0517bc20ad9a1c9346e1a2836000000016099c8893f0b59460a982e0f12279c5a221219e0940a205c000401be68f2b6a7df6d2cf307e07f26fb7026140000005e4340249012085b178c81a20000001790d0091004ca59576cf820615d166708a900c30757231ec91e1e0cacf78e686f1283890031038000129181c9144a63f4e2a70e044d2a0186a7814f628306420287e186233416898a00a43af40f8c004fd682b52704230080000b690005492000e48466c1433402199010cc008002528e96d5b73cb0c58e0844f76c250e0000019005062a382387628205616b7ec581c308046ea3000000006404e0848010d2c84f27ed12c7ff78ba820d04dfadab692810894cdbb8900824bf75c1c068bda84d898108802000026e465c0415802196010ca80865004326020a9010001ac1098018ad80e20d715735cb56b080b09649231228a21009400e0040080022e0c00401a0001d2454817106b8ab9ae5ab5840580000000bde1056cd0e49a370d141b00000000b04ce4449f85aca3054c17078cb2491481450cb04600000052c600200d8835c55cd72d5ac202c248a40a308286404582100000336829bb3624f6847fcf94fade22ee5c5c7304d0c28000ac903f318001a910360d84304c21407106b8ab9ae5ab58405800000002c13391127e16b28c15305c1e230a2872c62861851c31016e080200d818856ea3395001c5000001356000515ead74020e523442a2cdb03ecc08103fa86c8b26014203dfa96632685047fe7554acd7180e2e8f9aa4e8040328b6b3b2710c604801701a34a5ec81e4b8c1c8fcd923c18129ee4a5e0701ba4ba1bf080bb198fbda500220080000839000358232412191050c802863c1431c0a18d050c602862c143140a189050c402861c0630c03185015ef082b668724d1b868a0d80000000582672224fc2d65182a60b83c461461250c48c40a602382000017280100683300c194063080206401d902cb2a6778c4a202df415aa4e924095efdbb362247349455c2a6038e5a94e38e2f0a120215419ed31225d7a55c857a1c359efd2ee2da1862c95febc4aad09002b02851020219d4c2ac490db67cac438e48eab7fffce55438fa21b0fcb7f858c50096e30ce678910a3c456228509302a8c55fec489c431966ede43806064e3c20054412005806000022323060a02b050c1028604143000a17f0502282a458bbc80da9438e2c0c5c449af8661611db4bd5)) <<< 16000) + 0x71748a079124086871c500c416f2613cc2869919fd8e1668e92e3a5a084a3078b8084110130001001bea1ade3cc4801681605f8062fa03f307201386c1b3ce302916fca8f000d30a4534e2a28053203ba16729cc68e215da60d9f1b14d2224fb0f356844f04159f1ac13264d0454da12e8f75c1049142914f1aa273c4801801e05f0070348ac150bfbe079a28b3278bde538d336f43c9dd19e4bdd02c944fbce270f2ca0b0972a040694b1fc9ee40204752b1a8b39c10ddf1ae5444c208cf6be795639a292005a06081a4560a85fdf079a28a1f5e1b3e71a66efb93de4a792f70d1d52bfa71387c9e556caea0407a581bbc8c8040861ee5581870436f403b57c41046660d2c390da2a400b00b000044640011ac800372907e0d82186f4b1829f9d897300c2c5cbb1748dc3538a1c3eaf0e207f0c2814b2bf4f5a4d3474895686b987c0c1e534b7c28dcc838106f6b0feab158a045974cf458a8004120929989a6bc20e812006408817b018bd00c5e407e6050b5478a5f0d30f011c77ef089967a1418aa6b034b091110ae5282641fe0ff25d208e21f10345234f2691d13fab6d705082015c365e17400035d65f66a163c02400b40c02f00317701f9a12aaa4ea0209c6967fd79018fea1868803fd81371c6010a71ae8ca48120ef6cafc2029e4bc0fac5c862a7138cc69d5feb306083f51be7a97408286adf4513de5d02400b80d02ec03f38e056bc3682a687242db15444d231fb357f679a0d5b442a05529aceb36ad7205225776d2863caa09862855820424bc971078208c464c256e612004e030f38ee5c27f9e854d0f28c6dec91134955344e7433cd071973c4005529c7d3ef886640a48f69951358f2aaa7aa9ff341021384e94af98208d0aa9675accc48015012000083880020c900067f20011e040700400177a78d170e11d168ec59480593045b2d51242c8384188301a48c791296f07a2c9050b81d866ca68c75269e843578c19cd0862ebdca1634705fb6addea0004252eb8327e17a04801781c05d4062e803f385c384745a3b185a0164c116cb548a0b20e10620c071431e44a5bc1e8c28142e07619b2a43ba934f421abc34738aec978dc6c60f1c17edab77a810503e127ce9d85e812005e07017301c0f170efb9b0b68d3100b3cc36d434cb0b23cd24f580f2c63bf155350634b050a66b3d80d321d4848f299a438838b1a601b768d223837e4abb8608240f3e7c56842f412005c06881e2e1c56df14e34c402ca2193bca658590ab811180f2c63c74246f946960a16a1a19014c8752604cf6c61c41c57a7e053f8d22382fe4ba8c410481ea45ada30bd09002d030000116900047f2000dde40b8042e402171010004d99b24414248361f8a25b92e76dc20ca215609bb57ac88233e7085f90b0c1ca4670f9813cc15944ea571728b16e48160e4340a178b6a2e42648804c3d7d14c26a882400b00c02e00381d64b630000520686db9d1515e7943e497463699c56a4252f1ab05121b6e725a17962827c4b54ca080486a39c244810019737f995d01805245b4c46e9b12085404000021022de020e3010b70081f8041ba020004cc200481a625064a38281d01a508389ec75e6965048c878e25f9a48a0f063b0f4964890058db80198329b5fec17fe16348a6396224614001b0648062400010110502bba4149002c02c44a0ac485bef00d288c3d7f05352ca25d894e4d10d241a38150e372491b064806240c19bcea9d65542c69f74d608af0b0066d348f7160002542b0a3292b92005404800020f3648ad4bd976370a24490fd2c2b12610406d491907428807b6cc934c09040a9b3df58784b153c09b59b60250b411c68ad27d20011c3c92f20180010fda7c6a1b622e400b40c00860200024120561381230c13a5c2dc8a243caab2fc11b14413c5a595322820846814e3a93c460a2046e429bb24b153bb66e51c4c142c719582ff38f3442444ef4330d04081afa16bc792e1d89002f0385923222af3a1bf2891bf327ddd349441a82409222a0822018956d32a460a2d793ed4fc12c567c806eb248142dfcb2cef367c810082522923de3807a4fb5fdf4cb589002d030000116103d010170080012c881e08c0ec4607423c2d3b6d6f692930a202c27b20fd4609211b5a0f2cb7e8b1c0c14583ef11871c8345f39b4be0f1078ece11668e8a116389394862349121e4c2ba81f040008986618cffe2bd44801801e05b4062d803f35bd192043298798042c44d432638b0d1271460ef1c4834308c3f2b4d27158ec6ee1d2490042c437826628419dae75427e8e008bfb3dcb7f85002f7fba488e81292420b40b000045e40e404070020370101b0080014488b580800443081a9080d0740662a03215001d46104539801e3c1e205e4e276da10308816ad1abe4a8a23af425f7e1fa38607620ab1204061c224194547003048ea90adcf2a8a13f61fc94289a300076208dc60400001aeeb247ae12c09002e0340b500f05179389db6840714cffd8b32c8b18575e84befc3f48100ec415624081048448328a8e0070d19a1114bb531837ec3f9285134104092aee993b01c0076208dc60425812005c068c1496e61e47f01c55c0c8c20a64616f29dab573b20405e7080e1a04134ea1fd0d801c36db3707c48460f2b4c20c23b1c20bce0d2e3401040e930b6530f048015012000083880022f902e098b484c0b4140580202b010150080a4040500202701013008094042d0020240101180859c04000ffe4012a3c803aae1e200000042cc05090b50edee2e3020000010b30141e8dfa60ba38c04)) <<< 16000) + 0x28c4285f485000000021660a0288a80521da8f00205e5940a406000036642b9262cc8b165418b21ec58ce62c46b161318b016c57ca62bc4b036218ae8ae8861e36bcd7d7bcf7a7f65d8c0840c1a613dbf789e22efcbac44219001bf9fa36cbabe65648d5196e81c092b8c5f6d16b95ce4217d742a280438ca42c967cb9f5542a9475c2001c08fdfa5f1286ab1d5f864b00002020527d7b58d789c22842a0988050444b67fc898e602ad99f801acdca00057626724c5a54437f1e165eb2d3691a3aa6ca8fe0b3e31882389029af9c9264c2c082030370a5c70006ddb7000f00b90800025201a0084070040102b80a0000373024010040000111a1c777199ef04c1d57b7808c6179fd4289c1f519edc1eb521bc7ffe4969f28371471f8708ab2bb27d96c882a44529f6014e4e2e4f8bf2786afaf64f71f7c176aba684082eaf6c5beaf7e9a4250e460c20dcafcfdd5e76513df16951f6662a7f414f460c0117d492facd6317536a1fe0d608d8762c0152fe23a760562a4fa796bd4bc50400003419a64d59cfb32599d389a0ad3bb1734eb01884cee519288472f63395047a902a595d854c0bdaf9276aa59b746833bed61bb40afa944266ca8f8b54851f86e800062c21300315b01fe8182d5b9e02cd5ac22ae6b9a041187e33a41722cb2c82462020c12c0080001512950c6be5ab0949bb90bda4973cd002fdac5b2b7630e68c22250001d3207e6a15a298ac8ec114662b02b157118ab06c554262a80b153058a902c5440780921ee9e98a0c76de7ae0002048a08001123001b9dbfcc044ddead4248277c1031e100a49b5fa3800004850420100000e922a01b14f0986080c5380710d3b2f66c306d1588dc2c0abfc07f80046303a0108000080205340700001004506327e6ba1e1099bc2fc306c47b5fc60067e86d090007402000018c400040ce080c3c46f8605a2dec271000f00405340782da0a2161001900861850822870b0874761e84883077751ff30009c9c8b04800420100000d3200026840007648a606852c2407e0200038822943b80d71d8d244d00c9b89ef0502c6c2709404023202000800005a9142098a080e8be37ac820580150c401208039cba6580046284001080cf2957c440074010090038000080220b0b45cf03003bf51fc62001e00800003990000b0229212148050228080005988220cf44449da8d2489257d4c15101f5d27a19c05947a3cd010241c1f00800006d901a09e0758329bd090c2f44fe49402195f316000023241f00800005a102b150002199147310a31680e8940013d07061c360bfc6a25382a13d04de7bd811f1c422d62a345b2710ad969260c8781cde9391ff25edd5693fb4a6af0bc96038babc0fb25d5696c50ac59d8972deb42341083f63469c81382921d4e264f2c8d1a561ee19333ce191852754920003d2ce63385722d1f6dd6f31674b18e0cb9b357d211950555e2fd1014341b35b52304c475bf5e4073b0190c9800000008c879d73e4629ac8f8d660310f33daac4271c2baff82e40060adf9af1d811b345f6b8dff422efd1a15f3ee04ac89705f7bd0e5d9787616df2813d28208cdff56cae750d7c8d21bbe21402100b8374a9babd2a3ebe339635084440957c3f6184a69903781431a0f14a12c025f3bf39000283840008e28b539659040c0eee053e3829a0b85dc0c1466a24d50c045772af240025182100850702db10ab923a02e753a890cdee253b0286442c34b7101c54040092800213db4e0f005fc6dbca4e084201091dabca457c71618d56e1850d52535f74405867c1c5c9010800200001a6683aa32a1b0123c3d2c6461218d2e548a0a1c57d5969860d768df141e00f61546dcc004001091e9c95dec0615f53a06bc50c1f3028e4304bc23e8e240020008000068904d05000115904c0d0a2848510140009a440017e88a18ae87011442cd8a1b0ceaf894d064cffab1058201b80c3c14040e9c04182005283e64000026202100808c00800055081586c5082628203b1425fa29d8c2ad1dc3a0183a946e1b8600ab6a165400090707c021c40ab131232015cf26f1c340071b124c30018d26b88000990d75d4000946080021438c84c7b51621c15ebff0c2054bac008a0c068cfca9e003593a3a4a0040010e30ffc08761c521b9167280465d50b7c5077bb888348003e0100000cc34411c62aa830a4e2d8520c22c97b1a0782f507126060602f2cbf2800f0040500040002107890a1badb90820f00404fc140000c2414c3427c1a13d090001e110004e5227833f08021bb0ece0406be56cc706c6e2ce99001d1856cb40090508002121657742a222227f9809b284109e11027824116ac30e00057f99292820f804242c0f5a3084442f7c829a508920d53d8e044757102120b3ba45af25041f00800007d913b05c85807cdf968883de98790a1237e27200a0a0b423da3800233d2544a083e01090af53d38951106a2f1419424413140b38202810c8c2024a50a52894107c0200001f644e82400044c601ac21c823383125e1172784177d79c880a8cae8e5a48103e0101390109c0080003f08002bf110d150980684bc04000d6640682762e39bb8fcc034af4c7858130dba0c000231c1d00868123b5f3c900063b64740044283c0108060080204dc2426c1200004c3830a8fe6a4d0c297282e601c650a060008c607402000015040006a489a8efc21bccb6a8b086f3dcea340b770201c023101e00844a1b4971a1181b3f19a8a5800fcf44203c00655ae38900080021a2800ba94b2c2778a154a5053caf2e826003e0080000a1324)) <<< 16000) + 0x0027b54d140d1ee6fea9208f302cb122040383515c8004001013401000073113309d09080d069220f7fac4280d5351b8801cfe9112000d00404c80742801adc371420b351c9890277246674106cb9026d50007c011c285d898ce0a0951686e4260467d2c52c600400100000a5200031844c4140005144001524f02a6a84952812e6aedd180575d3e48008c507402000014c4434642602212f010003859021290004df112e31000b609001f932062730026ee20568b11c1189686f56b08ab9ae6810461f8ce905d4b455252968aa4984e53650b1319dbc1fe400d3764769a0383149b84b32054da79041090cd04c04604204a0000002ab48085a1e17ddb675c8619fb32eae7be2ac2d7a0d98443848463c252f57b60b7384914d1327f99431f01197111d47b66aebc2576159fbe7a97f5ee8192d5974a5dbddafd3d4d308a2b628d8624a21200024ea3042a71d700d4f2894bbb99838f0694154fec0351e2108aab3e866ca8d57a670b9cccd0dbf6ea58612698c3b27d2fb97e43d979e3fe5da482eb4d806d66fde31601f0bcb7724fb43d398feea1309af2926d6fe20e58221bf10011e23bf45fa738eee9207f877a14b50fcc7424c238edc580000efe17b1d2f7fdc76cc400b072adfe79437d48ec3b6e204341bb748ff813ab2daa95b663bfd07a2493b6e60f4e3c552d65b27f5dcf5e5c4409bd726c96fe7cfbc894a59704c0c1882d8ebfc6086c50650f2c3d54ae1da9018abae4ab060c49d4b6f82066d24bf76300f985e0ae8000939210804220d715735cb56b080b136302c658e4c013106d8290fbd7d20db743ef5f4836dafd7042d122b3f5c10b448aa1719821220e20a22001800004113173d8040e055be364c02f8b009f5a06319c9fbd919e6da556a944cc662a8dfd3e8b9b530c9459d17a2f2b7fb0e6194f6258033d4f5e5910994bb1c1241b93908d91801100404b00712c6e35089940867853076c9060d7ae0ef400198d94b58c0012dc3b9524007b7c49809810880200002706080ae62b5d48960044cf3a20485ee3cf5c59106aeaffe924160f29b88702006b0458cc004401012c01c4b22fcd295a04741ff4d9c9093ee43d568004e45ea3c30007d02a8f1202171a9f349810840200002644000a60f0d6e0bddbe2c600d05f7912327e90deec718274e869e60400b9a81230014f6dc71013061080400004d489588f887e792c091a2ddcc947a4b041bf5c51a50045da55c7200091ff36a80128a108040000430895068001da08948c8002b9089412800320881f84c004b0c88b1480d0840d0421151d03b8c81d864002f02449d0624c6b125218920ee038cc94008380728ce97000024403e0089125de70050744d76322041900809182c488172020a1bf0e08071a09045811061000400001fc839888484342400a06e010000c2911f2188f02f8327b4510c70348b3da880075171de600004232c1f00800005b902b3188e98c47007a60009baf2698603ab5d0601a38001a3abc8a2c803b711c0e211b7a2bce8a00017546db4c004801011b01e8e54570b8f2850b4a1802182719ecfcf4c00a6d8705a400265d55fd250421008000082111a01c882e344d301c3148e31598c1d592cc6e890081171f922012a14613b0250c2100800008411190d88c00ec530f509658a151848ce40800ed440224000a5d71d8e0009060840200001c2445c77425cf06f4a4708d2c241da482f72e64f218030e2eb500a0014e248b400025202100800008911161d01a0a81a04422a220770d03b048001a4c88a1e844ce42245a0f7210888284401621e0a10e0501c828002b30802b0310361584306c21407868068d5fd61eb9ba3510c983bc7c118e3703247139deaca85fc34b47cfed358841159e16454cba14b15faf78950fb3a780304190896bb7103826bac6436fa35ce31185411dcc67ed2bb2b4cee1fe43a99c933ba53f4bc3dcf380a19435cfa2c5341f403018204988d46f73bda7a6f3f0558f02e233a767b5f0dedd203adec3372ff62999ff63fee3b71b1d1ee28f2308102800360000008828015d5cc1c4ab10672a0334ee7efdcf9e85e82251acf336313101644aa04ff58e61d7d7a6fb86a4a96fdf784c49567fa84d84012d6866c187605dcb3b49138372143bb1b181e3b87e1a22a2d5e8ecca2c9f5d3c8e0abc16537e7255542cfc3224928618566f7170945b84a9305429f0d355506cd2cc964f6db868becede8b0d10d16989da9c098ab961b7ad2f4d086c80dc60d63145fa751349439260fc67faf8bb46abbdf71d09ae9dcd87ad3da2ac9d15b3ac573ae93e4642eda613aaf9942efde200b025c08df20781d859a15f3cfad6e7f988e3c284ca33677bf3d237b017fd48417b67297c4ef5ea56d73b613db631a020029546ab15804b6e0c755d25d8b761aa0db0e25e1380bc7beb0a531a9c46055a24d1c9507d384080216668e91408000009f93a587363ebfe240dcd4a52e50d07cfc22cf577ec88f397043786318845447db8b4d24e17e7de04a723753c296d4784900ad730de487a6cc5e5904445a45acbef1aacaff3270c69b22d6f8363a8196d55bf270026e7900ca5b94e186bb2ef99c8c024b90ce77000022242200858e113598ec0e3e06db785c786378b68409a00a61880ea4000baf0d7c80024a404401080800802200802008a2b324adc90486007727ca4e00063ba5558c00880210000100400001110000e8221a1210c050000a7910b150108a8428140003964000bf48001d3102b2d88494c420860683306a198838ac4183620a131040588180840807903)) <<< 16000) + 0x05e7fe7949320765bbe3ef4e41124efdde4281de9a1290ba3bd6393134fbffbe547cb7f6d71e17940000000000000000008c4d8c0b196393004c41b60a28cf82c530ef7a7a4e94882a8784504700380000000c0a8405fee7c59f2f50e64eb9494c6f7b5df6a27c5cd72fa135976434059e6fc95e05d2c260c39cfe1f9522a6944e1974e2ffde3852d2ef98e6712f0f64d262c0caa27bde0843fb3f8369e50568cfc7267e111d3b9c74b9ca5316863ba6ec020e4d405411a9749755ed13c2076a81104b90fb00ed6827921a95c61f1c9ddce824b5ae2168d10b44ab8b0c35cb2988c1d057b037504b292ddce187a0f0e18298a00de3faf73fc9587b822947ef76465a50ecb856db6808013ce87fd6307e396eb074a18e2e2e82104439350bd00000006c744fa4128f54d8f3af0d35bf62feef0a2e67e783a4550c391c1ca1965d0636bf030fd7825c6cd5ac7b2c826d66c45fa94f83ec0c2d5704fb155ec43ca82204859066a44e1a2a7d232970c0031e2b9be5014819b0e7000000243421008410275d462a3cb3b820ff12cb9901a4ba3c7649ae32e300990545f200000252c20008514af6c178d2678102cc7dcf3e34ef63d09804a8f4f3d9000840214523550dfce3cf21ec3a768f09d184365a4c1016dec1e64002200800006d110105d149ab5034b267803edac64f3eaa13d4b4a0256bf8eb64c02146ffd192821080420000200882125ab654050304b0ad38a01a2eab91d11006ab3056f2001080400003588000899000233334ced7120a267802f1c0e38ebfe38bd87820359bc4e4001f00871d63dc09983c025b5c0fac4004201000007b2200020ff010000c710fe1181088c3f407a4a6fe2bc5a004042307c000110e10004000021c87e0e83ec641f4120006f73300e995daaeef04a8d8aa54584af396f4669a76234eed24c2166f3396914adb1bfb08d635422302381e7952ec0742c039ef3808b1ad8fba3a51a13bdfa17cf0e1f9cf46b05d4066b70289cb687998580f7050bfde6427a05d60a9be4f54736442e5a2dcc002ede088a83036e3e2d434bbabfdcda14a99f570309b8cc8ff2a7679335471207411c6f76536fa3bbe0c79ac7cd5a723c000000bf57aef351a92c90b41d93d235d3524cc99a42f2c1b93a2df113d3ec787e79878b3841a6df8ca51f9eb9844b8baa4f9227011f8eb4c50e1e86430c3047ebfd7a1b65d0a50ca50721b08a97a715511521273724731ad0aa53469d814a7198c12c60001f1c8008041fd0305ab73c05a4efdde4281de9a1290ba3bd6393134fbffbe547cb7f6d71e17940000000000000000008cc443ac983bac59d09ad8e0aa749d9ef49f6299c51a0782a6ad6115735cd0208c3f19d20ba9c29229801400000006d1cec0270ef4f637238d7a727fef2192f7079fa39f1e398ad1360f2911d0330ad0470d1e06ae26f3edbba66d0416e62daf72c22e1aeae0e57b4bd784446cfdabd181d317ec8c5b6c74393144a800296900165b20036b86c2464fd4474e5b588c103ced280725ea7eae19b23e12bffb59111edd3c9dc5a004b20e927af49143b71e0120818264c14aceccd27a4c77c0df34964af9a1ea1207907b70885310cfb5efa2d8f9a7d760ee65bca1def24f23e3424095a0c6455b3096cd7869d807996eb9ff714685bd159ce85064e99c823792248fb0c2e98e602ca40b1756cec00000006ab49a5f00a1c4207f209a7cfc4221bad8a7bf270e86a33d71ca11a1372c43b0c295d88ee1accde6c6ba096640a8e784f5bdebd7e61c32307c2d8712cdb07342d019a66a6884824f0af5af167f520c7ffcbe72765d8f089280be15e3eceddd8b457b07b1adefad4a5e642411c60029dfda5cb783dc5baac18cc2005a642a220d15713c00010da43e4e40f26201f2100e90800aa1c87c24c3dcf61ec530f525c0000401101b9e9304628009da21d24003c00800007530040100400001110f40987982e0200200800002221e42b0f11587802ec72b841f146874f6d3f04f0398f3de594008647d5e000490807c0200001ba708b30a1d40701233f90b4000024484200800008a3a0659ff688e728f295e2f120251bf5510a2f9db0768e9e5493ce2ed112287b6da8129d5aff36426e27eaef2ad6d8d8976dc56e4067f020e6ce37abbda2e4e4b86b9d014904602678dfa7ff66f7338774970e1655c35a73b8688b30bcbb1aba0c299066d1469953321f7693d73f72eefb5483802c9c4ca024cef87aceadb79a061a0b59ca9f25baebded000004767d21a3f39ba7d057377e27ae59ba5daea8e0a8542a5b64aa748f0c709068ccc3a96921a81460db4d07081d230eb4230e3f186a9b18c6042cf9f43fd8093ae4e37161ef3c57b8fabb84d7894c6e9dc4750a48fcbeb537e154f125e6fd8aae2b5513c9e63497f3199b1bf3701bf06af0504193b9cb05b7f6fb554a64dc3baa9ffcc7b388a875fe000114040aca41de4a0ee250768e83b0741d6320ea190748c83a0541ce220e609072828390041c6020e2018708080034f480222919609b80ad75c7b72c2c633e2f97c1e091277eef2140ef4d09485d1deb1c989a7dffdf2a3e5bfb6b8f0bca000000000000000000466221d64c1dd62ce84d6c7054ca1c608208500000100123db86393cb4569dc58c3fd974afdd62da30cb0629920f69b5f88507474f0c92d873e80030193a1048f3cc264ead2fe97a030c5866f64969b16fd0b46b3f0cfcd94e526d918b5842120d8ba6e78bc89006c686bec523bbe31519fe3d77dec4fca72915bda47ef2f7e8f220fe16cb29a3df53185de32e586a7509)) <<< 16000) + 0x44862768c630bdbead4d35813d1de54475143d280036090054b52016c12636fae020c8d52083585a1d4847b17edcb1bf26b6239fc008e0000000000000000021a6efda3c0e904c7bac23a83f3ef63584fd5415412eaea45000000000000000000000000000000000000000000000000bc42061823002800808000aa0a001a638aece3fc6be1f5360b0746c556b4858713e635c81f21ba8163f8b46bb3e78901522e2b4d506c51c3835a14fb7621a3a2298693bb97caa97d1bddd1874901d9a0e56a11c910043004d64c5ef6b751b14fe0b51303a34bab2000b797d92857517b5efa4b970eac5580a9594c1d850788e75f5e43c41d6b5105390609b1d0bc274107cac0b12854001cf08060ed9013c6530086aa50fd93878ddfb440ade4355be007b475c3e5745d0036a838440438430028020010000200cdadd6f6134bb99e71aef7fe1303de510087cc5e019425a9dd12ae81dca02d919b21739e0d91424283bfd422166c6507e186c86ee1555ade3fb69f7c65a183537aef4e337f1bc3af1d86179c6f949a09a721361c18206ce085c8c26431efdec20400821ca99afaee1f2c0807100264709c0c03635c285798000035e90999a6298abae530801845265654c9c5cb6e6f010ed78c88a81c320288642d05670721500b9f502d46938c32bc73a010561b4851823a0910549b30c15519cab5cea527486cd0e4868dc3450750a1071040c5000000000b74ed15c63cdc3c9c6711e2488fe1e29b6a9b6a182da896d7bdcb2743de6ad43404e52843df416333d54b2c096b42de1dfcbf8815360eed5428886666f831405f8b47328400e894d9a400094708402162c6d70ab84814516ef76c2894ecc81be103253f41b6800120e10804000038c8700a837c340620200024d21bc5a08f1104706837404000bd240c5141641a0b1090004c210dc458189cc36c37017b3f459fa24290d185f225e69387ed0285126812fe01b2000000000000000000000000000000000000000000000000030a8ce55ae75293a43668724346e1a283a4404284402300280200000880ede54f1dea6a37820bef55330f9cd04d81fc0b4109fd3a088382a8ebc09fee583373921e0d58afe9c61f8c3224112e5d861c86ef75c12836ed38f247ee3b8968773fbd819b8b0884e664312056b3eae8a213887199a93e9da1fe937e5600a955af544b11f4c04196454f9b54b7d6bb95bec6b954409528fe270cf248f96536c5636a8b1c000000000000000000000000000000000000000000000000003268285401f540a1db5d784817f502aadd0b979fb6731ab6270000000000000000000000000000000000000000000000000c044843044022000800000880080211089c0ea0c0de19b897eb276500fdd2943c518b1e6b8eb9e3152a885d028f8be6d0451bba85d06a730c34ed87fb8b4c4585a3de21d93388c3b54b7d6bb95bec6b954409528fe270cf248f96536c5636a8b1c000000000000000000000000000000000000000000000000003268285401f540a1db5d784817f502aadd0b979fb6731ab6270000000000000000000000000000000000000000000000000c1020103077dd70f95d0000001790d56834858a4081823001800800095300100686d08f06a1f082fc48d4ce89e2060f97913948e11abe721c2808bbe22da300a94149fc0040098b07c021182a60ba4fc2d645826722000000000f5eaa2e10c18816a33956b9d4a4e90d9a1c90d1b868a0efa6b01115e2ece23668724346e1a283b5c73cc62f0fb913c0badd71f745caded124d8e6bc42c7813dec699110a6ac0af362a2228e2900960020005d955d50bc69e81f6bcbd0e3bf262edf6486051ae54366662107931aeb7842e2d6ae8b532f08692d7b82f41321cf8f308a8c361772e252f0c0c21ed38850b7498a8e0aea3ac71a07a7c08ed082a78905b20a260d81902c649b7591c509623f0c4883fe0ff048015537ce8804a203e0100d90100008a90d80d86b82c358161aa03f24000008e80e1dcfd97a1a8c1c0000177004139dbfc76b8105df4dc3e50e03173e540dc1028c3048028c24de5379f24676e89cc4a140ab7090302cba3a9049033cf792f0025141e00806a02800044886988c34827e489fbe4727322a4e1d544a0e316cf7c2098c3165aa1692828106a7ed10acb71820c6d3804e78cea0e022d391bdecd3b680000047868c008f42403081a82a246c5119124c0a1b1391e30102b59838a052dfa3ab1c16526171c90369d674d0498407802000024a4344541a02a0cf0d067028000e2c8003269000d75205602000ede219a530641dd8b3f61a75c40ab148bc385889125575c48017c8663a28086e143f01008d54da4c0008004c68400108c15305d27e16b22c133910000000007a7d40b51a4e30caf1ce80415f4d6021cea527486cd0e4868dc345076b8e798c5e1f72278175bae3ee8b95bda249b1cd78858f027bd8d322214d5815e6c544443473462831c1280032f1a13fcf3865b6fa2299e95b0ede90fd71b3ac991567558aead0dffebd402b48b92c440e48370141064a9428ad86b930d21b50803a322229e2a04c23b9a44a5c04446abf374a31d8d2470a3a6a8e5c1cd10ca58143ad48f6ad3434cf2ee2020241133350306a4b18e40e028f11af800098607c0201980a00014421962b0ca0986482c320072300000039044730339b7dd118a30fc2a83c600000258111086ee1df3483d09e0f49826082200848c01afefe9112a4ef3b409446034ce6af12080bcca9084422d84ec209205a90fe48708000c2e921c2708220080000)) <<< 16000) + 0xb419189c808c98d661648000016e36004900007cf1b74c241c7bfbfc752484866f9be5a4b52940a42fb6b177783020bc1afa654822007859b739bf93884001701c2463d1819b010d483c894ec04afc486d6f48250d551088bf575dce514091ce49818f81c128850336ac46000003cc118e420006038f3c537d08002b02c0000f190c705063028001098f905d39737cb3c48adff976a8619a9667ed31008000021cc678412af112644018059ef09080000031d04d8028e204a028000183312e4595638f3e8122aee99c28a288000003f48010400c4f070c4081061875225262088483ab86344031087e23cb6181241fef9e39850a492bc134e5b09002902444b87e9658566409131092a77d204156253350a10438d52932a64030caabf57263023fcf29d83b1428c3b9c4b1b04001528a548ec8800280200000e41814c873723a1e201a0c02044031da7a70588082cf6429c0000009f6751282110040000428861048304241800a00054d218a1b0c405c0a0ebb53a3cf2061bc317f3c443df9f1b1006cd7909f23c050e4c9b48200199c70b40260c2200806182fcb0c0427aba05000165894f2b0054bd0a790025f7a00009040840200001ba68ce55ae75293a43668724346e1a283a28147903861865822027806801019000100686180e053765d4468f2977cca0b6306012aa5f50c3a794fc5a160b679402404040e264fea4c08420100001322184120c109060028000ac085f8882f824000a7c4084660401b89664bdb3dff8e280000070802049be8543b933880057874e9080a126997068cc10432921b151010000009b40082b1a5e388308022a9626970b09002701844b29c5ce81e90185f1c8c5c1405014dfa7334c103374f01d32440197279b5500c2acdcdf0c0829074948778100021daa20fa4001300a00006d4c0a333dcdb24f205a6e3eb73c44e7fb525080c6531ae88041af84513280000013ecea26042200800009c10bd05c8c3ac9d05bbd9e5800000fd2011294489253a2c79200c4f070c434510c47699bc9a1821f1af38a030ef504d5d678482000001d1c04400ff84e92836c480148102010d54a1fb270f1bbf68815519cab5cea527486cd0e4868dc345074923111cd14a1511030d1082030000200d0001623233dbe9defd93cc000003f48112be520a0ae248900000aea80f2406279358234552537c3f4d110b805c0264442140a7f1cc8506a6a4cec08d92004c038804355287ec9c3c6efda20554672ad73a949d21b343921a370d141d248c44a447345285444141080c000080340005888001b31814667b9b649e40b4dc7d6e7889cff6a4a1018ca635d1008345e8d55300000027d9d413041100400004e880042c10bc0985d80e7d40b51a4e30caf1ce80415f4d6021cea527486cd0e4868dc3450748f24e1ca08708208904e0010030100200d0ba05f1449ad183a3c9795ea9ac9c4ab2d3de98e1c04bfa33050450e5b4151c2000076ad04163aeaf0e009c30840200002c442e44417012000322216e3a0b61d05a8882d0140022ae400948c80161490b30105700800b6c48478a8238440082a042c834162120046f1216012004ce9215ecb0ae6180200a885d2b29d41426cf7a01c0e00849d4a74600b52e2050281495b622f001251c2100848da64a208e2e2e5185026127f2ef70e8c193a983cde9bdac80a173484a2002c6304c673f1b16a10c0c16f759786c54d690013e31ff13b1228100b2dc94bf8ac84001e8480818350546140046716d183516a34e2860a0883be2a0c10024d914c90108802015a0a0ac050558282a81415202000143200074c42a08614e330a61985288c29046068230a30d85104c284161400b07001f14d09b4b08713c430c4a040e2bec3cf0709938186ac902810d646c000947080021c4189f0032840e3b162be61c28fef94674008c508802013e2209e0100006f109d1d84e0cc26c17019e089826c60e0cc237aa1845e2f84171814df014968a00bbb3ea784002b00e76c000084c58420100001452134630992984c00e44002d56a9871116a1b2281031ae406ac040a389599d31c100101129894108802012e0b0960584a82c2501612603912916b3b681031daed62305097f9ce87b102058d996387051b4d01e918010a014c74002618220080000a0980f6d6bac543862273b84f1420c198c288616b9846d34404c73400a42003bb7b7e80c09e77632b000938e1080400005a880a8e81a054124220911104808823c3411c120004e6211a7a08c3104582800248484528c22544110130870901b04c2182610a03b1db8304a53281819c0379030416deac25240626b1c6647002946411e00009480880218418490c72880e88aae3ea38070a600780004aa28b03000483042010b10a3f527fe489520373d01840a4274f91a000d572be48001be2b03404a1842010e287307eae050b3bf58c341841bce5a25140832755ac0e01150456ee38073878c5426042100871401ede52a387008168588e3a4b4dad10a17b60cf651200108040210040001d441d00400049641cc340dc0200039821063a0004a920d84b06b218348cc208460ce0b06601840808194060c803e29cf0b86ce38bd43e692b3004dd7a56f160107c33d58a001cc62dc00004a3842010c1d643a02aa48f5039da841c61a4ffb5996009cd69bcc09030840212387214ab9e593e08643ed3c8338f746a9011f107de152001d02d4725804cc00a6a200683d8bf59382108042470072dee8cb2c7666ab58713d3fe5a7e2488904b3519a080486123650021008040008000460)) <<< 16000) + 0xc8e2fab0064164ec96ff3048089f4dd25a40318e85d0448008dfae501601f3a578fc800541226984e084201091c003dbae49658e26220d471319fdd73112404c04927d200110040200040001de40009a480028b107f0dd8c98f33193206a0e38ea70c2d54cb78f4f005cb3e55e60027a3762c00251421008000086107e190003ae907d1de9241637cbe2c414c58ba314220863c4d09109fe2591030995a2e9de3433631a24f1a07cc1a687c00019c90840200002dc41f0a7840d8624a21200024ea3042a71d700d4f2894bbb99838f068a1d4fec0351e2108aab3e866ca8d57a670b9cccd0dbf6ea58612698c3b27d2fb97e43d979e3fe5da482eb4d806d66fde31801f0bcb7724fb43d398feea1309af2926d6fe20e58221bf0e011e23bf45fa738eee9207f877a14b50fcc7424c238edc5800003bf85ec74bdff71db31002c1cab7f9e50df523b0edb881341bb748ff813ab2daa95b663bfd07a2493b6e60f4e3c552d65b27f5dcf5e5c4409bd726c96fe7cfbc894a59704c000061120ba0a93709663d26e12cc84c00467cbe400d376411800000640c179ff9e524c81d96ef8fbd39044b1319dbe1394d942968aa4952d154940f9f8ce9a04118ab9ae4d5ac202e8484404384580000005e1c666a2bacc2665fe4e63466b0094cfb716a973864cef45124b51079f6604ec309403e5283eaad400d9cc8e520f0bd7cbf236a4f5dc920ecdb044d5daec66de9d753d2f538be3befa5ff7ded059e0be3d322a918696482846bafe03a34a1a821c940015b881a9480d0840663203219000b2c907b3983d16c1e4a60f04b0772183b0ef86f959e110702e48af4c8006deb889c0008c607c021052adf718401bcd3c53024183a008e200109bb4514300097011a187adae5bbd08c108c0200ea0a0740500006c90731103700800064c8390cc1c4460e01306f05f046d5daa21c085fea4b000019120f0022c2f8fc85428811b6511af47047a47d8e000011901080401b81400019a41b48400030441b0c60d66306a3103494c1a0760ce030660183280c19007e127df98a14144081099804e56198804c4070011214036ea09cd1433b4cc4d4024fb05cae300200084050073b620d0b92e659b1412c57f7263001e0080000501a20013d5dfcc0601c8c2d8a007ad1f7f89028f0f7dc24002000803180800039883104e844a1dbe244fae4e1141d4c05d10159606ba000c002018407014005d14e960cf5228ee281773ca72d3001f004716cfd67408c173e83b1e88157a3872c6003c01000009f20002b84180140004a2400138cf0268172fc12093bb927658171da57500118a0f00400002a482c0cc15c460ac0380800802017c360a21bc0102dcadf20088791cd40024303c0080000803612084b4965810d8c5de800110e0f004000020c82f0c800066882e94e423d45cc2a2c30d4f6e9e4073949e7d43082589882860b628c06d25041f00802e02e62aa227ad8244e3d122f098066a3649c8c107c021419c45defc34558bf50c4a16136cde618530c46488611d0c5faf94007802141a00f02161a293a91db4285747311743080318c71520015e9c96ca003e0100000f920004104000b2082d86e423a24113a2c30be4dec640764b161008c107c02121258e9cfe961a7a8a353203120556006823fff78a500013e3cb512820f80400003ec82d008164040003ca601196ca7124827385e878c0e9b91dba102c7e1f0d16010f770c8004a283c0100000fe20b02b0570d82b00f882229f9d2100010aaa5e0016485e52e4c10800100aa0b815f1edc7d101c8eb63c62001e00802a00f8c2afc1108714a2c48af8a178cd4ca8501d65ac2ee7021e8d76da5001f0085083994d455184032a9a930a1432373de910008adb546780063c6b46940084020000204400085080015c90530d82906c14427020a3afa608e0a9d8af8c9800ee8964f100158311a4000455b6edd0004a30400100001093a287614b031c56fc959c63873ffadc30b0156b0427000120e0f804000036c8280a80017f082186800363082798e89011442cd881b0ceaf894e064cffab1040201b80c3c10040e9c04182005283e64000026202100802700e07a72502411857d51d54914307c852330c12f058eca900080021e3aa32a1b0103c3d2c6461018d2e548a0a1c57d5969860d768df141800f61546dcc0040010000129209a0b81db0c4cc6c7160a4d369050d533935f84055ea46394901080021e3816d8855c81d0173a9d44066f7129d814322161a5b880e2a020048f00109eda706002fe36de52704210080000af100024c20981b04b0982502f0a2d4fbd1710303bb59380c0a6827f98830519a97cb438115dabf6a00094608402000021a7040954f8868a25350ab63860c682c312e5004be8605f000241c21008000071904911000385902b1101e8680b8040011726061c3344ddda7288b7e3f6cb632377e08c71fcdf46e5910512e6bce3c313539dafac3a4a6f6baee3bfb2ac5a40c01c5d2da7f2dee13680993502eede4dbffb654d4b59199e26c898b0d17ba268f75acc09f549be1763aa247c2887000f4b432319451e6bf1931b73b64846eec1baa32c188c96f3af062a03525a94382e047af2878141796b349d180000001190d9c3b3ace87f278ee56cec275388d83613e2709a2f4096d77749eb19a07c946d324a2396fbba6b4aed9dac8935151014b7be760fd9fca9790d8f9343702575fad87eca536b34e9962b4e7037c035c323eabe19cb027e0001c708159ab03ec6ffdfc386871b8a949018d28808800011920f80434)) <<< 16000) + 0x4a1a5c9ed20437069a553c0510dfaf530044d43e3c010241c20008481ed7abcf8b007ecffe39000f0022000020080000223019e41de48800e8020120040000b8411c2608c0b04501c8405e0c259c02db5fb8e381880e3a000118a0f00400002a48220c8000904821868000d408158cf03f12ae5893804be1c2e9100aa98795101008c808002120b854134e1c089a0fcdf4804032e35f1800f8043c5e4836344006401000008a7c60085e6b830a7b96b974804aae4528b0001a641a9000780210000100400001110001063c18ab4fbde1016a6566c11020f0040108140001184104360801303f01e069ddcc911436887ab1940560082d80023181d008000054103e1d0001f1103d0d01700800137081e18c0ecc607453810884a08c6682155b04fd2013c86625086044b2f1524000024282100868242814b5c1418e6aa8678002044504201000008f2072220380d01b8080d8040003ce4002db081a9c80d0b406632032150019111031550180880bc34006f0a64603c7fafac80cd1dd57380c336b0f224090522addf1b1c10ba3aea686023ebfa2b01404278ddc940114459cd08802104eae406cd4f9c4d72e3573df0b21ac6aa6c72fb8b044e10e687449b3cbd0e9b962b2d88a865c7f336221f2508dee0918dffe212022995c4984408fc74b16f4914b4b4794b30b99777537e5fec722a7cb4650f6b136fe1ac386dfac115793fbe70d0b7842edcee71c036455c0d3ba67f47b1510427b1fc0674781c87b6e0c2bd1be508c14f17a3f6775d9e913a090ffc883d03e25de065a582667fc00017406aaeafb4a782b599b4cbeb74502bcaaec109b89b50911913eaf014e1c845ce59188bd2ff7ada7f9ed7d4253fd6316855840a7031c5a1a4b5f9cf74454c5517055ab0582c9f5acda1bd18c5f46b8cc6f34777234e0f6af9e6699f9790a5281304994ca2ea209211b628a00336104000012281a00400003f90300101780800237c8171cc0b4b40584202b1d0150c80a454050220270d013048094140480a023050005b990060b8200e0b2798736f4e83bd585fa5601172d30b43b33a06a3bf1e2398b80000000000000000000000000000000000000000000000000000c8228630430228220218080008bb4cc6ce8c6c8c55baa40c5c1c9af201a1ad112564d336734b6f2671934e6fde528f6aa70f32ae193346643e1b3a0c74f34c98ea6bebe5a506024e341272742b68e7ce161fe28ce1b1550d03baa0ab3ec489422949638eb32ee12175d31ff860b2aab40a78508000004b0010596c33cd685013eef2e45440000000258030077119cbe500510673024008715ac51d2d88e1f2b6d3f9d08202d339118182000005dc08002af5ca868c007cbd82531400000012c080205c908c0110449ff0ccc5c206039d8b92764084ce5700584408000000960120019120c3931c000751762f630000000025810052720270085a1e7e923c40be9e01ee502ac443ac983bac59d09ad8e0a91e79c71c61e51c504114002060000401b182a60ba4fc2d645826722000000000f09c61e51a50a29220a19e09c060000401a0002106d0f3f491e205f4f00f728156221d64c1dd62ce84d6c70548f3ce38f28e28208c04a002030000200de312a0927b49593ca0ded4147c35cd2800000249f0024507c3b9199aacf11b952e65f966244048bc8273910c0437b502d51d7380d45503f0ca0be84001701600007e88001ab9c443ac983bac59d09ad8e0a89c71a69c49a49608209200a004064000401bab584ab9ae5106b800000016134b3893093832033822c1340c0000803400039c811008000818c67fe7481876ee4aaad4e6cbe3cdbcd93bdf717add863991e0000000000000000000000000000000000000000000000000189888759307758b3a135b1c15234d30c30a3483082812001c0c000080370a619c927333480e77fa8402c80000009601c307a9b7e9f34271e8529311c205ef2850e281073bfcf70300d93193519a000900200003424084040400200045b319ff9d2061dbb92aab539b2f8f36f364ef7dc5eb7618e64780000000000000000000000000000000000000000000000000626221d64c1dd62ce84d6c70548c30b2cb24c1cb1c9047006030000200dd1b868ad9a1c905ef082800000006c4b24c1cb1c608208904b00a030000200d0000fc203e0201e0100e808000f2c80e04c06c1765d5ec4efab5cc59200053d21c95983800092f7aa6e58e41ad88e86938a100000e3e2628082077849e22820e000002766d66030000000697e086440017010346e1a2b66872417bc20a00000001b12c93072c72421810412c0280c000080340003f080d00f0cd6ce62f8473f1850001a78dfada4d200005bdaca85c6105218d954d3d4182000035690f170410224838621e5080000018a045fd23800000083dd8a4fa100062058c2994eb6d1d8344a4d2034362846682bcca0c11676203669944208d1d530bf431d2870422c4722b76d20cc034bf32552fb04d4b000000023c346003d0900e00700a80002103866dfdaf94e434a0001783c946140005de4934c20a82452e3d0410238e6ac6418100011f49324000000c9bc98700000010e0f50004e0109a7de06636523e4b1319dc00000000744c28d20d1ca0cc04304c00b030000200d00010420005b04001cc080c8480602402e0a016010005611001b5b2003a1840540402802001ecb20260a00208320246a0113100816803ca401c4a00d210060e802c640142a0091100406801c2400c020050100134390041d0018e80084400202000010078b51)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 38 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase15" = "QuadFullSixteenCase15" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 38 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase15 private def zz2346:"s092a"="s092a":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase16 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l15 l2 l22 l27 l29 l30 l33 l35 l37 l5 l51 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l2, ![-0x59682eb50, -0x2c01cf7f20,0x14cecae1b8, -0x663a207fe], ![0x53b8290e8,0x14cecae1b8, -0x2f3ad7e005,0x94fa91a9e], ![0x4b0, -0x663a207fe,0x94fa91a9e, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x1329931a7,l5),(0x225a33cf5,l8),(0x64101d18,l10),(-0x12397b0ba,l15),(0x490d0625,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(0xda8aaa96,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x225a33cf5,l8),(0xda8aaa96,l30),(-0x1329931a7,l5),(0x64101d18,l10),(-0x12397b0ba,l15),(0x490d0625,l22)] def dynamicTables : DynamicPackedCheck.Tables := ⟨60, #[0x2102c80200000002201c80200000110f014c0200000000f01480200250982402d0030000000780248030000000d802480300000190901cc0200001a044038c0300001b024030c03000000009018802000000005018802002a12064055003002b1307007500305c12431032900400000001601480200000002d02c802000001d1901cc02000001d1a018c028408608c074900500000291901cc0200000002b018802000000a0603cc02000000f07028c0206214c4201e900400000001f018802003314884079003000000023018802000001e11018c0200000001b01880205c0a01c017500400000009802480300000000e014802000000070024803000000012014802], #[![35, 164, -183, 0],![1, 82, -123, 0]]⟩ def dynamicCode : Nat := 0x103790f70da08c296b06be530e25e48813b60c21acb3b26d0e18104684268e10e92e7d818c100352f9a0000000001b9450004801081a93f7ad9734185140444b0d0c9100442024c2c1841404445c70c70c5cf63ce7971c239d33f09f5c900266b787bf81c08357d9135da44001500e000075881102c08417c5b5d62d9e4dc20408414b0b9052032702d911dd91834d4caa8dbc214322a33b467e414103a7a6040d40801b53ef989fc00005583de48a40269018580480001ed3864bff00524386888cdced840d3695cd9c8e14bc4041e51020f1360efe3025f5d3fc9820443b91320024e204601000017136c70b6a4463f5a9b6d8e16d470000000002211431031811010c11801401000070280200d00012120402201f0900f028074050300eb21220e385d04c564a68c12a6227ea4e28448d02ed5e88086c29365764002dc5de5210a00d543ddf2ed1c109805002602e3062b39dfb508109c65ae02d03892013a31a44103447be8c1300e16104d2640242098657460368383e5a91b10e31411931418ee40601f598c56ec3f2400a4081c62fa2026c0488d6913621081198bf107088185d0285d81c258157d82450207dfc28847063b772164ce00460100001693851842031421010c1140040000c80008036f60e27213d4347b05446145144109046043046003030000200d0000ce0009444293af895cf3a082107c8f14eefec850ca04f6adbaa1a818716b8eb20894a02c201bbc494bb8d10a10d8e145623f66440409bc6bf5a9518300002e0760048f10000004c2e05d5d77b6009003504c00013d000c91900f5490f0c304192a7722445c277e6464091a0551b3c60834c077474a004601000010c2000a9040023a8e0c86088301860468410b2a05047f889a5887000000012c06036751be3a05000000012c06c104800801c010000ac101b1180d08c064360301b0170dc003de8837d140a5ac4f4004018aeda2a808c308402002c130150580a00c04c0522265c297ea243a129884a418019badc2d630023008488bcf9afb2090e53391d22981017e734b10c2012db4b5c48036261580e50023008000086101205c06ada12d7a480a7326ef118408753a81b7140152ff70ec120411804000038480704c0341701b6ed4c26d2029369a4974402258765e3c8000cae306812021180400440602003b1c183c9efc0e380b30b43e2860aeda7d5e5093281ae2306081c4dfb6b940293746ce826042300869417857070871c814e78541430c0cf5f3f2849a664344c3002d6fd4b6494108c02000021c643b0e01effa28212fb3199cc00d69b8f3f8a001e179e4d190208c0200001c24000d8880784800126ce196886f5a0b0003f19e7a3812c229c7f08c208402100801004000011100e0980682f0d06e098c51410d3bebe404012f6f990400028516226225050840100001ba40008248004f51c20104c3816c404000000640380000000c80180d7cae859a88848304a01000c0100580800046880061e10018d13236cd9976581450d2f63cac4882d8a97f7471052788c860e100c3eb9c1101017bcd1d23000cbf8ea60400abefe034d00046010920f0dba0d51228493899b82445ba119e9a388000001c20404000012ba860800000e11240a5960fc3d700230040000b498178733e3048c280000032020475df1a7a6406a762aba74604000006400208000012c22400000012c0401f655db1d6800230080050080006b8c100a21289b80e274123b38c038640f1244c39010f27e11aa83843788f814e8a10000003840282000002a300600f27e0e268990104c0200001b7201203c1f4123a57c030456725b5a50e097eb0cec8e302188de601408080000038401005fac35743a00000546041192d70a63630813008000068880100b860983de78450882ee7d9e0612153ebb3d1010d1667f3e2810f41d5838401d55da7070601105be2ce5127142300871b922c813c816804aefe45148546fe707052b2981307026db71c825002000848c3399811d1c610f57b3c0c3124b06d60815a0c9b22238200004b5d180f15a1c908a02e55b0cba700210080000ae18165a2290701451c22fe9a07112d11b3a7104ab6842fe0a00000014f71409efd4e1584027bf49a2c9c008802001002000178322a0be0aec240be9e8688f8a20ecda1b502082f2aed2c0c19634689de300c47436fd080224f7401000120f36bb22501044010000195200e038105778b5b988192195d5a30c31568196782846c981cb5c5011500de6786012ebd335d08004ca21138001d78fa82d946810230080000d09000787200122a60615300c4ef20536e47268c2440000004b0204c4a4633f91c40000004b0140044da96ceb0012002208f24e18519840c0786eaa6d09100000004b01021958d3481c1c400000012c040029656d225e600270080000a99e3fc05686f1f438a234810eba51018000000bb8038664dcb4cd6b0c18000000bb804000000008ca00e012a1ad8bfbf47002a0140030080006c8e13a32eab9d691c23d739f8bb0860a85d7047701142000000c7380304911d7c03dd0415b1be5bb93c400f5ce7b11e20c20a8bdeca0e11246a236aa7082a0200000fc100501d0f2bc0df5850410000001f401810758fb6b4a2837d98472f904040000023280a05ea23196530c00758fadeaa0008d172499650eb1f81eb50fc081380800007a480200800c040011a24008440020200001000d7d1 theorem certificate_valid : DynamicPackedCheck.check dynamicTables 15 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase16" = "QuadFullSixteenCase16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 15 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase16 private def zz2347:"s092b"="s092b":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l13 l14 l15 l16 l22 l27 l29 l30 l31 l33 l35 l37 l44 l5 l51 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2cb41a1f4, -0x59682eb50,0x861c42090,0xea0], ![-0x59682eb50, -0x32890a1c50,0x1563b982e4, -0x5b3d98968], ![0x861c42090,0x1563b982e4, -0x2f3ad7e005,0x94fa91a9e], ![0xea0, -0x5b3d98968,0x94fa91a9e, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x1329931a7,l5),(0x225a33cf5,l8),(0x64101d18,l10),(0x36c913b5c,l14),(0x1d434b77a,l13),(3,l16),(-0x20862f5a6,l15),(0x220999af7,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x1f9fc19b,l31),(0x66486114,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x6d8,l44),(0x2cb417800,l51),(0x56c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x36c913b5c,l14),(0x225a33cf5,l8),(0x220999af7,l22),(0x1d434b77a,l13),(-0x1329931a7,l5),(-0x20862f5a6,l15),(0x66486114,l30),(0x64101d18,l10),(-0x1f9fc19b,l31),(0x56c,l64),(-0x6d8,l44),(3,l16)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x144370b00484010000002a0c402cc030000000a464073008000000002b0188020000007231034300c000001c8c4050c03000007319c06830120c14110101e910060000006229036300c08408608c0749005000002105003c30100000008828030c03000000024140a3008000002e0e402cc030000000b474073008000000002f0188020000688ab008e30140001ae2940638c0500000651480973010000001a8a805cc03000006f17406e30100001422040648c05000006d14408e301000001a4550338c04000000028180f30080000000f07028c02000000006870330040000000002c0c801000000084180e3008000000002503880200000000094062008000000000540c801000000000c80720080000000000c0c8010000000008c062008000000002a01c80200000540840bd3010000000000240c8010000000000f0320040000010828094c0302884506200f14014000001c86409cc03000000068140e3008000000000340c801000000000050320040000002506038c02000000000a40e2008000000902c030c03000000000a40620080000000005c0c8010000000000703200400000000270188020010c28044053401000000c4110230c04000000000840620080000001f0d014c020000000007c062008000001884409cc0300134230480324010005c0a01c01750040000000026009200c000000000e014802000000001c009200c0000000012014802,0x840e2008000000110f014c0200000480440163010000000000f014802000004e0440163010000250982402d003000000001e009200c000000252101cc02001845b13006c401000001945701b0c0400144480e4039401000001504500e4c040000000746407300800001143701b0c040000000009807200800000d02500e4c04000000000640b200800000000b00248030000000036009200c00001a8210058c04000000068240630080000000009018802000000681100e300c000001b024030c030000000642407300800000000050188020398408710246401400000001e140cc01000005510809730100001021840648c05000005d10408e30100054134370129004023c3182501b240140ac12618406290050000a84819015400c0002b1307007500300170490c40ca40100000000016014802], #[]⟩ def dynamicCode : Nat := (((((((0x40d2e97d64ab185111d317118e236071612d86106c44bdd2e3861e5d09cb41820bccbcef18130612804206e161d01ead06144c5dc75acf2440110807e8306104c5dc1510f1c30b53c3f47cc7092d27ee1f93182000001b72c0900266b7920381c07d29ccbee3809121854038000212203a230650980482f8bd9dae4ae28081083ab130aff0a200df951ff5d2030c920ce33e0306a8284731d2850cacf233f97b8a0800000ede28080297d64611740002e34bbb77569c81c2b02000010b9e19d5a50b9710363b63194038525db4102c508ffbd3c9708103a205acf0810471437a60089310118040000528d0ebeab3abfa8040c88fce022708604aa2c908eb7440465e3536d2e430462251cef48060062251e634e05012ba72d860004009d7277fa8f81000059232137618f4121601200008948320c818c360c4120610983002817c05030dbdcf613808140c15318e6038842dd1a69711c2e8f942af778c17fec6f26d00508000018cfc0402060a98d81014100000230f40a00000040d0a110d89142902002000b8c80c2616e1d2448df3e84320902562adeca138a0c4e559d896020628defbac891c2da7fb95402940877e704f0a870769ff079f7a18012becb783a4b490829020618e9fbb26e41a4ae2de82a251438c48840820638450238220019080100680007810350181a00e893868cd2da89181e06320a61c655fc789b009147d77fb443145c76adeea287107299df3ab18112eac806244041dcca4db01800b779a646712004c02805e01e125b0b31b928f28915c21f83be1983c0559a023168b1dc1fe4d28b0668c14fc1efad891c60987436ef7516086b8ffba065c900004597aaa8a7d08042d02c0000fa18b65a0b0187735939b9dcd6549021b93a1d00fe7ae79d2be2e990d73309407c8c30b2071cb18a1881040460030100200d000184382834d4705c7438a0aa1dfd5828c2a569b1173aa408595b981bd00825218e675b706060d2f6b0e440e1811ed1e21703064eca58d3c00a00314b6c0a99209002a0245915dcbf88e0e383e7cb86858d93c1092894369cb89b4460a05032c508c29021548784000089b1ac0c00552233ef40011004000064482e82c170060007c87885545e23ea230a20cbbaeba1a8a38654d92b74d45061c3d76f60894030402b9a93bf860a10c24b38b918a302314fd4a7bea0800052857d1b94100015915c707d61048017018287f437af4e3c1c61803d455b8c3a2455cb5be565e2c71001025f4bdf9144012f07246e7830e07ad9628f0018118b34f044808b00000001160801c00015865d244c50001940e598caba0a002e030000137905b0582d00c028040009fa4003b0080090b98200000112c8048a288283cdd9244861c385e00101b1cfa5ea37c70c7724cacfc020644f9e8a6210c3002c42f629120a4eafc34a1c4000000057c0184801480c0164076400000049b0287e675c38d2a50b5e2987b0aca11f0bded8d812255484a19e024147c12df64050070859a08007000000008880601c6d6daff0312084e0280001f132346760b378741c6000000bf37028a3556dbaa28090ef9e1885982901e34466779161c21c87e1fb69e3835401d0139fc1047f0645816c0c0031387a8d9019348415812000086cf1c000011b5e408149e569d7a724810cdd3e89ce4480e711447de0e870913d7735df58608aac8860d1d0308859d56905d8300000005a7e0010047dfdf5a4eb192005804801c01d1019919ba6bd048efb81353ed2048cf8550a6f03e28a0000008d3c0489abc3774e2e24072dbb8c63ce02823abad7a5bd030000000077ac01006493d7a3c604512085805000022320b0030004873c61046a00d7518600000393f02052b5fc0747a1c410559f30202038ed973c39e1c25f7b8eeb8b04168b5ab2fe208000000124800402540bc7cc0a4801400a015c0702e052dca02072430000001ba2038687423f47cb480b6abc85249b0e10000011202010104b6a59c8c60830f1cefc893080137eb055c170a0000000176a0362410ac0800004304158060aa0200046920a802053010007d49052218288cc1405609e2b04e1582688c130472281d40a04206303fb1b120c9e1266c382679ca41880bafc2530600cbb2c0ecc003c010b24aa942cc48a00264f81032b02028920f24f780870501d66d0203734f14b98007402000022e412c1722000015ce8e200000159080800000a90209a84fc1a180011aa4e20405184f43a130210004244ad7) <<< 16000) + 0xe4824ec09020780200001608000cf104a09f14c9d272450ddbd6f9ec1f2f7f2726d932f1d580a741e00000000000000000f84a1871870c908704204400000c74e31b819e40960856f09c4b21a1888e85e7417bc75a4c75548f61433b44bae85dafe042547ba00053c78400000d830a10000000441020000068c820d1d698fd850005a23c141504220047080000184b8a10000001c1141005509df810200000704410630f493b21000090ba55f1000249ffd284e084601000016b20920b0480102380c000b308230cc114660882b0430d82106c1041608002a1803a70ecf942d72941a90284b25bebce820601d5d4de0d040576d72808002259d316098208c02143042a47f592857de37bfd650987f3cdb60d0c00f96a199a081d7d82de094208c02000022070a03075ed6e50b6196b4c80a12c3ecc2380e0806d178d0180004829edc20006a0a326c98108c021850b72093ec2859bc002c1250968680de6c8c108c02000016040fc2600043a78a64e9392286edeb7cf60f97bf93936c9978eac053a0f000000000000000007cbfb1947c726112615c1ee0a91441019010e08408a0000077b77160ee9a50a2b3ce964a5db61e0f9b40c4049f8a97d44b0e2c8d3a789d7c9a42de3efd7765cf66ffdd5c2e217851500033e207c2b0140d81e82c0f017020376795f12038b7367db04057ed8b6cf85040cbf5f11020c68d1d7320000b49c0d74013081180400ec160740303901d0c26e6b70b0a1546aa9e9b94265b923fd61c300c8a9494186f037d9e3070827bb0e8a0413e6f2cb620270c23008509c1e61ea1c1042c7ae4b80c0147716dd80230c2300800005a103811d535f1953b802db311af6294c299583a9729b9072e3420b3e957469a80000000000000003a269f3c24826ff02c7ad050557f6328f8e4c224c2b83dc150c31d3f764dc83495c5bd055491490cc00500030865f2fa2762bf97c14fa7cef86274d71e9aa289954010a4765c1e58f5d18d4227c12fd98c0027304e0b1823dec04c66c3bd4f594827da441d3455e45268b1c731f7b50546cfba00096c40dc24000e7440d8440011d840d42606803c342f1002741840481b058c58214da4c6dce000e36c284812061180438115e5d72cb07bd98090181a24e5bbc08c307802000014a708b916c7a7041d2d4f8231c009ca57b70200284b7c44120410804240200401000004a40cc1600025a708087f5b856490063c53790908037356200c00a7aeb1bf00080fa2352c004a28460100001162064330191181884c0c027a29f75ab0c8ed0b4b62c02a891d2400983a0326b8dca2d5c1d7c5978902c5c40a21d01c000000000000000020366235ec5298532b0752e53720e5c684167d2ae8d350000000000000000744d3e784904dfe058f5a0a0aa10216108006000000056e74347aa3b34988d7f9e79ade281ec9bb047d4133c8fb8f3fa3cf3f101b856d5138c5c62e7c086b66beb21500e7f08d6bb2c61a94f68f72f2cd66ccc3018b8a01a12bdcc40872ff2e0c9d0ad103f9839f5f294ab26d40016dcd0600000c5ac30ecb413061020d1d69a4c82c002d118a9640000001225c25082300840200401000004440bc3605c0b02d0581600c0ac06054020290181400c0007d48006289001dec3123a48013074064d71b945ab83af8b2f12058b881443a0380000000000000000400ed96f99b803cc1800000054861070c40c60050010010150da1f7c8418c5c34dcc9612a9b47203ef854a86837070d9c8946586a4783646ec8fb52a3fe34d58407ba12635a3b1861949409c0404c0200037d2005808401432cc0e06e96e7c24600001578102f752e4fe47100000b070308000000961830000181b0e12dca7318050b01017ba4280dd94252b0a42084020044030250181080c090054502b5b5a6021420043da5d8e0710185213aa9c20603c92056d51411efe80757810005657c113f4602757b6a448c080936868b34900c88102902000980e0500be6ada669a4885fc4deed3818710fee1e1664200a200cb8f019cb9182056696abaabc205c9877ac4100450003a02e34d0c060006995192bb0009c410205e078a25ac5e11a0c50e397ae8651246000008db41030000018660910db24559c428800000c0d8102000004aaf14068df3635f460000000abc000000006df892204a018000208200086240018dc8118ec07427021546180b5d7c91450c3dbf31502722d4404db0821b2cb946f14139243317be99a8080e4685458d56f0d83020e8845c56c37460008fd1f976af74a60004e89e0facf357d94d6434872324852872365b921c8320000a7cc080001239c184000018660608000004b02043624628e0820bf6fb021800000160e0a04539e8bdc09c3084020044030100181080e05080bcf62507b94206ab42fb37b63908ab20b58a25b25b88ae3e45c6cfef8adfb37fd40e721a526a288021964e502a154589ee2d8b09bb721e318b5998152e8bd3896e9634516edcdef60e12240a79f12ccfb1bafb1ff79a671ca6ed1692ceea6dedab1279c50ac0115714537029444ff1435fef259b0639f7c2f6780c9bed4ac398646d6490341e92bc5f670e9a2fc2552162801e6101b6a86f535fb523e50d338e209424d85100057d8e1b669f647112860061c2e8cb5cbe720010300023bc6fcce3192e948040014d538cced2e466c501eb49228288647e539c18000005b8463891c95ae02000b945b1cd747ea9f000002138b9409a5cc83521d07659a960708490c400017810200d80680fb65be66e00f30600000015130c30a308288303)) <<< 16000) + 0x2812802400c0c800080364fc6c5b1f34f829e501baa67d92308440000000000000000000000000000000002109861851841441819409a002060000401a00032a407c07db2df3370079830000000a89a69a49a21a116112114010008064000401ba6d4ffa4d1f928d24001a1ffb5e26885d2402cbdfe34200022cb178816100000004718090800000013880104000000042aa38000000027100644001681000007bce9b0fd43068781a48004573cb9c6884a754478a51c08000002472068200115a288710000000014fae38000000036ae0200000000942f48002a01469bb2edd38a41a48006f984266887721f9fc91c080000014d0682001be129196080000009604820000002581c000000025814001300400006c48001d010006b13012516992594082e527788c089842b3e120206f24ff0e00dc50dc7860403ce1db4c0040010c215d1a87b6c8a206e919abf3c714cbbdf1b0e451476d355abf0d0c0000198cc0c0facd5558530808f0992e565870424db2b477460400000ec04264801400e00007e880f80e439385eb92484099368ac705dc2446e1403aeb7b4620041dd8d64201c8f51aae6001f008692ed4207f8632062f398194588c31196deac450e1000002268c06895b92b89fc42c40000040dd0121a56ef7b409c9083748d24b3640252ed3dd8c1b49002902000010218180001bb4121c147858e0c1828e61fc50110ae04a8800a8c949f88077e918cd0402a323fbf3800f804349865ed5158f2061f7bac63531861773d1f5bc384000005bc2034473db96152c2c400000119402431f7baeb4c3341a5da77aef2f2000a006000038a4000cb880034590009f9203c0a0013a6200385a40741741ae5131fb0306217c4b9c861ec432511040204b4191b8e01026268fe280093105884c0044010b1c00000ac2050d42ecff1a72063bacdb8a0141833397137060df1b72211c187e7468e4f81423444be3cd8a089f2234760404000012a2192004a0200001dc203803b11cd87ab6d1c40a61638044134c4438201c2001cbefc450419020cd32001e08218146001405232b9c0088021248000019f2030800000021c058f2dde9c82f4b1101e8f8b860e2223a7d6f9a104b6ba731ef0306269e8c79e47083bacdf0860c09660d34ec4924009c0600003e06c48143601d07102d2d8e2b104de0362cf060c00001c3010203c3c4b848008a15e04518000000258270022008492000001c2018400000078c058f18d03a127962157e1582c8388337e0fa1b0823ce8d1411030619bf06fc98e100000012c0583660d34ec464801300800007948001b190006ec3030dfc8822af8914ab90f7d43c40837f235d97e1840000006270100d2b5c23c74060501596dc3fa20280acb91a4d24002352840fd80000019bb0aa4041480e006c240004204068140320a0180500b80800331c80b04800abd480100b86c8b3f62c120e1c1833dfd9b76a23f4c0810ac92b0641874e03085764bb250e6cbe2034e81adbbf9b970140b47fed893268500806da3c34328839603014e66d4034c3902002a422306acb58c24031481420b0e41818517713b088e2045b6f84470901ab801a3055530f6e6180a0290c7904a10420100110180a80c03c0602802b1c3093045d1c62d012ac9c814ec6949a20820443ae2f08039e7bf8b004009cf45b68026102200800980e4621018ccc8910f5d2a14d2c21cfd33dfc7087c33aa17102b15adfba020a5f271aa000984088021c71efcf5288c141e165ce3244c24fa0f5430c299b4c8a3006c9b245c0700ea6d407910006fa6167c12710220080000b510002c2200085e40487601813d54583618928206e03b1e097faee996227741209228c18c08a092010006002000024f729d6b9f52376c5c3fbaeb91b3099a3f2db02fdc0a4123388f4000778d0c0c8ce777922027e31a7a209edb977f80e007c118bc830074058b9984a10440100110180800c03c070040100471c0642509180337dc7021a06b86021360401005bddb09410600200001ac40382601a03ed96f99b803cc180000005449f8d8b63e69f053ca03754cfb24610880000000000000000000000000000000004222461862852051452c028018000c080080340007e88001a9100c05dfd8ca3e39308930ae0f7054471061051060c30c800600400000115c8e0080340003f48058c802824000c1c40037bc80085b9aaec59fb259270b4eba7e8da7ee6e9375d33d5630dd640000000000000000000000000000000000000000000002d08c10610c08a08808600009f82af05e9c3b7b8d73d1c3ab7b3198f84bafb8cd28b90be7f7ef1af410e74af2886deab09d7a2b87366667dd5c74506e2c309571a978c42e358787e38ef23c6a6c31b71c479170d757b1ae7212e4c49b25d5e3ff8310ca6838a24f79b1d90e1b9d03b5adc306000000f180c0028b996f3e280000000534080015772c6e6013881300400240704646e41e0ba1030000dee341922000000053410210c2a9a54e8e200000004b001286140042089fbb86f2ee4206000116e53fa2440000000681020414f353c57461c400000005dc024000000029cbb2000950d397c02028e18580280001b220101a00030d200e0bc347f9479b531902028a01c400000004fc72aeca046308104d00b63d0b29d67fc70800000019894b7872228c10e3dd0e5e4962e33f211420000000a3e511bc42c0300334bd13c1ef8d92fa8400029b3f14a4f5ff4589f317b6bb48271c4b09400017e90060900040290052100200800c040019764008940020200001002a281)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadFullSixteenCase17" = "QuadFullSixteenCase17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadFullSixteenCase17 private def zz2348:"s092c"="s092c":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase18 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ private def zz1271:"s04f7"="s04f7":=by decide+kernel theorem v0:V s0:=(K 1 nt 0x1004431920330) theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullSixteenCase18 private def zz2349:"s092d"="s092d":=by decide+kernel end section namespace Green24Proof.QuadFullSixteenCase19 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l19 l48 l49 l50) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l19,l48,l49,l50] noncomputable def hinges:Hinges:=[] def normalizationDenominator:ℤ:=0x1312d00 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat def s0:State:=initial constraintsNat base hinges open BranchWitnessAtoms def nt:IndexedNatTreeCheck.Table:=⟨1, #[]⟩ theorem v0:V s0:=(K 1 nt 0x1004431920330) private def zz1272:"s04f8"="s04f8":=by decide+kernel theorem certificate_valid:∃ p,check p constraintsNat base hinges = true:=root v0 theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by obtain ⟨p,hp⟩:=certificate_valid exact ScalarRowDefaults.nonnegative p base hinges normalizationDenominator hp (by decide +kernel) x hx end end Green24Proof.QuadFullSixteenCase19 private def zz2350:"s092e"="s092e":=by decide+kernel end section namespace Green24Proof.FullSixteenRows open FullPhaseRows (Phase) open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x107e20001eeb5ca8007b3abb9ea1fe20001eeb5ca8006d18cefb614e200779ae58007a4dbf3c205e2001de6d9a063e7f4da62003bcdb2c0028bcdbabe07a20003dceb94800d87878bde1fa20003dceb948007fbc8c58615a20009c4da8027f8abae22005faf8480039dfecfee07d20001eeb5ca8008f9e1b8921fd20009c4da8018b1baba1ed2005faf848003dfc6fa8a14d20017ebe180018fef80ea52002fd7c28003d1b1d4fe120003dceb942ad7c09207c20003dceb948037c7f686ae1ec2001de6d9a008cca9ea42003bcdb2c003e580bb9e07820003dceb948036fa9aeae6020001eeb5ca800ede96b7ba14] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x12a0001eeb5ca800cbdb3d7f6760004e2ad8002360004e2ad800202e60003dceb948003ed83dac615e60003dceb94800a8b988dea01e600779ae58006f7cda3966600779ae58004f9cce9ba1ea6005faf8480728b8f9a01a600779ae58009d4ecd0aa260003dceb94801ba489c0e6560004e2ad8002160004e2ad800207f20001eeb5ca8004d8b0abd21ff20003dceb948022ad8cf9f601f20003dceb94801cdf9794fa720001eeb5ca800df8ccf7ba07b20003dceb948002beedae8e06b20003dceb948037adb1be14b2000ef3acd002d4eaae32002fd7c28004a2859fa214] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x106d30001eeb5ca800192530003dceb948001de130004e2ad800207c3002fd7c2802e97bd8e17c3001de6d9a018e291d61ec30001eeb5ca8003cd91d786430017ebe1801f8e89be07830003dceb94800586d9b4ba1f830001eeb5ca8008fc9e82030001eeb5ca8001e693e4967e0004e2ad80023e0004e2ad800207fa0003dceb94801bb2a2bbae1ffa005faf848001f9daede67a0003dceb94803984fbd6a63a0001eeb5ca801bdf98fafa07ea003bcdb2c00480a68aba1fea0003dceb948014e7cca69e6a0001eeb5ca800fababb0d607aa003bcdb2c0049683c88214] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1570004e2ad8002170004e2ad8002730004e2ad800216b300779ae58034fdd3c61cb3005faf84800c8d8afa05b3003bcdb2c001b8d6ba33000ef3acd00aed8603e30002fdbc9001c1a6921fe30001eeb5ca8010b9d0ea06e300779ae58001ebc08e1de3005faf848019efbdc614e30003dceb948003fbd78e9201e30001eeb5ca8016bebfaa630003dceb94805e07a30001eeb5ca8011d589e216a30001eeb5ca8071ee9cbe02a30003dceb9480019d8dfbb614a3005faf848026efb2d2230007b9d6a80203d30003dceb948005b614] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11dc00003dceb948002a6b8cff61cc00017ebe18004a691e205c0000ef3acd01db1f6400002b196c0027f0004e2ad80023f0004e2ad800203fb0001eeb5ca800206fb0003dceb9480027b0004e2ad800216bb003bcdb2c05fe4a0e23b0004e2ad80026b0004e2ad80021fab005faf84803bd8cede2b0003dceb9480019fc28ede770004e2ad8002370004e2ad800216e700779ae58009fe05e7005faf8480048267001de6d9a042270004e2ad800214] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x103f000779ae58001c8908ec617f00003dceb948016f3b3a6ce1cf0005faf848002c784f3d270005faf84805980bba603e00001eeb5ca8001ddd5f0de1fe00003dceb94800492c68c961ee00001eeb5ca8054b6cfd602e0001389b48016a5e7861de00001eeb5ca800182b9d8ae14e00003dceb94802bc5a29e05e00003dceb948007d7c5e6600002b196c00203d00003dceb948007d08fa49a17d000779ae58005b4dfacee1dd0005faf848001f6eddede50001de6d9a002fe9fb203c00003dceb948004848c8dde1fc000779ae58002a2a7adf61ec0002fd7c28003b2e78e02c00001eeb5ca800495b6d0f214] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x117f80003dceb948005c29b99ca14f80003dceb948003f8cebffa780002b196c00207e80003dceb948035ac9217e80003dceb94807ed59e16e80003dceb94803ad896aa06e80007b9d6a80393bd8615e80001eeb5ca800183b7e0fa1ce80001eeb5ca8042ffde8601e80003dceb94800dccfde2680002b196c00203d80001eeb5ca80099fbca89a16d80003dceb948006dce5a29202d80003dceb948002c8d893b6580002b196c002480002b196c002740002b196c002640002b196c002540002b196c002440002b196c00214] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1210002b196c00203c1005faf848002dd89b78217c1001389b48038cbd1aa02c10001eeb5ca800ebdefead61dc1001389b48005c8d9a605c10003dceb948009e8acb0e641002fd7c280260381003bcdb2c001e4bfbec617810003dceb948008fc9e821681003bcdb2c002e181ebd21581003bcdb2c002e181ebd205810005faf8a01993fd92010003dceb948002fa7c0002b196c00216ec003bcdb2c00bc3e2e61dec0003dceb948028ff98966c0002b196c0025c0002b196c0024c0002b196c00203f80003dceb948012a1c1d59614] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x105c900779ae5802ab9829a490001eeb5ca800fb7e3c607890003dceb9480039bb1d0c617890001eeb5ca8007adfdf9ae16890003dceb948001d3e3d3e61c890003dceb948003d9e1c99a090003dceb94802fc38e75003bcdb2c00b96c1b68635007a898012cba496550002b196c002150002b196c00203e10001eeb5ca80039990e18a17e10003dceb948016d8c4a3fa1ee10003dceb948003f9fe86b606e10003dceb94800aebd9a3e214e10003dceb948002610002b196c00203a10003dceb94800dd4aad59617a10003dceb94800385cdb2ee06a10003dceb94800689caa0be14] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1019d0005faf8a06ca3dde61d0002fdbc9009e2c48203e90001eeb5ca8006f4e4f9ce17e9003bcdb2c0018d958f9216e900779ae58001d3c098de02e90003dceb948018faecb0b615e9005faf84806bf993c205e90003dceb948002acd1f5ba69003bcdb2c02603a9003bcdb2c001f1c4e09617a9000bf5f0c0188eaeb202a90017ebe180019396b9b215a90001eeb5ca800397d0bdb2290003dceb948002d207c90009c4da801fa2d4a217c90003dceb948021cfeecfca1ec900779ae580018296cf9a06c90003dceb948004aefdcbfa1dc900779ae58001bde8bdae14c9002fd7c28025e1b4f614] def rowsChunk10:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x10894002692e802010101000102010008920003dceb948035d4e2f182012001010120010101170102011701020403dceb94803bcdcdea01200101012001010101010001020100042fd7c28004ec92040601040406010101000101010001020403dceb94800a8d8ef19e07e8060602b196c001c6bba609c4da801ad3a1b90793c3c01ed4e3ba15bacac022d6f3c90902010105779ae58001a4bb92088b00779ae58012a382088a0001eeb5ca802f97d7b2088f00779ae58001ed918eee08850003dceb948049d0b1ce08800003dceb948069eae09a7d0002b196c0023d0002b196c0025d0001eeb5ca802cda85f1ba0f] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 ++ rowsChunk10 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadFullSixteenCase0.base QuadFullSixteenCase0.hinges QuadFullSixteenCase0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase0.base QuadFullSixteenCase0.hinges QuadFullSixteenCase0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadFullSixteenCase1.base QuadFullSixteenCase1.hinges QuadFullSixteenCase1.normalizationDenominator private def zz1273:"s04f9"="s04f9":=by decide+kernel theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase1.base QuadFullSixteenCase1.hinges QuadFullSixteenCase1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r62,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r56,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadFullSixteenCase2.base QuadFullSixteenCase2.hinges QuadFullSixteenCase2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase2.base QuadFullSixteenCase2.hinges QuadFullSixteenCase2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadFullSixteenCase3.base QuadFullSixteenCase3.hinges QuadFullSixteenCase3.normalizationDenominator private def zz1274:"s04fa"="s04fa":=by decide+kernel theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase3.base QuadFullSixteenCase3.hinges QuadFullSixteenCase3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r66,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r80,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadFullSixteenCase4.base QuadFullSixteenCase4.hinges QuadFullSixteenCase4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase4.base QuadFullSixteenCase4.hinges QuadFullSixteenCase4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadFullSixteenCase5.base QuadFullSixteenCase5.hinges QuadFullSixteenCase5.normalizationDenominator private def zz1275:"s04fb"="s04fb":=by decide+kernel theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase5.base QuadFullSixteenCase5.hinges QuadFullSixteenCase5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r56,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadFullSixteenCase6.base QuadFullSixteenCase6.hinges QuadFullSixteenCase6.normalizationDenominator theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase6.base QuadFullSixteenCase6.hinges QuadFullSixteenCase6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r61,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadFullSixteenCase7.base QuadFullSixteenCase7.hinges QuadFullSixteenCase7.normalizationDenominator private def zz1276:"s04fc"="s04fc":=by decide+kernel theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase7.base QuadFullSixteenCase7.hinges QuadFullSixteenCase7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadFullSixteenCase8.base QuadFullSixteenCase8.hinges QuadFullSixteenCase8.normalizationDenominator theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase8.base QuadFullSixteenCase8.hinges QuadFullSixteenCase8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadFullSixteenCase9.base QuadFullSixteenCase9.hinges QuadFullSixteenCase9.normalizationDenominator private def zz1277:"s04fd"="s04fd":=by decide+kernel theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase9.base QuadFullSixteenCase9.hinges QuadFullSixteenCase9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r59,RewriteAtoms.r30,RewriteAtoms.r81,RewriteAtoms.r61,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadFullSixteenCase10.base QuadFullSixteenCase10.hinges QuadFullSixteenCase10.normalizationDenominator theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase10.base QuadFullSixteenCase10.hinges QuadFullSixteenCase10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r50,RewriteAtoms.r52,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadFullSixteenCase11.base QuadFullSixteenCase11.hinges QuadFullSixteenCase11.normalizationDenominator private def zz1278:"s04fe"="s04fe":=by decide+kernel theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase11.base QuadFullSixteenCase11.hinges QuadFullSixteenCase11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadFullSixteenCase12.base QuadFullSixteenCase12.hinges QuadFullSixteenCase12.normalizationDenominator theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase12.base QuadFullSixteenCase12.hinges QuadFullSixteenCase12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadFullSixteenCase13.base QuadFullSixteenCase13.hinges QuadFullSixteenCase13.normalizationDenominator private def zz1279:"s04ff"="s04ff":=by decide+kernel theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase13.base QuadFullSixteenCase13.hinges QuadFullSixteenCase13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadFullSixteenCase14.base QuadFullSixteenCase14.hinges QuadFullSixteenCase14.normalizationDenominator theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase14.base QuadFullSixteenCase14.hinges QuadFullSixteenCase14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadFullSixteenCase15.base QuadFullSixteenCase15.hinges QuadFullSixteenCase15.normalizationDenominator private def zz1280:"s0500"="s0500":=by decide+kernel theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase15.base QuadFullSixteenCase15.hinges QuadFullSixteenCase15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadFullSixteenCase16.base QuadFullSixteenCase16.hinges QuadFullSixteenCase16.normalizationDenominator theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase16.base QuadFullSixteenCase16.hinges QuadFullSixteenCase16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadFullSixteenCase17.base QuadFullSixteenCase17.hinges QuadFullSixteenCase17.normalizationDenominator private def zz1281:"s0501"="s0501":=by decide+kernel theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase17.base QuadFullSixteenCase17.hinges QuadFullSixteenCase17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadFullSixteenCase18.base QuadFullSixteenCase18.hinges QuadFullSixteenCase18.normalizationDenominator theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase18.base QuadFullSixteenCase18.hinges QuadFullSixteenCase18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadFullSixteenCase19.base QuadFullSixteenCase19.hinges QuadFullSixteenCase19.normalizationDenominator private def zz1282:"s0502"="s0502":=by decide+kernel theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadFullSixteenCase19.base QuadFullSixteenCase19.hinges QuadFullSixteenCase19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadFullSixteenCase19.nonnegative x hx def pair20:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair20Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_20_base LocalFullSixteenPairs.compact_fullSixteen_pair_20_hinges theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalFullSixteenPairs.fullSixteen_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_20_base LocalFullSixteenPairs.compact_fullSixteen_pair_20_hinges x private def zz1283:"s0503"="s0503":=by decide+kernel theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair21Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_21_base LocalFullSixteenPairs.compact_fullSixteen_pair_21_hinges theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalFullSixteenPairs.fullSixteen_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_21_base LocalFullSixteenPairs.compact_fullSixteen_pair_21_hinges x theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 0 1 false def pair22Rewrites:Rewrites:=[] def pair22Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_22_base LocalFullSixteenPairs.compact_fullSixteen_pair_22_hinges private def zz1284:"s0504"="s0504":=by decide+kernel theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalFullSixteenPairs.fullSixteen_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_22_base LocalFullSixteenPairs.compact_fullSixteen_pair_22_hinges x theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2] def pair23Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_23_base LocalFullSixteenPairs.compact_fullSixteen_pair_23_hinges theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel private def zz1285:"s0505"="s0505":=by decide+kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalFullSixteenPairs.fullSixteen_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_23_base LocalFullSixteenPairs.compact_fullSixteen_pair_23_hinges x theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r70,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28] def pair24Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_24_base LocalFullSixteenPairs.compact_fullSixteen_pair_24_hinges theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalFullSixteenPairs.fullSixteen_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_24_base LocalFullSixteenPairs.compact_fullSixteen_pair_24_hinges x private def zz1286:"s0506"="s0506":=by decide+kernel theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28] def pair25Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_25_base LocalFullSixteenPairs.compact_fullSixteen_pair_25_hinges theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalFullSixteenPairs.fullSixteen_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_25_base LocalFullSixteenPairs.compact_fullSixteen_pair_25_hinges x theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r51] def pair26Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_26_base LocalFullSixteenPairs.compact_fullSixteen_pair_26_hinges private def zz1287:"s0507"="s0507":=by decide+kernel theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalFullSixteenPairs.fullSixteen_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_26_base LocalFullSixteenPairs.compact_fullSixteen_pair_26_hinges x theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2] def pair27Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_27_base LocalFullSixteenPairs.compact_fullSixteen_pair_27_hinges theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel private def zz1288:"s0508"="s0508":=by decide+kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalFullSixteenPairs.fullSixteen_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_27_base LocalFullSixteenPairs.compact_fullSixteen_pair_27_hinges x theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_28_base LocalFullSixteenPairs.compact_fullSixteen_pair_28_hinges theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalFullSixteenPairs.fullSixteen_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_28_base LocalFullSixteenPairs.compact_fullSixteen_pair_28_hinges x private def zz1289:"s0509"="s0509":=by decide+kernel theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_29_base LocalFullSixteenPairs.compact_fullSixteen_pair_29_hinges theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalFullSixteenPairs.fullSixteen_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_29_base LocalFullSixteenPairs.compact_fullSixteen_pair_29_hinges x theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r51] def pair30Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_30_base LocalFullSixteenPairs.compact_fullSixteen_pair_30_hinges private def zz1290:"s050a"="s050a":=by decide+kernel theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalFullSixteenPairs.fullSixteen_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_30_base LocalFullSixteenPairs.compact_fullSixteen_pair_30_hinges x theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r28] def pair31Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_31_base LocalFullSixteenPairs.compact_fullSixteen_pair_31_hinges theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel private def zz1291:"s050b"="s050b":=by decide+kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalFullSixteenPairs.fullSixteen_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_31_base LocalFullSixteenPairs.compact_fullSixteen_pair_31_hinges x theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_32_base LocalFullSixteenPairs.compact_fullSixteen_pair_32_hinges theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalFullSixteenPairs.fullSixteen_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_32_base LocalFullSixteenPairs.compact_fullSixteen_pair_32_hinges x private def zz1292:"s050c"="s050c":=by decide+kernel theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_33_base LocalFullSixteenPairs.compact_fullSixteen_pair_33_hinges theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalFullSixteenPairs.fullSixteen_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_33_base LocalFullSixteenPairs.compact_fullSixteen_pair_33_hinges x theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair34Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_34_base LocalFullSixteenPairs.compact_fullSixteen_pair_34_hinges private def zz1293:"s050d"="s050d":=by decide+kernel theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalFullSixteenPairs.fullSixteen_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_34_base LocalFullSixteenPairs.compact_fullSixteen_pair_34_hinges x theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28] def pair35Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_35_base LocalFullSixteenPairs.compact_fullSixteen_pair_35_hinges theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel private def zz1294:"s050e"="s050e":=by decide+kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalFullSixteenPairs.fullSixteen_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_35_base LocalFullSixteenPairs.compact_fullSixteen_pair_35_hinges x theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r51] def pair36Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_36_base LocalFullSixteenPairs.compact_fullSixteen_pair_36_hinges theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalFullSixteenPairs.fullSixteen_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_36_base LocalFullSixteenPairs.compact_fullSixteen_pair_36_hinges x private def zz1295:"s050f"="s050f":=by decide+kernel theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r72,RewriteAtoms.r71] def pair37Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_37_base LocalFullSixteenPairs.compact_fullSixteen_pair_37_hinges theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalFullSixteenPairs.fullSixteen_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_37_base LocalFullSixteenPairs.compact_fullSixteen_pair_37_hinges x theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_38_base LocalFullSixteenPairs.compact_fullSixteen_pair_38_hinges private def zz1296:"s0510"="s0510":=by decide+kernel theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalFullSixteenPairs.fullSixteen_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_38_base LocalFullSixteenPairs.compact_fullSixteen_pair_38_hinges x theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=pairSlack (16) ((1 / 0xf4240)) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalFullSixteenPairs.compact_fullSixteen_pair_39_base LocalFullSixteenPairs.compact_fullSixteen_pair_39_hinges theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel private def zz1297:"s0511"="s0511":=by decide+kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalFullSixteenPairs.fullSixteen_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalFullSixteenPairs.compact_fullSixteen_pair_39_base LocalFullSixteenPairs.compact_fullSixteen_pair_39_hinges x theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalFullSixteenPairs.fullSixteen_pair_39_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (pairSlack (16) ((1 / 0xf4240)) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.FullSixteenRows private def zz2351:"s092f"="s092f":=by decide+kernel end section namespace Green24Proof.FullSixteenCyclic open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows FullPhaseSemantics open FullPhaseRows (Phase) open FullPhaseAggregation (quadPoint_nonneg pairPoint_nonneg) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ExtendedFullPhaseAggregation private def zz1298:"s0512"="s0512":=by decide+kernel theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack FullSixteenRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullSixteenRows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse FullSixteenRows.rows p q same x] exact FullSixteenRows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (pairSlack 16 (1 / 0xf4240) FullSixteenRows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact FullSixteenRows.pair_nonneg p q h same x hx · rw [← pairSlack_swap 16 (1 / 0xf4240) FullSixteenRows.rows p q same x] exact FullSixteenRows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible FullSixteenRows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials FullSixteenRows.rows theorem remaining_rows_count:remainingRows.length = 12:=by decide +kernel private def zz1299:"s0513"="s0513":=by decide+kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : (1 / 0x3d090:ℝ) * mass g ^ 2 ≤ weightedAggregate 16 h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack FullSixteenRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack 16 (1 / 0xf4240) FullSixteenRows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [local_slacks_sum,stripPotentials_sound 16 h4 h3 h5 g FullSixteenRows.rows rows_admissible] at hs norm_num at hs change (1 / 0x3d090:ℝ) * mass g ^ 2 ≤ weightedAggregate 16 h4 h3 g (stripPotentials FullSixteenRows.rows) + 4 * deficit g linarith end Green24Proof.FullSixteenCyclic private def zz2352:"s0930"="s0930":=by decide+kernel end section namespace Green24Proof.FullSixteenMass open ExtendedFullPhaseRows ExtendedFullPhaseAggregation open PhaseMassRows ConditionalMassRows theorem remainingRows_eq:FullSixteenCyclic.remainingRows = [ ((0x69d580d / 0x3b9aca00), .base (.balance 0 (1))), ((0x49a0c67 / 0x3b9aca00), .base (.balance 2 (-1))), ((0xed223b7 / 0xee6b280), .base (.heightChild 1)), ((0x2f2f5d9 / 0x1dcd6500), .base (.grandchild 0)), ((0x248c1 / 0xee6b280), .base (.grandchild 1)), ((0x148ec9 / 0xee6b280), .massCorrection 1 1 ⟨(1 / 9),(-0x22adce5 / 0x2aea540),(0x1ea98dd / 0xe4e1c0),(-0x1aa685d / 0x1312d00)⟩), ((0x18ced3 / 0x4c4b40), .massCoercivity (3 / 0x3e8)), ((0x50d1dc4f / 0x3b9aca00), .massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,(3 / 4),2,(3 / 4)]:Fin 4 → ℚ) p)), ((0x9b09 / 0x5f5e100), .massProduct (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) (fun p => (![-1,16, -1,16]:Fin 4 → ℚ) p)), ((0x3b9b375 / 0x3b9aca00), .massProduct (fun p => (![1, -12,1, -12]:Fin 4 → ℚ) p) (fun p => (![-1,16, -1,16]:Fin 4 → ℚ) p)), ((0x1ad4c5c41 / 0x3b9aca00), .base (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((1 / 0x98968), .base (.normalization))]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff CombinedPolicyPackedRowsEquality.extendedEq CombinedPolicyPackedRowsEquality.extendedEq_iff _ _).mp decide +kernel theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ 16 * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hforms:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm 12 16 i p:ℝ))) (hheight:FullPhaseAggregation.rowAggregate 16 h4 h3 g (.heightChild 1) ≤ 0) (hg0:FullPhaseAggregation.rowAggregate 16 h4 h3 g (.grandchild 0) ≤ 0) (hg1:FullPhaseAggregation.rowAggregate 16 h4 h3 g (.grandchild 1) ≤ 0) (hcorr:rowAggregate 16 h4 h3 g (.massCorrection 1 1 ⟨(1 / 9),(-0x22adce5 / 0x2aea540),(0x1ea98dd / 0xe4e1c0),(-0x1aa685d / 0x1312d00)⟩) ≤ 0) (hcoerc:rowAggregate 16 h4 h3 g (.massCoercivity (3 / 0x3e8)) ≤ 0) : weightedAggregate 16 h4 h3 g FullSixteenCyclic.remainingRows ≤ (1 / 0x98968:ℝ) * mass g ^ 2:=by have hw:0 ≤ ((0x69d580d / 0x3b9aca00):ℝ) * phaseTotal h4 g 0 - ((0x49a0c67 / 0x3b9aca00):ℝ) * phaseTotal h4 g 2:=by have hb:=phaseTotal_nonneg h4 g hg 2 linarith have hbal:=mul_nonpos_of_nonneg_of_nonpos hw (sub_nonpos.mpr hhigh) have hp7:rowAggregate 16 h4 h3 g (.massProduct (fun p => (![1,0, -1,0]:Fin 4 → ℚ) p) (fun p => (![-1,(3 / 4),2,(3 / 4)]:Fin 4 → ℚ) p)) ≤ 0 := domainProduct_nonpos 16 12 16 h4 h3 g hforms 4 13 have hp8:rowAggregate 16 h4 h3 g (.massProduct (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) (fun p => (![-1,16, -1,16]:Fin 4 → ℚ) p)) ≤ 0 := domainProduct_nonpos 16 12 16 h4 h3 g hforms 5 8 have hp9:rowAggregate 16 h4 h3 g (.massProduct (fun p => (![1, -12,1, -12]:Fin 4 → ℚ) p) (fun p => (![-1,16, -1,16]:Fin 4 → ℚ) p)) ≤ 0 := domainProduct_nonpos 16 12 16 h4 h3 g hforms 7 8 have hs10:=rowAggregate_massSquare_nonpos 16 h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_base,rowAggregate_balance,rowAggregate_normalization] norm_num linarith theorem deficit_nonneg_of_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hhigh:phaseTotal h4 g 0 + phaseTotal h4 g 2 ≤ 16 * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) (hforms:∀ i:Fin 14,0 ≤ massWeighted h4 g (fun p => (domainForm 12 16 i p:ℝ))) (hheight:FullPhaseAggregation.rowAggregate 16 h4 h3 g (.heightChild 1) ≤ 0) (hg0:FullPhaseAggregation.rowAggregate 16 h4 h3 g (.grandchild 0) ≤ 0) (hg1:FullPhaseAggregation.rowAggregate 16 h4 h3 g (.grandchild 1) ≤ 0) (hcorr:rowAggregate 16 h4 h3 g (.massCorrection 1 1 ⟨(1 / 9),(-0x22adce5 / 0x2aea540),(0x1ea98dd / 0xe4e1c0),(-0x1aa685d / 0x1312d00)⟩) ≤ 0) (hcoerc:rowAggregate 16 h4 h3 g (.massCoercivity (3 / 0x3e8)) ≤ 0) (h5:¬5 ∣ q):0 ≤ deficit g:=by have hc:=FullSixteenCyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g hg heven hhigh hforms hheight hg0 hg1 hcorr hcoerc nlinarith [sq_nonneg (mass g)] end Green24Proof.FullSixteenMass private def zz2353:"s0931"="s0931":=by decide+kernel end section namespace Green24Proof.NestedChildRows open QuadraticCertificates ExpressionCertificates FullPhaseRows FullPhaseSemantics open FullPhaseAggregation ChildRows HeightChildRows ProfileChildren PhaseMassRows noncomputable def selectedEven {m:ℕ} (h2:2 ∣ m) (v:ZMod m → ℝ) (j k:ZMod m):ℝ := if ZMod.castHom h2 (ZMod 2) j = 0 ∧ ZMod.castHom h2 (ZMod 2) k = 0 then expressionEval area (quadPoint v j k) + expressionEval (pairProduct (-8)) (pairPoint v j k) else 0 private def zz1300:"s0514"="s0514":=by decide+kernel theorem grandchild_off {q:ℕ} (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (r:Phase) (j k:ZMod q) (h:¬(ZMod.castHom h4 (ZMod 4) j = r ∧ ZMod.castHom h4 (ZMod 4) k = r)) : rowValue S h4 h3 g (.grandchild r) j k = 0:=by simp only [rowValue,rowQuad,rowPair,if_neg h, ExtendedFullPhaseRows.expressionEval_nil,add_zero] theorem grandchild_one_sum {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) : rowAggregate S h4 h3 (interleave u v) (.grandchild 1) = ∑ j, ∑ k,selectedEven h2 v j k:=by have he (i:ZMod m):ZMod.castHom h4 (ZMod 4) (parityEquiv m (0,i)) ≠ 1:=by rw [cast_four_even h4 h2] rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero]; decide · rw [h,doubleResidue_two_one]; decide have ho (i:ZMod m):ZMod.castHom h4 (ZMod 4) (parityEquiv m (1,i)) = 1 ↔ ZMod.castHom h2 (ZMod 2) i = 0:=by rw [cast_four_odd h4 h2] rcases zmod_two_eq_zero_or_one (ZMod.castHom h2 (ZMod 2) i) with h | h · rw [h,map_zero]; decide · rw [h,doubleResidue_two_one]; decide have hodd (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.grandchild 1) (parityEquiv m (1,j)) (parityEquiv m (1,k)) = selectedEven h2 v j k:=by simp only [rowValue,rowQuad,rowPair,ho,selectedEven] split_ifs · rw [area_eval,area_eval,pairProduct_eval,pairProduct_eval] simp [quadPoint,pairPoint,Matrix.cons_val_two,Matrix.cons_val_three, parityEquiv_affine,interleave_odd] · simp only [ExtendedFullPhaseRows.expressionEval_nil,add_zero] have h00 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.grandchild 1) (parityEquiv m (0,j)) (parityEquiv m (0,k)) = 0 := grandchild_off S h4 h3 _ 1 _ _ (fun h => he j h.1) have h01 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.grandchild 1) (parityEquiv m (0,j)) (parityEquiv m (1,k)) = 0 := grandchild_off S h4 h3 _ 1 _ _ (fun h => he j h.1) have h10 (j k:ZMod m):rowValue S h4 h3 (interleave u v) (.grandchild 1) (parityEquiv m (1,j)) (parityEquiv m (0,k)) = 0 := grandchild_off S h4 h3 _ 1 _ _ (fun h => he k h.2) unfold rowAggregate rw [sum_parity_pairs] simp only [h00,h01,h10,hodd,Finset.sum_const_zero,zero_add] theorem selectedEven_sum {n:ℕ} [NeZero n] (w z:ZMod n → ℝ) : (∑ j, ∑ k,selectedEven (dvd_mul_right 2 n) (interleave w z) j k) = -4 * deficit w:=by rw [sum_parity_pairs] simp only [selectedEven,parityCast_apply] norm_num have hp (j k:ZMod n) : expressionEval area (quadPoint (interleave w z) (parityEquiv n (0,j)) (parityEquiv n (0,k))) + expressionEval (pairProduct (-8)) (pairPoint (interleave w z) (parityEquiv n (0,j)) (parityEquiv n (0,k))) = expressionEval area (quadPoint w j k) + expressionEval (pairProduct (-8)) (pairPoint w j k):=by rw [area_eval,area_eval,pairProduct_eval,pairProduct_eval] simp [quadPoint,pairPoint,Matrix.cons_val_two,Matrix.cons_val_three, parityEquiv_affine,interleave_even] simp_rw [hp] simp only [Finset.sum_add_distrib,area_sum,pairProduct_sum] unfold deficit norm_num ring theorem grandchild_one_child {n:ℕ} [NeZero n] (S:ℚ) (h4:4 ∣ 2 * (2 * n)) (h3:3 ∣ 2 * (2 * n)) (u v:ZMod (2 * n) → ℝ) : rowAggregate S h4 h3 (interleave u v) (.grandchild 1) = -4 * deficit (child v 0):=by rw [grandchild_one_sum S h4 h3 (dvd_mul_right 2 n)] have h:=selectedEven_sum (child v 0) (child v 1) simpa only [interleave_children] using h def twoThirdsCorrection:ExtendedFullPhaseRows.Correction where retained:=1 / 9 even:=(2 / 3) * (-0x22ad5dd / 0x1c9c380) - 1 / 0x61a8 mixed:=(2 / 3) * (0x1aa653d / 0x1312d00) + 0x22ad5dd / 0x1c9c380 - 2 / 0x61a8 odd:=-0x1aa653d / 0x1312d00 - 1 / 0x61a8 private def zz1301:"s0515"="s0515":=by decide+kernel theorem odd_correction_nonpos {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hv:∀ i,0 ≤ v i) : ExtendedFullPhaseAggregation.rowAggregate S h4 h3 (interleave u v) (.massCorrection 1 1 twoThirdsCorrection) ≤ 0:=by rcases h2 with ⟨n,rfl⟩ have hn:0 < n:=by have hp:=NeZero.pos (2 * n); omega let:NeZero n:=⟨by omega⟩ have h3v:3 ∣ 2 * n:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5v:¬5 ∣ 2 * n:=fun h => h5 (dvd_mul_of_dvd_right h 2) have hc:=ParityTwoThirds.correction h3v h5v (child v 0) (child v 1) (child_nonneg v hv 0) (child_nonneg v hv 1) rw [interleave_children] at hc rw [ExtendedMassRows.rowAggregate_massCorrection_odd,rowAggregate_child_odd, grandchild_one_child,phaseTotal_interleave_one h4 (dvd_mul_right 2 n), phaseTotal_interleave_three h4 (dvd_mul_right 2 n), ← child_mass, ← child_mass] norm_num [twoThirdsCorrection] unfold ParityTwoThirds.massCorrection at hc nlinarith only [hc] end Green24Proof.NestedChildRows private def zz2354:"s0932"="s0932":=by decide+kernel end section namespace Green24Proof.ChildCoercivityRows open PhaseMassRows ProfileChildren HeightChildRows theorem even_nonpos_of_negative_parent {m:ℕ} [NeZero m] (S:ℚ) (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hneg:deficit (interleave u v) < 0) (heven:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hlow:12 * mass v ≤ mass u) : ExtendedFullPhaseAggregation.rowAggregate S h4 h3 (interleave u v) (.massCoercivity (3 / 0x3e8)) ≤ 0:=by rcases h2 with ⟨n,rfl⟩ have hn:0 < n:=by have hp:=NeZero.pos (2 * n); omega let:NeZero n:=⟨by omega⟩ have hm:2 * n < 2 * (2 * n):=by omega have hdu:=ih (2 * n) hm (dvd_mul_left (2 * n) 2) u hu have hdv:=ih (2 * n) hm (dvd_mul_left (2 * n) 2) v hv have hV:=ConditionalProfileRows.odd_mass_pos_of_negative_parent (dvd_mul_right 2 n) u v hu hv hdu hdv hneg have hcap:=negative_parent_profile_child_cap (dvd_mul_right 2 n) u v hu hv hdu hdv hneg hV hlow have h3u:3 ∣ 2 * n:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5u:¬5 ∣ 2 * n:=fun h => h5 (dvd_mul_of_dvd_right h 2) have hsmall:=ih n (by omega) (dvd_mul_of_dvd_right (dvd_mul_left n 2) 2) (child u 0) (child_nonneg u hu 0) rw [phaseTotal_interleave_zero h4 (dvd_mul_right 2 n), phaseTotal_interleave_two h4 (dvd_mul_right 2 n)] at heven rw [← child_mass, ← child_mass] at heven hcap have hc:=NearBalanceVerified.coercivity_to_eleven_fifths h3u h5u (child u 0) (child u 1) (child_nonneg u hu 0) (child_nonneg u hu 1) hsmall heven (le_of_lt hcap) rw [interleave_children] at hc rw [ExtendedMassRows.rowAggregate_massCoercivity,ChildRows.rowAggregate_child_even, phaseTotal_interleave_zero h4 (dvd_mul_right 2 n), phaseTotal_interleave_two h4 (dvd_mul_right 2 n), ← child_mass, ← child_mass] norm_num nlinarith [sq_nonneg (mass (child u 0) - mass (child u 1))] end Green24Proof.ChildCoercivityRows private def zz2355:"s0933"="s0933":=by decide+kernel end section namespace Green24Proof.FullSixteenProfileInterval open FullPhaseRows (Phase) open PhaseMassRows ChildRows HeightChildRows theorem interval_nonneg_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (heven:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hodd:phaseTotal h4 (interleave u v) 3 ≤ phaseTotal h4 (interleave u v) 1) (hlow:(12:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (16:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by by_contra! hneg have hm:m < 2 * m:=by have hp:=NeZero.pos m; omega have hdu:=ih m hm (dvd_mul_left m 2) u hu have hdv:=ih m hm (dvd_mul_left m 2) v hv have hg:=interleave_nonneg u v hu hv have hforms:=ConditionalProfileRows.domainForms_nonneg 12 16 h4 h2 u v hu hv hdu hdv hneg (by norm_num) heven hodd hlow hhigh have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) have hheight:=rowAggregate_height_odd_nonpos 16 h4 h3 h2 u v hu hv (HeightStrong.strong_height_bound h2 h3m h5m v hv) have hg0:=Full27ProfileInterval.grandchild_nonpos_of_induction 16 h4 h3 (interleave u v) hg 0 ih have hg1:=Full27ProfileInterval.grandchild_nonpos_of_induction 16 h4 h3 (interleave u v) hg 1 ih have hcoerc:=ChildCoercivityRows.even_nonpos_of_negative_parent 16 h4 h3 h5 h2 u v hu hv ih hneg heven hlow have hcorr:ExtendedFullPhaseAggregation.rowAggregate 16 h4 h3 (interleave u v) (.massCorrection 1 1 ⟨(1 / 9),(-0x22adce5 / 0x2aea540),(0x1ea98dd / 0xe4e1c0),(-0x1aa685d / 0x1312d00)⟩) ≤ 0:=by have h:=NestedChildRows.odd_correction_nonpos 16 h4 h3 h5 h2 u v hv norm_num [NestedChildRows.twoThirdsCorrection] at h ⊢ exact h have hhigh':phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 ≤ (16:ℝ) * (phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3):=by rw [ProfileChildren.phaseTotal_interleave_zero h4 h2, ProfileChildren.phaseTotal_interleave_two h4 h2,phaseTotal_interleave_one h4 h2, phaseTotal_interleave_three h4 h2,classMass_sum,classMass_sum] exact hhigh have h:=FullSixteenMass.deficit_nonneg_of_rows h4 h3 (interleave u v) hg heven hhigh' hforms hheight hg0 hg1 hcorr hcoerc h5 linarith theorem interval_nonneg {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hlow:(12:ℝ) * mass v ≤ mass u) (hhigh:mass u ≤ (16:ℝ) * mass v) : 0 ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,heven,hodd⟩ := ProfileDoubleOrientation.orient_both_children h4 u v hu hv have h:=interval_nonneg_ordered h4 h3 h5 h2 u' v' hu' hv' ih heven hodd (by simpa only [hU,hV] using hlow) (by simpa only [hU,hV] using hhigh) simpa only [hd] using h end Green24Proof.FullSixteenProfileInterval private def zz2356:"s0934"="s0934":=by decide+kernel end section namespace Green24Proof.RatioCoverSixteen open BoundaryFromHeightCertificates ConditionalProfileEndpoint private def zz1302:"s0516"="s0516":=by decide+kernel theorem ratio_to_sixteen:RatioToSixteen:=by apply RatioCoverTwelve.ratio_to_sixteen_of_remaining intro m _ exact FullSixteenProfileInterval.interval_nonneg theorem deficit_nonneg_of_remaining (hcertificate12:∀ (m:ℕ) [NeZero m],HeightCertificate m Q12) (hcertificate18:∀ (m:ℕ) [NeZero m],HeightCertificate m Q18) : ∀ (q:ℕ) [NeZero q], ¬5 ∣ q → ∀ (g:ZMod q → ℝ),(∀ i,0 ≤ g i) → 0 ≤ deficit g := deficit_nonneg_of_certificates ratio_to_sixteen hcertificate12 hcertificate18 end Green24Proof.RatioCoverSixteen private def zz2357:"s0935"="s0935":=by decide+kernel end section namespace Green24Proof.HeightFullPhaseRows open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows open FullPhaseRows (Phase scale rhoExpression expressionEval_append expressionEval_scale) open FullPhaseSemantics (quadPoint pairPoint sameColour) open ExtendedFullPhaseAggregation def pairSlack (S margin lam:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool):Expression := ExtendedFullPhaseRows.pairSlack S margin rows p q same ++ scale (-2 * lam) rhoExpression theorem pairSlack_swap (S margin lam:ℚ) (rows:List (ℚ × Label)) (p q:Phase) (same:Bool) (x:Point) : expressionEval (pairSlack S margin lam rows q p same) (FullPhaseSymmetry.swapPair x) = expressionEval (pairSlack S margin lam rows p q same) x:=by simp only [pairSlack,expressionEval_append,expressionEval_scale, ExtendedFullPhaseRows.pairSlack_swap,FullPhaseSymmetry.rhoExpression_swap] theorem local_slacks_sum {q:ℕ} [NeZero q] (S margin lam:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (rows:List (ℚ × Label)) : (∑ j:ZMod q, ∑ k:ZMod q, (expressionEval (quadSlack rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (pairSlack S margin lam rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k))) = weightedAggregate S h4 h3 g rows + 4 * deficit g - 4 * (margin:ℝ) * mass g ^ 2 - 4 * (lam:ℝ) * energy g:=by simp only [pairSlack,expressionEval_append,expressionEval_scale, ← add_assoc] simp only [Finset.sum_add_distrib, ← Finset.mul_sum] have hs:=ExtendedFullPhaseAggregation.local_slacks_sum S margin h4 h3 g rows simp only [Finset.sum_add_distrib] at hs rw [hs,ParityPhaseAggregation.rho_sum g hg] push_cast ring end Green24Proof.HeightFullPhaseRows private def zz2358:"s0936"="s0936":=by decide+kernel end section namespace Green24Proof.LocalPairs def compact_height12_pair_20_base:CompactPair.Quadratic:=⟨(0xb2d05e00d / 0x59682f000),(0x39b28201 / 0x17d78400),2⟩ def compact_height12_pair_20_hinges:List CompactPair.Hinge:=[⟨(1 / 0xee6b2800),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x59682f000),2, -3⟩,⟨(-1 / 0xee6b2800),2, -1⟩,⟨(1 / 0x59682f000),3, -2⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_20_base compact_height12_pair_20_hinges x y def compact_height12_pair_20_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2] private def zz1303:"s0517"="s0517":=by decide+kernel theorem compact_height12_pair_20_check : CompactPair.expressionCheckPSD compact_height12_pair_20_base compact_height12_pair_20_hinges 0 compact_height12_pair_20_cuts = true := by decide +kernel theorem compact_height12_pair_20_representation (x y:ℝ) : height12_pair_20 x y = CompactPair.expressionEval compact_height12_pair_20_base compact_height12_pair_20_hinges x y:=by rfl theorem height12_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_20 x y:=by rw [compact_height12_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_20_check hy (by simpa using hx) def compact_height12_pair_21_base:CompactPair.Quadratic:=⟨(0x3b9aca017 / 0x1dcd65000),(0x47c39501 / 0x1dcd6500),2⟩ def compact_height12_pair_21_hinges:List CompactPair.Hinge:=[⟨(11 / 0x1dcd65000),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0xee6b2800),2, -3⟩,⟨(-11 / 0x1dcd65000),2, -1⟩,⟨(1 / 0xee6b2800),3, -2⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_21_base compact_height12_pair_21_hinges x y def compact_height12_pair_21_cuts:List ℚ:=[(1 / 2),(2 / 3),(3 / 2),2] theorem compact_height12_pair_21_check : CompactPair.expressionCheckPSD compact_height12_pair_21_base compact_height12_pair_21_hinges 0 compact_height12_pair_21_cuts = true := by decide +kernel private def zz1304:"s0518"="s0518":=by decide+kernel theorem compact_height12_pair_21_representation (x y:ℝ) : height12_pair_21 x y = CompactPair.expressionEval compact_height12_pair_21_base compact_height12_pair_21_hinges x y:=by rfl theorem height12_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_21 x y:=by rw [compact_height12_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_21_check hy (by simpa using hx) def compact_height12_pair_22_base:CompactPair.Quadratic:=⟨2,(0xb4e66cbf / 0x4a817c80),2⟩ def compact_height12_pair_22_hinges:List CompactPair.Hinge:=[⟨(-1 / 5),1,3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_22_base compact_height12_pair_22_hinges x y def compact_height12_pair_22_cuts:List ℚ:=[] theorem compact_height12_pair_22_check : CompactPair.expressionCheckPSD compact_height12_pair_22_base compact_height12_pair_22_hinges 0 compact_height12_pair_22_cuts = true := by decide +kernel theorem compact_height12_pair_22_representation (x y:ℝ) : height12_pair_22 x y = CompactPair.expressionEval compact_height12_pair_22_base compact_height12_pair_22_hinges x y:=by rfl private def zz1305:"s0519"="s0519":=by decide+kernel theorem height12_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_22 x y:=by rw [compact_height12_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_22_check hy (by simpa using hx) def compact_height12_pair_23_base:CompactPair.Quadratic:=⟨(0x59682f01 / 0x2cb41780),(0x5a00c57f3 / 0x2540be400),2⟩ def compact_height12_pair_23_hinges:List CompactPair.Hinge:=[⟨(-1 / 0xee6b2800),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x2cb417800),2, -3⟩,⟨(-1 / 0x2cb417800),3, -2⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_23_base compact_height12_pair_23_hinges x y def compact_height12_pair_23_cuts:List ℚ:=[(2 / 3),1,(3 / 2)] theorem compact_height12_pair_23_check : CompactPair.expressionCheckPSD compact_height12_pair_23_base compact_height12_pair_23_hinges 0 compact_height12_pair_23_cuts = true := by decide +kernel theorem compact_height12_pair_23_representation (x y:ℝ) : height12_pair_23 x y = CompactPair.expressionEval compact_height12_pair_23_base compact_height12_pair_23_hinges x y:=by rfl theorem height12_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_23 x y:=by rw [compact_height12_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_23_check hy (by simpa using hx) def compact_height12_pair_24_base:CompactPair.Quadratic:=⟨(0x8f0d1801 / 0x47868c00),(0x39b28201 / 0x17d78400),2⟩ def compact_height12_pair_24_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x165a0bc00),1, -3⟩,⟨(1 / 0x77359400),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(1 / 0x2cb417800),2, -3⟩,⟨(-1 / 0x165a0bc00),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_24_base compact_height12_pair_24_hinges x y def compact_height12_pair_24_cuts:List ℚ:=[(1 / 3),1,(3 / 2),3] private def zz1306:"s051a"="s051a":=by decide+kernel theorem compact_height12_pair_24_check : CompactPair.expressionCheckPSD compact_height12_pair_24_base compact_height12_pair_24_hinges 0 compact_height12_pair_24_cuts = true := by decide +kernel theorem compact_height12_pair_24_representation (x y:ℝ) : height12_pair_24 x y = CompactPair.expressionEval compact_height12_pair_24_base compact_height12_pair_24_hinges x y:=by rfl theorem height12_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_24 x y:=by rw [compact_height12_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_24_check hy (by simpa using hx) def compact_height12_pair_25_base:CompactPair.Quadratic:=⟨(0x3b9ac9ff3 / 0x1dcd65000),(0x1cb4a201 / 0xbebc200),2⟩ def compact_height12_pair_25_hinges:List CompactPair.Hinge:=[⟨(1 / 0x165a0bc00),1, -3⟩,⟨(1 / 0x1dcd65000),1, -2⟩,⟨(-1 / 0xee6b2800),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x59682f000),2, -3⟩,⟨(-1 / 0x1dcd65000),2, -1⟩,⟨(1 / 0xee6b2800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_25_base compact_height12_pair_25_hinges x y def compact_height12_pair_25_cuts:List ℚ:=[(1 / 3),(1 / 2),1,(3 / 2),2,3] theorem compact_height12_pair_25_check : CompactPair.expressionCheckPSD compact_height12_pair_25_base compact_height12_pair_25_hinges 0 compact_height12_pair_25_cuts = true := by decide +kernel private def zz1307:"s051b"="s051b":=by decide+kernel theorem compact_height12_pair_25_representation (x y:ℝ) : height12_pair_25 x y = CompactPair.expressionEval compact_height12_pair_25_base compact_height12_pair_25_hinges x y:=by rfl theorem height12_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_25 x y:=by rw [compact_height12_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_25_check hy (by simpa using hx) def compact_height12_pair_26_base:CompactPair.Quadratic:=⟨2,(0x5a73365fd / 0x2540be400),2⟩ def compact_height12_pair_26_hinges:List CompactPair.Hinge:=[⟨(-1 / 5),1,3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_26_base compact_height12_pair_26_hinges x y def compact_height12_pair_26_cuts:List ℚ:=[] theorem compact_height12_pair_26_check : CompactPair.expressionCheckPSD compact_height12_pair_26_base compact_height12_pair_26_hinges 0 compact_height12_pair_26_cuts = true := by decide +kernel theorem compact_height12_pair_26_representation (x y:ℝ) : height12_pair_26 x y = CompactPair.expressionEval compact_height12_pair_26_base compact_height12_pair_26_hinges x y:=by rfl private def zz1308:"s051c"="s051c":=by decide+kernel theorem height12_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_26 x y:=by rw [compact_height12_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_26_check hy (by simpa using hx) def compact_height12_pair_27_base:CompactPair.Quadratic:=⟨(0xb2d05e00b / 0x59682f000),(0x5a00c5807 / 0x2540be400),2⟩ def compact_height12_pair_27_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(-1 / 0xee6b2800),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x59682f000),2, -3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_27_base compact_height12_pair_27_hinges x y def compact_height12_pair_27_cuts:List ℚ:=[1,(3 / 2),2,3] theorem compact_height12_pair_27_check : CompactPair.expressionCheckPSD compact_height12_pair_27_base compact_height12_pair_27_hinges 0 compact_height12_pair_27_cuts = true := by decide +kernel theorem compact_height12_pair_27_representation (x y:ℝ) : height12_pair_27 x y = CompactPair.expressionEval compact_height12_pair_27_base compact_height12_pair_27_hinges x y:=by rfl theorem height12_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_27 x y:=by rw [compact_height12_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_27_check hy (by simpa using hx) def compact_height12_pair_28_base:CompactPair.Quadratic:=⟨(0x7270dfff / 0x39387000),(0x2d137590b / 0x12a05f200),2⟩ def compact_height12_pair_28_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(1 / 0x1dcd65000),2, -1⟩,⟨(1 / 0x2cb417800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_28_base compact_height12_pair_28_hinges x y def compact_height12_pair_28_cuts:List ℚ:=[(1 / 3),(1 / 2),2,3] private def zz1309:"s051d"="s051d":=by decide+kernel theorem compact_height12_pair_28_check : CompactPair.expressionCheckPSD compact_height12_pair_28_base compact_height12_pair_28_hinges 0 compact_height12_pair_28_cuts = true := by decide +kernel theorem compact_height12_pair_28_representation (x y:ℝ) : height12_pair_28 x y = CompactPair.expressionEval compact_height12_pair_28_base compact_height12_pair_28_hinges x y:=by rfl theorem height12_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_28 x y:=by rw [compact_height12_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_28_check hy (by simpa using hx) def compact_height12_pair_29_base:CompactPair.Quadratic:=⟨(0x3b9aca003 / 0x1dcd65000),(0x2cda3d20b / 0x12a05f200),2⟩ def compact_height12_pair_29_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x5f5e1000),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x165a0bc00),2, -3⟩,⟨(-1 / 0x5f5e1000),2, -1⟩,⟨(1 / 0x165a0bc00),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_29_base compact_height12_pair_29_hinges x y def compact_height12_pair_29_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height12_pair_29_check : CompactPair.expressionCheckPSD compact_height12_pair_29_base compact_height12_pair_29_hinges 0 compact_height12_pair_29_cuts = true := by decide +kernel private def zz1310:"s051e"="s051e":=by decide+kernel theorem compact_height12_pair_29_representation (x y:ℝ) : height12_pair_29 x y = CompactPair.expressionEval compact_height12_pair_29_base compact_height12_pair_29_hinges x y:=by rfl theorem height12_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_29 x y:=by rw [compact_height12_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_29_check hy (by simpa using hx) def compact_height12_pair_30_base:CompactPair.Quadratic:=⟨2,(0x2d399b2ff / 0x12a05f200),2⟩ def compact_height12_pair_30_hinges:List CompactPair.Hinge:=[⟨(-1 / 5),1,3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_30_base compact_height12_pair_30_hinges x y def compact_height12_pair_30_cuts:List ℚ:=[] theorem compact_height12_pair_30_check : CompactPair.expressionCheckPSD compact_height12_pair_30_base compact_height12_pair_30_hinges 0 compact_height12_pair_30_cuts = true := by decide +kernel theorem compact_height12_pair_30_representation (x y:ℝ) : height12_pair_30 x y = CompactPair.expressionEval compact_height12_pair_30_base compact_height12_pair_30_hinges x y:=by rfl private def zz1311:"s051f"="s051f":=by decide+kernel theorem height12_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_30 x y:=by rw [compact_height12_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_30_check hy (by simpa using hx) def compact_height12_pair_31_base:CompactPair.Quadratic:=⟨(0x3b9aca003 / 0x1dcd65000),(0x5a00c57f9 / 0x2540be400),2⟩ def compact_height12_pair_31_hinges:List CompactPair.Hinge:=[⟨(1 / 0xee6b2800),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0xee6b2800),2, -1⟩,⟨(-1 / 0x59682f000),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_31_base compact_height12_pair_31_hinges x y def compact_height12_pair_31_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1] theorem compact_height12_pair_31_check : CompactPair.expressionCheckPSD compact_height12_pair_31_base compact_height12_pair_31_hinges 0 compact_height12_pair_31_cuts = true := by decide +kernel theorem compact_height12_pair_31_representation (x y:ℝ) : height12_pair_31 x y = CompactPair.expressionEval compact_height12_pair_31_base compact_height12_pair_31_hinges x y:=by rfl theorem height12_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_31 x y:=by rw [compact_height12_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_31_check hy (by simpa using hx) def compact_height12_pair_32_base:CompactPair.Quadratic:=⟨(0x2faf07ff / 0x17d78400),(0x903e44ff / 0x3b9aca00),2⟩ def compact_height12_pair_32_hinges:List CompactPair.Hinge:=[⟨(1 / 0x165a0bc00),1, -3⟩,⟨(-1 / 0x77359400),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(1 / 0x2cb417800),2, -3⟩,⟨(1 / 0xee6b2800),2, -1⟩,⟨(1 / 0x165a0bc00),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_32_base compact_height12_pair_32_hinges x y def compact_height12_pair_32_cuts:List ℚ:=[(1 / 3),(1 / 2),(3 / 2),2,3] private def zz1312:"s0520"="s0520":=by decide+kernel theorem compact_height12_pair_32_check : CompactPair.expressionCheckPSD compact_height12_pair_32_base compact_height12_pair_32_hinges 0 compact_height12_pair_32_cuts = true := by decide +kernel theorem compact_height12_pair_32_representation (x y:ℝ) : height12_pair_32 x y = CompactPair.expressionEval compact_height12_pair_32_base compact_height12_pair_32_hinges x y:=by rfl theorem height12_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_32 x y:=by rw [compact_height12_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_32_check hy (by simpa using hx) def compact_height12_pair_33_base:CompactPair.Quadratic:=⟨(0x2cb4177f9 / 0x165a0bc00),(0x8f8729ff / 0x3b9aca00),2⟩ def compact_height12_pair_33_hinges:List CompactPair.Hinge:=[⟨(1 / 0x77359400),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x2cb417800),2, -3⟩,⟨(1 / 0xee6b2800),2, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_33_base compact_height12_pair_33_hinges x y def compact_height12_pair_33_cuts:List ℚ:=[(1 / 2),1,(3 / 2)] theorem compact_height12_pair_33_check : CompactPair.expressionCheckPSD compact_height12_pair_33_base compact_height12_pair_33_hinges 0 compact_height12_pair_33_cuts = true := by decide +kernel private def zz1313:"s0521"="s0521":=by decide+kernel theorem compact_height12_pair_33_representation (x y:ℝ) : height12_pair_33 x y = CompactPair.expressionEval compact_height12_pair_33_base compact_height12_pair_33_hinges x y:=by rfl theorem height12_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_33 x y:=by rw [compact_height12_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_33_check hy (by simpa using hx) def compact_height12_pair_34_base:CompactPair.Quadratic:=⟨(0x8f0d17ff / 0x47868c00),(0x39b28201 / 0x17d78400),2⟩ def compact_height12_pair_34_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(1 / 0x59682f000),2, -3⟩,⟨(1 / 0x1dcd65000),2, -1⟩,⟨(-1 / 0x59682f000),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_34_base compact_height12_pair_34_hinges x y def compact_height12_pair_34_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height12_pair_34_check : CompactPair.expressionCheckPSD compact_height12_pair_34_base compact_height12_pair_34_hinges 0 compact_height12_pair_34_cuts = true := by decide +kernel theorem compact_height12_pair_34_representation (x y:ℝ) : height12_pair_34 x y = CompactPair.expressionEval compact_height12_pair_34_base compact_height12_pair_34_hinges x y:=by rfl private def zz1314:"s0522"="s0522":=by decide+kernel theorem height12_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_34 x y:=by rw [compact_height12_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_34_check hy (by simpa using hx) def compact_height12_pair_35_base:CompactPair.Quadratic:=⟨(0xb2d05dfef / 0x59682f000),(0x8f872a03 / 0x3b9aca00),2⟩ def compact_height12_pair_35_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x1dcd65000),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x2cb417800),2, -3⟩,⟨(-1 / 0x1dcd65000),2, -1⟩,⟨(1 / 0x2cb417800),3, -2⟩,⟨(1 / 0x2cb417800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_35_base compact_height12_pair_35_hinges x y def compact_height12_pair_35_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height12_pair_35_check : CompactPair.expressionCheckPSD compact_height12_pair_35_base compact_height12_pair_35_hinges 0 compact_height12_pair_35_cuts = true := by decide +kernel theorem compact_height12_pair_35_representation (x y:ℝ) : height12_pair_35 x y = CompactPair.expressionEval compact_height12_pair_35_base compact_height12_pair_35_hinges x y:=by rfl theorem height12_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_35 x y:=by rw [compact_height12_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_35_check hy (by simpa using hx) def compact_height12_pair_36_base:CompactPair.Quadratic:=⟨2,(0x5a73365f9 / 0x2540be400),2⟩ def compact_height12_pair_36_hinges:List CompactPair.Hinge:=[⟨(-1 / 5),1,3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_36_base compact_height12_pair_36_hinges x y def compact_height12_pair_36_cuts:List ℚ:=[] private def zz1315:"s0523"="s0523":=by decide+kernel theorem compact_height12_pair_36_check : CompactPair.expressionCheckPSD compact_height12_pair_36_base compact_height12_pair_36_hinges 0 compact_height12_pair_36_cuts = true := by decide +kernel theorem compact_height12_pair_36_representation (x y:ℝ) : height12_pair_36 x y = CompactPair.expressionEval compact_height12_pair_36_base compact_height12_pair_36_hinges x y:=by rfl theorem height12_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_36 x y:=by rw [compact_height12_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_36_check hy (by simpa using hx) def compact_height12_pair_37_base:CompactPair.Quadratic:=⟨(0xbebc2001 / 0x5f5e1000),(0x5a00c57f9 / 0x2540be400),2⟩ def compact_height12_pair_37_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0xee6b2800),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x59682f000),2, -3⟩,⟨(-1 / 0xee6b2800),2, -1⟩,⟨(1 / 0x59682f000),3, -2⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_37_base compact_height12_pair_37_hinges x y def compact_height12_pair_37_cuts:List ℚ:=[(1 / 2),(2 / 3),1,(3 / 2),3] theorem compact_height12_pair_37_check : CompactPair.expressionCheckPSD compact_height12_pair_37_base compact_height12_pair_37_hinges 0 compact_height12_pair_37_cuts = true := by decide +kernel private def zz1316:"s0524"="s0524":=by decide+kernel theorem compact_height12_pair_37_representation (x y:ℝ) : height12_pair_37 x y = CompactPair.expressionEval compact_height12_pair_37_base compact_height12_pair_37_hinges x y:=by rfl theorem height12_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_37 x y:=by rw [compact_height12_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_37_check hy (by simpa using hx) def compact_height12_pair_38_base:CompactPair.Quadratic:=⟨(0xb2d05dff9 / 0x59682f000),(0x1689bac87 / 0x9502f900),2⟩ def compact_height12_pair_38_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x2cb417800),1, -3⟩,⟨(1 / 0x1dcd65000),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x1dcd65000),2, -1⟩,⟨(1 / 0x2cb417800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_38_base compact_height12_pair_38_hinges x y def compact_height12_pair_38_cuts:List ℚ:=[(1 / 3),(1 / 2),2,3] theorem compact_height12_pair_38_check : CompactPair.expressionCheckPSD compact_height12_pair_38_base compact_height12_pair_38_hinges 0 compact_height12_pair_38_cuts = true := by decide +kernel theorem compact_height12_pair_38_representation (x y:ℝ) : height12_pair_38 x y = CompactPair.expressionEval compact_height12_pair_38_base compact_height12_pair_38_hinges x y:=by rfl private def zz1317:"s0525"="s0525":=by decide+kernel theorem height12_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_38 x y:=by rw [compact_height12_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_38_check hy (by simpa using hx) def compact_height12_pair_39_base:CompactPair.Quadratic:=⟨(0xee6b2803 / 0x77359400),(0x2cda3d1ff / 0x12a05f200),2⟩ def compact_height12_pair_39_hinges:List CompactPair.Hinge:=[⟨(1 / 0x47868c00),1, -3⟩,⟨(-21 / 0x1dcd65000),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(13 / 0x59682f000),2, -3⟩,⟨(21 / 0x1dcd65000),2, -1⟩,⟨(-13 / 0x59682f000),3, -2⟩,⟨(-1 / 0x47868c00),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height12_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height12_pair_39_base compact_height12_pair_39_hinges x y def compact_height12_pair_39_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height12_pair_39_check : CompactPair.expressionCheckPSD compact_height12_pair_39_base compact_height12_pair_39_hinges 0 compact_height12_pair_39_cuts = true := by decide +kernel theorem compact_height12_pair_39_representation (x y:ℝ) : height12_pair_39 x y = CompactPair.expressionEval compact_height12_pair_39_base compact_height12_pair_39_hinges x y:=by rfl theorem height12_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height12_pair_39 x y:=by rw [compact_height12_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_height12_pair_39_check hy (by simpa using hx) def compact_height18_pair_20_base:CompactPair.Quadratic:=⟨(0xb2d05dff5 / 0x59682f000),(0x903e44fd / 0x3b9aca00),2⟩ def compact_height18_pair_20_hinges:List CompactPair.Hinge:=[⟨(-0x1cab4109 / 0xee6b2800),1, -3⟩,⟨(0x554d56f3 / 0xee6b2800),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-0x1fdd957d / 0x59682f000),2, -3⟩,⟨(-0x554d56f3 / 0xee6b2800),2, -1⟩,⟨(0x1fdd957d / 0x59682f000),3, -2⟩,⟨(0x1cab4109 / 0xee6b2800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_20 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_20_base compact_height18_pair_20_hinges x y def compact_height18_pair_20_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] private def zz1318:"s0526"="s0526":=by decide+kernel theorem compact_height18_pair_20_check : CompactPair.expressionCheckPSD compact_height18_pair_20_base compact_height18_pair_20_hinges 0 compact_height18_pair_20_cuts = true := by decide +kernel theorem compact_height18_pair_20_representation (x y:ℝ) : height18_pair_20 x y = CompactPair.expressionEval compact_height18_pair_20_base compact_height18_pair_20_hinges x y:=by rfl theorem height18_pair_20_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_20 x y:=by rw [compact_height18_pair_20_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_20_check hy (by simpa using hx) def compact_height18_pair_21_base:CompactPair.Quadratic:=⟨(0x3b9ac9fff / 0x1dcd65000),(0x12d / 0x7d),2⟩ def compact_height18_pair_21_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x165a0bc00),1, -3⟩,⟨(3 / 0xee6b2800),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x11e1a3000),2, -3⟩,⟨(-3 / 0xee6b2800),2, -1⟩,⟨(1 / 0x11e1a3000),3, -2⟩,⟨(1 / 0x165a0bc00),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_21 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_21_base compact_height18_pair_21_hinges x y def compact_height18_pair_21_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height18_pair_21_check : CompactPair.expressionCheckPSD compact_height18_pair_21_base compact_height18_pair_21_hinges 0 compact_height18_pair_21_cuts = true := by decide +kernel private def zz1319:"s0527"="s0527":=by decide+kernel theorem compact_height18_pair_21_representation (x y:ℝ) : height18_pair_21 x y = CompactPair.expressionEval compact_height18_pair_21_base compact_height18_pair_21_hinges x y:=by rfl theorem height18_pair_21_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_21 x y:=by rw [compact_height18_pair_21_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_21_check hy (by simpa using hx) def compact_height18_pair_22_base:CompactPair.Quadratic:=⟨2,(0x5a7336603 / 0x2540be400),2⟩ def compact_height18_pair_22_hinges:List CompactPair.Hinge:=[⟨(-1 / 5),1,3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_22 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_22_base compact_height18_pair_22_hinges x y def compact_height18_pair_22_cuts:List ℚ:=[] theorem compact_height18_pair_22_check : CompactPair.expressionCheckPSD compact_height18_pair_22_base compact_height18_pair_22_hinges 0 compact_height18_pair_22_cuts = true := by decide +kernel theorem compact_height18_pair_22_representation (x y:ℝ) : height18_pair_22 x y = CompactPair.expressionEval compact_height18_pair_22_base compact_height18_pair_22_hinges x y:=by rfl private def zz1320:"s0528"="s0528":=by decide+kernel theorem height18_pair_22_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_22 x y:=by rw [compact_height18_pair_22_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_22_check hy (by simpa using hx) def compact_height18_pair_23_base:CompactPair.Quadratic:=⟨(0x2cb417807 / 0x165a0bc00),(0x5a00c57f9 / 0x2540be400),2⟩ def compact_height18_pair_23_hinges:List CompactPair.Hinge:=[⟨(-0x199bd3 / 0x1dcd6500),1, -3⟩,⟨(0x19704b5 / 0x3b9aca00),1, -2⟩,⟨(0x48766e9d / 0xee6b2800),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-0x121d8847 / 0x2cb417800),2, -3⟩,⟨(0x6620a3 / 0x5f5e100),2, -1⟩,⟨(-0xd13d9cf / 0xee6b2800),3, -2⟩,⟨(-1 / 0x59682f00),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_23 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_23_base compact_height18_pair_23_hinges x y def compact_height18_pair_23_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_height18_pair_23_check : CompactPair.expressionCheckPSD compact_height18_pair_23_base compact_height18_pair_23_hinges 0 compact_height18_pair_23_cuts = true := by decide +kernel theorem compact_height18_pair_23_representation (x y:ℝ) : height18_pair_23 x y = CompactPair.expressionEval compact_height18_pair_23_base compact_height18_pair_23_hinges x y:=by rfl theorem height18_pair_23_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_23 x y:=by rw [compact_height18_pair_23_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_23_check hy (by simpa using hx) def compact_height18_pair_24_base:CompactPair.Quadratic:=⟨(0x2cb417801 / 0x165a0bc00),(0x1207c89fd / 0x77359400),2⟩ def compact_height18_pair_24_hinges:List CompactPair.Hinge:=[⟨(-0x334cb1d / 0x11e1a300),1, -3⟩,⟨(0x123bcea9 / 0xee6b280),1, -2⟩,⟨(0x53e892f7 / 0x1dcd6500),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-0x10c29219 / 0x1dcd6500),2, -3⟩,⟨(0x2d40514d / 0x77359400),2, -1⟩,⟨(-0x1fcbd36f / 0x59682f00),3, -2⟩,⟨(0x927703 / 0x47868c00),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_24 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_24_base compact_height18_pair_24_hinges x y def compact_height18_pair_24_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] private def zz1321:"s0529"="s0529":=by decide+kernel theorem compact_height18_pair_24_check : CompactPair.expressionCheckPSD compact_height18_pair_24_base compact_height18_pair_24_hinges 0 compact_height18_pair_24_cuts = true := by decide +kernel theorem compact_height18_pair_24_representation (x y:ℝ) : height18_pair_24 x y = CompactPair.expressionEval compact_height18_pair_24_base compact_height18_pair_24_hinges x y:=by rfl theorem height18_pair_24_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_24 x y:=by rw [compact_height18_pair_24_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_24_check hy (by simpa using hx) def compact_height18_pair_25_base:CompactPair.Quadratic:=⟨(0xbc8a70af / 0x59682f00),(0x1cb4a1fd / 0xbebc200),2⟩ def compact_height18_pair_25_hinges:List CompactPair.Hinge:=[⟨(-0x95 / 0x2cb417800),1, -3⟩,⟨(0xb1 / 0x5f5e1000),1, -2⟩,⟨(0x3bd / 0x77359400),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-0x7b / 0x77359400),2, -3⟩,⟨(0x33e06807 / 0xee6b2800),2, -1⟩,⟨(-0x33e06f69 / 0x59682f000),3, -2⟩,⟨(-0x2980511 / 0x23c34600),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_25 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_25_base compact_height18_pair_25_hinges x y def compact_height18_pair_25_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_height18_pair_25_check : CompactPair.expressionCheckPSD compact_height18_pair_25_base compact_height18_pair_25_hinges 0 compact_height18_pair_25_cuts = true := by decide +kernel private def zz1322:"s052a"="s052a":=by decide+kernel theorem compact_height18_pair_25_representation (x y:ℝ) : height18_pair_25 x y = CompactPair.expressionEval compact_height18_pair_25_base compact_height18_pair_25_hinges x y:=by rfl theorem height18_pair_25_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_25 x y:=by rw [compact_height18_pair_25_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_25_check hy (by simpa using hx) def compact_height18_pair_26_base:CompactPair.Quadratic:=⟨2,(0x5a7336603 / 0x2540be400),2⟩ def compact_height18_pair_26_hinges:List CompactPair.Hinge:=[⟨(-1 / 5),1,3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_26 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_26_base compact_height18_pair_26_hinges x y def compact_height18_pair_26_cuts:List ℚ:=[] theorem compact_height18_pair_26_check : CompactPair.expressionCheckPSD compact_height18_pair_26_base compact_height18_pair_26_hinges 0 compact_height18_pair_26_cuts = true := by decide +kernel theorem compact_height18_pair_26_representation (x y:ℝ) : height18_pair_26 x y = CompactPair.expressionEval compact_height18_pair_26_base compact_height18_pair_26_hinges x y:=by rfl private def zz1323:"s052b"="s052b":=by decide+kernel theorem height18_pair_26_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_26 x y:=by rw [compact_height18_pair_26_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_26_check hy (by simpa using hx) def compact_height18_pair_27_base:CompactPair.Quadratic:=⟨(0x59682f00d / 0x2cb417800),(0x5a00c5803 / 0x2540be400),2⟩ def compact_height18_pair_27_hinges:List CompactPair.Hinge:=[⟨(-0x1d40a3b / 0x3b9aca00),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x2cb417800),2, -3⟩,⟨(-0x1d40a3ad / 0x1dcd65000),2, -1⟩,⟨(0x2ecdd2b / 0x8f0d1800),3, -2⟩,⟨(0x3a81475 / 0x165a0bc00),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_27 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_27_base compact_height18_pair_27_hinges x y def compact_height18_pair_27_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2)] theorem compact_height18_pair_27_check : CompactPair.expressionCheckPSD compact_height18_pair_27_base compact_height18_pair_27_hinges 0 compact_height18_pair_27_cuts = true := by decide +kernel theorem compact_height18_pair_27_representation (x y:ℝ) : height18_pair_27 x y = CompactPair.expressionEval compact_height18_pair_27_base compact_height18_pair_27_hinges x y:=by rfl theorem height18_pair_27_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_27 x y:=by rw [compact_height18_pair_27_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_27_check hy (by simpa using hx) def compact_height18_pair_28_base:CompactPair.Quadratic:=⟨(0x996319793 / 0x6fc23ac00),(0x18f8d93d3 / 0x12a05f200),(0x4199489 / 0x3b9aca0)⟩ def compact_height18_pair_28_hinges:List CompactPair.Hinge:=[⟨(0x2f775001 / 0x6fc23ac00),1, -3⟩,⟨(-0x4199489 / 0x2540be40),1,3⟩,⟨(0x16b8721 / 0x77359400),2, -3⟩,⟨(-0x16b8721 / 0x77359400),3, -2⟩,⟨(-0x2f775001 / 0x6fc23ac00),3, -1⟩,⟨(-0x4199489 / 0x2540be40),3,1⟩] noncomputable def height18_pair_28 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_28_base compact_height18_pair_28_hinges x y def compact_height18_pair_28_cuts:List ℚ:=[(1 / 3),(2 / 3),(3 / 2),3] private def zz1324:"s052c"="s052c":=by decide+kernel theorem compact_height18_pair_28_check : CompactPair.expressionCheckPSD compact_height18_pair_28_base compact_height18_pair_28_hinges 0 compact_height18_pair_28_cuts = true := by decide +kernel theorem compact_height18_pair_28_representation (x y:ℝ) : height18_pair_28 x y = CompactPair.expressionEval compact_height18_pair_28_base compact_height18_pair_28_hinges x y:=by rfl theorem height18_pair_28_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_28 x y:=by rw [compact_height18_pair_28_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_28_check hy (by simpa using hx) def compact_height18_pair_29_base:CompactPair.Quadratic:=⟨(0x7d000085d / 0x6fc23ac00),(0x18bfa0d4b / 0x12a05f200),(0x4199489 / 0x3b9aca0)⟩ def compact_height18_pair_29_hinges:List CompactPair.Hinge:=[⟨(0x2ab75ec3 / 0xdf8475800),1, -3⟩,⟨(-0x111625d7 / 0x1dcd65000),1, -2⟩,⟨(-0x4199489 / 0x2540be40),1,3⟩,⟨(0x2d9064d / 0x1dcd65000),2, -3⟩,⟨(0x111625d7 / 0x1dcd65000),2, -1⟩,⟨(-0x2d9064d / 0x1dcd65000),3, -2⟩,⟨(-0x2ab75ec3 / 0xdf8475800),3, -1⟩,⟨(-0x4199489 / 0x2540be40),3,1⟩] noncomputable def height18_pair_29 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_29_base compact_height18_pair_29_hinges x y def compact_height18_pair_29_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height18_pair_29_check : CompactPair.expressionCheckPSD compact_height18_pair_29_base compact_height18_pair_29_hinges 0 compact_height18_pair_29_cuts = true := by decide +kernel private def zz1325:"s052d"="s052d":=by decide+kernel theorem compact_height18_pair_29_representation (x y:ℝ) : height18_pair_29 x y = CompactPair.expressionEval compact_height18_pair_29_base compact_height18_pair_29_hinges x y:=by rfl theorem height18_pair_29_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_29 x y:=by rw [compact_height18_pair_29_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_29_check hy (by simpa using hx) def compact_height18_pair_30_base:CompactPair.Quadratic:=⟨2,(0x169ccd981 / 0x9502f900),2⟩ def compact_height18_pair_30_hinges:List CompactPair.Hinge:=[⟨(-1 / 5),1,3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_30 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_30_base compact_height18_pair_30_hinges x y def compact_height18_pair_30_cuts:List ℚ:=[] theorem compact_height18_pair_30_check : CompactPair.expressionCheckPSD compact_height18_pair_30_base compact_height18_pair_30_hinges 0 compact_height18_pair_30_cuts = true := by decide +kernel theorem compact_height18_pair_30_representation (x y:ℝ) : height18_pair_30 x y = CompactPair.expressionEval compact_height18_pair_30_base compact_height18_pair_30_hinges x y:=by rfl private def zz1326:"s052e"="s052e":=by decide+kernel theorem height18_pair_30_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_30 x y:=by rw [compact_height18_pair_30_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_30_check hy (by simpa using hx) def compact_height18_pair_31_base:CompactPair.Quadratic:=⟨(0xb2d05dff5 / 0x59682f000),(0x2d0062c07 / 0x12a05f200),2⟩ def compact_height18_pair_31_hinges:List CompactPair.Hinge:=[⟨(-1 / 0x1dcd65000),1, -2⟩,⟨(1 / 0xee6b2800),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(1 / 0x2cb417800),2, -3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_31 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_31_base compact_height18_pair_31_hinges x y def compact_height18_pair_31_cuts:List ℚ:=[1,(3 / 2),2] theorem compact_height18_pair_31_check : CompactPair.expressionCheckPSD compact_height18_pair_31_base compact_height18_pair_31_hinges 0 compact_height18_pair_31_cuts = true := by decide +kernel theorem compact_height18_pair_31_representation (x y:ℝ) : height18_pair_31 x y = CompactPair.expressionEval compact_height18_pair_31_base compact_height18_pair_31_hinges x y:=by rfl theorem height18_pair_31_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_31 x y:=by rw [compact_height18_pair_31_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_31_check hy (by simpa using hx) def compact_height18_pair_32_base:CompactPair.Quadratic:=⟨(0x5eb344823 / 0x4a817c800),(0x6e566a39 / 0x4a817c80),(0x4199489 / 0x3b9aca0)⟩ def compact_height18_pair_32_hinges:List CompactPair.Hinge:=[⟨(0x28eeee29 / 0x12a05f200),1, -3⟩,⟨(-0x777ec91b / 0xee6b2800),1, -2⟩,⟨(-0x4199489 / 0x2540be40),1,3⟩,⟨(-0xebe9f / 0x77359400),2, -1⟩,⟨(0x3ed393b / 0x1dcd6500),3, -2⟩,⟨(-0x4199489 / 0x2540be40),3, -1⟩,⟨(-0x4199489 / 0x2540be40),3,1⟩] noncomputable def height18_pair_32 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_32_base compact_height18_pair_32_hinges x y def compact_height18_pair_32_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),2,3] private def zz1327:"s052f"="s052f":=by decide+kernel theorem compact_height18_pair_32_check : CompactPair.expressionCheckPSD compact_height18_pair_32_base compact_height18_pair_32_hinges 0 compact_height18_pair_32_cuts = true := by decide +kernel theorem compact_height18_pair_32_representation (x y:ℝ) : height18_pair_32 x y = CompactPair.expressionEval compact_height18_pair_32_base compact_height18_pair_32_hinges x y:=by rfl theorem height18_pair_32_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_32 x y:=by rw [compact_height18_pair_32_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_32_check hy (by simpa using hx) def compact_height18_pair_33_base:CompactPair.Quadratic:=⟨(0x1b0351dbef / 0x1bf08eb000),(0x19a175e77 / 0x12a05f200),(0x4199489 / 0x3b9aca0)⟩ def compact_height18_pair_33_hinges:List CompactPair.Hinge:=[⟨(0x81dfbded / 0x4a817c800),1, -3⟩,⟨(-0x2771acef / 0x77359400),1, -2⟩,⟨(-0x1bff669 / 0xee6b280),1, -1⟩,⟨(-0x4199489 / 0x2540be40),1,3⟩,⟨(0x291e4d9f / 0x2cb417800),2, -3⟩,⟨(-0xf3c422d / 0x3b9aca00),2, -1⟩,⟨(0x69200b37 / 0x59682f000),3, -2⟩,⟨(0x780a81a9 / 0x6fc23ac00),3, -1⟩,⟨(-0x4199489 / 0x2540be40),3,1⟩] noncomputable def height18_pair_33 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_33_base compact_height18_pair_33_hinges x y def compact_height18_pair_33_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_height18_pair_33_check : CompactPair.expressionCheckPSD compact_height18_pair_33_base compact_height18_pair_33_hinges 0 compact_height18_pair_33_cuts = true := by decide +kernel private def zz1328:"s0530"="s0530":=by decide+kernel theorem compact_height18_pair_33_representation (x y:ℝ) : height18_pair_33 x y = CompactPair.expressionEval compact_height18_pair_33_base compact_height18_pair_33_hinges x y:=by rfl theorem height18_pair_33_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_33 x y:=by rw [compact_height18_pair_33_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_33_check hy (by simpa using hx) def compact_height18_pair_34_base:CompactPair.Quadratic:=⟨(0x59682ef09 / 0x2cb417800),(0x1207c89fd / 0x77359400),2⟩ def compact_height18_pair_34_hinges:List CompactPair.Hinge:=[⟨(-0x817d174b / 0x2cb417800),1, -3⟩,⟨(0x205f45bd7 / 0x1dcd65000),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-0x205f45b29 / 0x59682f000),2, -3⟩,⟨(-0x205f45bd7 / 0x1dcd65000),2, -1⟩,⟨(0x205f45b29 / 0x59682f000),3, -2⟩,⟨(0x817d174b / 0x2cb417800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_34 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_34_base compact_height18_pair_34_hinges x y def compact_height18_pair_34_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height18_pair_34_check : CompactPair.expressionCheckPSD compact_height18_pair_34_base compact_height18_pair_34_hinges 0 compact_height18_pair_34_cuts = true := by decide +kernel theorem compact_height18_pair_34_representation (x y:ℝ) : height18_pair_34 x y = CompactPair.expressionEval compact_height18_pair_34_base compact_height18_pair_34_hinges x y:=by rfl private def zz1329:"s0531"="s0531":=by decide+kernel theorem height18_pair_34_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_34 x y:=by rw [compact_height18_pair_34_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_34_check hy (by simpa using hx) def compact_height18_pair_35_base:CompactPair.Quadratic:=⟨(0x77359401 / 0x3b9aca00),(0x11f0e53f9 / 0x77359400),2⟩ def compact_height18_pair_35_hinges:List CompactPair.Hinge:=[⟨(1 / 0x2cb417800),1, -3⟩,⟨(1 / 0xee6b2800),1, -2⟩,⟨(-1 / 5),1,3⟩,⟨(-1 / 0x2cb417800),2, -3⟩,⟨(-1 / 0xee6b2800),2, -1⟩,⟨(1 / 0x2cb417800),3, -2⟩,⟨(-1 / 0x2cb417800),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_35 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_35_base compact_height18_pair_35_hinges x y def compact_height18_pair_35_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height18_pair_35_check : CompactPair.expressionCheckPSD compact_height18_pair_35_base compact_height18_pair_35_hinges 0 compact_height18_pair_35_cuts = true := by decide +kernel theorem compact_height18_pair_35_representation (x y:ℝ) : height18_pair_35 x y = CompactPair.expressionEval compact_height18_pair_35_base compact_height18_pair_35_hinges x y:=by rfl theorem height18_pair_35_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_35 x y:=by rw [compact_height18_pair_35_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_35_check hy (by simpa using hx) def compact_height18_pair_36_base:CompactPair.Quadratic:=⟨2,(0x169ccd981 / 0x9502f900),2⟩ def compact_height18_pair_36_hinges:List CompactPair.Hinge:=[⟨(-1 / 5),1,3⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_36 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_36_base compact_height18_pair_36_hinges x y def compact_height18_pair_36_cuts:List ℚ:=[] private def zz1330:"s0532"="s0532":=by decide+kernel theorem compact_height18_pair_36_check : CompactPair.expressionCheckPSD compact_height18_pair_36_base compact_height18_pair_36_hinges 0 compact_height18_pair_36_cuts = true := by decide +kernel theorem compact_height18_pair_36_representation (x y:ℝ) : height18_pair_36 x y = CompactPair.expressionEval compact_height18_pair_36_base compact_height18_pair_36_hinges x y:=by rfl theorem height18_pair_36_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_36 x y:=by rw [compact_height18_pair_36_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_36_check hy (by simpa using hx) def compact_height18_pair_37_base:CompactPair.Quadratic:=⟨(0x59682ede3 / 0x2cb417800),(0x168031601 / 0x9502f900),2⟩ def compact_height18_pair_37_hinges:List CompactPair.Hinge:=[⟨(0x193a4e37 / 0xee6b2800),1, -3⟩,⟨(-0x25d7c183 / 0x77359400),1, -2⟩,⟨(-0x407337 / 0x1dcd6500),1, -1⟩,⟨(-1 / 5),1,3⟩,⟨(0x25d918dd / 0x2cb417800),2, -3⟩,⟨(-0x7fd525 / 0x1dcd6500),2, -1⟩,⟨(0x66651d / 0x47868c00),3, -2⟩,⟨(0x7fbbe3 / 0xb2d05e00),3, -1⟩,⟨(-1 / 5),3,1⟩] noncomputable def height18_pair_37 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_37_base compact_height18_pair_37_hinges x y def compact_height18_pair_37_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),1,(3 / 2),2,3] theorem compact_height18_pair_37_check : CompactPair.expressionCheckPSD compact_height18_pair_37_base compact_height18_pair_37_hinges 0 compact_height18_pair_37_cuts = true := by decide +kernel private def zz1331:"s0533"="s0533":=by decide+kernel theorem compact_height18_pair_37_representation (x y:ℝ) : height18_pair_37 x y = CompactPair.expressionEval compact_height18_pair_37_base compact_height18_pair_37_hinges x y:=by rfl theorem height18_pair_37_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_37 x y:=by rw [compact_height18_pair_37_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_37_check hy (by simpa using hx) def compact_height18_pair_38_base:CompactPair.Quadratic:=⟨(0x7aff680f / 0x6fc23ac0),(0x18f8d945b / 0x12a05f200),(0x4199489 / 0x3b9aca0)⟩ def compact_height18_pair_38_hinges:List CompactPair.Hinge:=[⟨(1 / 0x37e11d600),1, -3⟩,⟨(-0x4199489 / 0x2540be40),1,3⟩,⟨(-1 / 0x37e11d600),3, -1⟩,⟨(-0x4199489 / 0x2540be40),3,1⟩] noncomputable def height18_pair_38 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_38_base compact_height18_pair_38_hinges x y def compact_height18_pair_38_cuts:List ℚ:=[(1 / 3),3] theorem compact_height18_pair_38_check : CompactPair.expressionCheckPSD compact_height18_pair_38_base compact_height18_pair_38_hinges 0 compact_height18_pair_38_cuts = true := by decide +kernel theorem compact_height18_pair_38_representation (x y:ℝ) : height18_pair_38 x y = CompactPair.expressionEval compact_height18_pair_38_base compact_height18_pair_38_hinges x y:=by rfl private def zz1332:"s0534"="s0534":=by decide+kernel theorem height18_pair_38_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_38 x y:=by rw [compact_height18_pair_38_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_38_check hy (by simpa using hx) def compact_height18_pair_39_base:CompactPair.Quadratic:=⟨(0x51ff9ab21 / 0x4a817c800),(0x18bfa0d5b / 0x12a05f200),(0x4199489 / 0x3b9aca0)⟩ def compact_height18_pair_39_hinges:List CompactPair.Hinge:=[⟨(-1 / 0xdf847580),1, -3⟩,⟨(1 / 0x1dcd65000),1, -2⟩,⟨(-0x4199489 / 0x2540be40),1,3⟩,⟨(1 / 0x59682f000),2, -3⟩,⟨(-1 / 0x1dcd65000),2, -1⟩,⟨(-1 / 0x59682f000),3, -2⟩,⟨(1 / 0xdf847580),3, -1⟩,⟨(-0x4199489 / 0x2540be40),3,1⟩] noncomputable def height18_pair_39 (x y:ℝ):ℝ := CompactPair.expressionEval compact_height18_pair_39_base compact_height18_pair_39_hinges x y def compact_height18_pair_39_cuts:List ℚ:=[(1 / 3),(1 / 2),(2 / 3),(3 / 2),2,3] theorem compact_height18_pair_39_check : CompactPair.expressionCheckPSD compact_height18_pair_39_base compact_height18_pair_39_hinges 0 compact_height18_pair_39_cuts = true := by decide +kernel theorem compact_height18_pair_39_representation (x y:ℝ) : height18_pair_39 x y = CompactPair.expressionEval compact_height18_pair_39_base compact_height18_pair_39_hinges x y:=by rfl theorem height18_pair_39_nonneg {x y:ℝ} (hx:0 ≤ x) (hy:0 ≤ y) : 0 ≤ height18_pair_39 x y:=by rw [compact_height18_pair_39_representation] exact CompactPair.expressionCheckPSD_sound compact_height18_pair_39_check hy (by simpa using hx) end Green24Proof.LocalPairs private def zz2359:"s0937"="s0937":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l5 l51 l54 l55 l56 l58 l6 l60 l61 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x51bb1798e, -0x547044420, -0x7eb3d8322,0x3b560eb4], ![-0x547044420, -0xf68381486,0x1a17b4332,0x5eccff5c0], ![-0x7eb3d8322,0x1a17b4332, -0x2256e81a2b,0x549e0b026], ![0x3b560eb4,0x5eccff5c0,0x549e0b026, -0x2a4393d10]] noncomputable def hinges:Hinges:=[(-0x2387916,l6),(0x10179ca8,l5),(-0x7c240992,l4),(-0x92dafd0,l9),(-0x174095cd6,l8),(0x7592ae97,l11),(0x401ba984,l10),(0x89320e280,l14),(-0x709096ffe,l13),(-0x169bdb3c8,l17),(0x24416a153,l16),(0x78ee6b9d2,l15),(-0xa56e7109,l21),(0x709096ffe,l20),(0x52b73885,l23),(-0x1bb201919,l22),(-0x2a4393d10,l27),(0xa56e7109,l28),(0x2a4393d10,l29),(-0x89320e280,l25),(0x281627cf2,l30),(0x2a4393d10,l33),(-0x401ba984,l38),(-0x2a4393d10,l35),(0x174095cd6,l36),(0x2a4393d10,l37),(0x7c240992,l34),(-0x281627cf2,l43),(0x1bb201919,l42),(-0x78ee6b9d2,l41),(0x6139aef4,l46),(-0xf56404e0,l45),(0x2a4393d10,l51),(-0x7592ae97,l55),(-0x10179ca8,l54),(-0x24416a153,l56),(0xf56404e0,l58),(0x92dafd0,l61),(0x2387916,l60),(-0x52b73885,l63),(0x169bdb3c8,l62),(-0x6139aef4,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(0x89320e280,l14),(-0x89320e280,l25),(-0x2a4393d10,l27),(0x2a4393d10,l29),(0x2a4393d10,l33),(-0x2a4393d10,l35),(0x2a4393d10,l37),(0x2a4393d10,l51),(-0x709096ffe,l13),(0x709096ffe,l20),(0x281627cf2,l30),(-0x281627cf2,l43),(0x78ee6b9d2,l15),(-0x78ee6b9d2,l41),(-0x169bdb3c8,l17),(0x169bdb3c8,l62),(0x24416a153,l16),(-0x24416a153,l56),(-0xa56e7109,l21),(0xa56e7109,l28),(-0x1bb201919,l22),(0x1bb201919,l42),(-0x174095cd6,l8),(0x174095cd6,l36),(0x7592ae97,l11),(-0x7592ae97,l55),(-0xf56404e0,l45),(0xf56404e0,l58),(0x52b73885,l23),(-0x52b73885,l63),(0x6139aef4,l46),(-0x6139aef4,l64),(0x401ba984,l10),(-0x401ba984,l38),(-0x7c240992,l4),(0x7c240992,l34),(-0x92dafd0,l9),(0x92dafd0,l61),(0x10179ca8,l5),(-0x10179ca8,l54),(-0x2387916,l6),(0x2387916,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x2904180d9180a0000055083027230140000000000a80e4010000000108640d8c030000000002c2819802000188430c80bc4010000000c8b0501680101821030c20179100600000001624181a002000006c220901e400c0000000090680a601000000000121c0cc0100000000221c0498040000000000070320040000110742607680180000001387004cc030000000210e009980600000004a1a00b300c0000009019002660200000000120e01cc0200000000001c029004000000410cc0a9301000000840c603646028000011418c09c8c050000000000220390040000000004d00a200c0000000001380c40100000000002601480200000000004a0310040000000000940e2008000000000ae01640180000000015002c8030000000002a80990060000000000a4072008000000000022064008000001f15090290020000003b06603c1808000000720c4058301000000000d82812601000000001a09018c0200000002b0e8051806000000005c3c06300800000000b8700a60100000000170d018c020000ba198240192008000003c844004930140002e8620900648020000001643100c8c0400000000002e02900400000037090029301000000710840052602800000f410800a4c050000001c04400c98080000000038280730080000000005c01240180000000001201480200000000012004900600000000017013200c00000000000a0640080000000005402c80300000000001205900400000000028303300400000008c2e02660180000000028004c804,0x52210901b20060000000000480d200800000000b8701a601000000000002c0c8010000004a241206a0040000000048240d300800908c1084055e80280000002788806cc0300000004c1100d98060000000058240d30081010c18a1010ae803000a60c21040a49005001461882100d9200a0028c32845027240140000000642202c6018000000001540288030000000000560310040000000000940720080000139086005260280000000250b01cc02000004c0218014980a000000950980293010000000000ba01440180000000002f01880200000000005c0290040000000000b406200b091654512059a4803e062c38a0c073490070000005286c01498080000000006700b200c000000000c801640180000000019404c8030000000000620390041124c24b180963401822198196100c4680300000000003e01480200000000000f8190020000000000f409200b4d9860112079e2803e89304020c09dc500700000000008e03100400000000011406200800000000004e0640084893493060258d00609066866040311a00c0000000000d40920080000000148780e60100000000000240c80100000000005a07100400000008e1a01b300c0000001103403660180007214c4202f1004038428620402f2200c000188430c807a40100000000005e02640180000000001502c8020000000001680590060000000016001320100000000000b00e4010000000000050188020000000291081b18060028c4086102af4014000000000d0e066008000001444302a4c04,0x221c0598040000004509006b3010000009308400d66028000013c10801acc050000002404401d98080000004209809b3010000000881600f660200000001107002cc0300000000000681900200000002609024300c00000000c8280e601000000000b05028c02000000000034029004002943902c013a40140000000005a014401800000000017018802000000033128051806000000006c4c06300800000000d8900a601000000001b11018c0200000264320024980a0000006910403230100000000000d80a40100000011c3400a4c0400000244310014980a000004d06200293014000000901900326020000000000d802480300000000160e051804000005a02300273014000000ba09802e60200000166098011cc0500000002e058079806000000540640373010000000be0a00ce60200000016c1900dcc0400000002d0700b98060000000520c037300c000000b609006e60200000164088019cc0500000002c0500f98060000000000640d20080000000000681c401000000104350318c04000000000012031004090870c60808574018000000e2318152602000001c830c06c8c05000003a8618139180a0000000000740720080000000088681460100008218c5202f1004040430628402f2200c0000000000740920080000000000f00a401000000000906018c0200000622d05819a00600000000000f0320040000000178901c601000000002d12038c0200000540218013180a00000000002c0620080000015411802c60200000000290b01cc02,0x26031004000000342c180f40080000001348206860180000000090702cc02000000004a0a051804005d4a1067025440140000000000780a4010000002841b03e0c040000000590b80b98060000000000280720080000000128a814601000000000015018802050c40238206d2200c0000000074440a300800930e118204a4802800003919868099003048c382302049b200c0000000058440e30080000000000a81c4010000002a15060390020000000291081118060000000054180e300800000000a8881460100000000016240cc010000000440c80518060000000088340630080000000008e02640180000000b0e0c0d0010000000002280590060000000022001320100000000001100e4010000711903301b10040000004a241602a00400000000482c05300800000008c1c0186018000000000070248020000000210700e1806000000a320408930101230e08c081b4880300000000190d028c0200000000000a8190020002987118406c40100000001043405a6018000002043702bcc04000000498e204498080000000054240a300800830c114204a480280000029150902d00200000983114813200600001286229016400c1030c08a08126c8030000002611050290020000066291080f20060000000008870330040000000000680c4010000841583901590040000000000420590040000000074280d30080000000000501a40100000001c848084c030000000001481e900600000000742409300800000000f04812601000000000009024802,0x981882e06220080000098320b034400c00000000090606600800000384830298c0400000000724e039804000000d208c0a73010000001625180d06020000000318c4098c030000000391881a180600000e4622c034400c00000001084814601000000210e09029002000000005a2a049804000000b464540f400800000000d8700c60100000000220d038c020000000190881918060000000000240e200800001486812044801800000000021024802000000001a0c071804000000000088052008000000044120446018000310901303310040001381e04203c20080000f02106809c40100004a0681080f080200003c0841400f10040000001082801e180800000000003c06200800a61212020498802800000001d05028c020001042083002a20080002087304c08440100000210e41204880180000000250f014c020000000004c381980200000000001c052008000430c218810c802000004218834049003000000001a140298040000000000280520080000000150a81c6010000000000290248020000000000540290040000000000740d2008000000e43081286020000001c86303d0c04000000000032071004000000006c180e3008000000c609012460200000000003102480200000000000c8190020000000000c805200800000000171e0660080000000000701880200000000340e0318040000000074340a300800000000e87814601000000001505028c02000000002a0e0518040000000000440e200800000001a8e81260100000035211d03d002,0x820490040000000000210320040000000002100a401000000422e1101900200000000865c02980400000000000303200400003614c54034801800000362b160390020000006a562c06a00400000000ac580e30080000000001481c401000006c298a80a90030000006a542c04a00400001a8a62a02a400c00000014444054601800000002912018c0200000003654581a002000000d8a4540540080000000015160660080000000003102c8020000000003280590060000000032001320100000000001900e4010000000000ec0348030000ce2a83205ca00800000000068b03300400000000c8b0166010000001944401acc040000034c410035980a000006f082006b3014000000d021007660200000018846026cc040000003209803d98080000000642c00b300c0000000000301a401000000820c40c18c050000001082a0631808000000000014092008000000e42080f0602028120318102159006000000524a1603200400000000001303200400a092b182026480280000018c3202e8c040000003086803d1808000000000889033004000488e628817680200000027210701d002000122440a2034a0080002448514403940101208e18a080b42803000000001d05034c020000e42186403d20080000003305404930100000000090281c6010000000000160148020000000210c81a180600000000582c06300800000015042034601800000002a11038c02000000005222069804000000004c180e300800002a08c140548018000052118280a9003,0x34281980200000000002c052008000000e22b8190602000004915054049003000000029108191806000000004c280e300800000086110124602000000003a1d038c0200000000007204900400000000001d0320040000000001d00a401000000000464c0cc01000000006a2a05180400000000d45c0a300800000001686814601000000002d0f028c0200000000420a051804000000911dc0c830100000000190a81c6010000049148240a90030000e22a02a07320080000000000840e2008000318881a00f4802000000010864088c030000c22186604d20080000000740900e300c0000000110f80c60100000000211e018c0200000000423e05180400000000007406200800001c8a8180548018000000238fc098c030000000411c813180600000008a3d016300c0000001107801660180000000211d01cc020000008c64220320040000000118cc0530080000288c41a014801800000001906018c0200000000521a051804000000b4a81c0a4008000000014838146010000a118c3102d100400000a2310c81620060000144661901c400c000001c848381480100010234c7503a100400000000820c0298040000000b21901c300c000598e8198128802000000034824070c030001a62a02604a200800810d3025024b4014000000204f2068601800000001709014c020000005a1a0c072004000000003c2405300800000000f0c81c60100000000001d0388020000000391881118060000000074640a3008000000000f1a06600800000004225038c02,0x342a039804000006d88400cb301400000114088028602000000023024030c030000000440480518060000000840900c300c00000011c2201660180000002102c070c030000000042120398040000008a08401630100000110082004c602800000022044038c0300000061902044980800001248612026400c00920e318603a480280000000250d028c020000ee2983202c2008000006188301d03014000015c18604fc6028000002986100e8c04000003044080a8180a000000711440ea301000000000002e06400800002d838404ccc050000002986806f1808000000510d809e3010000001c8f0580a801000000001e0b014c020000000290c80a18060000cc230580884010000188420d01108020000000188b40c8c0300000000002c069004000000611540823010000000420881506020000000188ac088c0300000000322c04980400000000005409200800000000f0d80c601000000001d1a018c02000000003a36051804000000000064062008000000d888481c80100000001f8dc098c0300000001a14181a00200000007231026300c0000000f46a02c60180000001e0d002cc03000000003a3203980400000718a301d03014000017c1c604fc602800001c22840540c050000040c288049180a000000811840ea30100000001a4ca0686018000002c41b03e0c0400000000522a0518040000000094840a30080000000000980a40100000025220702900200000000420e0518040000000034180530080000000000300a40100000000190b014c02,0x1842080a8180a00000008239036300c000000821881d460200000001c8c4090c030000038c63810c180a0000007119408830100000000000c80e40100000001516240d0010000000110480a180600001284a1f01b400c0000000050301e601000000001a05014c020000000003418198020000000064180930080000000dc1802660180000001883004cc0300000003505005980600000068048013301000000000d0300e6010000000001301e08040000000002e01c1008000000000440582010000000000a80304020000000a01700e0c040000002c02603c1808000005188301d03014000001b908580e8010000023828c09f8c05000000430a201d1808000005088101503014000000c22881d460200000039250f019002000004b0608099980a0000124723103f400c00000000c8481460100000000022340cc01000000003a0e0298040000000000b409200800000008432028601800001c421c0ba8c050001023186205da0080000000000380d200800000000a8781a601000000000161c0cc0100000000001a04900400000003615024300c00000630a204106028000000cc290220c040000001d02601f18080000003804401e30100002707409807c8020000000cc290110c040000721703a06620080000cc280740cc40100000000007207a4018000000000f00748030000000001e80f90060000000004500a200c0000000001180c4010000000000b00748030000000001580690060000006814401330100000000d45201660180000001b8a804cc03,0x322a051804000000000124092008000809e4608132802002013c4604096d0050000020c3180e8180a000004086101503014000001a890481a8010000018210c0d48c0500000006f1100d98060000000d82201b300c0000000001c80e401000000391f1603d0020000e23085202d20080000000005830330040000000ac12046601d82200882409cd10070000072210901b2006000000511040ea301000000000f0481a601000072144210221004038c28e10e0418200c0038852845021040140000000a42202c60180000000c844050c030000000002780990060000000000940b20080000000009a01640180000000098004c80400000000004c03900400000008239024300c00001031ce0430602800000204750220c040000030c5180e8180a00000608a101503014000000001980f040200000000031016080400000000002a069004000005306f023030140000009410806660200000000009802480300000b4291081220060003086314c0c84010008904505a03188028000860941d03310040011a19426006c200a0000000003500a200c0000000000d80c40100001600c30012cc06000002d4318015980a000005f866004b3014000000b41980366020000001603900ecc040000000341780998060000059869006b3014000000b21b005660200000001a0a404cc0300000003216805980600000062160013301000000000d0b00e6010000000000d002480300000003a0580e180600000007231036300c000006308603a06028000002d1a1602d002,0xda026401800000000008c0c80100000000008a0590040003c4e22c4099401000f09c22c204b68028000000000450248020001c25908204ca00800704b1081025b4014000000000be01640180000000017002c8030000000002e80990060000000000b407200800000019c3403660180000003206806cc0300000000006a039004060c50c278042040180004a0ca298190802018514509201081006], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((((((((0x514210e76d438848335386082800fee603811d8b64e4300156033dc2004a38400102910994182ca08165000bd2847df979ded930cb839bd49edc40eb4f870c1a80d8a47cc6d7550fd993134a2ac3fd104c8dd9d980eae50c6710887971e78ae8f0c104e2d7c61aea6975119188dbce0d577286002171c075b4ea72683b2f4d32dd059c9e074d1b3526c819fd6c6d9607e573d732200d60e507da48eb677e0b5fd28e518811900bf82fcf9644d5fe0f3809637293186c3fea24f9009205655653c22f0121a8c2000adf88260260c2200814704ca3417cfa550c4d46381f2ba65c2be07bb303c29a28a241088e908904082700100064300401b3440f8c9db42288a14fd68a2cb00b71b0044111915db3e9210aa22a67d0208466ec72a500002dc6c00900082d5acc4600076ac1d68190c230040000e718a247ea01b5082398f47d5d24224cc173584440645ec61c90402217876d004039ff6d10208b5fc98e83800008975b010004ce30e00a4108c021658089544030208da9c1742aa90881636eed412081b865749028081dab075a04410ff2c84f1c802000f422b401041cd2a049fa800022551000312084e0280001f125201228f05000200900071d3e7826166b4f0c340bb45ba820112eb22e241e09bed0e8b61c0806339412920811ddaf098400044fe3dece004801028e0194680f9f4aa189a8c703e574cb857c0f766078504103c71d10d00d008e08d00100c82008036080e3d8b8f328a00b71b00438f1e933978d10cc103082a201182110f683c2000f422b45040ed583ad11040838d9bb2600016e36003208460080001ca20005f246d43436c121b7050002771000da638603f22b0210f1063bf0d7e034436e26700e820435e27d0ac041de7cf9e588f007f5fdad8434008890485948002430fd1f20402036fca545440372404c0280001f520f803e3529e535221f31c1ff2c09c333ca480035863d24081b00814600fcfc50eac0a8f3808a66d3d186709ce4b310052c82bc6a3c12e28e6a981000ac632209800880205160328a01c10d75e8dfe903c0b6df3e91c7c4f50b2b1109c8cf462840224d2c0f6cd000040c69f04004d8ea7c49c10880210419f9864c71a07800e4e088c4cd002155727a996000cc68208a28010aab95b0e3f3015a34214c506f747599a80a1d733f95a910987638efee1e904270140000f9100037320009da785c27a35e10a20390daee04137d54b2cc3842450c9c20825310a9e3a0011b37bf98e021df3e6ec48001be6716100201ca8a22864408401000037a7c904f588766e0c2433efe5495d18623dd1a31dc050cc040886f9a0c3a546bd83810d080afe10c64430118195c5ae3ce002ce778f57030015f54239a8d408048a1501200008609448c8a205450e222860d00051e9001e242044232850d94204f47001b59a0b03880069307710d0409cfbc06c920848bb590cb041a974badebc380180725619860001d68cee4060002f7f6f0444a4081380a0a0c16504032810194000c9fc0723c042a1b1879e197f87a440b01147fd80c36f073637920006d43a8e92841080409f8070418a1d5815207808a66d3d1c79550c98f08824b20af1a90045c51cd5302000ac6322098008c0204fa0327c01c516baf46ff48a002db7cfa4822fdf3732c2411c8cf46284421269607b6700001031a7c10009b1d4f893821180428a00000000308a2c048b713ea88000b71b0008a001ba219462840466cd12e889021a0eabd29047f1df5df729048e9f058b20610129444df864821300800007a08001b810004f13e6003e48ff3e801b3d55b842889bd505f49ab4ff7c95a9e48ace3a041155241cc33e544e45c60e81c4d76edaf881edadbf7a680287f0c34215184f3e6f7582003dcff2d39b294332a9b9d00c36638e2d710003dd8d927e3a38eac84fd1cdac062a84d6eedd3bb72cfca118186dcb28376da1c2cc41b90359819809bc4b6926294e790189964670ce38a7740be1a7403164dc416ee0111f86ceb3cca408cc2bc13f00e0850b8f03) <<< 16000) + 0x8481e04d165ff0e3de3a0a3e48828e20f1bd20097a4ccca2080057402f44c004401027d0193e00e28ac45ac25045001938fbfe41117188fb39208e22dabaa22108e7c915c3800007a54a608004de16d409c108c0214500000000128880c62d8954513d93415eea20001e84801140003d08ad28402ef3361f448117a4aa684112eeb004ed208d0bda1991904230040000e51000352200099a40027ecf0b1d3831dcb1c44b0e11910882729b25e1a8e0c12982b05e8003a73bc518380206bab8e81a00f94e1f044900003d08ad0007a11d689032050940400003b4744063d604eb63c31457f9b9e63030c7cccda190c3bd52e0315634213a9f6105e3000dfc0ce2762c00009895b080000e19590778001c9c2b08900a2060a00600003f246d817821ae871d4b901c10d80da953ac0a102ee3e2a074041454ddb964421c0110d95a46e30e00007de1e4d000179a659a0480128d4d1e19100d9666e1963420c405805000020d2002d084098a404a4a024210118e80881400326a49ec564f403e219879bfa4d2016ee3694811862925a4e0eb0853a3c700b3342d201018a1a196426082000803e84c1f007028a228fd7965101970ff28784913eea50c46700334d175602cd20a2d914e7f026041f00857c0c6e40b5ffc116b5649094f1d5f30d49f82501dab075a10ef2b9d254ebe1e06344b33d7cc094e7d2a8626a31c0f95d32e15f03dd981e4753df2e7ce0557968bd61e9a19137b8bb76223a26d8f202c50000000000000000010d0a1cd1490c30d0029e2b7e1bf18362aa33c508d8360f98997ec5a93857aaeb6571b77a82fb4c73f7a03fe5462749f99c1378a15dd06c9f57fd3e7008fe3ef8ef128a5d5e6227adfe5eb4351b61d221c67a1838cf6251b7e91735c6aa0ab2a150005cf20fc13821aedefccf1509ca513c115fdf1c93ff3101fbb31f8192688a3eecfb42931258436ccdfa03bf99c91f125ba84dcfa3df36830eaeb90777d49e6c6a11fbb468f04ad5f5d495a4bc83c0d96e95d1be4b109bea7bb07562c87cf499bccb0dae1b5fbe818ba1049d76f34cf80e9710ebe2b9d1b099ca11ae981fd299ea265898deb8ab94d5cb8206ecbd2890b19be9050c03c258b1f729c0874a27727e0de717b4386c20291c3ccad3c760f7f0ae2b22b940ff57c04e1b8c1ec0b4444ef21ea3fa554840d44663e74104298aeaf7a552470cb20f24628f29e05fff0c4ef68e422230561fa2651d895a19c8d0618900e1b01c743ad394157cd12e9446029d087686294bc521598a4c05181ba434147e5bc346bf67d3bc6a82e10c485f0078f5fe2c25a04c2a9b4c361566000128e400421c93c8ac1e8564f01b2770993b02c9b40502b5b9ceec8b0db25a285e083d17c35342801706973b90013571513d125102100813a82c208064e803273018c100f0b3f1ae4b259174279340e195deb49f8c30180055e2046bf6437612840f8042c81ed152d4ce18fce1b23d1049e2f79c79100477a4f6a380028ab204025082200800008592720d93886c77c37452054aabb86d6016d5e0bf4e7e1becb48217f273e82d9d9bc86afbed6aa4c3641b3fb6cd3c645be6338d5211764d9e483bb5882159e24e91844af73ce183098e48fa8c726afb598f540da5e57f710bfa8e7d9cc12d2c0e8bc287118a81e37547c66eec81d6030f1fafb0e29e6694edd5bbb14b525965aa8fd214c7819bc339851c30225bc383ace6b010498411edf529da040f6be82d166f80095f914f1f9404abe672dc8d7a5cd32e88a190575b7d973c02f47917eb08b299b67c1482f3a7d5b07c6e5ea2654c45871a804411c4e0fa762e9b7d7c4542a692e0a49b6141f55d6cc0ce031b7932eda9da9c23f6f0d6e3d3ccff969ffd9f829721331c400dd5a1f8a19b92133566b96a05a13635c983a5103f874eb2c19a6db8b78f205c421eddca987c2e0a2042399ba469dba3410a4d529300878c2b2646f5f9723ff6f1419949b7d389304df2924c77fc9165cc2067c6daa0f9c3e880d39963b936a6331ab68000b0924e00bed583ad0b5ffc116b5649094f1da49e6099825045e2771790ef2b9d254ebe1e0634b5bcc4b80942be06372043bcae749433db808ccae334f5782539f4aa189a8c703e574cb857c0f7660790d34918410208f011acc301e07ac2a70fbaab4f64ec698be79d4525039c0bcec1757425234adacaf0d305308551e319e14e89f3c9f87da600b5856676c54abf66e6ca55c284aebbb8d8d2e14844cf9a0009a64004a209378280050ac9370af471bbbe563c57afb8e661d4600d0484aa9e6f1808b840a5bcf3c2411b7b9a6778946a9b2d721fe05041b56fdbbdd8f32f02820bea1010c05dbc0c057374ecf29141060004c6e3ad31fc219a7623b3c000d750a06d563f999a14c1bc4110009ff974397ed1f83f5df6dd61cfc934615eed9303942f07a09b405c40b039afdd5b070441857cc1e39141036d7041866c3040fe61f47bae8a100ed2f3d4028083e9e00a7fa821000539be95ed4c3800ca8f24fdeda220ad812f6d540265eee7391d00e784141701839f4aa189a8c703e574cb857c0f766078ed4032388382282182142041380440241db7c8bb7ea7b50d4b361d7ceea3146e1e0e50a81bd0001ae200086843602400105a49b0e44d66a26a3113496800bdb893404ebe06372023cadae7a594938c51d6d8819c84129cfa550c4d46381f2ba65c2be07bb303c4508202300200100a0a22c957c0e8a55cbd02856c0077d7dce83c092557ec019e32cf31d0651990261c7587c2f278b0ca695cd0b201ed8f3f7d1b4)) <<< 16000) + 0x5fb138e4f61a72f000d9858c53cb4031f097f416bb1ff2739ede7c65aa54604f550a421680020b92672593306c994264c80b26301d901114fecfe1c50bce4ba5e8a2cc4978d3309109b6270a642860ac7da61330227e30e602020916bc4a3f0501ebe5c39dc100211756954110001324d094041c50fce49720e28a21974d603c9108a7b36be69c105b96575c62c2005e696b9c082e01b1ba75c101b42391aed80067554ebbb35140dd68d8913002430684e0300001fd365c90a3e5db145096b30a3b1440016e340e0e185621572f16084d4088760808aad4785e1605618057b6008000376aacd4b04e70480100001b1244c2b22201d898a1f947346100741b189101931b5d3911c301e03081008225e0be43900102528230081108ae2ea40a04d17d83c34918e2cc91e06945d8119cfa550c4d46381f2ba65c2be07bb303c5b9aadc07ae0599439620820e19200e0201f3523836c7f60ead5e2b3d924718c45790a7c6867210352a47a0b57bba15a5ef89793e471ac3d07b16539174000c00931188984b44c05208e2506c1080012e490c86e2ea40a04d17d83c34918e2cc91e06945d8119cfa550c4d46381f2ba65c2be07bb303c8ea7be5cf9c0aaf2d17ac3d343226f7176ec44744db1e4058a000000000000000002198c08a08600202822018f28319fe1272cbfd78801785127782ecdffce982686a65173a2d8f4d73c3491a299046a3e236041562cb7375c5db36e720ae88da7680549e626835beae5c4bd71ce00dbee20d7548013ca15b6d14dfd659624b0cbdb7635a7107013eb9d9e9a1cf89fbe75a36b11fbd7ccfca81dc20221fc2a6d9ec295689a7dfedd16d0146afc4dedb6614c2f547584d06d21f44d1f40280038191142586b84c44c17440016e340e1621b30d6f298821ab5d6701161c367962418e085621572f080025320e3b0601de27c6df00000dbc3d2aa40139a12004097c664bc0b8bc4ee2f32eaf022b81d5d0296fcf0dcb904639f4aa184d46381de607e3d798885840f9cfa550c4d46381f2ba65c2be07bb303c8b4e38b8f751ea0e13022f112a1f194b8091c65154bbfbfab3c752800000000000000000024a1618e094012022823235e4445e30e4de0e6ef8be18fe01925467607cc4bd5728896a5e3a067e1362b7661775fb74e7fb910d82e91c9183530f37331277ca38f842bb5c70a6749f4a6848f72b81f551efdfa36a4e34c7b4b5377f060208a368b05508afa301d43c8f043a3f5bd525342b3350326ec45de6b9829f49be590c1a90f50d25a000dce7071a17b43320a282da0878f8c124b03310ac2889c33d925f3830044aa200161802254e150402386e13160000a4559c30400001ffe78b31068282500c60e00bb1866c1c3000895440058c002254e1518279cd6327cc288a34fd869f9819cce586c7400127ecb00d4000a164e2a0a840e1ae61ee44b9413008000078492f88c9780761fc4734cf786cc115d92833e5c514ea97503ba013c49ffae5c4f22c19af72849972afe509b948da82a53501b8a2097db91ed729b7baea24004e9824242d40e4ac7f52223e0cfde992dda8d7d07df89afb562c69538b9e6be0a7a6685056b533e1b311646ce0317a07ca7a1400bda38003752e86a485cac72cd281cabd9743c0aaaa4ca6f0fc0ddf04ce8f8741242aef9e7b799ca1f269913f51fad2f32378ba973342d222bd1402230dcae6ac5eac0de636280b51ef5699da12796de11fe5ac258adc35f360436ea95a9c5598506d6a762614ee72ed1e453591c60d264a01d9504cd0e327d84ded2ce94d271305473ea492f42c02dad31df7f64348f999bb6b18844b14923b96f25ac00b130c42109fc66b5ec600008a524ba3225c05000679921911c83e60e25b9fefe4a6890847f9e73d79925a91760714c44a68cbb20b1c800ba055838410f22da6942067899de0c5d81c004b3e78e1c27f8d744870173acaa401ea1bfaa5235af6bcb8f0e30f482a99c6c46f382272e5a6f2511ea280abab0600f6a7801395398aee6827e056242d47caaaac0552318493fd353f83160f7935377eb8c463e10f8a1eb6273fcc44914016d9963bed99ca98566d3ee589fa47c83f07e22172cb4a689a80b54b78c627ab89d1a33006b13a4fede603424d5220017a1da029386e8511bd80caf6a0ed2dd964eb0e4bdad15dc628b384446ca424e1045ba7986cf3d00ea5fecb1ca98456752f0e64be7e2d1e349465783401c84f133712bd9e0e3cdb66b9d0dceb78f675f7f54ec487c4e023d9f22c2b357aa44b6a36deacc1be0eaa8ab3fa461d74357338842fb49e2e7cc99a0dc0b316a8defa8356f8d821a8692daa50000a3f24b692102450a4a08110540041584325144b44a00333b20880bf1e61758dbe1c42ef5895aba3621f5b9c09aa73ec06be30f5f270000000000000000000120450c40c808508309415400502482c39da51107c5135096bbf23c6855d83a44f9ae53238168f447d46d5a0c32911cd42f9c6e8aebc0306d5779866955fcb9827c881224e7a6169786685e54fc8e5ef23e414340cd48f3fbffe12efa7bebce65c319ec3af8fe05c45522c4cb10a70d6c125c093c95ff941900072f6c2b85a1274001488f048c34e543f8f840466a8e700c7f82044483a0943390603b93f3fd863105008dc7e5091f9141541043eb1c7014d9e06f2a0fb1edd85402603608cb279404284a0b194021c422ba1801a000094492caa8714c44b002e309ce5c3501a7161fcfa76855308192a65d0a716384a1886f65c30c0269fb108840214f642462a0c10acb7352e39804cb)) <<< 16000) + 0x226c955c60000225510900124881480c38b0b011d8602cb82310f2023085f8e8caa5307ac2f5c4942c7288ba723c20119387efe71c0039abf75d009c40900200002f278b071930871b8c224915f284382c80361b800628b1d06f914bde80c300d6939ea1070919876a14c80412708212fa44c00ec702ace68180000bebc232324801500e38b0c8168c333085ba6b6e47307b876f3a572c712426b72c2022627c903828101065579b1c0038aaf8d69c00900200002e24084140400a01f0500f028000fb086b84f8c3f9a6f714c7160da1010368c209e4c1ba3096386ecc61d450c300cdfe5ad8584b8c2a7d168c06dfce85ea20c08005b8d8182000f0e89ab2f92004e020e31322bf0b6e1c5825621471c2cb28277439c65940157527d2830c02aea52ed0412f54b80c55301c85f9a84b8302001312d050b001c48fc90d54801380800007b8d8f6e061fde258d6b1ffbb0e50c31b9b956250200624b95a30001b4152160800eda93a364c0848010000143204c120250901204808c24044020005be24ae132410991f80f8e20cca387c50d84498be9658a005b8d81850bf2155f52a48a0ed583ad048216441ead63822d3d3819c082783b1ee04014081200409582647a138ba90282dfb0ffb0c1c66f7dc088471ca18b14a149149008007001030300200d00010024783a23b1d11d0e88e47400068246a04646e13e29ca115600c0a2889c38782c102591f33032e12180180a6bae101cd129918120e182c128cd0a1400006dfe3660400c6108b7d98200b3a038f8ca282000e24e0a00500004264110078489c8d7048c01c3d9f23ecae7b1c22f334db147d0813299ac53fee24016b959c1d2c0c01bd03ab268a040035b1addc1c450403f15827ff484e2a20b93c9210871d00b00a00004504954a64a843b200ed583ad0208029a16900081cae8449e601c61738e988509162c013fca32840016e360609114a5dab71d2835ab483628090caedfd767892004c018b273c2b32d80916940f90fb4a113e7f14e08a0f057c3a4dc90f012433c5c8044840f8c5410034aa6969a700240080000b8925305d108005295ea4097db06ae0e487d23595324405cea9f30564023e7db65ea3008d3d71cbc13041200400005148ab02e885cd352e01123cbb5ad35e490e988aa91324841b78fd86720220d503d7514084b2367b341002837e3fb6ce084a010a590dabc58b1297e0785e46070c1636057f718e2631cbbc07efe80000000000000000008e45aebbc71e874887c27b6c2d9dffa436ef33db968effc37d14d10000000000000000002310e31219211010a09400603704010068001609252051288080012009280a893c5449c2a24d151260a892c24494022490112400891c0448c022450105980891004001576490c860883b81000802380dde1a522c0e771a361c089983310023141c008405004010000044490827a3817ae127218203e0706ce4801f2023d9c00361b60503000120e1180400003ac8000fd91661192088c9004647e03a0b28e58f01a06b1683e71022141f008789181ff2bcc0121a2af7100023bd65a1005b7dddbc12040f8043c48e1932309110ace8d909040f00200001e091f06ebe0637205affe08b5ab2484a78eaf986a4fc12822f13b8bc87795ce92a75f0f031a5ade625c04a4d64b108967b1e7130ce5327e640e5a3417fc7a81144e3d7b3b0ec000000000000000000241b28b186d6decefd30f819628c8fe33724ffbc2829d65f244135c0000000000000000008c840e7065805000004f856fc4930ec6a46ce6487448409ea54f5317d4eb272238eb54ccd67386ec558a9ce209723a23220c3e41fa3406a086f325edebb0d0962d11c5036b9de63769c056d49f67968f220449f5f4f80504c19694db78112e000625aa88b8aab4001ad0800424123d118c088e2f13b8bc87795ce92a75f0f031a5ade625c04a22f13b8be77ba2c47181d5d02970fb0681641208ba90281345f60f0d24638b324781a51760465ea10d9306f2790c51aea6dbdbb6d7f2a9eeadb96fd7292a018ae00000000000000000023a1639238c30c2180001b408d801ffa49480829d3313840c7ad17b81281454e06edcd97cb5701c270cb549750e8cfd1137fcf6f28341760a98051bfed66660e03fc2aa34f116b4f7579c50299ff3ca22230e5f0423b3555ae52e3f6b65e0964ec28a42cea7d00061624784a23b2511d1288e494001f2648e06646e138ba90281345f60f0d24638b324781a51760465ea10d9306f2790c51aea6dbdbb6d7f2a9eeadb96fd7292a018ae0000000000000000002396e6ab701eb816620850650010008088b190e8e097ba68a2340831044114ecea7488a9b75f7f8667853b0fa6512ff280dccff8ab6707e14eedf3ccb7c8a8a8fbd1d9ea7bfdb13d8d01536a5527db5ab2000f7cbb8266f4a4d597f7dd54c434e53ab41257cca0ee13d7bb535638540fb36e8002a092362d82200e0497a3104c1c975c003e7473bf21a83b1f43f58c82fda8451c084a5916f9f7c993f49f464d22c80fd92987dce3a73070f9001b2700c92c5f88def46479acd75f184238f492941b22f58861f7662853e20b3929052e90e78c6a783bb0f482050108046b442a89524e0ae15921a3f1730a3f9f95582f2c8c00f50845337d77b5afe4500534778fb73c344de9ddf71c305e11c3cd38176f8f8fb1b9073e638265e42f968fd76555485830d620416f6791709983e3d02a02a0c65f88ab24f25fbcde70120673209be44c3af1896559c1b189d0b606c7b9a344725aef01677fc4c07554874)) <<< 16000) + 0x47a74f3844f49bcb988a9a7e7c1d84326235a27aa991a2ab66e40869785e2a8268c44c32c19ff8e3aa83a05f4a60c5a2904f85a1b7572438a3494d7a6bd6d5a64053cc9f201d9b4935041ca95a25f1d0ce76ed8d87ad08a494e9dea528c7084c3641a9f98d290808a6e095c53011e24edb98b85d3122ccc4e60384f39939287b5134bbbbb4d8836fb4e527ef1d650a708f4242481d601a4bc71cbda48523cab04b3554e363b08b2f292cac1b1494642a5e83e6668213fd88e85bb0ff0efdc685badeb005e686cc59c2a8cedaf90033247940064f072721ca177126fc3ae0003810d2c86d5e2c5894bf03c2f2303860b1b02bfb8c71318e5de03f7f40000000000000000004714fa5efab1332326c5bbad59ce4a6af3b0f53cb1f00b2a75231c000000000000000001147586f9d8ce1160ba4318d32394b0e69b14e26ea605065d9e24000000000000000004331431411c0040450468754b79181a9aaaca0ce5d45988f6cf0fd38b5d9b25e92c089311f5010c430f9c5edff36de2235d0ab41221fc01e01935481f9fdf6f6c08898c7aff23669c0cbf5aa29a491f25f72b7f664a6c3ff4455bf84621d8a19d7bb0e54e44fd1ac34d7b2d5299a9eaa1fd8584f7ff4acce82b515de331118922177b9baf71be51702ecded989c619dbcd5ea9286f8f9faaa34e169252ef8a4735d021b4e80a25f218731fc89b66c9d2350100047010054100178c923459919aac8c9462f49b231399180ec8bc6645c2b22d118e086c01443891618c8acc6454232291191406889c075f031b902d7ff045ad5924253c757cc3527e095064250379300bbb100cc81cb18818804b005000020aaa13eb08dc2269d13ee842bcc9d8e0c1eb986e980ec9154643d551891f05ea44c132250591202c88c1644403af818dc816bff822d6ac92129e3abe61a93f04a15f031b9021de573a4a19edc04665719a7abc12813c75a3c2d28744dab34f401772f01276304776201a1241c3983923921006611e7beeeb2b55d56e847876ddf98fa542b5e133094ae5cd2035cafd60044db74d25dccf95422eb15a1dd48067cb8c1a8a671614884264400b1560590f82ebe0637205affe08b5ab2484a78eaf986a4fc12b8f734a62ad01776201992418392392110006001dfa12e580c2f908e16aede70c6d2211c206b0bbcad45c0d277e848879acc48fc315000246243c521d22910e92887074000dae421896436432190df183471edbef3285c4371cd35187149a0cd211e1180364e0849d645008690cfae430c0370b72324a9041184c381e224017022d0a97a28a5438dcde0165b6a90b2206d1920a808000046c4259264344b1e90983382e8633aea7548470819a64e1cf265e34303a47fa50ed05082fbcc5f7473082dab721d8382080469f82112850081492ee6e072e4000077018e581c210bd1b828c4e2001fb2136b5ae2a687402e03068c5eef65ce944c50c78cbe6c9f3c840da0790044a0f02841ec4bf343da6402ea377aee17b4102f2f054ade0186806ba1e51918b42801e86e458dbae20001d29de4bc30c08034ef8a35497c564a2100c00f000051c4218c643223c14c80ba165cca2859492bee25bfc9142ff830f50e11c54c2bd6a9d1fc4049669380c97f1803f18713ea6583010fee3c95fc200100e705e0f2f3e0a427e7bac468001268239daa2c2cfc74c2e03000013891024510c20885c540010126be06372065d5e0456f05a4f41d66bf121808f10ffaf8d5ec11e46adfd7c52eaab1b1803f1be26f13a951c8000000000000000000439f90b2306aea3fb44870a19f52d38e15e7d5fa581ada40b438000000000000000010a3633a5ed2122a6da53088ab0932f7ac2e10039f6338e07c00000000000000003f42c4244204040001005008c007159d5c0421a32638927b2242cdeaa5bf9a33ba92cda13a4d8eb26037c8e798a0378e4dac5f6610c8a96f5add5135bf3971654a590af3c5050be2e75be61c3ce88f878ff8a756dcfd6f42bea7439894b11ed580c1bca15697b290249c719be0b209f1fac4699a13023a83da8aee557669aeb724e2df6b1ca5012c12a4893d88706e31a56a22a649e26be607915d25bc908e224c9ae76c46cb9bbfd9d672448472efc9a12d20418cb7126f952103035aa0d9944c1c0390c0639dea214025f12eb9be540803aff5f744a2f40100887042aa04a84004b5ae08211c82d4a1d20c00e00004aa48590442a7a17a1590a0a884c0400175a41101721057c69e1f78e174c028632d8c11cffebe1c504084ce2dfc912802467bfd152a0823a1f9a33f102d96d2a92d00283ec30a0a49319447d4264404d3ab669548d0500300002193008bb34ddb5b488c098baf7ff0a448a0872a18732a7f100082c188712110e06165bb68da070c00deac6f47807282a88202b1ba8ef6850a1d56804cfe1902809a9946af6794b45266c3003400012d100555109288844d4420620442990794c4583441c1320d0510600a8519745b4597289097e1d30aa34c202f1eeae811b88a0437c7f8d5c3d280253f27f41b8c902716b7c90c081c01798cee376611444103b3b6872b724454ee6b0d27740bcc3a8170162c6174a2b81c0c30a27b076c66a0a0c7adffe5da7121c01dcbc5a760c1042c0d08a80400555a96c41606002465fa2538200800225f0e516e722064e1bcff7f483a215810024c1624603b180cabaa2717c890f06878e408d8880c04d874741d50408199b766cbbc4300154309baa64c20034f852c23dc914401d558f4035d810292fb9f315621017a22d1d4b02182e3261801a0000)) <<< 16000) + 0x928800257920b3d9051af8c2017ceba0b4e2c0c842719f834b6ebcb1d0ef8b2c08c80c260024703fb217c8ccd181039c557773068eeed26ef68d1530ed4f36e230500134fd951369002a01871877a75744e34b6514c45a90e380b1c374c0d1838b4356c260d3f5eac83b3455a25ea5db961006203c73450408fc7c7de08007e2eb9e6a400940200003b474b2de36ea809853e8bb76b188180739d3f0e60a0f82b150d2c59d24260841822c39f303d0b102f50030be4e084a01000017a22160bd2cf44de256469a5016849d864230adf48b92bcec60a5fd63dc16d0b179b446c90939823a30b6324062c423f9ba6b10438217e2c8eb4c8a000760a0186e0200191f689138d2a002b02069676f9a8944ae69409378e532e4615a531a95951430c1158ca48f3060a2c3a6bb2c3858bf81d3f3ab3a60907314971b9458807386c1890c38202506b084cd8e9002c0240001101026050128080012c890480c8200703416f247af9c0f362c10180f3e8d3410196b9b000d307c07d053628b249f968da343cf20a0242c8795ce237c572af704cf1dbaf34ad76a0e1c7c956f37b4b192005804881d1b7fcf37a2c9004b2146a1e410a3659748e20ec0f386d678ed53a81f6f3873cad104299a0841c8ce1441001372b4f494001280400006a8f9b08d81bcd838c0cf63df7a14401c37c90b4e1dae935152270c087e4fb0c3468eb7f576d060105c7e967c9c10940200002f446d817ec5bf6ac5b40b138c288387347346241081300040c800080378c807da86185c208193dc583ce03875e0d316da74347541d2dfa9363861ae4bf1a69034634e6155a30030519d95a7892b08105384837a6f24003c4366eed0824801601200008808348281a004000658606828cb2a1bc3cd4e55f73bc269a0727be0c00d30d4d99720796489d08e17953c8992f8564b67105b4dc6eb2ce1e65a44b65a06110adde1221b900270105d2df41ff99aa7408536167eab09d2a3821140e2493c83883c73870c2341040c80008034000474f9ad4947489c38c1925bc6809440529045b50e1db9dee276c68e10cc2e2a0346896d111178600fb32209d49c10940200002f446d817c66209e271247531c144070dd515c0307711c3cb920af0af517de1a3aa595eaade4c4951c3021bf9a0925df7c1a31ded3fd17e2c2191208711195981da778180013731fe2b10618820026a434913ca6b4caa64be400f0191c64bcf5619f6051018174d832c1041338e33715070ef6fc0dbcd11a3c5d6a60eea870c66ff7b921c1a328b858873fc60a802f27236c12002de48f5f398e400a807000041841a4140d00200051120013fa7cdb1652c2b240798099e73622e0e30260ef5a9f398601afeaa160028807afa88096870f14609089cb8e18445c9c4d469a356fb78080ac0c12b76504bc654d20056040f363378e824251003486576138721200c2f31a39c20210044e19c48d27b5068c727a1d1cb30107bc89d36820026b67dfde800250080000d49d2dfb6c1566a48e2f250e04534623ce7c416183434b6aea7cd152878b178660a243a24ac0100032488c9893821280400005e88c102f4b9c5183eb99af16448e1e2be0e93a76b54d19743e9f70c77bc29832e2c1676e45768534525ec446d0a7989460a58584cc0a9505e8804330dbd3211c77116001533c6c3b4392804001bd8cba8c53d3d096bb9200760c0d2f215042efc9923831d62642281c72671c66e2a068ceb5a49ca2f0c1a747fc827201a2a5beb0f6be13052d172cb8454588377c1e76f7880016f247af9c634801581000008588380281bc04000a22481c0400158a400773ce96adb3d1cb461a5019084e33f06146ff52f4aaf94501190184c0040c07f642f919982820738aaeee58ab0597086bd982417eb6fca8258800269fb2a26d20054030d2ddbca34c6f7967a61445033c7642573018601530e958d63ac18286c277885116774b156994bc207146ba60927ba691a1fdb8728200baf2c4cac64b08081123d4530577e41000f0ac8f8213c17e8480900390540001509c29bb25ead725927862c590e1c501ce74fc396203e0ac5434a1170f867ea058732b3e42ab2830bd400c2f13821280400005e887482f0aa78ce45c1c461205a12761908b25d33d35951096217f58f705b42847c57af5d9a4587bdb5b05616ca0c8fe6e9ac410c085f8b23ad3224001d828061b80800647da244e34a800ac081853c24ee22d0ac61206e9aabe62b164a9233139bc9a28a0d0297b6b64162084af43184a8508e2bd754ffc3161d72f5c4c555e506056a51126c90c0806f14118e652aa400b80b000046848181440a020004c62408020c301101808002e4490110880484400421ff2103e1087f8642cc22165110b208858c242c412161090b004857c042bc0200357223fabb1fc598fdaac7e9460649b1f9418fc1ac110c63ee5b1f6218fa8ec7d0661262be33ff75bbd2800e224f4054af1c0a236f6749defa0818075ade55c89402d5b9c7033d1206baeb3292358e05926ae6161d84023662453e51280021785b11148a000a04c53533b0c92202a2213b4461601422f13b8bc87795ce92a96202981a7b0d9bac04a03b560eb421de573a4aa5880a6069172494d81291651029a216192196120001f7973c6e42cbede160f9505e95ce502efe04c49b2d45eea22f8918c79651bcf7009558b25b86bdf714aa23ec5e2771790ef2b9d2552c4053034f61b3758095ec5bf6ac5b40b22ca4092053432c32432c120100c080080347cc140002e440783626a131ee098f904c7b4263d80b1eb)) <<< 16000) + 0x01f6ac1d6843bcae74954b1014c0d22e4929b0250af818dc810ef2b9d2555a061e23412f3ee280948c2c918c10a10b08409100c5ae130f01794204d1dc2358d4fa2718380081d93066ab0835858e107e8feacc8c82ed00bf853885191170b2c7c3f8b9128662acb173845009e85b8c13052776b628425192597040812be1beb0260c220080f88480005408f504c7c0263d2131e805d7c0c6e40b5ffc116b5649094f1d5f30d49f82512ca4093432c32432801801000c0100032480200d00013f23ce521e6290191480018e48ab14c7bc663c613c106b472992f4603590609699f1209cfdba657343821f9bc29223100172eaa40d50180ef70ca601a04016bea3f3960880be9bb4a48400c6b76437471bc77427cd30003f8e885404000024023ae7b1d6398ea96c74837c3105dcc980408da73bfb70c29ca708604d01756d29eb2001cfa9bc30200880d71f600002624220080f704c7b4163d80b1eb01c08134f5c3e0a18d113f232207d446920e06006dab089800120c1100407a8263d20b1e805f080b6ba55e1020eb4454e428617cd198d881f445e7dea5004ca668350c008d38e786200cf4a16c1800013921100400005d48f3948798a4064520002f32240431e51d8f20ac78c371590b2701002bed6b0311cb25beb514b3ab2ba878310edd8da81500000000000000000000000000000000000000000000000000000035d0073b42a8432a95387bd2dcfb8d897237bae910d91c8c0284e0000000000000000000000000000000000000000000000000000cc458448430410240018088c750b50a5e14440a85353c70f130f748508098ab85b9aac5961109bbe77001d1dc70c1fa90fd73681c9e5c8bb43392aedcfbc45e75cb155da7966e43920035464170e85876b6c4f2c9ad7c1613ace499ab6d9cce1d422dab3247619d4001a3c8f1188370643c22a000be523c0b31df558ef18c774463b81b1db098ed02fc343a382eed7a86d8302a26edc2c01e2dd01c224ffff61fa6f2200c14c7fbab7c9c00133008500fb9808553d60c01569153095b088d40038987a3cb0b788841ffdc93bc4a3244801de4716fdbacbe2a163a00c60780d8f0cd07fc10e6043a4e06901c28d0ec98d0612151591c0306b7bd73484808e99a4d60802f4a1edd0020004e604201000017422ac4b00511d866bf265d635be80b058c3d0979db88d0c0b261959a58361228061ad374360968e40092c1422ef4b4dc50011c07021c118b86052dfe5a73b506440404c128c5c3b9c5d000caa05673c3705c00013011d93d8ec1cc75cd63ac631d5258ea10c74c761b8331d2118e884c7401639e03af818dc810ef2b9d2555a061e23412f3ee2809457c0c6e404795b5cf4b292718a3adb1033908252be06372065d5e0456f05a4f41d66bf121808e3fc440196729fca78f1aab3cced1a507e5dfd29a77330e1aebf2000000000000000000462dcd56e03d702d50107108003000018e31da01a88574d1fa855b7e37acf895b907277d0bbe7dd667277c957fe129315180b6b00b9c4cc04cfdd041620186a4fc006215f8f3e320001a6c46bd299c51dfcd88b7556297f2a726f07984dd3f507f2c4270d87184c7c1cbb4c02cd6f64358559e8e70ac734463980380c008022875e228e32c22d340340012141d0040e40080002408e58e83d87438e2207c055041628f4294418be1c0379c094b031e14d01ceaea6484801034ef850040252421008407004011041a9d80047011a33e080d013eb0d0280046303e01080c00802000008880007511c61100009e11c51d80014010f4218e50ac42c475f031b9011e56d73d2ca49c628eb6c40ce42094af818dc80ef74588e2b2484a78d97bd77b68247cd4c94e8a05d2480ee252ca6c185f45957ea80160fb7cc437200000000000000000112ec4032dcd56e03d702d460d1091054000c298ac323397e4b495be0124c6c00a4aaee79130b4296ca470ad2d1ab80463dcfe558dab8bc7f71c5dc39b7725be927a9a78958f59408dc87f1af7b90461ebe0914ae613f3b2b2d1c5e8820a9ba3570791bf887814304e79131a210052b5f2d4069a9d53a888208698f350025142100800008591c9198430af06b42764234429223e4d188115f923874505153c856200482842010c14b8827bb87572f0828c1c348b75eb92bc3a304421a9ede064058e76e4282c4d773f7d63fd60391036ccc0c717bc274e89400d393f1d445959d2f0064e0832c15300d77541f1e672730a2184800009a887f0687200400071a43d8941f84a1c71903e02a84196c4ebe5025d178ee29812f2f90ea800aeffc17c4805325afa0008012941000430526cb0699a7d99eedff2ceb5683d1d728ee7000877271366bcec264fc205d4cb439f4159e0543f448307f6b6bc948d3ff389a357601dab305f24f4e1b0874b79ceec240a84ca7235a50a3629aa9801434130d01abe4b6b5030b4ab4bfb8d10b0040568774f9138be5a05b3992dd18e7a2a852d9e99d91b7d101cef80045cdc6eca3f2cbe97f7a4a8bccb3adb7f4c456e2bd62251da4680bf7055265a68b1376130028ff5e8e2296b2363eeac7b970a5f04c29dfc2323f0ff0ea415d59b77908f16a2f9d98cd5b796463213f48057c0c6e40b5ffc116b5649094f1d5f30d49f82515f031b9011e56d73d2ca49c628eb6c40ce4209413c75a3c13f45cb68809c9ab869c6e8c678232dcd56e03d702d0d18711501200e000026a404c48a4996c7c03c849f61fdb8070b182a6c4efeaf69d9e0ef61b9a1b10b67185345d617a670a17bc4beaf4328922d4565d)) <<< 16000) + 0x25bd77f5dc71cbb3451cfd37ec0b45c8db05380314fd69800110a1080420280200800002221fe120000d72000a844718540017c24714960561b000d36226e720017fd2003826435cb63884b1c31d8190ae8638fbe3bdc17457981544aae5d391ef7ace31b746368ac119240000000000000000008d110a86e5e01c57daaf824aa782e6ac3baf1b946bd05ddb4e0000000000000000020bd8b7ed58b68165b9aadc07ae05a0611e08e08a09a0005f7df625febd4811c7af85ace8299fb04f8e6bc9ba687d3e5d041d5f06321344787a334dc8d1156e80f2ee9e5a3688a1893c402f5cccb155acd449dfa5dbed87ebcd61eb353946d2832f5b70faa427e8fd1c2110e08680c8155f031b9011e56d73d2ca49c628eb6c40ce42094e302f51dfb2fbd6636166e13ebd4ec1ff3fcdd5d0241febf0a4e0000000000000000004658253b629a8d088b99a9d84408df114c059bc27aa08c4e933f0000000000000000010dec5bf6ac5b40b43861823802c01c0333191657f5185559aa850a7e9f83489fa0c59dc8223ac2c87e429b9bc94d05f71c9355980351e8a5c1b6c8d006e61b73201b1d4a73f77dd8e5ae8d90638d6b4557328d1f4bad417f3c8ab0091fd0eee9257a9242efd8d8f498a20e2634a0a3b02b258112ce55a7ba0280091b96e5088f8bf431902034572a4a288ae8856040608fff5bbd4980719b79b89400401fb1ec14041100422489378572c58a04592db5922beec01e6830bc6d365e18a00b44b4f262000313a94713021100422502a4c225a24b1e7dbd81c2a25e9437122da78e3fb9c01e18c8ba9402e2b5922160420004000095900027e201013f1dc062bbe7295918ca3a02d4476c831870e68d587c25f15838ea45b4f05c0228440e7aeae5e30df7b74dd5b937491364e8c0198f6922c774e0cf1d1948ef0490d808017dcf13800a387e80e979f3e762ef547000503f16228364b1372cd2aef865cc49852316bd1ade315847eef454f52d582f88415bf6cfa3bf9d82179841e058000081e47004437e02000898237c431bd1d8de0ec003d3c8d69883b4c4376621022d0dd1286e4942184210b010850080057408dc2ac6114636e5b1b6098da82ebe0637203bdd16238ac92129e365ef5deda090278eb4784fd172da214d859fb5e6cfcee8229f90b2306aea3fb44870a19f52d38e15e7d5fa581ada40b438000000000000000010a3633a5ed2122a6da53088ab0932f7ac2e10039f6338e07c00000000000000003f42433c03802801000023e2c6666cc7996e62ebd9c07f7d0643019c5748a6c9a96c9c37a0dde456e6fd85931a9f23973be9c1fcb6eb585faf183191a4314b74eca37e39f10c18969278fa72ef80e3ff3c3690d822811dce34ab6428a82d6e0f247881adba4148bfe402295bd76306024dfa82ac4e52cae2be9121538528e03a9ae7260ddefcecc69960ccbf508c6c03bcc067cb4b644f14974a7ccdeca488b20b8da157165edac6736f70106f6ad5f8f70fef0e259054e9839695fbc5ca7471cca2a205f84e0ca0459c2563449abc1c54254ab3389a6ffb6db2ab3a17b6336d3490984a3cef30f533fbc5d9fdd0265015ddce8e9a4f0587c7d69c98a89635e8f3b0946a98aab9756de6d78d687ff8da0be495d1e57e633a3bf984d2c209fc1636ef35cc48d748dcdc7f5f6d5fd5da80f1319e4b6acfa765b42481b44000069494b2b42cb089967f86ca5648519e8dc5860f4ce18f01ce5559b31626a3271edcc8ae4cd666d9e3da666a3aa9b79a951d42eba5e3216cbd0739c12995a0f2b570136670b0413d9ff4e113118306e01d3cb9c0609ec114946983e948f286dcbe84f8066cb8ebc069443aeb9c000dd464f8f3dcb9d5dc016baaa81dbd07bd66ce82cefa8d0cbd6380fe05bf4ef4be3a24e0b21b111b2ec7c306cf5c5e36da78746e4f716b43dc9ce8b0cb5c0bde64872558ba3a2fe581bf69af27362ebd9d73fe0247c31ab85d84c9edd36411016c7f90358dc8206ba3e217a1a53c61c59268b44ed8e422c4d26151f523118ca44fe1baace69c80d0e435bf489fd8a1a8e5ae2c0574b4df75cda6cac927d8a30484bf0effc98f12056e6cc26c9ef88cd5be9c4a988ec944651a5a10ce7a3afdacb1bae119742800028f6a888dfa3608824344281e5fad46c91726a35e6b9bd19a22b60e03ee2363c2ca86f70858377f8fba7e328e5ccf252f3e198ad30d159078418a3022bd423f350074422c03ee33149f0ae3b928699a32f91b765ab0a6a8410fa538933845ed9ee865324b98808008022018020081b40900001b980a008020000088e810929dec80022303e00800005721043b1460d8a400c0005888d99486c8340013726be0637203bdd16238ac92129e365ef5deda0932601b84a8300ba85dc99ba209ac2f3420860908aa4bdc3f6be6d3eb659c61ad0000000000000000010f10ffaf8d5ec11e46adfd7c52eaab1b1803f1be26f13a951c80000000000000000004343cc309287280000000038f01fcf204ea99782c2eaf4f7cca1ad8a4991797500c5285e530b76ca6326afba55bd63d31a373a22d94ab0e5ef9e03803061ab2624f0a83df2b1a3ef191076b2d3c0e728deb8495d84f4fc64e07c8eb2117f184bfa743083b56b1a9a29cbf2bf40019508d89e86c0940034267b560eb42d7ff045ad5924253c7692798266094b7355b80f5c0b22873c52014002401c010000192242ee5181c9ab5d8d8ecfce2b9b4eb2b1909b47f86ef52fff0c8a14b201ed5257801d49eb2e3cd5771b977b52043319221866a0005a2435cc635e2baf818d)) <<< 16000) + 0xc80ef74588e2b2484a78d97bd77b682447f29dbde38fbffc251f9b7602f2bb68ca199ffee3cc9afb825a80000000000000000011a3633a5ed2122a6da53088ab0932f7ac2e10039f6338e07c00000000000000003f7b16fdab16d02d0f1ca1091090cf00002d528148ff5496d96c33d22a544e213b52d5ebde37ee55b72bc6395c6342653fac8ac498be9919a4f0aff044123a1960f2d5a624f25b36d52fe65105be16f3aca504223a1c5848786b8426848ffb8fab0fc24e2f32caaf08c1faf8a92bc2b36450d60e8e5450d069f6c2e8e088e04bb803006c1acd6f812061100424560afad558d1c9639532050c8209fcfb0c1b08ef7a21a007a92f98cc01548d162604c1842010000136224413a74497e42fd5e61eba10bc4132497265c2b4348b882f78ccd5850000000000000000002346c674bda42454db4a6111561265ef585c20073ec671c0f800000000000000007e9c8fbda9391f7b4e4b90a59a835f8672101a249831629c0140120006c2f026a366a62c3eb30b6cf56639c4c3764a05002390b611e58a02426b96d62abae593dc97b0bdb6e26a51dfb55535ba4361271afba620a3fad5643f78aa152de0d5c9c8df737b1939e1b7dc082e2e2913ba2c4a32a30ab32914001758c0890bb6e7f8b14442c126528529a272d68f1097a2a3d020406e62b1bcd0289f83c19240125e61d54002718220080000b811081d8d70ac0027b0d7c0c6e4077ba2c4715924253c6cbdebbdb41204f1d68f09fa2e5b4429b0b3f6bcd9f9dd0459300dc2541805e21ff5f1abd823c8d5bfaf8a5d556363007e37c4de2752a39000000000000000000086870c80440448000006f7b9e792ebceeb6da79dd509bac5860be135eb5ad8e95651f8f8cc82b5da7b99c236c94fd47b0004103513b1d95173ab79877e98d575a77a4ae1f5ab05fb45278049a0e5b4f287906c49f5293245e80029a1d16f46556ffbdbd30500823823d5dfb945f8c72ddeb3c7048d006cee77174b95397141185cd9a92e299523038d0008881d04b41990b06cb034017e549207823aa6bb0c0700d3e41b3b92214173b8440145ffa74d1295bff7a20100e5bd7cf4cd33962705a0000c988d69883b4b4358520fb250d5908430741d43210b090850280066388d51e86a4e43503a1a7190220c800fe80803ca8917a258040b390442184984c69807a102a6a905ac0c090d013e70a428421f63f50e01021894d62e7e14029634080e745024dbc2f49c02001d41ab92d550551001e851ebeac4800426bc93358841401c1c088235121e00a40710fb8d5b72a1ef1456ecf1ab5f1243f6a96f4e8b944239d386400000000000000000437b16fdab16d02cb7355b80f5c0b31843813011c118144ea8e5420f0220d9f73461b9ef81d8a7569931890790b28a200c43e766060ab24385fe0ec4cbb002e72420e03ec5f03732b9000126a074294a5a720f100770512bb193d8934719bdca998050d8ba90281345f60f0d24638b324781a517604659bd5469239284a52d78bb0f93b905754ad3f56083c69a8b420000000000000000021bd8b7ed58b68165b9aadc07ae05a1808e08809200c022802816dc0c2a7a5739db57cfc78162955533a1ef5a3bbcc02e8a9c0bc192b93856e63804d7ab201b31c8f75b7981045a61af1cc50a8ce67d969ae6e884c86c54953404e2a0008fe469536348931a3458d120c684d6340630dc258cf8cc6783633a1319c05d2e4feb0e4235c2c6e9b26767389bdde42931468c63ec576dac39400000000000000000024098d9222088e3039feef7bac4f93362cc7fde080aac2af103bab40000000000000000008cb04a76c5351a11173353b08811be22980b3784f541189d267e0000000000000000021880464efc9ea37f8706331bdb0703bda9dbc333017d0c4e88400000000000000000845b9aadc07ae05a8e39e0140100211ad3c0ed6f57f5886a9d9446fb9bfc035dea366f4b6b94b8607a1752d3ba15e9695647ba79fe0780f560c9a8635057854c9a90c7c9eaa6893fa7ba00998d6ceed2a791ed09f5078e040086e7191d249507ffeebd8b27ef986ae5784ade7d6ee1bd585b7d1c03f4a3aa4c14e98e0ff19ca3c6a2afec7c0ec06a370d20432e3053fd08e578695bfb019ba2445130aed0c8fe22b120c5ef194d308339049874822484c619e2434a7a9ce48a0042936bc901000252c22008515907e6279e2f0fd823d378e89880c8703c7436b757c832f2126f0ff35c40c194f370e49b3187b90eb721a974ad84154e3ad31fe625a1482d9e1ca4c82426e4ca8f0d3fefbb2ae122a42881fe7feb8fb70e5b5b76fa3f82c0352b1175551b8a0bc256179c83afef48be595108a1851c4401fb59b44bf7108940451865a762dec16725506039fdd203f5946ee5bc790e9226c96511a43678a30f11f15b98a7eabd0b9c32186dc073367d0f948db3278000dbe9c32e6229e624a5e9cc0c667655953cc9ee6869d55e0c3b22c90009db1137f0cc9c901c68c9b3556d1bdc7a888337420839d796db6efc0c4d96cc9c1b03f0efa70822333ca1704be1ff8b24ffbac376dc6ee5a0a83bfd0b4a7e718260652474d8c91288a3e47ff5894f31b8ab93793762280c7d19b766bcdfe896e3b3dcbf983e57edc32e54dfde2dc907ea0f7f2f469efc6a076d84d626f250bedc47ae449c4292ce26adf6f1888ac690165dcb62cc79db59a11187cc81f3d45081d70ac902c158b7f2f4c547ade6501defd3bd6812382d46fe5bafe3884fe45b93522553839e2ab6680eaff3c4ebca8ac39eb7432b85133be657f9430a)) <<< 16000) + 0xdce8659bc220b5e48f6cb7dd81ec7d2ca17b360381aeba93f57883eea1151fa27eecadf61291e80e56cd2dff90e3b2d9e003ba2761b12462629ef440c11714669dfe9efbb319411c83d823b28bc7d3fea65b548095026b5c94b81ae762571096b703d2fa2cbb3eecfa14824a62780050ea0b4c853296ea435238fda020ebd721e28e121766328b707b6d330b8b66c282c7c22998b70efe7bb118927f58220b252e2a961481a89bc90d4f489462b24dab67b577200777aa4df45f538e7ac21ccef2a78e8b34e5cfa78f6b3450e6d1b578fc18b6a7f9933b14ab2f0eb0e855294af25da76918c6799c51dab075a16bff822d6ac92129e3b493cc13304a2be06372023cadae7a594938c51d6d8819c841295f031b901dee8b11c5649094f1b2f7aef6d0485b9aadc07ae05a1862c30c0a000800050e95811bb877f7c12d1f3b723e5dbe57fe3ee37a25fc792c9913e1e853f1a9efa4fa995db84c65f3aa2cafa05faa6124fa97bd6ce4442b3d750f511453f4deba6c0c684b5e400069ecad2e7800d9db10688c108c02100401004000011119b0907f82866814000258400164c8bd0a8003dbc88412a49bb101f668a106c92fd824c31f59420cd203158ba86b30000afff818001025282200800008d9001bbf20039f04664a621e53198298cb94c6588632a33194198c98ac24c463241a84204e8f384a94db061664bf70f51e456a3482a9facfe05c93730000000000000000002328638fbe3bdc17457981544aae5d391ef7ace31b746368ac119240000000000000000008c86f41d9fcb9f677196248603b7941fcfdee0511d111da0c864c00000000000000000221a2418424012002ff1246ae70dffbf7e9c8383ee23a05dc8850cab465a5798432e886b359513af38898700d909045bc5375f452e827c1624814689edb1ee0317aaafd245e127bcef2df40e1a73991357afac40359b5c78c23f6f5e0c805fc08dfedd753b390dc9435664c8700ccf0643d77ae34a43b7aaecf8a689fc619cb6a53ae28d362568b129bdce4e73d3371ab8cfd292fe69a4f1d8213d096a19000a3ccdef7bd2dfbcec1ee505382feacc76b19e6a22ce80d909400e14d548a3a15db0c6adbd21998b3d03fe87006c43d8b5b2fb8d9b5c464b3fbeb453892edcc1672980712ece50454daff2b780000000000000000008ea74497e42fd5e61ebbc3aab30d9fcc282bbe662233537ee763fb0000000000000000002321f71ab6e543de28add9e356be2487ed52de9d17288473a70c80000000000000000086b04a76c5351a11173353b08811be22980b3784f541189d267e000000000000000002196e6ab701eb816aa8860858220001ef5ab28e4565653e80307fe5fddd859c079d2df91e80d30c57fd3116132dc3169f60f6ded60d5f66bc072b23c7ad3c5fdcd1881812759e0424267546a258e1dc01bca4a8457fc09a00942c76789043ef64360e69e667b1f925759e9d1189592e26d29ce971c191a78461fcc72d019b08f4eca4d8909bba36eb705336a92edc74b7dacce4729006dee3e458a19a5098fe22a32223a2828649a251c8024530dd3c274861fe04a4bee04f50fbc76093df58003bba597698a1bfbfebb9f0fee1394003d514b9b7ec89a8ce9cfacaa8e0ff585fad8daa85b3235d76a0982e7482c18fcfaa76d8259eebf8537359164d7af9a637f402d9557c92f4db86ed8cc1a8088f0142ec519decca44ec6a36c4c6acbf29f1b3776fddb9c29868c2fdad8ece2464e6df4a7e0f869d02b2ed598a04c6bb9cdf4016d0e7d7486e207136a78cd0aa4885e754fe5a4192193702eda810d476f38d4b25265323f6b60692a3312a9b90a679ca388744994d81ee9841c02f3b0b65822f7b53e8ba226770b2fae5ef51e91cd0d02d71347f9f41598ca0b0e794a4390e1f96cc452b94a9a54abe0d2044490037d46314fe6c685f725368c78f4fd5b877d9639ebe10b214460640263120bb2d1a270576d7745c836b01dcccacc5ec4111247a8eae2cf5774e524b9f983eef4a909768a75385b07e467af8068043f257d4206177da9c4177e8c888d0df76437f60181408b8e90100a4663a70ec20b0b713e2bea1a257b95a69057c8e286dd76c179050160d448d99e9a032c66431631af25fa0325a13ff994676b7aafd825178853d22072c1551bda3fbff64f46fbb2ffc1330e46a073b666d07414bd84430d6169921824a8848561831a0b7cc6f058b56a6d916e30fe2783f58d5f820a4dce50ea8c7a3b19a0c13c23239862aaf50321eddfef45e0fc510d255123ffc62a6c8fbc2fae77f6be0821d189d24717da47342ff6d9db0e125dcf215ef52ba2f9ca09bc563721d552b9d12242091609598cf17c733181c74e86289102b4bf386acf6281dd6564eb23e82cda1c14f4760765b5aa876ed90cd01397ccd20b8eaa670e077e3f76c3783f8c482dec02901218f05001008002a888c7108634640028764630a63163ba08bd880e44c5e47f26e3d3f2ddb471e5f5b7f6b5f8b4828c49d04002eacc63d22ae76b3fa052e831225460698e60cc3c6010fa6a442797e0ef52feac3923e90c4d31155cc45c8adfe0e7ce6d52478df54020f01983ae848198950017f4cb2564867935c2f46deb2434390e25110e4270fc8a9b2f2b2ff4538fcf63fa99432f8e72e2b42cadd22a52084e2090c8be5cfb454d6efefb0a1fbbfa295c2580d106ca276ec33bc14323961e83569fd6ba80a2e7ab32de1f0c0ce99ecb8982c0278daf20f05c22a54368cc0b4b6476893d09239baffb37783c3237464df1ab94fc07a3720aafc3b)) <<< 16000) + 0xc4edff91a7dc760dc0885576bd1716dd9298e7e072ce026d87ba365a94aa68392b46027dab9c52ddca63c145519de69efd334659d7dd79f4221cf84a4cae684e9a84b77a929965d518c65981673915fa0220c7cf780945d82fb1fd7c9f5f1a10944cd20628163120300201e9b41bbc68040601dc53ec881c9eaa5ec0801da70f06048184001080400802267a8f816eb9c755956781122761ab5a39e05356915584810400100000d620002264224275f031b9011e56d73d2ca49c628eb6c40ce4209445d481409a2fb07869231c59923c0d28bb0230b1d04965f3212071a24346a5dfd6d20ef4bf8d670c79bc21adbb6d80000000000000000001283b398830d3531cf0a2771e1f66568256776e67fc42b8230bc24a380000000000000000004843ee356dca87bc515bb3c6ad7c490fdaa5bd3a2e5108e74e190000000000000000010d4c30d1d104d002c86315019af7cd969a0112166ee75cd44bec8b6ba56ca7ef07c422aac61eb6fa984663af281eb572cdb427ab6b0f3c5e71ad51103997c7b2808b470aa4ad87378d0705265225609c16df7434f25b4db29be32f2499e5189045885ff47d2d38ed836894dd4ac5989408bd9c6828f5eec8bbdce82a6bf76a3d03933fc12d1dfee2ef5b70b7981f9d8fc5b0d519482c7f105000961229022000bab200a3318819d7c0c6e404795b5cf4b292718a3adb1033908251efa7cd9c7038584891ad15addb7e7afbb1db94216e457e926c7900000000000000000011c39e0384e8b54dad81485677c8139c410c98b1ad0b5f1972e10e000000000000000000452fe5e05866046e5ea76ed093a346e8e315faf22fb6ba538f080000000000000000108b7355b80f5c0b53cb48038028000ff77163e2047edb86b0ff733f7656af8d6c499f9bfbf6d973760e75b83ee362a87ce9bb5cad9d654aa63959187ed9e039b44636c578fd5b86e138f29157c219098037a21e720d25c4813fcb350dad8660353581236a56eb22bf308007ff2a0d02b5b6aacf1bd1b0f96fa4e40b90ee33e0e109cdd469ce7ce70aca977e919084c08f2d187150004461005210c3108007d0887c9cc00f5d488d20a46072157030561e633c6ff5f212984878a77a3e2e8608150d7d6e9a2006917d1ecc8d1603e152cab972920080a46ebeb02889fddb71244402a702db1be749c18361fe9d0003f81d10b00b00004b246152430892183290c1008604040094be460176044b317f358bf04c5f41741844d85e492036ed8f9725006dfae188000408ca08402100401004619bd8f7f29701b7c336f9c04cb1a59323041f008000052117c0987f82c5ec1760159162f5e65369f3ab3768beb91f37b75e3712bdaae4fb5a30058bb51675153d159fcbaab9e33f41459703caf0850f05e5b458e39c71dc9e14e9e53bf1865f198678c03845c0768054cda141ef2925d012081c9e991c462c1876f8ed489de39507493f05e263581d36754520dec32733d583dadc6bf7f2fa52167f4821e2c7a5494ff53024500df8b0cba865b115712a9f671d5a4ac5c5a7b84946712b78f5453b8eb4b7d87d3827d92f13ec0c7e0672b2d835ef72aa1f2345f22f2f5da93c24c10eb5e569d2d22c028c69b776b881e9388a6b18d52b3f2e83500cd4bdccc1981f3089a64d92941cb1aea3dfd5bf1db14ecb6a9e4d272ab35ec735101a0fbd5443655ce437d39ee18b85abebadf87895c13971780b1dfb68818b0e9c3fc0ac1d12cd08880201ecce35825f6b034805dd0d4afb841b1dc79bffed5952c361314619a872cae4bd71a04c5831ee00014d87c003180063ad5b55cd93f5674ba08eccada7a9741d58dee5505e51d952598f886f9edae5e7d5eb34558632d0b1ba982d1c2f62925acf625531b66656dc0fbed3ee2aefaf41a9a03c0b013866876acdc9c8362161f294a22cf97ed318e2e0270ea89b0d3d0f827d3607ef031733533f62e6b9362b6889580b865553a63362ebcce328516651ce399e4e552c0af2d52c53d400d54529323efdecb76b8055ff244fc7bc466b8867b263bfc66e5f5db7945b4451bf55cbd2a2632867c4460bc375723d19be9d9fafb80153d7d234f7fe3bfad50fb7dd1cc5c1d3f7624486d6448808bf9b5bcec3b26f31781f49c5807c4449478e9285f1e894b7ee918fb7a51e4bd3979ee1688e455c93523015fe83ebf0e4665590648ce4f390879db14e6f0868ea1c000121a45e857a07c0a711b00008900f802000016c88412c0055bcd011fdd3f3b6ad6a7311fe24870d8ce7545391546e4ec1c3bd3221e22db8ced54444f08f20c98ce462a2c92904b972f0e4bf24d124b5583a9eb0ea7ee946d403490a4889a76b367528b94d94ba2b903d5d0e8f00800049fda25b9dd33f0e0ac79d42ffd57d751363ae89d00a55403ad7c4a1972f2ad839235cbb15f027717c9ed561c1a92402d7ba5e4597cf1a614df06a31f34be93bdd610f6c75927cab3f2edc1a5c4e410dc3c4eb579adf50a3babca767b6d245ed6ab3f90a6bb0d9dec8b5f725762e1e486b6230b1795b1358b7badcec7d82a06b329c950b81ce93de2e964726150802b6caccfae57cfd4d7030d7fd133e411c212e8e9bc0003e61ccf335f42d0b4aada5f1fb99fc0c0e49f34ecde92b3317fbd836600000000000000000023a9d125f90bf57987aef0eaacc367f30a0aef99888cd4dfb9d8fec0000000000000000008cb04a76c5351a11173353b08811be22980b3784f541189d267e0000000000000000021bd8b7ed58b68165b9aadc07ae05a963a2014010020873d2495cb11ec19d288eb44476a0)) <<< 16000) + 0x698d04b8c35ff37e5f4a812f7ad7a9e8fb9ae7ba192117b5500c85cff9a868871734d7de0b85e26fa70afaac0052c379528fb7924ea944abbe4ea5f4168fb1e8509c033b474dc5efc02cd5b9a3f0126cf8c48bd4e601e5b77004d3e4c4536d050159690c731ada000f5e45e4d42f0621772d0bb1485d4a42164a174250b99085c8742e22a050110498685c0262de1216e050b6808009d1cd8491378d6a9dba0298daa043a6d97c7fadc2d2e380a177faaa0000000000000000008a0dfd26a0cb90eafbc46f960ac252d8caae0ee3e8695310e39000000000000000002116e6ab701eb816648a482780700480300a0aa000c7d8d43dc36e957640ab4355d5f9af4c79882660c50212345901f219d96d809f0d4c618206cc9e00004a4cd51a89224053e2a2159e9b99618595173fa991b8e0244ab11a1435faa6992c3b9419a4d516a2d83216b0d0b50485a414000b444027d748054911a190d013e70a448c0a9aa416b01841894d62e7e0c1887d8fd4380c014b1a04073a2001d41ab92d50c0936f0bd270282aa0023d0a3d7d5880084d79266b1080a00383811046a90f005203816801000134900ae1520295b261e9fa8f3bdd59de75d427f3adbe8fe9371fc043e1f4c3bb50000000000000000000000000000000000000000000000000000c8230a302182480400180a0aa0201faf6eadcf7d1c2afb2bb8fdfb895a208aecf9849f2ed4c92eed26441e00504198ef842f14379425666f6a94a8ca3c0424615e6b0f2e565c76a55537c014b95bfa9df057f17f141a264928986239c841b05cb8d9462768668eb32e8b3988598b42ca52164250b18c8588542c2221600d0af80857804000b5a4054d0880c8999af818dc82d7ff045aeb2484a78fef1acd4f82412822421c21401000800010039aedb34e062dbcb5d40d3ae4bae73afdbd45d01a1baf5e2cc2d14f5a00dbdc8b4bbeb33c97925303c1702898b57298aa26a9591ac31324380a36be063720c28769e792a6d6d7b0cf131183a02503b560eb47a0495bd354dadaf61e1f7102300908a0890870860810000401894b78a82ff7c8ceef31891a28d8abe14d75183fd41a00cb1b8ef7adfc5673a939a93b4b1ae9b1f202c7c03be27f6f470f5d94e338076d2e0611be98df138a7ad20e669ad1358d0d31c61ade0bb43a1ce18cc603cd522b88ea0008a24575162b88315b158190a85681721326a3b5c7ca0304f50c5edfe380610b99bd5e08043802d582d6091008039643edd9c3c0812920d2b607b2000439c355df042003ff65251f772451bc954ae8403f2dd6a1f3c40290bc65c2e03457c0c6e416bff822d75924253c7f78d66a7c1246c674bda42454db4a6111561265ef585c20073ec671c0f800000000000000007f1d5c832d1b5e1db3b05f6b1a32a748cdc4c3244a95b4084000000000000000000000000000000000000000000000002f1da8068488408282102200000020047ef7ea0716da4b5cdec4e356e6361c43f3ce1d48a54df472c1e2e75273d8eeae7689fa86f16a8590d9abd3f02550b82fe557baf7b5e15f61b6f84c281a1fe9b543f51888ce2a5db4ffaf7d5d1b8c4f2f335bc7db27428e5a70e1eea7f3e02bbf0f167f0a833cbf5c11d18c1a924f4d048814c73df7d1ec0204b4b48664330f0101140036f5a32fe0504e5a8bb0f42ca0102924c67e8f90a0300518e71077121000000941d2921962ae500319856ee169e051cc40e806a0a0000284212a7b094398ac88eaca97732e400bc43febe357b04791ab7f5f14baaac6c600fc6f89bc4ea547200000000000000000010c891cc1491490c90880020001030a5169e4061e48c3638fb9c4869b4063338f1109ec4d403c1890ad5cd16fee431a4c2b6c42341ed13724af256e21ff5f1abd823c8d5bfaf8a5d556363007e37c4de2752a390000000000000000000875a898eac3ea71667fe20355b95054873dba9a4fd946940000000000000001e1da806648e60a50a48a6821020115f588485d52209bf357db6fba58cb4fdc4f7be2596300297b8f279cf860881f89174238ab0e4d5847c883f5a42c3f2713f886e60c325fa67dbddca38f07350efb0a881e94560242ae12156050aa8280013d48aa14c54c96064431521de4c03709506017887fd7c6af608f2356febe2975558d8c01f8df13789d4a8e4000000000000000000219da8066588408404402280000f5f02966dc8a3717cf6b0e7372028ba905c10ec84344326a3a9bb780693268a22aaf54fa5e883dc70a035772fbc4c103db12d358b7ef25bb3af33516065abcf0ae04a42c7524bf2868a88485402429e0a14e050a68080011748891e8530942584201d0909502800358085b9c852c54002eac400677c82826c529262925b0442983e0e802016290028d8ce97b4848a9b694c222ac24cbdeb0b8400e7d8ce381f00000000000000000fe3ab9065a36bc3b6760bed634654e919b898648952b68108000000000000000000000000000000000000000000000005e7b16fdab16d02d391f7b5097214b360d7e19d106bf0ce4204144141200180403bc5073c3936aaa26432c66c8a031cf36a889249c10b41ee34d70dd02c0b05e72622e41a4bc1070b407b8fa998eda26cb5ec517bdd9a81182d46d9542160a58204e4811900aa031de9c9fd8aa3b9a5b618eaf3eb44cc930ce093bdd9810cfd20bc50dc4c8b2be2c27a851e2032cc542cbd8627b2bc5a837f1f2f370418982e8e79de48dcb7cf3e8200a7fd1f9be8a6f85a9aee52f4fa5cd46fd9c6ae4341096b18cb8515544b3f238437aef6b3)) <<< 16000) + 0x060a465650780408a132fd2b2801b8e758843000d32a65c000098708c021c6090290f2c4061237cdc2c70e389d6f5708094b3f999f0c1466bcb06a6806e2fc4d44600006a5b2000138a118042071457b2842a9488415999dc90015ad8de56943e43b4d2526f8f9f4fd220c167811844ad016b2b6f8d9b505f4fd5b28d773129bac88133ffc22585611f81f48fcaa1d46508c118dd269cbb11efeca1a81eda843292fcd6a68913f1f010b01b7767a3da0765a067c12c061021a4d7909d553d60b7c9232a963ea5d87b8a8382c4639e9d1e5f9a7dc81d9b5fa6dcdf384a68e56896cde8b76f786d8190804b96890151f68228ebdb472b0197c4dfe738b0ed1d26c3a9da0e8b03d173d465970f29ccb69fa0f07d8d4ddb8f96bd2301b302c5e94b4da011dcc124f9883a04babd9712de4c09ad0df80e9938dd5df0df66c96b9a6f7279d4720390b747d177de0d2d7aefd2d24e34b10ce6a62269da66718bf2d4c17348c34aa79cb047e55b1238010bdcb1ca8b526df82206de9a0d76d2449820aa577db43acb7206cf2fa2071de378ae102e63de0c4c9111980e33a409b48f077414051d92ce281286108040000420884048002c808a38c800330c8a30280038ec8a292c510862863b1421d8810ec504662282b1401189f88c4f8361ae0b1130189e80f060a44a910040d113d3db28e142ba4207d0c2183386ed65803a3eceaf0a0187bf6a5510000f3b0eb0400000009d008c0211789dc5e43bcae74953af87818d2d6f312e0258d8ce97b4848a9b694c222ac24cbdeb0b8400e7d8ce381f00000000000000000fdec5bf6ac5b40b3248385185144340200000002374a4611bd1fb2c60ecf7f6ea77ac1aa64a605397111013ce3fb95108dedad543741e4bf93a01a8f9cfd2f11abfe6eb4d7b620f64b55a751a318791a774728c5a44b891c2b77dfa520779701141cb1ac889d8f14400011f9684c009fe6d2550000988088021a60175f8ce45928159c328144d79197a96690be8a10cf2200c96f8900004a28440109162583e469cd283247833896517961c78e3894452f6502513c4efefc9c400ddd7b40293021180404f00627603d31dd029b11a059a3e3b39a302bfaad0a7e284032bc4328b05c7c75bb98c083258e4aa260423008698d4d553ba205991a1ec9860588cb7385960a859d27623023d7d61708a0064a16c9058108801000026c7ce03db79c96616e59272f350284efb158d1e515966e5412c1b47bda03e20059cb9d9bc98108c0202740a00015220007f644e444000b2644e057243dca14d5268e99477ce1183c8440053e5001238916f000120e11004000039c8003eb1ed583ad0b5ffc116b5649094f1da49e6099825045e2771790ef2b9d2569f93758b5223a9f1409710ffaf8d5ec11e46adfd7c52eaab1b1803f1be26f13a951c80000000000000000004333873852851852000000000ecb908215203434a808b66b8c81bd48b58d1a712409e2ffe31a0f5db474e496f98d815ebeb4ec03f31fa9b98847e4c38bbcd446eaa174dd74814074efa5e46fa27e785831ba946252742e80027e91372909b0880039e089a98c4d0571789dc5e43bcae7495a7e4dd62d488ea7c5025c43febe357b04791ab7f5f14baaac6c600fc6f89bc4ea547200000000000000000010cb7355b80f5c0b32c51443032432031c00000009048df0c2bc116102e362271a1999cd38641aee6cb222b6811fcb14e1acbea7982f28c45c4937ef02bcdef23662cf506fc343ba653a77002038364e06d8f400e0a0008a04005d1cc5e27717d6bff822d6ac92129e3bb3c5ae1f04a5b9aadc07ae0590610e08c084098016008008000077594f2dc38d449e4ed3a0a0ee8a8b8070ccf0811f588b923312b747447716a80011e11331189908e4803e89b7bc60c2b17ba8206169753bb3b8e20626c549c184628ac823204a18460109206fe4eae0306e9fad1f446172c426f1e1c4b132cd514408155689ce1c029a0e2f98098308802000027644202762b0df9b83838879f667590c2149066ac42898b6740be941bcc098da22870468b1f49602b20d0d9e380041ae0e880140a11004000066c8900cf10ffaf8d5ec11e46adfd7c52eaab1b1803f1be26f13a951c8000000000000000000438d8ce97b4848a9b694c222ac24cbdeb0b8400e7d8ce381f00000000000000000fe3ab9065a36bc3b6760bed634654e919b898648952b68108000000000000000000000000000000000000000000000005e2dcd56e03d702d0a1040c5084082040c55526446ed192f1df7b5b50b86fbccaf9b04e50de29e2c917dfb1d5e39f3388efd633a41e8cbdc45ed6d20a951f906ce424b9847c04c2b79ea3b80a68ff6f724cdaf960996e4923f6ee6c62e7c8f74c67810aea923b7948cb4085ddea6f8c10e8667cfbb1e0094769589a000ee244c41721c274501ea142101f3584c184a0835b8ec4058a34f1d186080bf528843002c0ffc18a200500f1020d00409c908c0200002f844c0a412a4a12f210970e82207425a3a12c190958a8074242540a000e522252321281500150191274189320849466248320441984980c48c07c45be913c466054804301590114387d832600fa9ad95c160219a7be663803b80d4fc200201316110043b560eb46143b4f3c9536b6bd86e5f970ef8128af818dc816bff822d6ac92129e3abe61a93f04a8321281bc9805be6a64a74502e92407712965360c2fa2cabf5400b07dbe621b900000000000000000088879268660640640003a2e6cc18029792a90c3a338354ae0b7b42666de8ad)) <<< 16000) + 0xb4516328bf15a0648a2e4f4b609236c135bda300168ffa95021d7707915834deed0b40f4b1716b8afce41cfbfe1877aebd44b8d8a68fcc9bea94a024562f13b8beb5ffc116b52d7e7611db0953fe78257cd4c94e8a05d2480ee252ca6c185f45957ea80160fb7cc437200000000000000000110b7355b80f5c0b4e47ded425c852cd835f867441afc339081112cb14814a10800032059b690a0ae989bf5f7d537ece7ed2bf9d6a2559f325561ea380a57c11292dd038afc9c966061c424ebbd58735d2383420f12538fc1d2d0a53765ddd11b9e914c5bc6c0940cb90e04d04a1464ed1db1789dc5f5affe08b5a96bf3b08ed84a9ff3c12bd8b7ed58b68165b9aadc07ae05a723ef6a12e42966c1afc33a20d7e19c840891860c58a68048001c6a3ab52b3c72e0661abee0a2718d5dd6548afce74e9f51fd6c73ea3cb04ab7a25ffec49dd084a0c8994f5725f29514c72a2ccd737c53c9911ebcf5a2e1347093d47d2c7041f11e39c1814e9647690304a93bb66f440632dc6144c00058de0380280c220084cd054a38a14d1e11b521021c10d557d6e808c30880200001644488240004f440017fc8840e8484551789dc5f5affe08b5a96bf3b08ed84a9ff3c12a1f71ab6e543de28add9e356be2487ed52de9d17288473a70c800000000000000000865b9aadc07ae059a051c21a21e1a001c000843eca51a4e88c5c2ce9240e29d2484fee4592bccb9615efabe3a7f7500fd22fb0734ae568b31a934e7e3ac7132fd6ad0f5bf3b5f0424ed6fd8db5d5fec49fc6f50004412001fb2400554089012c47c5623c2b11d1184986ee96fa0f7e66a9d0202726ae14a0a9a6002243ee356dca87bc515bb3c6ad7c490fdaa5bd3a2e5108e74e190000000000000000010d0d37fd3b6ab78def212279109aff56ce24a8dc0d700eb1d9b3800000000000000000447b16fdab16d02cb7355b80f5c0b540a2841032c02fbb8311484cd81ad9fa02b0a25cd2d6b930e65704b230e85ae90ee9e5dab6dc2a461487bf62343789612132ad30e091304551d26f60eaa9054c904ffbb16233c560bb105d7d6eac338a76a0af1a710fe5c1a3bd8327f73d2c3fa396dec82302b158961e8c42b7162c4791a112888653e02af9801167bc780580115921b090004e0357f0130411004346038470c3983735e5872c91a59698f58202045d9d5524042100878c154d17011834f8a5546290a441e10aa08086d635da28800b51bcbe9e011f81d62c50005a88e41938211004000059480012b902b090001e0911c0d88d82ebe06372023cadae7a594938c51d6d8819c8412873c0709d16a9b5b01131f1aeebf353a4b7b198a5897924f480040000000000000000008c161244de35aa76e80a636a810e9b65f1feb70b4b8e0285dfeaa80000000000000000022966f551a48e4a1294b5e2ec3e4ee415d52b4fd5820f1a6a2d080000000000000000086879248678060030030625e7ddb6a097d610206fe9152e7a75c4b7bd88685a427042b113836c13a007df8a810833f3dd15ca9c074b687404b40794e7253987d681c9880293285a47ca08dfa1583c35253802d5c90c71efa70e1abce99b31b5b883e1aaa760475705049bf29158011bd5241e2835aa4ea84e6cea8ee6b5f4001f7088d108464742303aba5be83ff3354e81f5918a2ba4756f01042174b7d07bf3354e8101393570a5054d3001121f71ab6e543de28add9e356be2487ed52de9d17288473a70c800000000000000000865b9aadc07ae05a1811611011c0006df8b448a21c1f1f07af2ef4e7aaad8af6f0eedc6784fbe327d672a1d55a2296dcd8dcf881fc429ade77bf5e91670011f2f8e5d1fc6d6a090c37fe4dc3561a9a886eecc402d9385ba797167b4051256729eb75b9e8335d66442ceeb803a94190154c9f7a0441286f15dab751e92b7f21098221445c3622c130320980033e911531076988450841ae0211301000cd3911245888a0c440f621e7310e3988698c430b62161310a05fcd4c94e8a05d2480ee252ca6c185f45957ea80160fb7cc437200000000000000000111ec5bf6ac5b40b2dcd56e03d702d391f7b5097214b360d7e19d106bf0ce42042482030c230020040001c8e15a0240bc77f0c959deae2e570b71e6ef46e27312d93ed7071a58dd1cb0d7c010865ebfd3faded63a8b0d0f8735a4a9401b62cb5f5b5a019eecda9b44a7a02725f2169430f8e710a8978e4f2802f8c057f00069acd3b100000090b084021804b426cc400088c0f80220200200810909c0500401000004440001d08840e841c341660290110002ed74009af7accf2000244504201000009020003a04418a620a1b90c40c02e752403ecc0a0dc002a999cb2c40001108ce08802000018e4000f888821ec40c975f031b902d7ff045ad5924253c757cc3527e094af818dc82d7ff045aeb2484a78fef1acd4f8247cd4c94e8a05d2480ee252ca6c185f45957ea80160fb7cc437200000000000000000110ce14d04704e0070060100000480eedf767886f8ba1c4a67eb1d2bcedb82cd9293711d4ee1ebc9c7375d3d261d4dc700d547fd8ab4afa7bc98a3a8b310b332e18ad189b79de5a05bae4b612bda44324879e1400137c8811ac074c620233100158498ae02802008e2cfdc1a764d00d42320060044284201000008421fe1384967ff7fe764e339f89182e4a60c07f3d87df2533f92774a70000000000000000010e3633a5ed2122a6da53088ab0932f7ac2e10039f6338e07c00000000000000003fbb100dec5bf6ac5b40b43071844c04002c0000c395ea1)) <<< 16000) + 0x4dcdd095fa12b2df44ed425b9547a83412be5c8aabe818457fb59bc02cf4efc88eea86bd55cc048c9713a0be9f45d4e411e3264780a70ca6ef9be6056a9f13235b070bc10efa8e9922b4001478d8c2fe4cb67eeacd03b8ad8b28b37ddc5e2bfef9c863e902aaa4e1f8df69ecf19e470050f4794b258ca6cf10e183b6eddcb9a14f36f270119c89a43d4ab05dcbf73152d80ba9e05141a0db9b4994ac885013d0105c56bb3073fca910939ef85e34dacef48cc6c1c5f28008e911c1c488842fffe72cb7f1bcf0fb5c4f895b9a62fe90ca605d9ee40d8e7f3c4001602b593430ca9777aab62fc6bf212d341c17c278a9ae5bf10477e4b5f4f7e7a8696391ee98b287c360e671e51c656cd0e882a1d390edf6a743b7089f851d8490842cec0000d0443e85700691081ff688164372c7b3802a8722f09000985b8344010024282100800007510f92900404ac6112a16689a9fd55c450d4905348815c388174821e04cdf91dd6c63b860518f18d343233e737480a647e96b49799acec50069c9f8ea9e02e949004b482a75546d186b6b43dd344985108221436bc8a325241659f3f8c84084337395a302c0cea9650024142100800006f10fe0d87c02e8773e8fd94903c9d74820900492df1924803baabd2228078431536004a2840010818c8f8124450f22905b892075129a66c008c508002000015e43f46410c320001fa21ec4b0fc2187a8cc1f016000bda43ece7018010044c091b3fff3c2d9bfb0130f2b8bfff07e3c3049dfe997ec2805951d4ad5d3ca3d492562f3de700893fa1e980931dce44d0c1c3452797014ef5a32e4e9d3c6dba754f19e509c1ea446bf39857d37fe0b03d3b897e75ab94e804f84c340c067fb3f8d5bac84003651813896926c719b4564569bf3a29b64b8374bcc261f112e78827fb686e99e4a11332174ab5ca6ca8d664b1e958c5e68b016bc61cf4ff0002555f63fd7f452daf1943faab9d96e5f6234f9d31e025fefb64a9d729a0d3a41d6de063ce22deee596d68e461c19964f3ddf9cc6c7eaeb0019ad36ca726cb635778e236759e34510a1230a5f25a215ed28ff2a438f8596dfaf64fd1f367086933c3cc6681bba1c0898bcaa891836d7febc5d82391c7c9bc9c2ddb28e04f96b50cac5332b31c1736c1a6d4ea59e043486c6f3da358bff1f6434d52680009cf301c0100400001110fa11d0439d3a9da803df49db94401656588d600804648400100000b721f24281fdd31712504c7c4b6980110a0f00403e0070180100400001110f71d87b0ec3d4460f80b00012421e83a0f31507906800330cd88c11b084a648de77d28950ba5ea209dd90e0dca575829f168b9e5276074cb3909bf43a65018c217e9dc89ca48b715b796bc64a8fdd4cddb21c082d18016e35d41eab4cee408429635b57eb61f9b4d9a2fbb9814d139d58bdfcd2116f56a95b9ccc759d200705643c76eda4cc76ee297477860154138a9a67f61f3eef7bc9b12b64ae9f8e86aa2fff6b367673d4740aee2c5a9a58ea47d9fb55ea4d5d6dc14c0a3cb6330711eee335280dc0013fa8abf6230a9524bb40b896f6419b5aa099bd0c056b5b958b157fa8b775028cfb12769d683d071276404803436d7ba1b4193cff972527b400544e0e0263a773e4dd3448cbe47000f08d338b38f9a213342145b5bba950cca62e44ec9ad78c6a335ea01da7964fa31b5c319eec66b7acf00f1150780683bc0400125c43b9141da820ec290759283a8841d2120e805001563901d410028e800e424e0c6bf265d6caff2cc058c3d0979db88d0a0b261959a583612240079b9dc572bd06380cd7f40e35a2924602a8bf9d5cc61d306020e281a9291edf40104c128c5c3b9c5d000caa05673c3705c4f1d68f04fd172da202726ae1a71ba319e08e7507f846974409942197baac2218f15ce73065fdb66022000000000000000000000000000000000000000000000005d2dcd56e03d702cca0c60830830440020003d3c23f2d30980e5438fcd123643265adcd30aec1713c12ab333962f3fa0e69c0d9bb34d3dc800086d520562f2bc25c5ce8c5e643701f60584f83098624006e5c8624f4a9a52b4b4a0b189521b68343a382eed7a86d8342a26edc2c01e2dd018224ffff61fa6f2200c14c7fbab7c9c00133408500fb9808553d60c01569153095b088d40038987a3cb0b788841ffdc93bc4a3244801de4716fdbacbe2a163a00c60780d80002b6203a420050d0003fe10e7410731e8328e41926a0c829072928390841b83a0c711071868388241c20a000b7320a0428bc4ee2f32eaf022b81d5d0296fcf0dcb904609e3ad1e10f8fab6301393570b9924ed041111610a10c08408c00600402088033b5bded5cb3a2d675a29f0d7d9098bae07550326001ec6a6a71e597a6fccdddb0e5d5f418427489f202d094cbdae8a1c45b38a6bc9019510c283840f4470b258184a35c9d1014094f1da628802f5d8bf6800009c9084021421eb46408e40637c8d956081d7490769c1800c9a6f788004830440100d90906c028380140002484354a61a85303225e0c3e5354461c24958d8dfc30a16b06ed624032ef5c36c6007cec91ba1400a8a5231400009890880201a2120cf05067028334040003344074841be420de190658480013d486e9ac370761b633c086b472992f42c19f1a1f827108051d9167f5141010fcde149118601dee194c0340c02e5d5481aa02004aadf609bc44017d376949080de3ba13e698635bb21ba38001fc7442a02058c1574c4909428bea4b982686bb4e7ec7141ddb65a7b03064c19b5650a)) <<< 16000) + 0x025402a610200816f536706006aa1940e2000504844010c1c593d90412c62ee2ae1fce112dd06a3e2c4bc9af1df0710866fd810102048dab9ec09830880201b413c43febe357b04791ab7f5f14baaac6c600fc6f89bc4ea547200000000000000000010e3ab9065a36bc3b6760bed634654e919b898648952b68108000000000000000000000000000000000000000000000005e22482c62c52c41c41023000afcebf1f6f9a3ae707683b7ca28ed7cbe5087dce01dd371e26140c09da9440c4d8998c23448bb75187350710b726680023490d90906c04835c141ac0200062821aa530d42981914ec62209ea319a9c18442a933184a0eaba246bef4306493b17e0d12823de2ead6ee9408ffa45567e87040b210e590e3020fcc4fc98400c88102902006982e3ab9065a36bc3b6760bed634654e919b898648952b68108000000000000000000000000000000000000000000000005e12072852831832811c11812c002d5384348c138870d58c00539cc2fad691cf538a229b5f270a3b3917ae6d415df2e69be867ed5e72f1694c525360091395d31814d52e68001cf906e0d069048344241a0120cf0506700833404000c724074941983a0cb0900075c10ca410649e8320c418e22001168218cba0c5590621a830c44184220c10d060048006918804863100d38c3032970bcf591c30c054082bd011c128784e4094c30480556759361c004b18ea9bd0602708746351b140298db4bb8b5415404100488f594a1b804d8fd57edc58a2ec8540380bf1d05f0c82f4441781a0bb0905d0282e404170020002cd216e620b61105a8882d0041660200f924205611078a2bac8033b0c70cec6c78dceb8a1bb391efdcc50c30a0019934dc2831f0eff7a90040445c299be0d8e0166649d58a410004b329d50b81001cb4af93afd1441451031a520ac0814426d916e4e814382c808b0700e381f390ec001033a9b81190c122c5fb10525a9220d2f00438d901e949f82a4410131d2deee3c0c09bb2f759e018904280145111e7f5618c2450ffeb496a9221e125b36ac8106c5647b0a4070d4d353801c1098423f380c08470af7e0810018bd86ef650084a0100001ab323925ae1d77481b1163af158406216f0b10c1c397695211310107c19f762070875b1590f4130412804000052c80e82e470593b97b19034e172301f88118a7fd1d1c4069c396416a1c33ddcaef5d8e11b45ac2e6840423e332b1008011e10f105a00094021036f38ad7c60204607598cf4440664aeb56d7470e10edc113e10116a36e1ef01c20e04c7aaa82000945724c229c009c04000031042c8141620a0b0010001c590af150570a82b4541582a0ab090550082a404150020a70105300829404058020a4010004f9104409ec1d91fe0c68c9935a0df4498e0f20f5e0ce11d40d03dd7800000000000000004011c3143103182102100080450057b3cddf0d3adc728b4b86a0cbfb2837ac2612148510856b03fc218d1947f4c3e89e2f439b7f7c25790e382ee76df5d4d2f93ae161f6ab2dcc0b74c9e1fad85cc23ed2ceeb8f5dfdfa3b56470b1d51f1b06cbdf2ce62f000000000000000000431c2789e75686a6c55d8b08837725d720c4f592b69fa6eb9e568000000000000000000000000000000000000000000000000000198870c30c204700600501141105cb07a632efbb3c9b409991194c3c53749e129a98a3a59842f3171d8295dba0e75124d2ae687f1225f8e9e8ec9c811b6a0ec3c9a26206046a77e8e58b843ad5f21f9ca7d7339e6f24303baabca70a9537a1dc8e2fec783649655168518080018148004c010a251850a6c2812613e8b09e4184e9ac270a61364b09a2184c8ec2606612e2baf818dc84c2019c2280e0f0d6892330e5bb04859bd5469239284a52d78bb0f93b905754ad3f56083c69a8b4200000000000000000218f034a2ec9231c599268bec1e1845d481408466484304182380300200a0a800ff1ac4ecd3d226afb84ebbc2049ec6849c60b6a7d38fdc8ac89542a7d17ec1452baa3fd4f600053fa195ade0dae91b38ec9629e94986f6152b8ffaa3849f385cffff1c34fb23a32565d2541ad035e1e3f5388208d4b3346719d47be6636419eaca2cfd0095604629345cd6495f0bd8adbdd22731a36a75e6a4801675682da418f6dc7c1d90d8e8b98267992a920a9639234b5a2e2d0dec46aabeb19224a4651444ce4696a420001348d4147c9bb37c25bb7f1a6ac4fb92591fd40bd7078a60b376896bc518510c70cc47b73ba7f2e6a6f108a0229386428cabd4e369cae9c4f8328c97b03d28df4bb214ad8ad46799f79012795a4008083aaa1b73bdce84088022eac43cd894eaee18f0d18a5d257300b7e314194d26024ad98d1223ac8bebbc30ca866f877267fcd914d009f8b0138978d3d8b5055136d08986f8441e61c76d7fdb07d8d763c2a57bce1da97aa25abccb449b98a9f4d257b0cb552d606fadde801961d606be75753f95602126dd3e84a030b757724e487f7aec743802341584d473c6bd8219ddc36697aa21789f63fa788b02dd26b15afbbe8a8000000000000000000000000000000000000000000000000001944818a08a04b00a01102fb89ed8c96264928f1ddfef7703fbd0452b56f13c395ce572659dfb6dd40aed4d701ab076e81ac7fe2c22afd0be72ae499a3700d93628c90094a67e640bc58fb2d482f2af2c336ba20404001e1add8d63307c8bb942b98f9047255e1690eb3257a5943842b8e5e889e2b87b2e464fcf5150958f2253ced33684582800171484b22c255061287)) <<< 16000) + 0xb09311d7c0c6e426100ce114070786b44919872dd8245f03dd9b95d32e126a31c0ce7d2a86078b4ed79e2a5dc9a69597448e1bb28bc0517531e99287d15b20000000000000000041433df6d01c4768394ef79af6de172440704017cc2b67ce39db6000000000000000000000000000000000000000000000000000198781a51764918e2cc9345f60f0c22ea40a042351841422801c04028538fd883b3d821b3375f07807488a256a2a0f5a5aa1749d5b5e4bceffb86f83bcf0e2756c064cd3060de60033eef7608be76fa18578814d577c3926ef612683dac804a4776bf9d7f35bf764d3715047332594551244a307101f234620901f50d569889832fe57296e4120a35669e5d4474c9011f4a9970808dd5dfcd8069eaca42e0b7bedf03dd9b95d32e126a31c0ce7d2a86079e6221615e607e3d13518e0639f4aa181fa30573e17282c02484f4e08fafa34a394e8178b5bcfd86b400000000000000000106184a998cc77bbc2ca528df4c28279a70b89cbb8fe920a53800000000000000004042c41841041420414216d3e18f4b011f4caa369795b3ec76401be5232461ec3cf297285c662e31d34df39af1dcaeec686f9986cd0804c7ed3eaeab101c17868b0d3c07f7f655174a7b90f538210675c7d53c84a5298163ebee57293beca94aca79424854000c7c4244b61205308f2584712c234770cf7db40711da0e53bde6bdb785c9101c1005f30ad9f38e76d80000000000000000000000000000000000000000000000000006613052021422c01800c0440002fc6bda708e40caa3ec375dcedf4a90a9ee7eb9b5c16431ce2a84e8bab9fbc68110eda130ac28fadbb72746b0aa40f10054299656e75c37cfdc0f60dac3545370868af00db88c3a56a2bab114b87494a111f4881fcc71d465d827cf1a74982072caef285101007a0b6ba602016e340e16095e9c008620210c6b8591004d9491fb6a80008139c1100400005f88460a822c04000d1842288410c1208905000b36104a1500133c10444984414ebe063720d9ca9bfe5800b71b00144f0d806412a1a6ffa76d56f1bde4244f22135fead9c4951b81ae01d63b36700000000000000000088e78d7b0433bb86cd2f5442f13ec7f4f11605ba4d62b5f77d150000000000000000000000000000000000000000000000000003298c10408e0080282acf1d4c878116556346dd3db63eb6f8a41a2e99971e5d7e6bf7811aee11cd1288494a00b93dca5c9f272cfa72cf6afd0e665e90880afe600190a1e5f00c8225fb852c895dbc52096a40abb01aa8975c592f2ae50a9d6ca8e60ec8662a808419c14f477c046fe34d567f8fe1d56ef3042153a787b2c1faf7511d9a2211a22261b0c892ee9aaf4abdc500bd8ac8ad2f74b2e0b3b1de1f279db6aa370de872abe7db44b380ce82b801d7da099b5b782ac7a2fb789b868e3dc2d05c9b2d8c94971293abd960b24e4454d41008f9503a9ecfb7c7f8f8b7c1a47d44fcd228dab2b7b560eb4ffede0b7a6108918d44ba0e1410af81eecdcae997093518e0673e954303d1b19d2f69091536d298445584997bd6170801cfb19c703e00000000000000001f9943161141101020940220156cfcb4bebb14c885df8a36c5eaedd70c564dc8bde8456b8d3e86ba11ef0abecff0e48333df90758422fbef51a72f71bb2b6f786b0b5bfb0dd7fe98df42088a498c521e79da185bf193685c0a087a7272f5890808212e2b0500850811458b0eaf0107fe59210a6a0b0026ac2fd583070013230f4e3206002d252ccdc4110005938bbdb020a74a3eb7f393608282c02800012a9ed583ad3ffb782de98422463512e8385042be07bb372ba65c24d463819cfa550c0f3f3d641d04b816648a5024823823000008804a77a300966d2fc470f628a60e836c18e614d985064df81506b80ae0d3fe9d9d57d974f1ecca6628a522284380c000c1884302ebe063720d9ca9bfe5800b71b00144f0d806412af81eecdcae997093518e0673e954303d887fd7c6af608f2356febe2975558d8c01f8df13789d4a8e400000000000000000021d6c4303bb605dd506acba2470dd945e02a685ca443f95d269800000000000000000851d5c832d1b5e1db3b05f6b1a32a748cdc4c3244a95b4084000000000000000000000000000000000000000000000002f28e30411c008025b590746569486053280b2fe53730b84d3d450e56cbfcac004135965f54b7f17c1b27d0a7f59f0f70e3a1134688a47d0e6090d47e51554039ba263c1cd7c00d1d7244a38aaeca1e5d8ef24cb37c504cad4c6401d7b21383e0b4968795948dacf8f0bcf29d245e92d1b2d4c0087ff9645078601582f58804cd70843d8e95be07bb372ba65c24d463819cfa550c0f621ff5f1abd823c8d5bfaf8a5d556363007e37c4de2752a390000000000000000000875b10c0eed8177541ab2e891c37651780a9a172910fe5749a60000000000000000021475720cb46d7876cec17dac68ca9d2337130c912a56d021000000000000000000000000000000000000000000000000bc840e78a18678060168fbcc5bd1ca010c92b1f36396e3f244cf26a9e853edd6db72b3782f93000cb70b703b1f1de34da9b484571ae89269c0e5e9ac21de2e135413ff14dc2740398ddf32b69409343d97ecd032b752d1b81d4159d2173a083b742eed4e29a9e5019306af738e1ccacd4269d8cb840355cd7803c54216a18626061d766c08070c5538a943061d7cbab16c094208c0200002204214341081a07e0d0348281a0040012ae68611a89bdcc30a0aed29090d0d)) <<< 16000) + 0x6c2063678a0828f6f444041bc1063fb058024d1b3fdc6002032890d224e204601001e050418082080410202080010000ed907f01dd2df41f553d2b9e037cce2a7019ba78102f81eecdcae997093518e0673e954303d887fd7c6af608f2356febe2975558d8c01f8df13789d4a8e400000000000000000021d6c4303bb605dd506acba2470dd945e02a685ca443f95d269800000000000000000851d5c832d1b5e1db3b05f6b1a32a748cdc4c3244a95b4084000000000000000000000000000000000000000000000002f29c20411c00804bbe24a8c1e8a24fc1de17270c9503d02ff6e4478a6e2404a2a9f883efa03ca54f8932721f7d0f76d9f02993bc5b9f1070beac318eb6a3a56da050f20d76fddc844c3a3b3e47cbe9200a7edc4819805ed99b0bd335fcb9f58c5867941c3b1eca32e70e917ea395526dba215717e92e3cc78c9a28dd03775c2b7c0f766e574cb849a8c70339f4aa181ec43febe357b04791ab7f5f14baaac6c600fc6f89bc4ea547200000000000000000010eb62181ddb02eea83565d12386eca2f015342e5221fcae934c00000000000000000428eae41968daf0ed9d82fb58d1953a466e26192254ada04200000000000000000000000000000000000000000000000179081cf1430cf00c02027595a3302103b56e03973d29091bda23ad83c9710b5debf4bce7ab5d665dc25d65a38a4a0ae3a53acf126ad689880e51a78b88ef5c26a827fe29b84e80731bbe656d2812687b2fd9a0656ea5a3703a82b3a42e741076e85dda9c5353ca03260d5ee71c39959a82d4b19708276c9e3d1e2e05a1710c51746ba82a80000614b5f824042100800006b907e090004651b18cfce93ba50c5af74f37343f9b9ec7a941955e9227470013f95ed820125d8c5150403542942884e104201007d0903e00800062883d8a81e8540f21a0780d03b8481d81600276c41d45400509a41d0d60e6630722d83894e8a1d4fa34dd4606535bc75c185042114d2d9e2105bd396116186021eec12ff006804aefb23a320800019bfa8fc000085a9b3c00004d3f40fd2003b4101400c3449365b74451835cc95ebee342030d80a4d38030d5cee322c01d50c169a2000016e340e003d08eb490330a120062699fe8dd79d5323367c6c4b698e01312c9844872ace15b4a0a2815752a050b105f0824498208f18b31638482010621f0e0a00039387002a40094041344199f60eca46800f87ffe2c80629bd8d4411a7642f70920d6134520e1800024d0d3698008c020000278646805e8d37248b0342c69a050e05cd3df3871f93b3bfa424102bcf0cec442459f323ac08004fcb537c9c108c0200002da62600a257fa92460269cad7230d5c6f3b7191042bb9e0a3a009be0ee7a4040012c02551300118040178040ba02000166302430ee25e78e96c00d3145f44ae6a0e00ff64a503000a2d1f292840e804014804000210669c8c706745499a23415ecac0a28134fd90484881d8ea067c8a20c8c1013f220952fa8fa9326101124b897880000cdfe6000800c2e1f0c672900260144d10526735b891a07a273ddcb2020a010d91047a65d1bc64835209e9c426000099324b26002300800009e192004d4fefbe898014a2dd1a50e038bb5e2a38f06420c1789040961bf204884430ad697a080027e5a9be4e0848010000174313002e6ead4c91808897c67061a06686a401104038a408110048a34a08b01000215db9de6002400802f008174040002d8605807be0b6278e0193ef498a2c2944e8f458000024e7b24810440100520100007990007622001dba41c0140de020010923040056771946023548a6a104820144052903820dd65dc0e083090a658f430001d885f5c28015115412e893881200401b8140da0206c010358081a8040003c041a4960d0430671d8330cc13c07682ce5dcc4c84ce83a644df9376091b418cd86ba71b5646696b20000000000000000000000000000000000000000000000000000069a942cff304ab014b5dbda5872f0b5e5d4187c7ea005e9d3e073800000000000000000000000000000000000000000000000000019c8e1cb1c61850c40ce00c0140b8a0080362e8cf2d84226e85e8485b09345fc121c741d701eed3bd872652520000000000000000000000000000000000000000000000000000006b13853051c310238030024010050c080080362601ee39d1b28a0112a880838f7b4d51dc8a181e622161241002dc681c4425dbfe834888202e601514007a12005382118042f81eecdcae997093518e0673e954303d1d5c832d1b5e1db3b05f6b1a32a748cdc4c3244a95b4084000000000000000000000000000000000000000000000002f12482260e3943241221160020180401006800145989801f1b41bc61abedb9b6b122818bab173441017f5239e8028f80bb654100041174584c004601006501032008000598e888aa993c78740526384802aa5606201161eb4292040e0040148040001b44001ab08004859c2c1c7c67e1416453ec443800f4544a4603c78d8660803b33f3f5494207c02003e0201e0102880818c0400029e4188660c22b0601182f86e8529320ba09582e066175d3c794c206da93ea33a101a2c348800000000000000000000000000000000000000000000000000648923f63f7a626192979780891c0f7005180560e2ffd832ea92000000000000000000000000000000000000000000000000001908618b10204b008005002015042e400200d898030858c0b644c1450082f79d16090038fff95409a65de19618015d3d1ca9f8)) <<< 16000) + 0x05061ca27e55fb26022129f63a12e335408820ceb8eb8f490c000e8d4a5100017a1203821b02824580fd98f281c7e1871b1c05060b0870eb92082efbe186a2122305655b2c0000896c2c08004cefc2049c108c0200002da62500490fbcc30db340d93e1a103c90f2928820cd34593a00a6579bfca7020249e8d3d800880100bc0205d010000af981289bd758388eb6cf4a48351ca30430009e98a01008eed8dc92840e0040148040002064170360b61305a05c75720cb46d7876cec17dac68ca9d2337130c912a56d021000000000000000000000000000000000000000000000000bc291a596410906804704901e84802b820b803646803c7773e208e78274fd4906998cd5358e0801212fd598100f9018a548100b05ef1c08004fcb537c9c108c0200002da78f5186fa2312081e29126f2211a94751e72c102320a8aa10002ffc68625002300802c8081600400026a415c260ac0b99c04dbee72f30c00cdfe606124e924251241310e77908560984075726e0f3c100f8c9db402093a88ecba8900164045838002dc6c00b40212806249b7ed76708094101019b20d964c4376967c05e9308050a46fdb13c1010075c427cd0401119569a50412aedc725c6820007cadb26ee322010a80800003b24154174481752ec8e1338042a45c6cc300337f981892757c0b1789310dab301fd930814ca2ce9c1049e0bd5df8900164045838005b8d80238082400850f020308830493db33b88c941c095e6d552820093694994c43a04b653a9840b9a7be74104e39cbbcc040013f2d4df0a0208c02000033c4000e0cf1f6e20440648507e43cded208a85fc12644231b072cfc2000e023aa809420880200a8120530500009a10008c8302432823778e286eb663914593092ca43820045253070012e2a4020128a0f8040148140002304003cb4800af09c295677f688e004862c8c0c040ec2af88801145b3b520048304001001f0900f0281440400023641401400360a413c4409c2204d0d00150d104c1502580800fdb082504801ca508249481204408e1a0460902282801f67082214fd8b7ed58b68163c0d28bb248c716649a2fb07861175205021190c20a10208a00600402280a0571f835df89d5acb74727562f251dd43e666dfb9d0781529033c218dec9ef0e47be065b9114ef464199b6c80f02d58187652a5f118402bc95a9c90e56d25e172000f65e2f007021449621800009480880214404296bf2901242ae0ea04092ca3aa44105a3ba37422c0b46e15ec0406bb21cd54003d66fa174004e2842010c3624667490a10b0d9bba8309459b8ea2104a91e29f80c163e1331d4d0169c38216200dfabedf4000aaf15a4d0501042010e3c007178e058a53c70b768a2a1a1ab754182fa36a84c0209dc0a738820004b3942193021100438ea50bd926162945389fda28b5a105c940c081cc2c896182f3d329ef90002e8f8b382802593b5ad938211004000059080015a990c1513cd40020d69a28eba24004cae9daa84618460100000b42086220005402084220411100037510402581f92c0f89607a4b8080e16ad1b2801dcc755d82801275836400024dd40cf20000484046010a0c2984ace830603088f37142387f9e35180538ea3bc0700060b643a000163d244e4026142100840400401186e450e508a0070d8b3d1c01c35ce99023101e00800005310000e3301801004000011103c0d000144903b1101d0880e444070020003e4206e3a0360900064c90354501a2080ccf406472031310181680bc4405c1a02d090160280ac0400207a401557617308fb4b3bae3d77f7e8ed591c2c7547c6c1b2f7cb398bc0000000000000000010c461030c60450450040020114102359d34d27970faf393724db49c8714e86f605b240f275409347e01ee34d884869b5ea4b857389f1fef19bdf737ec3fec322ea40a0800000000088bfef505e85e2ef5e4cebd973c300f82e7c759f23f6caaafb800000000000000000000000000000000000000000000000006222062030c22401c0180042ba492770c4980d6203481f45e7108764a66a6182f7b7082f9ae9fc56f722b26ac3fef2f7c68e3d3f43fcdae2a4b1617cd3ecbfe8f94f59a13380dd16126d8d3dd502c32307bd818137c6a092407b171409970c201fd058630e0813da796ec6040798889740a328c1280400004888150ec0a4760503b0271dd1000de1c7042c50b1c5c5e0142d9de9c0304500023a6b7ec080001ece1209400940216401dab075a1441ee99b9b204123d78f4488c0800871c889404fe241cc6120000b71b035800900100002806c50c526c78e942d8b4192ee4804019d6ace8280011d35bf608000de1c7044a004a010b200ed583ad0a20f6a5a5c642093fa28225ca027fb94575c900005b8d81aa0048008000110200048240982604a130240981184c088076286b8b10324a16c1815d778404018e03c58140008e9adfb02000675ab3a250025008590076ac1d685107b52d2e321047150157825013fdca2bae480002dc6c0d5002400400008810210581002c07c1603c0bb20001ece12051000afe75542c50b0541d08142da0143d744500023a6b7ec01288128042c803b560eb42883da969719082479c39acf2809fee515d72400016e360600a88120020000460800128901d0500028b101c0900d8480680400154c40644403012001123202e7a0163900a9a8050c40264a012210088e80406401e2a00e11006868030240160a00a010048080054fc80404801c04019f064018c400a6200411001888008440020a000010073919)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 43 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case0" = "QuadHeightCover12Case0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 43 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case0 private def zz2360:"s0938"="s0938":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l5 l51 l54 l55 l56 l57 l58 l59 l6 l60 l61 l62 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x5b90174e4, -0x547044420, -0x7eb3d824a,0x3cbb0e6c], ![-0x547044420, -0x103ecdeef4,0x1a517e41e,0x5ea4f2490], ![-0x7eb3d824a,0x1a517e41e, -0x2256e81a2b,0x549e0b026], ![0x3cbb0e6c,0x5ea4f2490,0x549e0b026, -0x2a4393d10]] noncomputable def hinges:Hinges:=[(-0x2387916,l6),(0x10179ca8,l5),(-0x7c240992,l4),(-0x92dafd0,l9),(-0x174095cd6,l8),(0x7592ae97,l11),(0x401ba984,l10),(0x93341d44e,l14),(-0xd9583f1c6,l13),(-0x1b3034372,l17),(0x39b084952,l16),(0x8267e5d68,l15),(0x2054f19b2,l21),(0xd9583f1c6,l20),(-0x1814cf86,l23),(-0x152da0f2c,l22),(-0x2a4393d10,l27),(-0x2054f19b2,l28),(0x2a4393d10,l29),(-0x93341d44e,l25),(-0x39cc07c,l31),(0x249f6ffd8,l30),(0x2a4393d10,l33),(-0x401ba984,l38),(-0x2a4393d10,l35),(0x174095cd6,l36),(0x2a4393d10,l37),(0x7c240992,l34),(-0x249f6ffd8,l43),(0x152da0f2c,l42),(-0x8267e5d68,l41),(0xabc94a14,l46),(-0xd2a3abd1,l45),(0x2a4393d10,l51),(-0x7592ae97,l55),(-0x10179ca8,l54),(0x39cc07c,l57),(-0x39b084952,l56),(-0x601de063,l59),(0xd2a3abd1,l58),(0x92dafd0,l61),(0x2387916,l60),(0x1814cf86,l63),(0x1b3034372,l62),(0x601de063,l65),(-0xabc94a14,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(0x93341d44e,l14),(-0x93341d44e,l25),(-0xd9583f1c6,l13),(0xd9583f1c6,l20),(-0x2a4393d10,l27),(0x2a4393d10,l29),(0x2a4393d10,l33),(-0x2a4393d10,l35),(0x2a4393d10,l37),(0x2a4393d10,l51),(0x2054f19b2,l21),(-0x2054f19b2,l28),(0x249f6ffd8,l30),(-0x249f6ffd8,l43),(0x8267e5d68,l15),(-0x8267e5d68,l41),(0x39b084952,l16),(-0x39b084952,l56),(-0x1b3034372,l17),(0x1b3034372,l62),(-0x174095cd6,l8),(0x174095cd6,l36),(-0x152da0f2c,l22),(0x152da0f2c,l42),(0x7592ae97,l11),(-0x7592ae97,l55),(0xabc94a14,l46),(-0xabc94a14,l64),(-0x601de063,l59),(0x601de063,l65),(-0xd2a3abd1,l45),(0xd2a3abd1,l58),(0x401ba984,l10),(-0x401ba984,l38),(-0x1814cf86,l23),(0x1814cf86,l63),(-0x7c240992,l4),(0x7c240992,l34),(-0x92dafd0,l9),(0x92dafd0,l61),(0x10179ca8,l5),(-0x10179ca8,l54),(-0x39cc07c,l31),(0x39cc07c,l57),(-0x2387916,l6),(0x2387916,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x291081b18060000000006870330040041861082055e80280000000016140cc01000000322e160720040000cc210440964010000000058906068008000001512060250020000036110480f20060000000048340530080000000088700a601000000000121c0cc0100000000221c04980400000000000703200400000009c3802660180000220e84c0ed0030000000210e0099806000000480c801330100000000943401660180000000120e01cc0200000000001c029004000000000011032004000000000aa01440180000000002b0188020000000000540290040000000000a40620080000000001481c40100000000017c02c8030000000002e00590060000000005d013200c0000000001680e401000000000004c0c80100000003a0c81e98060001e45108c064401000000000d0481c601000000001b05024c020000d22082603120080000000068240630080000000ac3a01460180000000e84802cc03000000002e1e031804000000005c3805300800000000b8680c601000000f21100124c050000ba1882401920080000005d04803130100002e8660900648020000001643100c8c040000001b848014980800000000005c052008000007a0840052602800000e210800a4c050000001c04400c98080000000038280730080000000005c01240180000000001201480200000000012004900600000000017013200c00000000000a064008000000000a0c0cc010000000230b80998060000000001500b200c0000000000481640100000000028004c804,0x600790060000000000d01f200c224984963012c680304433032c20188d0060000000002e80590060000000000b40b2008000000000be026401800000000005c0c8010000000017000990080000000000a4072008000015008600526028000002942600a4c040000055c230024980a0000000a81300b300c0000159086005260280000000290b01cc020000000003280510060000000000cc0620080000000001900a401000000000031018802c2459510481669200f818b0e20301cd2401c0000000001a81240100000000003102c8020000005a86c01498080000000006f00b200c000000000d80164018000000001b404c80300000000006a0390041224d24c18096340182419a198100c4680300000000004201480200000000001081900200000000010409200b8d9a60112079e2803f09344020c09dc50070000000000960310040000000001240620080000000000520640084c93893460258d00609867066840311a00c0000000000e40920080000000168780e60100000000003103880200000004c1100d980600000009a24033300c0000000000901a40100000002788806cc030384286204042ba00c0030841862022a4014000310861900f4802000000000002c0c8010000000001780990060000000000540b2008000000002c00264020000000000b402c80300000000002c0390040000000000140620080000000001100a40101821030c20245d006000000308a6054980800000620a301b2301400000ca14604e460280000000001901c802,0x160e051804000005a02300273014000000aa0b012e60200000017413005cc04000002cc130023980a00000005c0b00f300c000000be0a00ce6020000001501900dcc040000002d83201b98080000000520c037300c0000000b41c02e60180000164088019cc050000002d82401b98080000000580a01f300c0000000000c81a40100000000000903880200000000001a071004000000410d40c630100000000000480c4010000001cc6101acc0400000000221a05180400000a44419034400c1010c18a10122e80300000000250503cc02000000408e6054980800000820e301b23014000010a1c604e460280000000002101c802000000002a220518040000000000580d200800000001b8b01c60100000000003503880200000000522a07980400000000a4380530081010c18a1010ae80300000000001d02480200000000003c02900400000000000f0320040000000048300c60100000000002601480200000522505819a00607045344040a574018005406108206ac802800a50c410809ad0050014418c2180cb200a0000000034240a30080e10a18810122e8030000002a8330058c0400000000521e0398040000000ae1b00b300c0000000150780c601000002a018c0098c0500000000001e03100400000a4420a036400c0000000168701260100000000170a034c020000004a240a06a0040000000048140d300800908c1044055e802800000001605034c020018c204308149200a0030c4106201b2401400618850ca04e4802800000010864058c03,0x498c204498080000000000940720080e308086081b48803000004a0d84c0d100300010c20862036200800010c310840964010000001104828148010000002109050250020000046190880f20060000000007830330040003a06c0c80ac80200000000001d02c80200000000321e04980400000000003c0920080000000c438022601800000001a0e014c0200000000321c029804000000581040133010000000ba1b013660200000001688402cc0300000002f11009980600000000584407300800000bb0c8019660280000000000240c8010000b62683203ca008002b44d03201c94014005a08d05201d280280000000016240cc010000002a86803598080000000054480b300800000be0c400d66028000016618801acc050000002c06401d9808000000520d809b30100000000a84801660180000000d844090c03000000001e120518040000000000c01d200c0000000001207a40180000000e8240f4c030000000350600e98060000000000b00d200c007786a0640596802800f80ca0a405ad0050000000000120390040000000662500a300c00000000d8980c601000000001b12014c02000000003622031804000004c86400493014000000d220806460200000000001b0148020000000001b00490060038c3d05201c740140003e07a1480ee8020000440941d03210040000001283a0621808000130250740c84010000220520c819080200000011c3400a4c04000000013058121806000004d0620029301400000910c40052602800000120320064c04,0x36c420065980a0002443d09c04440100004a87a1380888020000671541902e50040018a2a8190164a00a003405282901694014000000000d16066008000001944401acc0400000000322c059804000006f082006b301400000d310400d66028000001a04200ecc040000003108c04d98080000000642c00b300c000000f6098028602000000001d07038c0200000003f05806180600000007a0b00a300c0000000ec16018601800000001e05014c020000003883201a180800000075064034301000000000000606400800000001d07018c0200000003d048051806000000007c1406300800000000e8280c6010000001c83103e0c040000001884a0631808000000720c4078301000000000110e0660080000421086c0d10030482386202042b200c00000000841c053008009090b102026480280000000001d0348020000000000420490040000000074140d30080071063084045480280000000000340c8010000e41984403d200800000043054049301000000000b0281c601000000000016014802000000002e0c069804000158330440c4401000000000110a06600800000002d06024c020000003a0c607d18080000000723202d300c000000e43481f4602000000000019018802000000003614071804000000946c3805400800000000b8500a60100000021170a01500200000002609806180600000000004c0920080000000982203860180000000002d024802000000005a2e0718040000000000b80520080000001047405a6018000002047702bcc04,0x40239a0b00558200d01472209802130401c00001011c20498602800000018824050c0300000000001a069004000000610d009a301000000000c8701c6010000034210c02c0c050000000066120518040000124240e02f400c009084207604dc80283832810cb014a50060000092230f012200600000000003c05200800808ab07003e08028000002045b03e0c040000000391881a180600000007a31034300c0000248f03a056801800002ca20c0ab8c050000000591101f980600000b088902ae3014000001223581f060200000000032140cc010000086190b01220060000000c22a03f300c1630e08c081b4880300000036190702900200000000000c8190020000000058440e30080000000000a81c401000000014884088c03000000002a0c07180400000e45409022400c00000000882814601000000001106018c02050c30228206d2200c00018c5110409640100000000118301a60100000002a064028c0300000000000a81900200000000a83406300800000000150e0660080000000000d0188020000000002b809900600000003c5870340040003d0a81880a48020000a415839015900400000000003e0490040000000000a40b20080000000054002640200000000015402c8030000000000540390040000006413007b301000000008c3204860180000000130d028c0200012e2283604ca008004944503602494014009808505602528028000001a051004cc040000003688c04d980800000006a2900b300c0000000dc54026601800000001a1501cc02,0x84110481b20060002f03c0840784010000000e87830168010000b40d02101e1004000000422c1a0320040050490866019840140000000000580c401000001c23040930c05000000003a0a051804000288710640444010000510e60f810880200000390d8480d100300000000008207100400000000641c0e30080000000000980a401000000000e0a014c020000074290d01520060000000e83101a300c00000001d0c81c601000000003919034c02000000000032071004000000006c180e3008000000c609012460200000000260902cc02002824842300cc200a09148141780624401800000000a8701c601000000001505028c02000000002a0e0518040002c48305c0c740100000000000881c401000000003d1d024c020000007a523a07a0040078494093009940141e196088580a5280300000030c810224c04000000589060639808000000d324408930100000001844203c601800000000d06034c020000a22084c066200800000b83e0a02e400c0000170701a056801800000000d06038c020000000411181198060000000000380d2008000888a81c00c68020000941d81a03dd0040000000391881b1806000000000018052008000410c60c804880200000003b84404cc030000000740880998060000000ea12023300c00000001c84816601000000000905024c0200000072120a04a0040000000000240920080000000001d00a40100000000000740c80100000000000e0310040001c4440640aa40100e088703380f2880300000391102c0d1003,0x20a3a8190164a00a00440728290169401400000000111e066008000002146401acc0400000000423c059804000008f0c2006b3014000011318400d66028000002206200ecc04000000410cc04d9808000000841b007b30100000001087801660182411c30c1021590060020418c210115200a000004c021016630140000098042044c6028000000130240b8c030000002982a02498080000000460a023300c000000980880ac60200000001302404cc03000000003a1e029804003045084601984014000000064220686018000580c42500910040000058190a80a20060000040861024c30140000130641e06880180000000001502480200000002a1081d1806000000004c180e3008000000000188124010000001511050350020000a422828059200800000b0420a03a400c000260620b818880200000260c82c0d10030000000002418198020000000460a035300c0000000188f80e6010000002c823029cc04000000489060341808000000d129409b301000808e108c033080281c518505e018910060000000291081a180600000a4421c034400c000488c60b818e802000001822840930c05001422103180cc200a00000004211034300c00000001a8a81260100000035211503d002000000002a1e0298040b0c70422c052940180000012231818e602000d81421fc0641005001b02843780c8200a09185044040da440180000000150681c60100000000c8440c8c030000000000520490040000064220c032400c0000015068301c801000000008824088c03,0x6e44029804000000f3244089301000001412420498602800007c298a80690030000007c562c072004000000f4ac580d40080000000158b01c6010000003d2a160250020000004189003d180800001e8a62a02a400c00003c94c54052801800007c298a80a90030000000000220490040000008111809a3010000001f148a80a80100000001f2a2c0d001000000000545819802000000003c180d300800000000b8301c601018311c05a02739006000000039188131806000220720a4055401010d8e185200a1480300000000003502c802000000001b000990080000000006d00b200c0000000001b00e4010000003b46200d4c04000000708d20329808000000e81880353010000001d63200ca6020000000398c8074c03000000748cc022980800038c6c0d40d54010000001c833012a6020000000388d00d4c03000000760c601298080000000ee33015300c0000001c86602a60180000000013407c803000000000072059004000000003a00132010000000000ea01640180000000003a01c802000000029108131806000004886d00ca301400000930c20314602800000013070074c030000024c3580c5180a000000470cc06a301000000950d20214602800000120320254c04000000248620651808000000490d802530100000009a1b8094602000000012064054c030000000001e80f9006000000881c401330100000011a3301366020000000228e402cc030000000471d0099806000000008874073008000011b18801966028000871d41902e5004,0x210c8111806000184430cc09a4010000000620b8190602000004c1c8a80a900300000000004e04900400035036064055401000d186c064028a802800000da1440328c05000001842980c5180a0000000381601d300c000006b0a603146028000000cc2701a8c04000001a42a8085180a002a83185b034a40140000006414012a6020000000c4290328c040000001b0520129808000000370b404a30100000000642802a601800000000b07024c020000000841c805180600000001087406300800000000211e0660080000000001d0188020000000004380990060001d4560500d6401000000000e8301c60100000000004102c8020000000021000990080000000008500b200c0000000002100e40103422c30cd019d1006000000004e1e051804000000e8982406400800000001d1380a60100000044cb10224c04002c25048181eaa00a00000000641806300800000001483814601000000001107024c020001461083201a20080000000144380e30080000000298701c60100000000005103880200000000003e029004000001032840893010181941070805188030000000249040d0c03000000510c603c98080040c4103500c8401400000000f0c81c60100000000001d03880200000000002a06900400000007231022300c000000000f1a06600800000001d19028c0200000000944a0718040000000000940e20080000000002481240100000000004a0148020000000000128190020d0cb083340674401800000001b87814601000000362209019002,0x384540136980a0001c8530f40cd401000708a80f404da802800e51421b408b50050000000042120518040000000084140a3008005286206004d0802800000184240268c0400000000321407180400000000541806300800000000f0d80c601000000001d1a018c02000000003a3605180400000007e37026300c00001b8581405c80180000340b0340ad0030000e43584c02b20080000000064180e30080000000f06801660180000001e8d4058c03000000003a3203980400510818e301d2401400000e110e02ee6028000001c45103a8c040038c50447803a200a00000000006805200818114188680ce88030000000188a40d0c03002424046181eaa00a00000000841c0a300800000000683812601000000001206014c020000005244120720040000007108c08630100000000a44206460180000000130a038c020000002184404918080000000084780e30080000000000481a4010000000208e4088c0300000721a0901520060000000084740a300814710083600ce6803000000003e0902cc02058648411a033a200c00000000b4340a3008000000016878146010000039188700d100390838504101299a00e0000000044180e30080000000c44206860180000000000d0248020000003086c04d1808000000d4483406400818194106680ce8803001231c23040f5500500000000742a0718040000124520902a400c000000012828146010000049148340a90030000e22a02a07320080000000000140e20080000000001081c4010000631103401e9004,0x28c488104180a000000000485033004000000a62481106020000001681300f8c040000dc2d02601f2008000000531240443010000198500e81988020000000941d0318c040000721703a066200800000002a0e00c300c0000000050280c601000000009830030c0300000000140e0318040000000220a00c300c000000520b804c60200000000f0240b8c030000000110600e180600000002609016300c000000520c002c60200000000b034038c0300000001305007180600000005219034300c0000000138301a6010000000111a140d00100011430848029200800000000008c09200800000000171206600800000000006c0c8010000000006c2819802000016c4216024400c000001423581f0602000001c629008c8c0500000000005a03100400000128942c0a40080000000128681460100000002c9440d0c030000000592a81a18060000150621502b400c0000308ac3c04880182c22430cd019d100600000404218058980a00000000dc240a30080000288481c05e801801410840ec09b9005001c22a01980d6a00a0000062881022d3014000000c421819a6020000018222009b4c050000004a440e052004000298640680f7401000708aa0ae04108028000002445b03e0c0400246388318109200a0000000000280520081218e1050805188030000014a18809a0c050000002886403c1808000000003424093008005186609005508028000002046103a8c04a26405061805d9a00e00000000a4440a300800000e5142045a6028000001c8530334c04,0x4a8a803598080000009215809b301000000000e8681460100000030c710224c040000004108605d18080000008410407a30100000390cc260688018000025820404ccc050000ae1983202c200800016c330740d840100000000019120660080000000001101880200000026120a072004000000410c40ea3010000001c8f8d00a801000000001909028c020018c204230099a00a00000001041809300800000000130a066008000002907303e8c040000000511d0169806000000a21e40fa301000000000f8501c601000000001b16014c020000006a362c02a00400000003211014300c00000000d8301a60100006610c11031100400000000523607180400000005c1b00c300c0000000000b812401000000017064070c030001022684803a20080002144d09007440100000010a248068602000000002113018c02000000045108051806000000008c440630080000000108880c601000e51940c80b25005001e03141480b4a00a0000007515006b301000000000e8d016601000001fc28801acc05000003cc510035980a0000007814803b3010000000e42b01366020000001d05c01ecc0400000000420e04980400000000001c09200800000010418022601800000002206014c0200000000420c0298040000000001903d200c0000000003803a401800000012870074c0300000003d0c81e980600000a108103513014140901860810ac8030000000088240d0c0300000000221604980400000000002c0920080000000088581a601000000015894090c03,0x342c03980400000000034009200c0000000e8160386018000000208e40d8c030000000411c812180600000818e702183014000001023a811060200000000001d01c802000000188420751808000000b46c5c0e400800000e20c206a260280000001516240d001000000522c2404a00400000002209014300c0000250943e0368018000530881201a50040000002c86c0159808002e020821006940140002f8420880728020000560841100e500400000000120a0798040000000028180f300800000000d0280a601000000001906014c020000000003418198020000000064180930080000000dc1802660180000001883004cc0300000034024009980800000006a0a00b300c00000000d0300e6010000000001301e08040000000002e01c10080000002805c0383010000000b00980f06020000000001101608040000000002a00c100800000000842c053008000010c1020266602800000000222c0cc01002222cc4181e9a00a00000910810351301400000000e8380a601000002842840d44c050502406202042b200c004046184102cb401400000e20ce05d460280008118c2102ed0040000000230e8121806000004187102083014000000861c811060200000010c390110c0400014c1283a0662008005482282d018c4014000000f03080266020000001f456026cc0400000003d18805980600000007e32013300c00000000f0c80e601000001f6290032cc050000004e8ac04d98080000000980900a300c0000001281201860180000002502c070c03,0x3c0a0698040000000000e4072008000388c21c80b480200007318c3c02a90040000ee3386607d2008000000e47c580f400800001c8841406c801800082184310221004040c30e18e0418200c0040862865021040140000000c43202c601800cc1420a40899005039c2861060610200c0001c85108408840100e50a48448184080301c214508501081006000000002a120518040000071081035130140000000009e02640180000000002502c8020000000013000990080000000004d00b200c0000000001300e40100000000391503cc02000000005e2c0718040000000000b40e200800000001c8900a601000000024904090c030000048c83810c180a00000091214088301000000000e888146010000001444103a8c0400000404728088180a0000000064340a30081030c786881840803000002042840d44c05000000000620429008000000611440ea301000000008432068601800000010864050c0300000000240a071804000005306f0230301400000094108066602000000000098024803000164298860642008000288430cc0c440100000000c44806e60180000001a89805cc0300000348410033980a0000006b10803730100000000d04403e6018000860941d0331004002241141680c6200a000058030c004b301800000000d0a80a6010000016a18c00acc05000002fc330025980a0000005a0cc01b30100000000d05e0266018000001603900ecc04000002cc348035980a00000006829013300c000000c42c00266020000000190b402cc03,0x75013200c0000000002481640100000000003e01480200000000000f8190020000000000f4092008000000000228124010000e12c83102650040038258830812da00a0000000006700b200c000000000c801640180000000019404c803000000000062039004071461424804204018000398c613011080201d719708603081006038630613c0210200c0002907518c0c840100000001e4320666018001013c8c1026500400402788c0812da00a00000000f4380930080000000001e816401000000351205035002000003041181a9180a0000000d82201b300c0000001b44806660180000003788806cc03], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0xb2d09c9bfe88149032968080237615bec40099c2af344009070800207b4133be059e702cf2c17c589b0f6a1e3984319d0826a5ff851200254a358805060700107aa0b820c1c4306b903c010204790c34479d2cf04422a6abd9d48043d21b6e7870408a3f8588400093f4c100270c230081e404cf1c1744825d063432490e583c8c0208dea550420988773eabb11210095e69cb26103f2f44480411b2a642d810004e4bc1ac0a0308c0212485970f5baa4880a993eb430c00b71b00441105a162af5310ac7eded102085e9b32ca540002dc6c0098003d7c60408000f2ec39b0190c230040000e71e7d2a8626a31c0f1dac1fd4afd5b381e14922084c44844c24410413c008032080200dc30044aa201841196b4120234c448a2829562a081e5d873612043e6efa28c882000f423440410c67b0126aa0002255100130019fefb34069042500c0000ee9243091ec828000cd880036d1820105c923b861bdd831f4b22124d4775bf402029beb56a803223a3c268a042b2c8fed840008bb4b0a9c008c020790033c701c5122057d462a41c7f219aa51ced446018069035a948349dddb79afa44306b09ca72f9442849d57a9dc42c2084072089e5380000863cede00400258addd6003e89042c0284511c8702d6c596016e3600871e2053d483a4198aa452b04423dab7f93e784005b8d398b081e5d873624080df0e32a500002dc6c0064108c01000039440010249ec068f5c247ac0a0005f82001d4678e45f4c3f788080f847c73e708398f2c08068872ec79db61021cb2153a80833ab61d378800740ab014448001dd515943000dd8f059aa281a480900300003c2446017e18d2cb1f2212f7d28496015aa65204040a077024810380103d501f9fd60d2de81e700057bea228b95b83ebd200b2aef9b3878263ae6d4b980000a0cca408003d87a03ce00440103d4019e980e084471bc87bc9913000f60753c3e48c018fc7090f51866f9c2247cfc221194208e8662d008842ce15b1fe6800010c79dbc00400258addd6001f42010b40b1041e2a0f5152207800e4e10fc4cd000487a8aa99600332e39c8a2800243d4730c36cf8c553fc4c4072ab73f1a8082d8a21e0211098ac665dc21e904270140000f910004022000b5449900701040c59befa67384796052e5943830f20e4d8c4a0e0c214f1c58a763c7053320051f1624003df0457c9328c0007275c6cd38200054949d05b554014edfa569c8258c8142e03800011b13d2191e88a8f404479e1a00095920036484094467841b0510d9e086cf0027c400776a18738103cc8ac625021c56b95dc107e4dd4cb710009c2de6ae1c000a27972820001edb8) <<< 16000) + 0x00912710230081df02cf3806490033cd019e600cf2c0679403f3c0be0427c3ce000a6e440914001e45a31458605d2760c00011c99f2494208802079203820eb0696f4103c0015efa88c361383372644132aef9b3880231d736a5cd0000283329020007b0f4079c008c020790033c701c518bbc0e16491a002d1693471f53e262522411cdb2acef4421f202831e70000050e0341000924e7c9138211804249443e8bfd2208e43c71eb0986a347d226120c3f6f80589e0002154b1704000490bb0f300118042494bd7bdcc630a240241481b678a438393b99beca8a280d53c5191b1220c95e3db288082372aa5a2c65a4100690dc5a680c0000bd8af300080058bda34bf06372005805000022220006f2400140480035898101c54b8914589ea1c214005f1f45923081d0081e480e087145b924881e00ddbccd0c364aa36e108829d7d4c65a009f04643dc68000b2d82182000a8398b5380110040f200678e038a3504ec10f124680197d09f038f3541d3f9f2411ff386b30e884582c135a51c00001688a5c0800565fbbda94704260145140000000048a29c3c04141440003d09002280007a11a248a0395700aca0e0f2ec39b111c599105c08e3c86068aa0482310d8c79064108c0100003944000da880028990005e426b80335b019b000cd7c07e386b0e92d8678ae42c53e2ea22080ec5a21c4088c7ad40790826fc51af860786144b50d48220959a658b20482001e84688001e847a2120188182601406982fc73318a5abc49e2840f5b3439d1107478ea21044080de5101da61048e015352102200cc76e30660a00002254f5900055d4805890502990733ec521c70a40700003f243a0540008487c90019bfcc003090019bfb82c3453b375c14383c22255f81f5e18201adea7de20829dcf2c04e31004fad257186017fc76c94e063105faf48918a0a00600003d240052088149880a0b404e5202625012828005c2cf10997cc0446904b7089fa40ad65c17084085f311632705d33e6c423804b4de6481304100040220260980b800008020f1806064033c501c8cf5b26f9430e6062736101121585663c099044c50850307c0100001a440005389e20ac218567861b3c20982884cf04267800b3bf0179761cd85179b956f5a7e4dd62db8aa73ce8251800f4870d94498e7770c4bb17c430507208894305c75b82cfb61004f6e78dad67eeafe53275bd81c475b80000000000000000042330c2052c228020018063724d382f2b97b1c31c2e6f40fb5c44b2bb56924acb30d074874c727aaa2a7d0eee7929c91321a5c80978a94e40c87ef302f1c52dc3d05cfb1df822c314dd1b05c1e16261158447d07a77c0b3bd0192400cef0067760308b019dd00fcbb0e6c28bcdcab7ad3f26eb16dc5539e7412b676e0b72b70162d0737a5dbdf8854041db924c17ca0e35d8cf22adef468a479b74000000000000000000239c99bdd84c088b9d8e6e89a52a8922c893c4fa41846154f0e739c0000000000000000008c399e6c070b5bdbfca020abb75a28c103c785ffb7908dc74a260000000000000000002229650820e180026dc8c7568d31da47a38541c195a90af259a979751c0b82fec8839719490dc8bdabb9efb590f9f55dfaa3c60fdfc33316025fa50cea3c78b316694c9166f6abaf8679d2530477b91e5d707d3e6eb5fe043f2558d5d8ddbc8a9f9333bd9f9f40ca16adb49671ee5f6611f34e98d88237cd250e8059ae00cd6c066c00335f01f9e4fb3fa94591214654dc28b74d801504090fbc811e882caf4f8c80801889ce8480093101000426b3e5418a2f372adea75f0f031a5e387a5604a079761cd8b9c6d73f6a9b5b5ec37e8d8d508120c007a43836512639ee3c041417af7fa42f04673e954313518e078ed60fea57ead9c0f1ca6f6a1723016a79e590208100a00f9c5f66b3df8c02f215414eb3ed10ecf29a1dc69dfcfa5994db83cb4e9956ae774d9ea4490f69a4c18aebe2899d471cf530f97508e932a0afe8db5cc3f3278dedbd5d08be10b481084a90da000a3a40019c4c8d45f056cc2cb80797653b52fc20e11238a7c2b0449a8bdde168550d6f880bec3d5167288693bc30da65d5985a0d9d62f040859d8bee22be6bc8b7b5639c54ee24a5447acf54a48f19645e693704080099653720097b0519bf95bd00237bc08bc6052db448a20bb7aa2aceef4081101b210361def01a5bba91ee308bb5a59dd52f35ef9b824baf22fdde508a51faa014ccdd3c5c30fcbbc0525be8ed6d473e23f31582081bd0816fed87430801c4532cb382eba95ab7c8b3c74ce7bae220555d7822a1a991374b42e7ffe674d1e60857cf251ccae044eb40be4a95afec47382d665e66f344525e8880007472002c8a4ee4140037bc4ee0e476e6a3b6311da968007ed499916e6b3e541879caed7bde0b49e837ada48780119359f2a0c79caed7be3e890df30043c4b204473e954313518e078ed60fea57ead9c0f19830c198088086080022074bd1a46b15bdf7e033b6d06d3c1b1f8f8a67106e7424887a56ad91ff86caf3413fad85b02f93dfe6268b18581294ed005a38b9989bdd19071082c9035591e68411f4300f41e14215da16732840811a5786162580106cda351db2fc60034d869d92731c00c92e00643722003a38be3fcbe4420c2a92fc65120d0605a0609acf95061e72bb5ef782d27a0deb6921e0046268e5083886842842042020828816717e57daa3719d9fc4b512c884de6beee9b04c2035060bc2150001d020008a04ecce47646a3b1311d8168ebc2475c0200086e23d29b3260d)) <<< 16000) + 0xd086d32e64ddaf9976451cde5f339e0388064eaa23ecb033d3047e08a2dff82022649639af0cbbf4f3492b7772d40200264b6d96664d0c2ba214ca6ea5e81010a061338ab3d4cf2181c9c9c7d90a028005e19c5b5990635d93c14ddc3dac285cf2ea535af6423494393c5a8bd4800241c3108dd6af074964a35eacdd076d942a15e2a5d4fd170aa8e027009b0104d0080011f48102aceb4e6758233ab099d502cea4070301cebdf7f46196912fa0b850a4ab6279861841c78d3f539a1195b4a6770c08375889cc84820d4cce9ce181b14be18b7000157e394dd1414010c9342501050a52673d43224544435aa0c9810db71f0190804238055ad0083e0655f3342003c3935f2c0207e0aa29db14140d9e49c69904bbafb034824e684a0280001df275033008159d284f05078628260e1c50650c959611455f3e6ce580381134de98c23301306ee4e3172c1005b8d39801002baa9d5858000e9fa03c060405100f8e8110625081070500380a20d1d3848e9814000492705c851b4734514025cc88e24421ebb48ac20919a8b2ee0413c0de9440800622f6baa140c7da1ee51010427282200800408ce942782ca5af0b54515766f7fec104a3a64f0714103824697020ab09b70ac4010fdf881e000a1628210040510682a0140002d84e90d47465a3a229052128e84440007224e80b741f4e8d9f7050c78cbd29e186aa97e5e61c2c5194c949002476bbe506009655d86c2000f86ee855010110273c210081cf908e786473a1a09a091ce00800078c9cca6ce60471752050268bec1e1a4a2c17d88f5c8a37c08eec40321852421021412c00c00405004514a8bee4b19cb4b82948fc1c2404000929ad95fda580dc58eaeb8ca2450001fd238673027098ab82ec9005a1f049a145b18b337c6d304e499f6a3ce20214c06e8cf33003e7a23537c10052a79ae9cc0000105f0e784b80ed06de7320651813cd280fd8e0a0061faf2c7ddd3610248649a35971f437b99be348c45d00d006a787a36e3533c3939afd715c3e16b255b958e3e0f68e629d6b720207408000be6bc162a208000710ff02c8b37221356a973d865376e734e6e7cee0fd513fa8023b70034a411e57043fa938c050a1b45d2c78bee252033edbe34b587c859750980be326e9ac41ff93c5bce60ba81076db92a5c76fa396efbdd403bdffeacb39817b6c0d1c36d9132bf2df4e4469f52a24dc50fe829a741c64ae915f5473330bbce422fc7d99d6378beca664534db6378e5cb53a8d86c5b16f21361f311cf209f2c64b3f9106f486e90b933f04cede6c2c833a1077120329c1b5c4cf841e2404a93aeaae30a3bea5e097d9dd26d7329db7371f771ea63c0d912326f0b3680d7124c5f940480e213e37c59030b69c3c84830bdd58a87e80d708fe7f71292edd7bb4c26728e42e70e4e092ec9434c929c3ac7db188a14058a780401a857304624f8d3a29c5f8a379ff51bf4190de708e9785af1b46e08273cce38000b8127345bb0fc7dd566bfcf1c96df6e596555126957abc4f3001d32d6af8a350f4d0a2cfb353a65ed0d8ae13445ad32c916f1944a382007ce1f5116af6f7372b67a3f33f3cbbd41c9b53f6392ca95b56f1139842b2b48750635ee9f7e57baf1b76f68e2f61400c21be13fba64c3b453127c0f61f5518a14dd1907f95ff2b88dfc34c12f2be42dc6dd6d2f2ed2117c1fc4a1dbf7cc220088060975641d8f20afca2d365ff3a032bcdd4c8db7cd8ac13674c791982954300ee125cb6d66b697d8f362534af5873a01374ce7f0ae2d7a630c19093d42841e0373db8c507dda79a8537259d132b31d56c849d670b57ca7ae20744bc5d947534a8bbb52459e3dcf182c445c7514a71aaae9e617bd890e6a82bbb536c6315f36e3f50b74b94a0a9d2a91a0baaa400023f89cd82f0a00202fa6370c314c7b482d3cd173a1fa80c8a1867d249ea6262c104f0dd5e830c001df6645244500a26330254a00201b6747fb1e002d7342901879202bc922b32aef8a0d3e8031ccb3b01566633c5ff97d1fa06383b9197a1f344e2de7300ef268ee2392f4e79d2df89a821871b1340f10ccbdf5d0d088e71ccd90e4d57cb6928225f35d447661aeca12c57c4a3b31a8acffe1f3a856c28ff193a0c8000100cbf35fc088cf2b67b92e5a845c832f418652956c5fec36a952371376987af367702f63e0865c0b520edfd1ab9a7c0000fa68f7378a3a7b483244652af3e47a4d595d26ece7dcfa07417f7210a280990203d893c719bd6daed16444c46a126bc0800284d3a7e5747896d97ef030b1763bbc953baa5b896abcb252ca53b7aacb2e48321ffb657ec07fb8254bfb2e2a2b484cf122f9c21d4b7d8278767eb1c3861c8d115487bb5753cf47fc1f4030e7f40a1f253e18043e4d4143d75531df9ea375509834d05a9e58d18bef8443cd570becacf6059a4dbca9c239debcb1e2ac87d43d20dae64757acf41ff74a3357c56c0005501d2800501b92503890c27bd5845ce1ae772b62ecc40500280de8000e14265d93a9db1040000536535060203805be676000158f9736e100015c2f446036000e10605403881407318a0de771a5000376e81d0870d1630ab1836f1c28465d4878d982080398febbd740c08391d73163b800040f9aac3d2700001ba6d97ef2c2009bfa42e56544d8e605c0500002343a2e28266361894d8988631a3bc79c258194630d0f80b3d972f603f542ba9879128f71ce949440a89be6322badea266445205cc1e3d78d13920d6c57e8695ed00023e7ff22f63621051c13396f4284e1f455e9210ec356c1e85)) <<< 16000) + 0xc7a8a0c9d5d3d2a5afea9dfce3688c0839741158710df8fcbcb6db7cad99367193847618a4000281800367b8da923185e7c226813cb1a900aeb788bbfb79e69fd7cf584a7112fe18196db7d75c0b9c93d6ed216c394b67ddf02b340ff99237b0fa13c0a41285cad5b75c1c192e15349e52dc50eb63b96cc42c180590a2eb8677438367da8a0c68900e028193ffce670592ca820c21b72a2277e328e389a58675f8019c40001689bf0f71f2b94e4a1869b1cfa994df88149d8c4ccd5f5937c1c9a7d27ea9d9bc48b513967cc7cf1f8c76fe04182267487292dd2f17be8e50539c3240a3c1cb436176c09ed855a0b248ae940494650c39c3a335d9b0c84710d538a9273d013fd934b119ae6f1e8bab66e6b8fcc5c6c981ca911525e8a6235ef7380005e5100104c27345bb0ea00567f8b62c07aae914fe02d108274224a346e6ea1d8c0079d75f2f645c23400e0000bda46be07d5db35455f6215a2004f1feb195e7e48c59782ad1705b6f084ba01400751850b6efa98594e9f6dd4b22facab0ee0efe8f511786ce71d45b1972d46f00880809b1c886e8e1f15e0be78d1f180c3f2dce5ce6e04c9c6c30be22dfe61aaaec339004ef5b12620515b6f933b7bbd0a6f669fb1a80dd1d818c0216babadc4889d807d0067877ce961df89ebd43e6a31f9a4edd8bba0bdb31be48d5f7df54dd563f3b61e800bd617d5f405b6042a5c36f25ac6fcf60d7c6c4a9ba17bbce926d10ef8c216a579a6a6b534a773f1e0f65ecad8a9381ce2f8fe41a5b7a34b75183100d040cdf00010ae4c28c4004b324e65267302b9066a4e4ae44491daebeb2859c0ef112f4d4c2864192dda44d967347928404068d0c4afa978958ae2ddaa2c5602f6d337f9436b661f67990901d747002188a704ed53d299669b228fc4b24ccdcb181da59b79f9f0fab97b8030049621df45ba93f11790161f7cd9e9e99eb6853b5e92da5b48dea5a6d054110055805e5f755c0848dda81d07bd2caa40c7be5590dd515913b255a548045d6503ffa3e48c995bc1030ca0eadecdd9a019e1eed53becddaaa5920bf7be4e1d20bd6da99bfa25cec4ed9ced6a08cb07f6712ba406239c8ddafea0ff9a77490b4d7c0ccdb8daa6886fd4f36076e1d2454e02f00003aa924b551412886853472e920461900224391544d1cb128014e7c82302f8743a1f4707f210133089a2f3a782846be204798ce06116beb4afdc684000f01cb048f60200c087b5bfa56a20aaa2a1c2dbb77a8440020c7595a54154a00c2fef8989a1412c333ec2e05f80d005c06000027e34419d0af50935838294c3d9c2c6c84046da446c170f0408863fd7abba81c01f6f44847848301750525ee5711551554085c3ca640d4800732bdd7cd905155112b91be4b8c340c5c34217818000096c9caaa86c4a472802f34ccc8dc9cc79810e6b32863490b78cd2df0618044aa1e4890409400f1aa18207a41276f04113c857c2a1a04be2ade954700001e8480801488128043cc03fa1139630c563ea6db43497b7bcac6d348bc9ddb4693081af1f84e52421b2c647cf20001ea2db0d009c40900200002f27cd3632016da49e6022d4e11a4cd246565e673f261012278fb0b62c800000000889e380044aa1cdc90824829ed1c46024073b4f3a0340973fae794ec920052030f3410ff8ed5cf301eb9146f8d25e15c83000d22c00034a64c20408ca990c90840e836ca4c04e5299fd408000fc415a2a800240080000d0902405011828088140420a00041220f013f34c1cc19fe3c7980a6af4c79e34920b25369e998404459c9b0cc30c0269fb108860495a19d891a3418b8e390b3a0e080044aa212090025cbdd48b324801480c3cd3e39dba5c1e601e9a90370c3081a2c711c1860112a87923021859257651610044aa1b48d067c9a3f580382000f4240408017f25c267d2004a0100001da3c6044cde68a18450f606aab183d62cceea896387f7b1d0f160a650546450e00123ebec8820039772a7113821200400005cc8148480a02404e12026090128080017b8f1c461232e80a1b0b0e7f1b0b1400b71b030a17e06eeec509141e5d873609003c5a3186870053b4e414c00106deee6680002820240080000d81377159c986e2ea40a0b68740703044fbeff02211862452842442042001c018040010c14008034dd40400023a4c10b64fe2b392159b906f8a0f8e4af71c28a81b5fb9e6c408bac3cb1c7248600337f98d840737777bca8e386088a4e07302803388e93f940804ad7845f2482a0080ca12fda7e49284028014000105904601e10653cfe3c0e1047dd2628d60870cb0a69f65ba1c2a720d175b886041ce60622e60c104481b8b3ec2001100f58877040086d198ff91454007e3d92e2e842141a1500e0e44147200a38f051c7028e34140005044e30a65f04b38b21d11810d5cf7b0e071869404ab97c70c2a51ec72285b02430b9ffcb5c7d44851ecc17862aa08086d91efe949b1008c025cab8a6c08003d724f8fd7c00240ad0add1919488142f0306153e3abe74c50d67a772b4e58b33c9f1aba588f4ad716185096c97239c010024285917493041200430a4033bccc25927fc79f76ca1afa4a8641162f68aab3aa284e30577b6c4004dcb6f8a5b0211802034c040002a2434c1764d6c122c589445e3f10674122ab7c920c214267a578cd9941bcfd3f505921b5f43d13584006652f4c024e104801007f0503f00800067c8002401819ee41f2fcb2d1fc614ad504b888a0bcc809856069c3cfe18c8065b105a6dc8c2d47068b1c144c18273040082144e65d0f7cc2)) <<< 16000) + 0x001cf56a067b9800443d0900e30700a800021c27143a3891d1c40e8e1c7470c3a3851d1c20e8e0c047040236f011c0808e00046fe022a6011bf0080029249be90c118670200100478042294fc9805d6affba4805c16d4600118a0f00420280200800002226f813c22d63d6f961e04dd3e8fef35e01f4b8494ed023d615a3a6410168a09727bfc82d04ae7167a317bd5044a05c1ba88459816a56c10311066d3318bb4586e7a5b8246a013d138b530c654039ee83dbbd1c6a8fc1fcc80ebb07b917ef5726685c61add20652648e9412804cfb567ef65a169bc705351106b0b2f9bff1afa1167b2baffaf37f80b7472519be76fcc8aa7273da2e972e430de4809f304ec0000990e4bedc02c6d74bb9d7f85ec56455b0d839013397b117ab4c68b1913d59dfc67c3229f7373cb97c0254f2c18e4b645a68ae7db2752397da94c6cc3e224c827347e9229c60cd8335bc847765767a8558ed59a82f7629a736ec07f7d9b1f704cd8c764d76000102640024a492488e0dc40fd60c3141b5acabd75cc326c6f90964d63887cd9d7f937d3923568d7c4500865cd8efb4b26e95adbf1f4c08eace8b0486793cb5dbd2ae54255d6ef9a6f96f6dd842ce5d6f98d00b5150bcb7cd82b5bd9abd23143e08fdbb74abe49882514c157369599987576e9897f1ed0da7642cb04aad7bcb893da693bacf36dcba2aa07db79d7c71d61674df279000a662e600000508f970074b8deb58943bfc67a756ce96e4cad4ccccaaf86ebd33c7850540d3c36e7f94bb96f76373163164948893bd5d16a85e82677b7a8752636d1bd0e4ebaf923413a5653d1651f293bc0b875f09799ff54f937d1ad16402725d052c887b7b185cdd37bdcfe148f75b663b5fd687dcbd48220bda04d5993bdc78114ecaea500f8209ea5ac8ccbacd527f38b79011aaa731f6a3a8e6f8d577e1f0b9c113c8fc6a27c9c6e25dea4c21d9de8e01142891366fb0eb24c517f7a33ded64f7432303d2cbb5519791ac66b6a69d0d98a7eaf85df316398647866aabf3d7861cb2d993e85040af65ae806014bb802861000538758382003656706a1304110043c3c39e239d14007b5ed4308820800200000fa4df037c11ad12998040498f1fde104117e685dc81820e98765f04052fa0b99e0802ff7b0c50000468765f8013881100400005ac8001b6137b191bd0c8de4646f032000f2226ee3b139199bb0cf94ded42e4602c87d1da5539b0b63f49b0bc644babac1ca59b5f75fa6d7fd3144000000000000000000451fc97f911e302cca18818914610b01003192ecca31a387618143e961f4b30d29f4253e2feb6a72d0f77e000ca4d682110ec9308044e13f0ba4a42711196d6f9a7177e7e7a0ad4d02978fb310769560ef69cdfb21361648b566a6b94d330aea6ea0200045e260873374219b98ecdc8471752050268bec1e1a4a2c17d88f5c8a37c08c86d1e14fbb133f56185a70026ac34c4d8548f158eed0e9d3025b13600000000000000000004a19ea93303a17e238205e9d6a1d1b1bcbb1678e3680ee312625cd0e000000000000000000120c714a0c50c40ca001010545cd2d41f1cd5a288b1adef9d1d900952b9d1d083f99b21731a2fb7de67e8b90008ad92a6d9bfae7f182bc55fe14355ae814ba65a143d09eaae4e11644f035284d80826804000ad84dc48608c03d8b5cd87fa78a62f1fddc526aad0e2262c1108ba90281345f60f0d25160bec47ae451be0464282062c67ebec56d89dc1cf4aedaf585999f7503aa95c51ee19c88000000000000000000248cf549981d0bf11c102f4eb50e8d8de5d8b3c71b4077189312e6870000000000000000000908408308484080a2a2ab42cba40a5a9accf77f1b006fefec105df36d9901312aa48b24046b72521e33089cbaff9ba13dbc7fe9558b2fd831f32ed8beea849a79001109f5c4ef2b1dc25bdc79384da6c5643bf6e9af7538f54dcddef822b5168aae22223cda6b978993c15e8128f0716ef4d6c85b764462decd7b280b83884a86fb27e7a495d9eafb2a6e7c10682d8f28d978d4350955af1507e719bf1e4313d09dd4eaf93ae788dc3fb79a8a2cd9b2940023e8f1e51fa46f747b1912b0cafb391baf1a1bfebbf0969a7b865b75c000000000000000000240966b6d59709e051b29da7ec7490413564ff4de18a85febe16f60000000000000000008a4286206402282400380a2a3055a00d65b9940c052cc8dbc57484d604d2f7c8d19a5cc722357992d7f970494a7df9f20b8d1641024c19ae52879faf072080719c88df689a90103828819521dc4bc0c821c838b40138138c82668ad370051b7828db8046da0236c011b5808da804000b544015140064c84da5966d0c33675d9b32cc4a5566caa3364259b18ccd88566c22318e0d802a269360119af88cd78346ba0335c019ad80f45054ebffd76c6205bcd85087e71e144116063d219fb2023707f32241d12016df970d45a4e28030e6906645b62006c5174ab8afb14027728b663b4b50401009c410706007835a0d81504cd641762ca27a6ba7285010a3036240b057dcec288089d6793c4900b1ce732e11c00323bef5410073dd9da540001102738230081ac0c8d5c346ac020001c523d28b09a299aa8acc9847c55614e2c76f0c107abf3495fb2848b00a1e1c849102d5fbf07101c4163b33a35182018938a052260404f57334a1811044140a8f0587c281542ef7e4e8005afc86d3a284a27582a02000012510b1598821cc408260f00be183722ecfcd82f900ba810c18e0537e58ac6fc411acecb18424c921e82d39416050)) <<< 16000) + 0xc91aa8f62d1eeee79ffabcb4308c1952266ecaeb0598c60c005ed3b795194fe88376a40001b8c7f8b1e00ca472b889000248d6807b5d337914b28a06c04f731643202805e3860a4318f1a45f21fbb7f91631f1749960ad352927a16c91bf08b5ff43d13194d263418402d5ec0a1a339290c0031802732cf4bd963caf00dec800873039bc48704fe56932d907657cf34b92d35688d010059f7e6238a9529e288600d50040005ea4d4c17430cc9976a83ea668cc384b6f4ec94281ade3939fba47acf36389b274102d543f0de96a5868ce6ab1aadb21008a978068ff54a4efdd06b3be8984090c119808cf8efb1d962266e010800fd84ef5e551bda7ff6ff0740980008cd052dafc4150b2662dfd20fc4000b81da391e1810de9df562da1c100d43dc9d3cc05e1ff438beadf56dd68ae5f12c979ee0c90d023000047923d28b09a319930af041d7640a90c4a1348a6ab01e22442ddbce1b2c8711924826207a0c1350d9210bd0601bbc87d7496140108cf31b2c0200fc22f75c5000045504d925d3f960013ecfa21e6e60f08582a02000012b935251057a68d45246a032000df4208c0380d96438b58bc14103653490fb720280952efc38e38437ec69a0c6820415bba47a4f0200439d0fa68a5105545418ff3e3c1840005a90face9204740479a6128013b5648a8e4b199d0ac0800004ae6048c93b7ad3c989049516c502b6c0e084a86ec9e0081811f42314b7d1c480331e07268f20802a85c61b49fc0e00cea1276886a5505554149b77902adc82aaa0017fafb78429266d1de0bc0c00004c240c96469e9a34e311a69280ac2469802c1cd0513d77e2a38a5b4ed2177ad2c30d889ec904e941f09c3a17790490c15f80aceb9838034b81486e3410026b31e45f92000227beff4fcb884023611c5141846e4e785a050c1cbbd3f81a81c38a18774ebd4a8283f8003867b5f18100830201abdca043011e42906e2021d5ae0d54eb14015359f8afe9020195f42e5b2390540af305a3624c2026890785a05000023c208c03811cc496de0161044d5a66d437090b66d8777b50182b6203e900c0604e49b91e22a0c113c5e975104204a43814edcf0402a5a9de6bc145426015925c22102010685404831c0518d828c68146320a0002702696532f8259a510f0a2f0f5f6e7045928726db73820918438397632916185869f28a90283a1c507be9885849b8fbabde107040235dfaf77040018d3ae5e52003a400644f23e2040ac071a5e3ad4bdea4f249031f4486f9b179d6d07048271869668a60a68860858010156dd78a96ab4186089e49bd5162941dfdf725711f798046411ef185e0c4d89e34b8066997a51a2817322b9e0c16af37244fa688b421747003040297092da4c004a0100d3010000ae10d305ec5ae6c3fd3c53178feee29355687113160884d2cc28c10b10c0cb0cd00203c16cfa63ef6d662dec3493ebe88b07734993b54b5888046412283f8281f8040003dc400157cd922f58702e0585111dc6ec5e63848568455bcc728502c6ae102322848219c991686a058003910b1a7142000748b46132010003acb26bbc08021faae52dc8462050b009000043c4d246469032347191a30c8d14646883211819124808c580462a0231401189808c4804622023100100057f9343519a124cd05161d07b3402199f8ec1186667c13e2930377b86589d9c7ea43102160027566586cdcc3aa596089aed29e04022ff433a12003c1ceaea0004e284401081007aeb1bf9a22d72bd296589d5e4da481022442951065873a1d8e5e9018484bb3fe3820573e20a004e204401033c050000c090760d99e84e6b3e5418a2f372adea75f0f031a5e387a5604a3001e90e1b28931ceee189762f8860a0e4111ca6f6a1723016659238a5884085868001ed51e5a0b3670d25490cf4e317bd43252d7849ff107890c68c75eeb4b6a14e9208e7c2a1262087b8aa2d143085d13966b3e5418a2f372adea75f0f031a5e387a5604a3001e90e1b28931ceee189762f8860a0e4111ca6f6a1723016659281058840858640616cbbe035b7fbc455c9cbdbf256445ef9573773b6dd99ac1f601b05a80649e404095a4d6c1b0469f38d2c19624cd33c09000199933b1519d0a80a854000d724cc856660233391181006cce027800f4870d94498e7770c4bb17c4305072088491cb08908608904e00800200004243a1643d81df192cf1d0eb73007fab5b1ebf744308e60d18445a60c020001e923d27302a2999b90ccd87664c23b1a3af0bf76c30812ba0168f281658893f79900c70d2b430040412ca79a163000c50f733c080c08f22e6e82017ccb06c4d050205f09265c830ca6285c802a0f094040386523230d08c02809c042ae0200027c22c69b3354599a20cccc860d02bd228a7745c5288312a7f6f080e7b27897b103153565408305af7438ac1c02aceb3b9460026aaa05200000272c220086913263cbc8144220a04c684076e0793010818a8c7700e18238142a448000012961100400004749990accc4366601332f05f138191a013cb2478bbb0ad0a2009d2b7d8282135ec454c48435d9adf4c800a26bf5098402981ba3bc000271c2300819702f8ac955be118c2ac8397d3e2856ac6bca74a0dd23145bc10161d6160c001945088021c53820d538b1021261592689de50e246144206592de28aff850a03abb2534856396186735db071d66830260494ffc6e883880e052802c1c9b7c700b5f1d5c146882803e848081436054000127102011196868000e90d105f8ae5de3e440c36de4dd2fee407432018d9cce2)) <<< 16000) + 0x061b831659734184cee6893eec64039b62143f390780203e6d91428600af9bb0dfebc00087d08242c02c0000fe132c29195928ca8944d0423290d183008001f848f4a0c69096650433271599308ec65c2d40fc0c050d5b81d2abe20610ea26c374e18c0b07f87a990d0811d1acdcf3706801c36f335060203342a95482d20203e531fee9c8010ef0a3d658101683a0158140c94446481a3230908c00809c042ae0200029e26446a3211919006800398882302e049a1e7cf26988133c1c3aece04046fd78b89225801fab2f91b02805fb7b3334110005ed7bb3e78200337e3a515088aa8a10fd5f4fd4820a02a18410200a8253960a243a81480e0c7c9463c3231d15074088c70346361231a0918c848000b90c06b97f6dc9680e1b51b40e319050241db9c01b40e099205997ea618274407210c39400c5a4d04e4648169970fc6491001ee97bf2c6ea8aa8220308eb9dc4221c2130a80706303231715124888c583462a1231405189828c48146220a3100100017c1002480261ef330e6d986accc30766163318e15801c20930a1198488cc203460e039005bb2a079caed7be075740a59050538b011c2f1e1997177711e84509fb46c5151725baff257e8f450400000000000000007d9154337c3920599c28a20a098016020003741d3a20b800efac8eebfb6eaf70de7762995b13346eb973d30dc5f75c5c801f193022d394458d7713af122b10f9821da5addeb0bc7f5a2d81e2c86ec0957ba3ed104dd8b2c2fc4b1ebe14f83d91fb9d2189cc7180c258e114f3c8d3bc2c83e0e0e72093991ec4c51ecdfe0e1c1ff4bf576eea17bd89db30de60520b8ac1397ae1c6697162af05d9b2994c8332400f5bf518ea5f037c0bc6d43fdb2928bbb875175c1aa3a45eff7eef39d40e102a403e8dcc18b2ce4d753a4e02298bae9cca39ce60393d740dbb74e631a89bb3ebbda279ab800006ab59dcf607dffedb0177299e89f3e0f520fc912cce5f2803622a562d5b0960f41ed9fd193c7207f6ced107bbeda7036eca00bb56aca395bff5c68bee947eb7a7bc059381891f7e4b4b548d6a40478f4f674d5893d22a1893b0cc57966e58283e37df045ff9a3fea39856cbc2fff1243393043c183008001dcc98282f44f09f1b28a0630ba67feebd1bb2257110508b32be2067a818b1bf7f26c618b92445060472db8821903c69e2195ccf15a34a3ca060177fca9e336bcf9b0116a9dc8eb0567a00000dcc7b4b41853af75cbe23e007d5304242a96c2c135b88d1f7abf67c75725f19202e6a129ea3acb98704fc24ccb6be1c00202402b52fbc5d216d393d57e88d16988b0a8764706ccf703f1e2936c4447f17800026393044184d16c130470bc78665c5ddc47a11427ed1b14545c96ebfc95fa3d14100000000000000001f64550cdf0e4816d8b5cd8670edfb57e9e298bcd8b5cd8610198192190008004002020220ac08da1935e906648710ea90a875e2c4dbc5c52619d7a2f128460f0cc5f002845be8f0cd323378468f65763cc7c5663139103a27522524af4195398c9a00081043a06608c039d3d9b1ec0ff7e0e3b2e7e761bbb2f7ed2f3d1d91f23e7463b50e7800000000000000000024dd88064584504404102080a0a82a03cb7e919c4ebc4e0b389184401cc718d9e664b66f809ca016dc96e1987210ec855532ad53ce75fd52db93480982832811fd29a7724c75fc058bc7fb1f761db5b6844cc312df24e83924be6c362b61285d6b51a02e810fbdfe7f9582dc96a00091e6b50ba345ad88ce8cdcbd3ad43a36379762cf5563fcefd6a03ba866000000000000000000092250248238250048040088a82530c10d7df7cb5f8fb9f3c44d24c41027913cb231ddd12208aa0477d258840cdcd82734d006ffde0f4925f66e3f4080f8b4dde1aa221641648246a761cae71fb94b02c39f664b825e8001e993035d1812c8c05541d0a23004517f948bf8945fa422ca0d004048118265f8132fb0517d00b070009809934f1612c467574da08a0b176eb6ab0cc60251c242a11563004653c8ddb85160432d36830cf09003524ab7f1b082a2a22083e7e649f0ce0c52c7d18b59798ea05a050d1a9bed852f806303a348241d4110b0fe77c6fcba68283021874861c08408053fcf2a7c62809d0dfaa767f105404a27ae3d1ca10104d8afcc5e0b22845939170562a61930b80c123b087cb151049c377af24b97981a305835d4018aa02824750da1c90c201a9b6c96199a08aa067ebeff08089e75a701e52000c43bea9d1701634fb3b31909f88142c02448e24e8fc5c8bb870d08c7993ea14048c0e1a3125ed1c48a161b7205430838a110edf65278c6821a256dcfa4fc0826857016771482800a79440a0d3c02fdc545de05c3cf9020600602280100012c12781913b8c89d8644ea32274191398c89c4244e00a26f051370289b415e3067b30820a470d80285c347b9a3097bc629b8080a009c71a0eba0087869fe9b383823edf6e4316a000d348940d526800a10b2bfc028a80d714858d04222182100a8071c363eeaf18fc29346042dab1a67e438a224bb971d22860c35989f0237a0a189bf9926229410200d9db6d56803820b226bcd3924104e5fb324db8a28a8045472af4a0a128220b0bc0c045002005011138088980444a020002b120009d87442b991aa8678c13d3cffedf602c405c42aa66ace0c6216a0f6e91430acca9367c880855b74a88b90c114c170a6100500c7318640755150495824fce8844403c4241500e000089080065f1000f1025f26b2f83197b96f09873e5d4377450ca29c01)) <<< 16000) + 0x98928e1597e29676b21a2f139f9eafbe38462d63a93530688df8427418e8c0c2296c237890800369e7f9c4e0080267431323088102b0246978eb52f7a93c9240c7d121be6c5e75b41c120a27a07184203a031e31409c0040190401006c4f2366bd9c0a072e1a371164c20509f975ca80edc9a71aea3c713a3d125b9e341d3cc1fd850032fbe259738012804034c0400031c434c17e6c945e31944b1c3f0e1f65638e0508d9a483c67d398ceb79c30f357b8308e1582e8c363a180152dd510d080058e6be9714021280401fc140fc020001d520009b46ca91856e690a0915a76d0f62221450601cd724d8d12f26ac7aa62304f3cac8042c0d0dd70b9bba23303fc881038fc8b088f02a100471800bbe2b49e2110c69142a02000010b9e31dd38de547b461245ac886758228627a26d19ced1c29b91345b6ca0d17a77cc57ac8c708d6f08a2cee834404408424d4b080028f6dfb53a80180735c937238c4081681434bc75a97bd49e492063e890df362f3ada0e090513d03901cf1d018f18e002025e50e356669a25ab1b70be13b14a0efefb92b88fbcc023108f627927735eb8d03a19854aac880ec5847e5263c701ed9742e20307e801d0b4f1a311211a302021c5cea8fc9c00940201a60200018e21a60bf37492a6fb75c058e31bfc0af3271c7054d882a0821e32dbac7b52924e1a6ddbd4aa4fa78a8f300c5f69e3853b57a459264080808f80ef14e880022fd339a93c10007ed39bb0c42f4a042d02803f8281f80400051e40018c0e972f7514665d4b2873c95383581228fcac7366e11450300e6b926c68891ea8aebc84c12e7b67a01399a1ae1c864f9eb3032eb2fd88bd83000bbe2b49e2110c69142b0200001101000aac3a5a55cdf85b21a305edabf2f992297f953948f1a23d047316f79824b7ba205eb181b8159b2480060027b916fd50400bd1a43489002e999e9dc8e2040a0051a5e3ad4bdea4f249031f4486f9b179d6d07048281c79a58e78c70c70a68020010064100401be6eceec933d1e40ea1a350a1639590c770f9e355ed8fbfd1c34522563b11c2e82bf5d5a9401054bb095ce00480100d3010000c310d305f19d1607e6d6c41431575a77a0c7030c09cb7111cc51c2d96cfe0ac72a68b73e9761273c1a242818c73a7364822d43a7d3a99040056e96b566b27d08042e02c03f8281f80400044c400148cd1252820e37f4a1e98bbaaf9f90224326d5473104045e66dec46070925f854ccb0efc53103d49810c82e003db2c2e9425b88e028011149c0e6110948a1380a00007e490380800256c90310881484408422032110110880484134421fd090fe0487ec243f4121f9090fc0487dc243ec021f501000f6392f66197aaecbd1665e6ab2f251978a6cbc1265de5b2ee2982312cbb4865d83b2eb198568ae46239a3dc2d10a1075559e02092446586a934a8c7116c3e9be863102174c4ef7f20c01db52a41fc8240fe73a385b30201aa08e928f9540515410284dba3da4411014110118d1bc6dd8b62250a808156c06f36f4f14c5e303e7b5de96871131608d83ea592332b07e3ca718497aad0342991c7d42a5b391f236874cc0000000000000000004745d48140e8bec1e1adcd1382a9d2f2651084ca20e0870850870000b68b7427ef5cada1efcf79f906040da57b42c7e9ff440596e8c874f07e8d5a80782b8fd880bb057eb4bcd3971ac386a05549a4eaa49dddd5dca8324bddf5b0b0a9db79b60538449e6c0f5d022024cd7dbf1eb1fd373d19c185180f61e39a9724688f357fc10a46b732a0658bf3a993f52d2f44aec5ae6c3fd3c53178feee293556871131608855b01bcdbd3c53178c0f9ed77a5a1c44c5823394ded42e4602da8c31beb3cfc53e9dadf098a3164e8d4f3b1f2e172172ebba6c0000000000000000004542883821c214244000123d7b123946a852e88956b9ecffc19216277035c0c2df37b6ae509a286c3d48fef4f509a209310b33a489f964cf21a686ae6ac2d8b4ec83f04e66ab26eccaebee70e726babd4a48102a3a00200052725d45b0781d9748ac08037b16b9b0ff4f14c5e3fbb8a4d55a1c44c5822248b1a9b670f7cce1a262bf4ffe54156d539894f48ccf6d17557800000000000000000118d50383f619288a4051fdf6ab61130a4a8f82e8d7fa0bc18cfbb0000000000000000004532473411811011400c04150ddc969fc10194df657d7bf47cc3d5151a493a16d08d06c7a27574dae524974fe9f5ea9880df413ab0c4975531b96001342955cbcc27c55558c6de4f3b8440681730449e5b986c0823373205482cec75992ef9df5565a2dd5c0e320b729f400186c95aa0c920f6568732b33588618cac8b65d0432e71d9578ccb98564562b2ad0995602caac0700d47f0bfe44654715196ab946c47eecc64f242813212e8faf3187300bfef3f275834d0558a4db3f2b55137f77d96d8666c922bc1072893cd3f5e9c12b4a240d049cedad2059f5cc61c09a2f39ce84a028fc4fac286b74282f806a1761b19d5689cb45e74d12761d22968299ff23cfc37a7efb3dcc7d42c311aac9dac40269252f4fcd0b222312a061bd141f1c5bb14ef2046d411fe51c5c46c67e0ac7bf91c890bfa120d5bf402e78e3819e758725e5a9e29c4c73d5321cf0c8c04efadbcc71a8f102ef4e9fe2d84a507d9574e0be7deffbae417339719eff6961e6473dbfdd2e77fce1fb2b32c38d8b0b341ab37d84cd306017fbdd61e000722d38c19bab36a47e1ae447a692ff249f4c63ee30aacd910fd2e119ba6a8bd958f57b1721cb79453b510cb935acf)) <<< 16000) + 0xaaab9ec68606613e04ad90f99837802a650865c65114741615ccf5ec2742750f263525113e962d4693da8f0686cc94d61dfc47f04ab457892ca44d488545b7c7b55a04dcaea74ed08cb799c81c76dc52216024103bf64a12a80138527498c001a5326fc848104601080400802000008887406cb94265c8132e30997104e038020082e10100001b92e02502510800080c96f8ecaa0665bc232dd0dcd67ca831c7cac648bc1693d069d614ca9023156c06f36f4f14c5e303e7b5de96871131608c3a612613d65b9e7bee8aea6aedde3f4d07bb85e34f051b805a8831000000000000000000049bb100db16b9b0fd3c53178e1dbf6adb16b9b0c2051025002c00800c69c84e6a03746f6f37d7ef7b813f77a39b52331c564d1723a6dc8bb216330b9a251e424565233254a8110e6ba410164ea1090698bdf8c7dac69434acbcdb0a6fb555a99243c8eb7a3bfb4e46a1464f75b3eeb72a13f612d994196f546d0c1f6523d29053a23bfd00c22d046b3884166cad2338e00f198bee2012881080426b3e5418d90f21b05e0b49e83507f069281193a7b363d81fefc1c75815efc3983eedc429b7efbca4958b85d9756000000000000000000092db392b8413f50aaeacc20c58419c9b105dc8a5e79d5a1ba80b200000000000000000022dd880686844846803801001dc8735f371e3d82fb0c9afe8310bd0ea0f7b6eb1065e6396f62fde66f6fbe95a0394274b4cae142d9db8c776197625bc2b1e03c466df84db69d5ef9f905f50641e33e92224b1ff0dcd6011baf37b3dedb9ea4a22fae2ca6ac5116f54a80030f91b9050003ac12dc1d96d8ec58c665b41bf3cbeacbac0c25f0c03fb0c2730e33a41828dd1260d303632f15a180110f23350098407c0210100100400001112d911c050040105b002000037236203e3aabd48a6424119a93d4bc0883088021c74680f532a24110c61a54aa800ab7d3e2d20012e33093920036c8e6fc0250c2300800008912d70916b028b54145a80a00020425a60a2cc0100021692d231168968b40b45460200127b251a832bb2595110cb3c562ae139acf950638f958c91782d27a0d3ac299520462ad80de6de9e298bc607cf6bbd2d0e2262c11dd880729aa7aae40205a1010c106118096001829a7206f5c9360acf9d47a783a4e44cf8f21f3ed8b4a57141229e36264f71e2170470e77166c0b4b13e5435452f09fa59c0b88e8ddf9bb7243aefea9d396118db41b90300f3301136048184201088e8bf2560c487c8cd1f76585a3e6c63448075de940a3814b252cfa04a1840010000104259a0a2cc01000112904c1d96588cb284659213d8b5cd87fa78a62f1fddc526aad0e2262c114a6a9eab900816478a2821023002802001ca76e1693bf3551b84a8e1c7c60f6006908d3247f43f7d7aa4a70427665c0404d2b9187098468cd01c8e00c50ee2d5192110001529287310b0948b20a458e4a056211630e8b14445181a185010c20080025d894d2cc93136530731fd0994b02e448b49fb66f569baaea85b70ca097380fb802f465303c677ce07543afa677696b6d11ec54f7ad9172503d9c48f998ea6d46e93f5b8ee9d6882a98d99fdcf906c13c7345e985ba9da79ceee6870d4a4f7839a30cc35ca01444f8dc6d4024be252cb551299a1d0665e51e76dddd66c5f52d4939a6bbc24a16851e81e395618d6e47a84b2c9c49a133d5bdb931967d9225b3407f5fffbfd3164e78cf842e3aec1693f5a809e0f56637d96d431000a1ca712ca088955d15e9995b6cfeec4f809603080ca40806b6636c9a215b120273a0ec874af592e212adc99d5ae7885c0f6fb7109b6409a16b8150358bd2bd41c580f6287345f447fd51e6a668f8fed50d69d2772020b794f1fd2a9bd3dcd8f1fa102befa77ce96bec441b2cd4ab978ae643c928a0a0965d5b0ed3a5f7b3bca792c3e366f4c3f66f30d604446a350d11c3198b8362e75eeac98652de7e6d189a4bae37713591155150628491216ac21221bd1e0d5c904ba1a563e000011941080400002f08360ccb106652a232c30596102e4737f182f31aa22a26247b1388a6415ed91c430080193c06215e4b9c4e31fb6ee79179886ac55ee2a923d928aff271bfaa2fb7f661b2a2c58b1c93fc4fd149658231e50169369d8e2c16e0ce0cce8b9b8cc12108b8a2d718f3e39669fd05dd6cb354c1af9462a48e4ebeb03f9f2ea9c008f607491554a4d54d1ae6d564bb5d930c5811bca54692717bfe1c19b050b9699346d3e01abb719e13c17da110f921564e67cbc412ea2d7b3c8f980e826b7a837dabb6dacd2a25241702ebe12d5f70037c9535aa9ba2cd007963bfcbba1ee912e5e6146a73370f74e06219b364c58a7646a3a450b7cf10710580984a3d1a00118c1000400002c48dc80f4d41c49410284d5ee1804244f26bbb3b200ba29a40f00009080800200001c24b0494580422bf1d15f088af4345781228f010004af928805e1003f1ce6b7330f46bad840ee6f630c6689c35535d43d43505133774459083ff614e29e1667cb84ba849d4761a0dbada64000317f39e7ab9f96250c5d126f3d96f25a04e3f12b14391591a3a067f63c388d59e81c3d630eaeebfe7be869dd1a0a041c066bc091b3b5af07e5a8e8f6eec145b817d65096aaf4be39a3566c3b922bb120ace4e98a30ae3af4840c77c118fed1d92000207dc7bc0f9e1e568e15d6398de5defe589e56e371c76a576f709a39813e8fe845dcf0b28424989e1b33d279eef3f882a00a70650d682749820d898add0da94521029ebf6f9847ea52a2406e7dd9cb9585)) <<< 16000) + 0xf09598ae872fbb69a0317ed24527312e41acf3e85ea33137c796faf2563412086cb38dc279ba1c5f7eebf916eb15b48e511caa7056256a6b191633524692faae0000933251a8b2bb2d95d08f83afdc9c9f450cf0c3ff531818d0270891102d31a659b1808306a3a58400351fb4e040110404990088020572222a111141888a303430a12184050000e992825114ca28ae10456e32046190010b392b6410948c80132dce978eb52f7a93c9241782d27a0f3b7a09d8c124bdf8ad670ae32065c8a0a0dee9d37c4d97d8bb25819b83504000000000000000008448048026823021000000049da86155f8dcc5f6adfbd7b44af1454abf208841b6540ff431f4e44e8789a2ae3ef26148d622569ed43273f27efbda7c305d97950f04a1f1d17d8c41adda8b2ed9bbe35bb815b5abea3976ee65ee3bd374a75128840ef82607af752c39144ea590cf72b0e7e78aa6cae61041fb38c3da62b12d4e3b4ccbb16b9b0ff4f14c5e3fbb8a4d55a1c44c58227cef9ab6e6956036c63961f339e703d75a95ec47ecc524f4ae3600000000000000000000000000000000000000000000000000001a25354f55c8040b33434023411814000c04112aeb8ebc4bcdbf96cdeac4318976217696536cc230c61083dc736f6045882e71993f87ca6667c862cc009645609fb3445b256470dbb92ceb20089ca52477d7c68461b79732b18e95dc827eda01cfb4c7286925000561256a732483595a18caccb6218532b2259588ecac06655e2b2ae1191588c4a43655a132ac0595580fcbb0e6c3643c86c181d5d0295edb8eba0046d8b5cd87fa78a62f1fddc526aad0e2262c11050f9689121698241c256c15d99e3b24a042db392b8413f50aaeacc20c58419c9b105dc8a5e79d5a1ba80b200000000000000000022ca6a9eab900816a98a40a480200003484c7c6c5c5894cfabf5dbfe1801cd5b9099370d4729f6c407ae982a3e0771abd9f0fd8f250663e8d2ce397001f8b0aa9713b9df22f390d003b7af0022a76555ed897b2f166d2f39a1f493e5c1b9df4c16823dd984315c4f6d06b12ffd2947a5978f25faa4c3a9dc789e40c01a9372a3d712e8920e1325d96c79d8cd358662a3da6f7fd55a263724dae868a430c96833badc3661c9ffbd563c75789d85724bf05766557c4f952d18170ee0fc0d976febe97a7b945c6fd498f36ad5714ea491832ee260cacceb7eb2eca1c4e61ccee338fa58004c3eeebd54114d9dccba094099cbe1007ce89af16e456750ae2c3e2d144200000024529eb62c7cfbcc6453d2fbdf86a15c44aa5c486360fc429294b1d88ca95b05b095d2d48dd09230c7d29299dc0d2fb9af4747b07e44d6f41447985fffee62849b049a75145d8682c27ca1fabcb9a7dfbe79b1bf280892d8b45035e8f6f196c4ad6263d78df51f4a1c57ebdf70680460314882401709001f00001212108042268be6711d5888def9332690224af309604dac5a64180385ce33b100094807c021622eb796ba590aac6ac42c10213c7008004c807401000015840007409550a8000ba080057612a92595410e6b3e5418d90f21b05e0b49e83507f0692811b62d7361fe9e298bc7f77149aab438898b04425c3b696842059fa557552528168484204182980500800504926f9a56c495ad53e35554845f73c06ac2e35317da7c31802c9f2422c562ce6f8aeaa3f24831919ec49958ecb6a618652d918c73d0d4aa468f232d4130c05dc0038e711c9c0dd1f6e657bb9e18881b862c4bbe6ed0fb8c718a887463f5619afdeccb57c28d413db9800804341a34f8aaf9754aa189e097658556e37014778169ca0ea122480000d13e5c681cd3703e812e8ce055ed1a3a3e0bcd330857bf1ba160603491fb4a16598aeda58811e9de2b2f75603c4749872f18651aa5a89acf950621e74fd34aad030f116a2eafdb40901e5d87361b21e4360c0eae814af6dc75d0023404ab6a84a502cc50c405501301200b00003ef5bc413f16715fe37849176ea6ad4e691ff95a9a608239c639529dfc065032d2315f55c2e2b21892a08ab84847f6b5a8e2fe6a88ee920e574848f9a025929092000483040010c2423eded507144a0e0b98e04811843bc9060174c9640024182000800006e9c24263ef9d123612629bf34006a8c2de18062b104d4090307c021848408a4fc919fd5a5043815a99da2026183a0080000a1254e1a2a60d152808000738845808000f4c800380923e150005c892a435151808003d209469eca88765423328c1594586ead80de6de9e298bc607cf6bbd2d0e2262c1189e29220a0a401e0120020017c4d24858d8e9fb402ce0a9b11302e682ea7a3a2cd57c206b72201d2b5c91a7a9cf0f6e3963208d66b3e5418e3e563245e0b49e834eb0a654811c2f1e1997177711e84509fb46c5151725baff257e8f450400000000000000007d29aa7aae40205b62d73619c3b7ed5fa78a62f362d73618408a06486386a008801ba4ee1ac4dbdfbe4a745e2ebf4f80221745792554e373945142f141aa0146c36749db86d158267a17d27b0ac7fe9928a58173ab0cd662f49b3678be424cf13835cf5c4d9b0808bea2a5286d2a009e978eb52f7a93c924181d5d029722e9b27741209acf950638f958c91782d27a0d3ac29952046b438898b7f77149abe9e298bc362d7361e111a441a21020a22a014006abdb8d6ada4bedf4011b264a7d80b1b9403a3a315187b009b257a4588b5ddf4e7386eee02869aca6daad1e0ba4362537e3ff6a1c0c21be61d29f05c0509457fff9c2a71002c3c9160a4f6cdc13082100406600f85)) <<< 16000) + 0x8c8ad86c68c7366e934fa8e0f807cb1a15e96017ca0973e2985d4d4eafa51372bb8c8d73cbfc155909ac48be9bf107e27d0d8bdb723b9ede6b37b6c2d5fbdda05d0bd8bbe5b2e3680157f5575dd38248b13091f8180908376531ba43b37614fca1d75042ea3fb5b04f7c749024bf84997baadb2a94e1fbca420e07396d3f3de029402878289808c9534db78cf594eee15f0c1e955e659582baa02f18b286f5e06acf75dbf12af96de5c51c8f01a6eb9ba945ece146e49c391ebbdaa21eb804f6dfab6561674a826fc5072ae578d555bb0e6e9758d1bc368f2fb50cc45468eed2029562eaf6fa4a256b92c89d9c8d869eea28c5025539d5d673727447640d4f4bc00040791b1090004801000d0722303b02b15ec5ae6c3fd3c53178feee293556871131608a031c25fc97c890eed262d7fc78e2ec487f10c4ef8cba1e000000000000000000000000000000000000000000000005d404ab6a84a502cd018b086090007000000646149434795fe54a312bfa7c8159a0da85cfdf6b2d62e5cdad4d8bb2218600d94b50b3b27074bc02a5356ce8658b1bdd1197341808b4575854d51d3f110199acd695c202e50eb0e92a1141443453c12000517231c3a00179e250e621612914e948684a40ac4a29c2514d8a86140430802001aa62534ab24c4994ca2ca60e652e431fd0994b02e6b3e5418e3e563245e0b49e834eb0a6548118ab60379b7a78a62f181f3daef4b438898b047905ba06164805e4550cdf0e4816d8b5cd8670edfb57e9e298bcd8b5cd86102921901a001202000013d2faefaa5cd950758f2e6352176ccac5cded12700ced82ce9d66d399cf41594575f1c7915e47d5597bd3def7cc009d3b413ae3cfeace16f49bb19e41aaa18811d54a543634613a1400aae41300e5e1bc94a0197523170008c607802183e64aec7b34046483f92011080f8042018020082940900001b9c1644f8c8a6004a6b6052c0c42a73a0013141d004000052900019125260b9acf950638f958c91782d27a0d3ac29952046970fad559a005b6ce4ae104fd42abab308316106726c417722979e75686ea02c80000000000000000008b9154337c39205b62d73619c3b7ed5fa78a62f362d7361840a50650048040000070e47c5d21cc214cc9b43a3ac88889a698a030c88ef59b68802056e4e8ede4ea47b03995f87a8281d9eb41cd1cdeffab07d542b277335fe285b5737a3c8585077833c7893525eb62512ed401ed0850123a000ade45bc945244a2910d148008a3c040010be4684e651c1328805e7350e047bd9e4d4edcea6902f9c5f7a210460f2ec39b0d90f21b06075740a57b6e3ae8011a0255b54252816d8b5cd8670edfb57e9e298bcd8b5cd861022251439009000e02000092fdf97a99c7d85385ce385d386efed082719d2fb282b4fb2b8d022dd6fa9e300866aa4d81c4029d362889920c293294decb347fa0429e9eed64c545ca91f06d500043f251a8b28c1194588e4687f2a438a145aad08d8e87881448db7c48111ec2a3bf0a0826dad57810010ba415081304118040a280651203910893e843614283679d4066892257113e0e09c01eb88e7801aef12da14010923921c40000b597dc804e204401000016c23720385e3c332e2eee23d08a13f68d8a2a2e4b75fe4afd1e8a080000000000000000f8511c91140c90c70cc008000e921cd60b1e17445c0787297565e4d7d1e3cb6f20c0a26d1ed4648df10722f15dbb6ce061b254597b922e334d1459a26771a083389c73367b8c4f0ff4000d0888c0ef4bc75a97bd49e4920bc1693d079dbd04ec6092178f0ccb8bbb88f42284fda3628a8b92dd7f92bf47a28200000000000000003e6c5ae6c33876fdabf4f14c5e6c5ae6c3080d01880cb08608b007010027638b8fbd200d46c8e9d23081bb010e7be6ec1cab25b9b3bf3470a894c10482604f8cc45ad6d647673af88d448792da0537ee6206ccd41c69a8d752fc82cec9697c4d621173ee80025991a12594400fc5a5d5ab05470891fc25d01c1511c72a8450460e8614a2000a4a8335870133ecd8c810000262c220080000a59287310b0948a189450a42056210af8e8a10645062a185090c20280036a0941288a04f45006a27f190230c89f85400406a40172b093ea6c01a53488c16c2b42608c03e7a4871add6f9b6445753576ef1fa683dde720eeb658219585e70000000000000000000901476848c599bebca5050723d715f4ac3072e3eeb16bce393420000000000000000002213e15fd57e196959da4d32b9fd323a05fdbc48399e044926b4000000000000000008462847023822022000a060276d6c0d4fc4edc27feaa904a39890f2e1e02bb3367ec65eb3cb8061a808b14041291e2f6cf0ba4375c1870c5e17c164b7db9d297566940551d0fb8f141931047e0f5a9bc77fe5649920e2f47a2d4291d328fd116bcd91cc02e3aa59ebf5ad0d8ee52c62df352db0704e3f62176c821504358dcd761494e9c97ddd02e3dd8c619f6dc3d2ab21de3e89c9e5823f1114a59e1314ee98c9c67fde5414869d89bb16b9b0ff4f14c5e3fbb8a4d55a1c44c582211752050268bec1e1a4a2c17d88f5c8a37c08cc1ad79e9796337d78e25fc62fbfe1eb495ec303a62f21b2e740a00000000000000000046337359c9a7846252d650e50a22e1b0fbe5594577af86ed667b38000000000000000001150508705100600165d20cb2bd579ccdd03eb9945d2dfdd97772567fe21458c58e289924f1b8a417acc9cb4caa33c170f7c783aaa6bf88e43af068abaa246ec48986a0a439af2babab9)) <<< 16000) + 0xe2c75ef638acf688b2d4b2c797ee1b6c5b2c7ef57eb0d59c404067364e90c1980f09f54ec50f2ef8a732f04b82ae442d00d7580b2ab2be904d17df28cd5f3a3267e486b38bb60ad013c93d72904347f7460765a4dd76d2c9bda6906f1d31545421b465a800465126b2582f92c9a8964d24b2682593392c9f0364f61b2640993182c988164c20b812551ad241bcc0d1f5320ebac7f13150aa2ff8351514701d4fc602515454c4eff7194d25ed22e891dbfd17d29869944afd88067b14f912efdea4bf49b5ed76ec50bb15938de8ec78e42116feff15c8ca2b095ce93e291d2b40333a23fb839d712b63b90592ba9c44b8db1b72d772493754282ed1b9e86894717c499e4f4fcf9a9004472e318c3ab228cd6e0e2eb515cf1593736b5f03addd9aa89d9f8dda7d6380dac22edac255c2748ba2031f5ccb6f5730680969e87446b778745b27c60aa656a00423ab59b2b277b0c5e5d0eb31c6d408f4780661e4095922e415595dd97fcea9b4f74b26f878827c0ce4af10d5cebc6817d6db7f3a64a9303b3f5242c483f0ec8d8b5cd87fa78a62f1fddc526aad0e2262c110ab60379b7a78a62f181f3daef4b438898b0464d67ca833643c86c18fa2437c95b5af4701113a7b363d81fefc1c75815efc3983eedc429b7efbca4958b85d9756000000000000000000092db392b8413f50aaeacc20c58419c9b105dc8a5e79d5a1ba80b200000000000000000022aa201e00e00c00000efa4b3542b4eadc39ca9aeda4915dbb06188763281916c95bf80c576e0824191d6bd6ab3c69305b7ae6dedd3cfd737278a44f5f6353c2ba2a50b50021afd954db5afba73c3f35d7c39cca809e4ff46c64bac6a158578f0a87b9493326681f30a238d5f42c3a38d69ad43e24a6cbf5f88b84776883a4da500080024b45227a2913c9284a44400210e49e1644eeaa2765113aa689d1244e68a272291389289c0644de2a26e1113686b62d7361fe9e298bc7f77149aab438898b0447422da2fd7e994af888b55b7cbd04993dfb5b9d6f19729bc918800000000000000000229e7597f3a6cf1c2d073d5d9f7c62ee1ccdb95340b9561a1c8cb0000000000000000008929aa9aac3f205a2220c21c08e08c0a0a82d156646398f4f3a2740eda975595a2bf807b818f2037e380e2d55b9dde5379f97f8c7f38975262485f5134e730c91be58010fe2d7c05e1023ffa4ec1a0b7c6c14d1177a051493be3d58b5a843a999acf62103fd6c6e4d6554ef73167053bca92feb1d26c1dc5831249623931a2de46593e84cc27248dca93841c00e956c5c00000000000000000045168813733afeee9d1bbe1d08568e49838659497fa8f90b4f5c0000000000000000010c8e0470510060010145416a55d6bb0281d17de47b2b0d58acb74a8abe0fd56dcc05eea10c93a3234c2a482f78a95d91851155181a81d66c6888ff6c824ab6450de825d7e0ec7755ba939d81a3138806d102d10ede81db093c9a4b566b4b46a2ede58e20b38d2eb6ccadec781600344ef6ca0badf2193af64c5ad8424b3c931f3eab0149d5351a4ea115355eeab2f408ba5040120dd594b6bbdd6e1ed0a9a4c84d00073324d69b05f4993522c9a5064d07b267399330ec994664c82b1291193186c988264c20bf2ec39b1c7cac648c7d121be658f5787a08855b01bcdbd3c53178c0f9ed77a5a1c44c58233a116d17ebf4ca57c445aadbe5e824c9efdadceb78cb94de48c400000000000000000115b16b9b0fd3c53178e1dbf6adb16b9b0c2042c71c72022802400018e9f26aebeac79c6678aa0963d73a46508a3cd70e54f685ace7dec47a0e33e9e51ebcfe4f6f57c8fbb8fccf8002bd4e171bc2f69249a84ee09a612d0cd940588bd5fe8c60fb6540b3859b98b310f64a9c2440603e6a6ab89ed821c1bf86353bae05be30fc8cda4ff5a6efdaed387afcd3209608d5336fc952851f8237343463bf40989cd1349ddb30bf50075770bf6009510fc910a7c9805029b2a0e95f66d09213abfebbbb66b1a98aa9ff0632295b5fc0a7bc2b7bb8b6b5c19de40a4dc68f736ada56fcfbc73d773d84f9c5d67c9f028c78741fd8c0c014b584ecc1c1fdef3626880cc662054e782143e1b2b9cda21eaaad338dace3785005b5cb864417e7d68e9d68367c7558c3d962a4fa6552e45bbdb83df80001a936fe5e4a09f6e6d06b3554d4ef6169b25370f8f0d95b153e2cd8bdd61a04f1ec9f73af887489a47233b765c43073b685b0243dca5b630c3633449ca380266c1f6d5c561024906a5427d604c07a898be1632a2ec90dd57edfaea4b491896699dd6f73a37d5fe75c718befaae66c468f826bf89108a3820329ea72867350e047bd9e4d4edcea6902f9c5f7a2104626b3e5418e3e563245e0b49e834eb0a6548119359f2a0cd90f21b063e890df256d6bd1c0446492a86182880680380019a16e0c9992a58026933a7539b00dbdd002c058cf7cc360548132d82f1acb16428b2fe1f2331bdce387cbd05fd381ab8975c4161cd92ead15665f0ed0406ea2de7a9803fc88b5709840f8022008020082600100001b925f0d12f068974243720200014b24b822111010002ac11ab2d12d808003d988581ac6aca64b4532372592c8ec960664ae2b2331585688c8c837359f2a0cd90f21b063e890df256d6bd1c044573b91ece16a509b7ebe415cc7aa190752cf760331ade87f046fe40000000000000000002425de98d2dbe05a224d734e8c2dc674e3c433f60fab9511b6bb30d80000000000000000008e5a1c44c5b03e7b5debd3c53178156c06f3611a060a201600)) <<< 16000) + 0x200004a549c2caeb0013d7a7a9b9db04fec34b5561c3f2ad2d656181fa4cbda38546b7fc5bf8e00cbe503a1685a157a0c074d5786e1acade1140c3265dfc05332a3e024bbbe4880659a5da112825d10fc55f2be5cdc5173af8bdd04f63f2c83f8ee029d9474550162e0adb71a78738c0019f6cafd76c6a24f85fa51c1ecbe58f70a3b35abfff5da791a3905e909091e83de1f13a8072963ef1246f32db1a26ece3bff121ad93254958663242b2551192a06ead80de6de9e298bc607cf6bbd2d0e2262c1193a7b363d81fefc1c75815efc3983eedc429b7efbca4958b85d975600000000000000000009279d65fce9b3c70b41cf5767df18bb87336e54d02e558687232c00000000000000000225d88068692482980500002c3980e60a7caed8b79268b5744ff724f4b4fde13c76000dc911d2909709a002a07152472928a7a2418baca0ddbea5a58dd3c036c8fe89d68068a2498986f2b6a84c45f460eedf7c5e9f55c3192f98e50d7886d7d18bc65e557b608c3017f015ff64e5143c4df464d3def7445de686eb3a8af45aa09fa5c31a03dce51294b1b3d048ed24d27977a5016e8d095e55bb56c06f36f4f14c5e303e7b5de96871131608c9acf95066c8790d831f4486f92b6b5e8e022119708b64e11e61a688db02c3c9069f929ef7382c704a2237b55de000000000000000000120cdcd67269e11894b594394288b86c3ef956515debe1bb599ece00000000000000000045440c3061433c024000dc6343fba167389286dcf45accc5e71ccec374e9e30124588b3c714e74dcd0791b7e9c4fd5e73abe375e27fca7e12c2499cb8373a9647252a537e6e73d195cba916633889285ad3c8f634bb33d04f2ae0e4b264c7e31f98f082514b802595b3d51a26126539a81d3da8cd6b2944c0170100100412980e062ec89952340e4087b1238060d842680098a0f80200002b080704800044ccd67ca831c7cac648bc1693d069d614ca9023156c06f36f4f14c5e303e7b5de96871131608ccdcd67269e11894b594394288b86c3ef956515debe1bb599ece000000000000000000453b500d0f0c204e00a000812b4b743e1405b168028a5a3f41be18e15e9aee274ecd750eeb02435e1e94366a9d097c046d72b9040857264fe83572c3b1fefa38f025fbbd6aad6e40223be2a1b1586cf547a4ee89faadb8d580b6ebfa121dd902d58f879ce82805c3f33ab0034cfd0bf19d73b2292ffa8ecd5e2ac454213345280031e1000eb524a43302b1992888ead80de6de9e298bc607cf6bbd2d0e2262c11879761cda025c929e00b71b0041727ad004240c11c034dd3568689515a7ff14015b1a3ba3c18ee36d4092998000000000000000002299b9ace4d3c231296b2872851170d87df2aca2bbd7c376b33d9c0000000000000000008a84109066824801800033300d5acb156ebf67e1c30482d62441be5b9efc9210e861034107c0bd5d77c156a87d3451cfc7bdb3da12cf75d57635411f5457e3802127ec05c3576ea1ac510c0280f9e535874eeb0812edf56b4b11d9d0b3b9437c7203080b11c27a27f7a86ce8ae1fbb3b14794b6958ca1442a2500d000397924f250c712893864003c7a4935244988224b411251c89240449002002805248ec3246558bda8c915164881324305c0100401048403c038fb2869842103e01000005024821b2400d91f84c6e407b672570827ea155d598418b083393620bb914bcf3ab43750164000000000000000000453ceb2fe74d9e385a0e7abb3ef8c5dc399b72a68172ac343919600000000000000000111104de413c759705e935d43896d6bd1098e893a39ff278bb1000000000000000004185e3c332e2eee23d08a13f68d8a2a2e4b75fe4afd1e8a080000000000000000f9b16b9b0fd3c53178e1dbf6adb16b9b0c20528354024008000b46dcd7c2d71c191e605a8bb01f87d2831ae5ef74a4635d2dcb1dfe795b48272f49a7ced4980ccd26e59a6fdc0389f705975b71758ff5e89b27c499ac86f9f8ffc42f5fdf76181016b32b077713d2142fc52ea10818533755bca2dbda90b507e4657380cb48eee3d86285aca997e9602e66b1bd14e2dafbefc56ea349b194e1c61a2d534120261b9fc7e5f70c8ae33ec77f883ca71b50009bd247c2316801c821b0153c927a73d569997ed464c8e870deb35d25fe5de22d367de0c41902b42104f3dc49af738e28173796bb12899463eac3f9c6cc003f5ae898a4d95f84745fd6ff1b1d01fbd997eb1e3440179e6ca6bd9653a17660e66f64f6570b08c34327818d6684444172e2d69888c26ddd6ceec913e0b6c59496322272f99af86b0068331ff1b0b15526d458d7e84ed23e77792271e440b4279c0067455945073452cf647e35127bf8865e4ee3af0c7cc7d684c69c6225aa8415fd2302ed66a5178abfd6f6565d6acc256e1f06db2c3188fb3cea01b0cfc1e902d8e544e4bbb976374bc0dc5006ece728d482a31d0fabe05afab72cd8de89ad0f13347e94947cf3755cc1182c9dbc4100c3581754437714dfa1459ba4a21f8b13d4c7d2b0dac8047b17e39367ba09d4c7d2a44e22a538cc0004bc11a12d91e80e45a5ca306561c6b6048dbedeee5da51fa0ab7ced067af1fb18a9325be887f779cdd3c5317902b7e31c9b214e9b9677e15a72dcf3783b77c7ffe14c05877ea188849ef667da6dce94a814497aa7b8b2150ec3f23214e79919f5a48759d07240145e92e15029a7ca6e85dd069da8558eb42af5efcfe79adf325a792b3039c94dad6c3b80c005363c12aa90c5b837b5750e8c7d1d8633604396f5b)) <<< 16000) + 0x0b8c68be04aa8378f27d3b19891c3bccd7bbfa45641d7cbc288b2c38c08757b2acd09000a70bac792e4f102246d79d4ad0c6573ebeef366a5f0e883b3178e10e9221bd80bc072dde1c8b75656bc0c91cb49d52c44af6553fbf46693b536c1214324015ccd15deddeeb3bbb8f96352d462eefe1d196646ab863f45fa3b28b067c290006573beb61bc1a27a61642ea5e18f43d2b73ac7000612e043f8f333c5d917bd97f6d75b67bfa177c9b1253dc01a3104e7a8ac5da5c27848546b1caa4d4c27b33ff8a046b4670d929d043a196b1f1867dd7fbf21ca54d1afb76c46dcd630000bca2478720b03111d9888e8b4472520252911c1488dc8446c422351d11a0c88cc4415a1a232091188488c01445e020021ff321a204c7e2048257f240312202408a2a46681854781789200546ad5602807342089e2802aa8280084cc04401022e211168e86946442e2a0321110b068854244280a00020d200c626401c820f82707ded987256b77fd855c1459ba49c713c0aba1817dce117a2f271c176833981ae22b32aa9818c01e01cba411e23c0921bfdc308c05e02625e28a5c98c01e8732efe2fbc87c59c4860c64780685dbfb8c4200efa56a6b11e0bfd5693b725f2a0846d9d0730c51505217b7f1f4a792ddf7f7da403794ac47ffbd1f6c08841c9ba2dce7abb235a1bd0010e79962a83082ae857a3eec2be0320a95491d27c54c622a64c8f208b0864562bf20eecf7f74839a5539a1a40cf87da45fd6feef7720414f2ec5da78f0983ea7054c20a4314f2e3e1b587080a35bf1f2a653b5bd208860a1152319edd5314840de6525ef1d7ef3ae400851c0cbbca4a888e13022a219148ec01437650a0887b27d05fbde4ed5a5c0d3bff97fd775e2177dde2a00000000000000000011048103088042050008005014541e5ed5609f9f1de545a2384419b43153a0a1767ffec455f72378be136ec167c1aa262091198f13ccf60f85800a51d7c1538132456d5545b5ec96950d2c91d02a48aa4501222701113008894040007b84001b289122ac88d464449b2214991022c87d0643c4b21d2190e0ac86c464341b2190990c0080035248051ce9016d513f55b5f0fc7ca44b4aa28849da45c4e4bdd5697a8ae78aca2a6b00000000000000000011892261d02b7f8b1c9dcf9a2c46d76d88e159d9ab62a4543048a20000000000000000004521843432833020c228051536208efe03a7decfa460d55a4e570a01e399ba6146c9a6eaddd64bf45863fb46ad5ace81707b78454083e7bcf1fd5e7fe7ab48115d31f31c08e4164f520384f5728c0ff8e82e4480c0f4b00c8a6489d84b4498a385f72eb3836062785d0686525e4c4f5f48a6997e80000000000000000004411dbac8bcb6b40c196d948f89e13b9d579e40d99ee4f49700000000000000000fc8b10610d0c60cb08409454bb763a93d00a4c5b27899d4f3a66d108e6ffd111b849144d13a63ec58d4d7538edc49bfc261098b29086a42e031290190b00c854064280384b4498a385f72eb3836062785d0686525e4c4f5f48a6997e80000000000000000004413833431432c23802c05150b4aeafc3b36b90917de3073f3478d350c09487fa27842034662470b36439bbccd5cea40c2ed63c7a1a4d6b890b36a95bfc05eb925194a855522f639f58a320551134000e088003e89b4d2b2fc5aa64786bc2a10303df39d8723e360d97be59cc5e0000000000000000008623b7591796d681832db291f13c2773aaf3c81b33dc9e92e00000000000000001f91439419810e11a0860103f40297ea556f53b7225ad845e85690ece45f1c1e2172b55cdb7a2f759b9005e86ed70432107ef03f9f643545522d18cf94947a391366696954cd31fad34012ccf4173c584478ffa426038edd645e5b5a060cb6ca47c4f09dceabcf206ccf727a4b800000000000000007e250e38e68460458420250071fd605a9c6b563543faf42d4e32fff376bfe2e1273ba09eafe33395b82a0092542d90738a4c8f74000a689090cc844664203320f199070cc834664181320b0590502c824164100b2070100043892064d102a4881114406822023d1009c8268d4400621ff2d0ff1487f4943f8421fb1d0fd0c87e4543f0221f70d0fb0087d404002e304061c5080dc6d9ce6a1c08f7b3c9a9db9d4d205f38bef44208db16b9b0fd3c53178e1dbf6adb16b9b0c2022c12412012402000c01041143e74eac0d21515b1be8075017909073be84763c56c8067f5e3f382fe64c8ab1449bb37af5300b2927c3909908286bd3c7d1d42b1c544e49e897a31e280ca94e43dc0ab897492f787ca3b9be471ef85101307709542fdee4e4bc74e090be860f70ecf1c2f9313f83ab06f1005ecbf41cd5cc3a3fcbce0308063af9f9182676c8dbeb8a0b5bd4f044cf09d9abfd9f6bb52000055128e64db01304f4405dce5803ba8dce4f3bd5466b15fd9386206f2b1bcf6d2321f3899a6440e57547ddbdc1256b22988160802ee77fdbdeba455db22450e1987e4c5bcf5b952c7691c2e12263a647ac1701860a4b111ae1d5774acaa46b56d66581a06414e07d017e5d8736404b9253e029d9aa0a338c5a0c111ca6f6a1723016430660450448460018020034c7824719fc984f5ade47895568aad1ba10e0e44141ebb7fb7ffcee1658240085007853d853bb16e95fd68d911e059a00053847cd041345a04c1100046291f25188326c7c5263e08b1ef398f70ec7b46608c33008058f600c2680413602a20d0741fa22eee0e86767423f803fcc9252428404ed2aa9841e87515060140cf1f145717)) <<< 16000) + 0xd0c0df93c092ed4195adbc5d9f5b4be0e6b413c28230c0dd0085e7972576039a704d16c3db3896038f3c40a75c14ae38ae3dca21fea47151ce2801017a4ccb543dedc4a952e2ae8f53884b880014114b9d897933f0e8e45cfca01e92d5edc0054cbf46638ec885f28b66a6961316450d030a3e480765f303f5f1981baca057c8f6d2f0b43060f454adb3389303b8c1453a7a30bfae6d43018204e162af3f32b22f040ba2e047129d2a59c070037a2335e715b64650a003b369354ddbd6d34017ce25edc222493f3042be2287206108211c61576b57e871123cf25ad203167b36fd870f1a7d2fc80c26cc3e0c4c8018e7d749200984088021c608b953c787115eaea60d1c3cf39bff98308fcbae8d914000a73e2004004500ec9709820880203d6021ea010000b111830100016711e91d0f40e879c043cc0200063a22385b1e52d8f212c78c863c4431a1218f08ec780663be2b1de118ee88c770360da0b163018ed80f871e7d677b814382438c23d9ec8954cb2a040f28896fcecba4fc0e10edd85329e155730c2332cbacf2ba6d7668192cc85755f720a86003375e77c1cd2a3000002214b7175692b9d800b24ebc289737595690f58e78760d0c2f630d119a489de8247108a25783438a2880e7377d920000121211004224004be5c7c59055fd3193903ba096570058d973abe01220048f57258004a28440109122905a44a9e488f7d91925108bb3a518124329f4db0060f96442d8c8404a6d6141c4c08440101da018ec80e0700142a0647b4716073a23554e31650f3bcb0b78e0712612aded133e981801452db858c50448863dbfc44120c13f576d915c300002e1ddf2a59f42010b80b1c584393233f30a00e3ed8ba5949e05e7504f2405cfb2e01c4a796756be282a8113b6ca483521a0d14850000a7dcbe940211804000066ce9603898b10069400b647b2c512685d2c7087100ee85537269041ba5a792483087e149a81001bd5079004e08480101d8050000c4100055623ae220006e823ac2bb1c17f288bf2872457b3c9c71a1b2101bb2c507ed0f24ca172acf9cba24003a866d4800098708802000028647540400133a4728179cd43811ef679353b73a9a40be717de88411c2f1e1997177711e84509fb46c5151725baff257e8f450400000000000000007c47906102884864062066800001ae8d20ee15ec5a821ead87ba34e1d2ad2fd5945e2d2be1ea897708c54b9f3633ae3d46ea17f7d6a81cedfa0952d3179d29f370728da2ee8ea008000f2c8e9988748043a002000edc23927b1d1098e302f870efa15c4f07102d6a0a0d11032365604f447081a6fd0bbd0c2c1275018e460461404445c340530da8bba06001c01f1e5800000000473b69d7201570d83f2c8402601079761cd8b9c6d73f6a5afcec237681befc8123230c4dcf2101646882064043841843020001493d816b5e7995859ac1f77bd8352b0001e3bbcb825cc40dc63d2008a0458896a4bd34a1d892e31d4b7ae31e3c0b1474014000564473ca438c4a000516239c931cd118e608e450ae837070814985f415a144a8012c7e460c43af1d0e143fa37553f42508220080e580c72807c2a39b3ecd468a35e3e5860e20fd89a32a289c8f3ee518c1af67a7c92287a881d3191e006b893aae30043e5f4ad00502044010000199230603c82dd030b2402eb64ad262b8c0b23442c31831032421023c0300000c0c0080340003f88e48ec7207638e031c601e06754dc52e8b0c925fae5f861348cb27752018639febdc2023bdced7f03048c3981e30a015c9b880e10000272c230080000c011c5310579487109416042099210e190865074384321c11501384855c14000dda43e954380321bf15000f5591be418dea086f08615a0304601e978eb52f7a93c9240c7d121be6c5e75b41c1220255b54252816d8b5cd87e9e298bc70edfb56d8b5cd86101a041c11010e08e00810cfe05d02aae219751ddb201b5d6c31fbc32664479c27de00fabed3823e35a9d4074167752816368ac390183327cdf405b134afd6800efd29a0b3f47c227b0f955cffef52cbb26ee978eb52eb9c6d73f752d7e7611e2acaf7f78250ce6a1c08f7b3c9a9db9d4d205f38bef44208d918626e79080b6c5ae6c3f4f14c5e3876fdab6c5ae6c3081112460c808a0060002b74b55df16dd0f7bc001a67c9cf12cc1c4a757d5cdad24273849596035f45c9a3f820e51d8ba8262a7eb04c42023674be4828e6148370bcba5e3ad4bae71b5cfdd4b5f9d8478ab2bdfde094339a87023decf26a76e7534817ce2fbd10823646189b9e4202db16b9b0fd3c53178e1dbf6adb16b9b0c20448a1c42432c01c0038e7ccdfa8dbd103d57a2231c27cae60664b9612159f9e53c316dd7c129f8ae8d3aeca3a2fa8eabcf300af6b69004d207f1840c4a31b65e59968bbfd7db9628b2e53d7440ad1353bc38e0997bd2fe08812b3ecff19600256d08fc01308110042658045ead769900b0c7f099041f72bbca458b7ff72dd98820b932e9b82026b85f1e684c10440101bb010dd0080005908dc808000b488100e8001bdc8d09286e00400166c42c0b636e431b6198da8ac6804615a1b19f0dca6a9eab900816b438898b7f77149abe9e298bc362d7361e1112041010a12001200a000000c5bccadccadcab123decadec6d39a60390733865b060dc92eb2801c81d458a368231920d8d984ec5ba884201d772b98b664dd07d49a4dce1b4133d640b5211d06e970209d30d71c19c8546d4f38d02859300a24df8bf50b5c614ed435ea22b9b6607565f121802e33607)) <<< 16000) + 0xa75d0baa39398a90a7dd3b688ea2b7d908002c5ecdeb918c1c8eedf7073ceae3fe5c7f086602121260f58da1d3f3ccd01f1faffa43367448e22bc1f62f092339d5000e9596700618d2884d8f606c817a300e6e306a60d1eb81d519231c66472b030a8681db4104810440100cc01ed9c95c209fa85575661062c20ce4d882ee452f3cead0dd40590000000000000000001165354f55c8040b250c3062462014402c02800954c26150799392e64c8946e4e8505f8d715c8842a1643d1743ad211408293e70442c6244c63c63b90943d70cb927680019411b1090002251ce6a1c08f7b3c9a9db9d4d205f38bef44208cf3acbf9d3678e16839eaecfbe31770e66dca9a05cab0d0e46580000000000000000044404ab6a84a502db16b9b0fd3c53178e1dbf6adb16b9b0c2043c42c42841c44800b59a2f3c3368bb0e3045a855b9f5dc343cd55e09c01999d94a839bb221e949d830bb1948c272c1969406a570877c61862a121676042cf8768cc1e092e07c111c359ca3dd5dbd69ce03a9515314668d80680014d88158ae24c2021155680e141a4a17c346486cba08e98c40c25ed817c10f0a097ebdac7838e011404a6ff0a38051d192db5d0c029e30792530000389ca69d3106898cca77d201512405204000023e20544218e1d0008719162310b09485eca42c04a1af1507200828c040027dc46b93635a831ac3d8d59cc158d63546b1a9218c284c610170187339920336e7754eb2e9dc044a494a145f386467a359cfe7bea3b00c5c6c4cad7285107e7a1c5056ba7535430a9efd0fbd03179892d09b7a3ed8deb9c9b69e7a5698557b99319a95c3fda83ecc838534b13da5a002f93641640053f9f9c14fc8641967375f2128cbaf27451c34fc26bd1af610a3c580510fb415a29e964684cd18d1ca2d715000000a08bff80ac81bc0223c48e2a40a0c3709c23bf6947cea4294e6f7651b2598c6ef764168b31727c1655236b9575dedf2e742c906a737a571e385123a01c2f0f818c321afdb685275f04a523fade80692f595067198aea7828520d9f2b1a20494843698a005eb5a882000463842010c03025fc6a044307401100c0100400001111a809d8bf57667d4b00dde5e8a80110a0f80400002048d3808000548c86fad07d3fbd11df948bf82500e6d5d7ee116ec628ab82694ba7ee4c7802876f8c5232aa5c6b88bd39b0dd32bdba0c6b70bb523ed9a90e2e448037097150c461cdc04969d8524191d0ad253cf59d4648d8ea6f43d44003deff97b20775d755d25f410f0f26d7e8b70cd820c626989cb520c0013c8f678ed7c70b1890334493d19fbc463bde2ccbad295ae9480c577e7ce2ef34745105356d083cd972dd1a97ce13b064eec620e6c170069804000ac445849434a0217d010003ef919b318d216c68c563441316505e12309464d15a54c8abbe537e344d8a3bf6c7f5719211d9a8222019a9e5295991956cc0c3300c682bb40e519d73cd6f0696091c4014497706f146b82e48da14453c48ba02afec9cb61e5ef236580005662e4e8123431e8d572b4f260d0d752bf2c131535e167abf4008e25a1cc834b26a8c607e6b76eccb86f2fbccd51e01d3c2864040fa5714c843ba4af411c35050d8edb2bf342eabaab35ad47613701b48dfb0bbdf46b663bd8783e381a27cd619e619483cbb0e6c65eb3971f54dadaf61ccd27b63a090d2f1d6a5ef52792482f05a4f41e76f413b182434bc75a9738f958c9063e890df38008eb786090f3acbf9d3678e16839eaecfbe31770e66dca9a05cab0d0e465800000000000000000446c5ae6c3f4f14c5e3876fdab6c5ae6c3081450c809104804400030532813bf5db391c8efb2a7bfd576dbfb22788e92c3b7b880feb77787f8711ef9f6cd27647c1bba326fc0466b485f346d52e283255c720fe75133ebac19b0693af402c76ea7e5cbb0b27e0703671e8ea51afb78b073d927e48dc39a61d2c49d5f0eb2edf6406a16d2b1945fc442be1a17e090be828001d708cc94859494001a6c42c1163426b157298d008c2b44633e2391210931bb8c07cf55e90044183c01091e84bccca2466678dcd8a0495a8f3b0c02e5e3bf4090307802000019e4678362281b19d01c89044d99652c11073819e2418bc47a500008c608002185a1b694f7241f6183f373003d6d54610008c608002000016040005f484580e5efc56b385719032e450506f74e9be26cbec5d92c0cdc1a82000000000000000004294d54d561f902c932d32080c5052010009000022ea67fa07a4843d0c72d492dbb53192fba845028e6369828f150156e387a10b5f4decad12d025392aa043925b12f4000c80f8c288a08a5123078fbf4b030875ac062b8610fb5c537a90159fcd4c0000004a504401000011b23382bf3acbf9d3678e16839eaecfbe31770e66dca9a05cab0d0e465800000000000000000444da0ad2a4304dbced2d25eafb4ccb9474919cd4ab83c480be30b000000000000000000000000000000000000000000000000000001a6535535587e40b5a1c44c5bfbb8a4d5f4f14c5e1b16b9b0f089080c40c204e00003dacc3f358aaee6e71fa9591fc11b2171e84ba66d15d92711023708fc89302a2d4e32231e3ea8a1a8d51bad571928a8526755c366f9cd47b4658b70139cd644a8394287fd21d56404ced0eb516356753238004d8e03d125d977a8bcc60890e19f76f2f9a8d248567c0a0b366538b8a6ffa00d091cda9a377732f728acc25f84b819ae47cf8a4389c9a045820ece60f3c565836fd6cb5848e90860b6e006c46236620dd22e6239431c169)) <<< 16000) + 0x2800490919b358b280e24534368d9580240ed8d0aa30ea9a559595bfb8db9f42298c13b01c81245af01f45ce77f19db52583f18d737c49fd637ad34ec92c11dc4f8a58b39cf62700359fdbee47e7db2595bcef7f01d5aa767c0e014a7231bd7507f4f94dc4ac0288215377f804071f08860064cd68ba3e24a13fff3aaeb4f1293fc4e72f324d6495976f0d2a9a284eb942733dcba4acd6f9faecd35058470fa8540c76180004d73599453b2ade9482405f2fdfee130e7d4be6d0d4b1ed6b7d3a8e37da9d4dc0970e37ced854aa91b93197dc57e7460f1a97268085535a8ad580e1e4e4dd5dd49d185186dcead80fb134cddee32c8958e64ae17ae1161c8e4e2d1fbca3f81b4288864d751028814614b26406078ee4448984c5f36882557e034cb01bd9f9b708004a403e010000109321e4ef6e74c50e4257d754400358127151c004fcd33bc80052ab505400004a484201000011523342bf1aa6822628f0496469fed12e61de9136382e469968539982ec30e7200dee0e75852fd29a116754a8ddcd080534c2839e030cc2e49e60d7af45dc0985096d21224841b57f9117f2743e242753f9d509cd451bafcd296713078ec499af50997e10001ac88989dbef9e233219f2d5e1338b93bddf62cdec2c8d4a074963f0978994339abc640289db0bdc194cda6db2835077a2e1e633bbecf9eec434a9f256a1dc22fb6a7cd12589378f2ea6fda8246911b8bd99fccdab3440c3c89fea64c3ac08b174240ac8580721ca2ffa0701256f695c5fadb39c67a7eb1b9930fb0f7130e287862724f1958703cd116b9aaa0001db8e978eb52f7a93c924181d5d029722e9b2774124d0aaa7d52e01679d65fce9b3c70b41cf5767df18bb87336e54d02e558687232c00000000000000000224bdf8ad670ae32065c8a0a0dee9d37c4d97d8bb25819b835040000000000000000084d8b5cd87e9e298bc70edfb56d8b5cd861029c28a1900080000cd8667d813b190bbc332e89076083a35e341c40649b5b6121ad535f10c6f30b5c32d1ef3ef3d3369babc3fb5c4f989f51f435804086c6800f9810df63506300cca8dfe179b0220a5d38c90ddbb82652b76f3b9962d77f8b8eced6b7afe50c19eacc9c544d8a029ba2bfce5431b366280039e1199210b29080065f08b1208584e42f66a160290af908660742bc320e40905182800ae488ad2e86187432e2a0049293359f2a0c6c8790d82f05a4f41a83f8349408d012adaa12940b23862c23811412c01800c04113a807f8911e15aa708034ceceff0e0700243d56f20391412137bf835c7387916ecd67ca8310f3a7e9a556818788b51757eda048d8b5cd87fa78a62f1fddc526aad0e2262c1111611c09608a0840000000bcc3a1c19c91262703c95e5663974bec2e14bacebc49609c8913e07e514fa6a66426eb28b85e851bc322c4506d1b317ea81bcb2be2413c2b36ff9cc7c0920db5c469f5255e5f02a4f0a22ac72e7203e7f538a821e80021211583d0ab9c8558d42aa621542d0a99486588432a3a150190ca0a8538442522214d0d0a604852c14000f58464d25e3859b1d2c10fa683c315b96a2c7ef3a6686ec7b4457536c64c0681e01341bc9d08e0a3bec09654fc8018119a69067344b84700575a4e97fef580600f8b1c3a8584f200008209e848083c370540bc86c2b437a5e3ad4bdea4f24906075740a5c8ba6c9dd04929aa7aae40205ad0e2262dfddc526afa78a62f0d8b5cd878446808404284480280200003c87d23179a62b53e127d421bef45e4ed0c21ba6786500602e59edef3a5e715cc21bbcc4aed378949f918f6628b726a8c906e453a65c03e9012bd04db32205525d8a2b400e69308da940182c1deb80943084021228364c701a202449d5584b2840d8e71b482001dedacdec090308c0200001c84644062e003d2f1d6a5d738dae7eea5afcec23c5595efef04a1e5d8736809724a7802dc6c0105c9eb40109e7597f3a6cf1c2d073d5d9f7c62ee1ccdb95340b9561a1c8cb0000000000000000008880956d5094a05a2249e19c1921860816db6ae028e478764907c0c694db20c7a9b9f5e347449643e9ab1793fe8ad700075a97c3917a647d702a67cb697df540968f39bc57f3d39344e319c8d65fbeac7fb1e905465a8597949d454c915a3201200054020543218f110c708863424000fc24588c42c2521602107200828c040017584631163167318a358c498c158b63104b187198c30ac614263080b802709194c45d7c4b7d9d53075cd21961f8a7312f2f83d23c41676dc607761e77dcf48d2b9a1296e4e70b3943ea39eef7f67ce28a8343c7e6cb50ce48e6378e8635c09a28f01bd255a0cf7a0f4bf984c93b00042115fe9a612f0dab3bc9d539ede58ea683e510ae871d42089b50f28b685ccd5e2e4109cc91bd071509f6942f2797da648fa65815638fa2c682d43a16c2752412f34dd063fe1f4923071e13cc41efb53c800cbba02d0618ea20a6efb954677c16527906b0af14ef770885f79a55f3029e29b774e9f0ce51a6be0aac9fb8d260287c0673cb1c040759829ae3e5aca173d406ff61ebd16576b6be21c502d926d5c1701b525116b56e08da4fb748c42d78811f57404b764465df33673787714b5ea657ade2ece55ff65407f6fa95b9ae806ae07ac7b91908c7c31aefaee3e4c3acc1e9671402fef63dcb2211bb8efed344aa1264110ebc5b7315d9fbdef0f8213a46747a10eabe28558fb3f092842491c5ec7d060dfedb2863cda3670f744e848f9558606bdc99a1200256a39052029ca10270278acb3ba61b6a05)) <<< 16000) + 0x1a928a421e912ce2540324b4effa5f5933d605f3e681ff47c9f410acc076c3b4cb0057f0e3d780d883ac98495abb95f70b5556a8009933b50ca90c87be594efa6a62127d8e825a92e4d47cbe1ae09358adfe9a14001f0677e65c15d3d4c62d44582c4521bbf0307ecea3c694937a823189ad95d3cd1bd4d69a8cd1ee94a27ce1862479a7bdeab883632117621a4030fa0e4018359f812609543db7ca82444d807adc76cf2ec4d8348dc5e2386bce8c8f5d314d0df8e321905b8509a820747d5e52f0644378a5332be7c29cb3694748550fa57b3c17b3fdd57b2a5c4579ec8b2337023d11924e09980a00a7fe8f61be46e066bf3a933b8cffd93c51fb49f8276454add55cbd83bfa2f1fa9eb43f1c14399a51b64ddf22880007e1248601cabdfcf14d8933f4edd1613bb16a49d69aa03c72dfca2b0c82d9131f2dee559512c35955088fed7a9ea31d527af84114c83314b1b99ee1d288175d3b298267450c74f0da8f16d40eb0e4c1d86bf7cd0b10fa02196b53044737d7b17786b46a0a669a7ddf9ff71b9344f06eb2b043a4517b3bfe3e7e46b0d29734d14f14ae3b686f320547ea51b4e20d322c2b61aee743aa490ae5e9a952e24921393d534906344ac55d46fd1487a01d3049d79cd170921561f1c689023a7e9d613f60d709138eac90dc99965ef5d6ee1a90a145676cb09a390d3c5b5ad6995f0f120012cd4c5dc61f0a4d6e49393c57dca18aa6cce9346ca9eb57405a531c823850fc058636109d35602e63c6ea5c2e8f795604b84e4eebb2363f223037fc5b4c67da8db94ea806d99a110e40c3de9f9de0db5e0c2978f4beeb92b9d8d7ba6120615c52d6a519b47455534f680ce4c8934f7482b3b6a1a6a79b6a6f3d8a29fcd84340cf2800083b230602000e3b22fa0200166d22d85316b258b512c60856302231800d8b282fc14530180c6eebe1b0aec8257b33925da4a066a231cd0382d7e476cc6ac823d6dfaf38f37066f6966b11b33fdb10deb4d048044f39517791d38fcbb19f44b87fce80927b6cc9e056fdcfdc3bf4c6d429a4c755a182acb87b21508a21dcedb96c7d4d25200a051201289875f39f24c983a3271609796aec844b51b7e01d010f9e295633a308d217547fdf39262c16cefd12811a4544000413e7aea8b641396acbbbbba63af6692af382cedb0d6fa5e868230d4fcc0e6e5d16acb71c66c19a06fd70019893f58f17a06ac169861b38abf3b0e2507ee86c0b8b946aab84fc5e088ef7551828bb26f56e11afe359072241994cd943286f0d6344a2371e4c6b7c32388f41257121b6ae2f0ce299538160c46238ef245b1bf223096f22734cb3d8c5d3164ba03216d7a44af2e281bfc7ffe066352a20d3aab3cf3035d45e63987dd5005fb4ab7b66e791c5879886e5dc2eee3266d72c7ac48ce609621e5d873638f958c918fa2437ccb1eaf0f41119b9ace4d3c231296b2872851170d87df2aca2bbd7c376b33d9c0000000000000000008b9154337c39205b62d7361fa78a62f1c3b7ed5b62d73618409d2f2651b7344e0ae8bec1e191752050210aa031219210410001dead70d22863e8a7aaf920f5b663674bcb4f1f9b67f0a31fbaeb6806a6f3ea259beb294be0a7018e2728e5ae03d182bd7999c8763fd067814205511012dc2f82ed6b257f3bd54cbac77c10c103e9d48837002692251ce3c56f4852e2aadce6a1c08f7b3c9a9db9d4d205f38bef44208c67350e044bf7210c373a9a40b968f3a1d8226003d21c25fb908639860634b0270f510084cdcd67269e11894b594394288b86c3ef956515debe1bb599ece000000000000000000456c5ae6c3f4f14c5e3876fdab6c5ae6c3081501910c90c90000312c76425e7b2486196f241b587bd03c9468018a389fa478dc3d87268cb88b39b23a9547d80ab9ce50015945ee2b7656aa6e942470120926b8cf4e4e15f1ab295f5ce43cc68ebce4335ac21fd04cdc30ffe9dea25854387dbc981b8fc24695778a34b415be0214d0b054001b988bf8a85f8242fa0a000d6922f852165250b186800624085822c5ecf62f4731791585688e2040490fbb500025cb742c0441842010983f94f7f36042184001000005422f00b177058bb02c5d407014010040ba00e02002008a255719f180c18afa5095061260481cf960140445bf06031d2d63d004a204001000010422e62200015622e40a0001bd22e20b17005c81b1339cb70e09c6ddab6870038978dc8181a75f735d00090608402103246621ef4c2c7e424830c21e50192a341c26fa8220024142000840c84363198d191340fde39a264feb07eac99c8172804e281a64cbb879850122551374424726392c2f209159e176e4e045d085a63dd4d02c490f9a18a005518423023fa19250ea8dd8839fe8471c776148edd89f3eb6a0225419a84094e6b8421af8ae3394507405f4f6b41f06453ec5c6b8e2465fed14b476c880dafdd88d2169400bdbceb7bb11b898b053aff38bed75223742911617defac325521420102bd3577564d1f6ceee48a50b70710400533d0636473a1b72682fe804ef20aaf970f8e03b2b87a3e0a6ec0bcc3984c704771fc793171c8e4ccefa42ce57162e18a014add04810a5448d123071a7ffb5c5d1596010209f316071d44d24ecc7e9cbbb5de0cca04914a54e4a0a08b802b575fe1b926fc63fa159c9cc02bf0f530c49ee0222915c1797c95132628906a9205b82136e82789c18069fe3e638a2ef4c57e5da00014144002bfc8b78e85b8740f03a16d11000628116c318b596c5a8a62ca0380e0080205a4070080100469b864abad)) <<< 16000) + 0x52001227147aa1104110040000204819068484342c612168090b384800049c8b312c12887e5d87365ea4f2490bc1693d06d1a591068236003d21c25fb908639860634b0270f5100873601a7fa7d80b3ceb2fe74d9e385a0e7abb3ef8c5dc399b72a68172ac343919600000000000000000110476eb22f2dad03065b6523e2784ee755e7903667b93d25c00000000000000003f52cb2c7200100000a47123018a988784b29ed8ee18ab5a9eaa1f5fc440e8df828c428732ebba147552181652c63ad9c489234bfaed0aa564b77bfe828026d6ec8128d27bde38cca43df84cfcc8b6dc0acde618e400276e1bdc9b0b8980729e445647d74b8e9ddd78a6846e94c31685b40c2d000705204c32165190b20a858c2400122e4589142c27a160290af928578641c8120a305000ce5915a590ae9c80a85400a9064571162523b9acf9506bd49e4921782d27a0cc66da1f4046b438898b7f77149abe9e298bc362d7361e1111021c09808a09600c020a80001993db9088d17551ba98b253c26c5e8089b0651494afde1f376bec9ca6a379ee5cf0a31fb82788c8c0024e2782fac5841d4f5cc80a3e5b210549c0640a621ef9761cd97a93c924303aba052ae454e69408cf3acbf9d3678e16839eaecfbe31770e66dca9a05cab0d0e46580000000000000000044c8aa19be1c902cb438898b607cf6bbd7a78a62f02ad80de6c235a1c44c5bfbb8a4d5f4f14c5e1b16b9b0f0894914f08608c000049d09707c28b0c339b6db495557a5ce7166adecf59e1183b32ea410129f3c44cb7f64aa509cfe1797ca7046e0da048956d6b89d738c9e6396d831a1c5bb4a6a52d856d54d1ef35f826f75d29358ba9502996b61b4295a4f28ad80e451d119241eb8e1bc24d2500511c06946a712eba21bcfe626a081cf9500e34cd5d5cf0a8a941963308dfd969e0a5d47f6d8da4e8b09f0846d741428dbd54839a45b7c3a318219c7fcc6622ed89e42afe868f5dbe28e98efdb4ec04f344658e812b904f8105e986002272b8f4e007fe93b5db5effaea8eae47c244cf80c758fd1b3cd8b3260a6096e34003adf21152a2e9d2ed5cd1aec796d225417c3102dd9c05285f7a13506083836cba8001b99b3b45f2bea076b501edcc2451dadf88de4fe100573f6c57866b30027dd521a6cc41ad00f675891261b38ad895b13a6a31b46e23a7ba843cdc65da3c85a0c72800076e22b45a157190ac8a80a824001bf44561142ae821563d0aa9c8550d42a662152250a89085407429e3214e150a6868530242960a0012c0200eda0403b254808c0c9c1b127588fe438905481583b47ac3020f4ebe7c5a00c100d3626b99f12006867f63230080216309d1064838096f23d6493e540555044100f5c2fce526480767f445328eb61db0b40a02702a1371509b0884d43426812133050a50084c8040005de4014d42922202a110a40081140402521640c07b8c8672abcf984b0406ac190a4d45040232611abee3e3835b22479616430219a189cef864803bbb886f8f630024556f019d01805f59e14c5cea2a058215dfc9e422203508482c0240a394c5189628a43b263b8dd8bcc70a205eb0e05c0b0a0c339322d0d4090d8d5c2046450a0ad08ab798e5080007221634e285000e9168c2640200075964d7780010fd57296e463102058048d2f1d6a5ef527924818fa2437cd8bceb683824134b30a3052c53042c4280080ab6ebc54b55a0c3044f24dea8b14a0efefb92b88fbcc023208f74b80c0d251d9851755f6f6b0c140b9915cf058ab4263b0df304abcb65c4f162014b8496d26002500806980800057086982f0a75f801be1316496f0fc9ef1cb10161a7ca2a4508a2ede4496d2c39e15f2f8d294182c34f94548c000bda7c6eea28001d06354c5080028432d5cb00d77b335eef4821480a01fc140fc020002562000b8e68864c7c17f77c2472e684a1ba3424201a867c39942024ee2cd36ac0241a0aa17e6dd02010964d68db8c0c001aecf1d551080016ba6ae753400e9001913a43c2050b008000043a45106428632142190a08c85006427e3204c1909c8084e00426e021360109a8084d00426602132010005b8904609d061a71fa4e973638604305aa9736c20208e7d300d5d85005037930dac40481070f2b88348e38025ab94bf9eba10000501db322f8a22aa02a216b3b5a4c8823e00c39bb8e35101d30c00d1424e583ab30d4a0c337c362abc406c74ab3c39e1c30e31d3af000810ffcb5aceec4059e0e1d7670182167794f4f8515508280a8610410fd5f4fd48110006506bd70d4874c2901c00011d113e3189e92f53a439e6d68642c12e0eddef0310936d2959828965908d57000000000000000000000000000000000000000000000000003188c29218c08a08409000a028a9027a2b43e4d106471a9366ae4f22df1d894ff74171aa29735fc60e8ab309a369cfc0a71190dfa9c6575f5fd4992120ead137f0af3aa17472ce832689e0884ec34274121390509c0284dc1426c0a1350509a0284cc14264020004ba200135444c576260b312f5589728c4b5362589312b4589514c4a496250431271d8930cc4945784e35657272e060c3040eb802c241b0e5e6a4648705dc7a0066d2081127d82a56ec702722799cea41006755cde88303027f65d5bb3c5401505023a81c4012802638e518a5205024d0d854048b0cd3303bc5052432afa6914e9c80d7c5939f4f410104813307ef42070552fcc3600c015881975a6000001e9dd22a090bb48e7eeba0293406845a000a347488b1e8a86442a02008f82f030391e2b70)) <<< 16000) + 0xad8800586408c40585ef33c890cb6d40a97fcb7d5101a98840d83ee0b7c08195ef07716a52f5058062ea9da3a83a9a0000066964d4f18126f09c3c97606fa7f18000c78a23fa3effe24118657c6483b06400015b91244585822c48d062442b818becc0403101c4631ed7a103182309d80404edd1052a0700179a270d8200fa12cde4100050098e08c0202422b1200d88f80e0686f3976cb5d578e78c90c9e07e2dbd5ae15be02033195577bc41aeedf0080879761adbfd8b7fe763000d4d8461e95d59410080125f129a559c593c2910005754f7aa40cc806a03003e244c03d20c981985010400c80f815108384609008f0880a82423a0a00032e22389211b2d08d0c8114240540a0005482232aa1183908b8c8002c4882628c4591622a530461d88a00e851f75a10b15471450f4d541491439b88c0305a0404746b373cdc2000e1b799a830502b703a557c4100cd0aa5520b500407ca63fdd3a040ef0a3d658202d0e80540481130d88904c40c26098031020183c00f076d0b2e43e08e2843373c7cec70e29f76397fa3061e79350a7d0c26d5b1c6e858e0c6779bb4750d014cd256ef265003712fe02760010322090a4081e48125fbb909c4d005c7ea592281fc2c1449218c8799bee9008ef59de600808662a27009e00da4964cc0e0006b0db4300940a12004389afdbfc99e5920612f46fc9153695d1fa921b8d218fd610140082b370024a28460100001162054231110df10bd3df4cc1a464e9e71b451106be129012109739b3d62809459025c0405ba945d3e0004c3844010110090000ac1000479221e5310e2588690c430762161b0fd01e0e993bf835123a1fc2c2363878f4f12458c18783e5316380897ba4b4000001296110043079f272ee1091cb8aa75281c38dd9d58f060ca37c04aa14006338072c400c020633e0c041a98054c000009cb0880200002f243f4542142202a0907d828000c1487d1e8268942124a1081907b8680029f08839cc4187620a23e291d785fbb614318dd468310382192b97de30304b249bd29904094863c3e11140049e5cb36820120d6b45a5c101bf65de70920a08c23a36e618492f93c8a4007a0f09c050208531030982600c408060f0038188b4cc2747d530260465de68c09bf19d202b259b86bdc4d960610aaad67dff222f4804762edd50a8097c18233ff9c3ae03fc524041eaad4b7ca7758c028237f9d218f2f0004013628ea15f7bd500588d1141a1c83003f4074404ba340da284989a0f832308021b7d070a0c26feaf5f0a199474563e38108686498a04c18460100ff09dcdffac53c06c4901a54fec8d7f334d42b1dc0324d238828bce00000000000000000089379a4d170305c2f3056b7757d77d1940c18b60ede5d70000000000000000000000000000000000000000000002ce4550cdf0e48168e0f6fc101c9c37c3175a2b8c22eb457161121440e314214196007560ab5d65b7837ec329081c9ab937071902992e49bf0930f7451019926eeaf9f57d497e49c3c37946bd6a4761f3d01f014626a718ce0ad748370599407013568f4bbaa861d9bd0d449d9a2c6052e119df3ae88ecf5433c0ad69ed76e209bf57445e17d13f2ca2346c3d0006e322022b1001584d0af8411d515000d1248d8f333284c4c5b0d745110882e65c283cf333a8085042d09ba5b009840880201fe0ba20518f0fc286c7189244f2f1bc0a13785d8f2c980510a3db87fc818a0dd996489de50d0570a7dbc40005040937de42440b01f0845da51e800fa1028580580001f421fc1a0ab090001c590fd150490883f044054120fb0500065110fa3904d1283e4941f0420f7110007f6909a5107b248119141ea4a0f41900098090f36d0793083c5341e0220ef0d015848008410c0c26d8ebc7661851ef16c14e38a18e141ef610c6081cb65d9120403817a1159e51c10986b0568986027f4a07c7202007be47751f482a030a3be4c921052a83c2901840cb0f612a6c60c290389af52ee2866f99f8c68f900fd12997bd1e382413c8b20358a02850aafe57800081de411192908061bbfd75d040018c760145f98f0a807000040c43b9041da7a0ec390759a83a8c41d25a0e829073928398841ca3a0e4190718a8388441c21a0e00906f828378041ba020005af21b8120db01001a8510da1106c888360441ae0a0d60100273e103a4363c34bac46f08c5143913e7e3b6211416ff6cfc3d9110136ba61046cf1c02b91f79d67e1003786a5a51200802025fe0c5575150359af70d4ce444400e045a4755cb10e98580480d52586a10f8b2002bced48481149202d6461101806dcacce9e1c3309bcde963a384dde989f6484704f5553db7ce8a00bfa4dc7e0408003b95a27bf80022f336f6291908142b0205930897922612863c2a8e574142a2a4cfe4c0914435de6340488e33994c531c006a989da7840047a63aa012708250085920ea901a53288cfb35832f94301b6543e3ca142cd73101e48b3969a094a2443701ddba4130212804034c040002bc434c174419cd110e2891e5a50ceec648a5251a1f6c244540af53a910224a582389880cb338f964a1000d05c6f6a49c20940200fe0a07e010000d310004cb3c5d5d84bee80e1843665e180708ab66604e03053456441731810b79f614a06001e5d87360442618250080000a910d21d0168e8344741a03a0cf1d0670e833404188020cc01061008304041800202c0106580800263082304e3b7591796d681832db291f13c2773aaf3c81b33dc9e92e00000000000000001f88e18a188188104088004028a8b7aeaa)) <<< 16000) + 0x4a59831dd3fa355bb503c2d01e133234ac8220573f6358f458483735e3e427a19ee72ceea0512463b4a500c3fc4a4bc76eade63b7d72d9d42707da194530c925efec543d7ff1b53c26c50a1f7a5f488367332dc5b8fda43dc8000000000000000000000000000000000000000000000000006411841c30c31010811800805153d35206f0972c1d00686408831c3418c120c50506202830c141840a0c1050600280b01417e0200032b2000d9242f97617ab30bc5585da8c2e936172930b84585b94c2d89616a430b41d8598cc2c857eb9146f92fd0a090c71ab1bd502bd69a9308c49086085088046043046004015005514b0eab2b916238fb39207413c000a0425151c39e238cd5e1b17441b40c14dac37d7caf52d7e7a31c654606de2e648f6cb515a828c7dd46f762717a0360198f4a6ff01d8b94523e8dce9821c353f05d87a58c0045d1e5a71447d17c2074937289300b22ea6965ee272e8d6bd85ee6c90b8835d32feeb4a0a2e5b3b18d4339aae2ca77985c7ba4ca0800082ee6da1d6787e1819f310c17871fa72a17a39b2176c4c44bfba03fb53a6f0f79816803854ff945c7a8fcbda96a82e0f7d704ad8000a0034e5ca78243b84a121d982e7684dc025f995b308d10e3ada05e2cf5dbb4d88d00c3ccaf00235d87d3cd6a6311c4cde2576779852002d52ef09528e5b42439d94f812604d855fd34810941a1d4719c66dc9db34724b4865350b309efd15885d1f0bb4f1478db86932631080e957fedc9d6922f5650ccd9c877e8899faba72cb4cf2a7aa4a919a4b705fc80c6ffe26f314df2abc374aea73d1a5ab049d597f47bf15dee1ce0d30e1f7849e5b6334a7a4bb4965aa001aa6309e7e6ce873d608907b515099e35ea2160b168455775c6211a4d230026d0569521826de769692f57da665ca3a48ce6a55c1e2405f185800000000000000000000000000000000000000000000000000000d224085045025000002a43289f9de4ed8160007bbebf327493894a4d84af1c7e77288604792bf467157d4983777ac0a07522546c616d4402fc457793df3a8d277c764b2670beb0071893b21dd8a670a0f3c4a2b1a3c0c59ebd29269f03066d4d76703c01972f0039c20a0c5e24054a236571afb2709f983822e8cdd5d85cb71d4f66177e91e483be9c35a72c491245ec25795bbde0f88c1a7fd64a1e140e6d224791a54001b00858a6c2c12615e930ae458568ae870e57b5a8382d1f56cd22032c3e48ce481a7f0e660300dfc2e514a0082804a78400100ac218558ac2a826134130a901e978eb52f1c083244f01af4040e1e273592482534bc75a97c751ae79f035e8081c4e419463a0909acf9506404b9253f070786b462689af9a823b9bff58a780d892034a9fd91afe669a8563b80649a47105179c00000000000000000112374cfc63de8f1c727389df3f5cef20653c314706b9132ba5000000000000000004153051830c00004f864787d2ccea7fdf2070f1feeca441fdeddf32909e3ed3c09764eda0b5c6da6d120766be1499aa1c09d4395402194fd07855dd03709340886cd157ffcd6d71248c1e3d134043e3778e6601a7eaccfa421e00cd3cc7187220098021d982b8957f9dec59f549a164503eb46768536acd50a20985402e685553ea9700b91b14330c2c1e08fb1ef6058a1f99abd202b1e4024f0aa08e0e0000000000000000011231f16907cfc8693729f37e467b113cdccecfb8d61417b71f20000000000000000042fa525afa233d18d65db7404aa2fe7149675d03453be4a3a00000000000000000fd071490c60c600501038aea5af0ee284e0d4c39c61b6b8fd643f515e4a7b47273f59dccab1bdd66ae84adf12113d4d6166be5aebf3a07af0f3d48e0d70b840c49fa269f74495ce7b8f10b5dcbba7a40055c6253679dcf1deb4108d15d14b85144862fb1b445b571222215d6cc2d22f8a94d130b40ac5413c1200072e214e630a62985292c290961461b8baff669395dc948001c2a73ae6b48dd140be77002c6faa50f5000000000000000000000000000000000000000000000000000033b62f994a51c5750c9a30e2cc9fc54cb9f16911a185ebb41d384000000000000000000000000000000000000000000000000000ca438a28a682602502180220a2414e00bf0c078c5e89a5fb5268568c84458975c0477c082f6465097cc0e0c00f0a7db7dcea6e1985e97a4b73e9d81a7ec00653ee8609e858e3a4caa144130a10585002e8410b03b529f07104d1367f87e3822d95d8358c080459d73b3d44041e2a87760bd0800a120cf1b8c040c61ac4c35594403d15314df20179d0a37b8e40ee39a15012206073af7dfd18669e5b8eee18525f66ff1a28431cec51043821272d8998342439e1bbe81c108dddf134181f137274f2000395098cf8510410224d0900400003da427c640563209e0d00022b9000a30213a5a0019e721386a09b0904d028006f108272c813464005e1841194613253955cfe8d2eecd083f32b752389cc8065c8b379215568ad8e68974000000000000000000000000000000000000000000000000000003509210c1040880040280a1f9d403cb85498afa9f48f7dd3257355a5de6294942c27f1a98cdb49d03768497c2c0d350de5c443c47c37b0d6e0d1a0dac63d79c08d58eecfc7b5309142b174fa7793578326ba8c515963cff15af7325985afcb7e4d2b5594c95c324e01ef1ed7742842d8b2df90c853a01b00d32ae5b395a9b16088562203662f93017e1c267c3d3bd4ef127d92edd7dc66c74b93f9559b84ab1f262fb554f3)) <<< 16000) + 0x35684c00c080072284d30d49ff43b4028842c88a9712f9e512107df8b7bb2d2e8a3848f98520d70e13808138f6d8a4eb358782033a8147c68ffee8020b3dd398bca979704801179e30a4d15cba2020ce7abf4292b93c81b0806a4181d03438fc8ece32a6d5b846e566dff683adbbdd5ff3122d44fc94000000000000000000000000000000000000000000000000bee0d87ca0c5af1d7713e2612fd6afe911dd57c46db174b8f0000000000000000000000000000000000000000000000002f91229210e10810808c00a0232964cf6c87323b5684b74993ed4536515a44c99153dc54a880831ecf02206b1da5398b949a5f728b5d87a67aadfa151870f8ef056b8e5cc380c1a000a7a657ead9d8ed60fe93518e0673e954303c2408586206402302182280000880f2f8426cb3cb4a07e80bb3c8113ea8c511239f0e830580f684b80c00072084b1ac254c61285b0932984902c24407e205bb209207436c75d11aa75ed1d03ab014c862bff6b7c73965e76beb00fd3faf2ce7c564b87af9adef449382f9e930a54bb90dfbf673507dcd80ef8ed61873d083659c4a2ab488ce11a1fdf7946410ec6fbdb9be4dfa5ab6d272d9b95fe1e82c94015ca520b9815d1f1d60b883d93e69397bac5abf74bf7ef45a54080e1e3a9ed5a6bc582ded00fb0256caedc12e7ed2dfd62b049fc1a2a506fbe2513a40ebffe2e1b1a6f9dde9297001c5839a3debb06d23ee3f2a516479d40221b3872cae36bd7d096a1170805f22abcb2a3ed66063406207e45ca81897258fef306e635d317a2570641462c8cd0c9ee1e5172f83bb572f73785fbe550dc7fd312112d8a98094e4f67e189e72835022d8b32ad87817113ee9fc63753a00c5302046da19e47e96ef1814b83d0707116eda1ecfdd76e225e6714490030b21fe68fdd5d0d2f3e3fa96731659c2e458a8fc423a547550deee576597221d301959404282f50b8951ed44babe16eebc8e117221c264985d1450142375e49163f7c7d6b180324b2c5ec95866444f4794b17c8afd021eb2518cf381c52b927905d78a31506f86f2a15517d4e515578852a6d4a1452c800824fc21e1f385676422f7cb0f3d5632d4d4467e33c10e2a2a80592180b903dea4b006e1daa6d6d9253effbe224ec737627e16db736b1cc4ecd5d37fd2400ac8364ea3d5f7f3ee6cd1a743a02a185f9369ff819648081faf80a7405a1d1e6cf5a77654e5f81e3a2d0e9f5184cedfad3c31275849c82ed4a404011ca8d05398ccd7fb8ef80f9e35a62639c324f03f96ab14b591f5509b8c856d0857b1ddc94eaabc3a4d156fb863cb6b6cea9e66cc4489109bd5996047fc89208ec3adea9c0e41204f4ad8ed05a6716dfb088ec5f37bcb3ab5032944f4b589d0861269c25e656a704dc3a91fae7feb7e7a38e12c643b6dc895fab6763b583fa4d463819cfa550c0f3e294352ba895d0226a31c0c73e954303f737feb14f01b12406953fb235fccd350ac7700c9348e20a2f38000000000000000002246e99f8c7bd1e38e4e713be7eb9de40ca78628e0d7226574a0000000000000000082880a40820868418095c51c7b3d7f2ca440596b015fb6a8fa074d059737c282db6637d1598ee6f63462d09443c4fda28390e3a31ce69c0c090b1af39eb54bdae88bce9adbc0cb70493582bec30cd3735ebbfccad35279b27e94659aa0cad81e0c7f76e6a3ae4ac507e0100033e90011eb3c198fcac0cc662a34bfaea57fa40c74b904a0b360055b74c6492213e87e6d40f15169653306b0a208ea2bc3418c1cdc93bc01e67c2edfd6e16113622e7f15a775b0eea09cab5cfffeb14255a884ef17e9ac01b0f3f1c37db28b8ecad2908f27f04270af9f3919e46433bfcb8a218c38fb041695672d73707cb3171af412d29244b557b0ed56c8df4a011d54de8ca5b5c1e8570300b34e6197662123bb7e338342e09b8eb6726ef5761a0096959b538e7214c82367f78c994265ad4f1c659b7ecc2b6f55194c2a2404ee99c8d8317b574fb24bc2552a2cbd1a0d18c886db5778c54745a412f5a73c7aaa09dd893e36b37fd8ceef7d6d975401400f0621163f79a972a1925f783aaecee8f2f82e4b24477542812ee62370cb00320503d8081e8040f2020780103b8080024fcd0c2083784d061416ff5d111a12c3bbe0ab1410f2ec39b00836c71102f0b00492bb6eb8c0041f08bfe449c408c0200ec0a090010478082380411a0208c0104580800081484500e57ead9d8ed60fe93518e0673e954303cf8a50d4aea2574089a8c7031cfa550c0fdcdffac53c06c4901a54fec8d7f334d42b1dc0324d238828bce000000000000000000891ba67e31ef478e3939c4ef9fae7790329e18a3835c8995d28000000000000000020a0e31c190104116031d4ffde5f5144b571b2f97328068f554ab484be88de04baed91ec1602d65b900b682f2faae0fb88236988823507144195eb9594aa0b671e98d79b39199930d7498e889e269fde8bb7ba9c29a76c91181f019479e044e2b6885b50d7255ec00004010112020320103d008000184d8c12c44d5414316952385668476457fc99411b71f0cc23802e3d6baa02046e3b160c1304110040220240980a000163210e2a0861504286814c340a4120510902804821016001202420cd6104630812d84014fc8002254f590c200089544003864ef47ac5a0c0cb71fd5fca1c3023d38a7d830f49a6401a110129311f0de07fbfa8a5204100be46db188098041a400e425c7a084104f9a8cad5c1e2b002e8acb4868804f8b9abd90827611fc5d0547860ef099df5a200009)) <<< 16000) + 0x8eac0a721800016e34e60001c9c2f301208c82070a8091e386b0e92d8678ae42c53e2e9a2080ec5a21c4088c7ad40790826fc51af860786144b50d481a1159a658b20584001e84688001e847a212062050980500fe0a07e01000107100043920643391e07866d959e780000000491a003d08d11e6800f4240078c0946994614303736256a30deb8c59b322134a2fc83c6010880112bf56cec76b07f49a8c70339f4aa181e9bcd268b8182e17982b5bbabebbe8ca060c5b076f2eb800000000000000000000000000000000000000000000164923522ca18619209108b00100c020080340009dcc4c007058cba894054e642909141061c6870a2e5e45f0784014676fcade08002181f9226002300803e8081f0040002cc6048b026cec78e140aaa80827f7589303800c6f8898400031db1a92840f00401a40400021a66f349a2e060b85e60ad6eeafaefa32818316c1dbcbae0000000000000000000000000000000000000000000005913cf48d3cd44c28618630344230080200d920021c0242cc744c0262b2c1f6514302a8c932a52861bbc4a51b9b4c90a06c28f0a90b442451875f5c30160000431e76f001000962b7758007d08042d02c0000fa989e09a03b51d130004f05b9122825c8af5f145ecdecd0fc8028cb0463d01000468c255cc004601007d0103e008000598c0e004ea9cb8810001ff08810487733c09090000eac6ef49020880200d2020000f32000d2a41ec040f4020790103c0081dc04001bce6810b96f895a40216479367c107619acbac0e0012f246b418012f7ab538892881180401d8140ea02074010398081c8040e202070010000d3906f2d83714c1b4960d84305401e1001dc887349384c5a2720643182090d4dd300c90c2b1d6e7cf0187d07ecf97a81c26c5acae4a5860884fdebec14d0060c810a6a2600acee9ff18b5033d228520488980f6cce34d2ca514029e8d61b88030d8be986ff36ac50a12f857ab664090400df83c96180884da94ee015ae288007954a904f0a004a817c80014e207043003c4afd5b3b1dac1fd26a31c0ce7d2a8607a6f349a2e060b85e60ad6eeafaefa32818316c1dbcbae00000000000000000000000000000000000000000000059249044c1862854824422c004030080200d000277313003a878d7a05808fd103e14596fb60f3c48807a09480d0051da9cbf48200088dcdfe98008c0200d60206a010000b31d0c931a6f0784217d755240145c0b68604a11f02524081d008034808000378834008001c98d8e0daa8a4b8e305223b182105d4cd5f9f0c08af87ebc8400045bc0728e00e61b377828020430933a4e10440100220101080819c040aa020001bb20cc330651583208c18c372bb8ba04b265602685552b11f007d16e7eb74460bdcc5dc5400000000000000000000000000000000000000000000000003108e39e21c21820410409800c02a0860800401b379a4d170305c2f3056b7757d77d1940c18b60ede5d70000000000000000000000000000000000000000000002c8a469658e39e1961a412407a1200ae082e00d91a017f9276a1299801813f9014038faba61f6c21678612007687ddc9840160b9ba78c904a2bd088dfac6000010c79dbc008004b15bbac007d1008580500001ec386ded70abe850415950aabd20421cc0451a20a7a7a07ad3c10116f09440800000527ea60023008031008184040002c86250ea7b95628b106d27d102049311ee3000a06ccba48103c0100560100007190600d82f84c17817379a4d170305c2f3056b7757d77d1940c18b60ede5d70000000000000000000000000000000000000000000002c8a67186104261a211e1260fa1200ae082e00d99c00a9bb4808237b7395bd28180ed6952f4c34e9def4ec7840225b2a093040532b8e482001362c83b2704230080000b69e3ce62e0c3c4c20cedc966e90466503b4a4e04034a200184000c3ed10794008c0200ba0205c0100009a905b0982d02e87805560a3e1a68066ff303124e430592e3282213c050a228100afbd441200807f2ef0702098982bab812002d8c4ad1000b71b005c0212004257ead9d8ed60fe93518e0673e954303cf8a50d4aea2574089a8c7031cfa550c0f9124a822812009c08209c00401804010068000c7905905d5303884a6cb4aa0011f6c4a98d3402d0fa515124d8bc2d648850434ab8a01f4a040673b10d40104aef2b2b39120027dac176e001406f40115808270144afd5b3b1dac1fd26a31c0ce7d2a860785541538925511411408104e0020032100200d0001172000634669a1ac4d36838fbe11615b26283b93609c9843888113124127e672e9610005cd8e2a84c10440100580902b82800059080041d98941dccc84851634261d0102007b9a3120101809080600023533450094507c0200ac0a0001182001d1840055acf189c990eec8001dddc89c702145c3210500815efa2900241820008011048084140aa0200011b2098120018f920a82205311029068144340a01a0024f720076f2413cb400d8a841393409a1a00770d2098b204b3d0250a8124340901204705003f56904621fae451be4bf42824330cbda0f41f56b9bec231eb9146f925160bec4d17d83c308ba9028108c8610408704104300101054545a9f4924ebcc96a2238eeadb51676dae800d7c6a6ecc20a9bba370950062ca6dee3e87f1e1628ec1ed93e1c83dc64c890431d0450181500fcbb0e6cbd49e4920c7d121be4b825c4df047737feb14f01b12406953fb235fccd350ac7700c9348e20a2f380000000000000000022)) <<< 16000) + 0x42f1e1997177711e84509fb46c5151725baff257e8f450400000000000000007c79390a601fa05e4550cdf0e4816a38a286404300801e93db2258c31b8216b19569dbad99c5535fd4ffb7c40bc40f7f3ac36ac471f8df6b31ab9da5822ed8025854a7b63c0019de77426bbfe8c93d965ea094f4e26981465b71bb108089c5e2e08ea9f36604c082cf5c24dbcebfd0f1e086ae4aa504401d101b46c71e402e2ed1c83101d1b881a29600c9e8cfe850033efc6220818a50fb5d0026142100860c25ef3f8828354d1357c0c1fb6ad633c608463531301816cf44add04024b86ae304c1042010b1355bf229c5019d730164881080021627b62d952100046aa70f8805cfc8eee918210004000029c80009e991b14330c2c1e08fb1ef6058a1f99abd202b1e4024f0aa08e0e00000000000000000112374cfc63de8f1c727389df3f5cef20653c314706b9132ba500000000000000000413c9c85300fd02db16b9b0ce1dbf6afd3c53179b16b9b0c204241041240140080bd56dcfde0005616bfdabf43fde1afa6c4095f9f73993595c14d9ba5fc40bbe1fbac63186f5c14c414ee724486412881d997f441cbf88fa3884f2adcfb9ee6166ef2fa5d8119ac12ecb31f0216fbe357abc9f10f2597cca86b4a95400180881f8880022f48218cc108660823304019d09fe47686c78ca7e82be9fd41cd2ec53a97f5820f3c5c89ab2dba1bfdc80951497ce90b38aba329aff59c69d3d5d51c3055be54a1ce622d3168fca85f5c32c2a04e8049ee6a91e6c52b8f150558a6230099f3c0be9b8aa3a19ecdbed5a85097ee0649e77cba67cdec70e0bb7ea9eed5921e88a626b2c4ae5b86471f59bf4cbe96aba2c93664b616158298f1403d2c4120a2a6d582ccc0961c19fb8cee5c32000272dc9a81e9e40ce9fed36e9da49c201a836a6b376835d984789a1185312cabf6eb1438f939abb81c6af4a1c8880a957e46309a2a2688d48f95abbf142f6876cde3d2ffd4de36e5a73de3574adac1f30a4b515ad31c6f24fad6950bb72da054c04af06af7ef8031bd6611f5a8c0d7d74e9814021e366b7cce689ef228e3eb514fe926d22027075a3443f4d82e7c3da40b556d44bd740f4a96911384a430686d63ead5564b4ce107c402664034e9fd748cab15cdd97cb0dd6ed53bed4df74ba6369944e58cb8db3845a20d3f025746561aa9605553f258b01dc339a257811cf9e9492711a113dbb09ab696c5e56abff40704ef1c30f3bdbb268203fb7423feb4cd2892e0ac04269a1f502bea57dad44a520001ef4eb28568397630ad33906fec77bc69b3e42b0104576f3e9ec82aa8959ebd70a242abcd4304874988761e5e3f736a426764ff8d93ae614000830f8fe6936de07dafd2311237ddb8fec9d0f68e8fb8239fdaed829a0a16abe40e2c0bf7cc3d395f883f4b75453da1ef0103d7a03ad19eea63909db659596a1ded974d13c0432d32773cb94ec735f541d1bae094c4ca0291a5ce44c6f603b7dd2a9b957030705c0993e9cfbc8c5709a41837114509b8c37238bb1720121420004000041180c00802000008881f8680027a081f08800500481e8e80f06407632001ebf2074720392501c1080dc44004b2240d94406a9a03449019a280c9040627a030250178c80b83405a1202c0501580800a7c4802aaf085f3f067db0c3020e7f4f50e081e5d87360606b740a9f4a282002dc6c0c080255f8da9fa0a8020a4c804a010e28e8e632b50e1602973b2b04081fcbbd3c10001af764d30c00715e04258a001f14a23922808d8a09001005403a30df1e2dabe3391df5c58080a5344ebd501c84cc51fe658580000000000000000108113efbfcda1d01c0c8ba902820000000002231f9552f12f7608eca90854557cd8b90e328e23d53a156e594e600000000000000000000000000000000000000000000000000001a0c81880c308900601140cf9c7e8a56d6adab67723db465317443681bbe3825c423821b84dba2229d6a3061ada0841bda79b92ee6cc50f8f425a54dfa440896805d20f2276d35cdeddd583636da51cf3e3dd1216187b81c4f09b8c890501b74161c41e2bc42709b1ecb2e91801d02cd3f521a6622e1832a6368ae2c900f8e280f183068a17ffe0b1ab90df795a1049963724ec18000cc3ba154c004a010c240f2ec39b05927c1e6b03b08240ce1823a0e08010996cc8b027d81e0e8a500002dc6c0c98009402000028e70c1e213f0d218307ff6bc14cb1aa1b8bb7f0104975dd1b3024100f8e280f8c000661dd0ac200053377a2b3801280430c09e9facd230903cbb0e6c2c93dd51f8eb0824acc32c662c09f9a8e2d52800016e3606b0012002000050080016990290981404c09c2604c1302501e1848c288dd830613e0d9ab596351ca69088c9080910e23a21045c8e1d4d618000cc3ba1582000f8e280f67002500861813d3f59a4612079761cd85927baa3f1d6104671739f205813f351c5aa500002dc6c0d600240040000a010240581182c088160420bc30694463fcc592023b454663060e351a1ca963561787cfc42091b90bf87448200592db0e18000cb9d95d004e204a010c3003a9f34f4c240f2ec39b0b24f7547e3ac2090296fab74b027e6a38b54a00005b8d81802c204800800014820005c6408014000c74400315480f8a80783400270e4074b40382a01b1500d06800557880ca280610402e7a0163900a9a8050c40264a012210088e80406401e2a00e11006868030240160a00a0100480800611080404801c0401e58840184400a22004110018280080400202000010083bd1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 47 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case1" = "QuadHeightCover12Case1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 47 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case1 private def zz2361:"s0939"="s0939":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l14 l15 l16 l17 l20 l21 l22 l23 l25 l27 l29 l30 l33 l35 l37 l4 l41 l42 l44 l45 l46 l51 l57 l62 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x44eedac25, -0x59514ba00, -0x54e07e3ac,0x1e065ec08], ![-0x59514ba00, -0x32d9814472,0x64b38a6d8,0x532499a0c], ![-0x54e07e3ac,0x64b38a6d8, -0x2439b7b835,0x597f125ee], ![0x1e065ec08,0x532499a0c,0x597f125ee, -0x2cb417800]] noncomputable def hinges:Hinges:=[(6,l4),(0x3136beee,l8),(-0x833ca7b,l11),(-0x10679506,l10),(0x11e1a3000,l14),(0x1027c90f8,l13),(-0x119adeeb8,l12),(-0x19c96f90a,l17),(0x42aef26ee,l16),(0x47d50557e,l15),(-0x3da566c,l21),(0x150480fc,l20),(-0xe12048e,l23),(0x8d4d5ef6,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x122e548f8,l25),(0x19a57d068,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x94a537e2,l42),(-0x16946bf0e,l41),(0x79c3b2c,l46),(0xf906fba,l45),(-0x14f123fdc,l44),(0x2cb417800,l51),(-0xb4d51ce8,l57),(-0x58030c33,l63),(-0xc3af6ee4,l62),(0xfd5c21b0,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x42aef26ee,l16),(-0x19c96f90a,l17),(0x19a57d068,l30),(-0x122e548f8,l25),(0x47d50557e,l15),(0x11e1a3000,l14),(-0xb4d51ce8,l57),(0xfd5c21b0,l64),(-0xc3af6ee4,l62),(0x1027c90f8,l13),(-0x58030c33,l63),(-0x16946bf0e,l41),(-0x14f123fdc,l44),(-0x94a537e2,l42),(0x8d4d5ef6,l22),(-0x119adeeb8,l12),(0x3136beee,l8),(-0xe12048e,l23),(-0x10679506,l10),(-0x833ca7b,l11),(0x150480fc,l20),(0xf906fba,l45),(0x79c3b2c,l46),(-0x3da566c,l21),(6,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x761a0b80a20060000000000840720080000000008a02640180000000011c02c80300000000002a0710040000000000540620080006191228806a802000000002522038c0200000000004a03100400000000000b03200400000000000e0640080007917821022900400000000000181900200000ac421901e400c00000062088190602000000000011018802001c62ac36809ea00a076c5a430405dd401800000000000a064008000029108480510030000a22084c0362008000000000485033004000000c608803260200000230c8480510030000030c1080a9180a000009c3a12014400c00000000a8500e60101c915408d00ec1006000000308a2036180800000628a5024c301400000c714e0498602bad162040404cc100700000000000a03900400000a4420c026400c000000a888280e801000002910828059003000004a1906013200600000005219016300c0000008a18810c602000000120d0501d00200000000241a0598040000004b0dc0863010000000a218811860200000001287004cc03000004a1c04805a00600000004619022300c0041861082055e80280000230c84403500300008618842037a00800000000000d0320040000000a82202a60180005409c1401b50040000a41502401ea0080510284110018d40180a10520210019a80300004d08c1200c90040014c144130096a00a0001702807005d40100000000004c012401800000001109018c0200000000221603180400000000003805200800000000038012401800000000012014802,0xc806900600000004219022300c000318881a00f480200006110c330269004000000003a1c0318040028c3084103d540140000000128d00c60100000000251a038c0200000000523c039804000000000a8b03300400b20c914c042680280000024c290090c04000000002a140298040000124541900d400c000000e20900fe6020012120230c066d005048a40a31e042da00c0049c838d503db40140000000001081c4010000046148840d900300000000003a031004004185088102464014000418a421012c8020000831444102590040000000000420310040000000861a02a300c00000000110e0660080000025220e0250020000086291080f200600000098843405400800002610c340548018000043150880790030000000000320310040000050881024c30140000000078381460100005210c3201e90040204186104048ba00c0000051821015230140000001245204e60181020c30820215d0060010c1a423007ba00a0020831842015740140000188642201a801819c1430ed010b100600000000320e05180400000ac240c00a400c000000b850301c8010000000158480a8c030000000002c281980200000003211022300c00020868118198802000980c20fc06410050284206184048ba00c0000000000140620080001e0420d013880200003c0841400f10040000e81a04203c20080000002105003c30100000000441401860180000000000d034802000000005a36051804000000000013032004000298841a0112802000003b0f04c051003,0x1082204718080000000220900f300c007904505a03188028000760941d03310040000000001f80990060000000000740b20080000000000f00e4010000000000f402c803000000000f000990080000000000440e20080000000003207a40180000000006c0348030000000000c80a90060000000004c0782010000000000a80304020000000000240308030000000002202c100800000005821013300c00000000b0900e60100000001609c04cc03000000290900099808000000005844053008000000000580124018000000000d80248030000000320480618060000000640b01c300c0000000dc2201660180000000190901cc0200000003408807180600000000002406200800000d0082004c6028000001a8210058c04000000004212039804000000410c408e30100000000843201e6018010f0cc13405510050000000311080b18060001bc2a05007a40100000000001e01a4018000000000240748030000000000500690060000000000640d20080000000108e8146010000000000e140cc01000000004a420518040048c7108d00b14016430e1043401baa80380000014c3200a4c040001243183003d200800000000b4140730080000288a83202c80180000000004803c803000000000098179006000000b468440740080000000000281240100000000000440c801000000007a0a0398040000000e24900d300c0000000188b814601001a321228806c500500000000002a0490040003089314c09b401000000000b8700e60100000020c190090c04,0xb8004c8040000000002e80590060000000000b80720080000258c41201a801800000002719014c02001c430c190115200a00000004219016300c0000000a44401c6018000000188a4058c030000c626066055a0080029433845017d401400588720a2053a8028000000000190388020000000000360310040000000003500a200c0000000941201660180000000110f014c0200000000001e0290040000000440900e300c0000009008802c602000000138110058c04000004a1304805a0060000000001e009200c0000000842202c6018000b218c530121004], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((0x5d3a2857906942c1c3b9328dffd56241bc7048500e9c95bd8059145144964144163162142100180401006d9726f24287ca18594684c6608682a612db1251bdce66592428092c3740460a0c787676f2ee58a2ea4afa8680e6040c4d265dccdc200000d21b3bd2e080044a65ee76874ac4801801c2cb8a37f4d872ca3f4ea2e063890022551003099601970b52c90a8b098783850022551032c5254f82e8a30002177131ee000900200003424001014c90e9e73cd58d0a60e14a442ac7c0a50f83bcc9edb9e848e62e15de70ef24862bb25ea9e6744000c9894f5cbf63801295a89d49241802096c874ceda13882020c00f00004244360261ae130d60586a82c35017241cf1a866c660e0044aa200143cb86a7d22048e1fecb734a981803dc94c404864670236d8120a963792d8c020094171c58e184c0200330d0698282300611603920c065dffb95f863a10269e7e87e4287cf1c7f4e1b85abab18e21742a68091dbf902c299f38fc517ddaee4242a2430da8aa6683d3acf4b8e054b428007005669317cf3bf151a0781f9b566e000043d96ec9ed1488ea5c3f5ac4d90bfb3c4856524377c19729e3b309674432a04b34a63a3628a38dc2680003b82000ba843485742845244af62059ea02ca6a38b387a9bc28704e03193ac92011764072f180014b3011018014ae7c4f020002ee5df9802aad050460100001ad21a2430991d84c0ec25c0606003b0d89f98a00000000035983e9bfa4b10b5aea0944a20810410d0ca0c404a02dff1763c7b7df70cc8d11fd1d22ae7b7127aa4d402129345c71944db443280fe72fc147be72e897c8067c8351c298640833973001084667a737cfce577b805732f121a1f82bee8cbddb4dae669f44eadf7f73264d6c20267206814c29f5b2c1d1a1ffaae4c2be37dc1000860da514b33cb7661b50d443f630b51874601cc83b53035dcafb529731e34c4c907658f12b894cd6444170553aa18fea129fe51c8e1b400021510d015e0e8763e93954f939245b54a1c6b3395755bbf6e954f6123c77e36cdebdb0d52c8af3021e1ea46cbde644728b44400292ff7857d64663f5cdc500280d0dde5fc52e7c88682003f9e377839eb59e3d120123d9c56070d120d440012af916b012c7b9c913c2d000065440d48761b13f3140000000006b307d37f496216b5d412c1757e6000000009ed6a1d0df5d2903a461048e604484302500022b532866) <<< 16000) + 0x3bad92edae56e83b7a6388f3962e02af0d7a904b2818e8423ab26596c22198c475b12501017074a0fc19e142a7a5f6969450e06adca5ceace8d1338a7091e1b630772c7404503ab73181228e64173d7197aafff731810efb40873cce78f7c4492380108348cb66f684046f12c5005d3aeea808d0802100e7808a9fe4e3583fbb20bb0b34ca077841c62a16724530c80001a790a21d00031d10d029e0e45c8bb827acce93b507d0d5e203cc4d11b24c91e86fef4fb53b3ab7a7697d550f8f6f49647468618bfaecf6f8f84bb4c326d47138ae73f98b4461c22df5e59a345a6c3f322cbe3239b424d05b1d8100002365297e3fb1ccb324d6d776e44feef5b780551330eda3d1d0698c1572583186d843bcaaa9117d3e13344040695fa58fe93d40bfc56dfca0b3a9d04db2a5fdebe237f7ec34944a4926388c1d26a8c09e1dab6c943cd2a27ea1a732f72479d69ed2251d373638400ceafac98d2f0c8005def0a4ca4efa90a0075341dd44ac1e70400909220e6ae1518021bf78696af0ee7a558daf7c9c90ec1a00004ee417c8606a439cc4a6a7abc02eef3fd6860600be757e4a4cab8c0cd1a6dd9257c060b087c214ea38d4c248a0000000000000000100cb1cb1881881060450010467974c2d508843a6265222da8c951a3741e4b445091383374616d31e5fb9a270aaab1dc8000426ede685c983ee5d4630c429a8001b29000b1f2060720cf2d000dac908801d86c4fcc50000000001acc1f4dfd25885ad7504a240850640638640410438067ec7151d2e50246515596fa3c889ca0f422b39894d4f57805e3f59e80d6c9091872b631f8d25e286f01f7bb1ff88bb3397e80000000000000000087ceafc9499571819a34dbb24af80c1610f8429d471a98491400000000000000002019431428e28e18a0080028cb755384873758f744c05c5af9661440116af719e31548bc4cd516185ba2279028e527690c24e617033d99f38e35720e806b36810c709ae4b597cdb01a7b9ebc1586ed5b7c58244a932913149aa2f400148cd86c4fcc50000000001acc1f4dfd25885ad7504a240850640638610440238067ec7151d2e50246515596fa3c889ca0f422b39894d4f57805dde7fad0c0c0178fd67a035b242461cad8c7e34978a1bc07deec7fe22ecce5fa000000000000000002199428e28e18811008a0028c3db432176b8c2006186cbd2de706a4d3b734ec814535a9b04be16bdac2d145b2a56857422f3f6f958b67a013828727dd3146695f4000dfc80029210ce31066928330941964a05f09065028003214f0950951f987a441998205beb1dacb4dc7e9280c101c55a04ea78d2d7040b41b6f80e8a43cc48050297c940910c3c8e40a4ec9ac85e54e9ce801cf5bffac480c244b00a5526b769fa91a01aefc4b2a63be45c9272294c2ea26208400000b74e04aa7873bb9620182747f82338cd81801c57bf7d4e9d0a05962a2d3b8a50402bbd0fac9511028023c39f9f886f288131af7f46f90280fd36e3c6df12364c216e02f343284d540c40f0000494432546190820c73d0631ec314a61883b0c30506100a0683b4a2fbf014384f44ed43433c860a21e13fbff9d0a10c65d9dd787a201074cd83ba0b84005feeb34de6b8700ede58baf0338a006a1f9b8a761455005035eb60e2b9556f941e1781838c446c67d20738b07dafa43082ca1c44f0bffd30845f0b714732c8017194d5233008520e673661c00009896788a3801400a38b21c72918e2ca2266fe15a3098d12cdcf3308f00b1b15f2c8109eb79ff3020cf31ce632000554d4a4a9c00900200002e242300611603ee55d86c61ced6bf8520962f72aec3630e76b5fc2904b18a4e10b7c11a94a17a1c078c8bc269659058e38c582680480080ae0300401a00035e73bdd78b4805540874b2166816b392cab11bc47d98ed2160acebd06a64c22d929d7a0d4c9845b22f03515264c228e1e06a2a4c98451b876861438e50c30a300aee926f04e0f062224bf9729cc8b51a35e15dc0421b89d5de99a01c33e2a7f0c2dc1c82a56fc1d8bdcf08c97828099a51cab3525fb1c544394c6a00079a43044618023ee55d86c61ced6bf8520962f72aec3630e76b5fc2904b18a4e10b7c11a94a17a1c078c8bc259248c48a288404402200a81e0dffe02b71c2100a8000e690bf2185f0efb95761b1873b5afe148258bdcabb0d8c39dad7f0a412c6293842df046a5285e8701e322f09221020e21418e094008a035ea3b6efda20fc6f6316b7cffd5f8444afd4389fef0a7ee443b238795a6a812a0d507022a0f06a43c7f79f45e4b4f4a180f7b5b3e499515790f5f743360d0924120393a696bca28853a98d2b216dd988927e058a39cc7a0008724128b608c2304505d118e14408c4d61024d3733063f903860fab3fb4390081829c509c97462820a56f95367d840217370c5eabc08200210bd5c5eb508a104f6d93104e39e4995bd1b918d0b80b161b13f314d660fa6fe92c42d6ba825000000000000000000000001dcabb0d8c39dad7f0a412c5ee55d86c61ced6bf8520963149c216f82352942f4380f191788810a0c70c30450040010403050249fbe51704a835aa8ae72cdd55ed57df0977516cc0a09553a046f8349d6ea26c625e0f5f2b0241a270353384db06b275b078830a8749653e0261c53a5e0d39cbb401d6352040280025110006e72002d9242f4f61787b91ee7c8812ca40606708d1461c3216501f279013826da3c147096e1c520e630039f67b642080010b210e702ce204a01091e90752e03640a7f91aaa1b2433f4bb3702)) <<< 16000) + 0x901cd2ac2cc2c90955be9320448200605cd8f20095a02b4d9000041cdd52001a0309402164bb68e06ded291d2c80838754d37875c50c3583b687d6d75cb14c2bdacd0189f29428294722f186d8d2c42fec5a14bb930240401fd1cf7e788f4a06122240cd0ee50040008b3086ac38e730be24821b8263091067d6381689e60e7f31c19403294b18cb8463778922142816ad50a9d524304393d199bf95782861a2e43f23c120b0a32352dc3004414000137219616c00c000d17c5459c61b322400cc0f18484bd3b37816ca2400405f77ac060e5dade21f1892c70c0b0f90dd81630b65cd41da30a141e0ef96344860865bc3d2aa142c2897b0a330a81010089eb4dda82d12005a04800022920009526071f33f72cfe9285b3489ae316f244b3c8db6602c2828792cea7f441c2098b599a72920004ff6bd34ba1003680ce37a390c0b229aeb7911040000efa875d15c62420b00a000044a400264c8005ae90bb1585d06c2e4261700b0b701ce4b48c60c94cc1be2f602f1f0823000000007c092da6f07cfcbe855b72251084891081090c508704700300004b8e008036c999ef9c97916325e57c4340a180e1614e7c50b59526d9451c41062cdb1384081ce328ba4400d17e3c4ce0001073754800028142500879a86da9b370a2d38c7135421442af1c599301404cf8eca2801cc707e46c0712fb281bf82692348a6acd2cc894914384fa078ffbd2cb0c064b9092496018543b06ba044820c000e25034ee1813885021881c207200bff1ffe9e6bb416f5e951e61973233dad965818b64dfc01e5408963a0091c4d5012a7183164045d6d9597881d3e3a31693140805a686a5008000260d27dc52800a0051038d770d802a79abc9b85a3c3cc29ec6aaae96581ccf7c380f29a272136a07130c44c19442c80600adfa2881c2e369a870a00005b8d77148012804000076c8002119f34d500d8e53669c62d55224eb9fe38b2869582698f651400b82cff4f80e25921082146791a4429ee60b31322870839cfb45c165860284a03a83c030a058206cb731060005a867b92703e85021781620718b0f4fc3d2a79ab95f01eedbf1e613f029313c8c59604d39b3b3801e532722d4c58de71309711ebb6f1164038aac370fc620705f4d7bf4111408046a1930e802000076e91c8f87d14005c05081c84e1d73b34f35d80624e461e61a45f2df5d2cb04806b68c079505aa53a3e0e269e2a8d27a16403eb89aaad103a7183272585000039386a62a4009c0400003de40011e080038690b60dd9c965588de23ecc7690b0544d2cd28d20c20c1c918a0830820032100200dbfe88ba6b1b83ad0db0920a89c61c59c49a49a41438818a0060190401006f194e2744986438b18ebf5c7e3945024035b4600e25f747c9e694692fa727828d33483b757d872f1438c23028ca9440cec0c32be7c4800039386a602890429018000102100031020740200043320024b46e7b1fe1ecd7d365a47125a88f3b02f2b02172d4e9152e576aa84e1d0508b24b20b18a18a1471010000030100200dc28ed7da35a0e25c60f35b21a90eadef2c7dc1c3a4262c5c963476e40d2ab6e20814f088c19137bd2508d1acf061f18a424102a6d14a8a0bf0808c21d43c9892181000b99608e5a13440fd89043504c5ff445d358dc1d686d8490544d2cd20c20c1c918b145084002032000200dd2c3be3c7425084920b243d09a8034871e867f9e189845352089a1d34c1dc3ed857fb2848c5826612f3df2c536b49e24a390a2099edb65f458a00008d9ed41418c4801681400008a880019a10005cc216a1a0b405059828001e60800ded99113635519f88129e0bc7ed890c06191c40850862fbd8688700400237b683003817434b81000e32b5f301b86120022e7b1fe1ecd7d365a47125a88f3b02f2b02172d4e9152e576aa84e1d0508a20a1ca1491060c30020000030100200db26844445e05586c05909f9701ea95cdb8286a0e0034e6fbb18162b370a1bd12c6900a1420859f68f5e12038832e2d240b2b4251c30dcca8b6fd0c0890080c88f4a62f7e4010006daa1c87b0b604cce81208720b0c2a3f43cb8b84c25221c4a8994c1de62a2f9b7cb1e940ff4d8b4b181b15601fa081475761eb9ccc0a0396495e04100066801d93e900050028c249da64129288200e67be1c00c1d7a9fa45898b1e22bc2476e0b18016e35e5008144e4689ef8481029048aba94c0d2fa160e500900005b8d77021200500280001f820007ae4001a5880041190b2110588482c02415e0a000a08205a2b0027b7215c2a0ad110560882ac34154120a90105400800d718853a6c298f614a7304a398521ac28c461441b0a10d85006e040f54a616e200a216d03bcbe55040cabc576e56204014351d1da9fa1c00d736563e308a01a2afd6211a4200de6a3b3beac00800299add010578a01402e842042c34486dc0ecc416ab753b41681620581d6792865965adf139b1a34c77adc7468ae83819a516031577dece500108fe8dc12001a04672e4e0844010d374c4793011a60619459a134615cd58df258c007f8a1c8d16404229d8928211804000043884580e8a045d50298c1200d467372440804cd5689044caf205d140259106014100ae4e5fde1660c2200800009d90910984f84f5b90c4acd80b551c20881551c20880ea940c0e4c000000000095672595623788fb31da42c159d7a0d4c9845b253af41a99308b645e06a2a4c98451c3c0d45499308a370ed0b0c80c60ca003009cc37f679259f6e4788df20a62a97033a538803b13b9ed87271d332509ab8)) <<< 16000) + 0x58312a4b73607c389f3e7ebe09887eee75be28fe9e4bcf94b48970049768a156a320673500047a21383b09b15d08c5b88c3962c9235edce3e7b1417a2e9687c08b2d67a4592e683842075f9af4711ee79584f9b094099bd5022e76e41ef600eb0c43004ddc9a2c69afb4e5d0c75b58802de25d198052db07949c378811c0c224a4c53b96d54a9df40b7993c9c9e7883c2e9a05712a0f94b8ac56a51fee4c48bc1f00003a7213c4b00e2104e8ef879a91f29c983806c35b94e1ae94c845458c63f26b66143705a12b9a20072ea525cc0174b1367a04e1842010e1d07286def386ad26953f8b18188550f41c502ab9857c614e9a1f7e70250c220080000869d18756c5a5468ac01c467d2854d427ed39411ed61924d001250a759a101d94b8aa70098408402000026e42300611603dd2e2b6441e058b2707749e38173af41a99308b64a75e835326116c8bc0d45499308a38781a8a93261146e1d99821220609600a002001a8cc4c103d1c2862f72a81a9229066d44b499dada43ec86167ca90210717bf8d5d450d7de6fc986541d7040f61cbb27a80019a90910dee9715b220f02d174bb874ffc0b9d7a0d4c9845b253af41a99308b645e06a2a4c98451c3c0d45499308a370ecce0cc0cb0c80c600500005c8778e13756a4c7b245a5ce3b15b029bb4a0bc1798b963f30686f86ccf3cdbf450995f80008ebd1fba5892c894a00064c4270a61362ba11b96477ab169da87354505b572ebe59f221b2e1c1c22fd951d6bb0704ae0c8c008fdc0a623c7432958c400ff0122821f39928908180367c14501343dac0b20005ad16ac50b72098e371583dda40ed9788c260e066d8d5d79b4c60921480002f02001bc2417ce6134730992984c10c25c17e367b2bb11c7100af3343a6060fba0bf93c215cffc852401827e71640943084021a6828b5ad51e34fc97cd99e20ff719810e2047b961d1e1525059428128610004000040c84b02b8554e49cda9c0c8ac1856d100816b9dfe500298f137d0c018a7a56e00128a108040000430f0b904e6c0ca0417b877d040b62c40a20230c1f00804480b034d28f7d2500f49ab9883029fbef808046203e0100000aa212a12000197211603d107f1a21b630602e78be91031626d7e28611b05f1980f0722cd3faa01288108043448afd6785183eb6ee30210374c56aa33c10de8e1a52c0406310d20094408002000020a7448ace4102207ddacef04309a5181139608814e8ee0811d14f6884a083e010089016889cce98362072fefc07c5821712b98e58084fd73542013bb1216c128410004000040484a06824c240004aa6c2a7e3c75408163a819f8400790e3a7c100ed082a510805390997800094608002000021240cc76000ba64248861221309009c0500401011e0a08e0584680c2300611603a10cf5e95c24072925d130c04c09d1fe011880f804201802008c0033c969a04051cb09a3024183e00800007c20001726c12bb6225d400b686c4f2240a88ad89a2002ee567880024142000800006d908a158168681fc07e1bbe127030e18a02bf2226044b679baa001cbe68e500120a1000420405785d2f1020a8d89401803befba08100ab4c83bb0240c2000804480a6227eb3efa07880b4222b2860cfba58b22a802055d4779600634fccb61805bb4a5c013021100424617a860f504054ca155f2183bda1aaf62304210080000559088098438480008a08001979d08748ba5f25825d1fa7c12818edfa0c4a003d69a961490108402103c36f1901ca14577d9e80d091ee6905cb06d2ec79e8a0736b9060d94108002000020040cc241060a0820504302c0009188428ce851c68d5fa1e131e6198f47081020d7ac1033399e16d4c06b6aa00881286108042055265416f0a14076e99d6904dab5d6a22c26d2e6d47a120610804000037081988c210474294462269d2057f005d985821e6ec96f2818f2b899ca002e7041808094308402142b7df765c240926ea4bc160d1b8ad55940e24bc9890120610004000035c84182820814000448419c260008fa4002ccc80070090811d00075e1080318118ae84d8049f0a49004158f40818021146377c40016e198f60c0354734644000040194f08802000024a40b4a701216b0af435d0122ef3ddda71de10501155fa79c4adeb6e1213acc6da0b2e72a2bbe2c0da231406981059fd672a916d0eef825b8e5d17345edacc5e0dddda782d26b0995924803aed6edc8544d23d43f76d440dc1f742683858573d0999acb1b1236173f83ada6e007714517c2c682047054c310c7f114f1277452707b9ea1a9fa529877ab80e49e33d923d488b1b9796889686620ff5615fe2cd6294f6848f5b65a73b819ddd7ea36609c822001c37bd17c4632a6639d2bf6921e82c37f1701573b7fc68de1bd11c1f18e859d62439f1eebd49000b6597da005221821008509fc81d9bc021101f00803f80f84ccb96a6792211dfd05ac7011e714fca1800ead7e370024142100800006f9000163200040a6efce0fc94b152fd0d9c6bf188951284645a9f74f07f7ad8a7c15286d33915580801adc862566c05b74b8ad91078173af41a99308b64a75e835326116c8bc0d45499308a38781a8a93261146e1d800000000000000000000000ee55d86c61ced6bf8520962f72aec3630e76b5fc2904b18a4e10b7c11a94a17a1c078c8bca5083823023000196a61dc515a0ceff390c9de4afb6622801e645a47646d5c374dfbc51bb56ed702cebd9d7aa2e1e38e708795034fb7e7c6e6ec30c3e3e684e879e11f6aa81aa50f5610abd4e4c9fda626)) <<< 16000) + 0x9b12f26b8e6c1d0354a6a6f34a7d9286ebebdc3f621ce54bf8551708f79f407bf31c8efa9c9ced677d40c42b850a10f4b9340020108369281ac740fc3a07d1d03e0c819c660943207b198008ad105f0100169b107a01f1bfa2e52411c169cf07f70702328b593f100438735178300b37674bb0001140141255422008000098104a5582310c11457405268a5fe065b6b0d02b523cf9080ff9ee420c0c0263a5f2c5a147aa4061a39268bbaa7ec70f606cf5dc6d57ce3a5d598803b2d66c2d58afa670aaca496b6b6cdad7ddd581e2bf46126e6f6ca88528a941377a7bb00d5299b0c9195f192da117128302dff92b916db6617ab47ca6bde9729fc63c736ca15eb437df0156bf683061ffa5b3d11d637212749af338012ebf3c45a0002056732300103908af3226376f0d2ab2f33c53294b4f4ad9455ea7cf507bf0cc6a7fd40a95413054c08f64c4805db98c0240100c17faa5032dd99f87858e90f5d85db08c1c4a807d7bb50556aa25da3567259c0121bfb1751e570b6eb76d548d65f55e165cb0fe162850c08256b509802e8ab7496480396e9eff00008048604401081a3043ddd7308a3360676904707fd2c88a00f030251c0000484842010a2a19f8b0bc98057aa720b0241842008b2fbe00db1c780393f72db08820840210080100400001110000bc20f2230440901b8281e00765f152f8701109a8e1dad6a002e722f2c3001d7e9d5500120a1080430c5edc6302090631c905fa14002c074c1812048a8f736b0090408c021a6d21333d993114c7bde508802f1c1f090230c2100840300401000004440003ac8000f5907719d15ba3485e03812b1fbe88a004b2a28c800023182100803b0080003248001ef10005a430280100400001110750100037c90742d83996c1c8b40e233959a95d966c05a79a0ee9aa03168cd61448758c5dd689ef4cbf1b21436d8722800000000000000000867ef47184e06fda95d3b9ea564a9dca956ea4750a84170061c880000000000000000022298cd6ce0d0816000000000000000000000003b95761b1873b5afe148258bdcabb0d8c39dad7f0a412c6293842df046a5285e8701e322f29639409009800000032ed133657f72685779c33a276844aa9ab775ca2188cd8a2072f3899f33be34fe0b0b75c2222f7ebcaef8ea8cda2e06b366e10028aca889776f50f10d92c6ea97f6887764bed137df62a949116e6490d90e1becfac3c61d7ca2c4e79faea69d4c4adf61f4fafb8dfa7c1f94ae99c1d883b89f9d49810eef0eb4f61613682abd0d825eab63a3f618591e08703c66b940d33addff100a9a99214000000121a1000400003ac8380481bc240dc0a0009c4345c38550a2e906e5c188d15700a8ba13fdc070d9e3546d99bc8b803ab8669b41ca3bffc3fe107fb75be04802383965160281512bf43040945ccc3a9838f213cfccc990fe08101cf78078568b2fca1640dd267bc2f65298c197d4958f51e4db43d2fabfb4776f6fc66de3ba7b8c7e95d24ec2a267ea3fb59f194c24aed314ce7a15667404270d125c8920079731632d25cf41c1607abfe4fa5ba5cc87662155e91e335f029acd61667530f6766276f2d64defd9982fa5b7507e90eb23b5af2726ee7b8402a2bb410cc284ac076a10000000010585f60297cbe109002ac552f8d8debc22a56dd708b4b4f96249766e8bfd5928f91987f98c2de4d981ab65058c44a0cb1adf0d0c04526a558e119c03095a75db48a85faeaf8a1f0635e62e7a80b72dcf47630c2f25ac73ae3c7d7375f1aab96cf642cd3a66f2a1f086a7931bc20cef1ea078d724857f64282c28031c7740404c6d3388d2869fa000159040b4c7040ab6798d0b06e2fed1050220c2200801180ec147ca408e9a047a44b4dc80089f54b64031881080400002c08368a81b0560d61a06a0d0348681a0240ce1304a09033028194140c80a06305831028184140c00300029d20be02001ffd20bc03959a95d966c0586b7218959b016d4b69cbf18f8d03cdfcbf251215ee82f2f4344d9ee8475694a80000000000000000022279a0ee9aa03168cd61448758c5dd689ef4cbf1b21436d872280000000000000000086dd2e2b6441e05a9230c110086000002280080358bb66541227e2370bde376359747bca802a5230ec0c813e22015530cd82e5fcc241f59fc55d1ea22ebcb95a90fe805b4b7a2ec6e80d928ac16fe2ef4886f57f09e44e27f123e332245493d266419ab86b156096a30afa8340017d88016ff1007852387146ed46ce597583bb74410a63d3cd43fd1b5610c91c00000000000000007c847753bd73b9935b1a0462d2dcef4ec626e8262dc65680000000000000001e10c30818608c00a002002a880005829813255f8308cd3c8d28296fd0d288d95910db6b8070ae4126f333b26148008dd7d13277c866e574777c4373acbf570b48d029ee1eb07b1e3400d9a3d0d5a0ba02000475200fee24033e20c046e94574eef070a0e079397af8a101199ddc14708121de0b252142803a5b18949f0400dbc63560460a0003faccd94210a734e92a77203654565b15210cf322158122d64855a22c80ba6aa6b948e72f1234f57b893dbb5bc28032176f66511248548000000000000000010b9d5f92932ae3033469b76495f0182c21f0853a8e3530922800000000000000004032021c2142141081000249285f5ee59f7d8e53752e8e21ccd2c78298756c04e1def06417ef1f62a95968514836c3c016d6c8dbbc6cd478b6fc2856c1078cc192e967a9ef27d1a3eb0602fc461f9cb11ec534b0c84251c35cfd97e9f92)) <<< 16000) + 0x2f31a9dd845e1c3ef72b169541a8a069e6f49082eb2af84960a824682d05c25000319905b01c072d680383860c0f06d33d86100e1de154180098a73480280066d2b9543001e5b4479840206b3e9bb00000049ce08c02101c2bdac9263064faee6cb881804684efc3020cbae3c60200e49d30740000024a684401005a0d00009b1f9ffa15ed5ac69b52c1c70ad022389a7611fa96c8e1ed351330000000000000000010c490c80c60c40450030020023389b08f65ad16f033e19e5d9a57d880d335dc06d00006c91d0bf6f0ff8905cb7a55d2bfaf23828e497b228490f4f242eecf3368fb74df077db2fbcd9db9c52913603ad2ca884a8842aee8bff1c03a3060063183db571cde8b766708009040038e0f2933379f90fab2b741008c5ef07aeb73e68bf90b8e3562400054e00110a4ef6a737ba5a3001056f53c1982f7fdc5b562489000048a8b5f238bf7cfd994d18c4200b21a00031e2000d6e4160b40ae52056050004f410354d02a9a800805852390962ac80ce5cdc79718341641e0d06062ac85be92001554192387017c0340a0180579eb64ac02710220086147a36e7a83078edd2398181f3dfdb488603984cd03824082100802a02814c0400020440ec560a42b0511581988c0e8340a01b04f0de1458d64cb38e1ae89201b51830414c282c183215ebf0148017f898f918e00eda32bb3180016f4a08a000a4e4846010c2817b999343075e53b8670a08c4f7d94e08344dab792060075b7c14000004a4844010000118209c3a04d1900016c104c0582580edc6bb81d97dc502ca8a5cffe333b238208c5d3a2857b94873600ee4ca37ff858ae78d8231bed6ad6c1a02ece7b19210d44c9440000000095bcc54420f06f99b9133ef0d52d33ef0d533c1be66e308d45044043001000040065136946d1c421281574c62b1b24288e71c95c4c10bdffdc77b8fc31b33ead7d7f38bacdadff31068edc8737028bba90f49fe1cdc99e5fbcdd238b9dbd388c9bd72a7876eb0dbf59e621c98a25403c14000a824128f6092620482502392c1186608a1bfa9a054319070ff73a844af35388b1a0000000000000003501c35e6ef6c7201f1d76180312abaff3a2b6ea47dfbaff26e7c0a1bf5e31e8e040000000000000000082c3afcc9568af82585653a0a99840a18e094012010000503a3c24d780008c50c4c79dac09a452aa3bcad709c413124651ec446246cf81b0d544dccd2b8b51900a39947e329717f1016749c4603adc99861f80e2994d55b61d41081deae25de466e1896d56293f482c9da5e70807eee7fddc5c3dfff13a06e4e08c00000003c7e7784cec1075a84616101e45d2ee1d3ff02d875f992ad15f04b0aca741543872862851422400094346c060e8cf02fe6c8baf67eb3fd210fd36c3e2104169caaa6854407b78ada7c47853cac37d9fbe143c7d30df3b6d60cc07aa31b25d5c21274791b8c1f2c1cf78891d04c5efb8710d881d2bce006ec6dd48900b2cf6b8c26082000861062152b9c60fe5673f8448eb55a94d63884086f498080a467d0f6128410004000040482202810c07e400873cde0d220e94d7407044b20863234162005ced1e003290a868a0057d9f32e04c1842010d2211e367a25102a51cb2a3060015b9ff1a0a948a34f00000e6be26404a18420100001083c39a0ce02cc60e285fdca29238aab5994450039d1b1b50e0693b11f7c0128811004000043c8001c1100061020841a86a6d8aeae02cd01507336f6fa235197efeddf5d5777f43e19100ca8b6b5600000000000000000415319ad9c1a102d875f992ad15f04b0aca741542452442021013400068af388a9635dea4bb4f87af6c6394dd7c021dab5913c95aae274b48791415f184b0247756ff14edb371b132b966da13829aaa2264eec2c4a907599d4000ff882080800385482014c0fca604633c20c1e778e730513719cca481062ff4eb428302c38f9c4c050dd04dbe2803067de1f090252083ed32002944815901015282822008408222b7fea8449a22de3c38101cc1e6531fdb13b09feaca0602b22c4db6aef5a463d14680e087e43d8a55982fc45863402025be5de67d10d2e2e57c20060222f38f7104566f04efce0000a08b7286a572eca534b0ac0653007e439eb40c50ac1b000030b207c1203d0901e028001428e080145e32165dd7404a7de61c1a5d6063c0e8947fdaa5bf06063c3002639dcaa8e47ee420c1140a16186600a9ab550198a0114dc10ffab4608d515cdc0c0037481769588c29b251118001161b8ee7f37b411ad787184012c2553f7e315b463c560d800018a103b4181996c0e8a5c7048eead20e080dcfd318305abc1d60e500f4b09343240c40b0f5e8601b73bbdd814400098d084021026f618458f71ed674312693669483fc6acada22399a71593dc86bf0f7daec981b536f56ffc66a461cc55e2cc300145fc57eac002cd08a83785d5f940cefa72159f3c44e5a456a681f7521e2d48e8c5e54823503d4bae3dd65e5ed3c7eb784f0d0a2e83925540013ffdd70b4ee9a797add485bed21f389444a1792f9089083dc59c8fabb9bc2d4f047d8998dbe2d00e9e74bb555bac2631ab80a1b588010161d4df4aecb5beffc77091b403c04671b2204b8bfeaaca878f35044a275a06f0058f942efd729b60f677e6f946e9be180039745fbda51bfe8b8f335a9a4f95f17ef54331f544e223567a8829e832857c15ee09d95a46d74d29aafc2487de601e8c5d0941204a03c737a6a853f93fa9120665de19423b105c481f380085d4265552c44def9d240982632f378f82ab5)) <<< 16000) + 0x35a6122230e2153fc1a47a97a13f60b62c103b5977121d14e48e2274bb47b2177a243174c9d20a813126d040eb2d6d54ddf708d4eeebd7a06ddc24b36bf08080080230830bb45fe602d9a6af4910256c3ea91204d5ee71e0090407c0200001aa40e4360701b03705407004011032ef0bdb92c019ddc9404811c79973c0008c707c02000016040003b480012c9036114864b00dbb83044c4c40f86019b644cc63801fdf6b34000004858400100000e7200142e4003bfc8118cf42d548fc1d0cf7f05d8fb84a94624dca4e5c897681193cc7efe0a27e7ca051fc02fb5190121247498cf2be2b0d3a041573069c230085ef2cfde72bdce094d4bcb86ca4919643395b19cf285475679b830646ce808592ab910ce03a05452791cc79a5c465f2bc34c000280ce58f313b4d0f404c09b857c3143ff0506174fa7bc7f55d552a7af5043d655bab7717d6aae9618cc0154e9077aa83b6c6946a4ab1f22e9e4a3f69e1ff56e31e52840f1ecf52c93a51c35801a8cec418831aa2199dda65bb14032a9bc4cb5109110c9ae82c62cb2df373833656ddfb183d6c5a66d081709d7975000241c2000858c4cd6a0bd8f32852684781e30e9afff22dae570db42727176a4c06844bb45d5830638ef4a57dc6031db36f84ea97fc3258b88f4354d6fbd94f4b9cad3a2a005e50103644010b4474c9bbaed67b1cb5695ddad7d73b3449266467dd53d729965cbe5c7012da0bff63d4564efd2081633390604482adc8fd9530f7be3e1d6a1735262e1c00400bd2c5aaa74503915c218e6765b62a9f62172c34d3f57bb54a457f1dc5aec060d212107ceff70af8cfe08c74ad64f9f94060c9b25761ce5db71a220e7e1b8000189480038f90350d489376f9812203d8004594380a416a73a000011941000400002e481182808814042020340100077590332d709adb93da430acb5af29050002580184201ad09d0f8000000049110800200001e440c89400416840c407403018edd649038a4d1e203800a40593a000008ca08402102801004000011102319c04c9f1f176c24b91e3886bc6da624cd714808720eeb14e743ef4a04f88ff972a9fc0328ec74ae4f5c9b65c32501d50acef53a706560c7811374c32573f8a4b4da0338e2797b70e5e49a601deef5facab044ccf07a85f265c010085888e667af6cbbe2f1da7c57ac1e05aa375cbe1970309520371ab83af52b0b1104875c818de3baa339f8019f7fc9dd09e1f3c8a0c4ef9170e5a2560f2b0630159495c8227a83d665779d687ae1b646d03ef3ed6c8bb1156ebfaf0af33ec0493a759260d8d4aaa57f5590ebe08ef32c67dd4a76849cbc7f7ddd7d68a833e3188ac27c281adae9da610379db20fc80133d97368046203e0100000aa20602a81c9e7cb70201a25ebd50008860780200000fe40bc140460a022050108080b80400118c40b4940584a02b254060040100541a0290100c8080a00402e02016010138080500404c020120100007a190a282a424f3661be5862bafa72e75c6f9f08189170b1e3c8c8c09f63042e55f47a5a4441813254414e3ad60cab9470ceb04ed8d15406fba1800408beac3917a59be60f504a178b9085c7cc05c5805188686d33b80000684137b740f80f35cedd2c997fd4432f9e85a35eaa5cb0209fde62dd30bd9e97c77237f99340597234fdb48218f21fd63c31966a96a386a6ce80f7d8b1eb4b0e8d6b8d751809bf700847b1825273b7e9252e5448120010290385137b64d638a91540200850191bcaae9132e9324d231ac213ea934c7e55489a5d15260b0d948160885d67231d7b314106a12c70e2c952fd890a4224060c30898a975c4c040e6cdae4424102000800006c10250d01202808c140440a0210101000800109080f9880789403a4a01c25502d8dcdec0efc8031a05f185e369fba27176259d439b64993d7c7f83b663dd4426232e06df2141a8816073dace5b9d41f75ccdb2d3d63d8906e87d2869ca9bb8c01ec771e491d6f99de1d5d880aa35795a266dd7dfdb18a2c33f22dcb003cb08f719c5d62b04315616e5f9b32066fd94325810b2fa40b615f924a69be24ebec07218549b3936f41165701f3e668a7a21b4f5402238c9b10155a76f019132b7a4f439bf28b985ba0975e8081ef9bb6524d3e876c4d3c67594de3192542400d86806804032020180100b8080580402a020140100980804804000d7c4003f38808988040a401e0a001b65200b166401937cc23ba9deb9dcc9ad8d0231696e77a76313741316e32b40000000000000000f2b9551c9d672df7be87fe5071fcc942d795225b02e3bb59cc000000000000000000000000000000000000000000000000006221861841c21821420c005002ba8b62dce12e6668e9a53cefe05243659d3b7343a42f7d4dbf6607ab770380aaf944a5633a68e51e59605ed906b969a3d9dea8e82ddf1afe2aac69e469dae55472759cb7defa1ff941c7f3250b5e54896c0b8eed6730000000000000000000000000000000000000000000000000018846186106085085044043041400462523460f288f661d81b6e64c03b57d53472fc1aa7d27a4286b9f27a6ce6902315000308201c03ae55472759cb7defa1ff941c7f3250b5e54896c0b8eed67300000000000000000000000000000000000000000000000000188451450c604504404600300140046c6896e97371160c243be31411ac205fe913e293d8656ceaa3cc07b3156b73885196806828000c988060c802c540142a0091100408801c4400c02005010005fc1004550018a80085400202000010042181)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 32 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case2" = "QuadHeightCover12Case2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 32 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case2 private def zz2362:"s093a"="s093a":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l14 l15 l16 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l31 l33 l35 l37 l4 l41 l42 l44 l45 l46 l51 l57 l58 l59 l62 l63 l64 l65 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3ddc75a11, -0x59514ba00, -0x579816a74,0x251f195b8], ![-0x59514ba00, -0x326d249175,0x64b38a6cc,0x52ba3aea4], ![-0x579816a74,0x64b38a6cc, -0x2439b7b835,0x597f125ee], ![0x251f195b8,0x52ba3aea4,0x597f125ee, -0x2cb417800]] noncomputable def hinges:Hinges:=[(6,l4),(0x3136beee,l8),(-0x833ca7b,l11),(-0x10679506,l10),(0x1be8020bc,l14),(0x16baf13ac,l13),(-0x2f95233f0,l12),(-0x171ce0498,l17),(0x390f54c21,l16),(0x4666492f8,l15),(0x18fae1d4,l21),(0x252a8c816,l20),(0x15e89e2b,l23),(0x1691da09e,l22),(-0x2cb417800,l27),(-0x81fa8932,l28),(0x2cb417800,l29),(-0x19528b424,l25),(-0x2aa4f7fe,l31),(0x1566bdf84,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x171a36ddc,l42),(0x875155ec,l41),(-0x518af684,l46),(0x1d72a9372,l45),(-0x2b7a382b0,l44),(0x2cb417800,l51),(-0xb376592b,l57),(-0x70938c02,l59),(0x106bf60c6,l58),(-0x9873b777,l63),(-0xa5bee440,l62),(0x2cffa2f0,l65),(0x9cce715c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x390f54c21,l16),(0x1be8020bc,l14),(-0x19528b424,l25),(-0x171ce0498,l17),(0x1566bdf84,l30),(0x252a8c816,l20),(0x4666492f8,l15),(-0xb376592b,l57),(0x1d72a9372,l45),(-0x9873b777,l63),(-0x171a36ddc,l42),(0x16baf13ac,l13),(0x1691da09e,l22),(-0x81fa8932,l28),(-0x2f95233f0,l12),(-0x70938c02,l59),(-0x2b7a382b0,l44),(-0xa5bee440,l62),(0x9cce715c,l64),(0x106bf60c6,l58),(-0x518af684,l46),(0x2cffa2f0,l65),(-0x2aa4f7fe,l31),(0x18fae1d4,l21),(0x15e89e2b,l23),(0x875155ec,l41),(0x3136beee,l8),(-0x10679506,l10),(-0x833ca7b,l11),(6,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x3b62d218202eea00c0038c5586d013d40140000001a492058601800000034924030c03000000308a20361808003a458025014c40140ed8b602380d608033ad162020404cc10070000031c538126180a072455013403b0401800718ac05e02a08028000018a2940930c05000000002a0c039804000000000014072008000010864140288018000410c41601b1004000000001c1205980400000004211024300c0000007048280a801000001d09828051003000003e150500a200600000003a14013300c00000d84414028801800001f088380d10030000000210880b18060000004108408c30100000006a10810c6020000000ec270218c040000000001c181980200000003611022300c0041861082055e80280004c0d024027d00400000461908806a00600010c3108406f40100000000000881c4010000000000110188020000841c84e06ca00800000000241807300800000000000a06400800000001f0d024c020000001882c01d98080000000000030320040000006c0980f66020000000d012006cc0400000019022035980800000000000d032004000000b8682814801000000015044054c030000a41502401ea0080000004d04803130100002684209006480200004d08c1200c900402841480840066a00c0001502705006d40100a20508220031a803000a60a209804b50050000b81403802ea00800000000026009200c00000000001206400800000001109018c0200000000001c02900400000000442c06300800000000038012401800000000012014802,0x922d0980ea0060000000084540d30080000000000c812401001812c220c09250050001825888604ca0080002584105003b4010000000000d060660080000000001501c8020001643a0b2057a00800594a286f025b401400b21440d802768028016128218c04ed00500282484218124a00a000000000084092008000510e2108152802000000002211034c0200000000361c0718040002887108401940101008e987200f4880300000331608804d00300000032220a03a00400018c571200864010000388a22201108020000821101701790040000000002c18198020000000a43103e300c0000001486201c601800000001506014c020000e62c02e03520080001e45e04408a4010000318a220812c80200000250c830089003000000261a0c05200400000cc522101e400c000000a20b00766020000001581301ecc040000a61c042029a0080000005404801b3010000000a40880d66020000000c4110320c040028248421809da00a080474c59007a4401a028e5c54802a90803c0d1cf8a90085210070000000411c81b180600000000544407300800708c104c03308028000000001a2c0cc010000000331580a180600000006a2d014300c00001a8bc2806c8018000000188a4050c030000c22a8500632008000000004814093008000388a212019880200000421082405d0030000000002418198020000000000140620080000000000c80c40100000028c410328c0400000051882015180800000006229034300c0e90b286a00cba803000ef17419c0875005,0xd0218720142008003404186900484014000340861c81508020000000148840d8c0300000000002a071004000000000585033004000015848180148018000000158480a8c0300000561204810a006000000000054062008000000b850301c8010000000001a1c0cc010000003088202718080000000000070320040000000070281260100005110c2801a100403022a614803d2200c00000006229036300c00618a209a046680280000000c844088c030000821a046066200800014c410c40964010004c06107e032080281421030c20245d006000c21101180cc200a00000642409024400c0032848046033080280003c0841a02710040000781082801e20080000002105003c30100003a0681080f0802000000008828030c030000054230880fa0060002286504401a4010000000ca08803460200000190902c0790030000000000058190020048480843024940140004890211813280200009220826026500400000000000981900200000007231036300c00001d878160288018000001cc190088c040000003084403f980800000ec340f014400c0000000000a812401000000000006c0c80100000002a44381a00200000983212035400c0000000485060680080000000000540c80100000024120a052004000000987c240640080000000001080e40100000000011c02c8030000000002280990060000000000640e20080003a87410803480200000000004403480300000642c0680f20060002486404401e4010000000ea108034602000000001609024c02,0x1a83a0621808000110350740c840100002606a0e81908020009808208401a500500008611024034a008002542102200c940140000009848281e801000000000a0603cc02000000001e0e0518040000084360a032400c00810a40920672802801041501480ce50050014222c3c00a8200a00000003c283034004006108c0c201ba8028000019098380510030000062220481f200600000044341407400800610a3104045480280006214c4201e90040000002082c01d98080000004204406b30100810618410122e803000003a1906c03500381029009200665a00f00850810900ccb401c0c188c86f819e4803000001861980d64c050000002884403f980800000000441807300800000007870a068008000001e0d090190020000078190880520060000000034240630080c188a02080560803000003d0902804d00300000781104805a00600000fc220900b400c000000e848280e8010000000000a0c0cc0100282304440049a00a00000a4320b02e400c005086105202e480280000000015c02c8030000000000520390040001845109006840100000000070501e6010000000000230188020000000002280510060000000000840620080000000001081c40100000000001d01c8020000000001f80590060000000003d013200c0000001044204e60181020c30820215d006001101b024011ba00a002183484600f74014004106308402ae80280000310c844035003000000003c260318040000000782300a300c00000000c8380a601000000001a0f014c02,0x5a0490040000000c421035300c00000016812062601800000000d05024c020000000000158190020005190121403a40101e21a3086812d280303c834c11a021a5006000000002e220698040000000a249036300c000001660c8048602000000001e09018c02000000003a0c02980400000000381c0930080000000168680e60100000000014408c80300000e4340a81aa006009190490d02fd401400000000001e0640080000000032240cc0100000000320e06980400584a0903019b401400b394722a07b680282c528520f0216d0060030650876817ca00a00001647809014400c000001222900fe60200000000002d0388020000005988405a18080000000b22202c300c00000000171a0660080000002d888070c030000000000120710040002d8711940a2401000002d8e466054801800005b1d0d00a90030000005a3a3402a0040000000b63202a300c0000000001680c40100000000000901880200000005911006180600001707235022400c00000a110204986028000000000060348020000000000f80690060000000001b025200c0000000003203a401800000000068034803000000000242819802000004082800b13014000000a60a01b660200000014415022cc040000002983e015980800000004219036300c000000b80a81166020000001043100e4c040000021c3380c9180a0000005904406b301000000810c2032460280000014c1400acc0400000214328069180a000000440d00393010000006108204986028000460841100e5004,0xc4110500fa00600001703c0900a400c0000012c0c802460200000001c8a4058c0300000003b0481a18060000000720b034300c000000010868126010000001444100a0c0400000028882054180800000000d4740a300800000000b02812601000006a0882807d0030000000001880e900600000001047c0a300800000000d0681260100000000170901cc02000000621e0a0320040000000007850330040000000001081a40100000000010408c803000000002e1a069804000000d107c0b830100000001a416038601800000000a0702cc02002cc14c1a80aaa00a000000b128402a30102021c30a6812d2803000000000009024802000000001a1204980400000000d8480730080000000168c81a6010000002d191103500200000000524a051804000000a3064024301000001d8cc380688018000001c46500b0c04000000008a3e05180400000000d43c053008000489061c00d080202c12520e101c89006002c648866817ca00a0000000000a40e20080000000c4520446018000831905401e9004000102318a604d20080000000000a4062008005186108207aa802800a80c20bc0241005000000288820361808000005688100d83014000000aa2280d8602000001622140360c05002824847180cda00a0051c938f503db40141429228e7810b680300000491d03408900300000843b0880fa0060000184843f025400c00c090c102013c802800000254110068c04000000000543819802000398a60e80f740100000310841a06a801800000000005024802,0xc81e900600000000019015200c0000000003803a401800000001d19028c020000000000088190020000000000880520080000000007801640180000000001a0148020000000000360310040000000003500a200c0000006812807260200000000001a01c8020000000001b80990060000000000640b20080000000006a01640180000000068004c804000000002c240398040000005212001330100000000b04202660180000001609c04cc03000000002c220298040000000002c009200c0000000006c012401800000019024030c030000000320580e180600000006e1100b300c00000000d0480c60100000000190901cc02000000034088071806000006804100263014000000d410802c60200009910c3802bd0040000000004c3819802000000008828053008000448661400be802000000001f07014c020000000290c80b18060001f82307405a40100000000c41e02a601800000190130214c040000d61282403aa0080000000321100f300c0000006611815c6020000000198240d4c030000000310500a98060000003108408e30100005a8c622015e802000000002d11028c0200014a2986802fa008000000009c2c0a3008009788609a02a88028000002047100a8c0400000000004806900600001443a16026400c0000000050380c60100008111015028900400000002224181a0020000000000740620080000000002e01a40180000000004c0948030000fe1d04803d20080000000001101d200c0000000002401a4018000000000e408c803,0x186258318145a00a0000000000440920080000000a44202c601800a50ce11405f5005001621c828814ea00a00000000443c0530080000000000780a40100000001282402cc030000000220480718060000004804401630100000009c08802c60200000250982402d0030000000000f00490060000008478640a40080000208ec6404c8018000b218c5301210040000000110480798060000002304c0ae30100000004208811c602000f208a0b406310050000001283a06318080001d8250740cc40100000000150a80a60100000000002502480200000000004c0290040000000004400b200c0000000000f00a40100000000001f0188020000000001e80510060000000000740e2008000000000b80704020000000000240308030000000002603c1008000000000540182010000000000880b04020000000000290248020000000000540290040000000004d013200c0000000009801640180000000013c02c80300000000004a0390040000000001401d200c0000000002202a4018000000000440f48030000000000980690060000000000c4092008000000000032064008000000000320148020000000002e80990060000000005c00b200c000000000be01640180000000002d01c8020000000001680f900600000000029017200c0000000001a8124010000000000360148020000000003280990060000000006400b200c000000000ce01640180000000003101c80200000000000b8190020000000000b8052008000000000aa02640180000000015002c803,0xd817900600000000019027200c00000000882812601001422461200df5005051449e116060ea00c00000000003407200800000108e86816801000e218609406f10050000ec3482205f200800000000009c0620080000000009a01440180000000002501880200000000004a0710040000000561902d300c0000000000281c4010000731704302ad004001c22ac41813a200a00000006229016300c00808a108605968028000811442302ed004], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((0x79ccceea20f9036be2ed6499e49803df2fc3c801d534eaa80a05f775650d00014d40da130211804207a5d7d7d40bc89d0819a13b112050ce7cd652468121f6f032ab3221861dddb314e8820be3194ea41c0008fa8ce6b0080021f80fe82e440015010207ad973218144ea836273fc81c03b3f702d328016e36002648000000024093b27fcbf488c1e227c9d110090fd7a5a50004601000019a200071a484c0642403bb38152d40000000006ac02fb8d0d24252240902c02244d38d3cc38c3ca2493c40b840080340582442212000154388a140088d0a4f49634293d25e2ce4dd88225e3be14024aef113b0766d3b72577889c0848d3102ce2cd2cd1cc00b00420fed564f21f3ec84380df5fa4bd6361d8e3202457289ef0f34bdaf8111f0abd02d0a34dcab8a509094000b1ce1632274f65d107940cdc8e6b63e695454369fb0fe6146d92655cf2260a34a56c1764c6842fa5729fa727800960ccd8d32480085a8847ed4f690085805021005107828748143a20a1d00500012a1b2966aaf41ea5b3890b21181ef1a8c27b1428d5630a2c53f734a35a648b106174c298ee53012a2fe77f36d8e00f0d0960f3d2200026b10bafcd1b104021701a08381441a0a1cf050e7028734143980200027c210833d203e7707d25721322591206a667089bec072886edc982bf4da9bc9421e45adf011a26280d0c017d89ccfb0169c38601d93d1d270c83824012b2d77e597b3f8801b1adc693dc07cba58c3d8fb3afe9f874fab0e967243d06c00016291d119e0e008f04272e800143fd3efef6ed642c48f22a7ff67ff5501810b9f5da876d41c485111671b825931140955fcd31a6a8b848000909ea2961558069af10d16e504b8fe707103605410608882c443ce1a20a091048488201440e0a0002d323fa13b182a9a13ae6dc48d413ea798c34206c9db775f0520c2837b231ca990808a57e15cc150582154d09d60de14003e626ff49a0801105e6a830180607e7cc37112a8a8bbdd51cda0625220d0b40c00004ce4614b63085b182118c080f093e69a8f6abf0e221f86885ebce2964b566540f363bdbc1090d517a4b94e1633ae7ffa8ecdde68f15dfdec9d47060d9cfc2fb2ccbb8b4b9478149a51004637bf773fe52b716dfce6e583a9356176e43421dd404f5397843fa007d43548af2877ef346ad0b2d0613c59532ca0d677ed03efb4bf249692b62e378499378b65c99491b44c1861c3b5b0b205ea5bbd31d5d5d453afe99e3bca537c74878dea13cdcceeb650c7dbf30a2ae0f5ca8844712612592204500480849d009b7dc007e497ea2b97b2d22d659b1740413f8fa50fee53be4319b6307c5330c1752aac35428587614d7831c498a91296fea04b73f9498d2b0f11127d80e2419bdab6770624c12868001f512061de905a58dabb9e3012a2891628a9c86964344092727b0458d9476689ce2d325103fc541248f1cbfb9e38654bbb041a20c46c16c06f71b26ecd5fc83d3b05097ea47ba1509fc5010b59f836abc0609311798af60b2217c5fd5236a54c00be491564a7c137b4114b2e456ad183d19b82db1cb077197270476fb280d7be1ea33faf86cc82d98b1b84d0000874480827a9) <<< 16000) + 0x6ef4c75757514ebfa678ef294df1d21e37a84f3733bad9431f6fcc28ab83d72a2109839439239818a002022a909b6c84bb86b6501fdce0021f749d25ecd71320c4d48f3beaf6fb832154f3b1efd9937d78d83b7ac5dec487371358e1ebca9f855be3a9ab56a01aad3a81ed616e566c53597e5f94c6081358726864ef6f8918634aa22e80021110b235c0818b264000000000572a9f76896a914505048260e50e48e4863025010a0c8aa56609a3c57bd756caacb0aa9baf1fd09f46e1aae84f6a2f8a69290a3f0fb5faa39addeafac60d82858103164c8000000000ae553eed12d5228a0a09352dde98eaeaea29d7f4cf1de529be3a43c6f509e6e6775b2863edf98515707ae5442230724724530318114045525cd036484c17af13971499dfc70982f4b65d57f2858b6c60b1ad07ff70231189a487619253765cee3837685ac4f43099e51ca75789e119664c6cb4e94f15e6c71f502bf1267e019819bef9a9790be4490b6be39e2d596c61dc67d0004dc240a5a046110003b410b6411022080062908fe82f114280111a149e92c68527a4bc59c9bb1044e90b7dbc14cff678f7170f7ffae1473bc10ea5bbd31d5d5d453afe99e3bca537c74878dea13cdcceeb650c7dbf30a2ae0f5ca884671261259248a2800287177adb6e4567304920acacc2042a9ac45e1a94e6d63fedad18e33e35642fec40ea8417d9adf2ee70f99a25d2859f90d20490c2db144807b1b3a6a6514c9ce80bf835801781463cc959296b3f7f496b9917b6d30c54fc249229f28815671d2deb3c0ec684f8f3981f6048d4a4a4e845c30e1dad85902f52dde98eaeaea29d7f4cf1de529be3a43c6f509e6e6775b2863edf98515707ae544223893092c928024040db7f634824df3b1331555fb1c5e0c55a448a22bfb41abf48ede57680576808d596c8fe4bf83027b87cbf6d62f7b3d0ac6428abf58b55f2532762d3e926b20207090ee06b1d1c2c90c9c3c455d49b45f0be768c354460ab06e96162925d93540012189018eec816dfb6a4de0a61ce0723cad7fd66035a2b7cc748853b02ba4b11b81d328611a10bcc6210843254781447c5a7f6ca77e71f01f34d4f104192c8a11034c8f5b2d3b0a9f8f07e6fc1eae6142a3c6d65054c295481166107974e30d6bf3cd81fe1d84d2a93861f5cf3bc7e56c2de1c93ab5478c6e2742c537d7352b42d682a076b74053c888324b6b2d81da59fce4022a2a4d7e5610daf375120e226c1d2e885bca796b96e156940e7c42f5634a506d2be2cd8a8e502a301c7aa53c074d1c2b13e4a5ffe1f16d34b5b0235ed7f43892408d80e39b0932cbff0387503d19c71af12355c06105cdd6d029e75950171913602fdbd292bd39a1bea8cd1addd86c7ebcb54c3453087dc7aef8b1543dc5354047f2d0bbad3c6a075f53d6738e32d4148000047f920209ea5bbd31d5d5d453afe99e3bca537c74878dea13cdcceeb650c7dbf30a2ae0f5ca884260e50e48e3864002800808aa4f35def8cd2aca9e49be263405c0ce76a819efa23151223fdc25ebd50ac098fab235badfafb26e925a631da2fc54f910271c182074ed1585974f6ef8e3b141cd2b88da00071c42c8d783c0eeada8c18e871647319cd023384ed1438aec37976f3ea1d93147c767f2e2c19923e11370cdce19521a7feb2debafd36688e199a33490c0df66114a5adeed23abe4f8c0a2d7f7c3e735d1616a3b5d18d193080a2a8046c993c488c87e560b902cbf310276493ed8ec098f5d4dc3fd9ea1960908f6c4f94f40433fe7e42f4a75924c0ad0c948019095add1766260ef4985307c16c7d6c0d46ca67cae4ce0ecda76f2577889c045861c3b5b0b205ea5bbd31d5d5d453afe99e3bca537c74878dea13cdcceeb650c7dbf30a2ae0f5ca884660e50e48e2808aa125e1797ac0c33c9aa96635353eae582cbf3950d422d744ed9f877b156f58ae713791165855971e934f1b825e0b83abcb6ef6eee24836c0590c319f6e86733c1c354434f2f3b90aaa449c77c4d9263a33431bb6ddad8a7f2c81d3f9742f4cc9bac582af5e8f070060c5183e3fb2c52803235a28ef1ce5b909ca3356dd344310038680031412012d100088002c6cc5d9e23ee8cac76c672cb22a9ac400dbabcf97c7b6efe6fea9f5fa000000000000000000122ac3dab62db988b0450620f3ce208e5b4e4a93b9dc2a595f1dcb40000000000000000004621c51441421000c001540de7470ead4ba905c87d0429f1eb467140c6e98db8dd6c01bd048294a0e5e8aaf3cdd1a713c51249e5ab5859609755b8e6a04a17e4f847e40177e2670b3d6c873ea47a5da5312ee2c9351fa9c9cc96af57abb711be1f39e6730000a02470db20bdc149b8eed07a1e5fdf881727ffb198c2106d95d1a64dec2ee485b7def5a109332033a1c77290ae22162308a1cc52e7d237c10995863eb19c994d4e519a0ce1a0b20d848808001f24802a287fd143fc02002af623760b8103164c8000000000ae553eed12d5228a0a092ece054b50000000001ab00bee343490948902422462061432c220224051505f7fc4754c369a63a6d071dc47f21b94eaf2131443919bca297d07f2ee4008568f63a6f8b8c49a547c62cb024ad101ff4b5610175b88fced4e805ea5bbd31d5d5d453afe99e3bca537c74878dea13cdcceeb650c7dbf30a2ae0f5ca884658e40c408186584200a2fe74aaa93adf1b181f56c8fb4a17dcd368f6a9e30ac01a2c16052d2ef12e883a15fbf0f4401b119ba65e433c79603eb166294f4000db4c0818b264000000000572a9f76896a914505048258c48)) <<< 16000) + 0xc40c2864044813254e36507771f0a445b534381012aa05b74fd74c679662fda7bfcdf8c4ca43b4dedc3dd640774fa1ec58e0295d4b77a63ababa8a75fd33c7794a6f8e90f1bd4279b99dd6ca18fb7e61455c1eb951084b18818b08904504401553c5cf889e736b4b199d59969cc956568d8e62fdc6e7d80679d3393e3ec8bc466d1aeb36548e41c7bf4d969a679650dd416fca894529e25dee54474f00b5395bf1b218e28a3958e17318668d37cf95b545edd710a59962cb024280021a900069f23fa0b8103164c8000000000ae553eed12d5228a0a090491061060870430440030145016d5706db3363ff08aef683dab819e5fe2752886d6dd2209b82bee3c6cfa2ee9f626fb0fbe43b32dc39c390a740009988fe1e87ecf410c721b8390db8e81143436c120010643c24477b21889b3a43d100670ddaeca03de440a492ae968a35c5b905d398ef7c2ae870908138c3aca6c8f6448142313386bb76e3ab05009068b4ae36ac4d511944b17afdda89a65450b84e304ebbf69968deb2d4fd2175f5e40403b96d0499a6d98c33223cc90da7a4380f03f479fca7e2c6d52dfb965f75de05204afa0821ac0cf22b9702d30dae4a3fe5643d31907c18941858085b3ea70d72086000009c06079b56844360c0b5669b76302822bcc26538060af1eee2d603007faf0d4980a069895544042009a78335d2022aa02500fcf3efc23f515f75110a0c3b01300800007f08fd2e87e5743f0ab1f7358231ac7d8c63ea1b1f4050f980a0622610c0c440e384eb4d8e1fac9060a3ca6d9d9a628a10d819128378e2011e87249be9664008b62df5cf5ac7011e458d614988a005aa083bd2eb515141140c2a160234cb5be50905e060e312474b75508b288f02df9fecc20d71a5f2d80b202abec4c7b4b10122f2464b0c0240552554787000026259e228e0050028e303943905d0e2cc878e3514b2880eab488cc25fea8f0760c23aa2828284b20632dbdae0800174742a8a700240080000b89fd36114938c6411edd1e5c014a08c4d2cb20b1ca1c714d00900101c020080340003e88c582c7c8163e20b1bc05fe9b08a49c63208f6e8f2e00a5046261450e58c50c484400180a7f9fd65a7fc8598c7c85103ddc927cff396232a8bb618718641268000d211f00581382ec92d71d4ee54848cee9562b5124a140091e97cd4122da6cabfc3c32021ce482d2a78402bb7c9002b40304033958b37c0800712e8981f450189bbf13ac48a664121581000008708f786c7b8363da0381213e2587230f1c40888e74d7ac450c069127f759a1020c685b98a56470500272860d8a2802a0cdca1fef5401c7f7880a00847c70be395018409c51768c8be23131a1701600008a882318c2885614003b271bed30f4ac0245c0d14fd20d20810358f94ee690144012ddb68a978b08047fa36b63e1020b4aa65821003010222a3ecebe50071584c6e6c2440093579d9d52e03a839e17016286ca49784ac506305098fd1c0b5c2245053b7d10301e1850de49fe7c8a4301462cce6c15ca24035006892798e10043c091e41f86404fa53fc64b2e4401ded976b0fbd821ec7343003840818b264572a9f76896a914505048250c48c48a38a30628600084a7bf0926bfdc6d8191000a74fcaace9cd10c26a0002e4426ce60007da6040c59322b954fbb44b548a28282412882042830822801405037f60362e5118ba7d0c11765944aa01104dce428add8bd9b704be1b03e023316327c158eaa122f8b203589f40008a0800442900140823d87b1eb2d8f50ce040c59322b954fbb44b548a282824134b3072c73062c628018020774fcdd8851d3dd05a38b5b76349b1d06c008fc92f4f60e10da275a7fd9461f4d9695f259514b9ffb7f271b9411991f87fe7d365a57c965452e7fe154b69ad0468a9eca0ea0ce63e1072120a99c61a41a39838e002044613a0450d63cece4ea0315e403616c19e7e2c67147d7a6d22284c8589aa8cb510ad6a0900a4ddac0604b0256f9bb3f61b6fe71642e8eff666946cca9fdf0713dd4fc128e691f2aff09b038275db0acdc5000a56ec5d3380120043cdebe05d2d538b4c9247f5b34a34fa2eadc389f5a3a5fe6348c9923533d38650a8062581c0361b869ef9c00900200002e24000bf480032a91e90dc91a15a11a302d153d941d419cc7c20e42415230a2c92c82c62851000c004070080200d1e80104b80879c040002b46c96cf8d08065e0594441250c6679a634a16e250efe0c918048a0ac0f4f15637d284013e8d24f13ac92228a47363bdf72880413d641e0b7b5e10007da04ca7eb940400b550e3fcbee1313a04821a824021c043cc0208801044808000b4084608f02ac7e8d2d83c40ee08c3c3a0c84007a97c2cc1c983a9d1000000000000000004112471452442432031c21800404c04008034794143c8021e3010c3008788040003fa4784763c00b1df058ef02c7740702062c9915caa7dda25aa4514141209a59a41841839228a08e01951a49367a03c3513be4ae5073ea3c80550e32a269af207086b132d3feca30fa6cb4af92ca8a5cffdbf938dca08c4f34e24d24e20d20c00800102308089299d7f747bf354b39298d4dc50a368bf19be01ec4023589d60703fd8c9868f3674f6a0c3a79487279c14038a66f5f351e1e48cd4f22978e24f5136e5b258e239f50fce2c0022d72396d0004a010f36b9d31d52479489bfce0e83c90a2ed521f9c4d945faef74b1c35cb59bae386687b0b91620000bbdbf31ce004a010000178200067a40014b4c54f6507506731f0839090544d2cc28c1cb1c)) <<< 16000) + 0xc18b18a043001032000200d1dc0104600876c0400025c70a7aaea6e2d0219cb276d02c15331abf2c6e3df1e240f9be8a1921e3e0486ca3d2c50c0c9e63573084a15c1738561ca4742410756077b48dbb020029a5035434e460400f346cfe7400a348004801b0260768043b2021d8010eb808000b608de08e880a967028e430c08dac3d1c0a14d06c855e5922dbb6c0a4f72843ce3faf8d0488c10d08d80880d7ff4c0d890c1154a5a22831c00022550ca064821380806e8141a0020cf01067008334040004b24758763aa0b1d4058e982e040c59322b954fbb44b548a28282413cd3cc3ca3892c7181240281721db3f4d8c5384b99e62c2df71a20b2214769aa213a1c21b44db4ffb28c3e9b2d2be4b2a2973ff6fe4e372823323f0ffcfa6cb4af92ca8a5cffc2a96d35a08d153d941d419cc7c20e42415344f40b3ca30828004092fc08a85792ed6299183d08c44d0a1ffc5d931d5e77a86efe2f3cd9163e56483ddc47c44b3787ec09564759202112e089f44f99b35927ca26301eb748c1030967bb80d4816ef5a849da349114515a9e9018e9a19ae04d0008b5c8e5b40012804227ce58b5e65113823d7f1fac898b22f3588a40ba51ce16241a4895c788d3880d103f9493e300063e2ef339c00940200002f24000cf88003451f368f554ccb2a8258e33bb11bc80a56770e2c0843e0a49bdff4e27b7ed49365b8014d246192a176c9be58d234b2e336db8a1382003106ad0bc2ec481004310043ca4a2f7d0901000700a81d2010e88087400400052678c5f2096e5c67cb4d2fafe15475bf174348fa8579b3d441e0c213675974cf5c0a3076bc6819f52f2e891434e9db73db02e2c3078bafec8574403003e8e8d3b76de004005d6e5ca96c19f60004801b026073c0439c021cd010e6008000b608e58ac7280713c0c192a8648206a61248acb6a40bc9db14a2eba79697097e40ed4f2a12558836771840999130283f1015cd1c98f26450030acde1b470132705de6256c4041581029ff65187d365a57c965452e7fedfc9c6e50468a9eca0ea0ce63e1072120a92482262058a11e01600205e52e80e1e59962aedd585302f58677f3f74f711f05d41392575a72ad48782f1bb9c124875b344f4f7dba82920fdc11b13a48f095991856a46b367619a3d132453d683707140cba6068a1831c037f7d01c00116b91cb6800250084d113c9e7e2c2484b64036ced23c2be7c8a0891abb7aa6a2044c9ead9315a9c5069d85b54460cb967ade2f3801280400005e480019f10005ce3153d941d419cc7c20e42415140e3cd3cc3ca3892c7341300080c8000803472404120021c8010000971f3586504329c30e20e32a87e2667c35170e26fdfa748f38f84cd24db7a3b9704eeecd213bb4fb0efc4f10a180cf926a1ce74d4c1016a30fc5905cc04002eeae9ec99268010030becf37ce89aa88001200700a81c7010e300871404388020002ec210c2b89e973baff668240d37dc9c52c04a05c1bb7ad0489cf2c04340cb0254794d3507fffcd40c1a003657c2f61c002baf57f6018a00244c246cb08016e063744aba0480c2d02853feca30fa6cb4af92ca8a5cffdbf938dca08cc8fc3ff3e9b2d2be4b2a2973ff0aa5b4d6823249044f44c40b1023c02c02930bce57d5a2197228affe6473374bdf6c598b06fdb1cd197bd580202384408c969ff65187d365a57c965452e7fedfc9c6e50468a9eca0ea0ce63e1072120a9268a48247a46a261c50a1a60180401006cd13982a9196a483d2705e43523c4d112d23e91ad69eb4a3944c8ccda2ae61c5034eb83d5c50de4b7480ba4e084a01000017b200062240016e4c54f6507506731f0839090545038f34f28e28e24d04204c00100c8200803472404120021c801000098192342b423460589e69c61c49a49a41820809600801904010068e38087180438a021c40100008e9000a7c2002de878c08ea62dc664716768df03ef18e26065688aa409a488426b067fd34890f5bd54dd850c15ba7a59694505f4a0c83b4410008c9e0fdd060375449d7c6d3901056040a7fd9461f4d9695f259514b9ffb7f271b9411991f87fe7d365a57c965452e7fe154b69ad046481c79a7947126804800811241a091872397c02d6aff4be2b7988cd35334f3ddbab73094542e70e33e0704881aec4f10489be0d2074ff65060bd02d60cf04fc27966f87058a53ca6b3ab31b718407ba57f89070c5bebaf096600045ae472da0009402103aa4e5e200281a11db62d6e40b4f99853899e581c75ba180f2aa0926d0806101ef8dc7741c34a42654b44e004a010000179200067c40017c8c91a15a11a302d153d941d419cc7c20e42415238c34b3483083473072c1040c000080344fc04386021c2010000ac1d2d7de1694f3392cc2bcbe316a957174c1f5ffa443d54764b1e013120cd9e9a8c18416c9a75d419cb1922f47b7f29a5081036f3c3e000984a081e2ebfb215d102003e8e8d3b76de36001200680881c1010e0008350041a6020002c4237e2a1be010de8080032b08de0ee8829c57eb0b618603b07c42102852ad76528652459a98e4f4b92843bae925c1f2444279a2df19203420732078918222e75f98ed1c0001c9c35300029228500281ba1106806833c3419c1a0cd0d000135900348e2164630042c9302062c9915caa7dda25aa4514141209851631431428809200a0128e400c7dc7036e8e9199730d42d5fc23e7aac521a14d701c21b84fb91f87fe7d365a57c965452e7fe154b69ad0468a9eca0ea0ce63e1072120a91a59849839631400c002042eec5204e)) <<< 16000) + 0x073211ca3de181a607bbdc1f76e83442d85af7569310c451af401c12286dbc670d73733b9a5a5905bf1f9a55c9324b501a4668831687984031669445183edb7411cb8c1b0726585f920022d72396d00048010e33b809e8f84d2c3d9c60f50d2bc8ad4f4acc24077ba19f0d238bd857038c1f11bf5f28060e74c0d9cc6700240080000b8900032d2000b586c947a2e204046c5110d995dd92198a1c71ebd2eed10942af09ce0a515b245277e7a5718fc488b233c19c459860c104549a8a79820044ac0c87d3afa10005e058072010dd8086e804000482688589416119923bcbf76f25c91893c82cb084891596af3ef2042907d1f771019d515e5624704118e5ec8c080174ced828a00094020194021b901065808330040003fa425c472380e94c908081b72a9634ce406660df07a11c3a5cd03d10101097b7cd7c4708016e35e502020e45b067d1400016e35dc14021280406e01436e021b6010228082180400042846d4760243a1b4050d98286c814362021b00100076111af390d71286b444358221ab0d0d50086a40400c2fa46a17634ebb046598d32ac695463485b1a31988c0ac688563421b810650079ba6948c244b5433fd1ef14435bde6d71ccc20619d9e192155c80234444122cd80a03a8180e3926808039c14a3ca1d4208022f6c46b1a8c2442409b4e5a84a00a22201a851bcd4370a500ef85e068c1750b874343045f8802fb49040f044ffe3c005ae8c870d0060513522280559ee50a898108802186566218b9a30b1d227e71a60a5d5c4c1bcc128ad3d2e1920211804000037c8d000c67c0761ceb5d54b31f731cc81d77540a178c0bcae3681643780ff55254f977d96f23342ed7266073d649e197101987f5e5ee65558986f066a704e84879a17daf79adec5182db71df24f8d66e5875ec0ea1c5363712368801dd46a01f50acb8d0645bff3a9a241793f9a5898d1e8194c56dbe42beabb7f86546e1540c509706a5060934847be3bbbd55d24b6b50f6e3f8df5ed4be7a7bb3cd55ef55a37801b0b336e81eee1208a312eb3c3486f83bd85ca035e38af27686d15efb8f6626c858eae7a4fcf13596df8d21db1ec5c55a64f7432cc8933d3c4f55122246b42832b3c4d412a2aeade48b7fd5db87d893304f84e28ad85d6be67cc4511250000f88462c3633c1b19d01ea4f324f003e332599d6afb06a10ebda776a4ccaf694140000000000000000f55619fcfd55619fcfd3ac198ad680000000000258015d59524702d153d941d419cc7c20e4241542821c2142140100129243c2e3325c36986f21c904d912928ba40a03f50d9e68726ea4a5af13e78fa905c294657dcd6ed69d5a129c9c00cf0dc240ac5c8c541590c95c0a708f36b7f28f61ca90891f740012b48ce02c66c16334038a9eca0ea0ce63e1072120aa34efa8f54c5cfc35366547949e72e3fab3bb8bee1a687b54825c4d2611e464863884438e304482600280180085a1cfe331d12d4adcd93493c8fd743c8799f77132fc02c97851a5320c67319a8794f0b90adeb89cc8c2cc7407f21a0c12182a96d05205634b2c11c695cad0b64f4fc05660053c20226b4d997b186896140011188091ac26cc433253198298cb92c6584632a23194118c980c648060fa03e35666395cd1c62ab20dd0ce16913e4b272c5253e44d7cb100cd365c344026958fc34c00a2be8f5009c2088021c3a938c24cc70b79cb38d0162814451fe630aa11dbad904810440100000dd23220319001d3feca30fa6cb4af92ca8a5cffdbf938dca08e0057565491c0b22873442843001801000312a32e8ead6e708bef74316a932f8392772d7d55981b204155dd620776746af4ba4064d43fe5e1003d181851e85ca000524462c362861b18f01c8623950b3305805819b5380ac88a278c0ad7e9b4cfb5a32fc33d60435c6d0716001f4512ecdec1723eca9ddb6d89a81800605f8811d623ac3fa30926ca075c28011da7da143f31ac952be3c9854a980032b661c34507e883807f6a436399032567c4ed3ea849f8616e9b3713864718029047bdb51b364d18a48e62880003e3231c0b17c058c680ec562e90661aa6feae18e161010ed2684c571967ee34f00b06041aa991c8db21c3c2e838018da407792ed68b35747140136fb1d82ba23f086a8f880139544d4061982a01e640042e887e889a7ef7c0d8c84819df058e322433cf164092af04aa07ca0881747c0c1f68da8ad72018d1442f000071245e0462ee23d12a218a0ab76f44b49d997ef56a8fe8495e7b12583df0cdae6c98e6ab81a0f23240bc39f5a23404e229092daeac785a2fdbee875435378e371270594207b16a12a40ead214166d25e116d87fbd29f84167610c34f4d803d612ad1a5b38adc3d1192644f794436f45ab721833b545c2dbcf5ff63f6966d440304c2efae8cd901babf0437e5ffef15c4f5c55e5c301662e69633f90de424d895af86ea23ccdad2c863deea842b82a21952abfc0eb413610d00b6802ad66a03a9f28ed5f3676251c0e07f2bcb0052ec2441360ae73a2bd78b9a78d2761759509aad593e445329c045c291da80f5edce1b121acc9ebaa6703773b81212a2db0fb6275c21e01285e0335d39eabaacab72e9d0762c40d63ba8925fcfe69f31e2780504eebefc5a32ce9b0074e0c2311d36c80c600f44d2b190a7ba389ff53c96329d86250011004628411cf8c6061e60a28363e812bd2dd10e7e0dc40029bc0ed9eaa28f303572ceb5c7d7498b76af18005e4c3293790fb3db262b815d09f9f3b67b0040059c64cfb75f729de9ac31cc57aba04aa02e)) <<< 16000) + 0x0132cb1761c6e50b8824629d0bdb8df480300928a0f241a78b04c632e1a25b51d128a480de00010d08c588c50c4631423c0ee84eeeac6a2ff98e2a4b908083d4dcca2a115ef2ea7c24338c5a55fea917384fead7e3183b947f8446068dec2470b0156e4464f5cc8ba489b767d7da34e5d2167ad46b3d2121800ea1563aab4448bc7ffb1b0f5dea049d5c66f8ee8f1580a24ba4d8565222c95a5e2a1ab081c42d11853a162429833baffbb08bccf9ab0a27290d269a31729894f055496640b542b69fa07d3ec75733bb5b84b6947fa4f31092c8920000a3e46243762f415307176d63a60da275c59cae61f60400202543929764aa86fa681f9f37316ccf3a63303800db7adf52d9a5902367f2fda6d714439280500fe97a8c6b2a0584c20d91331e1d5195d980803c0f4d771285d4f75ae561656059221c8d8049ff73b2ca51c091f7ed9f2cf4b262254f4b206ef4fb75db445f4c39378f5809f3a196a680a81de27a9af47788acf5e85a160a59163580004a92228631881180284c61c160030a646191630a6b184358c198c608563020bf158fc267362c500ccd02ccf06b1d60b97008c40880215c9199a536c25ae55c9199a536c25ae2dec61ca9274a7dc6dec61ca9274a7dc8203a5c3cb74b8016e2601c00aeaca9238160c6f43b999ceab1e1e1030a9bc673aac78611a9e29629e09000126f4f17f886494bc04793445bfafe8804cb53d3bf4e26bb5a7e0f7bc9d73c7d1a7b21be7492555cf49faa4a5dbe4c16c3223d14110b473aa015399c62bf3d411093aa8002391180118bf80feb606a366e0cd33a77d6c0d46b2577889c02368b02a8363a1f7610cd840f113e32c3cfb0c442e7a5b6e300000000000000000fc18de8773339d563c3c20615378ce7558f0c23d4b77a63ababa8a75fd33c7794a6f8e90f1bd4279b99dd6ca18fb7e61455c1eb951090f14a1451420401154d73dd5c853ba237407f4cc932a9fb176edfc4517140ae1f6245221f41bbab5c09ed1003de5bf6897ba3097df88c9689d6027f2c92a053536cf6f65f7b9a630a06f25bce964df7ce024f7bab1788db6c9922e97b97a568250273914ec654fb02bfb9b7c989c66e798a38dc2e36f8a62cc8639ea97d1c8ed4cddc0d114d3b1976cf4aaa8e0a5e1039c79685055fd60b5c9199a536c25ae55c9199a536c25ae2dec61ca9274a7dc6dec61ca9274a7dc82029ff65187d365a57c965452e7fedfc9c6e50460c6f43b999ceab1e1e1030a9bc673aac7861199e2962981120100080075ee8f636ae6b1b74fb95cd532755d2c9a6f73fa2efb5d04d718088b24fbbc2e57d5f099ae726e0921575f10331bef85d6e1f109758e20380c14c25451c3b3b68946258ce618d401854a90da0009c8401464001a2a4210762fc0bd16920ad4923ac3fe17e857bef2a68d957deb812fa9cbeaea12edc000000000000000000242f7a378e0a6cae0ec750c40a6da29c85a3eb5026004d8058eaf000000000000000000884686506406204100080003c1af810e38faed2c3ed0a849de478bdede585c0b000f4bda9b31559810b999fa929563e07074573bf208136d93a9d0ca8ddbae3bbcf2faf416e2e026c4ccf4ece43d9d4c68b857873063902849226d3da1768a69aa7b04a8adad8da2152505649c83e05c15e84a908e0a420dfac28d6293044680031a9c0a7d59e0bc559ee1359008ca2006619b52d35fca6bad9ff1334e1e10000fe2a31bbb82278fbc476acbe6191f29e02cf91f1c70fb985d0804004a227ee61f6b88f42769fdfe6d0edd44f674091613b9846c18a802a001f2f7e70cbc5a02f72a121d1da8293afa0d1b28956fc6378cb80832a42d854fa80f3b6d4907d58d267d5089950a6ab3e2880eebd5dcbfef4046906c06c102a9d582de1ab56f5babedc262832cd32c4000294917d218be04ec53506d83c648909d8eaadc20204e9e3efd06a01b6a66802c19c7f0fd7d27e863bdb31428100f537145b27d7968e0301c013350d2c223a88b2ff28d140001c6e10a9aeadd4a9d891001616bdb32e04efa89fcb8104e1ce4d20481dbed6b508541073885cfb1cc38ddd408860aa7d1fc9e3501ce15032000076a4450e42f67217a390bc9ac5e0562ee2b07201d0206bc1c6778a8c88711e78874ffdd8b7d96bc50175e8f9f8076abdad46170e4f1df159d85b58a4580afe8858c22a07fce264abd23991cae3eadfd71e15b81f830d6f3ebe776d4a7641c2eb66f9839fb704b30ba80c025a30e18615207761972bb9e7ecb6684f08a04be47c7e8d2ccfeb3c0ed1c4a38280cc5b893f8f5a3475359fe6c1557231e537e54573a597bd213e1ec9f8e8d592a8b51349d9e533aafc849d8b6c59c41a96960a0424f90b18bd3ea4449a9d2e4757d76a8b7f8373014a3dab963ff4e2290491d7abb359be93e3985f819d21852923033daa7fda5d84922dae024e2aa3e509b8793ecf711d884419c2a643e7110bb3ef46060b0d5e2246d33bdddca2cbd1e57ac61dfe250318c5a0fd8947a3e8e66d9d0f62ecbba904e970d47d64c9a877bfaf22235961a1ccef8cca22274d74c6b68833d5d08dd3f6b6f3860132e6ec3007db89c7302bf37092d1460333911b0061595bc1064bacb28b82697e876ba3b8b11616b55b196dd53546c9a3efacdef6ab44096a6931c1c18b5125b8814676a277f73b6820a301c27a6b3e692ee04037be8b12e040054c6a78efc6efd59e005ac3c025bc785472ca7c9223e6caf235060776606dbefaf29ac72bbfab15ffd967b3b1ce7ee47d60684828c776fdfcf93d0f6d2f3fe3d301ba7893ec77)) <<< 16000) + 0x9762af2241be5efc288eca8aaac3054ec0430e219539378138173de38223e3c57372d4439c0dc7cb7b6e8550d487f3935df4231ed88bb13f13abdd630e538cc0005e491760d09686859807abdb3145c0818b2642b954fbb46aadd6a7e6095d2e1e5ba5c00b09ce17252fd02d1a77d47aa62e7e1a9b32a3ca4f3971fd59ddc5f70d343daa412e269308f232431c42444344240208234100851d548aa46912a795c74559728334b4d782a38c1327d6cfabdcc8569096de7e155ec1827a5b47588f6436154a6884b2dbe8359bf896c2fa5d6bc5989683fa8a849d562157eda5ab8485ca3f1aad8055073c89cd0025a11786e5d29b538d6b55a3d46e182ef95e5b55254d1715c120802eb92f77da667d7489b0ab632dfec93657e99446a121907adee17bd70c4e0eb0ce3500c565247d4fe755d86004ff542e3e880f9da34c7e8ae2017271182c50cbc88278dce2ac41bb08f6a03ea1f0f153ef09c1ca2b31f807e625b1b58e916a63ea12fa2e971eeb9cd5bee0c2d4bd82c93abb97fb2e36313842ffb3dedef463810b171e2f2ac1c3f74aef7005f945248ebb30617cab3231d2448e5e9a127f1aef32a6157cfd419eaaa8c5551330000da245a0360016f0426c862d82b175158ba04e00802008a071d87811280bdc08396880a3a2abc91820f00400002888b980e0180200800002222e41390491772353100145ca92e840686303d48008c50840200001666b923334a6d84b5cab923334a6d84b5c5bd8c39524e94fb8dbd8c39524e94fb90406a4f324f003e332599d6afb06a10ebda776a4ccaf694140000000000000000f418de8773339d563c3c20615378ce7558f0c2331c738338250034014002185efc11b5fb4ff5743896fa95eb056eea52a378914f6d4e31ae67ce64e931b1e074b1ac86c164e6342ff4c91c1fcadc0223eb44fc7488da9a925eeadcc94b4f3d4126e2e88b8e9d3b79ea7795abda5997353b8c32b69e50005ae22d432169190b300e85d83a9950c0a713535840798368b40023181d008402c650e34c8801a9521f818034893ace0811e18790600482840010a24aebbb8c50cc681064004850740100000f640005c48b20aa83a944a0eb8dbbcf630bd6d06760d943bcd8a6cdc8e65f9efa6f5383f8755d065e544123b2ea405889789ae4d5570e853a884b8b45205b926d4d170080934764b65d12610cc5b9e45e13ab51e48206bd7cd28e62361d52ad4f104cf493c59a48ca481051752c29ac5d0326c67bb1991889ff9aba0d98f11a780190a94b9cbc885e29fac9c0e60dce239d9b7f9665bc714df012e22a390130c7865413dd2fb66e6fa8593432bb7af1b4b7b1f0b68a61d66ef7e0bd00031512a944a162b55bf46bbc4db1ea1d377ed451392ccb18ed608934592b8b2ab31529707b6ff97d0f840da488a2943ea25476b8838d99caf6695d49c5113749f80507597858320b038015a02b1cfa9e3f7b202097369c12b25971e0582e3429e2aedd1484408a3fd9f5f3ac03c35b5928ce315d66dc7d6c0d46cdc19a674efad81a8d64aef1138047861c3b5b0b205831bd0ee6673aac787840c2a6f19ceab1e1847a96ef4c75757514ebfa678ef294df1d21e37a84f3733bad9431f6fcc28ab83d72a2120c1100a60220020012d29c18319d9aa97b0dee353b7b20f13f4faea41f0fa4c98881c319ad48daa3658690adad6b71a8d1eb5e3d9c140ee402b8680d562e3bd1629ca831679bcbd3787e423a2888e9ff6228927a0a3142ab5f3e521e152d84f938a110eb2fb1804820400100000da2000bdc4048662e21b000f8e22e00b00120622be4a001a5221084b16f0dd0419a41b47a3d6a0a121a0d24f74600018465e529dc67d77a009a407cb07d0c92102076e1cdcfab49020850db176e76a688016e308c26daeea82018e2710cb183a60007a1202070d81502dc0a16601e0899562278b7cf109075309aa1e1158c58775c6395d932929076762f0ef055f6ab797d098e186499f12b22cd68f201650206b34d78b83e2b3453570928802be7b4ee78440c6bbe7c2e004d17020b9867744581ee674b2c6e747992ba618560dc48c40d0c1adb91f0baec3fd1d4a4e0e4c63ca8620483b5767d7c30ca84ae6448c21cc49eae59d66dc010327c690baa2d958524d30c66bcaa361bc6df6e03801914d628afa711fe1c4edd04ff9b12675c17601807db8ad19a0984757c634cff2339e7ba0f7244000301cace9ef336b852c07e73aa89f6ec1a372bf9a2cffd1aca18f73a516bdbde395dc0518981e0000238116d19443f8d59bce267506b157e18d01c1e6aa0d8bbfea8262dcccffff8bbfea8262dccd000011cdf400f21e28a1b6493c5475177963d4c6f3acadfb2fed50b33900000000000000000045244b44228208248010000036c773b3a381651fd66de1401e51cd8d0df8854acf7d6e0d43ac76797ef4e800617af302df3517c9740719c0e0ad1aafc2d9c898414742bdfe3c290adafdd5e51349e03ec3edf4492b3d938dbda62308a6033308271c662ca490027ac8cb90f2abcde209b32261a66dd7478a61fb76531099a2740018e48006fc109b298b60cc5ac27818e543bdea306d2d8914684161fd1ff5c882e7b32ea28c0ae073bb101801474e12900130a11004385364f27be3821d29a12b3404fcaa20a1408d7b0ff2100295adedf11251420008000083916a150b48a85a0242ce1216601e0c3780ce278036890e4e1da3c55dc688c0322e514947e7ba3aebe1de9b9b6c566d69725e1eb7c8408585ee5d5e8d430329f7f68f5080922698f2c699be1882cbef9e)) <<< 16000) + 0x403f8e5dbbfdd2451ef6036259f1950b95ad567cd3b3e9ee3cfc8974804c1b1c516eda37ddf22eb2e12ec144ae21d7eea1bb422e61f17906456545fa6fd8bf93fb30d91a511a8751bb3830110fffd0b685088dbb5a9aca2c86a8f61d8b9a7d40605d13a672733d11616921d68bfafecc4f87708398522dd7a20dc038c7eec0a34afcf57145b798ab03969ee3892b6f5e8155fe84efd7077d135e6006461cb6407d14bb18ab6a9a2c30126acedce181d12c6503064f259e581810b79f53b86068822dc6c0094508402000021a6615d204cc61f5ece743dbcab61bc4195e0f00cc37c58b0eed896dafa0895e0cbcace0264adfb52a3f751a5a25a1fec07aa65c6cf04323d59c9aa7ceb5ca3d57b6ddb5961046809e1fda3cbf974dfe07add981bd9524bbcc9b4e9b83ddcfcc11da3026d210e32ebf8613ed4db7946044bfad251280c5481c63382321bf4f60361be3572af16105576eda48e01c6c2d5b63a5ca419519ada44d8a3a83ded6657e6d4f992b3016cd707ad90e0397b33004cb359be342a4078d3461b929808711edbd08a56261c1f4e9ca3a8e523a1df99e00314ecbd23a01d40b29a17efdc9ce4d58d790331b2436b5e8c38814271e709fba0e37605468884db9714afd3292a36a5a37a6a54bf87377eafb1eab18f50c01df918ede4133ab72b6ec0e78b92e404592840f986dc196b90ae8ef51f289ac73985e34561545b2d032013bcc10969ed79f5ef0198a3d49ca88159d95a21cc7904447d80bd18b0f3fc0594040015b271bd0ee6673aac787840c2a6f19ceab1e1847a96ef4c75757514ebfa678ef294df1d21e37a84f3733bad9431f6fcc28ab83d72a2112461e30e22801c01600c005fa6b1b7c6e26ab7b89a7fbc5a0af21b2ee921074b9ff14cfce14874ccff812a9463ac040aba049fe14e52cd9e4dbf4071cc92b28001cf9164190b184b0c3876b61640b0637a1dccce7558f0f081854de339d563c308c8710510e04505000400100034c84a0453a49dbe98f6547f0dcc28076980ddbbe09679a4b6b68f80e28fa2f590a09f928bf1c2808dc443830a081843499e10d8e9fa728803009fd7c0a00d1a9dd4a1016e01f9f3804e204401099a8cac076c90a69b0de4068a3481f85a3852b359eba6807f335e4804a18400101620900008c90002a020243313f118b080c58006000a7240072848af948007e6c89b0a800c264ca3e32b702e842fd8c595cbd4ffdaa423484412e1870ed6c2c8160c6f43b999ceab1e1e1030a9bc673aac78611c49197a6c3bab6c8a59dd5b64532248cbd35849a96ef4c75757514ebfa678ef294df1d21e37a84f3733bad9431f6fcc28ab83d72a2129a61a3a011000085edd99c5d9c93d636c6d8df179dd78248ba0408803386e41ab9276374eb27b31cd58b1cb1f908ef1c681f7280015a41c9fff5d2b8222c429022f6ee99f8c8d94df3b9d8a12ee66c2df801f57eaf46ce0a32492750441564e680030c115e29d62f873c9e3efe6df5dbb74a964f2cb9563c928d6d3f9e4822b548000000000000000000248ce311f3def76c9c5a97682a460c18278060038008000033fb2f5575086b1b0acc22d3ac8a84de4527ec1deb27157c9f27e0a0bb8a67459c12f7803709aa5f80b31b37e73b8f02a317c22a3df95406e0aec12ceb2ff3da2f0d9447d5c5ff529157028d660a1638d72de8ae8a8528542b81b14905000264100539d8918828c35e02094dada8d7a3b2372022c45a6fa5237e4d663c74b31c32c752ec404fc785f33f7a4a643851fc2d2ef46cb02de1e64234f2b6887aa8df8671113ef9e01ace83de9ec1249f0004e058154c9ed3d11306bf77a64f451cffd525e76580a2804ebd8937a5de453c8410765db937c0b056acc853883ffb5d75f059866ee5fe6079b3f320abfde76b0081b6f0806800266a200a0d5adb1fd8f34016ad4edb4ba40948203427c1e4c6da8117c763550e273a68ad47eee153542c9ed586750ba4f34dc8ecc8a01de7d158fab9c5359831d700787f290131eee1d9ae379073ecdb1e0478f8810d7c80a248f561e40663fa723562e04d000fa37fcc8a2b78b61472b90d8e40fb0702231b206e3c4b6a4f9b1b8aea7abc4ec4236c546863c156f54596be2e40d5248ce851f750167acdcd0491bc6920b62ef9f70d932678372ca8b5f14cf58bb2470793eea11f28ba3f8e5a90bf3c60918e2ad397b89749d8cefe14e804e470ed0f406c9512947ccae1c5364297af9251115e0fa02d0d3f95f0cf70a1de7ccbb68781ad0139c22686fae822f02c7d52d5048721e2e25c879c644df56ccd7b07fed691f450f1f85287742f2df60533b672ba460e703c4491e2b1e25d10d7dc08430740202b6020000653c196a576acc3c502e55bbc0db7d04e3cea31780d34e1b0e6805b2e7b7f97f113bb9774534fda07bff6a5f9b7e1f920158cd6ec10a7992c3a1a22eb9806eaf6a8bb37cdfe97f2395f0fc5a9504340b3851a24c5c65035024d461a9edc1db1b2664fe64a52b7d844fbd056104eca45f75270f92723da1f3829a3318443d5ef8566b68f600c52c799fb92198ff6b49100de2094618e9ca6346955810aef2cd47ebec7539ab958199c09b3f8ee5801b1f37db819d7e20c9c9b303996b58b3885d02b6dd9c670edbb920f9642245729dc2407861ec11d68f56c7942d5f6652df8fe421d4f9445bde4b15fd86fda6b15f81e9d6a655557aaf1cdbc571e810c2db40e4258d4a220cf737e8bd58915141dfd5a8607f3ddd0d622a9c41ee509e95eb39bade64dc6e46a7557e12b660a307482165b8f00004c71ae)) <<< 16000) + 0x48ccd29b612d72ae48ccd29b612d716f630e5493a53ee36f630e5493a53ee410142310b8add80b2c17b1a2017bcbe10521603c2d44f93d089bbe89094064700000000000000000fc18de8773339d563c3c20615378ce7558f0c2344453053423000834567712b5a16fd07540533655e3f67feabe4cf27034a509105b4ab62fc52c80be544f19ab8c1344309c6a1331b7c89ea37a1d3ef931a6513c2e351e5459fd0892c50a93d7fed7f7c213887299d2df95375691d5871aeb92b1890023e52a48869f8f9d8701d9512c9c7872300aa6a87cdab90892922a9b2fc1de26a21c6774b4c3f6ed2fbcdd8c1d8832eaaad00077c2003158421087f05fce810a2f934b6bcf5021fc5a5b6783fce1b2349bd138fdd00000000000000000045c30e1dad85902c18de8773339d563c3c20615378ce7558f0c2333040c10814403c0ca07c92cc66e250bf67a59c2b171bd8ba6565c479fdf142bf6e98e09b167fcac0de4f464cce9cced1891fbff69b9f0f006b7b56d0ede90713453314e5ec0ccc2a5a27f24843ada7a84410938fe94275d7a657184b8a1f8d24438743d2887e9bf607a01c2dd11a2d4129265141312bcd048400c251df601206100042056ac50a4b982a03c303b98020b97576080317e4340212061000400003608000e5915a0d0ac8685603426c1a00076522ae3bd1f05d422b29075d0374ece429b7f87c376555e401e29c86055f063de648d4a7413942420fae459943a04f35007c9e35e8ab9056131b85ef3a05cc13bd94a92f331865f2ea8f014785c7026910cf0f4e717d238fa7166fb27eaaea65c3c05677f6f13ade4508c1a424032e1fb92675b6953643dd02a996f136f2e48023ec2da47a8d2e1407797fb02cbddc87d0ca70ff8d4432130d3fbe7cfe8490d9200275b5ef7d245bb475da8ddfea97408450022e1434a38bf95f81893ef2c7e03ac7b7ebc5a249f0bfa1fb8409ff3403216851d60001a08e0d4708cd500689d1f717067f3a6ac1de94ebc683bbb5feb0dfddd1f75f5a2907ebcb2b5f33c4023d9d058df438b5e423ae6c1561b81e27264780b80ee717834a724dcc6af9b62d37105e580400276d1e3e5e4c8fad605937dc70d8bfd0cb82a17093efb380a36294019c0f24e0ad06bf01cb53ccf1f905b30b45f6aa487cc7da26392a00148e5d730fb9071bf328c37289514c2306b00009644558d42aa6a154350a99a847cb42a4231180d0019c41005118053cc100ca98201e23e45441728f8cadc0ba10bf6316572f53ff6a908d21104a4a9f22d52a5d17a1df4696b324bce180a603c79af1cd1d0b9969a8800000000000000000024be0bf9d02145f2696d79ea043f8b4b6cf07f9c3646937a271fba0000000000000000008a139c2e4a5fa05a0e30e08a0060008082696cba5c282b5e84e2df6230a45f505bcd206fb973092879992519b59c8cc6fef707e7570dbc2412170abe3bb0bc825894004b1b253b621535f9c3f0542d4ea25d7f2878e97f7a8b6ab3f052fc00b39d95e00efdb3f48dfe4c1514bc2c4e90a1e1119832653465a546b467d96871930ce4693d12d006ee19525db01a134d93b5f171b7a8f92be36b042ad5cbcd9ddd22c891561d69a2a02314f050a7028534142980200087d208cab0a22985002f035e9bf364c99ef601821bc269ca636750024030621d3d777cfb21401c8d12e43538d671009726bd22673ce451041128ea00b92cc9c0950f03e9c402e2378240245a30fd7bf849820000c54472017eea82f74e020ad0780d8e148b0dd348cabb7b41c50a37c02704ada7f8804372a8c3d79bbc54340af788d4b243b4884b0159f9392d437800b18009841d7386fe3b0c0403e7302fe3840902541f2bea4ee3a350b2400c66c178ffb5147602c4404e9930f81c1fbae58fd9fbaee366d27e006a07160d57b7bcad368688111af0000000000000000008892342b4234605a2a7b283a83398f841c8482a678c604484384600079677c259072404b549f57a369e421afa80d590a7265492fe25d0b5bc0267151bc47d1de9b1489707a0c796f5a91edc1e4cb0920640cee6dbe29200125b13350a8a6d8641c01e47258e97b41427cec02737f9d53aa07118563aedd90383ecc2c26b3fe1019dd8916bbdbf0d069c4ac78514400000000000000000114fdd72c7ecfdd771b3df7f9a04e88527e7e0cbb2594223c9eff8000000000000000004419c623e7bdeed938b52ed054ce10b10910804204e0002ba6455b166af3c046eb7b1cee0a69e5c8f15d013c1414d96952265444ada77a3476b320b65496eaffaf91022e604b42c35228caf87bc72f4503dea6da225f39367abaa9cfb131f675ba3f135c46bde31c8d8b53930b02062c9915caa7dda25aa45141412011c38cd9522cdfe27bc8cf5a3a8cc1ace3f728b6e208870a40ca80000000000000000008e475dbb20707d98584d67fc2033bb122d77b7e1a0d38958f0a2880000000000000000022a2a7b283a83398f841c8482a8708588204500080011cb20caeca6dd6f99ce4850273948b3645c7529775d8f62349bdb7f043cc903702a883d57645b2ceb6c364217285f649f4c9639102946d04a78a4fdf6bbd3db2e8af73dbd2dabea658d49e6ce1e0ff1a3d92727aa53ea65e538b204e4957d3f663eca63ea5b32bcd0006a13e1e30f4b4e07fe8215ba0f6d4860d06e94755a1c97266083d06cc1eac85f47f0e29d4d0c00435abcdde331ce54f50afff9fc2f58854570ea9e0a1bc23a24b61683fc24be2a506217ade881b310d04b3d223e109766aaa2910be791f4060d84c852f2eded)) <<< 16000) + 0x03672b32430d349ce17484aa2354ceabc14c5ac3a7f28a9f71f8fe1f6e2eed25a8ba0bea9c0b00a800c4c242a25ccf33ae00405875f20f2b5503c698bbf6b8c4b073b655867444c5d1c0b9321a4a8ba64a6549c84b1eb955f5945c755b54403240587fbec2dce890c424e80000cf8452cb42943a149050009939114458a418c00607c86728c44d062247b1111988802f8582cece632d6c46838a02769400ca671dce020a86ba629400fe1a065c2515504bb2c42c088ff3f2f427317a301028c44c0754a54c0100e151ab3e3aad310712f99ee7b0b429504020218a871e6b3a1c01cecae83301d834206b3052c1b434914551fe7679121a25fd58c20180b81a79600cde4b67528008d62e71c00000131811804051c1628c0b145050a200f0c8fe57fb49802d80de7340008af6f451606f78ff1bc0000490b0840202860b14205c04004011a6fead56ac1509055dc192b00d63d4371008c40840200001607114280111a149e92c68527a4bc59c9bb10444a9f22d52a5d17a1df4696b324bce180a603c79af1cd1d0b9969a8800000000000000000024a32e83a831f971b638550ecf1259708c420faa4f8957f87a9f6e4f000000000000000000090582f634402f797c20a42c0785a89f27a11377d121280c8e00000000000000001f9c5b1e0d690b61f556a6cd6b00e0c270a5f07e2c979e4800000000000000007a0c6f43b999ceab1e1e1030a9bc673aac78611b1861a32a000f2cf13082a0950f5e89923c8a9eb15d07a654ff1fea797c3ba1ca62ae08a560d873c922fed2529afef3681e4385a099127da74deea5a18b414d95cd41ee3582d013535856867640c7e621ef0b2f5acb0ac2c2d2f94f3c8e945ef5e9670ab61b0790604876047dca18bbbd34408241f955aef8f3e393866f7f3de2d045edea9e01f04f66155bdc78638763fc2f775768ea019b2665b3decf6e0972ab70a8e42cc83f218b4a4f54002b908a08885004427e2213e1189e8484f0252a7c8b54a9745e877d1a5acc92f38602980f1e6bc734742e65a6a2000000000000000000092f82fe7408517c9a5b5e7a810fe2d2db3c1fe70d91a4de89c7ee800000000000000000229fbae58fd9fbaee366d27e006a07160d57b7bcad368688111af00000000000000000088582f634402f797c20a42c0785a89f27a11377d121280c8e00000000000000001f831bd0ee6673aac787840c2a6f19ceab1e1846a78cb008007800005c1eb92aac6676ab6bf0b34bcab2bb8cf7a780a8c257b00fd2801dbf82cd19d3723a4d01476be930b58b42323665ac0df459c92b81e38a68ab247925ea1b7c7884468156f3864ba34646085a8a61d950200db7a37b31c2ee8517a1389490ee255b368f21d2a2b4f3e4cb3e06a4c9b105faaaf149102dd1e3579fc8f2cd62a6f592bdc31519fc9a41fcb13d50033b9aae4d6600e000c42728c844e1285e3a4e74103101c301eb635101279faffd000405693e0000907080021e7c2ba7f183003656746580110a100042018020088040080204ec1400006e44e81600011244b45400027840008d8d111dd23dd4226810ea87ecc31ecba736ca811a32f57e000241c2100809c8084e00400021c426ca626e03000dc9200349c651f195b82bcc0b539d65452e7ff2e8949422094941ce8e92724ea598506fe8c136626d10cf4cfa63de8e4952a59c00000000000000000047086bc71f3a702c18de8773339d563c3c20615378ce7558f0c2343ce2c20c134024000005e13f8b67472aace1b9d3da186a32407b2c2d6efb44785755c3af25c43973f10848817ba3a31dd66e121dd6a1c53c9181d6dc48960d97a3ed340bd7d652495cce3b2fd2aad76802b1ab3c0d69325baa7286945000576226c2a002122226a4b1340d09282c4cc07db84dbac4e31bafa75dbb74a964f2cb9563d248d6ce980432969f800000000000000000024a32e83a831f971b638550ecf1259708c420faa4f8957f87a9f6e4f000000000000000000090582f634402f797c20a42c0785a89f27a11377d121280c8e00000000000000001f84e70b9297e816838ea8a58a28868000544dbc23badd8a14e702d307de608a37adfcf25dea4c1084f255ff379d7267729d1cd0c263aa7b383cf5db7737b19a87580f1c367b759991330e8f40aa23362c71057f56a53881e0e41eced7efdcec634ec0bcb73b9954fee627e7456d5a8777b2a7d007a0a3d8e5e371a9a94dbb2f6040c59322b954fbb44b548a282824254f916a952e8bd0efa34b59925e70c05301e3cd78e68e85ccb4d440000000000000000001248ebb7640e0fb30b09acff8406776245aef6fc341a712b1e1451000000000000000000453f75cb1fb3f75dc6cf7dfe6813a2149f9f832ec965088f27bfe000000000000000001112468568468c0b09ce17252fd02d9014510d0400c4042aad7bc93192ea8f947f099c2d85b93c635d438b033417ff4520ac89dd1b7f5f07571cb79e7f7af6676adf24e16b56ccd719cb037c061301c4a4a474c71a220224e43ac11e21d9a1aa7128d3d7ca1a06f9e0458aa71d1623882aab8ce5811d99d3494058afae816b4cbeacd6eee9e21132d5a91cd8231467e20e51b1700c9e828589930d3f744c81600119a44c4b62603bc3d6211f31ca015f7db17f0328dabf959a1f5fd64511a20337bd0800000000000000000048465d075063f2e36c70aa1d9e24b2e118841f549f12aff0f53edc9e00000000000000000012069d0acf4bd1eefe73b8230f0e8321001e15d172e14cd7e8ae000000000000000004209ce17252fd02d1)) <<< 16000) + 0x514b14510d00600000488076be338d67005fa511e6f6bd775e911fce4def666b95a38e8ca24fb1b94217b54670bfb23a3de80c21b6f291583a45c9afb6d0bb38b74226f22cc4b3c99d22cc0af19ad2e034bc86d9a121a2a55b37d7350c1b495fd2b2a37d5330d9b7db2775e01b2d1d64500e40b454a91a96e13476040c59322b954fbb44b548a2828243f75cb1fb3f75dc6cda4fc00d40e2c1aaf6f795a6d0d102235e0000000000000000011027385c94bf40b35863463065401c00001ff2970d385926d4d44170ac3db042b5293ca1fc632cd44effb70c1239f49218a96922deb24cb80f25b342e093bbab54278a16b879ffb317a000587fa193802bd0af1b2b04ac48bc2140ea53eef1a4e023a6cba654bf5522f480931524fc37a89784a84a4aa5cbea448d6287a8920845752c02c07085930900120a10004284c49160a10022283e00800005620e433991179193ade2d561f51d4d694d7399829d4ef7a2634779100289d13d6f15f68e1edd3010eebad0922a9326d10dd13aac7cd1b6f3220421daab3c8c622d72205e74f7a14d263137aea156254962bcd6291c98851acce5799e5394f0f7e5a2bae0c880ed4701c8363c6c0095bc5996e04ddac8d03bcb7665d5455c9e920b67d29d02166c54a8f9ebc6b76f0679eaed2e81a94a1d4efa26ccbaa6a13fa7e0bb7d8b364430c95ef4b6be379798a362eef073af9b3586bc7b977bbde9da5b66fc5be3cd8001509f9c074daf597179ee1227fd79b750152911d594850078b525c1c0063032b5742cf9a13a56bed3637e11e66179841d1c04bd356b660a190a6fcf64a76fe6b15af5cad83f3f9660ab5daa9d4e411e69c947e2212850baad33cdaab4ecb1545ed46a1913b8414173a48eef95cfc53598e2dc339d543c2e1683a3760d008aa616643652962a8b8fc78ffcfdc13099829decb222523c5b3347f41fe9c512f5790c074f91d0649c6caec9fcf7ef42dc7d7f1ed79b67dce3efa3fef70b21afcb740970080030a8c878fbb16c15c0701534304003d6b5d62180767f30ea00149080800200001c444b496001d724004fe0896088006e78c75dbb20707d98584d67fc2033bb122d77b7e1a0d38958f0a2880000000000000000022a48d0ad08d18160c6f43b999ceab1e1e1030a9bc673aac78611ea5bbd31d5d5d453afe99e3bca537c74878dea13cdcceeb650c7dbf30a2ae0f5ca884881e7961847000000014994b53d4ec1d58d60625391c9cb46901b2fd8e6ae29da417edee5f25f7a5e59a99bc30eb5baaedb888990928810b51d584c6fbf5e82ae5365e3c3cc3078f49476c318a52807ee4de4c497687e84b4e90081c0491daa72b8a05000613302062c9915caa7dda25aa45141412011c38cd9522cdfe27bc8cf5a3a8cc1ace3f728b6e208870a40ca80000000000000000008e7eeb963f67eebb8d9efbfcd02744293f3f065d92ca111e4f7fc000000000000000002222a7b283a83398f841c8482a8a0478418470000195fa9ff87853c1b08cdb9a919d8a2677a1741c039fc961aae6ad89b42f55d32b4846bd5addfb4558f9ed6acf8600c75a21150f075efdf8ccb8be6a054722ac4858434ef2c6861791b8c8c6f1c953916bfb0b5b874d3390cb8bbcb5a4b75d30cb361d9b3717ec10727079e9f016c71fd0b15dd5b462855f504587f30a6150de2fbadcc16a5f747b46a24d5ff8ac0f9ab8a4504d8c47b4216cc2f16080dd80374480807093048f624b3e6b77e4b4a920603ce1e9ecb631a1145130a9555ab84be5be939e115d1273772c568941a978b47dabc90f1db7659a1008868f4cf0a3a91c1f8d3ad358930eb20c748614d621c5fabb1cb3db8d1d6031a19029be3cc40003aa782de8e8c45cdc904e44c78607d38337e2c0b316c10d184d1ef01c6be7bf8a33f8150bca41ee98918493812d59ce425bee6d3a94b2507300009e244ac5502062c9915caa7dda25aa451414120a221c91e33b9b94cee2e1eff42665e8b04292342b42346059a079e59641808409c02014c08a96725e6a8270729f5de9cb34bcea38744415844b2881432d6756bdf46430d40a28c154b84a9d5bf150c69684c500030d208c73001085224e4b8103164c8ae553eed12d5228a0a09027385c94bf40b469df51ea98b9f86a6cca8f293ce5c7f5677717dc34d0f6a904b89a4c23c8c90c7108cd24908b04e00b00a000015403cacca1de1146e8d500708816bc6de746f2d87fe55216d5c8ee4fae946f17fc60d618521ca05edae7034e6c1e930a72d6b186ff103d8f30cd589dabc3227e1bb40010988951c84a4842500a00478121368b81ab09de7d2869212d37a81879056bce8e2261004bc86d84785638f8f4645040ccc13b2e130412004049c1700c0100400001111260509282e32e83a831f971b638550ecf1259708c420faa4f8957f87a9f6e4f000000000000000000090f82fe7408517c9a5b5e7a810fe2d2db3c1fe70d91a4de89c7ee80000000000000000022a48d0ad08d1816139c2e4a5fa05a1a6184120a001200f7fb091df41340ea996ff0b714ab27e00c0dbf3a7c2efd8a99ea97c3877e1db908415e0bb4f40f1484fb5d1d01ad3c737fd88362d382dae9c80a5be3cb11473eb66bbfe13fffa6871799aa5995749eaf8caa0888495195e5068002df91241d0918e8014742443a1211d0900cc47c6423c3211d1508e0a846c542342a1191188c06845c3622c120008ec200e7e2401db408049329d5ed98a2e040c593215caa7dda3556eb53f304a00000000102062c9915caa7dda25aa451414120a221c91e33b9b94ce)) <<< 16000) + 0xe2e1eff42665e8b042640e38a4083002802882aa171d7188da745d3d31cc59b1483f8bd74c175a7a41f020abee3e0000190de447deb8fd4401a12ef8d37e4593e2a5bc8034e4ad8c06df1ee8f701e3a2347203c1f754f6af865ac52fdf7d3504ad99656500049c222a1391a44aff4a6403169cd5b778e303efee80d0463fcebee0918228b8b574da7adb496f5ba1820d036e74c780caf0b39dc4000026a0d7a0ae29e4f907060286d9ee5b22092ce12e6a01066808eb22a37294e6d6b00aa00220007a45beba4e021f1e67604726e02a0d92b9e2a8c1241ddcdd90cef50674530c40001de9009dea20359e665073a3a49c93a966141bfa304d989b4433d33e98f7a39254a96700000000000000000011c8ebb7640e0fb30b09acff8406776245aef6fc341a712b1e1451000000000000000000453f75cb1fb3f75dc6cf7dfe6813a2149f9f832ec965088f27bfe00000000000000000110c71090c40c4087004014d0e69b70f50fe38f50ab2a486a8723322c3b01a1e621822831cd3875f47d7f67194a7f6c6fa840163bc6a88e5d7b0020522a75c95888986bb64bd0c84af87ef27e9c974c0f42538bbed45af2690ce9b8b240bc176f853d3c811b1525bd51b2839d1d24e49d4b30a0dfd1826cc4da219e99f4c7bd1c92a54b380000000000000000008e475dbb20707d98584d67fc2033bb122d77b7e1a0d38958f0a288000000000000000002291231829629428c092020243d84e8572bb1fee63ad6dd997dc62a5c00524dab0121897b755a01722aee018e8a2ea68dc118d376db1a25ae429a3f9795ddd96bdc9001ccfe562cf1352c0818b264572a9f76896a91450504892342b423460591830e30e29420209400c020998e4fa7591e114f698d78c9e4e55802c1010f153067c9509d2141f2d0903b92420cd632e83a831f971b638550ecf1259708c420faa4f8957f87a9f6e4f000000000000000000090ee39d3365bad7b0ca7f81d3fa637848729f10c1fad502231dfd100000000000000000023377dcb1bde22c5db1806153633750df3c74cf66ccee9ccfaf400000000000000000086716c7835a42d87d55a9b35ac038309c297c1f8b25e79200000000000000001ea1449830e3142009854c5a09db8322057fe6b27dd18569ec8085b751af2adde9ccd5157dc68aa462108f5d71cb6274f17decf2e6deef773e72f110e28c752ba46664ff913e7b8df10af87d03e180bac3a6357e234e5b4b1197f4727f804cb8b5f7d5b6c04524b8c6ad0f0775ac8ab41b665d3ba721a7a843b204f9bd0acf04ec94a06bcc9187bb1adcf859dd4c716d284262984280047f9114298005a810453188992c448862221b11005c75dbb20707d98584d67fc2033bb122d77b7e1a0d38958f0a288000000000000000002289231829629429219601200002e37baa89e3a27024104ae8d6650026b7a4e4364acdcd5bedcf19849b02062c9915caa7dda25aa45141412187ac423e639402befb62fe0651b57f2b343ebfac8a2344066f7a100000000000000000009092342b423460599641a39039629600e0080b53f4dc071a28259b4a3be9abc19ecf5c7f9744394483a48d76f74c158c9b3b773b401b0cba38d8ebbb97267ac4ac944124e698f088ddcba0fbbdcf6c7f18f48d8c428ebb2a7c8b54a9745e877d1a5acc92f38602980f1e6bc734742e65a6a20000000000000000000928cba0ea0c7e5c6d8e1543b3c4965c231083ea93e255fe1ea7db93c000000000000000000241c5b1e0d690b61f556a6cd6b00e0c270a5f07e2c979e4800000000000000007a669668e40e58a400001b190d4c1c43c507ec82af71f79592c688bb213900b8921a2cc5daca6f30f085b7f707e4dcbdc818580c468f5fec7a707066f53cae3bbc006afe0e648aed60efd53cbdc001b12fd84fe8098811e940cb190b90745edef7289ddd5029b09acd7c7bfdf15712da542071e46a98d93294001c4c84d92f4608c00347623068067748d5e2c61d7b1c5f04284391e7900262801bbff8d922200075517289b0001001a31c1400a00005e0800693110f210007dc1002031302062c9915caa7dda25aa451414120000000005d9c0a96a356017dc686921291204892342b423460599441028a20a190008026a9ab70455007ca0a3bc55c2eb143cf0bbfc9ee875c1a4af053794ee40defea270b43ff74d1839bbd147837eb4ab066214d688d84f4832b481c776457dcb28417ec226dfc51077921e9cb1822c286ccf00003d08fb883286130060000520c0818b264572a9f76896a91450504800000000176702a5a8d5805f71a1a484a44812187ac423e639402befb62fe0651b57f2b343ebfac8a2344066f7a100000000000000000009092342b4234605a1441028a21000802572ae005913810c9026c077b8c2277ec8172d526a6d154f7c3b050d8d0355521d4809a26c89b4b52f3282984b5344cc1354a3b654940fe5e9a80194e962bae28f678db0c7e9d86867ca9afc6d67bf6a1a9295da22f53d2c9cf6272070bfcbfa186fc0a10dec796ec1599244006fc23282a005102dfb97f7d1561822a89b5a56846c5000187a45e871a027103861901e00007988003a6110e1580b0ac434562182b10b158850a842456210121070908304c414242080b1030508100800344c88084e32e83a831f971b638550ecf1259708c420faa4f8957f87a9f6e4f000000000000000000090716c7835a42d87d55a9b35ac038309c297c1f8b25e79200000000000000001e90e28a20e08c08608a000000002067924c9d16e1e77cf8c0a57)) <<< 16000) + 0x6f184ef50765cbec42a83f49ad5d8a9828ac8fd8014cd8f026c9f3b2a5390f4000fb08802483fcf41fc720fd3907e1c83ec841f4420f91d07c0083dc04007212407a3188131019ae48ccd29b612d72ae48ccd29b612d716f630e5493a53ee36f630e5493a53ee410188a140088d0a4f49634293d25e2ce4dd882222031030c20c11c0180000051149c9e3b3b2d71d5abb92638b7f05ea88f2864ed0897719bf49754c6a42ed030321edcbffbe1a15b59694633447c13fb0f3a24495da20e2a0a51d8ff37d36ac8dfb72f8eb12ac6b77b51e386f549478d190378bea0462b0f615ca3e32b70579816a73aca8a5cffe5d129284412b8980620e8bb222c0b4edc1fa41a663c480a028677717dc34d0f6a941bc0f25d47f1b63a213b17363f6ef572899e705b3ba7082f9d12854bb4f522b51c1610aef34a034871f90ac88a840a28828630000920001d8ef09da56b390e7191191dcd60375d9be690c2a7559f99613a77ac0b0f00452ed992b053f3d137591dbd48c809bd551012d42fe504513b8385afb7c222c473dea87538587ea5cdbee79986a3efbafefa156b59e8f171508cf4981682564a6b3d15262864922f39e5c98887e7a5088c746ebfa6c05e628d067d85dfe9a318d8a465f6f49b4c85ae4a95fad81a8d9b8334ce9df5b0351ac95de227008e5fcd3a9662633220cbd881da819ccd39c0cc780a4a63a42e055c4c0310745d911605a76e0fd20d331e240501433bb8bee1a687b54a0de0792ea3f8db1d1094c18b1891830000bf0f1bd4e1685869a726f012852048c8f110a28caf1d13356a13542adcf7cf00ea59a7b5b6e859482b16e6ffe8907a298590010015610ca74b761ef93298363aa121183796f5699574c7e9094d11ab5c9199a536c25ae55c9199a536c25ae2dec61ca9274a7dc6dec61ca9274a7dc8203114280111a149e92c68527a4bc59c9bb1044e260199a39438e30e29a010000105baaa922729286b4034955d0eb23fc477a24aea2c775666beaa15557cb0d58498af71352dbc34d4f7db0430e5d93770780cbd9110a1d40e7684c2c60cf0f9cfc71a528596b81c50bfe1bcec80c2b5f3b660066142200807a8083d0040002d242d886000a3843902400151643cc261c60b913067d4d8ca6ce89d108e243899c8dbdf0cbbb722034a04f688156ad71d7020718330cd5c990931210408c2696b196cb71a9fe0a007b9d61fe0e0f4e03f0c0e215ebfb05b34a3d2410042cf4dff001fcbf17806a9588c1e7d9a19794881ad1318ddc20911c2701b01a0f20d0658683c414194020003a0202c6a0ed2907608800593487816c36027836c111a01a60808c55034e3c83048dd48038e41027fdb2d7b201809b8f2e429a0a0517e20761ec100ef938016dc080364ca6c8325404991b2e2e5037e69e67fe00a2744290207103690e180292b7f0c18b321d1c9e4bc0c10341578c4ee0e2e3c5056d81f4161a82c3870977243b00663a9f120469bf82a4743cb51400160969b57e9c1c080800825c2f881798015409533042c324bdf4049ea1be8383b06c6ddad50800e02c4918814614c10508408700000054f34308cc84391369c3fe4278203a082e8f4998917c2870c50ccc68e365fb37340d155300e50658006f1c5b12802cc3c92080a930e10804287a50347021230a5bb676471a3e827f1e307c543671324203b78cd5881037939d243083ce84d6802ce28420100d40106980800064080017410ef15d8b9e88d36b205485abac996216e0a1e30911c83bbfd828923879aa42c30b8c5e20880a1881304c046718210080678083380419a020ee010000de10cc2506588832814000ca443b4b41d82200095f21d693016498750a8002fbc87482e05a6f487c3ce78423faf95273ee49168c797196d16238ce58ab150a87de08a1c32391296e77865b0d62c60adecaf4180cbc8f756f57bbd1844a234ee1c6002142678a15a9d96e361229188776e1b905c488f060163453a5e8300afa010263330c18d08b294167ff05c9cb12c782d399cd49f37dc03e7ed2ee4e40257e7d66ecbb978a98d6c0490c818ea75f3dce67fcc20213c757ae17a254b37d020e230da0ac9faf97ce08eb59a9156f5fbb8d2bfbfce324e932458db02f00e8c3837b8d67f850a97ed92637123730b2153d373668823ff6cab1a1063e3028a8009011ebfba11790496214fbf84f42f0c2516a58db577d49e3abf41f3b02a425bd850405e65a4e199249dc76d09adfc250df319406bc1885fb12291bb872fa7c723fcfd76601839dfa61160ee645a92635685e6d5d9484572724840fd7a7eb1431f58e6188218c5904733c728c497a861309af88f20f92a4f7ebae5e2c40c39732feb13cacb90ccd97b8f763b02842ab7a756840a1c1a1896282630cbb0766547ef8bfeed322eddcec7015c1ee03da4af1aeb5b74882e0ee5542d70e69ef282806a48fbda0e7336bb8b394664d2dd582aec0ed9a3401585bd89bae97663c3f16e908582d446c29f531d3de80e42310019076e42bc23cd1ab1915628852104388106cf85516454edc7e38819f9af1a9240a51e1bea5381ed0be83a0e070f0d23a809830840201d00200014a35c9199a536c25ae55c9199a536c25ae2dec61ca9274a7dc6dec61ca9274a7dc8207d6c0d46cdc19a674efad81a8d64aef113804731a769a16b405e1870ed6c2c81768e5bbed8495de226e21b719a8a495de226e1229438e28e20c0075d499faedcb2a90378b246f6262ae1cf8b824944cd792f75d9fc102479b94599b11191cf7bb52ec4d1db6f064f78de45126396db295b37)) <<< 16000) + 0x6c6c3d4b37ccdef0cd69f18ed8ed2b7c40d2b43a87380839804000ac84002e8487286839034002094438c161c403fad81a8d9b8334ce9df5b0351ac95de227008f334e70331e029298e90b81586e72d0796a0c06b83b618b75c7e28b8000000000000af0c3876b61640b428520510414304009192e7906e874d94f52cad4f12f40c2a6ffd776d75c707849ea296c01c12ea591a9bcdbd997e71ee0db303ba29cf8a198c55dccd39c0cc780a4a63a42e056c54cb4ba5580bb593451c8ce02e1b9cb41e5a8301ae0ed862dd71f8a2e0000000000002b42851c31430c10810b009b5c97bd63a36427bee2cd8dc4b754d89bfa661ab649a3ec5ff6e7feeb303c1507909dc110a76bc090db1432f0a0a0006864330341c21a0e00d06f86832c341bc1a0dd09065028001ef881194eb923334a6d84b5cab923334a6d84b5c5bd8c39524e94fb8dbd8c39524e94fb904071300c8a107104083089045003006bf2753ec57495c7c6b806259d0fa88b1d1509c9b5e50002b828cc9724394af52b86eae3b9776b6145730a822afd6c0d46cdc19a674efad81a8d64aef1138046238c50a40a308286206304582080190801006e669ce0663c052531d21702b62a65a5d2ac05c63c93fa28fe3b98069f9c5cc3b540da50e4cd0c7726ed0dae3700000000000000000000000000000000000000000000000000000d0650a40a2862063041826d9d9c736e99eda6aa4cc537335bd998e14be51305c112d56078515890ff0823e942b3591d41e4bf00ae070f75786ef2e8087bf30e0b0c1929999310b3aeb6742a71fdc36be18249107a0009b44330341b81a0db0906d04832c241b2120d80906b84832814000dbc40c8d40013e24058e41ac720d539710881b9c542182f5b9333c345b0538db779c98f13112121c255ff8c6f782867f35264ee3a46ece36d71d821c2bfa0ae3f7ef067df7887d6d2a9409aaac8ce1f2243801f96d75cb668ae009495f13f3dd38738fc0b3a64060009d2e442ef686d03ec5a3d9b429bff93425518dd0025a5351b7341a0d83ace9e46308feb91bf0a7ea85e5000feb1023f6852bec1fbf7b87fc33a0b7d8a71464189181b81f5e8489a376588e18307c424921209b60b7be0304bf17f8fe1024150831220003a62efb00a84e4042010c1c3e8aad8250e4b657ff8305d489d6999a09cbf0650c804183dae562008bc32e5c0c002aa320a80a938e10804307212d6ea112874bf59387e305a69bc51ce28533c079ad51025ac4632c80c2a0af1e8931800898ac53b0168e28480280d4010698080006a080019690d215d0b6041c5fb2053890798b141895e207943087253fb3e024828420100d0010678083380419a020d1010000a410cc2106588832814000cd640c8f7c91b2c24f74b76953e213df77d5ea1549717fa4280342a4418200000000000000000000000000000000000000000000000000006711c42821c2241140040002cad976732539bc78f4c0538f62bba2d6dc743a1667079b283becdadb5789506d0f16e90f07576979b0098632ce37fbd4e92ff3a74e7d592c704a3b39de021c19a9e770e1385e35a79e6f0260af090d0a0c882fc9e7502dc563cee34ac0a00525a720284233aa78b31018024120d78a0bad2284abc0822a384df192006c511d7498e00008953a2801032f1a7c74a0343da704625cb094041430115870f4b14016e345c50bbdf67ddf20300b71b001410f4e655b0b040225500a0085870840101a00a0cf0506702833414000320433084196220ca050001e210008bd21922a0014532190720c7390630e831424007a6a42c924188520030153feca30e0f9bf8daab2a2973ff3fe20c0a4123114280111a149e92c68527a4bc59c9bb1044e2601c49197a6c3bab6c8a59dd5b64532248cbd35848838c3883843824801a125c54460fe805c2d72b7e21c9be0d6e58c56bf57cc972b05844ff83aa6fc795e1dff9c3a6ca040d634656d137be0ab15c3e0b0828a6e9876b923334a6d84b5cab923334a6d84b5c5bd8c39524e94fb8dbd8c39524e94fb9040c30e1dad85902e248cbd361dd5b6452ceeadb229912465e9ac24320720520328220228026e3993bdb511a06b4677af3be0c84938ae509bcb620d7a9c8ff4acd1e52becc6ce84968ee1743384c3ce65576568308b85b2e09a4cff3694969823d0d6b03869cb813240a4dc35ed1901ed9db5b00504453771c7901276e37844128411004000042c86184830824000aca430437c63bc199490ea488f796c055128712ac124dd2ed8e14cc48eefa5a101138ec02110c1028aa6865fb249026e179daa2a0e060be35d93123e84021581638c2e41613e1c4dbd32d958e157649efe8204bc4b042a20196c114d425042100800008190c00905f8482f82417a020bc010001b510bb2185d0cc05866172230b80585b82c2d81416a03c450a004468527a4b1a149e92f16726ec41169d13daa72c13e8b729d3f05fbb3c1372b044e260199651031620c21e09a07005bfe9a3cfdc8e6357d064807d3dd477c31800cc30112431aab2326bcfcad4ea214f93a3a9c74f1842a88fb65074ba227040d85d2df829a216644f5745888de70c350c205b873c867821bfeaa51013061100402d0040002a0689053237fae1220520b6033b7561c564f4115aa690ce2dbfba9861f30339d5111eb95fc8de78758134c28324e359963d80c6bc0c22687c220034634cd54799d7e4bc3e1563b08090f1deb979f858635dbd8942000b0c1a5ac6e9bce466d6110dfa29c9e0c7294b7477730a320860000dc0c0873b583b3384)) <<< 16000) + 0x61282852b5cdb96106446b45cf224220b4b327d342058df6f1eadf0a071c1733e47e10000b61a686df1c029d12e5579a0244ca65304081a16ee705214388182b02c00012210b21d5120b51107f07163ddc1cef9a10e2fb7f220c2651bfbb9a70273c284d74c002d77b8e580130a118042ca080730ae325fba81034e6915e21bd02db8d106149db27840304a5881490c6a761e39ed103515210a0bdf764e1e123f9056bfe969a743093e5ca2fe66013a46804dd99353f6970f80090ab1458103d07040d04c1853acd105e5b52ac1c1a76cf6b0b10368ee1cac2784125bdad30025102300800008a10003ba32404a53dad4393611565c15510a309be3ac611db0f0ace3b1585df161257309a9841528d45f31e1e706022015ab4945db1a5cb3ad95a8840d8020a3d36ea71b75a28fffdc38090356fe503f334d5e3bfcef08020700365458f9692f245812771c1dc42f1b03311fa618621040001b1108b0180045610b321c08302239c6861189ba9ead840ca153b3e80230c2300846c52fff8cd6edf8abef36acd7be9d57617de6d59af7d3aaebea27c7ff534264f5210eb923334a6d84b5cab923334a6d84b5c5bd8c39524e94fb8dbd8c39524e94fb9040c30e1dad85902cc810610a042047001012793f4d05e86952e15d06b5228d9d056b9833dc4da256e205474b566ca9697f583a1876c7df8e6b558befe2a6e03606f59aa9aaf0b6000794045852353a0b94ae6087b9282b96acdadf321834e519a000a3442c844162128104b225e90184f4f616f4c609694dc83a1813be3287b81004f1034fc009440880216301b2425072862530b77e04082b4318c1861227de2e0a0e106ceaaf6818223fde51586001428fd34c7002bd23e36005020460100001a12122230002e021601a0af0d0570680025348568ee9ff6518700a718f1659514b9ff977bf0a660934e89ed539609f45b94e9f82fdd9e09b95822fad81a8d94cf95c99c1d9b4ede4aef113808b0c3876b61640b41851c31830c11000035e5d45e4a9b1e0e5b8d6b50c453e63528858dd3981cc9383d07e5d0b60d4906640097dc49e75ad3031463d2621ac5c83cae929694b0608aa1c4970d2abda98801c340011308561882acc41545200215021520b0a801e0a1614ba1217928c1b34a4af95e509789aa799a6b99da366e0a1176eb2cc035ef328d07698b4490722cfca822a75ff5d97521012cb9947ff20cbe90dde9f2ea90ea2859ff85c686a72287fc1024170999234446cfcd16ea63fa1de1dbf6cd233b64c5ad268106105b02eb8fc1b79b8353a8c0d15654ac16f28bba087c7d608a00054f8eb5fba5426f7c64c7c6421d1187fe306dfa2e59f94b6fb397c9598a0276dec646c5cc9b8708e4b52eb62985f93a305dc681dae603016cfde8ce57407997c577757b67aba730a9da92d91422987082e35e04544c22bfac334b397654a644fe366d9bc3a734138409c26e9efa887c4893e3de1dbabe4312b8d66450944ef5868805c94400df6e9bac529e3a3c0305c2522942a9931e50d8456922d4546b00821a071d87b31fcb2efac7317888f83afd259017d840654dc0ad9aa940bfd9d37b4f24479d0fe58276e3bd73b3e18a50c9c0e3f0c3fead4c077087182e3b0512b20eea7b5a0193e5176ac54548ba5eb2328e7dac0f59e90aef8900551d500e84ad7d46167b8c75b611190c354b40000dda429cd414c6a0a535010988080c403c0a000d0f2148920463d8518c828866142330a005e2285002234293d258d0a4f4978b39376208892b7cb2f0200b5bf10259cebc2203d303ea67ea47bf2decf5e7bfc9604ce92a24800000000000000000118cc1481051090880870000037c947a235905a292d8e0c696d8ba24b251ab3d00d986d3ac13ef5c379646b136d02607de8134757ce496878a14a4defe7a4b757438c5d9ac127558a3d4dba13e0309e0104e80f6ed6a84007016e6f43cadb65dec2d55d1a7dbb1d6c1a7dbb1d6a1391e59029421609a01400003cf47f31a8c505ca2e1a61ca11eff5b3962940f2750cbec4b0134c4ec0cd21f6714f5ec1bb3972758bf3ab463aa99a18821c67b10fe3566f3899d41ac55f863407079aa8362effaa098b7333fffe2effaa098b73340000475bf10259cebc2203d303ea67ea47bf2decf5e7bfc9604ce92a2480000000000000000011841d1764458169db83f4834cc789014050ceee2fb869a1ed5283781e4ba8fe36c744233862462c53023802c000258d80e502c7638c97b8215ff8de02c70278b7988de1661599a1e2b0e159a45d45cfa79af894b0465542a7b3f38ba5a09103b6390e38514dbe85e6183cf51dbeb97d83eec4ae03af2728adccd224f2d459c5fdc64babf7178ab367271cd63372443a45b528ff9ff5dc3b61db1666e8fcd416a8050f1026274868723e6932e7807f34ff2a0048284001091c063993ec714ac09152a5917852ef8e70826cba9c6012081000428801a44176502a25aa743c694722457b84061a57531792021080402700512e646a52c67164ec3dea044714feee39a408072a293550003b5e96a98012525f5126042100844d03c5423c225c66a3bbc0e2cdaee765688e1e21066324042100800006c10002253124c3aa47d479311d1b2683090737be811e29781f47593001655bc2e04a184201000010920008a2400151884d8a80019448006c51c115846cf1e3886e8434ca20044b698518805ab2fde100028304200809a0104c8082600400023e425c054443923c67737299dc5c3dfe84ccbd16084490ca08808304d006000000000800ff9f511)) <<< 16000) + 0xcb1c844566a678e4bfaa763b276235790d024473b69a881cc23004eccc45cb19846a00045842583400283a4254761281b0930584900fc75e98bc63943b82a0c27911959a48454683b9c0e4533c0659a0b629800311d8a6800985084021e39a18aedaca1e529d4d3288c1bbc39743869cb3285b9a0ddc32343000945084020000218424467c314ed9ed57246155a172be80a30b5eaa5ca0060be70bb8c044e94d03c00094608c0201200200012d310fe3566f3899d41ac55f863407079aa8362effaa098b7333fffe2effaa098b733400004774b8796e97002c8d14c14814f1090070050000967a63bbb5d10ab15bff411310dba938b2422892e056d7492488eb9a1ad4be0cb378ea31e8c49fbf98d7131b905c93d4000cec8478482300562806e9689e40a5a233600961a3abf608a6818e4106c41803949302f620ca284401092b7cb2f0200b491a15a11a302e0057565491c0b10745d911605a76e0fd20d331e240501433bb8bee1a687b54a0de0792ea3f8db1d1090d14c14814b0cf040cbb827e96af476c23126473fd68de3d81075d7e137550d6651d5b27e36f79a68aa9d7cb2e3d0ce38b26364d6b93df3b978d5514d62da8001d4908e198028ac1c45408e0b08d0580029f1a221c91e33b9b94cee2e1eff42665e8b042475dbb20707d98584d67fc2033bb122d77b7e1a0d38958f0a2880000000000000000022831bd0ee6673aac787840c2a6f19ceab1e1846658850850470260210200092100b062a99d53e895a27339f2976ebe5e779bf08a62befee82b1d31d5c38770826d39c4a33f5374a54fde14e91b73c5a4f594da96433b62ca8fb7ee8309b351ca1eb2de5ac4a4282d08c015bf10259cebc2203d303ea67ea47bf2decf5e7bfc9604ce92a248000000000000000001192468568468c0b8015d59524702ccb0c304d00c00a0009d94c1eb7ee1c51922930335422e1de3a18c3f2bdc795a82fd65340361a83d4efa41d51fbd69bbee0f4077854076b9d3c9bba65b599452d4b9e6ae104719182061a268af5487a7d353df2dd46344b2b2468568468c0b0637a1dccce7558f0f081854de339d563c308c8c14510b0c308f0480450004afaa7d94e200a93c522c6ed043aee2e90af2179de9cffd402abf2a38c3d0bb400089c8458ec014660e2320006cf211422000bf820d23bb7e204b39d784407a607d4cfd48f7e5bd9ebcf7f92c099d2544900000000000000000023400aeaca9238164504484600580300100002a8045f48b2b7421bdb5e42d3ab2ffc4989e76c3628891fbf9256e75331c00361f208e673aec90320b146da18f271d9b1474e54f82964a831d0cf96c5b2357217dee87f0c71724d50003ec2112620881904382800741084326c064f608a32c450a004468527a4b1a149e92f16726ec4113a5c3cb74b8016b7e204b39d784407a607d4cfd48f7e5bd9ebcf7f92c099d2544900000000000000000023389807002bab2a48e05a9c38e3081920800461755de419acdf83514d4f9fcb30c53f0ccde286565eeabc1126a4bdff4cbe04db1630215888c87f15307d2a3b01453bbc9f9d5adc4a854fd79892eb98805b18a421113cae2285002234293d258d0a4f4978b393762089b76b54200380b5bf10259cebc2203d303ea67ea47bf2decf5e7bfc9604ce92a24800000000000000000118c718408904404800600002141b5d688f119099d5757e55b7e4e0da8b8807666c8130461746cd722d3cdb52f1b8baff420c714b895f956f012e87be29aaa1feae6acec77d06c1277496210539680022810851d0420ec20c061040208101f905dc15dc3a50a2ccdc89aa286055af3778701729b9f1f26002ee4374f200128c120040200140fe0a07e05690178d0a5e3470d16dd49060c0a1d288100315fec97600120c10804380a432f180022283800880a0080200000888000479d1c03724f288001411c56c10242c6d13008c3080021835909ccb18092382b40400a91ef1823081d0087101fa18852487d2fcf8081d350e21c23081d008000050100015920fa1a07c0103d808000978f1869cf09f09061b9e035c6040de67718e010675ab3c1014e333afc2508200087190d48b62c90614e43da86043f66f9163002000803d0081e40400019c41e0340ee1a0760103a8081d0040004a440019c480290b4112fef0ac900803876744f02eff230aa01188108043c7368210af34739ea524e28418364b4d341f2a27d5e1240c200080398080003b08228ac1c8340e2120700503780c1b80400046a41b4440a622000a7720d243912e6c429b11c11780400ecb0063de5157240b286610f8600f42c111c0404252422008027828138140d80a04c050210281ac060d4020001ac207613e31850a8a58610221b41a670627970853183b33fe18f8610ec97ca1400094708402000a2ae30b1d550401832c47f111e7006a82b875000213b8592300004840460100000ec34283b95fc1861518cb43d02842be24b8f081b75315821a055c472828100199b3ade00004c484201000014120d22ba17e911e9f86166924d538a05a4807788804ed95a7fc0024182000803408819c07630f37c892060ecb2f164c48256ec76ca2c0517198b58401496b1c100025182100800288b079a473f3e94102b8b6f6440015de235010087065f620240c2100860fa9d810b67880f3adc3a3887e0fd8b4506401e43745040fc0f5925001b2d13b8058308001000025c4114460cc0a0650100013190003a120981a0420d000276903b250320e818c640c4320371901a02800248880b228184d40bc2a0)) <<< 16000) + 0x01f70376702a5a8d5805f71a1a484a4481208c29220820a08e00c0080020002a54c52f14b49c0c9ca0f2674b8af82c41092d72466694db096b9572466694db096b8b7b1872a49d29f71b7b1872a49d29f72080d99935a159c05a4cd16cd8cf816650a406204400100080033456622f90e92ac08329a0fcc8052775e37d3d049166f73b643f52071b10bae85c62d30b506d75000378280d2985300a5b01cd6c25218211142000400002b10610d03006817c2408e1205e05000216105d3180b18c0bca40b84a05b150150a8168340b2120250901204808814000d4841601702803045db0871dfade7d7267ea64d260746262ab921b825a691b8a30bc5a31d998851627df47736acb479113414a61d9a05bf163fee99a18b908e47c45669d4fc1176704002449dbfde25a955b29602448171761746572f1819af1111c849b5077ac833e2c6002baab21396c26d76fa463db0ceef649b2a49d161d46a156403e1b211d9c642a93c80500adb545f1e88dbc8fb5ae258b77b3f1ad826982a776725078986e6f0ca414e51a38213cefc038f051b27c50601d2a756560461844010822ce2d9fc4f00aa2aa16090210002249bdd1fdd3180076dd52964004200880000802000008880005b9057010000b0904511486c1838a08e071e4ab740044283c01000007f20ac1a0550d02a06814c340006604124760a412806008022840ca3506398195703a3d430e3394767411841080438e322911d9061dfd363ae46801bbb21ad98003dbd322c12041100400003708000d19808eed7aff0b047a10ddb0a0711bc4be4b00547dc698600e97715c0025102000800008290511502806813c2409c1204d0902604810824096020003a82076138141ba2ff4c5165a575870205e47a03f808c30800214598287f2b82056e897b4120009acbe8181001d9e1c380240c2200800006f104a0d02486c1202500801004704c246595302bae076e91020e80438035b23dc160460aca4c8810740200000ea4000414c00004010088020470182180800018482308aca439b036050700e6e04ca0adc1e3038605ed74850090207c0210434ec75d216200ee0f2b1618d5abce40a160ae32eb92021000430b053f9cdf2c316bbf4833421ce455bb142903b5d52102956782672c01eddc81d2604200080000959000219208a1aa0c49ae5041003be1cd142025b38b1326083c008c2043ba6460c1d5fb1f918c11422d8fa140063e1c6e920210004000034882202810c0400036e40013b0821068001bbc81d8e8104640802a03f1501b8a80f8540680a00098037ad312876fcca05965452e7fe3cc9bc7b046c450a004468527a4b1a149e92f16726ec411001e847d4f53315977170f7fda68687d0406fa00790f1450db249e2a3a8bbcb1ea6379d656fd97f6a8599c800000000000000000228f07834fa26816a5823023001800c073a511bbc060f2df9ad13769d4c2fc22767dd042f6c901fc02871da96b1ac51de84feab6951240beb8c298bd35f6128001ed84fea8aa9caef4295ea83ba9ff5d62ea78c86c50094ed4a335c00b7ad34c37456eb38f1a5a1eb0858ab5550d5e95fa07613e16bc0592924020e6756220069b19c84023101f0084900805451a203441c90219a111cacb0b48047c15b5f85017efefeb308033799dc381306108042844f79a8d3203816b382310265a5411923042000801e8280f0040001a2400088481d8a80e8440721a0380d01b8680d83406a1a03401019808000e888191e80028bc80b2080c5040608280a00802304091f550503f3719440090a0e00200001e08178480b82405a1202c050158280a8140520a028050138280981404a0a02405011828088140003b64085040407a01f1d00f048008c2c803ff4100bce73037f798d8f62134c2305d0922887e694ec3f27209148710268d640553b90bc8f19090e24a627244eddbde0015018c0133edfc44a30c31096b50a0179737eaf7f3e4be02b38800be1b9a51ea97b4e659e002819051770d0aab4ef03e49859711f85cf3922805c35279927801f1992cceb57d8350875ed3bb526657b4a0a00000000000000007a240c48a40838830438210000fa11f484b920b803400068080e94c064760381ab7e204b39d784407a607d4cfd48f7e5bd9ebcf7f92c099d254490000000000000000002337d003c878a286d92670386870b2acabef9f3785b0a6117b615000000000000000000884406386306204282400280000008dcd00401a00059e406c6576702a5a8d5805f71a1a484a44812248d0ad08d1816440c48a408388300280200a5ab230cf00b47b34e70cdd40bf8e2be2366cac4b36d8122f4d5d2524dc51f460b031bbf51a56481161cc85b42388005b8d7b8082133df1fdf0e0c390129604604005b8d770400bfbaa90ce006714250080000c110161980d0cc06467e79ec9bb0b63eeceab3d3340db8029883b117d78f100000000000000000000000000000000000000000000ac238e38a38640430428408218000038200100680c00800082c80b94c058a602a3a0140d0098480019dc80902f0c17b214630282cd62ab30fd6544145f554bba60076e227bd10cf98830a1806c78e6ba845a1e57365e42bcc50559293d0586b25afb9b2b8364fa2020010a22904a07db5ce98d2a800005000085113b10430ab22eaefa5c840a05030fdf9f87781ebe7478956e2ba0ab746e77316d3c53c691100088480402400078a403ce401c5a00d2900614802ca40142a0091500408801c0400c02001385200a6a004190018c8008540020200001009b169)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 37 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case3" = "QuadHeightCover12Case3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 37 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case3 private def zz2363:"s093b"="s093b":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l14 l15 l16 l17 l20 l22 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l43 l45 l46 l5 l51 l54 l55 l56 l58 l60 l61 l62 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x43086edf1, -0x547044420, -0x7eb3d82c8,0x85bd2cc0], ![-0x547044420, -0x1459b4589f,0x1f5530e74,0x5eccff5c0], ![-0x7eb3d82c8,0x1f5530e74, -0x2256e819f5,0x549e0b020], ![0x85bd2cc0,0x5eccff5c0,0x549e0b020, -0x2a4393d10]] noncomputable def hinges:Hinges:=[(-3,l5),(-0x6abab546,l4),(4,l9),(-0xd5756a7d,l8),(0x47272378,l11),(0x239391ca,l10),(0x6857558b8,l14),(-0x455e23f90,l13),(-0x110170404,l12),(-0x169bdb3c8,l17),(0x24416a153,l16),(0x78ee6b9d2,l15),(0x59e04e7fa,l20),(0x52b73885,l23),(-0x1bb201919,l22),(-0x2a4393d10,l27),(0x2a4393d10,l29),(-0x6fd6d1c6c,l25),(0x281627cf2,l30),(0x2a4393d10,l33),(-0x23c1eada,l38),(-0x2a4393d10,l35),(0xd68b9d30,l36),(0x2a4393d10,l37),(0x6b468a24,l34),(-0x1d6b31eb2,l43),(-0x5138e1ac6,l41),(0x4ecbe794,l46),(-0x10442c886,l45),(0x2a4393d10,l51),(-0x4783f056,l55),(0x2c76,l54),(-0x4d096212b,l56),(0x3fffc0e4c,l58),(-0x1c2d,l61),(-0x5ee,l60),(-0x111aa17c,l63),(0x23ccd800e,l62),(-0x8f8a4e34,l65),(-0x128e4faf0,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6fd6d1c6c,l25),(0x6857558b8,l14),(-0x2a4393d10,l27),(0x2a4393d10,l29),(0x2a4393d10,l33),(-0x2a4393d10,l35),(0x2a4393d10,l37),(0x2a4393d10,l51),(0x59e04e7fa,l20),(-0x4d096212b,l56),(0x281627cf2,l30),(-0x455e23f90,l13),(0x3fffc0e4c,l58),(0x23ccd800e,l62),(0x78ee6b9d2,l15),(-0x1d6b31eb2,l43),(-0x169bdb3c8,l17),(0x24416a153,l16),(-0x5138e1ac6,l41),(-0x128e4faf0,l64),(-0x1bb201919,l22),(-0x8f8a4e34,l65),(-0x10442c886,l45),(0x52b73885,l23),(0xd68b9d30,l36),(-0xd5756a7d,l8),(-0x4783f056,l55),(0x47272378,l11),(0x4ecbe794,l46),(-0x110170404,l12),(-0x23c1eada,l38),(0x239391ca,l10),(0x6b468a24,l34),(-0x111aa17c,l63),(-0x6abab546,l4),(-0x1c2d,l61),(0x2c76,l54),(-0x5ee,l60),(4,l9),(-3,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0xf81900324860c18302041401e430c0830202b8280380000000007c0348030000000000d006900600014c4204405940100000000001481c40100000000002103880200000000000a03100400000007231036300c00618a20c207ec8028000000001e240cc010000038c63810c180a0000007119408830100000000000c80e4010000000188a40d8c03000000000343819802052441820c07e3401800001986c2203a80181431020810168d00600000001614181a00200010c32044059401000000000b0680a601000000000161c0cc01000000002a1c04980400000005e1c013300c00000000000e06400800002a0e84c0ed003000000002c1c039804000000000038052008000000b019002660200000001686802cc030000000000028190020000000005c00b200c000000000ba02640180000000002d01c8020000000000098190020000008c64240a40080000000108a81e6010000002045101a4c04000000003e0a0498040000000074440f30080000000cc4a014601800000001b13018c02000000003624029804000004d86400cb301400000000d8880c6010000001a44100c8c040000000000360290040000006d0480313010000368860900648020000001203200ecc040000002106c04d9808000004f062006b3014000368820900648020000012618801acc050000000001b0049006000000000058052008000000000580124018000000000240308030000000002202c1008000000000540182010000000500980f06020000001601700e0c04,0x34c130023980a00000006c0b00f300c000000c80c806e6020000001ac1900dcc040000000350700b98060000006f05006730100000000c41806e6018000001ac1200dcc0400000348110033980a0000000680a01f300c1409218c080b4280300009218c5201e900491030308080f2d200e000190530440ae401000000001683814601000000000007024802000001041581ec180a0000002104c06830100000000048301e6010000008a09c0360c050000014419806c180a0000000000840620080000000008a0144018245182101026e500600000000621205180400000000cc240a3008000000019048166010000410c41802190040000042190500b2006002944204201b2401400000000150606600800000002906024c020000000002a80510060000000098440530080000000001580c4010000024641c0860c050000004890a044180800000000008407200800000000a82814601000000000011018802000000002a2403180400000000000303200400000000c8481460100000025210a0290020000092291101b20060a0c4182040e6940180000000130881a60100000000e02c070c0300000001c0481618060000000000380d200800818e210207ec8028246147047020c100600244294128108200a00000005209016300c000428ea1200d08020000000000430188020000000000840290040000000001040620080000000002081c40100000000025002c8030000000004a8099006000000000124072008000014120601e66028000012a18c03dcc05,0x42120518040000009111007a30100000018648811260200000000002901c802000000003a0a05180400001508239026400c0000291047202c80182492060c301f8d0060000e6190260352008090c80830405a340180000000d44604a60180000000001901880200000032140c032004000000000011032004000398c40880b28020000511042603310040000000001c18198020000000034140930080000000007202a40180000000000d02480200000184208126180a0000000044280b3008004685a06403928028009409a0a403a50050000961683203ca008000000440f007b30100000000882801660180000000882c090c0300000000321203980400000000241c0a30080000000000d00a401000000001a11014c020000000003448198020000000064480930080000000dc4802660180000000000240c801000000003424039804000000000048052008000000d021002660200000001a88802cc03002301941480b5a00a000234350640bb40100000000009a0144018000000000270188020000000002a00590060590360114037440180000000001281c40100000001d8b4028c03000000003e2e031804000000007c5805300800000bb1080196602800000001f15018c020000003c8a2019180800000000007c052008000000b021007660200000014846026cc04000002f8410035980a0000000003e009200c0004607a1480ee8020000850f42901dd0040000a81283a06420080000059882006b3014000000005838146010000001b413005cc04,0x318220359808000006886301133014000000c20a005660200000000000340c80100000330308099980a00000a44a1200d400c00000a20c20222602800001541940344c050000000290900698060000194441603c400c000000f0c8280c801000000000019038802000000001c0a071804000000b218c0b43010000000168620586018000003e190a0390020000000612c81b1806000000008c1c0a3008000001060c8044602000000248710250c04000000490e607a1808000000543c140740080000000000e81c40100000000001d01880200000000006a04900400000000001c0520080000000108300c601000000000006c0c80100000000421407180400688b4843028a40140006a166108154802000000002106038c02000000007a4e0598040e0cd081c007d940180000000148700e6010000dc30c5501b9004003c66044581efa00a000001133840893010000589261c010a8020000cc2cc4501b9004000000004a120398040070cb086b03df401400c308409e04968028000c61102401ed00400000079982044980800000000947806300800000000001e0640080000491602807100300000000002a0310040000006513001a3010000000ca23007460200000000009c03480300000000011006900600000000000b0320040000000001b00a40100000022171201900200000722b0e00aa0060000000761e00c300c0000000000781240100000001c878070c030000006994204498080000000000170320040005b1224080d8802001432442040fd9005,0x4b2081a18060000000098840530080097901190069080280000000001502480200000004d2180a180600000009e45014300c00000012c82028601800001021840930c050000ce2283205ca00800000698a2006b3014000000c82e00f660200000001909002cc0300000000620e05180400000410410331301400000820820222602800000000e07014c0200000000001406900400000000542c0d3008000000000048124010000000001740288030000000032160698040040c7106103f640141210a708381166803000000000222c0cc0192430608181020a00f218604101015c1401c00000000d0700a601000c210212408c5005000002082081a8980a0000004305404930100000000a84202e60180000000002f0188020000a82084e02420080000000000b40e2008000000620881d46020000051188840790030000001882202518080000174340e03c400c000360a21b818880200000361486c0d1003000000000062049004000198510cc0e44010000000000032064008000000000320148020000004a120c0520040058894843028a40141581208ef80c3880300000001c8c40c8c0300000000321c0318040000006448380e400800000000f8900c60101641010b701c810060000821882c066200800000002209034300c0000120441a02880180003c0841a02710040001381e04203c20080000f02105003c40100000000000480c4010000000841400f0c04000000002a0c059804000000610500db301000000c404a04d6602800001441840cc4c05,0x1042b026035a008000000009428073008000398980a80dc802000e21461340be50050000000190881a18060000000640900e300c004404105e06908028000000000ec0348030000000130680a1806000009608101333014007f8cb0a0021c80280007819823015d0040000f43205207ba008003b46085203ce401400001021020222602800f319212002390050000fa34048013a008000008508500d1301400001f0c42802e801800eb1861300a390050000000410d006980600000084681c0a40080000000108f00c60100000000211f028c0200000722a0a015200600000000002c09200800000011c7e04c6018000000208e4098c030000000451e80b18060000000883c00b300c0000000108e80e60100010b28c52005500400000000120e0318040000204a62a00d400c0000309042a01480180000000210a018c020000006a6416052004000000f220c0b430100000001e88205860180000000310b028c0200000000421a06980400000000f8e807300801011c318604248028000000409e40d8c0300016a488b403c20080f08c0c9140a5c4018000001b0c8701e8010000000000450248020000000000118190020000000001180520080000000148300e601000000001d13028c02070660411a0493200c000000fca8140b400800000178d0300c801000000002f1a038c0200000000005a0310040000000b21202a300c00002d8c81405480180000000000d0188020000000005c6819802000284630ec019401000000150b86816801001021861b40be5005,0xe62c88403ca00800000001041c0a30080000409481c04680180000042290702d002000010a5105809a0060000170aa2201c400c000000164a2044601800005a29888071003000000005a52051804000000000b95033004000520c20a017c8020008609e090092d00500008c1202803da008000000000385033004000000821081d46020000026220c044cc0500000020842025180800000000e874063008000000001d1e066008000e41e43601590040000000003b809900600000003c3850340040000000001c8164010000000001d402c803000000001d000990080000000000e80720080000308a81401a801800000001b0e01cc020000092410a0112006005a461828011340140000001348a028601801631820a404cd00500012e41850043200800000009643014300c00000012482068601800004d2185009900300000984309009a0060000000094280b300800000000170a0660080000621607407900300000003a0c807180600001846c1b024400c00000000a8381660100000000000b01480200000000521a0518040000148620c00a400c0000000148381460100000000363201cc0200000000362c0298040000011330408930101a11418e2814b8803000000001e0d02cc020000005c221407a00400000000010409200800000000004206400838330210d0249900600000000621a05180400000000644c0a30081a19610668124c80300000036191203d002000000006a1a051804000000d4483c0a40080000000001480c401001031680a80fd9005,0x342c03980400000005221034300c0000000005202a4018000000000ac0348030000000003280510060000000000cc062008000000000d801640180000000003103880200000034082009980800000006a2100b300c0000000dc44026601800001b6290032cc050000000034220398040000000064480b3008000000d029007660200000018856026cc0400000378510035980a00000008c0900c300c00000011012014601800000021024030c030000000420580e180600000008e1100b300c0000000108480e601000000228210058c0400000440208013180a0000000881100e300c00000166408112602000000002105028c020024838c6180e9200a004085187501f14014000000a61a01bc602000000144360278c0400012242870032200800000000843805300800001d0d0160148018000001d1b0701900200000842b0601720060000000000140920080004b8e61480b080200000210d028055003000000824c2602a00400000000984c0530080000000cc2c018601800000018858070c030000001a02206d18080000003204c09a30100000000641807a6018000000000160348020000001082201418080000006115408230100000000c456044601800000001916024c0200000ec3905006200600001c8760e01c400c00000000e8300c6010000000349940d0c030000e621052053200800000ec4413026400c000000000d0a06600800000002521028c0200000823104806200600000000c42807300800000000f8900e601000000000017024802,0x2906009980600000005a0a00b300c000000b009002660200000000160601cc0200000000000c0290040000000000380720080000000003a01640180000000000d02c80200000001f058099806000000000487033004000000001c002640200000000002501c80200000da3905809a00600000e4340e027400c000001c948681c80100000000000740c8010000000000740290040000104723103f400c0000000e46204c601800000002507014c0200000000002a07100400000710a702ea301400720a907c07e88028010510408409cd00500000018842075180800000788630113301400000ec0c202666028000000c4210128c040314286206054e200c00000c4522103f400c0c10a488481538803000003a1202c069003001e224c3181e9a00a00000610610351301400000000c8781a60100000000e84c090c03000000011048079806000003884302083014000000721181106020000000a0110078c0400009c1502601f20080000003908c04430100000000001c81c4010000440c41502890040000000391881a18060000002b07406830100000004e0c80d060200000000a83c0d0c0300000000120c029804000000230540683010000004104e04906028000008a0ac0920c050000000110581a18060000000220b014300c0000000541e028601800000000120c0cc01000000000024069004000000004414093008000000000a202a4018000000000110248020000721703a06620080000cc280740cc40100000000b44a02860180000001588c050c03,0x2082806d98080000042025026b3014000000860880d660200000000110f014c0200000000001e0290040000000001e009200c0000000009e01640180000000013404c803000134218660642008000248430cc0c8401000002508432048801800000001e0901cc020010a1b416006c200a000005a08300273014000000ba21802e60200000166218011cc050000002f888033980800000005c2300f300c000000a824806e60200000016c4900dcc0400000002d1300b98060000000582201f300c00000b210400ce602800f208a0b406310050000ec1283a0662008001b42282c00d840140000000001180c40100000000013002c80300002401860025980c000004a863002b3014000009f0cc009660280000001609c04cc030000002506600d9808000000480e403b301000000930d200d66028000001243600acc04000000002c240398040000005212001330100000000a84a01660180000001902c070c0300000000034581980200000074542c0b4008000000c21181526020000018810c06c8c0500000328218139180a000000210440ea301000000138a8880c8010000002517130390020000001082202518080000000005890330040000000b8f1a068008000310841602a90040000102096048a180c000000510500db301000000a404a04d660280000014c1101acc0400000104108105180a00001084a1f01b400c0002a89a13812e80200000016c4200dcc0400000000140c07980400000000058303300400000000a8301260100000001783004cc03,0x8a0710040000000001040b20080000000001e80e40100000000017c02c803000000000072039004000000d104409630100000000088281e60100000000320d03cc0200000000621a05980400000000c4380f30080000000000680e401000e21860c4092900500000000441206980400000000004c09200800608860820524802800c210610806c90050018a20c228139200a00000006211016300c0000014e09012c602000000002a0503cc020000005282804b18080000000a20a01e300c0a208304f81126803000000404710258c04000000007a32079804000000f118406930100000000000880e40102832430c2022c90060000000710600f18060000000000a80d200800000000f0681c60100000000c8580b0c030000000190900618060002fc7204c026401000002d8e81602c801800000002906018c020000000510600f18060000007110c0a9301000000e41060364602800001d420c09c8c0500000000003a03900400018c4c0cc0ab40100000000118a80c60100000000019002c8030000821884c05520080000000004f013200c0000000001281640100000000013402c8030000000013000990080000000000980720080000000001481240100000000000540c80100000000005402900400254330230233401408a86303e008cc803000000001106018c02], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((0xc2d330bfeb9e5101ecae330aa50ec4606888dd41cb0c007ed097f9405902e526240028075da00138c0f8040ad417c672827bd61c502297f6e88229813f9a020f1c2129418006c9b66500128a100042482e349e25d33c2c91f86691c094968fd208abe15b1326258fb688f4208dff3c0b8800021b37bf10005410a2c9402108042b03bc40000000060daadbad75bc5f03c292099a41098a408282a8028060100401a00021264839c1c6d30a6786f6ceeb824702e6f05969046b6cd6acf2626f3a4123504122fe0c38020000a8816ae0800348a66399480424014560778800000000c1b55b75aeb78be0785240820f15310208c05501300c02008034000424800165989ee7071b4c291c1bdb3bae089a0b9bc165a38fadb35ab3c907bce9048d40828bf8a007078002a205ab81800d22998e6520109005113c3fda670f3f038f376e076fa483840a86993ebe8241a5450bad6a68b045e9b211b4260827c444ea10ca500002cb4178002400411b8fc106cfa10085a0580001f5256e020003cc303954130b6489a14e04ab340c079e96320c35a36a159910af05585940823c0cc7343800112c142040028671ff0a01084021038516471cf9186c4e5ca1010b0ca0ff221d244273fd4451e0a04509e01bc604114b891371130000e4e1c00440003673d58ca4021300a00006dc8c4808ad8040007104003480f19e09dedf020984c6568c70372b12724602097901fc6001caf2fb21284100043cd3a43ff2d3f6e81811b6d7ace8c05161d957bb08081e13377ccc80f7d24207e48b96e8c2802d9f72f708098d0002a304276dc0200185340c4dbc27104021781e2b03bc40000000060daadbad75bc5f03c279a28a50878448480290080060100401a0002124000cb0864828390141ce0a00048720025c870b8495b95bc89e512189086c34c28fafd7941766886b93af8c353c109216aae56980df90bd562ece001fc9998880501580fb4adfb0fa1010520582b501e97bd2e3dd269202439e668040c1b9d7e58027a34a2e120410004207084ad4c5ce314617f08e7961dd698a03c1aba5f47b1800079034ec1001962724a4c0842010ac0ef1000000001836ab6eb5d6f17c0f09c69c51220822219c19e0a201804010068000849000256200068c4ad02403c1201d0900e02800168081c84eca1b07682c3890dce4e212c91f90f69c30647e8791a2c19f9c466824059be3a460260c2000815982f4b6c0341ac1a48229f3ee030e17c721485800d936cd30902084021038104e08574e31a0e98b3f8f2c641f03b3041329e3c3610f07162fb0504c00035c4912410023c7a7ef0a3821200a2b03bc40000000060daadbad75bc5f03c281c71488870820878210288060100401a0002124000a6ce97ccb3b19669207c2bcbe186b93d15985801b26da6e12041000438c598867cd9e58960438b04111f90642) <<< 16000) + 0x878334417b2b30000c0a969020038267af09810840211386cbda8439c5000f422f038804cc3b5828880037bcf04e11aa8f569d0826f3b8dc023c17d54c39d0880005b8d800a0108c0200003384000ba08001ec100078220be1a05d0d141868604240720200094a38592ff91a3e30a05019b0e86882a64d030080c026c06c98e1801befcb91432816b8b7010520e5dcbd8a00122eeff29402118042b03bc40000000060daadbad75bc5f03c268840628610448278068008060100401a0002127ca005b8d820c28677917773478e3971198d102eca7c5818317a03e4e050cd86630331814839a6704a000d78ddd6280422008560778800000000c1b55b75aeb78be0784d1cd1080c60c50c604f00200c0200803400042480015b92b205e161f2cca6a0c284cbc5d8e9a20bb0112331432abac740e784037e1040020ac4357e1814001d7f60f5270423008560778800000000c1b55b75aeb78be0784d1cd1080c60c50c208f00100c02008034000424e163ae244fecf2800b71b04185069ca233a3441409f3618286538f6f16420a86b997381e080f8416a628003aa707d0500846010ac0ef1000000001836ab6eb5d6f17c0f09a39a21e19018a18411e01a018040100680008490002bf25620200057f25601a2af0d1570681583455a1a2ac090005df1d206a4c64d6408710da23e28294c3bb5c0410b89002d0104db9bbd4000011537b6c09820840205560af3a761006b4fa4bc157d5e3f69eba92d59682512042033022022011c1141340000032180200d00013020ac23c1c1491f32c70deeb77fd0709aea313946083376228cc026838e5f0300a9b99bac02610200081550480005188388cc1c066552322a8191538c8a985400090e417c560ba1303909c92f2d9219c0e10089540d0104fc196a3a100bf9c1d17e302005b8d1a0409b34f888c08253b724fa1207ef0bfc4000940c1100401c055822c7793fd08105774ce84b04170381e2403178f9cca040b860aeb0800928e10804000043c9528c8a90645463201f191510c8a84440ac22039050001c2128a1594486ca202650e1328609e12512a14f79c33e14fe6522097d9799861a000295bcb848084401081341e876ee98494f2b82f8492a34e60761042a0067ac470cfcced83a201eae4ef04010493bcd0331e0002dc68d0500844010000194384944a8265670cf853d39b8825f660909868000a571901202110042b03bc40000000060daadbad75bc5f03c281261249241070c80610468260100401a00021240007fcd90512a386b9a2be151b9541877d964a04180002959efe480844010ac0ef1000000001836ab6eb5d6f17c0f09e41641040e39a296118082098040100680008492a00100010a1a1ca253e2ca3047c29c268420afb319e222c00052bb518901088021581de200000000306d56dd6bade2f81e13872871c73042832c104140030080200d000109253e0229e010001149ac0ef1000000001836ab6eb5d6f17c0f09861648821211009c01801000180c0100694d0481580600026e4a7417861451438e39431428e28c18a196068000401a53803e2808775c22e2870ea71e9f44d182f5fb15ba3450044a9d380c10b0e817f730824097886030e0560d867d001c190e4c35df430452c1dcdb832410980400003ce793a285a39e23dfe16feeada16feeae07c4e1ca1c71ca19014d14c04204900c820080378a010fe20a98470e174e402c088a1c2e84e78a698e3a10d8ac93893c612bd07a9d0e80a20d9d8357c8d146864d8c38c98085d38f7899d081ea3a4999e26626410ac0900004324000d3094d82815815581de200000000306d56dd6bade2f81e130c3042c42042c3242300200030180200d29a0902c00c0004dc82b088001e9c88b84c4540622803ac0ef1000000001836ab6eb5d6f17c0f09418c19210c11209400c0001c96dacf1fc7d40b0eb83cefaecc5e4bbf392b9a2e30be1fd2991500f88ca604652e231440d0001069b31bb39e1ad3e92f055f579ccefae30392ee094800d83b206b4fa4bc1547bb2e29c21fb15fd025085bd2cc00016e346894da54473621f672b209003cb9dc3168c03b4b0987f97d43a40b1d82248d064177a8fb595b833854028bfb5ed4b7eecd0492c6c37aaf800000000000000000115471cb189086040002b2a0e62ca67002acee125f6f73cf6353d583671e149808d077c6f1d7ef0a5f33e6d72318caa9b3cfa8fb71617538b4a08e1d8d6e2712fe7737322da3d42dc9157649ec51181da3e42098f8d3f6fff539bea518dfa39ffacac7901c5769e1ca16a6ca16990a3151214d4b1d4a580652a0300074c25283b05f1d82b0eca4c760ba3303919d884f5e6039c4131475b42a101800b71a340c34adb871fc584fcced76e03047b5e809c9000022550340c00dbb816260002504846010ac0ef1000000001836ab6eb5d6f17c0f09659218619a11611a01600e0000098240100680008c91582500f92845c3622a0311401d0c09ec4be7f3df7f8f0a0c408edf34c62c21738c18277c7f491f1270041c2000ad49ba413867586021e1f5723109b1ad90a02df51f114fd74a51e0000000131d4098f6b2309fcbc91cfab98f10c2000004f441c0f5a1892ecb150c2eb6aeaa325edcfd46673c52993a66257255a21035c38b398bb6902849658d2ca6d9118c292bb4a22c844c4a0c326344f4efe18cd27eef002b742e46e7682c9659bdc8b85edd6074dc140e4db33095789c9a6f082c6618b18f6bd8614a1855054b8ea0e00afed909a69bf0b0ff92589c4fab20df5b4cdc7d22fe2)) <<< 16000) + 0xa75e1e71cdaa21ac8fb36f2a619e288266ce11dd001be147707301fec1f4517820ce8b59a1be860076f21112ed9fc5e98bc6d43000cbcd357909e8088d6ab87cf4cf86a234024bb5e5f595de8cabe0796217d94a45301dde92bc333e6814237afa21c94b692164936af9ff9f3ebc4a2751c28c86056118401c39263bfb8412956f9950b9d8906a89cf5b1974d356a8d684f99976f8058970e45e91a799eb76f27f69d4a11167d70e17f25d2e13fc97a8cbc6841114bd71a34764093f31a97360571e53c213afbf11334bfdd61a66183c1a524a26b1d103a7bc9752321407b9122190b5bb93081363c36af3e877498581e9f5080197a2042842bf01241536fec0bd75410c2db8eec5cdc4c04ebfda4fed5ec404c9cd0d88f82e3c20cbc0e1ead8b4adbe5ce679d92aac5348001e9ec9e73420f39a5ea1de029e579737d0e387666e78df230abaac43ece9edd39f5a8a3c9ab551f3e93742b3aa467028604918e825f6f3a72829a91ee55b00db9c571aa869dbab03acd8f7fd3b684ecb6a10b40ebb46d6aed50f727feff606af720fd548bcc8a4e5133a29007860a032e85c643acda000095d222e1b1150188a00e08397e11439c17bada072f9f65e9475e498537be59987539fcc8ace3654d1390965081365f16725569176fe8798db10cc6a47055357c2eabbc4dd2c43d7971139533902cef53bfbe5015dfe261050c751517ee45db541cb6d78152e480340407906aadb6e389cabe235ddb8d1fb158469ab2eaba4048bba540aedefb0736808f7c9cd7298f1f70769144b452b64e819f900000d4cfa6ca45ca8f82a16c218f7c69e1aaea160e0691108344fb956866f83514e7aedbccd9599acb3d419e32b352d99bce707f3ab16bcd41932582ad35d2092dcbaa2cbedefb668c0105f1d403484b900f675044506bed858688e430c170d972cc558fb419348fd73b0b24636324788c79bead0c2b3d03d8d4ae07dd481e60652413c1da659e57150c70dd52bf4649d57b7ac40e27a24b7ecdd7bbb5833dbcc2195bd0453b69601f57181a0c928319cc103496d3d3c50dbdfcea4ccdc9732f397480fcc546767557cef93d16e9873807d474312323a85c0005a592922d148968a40b451e5a001d2921a22200234b20b07a28e3100200e1252459278cf49571a4af6461b21767a0a89429410610a08408e00a0080000468e50b035f1e1d9a18f040754c3bef80b0489c19505d0581c82ca3407ffc5ff8383cda11892a381f119d1e1fc0b304878619e4593f41ddaf3037d08731874d5074fcc2607d6b5c15de862800000000000000000024a19d56452f864e52dc0028a45c7b3d8a9db85697afd78f06e1f00000000000000000008a349571a4af6461b21767a0aa1620e21818a188100053834e08f90720b02b8ade4355ec45c993c860fdbc8c568c8a637cb07af0eab295b9e2bb2d21a2162861d26f29d725f50052418a94f187babc0b327352762dcf0b7bda9780e8226027357ec90e16d2c55f367b27a5136ac552558d1d28388358c251c0a432ebdd28c01d89d64f1f5c389cb85aaf2580a16d3c1e480cb37caaa020c838400100e60511d028000424e7b6df4b23d1072bdb073c95f700da38f0aefda59ef2f683e088956f2636cb909ca0a64746ba19d11bd008d581de200000000306d56dd6bade2f81e5f006af80418162567490054f7016a837d6c125cec06a0ba85112a3854ce38adfdcdff5ac252580000000000000000004852c6280180100050069a280f24c5f65d156740664940d192aae118dab4cfdd5d1056e7c6b24d7ca258a11b22308212a968355744e48b21f1c459af812a5f369e77a12ea597ef8310b59b60378aa848b21690a983c0c4da02d0519d2abcdc820e9a29116fb732e25cd520bd9b83a6126dcbad5e422b8550a709a8a000e6c4a2c14001ec84a28565121b2880594382ca1817ffc5ff8383cda11892a381f119d1e1fc0b30481112ade4c6d972139414c8e8d7433a237a0119ef94f4247be53d08d08b0adaad6c81cf20447b80b541beb6092e7603505d4288951c2a671c56fee6ffad61292c00000000000000000024219d56452f864e52dc0028a45c7b3d8a9db85697afd78f06e1f00000000000000000008aa588388306404133152b307754a5ff701c4e36bf150d8616594b59dab4a82298ba08d67049e2d7a2e526abcc1757d8f645dc9b96cfaec5a43c1ae79307687bfa9edb0ba3f009412b6a9dafafffc21b61d65ed3457a801c41b2bc90e8d1de6391416860f6366ee60c077b66f37d884c578eea1216ec0a3f91c85331bc97dc7df0210f63a56c40e932cbcc1c40df506ea928080a56cec41800363002ab04049080900200001e262255bc98db2e427282991d1ae867446f4023560778800000000c1b55b75aeb78be0787962b316480a6445a6c09e81684229c0b54744d9d01f5a8dfd776ee8c3b3c98113580000000000000000001299677da3a340a51421c11801000407f0ef3561c122e1a9420112ac795c485c21e3e11923b06d3283b33da3e4547999f7e3efc6e0501983718a02ef164c69a86c5829b5bdb5efeb35b468b548b25741f1dc8a7bae0ee630f12d3dbef2ff81e84a9497d00058a250a232840194180e840c0f37fe559e869e2c38ad9da2a17992f46a169678c2ccf6784c4f42bb6c0f6af9de854184110d7eb079100606dd26d70471db8bfd73f49b2013d99c31f0b94b63db03e56deada7204019fa1f8110521bd9858b13f51469d4b60b5daf118f3aa3279adb2267660b0947e0cc05b6000b9a30c3e36f610e3f01063ec72b)) <<< 16000) + 0x0f1324fa014c13e756280b03ace2f59156c40e58b79000b565d038078e966e70735da42621a734a1e04ef5150429835d96febbb9c3c726ff2c1890267095e5b540d512fdd63889fbcb1625c24a166f9376ac562fc7060f80a52b74f86940d4fb280d82c979a967a979205ec8e21486271a3d083d41b71b7a90e7ad445b48cd470f90000ffa4160c45044a28111140008005e1c925a289fd144fc8a27d3d04e18891c2400537240dc578376848e6b5ea534070aec6a2cad32ffcf1824088bd8a38f05dc40896df65e46c02c40c20d09c83e0588b0c70088c7b631044b301002024b1c5f9e41e800440011018538dd46a366eaa147327e7600c36c88a303233b61d0320000b2cc0d2591e2babba0c097c4a8787cb31412b081ca9b4f618251406983993020425b0fc09d9d8c0023e9eb9ce14140ee13948db9340222a2888133b3e6b9998901302ccfdfd50a0dcd3b817818000097493e2a89ed144f402cf6dbe9647a20e57b60e792bee01b471e15dfb4b3de5ed07c269669450e4021820825803000181001006e9406b8eb5f251459f3a530459141077a7ac51028ad3510458f9b6ad3c7050e2bf707b82380039c9e214013881200400005e4e7b6df4b23d1072bdb073c95f700da38f0aefda59ef2f683e134b34a2c82872022812c0180c000080374a0822719632c8b03f8167b2c7c29788e7928714ecaa6ea30102b5b08872811dba04d801c002ad1cf3d9c00900200002e249e4144c80a2780511a028000ca480d82e0700db53beaba48d70720863b70a14008f0d1800122d10207d8ca42050d0f795ec0050031442cb6594800d90d0fecd0000195b154603c000322070ac0800003da73db6fa591e88395ed839e4afb806d1c78577ed2cf797b41f0000000032c41c719bfcb98af06169183e430c40a4884083883800000001720010068000e992521993b82c9d81649e0b27501e7b6df4b23d1072bdb073c95f700da38f0aefda59ef2f683e00000000658838e337f97315e0c2d2307c8820a1ca18614c0cb0c40c02e200200df2c5662c9014261461238e50c60a30a600300100a1910010068000649c28805d92f48a1e7bc569464a1a23920452061421cad8b00a098973248b4c0464a96f100b04014d99618504960a2ba7ca01090021855fbc52fb29838284711611630c0ec738814307534fce58c28efba8eb1141031c465df180904b021fd040136843e0e340212004000068c80f848344144e80a0003a0207213a22630f2f77c3a3384f08cdef28503dfe64789ec8b0c49127605140413120721df9dca04b68a2441e389f64e1fbaae53d6477040d604dccf8f2168ad9af9d491004dfbeba7593f632e3e263a02000f49fe3f13e19c06b0751e100565a769007413d0e76dda09b3d8a9664d4c0f38e2d0720000e2892590892884492422481d0650a891c1400154440dc379edb7d2c8f441caf6c1cf257dc0368e3c2bbf6967bcbda0f84b24a1ca14914b1051060c90b0000200d917c41c34a85888f65f9881c49c437d860a267a5220e450309ee75881013e75014898008402000025e73db6fa591e88395ed839e4afb806d1c78577ed2cf797b41f09649231428a20c192110106160000401b22d8cfe31845882cad18550a2531f29474580703e690e0a009378f8c6100f4b57d0ccc0044010000135200053249cc2612213f2c5662c90143581174f3d099f89011cdf60e923dd2f3d6c6deb8f5f3919e5080000000000000000000239b76e11053bd426f00e306d3493d9f111d3d81f87304644608d440000000000000000008c7c220dfe39605a1019210610208603846c6c2e4c97fa3dd9cf8617593fa2c0ba920dc6cebbc78feb137ba72f197d47a1dfdec170d65f39f2b3d50242df02f60680d8275651c1420108978219c1e7b8999e6b944468fba000a5649c8544e22a270151378a89b8544da2226c111358889a8244d20a244010005cf12682993390f3db6fa591e88395ed839e4afb806d1c78577ed2cf797b41f09031028e21018e19010e104060000401b23f95d09ebd0e2297f1041a901c2e07cca01013fc04e93b8e1662431b2e8408698ac81d0201013b1347ce004801000017124cc0b0690593282c0e01723e858ad6f89033478959ce0e22495a5357101d914f10889012ca0e431b0e166e500b17a4c104801026401d112f4f852fa2474a9b70f8e922164009b37081084f98cb0e486df89a412020319c7529ec8200008678efc270825008592192135b2828890383ac97142aebb20ec50a10a2a3e8932488a7f0807951c1136d2ea270200313e635b99c10940214457770c1be4a1596663a47248a90a42eacb2842fb97b2db922000b71afd0b001e74ec2004c084a01000014920005bc40011d481c0080017fc9318c8988644c2322601912f8c8978544ba2225c1112d828018144b40a2590100280800295092c18c0dcb784e43997211866604efe460098db69400023181f008613d5da797830da47c8a11008e38408c2c06e0198da012080f8042020020080000223a40439135dcb224e9edae241022876f5a1c30c74f4601a00cca2d5380094508402000021840008e481806ec605cba1f69234e5865a005042da47ace5803e155f6d000af45f6ef00004a404201000011224ae03804008023c0affe286e1001e0084000040100000447892fde550a589139d740030fb2427871a00c71aa8c1801d5ddfbc4a083e0100000fa200033a40d8378398bef3bc242996a426a0837084830840069cc5d20048203e0100000d534385c12a4a8a11cbdfee7960800c4a)) <<< 16000) + 0xf51604a02e0da81206100040598244ac0a00010124aa32254191298c80c46400089e4948864a2132500992782c93807112ade4cdb2e4272c261fe5f50e902c760884aca3e1e2200d44eab5b724d3100e769acc3f50bb435377ddf7c65a00000000000000000004a17948af17e907a4007f757d7ce0cecb6ce0762ff134a2675c90000000000000000010cad313dbc6740b41852c22011410810036a19a3cbbb8096b503b38b196a3fc003a22146fad20c8ea96ecbe1db9f8ae2c828adfff24cb3579f49e8bebd8905406a849d7507f8defc41f945996178bcb195fe7691771d9b5188ddbd3fc0120efcf8c0e954dad49674c7aeec7965197c582c44ab79336cb909cb0987f97d43a40b1d822560778800000000c1b55b75aeb78be079593431d80fc9357b17de0fa1ee0579f67057f5dd925507b9800000000000000000422b4c4f6f19d02d0610204b00a0010010934d2516d07c1d49511b6522d725543c5a2c8e27ed267cd5021791006e71a62e728a9457a1b226674976a5a4bcea05f789535d1bc0680474d36ad029b557a26480fe2151e79f6a325084d0004f720ba1303909d0e4a20f61d18414860f369612b769dd0ca0a4e9d89a8405e42757f200094608402049a0bc202d4230a799736ad50ae5450e63317429c9733cbf3152ffb5d5afd03045da4c80d0dd8487d1b045f5ea53d18f4af1bd92130f1779c6ccb305805d4144de8510ddaa86d3b11cddd0dd34dbba13f794ca2234da9fb0280b5697ea6cd2e4e4cc9820d8a071ee8a453525536bbd22ac8e8d5a4200c7cfcd3bd5e32bb8f5a0a3c077f8d4f3532ce371e8b6f677fec9c2320117aa678b1994e82d8819a82295adc4c179ff38a39377e21187c14748527d1eac2a10a21636b9f810dee93a95b720b9bdaf6c6c253a67fd5cb852d6e1f86c55e9e9da5db83e67f13ff59c54e107364b80000e064930140010ac492ca449452249291241283287448e0a001481248c5b0370df11e7bfd64e26bb922f681eaf7284a9908fceb1f62f62f3afc930bc04262077e37ba5480bae9e20882c5d4d962f8ddbf0000b55f5a696cd33d88f768fcb46255054e0971939e423f36180b0e7f4b0938fc5fbfbb0f72ff6155d7896fcda0c4591801a96068f730dd12ee9248a496df7e5f3a6b657733004e7b5b11ec89ce646441558b469590c6f06bc58d628de23129d4072b454f4bc529f7c5c112f154e76c1432d0edcc58a15b38dd049648c811431f661966ab1309fa78f1a08593356a9f6994bc4afa5a574f2345452b1c7f0cd8d2776f54dd3b57db02eaf2fc29f19c187d2ec405f8e73614eda53a1e28aeeab824501122008001ea4d51854d7527f95018ba06f2fb1d35e29b1c851f92895df3b2a040000000000000000008c3d92503377c2122b880dcf55779ff090c5aa8936bc4e02b90d38000000000000000002290c18818e08808e00c0082203ae52fdd7b90f75cf73cbfbbc450ebc5b9dd5a20cbd85ac078c9efabd632f75a3bcd9b0d0a580149f3483ce416641da2cb275312bca0e50c36272bbc5051358da0cb3d1ed517c03071934a50aa48602000517203e82002afd2484bb2415d82b28c900b647e4b23e1d91e8ec8f066476230057c02474bb2391991c08c8dc3446c0323501ee2119b8a531a692e58d343f668b67e01044aa1fd2dc6bfdd44597daed2683038451050e38c506584384582500000060900401a45e0389543fa5b8d7fba88b2fb5da4d060704e1ca1cc0ca0cb08c046003000000b0b3a91ce9377daa102452b612f711d5fd0bc64142d87940006a891a0ce00360ec81ad3e92f0551eecb8a7087ec57f4094598dd9cf126767decd51c0f88ce4feb84f482437108cdc5298d349648f009f96d680f0080c91cd18b1891890c904000c3713ea76b2019cc15282d36c60b5a796105330122b0adda733a128337e1d677704cda0faf49d3c9bc28667598a67fdf7b57e9628d82ea91980c8c8060007fa47ec763f4331f819c8df9e710aa922096b3aadc4024e48451f9a0070707962581d9cadbcf0a001f2f3dfa000080931c110042881ec6f2934c1cf3803c73287e1dd6ddd4b0b6da1f21320201b667160000947088020462132300191780fff8bff079d434c05e3151c11107f1960b27a782703ce9d8401ad3e92f055f578fda7aea4b565a094dc4233714a634d25cb1a687ecd16cfc0203387307287082180002c443d7968f3119cd3abb1094fa996254fd873237d91394ececb2ec2860e80a9e1ed9726df0a027628c9a621dd9a3a657e69863f64ea778c363f4a1e9681c51c79cb4e88c1d628c2e25e53cbd3d04794b0d71b4fdd8be6a51dc67d0004ea245c4a22d25012928001a6080d88800206491398c898b61a253225299120af8723de598bca1fdeb055242433adc5a18870cfdd8c6882810f4e7c518004947088021c3820314e4c60ebe8751e6143f42760bda40667be43ee0e195b4cf72808121c53a1f020930e11004000050c80d8ac8b0574384c8e406f9c68917b472268c01a6a5bee30b5426ace916342c8b5b99425d39428f8648c22a1eedf64e6341f74d694201f6b122273bd1e74c6e03806fa40a8a8b7a778f40820c018caca1d4ee9d0b95e3e60a02ce8b2bb6f2afd4827e903175fb212f9ea7c1b187c1055221ee11e0e50a4180000399222e231150188a00f4634ec0d85259a9986a0ac68a6915ad0e49232ecdc32c607bd5e37a560270e2c2e2a0c708363755ce0366371362d3454ac7263526304653c66a46c4431ddb335c2cfc199e2371411a2d5595934a90eec8dac01f18671e)) <<< 16000) + 0xef88004ca232ed368312c9462b6cc6bb00d33ed2c8c96d0fba4da829c1cbc876f7a21e4678256bb140cc8ff37eb96765248117c44aa1eebca18dd159bfcb98b286374483e268c50c48c384304282680280000d8e7bdde4c8fb6d741443d953c5601101feaf07827b048c82150001c324565222a291148688a034000d0a488cd44446a2213501b98887c4443c02034010006e19ac0ef1000000001836ab6eb5d6f17c0f44aa1fd2dc6bfdd44597daed26830396785ecb153c05998294290292008000086a22941236615669edc039d18634dc4f10fa00502f038fab94735e5639f0ff117bbf2d710adddac7ab1a4c5ba8748403fa12de18b9345b1349060903629655115705f72cd931891657e0a9ac2055ddfa3b44408682e82b728143e45225c0000494b08802000023a489c9606e4b2262586890c8948644823c154c82ce93d6974f3cc3884abd7ca98e0bfb6fda60aee4b31142958f628476fff6f6ccec5bf854518c5a6173adf3d14335b72050c994775489e3a8e160f1eeb5e505acfa7b73911b751100c20416b55bd4279f1f4b8c1b18a6a387f6335717c7d71bc14d8c504db23d6b4efd4a9ff0262dfca616d6011c77cc2ee2250a1f860807202b3ad1372c124bd911bc7208af53a47aa7613ef373c0401aadbd6b09d30ff0cdf48629e321907b46fd72668b478f4f5160008fad0ef84488bf0785f9387337f24d33b7a628bf274659df68e8d02a2550f75e50c6e8acdfe5cc59431ba241f230528520528314130010040018715e929dd029fe96150d1e2fbde9cc4ad70a69f0db57a9651da67287915e80010a12232d111168884b44401a21f0d10f0080d00400122641393443a9a02f1d056068003af881b8ae424131ea245a16f0e8559741378e470a856b07a2d2f374d961243ec4eb1825634e22a07f80ed31895bac6ab820458faa2724a09f04504b2e7855e240116642a0e079663a12ce7cf494060045aca48ff349a9b62fc10b244000000041450ab4c6bd96e1388f8eb58bc2015d38611ea9756052de2aae980821450d5830ed1ef896e38a4c932852dd3b2b76b894d8fce86646a12000024d9804e51a08bc04e8c08ae2a6c41e2114125be5ec67b5c4004c42f73aa138703807177b1ad90c01b1aee58e762010541f87c2026ec480d1bd28a98c21011faece02972d0a2f17334178180000938812ac8871444369b21a4910ca2886046044222170510b00a8551161cb1dc4850c65d690871b5242cff9720deca880b217bdaf06491c2320ea327f20c3042590f7fdad5280b93283a3f2a8701d9fe3a8302c0044155516021fa09fa458b884c2e0306923bed48b0b42123872d5242f16660a29436b6c9bf962cceef3b361d650a477b3b167cc0c2024dbc63c3f030013f779272e8000028e3bad0a27811282b0f143e11561cd0b80b1440db482b691a60c04c84e51a814317b964f721630a580c36b598141085e13840d81822646e8d0c818052b093e58d0500310eea3130020103aea96330029412305404021509c773c4c05570f8ed87c6802a251070e68c60c38a30a202300100a00e4700401a0001fc474c843a4421d12101b8e84e014000760473c879edb7d2c8f441caf6c1cf257dc0368e3c2bbf6967bcbda0f84d2cc14b14a14d046000000623d3375e99d8e7e2e5b2b950c197f9560daeaad8b23f318ad88f37ddc8135719108c6f56641f910e9890c43ce0a3e57ea3cffad2d6e3158efc58d28882b835fb29bec691c2815bfe15d3102823ca9ed678c29c20cb1f7a961abddaa00d61c13cb2717d9518020052053851602f659e6135140224efd968a008027925050030d184ef38a199835dfe8bca31850a7ed22d470439050200c80020f245e80600257a082400001b141180200005388bd9684e014000740485056000dc04414462f413a1c653ee5a1442865676bd0f9306146f1350d506142161d5b3dfd0c06f148e494042c13b4737c8cc030404fe0ad0602000aa4e26119c60000afea3c236a2410a80819edb7d2c8f441caf6c1cf257dc0368e3c2bbf6967bcbda0f84f30f2cc24d1c718c14f1040b0000200df3c163b5a868f354a06f09c0f2038300c95cd1eeeee5a0587186246c81c09004118db018200611e47fb6700240080000b890002d5242613ffe2ffc15fdcd7f296c929b158d0d2ecd8228ee78980aae1f1db0f8d0055e1caa55b6ead3b9f19c52c918ce2964420334b2c51c41441402947553f8415ec98de3290751505ba1a06ee1fd78505afbb02a38cd0da9f9d997f5690534d04d7daf4c53d6ce83a6f18f82503e8ebdad62d8f457ebfd34eb63516a20586833736394ea932866815f40010b8909088844444202220f111070888344415a2320c11105888828244120a178018bb80b05c2524d204acb17344b6b5b262852c8d161df40d082d9167b344341a21144c4cd06043b60644ab534011003359a280000500efb3d7920913fc742de082a1d00a8081a3859aaac71c0b1cf96f9d139e38c94dcbe834620335bd5cc6bf881938e4d2dad01041908cc942c681bbf902fd813004302bdeb0d08011d0c4638b001014364981480e067437040a5359e6fd9b14b52cc7c9114110a08d1ecc2b72cc191de5b6df3f4eb6e162d048c49a867e307609415c56537b7e680e41c6565039b4e59a68a174fa1e4084982c0e0154ba4eff7190f7f5973936b19c102800001a1227abc1f064593ef20899659576c0c8b476130f3b235e4d6fdf856cea6837c83c8d02638bb833bba875633ec65285d8a32c3b1c233808344a68f22c000049536407d2c603c9)) <<< 16000) + 0x234772727294bf038cd65cbeaaf18f0da63d9ee1ea1e0a0d47423ee13409108fa22c526011ce38144318301128f29ce9508088cbe493780a1c81c2b0280ce84fff8bff07079b4231254703e233a3c3f81660923b9e2602ab87c76c3e340157872a956dbab4ee7c6714b246338a591080c820d1c718f0c700000d83543dd69ba876ccbfdd1fea90bbcee6b28a105572a64abf3589475486b6dbcfa0f64f6ebb5dd9846f3d051d1959282dc90f3afac30b7e268cf2d186a4784452822fed1e4bda3e51acfa906815f400110090412881c9440c4220519102048001bcc89c04800380c8008199001abc2005024480cd64045bc283dfba6a52f309070d79dc200b25d487c306ba249029b6b0f51081428f7df343d2c40a5147a60f4a1232fcd238ba2c346bb739bf58a0c004d3f62bcda400a80618550fbb211f964dddac8dff1621c96a6551142788bdf04f961d0c702d6d1419ce05e03f86080e460d578200ef2b48865000480100001a124020b200058ff02f0aa9b2a41012c990f5e97732c474fe7f040284e863082eb2c374de940e72833fab4ba6414005e04440a2704240080ff80f4b975318e8d30ada93da7843053f9d7f86a2c5f36187c913049e0f96a802c434a3dda6f1c1006641fbc27042400871833b9d150130697affe76967e038e098ef99c7f068cbc83fd64a5060d2ef7203a15868a79e152e98a060a81a4cb18980404006bf801fd240229dd171beca580071451ce4c170a002c0247184bbbf1df2b0697a1383b2abe038e1e55bd2c05068c7b6a8791df060d789b306726868ab321792b12060a41edead7ec040403225ceac564020c7cf2f6aff709002c02400011010004932000c4247f804000fb247f4563f803cf6dbe9647a20e57b60e792bee01b471e15dfb4b3de5ed07c269461448c60a58a60858850460100401ba5c4e0d7a214c15167bb81a858a7df2e37a730446d9a0d4416218291056544041bba627920801e4013b292704250080000bd11fb058fd02c7e017a5e741f84bd985374651e33182d9d0ab9d7962d12f6d92118233aa554391622714a6f6484c10480101f901f19fac74e0ca696b3744b6d668dedd4a4a1660c5798e725268a2313638f460b80592e3da18256f499b580800111ddeb41404120043cd1564e6515d38c8e48391fe82c807a6cd449f20808c10f29883878979d4f03f3473e7430263634654431ef5001020d062dfb002410f079c682408000ec63b6bc2540850028e3316f6b125c0104100c8755cda38796b13b643bc68ed129079710ce183c69388bf41a31de6607373c10209e68a034c84820d2f454d2cc9000d9aeb4fa69512085604000021820008c240018848fc008001eace96a2e856f14734a0e1af3b840185585c53c6880a2814db587a8848c31c0e95cb7305190714605b962eced40dccd0c131c0884b8e0588004d3f62bcda400a4061a5c005ec9874c2874d01451260a4df877fdb2c54f4865448182389d48515cb106685438ec20207daf315d0400e7356d0150004a0100001a923f60b1fa058fc02f4bf8d4b4abe30a4015f6de5305830a9489e2c5995a3c840304bbfaf7dad2c4373fda1c71800474429602704240080fc80fed126fe1b902ce560187c7bc0b238c34b34630634530520104030080200df353eb6a0004e7199102a63d782c8004b67cb969040690cb5f260e1dd38b7dac1a68eed6dcfeca23868222a064201a321e46fc30009045a2daa70d810002c52b2434da800a4061e6b58797c691c673181b3849040d9b66b931c3b41839c129a3da0e2176b9c35c55021d39a316ee9477a12100b54c662920857d55d58d200480100001d1200084640014c08fc008001ba08568a8002c74800b0e91f7210fb1087d4843e8421f32104e10827c643e4321f10d0f80687bc3426c0a1350109a008008e088f72ec7b5763d8a309c498f59ec0dce63d46b1e92d8f412c79c963cc4310515f16a8cc68b6e40711d23ff90ce78610c0632e8258840816494c7d8cca00c5a4dbace80901a493dec7e90703babdf426c002006d8ccb89a88005040439c5fdb363a050451001c2a9a3bb4a4bd442160123ff8bff057f735fca5b24a6c563434bb36088dc4233714a634d25923c027e5b5a03c020230a20534230220220140002af3973f08b53fa034afc4cae12d53f4f7269fc4dfb17ea4c835ab6d8daf79fe11f60c714971eec0c135f05eacc286fe7aaed342608198be8c0ac13a39b730124a8aa3208042e71cf18009840880203ca0a00015320381b1e401e963a41df2612300493e448687623ebc0992182ae8d52e8803f4f811e81286110042268bbf5cbb68941d4218801a1e7cc4c98448602627d8784810440101e30500007998180c8b7f1218506068cb4460569cdbba588020c8df1681003ec4d7f00ca10440100c5010f10080004d88f08a87805404a2a0003ab235a4b0e8198e504c6a42639203a1251781b5840a23f942dc6823572ddd208119e363ad1a049977e5e4800176c5290101e9da1df100009c808402141054aed3a820517f41b9912084d8494921023d68277f80004840440100000e9233a1bc114ae3c5dc50910861be44099f4adec46051d9eeb94900368427888021453d16000b0a10002204058794b0040a41f0c79b1812bcce94041058fd92f020024142200800007191df150ef0a807c4433a0a00028423aa2a166150ea0a80015888d894c6c0863ba4301b1d8bb0cc7706635e1b93cebaa4748ad1cb71aa268953f9e0761ea35a0804b304ec0a37cf716aa2f8ba395508cc4158f99c50c000)) <<< 16000) + 0x00000000000000000000000000000000000000000000000006724092833022020c23010c114036425348ade9afafb0f3e20d3fa441f294a4198dc85e1281c43e371c421272bfd1f672a559518c0355567ffafadfd0155dd74bbd04d0edc440d458c88aef0c02a54134d6017211f416c3d46b410096609d8146f9ee2d545f17472aa119882b1f338a180000000000000000000000000000000000000000000000000000cf9fd832dc27a0591029c11011208609400200b4dcb42a99b8987aa9df1fcb60265d3a97169917437efb638db75286ba69fd2b74018a226ee166b965a8a289d5ec8005d1e7532b1355087e343224bd7cb7ae420472500044b233c1319d09e142d14534ca048735b73d05064a89e8f1921461670ab24045a61a4d69409ade0a3fa202558ee32b004e20440101db0d08a86c768243b20bffe2ffc15fdcd7f296c929b158d0d2ecd8221382302242181101280140100540dca56b7a4687c058cd5c5496e24393ed2d845ba3af41031087400072882b0a85f01400079c46b4c61d0631ac258d486f43ccb7ccbf8c0c7c4b1912242325d2a450309d5c9aa233000a3e379848005e48b1500805822a3ac00409c708802033c0319d018d900c76007c235d5a111acc123cdd25ca03061404bd170103638b671768c094ad8bb77c405be7e7e68e0826ebc8d3f800028e384a028115118eb88c75827ffc5ff82bfb9afe52d925362b1a1a5d9b0455fe5c10257c0591c21a21020a09400a00800081bc729106d458b53fe953ffd04217c382d65ffd918a9e139440042b7287916a800113100040923aa4a1661d0ea0c820424000c7a474d043a4821d14101b9c84e0240028be47417639e731ce258e688c7304627823e099d8a37d3181242b23c78e000dda74512c090c2c7d28700204c625c1803ce4e8a3c00140098d0880203960b1ca058d482c204163500b1a7058d302c7240740b15d7d849401ef292ef40088508002122019ee31b104486155f41456890da54589874a615c124101f00801b82c0003ac8e40cc3444731c35172595642a9f490eb4dc1bbbdac1acff60885a7f76fc1e5a4a8003ae4d3ca85f2c338025df1e66872f409c889552132101c7844f80be89da768b28d1610a8ed85da918a000e2a8d39c6fbe7bc3da83a91ad060e354bba66067df6ab9ae4b7cca7e8252b5f01008f5b5b7e57ffab2a53ebb221ed2586782dc28d2fbf841534965b4e3d36e6b10faf20c76b4511a3df67640c0f833e6ed9a076095fefe116ddf7c31af30344358c7428ea03881a00057932303502791c60c6ddae7b4504dd096a661c010e384da06042a6572441000c8d29a400b30c10804071c0438c021c5010000bd1039298dc84c6dc0636c03e0a54dcca183813c135b4f4904bc8f953b2000e688bd0800400064382200800007a909c2dc06004011044f856ecd161077e51178a12ba57d798093142000401b82c00030ce1f27db0b18a04953cb88a20232c20f4d28024568a728004830420101c40d00007a101f15c0300401038603a10e5b80fd182f363b118283c09ac0a811860f00428688ae138f8c14956dfd8a886962635475009db86c45812061080400003708000ce91c2150e08487001437e0a0002433015e6216e24264235dc050f996d70845951b8bd3e3fa98eae8e23f4ee750edb5a9fe76b331e078704ae004bf85c20f4e58aa3ab37afa4801b77f25925559b1df2949f2c6dd385ec83fd26083ad1f693336621a2bc5a50b914fcb379b241985b19966131208c897f628946efe640080c0f014f41052fb4471531890bf918983ad092ecf2dec7524fa331be937c01669a698e1820724d82341b3f826ab7ffe75360f64e8e80aeb5b82dfa9a5fe68aebfe4e3b70664b5594980f78a9c283966751d1091cf9ad6eb8b7fd4e7b4b79d30d736632c0a20df2445352c580006d1237c5b0702d8de86c6f0163760b000bd723424b19e198ce8cf02a2cac0fc803d87fd340e078a3e21f0001048cc07c0210080100451771abcfe078138541d6508820840200000fc40e43603e121ba058dc82c6e01636e031b601d1653e20b2228104a0b83d40010889088021c7029c2a38428b9f310f67900644e7319796083b1f477c480179002b7e480263c56248001098908c02000029840007d48da928000dcc80f9085f4841ae431b41d0d98e86c84433a220004da20036f846c50606e831b03d80d98c5d8b635e338121fb4d47920207123071c806a0a8d6bd1a149d9c79164045ec1df6e1008034fcab62035e888abb060a5e5a848800a00505844010d0990b766446902e101222f2fca8089722419c70208e2aa1481833b1c3d10fc9621003582b18de039a89e03b1244f03ccea21c004cec91989954c08069b835422067ac110014223dd4c0a70c52dc6720b0dc170000536467427ffc5ff8383cda11892a381f119d1e1fc0b3049e4cd276df26693b71b56b95c4dab5cae41090c19e09808e08c08a0080002a0050b619e87b281b5026309aef0629971f42c1c90a00aed225a751457fcb7e35c8747b8b08ad98b9a5390f4000b9c8d71cc6b4e61d0631ac1d8b30ec6ac46354231a90d8d402c69c1634c0b889ea36a82f301174cea790b39c9629f7bc886e0b6d370163efdfa09674e618b810e26960ba9a15776c535be287e63e9a592f5fe263d2a7c439893245ce54aaac7a54500b48610cdf9aeb3683b4206807516717b12cfad4e260db8558892ed18a4307bc10013f24fd4b4923496823b3fcc333e570889c730f85f11460f1c21ce539177744e00fd2523bc595a5b87a1)) <<< 16000) + 0xe51dd907d75a39aace5862609f093c575cd79319ad8793010940084113ab8f38b4da123e36c6440cf4b6439c5b9ddc41ef076034849fc700e5bb788e9927a5b37c70485d52f585940822550fe96e35feea22cbed76934181c1e58acc59202a2550f75e50c6e8acdfe5cc59431ba241f43041840c21814c00fd21c954ff31c9eb0ef9dfcd0393a93884043a162589f4bc19d6c3346da955c59155796691d270b04a0a880a5a8087f54543b987a886e9816c8100d6a33a228b8dfb6c87162c2df7aa2869a7c217f1c2272046de2800efd0c0f4260821008590026fc381a22810954c0e38b0a7436358a18407d3e76384032758b284a104401000010b206e0b00026e234a2a056157114d89325e309b94eab872c3024553dd9a104c8f4df4405cb2e11d018304736b360026142100871677c4916030a534dd5c41431e407d160a1478a59e3040abd91c24ca008c3a22910098408402111832b39dfe48c7f450c74206df5a8c290c1d5830c8780903084021118c1a22cde18449db018ac60c0247f24c54036ab6f4686020e76e74d0250c22008000087100020520006ac45103600097c4690440016c66b03bc40000000060daadbad75bc5f03c3cb1598b240511419a0920860a0016014000268f2e8f65c10b042cbdd360d0a602805432c01a9918c703dca1a44ca0003ea4150b63465b01f258d10cc684560ac231a00d8cf86c6783633a1b19c018cd80c668078759cd835c54028a9a14892042100440100401000004460a929fdee05002f390ce009041080200001f0d0e0903bab8982e0c7452e6827dd32210083a569d230480af4d198404a18400100001032332231981107e08c5103432e1bd0476deeceefd256652cf4dada01f4735cd76865219bf3e969abd3a7b2d37ae4f5fe7329203f9a807564f9c7d70cdb20bb2eb04e042cda380a8e2abfb7d38cca5fdee3ffd60d81b7fbaaafd48f51003b483d3ac54cec5433026603ce584cccc4dc26d58bbe2e9c51f5f25a941dea1b35ecda7dc3200df97451c801fff50dcd0f50d7bed01cc8a20f246a71c22443f3e3f79bd2d2d720e1f196a99a946c00056818f4df658d3554709c2a3f5ae3b124c0d3c763490f32bdea1a6035ead18a95a1a202002008e080db8821d50306bf568c022102000800004090000be232c3319501c0c6bba7a4080f6089bdc024203c00881c1615eb79e105acb64d941063e4ee9aa02b4f21438806169ab8b804a20400100001043c0c2188d372810cc412a0482499ebc40a01d56948a80120a0f804000035c8110a86501400056c40027688c98ac6484625a120ca098c884f8626bc78a6a409effaeab4382f79514060409459f326a9007a56c72884041459c7b80000931411004241689a4521e7045c97ed39260180d8ad6460026d28fc5020120e11004064007445464c0f2aa18ac9f5ecd30809457957a4325000352d11a9ab2a8ee180a4cefe1c2604210084860263cfd71835e6d7a97cc10a24dccce3063a713a7c24042100800006c118f09c45367fe9e5405479532912c5e8fc0a6f2c376e4c3ef300667dd29a0250c20008000082118e09d0ca6280a74a8a05f379be789fe909716509c459a3ac50443e89cc8580e2305738004c2840010000133231a1bcf6dbe9647a20e57b60e792bee01b471e15dfb4b3de5ed07c3cb1598b240512249e19c0920a80160049a74d01e355b40df6629350a63a1e167cd471c3b2563332cbac7deb27f85bb0f2be98168b2ccf6ad368c31d04594149df1242907681f7c89513b481c32525872b491a0006b6400211c8c60680025d08c5948270941e84a0b4218005959091418c508c6240608e03c12b4f9e310a0040d66ec53409fb50ff50002ba9b3a380011909084021014010047885d0ac1d8681577bae52004428400100000833c19fd03843380b48fc33c00110c0f804000020c8c404e45126edd671a050dcd036800044404001000008a200043040fc5630e1bb1c8f25fe9470c403622192c3df913f83918210804265e2889e64164de1f1d1f1c374c957b820020d005e31804f162dc29282100040000400c8a968a2840c30fe10f27c65029bf0eb744c082939fa3d3402f0cedbc825082200800008610560d8c304c614261340b893bf331f0f2c50c82d17b84171c43f8389054cb8ac0c5810653b1e1000251c2100800008891841907e0c860c64304020004c03e393fe7ebc2896e8f99f458d98b4309980b9b0d2be7e4f77fbe973c07911070cb40991006aa33459e4dd7d9ffe06fc440f6c76df757238f9d0278513c05007cef180a8b8050e491c30d0e022631dc97161002a3676de69139282d35000a2b015c90a3264b13027c1ee855263cf5aececf6fd1850750eb49bf4bc00014907cf51401cfb0ca99dd3faf27cb74615861d82e3752debb77637ac8800354d17505c08fb63f9a33c4c3390f6ac9c0343c3d9ab9784d65908614e5619ff94892381a38d523d401112a7588edbf15444b8499ffc921a749900001a9cf27450b793a285c39e23dfe16feeae0787962b316480a23863c1201440380200000a28a7341b14cf71ca58ee1f40352c002445253255fb82ea29267bad32c8d46290adb433211d72f156d758e1d454a0004f440e4c43024b180210bf8e8414340023be45f9342fa7a17c110015831003ff822f6c21380900244c90066c0220a3317a0de028cb0c2e61835c0384823a47faab8134d8e82023231bcf62ba1e818481fdfbd0ed88312bbe201097affdda8fe48501809d80e90b394b3a3a0002800014aabd686a204d224202cc5eb2312)) <<< 16000) + 0x4f7603d08a79d1c596a5ed345299f70219c1001f02f20a178058bb80ac216cac7c10e25d00f353c1502bea2f7bba19e004974689207e64cdfee38b6ed64ec0c11e86f7ed612bd47e739b2e5951d190ca2801b27a358a825926c2a6c3dcdc12621c02083ad5bdfe77a8b61c800d0ca0088cf7019e0438cd73967322d777f87e59bb934ec020097fad7e1fd1e8db99a8f5c463c85ba6f512ac438600bdec029797a2d282f3f7e18000679266be6ffa54ba8ca198daf239706051f9f5645c27b77e5a4e8ea2f945242d27008004698eac5e7566c6c2f9b269cdf614b3f6921e8d7b6d884d86037ce2d6015134310efa061d8632d96034d20f6698543cb2bfc4ac478dba42279d4f2b190ce088a1273801b118bb06c5d4362e81b1730d8b904c5c4262e01316f098b704c5b4262d80b16b05fb24a066ef842457101b9eaaef3fe1218b55126d789c05721a70000000000000000004512453422021823402000c00004011ee5ddf656ecf451e7d0edd58932332ae73b51652f5412a580e7f97ea6f494d4a4b5fa2d15780a2b07efb2eca89d6d686557fbc89054c76fff264c606fcdd02b48cb449c539efee6bf94b6494d8ade27b16820897d2ca7f0193ff18a6dd7a9cfdf0d3d2e7737a7baa6b8b043f400000000000000000433958061f1ef02de1caa55b6ead3b9f19c52c918ce296442043c234220218200000231a6dbda235ee992a8ab7e4d8c57a8c3f9db536dd83bb76158039a0992b77b06986eab415846c055067306a432d5b17ab0ab6e250b6d2c3065d7097b21946c07b191fa8572a635d53290079ba5ca28a1cbbfc1c9386d4f5ceaff4dfd3918a5b3cbbcac22073a306f3b28fdbe52e5ce0422099a27400194cd0a1b1fc299c0d8c10368ecb3529e6026b14b9b4c1b0e0897d4f63e28030211beaef20401e04a3a65c44aa04001edfa1af2180c01da9b88f085e0080200f4a7d88c5f150ad1db2d60b63c41e1701805a8462781200029f22d293168498741ec59ca62cc531651d8b20ac58c362c41b16109d60778800000000c1b55b75aeb78be078029648222858e2c2f001fecba8a5d8c71f70f5329a4e6d0bbe10000000000000000004537108cdb4a634d286336064a319093f07cca18914514d0030020000004000615ea2cb9799ba80bcb8e5664c04ba99ada9495c12aa12c7f4e9609fee142a3b74d1fff3007b6e927890ce3062b5f2464d0a654703b1c5a89db2352ab073f1f0fad2a2fef465d1d3fe8b000c57c062bc03804008022008020080e60100001b915d0d8ae04c0e0261e61203f0983504856c262b40b0ac050ac82c560162ae0292678242260a0091c68935380956f4cbb94014b6e7e4401000490d084021e7a6bd6a148a2a9f2697507040725fe953425e11db84aa0299938b4c0500094b0840202ac03924bf74b14034db6a24dd922285d4c587d100ba0baa7000120c1080428a13cddbbd0f3fcd0e8388b8e12a34c454c703ecc47726012dde52a4094308402100c010040000111e3a1334f42090c09862edb3c0231de76f004c408401000015e45543400044a4550479671e717440163cb1598b24052a8043f3e13fadcdb5573f96625e335b98e4f3c9903aa184b033320000000000000000000092be9653f80c9ff8c536ebd4e7ef869e973b9bd3dd535c5821fa0000000000000000021dbbc94e1f62f8b79edf6b7199861b1793ce0cdd5197489e480000000000000000082a618a0880868018c1f6bfd471032bad74e199e067359bd394a304419a7a79af2c5d994ef7b4b17734e7259f86bf8d97dff352e9279833fb56a94ca4bf1a2a30ff600206625dba87b2371c57c1d742c2aa65fb2d6844346afba45af0d4b23989cc93fcc55b544744fcf20feb655717db208328b167a7933f794421cf6da8003d11153258a908fcb1598b24052fa594fe0327fe314dbaf539fbe1a7a5cee6f4f754d716087e80000000000000000086482081859660a786b0068006b2ba33f6b26f915dbb43ab7e62b8c9be3b4e828bfd69b90008948446e98895db5e5b54a65862b7678bcc7db0e596e4dd0003262001cbe4003e9c8a89a8004318c00ee9fe3747e7f42bf7e436c68ec95d89dee0eced081fe918fd0b132294bbfa2ce1686027c294f15cd36fe68d77b333cbd7c492c033bffbbebce71e655f2f73332b88a3769031b168fc0ebed9b98d7e299a7ac2231160037527517a0112d9c2d20ffd4e6fcfc3240a8444b206b9553d77c057047994b9a4511b92d2aa778454474450f609f679f806e35f608959777cb92056bfedb8894f93461010081c143dff20a63333b6e8054694de578dd4d1127433a9bb6c8246ab967ec8044f0ce6b39bef7be4b824721007b25a9a897c200416d9cf7d92f8e80fce9824d352e5c11faa076ad38abb183a7768949fe33a1f961a45e72c1f86bd2e4f69346384a6600895862aa863e059638e94f5dc153af547725501cfe64066fe75f54935a2390b94bed432d16383ed121717c1de39a9293d31a0c82e2000269481ca2c5405629e0b14e05c01004011806f9fe5a121041f008000027114d098a602c52c161340314a01f0920ae3d95500480aaf99804889180900026383e0080000af384857a2e8f4973759268d31140d93c7fff431b56a5862c696aaef60f7cd35bf9c7c8b6cd45c58c23a5b423d7b5e9046a038cef5ebce5f3006c22651fa4e7e0b9778deed72e3ec6835d262f3b2815e5c03298a86574138bfcbc9511e19a11e5b2d391aeb70340e298f50682541421423e1c5ac863ae31b5ccd206e120569e945de6b1a1affe9)) <<< 16000) + 0x5be597c3d9d94cc0ae05237dd8fa35f9a4cc1c3092292605c381b589750600bfb6a30020c20129ff4b1abd25a0ce7c3c92acecabd8e1705a2a3c988bd5278eaf86be88c725fe2880cf2c13713ce7a302a33826f6d4becc7f4a70c4c77dd170cf331727a539fa0f1c0db32e913309ed05f74239afa9b046c7f711ff762de974e0df3c4db80d39c44356c70000881304680e6a178c0b84e0a822980006f9318400144585c11803a5e308e0a00f1cbb1ca00024c4842010000141320212eb86cf1c47c8d50e57f362738a7556ed944e1234681abd89d314ee318b498658af57df18d2f350d5f7e83a715471181b04db43593ffe6a7a8806ed99c3d16dae405800664420778e93fa1c960cc40ea8a635cf83933b2734f6b2b674388962356f845f3bbd7c60c72d7b73e61459cd8f85f66e1a9e399c34fba54169736cccbb97fd999702401d29e8627eb16d6323b3a07d40e331efe7c68e4e563c2bff9dd8f86014ebafa92648cea32ddec388b9e480b640693ef8307314dd54617cfc4fcce4ff6a9befa36cf8000093f19066fc12e2900dd1c90eacba7a759c25f824de7277cc2017d67a40f7d27802e2c8d5815e15f16b795428fecb4f44cd7a0c0ce1f3ed0c6376e1c930658808c888851d817b92831d435f5c4c2f799854bd9e4f4b19ed08dbb13699ce5bec9d91851415a8a6eed91160d90da32d09c8a9a3163f9e82ee5d2bb07d251dc531c8b96b0f280d4d5cecd6cb478cc59baa0ff8af59aa1792631094babec2503e1f47f5715c97f6039520ec4cd069e73c4a11fa6b9433199b314f3b0163528bb7b5f2dca24065422f80000c9d22924a11e250a41284549428e431461d00f8c8514342881a1430d000ca011425106ea88505242802a00361439d52b8293a6a8add67053b8caca4af3f8af7fb4919c4b8419dd17a600000000000000000004a66d66df2cf79afbabf824c980b8fd6ae1fa179663101d289658225c000000000000000000124b7fcc25f979b37ccabdd57e7f25876b6f6a9c6c18dbd3f5138000000000000000000000000000000000000000000000000006432852451852423c0180001110000834154d8e37fe81e3f03d666831c802ffe2cc85cb6184f9528af9f6f1bd3e2394e8905781eafe87e68e97e16459608243329b939e6a51f9a34f04f4f901c521599a8666011aee1fae63e3f056e516c8574a0998d2f3b921adf644a9351c41bde640dba2f1655b32f4289d65e419370da1a27e2b13e1189e88c06c362781213b0989d04c4e4160011304010ff489c068014704802d3d9005dd3201d0e26ba5bd548aa607cfd158c9384ad59f8efc4aeaac82e365fb6c0000000000000000010cdeb3c0ad4cbf05c986291db69fef1302e9b5fe286f8a3aa9c263a0000000000000000000000000000000000000000000000000000006b21841810c12402001c0011101010101042ec1157a64fb8f0a7a44ca365f85cb2c535a662e6e26d20e3fbba0f72c500333f00911da9f27031259afd4c8eadf47fa8d109655eeaf2473caf7f63c885722191b0e2b470abe5dfaa495a920f7bd2f806d9bfbfa16c891e41104519e5e958a26e1a1360509a8084d004000d32403c70480a08d9cd6df6205640b7a8aca877acece644f8e090bc297ac2c90848808504304204800500040107c0fc97cdc6500f88ac0aa268106b6b0dcaaac2c285102b62e5e2dfdb7aaa2ffb13b9995086c9fb9f60b1c3c0af447857ea2b2a1deb3b39913e38242f0a5eb0b242112c32c22821021410c12c020001004032307453d0b9918d4b015348aa220772e645047e9f183c6410a8000eb109c1960af01b84a5330142b16b7907178040a64a64229ea814122247897f52c302528d80a15bc1200dab2f5c77543802974f323160860785c7fca88140208778b75a38274507a47f87614fbc4161701824f3aea91d22b472dc6a89a254fe781d89543dd79431ba2b37f9731650c6e8907c8d14a14814a0860480004105c84ae71c912e7cfb1ef81ab6b002765b3d5f10de7f8e468978b9e2fc81ad4ea23fb7269474a738acea8e0d0831cec70a9514af388195d6c593a3ed00033e3829f1ad40449a2c22f6242053bcc63e24c34b6869da3082337b9297163b07560ca0e2f2fd8ed67d0ae826a8e02506a7593c26e63ffdc1402b609dc05e51cfb5d7c208b303c6da9b50feed248092ff877e8bdeca1e993935fffa5566244b0a442de96601d434c05e32a382192afb38656662099544b51836580b89543dd79431ba2b37f9731650c6e8907ccd14814610a0c8000101c43136c1e692594881444f254cee4a2f976d1548d5a4b5aeb7212003f0f657454cd2ee88ade8ea4a6366744213f87a2ee457a392559e2f5e73bc4bb7650d563e39d584d492f89ea0007cc44cca60e05300072522584b1201988f0cf7108cdb4a634d286336064a319093f07dea2b2a1deb3b39913e38242f0a5eb0b242121832c21022c12c020001007840fd05944c12acb16488f7ff4d471d31ccc964023dd38c7eddb6f5e0309426247380c259115bd4e4db8d6734c77d8d64d3ccf83f29efda91902707ea0006aa40042d4837a0c1b9060da831323d8988ce1e8be1bf0d016f515950ef59d9cc89f1c1217852f585921091619610e10610a08608a000080203b87bab6042eb48bf7e1e18ccea106afa2ea7a3702ec89e33e14c48ee80fa2edb0edf527d8c8fb2aae7aec5ad0229a342460d47785e9c63af88a3ba3270203a31a116247d9975e4fec61296e2006a3d25791cf0a8e48a3aeb05c08060c838f31767781f7ffd6c043572)) <<< 16000) + 0x50f8df0f75e69b1a276333f2da799b814167408be032c09c965a74ede5a78aafb172c78b9f9a230bd13c1dcfae0004003dc4a2ca6baec41d60d00c140e9ce889371d08ce911c19dac6268876269b31c993e3c4bc58c304b92bc89849b36729fa0bb1fa33764a980b201985e9126af47d3b808d0d19b88141ef45c8ad94dac709b548e8a6d78b5eb6f62b187aefc2fc9fd5a221f5a2e8bdb6ec8d6fa5b560879c4608130010003b8912f398971cc2705425a2385bd2cc05a3946e8860016e36006bdfe6adfc1315d2deaa455303e7e8ac649c256acfc77e2575564171b2fdb6000000000000000000866e2119b694c69a50c66c0c94632127e0f98c28c18408a004002000000006967da7bd7a1048ead09b8b71dc0fe9a4cb648af6c63d158ee7d0c1a03af4d751a431fc56eab7c1ebfb907a42e168f3b10aeef7b72bf38c3d7be91a67f3568cfef7773f1c45ac7a4e82d01f2989610c4805623c2b12b05f5b2f92df540e618c208cf82fcec9d7f0804c10b1091071080060020000040624d6701b52d9c9dbbfe61d13b86e2bd65a26eddefb9780292201b8953ad5c4dc47bb03a23208b73fb065b84f40b89543dd79431ba2b37f9731650c6e8907c8d18b18918908a0060040000080b5c30d08cb0ce056fdce0fdb0132235da5ee19b4ff1d72c67126d8c008c779b1237906bbd48484365db3b68c089a78b134000012141100404a83400020444a4c604a631281df2ddbc474c93d2d9be38242ea97ac2ca04112a87baf286374566ff2e62ca18dd120f91a29429029008c09800c0000006daa5a862d5b1d0a73b4f289cc50fc3251286970530ec0b96060bda5b3aabc2719e02f01cd2687da24e1a1260100017210d12500033591251109208800238480072a912309000c4d90254589120c485041e673037358110ac01805544b51836580b768cf9cf7b467ce7c55d0b353482f119ef0888b14508408404304900800500000000430800200d1201588f0afff8bff07079b4231254703e233a3c3f81660927ebf463f27ebf463ed2585957f52585957f824f26693b6f93349db8dab5cae26d5ae57208796ede23a649e96cdf1c121754bd616502043061851832801400000bbbaeebf5d6ec3d6175a041a88a3aaf1306d8e636eae42ebf02f4536d60669bbb33b3a10097d2413ecebde54547871a551ce1d6c4cae6a987318f7061be7a4c8963464937a5860ece074c742847d2b62be041df7cc19a000020ca604201000011a20ac4210c1908f8c8478342060a00060e223a6b11c3587e14c3ec962362bb47d304633a1acb9d761cdbfa7880b1c5e3522fa6eeabea02d4200000000000000000000000000000000000000000000000000001a2e68767f74d5b12a8daef060d7343b3fba6ad89546d7783051e20771b0751073274ea276c07881dc6c1d441cc9d3a89dac6122c51422c124020014000000410b61d8d0a572ec95f6580e7a67fddedd81725ddbba66cdfb7cf0108921cd06a6d6807a213c9be1a988bc42d4cdcfc080680bd0a1d5fbe020b109711a4dcfa638ab98252b263c0c832dc832122ba905126b5d6e8867e19a3ab13aa82db2b9655130a427fb652b17f201c6fa593b22b545b5ba972d9a3ebd60e72cb3fc46b8e5f352dd3c750fc80e1e2af2c88a9758f68a5538ebdc3a05254597ebcfae6a002c9b5cc6d11a05e146552c29d1835039d4f90305276adcfe2002d7446ab0602832eaca90801c8a27118000026282200808c82c4601622e0b1160581780c4540622803ffe2ffc1c1e6d08c49014cb294e625d928c824e5bb788e9927a5b37c70485d52f58594082ff5348040e1fe25aa9d59b58bd54f6c401a0af83760064c00000000000000003f33872041c428140000000002dbd4244fbdb2ac30e55660ce036fc26b83bbb539c9fc969b3c6cb038e45e7588a9e28cbb408a53fea210084ba2783e537bfb75b40e2677e3a601bd25da24f4baf7795646291e3fad9401fa9c764a140a15f679102acbd479543c22205e1966584db54cc30850a5201fa9f80001312118043ff8bff07079b4231240532ca53989764a3209396ede23a649e96cdf1c121754bd6165020aff2e0812be02eff5348040e1fe25aa9d59b58bd54f6c401a0af83760064c00000000000000003f89543dd79431ba2b37f9731650c6e8907d4814b08e00900000a2041bce7dc36c276700e22178314b1d81ec8cde95eb674365d06a33377ae383931ffe7f25ffc38ce6336213ee23b19952b9d5b1104a402067fdce011e135cbba1b0f4d15776e39234e8bd91049115cea016bb7d072e39095994ca000bfa4001d9488986c4483744875ca56bc38a8b601d220e26c8e668624021c20d8388e0f4205c7580128811004044417c39bae0ba4e38c96e1738812204b7d5e003896e39e26f900b8ca363d83827f2789ae1001ec9ab42e004e284401000016d21d22211011087888328441e8220b411887008000cfcfff17fe0e0f3684624a8e07c4674787f02cc125b5756dafdf40e22f5427088f95e2724c8079f21cef34faaf4d80000000000000000008b0f51ad0402598276051be7b8b5517c5d1caa846620ac7cce286000000000000000000000000000000000000000000000000000033e7f60cb709e816840e40a2882843800000004ab9f8c2ebe238d264f2efac43a3303ee0d91972d2d457c502bb3c31f5f1f770cb5273c087a9ce9a0a354974bd740a79df82d00655725c2e53456dc571c55f7000ec253fdc0e251426a64f4bb202125ed3597515c8f9a0dd908559c0837b46459b802f18110c42)) <<< 16000) + 0x0b2878b9e86b0ea738cd3500077b221a2bffe2ffc1c1e6d08c4951c0f88ce8f0fe05982411c61c4103101340300180000287cb56ba66fa6288b09b121f426000e5814eb985fa2efd945337e20a189de95402cafa35ec6287406c13280012a90019e422184a10b11000e02110a4d0849482ac14004a4e44211420e8b1062108288c410170f45f0df8680b5512d460d9602dda33e73ded19f39f15742cd4d20bc467bc2231432c20c124020014000401018a9d4566045938f1b541b6c28280a28600e277faa89c1521180704371b942cb20450d76c2294f29feb8719c87b02f02070746cf07e4d3caf9ff560f6adecf1460c0fe3d49a3552887ee7d1dc1fc34956e51df9e324849bcf30a62d96a425a88361e0d93747362c5c7f2e528c590a0895926d9cd30c15b9a636d5eaac8a4ac5b48a284da63ce0406ee16cd304b0dc57acdf89d79ab082ee8819a5c11b0007e284922e48ae0d4721afc70073074a631738305d09e1357d838020163da35a844e77ad029a4f8b797a76452689c485f0656e6aa4da05f1b18fce06b67f89bd07dc1ea5acf0254cc609ba9ca01348a5ef84af21af4d59d14782fbc609ea409bb945594f3280be5ee240fbcc54acc3e3fa0ad2140e40b309f9519ebfabe040c14000fa24408e6202731003587f9ac3f8c61fa620fc2987d92c3e8641f22b0f80d87b80f7108cdb4a634d286336064a319093f07dda33e73ded19f39f15742cd4d20bc467bc222306184303182280240180000050101009510f21184f9cd6f39e25a31a5f2d38da63adf6f9c162372b6f1e7ff777dfb26121869d72687aa1ec0b0f505c0a2200c9490a0e00a8d0553c107a9a4e549000cfed69e0240c2200840a045718838a0ea121841624108a87c3f43000265d84c09020880201cc020000f321e8130f30907902c2b0141e20b0f005c0a2bbf8a3f0a0e888a1ed3401d100f3a18e04ab3fcd6c4005f593e4e4e003436b03d300030db46a810067202200878c1df90d10346daf0a1611436263b71ccd0842213a16780240a16aa280284184b5004c20420108900ac985199e40170cd652611061493be1e2151fd31662022d0ff3fda200a445daa660047d650dd1382110043c8d41d4dfe18477567bb6cf1004862a6e4608420100000aa34380224b2ca80e8f6f20af387a43f561d1c1b1f8c3704d0016b2ab882008848db0d098208402000026843bc2400071e64603c134b89c2b3f81fea18283276d7112282b2bc7f180deb42326840284f0db600161420004000099985bd2cc02803ce04dd51c11107f4b3b4c7c6094ffe2ffc15fdcd7f296c929b158d0d2ecd822768cf9cf7b467ce7c55d0b353482f119ef088cf10d1040510090040009c98631dfdd8d14f3e6a6659f970b6711e36e9b1353c03b4daf3d8c1e0a3bf83a8894782b04ca5b1cdae0339366d9284264514a937a6c31c463d0003e020443a000a3f219442000be321dc3b0ed1dfff17fe0afee6bf94b6494d8ac6869766c1118a5ff6b216816f0e552adb7569dcf8ce29648c6714b221019c41409008a09c00e000a007b91fff86c80bcb2876491e70595d2cd6a7bb20a0917ff05715e83d8838bc69faeae8e34e20d7484fdde4634b625e80019210ec398759cc3a8e40ac720e93587412839c461c80b0c905c0800401101c010040730280000dc87292c0e0361c81b06a0d07186c388261c2130e005d8a27cfeb14a40c6dbd798a78288381e69a403e868fd88002000c86844010b012cf702e8d00bb0db0d8012141f0044050040100000446a6188eef98a407143d1b480044304001000008630140100406f808378060000984374861b8230db0d85082e20d45c3e42cd045302a1748805ad95bb90c0b20eb59f0080484042010c2955dc699550e1abd73667060210676c002314210086158de40ec550f1010ed44e0c7dcd7be530245df0e3c009050800200001b443683744bef0ff8a7047b429cb8d09cad46d5a40631c464e000241c1f00800006d10002b021b23a02519065068000fc080031290d231048988344a4000ee46811f9aa64528eb2a02356b993194f992f2c1f989d3652262241080b2689aabe893f1a7922a4dff967f05212e2f0e10d55d45c1a884092f3b507e010796eda775796a231d5750441591e9b56842cb82b2bc637fd48febb12e4bdb9111b35d93b7b61812a9568ad3886678c4c7211e189e83b41fc130280273f4013834da679a269756e3f2f2f566f999be0698c29431031ebff01709f05bd03ba32a4ff3a4fe2ed6ed5911c04d1cb177e9d54e2b1af79c0004043320f660300998cb086c25d22bb56a22db74ede5f54f7a0cb02e20dc2103f1ee139f045c2e72cc05b4b16dc672f760caef654e26fee6379cd80c815ac30b275f9f7eb17595e4f416c5616516dd68253630280b7518131ff53dd36ba987bfc515827231a3e45b26e8a27219e8aa29319ce53522020020080d80186b808358061aa030d401c050040111027b4c17cc008450800200000b0434c3701c01004000011104e1900007e10d221048908344741a0020001f6219e520c215060068002e00f9d3b0800f3684625014cb294de41154b6047279d7548e915a396e3544d12a7f3c0eac106fa8a055b1f1c90686b79bb6fea4ae6007cf3939e974078000000000000000008672b00c3e3de05bad97c96faa0730c610467c17e764ebf840a20478040008000008553664d6e4fa2c3004d214eeeb14fec1b4719041e19344b423ed5da590b788bb0a4f54d9cb0bf5b894fbb00709cccc83887676d1d38a0ec6cc6fabd6c4fe1e08)) <<< 16000) + 0x1ec1a012248759e40b89f1212d892ca44b5211054935a170120c70505b008001884f962b316480a87a8d682012cc13b028df3dc5aa8be2e8e55423310563e67143000000000000000000000000000000000000000000000000000019f3fb065b84f40b314bfed642d02d040cf04e0480401183cd58dfbd35a1ca3e34ff2057533b1c8273752e202cf9a6a7386b4b2ba0ab50b1210c80219465a4997f454d65f12cc444ca4df4691eecf09015100c8d3b10a9b13c4ae18370c739e08963ab75533d80c6d12bae865c375f42f2c3939830587d3c0bb551de71fcaf6f10b48102b03520cda0daf787a323723c1e3622e0a69ff5cea86b3812eaf592e3e99b1b49c5201160c2d9e44e852041243c0abba9bc85c84d122eb81001a3cc43ebc0af4b037601009de7087c627bdfb74e84224957937e5b35eeeacb8295d25a15316260560000c1c867148334a416a520cc2505a12831454166120cb090004dc10b23500f9080091f48580a800dcf48650ea84266534e3aed0c2087f0c2456a8c06e6be69cb03c482c4ff3044e241410def31572b812070d622f3920860123e2bda078c2801470742fc1201141010d7ef607a1ec02b553368d76e2e710a85a058d09ecdebefd618c6a30516a41095be46de1c0c1e860c9dacc1d080432cf2dac35c0c0200bab9cef3b94b5a08042209c527ffb66000100a81dd576b73400032bd0fbede530a80ad650bbe59295650adce46483906406482e02e44d7d44450aea6d57221840ed691391415676aebf8e034075673c0000949084021228ab0e389050aea39fb6a3821174410c1413f0b57ac800120e108040300141900200010d217c5309c29c083ad1f6101018eb76aa5040a2a37676ca0123be934440018aac7000405b324040800013121080402e01418e020b6010000c010c6218628cc31057620aacc32225851eaab3ac9210ce4137e6380940443420a0089f112ee1007304ff4a08001312110042c7035120d68d18467d12ba2860be1b4d40d12c5dddfb91c31d0cdd68040c065f0ac10982088021a30ebd1cf0c50c10be0e549a254114f5a05881319492208188c1edaec3001176410f04c1044010000139218613b287cb43bbe2861bd5e83d8c14ada84046245029ac1054c0e0c98e98928308391d0a0e0227f2515f009c40880200002d64308241820a0c00105f8080011f085f14c270a762107457c604080d05e39fa0119de01a1a58549709ec892100917a24c5826779eaa812084ae107e604e18440100bd05c3d46b410096609d8146f9ee2d545f17472aa119882b1f338a180000000000000000000000000000000000000000000000000000ce251248a588408584782582482680019100100680012010bc0d05d8482e8241720a0b80105b8082d8040008d842d4b4168520b30900056710b231058868003d508580880048f8857a881394415c920ad3d0560a80054e0855848013f40802da910089413268fa6f4cfa983f46d2200eae38b8c2a2b892239859acb52b80b8000000000000000000000000000000000000000000000000000006a11021c10811c01801400101010001e37600a5ddccfe54e1b4f6a53b15981e3c4ff13f3628aa177969b4dc557cae4983990164dc831f13442a158b90112ec764f61f5bf07b887b7194204ac3e51bf55368a48b25269b3dc7bd27728cf43652c9c4e55c7dfb5219a0e32c7c9af42a8741522a0a81100608802c240140a0a7050040082980414a020005e52148220a30d05100828404017dbe78517e20bc38383047cfb4266f2848241193f444323029f01deb5e124804106a6864323007f4454ef8522802db731ea85c2000b3649025bc0082820cc23a9a69f1388382c02450c02e0fda6d0c8942c4644ba1ba2da30ab8a19560225814107659f520ebb0204e02d84bf4c70061164892f5af500082b5c1d3e22ab00e064a367d10a270300cc7b07a922e80af2304881902028938a73dfdcd7f29014cb294aa6e66bac111f08837f8e58166e2ffc463e605bc3954ab6dd5a773e338a592319c52c884084884062041840821ee3fdcab23aef3dff8e60da11f0b9e7ecbc39ddeef8beec3c7789d769fa09ba69303cf6d39e1bc22db16d34e99510c228e8001a990a01504f8a82785413a2a09c1504d828268141320a0980100034810252984b94c258879edb7d2c8f441caf6c1cf257dc0368e3c2bbf6967bcbda0f84a20a1c61491090c80c808504c0200803688718afe468923a3309aefb09103973da0d24864af569dd720321d0420799014b959a48807042ee8bd4580801fa87648c6804250080000d590950584a02c24417442292a28ec091dee5fe14ce4884e86929ad24325bf261031019a030a994080a003ad6d1c00008a45931e49c209402012603a21cb83d18aca17c6d49f324a0e09f5d2b8490ff0550cff8a044d31cfe18701006a0a2e010001fcf54fc27082400859348cc68c302c6272b0b1f4162ab2f5c662ca15ce3cea75e508334525a521810155d05ac820038f7a305e7002500858d5d10dbe01d4b15f000100c7a142c86bab0dbd828423d4c7faea05872a01c16b544b0822cba5e3050c0842073e4a4318003a4c47337b91000560400001df21240a0003872000a2e424404000db042406411e3208e190468c8230641162208a110448282201410e0a08201043008002cfc81b86e16f4b30190d0b5dc70016e360038dd8bcbb82510b7a5980ee5ef283b002dbddbc41047b656090cd6df6205640b32440c124018014010000021bd97302c7a286b311b53015ea82e68783a49e59)) <<< 16000) + 0xa8af495c02879f8ce8639ab693db9bff41cd985d92efd1023be31e5f941644254b9d02942d1e62b27bd0e9643ce69fd592abfaef680a22b1d5d93c4165bf2a51c2476914c91af5ab4bce81976841164c665ba65f444f797a8bf28b6d98cad95cba03c5c5c1844f8280ef9acbc225918c4c65b02360784145a45672ab000d660bf2b7616a5121b69f80b2f01fcab33a738c817f400a01913e6409015563188d43d0512abdc1a701ee2f11807f149c0c5ba440b357ffaf4606752ad588672f54fb8f70412e5176f877040c641bee1279ef0c17a10121e58920000175081296c214b61084b80e3699683e000819a2914989130c3e6c377ae74c284828f8a58740700040d0969940c0045030666000403e7d1a11a00228884a7e2baf98812910143b43125a1d00ac0901060a082010408080009788005fd90805583faac1f9260fa8307c3983d9ac1e8c60f2530782183b90c1d8770b7a5980ee5ef283b002dbddbc41047b656090dc42336d298d34a18cd81928c6424fc1f5712c9271c14e16dd58d022df9e468116fcf1094cb0c50c908800600001000db27bea7f9baa065332f1ddf2458e5b57ec5b4214cefa595443870125b775eca27fbb6068b53d2008ac3649364bb3fdf27385d421ad968f7ec8e7a85e478a6437c0d1bfd1d966c5fe1b94988c2859041caadbb6d4b3acccb0b7a5980ee5ef283b002dbddbc41047b656092e0aef339fd0db8fd3e3816289f1c0b1482185c93e46b9868a7434533054ca14c10a0cd009000b8fca0d3acac6cd15275a62f7aab935db5782dfdabe1eba162c0352662a67a0e86446ea081de4a361713a9f7cfefbea5c0c7d9b62f1a19ea3567eeaaaade0397aae460d4691b8095dbfd4932cacbe7848eba36273c96389ca0d3ec2a62eaeaca7d143bb4f45d09500000000000000000000000000000000000000000000000000000d112a87bafd50398600000000274289520f91831429821419809a002039e5c542b0cf67dfaeec57df171ff7c5fc9543085e24a6faa0ecffb621fb4f76b3d468a0afead0369a0cca6437154cb3a2670071899311f70814a1cde2259be9dcec5b9eaacd5d2c425685d0750100027b10740d0004af185bd2cc03a86980bc6547043255f670caccc4131001b0764168e51ba218005b8d801087ecd90f04c10b7a5980c8685aee3800b71b001c6ec5e5dc129b88466da531a694319b032518c849f83e8186400300200008f568046fe5e53dbc1347c233540f6a837da53124f2954e02a97317097a782a59f0285b6a63a572df92397f0fce8dd27ba392dd66181f3213217d056b59aec2bd65783c11e54606133254fc5cc8ae2d356d5ccc133e2f57b4b393d2faf2b55008e34b03bca8c2b5c425d2fbd4a6194252e43ec12dc156cdc4901c41ec2aabe6b93f72adb96b3d52c3ea334da020fdc01c20bbf1ed69152a87b5c97aaa5903a7b9a9fa2d84427e7075d61efd6049006bbd836187e71f5cc4917bbcf8337762741387656a4c50bc1c35610140036ff3a2ac293f1660dac73f3b427702938b521df82838da3d5ad6980124d2ed4474ecfb12400ed23d80aa55a49c45d950b96c4631c748832203dcacc349abd286910fd3cbf49c1c6d688c8c78003c0a124a8f9b6a80da7152bf01c199c35e8e9ada5f55386985c8f4461d2e7907378be18f55a903cadccdcf6f6215e9be21ff02495177e43cb96e27200000000000000000000000000000000000000000000000000006589543dd7ea81cc30000000013a144a907c8c18c10410508c04d010195b648aa27c7b8f4a701b4c2c3d4864cec67357b0f954db8cec16749cf4d5398eb162ddc3505729be0710e78db6e080dfcebcb93199f14540d9fe186ec282926ef44ed18d576192541683980800136c839068002d6483894c1c0a60023a6417c960ba3303919c4aa1eebf540e618000000009d0a25483e250a5024821825004803801800002808984001006800096106f3d8371ec1b4f60707306c3983596c1a8560d21b806cc552dcf1835dbc4bac5e98b82fbdd6e59e4470625df44f8cb36715ffe44b5e240bef0501d0d5d9156bed441e062cd3a47f953e978daa53d0abc0722ea6cc8789681ff03357ebb02002982d60d2b7f15ae695ffc988be889331ec3d79f4f83d6a4aad4f2198707962d256520000045fdf0f1ce301d23e1c9f7cd89e9c67ddd93735e42b1aeb5fd41f51b840b91f1914d9a0b08c6f50020b8a164ea058517d6644c2762726ffca5b0e5e9e8ec4c09dd249131c4a980ee2cfaf20b4892fa81e728c8a8afb0c78551e142264092f144d07ad3a7f6117ca3b9e04841b0bf569c4fbe91011ab721dda806ac959f434dcbac5ca9e85932f08cb7867a307b885bd2cc064342d771c005b8d800e3762f2ee09442de96603b97bca0ec00b6f76f10411ed9582485c93e46b9868a7434533054c510a0c104d00900500027cf6131807e4aa58bc19f4c76efe974ba82c0a98ecd582fbd61e4083970fad3dd8970cbda9c3677559458e3d1700c993ad3126816371eab520795b99b9edec42bd37c43fe0492a2efc87972dc4e40000000000000000000000000000000000000000000000000000cb12a87bafd50398600000000274289520f90a21418c08209a0180200ed000c34b613eb1b0d8e6b7df3a6860cdc9623f5e5d890f24713c9c092294f6625f88c20ac79573527e0e2bd9562ad46c31632ddd1d2a99d419e3d0f779a8fe12c4e54f70330c42488350680100026f99dadb97531985123e70fa82edae9d66c0b1f02adcbb2cf7650f0f8156e5d967bb28)) <<< 16000) + 0x81121724f91ae61a29d0d14cc1589543dd7ea81cc30000000013a144a907cc510a0c40c90490050071af67fbefad0834b3bab6aff0fa216c996a24a65c35ffb22ad38c264cfffb3ec13f1b9ca0edf91ff040dfac6d16b205c5035c0c81215195d910f862c7835377c6110d3c6d04d9b9505191149eeb2769fdfd959153113fa4266ff031c80000000000000000000000000000000000000000000000001862550f75faa0730c000000004e8512a41f21442833020413403005b88ba0ef58ff740b7199c37145054e139675e7f71f2939d8878544ef21234d3c5a8aeada50a197aedefc25c45c6bdda661aaf0a9b244944869a0b5a3ee07b912bd00c6ab068e1ff41a00400096c40f0440ce230661183288c0ec240013564158a60c853063258310a8004a98830a0c181060ac6b05f2982f12c174760723bf515950e802c18d3c35f6ebce018f852042289543dd7ea81cc30000000013a144a907dea2b2a1deb3b39913e38242f0a5eb0b2421768cf9cf7b467ce7c55d0b353482f119ef0890308700500300000000200a349e7968476d73bc5a4945e291aefa23e95d5bf8f722d2553a8a72ee4a48604716f66a0ead96f9e9c1e856b2eff82a70f15b4cf2d9f447d4fbfb51a2a63b0654c838ea11a480120d17ee40eeabf685e7d2c735d929a608909ecf499d9496bd9aa891cbc21da211546cfcb0b7a5980c8685aee3800b71b001c6ec5e5dc12c4aa1eebf540e618000000009d0a25483e430a384104500400300000255a9d0e0b26f44b92b4a54ec51dd49c1d350538135669670cb505e3077dbbcbff3971685499df3651cb06fb551ffd5cf4f15980c14dbc0d5e7416a18b29889b8521431b7187ab74468ec7225beac5089eea07ab9fd71754ed8ce9898efe49457ed42abcebd41be94ca9c4d476bc3ce3ec29743aae0ef04ef3d13cd82703086d9f6c727b7b50aa32c4fca888b8209402e06905c9c5c48eba2db9069cf9cd2e6a15168820c834c573023e613cf1ad8797ab8d6b34a5d4dc8e21c000002c37be2f8ad18c09e95fb0dd874ab6de7dc611dfe34a5b1d75422f675c1cb4d9763f33bcce9301ebf51bebea423ee1e4bfb4ab70ac2e365704d6a4477a722fdf4d9cf448ad25fdddce6b7832b9346c438bb502ab8a38378e30643eb1f0304f255e48e4fdfbe63b995336de5ecd923380b5241114edb78013434000f584170c60b66305a2582c8ee2550f75faa0730c000000004e8512a41f12041441810413403002800440023a5b4f5808a491977a4128e093b7ac3ae59fbe91ce1703ea07c1a03d010000ef90582982b8eec106180357aa32ca0464d77d2c69d7e900294fe1cb1df0c7bf052d2af42aabf484b03507ae0a5868b7a4bad094fd7e1f1c5f1a8b4985a13b722822ef59947062698474c83b28ed9dc183bc82ac5e61188f92982dfcaf4bd8289051baacaffd5ff8d9793954bc3841748276d22a23352fe06c3de32b7aa952880c22403c005ba6a8d566c8862e22f23f6c60af4871a8cc66493478c44e8965eb0d1de2bbb7623ebd59f007b73599662e83d2c8e85c1fd2ad0bd8c0df22f499a3c9c0011065d988353b2d5641d59abb8b9b5d5d16555d5fff5a590fa4c49a60051cacf82d6d1dd36d5f28d61bbba19020d80c23d28cc47857f0d646b64ca1987e8b2f111005a5c7e003c6195318c0e07abafb655813ae753ad2f94472ac03a5c76f080c0970bab60c992aabf800503f73cbdc6783691fec81bc4653cce38b82bbcce7f436e3f4f8e058a27c702c52086ff5348040e1fe25aa9d59b58bd54f6c401a0af83760064c00000000000000003f85c93e46b9868a7434533054cc10810c08808804200009a654b75b80f3962cf4560ef85fef52fb76e09df11ac84d9bebadd7262b68ab83268a695a9630c9a0d8451e6ad5db0dcef03f1386e137dd6a42ceed99883f0e0b196c7ec4d3115f129f1c0b144f8e058a410dfea690081c3fc4b553ab36b17aa9ed8803415f06ec00c9800000000000000007ea4db51ce6a65fe6c1ac77ba7a4b876d09a8f1fd0997384bf00000000000000000000000000000000000000000000000003099e49039811011009200011b1ea485d7365574941cc039cf5354a2c2da835aeed9a3ba5802e563d60c155083c116d27f8cef3ec1dde8380068a763a6f1f820b4d03eacbe507e99c937e0de5ee12ae65245f12c355c53f7f5dd2b433278d960c4aff7c1969f85f3c412479a62d46621955ea800357105625000594905515e1b3e2f2c03c2080e87f4000424503c008801296a97be18001f2c3d8000566e8cf0000119010004015017214e73d383ae2411ed8007df45041b27b793c041dc9cc901791000641c5b7b3c0095cded648b0002fade6f7028e184c0288c03b53a799e8b4eaa7bb93ef4b6158aad00badf57404603f085c00000000000000000011f3fb065b84f40b22894852454810414002c0280030180200d0001e820a60b8898cb474b12040378777f0821e90d5fb090858fd52864822773d24c2403f88cb1781306108040148240a20300016020a03204f190270c800156c800320904d0900037c104c358259ac128a7a1e7a21b956c508424a17ac0682b5c6a19a52c1023c328d21c00f993e6e9870000e4e088c0006aeaaef1c04400428e684a028e12865f5000e1864251a7938382888fb3f7c8408055d48118f01de3c01dda680023c328d20002eaa83ec7022001472c2501402482e2550f75faa0730c000000004e8512a41f148a3ca4454822420824412404430280200d91402dc681c79402dc6c0088f1024)) <<< 16000) + 0x789e88a8fcf6588484eb1bd5a2883f169719e884c28400100001343125196781649200ed615eca08195f9ef910659d5d4e090173801d1c02510200080208281000400026041207608e3b0461182282e658b84d6b2203a05804d9d035762430fa41b0ad5a18182e9f4b70d990192437766d20061d18a745e6ac1408a5f345ec991a000236919ba4140027bed7e543224489102c02c5799b18a84e62dee883d52e660acd662318df41ce28815e289de200000000000000000000000000084c4b625c082f5a1fb9c8b5700d312a87bafd50398600000000274289520f92861220e20821612602202370c01006d0cdf831dad30b00913c7e2c202904661300017beee70240c2000800006c10003a720882b0431582104e2550f75faa0730c000000004e8512a41f14cb40b4861833010413c028004430380200da1e36877f5b6da698e039e51344b222095162747f16c46840746aa6edbea980c3f3ac37d866300004a817c800020017f84f61727e0893881c60c00f14338f42b8acc2c017a3f34411f21378000023182000800005910002ac20007c262605152d24449d7e7a03a4902322dc54a0805f5e2b94008918279240a6ff4ce60004c383e0100410502002800057081f868002ed08007e99001194207c1203d010009b7103c2d01d84800c05081d08800f7ec81c8a801104881c028017df881b9af35b7d8815902cdc42336d298d34a18cd81928c6424fc1f22441442430811c01800c004040507b396b0b24bc09091c7c70a09735d2da4f305d5c25d37032b345ba03b8ad600a0c885e1065089a23cb5cbb249d4b943b7f9ce3df0baef030011d00772157cee7e2c2b4179f70f09c25710666eef11c604005b93485aeb7a282dc9060e1a2a0b6890a53b8c9853bad40201046c9a1e7d0ca3ad3ecc6fca0eec5c6d0517bc39eb9c500101c20be9e08827914d9e86e492ec9be30c9f014d6e01a100005b07a16322b8a355887cf407d58fb70e28104c37a7ea578db2a2f5ab1a2e5953a7f2788482439839f4179cf7e1e22403e0970b941548a3c0006fb758bb61738d8da43043cbb26440e10e95c0966cafd4a121b369c727a67aa57b1747fdbb565eff2cf8a4d99c097f61fd1acea205162c48f02b12bc263b11451a42c435e54af9ec455b68d3d0bb90a0b0efdd15e0a4a6588ba69391d7061206a049e5a1c2b3f5990e2ec63e94bc4b5cf324f498454f413ed6605168714a686efe76f643c7930002f11cf2a09a0bc526e5e21c56a4f78e95dad6352d67889fe0dcbffa079ec4d4b654fbd522263c018d8d33699ebb6acfe57e56f6f4d142ad0ebe231ce8a5d6b6831928386b452ac48c1f43213545468c44ab14c0586e25663363063ca921225007ecf7518001e9515e94012881000430420e8fb8e8825007818682208210086085ee72eb22093b6ffd2078058efee8a20031a58f1014082000400006a10360d0000c19a09a4abfc72808f9c1294408850780200000fe40d4040680200036720664b0322581892f05980d0bf214284094e6bc6082e677ff45004a82bf470008b0180bb0004a304201080800802346dbad3da647768264897c0ae318535fa0272854c0d17fa43abc357fe47b6574bf2d9adbb493103b292c11e96827992ae700f547399ce03dc1dd77bde4f4f1fcfac747f06a9352895d6a3b923046a4240374881accd98c4de97e00db17d5f77461c00955672b5e859ec99201bdcbf892936f1e58f80e171a9547cf89c4a97f0c6019287a96ea526307c3a69a08326c0a3f15805240135a84c6706663891156b392c3c9a35008d259f2ebc538e7ab4e95f1e54225603999d412acef7df7c422f6af000060e20601200066038487614471ab4472ce0464fa760aa2be8d47241f5be98ebb965f39a7ac92dcf00abd06d3661c8bc16ebaa56edb660f5e3300084eed10776d244005f659be758ad3b5e7892857da243effde24fbf62424acef677317e5d5c3b33d01656b6c4c7a46c0b77c50c6bb0798b20d7e71077efa29b4e4c1eada23471f72488e10d7f10276e7e52cb62f1ae9382c69ef5142611d7f57c00024b102f110170080b40405802000c8e20561202a09000b681001d0e20527a0283d0139e8098e404a7202411011888088240420a0200100100d901f4df15b84998be6c30dadfb2502e8706a0fc483d14604268498062060005464045405002612272800200c0ec7b14b0104001a39a1400a20606199ea0b9016c46fa62642040fc3ca4dc3800e0bd422c18003da0f33d0208a4a504a01091c01847df8e5060f3a76100243de4673e74901800b71afd05003ff03560200128c128043051dcae7236162d74c2e702c908075cf1de22800169f6ad104003074808c4a004a010b2563c9529ef8c1c02bcf6f32cc1426849806202087e4f9d6098804096abac7d4b02f57c8e5c88400007270de228e0050028000190203c0b01d0580e02f09000c3ee55164806c9ff1e8c146081d433658b6e301004414000b4fb56881286128042b9f5568000fdd0cd310d841f7d27250786ec24d6956e50ea400000000000000000850f51ad0402598276051be7b8b5517c5d1caa846620ac7cce28600000000000000000000000000000000000000000000000000003391849649828411601400400170c0100680019b900046e20361200079e2034120190100c00800246880b848058240015124054c40286201331009168044b40203a00f19007088034340181a00b050050080240401002007010006c410060d00280802c0bc8022e800c6400422001110000280348e08183d41)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 41 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case4" = "QuadHeightCover12Case4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 41 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case4 private def zz2364:"s093c"="s093c":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l14 l15 l16 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l43 l44 l45 l46 l5 l51 l54 l55 l56 l57 l58 l59 l60 l61 l62 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x359ab213e, -0x547044420, -0x7eb3d8214,0xa3676424], ![-0x547044420, -0x149c3c6952,0x1e9e83b00,0x5ea4f2490], ![-0x7eb3d8214,0x1e9e83b00, -0x2256e819f5,0x549e0b020], ![0xa3676424,0x5ea4f2490,0x549e0b020, -0x2a4393d10]] noncomputable def hinges:Hinges:=[(-3,l5),(-0x6abab546,l4),(4,l9),(-0xd5756a7d,l8),(0x47272378,l11),(0x239391ca,l10),(0x6978abd74,l14),(-0x64b98aa1a,l13),(-0xbc4cc1ec,l12),(-0x1b3034372,l17),(0x39b084952,l16),(0x8267e5d68,l15),(0xec7d73c0,l21),(0x7030bb034,l20),(-0x1814cf86,l23),(-0x152da0f2c,l22),(-0x2a4393d10,l27),(-0xddc67d40,l28),(0x2a4393d10,l29),(-0x6e6454178,l25),(-0x39cc07c,l31),(0x249f6ffd8,l30),(0x2a4393d10,l33),(-0x23c1eada,l38),(-0x2a4393d10,l35),(0xd68b9d30,l36),(0x2a4393d10,l37),(0x6b468a24,l34),(-0x1dde8eef8,l43),(-0x83646dd46,l41),(0x4f863150,l46),(-0x5f878ba2,l45),(0xb23a5c5c,l44),(0x2a4393d10,l51),(-0x4783f056,l55),(0x2c76,l54),(0x3accaed3,l57),(-0x57b02cd73,l56),(-0x6f1a510a,l59),(0x1d0ff12c4,l58),(-0x1c2d,l61),(-0x5ee,l60),(0x6f9a51bf,l63),(0x2494375f4,l62),(0x113a884,l65),(-0x9f9256b8,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6e6454178,l25),(0x6978abd74,l14),(-0x2a4393d10,l27),(0x2a4393d10,l29),(0x2a4393d10,l33),(-0x2a4393d10,l35),(0x2a4393d10,l37),(0x2a4393d10,l51),(0x7030bb034,l20),(-0x64b98aa1a,l13),(-0x57b02cd73,l56),(0x249f6ffd8,l30),(0x2494375f4,l62),(-0x83646dd46,l41),(0x8267e5d68,l15),(0x39b084952,l16),(-0x1dde8eef8,l43),(-0x1b3034372,l17),(0xec7d73c0,l21),(-0xddc67d40,l28),(0x1d0ff12c4,l58),(-0x152da0f2c,l22),(0x6f9a51bf,l63),(-0x6f1a510a,l59),(-0x9f9256b8,l64),(0xd68b9d30,l36),(-0xd5756a7d,l8),(-0x4783f056,l55),(0x47272378,l11),(0x3accaed3,l57),(0x4f863150,l46),(-0x5f878ba2,l45),(-0xbc4cc1ec,l12),(0xb23a5c5c,l44),(-0x1814cf86,l23),(-0x23c1eada,l38),(0x239391ca,l10),(0x6b468a24,l34),(-0x6abab546,l4),(-0x39cc07c,l31),(0x113a884,l65),(-0x1c2d,l61),(0x2c76,l54),(-0x5ee,l60),(4,l9),(-3,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x18190020000000000840e20080000000000280c401000001c631c0860c05000000388ca04418080000000000640720080000000c45206c6018000000001a1c0cc01030c18210206d2200c000000000585033004000000e8b8581c8010000001912060250020000661082204b200800000000048303300400000d8441203c80180000000d120c0d001000000002c1a02980400000000058703300400000000a87012601000000000001c0c801000000002a1c02980400000a83a1303b400c0000000bc3802660180000000000e014802000000002c1c039804000000580c801330100000000b43401660180000000000140c80100000000032005900600000000065013200c0000000001880e40100000000000540c801000000408a204b18080002246108c06440100000000e4420666018000001f1505029002000000003e0a0498040001e45104c062401000000000e8881e601000000019894028c03000000003626031804000000006c48053008000000da090062602000000001b11018c020000002686c04d98080000006910403230100000000000d80a40100006d10c1200c90040000026c320065980a0001b4410480324010000000841b01366020000001203200ecc0400000278310035980a0000049862006b30140000000006c0124018000000000160148020000000001600490060000000000900c200c000000000b80704020000000001301e08040000000002202c1008000000000540182010000000500980f06020000001601700e0c04,0x1042988403d20080029041821030e40140002a08608815c802000000820ac0f60c050000001082603418080000000024180f3008000004504e01b06028000000000220148020000014419806c180a0000000004500a200c0000000001080c401000000000015034802000000000012071004000000310940c630100000000642403c60180000000002502480200000001c0a80f18060000000000980520080000000001700a401000000000005c0c801000000002a0c03180400000c4540e00c400c00708a3084045a8028000000208e4090c0300000414748188180a00000808e50110301400000000001e0640082051420c1039990060000000005c281980200000a192702183014000001424a811060200000000002501c80200000000320a0518040000000380900c300c0000000cc2205a60180000000001501880200000000322c031804000012c8623015400c0000000000700e4010000049108680d9003000000004c1a0698040000000280b01c300c00808c304405e28028286187047020c100600284314128108200a00000006209016300c0000000002380c40100000000004601480200000000008a0310040000000001140e20080000000013801640180000000027404c80300000000009a03900400000000000d032004000016124601e660280000010c250070c040000000230880618060000000000210320040000000001a01840180000000003d03880200000000011812900606145103080ee94018005288408407e4802800a510810806c9005,0x5458198020000148560e01c400c0000012890580a8010206141101036910060000000024160318040001d85110406c40100002988218812c802000001d088380490030000056210c80f200600000000381c05300800000000e8501a60100000000000a0348020000000001880a900600000007212021300c0000000006207a401800000000009024802000000003c1204980400000000742409300800000000090a0660080000000110a02cc0200128134148074a00a00012c2d0640794010000000881e00f660200000001105002cc030000000110581218060000000064240730080000000048381460100000000001a0148020021e1a8190165a00a0000000000940620080000000001380c4010000000001340288030000000000520310040000000000ac06200809204c021805e880300000000002503880200000003b168051806000000007c5c06300800000000f8b00a601000000001f15018c020000002e88c04d98080000007914403230100000000000f80a40100000176210032cc050000000001f0049006000150250740c84010000000a42301366020000001604200ecc04000002f8410035980a0000059882006b3014000000005838146010000001b413005cc040000034c130023980a0000006505809730100000000d81601e6018000001901900dcc040000003782803398080000006b06403730100000000d41c02e6018000000188300dcc0300000348110033980a0000006b04803730100000000d01403e6018010214620808a9005,0xb6230900b200600000000003407200800000000d8280e60100000000000501c80200000000002e031004000000e32c408930100000000098700a60100000000000d01880206865021960294a00c0d24a0c38404e940180000000000980a401000000001a11018c020000000000260310040048461878020d40141429228cf00c48803028124118600c910060000000610b80b980600000c0855012e30140000000128281460100000000018405c803000000002e160498040a147083040e664018000619642180708020000003ccc10224c0400000000002e02900400624b309502344014000000014848146010000000001a405c80300000000422605180400000000005c092008007788607c0368802800000190e0902900200000000002203100408147103080ee940180000000c426028601800000000004c0c801001ca3102101f9200a000000000011032004000000a8502814801000000001507028c0200000000220c0318040000000000440e200800000810c20498602800000000b07024c02000000005e0a03180400000000b8140530080000000168280c60100000000002d024802000000005a0e0718040000000000b40720080000000098581460100000000000601c802000000001e0e0518040000000054280630080000001042405a6018000002082903e8c0400000000001203100400000000684c0530080000000cc3c01860180000000000f0248020000000310f00e1806000000a111c0af3010000000000012064008000002cc810224c04,0x184208126180a0000f02106809c40100004e0781080f080200003c0841400f10040000001082801e1808000000810cc0a9301000000000d0980c6010000001c424036cc0400000390228135980a0000007308406b301000000f110602266028000001c42400acc04000003204200f8980a00000760810133301400000c21020662602800001942140344c0500000308408088980a000000009438053008000408e223019880200000000000f01880200218384608126200a00024841044084401000049086098188802000000001105028c0200000000220e0518040002484105408440100000000128281a60100009210c1b03110040000000000120690040000000000540920080000000098500c601000002c20d404b8c0504021ce0bc01ca200c0000000054240a300800000000a858146010000a120c27031d00470a3110e100618200e07046343a8063040180000000000681c4010000001c85103e0c04000000006232049804000000c484640f40080000000e85203860182812411860189100600000000001e029004004b0808e1024c401400002508438034801800000000a05014c02000000000014029004000000008c1c0a3008000001060c8044602000000248710250c04000000490e607a18080000000000740e20080000000001a81240100000000001d01880200000000006c02900400000000001b032004000000000f1a06600800000002311034c02000000002c12031804000000c3044019301000d09080e601328028000b628c2100a1004,0x18a2902101f9200a00000000741c05300800628a40840364802800000000019034802000002883081a8980a0000004305404930100000000a84202e601800000000e05038c02000000005a2a05980522060610102d3c401c0000000b02601460180000000160b018c0200000a2311080f20060000000340a01d300c00000cc0c202666028000000c41103a8c0400000018822025180807906044dc07204018000308a21b0198802000000208610250c04000000410c607a18080000000000640e200800000000c8300c60100000000003102480200000000320c071804000000000064062008000410c20a0128802000000002105034c020001043183007a20080000000000c8052008000000000032064008016224c16003d5005000000001a0c0698040000000058240930080000000000160640080000000000d034802000000004a34039804090831010c05a54018000000e23180d06020000911cc27031d004048a3041820733200c00000004219022300c0000108642c0488018000000108440d0c03000000005a2a049804000000b474540f40080000000088580a601024318104b014a500604923060c20274a00c0001f06111c0484010006c0a10fe0320802800d81421bc0641005040a2841020733200c00000000241806300800000000482812601000002a09824085003000000002c160718040000000541302a300c000000b058280a801000002a098300290030000002c160c07200400000002209034300c000240420a8048802000002408834051003,0x59288111806000000000b950330040000000169481460100000001988c050c0300000f6520d80620060e0cc08334067440181c498307380be88030000003cc490088c040000000311280a180761490820202533401c0000000b8706068008000002d0d0503500200000000005a07100400000000b4180630080000000168301c60100000000002d0188020000000591101518060002c4720e007640100000000168701c601000000002d12018c020000000032140318040000050881024c30140000000ec620686018000000d4210208c040000000002600e90060000000004903d200c0000000fc6a02860180000001e8cc050c0300000003b1880a18060000000000340920080000000070481260100000000d844088c030000ce2283205ca0080000006215809b3010000000d0290076602000001bc28801acc050000034c510035980a0000006417007b30100000000c848016601800a51080880fc900500000000000c0690040000020831030630140000041056060c602800000000005024802000001842581ec180a0000003108c06830100000000068501e6010000015019007c4c0500000288308198980a000005106101113014000000821a818c6020000001884103e0c0400246290310118a00a09145483240ce24018000000001116066008000042188ac0d100305044022920239a00c0a0863841c08b3401800000000131a0660080000000250f01cc0200000000421602980407146103080ee9401810a8c1060808c4803000000210d0a019002,0x32048071806002202082f034840140000000007207a4018000000000f007480300000000642a04980400000000c4540930080000000441602860180000000a83c050c030000000130680a18060000000003b00d200c0007090c1c81ee802001d1208198051d00500000488508198980a00038c840d80a740100000014e1b0076602001d020a190011d005000004a8528068980a0003a4850d002740100000391143802e801800002442840444c0500000000261406980400000000002c05200800000000b8500a601000000002522018c02000000004a460518040000000094840a300800000013c8e04c6018000041190700a90030000000492081318060000000984400b300c0000001348a02c60180000000252101cc0200000000622403980400000682c0b01d400c00a110311a05f2802800000321f1102d002000000003a1602980400000108a85c0e40080000020950b81a801000000002a17038c0200000000002a07100400000104a858094008000000148560546018000082290ac0a9003000010852158152006000000b21c40f83010000001842981686020000000310a40b0c0300001025215814a0060000000c42b01c300c0000021148a80a80100000002d0e4070c0300000004254581a0020000000054480530080000001e4220386018000f311023025100400000000000e0310041008d0c914072b40182031a4927814d6803001a22c63b40be500500000d6130601920060000000007d01f200c00000000b86812601000000000029038802,0x693281a18060000000d261034300c000000000f12066008000d13144801910040000006a440a05a004000384d513004640100004104c08816c8020000001c84c00f4c0400000384498086980a0000000094340a3008000000e2308054602000000000049038802000000000092031004000000004c340730080000248541203680180000000311601cc020001463e08a037200800508818ad02f940140000000050380a601000000002506038c02000000844a0c07200400001e8c61b026400c0000101166021a60280101166168043500500000000160a03980400001e82409023400c1a196106680ce8803000000000361c0cc01000000006a1e02980400000000381c0630080000000148700c6010000831905401e90040000062290f012200600000000a4380e30080000000c442068601800000001d1b024c020000005e3c1205200400000a43e0c033400c000001420d81f0602000000000d0a014c0200000c2440a81520060d08a0c714072b401800000001102816601000000000007014802000000408ce06418080000144640d012400c000000000208124010000000000420148020000006a24120320040c0ca082340674401818494305380be88030000a121c3c01210040000000290e80a1806000000911dc0c8301000001412420498602800003114838089003000000002a0a05180400000006229022300c000408c6298134802000000001907028c02000000029108191806000000004c180e30080000008609012460200000000c8440d0c03,0x190601e98060000000000580d2008000000c22a81046020000000841100a0c040000001082205418080000000064580930080000000c45604460180000721d83807100300000e43905006200600001d8720a00c400c000750e209002880200000741c828029003000000003a0c0318040000208920a01e400c0008412209006c80200010e2441200d9004000010a490500da0060000000000380d2008000000000d1606600800001c61440248c0500000000001403900400000000007c09200800000128e8280c80100000000311501cc02001cc2bc420125a00a0001d85411007b40101411018668124c80300000016110502d0020000000490d00e18060000210921a01c400c0008412219006880200000042250e039002000000001c1603980400000000581c06300814710088c81666803513202885c086cd00705084061020754200c00000000a4180630080000000148301c6010000026220c044cc050000000220900e9806000009608101333014000000821081d4602000000104210128c0400000000743a031804000000000e8f03300400000000003a064008000000001dc04c80300000001e1c281a002000390790d80564010000000000058124010000710d02a0149004000000000072059004000000003a00132010000000000ea01640180000000003a01c8020000005885607c1808004846984801ad40140000000050381c6010000002d160b029002000000002c0a04980400000000012805200818112185800fb28030000069230c4099003,0x760310040000000007500a200c0000000001d00a40100000000003d01880200000000007e0310040000000000e40e20080000000e46202860180000001d8cc050c0300000003d1a80a180600000008239014300c00000010c7602860180000001c8c40d0c030000000002080b90060000000004501f200c0000000001880c4010000000000330188020000000003280510060000000000d40620080000000001b80c4010000000000310388020000000001c80a90060000006810401330100000000d44201660180000001b88804cc030000000034220398040000006d15809b3010000000000d120660080000000191202cc020000036c520065980a00000008c0900c300c00000011012014601800000002209018c0200000004204806180600000008e1100b300c0000001081603860180000000210901cc0200000440208013180a0000008a08401630100000001102201c601800000002105028c020024838c6180e9200a004185486c0171401400810a30ea03e28028000000000410388020000002986806f1808000000510d809e301000000000d0380c6010000001d1b0701900200000743405805200600000e46a0e012400c00000129102814801000004921828089003000000001e1205180400000000048703300400002a0c42a0568018001212e06c008d00400000000340c02980400000000883c0530080000249143c0248018000000f09060290020000000330b00618060000000621601c300c000000680881b46020000000c8130268c04,0x2c0c0398040000000000180520080000000003e02640180000000007402c80300000000001a05900400000003e0b013300c000000001c002640200000037250503d00200000dc490480da00600001ac940a033400c0000000001080e4010000003525090390020000006e4a120720040000000094240d300800001c8c45207e8018000000188a4098c0300000000541406980400000004219034300c00000f10c6022660280000000d048074c03000003b0308099980a000000310840ea301000000062108094602018a14310302a710060000062291081fa00606085244240a9c401800001d09016034801800000001207018c02001e224c3181e9a00a00000610610351301400000000c8781a60100000000190e034c0200000001d0981218060000000220900f300c000007108604106028000000e4230220c040000001502601f18080000002804401e30100002705409807c8020000000e4230110c040000003e221c07a0040000000220f034300c0000045056049060280000000882c0d0c0300000000120c0298040000000421302d300c0000000d42604a60180000000004c0948030000661403a06620080000e42e0740cc40100000004a0e818c602000000014884050c0300000002b1180a180600000005a25014300c000000000b12066008000000188a4050c030000000331580a180600000005221034300c0000000005202a4018000000000a40f48030000000001600e90060000000002b00d200c0000000001201a401800000000039018802,0x134218660642008000258410c4048401000049086198190802000004a1086409100300000000322a05180400015c4508c0f640100000160882603c801800000014884088c03000002d0418013980a0000005d10c017301000000b310c008e60280000001708c03cc030000002a09201b9808000000551180973010000000b624806e60200000001689805cc030000002f88803398080000000582201f300c00000b210400ce60280000016c4200dcc040000ec1283a0662008003c82282d018c4014003684505801b080280000000002301880200002401860025980c000004a863002b3014000009f0cc009660280000012833006cc040000002407201d980800000000584405300800000930d200d66028000001243600acc0400000002c138099806000000005848073008000000a424002660200000001509402cc030000000320580e180600000007231036300c000000e8a858168010000001842302a4c04000003102180d9180a00000650430272301400000128b8981c8010000002515110190020000004e2a220320040000000240a01d300c00000130a8880a8010000000841103a8c04000000108220251808000000a468580940080000408258122860300000014414036cc0400000290128135980a0000005304406b30100000041042041460280000421287c06d00300000000140c07980400000000058303300400000000a83012601000000001506014c0200000002f0600998060000000520c013300c000000b009002660200000001682802cc03,0x820590040000000000f4072008000000000be01640180000000017002c8030000000002e80990060000000000e4072008000000000aa01440180000000002a0148020000006882204b18080000000044140f30080000000190681e60100000000310d02cc0200000000621c0798040038861851024a40140000016e11012c602000000002e0903cc020000005a84804b1808060850c14c07a040180000001642403c601818a14f05f0368100600000000441a06980400000000004c0920080000000001780c401000000000174028803030828c1be0449a00c060850c13407a0401800508660420524802800a20c608806c90050014a18c128139200a00000005209016300c0000020238812c602000000003d1903cc02000000788c2034980800000000005407200800000001c8281460100000003882c098c0300000000004c06900400000000c4380630080000001843803c601800000003106038c020000000034120718040000000088280f30080000000001a81c4010000001843302a4c04000003103180d9180a0000065063027230140003189819815680201c218307001f650060000a22086c05520080000000004f013200c0000000001281640100000000098004c804000000000268059006000000000098072008004a866046046680281150c607c011990060000002082806d98080000042025026b3014000000860880d660200000000110f014c020000000000f00490060000000004f00b200c0000000009801640180000000013404c803], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0x1e50633592b30af178c8ee60c36cf2c30d1465334769803c9517942805afb20000016181f0041bf02f8c91a6367d9e580e6bb434c0004ae44aa00462842010921219e0230499e25073b4ec99a085d61e) <<< 16000) + 0x98790008eb364498af9b0e521e989004b186868000142cb79a20014555f5265201090051f1b40e5f00000000023d5f1c9c6483b696d8c2614904cd3474c54c40c154014030080200d0001253242433bdd18933c4a0e7b0b533410bb0aba4f20011d5696d315f362e94e13120096681ad0000285971fc40028aabd634a4021200a3e3681cbe00000000047abe3938c9076d2db184c292041078a988104602a8098060100401a00024a4000b9cc4f90cf17ffe48e128397fbf48c042e90dfc3870047632394847cd7e0cd548380256bf6d3c000a165a2f0c00a2ab064a2900848028f8da072f80000000011eaf8e4e3241db4b6c6130a278e39c2241960820a80240180401006800092904e0100017e181d259fef26e89a22f99f89668c037a72e52886ee457fe8a884fe58ef38a50201a99179e7000143e7012100144d5b0865201090051f1b40e5f00000000023d5f1c9c6483b696d8c26140e44d1862c34422810414c030080200d000125208c0237f010001889000c2c3c648b3009d4f2c041cc81a702000d584530001233d528481042010f37f36b5ad50303f9605a8c1427ab73b45155b5debe89080bc09bad006c1ca3380d0003b6884c1004365b68ca01080021e6aec535b245175d5ba264508b9a6a1ad3c29c7cdbe01216c8aa6b6900717c61d62900016e360040006be6092140210804000062c800194910705083028424140008b840045c0c44ab7931b65c84e50d68751fd483cfd640460f8da072f80000000011eaf8e4e3241db4b6c61311e51831a29e0980980140120060200401a6fc03816012779e734b93992e6da01017c4bb0cb000591d68612041080438c566e48f39e580f35e98ce282b2fd7327924f141c603c190144647980003c894741001d0a96ba4e0842010f8da072f80000000011eaf8e4e3241db4b6c61309c69c51220822219c19e0a20180401006800092900029e20007264df4246f81237b090670280017548e004eca1fa3f84bce24090b1cd02c5112400004c101bfb89af3810133897f0b060f22369f2401753f8f8809c30880206f40bd2e3462a9847140aef6437349006c83908619c246ebb0240821008718af73a2293cb05e65f869c5038710c14f24b395fa2020921ab93103c18eb6f4b382003bf91c649c1084021f1b40e5f00000000023d5f1c9c6483b696d8c26138d38c38a38410424208144030080200d000125200053c74b91a633fb9c500e6b9a6cb0004ae426411841080438cc88a3ce63cb0e77683e38a048727523c956117da81043e2d36e43c1fa022c2c0400fbfc26f2704200087c6d0397c0000000008f57c7271920eda5b630985138f2ce28e20e10410f05100c0200803400049480014b900035e2000e164de43413c1a3780d04f8487000400121a6610e34c16610e34c1b7227fa8624c1aa703c2407c6d0397c0000000008f57c7271920eda5b630988c2cf28c28d1cd1460c40ca00c02008037e3681cbe00000000047abe3938c9076d2db184c261668e60c68a40620678008060100401a00024a70b496740903ca016e360830a891fe7273476b39a9463455798755c1833afe7f091039771e5462802ca2656628042000868f0eb5496c8830617865177761e180c94c9d4bc80c086b384e183061ddbf67694103015266f6c88c09d15c439980f000da2526d2410012708003de2d2410a408000040c4000e909bb82e610e34c16610e34c1b7227fa8624c1aa703c2407c6d0397c0000000008f57c7271920eda5b630988c2cf28c28d1cd1460c40ca00c02008037e3681cbe00000000047abe3938c9076d2db184c261068e60c78640620678008060100401a00024a70b5beafed7d8f2808f0d1b2030ad695669678d1ee8a76cbcc345a89c0abaa860d9ed353b81103e0c73a63e4a010b827b96d32201098081f1b40e5f00000000023d5f1c9c6483b696d8c2613ca3493083473063c31033c230080200d00012520005f24dd804000c5a4dd4346e81a3730d0120683f8346e412000d9e23663b1b0119b488cda0460da03f8da072f80000000011eaf8e4e3241db4b6c61309639219610411209401000000020e0800401a32e3a3711d1b80e8dbc746dc3236d191b6048090243660a0001f03a4244ee6d2cd87b36479a57ea90960a6149ba3f2762cf545a830f39fb40f96e5a4c7fd5d35600778fec3941cb6fc1a976f43c7fd0861429fb49ee9eb6b609732b347b3e3f1db9910f10ba8fbaece151646c36f965861a73a5b25cd3c9829d6605e61012137de93c8f48de76c8209ee11a19e2634e7f5622cb500a5a78bfb1e14b3a3df272e2c94a1993f70549a5dffd8e2edf92ee372c4e847d9c939d8638a1fe4f59916485512d6c67725210cced616f825d3faffa3abb2e724d544b5579e74f4697816841a5612a81cc6d43618c25212906d60a8fefde9dcdb4b8597f57d5e733bf948c19706098146cec84836d2e165fd5f578fda7d5a82b46182623032832011c1141340280000030180200d0001cc204823c1dcd301fe8e1bdfa00ac1c1444d9c126016c537558024101f0081b50480003a88d88cc65c66366331b0119b488cda0460da03c1c55b20aee1027056dc72041db4b7b38080097b3393c00424202100860e0f040d0408177a4794098041f936a2c00423202100800005c102c191b3848090246cc0a00020c26ca62364311b1988d88a40019684370d669c5334d099a602cd2c166940bc249bc338413878264919d85179bd24da808200cc2a940c04098b0cf1340014ab2d28981088021f1b40e5f00000000023d)) <<< 16000) + 0x5f1c9c6483b696d8c2613093871451840824804003c030080200d000125384a177af474e1f7b60a6e028b752b007230203f819de9a08154a3cc4d001d1589d84c0842010f8da072f80000000011eaf8e4e3241db4b6c61309849c38a28c20412402001e018040100680009290002713641f48efc04d1b4d67ab2a20890eba44a3c21327455298004d543504941084021f1b40e5f00000000023d5f1c9c6483b696d8c2612c83461041430414403c038030080200d00012526c20200025934396e471fa871d7801d22060b47a825652c109c1e6a416008c5c6b44941084021f1b40e5f00000000023d5f1c9c6483b696d8c2612873050c310204140038034030080200d00012526c00235f01000137135e01d0e234f8ca4cc14d48051e7061b4341c62e381a6ff6db483831b2abb374b0004b2d54c93021180434b0039384c60e280ba69477e287159ee2d9d8c15053c65b620c384e4d1b0f8e06ef5d0c19a1c1aff9f681d0e001e2985b61290084c0280001b63f1b40e5f00000000023d5f1c9c6483b696d8c2612871c74063463053c40c30c12c032080200da1c3994de187d838e61ed37ded2c4061d58ae920af1a3046952db63d0c1427cf053e69878808793dbf71a0c335f15c88c92060eda957565adcfa10085a0580001f420006804d74146b80a03f05000354135509fc6d0397c0000000008f57c7271920eda5b630984b14710a0c908a04700000009d1e8a7dfd301f4f12239830a7ef53f25412dfcb637fb4c11c61bc51a6b62a03d0580010612ac119ad04cac426560132af0981604cd64262c40bf8da072f80000000011eaf8e4e3241db4b6c61308821a19619809408208000012555331991d933dd1ab0beefc2037968951f1bb24a86173062116fc6d0397c0000000008f57c7271920eda5b630984d24a20d0c90810470000000040c15370de2c4a04ef4f4eb022d2b46ae27623adfd7adb0b9cc1ac4da0003cc42d0c46b06203f311560480010a886812c1b4060d803b188fdef3a86da1d5c845cf58d952fe40c0035f9a5e650375a23a445d89c10241007b8dba0c73d4446ac0fa0e72811207cc7a74810ff2296f782cfeb6d5005005fa20010f237f01b06071b3857540000200079d4b72c79070abde001187d24f9049fe841771fc7468a9176763d4d128850b66a34f091bdc185218efae25bb53ed6dbb383852dc2a43889e0d5d140e66a0c70d00024a9a0e296d97d80c39c372170080543b721291c0079d8dbf4500038933b80004094a0880202c40335601c0a0e5914478a2e59b24f485068a70b511081076c40b561055200b35502088cd57dc000204c4844010814528398ec2835513a9274b09518f4b81102150148520107daec9d783803d610e9c8b0009ab522700102724220080000ba93551dc841e5de52f0b6171c348c413f2b48181da3d634ccd0b9de299e67860ea4d0ecd860844f6d4494b93db087d5afad7c18095732d49c755d4e4c9ae0b848e2729b9ba08220aad3e8163aceeb7cf2514092abb690e4f69317c672ed5039aa0e6a82198a160581fedf7ed8bc4504c46aa51918b01f3059fc9771e74b76c0eef242b1cd306c0008022fdf1bdaea87128af8c667e46e765573410daa0b4f3f16b8bf903169cffadd71ca1bdbb431bf6977683fea62720a240457008b843173d75008e4859f46c000061f200124c4340860da0306c01c81622671237ecccc4ea6aa23ed9a65bdafd439e0a28add4e4f4a3d8670e90c07f8f8789f2f955e047000010020bcb39286b470d50aeccdd344ee8cd0ffcf8460dd2ad120fd7be5a1f7f42a12dbeedb4d4e271123025057d40555a101a87677042ebdea4cfd2a1de77e842d44b1f5bf0942aea98c8a25de4a692a42e73850518b6e38de11013ac66eb1c332c962d7f46b1aa5fc7ec55d9b913b1b579d604ff2cb914affef371346726a5f3179dc0c60c9619ca50ae2734c6d93c15a613c409cd60edbf245d26d84b7580a0a0a3c00019b49aa1e8d4cf46a47a03a351038c80046d886fa08d44a4005dd64c48c66203b30f09fc6d0397c0000000008f57c7271920eda5b630984b18b0c40c60830880060050000122aa21de9e0c8639ade8e5a1a1de03a9a927cdbdad4cd60bf20c1b050a0da0bd20535d9fd930583e7dac20814fafcb043000423242200860a4c6d209c2054f5188b18c2ae8cb1864d026f6cd30800084848420100000e726a012a3676424000b71a8e25369511cea96354bfe095aa8686978f00b1db0d8ed8cb1d9fd0ce9d054cc20c1cb009007001000012b76316a8e02922de9b515ea4d09f3edd25e86219db20bfdfbb6a11030b0faabf1c4e8962c981f2800162934f0900026492ee19e3851af7d33878221b04e3ca1c01355fa57fdea51239d0a958830880000000000000000002492254bc10ef8160f8da072f80000000011eaf8e4e3241db4b6c61319428e28a0940060000200216d9b30112b438f4cf670dcd195e55e7877afbd920579e2179a014f792129c944c5b6edc9c92988c77af87bf231e2564028f687e285d5cf2644a1cbb9f83377230096df7b8e1a4ce6232843ab3e0d9fc408f86deba7488b7a3e5d44bf6c451f953d0a3a68002c010dc359a716cd34266980b34b059a502f464f55bf21e48c227bafa388142dd43e501419ca89d0080828c904fa88002129011804346ab37394d89184cf2d2b520534c864500a0fdc08978138013000c09080037a8886b001098808802000028a7881e20343089090221ce4e020ccfcf71aa3001047f89464000c8b147e0004194908c020000)) <<< 16000) + 0x23a4ab0774879261156a85b403f91818f4220d83e3681cbe00000000047abe3938c9076d2db184c458838828840250030018000083781ff31ac8e39e3b34731bc1cb30475f6ea994db71b3c1986819127c1d4c62174664603ae593a40d0002c521a03b06d0183600e830aac8bb5eb06e0630476aa3b192241feca3bd912fff73de60c183e958a049ef4b774b1480f46ef0c6cb8800af32f301023089023a865311acb9b72128acfa99b52d30dd05c2f432941e709028005325ae1c97f76e6fce79a6e2c2d2ecd8ccbcfb75e1afa3400010050e93f72e91aafdf5498ce4cadaade40043aa72d82fcd83401400a6866b7678e099db26fd65615cf6590fd375275abfb80ca692857418124c98f532285ce1e2a0cf2d928d25f08cd4c7bc5341d7fdb421785442c7edb3d61b932270d710f3049d0000ca24bb87770856fcc0aab053a2a0b8020e1bc084a59ffe4c812e255bc38a97f00000000000000000004922e7528f12f655a4855950541f1b40e5f00000000023d5f1c9c6483b696d8c2631c51420412400c0001107165d1ba712dc72aac54fbd26731d3e7d020bbd58b02a3b42d729d76ae3d38e030ef88719ec3115cc8892db4877a0fea2550360393ac37ae700917febddc5c9cf30e3436542f2fe910efa83178c565df65cdaca479281f0e5e3d3e95fd3e6646406cbce9f3afe5fdb151474fea000bd0437ce4692423481d06b888004f00986aa8d1d5468caa34549060968c24140042ec40f46783f6f43e7b33081a34eb0d37a870a78def8f5ac2046074424a4a0c246f85d0c0f0e00fb515b80d01000617dfcdda0028736e90c9fa442431150f8d20003293df18a0955010c677c290200001291c097b13910fbd9141254fc80790da18217b1adaccc70204225c0afddd28c004589f889414140af87e13e2d6c022a80df692e8ce09551415447388245b3b46151f4f5f30a0419126802f03000012c934461089a08d0c05a59a00b2e44ccd28446a0c549e5145ca1089aa428715e0adad18861804d3f62b3080436eaace7701820959d54d152c09bdb1175528c000044aa20000249102901869405702144a59137b95d95e5103bee9a5e858f9d4f8de3050e2712311c25060ad8d7fcc3800406ff820033881200400005e4e9416a700d430b223680e6782963c601da82fb2870e86e2fc10186019bfcb91010477cc8e4f21600eb918f838180000b71b00010014fa80a59324009c041a504375ccbe9645becd0d11963e35e8396e9438cdf5577b18082f79e5018e0012506066cc004801000014126840a341051a00281801400073c437017438022550f22103830f35c5e312358cb099c8b14280112a8800122cd48b8b07510287a8d8b1b01400c53a61acd100161a53e44480016aab58ba30001891c280140001031b242d914bcb062c80d7f70d70d09189bf26c332d285186ebe9e8109162e8279704d082972d4c1fe40b046131a63a04041016c01658806011c4bf07cc00304861500e246b6e7ea4d94a14008954400245953f9a4c6c8143d46c58d808207536913f8104c050f8ddc200588faaf6d03002168648400000f2f5bdf680d2184c0180001ea2630223171118b0880e8440008d64cfc6667c1b3120d99e82cc40166780b30f05c0ea35e37128d41c71134eafe3d7123732ea81b4970a1428978e50ca048b94419e393a42c209f92f7cb281411064ec2d8e2480876fa93dd6e43840adc4769ffe03e890c2d02819d80e0726f2548b520e3915266c7c8091ae0cee8c5c650a0e22a78e38245bd78bafbce902836decb8110b000dd5682a384001316986f8c1c00b62648d3600ed2205203000020a26742b3390d90006cce007866075c4b81040ad5282c889881366ac6d7e00a181fa14bd8d101078bb37d2c1020fab480f786004cedee253080021739f2110802f5e090780002a64921380800007fc986948c30a46165230a250ae8a8c2404000eac40f4370283c203cd481851a69223d5828b6f1475abf0711340cddd848e1efc326ae1f0c10fceffe3d84801fb4e327b060013cc797d20083d748c4d8b20509c041c7039765e772048d81dbc9f3e60817d773edd6aa1220400817b78810334cbbcf824e28429f13b4e6c4802824c46923004011345591f4e01a23a0c75913688102b02447f7ef4ee00955db96c929b15c1ffea18c11147c9d876956f8561d0dd4c2b59bc04ab2f6fee9a7b65033a2ef39c4000000000000000000094028a2871cf956b5f1b374e9b92779fb6b740c0366a1194840000000000000000201f288f7f8e0816e823ac093de2e9e24eed21dea0a7d8a67f9e1d0212362313a3f3c3a04246c46272212922081841080095e3dd5c776014a7946d4d09bbc02a740d46d0f4aab97032226ef2e7c7574388d9ed18ce75d2f90c87f636601291a85cfac559e735101c1d8a2acd51052eace1d5d65f3a90cd423c74cac15a279a583fb32f911166d39b32d4995d6cbdab8fc163f31a19a999472f321396b7b5b60b218beaafcf7d7c5ac6e386042b1047f9dfa00109c40029ec99b8c8cd86466a3233415199888cc8346621a3300d197848cb80465a0232c010006bf132b2d99516cb347723df50d896a7448c1033adb9dc1032cc1e52b4f240bb6d61d146a0e212e0ac12b844060046cf709d1014611bfe535230204d4c805e90400001f78a37d0a400a807123ed6a04aab8e236bac8e88901cb83a63ad9014195d61bc8e159309e4c884082b049d0a0200d478156c4e0048010000171207c0b3290583a82cca0160ec0b07801c8f3f268430e20641d62b7949)) <<< 16000) + 0x0194ec8ec49070c302878748404ed197f76a1c22d56dcda7013061280402880614203a22197d879d491fdcb0ce0c09126948f711890db2afeb37880eaf97739c46043a8bee0a010021a13467527082400848f694d3497314519723f78d12238dcceea80810fbddd052c486545aee05d2030016e35fa140049452e7002708250080000be10450d003048000cd881f028001374993908c988464a423241d1918c8c88346421a3200d18f8280200463c0231d0118e00801c040014684c6cc607a5bc25deaf02cc3025fcec3a630030872d8d1204b3b4197c002418210086038bae8b8e4802334f9540441840010f2818b1db44d290fc65700a2bf6a22d0890853d43484c05f8a8a284b03ab57ff28098308002000025e6020020080000223a40c25d3c40b2093b4f3ae41143b2ee401c31d8597851a01a32363c0009450840200002184000cb481c86ec802550e5a9630406d65f491ad1edf64828233963d8b2c0314346a90002553e4ee800026202100800009f926d01c02004011862aaef368145c2a320d63c012b0908d20003098acb900080021000010040000111c24b148e4e220939bb856418029f20e6811821080400002a88000e9131a0dd0e8e7ebe981051567951a20033ce3fbc01310200040000561e190b101ec2c0795a2d96401743fe90408c307c02049a123190500006893181918b8c8c58640743200042b262a43314199898ccc48666220b3100596482cc3c1747c9d876956f8561d0dd4c2b59bc04ab2f6fee9a7b65033a2ef39c400000000000000000009449957f0439e05cc21c6982cc21c69836e44ff50c498354e07848638c50a40a50230208002001ccde5773f33561fecda79aa622f42751770e9bd32cfc72c689da7626085bf96c3a1e7166754847ae93f017f73aa5137f963fa4676129324cc01755687a78c5a0a74d30e09c44ab79336cb909ca08181f8d18bc117582227bd7b70c5d589c7c0d41fbbc90a1c2f738f3d681c86f6964bc4700000000000000000011d0f9b00e012e18df7220004fee7694d803e14196a2e87ac13b080000000000000000044680e1817ce09784c3e44a2b09fcf22f6bfee53e5a53d9f23c80000000000000000108a32eddd46fc0b52462800c00800100196ce91fea3b2c6a835f9b600371f803dc20af77c4cafee74435ad9b37e8645b8c9871a9e53c83942d7723e6e5dfdb7c28236a106b6186841ef498ad4680edca2e34c9ad7bfdc6f1827f3ae0384ff8066fdfbe70833d1bf3fdea5877c10f04478b9d62d2f920fe31782ab101f48fdcdb31c54c038903e6d9216f739b40fc140010a44c34d46186a30b351851885747461202000d7126106303d0dc44ab79336cb909ca08181f8d18bc117582204a274ea89106656bdd0943ff80ec96ada29f83e3e5e16cb31fca1b8000000000000000000128fb44fbf46bc0b3e511eff1c102d071051080020010001040045dd182045f7a44c334ea376077b6b514442311bf23d9a40a9e31c31619469e9872c8c09f3ef0298f1ebe9fef6da7847541ec610c8239deeb65439efbc147228d12ab21a7650004b331fe0a14b6b2815c7845525597e510c480e7f43eace9c330aca539c0000000000000000001249fc145673202f26a1802d22d6951fa81538eb5aae3f6c899a370000000000000000004523ebdfd0cce4f79db3824d8f6f096c855864fe438d7e3e3e580000000000000000108c40c7044047006004515404dbb74583a40166381012ff98a3a5292d64a9da316b303237c74a28c339eff052843fd219739f4a9cf57069ca3df4d181e92c35307e3f6504d3835e116448e5babb4e7898f514338bc16f49ad8f913ae79fe25489e0bddb895b6c9b24c7e6241f3e0c04ffa2b5aca8e67e9559b2652983808001d0c81226800924898334cc15a6608b303f59981a6cc08866023b3001997f8ccbf84600a7f8416586058632fd3197e08cbec465f41a28a0197c80e47233df9e64d19b1f31293246bfd4ba34890a533952ba2c109cc385cca057ff8b42f240574b240680014027302200817c06cbdc365ec131070188300e610e34c16610e34c1b7227fa8624c1aa703c2413462862462c124114008000001049e37a18a7b84e31dbf63d91d3a76db1939a51a91cef46a3890f8dfe8289f5d20dd37b77d14b9ab1d11c452a0004d24bd4b72405e1c7a2848e6ad7c1e29a30e961198a58d5c59bf1c9234feb7a730488030d75ec80804c40440101090d97a04cbcc265e4131070188300f4659ecd719b57ba6f2ec1e955f03c51f21d097f5b895c580bf0d3a3bee3ca5580b184c47fd85157877517a8b7e2b0053eb520ce6a5a25f542a604b69f07188d387246b5e06f8c16eb551eb2b36c71c4ca6004611d3c7ff82140beca684a5deadd104500c51c50b4287428283cc903b079244f80bcebe742be063a564348d109d9ab64000100864c7a773166a01a7149e7ffd7b05199884c6e3107ffbc8d15071443d39aa3a308be8eebaae0920f58fe975674efe8c0631c113011a4bb8a42f014871f46c800062625e26a2f0350121a8624640010b04bb4c65d8430652197590cba8665d20bb1c832e83a8287f186e3b4c80cb5d5882b1c35b0826f4000409090880205de0b8645d1ea468e3187213aa949558645d1ea811c7d059a2a8fa0b3452f15dbc4a5e2bb7895047660f851bb307c28e2ffde56e6e5feb09010e3178820d6f016860e50e40638610000219d6eaf9c209f6a39a92280e9924aef857a8078ac19dc0c82a1423fde131a3a31008c013dec76a788c02ef0ccca82517678e9)) <<< 16000) + 0x5e759d5cbaea630fcf02947e1bd40010f88848ec4945620e0310601c322e8f5234718c3909d54a4aac322e8f5408c89543fa16e35fed874579fbe74ebc81e23462c62461c21821400004001332297e2bf8315c0ab122e17698392418c878183d0b31b3f8db1ef46c9d32765eb17dcd5c12367ae22abdb372240f2ef7bb0e1b25fdc09880c794040d00036321b4632ee21d0ba8b290f28d922cd12035361a40b7b6f2c410e8e038f6b9baf443017a06af016e86009010f6974c00a20a3814cf90b00995efd6c5032836d1c044880eb2a891595f86482a02400011c12e845173a28b991407a7a2e31d11e888b880400187666c841bb99dad67cdf1c121754bd6165020dc89fea17a610e34c19b913fd43032c12f1010948c14914814204a0090000100ec3a7870c2ce62ee08211126bf4d26e7de30641eaa4255ca3e4fd293d26d165830f0e1fed79ec1d64264ea27fec38a92fa200178566723ff1ab4d98d29886b82cd099be7675d90743da88afb9a112ce437a40966b8bf9d89c33e676838f5761c6d33549008199a5813ca77874ca142292df8028391e6371aa2396b70e44aed0381eca05e724a7ffdfecb3ab000f2cab259ce5458f5a9253c9cbbca40a31b53cce901213ff85bf3256ef941f53274871c2f45f46452e36512097205a5ed459511cf032a061985e64c70000401e54e2ab3d1798121655f9087cdc9e14c55954939ba6b365fc481ea6226d1d4c6f7ec219482ace27f221a65c50924578abfbf7dc75bc395e689e635fa91854c7d54252bbea0b1254c2ccca4b6898eb1421fc5ecd4b8466acaa20000735207a532ed299760cc194665d6332ea1197482e191747a91a38c61c84eaa52556191747aa04736420ddcced6b3e6f8e090baa5eb0b2810521e498455aa16d00fe46063d08837b913fd42f4c21c698337227fa86065825e20212a1829429028c08a0888007fce7b6b58ac3cff5d913f683d5fccc848e1c16a299dd80bbd817520afb6b602fe6cb6259f5cca46e61bb43aee97441952686080e4a18b6d02b66630ef3986b44b7aa622a7adc17b4512f9f95250a42a0b587b83245554534279d30a20a9f397f49c0702ab656d1f99c300d0a9c0446500c01ee45458a6e8800f5cf0f6b9a805712678dcc2117a0e605a06000022c25d06a2e7351731a8b94d45c8522e31511e868b8804000f4a49b9645c2b22e04901c0c86883400271a40f4672122bd1e534eb0470bab361dce4b7e304d10bd4ae5fae08128efbd77aec50800976b8e0f99200044541925970d65d90006ebf1ce42e2a4581f178249fd243341ed1b477ea108eb05743104000012f1804c6b0843546430205c795fa04c1411841bc191e910010884002d6d07037e6624d192a3007b2318f183a0111540d6721af8bf28823391ffb1449948c4977dfbab008bb1b3c168140000908816308b7d745bca32dd4516e2080f4a65b6530281116d06cb64145b00290a3fc5281b88405f85009679c281258fd97a519402abce3cfa3c902d004c3c2f03800497338f920040f3c6de7894a0a88437c670d211150c78f8dc754865c2901c69232bddff220891c296d92fe33982817932161842c5aba7bffcaa650a49f5517676461021f8e7e54c8c003b5eb3159a0000108a30fe2a8c30aca8b5e90faadce0ac081a494b8c1a2228024712b31542748e60a5d7057ae7b94b170519b45805f942891b52fb32021840486a991a3ec1005480db29e600000c6f8f2f158400a03f72704c38a1dd47382f030000121127c2593d86ec4477df56a3a894249245ca574989104c75f55effa2860cbc84ecbf724141bd06c214c1802d3accdf7cd800141405dcc154a8302efebc18d4a20caf3c502249893221681400008a096b98c0f44618e231ff05d09c0efde82f81023bf42e411204067301687a0f0a18666c6aaf262063682e9c04e860875e027e0204807c2a5602910007d1adec7f28008291ac993f331181058540402d60d16a868b50345a6121fd058fe02c7e4043f0021f7010fb00e871e7f6fa93c5a1a302f9e3389d810c1aa0c0a2429a0858c239eaf950fda3850838112f74c80820283cb226f15800000401926955ac8cc037806cf63ba381249a5a10f8ad3f3b261881c2c81bd3f28298e70e0e4562c375cd1e5f14828c85983887cf040b2a3c606ee55a44a028a065a0d349c40000040bb42d4256c0171ba2d6ce00cfe7631fe3483221581038898410600fb4e348168f992bf17040703a47b49299d40404d328ca3c8c2442a6574be7cf04000c21cebd6837340117f931f240018000cc01bf3c5a040410276b41f2e86824b506860068f30a38b7a54d9b0522c2b270bc1de64d12e36a694014972cb2863ae2a22b2b989241faaebcbf0f609041ebfa39b919491011766738c4dec880034a1bdb5b80e85001417305fe4b585ed304861a0223b120195f004aaedcb6494d8ae6df4f546088f9447bfc7040b7411d6049ef174f1277690ef5053ec533fcf0e81091b1189d1f9e1d02123623139108d12cd28b28c0d300b00b48a1b1a0a439b1f6a9fa96f2f3f87a1f20f13dbe6a60ef8d4f4e0c64d6864731b70870733d06ef12fa4ac389be0e2e1ac6053838ee7fda64ea7e00c19f66e500042225a41a2c109cd10a3ddcd7e8c67983b3643a9eea522c1fec1030002a25c0d13f8437172ca171239a5bfd44920e079f1c3aa10001956bb7b7869e010790ac06b3d1000e7dd9f571ba88ec048a178183b120195f004aaedcb6494d8ae6df4f546089d04758127bc5d3c49dda43bd414fb14cff3c3a04246c462747e7874)) <<< 16000) + 0x0848d88c4e442244b34a2ca3043034c02c00802a33cbdd7d2f13e2e6daed8e79c5f0590c723e05fac4e5231c54e01570fc993594441be4906dfdc4a260f9bb18c0e1149a8eb65ab8570714eb32e8001ed900063f207e1af27ae8d6a5b801c48ad19e296a24482036ab22fd251023c9f0aaa5ce106f8b8ddac00e2042a763064920114afe18e08c50064193c82a0000461273fefd3c7e410158100000868968928598845a02a0c4150007ea906b390eb9c80fc4400250a46a8040029927053f3f091a70a2c5a5af8d35a691841be0e06d14214401c4ec6ae7a102044b60b81d834047112c2225a18004f77d23cc50040414570fab3415a00f299b91e8884ae3a81601200008c0800cc19001c8720047b44b3d0659c832cd31e1421588166030907dafee5c164c5a9cf3934814328b585a0588198a564ca284a6e28be56161a9af0ee654904095e9b3241800007a11fea40094021855e0ca21d8164b1d859964162249cbe7409427e25d7a33961ced16a9c714191aab24fe86085b0e683002008e7265185000480100001a1258c0b2cc0596582cb281659203c2a03bdf0134b27c1990cdfcb10f755aa518a13d50e2d710b0e4a9b16e18a0d003c33eb826082400816400cb1c07a58fe93902850615388247e3f28c302d05b611d860a7b21817b2d162b91aa64d3986086bfa8fecef9621a79f00d7183820e1836a08a0608152467115c08002b7d62f7c11a810a8071a5924ae8d592f1857b053942b1f8c30a83a612c5f182a2bfd6b9501162f1efd16830f9823548398b0669620db88a937450e082463fe6260818929140cfdaa8042c02400010b10450900304800127c9630280018f89628acb1006586032c201f9811cff0667f1c60ad0f6c472661456b49230cb164108415d588670e4c00b6d2909a3c24185d569670c7ef0527a709a310d85c8649c3000340638225429002a01c79b49f3a3f1f38743e8cda139a384ea4d490ce1918f216ab468ccc410c5020400ebba8078cc004a01000014725740b2c00595f82caf81657a03f34868d7d7bc71907ef2d6162c8035c2f9309c3b6665ad600e182559ee5a268d068e1273814015647d7e384e104a0102bc0195d80fcdbc00e47a0c680c242ed4cbba381b24905ad287618ba8f22426a14c4281a38825cc72b015e0ce1df248a5e50d5328104fc58a0087b430432887bd8e4da04002d7159240fac9c4120864078f360f863dcfbda0492351390ea3fc63c88343ddf343931c409eb82b3bf6e4e1dd64d33822050204192b4a39053c2810372b9abf7ef86083206195c26d08000be97da8a084450120862070000254208a120060900027b92ba0500036692c115f981100ab4a908e31f0c9871e3f9640be61de0ac438723b85aa26d468f15d64a496e8e190b4d7363019a3062813c17140810396e161644300031a8d87dd8fd20856038f364c141e9d870e776269e803473517b125c9c325cb115b30d18f95bcc2263020914a5f360400bd440dd113821280400005e895d04cb002657e0b2be0595e80fcd81ff8c49438cf2451659a387acc7a4f263474ee02f0fb38641fa12e85346b540850bc0800f237d38a0270c2400815e00caec0703a4b429c4e4543cd568e027150b4c2403a188c5c082490781cf373430f22b04455985623c701b96a08fb7ce1ef564d880b6c1022134215a7cb8a04259a32a6cf404001d01923c8e02eb504170163cda6a5f7221aca492343199bc3fc8f218cc89f1cb101c42e87aa6991113c71f9acdc618de70e525ce700ed904080c07067438d14081af9cfe4fc328002f149625f7410ed2105e060000242208a1a0060d00027d12ba050003659000afb3c644b742783791c58aee24f913c1a5c8064914a6e143980295a43719a37e206ec6e8c9834f7ce10a070982f42a4d45944040a001826c4b50a001fec8b2c5451120058050e3273d37669468c8a7f1526330618ea831a49a29d37d57f88c15859490118282032b091cb0400e4c688344e004a01000017825680b2b90595c02cadc1620a03e305ea029d9a6971ddf39f082870353b1df59a33528f3f764c183be5b85b060b0007e7af71001493b825b84e104a0102b60195a80f8c8863bb2be7659025a9371257482016308772da1c3b675123c6013475479e2737ce70c0344c5af6f4d193bf514d700081094da5dc9ba24106f2557009808002ade5695208aa042b0207197da0a7843d01c481c11ef11cf2410712f0725d141c3f04f96c12e9e68ec4e519f5d121a35c6b411d886020480a13057f0812082ba37b042983800f8806aa03410512085c060000237208a120060900026592b40500035092b315159008002c0ce96c1ab0a3c0434a0e92dbf6c5185422abff070c918587ba63ecc60a5c20a3e3282c5cfe4779fcd1825e0fd4945fc2041f9f4bc998200055217320eda400a4061a5c5ad517744c280b98f013260a50a3be6512c54f35516b21823a3b5a536cb1058bfae8022020bcecb46a040092bd79e9d0004a0100001a925580b2b10595802cabc162c403d2f489cbdfd4c2a848429f5cc1511b2d3a34b1669d3c3820c136fbbaf300b11230df171026082400815700cab407c63e374be0a1a5e960ec546143835705a818e38525396121a334612c2399834bc66c39d9a2dbad44bea182a6bfb3b8e1008671780ee020013e18c5415021200438c5fee5035e5034bb92a015fca71c7174605a4aca34650b94cee43e30697b0b50c2d3345a2f3713d64d305222d41a44ae20105abdc8bdc701f2f568899b5500858048000216208a12006090002)) <<< 16000) + 0x2f12ac050002fe92ab150fe0087f40400150c400aea4955188aa4c4550622a72d060968a987454a3a2a41d1518a86782433a1219c090cd84866804332020037ab2544e32a17195030ca7d86182bb29e5994ea2c0f5065386329b2594d10ca648618e33e2c0ed1baea41c46b8f5119b8308b8846ca220a011647947af1205bca16339b1c0d86b1587e2100689db55f68000414111070be0fed5028028281f8db7dbe2106aef7d22d49e709c051851d638fb6440a22c44c7f9a150cfe76e8604e3fe22fc12107a13609a40239d2e610a00250abe99e004e2844010d2cf8a12c27383a4f95ed84d0e1764eb0a28301366371c9088d02a9ab4400fcd9f9c40983088021a594d7a3b4070646ba726f1a1cfdd4b7266845447820a12110b6c864204a184401000010d21800a000278219c1b29801c4d051c9ec04d2c8375e8943439d6f5688490c4553fd1d08204b1ef3a00943088021238033766f538c2ec414e6ce1206acdc362841e6b12ae5200355b1ab425042200848e0413aded0e30939aa84a38494648259ca10561b44fd3c3014710ba49410880200002144a5c140004886061468807486140e6398ae901807ba8f1e60571add823901067d72a9a100233b31641302110040a580418802295010000bb9293151490a80b054000a7c4948964f033251198840cc92c164e60be181acd0ee4182c34b1447840ce0b58dc0600012f6f1d0e00a35efd5208030040e52800001316110043c5c0d5899934512843676143b9a4e0e128094689a0300904080021e289385849c91476a5479830016be4a10140abccc277005040840100001b8465c565282ba0806e482f510290c9a2d0c0008870880200001164a4c745243a02c1d00016f928311126888a08440009064960765223b2901d9478ec95c761b8332561594708c954464a813f20383ae9e5cc8c504ec2424c815bb9430ef310b83082c766a52b4c837eba2c1c3b78c9da5f378b3947046b7089102012542bb0818c6400d6e1a8e4413c2010ac42416107a9a4f91400007da958731f10724129482c4fbc9cb11826051a3b21d1d94604e050a0110b587089fca2c3f0d10124ae7a01c16fed52a76202196a42d84503bfe4e9310d0041dae0031201c95e3a720c04516de0c828a0120b2ee35b928230085983e146ecc1f0a38bff795b9b97fac2404226886082064045022822800886f7b800ee64df08fe1d1f1261c04300825f6f246dff9ba4a9cbc45f23407711a855ecdfc3943409540008d49458880b0340480a00048e24a47b251398841cc938a649613e138d0a5430204061e6e6dca0d08de173b1034d90dadf0408224d08e6240297c13518300d46f4b1600009c80880204200b28a01f0b02f3beb20e2040b564542892d14ab408e08668b0d9c8801ac0c8239402a5f9e8540001310110040a2417019a78371ba50c476918953052c61a2568c2c6ff4f950610b36992c23823f74d76c000b0c108020a200764037b0a74c88ff01816799639ae43a4ce40430af18c688126e9e8a5868225fbe8df9208a7602fe0004e2844010b2046da0597223c0ea00d8c4071d4ba62e258e15b9b4fe8d0447bf90b4920825dad8a82401385f3544004e2846010000174250e2a00031122ba2a0004912000c0c41b07650c332851990e8cec2ccc160aa00b7907116bacf810d38dc876d5ceb11ddb0a46bc684707d6844fe0000000000000000000000000000000000000000000000000001988d0cc0c70c4049004000010085cc867ba2d643dd843939157c8527ab95d29149abc8dec6756634f0a926f78d64c1b479b42ce48aa2f84765e98b119c131121b0e21d05093aa0736d51021e6a8a22d97f2bb3b8b235d7c0d5ddcb08384c158041cc2d3a90eaf56f895c418e408e4a5080200055e25066224d1d1410c823454001bbe4a0544500a227f5101ea2835414002d2649f9b64fa8b27c4193d88c9e8464f22312211f902bc2818d3c3c372232a12196f825a10c07e2fd024e382b048f4af0c115475a698e0289a588dc0509c7084021e1c0c453a14782000af6f5900802c6fa0e3828982805f8c080d6edb960284a384401000011524a6432522193c0ac944562102b2501193b88c9d8364ea1b24d0d84684c9d026496132730992502c924164900b928a5ce020dd4b7132beaf399deb4fac807a0963e82cd1547d059a2978aede252f15dbc4a8233e511eff1c102cca14814e089083080008cc9286048b0db13e903666ec7e383afc422c15af94023a461bd49772a8584bd657f464e4b1d5297c8e983efd6653681ab3f32b3aec2dcedb7bc11b62c65cf3ecae4c80262925f94748d84446a2302c0d6106ecc6106ea5b89951eecb8a754c91106b04b1f41668aa3e82cd14bc576f12978aede25411bc0ffb71d983e1475983e146da17f92b04118dc5baab17c81ec0ad7290c18296ccdb8e11a1c11210612201000008012326af3082e7c56039916f9f595fb279c1216bd119bac52a277077d7106bfd65c6fe3d3cf5511cd8c7e40dec0b247fa0f09ba934706b36efa34d298d83de31fd1e770831570afd4c4a90ba0009fc4270d6458532111d9390ec9c4664e03326f0d90800c11807a0f6e63a422340b32b8d9829f4141d34d67b0518b1f9d9df78bae4462e2dbcdc119a500b21842514c3277084e0a266be309f76f88cf86fdc8402f1bb45b32beaaa5b91cf8b6e7fdcaa474e48b75c97982c58ce05aec5ed2795c063c1d6d7f7eea85fa1bdae07a0334ba80014ea047abd918e0439c4f71ffea64755277919e6c0f202513fade8d77595c77f3)) <<< 16000) + 0x3de83050ef40eb14cd90ffa78fb1b4f37f480311bea3ff2bd9e81793c2b36000202079a8d81fdee035c251b2a806d3228826ff98ade91e9ccec161b59e8b5c53adc53ea2d08bfc312a250f7b1b61e37fe060744ed3cb01047d40927f30c1b8c505a7c8af4d789fc36b4ae92a3206e8b4141e8ce0d729c9a3075bf6fff1081e8e7c327ff1800688cdc80aed6a3728d36e99b040c32205190638880024ac81626e08e1656c648b00211c4ddb080497f4526c2308220084010040104d402000037247c1306509c0400401048e0a00003724dc3323415c050040104ce02265011368080001849361089ac8446c222351181606a86079c4110510a69994a8e2820a69c7cd8900607306e60010090a08802145f4ccfb6148344ac1c342c32002ee8f2c02210b4ad0000a10100022c70aba3114a079f286d3920fe7eab0396194d3fa182c233b1bf5c00128c0f80409a8044d20200012e23cc2200023d2468439142d88f2f828a05b7689c481059bf760200cfc25f26c0019070840204d00326701133008994044c80200014c24286b0004d621387b2111d9318ec988664c2332600d90800c11807459e908db862821757acb9324001058a00b00008c80900204be028100080209781600006e4974364b81b25b01c013b1401f7c61b780eae335273f04535c26dd4de71dc583c40d24b0a21dda7618047fbc90ccfadb1768c2c04bc71217d680995811e899ed7ea4a074a45bced604d1a155b90880c0a983a397400022baa2d77e52e3e60a6fa25d8b8795b09b7f600fb100c5c8edf6bcc0d54487ad415640355d60aa7511d4ec8450aa36fe3611d0f6c741a13ab5b99e2edf4958684a35637818c4ea9d05b7d0c0050903a0267ad5013ef743dcdf3caebabd85b26422d57cb15ca7e8cae49a9f8e71e12b4002e25f1cfeeecd4ab0af37c61ccd41d2ce28201a0cd863c32b03b2c5a884ff3570efb6484d962390000e5c4968c40e64a1c02511012827c7640c2a2051512c8a831c440012d840046b0801298903d4992c22c95cc61b85b2562992a90c9502718dc5baab17c81ec0ad7290c18296ccdb8e1189e19e11211808e084084000298221976b060c2335d7ff41093000167b4af8504929d196819129ec4972b424fc7ea92290e80c8235bd785e1616dc7959c70d23484892ad81c40a4a32cc62e181f8814946598c5c30402135406c77bb5650ce1d2609f85fca777cde143999fcd52328f4000000000000000008518dc5baab17c81ec0ad7290c18296ccdb8e1199e19808e09e00800086db374ed62e9c5d1df41c82d5f0e751797240d47c0e80a4b1201c54d1f9a76c4c2218893751dfa231dcfa5410000317640f25d8f0d640f04f409787bfe1de068778a8dd589b82312247eab8ef3e056bc922311b5e943b6278e61dc5355afb607a3377c253dc3b9fb0430c138e0d41da24cc6a467dded14c635e36bee5ba3f082a50fa0c5416250e8003a092534592922c944e6210732502d92792c9389649a4324c1192586c928164920b24805d485fb020230814067cb285082c94854f59500051edf414802412ad94c25082200851484dbd7464899245bbf0b00d0f741484c10800116241823d49c488ec91d41b403023f8b48061c525cc3b0a0210802000035c8000cc1885563202ed3811f1830eb14099a151871401472e2da204818420100000dc3831cb7376d20086f845fb86079db9ff9e46084201024701123008914060001d04910564682b243158ae8ac8cc461821b24209c010040104820224001f032c0f28b9440815d9f3a0110610804000020491f88c8f8360ca1b03d0d11e86c8f0170180100411d80c8e80701401004601b70c9f840084507c0200000ac6a091e4ea9aaa07e2ed6d918003e9e0710004630400100000b221fc1a00017524721a0001f1245c1a0003872470622373111b1088d4760582aa092393361a6023bcc6157181c67c7dbf2602471e7631002a81c622800801294108043c0ffb71d983e1475983e146da17f92b04136420ddcced6b3e6f8e090baa5eb0b2810296ccdb890170c21dae52183296ccdb884130871a60b30871a60db913fd431260d5381e123a08eb024f78ba7893bb4877a829f6299fe78740848d88c4e8fcf0e81091b1189c884a40a608706680014a7d1c2c7f763e9ff043daa36600c45bff38c45fc5d6ae57250ef963021afc8615f57f1f1fe055d7019ce7e245b3ee6f024e6266209434bc0e8ab341b0472252d7546f76244983faa51840f532f313c5dbd924a8766244e7373893f4fae5b6f716df1214954199f61ac8d3ec6df319a284adfef7098853cdbc259e2190b528444885afacc848e182d2cf3a6b00317cca7f004e2044010919d0695326b0a57a1a4f33450cc309691e227bf9fa18912a847ede2288748db0540098408402000026e40fc040005a46c3049962d5120a1bc2145e4421715e25a4d08221a652550005c95fb7c40167f970e7000261c220080000a1903d158f30a8002d1091a12c5748646633a08dc15bb42204c3ca645b4c0b2d85d8ea000df9ad0fc00009090840218485165fa4381148fdcfd1014a6a062d008c4080021a08881dfa9cc00116c7f10301dc8eea56009881080200002bc87f02c8c81646202a0c32473912a02532e833800121c200045852fe5785c60aeb5e919000886078021c3382720bf1826e538b26580ab48f8c20008c608002000016040005348000f690003bd24605222f150140488b824000a264850f621e2b22d0d800910909c4d90896c8b0964564b2100182300ec32b4e7846941de6233a)) <<< 16000) + 0xf49052086b9988000671313918002599060802128e1080408a81761e1de09368a0c2e69ac74903cce40f2640054bd23be80204840420100000e523d4422292111410ac4915aa024481b723a30134118b35a390008c60800216255dbb3e9a409ed641b3220c08ccc601a087ed24a19401e9ddd7c8004a304001000010921f81b22705c0300401044c03806008023806f69a4541033159e220220c1e00800003d90000b8244a03b11196d9f198043c34fec2804cf22b9800118c0f80400002b89120a888c5400042448882605013000456241203f03fedc7660f851d660f851b685fe4ac1049a0bba995a389b9e7c70485d297ac2ca042d9328aee20605a96ccdb890170c21dae52183296ccdb8840e823ac093de2e9e24eed21dea0a7d8a67f9e1d0212362313a3f3c3a04246c462722129c5921120100008001cc626a9fa0d0d746c8a79ea329df48ae4a280fe4650ec0c2f7b87bb9a0a4f834b396133635d5e02d268f96021ae094880c3882980be099fb11be4701a4e16cc018cd22805bd06bb3ecfb3b8cec682119f0e34d77ba612a790e5ad4ea000c264884d40e65a1c02d11014827c8640c322051510f8a831c3443c1a000dea20d88b21d3181612f844c22dfaf1025c6638c3cd061d5888da082efa6e3e41008d0b14a98004a3042010c08e7868106ea5b89951eecb8a74ed0984c904a51976eea37e059173a947897b2ad242aca82aa5b336e2405c30876b94860ca5b336e2103a08eb024f78ba7893bb4877a829f6299fe78740848d88c4e8fcf0e81091b1189c884a4084825004008c5a9d1a5a25db8e1e2fc35fd6607353a9629c4f44709dafa4191e208cc2dd78ad75bf2797590027604cb82c12299307185c61f5d60af93b4742dc7e8e01fb098aa323156dce0cd91d814c8a672022621b54194f4ca8002d690631d8120cc128664382321b11c847f3496ed94226b94cf9c810b9d30ab4805b24003ab100943a142900081292108042047aa19714942451786ed9021cd276cd20157e1ac3fa600418086394037d4458c900405c289a802813921000400005a090d12886424000584443c340581a218016106ecc6106ea5b89951eecb8a754c91106b04ae823ac093de2e9e24eed21dea0a7d8a67f9e1d0212362313a3f3c3a04246c462722112419a19819e01600a0014b5ab19f22e06b315b77f87cc9bb816c5caf6b5546ba2c51c7b5e4d65c801a70b62a7462efd3d02a68ad7c8f5c034d1c532c9186101a3bedc56e3f4439d1ea5bb9ed0e4105ae587cbfa20f51a72ed116784bbf2b531873191784a35e51be9027832584f4804ac3770c29810567d84200082971626002004a504201021701d0c307fd2fba24627277c20c232d691318b80529cf4c13800be0c7d40600894262a802610210084884c41521ba246293cf360c20f49da93260aa2d74e4720323368e05804a204201000010b3648ad2464ed01e8f7da8f258fa82f51882c40c40ea0b9802453b382c00945084020000218408027440217f72c0f1b22596b1050df06748612c01baccb8a800120e10804000038c90b08f0837663083752dc4ca8f765c53aa64888358257411d6049ef174f1277690ef5053ec533fcf0e81091b1189d1f9e1d021236231391089314f14914908408b00a00036ea854868c48e6b7d6d613bc83220daf6faad216d12b1525bb88067c300402e41e32d353aa06c746e5392b214055f27ae39520615a2db1c9394c9a0007ca485424001184400282090a1ac84ca642443000f2721388b2113190800c11807e3d4c0d92a490fc334da10485fd3bb0c23c079c5b9fd10015abb2c34000025282100840801b895004d1034c81b38204990fabd00b0c40d14014090208802041e0320e0190680c830062260320b01f81ff6e3b307c28eb307c28db42ff25608318bc4106b780b52d99b71202e1843b5ca430652d99b710837227fa85e98438d3066e44ff50c0cb04bc404257411d6049ef174f1277690ef5053ec533fcf0e81091b1189d1f9e1d021236231391095020810a0ca0000ec277af62206c0cc833dd1a6354b20b745039997b35ec14a1e7555b491efaeeb8e38549a96330dcb128097265ac7f8338b2a60d3991ef2943f9e15f4b458b6b2415b7a2261e547b7f67137a322ccda62992ab379d34769bae1dac842e8acd00062b24143b0007b7241203f03fedc7660f851d660f851b685fe4ac10296ccdb890170c21dae52183296ccdb8841b913fd42f4c21c698337227fa86065825e20212ba08eb024f78ba7893bb4877a829f6299fe78740848d88c4e8fcf0e81091b1189c884870c308404480400001adff688e37f08ba8060b4b4149ae8591bb1970f87fa10b8983e5e810ce7887d99d417816e50eeb313b940e50c600355fe779936989a1b53deca0c3c371a418e81dcd28c9156248da213451989180ae7f75c224f564b34805316752a8002f692082d03996881cb41b04a206191028a831c344081a000fad23aea22035106b228809141be732011d0120c800a930802a5e12007506a828017eac8044d2103d218638ec7fc1780a31a520a2108087825e20f4060828536a75b16023fb60cb7b1205f5982eb5d0802c0f3ec1fa0601b5da5d8858002a882000032b1305b8cab324d121630e57728dce5fbb61400c07f8243fa131fc098fd84c7e8162440b1f9050fc0287dc043ec03c08e78681c7a6a9c2a8e07c466d1da311282324cab60a7004aaedc80a6594a585cfe66c0883c290f0b56f4f42661784114f05edfe21e28837814a15adb8e000000000000000000443303283)) <<< 16000) + 0x1c31801400000547ad2f0e99131c4a62559d366e803db53caeed00bb12f5042123a128b770a98b81410100273484259b75de65cda4f6b395c2993e4f86c8397fb8546f0b3c865a45c757cb1ea35c9e105edfa8d63b6bbe3b0f79e63981ed752d54fd6cd0b839f6f5f8aca0c72d1f5118fa08c7cc463e41b1f10d0f804c7bc263dc131ed098f604f22d1eb384a816e823ac093de2e9e24eed21dea0a7d8a67f9e1d0212362313a3f3c3a04246c462722112029a09008c08c0000008008ef7c51b31afb79986fc7f1d0820fc03f4469f246bcf2050811b03089be19086725a4d808dcb502ad4564e96b9466cd057bf311746559480c3a18d37b1ba318d8f0038f3634df11d56ce802e002b0dc9b73e054436c30bb7174318caa9784e5eddde07153afdeca248818bb8a5531d1421b9913e5cf750cd01cf0000000000000000000902588408206404480100000200001a4a0fe7a8d46a77f1343306ca2896f3c0153d5f9e83b81be7c769b9f5eb556c4bc8ac42054094cfec706b7b5c589204e4ece5f3c8d37c0eeb31d3a903c85cd2bc8fb621b7a925163a50a2704b11a3e120a3a42e228180a631893caddc4372c052c1a23eaf8fd5daaa7fb6e8b9c25912f93eeab80bc3970a0e93c0a03d2337368911fb3dd4358f862ba5c2a49c82f040e48852c8d08ea2bfa67b1836f37684cb0fc237a643b4cef854064f1c3b8f78017f04161eb74bd571d301d605cbc0eda20d4d7eeb656564bd17cd4563dedaa081597bedd7a2df4c02db07ced3c15ae00000123fd81a9967c04fe88aed99821b9053d8dae379be7051cd4b30685dd6bfd25dc89fd1d76da69875daa242b13c3d8ed70489c73f29c11f7a11bc0ea41bcb2853ae9db7a8d5cfeab6c49e4dd5d8d8e8b2c8898ca629b9c401e1d59202d789caab37d0984370e6bd3e8adfcc362dfce8568e503c135f85ead5bfa9908a315b0368565252b8be2e15ebc3335dc7f9bc2b9423cf352cd8a6232669140f582c00276c8f51cbc3366b3dbeb4aee5670ff4b9c25941949bfbaa6dd4c5e3135d04670c90c1e1b997c10454e5be695434f64061e5fddbbb227b896fd51f7a352c01a6ef041551c37c5081ebb1d08000000feb9ab6b3ece3011a1c5da86296e2a0ecb2c26a33af9e20a53c5c72d1958c7a007b529e328880000e008f492e78c9182dd0c3d1a92a5c10ff236a4afefa3f776aa1a5116c8000000000000000008619c1fc9ed354c77125075a34d068f4ceb1045ddf62a2efec0000000000000000201173a947897b2ad242aca82a64841028804001000802800c15fdc332163db5226499ae85a91b97f392fc540460692397f6e956724d61d509d218af9cb38d35e20f2dd9fbbafd78f2075a0b0c4111537d05c4c42d3ede4d3f648b23ae407c70f6b2b8fcea080704658c53068839e79b299d54d8eaa2aa19cdd1c2befa2360b0cea15b1d28ee22ed0aa8c8a8a748d500068a23569216a490120880061188f42cc79d663cc93075498f29ec790c61885b1e3158f104c784163c00b80b32cef428f0019acf474a01c4edc5fc00002650400088226914a1f8483528d2a220c00671974eb0230c22008403004010000044477c443bc0a10f010ee808770043b60200016c22585ac20dd98c20dd4b7132a3dd9714ea992220d6095e07fdb8ecc1f0a3acc1f0a36d0bfc958205ace3d55d72c1e5c431f475f5ace3d55080d02c619004f00a0060000000c11918cada7169bdffc443555fe85ff07a4c9ac076c534262712234f5a9703f61b9af1dbf34ddd991bfe02f50015e1b0cf294b6bc098c390c4a0007b64768d63b26b1d8218eb90c584763ac3b1d51d82e0e8750763a63b1d21d8e88cc7405639e231ce050e680c73006396030bf01e92f979a6950bb29728fb5fe5829dc32d460ca54b5507f8ec6a4d2d3fb54cbf43d01a9a6ca32b60d5500f22243c123149d8fa7329b6649b60d99dc532ec084ac69dc38026468bc969ccdfc6f5f9ff15ad13966895a6733ffe9003bc3f46b5dd28437b7fb47d0e766c4a562c2f069d3c7a12626f5fab64acd312ee6642749e8ed7376650c14056f249c38c7f85e87be07ce930e9ac4608de0bee5e88aa6382aa0e6c7d038c5b1e6a0423f2aad802de02fcde131df720ff331d962b75ec2c730d9584a4b2613c6c000040003bd63c2302aec66e0ade26e9af5345b5b3a0f67b8d930725e6f8e4f2c93717c65c62b70e2755f63d78f1762f4d1ed488b0d9e4f66a1659e61d5a238add3215a08c7ee8954d461594cf555ba37077d71e63e62b04a83d775709762df15127dc4d199aa8d4e57312e4e13de292ae98b5425a0da19454548163ae5a1fa919c8d3815e5039402f2c11563b099c28c027d48a3450a09f330a901135db26a8d001008780b8028200024a904601081825d45f78c308bc3fd49a0fe0dec500010026583e0088195327855cd06a453816ae03ee4fed938062cf162c0020048583e0100000e422ba5b1c92d81e9687206702401004410b658a8f6500389d2b2b00024384000880e008020000088f9f905d5cf6800bece3d3e000122020004000044100016730280100400001111c71d8e30ac71457841bb31841ba96e26547bb2e29d5324441ac12b2982158c18f51f6a57721de91f5f66769c1d8288de1494258b0000000000000000008865151e22af70cf4b751116c8ac5d44c28de71ea27f92b80000000000000001ead671eaaeb960f2e218fa3afad671eaa840e823ac093de2e9e24eed21dea0a7d8a67f9e1d0212362313a3f3c3a04246c46272212a831a32e01c000213a30db88)) <<< 16000) + 0xa9c029eb5ad02a5265bf2e404dfac9ac8200a76839073856a15b9bea94bdc227fb435ac58e1938d88430cbf5de485bbb251ea7f4f731b4134fbd5c09485a58002f7b70915ec9db5f951380179f8eeda46e0d269540cb8e960c4876d30288088b4ca47fd41f994b9185307824a2c1da014eb03b23ed91f88ed13ede1702683910e855f8a00119840b0b4001638471024001aae444d36001d6e444d45ed0f0872ed3557e6fb43c21cbb4d55f9ca1bd7761fc3b6ff7effe6a3d484039dc00430c20dd98c20dd4b7132a3dd9714ea992220d60957cde95ba35b5b8fbaddd87e149720c9e304c4edc6839f8c00000000000000003fbb100d1234d24c008000004056ef8e70e3161f7417743bfb7942217a79622bfa4106ec9c7c28d866f1a588d6d8c4f49856841541e82de758f000047ac1c6566a4ec17316fd9b715630c69c9781df4a5d9f5572aec945b9f37b5ad955992b3648c26ce4c47689c66a764080f28791a744cc9e38931b0e712d7b125d6d869848059c130782fc124d3b87c607f1ec2461b4451655128e184c70804000f0870837663083752dc4ca8f765c53aa648883582523210383f748b9d0f8c2aa8e0a2066a96fc3fecf26d2802921600000000000000000110f9447bfc7040b33084802c02400436a8b0267423875e1f9232ee9778c6204f7c475f7689cd6fcf8832fe75f0300aa433994da28c2737cd378774a7a06ac0151be37e1c0551a1d081950c6e3a129b7ac84400397a7f0dc30e180161d11a14a2461892f2f3c72adc681a00c1c8808d93539c6da0357831dc6e6d7eccc283fc67bd319a3b95067c51ee9f91ca2a922ea7aa2c811c7470424000cd247018637e831be058de80e44c6c719808a082bae41cea6006310007e5004566ca9d802004850440108040080206f006376031ba018dc80c6e0061ea031b701e81f2718089804321454c080044483c01000008720002ae6c8144072899750bdbfa6e625687a9d77d3f3e082e729f0cb47b3e78a8ae194ffaefa94900415465bac790655657066fea2e69365459b0330a47a4c02d257395c9226f0c1f4348d1a9e8fad330b19e48747ad3cb82a162f9894a8997a7e0ed2a7035857b98deb94b22376ab3bd5c824c18ecad48912809ce72a0f88aa2b7d7d0e6f9b93c4091625b72936b79c5f9eb350d43f105091c6d0c186684dd06d634e6b475209be296676452e3f26544c2da200419014e464f7ac56f87af9350e6d26aa8e81d3ea0b8351c0fbeb48286622ac1cfa717ca5c195ef823b99ea280b8741ff7b1c63bbb33413c7e40800076bdfe7b6258cba30568ab5463bdca67c717e7a372eb8d4012596bcec3c9692010126bc8b49064e7f37a6a0b4bfe1b9dd6df11e32bc0335a3ea37cd32b15e4ffca214dbd3e77c9b8450c44ce144abef5cf35e82f3528a6d6c78fd16688f56a5750981d7b035ad067296c76fdb68cb721a800015d246d81784169c1bd523a70351e95361dcad3a1041ec34c16099a77bb3a868eb4e68a012a25880e8c8c97459c852310e30df6e012d923ea9faac679b383879555375be4e719be492b947ea9d528026339a989eb22c67d8f277c4838a2e4ec43522828275ee9629f8ed345a09c7785d45ae7ae2b8109a25f1b308b4b9c909e9e2ff9c24208967223180e1db6b7dbc66abc8f70af40844803f901a65b999825015fd542dacbc9a8c9ebaaa3fc857a6b5d06b48e859622bbe07902a702ffdce3183ec46a7f977c0a70f65cae3636cd381c9c3d54ae374f697dc24ce9f8c619f800000209efbf0c08e733ebdb8c40d6d5d1937113dce81903e76c87e73111ba86b4430b25843aa78d25cc37830844dbd7b15f9a17db8f009d0a7e8d827939c06d5d5267a54b6c4783167e523d8efd10d943a883353340aea3b04d21ccb2d769c330e0eb4590862d5b7942356b14a4dc95d8ecdf9687aa8aecc8adbd2a8407b39af48638bafb24056936a868eca1919b1dc340002d8c8da9886d0c40e6621b3310d9188584c4362521b0298d78e83046435c2a0c7110d68886b03600343a46adb42d4da024210021261004a4023540a00685a3a38000088bad338b564a1d5e8b8580a168344038883ee1736eabab35c340f158e619c4145d598c007795d93f5de936804029748e85c72a8fa6800020a088007eb68d4a2b110b0a76a8ef146652b4fc40074693d319719b08876ca830664410800d48cc6a0340ca1b1a7090d3048694263480b1a3058d102868414340020003e9200e61e401d8ec8093831c84d6f1dcafff1cf16f293285f87b811d1e16b8ba7551299fd518000000000000000000000000000000000000000000000000000006a11841811010c12402000c001154141404141031765af0fcc31a1e8db92e71c9d86698c90b6fa92816cbb6ba53a25240de73ec233f367175ad24370fd93f6c59fd04e14777f9269acaf87c0a43c2789ad467c8433c2a19d0d0ce06866c2433402199010002629012e4c2031afe7043ad71f0d5d884bd216224c3ab143bb98cffc91277fb2abc95cd1a922827c0afa9a74222acf2000db20712f37abb240c0286dce95bcf93e128401a13f792b1a4c1c900028802f30ef6a6ee4cb5de964a9bc7a7169b8125656d6e78e8882100c111ce3ed42a4506fbc121661c084026aa44899f6776bb5cc296d9501cc87f7019e8941c41f4d533fe9cc7b81a804bdeebd825a0c0a0968e3f4e217642cde8fce306c6e9c1d1c302ef4dc784e7d02e865a5cb16df088cb340020163520e446e11b645b1fc789af7b9ae840086cb423296ab164b6528bf7d2faa889f48c)) <<< 16000) + 0x659bbbcf82c8d82a6a56462c921f34ad096c846c2d21306b51c7158544811800002729a367642476383f1f7951c11107fa6af981e412ad09aa3b6b0016460858848828440030020000288023c159327b1a7ac20e0b4735588324bf625db004601d42b7fb316442b58ba2410c568d9d9091d8e0fc7de54704441fe9abe607904a937f484e4581a73efc2440aad09aa3b6b001666084883882841800023d4ed10ef6f39ec2cb35c1f4fd6c91aeed834d72f08003d02be3a9c2f16c4410267a8bbc7de75e9f120669954ac3f9202bf9a6184b131aa84f995f935544a421e8001bf90005e823268b18f15d1b3b21219ba80ce0ea8e091683b35dee75704adc42337294c69a4c13fa62fc3bef2900f91619419018e00a0020000008009e13c676da622a33dc3c57d73f0d1a050ced6c8b6e21825fd7460a3459ea6932becee4c328f705cf23b1d258869797f0586dc1461f7518bce8c7c3d1b265491170239e1a19ba80ce0aa381f119b7dafa19011b7108cdca531a69304fe98bf0efbca403eb426a8edac0059982162122060880000bccede7350e16915b4a45f50635a1a231b0340dd998ad4edcd5a1703c1a5bcd12ed30129897ec296ad4fd400309eef5156bbafcb30c271e9bc622b461525538a92368a580f0239e1a19ba80ce0aa381f119b7dafa19011b7108cdca531a69304fe98bf0efbca403e5ed8e2bacea0599821621220608a000000f09478fd5e421245b1d41ac8badd3aac11afe5e719b7c00681c87be36f3f9088e669532eebd2ac92dfa2ccb1046071dd5e0149470e66f55ca76160ba615f1a07e5c53cb62568001e791983102516809064000fd245ec0400174c465d3632c9b1952d8160c865027627846fe4c5168753d491036e3d72be27e0eee388918c145e2415c7442436d78510df7cad71e0a09f80178b78c62f07480063974236f89878a03008c2fac683899c558100c760a0e3e0ef53e0000a2008ab9c2cc48d7f1ccf8af959a042121042011f41668aa3e82cd14bc576f12978aede25411ad09aa3b6b0016fb839bb5a410af055c2560a99821220e20a08e00008200026d1983c07aed3c2f49de08d4dcbb7b7e945c9a14472914defd7fa59cadcdee7ca8e58fce2d89955adb260f1e06437b990faef68f71acf466545195229885a00070068d9d9091d8e0fc7de54704441fe9abe607904ab426a8edac00597b638aeb3a816658838848640030020000288020cfa794f1b21031df45c74b3d7cf4f12351d2c69e6d8174314b1055fb2a15090b1a83244a8eb789cbd1616addfa6269d71d8c0e2931710839e481c428e6921d2753ddcc5de3f4e031421425d0c04f6a234a2b79067c1059aacce86b391aa9f41f70702d50ad584db58a6848f9500082003b779c9ad57294a1eea520b1abd7ff458e0b771a0fb185f84ea2fa2c50d0c5d2a09e62fa9a6dab24298660000ea08003319193498c924c645263205318f198c702f7108cdca531a69304fe98bf0efbca403e2588488388282400300200000a2002de07f69394e23498d984773ac10ae555ffa64e4a09d032416e1497b55f253045c3ec1975066116d0a87c4b07474fcbab0a8ca08640d15a08170a4fb5480f0833dd9657c162a39cd0c100205b4cfdce867f277de432c460ae0813b6f476d05ee8806912388d3fc5d94280d805d2e5cfbf2a93567e4031c9636000037efc4ba30c28b1625fd660fb57110f0ea396fd0f07dea34cc7367503a682cbb1467bcd25c51f31b1f89fe865c000f1d0fdedf020e9cf11ea98a78ee2b015701c7d059a2a8fa0b3452f15dbc4a5e2bb7895046b426a8edac00591429028c10409801000001d3c5b418ea9996870e63d813f9b549c00166bc7ee3f236dea44e8523d501babec6f45c7e2dadc89dec5019d23203d0b94000aa48bf9a8194c42fa1a00079f22329318d498c614ec4c408fbd11a09109d11b48aea1c41ddd3c71ac87045ed13d97ee18076e0ebec5103013c1e95ae90040546460839600010100056a65a1b80056344b56c213eaf7799249361d50a808184c641641c347662dc6a89912a7f3c0f51efad390d2e6c337361302a440e68c48c48428218258004d2fe7bb48d0c284efc94fcedcbaea117201f40717908857250b4774a14f572482196e8d4203bcbe491917478c8792136a1449722811016f91ac28204cf3ad443044d7d3c86822013121180400005348c594c628a61be3b189158c40ac55c07c3b1d29d75050faf46f7e9141ab22b98907807453e0a7800483044010a2416b02acd2c8efa127efcb100d4549c2202115909d34400f5e65f5f0250c22008591cf6072b49620b362b85840448b271f6011861100400002c481f88861c240004064618762ba3b18509c0e006618ffe363860a23f02effe1a347401ef1bf8c918f6dadbc081238c04fea309f54242887c80cd1d49200012b893174c7001d8a23e86be00007d08242d02c0c20880008648c18e8608641b412181090c002800177c8bf988194b42fc2217d0d000543117c5101f8a80034508bd808005dd0801299102c518bd26c5e5142f06b03d318ae8e80a066010028fa0b34551f41668a5e2bb7894bc576f12a08c461460c608a048006000001eba60d21317b4a2715787ddd8748027bdb4c3ad788c0291daa36f822ae46886a51d7c9cda21137be92fc908b855099a19db97268c90d6265b191d13b9deb4f5de6c3de565cf893b8c281fddad849c5ab207c17f66d5d146183051dbd5bf71d8912244ad9042577a5031b9f5c959a0131d18cd923e322c3c301a34899532a5e248969272922)) <<< 16000) + 0x3f54800008006a5c7268fbf6f5e681808b97cf08865da809c084154281c9a8a1a3eac499a13c15805bea81fec47f6532e1236123540cd5090d26f1c8a90e628800046822ee8315241d043cd09836d2e165fd51eecb8a7a7a8efb278262f6c715d67502c8b1861460ca088006000003c434d8852087c9b33c7acc451f95a040ffef9855481c9d3c930262a7c74f8e2e45b218ee045ae3ed149d6c80ec2cd162018b080f07312a0f44638c0837e437c7102e813b508c18034c038710180145ce3a00000804a784601017601e0e07aead769038ab9e7f8e3883642981914100c12cdde203797994168c020bd1cb62000020013201100400005548ab0a8000b108ba9a85d064000bb445cce62e44b04a218b88ec5c0562de0bc1c9f8619dc96139b8305311c288023949c4823384b8dac705e9f26e4c9602244258d9280147ec2b2800138c118043480812ef44640a19c1bba80c0cb2541266101b7713da95282065d9769840513f56ed7cc002fd77b9404e1046010d200c6e307d1028af823cf620346d4423465040adb10ed480a36f17db084a1046010000110207e1a16e050b6828000b608b60ec5ac762d423169118b408c59c462cc22165118b208c58c262c40316101cd90837733b5acf9be38242ea97ac2ca040260a40668428418470058000001595cf1c19ffd5458135e1507c1a38a1e4cf4fb87fb659d0dd176811133e6c2c05607346210ec322e8f5234718c3909d54a4aac322e8f5408e6c841bb99dad67cdf1c121754bd6165020c62f1041ade02cbdb1c5759d40b42472462441833400000097f0c299992802758f002cc38f8d6ff17c388a87521d79ceedc87baa4546e1c6a01fecc42d0322abcd5493b4a4a598451d16005e14004d1130cc1db765256a943019ba4df230122c24d5203035a27e8978094308c0202be0391a002479ebe694055502078690759e81fba58e038cf951028a0037c3f04385127f92ecc382876c7f80604e184801091a026c499d269403908f04069077c54853e58e01ba1d5283852727eccf680201f63cc56382877520d1460000375934005018480100001a8200067642c0342bc1a15d0d6942da40908cb1c0dbb3f1a143a945db4a72c2002cf27cc405627d4c0cc094308c021e5035feb00534a0f6d439ae58e2776f210ca1d2fe6e2a590150f9bf5542c0071d73d0004c184601000014122b823d283155ac4296381fb8d9fa2877e72297f090400038ffa480b4fb3ca38a00802aa599a1c18a40ae13a13841180434a0c615bf3e58e0a29ab2c0a1dfb5672f89016843170f8401023b6c610382ffe37b9c8b0003cc6e9a04e104601000016e21820a15b0500019090c11982504c0017a48ad00e870c576366e5ae7ff1ebeb871cac6e95a17553c85177c5a712453205f0942f0fb9813863ffbf21ab9ce39e1894737fb24e028cb90be4d894c232c8713d91132468e95b949fee41857635a8d0bdf2e7460735af5bfebf81064680c9e257bc3ef4860f7abcaa0e8d9d65667c316c7399a9c8713af53adc000039238f0383dd1651659db5a3b337bea12bb48f89bafd6b9225fa5a3ec42776b28d9cdd583a2f92b5d2398990a431ec4d1d19493c890a384c10000b1245649400211c40050948ac06c55c07660f851bb307c28e2ffde56e6e5feb09010b550d0d2f1e0178c5e20835bc0599621611210e10808c000000007e99386390e76305d549701a3315376d4ac56c480cee43a1657f67c611a6c320440d140009dc8ab0a8554540032944550862a63b1521dd883c60fd438e2221d7739e2842763e1418817b52efb1048001b27b718e00aafd25881304110040544062a00314f018a700ec4512187d50710fe19297e102d3cf6eef02067783ff681402b37a61a400251822008000089914d098a602c52c071f41668aa3e82cd14bc576f12978aede25411d983e146ecc1f0a38bff795b9b97fac240432682eea6568e26e79f1c12174a5eb0b2810e3178820d6f01685062021822801800041031475003827b54a4f50017556c6e44c39ca2ada2d77102e7ecfdcd103004bfc71a52737c849054f813e1a3a9f6a799fb07ef208e722e69f8528ee34e80020f114a250a49285209428e4a073250a310831c8628a2a1440d01f84850c2406c0200082f2284b21414d0a01284fc04004f4e44f94427aa313c1d01e8cc31c5627603d1d4d956c065ca204e6061dd1ce20fc993f47a9f5f7017d0f84d4f60bd866dd35830c70c18fd0c0cacaea1cb522c08845b3fd05049cd42fd1d123dcf7b2050a0c36bff767993eca09a9a60c821c0e2911e3d34d0395f53c3839b49e0c8631af9da0dfd4a811172bffdd00c920a15d1c83dba080222005d57b9592d7c5582962f3efd519e0dc7a940cd7180cd7adc266110cf57cc293eb9f274b8a9eda2b01a9e9d506df0e8fe5fe26e57d4a7be33db65ebc9079c1023c55ef9ddd5fd2d32c30b0aeaf1c63b81c45414ef302536463a2c5a4a2c9574982bbf11965b4231e995fef264afbdc60af1d4a74ed0aa49f418b38f85f4950c74c61b7f42f82f38f49f99866a363e9daa11a293a0e344301f2d35160a93b1d0834a90e77994cb481eea292ca5ac3c8302a2656adc60c0bdc08f4e009cb58acbabef4dcc9c3efd300b401a3077a5274570f27b9131b0300a3a2d29af5599fac84b1f7a73a7043fe7152876cbac3a329dbf4a58531bf40222003dc6ff4beff4ff24af67c056109d62526bf42df1eaeed37797b99ff5796d9bd022da017d8cfae94ad7a9bfcb1c1a59fb123a6d8cb0ddd9e6bc632ba592b08026d18d7c)) <<< 16000) + 0x170ab874217ecb83390e695f63beb2f3146ac1bb84d6a31f8df6c6b8a3bb9028742ac92b7af592f03d8f298afac1412b0b469253a9a27a9aa0001be089d20c4e4d5a39f186ed953440a43760c43044f83b9964209b494948e16053e5451b01c025172c198000a200824c9846010b307c28dd983e14717fef2b7372ff5848085e07fdb8ecc1f0a3acc1f0a36d0bfc95820246c31316b102df707376b48215e0ab84ac155ace3d55d72c1e5c431f475f5ace3d550814d10b106082080010402811096c91e7bea32f2ddc421e7c9581116aaa4ceae84e27e67b176d1717b54ef4d546048b5b1cbccbedeb49385f30cfd0bb5efcbb204c0e58cb6706177b26f8aaf7f513450f6a00097640018dc89c24c4dd2626c7b1353989a1884cca60ca4b132218988cc4c03625e0bf25394ad619c31c1416aa469968fcd2f13a4c80c91bd752ef009c4ce97b918c22c70c10184908d172f864d7ed894fe01d47d01199fbb2c4608bca5ae4577248007643114b7a18faae2f0d03f1ba555101fcb8c680d49cc18d8605745014088605ea0bd1abb620c6e6826b9bb632596045ec3f718f64da3938a69ed7a37c32a6db42e555128b8cc2a5b15485b91290440ce2051844919a4c0cd925086e507cb690b471c36cd444881201b89d17b8094308402112d23e80d3450a079f402d3440f02358b1624855bb3a0812b40342366803180494d20064cb06ac04e10420108960f438c2aa2406fce5f92788508dac039624fee00f9a28058c3c65404a104401000010c200051040904425c12028050968280010008961284ac55e07fdb8ecc1f0a3acc1f0a36d0bfc9582023ebdfd0cce4f79db3824d8f6f096c855864fe438d7e3e3e5800000000000000001095778aee43deef6e38dfb4c92d363d0ad78dfcfe4b6f9f0680000000000000000405ace3d55d72c1e5c431f475f5ace3d550810e20d08c04b04e00000037b1013ff2a5333e3c06f45f73f39ad42fe12ab1aaa37469b1fc4a894c4d514e623b229aea818afb414ba07a44e83847b63b28cb36cc85a46d40c512238c477b2617270bdc68343c69b76dfcf7405375b4ec6b6f64a7251a37df6f484ca5f2a4a5b14b8d0006a1225463129318940ec4246624e33126198928cc4903620e0310601c7d059a2a8fa0b3452f15dbc4a5e2bb7895046bbd295b48cddf0469f1c0b144f8e058a410b22d1eb384a816b59c7aabae583cb8863e8ebeb59c7aaa104c21c6982cc21c69836e44ff50c498354e07848a4862067006800025c785c24b844f91218f0d7da87a7174f292ea364719258521537e6b18708c31de4100bc88b88a29212fd43c8c95af0f05566d54a38b88b7c9e38b2cc391ac11644cf434ff76d07d6ff4a1298a2f624513b58c21c308b5c1bb7371314f36455c983161072d8583c653686dfcd2f8a842cbf04792dd132030ab2ec8b7fdba36483901904704b1d1621034152ed30b4da90085b81ebe595261d081d6e878f8500ad5a12c0a1bc1b9372aa5c365662536a505eefc4d74c3adf769718f511d928eb548e06428a304001d11d7e78048c4f251a1dc41c2e64563c6f36f4453b6946de7c3bf580c6b25886dddb1a621d730264a3fd04a2cbf9bdddb72eb8c73e7683abdacdb46dfed600366578142a4d65199ee549318946aafac2d94e2375b2b490ab4584145c3f29f52549c95ab399dc9c6e1f25cbaeab6c75e32133450404004011a44d98aacd4c0133683526803cfb1828023101f008000055112315c02004011a45604ed6868050df64d04820780100000f04488240580a0650500007a1b1adea02351e0061985bb280dd6a1ce800046383e0100000b020005ac400296087992843c342421af12b0073f93a891be08d1dfd004530b678be42c2f7855641b4f43e099a9cb93029e92338e6b0c138687bca191b95e55905891b7e2809adcdd4b445bfed5d23c7c340094f2d2c60faaaad816c60d1f67b0e373481ea4bc7fc3143e8f619fa5c8a497b82a17a6b2238a224f4e30a2f9f944bd10a37b2ff2229d0a256b4035c4cdf800901ee2492dffcbcd602c4ce0b1bd3fe0b9b8de095419bc5d8051812071c7476ee237276fdd69afff5941ea083bb923ab6d1ff468b53a1b7a092dc2eaf17a60dec04104e8265d78663a5469c840c1ea49b6a02fce01562d16d700a190d57af0878c070d6ef6c3cdae013f7572597e63297cb007373ed6f2aa0218e0147a67279cd99ef61c07ab9084d09cd80e1ab632265591a288d80ba495b545adbaa4c0edd06d6d297a9a47d00dd00c1507900842fd8991cb829f05393e65d78c2f760c97e9da1e256721684d2c40a5eec1b07023a5476c1c00008c908c0200001804480a62264311f09800598911e3988e8cc470661d40380e4efbfc9e402017f605500000088c08402101f88cdd0c60cd51e2504e26f9dbb56a48dac40e4c046f6cb7c17e39e58dd840e7ec3a9c7060b2ecef1cb4b7805bea4019d916c87f03bebb0925e3fb90563b9322854a1d0889a6b1f30233a374175623afbdeb0b739223a617f0290fd11d8e008d7b084e1238e3c204fa0f2c18d2aa563313ad1cbceb3459848093cfcfa2eff2c1b754be48575585e6a8adec55c000479a4788de37fa3b7d7a8f1829f8c151cf0e918307ffa07469cf547999520d7a90e6da88c4e87748a64ecf0a4f9300509ab83a1dfc75900f6a439865ab8a892e6234f14cfe194256485998822e193a53fb1f8cbba75bf27cd7198b72a00001d8c86f8e8378741b82211b1108d0480021e886d9a8368c40583a00245322327b0da3987c188460a622e4b11)) <<< 16000) + 0x62188a84e0502ad42794a94164074b10c958e86cf6808729dd74f135734e0c407b035ed1fd4141c679c566c32e1c38087079d6ed1bd7e6815021340b17e0b8a003c6fb6f47c2258067e0818c1c85f24007beb6682c3705878c7dd43c2d655413aab259d2673c37772e76c48e8c3ae0c79f71a5a1a3530c67db9c2cd93ce1f1ff974893e07ee6ce1f3e6d2f2d4681cc3450d77a0b05ec63b391da33ee4fa691dbcda3bdca1042aede5025c0491a10c18501cde202ad2d9ae407ee5a676a636236b6bdc603694e239f6004546208b21750256d6695a48e855c988bb663f7d0c77d450e6bb001dc407887c45b2ceb87c9a64199594769af19afeb6e67120e6b16c3c815d074ec0c2257d6cf3d3c4183c798b44044868c46544017cd2e6180251022008448c1f168193c89b67d94c308ffe459303c4a004014d1010392f0940094408002000020c6874620002fd42d364ce35c80f799c1fc73873ae63b47163baa1bfd7440165a57ba2004c284201000013a220c2a00039a3c29c4fa9824c1544d097a648b03932bdb301555faea4040180767918400252021008000089111415e89d72bc115fa8ab781e1bbbf2f4ed8e184083890d3dd685cff48c30388478977d382027c9a0e24d31c6c3bb30464c917161b04806f82e1b0db69debf8e247e5af72da483803f482964656bc96e236cee9a44036182015326dbe630ce162c32c3d0c339ebd6010047b128bb413fb18fac040a9f1095f8800548b7701e83440767f58963c5affcb7001d2b3c9752ad075ecbfd76d0e50f82e00004c32001e2c444cc42244a11109653042b1831ea3ed4c016916b4a8fd40a9c3cd901cff0a1b08580000000000000000022aaef15dc87bddedc71bf69925a6c7a15af1bf9fc96df3e0d000000000000000008048148087068027006805000006492c16f8ff957d9455d6f8cc651a164ab5fb976701ec0c6785ad4fdf3d2e1dbdc3cecb81c747c84de5c169bc9f217577daf4f7e48c3e14b47a98d94ad75b0b87d9dd5f9272d1b402fb43c21cbb4d55f9bed0f0872ed3557e7286f5dd87f0edbfdfbff9a8f52100e770010d5778aee43deef6e38dfb4c92d363d0ad78dfcfe4b6f9f0680000000000000000400ce0fe4f69aa63b89283ad1a68347a6758822eefb15177f600000000000000001012682eea6833dff4ac6e222c8a0894ed37c2243832834011010c000000d2a3caac6aaddaac5a1e18c548cc4022782679a92a8a6be61eafa0683eef66f704acab813712c2b3c65e1334101a02390d808e3cebb5a06611d9e17e5b5a71bca3e9cfe662e95a3e9bfc8779df7055c5414595892fe212c48118e37eb3014254fb91e92827041551e2201886d769b4a5b92d650007a722203310f1581f86c00334488716c4349700c21a267e44d6aeca6f94fa407cc3f35f72925ce1687bcd47004c032ee641fdd49a13b12a9efff4c7e904f952ed00c17f0e01252a3775031f62ae21e8ad3c74f83ca0315403d00717c0080388365b695c9da9cb3a0947ff1007f5a665e6760ff892f08006b916c6a077ccabc8b3abef6cc100f5898acc61a3258401a79f65b53ce3d079a567253c8256bd104b1b29359267f41d32d18d12d5d274e05b77716c786eda711e84308ac69ac20009a7e7ea4a11be9d87119ac85e0e04a80fd40d98891744c000062122189b10b4d88520c424d6210621070588300e010020080af0188280a840253b37b02056d55103048208001020803a0d29c2477084207c02141a0ea3a983800849833308820800200000f840003988000c9980600802040c042040200004c2202330081988008c3dc161ec0b0f50187f80f4401055e90144a0d771fa201123b10a50023142000848f19838844288dcebc52c402c2ea614e7000c8ca74a6808e7e69b0004a284001000010721fc22814ba8ec121a2055f4fbb144ead424f4780113a1310090307c02102811f1dbe8a24b754c379a00ceae0628e01210c25b8120610004000035c87e88c37c241f80a00020421f60be2db8953888c1b5d5f3399c1303919af88100acd1680611e713abe20031ceec6c800013121000400004e887d0ce3e82cd1547d059a2978aede252f15dbc4a823781ff6e3b307c28eb307c28db42ff256081b26515dc40c0b98438d30598438d306dc89fea189306a9c0f091d04758127bc5d3c49dda43bd414fb14cff3c3a04246c462747e78740848d88c4e44252810813c0280000303a9e700d3c22fbd1fa1cdef06643974c7973182d2847b53effc01e1f96c663f00d646caf47c34d377823da881e033e045fb64c987499b36207e5e8f08d508acd37a461033344e43a9906763ddf949078a907ea7e29d49b7d0b5b150a000c5243c0640017ba43d4c41f2620280d4813c56dbc648082e8f1fb40003fd07e23802213d842000241c20008500d2e7a3aa9a0012445ef0088308402100c0100400001110f809c0400401007a0200003720222a00013b21ee130f60987a80f0239e1a041ba96e2657d5e733bd561403bb412c7d059a2a8fa0b3452f15dbc4a5e2bb789504660473c340e3d354e154703e23368ed1889411bc0ffb71d983e1475983e146da17f92b040d9328aee20605a8e28811e0140014aed551bb98b11f8c8db0e7d0fd829656de458b12706fcf1a54ba070daf465471de23981fd29b28979d11b77b3f1b16f3ccd16850e27b69045a36ef6934646eb0140121e0c760d2e787fe141539472c0d29dcdc4183d22aeda8e011dcb22408c30740201e8038060080238957d19112a065ad8f16044183c01000007a200016e400)) <<< 16000) + 0x062487984f092d587d0addab290001b9693d6eca31ae57085eb826bb812d4508e98c9870024001fa0da6c5177b9f054b14a59452fac4d520cc0515daf4ac455ddbe6a29880780715e66d8d2da7171821edb7738b6c585f5b622d0c33e8294550602ddbab0014017ad096e21381e67213039465d10c52e796fa7860e5cfcbde5c75831a28580019f231779d86df8d1f1f5b95d74d4dcabe006b4c78ad185f3c53dad76b7e230041d23c589cc302975df57d6a6a2f96b46488689f5850f88e608e85224e0144a6461ff67ce29d83d64182a3020f921644fc473d2922103f8a68041cf635c00037b90f2210789083c054001c8a43bcc61dc630ed218760c80fc1600227c7c0ffb71d983e1475983e146da17f92b0412da9eaa642a059d05735da438166286302182780400380021cf512e80ab2fca5b4c41a3e25dfcacce984003d5c98ba5799cf0c78d58d3bf818f21468a0861a0e209075828000ab087502e020ef7ec099202e51f9cae0201110108040398061d2039862ef0033910e35ed9d3000121c1f00461aa41e4c7910ded4d93cd100e91c9fecc002c5b2ee40009070800200001bc43a05700292cdf448783cbcd36e6ec31a495b26719151d42a2ca160ee90a0332b5df810bd79aac86a7351023e8900151a088b065772aa9efae22595708b3c3c9af187d2500350a9e00017c1b8d3ad5609228d06c00c5e8b984d9774bc4b19a74f5974a9064daa1e31a9ef73a1c06c081439b72a0c5290cc8c52a0ae3111d5e380d15c73bc2782214ad151e754ae32b298d38ea4e6618db6c88c7408e66d518ce22f249d56794e9646cf7a9900738ceccb60d278461b75208d9c0a7fddb1c1e656271e76f5e23b7010c984551efa1261d7f800033b100082421ce4a80c0080203980701801004400f2401b98b02b45eb7f00088607802000010440002fc86610c394561c82a024058000b298fa0b34551f41668a5e2bb7894bc576f12a08c88355c00a85845b14a8841608eda960889823781ff6e3b307c28eb307c28db42ff256081b26515dc40c0b42810813801000365833d4b38f7d06398a7648bb64f5c666741742ac6d4f6e998cf037ce71abf0be98d7944d0a284a17b9300e57e54d9573588d9e7713b75731c17ed81022ec8037b79833fe40b3327a7f32d7f39b1b7d1f49f8a814da49d02d835ae50a3e4dcb2399d63f1769faac63ed9578c6dd989c69a21c32d8dd2c60e3275eaec1e1c2adf1eb69b51267e43022f5c16cdca108828ad0d30c524f7949019fe4fd8a40fbd68dd547578799f3f568182af0248a1035726add00104a5a91f35ca3ed6a140ec874e0cb155035eff0eac4f9e8251c67ad548b3dc5db05c415bfbf437387533e6992592017a1da6f5d92b70be801289ac0a64cf366dd7b98d08dee0f9cdd17df8317417ac08709615062a2c8e14dc58f326c4806985ed2ef863343017c6757165db0c72765075a4f2bad175a11957b82b6ebeb9ef7db6ef7b50746fa2f8b8cd54d232b70c7063ad4a600e51187208809006000f084128a41c60a000cec34419a2abe102866d6dd62208042dbc9f101e0442e475b02000aba9f93e008004a58460100430d071068384240002c04380c41be620de2906e948370640032ea436d141b47a02c1906c8a836044007ab2435d941acca03f190031d190d501004c9890c125605027d895bcc263b54492225463f0a98a112a9a4e15fb9e6302c952e60da92b03028916bf950c9d4b21cf63092c3e3d9060ac0f938d57356753f8f52882a858cc1026175a698d9614c5fa88e4facb4b0b8020cc756108aa86550d8177e0241cde40193d1abc36d9259bd291b8699a3130003e890b250bf5c040b5bfadab5b611d482516e672422bbffc15a94f1d85501a813f03fedc7660f851d660f851b685fe4ac101c856f5ea42816428430218238028008000026fb888f60b156ffdfd6e025d0ad9fe005576cc1e00678a41466c40196bbf90e54e2cb299324e224a872f3203a8b14000a38869a2c349161a2730d02d8678ec0fc660da0b06c01c0e03d4884d8d1279c12bd5122068c72f861420303d6fe62041304d7fd0a0000ccb7ad0a00c7557e9a00002724230087114ddb1d0a284a59c1019102e6a84fbe080b9d3dab98600655f079220128c1080403382419a0a0cc010000a610c51d86588c310261860bf03fedc7660f851d660f851b685fe4ac1063178820d6f017a7d642d425205ee44ff50bd30871a60cdc89fea1819609788084a8408202400300080244b90f8b758859afc6fc38ce6048ac63d8ddecfea38ecbb4477c00015ffb2335570f7392ef6ed94791a2535fab4ef90fd8314c330afa1943a020150001d890c93d8641ec31cd61780ba15567176a881674b1aca4908a445bd0050b7d574930f020cec9118b00d4fbd50c0026182000851228b2915e78d2d8be5ba48dea3fc89e5016f9225ca00482840010b189873ed660918adf800e0081041cc23284a0c02ab55eec60e20ebc373c608ffef23b9c804a0be5d18c00a38a1200a00005f880013a10c21d8608ee4808554b2b0f15cfe61cfb3854b1a303d8814d0b5c2752011afb2e814403153336490009860880210295d1c46449086b18aa66284f089695f0c2452c5c8c9c0d64add6cc70516816cd63800cd56f190009c60840200002d041484418c020002ee218a2b0c40986184f4b031b5c1e0b1c465018ee2c3b61fc070470805d9ae310c208fe43f84250822008696171bb2161638ce14130a5873e925e4a12187ac0ae4038402fd0b5706102caa23ea6800d5887f884e10440)) <<< 16000) + 0x10000167218013f03fedc7660f851d660f851b685fe4ac1069f590b50948172da9eaa642a05ba08eb024f78ba7893bb4877a829f6299fe78740848d88c4e8fcf0e81091b1189c884861449050c504600171422f0c71ab0b5bee655ec1346bc8c8a8582a515cbec4fa3c43e56ffee13e558ae0a7fabd6510524f7a006ffabf32fd88554d460619255e8405b95a6d288809cb40011588610ac30457639086515fc806295bc7a1961cca61661a5846ad6b56612109651fb421284110042c7260f481e900cea92294c2c395eb6eee0b08946faf8b2421197a4960d000c8b8d3c2000987860942708220080000b390c005c9031125cc51431504e4c865061164f7aa1e135cd44e9a5050e2b5945900889f787f6600bf0f6a16004e204401000016b20c01a05f0900022910bf1902e0a81ac440401a0be0500060990bd2d05e1082ec840ca2a0ba110009e690b9410251c82e04416e1a0b60d000dd410b56105a3082ccf4164320b1110580082bc0415c0200244f201a92e4042b18c08b10d52d26c08211d66a4bac07048913b094d208123a87a4a6787002e5dc762e0180953a67c9890500b18131e6860111414103c6b1700ef804513e046429228bb21500e004c9415a420ac1d0558e803c641542a00d0d00602802c140140a0a901054008000c8482518829c5414c1a0a501052008053b40c06a5db1556098183a519fc41fff0c0c2493c93c6e0504c69229bab544006ff9b273f1a1402d4a8800a5e0400d7eeb0095f8010441465dbed092f70205ee5530b472dc9d40b40a01463ba221acd90a4250e0fb22d3b918520e21e3369221d851b498890cd1dad5d0c4066331e2b672024a5d93cf20e0812eafd23c504948d60df052084a010a228a2b4ca9e48821a73101024346ab642509018058b097f480a3a60e649e3820b5778c870400fcdefae3b3821280400005e884e04c288161420b0a00583700e4791fa390629221aa142913090cb5e6bea46405406bf5a7e180131a7a3380128612804027c0613c03a2230ce95b7e50a5d75600682845f3e4e1e89221eda773ddc90d010e411d03801327c043404004da88c36138212804380fe3aa0c856e7624f4ccddfeed2ccc05ea9c73c5c62fe7f674000000000000000001144a20a14a1091090ca08504500c020080340006908228482742400c1200037821380a0004ee21364209a2104c9082607412e1a0960d04a86825014122020900104780823804126020009f4207a1ba28a1c73e55ad7c6cdd3a6e49de7edadd0300d9a84652100000000000000000802406286206384284102280028a27bfa002fe9485fb5b5f027360013383d1248d1212eb441ea806caff29be27b04a3f4f8bce80b0928204411710a4c937c50ee3f2e436c30a4bbac4c8f968a2871cf956b5f1b374e9b92779fb6b740c0366a11948400000000000000002008e29018618a10408e002008a32608ddbe5104ba00f8034248141220a090050478282380411a0200023a2000b56423186116c308a51844a8c2213610e93086398429ac21096106430821d8408ee8d9d9092ef6b800e4005b8d801294e138582461526a6f87009f55a071337f85eccd0d271c896adc3622200000000000000000fd6b38f5575cb079710c7d1d7d6b38f5542032821021c0140000440060cf66da0db9884785b43237cf8dd2ac258403880f48ee9e4e29fd73bd89bdc437432e251053ba271ab2c1992f1527eb1d587f57fdfb11553d6f0f79d4fa97ef9300c899da8bde10590fc7909d51c2a050a574772a1dde2ec1af68cfc6bf7970a4d4bfc7583e6b376c5acb7d24577b2bd7dcb04b1753c8971e9e8fae54434030081cba0f56794ce9a8c587c4f6089242805a367642472da5f559c005b8d8011234a5b9a09428d9d9092ef6b800e4005b8d801294e1385824407755f2845d5c209dab3e5b3ff80a06dfe308135369b83ac731be0000000000000000000000000000000000000000000000000000001b16b38f5575cb079710c7d1d7d6b38f5542042c3142180100000100700fc598e34228a9ee1cdc305cc1b467ce778111208ae46aebdb69024bcd088a141b32152445b72981a4a4253a668cf781d8572946061d0b8080afb57f0316fa713fcd6a45aa13fdb0438fca2d6eb9a8ffa7ff35fb9d6833096b2691ea28ae906afff6dc401a1a36e9ddc0684091f6f3205385ff057041679fe13a259eb835be3b313a6d6a7570b4e9865ff548884c67e377071086750f66178b01dd57ca1175708276acf96cffe0281b7f8c204d4da6e0eb1cc6f80000000000000000000000000000000000000000000000000000006c12c52442c32c10000270dd06eb94df2684b5bcabeda8fce6195e3f0ca07767c3ba1705f72a74cdd878071df7435ab4727b7d81bcb694b15c020f578ff5897dcc09a271bc60d2107b443b3547bb25cf7cd8a0773b616a6e21b64f5ee353a4fcd555c6b7cb2f525582c2ee8785cd1aefe6aa1b654e5a235aba09f2a966ea48f55736b8e46a89228f3975879b65a62191db153a4bf04b9ea31e0466b4a9bd6907b692879ee6cd0006e121006a07f0d0007dc982352f2c78500d39da94b6871d55b8bb7c1323c51cc509c4cb4c474f6ef28ef5cacec3809f97117a65f19477f12649cfc4e7c86028a518e2f4f31cec05647d87586b9651d285021ced67529f051b1cc605d9af53d816239a9b7e4a3848f3c0852b234fdb83a350288600cf26e613ee931e28c85b888406c78e9a652ed08e3b38e648a5d0da780d1e830df400044010ec7ccfbd8f5a2bd0a17909a85bd0ec)) <<< 16000) + 0xaf3d5aa27cbc84e51fd366e27b388834f5120a9d209c5297e10db6e30039a7ea2a22cd158b6675dde9ba7f7d0de282fdb6923f4cb9c0a5f54070c6fe9d3c32769196cc4c5a8088145307cab039177c055164490b3a851b3b212396d2faace002dc6c00891a52dcd04a937f484e4581a73efc2440aad09aa3b6b001680eeabe508bab8413b567cb67ff0140dbfc61026a6d370758e637c000000000000000000000000000000000000000000000000000000362d671eaaeb960f2e218fa3afad671eaa840a1864003002000002009ee5969cc8ecde3e592b497ae76859f64896b96e320f1404adb7ea27a4343f51952abf1296d2e1abb5dc33a8bf1a84994c9ff3f9e4f5b2456b710bee223dcc9f82f2d11bf57281ce51964b716bd215af89fc637772d58268e0b20a8b5080c0ead3fedfa2c31a51a487b5ac6d80eeabe508bab8413b567cb67ff0140dbfc61026a6d370758e637c00000000000000000000000000000000000000000000000000000036096296186188116080001440affd1fd4c06bdb9012895c1f74b8cacfb39f736130c8cec230e453a66441f9be6cfd2d3fdeb40db8ba0e91ba6bd5a2ed80616abc9983b32848a6a4bd491a69a683771f6c9ec47cb4dc3b6940df27a774707cdc039c77120e9bc7b1208a9e4d25bc149aaf891f1f0bb7d470c5d242af0cac8c35eacb7eda4a9e7b9b340017d883f1a81f434001ab4400544883e24c1ed260f4930793d83c14c1dc9607c330760d83a82f472368dbe10c6d2d1a64ffb9f9122e76c4aeaac82e365fb6c0000000000000000010d8549a9be1c027d5681c4cdfe17b334349c7225ab70d888800000000000000003f407755f2845d5c209dab3e5b3ff80a06dfe308135369b83ac731be0000000000000000000000000000000000000000000000000000001b16b38f5575cb079710c7d1d7d6b38f5542042811011c014000044010b6cf6ee2a8398c742659e54151b18d5ed53c4bfef2e2b9c2f2274557cafaee088aa7200296c87b5dbafc79ab50b5750e5ca9a0b82ad50bc8cb44bdd5729bfcddbd32f466949719fb0176e1f66927d76c080ec85deaceb897c50832318caa95740dd7d6bb0e629695199c0c646cf3394d114fca99b0a7439c4068f0e698fc6f0076ae94186b7bcd087d895adff4afce88a5133771ef28a37fc691bfbbaaffaf23ea5d35f5913319bbf69377dc94f965b5d615a1a6d2640addfdb3aa91d8fd232cf26ea3e77c777755f15064a5138a208b684d51db5800b407755f2845d5c209dab3e5b3ff80a06dfe308135369b83ac731be0000000000000000000000000000000000000000000000000000001b21b2138f5ae1bfe50dff241531032c21c01801000001004923906dce475d8cc7adb1617ce0d6809262cc3e2d4196170a0d2da3e580bb33ab93e3aee2f56a3beb29de3e78a247f9b3b4e4a36858b360060a3db71919509b13e044d7590a66fbabd81cdba97861aa8c0f57801d60c579bdf54b2db56fc9972094df2c09f1cb20ff47224aaf8a1504b90eb01dd57ca1175708276acf96cffe0281b7f8c204d4da6e0eb1cc6f80000000000000000000000000000000000000000000000000000006c11032c22c1080000002c9ae63d94a1666dbbc73c07b3de3ca021cbaa97c34d970f250285cdc7464536bcedfce0b309678d4bea28c0f4346da3ce758a311a08065a3e2e67c86abe37a7fb576005e17f951bc379cf98588ca2ac9ed09a330a99588cdcdbfece0d007b571e7526691071096d7f6dd64bea02b31592b15b480fc1e7c07ecec99a81554d0d983847ac5e3db89c8a57858ee3bf747b5bc7141a850586881ea6bd0006d92082720400d0006ab107449839a4c1c9260e27b0702983792c1b82701dd57ca1175708276acf96cffe0281b7f8c204d4da6e0eb1cc6f80000000000000000000000000000000000000000000000000000006c12c30c11c01400400010012035304f431ad3bada67f0d7643560aa57c0383dbd320003900e060ef830aa04a3e88e04f9468c9420a006aa1911480abbf12bbdd09afe1f24be7a8c4e024603a309fd406b18245a18a6ce3b02dab6f857aeb3246927914ccc6f5c7849e80272ad9591f7f1c2d40fb88b0d898cae26af1a04e83565dc3dd9ee1bac9ae3de13698517775c442c1fed2d60b31920c5f128f374ff2dbf757d4e55b6ab9f06cd06d0583600e8d9d9092ef6b800e4005b8d801294e13858245de94ada466ef8234f8e058a27c702c5208501dd57ca1175708276acf96cffe0281b7f8c204d4da6e0eb1cc6f80000000000000000000000000000000000000000000000000000006c7dc1cddad2085782ae12b0550910a08704b0004102c25c7090ab508f0f792132951c7707661b7a2684f5b4f5e82cb7c80bddab8a2cfeff9a742e3badeacefe1bfb9ae33a13ae9975ba773fe3714ce03559c891d4bbf1f0c19a9913d777e3c4e10194193be507e2431491c15378c6ca291a95e9073b7162a520b3a04ea0df4ede208465f75d8a5081f6b0900657e2f973c21e9e570dc12a642e1ba5b8954f01de02b47c4ef6790ad06ead25a085b38bfdc282e7944e2489055c173a9411b7284390304065df3740e0919d05dc2020804a584401000011c20b84306b158350ac16c4777a52b6919bbe08d3e3816289f1c0b14821a255e4ac9e002d01dd57ca1175708276acf96cffe0281b7f8c204d4da6e0eb1cc6f80000000000000000000000000000000000000000000000000000006c7dc1cddad2085782ae12b0550a08808608408b00040550f0)) <<< 16000) + 0x99f27cb1eac96b7f820d7d3178689c4056f003ed5432c75faef2985e92fcc3056ad127cac6daf9492991b55bdf4903a42b2df72328eefb2573005fc87ccdfdcac28987517d1d8d1da3db825d78d12c05af00423cdca72c8a4d8eb968460b302e1b2138f5ae1bfe50dff241522852c31c32c21423c03000100080dde78e5a578ee23e4c34b22a969e2facb76dad5cc17840b71058d3e0b97025d389bffc4a5d16273aed7a0c14463e3dab87020000000000000000000000000000000000000000000000000000006bdc89fea17a610e34c19b913fd43032c12f1010948b0c70c50cf08708800700040e2d74986e7baf12ee55426efffbbd98dea3af563ed7544edc99a28286da07995aa05ea7027ccd8021ccfe643b2935b80c4f5f850ac65d340854b22d314b96c595eea3580f0e793e03ef1c7313445a8002971069050003909043150006ab106845833a2c198d60ca3306405f14a24bffb2e1a96f2236492bd4cfba8340e6ac64b9ce7052fc16a551ff02042fa6d11925300484466f564f2302020017cad9ad3cb72f7cb63fd76c267c80f14b6ec48d9e096787a2ee51c029f54d96f6bf643875f3a7263349f8c01a247632a6062aeb8d79ae1867154d0f4e4326f22ea0220000fc0c8605d1088bc4941e806b0a2a68a3d59919b4282f7b6287a7374690171dd9f3707c42f16530a922058dc94e32708007817e7181006e7cbe0a02201194100042c68e78871c90307c87e6dcf0f9853947a022119010804018c140b2020000e220aa0a0001cb20c46b0613583012c17c6701dd57ca1175708276acf96cffe0281b7f8c204d4da6e0eb1cc6f80000000000000000000000000000000000000000000000000000006c128520210238030020004505697ac0f5e1dd335e7c4de3181e59f74040dd2ef007e09cde05964bdc8a83c900535b24cd452396131c6e7a30dfb85642ab5bbae9a8c3ae9d1b7fc319d0ccb3a627008e2cecd7b77313f58094e985c75d36947bcb6d1fcb202c8aec81ee6cd9ed5025bfa5899a20e19bb539796e944e90d0a0153774ed136a800000000000000000000000000000000000000000000000000019dcfc40887209f815cb26a8f08e526fba27894d2ada7aae25028000000000000000000000000000000000000000000000000006422c62430c33c24002400000440000b9c00803603baaf9422eae104ed59f2d9ffc05036ff18409a9b4dc1d6398df0000000000000000000000000000000000000000000000000000000d8289260e80c50870670238008972837b8049f13597889f3976e2825376ebfb117761c4ba024c69a990e48adc11fbbdad56c37aeb4dcbdfdeb277a91fbefa7c34181eca3ec5df7c23927b1b562003637935eebd35d381439ef52147f4e415d39e4e41540302000000000000000000000000000000000000000000000000000657c940c180be1239bd9a6fcce59886c6686bed89c5aeabc5a1c000000000000000000000000000000000000000000000000001909124c1c71ca1061100c4001100b92008034000f108228a81784400c2205901000423905d05000626900117520b85b05b15c9a0bba995a389b9e7c70485d297ac2ca04303f279b62ac05a03baaf9422eae104ed59f2d9ffc05036ff18409a9b4dc1d6398df0000000000000000000000000000000000000000000000000000000d9b7d5327e17a05c364271eb5c37fca1bfe482aa38a3847826000208890be971d54f00f315078f8cf06b9d7e2ba066c9b8d59c0674af0120cf17d4176006004b5567754060ac30665418476e449ff7ce0ece104a8a49d7350ac461e9447dc31bfeb41bdd93fb07551c4834cdb07384cdf9a73c4ddde5793150e5e95db0280100402d00c1640712c050db6a0944830087b764841d980eeea4023861b5b601063f428fb71e000f3a251f0026142300847ec28d3165c6ee37dca3699579b7fef4072102a7b791c9c00000000000000000000000000000000000000000000000000c3b7d5327e17a0591442421c20209601400e00068132a398454b9cf14a82df6bb4c7c3e21c474513bb666b10ead548c334862954b438a490f14000d4482c02e21b9a6746bc70c6198aa081876b4c86542420863d092920922afe1a8901086a82fa08130c10804015c060002a2415884048420451d0030a8001a1c82a828001c0c82a1ec14cf60a45b80eeabe508bab8413b567cb67ff0140dbfc61026a6d370758e637c0000000000000000000000000000000000000000000000000000003609e39839e29c20a11c09800228088866231c4839b89c36418299d94fbb8a60ea3144eb610e965c890551f35151b40a0d287dd80486b70acdf008c50d59186633867d83aa8770e4905d13c8d5b01dd57ca1175708276acf96cffe0281b7f8c204d4da6e0eb1cc6f80000000000000000000000000000000000000000000000000000006c11830c33c2081400380340045038aa237458e91c2f9ad636c31db8895e65adbdfb4631e0524b4a876c134b804e655d00cc6e2876c252d9d36e29e5de7d68470e0a6a434aa3600e79dc67d99600b71a732444a850f81898c031cd805a42a8481def8485099176ce92009c3250948805b8d80104c30440109960224b96940b0000967d24417439018d21608e8ca12288016d090624297e3d4a6a40af133b2d1102718210080000b498eb968460b302d2682eea6833dff4ac6e222c8a0894ed37c22248a2894854812010412c028000c080080341241409002047010000ca90512182810c13c5609c0ba18399ab5cf8e)) <<< 16000) + 0x616003ef148009900fea3bbf5c98c47d495456c686025c9c71264866d806e5eb01875022c1aa7050277bc06b08c5001ad8a5d97088589142801c50c20134fd5b22600002f071060c987da5f0e9846e8ee42680c2077ca166ba808144790ac8a04deb9efff00835c89f97ea18000e425a3c2214914250140000f4104d198260cc12c3713fad32a2e94352edf84b48374f65a499d0beeb776d9bc0a6d1234000000000000000000000000000000000000000000000000000000363575620101853896e6c22cc60b16379a0f5121ba17bae349f4a0000000000000000000000000000000000000000000000000000cc489850e38e98c6827005000885c700401b63879843b529c68016e36002c31e05819b2304005b424195062f958e4298034a073b5b04630a1180623f614698b2e3771bee51b4cabcdbff7a03908153dbc8e4e000000000000000000000000000000000000000000000000006115cf3ce5cd48d18658240158004c08008036e9842afb83973d59e3c0aab182ae5b143186a7550daf2c14a9dbc830f00032a12981000bcf65e6009c40840200002ca4000e70d5102fcfab554def23f8d010469adbc5834002ca85580009060800200001bc40017dc82502800282cc8af560587c207458c92c667b8dba9a1f3fe0a240e759d1139b12ae63a6327b08cc4985404850d08ab2a310207a313a04abe2c8a9d368d2017f59dbd0189601e176cb191c624d0d9772807e0da2477e0930ae38d7b3b8397c640f3c0000f5845ae6323259214e99db579b28f2a0a25b613ef0f8178d48ffacea849472186800920a048050238280010d4823088004b488229080185400300641101400388040081d88218e800b974821188011dc4820a281004400bef240fc6400cda840f80401007240f4c72222a62f6c6c9a5882478991fb743a80810d9cb4194e350900a94260148d36f82097b8491f06196080260a1b0f1ed050604ab6fa7edd8708202f7efdca63b9902201669f7d85f274200029cf714261a0242050c6bd5e3785f4735964c86760d4e07f811cdee327b6f54b496311c2c824e3c6be0908c600ebcf650dcc9f5393b6cbc407a771201f6e9aa2e9853c5eb13699678a5bde81c080a06d0249c54ea4dcad44633a423ee18c06e625c29199c695544fbfb00edbbf400004d48f1b6cb5054e77d7c39d53ba0441bc18803734328b0adc58116e62b21fbefe0056d80dd16660f8298c1e01e0e71d28faf01153626ac0d40e0665f44f1fe5f749203d44d45b8c52fc6c72a86792737d62be3c85b14d00b02350cd5187e4206620c72803701e0bb6724f2814573b2ed5714116c2d2cf890061165dca380201ed9980094408402186bf8b7d271619217bdff8800006832ea118410804346139e4e33186df647b6a2c38088bf983808965adc809020800200001aa40e43400036060280200800002220783303b1981d0cf059eb742070c108165f6bc900086a06463802112cdef0006efb83eb0004a3042010808008023876454b3bd082edac4b2a3c16d36118130014adbfa50240c20008412eebef803c1b8c4a48a4004008d7a808c307c02000014c400066081c8480007a8e135be74ec4c01cbdb05d12016d133db000231c1f0080000581038110001f990371901b0c80d414000f3c40d0c406662032250188480c024001d2a40bd2405c9202d490161e80aca4054320291501404809c0404c0202501000911102459d7c45a99543b022c71293bb179f5fb9a4fe78b5fbc8ded9d0fd2540000000000000000000000000000000000000000000000000000003608e28619008e08c08a00400080894429b1c1a984453a32cf57c3f20d29f46d453a7f18e219c34630aeb323eeec09267a0b5dbe307b8d0d7e7e70c4224aed1d8823da27ea0cb7669246e81ec6c5b2b1fa461d0db3a0843ed5cff86972f2fa21d5ca365a1e889340000000000000000000000000000000000000000000000000000ce27ff9c12e556e4f79186589ff4dc165befffc27f53d86aa59c000000000000000000000000000000000000000000000000003211030821010408c0020020236829cb1db58676e2b705522951a2900dbcd183d28d9cb493ff4255879d644c8f22611d970dd300c77025396a4beaeb1570bacf4fd0fdb14741916472aedf0009243b3e6214df0c204b6a7f672000136cf8361c0049fc496d0402a3848008b2c1be85b0892c2ed8a2a2220b8ed57d2880a20018e54ab438187cb10045e03dfd47c000a1068b2667d5d03784910000ae9f78ef94006000928858b32ccb8000012c16f6aa0da278003d0901030780a8d3447ff66d34186772613e5863460948ea2b9060c4d69c2a098a080b5f8afce0e0806ba8c8941800022bb8fce08004fe1276be80027008614b43cb1294069002c5375dce68c171ed6f2101045a41d04c8448206e03085fa60178d57a1b002800039386f114700280140000c810230581102c08417a6802ae5aa8e34c199eee255a619df4f596898d2800f99a6a29a3033b418f373062e6149490230000548b44d819c309c021a5043055ba9ca30a63c193be94268c21aa79114d0209308e751f2b180740817f50a22c00023c3456a00800ae664ebffc0c870c2b0200000d710003552040120007282001386407c3403c1a000b26203a4a01c1500d8a8068240321200111820307a0173d00b1e8054f40286a0131d0090c8044540202a00f11007068034240180200b0100500802404002d4440203400e0200d662200cc20053100218800c44004220011100002803a91481fd119)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 47 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case5" = "QuadHeightCover12Case5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 47 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case5 private def zz2365:"s093d"="s093d":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case6 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l14 l15 l16 l17 l20 l22 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l44 l45 l46 l5 l51 l54 l55 l57 l58 l60 l61 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x4de723a7d, -0x5859e065e, -0x48f3bd1c8,0x101ea77b0], ![-0x5859e065e, -0x32f4fda45a,0x64e1c296c,0x532499a0c], ![-0x48f3bd1c8,0x64e1c296c, -0x2444b96de5,0x597f125f4], ![0x101ea77b0,0x532499a0c,0x597f125f4, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xd4f082,l5),(-0x879f552,l4),(0xc1eab3,l9),(0x141fb580,l8),(-0x1cb1bbd,l11),(-0x7f6cf7e,l10),(0x1bae89c88,l14),(0x4f8e9898,l13),(-0x1357953c0,l12),(-0x19c96f90a,l17),(0x42aef26ee,l16),(0x47d50557e,l15),(0x17647a7c,l20),(-0xe12048e,l23),(0x8d4d5ef6,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x11d102aa0,l25),(0x19a57d068,l30),(0x2cb417800,l33),(0xb0,l38),(-0x2cb417800,l35),(-0x26f4c,l36),(0x2cb417800,l37),(-0x445cce,l34),(-0x34a256e6,l43),(-0xaf52441d,l42),(-0x15782a20a,l41),(-0x86f432c,l46),(0x20d56064,l45),(-0x130aaf8d0,l44),(0x2cb417800,l51),(0x2e0da,l55),(-0x113eb735,l54),(-0x9fc0cfa7,l57),(0xe2f0534e,l58),(0x5cc350,l61),(0xfffd620,l60),(-0x82a7b8b4,l63),(-0x3582b1c6,l62),(0x164ddedc,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x42aef26ee,l16),(0x1bae89c88,l14),(-0x19c96f90a,l17),(0x19a57d068,l30),(0x47d50557e,l15),(-0x11d102aa0,l25),(-0x9fc0cfa7,l57),(-0x82a7b8b4,l63),(0xe2f0534e,l58),(-0xaf52441d,l42),(-0x15782a20a,l41),(0x8d4d5ef6,l22),(-0x1357953c0,l12),(-0x130aaf8d0,l44),(-0x3582b1c6,l62),(-0x34a256e6,l43),(0x4f8e9898,l13),(0x164ddedc,l64),(-0xe12048e,l23),(0x20d56064,l45),(0xfffd620,l60),(0x17647a7c,l20),(0x141fb580,l8),(-0x113eb735,l54),(-0x86f432c,l46),(-0x7f6cf7e,l10),(-0x1cb1bbd,l11),(-0x879f552,l4),(0xc1eab3,l9),(0x5cc350,l61),(-0xd4f082,l5),(-0x445cce,l34),(0x2e0da,l55),(-0x26f4c,l36),(0xb0,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x410b00e180600000000003c0520080000000048300e60100000000000a01c802000000000052071004000000008c4405300800000000f868126010000001f150d029002000000003c220318040000003407401b3010000006506601166028000000c41600ecc040000001902203598080000003404801b301000000000001a0640080000000000140c801000000000001819002000000330500db3010000000620a811660200000000090503cc020000003882204b1808000004182401b23014000008305404e460280000000000501c80200000000004e0310040000000000980520080000000001280c4010000000000250388020000000002a005900600000000055013200c0000000001480e401000000000005c0c80100000000005a0490040000000000c40620080000000000220640080000001c86409cc0300000003a0d00798060001643104c0644010000000b86828148010000000150440f4c0300000561b0480a200600000005c1300d300c0000000a82202a601800000000013014802000000248420191808000000004c240630080000000098500a60100000000130b018c020000000230a80518060001342304803240100002b0480b013a80201420a4042003350060000a41502401ea0080001502705006d40100002684209006480201440a1044006350060014c144130096a00a0001702807005d40100000000004c012401800000001109018c0200000000221603180400000000003805200800000000038012401800000000012014802,0x1624890804420080000007464540b40080000000000881a401000000000003c0c801000000003e220718040000000000840e20080e08c985200f48803000fe1921bc05fd005001f03043600ffa00a0002387211c0bd40100003c8bc0881148020000731601701a90040000066291080f200600000000000903200400000000000e064008000001501d006cc0400000001d0881118060000052833008b3014000000a20b0076602000000000f09028c020000a61c042029a0080000005204406b3010000000a80900366020000000c4110320c04000038232603d2180ce3463e22402148401c0000000e46206c601b8518b889005521007001de310128068200a00000007609014300c0000000c45202860180000001c8680dcc03000000000005819002000000611540683010000000c62b815060201db1690c101775006001c62ac36809ea00a003bc5d067021d401400000000a8300e6013ad162020404cc10070000031c538126180a072455013403b04018000000c22880d860201db16c04701ac100600000314528126180a0000084320a014400c000208620b00d8802000000000e09014c020000000001c1819802000007c2a0a014400c0000008210811860200000000000d02480200000001d0a0099806000006c220a014400c0000000842202c601800000000e0902cc020000001a84204318080000074260a014400c0000007613810c60200000000d844088c0300106184208157a00a000008c321100d400c000218621080de8020000420e4270365004,0x18c118158079200a0000000000140620080000188642201a801800000001a0f014c020000002086603418080001a0430e40284010000340861c8150802000000170a05015002000000002e1407180400000000541806300800000000a828126010000000000150388020000056120600520060000005c28180e40080000000ac240546018000000000150188020000000002c2819802000000510c404e30100000a088980f48603014111306401e910060000000291081b1806000104330600684010000000064220446018000410d0230331004001301841780c8200a002603083f019040140a10818610122e80300007c0f02101e10040000781083404e20080000002105003c30100000000000480c40100003c0841400f10040000e81a04203c20080000000220a00c300c000450ca0880348020000000000240348030000000052260518040002047104c0994010009910209402fa802800000001f07028c0200000761e0580a200600000ec340f014400c0000000c42402a6018000001842201fcc04000000004c0a0598040038450884031040140000000108a80c601000000002315018c020000000002380590060000000000840720080000000008a02640180000000190a018c020000000032120498040000000000640e20080000000000c80c4010000056198680d500300000000003a071004000000007468063008000518d218806a802000000002112018c02000000003a340718040000000000840620080000000000e80c401000000252209029002,0x2882a0459808000004286500d23014000000a60f8056602000001021840648c050000002086201c98080000005904406b3010000000881a007260200000014c1400acc040015624816009ba00a0000044841031430140000008810812a6020000010e10c0650c050000024c25818a180a000004884d019430140a8884823013ae803000000011848074c03000001b420806c180a002cc43024035740140000061082049860280000011c2300a8c040016a20c1100dba00a00000448410094301400000006422028601800000e21140360c050000001884203618080000003509406c30100000093096012860280000000d82c090c030000881c83206420080001103304c04840100002406609808880200004c0cc1301210040012818c118044200a000130350740c84010004c04104200d28028000460841100e500400008611024034a008000110350740c84010004a842044019280280000013090503d00200000000140c079804000000003c1c0a300800000c84c1c0288018000000000a0c0cc010000002082c01d98080000004204406b30100002086408810e8020000440c41402dd0040204186104048ba00c00000000342c0a30080000148641605c801800a10c20a405c9005000000000012049004000005182401b2301400000a305404e46028000002c4a101a8c0400000000005a0710040000000003f00b200c0000000000e80e4010000000000f404c803000000041108139806040830c20808574018004306908c01ee802800820c6108055d005,0x50640429a037c200c00000000004409200800000001a8280e6010000000001a140cc01000000005a2a0518040000000000140920080000000168981460100000032090602d0020001263608a0372008091071813408654018000000c22980d060200000020c190090c04000000004a1a03980400001303213026400e4e8e104be0179280382011920a101c890060000c22985003420080000000860b014300c000000084320446018000631103401e90040000c22186604d2008000000007438063008005186108207aa80282c324218d01be10060000000042240718040000000084140d30080000000000a81a40100000036090602d0020001864102c01ea0080a10818134086540180000309082401e80180002011d301e90c060000000411c81b180600024c5608c08a4010000488a80d804880200000024c190090c0400000922a08806a0060000000054180530080000000e43402a6018012120233006490050000092411b01b20060049c838d503db401400909011860336802824520518f0216d0060000003886403f9808000000009c480e30080000014938901a80100000024c2202d0c04000000544e240720040000000921202c300c00002a12c440348018000054258880a9003000000049090061806000000a8944405400800000012c4405460180000000026240cc0100000a44b110152006000000a4984809400800000a11020498602801252242b004e900500000210178038980a0000042837011130140000081050016260280000014c14036cc04,0x320590040000000000680720080000000034002640200000000001b014802000000348820191808000000006c4406300800000000d8900a601000000001b13018c02000000033128051806000000000058052008000000a424002660200000000161201cc0200000002c10809980600000005827013300c00000000b0880a6010000000000b00248030000000001b004900600000006c0900c300c0000000d012014601800000019024030c030000000320580e180600000006e1100b300c00000000c8480e60100000001a044038c0300000340208013180a0000006a08401630100000008218811c60200000001086403cc030000000693081b180600000d09810192301400000000b8680e60100000000001501c8020000000062320518040000071859011b30140004a8861a00be8020010f0cc13405510050000000311080b18060000006505803a30100000000d41604a60180006f0a81401e90040000000000780690060000000000901d200c0000000001401a4018000d1304a802a10040000000793881b180600000f09c1019230140000001a47202c60180000000001903480200000005b18811980600000000003c0920080000000108e8146010000001d150d02d00204843060be060ca00c0000128660901d400c00920c6058057280280000000150d038c02050638428a052e200c0964718364043640180000012890480e801028920611901099006050640422a0253200c00028c590600cb401000a08a305403ec8028289206167019e1006,0x291100718060000000058140e30080000000000880c4010000631303302ad004001461a821818ea00a052034422008dd4018005286708a02fa802800b10e41440a750050000000000360310040000000003500a200c0037049052033480280003908c13013500401d0112092018d200c001d821823009a40140718418218021a80300f0083043004690063941030418010d200e0001343704c0234010000000841c002660200004d0c413008d00400000000241c03980400000004819013300c0002686809804680200000001207c04cc0300000000241a02980400000000024009200c0000000088780a601000000120110058c040000000220480718060000004e044016301000001284c120168018000000000780248030000000019000990080000000006500b200c000000000ce02640180000000003201c8020000000000620590040000000006d00a200c0000000001b80c40100000000003601480200000000006a0310040000000000d40e200800000000e8c81460100000411d8c8099003000164318a602420080000002104408e30100000000441201e601800f208a0b406310050000ec1283a06620080000000000b8052008000000000032064008000000001101608040000000002a00c10080000000000900c200c0000000001480c401000000002521028c0200000000001a03100400000000088f0330040000000149281460100000000002a01480200000000000a8190020000000064440a3008000000681280726020000000000d402c803,0x6c00264020000000001b402c8030000000003780990060000000000d80720080000000000360640080000000003502c8020000000003a80510060000000000ec0620080000000001d00a4010000000000390188020000000000720710040000000006500a200c0000000001980c401000000010864058c03], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((0xe38b2518d8fadc698b438518c85138bbb2c833a9129a592db85100674e2802b542e418a7025a3c85be58c04130ecf8b9aeb160007ddd56c1290fa10185a058e3555fa92699e6581d37ddc38c37a31bfe871009daa3cfcf10443c7f510411460abb7a30001407786c08001b20821928082300879cd2578bbb038bc50375c86aa9084eb41e69c5da1fe8f70c33c91b0131df9e4d1c80a51cd981127421830d0a9718e8ea51e2009335372b2844de3400048378881868c08000c500fe766a60a48ec2410dc161e7365e22103881b9eb898d3e9e6961489ac287921d5d83fe6a029de99fd34818687ee6841a240001c9c38008001ddcf477494804260140000db10004632000c36473446398231cb118e508c7243639003e357064f2a63f6689800ec67c6100c3ccfe5c0054928e9c61890c333bfeb0f184571a4296c38788164270c1b6203420af40c9b0741820d268ccbfc9298c00004ad2307860856ac486188203ce5a0ab41ce81b6dc7c88acf34b60d399c203812fec82c40506d808348104dc2a61e28d0006c5f59f8200000342ff4a0208c02103d2b1ccecaf64744e948c23aec8b090387312deb5ba2940a052d3da9d70c911847d06b705e660c36b0ff95ab317130401af0d1d74e04411183ea0609018e0000ccc39c5bc835582410c810103d16958c4ce44e85897920ed038585dac08244616d0a879d030d8a036c6da44102c1e59f6130000895440044004ffe3b49cc804260100000db10004312000bd2471c4638c231c5118e208c70c37c6ae7598d42838a44c00676d66a7054799af750d9d4c3a0e30eda3687641511e3079750b174b3c3c40442634873c44482106b8483007901062c59553cbab798000082efd4d2a8004097ad2480cc121e72d05a20b940db6e5b09d079a5b027a16901c097bb97a202836c31e3d08269c39ecfc680036337d381000000b7a0802140e11804207a563bbc6e84f689d291c7964723d2070e6239e92dbea8140a596be761e522308f900ec5395c186cee8bf6fba462608035e1a3ae9c08822303a20531271c0001998738b790001aac12306408081ec085cd0ec227642885427e81c52b09d31020508352e157489023962916f061c7715564309800066ff300220046feb615e0012818260140000e090004462000c10400226c8008be9b2a26ae560de87120a70a91581309fcb29c197c1648f7983b3624b14c974bf4430602c7caaeab102c07e772464851400279d53560400100c082c290200000f29a2512d863a51a401942d1812c8b69b941e) <<< 16000) + 0x8510571fb03bc71000debfe912006c45429520003687fec00000013981180400006088e108c7042603c03927b0ce3eeed10248035e5cd14814a1d494b9eb9c42247385b3959e2ec90c829d5073e1828110319058c6780010001dcd6500080047053b7bd21fbe832017016000080884e02e0727d02f7b487277682c604f70dd0b91919282468105a56d8ff2579020655543c343e354b582020a5bac79e2e78af8142008e7eb13c0057701c00c54c512c21c9fc01800219bf00c248cf800000100545d3e41ddd349305eca097982121001e0000602470027c60c6a948ba04806832850a8c9309de283c38205d56fc1833d92e61c1c5c2984aca8da2b04e14402e0bf082590ba811c14a5c158f027a5e13100049bf1b0c6df14e10c018d2804594f4087e00001000ed160267d2dcaee555adec57690a0800f8000305237e53157218ab0ac6f4062aa03a1d5bc53347c4d2062d4e957e7cddba96f57f123db58c6df4548dba3b576dd65b731f03c122301b0cce9fffbf1454b1632cac94dcb9c2353848278e40511d3c17721f063be4a0576f4f9f70300eae765e645fc5e789708e80e3bda5ab31a000288ada7ad1ae8b2b1f4c98e8204add8be9b0c3214a3ff0f495a0d82729bb16c59c4fb53a365cef67927ce3c6eb7ec6346a04938a9916350c1de1404817d92bc29a50ea709d414d643f38e247c482d9217c7c349f1228d26a6dac3964e1e08007a24ee08b21dc4c02801e150270663386a000010101fd539958f4edd0a7c3fba331a4ae54e855c290f17264c4108000015a9c1d3f166f591cd0849560185258324bcf26fefcbf7cf6ef6247f3612b4a967a356516320aaffb5d6256579a6c893158c87050c1463249f4329f01b29a20d9a6ee305e4938266ac1ec04007811d8124abaef47a9f54b9d515377564701ef84e789800044443c89a1d818644cb9cb6d977aac6c9ac81e4323882f3695e597d1d789b536f466b0d5ffff29aacc18f3d106669c8540db0d092121ace103ba4703bfe7496d4210ff9cb56d366c0d40c0afe504971d4960e657004702ee518c8996c4a8c1cf19868bdd90623e8a1dc249b7156ec0948c91ed9b8cd6a87f0d5c07047744fcd065a48ee050065f8a5cee36609b820062cd809b7285fc64000403196b1abc4dd25b853d33741057fd31398559dfad5b2c98800f80002ac200119642c0c606053c14c218abb0e6841906d48b36000000000000000000000000056312d51084d8391b5b82ab52cdb4a0bd02281c791f8f2f71ec3289639031621220618a09601000000a0a2ab84c01006d8c886160e254421fcd20603e53ba71ecb72762a6cf00e0440d34beb850dfb70d955d31684e7d6f43f2236665d3e098c40854feba1486e0a4fdf5ca51c6ba849b217c59008e4395428227a7d11410163e56f8eb04e051a02a6b9ef09d724d924300775835b84d1c2062b587964c0c3c053c756e1effb9a5c0002820a89a8817e5ebbed0264fd19a6733b9a9363df329834dd1cc84ecc37cb403b29f4f07893bea3c66d7747454cb424c0002a610b4410df1e82f864000fde46f5143788a0018cc203a03c14c218abb0e6841906d48b36000000000000000000000000056312d51084d8391b5b82ab52cdb4a0bd02281c791f8f2f71ec3288e29018e19010810411400e00000a28aae1200401b82984315761cd08320da9166c0000000000000000000000000ac625aa2109b07236b70556a59b69417a045038f23f1e5ee3d865a605068ea8802f033ad6aa1140b32851c51c310208214000014415835769748e6c688ea2165506419a57d16d0c2b2ad74bddd12945679589656d9a9b4eef3ecb305f1bd1eab5be650dc4b90832172e4baae4bdd329e1a21f7845d629200c922e7c50004a9382984315761cd08320da9166c0000000000000000000000000ac625aa2109b07236b70556a59b69417a045038f23f1e5ee3d86511c52042832031c30822011c0000145155c240080370530862aec39a10641b522cd8000000000000000000000000158c4b54421360e46d6e0aad4b36d282f408a071e47e3cbdc7b0cb4c0a0d1d51005e0675ad5422816650a38a3861044022800002882b7e432940096c07d99990d19e8d9433de126cc72d431f2b92ea3b20bc76b8a4b8773c66c49e881b9f7367d49538f63b1c1b21a0618c39db2bac1500e65983c533bb0c92267ad0004a22000e0846ed043747a1b93d0dc1e8228a436e3a089050db028003b4885f1af84bcc9973ed0da082c205b990afdc4017f940102d5c13d034f7a8bf00002200019badb21a1f3a90a06a16acccadfae8b100a2c91993aae87c411aa0d3fcf6061b5f4075a74ebd279e23b03c007cd3d9f8f5d749d6c26488de1001f00005ba6878fe3c2a77650c21380db75ffd8c088f83192e1f830486814ce0286300178658fa7981403ef5c22ff598804fc3e0e0cad8011000398db6974544dc4b86e3e88ca9ce0b40a036a721b4390d99c86c8e43626a1b0250d79086b864000321ad190d60c86ac543542a1a9150d40a869c5434c02000392234aba03e550d220c68cd63441b1a1050d000a06b43d0e604e18e151586e54af8060ad83a5b8c7122844246dee963e2010894ec8c5819001f5f12a400ec70137da41ddd4628023ffcf2d4510010511451047ed0ba8b0f529a170b40b11ce4e6fc4c61ec83f8b1640131ce4e6fc4c61ec83f8b164014904ee5136b3c17514b2fd6b918ca279a61669261250208268040180001006f9a135fd748a61656ca309c86951ae03c608693fb422818a6120a5b467c40820)) <<< 16000) + 0x990387404800602a974d3801200400005c48cf82c6781633a0b19c058c682c66c071ce4e6fc4c61ec83f8b1640131ce4e6fc4c61ec83f8b164014904ee5136b3c17514b2fd6b918ca281c69871469458208270048180001006c0e25c7dd22138b807ce390b38af75002a4834a0c37947e23020eedca2e02c103eefff0f041350d30c4c280036f2dc57a000900200003444668163320b198058cb82c6581703987e6c689bd38a4cf3bb831c4d285ad7586678182037479c5d488044f52a04b1e041186d89214e0e020a01637cda240000aba94a6000b50285403881c65a5fa59681a11bb84e44716ec50c4466715cb4aa8bb46944f8cde0d240235f3cc5720823700357fc50008e090c9a005028480100001ac20007504001e9ce967d65f78bdfc9643a3a7910cae060e010a4358835163fa9563ec38ae50e3ce52cb3241120002c36cb1c542801d73398b6ff80087d07202e02c0000e811950584e00c650078515efb0c3d064287315f6d49cfe250d01a9161fb91c918140881d72638c2007685ac06a62000157f7468d421800c849a782720004510111622017c140e39817818000083c8c986c1242764e0e8e49c00a1230a21f9f2a839428012c684228122c72c594c34a900aaf3eb6f7b006088b3e30b5ac0800ab87449c940008a221395d6779f11a473c2c0240000fd1192258c88ae4436bd7de0836b081260f0a4dd599a1c40d20b125e1fa0a0c0d497556e1861c14134e1cb34ab0a01023dc51b288e0010510020b3b810a60904c885b47d35e1cfb8c906407800022a21444b0a12584f00e4738f216ea31db1022dc0710568391175ce47c82c61c3a6815371632cd628fe840810e8aabe7c246b3f1c2400430f80a0d28184b6f020010b8aa7f1467ef510b0010511001cdb072df70e167fe08026941bf7d432c2504e0000b00800bd31190498c79ee5ca2cdd52da9c8adc47df9bd07824000000001be49c39822eae6d828e0c953d608c8a2091081090c80c7014f3bd43460fc940dda43f24876ca833fc675596c5bbb1cb28edd47df3c6c17fe8a7eef3c4c9acc214844d18901d9244df7619d4d4a1c789af80ad111231eeff715364528558b2bbee45fe48930aeb127cb68304912db78cd1512023fbdb35b74100006af96a34abcfd08042f02c0c700c08007a9e64807a2332a900d9851eab49079392f046b59d8a6cb9c24219354020a91851649641439631428808203804010068c680f0a814837924e194e96481c21c78d2eafecb21449d062fdacfca38e002ce2de29f5462c68cc530cb2301f0142a4a54db412bf55c40523cd2e9efa80ae400002ba7e06136004f42404041c82a0000980800205103b05000334118c118c584c62817be49c39822eae6d828e0c953d608c491c91081090c5047003012dfa5d0db7900023c91b15ba484438e03c85ce9a64ab8c2f88946241767c42025b5c7addfc91eb9b80ecf6618f0112b62852e99c2d1b28fbb828461459258c50c50a38610200060100401a30c0b14d01e96adc26b1976cc2a613dcbade91849dfbdc55899208005e1698f2060f4c3031d1688b1b53c5d6f027102067208665bd2410081e2251c0103a690180c3f810004c3f1b4f01914085604018805e96ae4f301b884c2a600e7befdb1849e121a2e5a7208006b3a0cb2060f4c7e4657b68b1b52ed9e19c51020668bdf53e7081d497a43fdb40017d784c82322020ac08000041c40012348c382f0a4db6b7efaa1d4b25d94230960f852c829d22e31496ecb1a1244b9f0cbbe285a3a023fd16c4470c2024d1470cb204099e52c02849c0000216df13075aa27104021901e06181629a0bd4f32403d119954806cc28f55a483c9c978235acec5365ce1210c9aa010548d2cd28d20c20c1c9142042030000200d18501e979e6434a5c434a17f40ea1e91248044a28ea80d2264e5afb37e611331dfa827330747d0caa0f712290702d235d42051d1dd9741c5000044aa224030904290180001021d4f32403d119954806cc28f55a483c9c978235acec5365ce1210c9aa010548d2cd28d20c20c1c9143002030000200d18501e96beaded18fcc92402363d18ea1a4435fd223a0b308ae80b85d84660eb200a39cafcb18e9e6d00a2712295844135cac1821df8fee5bea5000046cf73520c69042b02000010c10003c02000f0e42843400140240ec3400211841c4860024d840bca5be49c39822eae6d828e0c953d608c491c80c70c808708404600100470200200d02501d11843759b2a3491ad72f6db9cd1225d3038418b62040fccd3f93684070131fef52485080510e68b2c0403a124aee7400000ab2905b300644021581006100630603b24ec19ca60304a22c60c46ea0b8a1c09a02e6e238a156d5eefeb474915341b6a385d49100de6fde9a2060c741c7a1889410005444528cf322000b008004003b24c3b032f4760a22d61be643700a1552ab4fb70549156250682a0a8a10028b9317840910011e1a3834060c6cca7d996647000047868e580c88042c0200000f491820900020a9024050003281181158c00885fc242fc0a17d010003f5117c2d0bd9685e8b42f25a178250bb9085d8542ea2a1740d0b98685c8242e212170010b78080095308b72ec5b5662d8b316b5985f26c5a9062d2531681185088c59c462cc1b81072b01272fac2887c4535742e0103205dfda4ac010050b8a1aa3f48700ca08b2ec0e62806e1d63c3d4f0802a826df24f90020020a088816e7e497f9ba5103345d7460eb481a1e15b25b6add4f205a058a0874932c7aaa3ed6c7dee09368c789)) <<< 16000) + 0x093eba7e2b6ad41da3607519fdbcfecb5175244f67ec7d6b0033cab5a2cd95c85cc91b3b08a0621933d70f2d937439b16befbb28bcb0627b638857443195dd87a2300f91b44ad7a345244b5c970aa8dd134b8121eaa0df8dfd0000115510de8bf48b6b94d51ce50fcae2b749fbf0297fdc39686977befc49d7d82efef5350a6f9f331548f46b4dab4a63a698e97dbc059c530e0a44b957c9219ae1a5be35e96e89f57a056fddf13f2f81675863011208015f228ab492d7e75d2f078fc318a50916617616b3b14d9738484326a80415244d66301244d66300e5a7dcf0d0969f73c330951df716f70843c2aa111df716f70843c2aa0e09729b30406afcd47104b94d9820357e6a344832842821c22813401800000545587fc86bb4fc9a97a1d1e34de72eec634d736713f72c92d08abfc1fb7d566f1bead6dc6685b8431f53e4dc0ae9b18a7bf54ba719237df9d9164ba85bac5f316542847463228d1fb400132c818988594a62c82b8a11fd219664497808a0c51c48ed498f60815c8c8f5247025eee187d5000f8a0ef51e038b977bc827082100844a2f6ae79dd127928435f938904ccfade8920b0b4706c09020880200001bc6079f2c4064cd28057498e4811ce8538e034846030aef080426ea15200943084020000212458c462c413f1fbf673c7460e688bfa571c6268b03ed0c1a582eafb08009d3370b800128c1080400004388b08ec580762be03b201dd1c0d1386ae3e322f0b18808e09c4142092cd0214700746d07300001194a0880200002366870d8eba4594090fce049991720cf5a5c8aee1608f0a8cbb35ce353922cb18b98345c2037e1ad7ccc4006c0947498be34e052c6e73939d32ff6e3cafb2af53e596e28528737098e9bcd80cb7b9fec425b14928a4ef460e2a11a8b04ad4b9260b4b2f80409b6542d8e2855487334a635b24242c62a71b92fb65f81e68fcafbb2d21bfa6f000002fd539549f03839baf3371a63374474109de2f6b219bbcaf166ccea93218561265ba26340a4a92d495a0f0709b6dbc02e25699f62edd146514207090b3f0dc0000c5a719fb143558cfd8a1a94eebb9de9ceebb9dea02544f3145723e31c98fbaad0556287b6d8ce0d8693fb706c349fe58a1edb62c2557c1e4bca18603bab7b705b2a703f7a13e3aa20cf6384e56909420b436d1e210fedad89f2ade5165105b5b13e55bca2ca1f8f1a3151739d46ed51e3462a2e73a8dda44352463042442c0000133575853cdb9d92e9f91855eba3a3b21ffd9fad14c2d82f42819d113c39cef491d73dfbf6a20c18e837011d90198ad28cdec40037c6765d66ca3da08a0b847dc3dffe3691cd8c7a71c9acf774b5872fa775cc125da35ae1254ac70d9c37cf10afd75862879e977ed477c72d4002349d1b5f4850c751baa000f624578d60786b15d0984e02ecf88404b4466552027ed96c0a57d65700044f02c0b4e4ca05a2798a2b91f18e4c7dd5682a658a70658640650028000000a2354857a813ce8b89a2a84b839ed566495acf5bbf569981bda7eaa584521d5576ac358439912707da00059a4570762b61389e628ae47c63931f755a0adb5b13e55bca2ca20b6b627cab7945943f1e3462a2e73a8ddaa3c68c545ce751bb488645085043843002001800000088c835fea837c5b9bc5d8d940d650f1dda676b8176b6b682087e711169639d7eb9e446831aae25b770044b2e9a1486faa23f2daf1ed29185c31af2c0a6b7285cb124d51be340f2e674c0a9b36ca1a058500045820038664569262b28b089458ac1ec55ca62ac3315501c89166be35290b2257c3c424103e008154014ca96a733aeac011b6522311004e2a970046084201098d20f693196104ebdef6103c0c73de11820f004000028882f84c0005f48a988c5482720c1df4a36a20006642a81a022048d2a00118a100042656f72aad92630b64c907ac0203a1b77a200c679e69848104001098d45d4a7cc609e3f025c044103e01000007c20e21b05f0d8000cb9000261330d7a703aa201ccf5ef491c0469e494a0004c707c0100001604544872082e1d28bc7854cd543ea3800419fddb0c01600cd3ac40018728bae00004a484201000011522a032e06c49c11c65002170084d080634add260000091961080400002f88a794e04002008816addcb10022283a00880a517e06aa20543d85ce34001e4e132011880f80428218732a30c1f14800d804840740100000f240004f88a70ac0bc140003a644e845e1104c925c35b179d2676bb874cca4626c6c4ce1044482cc5d0af0795edc530218588d3359d022ef594158d520f037b222ffee5f1f3499498049d24e250304411e11372ad461fd74e4a072d3ba214204ba69da56efa2c3473fcec933d103eae5e498e1c816202ea78d5c3068c863b1314507ba37d34a47568f70ff00000c904db06c9d52abfc62247a00822409f432cb1944f75d67efe74dc932889113fcbfbad5f65d9e79fd692ebe64a64ce804c5702182de1b2428eb3300002e310be2d8a68e80020c08391cc4fc27420282134410084e5f8b707040d3981648006c1bb9e53408ec1b11a0801112b8fac00049890840210180100468194685000044507001101401004000011100008f3e00a7898603009bd1d85e00044383e0100000853e0623b83cb00022383e00814c0180003710001f522962a14a150388a85245429022147110001e7114645899a2c514661380bd0d20fd799850eb9145394c08fa7ee280309f1a64f511026902603c0012520200084864455b3483868876db8a286c2217f426056bbea31e1851)) <<< 16000) + 0x2469ed40001290100040000434d8274219b5aa003e4b23f66780135820fd8800107883620812e5a196b800212921100400004648a214c50ca60e453142218a090c5004627e1bd0cc64cba949094894e40480b36b13a5910390f4c3c47007af9087c000025282000860c0e05a282142d09631e00c080400eb011007193eb660120810804305fddc591c508426c1b50048407c0100000fa40c05624a1b806122d71b2343051b3368081b0369f8f84062699d910900a3595b5f2c01628246e000130e1080400004f889f0aa431695badd0409710ce09c203e357da6a00046384201013d0109e00c000380800204113b2d89d0884e437014d0d1c3251068a09ad0050202d0cc3a4405415278100000485042010e237dfa691280333a0bed534133b7bca30e0e53f62b58000424282100800007490872109c1082041600045844dc7426c220007e4226a4a0671d0328a80030e889a1ac15427426308860fe0a65eadf336b1eead66d5ff558743414fbb9c351fe3002e8cf1e928ced5539b2cb86284f0ce597ed937665f9ca9ae2b88006f54fc75fac200e67b3dc937e6dff69b2d9eb302cd2e9215921806b6bf16dba81a1102922e16fd556d480dd132854afb1bff91e8000080880004828a03fa05c83b1b27e1dcec918bbbe7a04a1707f57f3463294642e8e35e5f037c0e46c7c275d13bb9ce25a5a4f6a60d66e4707aa48dce2fdade7c4fb494b03d5f9a419514aa09918328a90000bc8421d560605380f259bfa10aa0f1994a53f48bbff90e07fe562e267dbb60a690b6483848ac19c3a3e0a9fbd4ded268de664c02dff44ae3aa7b1980600af4ed5f0c010d18d98be099b8760a73473d39c84de4acda0da95e41df8689274108cc2de8542790ec88f5593eecaf66282e5fa72404281b42d6761185b5a44afe301f3621543c0be1d99c3eff1241adcdd014bb8b786f68e668b10e983d91e7073cdc21c20ddb39c580001b7f5ba17e3895daf02c08b0fcc58c768a196b375ef66cec44eefdf65943669b4d9f2e1baa32d34a76d159c9d539ee5fd9313f820c994391a84836ee49c721e57e7cc76039a02985c075f9820a47817e53b3ad3af0b82a494e1f5067e19072ca4177881b465b3abf890d2f3f0514187f6431a4a2410a2c7f188000011961080400002f889998c4c8c62624309c05d14545db8e50e11466dde3610588b2f3e61401422027942802134390d0800366752680008804c6844010130090328484bc0400031c44b917427167382af6d9c109fb663365211fd43170b38e39601e7560ac1ffce630257a92777c651fe94a08523609e21fa802e6bf7ef6bd1555d3c04fb60c0181846e721013fe8d92259659966bafb167293de9bd8bbc62dbad89a00022084ac96948b6967d440a57fc2a0ae9ed834c06de14899d3d9e57d24e7124f4aa2464b603904fd48eb689581ae81279dc2ca46a21074691bc5f000049d20f46212d310961884aca4102520821185f0884a83600212e42241400700444a4074a4334908aa03fd833c08150a8a8ceadb2f7d5d06fb8714c92e256bab910e2ff1c4b5c4fe60000000000000000011018403244d66301244d66300e5a7dcf0d0969f73c330950718704700400300000011104073c120daa9791c9762f60bd77738972c6ba45e3a416ad774da3e94f9ddd681dda9fdd28827617f56c2b76728fb2aef28941f8bdd831ae311cb19fa462cbaf710f0f7c9abe889e9400133c8511cc284e613c0bc0307601c38ad4e1cca848940c1d9a353c68c2d04c89ab49d93200687620756bd0acb42949261af546546b84508aacc9a2f785b27a0050250fdb63db7567ced5d5faccfa4d66eb9a9c4200d72728480847e0b7777df1e2fbbaf3972de834dba50bd44633bacf679eb1a1da0020180cc60075bd47442ac9a1f4faf4f312dd5d1007ab5ba1d3e9ff6ed87620350333246e840ea7a83a86f3b47f9d4a3a8319f925958000000404042bb09b7296f3b8e3713be26b2b10ea2b1fa63a682d2ce4bbbb6faa92b462e5e80a472cb4d2acc1267433dc93f438a7fb26590e5288813f7b45c2c86e0f00ca32cb8707fb7683f2da346488d8601f2ff5b763c9c3c958a7498bff8fa0530f9a4f6d167b62830cd3e567ee3900dd58c98ec7cf6e1498010230df82eb029a8079d1e2e1c0d7f3b0b334da4ab182966ed57713091b66ab5c3436212d6b6c00df69586165d26c0ba98b1d0a7c1b5a50d0516e24b1860eb18f8d1200adfd29bc800a4f58bf8000000004c88420109698dcd83c6a80e07647102a4f16c6d322ad703a934eb09f800d8836412e201f000000000bfbb51824f0a6d556dc4c0c95044d46484fa3cfda02f6f9c0aa931fa16df29bd3ea391614831cac000000000000000000229dc46c38a1ee4d248a75b0e73a06e88b04e96e85837f073ef7180000000000000000008a0c201a1932a19cb7fd2156601cce3125e6bfe90ab2f84cc61858e50000015d88611aeed015504cfcb8a908fdc1b54711c0729f17dcf321790f69906804bc006cc21cf501beed21f342ef5b9b5f42072b6b57acc34733179f71150e930d7f4bc59370c4012a10c1d2dd5c9317e21d8564cb9005e9ef2acfd03ee0003df5b56e2232f85626648e2ab7b49850d89ccfebcf11489fb10f1a0c4d1e744b7fe58525baa45c3a3bee33362683689406e030020081270184100849805a0d77b9c1e520226ea2cfe000443842010804d01f5c989c10d222ef8e9010930e46e0a03fea5c4c400120c11004201802008b2c223fbd78f0df9a5ac9d4015ac8679ce022882be8009030800)) <<< 16000) + 0x200001ae4494460621b00013e200047e4490640005f040c0542462a1221109088c000f208900e847c54001a7e4479260be9311d3d88e18c46ca42344b1191d88984e814d2eb21502df79b2ab4795cff5bcc2a8518298dfea00eeabc69aff58eb45108ab25777094ce935651c84ab02f009e3455d2200cd415463defb16431a941a0418069e58fae3f01af17c069f81538b2c4bc3689499e2e0a2b44d8a720ac86ac75ac55468e63763abaedcd67270a2d21ebb24a585d4de14f546004835d947a5cc100001011b9d0b91fcae7b4d79523278a88ccdb7494fb40f899d29f1091972890420b6a8ae54807648863bc2f7dda550bc0d92eef3528d77e9096308a777efe49f96d7fc0d64b7868d5b020747b96b33625cf74bf68687439149a4f87a17dd851bd462d77ffcd08f122973185e8f941672b2e152afd4502888d6197e8e1c1c50937e5d9163f170d1c53d77e5cd473f0289ed80d774491a2240e8c9ffb2dba12c197acaa3c8729882dcb88de408b80d0274eaed2a5aaef360062739b106476566b1ce940f2db2603a604282a61b6f6e9ba8e7c0290144af1b7a8944962e99bfd938eb5018aa5caa8b9f103a7e54154636b56185bc84da0165afbb4ba6d4303e100900c937503a379ddbfe7c9065eb0e12a1456198008627e174ab95f36a43f4c759d5a316660f79f209c72a3ceaf0764442e7077fc7ed29908e59492befe50780002022a866a054df60ccc127467aa2b81c6dbd39bfef1c6f325d46bf44aa047986f0a2765144c3a8f408fd24792aa655bf4a220c9a2232a62e4501ec0c9a946101bad02de612df3ccfa71eb0a605ba566d648e67676c239cdb443c29355486263b8284421a8103e286048991edae0c41456dd896e5793966f2551a6f4394000274c818a08460b422e4a1161508a8484500400251a41e9760e263a1c36f896f73051a02b32445150ca38898301ee3c61714004190908802022603e0336cfc50b19169325f943a584876bc577b4aa3ef97abae0a4a344f6270e1878c869d8cc0a152b9e0a064a082b63ea2210335cc41629ec6a519321201fa04985baca840c2a3fd0c932ae4973042bd64580ff60a7fb317054ca5c6411a197e7a5052b7006d0fe47b9f17f3bfb547ebdcc27d6f3e59cbc1c02e17f3f85d70346d1191cea41ae8361832828224d413d9418c0cc75fa3ad2526979ad91c2cc0890f43a8b54626467c4f6b1598e93fe3161a1d280000097f0e1fa567605160ae77363c6f8d928d427d4747f0be0aeacdca1fae9bb1bea0d8f2cecba61c27b726693d1bb3921ed90d533105a4f7538081f79b9608cc92b48cd94574b1c6b7b8a94f71d3b4ebf87ed68445294d087c14a742c76253ee652da6c12c9805a74f29a43377f5604514d76a96d749fc40fcf011f8c1a6fddcef680507e247bbe43d4812ce1d64ea4080c1d7883184af9008c84825c2689fc55fc80f43e70bb821f262520ca73db100016264448842223a024190880c80c06421e2a10e150410a8434542181a10b0d8850484242404a130be0908404841c1420c0a000da821020a002ffd3c3473bb0bb91686aa4d21f735484e592626abe4647e30a80618ab6bce3a03415ac880f658445404ef40885878c0e27b06011f6ec9105fcea384eb30aa50fe1eb986971551422e91c00000000011e9ff5b93419fadb4d73aeb3ac5b8bb0b75a4af77dee023a4a6945e6ece6e0e3dac034624adb962e45fe0a6abd100200e5579e0b4ce5945f88009dad71f65efb83113aac88a0dbdb0ef9542cd6430ec77a047f9f870b6797d90e02d4940000aa84414174433abbec700b567b156edd795dbb9b9e4d0b0ffe843e13eee78bd144a223f14c00000000000000000114f3689fb855e698fc406bcd3cd56e1071b52f8fd1c8cf97769c0000000000000000043120e46fa38b02d696b55163986d5f22a6141552461822011000000040411011401c8aa60689832a365824fa7c9dad6d0fd11224de32c86befd0d8cba28d30df620901e3b36afb9aa933d1d7ea2247a45c6e5e94f214d69078e38166bf57cf1f0ed6a013bab899d73bad399069b865986f1d8856e8d2e7146ee4e912e2a950006592008c9e402b188ec0fc308d5cbceae7bbb68afdb1f60b30afc9143b1c2ef734d9f00000000000000000023189c222bf5a8dcc97516aa7500926062c93a7dfd4de45e37ba8900000000000000000008c0f0532c675e7377be228c0808205024eac2a042e96d42ad882000000000000000002198c29010e10610c0000829c1ea3951d4f70dcc7d58be830d29455e0ead302c20dd37ef7d582e30fe2bf7a0055f006c075f153d2ef211e1e2b5dd99d06b7a921be08009bd7883f318ec164383d5d74037856a2a66cb403640ea693a793a7f63138b949cfd7a562fb47134c83c8c22b1b87fc200160aa8b62c9d0304561997c12f242449330aaecc512b15b662214219d25962c8007b42e39d100754df7b2c59830880216780402d62a1ea482d8e15c6244133b0daba3c4ecb26bc20dc57c000000000000000000473607e1846ae5e7573dddb457ed8fb059857e48a1d8e177b9a6cf800000000000000000118c4e1115fad46e64ba8b553a80493031649d3efea6f22f1bdd44800000000000000000046078299633af39bbdf114604041028127561502174b6a156c410000000000000000010d0a20510a00703d0901d3a040c80540bc24000a106891e1d74eba742b557a7e7e6ce0d839d5148186a43908f9a150ed1e0221983ca22f46e0ae5e31ac021deb3831ddac49bfc17659007f8a113539d648ac93)) <<< 16000) + 0xd5f87522080be7556a5eb24b2ef309bac76bac07eea5f4dc2f1b0838730c297277ca776be2ed4dbf934e99cc9a32e20107426ace6670a55b302c00b9341302f0cf69d557598dd5a26e1e7c1f91b7e23ccadacdd8553c96504d19aa040e71ef57c5f8672a700211f173c47a58bd79e28a4b3dfcb6bbff511cddf196a6b4c6b00ab0f63a49d1b46d8bc358ee02e7530a13dfeb1418234dd9f62c44ec7c44f4360492646862ea4aa493ef7a1951ae495b76a7ad98b2ae7566b2e7d588016d028826e6bd4ca6bee6f6a89c2668c3699851c74656c2648918459d3faa18598c1328f460cfc427d04181350edcb9890208cbc66014054904e99467082200859e0100b58a87a920b63857189104cec36ae8f13b2c9af083715f00000000000000000011cd81f8611ab979d5cf776d15fb63ec16615f922876385dee69b3e0000000000000000004631384457eb51b992ea2d54ea0124c0c59274fbfa9bc8bc6f7512000000000000000000118cb24920614b04807d0901d6a0832015104050001fe100057d2001bfa440c46204231011181788c400461fe1b0fe0d07e84c3f0241f60a0fa0587c8283e016002b0c43b4175c3eb48a420040f4b5da83ff72bdc893afb56eca32c40d652933000000000000000000047567b156edd795dbb9b9e4d0b0ffe843e13eee78bd144a223f14c000000000000000001148714510704604304500200b820080343dc141ec0a0f50507a0283cc141e40a0f1050780283bc141dc0a0ed0507602c3ac141d40b0e90507402839c141cc0a0e50180022710e451071a88389441c29a0e03906f988378a40584a0dd2506e0c836c641b4320d91906c0c835c041ac020022a3201a3864044990e33f6286ab19fb143529dd773bd39dd773bd404bad8ad6e8ed9b4e30d589e6ae3e87bd706953fd1f094154efa0d00000000000000000000000000000000000000000000000000003391218c18610608c00a0000250d8f878ca15f8a0b9296c736892e1fc6fff360bf01a36174af3248e85b97de0129269322778d128a5c737e2f6e8b059928beb778ec933f1d5aa81045f31acacd17c8884c87bce51d4fd8992b5fd148c8459c34853d37defa9daba31805c938dff9e00538077a05fe6a164f156142af68aa930e46493846ed3ea1e91cd40174a8eb7e66eea79f97b582581ce79006ab7e31d225ea9c588650000000000000000000000000000000000000000000000000000333d61d298f3afacfc8d57928fb9bc239bf90e7608743d0e08dc00000000000000000000000000000000000000000000000000c66486206304184302182000880998ffc769ad0719427aaafe1544160168528b08ea2565d2444ba6886529629c848accb00190bee0bbfdd9bc382114647c93aeac39474e3ae75fa241923d8d9a000b9c4339360609b0d53d86a18c32c978cfd8a1aac67ec50d4a775dcef4e775dcef501289249229218c18c00a00200000aa854c02b4406709d33b7056e4df48a85de215279321cf8f3d2e23deb4821641ec4005491d2ba9145d41b44fb21e409e9e5480db33a3dc830682bfe68314258a3909e8610dbc59b54205fe5b7174000288082132810804000055c869a4c0bd261a45200041921a2bb0d05986782e03847b401ec60c0faad33e14102116de3c3041fb9e50c08154ec3869c00110010aa21100221958983e14a0059493e0ebc9963e0ebc998238656260f8528016524000000000f83af26508c880c60c3042048004000011ab050f134c61fc33b27f64d6fba4660e0042ce68c67ec887e10d00025a219c93030498179c8334e4198620cb21fdb21a58095f1d0df81ff668b84b75aff2e4e45563fa4fac0000000000000000000000004566a4a8167a38b89425a6bd0c10cac4c1f0a5002ca49f075e4cb1f075e4cc11ce2a2e8155601744a77a594a405c32b1307c0000000000a5002ca48f83af265848a488388384202000088014086af5a5ecdd61dd3188f2076a775bdf2c3fd93303186f2e848d361daec1b538ba5b9200e15d95ae1411fc434547af90e34cfd34a472e0d42e380cc21a9ec641564890b12bedc5e371c305e8f39f28300dbd5bc395f006f83d1c1b1f270a24c3acf61958983e14a0059493e0ebc9963e0ebc99823c0ceb5aa84502e1958983e14a0059490000000003e0ebc9942332872852052c21422000004573f5e2aefff8e3436eba4257e8e5a618f82aa60bd8851321d962a9db12ac60b4924657638941f2e180ae6c7d050ab0e74405205518b30588a14c1490de4308355f2f54102251b78d7040054098e08402000029443183418a120c40100024f90ca45864a0c0a10742002dc6c00488ca74a86b0e2112aa06884875cd8b009120bb6f259a82802a1be7008800088800932a1100426b4bc7eb09856fdf07e1bf4a4b407695deab9ad1d4877a960000000000000000000000004566a4a8167a38b89425a6bd0c3ad8ad6e8ed9b4e30d589e6ae3e87bd706953fd1f094154efa0d0000000000000000000000000000000000000000000000000000339143942942120100080008cbf4c673b947bf015a272dc2341de98bb71e080b40d349e1965a1c58dc7689b60945248edc31f0d5f2874714630c57c8139becc48dd7b4d6a308c9ce1b347c0c24c3552646b5400eb83963d61d8ee669ff32484124719e9b065fa73057026bb24477e3b539ba8dbcf6598f481ef8f62f12cd702cf17fc485031446d1b877056920341fb01453bcfe861d42cca37dc7adf9981d503acb136b54b403a4bb72aa8b58c85c180165a0bc000b19c)) <<< 16000) + 0x188b43f14091862fa0df2ff4b163383f2bae70b0dc1fcc2dd340700815a071c8b44000440fa0c7858058c24280401a91839843f6005306b7f6a7130680ce5372e3cb00016e3600080008030dda9b2094e08c021ad8ad6e8ed9b4e30d589e6ae3e87bd706953fd1f094154efa0d000000000000000000000000000000000000000000000000000033c32b1307c29400b2920000000007c1d7932846471069059058c68a4803802000225cd00401b35a5e3f584c2b7ef83f0dfa525a03b4aef55cd68ea43bd4b00000000000000000000000022b352540b3d1c5c4a12d35e86113893883861413c0340300100012ef561b57301b006cd6978fd6130adfbe0fc37e949680ed2bbd5735a3a90ef52c0000000000000000000000008acd49502cf47171284b4d7a1875b15add1db369c61ab13cd5c7d0f7ae0d2a7fa3e1282a9df41a00000000000000000000000000000000000000000000000000006723cc40a3ca34a3c93c034010000b9400803432017e58589aaca4b04f40a000604564b40e7956ccf605f4b400f24c1de2d8d2c91a0400942e60da94a28000353461fa37e000011d749751e8000b3ba98b0cc1200003e8400179480041d1000b252001916431c34001ca643183418a120c401000ba590018c521864a00247b2184620c11d06004800a3c085fbac2f9d617a520020161423f4b8a2181826e257a880088fb6b931802cd704410000284044008e30c5d48c1a4886684f7cf0e221ba54b38385034eb51184082a10e5ce480644aa0f30e03e242dc1a4e0844010e3094e3a8c0712c73a5e64385f2555182100bf93d6e4920210804000035885e0282ec141740a0ad0505c8282ac140005a642e09616e4b0b62585a90c2d0861663b0b21181788c2c426160120af09e142d63a63b1410bc65ad00307e95dc8c520033a4ac1d86011188fc4504001d53dbdc001004026402200805702f063d3ecce2141172af7cd860e5bad9a343014875a6a408080050d08401015a2a0ac0d0558682a80400028242a4c4150520002ef214eab0a60585280e03d4ef603d288963858e107b2edea6cec9f412c32b1307c29400b2927c1d7932c7c1d79330470cac4c1f0a5002ca48000000001f075e4ca11cac4e9503a4a40d7094a884aa37eddc6fbe249d806fd59376d8efd9698709174c68848efb8b7b8421e155088efb8b7b8421e1550704b94d9820357e6a38825ca6cc101abf351a2428a0880860020000002820094e23dd4fa272aca4fa3fcc9ac978fdd726c92ce9585bc26e9bee95db659f62d3996993713feb16dcc3b5ee7a448bd5549a58910e9c6275d96e66b789b47ddb0e5a2cd1b03cf4cd228f6e5ca09984cd38d41b5952e87c8c20390ca5a98d5fafeb85ea652fe35cd705381e2910fbd205ac4e50f917765baa0820a00082e2148cb0a34505114c284a61403a09f1984f02e042fb328070a2251ce4f4890a2a9382de4044367a66f1424101f3710e028b38e6340000126302100804e82827017a303285552a48a159b147e8c29fd3956344863ed59ef31605a7005f7648024b48fcb9000622be678000084e5844010a181e6e724e5096fd6bee21010fb0291700118a10804026c07a28de7c59d962deb2be09902c14965c01808a2f82879605b229a0a00128a100043451c285a5b8b14883beff92050dd4bec549001c4bbab3140d0da23ab80094508802000022240008cc8180881c4441341a099050001b490671903288800149c83c1ec1dcf61307b0972d84b10c2546612813c40f6c91e2afa9d855b460aafe792f090edf2f232bf182a46104086025004804002800008223ce0e0b6a656d1d5f704cacddbbbdc2f48173386dbf0ed39e348976451d545674c90c35dbf1e918303093ea28d0982c0129f0c1819b279c40010025302200804980b4920543d38d9d1cbf3511f7e2ad37024866a0f1ccac30d3f32c2da8c8c618d04042bb03168434dbf36e5924fb5fd41860c71c32cea36d34b065e01b067e8a8340b6fa654b8e2fe885a9546f7b6d0fc40000238e1cc22bb60c8e265b395ed6c0010122197eab88f45fa0901ae9600882731ff89f6a871bcd6d6d5698d1cc5300007f2424854000aba417cc41224a090210478882382411a020007fc21189b08b4984524c0c0b6112329ad2f1fac2615bf7c1f86fd292d01da577aae6b47521dea58000000000000000000000001159a92a059e8e2e250969af430cb4c6e6c1e354074b4c6e6c1e35406bf001b106c825c3bf001b106c825c4078ae1f5a452100207a5aed41ffb95ee449d7dab765196206b294998000000000000000000238d474f6f9df81689e628ae47c63931f755a0aa1932a19cb7fd2156601cce3125e6bfe90ab2f84cc60a380100000200536508a4b15bd1418f19a44744aaf5f59275ce6035d42f0e332a4b908c417b215fabaf78a79771929b0704db668142a26d0a058812352500b76714f152ae39356029b2a496b2fbfb39c98003d901ca84a87c84cb4bd8c116903ff861a4ffa7eaa39441a61c566a9aed97ac8c58701a961add08f27f9ea5a6f0837b63e0333cd837efa02a4f3f4d7be5530814228054b62a7e30d493e38ba304db98b1480c17bb64341843f745aa82c08f5d9df68603616242280004040254021008406004011408ef75d072409517f80000110c0f804000020c8440ec21c7610c3b0850d84204820c261040b0810150a26464ab8783f785fb9238225021a88701350da0420002004868400108060080201f0150100100400001110311584008c0c0460fe13803e733a1100008900)) <<< 16000) + 0xf00201f8340000de41f4a60f84b07b158000c8907a19000156100042f20ce3a079150328880016ac83c2ac1dd560c23305509e84e07bcfa8919a70d93dd8c655688aed140c376bd6768dc9dc8fbf16fc1b7ee251914eccf110142032c6d99d52b1f903fe5292d8ef5149d0acfef23c41abf003526e99acf88ccfad461657fe294034f690f5cd92658f177aad91541278cd792ab8a3ae53175d9701c92c996ce9ef2937ee4f2440004021be5e7e7cdd3c68c9628243c8187a68a393a064ff124339dec6d8f3ab11580969ecc49547168c9b03713bbf232f385aad5acd83db7968058ac7cc69e4772c4b0bbb5d4316a818cd4a509185097cb0ba3421cf7a1e1142f1bd8fa04001008cc0800200be4b0000d120ec7306009c881fa6a373e55e2e966efa74ea55e9375fc4f41e772dbe72cac6a2da6ebc48ded6ca2038dcc1e5b129797613436f3eae2f4b3bc01b5d550f60e3e512eb5ef3d4a554a542c3804ded707f06a8ec03decae2362e310ad689fe9576434c9b4291f82832bb71d5c7c0000000048d03a07d75bcf3f993cc8ea3d336346c3e40be12b8cc5c9bb53a7357e0efe702410e38a7cc6bf374f0ce88538dd1adc10fb401adcd8f77292f6a573bb3ea341083a40002b6105f3102f108174740ea2a0570d02a8281d0040a602000d4f205e8a07315000ec4982bed87956ce27ccee73b7bd890ddf7f4f8bf80fed4a4d17df71cf1043051e0a638434e99d59f1a902c6a3a7b7cefc0b21895a161f493f31db2fba985df9b4aa07c493b00dfab26edb1dfb2d30e122e98d1090608a043047006000416378451f40db161129ff8b4f4a5ac5ddb1751ff2f8fb4e210c7e8608519d3bf086ddaf3396e5467475f39a474444ed56a2f1e2c132961856c40ffcd131b1ea3b726e6f3410c4b42613786bbbae6f8ba94a4a557856902ddc90c108f8ee7a040bcbbcc7ec104295561380000b2141080400003a083916c1c4940e04b06f2503712c1b49605e4b06c1d0280c81ac440d42204c110258881a434090120470902282811014000fee41a017c0b38fc5fff8f6b1098b5517a6cd5af491ba8bac4ee0304ce0ac4a0e81939ac6a1b52541aba5c500fca2ac0deb7846aa758f12648702286f89be86a216f63728acb8d91e26747532e9edffa73144a60fb884aaa00000801d3e7fabc084bb802c774552de9f06889407852759ecb8b146c3bae46ab1acabc5481bd4823a043ab72e79e941715799853379ee21355c48393d95744e73c4d640bd99dc11310b0800c1f1792011306bf82aae93d0b7500b5e82c2d066e90765e5324082630d25ee51b2371be1dd88ab41ae62a3333677c6a5c4b3418c6c9336c2704bab5354cc54bede29612e868ee5f62411561f3e50a51f9d45e74ab50a6b8f1e28d273b881a00802019c540cc220650d0320080001d8831a4c189260c23305509c0b0040100c00b81406c6892640248583bcd2808350a2f7800003196108042020a330bd0000044a07c01142dd99d7f0140096366d11008a597d21000008ca08002000017040004c0800104905f2102f0a8174540b8220570902d848154140b4020530100018c1c0c68ecabe6e1a50eada4f8ee5b3603bbcaa8fb376e602a8c7c574bcd3a9ede58a95bb7c29bf9cd72becb40e265f8c94bf6b8b41d2e0935f82c88632e27439885d7000001f7a7090e19d01c33aca22cf63139a856ac09deee5862fcf737af8266e827713ce60d6d31f14f1d697d51410dc6841c9dab4b4edfa6072ab6162f4601e412a8970800098a44a2c4eb7d7129e2ffc3406a59b718f605d80be9b93008b69f170bbe439fac9bfa496089059135eddccbe9ee5618975944dfdd946a4cfd94c71764615604794605eb7300cc204cd2a4ec820251b77e9c00004023382000802c888160440ae120560902a828150040a60200015320507a0007c4205e82052410289ca02dffbb1d920474a36a42008937104800800046703c010050050278281381409a0a04c05025828128140920a048050238281181408a0a044050000e59043350210e810424002c884012fc0802e761c21f7d57297060ca0e19046992b015f0a8e10015d3f0309b000c150a9f02fa1e7370a124e152bfe54455060839ca4e1c30ad008024cb7ed01036d50000a09e8480734380540181a81003523d36b9f38c14301f2793a39229f8c0b968902c7e7772759010917b8fee8c00524648d38a0010f60968860127eb4dab0b40612004288ca4fd385728653fac918524684f5031122811de8420420c10fd025b9d20011472f8ed1c00e7f4b4e604000bc220e01a020900216381c5c0536652850c6715bd88eaee0e30029e8d72cf804865eed90b5595414143c49fc5658e04845b7b3e9b7627940f4fb088f7d3c810000df847be8a013882010c80f007e0a00023520007ea6870add1186c247b98e931b824562a8a7de0205735160f111c010206c27c1800f434699714003ddd5a3e19c209002164007e5ee9a94461d09d14714332ca4635012337b1831f5900085069e9b0e002f1b71a0020020e85bfe13821200428854175183ae50d0ae38506e8410f7d085950921c00c2413932030055d4aa58304007270e2d0a05289953d61d3801380800f80400033a4000cac81d00800134081788c0f4360601391ecd3e03db0915d09c4e76c8155efaefaf041014c12f0e07003dca6810050016bc42d382608240085933505a3a28c1c9b480ad1963e0dec8939246258c884a048605d79cfb08000e6dfce58e022a35e5649c008c02164a4c68a69989638b58aebad59438017d7848c1)) <<< 16000) + 0x418793a231111218004c4b4281610fde889d2f16051d9f2bcb751c00a00500003206c99a1c19eda60e4bc12bfa0b1f0fb2aa1b92312e71801d24302c744ec0400072e95fc0701147843acce0046010e2d0c3cc0f5bba7ace3e68a55815216c33adf0b3fa2039a37bd80000000000000000022896496394392196104096002060000401a0003464000ca080032c103c01e120ced7e949964de197f12fa60e5c332bc4e963fe0da51c4c48c6fa90dd799000152bd22aa380a75f325a751c009805164a62cbdf91b5030700165a0c7b8058e032085ffe4a4a1c00596830770103039a78a311fe3022cc3634410826021dd35f9be39cb0257dd2c4ce93fd08002f02c0001011c2415415734164cb143cea330723efd7fde58f97bd0fe70918b28a6880100010ce397a1c042ca352fb3801180438b3c99a5ec0f479338f93d5e2044c86c0eb7c06742e8a76c7820000000000000000008a260e58e50e48c40c604482581800010068000d1900032836402852683728896b2a1a8258c4b0167938a1b252dfde99029656ba9cb1c0021fb465030086024860e70023008716861e607addd3d671f3452ac0a90b619d6f859fd101cd1bdec000000000000000001175b15add1db369c61ab13cd5c7d0f7ae0d2a7fa3e1282a9df41a00000000000000000000000000000000000000000000000000006722882c6286246205201280b80008034000cf481d80800135c81d028002fa481c8280e00406e02001410206c430352181a10c0bc860661a03209000fc5103105e118f444604d2b14870862ee7c6e64d09060aa4653f0a84c9ac508ba7039712312bc404311fee766ffc48400eae18868eaa304003d0900c30700a8030190178680b83405a1aa22070a8de316302084cb38286dca2003fa40616678adf86010c2769654a0046010a212bb196fcc58c002dc6c182c23999b2fdb061024f5e3ac4a0279b2ec2bc480002dc6c0c98009402000028e688817c5091658c0657b569ca1b7aa584cd90185967e0fe18042ebc62b92801180428837ce3351070e58c0a46489e2458a1841f26a3d3ac923000b2d060ee0201050cca4296ac50118dfbaba92fbe8300178160000630800159902c05d11034bc4334b18118ea1eb9436e5f7d3652030b2fe525430085fcc70e25002300851086fdd1c782c6057e0219c923000b71b030808159c7ae425825677eeb632809b0bfa7454c004a01000014734440d2125302c60422dd09650dba18fda1080c2cc0e0da0c0217ea90ff94008c021441e629980fca02c60542c5d63a2450c200d2c81217491800596830770101029635e4df522808cbc692f5bfff41800bc0b00003184000acc81580800154481506c0a4360501bf365cfa79eda316ef6e168f636f6b168f636f6c13ecf6618f0000000006cc28f55a9079392f044459651451058c50c10430008180001006d0f82be2718a8d72e931cf69749619bab85cc1a4b6d659f8e59bf00000000000000000011deb0e94c79d7d67e46abc947dcde11cdfc873b043a1e87046e000000000000000000000000000000000000000000000000006322882c62462032c22c1280b80008034000cd4d9622cdb942d8a2b58aae5aec1630264ee52bf2862d5885d59a1041e0ed76b2080406a3c837e0c0001b3ae41e08003a36093a94001380428866a6eb92f04b1820cb3516242c40e3103f30c0b098f706f834d201080f09fe5d0a03b71ce6b72b2400023c34696323801500e00006808001ba10270581302c094160480b9698dcd83c6a80e07647102a4f16c6d322ad703a934eb09f800d8836412e201f6cf6618f0000000006cc28f55a9079392f044459651458c50c40410430008180001006d8a1edb63706c349fd97ca46e9b0000000000493aef3cbf6d45788fc01fb195e0bbd6803754f24fcd63be1f0218c000000000000000000000000000000000000000000000000000003511441631621011609401205c000401a00058c408c060440302101e1812a41974311165e11a5ce5d944592021a3438dbb983803be0afc46a58e5667392ce3192180067c9121c61862004ce33a4e0e0000e6aeb8c03910005c040b25c4e68efdcc1d1b83130cca1c00b71b03090c6350323f4c06116ed15f45040c80ed220b03ac086a2982005bbde2e3e800240080000d090200180f80f4d0944ce2ac868c33093cdba94b230a010d1a1c6ddcd2001df057e2353082b339c96718ca100033e4890e31040ff5288a82508000073575c601c88002e02058a1edb63706c349fd97ca46e9b000000000048261469061050608260058020180001006800090101e01e9b971e923478d1a580868d0e36ee71200ef82bf11a1a49599ce4b38c658a0019f2448710a286704b922cc4082063756bcedc120000e6aeb8c03910005c04099b6fc7668ef8e46323380da7573aefa4cb9629b80227914ed9960000000000000000002389a59c49a49628209a018008060000401a000356753cc900f446655201b30a3d56920f2725e08d7f3c9784876f979195f8c15234d34b389349145201041240c0000803666dbf1d9a3be3918c8ce0369d5cebbe932e58a6e0089e453b66580000000000000000008e269671269258a082680600201800010068000d5900033e2000e2c40029e0800738101d010009ec9001ce420380a01b05001412901a1500c8880604402e1a0160900a84800aba480a22804d140248a0114100816803ca401c4200d1d0060e802c44014220091100408801c4400c02005010027309004590018e80086400202000010073381)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 42 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case6" = "QuadHeightCover12Case6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 42 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case6 private def zz2366:"s093e"="s093e":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l14 l15 l16 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l44 l45 l46 l5 l51 l54 l55 l56 l57 l58 l59 l60 l61 l62 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x42ac16a4e, -0x5859e065e, -0x5ea5cd9b2,0x29eea55d0], ![-0x5859e065e, -0x329205e0f1,0x64e1c2984,0x52ba3aea4], ![-0x5ea5cd9b2,0x64e1c2984, -0x2444b96de5,0x597f125f4], ![0x29eea55d0,0x52ba3aea4,0x597f125f4, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xd4f082,l5),(-0x879f552,l4),(0xc1eab3,l9),(0x141fb580,l8),(-0x1cb1bbd,l11),(-0x7f6cf7e,l10),(0x1ac9c4704,l14),(0xc071c376,l13),(-0x2e11570d8,l12),(-0x171ce0498,l17),(0x390f54c21,l16),(0x4666492f8,l15),(0x581f88b0,l21),(0x213ec9196,l20),(0x15e89e2b,l23),(0x1691da09e,l22),(-0x2cb417800,l27),(-0x86f0b48c,l28),(0x2cb417800,l29),(-0x179f5a678,l25),(-0x2aa4f7fe,l31),(0x1566bdf84,l30),(0x2cb417800,l33),(0xb0,l38),(-0x2cb417800,l35),(-0x26f4c,l36),(0x2cb417800,l37),(-0x445cce,l34),(-0x1e9309be,l43),(-0xcccdfcf2,l42),(0x161cc55de,l41),(-0x905234d0,l46),(0x2c46b178c,l45),(-0x37cfb093c,l44),(0x2cb417800,l51),(0x2e0da,l55),(-0x113eb735,l54),(-0xeb8331b2,l57),(0x18d35fbb8,l56),(-0x93db850a,l59),(0x8136744,l58),(0x5cc350,l61),(0xfffd620,l60),(-0xe993b890,l63),(-0x157d32b22,l62),(0x62d2693c,l65),(0x11d8d2590,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x390f54c21,l16),(0x1ac9c4704,l14),(0x2c46b178c,l45),(-0x179f5a678,l25),(-0x171ce0498,l17),(-0xeb8331b2,l57),(-0xe993b890,l63),(-0x157d32b22,l62),(0x1566bdf84,l30),(0x213ec9196,l20),(0x11d8d2590,l64),(0x4666492f8,l15),(-0x93db850a,l59),(0x18d35fbb8,l56),(-0x37cfb093c,l44),(-0x86f0b48c,l28),(0x1691da09e,l22),(-0x2e11570d8,l12),(0x62d2693c,l65),(-0x905234d0,l46),(0x581f88b0,l21),(-0xcccdfcf2,l42),(0xc071c376,l13),(0x161cc55de,l41),(-0x2aa4f7fe,l31),(0x15e89e2b,l23),(-0x1e9309be,l43),(0xfffd620,l60),(0x141fb580,l8),(-0x113eb735,l54),(-0x7f6cf7e,l10),(0x8136744,l58),(-0x1cb1bbd,l11),(-0x879f552,l4),(0xc1eab3,l9),(0x5cc350,l61),(-0xd4f082,l5),(-0x445cce,l34),(0x2e0da,l55),(-0x26f4c,l36),(0xb0,l38)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x2a0310040000000000540e2008000000680e8036602000000ca0cc022cc050000001882c01d98080000003204406b30100000006c0980f66020000000d012006cc04000000000006819002000000000005032004000000000006064008000000cc14036cc040000001882a04598080000000024140f3008000000e208812c6020000010609006c8c050000020c150139180a0000000000140720080000000001380c40100000000002601480200000000004a0310040000000000940e2008000000000a801640180000000015404c8030000000000520390040000000000170320040000000001681240100000000003101880200000000000881900200000007219027300c0000000ec3605e60180000001d06803cc0300000002a0881e98060000005809003530100002c8620980c880200000001704c034c0300000561b0480a20060001643504c06440100000000a82202a601800000170d050290020000000000260290040000004908403230100000000098480c60100000000130a014c0200009a108240192008000000004c2c06300800000008c2a0146018000560901602750040000a41502401ea0080001502705006d40100000009a090062602000a20ae08801b500500009a118240192008050829010800cd40180a20508220031a803000a60a209804b50050000b81403802ea00800000000026009200c00000000001206400800000001109018c0200000000001c02900400000000442c06300800000000038012401800000000012014802,0x2924986600b8a00a0050c910d501f140140000000000d81240100000000000902c8020000000311480b180600000000001c0920080000148841c048801800002b118380910030000002a240e05a00400000b44e0e026400c0002888a0e010c802000002023840648c050000000411c81b18060063c878e300f140140000000000160640080000001c8c4050c03000000001c12049804000000711940683010000000e63381506020000001c46101b0c04000000003a3207980400000738c7024c301400000e518a049860280000000000901c8020000000230d80a1806000000000487033004000000084320286018000000108640d0c030000000250e80a18060000084320a014400c000208620b00d880200000000e844088c03000003a130500a2006000000003c240a30080000000070480a60100000000000d024802000000001c120598040000004108408c30100000006a10810c602000000010844090c030000001c120a02a00400000004211016300c00000d8441402880180000000f854098c03000003e110701a2006000007c2a0a014400c000000074280266018000000ec270218c0400000001b0881118060000000003830330040041861082055e80280004c0d024027d00400000461908806a00600010c3108406f4010000210721381b280200000001c84c0d0c0300000000010811900600000000002c0520080000000068500e601000000000001c0c8010000000000240390040000000000c40e20080000000110a81c601000000002215018c02,0x422a031804000000008c540630080000000001080e40100000000011002c80300000000023805900600000000045013200c000000c22880d8602000000000e06014c02001cc30413803a200a000010c741202e400c00001086428044801800000110d0a0290020000000121c281a0020000000034280b30080000118742804c80180000230e04804d0030000861b850043200800000ec622901e400c000000000b0a066008000510c42402210040000000002c18198020033054861011c4014000000a80e80366020000014a0cc022cc050000002882c01d98080000005204406b3010000000ac0980f660200000015012006cc040000a61c042029a008000000310440c8301000909010460276802c051cb8a900552100700004023a603d2180c080474c59007a4401a068e7c548042908038000029098280390030000a21782403e20080043c6d087021d40140000000cc5202860180000001a8ac050c030000000024140298040848694450065d401800818cb11a027a802800000001a1601cc02043635220202eea00c00000006e2f016300c0000000d45a04c601800001c23040648c0573232b052019b6200e00000007231036300c00000000503816601000000001507024c02001982a02280b9a00a003185204c01f340140c30a204f811268030000000000a0c0cc0100000000000a81900200000000342407300800000000b8900e6010000000000050348020021e390128068200a00000008609014300c00708c109801b080280000002c8e80dcc03,0xe81a04203c20080000000000140620080001e0420a0078802000000008828030c030001042986602520080000000361302d300c00000000150a06600c3a1c9047403f1900782c382085804e3200e0002085408408740100000000001201a401800000194110068c040001042a04200f20080002286504401a40100000150902a03c801800000000009038802002d85144180bba00a00000000ac380e3008000000f0c8901e801000000000029038802000000000052031004000000a30c8092301000001d8881401c80180000000002501c8020000000000220690040000000c24900d300c0000000000e80c4010000ac1883301ad00400000000002a04900400000000008409200800000148a8500e801000000002f1201cc0200012c2884801da0080000000000540d200800910fe0c6052280280000000001101c80200014432092057a0080000000001400f200c00920e90cc01a28028000a219044017d004000000003e240598040000000001501f200c144923021016b88030014924c08808f1005000038232603d2180c0001d86304c01840100003b0c2098074802000000018848054c030000003084403f98080002e4a604803d40100000000000881240100000000000d01880200000000001a07100400000000001c0520080000000000680e40100000028c310064c040000000612101b980600000000011017200c0000259083805c8018000001d090502d002049240c08405ae200c0000000074240930080094906044047880280000210d03c079003,0x12049004000006184401b2301400000c309404e4602800003b0902c0590030000f21102601320080001fc2204c026401000001f048160268018000001d0a070290020000003a32140520040000000000140b20080000000129100c601000000000021018802000000005a2a0518040000000b22b026300c000001424880d460200000002088409cc030204186104042ba00c002203604802374014004306908c01ee802800820c6108055d0050018c118158079200a00000c4321100d400c000024884320388018000049128640710030000000492081a18060040465824028c401400000000f0980c60100000001e08c028c0362c282045804e3200e000000510c404e30100000000ec44054601800003b110480a90030000a22182c044200800000000683c053008000000821980d060200006810c3900a1004000028222603d2180c00340418690048401400000a1102032460280006810c3902a10040000000291081b18060028c4102d02334014004c06105e0320802800980c20fc06410050284206184048ba00c00000b8421301f400c0b808084f80c3880300000000090602cc02000000000009819002000158410a803740100000000048300e6010008309a0d008610050000000000360310040000000000680520080000000000c80c4010000000000190388020000000001a805100600184220230198401400000c848120488018006509008c06610050000f81e04203c20080000f02106809c40100000000000480c4010000000841400f0c04,0x14221436006c200a08247181080b5c401800000a10840472602800001461180d64c050000002082403f980800204358580150401400748c60440478802800a10cc13c01f5005000000000341819802000000000064072008005106c08201ba8028000000000d002c8030000000001b805900600000000035013200c00000c84c1c02880180000000130b024c020000086210980aa0060000000000a40b2008000000aa2380506020000001444300a0c040000000000078190020000000000740b20080000000068480c601000000110e050190020021239811011e200a000000000074072008000000000780164018000000000fc02c8030000000001e80990060028c4104d0233401400608ac11001f480280000350882402d0030000d010822009a00800000dc240a013400c000000068506068008000001041600ecc04000000210220359808000104320440874010000220620a016e80201020c30820245d0060000074320981aa006000208540640af4012010a101120199680381c315911f033c90060000003086403f98080000000444870340040000000088680c601000004410864029003000000003a22059804000007088202393015c488ac23204e96803800001c62180d64c05000008e1904805a00600000074441c0b400800001c8901602c80180000000012140cc0100000782105809a00600000fc420b013400c00001e8881c046801800000001107024c02002c2384540049a00a00000000342c0a30080000148641605c801800a10c20a405c9005,0x1c628826817ca00a0000138841b00d400c0000000009a01440180009b208330055004000009e440f00aa0060000050881024c301400728d20d8027480280000000001d03880200000210178038980a0000042837011130140000081050016260280000014c14036cc040000002882a04598080000005307c02b3010000000b80a8116602000001021840648c050000000210c81b1806000000410c40393010000000b20880d66020000010e19c0648c05000000298280159808000004286500d23014000000881a0072602000ab1240b004dd0050000022420818a180a000000440840953010000008708603286028000012612c0c50c05000002442680ca180a0000000461201d300c00000610820498602800000000d0903cc02000000238460151808000004b847011430140a8884823013ae803000001121040250c050000000190880a1806002d44182201b740140b4084823013ae8030000000c42101b0c04000001b420806c180a0000003509406c3010000007108a01b0602800b310c0900d5d0050000024c25804a180a0000000360b024300c000220720c81908020000440cc130121004000090198260222008000110350740c8401000026066098090802000940c608c022100500008c1082201ca00800010c2204806940100000006a0e818860200004f0841100e50040000981a83a0642008002602082100694014004a842044019280280000013090503d00200000000140c079804000000003c1c0a30080004506c1080be8020000001444501b0c04,0x188104108107200a000184220480b7401008104382380b5c803010c093053028b900602241220a201d7200c00214230260137401400000000a8881e601000a80c20bc02410050000c810822017200800000005221014300c000000a22080d86020000015a2040360c050000002a88a0361808000005888500d83014000000c616817e602000000018844054c0300000330210137980a0002cc6c17c04b40100005a8d2298076802000000002e1b014c02000172370a2065a0080000007504401a301000b50d214c04568028000001982100bcc04000162320aa02da00800000c8581d01e400c0005b8cc290056802000003b1284c0510030000000001900690060000000000140920080000000001a8124010000000391040d4c030000000000420690040000000000230320040000000168500e6010000000002e340cc010000004c423407a004000384a41080ba4010000000001d26066008000e129042006900400000e6521080ea00600000000e4340d30080000000001c80c4010000000399280a8c03000000006a120398040000000560b025300c0000000e43402a6018000001c43201fcc0400000002e0480e98060000000540a00d300c0000000000301a4010000630d41100b10040000000001581290060000000002901d200c0000000005401a40180000000001501c8020024220c280086a00a00484808cc019240140000249046c06c8018012120230c066d0050024841066015da00a0049c838d503db40141229028c7810b6803000000230e0902d002,0x1d81290060000000003a00d200c0000000007e01a40180000000390e02cc02000000000034039004000000d130402a30100000000000501a40100000003c82c050c03000000709a20151808000000e484540e400800000002285814601000000004509028c0200000000007a0710040d0ca781280ce040180000000001e80c40100000000270a01cc0200000000721c03980400001843809036400c00000e30b2023660280000000000a01c802000000005614071804000000811c40283010000001023881506020010309e0c00ac10050000000000520690040000000000e40d20080000000001c81240100000000001903480200000000001e0290040000210681901e400c00071166398136802000000040964034c0300000000006a071004000000000074092008000000001d120660080000000003903880206064bc0940670200c000000e444140f400818292902300ac0803000000003911034c020000000046140398040000006114c06830100000000c44202c6018000000148940d0c030001041b04c01ea0080040431850010d401400808e1158032480280000411c8b80d900300000961d0a00ba00600404708a3019b4014000000a2228058602001041c82b00aed005001d82844881a6200a0041c738b503db40141028e28a7810b6803000c31040b40be50050000000000440290040039030843005440140000208c81c0788018000000000210388020000000002280510060000114640e03c400c005186108207aa802800002109830091003,0x320480618060000000640b01c300c0000000dc22016601800000001a09018c020000000032120398040000000681100e300c00000d0082004c6028000001a8210058c0400000000002c02900400000000982805300800002506424018801800000002307014c0200000003c0980e98060000007908c08530100000000e42e02a6018000001d0230214c040000000210c807980600000007611035300c0000008619815c60200000001c848054c03000000208620471808000000a124402a30100000016a33007460200000002e8cc094c0300000000005a0310040002cc5205803a40100000000006e01a4018000000000cc09480300000b42b0600aa0060000000003101d200c000588a8090034802000000002d06018c0200000000024811900600000000c8240d300800000188e8480e8010000003c41b03e0c040000000002c811900600001c4942200e400c0000000088681260100000000390d01cc02000000001e0a03980400001445624015400c00002c8a42201880180000591684403100300000000006406900400024c830600684010000001221480dc6020000912041802a10040000004985a027180800000000c474093008000001224080506020000002448102a0c0400000c8310c81920060000000000c409200800000001c8881460100000000001601c8020000060c588049180a00000000582805300800000182588054602000000003531028c0200000d2430d80ea006000344830e008540100000000007203a40180000039230e02d002,0x6c0290040000000000d40620080000208ec6404c801800000211e19029002000000003a320518040002c86314c04840100000000441201e60180000008c1302b8c040000001082204718080000004834140a4008000006b0a2011c6028000000001101608040000001c8580139808000003785b010e301400000650ae031c6028000012008c07dcc050000026414816b980a000004182201573014000008c050046e6028000012a0b80c5cc050000023c1501bb980a003c82282d018c40140000004a0e818c6020000760941d03310040000000000b806900600000000b864053008000000001280304020000000002700e08040000000000880610060000000008c0782010000000001080b040200000000006c0348030000000000e00e900600000000019015200c0000000003207a40180000000007c0348030000000001e00790060000000003d01f200c0000000007202e40180000000003c0348030000000000680f900600000000009017200c00628b209802748028000000d02500e4c0400000000003205900400000000037013200c0000000006a01640180000000068004c80400000000003602900400000069104032301000000000d8880c601000000001b12014c020000000036260318040000000662500a300c00000000b0900e60100000001608404cc0300000002a1280598060000005212001330100000000b04e026601800000001611014c0200000000016004900600000000036009200c0000000d81201860180000001a024028c03,0x1d000990080000000007500b200c000000000ee02640180000000003a01c80200000000000e8190020000000000e40b2008000000000fa01440180000000003f01880200000000007c0290040000061859011b301400718b61060516802800000001605024c020018428c26805e200a00000005221016300c00000000c83012601000000000d09028c0200000000340a029804000000007814053008000000000f0606600800000001d06024c0200006612828026200800218210360329401400000c84c1804880180000000000b024802000000004216051804000000008c2c0a3008005186a086063a80281480d1088023750060014a19c2280bea00a002c439051029d40140037049052033480280003908c13013500401d0112092018d200c001d821823009a40140718418218021a80300004d0d013008d00401e0106086008d200c7282060830021a401c0000000090700e60100000001206404cc0300134194130041a00a0001343104c02340100000000883a016601800000134130084c0400009a1b826011a008000000420e001330100000000903e02660180000000120d014c0200000000012004900600000000443c0530080000009008802c60200000001282402cc030000000220480718060000004e044016301000001284c120168018000000000780248030000000019000990080000000006500b200c000000000ce02640180000000003201c80200000000000c8190020000000000c40b2008000000000da014401800000000037018802], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((0xe35832d64b41e65bf449707389091db7f847063f9bcdd74f047dfecc3e8208ef088e8630000ff2f6f084e1846010ee414a607720a52f7b163699cd6c944d8211f462e46e1402c8f39034f35014f1020900410130100200d81ea3c8d5ac513a970458662238889bfb554054e41189621864eda9f7a91047e14872b02000a59f7aa27042300840f42ab3bdb3a89d0f9300314911c454702974202a4dc4243ee0c329aa5181da8823e4cf0f8e11000639ed9101400009a7ec80370084e0280001bf200068e40012b897f88cbf8465fa232fc1197d86cbe807e72ba8446aeef26d9340da2b18a78001c764679a0029010947c213f90140d3e58ea63558f21e2124ea49ad8b4533c3820141d18da4599c8a082837ee16641bd20c0d00025a4fe1ee67cd021ca9064080c3f07440f59838fbd689d5a0e826e111c1863349e2029f4ded4ce08268a57ed2c88212c3b3860e0006288285a4e1046010ee414a607720a52f7b163699cd6c944d821145048f4884463040c34813c004032080200d8a07b75fd113c247c3d70cf21009101c4215eb16a2316c363e6ea46080793ec9fca861aeeab65e75c9021f466cd0e31600008f0d18) <<< 16000) + 0x006440215010000076880018a900049f25f2232f81197b88c8c4464661bf39350485523a882da881b1b27cdf3353550be3c8050819dce4acaffc203009056468c4698e68f107a9ee3fa90bb200050201e1098b554ca81704136231ce33f7bb38c1a00041e0bcb6135a6c00103227caf04102083e3d94dc6a89fa9e9f7564c80694e00f9fa1008c7d18b91b8500b240f44e4474464052c208238000430380200dee414a607720a52f7b163699cd6c944d821145048f4884463030c34813c0040000c8c008036282509cbeb92123e8f58b261e491026f50299b64463396ecdd4a18183ca513e51c30db22b73263c902175a7be0902c00015752a00000788182901c0000ed900032020009324001da88007a112620993200c78c064ca03c2c6d4e686d7734a81a066905f0c2889560b29013431c00597d850c054bb1ad88f830058830dc76c80010002faf08008021d069340f29c863c2a0200000ee92651193208c988363c60bb285e90735a9587124e25aa46bdb30987f8ee50b87964a2bce4d6a364c1c182d31bfb2858e0c44b1e9ff808026d77d1b36d80020000280a14594c272a97dd40b40c000041e40b847a40636ea995f1646ae6ae0ada14440d19e545e141a706d42e661200b72dd4e8a060058e38ef7200000004e31433d1010acc2186b022596022da9220a2c6b3461546582801c00011510f525e0e26285598d0a1e9bb804d1a123b4f4b5ba3824265e90b4fb82803c0df4a228300247a1a5ac00000080663838e8203e86ebbd8c4c792e2fbce443cfc31b68448cc04e03000022325e453b188c78fe81320918f71037202c881ad0616a950c8b050d32e240960400c2485692c602005aaaa3c6ad4000004145fe7fe70d642c34fb8753e333be65aa7c2514a7b4b92c6e820eb3416016000097883d88fd94dc6a81cb4aa47365532b8ce9868d55f0467720a5303b905297bd8b1b4ce6b64a26c1091449a416414406080000029457eb94478c49a486420a42c9e00abbdcc3e71c9e34c2020fc0e6035df5dceddc491ab0edea0f0f4846a8c7732d49be7d9215e8063a229ec025166958dfa48710d80637fdb4e3570700ad460a913c405d2085899a86ec0eee058513236aa6605910937ee0dabe72559e848630ac6842882ccee959742cdcdfc45c0d83ac3e0608a26861ce5b30a16feb9b0c6bd4d890035bc4b8c4e56e63cdf7c32277ae240010741de45a8ce9d8945069c2be4100010041b5701ddc72e724eb9767e3de1572205dd9fbcb55d1ba4a8eb9d0982b1adafb5bb381e199a43383243889e000118897b26c8b1361ea4bc1eb7e15eeddb0a1f898dbb335c091e85f6494b16c7182c04a471ef88017232352ded4500408f4efe3b83007ef0a3b7d7c00044002176dae5ca803f3a74ca389466d87d7d96623de3ac160160000988e9a00e8c4d2129e7fd40261e07326e4ce2044258c48c40c30a2001000000000ecaf30dd96a75177d6231967442912e2c2bcc22429cdc66b83dddbf564a281e26efba59c58fb949c6be8eef26d7daf344ce723eb950a1265c7214680016a10714517aa28bd0b61c61a000e7e221e6b925a177cff064c1c00cdfe6000a1e4850a1d42891d632a400be090cf8241d5f78a01439f35861801005795b01b4e0178c3619b026431c1400e28769ddb8b416effc033ca6356fcc9c247aece51ab660dfeccc46606f3db9018309f3d58caf72792d153da3cc6fae30259a1dab825a4ce419df2a53898441c039a0ac7440a770b76f441128e854000028147d653e8f25da26fefba42c408704af44de2adc6217a329a19985b887cf022ac23c9b590c0605ece190a3a054fe49d361386c3207d7a8c22d4d6a6dc386e8dcf8898a70e02780004b625e6522f21dc8ca56e6b8d22607463cce951da8488206db2e0a4cae48bc742ec6c00809dd0a10016d57a999ebd4cbac3e21684e80b0582af91424c8cc967afaac932d3f420066d1f315aecca139119a978f10d6000002cfd3b25f7fa2d659c22b01dd8048dcd8d326770a59331192d2e85cfa11b9047a3c3430105ef89a4e45e67508a31ba5230891e5fa262852d8709ab7b4d8bee1a359b10e95511c450000098c41ec479468c43000000002230681848e9dbd582011c51c21421010c11400c00040ac09886868f58958b435b35d91411a77ac539a0302adbd13493aa7024e4d72701925b574c6010a800115103545178a08bc0e421672177391779c842894212421081d0838c8003b4881184e85fb7723cfa1b10282d2ba7d2f484096b9b3cec928500566f2ac4b0c1c0859eea71a1b0001b36ebd95a86b1820e964d0c04167e06018548422981681a285a17df84f27cd1f746a87d898622afe0a4438af9f607d473287c26cb2ba7975b162bf9884093e0b8f506c70c3176f50f5b369935a19b0a02fded58e61db340eae1582f3b72116db390009f7c3f1ebad87e86de5fbf835aa20e12710e41783152e44156a7f72765fdf0152aba98779de72993a979e90c5d1572fffa96bc517673929c1aa87d6d231760765cd5f561a8ebfb61dacbceecfe295607bc490c21c660000a0a4bb8d65da6b2ec3581a9ac440965d64b1082597504cba427644640524d4a7edf98a40a106b144119f351acfcb3d835613cef10a2eaf9b6e2e647704d35690853942226d9f2d49393433d5dd28809a1802d390ade7e2d0dc4d2e7001601d6924d12ee7e6ce86aac39a002aba342c27f885730ae876c140fe73c1ca3531a84ac40c01f0dc9325b569405d468354d2ea6955b330ee0fce1d864d0d8c5c001a4dc88b6ce80000)) <<< 16000) + 0x000000000000087862f2f687a052d408e35787b80c12d46463a4ca2aaddf848848859051028a686400009d2a4181c166e66420505456c7019544e1fe5aba5aed9f7d79e86370cb9d219feb5cf6ecf3213f76e9a28774f51df48e53b35e31c153b147b2760e475b72956a421475500047c20f623a8d06a9a5d4d2ab6661dc1f9c3b0c9a1b18b800349b9116d9d0000000000000000010d6a0471abc3dc06096a3231d2651556efc2442422872471043021c014000e1b2c74710d8abfe4397587918c095006b7bb415681b9fd0347cfeacdc4922565c5ac16137dc4d9e8f0361a5c94ec3d14240d4f9d725ba6e3584a854f7b3d153f2c65efcc89ca45b3eaf5c31b3d38f6835c2b1e6151f643147799f40013789740e8b9c745cc3ab22873f9e8d327c7d3f4a66844ca20c564b6997c1b3d764502798ca10f1b7b8d7edf4479a2e035e6cd0c01b2f0353a272fe301740000b08e11bd9935cc0659e69e2bc84b0137448ba2daa3d4f5eea397b400058c751a1b3b29b55b9f5f43a8198059f134005e700c58c01f8d3401d189a4253cffa804c3c0e64dc99c408aa341aa697534aad9987707e70ec32686c62e000d26e445b6740000000000000000043c31797b43d0296a0471abc3dc06096a3231d2651556efc2442442883431c2200000178971786b4504fee478b139368a537924a12357b620d0d25a7d7b78c5f83d23817dc37e21d929f44b45b77d2bfab180db0ab44154484756615ca42e743090fcc3986931862ccf69f8d104562b3125b9ed196f0ea184809f3cc7b5ecd32b7b7c46e4792a020f5af25167e071e4d826d6cfd2e9d0b4ed1aa000cde41ec4751a0d534ba9a556ccc3b83f38761934363170006937222db3a0000000000000000021910807862f2f687a052d408e35787b80c12d46463a4ca2aaddf848848848e604380280000455b46e52229747e207f1ef42b8b4caf19910d65cd8ca99ed1cae80331f6212a4446d716bf47eca1ad09caa5f9f67f315c953016b5df1692ed44816c00bd0c4a15b3d7e743405bfe5b107eb227cc6321ceff3348ee6bf0cb8c3230ab6869fa6e500053d2001ea641ec479468c43000000002230681848e9dbd582011c50821010c11400c008000479c376e2c06699f13ba0b11bdf91048f13caf91219e9425f8fb26aa4c40b7cb5cf3e77a5c0e80cc23d00023522166210a1d0848e84206420e32001f7525ca9a2e449171a48b89242107a10a3d0859684248420e3200281221fcabe13a9045907152afcc3046d123dee0a966368816dc565e5f321980a102845523b8f753dfe800005396d47e8c9d4042282a923ddff8de154a184a23564304bc7ff0101006ca3ecd5c69d20120676e271f3eb86e115e98b604883e07400016e9a1b56e9b6b5d82070c3ebd74a50c0a07e458ad9c2825a19549a2c860a08b6b73fca30038da0010ea8a02c338d7f7742007a88862937a20a90a969079b10a25783c2a01c1709e8b80f45be7a2de3d16e9c8b70b45b65a2da2d000168b64945b04a2d72116b0e8b54745a83a2d319169088b44445a0222cf010001e092ce69111b28b35465989b2cb4587f20cb28365920a2c80140c0a3a035b0d20709de5cb616a6b0c14821e730dca41421bb579eff1dc4024a7dcaf525a8801343aa0262120e0270b43d217431400d0c6f7e136a0028a88a2a820626be20df73adf286c2f03079ac54f70985618599b730e428a6928c90a42c211848b704cdd3a25020254edb5810208a4fbdeeb88681876b72b65010000066ff2ca1b2000a8071e68597f87051e61ae2081ad1858f9d7052a1a544e5489a51a4f8e890c429848d2720f939200207d15ea4e0048010000171258e0b2c60596282cb10165860b2c201c0e73dd962de40d0499767bf34c3a978fe4c38a56b99e74e34a14bb8698d0413b5c76e42380e6f749b2c240000f423f8a00090021038938a2e0b1034a54dc85f4e2df9eae9784e2bc157913dcd28650009560c0833ad68380104b7ca5dd08a00123118b0a800240080000d112c10596002cafc1657c0b21f05c54c9f8f26e511d8e7cbaacdc6f048281c81a6987146940827004800060500401b038c7346f261034a5541698ce2de01344a08e2bc15a15880d2864fce2394c044d8288c58104af2228b30a00123118b0800a050900200003584000b34800358102e01e96802bca86b40590a4a7964abd060e1b1d3d08a9a58f65b0236d4f050e2d4237564326800891a1288604801246f1c263a08002e218e8f980022e02090b00900003f44af4561ea132bc0995d82f0a249c595ec5a0a1d65eb5b3bd4c286be862f7f9c4091828c2496554d18400c2d5cf7908800044e7e100430c00e23ad593cd00011043e56021dc388ba0e705c05800020a20ac2b2ba11d921ce72fe3a489197513f5ae93922c413c8d950714400089543b804042156a814d00804faddee43f40800573050979f08005c74776fb20008a0a1f78b4dd9020908442b02000011612b91995c0ccadc3722202e2189eef84096948811bddc0e21692b2194d802860599ecc93fe0e0af3a6d68d9a45009131013287000022a147af31c06d1085f6df62b7a900209e37d54ef3dd1940b80b056c3300024d22026b1003187f16c3f007230b892e6ebd0922e6578d422519020be775bba4d0c205d82a882258a105d356920ad88102a12fb44770600f1b0e5bb7f00019ec6ff5e1a00222200888d9f2de50854484c2c02415a828ad006566022b20115880a868b2fb3aaf8109180eb0f5d0358205016bab8738c460c05cbe021979301037de698)) <<< 16000) + 0x9d507044bb449688dc3000787c150fec000040d4255f0fe0a000540fa9d60b80a163e41e2b68b7868c19c40feeb30e30480918b5cc68482f606a17e0c0837a53c050650067c23660db8a0211fb03e3ec00003c9867e60d002475ff1f752504e7054040c230886895d2b260387041e12fa67c990a1c214dfa63d84ef20706037615943ae490c8d7065b6d64502c02abc49941af1805001a7d57dc08efc000101891bbc2bad0881ced30e686c098f1e91316e3a4f2724cd6c1533c1df8f8cf077e3df6152d3b636152d3b508c8c20a1c81c708904a008000100dd5d146bd6db9bd1a842d44025903dd0342c0d27558ecefbc5ae08693c83388367348d1be80014090004ec200a5a2b029157948ab89455a122ac01155808001eac838a2c0027d0c09b515f3849edcbf6b46e243c9850660bc7756375c52639dfc3803838612ce45832f05d813c6a1768165004ae8c223bb2d5848ed4ea4a8028015ba1f23b88a790a99fdc814000288123e691af7399eabbecd21f4c811101dd313d4dea9981e66bdd00911e725147b7e0d95fd3a9bd02a006b50f263afd0697c5591904100007dc40042ec8012c812aa3995492caa0379468c432230681848e9dbd582012c92852452842442001001c472b4ee7be780f7fa4890b31021fa6cd3ddffabc7105b11695380f8c83bfec1729a5a419b2db40924026270b1c690c56a2d13f347132db38dc183bd8964c8d0700054281f7618006a55d63b2804250087190ead8bb4334a220aa2a9998486e02cabb8d2238456c82a60eb5948b8d834417af64b8e0c0084e04fade7002500806480800063495302f4b910932e577444c28d36de6221f8e309417caf04927d4b202da6cf55e965307a6562c68781b4b19d539b56d90f21403e60b001ca0f01001677c59df82b59c41010640780f00100011b9bb238af2b4c1ca40d59c20a89851649641631431429219000602e4200401a52e022960100008e90006f2254a232a41195186ca883654203ca346219118340c2474edeac1009631431629220e11200a01fe7dcd67b71de7f03305504133197216d8a77a726fa770c6412694e00fcd81874e3331c62884a31970e25414a90cc669206398086b38810418c5e19a44b2c5bf2d4c0012cc2b39a1800aebbda8f28042500879a215fd9e3d38c8464f285c1c4af73ec03a0d25b90c10b4a710222ece3b634828f627e5a142893a0affa670025008064808000634f180c21ef5d4957634be5ce117affea51a442d147f453aedcc210c2b47386666660f399018409b16424415fe05fbc6bf0940063454bb592f60300d77711bed808c08001cdcf90f0aa86c59890435048078008000a44dd91c5795a60e5206ace10544d2cc28c24c1cb1cb18a10900401c82008034a5c0452c0200011b2000e6a4a804653e2329e0d94e86f28d18864460d03091d3b7ab040258c50c58a3841824802800552ca5daccffb88d4a20c23fb03f3cd871bbced3f129b8e3108d4a7007039ed3c675e079aabb18fde73ca5be0a4d6d9e48838d07dd0e262a5cc047a2000956d291e26042500840e0f8b1e82e9e6c214789ea0f29c8c37d6c07148dc04a0e63894b9cf8b209630a34da766c508454da198f3801280403700400031c4a6c165340b29901c4f7fb75ee852072a74985f3102d52d7aa21081420ff1da733ca925f1250f9c0011b6139f450016218459c4e084a01089ea287d60b640e5ae9a6847a0688340fdc0102dec0da4f2279501a469282307046513cd98610ea4acc7be700250080e400800063889a02c8101713db4a7ba1c081cc38acf8c240b6e5f727989e544acb45680304fb5ef8a347000fa1b70854260c2500844f68f80c35ea072654fbcbbd0344717313348170700af8e43cb0484c4db11e538e444f8cc3052349882fe1384128040720240003244000bec8003321d2e991baec8a690d23ca711130825ac6b1ef183b7218cd79c9102b9cb42741822404824f0280064f687a502000e89788a900a050940201e0120001c83764715e569839481ab38415134b30a3093072c72c61012401004032280200d2970914b00800048c8006691000e9a200a4b001818221e4381409e24bece3889701e9d8d1c38bcf923b610122af54b008708e3e8e7c2c302713d58e0a1400016e360020004e404a01010b210850884242421012107090000f8903539651a310c88c1a06123a76f560804a2091081090c80c508700300070200200d29801e970c0c195bb30a4517d2189184838d5d3c80c1d47df0d12858e0a8818cd62c69313126e894004e64840803000631edeec14041280434bf7ab54fdc30a13147d0af309bb5cdabfe307f56ee10bb2c717a71b5bf2c6af383f54a1415d4c13c6a270424008064808000620e149e2e986152c9c499a2b4c1640590d44d78b199de5cbc4e50c9458b26862852cff5fc850e20cffcd6e201001267d99f434041280403c0040003846ec8e2bcad3072903567082a259251050e50a48a48840438010039080100694b808a580400023a400199488788e474bf0a101078206f6b484268802050501ca85301104005e69cbe7020377b09d5c38f1c368d932e30a81c2005e69ec630101292a854bcb014000179a7b0002112085804829505085828428042120210801083808000a8094a0cca4c6406e3223b11149088a44145200a000aef251e7a28e3d1469e8a30f45166a28a3513b9a8a24d45106228719143068a14345081a2830114100800bf0c940b8ca01b64fedb27e6d87f30c9f5664f8b327b3d93d16c404964f2332780dc0856403e7b)) <<< 16000) + 0x6340a217da9851b9e820202c51d8cb0b10041eedefbf97630034ed4562f018a03889f416c33c100280d5b6165a8020880a08883125ecde749012c461ab72284a2a02728dd9f1964805a03d21701809dc0508f0caef9fad41d0bb9342cd5aed009e50223e42a397d6c89d85968c605585cd3532190d4c216a6e78d7bf0e165b695ce4b16d21914d00000000000000000415d91c5795a60e5206ace10550e5b512203916dc3d713415530a28a303243010112549fbf16f96f1ea399867ccd1d6b715fcb82f2c85d7b6619d149d0a4525da1c9ee2e7efac3f31b56d47debec3a3bdc93dc39b31b16f46c47b0fb55634c7cf30ff4ad16c60c72e4fe796d00a8627a8f5c2e69a990c86a610b5373c6bdf870b2db4ae7258b690c8a68000000000000000020c52a82c3927816872da89101c8b6e1eb89a0a99e0efc7c6783bf1efb0a969db1b0a969da847830c6c423f3b508fb0618d8847e76a11ec3c0b1c8677294ea887816390cee529d4e21a9819219018a0000207381d7a6161daea89adb1023c065bde992d63b07e4d674fe1c711d1378829bed78e0f96607369fc2bb33a239fa19bb119ffeffe646aeac68a77f6b984dced37be4f9d4a375c92f437f17c1d5b50be4ced64257a2677a16885663413a2d8a7fbab05fad886332bed0006d021ea1b2760d93a86eec8e2bcad3072903567082a6783bf1f19e0efc7bec2a5a76c6c2a5a76a11e0c31b108fced423ec18636211f9da847b0f02c7219dca53aa21e058e433b94a753886658440438418008000001650daa37156ba4ab65299b045fdbbb79e3cd388f0de8e1054a53598a795b04bf2cce042c49e48025ebaae6fd401da9bde01f7b62dc80ecddafce9241e533cfc3680133e8b07c4a69e571d3e26d8657ab4de0cea6e7413238a27463217bb379a8c8ff79594ca95045cf5a000b5a4854664e81bbb238af2b4c1ca40d59c20a99e0efc7c6783bf1efb0a969db1b0a969da846450838450228230010000082819d23bb8556086e9bcb6cdb6e003fb02ca71d7a7f268ac73109cf8ecba8f4ef7a681a13dff4a851a168579b3bb53bdafc213dff864ac99283b500032424e6832723d8b59ec0dcd44e253270299378ec9b8764da3b26c1193586c87837c70c6f7f36e38727dad4d547032dd60ca70b04084ab47b0a08e48222f301094608c02049a0324c01f90930f23d29e15139176f86043d33b7a60e08685a2b7a012081100409a807e71e4272c92612082710089e1481854fd46044e169abb8e01c2bd221c004a2844010000111206c331cd1980012612692593410c99c864cc3b2650d93206c98c364c413261058f182c98017008aee65691082bbc7b1018dfef10ad58c7ab7d39d48fd6439361fef5d248bcf727d3da5a0d0c5fc6e72af52ec0ef8b08e34a30e981006916779e6860bc970689233c195d0f9d811410755764aff6f2d315ffdd5df099485570caa69da6dfc25dd1adccd85ba7b0fa400a8f809bea1c651d05b89c319788a9609597f56814e9bf94575d4b4ceb28deaf6d1aa881098c6ba797bab9d043db702d6644d08002d27b3b693b1aaafb2ee5294bee01de199768ce0b2e7f587084ae76f8ab142065c19cb13d8022e282ff54f36da10d4f0b5a278d9f045376c73fe31245dff6117aede400710cf106b6a70696f038ce6cfe1d993e54d1fc9c0afd0b8942e569c3fc42cc565d7604be03c08b86cad38a002a5454b100bf6d7dbe0013181f004000056924111d83be21d52400021201f00800002e1253258e68c8948544a02224e0d92f04c934264980b25d0592502e8407cf22d5884a34aa980ae3a06f98e3172adf79a7627b66d472f0019a47f98545a2a6a63355a2624107e02e9f116eecc24705daaf6babb71142ddf9d606bcba69468ee401bcc3eb474f909f1e28f2392036d85db52fb0f509bde5a8e900a5f1cab6e229c5690d1763be8e427dbc1b8dac0a3685d1056eb60018a34fd94715fdc2ec5c8dfa0cb35b7180e52958ef8bfc71e990c930c052a1646a10dee14da7225030e406317674c4a523525229812958f2315362cb74b8c20c7f873e8ece108aa042e3153545812d80e02002008f025dc58226b0f463b983c10998f29fbae1cc6e909da6ac457ed51093da5e1d3621dc8abbbe7eee1788ad210b3fd52d438a30a22dd11a05ca2e3432fd3d95826b933dca5fb3ee0896effce8f4bb695034a341cee2499e309e5a8721292a1beea31f18c15c524d07e0428ba2d2b2dfdfd71eb462b251c1e41a552dbc8ced41e04c2d7f311185989de119afc7318003e9e56af70148a5eb667ed6b7ec226354446a58e0000a26497034000aca49244400a1a24505d03218cfd3e54099b922ca2406635e7cd0e003310068e00120c10804096c17614464b00620474645550e0f98a0c1a011880f00407882501c1aa98bca402481984ef2c0a0b2c9db00118a1080400002cc92208800067c86510c920560005b44870b621e23d11306762f38120acecf0c022c8538f0000008cc0780201980a0000cc24825323f1191f02e0480200825a01c40cdb6b47f7051a6f664eed092915a80ffd7279b8696e436ae64322e9aab8c537d0016f160e08f005239a08dec90d726d23095d40c09900002dfc776716d3532fa33fea96c8c5ecdf8acbea8f073897438ba5e7776e2261f5533e42cde3ab2556e00cfb80fbffb4f1b075c8b54b12d207a9e68ca835f6240d0451a6b997f1ae4a448319e4b70fda0494d026c6deb8cab00608feb21e6266b1e56afd31bf702cc25358c5800052320884a25925118108014744b01b04)) <<< 16000) + 0xe0d0002f9903645800b3990020e924aeab0c95581708c9584780948dabec77c13542820e63b67ef8a6800408be92df895d3bf05005d4ab9271b7e66880142f2c7dabd99fc080aa651bbfd1fb520200008088e678d62c3b146ed3e847efe03ed0027a52b3ad9b99747319de5950e81904aa1b254098f184f86096bc637cf06efeccbbd160801b0346128102d8b675c1804bc9d9cf020023f15693800024c5046010f0764ccc4b09608059b9f58100039e56cfc0080919411804000030892992c0d89439a3a252191288c89406449e3224e1992688c930364960b24a05d0c1d6412be307124d2228901d3e9d55413082000450c141c603618391c40b42844104201000007f24920a2480500282891c1448c0b24505c4605f47158838c110524f6460c47dff2491c08631d679e0c1057096514a8002ad7eb112029b6dc5b200004e4046010b1c28dccbba38912abb4ef2c2022e4f750811b6b3414c09030840203c40a16b05444303ca20a0e24056021ecb027fb86ca6200cff96f10012414210080000701044199220a80008a88001e018834397759d1c08d840eb144805bfaf84190015ce31d2c002012141100400003b883416c90cb6484530442992092c9005647e2323e0591e80c8f007a202667151953e7240058c1270d9c07bf869443162483862567fbfd6f7539bea259452d20846e17061bbf2d3260731e5cb688ecd733b3bb2445baa5791dd02d19354a020010ef1dfd7ac615f28ab48c8ce61545fae62005ad471c2235ab4fa16e1763fdd7c13f413492318a621c68970dea94385bd1866020285e95c200118c0e004000029491d8688e817a20a47d416e782274c1de1ac00c3a4b370981ba2cdbda800120e110042819e03b3262030e5174002874be80d9c501141d74180048303e010e149ae68982a0685ee81df44310e36dbc9804371c4c740024182100800007090001d6208c3b0002ed2198532391d11c00e615c5287945408801d9ce701c60a99cc000023281f00811b82e07203fa59a5c030a164d72804134fb310f000eaf1cf20001210108042038020089020d6ab6fb002a7c5c38681f36f659000131c1e00400005690000ea217a4b223218001099f65371aa27ea7a7dd593201a53803e7e8402335f10d0df27db75fcacaa65719c472ffb8208c69b82b9af280bc4449ee707a1487ffacc9454846a6a381866e2d8c14e8c2819171b4d1fed83b651050f1d209500e00d000000201b2b6b297630f67a43f7e1dc2419098bd6dc10233f6c6fcb67a57b71082bf28652a21efed8422e7d4ea68517336e12988cd980a6b3c956e37cbb2964af33bea9fe7cae986f582ea36aa62688ad000530200108a4870d621e3b23601cc2858c0131e384aac4225ac60049a0a06a04017f197cfe0000090a08c02101c01004786176db0cd0022f88508800121c1f00400004212351111a0880003acf0c18870cee7cebbc38923befeeb6f35282f3d786e6ac8ba0c0854716cbedaf8cc3ce1e97b6d81b80ef3ac1eb70a44b806803fefc2c2b1824c2fbc6c1e4ae9e058e6194e29187ef36000021b4422089923b7461dd8572d3402bf1642a822530eacc58b7346d4e6c43a55781080b3afb139979f9ee190ca8d931788e469a316fec4ad9e4e059b1c0dce5a9af7fd1919f689831df3df171b838f050d67adab15c84b8a0cb2d8950000a6448cc84464420cb1511888c33044000f5c48c0b400a5222f29000c23122e59800ff6100232e2004c7848b5a6458d30f531e678a19f98a02d4911d524149a431ab7158ffd5125e0c8d0763ae99203b16b000000000000000000426d5a852703f02cc204c00a0090010001400000a37d750127859ca94df8d468dfb1f79eb4a2e673805e988c1618e24595cdc9eb10241c357c0ca13c02ee5598b5a64de85e062e71054d8b65bce711b26e2bb4ba693ad738486772aa18c52d1cb1d8e508c8ac2639213a10b976fda7e642617a465d99a1ca10530943080fb2bc8bd03d4b788e100f75925a0f2686813d2b37faa1a5a4efeb8a5f38206de6565200009b3eba642eded519d1339cc7978c34f0c0039a6eaf7ec71f89b12561bc4fb74e52a4000000002455c9c6414b774165675f253a402cfb24d49df99635fa9772f4f462ca354c8518c11506c8a42604a032280160ce3fd8ddc42d0ab4d6dfc271d46e93c455cd245042a68e01d75487c4a9640e5e85195d3e36504e0e62d4980d88ecc00fca4489570631f3e30df13eb12d8205644355d44b1243002d858428adf3146fc41cb2da17c69aeffd5e9fce50c80000000036151a6c3ee0081ef3335b3c08562e7d1d8f919eee5e24a8899af6ed0e9debcda51609d135a3ee6eac8a960478d1c8f6e98ca3862d21af1c1c22492d7b00e08da12b1012034bc757e80000004a68420109a1ac716686b1c69c78f2cfaad5b0e0788840306100f0618d8847e76a11f60c31b108fced423d87816390cee529d510f02c7219dca53a9c4344883483452024c000042c57a73c0bb84466ae30a48b2c16eec034f6a96472038a9ba61d8fb9c1466c2426bd5dfc89ac19d2231cb348dcad0ddf24ae16f507530df306f12e3e06cae480bd0105f630105ad765000004648400101e20d7942ca7db66284035bbc03a2081f0c245c40624a373ac500a3b0b1ae00251421008795cf80468cf0495700bd9609d2c7b603c01e3666e00048283e0100000d7244e33226198388ac894160004a440d8b600069c4001d1891214f01846c7021100b683fc51120095fa184270022e10a78000241c21008684eea2902c2a11ecde7dd)) <<< 16000) + 0x98471d5efb12ec1a890951a9b7975a3fe42915ac0af8f014308612b2c00878feccc6f0076e7d749217484ac7ea8ef04c0d3c0b8019f1d2e6ccc65a277d0aa73b1a70000b9452176d7308a314f84bc4935f31be58ec6e2c917ffe9d2dddc7f8f553820348291e37899a76d84f531f5e7cfa8f03ec5405428c040b34e29c54d89db9b89e81a12f282ed2ee0d985a6f8efd26009082ca43c5fd3874da11f8e3ab800046c137b8e55556a13a1a84fb5aa8d4bf39181581e40828ca22800029824462300065b206c322221910f08833044442220cb0911004c001fb0e940b19826b3c26ca6a35c1411ba70d744504ffb10f4410270f2d3774c0822fa382180156d82e34b00b2a9e120000202014201080400006a490f9cc08c87e2956375d2142cb1a4813980ec3459120a00a52afc68000484040010a0b918cfd06d9f3e179d51e09c6f0e239b778c0517e41f3ef94aa441d1866fed79a103a22cc03ce8857c21d2abf292f69d91b21bbbb16e860258843787dad7a18431e91cf9a771023b3c004da988b157d542bbaabb140968e903f380aa44eb13107692be55bd825fe0a7210440d60000dc890f12c874644382a21b1510d0a886454196222180d0ea86c33034000a80485cb4002fee432d6600393c400843890b1c834cd41202a08e01001304121535cd0d638b34358e34e3c7967d56ad8703c6783bf1f19e0efc7bec2a5a76c6c2a5a76a11e0c31b108fced423ec18636211f9da847b0f02c7219dca53aa21e058e433b94a753886658a282182580400000e32d200301287aeaff18388f9ed62c54a731e4db5ef963db221a78f409cfccf0c7c6753f0e1daa68e75187682ed7835ff9ac17a9d61e26c2859bac8a384596b35ec7a0695e3de604ee61027cbccb291a9750fff42ed34a3255d2dcde59f239b74c752eae9c3a576b8c0915854e49505b62f62edfac4bf7cc1f268b1dbe1b84e05597aa56fe4d17072d3ba934a22c582688c95734d994249adb31f701191c10d8c8195542e01cf89d6453e1518c082f4ef29665330fdad917f519d843001be466f1e43918d327ed108ccd0022008f53aa04c6f0bf0a7165fdab98823aa8e727b6d7162e063bd6a4ad00af5d0f29565ca991c4e905094ba32cbc595b2b8ab2ff04b1c36896000128c8029c8850e43ec72213398389c8848e6422522102510792c8388441a3320c0d00204c82c2441402209010006041007ed924107bcf077e3e33c1df8f7d854b4ed8d854b4ed42312071c61821c10811000c0080000010501101296aff3774cf76808c267919008b7309eec50f1ba835461b1984aa40e422062189a0c8814644083220315101068000a4890084f28d18864460d03091d3b7ab0402bf23d4483df699eda952a02ea781da80d701641338908e922000000000000000002194ebf1b2dc2b719bee1c3f43c38ddf084e20750cdb6123657c00000000000000000840c201a1039008a088090000088a0893e01eba2b4a33595375925c0d7d0ba9d28239bfa451d34175247bd397c00399261ff35ba7fb6b171e159138e4fbba7ce145a4417f757f9e1848e842ff632f584131253e25ff11a5e03ff60454d3c47690002e792577ca041c7edadcff765e674e9061e7ad6b2cbaa025b9690000000000000000004433c1df8f8cf077e3df6152d3b636152d3b508c881c8088046045042001000044104429c95ad6afc6ce35417b547b95359633a09b53f8fdd490933358aff8bdf8e0a1d3358d9abd0bc9619883ed7011a0971228d522cd5d3b2a9d43a8caa00080a47fd143fc821fd410fe2087ecf43f4721ba350fc9a87e0c63ee531f6290fa8c87d0543e62a1f20500057b91015d88028c3f9361f80ba183f025668e983e0c70c8071b29f55984c0405b0b8b178a87b2fca0071a9d2ca4c835c0600e0be01d02b5256450388ed8532e207394011501545a664e46edc2acb820afecbfae853d6807f8c1613a0fb84a94400a400d396843c070454c9f8f26e511d8e7cbaacdc6f0487b29b8d513f53d3eeac9900d29c01f3f4201184170704a2a4b053ddca29a5d71b64a9a042c29b25ad5a805b09824ad31531216aed4a6fa84d319622aeff2d78502863c6980000000000000000086a58e38e5004800017e6dfeb3bbfea1900bdf80f1396de3d6afee343dbad0a197d7b990be50d4dff409dc6e3620f697b8cbc809fdb679b79b81bb1fe8407768bacd3571508ad7d9d5c57cf8393f666214681f6a245f5ef3a825eb50d9e399308ae0206ea404885302b1ddfa371f07e3267795d734acc9d01b078682243f662d3db3efd20079c4f6ebd6d2c40a75eceadb8b02c5b014400000000000000000114e0d320bae424192a25fa0e65defff5f3552fcb4127a31cd9418000000000000000004406100d0a09000b0090000222e8f23f81a63220f08c8765e1df1eb12157e4c02017f98a93e23e78ea26cb5e27d8863b7fb65e629db35c6a35b0b651d6e8c5e0647ab32b2dfe7be381d30b8c29331d1690bbf40c444817513ec780ca1f278e7e79512815aadef33bd5473ed84056ba690bf0f135c89abcc758d5f750430b15b1f34eafcef5661e1b56ac519ba50137a01f1095b54cb99e2867e6280b3834c82eb909064a897e839977bffd7cd54bf2d049e8c736506000000000000000001116a0471abc3dc06096a3231d2651556efc24424340d3493c82053822c20000e174c4dc53f03ae99851c9bc3c0215858c012591b50bb151e452b247ec9e52ebab95f12ff1dfd0cdd3a20e5d319fe70ef3b99756a66da7d775c0972b127e1bf400110c8005e)) <<< 16000) + 0x491f12d8f816c7bcb63dc5b1ed2d8f616c7acb61ea331ea198f48ac7a0543ce231e60d8f286f405693ed53179fbae62b3b021c54c70e40d0c23ac464c637f86ce2b746134b9a463f38b8c00c344892b65cbf2efa1d0ca0065aa14ca4d5a09c1d4f2573a27ea7fe518277bc8320d3403bdcf6f7e98f2e17f57bc2b7bc1cc454c2d210cbe2171320020316489b66fa2df552cf90f7d821860d2f3eed40ae0616286a8c1b92a2e9c137666fdda2ea1ce72f44701ff35984800098e8f9e066c553cc712d3dc3f2c1398af78785b290af4247482a773871c636e26ec9dd9c310f3c8cfb2cd49dd8bc800400269c872b46a834c3971e851064bb6132fa4f4df0958a05296199ea993f5468cdb09d153352c2a25c4f7c1ae5d2920c90cc9d1b575024b892a2543744e7eaaac90b2bc647804f0c159b3033aae39a2ec783150ca293da9be63648d24107fca5de84b2058ad02d1ce7f9eb3d0e687ab0fd6fd6557e89c18dfce58b578512dc67fab0f108b7b8c54e7c1469aecaa81e4058f182e0b838251525829eee514d2eb8db254d0212a2a0298cfc25c5a97fb145be235fb01008599e2867e6280b3834c82eb909064a897e839977bffd7cd54bf2d049e8c736506000000000000000001110d34d24f20e00b0000000000a0f9c98c8a0464dd4d4f62c4bb93cec5153a992876470b27bb289440cba21be28e2ccc2b44c3a24c0619e2cfeb3b389220a221b2ffd96973ee1cefd1f654ff45c6e8d3b2074ef56777b155136452e18d5a63b32a80637259b468117cbed140000004cd080011a689d9e89848031837abea0001220210040f1048784143c00be3b4fb1f8190003a0c67a400009121000220480200800002223be530000dc23bc1b0001d523ba5bb2fafe656051023f93443ce0036a006f400000099a10002032c143b8020000e834517ec6d4c9004f0fe39752c1d63a0e275302dc305d304002aa4cdb44004001025402200800009311db39c4e8b9a21eee7165960c4e31024f089cd509a498d668b30400768ef0f70580d34004a54000098908c0203b40a0f0050ec828760163ae0b1d6050ea82c404143a80a00020b23a65a000757200195a427cc40e82207301000bd991d269838b4c744f63a0631cf210e706b886915c5db204435dd093e83bc18bc090834cfa50e6c929390f3cd6eb3828b1408bddfc45a047ae1c9c1f37a4e5be4340a298e4a8392ffc2ae07023b5c93684806907ff3cee3a2e994dc23428622cc8016303ec7f185a7ce2a0f85f0b06108028000825ab0da9d721244974e166c67408197a1ba497e53f2692f614cf348bc4b7ad1fd82db3b52507e27324398a42860c675ffae041d1b06c1e3f260799a8bd57c45538af18c30abd303b10161128abdb3c588e9e08d9059459ec40d0aff3bc1826ba7a380f7cb1a580484989f14a8f21e097136b3b4844716f56871582abf07183fb3ff3788c01c05e1e6e4c2c64fd754f0393c59521f814a27078f3dfea54de950cbae40008219cb667bd275e1b3e5c21f22fe00e036bc89218beacb84b5ff4a0aa3b02b1380414cda547b86739ef91e003da1f45db9a4e9cb1b0598ce62dfc0b73a45b62da4c29a590f91d95348a4db2fabd23533a970cc0440e230465d35c5dbf305ea78aaf2087a6a5811b9d8232a2a0298cfc25c5a97fb145be235fb0100852c67d6846a40b32831432c22420800040015e6556cadac7d4baddd754e6c82854156dc95d0c3ca71829da6f68160757e90f37fbf6d8f42402274b628006cd0c9f37e3cb8e6cb96b8b8de108789c607b128300ca816c4bd0003db239a6b000a8623987b1cb298e50ac72427024094a0ce3bcc928133034093225c36cd7a61fd9a024025b2618f9535d37f2c8200cb3a948128e81022d480004113eabf2ca00260030d082faa950cc9f3c1b8811813b00392d4b015c72dc803e41f7066c0889f0d749183b32fa31704584c0b07860f12510cf498dd26f0c632c1b2083ee248530324a21785b1c308250e8e4243adf8713603b14180e05e634eddd45d66bdfe45110a013f16ace0206cc5f7952f80d3f0e80dab7c47f274ad5e00082082308842fe0102323572479b21ebaee8f6e880400bb76a067c93c6eec1b466da3d3c76088499f0412d374e61f5d9e210c6ab69152346b1031161e2eb8a0c8797057b3c652d7046a1c31b4bbbae9403077477c28812b399534001040002644210084170704a2a4b053ddca29a5d71b64a9a042ccf1433f31405b09824ad31531216aed4a6fa84d319622aeff2d78502863c69800000000000000000860c201a2061e31c31a31810008200450cd015119623ff8eeb1d11e85eb4b8decd0693a8618e0938f1336dda21220190f3b709bf79be7259fd2b6f9f7d3b92bc12abcfb904f299646a81e26ad0cb0d00022411c839f9722cf250c3850ec817b31829ea024c8420577bed634981bcfd80cd300254d6e458e00673d27180010401009d3084020000304709824ad31531216aed4a6fa84d319622aeff2d78502863c6980000000000000000086bb238af2b4c1ca40d59c20a91e71c52421620c22001a0000208043d907714da20e01c0f8256200f8525f9bdd2853ad64c17a5d3b001abf9da6f166b0eb18a6aa773abf53626f2cd0551eab5d4338afa0007224002c4c8007b01001281206ea21c7518e3208714f43886a1c3150e10087040400455a4013944822bcc7014637e7bbb238af2b4c1ca40d59c20a9e3d2262dc749e4e499ad82a6783bf1f19e0efc7bec2a5a76c6c2a5a76a1199641021200c00a00800008082a13ba2a7497)) <<< 16000) + 0x3f1563dfeaad454572514b2c8507d2300220086407701b979e13c91d1a039598dab6d6ad01404151be150150a86f444378121bb090001c4981c2068a6f61258714bd79edcb07685106c1c2cdad02470cf75a9e53e8e440c9731a3b24658b0218463d182e1050098fa297958b0400ad4844a411700145504040410a4dfa1ead200435791f89ee62140020ca8983003800015c91ba0de1734d4c864353085a9b9e35efc38596da57392c5b48645340000000000000000104491871860830430000404150350ce80c31989e44aae52e94b83b18a2489956e156a1ec2c52e8b7cddff7868e9e41f4696082ed0ea16dab843622f5143d3dc76e7f8c2ab9a9f57d6d76de5c76ca441044098df850b4e750d92c44fd4ee21943fae4815a5e955202ad77b447e9a748fd680aae329f5d6b96855a0aa22a8002781005d242020290728d18864460d03091d3b7ab04078f4898b71d27939266b60a90e30818e08e008006022808200950b54b919632c1ce0f509560ca32388864132036d9fb69575dab4fb41d3b464ff928644d671e8c748d8a65f244ea582f56508a1aee93db4399200970eb733194697b65b3d5d9c4150185a17fef740000000000000000011184c125698a9890b576a537d42698cb11577f96bc281431e34c000000000000000004321c62432031031c100000b38d48abbce3feda11f00751eed8f78c9628b2f95fcfb2842cfcb3349bb32a322dde3fcf300140bc9e51b7cac5f87203d85f4112e55fded67f9bd40ab93e040a5cc795c81ec60967fa8580294ec2a6d236ba59957fa1f3a0758372d4e79c05866b15837369409847657680035512341a8003021036557bd3673f18cb27d83b8b0364276f8e2480440000000034f82d10a3abcb1af70b89093dc1180000000328d18864460d03091d3b7ab0409633eb4235205a1238818810e006009050372f2c4357a74af6c306c1b559f08ee5f2962d6659e25916ba8591b7b4407d4ff7ff8d7ff0c6e1e72f44bfd27fffaad48cb51efbf6db689a8a791a964783cbc656a8c718494057f823243135781aee8440c495cf4309b14119db25e638c002625a0288f1420a8060372120e5050dc0280006808db8ac6d85636a2b035158da0ac6cc563642b1b1158d80a86bc5435c221ad118d60886ac26354121a90500039011a10de93db4399200970eb733194697b65b3d5d9c4150185a17fef7400000000000000000110ee30bd2494b3469fad1391f6544708d25b55c2bec921ebabb800000000000000000433834c82eb909064a897e839977bffd7cd54bf2d049e8c73650600000000000000000110c7145108047046045002c100200d1a8090d38486982434a121a4090d184868824342121a0090cf84c6782633a1219c098cd848668143320a198050cb8286581432a02194010c980c0016248c930864584320c218f5d0c72886353431892032490c5a08628f43126a188250c38e86185430a2a184150c180860804002efa4046eb480ba7a1ee414a60f62c6d333b905297cd6c944d8213e42a397d6c89d85968c605711127b9c1e8521ffeb32515211a9a8e0619b8b63053a30a0645c6d347fb60ed944132051c4144143180000023e050bbb24d54fa7fc5a270fabf15b55d3c369736de4059d5a17e9b7a379a043e81365ba49af1a2db1bcf7e89abab143233655abd28ffbb103f644b38f885794a7c2878850f55cf45aa21a943ae98837a609407ffe27f21fd6a491ca554b7407194e428eab88893dce0f4290fff59928a908d4d47030cdc5b1829d1850322e369a3fdb076ca2089231028c28c20e11601200e002080a4b0a7b6b7b192c36ef3c0e8841eebb458c17e2ee4dded826a95ceb33f5bb31e1c6eed16be8fd306950445919304c0bf002dc093038635dea6e2092e271e8b197f81ac22c4449ee707a1487ffacc9454846a6a381866e2d8c14e8c2819171b4d1fed83b65104cc189186146107082080000091fbe2e8d1c3e281a2b1e4b125036d7ba5e5588c7a0a20cd773a2623fb6b6ac872f8df0a1fb94432af49e9b9ccd1aa7741dcf34c1917d475f1630f434a8c08480010d880039711802d87a8ec5fc4788893dce0f4290fff59928a908d4d47030cdc5b1829d1850322e369a3fdb076ca2089028e20a20a18a09000c002020400ab488d1089e8fb4a1227074f46d4065c652e21ba5528ecbd52aabe122761718b1208496bcaa77d3226e56d46af8e8b775add2180e3f0fea7782903ae7952455dfa371f07e3267795d734acc9d01b0786822c4449ee707a1487ffacc9454846a6a381866e2d8c14e8c2819171b4d1fed83b651048b18918614800600200101ebb5ceb1b2b6ec59c5515ca07f69040a6828af8a493e9a063425fe3a2d21e8e6f86c8a907697874cdc92474512bf7835b8bea13e6da1270f61b812f608cd3d6eba3da9771bb4f31c30cb2be26fe9512b5af53a00c69ca64dc4449ee707a1487ffacc9454846a6a381866e2d8c14e8c2819171b4d1fed83b651044c1ca1c718714d00800009e8ff5db587cec7ed7b2bc6dcc499d5e0a54db5d7021a762200d0e570eb00d0cfc1b958dab90b12eb600488daed46b1d44cb6de46a9a041c0fadc1908a6d60cc45698f846267f630ffcfdcbd3b699739b5ecc5152455d3d05e15d6080314e56ab2febeecec07b464050e454c0bc4449ee707a1487ffacc9454846a6a381866e2d8c14e8c2819171b4d1fed83b65104cc1ca1cb1871871481012e00e7fd4d91ce1020e3bbd95743f4fc0e5928a9c117c9a7011b3c9942677ce99be05bc3d20637631545dae23a)) <<< 16000) + 0xb300cee88e073c83126d17f43c0040007e64014842fc2200084c215a12000d3422fa1217c0100087d10444d8bd90c5e847420a4a437eaee081a6c63a416f50810eb76c1228f140902a3377a5006085549379a8e0e0423b2b0a95c0a00712e8be65402005952427f7b32d42007bde284a3ec3c075e85d439a160142c55d539ab9b4a1429ba34597d53481651e0cf979283041f18d9f57a90c21b55513a2a40e03fb2516c5db05000e21eeece6810132cb66aeca00400107e654da9a48544bab2e898ad920c0b40c142a1af979b02102da36f5f1ce0e2051bebb9c40a235da8824700a19ab1d295140c10531c76a39081774c8eb1f806114f19b60ca080167272ee4c02000974a3be572181258500401790900012710004ce22f06b035290bb9285d8742ea3a1740d0b98085c804000fc045097606cbb13f3d8b894c22007846d547c0e80bc4449ee707a1487ffacc9454846a6a381866e2d8c14e8c2819171b4d1fed83b651048814710510b0ca0004023f44ce85d09954c9c304bf204ddaa37574bb1aa312b7eb02424c19d6468b7312d4ccd3866c2d6b8c66ccfc015f570d708ef431753d5b55c6342fe263d5d99d515c67f4e8e9a3fb26450d0f5cfb0dcf4bbb6cab418628d8f599af52feca697e4f58279907b098e23aade04c7ec3fca142a4301bc11a8783af3b20000000000000000000000000000000000000000000000000019311127b9c1e8521ffeb32515211a9a8e0619b8b63053a30a0645c6d347fb60ed944122051851c218128024041013fcc26cee78dbb0064f59b521aa7ed19a6b9b46a9a8103e83b08986220adc47a0425e6a3d761a22a4d668f7748e6076f6f6db06c1d5bef62cf6fd0248fafc99e2e0955257fdbb5e72193d5873eed3f0c50ff4e1fc31246b33bcce62da4b58ce2b076f86469944fc6d6a3e8efe19a0b97008ef53b5895dcd59719470eb9a7373d6463bf74886296c532e8f5bf14db11018e010f1323841de42c2b8a110a2dfed0580936477ed9202739d0332380a856471e002138e110043464050e454c0ba63c5550874e98994b3a74c4ca6531e2aa8309311127b9c1e8521ffeb32515211a9a8e0619b8b63053a30a0645c6d347fb60ed944133471c62851042031c20188fc209ea5b95125510ba677617051b6f22d1cce65f6cd29f0391d06b380a36143d86738e88b2deb5522f7bbc6963719c60e36c39ae5d50003ea22e01a16f050002d0116e090438080034c88b69cc5b0e600a73036318b594c5a8762d22b16811c13cc83d84c711d56f0263f61fe50a152180de08d43c1d79d9000000000000000000000000000000000000000000000000000c82288586582480400300020200276494087d40936697b451eaec671c6ce00bf996929ac7208d611b385709b1135cd136e9f4c362c08ab13d7d73425339e8271dadba0cc6bbfb7b66f4a907f58c9c5c819fee4a950c1bc693189404d6c630f24fd111f814b04bc2d259b5a8dd2d10416e37e72c3eff91a19b4cd30f379c69df8d6c89da65dc1a104c338aad2469c87fa4a438c1197d0ad0f6710346298f12bec6084be9abad4d200db4801e1d28201fdd8763e8e04014763cfc63c040401decc7458ef61477df2feeeabe8402a028611b551f03a02e09e641ec26388eab78131fb0ff2850a90c06f046a1e0ebcec8000000000000000000000000000000000000000000000000006422462051853041420c20c00101004811579fc080bb85f9c6941e52547dad49b2ebd056921794dd91bd71c3b9de21d61ceb0b6e7e60e3a0d4954d0b2f8ee32cefcbfeff4f7f7ae155a5246173cff38e8b384800117480036291661d0b2868590042c602000cef22c453a468815c40d76aa468815c40d76961159145c6e77361159145c6e7740e34d00746272e95cd4b69a00e8c3326e4ce2023e16f5bef246799b3d777e1cc16cec1a07f38797197959c9aa23a41a0f39870014d2f0f0c1100000000000000000000000000190c90c80c60c508904204040605a5b2e8a73fda05395d548c224a1f66b4eee5b01f029e3a49228a6e333a51e4cdc513cabe74d45d2b9f1f80c935910886486b9e3ef16ebe67b8a23bf0cbc6dde1e787d7d791f8bb1f765ad7ff913adcc8d91c3835504ce560f0e639725628850085840421202160010840081940420e0215f010af00857404000e7e45716606ab315b350013a3115a6d8acb4c560272625a99f7c405f0b7adf79233ccd9ebbbf0e60b6760d03f9c3cb8cbcace4d511d20d079cc3800a697878608800000000000000000000000000c988893dce0f4290fff59928a908d4d47030cdc5b1829d1850322e369a3fdb076ca2099231628e28c20e0022083b1b7ccdff164e78760599c96d0bdf1d725d31eebfa432afbfd5a3ce024e483cc8f55cd7028ff6ce9f584c519b52224edda9bc24871f463cbe827a7d4c9599d468c42b213690cdd5724392f47913add457d1b3b4995809ade20b2d3381bc252c5ae9bd19ed565d9ff6f8d1898a5766a6659fb3952bc36dc89e05d92f1d9b85734f84cc41339d8f603b829abbab1785bd6fbc919e66cf5ddf87305b3b0681fce1e5c65e56726a88e90683ce61c00534bc3c30440000000000000000000000000064c4449ee707a1487ffacc9454846a6a381866e2d8c14e8c2819171b4d1fed83b651048d20b20818514810e0040000391ec5fbceb03c73c7e5b20a348a69e6cd0d9a9df148d90e44d04d10ce342fea8e4b2f384688c32422ead6c3318eb74c8177f7ff5c959ac966dfafc948bc4126b827aa688d0915052a4)) <<< 16000) + 0x42599b9ee9317d9828f74d1b90b0a85691a20571035daa91a20571035da5845645171b9dcd845645171b9dd038e16f5bef246799b3d777e1cc16cec1a07f38797197959c9aa23a41a0f39870014d2f0f0c110000000000000000000000000019311127b9c1e8521ffeb32515211a9a8e0619b8b63053a30a0645c6d347fb60ed944133883482c8206145381044f30ac07bdde855739b2c08df12a8f89187ffb780da994a775e3e784723516ef404f366dd3a6b95c6ac9583f351ed6561c12e8cf999d6f4a28a26bd71f4eb008e7f12f76983775f7a7cd7601648550767da159d64025897b0eb529b455c04000db274d00746272e95cd4b69a00e8c3326e4ce20239753e4b6b7202f85bd6fbc919e66cf5ddf87305b3b0681fce1e5c65e56726a88e90683ce61c00534bc3c3044000000000000000000000000006433473072871c52c41010448233120a65f5d38280c1f763e2822e2eb4f2a943e583c8a51c398753d04da52b1184ed8d126d6dba72b1031705f2eee312d1776158e111c2bc11ff0577ece7e1f70ef6d4c3a3a805156010aa8080014a08a7028550042980200124a20e2731531dd0b4ab33b16102819c5e534286949a756290102839fd1228249349ec684029b8e78bc02281314110040548142a20a0bc050a80082ec04174020001c7229e8bc4449ee707a1487ffacc9454846a6a381866e2d8c14e8c2819171b4d1fed83b651044c18918610510b0870011269e01b3f48206b590e8f0828ee91718c76768da632a5ee9875eee54980e8d043d1c3e9166c4f1a4d91526381cc576b5201e60ee09df12b389d300f88c4b9887942a4ac55169b824426d040d1d382746ec974fdd31a5611b711127b9c1e8521ffeb32515211a9a8e0619b8b63053a30a0645c6d347fb60ed944113062461841443022c21c114104412049181a21325ffd2040d776c737313b7630cb5728fa9296282d8a7e7d370dd9c87e87ab0743d2b0515446d14e050a68085300400063a74d00746272e95cd4b69a00e8c3326e4ce202312852051431032021810c1080047eebef347293cf20766d02d86c24fe5ed5799d6ac5dcc123188942f00409c0214b0105d8082e80400047a41e8e60d06a08d218004fa910825c89d1a6e99a8c106ad29db2204468b077294010dd3e89600248384401014a050a48285200628e02146010a280851005629ced6358850a4f35d8ce902942554aaa286c442eb5c0411a926afb45037297310d8c0043450fca00802139811004291a20571035daa91a20571035da5845645171b9dcd845645171b9dd038d3401d189a4253cffa804c3c0e64dc99c408b85bd6fbc919e66cf5ddf87305b3b0681fce1e5c65e56726a88e90683ce61c00534bc3c3044000000000000000000000000006432c52851431032810c1007451cda2e2c84028a32b62ed52d798e702eb28367cddff0a49827e87ee525d19ac5ad765f48f41d7dac68a0b03e560ccd7edc4696cdd35f516fdcc4d85b40a3fa3ae5031b93474ead1126d4a25756d74422760c16ec160f908c61e41959b210e5861d8f5ce85e84850c24178020bb0105d008001bf083414800229c885968428542122a10811083888002a948a12ac0d95606a8a141410a01e84fce701d64f41ec5bd1aca461d8626a2c0218c952ccd57a7742357efe18272802f423feac61621ba7666eab26701635d899f7ca660bfcc7fa3f5224007a0c11b7d32a32bcd4af267a954bca5dbd76905e70644113faa128400f8abdaf73afe7f73977029ec301e1d5f13f55f70ffc0ed93b3eb28200006c2120d5d18011ae5c93b2f09e3dac0de86891bd1df62717130cf843bc07b78aee5ef2cfbaa509741c621e4cfe2f6d94861cb7e564e84854a40bcaa75dcddcaf9c268acf60180f73a22004366554889ae5b0a468815c40d76aa468815c40d76961159145c6e77361159145c6e7740e24c4b533ef880be16f5bef246799b3d777e1cc16cec1a07f38797197959c9aa23a41a0f39870014d2f0f0c1100000000000000000000000000190c81cb18918608204900111569eb8f07852de9366c84a747bd987bec380435a53ce9495e95c020b805982550f0f5c7a990fda035d5ee34948b23919300e3bdc16b096bd7a565fe8b2e1d2fda6a5ce73fd5edea066b399fd2126cbbbd871cd1a20ab556316851ad8d110f5fa324609f68aed12202986a57090cd07aa20a204220e16070c17a1caa990c00f3767ad0101042730210080000ba10bd1505e0482ec04174020007d0227c9313d4583422e09e641ec26388eab78131fb0ff2850a90c06f046a1e0ebcec8000000000000000000000000000000000000000000000000006412052c320328128018004000444047df86cf9de6612552046b976c7322a735f4d74eeef4f2cd7394912353217a54f37fb2162cedf6e0eddf002bf4fe6306add730f81856f74ce1316d0a0c4cad3b70a1052b0d89b890131e59d5c8b281b8971135de102004d3f0b680003cbaa5edf000af37d7f5844013cf844a10200a656fdae9db1e1380a02f454178120bb0105d0080008f483d26c00193085a2cc0d96621e4b912dbd6fbdc712b6b85e78a03ca4b210c40299493d8c10001090d0800202780a08d0509d8084e80427202138014ecbae3c6352699b3df2e3554b7315ed916cf7357ee8fb7d2b8c0000000000000000000000000000000000000000000000000000ce258a50a40a40650230020020008806e53b69082f2fb2483672aa0465e28a869659f7c94db99e6a1e48f6a654e0c20601d4b70f1286956d176cfb3a6)) <<< 16000) + 0xd74682cc35a2ae0899c7483a47699b6765d71e31a934cd9ef971aaa5b98af6c8b67b9abf747dbe95c60000000000000000000000000000000000000000000000000000671347307287306285104303200001130480200d9d975c78c6a4d3367be5c6aa96e62bdb22d9ee6afdd1f6fa571800000000000000000000000000000000000000000000000000019c4e2cf24e20618d04b04e00c001c06008037c99f3d88de1c429ebe4488e14c148e46a5825e07a48c240359d7f85812861080400004208388484cc242640a9d975c78c6a4d3367be5c6aa96e62bdb22d9ee6afdd1f6fa571800000000000000000000000000000000000000000000000000019c4e24e20e14f0c90c30ce00c0004c0a0080378917da5ce54e213cbb7543385f28d10010f0ceec77d0434329323a75430cff77742c2400ebbafabc009c50880200002da41a0560007a640d476000f2e44dca606c5313629cecbae3c6352699b3df2e3554b7315ed916cf7357ee8fb7d2b8c0000000000000000000000000000000000000000000000000000ce268e60e60c50a6064003002000961d0eb1d90a849c08123fc4969c20ad2b084aa264c0d9c0923e41a23d0f89610a56a8595a8541792601e4a4f30a808929f17bd29aa6f021b1cc3b4d2b3b2eb8f18d49a66cf7cb8d552dcc57b645b3dcd5fba3edf4ae300000000000000000000000000000000000000000000000000003389c59e49c41609409009c018000e0400401be4bef9898f8e22d4f78c0270b0d6f723a2c11da399e4100866e008b8900b61c9218013081080400004dc89a8ac4d0560d012071090998484c8153b2eb8f18d49a66cf7cb8d552dcc57b645b3dcd5fba3edf4ae300000000000000000000000000000000000000000000000000003389c59e49c49849c41e21c0180080018240100689882f8a05c7bd241e2347920172c1290fff8e27ddfd67c9b1701c42149ae2e264843c4001f09242bea0480007cbbb7d0de8000191af58d9fb000474d46283304c0000f990004612001100400324485e8482f004176020ba01000b979001b4722166a10a150848a84204420e22001d34226062003265225e7a12e3d0969484b07400c8b844ae161fd0b0443d0951a800c052625a99f7c405fb23b42d1ec8ed0b39a79fe6e4d3cff37184588893dce0f4290fff59928a908d4d47030cdc5b1829d1850322e369a3fdb076ca2099220e20e18e09200000001ec2816bd1276039f594de075d4fdc7ca095f8d79e1709b04c793b41073073a10b34e2970a5d9520a897fcc7aff79ee0380b01bef628d9b1bc248ed7161fbdd080232bc61df70193992693a328c9a52ecdc2859a58069fe508d02a91ee6c58a43823032f2996cae00b6c7cc88fc4ecc46862e34d3c65a04800000000000000000000000000000000000000000000000000196e1cbe47424c0bf647685a3d91da16734f3fcdc9a79fe6e3088c81481080c808a0010000040706f15e071720af8e0751b9a62d467e437722a4c8f3208cd646d685bae010571977ab5508aceaac910b554e315c7c06ff63bcc2f57f54babeefbf12613a2afe90b89a4d0b3535e6b4b7c5d8f4dd17b24060dc078448c7fc9fb6c161a495f336e4867310ade692060f4006d80000012981100404a41625003e4af889334358e314790c54f55ab61c07e686b1c59a1ac71a71e3cb3eab56c381ec34ec59685102ccb28b14908808d00400002028bdad491f3751f80307adbf77984c1bd00646955e2e5b6abcd65063e536d3d8b2246db650162f7d792c52d6cbda905041f4bd17d080a2f352937800004850460101271100008319a1ac716686b1c69c78f2cfaad5b0e0784c10a10904704404d0080000002aa1aece3a5c46b5e063759c4601d43d9f342c62d2b7bb55a97a409d101b36da2e60be1fd000210224c4a0006182000ef84494942483a000d0022469b12221c081a7b481b0e21b484f23c38430dbf6a3880ac92779563818f1fc7f9880004a50440101210189000e462fe261ef460d52ee176b1c20506ed53060ad66df02c000039abd8b0000094908802124013d400aa58c0bfa838c8c1970b73094305614411908e0085a56ef800005490880100002306d408e35787b80c12d46463a4ca2aaddf848848248a3042843822826003803000004e0e867daa79d237b618b57a8160831ec08d5d9a7577679828691328000f3911f19000231911e2108e8e8470742363a11a1908c8484600422e0200066b2222b311625e9a00e8c4d2129e7fd40261e07326e4ce20447720a5303b905297bd8b1b4ce6b64a26c1090e10c10a110006000008a00618a516e28d830595b5ea0b3f15d1ccf41c9f88e920dcebfc05efb8857b0d57177df730d8bb4c7a8cff8c4601f85bcc560dfdef77da812aef9a78d034c82e41212f56d46ce263d27132e3e3bda243f06a0560a621680021411156588a02c44c17b2025fdc8d2129e7faa0130f0314eb0287811b724c96d5a5017014b59c7f5e7c8d218b272a2e4bdd1c0576d321d6339375800000000000000002018c28e18c18a10c0808a05163611998a18fda53ff1ea385718e14233c3a166a1234843ac255dfd9d27e1245b374ab51c09342068dc87818baa00726291d0705c0b0776d18fce16be80504f8d36159a3403c5eb08dbfda611f1ec7f44840fa5565a249786829c7b9b57d94dc6a81cb4aa47364c80694e96c7667704734358e2cd0d638d38f1e59f55ab61c0f10e18c18610c08a0008318e5ca370d871d55f57efc0bb13bc27d93ebd5de95084237a9af99cea970512)) <<< 16000) + 0x65fd0b3948c78fc19519c601520326c8625f7c15feb2ea0111c15b21b74d347d9571d6c2c36032b11bd9aac3b12f4c80adc63ce60538ad23280021391123d8889ec0d4f62204b10f2588702f08066783bf1f19e0efc7bec2a5a76c6c2a5a76a1190e18c18c10410a0860840800808433d9721e86ef126cfcd7742e55d8fa2c211644c1b8baca7346c136ec8097f723484a79fe31932b794993726708466783bf1f19e0efc7bec2a5a76c6c2a5a76a11ac60cd5b23eb53a18fc96922c60cd5b23eb53a18fc9691f16877f73919b1af824cb61716877f73919b1af824cb608b8630a386306182082280002021de05896696dbd7cb0f98ecb33ecf12a4e7eb72f2733a68f58cfffed93de0112520757daf9581d3a06834abeea59d13464e12598b2ac24904611fed1c649ca06cb0f4a0ad7e4a56331aec158f6be75fd1a0c1bc996355f5028002e6110d2d08614842ca4214321091508408841c440010da44190420a82104390269a8130d4094320012e12206eb10251080a2c400e61fe730fe3987e9683f0172285eb19018fa4cfbb0427e1599fe715a3729e221759612e550432a556daf96eb6f4ae0b071e4fa7f6d36029defa19eaf5d5f331f0a6387a1e2d462e351110eae886201218e2ab8572891aa600f748269de0b5384c21e718252deaa8e575597c1a9f401e2446817871665cf0863d861bbf66e523f3b68631000ee4a05dc7211326a04a62615281000d3094a4ebebf5fa60310cd80130b60f9755b30c8b64c9ba0d4c1765f5125c3c85aa624fd141ea933fc381dab3241c67fffae726b756a3b80181fd42d0705d013e68000000247416d6a8eb9a0de5615d12ee64756c4fd8dbd846a31ce2ac0cfa73ca561a1934b2ae1cc976576b29f76ac0ee9d705e6e49042f705072a47269371a1b5a13245d5eec420006402d3bb2f0b67780e1f037a87b0750d9bb6a173061cc135ae13d9180a336ed3cf1663ed92cf0de31617e8d3c24ca86621eae79c23dac0fa8582120342107bc611b551f03a02d3811ee70e2be81f89d43afd4a7228e4c517ed3185703b978a000000000000000004221c62842423002c0240010100a2b07cd06d7a99b0a6bb81062c988d189e4935c2e71ef79eeb4124427b333039bb690e2706d7dc460d439c2a62ecf22149bc347250f06c9c02578cf736be585a719ab31e5d13777e8dc7c1f8c99de575cd2b327406c1e1a08a686b1c59a1ac71a71e3cb3eab56c381e0eacfd38ea802d99e2867e6280b4cb88f5bf9e7e94a4d81cd05de34e3a9516ce9e476aecb51400000000000000001054b14a0cb00800003779c7c13356fa5ff3f3497150f4d4a2058e7454f9fbe98e006e42e6ec38176c8f571f3c90d1668098887234fe47dd54ffa60fc9569dec7043f7406c95eb5c2078f58b6ac151e1e60af4c654293647287d82fc830127d9d283546983c828034e42470140c742a2af0c0e5769d3e00000252c2000800008990fa2101b0e83e454000d924002b1487c22c3dd161ec8b0f51d87a0ec3cc541e42a0f10dd08e808f5cc307ecfe825e12afb56d16ce650f95bd1462865533287cade8a31432aa111846d547c0e80b8279907b098e23aade04c7ec3fca142a4301bc11a8783af3b200000000000000000000000000000000000000000000000000190c91461490c304b00a0000000000cc27b20c186a864cac0a55f8c436cf24b2f1aac57b783bad15292b33eddfbaf2cfa6af68d6a6511a7eaf0ab0f48808a53f12ed37bd54e9a4f705590edf49fa20bbf210330884e1e2dbe3c981c4ea190e2f7193fc08e05b971dffb656557a56af567e9c754016ccf1433f31405a7023dce1c57d03f13a875fa94e451c98a2fda630ae0772f140000000000000000084658a6044847026027000004956311e70762b7c46b1b5947fdb3ead9df341e5043f741be4200edd5a5ff650668ff55f510b858dd5436a426840ca5fb186495b74705495673983014b9cf3cd0c88cf57e2507a6209e7134256efce4198007aefeb900000098b084021a1ceaa47260a0ca33b3df268418e4f4db00000232c2100800005f100021e3a089f743bc658215504433100ad6f7ee104804166a5cc8205ae420e5c000004a58440100f00107780800051c8771cc3b4c61d8630371d8758483a8078193a510679e05ca7ee9a0000044504001080c0080203a4241d00381000802000008886e0c800027881b16c39ca61cc02c0df12a933183327f2c10b06d9e308524186afad2800024201e008680037a20de20078f8a090101a7a04530000463840010a083d4f7d1e7881ef6d61e78040dfab44301e37051180481840010918e30dc08c2f18dede02418360080000743c408b05b532221fe925d18811f5c6bdf2207c06f170804820400100000d921ca2b0e411800142900035321c62a0cc150710a8384541960a0004b021c07ba1289f65c1100e87b58298c097274d21800463040010c18a87c502c90a316ea7c860006ea91ac1001d9cb6aa804820420109143dbee0f048506950f6d0220c2100806f80800025886f0ac00068886e8a8370441b6220da1106c888360441ae130d605063008000ca8838948354741a8120009e92002324434cc41201a08e01000c2010d269868b4c340f619e5b8107ab1168a6fa53c120931010ee0a1bdab4d57ab99110813be3eecabe959a637c10500cbbc7d14ab0d1b110e54902a0a3837473c784dafd98a000b4fe54df04d06144fd0000100d7cc5a383e4cf6497cb403c62af74d538cefbd2bc24b86b20a14cf19513c2e134358e2cd0d638d38f1e59)) <<< 16000) + 0xf55ab61c0f333c50cfcc5017830c6c423f3b508fb0618d8847e76a11ec3c0b1c8677294ea887816390cee529d4e219a049242029819809c0000295a4f189dd8a2a38b23c55f41c6af22f434dc99683a77369b607223d7ffc6f0575735236dc00a650d4176d60f771141bb09817b39df73fb29f8a8c61e86b580b0296e9341c1b111e36e260629ea96e21c0881176dd66029d6a628d12092b0bff0c0008013181100400005388671ac334a7fd3c72b35980b6678a19f98a02d85cd3532190d4c216a6e78d7bf0e165b695ce4b16d21914d0000000000000000041c18636211f9da847d830c6c423f3b508f61e058e433b94a75443c0b1c8677294ea710d101490ca04304e000014f1320ab826f408f98e8dae6e6b9554da0088819f673c85dd1a68d2cc4d51cea91ca74f926489bf06f9e8c21fb0ec55baec0b8beed460e02dbbbca7776426d644ee75b07f78158a9bd87633c727de30da96a625b733c50cfcc5017830c6c423f3b508fb0618d8847e76a11ec3c0b1c8677294ea887816390cee529d4e2192029c19a192192114086080021c386091fa0364a1acf688d2665cc79e19101d5dd85aab988b2a691772f6416fb71ce49d095160ace6065dce59724dd00032e206c4a0cc2106582800241cc860680a658180b7a3384c4102c2beeea892016c22fd624007323323e0c004c75e6ae08114a6725c0008200a4e804401000018320546b0712181586bc48634e81a1000d71362dc04024404200880be6c5581814204a91d61820770db11340408c708402111b46187c049183d37e0aca0c3521bad4305879362740090508002018e1388c950e7bfc2831a335d960c193f0bc74d10232f1138e60007f1667401094608402000021e400086c80017690ca2586490c32015e23a4ae37476b4f4ede78d601d024a7c1eccb2a34289112628cf174f1126e66a70b48603c845d2477d0e08cc73ec15cc25e227e6fc790b1f7d20a3a399ac08027ca44ea1be29d22b1eb0b2de65f4a9194f06200002073d69bc0e9a5032f1091a5813023c53d4ab501089f98cd168becc5cdb2780c542eff4f67305c58632f6ee203ac001f77194972d5938851343d080ba4dd6c2f20548ded6940c2bb38e7c7481035bdb16c404202426fb1002722c9d78400cc348f6401009c90840211180289628438d35e0fc7724515c9f7a8921aab4e60bc01090708402018e1391869cce6f038d96bc419b24527485f339218e320aba9102673b2412000129010804000044880011310003b0218c02000859218a6b05c3586212801494186320c20d060848003360800ed110714906024c2fce417c6a0bd2905e0682ec041740200219c208adb0ac2dc86a42932de901a7c63ffbe403402408ba0a0911af9fd4300119efce48000200129e1100402e426170130b7016678a19f98a02d85cd3532190d4c216a6e78d7bf0e165b695ce4b16d21914d00000000000000000418a55058724f02f0618d8847e76a11f60c31b108fced423d87816390cee529d510f02c7219dca53a9c43418228024014000001400c48ab0b07cf190a6e0adef9b0973570ebba3eb79ad191b7d384b5abc096538bca2a0dbbaa0e2c0e2c74c132aa49a4ab414e736c270537f391096bc38f44636675118313dbf822d6eade1dc574f3a1688e1385414b9516ee2cde64ddbdb3b8f907f4bfa5db2a73f74555e12139f82cbca6777bb71fa211151124ba6803a313484a79ff50098781cc9b9338811333c50cfcc501714aa0b0e49e0599e0efc7c6783bf1efb0a969db1b0a969da847830c6c423f3b508fb0618d8847e76a11ec3c0b1c8677294ea887816390cee529d4e21a9019a114006000002158e4e89bd0396afe72844a579f3275944eb3e3d38df4e01376ba444a73b51705019bb5d44093f4d43e09f709aefe75de288cf72f4fff1d5b09c5ae63cdfbdca774932772036da76b076859792ae1a439474a2e0e0ea5fa103c45519bfbd14202593f8404047b6d15dc6013302edcf1400ac1affa000a04c5042010f1d951a536860fdab001f62852d39a2550c28d0a29cf440452eed13e0020129410804000045882316ec69a7d0d21cb1425f356b31445a381eca060c22b86c222400e11af8ac0000025302200800008f9071298001ec10442105b0a800269c80083a10364105a9e819cc41685a0b3290590e8198341541206509058848190240c60a0b005057828004c64e9f05a2147579635ee1712127b82311451020821c10812001c014004010da505673a3d3cfa190f526e214ddbb8aa3ee891f79e3060b1a44bb423a023d730c1fb3fa09784abed5b45b39943e56f4518a1954cca1f2b7a28c50caa844614d92d6ad402e09e641ec26388eab78131fb0ff2850a90c06f046a1e0ebcec800000000000000000000000000000000000000000000000000643285203102201081040040195bcf1e720f34405ddc151758d647a13e8dfa81977bac2a20300dd216d7f9d5d8e7012cbd1997e2948200da262fc5ebddd34e04c0b0dfccb05e76b649e04723104f424028b9e7f708690cbc0c180b225b5801ece91765f433a469895d95aa15c0a0ad0500033110ac15d0c28308596e82f30bb64f15466989e9ce849b11392f67f0cc07410243368b0e0dce9daaec2b3acce89c1202d5a6c8c9caf7c8be63d15e1201f812f2f81d1de506b40dcbb8403d4f5723cea19622438d5bfa40802c6db1b9fc99f86d8c3b69ed9c84e516ce95ddff22abaf6587210089129209f6b4508783cb62def57ef9ac4becc714ff610256375ececfef79313c4a9bda4a23e2)) <<< 16000) + 0x11d362f04af15f7e0f54bc418d12c040a0f38b6ae9c16d66567b6ea26ebe6556078a8d705909f960d8e9249bf1e9939d3dc5f2296f309ebe24f48aadabd2b58cc62fde2e7bfc40721d53ef0ea6fef96cb820390adebd1c0260db00c6d48bb75c8dcea79a39ec75877c5df9215aba4e09a4944ab0cfcc83e5dd2f2ae774c3e30e9482dbca388cdf0e7b20d3e234645da252bff480006591ab3f935c0e5254d028022b09c0afdaeff456a82e5425f1fc922dcb938e029335e532a4d16f5ab737fad63f41ddfbec46f8edcc99e740f5bf29f30acad3e231a443aa9d33eae5b2535a5cc5fafd4d36f8c89ce950a9266f325598099154f3e47d83b4326fa8402f270b21069c2315b7a25f60ca2f5dfdc39dcb96944340af2800083720ce2a0ab090330282a8140ca0a064050006f81005398221882a4c60c0620a83185398c0d4c60bc5205d2502e12816c7414c3a0591d0528e8290540a81a0a3050288281401409e0a0018032144139312d4cfbe202d85364b5ab500be16f5bef246799b3d777e1cc16cec1a07f38797197959c9aa23a41a0f39870014d2f0f0c11000000000000000000000000001913811ee70e2be81f89d43afd4a7228e4c517ed3185703b978a00000000000000000426d5a852703f02d4814b00a008000100222c2b82666b316e0461c867fe948f5156182e4b50fe5e957785029bbf9e412d7998ba657f7e1d145d7ec60f5024d911fcfb8f89c0249313f2e73fc172bbe29f50e8d38bbd124ed9e1fd8fa9e37197620447f477c55afbbeda1bd9694324b9e9ddbd9f8369751067d81b0200100461b54287d88b1030f9888cf038b2e89540008c7080021640302559ef20898fe9cd8880410df206c0e0827c1c5aa000120e1180400003ac8000dc1c0cc5f3d4bca0c1333dcd8e03bcad0cccc00a8ef4b6800905080021002c6a17cf0e0084172b4c2208200084020040100000447443c4d6bbb2c4220fe01e380b1346dbe2407794b6bd0240c2000800006b9043118000e110680d022068284040005ee42806413e2a09e0903a028274040e60200058520d843807c893062340000bfb006022e503070230c1e00859003601c2e58810a6087c388184e1c64205ba47495412041000420561235d0648015e7449612082000400003d900016b2138230371104d88c268341321a0980d03d86825c1412c0a0950504a02824c0412402091010001a89e0c688358e82baba1523ee70aa6c475a044d3ca6af8e7dd2df35ae70ad02d3599ccc08335eb68ae054cbd87021e579275b3a9df0ea83ad1bcc2e46f1c9b4aee7d0e337ae0b15afac3d377e1805b3eef04632914027880800c2c77fbcb7849e89ef748042166ff4657b6356cbec38b975176334178aba48148e377f24fa82f71dd7f856527bd953d11806d99ac2ea9f03ec2e1dd8ecc628cb3f5788aa2243e5c96ad28c873369b8a0baae376ca6dbdfa5446a01fa52c1424b1dd95aaec40db83f6e17d3230fb556018cdd2d6b6d8c3eecb55884729a970a0a4116a7b848518b14db21024e5284578e0bdf715c741101090b0840201200a08f010470080004a883d1cc1a0d411a4308c01800426908b5184528c2254606ca30883584392c218850200100471e9c8e0eb428bbfed922528308d6dd821c01c270662000a0a108022020020080850500001b9825e1abc3c4484125c080c18011d0e433a00118c1100400002d88420ec00085484192c208961022a0701583606e013f6b3f742915b378b880fc66cca03a86ddff4aa43143012219bf0df3ac421ed4e0accb547ffc28ac49c25206d1e63691ded8c4c3032ee70a033237ab474aca8cd878ff14017757c8c9f36cfb0cce72e0ff1f1b20b8edc7dd0e670938ac79f2e95d31a75ad291c361726da1473744f6080001272c74dcead44ea4b11ddde7272539a5fcfa6123a082b32a32f7405f99749915a90d48946f6687371d6ec21cdfb72b63b288bdf249d7683825f7fa296a307f1885aa8cf26971f4352cc60bb1ac8e5e4cfc71bce4f1f2ee598a90abc7f742c5be614feaa33aa7ae7669c7ace08c6e99c1c712e594942851fd7f053283196df2a1300d76bd6a40109060800210100100404002f014871321070079c754e450230f8289011860f804300722c4f7080a18266d844103a010c25ed16fa0680a0060e8844103c010000078200021240d8360003c240008cc83f8ec1f8760fa3b07c19d029ce12fad555cf022567dce9cc7811a2d019d0970cbfe7a8cf7f3062d8c717eddd915b5817e72a2f1fb299e430c5159378801006ebe7b38326209a04bb54aa300e03db64c1b00fba70c887950b5d292dbb0be8ed6ba75d1a4818b741be3f403cc609023183d0ab6294083992dde36cdd30c705240a0c49c987a794cf76cca0000243729d283c1d72df7d9175b5907434f4926d05f38482f1415fc00dc7d77a4ab536d5751c96391c91508abe0e902e2c954ceb3b93a4165a2f4e28c1a8756d2eeb585bb8e9287759a5a093f08a15e722f2eb2c3ae51b0c837f00ccb38692f8da2b58b2b7d55b00d5617c733212469896db5a0d54d5e2318e731cd0897d5d61616f7ae864d17498e875243a63540a0c6515fa921a7ba4353c87661eb66a1c88be512a1cdbb4bd02e017c8df0cce0995e037829f415728c108bf774e1bdc28632d6dc067d400158f3a5ccbd9d53e1ac6a5b5c4ba46053a39b5c21058d6526209e46483905ab2c017738174f74fedba676807085d1864b7a547ab08407f83e032ced8ffaf0dd9f819241315dcda669e41566bbcf0b96b4ced5a62f67e75680c)) <<< 16000) + 0x71015c22a9a7522b018c56085d128271fd8c7b820afd25c79289c0284622cfc688e6bcc7ddd594549499c2a08f0f40436404bfb91a4253cff540261e0629d6050f023614d92d6ad402f85bd6fbc919e66cf5ddf87305b3b0681fce1e5c65e56726a88e90683ce61c00534bc3c304400000000000000000000000000648a55058724f02f83c57495f63dccd65ca33597241a53033801c0140002452e25ebc1fc19f5af6cdff070477572740bd597f65a96b4d804e96c7f9701184ad829878811faf17996ec507beceaffca0d34ccd2a664e0e6a4337e91704eac22c533f9bf911c4af22ca20dacf3bbb16f339cac2151f5fd589a832ecacd81c2aad92b9028ab57c853033aea9754403f8b900240024181f00800006c900073220862b000dd920883a001607200334041ec540041d241e8a40f2420782103b8281d8140ea0a80a77430fe9004787af5f000000088e07c021614660693cc808552969924023bbdbad70004008cc0840200e8020730100007510723d8389ec1c0860d833808fb1813c0d046f0da6308041835ee60a02179e04b800110a1610002243a2b5613c3070393e868203c25f101800011920f80401bc05a6803a313484a79ff50098781cc9b93388113724c96d5a5016ccf1433f31405f0b7adf79233ccd9ebbbf0e60b6760d03f9c3cb8cbcace4d511d20d079cc3800a697878608800000000000000000000000000c9830c6c423f3b508fb0618d8847e76a11ec3c0b1c8677294ea887816390cee529d4e21a9421409800a000026c807e59b90f4ab052ba9e5d76576eb66d0b1f187a54b550705a8918f7ab18af611fc478c1b3022ec311f3024d663a567aa800854c6c28aa0bbeaaf21ba892b4d6fc65eaea79a1d7ae5a876fb742026a201b46c61394aa86695efdbaf4a68359e4fb15182c8d93cdc0e4a39e71820dc484b9ad7db15e94d67c4820a7fa50f54b6dfd1502f553d3483829537847e8f6d994da482ff64346f26a7157776002c206264c978f17bd5c2123c9782465c3953c72a0f350a24cb8a3b28c754c88890278acae746eac28a00602369246f3e301b7e0955876e722bc4e0c50b620106e2092159e9b654aeb0a046b61ccfde6f5ac7d80000094796e615037dcc8a2696066938c5d3fd75e5be5a0d04bb697b5efbe6bc3c0e7d055566f2dc5252e233c717cc5b690a724c705d8094518b836904da9faf4cc87ae8b1631024981dedb2bfcff00c8509241831401418e0c0c48b71b8670028b32c5a1c0ce423ba1000320e10804207978de047f261f7a13929e8c81ef3322978f758cac7af090c25795e0bb2ada62e3c3a67d6828058ba46b757442e6698317f6ee3cf2a281bf173e9946c39f3edf5e15c0ed2887d67c2693fefefc5535ebcb6b98d27c4a2831e5f19167fb2c0c0c094fad6c804f92a1da3a86faa482b8dd0aa793e8dd9bc76ee5da7e6ebb3a0db8d9ca4de852d9c5dad86b62c8dc480000bd3bd13a7a1b0d99c040f0ac177245882203b54826c507e1ff78c1baa8ab67d31424b002f01923a3f4d5f023c7aa23957c2595a284dd85ca7a4b7cb3c99c1ec8128932b0e6e5c2ba3fef24adacb9e9ed5565cf71484b434631d715480003b390008652001dfe4005aac800bc790371d0370c81b4640d82a06b010350081a40400324641a0d400367e419ce40cc320651503208818c4400800040d5440c49a0614940900401140a39f9a4800011241d00400002d100529822108180740be2205e0d02e848170240b61205a0902c848160240ae0a0560502a828150140a60a052050288281401409e0a04e01000128104d4502622812ca40943a005c18201b088404266cc088f726d998ee4bb70e1f789b69552a9cf50307254b35e388bcae50a0b2ba3ce43f37a07828064edcd1e04d5bb58800b25a00d84c910b418049754326688cbb102a08220f7151b3801f33d4aa15fa9bb8e96835ac2400ae787c0e087ecc5a7b67dfa400f389edd7ada58814ebd9d5b716058b6028800000000000000000229c1a64175c84832544bf41ccbbdffebe6aa5f96824f4639b28300000000000000000088438a38630628238008000021e8480211b1e0b8034000b6881b20812435a7c168851d5e58d7b85c4849ee08d2c67d6846a40b21c52041c31831401000c01050a52535aa8b99c30337a84f5feef06f47d2778a59a06e1bad6b56f65ca1e45db0fd98b4f6cfbf4801e713dbaf5b4b1029d7b3ab6e2c0b16c0510000000000000000004532f62e9cf8953f128ef128acee3bd9152f7afa819a23ac0253e00000000000000000110891ca18914614908800200b820080341201408e0b84786577c632c9f60ee2eee6ac4262c0d811333c50cfcc5017830c6c423f3b508fb0618d8847e76a11ec3c0b1c8677294ea887816390cee529d4e2199659441431230c090019dd5b143665e8524a2fffd4354d31e7b52f1fd31b26191e967c182ceb402a6915316e358df355d7844d5994b76d2a67f9c9c710a67b2facf12cc6c11ee6dda214720c33078a19a23d31bfbca0dc3ac5644ccb084ddde6e15490abc02c70a94808015752a1e060400e4e1c1e0a3821400a01181400034e400178881b06c114360881b91ebc4b0a668915d8993f8e081564062155420403a98e3247002c13d536850009311e83002610240086944be5b1def18531ff9c55be611fda5a9ddc982a6de7db72450439a5915ed120028e7adc2e400adc2bbe380c000d49c12d5480026014614434686f8530803410c72f164001312d030c14d3ffe144c5841aaf12fad2820007a12001804ac21)) <<< 16000) + 0x6985e700250080000bc1d285f1cb8fce230a3fcc897ef28c22831e5040853052f3acd96db0a0847e348912524002ff618b90c800d80c980e571800176b143a0322000a808185cd3532190d4c216a6e78d7bf0e165b695ce4b16d21914d0000000000000000041130a3082c8305282141300040c0000803400064c8001c2904301f16064e6034cd2d4448e74e9a4e56d20fa22c82ad901ebe68c7a02da6a0a0016c5a39b120234a3a4dc9c008c021a59739122ac09a48334026d921840b3df3db04164001c9c383c1a31c8080ee719a05eb3b3dfdc0a0002aea547851c00a005000032078b0df86a1d23d134b53f17b4c952d349f4d3530104562c834a3544b5fb43462bec9e7ba67618110118d6105e2280078f6a24ff7d24056ee2be933cb9c410006007898ffe426cb85165821d7b115b23fe371d44c323d3d48b2547800000000000000001084d2cd24c24b20d18604d001030000200d000198200078274a0c368783a61481ccd985cc2317625571943959a48b1830533ab55bec2821c30c16ec90018ff0f8b90023bedb0c3a0008c02131ffc84d970a2cb043af622b647fc6e3a898647a7a9164a8f000000000000000002109851841641439828a098002060000401a0003304108040006c240029b48008c2104105020008004c4881f8280f8140038e040f4a60785303b2981a94c0e8640723203815000f95103709e11ac2255535211c217126bca057060aae57e05eeb114233b7aae5afb04042dcb6f650ae1003efdd2a6b6e8000fa0c385c0580361d01a8880d04406622a21b073b6191437b8c99e75203192e0aadc300832d1cf72400230085960439f1dda28844b37d58e9430522c5f15c918007a12018406000f42400280a06f6c3564c004a0100001473435aa94832c203054371e5640268cc7b2586011d380c8e8800e97cdfdd94008c0214421780e4397df2860a62f13f56c048c00c0857aa8bc80c0127a2c4da79404d116a6913fa04000c76007e3dbf41800bc0b00003184000acc81902e880eb99824650d7839f35b880c1d2aeedf10120cd49f4d1c00b2ccca8a30099e17059c4002339dccbce0046010b2c0adbb24148a215b62a0e398a1827b830f88491800989681e080c002625a000b04205221ba48a0329ef7958e68e00500280001903441e25f380a650dd583f076e10184826b237240251e7f29200e006c0a5077c300bfadb31d3080061b0f08c347002601470b7adf79233ccd9ebbbf0e60b6760d03f9c3cb8cbcace4d511d20d079cc3800a697878608800000000000000000000000000c931ffc84d970a2cb043af622b647fc6e3a898647a7a9164a8f00000000000000000214ecbae3c6352699b3df2e3554b7315ed916cf7357ee8fb7d2b8c0000000000000000000000000000000000000000000000000000ce651050c48c40650008160001006800260100065d2062020009a220601b02f0d81706e8474047ae6183f67f412f0957dab68b673287cade8a31432a99943e56f4518a19550896ce4f2861d20591659451441631430410c002060000401b44293399739163000b71b00123000b71b0316097423ed579404e80a144f5400900100002206cb0e141048920d64b74a2b5417087ea13129442c6046b0596a482ef5c0a18a97dbd4a39c4ad720820a9dd0af3ab49777080405b3730d05b9c69e1800023cf61d9f17f55c2000e193c02d10d4f22e6fb251800420705107e5dc8e0ac535a2c6053eba5ec4b19f9620500a3843ccfc50b08b26ae306fbfc304020a51ccde96633f28095a7a2e2002574920000ae9f7ea86c03d0900e00720a800021720009ba40b4160580b02b0581502ecb181d3c43e4515e12f3884a0b182119c45b8943169f0495c220202964d45b81041192401cd060000dde31d882001399af775a0009c02144211f1414e8b1820d6d4f4e5881fd2691bb202081ed1dd39608aee585444a0273b2a6330480002dc6c0c9c00940200002f040a4060500302701e181053846a450b2e90d11165901648062006d54b3070094018e54e58e46559ad64e890c0057ba58ff061862a24347601c00022ab7c9d548002b0144e047b9c38afa07e2750ebf529c8a393145fb4c615c0ee5e2800000000000000001084b24c1cb1ca1c90cc04504b030000200d000197204c0302501e9a103e5384f80c329125d4fac4185006cf7b87493480094018e54e61046559ad64e84103126bfd916141000af74b1fe2000022ab7c9d548002b0146148df26ec5f3480a10a36f8184023a206a40d184c1a589ba50413f3801f00410ed2037ff1804d009e9504b00005b8d8194001280400006a481200f33c50cfcc5016bb238af2b4c1ca40d59c20a91a69a59c49a48a296182092060000401b31ffd0a17014b24843afb8c5823f0f84a8984b794f9e07887000000000000000002109a59c49a49c39620209a018060000401a00033074d8966acd0a634b00b71efcd43890064dbf9ab3491c2b03c50614507e61b4c8c20100118bab6604101fa18ed58240001bbc63b1a000a002131ffd0a17014b24843afb8c5823f0f84a8984b794f9e07887000000000000000002109a59c49a49c39620209a018060000401a0003304000dd080032d9000a2b2001bfc408c040023724006880811028084140400a002998203e2a01e1500e868070240361201a0900c84806014005884405d4402ca20155100a26804d040247a011390081c803cc401c5a00d250060c802c44014220091100408801c0400c0200532b200a7a004290019480086400202000010108569)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 48 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case7" = "QuadHeightCover12Case7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 48 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case7 private def zz2367:"s093f"="s093f":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case8 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l15 l16 l17 l21 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l43 l45 l51 l55 l56 l57 l58 l59 l61 l62 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xb67a92d48, -0x586f71828, -0x84b29c1b8,0x889a126a], ![-0x586f71828, -0x25d7962d37,0x4b1c9ecf6,0x565a87328], ![-0x84b29c1b8,0x4b1c9ecf6, -0x23f6927c03,0x589d38428], ![0x889a126a,0x565a87328,0x589d38428, -0x2c432a714]] noncomputable def hinges:Hinges:=[(-0x411d818c,l4),(2,l9),(-0x823b02c7,l8),(0x2b6900f3,l11),(0x15b48074,l10),(0x1c7974226,l14),(0xb27f96f2,l17),(0x398d5a5d,l16),(0x6693842f4,l15),(0x971ff14c,l21),(-0x2c432a714,l27),(-0x971ff14c,l28),(0x2c432a714,l29),(-0x1c7974226,l25),(0x468baeb8,l31),(0x1073e2004,l30),(0x2c432a714,l33),(-0x15b48074,l38),(-0x2c432a714,l35),(0x823b02c7,l36),(0x2c432a714,l37),(0x411d818c,l34),(-0x1073e2004,l43),(-0x6693842f4,l41),(-0x731ab4b7,l45),(0x2c432a714,l51),(-0x2b6900f3,l55),(-0x468baeb8,l57),(-0x398d5a5d,l56),(-0xa0893dc,l59),(0x731ab4b7,l58),(-2,l61),(-0xb27f96f2,l62),(0xa0893dc,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c432a714,l27),(0x2c432a714,l29),(0x2c432a714,l33),(-0x2c432a714,l35),(0x2c432a714,l37),(0x2c432a714,l51),(0x1c7974226,l14),(-0x1c7974226,l25),(0x6693842f4,l15),(-0x6693842f4,l41),(0x1073e2004,l30),(-0x1073e2004,l43),(0x971ff14c,l21),(-0x971ff14c,l28),(0xb27f96f2,l17),(-0xb27f96f2,l62),(0x468baeb8,l31),(-0x468baeb8,l57),(-0x823b02c7,l8),(0x823b02c7,l36),(0x2b6900f3,l11),(-0x2b6900f3,l55),(-0x731ab4b7,l45),(0x731ab4b7,l58),(0x398d5a5d,l16),(-0x398d5a5d,l56),(0x15b48074,l10),(-0x15b48074,l38),(-0x411d818c,l4),(0x411d818c,l34),(-0xa0893dc,l59),(0xa0893dc,l65),(2,l9),(-2,l61)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x8458053008000000210601cc02000154721b013400c000001c844058c03000008118408c3010000411d8480990030001047411016400c0000001d05028c02000000a241024300c000000000e0348020000009239024300c0000001d0f028c020000000005407200812320238407e10050000e83611026400c000411c8b0099003000104722a016400c0000000222c0cc010000ec5e1502c400c0000000015018802000000044340a30080000001106038c02000000004870330040000000000c0c8010000006229036300c0000130d0a02900200000510c408c3010000250c850099003000074220c022400c00000f09060290020014c410c40964010000000a824088c03000000000050320040000000001c0c8010000002e0d026300c0000009824088c030000002a0c013300c000000c824090c03000000000240920080000000a0502cc020000000001103200400001c8410160c04001a44108c06240100000001b09024c02000000068340e3008000001984c0bcc0300000004c2805300800001341200c4c0400000004c240630080a20ae08801b50050013421048032401000001242100c8c040000000004c0520080a60a209804b500550829010800cd40180056090160275004001482a04803d4010005c0a01c01750040000000026009200c000000000240c80100000000038052008000000110b018c02000000001c009200c0000000012014802,0x104460a029400c0000001306038c02000000000440e200800042118280a900300000844c180940080000221306019002000108460c00a400c00000000220148020000000048303300400000001e240cc010000000c47c073008000000026240cc010000000945409300800961584102690040000004211034300c0000001b0e018c02000000661c00a300c000000c8440c8c03000064220c032400c000000000903880200000002418063008000000000340c801000000034180e3008000000001a0148020000002209022300c00310901303310040010c310840964010007c0f02101e1004000f02106809c40100000000005018802000000220a00c300c000001d86408cc0300000a434180d40080000001905028c0200000a834180e4008000000001601480200000a3164022301000e228c5900910040000000ac5c0a300800072298a4051003000108220a01c400c10c1c2304093100500000007c2c0a30080000002515034c02000000000540e20080000000004c0c80100000000098052008000000022240cc0100000000028052008000000000d038802002a06814c07a40100000002919024c02002986614409a40100000001106018c0200000510880f830100000014848070c03053c9202500d040140000029824050c030000000002c0520080000000e0b014c02001c4610f006c4010000000001b01480200000000024062008000002505c0b8c03,0x9184f00f130140000000003c0c80100000948c380d400800049218680a500300000008c380e300800000000210388020000004c8870340040004a218680a900300000830880b4301000000208480b0c0300000610480f83010000026210d015002000000861201c300c0000018828070c03000000008870330040000000907028c02000000000140920080000104350318c04000000421a01e300c0000012074078c0300000000084092008000390e8480c9003000000000d805200800000000350188020000000d4380e3008000000003503880200000004c380d300800000001d404c803000000000e4072008000003c86808cc03000000001040920080000000d05028c02000000a20c033300c000000290d03cc020000000a8180f3008000000001101880200000005448063008000000d024074c03000000000b8052008000000002d038802000000000bc062008000000002901c8020000a80430029301400002942600a4c04000000000c80520080000000031018802000000000480d20080000011024074c0300000b50d8029301000000001b404c803000000000d4072008000000003d024802000000000b407200800000268500ccc03000000000280d20080000000031038802000000981201b300e021c3182017910060000000001c0620080a210618808a900503182302b00f24014000000160b018c02000000581300a300c0000002111034c02,0x510818e301d24014000000220b018c02000108260c00a400c00000000210188020000000002c0620080000002d0601cc020000000a44c0a30080005d2b898099003000000a211016300c0002023040540c0500014c9212026400c00052248440590030000000b44805300800831cc2602a9004000000084140a300816424640c0749005a1883c73c03a24018000001d824050c0300000003c2805300800001c42901a8c040000000741c0a3008000521b03c0b900300000630e40223010007118839009100400000006c3c0a30080003919064051003000007115c0c830100000001307028c02000000000170320040000000261c0cc010000000001805200800000148640d0c03000006111c0c8301000000108640c8c03000084320c032400c000000001d0388020014c3409007a4010000000c844088c03001443308c09a401000001441203e0c04000000520a01c300c00003a270901d0020000b184f00f130140000000006c0c801000104420d00a400c00041108340a90030000000841c0a3008000010c2202d0c04000000421202c300c00001843203e0c04000000461201c300c0000018868070c030001c8220b014400c000000001f0148020000000a47805300800030613c03c4c050000000e458053008000000000740c8010000000005c052008000000000f01480200000000015032004000000002a01480200000000019032004000037220901d002,0x6406200800831b05302ad0040000004219034300c0c210a18805c10050000c8461a02c400c000000001d024802000000000780520098210d0c20234100603043082302cb40140a30ec10c0a2d00500000000034092008000000110f014c020000004a0900b300c0000138110058c04000094260900b400c0000000078024803002c86314c0c4401000000188a4088c0300000250740c6301000760941d03310040000000007c06200800000001301e0804000000005c038201000000000270188020000000008c062008000000003407c8030000000006c06200800000d02500e4c040000000037013200c000000068004c80400000006c480530080000001b11018c02000000542500b300c00001a44100c8c0400000005844053008000014848004cc040000000584807300800000000b00248030000000036009200c000001a024028c03000000640900c300c00001a8210058c04000000640b01c300c0000001a09018c0200006804100263014000001a044038c030000009241036300c0000211f0a02900200005086101503014000411e8500990030000e46a0c022400c00001d1b06029002000000622d022300c0000000002c0c8010000006a2f026300c00000188ac088c03000000682d013300c000008c1302b8c0400000000054092008000000191602cc0200000b4a8240a400800059298480990030000818bc027e301400002045600e8c04,0x19404c8030000004a11022300c14220612c0449005a4086021c096d4018000000002408c803000000000c00b200c0000011044074c0300003282901f030140000c209401c0c05000000441300c300c0000000033018802000000000a40620080000000029038802000000000e40920080000000041038802000000000c407200800000388300ccc030000000e4340f30080000003a0603cc020001243a12032400c000000002d0188020000000b4380e30080001822840540c05], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((0x1c482bd60b4661338600437164b8bbc10466080613db548808421de2fa480200865e08c0004afb8020138811004028c162a80be2e15198b2034b850f0a0cce089df7baf310103ca2e60420421f2474a2c0019698ff80983088021e70fd871db481af56920799e6a4a957870804c2367fe10a11cb63e2ea30301144389040007d350fc4e0844010f392ea60ff410347693a29ecf3461bef4550f286c5239c6921c0337f97f501c01ad49b006078af6f51292000112a8801001494854908d208480180001d4323400654c2d918c820688240afa2c202c3cd0f861f5e9abf9240a2ba48e8081692880c11ddb5ba6890a2010d379a587e55de3c193a859db3afb3048238d3bd98f15db4d000006ea4db23ece31094801b8282470005b8d7fc48d000b71b00881a2a20153b7cf345079ea4429028daae3b26e203065cb3a65c80444aefd4cf0f06fb019aaf31209298de6f2584801380a00007c08a48280012bc80040f100401f99c9270c971471959fbd309163880de2fc4f54786a82b95f48670469eaea2b14480001b529b64300120226b582100046afc293e64402140103cf52d2235ef0a60f3859f80a89bc3040d24691bd49c28d02c4aafc96b35832051638e1f0ec6a0f0ef47e1c7f0ecf401ad7fc39e2b984e00000ed8260a4a340005849e794e52673d20064088f3f04e28e73891c0044aa1fd3ce25aa1be5f24680112a880d034c9a5ce0e840a7a7672f123c3fb043a0d7200e421847020504363eac07592004a0200001dc20008aa74d4efaaefb4818005b8d800d3000b719c21c58e83a290b38906de8bd1a80e10a0d194ce0927b5bcb29a0ec99843b60000bca4e18d480118040244042a0020001f222ac1a14709000438100121421122b155158a506c00027c482a1d9b74c261657525259308684e5530412f041df92008d5365a860001f6f370096102100405182c550062a60381babe261b53cdf6d2621d9e2be916f6f9011dc2472e0402354e17d91c00a4b06f40a011dcde1f89c1084021040de4bc59440f19e47c7d913a1d7d44e34068f77399149089a042003441cfe87e68010001ad5f069c0088021042475b15a8899e0016e35ff40f08b39efa32670005b8d80513817ce43c2881410bf46a6240689f42b142121089cbbc1f11055a96d4c792400940300003b84000d6cc0dfe49b17c9e6ee58a4a49021a3d7621678aa4d5eb16404356b5cc29a0052c8f5d41010b04992c4e0842010820836d19de2040f052f2900c8a2) <<< 16000) + 0x72aa7d4d0a691309989084ba88141135c8a862406b18be777aa220d935649d7b4100014e1265c7910005204082120c165d104cf000b71affa07800b719c21338002dc6c028981e103b13240a10fc5f1502248643cf6fc901a6a358f464882b9328c45092004a0180001dc200078e40015048a904c54427a6c851a051cc818002dc6c001a6000b719c207160be721e1420380327e795870c11e20ebd71a1d83662fb827045640b83f30000110f7ccf00c486130080244342a00a00021538641690b08c1230b0011e183f207940023c346000d2828dc0b2c709a285834dd26e73027fdc516a4c86823945649b4b4f002821156ad46440015810053c0412602088010a7008534042980200025d2001e064308842962a14a05000869114015d689a5bb115a2696ec37e8076c9df7b81645da02761473699ca202c5c8e075db2c0b33072872412001c0040010412e278cc08b2b881c97077a1aca599bfb1d715a672ca4f1739158d792f89ffa5b1a448dd4000a3487d82e46a69d1934cc1c1704bab640e92abab43181ecf56d1d9a02f3f4cf909410840212459f0646000000000d76c7e9fd47ced4dfec25144f48d3cd40c48b08218140030080200d000125323425a9ed389e680a3e163d20338dd05e4a783b8e9901e89061e75dbcc9a00aa08799198008c02123400574fbde60000f34268f8c8d92a9dd03025c8c667ee238502022fd37ca72060080c26383d674f05dc2082464682097cc20f062ddbba3f1b9f5d0009b073bf3dde4f3d0901000700a800025522920a0003c122900b922cf83230000000006bb63f4fea3e76a6ff6128a059c59a59c30c28c09a00000180c010068488480004f8e19f6fb19f60634a18f420a57698509a8fa335ccf1c8f64cda60a4881aa2acbd483c30465e9c5698a0932c679e708c01e7f9bc1c661a6020a407014a0a147010020080008448a306c514262880bb2ea80d3f95c40c240318ece9b78b24004e51847b0e189b06a2927d880c386d8ec7fa0e080edeadde708b02086f326eec8005dd5667053b6ce20580481430d01b068508242820a098010001269e8a6f6740000000010813a08d5d5fd837e046251469059051068a586682380000060900401a02e4200014022802bc1f976ed89830209add2ae0813da402be1000408cb388702054592ae02088129810804000046889f9084f834001e6244f437429343b741d9438b40e2ab1890141294ad8fe30c4803487d8fb828c0451ac308c5018007e06b19de00037f18ed2240aa05e2ef0136b085449bdf2dcc441a1e83785686442a02400011b10522982884e48b3e0c8c000000001aed8fd3fa8f9da9bfd84a25044043844823820824000025e715d86ba04d4afaaa4b3fb7804d302dc6b1f65deb2f47346312289e84f8a792e30377a6d9a60a091380ba262fe0a84100ef975895ad339ed81010596f354bedd19803003a79a714691f62905004ee06271ca0352406009c8aa91de1c031c1011011ef442a8bfcd0caf174709707383f07400015191383909e1684ec542741a1390500028b9c28e6d3394405eaf007a6011c7511a21efb00d86ef26da19450f761b88648f6f80000000000000001e8b91c0ebb65816850a40a38a284100023239d139704c9ebd9a3262631816c7acc1fb2a87da01aa4208527ed4d7b508292add8d92c9e0f82b231e47b1a9c5b1316857138079429e4c4a0f6380d003902cc00c8c2c28add7ea37e13e770715eed19a75d77027c8bc54ddf5228409f675cd7b30c8dfeec4463d4180c1ad0bed5d5d21f6458d8869786000e313d98699cdff9fff28bf8c0021fe971a39a576eb4b03a8a902a021bf8da86f7a239540b0c8bf052be53e003b35d5d73a638651100001f790522182882e6f96d28d7300b688636a5c7602f37ddabde369415e1aead833437e3832486818835c9cd80000000000000003c81300110a147145084042000040061ebfa9181191a87b0348731002b67d7269d06836e9d1ac947ab95009c38a7793a7ad0aa30e150b91fe66e8bea9c5f94174c0238ea23443df601b0dde4db4328a1eec3710c91edf00000000000000003d81300108a14814714404600500300014407274b889c76ec62eddfed5e915e9b53b691afef9b9c2e87d400092089c1c84dc34000bd24078d426c3a135090006e0906211f09ec95c60eb28160a08143d0bca33a04b7080815ec02edbd756dca4001a9f09f06fa5c4604049ccda0e3777cea6c2001f5803c9122012a7972e307b52cc3b665d640edcb2855b16a0fe6af0c0d70fc1e000050c7082f15f40142bc60475ac3b18954030470e20d8f39646004e39de48a5c0502966cb54dd330401e092e00314601100419a6ce9e52a615010d922bf791e08578f4c1df01207bb8cc0600680002522268920c42d0310ec4cc76264131310509800a0685c529cbd1f070928072ba1c1218268d6329ef4c0508369738373162001a6f072164b87011f6d5658b0914009c2665060d451104047a815e0d5728095195a9673eaa93a4170163cd3baf938635f30c2c471409d4a30b0d8d99897ce349066aaae7f8d0c112d7a17522a340bd24a38ba6820000091e98400080034ff85111a099404160123cc05049a0f530ce1be9976434aa95024998349e06b49469309283b83fb924001efd6f35098209002000028a78c0766ea480e2cb492f52d2b83099548f2cbb1308ac1d1015a12c80cc30009f0206000b71b00008200895440182c038e5491ca4180048f33816c031218500280001fe21c613d2c4bf3d2e114554556a2d42c8c3da2d)) <<< 16000) + 0x67660e005b8d800b1f7dc3abb39438889a126a04100b71b002500f5ebf04c450030a22564801914230040000e8910f09e140c5a5cf1650f6b6a47f6a50df5087e31048c2208001a8308001e8480020016068a1b6100096b2de600004e384801000017f225e3b12e0d83882ec90746622fd689196fdbd6d459285001851960009161663bc26dd20503ff29203408040b7823a23c0801c2b62a41380000a262431ac81223961500e000078088302e04c72341f243987100f0b20ac02c14304de93b58b3040840c3b9ec1aa1c12dc1e6b86c20a0118da757f27e004010603bd2fba2d6e22c685c0580001ce20c4130410983080f88c83719cba8e1f241ccc1c64840016e36000c105a74b635c0800cd9e369f40000bc438d68c19121b1fbc19110980300002fa4003c90896a2c4b0c725aa66e71d4aae134c3963b4c92c251288287246284244282241100130180200dd2df06450ba6690097c141b334727c22f34d983976835ca38818293e5cdf66058d59a27961c000f30bb0d06000cb9abdb280025008696a413d4fd93481396765b61a3a2e3710590c1c4bc3a323e58c1ff5072f6302d91ee23cdcc004a01000014738524ce31d8b5b5ac3070895bba15eb6e660c6363721b1da45cb185758239ca3dcb9428324e2f40610c3245055c4731d2ce1e58320f485ad66833cd000443fcdcfcc12060003eb92f1e12a86ecac4821b8260000a3cf1c1e5737ea0b156a3105e60a163e32b67e490852a4e5778b04e5f7c4b982040b6bf9c406014a90a6fb16708240080000ba10007443040f534b58575ee0632b986dd9528536f98be67aad8e02f07a00000000000000000110c7ea36ad27ceb1e104a8704789f273b3a69fe30fb3cd482d000000000000000004122472442432031c218004042e180200d12b0100015d112a0189480e4b54cdce3a955c269872c76992584a260e58e60c58c50a408500300380801006f9aeee358a1038c4e30247621c4a6241c225ce2078772e1f669113f5dad1928603446250e161006e323b9c2001c1f91d9f400128043cd47dcf16c838cbcfb6e344389d70e75c8034974287803d348ab16f8f422862bf77cd3e1401a3016be69c00900200002e274b99a73a6dc9a29e8690f1f8e76dd1c949cc20c24020d476d94f983adef0ee0cfaa7b42451141af2b002bda220202757d12c2533b8a00061fc84be739d8060049ebeddfd2585208000b41b0e9bd67c0c32e104821d8300000ae08003041b24a00000a18038e130ae2c2342c69291c5c8389431808bcd73b4a1651f4bba46c4888b34e88afc1c3166312628890005de9eca8e01003a0f61ab0c964841480c04a00400043664b54cdce3a955c269872c76992584a261460e58e58c50a408102500380801006f9ac9420931038c5e5c7411d9c4ad4fac7364e2051f1c0a1e6910923015da2c2015ca509e88082c4b6fd802001063b0e3b400128043cd81959679938ca0a570f60389db9aae3a534958df25561348bdfaf71da2861d9fb71cb1401d56166ff9c00900200002e278c6ed1569edd969234b405f6d7d53052c34882698897471e6b3080eafbb559dc83730784c9f9ad01d908245084983f166346910118bb7505564db628001a531fd776f1008000c18be1d923a06418c1208700a800029a2000bd46c9af37932faa1c7130ae2c2342c6b8fe633a4f286f664475e2f2c55ebad5df70285a5ecf3a08a2445f3e90d9e21c334bfbfc507200177a7b2a384b2420a006025002000212200126a70a0f436789320b26828a494ee02c6d0da21be8bca1b762f2709ed28567ef061ba2070ce76c91a1411400c2a9bcefb020098692db90e00f948afbfe61e020a8081c63c10499188d2d47ab66d9e6909b41f75c834715194979f183c88cf24d5891406f1913bc50401898143808007925071750004a010d2f3ae2b2508d2325ce65920c2368f8c8df4c1d5a73d50f0914d7e6789146082f25fb250600416f5eef2700240080000b89c2b5ff6c206aa78c0c1e8726f5e8e5bf6cb1ebbbfca29387f7cc18528c547c20ef10b195079206b973810810a03f81635fec145043ee4fecfbef8c89000a3cc54591cf8020004b449ef0e3301e09a04821c02a0000a688002f51a2094518280c86184c2b8b08d0a1709c1893c3c9176839287fbca10df1266a76091383d5b788e880e691c2c6e48608f8c6fb671c7005de9eca8e12c9082801809380800084889300800293080f08c0074a08140ca4b54cdce3a955c269872c76992584a251048c488408406284380100260300401b9a277b1e646bddcf6ae199b9ac2321e080b463f226540a22871862852452422c10811005c040080361c90b5196f816269661241060e58e58c60418218190001006e9716eb2401c3071c92e354f1639a3ef6412cc180d37e46c658c2666568882050829a6128981699facaf16700250080000bc1c29df8009af98392164007808b0ab99d72c62180f08f193cb250c4e3f991f7f2a70a146e5bbce4d04980e201e9a52d9df0b02c1b8170a959ec5e030002ae646da630403000276d164d6ad03d6982410dc13000051e4001410800331181b284310e4040a0ad62cbcb2035f9722a658e1b627c8baa870866cf1b4f820212a80f7cf1400889a126a21386128040494040003264490262460206a010910080026108909484808423e3211e11021088474442382205c0908d84846804232020033412230ab1174988b1ec454c60c45b1142988992c104662242ba21f13b4967d0364402a0dd8ef7712a1002e28cdae567e8ee96b84611e710c)) <<< 16000) + 0xd0e0646c1f5b2dd7fbbd920aa10b958bd8a01b5fb31b600370be0f5f9c07d7dc78400a27f65ac9b479958d33fd4e72975022282215c9e7734bf8f181626059fc866d01e8c18b9de53554ff83e05caf388402002aef198c1cbe4c9dc9702a0eb92753402632f1980d6de0f320c01e384aded5c438d50ea3303725df742ba3a0a4203002008d00f89cae6c078009dc3475a9ed1ca669c36bbd4bde0fd5641ce83cb412b2516d8bba78b4419950a4d41a8180175f97fa2ba91c484fdec4dc99bce7be9dae6531bfcb72f405fb65ffdbbbe7516c50cd32f68c855cb6202800af2119c52e78537b610c777520f6a39ebb30dfd60099b6b592a1afc3a9a5836972fc523b35282f8ff301396b21c8a924107c59b20cf912df584b00f931f15dbed36aecc379d87128135f6a7a22cf9fba58445f46982b8663be9dce33f9b994843656d94a25963e977365c40fedc2eb4846fd3ec688e8ca3737740c353d3212c7f463d2ebb414d87ca559af199242e83879529447ea9250e1e2120e5e3e7e33f72edda2aa09080535f300d0af53ea7b3f133a0b765815acf822b19f1cd2ad8364c4d7de275b359af699bca029cc8236e969e708a95fa4a018f3a5b9cafcabf40ec9bafa6001b48c3000034d222213e2f13f847819a25eaa9172ef660ab862db30160c99c7c488efc493938be4441647bdd2baec6dad5c447e9dfb8af9a9f72853242811c0774080a17d4b36f04aa8fe039fa2e11c43e4247fbc965080ebd5cfb2f80403926b946237bd5d27c3260d14acff7e533bc097908527a7a3a57bdb2764cb54161b6e13949834d7eb784b40b17ce863d6be4ec01100a1dc521ee7bd851c0431cf0e610ab8287678f2a0f1f7ad596354e96bdb71d3bc2f6d5905304a80000b0e4003f588880cc43c4621c23c1c73e7bd69a9cd2b17210c52038f74727c2816ac542a97ab5a8242b6efe50c7a480a70e627f5c0c1084dc7f809a64b87e081818040886018d34304ada8d2d1f4706014fb393a0209a4df331ffcac000116e701e38adbbdb9cae3e300749109585838f190c50ba1f0000344221a4b10c1583882fe4731f8cbbff6e236ad481dfa650e66bd92121aa8274769200000000000000000825a31f9132a0511011008609600800400883b1aef39ebba0c90b1df97a489ccb7b53ee2e267d0d30c0513a1d462cfd986cae4ec849cf0641e2c997bdec91eb027bd0737f90f48a746e7548d22b8995238f190638b224e8001df910b3988516c010a42124b1080988382c4181620a0b10401e8a52d1f32d18584e5912014183f3475fca0461c9c4d470014ccf57f2c06ae4f566813061080438daae53b7a7084439b514588097de0d85845acc74e878038a9350e601ac2810ea38049e8c88a4e0840010e3187dd7073840827ba8e389cb96f0a070a8ce5f8688051c3cb7925041f00800007c90ff0500013f91030d81986c3d826204131010988002f0a6a1a69e527ed562fec9ed836fd2ea2843c7a868723f5515e024ffef28a48bf119966278fc7a665061e6b15cd668a43fc21785fbbb4e6064f8fb52283e12d9f7e688ff82b738dce32b7a88fdd4e580581064115359428e03686756cf722ff114b1e22e0039f2073d7120cce4f1884dea6eba57bc6f644004c17ff1d837a0195402c1c029bdfd9492507516c458671eadac2b7baf4f656ff13ca5be411a4e78f41203816440e78a60a3862869008006800060500401b829dc76d8f0e1e0673f778a1e53872758a013feb66480120a10004000036c8488af8c60316fa538424d04b85962115cfcf2c60b30e4d2d0701bb1fabab000251c2100800008790ff150001d11000816361e3a786938b07cf58ca844023bd3058438008f2026806067535a47c0400094b08402000023043f8b61fa530fc2587d84e2058a9fd8e11081e004402004010000044438c261f40b80db1db144280127da5060048507c0100000fe43e4461f0230f71187b06c3d4261e80be1f00017ff0c2347104d6901eec8387cd00c6a7f7e000120e0f804289371ec148a02c20a4180044283c01080a008020000088c05a7df81ac2069e6ecef0b019280f009001d8fd6cc00090607c0200001b440006c0d104b88321342e76c0656a7ea72e06eb2b4d4354204840109106b75b4bf9d6b99720d9b567ac9b58e020f82684a135edc64c4a5cd1c186b6ccd3b1f86012fb27a3b61dc9a97170d71eb21b7640fd9afc002e6670bd6183211618bc13e370224f23ffcdd83c136ddef6d701f69e741af12ee91c841283a80003b721c6430f31dc44d3fe5e34b080e6ed94182190ad8c80023181e00806506fc43b0e911c3043bbb204ca02b3524f2800118e0f80400002c0d043368171380fc6d3d20600c5ba01201009900f00200002b48208883c8140004fc40024e88788e80a025e0dc6a557c100833d03c11200c93000a900026086c300200485040010b14491340ee017d92cbc611406e2af24b60628bc289a5e83931fa3f5a9f0b1427a07eaebd5f946e70812ca3b450517a459cce1004ccbada90e43e0f6220306cf905761bf55cf63182e63c0c59056d9950016c83a70e8b6f1d29e9525e7534167f88508e4061c8c12f10ec461ffebae8dc6d7b5c8392a3b0b1005b2dafc6114593c4b430a8f4f7e112014eb2093000905080021848dbd9eaa20428fe1cf83096a0f80b8013141f00400005510f00d0000da904115d8a44f345281d099d40e2c80f928783d3b8210a220e401446b383f8c7a2542ff6058da7430ab531a16b30649350a08103e9ebf34532e6dc548d09e05f0dbb231f2f6ee79)) <<< 16000) + 0x1023ccb78f3cbff62402375d2eabeda0ade4dfb9165f8000f9827ecb8b3751ace9fbdc2a06b7b69eb1ef07bfe6a3ad1c703f1f69b3bb356f041876be9dd51062a48a182c07a0956800323f7f08c00bfb34710013141f00460a40a2fa80022283c008000053200023043bc341dc0200058f20016964310a61da4b04f1187606c00327c800c03901f2d87590c38047420729a1db7e9ee2561af24109bb7d3839d5b894d1c203a4650be8f50448ad6ec2073fef4cd5be305e2872140369ee844d0695af844e1c035c49789ee2d133bf02021e014bf69ccc4e388901401007cb0869a93f97eeb9151a1476cb998f12c2b1a6011c7511a21ef5507ae6e78bc9fae782df8bc164a8a1ad600000000000000000110b463f226540aa313656c1db02cca08708508308b003000088686d00680441dd5a514dfe59ddb7e46cca16e676fe7cb959000eef5449bf127c0e886fc11958affbdc398bf361f631a6214b6c31e98f174480c7dc03437183b9786f8b840dc44810d23c01d131ba5cc010e97b12200002624220080750ae23006d8da5e70d5065afb71231d53c2cea11841100436a50a06b6d4a140d8d3fd6c1e6828f0058047a6011c7511a21efb00d86ef26da19450f761b88648f6f80000000000000001ec09800902281bc849a05a1e49c30e31c014076e98ef3fd2ee02231599143d939b10ee6a0af1ad3ebb259533b01e25f68f8b080bb4cec0532802a59700ca1737683de3448d4bcc6570073d423acd2a00080a41a017a6011c7511a21efb00d86ef26da19450f761b88648f6f80000000000000001ec0980080c201c08a06f2126816871068a40a680480139bab6e2bc3d6071f3dc387c6e5dd7c393f994fa9a26240fc2a573df7e3bf70f73206679a0c8f341ea215e48d00030d3a6011c7511a21efb00d86ef26da19450f761b88648f6f80000000000000001e83080702281bc849a05a7865c0753c32e039855d4a6d296f26235844868e6082884803809194f911bde2ef61c4edfc759577422a80b8e3d0b75fc24a4a0e3ea233e38d17b1a440d0c2c7a0eab3a388f2eee66a298653d0003b121d2320e8110738483981400185a4310b61ca43000dce21c84a00116921bc8204e35029148144240029c0438cc61321be128cba0b74608d1983ad26019f5c06e10000408cc08402122663117c60000c2483c010b18c6ed4599102f4be9cacc00b5a2e5500008c7080021014010044030040113074961933e7821fb597e44805c5d0581011861080400002bcc030040101c40a000037200027c6030020080000222000370685325f5583384fe103c3b2c4416fe475340271210fe28043bde30f000094808002000021a4000eb8c84abf1bb9480a2ce7a720000044503e01000008b21c2130004e1203e430380d87006e84af612dbd0c165326870cd06d56da9a0303acec5fe0280d3f6e16d00001292108043c901dcc08018384436158091ab48ceeda04c3084011e4a685b8d0cb1e1dd846ac70ca5a00088246a724515f160117900ac430004f9556404c18420100001353c45c8cf8468a1a3b3abaa468ae12a8c7c205177f39ea1a04044d5148901599b1f52013081080400004dce8f1a564fd2245cd9c9d8d9e24e05e5654c10ec4764a4388ee2b907e2002e5436c500130a1080400004e4e0d041040d090230862de185865b0e5a7a1000e5a531023001bb9f21d0004a3044010000113362d587dfce870ce57d55847051e3381281c20a4d82fe8a16627dccc470001d8e90c000cc384201000013d21be3300073e21bc520dd2502710814874054320510900047590dc3106d968368641b22a0d81106b828003df880259210621182088c18407820f553613ea47dcb6da46245efc6083d4b51e8a26bf26b030416274dc0b8578e02df09a4ae20c82cc646051b3bd12d71ab0c4939c300fe898e60946cc6329a669e72490196a375bfef64c1c6fd6e40833e835893b82702ed4c67c1124ba5fa8c5a094fb418160537efd000000e18333566f01c61ce0383581b0e9b75414c2dc353c4678b53d0b533f16587776f722c8eb0be23cada8e6ac5718b4f87a4849a86400000452d283e5fbf4ae4386a5f12be59f1ce02c558fac3be635012215f9ee149ab8d45b9813219a98ed6d65e80cd552c893b42694048acb0fdb4d35d0affd2ab5cec1288fc90d48d90c18cf37d284ec95ff9d78766b1570ecb2d30d6e2a7aa9d36ee4a152d1c9889da724a4a9671a5d365742178fddd1c2c03808d23a567bb0452dcd1309df6ea4d8ed47b63d3e178ec9f773c06e151461229cc84383672e273c36129b87e9ada55bce9e57fd82ed20cdba45bf9be5e0862ece8c1f8da71ff5529c991be28c962a39c2f167fb4e2699e5f050e128be5f6a753a216271e6697d450145be843363a2e46831b250664e407c1a0c0328f7ddc6bd2357d2faf272a910800ae04d54ef564f04405a539f7a5c030034e6213182a5b5a5bfd9c786cfb40008c2b25db0b60cfe487938bd9122c03f33e517e3338d6846f925859b8082616eee01b459d5135870a50e228881000802208c1693b64ff4ba64029c83ddbb57878a2dae2b7c02009c1c418e483b0c03b22be0908ea26c140597561209ad8354d324031cd5582ac47817d2fd778f5e508e5c87a8c98a5ffdbf000981e735b23c6da4dd0adfc9673fae5bf08a1d4ca323b82516574f2486eba90938547dc64aa850082be8c72d094124cbec96e0840a8f8063cc1e01522984da680064972f500482044010a2bd441e1a061263b8f980605708b602cc0052e904d428104000)) <<< 16000) + 0x880400802000008886b02800049886a868350040004984001870d9017af286b0c35b29c95a83867f3e2b3a0a125ff530726802fb88859820012921100400004648003c690d32986912c1f4960944b01f258688cc3406619e2b0ce1186684833017002b9dbb1e86ac484055523a7d61a915dbc3358b24d06ad620b9909f0ecf2923e944ccd0f8bf338da001c097330827d2d98b32414c02c59003ae2fd33dd1b071208dd0ad204ff2352a72183b45658f59adb6400301c6240c6161805cd8cc755d9a81089378978b23616ded3a57a0bfdc3cc1030c655bfc53459afa8a00014014003cf7f27463881cab88345410f19b2a359c1917bf5b3a1ad3f5cd4180bddf2bad731d3e703fb593647033d8c4d4e1cf6ba55773e4d8b42c84359d9399c1071ce69ea39a26aa0a9b7224d6374c8d0034d43494790316f8dd91c5bfc0f48a10a536430897a0016b08cbaaf44b2963c3911820ee9f22fa094155aedeaac136a090248101e4cd81dbc10d0887ad77c0003110dedafd373fbdaeaf80ba58618a0b8206c4bb7fca206c52005c00106d9cb0937efd3f64221e3489428ad8b68e86fb69735405fa63a6730b0774b1920550bd0662fb5dfb26a4742938f16e7dab4d6e26cad3225f5039eb944048f3fae6fc65160ee3c776c6f58a9eb307b6e92f67f12bd2039ef66957035582006188de87ef8fcaea0eeab1e3df49484075661fcf46603f4727d322c4029880a9eb923c89261da207c410070d5ce14aeabcaf773c92617a5ce47b4762f9c5ad76b63875ade022292a2e86be096d88d9f7b8cc0043fc6f4484a42ed90b30e29e09bbc1f3e9acf36f92bb1b4c8d7957d702ec6588768690a4a6a148221d4e5aac065ca14bfee225a962c06586c30c1760eb3a2e37a6002c2590f1c0631cac9e18003c44b4b000a0121610004000039c83112e084991a9768b2e06b148e861013ee1b243c7134162139e00eab52a600094508402100c01004451ea49560030ce07fe35834924f721645402aeefc9d4801510b9d90250c2000800008210ca110000ab10c80986484c30c073028adac645d5c2064e30a5496ce8123a3d19f16e05f3d939fdd7d17af65245263878d1bcd923772709713528293b323adcfe9776410e02f04cbea69f26093dd23c3fed96e37fe0872b8f7f6e2e9bd963b7f4911ada33cbccbb3903f7f382ea48fe4563e2e998f1390cb51b8c007ece119ca7d7965ce86162baf5389f12b9278e99fde7f6da6f5357b63fa0625f058e5e3846167848d40a28320f2688ecf52d4d6d001e120b953f2dca6f34b6d7ffa1822937ab8ee282ad166dd3937c4d1a0164ee25d581c590fec52eda1bfd3837b93349b4e94adea6001678824b8abcec1efcc7d3239eb287784cc87a33cbf7b06b6f24c8eb85c022fb631ecbecfc356a8e04cbd9aa21372f560c22e376a00e511909ed05d6a34885217894303303357a1fcc27f413865117cf0afdbe2813841455f38176c51e9f743847eba7c18761cc969186000142043205418e2a0c60500069390c539800ab390c4416102132ee94eac8c81d9fae603a8785337651e72cc341aa38cb3593865fe2c3675b42be1024ba16a7f9b7d623b5e5d80dc1040a9bb037440958dfebea48182369613a14f022adc43d7e3fb2c1ef73f112c6e404f34a524285ac143d35fef2cf46c315910e5f6715511a0d0be2cc05813bfbde123e8c6c895f912f9dcb8c7d79d767a69c387115d126cab5127c364ef39ca1af51caa3936f2e4f0381a40c32f711fd1bc20fc000067e1f6cac195c52837cb80d394972b7e7f9dca838432d292b150b671f2f8172bdaabdb2951ac3d28fa7dbbea853ee053a61555226ef19de331ee6c43d263124a6a31d75e712900d85b0f40ef48d07516268734ce76f42adba05a25b626acf44db6ca704cfa5daccb9182bcc00079ed32f0c144046244abe2f4cf112a30875affe847783c93cdfe53271abf12573d595afb3355e0f0187ce02165f9429a63e1a2d63180002934d8ed0579df7f392aaf5e5b92c7a5299b3812ba714eff46e85f63674bb82dc91412436018c34ec9e92069250b4edb8ea4961b6887ff3e4be2a0278667e5e4fe0f5ef556c591bdf6eb005091d35a88f9a4011eb3bda00f912fd28d8e4012e1a197f55a04d9496018a5c85004586e30c31ac5df584251877a022941fd24d5db3aed738be04731b185a0473014834d83437ed689ca98db2c64bf73a4e9295b56c80a001119f0310283c714128f103b790acd8295a403a0667cf3c782d74acdeff2e8a50253bbc556c24059db363540ec3782c2625d89e3d16ef286536adfd587152744534c43bc22bb027bfdf1a4992280001dd480155e10c33106108800c66c8609cc24c578286c1691a5230b72b40c06808295dec90882f290ef83725779f47d76100776840aeb4e5e60b836c18a5c09aa0d13e3362adfc69d84e468057aee63ba5bce4f68e0596be041c432332a6d239e8ac2ba7d640e2f1c45c44159b081f0052df0e734080147fc2c8aa6a3d14f1adfcb249003d935a1534c89ae5dd12d1237aa365bf911f8ea63e86b534df766a3c9db2e9176a6fc404b2014449938875b4c649ec6c08040080238e8aa3bbea8a1000a98ae0c0026882f7c13082100400005590c005e9b80faa5644404991e4c49c00d05698d0023102100800005810bf0d85f00f0809f8f9972c09b9677cb040221c2000800004398100080200000888001689d008a7fbd1599364a5711afd21b12f343697a384e511a386fe813f720078823bc0de8afc111f93cb5b3e50f9bad0de34fb2e2c9426)) <<< 16000) + 0x6d678603b581986323687ff1ac1ca66202402339b92b8f88a41eb05f6125000164d76891542b7f3f6317faf38d496c228b9d90c0a8931ab6853e82d2a23afbfc7f509a51998533393394204ae82039a2e58ca348b400008a642f4b4178520bb2505d12807c84172420b81d05b8a82d84416a1a0b40d05982c2c80416202000d8520097cc7042092833d036762175ff3d7191f522ae5f39a83b5300410ff3aa60412b1dd1e2e96fa51c632278ad75225254028078f9fe14158be73fa979ab0d16bd19101636d65e1000000217133cab92c0cf3472d3ecc4be72810fce8055b66c4000000a6785f1d7ae6cdb211e519f3ded94cddf4d3b35c432fb904453ab3f1690bd18fe29c4414de71cbfbd0f3145cecdd13475b82c4e7b8fd549708c8c714b229c75b1999b88af78860e797e9e2995465c6b7b906d9544400005a6200bab840305f0ff015aec963a97724c04b741746e1a07fa7cb5d411a6b1ea8f00000000000000000088424c0a5fe0f5cfc7233c6689f318b3c479bbf4d149bddfb51a000000000000000002190818608c00a002002280202000490ad375cd18db1342a15df0e34aec489ca8a6f1126ca2346e3750bbcf69f330e47863e891c71280419f013230e247df1d771e9a025b25ae3383c6b1170a466ab8de910b5049aa0e87002d3aa6ea73337f928c9bd66e046037c775953ac69d8cdee95f12ea54726917947eaf24481500060f20199764044a60c0502210b78ed9986fe3f536cf84438406524860b68be3f48d3dd904e02844afdae80a32d4d994f87e2560c1025ae69fe9a4e610862bbd3683ca28033725f6bc50287bba049eb8dc62008fa07850d6f0d3277e19f74b78080287de033084d6fad0266a617f7a4020cb139fb78dc96358ff2bf8b32440b67a30574fb9d3de6446811c6db561d4a49012bd75644a2fb0166f480825153339ac280ba0552cc9a5202e828f005834ff5b0796d4a140d8da94281ac2342021c214208104004114863e5087e3c88357cab7e37db9406d7a9af8469f0db76e040f69608328254bc3a259250cd4ad04c3792686404544b62828001b210283985810c2bc2701458ef6d613c14275d832b3d004025c1991318f85003686e2f1b40804f717dd7e6604024d854d90f80808a1ba5e5ef0a6004199d37900751e53681fb928e39940ac0a1018755111a68763b1210015d3c990e9000c11af07ef57b54b99009e1d0a2929e850880079171d9398c8e8200bb7c7538ebb9c8004b62143fc073ca0002003e8480734380540571ac2b4a6158230ab0983c00e0582bcd9bd86043f51feba0c12751cf6fc90006d9791314045621149c105402530220087ba5cbf741aa9088ef1436867b35464d68ec5824dbb85d800000000000000000000000000000000000000000000000bb1f3b537fbd76c7e9fd00000000012459f06461291851631231621218810e0082817240100683512fdd2e5fba0d54844778a1b433d9aa326b4762c126ddc2ec000000000000000000000000000000000000000000000005d1347307286203143282340081ec8e2d29d68951b569ecbdcfe13ea84cdba5950bfab78846a8c2b0798055ab197c07130095c461b574165166f59e868ce22e19b05cd0aa0d85486c0d826150130a70185300f8804a797cada2fbcd221eb76487264292c7522b9561654bd8910bda144314ffd32c30d53ac330eb2c0b0855984d86f115618108a091492d1778e00a8bd5f5f27b8b3d09010086c0a80a50585202c28c0600803f74b97ee83552111de286d0cf66a8c9ad1d8b049b770bb000000000000000000000000000000000000000000000001744f3cc20a14714c0cf00d0000030100200d0910985104e3e76a6ff7aed8fd3fa000000000248b3e0c8c25144b38b409307243082441400c000080378b1dea631da60e0baaac32491c4fc7e36d1218ceee9a08441b30078b10580270a582826002300800009d90a101f9c00746a52880002460b8f843422f55e895a1b188e16526c06193f2058fa328303845b1ee508091af240b0eb6ff55471b28813ea6842b2e2b2fa1201c00d8151e62d0c6e770d2030c49bf2510b44a4e871c2fcf77af01802e8831d06500210080000811f74b97ee83552111de286d0cf66a8c9ad1d8b049b770bb000000000000000000000000000000000000000000000001763e76a6ff7aed8fd3fa000000000248b3e0c8c2524903ce48c44a0c31c2440b80008037cc5a18dced9a40618937e4a2168949d0c385f9eef5e13005d1063a0ca004201000010220007664001bb48500280026b08005fc909f1104f04827424001dda4004c508430a800580484e12c26c477b81645da1fa01db27795a2696ec315a2696ec413d02a9664d29017b31d68df1740599429029009200a0040020225a213f5f0d647c92abab410b753c76b05da0a3fc75f579c3ee730a24b02935ed8d2246ebee972fdd06aa4223bc50da19ecd51935a3b160936ee176000000000000000000000000000000000000000000000002e89c41a41641621c11a08005556433f1c71081835a556d5131d0ade83f013527116abf4af84606e63fc7d541a0c9a3f025f3313c549db382ab6be3006119c4344b8a06c2309a09c4b0039380ca102d6d8ca4cef38b0039387001024d397e7caf4482ae95dcdc0e2000e4e1bf64455442b747fd0062f8b36caba4001300a225898b362ca8171eb2bda0204aa56706ee890702dd23ea22b920838128039abfb312960004fa69ff380110040000590c0adcb149491e57f24d8be4f21a3d76216808a4d5eb1)) <<< 16000) + 0x63c3356b5cc2940052c8f5d41010b04992c4e084201000015f312c43aab04e4fd02df82aafb3ff8e2c0165a0bc0011214e779c4557ce200165a0bb061115b8216e66d54908848a23fecf9007ad4a976c0abe840016016225898b362ca816fc645e7da04b2ea08378890702dd23ea22bf0532b8e803bd0e1235160004fa69ff380110040000590c0aedadb6c29e56789f345d01296c6e070786fb2a2ae12c300a791e31008e4b0d3886002bf60bfa2003eba4aa92804210080000c610005112132120980904b808002864c100096db1f8347a555ddec1983d3aef78e68a1c1a884bb6a60a2eed35a251c015e25d7cf8c000533b5134428e204a0280960504a80825004000384424c761242308801f9e9da72b8ee1e6802dc670807160db037a6e985800f4240007123a171f9591830448a12340785b2c5e87809c0a4f8815cee00017485141042400980501220309001c515be0d5b7d4227802d0f56be1034894482539e71a003c14dbd640b0a34736b1c1c5800000000fd12086efd3d804889831a94bc51401ac6468bb9bfe9002901c45116243d70257622787a539420584103464af21d3f02a8161fa41ebd5d734480ed223fa2b2a22246db6793b4265005ef6ee3b54b3e580007f9d4e22b8cd1500062078000217302a296f348f27956da7ec89a204059ce9931a01953c3e5e54f090cd1c43e6584000706522180073b6399786000ece5b424a4021280a00006bc8003001e22d7f2816c1cd23b824897ea8b2022641d929460852f73aefb0e0410a9383b4c50406901fd804800663d2be6e440001f8c1d04cc88042802004580823c040003e642383611a13896282bca9a28162a1a5c638716002dc6c008121bab9c0ca710002dc6bfe48827fe0429a8857da3226784044a524f34a802449819ed1480120042258a0c054ee3502c53f2eb144e8121c41d0314724413ded2565ea215f6f388cf38808931136f63a80240feda16043010044aa1ff0160001406f3fa204801480e0000810c0a14602844e8f4f284e604099b7320309092f74b30450c213c567d1243c20ffdfc5203990066c5d226f51c1c1206c01e64bd46000513f665b913e84021701600007f484602e47049a6e2eee491866a57cbebfa26131622f27947980058b114001e480162c44f0838703d6c2bcba2212a657d1da90902272c39fa7d1208e1157ce2cbf12005404091c14201002f6f8e34004284cef082461d14dff2593544c2ad886ff840c38722d1c81e2b511097a3604db83c2408b451d0b8aea2411f7addaabebe600004ad568c2f22e09002f03800012099240757e4cc21240b43f224ed2461f3236ddd944c168c2c4e647980066ff3001225933f0ba609e40019bfcbee1c3a971a58df88807b76cc7a7249002701848c5660a346d131d332aa9048962c4d4b5070dd77c3234442d2f8ac2a4c0000348730080026fcad36700220080000b21000370302a4aad6f0c3ca7857c66f4f089b8813ed1020a2562c085047459d86f28008ff1226426082200800009d100094a32480656c3447110bc2d35f1a4424c999da5900ab526169a3053814fc630208f40d9610008fb83fbe04e184401008b050000bf101e05000898908a150448a82203410e1a001c03210c2a002c35210a0a002ef520d44a0680900234f9084110024b11004b992106830622580f08800c05441a71c5a20509404e9fb4141efc09e90870042b48fa114004bfd1dfc001947088021853820aead080eff44bbcb18326a2ef20c60b500aab52081825804050a00f61d523a140028eb318002710220087188644cedc24456297179871128fd1d611c3b934115049012cf1856b1c02370434780983088021c61272167ac7115744f95d1c3c5b5df6c4308b8bfaf9c1003081b329409430880200002184000984841008204040008204200760fe3307e1983e8cc05c560f82307b1183d06c1e4260f00307701f104b761c0812cb02f6fc4872591f7bde78e51435b036c4959af5cfe0ec4c8d7f10cc9ae64c40d42fbcba30342da9c178d731302a4f3f1551c2b56574c779104fa6049e9b083a8970683340000ba0890d590e726dff48811acd9de66d96000187170709845a4fcd53c27e55210231cf3a038b0b0ce0523ef13165c4de0b0ca5114348b182db6a6028e28ff3a02e41854440776e4588366630dd491225801fad82087a8f448234020ae304300001390118043481e6ef2fb8b204fa8663c2475478fdb4481d101e63902c6e9de8597030c3d2feebe34010ef51b6c002718220087125adaa4b61441bd231d9849133e42421983f361f2cde100f9f5ebd8812861100401d8060ea03b2974dcceda204826001a223895fa1ef0ae512861d906d4a0a1505e1ff1a08002568c72418cb72794404e1846010b29809dca76a048cc6ed2ad389605f0dae850510e697bac906f8f4e76c98001b1d497a0801704e7d8a04e184601000017036482a6a754628963b445c427900493da0b0d21b9b1d7399240c5b03b96241a4d77730c2001e781834009c308c0200e80a000185200093640017b4e0e33c775158a1c0e63aa69103106ee9cc01c6304fcee7250b04998bf4c208a0efaf6812002eb6c5e2000271c230080000bc100090a3840cfc9300c288ca8c72c9ca0cd0f07600101c0400c4642402f3a60e5800023e6701b0000098908c0200002984003018d14352f3b5310190cec6c5618592b4d23a90097c4bc80e303f7b1030d80008129611004000047483984c1c8260e21381c0f941ee11428b2a9e492245003a63b982890b815f7e460c3b8dc7)) <<< 16000) + 0x070a1bf9015cec0260c2300850b104d21108e208464f96828967c36a6a8c1c0f788f9428772f0256e8c011b9da33c04c184401000013b322025e4d45818312abdc30e20731fd800a450838ebd1e50813e6a897ec200212642d4a0130811804000050c83800c1bc07b5285035b6a50a06c69feb60f34147802c023b0166f4875644a2fa49012bd6db561d40834c0238ea23443df601b0dde4db4328a1eec3710c91edf00000000000000003d8130012828f005834ff5b0796d4a140d8da94281ac2352030c21010c10c0479dc5f11e8b5e10679f073d8a5fff74520b2e17b7d89aad2299669fecd9714dd227f5a594ebf2e62e601e9e2f81be863527ea272a2980642379ca959899df0a56c5c23ea07b8d8a97dfbe8f2f68ea3c3990754936a000b7041b8840da3a06c190358c81a8640d22a06805000542906715033088194340039144190e60c6720620982084c18407113424d484b29c1b72c37b8c13c3c039edc02505b11619c42271fdeb3af4f656f8235e1eea091057b63b9695a452b7ed31ce1b83d5fedb531ee6d065d88b000000000000000004030800d273c7a0901c0b5308283243203002b090634160c16253953c109434bc5a9bfd9f4a5b3eb1845a83eb55bfa77247625799cf27d799b6a9b1d7416e30bca8457664115532713b60025b391f37c1dd5cbd7c2b8c6c73b2a020e972237493dc6a7470b106451b8ae244839521090b00f55608a7010906088021766d5c0ae0482413586f7181b71f8f2c882330800c8e28a14714910c00b007000f6212ed01851545c5aa2221ade267437f9c9b58abdbdee28cc24df2d258707de58ce91b192c20688901e569e002c9cf2dcd00ef4da2406003cb7593d2007c4aeda2804e20420108181037131d307e5df5cad123a7d1c4fb460568acfe8858019b649680c00e282562813061080438704a7e3440c1e23c659142470f435df20b18092787eb0240c2200800006f9000230200075e400168c80035190601958e12edb01f12167d1109d43846cdb764a9604f4d6c17000824848440100000eb20be4305e2182690c174560982b04b1182486c12007a4dfe31e75cc9980aa59ce0488e5de289b707229ca21100c254bf7e00cfb96ca05fd10580f8357ffdc68651ed7a8c14038061519713cd275438a02159f17227adfcd54dcbef200748b7ec0ed660a50a4190f2cd36c43ab5fcc5b3c57e931824eceaff110b18397afd29028ea3230d149a47afc74e066481b311225381244b547b40d666e5d7ca6c894d0026d3ef867b2c2b002acdd63019046d45908010b8bc24f215df8b56d4999193c7e51a8c00bbbdafc761923d3e9aeccab7a3e5d508c224faaeac5d27d36dd31ed78f4e944220681030dae1575640905b1deee4e1cfcd9d91c2478a7576ad8e003d69178c2402d6ddd33826082200870e10eff61b983a1289f91248f209f8b1a84610440100000af20b80a00021920b62305a0982c84c1601742c8d77a9602894d2b65450a089042a0207008236e20f16003c222382000129011004015c540002584001f288229681588541cb05587d924348a58059a4064af0228d8c01a5ce92a1800a00121a1180400003dc82a94ec70e5343b6fd3dc4ac35e385a4650be8f50448ad6ec40826edf4e0e756e25347040e7fde99ab7c60bc50e42c06d3dd089a0d2b5f089c3006b892f13dc5a2677e04410f00a5fb4e66271c440280003e58434d49fcbf75c92a3428ed97331e258560000c208159480a424001e204151260a67b0523182886e04cb10f882388b4a8df24000088907c021e05716eeda94003d9b6f8000110e100042028020088060080201400700c01004489d1476c5b3812f9cf96d4009d7e13d50230c2000800005610000e92000276603002008000022200036a6449df085da580ccddf5348019e59b2e00004c807c0100001624000c8cd8565b87d0a31fd15c988b941dc42e04b6bc8c989d3e9fd442a0e3df91acc8cb3e8bed31c006713d57d9bcde8a1a1dba8c9b0d6def65dd1087241b75311ab994bbcb458af52bf780002d06d51c13a3c417e3ed783882ad7d735708e6431921b50bc43502ac33324ca09b32829906e5ee2aeeefd1a9fc536974e5db855d481e9f47de28b056d3e6f8a3b44522278800046f209e12a078fa826c1fd018535da15473c3cc82e1cef67a1ff6ed6d36a30780b69c65d8f8ea1459d2bb327c8c4e3c3619292540c1015f78ecc67fd36a418b803b816a2a9c11ae972afd5aa3c80b12bd740aa6f71f7b9c353c38995a8ba03feeb6ff4809015e04dd87f8463f98a5e683e194202640e5d7bf291a5927e14608b9cff0c3fc950ebace0fb1953a10bb9b11a654b8000089d7b737fec3339c7ce1016a209fa0086df5c8978faf5f5ac8af4502056566f1c543f2913a7e3e03899009a2db1380252c148bcd61a97904d9275c5ea5b268bb0670fbc49d8d0478ba060fff67ed9e5f4eea4542e9bd559f728331725480003ba904e2582690c130460961b04a0d02486c12007c291a75dfe1020218cda00088507c021c2c4493a605806d2b3e7c0090a0f80200001fcd0cd8696a2248c5a7d9d82302dbb99b5a601b772d54200120c10004000037482386c11807c49abe17f0102095c82cd0c25e915c2b002314200087142566754c710fdd786cc60cbdfc029c30a5c7fe13cd0199517c280094508002000020c40dc3784c5056934c7a58b23eab3b40dbbfc45aea2f9e04952e111b20509551c42e439195fafa06286c7e22aac1b0035927b706f92de08129ed16fbbf6151316f4581055441f4a5b)) <<< 16000) + 0x1ffd06faee646878c026e5a76b509540b7a5edeec062c9f4dc04213f0178bc1f13200022a395580a494acdc982d75e358608fc152f8c89c5b3bd5f8e25f8b60ac8992008855f4384abcc9f81c88327b8839845180004c92082320006dd340f50ca795100107990ae88006545c94002004650400100000b9208a5a0442900186810c2543005c3c799e046867ff50a01774f31102004640400108082f666570708464803920046b3a298180c1e6601800050707c011012a81c48c70947c98532c2033fde580046303a0100421100005f10001b420822b04009d09bc6f9c0c2043d09a3ccf02531f590c5012a72d91400024202000860d6eac0d5830858a3f875003dcd0e6789001c11918c600f72f5dd400094708002103dd28f8cc0021181e0087126d85f49881a851b6b7380d16c170a5803457f9bc0024181f00800006c100014920004dc405c9407e42000393341d77f2897240170a026c00221420008402004011806385a657084207c0200000a0405c3407c0a0000b7207a220341101e0680ec340740a039050000e910381d81406c0021cce04b8d8bf17180c3e250aaa38218c3aeb204035e89e41402000485844010c214adecbec4862d7c02be880a65115d32701112723ce00001212110042064d28bb992029be62fc74b14b191e23e30722270414400a752b33600128a108042c54fba7b1220528a4e5a8183d48fa1f71439eef9c3a0024142000800006d903711f14fec198c4789696e41072840336b8b20a15f8293d00f00100ed972480d08b4ff1000261c2100800009e10361d0001c19e2987dd7073c40827ba8e389cb96f0a070a8ce5f8688051c3cb7925041f00871755ca76f4f1088736a28a1012fbc1b0a08b598e9d0a0012e311b09036b33338470093d191149c10800200002ac40d417c214b47ccb4612139644804860fcd1d7f2411872713512000dddf900801b282d21804c184201000013520681a0330d0190480c4240600a02f0100022690008f0205c6202d2d01614805c2400149c40aca40544a0290d000ec91028390108a800b980dd9b5703acb50e65130e7a4fd565636cbc0463344ef63cc8d7bb9ed5c33373584643c1020af6c772d2b48a56fda639c3707abfdb6a63dcda0cbb1160000000000000000080cb642c81660521229208e08c00a00a82fafdafe0fd88d28b431caa5b6a4b67039823d7798447277139413de75c338d5ce5dd4b9f6012ec1c3bb37e7fe6f0e116a0ed7d0ec900430b75f01b0666a81188f9a3a0c4af5d35392141af1056f51251993b9780827aec104b9978577b20fa9c14383720a0b21eafc74d0bcb09db873f820259565e2441f324a117b69005080975f470718be0c3a30e9c1c09484dc050594aa08db711600004a5749780bb12a9024a38e00cf28403c1c545b0c50b41d8b22216baf28de1c585f2a79f4f7ead2392c040c10dfd58403d51e340297e0064accc09802432c655701125f8af791987bb7936c4ea9012003b9cc387518f8f9efd84ab0a97c790d801ae275510fec49cf700bab2cfdc09f4465001e94a61a5b0d59e12d25f6d6f498ab9a066b8add556816a5cb327df5c5e58cf24f7fadc646cae746e0d92c5383a808310a350d36b7919c0f64cccba717ac504359f45afa03f5645818e3f06941e79d64de09672e4bed42c9cdf230f448ca435ca09838614127123d44a6602fc0c8b227cd8c1b55ba34bc458723f199960157ac1c47395bf5501c7a0e4d4dd5915d1a6d1e37245bf800417fb4204188d562024f134eaa6b2b0b8019a1c0d5df55dc421de0e4d4861e0d28d614bf0447cfee905640cb926c695fb1a7375f56382f2fee23326c240c041d70df87c6d19c537e7e7c3e40641ad87199fe48439bd197ead8e302963862f791a01592d381ea242c283738efa2bab82aa5d6c98fd371e07503460f14f01ab7c381cb9b454f3f3ff2b4a5b1738453286340a00000c84c04004010000044409c3400103640986404a220241100066e9023290110c8084140020c44080f403e6201e2d80e948070340361201a0500c82806014002c6c40187dc8042a31c685fb2cea591bd1260a6106d41753b2c8c4af1353f9474f840000000000000000021ae180084286304302282202180020021003bd53b22fb3edf572f1486785923c19e79179ae94ff82cb3939d32061882a6d35dc45bfa02c6950435c23b7e75d6368c14d780e3db18a1056452d4240208fcadbed950a0090c24d3a1080055604b8240600e83b1641a820009472c280147fbfaea52339cf46bcf0d3a4eab814a342dab240c3efc1551000000000000000000000000000000000000000000000000003188e38e28e18410609000c00a0000181c01006c925695cda469046678897fc040c04bf3d2e112201113424d440868d2c61510e20002dc6c00082002dc6c00860024799c0b600017242831d00191426004514720a1a3b718927686205b7b71428271d63939124534f7567349c40a000c28cb00020800614658110e0814f8ed217d1800021df8b71e200094b24bd36c08a430ac061e66075ec4e40bee9b16dd774d8b6e54920257c36dab0e90848b2cb28a28b20b18a1860050070100200db201244af23051079afae0c82c60666307bd9430bcf164114a02074a3307a480002dc6c00080026dbb1df84e104a01000017c20005c8405c14000a5c405824000e944054740281a013050004e61012050005d09011390081a803cc401c4a00d210060e802c640142a0091100404801c2400c02005010007d89004210018c80084400202000010074b61)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case8" = "QuadHeightCover12Case8" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case8 private def zz2368:"s0940"="s0940":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case9 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l51 l55 l56 l58 l59 l61 l62 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xbe4926ca2, -0x586f71828, -0x84b29c11c,0x8a7f9092], ![-0x586f71828, -0x238c209e6e,0x3b9beddfa,0x5dec7b4ea], ![-0x84b29c11c,0x3b9beddfa, -0x23f6927c03,0x589d38428], ![0x8a7f9092,0x5dec7b4ea,0x589d38428, -0x2c432a714]] noncomputable def hinges:Hinges:=[(-0x411d818c,l4),(2,l9),(-0x823b02c7,l8),(0x2b6900f3,l11),(0x15b48074,l10),(0x2e5140962,l14),(-0x1aad26333,l13),(0xad18366a,l17),(0x3dc486fe,l16),(0x7453df244,l15),(0xcd05692f,l21),(0x1aad26333,l20),(-0x59c928e,l23),(-0xd411362,l22),(-0x2c432a714,l27),(-0xcd05692f,l28),(0x2c432a714,l29),(-0x2e5140962,l25),(0x18a0522e0,l30),(0x2c432a714,l33),(-0x15b48074,l38),(-0x2c432a714,l35),(0x823b02c7,l36),(0x2c432a714,l37),(0x411d818c,l34),(-0x18a0522e0,l43),(0xd411362,l42),(-0x7453df244,l41),(0x33fd80e8,l46),(-0x71e9d9f1,l45),(0x2c432a714,l51),(-0x2b6900f3,l55),(-0x3dc486fe,l56),(-0x3f91413c,l59),(0x71e9d9f1,l58),(-2,l61),(0x59c928e,l63),(-0xad18366a,l62),(0x3f91413c,l65),(-0x33fd80e8,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c432a714,l27),(0x2c432a714,l29),(0x2c432a714,l33),(-0x2c432a714,l35),(0x2c432a714,l37),(0x2c432a714,l51),(0x2e5140962,l14),(-0x2e5140962,l25),(0x7453df244,l15),(-0x7453df244,l41),(0x18a0522e0,l30),(-0x18a0522e0,l43),(0xcd05692f,l21),(-0xcd05692f,l28),(-0x1aad26333,l13),(0x1aad26333,l20),(0xad18366a,l17),(-0xad18366a,l62),(-0x3f91413c,l59),(0x3f91413c,l65),(-0x823b02c7,l8),(0x823b02c7,l36),(0x2b6900f3,l11),(-0x2b6900f3,l55),(-0x71e9d9f1,l45),(0x71e9d9f1,l58),(0x33fd80e8,l46),(-0x33fd80e8,l64),(0x3dc486fe,l16),(-0x3dc486fe,l56),(0x15b48074,l10),(-0x15b48074,l38),(-0x411d818c,l4),(0x411d818c,l34),(-0x59c928e,l23),(0x59c928e,l63),(-0xd411362,l22),(0xd411362,l42),(2,l9),(-2,l61)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x92411a013200600001248232016400c00000171086814801000000000222c0cc0100000000004205900400000000005406200800001d8bc2a058801800000010864088c0300000000221a05180400000c44409022400c0000000088301c601000000000121c0cc0100000000000181900200000006229036300c0000000a432048601800000144310230c0400000000024281980200000943214026400c00000098685014801000002b108640790030000001e120c0520040000074220c022400c00000005412044601800000094110218c040000001582e043180800000000000503200400000000000e0640080000000b834098c0300008614022029a00800000002a0c013300c0000006208811860200000000c824090c030000000000120490040000000028140b3008000000000022064008000001d84301e0c040000003908202c18080000007c54340a400800000000d0680c601000000001b09024c020000d220846031200800000006211027300c0000000cc2605e60180000000130a014c020000a813828036a0080510284110018d40180000000098480c601000a20ae08801b500500009a11824019200800013421048032401000000092108064602000000000013014802000000268240189808050829010800cd40180002b0480b013a8020000520a81200f50040000b81403802ea00800000000026009200c0000000088480c60100000000000240c80100000000001c02900400000000442c06300800000000038012401800000000012014802,0x3b0c811980600000000684406300800000000c8281460100000540c828069003000000541a0c072004000000a434180d40080000000001680c40100000000002902c8020000000002a80990060002307118406c401000860e11820498802800004218854049003000000388c2036180800000000381405300800000000f858146010000001cc290088c04000000004a2a0698040000000000940920080000000000a81c401000000000004c0c80100000000004c0290040a0490421804a4401800908e1088033080280000000150b028c02000000000014029004000000002c140b30080000000000380a4010000001442201e0c0400000000001a0710040002a06814c07a40100000000148c8126010000a619851026900400000000220c0318040000000000440620080000000a4240386018000a624c3100a10040001223882802420080048470824019840140000000000b80a40100000531586805900300000005120812180600000000002c052008000388c21e00d8802000000000e0b014c020000000310480b1806000000000058052008000509020a00908020014120209006610050000000000360290040002c8a32480bc40100000000000900e40100000000019404c803058450648402f2200c00001748223013400c0000000108981460100000000000a034802000000003a0a0518040000000c251024300c0000000148680c6010000a32448101e10040000000000320390040050c9090101f84014000000010868146010000002d210d02d002,0x2c0690040000000540901d300c0000000000420640080000010c350070c040000000003a80990060000000000e407200800000000e8c814601000000000002c0c80100000000008a0490040000000000c407200800000008c3201860180000000000640c8010000000002780590060000000004c00b200c0000000009a0264018000821cc6202f1004040438630402f2200c000148430c807a40100000000e43204e601800c608c0ac03c9005028220208c0252200c066050c39c039a401800000000b0580c601000000002111034c02000000000042049004000000004c180e30080000000000881c4010000044118280a9003000008423050152006000000844c180940080000011098300c8010000041118280a50030000000000440290040000000004830330041008e084300948803001031c4134055900580638208680821200e0000000094540930080004b0ac2081348023831810234041090070000f83088e0242008000000006c380630080000000642206460180000000001902480200000000001207100400000000241806300800000000001a0640080000290d024089003000000001a0c0718040000064220c032400c0000000000d00a401000000008824088c030000621202606620080001d03408407840100001e0420a007880200007c0f02101e10040000781083404e20080000002105003c30100000000000280c401000000000009018802000000011050061806080470411804a440180000000000780a4010000810f8210169004,0x1863902800ca0080058c9102d019a4016c1920811a0269c8038012213610c04d10050000004a461c06a0040000006104807830100000012910701280100000000230e038c0200000000004207100400000004c88703400400002610c34054801800004a218680a90030000004184405a18080000000821202c300c00002490c3405280180000026210d01500200000000003a0310040000000821200c300c00000010c24038601800000018828070c03000000000443819802000000003c1c0a30080000000048281a60100000000000d01880200000000120e051804000000000014092008000000821a818c602000000010868078c030000000240e80f18060000006424180a400800000000012816401000000000f0a034c020000000003680990060000000420a01d300c0000000001a80e401000000000361c0cc0100000000001c06900400000000001d03200400000000e8281c60100000000002a03480200000000004c0690040000000000540720080000000128580e601000000001512018c020000038c450139180a000000000044072008000388c20c010c80200000003304802cc030000072310500b20060000000c61200e300c0000000001980c4010000000000310188020000003c340a03a00400000000c4280630080000000000500e4010000000000120348020000000220480e980600000000001f0320040000000001680e40100000000d844030c030000001984a00e18080000000000d80520080000000001a80c401000000000035038802,0x290c80a180600000084781c0a400800000000e83814601000000000a05014c020000000612c81318060000000000c40b2008000000e22b80906020000001c4570320c0400000922a0e8092006000000004c1c0a3008000000860c804460200000000002d02480200000000000b8190020000000000b805200800000000984816601582241843404d39007002c64882680cd200b60c90410d0134e401c00000001689814601000000000006014802a06402046809a7200e004084d84301344014000000c22381906020000000108640c8c030000c22202a07320080000084320c032400c00000000c8500c6010000001441201e0c0400000000003a07100400014c3409007a4010000000064220446018000510cc2302690040000000000320310040000000520a01c300c00b309509201e88028000d220c140065004002c448c1680cd200b60890608d0134e401c00b109b08602688028000041108340290030000003086403c18080002106107805640100000000108381460100000010c2202d0c040000000210901618060000104420d02a400c00000008424018601800000011848070c030000000310d00e180600000000d414063008000001c25181126020000003884301e4c04000000007a720518040000000f271026300c0000000002580c4010000000000490188020000000003e809900600000008209016300c0000000001481240100000000000540c8010000000000540290040000000000c40920080000000001900a4010012612a12403d1005,0x2c10809980600000005827013300c00000000d8880c60100000001509402cc0300000034882019180800000052120013301000000000b0900e6010000000000b00248030000000001b00490060000000680900a300c00000000c8480e60100000001b84402cc030000000320480618060000006a08401630100000000c816038601800001a01040098c0500000003408807180600000009241036300c00000a30c603a0602800001421840540c050000000003c281980200001047a14026400c00000108f85014801000000010844050c030000003a360c05200400000e46a0c022400c0000000c45a044601800000184550218c04000000338b6043180800000006a2f026300c000308b00980a680200000001a0b404cc030000001082204718080000002304c0ae30100000000000a81240100000000191602cc02000000005a1a0518040000184b61a026400c00001231b804fc6028000002446600e8c04000000625c1a0520040000000b251036300c0000000110580c6010000000000210188020000084130600520060000168a219016400c0000000000b00e4010000024638c0740c050000000590c80b180600000908e10150301400002d9443404c801800000002d17028c0200000ca5f17013200600000000007805200800c114309a0334802e02281843404d3900700000000420a051804005909190301d24014000518ec188050802001422060b40669005a04403046809a7200e00000ec461a016400c000000e21480d4602000000000f0a014c02,0x4a1a140520040000000000e40b20080000000001b80c40100000391882809100300000000522603980400000618a301d0301400000c114202a06028000831b05302ad00400000000000781900200308428620170401400001908c34058801800000010864058c030000000210c80a180600000000241c0530080c1086861011a08030000610c41302ed004001461d8218145a00a0000000000340920080000000088780a601000000120110058c040000000250480598060000004e044016301000001284c1201680180000000007802480300000823a18812200600000006229022300c000590c6298188802000f208a0b406310050000ec1283a0662008000000250740c63010000328a223005480200000000002d02c8020000000000560310040000000000a40620080000000007e0164018000000000f002c8030000000001e8099006000000000440582010000000000a80304020000000001301e08040000000002e01c10080000000a249026300c00000012c86028601800000024904050c030000000002b80590060000000005400b200c0000000000480e401000000024904098c030000000431d80a180600000008239014300c0000000001801e40180000000003407c80300000000004e031004000000000094062008000308b213007a8020000000000dc02c8030000000001a005900600000000035013200c000000681280726020000000000d402c80300000000003205900400000000037013200c00000000340026402000000001b12014c02,0x770a302f530140000000000e80e40100000000001a0348020000000320880e98060000000001240e20080000000002080e401000000011844030c030000002184a00e18080000000001140e20080000000001881c401024220309f0205900600000002b0c80b18060048881849015640140000000ac3a04c60180009421827026d0040000005384600c9808071c61c118043040180000000148580e60100000002a04c02cc0303ae32e08c0418200c000000a509802930100000208e81206c80180000001c824058c0300000000005c0690040000000094140e30080000000002081c40100000000130e034c020000001082c0579808000000000c890330040000000741201a60180000000000e01c802], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((0x1a600e859ca67f8ffe7b902c26d23bae517aa90d8717ba62bbcb72fc3574334ba5e71d948930c89a31c4803b5272252adc7398404273f7c8b74e08097a5803a806f8d21d1ad04a000c3f587ec80e57e257a1843aca9c41142503b20b1d8058eb82e276bdb7bc8503af7b0b55e886ab982dab38004a16fac01206108042488e11306ec9a0b47563c5a481553f6d2891a2277a96c2614ffea8394482b3541b92840016d5a4904e0844010b7a3a508000000002dd499da96d5a2cc1e82422100c9249245240905501300600b82008034000498d500011aaef861134020924f09cbd49011f4977755ecb186f546a8d6e52c403f8365ed88d3088271b23c88d481c527e55be5bcc048ac786fd4) <<< 16000) + 0xb3400000034556713e8480170162a8000b71b0004d0085d51356692024a6617f64b1874096dc2b16201dd8fe2ae4c22147232308903941d55ef58c048dd570484c20009c05000037a42dc140008444001b90cce067abc08a27449fd6b19039f03a9bb0384bf7791af3c11cec9dc69c00ce47c39a60021008410a77a49084103d0d8e2b5694ce36ebf7e29513938f3952a41c2e51d40bc610053fb6948603c136296b329510153127e1ec890004c0380001b723bc0a1dd01048808000d0484880e47eed150ff913eaeba33e8908bda1fdb850301af0b57a219d52e7724900287d2b264c0842010924760f2797420ee96e0248865df3ab3e3cd5fe589a00a3511024ea526115a670d583e9ee296546f98909399bcf585f5d4adfa2a0800cd3975097b42f10983154bea4d75b9864b6200002d6c7ef8117a362b0755b9bf28004609451bb3bcc6000000005f529cae4d9d3fb1f8442924922aa09a058c9089823038000100680008c1000408323efba9950489ea064c1e728564d8d287221e75f8755900466bbd2a6780328d103c980084021146e866dac862281b3c45419748f0db21a971050ab1fa592d6110f3b0bd39709608478c4e5d848039157b0d74380002dc6c000500261e0ec75e12004e0300001f1236e02000351346ecef318000000017d4a72b93674fec7e1109e7a471e7206a05901a011e0e0000401a3b8021db010ed00800055c85d8882e8340014ba40057108ea88e05842123778e2ebc6a09206977b5856dd386202113051a0b40e3a528b008103b6380801b4c27d209c20840203b20b1d8018eb80e47cc3c5a83513f3d8568a690811e72ea628136b67c981e000704e13cc00314b367a28135dab86b2704210084911995d7b923009a0f5081e729f5524054a0ef75447a4325c2cdf799d82c220219d01bf4498395334bca1a35000028c6a695f982000263c73d1d89c410005e078b7a3a508000000002dd499da96d5a2cc1e82422100c9249245218c18b09305502e000200d000124200068c647d9f53a8a113e620a57a491524d33dd94455329918918003630973c9000d8ff0ec080d02aeb8d27042100842a45f680016e3420b0f5c664ffda59397e090508b27a9af40b24914d04904cb4864c1400040c00008036496d8d644e54491002faee28091828b1c0835932cd5ab38e78a43583b32579d4c15f9b04752e400001312d0028e004e02800018a20005ec40011c0c8f8fdde349227e985bca44e1008a475d88042559bc7c28144d89b261e0099c7f8985002f0da3c338010804228d6889211548a01a6196f61222c34270a82880401bd7e4711610311f862365023ec1b34c8280007dadadc490036e345bc554001300800006d0c8fb28e122aa27e32afff5522a248d79d280422c22f833c0148aebfe0200181c1b6260021008451991b7c46024500015750de050f0015752a0048f04bb16f2f148a4149998a344456ecfa2d5352c20811e198d248012824b499bf4001400a00007148001881091050003361e3a835757e2138d0019bfaa411300066ff3003c71e8b32eae4e0ac82b0ea0d3c122868c196c800005ca1a340260772ca697042601005f8282f8143ac020001e820023aa4404641982a1d5050009e79b2e5e0fdc7f02ca005f5dc500c26099cc36f5385309b0d5bdcc1094f50e99e101002625a000b00e185e1e671a3841300a0750143a60a1d20506d0086f8043a2021d0010e00080008b88de8ac304476f474a10000000005ba933b52dab45983d0484420191451a41641441619a01400370c010068de04873c2439c121cd090c984864814398021cb010e50081dc040003f846e8c63724bd2143ecd298dee48aa22c86e386bab6702916e0a08b48c867bf0e69e102017d6f649b06401b8dc50401e75e1c13bdf0c21018f746bc7fd44de47c80029afec13af4ee1a40100408299700a577322320e254abea9cd108221a441fcedd804872f5af12c8ce5e50c3445af8773a50542d0a3dcece7399b64807386a284355a7a76578a083cd6179bae7561726101bdf1ecf1f36b162a9e68142231d7bcb03ce3ab014410559c9737c68c3ff62418c589caf1ce688e1400002ed2392721c8310002f890843dcce94d0781b2caa541dabc3485e4d3cd0142422ac54038045eb27ab2c0322e3a482604200085bd1d2840000000016ea4ced4b6ad1660f412110806482081c6903881049808805c100401a00024c7cf8e01282fcc713091a494c3965c2e568f346d51884fc79441018844a34b840d391830a9f73d72f3a9e0824112b18c109218c0061468cdfd131e1e84807043705406c00800088082180e87ab94347b985ed67a3a91c4ab4fa4c51012a82aa381e01096fcac9803c4b6a86cc004001089ecfa204013c92470207eac5a27c7125bf254e14950821733bca3370818680b475fc6ad90167414442dec8a008b0afc463dfa401d1121cd40f591f4001701c00007f881302a481f319fc2a7fa674656ad780df20715191a6ec901a40732b00836f84110ef21a15d90e0c8d3fa4667f860f0062e3dc171a02781cfeb07a9925008580601c701000101999c37e306702ca6c3620da9a4149d83ff50061c08b74650228f93efe380109989ee16020e73a17a700210084ce122d2c9139e6902df0f1f5fb0910040f6646c906185cdb51fc24081877196665f498021073b8684d100ce55a69c0fa00009ff70f792a82000ac0a00003c447181403e03000384200122a605866215928f634b2c1d425d8788102850183a73081ca4706b61cc1428d5f89be55b10131e)) <<< 16000) + 0x35b159367800c124d06cfcd0247823f007781774061581403202438a020002123862d3fa168489e5147bab65ba18524d6a93b7d1221dcdf6efd0060986cc699fe020862b9113159e02069feeb8218054231421ef121008500401c4010e180c2d804384020040100011911c10d8e000f89087b9e26c5a2c906397e773d638614c9ca39e3c3048ab53ffe1c2203005a1596207103363ae5b471d08105ff05e4a162c0a737dae8d12000a39030580581bf1506d0486f82400046a46f4461821bb7a3a508000000002dd499da96d5a2cc1e82422100c8a28d20a20b0c308d00a00012e300200d1bc150dd88864c343241200c0503b8080006b88dd14c6e48782f8236101fac23f4920257adb6ac3a8102a63ab4ce6d0166c900becc720599839238818c09000e000147fd5859a3c326f4d906eaebbe32bb6190101e240c7fa29a33ac7dad55b8630c790233d000269223e5a1b811000cd611b345d0a3efcbf1ecf87163887e3e9701410f5abbdbbc62405f3742d9ae2300a6d445d60e03000276d58cac0020a0a04e5ccd1c7580cb7078935922eef5a144b609e17a07e59438ca05605000024720dc8306c3183584e827d504ff497df4e9a2d5e229b5991c20071b085ef0a2f3afbe74b3338020174521e95e7572fa945f3b75bb1f101299f8a488c101ef067d3a9bef33200ab39967c442e7aff9b7fea271bf000401435df4e44729bda197de48108680049ef3e2f1a8821db5838a90d8258e25dcc65bbe44afd4e28f74a98a6219e61230b99d37ef0324a27900000000000000000011c8840321c51c32822011011400c014040408cd1e4a11d736d85e7e783ec68c9d99c67604207c929d098db90b238332d365222b038a2f720ee498761ba45992d4000c888d8a486dd1436c721b5190a5028001be08da06e75864ffe0016e3420587ae3327c36278f9b8258bc6968ce8bc6968cd3aa1154b73aa1154b8091531d5a673680b364805f663902d0b1891881860c30400e724b0aff1c6d833fe565afbc624947d9e5ccef5792559d631020301cbcb2ef1b9f0dc2b4742de2233cec6fdc502793cd534c72b6d8c438c22de891a13bfc7518c1881ede2fe0c13f7f0db20380086f18a5c60058ba511b800820331a1180400005548d998c098963643bc17c11b080fd611fa49012bd6db561d40813f0dc9eb4fc3727ab055d4a65a9bf35e06c2322852051c51800c0045104b4a96136c77df7963800cfb9da29424a348435b40806c86b308c04f3b3ecca8c139940b04b1876f25b8b89acacf2651ef764b718927570efd0c0ae50e2f669af78b882e8687058aee28271e4e7e5cbe8d5129886a00083641b8d60d85306b0582f02e081d62cb94c2de4c9c248cf3d8009b60fc21a70d67f0c80a478b080000000000000000004822100e8dd9de63000000002fa94e5726ce9fd8fc2232852051c5142101001400001d0f9641860ee289fdd4a304b7e3eee1612c7d827d2edb3dd9050abfd23022345d69bf7d600181c04a662323c48b14a817d04beec4d260210ed743d215b66f626674f617e6e587d98fcfa06037935de6456762cbc13b5b854cf234ae0be08d8407eb08fd248095eb6dab0ea041040eb165ca616f264e124679ec004db07e10d386b3f8640523c5840000000000000000002411429028e29200c0060020a0200dec21a80fde7142b2d2695df34b1331e642fbd6b2293411b80f3b0211f1887c45efd3eae2067a12cea5e2b4c46f016d796e377228c26a65ebf54e6d50dd6fac18ecfe6678347f5e32f0cab53e7cc36b0d2607e3810fd9b26779a140013d48d8a686c12400149240950435e421ae09000a35908511f0936b885ade8824cae86cda99073ceda7081479bd56ad98981623e524b5b821670820813e34badd40a82f782714431dbeaeeef00882002881716c20d1b0ac64ba66af2480d07c966100a8e753d3c6814f1d57a9c73f95521009b9d031ff72c77b03dd2d5a0e35ee46e579bac25389cba6d06e53d1868355d811edadd0da3bd3b92031cab282d54f56d828683dac69adfc297c75d3ee3707f1780002681c09cd56def7da81824a98ac05db50c00d94d0e60e7428192da57179ff88033cbc3cad53c088880a1c3115afd9840006513eb07328013df67d1c164a558cfdf259ec0c2c2ba1701800008f88d6aa8204c43583b0851d8d58ec6a8263520a1a80140cf9ae25c84a04709a1f190b8f760c14d71fb176b1f14206724d63d46c40214972473edb4800bdbf153d45c8e0367831532fc314001b4e4471e8a0a228228201b76ae1363beb7ca160bc0c1e69b64cb95ccc30b92e249d461616225ec47349002e5f19986087ae64cbe8d029bae5eac0400000f42400080026195391850104a010f300d444d1f4c32dc8320df8d2adc03ac328c28202e28e70d2794927bed0c24887b62a6890006cf1b0f42708240080000ba9e301d96661c18b2d57b0a9eca0c267dfb45acbcc22b50dc1856cb2033c20f76c0818002dc6c0002080225510060b00e2517aebd060012797dd4700c4861400a00007f889984f4b13198b9e428ab94ef5fdc2c8d1616c14f2c7e10f821192871140afd241c5000f4240004100b71b0022807a4a0615a1400c50fe8da002914240080000ed916d158b604c69c2701619e92f46882ebeb64e35d20884c28a1ca189186108004002000010c1200803400041c8b412c6983634a0bb240680fda975091ac80c9171d4c917e37f434cac45100039b2820008083339ed620e040009f2ce50354200b611ef92e94100420d7feeb81200f239a1601200007d)) <<< 16000) + 0x88af82c578170250e3a013f7970e203bebac7be2f0a182a1181e8d1d0810430d691d6fc0e091704bb1684f1401467c40d824b02008000568b160304ecacc5196d85254e79900c00d000042842183610a130840984180e470891566aa31c4442b4e814a1c3c5c47660eb102023d5c33880c00233d2cb880800d62f5b0ee1501056dc059b480000028ca8500280001ae2001f104690f6346731a22dfa98d9b2b3d85ecfb9341eeac4846261259060e58e60c58c60830180001006e97fc3cd547c590bc9b9fe1260f32683bd8260cc41c0b5d058ddd819828a3020ff718c7e1000767e871c0801d93b7cf3400120040000684e14b3cbf140e2c94b84d7d3b14397abce1c94b192bf24fb7e58a4ca55a59c28584535d41d820039eedc9949c10940200002f446842764b447330efca1c57c288cc448c3f1b2c16528583f1e8c1e122389e25751c300622ee96fa1304128040680040002c0467c2633c0bb2586462d958510e954e35ad2460981d93f0142cdc2306a8ca1027e3ab140488950130f9b04007ab2509724e104a010c298486be8fb5842c9ae1b10788ba0cb202aaf5dd5d6e61c711416ad8bef60b1ba57dd72c89f52853dca19394035c8041611f4c47dbd08001206e333c81c10027a889e01ac067104821901e3c408f74befb57ddc981deb902ecab45f58c06ba6aca7cc78aa640000000000000000002389649640e39631429220611001804010068000d59000424233a1219c050cd8080017e88cd00c664063300319701c0e3e829b3b09e68d46634d00f28aceb0b29471503fee91993c93fd5232091c48be7a32698b1c44afd13bc480114ff2124a0009402103a808c759767949221b251538a1a4ca8fa31e49a9df3135ce259513d48204820a1cd54d8080032c5744582002b5f06bea800250080000d51f36380e53a907186e05ccd5438951bdddc601a48239b24b4ce2092b4f350e69104f8148d10400bb32ad6e13821280400005e8f189dc92f65434b4d929eaf91a436f69155b4c20499d4374a60f0d62e11f724508e24d7a388007ec40ec749c109402032c0200018f232a1319405d6f58a3fa1a02f1a8844ed58d4422769c5838bc0141d683eaac25238c34b3483083072812c004030080200dbe32db222d20589c61451c49a49a414308116084064000401bc650d7bee25740e2c3b0a4aa70865141b22fd1d3203898696e2a18d29a4844db81acf90d2200b90c43e8058408ab57482fc10210ae621353c1200054e09ad362289002d028000115100030c2326121920503b808001304fa98d9b2b3d85ecfb9341eeac4846281c79a79479271258e20648180001006c0eacafed8e99e525130381acf24d52711880712f7e2e4ed524102f95cb630400103270dc81001fabfa3a53801280400005e4f9b113f2429838c3e25130991c4a8b6bd5040e2098393c6a669107ffeecab2860111b9fd002004890757f89c10940200002f478c38a9a28801a5abc9c68164d21b7b48aadc610322534d3f30780062702f12287c6cb83844003aefd65b24e084a010196010000c79195098ca02f8c508b6ba221a5bfc2e8f380d22452b0b340610233e9d2ba30758b8674fe96001520542581002a6fc80c64e084a010e32078c49b6366eab0a2822eb096e219a730e25b05d4f35b53b564d24b3b8ee5a5a88f64d20ae5565095767398a1818cfd4cce20ff8440806b93d328a34890b041f0c9e54163f548200070dc8ded53c4bb0c2822400f0181c66f92a175d00e2c7cff530dea51422e7a6822c389ce43405c6b9a463d0895cee0c1c1508eaa09050c10792d18042c207087a576a0810cab3b60c5349002901800010110004dc2326121920503b808001ac08006601f531b36567b0bd9f72683dd58908c4f34e30e24d24d20c0c40c8030000200df3677a4d324071290e0f2e5e3492128dc3621c41be619df14d216c33af2c64020bdea419a0800372db3700200221190916800250080000d49e323462fa5a6696732b0850f3484d55bfe6318404d48a40c4d1ca8aad017c60ef595c8e160400b1653e8313821280400005e8e9616eef50ea30a98b47492b183b8816c592cb1c1a415901a58d19acfb2bc20405d2f67b0040886f5757a09c10940203200200018f231e1318e05e351089dab1a8844ed38b071780283ad07d5584a269661460e58e60c58c48250008064100401b8d442276ac5838bc00d8b0717802211b02df3426138c34b249348308347307281080c800080374bec1d816357b0924a10fab43c12348d68087cc0bb8c21c24fdabe15b3075ff77b49eff0b185925638970c28203784f5477a44081e517ece4602800776e5c03ffb544801701600008d08001c110b3090590282c404000a1c4644040016c6464417ea6366cacf617b3ee4d07bab121189e69c49a49a41431818a110060000401be6d4b25204d4e25323c630426920b7810078388298b63c6e1a43fbc87714c8040d01b4cba10004d51213f040086c47d9b50004a0100001a93c6443a2db83cd2cffa8851f4690ac5e8ec7b34717ebe94ab983c6702d29c0914003c4de9a0801538a9dd02704250080000bd1d2c911195eacc2b7cd17ab24c1f1468215e4b1e435a65f94b1aef472bb84810a18f25f8820090c6aaa209c109002032002000188231e1318e05e96a080ec9c130a822aa2ee6183c4bdcfa078b1c892f20d0258ca0c8e106c280022fef5ee8200422b9a7009c1094021a5c436a3c7dca124839f0d175b81a433c7032668b984202316c0bca1839141aa7081912283dad0f207b1408345eabbac7)) <<< 16000) + 0x04001288ac91fbe44001601034bb27b99df7302493e72f7982e6348e18fd7e87c03087797b85b313307b471f5c35d8245069f1ac551e2c37eb36be4e782820235d8235a72800d6ec15c1d2842400b00a0000442400108c8598482c814162020005f73ea6366cacf617b3ee4d07bab121189e69c49a49a41431818a110060000401be6d16e004cc0e251f17490146922c765d6a93883891aa2129a433a4de9974804122f631721000650541c104005a2deea3d0004a0100001a93c648564544b4d2cd167c32de690a37bbb8c030801ca6ef771a393ab1939b0c1e09f0291a2080176655adc2704250080000bd1c2a083977e2e60e72b15bde32c76e44d45c118317632992e0b18d847938024082cf3ca0fb14004d12a77393821280406400400031e463c2631c0bd2cf0a5b56e6b8b2c615045955a955524630781410ceb5cc5199638c5f13c6fcd3198b195df01d94574830482023faa67e50cea28003478a1fa2a59d02005624f921cc7068f42404021c82a31a8844ed58b0717801b160e2f004423605be684c271869649269061060e48a50210190001006e974669aadf4a249280bc83bbadc691c38ca96e750611224fb5cf32068e4c6ba590cba60f129d22232bc58ca375f95ce6450404a42cf2a845001ba428659c1114801601400008848001b790b3090590282c404000c4e400319c8c6828630040031b84094a6007a5c40ccc5ea6366cacf617b3ee4d07bab121189851641631431428e20810a0180401006e1549a9443162c80641505d88e38024e801a0b195b74386c250b25291a33814104bc6221a02006182234959c10940200002f46c9745116a9f94430cffdedbca1c4e273c7d450a83711fb22244a78d05b26820047417fef52608250080000a59a20b6f68ba22e48f133afb23b4246019bfad041922219664c4010810c6a05e9f664063185fed8e014215af4cacf9851c20a40500f0020001b023161318a05d1139a3f52a347923f61fc69ec25a48c98e5766cad312271a75293e3de4088173c68ffe3901ceac30e3c3b0380052dabb230a820078a195f39da7d08042e02c5f196d9116902c4b24a20a1c618a149149107042032000200da22a0259e73ce143d5e15a338c81862721f91d1ec48b089bad0753ca127c981710fa122145b91506301830a248b99074384061320ddecc7001dcd5101556448015810000085880017c1189090c404861c1430c02000563230a33184010c18086080412202181010005f31180390bf9c85f8e42fa7217c310bd90813c842f432052090bc8485e0042ee020056c722ecd3175658ba30c5cd762e4a31713d8429cc5c0b61083316f15c084ed9895629214424bbd44aaa808181bccec94aec8022ba2f58f258381e2640e39e7c1403550ab6a53204011154f424f70110100150141015229baad42754ba51a3221a8063d3a0e62b75ba9e30b40b101801004680be7843fc282af6c5544087f7efe3e128d79bd8aeb8b8d7fbfc7af0abab08e2cc79e90b419ad6b78a1e2b9b18feea926f0a7bcec7d09edaebfa9e1935605393dd30011570087dbce3bd31d1e333b313a05004ca64eafe45f3aff82e74cef1064d1ff68f0c972a1da495fe3e882bec652a3268d212aeaafbdfd84c7dc1e1b9f1544ec1400132b4b09b7da526eb6ddaa593e19c6bd0cd9d08b3f2bc94540599087813e088406e7420523d41574254873e194cdb38018f3c1ec25ae72f4b270c161c5170a0c2ee4cbe2966e034e18b49e8d52167f5771afd2c3c33e943e5a80d266bbd657cbf82e3917c40889d7df6b341a644a61ca1be938891c7b50e801ddf44cb5483583943825688e200a697948156886ce574f3e2bed5a37ccb7a19b182d53107f3e93f9de4fe6ae7b6a6d37f43e3d5715b95ee7453fbc027b5d69bfd29e70398c3805e51451f208591672d1a4cec35434bdc333ac36b28e379288d13580d032ebe3541250b732664a95bf98e3754a8df0156299cb78c830af2069e473d7371c7185b342fad4f3b14c81b89511f4e11085fae18a582010397c6f58afa3a8d0841f149e5b3c33499ef584a68e9936f3e082d8642bfadacc14ac3d1bd1d1cb3cfa5fb92076f95e9a78dbde8afa4fa63de213bde18e13a963ab4886c82e6000130c8b704f8b4779f99774351a1a0e76cb55faef557032c747e2aecfb3c1280926fde206597a84821965bc98ed9cd29b062e079d5a3cee5cee803880042034dfc29dd7d5fd34f54883f296c228d085d82313b52100a04167cda0c26aab3b3c83c277319a33a82e770cfc418a605c480001d9d4ee99e2f4390cc23ab33ae78942f4fac9eb15a5c02d0fc80e6d9447180be0db7f18a8e317f47e0daeaa99fcf7391ea605a172e6c4e81b9a240b308ce528736ad742d5b7d94fa020a6515e0001710800a82116d198b608c5ac462d42316901f5422a97075422a96f178d2d19b178d2d19c1222e7fe1fb2a0165a990e5c5ee05b674fec7f7d4a72b900000000146ecef31844860e38e484204600001596b74b4a0800cf4554590948def9c8396f062876cd499ec470014817f23299afe44f80fc3ac1b25fc6111263768ab52a619056500038322d063167198b302f0c34672a1e101041eb1bf0182325bdd2a9601fce0ceb22004a4fca0c84044794855a0a0280293201100400005508b2a0c590f62c6730b835802188588b62c253160058af82c578162ba0b15c01f0ccb9edf311c6daf797dc9620fd963cacb049498205a8804038429430070988048013061080420eb41f5578b0717802c6a2113b4e351089da8251422c9ea6bd)) <<< 16000) + 0x02c881cf14c14814c09000d00800c02008036073000e4eb1e29e32a7f2c81642e5a68628034bab84424042100800006b91460500013191500d82186c538262b61315a098ac84c560162ae03c24316e16c278aa4c856f8305521086db0e15d0022f248051d7d745e900aaff2c76000026242100860a7ed918a720535b0cff20e15c6efe9585094f953fea402140911cf00009480840202ac320001273832c456c1c8e12fed7b14a588a55eca1d181544b73f80600a317b638100025282100800008b10332d0001e49c0a2107a40ab7cd485534e15fd6cd00723385fcf6dae5297c5569fb284fe6fc408e2350c86aa8a66dd579d1c6e8121074e9823a10a3510d9401c00410b10e36d1a06dcf747f821542614816bbda3b5171003ad08f7d703bb121bdd03c037c12b00c808e8bc7f33cbd09a44b78f078bba691cdb707fb3742539fdc0b3ae983caa409121d6cbf7a5334d0020cfde2a21cc65b85805d016d7496872d85e51b598a02457b0e77267c652a78ecb9edff99b95ba76d8c7e907024047c2d0f5bdeb8b2f901cccafb53d620c22b74bcf9096c930a7b3395a045633707c2d2600026f501c84be1e3d001338880335502da14469d65d42663ab0bcbca9ab8701ee582afbe25d08e658543fc84246d7d1870e199ab1a840002238c1d683eaaf160e2f0058d4422769c6a2113b504b82f8236101fac23f4920257adb6ac3a8100a1164f535e8166486582402180100029243734098180743edb87fcdd0a9f5f07216e485212ef032000358025fe3f0aff46e10a160baa1cd8312d69ba4707e1468b741f1b9d9e731ff1ffbff1c22f64fc509aa2c640a717a4f50003f322aa73084398aa18c54c37020010040a704c534062a40314c018a580e031ef98ac8881ca0cf2cec00022202100841d683eaaf160e2f0058d4422769c6a2113b504a423605be6b160e2f0058b0717801b1a8844ed41336dab0ea5248095ec07eb08fe0be08d8040ccc287b529557dceb925ec385c92f61a106351089dab1a8844ed38b071780283ad07d5584aa8084065804000004b7fb766ad4d7d34b9a052247273d00c680be74340f8fc952b74f2133c05b0c51125d5967c2344e2d96e7939734d341a9ea429b20665e364a89e9d32c1e224ea185968d53b2070785639a0100a6bdc8429295d0005cb22a203f0eab5ce0a65862f176aa0280087cfa36800004650420100000bc3075a0faabc5838bc016351089da71a8844ed412908d816f9ac5838bc0162c1c5e006c6a2113b504cdb6ac3a94920257b01fac23f82f823601031a8844ed58b0717801b160e2f004423605be684c870430288050048000021b4f3987ba7f84257d58852eee77022286bd6edc095e058c52bce21ad5bc18b70316f1e1e07949cb3e9deeebe3531d0d3b46b4e061dba04a3002c44149946f354b420f1a0009b840ccc40018d2412045063cb38c02206a7a27bd0022141f00840500401000004440cc662a02314f118a706c534162980314b01c07d61938edd6aaa72fe2bb796f759f764c0480ec622b2d11e43803914b0998610362863be4e1fbdf200b730fc2f86a6a5090ea137a6750b761654dc32136981e9a389108650a28c0b205bd7dcc7f9c002990de2e30ea2e07bab5977a52000003481806d9e2538f168dfa139bba63a8b00818346e31bcd4dcfb137f23141617b1e14e54a5fd5faccaa65c04a07c5c2630f0c28966d8b404c651dc680c21bb91f68a14785a4508155caae2000013241c0046005bcbb382cb9cb63199ab41bc9cfb3ac0a4330f5f14f79137db5387c26ff1ae60f7073e7504d21fd1ed1445d65796481007a6f51afc3965d2542a12658149f48b1fd960049ffb1786f15f0b6717480adbc7aa57cf7a6f3b3a34c4f7d528a0001335b2efeb49fb08896257edbf8a4e844e5035690fcb3f5a8fb0794ff7717ec4a2d71bfd116b44fb1d9fdddae877f6e091e3ddc2ce42a13aaad53dbaf6a9a7c409fa19a72aedfc307068ff1a193ee27e323a4773c4148d2448895c1510000bd44001ab8c06004011005587e5de2c0f28128440022181e008000041114a1d0a48285201409e020001133c375724e8d041cb41ed27ef6142411c0dd8e8f4b089d331afa1c08804076ac1bb8331ccb762e92cd220c72bf395cb9751dc3a30770140174dc5e900a443f6049b548680e5eb6ec1758b5cb9820ad1f4000002dc3050fef4dd587e0e645fbf89b720414cd9a463c14cb01df201ed99940813ea42af5da845ac1f8a93f8a7752785a8c39c6ea565bf78ed02d4443f008edd4ec18c20611ed9b20a700cc328ab00009f040047a481286c004d9c8a39480cc45e0de183ba79008ac732059200e99a7f1000800466040010a2123c2c86463181caf1213fd34aea6656ab6f9b390c3929ecaa4a05c001a63a110c04902953236ef4dfa6be2836523138643e4ce7f270c8b2ed0b65e452984452ddc0183cab91c559789d647781eb0604ed680270d208798a1d43cdce794b3718b42451e44053d8d2a4e051fe86b97b42202bda4a3c18d13a9fe1e0d3368b879856bef580dc000013ecb10ff1d0303f2a2641de8775967f6c3c6466f935edeaf00fdaada31a1d1fe30a7d2da238efb91bcdb3dfda2083cf5f673da61e0e7261b5d2885d82214809c63422ae39f52d76754b6c0132bd9d18b61e51e6a5a207b0683c775595bd127c2a5c68fabb58dfa187ea8c15c0814d0c914578c1490a895fef1583b353a235e3f19a02bea15f45d3eed6f3ddffc582641363b0072ac20b0b520134f5ccfeaefd26feb4db279e3bc516df1c4cd8)) <<< 16000) + 0xac51d63ce297abb515884bd8db8e0409f9e9f3c3ecc7e000002deb9c183b2f955c830109f3472552a99d1d264a2be8c3893e9330c80b469a110247d593e94e22f7060e8be29fa970769219f4503c1c523cbacc889f80470b038e823cbb4e02f0e31ed6c70a6a4aaae2c642a2998d088422156840a2bb0f3b40002220200080000449146110003c19814017f5e60011181e0040a2828510042860200c010a10080002f880076090813183388c504362800b0d20100080110030ed227e930263989f16c4f4a7075a0faabc5838bc016351089da71a8844ed412b330a1ed4a555f73ae497b0e1724bd868418d442276ac6a2113b4e2c1c5e00a0eb41f5561298808409400e002000002dede34d4ee38f867d750958a1782b308b1cb1308b9e1408e3ae7edd22e9001eb65b5779713d5c7f1e89ba30458bca2035a7957abee16c19d58e6f71271c390baefbad58a5aa7db475e57570125bea5bbdbb1d007208a9523accbb0a9cfb6a8f2b191641b2534915786f4788b3aca79f00fdd900000000000000000412d4c872e2f702d99850f6a52aafb9d724bd870b925ec3420c6a2113b56351089da7160e2f005075a0faab0950e08508308b006000010e0811e77857108ce3f26c9551db05e36688a2af19a73363558cee15ef53ae5a10abfed87c93a0b43fc13ae35179b89d4237e97eeed4246fb9a25b70b903b3255c9d90761be873e5dc554c4b916a278320671501986a0eb41f5578b0717802c6a2113b4e351089da825211b02df358b0717802c5838bc00d8d442276a09888403c6a2113b56351089da7160e2f005075a0faab0950f10c10710b004003248de22611dd81fc6ae7f74c98b29c7dc6b8e3e4c3a927924b6c0177d23e5001b68676cf5b656b1b1a78ecf0b4424d676951ccf2c6e8a30c50aa8205db0f63f790097c0586d1100128b0de25000317980d080186ac90680130a108043c70e09c3160a1e112d39062830fe59e10530065a4188e30005ba96178400025da9a50260c220084083e02aecf4b221430c26a2c402605fe2823082200844b33ddb867a04610f74848b21544964a25882ae1a78210128a01018a0005fac67e8c00cfe4cc4a13841080400005848001161f2400f75fae386311de925091a244413d12420369c0afca0027c70ee81c00893ae400026102200800009e90004da22762200064322742b846c0b7cd62c1c5e00b160e2f0036351089da82603c50108c18c10b0c60cf00e0080010021627963d57aa3b6e63169db47dd4eee10c660bd00734827246b1368000fe90812989c94c4e08626e430d20100066b91362d09a968004a0c8942681b9040c68206c35035868005fcc89a28c4ccf6264239105c5277ff644d3454e14975db463a40bec6ee4d8cf207f1c722555669ce98b1beeb8758da90884e6c5248000b3b71a1c53e83771d012343f0dfcc0babd38a40034db5dce5729ea7278cace22dc7509285361b507603026fc950025ed70d6b910ef39a2bef7b9f509112cf6cffe0324b17dce30e3fe09a9e4279ca82492a392d80000470c8dd29cd96d2314eab6c1d233e972e55f35d205245df838ab130a3739616e90cd6856100ac9a1314e16e4406a7596a0a2306201f00d08fe042aba9d109faf349c801116a544477833cea12f0fab131ce3eef2da8a598adf29dd4703da54b4c4041f619f758663182b068db32de56e1e4ff63bcf828b9571119aa625a39249f58b9dbd9d19e8d105d7bffcca6841131ad492b6eeeb3334a166fff643ca2b33ce3c8e058b790d119e000000000000000000888ce72494c30dfecb55007988b0a121c7d36c05bb068508ffb880000000000000000022797d90ab5527994636fa756b46feeca0de8ac44cf4f055f000000000000000000000000000000000000000000000000bc44201e351089dab1a8844ed38b071780283ad07d5584ac408704184000085d0815cdb36bc40dc5b3c10f7333afe54d069f0848c07086e393ddc466180f448f66aba6e1f2d02742d9edb9c06f0dc45bacd347969a19ab4d21d70ed3bd1147d980fd49db77ce5bbc63f711556838622ca1bf183fd367b04ee7c0e79aa06a9bcafd7279e0d98480ef5211218ca350b3098b00a2b43920e6329055b16981fdc5955a89e315935aefd6a0a452b0da2893144568d284e664c52351311100050b98003467dd6ab8d0839e41469fffef0f74fae3edd59789bbd36b2c8f1c92ab3753b264d39e82199296c71b61da4279ad6909860c69a2e0b38a2ef314fea67fc3480bf91fa335da1600000430417ba1b9aedacfefd426c056d6d2667420040e1fae65e3839fea85bafba21756fb6e02c5e0c3e5cb56b0c2385c35458b2aae283afcc50d586263bb5b0d48defbef9958386a0999a5919d5f175e852d23781f46792d228f1637d6529d49bd4181f2cedc310baadff400bde86d1059206ccb6b42b43d6b9ff455962bd8029de115810078fc547cd394274630980006bc20ac72910aa0714931112eb67a1fcc3321611000fa083a17992833f2d98b6ec1cd739ee3ef6b140bad74e96c2ad29944d04e3d453007f50c0c353bda44455d1e91fe1c3186e1fe9acc9fca8e7c8d3ebb56ceb633fc9c8ef1d371edc856354a5223bd68237077366611cc90800001096c516b7d930ae935a594547ecc11d071632eb37f6a538ac75d7fb69bddb288d84c4668b43db49030ded00c1d4de838fd561db39286619dabc1d86260aa3ddd1e001b2e0822a5c98c742f8e7c0f0327366f13670456617793ffdee7efcacf9f150c91acb2ee2c61ea9a22fe925ff7f65a81)) <<< 16000) + 0x63382cdc8226497e7fdd907cdc15dbdf3e632127c50a41b149a92eeb52bb54388a01e996fd5b94d860573a41103e58c7ed7b9ef42521b86b070947799a23ef1e0cd3b837814745a609c1d45927c2d2dbbb9128020c057fddb528001c180c8045ec3ba2830002fc9dfc64a4b02b53260901fc787d65fbef237a38406393a83ae100aa53b3b62c2c83cb688b0c4bd9cb9681e9311b1bf712e2a6d5c800007c566f49abd1a0423e7bd58dbd94825539386024ecae5741dc6a37dd0bb28af340689de97a4e7cd9374ef5262a23993783b79170d743681bbdb19d56ee6ec4043a2a5229993c7df472e9a4b5ed83a8f86963a20b5f47b878b30ef3a3561048d6624af52e2badb2d390321b265040700401026002000037225e1312e05e120cf080a05091f1509de5003835653e48092337ec6000084858400100000e7225a2a000a4230001b33272986aab6bdd10c8f360250d402ebe74806dbc43eef2f8e1f8d589985a40aae86074c8420d651d4a2227c69df6b08326e87add4ced27bbdd3bab5f1720f5662dbeae9fa0200082d26a98ee3335377c2fc6bb547cc2a3e23c7f3b13d708451beeffec5a6837bcc960990289fc06e4c8a16aaef398b86e4082732abe1b2c05cc277674bd4202fc82bc9542aa357006db22f75eae0fccbf6f37a435033e3f4834ddc22988f9dcc96438f66a788e450f50000b3044b046002d5e4098c608e2ba12c7abda583848270fa251823d49899e0c0ee8347f24a017d0d9c1e000012941080430631d139c212212cbff154e0d84fc1b40586e61f783f183d5a29976804a204201012b0180600c4a807834791dc7bc910749dff94307c3f8d32924013cf3a5610018d11ee000009470840200002206c5f55527d0101c8d15612470994bdf21628518b0025d200202452798601a092304400026202100800009f91291d8001f191282d03714818c940d8421271d01a8c8498340d6120005bc224a93124490919e8488e42423a1201908f84847814006d2e40256948430ac214461082308301d8431cad9e304b1f4307d55e6693129f071ee68982228321c8d2a2a233380786552e7a86d10d26ab4d7f708603a83e97ebb912102b2c6bb57e97d89c649d3670a0f80eeb21147c4402cd1b8806b321e04c30b7016a96602a8d25dd91a1f9c42a0ee929a2dca75ff00bbe438e258f6d44c75560925792e2e6c8e59f91b269146d6ce9000280071001068f172b4ba5313656db23331c98205acfcc22856f01b121ac51395e0c5b954b56a4a6516f4bb5200143b1a0fa97f30c1d25b012fc6bf50d39d4b7a8dd8ce05ecfcfff9e408e9d815fc9747706aff1c75f1c4422ac319b5610bcb13746658c4b456db72cb5c94220a66c59805f85ef474e7295d06fd2ddb3c3fede217c1e2a53d2f54acfc0380fd5ee9c4552eda3502d37ac2b4478aff121586a6467c74969878d65622814e4b4423605be6b160e2f0058b0717801b1a8844ed4130933c09a51721603f86b0dee304fb1fb600ef04a94014474af149a75f8abaefbdc5220f8648119e09aaea7d48aa8d34172b03956654858ea347451704cd80a210000000000000000008867c443433bf7974f9dd7fbc1592325c4129669b13cd8480000000000000001ea9438a29000c0000796bf49d93f9b08a2d9af5c40665d4a1c685bee1e93a8c351bcdaee8c6b3fbf80815ea4e80649e50e1d0b87c099929dec0460c85c1dc7a532bfac5f390e800dd6c5abf63ebb887d28a93a3ecad8281a96a422a80b11ae54a116e5d7e3affc0ca65586d535cf670348993f5b3e4fe28e4d25f853ca05e4d7a9a18f5b9b6050020088235b1c207e24500aa5a3f8b0009b649832800fe3a267c040090908802100c0100408e808470042360211a01006008464040001404000698f17fbbc6945186d6d5ecf30e19283037acd0156941610301048947c900000252c2100800008c10003162230631173185294c17ca604c531161d88a8cc450662262b1120d8888480e8262201210f05fe1df78766072459ddfc2c698c471f81231a72e59564864039400000000000000000222f8cb6c88b4816c6a2113b562c1c5e006c5838bc01108d816f9a1318e29a01601000e0002804884fb525a19cce68a2a9bf8e13363e7914bf30cbf9cbfc3fba02ca90707735240044371c308322371443fffce5d60a7afd2221cefe27c2227c5fb5b32f5f843f6a17563961f0e9845dbaa22468f5535d246025714cb0321359e1fdd0e6e4ab9fa6f5c20539b0543e0d8f0029cdba87f51d5cd958a8ddddcdb670e19b7227dbf80c5b3ce40820183ef4e7654f6cf721b1a748c1ff60b14023314b840240837fd202eae8e58c28fea34d56cf7ef3e3d6e9c901393d5efa183bbda4530c38e15bd2c7060d4131ff1bdd2f1e74442b7341722a235f69b2c001050005fb15a5a018a27901d94de3a87193c1d8d2a712e01d67df62f4aa652d85acd28620be13c964ff64ac5a0b52f9e4608934f9d418ee275216215a5319fc19c5ef886b542098a81582ff638abf09432aa88962c0d88c52371e1527611fb31ad664fe5833fdb4ed615b578bf709410a8858ea22770d5897e18c1e6880dbb555a91b7f2c42e35b502fafc89a1ff749b6606af6a46b1174b3baecce86d277674d0b8e84248c9f60e249c268879f17118bef263259f7a9e670c4da324712000fe3494726801e67c3c08028004a6044010b2e80d497e8f1c7d0a8c80f0227e9faec00008c908002124a42d2112cd35dfacedd91245cecf5d9100bc7cbd0c00a0a100022018020089a7c7a2e391c77a25eeec79)) <<< 16000) + 0x68d379cb1e0459dbc3e050307801000019e44383400024244342714596f9dd90c333cac0330d24e8a9148cd01360ba5d00009070800200001c0443034000678442c442142200043822123310815f2493eb173b7b3a33d1a20baf7ff994d08223c1355d4fa91551a682e56072acca90b1d468e8a2e099b014420000000000000000011088403338e38a2492864802c00050749409ae60a7bf23065ab480361fe020b88c5623e4897dbe77266495060080583078c6088a6109284f0c7c153cfa6defadf83dd8d14c2331c72193441c04000814416506086020009eb21029a10605f985d5aed4d163faeb61b7359e2731ebc6066a848cee196f3d1f59c919a61f7733e74e9e55c248f03ad6e1ffdf7cf5706ba15e07e095978cbf06885adda448a9112a095a653207954083b7a79692ab0401ebe8f14b5516060272c33c25887615c38fe84409d85819f4308239cf5fd8f9304f76000120ef5bc5bc25eb829763029a98cbedc1af93655d4980478484de840280038e0a289ad7e71a16a02ac485e438fce9555fb8d7d8c96c29b39d118edeb73652204e93643d7e82469e1f996b4092dfa4fbb81bbded3d41304b2c2d051dcc2af6304ab98d3ee5e7b4fa9d3df7e91f22a6d1740001ca4c23605be6b160e2f0058b0717801b1a8844ed41329107c3241575df7b978a4d3afd280288e9046000000001ea6366cacf617b3ee4d07bab1211b1a8844ed58b0717801b160e2f004423605be684c861658e78050040000000a00f71ded5d7e21ab7010a8727d16cc50c43770476fea2aa2ece5af223c937b985b627e1c2a5a5c0108bd4358862e77f79b25f95c3f1bff084c24d566ee92fdb3020841218d86835d2a238ab2588a500053b2003f9e44154420882103190012c011025d85a24c4047782b240ecd195ca836840a686a95c5638f2bebe2a201f94d910aa8e206d420da88f343832b739cb64b2ed868874216c90d6b4668961344a8c8ff4bb0258ca1a071f04c1658f3093c7cb999b8c4c8a318a349a607ef16527386ed7f6ec27bfa247cea44e4590d285607bfe3d0341a71bc56627dc3113e2d930fb152aa260084792c68beb6d64c7c19df3d0a3982101b31f322ee7878edc2a80ccbd87fe53e223c5a009a956783c149b3a1d481a103ffd59e438e826c60c783c2950b7c018c1bdaa1659ad03aa6c7dbaec5722ae353c62fd1a2a869ca6c7ea918f5ee2f43777661ab5970c519979747771188b239cbb64e4c9028ccaaf222de8724403004010200030ff0187f00c3f406018030fc01e194843c2339499bf7bca085ddcd6c89849d98cf7181528382ac3f9fde8736fd059fe6a35fd9c3fa81ca6dbd77119a71ba24ff7b207a258f6318e991eb6ee8a003834e90e69e2fd408f7f1902ca13c6cd20fd5d2e5d0e5d151061b126f27a2395a9fb5ab8ad5ed0f5d58717035576aaffa377e20dbce1e736b05d0492d080800546a4e5a1925494b6e4fc2c400001d35d9345b78c5b4872fc69a840db46097a788bdff338f972d204da26b3c813b8e9ffcfe3f5babdd2a58aa569a66e8364a450a090a3230914303e12b31c9bbab6cb969ba8b215ea45ff506892fc4418080a02a2afbe34e15b4af072f99d08ce95ad44d84547c58ada225eb7280003ea18140080200000888004661e045536fc08b1ba66b44a3e48d11fa78e1278e6008d999b4b617745f75e17db55fffde940c52b8cadbe9bdf74e71650b9854b9ec8c3d997fddc1cfaa0c077b1ee2058637268dd6ac3a7a3a1feecc6e72052381dfdd631689e5dedb24f0f4e52c4fadcbdadb8196af82114c016127875224ca0f965ea394334000b364d77511b22379f521c08a3eca605fb90aa0144ebdfcb7122623b999ecff1dc77e1b1e8f4b3b8fef309f8aa39653da8f07b493da718caaaa6a4500e52f1ce08a03e5350e99a00a8e4bbad886d0d882a8aac958e4d48ce7148d2cf7b48c1ffb906f503098c20acd387ddd402d90037ea0bc3a253f812704f7d33d5508fe5096bedf72474ae8693c2835404b35b1a96874a161b01fb71a6c8eebd1141c4c711f2fe0a05cc21af96820c1ce80909010463b0dd000096821f66a0fa2d07c9683e0a41ee520262507b1283d4841e83a0f3150790883c4441e01a0ef0907704c3b4161d8020eb01000dd91004e0f3c616d6c5a03895559b0079d2ba9f74d85e30b03d21a501eef05d61049b83b74f5f32c73251ff5160d13d3e6bc9668055091998749d8501bce7737627e4e2d025550ffe0a18115bf1836a1ba74efa0ec0022a8002802159961869a6be035a530340a7b96c4a5aa3752fd312abe4466a0000d7ed2adfad9ae7fbef3ac7cef5d71ef4e03e6b222c089aa9c94b3cc89cc9a37ef7e7fdec7c5010cda2b6bcdd3a54cd6d08dc080dd4852c8bf7fa4e37979d2ebe4abc7c85e1576abdd8e132caa0000be040176b48087e718099562edc4f04a420abe1b437526bc8f67884c781075c0663a0000000000000000008a868b146b980e9de87e74230c7113be1eed4f488cc02f1a4b7000000000000000002110808608c006002aa800a35756d70025f89283e1ed9f05d85ff632c8c2c8e90540b3917ceefd1cba318271c56651a3a10220416ce642c04944469771aa5cee319e7a634f1edb06f4bab226f7b79dc4473acaeae09834a4ec01184a0ea31035805b9aee43acf76d6d56856bb2dc529c1c58456b804819df58ac6aa5f8e76e400389e54d21e23abf144197c4c7a1197e10d2932cf1bcdc83c2b54118852228a9c4d41234b10ba1d40200076c20233ec4061014c04e86d54f20e1b6430)) <<< 16000) + 0x23ae8cfea0b5420709c9d67aab5370cfe90c0620d90b67c18a1235fecc81df6883d958f3bd9f531c4e0810836c981b84a8065c74f7bb0f7a5f2a20149449a77c5e392d802ec8e7ef163388000412a060cfd5547bdbb44ce58699f57a1023820f864febe5ece307af072162b6d60404a9d4d955ad26413e9566fc9561ec5a121c7edca57ea2f0189f388b5a01cca5e3c63c5bee900406640cce59473a34b15d364504cde6924e972a6f2080c19b538eafd128c262ac98ea22173fdde2e9cc24b160185389cd1b1cd0ab0c368ec0670b606eddcbf945b5f808015c7292b599bff4959ff1f4962867bef65c7a855600002080003c55a0d6206ba6c0e6d08b24bce1090488f063f813e4fbc1d741b3fc87d3c8807fc462b40386b81bd3b4db81a0f8153fd697f7a801aa461322be0a994c43091235a2cb610e20f2aa289a1030ed9933a6184806d556146000e7a35eb8800a7d7595500110126342300875422a97075422a96f178d2d19b178d2d19c124daa6675553017629bb94138a192cd842377fedc7d9379ad612c5a0f3962ec0000000000000000000000000000000000000000000000003063a7d6808d88168508488388206184005a61944ed3b7a089d307799a2c0084d440904a0e4c69dbc3fee3839fbb19649870c0d2983f629d3840485bc274034c53987f7f33d4e865a65121197b08edeb9c4bc60b6ed4feb4406969b15a16654d4ed22a000acc4250b41224a0e9210468283a004000e7e42b91406672000d1520668b0e72587304e0272e661c87676e01bc0e10175248ef2070920b0508fb64289daf9bbb9c04024fd102b71689206c21400e93d0ce64b269ae6880449eb21e7ef4e0e63800011150100704406ff6715e6f0439147cec97a6847208aca4e92e0660450904ea153173cea540b130cd0ba8be0af6ad8d183841e7f2939d0caa000000000000000000000000000000000000000000000000000001a8c0403218324218220110004000040c8a871220d5f43f7978f090baeeed775cd58a6445683a72717c97e04328b80068200bd9a279b6b9311938e2831fa6ecd12af60ef9fe69dd3ff971913c0d4a1ca8b01d418721cc38c6613e03b16203f9392f8416f0e1bf1d13e99d0681205502613e31e7ee65209abf560ef99336c408f9cd9a918a745e569947e646dc5c1f218127bc636511971a472ca249bdbe036bc0700472919f32edbc983a167e5f61231a7614025aa26c2ea9caa18742d66ece22162740001d064c47d75205636c6cf689332984281012a1c747b95f4f548e217edc663c7e17860c0066fea90048c32bbd2a9f858852fc6ec7f8204931fb9726c5820c1fc1bd644822e76127e7c60118d8b71dde00807009dffc3521c80a00701c4430032183608c38437a38037e0d4220060e88fdb68b9e5143a54ff726ba0440692b0ee464aa0a180d7b4ef8eb8082304894a35161a066a63099ff8b3883801701c0380061be030de0106e80c3700604a03b14ddca09c50c966c211bbff6e3ec9bcd6b0962d079cb176000000000000000000000000000000000000000000000000180c040323882c81c52440c138030002e180200d0db0d86d00e258e8b978dfc7160ffc63a351838c9985c39648839bbededf220e8ad9ca09c1026fe0cde052000f0fded38c70022dc244b0d20009805112c475da2638bbf871618a21122b6b4307b41b33e8807bd47e7d2c074265678a0329ceb5fb800f002000051c86c80c07c0512cab47cacac631c5ab4ce78302b440986eaa11e714848e0674fdc26c9cf083a3426e8f8c8c0c035bfa1cad73004d46487d8b284e207042f03c06c02ec53772827143259b0846effdb8fb26f35ac258b41e72c5d80000000000000000000000000000000000000000000000006030100c9230f31128d20709100f02e000200d91854cc1de0f33e63abdd9649e61e615348c3e14e4e600fbbe0af8b029416b484c003e010000124204c0300036e2000ad86051cb2708f325c6958f5bf52927d9e414e5754b409840d3b5142f68bf1019c42aee6ee5c08315b403d88261603bfd12b0b8793881c00b80f01ae030330148c3c81d48d13cc5389d103d44a400a43a2534852a4ef43d2853b9cf3f91183140d7423f440e2b7ed2a1a3801200a3cca6a03acb3486b02f2fe1832ce3868f3004f377a452c030e6feb79400800200001fa6c53772827143259b0846effdb8fb26f35ac258b41e72c5d80000000000000000000000000000000000000000000000006030100c9230f31128d20a1460d102e000200df329a80eb2cd21ac0bcbf860cb38e1a3cc013cdde918b00c39bfada5002000800007e90003322000bb4435804000ff240043708009a090d50d0598682c824192020b101000b0310b0290579080061a482f18c35057830d9704f900150ca6d94b1afde56c49f360cbaf2248c75fd48de2f15b9359b24514640ac261f17689d7181312f030bdee6b1b1af460691aed791226bc5edfc020207ce6c0de129ec085c2047145dc39824ac2e2952a7e90001731a248542c691fd35d6f6699cb8c48cd053fd71d9124f2f0c0aace03ad86d4dc2eb1808cccf9e1d8696897c181c8ece5a23c7610eba18363ac6364890bf61ac600795fcdb848aa3997008080697a541c983bf1d2068cc56bf59cd10c240000592434cd61a45bb14ddca09c50c966c211bbff6e3ec9bcd6b0962d079cb176000000000000000000000000000000000000000000000000180c040323062c62462c42c130006c37af71bf7b8290cbf77e55e764ddbf96ff542869f08a974)) <<< 16000) + 0xdcacb7eb761ee11a2db97192d819b7c6131f8c72d4dafe292f30667dd610e130e86888c3404619e230ce1186684c330161960b0ca0586482fc9005b8d081c4b4c7a6730c24016e360070e78c196813c2c33958e118101003a9c0e0511d562965c10840101900b0c70586300ec53772827143259b0846effdb8fb26f35ac258b41e72c5d80000000000000000000000000000000000000000000000006030100c9231130f31129214909102e000200d9199faef34e44caaf509c6a25655485d34e08021e3e9e4843b5fc37b3000691c1670200b914e986700210080000ae9b14ddca09c50c966c211bbff6e3ec9bcd6b0962d079cb176000000000000000000000000000000000000000000000000180c0403248c44c3cc485242281440b8000803646457169c4952d44c531a0d5bf77e68804aed694aa3ce080ad7cb783fe12108c461bb52b82813113d8779f026000e84b90c32ec5004218b6aff0ace208002f03c000103900043c21700b99a00b71a1048d5eb4a047206802dc6c0122d270e343099489c874a34c689d3bfce240ead950b1ae0042008d7cf4c588a202ec53772827143259b0846effdb8fb26f35ac258b41e72c5d80000000000000000000000000000000000000000000000006024cd48d48b4ca4c6481340040c00008034000918c8cb5c529b05eb913368c8af22ba044ab36f8370a099215cdd440a5b7034400f5608a0dc4c001862740631f20008a13f4d2098101ed7f3c3d0ed27104021701e0000804ccd0ec74c0b7de2e123528293e651c6b040d00574fbde60001329408cd1b7a8e384c671966a48115cc4b08737fe60046170481dc137981fccd43d0900e006c0a899a5a0e623ba46a62c7954699477b6d3b8263272a84d445843b178778240e2b93c376680016174b002000149a3d3400110040000648c8ca047a03b3044c769e4081e4485005ef94f4c344008f6ebfee2812db85d7ec330004e51c139a20004f5adb9b214083284ef6b4322010a008000039440016548005c490013a23c45f938dce0d22e50fdf4459015b9114934629c548209c09bfcd8e4480088bf9aa4080054d536f09c208402018a0a0c40106180800067c8610ac3044618003b14ddca09c50c966c211bbff6e3ec9bcd6b0962d079cb176000000000000000000000000000000000000000000000000180c0403240e3cc3ca34a4023423c1b800080342fc0617c030bd01c90005b8d08089c20521e0b4f3000b71b002448fcb9a48f484c025546e078817111429510cfd460de79208328f4ae9a0008c021232cf7ec5ce899c52d3a912853a6c16fc9a1832870dc4e04197c356448241c2f2c43000fbf63954e004201000015d21220399c81952747fc81a09f6936562629a2b34b56b4052a5efb598870a0c4b58505851415c92c134041009a7ec7dc1800b091b6b2a1000066ff30024900270184d305ba04bd36fc09a24741b513890e123c74a75db2f35a24684d38e5c45f654ca08bb35aefce0898b6adf5dbc391512065e3a7210c1ca1a0003407500b29b040001842ed976f12d774801982400009a4c8ca49cf7ba2266fff3632d2110b739806788016161604435be5866e9a1809824a2080023bc63d64e084201000015f2000bde40024c4e160000d3c96479316f7cfa29e71364a65beb526120fdd7d780070e0d31bb15903840d145e0f967821b390c75cc4802fe165919a644021401002d80416a020bc0100010410bb1185d06ec53772827143259b0846effdb8fb26f35ac258b41e72c5d80000000000000000000000000000000000000000000000006030100c912d02ce2d02460c805002e000200d897bc70982140bac3dff3e1219e5ccc184c081c3257c46820cba21b9201248d5f4d96008f5a81ae700210080000ae90b90185c00c10c07334494cc2feca46842ea89ab340d0016e3600058c3a04b6e158b140eec7f1572616507557bd628223755c1212902428e46461210004e028f38000ff79ee996202668928b6d5cf910cd48d084372309c2d7469161ba49a14d1703acb1448ed3eabf026aea61642dff362f8336a282235263e8c4b84aa90242501269816c160d000018c8442a6d4c7f17244801d8300000ad8c8c1bf04995d68981afe60bc9ca10425edd1932218783ca6a2a3430039386fc4903dc9b9889909046c712eca4980003dd623fa2000069357640524109c0500003e442dc17b3a7f63fbea5395c800000000a3767798c22151050e4ce44e2434c25012c1c00008037fab822e1b30162a2081ea1c99c486984a02582701900010068000639b14ddca09c50c966c211bbff6e3ec9bcd6b0962d079cb176000000000000000000000000000000000000000000000000180c0403251050e4ce44e50b2434c0b80008036872a594443699c91184380a85a90af9666486c1e80bfb2615d3bb10ae70000770190840011e1985d3801100400005908001cc99199600f43544cc65ef373a21a74ce7230d0c02a31cbe38250aecb523000a31717584c10420100001342000df8400371cd1401e9f4303c9d7581c361c4dd6a23478c2428d1d97850206b008b41010e46503c92010135088009c308402016c0a0b5010000c61004050009b790b4110010c890b3150590882c40400727a42c0c415e4a003df8210a7a004429212882091310468480186188572880198e485686801a53085626c214a604a220030151015823bf4902713310673b0bbc2c432f27b35ba9053f956f46de62f2f344f00a12e98985f6a7b707c9fd418da187a3a226f14ca50a9ecc73983d54f)) <<< 16000) + 0xdcdbb6681419eb352671ca1eff5f8d22bff58ddac73c7aa8ee17e01d20dddfb80b2142dc028002cce7c27bca9d9142b3d02d24ac4b68e91db2cdb90b6ad7640d46e606cee000050facb1aad913d365c8bf241bcea6473bee71da53e08483293a07fe22a3c1125190ca42987aeec0c4187d3f94f888ee515e1a637643e6568dcdb07cb8a00d145d6dd0cf942df59e6a787d453b0d57499127909308b5c14ddc1083dcd61850ad1e976880c20eda4b618379908516860a3dbe33472004c22bc20c6003ee1af710009860880218502fe9ba7060e38be5210182699d3eac43004d8afe6100904088020156020aa0100008510a90500013d10a8218538ec2987614a3b01d198520ac28c46144230a10d85002c27c0613c03933c09a510965382372c37b8c13e459440d4209aed3377705298f70929298f70927cf057adf824c17c11b080fd611fa49012bd6db561d4080c71850c40c70800000165c84b9bd907893a17536a0ab398ff65fa2d9ec7f211e4854fff1eae0430043b59a55e37f0024a89bfe056dc529b364fcc174ecc0c65b3fb93df97d1e094dc90c2ace386565063c4f7bd862b72dbb4d8753d77aa542dcdd4e3b4d2b63064d84ed438a1a29bb3b8c2f9826d3ca489e660fc6e8208043b67ec680722ea4a4800004c5044010e2802a8126c8c297d5a92f61620031b5b1d922173bd98250a248afdcd4e800012921200402740400026e4270261360ba140dae02f3144e09ddee20a0c5af5375a203e31d9e0f840f873257202405feb2942c4000dfcc0aa0000042734220080000be900045d30190c5d90ff1830262554c01848a6ceb8e88043aedcae48c0c51f0806f0000113d34b800000004c784601000015921342309911f180b50094090203bb3d31f103a48b2f43a205354b42c9c024102300804c00c25c072228ced42d82861e2acb0b881e70ebee8e2848fe76a6d0817850fac0e5001ae7a06a8a010a901f6600138c1100400005bc84b02e035b4be117c70c51c8fa3e0c2b549cd764405e99a31980c1ef9cdc9a05000b6b2c05000098808802000028a425494128420931d0490e8244741203208f15047048234140009944230641162a0010102114a30895104420c21d0410c130850984204c20c07842901decb3283b2d1216a4406084da34e404023202300841d683eaaf160e2f0058d4422769c6a2113b504a08548bed0b90b01fc2b0dee304f7233fb5c0121e09aaea7d48aa8d34172b03956654858ea347451704cd80a210000000000000000008860201b1a8844ed58b0717801b160e2f004423605be684ca6924885804000665018331ddf82fc56a5d54e5d9d77587ddf485fd9981172adfc319dc75aef79914ded84c6c8ee5fa990fb1bce619f809bc19632d236083932374fab9881ed612c6fced7ee4aac80bdd1b670c3b55458806ec69fa4c5a8acf0dd8bd075dd5aba486401bd0258847964e421224751d069801188110040208041020208001000079100074b20fe3a8548bed0b90b01fc2b0dee304f7233fb5c0121724bd86ae497b0e4a555f73b330a1ed040822d265a3c2c3fe795c5ca9c30758fa99ec3eb6fb9e8a56b8cc000000000000000002219639211010e11409600015e8987140dd3f27caf67fa37baeabd7a5a7b5f50de5d0bba69a504b2deabe81815764b1e0802a57835fe2722fa4eff131671ee2b6e4e4b5ccdc94f0d0af177786c93ed3b67fa4b1492a0f400139883214c1f8a40fa4b0622583e0cc1ec560c22b0601183d04c178160ba03e1c9b46a4853058b77e9d78a147c438ebb1c530d091daca049d09d6b3300458321eb00009870880216344b60b4a040c61c2e73316101b5e838078012e006dc9a00541edaf840011d1b7d880130a110043488cd607c04a20688942393440827617c51006df7ccef3c014ec56374a003b3669630260c220084096b6af9b51c4bc5a4c96cb2691bb5e8670a5b4d6ac609020840212381cfddef948b0cd8d8da0e261d2897c32c92ce7b3f90e14005d86b23c02814ae02826082200800009d100022f3c382f196bb4c1f7e936de048e29b447113032f08f2971a007a6c2d8420051365890013081080400004dc80026b907911000323107815d89a2a25c9e4b22cd88ffcac7ff5f6970aa1ac12200c810b4014682c0e87fc5d17764f71d92683082e30893ec730cc0fd46ded6bc84f561b4c00e01512e812dd5977df2880c5cb516a5fb95a06200b25d40f31a2890c2e27907bacfcb9419bb1016758ca0f267292ddd48dabb9257338a8ad90351311edeaffc4b81038d6b3d884c7b503700671669e92724aebc8417ad932749482386d00ee020004cf20ac520762503a9081d0840e60390e244ae49a101a3e3388be0c2196abb7c4600cf998e67c001002430230080390ac00c460662300013420e26307029c1d683eaaf160e2f0058d4422769c6a2113b504a5c92f61ab925ec3929557dceccc287b4106351089dab1a8844ed38b071780283ad07d5584a63841025803001000000adede34d4ee38f867d750958a1782b308b1cb1308b9e1408e3ae7edd22e8013ad96d5de5c4f571fc7a26e8c1162f2880d69e55eafb85b0675639bdc49c70e42ebbeeb56296a9f6d1d795d5c0496fa96ef6ec7401c822a548eb32e80027610384101b9a80d03400279641bd660dc9b06d498361ec1ac4764c7b6ee70332c7ea728d5d5f3f97a80b1a16a72ec6f7a926e326d3eaf78cb1a50420a15ec97fd43bca697671bbfe1e1066bf6ec3f105f2257869102312b480275ca4e6bfe3019e52953e9aa68e9674de13a)) <<< 16000) + 0x66401fa0201dc6d8454a87cbccfe6cc495f313080b2e000a01bdded781d7c68d6da2410000008c459804f213a1988955323b1f036dc1f92dc77eff6c97b8da123554c838919d7b87dc556bada901fc1c447bc73a29cf9b464c3e60f67008e4f1457b5f1da58d4b0c2ceb1e708ce8208e619b293828510a5182ad3cf6a415d3ad65b38505f3897d33ca36e7809e0b1f5d30c91698f39a918e636028611dc043928510dae1763c09e69490f2801ff1062800002424200084080040100d40200003720d20b9113f623f9fb7d055fe3928b62d1e35a75ef916e386ea9047591794ca485acf6792daee70835385183b55cb8304f24d02801cd242eff7e513dec42300226c5b0ed8b2cc59738ced9022025cb8b2664c7f665785854e0629cecb75f15effc9003396747dc94b1db80fe27536f6ac9a16612af1d9fdfa6e0462f313d7ef1186c641cb9b24452e59c8f28153e405400010a4c82bbac9be95eeb2def78e664778398a7b297089dfb93f7925ec3fa10b6c626ac606800d2bab1f84a9861146ac4ab170b578834fde86bb7b9841a57129b7001312d17c6665cc3f0daeb9646e648d26de8359235e005632d6c5300003aa90008ba20d02be1063c9b2b9e299abf78c2330a4665143384723dd3200f19134caa2381930bf0136f20fda76e35a7d7ec20e00c0845b4624c5f921dd84f62577600aad3dafbadbdab8fb12fa74f8e4e55c4ee4462965c4f82ff46a3000a140000020ecc69b98b3832428bf9858c5ca27b1427b1f7038a5e72fc3fdfcd1a0cd9c31f099156fd0388fd7f074699827dab6e552eb1db194507c8b9b6b89f57d4596efe8d8bb554fae297cf191466eedfa85588d29ec08e55d380000b1e419c45075a0faabc5838bc016351089da71a8844ed4128933c09a542594e08dac37b8c13fcc8719510481bb31cea96472bb14a0107acd23f60fd010980806c6a2113b562c1c5e006c5838bc01108d816f9a1328e11408a0860800025f7727ec991ff34fc73345adc08c3c15cc20f34782bcc0d165e30e3abf470d5c40f8153fe8082a9aa3497d5b58bd997ed3abf0791dae6096b9ae97dd97002603b3be99d8cdef8dfca1a95a1f41984761460c1a5e3b77e022bced3eba772d1b126ff737d70c289ab73b47306cd57107d6ed46272b8a7e142642b25db744492692d26c96cbee8b058e3be818d11b4a319e86830354e25c1e484ab7d1a93340db00d9a6f671104913b019130766b6c9800406244b880d80d7816a34bcec07b883a8654e44f1207a20f1d7cea0035a7d37d6d90b7ec60000821f7faa7a5c480aa6b43dee561bef17189f555b22e0a77c683df352b9a4c46f6e78149e8349711650210c1db1e05ec6036f0b05705d32f6f3e6540ec6db4da8b79a0dce85934e27141d233614b5a15602b22cee71432cedff6bef33c23c7365294e6365dadbb39cb1d6327e26d525ee9413dfc676d1deaab5c3c792e70b21d88e825ea00010b04194f6001b884190f60c66b062318308cc180560be2a05e0582e80e852fb71c3c0021181f00802e02c16c060b4030590182c00e822108855a1028aec3ced0000888080021411571cfa96bb3aa5b600995ece8c5b0f28f352d103d8341e3baacade893e152e347d5dac6fd0c3f5460ae040a68648a2bc60a48544aff78ac1d9a9d11af1f8cd015f50afa2e9f76b79eeffe2c13209b1d80395610585a6809a7ae67f577e937f5a6d93cf1de28b6f8e266c5628eb1e714bd5da8ac425ec6dc70204fcf4f9e1f663f0000016f5ce0c1d97caae418084f9a392a954ce8e932515f461c49f49986405a34d088123eac9f4a7117b830745f14fd4b83b490cfa281e0e291e5d66444fc0238581c7411e5da70178718f6b6385352555716321514cc000365105711e1091e16432318c0e578909fe9a575332b55b7cd9c861c94f6552502e000d31d0884824814a991b77a6fd35f141b29189c321f2673f93864597685b2f2294c22296ee00c1e55c8e2acbc4eb23bc0f5830276b4013869043cc50ea1e6e73ca59b8c5a1228f18029ec69527028ff435cbda11015ed251e0c689d4ff0f0699b45c3cc2b5f7ac06e000009f65887f8e8181f951320ef43bacb3fb61e32337c9af6f57807ed56d18d0e8ff1853e96d11c77dc8de6d9efed1041e7afb39ed30f073930dae9442ec110a404e30000c9440037a0d0302c20d6e2000deecc6e80080044604201000009320ac6a0030d02a848150240a603e02ae02a064000847080021108ebb3173d102e0d29a4c00221820008406004010000044400030c8290ec144260a01304f09c006b2146d74ff316cf85bc69c801783d274ef3eceb91d026ea92fa2759a6e7668052ea80bea01055f559d6bd11b30d3f2e521df080eebb740be4d59ef9de370602d8e14f09ab92c1c9b4293df8c32884e14f511dd2871a1ea71e065d6b6b0f80003e50b7a280f7eaff06218a8772f533dfc01bbbe2d390265e006eef840fa5f8a2ef47d80dd0ae6f3b53ca8b37e1f55f138796073adce0553babe328f335050d570cd3e20559cc4bb0c29277019800011920e8043870cd9c93218416e2bf1c700d671548600004648400100000b620002fc413004000d4c602802008834ef329b0c035f7d0c980110a0f80400001f88198a8138440861a04b0d01f808128040920200014e20081af0a8e1729dd34216483b880c0884357dfb3c0088749a5cd0055f4be7000000652c22008403e6dd10fa8c13419e2fd900073dfd19e300c2515446000090808402182410aa8d10c2ff139b2e00008880800200001104134040980200)) <<< 16000) + 0x01b320665b81000802012c2407e0203e0102500812404000116412056000776411ca60662b000dcc3b6d5875292404af603f5847f05f046c020d7cf4c588a202f1a8844ed58d4422769c5838bc0141d683eaac2531823011c10c0080014921b9a04c0c03a1f6dc3fe6e854faf8390b7242909778190001ac012ff1f857fa370850b05d50e6c1896b4dd2383f0a345ba0f8dcecf398ff8ffdff8e117b27e284d516320538bd27ae8582a04af60a1a0987d702e2992a23a5ad2ba535ec163121a59e8ebdc2c6d2cdc81806ce0abb99443a19380b42920216b35dac56c8da14cdef60204c77e14cf150d5586f7ade76601b8ad41827a13fea022ca34b9c18866a187e34e1402b876f5a8e562a4b6f1e48236853fd1c0b895c6242daaf43dd64c319927f6ee9a893f44c5ecd0f8873e6fce32804402a1985fb5b869e4dc6bf581ac77d41502a519c1ec265ea1bcbbddb22543e13d8bd2d4b2e21c74af89cc46e1510070b9a78445daa7c9a81cfa5ef834d5ad42b5d01b2e2313359a62af49ae83d34b581d358550c42ff1119ab2a8820eb41f5578b0717802c6a2113b4e351089da825c17c11b080fd611fa49012bd6db561d40835f3d31622880bc6a2113b56351089da7160e2f005075a0faab0950914f10a10504200240bb6d6493bd707811f07d5283fc9809cb30bd34c66221770a5bf6179e97f18000ecb7ef11f4df014a84471b18e616e208cc4b11827e69c58b453d50694a3e8deb0153a7d6d0658a6e08db5a1829640b9f4900b1daaa49d003e2cb358408004a4842010c18fdfbad7e48c89d5665d1c3ba7211148c1a293daae8908285e260c0004a384201004615e9818b70b6144652642b7c1832908436d870ee80117924848ebeba2f380557f963b00004c404201000013f20004fe4000ebc81996e063a807337202aa022c97c81612ba46d22803c057bdf24042100840d4fbc37e0405583764fb96285c187e9081472a7882e584312b263b2c009194d0814035a0db2ac9c10840200002bc411417e2b2e7b7cc47176bde5f725083f658f2b28125260816980100e10a50901c262012004c184201000013520881a0430d021048104240801203f0501f0080f4040008ba40032808009f8103c3d01d9c80e8d40722200185120708a0373501b1880d4b4068220036962058ba03349002db71c334cecad68705458d470308104ba417f8601a1a96ebe140a9cc25f144002205ade3050140149900880219503f3ff45c05d4ea925e4d5016c943b5bcda1775dc279265e454c107eea8c4af1353f9474f840000000000000000021af8cb6c88b481746ecef318000000017d4a72b93674fec7e1128821411010e00005641c2d8e2c7ded42be76e9ee38ae770aa80c9026d3d5a9a3608a577d6a5533f24b7f0013e681846db274599cb68268b44277e0bc75f32f3e3c17d1f79959f8f073bd218891ed6c85949c2c8d344c0717cb8c85dc67f3ddd4f6d0c0e1e1520ccddc523f3f6486f82b07a98d8a2ca9ce0822c4d7b3f3c6faaf079b2742b697b60e6b5d32d9400394259b76bfb7cda48cc780047361ce199cc57120de50609e15721eae72d5e3d62cf91f7e87f8ae84e0d9059b2022f50a614056a2d8692ff52cd185e3202fd1f05ba7c2e7a92969425670355cb2d6a76eb476e29a4b4d2f72f6d79e18eca0fa54105fb1abdce46715e0636464e0be33e0a11b1a886475021a6d04187f234a207e541028237fef4a8b005ca85448200fc22f080250c1f008695bcffd3984326b7225902b95a6944147449a60e73fc79012860d0040000394c0400401000004440c8340004a040c4640602202f110170880b40400111a40b0c40563a02a090006d310294501420809cf404c720253581218808cb4044120210501002807c1403c0a0010102011c48402a684e4a1dade6d0bbaee13c932f22a6083f754625789a9fca3a7c20000000000000000010e70ccd89c64477d9575d99363ffc7351703e7c763e478845880f800000000000000000000000000000000000000000000000000006821431821811411010c0044100137e0556fafdda029316a38389abf0b21589f8a5ff482ecc4c5851a5530acfc54da02faf88ea506060f29f7f1b1977005d55ba2ba70e7125fc00bd65fca6297cc8072e9cab3104dc3f3986c88cf36420b87a8e11b73a116416951ee132eb4692f860be6fb6be3850845f6e3490104971bbce38500788de7b4c400453fc8490300ea75acfc80404009cd090021c51d8e23589511c39390087645f08214ef7ea4c1e0c1037c6fbc10820003340b33471180093ac37a03b140036a8e191080004321c90b00812496b057590a411c26dc4abe903013198b9e44880453fc8491021b25269a68388000b71b00020800b71b002180093cbeea380005b7f89b3800645098011451d9400a5b6a249f00f930720050a09d6890c7d4914dbec274df510280030a32c0008200185196044382053d4cbfa446000097930e3d88002508d65ad702290c2b0185961543be50745940c227e4d305150cff6dc0785900037b4925458c063943893a50c335f91474030000264e35e43384140042c804d28f69594420af7b1a9cb180f55a67f250c228d74e742c50213d4f72140480824fcc4900005b8d80013841280400005f0800194101d050002b9101c1500d84806824000f704064940301a017050004e910160500a828002e8480a22804d040247a0113900816803ca401c4a00d210060e802c640142a0090900404801c0400c020012f3200a4a004210018c8008440020200001009c581)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 41 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case9" = "QuadHeightCover12Case9" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 41 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case9 private def zz2369:"s0941"="s0941":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case10 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l13 l14 l15 l17 l20 l22 l23 l25 l27 l29 l31 l33 l35 l36 l37 l41 l43 l44 l45 l46 l51 l55 l56 l57 l58 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x5f179409b, -0x59514ba00, -0x860563200,0x16e3600], ![-0x59514ba00, -0x24605d9312,0x541d26308,0x5dca88e74], ![-0x860563200,0x541d26308, -0x2452531800,0x597f12600], ![0x16e3600,0x5dca88e74,0x597f12600, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x12689732c,l14),(-0x20d56064,l13),(0x130aaf8d0,l12),(0xc3af6ee4,l17),(0x16946bf0e,l15),(-0xe2f0534e,l20),(0x58030c33,l23),(0x94a537e2,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x134680edc,l25),(0xb4d51ce8,l31),(0x2cb417800,l33),(-0x2cb417800,l35),(-0x1314612f,l36),(0x2cb417800,l37),(-0x1ab8918c8,l43),(-0x3f544d382,l41),(-0x9cce6c88,l46),(-0x4f8e9898,l45),(0x1357953c0,l44),(0x2cb417800,l51),(0x4c5184c,l55),(-0x39b3228d,l57),(-0x3de713736,l56),(-0x17647a7c,l58),(0x17cb7999a,l62),(-0x10a0560,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x3de713736,l56),(-0x1ab8918c8,l43),(0x17cb7999a,l62),(-0x134680edc,l25),(0x12689732c,l14),(0xb4d51ce8,l31),(-0x3f544d382,l41),(0xc3af6ee4,l17),(-0x9cce6c88,l46),(0x58030c33,l23),(-0xe2f0534e,l20),(0x16946bf0e,l15),(-0x39b3228d,l57),(0x94a537e2,l22),(0x1357953c0,l44),(0x130aaf8d0,l12),(-0x4f8e9898,l45),(-0x20d56064,l13),(-0x17647a7c,l58),(-0x1314612f,l36),(0x4c5184c,l55),(-0x10a0560,l64)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x1105006180600000000002406200800000000a83814601000000002d1d024c0200016c3b0c204d20080000000000540620080000000000880c4010000000000090388020001861903201320080000000000b40620080000001882201a6018018c2c219003cd005000000004a260518040000000000240d20080000000128280e601000000000000c0c80100000042341a03a0040000000002100d200c00000016c32028601800000250d0901d002039e2da19401bda00c0718548310047b40180000012621005260200000000190501cc020000000000078190020000000b23b034300c0e18a486101376803018e12a08500dc50060000062220480b20060000000001200f200c0000000002605e40180000014c120250c04000000288620241808000000000034062008000328861a015e802000c511818405790050000000000500790060000000000b02f200c00000000c86814601000af0cc1340551005000000308820241808000000510c408c30100000000a43202c60180005a0fc1401e90040000000000581290060000000000a00d200c0000061082049860280000001884409cc030000000320900798060001342304803240100000009210806460200000000001301480200009a1082401920080029828826012d40140002905409007a80201420a4042003350060000ac1202c04ea008002882b822006d40140002e0500e00ba80200000000009802480300000000221203180400000000442c06300800000000038012401800000000012014802,0x22c3241e011d200a0038c50881019b40140e78a2882810b6803000f514e21c0f6d005000000006a2c071804000384a2220076401000000001c9101c60100000000003901880200000000000481900200000006221034300c00000001c8b01c60100000230f02807100300000461a0501e20060000007118406c301000818c11420336802820f1851450216d0060022a31c5381eda00a0000000000340e20080000000015160660080009414412006900400000072542c04a00400001d0a42b02a400c000001d148a80a801000000002d06014c0200000000000b8190020000000000f406200800000001e8b01c60100000018c120250c0400000000520a0498040000128521100d400c000000e20900fe602000000a20cc0360c050000000000340290040000000000640620080000000006a014401800c514818806fd00500000001a0880698060000000034280630080000000044002640200000000011402c8030000000000420590040000000000880720080052884084037e802800000094120068c040000000000320710040000000000140620080000188642201a80180000000000e01480200000001a0500e98060000003104404a30100000210701203a801800000002515024c0200012c2b08204d200800000004211034300c0000000118b00a601000000001b0e018c020000000330e005180600000a8341102a400c0000150642405480180000001504c0a8c030000000002c2819802000120210540244010000000420a007860200003c0841400f1004,0xf000990080000000001300d200c0000000002202a40180000000002601480200000000000981900200000000008805200800000000002206400800000000110160804000000000048061006000000000540182010000000d220806460200000000001b014802000000002c22029804000000005848073008000000a424002660200000000001601480200000002a1280598060000000002c009200c0000000006c01240180000000190901cc0200000003408807180600000006e1100b300c00000d0082004c602800000001a09018c0200000823d06013200600001147e0a016400c00000108f0280e80100000441e82402d0030000000042140398050d063611702360401e0e0c2423a022c0803c4c19684440d5810070000028c1981cf180a0000005104c06a3010000000000f0a0660080000431e8480510030000000210c807980600001047612014400c000001023a810c60200000000211e02cc02000000208620471808000000871ec08630100000228fc240288018000000220f404cc030000000411d8111806088863c35c0b3d40181098c186e80afa8030204183081016c1006042831e10a07d8200d0c4636191021bd401c10e0ca84381d608030000a31581500b100492a382112010e5200e00000000000503200400000a1092032660280000000c84403cc0300000005919011980600000000b8640b30080000006210811c60200000002f8c808cc0300000b43709815a006000000b818402330100000000168c812601001101860c80be9005,0x2d01c8020000000002e80990060000000005f00b200c0000000c45202c601800000009028074c0300000010822025180800000005221016300c0000000001480e4010000001845500b0c040000000002a80990060000000005700b200c081040822809cc803000930c60f808cd005000000000241819802040430420c091740180000009008802c602000000011024038c030000002702200b18080000094260900b400c0000000003c0124018000a214c43032100400000a4291081220060002985110404840100003b04a0e8198802000f208a0b4063100500000000003c0290040000000003d00b200c0000000000f00e40100000000001d02c802], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((0x69805d70b4d102c0112a8801c5f804e55a434b037ff8680686023b8e03030c022551001000626d3ee8000d796a47b69c04118042058010a056038b9d922eb70696007499a80e2807d3bc839c407b8b6f8b1c200190c28028001a882d40001d76e0d60050104601000019e3e50028c503001a53a1bc256ca1a48105866e981a3d07d22b9d4041129608757f1e00af272b5139c0001b2e02001800e463ea4970132030a007000039840f80784b9809744133072b467c48e460d60c8031470e10048f4c2001c0942c4b58480c1083848c2ee580ce1609fde080000c28cb000039c0a1380c000071cd91e12021b3ce288009859770016314a51216140b174a516fcbc068732928816721c029d79f01ff0a00d48da0b9e000a16d0cbce31aa718290240000e81c1c062b48e00143c5395dba3328559fef88806509653211c2e4c01f97cd356614021db2a7d831800041cdb40002c07269afcc88ae384e0380001c021b80b0db0586d00ec6304976e55a2464fdf4e3f94206004d3f6400243435ee461032c18321bc421a1401bf0924f180c01dbb5eb51f00000965033fa72363961400e000074086c88edc6c00474b896cd59106bcb4d87cbc7c1825146b0108a148148046005003002000102943435ba63ef13b32aece4de42117380396980e6ac6f734631168000f39a146c3c119d776c67fda21bb05b906e83722c7f32b53c73a1b0045054e9102c255761fe63b384a98ed597539ac2ef22eceacbe77916990d68d33e981c50dd0f75ef20cadb06567812c3c47ccbe6a393a53b57e482da8686062a28200f682b1680e2e53f76e34ac732c4ba8b4ec205e771f01c2e804c71b8009e66e7f7d00e78f4bb094a462c7439c48609eafd3329e53393cbd66520087613c13b186d18aebecbc4593f0db2cc6f72fc8202db58fd4861c66100d911d0a088884c688163c35980b0c005addb1c11400a69249a81800696f26d82000cd29841802002131a11804000055480038e90d82186b86ec651b45f039233c2f0091081b508a0456386d67291f61837d088b088082ca4042010b18e00c7a182461c291172481a9985f5e220403f59f71870c5d5537ab1832d4f570e470238b4f6fd05059c80880200002e64354261a6130d205f3c56cd7068e1bdca6b6a08d09b470dee5408c4714508308a04704400000008674feed25c6faaee0412aa1ed2fcba5250708a4abc8518ee608c12d0001d72060620d615d8c0f8f94649481a03cf5bf890e187f29bb2a5183007224b8dc3045fb1a456543043c5aa7abd0400a47c007500405c1c09a8d07d79f229c991c709c06173645e2011d2e25b36b2b97a9ffd8057d4d541339fdfb6231ac88693b0badf64e159009ad0846458c40c386304500380300299e03d7c77f574285b8dab2c1f80892a52b158ac124fe5923241094df4f3aa82010c48a066284196fc38e579234000bec86a84c350261a6130d205dcd917880474b896cdacae5ea7ff6015f535504ce78ad9ae0d1c37b94d6d411a1368e1bdca811d401db0f5ea017ae6bb3ca3f4f66f5ef71b5c713860e21631230e18c18c10a253906c74d16f520d4cca09bf403821a0a034becc9f3b9a13d172051c96fc25725f448ec65d6008987ec3d0a4267e959a7f8ce1e4b1444ee69d4a3b0d1ba9997a9105605c2e7e15f7fb41fe159c3482ae7f7ed88c6b221a4ec2eb7d938564026b421199631231031020e003b9e598fd155492e2378fd70c05c4b8dca113094e044f628b57050745e63f936be2b650f6bc998d772e7511ba817417d57a149d5723e51a7e75a318528a32168001b510d11d0003d810d0350679680035148670080049c082902f3553b1828ccd4830d65452e7ff2137f3fba0945cd91788069053af3cb2b97a9ffb43cd3b3e825350ad655d6602cc30c7086084082040050040487f654e43fcb87dc536ad8b1ab02fed99493488acc5070c465e52daf5b426f13dab86b82868f26e84ce2a6865b30e32d5b2c2e2ecd67bac678170f5ad40c1fea37c1532e498a0007fa708103d83dc70d8c08766103417ee1010201a3e6e90c1823580bcd93d746002743b141dfa0a050bd414df5381005d8eb30b43482002bd403bd63e4005732f971ad008028e8d3a8178180000930866a2c33106196330ca0506480a06b4730ba0113c709fe885a8e8981825dede359ef945086f8a37f8790201097a01e25790800cfe0489616c1c04de7503e064c5001b14fdc5e3541450050a2d9045e726b7cc201701634b03be551f069402aea5400b22b770bbd1963fc87717b72870d689002238a001e8480020802dc6c001000750af111300846008d2c0a2b4f7e0590b6fc5a5d72c785ddce590943802dc6c000d08005b8d80028000895440000024208c43613821280400005e884d80c25c076ac2f9115a23aada6d897a8e7f088ef6d3a9f7a38bde0001923845090088b18a18918c14c04c0070002e200200d00016d36ac2f9115a23aada6d897a8e7f088ef6d3a9f7a38bde0001923845090088d2cc1cb1c71430cd08800b82008036c85fa3c0e07963c22928636) <<< 16000) + 0x4a1c003d0900038a000f424000c303367d2f80410a7844f510200077caa3e0000313eccebc2804250080000d5909b0184b80eab2de697d528c4c5df54a31317804a120111851631430411809800e0005c400401a00021a40011fc8640cc31c4618c1b04f0d82704e87a8a3072da8b1800f053700286e630e3c70880800501bd00102021ccba4fc308190af32d90811298a9fe5010457faa2874447c0a130062d585f222b44755b4db12f51cfe111deda753ef4717bc000324708a261450e58c50c48258040020088e0500401a0002d240c0541101b08505dab0be445688eab69b625ea39fc223bdb4ea7de8e2f78000648e114240222852452052c42022c0410bed7974b463e2088a8db5e912bb4a5264aa359c64e9783fdb872bef6991cd6763d4973b59c9a2e061ab12581274000ab480880800197082090c0fc3607c0b81691cf33cbc910c3353bbc0813f2186b3e4a0436bae7a2c50416ec86754a002678298c00000c05f80a904000027382400861521b3e8673d650e1b4a5fa171258c00cbd90f00050c99769cd689830a092546194b238609583c5d0b218601197cc1ff810424468b4b20e20053be5d144f0820011d9282c0245565bcd2faa51898bbea946262f0094240222862463052051840821c041000b9400803400046480f02f0afa9d488f4cb1cc2c600ae9f7bcc000028628ab4105f0f86c18523c40ebd00d7f230323efb69bf3d7f208202995bb12f60ae1003e3ff79812e00341003d0900e48700a8b5617c88ad11d56d36c4bd473f84477b69d4fbd1c5ef0000c91c2284804458c50c30a60628260038082005c900401a0002ee404c34024120003de20220a00078b200126640067a086298c310874447e45d376f9438039387000123478052692a122c70c8b6f5e1423d96677bd792202d8177dc6941c0eee6e077080000e4e1c003480428014593b695ed88451177b03e04850a2946138c848ba17b75ca8509eb6049a5848807fc17f1008004dc368364e084801000017320a403a21e2cd2245c48c9456d66912853656b25cc94216af082ac09125c45d1d7a182617e3ef7c04108193ad324e004a0108c90b63d21302d35615f52d35615f52be809077e119be3fb92c2522c92881862852440811c0080c0000803400056886182809c1400062e61722a7c2658e4581fca97b5e77da0173ff8109fc64f883a4c0000000000000000084240c40a4064043844802801c790222024e288b21d82eecee1d6ed65afa72f0acc049759f9a5ab5c81abf206a467a8086ece21444350002ba21841b0c10986002c2fc07854275292539ca3073c46f5f7de3658e55e6e28f73bcc18ac15212a3b5963330a2c48ee652051b12d47ab88828241b5729c4b5c6000059682f0003f42010bc0b12c7fce87f9ae97b31e93415130a3072c73062c620528114104032080200d0000f1207c03963fe743fcd74bd98f49a0aef3ea45249c78a559b95b02505719a6f6c844469661460e60c58c40a10208380001006efd4be2a1cb02d35615f52d35615f52be809077e119be3fb92c25234b30a3072c72c60c1081240c0000803400056485e0282ec1400062642f82617a0baacb79a5f54a313177d528c4c5e01289c61a59a41a3983923161061380401006f184810f05fc696f7efe4f76690b1022f6fc68e2be3a03b060f1ab34c0a048c22e60be6a1848443176941000477f47c060109001000034440e407e6bc627489a9f471971259835a3e1c58a8c57e48126713e7674b17de49a478e56c94eb8e50e3bba42c4e3a98180165a0bc000185d584ffb5ff3bf42010b80b1e6be0d6c05a9c65f9dae1481c58a5b02ba91c4fdb79b5ff1a47ad16f2e49438e7f495dc06175c9f8ef20600173a3912140212004000068cd565bcd2faa51898bbea946262f00944f34e30e2ce24d20a1cc0c309c02008037cd7dd75be9338cbfdd0079b38b1257dd469389fccd70196348f5013a0be2871ca0483720c2eaf24d8d90c002e7472242804240080000d190002bf2000d2840f8172c7fce87f9ae97b31e93415de7d48a4938f14ab372b604a0ae334ded90888e30d2cd28d20c1c9182082070000200de01fa97356c5f7090f5ca0aa6ac2bea5a6ac2bea57d0120efc2337c7f72584a471869669060e48c504102501800010068000c0903905e9794f335245959a4780df2a9fe9c610dd920048e4b983c8c0cd90b0e048c5ac292bd2459629467e1f52d121041c5544fa0250202eb2e601aff27d08042e02c71861dd1529b7b0df34b8548add3d565a99a4442e72c32742a18c202c90d3605579d660eaf9c9b62f8b6ed10205086e0d7dc3d894004546f692b0aac440000137003463f2e7a1202010e41500004bc40011d485e0682ec34000fc04004648c8e33e729dfaa09183b30f74b748a288165b07ac0244a01bda3499e407070c6d9c0c0508167c935bc40e09f25cd547c818016ce0ed7f9000130990919c849881c2b02000010c1aacb79a5f54a313177d528c4c5e01289649641631428e2080920060380401006cb1ff3a1fe6ba5ecc7a4d0544b24b20b18a14710904404304100c820080340003c482900e58ff9d0ff35d2f663d2682bbcfa9149271e29566e56c09415c669bdb21111649631431428e20e1960820e0000401bbf52f8a872c0b4d5857d4b4d5857d4afa0241df8466f8fee4b0948c28b24b18a18a142048002030000200d00015921740a0b90500018998b1db348c3135083424ddce0b353b03fb1dce619ac9a6e9cffdd60000000000000000002389239231221021219018c0068)) <<< 16000) + 0x91a0f004054bc3430df3536537ed68f09fecc61479898056be6c5cffe6a68dd7e5f81b38d390a4e215647d0002e021701a0b70905b02800222880118110b52505a1282cc44164120b1010580082bc0415c020ad010016cf10ac3185596c2a8a61524b0a821c01707710401c1052390e05318673d13e5e6ef228061038266836436f584027d5a2abc116e49940020efc081d4d4e92128a82b585e3015816a47414cb82a68fd35a5810114d2ca59e5ecff09029119eb13ab9833dd953a235a1a45c420846060b69db26fe1a0a0d10029b526da6d3ddbc32a03896ff6e423a694e7962926ade76f9f682c59e562cc242373119871a8eae7d12df708d0804c2c4f3be26ecc27cb86b78613b001df52332b516f182089ac20960b3df95482e511d52c28e575a36dd2899e9fa3ecbc2ecf7e38415d17cf67323bdb56880a10d444a005380c29806136030a50184c80c2600612e030960185200c250061260380de309c3d8e0a281df3e0308dab45ce4b042bf9714c204148d4bd5094308002101c1186950a12c6b12a4f83633f4669a658469a14c485a1d356030a17b4582dc7a2c3d9117a05d6db73a44c6b9d4554dc0681a687d99482b69faef1c079418971dd4935a4427420a6cbeb1f176fd5a3e5b3d3c6877552d5a600803d5e46b928751b1d23db7802eeeac322d8d721917d522f50b7ff7df5022009f08286cb1107fdf521b7fb7af93f07e9a9104808427d40b814b37d891bdee2a41f8e00456367442529d0df801bd75982d16e440ce230c0002c110a30d85106c284260e20b0700185000c1bc07c26f8fcc318ae8fad665af63e533590fa530243d01d5a187ca364089758c2d307f910e4a9549bab81e30524f4e6f131283f1a14795e71f1e00deb4ff5d618c3eae5b41939f14f18f2d0013d9665a9acf8cf942ecbb7f42aee7b4665c170aed949a5ba40b4b6bc8230e495bee3722c26d46ca0874ee70dd86a9b26c00090610f7853522a60c10f3dfa81f8a86d2b7b5f45f25cfb2586910c99c826b4d5a4bce917d1169fa4400014ac84f96c278b600194660180200809d0184e00c26c06134030990184c00c25c0612c030950184a00c24c07020ee9f5661822476ab9840e8a9f96c011880f004245027e5eb23c1b84a9f6f0811a6dacff2403b99be010240c200084847e8c8bf5c67dbddbf06ddc12c77fe7e824fd000c32f06ff8f580dec9a3c9f9d610073f49624cfb96cbb585760a45ccf8c16f1fc724c5f9e1daed3fae767f4ccf8c07c97642a812fe692b5dfe88d6c174fea38987a922a32eb0f9fc38da3543fc39444075a11fc4aebed7dab224fbc9119724cad4ae5d5c977d6aa531312d7441a007300004232000a2a424836122130900584780c2380611a0380c0080202304701c01004000011108b01c01cae41a9446ac72da0e96ec15d5d8e31b3a81f572f5e678c84aabb4bf30c59b0cde80736ef1b00799d860e125ba86a00009790b18f4c3b9dbc7489bc59f1c24a8c7c8527a8a7fc4e2b8cdc8e0252fed2f9c42bc88c2f27688f2553990afdbad6af00ba7b27af3016c5ea02ae41171e01fae987c6f1f861c302140d5017a3c4d978108c5ef52e2e11116cb092ba2b000011f48308a80014d884516c224b60017a040033d082790c13837815a3b5e8ac9047877c460102883de868041301cd0b7008c83042010c21cf9ab716a8d55625f10159890405b3c18b34a281c87bf22a420110c148e7fc0c3a2db4284868c02a3fc55e22c45e4241b36194200257de8f251cfcdd829c708c03008aab71e47192998794c850a014579342f8de8e5cb5df97887a39bbcbc8510e54c6185e0f80001a090301904406c21c2610c0b0850584202c20c161040b08101f0855f94f8320202553f1f881433e22ac08002cab511c3801082c8ef000251c2100850f82f892b8ea08bdc8931f43f789e3998441a4b4e7f73c915f63c1396bae26cacdc8b65a6a8e9d8c227dfb4ae15e3e4609b4360c9008c5a0ce38ffa7b9eae0b5987ba89bbc2190b1a9c8408bb7fc0189f15bcc467c8e016a41a73168b9c75eb56c243828ad6d5960b8a8c7c59345e266e7f6ba535c7a08923182b2ffd66298c538f140f6310e7bcff05631dc7480648be73ca593030c4c0d73eeb9ecac801cf3bab17ade0203c50e7854871e997f4f35ecc2722a9433f4456800786ee2c11128a6cd7ca072cbf76a7174360a352da2f30c20babaaffa4e10bc629143580002e020602300071b2100230760583f80f807ea5cd5b17dc243d7282a963fe743fcd74bd98f49a0a91629611010811408a08200025f603f30a60435f0d64a19693598272f4df5f83bb14710b47246b13ad8ac2fa46561a25ee5c8ad961419d3d7b876a468b31be2822add476be068d29d25a9c01d36b6f7db3be698a7745005548a26781bba2461928e00d4afaa1ec18c2227ca8300042f6f8c05864bf62ce802933682e9e7b5c87fce9124a60575f6f20e489c17000032320722b00055220fc1b07d0983e02e23d4240a752c5251014844816f15562c01023201f008406106eb33900712112fe0044283c01007b09c010040100720380200802382a574425a203bda144ce01c4ff39c46083a01000009e20001b641e8340f212078058000b61077158001181d3396eb74c940157cd6d70003f2659c4000046483e0100000b4301845b4ec0061794b019c9e054aa7ff59001d468e0600a004850400100000e53c0120b2635a801a0ac92aacc0438d18b1b4bdab944b2c97c19fa1d91d66a2f468f60e1000f80c6de22e0817991c8854c79fccc0adb2b)) <<< 16000) + 0x2f182637953f14bc12b6821519c5e119a80170fa8cea9b57b49db42a9cb0e1046477b28f14733fa162c5dad50a8b69d1dd6b2b6b629d8eeaa2d4f4fafa1eeb0e8511f1c0f235c3ae436e5e1f5171a6c86b344b440f000008c041d85750e2aa102b4d8c7fb0350f65d5d14b7e7d40bc67e9c4369b140000000000000000043d4ccbd4882b02cd066f385240a1436e2e732726918c70f3055081cb14810408e000aa4c6d9ebbff13292e15b70fa54d5878475d5cf6318a5c3df0a44574ec24eff970c1a9fbbb697c8074baf719143185688f41e118c78c907518ea332cc714028da6901ce42beb8d2c70b70e420cf00306067a71c0969c9f65c25082200801d00e2434cb8eaf1845e4987862a189601649980c0c04cfd9000a13d3b884a1040010f24078ee4314208be9a96d12246ea4fecc21b7d074fcc07261291a020451cc055ce004b3a2b602708200080000ac9000276344e7da7ae355bc4df53cb0f7486102e25f538a8ba70d030330459ecb42867aca8800aeebe26f9fafb56dda1e441800523b5e3006d5832865938ceae9f3b71970ef3e32d050046dbb7a068f850a9933c110908460c0bf59626084808035a23ad84203b9141ac1c07c8534ff97eea9cef062003c27a560f03bf9597d5b45487c38dcd8d2d5b9c5c077857e507ad0065fe2134a8924247d7ac790510aa22c000275189618f56bec4070adaf16c963cb83b8f48d080b1d4a4c38033919b4d094208402112d06042e2501d375d8698b1f395ee46cd086fd0bad4d000ca55a081011efbca282608200080000971815c3d2a596308d253d67660278de820060039f0e81e500e577e0cc200133c567e04c184001000013020ea0a0003b0200190474c6a4c9e3781dbc9306ae3bb98a9a2b3470177cf329a34eed3f91459c2893f71c3883c38ee9c0e24f00d85763c3dfad0c15edc16e87ff5727b4688744dc9a4e28026ba9b3005e8daaf8cbcec6f057aa0005417ddb68ea3ba54ea807e013277e016293ed43fb36a54775afb34dd778202ff6a3d4d192400cd41479871d05400007ea79e2b66b83470dee535b504684da386f72a046683379c292050a1b71739939348c6387982a660c4065843041024000b162802104df29fc85e0adaa1ecd3c651994e5701ea5f3981c2e8a83f5d726477392e624b104c0fd4000ae0d8bd8c16663381074d08a70a0a37acf6dc70148786a6202804848420100000e720e8520732101c8ec0062fc8390e800893080184c101101001ae110413d81f86c0f81743d58e2cc3d1572026e20b8b4764e32cad6da10545eb12cfee800000000000000000443275e3723eef2318c1599054891860880450440030000a925f0505b5267b8d1078867809e65db4450d47b04c5ece6114502008006d001ab031c40d2d50e4e1dc2ab3a65cefff44a951cba85bb0be6a8449b9f90bd9fdc83ad484c5962394b2c7db5a6c61aca99e58dc32eab185b00583785dc35cfbbf94c095638e81acde7782f7fccea666593fc5ea380000000000000000008e6dc7955156539326ed160c77e7bb254d81c1625ef92eb30749d000000000000000000229a0cde70a48148408186400200002928e062e3dfe213155e48e5e3b7c5df86011501edfab22cb6a69c75fb7d3af8286c58a6dbe4a59e7ff2f331eb67ef87018c8435da4979c2465612e4439055beffb8320a8dcab6b30390aa024ed56ce4d3a349c6b04a1b40020497cd5282a23d1c4e2b744e39495d1dbb52f9f842808447260e6e36ff9271af0a1750a0988006804455a4eec8a4d2e210f145e7dc7b7910092d6a4e4060540e3cd9a681361f006700100194c084021869122260124225cc77891c24ea9930c00100265840008c32eab185b0059aec5d9096848d53da3eefc2a446c8988e6a30fa8958b21556240000000000000000008a683379c292050a1b71739939348c6387982a830c6044843847800025607974a8cf35433dce8946eca4236a47119bebec273e0b1bf17299abc5909fe93c2f4837b45cd6fa1bb88a0ebc61afca6e23952cd9f828252ceb33280020890004e520e21b0700983782e8a783636270c151424b7d514587cbb2b00d0266d3fed8000241c2200803700c1b4060d80206b0183500c1a40701c010045115c55cba522881c9b9068c3225da29e468459a486075401a30dcbb9c00be34c504260821008402004010000044419c260d01382156624fdf0c0c891a4b3678032a56de29600adba80b2004828440100000e4300401004451b98887201860712133a12003ceb80a410024b706da0000d24aff6150421004000082106705c10993712e691007dfd94ab3c0014619a1cb0050fd99560240c220080000701066058328280009ec8002981d3712f97ab6349260259a08b003e2e7f8100008c8088020000176691aff8e0c38f61b6d68a8c225edd7c44e41113047b2773c8898f2fd389b4bfc728086e126faea84f3cfd80d160c77e7bb254d81b7c51681c025ace5b80000000000000000022a87ab1c5987a2ae404dc417168ec9c6595adb420a8bd6259fdd00000000000000000088683379c292050a1b71739939348c6387982aa61838e80048018846fdf61f3637844bd1ecd1caf4be1d3707641ce99e0dbd6d7bd3d0856873fd0303044d073385932ff9e6f481a4b7c8fec82b898900aa430806ab693472ceb68725817fa167707f55dc02c3ce0d86da3c5b2548a6da847cbc81e8140cb52c743bad75ff92d3e0b7652aec690f0084b80d150007a630280100400001110642d0319280039ac83114c1847400202a4005a2)) <<< 16000) + 0x480f02f849bebaa13cf3f60345831df9eec953606df145a070096b396e0000000000000000008af53c5ac7d8b728bed72c6c624b8000000000121a0cde70a4814286dc5ce64e4d2318e1e60aa1038e18c00a00800088e60baa42490d1939fd04a3b5d113b7600433c21fdb74fc5b14f82e934d5836627e50252638010031fc29ca93fd6ed49fce781d4f12b2d1277c3b8195684397118b4b7e74ee5f260e54d2341a80027b9011050011789002769200f8bc7a0ccd9ddc516d2ff4970c692e4cabb757e0aa9d0ba8e1f6692800000000000000000118db8f2aa2aca7264dda2c18efcf764a9b0382c4bdf25d660e93a0000000000000000004543442473faf84da6340d64447f4ec9320e30d0612f7e60ec3a00000000000000000000000000000000000000000000000000190c40c304600100400400a185dcadd80b178d52d4984162a8078e995a3575ae92e6fb79a0d96fc5d29d92414ca5198d0a9adfc06b9a518420066976b56774a33bec5c4dab920012e960a46fd5cacf37a6291b3e01f809881206f81bbf10c7b976a99f30369203c819ddb79e449954677d0a5ebfc6dc7522a2eb11d635b60c6ebb02d969582fb760789a6c3d8a128e9c32d15af1dc7946d180598b2500e86585c239be9681a2d6fc7f4f303d1d5b201d680731aef220ceea8833230eb36f40026f08044a0100d3f236154f22f3a00b4f35453173cd514c60bc4191c500000000008c891461441090c60c408300145be4311baa17556563abc6ed0503dbc591c5e77b3de9496718f29bdeddcb1f05eb0d1091cfebe13698d0359111fd3b24c838c34184bdf983b0e80000000000000000000000000000000000000000000000000064124520520418320208224051b71b004aab72c190068001211c7c885b88e80e47a18f910b711d01c8f3e13cd9c5bae20162d7359396c2acd161cdc22040890629ecd67cfecd965452e7ff9b8fdd07504c448a30a4862041042801800a2fe06f034f6ccc78f9e52d24ef38ecd3b4c42b651de62a2d9bfe190f05f0191c1f212b1249ee04e8e9dfe57afe53c973a9d9d9c48af27886fa59cb3bcd2b0d1091cfebe13698d0359111fd3b24c838c34184bdf983b0e8000000000000000000000000000000000000000000000000006412452052042020822410c12405115570580200d0002352000cb64180c60be3b05e0d82e80ee6c8bc405199a9061aca8a5cffe54b6fb9f412819aa9d8c14666a4186b2a2973ff909bf9fdd04b2aa609b376c0599421220e20808c006002a8ac99068a2ede1ff1b05c3351890de5232c04d51a8d55971372299afb648282ad4a789fe7ccf06438a598e53a5b1630c128ad0971f799484e6eaa4bdc9eedf50ea07bdf2143889cc1e03ce122f3e3024e2003e6ba28e46622025e978a0fb8c68b8e0aea9e543c5065e9bce1000077fd6bb96041d7621de4e8a03689317840801b2c347de009727df7ee8139730aa1ccb2e00317d9fea90bfcefcbd4807ff095462ae9b4a2a2cdad5faa5e3bde60765b08762d7f0b23a111744c77c25dae750804ea6586394c2306b00009646e6c8bc405199a9061aca8a5cffe54b6fb9f412819aa9d8c14666a4186b2a2973ff909bf9fdd04b326502e25ca0599421220e20c0020032de2a7d067049104b6473d02b91f005e3b71dbb5cd1f094a64554c0b8057a57e9a093ae7638116230ddaeeac3ca489091fdc442f634d1437836103b5007723fd992bd2f98807c852cc328ee1810510fd71828419d1217a41881061c36a7be21040284b57bea140c53c11a1620382bc45f6482804007456feccf0013760c904310a22736a4b144968e505404005c1900010e105b2900032d905a35c871891caa2bb583524072532ea9eae677403060e8e3a3e18571c248272006cd9ff8e4ba38039c6effb7483b8630005079db0d14519628016e302d0f027eb20073136a89eddf432aa43e524fb549fb933d975be3941e0342849f19e52788d3abf95d8489c09a6ffb35ca361116871015b6e64012fa9b32279410749f91e1945c7097f1100161af53bf7a7c08587a18029c58882ce8f200d8fc2004384f51daf3aa4f3a38aaa2edf5113d35c30de1aaaf4adf02529c812c2a10083ea4fdb9650f48ebca921fd0ae19d6a8595bbd55e2f36b3d00000000000000000000000000000000000000000000000000003389639439629429020a00181a46bf3a5597fba7c9a718afe65cbb70bf15093f2242584bad5c34d6049dfca7cf18847874c952477e8e1b2ffbc667628144a52ce9f6305ad2c1eabcc6ba748581e8180ab69ecbb71e5aa2ff59ebc5f7ce535f9bfbe951853c4d5b8419a4784ebc059002dc1bfef096348667e850bc48c0047868c0018285711598d6028a0023c345e71821962a1ff7405800cb4d00f55e44001501030848bc71f2e590023107c0c81c00eacaa31635eef29b733050bdc690066086954632fe6002300800009d90590502c00815c040ac0200038120360a01a0500044d1055110005e79054210098a80481407c02000efb20a60a001dda20a4830513502800ae6c8bc4023a5c4b66d6572f53ffb00afa9aa82653631101667352c0a99cd4b029d3631101808e554c1366ed80ba8eb6527d9201bb503e895a69df9e9ba0e8fc4ef09ab88aa33600000000000000000000000000000000000000000000000000019a085c16942ec0b52041011800c0044013f4ac6240c0a5a96bb5d35c7b8b1689d57f1aa83960038059663cc97c0360d9e6d0ae42d012bf5ad861c3f9007460fea9355dec6d1080d749b)) <<< 16000) + 0x88ba4139cfb62f0b97f17b75ad3831b567030dcf14c87f75c76462278c43824247d0db03ca4118f881721acbaf1413c6609c13a141b66c7b79418d103aacc20387b1e5e86400594992cd00090508c02009a1ba149ab42163060419b942cfc1cb2433ebe91b15206535c10a63eebfd65068a15c8e60417dd10fcce127e6d1fa7cd90d696b913cbb0b631e48d203ec8ee5780b7169f73043f4345fc1a8d9bf98f581e33087ef8a2c020a038d3e1988e2620d87e255d68c85253bd0bde5095ed8e9f2318412ac000ed9fc39a428586338ab99e8386b526f89f8525231bc97aa4d33cc527e7d86e48ebd6641f7ffacd49369039fbf6b8414ed7a6418d92e40002a89b9b22f1014666a4186b2a2973ff952dbee7d04b2aa609b376c0591220c21210e10a00800200367ad4c8fed3eab78bc9ca57eebd4de4ade90533bbd718130e17f226e38f42d500022c301b733fc59e402a6b7129d0c0fc31f6e4020020e86ced06023647e61a002129011004000045c82610c12c8609423a19a23c265e48d3f2468ed18493a5d56f880c670549dc9034961c549280108042c803e96b402bae9492027a534be6ee992c68011bd7cbee29891890f8f3ebd8c28184533fc04e78f8a040643445b265dfdc1c03634903fcb2524600fdb87bdb635adf42404001b02a000091082482e07005bd1d94a14ad9735a61840095bb7d060c0bed4ac5143fe9eae378501730cb0a3098208802000027278c1a8db994750cacc489e4055c1874f99084080dc2dc2bedd353c28620f09adfcfc18642054c072ddaa6b05fa10211363a6fbac0c28280b3f437adcfbec782007294e8267297a1c1427713f539ee8c4c216f684061e0380000af082406c11c27b055b2c6b10170083ea4fdb9650f48ebca921fd0ae19d6a8595bbd55e2f36b3d000000000000000000000000000000000000000000000000000033cc9940b89728171009abaea9205a0e18c1861080860006f14aef38611c206c0888277866a0f73f248ca8adca4ae70d542c52ed4a9584783d0e2483fdecab01b97465006b73ac4ffb9e8384f6156fd149f8d1c95f48acc23b6a8c889f740012fc8230e81145407c230441102186800343882100804404002ee64104c60804a03f0981f02ffba929cfea48ba7ad67f52e4ee830511e081217277c2a91753c79800000006860ed750406bb176425a12354f68fbbf0a911b226239a8c3ea2562c85558900000000000000000022d53a93e48aaa7527c91200000000018d848c97484e84084024003001800820a0856e70cb6fa876066ceff91fab05b2615d035f09cd5dfc0611e6dc5bc039b545e6a137b173bdebbd437307ff57bea0600c674716fa72b3de5188916ebebdce370fcbe3e4fe2b66d941b1eddc02e73d5c46d14a289890f316f554d6d53ae767aeb709016d6f123750a805b849bebaa13cf3f60345831df9eec953606df145a070096b396e0000000000000000008a6bb176425a12354f68fbbf0a911b226239a8c3ea2562c85558900000000000000000022a166bf6f1c2816a50c400380300007374a586caa04874d5ddc753be9daa9a82e86eb28ba084922efdbd1315e4ecb97c0381d041f78678c63b81010e640616d8dbfc10bff9a9b7cac49470547b38b7cff5f15048822b611047cd8ff6c917b338e69d0f53d32b860ed22cad302c299f9f22405cabf52f0c00075b27200282840008808e146c96bb4fd2bac202310f3a82b72d71492cad0945d60cc5a6df443b1c831003c90cbbcad04147c03cdde8b6ae7e752953084e0da3ed23bac9e20d2aade9f532fb66ebd6c54c33e56dd42280801a226a041f66cbba4da0edb8e4c4b4467d0385d5f75f27d5eb2c2a5584da9e2ac46d504c3940801042b8875edf375dc96c93e88b58e17c17f9e59f8c2284bfa7ba67e71bea9c01128430a2fc8003a7fe00f8cbf3e51c932f922b514b09d7936739c692378e01de1aa853a7dbccd5e58feef21db8c75c564b694c2d1fab8816139d18d091d5cb72f1b033d9202a11ae30a3aa21d620a95a140001ce881e80f830bf7cc93b8c318b8b8f9a323901b2b98285b15efd03a6350633ff1a7efbfa110ad12027493da047caf0dc584e6a5239a6d2c3d537836c8380ae75de09961803d17608011932d1d680da247eb2f7b631ca5fe98d037e9e6c3d18f0e0d9cf3811824cd2ed9946c10aaf344db591628bbcf88def30d5a217114787f7fd3083802b5715d5ae319fe764a25836af211f0e79e0ac395c07fb4923997149cdd4737c5bffb9b9ed37ab385294debfe7bc9ec8beb73e0b731cc060efd3aa209d800a07fb2bb32f66fdd6278666a42a381dde2b98bb004ba8ff581e77b381aff92468f88a3feaf770a00173e4f23b982f1c32980628a9fa2ba7c99f2dac7ce0035786445adc4574e68595343b746624f74bf8a1880f95cb4ddbc5d65444b7100020027b7cdc8afdb646c590f4f10ef1d2a15490f916cca089e4a431dee73c0004eb903c1d81d8ec0e8660722a03811c0c18945da6260b61865973c9059c7d1ccc100980ea196a141b5593fe3a004a284601003705e06ad55e1f930121ca70b9120881944a5c8066c30f3dc2829d57189c34039a4908f8000aa739fe0002718210080000b410360968854978b2a30221ed3101840901186450f03641680cc6808a4306fc1094408402133c851daed4688048798e010323e6179d8809e617607020793fa22824a08420109882a8fa09038302f3f261840f57f49e2cd005bd7cad00815ee9c29a250421008000082903505c8c350fc6513c4036024148c180)) <<< 16000) + 0x13ee6f4206c57a9ae72001080424302338f8a4f101897f32e306099b076c081b4945b6fa800e6ade93e500210080000819814eecd3b8450896bafe305076eed6130d00d2457cf49010800200001a640c8260005ec400152c81a08f443829c7c93021b67468c141462836550c10d4d24293c0b74531fa340e0eed9020026142000868677576658a0eab171e69c0c86bc1ff0c1900452fa0048283e0100000d7200044a40cc540011b46c211f30bd2380b86eb22f300b4ff2c2e008c40800218183b1e69d410378b4f3ea044184201080000802260d50b4c0a302ddfe081a20352505eb1800f0040000280c00004011c21071f6e14c093e006ce8803fddd25e3001f00800005110000df2064130001ec20005106009d164412880905031639a0539a9f8604016da202b01206100043417eb23ca880fb498eb0105d16edf0046183a0100000a22062020001aa20602b02f15017008001550c02afb895201024abfd4aa580196971aa3806d14d88c1817f740d22080cd012e7a004c284001080732e88468a0d25d7014081a573a2a52c11d03f93e103e6f08270d028b8ce7793020f804201eb1f1f6788180554d951610081a06496083bdd808040bce3e61c928210004000040081682c0b01744c34613d7283592ae96610337e35e751c20cda3ec8340ac3bd2820c05555b8380260c2000858c14bb34a438d0e10bb0c60a5a526fd030aaf12abd6306215f46064a0840010e34cf35bf08c2a1ee67611a2018097901222f1c2ce11e03a8126c392821000400003f8e16d9c29a44b1085ec8eb45115fb4c1f450c0624b23d101f4ac34ac250820008000080100033320008f84001c088158880943405412029050004521c15ecc4f12083404c5d38a037e8256300118a0f80400a0154082dca7ab0e02edb5edd460009b4485708c208402100801004000011102709d06056efcd1282008ba2f418042fa5c2f808c30840210040100471608f62b60e021e1dd9191020f80400001e4c0100401004c0300003720002104000744812848000bfc8120a808c240440a02105000216902031000f22101f19001889101e01c6485b1e909816e01fa97356c5f7090f5ca0aa58ff9d0ff35d2f663d2682a658e5843044804003800082ced788e9902cbe9b0fcf7c727a2f84f4f256b399bb4469e328355fd2ac718c20865bfdd494e7f5245d3d6b3fa97277418288f040910b35fb78e140b3275e3723eef2318c15990552c7fce87f9ae97b31e9341543031c31000c00400054a70cf63e4f82dafd1580984e54f10f0ffc289e020072fc3caf8d202d7be92b520b383c49257232849427b3669a92601476a00ed87af500b8041f527edcb287a475e5490fe8570ceb542caddeaaf179b59e800000000000000000000000000000000000000000000000000019e3242d8f484c0b33451c5344204201140087d2e1ad4fd898ff6b7d92bdae711cfbd862f3634ea6c49c7f8bbf2f74beb301e76477b3768e1ade3792427c00f64c18e836286683c135aa4266e5d32e413b5cfa0c1a267b5d36d5c9f6ba34515a554060d12dc0792cb1034ea2345d809030880200001be4074140380201b0100d00806404000be240608402e22000995363db37a7427751372e036f19386d1ac384d2d2f79cb0b3f19defad1023575ff4cf5f7b350856f9a86fac3040e7eff5519de1faa2619147234514d920cfc37f240bdddbb00b8aaf64aaa0a2544592e619136aa80a0e0088c754fb7e3ed48b1e94afae2cef9f56fabed58031358790e87fe39959eb58fb9e2b71e7c85485419fa3a56619f813815e084e799822f6acda8eda9544a165e1090f4d1166308355396f5e8312944e8fa2ab2de697d528c4c5df54a31317804a3fba929cfea48ba7ad67f52e4ee830511e08121fa6336c9f0816e01fa97356c5f7090f5ca0aa0c31819811410a000acfd71de515a67f7636c25ba20d97c77219bfada16eeb5eed4382a66de467b577152e9d32f65c2890916dd2eb51cbe27ed565bcd2faa51898bbea946262f00960107d49fb72ca1e91d795243fa15c33ad50b2b77aabc5e6d67a000000000000000000000000000000000000000000000000000067700fd4b9ab62fb8487ae5054c9d78dc8fbbc8c63056641573fbf6c4635910d276175bec9c2b20135a108d4c10610c0c708268529c4e951e8bc0fea812588c2a6f2cbf65a891ae1968c6ade80605ec1922e9993555786fd31f0e957f5402c83886668aca36ca672a6e3b857b632c1ca2cb2c6bbf7237017cee2f469c3cfac412f8c4372004a5ecb1035a1665e0aa86cf29f8dee8f4b9c673e89620ed4b214001c3480c0c805c4400158a40588402a3a001041202872013190090480072a4808828014fa4802d1590079123c24df5d509e79fb01a2c18efcf764a9b036f8a2d03804b59cb70000000000000000004511431821811411010c001420f345261dece0b50b749fc8ef6752d27e98923162122f4578bd0292632b81cb2e77f80b049a92ed5a9f754ec0d5b96b6fc90569623ff3fac77c7159c813145611b708d526547e223054af32a40ce28401b6d0077038215b66256ee0824a71e51f64180292554a1f02804d5f939c0451870a00510d1091cfebe13698d0359111fd3b24c838c34184bdf983b0e8000000000000000000000000000000000000000000000000006411861c51841820411c0080157f1e1b164dc707c01a00048040408401e3a000416201c5a00d2d00616802cb4014320090900400801c0400c020050100200800226c8019880086400202000010055e31)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case10" = "QuadHeightCover12Case10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case10 private def zz2370:"s0942"="s0942":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l13 l14 l15 l17 l20 l21 l22 l23 l25 l27 l28 l29 l31 l33 l35 l36 l37 l41 l42 l43 l44 l45 l46 l51 l55 l56 l57 l58 l59 l62 l63 l64 l65) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x5eb8a701b, -0x59514ba00, -0x860563314,0x16e35dc], ![-0x59514ba00, -0x2035ed95f9,0x3a4d28524,0x69b2d2be4], ![-0x860563314,0x3a4d28524, -0x2452531800,0x597f12600], ![0x16e35dc,0x69b2d2be4,0x597f12600, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x1ae6c64d0,l14),(-0x2c46b178c,l13),(0x37cfb0924,l12),(0xa5bee440,l17),(-0x875155ec,l15),(0x93db850a,l21),(-0x9bb7a408,l20),(0x9873b777,l23),(0x171a36ddc,l22),(-0x2cb417800,l27),(-0x4a3709ca,l28),(0x2cb417800,l29),(-0x20a709680,l25),(0xb376592b,l31),(0x2cb417800,l33),(-0x2cb417800,l35),(-0x1314612f,l36),(0x2cb417800,l37),(-0x165561bb6,l43),(-0xc2d94abe,l42),(-0x3ae4f4484,l41),(-0xa8116ed8,l46),(-0x73c3bc3c,l45),(0x2e11570f0,l44),(0x2cb417800,l51),(0x4c5184c,l55),(-0x20e2f8d8,l57),(-0x3d895d2c4,l56),(-0x64e7348c,l59),(-0x213ec9196,l58),(-0x94ada62,l63),(0x17fc9e196,l62),(0x86f0b48c,l65),(0x5bdb7678,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x3d895d2c4,l56),(-0x20a709680,l25),(0x1ae6c64d0,l14),(-0x2c46b178c,l13),(0x17fc9e196,l62),(-0x165561bb6,l43),(-0x213ec9196,l58),(0xb376592b,l31),(0x9873b777,l23),(-0x3ae4f4484,l41),(0x93db850a,l21),(0x37cfb0924,l12),(0x86f0b48c,l65),(0x171a36ddc,l22),(0x2e11570f0,l44),(-0xa8116ed8,l46),(0xa5bee440,l17),(-0x64e7348c,l59),(-0x4a3709ca,l28),(-0xc2d94abe,l42),(0x5bdb7678,l64),(-0x9bb7a408,l20),(-0x73c3bc3c,l45),(-0x20e2f8d8,l57),(-0x875155ec,l15),(-0x94ada62,l63),(-0x1314612f,l36),(0x4c5184c,l55)] def dynamicTables : DynamicPackedCheck.Tables := ⟨72, #[0xcc094803000000000002c0c8010000002c4910130c04000000000003c0c801000000250d05039002000000244710130c0400000390f0540990030000000001e140cc01000000000b06018c0200000000007c0348030000741441a014900400000000006803480300000000f160c0d00100000000000340c80100000000008407480300000000008c094803000000000024034803000004413044029003000071184460331004000000000007024802000000018838070c03000000204610120c04000000001f0b028c0200000000006c09480300007a17c3401e9004000000000064074803000000001109024c020000000288c4030c030000000288c40b0c03000000000011024802000000184410120c0400000000170b014c0200000000c83c054c030000000d0130214c040000550ec1201d500400000000d8240d4c03000000010844058c03000000010844090c0300000000c828054c0300000000000d024802000000104210230c04000000c21040930c0500000001904803cc0300000001984c0bcc0300000001884409cc030000001242100c8c0400000000001301480201440a104400635006000a60a209804b500500004d08c1200c900400005409c1401b50040000001341200c4c040000520a81200f500400004d0841200c900400005609016027500401420a404200335006000a20ae08801b500500005c0a01c0175004000000000098024803000000001109018c0200000000000240c80100000000110b018c02000000000070024803000000000012014802,0x1b0e014c0200006c14437012100400006c1443f012100430f1460418080ed00700006c144370321004000000120d09029002000000002d1d024c020000b61d86102690040000000188840d0c03000000000001c0c801000000001105034c0200000210882407100300000210a824071003000c314408404fd0050000410c41603310040000480841500910040000740d02101e100400003c0841400f10040000000000050188020000000000090188020000000841400f0c04000000008828030c03000980c21340361005000000c20a40250c050000000c42101b0c040000000d42501b0c04000000c21340360c05000000ca1440360c050016f2840940c350050017228a0980ae90050016e2820d80ce9005000000002105034c0202d2285060015690060000003cc290044c04000007918858029003000000000035024802000000003509034c020000003515090350020000000000190248020000f338863026d004001e63882b40cf500503c638414d03675006001ec3902e80af500500000049250501d00200000000000501c80200000000001601480200000000016140cc010000000248e4090c03000000003d2d024c020000f62d8a10269004000000000011038802000000000011018802000000000021018802000000001106014c020000000000e0c0cc01000000000d0a024c0200000025191101d002000000210d0602d00200000000000e01480200000000090701cc02000000000260c0cc01000000003513028c02000000000d06024c020000000000c4074803,0x2c4a101b0c04000000033084074c030000002e1b1502d002001221c62b40be500500000000001d01880200000000001d03880200163242404066d0050017524e41c0f6d00502cf2452050216d00600000000009c0348030000042188300a90030000000000880348030000000d41d0310c040000460841100e50040000440d41d032100400000000090503cc020009808208401a500500004f0841100e5004000000000a0603cc02000000000f07028c0200000002088409cc03000000a20cc0360c0500000000001a01480200000000001b0188020000000000190188020000000000d4028803000001021ac0c18c05000000104350318c04000a10d210808c500500000000120a014c02000000000d0b028c0200000000000902480200000000d8240b4c03000000000120c0cc0100000000110e018c02000000002619014c0200000000002b01880200000000002a01480200000000015402880300000000002901880200000000004409c80300000000004c0bc803000e518820806fd00500000000002903880200000000005c03480300000000004c094803000000000044074803000000000048034803000000009024034c0300000000001903880200000310c84403500300000001604c028c03001131261980a5d0050010c11819404dd0050000000c41103a8c0400000000d028074c030000000c4110128c04000000000021024802000000000906024c02000ee1820d80ce9005000e110610406d50050000000001e240cc0100000001d08c0a8c03000003a118480a9003,0x3105034c020000000208c4050c03029220105c0218900602c624408d025a50060000002d0d0501d002001251d61900461005586242043409ca500702cc24809a021a5006000000384d101b0c0402c725914c008c10060000a618c22006100400000018c220248c040000000249040d8c030000a50841102a90040000000208c40d0c030000b20cc130129004000000254110068c040012c1c22dc02610050000052120540790030014618228401490050000001c42201fcc04000c21061340be5005000000002109034c0200000020c120248c04000006a248480b10037bf355096c02375007789343083403b7500704493c618d03475006002323d836808f500500000000150d034c020000000000210388020000e31543602550040000d224c2103550040000d42442202e90040000000003a4c0cc010000d224c1603690040000d4244220069004000006a25844075003000000002505034c0203522c105c0218900600000003912c0a8c0300000000002501880203c63440cd025a50060000f52c443007500400000019110702d0020000f42d84501b5004786342063409ca500703cc3480da021a50060022734431400d10050001113586500e90040000000490e4038c03000000000d07034c02040638410d025a5006000000000462c0cc01806382083409ca50078863c20a3404b3900700000000003d024802000000039064034c030000000390640d4c030000003cc510244c040000000309640d8c03000006a1e054079003001ac24218402790050000d621c7200ad004,0x1a0c0cc0100000492285008900300000000022140cc01000000000000c0c801000000002e1902cc020000000c4210238c040000000cc2302b8c040000002e061008cc04000005a1b84c0ad00300000002c8c808cc0300000000c84403cc0300000002f8c808cc03000000002d19024c0200000511509c0dd0030000a21504701790040000000001a240cc010000042158480b9003000c110e0a0026100500000000210a02cc020000000218ec050c03000c414219c0241005000000000223c0cc0100000441d84804d0030000000228f4050c030000000208e4050c030000000208e40d0c030000871cc280219004001611840b80dd50050016218809c0655005589243063403b7500700000001c8a40d0c03001301c60c80be900500000001c8a4050c03000000002505024c02001361d20f008e900553f215056c02375007509203043403b750070000002f1e0d019002000005121828059003030928610d034750060019229826808f50050000c129c3600b100400000000001501880200103182284066d0050011518e29c0f6d005020f1851450216d0060000861041400ed0040000b21904902bd0040000b219044017d00461828806d004bfd007000000001f1202cc0261e28a070409dfd0076062820634053fd007000000000015024802001a32c42bc0df500503462c410d025a50066862c2083409ca50077063020a3404b390070000b20c41a0195004000005a0c83403500300000000003102480200000590983407500300000002d064034c0300000002d0640d4c03,0x2d01c80200000000000640c8010000000000320148020000000001500608040000000001700e08040000000000240308030000000001301e08040000000001101608040000001a44100c8c0400000000001b01480200000001609c04cc03000000001611014c0200000001608404cc0300000000161201cc0200000014848004cc0400000001509402cc030000000000b00248030000000000d802480300000001a044038c03000001a01040098c0500000000190901cc0200000001b84402cc03000000001a09018c02000000001d1a02cc02000003b1a8280510030000001d1a0501500200000001e0d404cc03000003d1b8280510030000039198280510030000001c4650218c0400000391b8380d10030000001dc6b0218c0400000001c8cc088c03001231c2304066d005001351ce31c0f6d005024f1c51850216d0060000921041100a1004000000002106034c02000000001209018c0200000002590c050c0300000000026440cc01000004f228300d9003000000026914050c03000000024904050c030000000249040d0c0300009520418031900402441c3081016c100602621cf11702cf5006000000001206014c024b51c908d0082f5007025c1d508703ac10064b11cd8844086f500702531c311d015f500602541cf08503ec10065862420234053fd00751a2028a940593d00752a2010b380833d007028c2090c303af90065242068a840873d0070000002043201fcc0401c214304d0249900600000000250d01cc02000001020a4064cc050000000cc1300a8c04,0x108640d8c030000001043100e4c040000010e19c0648c0500000008c1400acc040000010a1940348c050000001103400e4c04000000000221c0cc0100000000150d024c020000811ec6c01b10040000760941d03310040000000941d0318c04000f208a0b4063100500000000002701880200000000002601480200000000013402880300000000015002c80300000000015404c80300000000015c02c80300000000002901c802000000000005c0c80100000000002d02480200000000002e01480200000000002503880200000000001d02c80200000000001e01c8020000000000fc04c8030000000000f402c80300000000078004c804000000002a2601cc0200000002a934098c0300000002b93c058c03000000028924058c03000000002d29028c0200000002c944088c030000000002e540cc0100000000001503880200000000262201cc02000000026914098c0300000002791c058c03000000024904058c03000000002925028c02000000028924088c030000000002a4c0cc0100000000009003c80300000000009407c80300000000008405c80300000001d8cc050c030000000001e340cc0100000001e8d4050c0300000001c8c4050c0300000000221e01cc020000000228f4098c030000000238fc058c030000000208e4058c03000000002521028c02000000024904088c0300000001c8c40d0c0300000000004c0348030000000000500748030000000000440548030000000000440f480300000000017002c80300000000017404c80300000000017c02c803,0x2d03880200000591d0300cd003000000001906034c0201861230f50399900600000000019c02c803018c10d0f10399900600000000110d018c0200000000019404c8030010214c0ac064d005402143022c03f7d007024218608b03c7d006000e31101840f79005000e115223009cd00501830c808101ef1006000000000160c0cc01000000c20a4064cc050000000841103a8c04000000009028074c0300000008c1300a8c04000000084110128c0400000561884804d00300000310a82c0b9003000000002315018c0200000531905008d003000000190b050390020000000001bc02c80300000000003501c802000002b11844059003000000000033018802000000000d09018c02000000190e05019002000c21061340eed005000000014884058c030000000148840d0c030000000000a0c0cc01000000014884050c03000a30ac0e006c10050000001845500b0c0401c210608b03c7d006000e41181580dfd0050000000188a40d0c030000000188a4050c03000a20c211409cd00531014186a402b3d0070102081045013990062aa1018574050f5007000930c60f808cd00501010c10830245d006000000011024038c0300000001282402cc03000000120110058c04000000138110058c0400000250982402d0030000000000780248030000a214c4303210040000a61444101210040000aa14c43032100400000521488409100300000016110902900200000008415022cc0400000008c1f00acc040000000b015022cc04000001021840648c050000000a41101acc04,0x2f01880200007109016025500400000000003101c802018214304d01e8100600007119c1401b1004000005d1c82806d00300000000017402880300000000002d018802], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((0x69803ee1ecf140b0044aa2001c5d44c07d540d2c05b6ecd4268e045340b4c0c30089544000c0021a786ec010134fff88cd90004a020e2edf43299c6963440425818200b71b0010098b1eb710107ac86467468031e3d313100073f2346dc00840100002b67ca0044aa20069549ad84da0c280112a7b11a381acceb8c34510c7cfa200820112a880030004d3f5bd80056008d5433804230080000cd9e2400f423d218484beb46183061f503a3246096dd32b218104ceb9e6411c0070f628252c06eef8693e4000014584602808230080000ce9b204a93aeccac944005117580242c61e8bececb1858bf7cd9a23328d137fe391b13e041121567f37e434148cf2c69e82380947859653500e2d018560580001e8240a131fb058fc00f081b5b55e5c4a2470048afe117c2849cfb65880433035811d21b25a0414a0d86f2e3c1800d8c1c8d5a81001e77393367f000199ee40722c00032d40e1601600007e09038ac6a8464021b2000d8ff84e8457c2cbad1b0a0bc543923f1c301864b7a32ab08040080be9af80c000608f24be0000579a1e1eb00150b662966a51001770c713d62d0c5854048c1cda108bacf090c0202fa6be0a0a949ae21bd0a008ba4b644f460012c04fe344400a0ce1e0b240009f1e177d6c051011e88eba3f8b4e58500380001d023fe420003d636342c0c877923712aaa011031221a4998e080320b878c082d2424102928a1000406a806404032010190000c2b4063fe031fe0190300f483e5534512c8ba04ff2e34494da3b2f34277f2e282081a9eab2f220009637da7052614200080f302c79417642f149f2e1440c6201e29a26769555714210d19e57101a05ed9ed94010d17fea02a130e1000400004dc9028cc7ec463f003c1e76f8a9b04220f3df31c5ebde6e724ac771fb991be5adb6a006846075f3fe3da3ce3885ba68ceba4c2602c6dbcf0c77a6c6c381886412801e96eb3c835196f94ffb362d1186a9c766414df4e3465653c8160c001e835be75f8b310c215fb010ed8c64add1815d222ac63b18b4c8067749ec996d98c487026787dcc4807299456692d80f274be989f908068a78e156d5a683daeaf9a59e5751c41a8d5f1df6c32c859a259000052c24084200084a2001428477cb76e35dc23ef7b7eaac8835e5a6c69c9acc41281aa4a9b817f4fcff1bb9328dfff92b1a73b048458c48c384304184482100a05aea712dc4244c30e9edc67771a5de780f5a9d96b07f2f3429a611703dadfc4e8416b54870b8720a221e8d508c804364001b1ff09d42467780773b2ba93f8da6ccffb9d95d4a046258c3041844824025802803243c1a4938eefc6358d311ec85c9262fa062fcc47a982e46e157a7548806caa4bde98629cfca6ce72c6e13e856868000994c8d00395c014b072e9e32c6758f959d3eb26eb5231962f5e81f5c3bf53a05bdc9459119f91990e84cc2e9601c20b87eb8081c3b67f458e8261c327ea7e393d1469b6fa4b0c17ec06f767f2531e8974af206fab0750debc0c10513ac8a4f9b44eca9f0cd67071b9c18ffe3ab49007534b251b84e1aed9150370ac5fde7c54b2f65922a0654ef2397fe443f7c665aaac42e1bb32e6447babfee188a946360a77079e99ba872a054871961b87c8f7274edb7632bd2ae30f2c8d243f9401685ab5124b93cfe2890df70541d472f18a481d8436bfcb030d514bc10182c6a8164040b2010590002c7fc063fc031fd01dea096d2f23ef7b7ead6572f53ffc5fbac20e826000b71aee11f7bdbf556441af2d3634e4d66209419443f37cbfa7e7f8ddc9946fffdca41da7824146b0110a1c80c70c30010149ccc1e6b1745d2f30a9ef4df92f4e9590498180f2982876ba31b3b897e65fee90501db56c316f92d5) <<< 16000) + 0x91b992bbfbcc28a6395547f0263f6131fa098fc84c7e0076e35dc23ef7b7eaac8835e5a6c69c9acc412d42467780773b2ba93f8da6ccffb9d95d4a046d460199c4984964922861906f68e53e25411ac2ca2c3b0de7da6b9719792c36d84a6c29fb1ae4e5c491d84d8e4cabb6057a619de7582fd4328d22e9f7692495c396f8beb48e77f75e1432b88fa3ee031f601dea096d2f23ef7b7ead6572f53ffc5fbac20e826000b71aee11f7bdbf556441af2d3634e4d6620949208926c0a5d10649b59514b9ffcbc76d9e4825a848cef00ee7657527f1b4d99ff73b2ba9408d0f28c28a18a14410faf0264a560cc85ecb585cd48c1d131912756fef6e851589f53e7ea04483b32be104b738ce88258b37e67acc68b9f09f005fa34d1563608591763d8d7961879155615f8e4c66f2a1a5085d1f501f9433db605e366154c0a8bfa3746e4614057856a3fd46bed47e2975ec88050c2a263976b28ef9d2a9625a3e35c50a0ec2fda5c9f120e7b974de388c06011afd319572eb150a575074dc0bc010cf2fd3ac8474d1f5a83af2d3c1a390e142bf820cbaeb3915928910cde987571f43d807a288360940000e8480046e11f4098f984f48ba2d3030704c1236eb19d87f0f14b2053e03925baf8612055dc03e8a6120449d75b729f7d734e544962adbe5480c4b623704922410c4f3b59dd08bb1c0069c2bff4a8da3a27245b59a6af8168db86278c9dcd1ef7314b48c064d7a5c95370c4b3cd98196aaffba04221d223f5d05f29026165206e1380001dd91f209000863100151723e24a001cab2278731f03980115111ef3d8f71cc7b4b63d82ba14c40035b638bbb151ef9182687d19db8a12f0a8ee5ca04729217580a8ca384201009a018f580c26406130031ea0184a00c7a4063d0031e701e90a4112da99b77442452497b8871bb0860a2473b0395856af1080842f4040311f49e284a569bcf84d86940c205758e8af23cbb96080ead0869cf90d8304718c879ac8ef00180096fb339e1d404059e12824881c8320798063ca031e401d1131e7270a205cd8072b09a200db0fec8a114ea2eabe20407b16bb334028029c869800197f42641509c70840200002d4475c663ac2bc1ca0373058058e05a374abd24723cfe7efc921cad2908f6830811d6644943822a7568ffa3003942448fb8a053edc7c048100c7e6fbe6a02280e8fd57612c9282501000010a917f258c00ac604073ef45a79b57ea9ff2cae5ea7fec50ce3556096a1233bc03b9d95d49fc6d3667fdcecaea50236842e6e4d4f5a8512a7ad4288f4217372808b562936321fc0b42882051c208210111e88fe5618e28dbb9e92bd447a8c89e57bbd243545cddf5c88a5a81439192bf22535c6b18727d13cae4bfee91bfc11d27c038c40fae948380c2b445f16a9cbc40a2758d7f90e102b63baaa40257e69d099206795c7a04222329011004000045c8f184e3ebce7288c69d84515c15d1b8b4c69d845182456090704c0cf85da49492179729a71d33b3bd8759ac2406998000000000000000010b6a1c191ba262c19b19e740642cd4c06043bc42532451c418128018001103cbd31220cdb8d70e49e7757fb2e92ed637178df1aa181796c1f37882c4499603f608f0d205aa7cc57fd1eddf35585e0b22a576b8e765c426bd26dfc7de9a4c68a0eb8c2e574b11fa8ff52bc6d8044295da69d124bc3156276b9a0e45e4edaaa95fbfafc54706dc86e0446b1dcc98a526087d00062e23c4120d6090f0848002f5c8f0148004c4489e22877cc783c4c2ac3cb02872ced2a1d4448e44235019c081122d64d9300e1b64d5525d81025c63e0c6d85005a427599604000ca817ac00601dbbc62d80010683dda3f2d424609c071446914b37a3848a4ff9a5dda9028afc245ffe40916c5787d012089ec318f181821904b90e81401a53a8d07028002111eba5004cdacdeec4510284c030d5254dc0bfa7e7f8ddc9946fffc958d39d824a848cef00ee7657527f1b4d99ff73b2ba9408da8c03334828824520520428108876d38d9b835db24c0f6de07ff8d2b3b7bad5b18e4d087332058842816d15e34927896fd59a6a0c294c47d0002ec20009d84778463ba231dc118ed86ec6d1b690f3c848c039916d518819b9176e8b00c2814cd433c008146a545c0f8380f10439d0c04012b1ec8cf802025528b01b000509926666b120a72cd81259c20b09c06000044246b4963b43b1ae158d780edc6bb847def6fd559106bcb4d8d393598825a848cef00ee7657527f1b4d99ff73b2ba9408da8c039f84e2d4517dc0acf479420c592b95307d0d20a2081481070c11c91ec73ff084969a6f0f8475e0e74f6fdd75a1fb920696a1cc3de4d740885ab370df77e15c682be69bf38f588321d1432f3e4d3882a31be6351d9018ec00ea1233bc03b9d95d49fc6d3667fdcecaea50238faf39ca250ff53fb950ff53fb931a761146091a8c0333482c82052042801c0007ac650a524b1c5c6a581b586ea1ed7e202d06d32ec309be2292d5f8e5597d90c2d0a6d0b68d93105190d4000bb08eb8ac7583783c8930253af6dfc8fa24779c0a60613276314e6306f54b029c28750083757860de0cf70ff0e06ea232a96500cc94fccfef122448ecd5c5bb5ec17c87e36eb05c8c1688e27cad0da1ef41ba8d2c802b7ecf1a9f11d898254e17828281fc1f8ce25bb76737d5af58003fd5fabeacb96fd72a6cf5fd05380824b2a2fcb007e62e4842aa24a655fd87a25a2a7aa6c22761f2f982176f144faa9994a3057899923002894895e1be97d0c50b205a81d71961ae0c3029)) <<< 16000) + 0x8ebbb3411f696f2e1373fc26725a4b275b14a4a90b30ca20000cb847543783f83e4dd29226cb507cb17e9fd8784e8a1c508c019441d62db9b9553cc972549a389c259091880dbc41b0cde75ffb9fae81c35095885421f2e9cb9d9af87647a4a00c08548bfa2ac5be34313f88b593c33588019d9ab28e9d433659b012c8ab6a92ca083525c7c0eb0e36f13f640455fe98adab8399ac68caba310b75c312943c8b2307ca8c84730de541f9dd08ba753bf6dca0c09f224a1d4ede8b2e36f36145cdc269a769650d7983d2fa24762655bf67362f63e60d891886cbf91b16eff8e88032e6e7c82875ceaed630aa4497c1d42a7102f56150a95df256e91c2e061887c80e51926924355a0c900ac289d4d6eb740ee741e43af514afa8c976e72b1079b3e9a5a230f8bbc489e6402672144d0f200011e0817908750140011a8474c243a4120016d623a25209e0100109511d005001b3e906d0df08e55b8ea31e77e7a86094ab972edd9c8430c40a3f7e396dcd9f644c2042abfaf224409b2ec400f0db00c5d90c3720044413b0224ef3bfdfe4861936c7e3893a6182327da5bc121f69929003e620ef3f93f780890cf7f9b31571001e00005cc606a228e9f59c0c09447d3f1b5828212c1214b458608f7f56bf1f63002fc72573778a0400f99dd11420014d5dcf5fca880b7a1e9cb34202a80f1860da01c820f0ec05403000022220da831cf298e714c73446398231cb050e500b85064aa2fd40641827dc7866d02720a10c07a6a3b6a40804dfe4f4f82262400c744e296dbfd1c0602b6cdf61d40a00657b86cbc13800502075584690bd202a806f9b09c8b3c6ba507543103869604eaa5c08b231fff09c4963fd7e8c2592870d43c92b838a001e8480010400aeb7001000692a25802e0846008d2c07b7997822c8814c5674d8b1ea2228aebc287007270dd30d04007270e001400055d49ef0000b67d5ee322b82130060000608fed0767752f3ee146f416a78d044269659060e58e38a18668240060100401b644218a7f66a58f4f4944e1f943800989669838a001312d0006181623d0104082375378fb6020008ba96a9c0004af82989016010980300003684000b1489d02c4e41626a0bfda0eceea5e7dc28de82d4f1a0884a14914814b10b04104b006000030300200d00010021122b088158e488c500463901b1c70d84384c718276435803cb7f8c1c0089543b858f099d3f9ca243000b71aee0a18116b01dcc40c0b3e1566e18417f287e690820eb78eb1e02340a128042c880d6b686f9458f304d0fe4504718008f0d10f80a104e0ba9be502c15d6ed26fa6a680008f0d0d740c0117baec796d0c007265a3eadf14722050ac0800003d2449c1624c0bcd32dd2490c0b5459e97b7aa2cf4bdbbfd0dbc7268850ea53eb0988c28814614c008006003000425134082b3b5a414e80be899267ed69a34021fcbb7a180b30bc572fee40f82ed00023822784a13a1989c88c4d427fb41d9dd4bcfb851bd05a9e341109851430c29808e0940020008244a27e6e424c3d2c6335d2e8bc43291649c92482d315d05cb1a04bb434454e08a461ed1cec18281a2a7909af7f64480c28ff3b1a3b3e1fad1c18092d71b4c5e807480210007014cd42f39d25d68c014704c577ff1a1bff8600cbb6f73067150930208a051c4519b9c58266843e7d1dd9609be5b6c54f7b4f6c396220440000c3c8e288c0013bc80b028002e9c8368ac1b0360d61306a09fed0767752f3ee146f416a78d044251040a488408388502500000000251956eeb22bddde4080f187672c2e988611dd2f6aaffcbd6718380478686ba02c73b3af29417438c21144edc1c481061142c32cb0a11470b4e2f581800797205c28a064386158103f90683d65d22a18dd1740c68831aece3962f2ebab0d8ceaba06c4000000000000000000241714ab8d75f25b14c652ab39278fee6fb5f3d17edfdd39817190000000000000000008866996e9248605aa2cf4bdbd5167a5eddfe86de39344287529f584c848c38c40868038099a4ca3fffc8a922f5f010646e835173789e02a6e49d069e07f52742dd3fc00d4adcb0486c7bf8428f1222c59c54caed2dd5a532103ecbc8f9d2f95ddd73c40399639de0e3763410023754b25f9fc38f59bf8cfa4593a9d628e3e8fcb086c371a86c6adf40019f0e9712370fd1542ac430700574fb7760d001638481edb9bdec6e87184d28670737ebe66881a438520b09ebd204063e2b1ec9da9b0a10ef61c6a02fa5acb0014feabc36e236c07a1202030e415116736fe507ef3851cc6e681da04e93b330e5d4d6449b4373934f00000000000000000011ca92b54a6e73945398cba738eb22050fb50fcee6bd1eb5bc2ae5600000000000000000046334cb74924302d5167a5edea8b3d2f6eff436f1c9a2143a94fac2642461c63402401c04cc01895d8ef01f26a25d4a8e29ff3bf2a5f7c00b263ca1e079735393900cf666d08e8d1c54e477f9f793cdcce3b902ab1d02a1b8cf1da25d0f4332a99363233334098d52ab616a200a10a118a8d9bcc6fe0e6b1a0faa4c8a9a88400f4d8e648d50d8e5c280034110008ff22782a1c4150e18a8708543822b1c0110df88c6f82637a131bc090dd80c6e807fb41d9dd4bcfb851bd05a9e341109e69a49641240a294210000006cada22e02052e0e818b01096028e2758a398270656a73d7658a39e3c1dd4535373af900cdae5db82a384046cc3661300000000000000000011ccd32dd2490c0b5459e97b7aa2cf4bdbbfd0dbc7268850ea53eb098cd24b20920a10f0090000)) <<< 16000) + 0x438e71f1a7dd9f0e64075d57cca25f216f80a5c0469d4fe58eb3cfd87bbbbaba6ff018692ee5e3dbd86135b5d7a75875e172b286a647ce2a2a7771c84429ae98c414e7a0008da46e4575b8699fad5406a8006aa0354004120000000007ed0767752f3ee146f416a78d044479a69249078850820001eb7b91ea11c4956776d52c4e1baee7b272bdeb82e024ea484743ccaa0a01260594414655f52d8828c84b2bb6b3197128927af1362a6489fa0daeea6266ea8ec12496000000000000000008266996e924860591a49641241421e01601200213a8dacb31a72a2572abf22cc1f4819e12042312170fbd830c0146744e9d99e19fc9bbb5d7e2f36b6592f720b525a80018b102c2505b1080c084062320b4050003231adc34cfd6aa03540035501aa0020904c20b20e1c81890ce04904b00041c0e008036b70d33f5aa80d5000d5406a800824000000000fda0eceea5e7dc28de82d4f1a0888d24920f18f10a104000b13be87183d407095ec03251bf25284d0043eb4910e91714d12131aebaf6bb6d69cd8bdfd9ebbfb085511b749b8e3557b561c114d9640128e4bf0c66f6c80920c2293b943a86e480508641474cf1bd421ea28205f03d2fdabfc8e59e00dc998126f080c230b00621b2bb3dae2ab30480162b8bebd4fb80b404493e0fab507264015ad7535c8104107c00017790300d0188480017a08dc0c86185430a1a1b70d8c204860c24214120007a0343553e5fe3962912313f5a0b733a4182a23d09fe34eb0e28a3b166693c68c203a3c0fe71dd8a105e397eb2c0a1800d4e4f0b067a0e022c6bb6604150008003ac5a81376100a72c2100c00d00004b84005abc80b06800a4e88015641003ee3236c931b5398da1ceb70d33f5aa80d5000d5406a80082412472061c42032021c220108030080200d1b3058d900c6c4061ac031a901d11b7a21457e48ef70b75dfe40abac2598744892aabd5ca8486bcd582114407e4227436650211719bdc60802caa186214001200406c00635e031ae018d680ec9a7899c5f73e5114657ae0d908a146a4df9f344922d07ec4563b6284912986bdd744887200fbd2dd86001dcd2c0f24820015e6f69410c88002b0200d600c6ac0635403c29ee8453a3a590a4737c93930743933e0439830db7ecc314b1a80a85191e284730409fcc0820d441b9384e004a01005301e9690322f73630a85e6488aa96404aa4fac8cc1e6f63bb0ba60c05e20e34c2c64efc7743d9a004dcf306581000e41588b050084a0100001ab364cd2e2c93e4787b0b2026541753fb824258d213e834af898732854feba5fc75ca0f100883549b5a145740c0021945dd75d39ec4001403049f8fe53a0f42403841c82a000086c8002c490007c22352220009e723503303c158d382c6981634a031a401d6e1a67eb5501aa001aa80d5001048251050a48a5084883064027a11f480b8a0b8034644563201318f098c704c61c27c64dafa50654d2cf69665d94690872caebd830806eeec18b1a39b379c4ec8c1ddc039152a50607fec0ac30c00a2bcb182050104a0101a3098d100c6840634003f35bdcc69a73feb7f4e312dd1547d25929b8e25ba7bce4d7df4470e202a0029dfe0db8a4d2233f2071dab82e20a1c343768532cf2d98204b16a50d2ad9e35cc00089e3d626eaacdca000604b1caebe37b4212d6a9210780c819f098cf00c6740713d85119ae12f3a07268334b438e240d0fb1e4be247e81702279f1116a0f29ca5cbcb985f1848424ed2402091027ea9039abb3c10419e9253975d03e840417816014c279754d8d87240b5459e97b7aa2cf4bdbbfd0dbc7268850ea53eb098913d03903502cf28408d03a34fd6b8b40410b4e41e5f2671abb8248e3abc25d4a7f87ac813a70c7616a8001131f362d4504bab4c1e547535ae8f7a83899f640b2a45c05901d8de68740a0305d2cc063ed6e20001c774b22d3430007e6a79741525000c1cd81c8f8d0017898a3e7414c84081781800008e880035910009d03c64c730bb400d2cf055615cc6909d7af5ebf3472af836deb183bf2bac3ac4e0c110c2cfec18015b2ece7d040045dffceed0004a0101a3018d100c6840634003f35ec9049da989c648821ce26c638b10c1c21c1987137ed6ecacf24d232115f346ed14389de9e07aa9300075b8098c0c5000523bff4600202a793ccd94fe448015810067c0633c0319d01c4f22c10fa34f177d39ba0764b2108865c48f8e6902f0aca8d836c12ad4a8797356c5aea9cff4497f3ca45e70b1b51a41b3b018495e0ed1d88dfb21618508b3a3be6eca98fcb641042ac1ff8a5424036c8ce464fbda001142200a603cbaa6c6c39205aa2cf4bdbd5167a5eddfe86de39344287529f584c489e81c81a81679679468103ccc97d39c622184923d980d26bfed0ed0f097a91993b4e55a9413823d0bd40008a8f9b275bcd01e023cc06edad660ca9e564f3a1d1024ce27e045a6ca1945903bfeda2a74a3010ebb802d355080a79bcc6cdf790002670b99773c5001d7af4bb0584e32420b40a000045c4001db48004ee9115110ce08800307ce9723f9ae47930a41e3ff799183a92a5b5ec4c188405da2c858d088d3f4f02050138ee3381a10251517ac42002e5b3d82340012804066c0633403199018cc00f45694b85369f5ec995fd0544e30d2cd20c20c1c918b009002032000200d197018cb00c65407e6f918da66af3a34edc3cc121a22dd2f89276fc795b716d322835f8ce04e2b76da4fe4cbbac47e9c49b3d6f2577d7f5a722c83e4335210c59e80363049c2bd94a33e57f34820)) <<< 16000) + 0x8655a11df980983607a3ca10840021840014c079754d8d87240b5459e97b7aa2cf4bdbbfd0dbc7268850ea53eb0989038f34f30f28e24b20c02e64f41e70e82e1f464aa5e0f5f1ee5e8e36385387add0a4242c75c11dc5ba00044878cc51a7e33db438b3e45d6e40f3389ccc0e13c0b7348c551a1cd8e028717f89fb79922c1255eb1cc95e141156b75659653c001a372c299f2c014e35f7f1c30d24841601200008908003a51000892232822193110c9008002ba48c38e8008cfcd6e1a67eb5501aa001aa80d5001048251050a48a508488306081e847d2b820b8034644163200318f018c700c61c07854fb0e34044b24d435ceb7858c8a8f34a4e2c53d051201c942bca0eea2f8c040191af9984020734a980c0400a523161650004a01018d018c600c62c0631403d15a52e14da7d7b2657f415134b30a3072c72c62052802000c0c80008034624063100315701f198778ea5dd1494d59b8712d60cd3478398220e62693b210744508741ac03a710a143704483030e9a2850e6359f0d272c5ba7c263041a1b6413406fc983f81042861e31f1693ca584038001eb49ccbdd1c978dd85a1414988004809402980f2ea9b1b0e4816a8b3d2f6f5459e97b77fa1b78e4d10a1d4a7d61311e69c61c49c41a416116051936dcecf77d119c94e8e8b691d135ec27b9dc11a19bfd3db91b1413823e8c340008c0e9783fe27ab0a34a07eb2161549a45d09b616c08c202ffce9ab2660f31fb2ae61a24611f49b470996280b9b2d1648a047d47345af450025c24a7cc60b2420a406000040c4001d9480045691871100056d1186190c28a8610143060a000cbb35b8699fad5406a8006aa03540041209239231221021018a10207a11f4ae082e00d09b0584d00c264061300309401d93237bc72dd2884a14d4dbe142a9d1c7e0c0a10575b1de344890f1dedd8d183009da7da516082598f69d01002eddd7ec14001280406080630203180018bf80f45694b85369f5ec995fd0544b24b18a18a147109007004003032000200d17e0188180c5f407a5a8590aaa44fcc694a1b866bb9cbe984545b8c36c3ea668efd246b6175bf12313f0dd74dbfde6882a4f8f66e3570410818dba1f4d1030005076dd7d0104e208003203c02980f2ea9b1b0e4816a8b3d2f6f5459e97b77fa1b78e4d10a1d4a7d61311c61a59a51a41839231405a604dbf52352f2db538c750829a3cbd1c6c70a70f5ba1484858eb823b8b74000890e150485a8012cc254a4877343983af49a256e82c7088b32a49260c641ca66f54b1a270dc523e102888e2bd6fb2411c78e8fd6648022538988b42a4209c0400003e440019fc8003e39094110004fa117c190bd8a85e8142f20a178010005f51003daf22ee72176390ba9c85d0e42e65a172110290685c4342e00216f010b7008012a608b6aec5b1062d67316a298b494f08bbb14fcb5fc20608289b0d690401156e24f304438079a5a64a51a2805bce88ab2a2100738acbe104420a288a6c742197a0436a07e1728320208c0b2c1b500a80a1535c74a3d570ce858050802e5b37d62801a9e59b009080e80205a0262ce1313a0989c82c598162ca0b164058b182c588162c20b135058b002c57c1627e0bb148ea7f6da30992ce37982c100ac2bd28c083577ad1824082100858a4a71f26d2c4312b8f3d160894f8d001100ee11c7ea2010a9ec47b094208402000020c684aeb531dc29e01ad25d90d3ff0ad8c685129ba89d3d636fc4d04848d0b3329f8f9145be3ee800e62286b6e0f27af2fc66d101d150596b8adac64f0604303591f4c2161994bc128067f50cc90017f00e9d75d2394de5e1143ca2b51ae1a4ed81679274b98ed855639a1cd6dbe1224f377e806b82fd42eb6d02946f5323aaf39e6b4539d8197c28a7324a876a8b6ed8f766240653d04fac49741b2c46c0c1077dc52f0de292307ec61e9fde0d3ec2606f92f04ad3b1df9461a468280005da321a17d9da26feb68bcfe6e0a9756e64a991cc2db7ccc23420b105187eb2e4e8c61fa0d8dad54aa1c735e6c791060619df8923011e543f2b16263d1a67dd88ade350122dc1f35d81053c71fe158302d59b54dee2a25ec3770fdfc4052a3b68b3d338d432287806d383e50161e66c455007454e4f72bb04116ed532050db1a42501e9003e1d709d6b39d725deb8920a9fd0aa5beeb41d5200eff31a74d503b49dc456439bd01c35eac9182a7b46a4d22784e4688633f6ac460e147f4d75edafde6c166b9b4c8833659b786b5597d63f42413ad5154fc49a11948581881eb82daff3233a38448605310e323a678bf59f1baffea1f4e1743118759c0003e7115e158ae84c57007016d4879021c21e7623c600011100f804000021c8ac10c55c562aa23154118a986ea1233bc03b9d95d49fc6d3667fdcecaea50238faf39ca250ff53fb950ff53fb931a76114609033fcddd7155101b72f360fb754984f2243f51ef7558cadd76bb00000000000000000045334cb74924302c01a47d84cbc0b51c13401800c0129430ea8bcbe8d06f30874bd21ee7719cedf81a800b54e7929f4574060f93d4d902fe077cdafed698c8f3e1103c700094371babbc0f36ddc8dd1825115878a82783c6ca66087acfb9f3078f054cc79bedcebdd7a16aa26f42b4242b60b15a010002f7999011a3b36481768026749a09f90c8568c007c021a5019e31f91a1ab31e9aa9a084606a27a605dc61acb0a01c520ea0ca00400100000fd324d0df75ec9a1806525e6860b2b26ea24c0080011a2810fea6a0d0ca89ca2c85820690ad4f4c08784f0b7c8)) <<< 16000) + 0x00420100000d520003286c8101eba1d160a2083a0c1102404c9c7611841080400002b0d1697c059fc60401abe6ac2c006bdb50491821080420080200800002234212601e6b104e204cbb450049f8fe0023081f00800005310001a730100a7c23ff6ad3ce2d6ce5fc3576cc1a81fd5ba0559ff87bf74bf38a21b27fb04aeab5cf710b0ea54e985a7d33e18c1aa3c830c705bebce9eed83f75bd28793fe06f7cef59152804f7362416077dd73bb6f7a00b5a922c6a310268d255b6f3b014b3a9f8fa516d4946f0320c6bacba7f6e7a38c4f755371a2de8b33bece51b852c2d06799636186c5499952d543b40cf8ea569047806f09e513b7616eaf14b89dfe134a6f9643ad50fd3c9da25f956c261e641e9954441183cd1137a73b6e6edcf91c74165ed2148b308680055b3c159af3b670002be0db8f1e092436027abad5f34645b295408aaba5d82d07f9cfe26660dad228e5b99f652fe75bbe62f65d49bbc723c9a4ac9e64aa041fe917f17ca73cc10650451a147f87a3fcffad1e0f36ab71d4d984249716800094d22a22b90c074f3a1d861cf54d3d142820182dcd981184118040564052182cfe6b6e0c382eb8333c5040311d2140e00436f62188a000c09d63f0250c2300800008918080080200000888a20280009188ac0cc55c362ac1b1550d8aa06c54c262a40bc29f9bfb1d9400b6e580d488108402102c5fe6c9686158f360cb22041f00800003d19140a708ef920dd792fbf2c041d1a66038089219c9c24081f00800006891510d8a806c53c2629c1314d098a604c52c2629403c106a505ca8410d4000dc38092f1f1de46083e0108000080234576be5bf1a07c4b2f9e2001d00800003990000b0304851269262c30fc681a53c0184979e02801194ad8409020800200001a84524072301b91861d18686f9f6f946802b36cdf903001dfa855c004820460100000e5229023147098a304c51427000e157a73af44bacca9f7a4dc04c1335d1ac8c9e95cdcd1ba25c4a2126df323d41e29f167de16db5c1eb2877b6971df86752efdf02f6ac39212e67f6422b55ca30163db894317527b3ffa2dfcbc3b1d98b2dbfb03bf939b231f746dfb124c1a1ad6226615c12cedc20a2788223fa09327804c590f002132f031615b7829c0de220c0eb566b51119939322fabb737d11c3408f20f2ecb6cfcb0e14bff7ef7c5e72d2941b8ad31c6929d524f04424b9cd8000058922881200098022864a142098006349001ee822788314141801b2c90894584420c500d610e2bd0ef711c0de2421842010a18d8913b4408692c38a4bd3b539b815ba41817844593b8bedeeb7df1da12f300a756849504b0ab6b9d2d155bdbf5dcd02183db943db3379ac38acc0c7be3ba461129c5582c9f61f0e1263872ebba694a70a55c4b0bf171caeda43809a88e022db761ebf173ef9e80321416c23f17d2463c2f31cfd7157c63edae6878e258c72e276a41a5e3cd6adddec09804f2a730e7c4d1ae084b3030faffed144d38a33c88fe793b12f88b97c943612be0c55a42100881acb32401638835c5500000bbe44fc262581312b0589502c49c1624c0bb23c62ee397b02e3cf6c8e52fa6178e81c63a9ebad4284664441123ab224d3f17a37bc25587f95bcf84d243412debf5a3b5aa85830567c5d5426fcf9cdb8f4e82040ad03333bb55eba54eefa9fe20df8918f639fc8d08103c23a08f0435d0e173b1a55b31b96f675e72ee1900a8254a34010e821c9f63ede2fcdfd64e7b6c3800ce93a8ef8daa2948b67e515eb2fa3d08e228c5090204f81627a0bd097d6f6d338bd563100eabb2da27a7a8d47cfc8076ec87f0ced19000000000000000000049334cb74924302d5167a5edea8b3d2f6eff436f1c9a2143a94fac26324208210108134010001121fbcfb82b531df0c7ef834b494598e70518c4623d0ef0ffe100a79919bafd484b9487f88b75f4be0167ac141323c5612e15ad5897c20fd8ac73655ee0d413621093ae80023a90ea150004be913c2d09d92c4e8762722b1381189b88c4d83626a131340589982e23c150404fcb140f6f546430b0bce528f1c4457a5ac2160897872820009450840216283783e7ace11436994da5823a1ab1654405875b1028a06055e7e0400945084020000218623ecb766b29a39bc4ce981629de6f7730e2100a08000481040010c142935e01ce109aa835f47139a7eb90ca008075bb1024082000800006a91320d89886c4c02400040a6430647a7b348d4b14ead397140ae9a197a903e7fb2f2238f490b61815a7ef75b923f1a86047efcb9cdef42cb9f4c62a617e99a5ab610f01b1cd650540f7db94db7fe183fd1958cd675da4811edc52822ac18082ff92c731939880b57bb054445d882dd39847249f1d4700f9000083cf40be84b088f9d165406bd8d8df9e225e4a0cf791d4c7fdbd97649c855180658f6c6e018d9a4079b4c2d063d086441ccd2b4000285912f15d0825352a4de8cd7ca5532992922ea242277c855b83cd7a5360947d3e8881c0661f18a3486d91bc5871d76771d0d0047ea0f6d0f849c8139e37afc7d05002d6f8d8538398ca389dd3b5cc6a08004773e656607f339aa419f7ddf90288bca4c4d3524cca2531da81207bb8d4f01b0f56bdf38b0346246d1300001e01d0eb2cb58c4286466e4a51341e8f232ed900a6b12ced4700413e287a0002b518b0e11009880840201d60a12e018000b4912d218960ec4ac56254231291189408c49c4624c1b12505c47226481854d1c42cdec6b1c4121d994005101d7d551714248e56e924e00e78609f214)) <<< 16000) + 0x08f3960424009c5088021220cdf9f730f1420ee38648171057cf68615273291d480a99c3c1d825082000870c227cf874205ad9f25250c28f4ece7f0808a5abb6f4580120165b5094208402000020c4490362461b00024d22440bd0494fccaaa3be008abcd088a08609dcd95adbf708193914368b13aa2c40431817060cb7e3cbac2a17fe1e3ace7dba489767c1bbdea3a9378224e020203b627f455197204e847e4dce3b3f9039881319fe51b66adfec7cb002ff6823b5404b2b3dfd3abbcde794b005c9dcf9cd4500072c6db7dc00232667d6a352e46ce2083d415481a0829c705d4311828a51277d523a286aa7d05b591cd5bd8672e42a5bc93fd75c1e82f6068f906370bc1c27100491d1c4228adfca103d5de25ec0026303e0080000ad2000c566c3010b7dc7802eac84b4fec0c183ba2ec998a9d054aebf38c0ad524a63e6d8fc0ac03d08184dd08b019753d2aaa01fbe3c02eef5240a3b877c83e44600003991f8d31fac179251c6e1e0968133e795a27ed36c58d885a44ac244520550d40001799121198900cc47c5623c2311d11e0431acea0d12100f70f686783c4c97317900943de5290680189242cb1400ee00e0e82808b35b65508028c4c2934022250484401011c0588d82e218f93fe4dab51669d9f8806f2c46b5e25441ceeba9a1015c3fa8940b8be787270323adb183c1e11693fc16084673afc84821c8324260109a1242aeffa77068c8605874e2ce80c99cc10020011ffea5500bab33cc489d02965e21c71c4a0a408c00e0185b3d159040605da199c9c0db4daadde5821a47da2892087a19527e68066ffd5731201a43eadb4400f0a78ab582085040440100001a222340bb0b0ec66d780b4c4c96a243502f134039fa6948419aef0908c6ed611407f42234443844434033430c003e4ab206043ad8dfe05a4b0d45da3b60a67b99d6642dfa265e6de9a01861e062a2320b1180188b80e3ebce728943fd4fee543fd4fee4c69d84518242c2c3b19b5e02f134039fa6948419aef0908c6ed611407f42234c64063c52c52c22822c6353e7d39864d9d38436a170fb82769bbef3a0051cee6f80cf24b9a22c35c476f862be8fc1db733a283a2e1d5852f8a2a22c0bb0b0ec66d780bd58a4d8c87f02f134039fa6948419aef0908c6ed611407f42234063c52852823002c03afa0256245ce5aa89dbdedc3a94fa0a1950266075e823ae6eb7270105f0be1bf618891be8001369f16b16edc3ea58cdf0709a42fb4c32f9a0a02432f9581ddf59a7a71c0a0fdb0f966b7f130906fe1c16c24103e4e9019e7e9a6ab8c34882c035778f64bccf08b8333d61325f3fa509374903980fb7fc50861663c80e387a0f00002c42044420008ca20016e640041c0801948454060025044450c62263311201e0a093e79408105b51268100eb6b69b526083e00811101e0a050545322863657cb74403d37dbe225802c375c8008035f40f4e128410004000040488806c43c3621c0b10d0508600c42c07a303bfc5e040a369dbe8185da141510230c1d0086116f7b6378803e97e03f0409ae3d69c046183e0100000a72214231091188404c41c070180100408304f461939a35c6894a3f3800c014afd1b49603f33dc0a000241c1f00800006d900012d20006006c21f6b06fa3804b8b498f1c0a6533e2b2304200085845aeabb9d3c18de9046411021080400001f488284c410262060b102058808284001410a0b0ff058000f390f11d87f0ac3f437e0b5c775ecc6024c7ad1da8e080164f1d458071c095e6020734545f40012881100403f0061f6020fa018208083e4061f003908da68eaacf1098eefef962227727fe284f5d1e4cc60629797b9d0006c2d38e8016141f004590124932cc80b043e794258ba622b5725880d01c4320481840010b2846a71065016c72be910b17c2de0c94d003492ad4c09030800200001ae43dc040003bc414c261ec0bf11c1fe4fb6508816904843013b1c7f44a005e69395500019070840216161d8cdaf017f011c655f578cff546130de4f7d8e7444183015c51fafde20000000000000000020eac526c643f81600d23ec265e05a2051449e21419808113eb05ec6e717d439a8aba3c874962ed74009766011ed0dba70de8326b4fae48e4f6400560cf0603e233b8b707bdda4ad224d518d52ea87a80c000efc80025e981678aad5d5c3fccd34d528419a4b31c7312fcac844d0ba714a2e8392bc52e12201a0357c6e707f2cfb24d1011c7cfb83185d167d95280848502ef3eaa79b453c00cf119823db1f71110a577fd9af5b139c9aa9a10efad20409ecc48941580002f4200166e40f8941e8020a70180068f10f315e16bbba0678165b02b6bd1c5020f6c22961009351b109a0814ad6f69a00004a40440100f21d8788ce3ebce728943fd4fee543fd4fee4c69d84518242c2c3b19b5e02d3563f1af2e4e828e6d13ef0acd33e208968e59b63ae44dadff7ef80000000000000000004800691f6132f02d0c2c60c90480480009975674ca5835d3a6fd57077541be9fd3b1615612e2f6873d969e756f6e673de3a0dbf4005bb40bc9156d1792c5ea7fe025b46ec0c77b9b5adbc3e0f04051f282baf5023549464fda1e0020004ce205e420ef190770cc3b4141d80b00069321d622001bbf21d462003c73200987240581400bb3e41b4760d81b06b0983504f0811ad079c0adae1b9f555e18300aa890dd3d7dc0fe83bf14095873e90f6b3c66d4e32bc807d7897fe1291cf774ffc2228278b21598d0de10203370710079e716f19fc542b853bb006007e42321)) <<< 16000) + 0x1cb6883d89e1384145111000140cd64534ee90a4d0415097b8d8207aac357920015202fb879031c5669db1543411d10a5a1080b061674064a801ede257a828b591245af99007a701000000000000000000090532ca538f55382f828c42d01c33baec42eae6c698f48c87e2cb800000000000000000229c6e8afcf49705c473b4776df9604f9131f5848a8b3d2f6f5459e97b77fa1b78e4d10a1d4a7d6132162961081060208885eb315d6c49dff2e76d3bd52098f0451d9b84846ccfdba88044cebd600c52949f834207c2693961d6ae3232a16f618d235341b087085729dc73c1533ef2b31330c4263aa3c838f748ef298515cd72756089a929c35d2e1f07647d92ecb49d3d3d0eba6195c45f100009029316212dd6c30344fa887ff6eb277f95d0a495995f9014e36b035a05978a6331bc1ab346e4ce5581450c05ba33088cb2cbc5939a2623d682affaba2f604737e1722645d1c41ab4f48ace281fe39ac9191651208498ab11e276327cccd66aa157718ccf90eebf2d1f16a65c58efc0000000000000000022216247d26eb613a6ac78d77111c50760ec8c9b96493501b82000000000000000008268ad2970a6d3ebd932bfa0aa1c59431201000809b0f4c8294b1aa80835c01c14cb4b70fea612da9ab7b5abb01a4096df17bc1bf7a75172f200ba0a2fbc9081d4c5f5ebd881f6ed192bfe809c88901dedf9a170f58460b182fb95ff1fb09e033f1233e61b5f9e9f8a938ce0bdbc4301f9671371146a19c726ef49aa7da5c8f56531cb0a77624001060bf17b4dfa14e0eadd8235d7c71f1dd7ad65267700010479771a3a80cda2e833b2adba350136b9e01b51ebeb6609cf80e6ea09455be686c9cd1311eb4157fd5d17b0239bf0b91322e8e20d5a7a4567140ff1cd648c8b289042301ef60cb9d571356ac0a8883f42b17f376440bfebb75ccec2e000000000000000001109120f21105004e05100e00b00040530500200d0e90107400c12c041ce03f2cf0765d547082371cd80304489324772819076e7d0d1020a2c562870098369ca8140157dff5680889392108040398161ca0bb0b0ec66d780b430c5c28f4b63bdfa7b762afb02fd3ad755306a88513fca3d800000000000000001090b123e9375b09d3563c6bb888e283b076464dcb249a80dc10000000000000000041334cb74924302d1030c30f00d0010004095178b56ba4659bcbac150de7082f6c881813d17a3fc536075ffbabbc393109b6a64a8b5592f681c830dc162b14ac30d9f997d9b0cbd34e313ae3a44217da4146fdc6702ca2a5292441ad0d11a52f259a6c09308d28e1a0387a9cc98a3435ff02010241c2100807200c38c07e7977fc8cec8108cd7a1a9aa14e2c2e72a00118c110042c79b222ca59e7ecf9e3ac2047bc2f18caa047beb522a4003c43b93220023ea8e60204c304001000013632380ce1f3dc71cfd604fea3c75bb9402eae072b2f32a50001c8ab69a0804a384201000011120b24200034920008e440026d8c9cd1311eb4157fd5d17b0239bf0b91322e8e20d5a7a4567140ff1cd648c8b289042430c5c28f4b63bdfa7b762afb02fd3ad755306a88513fca3d800000000000000001090b123e9375b09d3563c6bb888e283b076464dcb249a80dc1000000000000000004133843043c1440380140004a31bc1b74cebe3a67b1d177a29db55ade11bcda93ea869ac1e5c47d6954496a03c92375b9ca40f8462bcdd703d7a9836c94dcaae992210ec5bcc5ac8a1a2bd20fc7b48cbec0b4e8c172762798680a9493015ace87d0899ec7e1f91d430ebf2c362207e3b3955279947246ca02dadba762ecb0e10469102d2fee542bf9e7e6bd73f0de1d94608399e31cc16642445696734373894fca63481974ba5a378fc4ccc00856437c82a2898e9e09e686360167032f631f9b6448007a614e84001bcbd369fe8ccdd5158eba935b9d1717c001e04a291cf09b74f7a17ae6410961f1f38294e8b5f0f877ae81b940b3929872146400008fa4388560962a0e11107006c002dd4c9cd1311eb4157fd5d17b0239bf0b91322e8e20d5a7a4567140ff1cd648c8b2890422576d6632e25124f5e26c54c913f41b5dd4c4cdd51d82492c0000000000000000104de503ba43327da2b4f48394eaea6f91df36f39e91a6e74c8000000000000000040345694b85369f5ec995fd0551138c08308d000400b6fa763ab4c8b996d2f4931fe16d1522bc4ebf19c0a85a9fe22f01190aa92e66352f15fca6fada26d33abcdd0474023f908813709f113babbcf8eef2c33c3a1484000576c5c8d9ceb0e846030204c995963cce0b9d4d6aa95fafad38297e0a8e6ec8931d10483c0e4fd41c1a83fbbf84c68de80854451d5141129550b047aebd75d99f8045d391ea9aa7b71d0d975a1ac22cb4002184800fba90b93585c0ec2dc074579e301dd1206dcb91e1a68051800a6d1002015e020c80042010f2c2b27a8e889427aeb95328ab8bf1db9a40b92f30e9e800420080000d421be0b0de0586e82c134161b80b0db0502602c368141b20b0d80586b82c35805e58da70ab32cbefccbb66700e46dcdc0026203e0080d50186a00834c061a4020d10186800e01802008a81e7fd2004f00ccd7389011060f80400001f8d008dfe0865480772945a200884080020000104414c1619e0a0ce01586aa381552f8405161aa8e0554be1013d6b5abc1d38d4c4fa2b9a4edf2c5656b4210cb0b0ec66d780b3b51d03b14297e9d0d4758352896b28957bb5d7714a9ba2b084c800000000000000000119965fb6a42530417ac97583f7c)) <<< 16000) + 0x6d56a215aaa2da2a2f11df36000000000000000004200691f6132f02d5405005600f000261a26cf90753658939a868525aa7c3e198dd5d50c4e50b74ce0aac6058ac157ff771bf765f12ecee822d0f649a6adf816b41d7b07f3f87ed9d608c2d7284f2d30998a5b29eaef535d7a8f6364c7c5ce55015d8960582f98065e1fdc06ddbb1d8f3f74a92ce09bcca92fc5070f802d43c83b98d7da200fc9cb033cfa973a38722107de037b40098a108023cf326cc8fa54095f99a574c0c700da910063142000800005790cd050000c8900093f361aa8e0554be1014586aa381552f8404f5ad6af074e35313e8ae693b7cb1595ad0843127344c47ad055ff5745ec08e6fc2e44c8ba3883569e9159c503fc73592322ca241088b54197ab1d9ab48d3569dc3fe92849fbe3e4e9f2f8f59f91800000000000000000436597eda9094c105eb25d60fdf1b55a8856aa8b68a8bc477cd8000000000000000010801a47d84cbc0b544d30c54038000409dfeab63ef6ec62b0a8092bc8ae0e32b9eb4d31ac303a228189ffc1a3af3121dd53f36357f0c0c52b6f92a4790dde3f4735c93b8ba17fd8adabce71a9651e864b55aeddf29341f7d2c7cc89e9e474dea0dbe2d1c963b94f7713e90a1313794a79b63c77f7c5fce06d4b8abb6313137480019226a8144375b04d08a67b65eef78c207a37fe62477ca1315c21400249c800a1990cc015028ae78d830f08975f9974481add4aff41101a08a72473801bdd23f94044947088021866d677b0013096227c77e780691fc5a60230c2100806580c3280619203b268815d2359c70837537d4a89e6d85ea20118611004240679e7b4a22000e69c238110610004000020086402e4709c698c7f1a68510c2602281c6703af52200020f106809e0012ac63f480128a12004000047080014c90003a1218e330c61106286831026000a4c4006b2c8618aea1233bc03b9d95d49fc6d3667fdcecaea5023878b2f4a47599ae846a837c31834493b8de428fdb6311416108c0000000000000000011401a47d84cbc0b340d3493c83883082800000020683f146d042c587068961f96f921991648292b487d40fdf82f70509d415508dd6a23aa0801ae00166386417395363f9babe04a1f9ec47945df0c9d630ff376861008304061800200048a217e220be0980114510bd4505e1a80116d4e83666845c850b39d87dd6514dd14caa438f9d476aca5c8375d60c0b48ec48b62aa3884c10021061fe9a1f25ed7d3744c147491209938f1f855c88f4c7640c6857fcc7911e2c546542ac523a2ed6087652435539cd47799da67ec24889e819474135c0ae53d2440218cd7077485c78f855ad7e86bab99f6aff59b5099dd237094c21fedbf60000f8b3eaec8b8fabb7fc93cf1732ed6b2155ec60a088b11525135bf9b5d388a65c3cfd76ee376d2f7c1d337f51997d1525fa735789e6f80a1f833bc60a040d218a27a1fcb5e5f11c1a8f1bf87b64402924e6790a719746aefae6d33b0145f6828980c6ac55784ef4a6b1c983563523ac4bb841789ad63ea3587c013eeb056fc10325ff3ad3f346a3f5c2b5cab25c033a5c963f847e5099cf49d1d55301ab0017bb3246b29fd26553e19ec72dc3852dbc2108136343fe4d4f00597f030820f6ff4983453ff2d3d8aa220706279529e03438a350f364394400171b41783bfdd61f064c1fc40e4f342bbe0bdc01003dfa49972b316b75e687ba4788c890ce9c7ac204169f1bed0f2677c5ac07f6002d288a967715cbc4e19cdc5792819c9d51febbcfe3fa2b4a5361df94b97cc25eb1a8d9f30334a866731af2420e4e0f638556800f23b134a89757b611a61ceebd1e77b420ee578ec16d59db5c979e1a28981cc7db92d1399a837446b7a2f0382c8c313c0fbf66fa1dc73569ed88c1496b4b65a05f85a96677653d5eafa6bc8c51e2cf2f718b1754f19ebb75c1803d71010e4e445b3cb87ae20b1b72ca8cc221378c33207f2c34451276514010e1912f39b87aa681760150f3b290c26b90aa455fb27098d79a0eaefb3eb145ae27a059ece94076ffa89313722e5a77e17d5c7b49fa71c0918668f4e9eb668663fedf106015ff68be97d03b83d5b9bc3274111641ce932000034d988bf6fed47edbeb1b9dc5f4c5e080076a0efb529f347b68c72c7ad948385188972a22804229640210e4fc6b5245989de9d1f5ac04fd2872f06200133a9f7b17657864a3513df2a631d13729a3ee249bece95ed49610040081bf52fc4938705b1a4dd59b6ac6214b7147b122a453cd69a20a20ad97e489f8c28c9ee7d627a6a08eb620cb823bfff4f8f1b40a32ba5613da3ba44ec0d097ef95d812c5785dcb69021b46b7706d9b6a1ba6565c320c9b9cb079291c56db369e75ab49e04bc06f62f10829b25c0c8f0d4d6d47697d6b63389347ed5779d0f3a6f0c1ddf78d3d420000000000000000008a4aedacc65c4a249ebc4d8a99227e836bba9899baa3b04925800000000000000002099a65ba492181668ad2970a6d3ebd932bfa0aa2229c29828602039775e0ebee3853e723064e17d40e21c9e0630298899e4212139ebc4c8068bcad5c151200999ebce6ec703e24f3d35571729a10f94ceb55e5e5fda4ba13ac8b5099f87d8f7508d63a83c2191df29b4f16a202b4c90ac9f6a1c1a1eb42f21df366e13a86ff632f75a70d4b11c64392bab42eac9d4153e47680035a90bb1505d0a800348883b12b45694b85369f5ec995fd0544d24c0ca0cd08b04204c0040897065cea17a97a476b94e8389af6453c0619b275b84fd466ba0c29f2728530d280)) <<< 16000) + 0x00e190b92985c0cc2dc07841753b08396abc391402b5f07ce41b47692c584fd1d31fb3c98f944a0819c6fa6ee0524c01211857a50214d683d13015eec53a3aab3ce7858082d34e612675988000250bb9a8d745e1c00d265551a822f3948840a6ec5c52e707e0f80002e52003b4a40b10416c7a0303905a9880c4c41681a0027d3344af319fda51af243470f07dad082254248e32a33fee325a0c61053793985750831a060dcdbdea4b02b2004d0bec0402e98c3809abacc9d62f4d9044403c72c7da9d378420296e92014e022100023218275c370580001531920eb07b4f51ecc3d108186033642d9603e65450853b9bc1fd2ebe140c00b90beeab79ec0ceca020f1835ad7379f78c7011db5bf02d3a6316504440764f76d1c3904a9a13a8e109e3855ef5084b6cd1ebabf77a3640002b9b15d53302003e0000bd8803e6090160d0042cf100899220240466fb3d5d978fd0f3f6d265160f8f2c767dbcbf01d12006beb5d38000000000000000002287486b6567a883e6191e417f799d00beb74d835bfe1eee061b0000000000000000008671e53bb87f872e4c3a9bdbd439693c7b50335a64e0a009081c000000000000000000000000000000000000000000000000003218808608c006022a6372ddea0bebdd32e75a1bc0f17d1c13f17b4e0b0faea5b48eab025e0283e1c96434ab7bbfe0eabc9382717e6434b2439cbf9e6c202551efeac2b701ba17e162d3babe06f63c0e279fe90ad68d08b038b1bfb272d85aa9bd97dd63cb64ee25a6db4b531360a39b664ec174d430a27b3b41eff0b51d6021c11f84200a00019a4f5f75a14db0d44cc77ba4a594ebc80c7d49c7630dd975ba8c19b0ee748007060c5d5afc8179926e9bf7b857f78654f86e323eccafba71b0459e77268598e82c8541621a0b00d0578682b80415a020ac010005459012d46203743a6041556a5a79f10addd10163d523458867c4b8050a3575ac72c2d16930182928afe6d2ed8a6b010016b03a888aea904c040120603207b23b9211544420f00d8092a6b57d072567e6f3f0a6e4e5065754ef8bf0716a14699ac6d31c2084027de8b4f66fd9ebeacb2a2973ffc54d0c5968265ad4f47acf602c8b1cb1481461080c700501335a08213c7547aa1d7ab20669ccb1d4cb79e4d85eb9f837bb60efb402e28fe305a8a2af0c0b0b98b9da7858a70f9be250ffa191931a1fb215d600000000000000000000000000000000000000000000000000019683d3a4604d8802903334c73a99589c0197fcdfcf3d2ee7e0000000000000000000000000000000000000000000000005f22c52051841042c328068ccd8beb91d42233dc1eef39d2753f1811c97a767fb397270c49e07272b6c424b96becdf366ddc6b7dae54912f5fe983228aaaf992106614e53268002a4909b1584d08c264361301b09409c97d55786d101b6a2e79f3d3c7308c19d94135a3a5be48ee67e800000000000000000000000000000000000000000000000000019c491891471050ca08a021f038643b9aaac55180b8780401076717c45517e1db01871fb26cbf830995d50158da1dfbcff193ae58394cab414d5e204db966a45310f44f31350c65445b869706d44b1f63f213ce567502e565f527a748d5957b45e3872c59dc67d0004d336e35dc337ecf5f5659514b9ffe40099398413004fbd169ecdfb3d7d5965452e7ff8a9a18b2d04cb5a9e8f59ec0599639629028820e00a027a6f1b6a91663248cd77a422cd81ba50f496441169fb37519642f59faebe27e9c94f7afa6035b06c12a104e1a2c297e50da0f4e918136200a40ccd31cea656270065ff37f3cf4bb9f80000000000000000000000000000000000000000000000017c4b14814610410b0c80ca01d5bdf67ae7d33e5e060bcd86ab5880431e1fa432eb574cef45ed8e56c4655faed08600283c1f53a6020e725beb91e97e35b8ff714d62ea8001cc909b1584d08c264361301b09409c97d55786d101b6a2e79f3d3c7308c19d94135a3a5be48ee67e800000000000000000000000000000000000000000000000000019c491871050c30ca08a02b2502043b794a72ad0d9bed5cfb6633ef7a6ed6dc25ba95f4fa5d039b801915fddc77398bb8d83cbe89f4dacdec5ec685cd1873fc64663c222cba12c8dd645a52967c40ab6037a04709d954ad0f432ee35fc9335a0a9a60c90ac59e469d0004df20018b842ac040032f242a8f611c7b0a93985418c29c6614c1ba1809f12400ff2e2a6fe2833ea0cf7c59fd1c91a1424a870058619b33b94f7a9e34d60f7b51fb4ca21c45bd390dc815b9f9e9bae7e1fbfb78ac63b8d80204109d409b1ac4a5557cccef191ca9f6f91f3d4060430e60be80909c013436688269c49d69d7fc9a0a201caba0b2d3dd29baec640685f9855223e4b244052434dc4cdcbd6f148d222a8ed42c162aeef6cec619ca6ab1d38b18a892a9e9d00714b25c7518ada7ad019bf67afab2ca8a5cffe7d65664820984a10710510804504a001001518cd9dfda9263f635998646fa8fe4b38568a96ea018f4d9b2245c73de6649050b74f840d1ecf872c6d13a80012b10a52985210c0f8440301ba184b52552a2168610169e345093f78d2b5cbcc61360c2621c40d284e3386d957122d8338c103546cc6d6b41bd4c18828408d2bb5959c703af94d669628006e43db4217250c659bb911444422e33a5f7be8469204ec500b6293d2f5d2ad95af1819d2c39d2a53abcc78aa198b71aee14ba20c936b2a2973ff99dcf035104b50919de058afc54171048f168f73b2ba941)) <<< 16000) + 0x111629429028a18e00800887518e2a05e3e21e6d399c7e7db3fbecf2f5307cec3cff4362c6c9da2b5a5508fc9fac95d040c0c2ad6ae335d5cdf48da0c87f885deebd35f3f7e8e0b3c716da6012ac616c4b5b71aee14ba20c936b2a2973ff99dcf035104b50919de058afc54171048f168f73b2ba94111183163123100060088089d81d99d5fc81ca2c7bbaec4796a91e32526ac6f98a1643d3c6b991ae4b295536d03db608d351053e28a7aa934b56eb621fedc1a93a8307df5517b6204dbd3cdfca1724effa5ba372a39ecbd935506c79c6ca97dbe5a96599236a1233bc0b15f8a82e2091e2d1ee7657528228faf39ca250ff53fb950ff53fb931a7611460908c18b18918610b00400401d53129261c4130179dc0fae47e42b118894f3703d77d9b2a82c4ada169b31e34fd511948a681443a917d624e52cc93eea15aa0332f5e7b94299aa207a0ad718b2bc90a00073a4001ff8851928288440017de4003da8850a2c28017241124d814ba20c936b2a2973ff978edb3c904b50919de058afc54171048f168f73b2ba941111629429029018e00a00881454835603c1d22745eed7c5e88a3b9ab90b835a091e28449d1d4c3849cea40e11fe29f3b20e72fbd1e67d232249bf57696d2ae5f5379a0135cd4e74cceb125611d6fa51def4c46919c1aaffbf20c17fad73a09c8cc6726f31608000000000000000000000000000000000000000000000000006312c52851042c32032c1181080001470480200d00022e21363b09a1584c88c260461281bb71aee14ba20c936b2a2973ff99dcf035104b50919de058afc54171048f168f73b2ba941111629429028e0080060089275fb3072409e67c219cf64c51267e80ce38e47ee8fee2153a1bb627feecb2b2b14b7ee72819b72c91d51bb2d4156ed32178337fd93b05a1ab92df8a469f99674b700630b7266db8d770a5d10649b59514b9ffccee781a8825a848cef02c57e2a0b882478b47b9d95d4a0888c18b1891880050040044074083e3513430d44435194bd6638cc0092195aee8a7a89e871b251f1328a5b9e9779ed985d55fe5f75199753254a040b3f5d2bf7f52e6477f912d122835fcd16c596449dc1997aee66538788834440db3e7244aca6f09a85f122eef0500000070c071c9b25c9c57432c49445fb1830c6c9c71230c0dde4d09ea8003011f92b396843de2f64fe4100509069b26ebf567150374498328002cfb22a7b2947206b8117e0a479b89d8840014e35ef8d7f9694a510b4ed7a240000296310820000f088003be109f2504f088002dc884ea0ea1233bc0b15f8a82e2091e2d1ee765752822ad0902fe9ed63ec6e02b2055a35c15c0bf80b32c52852c22401c0875df800b72596b3b8840866de9ecdc3d4cc9b57424aa5ab1948f39c1fd530f206cf613620278e6bb95d8f793bdbc223f54b05f96e137399f5654528482bfce809fa1328fa452b382720f6d7b015ffabc11c93fe6e1dcc0000000000000000000000000000000000000000000000000032094296190196110116094010080c0cc15dfb9fad82d84b394ff10792f1451a5707a63a685ea7b10652bf32ab214858429cc9d7e00df1dd3e557aa3fdff96eaa040220ee29d06650003d121383309b1584d08c264361301b09409d8bb7bdf0bff028585d8330474902853c1a50dfc6142bac7c9fa44062c7a7aff142c206f5a505380c10039754326c9005661a766a03803de267d03815154493448201948494148102a1233bc0b15f8a82e2091e2d1ee76575282213062c6246303200180140045a2670b2fe42ff801570e9898c68a09268639b3550f08689f147e795eef98bcdfd932503d8d7206c132d07a748c09b10052066698e7532b138032ff9bf9e7a5dcfc000000000000000000000000000000000000000000000000be268e60e50e6886025001002bee4d719052073bd911ae60666ec4988d5f8ac32b998b77de825d0538ccfd941f45c0b5305506f3899ed1301d2dc16b2f94cfc09b32dc6388c5b41e9d23026c40148199a639d4cac4e00cbfe6fe79e9773f0000000000000000000000000000000000000000000000002f89c41a41641c31a11600600ad05b4fbc81af1742ece26a82e14149ca02d8679a25041e0b2b00bafda361fbe87d1c85bd236f03de83f3f83cf0f3bf16169aa31b2e29be60da0f4e918136200a40ccd31cea656270065ff37f3cf4bb9f80000000000000000000000000000000000000000000000017c4f24e24820f1cc18e0c032063d78259faf8068d182028c3514f35bd268603eba8c5c5ac023247fc83f2f31978c81d65913c7d9e0ff6dd0548fa797a1f079a2aa747450e7a0940b3555515270370169b4fa186184c11cbd3610d82eac0c1edf9ced912053c3f36bbb34f2bf585371aa66940ecfc82da54095beb62ac171200acfcc6e390800aa9931d3723800727fc67f3722010a40811468db11cfe7081a05b099ba1d44b2316a37a7b2059b0af3b8d4912858a07010928905be14314e80810022550fee2000595c6fe75c400000000000984801480c226a74ad0d6140bb0b3c005c71600a2bb5a1128582da283a242368ce7124050320545e858002df02d5e700230080000b59000389212e0a096050002d01000a202001bc840bc6400238c42542400286a425084002d4c424cc41245a09125048068007b5084780800c3ac847048012258836aac234940ec4a0450148bf000f704dc7f66fd578fe9f0b1fe78b25360508d12da15c5e97668e8406915a9f885bf5a780a0862f6ad2f693a8306026438df477cdda1b)) <<< 16000) + 0xa21c0e8d9e3631654d50022b0590975ef81c5bf142a203803e6f0e59273dc4a6a09d09d306aa0bfca2a7d873e7e767b8885d4266186e7ab8f49a40140158b6895134c8a2fbccf9691ab46b1464b66936fca4ed60801ecfdba2bc110c23c6e122e938b9dd16d02bf3ab5df35105119f08baac07d028536a969003588aadd1f2004585aac6e60e45f0b80e098eae12883a5f230a462ea993e8ad8238b5530482025f0b577497c61a6f8b385804e2ca8254626ab300a88043ccbe96b75ca72a805060571d02bdca6526de4c4f7cff410ec17fa8f085f1b1d9fc73d08593c3f008c05000207108b358451ac224d61106308711f7a1d664b0ee7df562d477fe44f3967a47b32a1cfadad4820504c00000000000000000000000000000000000000000000000000000d3b31781b69ed47d6130e2acd27b890e5e4f94da072b60b8a9a300000000000000000000000000000000000000000000000000032e268073f4d2908335de12118ddac2280fe8458ac5466058ac5466020000000008875318aa1221228a20a10e00a0002d335fe8c981bfc533bb255de8f23b45a51d9cb613e892e4e22b05484851d612780df833b655916ca9b767020284ea0400ac6941a666246d2030c8d7e251f33ba5c1ee3e621ec063b3da0057dfeda6462c57bb0d926d44b1709588553d71552d4246778162bf1505c4123c5a3dcecaea50451f5e73944a1fea7f72a1fea7f72634ec228c1211a49219611211601200a0061ed536587821f17909ad52d0d1867ee0832067577e76338ba9585a30ea4591bc186e8d1b009f35cdc32b891b4218e8d02713031489a784250743873624020430e77aa89c001d010f053000a3b478301304118042880b31aa2ee5082872b612cc0c71fa03369419f36e85932823ca35589410194589d0b426082300800009f9000299210c1aa848cef02c57e2a0b882478b47b9d95d4a08a3ebce728943fd4fee543fd4fee4c69d8451824c4d00e7e9a521066bbc24231bb584501fd088c920b08908304b0010064e932385e8722f856bc43c4b04af4214d278fdf399de266c4394ce21a0916d61ea12580f046a7dd0673cf350a32954ff056a4b090d19789ad833c4d1b612613e19a22425419e4bba18307f713a24600258e220d8120611804000038c84284c00141884208e070601e5cbc8163089fc5b14319ab85e882047150d5862001aa86074a5002200804180e8701ecf7ea142a4dd96fa08176be2bace2865344935f2020386832d840ca9ecff206013afe734a280a9f9b3142804210080000c5907609041048204041000204c01800195907f2183f10c1f4660f82307b11d4246778162bf1505c4123c5a3dcecaea5044258c38630658448420218258001879414c525c6d3b9a65fae4ff7cf2249a222909a4860519045b83820fea16b204032e921a450715a9a7adcc08d4f9c85408133e8de0322010e7d8e4e401308118043072612ca75240815013339cc0c68d9d733141c19a923b010234e689c684024220cbd1c800407bf20f004e204601000017220005a041e8052402991eabe3c8c0c040b6d784283863c12bfb72262c280efe64219592119a04c4e6aec30b05c4172a9f658095d784fcd1604046ac575d17b00149f49836afa78df4d2a13557c50305a060a848cef02c57e2a0b882478b47b9d95d4a0884c1c910810710c0ca0cc00200030f28298a4b8da7734cbf5c9fef9e44934445213490c0a3208b7483f7ce6a1c9143bbb3bb920538cfdc024d1047f566892c4b375ae7d890476426ca500984088021a41336124f840a4ad3d0b51a260569818e5891230c7688a219d764e94482bf670c6c12014b86a89e013881100400005ac80016190004a82000e3841e4860f0430771dc0e18fa6f3e205b92625508a1cc81c71d07083d531c3028497626464181817a458c8a094cb58b50009c5084021038c9db6bc050b42e840881028781b1d9a286b2b8a8b08e105007b2502847f34e9488c0d3393b5f230040b8248180140a11004000066c83b0881d4240e8020730102600c000e14839128003fd4838908007af483802805804004d7c41bcc60dc4206d1983604c1ac160d40b812194db013ab26630bdaaa2db5f9ddae176964562ac4a61284c8ced2ca809c72d9c182353729008b6034ec6ac6f7fc1707f7deb80fa04428af3c01afaec5a923f880722ef223784be3f3248a64e8f26080e76479def03f82c6109edd5f287806831d1b915680f699d635e59f2db69b5e128114ea3a438465a3a493bbbea5bdad733f83030277c676164a9f40f85b520929ac817ed7ea204ffa4d4983925b9f2936f541e681aa5f1ecfcbb434c265a4bec5585dce97b4534a3daaf134d6d506e212dab51841551005cdc301c815669552fbc85115c835cac9fd619562a048f7416f89632672ce5eff2d8abe313a01f1de05cdce1d40d8ab6f2db9382755d9eee8b3900c3fb7672579e8600209ab13986784d2597ae71b5aacc995a1f5457b5d9156f56c6724d144702ed8eb3961ba6555ff4ecf64e9c1a2830ff0bcffe72714bda4f0f30ac06b7a66363e97c843984bb78e845583cf6f2060d99fa956c619b144f2bb7bd7e6d655d726f784c87464f6bd5b65845cd73e12ada03dfb129943e29804ca6308e0134e60a3c208da0b0d3524e4bffdf1011d2400171549b3fbf74e711443ee23f5b098ef5f730423616fd90cee19d492e9a5d74993078b67e7d9bc0f0c372b5b0d2801e000d2320681503388c198160ca0306401ce4d88f9aa5c237bceae89aeec4d00e7e8224c5588f13b193e666b3)) <<< 16000) + 0x550abb8c667c8775f968f8b532e2c77e000000000000000001114d7859764cbbc73dc671fd16bac3ae817ef2fbc0a72b92590000000000000000041a8a2af0c0b0b98b9da7858a70f9be250ffa191931a1fb215d60000000000000000000000000000000000000000000000000001950c20818a008000004045100083489a82a1cae4a3c6d968e044653d83cebfecaf04f6812351e5a80bfe2268e379f4715cf5f2574656e0d967c55295b7e98d8c67b0866e89b41009afe36384d4c97737617650268aed030f69f7b0f1a2adfe9fa76bd4e7671ee1b5a30fd5287c427eadf4f55fe5529f560a259a76b256aee8570d90d44c145670a03016d641207520a5d4312a511c096fb3d5d978fd0f3f6d265160f8f2c767dbcbf01d12006beb5d380000000000000000022a4beaabc36880db5173cf9e9e398460ceca09ad1d2df247733f40000000000000000000000000000000000000000000000000000ce469248c102680500400007ec72ce65d1c90bddd2a048b53b3c4d05e450eb720435c089c6872432bf63f2f93ae160987876f82077748466f0e7b009e0687a3137f65ecc272c00ee13eb5a15c4ab2c4bdfae20f47fa29e0dd3289b10ebca951dbdaab69c0cbde91251de440189dc0516129f1ff6b6ba77a58461dbcd481e2d6d228d7f63175ec09cef1733d08b9dd34dd47b52d85363f4c82ecac5b0d54702aa5f080a2c3551c0aa97c2027ad6b5783a71a989f457349dbe58acad684219241124d814ba20c936b2a2973ff978edb3c904b0b123e9375b09d35f085480d980856cb0238a8c6ce70222c0000000000000000201a269a61811e018008018df901c575ba78b76e53e6547e748a6b2ecaa173d40cb5e26f21963128633af3a3e89654e8e4336f16ada21ea911f904dcf8b9b7a8199a39636544e48751d09c0bb1958fa47d9ee2855734cf64cea22b18807498d83fec960d6c536e86cc9599286054e384cf2180210478c804618400100000ab39443f37dba2d6619bb8b87bffe1bae7e7c1196161d8cdaf016cb2fdb52129820bd64bac1fbe36ab510ad5516d151788ef9b00000000000000000211881061160a001c014f85c8d1700a5457b81d9e6b15ef623fc5e498b07c89f11a9e6c9459d6791dd0c94158fd86499c5b0b33d530a8cd43c589a3524f23f78624d8f48e5fb68bad540814127268eda7c9382efe0101c4cd225163443ae42de90855ade1aa21f86f500051920c62b0621582686c184360981b0600d82f86c12c15e2d6e7230f18268cbfc527806937150423081f00802f00c14c060ba0388e0a15a7fc9020aab306ea7840fd14e7d0e100cf2276e20527e902f30128611004223881a2da38e1c90dfed944080a8bb7e51c20d9c1b6e88161908b904f0063e08ae0380192804800270c210080000b19b0d54702aa5f080a2c3551c0aa97c2027ad6b5783a71a989f457349dbe58acad6842186510fcdf6e8b59866ee2e1efff86eb9f9f04750919de058afc54171048f168f73b2ba941142cadb539fc028fd890b2b6d4e41e51baec046868c702182880071f0f27199e6568a85c4ac6b6b5c25218cb0936b427ea5a9e1d9154c14cc43527fa31052bbe9a503b79ab88690c7542537fff23f7e832d87b1d34a1fa52dfa1d11f1583e855a7ffa6d4abe4ecc38d2af70f2dd787a01a228b7a30557c9c8daf5444b69a8c63c59634895bb94500523cbab5eecd440559d70eef3ad4c014977678b49b6643d208b629d4001d588004fe9ca21f9bedd16b30cddc5c3dfff0dd73f3e08c1aa4a9b83745acc3377170f7ffb02a85c58238595b6a73f8051fb121656da9c83ca375d808ccb10610604c0040010004b70f6593be1b4bd32ecb65a9eda597c92a7c0662720e511653bd3eb47f1d19a356abdb53b2978bcb18ff9dbff5e8b986320aca0007564170540b60205a0148e573d2bd88e344337a35448383405e8b440c8002e50c400b182e9ba8f0091863b57280151bec7c401149c908802140ecd7bc6d028bbc300666fcebb24150942f845bba8833f445e5868cf51317703a240bc812581e2fb0d85a843ec2d03cd0decb2f6f180567ddd4874c709abbf8927d91c108b721a310521ddde3af278b3b0b362080ba93066eebeaff65fa228a41485a121833896545740da04ee27f16f22f5f4d13ce10a695b8905966818d6d8c1bfec34149580e317e62e0d314e4ba3835b4754e6b489e7454d3d26e5d14823f542bf852c4476c14fb2a3ead0745e9f7fca26a40dc96926952f0b4ac0492501ba408ff37c5038af38770120436d3d90e1c1349d45c383053a695e2350028541292025082200800008610590d82c06c15c160ac0305501c0b137260ab38a034ed71946248b51e18da37e8b39b7900bf22b1f1a688bee8f0e39e322c51dcd0fd579e20bdcb310566ac638d3930cd81426e2f5eaa0bacf38ba4697a56759c1914d672b078437d23df6e8abffb55ab675a13d1699a36671e973916de1d9470a2c6df77681f0f68a0904e080df8019558989d02b05ca7d8090572ff164af7f770153efecc0e74004c1951e2b7fc021e280fa9a849fa18f13dc2d2faa8432401c0245967c5f56d2a4f63cab650aa4b31048a1bf8e1b4ed366a800b59c7340d64d9bbb40369fce74ece864f8250ab3c13801d034d24423f25e31636e0d8d78b054149b9481cb77e330054f441d5fab8f0b3d79895e3cb4a863f0032294071d274e1bf9e0e04af8e30dad63c02a04e055758984c283ba62710d60286aa815a603d1b4bd200a080f802000035082982e0509c5cdc3201901f2b1b181)) <<< 16000) + 0x35278c30008c40800200a41bb71aee14ba20c936b2a2973ff99dcf035104b0b2b6d4e7f00a3f6242cadb53907946ebb01196161d8cdaf01789a01cfd34a420cd7784846376b08a03fa1121018a1100ac026000582586b63c8528120293dc2b8a3c954b9cde1ef286a5d2f434e966f044a36f72a1d69c255a425fc6986980ca021146c5c191fae1ec75b1fe236728a7b1b140010a88002839c0f2bcb00ed40091b1aaac7800088ac1e3806d442fa1802120e1080400003888007e2100179d200325c6482249b027b638a00d65452e7ff24a980cae094b0b0ec66d780b607796af4bec75f8b2ee3745afe0d0b27690c5285e076ca7a80000000000000000108cc10309104f00e004009b8eb95e30dc896a6440cdf0b027ad68bb1e1ce8f4d986865bacedc4fa035e7d0897c5e0f7c46eb005e4511d1d450941036392c24fcea70a8daccc0e276c39fe705de503ba43327da2b4f48394eaea6f91df36f39e91a6e74c80000000000000000403a4ba6ed3dd02cd15a52e14da7d7b2657f41532830c24410c10810c000094e200b75f461e7aeaf9dcb22b8d8de6988df265ad69473f768e06c4ae6282e802439a2a4e5c40182ea52a33395361cc62a28001c2903e1d82884c0f40400103a40f0a400613041406761aa8e0554be1014586aa381552f8404f5ad6af074e35313e8ae693b7cb1595ad0843a848cef02c57e2a0b882478b47b9d95d4a088b0b0ec66d780b6597eda9094c105eb25d60fdf1b55a8856aa8b68a8bc477cd800000000000000001090c0cc08f00e00c006ac790f126f55cb16d461f542759e92770c0ed56e3dbb4b41400ad0956f91bc84caf845d68024c57514b37c2b0ef5fd3b85d71c0c0c49694f85fd5e0cbf45dedef62305d622111591b45112e557fd2cfdb6d508e7dec4c0c72a5bb508edb51982592e8821fca5fe221c2df0375880028581da41a00cd03834e2806741dece80328a11004202002008b0d54702aa5f080a2c3551c0aa97c2027ad6b5783a71a989f457349dbe58acad68421800b71aee14ba20c936b2a2973ff99dcf035104a49044936052e88324daca8a5cffe5e3b6cf241296161d8cdaf016cb2fdb52129820bd64bac1fbe36ab510ad5516d151788ef9b000000000000000002129c22601c01a01b2464fe6213d6df5531fb899cc41bbe694d5b87e7b625e0404cdb5aa8cb9d1f23ddf01fcd1a6ea51cb1d72fc2c7a9b0ab7e579bcdd2307f191f0a8a51c45fe078b8d070bd0226231e5d0ef67cb679511d30f0c71446a07d571b1e5fe77d63ec6b0d131ad66ce50d7e1046c191a000e6e4001dd08004501c07bd832e755c4d5ab02a220fd0ac5fcdd9102ffaedd733b0b80000000000000000044535e165d932ef1cf719c7f45aeb0eba05fbcbef029cae4964000000000000000010451ac0432c10c10814003800b0e1cf4a2e859f9ff958899fa1fac91384c16e26d99a92918fe338b1e996cf6abe2ac7660622648cc470ca94ead5e3efaa5d0fefce6ecc7d38850bda7cb734701c7540cc899bf1587a6e5f3a3431f66d9e42598c61de2ef7546e12254ddbb2664c3a749a8a25147fe2451d2040a8002f8904f2182710c134760983304b05710907cd28460794e772d4406b8c81be4023102000802500c1240750919de01dcecaea4fe369b33fee765752811d4246778162bf1505c4123c5a3dcecaea5044585876336bc05c2c48fa4dd6c274d7c215203660215b2c08e2a31b39c088b0000000000000000080830290060010008005962269c618f96322e0c764daf0f82cb2e32d250a88c5a2ffaddfd4f50f865764a42582f00cd5dc7cf828af0f6f9f202068ef2414a9f437f2a8a39f25dd1ed53f770a32267ad0004dd20901280600802011c07c52b4b87a881cf2132785053d654123806b34f110240c1d00840d607e855d5039c8469e52004b96807008c3080020000154400063cc0300401008c0304201000026100315f044a68cfec2831c0ba630102fb03acbc3000941676e120410004011417c10402e2630505af9f09ea10269e26a4b500c14f1fdd8120610804000036cc087f692188812c40062608155dd828046103c01004505d050e6577e01020bde7088540370814f2c04618420100000af200030441002407e0a0003a72000c3e411015819336d7669e0c55771691e0255a21d11c05d31ea2214036348a5b8807ceaaf9a800330e100042424833559c0400d67b85580442040010806008022a03bb880734808e6453ee044183e01000007e200017660180200804301821008000130d02f2967c280c18c93096c0810688aa223c000287e472404200085029525fb22860a5d2ff6b1401a6eb20a04608420100000ab20820a804008022829f9957172810149693ba805af1a08204610400100000aa20001ce41002407e0a0002db200096a40f87607a0200063120784a03b09000954102f2d00142510065b8205a5a006d7a3845b314a893103ae05c3c0602ddd454e8846afa0a17e0e0a1350eb53e790db255d048025e8c7c720cf16e5a301001fc78c603a5705f0cbf0200aa3ef0ea3531f97d9e40a0b7af76e75333008ba1810103df8653fe73ab30bbf4c44fe608830c509c170d2410ff10d3b832e0ddf60ea4e5faf509b8653de4342c64385481cc265fd80ac0c027f1e28a81421a00809046112d100acd64da5e81f105d12e25dfa0075240008e80bc5266fe785808df9f454c55848510680601c5c898da20fca5cd5ad07f861900d0b2510af0102a16ca1f55293fad3873ced6f6b4f17de8489f2430ef8033011ced1e90)) <<< 16000) + 0x97dcccee6e3ba5209a1e87072a664f585f2fda3018ccacf024861b2d24127b56aa6c1d879f5ca580145e7ae91ff9f26c452978abc30022c2cab3ecd8d205782a798200800c96c7285bd457006e4241cc021b6d20da931a0991ae7c3b0d51fce041e897e8ba73288320842c40f2c9b8f918eb056bf31a4de06f3b066ce44d9e7bdc67bb7904c533f708e0f28fb371c00f0dce3b48d7f2e900a66ad7587ac390545926edb3866dfac24317776a684c13451097f8e40dab26768c7b7006c3cc7461075a7a495c7843d56c5bccbd8dcf37f3ab78b6e000f8eab58e0f3b05110f63d6273c407a218dfe8d9ada457bd432a6dd9ccda36c5e063df857397584cc95ff4ba82da6cd28fcd8d1d0278695c0639fb6899149b2fd218f415071f1867519200e804000b7240bc44072220381100048810370d0006e0902c2d01b1480a09404e420262101a8880d0240660200119d206442939a2623d682affaba2f604737e1722645d1c41ab4f48ace281fe39ac91916512084585876336bc05a62ac4789d8c9f33359aa855dc6333e43bafcb47c5a997163bf0000000000000000008898992d4486a05a1841811401000e0220888610302c792a2e29505bc00c1388f45effdac61da4617ba9d2e0ce8ad1b084352e83d34ed284451ebe764dbc3daf838e4a09e600e173f1aaca34e5926a19c65af7960b8f81b172069a45d9250b4d05354649ee9263a794751488246343ca1712521ff185f86184d7a379f77ed5189003010b55f045837e40008770ee59fe64620402df93bef5356cb52200f6182ffb9a3f021119dea062b100c4c4760027862c3d06c4fbd169e666786b64b2b97a9ffb3e04640e82510e90b37bc402c8e1041030c4002001000023e4aacdb6767c6117197f208c66ecd7d0c73b1e17501d7ed444032b6ecd9a60e587e19f6d55cc9a5738d6247916af8b1093a0fa8d142939d2b298006bf881fb2000ae3c71a038026a2a325820050726e66000cc304601080dee80aa4d1c3094c5251a0044284401088f332e596d8f1c0f2f9ba118082549229108021a3fb37c1204118042250eed57ff088fcb62665198384c5c6d9811841100400002c08188480c0140003ae40009e88178e80b80400080c40a824000d9c40b4940012fc40b0e605673c20123c4a916f1e669d74830287e671cecfd6be1f2ea0c042262b2e475cdad7ab981c10b1e5ed45b96659a5ee0a00031ab563b68bb6790a0200066d85cf01edef7ed7c01511008070cb8a0d5c2ac62d9837711b8af06304e0b065d536361c902cd15a52e14da7d7b2657f41523491c43432021012400400504df18792b2cefebbbd28f0820c93895dcb8a982f95472c61106f09c50750a42e015d4d104d11218b88024b9d14797b40a0b03801af3808033c38d9c33de40c00087494c89317075fbcfd0100109b9b580bc7db5e1173b00b3080453b1fef5ab0a7fb09109ec12d33314ea97c0702fa5878052887a2902b0682b70d33f5aa80d5000d5406a8008243a4ba6ed3dd02cd15a52e14da7d7b2657f415338324314314238000338722e759511c9c03e2e63c1b2f132caaf3e89c49decb5c8e8ea4fd2b309ad7751555ccd6d8cb47e681336c8be98eabdb294dbb9ba205a0814827c80a00067240a8140520a00067720010ac40a0a404e4a026250005be90253d01208808c4404422001b2c343284238d9020895039f8a140f88e0a9de402af29f4b68c01413686e408006e28be10aa220cc6044010d15a52e14da7d7b2657f41512c72c21021811c0180040051c5782a858bf79951b14310d81a316e835ee95397281e94824140cbc9353772c570e2d6e1a67eb5501aa001aa80d5001048cbaa6c6c392059a2b4a5c29b4faf64cafe82a6606506304100080220324a0704d5f79628e844ab7156b623ffff33b0b0d1857ec5afdf53011fba735145a8e0d5a91140d750c89c1486b7e01e85a6e2bf57d34d79d482807fb81d838f84de0f052b02132351b2696a2269a38931f19552d7d6910c3cb1189a4b05e76e7c905a4ddc73518eb3f24c70c01b18cedd1e77f0569d231e90c7ce46cf70b8d655d6e6bae74ae1c5b6f946587c71484901ab792b6a0da597b96000874a5015468e7034912b9d58829c36a12e3c651d14162060d592d31160d6da0c6140e28c529bb836f702aa90291b98a6915dba50e2ff26d23e2c7fe49161b322b4e4f6e23e3283deeed28349debab36ae8030f452f32230196244ec773d2de87ec6f6d715b401b055d9ffa5f93e51d091b0709336da46c58db3de2db1191472686cf7aa2216951c000399102105010028002ac480064e901f2d00f148074940384a01b0d00d06806434030020170100076110160900594e100c17c201e47c686459fda37740c14c007ada9a03025f33da19100a0fc247602714202b0d06848cd0602b58b20e7b4801d1cf44f504a80a444dd007102db264ba635031815010308ad5fc3ed61c3064e044c48c1414aa9b62850820b758948382159ab457a0411f094c0fb080013fb7f4a03004df3b2e3280a14101280438f29ddc3fc397261d4dedea1cb49e3da819ad32705004840e0000000000000000000000000000000000000000000000000019046186107086085087000bb8acb6136f8ec7fb6cf0414e565dd2e23fbeac34deeeec13677ad97cd364e6ce6566a7b51c7788afa60057a29f4b10410c74000df080a848050240260200058e20246a011350081a803cc401c5a00d2d0060c802c44014120090900404801c0400c0200501000467900459001a8800844002020000100b0d79)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case11" = "QuadHeightCover12Case11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case11 private def zz2371:"s0943"="s0943":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case12 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l13 l15 l16 l17 l20 l21 l25 l27 l28 l29 l30 l31 l33 l35 l37 l41 l42 l43 l45 l46 l51 l56 l58 l59 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xa3ec2f8f0, -0x59514ba00, -0x86056346a,0xb31a7520], ![-0x59514ba00, -0x2c58dbdb49,0x6211f5d38,0x5507c0064], ![-0x86056346a,0x6211f5d38, -0x2452531800,0x597f12600], ![0xb31a7520,0x5507c0064,0x597f12600, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x21213f636,l13),(-0x23883a08,l12),(0xb27f96f2,l17),(0x398d5a5d,l16),(0x6693842f4,l15),(0x8f7b86e6,l21),(-0x1916f6f88,l20),(-0x2cb417800,l27),(-0x86fa17fc,l28),(0x2cb417800,l29),(-0x776b5460,l25),(0x468baeb8,l31),(0x1073e2004,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x40b4d536,l43),(-0x1e6f839fa,l42),(-0x612cab702,l41),(0x3ba97818,l46),(-0x6824ffbe,l45),(0x2cb417800,l51),(-0xc917a0c0,l56),(-0x229f4f94,l59),(0xb36f6df0,l58),(-0x6ae21f48,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x6693842f4,l15),(-0x612cab702,l41),(0x21213f636,l13),(-0x1e6f839fa,l42),(0x1073e2004,l30),(-0x1916f6f88,l20),(0x8f7b86e6,l21),(-0x86fa17fc,l28),(0xb27f96f2,l17),(-0x776b5460,l25),(-0xc917a0c0,l56),(0x468baeb8,l31),(-0x6ae21f48,l62),(0xb36f6df0,l58),(-0x40b4d536,l43),(0x3ba97818,l46),(-0x6824ffbe,l45),(-0x229f4f94,l59),(0x398d5a5d,l16),(-0x23883a08,l12)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x780520080000000003c0c80170860c50805e4401800000000160148020000000000b0320040820c610808a90050000c4321100d400c0000000001c0c801000040861024c301400580c4250091004000104460a029400c00042118280a9003000110460a02a400c0000000120c0cc010000000543c0a3008000000001a0148020000000000d0320040000000005018802001d034084078401000000841400f0c040000608a1024c301400002515070250020000098541c0a40080004c1482c0490030000000743c05300800002d1d0f01500200000000044062008000000000440c801000000000880520080001c23040930c050000000442c0a30080000000009018802000000044340f300800000108640d8c030000000003406200812320238407e100500014c7413024400c000511d04c099003000007114404c301000000188a40d8c030000000741806300800001c4510230c040000000643c0a30080000190d0502d002000000a23100c300c00000288c40b0c03000000034180e300800000000e140cc01000000034240a300800430c4210259004001582405809d4010004d0841200c900450829010800cd40180a20ae08801b5005001502705006d401000520a81200f5004001702807005d401000000000980248030000000442c063008000000000240c80100000004424063008000000000e014802000000001c009200c0000000012014802,0x900c200c00000000340308030000000009c0620080000000134028803000000003500a200c00000000190388020000000006c062008000014848004cc04000000542500b300c000001608404cc030000000584807300800000000b00248030000000036009200c00001a8210058c04000000068240630080001a01040098c05000000681100e300c000000290d028c020000e8260c00a400c000000000b01880200000a4984c0a400800001444100a0c0400000511040a8301000002d2a170290020000000b4580530080000000906018c02000006114402a301014124238c0f5500500000004c38053008000000001d0188020000c8220c00a400c0000010844050c030020472164024401000051190b4049003000000000840620080000001915028c020000000068b0330040000002913028c0280c6101040ea8401800059110440510030000000541806300800031088340a90030000000641c0a300800002e19070290020000c8541301e400c00031148580d90030000c4521301e400c000000351a014c0200000006c34053008000411c8980d900300000000015032004000000002a01480200014c5409016400c00000000190188020000e8660a02a400c00001e190501500200000511040c63010000000f1a0c0d001000000582101e300c000360c8440d900300000000054062008000000151103cc020000cc321101e400c00000001a0c0cc01,0x3211014300c0000000019024802000000440900e300c000001282402cc0300000480440163010000250982402d003000000001e009200c00000941d0318c04001d8250740cc40100f208a0b4063100500000000014072008000000002408c803000000000c00b200c0000000024034803000000863b014300c00000228f4050c030000007633014300c000001e8d4050c03], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((0x490004ab6c6f6cc4e6460dbec60c2c60e004ab7450d0f73b7e9c38316c0050f342568b4b1de690e5e56d0b995650c0599a4537e977e6b286fe5c1796506072f6a52091728ab8504d364372a0727bdeaf6ed3f965ec27e473a104bac2d874bc3e571670af076aeda1d771fc1c489713c12883609424804bb21cacc1c492adbd0287fca01caa091d08fd074d24220e05a13480064c647121c014f0e856542710220080000b59ec4176340016e3396b2b97a9ffee51feaa20903b105d8d163602544565452e7feb283f18682484c5968bbfe02ccb1891881880470060143b497a9f7dd5686a0ec1937fa1db9dc3b65f7aa45d00efb3511b62e1be2570521b3331661433683ec773bb56614bd27e80019c906c0582180f3a604de0000000007fc6b0c0397ceb945044101f5000004ecc9ae924a0a91849649020a21c1820d73462b83433e32e7a8e85e0c3b64c2abe42437aa00ea415e0cf34596b40abfe358423470b65c3de173a038932635a80a6125104b0594a00039e518212014c2030875094408c020000228603ea000009d9935d24941513482c82882c43422c11c01000070280200d0000ea36788cd7e002dc672d6572f53fffaf8451601207620bb1a2c6c04a88aca8a5cffd6507e30d049220135ad95600d52801687c0182a860e50e48e400380a1f604114d20497c95f4c87e1cf7eaa1ca8a51ea42fe554f0ff3177e14d06e938e9e2306ceea9f2c51de4bc3c3dd64e28c641554000dfcd8c8c5797ad5e82065b14392b23ab0172c955190e510e411dcba2ad840d62ef67a6e815ceeea7f5374ac4b84e9b370aafd835b90f8686e5e3005ada844ed5bcc9489992926797c13959df0a67adbe3b73033cc3e100548aef035e458ca03424038837799e5dbdfc914225eb5427f7d4017397437e0ee559b20c8165ee5c6886619c4fe810dcee994c0ebd200849232a549557b193a12c4e9b71d83ebc11c36de70365e9574a5568d329a45c67b97aea1041cd0dd045eabb96fcf93497a41cd42cc0003041000e522122039114756902ac5d17f8e2226f2ca2dfb13441848072d42507090fc2060c61a68b8cc7b1c9045776fd2587bf3e8a0481742d30fb49c90559724e84ec373c206a196877e3466c20adfe294bb78c024c7b8120c50760d00002a820485b0230d80e86f3a604de000000) <<< 16000) + 0x0007fc6b0c0397ceb945044101f5000004ecc9ae924a0a91a49641440e28a29621a0800dc600401ba44f5d75b785105bd24faf0e28da338dbc58868b74f3f9a0a6c225afe400a77aa9e2000cc3044010000141341cc2964b3805c262cb45dff0172e337557b767431862b61fdf55109b3f60e4d09060b8e307b4c000000000000000002248804860e48e3083801800012caaf43527ead1d21cd16fc0586e3d5409d02d202365d20cf17359312bf80e38cfbd1468f3052ab7419fcc46790fb8ae0547348b3a00071873a604de0000000007fc6b0c0397ceb945044248c40c4845824804001800195e6f0e1eb721737617f91547e56b02b66fc4714bf6301c819c48a0003926839852c96700b84c5968bbfe02e5c66eaaf6ece8630c56c3fbeaa21367ec1c9a120c171c60f6980000000000000000044910090a148147144081000008e083fb16cd274055cbaf7ff5530937b1aba7bf4962c1609dad14467128924119b578871b733788f5e5cf6535e31585524cb2b68001c1909101cea23338db60172e337557b767431862b61fdf55109b3f60e4d09060b8e307b4c000000000000000002211220e20c20c10608a00020d7035bc4c6274714a2e627243ca20a45c5a9f637f044ae790bedddc64f62e88e31eaa9bba7fa04995a7c64e2438f664f7ce2a8490f478edbf1846c7fae50d80d64ac989c0d6c59825150003f721203203009000825902e2df08fc7f8f266fdca42820526ae22b7d9bf3eb40813f52fbabc96e20aa0a0571eaea0b5d3cb0a8000e81934180fd034fd2171b9e10e5f1bbee48bae45266f6c43d45fc0baac1a0208400000924e0450d22fe04332182391caadbe2b61801073774dd8f60a041d6526f62fc040157309b30dc440114a06e137eb950000a8056de38a9c88c2945870c521b965510c40e0000424423d2605c3b08e1d84688c230141160281bbccbe6bb4a638528a34cb6636182a79f6f9b37e8a10c9208a17d1080403c4af489b2400649ffa3baeb1c0809cc725e930a001df67fa79d85000411752bdcbb214a68342d02c40a66da03a7a204a7b704b270e205a44559008000dd65ac5e3802608b5e3b1400016e360022aacc404a010a217f1f60988815648606fbc813f500ba9dc71059ca4390050c003d0900010129f120a91000335b7ecf0a620240080000ba90202181706c0b017c44c3ed2f5ceb7470ed1062b5a3d631820c400c6d51a3c3080b13bc89a31010002bb9ef2d8c4001b66d9de5200800009c40a60640780001ad20009dc4228d61126b08835c8c6b0a4b9f23850a349c839660048b0e592972e085084ad994ed05a4880b8e4e9fc9a40648f322fe5da104ca24e58ae6c200117d9570200e44021601002040610003e31f27b38b466941492522613090aae4bcf19a436ff85abb8c1e09c7e7a9e30660489e8a8980094021c62a9cc58ab8d2de8dcdc13069120d5a8e3830803f59e810183aca00d2fc45000865f888c0800d059465a9c00940200002f074b43a7ef7be6dbdb8614c1a6f34d31b4070c2432eebd3f4c57719040137d3a52e4c64230784a333786a5234258e11b0d1ef0b716d8b189c0cf39a5f8aa20408066be8a308cb7d040083eec304751ca26103da9043b05c00015b9c2913fbbe6dc5923ce7793802c81dc0236448e38681c367d8b1a0fded801850ac77d257761012c755e5fb90001ca286f602808250080000d6900077434bae0d62cff8d618067fc6b0c041209429229421221018c090008038040100684080c20007a5f47f214e79a44d7b41bdc98459da0d0001a395026b7a6183bde966f009221b29d84ca8c18dcb859f1060000434bfbd00048010d2ae7baa37205a3e5b23d0e75d3623aa3482a471869669061060e4885000818000100680008c9ce2ffb8430a0589851041839639631018409200201904010068000649b25624e1216f8164038350c262d1c71e231c8805058d3ece068e910a18fc8e90d04c142c29726834961c213c8d05698620275727a1405c60014ce160ebc05d4841581000008688002f71000731210e2b0860184280e975c1ac59ff1ac300cff8d618082412c92c62862c52441c324014070080200d0830184100fcdb2453d33938c7bdd9dbb0389d1bbd129b34925c940d93348f2fb27ede2862186405c21432b959c2280c00008697f7a00090021e6b8c73e59f5938ccb67ab21406713a72dec87030d24ac626ca2ea1a43ea1ac443422c00095e0d80b62000330eb75cb0100270a53c6b76440015810000077cf18c3836a495cd4461a5ee94d7f6687e0386940d0e61f9902300924852f62e7e6c2ec4691da2af236218e619842467adf16c3df4c60e7bcfbe8f50e242040805a18b618e801a0801d9aa1ced761509840f6a410e817000055c74b3bb80f4f14cc2a1589ee039420828d4bb4cee0c1f4b7dd19fc92c72e694d15b8cb1b823dea1d9820412e217813c4304cb3e6d3ec81c0070bff368a03f4841500e0000840800447908411d2eb8358b3fe3586019ff1ac301048259258c50c58a38648028008038080100684180c20807e69145cbcb80e3203a1c4436716152cae3103896f531f1649a44104391500a180e664a6f22001fdce22580c00002cc82e9402128043cd451d97e3e9c643c8d47fc4e262a1934a8e69247d0a73a034845b67058a160019be4a16c10012d7952bc4e084a01000017a39c5ff7086140b138c34b2493483083070812800400c8400803400032ce96910fbf7e7530a41523405421040d9c3e6efa0c1e32577e210a58e1be69c67a92c6a57110900c102)) <<< 16000) + 0x00654938644304973b07b4f838009655448b802a90c2901800010410006492000f1c6975c1ac59ff1ac300cff8d618082412c928828524524418220004070080200d0810184000f4b960b372d51a4308a526b30c20ae99483a460ed24de4313245141ece6cb8c18134bc7fd450041e2345fc18000059905da00094021c629aa2860451a5d428a4f11a9a500d0e5dd131a44f38ea22dd1841a376efeeb183ae6f402dd5122809ee6c73402004025d7b70d2000a005000038874b579052f3b7af3a0615bff2c58215680e0c2436ce285595b2e290405774d0a74d5484307e1183085625568658ea99874b17f8dd50b18f108b1fd3a7d44040804e4df9c967afa0400ea11da4b85e1446103da4821d8300000ae0d936f8dadb820590097ffb69d238e5d53f5422058dcd3640c0ca50d1436d67ee450b6dcdfda4483863f371f3f742029e8a5d5a94300101b6bea60124841400c00007f4800439907f1103f00800278081f048006e80c8f660d689b6240a54216cad544071f65d3b4783860425a3bb5838512437ea5142023760128e4c3001bfc224d000808246f16a9ad2010a00500fa0307c01e147fe4baee82c9b1c74e057963394c208198a192d7fef58650a532bb460f1c422ba2db1188001d1082b1e700250086148465fc41f2c980859f6ec16407d8316d28b19de69f990050c4bac6df982854f2cdbc15820033e3fa18a700250080000bc1b25743f83a8ed486414467b4e60caae78382872e7fa9431dddb5a30c0f3eababb26b170a1772ac18b075f985922a25cf8d8853ee1424445f64ec5929d7f0102024f12c6ce07f981003e95f59569afaf1840f69208760c00002b8323f71f0fe77024619ed93100e28a3e37f8d6c0912d2be865ff9024acadad41b203103dc0fa602844af4363fd4904945f62b2e0c002af3ca7100c908270100000f910007eb20942207b010180081e8040f202000a5f2078320781503b8a81d8140ea020740103980800dfd483922c1c4b60e04b0201983786e884fa2857dcfd5e81c2005fc6e77f80370ab50e0556f446fbc2be971c50091d6db7c3a50fbbe100327f78278ce997aa000438a2af2056fa048311270e3f3e930325000050d4b00111d6a9afbd09fac41f5157c3936b36eed702aa2083e34da9a1ffa4205812862120b2d315ee35c58c0fdf431d3448b2544f91410462da3a26002100840b00c223229659d48e2c90d1816d590826891f92c39d28403307d779408662e1edc6007a8888b538010804000057483702ece9ce07eb30170eac08ef6e805b0612d40a323d6b70b7840f3b818df4ddf174e85925bd8caa3800000000000000000866b37f76372051a818f474db422c146a063d1d36d08b04f3e12b757a471a10f0d27748d30dc9012e886a6064863862811e8c28e26098e77e9e322e29d5b09c18eb62031a056da093b2c598a79c13dade3fd2fbacc1a2e92efc2ef62c23cf1ad1a83872e7dad54a5911f22e7606c97faa8bd73d76f4458d0697d3c837cd4614b0396ce812ae9cd0005b2372dd4e957e6d98e89b3cb90c2da0765023046b3a7381facc05b0612d40a323d6b70b7840f3b818df4ddf174e85925bd8caa380000000000000000086d2ae7baa372059acdfdd8dc814a60628218208073adc22c3428ef958e1f798258774b20d0e7e2171617aac64b5ba6b6af7899b464917cf6b5aa3516803ad5696976548e19ef2587b3e17a18c0cb4c5f3428e8fb34090e3cef620bb1a2c6c04a88aca8a5cffd6507e30d0490eac08ef6e805b0612d40a323d6b70b7840f3b818df4ddf174e85925bd8caa3800000000000000000872c2019acdfdd8dc814a7946064862810f67bbb3498fec6c599a9b02be3ed98990e309cc8397178d9a2c55494e47964ffc68d7b25d86e6f82ad99ee945b60a7d643d60d25795a5ae6864e742caf79eae8121a77d00047f200127841a8460d203d04133edeffc8f47652ec865a161b729c572032fd6c24f940c796c94992ad1ad6ebf4b470b1bd9a51fed8f3680ab334011c6ab0280e4560d2d319561b4dfdb034141a379efa4180ff7211a3de6f26ff2a77767b7d5d858b3d11d0dbb275015a3b77cd9fc14c831938ac84f6d1cb3c110cd9d2169058da9a057298814c1c6bbf77b56b83c199948315e47000045420da3306c11c030040100d61bb059b84f8ca302122b8292101ea9d261a08062d26c6d9024102100800006e906a1583480e85d2de5bb1200203a5981803d8f182811860f00401a037a00df4940b8204961e65c910210004019c1700001004410291a6fc38284c2d18820a6d778962c17374fb0cb012bd845a2800756f0be6001e00800008e1066010000b7106405000117106515e0a1d0838465a6a1728f0440ddfee6227c06004a9960ff56e4655fd5b5de2df06f0506befa31881438fdb5b5c89b7b5413311475cbda9c25084825db47e2a3656d29412008f6420889737413ad82b0113436da626a88c47283d7042afd47b5a2d70a410f0005aa127f4ebdc876e3bb551746c727360a1c340d792c482f9e44b9d6b04189055d9a0d63877c1bc29fccf5ce36924169c6b643a05268c9a95fa8a914621fe700886c3b67eeaea18c3f40e4a781b672f9777274424760bc1c29c7bc82282e6c617557ca084418329aa23a03411ad498046df35420baa172b690bb88d138a260f50233c2bfcec3016f3a387a303ce40893635b25f702e59194805f831705b4495cb07b90da7d2d065be15c9b6fce9d19b00d24a10748dcfd15ae3a6a66b819bdc57343b4012025691e386c47a599c60ec630e)) <<< 16000) + 0x5e18084933d8b08161b38ba048083e0100000ce34187fd270f9a10bbafffd960879a64d20c098ee1c6118051ffec25128210004307896f9078c0c66cb3600828c1a85511820f00400002808000dd10640500038a9063118006361000f9e20c41200112720aa430612183000e842d821b3abc4aa081810d5bfea1f625c38090a520c0a67c5795802041c0de6f2488a0c02802c3bd48c33226900e00c6cbc127c2844c02521dcfc24dc01121c525efc7fe5535e00c4743f06203d07050629015113c70c255f5cda0a1969ac865a1038774c38ae580088883678400df0cf2e40884c3046010b96ea74abf36cc744d9e5c8616d03b2811823503a6e9bfadaa0b4e4a4dd8b6a74b20c7e693056c060b309850000000000000000010d2fd2a7104831d15295373bcfb5ff3947ce76173573a5f5de000000000000000004196100cd40c7a3a6da1160a35031e8e9b68458279f095babd238d0878693ba46986e480974435184144103300121ea99d36299d2e2a5817bfe8a81dc592bb30c15aa43501b3372927d5af15b94de45d11e18fa1c7eafcf9b01f8e3c02ec47e46b3f97dea08ef849a54c6367b2c530ec1c5858d49ebba3408778a3e6ab9cf6c64b2a1956f92198f32b4aef2f8f87cc58c7831344370917a8da79fe9dd82e282de0dc90577dc1b119575756e080c6b5a94633467de94543180137ae29206021e5d59945410840110185530e8e5346c63e9e2688188d1fb70244116ebcae1c7040fefbc76200069d33d1c98108802000027040c817e483cbe9aec70f4902869592399c92f4b660400d0866d04101d217969280110043c943d860ffce1e723539802470228165b0c081661507c2c01113b6196500220080000839e2114b96576346977e165b0b041ebfe73f2800fbe91aac500a174b35c250422008000084905f010001b1105e098002ff1000dfc20ba12000f73321c1d56e232389aa0201a0e5bb21be2261018248ab9ae30db4ad0c01bb3b30f798a9340a0193be4c726fb9c40a4800edb24c4abc20430184027e2d7801715d84e7d2b47c5de89b42921d834000097c81014c08c640482a0014c220b86b05b15e0be92f2aa963341a88730b65d8b466b024fc486eea716d4466fa67cabfa1a43c083f4601b6452b98d9290eaea891ad07b6f0eacbd28998be25690e65d2c712033a96ff13b1500721dbbe4caa0b00468431dcef86ff251d4105dd4bb31614b767645cbc50dcf03b8a13bde2c5b2bc751f578b47a11b8ebe35b5a6e28df11004639ebcf513fb6e89cffb3d20d33a4d30d868f39c75ac36b9a65f716d54ce8cae867477a02bb10358f7897b2fabcde7ce9e0e43bf7f291ac54df6bc409c00828409e8380bcf4d287d58badf1fd0e63c7ecbb565e61b476e3492ed5e78d891f5dee69ff93bfe5f7e120d99fd2dcef18c2a2f4baf77898d288efe442ea029ad7a0a2eb5cac4fc2bbf6ccc4b47a1120c4e2f9a983bdd7a67c0394eb67e76213b0843ec10a0fbd003a3face92f1ad768f450654ffdbfea1e8c87adcc10254a6f9cd6802dc10dd0cdbec7f429b358358cd5524fa0baa5e575f544e36cd528a3722e058c4a0700a496879c8fdf890b7b2df63a515d34bea327aa38f0761ec205364409e25d13a800723e6fc3ab8038cbbb801f4a65abac58427487df58e60cbca5fd09d9a15294811f34688df3446d827314298ad809070f4e62113628659110b436d72d7bfcd562f4cb5a904d1128467dff94237c6b93ea0864d51610040100458f7669d43ca1d925050d9e315131a8a2c652643236580334caea094107c0200001f4686cfe4d64e285731e1fa6280479417f908c208002000015260180200800002220b402059010001311e183cd3ba95aa39fe1f4e83050207568d431606b761c105ba0a52a884c8e6e413ed4cbc6567a2fa062e372c25d9ab1638a0af1cece55f39890e376a451c6ccbc7affefeb50abbe103769472b0de7d2af3a1efe28bd038445fc36b64b6c34f6bc9cd68d1220c05267d87673a81f059230b81d9c2270d85451b913047adcab8c6ec0207c60a01b2fe486ecd57abe187c6b1494653daca6148920321d055f3eab754fbe69ba15e3b2508c57041c60f1f24f60f4af1257371080ad8508f1826e1fc2a1d6c4121c702cadc907f9a3999c5753c8c752d2b0000d4e40038dcd0b4e0bd2c228268e992270c1bf184fb3120321796ca400905084021a38a6cb80b4a18a68d192e60bd185d21e1c58debc4bfc80042010d1d9441fb1c48cc2c346a6305b079c6220e2afe68be1c90060a503f128010804000040882c02f066c4231a5902b49fdc44cb125c1ba406308f1434aab2002bb03b9f04a1042010000106362b1c5a8a08711e4c4432c506e586826d143a15936dc10007822c4500943084020000210684690c88080c1ae1228968908c70a16a0205acc9c6ee1c00245b5f1804a204201000010a2000ae04044240461202409000354104a29823888114340860a0420502b82c007d7481018c0b856058138144d93c456e606dda62b6a86d5f35818764707a7d0a5cd00229fc5efa400c2c1778fd40e1f60c4fd16c2b0afe4550c015dbcb9b9785c4f96b5d8544310984002eb68e1f5ec774a30424fc4b5eb469b2cfc73fad6c9f2c446206d1398050ae48b7b7ebf1a21ec9b4d379241359ca5536e7dda1956c451471144516477a83364b24526498b02777406fe65d69353a712e4be18406acc02f5714da70201e6e767ad95490aa31f356d58bf870022ec3ce71eb8c274eaeb1e46d4ea4b5d3025c8d0c08270b6c5ffac8e0a333aabbb)) <<< 16000) + 0xf14134ab5b153c35f760e4f5a01f68e5a692a6b7ad5d311b93b51f90239002fb8ce260aaf948e25417018d9c906bb48ecfbfee8339a6c6196c4a8c33ce492df349e319b575965407a42a94f784f6fdc8b66837e9b41d3923d9945b7313c1e6ab5b3c10a65dac48205844621cf056beb82c628fcbc579b593abb51d01a072434ce3c8052eba1beb86f2a86cd5015130aa83506a60e016dd71d3903395a98998a1b609ba7e42cfc819495915d25ea45bd89eba06b2a33eaf66c95393fc25f872ac2302a369623653a2ab913c87b79baaf780c760b4187ae08e1315efefa0ab07d7dee08a2f8394ee6484cee4057713c66fcc6743fb015ef11eb68abaed8e08dca61ac9e189cf5904725756abb7281dfcaea71dfb182ad2742cb0f8e31d50e3f93a248e050fa940bec24803ae7776590008402100001004000011100011220440a00082838497f19ceb0209654138af0a198ef66b04605c06996ef9600b983cc5e0128811004000043c8006ec10201902b0cc154660a83301f19829848148240a20a01e0180e80e8b31fb193a22ad63d852910eb4b7d61dc6090ac2f106884505b189b614278b0160226f1af82f84a49b7b738932393da6c7e0f8baa6f21a573244182b83563f98400757f98ebcb200d1fa37209f91561d325c2c91d046c7ac036c5fb7d80c4d500174caca3118a0bf49f8fdc04eb368e5e80e04d50e3e6b3841e566911a9b70c8eb0208b6f1a4f9c024ab8fcc34c0994f392f50abd51173afc49cbd6f500ccc06391beab45517ba03117970b21ad653d8b9f39e0cfd979e400e690641ec6b0e3c34f409f54867dc1405523220554b69a45df6b94a307af7a5a300554de5e3f18a59e7130dcfbf0d6f4995940f9cda91fe051358400a1dde7c7cc0a26f81047500a5002dd32e4b1596bd5ed846f38600f03beaeb1729d3e87221d69bf63c39a67c1a33273c30d4154829237148e522a4f7ee9a6c7724824d43de0af5b54f8adb284a44f594dbba05ee23ae4f919f5a49ba38e41193be15d48318e538c2066110098410b1c8274c380ced91e7b8c0218f83d6809030840200640b8020080228ac81af9022600647a7a3d0001d9543b04608420100000aa324c297282384c07874786c2c80e87b6d2811be38658cc7f2a2cf31d4a1abf30582b9431d35dac8536374bff800b17486fb9281c900480a406bf15bc59eb6e43e4ff7b51a28d16ff210aac046024a77da221bc6c011e5a278eeaffabfe38cf03881072a73db5a4796001cbf058b91567853479cc1f487325ecbf85452f989d9533fcc0f46e4a6e5bd41342f2bad14f3916079ba5cafeb32292534fa023fbaded53e9490cdd0c15ddabfbcbc25ff9fb68497f3d3f16e6f1ec299525898699cfa6de03b586dbf9713fa73eae79e05549019552d0ddeff1a6fc5da1f77e0969f2db741434fa186274a11adc1e96e2d74c1f24dd13cddcd6d574bbeb4a9ec61324b9000080120a002000918209e13000a38345fe2a88a46396f51dd0b974ff8fa41aa21acb9b24be9a4000000000000000008061001830806d6b65580354a005a1f0060aa1c58c31a00c008002670e146f671fc99ff7fb7370a9af4ab2d5d4feeaf7278a270644df6fd74f9b1a2138113db76cb63f52ed97a3651cbe27e8001af10012b020302b04e0d00202a4134f2e21f5951b2f45b5192308bf607ff5cb93c6751c14ae4c21a2d91a72c13cc74e2b820471a00b85464d2004be70a296c3875aba12c5d019615003bf930a07121c09acc5c454edac3a09ba8183b896c3e17cc98e2fa51808ac9c13240ab5a1c837394f97062b7f2a0075104114bae55940beec7671ab0567768c6f7a29020376776500272a4e946e11865b7ad1e2b7dbeaa8021652ca4218515396f9de4703e9cf3a1648320035bc4383384e2840082004858400100000e72000ba260411c8ce3144d6b21f232f4b22b258cfcc7b213507030034351f98cc6f8db341f77a627837f59720a8000439166099261eea0bf9a853ba4f5560441869040079024786a5824c6514d425360c3be81cb47050a51fd65c76978deff443d2de68201d90e8f137ce94c7f3a5cca8bdb5c9fb0f928f03e108d2687a000079a408c840483a0022fe209a8304c1dd064f336e3d3d8943b7b8b87205890849bd8c29782b40b9ee95af58241bd5a088583d2e23175e788555a861cbfacda1284c13537ae5f0fceabc86ae58c61be636c776719b22b128b457463b2f3e39415b47538f085806cbeee108672f0d75983c5e949eff7234fdf0beaa74b2c92cf9d15d6a1f8f1d533eb83646d2c17c8c8321a2fd596be38032193bbccb7ea35f04c2a170b0a0fb61e534ad5546cd53aed1de8b89926400e3ebd07c84fe3b0fc557bfa7c3053d483bfd33e62058d72609ee0e5677639be1db9aee04b1f6275a3154649c400004011c349203eda28a74ef8c79a028b834653001e00400004f1c33c08a39cbb647d53b43f140ea0369b4064f03127338036e1016d38916bd6e64e29f4fb99559250a58e345dc3c7b4b58b4e67fa0edb049befec3df7039ac8b84995418c8bdaf865d7fcc2a5b429022e1404749fe40046ebe0e210fe33448fdfc54f3f33aaafcb81e59d88ef8c56e1fe0bc8a7625081d04fcd5e138d73b3701730ba56d5329e0658b89be6c85fb835b3352d3a515f6ef7d150ed9cae74aa080d5c8c730a64a9a18dd001045a9ea2b65de961eaecba985848d119af9de780bcbda9c4b0827bae5ea43cee1f228460a8e940000688209613806008020000088c04004010000044400203480f04e842f7f060d9682f39)) <<< 16000) + 0x25bb28b250f8a2cb848291d97a0b026676d0f5653dc5968552e3d65f35275a4297c59ca1202948f6f351927bdd5b8c7988bf9434da0aa451043c1801c8f226e8c46107e6b19c179f68852d30d13a10de0069a3f0bddffe0abb9e74b2fc0c63d8fc25ad4bfed610defd784e18bb3cc04575f7a2be787568b08394e4380004262094430490d02406811c3408c1a0450d02202c10c140840a04101820008004fc48024f0900a6de3b013c112fd840d29a6cdd594a4b2f1b3d9817bf7e5f70000000000000000000100c69d9de1330062900000015b0008c40c3046005001000110000256449956213644d717506b6a5060bbdc3b6df1e06a793686402f2151b224b06de9ab7f4e2a837d6931427b948589558c328e8001b5100ad6a201dafe782e6f3a8cf628b560606e52470d4ad113208087d35f466843e1a10054911defeb39c8818078ac4d8b6ca7ff01012a1eee035f9bc428237529603b558295101b565a1604aaac40317122fef3b34e08e4be718d0ec1a16788cd7eb1b012a22b2a2973ff7796408501246965d81c0ec879b8e92102b41cc2964b3805c3ab023bdba016848640630640410000044fffbb96f26129ba4d725de2087939edb8fe4bfb3e25a31856fbd9fcd091be8d0032ea157d6d2c6ea3520b325ac88a637429b0e2528aaf3c448698b6d6b38a1125c28c8e382451081da0801e5f98e268004c3844010a10006fc178a88048827df463a2ae22433fb7fae6024b0a10b9c07a653f143096bac3b915d8010538b8f2af97b61c189930e9b072512005c310085e1710009c4103862078000224200070440fc5607c0ba10784efcb2489d2659f3c1c4c3ea75608a18917c3c1c3050efdb8622011c71d06e006614210084a5b7c964939ebe238e00000000000000000004a250848838810428218208248080e0500401a00025c4090274219019181a489c9b60df58e2122681190286256596350801acb352b01007dfdb87302007148a79a00338c1100424509eb7210a508005b8ce109131365737d8e20016e3600243001c5d82050415b2c9828104015da41602338a1180400f4540003124000c4c81e0480ec240400200060420742a000d152072720381100100a882257cdac712ce5f39f9f803b93b8b3c90c4d401421d7f0984684b78af9762d080a867f6bcfbbd688a0dd200a4af776f2fa1c23c17e55ecabb4338065070063d50ddaedb17e692cd9f393f83e2b19879f1e280821f1395428334c1727991083009afafc179ee00870a81c8d52d5554ab8eabc7848ef98941bed54d50cd3229a833169d1de30663c77ca19323c0c28fd71defa306851c18778c170c8e2562103764da50c90065785e27f2801100430a0f4070cac60c8a5be8138c1415be4fa20811103ca6342000158867e430066c4a96e4c004601000013a206e020360100014290251101208c0d446068230331181180c0c807c5047f2bf587100b3527471437207c9b5040f36e44e1c1c2bb4ee15146003f8a8235000261c220087100cab1e7d18401390016451223aacc8a20378d181b98c00d02f33010000f726ba4c00b0a1100234805caf9f3cb20c38885c124714e26ffa881e2a3a096f346064d869a4b1a41cfe28200007760dca0270822008690142a0a729239858f3ba040fe174148f163724e80b746001bd8ae4c0e01efcb677a93041100400004e4c0c4bc7e65b0e37f3c121ac50bcbca76be841066248dbc5807acf2b4a0c01e05b009e84c184401000013b3c54caa69fd06175ba672662c40b1120cec913a5890da414045ccbd1680001505824e4098408802000027840015a0815808001b54c0683e50774c60c0808a45c8810b942be430c211cf98ce03032562237c45000d59525ca0004c404601000014b32403250427d2c61c68ea35c30b0b8c069b071030d3b56a0c24169a37e000002e8c6629300118042c608160462840a183514f6c61644cbdfae8e20213fa86618490766272e3800269fdb605004fb1f774ce004601000016a20620ba1419aaca518e2070cb865014495ad142242871ed2db4807001465f0ca08008c95e503098208c02000027e64409b5f79be30628ba9824440e50d64bc80a1003ee0f9e1028df31c86a1802ee1bb5a8098308c020000282603438faa85c2841ec5e5f4c3091bcbd69e880911c75a0b0c1842aab488280010b97fc802610230080000a19020158088280c01405e0a00073d201c1a00110520403b02e0981684c0b027639868f2d84387127db86b1410daa8279e30027077f72832061100430832472ef82662f91adfacac3b96b481260eb0ff79efcf6aafbbf59e2a98144028a40c27e78f74afa6687c9d20070c80ed8e3d93cf4e9f9c45a2cf31728036bd1c35da55bae0080b52441f38900173ee0fe094820ed859af27fb192a238a438a76d2f1854a752a549284d58f93e3697e961f29811b84e1a49157f21a091741ab86d430ade53e0dd20430331d5f1000ca86def01003590e9cd3001080434917b868cc122e8d6ca34c615af23581c4084ce8e8f51c1003807d7ca0042010000102200049840ac14000c6a77eeed70b1b012a22b2a2973ff664698bb0121ae4c977333226ee28ee85cba7fc7d20e9b7ce5497757cb9200000000000000000826b37f76372053157ec433d100310af37818c41284ef6a84284043044822825010a2eda31e09702ffea07b540cb4755c2c45e86c349f55ba43a1ed7c950c4276e3584cda9be14259d9b3789ef527843c231ca8c3d5373b04c3b8cae8f8fc18af0388c4eef16fff0fb75112e43e800283902a1)) <<< 16000) + 0x58148ac0a05603e2b01e0180e80f495a5f24f38e8bbfa04a940189251ee62245b720f9c354a95c78995941521b6ca8e185136903c54883e5e755244f3812f854c2805c2a9900e5fc6567a83eb687bbce4041002142c273bb32c91201e5eb9c013f8c601572a1f11b30c02f4c4c0b4f2ddc2c8ea31a641dd1563cb788516f1393c87696fd5e04d9b1f1e20114d2c5087c17071472ffb6e114305740bfca38d16047f589218484ba358600b9ba9e030200a61d9f0acc0844010d1ce3555f9458ec5399e78207c5e0be1296010f92df102000685d8f7280108043472ea09d35963a2c354b1c81fede96acc4800d4728861c062f997264a0042010000102200043e4000dc4febddace6602caed067153c8a2c5627e3605b66e006003d1177b1f7e1508f7f8000000000000000004430230880282fe77b49125bf68b1e0fd1ce9a4eb3aec533bc40000000000000000104e5371b08fbc0b62afd8867a2006215e6f031882509ded50854a10910810c00eddd93a9d65783cc5c399f57f2fd3083066e0503310cbbc2d3c5955de13f4530f467dec8c77f24e64541b319ed2d62ef38e6fc6f36052692cd1031ae0a4c21894117fca8f389fad59269b9a475da807a621ba9b328e2faae95a06b92a740018f481386c098360301b80cb0a855e00a52b0fa3d96251c3c1665d940e10ad48b68b4b830977d402ea657ddf0f1ef4f22c0992edd0e07c01913e7d272460032631cac6bca72baf34c3a037b13972db27014513c7b38500600e94853cf36e6f2999a370767285deaf14a38b41c800031830116cfdfdd778bbb3d6a28c807e0d43a0c5b470ab36abe7308f745420ad9fa969ed05df02630552044cbff4796bdd00cc2186a08d5a4b03280a7148cc0b458bfc5c8c621be2ff3d4164d0343233226a5bec8dab0364a59c70f4f91a41181bb2e643e6fe09877209443aa3d2f0548fa3ba094054cc862398b392738f87e50080f2074a37dd83e102e205941a42420891a0000243101011007868005900812988090c604623e2384b256f5180301b4e7eb04c67a143e69f08487a308473ff859c89d96d9a088b65cdaf4ef0310cfb138e030a50f44ab2f51a0a07c34649489725d2066d09018305eb44c7ad4d34582181b043a2d6786487951419cb24a10155989c1f81b5bdb7f3b67dc6293c4008169580f3bc8105e942968513de3300fcb01b369014c8011521c8f409430800210040100450e897b4b19430c94830e60155f3edc93041e00400005019191d7fb5bc9140073b654b023073176c8007486696c24082000800006a90001cd20440200030020421bc17538b2eb8601d696a87000110e100040000218d051b820f5edc4d4dd21414705f37676a988a96289e7c47431bcc7ae199484ce70802d8b6b9afb1d323cd90c0bfeebd74b5af6c91ec28d834c3e310fb533085c3068065ef139fe245760ba2cbe3cc5c5e9d05b364a9f8b52947aa558f5ff3897d4ca1e221d6c9b94269718a3bc40ed6153a431ea2b11db676f92b5feb25bb1c52c0a02730bda319227b4698485851cd670b36d80679293ab32dc07109e5fa441f86e800051320404a01f1580f00c07407008010044091977dc4a5001da5a71a00010f9079811841000400002a4f105c524e9c70f3dc426fc90147fa0cc808c30800200001546430ee880a886570a58d205353580ba10c1eab378cc9e69c7c2271f87d9d7eeb2c204a38ee69ee696755b31bbc19b876bcc970337e3e4608ba9c775d904b792b1828468db59f364f26dd7b2b7dbcadd7f60ec6897aee6545ae243dc609303ec6020c68370ee9d94275938a3f28d45dbe2760faf6160542afab4470e333ee5a0dcabb55fe02ce12d89dffeabfae567426a5f7f3a565e50c42ecef1887a1aa00013c0d03a15ec18900ca8e3c7e0044283c01000007f302689a1a9cc0129e1d8b040e9e72e980023181e008000055101809f100eafc7ba20dcdf9035a6993beb55a1b363b81d6397d05166674a1fe960c064b1e82345246ada3704624f180236b6c5dc84dccc47832afd032895ad44000b02ae9ba0ca53385704dc65c9b7fa42b8cdaefd31177e9ae9037c138c3014eaaae6cf24a9e6165128f571b74530c1854961bdb3cb82c96086d76bc000c21ea8d1612171148f005adee7b283fe46d988676f38284ae782230288b7718864dc2fab80b4dbce14b455fce886a26b0d0f0b0b3f3c839d0638a228284ffac30625c237301800fd255b9008c408402123078654738b1131a80f3c289044df68614145c4b7f09c07af0d8ed402510210080000851b200d7ed898b12116ec23c510e536cd50904bbc5993e400200085882440f5611448cf528571208cba94ffc604101ae37a48013946e119400840200002044070140360a01a0500802800090880c8c8001118800506180a008020060170121e8e7b8103babb85485000fb4a51004c407c011011f3b54f0081ed89ddc134036a098bb008c40800200001586410fd4607960513875a22001d0084000040100000446870cf29c0100b7407298d034aff6031800e804005c0400016240582402a12014090000dd900034520263a012050001e090111100808803c44002cd84038640046664011adc802ff39a1a914eefb18506151fe788c2020756687d810024fc0006e86001ca286f60200746c5b4d600804c484a010a2c2a73eb4421840028dcdc322826bb8ebec301000016e3600080139116a4855642427008000092900d150060a802c54014220090900402801c0400c02000340200a4a004210018e80087400202000010039fb9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case12" = "QuadHeightCover12Case12" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case12 private def zz2372:"s0944"="s0944":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case13 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l13 l14 l15 l16 l17 l20 l22 l23 l25 l27 l28 l29 l30 l33 l35 l37 l41 l42 l43 l44 l45 l46 l51 l58 l59 l62 l63 l64 l65) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x727cffa6e, -0x59514ba00, -0x860563578,0x1e387240c], ![-0x59514ba00, -0x2d441405d2,0x508706874,0x5c99b4226], ![-0x860563578,0x508706874, -0x2452531800,0x597f12600], ![0x1e387240c,0x5c99b4226,0x597f12600, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x190c2ec8,l14),(0x50b99b9b4,l13),(-0x7c4ac0a8,l12),(0xad18366a,l17),(0x3dc486fe,l16),(0x7453df244,l15),(-0x70252fb36,l20),(-0x59c928e,l23),(-0xd411362,l22),(-0x2cb417800,l27),(0x6cf6f56a,l28),(0x2cb417800,l29),(0xc579e6e0,l25),(0x18a0522e0,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x1da696b70,l43),(0x85f736f1,l42),(-0x77ddbc37e,l41),(-0xcc123f64,l46),(-0x104a02808,l45),(0x138ab3f48,l44),(0x2cb417800,l51),(0xbc36a0,l59),(0x371fdbfd0,l58),(0x6fe94cd,l63),(-0xcf94fb76,l62),(-0xa61ef478,l65),(-0x28cea9c4,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x70252fb36,l20),(0x50b99b9b4,l13),(0x371fdbfd0,l58),(-0x77ddbc37e,l41),(-0x1da696b70,l43),(0x7453df244,l15),(0x18a0522e0,l30),(-0xa61ef478,l65),(-0xcf94fb76,l62),(-0xcc123f64,l46),(0xc579e6e0,l25),(0xad18366a,l17),(0x6cf6f56a,l28),(-0x104a02808,l45),(0x138ab3f48,l44),(0x85f736f1,l42),(-0x28cea9c4,l64),(0x3dc486fe,l16),(-0x7c4ac0a8,l12),(-0x190c2ec8,l14),(0x6fe94cd,l63),(-0x59c928e,l23),(-0xd411362,l22),(0xbc36a0,l59)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x1504c14054801800000005850330040000000042071004003c0841400f10040000004414018601801d0340840784010000000001203100400000841400f0c040000170e8301c801000000000b8052008000b8390500d2006000016130a02d002000000000680c4010000005221036300c0000002a220798040000000031024802000000001080c401000000000190320040000000064029004000020c120248c0400488a6110054802000000000840b200800e61c84202120080000010864088c030000000090e06600800000000940e200800000190881b18060000000064030803000210cc2201a801800000000b02f200c01262c870044a008000000170e02cc02000000001401e4018000000009027200c000000002203100412320408808f9005000000003604a401800000001901d200c00e63104202ca0080000001505028c0200000a85028148010000004219026300c0000001a120518040000094110208c0400000104420186018000000281409300800000000120490040000018844030c03a20508220031a8030013423048032401000a813828036a009420a404200335006000009a090062602001582405809d401000a41502401ea008004d0841200c9004002e0500e00ba8020000000026009200c0000000004819002000000110b018c02000000000700a4010000000442406300800000000e00490060000000012014802,0x131206600800000064280b300801824302a0152008000003799c058c0300000164a20446018000000b4a40a300800000005ca819802000621c86405100300628841d01de802000000a249036300c000000005a0310040000002d0a038c02000016870501c8010000000a4940f30082223843c012a200a00000208e40d0c03000220e83606a8018000004219036300c1de3044401a4200a000000003002c803000000fc6a02860183cc62888034840140000001c12049804000001d8c4050c03000000000681240100110350740c84010000000140c0798040000000f07028c02000000050380a6010000000000703200400002084204b98080000084150318c040000004414066601800000000140920080000000046031004000000011402880300000000aa026401800000000a407200800000002a0059006000000015c02c803000160841605e801800000000110320040000001a0c071804000000002201480200000000ca026401800000000c40720080000000320059006000000019c02c8030000000e8681460100000000485033004000000423a0518040073188310165004000000000280c4010000009209022300c00000004c1819802000310c8440350030000150c8301c801000000000a8052008000a8310500d2006000029190b039002000000068381460100000000064092008000002a098151806000000001a014802,0xd410802c6020000680410026301400000340880718060000002505028c02000001248204c6018000000078d033004148204238048200a000001c8c4050c03000000ec660286018000007a35014300c00000290c80a18060000001e0b014c02000208f42c0248018000007231034300c0000308aa041180800000841100a0c04000000c45604460180000210440a83010000000322c0498040000000015024802000000001780c401000000005d00a200c0000489020151808000002e954098c0300000164a202c60180000811c402a3010000000241e029804000000290b028c02000000108301c60100210610540e6401000000003b80590060000000025018802000000171500e601000000be57016300c00000492081118060000002521028c02000000013220660080294320a80ef401000000390d01718060000001107028c020000088503814801000000074380b30081c420c1101d6200a007210c1202d9004000000001681c401000000000030320041101041781a4200a000000c844050c03000000c42405c6018000005221022300c00000002c48198020000000223c0cc010898e70d00114802800118761a00d400c00000411c80a180600000218ec050c030888eb0c800948028000008a3d014300c010e3886801520080004b2088c0a9003000000088700c60100000988444054008000984211815200600039118280ed003,0x6406200819a2182f011b200a00000000290248020000000002a06400821033841009040140000003e2203180400000001b404c8030000000110606600800000000d4072008000000036005900600000001bc02c8030000000016812401000000000170320040000000009819002000000002601480200000084320286018000000000d0320041421a0208134200a00001442102e0c040028868108168802000004e044016301000000220480718060000120110058c040001284c12016801800000001e009200c000000120c02980400000d42501b0c0400000621080d8602000030841024c301400000150780a1806000000882c050c03000006a108104602001845b13006c4010000001904812180600000941d0318c04003b04a0e819880203c82282d018c4014000000004e0310040000000134028803000000007a01440180000000074062008000000003e0310040000000084030803000000001580c401000000005500a200c00000002e0059006000000017c02c803000000001481c40100000000014072008000000003a071004000001609c04cc03000000b04202660180000521200133010000000002c029004000000161201cc0200000000580124018000000036009200c0000003212039804000001b84402cc03], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((0x1838016e3600287a10e0d0e84845036b8fe490538413f3f020801a6945e000f421b13284118043070d9bc12a70143d326efccb2891d16c6e20dea4849825a810042417695b0c0370e00d3cbd106402005b880adb760800ccd05cc7c1c8808290200000e9904b0d87d02e8a50ab6791a042f7a3f8512009977edc54be4059030cc4ba80f956fdb2bc610110b3df00b630f4bcfa1c212035e5f724f68c87c104570c48148c47058bb8204ec8ea1445daa10a571a05a4b5c6a1947ada15c1d69289be260211c261a456408c2c4a234a891a882862f7980141c21250fd0884100b1617482508210080000831c1e5ddb8b632472d96455f46042550794f1c04f927f6903007b366e890800e9261c34098308802000027643e436000ada43e0561ee230460dd045e2a4f66d7e38485eb1af7904382098067be9b62021647d67235620035973f4b2800801d4d09707100015ace773222000010dee66b301236ab24f96e1541c90b009000043443b0a61ec2b0a01586a8ac3503604c130f501e13208fc0272b7b4cb2401b48d0e0f9000a2ccdba2e9db23043831764b0fc4dedd66041b46b80a4eb368b0866c21a9221fb8100800746a528800030012a054b02498b47a1202010dc15184c481c04382c9207c0317a7064acd7ccf8e0877b5194192007678772625042300800008710f40987902c3c4161e00bc267982435a9648016e328814529b7947f87040268d480cb08ee36af8d101000f424002c10afeacdb66000cdb41df805a0508c021c4809970a12613ffca23a1964aca68bf96704280d2f269612fb6a28ba18222be6f339200e71b7f1402ce284401000016d2000656412c661a41b8b95115d00000000b1925d0c4c31d4440800687e000009071a6268e41523893092c91451023002e0a8e387036a649b0adcd08c786fb5add192aea145fd1aee959cd8d821e860bc4c29f119c68a24bcf61f8aae0c6d8d81d68a71a7d39131e7d4288f0db3fefe466f143bf54a3f9619cd1b359a84d8b607c41a199172f58a2c6ca718379562513c620686c6612624b0b73178b40a513dbf867e0526f5fc74b4eab2c620cde6951d42d4d39d265643afd92a70bd3e12025ebe1d4b77033f706905cdb95a67b920e3011fcf7505492445c263f3d6f01b7f0a07f8bfb10c5ef7c105625c29e4ebf6752dab867d81c6c80bfad82e178f0c5e791ac7811d67162c8fe7a54bda90e825293636f83617e093f59587d1b5900cbb8a3e4ff23b1490b4190559734dc2ce1b737de0e3c85c4c9d8df9f8ce8ad5a03e54778113d0df55066b5e93dc5ab503968940d21d29399237bd4b9dfea309ac62c00044110f40d87984c3c8261e2130f005f12c0e5aea876613b17d4325be204a000e14e7e70228a806351e582e5d451fca2402003f937080100de10d2ff6e008e438e140103898c9cfa0f0b247f22f9ab34107ab2bb54b04a5dc65632405923ff0f001194708802000022a4000b4480071290ef218770ec0d85743875595ccb10a9e4b98dce12391787d9f5ec1069a8f32d182017b3a5f4b4d5f7100b7c0c0883bf75643105ee203898020d51617e53a9a66841fca60c0002752402c9e01cd1595b8400b2bf7722689f489fc213800184619977196d81e089b702fd29c474af6d3942a06028a0a9fd4d514a8c2ff9e34564d977c9a14b27e778284037b2328778dc6181f2c21c6aa75210a508d9c31c2218c2bde36c231a128082e308370620254f879c00008d347c39779ae0880235f4d514182f9514e16504758aa662448098691aaadd3819441239dda8a208116974c30e1190a8145e40073313c890000329211004000046480020990ed29076008001ebc87592e851666455355fc33dd0e2c850f540842ac9fb8510061d0d19da874dca5043452095a17) <<< 16000) + 0xf9849e2408bc15e9e813f9b800c0170f91d0ab1554bfc0405370e1797bc2e3652283255b7ba38589452040c51e9a61b56c691ade1f1c98f1041f00005da4098b400416c64457f16cc77c53fe0cb8904cdd4caacd1a7b701e8308da8891f701935ffbf6057cee4c98041cd6d368c405333f8a0d6bcd483b3688839655600d54830541860900e334dfb9ffd83a4d90d09181a0b6885280d3180d5675cb505497590bda17525b538b2fbbc6d15a001fef3b6e9389fe8266ad594423e2f9d9851e8200b2d03a947e917d1639cda133b95e717725c441c20e41024709157ffd11464f97297ba5394c26c791ca131a6f1b00bcc2ce19300e02f142024a2755f79d807ce3558419f11fd74afcb5025653ad3fc6404969fe320230950a14814508104200000a784a709e1597a3e3e203a04dd1157182142d6570c64a7483589de50fac9995f4aa0096fba5dcb4454ef72e54a2f09cb42ca5de174229e74c204c76d74ee2991ce30902a535e8215b257f88dd6672e61ba098b6e98a102ff2519c5c77a0753d08f46e0af0c017f0c051b1491bcd8addef18220f1311eade732e0a007c52ab923f25368a71032879390678aa88007bd549e6edfc26821317c54d66deee63400178816c440c559915a26e1ea0c65260ed912f24c973dc924488aeadef0af87d5de484602698172a98b6c07c109daf1ca511033000051521d43a00088921d262092218740a839c240ce12000e3620961bf1c392064302b1abbaca8a5cffe5f297537048a114ca01f943483eb7dcd1fdf3aa53455a166bcd3f87246187a67bc534553a662010e10a10810408e002002280f08a229bbb74d18287e2383dbc6e30597c4b868330dd7c297fd973c88696cc22f1d490bd06afd5ed719bd63718dbc254c4be9e6d31a2feb179b8891170ae8f745827324b15c68781fde9b8fcbe78d8f28e022db03aa687ec0c84c7fffea0e5cfdd078ecdb99acc0077aa904c2e4fc36836f67a9550ed3328002de981a68ba3d8cda060481e1248c94018268e2290f100180159c39b86e00a04f95dfafbd7c401415f6c07f30aa0a2218b32b920850404cb4850b05c2e7f4110ccc399c1950b40a000045e4399261ca9304b3587206c38c141c402e1516bacafff983051392942fd470a108ed9387c4044025c69d5406bd900323718bcf97e380c123fe025da8a00bf908cc239caa0a28ba3dc8473df40a426008c6e5de6dd00b80b12405972e1e1287c5d8213d250dff64b10f4918c4cd18158c20007a12002424e7b6f63820d8508c0118545adc1edabfc1439ec432e8a308943407a5f3663648c2927fec035d30140cad2f85fc9671800a8bce481d390a0006a3f1d012d0202cd805334a5728138840a1801c000085c83a86c24c17320128ce7d4d5f01af77d4673ea6af80d7bbdfa6b77e81d050e674bf67814abece851b884459248a28838028089029fa8e21743a876a0c77c0b038a63d3bf2142f974001a89e97724eef7b2fd22ec0f219642b6deb90309f4a6d6c9d724ecb670f649d29de737efa2bf89920275aba8a7e1606349c2eb2cad51a077574e5520a821680020910b0218570ae04a116d510a01c40c19e3393e1021bd778fa9a28110f83a46221c17811a469f22807df49945061c02df092bfb618008582b6d2e540440b2dc4b9b5b10585002800020220765b0390d81c02ec95b230d281848c2e3eb4d4f871029e00b4048a229e4e944d0182393632bf361826976607c10903d6dd2399710031281f7d3808024f2d6f27c826a4509c0514673ea6af80d7bbea339f5357c06bddefd35bbf40e828733a5fb3c0a55f67428dc4211862852451c4144101140312bdc58cd727397c7a431ac64743311ffbdabf3353aad7df958e927f20ae517340227146311280014f10e1190700cc37c661242a0de1186e8683701412003fd77025c6067c4677ecc5453103a593befdba4eefe081a089084250c30a3845004801808a021c1bd71ca1b1a01ba045dd924e58b953497436eb2f4adc4c5d7074f398384a6dfb037fbae2b6f525439fdca1530fb356db588b2476aa61d7791f6eb145410d66402519cfa9abe035eefa8ce7d4d5f01af77bf4d6efd03a0a1cce97ecf02957d9d0a371088c28a1881461460103bfa9fce636c5a7bc743da34aed44c7f9497cd046ca0726fb78fb6d8c1dda08181a2d1691d79d2167a08e5a40efa4cc5c5ff11331bde14f889728b3a37ec804d22338eb8b30f7065ebda72d837b8c6ebb474a515044d00041a20dc53fd77025c6067c4677ecc5453103a593befdba4eefe081a089084250c40a30a3843825004801802a60500401b075a0d2975853cc1bcc7d63e35e774fc0e9fa963d1da351b98800000000000000000444289d60692657e18ae93c9303753abfeb70a1d41d64f6fda5800000000000000001094673ea6af80d7bbea339f5357c06bddefd35bbf40e828733a5fb3c0a55f67428dc4232c82c62862051850e3c9ffcb3b246f1b731276b29589269c8c6348baf2aa3bb9b65664f521d63aabb7528f303e5b1ce19f505401bcbcebbe0d9ac3be94f3ecdb29fec1d34ddf8497d400d3ae9542ab0f383128685dca10cf5805f53542650e3ee38452817f5ecf5eeebecd24ced4f50d86508030cabbf5d0f0d829b269f8e0eb9575e418a70f063742a2ac0a0d0007a921b6320ca1506d06c1b0340d21a067050004d090d9190008a090016b620042484361161ae5b0d625febb812e3033e233bf662a29881d2c9df7edd2777f040d04484212061c42031c320220118008010c08008034354161a80302601d1)) <<< 16000) + 0x0c5f3bfe229440724754be50a376f3559038aa69a702f074b49112fce5d022d781048644d3cb1b4d3d0b203845df231ea592f82081957cd0dfeb7e80000b3f66b71c384807a1202030e41500b20b05801e962da04422030a6df506018964292f6dc54cc1d2f38a36ca60c28c8f84c92c6a9e75a5020a18c8069224027082500869626967ea5630a8c2b30c4318485824741a4b200a695664a60f3175afc2a2c66392fe5149200a27890b00500140c3d97c34041280400006b4e1514aa9f8763074e91267f6963a0a865edf8c189d901e82658c964f5fae6143093635db0100912c1b3b9827082500861554054c2ea77a10c242ba4fc8f119cf10401d9947f887e40307b24dd676d710ac58e140cd38fcbd8b0b19a2c01657be1b0100893c0445bf613c24017ab6c1e792d2e3800024f7404b15a46568c2420dc14000052440010a4c950f827bced90aa964f7432d4497585c53788cba3b1d30f000000000000000002089441439429221411600e02e057f1206baa501f167208b0bff27fd7ca1b00d62d048ceebe29d35688dd9fada842d5b07109d1fa8001541000a4b204c2a000d0721a63b0d21d86488c344074405f7cb3d1b923e2479e967a92216756bbf9b1026220de9a3d921b38f41b7598a1165b229f5b0e01321290cf40600003c14dc00202c0827f29158142801406782c3380619603b27547b1f130a232dac368d0a156dbffb5ec915b5aed16f0a11fa402b028912f7963d350000325f81630027102400806682c33007c666e070b4e142486969baae79d5503a1a46d9d60c925769261050bf07fa5dbcb183d18291bceb5e0c48c058bcddca28c08a195be76c462f104180000709915ea500699308083604c71886407107050d2f6b7574dfff92480717a58f8c348c1290c45cea6106e036df7b64d1c58afbe1c2d983c1502ecd6b72801d39fc4de02391010560400001e321a013e305328d3c66d86c34bffcd15412281f0d236e8dab1a03ad93082e8d3c9a720498c1e73fd0a0b182062460b3666c1483444300000e1322bd4a0040297af7e115a6080d32610186c098e30c353b93a98d2eca550a71d09240a18349d38d22aa2d9a16f4c20857bf733e8d1c1f9b3e5324c1db2a0b13cf4a0062019c4fbc1a4061400a00007288002169b25cc9180a77a164086c8ad6a142c6abbb6d13cf050b407f98252d0304687a86d73a18000a5c7a983820014a0a38ad923000d42a141bfd10c978f17d611510285604000021420015a0432c5400194643248723f4f69b9b1202461496cd9c95a4895e2b3a7594c81364ef3fac3c101b60d481d3601425791da9cf4038072dd7e20380100d7db012ad8020420c3bebc2fc8102b02006780c3380619603b2588a5ca9d4510f700e16852870039610a1142a50ce61a409143f6bcbc744894629f8c230000393badf0013861280403340619803c2a79a31610260ecfabb348f2c7807cc69fc96309f1365a8c81483cf06026408159bfa191303177999b8a013861280434b01453191f78fea1854a40d051f2efc40c2495be9994daf042410067987be5db9e03077aee638a39ac97963918843945eb0870b196e68138cc657a040a14eafa4260fc5024014c62ac6cae1000305dd44861c82c0000aa0d927a5da0ffebcb239b250e40fa962df228d741f92858d0110687d038805a97f2eb14b08055c9f462010081f935f0310200231d77b5990883dab25e11eb0e040ac08000042440019b88658880021188650c81b0340015b84324440034284320c418e4a0c61106286831034186020c2010014ea10c15186028c2fd1617c630392185e90f087ba978c01a0511b41507ae221001e6b6c1457a1c05e581079456280efa1d42cebc2001f3a4d06bd02a0228a000bb7f205681bc9c440c89d1e78a8896ac80607e46b4895c8cc856040e2c0d5b0a6e596162dada72c1e3c67e3104c20840101780bda55f54376f92f8dd87c8da539a8f43486c8b816010d771d2a8000000000000000002218e7c38e918816611e1e384da05a8ce7d4d5f01af77d4673ea6af80d7bbdfa6b77e81d050e674bf67814abece851b88484925827001800807b013122c0767619f8cff8dce41c6660861f32a87f40c57e4a278aa9ee094fa119acd54aadfb1021745f5474da5267fd45b2f3ae578047b006bfbbfeed433f8e3a0009be42ec4700c01004492304ef513a15994d2d9f8113c4216ebce454b262d6b0a2a9e18eab8dc11db6fc39fdc8688905d1f96ae2c31285cb954d5a6f8429992b42578ab0db0a3b06b7895801c31bc6f0d96d6a1e162f0f08f13e12ae9d338605ad8dc5d1cc693ebfc0263c3857106d9abcfe68ca0a083c926e966f14ec58edaddd7697d5944df607b8130ae454b7f761b93a868887f0f421d1936bc5a4ecb48cf82d5f723ba46551abec21f20f6b29cd5aad0572073ec6e980929bf94397c6d9656cc9b905bc123c7cb668a9e1e4d1b20f361d62d94eba6e30d494ac00034c102f050003751e280b2e089c8f14e483e7295f0f73ff59804d04a4b4e8c79e58168f929101a3fc1000685437dbef93c080310952a7894c52a05d92c9f46cdf255eb966183605400010090ba1d85c88c2e04616e230b60d85904eadd25905f197431559514b9ffc2aae742c091243be50cff59a8db137772a2435332c70216d2afaa1bb7c97c6ec3e46d29cd47a1a43645c0b0086bb8e954000000000000000001126402519cfa9abe035eefa8ce7d4d5f01af77bf4d6efd03a0a1cce97ecf02957d9d0a371094908a005002000034d3ffa7aed9d1cb8547a17)) <<< 16000) + 0x6131bf649eb9860a94d16e8eecf2f168e2ad0a77c78586dae43519a94d8e6159ae9fe046767c27083b5a847679a5ee5fe5a1e7cccbc70956389cceb2815706bab537d5426ec6c5f87171805cc188976543be57fbb413af4783e20ed0b09602802008826ca5943d604109556673838006d586a14008c508c02000016e40bc2400021242d456168230b30dd53a5eb1eaf61b115a4bad477d67d6e4ecb4908f11aa626e4c7d00000000000000000011841301de47740b519cfa9abe035eefa8ce7d4d5f01af77bf4d6efd03a0a1cce97ecf02957d9d0a37108c908408204c0050030000b92c2ee5b2fb7ed90a3a446e9677716aa3c274c3c0292ae2b3f9a5d4dd9502ee2f7a51c5881c92102e66c6b46f6de50eafc9bb77569e630aa4ec28c4071978c91132ac59ffadb532f20fe0b169b22f40014e48591280036d085898c2c0b615e5b0ae1d8568ec2b0272e52a6bb0805288e76509d23771ad430cc9c47a57732da7a3b10ed196368580000000000000000085320118819208809601000974d5ae989d20625a8801b93ee699f63fd252ea20ec46890a312fca5e551e515b37df985d0aa9f668986a7ca951a5f76d4c89213dfd23a6a19de669acc32381ea31624a58144c6e8ebc2896d150ec514350f8049f920027a966d4109050840212302c16bab658a10c5fdce8c2d3f6342c228245cf141d0120611004029817629ee1964f46173865c0ba282767a7a07240016f814d0a006f222b800251021008000085100021920006264274661382309b09febb812e3033e233bf662a29881d2c9df7edd2777f040d0448427284c69bc6c02f30b3864c0380b31c42822021c22c01800000352d5b40e642510714573a19d940d7715f8bc414043c523fc8f5a41f6aa45202fac59dab2dcf51bc35bc498ba322cc93628ce2ba80019c190c886c323a7b43c90526fa20b2e6ba070543ac4c585e80cc027011fa4d5b6e4b013dc4c727b18c8800b515d19f04ec0100afc3fc70ecb2c00004a0a68afb53c0893884e586809800023c206c63075198558cc2a8461261ba0cd864f50cd14a557707a7e8e50123becd849e22036e5fdade113b185c1dfb00bcd7130a1c97b8a2c0ceb9a0124f23dbef1e9a76e92d88944950b7e120139fc78a035975769503e68ccb7afcefc11710800346a6f15a81e5fa43e6611eb5efb9abac2f3400df018140fbd5a93f6103648a34a5c6b400a12025ef7890d981a9f5d07c23dd990ca4c7e849105978cd6313c715788dcf3a44ff83c948254751233bb57e208141998c4c28b7a5bf032402a9577702504074011230b016d40e2d574c310c057bb14b820691344084810380100a901c020040110022f38e185817abe6f708820740200000f040002d48000d510a81585384f0919c04c00705c626a549a0467ec6250406039d218012080f80402981721836ff80b183ebb9d88811040f80430876d33c2b2c200790c58960090981dbc102665d42061204108040000360d8b05ef759143973ec279004e5f545808c30740200001444294460004804290040006b240018bc84e8ec270561462309b0d85106f8a0a829c02869412028fce0c0639e323a69c00f27d272f2400a37c353c00204a48460100a105e8520d6fedc3825bd7d7af2ffd1be8a49c0597f47504b07550cf64a52e9ca3bbf7407dffa0942d04ddbcafc861c0789a9c59295e4a16a1090002c9701939eb25040650bea3613fb3da16c6c052fe5644eb6bcbbb0271f0de4ab98dd265fc3aa5e0b3f6b8383d05828307db7302f8bec0020bc365ff0814cd95c6ae308664c036637790f1b6adb9c52f9213e8059f60fdf48f3c382b29e4c090e9ba01d5b6b1ca90dbdf22ff0319036c3517f1da22f1f711a94ee3329a95f168ed55ab19bf08e220481da5cfb61d64bd4cda96542c577556427d13e22ee9b3a47e225b264460af5f6371d5989c6de26c3e39c5ab964e3bd4cbef7c9a66da75918f8249f6998f2a10d02f7cfda26ac423912b3bb0d83d9b811e8430fe30c17d2924f027df582a808deee402c7ae3a05db46dcd80d839d31b72a52f4df9dd7116dc5dca9ebeba57d357ee50c6f028a545c1ed4c4ecc1a99c64bbf1e3f2a0002a53f9ae27f806cf2dc735faea10aeb5ad42657c96edc9f8d77e0ee9a39f36dd8946d7c4cc48cde119e7be336a7c637569448ae038602e4ac8b9a93350de59bb3a47da372385ae3e4706e4ddd6153fe1723f9babd2e16fd4b5812252df3002f9de73000406a61699496ae4cfcf4b0db044433a6d9880a0080234755132f7b3469b346b853062ec5fe1f340522bdb9b0024142000800006d90001183e2a9c07f89305b35cbb7c2002062322410098e0f80200002bcfebb812e3033e233bf662a29881d2c9df7edd2777f040d044842486085e478b12681cd165452e7ff517c124b6095ca131a6f1b00b990091b8aab793140b52c4284243280041a590e5a5a4afcd6b5a4a627c588eaa38d89292a06a3e57f95bbc21d9400ca10f4304457d686165deb7388a5197df7b678a1b480c187775e7580bee163ee4261e508434f1a00089c4003754800a7010992905010c25804002cda6ca01da06d9bdc50db10b3446ee282f4db5a0ddd420453274fa7493801f130c92f90b00ed412966a520040ae75042a80797c0df8b4a0cde47364c24a31c70a80a18326c3ea8f258633dd67038e1cb893953050042b2311d8048204401009f0584f00f45603b8ad6102f4edd11a451313c61d9c4040bc1c1661413353a2091c072a0cdf64066102100870c476d284e9233d895eaa230b034450)) <<< 16000) + 0xc9921855d5246230011356f6681286110043f5dc0971819f119dfb31514c40e964efbf6e93bbf82068224214c804470c6085865064865825801481760cefde0b4afc2811bc0e49c201eb1f1fc386fa2876413740240462d2e28927db50d100cf8e195246d000296200077c7473f8d03d5491801f5a18d304bd5ab095890801c41fe21c11d974c0810012048689924014fa973ec049c50880200002da4001a608003df109d1984e0cc26c37c40e8d71741fb15b47066705ca8204a5e18b0c0b4c0d2780c0610e1a62bc1d217bc6fc183b1bf91b85c4ea28484962c36f0622616cc02957cdb2eb3fc57003ed761400f24602c2d1570e20760d8d1c0811ce56304364bd6a6071200d187ef283086fee3b40903088021a40555aba0a68e099b536618217ec83c4e3890a1827781418dea8798e5002759b21f12000c1d57e404e184401000016920004c6426807faee04b8c0cf88cefd98a8a62074b277dfb749ddfc103411210b30b3864c0380b22c62c52821422011c120003efdfe74b85f35463042ab3bc59c5079729c3e9bd27ebc60a1e5d51d12696f1179e7ccfb050797e03cf694b8c5c1334000b6c84c8c82604412e020960100042510952501992c25034002582424ca4006a3e4248b60643a00429d20768b0390d81c02e8a4436273c469d1cfa859e56e4ca5b73fa162a76886a667698b89e67654bfd2ed4326c4686cfc6de0350e36aaf814088a40b7c8c74f237f0533613f5983a8c1a174bbee5c01a1988c76a929dfc6898efb4e8c15cc2c6b91c2039277010169101557091b8da07e2bc3ff45e34a222d1b267415ffb79d592fdb9fdfc4cf59ca8671a999f8f787c91c0b5a8022001d464947661734e71ec4643c729157d6a64f21acda62becd815581c7190b1b9ed85d3588deebebe7efd72766bf0080bb301994d65130afeca6e452a1f8faba55ce3ca756b47424cb3e7a4cfba61763fc445c7523f07c03c9cc2e8090f69718db20cbaeaf9227ae16cdb5ed6bd8786882124bf8a113ec35b4b1c6b89f79f8d07c3a852976a010d44a1c512ccea69ccb8ded308b36778117ae37206825e7b76ce6edfdbbe777b5ffd9272adc40eefe7d7c98c0d55994501220209001d1717036c7c405845127492c017f968f89000241ed8f0701084cbb8c012881080428a98926cd7a5bcef3e25b43025afc536be717dc4c8729e1cc6cfcf8efcf54237df5a5659e8130e8766f10113618882485d08ad24dec9be242f9e258b17b68a6ba57a6331fa07472aa372a519d198d670bf3b2d3a683561f6f75fcb28a462faba8c5f1e52617feb72ea7880b3d0705e994517e8dfb709b98764c8665bb22a8c082f84c8adb644e25a6a36cc4685bc38d5eb093e7516ee55973afc24fb088ae9528bd6eb26430abf50a008ba9dce838600ed808c9ea3d5c0903dc9dbccd4ffd58aa5664b5655050dd2b76f17b7af2fc3394ac45532ffaf1380ebacdfd1e4efb9816a3a6b7dfcb94e446b1e5d67332d0d4d5423c503bbc74904519250000fb240743411e130830903f00ff5dc0971819f119dfb31514c40e964efbf6e93bbf82068224210a9d7334e1c8605dc24bad477d67d6e4ecac0d5b552367af35a60000000000000000008a6981be22e899ab52a5bdb1d1c24b9cb6d9d00112c2ea1ac40e0000000000000000021a22df2b2029816851470458440470200619c83fe7e4ff60ec59438e2f02bba4debe5c37fd834dbde22fcb20d4fa55f6b9ff00c15d8b003aee62e1a4ab45ca09e25ac097cb4e9a6a0febf01ebcee9621cf2adcb80fe84a7c7d66368a743c64f82db197a7b3bb4bcc79ead6934b50819529d6f37eef772a451dfc28cdab2b7f5dc0971819f119dfb31514c40e964efbf6e93bbf820682242157232b0c5ae01661001f88feba57e5a812b29d69fe32024b4ff1901184a858410248038000d20d32adaa20e4196438fb205d52e1697b37f9dbf39b896096cb6fdf403e25b76086a90a29cb26288a213aa93e22a23da6ff4bcdc3322bed67bcae58c5bdae49b9db6ef4099abf085f3f25ed0cda5ed8f4a9999a798bc50633aba54ea3e9188320e73500050e211c3208d09000621908c2984592c228761122b0881584388c218460e01b08509c080040101080b0830504102c204161000207f0183f00f8ea76a6c1e340d9ac0b3e9402bac608c090009988c7c4002a4facd400112524210087900a8b01fc9043a48fb49c709acb45d14a2016e3c5eda100c0000b9a800ca304401007d0103e00e8a31e2a07cedce3c8997624f37cd7af0a5735b7abcb9263ed27eab92acca333d3c5892219fc108192517298997d061237a9135aa8db5c4f6df87d99fcb042351bad6295cdefd513df3158f60901a82779a9344240aceab6a65907532ab8fd8ed24c3f7b6dddf24a1b9e77835962fda4c5a7f8e441c234201b7515bc44f55a01c9a277ac38fd00e2a2c2926de8d75a16c52f43f7d0a3cf3a3040277d6c1b7870713d562022294ee43cfaa3bc3a8eb5acf4e3fd34149eb3e0a793fc2e2cdadfc29d2c31435f5ad89d4650c8f740e6234fc8ff92e213e73f64646a23d981a256b4ce37a8950200137b6e7fd630cd399b047264ff4e792578544374d7be76b780c0a67cc39f4ae48c3f09adf64a603dc0a981c946726ebc5ed4ddde47e30d7cc0d167600192ab1a772de7d0e3b6df9ffd883e6fab66b98319a7a8cb160135fe275f803932fd7340c0a41802614cc70fd477c325cab194a542fbbb638a0be066d56497e33e88705847d9a741353cb0cd6c1512b8712b0a2b3d210634af1b880a008022)) <<< 16000) + 0x081c1dbcde0b2e956c98f4a002e11a66234007b89c12840196d40c540094508402000021a4000528c924ff720acc0f9165ce05ddbdd67503b86c3c884b41c53f1e6172081e79fbda74a3431d6768355297d989461cbbf9af458d1718ee0a67bfc3b253cec622ec283195066ce5828240bac1f1a2cfc67783c1079c64aedd6079c5210859e1ed6f0ecc1ad1dbeb599881e0bb35eb81046f97bd8f0a038c6ded4fe1666a614f172406be4a493eb4463e5dcbb820ac160f68b9c98196fb877d77b7dacb94127e325cf6370087de4176f3fd6d6f3312342a789ed3b9fbe81d84cae026d5e2c4fa801d44e700143c55ae4dcb7d9687e102783ed379523ae7db30272093d6baf08f3120a462604652713e2c1b958e69bb869d1cc179d7f4050a76d4c2c52f394928613ba0b9cb65a43d1d402c7c32388bb9e452891d63d1d97991c108f95ecd5e30403682fdbe616dafc6da7bb7641a79a892b9f85ab1f5453573927e3d562427cd7dbcfa274f90395b8b2fc025b0793bcead900445eabb2fc72967ab6dfef9c174303171c53fcf1699b0f1fea35d5496b77f073cce6b718863bdae68000bbf200324240069e483d90c1e8760f21bf0a4c701fc997375bed8094d716efdab4ee5f4e3f877b741299d2916dc41efc270d9f7cff4533bc648de23e415480e076b70c17b750fee7585e9e9ee1d560b31889e4b0cd693dd0d6fd3e1e1b148612adcde8e6f5605dc28022f1171ced9398b911fa5dc1d93eba9c5e64183ae6c0c0b7fcda078bbb1f58096b7d75c648218c73dd3ba78c695d10f715d60cbe398ee21a88f97ed74dbf35fc052f257dc3b717b34c46f90257d5def59ba235428bc800ea1ac83fd84efd07ed60124cbb9fce7f76aa7afa6d748592a70c8debd5a189cb613c2ba0e33235aba957005f5155d7ecdda0438c3ea8e80c77da84283b39bd223dba06d2def249e9888f5c8cb3fe0647ad8adfcb0068ea14267037c0d91cc3aaf57b8485a8f1ad9e3971b4cdfb3c200661d776384565cd6e67e07ce3a4c074358d8329d1adfa5e76732414c42763534d4d4b921741ed44bdf4bae8010c2f2fb968fa99e71d382b084aba8e100c01004492f1cc98f4807d46bf086601019051e804618400100000ab20001d041e0360ee03fd77025c6067c4677ecc5453103a593befdba4eefe081a089084a8480d5f525a4212b5a01278751919e01025422eff706b20175266752373dbcef5571c7e3b6854118d72c180000000000000000008c9f4a71fa0c6cf6eb511426bb6cb89f0b6a17115e84c02ef160000000000000000021788feba57e5a812b29d69fe32024b4ff1901184aa70280050048001036be13a51df2f59fe548f24d4973d3f1a64ad70cee5a2926ef6c4c3b99756d037d5bc1ffe61c783ab3bc113bc1566e63c03b14df30fc1af7271586c7c3f0bc2c8c8630e9a6c1085e78ccc516d6e09cc7f0a852d542e277750e2f40145850d5e90f0126daf5fb02ab6ad23cc8f671d7617be210b9cec48667d2961f21edf3301d347d4cbd748f7301078ba0fa00119641d8740ea33074110398081c804002aa67fcc724e5a5c5ff5a6df0cf976b39ca7b449eac9be65dfd857667ba2dd8584d1145f708c00000000000000003f5dc0971819f119dfb31514c40e964efbf6e93bbf820682242118d006611e1e384da05a1651411c01200e00200024b666350c686db63b9df3a826140d0ed80dc8a0980729269c9f6255076aa2feb1dfa2fc1f57492a8fd17f2c1c4d7b13fe0fefbf89adab50a5b760ab029243ec35263369d0f6c3a31a589de2a72768dd00054e2006d7a41c4d40e05a06f15001be6106e41febb812e3033e233bf662a29881d2c9df7edd2777f040d0448424797ee0f1cf02c8a1c81c71470c6005001401007f75ab9f63d96e81c9cb28c28d24a9970410a033c39964c6cd4ad7008092e68325d1c130c592d44fb8f08bb5e90fef225f0f1976757cb2d398866332cde78638b124283688c1b0440d62306a118348881a0260ce0a00041320644a0052ab200ba0a402f748de612bb3ca5864c5a65ce971e53b62c5468e93edeeebe07cfa00000000000000000008a3008ce2b4dabd5d7680eb71046d1138f159a889b7db281e5a9d8000000000000000002290808608e00c02a8029437a2881d9c4f398d24f9852a93b4914ec78272b27f78c649648ca04b4106f111865b2142c7eda8eb9c2508ef8742c24fb4cb5117a46bd01fce8f413025ff634252120920d4a4c597042803189b2238102fe31f9e8c7e6f10cd257692db47f033e872652beb50e6c49b3d35d7f4fc83a824979245eaea9787b6d4da888ab7f6597ce450a9ecd4b84b24307d27e548c2834da2e92a0f4198240ca02064010003b8100c7c62022c0e6ea84e3beee016e84b98322c2623ea5fef20a91010a10808608a00800600802230b7f631a537444109f7b6692e0d8e5f4f4bd225b982f87b6853a8ddec371d7fc759514b9ffe1952ded0825050a751bba18158d5dcb2a2973ff33fef599209631db8258b140b314420214210108111002580f82e9ba6b49838c3c661150ae5348cb6886a911e0d1aeaec7ac160fab86697d7157ca51a11dee7856793a22797496f83927684389bd33fbfa624512b89b9d8176db280a594b310a4a0c60200042620c4620612983010c17c160bc0b8c76e0962c502dd0973064584c47d4bfde41522841c41c21422411411805078799ae935ff7c599fd05224c86a9511c54eeafb902c07b7872a5b26d29a7c005044346932a6e236c48439aff96fdb14ea284002ba7a5ba90002821)) <<< 16000) + 0xa72fe4b5793540820ca046f6fc4244080f46f3be71b15580089e84807203805400010f90560d82a00ec7069bfe81e96e2c55fc3ef5c94082053febe8bd219c2038663157ef6d11831515302c21f118100cb864efc0f1c04b6e0dcd4caa1400459d252c6af1003ab1fd9d1abb510671048e1801e205347fc6968b0e326072b62836befb92e880d27659f61183002dc6840b0b0e00a08e04067ece59d0041b8e1100200005c0d8ae9034b508a157afff85c9028ab710fbe2036b05909a85849a7e7ccb0b04a4e3a23c92060625f95e14013f17f8e81007ce46bfb811a4508c02142c67e1d35f5781028053d162d2001619e3f2e7adc45101cbf68f4ac5918c1801bf06a1100160cd19a75b817890088504be45202940314ecb034ed00233882050c00f00004304074440961200042f20843a0400900042b9054318178ac174560b82303d0dfe23a017bf20aa651cb4339cc98a58f5ff9ae53850a2a5970000000000000000000000000000000000000000000000000c0f9481bc3a8de17bbbffdcfe19999a5aa3c7018b1677386e7cb0000000000000000000000000073d93307ca49fce25ce61a2f63291439629020618c10c004002b71401006c8d0687697930235da524d8617fa768134602ec91412c0b208108043f11d00bdf9055328e5a19ce64c52c7affcd729c285152cb80000000000000000000000000000000000000000000000006012c82483062451c30c20412c005c08008034000860800188105b1982d04c164260b00b9a916e0e68b926d8cff6a5dc63f656268500812b3808d36250000000000000000000000000000000000000000000000000031be5206f0ea3785eeefff73f86666696a8f1c062c59dce1b9f2c00000000000000000000000001cf64cc1f2927f389739868bd8ca450e40e58a386300100029cde1fafcdece9ce3fd0028aea40f15ae69c5682c76995f54dc5e66ba34235c62f1f8782bd6afd052a950efeef11940b865c796f51765bba6d747dc1bf679c2c01346a7e6cf4dfcc667e30a42fbbff5e91fef45bf20d163848bea4becad2acc98477d7dc1f20fc87625ab632d0d1084d06d0c7856197905218b8420fbc9d5c5fc69f85897881083b0aa81d39f940761b1168ae6456edfd321cd5c308cb30820cc0f0f35b1d6cf0132938a3701b48155dfa15616f0c5fa1c01fb760bebad85cda8aa0b354ec2e32931b06af65df16766002acd5522b242300975b6a239059496025a9d87b4bcae4090ecceaea7f5214e1e737c97d3e954277a38439f20e5d9323f11d00bdf9055328e5a19ce64c52c7affcd729c285152cb8000000000000000000000000000000000000000000000000607ca40de1d46f0bdddffee7f0ccccd2d51e380c58b3b9c373e58000000000000000000000000039ec9983e524fe712e730d17b1948c24d1ca18810208c00400050b8e008034000ec0fca40de1d46f0bdddffee7f0ccccd2d51e380c58b3b9c373e58000000000000000000000000039ec9983e524fe712e730d17b1944b20c1491470c30c10470005cf52a45d9837fcab936f533c0800af46812de74528522fc26fe23bf2bc47dae410e35500031720017344004a7882b948158660aa0205401d0a751bbaf8cba18aaca8a5cffdf9d9413604918edc12c58a0591629028810c08e00400883a3a8e2c9501aa57c624c0c5db1183aba59b76da74ebb5add996b94088d9524981ddb2cb30e614bd3d3094f6287b176d123e79917828775ec55e60a221dce19547030542fe5c29208108043f11d00bdf9055328e5a19ce64c52c7affcd729c285152cb80000000000000000000000000000000000000000000000006012862841043020c234120130014c080080340008608298ac148160a20b05001d0a751bbaf8cba18aaca8a5cffdf9d941360493f3e2b19525a42127eaa025ab5a0127810788feba57e5a812b29d69fe32024b4ff1901184a671059048808240000cc6a04ae4c72978fe9221602b4ece36398b817ea0639c1dcfc8fe36a2a95d3aa3733631785c315271aa2a1452cfc9dff89b178c3e95a21a546ea709b7522a1971a854950be22c1136a19ae8184f5077eee2939e62e9473accfbc4002dc6840691c26a26319020e6d9a4a6208854711d40808be8deeb808215d7c75b1601d36c214c0224e38440100001713a3801c9c128060f528e14b7d1438460223f141865ee86509306108870c0e286807bcb23b9394003a175b1c802251c709805009e020001a5200103c4002e7482714ac5c81204afbf6e08662f3ca166a0378e11725ab54ba320516d691cb256535547e3cb05e1b1518adea09772d8f240a331501251d4b872814070142c075d976fb907804f08016c524a7c48d7700e800051528c5c0a3db240a45e6248e553500d8cf16f4ea4d25ece51eb6b922705a3060056e704902c672bac8946f302f636cb07062421cda1f53032c1a521e6a73e1010039ef8b003002c2385be16000230df2269a0411dd96a4b34a8c0e1400e25ca54d76100afc47402f7e4154ca396867399314b1ebff35ca70a1454b2e000000000000000000000000000000000000000000000000183c47f5d2bf2d409594eb4ff190125a7f8c808c2533883483853842000026cc23563b60229d785be429a2f99d4428a7ed25eee63f9a47cabeb79087b99f03087ee836810bab8be090a5dff9c4f09286c7a0a13f2a2e95f4e3e8b91e9c2af79e31e700742a578194bcb05e122248b6f00ec65a6f271a982f0ee825765b3977e185d87f90a2addb941900b3a3f65494ea2a708cd)) <<< 16000) + 0xfc47402f7e4154ca396867399314b1ebff35ca70a1454b2e0000000000000000000000000000000000000000000000001804e20d20e10d10b10910d0019f7827009e11a59e891967f13fb116bc6d3c7d63d01446932f91cd948ba7543a5a0405354926201acf80e1f02819f780ee58fcadb714e03028001d69e84b98322c2623ea5fef20a89c41a41641c29c21c09000a0080190401006e921f100fe9e348b2637e6eb964001c9c3800e1c01c9c128070a423525166384a76d66c171a180f0a822b9a704250100000be10220902684807c1403c0a0002dc2001a1a413074001e72407474096320012ee2094520490d0010d0103d29001e041004914209072003014086ac2daa9ee7f3177915ff3223e59789c1edeb7e3a5f3bc40c0a53ec8112b2729dbb508f7767cacab9190adbc9d22958809e814e20234d70dafc887a4ee0f31eea84f6082f85438d140b4b6cdff5c1a57a7669ea624ccfa72dda3c3c749520c882007ac2c73173a30c84d9ca57feeef5c5db4f92d2a40bda981004405618693f4e759754989e6b973f91f165960c5fbc097a7d6751739950fb521795095b2c37dea07780d1794e2dc951429d46eebe32e862ab2a2973ff7e76504d812661670c9807017f88e805efc82a99472d0ce73262963d7fe6b94e1428a965c000000000000000000000000000000000000000000000000304c80557bc296d8fc4175578fc4175588c55e60ba11a9231008c08c00139549409b97071fda02ade7c52d53159999c8cf2671963a9826dde4e3093e1ff6ea0b943952232d132888e08efbb901b27647d6166ffb5214849cfa78f9d7ec43b8bb130186d546b67174ff9192d390a7e2a3cf6588b98605b426a0eba2b5411c1608c0b0450582202a44049fee9bc7108d2e8c341c2942ceef005058ac2af9910189fa1cd20b01d00a2efe0004498a08802156e92c82f8cba18aaca8a5cffe15573a1604890c10bc8c1597a56e2ca8a5cffb11d7c94c11f88feba57e5a812b29d69fe32024b4ff1901184a640e20840630428438000131205977be64f4c3f9e49774e9be1a313fd2156f7fb8a75741534775abf0cd222cc3cc16cc5da6dc000dbea600026e18f2608f267f4aee47624ec33ed9202bfe2c496405aa2aa0068c165fd2aa9637bb6d530648a0398b7f1902f14957c180000419f5e10004e3044010d20362856b92c6e674158949144ac367b9205f3c6093446152f29f3823004ae7b66c4a0018a78c930109c60880200002de7072206b8ab1438ad2498a0a16e13742403898a4ce5760411762eafe06000471c430040b0e1080200004f0d0a751bbaf8cba18aaca8a5cffdf9d9413604890c10bc8c1597a56e2ca8a5cffb11d7c94c1191631221018c188194010000845fcbfe2d94e0ba991caee63eb657a39c231c18b75c6620d1c3bb343c3f6f76726ad1d3cdd2a7b90541114000b948003a81000b6d20019a278c0b01b7470e2430aa274e2062be34ead8813a62bada80481844010e321dee9bd4913d3fd7c9838951d15aaf1430da4485a881d56e9bbc050b17f6b22e280af2d33d90270c210080000b0904301f88feba57e5a812b29d69fe32024b4ff1901184a230a406306204184202480200057f7dfd6210d749bdb7298eb9a2c495ca96f4637f5a1eb7e051b04da0003cc410844072230410d0200080fc0407c020004ee207a4200188d20787203b3181d12c0e42607003a9d7334e1c8605dc24bad477d67d6e4ecac0d5b552367af35a60000000000000000008a6981be22e899ab52a5bdb1d1c24b9cb6d9d00112c2ea1ac40e000000000000000002191228a19210410c00a008000002211d7257dc4d6b49b53ef2b5c620f3a279088b0a69e5c196dd276421b60b33e00791e81c9a012604e92512a116651039ff62332b7162e140648c6c7699e37d32f0a0f6b184178175d04a109bde632a7fb0dc75ff1d65452e7ffadc83aed20942853a8ddec371d7fc759514b9ffe1952ded0825511ceca13a46ee35a86199388f4aee65b4f47621da32c6d0b00000000000000000108c200342c70c10411c01002f14f9fc09f7fdf14d45ad95376cb605462e017fa6bb15bd87244aa048db7dd014d450c010983e8db267f00a7597f4b529f855c47d969f4d97b5332e62fe0cce0343b90014645cffa06e0b0360581a82c0d015c129cb9133460418acb3193008ee0641f8000316f90b00011242422008412c168977dc0673acbce1c22ecd836d99243aae14107fc0e108c2ec4c4a249180a90ff2d14134ea8a722835415f43b0c02454af47d888bf36e0a8c4b690c224dcd2d9e442f34ce2043b9ddad62e243ff09be15ba8b05241b89493e51660ed8716e52bc0c3c11dfff8184df864379a3a2e5b19059926202802008b19f26c9d0162b7411407185c2bd5e3a580b11670a8a02705841208128a0f8040000408c060040100000446446f9676609218f4e39b1c40d1294c7ac700a3329227340cfa0d8b0100046e1828440498708402000027a4000b5080035010007a52066420321d81880f49357d051d4d0c16c57338283b1ad2b5d4905354f99961814d335bdf8d00b0b06c802c0105be27340671022008504784f2f480e14243e392e1023bede89d940075a2722e0481844010a0862232b461c2a77bec9dc204af0674cc38045da5e000201381394240250c22008000086900020720602302f1101708c0b4160580bd0e77a84dda28316dd724bcc0458d7948e201179535ab8d019d4ee760000465242200860a2522be31e06234fcd868148f981414054b537ea0050507801)) <<< 16000) + 0x122d54267a1a0fa1e52d80110a0e00400001ecc080e871146144048d36d0181008176bd4802d11ccbce004828420100240100007a1c1ebd8bf9c4f0553b287b43007c2f309d00231820008015828000318febb812e3033e233bf662a29881d2c9df7edd2777f040d04484242c72e94d2c02d4473b284e91bb8d6a18664e23d2bb996d3d1d88768cb1b42c00000000000000000425d4d953de0e061d5aea054f14b38f58cb328a658d92de60fd00000000000000000109aef548629d41d8bbe0a3f3ad11f8db0d389c2f5b4af44f50000000000000000040f11fd74afcb5025653ad3fc6404969fe320230958604e00601085e5766e7598b1421c271042b21f1b8de93eb7d01ff84c7c7ceb443f07cc8b2e1b2dfea29f3640ee6305a0221e0dfab8ebb0ba4b9f38bc40c8e15e32bbf520565649c7a6cc7ee64df282f73c47ac1a9d7c77de31d4647c12b712a5f1d6440eb466f5c9d558941fb7fd3bf649bb0c2b0c7692bab9e3b6e6dfb46d41a0568cb2425d1cd9552a7cfe414ef1db44042181f3605a421cf51bc3b28634db28501f0500f0280028348006c01000eb43841a7ec67614a0818516d49f022180bd4c1472fdd0e09a08318ac2510046127c69e5d860487130cb9e482033ba7b9964c882e35aec0c4940c563901601820623763264923bc8fa6babeb72c8bf7ea1bd26897edc7aa90812d0510f5092a2ef33782d50e2d1ddae415c68e8cd687c48603ac7390c7b6c41158ccac85b7994458cff97cfe9e771c1488001383bb892ef8e564e5e0d1f19b499d474aacb475f12daea0243caf367a021b6ae473b82c0e6340a730f96ffefeb499202ae864906024a46f99de35fbfd629adbb38c08b1990dac51957c3523d882cfc7088ef76f45716692ee4c6420ba2640002a9902a15014828001e1c81414809c340035224098a4004ff040150404a73c02338ad36af575da03adc411b444e3c566a226df6ca0796a760000000000000000008a7e37dade0b20591208408e00c00a00200221db7ab8cae618d2248d5c2a86b2f28aaf7b6dbf2462688e805ee5057d803ff92572b5abe5796ae71b8e05ebd319b592207be8845386e99c6376c7532cb744d2eb7b3958a33f88b3df56ead6d35929ff85d02af1d04023c85c388a71764cdb0cb160cf86bc7dbda328103117c074405d42408a9c1045bbd62c1632936e6da1c0325497914f9ec118a9c20202f531fa667e7ab6d40401cf38e1e8830d062f621271abd13914a509414881d377813ac8352ba370e08b3d8284f6865f90701d4c7317ab4186a2c11e0e1ef32ea81962a34da7193e9315aac1dcd96b8ab1c5abeb7bf24a8dbb258984c363884b746ca10efe5e8a5d89b6504b46750c711179d971a88a6ba49984a88b13657156dd3a288e3765e27940d0b4f5ac7e8af0632276ab11ba538087c5d310464fcc4c102c600ddb324c700367460600d002288652780482046010808008020000088c04004010048020000373014010040118280000dcf03b3ae2cfe1001e1b3f1e0809c3b8c24460840010823447a23d24041cc3aa09020f00200001d8811048084240401201f0500f0280006848001c11019210003ce901d21d86821a6fefe4258a960a312d85cee7c23a4820eabb667f2540b8c0849f64ff26800d04812ea18b6260b44e0e01a35d3ec1e99ace100fbdfb887a86d450201e373ee07a41c5109dd23a87283a064618bf50ca4640a3bda14c0da8b1fea6b6b530e90f861e092679b901b3b44a11dfebb21037580d62522141805054096f51ff844b1d45ba247148e3d95128b2f758db5a78d92069648123acf64d7d423b56870260ffe9fa00806a252bab9906d491071c5314a928117f03a2549f21b1e3cb335b48c040d81426573d7809d88ed55312140001d75aa518e4d1f869445745e31245be8d68f74d3d87b6cadea8ea1d5b10792295069e1caab88a40c0f3622fb133bdfbe102fe000f5d878be7bc6d02dedfaa5206013dcc1ecf80f1a31162397c623cdde8319514c86879a996c6c2c326c16d099a0aab372920804ef601178200b6595f5b0250c2100869404638cd18e39dfffff963880241554d9a1ce292b99414082200400e0080003c480d8880681400047c4064640301a017010004ae1016190005fe101521000b26901431009968048440220a001b54200914e4019ca4d0e22bc7f5f8591826791d84a8948604c5f73b0c640141a9a5ab87bccc40563ee05e541e0c058cb065b387910100c690fc4fcd2680789ed7cda87962c2e0307b290048abde1c30d0f634e077c2cc5dcb0a1636f6e2cb166b0000000000000000002285e612bb3ca5864c5a65ce971e53b62c5468e93edeeebe07cfa00000000000000000008a43083843042842001808821cbea7bce3a88382ecf9d8dbcc87095fa3f3b11d9afa366ec3b1be640dd82b600c35045f337a05d59b4335e0a0fd8e0e56dfdce45e93c4692ccbf8dfe4924d6218b9ed4d6f6d2331294a176ea6ca9ef07030ead7502a78a59c7ac65994532c6c96f307e80000000000000000084fdce8b3d607bc5589b6804efbf353541e082c7ffa0a1b6aa8c000000000000000000000000000000000000000000000000003210c30c20e10c10a10e0222e726e4b24b5b38e78dc6f07a1fbea4d64f00a479749fcb4ba67fd97c2cb8dbe59ccd7835345281f228317a69785b3d575540aa92a8dda516381e6f35893e4dea000a02404064001434403c9401c3200d1900604802c240140a0090500402801c0400c02000cff200a620042d00190800834002020000100624f9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 30 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case13" = "QuadHeightCover12Case13" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 30 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case13 private def zz2373:"s0945"="s0945":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l43 l46 l5 l51 l54 l55 l56 l59 l6 l60 l61 l62 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x4dcd35075, -0x547044420, -0x7eb3d82c8,0x3b632d52], ![-0x547044420, -0xf1265bc2e,0x18dd21664,0x5fdcd7f28], ![-0x7eb3d82c8,0x18dd21664, -0x2256e819cf,0x549e0b020], ![0x3b632d52,0x5fdcd7f28,0x549e0b020, -0x2a4393d10]] noncomputable def hinges:Hinges:=[(-0x329a300,l6),(0x166f3b9f,l5),(-0x665f5f98,l4),(-0xbc48827,l9),(-0x159085c17,l8),(0x6c1389b6,l11),(0x3bbc2aba,l10),(0x914028f56,l14),(-0x9a12c4253,l13),(-0x23ccd800e,l17),(0x4d096212b,l16),(0x5138e1ac6,l15),(0x9a12c4253,l20),(0x111aa17c,l23),(-0x2a4393d10,l27),(0x2a4393d10,l29),(-0x914028f56,l25),(0x1d6b31eb2,l30),(0x2a4393d10,l33),(-0x3bbc2aba,l38),(-0x2a4393d10,l35),(0x159085c17,l36),(0x2a4393d10,l37),(0x665f5f98,l34),(-0x1d6b31eb2,l43),(-0x5138e1ac6,l41),(0x3118de2c,l46),(0x2a4393d10,l51),(-0x6c1389b6,l55),(-0x166f3b9f,l54),(-0x4d096212b,l56),(-0x223542f9,l59),(0xbc48827,l61),(0x329a300,l60),(-0x111aa17c,l63),(0x23ccd800e,l62),(0x223542f9,l65),(-0x3118de2c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(0x914028f56,l14),(-0x914028f56,l25),(-0x2a4393d10,l27),(0x2a4393d10,l29),(0x2a4393d10,l33),(-0x2a4393d10,l35),(0x2a4393d10,l37),(0x2a4393d10,l51),(-0x9a12c4253,l13),(0x9a12c4253,l20),(0x4d096212b,l16),(-0x4d096212b,l56),(-0x23ccd800e,l17),(0x23ccd800e,l62),(0x1d6b31eb2,l30),(-0x1d6b31eb2,l43),(0x5138e1ac6,l15),(-0x5138e1ac6,l41),(-0x159085c17,l8),(0x159085c17,l36),(0x6c1389b6,l11),(-0x6c1389b6,l55),(0x3bbc2aba,l10),(-0x3bbc2aba,l38),(-0x223542f9,l59),(0x223542f9,l65),(0x3118de2c,l46),(-0x3118de2c,l64),(0x111aa17c,l23),(-0x111aa17c,l63),(-0x665f5f98,l4),(0x665f5f98,l34),(-0xbc48827,l9),(0xbc48827,l61),(0x166f3b9f,l5),(-0x166f3b9f,l54),(-0x329a300,l6),(0x329a300,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨70, #[0x140620081410cd0810295d006000000410d00db3010000010819409acc05000000430c406b30100000000000240c801050830c20809174018000001444302a4c04000005208301b23014000015420c09c8c05000000000054072008000000108640d8c0300000000058503300400630820840abd005000000584414054008000001513070390020000cc2104406f40100000000120d014c020000000004870330040000000110e024c020000000000070320040000001387004cc0300000883a1303b400c0000000120e01cc020000000000380520080000012032004cc0400000004a1a00b300c0000000000140c80100000000000f0320040000000013402880300000000009c06200800000000026014802000000000094062008000000000250388020000000005700b200c0000000015002c80300000000055013200c0000000002901c802000000000011032004000000190440f4c030001a44104c06440100006911413019100400000006411015300c00000015874028c03000000005c3c0630080000000170e014c02000000005c3406300800000f21100124c05000174330480324010000001741200c4c04000000590c403230100000000001701480200000038088019301000000000e0a01cc02000003d0420029301400000e210800a4c050000000002e009200c0000000001201480200000000024009200c0000000005402c8030000000000240b2008000000000a0c0cc0100000004617013300c0000000028004c804,0x58240d3008000001845302a4c0400000620a301b23014000019428c09c8c0500000000006407200800000001512018c020000000006700b200c0000000019404c80300000000000d0320040011120c31031900400000005c1b02d300c0000014c390294c04000007288f0213301400001c220c03ccc05e6449619300bb9401c00e11061cc03cd005e5c48a1a600e39401c00e41181cc04cd0050000000006500a200c000000000330188020000000000c805200800000000031018802000000c124c0b9301000002c642405c0c0500000b090301303014000028238c081cc05051848420c02e24018000000001bc02c8030000000006c00b200c000000001b404c8030000000000d4072008000000190840b4c03000000631100af30100000001888c0b4c0300000000000b0320040000000001101c802000000d128c0b9301000003064a405c0c0500000c0923013030140000000004201480200000000002103200400000000041024802000000e12cc0b930100000000004b0188020000000001240620080000000000a40c801000000f130c0b93010000034652405c0c0500000d094301303014000002c88602dcc04000000b120c097301000002c240c081cc0500000828af02133014000020228c03ccc0505244c010c043240180000000f8240b4c03000000003414093008000000000060348020000000000c40e20080000000005c0348030000000001200d200c00000000021038802050830c2080857401800a20c6108055d005,0x6184043040da4401800001c0902c0290030000074220e012400c00003a108640510030001d8410c406c40101861010c1012910060000000074280d30080000000000a03480200000007212021300c0000000000902480200000000782409300800000001d09024c020000000044380b3008000001202200ecc040000004209809b3010000013c10801acc050000049842006b3014000001102c01ecc040000000441c00b300c00000009824090c0300000000641407300800000000b05028c02000000000068052008000000000dc02c80300000000035013200c00000019894028c03000000006c4c06300800000001b12014c02000000006c4406300800001321900124c050000006910403230100000000001b014802000000480c80193010000013418800a4c05000004886200293014000000000d8024803000005a023002730140000017413005cc040000059826004730140000001702c03cc030000005f0500673010000001501900dcc040000005b06403730100000001683805cc030000000580a01f300c0000164088019cc050000005b04803730100000000000d0188020000084341600c400c0000000110e018c020000000000f00d200c000000000280348030000000068140530080000000110f034c02074054c4c004664018000000000170188020039c59895017340141c61791120179900600000a42409036400c00a612c10c0aad00500000000382c0d3008000330941903d50040000000024180d30081820c108402975006,0x24062008000000841400f0c0400000810a10111301400002142940344c05000000005c3806300800000002505028c020000006444140d40080000000120f014c0200000000003c05200800000000120c0cc0100000009241036300c0000000210e018c020000000084340930080000020c120248c04000000008c180e300800000002a0902cc0200000000004c06200800000001912018c020000000000640e2008000a124c4c01dd004000000000015032004000a225843039d004000014c942103f400c0000000001f01880200000000002c052008000001d0e060190020000000064140a3008000001541c0068c040000005505803a30100000001682c094c030001e85f05007a4010000741443a01490040000006114c0c73010014225210c0a29005000290930840aa4010000001d120e019002000000b3244089301000000001d0e018c020000000000740e200800000001d0a038c02003045383801924016851088260084c10070000050881024c301400000000b07028c020000000561600c300c0000000000b0248020000000521601c300c0000000026240cc01000000000044062008000941984901590040000006404c0fa3010000000188280b4c03000000620640fa3010000052158580710030000000721202d300c000001c42702bcc0400000000003c09200800000018878070c03000000931c40893010000000002a2c0cc0100000000005406200800000001506018c020000000000840720080000000120b014c02,0x608a1024c301400001c23040930c0500000910c10111301400002543140344c05005c08206500474014000b921035009d0040000000642c00b300c00000820c40c18c05000000000014092008000001501303e8c040000000520a02d300c000001481903e8c0400000c83213034400c00001c42040d44c05070450c304085640180000391a86407900300384658610132401400e114618405d900500000033054049301000000001205038c0200000000005805200800c11540940ab900500018c5204407e4010000001042103a8c0400000000641c0630080006114c1c01dd0040000004108404a30100000000000b01880200000000642806300800000001909024c02000000006c380e30080000330d05002900300000cc3411021400c000001b0e09015002000000000687033004000000118280d4c0300000000c45c073008000002c823029cc040000009120c0683010000002c4a5026cc04000204730f00774010000821d833039d00400000000442806300800000001109024c020000000000440e200800000001106018c020000004424180940080000210c83809100300000004219022300c00002c0c8540510030000005110c0c7301000980c20bc064100500000003211034300c000310941c00a100481432209802130401c000019088300d10030000040861024c3014006108808c066100505183042040da44018000019090240910030019424023019840141460c1081012910060002703c08407840100003c0841a0271004,0x60ca1083021240140000018c220248c04000000006c280e30080000000250e018c020000000108240b300800000002909028c0200000000a4140a300800000001b0a018c020058c91063021240140000001c8c40c8c0300000e4620c032400c0000000290a018c020000000000a40e20080000311485809100300020c6415007a4010000000188a4088c030002046314c09a4010000000108640d0c030030c4086103d5401400e40c210408390050001c4320880b740101420c7087016b900600000810a1033130141520d109100eb9006053034c24c0a2e401800a50cc11804dd0050000000740900e300c00002c43040444c0500025444048029401000002d43140344c05000000f8a86406400800000003e2b014c0200001c4a22f00d400c00006120834029003000000008418063008000003116050290020000184820d02a400c0000000310d028c020000000823202a300c000e12883b009100400000000078703300401c330428c0849005000388a106c024401000000000160c0cc010000000b251036300c00000002512018c0200000000b4480630080000000002d038802000000e8986406400800000003b26014c0200000000006c062008000061208bc0350030060ca106302124014000c120838005900400000000c43806300800000321d0d02500200000000cc780e3008000000191e1c0d001000304820e007640100000621c86408500300000000001d03200400000388c302d0c040000000e46102c300c00000000323c0cc01,0x6d88400cb3014000000001a2c0cc010000000064580b3008000001a04200ecc040000006211809b301000001bc20801acc050000069882006b3014000001904c01ecc040000008a044014301000000023024030c030000000880900a300c00000021024030c0300000008e1100b300c0000002102c070c030000000881100e300c00002201040098c050000008a08401630100000000002501c80200000000782c0530080000030c810224c0400000000948c0a300800004922058071003000144410e808840100000010c240378c040000004109809e301000003a1a02c02900300000e46a0e012400c000022220c044cc05000008608101333014000000003a3c0cc01000000000074062008000e41e43601590040000000661600c300c00000018858070c03000000340440da3010000000c8130268c040000000320c03d300c000000188b40c8c030000000000580d200800000184550208c0400000000005409200800000001916024c020000000622b022300c0000000290a038c02004206085a01b4401400000002912018c02000000a448380640080000001c8c4088c030002447318c09a4010000001443103a8c04e4c50a0c300bb3401c000026228c044cc05000000000013032004000025828404ccc05000000510c404a3010000002142c0068c040000008509803a30100000002284c094c030000000000840620080008f1282401e9004000204440e8052401000000000013014802000000e3284089301000000291205029002,0x621600133010000000190b402cc0300000000034009200c0000001d02c070c0300000007231036300c0000001c8c4090c0300000718c702183014000001c4650220c04000000210440ea301000000291713039002000000a8544405400800000084110128c0400000638a303103014000000188a4090c0300000628a90310301400001822940440c0500000610410351301400004a1287c06d00300000000068303300400000001906024c020000000000030320040000001b83004cc03000000006818073008000000000060148020000006804801330100000001a82802cc03000000000440582010000000001500608040000002805c0383010000001601301e0c04000000410c404a301000000000021034802082860c50c0a9c4018000041188a40fd00308086245240a9c401800f116620c0f4d005000007188401f1301400001d02140bc4c0500404618610176401400002042040d44c05000007088702d130142011830c1021590060000000000380d20080000000150f034c020000000000340920080000000d854090c03000003185102083014000000cc290220c04000000000028052008000000e0110078c040001383a04c03e4010000000cc290110c040000e42e0740cc4010000000941d0318c040000000004f00b200c0000000013404c80300000005623014300c0000000011c02c80300000000045013200c000000000ac0348030000006814401330100000001a8a402cc0300000006e2a013300c00000001a1501cc02,0xc407200801651ca2a808c900500584708a200f240141c31460f3014d100607645c832407344018000731583c01f5004075c5b836c08344018000f124c310319004000404f2304099401002013c4604096d005000444d12c80da40100000000004d0248020004450234409940100221404684096d005000484e13080da4010000000000430188020000000005500a200c0000000002a0148020000000000a406200800000000019018802003184b04302ab4014000430941903d500400000004e0902d300c00000001105024c0200000608430352301400000001e09034c02073c5783140c3440181c31460c1014d1006074058042404e2401800e314c26005c5005073857046c05e240180000001b06c0b4c03000000630e40a53010000039090240d90030000000001f00d200c0000000006803480300000830cf02303014000000c42103a8c04071853c1c00460401800001cc2bc08c0c050000003108404a301000001841840d44c05000005086702d13014000014619007c4c05000005406502f13014000014a1840444c050000000003d00a200c000001282100ccc0400000000026009200c000a210c3303210040002a8430cc0c84010011208a0b406310050000000000ac062008000000000fc02c8030000000003d013200c0001600c30012cc06000005a863002b3014000017e198012cc050000005a0cc01b30100000001a0bc04cc03000000580e403b301000001661a401acc05000000590d802b301000000001a1601cc02,0x11805200800000000008c0c8010e0cc1010408da40180000000000940c8010000000001240b20080000000003e01480200000000001f0320040000000003d0248020000000742102d300c000001cc4402bcc040000000722302d300c00000000045024802000384b20c4099401001c12c4184096d005000404c12880da40100000000019002c803], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((0x2cb355c5) <<< 16000) + 0xa44202240233942008248b3181c009918ccd100241c2000811f04c8f4164780be2c48af7d3c412356643207081266814090000c01584024102000812786c938264880b82120c07d55226019f5d1f430cac5dfbc12210ae6be7fc8048cfb885a900808db702c100050e62df013861100408dc2646c0be88cd981361121f04575bd4e6d8b8603e292492299c41098890808278010019080100691882e490ca7c1cc7bf084491011b92f2260b84411168d4579f32315310969c20c6aecfa02082ef8e5714a43b540002ba7def3000098006eeb6b4bce2008000c9c44a0893a301e84810186e0a00002523d119b3026c2243e08aeb7a9cdb170c07c533882121d311211204104f002032000200d24d01fe5fff9f2af504280c00000000000000000534136a3480512c79447ba6d8f2fd262711a238a49104262261220980820aa01804010068000d6124c09125828000c6c8003689820038bebd5030d01986c5448843e065626880405ea0f2568026275da2c650203f58810810000e9b82693801200408dc0646c03e88cd981361121f04575bd4e6d8b8603e29a28a291a38e9068868847000819000100691a80e288c19573740e3cda27edba2419722c9a7a2218016e346822113878c47e16101b29456da800016e360024001ba57bea1402120040000690800174924a0d124848920140009be40035e8f161f1e0f067941ba6a818209628317d88863d8cb2305040040622c6823b8684425800d1ce4dc9384100043f2fffcf957a8214060000000000000000029a09b51a4028963ca23dd36c797e931388d11c4410a08709004805100f0020170100200d0001ae248e1a24609122828170040ba0200038b3e190cd25090131fe84a16041206ac840473ace4248103801024401f9f6c75fdc91e700563c77a81603e425ad8a29edd21b9c802581254b41e09c50e72d808004beece84e00440102430192100e086fd2408088980a590f270c3213fd7c9088447764554a0125953981068002c4d4e1020024a4d8d93801100409040704198262b5994830de5628cc44424040d51810ad7f94201b514987cd110982b86748f0e80400b2cf96c804400071b0a52dc800ee6b28002fa0e085a0580001e920006fa4001494f160b88a0427940d298dd2508108a7e1c2099a7750c88864b77fece68242539de65800d91af6e938410004284056a6f19f03880c469fa71841217260f3c91010421868872381028e07436068205062f67791000c8df64669e00458e64f3a5a4041380a000070082e808000d2483c8a8900440f01a23f090004e91001c402452130460991404c5cc27028039e82d310100968ddfe14080960888f8a081dd985ad020c00e7d10d10003f17e2bf8e0006b92aa8213861200408f81647a0b23c0591d82c8e8164720bf3c3914c7ec7920520e76e24502ee6ab18a2fd1fc04a8c0006c88aec5000167794d4982084020470038216c75fdc920780563c77a89803e425ad8c3751f38bf8882581254b42009c50e72d808004beece84e00440102370191b00e28efd24080891a0a590f270e3f781eecec90447764554a2125953981070002c4d4e1020024a4d8d93801100408d407f97ffe7cabd410a030000000000000000014d04da8d20144b1e511ee9b63cbf4989c4688e28a28a088e58e38e50a905e84802b820b80340006dc8001a590004f43e600a80227c28bc5b462cf2420496f433658603a3d4ff9c0842c1533c60003a975f824c1044010fcbfff3e55ea08501800000000000000000a6826d46900a258f288f74db1e5fa4c4e2344711452c32033c13812414804005c040080340006b883b808000c5cfe5fff9f2af504280c00000000000000000534136a3480512c79447ba6d8f2fd262711a2389a50e18619c10c09e01a02f704be5023be85e1adfed00aaffd9d3a67ed2634b3c102f2b15e32824ccc47e77899343ed905f774e29504850002df24400b21f01c1003eca594207806cff6c10186bfb86e650c06f47cb51868d4d0a511a00297e92784000482689293841080408d007146b1f124f048d02c73973471d01978f30481187485b8d1051876f380380003c46490100073097819c00880204660323201c92d62b6327133810d41af620861b324da130883dc51f348251b3d45d8f0005699ccc040042fd0a967002200811880ff2fffcf957a8214060000000000000000029a09b51a4028963ca23dd36c797e931388d11c5249245231220c20821308500c020080340006b08001a010004e9301de6d6e4cec20207afd15fc02431762a1412e306192477138850e3b6fad6dfa400e0a0df8c044000337f5ea078070c50324b00112a8338486d0204e0300001ed3f97ffe7cabd410a030000000000000000014d04da8d20144b1e511ee9b63cbf4989c4688e2708208786404700680401312c78481b8a0d005400070c91802f8913edd03e2a0e18345b8394073431c8ffeebd0830e7d7060bc5a382019b924002d00050682ed0583c00023c31e28000ee6a88a0900321c70a80800003b240031a4800c98922f291059288b88445a3a17305000dd5121d2190e00ec822d023716c7060690bcbe90c0845a038b520e10686bf3a06082ea071fa27c4021f57d84cdc301134925a1604049eec041cc0000ee387b1e0220008489342701c590003cb4cffd87060483c5e44cc38414c8e59d3f21044906bd002b2482372b0b5ad0a080670b58780060014edabd156402200009b4264b399054ee68580500001f720743ba1c016e346858c6e9923e2104206188239a110dd382f)) <<< 16000) + 0x8107700fc6fc580d25102041800b011c752080000173c210040000bc922c2510d8480017c0c9045b05005205179700019c1811ebb2b8b0e097b7dce3801b863b490942084020106138000080208ac0607403ceadc7d624cecfbd9d5a8f79b2f314085c7e0940030d4007277161d6016c658f4b33abb8211d119b3026c2243e08aeb7a9cdb170c07c83723fe53665d28c7856831ac841c10ad37e9a34d1c0cc82881040000000000000000004741042430823c0300fc6f745a54e5d1a1cfb97d1062d93aa107ab9189474081519be8aabaeb1ae9e3bbadcda12535939b587804c7cd75009e13656e871b174be97c07f3585832908689d09d369bd430310ef53abd1445a388cb268c8a12b29f50005d02000c6e48a846102232290582302c8a01644e0b2260140a0d03621e961da0ec6bbc404799cb76a820cb62434785000343aebc90002cbee9fc30022b584d121386110040894164480b0ef0591182c888164420b80000802022c060ee03c32b91367a82c5013fd0b9e288219c699344125c5f027c220044b008fd380192d9e21093041180400004f882e86f45f304ad0845142dba343e2841d0a200d430ff542e8a03402ad2e71bc0251022008000087908a1591002c87c0786a00393b8b0eb00b632c7a599d5dc1089e21820821008e08c08c00600402200e4800401a000248400118890f0280019e490e90c87007c70519b79d860c0696b3662410f7f5984410603d2b1f02809608857c110010094d0880204361200013523f47a1f9390fc1a81ecc40020c44868c642e1bed8cb54926767decd5a8f79b2ea6366bbb8241d119b3026c2243e08aeb7a9cdb170c07c871090c70c40c708700101000122206e7a21d4bc8372fd19bfb986f5eeee1c29d2ed9bc2ef4c573352e1dcedfe5e7db4ae78e594041d89c92fe423c536e959e071dfbce2dd8336ec128910ddaf9ef816440a5082880826805004008c0cff7011a415680f9bb373e9e2db94a504d0f6ec6aeb696e8997a9548ee50fa2fde88cd981361121f04575bd4e6d8b8603edc5ba2c4ae0058910ddaf9ef816659040a50828808238088dfd60c18821a841fa20a966d5493d67d813e66a4a4421829a80da1bce9a6287f18a80012890004a43a5293698ec34531e93fa966ae3c1a47860231d119b3026c2243e08aeb7a9cdb170c07c5f307c30f0c0b328a28518320010045540a59f4a63dfc7318b832c9f47291512a6f9cf5572d1098293e44f9620c609f0c619ee1ff55f851eded3ba0dbe23fd77ebec3ce580b41c14999f52fa2572baa530af24a8001db10442182180fa2336604d84487c115d6f539b62e180fb716e8b12b80162f983e18786059f97ffe7cabd410a030000000000000000014d04da8d20144b1e511ee9b63cbf4989c4688e8606486584402382821e6912d5cc07d5e70ddf3e3be0539f2c61659bc09ab7ff26af1d7ed7626b1904c1026153d9ed016109e79865966c22cbeecae1b13de108d12373b6aa2b9493f8e3b00fe98dcc9682d9485e992cf4b0248658892d317d5e7f7f15545d898b83dec0762ec74749f1a5f8551c17400443dfa89e6a27124073cc51698aeaa601afda2fa09bf142ed6af9e853709fdcf00252b9932201deeb706e0108e7364daa9e6cdb685cdc084ca484281b76aeadb0e94457d9d1f119ebab1a44863dcbf8bd1fb50e359016c1c36d414b950f7bb4497841dc96eb8c632857e5546f2f441c63583a3d61a89450272de5e4465101306d34281a81545faa2dfbf73b77d1f6cdcd3dd021c7459666ac8aa9d24bff7f1ef4829ed54a00970466bc66a715c880ded5d738d17921f760f1bfd7f4ec0a4e06951c5eee97198170daf5a0cef36cc9dffc9ab8919b041f1542f276fc9e82fce8065077ba49a1345f31fd6fa819415e25941070df88d783515f0316373cc397680fdc383f06106263138f013be0196abe06b014f9ab5f7746b76904d927720c7e1f38e9361953201c1b8de468277a667c6c834c9e3258f5bc00058f102b19e94a4da63b0d14c7a4fea59ab8f0691e1808c74466cc09b0890f822badea736c5c301f3befc56cee5513aedc0a68fb9199d9123bb8ee4433593ff2b61d800000000000000000119677730f64ccf09ee609f0f39af46e767adad9332661c09293950000000000000000004542441821022801318e51d8d7d0eda15c2ae82d22b019ea5a7c3b6854bca47745ca13906334a3b25660abe8eb62ffdc0d327d763be75fe3d995a3c60af2934c7990ffde96e304ebb51e49be9fa16494d326807790e56a827f405fcc1ec3ac2d37b3cc9626c9d03388cf58fcced0d4d1c3604076cb5d96096d30fe142d033334e2fef322815707553875fc6c7024f639ff07c21910a34998c6b175e4f2dcb79b08c2046c085b48c4d00089321864a2191d10c0680062908f9a087c8f43e2721f03502e8a885804004986462c17044009beb4a6addc1d1ec6232744101893dbf2dde57bcbb88b3b4e7d8100ac990119c54183ad834fe28e070e09a576d918292d727b71df3421902086363e41ce8c2fb24d2a82d88214000198550421071cf44b4ca8c0022a002673ccad13d4eb20a53d12fbf00800881bbf112e171a7162039704475c77f9ab721018c8c70d023021709c17502ba988be10628e9d4bea23c1a47860231d119b3026c2243e08aeb7a9cdb170c07d677730f64ccf09ee609f0f39af46e767adad9332661c0929395000000000000000000453f2fffcf957a8214060000000000000000029a09b51a4028963ca23dd36c797e931388d11d0710304400201140)) <<< 16000) + 0x403244a7d7182d123aef2f691f83ed07ed1a3b281207ebdbaccb53f14f9539605de96e8c178202d38ab6de0d1da29069caa407532f395e0ce9aefaaf390a691826782dae1755af70c67b5aac307b0649d390ac9f7cb541a0a604a9d39037ab1bbef506e47ea148fee9b2e7f71aa06d64d1c2549b5aa3c74671b873c5fafa6c80b636f059d82c4c15dea7f5c67935a60d667cd4d3e303f9fef9eb6e98d192439ac62a90b02800231490a9e8850e44266a2123106c968174543421a2110d0006d3103f15f6fae4b8941f9dbcf7b11fbfc62770c2d6fa73bf7a8b4aa2aec180000000000000000008e3598de0e7760590a18819010a1061282a809bd4b15b490c9acd98f232b6991d8373c08d811e1bffb87a38500e083f8821ae2775e0aa7a5f611133d69cd7e7c16620b68fd701e1e1b209c33cef2af37cf4d62cc3f776a48f1e2dde8261eb661426976b202bc0b38dd7961be121c2745196f23d079a2b46394f40013a4e10e0640ebded40e08c6c8be1425f08081b36c4825f80408440f4a8708f0c05e1585ae83c08a0052c684925e8282a80a03184a8b3279000cbecc61d4dc8905b522a12bc228395c66c3003400012c1210350c114883c05c6141516d8c287161ec8c9d40e1840cc5b10a76e58e144b722a49061804d3f6409040215548f8b6786085238c2c400601316de865440c000044aa20000122440a8071c6019ba26ee1c583c1a4786165f274f9f091841e25ce9d1183d2e745c699639babdd4111011bb74ee450e001e867c44805020480100001a93c584708b5ac531845d9f118ebd116401156adceb2163a9f95e1a52286180861c468fa0e12bd7f354a1382097c7e7c93919802411c7069f80c0000773594007d2400b0091c6019ba26ee1c583c1a47861843d24a876d183d72cb6b6d9638a09b7dc11010a15297f5160998f0170a0e001e867c44d000480100001a1203a0a01c0500d8280681400086043ac27c618209ca6ed8e2c147532461c596714a44c7aa2c7147661c06a061804d3f64090b089a650b0fee603141f84c39c18100089544001000aaf0fef16a4900290187187bc5f3dc8716077ba7ea45963948369885940112a86f21860112a88021049a2412ed0603416aae6e8302000f424005800986add4f900240040000e81d2c3851d77d4b1e684099b70b1a66871d408a1859cbde2f0a05d0004b4486000d7367b541002a64937f89c10900200002e6408824042120200900f84807804000bc870c15ed9d9c497122df6043de0fe25080059682f0001227a0f62130f1e4080e7fb690850100053bb6072a84300216f683ae6680028533c22377c0001f42080b80b000041247dc5641c2b20d158fa02e06091c02b618030c58e35b5a040916a619cb4f799420011e1a3000244b25f637ab9a4080b995eda04080475af1e38980e08608cff008b181154af01262e201912305604081c33b9ac5e30f2064d7ba467f42c7180f89ef4e218245fba1647143b4912bf456044df310303b647afe140808171065fbdb02c00af622f823c0a01b3e1c24bf38500fa12305c05800024023e63a1f21d0f88e87c0740ba121ef0100027d903f09e10486a6a65140288660fee360381c3e2111d2cc728e1529b50bb91ec2040035a4e90008002e7329cb08101189d18d0640014dc20ba1f4243248045b891708a785a0500002172418531ca25e1205c0c3ab020592d8dbefde1ae49215cb2f24cb040e1d0fb8fe29c50c33208eaea8040a0017d78400058882d441877d250728f4f6a7f002020005f5e10019120058040b2527e0a594e50c42e6624e720507c53f2e196224c480e2c8a0f4caa268a0202078c7e58a3000090ced06040002a471ed6800250080000d49a22170af8ad63880fb257b6428349e0d851412183c2e95b6090afcf67b60458000725769b2604250080000a4920b05d110df485d011c4071def22e941a5da76112490c1a95c37244857f7d8eedc20000e068234820008bb8c10e700250087cba00f534616cadb3d60ee81c7ce020e17eabd2d485a40df3c05c000000000000000000124c1f23d4811140a9f66db42875d35db7e27f63809e5bd25f2c7a20000000000000000004622c82882071c4283243242b80008034000b1490502882404000904606dd6af6595201dfe43071b1c1002dc6c001005256706d90801df66d3741404f2ee71a94409002000027a48205440e2a206151028a8810544060a2020110080880004152021ff010ff0087f4040018c447f07607e3381000802380c4e03672c0f16185520050615dc0023141c00840500401000004447ec27c7009f98df8a00d1526504240030a5e040002855dc61e0002838440080000e520003ea46f8570140100458ea437ecda8e3bc68e40b068412b958718e10b2f369741052278f805012861100407ec2763b3101ec528261f16594105c0086b10400499aef08048203e0100000d5200042447e8643f2321f81903d8c8000a8c8fb8ec7d8663ea331f405de6ed10e346d31ccab46d80fd4ee36c07ea78128ceadc7d6079b42312523a2b5e1b6182fb3d04813cbb9c61448b0837f84bb067247059a810882ea05753117c20c51d3a97d4478348f0c046602b66838f02604490d99a44120f210947d7af1daeb23f471caff40000000000000000002429628a19609408095b3ca920368a0c1e1f16b61e789c37072ea8b4d2e9bf04b0568f1aed92c4054cdff0e9f9cb1f50a81b1a488e4071b5a2c48f8392f382a4a7e504ceb55bd6a2e2915b910719dcaf97e37cbb0c64e49c433b1f330156deda)) <<< 16000) + 0x114d6c5b32f48e4c7c4070842ac9b8a1e421a963ac17502ba988be10628e9d4bea23c1a478602320a59ed13be262eab849b2235506119c0c379451df9e1b1085882a0000000000000000001206b31bc1ceec0b31432c01c00c0080545f6f9bf4edbd894a609eb4e544bb711857abdb5e52a1ce5fdef8d132d26e5987062ddbacaff3c3f7f0ecb2c14644f8644063a893e96c1ee4e647c6638e97dfa9da2653b29b78b17242143411ea7358655ce5e37c35d30c7e80632bdd99f5210138a8002a411f3250f91287c4943e04a05d110f78080034048f714c0fc2744207552c190b7d77bdfa797b83432ac167154e837a6711a2dfda4671d7dce48911fa6ed3413c7f7a5a5a88f2552ec445e136e9b3cec0573be7a8086d8f2b01cfb474c85939e6a206d1414227991d824c08f985a446c5245c9f82a4609a8839d4b3f36a9d67da1c8bbc3cb15d432ed36a15753b9465464720cdf44faf8260e0bba72433f90bbe4cbbc687bf0cc16c3eade6fc800af01c44ea2051f37bad342ba945acab5d7d75a0b580f603385f313a03df9f5ec06e1ab92efc23e0a5976cabc6c5f5836fee93b908ccf3918c9d3c165e8a841c37bc896991e8eda809da617a5a588d57bf8e99e4f197006c7b029466e8a3c17a43b03814ba12b17cb8b68aa14df52f32b4920dd5208611a9a72be583f3ff665b0b0d34ea1007fa7760772d52f972ec32a4cfbedc26de919512bc72fb29fe09b7121c5ea8dfbd295b85c85d55f0444db8d110bc552c7879c63c177d7373d18286ca36ebd1b694dfb78cd451fd1351a0b44093ea2088a51f43a0002d8cf3b39bea31ed6704423b7d03a3670682665f9ac24fd10b4401cf38000000000000000000481df4434203bb9cdc307ec2958d5985edfba7ca096697cc585d20620000000000000000001207c2018054a299e19c9c04d1aaaecf6d377e4693b5d2ae183fb920000000000000000004631c31431c004045051af5caa821d108af3479a68272caf6fa7dae1f6dd9f599a16ad73130ccd80e585dcdf75ac0a4eb28d1147008a17f8049b6610daa09a8b1dc9558521926d4392f883d3d5af92dc7773bec2d9ede75b6bc81a622c2abf46bb6c6460f0e16c946cbd10b7b2dfb84d5b4ed8f1c8d342124825ce9444371a115dfe4462ab072885a5f97ed03a89c75e509e889ae0a8d00081f20485200266c2116ab1ed518f626c7ad263d48b1e9198f40ac79c463cc1b004c2123ca231e4118f186878807c61db02e22098bc7f70dd3e0f25623b639650b036deafa10d481af849b2bc35c82375a4716a80dbea4e96ecbc9a5fee6f6888d08b00e02d192f02597c5b55e0be0b7559eb3cc3600120cfa9c6c666fc598b0f18e517e8a8400000fdd3c6492c844cdccce55999a668dee81402abb6dd53eab1ab09a91fdc82448831880f084fb632d5224cecfbd9d54204b47f5115ba81609433ab71f59401e7026d48e8ad7866e82c48f02471ae594856202eec403424830724720224004301a9d656c6acb2da486132eca275177bf443e3f547d9b72428ff16d0ca76be6a91c3242037b014d5fb53ad7fea497850db206a80dd11f43789630728a98d865b1702ccb1cac0f7a59c3559f12478a8f06ab799c126cc14747c6d0af9d078a2c5220be0f40158a830e040f337b3ce344d5c2007c667060ddbade8c10117651401f088ac423e4537c2090f81c00005b64780a60483bc580e623a2202f41a88e4af7f9ec96d05b2cdece9c3420f10b6ba74a61c7e48b80000000000000000044bb100cca1881870460440450000110e5df1c112d84651442397e9da31a951e931430beb6656533dbe45e4e90656fb171cb54e6d73e7b3348f803b32b630c428a8001a891df350ef188774b41fe521dc210ec0080029608eb02e4511085c19e386bdbb0a8071665108d8110af7dcdb9c302433d990929fc042b5e5c40483a6a3ec6830fa5aa2c0412b86cce0fe98447fecb8700c35f87ad7dab8c37c0900000084d707af372b7fb1afe212d9269c024344a48ac2392e7e95be218f1382c122888c945e0cd2948505438ac693dd147a9b9a99bc181139fae73c74eae5db22202262d1f155b07fcb6ba820815e540127e12e6aca428036fadb1c006b0054a6060033f90ab735e19fbe5088022126a3858f36cb43ba4844c2460111439c25050076014000638475cf43b6721da350eb16876434000d8273ab71f581e6d08c4948e8ad786d860becf412683511c95eff3d92da0b659bd9d386841e216d74e94c38fc917000000000000000000887e5fff9f2af504280c00000000000000000534136a3480512c79447ba6d8f2fd262711a2399828e28a20811200402000008547f01cca171984dde9d3020c2ccfcf472dd13fce856f3a1a4d249ac814cfc85542cf8a931f46ae3408aa789242363b7abd116b2992d59949e029aea9aefc6a20fb0325097a9dcbb91e055e4b7c8998dde1ec4354e87f72a6b20b8a9f6aba45dc3b8714e1a205347dc8ccec891ddcbb2ed520b73c409a80000000000000000008da0d447257bfcf64b682d966f674e1a107885b5d3a530e3f245c00000000000000000225d88067e5fff9f2af504280c00000000000000000534136a3480512c79447ba6d8f2fd262711a23a1829429228e286020800086049f849fa67dab5e61f98d81529ffebd23a508468c230f2c5cd1d4d9f0de566418f0136745a2692376192619b85e8d62cb9cfeb36a52242874794ab44a21dbb45c320a0b44f70d00cf53d354528ec0080019508eb02f1603988e8880bbb100cfcbfff3e55ea0850180)) <<< 16000) + 0x0000000000000000a6826d46900a258f288f74db1e5fa4c4e2344733052451c5101041000000808e91162721070db85f578798f8ff074a0be1ca38c3a48293ff10dca2b20bd08bd44f51ce8e2c017c954711cb4fc842cd88efae89e02ca4215b2ac8b6ab7116aa44f78fd5ba43c9b22394f33caeb82ae73f09f4014269680914ccd4d5ebfee10582238a323578b79234c208e1011b4381b40c05e5a6a0209b616ad7442838cd605004bb4c9346209806f61800eae659fb92fe224d440110b77fd366737aeac5545d14e170a7384508c0ec028000bbc8eb9e8758b4000ee24755043a87a1d311000a39903f15c841e328a1fb5c33596e94367b08d1c2bc5f36598fc69d64e82c74d7ac8c10e3334f696591e76c1a385d07b82042f31f5f05d764c2a60a87079fca2200a06636bfa4f4b0b983a8fce7a18800754fc04bbff18a993ea19d02252a2a116737755776d806347b537a03a5f31de63584bf695d8ff5529516e1b6654c39535d61181a447000081c6011613df022d1c3021a2ee020c68c5043cadd06882f10006dad3258ac81c0822d44caf9f83005b34993c1469011014038fbe50f79c080c0f43e7078891f78fa73ba2f02c2f332178180000930812268748c43a25a1d0290e78e87382639a0a1cc0150a7e5f71b6a4212146a88f9f5524405f3c82d642500e102edca74041450033f4970afad12049f56380b00a3803d504714976a28a02102f9cfa32528a86e9609a50951a8e885c060b1883af0fd51c30a15a76c944a2832be1cf4f6c121e55e772cfe080c164530fec04004882d8b2281801bc671dc182008026186f071e25080a60692ef383a01480c2c61953408b08890fc422343f2e2030e0dd3735d8b08151016c2ec10203388182f290040d1a35a081002113872a86250d421111529ae7d453a8ccb02a01500e00007f080021091cb318e516f8c23c24ff583ce2c0c86eb8f4c34b706f207f758b2c2ec5ca47a224701f2264c604d180815d895813069244a182ff8d152db90f78ba30500134fd900369002a0185b8d8017f735fca0d20a0307e77aa4e5ac1209c61a59a31831a298296104002064000401a0002446dc6c00bfb9afe5069050183f3bd5272d6091aeb6a53d6580b234b30a3052c53042c4181c27ab82c3cd6e53cbc0fc97dcd2d12d1b2a015303e17c9daf7a7b67047917680010b906c05e9680ed1f5aedcd28163205aa3f9855db1f06a37430511a3886e62458bbcc02524638c11c82b82a03016208d1c4373121c102eb397290650003e84c3e718100006863486cda5001581034b22ae2e29cb1a502167c97e20c2a813961205868c0ddd4e6abd18601b9f5027918288b57c1dd78b16f7520c037a608b45c5b14342c40019bfcc00492005203000020223920a1c80100024a1e2c1001bb371a0696ce5f3bcdb672cb0ef0f5f353c1650b5c5da9c81c91c310cdb8559468ce3face4f17b34500f1d8f0be7182cf29b652abcc3088782042e47714480168142dc6c00bfb9afe5069050183f3bd5272d60904e30d2c91cd18d14c14308b041032000200d0001223a58a021fcaf0c29cf4b6243240c0322412903057674be845162437dc23ae42046b52b9dca380000c764350c005e8a322514021280400006ac83602f0a7b43cd1475e5125e292347a5881855606917f68c30dfdb3e38043056959ee45b9658b352a8d885f0c10f53d36165d962258fcb0ac6c1c104a69a1edf2080025f93bd60b1a800ac081854c4dcd3e90a944a9feda732330c325eda72e0ce182e319fb6eab7162d8ee57bf4c59821b3bbf2cb5096235f7278c5890e08019961bbed8e003c21ffdc974452005805000022123920a1c8010002599000a103a5b6a7cc3df591a50185bad96a21851231934564994505af25ea7bb18285dfd62780c162a1bfb5c41b9182405f7bd78bc962046a396e38906081759cb948369480160102dc6c00bfb9afe5069050183f3bd5272d60904d2cc28c14b14c10b10a082001032000200d00012236e36005fdcd7f28348280c1f9dea9396b048d75b529eb2c0591851649621421619418a0e13d5c161e6b729e5e07e4bee6968968d9500a981f0be4ed7bd3db3823c8bb400085c8e382f0aaccbc1979ca6120b1902d51fcb253c3abba92316208d1c437312284720ae0a80c0587bcc02524638a0c468e21b9890c081759cb948324001f4261f38c080003431a4366d2800ac081853cac5e3f5b0c2410b3e4bf10592934793e65630506eea7355e8a280dcfa813c8b1045abe0eebc508ce53e957e72c3b0d8bbdf05141800cdfe600249002901800010111c6050e28080012508e200800299c8e18c870864382321c0190df8c81742437c121bd090de0486ec24374121b9090dc0084e40400402246dd4636c9b1b5498da22c6cd060565b1b22981f92c6c4861fe3b1b0198d78af8c0aeb7c0bc6a0710854c74ef9000a21cd2e3248d00103115afa2c1cc05008885761b3e78902ba47a8e62668e0280703908a2b0803c5dffe8903ca0a280288088ae4a92da1bf2a10584b2d6a0555f810f85e06089c92fe423c536e959e071dfbce2dd8336ec1289651029a2161921160920a00010444595341759b5abe5ea846ef13964cea67eb7c6bb373028d0265b28835c5e412c372358db2490c3a1adb222020c4acf64cd043b4904192c1d8514518c904928952a3009c40880203580a00018023561b1850d8ae86e2724bf908f14dba56781c77ef38b760cdbb04b41a969ef49405dd88066506502402382200180001245b6a2ad6c583b4d99ed2f618a4442373)) <<< 16000) + 0xfb7aa1c2723182efbf6adb2c39003150c7010d48080009b08d70cc6b447a6be6bd19205944a71f82a10291b7ba18c58395c47ca89209312f0d02800e51fa904004c2044010b28b3fea71a40909bf94becb07443ee2e22413051b14f08040be652a50250c220080d60280004888d58ac614463541ba0fcf22dded63a57f1ac153fc3eeef4c8c867b53584431372054886960939a3c80830bd85f17def7aa11acfca8f70f0d8adeb665ece097980070c00681cd35ae4dfe2754c385163ce6a348d1c5d93e7818c9ab714ec4f167316c347fd732ab1d4a398a86792c6bdbe15ac4bbb73a0408060030116041aeb5ba1361193e193d555eeebac4e008c61485c47f9ef8fdd4e93095b56127cd4be075f292da78f59c3ed6b1cf65d97704e1687e00001ab66444ac661c40c6745c3d2bae676bff416a4ea3ba0e749055c6690f30723b07627afca5782d42c6ae7c84f1cd1e95026123840fa2bfba392aa4d52f7874e7b07e661dd85b67f6bc739d3ac2aa4f640806875de5219284b0f63cefc8115805055d2461cb335c0653ed400c66f19c018e021a90100048291a8250d39280909400183044a07634c331a5158d20ac064463461b12509f6c65aa4499d9f7b3aa840968fea22b7502c1289448e21210a1061140900809e108d9841bba780b3222f8652e5e7088ef64a11f7adf1eb6983a81dd0c01a981df586fc949ad019af72873156e08b47d99bcf5ca0cf8cdecb6440a10e5aacc843f341b6756a618785031ffdfd4c5b070415c03235e012056e410ea4801000ff63d37e0e1804c6950b679101095ac2c73c9006c12505605000025723445b1a12d8d012fb632d5224cecfbd9d54204b47f5115ba8160968352d3de9280bbb100e36c07ea791b603f53b46d31ccab179bb4438c2543432831420c20c1002bde5427d2bd129d260f4fc8dc82027ef1d48770756d5211ac85b6b12e90587e5d3895b288ae901b34e99a60d1552a4986535e35cb290ac405e83511c95eff3d92da0b659bd9d386841e216d74e94c38fc9170000000000000000008976201c6d80fd4f236c07ea768da6399562f376887184a8608388686606480080dacc3b6bf2d445a355830b5b7a536117b360d33a86bd4204f1cbc03d67af712f93113f25490fcc96a7ddc466d9af9f9d5daf7bfa7c83ffe0cafc8fc9d6250525063a680023290d41d0cf8683482433c0a000832233a7a19c3d0cd9e80fce420e02000dc72334a31994d8cc1cc65c3632c0b19501de6ed10e346d31ccab46d80fd4ee36c07ea7812822724bf908f14dba56781c77ef38b760cdbb04ad7a519dd16f54e26bf9df4e1f0b529b8b3481de953f2b61200000000000000000208d6637839dd816820640268040020022f4b8ce6bc16f03a4d05328819a8ea12ed04569c8d824a26a69c35a0078dff0b575da65e56f1c2a7c14020b9d4d5ec6152458c17c255a2bdb29bcf8c2bb0e9499561c55d9e3c99effcf2e72ad7b094a65f456caeb7fe3119ea2de242cd3bb83cfa1fa8aec8414d9f2c274c157d0a4f78382a10a802486a80915a0ea7ca747121c85837c3000221c1f00850705582bce4866d05ab1200110c100040604140001344648762e63303a118ca06e42d18c4cd8405384414c8801b356a1180000846603e0100000ba20004c640aca63262b808890bf7b85a868b806e29be680e8069f7f17e16a02cb9ce474bf0c1a1916d12bc3b93215dba6e4662762ed6407d774223b383fa2bf26c6b23684130b2f21e04ea313f64357b09296ae0346eed0c8c3e0493ecb706d9b3cb2bcfddd67f5679e1fbab7cb3085728d3435fc62c72ae7db86b80645c40152e9d3a1ab8403f1ab78856cea80b4b7f943fb4d91666cfbd6123f0f0660147877da7c5989ee55ebad9b80149ae91bf9f1c6e9b7029a80f3a08081069ea0933488dcdc9e83559ab8aad835be827dc7775c08c3aa85fa2b3457067e6d3b777868a2abf877546f382a6057c787a66d25e5afeaf290a01033c2a361426a5d5692f47bdbbeebc227f6840885cd5c4aa7c962e14bad6ad578e8769f85b23bce91eeae8031f1e5067a548898b68a9bd8d53b74d01919ac65b0262f37874a4786c2b51492e805dbe2d602c92a212c9c3d065ac2bc6ac80c542fc2597fe44331c45f7f84f3e798cf719a7102401004516c2c4d9a42600a1311873000221c230084070040100000444604140001bc4648962e64303a158c886e0309e986a3bd3ede24b39b59b85fc1423a37ec8907129a3c6c11023a1abc1183cfabc97b806f35504791faa9e46d303f127da71724da6be1133230c39a9eeb58e9606f3bae1fe2c82f221f423cb7adc76ec7625b0e291756cdfffa707a2a8b4b8b69eb9305fcdb0c2454ce6ed800fd5568f9410f234240aeacf3456c804d2d2623dc3ef285973702fc9c378dbf6525d32c394af8bdac4c7d45f0f36a5f1fe659245f703371c229fbfd6cebd991b0c9683000001d2855e550afed3005bdafff74f771e5635a52456a531d9e3cdc341a8724d2ad339f33d23f8287b1e3b58a3f2538f16701419153fddb5570b529e85065ddeb1883396e81da42e9e818b47e186d58222a4bbec631a57f82fb371090cc92b26874460f1e8635f978c85118308b9ef3ced198e635a06400431e0200096220015d840057b887f96c638a631a4318c198c58ac628463121b90c39d9ad3c6d11dbc7dbee23d11e4e4d4d5141177b50150efb077c899728ccf9a5952dd10c232f5dba2ec2c7612485d4d6ea6f6d1b3cc6835b314e84b2ead0033b70ae2ee77eefbc8c806003f05140e24d82cc)) <<< 16000) + 0x83b4325b5e9673778005e5ed3bb8a26f44c243d7a17e0f5c630642c06ec18ed9b47d303d3e1193def5dcf8916e17e449485138fd9ba06dafb63ca194080fba67adb202e5ab96d014fddb4a590e338ef306b1c1aa058d6637839dd8171b603f53c8db01fa9da3698e6558bcdda21c61299a29a0900a001e0140008e003512ee22a472d6d366cc544a597e72de40ec23a35b2743ec0ed2d0e71741e62c891b28001409188318c396c618a630a4b044218c20ec60c6618e1b04301db8d802fee6bf945fa38c44d66f632b0411d06a5a7bd25017762018d6637839dd8167e5fff9f2af504280c00000000000000000534136a3480512c79447ba6d8f2fd262711a23a9e608124016000019ea8eb4aebc141b1bbd2aa32e94b096fdb174ac55fef88505d75a73ed84768dee75672064acf0de00fbf88bc84f57478ca1917aca022004aeee210e1ec8344de82eac2188a1f16040a3eabed9a284b7e1ff0a180234a770a149dbdcdb2602c85b09ba200228aec218052aa4bb0000024e5040010e004210c1f1c0aaf8227c0022181e00840500401025622000037230403c270ba346b2a277126f277473e5332353221f6b2f1c5056b938c56a86060c8b00d1050e53ed740fb6e6038350bdaf70f6841d30f86c6af282200a6d3979d353d82a8920484424148a4dc45244a4d17a5c2faf8aec50107a4304b1e78c0c5e20aa3b4ab3e6d41c3b36560e1fe14bbc8cf800007b637564052376ac1c97e5b4b0421e934271a4f4b0b6ffa69713f01dcc5166cb1ed3d09d8a559d0383dd41afffa686c4db379cbe3855c5688d29a8cd176ce1e5a3bb23225313e81a8df9ef566420d62dc00030c90880d0003989181090004659180198bd08c174176e3600bfb9afe517e8e311359bd8cac1046851b5a58fb4e4ceca9482ff54bb13d75ce72c9c57cc0d7659ee1000000000000000000235d8806ef306b1c1aa058d6637839dd816a78e902482900041080d4cf739afe6c3b2238381781ab56e366837e9a72528768b41c1e2895bff555d201bcf52d331695fff5429bbeab114d7ee055707613ef14a0620c295c238fc5a12871e57598de0e776059f97ffe7cabd410a030000000000000000014d04da8d20144b1e511ee9b63cbf4989c4688e4892486206182a0060058018874f62c4262f9198a58ecaece26bcf6ca8b78bf1f945b64aeff06236681dd205b9dff180d89574df589c1781c52eca2b2281f3e26d20a2c6a6c8d6c5440ebfafa405086c0a20b8c5112bccf2de8800157fbbc1098208c02001803915af7e9b85bf1b2669e82e469c8e77a51110554bf7e0346a6e0cf0ce72ec5451e89e21e6984fd20436940ca6e20142de7d20144625a2c3b272cdd1a30e22554902c5ea780d01675a6dfa05212e382719abc67aecb0190b0c8a74d270eaf07df14f2c559b3010d0f6a5294ee2bfa003a439037308da0d893fed056328232eed209831ec5c000084e43dc24000b584474462fe13d6637839dd8171b603f53c8db01fa9da3698e6558bcdda21c61292041a11010611a0120048c70291e08bc756d3c0059e70dc900e52a410c54712151442a8df4069be171d0195d4e86dbd9051e103bbf1f0c40fa3050002a820017da4364a42ec520ed250159085f8842fa2200111d22f88b01e4181596e2700f471be9104f879b398c2042d2aa5344d0012e7d66b8004830460108080080220180200817b0900001b980a008020000088800058905d1dd855ea64218304f190e14160541bf69d00018c807c020000164422027408de038d7424854a8fa71728c52809277c4c2f8c04238199d41709128689a01b91bea22493951c5956cd72435dea4e218cec043a3912327864238c0b6dd36a8f66c8ad89c17891f1688749dd5e1232cdfd6f78030c39d73413ee0401663eb4bbc55eb25cea4ff095d45c5a1fdab7ba04f8007fd6ddc3b3dddf027a9d4d23ab8f4d91a115d23f665bcd82cf2efae73b6e497dcf3074b2330bb61785b6812b68b0b27fea993ac357fc3ab58d2d583348a2e179c5d9c680000037f2ead71721b86349aa19f2ceda61b1965178095e329cacf5a53e03ea367647720028dc02b103a4a5e48de171a21507b208c9d8750e610e96d21b67768ee2e0e0f5a89a576d7cafdee2440842b165f10e63695a5a83a16306710b44a6e0141fe9aad67ca4604742908d08ea959166b41e2e5984e877537f79b44e748e256c22569b9e3955bfa0049efefabca02b0eda677f97680455bd7949c29f54ab337f83f745bb0f7b5343ae3df49f2989c939808ab3aaf00016c845e8162f2039181e49c8cbcc10082f70a7841349e50aaf0e0c181b6322890c16d2e168c4040376de808300335db684409c309002112643b39ea248c3cf695813410e60af19100951d81dd0b00df8ddbcc48032afe8570260c2100800009b1178118a682e046cac4d128b0c645adbec506654082a53403c1b7e6112051ca47ba4800cff6bd0800130c1080400004f08bb82f8d72ca42b1017a0d447257bfcf64b682d966f674e1a107885b5d3a530e3f245c00000000000000000225d88063598de0e77605c6d80fd4f236c07ea768da6399562f376887184aa78e4846004000142cab29495dc3e068288f98212690f577f7940e1d27f7c396104248820c9ec8f2f9ed80e75c1f2709925831d9f2a8c4827b181a2672158ef567aabc3178f380ca651b421153e280025591761d0768c80ac642ea2200097822e86a173250b90e85c4342e01216f05000c3390037cb22dcb20d50100203c916d05e2c07311d1101731da618f9e85315)) <<< 16000) + 0xe816d092b4dcc12a11c16b48e13a960a10000000000000000000000000000000000000000000000000308d6637839dd816641040830228258030080008ea3750c8e2d3ff3681fc93a36dab32ab0f5ea6436f58c3f992d3fc0c6b10693c2bc01360236750fa20a97015c204aa525d51d1b25bcbb8a2630ada89915c07e590420ebb8b01cc47444059e08f6311411bd1d6ad2d9174b1967d258c24cb1ed6010ffb610000000000000000008931da618f9e85315e816d092b4dcc12a11c16b48e13a960a10000000000000000000000000000000000000000000000000308d6637839dd81684085863022821808200884ff5af95209517644d51c756902e8a6789c25450c008bc1c7b89ddff5c51b58f3366fb70137124da58eef532f4fbab8af29b115ac0dc93d09881c6663fef5e7480ba1f6f4561efa2ec2d8c7ba9a72babe4acc447ce798af1e06b2eac4036de1c29ec72dd435414000d4845b0e42d66a16a310b49685a0642ce2a1661107e8683f0340017ec401b23487f8cc59407a10ca1337f00c580bf955f6b92140410d9c91948281068ab54dc20801d2dcc61628a08095f9e25130000419701347103bbd332d97080027a375e06864a1445702a024492668f4e3014d61b1a1a103e34ee7c688c357fc13dd499993e131109912d2408e2d46633c63a07b0238a21078f1e78017d4ecb8b8007e445c7cefb61b8230132f56f5dca7742f6d2e21c92dac4200110855c7eb31fc53422d25d9810c0002858d38ea1d72b7b3d601f3f460ded018cba1d7ddd4a07cd2e96969e2c830e5bac2599b5800393958f080c0b5bd969cd97efcc57f55f1561c04f02c813163098b104e74bb6bdb968a70851d8684dc7728333e6fcd11a457763ab267340000000000000000008c7f290f7ecae8b7757560b8263fac946025ed0e96faaf63382298000000000000000000230d6637839dd8166308780400300a0a200124eeaba8424be03077f3c4d45e0ec3167b5e6f98610d1e8a0bd7b815285e310ca36cac7db301efd8382ea40cc095768623cdb7cc26b4b7347c08e6ee67396127793a230310d3a49f062b8f89a14730c59523000059c251b1df97de37821ca57e46177796832c714cd2622e96c1b217ce2b2ec23d642ad0b053240b004ded02729cf5911061ea36e690e935610408cbf59bcc8d791102af85b0a740f855a741f5be2fc45d494a2c93cb7c7c921410fd662cf26800d5f471f8a006a1d5d0a00012101100428ab6bc02eb0b0ce10639990812465b859ce004a2a78e018012814af8000945088021041a6957e042cb88b1ab770c104efab0b50c120630373ce0010ad45452504220084010040100000444584242c00a14d050000c3115f190a9828000b708af0cc108662ba3315c118ad86c568362b21307705db8d802fee6bf945fa38c44d66f632b0411a198b7355b28b3a4a3bbf11635181c889540f67a0316463cffd59e0000000000000000000908e3f7b92f2483c8f5560b8263fac946025ec6da7cf2dbf3d418400000000000000000023270715e5b41c8ebf626acec29d6c150425e943d40dc192c4a0a60000000000000000008a3598de0e77605a9249a012008356a09becc0b8d8e92795aefcdf3be5cfed29d76d189397a21b8b7383e0674dc3c370f0fcdc54ca0d12b24b4170e55d9392fddffcc320963a9507256f69efb59dc9917ed299458270e68ddc4cc274dcd5ebb60a61a179daa28b74198a998e0617b5cf6ad28ae660cb7274bc4532009d1f82287de015f6b65a6202d10151ccb7a63079e12c8015772980cbce5f48733263300c272e577dcb55e365d89cbd6d796d4cfed89ba4bf51100d351b47e2e6c198682b92d14b20dec6a81d2f6e67f3e7bd126afba0cd839f3b040dcdd9f310312e5530b960e2bc9868cf0c4a35c47cf0383b913a4b02d0c1018c049850800210080100400600e198b7355b28b3a4a3bbf11635181c889540f67a0316463cffd59e0000000000000000000909c1c5796d0723afd89ab3b0a75b0541097a50f5037064b12829800000000000000000229e08f6311411bd1d6ad2d9174b1967d258c24cb1ed6010ffb61000000000000000000883598de0e77605a2269861659a00a005c07f756c9d892315496ea71581cf7c7ca315b87806f6db0d23e43181932211d969e84693620e1e0970f11b82dafb6f8084728a67552fe35475ac08d1e13f844326deb19f821d68fcdb9df56bd4d02bfb815987400010e4fafa7a5c87fc8330cfec3400771bd5971b3998ab40609140286e5b5f4001de087b848001f7c8ac0cc55c462ac13fe521efd95d16eeaeac1704c7f5928c04bda1d2df55ec6704530000000000000000000463e1dcaaca06f878eeeefc80ef892d6f9bfa5796bd3b28a005b0000000000000000010ced4031acc6f073bb02d0f2ca28b0cf00b0101e83d9d9907cb41fcb45feccb4d0e461e9ee2193d07941875b668af2a8e5f9b6c7f8a8bd5f69c577701c71d8a99dd8b051e44c35d93f9ba257496aebc0b6f25680e7e5e02615a87aeffe93f2c9bea4a7e92500055822aa521541d0a9868003c7c8a91c8078e407452001a1722a28b1504181d16e00802008f3f76b68268182a19ac70c3401012e7a291821080400002a88a784c5381629a0bceadc7d650079c09b523a2b5e19ba0b123c0910cc5b9aad9459d251ddf88b1a8c0e444aa07b3d018b231e7feacf0000000000000000000484e0e2bcb68391d7ec4d59d853ad82a084bd287a81b832589414c00000000000000000114f047b188a08de8eb5696c8ba58cb3e92c)) <<< 16000) + 0x612658f6b0087fdb080000000000000000044767e4f176dd911bdd0f40169e98a7931fcc27f146d3ad7bdf800000000000000001095208205400a00020d59cf807400f0e3f22929d86ff7e83e9253c44a5ba89673249793a15cd9bb40482af044ea5843572b2a6831da96bbeb1b47e4abdb4658b766dcd2538783732303882862d53140385bbab4e0cc13ade07de77d1594971946d8491595fdd3259c75493fd3ad46f6cee4252ff7c423b4cd0fdf4faaf6cea95706a667c5cfa302e9a8da5bf5816ec289d4c848b4222379f0d2d316226fd746fa2c4167295a800518914c198a582e40addd833500008480800200000ba452894292421481d0a38c81146428c32145150a208850c242840a141010a0008003440df051554cb0acc226416b4ea933114c20843b7d725c4a0fcede7bd88fdfe313b8616b7d39dfbd45a5515760c00000000000000000047471fbdc979241e47aab05c131fd64a3012f636d3e796df9ea0c2000000000000000000118f8772ab281be1e3bbbbf203be24b5be6fe95e5af4eca28016c00000000000000000431acc6f073bb02d4b1ca009008010100093444912752c576f3eac4c793450ba29a39eacffbde7ed0364d64621acd9c49b7081b8ac4276dd7d8f16043f440d96ebbf7a26ec558214f4b6caec591a3a8172ca000190862d4c4a787c1124798bf4a9fb4a063a2c2e4ed9c7d3abd524594a1d92f4c4e104f18036bfa998173db3bfa2cc28d6c917ea304b924b8a94761ca908b402f25000883200698444fc040079e244f8173cbb9c6000f422f0f038efde74a21740a82332ef77efbcd772fe3a864c49d63bb59f7e0f6f56cee7c55143c7c8000000000000000000120881030cb00600501000bc9bd9773d18ad424114d694ccee54d91ecd2d4e40325fa23846403480a40700008220435aff0af94253769e21c693189740be45cc949993a00ec7b256cee910b4c1e60607c7a1ce3167eb2924928ea94e8fedcd7b9746a773cf576ab69d6621c39ad526d5168382c619627474381f67cc0af93eff63093304e9b9ba00b50ab9fa6e513d0909e0284ec1427402000671200916470608e830fde1230b5ddf435061446283d1566013796059b62c03bb1abb920802a75fe5890301188993168a0a2000556f25089400021f36b1504a24ab8786941cee84a0180002222009a404036e68e0400164439f600689a9cd9659f36f4cd5783886d000030411f40eb28a13aafe00fe6d9e4e6bd12534a22ba3009000aeb6fa77519e08e130a3dc8358b5d58a5ea3d8d008027de3b8dc7e8542737f7bebfe432611086f4fb260714154050010003eb4e04dc769dc5aeb3a3697ba74977986b5629320f03ad55066f4362798ebfb509b30553d4c6afa1e0941bd5e8e7923772600d0934a5d97b1af4fbac46c462637e121f7ac2a6dcb5be93e486b51ea3ec689570ddb9bac8f701572a91bf4370c731fb295a8a047ca821009c8080019948072699010cbb39d5b8fac35a7d25e0d4d82a6003cd690057d82647ba6d8f2fd262711b4d04da8d20144b1e50000000000000000001f97ffe7cabd410a0311c8a089087084047004002004000042346d8041c70b860570465461a798efad14d3b3dff93b13ac6dc3f2c9e18aa927cdaec62cdaee68b04eeb9d2c6e2eb331d89313526e2d445f16eee89ec6ad13105e756e3eb2803ce04da91d15af0cdd05891e04941a969ef4940591411210e10c1120020000000853bde3567672fa04da4985f0327ef85a0746575f1fe49670131a15855d1c304c55b6846b9a36e4e57e985efb223e8b944b83400058c4119162708313715d0668db2b4ac3851c35c451d88045a040a9f0b401b16549001458ed16bb7c20017152a7d8c5700004d0ab4fb045408cbf10dccec902d0d84d7f9355038144595b1aaa128a7062078b71b002803ce04da91d15af0d21700f1004958547b9571c0591831621020e10e0060020002a29b2323e7fb43712a1e944add1ac0601dd3c769b9a7f55e4434f987bb5cc1f85fb9d5b8fac499d9f7b3a91d15af0e1d444580c12d6151ee55c701731da618f9e85315e816d092b4dcc12a11c16b48e13a960a100000000000000000000000000000000000000000000000003099020a21018e104090000223e90f7d1bd1085b3e6c2281cb7ffe6218bd465bb1444ebbdd7535a38198f736edaf69a2edb4b060e3c2a65d0d6d46c30f1a2836c52eeac4d2cc7a4169d3c08feb8459f110828013a51fe3b1899a3340014bc899008001e4889b1cc4d4d62686303f3189992c4c41761a2788b0b8c45b1028320ee9cb9c165be03879a6a0cd8abfdc807047aaf8cb113e6280808180a247b8b5ec02401aa36c89ab07ae00000000b25e27edf831cb89deeb818f0ec1a1c50a2c8fff838704a627c6440c275d33cb8e112acb8ba31c14b5e0bc7420206c8d7e950000102638230080990280005ac8989084c0440ee2212f110970680010ac800758103a4589694c4b09607e430061589580bb632d5224cecfbd9d54204b47f5115ba816094113925fc8478a6dd2b3c0e3bf79c5bb066dd825a0d4b4f7a4a02e36c07ea791b603f53b46d31ccab179bb4438c254185183182181280000008dba95af7d0e2339f00ba57b419e3c2570a53e72711fe944d6ddd9969530de33aa2aaaa008a2c3ccea11bf0c79d1f3c4f2031d00201dd52188a4c3e688a96821c770806520d83c9557df504581712bc05f071d408e0aa12aac6df852ddca1fe68e10cb3c7ff0554f9c3be6e0468e0487dd2b4b1ffde93fc6059e71987a18329ef0d)) <<< 16000) + 0xe492ad371a2d9c68bc310b0be01969fb90e38484b5b3317f0c17c8b4480232ed78928eab1bffa299776c3478bbde763161dbec15c952b538c145dc5b82d9e8c1ab8a7a7ad07c3da777dc64de14f24350f787ee050f680f8fc7ca054cead59cc815cc88d520220a324d354039f8760a7c85cd07ec0000150c3d3ac20c2e161a81e1eec29e0dc53f648e5c613de057e67b140d02b48a76a99a1bd2de761e8b211c8496f033a97491fa67ea803e0c541e95b07c4bbc856013bb156bfff72718537b01af89a2cd5ce2c4998eb53dce01fa4abbcd7d41550db3cb2806fd9bdde6ca51a85eaadade40ddb196eab68000258089512c4a4862503b1271589308c1dc4624a13e317709cdea7a9622c7c39a2d660e20f371bfa9bc081033ed1246e9900b896804d9bc8e0c67fc3ea723040b2be46378a39a0211dca221f2001f42050b00b1038f911eae102cabfb8229015c1df520920113b9d62900392c77a4000092b798d0160c2000440e51a6bdd6205b79a7dd71212e822769080a263ae6ea280e9d6848f0250c2100800008411240500013311231589108c484461da230240d89004c47c1623c0b11d01e0d2b73237e9212558cc94f0c2ea7140abe08213c2c4e18f00026a6915820082865660000098808c02101415fca5bb9029cba8f7592c455e47a092289a725e540490808180d2f84105467639a3c00a869ae6c004e2846010f246d6624682864dba372c09191b936bd03057ccb254546160c1e5d66243217da2a844028d7ccf7227042200808e00c46c07642191a10ea38789c4734b858a0084a58b08092e3126030e0c2f1c29d918104696064a4c0846010b215aff3e5d9387799c24db3081c696ef2b8220240d300ba6450880137a08a1c1dc47a075fcd0003714e9c6140027c514e48a4021300a00006d8e98156c0d12143ceda010a270c7de155ff1a347be73c5e3838f8683fe88045104bb084c084401011a050000a6100047522322200063422302be1c04ec84c887106edb56a20b0c09fc31fe8a0c86a645aa040e61f587de480400b3a5b6090000e8790b80009c70900200002fe40025ccf6c65aa4499d9f7b3aa840968fea22b7502c12e83511c95eff3d92da0b659bd9d386841e216d74e94c38fc9170000000000000000008931da618f9e85315e816d092b4dcc12a11c16b48e13a960a100000000000000000000000000000000000000000000000003099828a11809008408c00004f803c137d3cdfa8930376a2e0d0128e9671021b6559b926c11591ee3bf4549b1477cc9afa91592c903bf936a6dd8455e3c5617bbb83e75408d56e6ed67ef13854b93e39b37be0e1612d9347408940b0dfd6f7df9d1a9d96383b63026ddd929a439277951989f0312d3b174001bc488b84c458072405724ceba3088c428f090c1f87fb65f83845208bd310c13b4f6111404a1844010c2129b9ca7c307a629be9c0e10420b70e230542e10b290e015c42e1da0000bf162d4013061100400004e887782e86cfdf816f1412f29b4c343842a2e9f758a15b4533540302ca8dc98c0a085869e8ec5808734c2a78e0000c574de0050284401000019a222a3211415089888448440482211109000255111015087828005bf4885a084382420e02001c88221a9b10c1588282e63b4c31f3d0a62bd02da12569b982542382d691c2752c14200000000000000000000000000000000000000000000000006111441421010c1240180140000000bab3f048512d3929e63522c2ac71c514fd6645e54c20f841cd7e27f36096a2eaeac50fadb94033c36c34f3c74baab3c21d36c4843f1408db9822241f2223c84241c607968a2f03c4f74f541af8febbb22f581d1388c4b13925fc8478a6dd2b3c0e3bf79c5bb066dd825c580e623a2202f41a88e4af7f9ec96d05b2cdece9c3420f10b6ba74a61c7e48b8000000000000000004498ed30c7cf4298af40b68495a6e609508e0b5a4709d4b05080000000000000000000000000000000000000000000000001850a0c60c5084043040002672648e0dc0d43e7ad24f0abef4f58ce03d71cdd499a7e01e5bb5f076c4de96e2af2d02f3b82945a39cbb7ed7ded896dd9caca960c293860a5d7d4b50395e0e1e6803b101592917c1143a9a2300d7d59a9ffd7b3d0cb909ada333ae01c63c3b0fbd397f13f0a9a1b8a7604b352dbc682d07834f0fac18312961bdf06110edfcf04406612a50c6183bfd93502140627eca66080295d705c4000009cb0840200002e4442cc421442109190840a841c140012804418b420a521041508188840834001cea4404a6200520ff1187f00f038f5f4f978bf4107e5b96f3da124084abffdd34e0c8b3be0cd5b5b64d779a231d4c46045420ec2a9be1165ac966951cc68ad323e4e8d76b46b46b52f6c03028ebc23c2b9767d1fff2227beb51f2def1bd7316a98cb90726fb924d89403451f5245ba998b50bd20ae34b2e3b2d4c14c5c8d46989527251bfc2a6751e05032e227fb707f55e97e77cd9c8be6bbb1d19c463eb3bfe3f3822fa6a571d0add74ad82fbaeaac5d8d6b31c4fb68af4754937cf5ec2c77de3febe7042d90000270237a668970c6e90718c5ea6b5dbc70c8195c2aa59c85e1ad558d8198b7f3e5f9c87cb6bdb8de34425e47d919d5895656f9ca3a0c8c4143b16d410c800055037be8e45a201224d0da327dade2bd3d2bd60c7b1d9e05b1c3b171f8d426b145c19846200078a4659befdd92f274905f2e734acdea9849833fcb24a8f7ac598e8b672dc8645f3a345d4525fc4cfb64e4c80b147ec7931d288a68)) <<< 16000) + 0xc126cef360bbace2c171160b03c29a9b9b7fc54ec87891571c0f0f9078355e771c07e84c3f0176e360050079c09b523a2b5e1a42e01e200913838af2da0e475fb13567614eb60a8212f4a1ea06e0c9625053000000000000000000451acc6f073bb02cca14e08a08904b0070000feeff410e36fca5f359bb59d5d630ef254570d241f6590743b2203cb70cb2c60ad2e0735afed87d8e95157ea92664c7240c81785f6fb11fed65bad1d883e8deb79bb4438d1b4c732ad1b603f53b8db01fa9e04a002dc6c00a00f38136a47456bc3485c03c401235e9467745bd5389afe77d387c2d4a6e2cd2077a54fcad84800000000000000000826896606406504600400007eaa5575384904b09102fe970b19a48c9fd1958eab4536413a50454c2b3ba40c74738b0e29caeae0a145d7ff7bc7d0e42a82c725da7cc2d2b7bbe2f22427e6424d8a3baa0c4dbaa0ae5864c516b83de6f5385a026ac83f4b98205896ceb880a7cdc241060cd29a22820015d5dd79180124a42c5813861000430790f6a656404c448419b3047c76ae0b2c31e63738b28100d841b3101392f337610010ebfd170270c200080000ad90fb11044028000bec87a8280020bc87d0cc3e4361d4130e905d0a43521f8a28296f0cdf20e11804a7e2c207951143365808cd50bdf1c049eedf1c00201312108042f3768871a3698e655a36c07ea771b603f53c095de60d6383540b1acc6f073bb02ccc1cc1040cd009001000c81d785bbcaf6e9fb01fe3f77fad7377f98d2dabbef4e1030368e3f5da1564c291035d99a0fe7f9503850b92e6fc1a2cf475acd0a164e66cffe48084201000c01de6ed10e346d31ccab46d80fd4ee36c07ea7812800b71b002803ce04da91d15af0d21700f100489c1c5796d0723afd89ab3b0a75b0541097a50f5037064b128298000000000000000002299a42029a29428a22001d567ca5d8821ab44f9a38ae2355b52f9941a07ea725e8b289b5b43e226137bbc372bfecae94f0cde0b6d57a81df749c2d2032902d18afa419527cb17e8000fc3be82c4555f0c124683d0004ef21f01a0f70900031099c1c5796d0723afd89ab3b0a75b0541097a50f5037064b12829800000000000000000229da8063598de0e776059a259631e19c18609c0037cd00fe0a9429b2524736050ce24c8b021003020b27782b27adcabf9df93002e6f20e5995e74595f218c31624ad00032821ec2a0f50d00060d90da2906c9480ac84001b6c43d0c61e65b0422981592c3c8861e233ceadc7d650079c09b523a2b5e19ba0b123c0913838af2da0e475fb13567614eb60a8212f4a1ea06e0c9625053000000000000000000456bd28cee8b7aa7135fcefa70f85a94dc59a40ef4a9f95b09000000000000000001046b31bc1ceec0b3f2fffcf957a8214060000000000000000029a09b51a4028963ca23dd36c797e931388d11d4b28908d00401000083e064b529b7b41bb791dc49a4a2384ef60b5f63822709c7c510b1c963ba17b91f5220308ae014142be6ecc28bed94949ea7a22b474fc48243bdd37c061e8618d2b39b1d52b81268b380b3f7060a04a09da5645df7e097c87fd86584b9af79453700d177f31403356deda9b53ec87af8fd5d8e8c7df5f20e2cc019657210a805e7b2022d73fbc96009d5ae65000221c1f0084040040101e01380a0080200000888118c8000224c02f630be3b282298165640813448b31928018fd58b640009080800200001c443bc2400047843b8961da3b0ec0d87582c3a8161d203b71b005fdcd7f28bf471889acdec65608236b65d2eb5ea49bb6c6a17c8b1db501acb6d8c668b7b16fd23ef400000000000000000115de60d6383540b1acc6f073bb02d0a0c609100c008000003707ae67c2bbe92e50316a889d458a75a96b4cfba28249b00d426d0712d3a8a90929c791686e2bde9e0bed03a271464e73d22111f74d5d033ae857d5dd10d43f0da94879e96028020080060dc80437c5a39005254085800110c0f004000020487402ec40991151f6047da93d11d91c9b7ecdb6c19d7dea4819009d020b34318386840d8033f649fb4979219d5e8753ebc01346e0e226a4b3aeb96249d0f02c5240aa05a9b4e2c3c1b7bce05835d95c5b3b4932c83d72f5cd12601400093a70b6b7088476d89b518af1ece29cf65ed0b05d391edf1ae69b0000074b5ead3b04b1526558ae6f06a7c866b7838caba77fc111aae10d10d931ebc7d18e2301147fe31d1e5e238ac2a9ab071551ce6d0841be60000057a21ce1200069221b6139c1c5796d0723afd89ab3b0a75b0541097a50f5037064b1282980000000000000000022b5e9467745bd5389afe77d387c2d4a6e2cd2077a54fcad848000000000000000008276a018d6637839dd816848428268040000047e56075a1876314d2cd5ae4bd0838dc1b3f7c3c4ade7766d901288fa616477e1b16a953d0a8eca301d4b9ae6fb5f0093dd27feb5c7fa1b70658577d5e489bf9c4f9b9b086b37c46699b707b9739916301581fdc27a128c0a80af635699bff2a1f5a772eb23728f466ca93dc5c011710b8aed6f1234313e48680034090da3506c9a80ac841cc3a00124021ca2203a05000ee49bcdda21c68da6399568db01fa9dc6d80fd4f0257798358e0d502c6b31bc1ceec0b33883811c12401400800117001a89771152396b69b3662a252cbf396f01d84746b64e87d81da5a1ce2e83cc5912365a1977b50150efb077c899728ccf9a5952dd11820e766b4f1b4476f1f6fb88f4479393535418465ebb745d858ec2490ba9add4deda36798e06)) <<< 16000) + 0xb6629d0965d5a00676e15c5dcefddf7918e0c007e0a281c49b0599076864b6bd2ce6ef000bcbda777144de898487af42fc1eb8c60c85b85f91252144e3f66e81b6bed8f2865022c06ec18ed9b47d303d3e1193def5dcf8901f74cf5b6405cb572da029fbb694b21c670000a1e4390c41c6620e22d061948234941c2420e01d063888230140010ce435404008340437d7617e0ba0c73ef03fba46fd1df3b7fe37bf96dcb81e378f2bbc9d8a5f64329a4165bd310e185986dcf6f221c403c0465382dfa7deb8e4bb0a0c0ae5c66927bd658c70ac5a9e6c160cfc46819a63aa47410584993c9fff64c26faed8f556c64093f47c3dbddd459dce1b44f3b1409261ea7703ad4529a1155c6ba073b356ffcb7cef3dc140766a627f9acb9c40ee17353cd3f03e457d7146dd5a551ebce837081e000000dfcd8934efa1066a43b38b15e25d5d278a65464638211c43f44b87e4f91811dcf33229399f820aa24287520dd52b9e3ba974e14176fc3020eb5700bcd463a5d714b716b9968f96bd132a35c3683dc44ff84bec8b490eefce2f09dc202794c0298facae8fd39e3b1850050fccecf197618de2550f1a8df54bf3270b15f5b99978d7ae19ef2abee6cd754f962cdadc9a387762e18ca3458d365d77104cfe611b080191f880b40001188c0780201bc030dd01c0700401186fa4ef0d6380ca6a8697000221c2000800004310db05c090040100000444368a41b24a02b1506e0880005a4d89145554c51b5b787cf5375666fa5b76dde4bf72125a83a46146abed6e834384720b48ce40e18bc79f57fed457ea18f68c911087ce4e5e49b68af82e781f12fe6606df74a13d75511b403818c421426b9fe566c6c4e87fef9ef7921c01619649c149c0b89c15b14d319d0c8454862420086db29bfc80edb3d8ad2bd4c5a42704c7bdae5cb3474e5304867de11d6b0c40d0783197002222354d948c78f0ff8f26d6dbaba09ca4fcbceca3417c8e56803ba0c826de767805f0c7f016ef4c93eb670d90861d73934dfd25acbbdeab13914a4e2087aadcf810a8d6bc0cf478ff0000dec7b632d522803ce04dd48e8ad787591c125d609400249f002ed2133c921c681b3f7cecbdea0234e0e2bcb68391d7ec4d59d853ad82a084bd287a81b832589414c0000000000000000011741a88e4af7f9ec96d05b2cdece9c3420f10b6ba74a61c7e48b80000000000000000044810091ee9b63cbf4989c46d34136a3480512c7940000000000000000007e5fff9f2af504280c47634220214000001b0ad9e62b4493b3f84c44c13b5c13ee61e6e730bf3e3288906736e42b107669b4a81c7ed4590bc93e18f8d23d906c41a91fcba63aba214c3980d6e58e565ec3921545c349722e897725a9e61a83d7a3aff24d36aa9e6d51a27adda2b542af7657b23963f75b4c24bd6ce32c815caa0d2d308048b5a90664a24e5b86e33d3ca67d29dfe66ef670fc6885b9991a433783914bf68a24331f9274900090c10002036c17c19bae4e06921be22ff761a0732ba49b800118e1000400002cc86d10836474056220d80d0000dd998ed30c7cf4298af40b68495a6e609508e0b5a4709d4b0508000000000000000000000000000000000000000000000000185de60d6383540b1acc6f073bb02e36c07ea791b603f53b46d31ccab179bb4438c2542c41021c11c040011af7738856502c75f71cdf1567144a44b22fe77b6468b21a9e4200332c960f6e4a1dd0fbfb7a562a70e0b8ec5c94360e5df5e8a50bfcd63f2476fb5d5f245dc88f67a7d241980a2a590dcac254c2b660637672a6e85a602aa5ddac3fbb69a1dadbe2c3831711b28ba6f96ecd3048de2c855d04666880e4baa435484aa800360902b2506b8c80048a086b1283541400377040fcd417e620bc1d0118c82ec5417422002624379bb4438d1b4c732ad1b603f53b8db01fa9e04a002dc6c00933b3ef66a47456bc3351e0e1881202797738c001e845e1e071dfbce9442e81504758547b9571c05a1a38e31818c188002030997b647be4b44bb0315cfb5e075e9d94730c4805e5ac12c28c4b5a440d36d8f8cec063f78371c4cd81322e7e78a75c30911f61d07cb98b0c2e7cc7f2c52501392c87f3f4ac830c1995a8311a2049810481a86122e7531121820f54b3a90022129211004000046486a0cc34c461a41b0d109e8e4ffe94d526957c12202c109ec7df19966067d13c6ad828c850c183ec3a17989d6ae6037a527694cb597392094ee60c5343611c3020fe526355977980803b2f942bf2e8940181259d0ae8bd52c42008840bdae24a0e819179bb4438d1b4c732ad1b603f53b8db01fa9e04ba0d447257bfcf64b682d966f674e1a107885b5d3a530e3f245c00000000000000000224c769863e7a14c57a05b424ad37304a84705ad2384ea582840000000000000000000000000000000000000000000000000c2648820418448228228012799b00ffbbbeb76e6c4709e7f1b034b67f813ae5edfb977ca7cc0b05609713ca197bba6094e467cafee0a725efc5a8ebafefd8d90a0133ddbccfa7c8b7a8a4c566f5e48486529e755710c84a4486ad4c75ef7da1c70c3f0589b8cccc8bd0f3595fcbc2a2a39af58a69187a000de04340b419e5a0ce2900050610cd3d8661ec32ce607e6b0bf01c8766b886ba0c081155cc3800c8608401018e030c601d8c26910a6314299b1ffeb628419fef5e7140d1a9d1be438215a217568c0a67ec8eda1022ae5a20a8138611004031417a0d447257bfcf64b682d966f674e1a107885b5d3a530e3f245c000000000000000)) <<< 16000) + 0x00224c769863e7a14c57a05b424ad37304a84705ad2384ea582840000000000000000000000000000000000000000000000000c2440e50a5083865023025804c0b2b30c9a64358f5122bc37cd93d80ee21c9159fdd7832e0fc7a5e6753b0596c7b453833f72811d1c67fae566e218251d00048d21882a0c31506506800199486492c3209604843ceadc7d624cecfbd9d48e8ad7870ea222c06095251efa5b4180b98ed30c7cf4298af40b68495a6e609508e0b5a4709d4b0508000000000000000000000000000000000000000000000000184ed40342431811411c00c0000b0109f5d94e913e26a18401a64c70b832e1f04451e3d4f81d779411a78b1b1fdf7d511c95b43e8f58ca9b8fcb167d3096a5fbb502f0e29e2f32652937175e74c33c2f7d8a101f52f22e293cd474f51fa18e030c601d0aa7e390521a16125db9f2384095846539c096368d2d45030fff29c78e085543b0e03028281a388804e20440100c505cc769863e7a14c57a05b424ad37304a84705ad2384ea582840000000000000000000000000000000000000000000000000c2240e50a50438430450230258005b358defac616e40ef0911ae16fd76926877c9773cbd0b9422107fcf8e73d2267187bf3bf8b33824bd5971855777b610b772f2bf92814df3128001e010c41106186830834000b3443045418022000b48217e3a0be1d05e8c82f0440461a0bb0905d048004d9485caa82e14416e7a0b61105a8482d0140048e04026240806973991c0f4b8e8ba999e7b6342dd31091379c77a74415906aa47d8000000000000000000000000000000000000000000000000003208818e08608e00c00a0282200a001105d3460df651767ecbd1ec0235cfeec63e149e28523d7c462da77b8b65122f277cb6e19049b516c38e5b4309c36535aaecd257423d9e6e6600c1adf3dec2a3ba2ed0f5a40a2cb5188f475f022fca38c46a2d1cec0fb065cf03368598a82c8441621a0b00d0578482b80415a020005742158420ab110550082a40401df18408b6dcf1668525385470c93ba7d44450e1cbd11be830c98bffa8f0506d140bdda04044b095402470050dff8f404000c46378b020043178d50514450410a51090021035fddf042ef5420874aca5ba2c30e18013835898003055e2ffaac1ad0c083c1b047336c200db41fd104148400222cf7e70c80801c24562af27a07113070d9c43b4a040b80b164d1739c753f96402167c97e210407cba1b69b1238bbe12615e0e3933ec985a3143000cdfe600122abcaa673d8922000cdfe600141fd3e42e9184a400a005164c2460aa26ca18433267fee48a94aefeb362441528f563b941dc1809cd5410005b9a25b130012804000051cd1107a0201a32451c299ffe190223f6d1d5f480c2e919721e4859058e6a190400010f0abe930212804000052481082e88785693dcb12383d207fafc914cad4f4e3e4087b2a59f852030e336637212165d5ecb9b0504084b69fd408001ec35b01a00094021443a84151e3da024708df2c2e747648a6e4a6f111d50810f141c001101901857b117c11e0242c9509e7a680a282039feda42143e838017816000071c85402829c0400076a400228c8530a8294541482a0a3150510a8284041400209f010140082780413a0209c010005f5103f11ff290f7ecae8b7757560b8263fac946025ed0e96faaf633822980000000000000000002318a2bdbe3cfd93df08aa3deef5adaa50ce2b56b9ec659b6d4e8000000000000000008643862061863042042008a021cda5bdffb187f3c3e33e188cc6b325a1fe9793b9c602902c7e3a55717b8d8bddd4f8f4cf6e810dcb0245844f1ed7b9b80d68c503605d84c623a1ee531acfd311db140ccfa5d26a5f47554e86c8697c380f49b0be92d0a7eb6c5af4caa1c4ff1d3e3c96aa79dadf1339072964774505924b50dbcba4b7d0f1305d9b0bf3e591805e738dfdf1422552fbf400000000000000007c23862861862041042800808a0a020377591796ddf422f7c6a519884c32f6748e1a31c68dd218841a000480400222484da6c269261328b0984184b9ec258a612a4b094218498ec248461221b808527f37c8db962273d8ff367f1d3c722752e5807577bab53befca09237b754846e81021939b91ae3d6ca8f35f762d72e0c11a2af7f903d6285166f0ba1d5d0ae888171f0100081b7050253dfdc0e5664f7bd1f678c04b47602329d798cbdc95e38080db4910bd81800619d15c38a822efd81e0688057da95bd2b964318c14a828dd2433b791d7effe64000e794b05cfd53a2f216cd48f2b7c121a28160b383410b42fe3023c2e5bfb488a4c000221273a3f378dc6abeaba481500eafc2658e48434a82af764a10147c78596734eb874c0c088b5006e52d5bde80a46002524a92c34fe2f31c5aaca3e7935ec498776e5b59d40c0ca1265135b51aaa6c30610b44355691510d8368d1d1e2f8d7c42a4222851d02797738ca4f4bd57803d0900127a62e041089e5dce3293d2f55e188a82d4357ccfad0429c1c5796d0723afd89ab3b0a75b0541097a50f5037064b1282980000000000000000022a3dd36c797e931388da6826d46900a258f28000000000000000000fcbfff3e55ea0850188e850a204282480300a88c9b92571502fa6a7f547ecfe3ce433b913f863b9e268e784bc4e882d984eed2575c2d08ed2f691a2bf7538620aacabd8d0536197ea028752b39740fec8509e2899f9c008f7b1def29031b642844f656d701d9320064199e962c338748b67533363aeaba0a6711ea5b4ac4db2aa75)) <<< 16000) + 0xb4b5e02dad974bad7a926edb1a85f22c76d406b2db6319a2dec5bf48fbd000000000000000000455fcca28f8810edbf20b21f977efc88ee323bc0a9522881eee8600000000000000000000000000000000000000000000000000019a63b4c31f3d0a62bd02da12569b982542382d691c2752c14200000000000000000000000000000000000000000000000006147ba6d8f2fd262711b4d04da8d20144b1e50000000000000000001f97ffe7cabd410a0311d490c4085041052afa8104c4fa9b342efeda989f66597493c2b04a17650f08ab20ca93ebd3cd72f0085d29299c2dd93895108e1853da60fa694c044336f0a92d37dff3f25b94f8361100e81d87d5f680c93ad5ef1d0de9bd0e305f2a420d9ed163453560ec80aa7e8f6aab33e1e899c24aed22ec310b7bc3e549f1a73b377eaf20341418b7f0fc90b811eaa00140642409611e3308e0df36c5c3208aeb7a89b0890f1d119b300fb5b2e975af524ddb6350be458eda80d65b6c63345bd8b7e91f7a0000000000000000008abf99451f1021db7e41643f2efdf911dc64778152a45103ddd0c0000000000000000000000000000000000000000000000000003319428811200c022a165207820aff0d88d26e50f99dba831bd58ca2157cf625ee86156023bcf53231d4fb57c14345ea5308c1c4cff2ddca0ee2b244832a928b60d0bd8f48a7e870c307b3db3c347d3d4e56e18e101c2129ac2e99da84a8c455a9803aea5c5f98094c48dcf33e60d37f5a5e9c7be4401cea732f27dfe07b33f87a1237df1b25629d0268dac2e69ef860cd02331fc319c8aad9aa1b00478a05446891c04d9b1e416627d5cc6d3b917a782e834b004a47adb846efe999c2aea3857112fa6ce740691ba004fd02835a54e2ce7df3490ce2bc0fecbe96f9e486358c75e6d8b864115d6f51361121e3a2336601fb2aa75b4b5e02defebe0dc2440b32c52051841440412804449de92b43f1ff7e263284ba2f2bf60c7a42ee670af64c1eae88f94a97756287e18acc769863e7a14c57a05b424ad37304a84705ad2384ea582840000000000000000000000000000000000000000000000000c2258a40a308288082380300100889b44333a3c86df4a68241e5b1486cdf5d5f214d8690726ffa7b72d02fa784ece0a2206ba00063479b62e1904575bd44d844878e88cd9807c4c10a1051050c40c50850010100042b625187215a6f9d9cfec89e8a6f8d600f5d330c82c5c1028000dd900075c211a4a08c050008f21077010011b9903e4581ea0c0f0f60767303a1981c82e63b4c31f3d0a62bd02da12569b982542382d691c2752c14200000000000000000000000000000000000000000000000006147ba6d8f2fd262711b4d04da8d20144b1e50000000000000000001f97ffe7cabd410a0311c880c908608804604301111000100aee57df8e1920b5036c90b1d8ac0f05457a50af85d880f2e2839fadf396c4a0bd5685639f6273e49d517019723d8fd5015181c2a4bbffe1680ed57b246945e44a9882d313a3449ac6478cfb27a6c909148f7a5e64f788c16556c532c084a3deca12c14e2a49794500416b4385000bb01b444100040090d0880200f41ba642bf37979d376435978f6ea1b42a7c9744b69b90d7933d41e0000000000000000011341a88e4af7f9ec96d05b2cdece9c3420f10b6ba74a61c7e48b8000000000000000004423841440823012c11400c00804404c100080379b62e1904575bd44d844878e88cd9807e990afcde5e74dd90d65e3dba86d0a9f25d12da6e435e4cf50780000000000000000044d06a2392bdfe7b25b416cb37b3a70d083c42dae9d29871f922e0000000000000000011263b4c31f3d0a62bd02da12569b982542382d691c2752c14200000000000000000000000000000000000000000000000006143c50c32413c014031fbaa6c3a9e252192dd387b1c15b8cc9a3ec48fea2c7dbb1fc8bc2eecdfaf5db7df7aac18bb25322138f46bbe36cedbffeca065681e0bb2a937a5f1a3309f08d10e939558aea1be72a640f1f2cc20a1ebefd41eb0311867c602a96c26f643cb9e58c037bdeecebcf288d632364700e954cfe80c25f3bb79c7101421fdb70825d429873840017bb4ab1a68013956dd446000a97c3af24e104601080000802022c040ee0200004c20ba1a0001ea21142a0750903a0280028c0e10245d5dfd9a199827590b10300478f5120836616612b8b003a4fd6250c0049cbc2aa4260c230080398281c8141120a088050438282181400037c421407cdb170c822badea26c2243c74466cc03f4c857e6f2f3a6ec86b2f1edd436854f92e896d3721af267a83c0000000000000000022683511c95eff3d92da0b659bd9d386841e216d74e94c38fc91700000000000000000088f7f5f06e12205a0e29c21c016008059e131c71a0d6b31c9288cf3a1c135396a9c9d93531653cfd3845d28002f065aea2103fd041094b9dcb7f407af78831493ed5de24e6c5b8136a25fb068afa80cc4eed4d1a1ab2a9e64c3b6edf958ca229d9817089daf8cb05096b542c000040101080203a010000261b185ac098903080daeb088343b30f56e70619f8fe16f47003c2fc3160805d7e818d0b0410802020c2400028e4208441022204809023828118141000a07f05800435104421021808005ec883f1cc1f4d60f86307b2dd870f1d8436754c990b3f734d8f6dcf6953952bd706fb299bfe0c00000000000000000000000000000000000000000000000000000d22204582502500280080000a800024e3c146f167930647)) <<< 16000) + 0xe23d52fb787289c1c5f1e89853ee2347a5ca374e9f80b753109720417ddac9a9149f0f8475c88c6aac171476e5e93fa63a2759a341e837c389e467eb1c030e994c7823ac70419a8f9a0f4181077948a93f1e003e60890464d000047863c50003b9aaf7090065b0e1480e3c679b5b933b07861ebf457f007085d8a8504b8a106491dc4e21028edbeb5b7e80070c50324b0e0000cdfd7a81a00e0a0df8c00044aa0ce121b4081380c2670009895d6048d01f4a8e26c99400d78867c0a1c0f5a32fdf8e3d8671827ba4823a3f81bac8002625a002a3021380a24681f1ea8084cc03aff716038f93390b8193084011867ba4112c5e8ba04010024cc68660001732076010009a73cf8d0004601005b010000d7989817245b9a923014e404c230d98be2241240981adb6d088255182a36820012c48011300110040168040b202000160312833f4d78481404a03d18517e022f95880c0cff0170a001f90da903000e274c8526082000802600800050c80031190790503c008002150c7ba6d8f2fd262711b4d04da8d20144b1e50000000000000000001f97ffe7cabd410a0311c4f2060c30ce08704f00d017b825f2811df42f0d6ff680557fece9d33f6931a59e0817958af1941266623f3bc4c9a1f6c82fbba714a8242cc769863e7a14c57a05b424ad37304a84705ad2384ea582840000000000000000000000000000000000000000000000000c28f74db1e5fa4c4e2369a09b51a4028963ca0000000000000000003f2fffcf957a8214062390a2961921980900a001c02dc200401b65816348fe828bf6f3d2981c2021ac0c3c6020add151310081a02855250007a15ac924c104401000013920ee0391a0a9d923322462870444b37d38040e3ddfb341786cd930800df837c7a00904618a50a7d47d4800151240395bb8009502f900029c40c0862078e6d8b864115d6f51361121e3a2336601f98ed30c7cf4298af40b68495a6e609508e0b5a4709d4b0508000000000000000000000000000000000000000000000000184923533071cd15309208c001030000200d05b0100015698980d80f0cfc9180a0822370c35fdab34ca4810fdcdc162882411ffc53c10004387cf3cc004601005a0102c808000598c4c0116befcc81406e1f592145970d336e8a0006e2724449020880200ec020000f32000e4e4002f7483a8481d014001e04708079ed377040421dc91b0820f0ae4ac8a2c004378547240002157d83c70005d4627f8c00648205d44270c230080398281c8140e20a070050378281b8140003da41b4960d84306b1d8350cc1140731da618f9e85315e816d092b4dcc12a11c16b48e13a960a100000000000000000000000000000000000000000000000003089421020820e19608e09e01a02e0200401b4502c691fd041277adda0468410d6061e2c10add15130e0834050aa49001e856b2493041080400004cc82e80e2604ee4ea7c186ddb31ba8c48a06fe48129208016e346822122b5214134400a510877a003d0900298108c021cdb170c822badea26c2243c74466cc03f31da618f9e85315e816d092b4dcc12a11c16b48e13a960a100000000000000000000000000000000000000000000000003092262459830c324122116002060000401a0d2020002ad302c1066697c0a2c86a2ef1e204019edcc9c88215ac49379004b7b72945020007ddd7bd98008c0200d002067010000b31e1b7a73a01e15385f221203f67ada86016d75aaa4810380100660100006c900069e3c520fd923a282cec785e090039141a99001821dfbc1c0e2441de492840f804012c04094020650100009d10641583188c188360c21398ed30c7cf4298af40b68495a6e609508e0b5a4709d4b05080000000000000000000000000000000000000000000000001851ee9b63cbf4989c46d34136a3480512c7940000000000000000007e5fff9f2af504280c4721042832032c11c13c03405b840080368a027279c5104936651dc3420b2a8b0a2c10caca7a21c1031937172400610db264b041000200004b083004c17c160bc0305d0182e00e46812c0fda801ceb8e3c074cb9a084f9a181800ae9eb93f5001018331fb13b6438c24112a20d5fc7a5bda4002d1e9b0876b6ba000015d3ef7980001e848070438054736c5c3208aeb7a89b0890f1d119b300fcc769863e7a14c57a05b424ad37304a84705ad2384ea582840000000000000000000000000000000000000000000000000c2491a99838e58c9849046000818000100682d808000ab4c4c02737e60230d09128fa08b080de4cfe324086f739121441288b42e960800220e789e6002300802d008164040002cc741d907931181b29a2e62806c0bc1748c2070020098020000b220b01b0570982b02e63b4c31f3d0a62bd02da12569b982542382d691c2752c14200000000000000000000000000000000000000000000000006147ba6d8f2fd262711b4d04da8d20144b1e50000000000000000001f97ffe7cabd410a0311c933882130cf08b09305100b820080379b62e1904575bd44d844878e88cd9807e63b4c31f3d0a62bd02da12569b982542382d691c2752c14200000000000000000000000000000000000000000000000006124ce50d2083045034c3340040c000080341540400055a78f5a7ca5251308189cd8a22411896cb58330101ec375441000272083465002300802800813c0400026a4150260a60ba1e05d4c20a092635b589caa820c39f8d4850209c439300802000f422f0c04069c8ace8208b47bf424480002dc6c0060108c01)) <<< 16000) + 0x1cdb170c822badea26c2243c74466cc03e2a1ea9c49268aa88a08082700101900010068288080004ac82902ea98220764bce2a943c0936ea8ebd9c4935fde9d7b825c5042948c61715408208e8234ab0eeb94002b1a5dcec172900006fc23ac00014004090bb87dd504e208083103c736c5c3208aeb7a89b0890f1d119b300f8a87aa71249a2aa22820209c00401904010068288280004b48001b19e3f8914251c98a0e81d8ab2611113e79fe9045facf8918400176a99e812841100401402409e0a0001342000f866250b7922a68a2dc47a53912086166c6084082b68404812061000401383409a1204c0500008b9001082200300a786420fe56210306ffde1c40038506dde380f5aba03480120c10004012c240940a0490100008d9001e3820901a047090230481142400550841108408602004661200952c41081400c7dc4104d408022006a36207e43e064ba1a3528a44d6d0747599b1e60e0577ae566e3ae559fd6c2eb8137e082ab2b7b87ef27c428a13e6bdd46bc5df6a09a1803b8f58fcad9be91898485e95187eeec2c3ec3d005ed4c5219ba29ab3ac1b6082a6a44ac1f81c8fec224da7d2a733a6e22010da8f5e4a7d5b4cf9f626fbde7d390d141af38952ff02c939d7a71948bed6a379ad20b86d15721f7853d43431b4a4a85175dddeb25f585b0931b9e85caa41403010bbcb4ce56d7df2a10be90a471ce9f076bb728d8d7476b286569b17f56cd912812a1b1d40c4c8928bc406026c95f7a9a4472ad95d824c0b27ee4102bedfd605b2728062bbe1567e3099134275d727c26a9f53cd713f17c6637fc33a0d9ed59022c792fd4e5533c3f9c181ed5534fb0a79157a1a79578a66b644d9702c642feaf8b71b002fee6bf941a414060fcef549cb5824acda2e04b795d405cbaf27e089ccadc318f10c26ade4b40000000000000000f663b4c31f3d0a62bd02da12569b982542382d691c2752c1420000000000000000000000000000000000000000000000000611e0d23c311d3a97d44c45f0831082ea057508d1ee9b63cbf4989c46d34136a3480512c7940000000000000000007e5fff9f2af504280c4752021c11813275ba35f629fe58178f831d6abb8bc89e70cfe0b38d36775584f140a6a8d5bc489404b469eede53be642f5a2029b2bbddd13af252cb31497814d04a966dcedcad09690d6ff59fdd8220030855367322072e3539dfe16db601c1010ec717721ef78dad18451c50e5ee90d22a32b39176fd8d6891391be1a5eb97cc0db747279445bbcefa1570b4e1b133906e6e28f994ead8f812e4828a83cb67c149836fc60823e1bf1498b37e8deadcc4c5d2f49dbd012d80ac4e23f9cc777bbbefe755b2540450ae1a221a77ab3dd8d78fbe21ee588f792ef4c86d49b912b9e736e969490c895e3ca00183640f89607a4b03c2581d92c0e83607203ed8cb5497f735fca0d20a0307e61bb42ecc1253215f9bcbce9bb21acbc7b750da153e4ba25b4dc86bc99ea0f00000000000000000089a0d447257bfcf64b682d966f674e1a107885b5d3a530e3f245c00000000000000000220f0691e188e9d4bea2622f84188417502ba8468486502382280001f08b5e171c310289f01e7827f91b8b62b04c425953e6176ad033992107719f2f70118a8e1c97b1202816f5de1077aae00ccc5e8b005025550e6b25ca5cd704861ac0fc5c6ef9898abb4d47465da1e982f6dcf6a72c764daf501cf8f8c1beff63a92137e64c8a8ad03096433c47feb6c30e65fb671a1c10c3719d74304c27606d4041f9b261dc8300bca7f761009840880200681a0001522070330371981b0cc0d467404ca96d02200de8088f600011100f8042c50e11c0b9245008e67782830d133d03142600f0236300fd7e79a70002a4e58bc4026142000860a339bbf4e9629ca25194a28b2bf784d20608006df222804828440100000e330180100400001110340d00014190331500019d10321d0188c80c06405e0a000c58205c8202d3d0161c80acd4054620292d01406809c2404c1202505001192902435e10411e944923039cbfdca6714101f1fcca90a00a44bac130400076c65aa410001f2281a045100598c09402004603e2910b6b646870af242f272c30402a73df8c1800a2ab5f228a0009e5dce311402520250085100341c106d2c50ae0f8995142d91ab71dc020910162d5d828001d6c9499040011195e7d4c004a010b2012907946b14427228b14d418500005ec744104b17d27b5f4a0320347e8f0120000dbff11aa600270100000aa9b1438a4e51f850b5a7e9b74308243dffa4d9100808c0ac7c450003ad929321000683820db9800940216401db196a90a20fc2d7540c38402c658b9d0824e101dfd51404fce1b0aa8900005b8d80130012804000051c80015490220981084c0802603e1301e01d8a1fae32358285ad2bcec2e90100d3b01594208ae40368b428001d6c949904002302b1f0cc004a010b200ed8cb548a20fb93ba55c208dfcb1b8f0a027f0a93404900005b8d802a0048008000110203a0b01c0580d82c0681764000302fd40a200124e43e458a161dc9d50285b654002148411fdd36a6e8500022a0d5cc01308128042c803b6d90f42883e9beef021850000a63a2082470e4d59a280a00cf0e9a2400014f0b1a00b081200200005208001591019050002d41000ba720302a0171500b0a805414001a764050e40266a01231008968040a401e4a00e210068a8030440161a00a090048480201400e02000fef200c320050100654c900411001888008440020a0000100715a1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 39 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case14" = "QuadHeightCover12Case14" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 39 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case14 private def zz2374:"s0946"="s0946":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l21 l23 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l43 l45 l46 l5 l51 l54 l55 l56 l57 l58 l59 l6 l60 l61 l62 l63 l64 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x4fac889f7, -0x547044420, -0x7eb3d8214,0x3dea0296], ![-0x547044420, -0xf34b97326,0x185bb8292,0x600955db8], ![-0x7eb3d8214,0x185bb8292, -0x2256e819cf,0x549e0b020], ![0x3dea0296,0x600955db8,0x549e0b020, -0x2a4393d10]] noncomputable def hinges:Hinges:=[(-0x329a300,l6),(0x166f3b9f,l5),(-0x665f5f98,l4),(-0xbc48827,l9),(-0x159085c17,l8),(0x6c1389b6,l11),(0x3bbc2aba,l10),(0x97e924ed2,l14),(-0xe86f5f2d3,l13),(-0x2494375f4,l17),(0x57b02cd73,l16),(0x83646dd46,l15),(0x23b383e55,l21),(0xe86f5f2d3,l20),(-0x6f9a51bf,l23),(-0x2a4393d10,l27),(-0x23b383e55,l28),(0x2a4393d10,l29),(-0x97e924ed2,l25),(-0x3accaed3,l31),(0x1dde8eef8,l30),(0x2a4393d10,l33),(-0x3bbc2aba,l38),(-0x2a4393d10,l35),(0x159085c17,l36),(0x2a4393d10,l37),(0x665f5f98,l34),(-0x1dde8eef8,l43),(-0x83646dd46,l41),(0xaa921436,l46),(-0xbd766f38,l45),(0x2a4393d10,l51),(-0x6c1389b6,l55),(-0x166f3b9f,l54),(0x3accaed3,l57),(-0x57b02cd73,l56),(-0x6a14c2e4,l59),(0xbd766f38,l58),(0xbc48827,l61),(0x329a300,l60),(0x6f9a51bf,l63),(0x2494375f4,l62),(0x6a14c2e4,l65),(-0xaa921436,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(0x97e924ed2,l14),(-0x97e924ed2,l25),(-0xe86f5f2d3,l13),(0xe86f5f2d3,l20),(-0x2a4393d10,l27),(0x2a4393d10,l29),(0x2a4393d10,l33),(-0x2a4393d10,l35),(0x2a4393d10,l37),(0x2a4393d10,l51),(0x23b383e55,l21),(-0x23b383e55,l28),(0x57b02cd73,l16),(-0x57b02cd73,l56),(-0x2494375f4,l17),(0x2494375f4,l62),(0x83646dd46,l15),(-0x83646dd46,l41),(0x1dde8eef8,l30),(-0x1dde8eef8,l43),(-0x159085c17,l8),(0x159085c17,l36),(-0x6f9a51bf,l23),(0x6f9a51bf,l63),(0xaa921436,l46),(-0xaa921436,l64),(0x6c1389b6,l11),(-0x6c1389b6,l55),(-0x6a14c2e4,l59),(0x6a14c2e4,l65),(-0xbd766f38,l45),(0xbd766f38,l58),(-0x3accaed3,l31),(0x3accaed3,l57),(0x3bbc2aba,l10),(-0x3bbc2aba,l38),(-0x665f5f98,l4),(0x665f5f98,l34),(-0xbc48827,l9),(0xbc48827,l61),(0x166f3b9f,l5),(-0x166f3b9f,l54),(-0x329a300,l6),(0x329a300,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x781202804fa0080000005c4414064008000000000906066008000001611050150020000002a260e0720040018c2082102af4014000198420880de80200000000120d014c020000000002438198020000000044380930080000000088700a60100000220e84c0ed0030000000270e00998060000000000380520080000000090700e60100000012032004cc040000000250d00598060000000521203c300c000000621201b6602000000c811409acc0500000019842035980800000000000703200400000000001e0640080000000013402880300000000004e0310040000000000980520080000000001280c4010000000000250388020000000002b80590060000000005400b200c000000000aa02640180000000002901c802000000000008819002000000680900353010000000d88828148010000691141301910040000d22082603220080000000641103d300c0000000c82202a601800000015874028c03000000002e1e031804000000005c3805300800000000b8680c60100000000e84802cc030000ba1882401920080000005d0480313010000000b218806460200005d0cc1200c9004000001e4220024980a00000000005c0520080000000070500e6010000000e0220064c04000001e8210014980a0000038842002930140000000005c01240180000000001201480200000000012004900600000000017013200c00000000000a064008000000000a0c0cc010000000230b80998060000000001500b200c0000000000481640100000000028004c804,0x17000990080000000006d00a200c0000000001b80c40100000000003601480200000000006a0310040000000541102d300c000000a612015e60200000001484c0b4c030000000000120390040000008474480a4008000001a2518172602000003064a405c0c0500000604918098180a00000b090302073014000000000fe0164018000000001f002c8030000000003e80990060000000000f4072008000001c25981726020000034652405c0c0500000684a18098180a000000000118052008000000000046064008000000000450248020000007898605c980800000000013c0620080000000002680c40100000000000ac0c801000000809a605c980800000e19690170301400001c12c602606028000003089602dcc040000006092604b980800000c09230207301400001451de04266028000028238c03ccc050000002902203d98080000000000d40e20080000000901405a601800000001105024c0200000000000c06900400000004e0902d300c0000000003604a401800000000021038802001501b024011ba00a050830c20808574018005106308402ae802800000000005018802000000002c0a0398040000006458280940080a0866840814ae80300000010434036cc0400000210328135980a000000430c406b30100000000000120640081420c30820245d0060000000410f00e18060000000064140f3008000000a22181526020000014820c06c8c05000002a8418139180a0000000000540720080000000843206c60180000000016140cc01,0x440290040001442205409a4010003284707001b0802800610960e00f6100531a11706400798200e000003885300d8301400000000a8281c601191089832000cc100700000000022805100600000000008406200800000000d0480e601000000000026034802000000002a2403180400000c4542600c400c0000000108e81460100000391a8ac0cd0030000e2328b803320080000000064140d3008005288404407e480280000310d0340d900300000000001e0290040000000054280630080000000000d812401000000002e11014c020000000005c481980200000000b4480930080000000128681e601000a612c08c0aad0050000861a83207aa00807084043100a5d401800000000d0681a6010000001845302a4c04000003105180d9180a00000650a3027230140000000000c80e401000000000d06034c0200000621a06819200600000000d4180e300800000001b8301c601000000001e0d018c0200000003105006180600000000583c0d300800000c505402606028000018208802c0c050000000000260290040000005e05c05b3010000000ac09815660200000000090701cc0200000002105016980600000000002805200800000000090a0660080000000001501880200000000322c03180400000000000d0320040005092234010c80200000000003003c8030000000000680f9006000444830440c64010000012519e04266028000024230c03ccc050000000002e80590060000000000b40b2008000000000be026401800000000005c0c801,0x28c1020820252200c00000000643c09300800000000007812401000000018870044c0300000000341c029804000000006438053008000000b020802660200000001688402cc0300000002f110099806000000005844073008000000ba1b013660200005b1341901e50040015a2681900e4a00a000000000589033004005a08d05201d280280000176190032cc05000000002a24059804000000520d809b3010000000b01900766020000017c18801acc05000002cc310035980a0000000542400b300c00000006c22048601800000000f09028c020000000000600e90060000000000903d200c0000000741207a60180000001a830074c03000000000058069006003bc3503202cb4014007c06505202d6802800000019894028c03000000003626031804000000006c4805300800000000d8880c6010000001a44100c8c0400000000003602900400000000036009200c0002204a0e81908020000000941d0310c04000088148320642008000130250740c8401000000990c8009260280000000982c090c030000002406400c9808000004d0620029301400000910c40052602800000000b07028c02000002d0118013980a0000005d04c017301000000b304c008e60280000001702c03cc030000002a03201b9808000000550580973010000000b60c806e60200000017c14019cc0400000002d0700b98060000000580a01f300c00000b204400ce60280000016c1200dcc04000001842581ec180a0000003108c06830100000000068501e601000000ca11c0360c05,0x3f05806180600000007a0b00a300c0000000ec160186018000001c41900d0c04000000003a0e07180400000075064034301000000000f0280a601000000001d07018c02000000003a0a03180400000007a0900a300c00000000f8280c6010000000001a0c0cc010000064110581a20060000000094340d30080071864044046280281c20ce047022cd0060000000004438198020000000000840720080000000108380e601000000001d05038c02000003883081a8980a00000e46a1101e400c000390ac11017680201c114308102159006001c232c208099200a003845184101764014000000860a8092602000000001605038c0200000000002c029004000000006c1c0930080004a0ac1c80ac802000000001705028c020000000000018190020002c48c160023401000000000d85814601000002b0f8340b10030000861884204b2008000000845c28054008000000a82181f46020000000148880b4c030000002909207d18080000000000440620080000000068500c601000004a0d8580710030000002908605d18080000005410407a30100000000000160640080000001b08c030c030000000361080e180600000083144089301000000000130e0660080000000000d0188020000000000098190020000009434180740080000000068300c60100000000001d01c802000000002e1402980400000c82209014400c0002b0420881328020000001e13060190020000003a260c02a00400000f0460a00a400c0a304082081b488030000660841101b1004,0x3b89001d1808000000c21c40f830100000000088301e601000000001d12038c020000e22203404d20080000000742301d300c0000000068381660100000000001603480200000000002e04900400000084382c0a400800000000c870126010241201106018910060001224088c0662008000000007448063008007789e0cc036880280000000002f024802000000005e260518040000006438280640080000001443407e60180000000000d02c8020000000621c80e180600000000845806300800000000e8500c60100000000190a018c020000000000320710040000000064180e300800608a70700324802814110d05802ac100650a21104c01098200e0000050881024c30140000000000e80c401000004a1086405100300010c2086204ca00808184043040da440180004b0821880d880202061010c1012910060019a2e81900e4a00a000000583c1c094008006a0ad05201d28028000001904c01ecc040000000230c8121806000000004c340a30080004b88a0d8132802001251140d8092500500260214158094a00a0000006814401330100000000d45201660180000001b8a804cc0300000000342a0398040000006d11809b30100004887a1380888020000950f42701110040000ce2a83205ca008003145503202c94014000000000d1606600800d014a0a405a50050000036c420065980a0000000064580b3008000000c42301366020000001a04200ecc0400000378410035980a0000069882006b30140000000c8580166018000001ec130050c04,0x2a07100400000071104095301000000000a8701c6010000b221833039d0040001624187803ba008000016c841903f400c20318104580ef880300000000000901880200000000420a0598040000000044180d30080000000068381460100000020453031cc04002c4424118145200a0000000054180e30080005a10608815480200000034c910224c040000000022120518040000000742201d300c00000088483014801000000002d0d03cc020000000000120710040000000024180e30080000001241203c60180000002088c08cc030024a10c1a80e7200a00000000941c063008000014214206626028000025828404ccc0500000528528068980a00000a10a1011130140000001248206c60180000000000540c801000000002a1402980400000002c4850340040005d1283880a480200009a1fc3401e9004000000001a1203980400000000003409200800012090980f4860302412130e401e9100604824260a403db200c00001a8760b026400c00808e70f001a48028000711103a0269004038221c1bc04ea200c00000e4441e01c400c1829628ef00c48803000000000029018802080c60419603be200c0000164761c025400c0000000000320640080000000000501c802002c2460718106a00a00001084215013400c00000001c998166010000750cc2a0115004000000005e1604980400000064281806400800728c404407e48028000020a08c0ab8c050000000410501f9806000008082902ae30140000000000881a4010000001c4440268c04,0x361c0718040000006c38280e4008000019868220428018000001b0e0901500200000661a0a00520060000000006870330040000000682606a60180000000311701cc020000005908605398080000007118c0683010000388c61c00d08020000b12141b026d0040000000311480b180600000c4521e016400c000510ec1981ce8020000a11cc3c01dd004060c40409603be200c000000b121409b30100000000118b00a60100008c1c45703210040000000291081918060000000000440e20080000000088300c6010000029108300c90030000000210c81118060000084320e024400c000000064220686018000580c42500910040000058190a80a20060000007110c0c73010004c06107e0320802800980c20bc064100500000020842025180804043341600ab0401800000c84418068801a050c88260084c100700000204308126180a0002082104406c40100003b06210813280201c60c10810369100600010c188420362008071830420404a440180005e0781080f08020000001d0f0602d002048e18c0c2032b200c0000050841020b3014000000aa12807660200000014421016cc04002c2504218099200a0000000084140a300800000108702814801000000210d060250020001222902e064200800000d08a3020b30140000000138581460100000024c290088c040000084230881120060000000074240930080000000000e81c4010014124208c04c900500000000320e0298040000000068180f300800000000a8780e60100000000150e018c02,0x1b24206a013a0080090ca609201454014000001da31006a6020000003a06200d4c04000000758c803298080000000e63201d300c000001c23480ca602000000390660254c040001c63606a06aa008000000e919804530100000001c46806a6018000000390cc054c03000000760c601298080000000ee33015300c0000000009a03e401800000124360094c040000002686e02518080000000003d01f200c000001103880266020000000228e402cc030000000471d00998060000000088740730080000011a3301366020000871d41902e50040020a3a8190164a00a00000000088f03300400880e505202d280280000236310032cc0500000000423c0598040000008219809b3010000001103100766020000023c30801acc050000044c610035980a000000841b007b3010000000108780166018010318a08c0ab90050000084310501fa006004246082902ae40140000170441a06c80180005f0841b02590040000a61102804b20080000081061035130140000208f42203c8018000821982202ed0040402306102042b200c00404758410132401400808c308202ec80280000000001302480200000260108113180a00000004c0902e300c000000a60a8092602000001300840598c0500000002305011980600000004c09013300c0000000000f00a4010000831481f01f90040001022983803ba00800000000841c063008000000821081d4602000e118208c04c900500000028886034180800000000784c0530080003c0a6248150802000000001909024c02,0x1b0520129808000000370b404a30100004a8880d80528020000001943500ecc040000003086202d980800025444048029401382181821a0259c803800000002b13028c0200000000720a059804000001132c4089301000000000c8300c601000000204510254c0400000000520e05180400000000441c093008000001487028148010000000210a8074c0300000000005a03100400000000023025200c0000000168b01c6010000b52585403590040001623102e064200800000d08c3022c3014000598cc0a81908020001192581602ed00400000784818058980a00000000007c052008000000000f16066008000a518418015100400000584618116180a000001233040893010000000000b0e06600800000001f06034c02000000004a3c071804000000009c180e30080000000000a81a40100000000000d034802e0c60408680967200e00000000ec4c0a3008000001e6488112602000000002906018c02000000542a0a04a00400000000ac580e30080000000001481c40100000020c4801e8c040000004086204a980800000000a4180e30080000290a41204280180000000001102480200000000220e05180400000005458303400400000102230134602000000021068074c030000000005458198020000000000340e200800000c1142049860280000000000503880200000384608126180a00036c880e8047401000000c104204166028000018a13004dcc050000003282a01d980800001a8881d017400c000000c20880b6602001b0208194011d005,0x48906034180800510818e301d24014000000886830148010000002d260503900200000000001406900400000908a3022c301400000000d8381460100000018c190088c040000000311481918060000000034240a300800001106c22044801da824102f804bc500700000000340e059805818a0810d012ce401c00000000190e0660080000000310f014c020000000391481a180600000000443c0a3008000000e22301346026862c2043404b3900700000002a14181a00200000000a4140a30080000014848380a801000000002506018c020000e62a08803d2008000000710c409530100000000128301c601000000014884088c030001222903003b20080001c45310c09a40100000000e83403a6018000000108640d0c0360820504101299a00e000000510c404a301000810870680666802b05109825c086cd007001c23044181eaa00a0039030841020e40140003886411016e80201420c7087016b900602a41a212201d7200c0000005405009b30100a60698498145c80300000142084082cc050014a19823009ba00a0000005505403b3010000000a20880b66020000000c4170320c0400000004d09812980600000000013025200c00002e124740548018000f4158390155004003c62b03900a2a00a000000008418063008000006d0a2019460280000000e058074c03000001ac2980c5180a0000003309c06a301000000610a603146028000000c8280254c040015418c2d81a5200a0000034855010a30140000006214819460200000000c850054c03,0xb12486153814eaa00e00000000001d0320040000000128700c601000000250e0a0190020000004088804d18080000008712003a3010000001a44081f0602000000002112038c0200186210188129200a0000000842301d300c0000001a8820386018000014619008c8c05000005c4518089980a00000b60a101333014000528860d008a802001c12063e0083500500000b4290e809a006000294850d80c8401000003890c3804a801800000000007c0c801d085860c680967200e00000000941c0a3008000001287028148010000ca2846401490040000000000660490040002bc6a11007a40100000000128b00c601000000001506014c020000000161c181a0020000000044240730080000000108500c601000000003d3702cc02000052648203d2180c0a488041840722401800000000003606400800000002505028c020000003886804d1808000000770e003a3010000290660e01ba802000a10d00cc0d35005000000003a1c071804002943083101ad40140000000e83603a6018000010a10408b4c050000002104606698080000040848026d3014004284105a045a8028000310841202a90040000661182207d200800000a40a401f130140000c186b011c860300000000110d028c020000000311481118060002046314c09a40100000001084403a6018000014211c05dcc0500000002a0d00e980607385041b006734018000000004838146010000014c14c0a5cc05726285061805d9a00e000000510c40ea301000000a5098026e602e842c3043404b39007,0x422603180400000000844406300800000011442014601800000002311018c02001ca328190164a00a00000000078d03300400780c505202d2802800001f6290032cc05000000003a340598040000007215809b3010000000f0290076602000001fc28801acc05000003cc510035980a0000007417007b3010000000010838126010000000000070248020000000410600898060000000000180520080000000110300a601000000002106014c020000000000c81e90060000000001c01d200c0000000943803a60180000001e8640f4c030494286206054e200c0000124522103f400c1210a48848153880300000000022240cc010000084331200d2006004444986303d3401400000062108094602000002441840d44c0500000404338168980a090470c204085640180000000000581240100000000110b034c0200000002b12812180600000000442c09300800000a3122041060280000014c490220c040000002d02601f18080001b85a04c03e4010000000a62480886020000330a01d03310040000001283a06318080000e42e0740cc40100000000541c018601800000009830030c0300000000140e0318040000000220a00c300c0000000781205c601800000000a05018c020000000110600e18060000002905c026301000000004c1401c6018000000a4180058c0400000001606807180600000000a42806300800840c10b4036880280000000290e018c020029e2183f00da200a00000000cc3c0a3008000588a61c010a8025832410a3407155007,0x1884207518080000076061013330140000000001081a4010000024429c0ba8c05040a20408204c9a00c004905483e03f44014106883021819c48030010310808808c5005040a2240920671200c00000000078903300400788930c607a6802800001c219c0b44c050000038c3200f8980a000007406502f1301400000008c3a048601800001061c40820c05000000218720441808000000430e404430100005304a0e81988020015208a0b406310050000003c0c2009980800000007a3100b300c0000000fc64026601800000001e1901cc020000003e8ac04d98080000000980900a300c0000001281201860180000027456026cc0400000004a0580e18060000009215809b3010000001c8c8300e8010000002cc610224c040000000007468198020000000000640620080000390cc2c0388018000001882302e8c040000003204203d18080000078843011330140000000481403a601800000321712019002000000622e2402a0040000190562200a400c000000420881d4602000001d810404ccc05000000108220251808000000e464180540080008093844004680200000001f0ac030c0300000000362c029804000000d46c58054008000720d21b00ac802000000001f07024c0200000000003e049004000000007c2c0a30080000000f852038601800000001b05028c02000000420a607d18080000000822a02d300c000001042c81f4602000002041040d44c050001022684803a20080000008512403430100004289a1200e8802000000002211014c02,0xa4210c81220060002a8430cc0c8401000051086198190802000001a4208019cc050000003588401b9808000218250740cc4010008904505a031880280001600c30012cc06000002d4318015980a000005f866004b3014000000b41980366020000001603900ecc0400000000342a0298040000059869006b30140000000d05e02660180000000001a01480200000000342c0398040000006216001330100000000c85a0166018000000000d002480300000003a0580e18060000000c21601c300c0000000e46206c60180000000210903cc0200000003918812180600000718c702183014000000e23281106020000002b1511019002000000522e26072004000000a8544405400800000168d0b012801000000001a0501cc020000031c518188180a00000006229024300c00000c51520620602800001822940440c05000003082081a8980a00001284a1f01b400c000000b21b005660200000000090503cc020000ac1082201ca008002e020821006940140002f842088072802000000000a0603cc0200000000340a02980400000000641809300800000000c8300a60100000001b83004cc0300000000340c0398040000006804801330100000000d4140166018000000001301e08040000000002e01c10080000002805c0383010000000b00980f06020000000001101608040000000002a00c100800000000842c0730080000000128481a6010012314810808c5005048429c10e0459a00c00000000088b03300400000f10c6022660280000000d048074c03,0x31098169806004b08083100c94014000001ca1280d26020000003842100e4c040000000811081998060004450234409940100110a0234204b680280000000491903cc020028448c588125200a0000000005d00a200c0000000001780c4010000001981302acc040000003702e02d98080000000720a00c300c00000e50540260602800001c208802c0c0500000000005c0290040000104340d032400c0000000168301c60100000000002d038802000000005e0c071804003184b02302ab4014000000c40880f66020000530d41903d5004000003843181a9180a0000000580a02d300c00000000a8281260100000000220d034c0200000002c0580e1806000005802301e830140000208681206c8018000000148280b4c0300000821a0681b200600430708890226401400860e113604588028000000178240b4c0300000000420a06980400000000dc9405300800000000e8700c6010000024c3bc08c0c05048c39e1e00230200c00000005221034300c0000000000c81a401000001c429c0ba8c0500000003914812980600000000009409200800001c8a41a04a801800e41520f80fd1005000003a0518115180a003a05183e0234401400628810500462802800051108190169004031a20c0be0671200c00304438360231401400000000c8281c601000000001507018c02000003083081a8980a000005086702d1301400000a30c803e2602800001501940bc4c0500000294308088980a0000000003d00a200c00000094108066602000000000098024803,0xd29251d40464802801a124238803c9005000000000094029004000000000025032004000989e26901b480203c3344041023690060000000000138190020000000001340b2008000909c26101b4802000000000042014802000000000010819002000000000104092008000000000248124010000f1308210265004003c260820812da00a000444d12c80da4010000000000ee0164018000000001d002c8030000000003a80990060000000000e40720080000000c82205a60180000018c2402bcc04], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((0x1a69c1d3a751418f26b595140447cfd839200482ea5e880120e100041054268280bf30659f7ba984801046d2104a1c23e9c5820b387b48024101f00820986d048268120b8a314d7a4ef228013a8623c30d243799a12411257b9eca88477b1c23b920835df526c1000495d81c01386110040fe8267f20be88cd9826c2243c96d74d289ab56803c29a6a1e41098ca08988082800100190801006a0882e698dc930c694d2013af319a411221fb125941095692dd6020834b83e2b580002dc6c00a0008adff1408000e0c4aa58180c230040000cf9e88cd9826c2243c96d74d289ab56803c29a6a1e41098ca0898808280010190001006a0800e69962c69085e2490112a88000411a6df76326d41104cb9d2802408003d08da028103dea029600821a4f9d63fd6000112a8800280040703ea70312084e0280001f2281e1240e050001ae900065c3144180413640c376bcc6a7a4823520e096c884146c0ea4d1059fc9eefc1008393b003508000ea1fdb5380118040fe8067f203e88cd9826c2243c96d74d289ab56803c292499c38e98690690448478008190001006a0680e490afe9ee020e3cc0d543b60c3005b8d80026196fe36b5e2418016e351c241146e2796492105082bfb22a00016e3600260015d81734148212004000075080018a940c0d20584902814000a0840034a8f9e2c81ff70823cc4abac783006b7290c09e5e698860045d5cd1a4a103c01040901c10bd3b50caa260147590a8514b9b60bd838400e484e7441250c6890a009dd51fd04100092019ff7002100420400d01c071478ade926e48d0611c9dacd1809353d02186000ceda6910962001fe7380011be19fc100159ce7ae9c008802080c038a2850da1c710c34b36c92d4028a0067d7ef1a2185209e63024060a09cf420a411e72a6336888400727098c000989680153821300800006a880019f10004df280a2240) <<< 16000) + 0x40d20184900814000cb440053389f484e0733acc04491b5e0f81a3665e0e6b1eb608874466cc1361121e4b6ba6944d5ab401e238b2c83873860c31422c074cabab85b4bd1346524c87b90d64c21f48186aece22a4c13a2f613fa89b143e462fb844a0f37c601321a41ce830c3848f01666642182045ac5ad8eda1420ac185a22ae428100b74eb0d62d44001ba0057716d3c00b86879b368c0400226e01ea4645e524041801a000084081500fa2336609b0890f25b5d34a26ad5a00f0a059849e40820c18a106098037bcf328984fb27f671f5cb53d002d61dce331e38085810ec070ce9ff2acd3458812e475aca9a0412ff11bf27d20141819830b9aa5018304dc5c709b383043d773b13bbbc30434d1ebbac6b24001e1b2db70784000e8d1fddeb6ab0354841781c0000914c460e938296ea01e3068ffe468590a0c32cd0d97ee238612dbcbfdb6d0c3b77f8773e190a0982f2232da2cd001ff38fdf4282800109ea06d9d5013118cab9551c50185a0600002272000c8a500454800223ff0d03b848124247fc02000bba27d8233e60d82b86cf94367b803b1412703f861a1800bc6a172c30016bea2c2862114ecb3c30fb5376936160083849f57280021ff23ea84e18460103fd059fe02f8a132e25af8a2dbe2109e860201a31ecc1a0013e4e7bc280064670e124a10440103fb01c51bcfa2f4212340aca9a9a20600d598c6c61b6504bb66481245467ac9104ef68d9be0400248affbe700220081fd00cfe40724b8ade926e4ce03c47a9a471eb2446ec8383024d4f40920962001fe73c0011be19fc100159ce7ae9c00880207f003924bd1345b95a488044b4cef090e211bff2ba9238566f10e1038fe66362b4b96180abc972309848a18df9c8000b71b00163821300800006a880019f10004e730340bf9d8fe38a1723105d145dbca778b1a00251f89e41003af51e3e9284108040fec07146a252677648d02c3b80c46196b96df764811febf45f9104f3d5524f0400274fa94a600220081fd00cfe40724b3a17841e4ce07570861071d22d499224c2175c31fbd2093337e8de3c0009379b28100151e1dad9c00880207f003924762431095244003d08da2670072864c248713ead1e8e48e0e67d825871e41bca12926117042544c000f424015c108c01000031e4000c8c80024f10005d520018224e201670e0b38c059c582fa2336609b0890f25b5d34a26ad5a00f0a672469e62458e39228a19c09e0264200401b32825d968759c612389e593defeb71c78a79ccd326e868a019ef92a6df89140bf5df3bd628a1823c46f0f9fc381025f9a8814d4a8001736bc6acf53002137a26be48afca48417818000090cc8a3a4243a82912afc81a9d4c10003d08da162086cfb9be2040e0839bca4008fb0b9f4460000b100720004dfb59bd3003d08f6927018460100001c33130016860eff912520137f1d9871454e7ef17946146372abd1ec51615c06bc2c130018273cae0100056d0525300c00002dc6a3800089542382430810280180000fb1816071d87805fe81065f7bdcf12690e00c11e49e8030a052f858ef2a28a0b19918661430832d423c004e20928c1b5a9db488000269f99f40100079b2a8a7de205112285805000022c20ee0bf2816ac7655a3c7506d87e44850cb9e09428f1030f0aa624c430f437ed5730440322df87d0100000b71a8e0004c4b23824141e9e2aea0a0e384c0280001dc22222a3f7010005ef9d20160515521468aba31d977020c130c1ae69db8408a053b9d9241079813b920e078008e9034820200002254faa00044a9fff0240502b318cdc042483961481000008089fb188fd4b47de5226f251f606800726893712f7bad3bfa000000000736bb486e9fd376e78048269458848618628418410408222181801006e9800202faaf60e242c81ff45089438016762aa602c4037bddf745c105107f8ee644010423463318b39c01fb42ca8564240026d138417e2230e8182b0240000f61077059f480cfd0067e60309001ef75a77f4000000000e6d7690dd3fa6edcf00905035320e1cc1861851460c50d1030300200d81a00df83ea5700d280c0ddab9a961c3b0a15a46358e306175f0b6c878428b7a81860f3ba110e39a0d5300b78c1bea150a31c9d3000e891a64ad688893882060bc0f000042664398b3611cb91a328830d679296296c520f1768a2d4839679180a150fffc0c7e881267cd498c6841324ff8d358220004d3f33e81e01c8748dfe8a201b12385004000020a3bdd69dfd00000000039b5da4374fe9bb73c02414463052841040c32814003804400c100080340004bc84980e23069fd14015030511d3136589478821dc323107ca103143f73a3908216be139a5d20c3b987f48a5e85820182e1f2b04504aa931ac59f0c000aca78599450e8c88158123052b60ce94f858a08ef19df48f101b4d7935a94208feecbb681034cc4fc48b41870597b585c05048e1fd1e5ea2010efcf7ba628000112a7d50a124881380c00007e09f9088fc43412c1a3f00d015048001270815168002ea49f00cc2384608003bb262cdfc00000000041a5f883334a6613c21209c19818e0820900040000200cfd34c2169e50d79c231c0880918e1a66e75c7dd7c655c819847a1382a3ef151f70a89bc547da1a057091f6028fac140004ee4584a47b01a00125a205413a04b0ebabed8a2410035a4c79a0a02ef4b4c5f261400449598c559444015629c239a000704508c9941c7af9a8f4805a09835ea8410964542a0200000e89802008020fa8160920b3e905e159b064)) <<< 16000) + 0x0db4b8597f5a1559f36f2c9a83c9e09847b407e7036d2e165fd4d82a6003afafc019c82623da03f383375019c1d5a8f79b2f69e8d9f5e09474466cc1361121e4b6ba6944d5ab401e14c52bc7c55ddf38270d8de0d48a4e774d9bbec024a4cce47420220000000000000000001214410908804f024b2664bb49968a90b399fb146c011e7df77262276c57f3609a908e41d697004df4a8fe250f6648eefa295ecb3ebcd8909781c37480d368fc3ff040a1dd38ca459dda53856735eacd271ba4586a4c3139629b196b7db1bdea6cf219f5bc584d4b727666c5e52a82344c3d00070f27d02b09c159f386cf98260ae133e5099f2028f70078566c19036d2e165fd685567cdbcb26a0f27826317f9af09a5d2fec0e6029f88c288ff3e0d27fb2e02ab2bc5fcb100000000000000000011c8f3ce18618b1430c704d00b00c020080360080200800002227c613389099f104c444267100b387059c602ce2c178680357a1f0b10152661b01037e1ba355c30da109699e1010034631801004943f0c240049880880211ed01f9c0db4b8597f5360a9800ebebf0067209915267fa33a77771674eeee39bfcb9a01f1d119b304d8448792dae9a51356ad0078cf3c618b111002014b9edc9d78c6e17a3fda2713cd9ae0640a508feba5b6ad9f1ce920a5aa929937407572015904ff22d6c6dd213e5e4ee6c7a5b9ac1f924f4baeaed30019e64adbad68cecbb3dcd91a31899c762906816740011ac85480800177ce9be2bc9b6f9b8fa2841ccb850ef5fb76e49b03a2e605a9cf981fbf2027876ec7d3636da42082cf5c8a7e3bda229d1f3a1f3e1b455af99bc71d9a1935625571b839d9653c6e4f044c4484252e96c7b39e69353b156c3e7f1a4d29e3bd0892b87796e7f9b8b7c97ac0c848bb989220032f6f5bfe78abf71d7cdce42f3d689c336c05ac4e5dc44ee50092a9c6b2fc95ca63a2701ab54b695f456c984f1f12873282bc370b14be7b8f25a5b6e8aa205548a6854451522c160e91042de5b93c3260bae4a0c19605ed244ca50825c9e7fed7ad5a211f1d1741145927bb6a5ce033a2ff4ac98e952e3af8ab36b1671105ce90264e64e1bb9148d3465a307b00007df27c21a00113924dc4bc10455fc8cf1040bedc3fa090cc81a774d342ff1ff47341054c89d2d2000946088020156038f680fce06da5c2cbfa9b054c0075f5f8033904c1b9c9308e6da5c2cbe8909a863fbc6869c3c1222a4cff4674eeee2ce9dddc737f973403e628a20448210218008085394346b8157b45cc7ac6b8c47a8ace5fc22f6bd969965bd0fe2968c0d4fbe43d5e86c055b9b0981f543f96563674779b7f6edd2b30e6e1814000f589f00ac2383608003c3050b8e0a814534d8d710c58823f01e35ce0db8aeedba0619f1d70a6e082a27ee3aa400330c1180423da03f386da5c2cbeab2b060eb65fe0cc981209659651a28a29421c18811a0207c09fd0b6c148b0aa9c2130f54cd67e27173fc0b98c19c8186812e8000ed980e0080200000889ef86815c2414a0a0003b822c24a3d8090b48480025a881504f0607314668312e1c8a0074e9cbdd8f59a6ce4b66e56f26957afb9842b2a41ac020821760ce2576e1016a5e65ddb2162dc1be653bf8166f3cdbde6122313f9a30020903fd6d6270af40221d4ceb74ad2bd9b796c50e37ca018c08c78fb9697843c280b53c9fb2cd35922835d077ab9805dee5283b812f5e92c0acba937a48673b10200a044983d8fb3336a667b6d6ac700d90aac455dea10f6296849f6062f4e953b203e010045fcc40e923fe7d62c353096ba688b2377221832b0be64e1581ea6f080618dd1606817d4d893cb7421ad5bae41ed19be9a8b039c50bb4f04594a23382579ca72621599cf399f510ed1dd848a98bd65510438586be784a8889ee6a8000806274e923a6451d2a08274f40057564e00e66fe2b32109f4466cc1361121e4b6ba6944d5ab401e11842031031022c11011c000040249b0c4e34d27e2dfa32f23aa285ddf97f964122886d4f78047ba023dc019ed80fa2336609b0890f25b5d34a26ad5a00f18bfcd784d2e97f6073014fc461447f9f0693fd97015595e2fe5880000000000000000008e479468e58e58c38c1868005008808982801006d100094c14a6ac8c1c2898244d1458e207987956a32b1440099765273a22093eb1ab9a324880c4bffe3edc2c0e08e582093e0523000269ce0f1aa450013a78bd70a291003c42661e273234069242f03474466cc1361121e4b6ba6944d5ab401e13082882071441042031c1141442028a9b6a8194687525723a06bb0f7ad9a690489a1c500019b200086c606266f21397a2bfab97b32dd525f5ab17404acc3493ec8a080f33bb3bedf2652366072838bfcde60df1cdf2692681420dd3648b5dbb057b89e74aee6d7fb79dfbbc39454a1820ba2be375446d900347210b0e0c06afb4b623838b140a00fcfd8fb284eb5bc91aebcf590ac847dfe8f9cabc9980c4343d5ae2f59e6e9f568182890d281e31ba2df9af81404d3ca8682eca3a77f9a53dccc69c840b1445c4ad388163e81beeda2072911d2b1fbfb09b74c33b5a28dbf0921aba01aef868fb3b9cd96b6482a9ebc65448595c46800066236316c3474abd4030ffa5bf57137868409ac1f9e33a2c208e82317afa0c11229bc32770900050a2bfbb30c5800e92ff16a6c28001418d75f15228331f57f571d9036595f45444c38412168183a2336609b0890f25b5d34a26ad5a00f09641631c28c18619210c1233134f7520584770fa710c843dd1f192cce8d357a05676b23)) <<< 16000) + 0xf6307efff1e4b49c91683ba0003f260bc23a70a086975bdfa1b8960b06c7473259a4f7fac4e6a31da1f8dfe8a05021426ce346c8c05fdf1a678a31c651d4c380b98f29d9af1cc8c7db74e6020103d0cf2945c891797a9cb186d5eee5e811eba414db16107054de124e660014105f9b6c000a4a25369085b82bbbffd1ed43705e34d2f9f9d1815989802ca26ea9b3d6d4a7ffe636b68050197ae917c99288a14bd78b446feed10653c99eec2f8978e1c21c4f6e902387c5c4b8ba357ad42dc2446d4111646facd2c15675be67f7c0f6d9627c2186151b1ac033e819a63c14cf896744e409936625f94edfe286bdf78c3fa36af0961cf26027e064194749900001df09ed02800307c800ca3926e25d082c41c10a0c219d78f7d2486b47b9a5c9808a8851b723823049db8a020b1ad4c71c0808ebae5f5000602ca123c800d038440100320993080c2d007d119b304d8448792dae9a51356ad00784810610c047041049003000010044ce4909e111e195a88010677b360381cc31270828570ee8000d51161211ec8c8f60347ae1a0003f727ac5ba1d9f3073b4521c621e600aeaf060589b0a8b1821c03882661555840207bc9d4bc00402c187e692e1101508cdb03c21a0aa230ea89a001665f778338a85d8a45278c66442a02000011a90050df4466cc1361121e4b6ba6944d5ab401e6a2d795859c02cc5fe6bc26974bfb03980a7e230a23fcf8349fecb80aacaf17f2c40000000000000000004722100d0a2892460cb08a0440e7a44009280ea891974786528a7b4722ef2b324c9d5ff00ee96a7ad8b7e3f7fc6cc49c3fe8520a3564b090af57df791d83026524fd62d56a39d466da061b637248a80e9ff5dde6ce4c935b7e8fc5b6f13a496a5faaac7a200fc788ba2698294654e9422f110a109828622f040031b4ea451ce11c3adbac4c5543b8830e3c3031e08740ed806f3f7c75a4f80af9ad248b11a25aa85426eaac79b168f1000f91ffb36c58ac0f50b153d210a43f29bba2512aeed48b809595b2e8acec6470fd384b9f5ad8a4d80924ce0b56ca28808fe9c01eaedcf94a0095d13689d37bebf5212cacd66bb3d2cd5d0f71b6b3b7ddac44feae9e6cb33039387e1bb9b09048c3619699bd5c12fd02ded4368acc0b5a9a9fbd2e7c5adccaa1eb5db1a8cc0ca76cc2bfdb68f15f752529c4c805409ad55084067041570e7abe90c06df53b54988c369baf873c5074b899b0e455338fb4820dccf4bef63ff4f4725c16a615f6ae9943812f51f3ed4c4ca745b4fd1736ea69fe3d57987c149c20a43924ff74eb679091cdde5ff8e31d7554800053093d5210df908f50847a6423d2191e88c8f405415c2a3cf151e70a809814001ef44e7d4473c9a39d491ce2284449478e0200320722160b80d6175603feb0e42f1007b0cce310807eb3a25f0d994ae00902194c036c7043bb0a15686a7dae2f53b6646280a0003e460ef9c55da97d4033f790011410419496dae5395f63b17bf366dc20021d8d9b14b3848f98c81c371c6b2005307e045d49bb336239eaf6f8a889b7986793dbfe17cdb2aec5aaae2139fb005cba551f64446c13019084f0f0b6824a43b8f71539cfabd0064bc5d2029b53f952565409cdf895313ede2e46331cb727a5647cea94c22642492f943fa1c1072c40433cb189106003e49361862677161e5c27f54354563471fb4fcdb197a918faf01adb4174e64ee2b0ec55cdb1112de28fbfe5f4f218200de3f827367342dc9a1b9d6547cd6aeea5c7ea09a8f14c62697782a39e55fb67a24879d7fbdc6824efe087a90ff5becc37bd960048762a26eb58886a6f5448f2c6a5ceabe6b473b0530f0361f2cad4abd0d4f061a2ea02d8148dc6f76fc31d7c95881eef1a6265829b5b6aa6264759936b565713e394454ea793456e17f9cbe06cfd45f15534ee25a8e7cf6c2bcecc64e592aaff9ab636988ceaf630e05aed29d3a9199a7d3a755a2c7d510ebb9572e7596617605f50c666c2d5c22bfb603dd849d737c7303ff91909632b1a4c1c355040035667923ace5e6b00292a795a6656b0d2bb4ad434810e54ced580d8e09a8f3cef87a35e95e5b8d9d7dace4cfd7d2b02f44c89141001c2d09511c0b91d577f2dc881267bca9f782683f0979a31b4bb59677abcd84af3422310949dace11834620ab9e9466e7ca32f478a2afe946df6182bc8412a0c29fb8f81af3705a09d92fd230d1a825943a0347a17a86e9f08d49aec5dbf19c43162cabf97c070fcab5c230477b530c746d2f7a2df775c1ab87886598f7866e0357686a6e8a3eb381473460160138ed48db124ebd3b50b263119d5e800041b980a5fe0ef7f50889dd12755db82bd849d5e46c7a77027618f119e8997114f0e782ac15941a234605bdd3a2712db80ce5b80620533c24b06a10459f82304d8cd5bd407a8299649b761a591c3bf10e7b83eeae0e8299ff360a1bb5776e7de349b68370e5e58e41a7bfa0d7a0c0b0d2fa511f218bdffa8a547a00c5e0bae53fcfa4cfdd048a8f6b895d4efc962ca01ee87eda0115a91a725c7996a366838f6702ae3bb1cb0e440a833695a06a285c5d30b4e721e905d01ff8e237890e1895a52e933edd1c23bc770e276196b28c711dbbb42d32ab9f03a22a0db9ef2b0996bf06b6aad7058e241f9dd3cf3bc423aadb0a185840e02e401227fce670c01670b1ac6200bc0072f60a4820440100000e020010de4e7c6473c3239d191ce0c8f3444798223cb111e508844444792223c8111e38280068409e3248f1514788823c33d1049a84448438a2a3c2110b0868007c688280)) <<< 16000) + 0xef86f8a8b45b60a18dc939176040534c1446280a111323177f81849256d7f3c1000f4026e97008014f99b168a82a82a84e336071d0028f8124009141d7b2939c40a12778260140001179a20c5f290dc8b0e098f08bcf9740808bebfe900b906080774d12d630408680b79fb8f0e00968285b9100c047e7224fa3e2a2aaa8216bf8320ec882a802878e2cd199b93b8ef8580400002442782ba093291e000b8c2a42bf4180e2c1d9f56a082cb4f154f02c0b1c578dab6a90c300895440108086593fce590c102b39605c8c0206e04568e1800007a12000024881300638b0a6615bbb2cbadfe147bc308435ccdd6f307a97c08e082c72f9ec64382023722ed7dc1c003b8d1c5a009c40900200002f278c30404a18a1c581e7f6c0d0c2059e93e6f858e13991dd3b2870007a120010104deee210cb0467fd7db14601094ac06baa00094021c585e82563098430d162ea6183db95435801638a1c6a55310114baed76e94080da4cdd90e001ba2d6e8ce004801000017120460a0220501082808014000712468027a5ab75d04cc7e34a05da80da92c58e3e2fa669a54a1800f514a04d1409d8d5911557041480bcd55838581cc201f708b4500002faf080019100856040d2c25840874cb1e9ca712294b1a8e064572ca187d3f857346000670d1fb81004ff002a7898109002000028640a02404e12026090128480900400075070c1932d03e4ee122dfe64475ccf25080059682f00012279b4d470dc0e4080f1da1a19f010005267b10b298300244f4d0839500029720f4f36100001f42080b80b00004124d643677e1b3be0d9de84cd54266a60b82ea0576dffe9950c373f22400884618914a1091081070460420400430400200d82ea0576dffe9950c373f22400884818618914a10910810200005a6ca1c7a072546af6133f516a11f0f12d8114765c81783ea0003264e7c9473c4a39d251ce128444447360200033020a01bc209449ea47e01048a2843b4c703862e995941a9c70ad40edec14c8c081afd970a580c1066282767301000cb5489ae601002ee10987aa228204057353ab20542120f0ac080778023bb0100012893ba2998992cee477bdd69dfd39b5da4374fe9bb73c02411c62452042432422022010800470280200dc2a7710b37c0a1aeb2334fbcb1662ad7dd10b11dc8c0db28a12e20e88858900089fe04c0200477839b992708240086145b3b4b3f45928d01e2b9850d9668bb20058bca019557a509e0b05cbac40050a343706cc0848010077010000ac107705d93aab6f4e6e51144f6c27a048a7e686e48c5098341b27585073011c5524486af360bc9658009dc43bc210013e84040a94041200402201410e020001cf20009ce6ae6eda9ad88bf910109b9dd923377698ab3c82e355d61b34a36db00000000000000000004908513c9ab6e8d6dece7e938097f570e51981c05777faf9fb8fbe6e0000000000000000001208818614808804704400200442e300200d0002da27703a3b71d1db0e8ed4747683a3b3191d9048ec404732023b0011d7808eb80475a023ac0100051113ab298280ce0400200883da7f4061c0003ceca4581fe34d8d8e00e3556200048283c01080a0080200000889d484f8a02b40ff4c6080ac296c38a1006733ce82400c217a74c001954813fd800094708c02000023240009588a484e020020083aa05e108fe5043790414c2fc2a81879fbf5fc1046104401092474ac5374611cd3287c22088f2a91d31210a557807ce00837509f0400756b8fee09820840200002664ea437841b6ad903961d2abaffc861844abd790a086c5ed52080021412088004fa5c79304c1040010c238a1cbc9e5025726a7b438033fd07ca84610420100000ac275012000209200086c4e9c6474c323a51904e8c80013709ac8cc3c866748333a3199d10ccd54366a60b82ea05753117c20c51e7e032d47d423a48046414c9ff3ea78a9ff61273fca81b87f7409ac92fbc36f524ccfa320000000000000000002391031228c21608c0840820045feaef6c68086a24b249c8083b152663a214733152e60e09467abcac4f2001262ff8c59d7b1dcf471bc5e408851bec384f2341e67ca7a8474e51d46653a115e5ebdcee3a357899a5271305d8fa84749008ca4a092a806901944106fac53b79b4e449178fe78924353539e9046e00000000000000000004a092b34c13d59e7fee92f04bce997895a1bf9b2a031b3dce45fb2800000000000000000118c818510b006005002001442fc036712aebb8558e6904b8888f1f2f43558fa25f11a67bffd1e4309c594850927fd34f09f664bccc9f2519e42bc4725604590d66135b2a84f45704ef7cb5236d30da7e096245dd706de1c25e106c0e6c31730df68a5008598a5bd51a7400a00063b273e6239e311ce988e70c42223239b01000572939a1982806e0ba815d4c45f0831479f80cb51f508e9201194902b3bed19f5bed82e95d90923071ec6e5dc34a5699d6d49b55d00000000000000000009025cb01c208cd4bfe41f07074ed30bcbdaf1e5ef138a975d5d4eaa0000000000000000002386fe37e9bab3afc454e84b1291c4bfafc5ff69837ebe17db4565c0000000000000000008c84083084844800808a0bcadf85d1a645f62c2b95e90cd866ad6a8c80063068262829b5301bf5edb90047fb3a0fa565a29b8fab1dc0c2ca7262bd478b5dc166210df7540d21f36271200a026fea494dedab27bcd5d1bb56b7474491f36ad11ecf59896fd010df2620ca190871d2de6563635145d3a61441b57eddcbf9baff1e6648d22a7a)) <<< 16000) + 0xfdf555f074e8004299972c070823352ff907c1c1d3b4c2f2f6bc797bc4e2a5d75753aa80000000000000000008e1bf8dfa6eacebf1153a12c4a4712febf17fda60dfaf85f6d15970000000000000000002310a18819008a09000e0228b0c9ec96a002135a2e8f47a42bedc6ade899e71a67b60ebda669601c7bd1ee6f42b4b6b588383200a555fca5286c6dd8672479be6eba46069a39c4610817fc9152b6036f686e217495a3e1320982294e641473002397011cb008e540472802000594200a9200218e2726c31345d9c92cc47d5672293390259970cce3c5671c2338d0d802045938c119c588ce283471203388019c380f86351855583b9e430c18df0d199bf627ac246f221885f5f45e7c91035551725e9450e2424ec56c5fa79ce38c05e32f2f6ff0531e2c1283dadfa60e5498901eb3ccb2ba74c8f5004106c54e5c2a05d82d050964161d03200a807c306ea3faf9b6eff8ef2c61f4792b47beda997248d17edc9d4a436a8314c086ea6629e20ad1c4e121120ac0ba8e68b2b743010b0071442418db6c02800fd822eaa3ce5b2bc000400ceaf75e332e994412697cf75a9a2c36a0d063011f398218420000c1c8970ece1857832c94ae5f924693ff5c0564881557318d0900c958e67920224840460103850181500f86020aed86abf6702b05a87a457c031e758a74426551f255814e9cc184bd9d0440d449b3a4e58aeb126d42b37f2f0d1670d316b9aca92c607d1ec8041aa1ba20108fd76dbddd1293c7bbd39a86f2531e4a491b05636972e1a1c1a46d6713ca1224a0fbe3821139c5f1b948ee900040e61f6db03ec04a20e359c51b12a6bcd324edb9e1040c3910e7e22f6f5d950da5cd025286ea41b0dc9cceb97bb03c5748519c56800051627085a38329045128e0824000d384e04967004b0291189c06cdfc366fc1332109e0c9b1fcffa0b18aa4e169f1234d374a80d20202303a0e420412b529b2c904b401a24d0409aaf566fd24059615e6f6082201418118043063d1c4ec1e4cb18f22d6acb0f24682bea85ee9c904a20c4961e82000e85e7b03204016fc1bbcf4e0405277c2a15bc101062ffa4de107e2e1e270211ae66f8ec204d87302a02000011b937d3580284ec6504f7007f0995dd0c10b7ee9f23e3769b47ba091afa02c9a7654cf948f93d6c25edf4598978448202385637c62da004a7c12013ee509561d5b013e06081c4f5f3bac9976ded0056f5cdd7028a33136814106310cd931af5c207821738f5afd69668cea4042b0ff58bb27f8c7d2410bc617dc0d1e421b90e000843a360ec7664dc6bc062166be1282944b0ea306b8396f69be4e9816a15596324da7fb0cbe274f52933891af2de0f052e194551090e401a2c25dfc569478c2051f1004332c4fa6daef6542d420a7188314d66e107e89fb28042b4914adb6bb94a14430000050a46fca46f85237b211bd0e8001d709bca08de0f46ee7208c351bb148dd46442c02000c3724260bc153ca8a24dc1c51a3b3409ac7111ed584cc2301062f534d38704192e6f2f40c1197c97bbb89008e9da6a2e1c02419a9cb6010014bad86f9404440026c6f943328225209804182c5613f04aaca8f2122909a20a8bdf33398e25994d92247b6d080609a69447cb05b7870a008e31dcb05d97eb0402858106640163eea02222dc5d29197aeb52000d5c6767f2cc02910d7100a721b7dbd10663621910f01b042c0a0002d526e892373451b9208850d44262a2110d0002ce905019c07a7863dd02f01c33bd1fc629901411827b466121880b4c85382a6ec3840791b8a16a0081075b8e5d1fe1400d5a4f699580100189481be676a0a82a80268d3847fa01449f04c4797340a151a1b0b40b0000504708079ad02f475a88130045c507dd82482518cae9243400c0966e55a5183b0480387538b89ca0100625d4bc08220a380549f082c4734aa2aaa16617c5356fe488aa2037fb24bac040a0df107703203c00013d902a591b8aa8dc0e46de4a032211b700b0721f027dc33b61c52bbecf3bb8b82c305dd4c6b66052839100d4a000da2431abcf79de70010206d40c83339210007b177312afb0040106b812abc7de4849a6471567f295a39c1801a30737c6e655330e1c51423c9672d242c32fa94560a2f0283f2fe0071562210202c2c7eda80a1c123cf970a931e0402301aa45fb6245404fdbfa96f7981403637cf6f7189eee39c1801a000093082806e040da5b94249b0c18043567f2c6490a0915899285c3040b4b89906c118100e524979e50608376d782de602001363df3ddf408012864eb5c664510289738b229c0a86320e0b409067a0233c01000131936d2998992cdb077858015752a001851cc8d85bb7964d2b3dde5168e280033c2f97141ee80772958961387b37c1f9920022e157e140400002625a00001d5620e448d2040a0051c6800e4e1c001c61cc413a7b79a5d2c9530f16985800e4e1c0012380033c2f97182ee807729589a2387b37c1f996002628f796a04001aa6d32870152a65f4ed49042801471a0009fa9eb38c2dbad24fd1a5c217a0e1acc2c0013f53d648e000395de6305b0e5f4bfd9a22d38c2a62a7002500803b80800063483b82f4c001c9c380034b3988274f6f30aa592a61e2d2ca001c9c38002060006785f2e2c4dd00ee52b130370f66f83f334004c51ef2d40800354da650e02a54cbe9da920850028088050438080009308003231b24e574f3edbca229670be18b492000aba950006100019e17cb890b7403b94ac4a05c3d9be0fccb001170abf0a0200001312d001003aac41c89)) <<< 16000) + 0x0a40a1400a00007d89b58c8da8646d232368190450c8d9c64674123380119b808cd80466a0233401199808cc8040017184d99266ca8b049419b21ecd8ca60a03336215d104dc1069994206a30787630848236664141b9ceeec5a503c27c3e378e090ea551b0780e33332bb80138a110043c700451aa3e5081b9ba8a8ca0c987b89dd0e189b2bdf5718203594b9025030a77052f47044231e54c804e2046010360050000c3935f0d9af06cbf8266c21327505c8e38d46c366f92f307143ab10af22a999e16088396c0405e70ca2411995d2535ea47b43024098f58e0e7c3f4504256fbc352ba0328e04d46e2b34bd15f80c0174168903f30bb8800071046e3e4abf8a2b6e8f48203b0681a8068d2c14692020002fb225c4334f11c7b407e70db4b8597d56560c1d6cbfc199302445499fe8ce9dddc59d3bbb8e6ff2e6807d928927078c80b6a2d795859c02d0f28a20610a04f00087653b43f017a0798cdd9eca87d9e150a0b3d7b5a80ab96537dfe05e0f786bf72dc9da5217be62f528fb543a4582886195170acd83206da5c2cbfad0aacf9b7964d41e4f04c23da03f381b6970b2fea6c153001d7d7e00ce41301ef5014b19ba80ce0ead47bcd97d039e697904ac9449383c6405a1441e39421408429dd4cc88f78562f717351cf1cd2514dfcb05af922166d5a05f496afa1614b6349aec278a2aa9a4b12552c69d2fd275c803d84100826b1bf64b723a38aa9090bed9a59d2cae690a5dcc961917888264a1ca9711b635ebd8adf14731c66d481a08745360090002b9935f159af08cbf8362d01b35d0dc8ef5db07cb0e28093d618e381d0f1c51d800118e110040d40446960a3490100007c135c2d1ad968228b400154c4d68966b243358199ab8ac0a4566ac1b3550d9aa06cd4c1723a9db9820d2ce09183cde223a3854c952485d70c204507bae8e12083788536d189029a98e46fe02800d6b47df980800b43d4b09d821d01762748800356428ab0405a416148100bf8866a433e25c5b165a69a491acd2d1624421bc4d2d028850d83555890a3898faf786104fcd75a7080031ee47f800138c118040d4417855ad38e9a251041111f9e942f7fcd19c8507a426a3a9920947422d2e08023e7abf2000cc3044010c288c465a93944036dd35f72858991e6b00506e6878052910035bcf80412003f8df408040014d9087e00338c1180400005d88001691806ec74cf343e1cd17130141570c1dd079879fd3e6d72437822800000000000000000000000000000000000000000000000000019eec403aab341371db02cc81880c804204f000802965a595cd9230a95f67b03e4a0de77e8a10a81c5bc403ccfacd26972e7fa95893e6215727e7c83d4dd5fe4a358e1a541f06589cb0207d6ffb7a5a1f17c67941482ee7a0ac7d4d2144886a66be56f5eb9e15886cbb25bfac4ee6e81fd0cca420872d00055026a03a34b091a5048d240400146e407cc63ca5b34f259a708f076d8929d6f058e1b2754ffc0704a763180ca060c1dadbc6b62c02c16b856a8480e5c7d679c85000a4f802af8400a97479ed8400790eece2f482d8bd134c203d0604e0282fe1d9a682e3dd436df6d32dd9cf6ecebe88e001668a0cb1c35118483d68f60000000000000000000000000000000000000000000000000000679cd575151df02c8b1c91c714708e043043000406fd0af72e3d1628d070437a83e4ec765b6755e4797c326d325a83637657bac45f7c95716c6a8c424a4e96690d73bbdcf194723e3f1f822de095da5ca3dcd9a6981234b051a5028d240400091a4d205423e1208a0900039993474d1a3268d15341189234401000a5f105011c0931bf2f5fe88144a8a005702022515688bf96005ed34b6d85009bd507fce040028ed457a80801201e6fc622a88a188282f784193191406400cf5a415f518e904c020343211a10a8d04446801a33f0d19f008cf404678020002bf3019163898c44070d3fbc1001b05020bbfc3c0b81c13339eff314860ade2fc1b614a0042367f9cf24819f2074c5962000658460f9aa2a82a82396470dd488e2110a40606762a33a1119c868ce02466e123360519a808cd00466602332010001751002d032662e33306d99794ccb85665a2332c0d8020ad932b1199508cca43465003d124e0e605faa2f8f2c401011ac976e080ca100aab4aae62744718328d38a452ec240040ce45f84137cd2a12c068b05616940e974a02ff187cae65f25940104059fc6369bda54a00037d0de4e90740c832105f0b09525457973e4008acb14a5bb281a0ed9928160a205181570d2af3ac9402011640998a9f54d1bf0018218af360395012854281103274e7acc6a7db1ed000222eee1d2dfe37e48230057300a52c4709870b056dd0d0c048b16061797b21860a205b8fd9b92f2200116dc2a7f8b4200bfdbfb6efc70300aa4c4c0a9bd021699c66f8bde1cd621691b950085438c585e070000203264e623262d192968c90846463a322151900080014e498f02f4484fae0004dbeb487785080dfe3c9304b08c0c7040c4823056b74dd7718f0608bc8641be5344ee4380c004d8702b2be6285a80008358315106cc6a4d9ae00002a270b3e28ec0b361d034603c4ae946b6236be8ad871d4a888e12832109cde1d0bedfe409b61f476305f65bb79bb9e3a00ebbff9a3af328160000000000000000001208840323442841032c10804444b0ae41a5ddd5d37c661ff84935c4da9e31d223580ff89c80036eaf5727557baeeee044f19729f9d1225b126386b4068cfdf041d51e9079a327a8f776)) <<< 16000) + 0x123481fe61bccb900c469109d493a7ae9b8051ffbd256dcc9c5500d99aa1512dc97a6400a000493263e9231e150003e3905015ef75a77f4000000000e6d7690dd3fa6edcf0091111a68dc6999e3fd2c9b3631170e0e27b3fe33680161b74185ac380000000000000000004822c2282202081040514025b785059ef0db904ede4f3bd012885ffb18dbd04f7b16d89146d1a5bdd5b2a0098ae2e5403e4ae46b8b2239c7c80e899e8e2ee9049dc023a7dd29cc87989290adf8f937559248addda0fd33ac22b44eb86a7fe7edf90705f56405f998aae70a189653a8c76b3f3474312067aec07ba5d6be743754d00f4c8bfdf7aae7b9ad4001834c4469a371a6678ff4b26cd8c45c38389ecff8cda00586dd0616b0e0000000000000000001204a04904704a009008010516ad046ea46b2984dc11368c8388d52196feea39ef4bd4a2028e61f3b487f6c6b7083485fd1512c76f55f172b8174acd2141f17a6a1ed2aa0bead0976d87351fc628d6857660b52528001e2131d5918e2a8125446369a31a4918c9a8c60840103a08e1902804cc5c2662c0a3150160e019b1f111382c279f38e78fd9141612c768be620c04919df5a425a600997602578ab2c0696e69a994212004e54b25d5c11454511087df6858d530620192522dcbcc74c2d02868cdec2285eb0c606d124d2fb1a65874c0f1c2b6e45060bc47f1c4ee20404a4b81a322500c590af59bb08a003452f47ff30285f6d22dc8c9082fed5cd19591c46482c02468b83ef13ad210205258f1dd3f7b1021c240ced78b061013d43afadb02880f341bddb7a10206cdff9535d180012480a99d68001d9498e3fec88a211ab0c243358150a920e0b40a04fe0227e0140e2bef7256e1d6548bef840d56d9e2c71650301583bf08dd90312f4c4e33c6156c158abd5f9643a3bcb5dc469386a97a288150e0e295f28b091d3dd4050055a80b0a188698d3ba9a4fd7e000029b7ebbb9f54fdd637d143a47b8100f72587cc6fdf67a022d55f63088121fe8cb525a2282bcc8ab3ff90a85b644ecec89372f68a78d8248deeb4efe9cdaed21ba7f4ddb9e0120a27a251842039e38014efa0b93a4927b47c0d886fc27eb1f9a40b0594b8dd95e3fceec55a431d94d53042096f8f3b45a977ab69c3806d9c58817440c1636b3e4f990e20534ad9053283081b2224b85aa10100804427f0da30406b48e0fec0041178f63086c782880d81121a955029d441617014047c240004a446acd42c402000470200115c77bad3bfa736bb486e9fd376e7804826886087065862067002808a2ee24b217b6a6c23cba4ee2aebea1504234181e228d7677c13c3ae88d228d0001ca2001a244003d3498a1acc4cc662453e3091ff49c7fca18cd3153c0f4e15022f00e2d4d161597d8c6e4e10dedc7127ccd111f20923e50c0cc3e24cf1084001183bec0a000eab10722469020500289343102fc006393d046035657e8b06130b823144f3084074063c6281380080b7aaa55bdd3dc60eaf992c7638092f5777a315a88045b10ec4f1b09fe1d3fea5039f066d68507333081bf266fb543b101dfcd342a3b7603c71be29dcab59d4f1a99f11665ccae1400f9975ab606667103801901e01dc040003ec41dc17e6c9ff6d4c98b1c34605067278d0df99a5ee38617f0d13639c2aefe15b02c80013124db9a18010de54dae08003710e65e14021280402201410e020001d52000b9e74b311bc869eac2c872a3aa757ce24537df864b5911450244dc8b3c03446076e59a54130474638481aa534336542df088830384bc316dfe618005fc5fc0008443192285804800022a3c6389f28aebd14310206285611c296c018299d1a2df4452f1151c22abbafc4859a200647c399918186bc7e9708880023077d814001d5620e448d2040a00512686205f800c727a08c06acafd160c2617046289e81c80e78e80c78c7001018195b7fb6f543838d3febba9b58f64994aeb3e804590fac4f14a9663892074912e9fa48c2007daf821080ec6840a0584060ad438d1b1e34a123d4cfc4043f867573d3801280401dc0400031c41dc17f37fd540013f5cab846770572924248706b8a5e27a99f612ed96e0000000000000000001204f34b1cf18e18f14e14404800200c820080342201410e020001e52000ae074bbc023592160b206b1f8f7ca8245204e0438f745140913722cf034448e56387f24c12ec602ae33f3435b254df5030c0cb381ab5eae18005fc5fc000910c722854038000216200136074b3f624272e2034612a4063ace12452e1c63b10183446eeb34810973048b2cd4542f83036ba8da8c9000c004ed0da62d008016d92a1dc50004201ca01091b44081601224d0c40bf0018e4f41180d595fa2c184c2e08c5038f34b1cf18e18e14d00400200c82008037cdc9d632d78a00f20a9f4523e51d2c72a3da7fa5244f1a7188827343f386795a3a0b6518e178d33335768a28024e486a261ebe83801701601dc040003aa41dc1777ec72bd46f13030940ca0cacb0d60fa9da1d37850271850c30c70a68a68848238010064100401a1100a087010000b310004ae38509e9431be79287984aff9157440868c5fcd3e884100913722cf0181ae7d2edc77a2c37ed91c25d8c604109d8bd5decb0aa98e1a27630a002fe2fe00044431a450ac08000044048b80400126a48b4844584222b211151080a484452422261111204888c24444122210911004887c2443c0221d01000f3c93115d9882ccc3d5661ca330d4d98624cc2cd661453050258dc10cc24766103330715c8ca805cd6ee7b44889)) <<< 16000) + 0xbe857ea0cf43889266daffebe02040a2e49c9a0706008c63a8e1cfd04817563fbe5cee81007f9b9e9b2ab0a0a288084345fa77172280a001946241818488a00390400a4ab194740f1860070deeb4efe5bdd69dfd39b5da4376bc72553902445499fe8ce9dddc59d3bbb8e6ff2e6807d061e07f1ba84353749af15fb590daaacbfe2216901b25841ef8600000000000000000046108e175121902d090880890070008a02bad49156b2383d6ab0fa4f9d3a1eb6bd5deeda77fb35087d3256c910da258e74b91be89484286b3822c409ff516f55e3583963b9c8a90191e173613465e1e409f80f12aa08eb4d1399130066766c80be379c2d915fa82b35d8423c1267ee871969aabbddce4b6ed014b5c9c3bacef10ed880234253e48298302f0a05018e86402421da26c2429bc3a2960809e445a2540009080800205ca221110100008592fd2981212ca9446054138074b1d9cf868183f0cc96882a6ea820bd4be3d25ce9afa18c68f3d67f2ac41a958e73a7ee38d65f2f1fb6c57ee753e0634bad3b84c23925c3750e3b275bdc85c12f12b996a6b1f66b5a294e178b27bb9d0e070d53ae891b55858bc9797d3f579b66575d3e2d3f01df36ded7d62946df9fe844af54116346b78500eda86d7b09df199b0f68aa58db0d3d59167e49921a1dd38f8c298e6d1b4583d4f80d85d0cf0313400044faea9e16f209d42cae4f71eae49b27cb1d5504ec90bdbe82488e2a44b6b20016a1dd3b66452d95b730e4a50e2edaf55199760d66396f164076f4763ae8045764288f647e751e0ee5a81758f5ee3c145077757349c56e9524d46edaf6e55029ac77cdfd7263d41539194ad42f4edf08d0103cac7989056e5214c2c8a21659258b1e28799ff74f1a22bbeaeb1ecf61cfc6c12d35e170890845fa30025afd2f4ed603892a390494a72c463b632f9c99fe2736d6a60be8888eb56bba214f371f2442e5e97af36c630dcb7bf4ec16ff66180046d03d9d84ed9cacdda573c9e7b986d7ab60603c9412f717ce3ba1b3f08e9fe6005ea02000cc423406330519e1e76531a3224019b3031ca4000060caf0070003cc2bf000920a1180409b8166080b3030597382cc0817a68959f4418480138d6b20880531c669681184110040c04160540b1750598002cbfc1700c010040bc04e008020082fe01e0e00d29566438f136dd630068002b7ac1ea11841200400002d4845028000470c050040100000444840040003804b94542220200031d25fa5b0242d97e08c0a8272146dec9eabac21b03246f5eb571ca974ad457912a5b758098abff80315a9b8a0dace28c670f501bfaa5edf3a340b1e8f34a2c18783447a2caa3bb102ba92a45d4e9f0f971cb63ec9b993c987d1e699e9cef878549e684aabb4be6f67bd7441bd80d07cb481424143f2cbf9e4b38c7cf25c0a87c7cef38953535a921424af22de0e73f4e2cce738d87ef24f616d90031bc0d33380bcfeca1850005082d41f8f284e9c061bab1531cd16f89a4000f6277d87090ccd15e623964dc04a51efce9ee9317e96d5e599bd23555e06e82607bb14f193b51b8ec4f5e29c6d41834844591d248c5c12c11edf54dc6c32372d4752735e3fdb6a0d28c911d218ac6ada30e0fd8638220019ec6893c0088508802000010a4604345f61a2fa0d17c8685f4345f00a2f70517b008bd4040012984bd1042d87a000e6b204a6b2f33196396cb18961003b2c3159610acbc84653c13fa9da1d37ca0cacb0d66f13030940977ec72bd40506f75a77f2deeb4efe9cdaed21bb5e392a9c8121e77389ba3e62401e941cdde3c36aab897fce97dbfb770678978c0000000000000000008c66141841828004803808517d4a236a4d728c1e43ea87027f8aeb81557425962fd49fd01fe07875c528fbb4b01aafae941b200190979cd66e66851cdd2907d0d1a8f10ff2f1808286d2ed663ebfea2ebdd57416a2af0c62d3646697888cb9c37c7444b74012a2f5dafe22242f7bc4825922a4b851722a01efbec791400d0ef41b800130e1000437bad3bfa736bb486e9fd376e780483a2336609b0890f25b5d34a26ad5a00f7ddf0fc3f70141bf8dfa6eacebf1153a12c4a4712febf17fda60dfaf85f6d15970000000000000000002308470ba890c816a30a102b0098001b04aee6ace3cc7a2b15bd82854f677db7444e7ecee0448714a0604518ac6abed1804c89cb03cd5335e2dd123e60132b3a3fefdaa0112fb62908f072f3be792eedfbfda9d5440b72d7429b8882d802419474aaf9e066f022840eac90dc184030efb7a3aa80cdc70ab2700080c301c04a1840010c108d867a6201d512af00120c1d00400003c92f011c000040105d80318c0140000401134c585ec2c287659fb5d3803744afe4c0074010000138600002008a1daf206567006800f5b44003c010000074200016240006948860281dc0400046c4000ff48004b592ef0997004ea0b333154e0755f526faa047927ee0b95ac7931a6bad78e0b9579461fec2391203aea306c38190a62d938268efe30ffe3b67b51cd3d4056ad17d3616fb58c060131a19b4e81a1629f24f79184bc603d9cf4f78405795bd6e460e84ee7f58c14037e576fa67e917b1961247f2de310d4b902fe754fcaf378d42729437dc8605d21d91ae2820710f933fcda6f48bd0b6e6f1d3e8856a902f173a1254fc208af53edc520b4834bb912e83e0836b704951bdc9e6202307cf27155ea5ebc14ff5e079c6bd23958134105ba41501c3931a50405a51715a9e521063c4d305dc0bc02a6b69a09502c885b33c4003e0108000080200)) <<< 16000) + 0x0008897682c4301621a0b802008020bb01700001004493d3cb15385820a71c5139a00a90c30d23002100800005411900100007d12eb010000b0900e01f1df772bb82c19a6e5b08024203c008b0560e9ebf28cfee825777e8613f19a2de5fcc280b81282a2baea565df04d45a071c80001c09ab1fc03000892dba6ab6348f3ce2054ef232e9e59639ed000f2aee38906056c8924e55a93ea4122b0183a6623182c4c75cb1ad4c339c3c4fe3d57dbd25b96563fea0118958855467b90408f549201884c8f40000f088150480011b4800386909d1d09a0080038f0972908444040032d04b74b655e532ea2197486c20027f53b43a6f94195961acde260612812efd8e57a80a1061e07f1ba84353749af15fb590daaacbfe2216901b25841ef8600000000000000000046435a85c308302ebc72553939b5da4375bdd69dfd0deeb4efe424418320118140024040311fd7d66e8d025bfb64e94ad56dcbaf6594beef17aa745366acbabd3d108aad1f4e8aa32964efb184ce50083f660915f2b5548979b2a1ba05042756d3fc37cc6267de76b8641b223d9fbb852f26e45079aa629897d2e80d97386cb982721d651acac45da3a2034852e38bde85ac40d424dcd9d072283815026638287e4e83072af027aee50c85401e3db435819ee92009b40bc1f9b93a30004b62775c692590087d64b60d64d6b116650286c0a8b138a6cd0e8910e8070f2d30487f790c4403d7808f4c0903080021324b9b74eb4b12bde5dc58409ea07b00cb009f249f38902c8e396c4100b61697f8098308002000026042ac1400046e496446052230320d93080e2305746ab7c158198f4bad9574e7a4c81c283b50c8a3fb37dcfa04070bff6ad88184f516e79f423be4c7a88f10132ce160801e537a1c2cd794d15805265d51dd420e0319cf9d43c549c4b1104e9f6b4849c180c1ff12d5b370ee2976c26b5608c77880006ad5418e6648ed60eda38945e6d6489e017d380818cae43078dc45de1e41bad11258359026ddf2c921891dc5700ae1a00049e25ca422e419171848444040014704b88f44a0320050d00082f12e15182a28c0144741cbc90ba1c6f0dd2faa96ce05d0c442146b22adc82d658354f5eefbe8a0959127eb7ced6a4f636d740b8026dc497bcb09ba39835a749976c49eefbf428d29fb05e0968ed62d7dad1f0989aab95e547a5941be440020096cca079cd116f13930d2eb39f7f66bd38e6d18681c34724c0947ad3f68b5624976c98fe98d4233d6d29e4b9a4617d0f60a6f790b50689fe73d2a80eb9a7edcccc86b17003774af967534330a7a553b6cfb7ba8d02c6b4e3c30d91dcd35279941f45abea313e6b78a4e04343032cccffeebff35fe8ae60355b599e40feff0fb51cd3895e8f21beff79f39c6ca230e932ca68f5716d81f59aac2053cc5b8282f26043a667905680b2e001d07af44c91e084af7c50afba51ea73b0c03b659539159a1972dbb4724d540eede9bdc70698732dd725b6835d573a53850626ffd2a7032da6862f1ba1c1785896a7bc50e2adb0d5554aefb2cf797cab73dc6cf6f94be135865ed68915645b9d5d5f58ec923815f3d66cc6b4d3425cd91836aaa3aa6a1fec0c7ee1fa9d204e3c991f6ba87335ba62e241da0b6724a5ad650cad9f45fcd1f9b617521acda7492e29b93b1da026a9ee46004c35c2005557f806aace8e0fa7a473c5c0cc2e3f8a05bd0c94301943ab7a728909f4ddb593ca2fb1ac2612b9b238e3998e7596e4893dcd5875b28fb2e38b7a03705b0f0f2e6bc066ad6c394d26635e1e5029238c48e11c41829d61262b1217e610a62f25c839342ed070efd42a930ca7af7758f89a5a7de850fd068be7a5aef244aaef321069186f1b862622244820e480dbee201d92c6cbde84c3d60b386539d5fe76cb82953e9a3e26d27d9eacd798faa973e2c33341ad158ac1202f998df134bc236f474e98488e82dccc2e7b3cf3383ec6bca2475f2b9c7c6c428f784d828f01e4e466e6717c95a8ba94356ef0e61785f745efc348bfd8d61842a971a27c7a61f4037125aa119a35c9b2f525d2f9ffbcb4e996775530f08f11ead7692eb2d96f90f8d44e67fd6ee41fc27325df780df2faef0fd73d19c4ccae15904f0e0557b5aa8c78b441af0ac00005fe213a1a000fc725be332de05c013a63bfeaac874f6fe703c036e6a7a44cdbfecff188c1cff057bde2c26b41089f6e9d8e1641b384a6fe80cff6debe5a0fed98b619e4710cee26ef43b80bd674c4ccc1df36e925ec218a77700b4f3df1ffc6dfd87f512f838fcf520c89e9078016883cd76e97f6aea5b8d9ae686ad9c8dc752561e5ff37b05c61a0041f124477de2e3a6b6a0d3f5f5b4e2bb9f21df277d821b9d5f59c11d1cf26dbc6864b49386f7d13e5e8d5963a08d6af9581408b5f30e1129de677ee5358ccc8ae03813d00bd80c51edca672e9a803a4ad336c5fb4d591a1d1c9bde659ab7a940722b0ab861e764044ceb967f62c46acb6840a8cf0141e7bdf06dc0e8cc5ea165270a8fe2cd80525cba1cc0c3c00a494f7de1d493cb8b9e125bcabbf0123ca2f603e8fd0673e16670c608009a733948912b47000025d496e8ccabc665b803deeb4efe9cdaed21ba7f4ddb9e01237bad3bfa000000000736bb486e9fd376e7804926cf62c3e348bea5665763e7b7ec2ba791eb63738a288c1c6c340c0000000000000000000000000000000000000000000000000000003619e20c20e0a400e00a0000010a6a03e81e9a74e589c52e117bb1c8cef1a50db581269ac7f2bef85b35a7f6ecb5ea67f90da5c7a42)) <<< 16000) + 0x7679e78c166b4511186fc1f7600d352c511efa71a08d8541a4c3975df32c726fdd073712d631004a8f5cdcef018c58943a000be64970b45b6522da250bf108b64845b03a2d71516b0a8b54142d60a0028c125a8c22d35d1692c8a7c0400b266492417bdd69dfd39b5da4374fe9bb73c024fbbe1f87ee029378742fb7f9026d87d1d8c17d96ede6ee78e803aeffe68ebcca05800000000000000000048417502bae22f8418ad7aa52728c8cfd2d0850f08504500400001afa2ca6cd26ae8f0d68685e8cfd087aba8e3fe32a5fd3d5f8ca96cec04f2ef6f8650c22503729a9f1ae53061207d67ac6e7cacabb976d1a50234384823d6204f4a51805f4b505c6632eb3a87ef1d38766ca0000d1cea7f76f2ef9c5515a4e0fac3c6172ca06322835ca742b1c07065306f742d420e43eda7d1151126a53c13f6e4b529f602c53413736dbd0fac0da1373bb2466eed31566e4316721c160d013a8000000000000000000484de1d0bedfe409b61f476305f65bb79bb9e3a00ebbff9a3af3281600000000000000000012212554f4c94693703cce320e5e29025a87d61a7e42960b6000000000000000000000000000000000000000000000005d41021414000c0401a3ed6db7fe1583ce76331d059375aefaac37d99b5d522a092c1c81dadfdc2f84e9ae3741db3274acc1dd3759f1ef5a82b9e7eb0205b7e00a256ca84e41f674b1e1100238ebef5bcbc4861a53006cf6f7666d958d76afe2e332517706980a77df926b88a259b907442929b4b0de180393c085d3bcb2e17b90ec3d580cc25ee812483f6c538be3d3f3941a7a870aae036aae1fe5ca0837e36b2441f38ace055b561d0fc3975b89fae927cd33e4aa3869d97a0ba7191670c88f2de6d7b8b21bcbd762d21d053d34b446458a3229c1514d828002b18924248b411459e822983d14b9c8b38d452a421a51514988868c443441a00126133141a42a7128e2a2370f9582840633d0d1e6b238218a9045105bc88d19178da26e4780242097682aeaa7a34df601b50023168c1f0137902156f1a2401231c2a6af299ea78b81c00c7501f4338e6bc2c42190078f7177f6068d9933da8e816d8f205ae61c520c07bd4052c83752dc4d6321f8106b9f244d6c127ddf0fc3f70155e392a9c9cdaed21badeeb4efe86f75a77f2121a62902a011212008402219c619d6a74e14a970de112c1e1a14003faf7ecec29b42511775b1324383eb411d6664d986068d1c3fcbc90b0e5c13d4000cc49660ec604762fa232bd1181504fc164a9747756854a7d563370bab9c49930f60697fa366348b1108962e84cc603196d887ffff6e98212f796403221253636f97a491874e66905786539286bcc53527fa514d12448b8e91fc4f149a3b5a3f226a445b06e87029ccd02b50ea95ffc27bea53730816673918d6f0b1fa9b3a4ac723b5516c01afd6430dbb10bf8d965391a0206afa82292b8b9f317837944811dc4f94df71ed2fa5dba2c1f7b086fce32a307f33583e84d00e6abf89b848d0391f9a268873faf13ba8073de402ff62802d319dc5f199567d2f2b953d4cb5ff666ae3c64bd039e901704cf1b6677cccfe12d0750a1e889dde97444476c48baf5dd38d43893aa3884f4938ee3f1d746629e9802c901000415916c3596698e62cd2ebb9fc1160981c1c454f5688f22dd1ed65e4b356a225eea5a26fb2fe498dbc8c68421afeec5b703d88ddd5b4eadd71203c176e89a88062f68be742afc6805220ed8bd1b9fc9e6cd1d94f25149707333094208b69985d840460f04692ec9f5f9a000883b9ee0bc841352bb81ea85e9ee5e1e0605205e157487eee9f975ca8e2bd8c632ddcd3dd59188619ca471117ef2f5a4801fb7340f720dc70e7065e19ff66b96f91e677a34d7b9a9c384fd1d9f8a39221b325b644cd751f4d3964d71333242c38b163e85a1539257e673a4e171ec82ed8db2b1b821eba3306281eccef8a0e66fe24a34bf510b14715734a3e514845b00b0082424299be931411b67d8ece83e2d0ee409983f3937658696fdb36993918febee1400965458477dde1b2115c04ae093addd02771f1c783d87c5838f0d9e3a1a580a858005e4c4f02f7713f6d4d5c3b5a9e5695fdec54793b27f2e5176ae3595f2fa0d60004cd2480706276ddbd2f6bb5295eff7487812fc57bbc94dc816723d6e7f2d1370054d848b8acb532acd8bce6c4177577ac313768d2361ea83557593521947e9b82a38fd6a83f898e874582518a296fe53acc2091612b3e0140070fa155e0001290110042a395fc5512a60e20b63f260a2c9a22e7680004638440101770100006792be1500010b90007582598531812581504f8409ff12628416ffe6479440063e9c0afa00201196110040b2c144a40a2ca0116480800045080084792c83196394cb188658a3b2c41d9618acb08565822329e09cc50abbc6d60f70b06e4421443b4dde08afff1146d822c3253945cd0632de6b4920c245e0135eaab0150cdba400d021685f11a0057e7b2240305246a8c137676494200444720643837d3edad8600208afa6af4e55cc32cc8fe08254db78c6098158dce49847a0dd4b713559583075b923516d804807bd4052c83752dc4d6321f8106b9f244d6c121081941040a8016000036ca9674a401e2ad0612c26336d376266332446546dae8886ffac4f39ae371d04533d771ada7047eb7961c06b533a768ee261cc87fbee6ff7ae344c34f4a6a32355a1fecabee9cff25768edff9ae6607418f8296551196c8224e501d143182567af4617ae0b9f6ca008a0bfb923000131abad80012)) <<< 16000) + 0x8e1080437392611e83752dc4d56560c1d6e48d45b60120ae49848e3122881040ae01800059c75e7ee95eece1de322423f318c524aab4273b1acd28040c3589b78b19db7f8b4012bbae9462c1db4fd94e241250cac7f400091e41db240b48cb78300984080021c589fd82ec08183137e37a0092a065fc960f84cd4898800735137a804a204001000010534359ce00553c3248e31185075b6e7acc023101f00803b8080002fc8001959000526221033deeb4efe5bdd69dfd39b5da4376bc7255390241b9c9308f41ba96e26ab2b060eb7246a2db00900f7a80a5906ea5b89ac643f020d73e489ad824fbbe1f87ee0290c1040c505600c00028bc358d97b5b90035944d493621984c971776ea0bff6eb72cf19f8264054cee23e7c72b613d0bb2d8b268aad1b64b7f87891a7623efae0c41f474e328c7e1bf77392611e83752dc4d56560c1d6e48d45b60127ddf0fc3f7014211c2ea243205d78e4aa72736bb486eb7bad3bfa1bdd69dfc8488c14694782502700121ef83041e1692a4cd24978f71325362df9e622755a8348932c6c9d9c7920d58a22e757e8d74766363627ebf4f17c38c450ccf2d2ee724c23d06ea5b89aacac183adc91a8b6c024fbbe1f87ee029062a9a8d2b40baf1c954e4e6d7690dd6f75a77f437bad3bf9091182870cf04e04a0420c3b45d3a04cba734a4cdff7109d6acb34a8a35ce4266d7203b13338ca4374d98274dc01df8458f9dc504e552bfd4b6286651674000df48dc04e4665c93fe3c29052baf182a1b8a12008c4070020580020000b620010024afc7423e02000c8c257c320013222002ede4abc8657a33272159280acab4271070302dbd6559eb6933280df7c1733af284e1930bc5da8407ee20000000000000000000000000000000000000000000000000000006b14c518314218114140024000644df0608dae4df090dce8918ea372f3294299b86117b294b048b862ddb595c977edabf8cb1488982f57045b230919a3b8fffafdad1806a1f45e88076ce892800f110f93243a43d700621be1ae562e619b1e61bc330f4304d06cd7f9cd3e4dabf53b43a6f94195961acde260612812efd8e57a80a03db92d4a7d80b24471c25002c01000800143a46dc8ad95ee83028671e287298dea1fbf7d9c53b292a2633d7e40d43cc4a440b24a9c01ad789eb58ece302a6287e182ef75a77f2deeb4efe9cdaed21bb5e392a9c81206159b06420dd4b713559583075abe0b9110048448c808708488b006805801242aea6617dc5fd7c0cb331fdee1e424bdad3e6b642e24845854d84915ad13e842c8c478d1c7d2ebe710af24a95e02e878ba09b2d9114e1c013ee78bd2ae61ac285b1c7f5ba84810420100db01d906892cb78406a109d9249632ec79119d0044647b7a860265b8c0ec3c009ee22910c02e50e11102708210086e724c23f8025576e174275198f3c9ca6474120aa5964203200980980160080040064200401a00025c4000aa4849848000f2080f8ac02047062a9a8d2b40baf1c954e4e6d7690dd6f75a77f437bad3bf90909220710d0c80c40c90000006e7d7c8e0679cd7e059476192da5dd1317ef373657811df3c3286e30ea2c52bb0915d02800092c8470c800264495c948ae024001920459ce456e721bf3900286800484c95b24c9711656a2b00511fbd4052c83752dc4d6321f8106b9f244d6c1206159b06420dd4b713559583075abe0b91100498c5c209164c05ef486fc291852f6fdaaa6a975df83cfbd35e51b8ce64c6d6184000000000000000000000000000000000000000000000000000ca44201a861220140060004389efe2a22487499a284fe50054d76c893f5a27bd9f8707f8544c69a6965b453b8373dec10348daa9450ccbbdc49b169796a5effdcab2b59fbf4272a794830399670bd47baaa0fe2ac25211a0a334b0a5149771e09ff17cad8255a320abeac34ad01656603806008020ac807423763cc202c0b99a239e011080f80400001fc958888ac0140001f6605f6b5e413c927698b78d80e7c3ea66a48597471ca44a9a381b6f91aebb5c82d3708f7073d8d24111767c5acf55a0c19935124ceba427134d656838bef62e71147c46357b1ec9abb0e3d16a244013a1a32ba7c6e857d163ed3646825ff7c164893488cfd0db3f51f62680c141083480b2c0fac00636afaae2ded1fc8e9b33b6839b2d23a5c2df1be3bc8f34928d44cc228531f6b1aba0d6a9d045eab3fe2df67712eb2884e69e44a3cd6d68c362ecbe93fb655f5c9194c380d9af946b5ed2a6d452fc92c20456cd40f07f6e312a41575d2a95f43a2d4caf30d266655b90778a3212742000038f92af1592804cab82655a0391823af70e430505366aee8b1007e7cc5d2449a0840e1c40037b30fe509420880205580391b1cdb0388913c4cffff0805ee8d5c90b01da81c248900fbfb35d40943080020000206644594be4b4658800096f7494245ecda9545068d0ab1bb10184929d3c8a8028c4f1589201e6a44d40013881100400005b088f80f7392611fc012abb70ba13a8cc79e4e5323a0911ed01f9c0e3d354e12b51ef365d8c7ff93482423da03f3841ba96e26b190fc0835250012800925754555482c0b44474022421c22400020682adfd0e880f33368a070103c377c55f6150d7300f33783fd3b2f6ebf9e9f34f60df447d584ba16b60525e94c9bfe22ad57de85279679a721463d0d6a000872422857b9c9308fe00955db85d09d4663cf272991d0498c5c209164c05910806680c4045823025803800811d9dd569618a7845560f87bf8c883dad1aa)) <<< 16000) + 0x2bbcedda2f288dcec91c8cb10400c5400090c955908aa8745522a0050900057a92a839012148a9ca454c4a2a5251520a8a8c545440a2a105000d7812a06114f8080122d492434c9241741f20a1e2432620b7e4d191c66ef181911236ebb3c20189542e30681c13b54413448dc9f04e7c770466320300d2a4e8435c5efffabba7b28028eb45b5ed78591cb25b96243460aac2c11660bce91d3d6be9714a9a4bf000126dd9b3e790070bbced774695180a7575b6fbbbe5ed6f605b17b4ec553f2cf8c1a3d089f28029e835847000092fbddcef55c55847cf7ce06a472685f0b9d30116b67fdef2028d6361206c4711008d88a5b0778d0bfe220b67c416ce15e13e1c2fa215ffa745212be3d8d85bdb38e1f19f77bcbb67c028e6d20d1a06b89153d30053c13c081fde97aa81c0e849a9e62a462661c7a28152aa23b3652f125ba00824f4730d80d310112e3a308d0db48b2cf5839ef9878fe1439ed3ec976bc900ba98ee3b0505b09f5d1a062249e2780b2618412d4f88402560abb875d6ef7257bda78903b876b9bb865701db503251e702b55ad1b07cde2cfa118652a6ebd1338a376e2a618130c2561bbf0010662c136502016dd1a1241afa8b96cd505b1fdaa6923a0d3b2eabaaf1d6d78f3176bee75fe717c1f069a6fd697692b9cb1719bfdeb35d19c40040491f646bdb6fb770920103d566d95fc64db088f3ed5c5bf2fd3bf35f8c4e50017fec329e6aa5a453b9d40be22b48a07a722743f0a5c86c0ab469e346c045d0073ca62fa7bcbe353ce4872c7957acdc1fe2692e0e6741d1083cf53f455c299998964ff9302e11b3f863353a24d4f3e8c903ecee4af22635a74397fc74a17e8c6703eb8025983065360dd53f322bd6c48e39d16968aee4c688514a84ea1ce9f55253214f294c0fa7a5f3d63dde94ac27f787fe81b5bc156c9cb633df575014e8e8a70545360a000c3c2534822993d14c1c8a5ce452c6a2952114a0a8a4c44524222910d000a01129059803ef711b82182800f8843ce8b6f1ee3cac3f821d706fdd8da3fd69cfb37618c328677190c60bb6562bee2178efff3fc68118c8ef67689eff9e03858581d86e22bae0de55ffec04c080325226abf3abae9787f01c291ca5ced1455535dd3ab9aa7b382bd381d1f164fb1175d3290928127fabdfa105165f2a24cbb80a162677e9ee1ff57ecb44f0d84825af23a8680e23fa67bc9d52f619cf4c14209044229ffd08cc8d614bca7684eab9911348a1217e1fac0360d8b9e0768bdab89f3ad2e6c984d3950406bb7aa00a023ebd393a5dd7d5726f1a505e6a785421f5fbd4424354a94d5750d82a365604ed4394be5e087ef20518ba94f6611f0ba241fc384bc088721ff938d93c14911ad4001484c9e271a9bc43302dc8054a730076213c83efe66cdb6d52b83d4a91091de140e2905b905a4fc72661fd2cbd4b67a12bff4a3ea76cc2fd5e4200c6fddd2815757665fab88a302b74827d1a5ae24617e399ffd9ecad8744ceb44e851dabc64af2c5a97bf3dc913b5b3234614535af99f7cd3335dd1831df474c7d4ed0e9be50656586b37898184a04bbf6395ea028024acd304f5679ffba145488b57fbdc4a6c2b845d4351e7b14cf4ba80000000000000000001288710904705300a00800163b57285ded420f4115acf253733c59b2ea018c49ecf9fdadcc03b488a3762bdcd5b5c5ee0ea441369c510acf9964a45443d2522373b410d05be08e33706bd8580e62728904c48db5e87b96f969e571fc78b79dacffde9da8e2ab47ec9e0d6b0e829cf400151494790c0948651c331700994684e0ba815d4c45f0831479f80cb51f508e9201187b725a94fb016490a78a40a786306182847215d41071cc7d4eccd43f046b7d4ad240d8ae40ea44b69c9b9e1498f201604b124c6cb587ec05791314390ad4a30545162202a05000161928a3982a1cc47c37110ab725908f4f118d2147eca4710c89994160850ae6762f54c91018f85ea6bd0801c495ecfeb8601699236c515004440076b35daa5c9b8e88500380001dd248e03e1a219a065e8fad7eb023f842d41400d4f47aab0b5aa2adfd60569ce7204bd02048ff21cffdf02769864499b0651e9472aa2200101b7e438ff66e020c389e9eff0c2efcf8e8d759fa296817f49c42b5d15b0f44efdb313c7e803b01f83e30700de61766bf6020d02804ea84d6462b35a3f717f1f4098c6f92f67520d845331949f340119a9134070bdd3b9ede9f6367eb0741e4f125d3b84055a0a00044417039249bc33a0b87ca2ce1e0abb5954ea5e00858de21a759a36157519668d2c63c1e7ac11ce97aba539b3e20240090dd9e9700a6f5559f8984bf1bfc3cee0b120f04198b1f4768864818391eb7aa5280b8af0083958a06bcbc1ef999af9a15f51da65ef4fdc4a619a7adfb2e673fe58ef7407625a492b9941373abfa7db30a06294381949dbb21558ef556ced331949fbfd77c60c1a6c9ae600026e8944a88a213450e92286451429c8a1094506422821d1408c8a00344fe1227e05528d58c897e2389646035657ed3366a75044248e48a788408380300008a00106dde595b421958bd76ebbfce114008cc6e7e3aae44fca2b9da3c3a311ab0a3eea7add91fd4059ab8521a8a7df6130817e0a2c365c6b12a93e86c910364f81327b0593d02f7392611ecdd406706a47456bc3a964f02301220c3c0fe375086a6e935e2bf6b21b55597fc442d20364b083df0c0000000000000000008c7f4ddb9e1cdaed21badeeb4efe800000000012180806211c2ea243205aa60a2014010000badf59f)) <<< 16000) + 0x0a8a418875236f5024d4c7c560f97b9baf4d0806b58596bc244c764fac7920a706c3d97223a00d17cbf6de278296111ac6ac01cda56b930a0b6b420a9cd181e1a5b0d480e1e8568a30264450a50d26b04252acc7b23a697b5b8a58e68c7aa34bc2893cee72b243b5a8085bd43a6c4e2c0b3b16b140b51ef74200d2f25b56362bc0682f1843200206c56c1491c1b5d6706e7fd09ccd2d0ee60600702d728a2554d1fbde1f234b022990bf358b25896def1861083af0a9fec281d41c8784003edd7340bcd1b99ed88a69deebeb935a7c4d406f8b76aa968d3d939e8be40ff02c384fc0193cf5e6a50714e0660af9309ddd6d1151494688406d29cf76770189442b61864a327c0c2b360c841ba96e26ab2b060eb57c1722200908f680fce106ea5b89aacac183ad2fa82cba024418781fc6ea10d4dd26bc57ed6436aab2ff8885a406c96107be1800000000000000000118f2ef8e06d1b5d03c5ddf138b2db421a329957dbab1c58dbd50b0000000000000000004530100d4d24924a10b000e6eb87511440ac082773d88470e02524ecd63407857f7426d451aaee20a065b434a0ab7c20189ab6d628551b54cad04fac34ab012182b952f5d1ffd84b5baee4d8563755809678059b54b912d9f2f54765c50b399f25675f0142a72dc716bbcdb5f78a41d975e6e159b06419ba80ce0ead47bcd97c0cbd3ee704a18566c19083752dc4d56560c1d6af82e444012180806211c2ea243205a1452c22801c00c005a9cf059c9ad1f33b2711f764d7e3fe46a3a8830cfa4abac56da3f70a0f7cf94abce550aa5517b9fcb2240b1442f09db65c00f87bba0e968f57648b997407d3f6ef26745b0e8812f08f49d0371802f0d2d735cfdc620bdbfdfec7fd5d63182e0bef119c8a5e2a83402204fa2b4a84ce375d98723ff5e3b853180f742d10267d8cde12c0cb3360fbfb6c805aaa704ddb24df1b8ee60a613fee2c1ad2e51538012d16098cab5fbc9566001d2912b6994ef5f10f025ddb64b0805f1d6495a9a2a176c42d125222eb432cd5f02633bf6f9aca02468711a5ab134146332205973b93d5889543df22585c4649ca658884537f61fdeda90444e8ec480854481d3688fa8b0874a3aa15da104d7b1e2008020082790100001b92780900039f12771508f808002b1493b0c80047b8800bdd11672593a92c950964e843273199390ac940564e21b24d0993802e4d0c40be0031c9e87f84bb065890eef7408beef87e1fb80a435a85c308302ebc72553939b5da4375bdd69dfd0deeb4efe42445424812c1281241005a19fad9604384dc78a3bd7865acd6da8405f02c612f22e6e1dc041f69f281d0c4251446e3e2f78b3fd3df9620ed0ca729464959448837f53b43a6f94195961acde260612812efd8e57a80a09b1b5075d9b75c531dcaf5934fde569f7b85a3db9051fa9d703000000000000000000452efd8e57a8de2606128194195961ac1f53b43a6f0a0cb04404204a003010574d256ab40c2b3684221b38ee3d10ae8bb23b125a083d6e941e3c803ca2cf34abb667a15ad62f2aa094cacdd11451466abe073cce8277cb46869635f48740b916c48ec75ea8f1240fb5e526ee5ca758080894698b2bc6872c54808e75439e651bf991e74c03d8ef8a5564ba0ca918ff5b52e2002969d23b40019dc93796c9b8864da1b26c0988882f7bad3bfa736bb486e9fd376e780485ce691ac6f99c00abb4d2009bc7ea3bf2e28d10f2a1407e4e30fe9000000000000000000024977ec72bd46f13030940ca0cacb0d60fa9da1d3785067061829806802801d213a5cc015b5a887acfb6028fca83e10534088fa3091e35d11ce07ac9b2843c823ffc1e18c1d7a804f6ca1fee677843859405c6cf38a9f6d3c6f92b9a67bda692d8ae6aaf4bbb628a7b7a60ae5fc765d013ef23284b21f2897b98bdd1033883f3f7ff24a820bad64efbc0b0ee212c230d3308daa4aa5a7a90526b1182b86c9a8264d20b8f680fce106ea5b89aacac183ad2fa82cba0242ff40d920703a3fae3adfdc68d093fce7a4be307dc3b9291c1500dc000000000000000000125b731fdfece6a24a75ff69303a4dbcaa7bf3c67267ddc8d5214800000000000000000443fa6edcf0e6d7690dd6f75a77f400000000009042385d448640b544d30c40118103d02c1304733ac49621fccf1fc2a1d4d38949b02f02fcd852cb9c8b6c46906bb55163c29d0ec0c4750128bdb7f33617cf1846d8c61096c97075ac36621092e38077954d8166f7706ecac0378c143a84087d5e2dffe2bba5210186c62c1a94b3f9b725c1aceae7bab4991a82a3d4a3aa104729b0a4d003ea62621886871224b7f71a3424ff39e92fb76c64566e003b7882000000000000000000120510cc08c045051007004000a0c753304914cb747aa37b12ef1970c4233bf56e05248ad2942f88c7b2c2abe39a64efec2b3c2a01968e0819a8f1db977d463aa8009ce63e9703290187c222b8a5812b4000e689338ae0200200826601ef75a77f4e6d7690dd3fa6edcf009172183da9486b7e7d1eeb4afdcaaa54e939cbfdc5d7784151c1622b00000000000000000004921b631dedd98a2c52da9855c94f2c62e9730695bf91993f73c51c78000000000000000000124f2ef8e06d1b5d03c5ddf138b2db421a329957dbab1c58dbd50b0000000000000000004530100d0d6a170c20c0b640c3401c0009e0e1c4f7c6c1635e45ba3e86820cdc0603844bb8f9b6c58a008189d795835772e7ad85349db005ea0e8fab39da2d8fa7d7ccedcaba58660c44947e8072158565fafd0)) <<< 16000) + 0x941ccf0b3d1897340fc0a580a8b7f0d2b55a9a1d917695af793787e869779633764509548faf2b3952890992d5295b9fc4df88e22e245a959bb739cea6c398b08bed40022548070480023f09310cc48c464ca03fe9bb73c39b5da4374000000001bdd69dfd0240000000006f75a77f4e6d7690dd3fa6edcf009079fa70b72b359cc689a110d39451f5e2d8d6ea1e3c548f862c76000000000000000000463cbbe381b46d740f1777c4e2cb6d0868ca655f6eac71636f542c000000000000000001150a29414f04b00500006f3482e81150c35b11864363e5708f413f132163846555fe8823f0f9a61f80f90453ec329479ea8993d7c69c70bc3b0a17b690fed22e5834b0530ffdd3c8566397faab852e6e7460efe157af44e065e9619308662445ed12ac737de3f157ce1c904539695e1f7c52642d525b265a93206898c24000eae4988940643a26109000e36991a37214f17fb844d114b75e58c9b9e987bd0a906228db60305fa8bb95a0b90538db45d11522a80155af394b728970a20ff670feb6b8399eee60066bf949aa6c97e7687e5885124fd4aea25c50159c4cb8948a74ef7c9ffeb32364fff52efc0007d14a1d8483ef521bb0b27adcd7038f5ed0a48f8e20b71e8a499103bbf09062d5a874c501051031107442cae29a303181be25308c1b413008897c344bc1202905000284900285e238a9225d4900288800cd108122ac9714600a2b80200802096c07a0137017da6013b2e72704820780100000f049682740224c5edd65f94a5360466146ea4419e8d4537738c808be08160dc9109c09270946b48eed63f3b65ccc66557ec14f33481229941b2f13adb4f7e39f7db7b3d2576bd180850339d79ea7a07d391573dc0233f776d74f091b599f34b71c9928573377af733ea63080fa716c9b7d6164bb3988c42360bd2f03e7982aca005451e47098b4effe40801c52d02a02eda159b79de5e820ab8d45e856167e8dd7868ed928af6e887240f393b05daa6ce79c952dcab303045023d39da95d2872494715a03a381809f2e1d2bf427e93c72301fea1a4e8ff53d72514cd1b2244fe7c89ca7372cf9d8878f5a2486334be2d6e81993e9a9802d3864779b379c16e0b6427a60e1fe339681fb641bba92cc509935f33318171c21c3a911652f87e915ef95bb6108d1161ec7ccb1fbe29eebcf038accba8ba1f6db0784e18208089dcab0a85821cbe8dc866ca45710318905bd8000298c8db8ac47c071ed01f9c20dd4b713559583075a5f50597404849a18817c006393d0ff09760cb121ddee8111e5df1c0da36ba078bbbe27165b684346532afb75638b1b7aa160000000000000000008abed74745f5b576e6b17fb28e2092fb4874b3705c21401eaf20000000000000000021578e4aa72736bb486eb7bad3bfa1bdd69dfc848aa1a6926105000725781f6549d726609877e13b1cfb55aa40524386871cfea6c40e101aab1e6f271ed563cf298cc958d898c2b4d6d110455457135cbc03ecb7fb58e02b79bb017f0d18b6211bf1c8b56684dfb93b038bc97c6fd3c8e6ff2018e8397bd26f3c9a84a31e775583d05de6331bccfaf160f2bf5e0448c2ba85f213d59077c9d3a00103849646721367067147ef6fc38554b3d42831129e2c3171f8aebe27f989c67e501b031aba605869fbf9c35590b9a8828c0600353e5f82061eb30fc283758bfe20ed7569492348f3a05fdd72abf55145580e4619dc56cf102212a27a226011007b7a6e3e3c2e7323bf35a2d951b42d18d57fb7c3a3cc6781391c0ce1c114c0cf319874938b68cf4a58c4a2fe01228a324eed9da4491e90a51e80b49b87ccda7e37300f1c4f0cef965493ce637b9ff35bc8c4d42aad54de5a7c015781cb312cb4432f27bbb690e0e4e412274c3eaf21d6052cae937aa5f747e4b9691fa200fe907128c95793f0000e186606ed415e8f324dc547cba01b80453dd4d5502dd673f99c7c1f37ce487e3c4b9f06f8156d65a02b3a4f998db1100525843db664258908116d034bb8c39a63250da121465f0a563108f353add1f17927174e5df0bcfdfac727e5805abd4780d15378c7db40c4aae82ea891428ab852c09c99f21f92952303eb31d7968bb1aa4f3e78275fb4eeb2381775e3c8165d7322b7688c59a76a4b2a3b5f8d7b6ae4ec1c68e8551b83d063b4681142890a8a2e703bd250076e495c0ea2a67ad46273a47ee113fa5f791b7bd60169a9ad14351560e494e1ec55b942f2c212c7d1e63f10464be9e6c21208074256a7c2249f8d2dfba6979fb885dceacacaa61db10733daf50a15df0709bd788a5713d00010aa4960b44ae522562512a928950844a63a2521d1288c89404449e2224e0d12682893004496020024902494d224901003b4592487192382e0c3c0fe375086a6e935e2bf6b21b55597fc442d20364b083df0c0000000000000000008c2790408386286300280808820882035e1fe7ac4ae8d215290fc65605b2dc27a12e57400c32266a8e3856684d7574f38b11d6da1fa8760ad9aeab331919c68b0a742afb27678cc10e0341f8f5edef15d27da3f6aca10dc8fd29a3105275e94e253fc0ee8d2c965cb5252923068914344881224305121028904144800a23f0100028b9007f1f3816e4420fe4e0da923b8ba81b7c8b53dba1819f2d610e3c1bef4bc4e98330505091ca930beed81c21658eecf3a8265903ea2e52173018531d1e8020568ad8b4957e187b2aa92c358ffa98b54120745e67e9b900fb0dd24cdc4118c5d5f79acf0dd065072aab2cfa6b0f907369855b74bb35cb1d22014022a731ce6)) <<< 16000) + 0x4032e349e620ff7943b578916f75f7cd269e9e461adffc4fac8c5d3e4b78d4a22fee196f12470441926f9441c9f468342762ccc000010110a42f1426b67f6c681b23524c7ac8f542ed006479f47a43ecc3d820a87cb8afa297215e74252db58d77ad6ca92bd5a45ad4eb33a7343252cc260148d8ebd41797a5a9917bb7b6554adbc8507b46876fb83ceff404d60f6f24ed9d0657667c84aa86fbab625ed3b7b95cb9a507db4eb43a0d083c2ecd4e6ad4c89d684f69473f00ced29cba90f031e42f497ad57b93628a615c1e6f6235ad4c674ef42259b9959fe845b980fb4abcc3201a6e53523c8634851fb293482adc96423d20532266505821c2b99d8bd53234063e17a9af41805a648db14510071257b3fae4040440176b35daa5cae3a21400e3ea11d2423cfc065a988be1062105d40aea11977ec72bd46f13030940ca0cacb0d60fa9da1d378504886406302700380300a0ab85fad4d057b0645fd60770b9fbba1a0f0ece531cee35a7e135494ed0283d98359ec89c446c218ffca9b5c0d00525aa02dde88f6fe40dedb5140e622844fa4b1a57121686e3391d12e15a1e5e784336cd69510c707ab30129c6c3d2e79848e154980999bcfb7fc278d73fce51ab962ae1dac8750070b0d50fef9378064c14138fe8de474472a244eb2dd1ed3135053699f5021fb8e825ccfd57ea8f1da3944a74baf0a9e203a77df2afb26fcf4b8fe32374dac7f9e837c15969dc5139ada27380667ac928d080e194041fe6975d11ec9bb6c5f1787afa07eac0494ac84bbf3beb443b1d8ca145512ca0c6c8157e916f4243319bb2f7c6e7f20afdf5290f3d6e51d7eea7c451b7062029d32800644c4c3ff90c30190e04a27feaf3ba006eac31071781243e0b33ef5b4af558ac7c783cb94eb92c750087fba3630a50dc37ad4e18df9e6a2df1a92d490ddda252a977d412f72749a9b4bee5988c6303c0bb922c7d56f2fbfa8c43c97da20f1052b804349878ad6d93420d94cb8048513c52cd8c829c7be5d86b773dc3cf6ce047e2f2f86f32e68b99a23b4ce3c41ee07f802dc7d9bc78a3d30c97cb6fd87a019a31a5b1d91551e7d65062c672054eb5d921cedda7ed359b49762fffaf79ed201bce17e975208aeaeef8e66b81e05f650c401b0e28c0c5e56eece84f1b03e623385d17b0573d1d61d8813b88fb8970e28cad1eb99db81d5dfa5d7a4cc3e9f5e06506b6e115063da08f82609203a183f2c0b596d20a212a9c96fff1a104dbc0a5757c745021bd95b5b2a904043f3e27034e424010adf3fd78da2804e0498d0caf43804c1303a8bb0d41474512845c4b411fdf3a87fea00ca84181781a00009e880089f91e9390f51c847c34002a92476c04002eaa48f5364789323b4591d20c8e4d6470432371d91b0cc8d456468132330591900c8c404004708403121080e9829d3ae1ef659ee63086483a8f94cd215c6805a770a743238c908cff00000000000000000009023086865066041845008a2c3a7760f1621c0bb1ca4726713b2b49e1a5666a0a44f0854359a51aa5c67cb8088fbdf89d2afd43458b183c79517c24de617b75aaf033651a5661c35adcd561776ed640b325edb65e57f0cf237a2a67d93a15ea0e33fb7e51bd2626e83492000000000000000002189620c21a1941881961081228e1e0fcb53ee09f78ea74fd731c5b302b65ee9174b8150de251756ed1727270b1d9e7ffac254677738a32128b100efb5d1d17d6d5db9ac5feca38824bed21d2cdc17085007abc800000000000000000847f4ddb9e1cdaed21badeeb4efe80000000001211651641a19818818004cffa92201820560684c2b926647fe59a605fddfd423e8bd490004c4cb0201d276f057e484c507634b03a73dc0b3d23f411e66ae82e82b5e10da14e50bf0eac9538121dab8568164dbee09024ef0d72b615f8ddddd4f398c7a00097a4001ee4db65e57f0cf237a2a67d93a15ea0e33fb7e51bd2626e8349200000000000000000218a20e27fec05825b13dab59eb447c7ba98ccc2b3bfa0132a7c0000000000000000084430c4842045824021028a350abacbfe029cba699d1f56111a24d26052f4733850774ce8f705b701361fcb1f4b118e0542c24ddf59ce6fe29c2ec402caf2ceea9088177bdef33d1c4df6fd01328d338518e46cfca4600322f01917008001404916a488b1144568222a3d0149c88a4d4450622272d11314889494448422231d1110c8884544402221f0d10f008874040024364079ff4810cce1c08a77bbbc921a34a428220bb38bf5cf5960890897d057ec0dbcebf1013f5135a03f7bc0c0b03e630e2d475738a00c00880146cdfdc7a44108d6b388b7c6b7b08001f1fbff995401a48605ea386c73b5282362387298d0f81c1a1ba579221cd37d3d1f5333625b8510586653d78ab4605806546b3dc399c2e141be2ac0e5ec2288b6dea0cd21c36ca18232a945b82312be4cccbf5243e2879607deb416720916eb36a811a40f6e562807ae885772da94c6aef994442167f0022729e55170f0bd8d1111cded4934860dc13e13279d6ae6c9d63c9098f009502309db208cbd1b0f4262c721446872f8b0a9e7785b3b88eed89429dba77e540474832fd4cafe1ee695e3bdc9c21826b36f75d70076c002c30ce61e0d9d03e04c58e48cbf45b4536ffb1f8b2bb9c35ff3bf71f0412ea14ee7b6a8dafbf347a4b2941c39819a2f38c68a3435b88bab1c75544a9ccae211f6aa3e1f5db6906141670e6df6583a2ad8542ff0111a777dc9ae71b56835700efddd322d5fae702fca9728345d579ad116cbddc60f)) <<< 16000) + 0xb6f26efbac54702fc061702343b7510f762a1cb48ab3d5b5d9e43cc674dcb1b38ed608c3306bbd9a6816d7bb4f101d731802d3bc435916ce3850905caf14b28789f2fdf77071ce00de74a56ed62807a41090f567ff48cb505200000f7c4858040018984870d64366b21a3590c92c8608642e3321305e0446f1874b8ade91785049df5d3a0ed943c4e485d0ce25766059018a18404c8f6c162d14f8a18251515523f950d9ea180626e56c395cf199000800009c29cdd002c972c999e10641a1665417dfd7d346344007c47b407e7066ea03383ab51ef365ed3d1b3ebc129fd376e78736bb486e80000000037bad3bfa048602019981141121180860882426d523c1841732f1abf2b4f3aaedd2d011a15c26b8d8005591bcb1f64a3e521728ce226a36b45d32a71885e9b5be0794c02fbb48cd800cd08fb87ad4c02580a615e485216050001e4108c2910a948850a4052322130d10906884434000e2c48414641e9b20e49906a2c831064165b050199050ac020560520220901423e7a4e1785c7c39355718517ebc18d2a3c2bec1773fdb12ae0b000000000000000000000000000000000000000000000000000000d422882842825805002802000000790c7360b93aa41adadb05ac0b4d62ea55754f44a68b23817f79991431cd1512dc372109606ad9eb78d66e597225079fd0788ef62a2f4e36271ffd03f001348cf19b3ef42cce361fb3fcb83755541cfca14be11caee308803a0781a548207640e3301f1990308c814463be13818030fbd26df3c64117be5ea591b8838c327e59ccb640c724b30a6a2b6690201c844cbd8c90ce48e6cc2236b6efa0e08ebb847a6ca82b9491e32108c6d28d00eba7a92d1923fb2b23cdf561fe48380318e15439cf5f204eb4523fe361800109849db4203dfbaf92c5420c96c05de709e67b8300d8914a6187113c40e2a391754102a092cfe8c484be9105cf10164de3f63a1023ca7514a9202fb6007ba130411004207079f17c50e142153c1ca2054cb6faafc80bdff109330812d1313fcc5002548008426042200810200800053090186880804402020002df22d033200158ff8ac59c563fc231fd0d8fe06c7ec1600a031fa01e8cc1b92750ae63a9e47e9b4006eef8160fec327bc9e9330abb2400000000000000000000000000000000000000000000000000000d2248e48c3064844827807001800007510a4ef9b32b71fa90dd5ba95b4a2dafe5da0e58e930cb0747e7fec3ff15a968fa5691928f2dfaadc533630a63a31fe0e9297c45e0b90baa6083c0d3b64182a00ffe40b249a4e741820a0f6723258914e1b37c82082af05b8c9804884cdcf804c2044010912948abf7f30960a6cb649432f22b924891a5ccd432c60bb0e201a6100d525579113021080407e4063f003e300064ab031c5857ab14312c83a4b2b2f270eb65318dd4c14004379b3101318a4eb721c1fc4116d4a4e0846010e30006d14509c585843a53b30800765f94259096102b14ce1d2674fb7b101590b95e061c1ae639d40a18001bb122f4a0108c02000033662680213d63334a04a0afa9a50e5f692a9e8e1803cd75561a3116e970431c185d37abfe20006462e93cb821180207dc1400030240012f880031a9a1c10db8763ade748c12c9b95838953a9c1a84fecef33ffb3ffc2c30be288c26ab1692ef222326941d1f1ce3984ac13fc2a134ff8f0149f7f1f229ec556eabe3ef420004c103812e064f93e7550400000c45a7d9c5fd22721ee2184000b3b269bcd2a985b1236f35ab5d327ae6aedca27145d0f00001d091f6190fa848002dcc8f710c7d037928927078c80b59372a1eb26e543b044aa20557c8f41b080860c908308804704f00a0000db5b4a33a26ba1ba20cdf1a7310cb83c5dca63499e1f88f76048e40e82adf7a80a58cdd40670756a3de6cbe81cf34bc8253245be9e56502c891860c90910480420460000288fb626f122233088d0e2cabb5c49578facfcff3dde4ebd208fb0cb87207e18280011a91f3110f908800122c8f884c7c0272401cfafefd3060bad89f3e48c1acd025ec60cfc454bf98e1083f519d318284f9c05d84c08460101ef01f8c579fd0c4c80c1c13f92e0c1a939ea7cc1c22c0fdff9a3050b3bd686d00020c4e5b78e008c9bcb0109c208c0200002dc47b8363da031ec01f0a3234bc8bb171f534552f35c4b144e5f0c110f98b3748944ac50a614481f247b67e5034a4582af6532271813379824e5e20101e007731fa90f9d9a0700378d5e87b38284006745e7f81e10b808d80148183906000015211bf1d0f58c87a8543d22a1b2150f408801414000cd8479c443cc22001b3f23ca921e4310f184876c040046a64789663c2831e0158ec02e84273a443b57facb400808d047edf24b65990e1023547e6d986dba33c9604170df017ebb119d0000033d82bbd03356d15c138f6ecd927f97e4c02360c115e049c6584001294365485e697a4410f6fc83408e46585544be228898841001df09e4a249c1e3202f18b84122c980bde90df85230a5edfb554d52ebbf079f7a6bca3719cc98dac30800000000000000000000000000000000000000000000000000194cb0850840430420420000003ad0f4573ef48828a484d12c824b89c019b926e8285c98d168d8871eeb2b975229c800d621c8ff036d472bb666070bf1b087aefed8c7829ae6d262bef75a90b956410a3b28ef108774743b82a1db0500027011da390ec9a807c843b02a1d7110eb0680021d08eaa8c751443703305001e850d6703d0c13fc9ddf138b2db421a329ac982)) <<< 16000) + 0xea033aa075b5000000000000000000453cbbe381b46d740f1777c4e2cb6d0868ca655f6eac71636f542c000000000000000001143050590807cdea8862ab0f00124f866218c4f7f0d1cc24b410000000000000000004332c11810c13402c01400001013ef9a3d96e9a4b4091df13ccfe37333e6e6cc24ec09b362c7903dea325d9dd8174f90c55213c158cd2aecfcfc89800ad4a7431cb78a9f321ee61d521eba9d0918f34265bcbb4253b1ba377f868a89735f8c11447015c1c087326b529b474c66216331a6118e908c690363a2131d009c49947f154ab5841d9ff1d555b227598fc1fc51c182fb6f9d3b2257a6c99dafc9c8c540cd742f9f820151e0364c379443d0fd74538fac1f0f893be1428057b9c8c7c00c0d71de099000f8f7cbfc4eb6c18099ef004daf61e6dd9cd7f10dd25968530cf1000710d9e7197741a0e74e64e6a8595955223a9900b880f8db5941e25996025d6288628520941d048ad14ed9ea4ef201e1ff2bcf95f84a35788e4b3c39399e40ea3af60499f14a4c58592317ef1fb343a0a847ceed6f26c24b3b3d45ac013111b6781c302be7df69dbefb77e1b0def2865cc2780a0c240278ed05505218eb83d9ad8a30cc448644b8204aa2134dfe61db38d519d2d06131cff4fe82808d9e47d9926a9238149ae3a3b70a518901c06e724c23d9ba80ce0d48e8ad78752c9e04602464a249c1e3202cc040334cb304204283300200077270c45e4c3771484ec20e24dd289e1426b2aa3a2c14f77bc40273c56107d18ed0c9515b6c952158c18c51f3c5345aec170804bff176a34807da79c06cc001637a01d0260c2200860e615dbd1e4851b1c88ed982fb52a60d0810bc2028024840c671cb6141564cd14d04c10420101cf010000a4100029f223e0200050722162a00096f239c3b0801d8df0ec73456398231bc118dd84c6e81635c03deeb4efe5bdd69dfd39b5da4376bc725539024435a85c308302c8f18a0c70c3092007000000761e4c59c1e2fc3d8b2f271725b10c15b5def5e4bd12ae7a364db8e398ad472c360ae131ca05d8e7293cfd9ae0b16bf09dcf23a8b249a36cb75731e3e69d849ba772c233d9295c62ca008517ce56b88e010f439fe4b68601f79cc598f50fa101056058b1d0e186a0d389071c7b331e3eace55620b1e5e22fd6a784600c69a02c2069128e20e032ee7be702708210080000b090db01d4d00f1f5a8441346d18a504c4c3185023388a29065411bd90e1d1f62811f2c4643dd83c02c48894e2de240079960e5ed41803be0b8d9a05100027e5b50f3400d1d70ca6e08a21220580580002573a41210b3780e19803ae10a68d5ef29dd82868744414412082b95f2c025082100806d80e1ad42e18418175e392a9c9cdaed21badeeb4efe86f75a77f21212a69a41c3143120a40180060dfd24f2837fc2560c0ed4e335cd6996c632801a7189543daa3ef84dc31f861a00045a424c240006f040204732ddfcad03982c6d4d8fda36040f729e621cc1c16ed64f2a3100359135761c240522551bb886002bf9c0fa0100521e1023d00fe22c5a7e34bad3210240c20709806000042046806411c32000be72392531c809ef75a77f4e6d7690dd3fa6edcf00904e1491050c9085091008000177db443ea3e36a74b90d6f0a0f6f70406f7f80b82525b8991b38896a80023ff8c7e21e4d8b5f8ecce68de28d000237235e72181390e38880143400225e45a52638c8b1c54180288e438d0b7172481cf57a5b8092141e004483db42bce65019dffb16c022101f0084030040103880200003720001a444d0463860b91437a4c81f8df0d34b0ce4dba0bf31a9f3cfb66171c38e030a8541a30196b76e31e18f69fd00164381cbd2bf99848aa408c9ea4660b4d9fedd9ee1c357e187ec5e8e8ab58bdf0c2401f1879ff6060e3991709bf649073060d3bddce5ca42640021bf8710753d98aba5d9bbc2a8568642227812b4eb9a87842e83438b8b880ee320ba4a246c49767339bfabf2c5bc3c9cc74e8d9a5bcd105cd3b8490492d67920a5992424386064cdca3074df5855049abb602760e16d3e36010ee38d5cb9a38a17416bd314e514fe048bfcb405af8efb382c67346b7a62cae14061201091a570683a434debe5cb638ae2e52a1378c40ab86e4a763a9039ed014494fa2540643aabf203abdd8710ff35816911d179d91c00217abca405c61049ddfd2f6be0affe40ae6b0caad4cec5fce0ad778fc735c7108f85b09eb121344d9256ade3ed85b3f904338af03840a00052220841a1c10d00054291c0218df8cc2005637c2b1bd118de04c6ec26374031ae01c8b206e5729410237759a011080f00406e407329f045bbda40a053852a301296f7f685036c0f91d4090307c02140f669aa942a05d58229598003b6f58d811861000400002ac8dc0680006bcfeb06f65996b5b944d844878e88cd9807cc0403435a85c308302ebc72553939b5da4375bdd69dfd0deeb4efe42441431015004402c000cbd0d800ae55fdaa7de168edf2171321f439b52b37739c4b413758348e48706a7a37c0dbb8011d5abdce518b525e80019211b71d88f80e879f6366593032265c6ac0c20726dfea0c01f03ea66009040800200ee03e2c0b4ac90668218649ec52c19855451600462042010b0685a9edac502161702bd34018da1a819401d7b57ce8024102100800006e90001a830d6a170c20c0baf1c954e4e6d7690dd6f75a77f437bad3bf90909224918814408205200c0003cd91e06a07e9cb7ce4cfb01c2581cbac6483cdb73b96c2c87f7e4aa21c61fc61a00046)) <<< 16000) + 0x86241157fdafd21c297eeaee88f5e3b65d0205b8ee125b960085fb48ac000947084020000222442054000c8246c067429b412b8980bc51a6f76ca8f55f0a872c884fc5c060fddbea3fc871ba2c251415e5e587d3e518f68274f037d2830a7dbd2cb07aafd16f820a5471d79e763648005f7de392e3152e203816e3532e6091078a6004200167a0a5a2bbc63a71639984e164c892a8709ad90002c559f4425e11f731c9416e77656724a70dca4ba00cd24ca2954f77a819a7d55d93c4d85b6dd30d496f5b3e6c1ab505c50bf3a789de0e4c094b2747d0000a707850abbc6d60f70b06e442184253945cd0632de6b4921433b4dde08afff1146d8210145e0135eaab0150cdba440d021685f11a0057e7b2200305246a8c137676494200444720643837d3edad8600208afa6af4e55cc32cc8fe08254db78c609815800030a235e6a181310d68e86d86400a1a001517230a5a19a190da8c86b0240044f246ad842c4020042fb2368d315e05c43f0a0b6ac32d3df47a77d0ab6afa3736abd29b9eb4d80de08500000000000000000023578e4aa72736bb486eb7bad3bfa1bdd69dfc848470660628260058028008000026eabbf75afb8eccecd811fd7fd69b9bf13a09e6437fe5ecca7e92db771320802054655499fb449fc4266a353ac6704fdc6f2a19decefc8a63b673ac751997861789f79d061fcf057c943806564fb528002011961100406cc163640b1b1018d700e03e365c73094309199dbb06001e2756a000118e1000402a40721fef591d8901e5c5f3e050004e142844a010a3017a400024202000800007111b015c401899b66a78159d7b754800ed3e160800804ca07c01000016c78598272e4e902153bc7f8c50c5d684448102aedc2f2320096a4e4920028012961080400004608d7968604a400a1200041e3006723495b8e69444c522a9a51d2842e914a6ca566a4c1db7678997a1f34d84401c187c46b8da459a7ed9f94b6a0d8f42ae3e374775d9eaafebcc7962f54c9b550070306314f7b0fa7e36fabbea313cd7aa3c21a59b8cf61a20e3bd1d0a0a86be7800c010eaa8d05094168167f9854e211691e44b068dd070a1109d44591e752cf6500010122bac2c8dd725153c39d202ff4cb4a2828d898c7b46505644e4991a9871cdb80babee925f9fad5e6c0020821349875f930ba8269e361ec08f8fe700861f46d81ae01f0b74b0aaff14436633c4c1012b57dd1cc201063ce958880483842010e144a213179ac44c297db739d58cceb6684b15077188084378a2732599dcd449e0c6d38b4d070f6507887850508dc19b7213ad1f39448c6f7a70acd9da6c12d711033b327d1dfa6d5cea4bab705238d661aa0bce387c80065d88e2b9fa358f0871802a5055cc9aaedd722f402edd3eb0b49d8499e737c12f495e2861565ddb6a4086225b8d64c624458186d45c0c53be80384c35f8b4a18aca751195d840ec222718768dd2a39403f800054822ce3a1811d0be8886b44400a120006af22d8621ac2d00069711ab450b21286a8842c6321620500097f91a9410af9c842c942bc3215d150ae068005eb48d42abe381db2867ebc4b28caee2987048ce575a367ac7f0e05e0578000000000000000004402db2f2bf86791bd1533ec9d0af50719fdbf28de9313741a490000000000000000010c8c08308b04604b00500005019fbbaf4ff8b1f66229646dc230047d12dd788460440113ca37015ee67c98ccb32f7717b20051e3f1b0dd2c6872b528221275f7f6213ee0e669fb195bee5158785e98a43358b82a42688c369d19065a40c056c809149c2f1cddfecf2b547661daba0bb87fb44d585e05cc923e7fd1a7198858cc6984634a231a40d8d184c688272686205f0018e4f43fc25d832c48777ba0447db52b920f60592021c21a09008e09e01a020284ac699fd98e6f0dd8465d5a3a21e440dff65cdc3290ed7c30d5cf1b44ea2f81b192098bd02c5ac07bdd69dfcb7bad3bfa736bb486ed78e4aa7204886b50b861060590c29418c18611600e00c0200ce50c20981deba3f262a9225b2754f07f9487b59741f1dae5f399b923b0b1415c2743032dd1d69485962392520509152f436348025ac21664c00b61a64410400afdb769809830880214301b4b946b485e2ad61a6cb1413fd63792040cc592cfd4045b94416914048aff3db40983088020000278424c0731d651acac45da3a2c44852e38bde85ac40d424dcd9d072283415026638287e4e84072af027aee50c84c026d02f07e6e4e900078f6d0d6067ba24004b62775c69259021f592d835935a3116650286c0a80002852342221a00d04706823404000b3845a89633e2b19e0588882fdea029641ba96e26b190fc0835cf9226b609042385d448640b2efd8e57a8de2606128194195961ac1f53b43a6f0a0ce08909100f00801026be0432a383b937e98f8d7032fd8d3ee93a16543c00c070a1fe7411af11d51dd89a5dbd7026e47a112c534c99a318680b0a52971855e85e161023eebfec387715135eaca61724dd19d110b80686703400087245a1042ce820050d00066d119b418cd0ec01447207887495f42c3df3581bd1cd81083937c32bfe8ad8d07aa0500c809b4ddd25104543b226c8e02dfdb5bc4a0fda81d083703e78c22f9ad7564815c0da2167ad51363b9f66030c77123664a02ea64c8bec56b9d7ddf23d37c8561e907cdb4fa46ed19afa969ca71b20b6d60402a6324f81c049e3fdc7558d312eea0a75eab0712a4eb5dc69b6b040c071201cc121faef18a3a0f7a85e70f31e9f1e5ff820cd18d9acc71601)) <<< 16000) + 0x357bc44b70433996989c45ceb8a260250e38cf8e33e5cd94912b471130cdd744c80af1a3fc7931d79f7633e825723dec8ffd6a56ad13bf6be219b966c483b4dcb9f63721c297d783498bf6c34644465114704ee0f5c4c07e5a9b860ff54ddf164a9f2f7c8f7f07df37fd107030086c08200072ceacc1aa17b42854429672a1d86116291f2c4957684538f2d5187f671a3ba2fdcb747ef4ca4b3f3d806b9c8fc52c7020a226fd3db2fc9dd1fb01cc2c75703214c0018abe0157fa87a9017419ff5f059178dc46318d609622a83fbe9e9b8dc64874716f89b6391952dcce7894d22dcf73f8e2c0a24c3c409d0da4810616255726040835c150111f2820e5e650742d6cf244c219a2b530091861080400002bc8cc88866004000da4410857c71452f23531653df2d8242be1b051d32fcd47e4cdd0d61ab46fca4d9e2fc5b2a436251cd1f704efa91ee44bf3d3f083c29ce879cdebc5412064d6881ffb142e88db12c7fff74ac2d83994bea54aab9c324e8f823b8c22fe115ba797aca066641b8b25b175ab431ded9c1f55cb346858043447a4d26d99d9713f4b4bbce414e8bee281e3a75db046b0c586bc42b6d52e4613c0e67401a087cbb8e70034497cc460f3517083b6cb363b92b0670e67d9158bf6448420d8c31a8b5ca84faf81a7b185fcfc64d459b80b83dd12138b24b97fc5fbf055582f3ae0dd94c215b565c40616026cbbd1b4c6d0c185983700d2c949fda7d1add392c10a63a670367e756578a9638c2f584187a30a013e46c8d99d1c82a2fb2f4c3455495698ddfcd6f95fbbd808768e110aa9860ced005135e6fb826351b66f48d16004c1c10cb036870b8cc4730e8f80cf5d0016fbf1ebce317a88da5c8e147552f6b7ece32a7aeea05725641f90652650391aafaa5eba6e60b926de2540f4a1a90eedcfe85fbe50d50ee3360dba3c0fbf28c442cea032e0a000577232c0a1950500065911811d8c00ec5fc662fc33194158c988c5f0463241317a018b580e49798e7c66a01f6e478b5300954f7e88130c1f004787f1d01fe960782e5681811060f80400001f4f058dc0eadc084307c020322020000673f77c3f0fdc052fb5d1d17d6d5db9ac5feca38824bed21d2cdc17085007abc8000000000000000008444201a1ad42e18418168a02202a0088050005eaf3c3656006f428f8eae424b1992c4f282b9e34f7b71bb1b47378b25925df7074fedaa52b13ccf24fab7312013c545320a9a0006d840143770b2139ac62a029d6c73788007c02100001004000011119001c0100401031a0a000037231e038000080228508778985603a4e2dec981a73eb0a3401db18c250007401000018a4638142180a10d050000a09a088c3c4df32c58ee0866b82dc05f016965c9264862e2c3880588dda30cecb4ceb19487e465cb5399e581497df48a016f8911078ea0474098fdc460fc2a5edb310be55e1985001b66610f951729b6b372dd62d82ce89dc6a5cb1b7bc81e89068946e3933155ba2cc47fb5830050565051e770425c02cd2b345ed4cd565b804cdeb35f7051052b08d000088642ac24000e0042746626803a1df576002b00f7f4269c4003c010800008020000088d0efe711cd580805a14ba2001e00840000401000004440002c4c0000401031a0218c01800026110c0983b80e419d54b1a47022ff49840220c1e00848319d904282802195effa1803b3ec29004618400100000ab23162200015631356ad092dae9a44d844871d119b301efbbe1f87ee028fe9bb73c39b5da4375bdd69dfd000000000024435a85c308302d0e3871020540110002896b420bf732a3db01aa14a75a08087970eb40f3b7a70181105dde35dbfaf8e50ddcd650251bd08dbf3072612aa3182525000355301bbde6775080051b2a1a910049784673000118e1080400002dc8c506862414000fd645a88622203c2b360c841ba96e26ab2b060eb57c172220092bc72553939b5da4375bdd69dfd0deeb4efe4242efd8e57a8de2606128194195961ac1f53b43a6f0a0cb1c408405100f008010bc967847ae403ff280984a35a308d4123ee185fa50d903343100c88e25ec80125cf15796d65962fae73e581aebfa15ef9b963f5970e0ce1fe96c51da685188110c38885c0440008ae45a0e42ce72166250c30880143400335a4200e430a6a10b09001ad91162010022c11184658c1b0c609762bc0bc700f8750e02a0af86abf3fa6d934fb3e7a7803f9e43862f92790ee5d2a409166400000000000000000047435a85c308302d1919fa5b6bd52939c45f083120ba815d42143021412c01400001151b4dde9c5c9d6c142c552f02ac18b7e11605e550bfb0f1a9049f688dc9c3d6185924500486223a07a1fddc857674b0ced56ca00f77e12b51c24a38fa06a7642c53ae2b040b3b883853abb4f1d9de311e3a4002afd5e8c0398fd9304ad8d77cb1501f4dbf6459103c2c01bad8668e7a0ce6052e74bd0cfe3fb18a2666ed71f7565566467daaff4de702df1b7fe6fe6e030e3c4dcc0c6fa66d0e70fe9b4630d7285630e73aefbaed708e07dfdb4353402cb97b8caf23eeaabbdaea77b269f3a076eb2c2d5000cf0fbb48c111bad887258f509e54bc0467cef411dfef23df6c00df15ff2340624e8709e8d2b9f4febd0ccdbc2ef1c9c39a21ecfd758f2815a0e1beeab0b1428cecd2c6f2c7b62a587fac8d2d4aee1503916877208b5b5f28a148c437ee6ee9cc0531375c7cf50c65e5d25f21a2da6694cfecf42cbe906f9f6a0a9703a0bac0a0c9ad2ac46217ed7659dd26c516c84a435c1bf300dc1cd601a)) <<< 16000) + 0xe8d6cd3f00d2aba1047280f05e24509e73837e151ce1af57c845b4ab5115267fa33a77771674eeee39bfcb9a01f82be1aafcfe9b64d3ecf9e9e00fe790e18be49e43b974a902459900000000000000000011cc0403435a85c308302ebc72553939b5da4375bdd69dfd0deeb4efe42453c5104401201024dc4fd662bae6ea6e376ded5b0dd3f0433b2b2cd578cccd9c7f74f080b568b6e534a0eb9d9215c5bf34bb4475c5c536427f699593955a115d49b560653c48914a50955d8fe0450f1f5321054dd19a000a804604463001b17f0d8bf06c5f4362f80b17b058bd00c5ac070140100441120ed02438c0004745c30048208c011000010040400085e40600009840a41700c010040bc0680000dc8000a8117701f80d46a8da4281e4edfc501208200040bb0480a8142ea0a174050b98280003948b50ac4440704bcfdc3d2078017e6f19808005ec72cfaa0918a118040154142e40a171050b80285bc1400024045a0b42ce5a16e1500284800116c8b69ec5b0e7ef5014b3375019c1aa840968fe79b9474b04849a18817c006393d0ff09760cb121ddee81122a4cff4674eeee2ce9dddc737f973403e3c75a6aac38765dbca6018efc30de2cd95ad46d6f2826ffa5ed800000000000000000229fd376e78736bb486eb7bad3bfa000000000048a80270238278020081d84215cb34a2517589bdbaa13501ff053d56929c31bde5607fbb8a47182cd0364a0d4b248a8028471865e7f4cf324349d0693dc226026d6c3574226b97b998adefccab1b5b1ec2db70f1804bd2807baf6f7ca29a71682e21b7851aaaa7e7baa165c85a3346785221cd3b1745ac0765eee0b2c79108194e6082404491963e91420be56330840195ff7b040002a404200816a1188880f0acd832106ea5b89aacac183ad5f05c888024a8f0abee68c82e4c096475fdbbd44f61071cc9f297cd142000000000000000000000000000000000000000000000001790d6a170c20c0b46467e96daf54a4e7117c20c482ea0575086bc72553939b5da4375bdd69dfd0deeb4efe424538b2021022000461eeff69b3300341bc294de9abd8b9e6b46442b56d5822151464498eaa2d9ad96122acb6d73da9fcdd669ff1445616394064ff53f4930136544b4ba38651ed4b8de0b750de298f79f6144f753ca684fecddcb81021388a9bdb0b36aa423bd5841c9e78cd9e0e2d885484b5ac851690500039791682d0b39485984400a120008d922165a1651d00081d1164290b18c8588140047b44585042c07a15f39085928578642ba2a15c0d00151a90076ce201b2644042db4e0e7d6d35e0af890616e49801000900272e15a2ec0803d548c3797107020cedbaef9394100f1fa0591891100fe739aae2905015efae1ba9241e37dd51c93a885582c0280ad90856884292421591d0a38c85185428a22144110a1868508242b0021410100018c11572900f8885580417e020126ec206b796643315a3116fcc80c885c6752fb14306999264db4706fc9b534e8918105b30a0bec890083c523c2a20c046b2010fd29145050f7f189666200afa2acac211b0e8854038155298aa12c54c77650015792baa2164cc12c1cca9c9441a5542708208c20001c2537a2121b3e01eae5b5941658acca76179000200bd58a26040000230c2b00001af3ee37e48c9a040b0091a6000ee6e39a20d2e6073023a4e461469a3e522c822ca001a49204001030001c2537a20b159f00f572dac609962b329d85e2800461e7a24c60400187c7866c0809b913a2e774992085a050d30001833b26697085d5191e30a2db7f184f16500027ea7ac81800043e75058ab4dddede1304b0e8d58ac4e004a010077010000c6907705e16003b9b8e68830a981cc08e9391649a68f948b208a240069248100038a0007094de8828467c03d5cb6b161e58acca76178c0011879e89318100061f1e19b02026e44e8b9dd264821681402201410e020002832000d6868873e802a2c8d24734dbe1d3cad2070c2bddc42e4143000384a6f4420267c03d5cb6b241cb15994ec2f0c00200724ab8b080020569ebec1400d79f71bf2424d0285804800021e22a432151190a80c853c642223214e190a484851c0428c02145010a200850c042840214101000625105015d062e3cd3ca2b98202150bc8b3f3e45008e48df404fe0481f5bc5b24311a380314fed45ad9e8aaa1e24d2711cd9038ef772c0594227255d27b1e6912de04516cd74923f2a41801c284b8b2fc41eca0c342f3843c203724756450870c38fc7b92810221bb3a949c4062545002b80c107825e26411550c98c8a0320c41417bc20403ea4ca08a84c7482601000010b914d318a610f0a1f7990d9c91890c9240dc611e586101c6cfaac9d51810642dae5a11c1020f594d6464408023c7360eb4bb0a0017b045b836445104f8124a78cb080d93009a190bcd39417816052c442941a149090a404851c1428c0a145050a200850c04284021410100018f90007d32280b313f5589f28c4f5362789313b4589d18c4e496270431371589b08c4d43742ad63cea9bb205706fcaabce38b8a9127f1987098eb0827469008f36038fa01414781bc4620202c794ac6dc0300a737ee06480822001201e870ac244abb3a8d9510884e030818e569b9bfd065875930d3c628d203143c64a646b88181b61ed25af06015af4857b33c28097b8285bb42001b806a1e4c0821b1bda7e9ad81bf7b8a39470219dde33327d825fb1e1681630acd8320cdd40670756a3de6cbe065e9f7382545499fe8ce9dddc59d3bbb8e6ff2e6807feef87e1)) <<< 16000) + 0xfb80a30100d0d1091080c40c10001403d2448c6f33cb4dc8d6c6e12ed1b47b18e15fd82e1aa7c18b665d6cfb2ef53d524f348ef295c1e936498e61a985d13b64747ef56eea5b244b0e0a3fb34414420620bb7bbe2030c953b9d52f1830525ccba19810315e2a2242b124191e21be702e0c035f891a720900081eebc2fd2500011b8d9fa222a3416160160014240004da407ca415a4a0005ea22560200086c22328b1184188b9ec458f62685b1331d89402ec50e26c42ad5ed1f54ba504d5c86fc661413858e870ba0499b4fc849cb9e60e0b53fa2d436f36aaae60c12f043d2551a6d9fd2248069dba7aee153a27af04000f95f8e609b61f3bd0000249298bb7bf3fe3805240020696dc06f4ab8aa8117e04a147c3a42384c3eef87e1fb80abc4a79eb11db916ef3abf7a8c7f2299b1c3bd9df1e128183ed2000000000000000001137a437e148c297b7ed55354baefc1e7de9af28dc6732636b0c20000000000000000000000000000000000000000000000000006530100eaacd04dc76c0b53042441430c00012a9e05be8f493586b8434368f80df9300a6035822be9f77b8f2b8e463603e8ce26cd9f3966c0918b9033888432e89854bb39c151d9eadcd0c25788398568c55c1cdbd96e570bf00e191b1179689ee2ceb78f30868abc5691ddab984baf0ff8698c4298f5c6fddf0fc3f70157894f3d623b722dde757ef518fe453363877b3be3c250307da400000000000000000226f486fc291852f6fdaaa6a975df83cfbd35e51b8ce64c6d6184000000000000000000000000000000000000000000000000000ca648c60848848648008094183652cb944c1231fa4fc5ce8cd9bc06d32f3f0d4f3bfd83306850a952ef6af0ad88111e2eeef97151d209725b822f858917b106897344c81400a0200051b2262531302584510c4bc27a20dc9c2ff8448c63f0a102baabfb539dd1bec48934a2a9f17cdc4ae62432a58e156b07e749818093cfddd992cd3e1b050016dad54756f57d8c00013c525cdc3dbd339e0d0ca36c020e8b744072a09b8c6304107c48f9d799f6bd6b8de048c401c4f527adb968609a204effda62a3125083885096b60a90ea489896e7c1ad8af774487378ba4c21dc4af068251590f4e38379642823c65e5edfe0a63ca008812d169c8affd4214831fe94161e0380014040005c444b87425a320005cd22582212b0500091d912a31094968228742502212711093068005840888a8c49536248630501d8918cfdea02960016e351cb190fc08383203bc82090dce49847866da90d0bf471889b9e456f550233c08a6af4e502ccb186089046045046001013eb4656ece19f1b9f6f09ae8a0fafc70f863697801811bfd50cc36d4e82cdffdd5a11cc73778332c58a2b48fa2440b0a90588e80c43c0783190b5c391820624830df2503020aab7021b05060ed6de35b16061e7eb5e84200319ea3a88c2000527c0157c10159cf5b4822008f21dd9c5e85b17a2698401e830270140859084842400049844804623e1311105c9a1881784491b5e0e12b60afc28e661bc111dc4db33eab016448e38a38638210250006196f2d7dc89b573db3c0d78bf578ee52ade57edf4b61e43f388f3a6677c0473cc67eda5324ca39b0fc6207515ee90b657ac914a21d11f2e7e902515ed4bbe2021cc32523e58006efb4e0c5002ec64967002130e11804348716c5969a40c11acd2d14810cda47ff90e214360d55620282d169a7e38404fcd75a8200167540b30004e304601011e090000c590002ef22203b0a90d88e84c43c170329db9820d2c909183cde223a3054c952485d714204507bae8e10083788536d188029a98e46fe02000d6b47df980800b43d4b09d821d01762748800356428ab0405a41614810042c842383a00026120525a11b29083948468540011644465362309b1174988b22c4040763045b7f8adf6b4b42a27e2b6384935f0882b7643d9b3e4b09732782909a45eed7ce9fc9fbe31e60cb34c9d4e615d8425ea5120d551491c8040c486de2211b512929874b47843dd5368e5cbaedee73a241583a5ee4417a4769d6140e2cb9f24846575f639ab245b6025641cf123624dbff8c059ebd2e96c7eac4a1a332a60c8c8ebe1e0b8b05fbd5d5791f0aa81fd5f12c2549edbf7d020bbb3860200008ce399967ea4df5df4cf8aeb8000550308ef5356a0b318e53262e1724c505ec891043f3b7bcba06e088778460e61ade159374bd7e106e375188f4ee5a7aae90c160f59040012b9a60efa53cf35c6444d4b2758ec2e7260ef758a4bdd6b0703691dd4264629cf8756e371b691265ca0ccaec0cbd12fa8ac71631dba66408808c2a41621e0391877ca656194200eba921c3422ca308928483056085a0c504241562530408bf24a0880260c2300808704feef87e1fb80abc4a79eb11db916ef3abf7a8c7f2299b1c3bd9df1e128183ed2000000000000000001137a437e148c297b7ed55354baefc1e7de9af28dc6732636b0c2000000000000000000000000000000000000000000000000000653247246185241081280021232f8f1c96917606e782b751e39243d767d70484ceaa5d8ac1d63e4b7afe65411692f1962653c6a78fded88d4d7ee5faa6a48456ec15fc40fb99bc690ed9e5519829ab5a0e3b44eb30c249457b45ab6076cc49196c943605932654dd2cb08c32cf40019308868a8430542161a1150d08a06800209888996c448b622253b1954fa89469d71b20c2003b93d77760d563011072d8080bce19420212b7de1a95d0194304b45d8fc2da41750c0546170)) <<< 16000) + 0x3a19c3bde140174168903f30bb80801995d2535ea47b50000e208dc7c957f1456dd1e9040760d01100d85482c43c07239155f4a5f28409ec904564868ddebd2d040c176870f40a1005c8093b2418290bbb9220207aa5710c027102300808702e475f461b23491843b5a59e1852bab8357090d41b14ea51420fd04e92c9075e6c052c28099c5570c0009c50880200002da4434442181a10b09085048424140006f044207420e220006b8220c421051d0820e840c641142210211080868400241fe0a00192121fcca0fd6107e0e80c8341f6120fa05001483981840ca3c6e414614a5dd27071d050c34b1f9bd2385087b4ec2d0870806f1b2d4b40bc704a66455f61d02007164ce914211500b6d70fa2fa0501c3cf04ffa86f4e7058048818ef50f37c64c614697d4f6a6b0508a2afbfb0eb09046c35f986b0080775a2ee38264704407a6f81e586002996eebd8580100425695912634a1979074312ab3ce705804800022421f27a0f83907b9a83d8c40925a0f52907a1283cc841e43a0f1190780a83bc441dc1a0ed0d0760483ac141d4020005c821d2420e80100288510e711073088394441c80a0e3010034a39042c5a3c38349bbed9b96287c4e59dcb7704506d71164fc93f880a815824a27531c04fd2ffe277b02008c4d1ccac8a0200ce29cb8d4f9a28a8289e57ea333d881023574b052c254ac7482f03407112c38477bdd69dfd39b5da4374fe9bb73c02412471c52041c31c21411400800470280200db27fda1163f784c10a20670a09b65f360ca1963c39fbe6e86b0a1604a3a3f21ad698914858fa711f598a09137ac30a748b994c700076975c09201702004e3ef00b9e3d4d3d0901010700a8b24099e45424511b469c5dbf28505e5eb354122d03dfd47a0910e672df39a4a084a01007701000096907705d10519f6674ff9c91e4800c08a42c1229359f2899fc52444e2350d8611240893dc20251e0480cb57b87521d00a00145ccf0874508004c4a6caa9709f42020bc0b01100a0870100011810006003c5b65540d930e196355c2bd460a7997f2b2c3824183204521810bb2c3dc206001ef5014b0442618250080000a910e01d06f8e8378741ba3a02f1906e048354041b60203101069808348041a2020da010004cf105015f0e32a8b16021850d282ea37d28840f770c090175030ce883b943a8060a0c4ee772d484099b7468f5a802047ecea8f979c401d7760303111145423f245632ea03b31d72d36804010dca150b00a18437a275c9b9163863c36bcf5a1a030eefb9d62477f0e08110f13d26fc10106ba2d3157001022086a0df3678603165c2ed511284003584b37af8045102735246fc350941d0505e0600d91106c06835c241ac120d50506a0280c4141a6020d2010688083400400065840016c4867acc3395619aa30cc4d865a4c32916192630c82586390c3185618a230c40dc0219c2bd661207d623e89e30134a84b120800ecf19e5e29208110043fa6edcf0e6d7690dd0000000006f75a77f40909343102fd03e0c43f02d0f3b8ea0f5d1e782368fb931c713c66d140e440c3fa4aeea63109772992c9564828000000000000000000000000000000000000000000000000018cc0403424310328214220124a28e8b2ddc9697d3b40a36606102a9ee5580c4c0b85b015e24da4da8c3ffa3e986d44f8137d3a6ea1ce1ad9820450074d23560719c9008bcbd4f843e8dc07bb0a2988c3f64bbbeef581df8a98e1cc8035af28c2bd4a22c4a2d0005ea305dbbd844e801a8394c45465a59bc3d4aa510fcde4268bbfd04b2891ff4e1ecc487c4bb880b732d048081ec0741fd1bed70cd99e7ddfcab60ea2b756b85dd6bc49d435915b82fbf8a7fc3037c64fb9a3830096aa589e656c0f62b78efb31aac99d81ec158f88e421c3699f1f3548b5a3796326430dbe4b7b76281a75b686a112ed4c4da52542bfadfb74ad7105dc21d8e846ea5f9c2e058d385d785272784b92e57751057754d6edf3ff9936e223952f907ccbcd5bddba57aff0b79d54a4aca0d267d211889c22c37392611f76383f1f7ca8e08883ffc406055482624d0c40bf40f8310fc0b43cee3a83d7479e08cc040359372a1eb26e543b044aa20557c8f41b0810a1490c60c40c208aefc4263f0c5cbd27a44e62fcc586d78859e2d0528c2a2ee95ab7ee2be7077c0f566979e4af26f76ca595cecaf6ce6e5f80352510be06a48a21d66750003f620014a0430c66184330c1198600cc2fc5617c230bd1185e08c2ec46174230b91185c08c1504616e130b609e0c754244d956b1fd65089b6a92090c11283bc3dde50a21d7040dd947090c126f76fd42c5d506325718ea6bce3001faa1d07ef56bd70b39f180b378502215827ddec50e1cf9964a7638286001217f5a32e35c872ddb859aae54411446313f194ca4680548a1036c7b41761fb620a57ca49ffaa411dec60101ae60917eab5847c15c43b66c306a06bd3f406db9ad249921ac49016a13cd60bffbdc12b15445b92391fa61ac81315ab5cf632cdb6a74000000000000000004368fb931c713c66d140e440c3fa4aeea63109772992c9564828000000000000000000000000000000000000000000000000018cc040331831032801404005cb83781250b15cf44a58e140f1ad8fe16862df39e4f0e475ee8f8660fdcbf7e0a6250a3377f874a1768877488b9baa905cb6c62e030520fa070cb838e6fea5e4a3efdf8645016296b947c308beda8abc6cee9dcf4d6d7562d4fe6415602f208b79adbf9ec3c9213f9046d7d4164d105b5c073d9ab7423)) <<< 16000) + 0x840fcf628b630b4eaaa3487e10ca37412dff82895b0f981e18e65fb29a262e0be15d548bf5e3cf233baec5227ae6b60f8eef1c496b4f3710012dd6afa22b42976c50df2968c902c3b6d9f5c90aa2bd910a304161b57231c14ab6282f92026b3ee5c4202a1c7d5b080281394108042c5304851fec814e18643312425bedfad946082fd84f811c130ace996810119ac3a05000917613c990049c708802011c1208d0105a0080006c084610c2cc561161b0b209f121e7996a531d020bfeaa1d10020140820656a3a9782010a3455009d08003468032f3588090c0eb8e31703979ce7799ca0cf9d5044c4d0dc845b6bfc0a3704282f038528d58c9480ee64f2d63996b9880539482144d5ab424b6ba691361121c74466cc078891d01850c30cb085091ffef297ce1da0824942a3718ac652c17cd0d6843c2acf44f207fe7ac1b255528ad5a199131389393572a7d777a14c7ddbdb319e14fd0313124c8f7645190a019f0360061c6031f462f040b080ba2920bf14448407cd7347d35714213d0687863ab9c006fefea4c4aa0a0000ebce234a90480078e253ad008451026c72f127a24828cd390f025294810486207800028a2000bbc42c407e501527d2407b820493dd229ded38b205c68378d4103a0526c5391e8c848606ace371367cd955e18f0c70a01430317b44f7fa0d3a8cb12caec4f061c0c48b94e7bf0071c9b94737ec010319aee0ebef3ca82f7c2e2c064281b1a3c3c4ba4125c708d69ffb60051a1d519ba30bae724ebddd94d08f38765439a718d85286911c40e675985203b993c2d0f3b8e2a59f5ee0844c24a1891861051041090c6085091044c9200803709004a60a5356450c144c12268a2c6103cc3cab51958a2004cbb2939d11049f58d5cd192448625fff1f6e16060872c1049f02918004e9e2f5c28a2800269ce0f1aa488207884cc3c4e64a034921781a0000a008001e6181cceb30a407732785a1e771c54b3ebdc10aecf89b8b318574a21169557f7a5919d07382246d56aa2cdb00000000000000000000000000000000000000000000000000c4471268e40e40868048028088224801904d480fd055e4077c93465253e8c7bf62900f2d00970f6907885b705eb0fe07282b1d82ab9ed7facc673bec9045691653b91ac360bf434d47d3cded58c646048137a8e5a3c8250004d020019a0626ad5a125b5d3489b0890e3a2336603c240a2863042846822823800008034458f8b21380e906340bae4c0ef80b2af62bf3048ae1dd0b00182b0082bc0615c020001fe20aa4a00173f200a1a001afe215a620023e82114020028c3209aab04c51825a6c129260925304805c061709d0016d1820434aaaaa3100b17e56160e030054c93dd01ea88801f8a7bbd5c907e7fc914c12000589ae582ae200337f77f05b08c052040c300bf19a0f2c6229900f4421c25c93859c493f9c8599f7c61f66b28a64666d029897c26111014fdaa86584dd0a029aea1c6848f5bc8e3eba6e01960adf92ba7288ab49edd507f230ffadccbb031b9a7cf30ff278bcee1589ad3004c34fa2420640dff7a21d74dc13c3c76521b3bcec992b8aae1e24d5ed5ffdc74dd83958e584d536be35d0240141f7d918fd6b571a6461b6c9d6765e85b18d15867d6f56eb8f63480f301c0982afa212a4152caa3e76defef780ae4968639e92ae8ffb91c58813332d45a66b17d1b79f50893793562bc8cc166807904c0de672e6b259427690022b005d9e248e492817e700dc18481d51988c6d655d0f99b938f52bf96283f7814bae6c47c966d53f2ec7818225084c9625ab1cedf5dc969f8dc88cdcd5d9006cf2c689c58173f96e037d1c596c8c9db12a660c8915793c101c010046e724c23fd82cb2ee24cfc43ebef8998b04289ab568496d74d226c22438e88cd980f5e253cf588edc8b779d5fbd463f914cd8e1decef8f0940c1f6900000000000000000089256b6eb795461933d3dab59eb447c7ba9a089d9ed461cb12760000000000000000021ef486fc291852f6fdaaa6a975df83cfbd35e51b8ce64c6d6184000000000000000000000000000000000000000000000000000caa78a408780600899ded8aadd1f85ed067ad99deacc2b61a55258ddd3bdd5d9aeac372cfcc594b7960f1e18d0639fa2ba70f52ce3800f29bf957fc87bdea55feb0fba58916bc13801ced2620f9524855e810963989e0b0c4ebadbbef6a6b1bdd7d28464ff845f05782ab43296e22517b339ef73ddff70529987f58db232b9a5c237a43303df741e23b98c4110f9f05d15d54e689ed58bec5a24124e810697642bb9c9308ff60b2cbb8933f10fafbe2662c10a26ad5a125b5d3489b0890e3a2336603d7894f3d623b722dde757ef518fe453363877b3be3c250307da40000000000000000022495adbade551864cf4f6ad67ad11f1eea6822767b51872c49d80000000000000000087bd21bf0a4614bdbf6aa9aa5d77e0f3ef4d7946e339931b586100000000000000000000000000000000000000000000000000032a9e29020810412040bea7732ecade8509eb307494c03bcfda0f028aeb5fe398a226e8fcb7558af3151a7826147e91e7388adf7cbb08ab1419fe526867631c194bd6342487a9b9364740a6617c16600e8d7b7545a0d2fefc487a3e5bbcb7712f741be897c7e640261444cd78e96e4a1d9191013c2e174a4520a6020da8cb612e192be833ecec500090d200260c42b0260ae0b0a505c9a18817d03e0c43e0622a0b523d3c16b4114cb671419d340d19f90384cfa6c9990bd719a737e873c7703c600000)) <<< 16000) + 0x0000000000000899ca28f488b8d5d3fcb9edb42ff10476ada8d9ac529398fe026000000000000000002198e18811008e084086021c60fdad41c5cdd333c6e733f00583098ebf245b1ed94cbc59fb44d6020da3ba1e2ffeebcbe267e1801a4fb9dc250a3783a0523f3c32ec817274e9de9869174ec64feedbdf2231cd66221a035650d9940573f7a4925018758945bb9c9308fc4a0a1ada005b8d80156f6cd1f046fd60decb32d6b7289b0890f1d119b300fa26ad5a125b5d3489b0890e3a2336603df27f5eb3e1890f1a43d33a13ab52fe6c6206d76d94104b00000000000000001f21c20820e1901040216e58b3d8e73d1d09528de0a1ec39a9903b882dced0837fb6f0c274f7f9e9e58ae63da5ead41f1a2a2cc35d34d87b9aaa28bf3ed9883cb1e8942e088e5ad5b0c1d7b26360ccc0ea324c8450ab050002a7108f15047088234040017144230961161b0aa05f8a325704417f33fafb374b999df8064491a0b2b98097f4e0b8fcb3f50cdd1ac26f100842ba09b22ecfdce17404f92d8acecf402203323cc1a7860a614f335ab03d1b92cca2cf722083435cb80924541ac7821a39d2c07525f591bd3654aff8d0adc36ec8b35b4808410da1313a3e61337dc581aa611c2838fb341f6a40291f66c22ed532449849544180370f0f0c195c9009cfdf77a91b9f5ac72160400aa79272649ccdf29d8e05941d2ab5b153291795f6d200cb9b240902089588432f580d8c7d3e6bd5640914ec2d2333af89c23a4b692ff283730f3996d6cf97c0a798c92624a208d9fa54fb05c07bc7206d1c9258b41b422da61c600c2b575361879e540bb4f4bb6d964e4632368407613b03b257f057dc1d67cba528e40fdff6c085a3be46c7eb7f2d3332c7a99630f0ce89e71cd6325955d86e724c23fd82cb2ee24cfc43ebef8998b04289ab568496d74d226c22438e88cd980f5e253cf588edc8b779d5fbd463f914cd8e1decef8f0940c1f6900000000000000000089256b6eb795461933d3dab59eb447c7ba9a089d9ed461cb12760000000000000000021a1041621220618c000094aa57ffece185c9e408bc0ab9adc7aeb1f0a61bf2da63a238525f4e0adce85fd7024c29e392b4aa547f5441213493e186fe4b5aef6c4823a610b6eb34696425c9e7d7704e354ffcaa8efb5926683335c69c707c6f85b0a70ab68964f20177538443d4865977b0399d661480ee64f0b43cee38a967d7b82144d5ab424b6ba691361121c74466cc07af129e7ac476e45bbceafdea31fc8a66c70ef677c784a060fb48000000000000000004492b5b75bcaa30c99e9ed5acf5a23e3dd4d044ecf6a30e5893b0000000000000000010d050c30cd085089013a42fec90b1f628caa7bbb694aa88a46c947d7cd113709f54907e08e59f2e2f61851492adb2a618c7babb96b3eff31cd177c099a18ad61742c51e0e7bc5d8d599486f91b63a1e74a8df69340357bff5a6e409b44164bc6567c6f98a2d442806c7daa3b16ba5087010003611000d9b21520b802008023c5401c0640240823abeb8a820af8e970841a005bb5a10124000bf1245e400139a19d7c98108c02000027a42a02414e120a60902484820c141040a081050400281fc0400046e4294271356ad092dae9a44d844871d119b301ebc4a79eb11db916ef3abf7a8c7f2299b1c3bd9df1e128183ed2000000000000000001124ad6dd6f2a8c3267a7b56b3d688f8f7534113b3da8c39624ec000000000000000004333841c22010412c00c0e882a2882518633ce23fe05a0e576299364e2f236f5c5661c22e46a05ad295ac66c41ac816829f127460e2405f356e541dacab149ae0b43155098b32e3dc4a5bbd212e132adeb855f089a26e9dbd317f3f2c041ec22b29f5802008020290140920a05b0500003090a31504e0a8288340b21a0580902b848284260ac0a0006e120aa4a0020f7200a1200408d21408b09f4184f1ec274e7a3ee4c71c4f19b450391030fe92bba98c425dca64b255920a000000000000000000000000000000000000000000000000006330100c8a0cb04a04a00501510014f83b3b3341cb8c1b3deb3f6e7c140cd3e582360e781985258c9233f93ab490f3ec00a443a95eb7845af58254bfe0725e73248b579be72b52a199010e2d5ba520b374e879b4a9df0f4cdc5e3a1974928611b3de40d554e6322cd29984f090697e20c8000000002ec98b37f048260650638208230010000020e54b7152ac1c82bbe707be446d1fbb0039c915b84ac1dc719847a1382b07d1584d8ac1f0560f62b09a0982b82c1681613203df6217177d9f942559912dfd4ae820f00eaca590a625f0e636dc4000000000000000000000000000000000000000000000000000003509e31a31420820a0a001c004008e0400401ba30a27a6fad09142a7cea3807881d87bc27b28415e8f2b4d08210e224ac3840c00e00559c187f3bd181c42410019bfbbf8a09ceaf6cea94990c2501004c0080007dc84b86c2583612a1b0940d81504ffa6edcf0e6d7690dd0000000006f75a77f40904d18c14a1041030ca05000e0140030400200de1cafa640cc434648056d29e8b14f2e15f64f1451cce94b30850aabf2473061026ce709d9502088de222da84404035ea6900f0002254faa05003091c260187f4ddb9e1cdaed21ba000000000deeb4efe8120a469639830a2a219818c198028860600401bfd376e78736bb486e80000000037bad3bfa048291689079070e60c28a306286a0181801006800095100026f20008fe424c14000bba40a8a7e7971ae2d2a1479a008f0c)) <<< 16000) + 0xbef01c48628f62660e4083e6d32c8e5041731621c39f40820c7ad4aa77120097dff7953208990e3054040f2002dc6a385896d8f69922435f6b33e4861f0838ff8030903c2e1b4082018a678644098608402000027641dc140b60209201048808240040006d8423c6411c2a08d05000746908c2d84588f890af5f6b040684f20008114804a903872ec3b48c764b840840c6fdba8c56082a17d4a545b18800560de0700090188529b34a5924060c557c9556ab4785203204058a4af64f73869e40582251b2ecd350287d62fd4de4d901615a000000000000000000000000000000000000000000000000000199767c4dc598c2ba5108b4aabfbd2c8ce839c11236ab55166d800000000000000000000000000000000000000000000000006223ca3c634610438008006a64677d9be0c1247812a55fdc26f956a15b8209530d156a2c4837aefbcddb04277be7c06aac79f65d123403ec574a5ebbb91526a3d0ae0c21d666508a0d84486c1dc1702c321fd1423880e53d8a39ff81841fce913d0f8a2021bb0257cc4124cdd824a208801b42316ad23c0001f7890681c002c47ef3f00007de275e12162040a4071130748487504891d414bc8ac404005b8d4701e201fd1b3d387116df867774380a03054fb31803fb713e3a8a04df9d3363001e847b4126203094051224385b3c1b337103093ce8212ae8186889dbed711b470a019f50e7275881411eed91792f8a181ff06901de6341038f67cc1f3e9000d9f8a7551e900002d67f118e0ac07a420bc0d11356ad092dae9a44d844871d119b301e14ce4cb30a1862051433413007c1b24ba65000f5795b401eeeb5e71a376f8093010b01fd0001a1200080040017cc84402821c0400107040037c48248cc1d817bd21bf0a4614bdbf6aa9aa5d77e0f3ef4d7946e339931b586100000000000000000000000000000000000000000000000000032980806499c91a99040c30c905e84802b020b803626ad5a125b5d3489b0890e3a2336603dbd21bf0a4614bdbf6aa9aa5d77e0f3ef4d7946e339931b5861000000000000000000000000000000000000000000000000000329246a662458c326124118002060000401a0ea020002ba3130046966c9a458173fcc281c50434b7d9e28bac28f70c12040a61235ea209b151642f04000d84de8f3801180401d0040e602000195312812424d22209dd9afd224020a8247128c085b1a708ca0012a2ac8a92841080401c80400023864682222298090304195f65e8c3495c5a9ca0a2801a2182b2610016e351c241141772f910007a1200530212004226ad5a125b5d3489b0890e3a2336603dbd21bf0a4614bdbf6aa9aa5d77e0f3ef4d7946e339931b5861000000000000000000000000000000000000000000000000000329246a660c31a1a6124118002060000401a0ea020002ba3130122b6e38a458097dc4b91c505ecf8c7c28be3a8e1f9920418232acda2097a49467304000d84de8f3801180401d0040e6020001953840a2572d10413596323fa40204427e8acb0403acea2428002672e120400084972eb498208802010c0200014d2000eaa606080b5e14840884c7f583082c7b3aa2e0d003cba201c240020bae5bc80066988e2a4260c22008042828210140002ca420c141040a081050400281fc040022a041f8b60fa5307c2583d90c168270240dcf15c32693c614eccabb02d0d182d56cd9de96283112563998afc80c49517587aa00c3d64ab3aded80504a6ae9c04d96380171713926ed94061913fae30a9710185c06880e2d93d8c816e2c40e2b58417f38825e5920f36430c0c0cc3efc6f1c306117bb1c15971821b0fd419234060859b27caaf7900032042cecb5e700076a031955558949082d03044d5ab424b6ba691361121c74466cc0785124a20b1041060c608304a01a510c30cf46b95c339d211ab9c7d9e0cd2dfcfc042c07f40006848001f69fe9bb73c39b5da4374000000001bdd69dfd02414040c31821422813c03400405c0400803626ad5a125b5d3489b0890e3a2336603c602019204a04123a030618a1120386d1992b0ced69569d2425aafce78cf6403c7b708590fa8000d5902a0100017e907a1183c86c1e026092130770983b02f7a437e148c297b7ed55354baefc1e7de9af28dc6732636b0c200000000000000000000000000000000000000000000000000065148d1861452044824c048040030080200d89ab568496d74d226c22438e88cd980f6f486fc291852f6fdaaa6a975df83cfbd35e51b8ce64c6d6184000000000000000000000000000000000000000000000000000ca491a99858c30c9849046000818000100683a808000ae8c4c03803d25c28b37f1229c070c0e40953624084a5e5cc64412fa2251e408001c81e2ee6002300803a0081cc040002cc6c4239b9e0122116e7444413fbcc85030552e82cf2803f364eaa4a103a010072010000839c30082af362245035b570a8187792838b505043df202b79600098ad56328001bfec9c44801d8fc631d27082300802e8081700400032e41c4460e01b06f0983702f7a437e148c297b7ed55354baefc1e7de9af28dc6732636b0c20000000000000000000000000000000000000000000000000006514ce2081c72435024c24c1f424015c105c01b1356ad092dae9a44d844871d119b301ede90df85230a5edfb554d52ebbf079f7a6bca3719cc98dac30800000000000000000000000000000000000000000000000000194933943471cc15409308d001030000200d06d0100015d1c36cdbb48a020206)) <<< 16000) + 0xf93d16c9821a2c4839d204e549fb36a008052532c0040003ec03e93001180401b0040d602000164360dd800ed65801108cd7244103c01005e01000047106a0d83484c1a01743c1317c9d0904433fd6215543002dc6a38a0637ab78254a08099a8ff328005aae7abb480002dc6c005c108c0111356ad092dae9a44d844871d119b301ede90df85230a5edfb554d52ebbf079f7a6bca3719cc98dac30800000000000000000000000000000000000000000000000000194943d538820d1150d40ce001030000200d0670100015d1e3d1ce0997e50214685635e98446449e0b0904071e3da5840009e66c7094008c0200c4020610100009a90660983282ea802e20caf549273c9fe5b24a8835b716ad05421168dfb11a208005b8d470b0415126ff840824923283084c00044aa2001a010940311356ad092dae9a44d844871d119b301e155058f2493855845440413c0080c8000803418c04000250419017650162517cd4aa005a879211249d6ec12d792a211c8d8d00d5082fe4277a40824ae8ccfce4c00044aa2000e0015126ff84340412806226ad5a125b5d3489b0890e3a2336603c2aa0b1e49270ab08a8808278010064100401a0c60a00012a20005e878fc04dad1328203a801198a04535715d92610ef6e4cce1000671310284a1044010062090308280004d08003b199162557197c28bcebc96a860401fa7db85021599c6a220216c8efa604a18400100600d02f848178140002864003a5cc88720ae42830fc14b2c014018afc936240f8a5108e80120c0f8040174240b80a0001032002e7a416c240042224168440b2220580d02b868158140056c8415494009b5240142400be6c401906c82a02802bc388299e8148640a21a00b13720a043a20e27fec05825b13dab59eb447c7ba98ccc2b3bfa0132a7c00000000000000000843ea11d2425271305d8e8d5e266065ebdcee1191228a28a190104108004002a058eaa2b8495d6016821ee2e2940ce2509da54d272be58afb7906cc963e547dffc2744a143a70e6354d7d8387db7e0543e8a65635728dd2fa82780fdea0296600955db8348280c1f986ed0bb30483ea11d2423cfc065a988be1062105d40aea1191228a19010410c08a082003fa0e6bc2abe192c4ee36ba49e5291899ebae2dfc001fbfaa025c1c759137bb61763d8933c24e513c40504e19000175904d3182618c12cc6094630491582400fdea0296600955db8348280c1f986ed0bb30498e01f0ea1c055e253cf588edc8b779d5fbd463f914cd8e1decef8f0940c1f69000000000000000000883ea11d2423cfc065a988be1062105d40aea11a16288218114112019c6ae755a1ad8cef4d746266055a63154e7f67e69044903a7fabd670285d0acd631f97b8b0374918ecfd8fb17f69d989f1d6d9e02ff8fc277644ad1775ed819d0301722770d8982c145093045ee061e7b5490070862d9831984163c55f83208c208c0200001646010020080470100001b904609d8b6f8167620a28f3499fd04022357d3731200da6f51a04001dcd32388a0026b33b2a1304110042c532363c4cc28a73c492118c0c193604f7861c882fc8f8090208c0200001c26020275ad36a40229918810840454011a4d820f378e63642c067ae46cb04000ec27ff10198308c02000028241044400074c41146608833043198210ce436206548c500c5e56a3c8026cb9722800046403e010b157b9b30c4a0c11a104fc60c04429ce0c03e43090200022d4b27490094508002182829780eca58aa375ad3b0a2c6f89fb781820015331720120a11004000038cc060040100000444104340004ae41002400067240fc6407c3203d1901e0c80ec640741a0390500072990384d01ba480d914054820353901a0e80cc640641a0310d0180480bc14002d76401577c537f2eb399082099c75ae18808089eefce43854dc24c29e18201cdc795d0a000db721ae830091c22815e002b3901280438a37fc675611c2c2d5dda378c088be46d9a45040fd60e2581000818cdd2c04005e36578c8008cc404a010000156205c4b02d2581612c0ac960542302901f1486bd2663a3857a498f6b3182016118c320c00720e16c4c5000528d58c88a01290128042cb2b796a97c144002e099b94b142e64cf4d450b6c3cb87f70823c1077ec40a0004541ab98100003238a69380128042c803dea02961441f90d00b1c2091a5051d683020091c093d2809fb271384920000b71b002600250080000a39b2cabbd9ead458a19353074c285b42e68b0084120287bef70804015730896280011506ae608000b8266e5ce004a010b200f7a80a585107d325fdff0825071b4753140501d70af44900005b8d80128012804000045880015490280981384c0982604a1302401d9658a3369542c50d8927630142d9a95762ec808029544bf810452bba8918140008a835730200055cc225a7002500859007bd4052c2883e992feff8411d709759e0a0280eb857a2480002dc6c0094009402000022c408c160440b0210581002ecb26fe5fe6a1640003238a68a200124f7e2e58a170cbd29c285b656dbfb08411d75759218500022a0d5cc01388128042c803dea02961441f4c97f7fc209191b18c305014075c2bd12400016e3600004a204a01000011e2000572407c14000bcc400302080f068074340381a01b0900d04806414001b8c40610402e7a0163900a9a8050a40264a012210088e80406401e2a00e11006868030340161200a05004808004a9c80410801c04022e4c40184400a220041100182800804002020000100956f1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 45 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case15" = "QuadHeightCover12Case15" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 45 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case15 private def zz2375:"s0947"="s0947":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case16 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l14 l15 l16 l17 l20 l25 l27 l29 l30 l31 l33 l35 l37 l4 l41 l42 l43 l44 l45 l46 l51 l57 l58 l62 l63 l65 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x58ae60e93, -0x59514ba00, -0x48f3bd1c8,0xf14319c0], ![-0x59514ba00, -0x32f8a7d463,0x645c7587c,0x538785cc6], ![-0x48f3bd1c8,0x645c7587c, -0x24458b6bed,0x597f125f4], ![0xf14319c0,0x538785cc6,0x597f125f4, -0x2cb417800]] noncomputable def hinges:Hinges:=[(6,l4),(0x198f57bd,l8),(-0x4428e9f,l11),(-0x8851d46,l10),(0x21b7651b0,l14),(-0x14f123fdc,l12),(-0x17cb7999a,l17),(0x3de713736,l16),(0x3f544d382,l15),(0xf906fba,l20),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x1167df4d4,l25),(0x39b3228d,l31),(0x1ab8918c8,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x34a256e6,l43),(-0xaf52441d,l42),(-0x15782a20a,l41),(-0x4cb18f8,l46),(0x150480fc,l45),(-0x119adeeb8,l44),(0x2cb417800,l51),(-0x9fc0cfa7,l57),(0x1027c90f8,l58),(-0x82a7b8b4,l63),(-0x3582b1c6,l62),(-0x3da566c,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x3de713736,l16),(0x21b7651b0,l14),(0x1ab8918c8,l30),(-0x17cb7999a,l17),(-0x1167df4d4,l25),(0x3f544d382,l15),(-0x9fc0cfa7,l57),(-0x82a7b8b4,l63),(0x1027c90f8,l58),(-0xaf52441d,l42),(0x39b3228d,l31),(-0x15782a20a,l41),(-0x14f123fdc,l12),(-0x119adeeb8,l44),(-0x3582b1c6,l62),(-0x34a256e6,l43),(0x198f57bd,l8),(0x150480fc,l45),(0xf906fba,l20),(-0x8851d46,l10),(-0x4428e9f,l11),(-0x3da566c,l65),(-0x4cb18f8,l46),(6,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x2380590060000000000840720080000000008a0264018000000000190388020000000000320310040000000084480630080000000000e80c40100000000000140c8010001624890804420080000007464540b400800000000f8881c60100000001c8c40d8c03000000002a0c0298040001cc5805c06a4010000318a220812c802000000130d060290020000002882c01d98080000005404801b30100000006208819060238518b8890055210070000000311480a18060000000721a037300c0e90b286a00cba8030000018e29c0930c05001c62ac36809ea00a0000006114406c301000778ba0ce043a80281db16c04701ac100600000314528126180a000000000014072008000010864140288018000410c41601b10040000000001c181980200000000003409200800000007428026601800001b088280510030000000210880b18060000000038240b30080000006a10810c602000001d098280510030000001d84e043180800000003611022300c0002606812013e8020000430c42101bd0040000001882c01d98080000000000030320040000006809003660200000000000340c80100000002a0880a98060000004d04803130100002b0480b013a80201420a4042003350060000a41502401ea0080001502705006d40100002684209006480201440a1044006350060014c144130096a00a0001702807005d40100000000004c012401800000001109018c0200000000221603180400000000003805200800000000038012401800000000012014802,0x1461842081eaa00a0000000094580e3008000000000036064008000000208e40d8c030000004983201218080000124541100d400c0000000e43402a6018012720e3540f6d005002424046180cda00a091481463c085b4018000000e21900fe60200000000002503880200000a24b11014a006000000930880b430100000000001080c4010000000248480b0c03000000544a2202a0040000000962202a300c0000000001280c40100000000026240cc0100000000000a0710040000148962202a400c00000149309012801000001422040930c05000000001e0e0518040030851882022a401400000c84c1c0288018000000000a0c0cc010000002082c01d9808040830c208091740180000148641605c801800a10c20a405c90050000000000120490040000000003f00b200c0000000000e80e4010000000000f404c803001101b024011ba00a0020831842015740140000188642201a801800000001a0f014c020000d021872014200800000005221036300c00680830d200908028000000000150388020000056120600520060000005c28180e40080000000ac240546018000000000150188020000000002c2819802000104330600684010000000064220446018000410d02303310040000a62086204b2008002603083f019040140a10818610122e80300003c0841a02710040000000000120310040001d034084078401000000004414018601800000002116038c0200000761e0580a200600000ec340f014400c0000000c42402a6018000001842201fcc04,0x2202c10080000000000900c200c0000000001480c401000000000223c0cc0100000000423a0518040000000094840a300800000000000e0640080000000002a01480200000000000a819002000000000017032004000000681280726020000000000d402c803000000000034039004000000001a001320100000000000b00a40100000014848004cc04000000002c2403980400000005821013300c0000000b04e026601800000001611014c0200000000016004900600000000036009200c0000000c81201860180000001902c070c0300000000000a0310040000000068240630080000000d02201c601800001a01040098c050000003504200b1808000000410c408e30100000000843201e601800000000261c0cc0100012a2186802fa0080043c3304d015440140000000c44202c60180006f0a81401e90040000000000581290060000000000a00d200c0000000000c81a401028620f1cf00e8900600000000000c81900340c80428d029b8401c0000000168480e6010000039088280350030000003a2a1a05a004090860c17c0c1940180000250cc1203a8018012418c0b00ae50050000004a241203a0040000000000900d200c1419010a680df080300000032110601d0020000000000120690040000000006830330040000000188b8146010000821d01101250040001263608a0372008000000830640243010000308a61400d08020000000000210388020000000210c811180600018c440d007a401000030886198134802000000001d0e018c02,0x1940288030000000000620710040000000000cc0620080000000001880c401000000000d0b01cc0200000000006c0290040040871848037d40140e10c182f81832803000000010864058c0300000002911007180600000006229016300c0000000000880c4010000631303302ad0040000000000088190020029433845017d401400588720a2053a80280000000001a0148020000000001a805100600000000443c0530080000000000780a401000000011024038c030000002702200b18080000094260900b400c0000000003c012401800000211e1902900200000823b1901320060002c86314c04840100000004208811c60200000000882403cc03001e41141680c6200a0001d8250740cc40100000000001700a401000000002611014c02], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((0xb295f1ffe19) <<< 16000) + 0x9c4804ca03b5309b7f978cf459260fce50d4c100572b39218181dbe15ee260423008616ae1829becd2adc80e5d41851757a5b7c30602b5575446880b8f20bf0f04009265b814000eb3c4539c008c02185ac515e2a83ca002dc6c0069564fd37d60c2886b959c81e30016e3601306055c608d06842b65bfcbcd005b06f98cd00046010000199200063c689538a8fd8a690061f6168cb22bf2686fc9441ce325e4c28401431c03a4800bdea364880007ee45db8ce104601000016e21c0130df0986f02c37407a5883ad2410fc38a00258d098005943f8d3189424c264a3fc5f6ab1649e2a8b30c693070c0fd4e35d830c12f77fb33a42082e7d5d74101a48042b02406e02aca2aeecd11c61385433ecbcb24618210ce920083fd40f6090208c0200001c2436c260fa0ba25274262319348061d6f4120b2389d2e8d7a2884930881b3cd1000550a5f228404894fc318b0861c9ae75e1c003ed79e0c11a4061300a036834024120001e421b21a000531211c0b81d2bd5dc74f859b4458c0f7e2fe35d488ee246bf1c1c2df538461103380ef8e449ed342c8084f7bfd7df802a5428401c3bad5c9ac9ca1c0124aa797e3d5c228c0016d2ce7e5724c30405447d6e3dfd365abf4b211964121e8380000b4886c04f8c232924008d88227285074e757321a6cbd102cf26ce701501d448716211ef67c9fccc10288048ab346f87f8b41c13c2fdceb70afe5288001b1a692b68c3ff43004a3a844d74bde8a282a9842cc7b0598f712606739920b0f41c00005aa435c861362309a0186a80e64b1eff44000000000bcc9489f791ce6651382512471c30c33022422410c05151d55fba729e47bb898f790f3cef31e5175bca76113291972867126e0f52506cc9f95a9fa6eaf050e76a83084b9253a2585c248fdef3c87008b3f9113ba048a556de5fe55905a1519c6400531b5fe85575939bb0d02801dee15cd7f9ef2daab0682742460acd0725bcaf72922da69c554d63758d87be73d284fce1e6c98a1402f00006546c74de4e5031081931a245be02c42dc3448fe4910e14b1fdcf0c3403b4fca80b0632a0974c0201d62215760050241988c61101115df7ea4f125c4161300a00007c086b14f073430e7a375c77e614535f191a87c4353ce8ac8dff279695888d102478a466b73c023b21d9382f7a5361386291f2a60d5b6297ecbe7e021c22274671631264142b42e2346ff224dc125a988c7992d204643f70080071f83b740ead86cda5fb910a99c6eca98436109f99ac894efeaa4022006e807e55719a997dfbefca9824bcc349756dc3b10e13fa46a31ec8cd37540d22e8d80b690f0e0f78d6b2d5d259a7eaf48ae8a2912919c6649775747be8f3a1135ce0fa392f639b6211d84c3d81bf59ca5526b748f77aaf37e2cc37af6bf40771b902c0876b10a350b218399bf2fbb36ffc1c28733c3961d691b05848f082fa32ee35f3787084e968b92c5705e10003c9e976cecdbbc1400c93b1402bdfd78080092bdeb5b8628d90544d1717ec59a333dce8ae171ca0ec1900004f040ec97842831b1122c87fb01d8eaf46b0efe65da8cfeaec63ec98abe96ef68d1eafee6f2043a804ae88a8802f0b3ab6721a40b32c62062040c318114004045cf7744c6a9ba6f18cbd77bca41c969656a0aa0f2b40a2f07b29cf17643361afd8cbb9427718209a6a80e45d7ac9e506f630cd2be8001c11000d2621aa720d431000a5590d305cc963dfe880000000017992913ef239ccca2704a238a406386404204104500380088aae0b00401b842831b1122c87fb01d8eaf46b0efe65da8cfeaec63ec98abe96ef68d1eafee6f2043992c7bfd10000000002f325227de47399944e0970b3ab6721a40b32851c51c30821401000405735c27add27979b886ab6fdf769c10a9499b94f4b0653617ec8cb4737cbe631a699debbd91cdacdcd9b99f2e2f802d7aefe5d034fd07b60f58c4fba51d13062d063a280022d1e2a3594a9dd283001e848004070671142c070c162c8b011017099c4c0e0821cd5e2e944025777a516c7015a6e4b580222ab4161180430850636224590ff603b1d5e8d61dfccbb519fd5d8c7d93157d2dded1a3d5fdcde4087859d5b390d20591428e28e18411008a00800202b50e4fafd58a67bd65e36514e6275bf3c690d2572ebbbb8afe72e386666353470921fd35c417618f3db578c5ce20e598652d0003422000a164348d41a25a0d01901d84833c0400167c429cd7c239336c6f006fc08942341e7bb1fd20ff01028d6d76ba1c4090c42446aa6e39aa490800814514bcd38e03a8aab88783d9ae1b2a180110027d04d569e9038c765fc5c4963b9388de80364d66813fc5eb7f2d1760c0b4edd4f29885d70cec68afdeac079341a6d34b81e520288a652a361e93cd19832a97c0835950814c2eecbdfa362e2e712e45c02a84b9cb08993619a491c9abae5c068e2606a1083180004ed381292cca4eec3b0609d739ad4f45906006d86219ff6fc28165d33541dc8a100b0ea9c62bb16080a0ed3081b8e2ba1f30d23d3d69428817b4c32c6510e1c119c43a6edc3284d550c40f000049843392419a820cc3586586c328141920281becb38ef9731c2e65ec7b159060bffc4adf81d1422ef6dee143880435a0f35dad2005a1976b7b04701b652a493cd14018a3e06567d445144192ebc8980ab4a0f0a8081c6232c5d62c648cb284aefe0e0fb806106c8a1a95c3d72c6039b2c3265070c300141372a96c0b1064f9baaeba8c4820037e11b8b403008d0eaad2ccb34e2100062070e30101ff22aacb285a)) <<< 16000) + 0x0584abf0c2583d63248889240648b38490c227c88d4faf8b20004f1dafc4b10495b34a18c800051f8800569000500280001c43a5999ddc5e3882c84f391a4235260e0d6dc042880b1e6cc8a4965f9418bb0cf6a3c814309d8f78ef504800d31ab688005000a5062bab2351008560400001e121901308e0186380f0ac8a4a4c755b143a0e176f0e00ca1b5614575842e30a13f790c046024231f85377316081137fbc6cae108003b7d8dc344020008f915be11a0c002215ef0c872a9262450b40b000046a43183603613b2692d93d71a868a14280b6d341a50915577c207215b8805039d6164043030451c8afe43af0b000d3601597a3040032457f0677594541582fee33fd2017b812e800ba4d8e4060068000240218a3b0c415c092bfe5161b96388198ed30108a5060912ab9372020415aef625496382751f17390e450044aec6f5cec280175c2eab496a08a01f8fc2ba71cd11cb0b00900003e4411c9608a03992c7bfd15e64a44fbc8e733289c1289238e20e1881120040288810195884fc9ed3a932b4424f0359710c499694e7f56018c13609005eb7d3ccc89278d29e6386611e80010a9000f952186830c235d101ea5c83c52472f207453b902a2deabc3e0910b54de0cd04094577e7bcf2432c32b43a410181a79248f43003c50c6700a94081280402f40764993395c1bca1c7e7b924ac48c6df0a606828561583223412249be67bebc3048a6dbaa12480749d5c0c227042500806082c3000616c03c2b11631509a4964810d0a9ef682c8875e0a05a5e50e26ebd137958b1b98d9b7ac4d142bd7338d2152101762f1a67e880800409ab68761c88042b02004b82eafbe95d09dacc905da2521bcbe374a87f8b87cad9612cd28c0000000000000000043130a2c92c81c72c62851012001c04008034000670809048000f088002cb10bf0d85f02f8c01e3603bf160910bfa0c35305e9025465ba8b14f724336ff9f1ea9204069f5ef7debc507094c7d9992aaa0a0957f1ef3ec371c00e4fd490e0ec1800331fac8534944ad49142f03005e82f0a4da31090e2c9eb8f454852c6b394e4a942866ec822e75285dba872e8c1c3276e59e1908159dcf54d909c2090020178130bb01e968adc4943c8614f3c44133686125ffe1f99824100085b52ae060f09fced73f658d5491c1df78408151bd983b048200bdf8a990103521e9f72c808001447c205052810a00501740bd2d0c7a73f0833a614eea3986d0e463092ecb9bba033c904004e97c5ed200c1e07d2fa764d8858d4c5e4750a9da2040a1a6b7f4791840d2dfb0b6ca768700006fc23ac00013884841881c000095881c048001324e148df96cf272c95fdda56609640f769c2918b19bcacac1a850b077c6d6501c3052ca610102037e37945d49c10940201780b0bb01e152bf7ced063092f61508d1183bda6ff3db8b1c8fe2fec3e58ca295ee3c42040713f3d62840272322341c100052b18d7b4001280402e8078551f8f7521c44100213297990183de61b6c9f5258fd7fed2e246963353253c41c450a7c2716e2871021b83b14883a2825728907dea12000179a7b0004248215010000083c81c028000ff482384800174480063790b91580077d9992c7bfd15e64a44fbc8e733289c1289239029018e18e10808c00202980c0100683680e88f4608278e2470643043f9246e67337676244e4dc89b6b2040fdb50101203b045ec2f0080885763e1527042400805c02c2dc07649db9e3cb86d1445929d91d69a14382bfa8acc3d142acbf3f5e2f0922a6dbd9a71a0922012dd5cf1070c18ee9b49ee650200081356d0ece44001601002d80764995a80dfc8ca228137379bd850e08936826cf186005886e998142a70d325930891519889e647c488007de290001831b217473098e00007de29000b4821480a000080c8090280010bc8002f390b50d85a0682cc141640200077021622a0b0150578682b83415a120ac090558082a804003dd442a5361508b0a73985312c29456148230471185186e043fa5d8c2e2d10f1c288a3e48ee38f773010802304d844c3f1d64d0e048819f41bf75d1a51402f26405474056ada1001329f45da1735a98404110564cd6a1b783367428827e368af7bf74e26a02fc78deefe8130fd62ca97c9990fc1d104009ab210c74beae8f90e86a47beb1f4979e3585f975b9065a9119def675debe6bc27996d525fc5305041b2bce44e20c14a4327190e72f27eb71bd497dc2142385b947b8d13cab1ad8b89b8af7b2263f0ce940c7f7cadb3de6ef4de5ea7259d80ffe4c0527cd6738ccfcd6285d4030f8e369f7fa0b6093ab62acce80aa29edacd141f46876a3ac2337d4f9ee5008b0699277c82486ee6a0a7a8808b6bfbfc76602d6db4bf4da000a72a7ec4de4908984b9d43f29c7ca0326686c8ca17d05431c3d5c4c9607d6249ff1949f23820825c1f0168a1116651377282b0194f6b8708123833462811a05bb648600649b0029100214e621d900552728220080000bb90102505112c28457e745dfe59f078e188e11849838c3b927783065ed3d679a40026288488680b830f54581306110043ce4adce9c19e40497ac944f1fce99ae5c60e04649b791c690a937c801286108040000420d9015afc61d9c35a414b95058c40951f748a101765b5d83804c821a3a024a204401000010f3a609f3a4d9650e117f66ea9a2c91427b9c50a44a505fb140818fbed5c08118a235ad82130a1100400004fce163e7655831230234dde1860937146c611220fbb94aa4580097cc6008800700360ba08130c11004000)) <<< 16000) + 0x05048500ec27c2611c0bf72e2b0e3b605b0a83af6252da5fe2fd6f82ab8fd4a281bbef1f1771320a99629c19619019400a000823648dc4363ab46eba28d0d394ce5bda1746924a6617d2fb70fd156a927d12628871a2800130909e1d84e84e8448c952620290d0ab04b0a0a36c5e3b69d6b8d293581c21a4c790b42f451534080d00b4476e04da3dd4f3d401800254861df492035a4ea44007b4d9f48f21dcc69b09000093d6c26f0f02b2c9d80854b973693353b769808120e1b0768c8abf65177feb286bad854031a2705a0000db0800655103b3d84e1ec26c561340b9a0befca9c4c0f58b5db811060e8042018020080000223c23f429afe383d846035880b984973c9816b30310012060f004382ec81735080994bfc8a1838b2bd84011860f00400002908000c710990d60413d32590702eb2c77de50040a14d58101d79a3b3e00120c100040000374f053225ce0860b599f40c011080f00430226e084a028102b8366528019964062080b73af3f7009040800200001b242603412e1200019b212c3b08d09c00dc2c0dd4c01b5708110088407802012a0309401c04004011810a3e9f4e60103375aa1602c40ea80011880f004000029cf8163022270022203e00809301800034100016721242a091150480880009a48478cc23827c1474de099860daf637708a01f5382f02080b8c368c20000090a08402011a1be287ee6d67900c5b399a8a2860180c600101bdcaac358a006e4f38340251021008403114d9f141a107c0aeb284064023d7785803a4adf48080876a70b78202dd87f8a0026102100800009c190e58eb8f40fdf4b7d70d14eea7285b08f6c249c948291cdebeeb44ef30ec66d75448ce0bb9532b67912028209120fd9e4a1732e78b997b5106dc15e258e2c0332c89ec60b9ef69d7ca547c7e7cc9328bc1b1801682acff97937b415faf168361732ef27b4a048a653bed6d889791bf4eb4c0f31190a920a4d0f60000f5884604c17c25017da708c2a2096f559e30a0876ed24ea003e2180371a039d6ee158e04d65af9b80004c40400100001393a18003f875081105c28ea8a0972b456e080efc066f68a0100ef289012861000434303ddafe73423628c40f101b2c72bff18083cda4300809d6a257504039efe1eb0260c20008000097908b0948635e4448c735297b2df37517cc551f49fb2772842175dcc330b4059b09f86188cb2d872e781020bcdb54a2e2751c7cf90a0004fa78b0563e01e84206052e6dc17ba7594f4dfe603d75e2dc08109ff15df066bfdf5087badb0a173149b949339a925287db1efd871ebfa1186609179e27f80050e37e7e8f3aa297e23eec76b50276a0f891a24a227013042d1d5cd5b462bda8b40bbc6fd52022810d037675c75784fc3437622e5266f60519bcb8817451968e26cad3d0e86224882008a018002fa108909f105f9ad7641010bcaebbd408207fa5597200270912d1a6804d054d7b0a04f87f76e00004c384401000014321101a0009f9210e3a0011f420682a001321210c6b02609d098879697738e61251e1eb8204a1c2ad0ecdfb16865e5bcb146d53c0a0c010d251c0ca8447f6dcec3d8c19ffac80f607a34f9ec5b30987ae8d402006fccfb6cfef08f76f82c96df69e7c6b240cd0b114c77adec6d655aa06022ed9d321754597ac25d19b007b42a6a73c7b782b2c5768f4216b83820000004dbf181d199651e03dd4ae96650521c0b6c1e5c683672be2288af074c33465d5456fd546cdec7fc4523ae04572d73cece057b7732099fd1140617e815338891851d7a2c7b26c9ca262c99be6f8986f42206f17c0001984c040a5928c1c308292f5c0484155946d1cf2c003bdbddf21004977b6681000a8e1180238574a448185037188fab8201f52a3124008c607c02010a020000c23842831b1122c87fb01d8eaf46b0efe65da8cfeaec63ec98abe96ef68d1eafee6f20436874b3e4733ca99950cd73157cebbf6f3cceaab8fc9b94cec0000000000000000010a025476b49a40b1a0ef6e639102df71a87ed8bb95222825f4385b15c3e870b62b42652841c11801000033eddfb371992a9e2d32a51686e04b49d8f632612e9396000fae53bfd5e56c47d0721b4ca364f4328c18727d71a2c5f220cc9fa9bf87dda0d4f19391753dbb36120462ac249717b9266b029b032aaaabf2a6212941dde1e94a3b478fa81dabcd0862d6ba000d204210941063a0821d01c8e8204640e22306b0d04006c00252481d80800ad5883f82eafbe95d09dacc9031852b4610db17bddc396239bbb576e1d7000000000000000000884a6ac0a45b918f8fa13e2e71c2c70bfef0e682dec1288624d000000000000000002105a6a3821d4816638c28a382380200180000200a92af11fb737d2aaf038fa10f315e6de7f9ee04b26a492e9727357e28c2966617165565ec0835c37c03f19caf0d5b4925cd434a15476fda6b269ee2c2eb6603117569b8d035ddea3d7f2e1f66b2a9d23540015208239cc11417607adb27af3974e8ca5e3e65f290a7a2d162367000b86a7d6fe342fc52d3978e07689e0720a00279188a90e79e0a4d53895491e2a872a61801ff712c398f884599a0f0bff6798ddbec839b887c38ac26fafa0372bca94f8b5149ffc45813d4e2848a9cda7e479ff16f795744876ca200625ee5086b83b62724508cd2590617a2a9cbb68855420011b190882c2275e2e39bced3b5d553a03ab93287d0e02e39af2536b9848c805001100e563fd5cb421bec49168d5d0646eac38c145d1a3c604c651f960d55ce903f5ddfcb5c2024ffda)) <<< 16000) + 0x01dceaff93b4fafd887ece8cb5614bc804d2dae478cec9b35e5e8bf7b9a5bfae66d4c87cf2c0037a9dbf2c38166540898990d83c5d996647c2281c1261844dca5999a351af63c5967f9942c4163865050c7a50c523a1a220c340924778c48022690d598000012961100430c2e68185058e55eb800ca02f12e5d0800813241f0046100b69c472208e85a99c8220039b00790900dcb817a60004838420108060080201f8060da02e3ae3ba30444927fcda2303403187b38192030a091f54009050840200001be41f4340002b640e0540004dc41f0540006a241ecb60f4420332183c8ec1d427409cd4edac1d78a3e176aaa3c81245de4fb6957a5218a88abf370d71bbb412a293921d81b6e9d66e651e131560d475ee6025f4b53c642ee06017d4a2ae344f671d9a2671dc825423209496b1600f6fd44ae60bd45cd6e9312e1e7cae65f938e5bb647c64ca34550361fdbbfc603af28a08002d7c0589a7315162d4462fcbf4b53291d5cc7f6051ed4a2ebcbd278b40ff4eedf7c1eae746d32347699d5ac3c2da297b80b29db554201fc06d3b3a069b97850dfef73f950aa4b0dc4b6eb47b880473e42d86cb2358daf143efa6662de9d0ab5a5b4761fdffd1642471e819333da055f4943ab3488debbc6c48da1313ea0a64994d3792cdffd928a7c18dcbd54fa7b542a70cff96a36aa806093b0e14d92b487c838235b6654783e71ac718a04743289b100967b735710004026683e0080000bb20f02a0770d03b00800274cd0e032e2c96301af600a15a320c2100403a80f80f71161b5a242204201000005620e82a073110390880e0440e2220700d0378481b8240da1306c090358481a8140d20a0002172072020011273078d5a2073258f7fa25e64a44fbeaa0e9b11104c07457b4410dd085ed965452e7fee7bf2abfc121910b9a233592dc2c510948083dbec2c5afa676508e1fbe354a980000000000000000008c66bebb9fca905b50cc382b1a28000000001120e18618c00400000005c595293202a1ca6646ea11683d0f6dc50e67db0704ca454d0975b75c16a1edfb27cb4596e301db872a0af65718e004026fbbd224bd0e1bc14056d468e31535cd1e950a7e0febe8903b02421ae13c9bdf328b67393b1e9d9b4118a2c14b315d73f63dbad2f8b0e61eab19f2f2f04c076a20ab1facf9dd71a7a6f15161acafc40030039cb4576e2f819155c551a000f4041a0277a26827fa084c2334c14ee95fa97fead173d265e95e3fb8df22a4000000000000000000476b2b892095728d11d7e56605ad046ab3f7e0f4084b6097064cb800000000000000000114683bdb98e440b7dc6a1fb62ee5488a097d0e16c570fa1c2d8ad0990918608804400300400500140259dad92d4eb37483af74e74511aead3d381dc87fa2da14d8a550a150ee518f47822d048989735cb099873865669c2bfb6b25fc5d950ff13d57732b34b12487e70caac865032b5c9ff82091acdc662b25e249fb4d8b7e6c6f43acb7d430789a55d895ae80034f1002881200de08688c77d9526e0130e5d17759de64c39569fd58163ce77f6d94bad0000000000000000000906ad803c09a8b0d8a56daac05b736aff58a81695e4d6c6ff8e74000000000000000002210818608c0020002fffe02a4ff6a621e51ded085fb83d96ec3c7ff0960fce9d3c3f8b926aee21fa9e22b671c004208018ed88226857fb8ab9da02c9642e61fe742f6d1095026e08473334983df1ff476f9e0495812e0c0a123c014c3dbc8454637efb068d9a7556643ad2e2fa7153a1973ac42e76f3cb9db6132bf11a9dc080cb7f2840d8ff6e74c8a892b8949685794ce6c07b9af99e3c6f14aa70f3f23fe5b5676a3299229419c04000f0a401e6b08055b69c21418d8891643fdb0850636224590ff596ef68d1eafee6f1e5bbda347abfb9bc810b800222031831420c20c11801401004694af1355f2076c5a789ba84e953d803ad0333298cb21b9e012683f1bd7726aa3e1954c95ccaebb9cd2a48bb21d017c4ec9882748dbe413d67eeb418305bb7ae3ec62d4a11cbdd1a8caa43049294c32b5cf15fcd46194f8f44283082327df1c1f60d78815b9f565979060a6a0ff03cf75311aba052feee54804029e5473f0613392f897b0f6f1424000036217238ab3bca843209dd4b4a9e42b99e57c5755ef534ce46306f138033088000fac8329ac190a60be4bc21418d8891643fdb0850636224590ff596ef68d1eafee6f1e5bbda347abfb9bc810a0c0013ff9148718731852b4610db17bddd67dbf9c7ea526a6480000000000000000044e0008c90c60c508308500100040dcb9e2eab448875dc8d2e4d4d23ac5d75c4e668928bd03dab5c5358224a5d7385e87fee6be110e4bad9f868a85a169c77398822acf39c5e263a10732eb9fc5e2b1a25dae293ea1cc724c83dc21418d8891643fdb0850636224590ff596ef68d1eafee6f1e5bbda347abfb9bc810b6ac36cf0dc1da6906bea0158066e058c3283ba2b7f921d528e42121d528e4109cc90c80c60c6085082040f676bebafee55591f7c1d782526b3b5008b9393fe4dc085d384dccf42d4c8648e2200110c4dcc9d1ae1a69e49ff212dec5ef759e4bdff91636e893fc3b4b9f887b0bb1c851e340012688319ec048d60013a641881701fa27b74043061a85e1ba0610285f765a3024c5c6f0306099901d5921028ac8769f8c0049bf1424000084e584401080e12e9035b881017483e57141010da1e721821c6828ef020507564b2688002b7969a700004262c230080000a8901225030928180840be43c2)) <<< 16000) + 0x1418d8891643fdb0850636224590ff596ef68d1eafee6f1e5bbda347abfb9bc810b6ac36cf0dc1da6906bea015a2d3fd27a3402fe00ef4806ad358cc46a5c4e45b09d65281c3dc05ce46258985800000000000000000447c30789254302d491071070850000400dd7fef24a441e1edff70f4430655d31a0e36a73ff83efe4e3e1a5f9d870cef1df54ef137fea844e6f6d8ecc285a45eef9a9db0356ee8fe35e26e899715ee513f1cf2573979fd6b1377aac4f0de27ae4afcf031dc3f4932fe86adaa75c21418d8891643fdb0850636224590ff596ef68d1eafee6f1e5bbda347abfb9bc810b6ac36cf0dc1da6906bea015a2d3fd27a3402f0b3ab6721a40b42872852052c220010522cad8e683377e4e4b341ee7f7531187b2894138730c65e05026dd10e9e371a965170178e56ada0823565586dc30bc12f169b21250fad84db0524f1346d0b3e853c67821784cf59d58d6db246af35aaedbd1045e4bd971148068950a32bef79b383c068b9b1d28b06cfb1727abf7205395102f1d92a3085947d5ccafe27b2f50fedafd721758247b3fc1865eaa2840329a5af2aa6095c9c5ec6d966a62774c161121a3c32b4cb161b01c2150668ac027b9de16065c43518ac1892c120daafc3c522b6ff4459ec05f85b4387a9ad161980010642bc020bde1b1dc89de5bce2216894971ed3f794bd801281075f60b6ebe926c02213fc3c6e40e24a610bf61e3e6c7c068372ba3541d4692e013b196cd62acc5eb54f7028556a23a5e980a9ce41c30c7b7ffd4250b737e066f364588c95f55d0000f4c4178340ba1205c01000608902239f121b13fcd35dcf6bbb8c96300143bd7142f6e0504018ec1fb3ff8a431e83e3864aa15380502001c21181896362563f34923471568307f647a3a7120dc0a0ed01b2a2a9410cd3a0e755cb5381e6ac500a3e99bfc6a6ece33871937bf8574102c5d5c1807a5a8ad306d2d4c5dd4735654a6802ba40bb0000001e354d81fb542d3d629190e988340d3ccb53445b01e8a2d795327888b65f41ea4d8e2447114388937a3e6dca13d69b87561640602435b6e000410ac57ca431140137dbb7388c8013c7671f05430000608f3d00001039c2ead233443b94148102c5002dc6c00a1629ac215e205002dc6c00a1013775f942c10044aa200104005b8d8000100b1411002000052082f068174240b80200037920010fc4006be882d8c816824003cf04164a400402898de149d44d3e912689a7d224ea110d84208dbc1c398b3400bfd46d43ae28db903de24dbc147df8672bf3276c5a83fd9f2462800000000000000000000000000000000000000000000000000019eaa3ad25d0d40b41851c11812001800c49965c1619fd626a0ebf1dc3ec843d67e16d7df9facbaa770d0ddb18e2fbce2014af6ae7c01f6e29fdf2e02ad007df19efa3446a12ae04c6b4238b5572c9470858ad7c7c2e5955033b0051be4c39254fd62da519564ead5475a4ba1a816248c38c48838838420210248038064100401bc61e19aa568e2453ad912470b88ad42be103196123fa100dfeff489928210804000040c82c02815c140ac0a0550500011e10541d8298ec148560a21b0500d02786f0a1b560bd7060f280007684003078c7c60c02a9b6de8e0803023c5d0880012921100430a0f4bfeda0c180d640dda28201475cb6860fff3d3f6e180c4ec4b3988004a404401004e01000095904d1d0260c812c2400053a41281609203a0d4fbe5dc9dc666b51b528e4e94c9af2328ef8e8c91013a8e5a5cdb7378ba5f61d2257cc28ba32480dc5e638155cd24dbea292199255e73c06eb7b7fbb75d91d405000315619f7630bd9241d7ae348eccc5213e3c161206009f1280ff9355340f8b0530ca3f79b645f666ca2a00100432d6b907aee3141e197e7d13cee31a1e02240492d14b9d7298ebbf906364a490b93f9f5f0729c519040054440280a0004f420906a0472d8230cc11417363f36029f227da33b8b87bff808f006a609006798a73e1ba10bdb2ca8a5cffdda0095fd8246b2b892095728d11d7e56605ad046ab3f7e0f4084b6097064cb800000000000000000114f03f37c6b1e62c03532037cc5917e789df47f11e1b6b04564ce000000000000000000450b0094c1490880870000a0baa71bbca9524494ad934cc18556652b08c043815c56e3d07f89f69acdcb384a0d2a566bb113a7677c28b30c041b67966aa4ece33f36b6d3e44b38791c84b13c38816e1fea3164a2a07c00b491448052bc370fdf96c4256551ed06bb34030a27e12f77170f7ffdae6d5188236f70ae363bcf9d89f7b948ee4e5d3a61a7dcd7fbbc85c1c534e80000000000000000011501b2b0fb9f2e6dc94a4756bd032f8e05f4005078941b0274d800000000000000000434b9a259919902d0d2491460cb00900012297df2ab67793e1527e56f3af429ddb86f7fbe16123e0c55b44419d060b65ed2eab9f90372c86de3177bb24236f697c9b8a31e441a03d7d96ed1384ef398054602c8718a2a296f11660a8e9a233686a2ee0372284775aab9f30011e6a228040d9c13a610024142000858e184c97da58bd5b8a69a40b0fa421c028409ae2d1850003b70754080295b1cb204c184001004401f0c1d912eb860d793c7b0648d045ad9e86822303dede600eb2a6af404a1840010e18699760e13060cd6705f8918be20ec1f2800b176c6b06027d601acd0250c22008000086900022b200071440e04400092a40d0440014fc410ca60843b0411982004f0835bbdbd346ee59504c04c4085a72ce4f1d73b9e753d58c07)) <<< 16000) + 0x3a549d02596b5a572d5e0e080ecd84a27f392b6b97c728021ed64cf4d53a9acce612480e0f219b39a6b1670e04548022a864e3932119ca3db85a002162e25e7eda53b314a10e86d9d3b24fc84eb37c18ddc1a4fa75d9499ca14c331f657d6808e40b80951dad26902d71fa9450377de3e2ee264157dc6a1fb62ee5488a097d0e16c570fa1c2d8ad0990808508c047042010013aeeb38ddf5d3b9e3d4c4177c1f3c94d31fff25db52b154edce3eb8801e1184270fbf908a5169629ba94569254000c7c81f8880f83407a0200071e20787b03b1960a57f42c6e38034e590961014f742ca22000046584001080c832aa0524040aecaeaa2c07418a94594007f9f33b0302c43e058820004a48420109115e35846408946e9ea2409b0e15d08046303a01003a0501c80b45184dc0fc50a77e19b7ce02b71fd1a880118e0f80422006b60f562801f0efea2181aa0623bc23081f00840200401000004440e03606e0b8193ccc5bb185b59b532c515416bb68008c407802006c020000bc206a2b0001fa200058a4000ec881a0880013d88158cc098272203ba2a572bd5cd2a36843c68f60354c6e86e3b7057a18dad428c04895a7f07ad86c75f438713e6b5f3c3ea8d61ff5c866fe5bbaa203a784ffcb0acede2c3a75c713bd15667948ce544e356c2df3ee002fde46ca22d76d8cacd0d12dc492ca807a40aa374a509dd4d7c1e1039ce0517ae8edabd9e8b70ddf1c50eb077eb62718e6495400a82701e3d4398466f466e47aceae8bad4626ddd87985830404ac071338eeed378b8edaef815fc8af1e49701c02d61a248eb91b46eacd7ce9e8ddd8a0cf566158400059831b5edc4a7eb94bda0e7f89ab8f2cc79020001da8d7efbc35ee798fc620a6af126319d443eb827a855c35a9efe6385111a71e896ede2104d0f60000f6c8198e80a03404c0a0320101180800224c8091680c444001d9c7041cb503d2981e1288b74bc92860861f740ff5b9afc054276e4a3815b24f2316ffabc909abd5e68c030ae6e968c92e4aa99ce44ba80e6fa42a5195015a424bf450087f4e287cf0b1f397e6ddf45325300ca6a5eff912102f07c385395100da12186ef62b008a9a5c9b6b1ac582fb66fd36d4dc149a6adfb24245424d318a5c51f5bf1d3c9015fbff1dcb7a4f8a000364c0245f3594d1c21a728a5e6cc1b00c90bf08043c3f68b32977f4b085a44ce044cbba0a9ce055d469c0d8102d9948f006c316e8a3de034d2c2526f244c1969e5a0afab7dd2bd131bf1fd18c35951f60e182ac7212b2ec0d889a0852672788e7ce4083b80e7b4c6ce97eb7b42ff48de22f9e98dc66326640c34fddd3490169c68212e6cadde96362c1d8c6c208458ebb10ec52d400c004000cc240bc960243b01e1100e8880b8340341a0190900b8280581400141240b41704809e1548870040e2995900002224220084080040100580200003720563302609c040040100540bc08cadbc1980108a1080400001588148880a02404e120260501280808c0400024c702868960c2a69a734c07accc9afbe9460bbb5af4ae113d5570870b03da312f26c63793e47ac1d2a1cbd74c78e883325ab442c685f920f9688cafc24bdf851800017fc8395d47ff2666c2a7893408ed401c22da953db4be93ebfe28a70e3a08043188931a1c07bbc72d7bd24fcb7cc91460e83f9e2ec32e9c8d08dd7d37ef74650866d80333eaf8a920fe5b0b82ebc7f94854092dda5cf48823eef2e756afc3b89946391930022034ddbced0e0c147b6ee07f783948febb650425bdce7080872c37b846063e2b58a8202607d060c10008c9080020048020230100007090223100037d90122d010968080a501970b742f66a62a59e367e744f191c6103565815d4c7655438819188c1f9a622ec43ba30e66f1bf9e6a6d8ab521f0372f63e1546fb50b3c6f5b8ac04018acfecec3f3ae9de8cdab272a3140f5f0fa2c2cf151e27a359be48d83b3e0831557836845cf6edeae2702fd0d0046ab5ba7c926e7e181b211e37a5159b1d78809f8c2e6cb09fd0bcd4510d0f70e500fee0aef041e3eaff9dc09f6296ce97dee35d0627c8236346c4e515fb6ec3c8e99ffcbdaec64c2003d439878fdb67e5d9d78e40779f5b2c992b3517ca93d2e125bf59df9bf5e75213c58642823e261fdb770cb6961894a8bdff279283ca828f90eeab76007c2403c0a01d0500e02806c140340a0190500c02805c1402c0a000851202a320140900091b1004451200aa56617c3844ba43b083ca1467fa52358199cbe63cffa20dccf34aac0000000000000000008ab9094cfc21aa4bb8cdd407d87cdf5b18053512b61c3bb3b126c0000000000000000000000000000000000000000000000000003310c20e18e10c10a1060880002025ca00401bc55d59c9fb28e1c5ffab677c60c00b71b0000828c18a1e58180207edf99d0a0000b71b00040061e2ce65a08138c128042e42533f086a92ee337501f61f37d6c6014d44ad870eecec49b0000000000000000000000000000000000000000000000000000cc238e38a3863063042842040820838180100680011990131d8090cc0442400082040401745eb46bba38076123cf40475bdb428600917144bf769229deaeecf89c50502f4bd7a0346ea91fbde088ae8808003305d73dcdb72064cd92c00004000660bae7b9b6e40c99b2580108129dd76a0f688b5c51232385828eab8dd58a5d404890b19c42001e12000325201c5a00d1d0060e802c54014220091100408801c4400c02005010005cf90044d0018c80085400202000010048ac9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 31 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case16" = "QuadHeightCover12Case16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 31 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case16 private def zz2376:"s0948"="s0948":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l14 l15 l16 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l31 l33 l35 l37 l4 l41 l42 l43 l44 l45 l46 l51 l56 l57 l58 l59 l62 l63 l64 l65 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x6c4f12fa0, -0x59514ba00, -0x5ea5cd9b2,0x23fd16674], ![-0x59514ba00, -0x327aafad80,0x645c7587c,0x5328eee30], ![-0x5ea5cd9b2,0x645c7587c, -0x24458b6bed,0x597f125f4], ![0x23fd16674,0x5328eee30,0x597f125f4, -0x2cb417800]] noncomputable def hinges:Hinges:=[(6,l4),(0x198f57bd,l8),(-0x4428e9f,l11),(-0x8851d46,l10),(0x1a30432e4,l14),(0x1431e8146,l13),(-0x2d11162ac,l12),(-0x17fc9e196,l17),(0x3d895d2c4,l16),(0x3ae4f4484,l15),(0x279e4fba,l21),(0x1d4abc1f2,l20),(0x94ada62,l23),(0xc2d94abe,l22),(-0x2cb417800,l27),(-0x6e4dcbea,l28),(0x2cb417800,l29),(-0x16fa52684,l25),(0x20e2f8d8,l31),(0x165561bb6,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x1e9309be,l43),(-0xcccdfcf2,l42),(0x161cc55de,l41),(-0x770e8634,l46),(0x252b015fa,l45),(-0x2f8851d8c,l44),(0x2cb417800,l51),(-0xeb8331b2,l57),(0x18d35fbb8,l56),(-0x82032bc2,l59),(0x1662e15be,l58),(-0xe993b890,l63),(-0x157d32b22,l62),(0x2633e0c6,l65),(0x70666e5c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x3d895d2c4,l16),(0x1a30432e4,l14),(-0x17fc9e196,l17),(-0xeb8331b2,l57),(-0x16fa52684,l25),(-0xe993b890,l63),(0x165561bb6,l30),(-0x157d32b22,l62),(0x252b015fa,l45),(0x1d4abc1f2,l20),(0x3ae4f4484,l15),(0x18d35fbb8,l56),(-0x82032bc2,l59),(0x1662e15be,l58),(-0x2f8851d8c,l44),(0x1431e8146,l13),(-0x2d11162ac,l12),(-0x6e4dcbea,l28),(-0x770e8634,l46),(-0xcccdfcf2,l42),(0x70666e5c,l64),(0xc2d94abe,l22),(0x161cc55de,l41),(0x279e4fba,l21),(0x2633e0c6,l65),(0x20e2f8d8,l31),(-0x1e9309be,l43),(0x94ada62,l23),(0x198f57bd,l8),(-0x8851d46,l10),(-0x4428e9f,l11),(6,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x3846080c9180a00000007231036300c0000000c4520286018000000309040b0c03000000061208061806003a458025014c4014000000c22880d86023ad162020404cc100703922a809a01d8200c076c5b011c06b0401800718ac05e02a080280000000191503cc02000000002a0c03980400000638a7024c301400000c514a049860280000000000501c8020000042190500a20060001043105806c4010000000000068124010000000e09050150020000000210881218060000000038240b300800000f854140288018000000d4210218c040000000210880b18060000004108408c301000000d84414028801800001d09828051003000003e110701a200600000003e15026300c0000000007060660080000000e85004cc030000001d84e043180800000003611022300c0041861082055e80280004c0d024027d00400000461908806a00600010c3108406f4010000210721381b28020000000c41600ecc040000000000018190020000003604c07b3010000000680900366020000000c81101acc040000000000068190020000005c34140a40080002b0480b013a8020000001341200c4c040000a41502401ea0080001342304803240100002a04e0a00da80200004d0841200c90040014415c110036a00a050829010800cd40180a20508220031a803000a60a209804b50050000b81403802ea00800000000026009200c00000000001206400800000001109018c0200000000001c02900400000000442c06300800000000038012401800000000012014802,0x1443886200ca0080000000000a4072008000418e230812c802000000001909024c020000086391880f20060002246e0a001a4010000418d01300f480200006110434022100400000004a1481f18060000000005850330040000001285201c601800000000001c0c80100000863a05017200600000000058903300400760c91020238802800000016894050c030000000291080a180600000005623014300c0000000a442068601800000010864058c0300000000241c03980400000004e1f016300c0000000943a04c60180000017110a0290020000a218848044200800000000058303300400660a90c20238802800000010864050c030000000230d80a180600000004219034300c000000a20b00766020000001581301ecc040000a61c042029a0080000005404801b3010000000a40880d66020000000c4110320c040000000000420310040000000054140630080000000000680e4010012120210c04ed005000102308680662008000000006454073008008088208e03fc802801011c208c04c9005002023841181b9200a070464c49007a44019c68c7c44804290803b8518b889005521007000000000342819802000000000487033004000000009028126010000711442403310040000084210480ba006000000007c2c0a30080000000000a80c4010000000288c80dcc03000000498620651808000000930c402a30100000000c45206860181d21650d40197500603b62d218202eea00c0038c5586d013d401400778ba0ce043a802b8d18f8490085b1007,0xe81a04203c20080000002105003c30100000000441401860180000321584c03d0030000ea1884205520080049081821030e40140000000001201a40180007a15411006900473a3080f38045da00e0001c8430c401b4010000000aa088034602000e51041cc042d00572c3020e3004dda00e00000000002407200800000001a8681260100000000150a024c0200000000421405980400000094542407400800a912211402fa80280009120433026500400000000004a07100400000000000b0320040000000001280c40100000024c320248c0400000000003402900400000000681c0530080000001849201a60180000000001902480200000000340a059804000000000044072008000490a824815e80200009215044017d0040024a41437812da00a000000006c480b300800909010c60276802801242081b004ed005048e40c10405ad200c0049c83042027a40141008e984f01248803000e210808c0ed90050000e43102c04ca00800000000482409300800000000a890166014201cb020402719007001ca314178099200a00000064442407400800708c1046026480280000391882c079003001c23041181b9200a004187084300f4401400000c114203246028000000188a40d8c0300000028882036180800000000005409200800000000003206400801211c23100c410050000000002a00590060000000000840e20080000000078481c6010000b32082103f90040000004986200c98080000000b23a037300c00000000000a064008000a21c43102a5004,0x1a1203180400000078342406400800000c10c40472602800001861980d64c050000002884403f980800000f4240a013400c00001f8441201680180141182220024d0050000003a120a03a00400000f0220900b400c0000000005060660080000290c82c0b9003001421841480b9200a000000000024092008000000000980164018000611442401a1004000000001c140798040000000004500a200c0000000001180c40100000000001d01c8020000000001e00590060000000003f00b200c0000000007a02640180000002088409cc030204186104042ba00c002203604802374014004306908c01ee802800820c6108055d00500000621908806a00600404708660252401400000000e8481a6010000001d0d0902d00200000741d09005a00600020c490c802540100000188a418068801800000014884088c0300000000341e0318040000000681b00a300c0000008210809c60229d104039c022ed00752c202063004dda00e0000000000740e2008000000000f120660080000000001d01880200000003b11015180600000ec440a02a400c00028886130110802000a208808c0ed9005000000002c16029804000160330a40284010005806309200908028000580cc2902a1004000002043080c9180a00000004219036300c004c06107e032080281421030c20245d00600000002b0a005180600184220230198401400000c848120488018006509008c06610050000781083404e20080000000000240620080000000000280c40100003c0841400f1004,0xc80e90060000000001a00d200c00000000090a06600800001020a002c4c050000002982806d98080000005105408b3010000000a60f805660200000017015022cc040000002c82203598080000043867019230140000008218807260200000014c1400acc0400000214328069180a000000440d003930100000061082049860280000000090503cc020000001a83a06218080001182104403940100002606a0e81908020000430881201a50040000881a83a064200800013c210440394010004c04104200d280280095084088032500500000026120a07a0040000000028180f300800000000783814601000a110a1b00361005038e30c08405ad200c0039c63022027a401400000a10840472602800001461180d64c050000002082403f98080001c86314807a401000000007850606800800a10cc13c01f5005001441b020806ea00a0000064260e014400c00000000012816401000000000004c0c8010000000000320590040021433858005040140000000048280c601000810d6160054100500008219850014200800408718c2022a4014000410e63100f480200000290d0240f90030000000001e80510060000003424140740080000000000f80c40100000000001901c8020000000001a00590060000000003700b200c0000000006a0264018000001041600ecc04000000210220359808040830c20809174019c408401480199680381831190df033c900600000000220c03980400000003c38503400400001e06422014801818311404100ac1006,0x2241220a201d7200c00214230260137401400000000a8881e601000a80c20bc02410050000c8108220172008000005688100d83014000000aa2280d8602000001622140360c0500012a2486601da00800000000984c0530080004b88c1e80568020012a12419808ad00583a3040ef805e4a00e080470444801aa4018000488881a80b680200009913831032d0040000082220f812a00600025c460c802b401000830820ec02728028000000000240308030000000622081a98060000000000b4092008000001c60c804460200000000001102480200000094522405a00400000000a43807300800000000151e06600830428614d0219500600000e25219007a007640930234012ff401c0006090821017480200000000000903880200000000621a069804000018c842101d400c00000000191e0660082812120dc021890060000000000620310040003048410801a401000000018c740546018000c32083603690040000005e342a05a0040000000520a015300c000000a20900fe602000e11821e006490050000e23086c01ca008003946286c00d240140000000000501a40100000000009c0348030000000001181290060000000002101d200c0000000004401a401e182920cd002f75007002c64c059017d200a000000d3148092301000002d8b43404e801801432042b40be5005001c23044180cda00a003906208c02bb401400738c712a07b680281c518510f0216d00600000284408126180a0000000000640620080000000003e01a40180000000006c094803,0x2922ec2200aaa00a005185904500554014000001224080506020000064108240c90030000000000260490040000000104140730080000001c41602860180000000000540c80100000000003a0690040000000094180530080000002047206860180000000008408c80300000000541e05980400001288413025400c1c11618ef8183280300000722d8e40750030038859876015ca00a0e08c0c5340926401800000000002206400800000351509039002000000007a0e0518040000000000e40e2008000000144920446018000c32909401e90040001825192604d20080000000000440e20080000000000880c40100000000390e038c020000000000720310040000000001100d200c0000000138701c6010012f10c1a806d1005000000408e2014180800000000e8440b3008000001a60c8022602000000031044084c030000000000620490040000000c411031300c000000000128124010000e22cc93026d0040000000812c806980600034cac15406e40101a21630c6810ca803000000000003c0c80100000000006a07100400000009241022300c000599284200f48020000b124c83026900400000000001a07100400000000d4440d30080000000000680c40102c125211c0218900600000000006a0310040002448311808840100000148942c048801800c114218c066d005001581842881a6200a0000003109402c301000620a40d80576802800c714e1d40f6d005030a28a19e042da00c0028c3084103d5401408104382380b5c803010c093053028b9006,0xc81e900600000000019015200c0000000003601a4018000000000c40f48030000000001a00e900600000000031015200c0000001248206860180000000013404c8030000000002780590060000000000940720080000000000f00a40100000000002d0388020000000001a805100600000000006c0620080000000000c81c4010000000d02500e4c040000000001b80990060000000000680720080000000006a01640180000000068004c80400000000002c0290040000000058480730080000000b04202660180000001509402cc0300000029090009980800000005827013300c00000000b0880a6010000000000b00248030000000001b00490060000000640900c300c0000000c81603860180000001b84402cc030000000034120318040000000064240730080000000d02201c601800001a01040098c050000003504200b18080002243306005f40100000000e42e02a6018000001d0230214c0400000003b0881a98060001f02905409a40100000008619815c60200000001086403cc03000000003e0a06980400000007212015300c0000008218811c60200007e08c15036900400000000003a04900400000000a4140a3008000528a60a015e802000000000260c0cc0100012a2182a027a008000000984c180740080004a8980a803e8020000811c42802a1004000000005a3204980400000000b8140d3008000001023881506020000002d190501d0020000003a340a05a0040000000000540d20080000000188501c60100000611d048039003,0xc888126010000000000240b0803000000002a1a0798040b08a0c57c0c1940180000000002081c401028c25218d0169d0060000000003280990060000000006700b200c0000000001880e40100000000019002c80300000000000e81900200488818a501bc40140004b11228817c80200000000002e0148020000000002e80510060000000000b40620080000000001780c4010000931f06302ad0040000000311480b18060038c5b083028b40140000000642202c60180000001c8c4058c030014a19c2280bea00a002c439051029d40140000000088780a60100000000000f0148020000000250480598060000000440900e300c0000009008802c602000000138110058c04000004a1304805a0060000000001e009200c00000108f0c814801000000001d19028c0200000823b1901320060000003308c0ae30100000000642201e6018000000c4210238c040000001884203618080002885310c0484010007904505a03188028000000941d0318c040000ec1283a066200800000000b8640530080000000001881c40100000000011404c803000000000238059006000000000084072008000000000880164018000000001700e08040000000002603c1008000000000540182010000000000880b0402000000000070074803], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((((((((0x79cbd546bd8523402d5731d206d7e74632f3cd0d6e4a90a80e0a9ef7b74f1861d04a7b1a000a5cb10127042300840f56b9f5a0a89d6077e371902c0413868222402906c7794072cb0fcd8688211b215ce8e0006ce6308ce004601099e002255101a079d98daaba899c0022550fea274231a4fda081610a513298224040fc3bd4080e4040f569e2200a07ded5e190004c0200001b420006746268011e1a300071a6a3189c29b1e6497fe8defdc7181120b008a11248296ac4913478c13a14bcc41222803dc62e63e70a0424e8f785e44001501000140446a0200020224680b16c01f9a33f96171bc4454b15014966a234c1634fc277008557dfcc80d1652058012c5ea2e773f98cf7a676800e2e824571da66199d5c63538e6e26963b11e9a72bb2a9cf2643491e738702b605e4f9222bdca7935649107f25fa95d18583fd1b52325beb47e4fcb90202a4973043288608cc2446412231050001d81c30ae21247054861671ca2b9aa363ca03ee31441071a5444c55497d38d2026c18117d8860e12172c00bc23c027b3612cfe8920006bf83538f303400168160430044600222f011170088b4044580200027024561bd2cc6958bed73f491e74519d2cb90b285c1ce99eb56240e5543187b5f4e2400a8f53ba2313c5f4b4da2a800c26dbee917deabfc5b94775af0fc0b2463e79a741ee7d4378af457848cc1405f2ceeb912d22400cf1e510e00150283a31bc57e002c6a268aaec3867140890be4a79811a04604540a2290511402889c1444c02225010fa00800106885902f41a2cf581cb4aa47365452e7fec486dad904678fe4bea595353d5aca9a9eae4beebe6010a16b48f6e808877b5c424e1a382216b48f6e848669059050650248040002a3afe87c52f9d7c54bb5cd1f5e6df6d4f23aa4976f2b09c46ad2378b2e2c15e3f3ef241135fd0270e89370a2ff4a4b8297479a850db146f97f4000f708a812c53c9629c4314d09c85c72bf0000000064d97b219c7d0863040160111449641441a1900880840800a205cc00401b70822f5b92ace3265c208bd6e4ab38c96ed0e3c77ea79dab4bb438f1dfa9e76ad421216b48f6e808877b5c424e1a382216b48f6e848469059051068610248040000a8ffc8b85b9f48ebaa4138bcf951a76bdf02f317e6b89351a4b6c816b23065a36656cc24687f24041f1862851b83ddd6d7c3d4067d448e61c46150003e121a86a224350002aa11a22dd8cced04ac55c48d6711c4104c40db9946aa42430a2ba1ffc4c05820ac19df3183809209db80d4200331ee333100002d3c09ce4015302c886a9b28062db9df3797e7442801c000116122311dc208bd6e4ab38c9970822f5b92ace325bb438f1dfa9e76ad2ed0e3c77ea79dab5084d068b3d6072d2a91cd9514b9ffb121b6b6411b1004660e50e48e3841020028ace132b6f025cbbdefec2c05) <<< 16000) + 0xa2e0c6a9db62aad0869abf12a5a87ca52a98972e813e074da7daaf8d2f4a3028d99ec186c4d70123f7a746b3341169b131d7a2d24b2c4d65daf4680973e75742f8502530f94144d1ceca69d6665b84117adc95671932e1045eb72559c64b76871e3bf53ced5a5da1c78efd4f3b56a10b183576a62940b42d691edd0110ef6b8849c3470442d691edd090cc1ca1c70880070001590c0d6f6fa0eca952d1c50f8a07a9745edf10b8731d11710d47bba9d7908064c9ebdf1947cc507ebe8555f3aaafa6a89761b1f7433571d8b06564fd8e0ba80a1669029120b86abd15968f1528e1c920d340ba0eb54370c4899614d3d8d6a000a3e4688b7fbad5dab682c8cdc1245af67c164cc0ae70c6505f09d6bc78000000000000000000000000000000000000000000000000062bab1f14908702c8b189188186147004000053b303c5e1b495f49a4ba2c7ffd0c43ab2baa267c3ab4aaa289d89bfde3a24cb94b7dd64cf815d2dd939e3515437a5948c3295a7816d5daa4eb608ca132041d920c90c883de4fff5e6f9b475cd362419ea497a0e6f60ceada1ef232598f3e8daa000a4042a9044448208a050007d0122131f079924ec9cd2dea5de6e8143734406a5a044248838830820618010000830e36f136edfcaa7d7676b3bc90ae22050d98275d9d59a939a5976d2a2037b21b8a148ce659f174dea01dc118e3876f48ecd87c0c6546a12680015811ad01d0f9d1e39f744665b64b353e3fb1808038882a66a4313f813e07000482778d4994fb42a516e9b4aad014014a98e031b1579d82946fe1c4012601fc422ec3fba1492cf13c2850df2a3da1dd8d429004c7420ce12082633bb0fe3e99cd8ac8729e099dde5e1d22dc27b1e433c26375bf21c9e144286210448e0fe8ff60046de015d74764ec28ee7b76eaf6948eb0bc6df014180c8f42ab641685390b5d5e05fca1edc74c3dce1d3f4064cfeed0400232b03b614e91f648f97d538b16637da1364ae9d0b596743cb0e0034de21c47f9624a428525cd898b1e67cd998febb99676e9beca82216f012be0de2673a5b340044c5478113879c8ef799b733ffcdc540bb3ba0aaf929676a8184fd81aa6b1f0a32d3e7656cf7746523281593ea1bf68283d0d2ddbff1efe9ed7a1777b8851945400005c724401b8a0e5fa7e02656af3feb0322987f65f0b81404be17027c2242d691edd0110ef6b8849c3470442d691edd090cb1881850c30c6015044499399e47f8e64cafacb87c88450e1a513a1f4e3133db6e8856e4c573fabdb5ebe2dba6dbfb3866a3f7e03675f71bdbb0adbbde6cc17b3f90ad61cba4bdea4b7627fd014c2f09ca0007ce41b0a742c257793258fd94b630814d84c3fbd23ae334e038aded751df7a849ea481021c71d60c9e09cf59a04130ccf5ed78641929484002d667aac3c2bfc81618037d1fb37b98d011fd5504536966ec56fad43aac40ef14ce537b56d36d236cced54839c228460000c7cd0e549164502308a07425245febc01830f78035b6a105650f15995aa7c180c5cb58b5435803baa6c2bf6c2e090469bf03ce71bcaac08e1b77b4905011bb8f8987a26c26f83e1a129f0051b5fd618b9d75ccf5e439b88b941bbbcebfecac73154d69bbf21f944500f213d3db83619197af26f4308736db3fa6a0e9e5ca50d2240c1cdad0057bf2483db94c87a3365a0143a74b51764e9784e20e2b3c918c842472ca847be2b45d9d4e87e2a4fc3643089895ba0148c30d13d6cbfe56c700c07eb1ec0dc628f883570f7a2c05660e019b7207550425b6b37e0cbab4a3e5510785a6493fa33ccd0bd97131a3cf24a243b7928c3ef0f98f5b55fdb3294e698d5202b76a8a92bc49cda757037d0f3afbcc69db62ac50de2700004b024401b85ad23dba0221ded71093868e0885ad23dba1209631031210a10c00202a88c3b66cae1bde99142bd32c70168fd00f51579b9925963a1a1c377cbf51250fb3cc5e977fae4d52d5c2abbb6b7b9388bdc9a6c877e1318380a14000af883614f83cc92764e696f52ef3740a1b9a20352d02212852051c51011000c0550851e94e3b76ac63b2030b9c6750a11738fadb26f4a945aec85d0327e070868d1a574b6ed8723b1be50fa7e6362e6ece29596922fff81176387214a8001619000eab243e8221e410f8a0829d043e4721421d0f9888008154860aaf84d5f10cb9ecada74881663d92e9863769a4102a3df4bba5912cfb008bc1d01d11f04d8790aa5e0d43aa241f5392a0268a4b3a08c166842b61464922290577007e3b485da60c7192576d7a48d90f81d00005026070b77589c80c09e2a869d8c28231f63526f8609b0c9a4fee3003fbabdac38a0419b0618a4200394da9e2a802aa2228882572d1210421f312d9d64c7682600c0000ff921d6510e32886d561828321a4190ca0c8603642e0a2160140c33a1ecd68308709de34f70e8d10c14763e250305a1421c0c92325d444024145a1fe7a4880121bd0e8b6c80e0261f18dfbbb71400c6ffb81990aa8a88aa02181b0d9ff092b7ca140bc0c1c62d1c416707138b03d39f27dc25945214b0961f0c2116e488e87b16405b4b3a8023300b372a6df4b23800017d78338321c00ac081c60723548319c5b03e5f41096501741c8cf184bb270fecd1847a06192cb96407e71773690002227a1124e0048010000171206003d2ccaa26277f402c847ac7df2c7a0b1e7f960eb60e228709a82a4767387140e7e0559f85340011d4911744090026910cb5e3f464e8c392542a883841701600007c890a84c688264281321309e1461b1348ff90a1)) <<< 16000) + 0xd6582f049c516304947f4665e286c278a3652a448c129a6c148ac800120be4c5e38600546b1ecadc415c5ae79939226238e15810000078490908c84446420139177700ea614f4205235432b003cc610028395716b81430ba4896c718c8083455645afba18109955278f9bcb01059a39c101645010202585f624e9e94e585c058000204241e4320e19d1068e1969106c40a80705bd115a4880044aa1dc00409a27dadc6e3a3882cbda5220003824337ec9e89818000cafe516ae08034cbbd9c87a8a82201808382c02400010210c2398609ac2f88617a0390b8e57ec9b2f64338fa10c60804b24918914814b0080030101401ad7584fc3a2263cb900953570baf74440092e1571e85bd9122873959b55f839437b35bfe1e9cc140044aa1dc048a22592b97301410a59d5c5c81200d5dd5efbd04010605e19fd880802219f6660f089106052038b1f02e6cb59fca1a306ba831a47e4182067aa2aafacc6822e28658765e0804449c16c724a14017e220e9831414023252f3dbf700217b72c73ea3e011268b06152e564439417818308cf92a72576b8850e22537e9d1570481c51a1a81a6a17921161c6e902edd82c020064940e26b228023a6eafb20efc1003b426f4e8165806e78c018ef9210063658e48660889533eb46352059b688f519ba816d4d97ea6d6de8607d30f21e5b21379b4dd7dafb9dade9a0b7b644a4201e44a1f19a512494390394010008a05a701585d18730eb4562c765c1b12960bec68fa3f77e12988b4b98246abd99958c6c20c574ac31f73bf37882fb6989318a5a0006ae400168080996c0020289031288142440e0a2080500054418138fe854ee689583d3dc506796b92624bcf788c062801c3c88a23eddc288db0a010356d3a9346c7f914101efac607016b725d3c0173dee5b67f827101854054001515046c4293fdab5d78c944b500890921300002982001d7e4006dec9069cc830964163b90b8e57ec9b2f64338fa10c60804c28b24b18a18b1440c9005010c060080345b0072d19ab9ddf20296539b582a271869661269060e30458048038190001006f18ad15ff32ca11a52f394bac826061302905cc958a1a46c3630108504610a00621442c6183dd22b207fc9a3006c1df436097fd07002e02c0000e0120a05e96eb4b8dbe1a164c61455d2f1b87ded9c6128d8e7975b4325a59026e55e246cc24860f401a8113419d0a58cc3461d4dcaa36c48010e43e9d56452028077de48230d740c1000196716539c060c68e82410e015002e020002af24120a0005bd364b6c32a165ca21eeb7436da50e05e172b7f285af7972b6d12288f8adbc50910e8b3cea8640207d4a1e460400ce29448ab4021280408200440e02206011028080007fc8dc06e47295bba95b10e209222433845e7348a4090c41c55e41b0450c407220128bce732831c22dcc07a61d36928c0000ae9f7bcc000010083d1a6a34083949e8480708390540fa82843c141a80210d0106b008000a109020cc80c462d8232021190082f0a02f8295300a60e616dc82a510b1ef97265eebe18320f42d18dc52c6649fc31a86450ac8f8b6c40c8810c24df177461400c5cf075a000294227a5f458d0105604016c01cb466ae777c80a594e6d60a89e69c61c49a49c41a414318014064000401bc667dc5711391c4b12c1f612c1c401e9f837901a46ea9c0fc59143096bb694388c0a05e33129c8e001f3152d23d1c00a005000032078c1110e127bb750e34bf24425f7f7cba2348951ed18960cec9308429f81b8a51b71307a7b201a0bd65e024515d5b8085dae0b2800b66dd7700a1dc0c03a65f5ab8ba6260800112595786fb74be80c4801c02a005c0400055a47e414000aec70a590d0346e164c1e5623c00b1a429b470aa50c6ecf61f5a2c509bf7925b14298a40c15d490811c19e39a10016ff90463a000940203f0021f7010fb0083c4040003fa4800463fe1b1fe0d8fe86f0a42ab4506b0e60eb9cda3069e4b1c5adcec009616348e844ba4e92852af1983d36a4081f736bf790820466c756bc66940083df5a3c00006e05bf0fe101090305604016c01cb466ae777c80a594e6d60a8a48227a26225a059a48a11e01a064000401b24158639899d8227cf4dba2821144e17ec1805612899259f1cfbdc502fe78fca926f9a48de31f91fc10804cdf0f594ab90e00560400001a932420ff94f19126162913dc034b6d70bb3df51314d8488b0773ad0112c4e7757cfa60477d02eda8ffff2e0cc368d241253bb70cac8e1040415f6e9ccbcce9a8f0027e0df2318a7a28d000af87f3c2ae57c249bc7d200780c8920cc82970a7a113e7a6dd14108a270944a5c83a144c92cf8e7dee2817f3c7e54937cd24598dcabc2c840266f87aca55c87002b0200000d49000485202e0b920dcbfb599544f5bdbeb8d2a2639df3d664102e13e8597d8692012683c131024c5b347cf2400274d9ca8cf00027c6e597400128042481b83b1da3913de1167446889c2ae4e6daf44c6c22d677b205c69552695cd241e9f04ba620501a8c8e1f9c00940200002f2648570b22c7ee144f8b44a35c208899631c0e81c4d02f4b3538f1799a480c02cfbf461027077f678c869000f40957c528f0007c0ac8570e440015810248205e8816d1a27ca932147292270f716d974b226429e289886205d8d307e7959a48542bfd9d2881511d1faa7dd1c00a00500003224000e3086b008001be8eda23d466ea0592d19ab9ddf20296539b582a481c79a79471258e10268058180001006f9b4a738e3b63cc0bda740cb9e5288eeb69c0e2)) <<< 16000) + 0x6acb21dc7a58e1ffdd86b61424deec693c840817c5cf44a700250080000bc11fc010fd8087e8040005d474bf6b137005f67a28d228d5d00a56e910b3084e977f1c836b9d4c1e25a2c4f83c727e24513ececde243938c30852392b4a6f99322800b66dd7700a1dc06001125bea7e5a7660800112595786fb74002fa0304881d02e005c4400059247e4440028f470a5f4542f71964bed5af98f0b1a191243ba450c6d4c261162c514e0293539429752e6982490812f359cd210016022ffde00a040940203f0221f70d0fb0083c40400040a40063808dc0ee47662e4abb81e28a011b3dbf5c0910a3a74a89029026c208c6338924353e5f1b6df24067bc24448f20708f54e0d09e40a0938ec724c6d180002367b88000018d230560401f5190878a83501421a0a0d6050001459074318012f59b26270a9b90280a1d0b65480e47ca15c0c488664449146a99be79ac0911498e0b6760060c4a015170dc080041efad1e000300a497d0bdb0006e05bf0fe0a110105804816c01cb466ae777c80a594e6d60a89a59851849641839630a094010064000401ba5ca8d7b5cb6bd061400c2e49e00c1984cb8b6e46107c859004441f12e61e183c8179061e862e58ce895c634a1ed0a0b29dccc17f0b53881c00c80f00003c070a5f27ba5f7803c0593e9f8c4be9d5120b2053f42c3eb6704963468b1f0ea238f52865643323c94ee5450a52f237489ce7507108d428ccf45ad110004a52ad1aaec9c08000df8b2adfc369367312006e0a00170100015191f4050002de1a215c443b2e848ef9740334e24624fb025fc12245a14f5ab4810a62defae8406733f95eb01c103fa5653d020066405e2d6800250080748083a8041d8020eb010000fe91180dc8e70fe6f9ca1481aeb9761e92010281e7a912b5f20359ca1e72a88386a0aaced5198708011e1a30000808f4cea7ff991400011e1a3000648042b01c0538287cc14284021f2010f88080009248f80ec04c643de221ee1108b8887b4143d802000d2823d6721ea310f49687a0443ce121e6090f2828790043c60200402023c4cb1e165860b0c781863bebb1de518ee94c308763b8231db0dc08465fb78387e8c239dbc8f1cff6288991ca7da58f08187f160665686401262add4f6780a049f12972501010070043380cb9080808a808c4076bbc0612880695a7f62c842281a27d6e8a2614a03c217018341a2cf589fa9e9f7565452e7fe2eb96e7208cf1fc97d4ec4f036d3c7f25f4c97dd7cc02126c5a0fe46e69d7df39cc43325a105574bf009132199356c42f4a1aa834ab21de4e48fb3d5d98a7decb0ab7820000000000000000004470ecdbee5c3b36fb8f9650890f00000000008d4a20a0ca0470402dd295f31448e758e10e8f322a06793e24e57d429e25c8b91e4b3862369ea8dff93a521b55d2ea1b0ea026df665465838c7438eac81f339d2e999a86f15fe64ddb668e473e3dd0f101049c36b29619b17463210bc0c5f516581dd59d50573feb783627b733b684344c1d1da0dd85eaa97eef83e2b8d6572f53fef7cbc148c1238766df72e1d9b7dc7cb284487800000000047e3e2976660b19f8af1f14bb33058cfc4d832b1ba4d1d1b142c1958dd268e8d89e2099408e08a0880060040002cd36a5852c59236f6dc538308bf7083c40c24aacc54288e11e3d95e770dcffae2d111ab15763e4e5d634b1413824e63594b7d785474ef6214f0792f49eb2db34df58907d58f8ea1f7331298a2340013f48ca14c04c943b2431d8218eb8cc758563aa2b1d4158e986c748263a2131d0098e782f4d81d1407c634609d855368342397708a3210213ed28dd50240c240080e280c67c07c382a75aacc70781aae6171618ea1d5172382680f81010120611004387397b2430cc1c60d5269c383a7c16a41cb0c8618fc071c05984ca4c8094308802000021a45444600043847383639a0b0b205e825e5345f3a0b4981209aa2ff95f0ad588182380a8a630b64b41602e70cd55d0fa93410011250df4cd3d550202d04911cf59b7cc01290d93a15c3d61127b3f981835f50409d9b159b443d9b14cf1f63121d0340000a7485494c5407629e3b1cc1d8a70ec72c463941b14d098e482e04374f403a8824de4c0ec115f00ea6e1d4b34f7db470dcbd404197e6b8ce70bb4681f67a8ee6d30d3e83cea8b9d92d1db2790fe62f29fc9b8a5bcff887a00589f38280222622434120e9a21d1785a84afe84e6453b6c68cd5bcd6d7f41e7c4029b8128002366ab33f0145945265b0a97de798cfb22a88e1ad170a0c1a8e76c7c6a4214c8cd6da688c1fa692787a2779c19856fe8ed5cab1233adfa72b99ca788c73f4de0390221c7118e306c7141633e0b1c4058b500e028020080130d5829e9e0370f082648a4f102f41dc140f01910c2cd00904078021e16a8149302218360080030500003119016ce98c88001be40d1e0048407c0103860200009420003fc470855a20441b218835d04c9363baa6327433721aded5925bfb0f5a7ed91e6ebadd0cf842f7db86601db858cdfab9800e9cc611631dbec10fa82951bbde3b0544203808b18e3f63d0f165dbf8ee0f871bcaaed63b9b407b25ba0205e10a8435b9a3c2a835453c27f7d162964924004a0613eee04da921c193eb4560f1b7f825c7a036e1a6d808173f64a8f6868b64a5c5ca5f6a8c00a72df3371a971bac874b98b0321574332a3d63a009aed2a2788e4504034d1391954fea4b50eb5a782b3fc66150c64e3a93521ec2a8e926cf4cb73e2f6ce7d1357b58c8541310000d886c38c0e4232600ec29ed0)) <<< 16000) + 0x0a03281aeb1808011920f80400002d08ca0cc704563800bb0830b3dd9f67b21637d33ca8197a85fae385e2a22a4619c1bedfb53db7c61092e1968b884a9db8c79ef387319173cf57c946f741da6cdd53d49f6b9410059126a33627005e719044cb59d976e2458a4982bcaeeeb711845626e8ebb4188ce5689af6d9a61974ff60e2b7fe606840d01de3b2a0dd81194d2c035aa541e2c2dc457efabd606b210bfc679f407068c573ed1d3c49ea91b2f8628e979de30565bf41644d129980c51905ff32b9fc01fa8dce2445a8020078a4198de931d5c4571e6371bf2c5477cc7d923c43c657d4f3f5fc0a3e0677bd7a7daa2b2e446e02be0907741016bd5c81f396734fe599687a2e28f45dfe0abfad4816d1d3fdd71517613afb5f28dd60f1a47e4a095471d49c1a965c3f57bd859a15d98d8623e6c3cb2fcf57bcc74802bf8cb74db2031a2218b098004c090013ee237e130b2098df00e041c1015e8c0f31952eb4a51fe8de61067111e2d2f63022ee4dcc362ab3923ccb9b8bd9a82fc07846ae30ccf614e86afa6d17e69262f9886208101d3659996e2284663b3e5729e0d51aed8906b5d77f25b3dfe497df10ac5cd767246e75f509e8b3f5b7b8f05effacc8145a7bfb660b25cb9c05515150f4162568d381187a8ca03fadf51ccfc346d2faba4ffc2ce3a899a37c62650987b22e871c7b1a8bed248235d6f54c0dbdc11c34aa000001a381530dab0c9f5e80a913e23967f32a6d8c916bf8d2f0cf2bd52666cab4bda8589ec3f39c2d886e889777a02cd6a02a6501bf1173d505085003b0dca22c063191b393ebf6a69cec0db143be1529608c5d60817fe76a1202736628f341aad21548053cb65f2ce771b21dc86335bd66c0de86c6f016336039841ff6945f4420369a1858e14aca79529302e8293124004828420101ad0d5920d521f5b2466916cbe29223f93fd2253048f0c05f4102061e1a295409bf5a49d01306108042469d2086a0244b4a06ec31021eca192b4c1344d77cd241554088d208102df7dbb0260c2000800009791ad11c8c6be621434c4228c92b81e08d63f2f74b04714ac4bca81a8f69fa3094208402131149bc4369226959f4b0102b7882222282cebd42c0305ba2edda84a103e0100000fd2376121b80900012410004f7236e2ae20cc4821b630252693899040e3e2cecd6980f41baf70a20088e3186a004a28440108062e7844a0a211460e31d238409bd02511e0820b2986c3034b340df88600e6fa3606004c284401000014020e8331b50100014a91b411f03c2939df1603442509600110c0f00406bc340420a1ae050dd00c0003548dc82e0706be9605a6125f4baf6c8842759e53a9c00ff5613502006dd1de9488128a110043880085fccf144d9dc80fc081860c7921d500ea26f6d28804ac91d060094408402122c0888ba44a8196007efd088208402121230baa8e889549499408820740200000f046e02400025040009308db8aa075dd991d6a802571817188000a58c35280118a110042212fd08d6f0c0ca7741e4804420400101b60100004b91b5010000bd9017218da08c28807877ec87c3a8002ba6c0ac01210200044030040103660200003734036f890390f004b9d74ac0883080020364020aa010000551b0bd552fddf07c571acae5ea7fdef978291824e0f3249d939a5bd4bbcdd0286e6880d4b4088f1fc97d4b2a6a7ab595353d5c97dd7cc0211e631398bfea67a1022db056a264edd8ea264edd91513276ecabb2c273dc2453c854338034003a028eea58eef1522095578f4134ea9e3624169f271380ebbf156667fb604e38cf245ca51307103dc883faf6b688753f30098f52d67442b296171569ef9c13b7cb2885d25663785070326b387153728328c94d0005802362321b0190d78c86b834000f0840034008d692c6b017a11a0a88b4870a153d3a188829bbbc702141260cd608001414210046100d2b67f68069c0b42d691edd0110ef6b8849c3470442d691edd090d12cd08708e04d009004a2044722bb1ce51ea3c1491601770ea262380fa739c0447fc5ccbbe2d851f860a00046c782865760bf00888100023421a0f8bdc663398f6bf12548946d898aea48c1f37d12dd4805ae85c244380134b0f254fb2cc6aa020608c48770374bfd2d19864a4d1c301fec8167340137060835a59fddee0f3c670bac4367f4e85f0fdbb31cf1f26ecc24cb03ba0b0fc0e2de696aa6aeeb419e2b546d0c0b1e26e55fa4a35de9e880ec90eec145fdaa77f8c7a31b046f03993df73d3872ad2a2bc2310e431000024f91ab0500029191aa1d0d48e86a07434e3a1a6190d28a8690543462300091520040b6783cc92764e696f52ef3740a1b9a20352d02242d691edd0110ef6b8849c3470442d691edd093c7c52eccc1633f15e3e2976660b19f89b06563749a3a36285832b1ba4d1d1b13c41334c3832c3103240000140c1fba7deaa143fcfbb45a860ee657b519b22f728e211ecf5abb37cde34c27cb3a93728947080169eb664a86378c504de8f907b469924d3ee54516efcde09ab1cd1447c02efd2eac11ec0582be068b3bad5a0a5429bbcf33e87736b30b852b622e0afaab58d78637bc9bedb3a1514a108a000c2a400bf408024f391a2358b996f6fc10cacd5016f1f14bb33058cfc564e5394222e095e86b06563749a3a36281128bf4eecb24c3a62110a086096010004002000000a17979798be52c9c15e46b22cd675adce0fab4eca8b58a47078766a4a56139f97324b6bb17c85ad76e0b75b9ad175cc49e5316834b8a8204ff152e7e4dc6bb)) <<< 16000) + 0x0e48a98640b825e8d082c5341634003990cc9ab6217a50d541a5590ef27247d9eaecc53ef65855bc1000000000000000000222643326ad885e94354650d23fa963afe71a4f8124e773b6ae6000000000000000000088de4c62424f4581b6a04fc819d9c651eb3b2497e45a8fbc00000000000000001f18a18a10609a01000000000110c998dddbf0efc56d721a954694618e7d6b4931e12136a70232705806ed067ddb7afb5da90fef12b27d4da999fdb71fcc2d22c31638dd2fa8cf86c5a8078301a3939e8302566cfd7b9c044a862e5e30040387cf88000012161100405b007e4833a7b631c49a84c3ac9214a1d97252604603476c9e00d0e8358000128e100042c2f554bf77c1f15c6b2b97a9ff7be5e0a4609018403c60d5da98a502d0b5a47b740443bdae21270d1c110b5a47b7424f1f14bb33058cfc578f8a5d9982c67e26c1958dd268e8d8a160cac6e934746c4f1054f28a0c40970000c58d5ca21ee9f9183d258033ca8180ad93e738b88529de03f26136041b1dcc1e4be48d52c86099576622e164a462cbab1c972428704d9698e3187026dae56a1261cc03f2d02f4981814c4a0c9ca3578a0182c8c6941641e0c00c408937633040046284201019e0d00006390006223c480392a694d24d253c3d478201a75551081ea848334220084919e002508210084cd15aa78763497053c17f081e4f8d7622304200080ce8080002f480286c670243360319a0105500800091ce021e6de6bace766065d5315f47ad43015621ce471be8abda7d02999a2df1253f301ecdf1fbddcedaabc2940c7912098659ed11bcebaf9bdc127cd3d3b26039135d76cb40b98743f1440b5d5f4d2de40509d632e66c9005fef8ef08a85c2ed02e8e7fdeae4c329417c275c0790c07af1acd8d1a6373bb4fd7fb802cdc9928d06803219dbdff1c69498007c9b3883190820f9be23b77d032932be562cb686fa389e56ad6f23d16d5a81791a9d774f089118aa051cdcfbc1482127aac7b8019b92302dad4f89927e066072f7efbfca52b188a52542c2f554bf77c1f15c6b2b97a9ff7be5e0a46091617aaa5fe94c2ef10b2a2973ff7c0c6d338236df821959aa02d0b5a47b740443bdae21270d1c110b5a47b7424f1f14bb33058cfc578f8a5d9982c67e26c1958dd268e8d8a160cac6e934746c4f1054f08e08b093003876aebc9cf7d47b7f497a67ace314339b7902559736322e450f9058a22d085f6af6b52bdaa9b19a5267304363166560b17df882332ef047fb2821214066974f24cffb8ca43d9262048554b066a23f7fa933a24f57543272fbd035cd53b334febc7ba26afd67ea2e1bff1830f506fe0b9e6ea7403a628c4e68649eeaa3fe1fed254f830f5125743fe01761f0a92c24500166c3c208bafe48f88c9db0a257ca6cc4ef220c065294c55166ad464a9614f596fa38191a5b246bcf69d056978f23212e7a4fd6ed04a1c00d545592430934378cadac28bc1bc3ca7eb6e0b6c25555751c9490a6f1516fc7f4d53c5dccd41980b8fb75e6727dd4819925500004ed200166a466444330220170d0cb80c0049048cb108654340038606c2f554bf77c1f15c6b2b97a9ff7be5e0a460900443bdae10b5a47b761270d1c110b5a47b742423ce3c93091414802c028000122c1d1a94faefabb73c9cdc7d6427b53ca3680d607f2031ab9e410bca52e28914db168c54d0930102e69524650002fa232853f38c416d0cce15f961fb28914fa0de2b8b06dc48a4e050080223d20025102000879399687a5258233710b9c580a5a239ea380c8883786212081000400003648c98a8648543222a190150c78886384431a1a18c0d0c584c628140005964008d7c8a40ee16b48f6e808877b5c424e1a382216b48f6e8480221ded7085ad23dbb093868e0885ad23dba1278f8a5d9982c67e2bc7c52eccc1633f1360cac6e934746c50b06563749a3a3627882661660c48c600480380000100f17e434962539fd4b9608304b1352fb79a3379a5733ebbedbad6b6dd34df5f32008199e5c80c721cd84350c5e3952e8026d22fb92159494ff75612fefc9f6324821cd40012f08016f4908d1104602800c9208041c5902739eda23d466ea05b5365fa9b5b7a181f4c3c8796c84de6d375f6bee76b7a682ded9129080791287c438e486304282182480000026a8c6272d7ae8ebd033a95eb0b451dd552b848452b1db2af06868e1ef5b9ab47d1684b04dd5d2a8b5f7bf9bdc1f0199f272364bf460379c6eb4cb6e7ed3298889648b2246edf821959aa02cdb447a8cdd40b6a6cbf536b6f4303e98790f2d909bcda6ebed7dced6f4d05bdb2252100f2250f8ca10608408308a007000000434953ce499c378eceec60710b787d8428d04fe79a43c36976408b7bc5a9a3415379dff6fbf6576a90746923a82a322601436c2f554bf77c1f15c6b2b97a9ff7be5e0a460900443bdae10b5a47b761270d1c110b5a47b7424228928434230214200025ea77df7c2ea260e5241f528b5dc6866beb7deccf2fce763094bcb9fd596e7cf4f91091b1c2abaf5e06422c0785c2822e5a4c0bb436c481e27a9d52d4df3410165e11cef322e34affb92b7d3109e93ca955029487a3122200043e2000f6c4620c430e5a186218c28a8610243060a000c0b230403922592d186320ebd0fe09d6bfe49664146dc398148cbc5dd343d357f2fafa208b5882430a0495827336fbe5099b498c3f56ef111ee9d6bc2182c841d00854d249393d98885091eba1342c1ad8965f0bb7ff11a7d26e41c66381cdc766aba7172fefdbd9ffb931082bfed)) <<< 16000) + 0xb3df6bce0f8c526109a43975ccf34ed19b11869c8bf0a6dc0c591da66d57c1101105a3005a639a574ec0a6662c30cf595546f3926c3eca52078d1c5950021b26f2e2060d6af1347a82cde69c964b873edac188314f89ca6e36b73e49a2c2f25f4cf70aa0c6ef2212f9c9ade090db1be7ae4b6e09aa71a821711e77291df70f2c8620c72890f4e856fb8cce988dc1d934b1b79ccc6cff6507c06c614e55e9bddd409e142081b5ed03c2304957a89b0365b69ea1d5b074fa0d41eb07da6b13b66cdd09f2317f39dd39274d5cc4cb2e140408f853f7845be7b7f726514ac3c0fdde5482518aa72e080fee8a3fa1691f03cc4dd9792a022fe5e96d70928f77703c39469d411691cdc52e686d47552cb3121b43474fbebe4da67e2a83e5ac20163b702dd01caccf9a2f581ff66982951d7d95db88227d3fea3b5c7d8cc474fc0000b967c7d56305f6c319316b0f3ebe4854723c1e38276b6935b55f5d800000000000000000228d076f034748ea494708914eb9400c6707c0e96ea4b89a4800000000000000007e0c20199038c210116008022022089816ff8beaa6b13374a35c5808a52c31bc8ec6557849545450a1284c411cc5989176938296aaad67ee1913b130c6460bb41d9f900af57759b8b61385e6dfce5a63f63b49c901307361e54f6b16cacdf7a19156347bae18bdc7d60a60cbfe8921172c90bdb94cf15a14d48501a000bea4604e43007217f390bf1c850ce42fa7206f310be16c5ec961162a17a150bc8685e0240028ee430976182ab0be3985e82e505886e1272326bbdf4e5079f8027fdef6b91a56ab5e5cd80000000000000000082a877ba49e1f61d7da1418d6b7e74ba3ecdb557010534346800000000000000002003080660201960d630069b9a4ad80b87518bed1e9c0bed846a3825804003000128c99fd8fe7041dc76f6dd02e39cefb07736a3489fabca9e55d4a387bb4d54d6a074652644b0df747685e504e43ee7932330e8dcff1e83db85f58e9617e3d160183311231613d1b9e0ea64ccc20cac8d983ea009812210b1a876f7f72a4496913a966ce238fe48233c7f25f52ca9a9ead654d4f5725f75f300857a7827a463bbe4a2d3490c19e55e8582db8737b83de9e6c480000000000000000042688607a32501a4c28e11229d728018ceac7026167650d4f00000000000000000fd0d28a18c1480470400b1d9b5fe50e2d30688a9ac4d3f98bcd18c508afecf5bf34cad1ed0d90418acd23ae3a575b3249003463dbcecc4ffa30997ef56060a509580415dd2b423172107e10b7e93416f355a9fecce0fccce852e33c584f88d4875024a6cd1fc5c99c5b039e0ad4d714867982a000d5245dc962ec4b1751d8ba0cc2e4562e61b1720d05a86c5c4362e01b16f0d8b704c5b427bbcf14cef6212834f79f250461a6ebce5d83620609fc4bac0000000000000000104946648ba3732f67508c1fe7dcbffecdf45c6bb4fc122c24e000000000000000004122452c21822c02001800000050971dcd79f6e2c0cb2b2383e95c2746b51310f529b35ef23b46348794b722e9ad934843a0071957b6745e95989ab9620ec46159b8fc24f0ef345fa855ab1e8da9ab7169b801991e422f0d3cb0bf8718d69a885914d0949a430d9d2ce9ad677ae4a585d36f5813d264d1a3eadefee54892d22752cd9c471fc9046cdbedbb1e6b5bbb456998146cf97687565fac8ff5a96a471dbf8000000000000000002294602205118b94cda1183fcfb97ffd9be86af342565e249f40000000000000000082a877ba49e1f61d7da1418d6b7e74ba3ecdb5570105343468000000000000000020216b48f6e808877b5c424e1a382216b48f6e848a71c6927806000000441dac9f9969d86838046b9f209ddd6f47da909d2ac29817c2fc55f7926f129b52ccf5d22943b00b9eecc4dcc583af88451d1ec3b8956a52829389542b82cf4919c7826fd05e157501fd672ea50c50a6d43484a554a63835e0ce4fb9c5075ac1779ca06b09de53ea300f5e973c79d290668afb23777d8f878894ad4d3b19a013ec8641ef8d16c01e1937a450240c3793c88182a06762487d0d0028c932ae012081080426610f2e1f5861860e50cdc280dcb87d24a0131022004000059916b058b502b0c2c25ed9e061b6b5afb595031351983a68029509ca2000906084021c747158ee22000f1713df82057d1f55f04610400108020080205a40400006e45a0242ce03a85039af2d0b000b3e4cde0048308801160cd479b05b0a1cc9d0031f6401294994861184118042aa9dbc10a0e143ca5fa7fd211041180400002108000a91a02376fe997540b3a8a44480442042010000084200051e4000f3c800265916621c8f4bf8b4679e78a1c8daf8a2bdbb1a03098036f053923401e90c0bf98008732a4680002620210080b2828000554809908590242c60b00087f30410406ecedd6d35de0eb749ad209711fdb45fda9b394fe3922c4f08ac34691aa02c106726dfcbeffba9a14c5ba9a5e0536718ed62b9aa8090676e82fa23292d37f3a889d5c2560a86db97124695eab290008237de574a097184925381cf99984216f3fe6bdfefcc3a6b1cfef1aac9808810221065549285e2b7b21d0d25a6f2101236bd1729405a5591e039eb0d1e9f8f73cc871aeae1e0a1ef8953bf1324855129993040e082c000019d4989f4f417d298193b32d7d89d4b3d068fbb9e4f5a141107d88b8131badef8b2188089de607878adf205042a2f79e01c3873bb6d5b008100159f2a22e6170c2f51dfef1a439d6b90f88bc91dc1c751f3328f452b)) <<< 16000) + 0xc3fa20192784e6a6347213b939f35313d65c83a84e0335b56540b100800236cf99ed7f4ff498400b58a73870efbe2d2e79c07a78f157448066e06e43005440880102c20a160050af828578162ba0a0c2050ae02856c162b40b159050ac0280007d48ab98c5206763ac3d562816d9bba711f6ab24a85fa0970f71283da7db6d34dc057b434c66e01d9cb2eeafd9bdaaf892806cc77930089aac0b838adf23a90814846ea36a0aec3ed37b59a7f4ccdb50456f4a4d2890fecf7037b000efbbb410664201e48037f942d22c10275612a6c51658186a39a1ae41e3973a95fa58014afba1554e4b912c986992ca6dff7cd2e7b5a4001005f284cfaad2493169c6b4d110d7cd69047f29fe2dcad9cce4ad64a1c168857ca55ccd7365aa00ff3f2304e95528c8374fbb57f1c904c5d77acddbe6afe2f0581e46c50907532c052a784a8042a9369b64c02f0f8edca7afd16d2010df79a5f4fc51c43bcb3aec5d2ecc6928d7854b77b4be4658622c457404735c72e09de02aef5718019c692cea380008b12004ab44234341180a002b7922ac93155318aa16854c442a402c342f640e61ce61ca911f7f62dcf9b203d4e242cfcf18e4e6a000000000000000000444ad9fda01a702c8d1070c604a005004000b810829fdfeb4db0838cac1ac8cab36e9070acdc777fb33204408c85e069ce38fc8a09e6d45f5d1deb28b6b9ca38fa4c1094e5005de958f8f4e1b2c6bdc21becea5015d50386d9ebb920425ebdfdd462e6c30d9aa9935d3b8d4273b6e56bacbbcab98450da08307db6837fb972c2be00e08c8f82791dc85ba3df5e3c0abba90858317b0715e446805a32c15ac6d490a682388006b7d901c944c7ac65e50080747f1284783afcd65084523bbc2c86834e426b0c0117ed437262cc6d5cd8096f253be63fc8a709e168917b0db37064f1ff465b651796ce9dd3638a304c4a33245d1b997b3a8460ff3ee5fff66fa2e35da7e09161270000000000000000020a54cfad18d48166da23d466ea05a1429619218a0020804a55da161fc25c85c8f75d26e9c31e8d3b0f2f7035c51d981b028f9372f198425b1c5423ad2f072184b8df9e2afa4c7c0f3b4eeecc36a54de542144892ba7b5d5380f410c3445d23be7200d13b83229047134b61d932d4b9ffcb911f0f1d75cbe9158f086224795b0c55d9de00580ed19c800a0c0a84e92486763f3498090ceaf61b20d3a22ad2d8110095c36ef12d60a9eee00700148b89ea0aeb0d4fa802001d96008318b992356801446ff75b66a6ce7df368202610efc8f45e276222467e8d6b8f4806304c0a800018491513580046a91481de032b825d27608ac512420d66483211d600eca769d5e886b844037fe1bf20137de6c8c0a6d03826e0f3a9d8f85811f15628c028a755772d06fc2d4017023748021e1fb7006755ededf408c91fe686a2e855bf6440580e400015c10a9458a81cc53cd629c5b14d09c0535825c5339aa02c4001ff908e8c7a316b0f0328768d031116cd634024bd8a906229894880324d3a50e10c90a400401367f557623c730fe00e284bc37b2b8a4324a5103291520f81e192364b4ab200b50af69e7aca278485f02d845ccffb359ff983b35cb4cde668000000000000000001097a7827a463bbe4a2d3490c19e55e8582db8737b83de9e6c48000000000000000004206100d2b67f68069c0b53873071c14000110502353bc188adbd13ac635ebf269a6681ec52cc78b7d5e9f94198f4061fcc8250787510e664b1330f07fbc1ba3ebb7c78acd9c2920dea4f6a5b02f0665b9c821c931481138325d0c6d23a30758fd364394649af96c569274c4c7d57e35141c390de96e58c1c67cd66fe020080121c1080400003c48861ee42e395fb26cbd90ce3e843182028c0440a2317299b42307f9f72fffb37d0d5e684acbc493e8000000000000000010550ef7493c3ec3afb42831ad6fce9747d9b6aae020a6868d000000000000000004006100d0e28d18b18b003000110402db681ee349596d2045d4f18a2fbac086703ab89d33501875e31f85cc73294216f28ebc6d25ad97feeedb749cd654edeeb6d1bc01df6041e0478ed35ffc9e2bee159abb7a020bf38529e97a25453004000ada74d114533818d2501c2083d30526af4bf7ca142a08ebf8142660ad251410207f91f5d0040100263c220080a5808528040002fa400370c8a49ec52087c5d26769390b1dca9653984861bdc85213007c7dff5492000782223880244517f7a380501781b601111400102754210080000c310011f720042de451cf428c2a145090a2028009a88db97e960e7a13224acf42644928963de1182312071c52041412c0180100100bef9f6ba4350b3dc05ec90fb76954222200eb9a81fac7f03b5f06924be5d9d4291000f4adccc36222e54b3cfd777473152800140114305ea6cbf536b6f4303e98790f2d909bcda6ebed7dced6f4d05bdb2252100f2250f8491871860830430004541800446f61a9edd4970a2efe0adbca38c5e2cb89ca92d9cb5c120d205a02f5d62d08804dc788ec9e8520044010109ebd3bcfe225c831bfbbaf6e040fff9d3c54cbd3205e2abc1b649f9b728ea1a46fce87b494f15588d94647018e791920b09774a56cac44272be5090340012948033f19011a0e38685ec81cc39cc39759ba9cd228b1df8dbb80629001a7bda970000000000000000008823885064862044803803002000804e14227a6b03c0fd05ded1a8bb07d3e7233080c0b7d409240dc2c829c310e500395d968ac6e30b4313ba4561256dcbf4b073d09912567a1322)) <<< 16000) + 0x4944b1ef08c11a54cfad18d4816458a30a30848630248028080807083fd175b6bb2d15ae17c7cec40fe2fa2df085efaf90643eb3b385760b96408c767f2e4ac987e7f30f36b793dce3ecae24abf24c8991e21e313ae000000000000000000455e9e09e918eef928b4d243067957a160b6e1cdee0f7a79b120000000000000000010950ef7493c3ec3afb42831ad6fce9747d9b6aae020a6868d000000000000000004032482c528518524300a29c329740a418fc218c4e0e4634446eb243bd484cb1498da084fc0ca7993c0e4b6189ff7a12a223a347f159bd9c524aec1e4c725800326b37dd306e11004ab0aa53c8d1953b86573731e7a6cea260e4b1a22230f262f2f45e61e02b147399b0e1e180d56c7ba852da461a80036d9142318a092c5009627e4313e09db97e960e7a13224acf42644928963de118231e3eab182fb618c98b5879f5f242a391e0f1c13b5b49adaafaec000000000000000001152a67d68c6a40b32c92462c5185240140100040cd867a279b2172d5df25facd0635084534902ab56be42abcc50e31efce2b54e0ebcd93556ee04973abd0aa66916b577fa46bf4936c7fd95d8e580d463cfa372cfe5c95930fcfe61e6d6f27b9c7d95c4957e4991323c43c6275c0000000000000000008aa15ed3cf5944f090be05b08b99ff66b3ff30766b9699bccd000000000000000000212f4f04f48c777c945a6921833cabd0b05b70e6f707bd3cd8900000000000000000084658a50a30a4863000001fb2783f4ade0563139608a94e6777e17271d5d077c63b12b80316a7642bd691a650c66bd27a730d5f8ebede05f855fe84446eaec6cc001201756df78451e4f673ee20a8f445081f773aaa0426a4103679202fe770880d693ecf353202545dc4b0c0d5147902a5114753daa63680037c113d110005b8100152636e5fa5839e84c892b3d099124a258f784608c3d66cfbf675442dabd57c51b49a3ac79bbed3454b900c9dc27ca0000000000000000004611d471997397bb02181e5bd4c9849854134fd5d1bee463882f6000000000000000001112a67d68c6a40b420514414320010049436caa170322ab19c18c35c3d95e327b973ce4535448bdd94d78a6378aa2a859e75a752691a65ddab102a9a5fe8ad127cd0bb10d8ef6e08612e8a2e0c749cbdcdee94e252f9c0c9ea88be9e9af3110737cf251aad04dbcca3d529d1d679d1436256bb4443c9a3a8dd240e2403f847c81420864340e52e28824124663c80c10ee1987452e001312d00041e2861500c000058cdb97e960e7a13224acf42644928963de118230f59b3efd9d510b6af55f146d268eb1e6efb4d152e40327709f280000000000000000011878faac60bed863262d61e7d7c90a8e4783c704ed6d26b6abebb0000000000000000004511d471997397bb02181e5bd4c9849854134fd5d1bee463882f6000000000000000001112b67f68069c0b52051442001004f3c41b15a2405a959c029fc6f7f6e90b95381c1903732e18b9b554c2286365651e694f00fecd060062195e300fc5809e074183e683456be9ba9662db80815b7139bafdea11847f408f22ccd7a6318e62f97ef1136edfd0d1abe703cc8325304f53b939eb90f2cbaf0e3361f5c856e76255ceeea829a804d0abf8c7e34398240e087aad11828679194240e163bf105585087b81594bde48800e4e1c00028815c6400c2e30456d79071a6280003c78892a051c30a005000032c400288489e0ac05c562762b13a1589c8ac4e0561942a1371589b0884d44419622134098998484c80400268044c41742bda79eb289e1217c0b611733fecd67fe60ecd72d33799a000000000000000000424a0b10dc24e464d77be9ca0f3f004ffbded7234ad56bcb9b000000000000000001048714510804704604500000000010b7883ec44ff856d188c62c3d958005b4cb089880be3b84145021e492ddf8ad5dfa63862c2f87654a621a8001f1113045097a084b8f425a7212c390959284a8842522a128110938684980424a0200309d2029adc406b314f8fe4bea762781b69e3f92fa64beebe60109fafe324ba50c873d5552642274929c50826f5152ee97ef42ca1ffcf64ee296739c886458e40a38828828630008000220160c0ae00572292d6aa0d614efa12ba24ce465785e6bf51ef7360a7d0084a0bb3665cc21339d41ee68e594f73b6b04b2cfced37e60ea57a5cd3b4ccb0f896991628eaa8e07a040a8896a589f7a6247056c5674775bceedc8b19f09381b3215ab5feaa94978b21987e458c48c30a38450040030002a292dc238738af804ae8f65f90a146af12056574db0d1b790199a295076d306fc66fbd10b633bac3f65dd958d6721adb986394f6c681907b0ed194f8077779e5f3beb59576d42ca2c7491967616e9b7006c4b60d39c7bb293a8d117075e86518584cd5d403575e75001540ebc8dd2965df770eca846104fd5de3a980a9e5705dba126b08120695b87532d1c21b5b0fcd8d9ea892577e24ca3b6f34e0d8ca8a878014525ba0e29fdaf32ca507eb85be06c0067002b5b9c22ddbb1d2f96d1ca068135d8405591cc8dff00c4f234abc8c1a60b8b084f5b02fda3fc88354a614440800056220011c042e47624823f1fc97d4b2a6a7ab595353d5c97dd7cc0210251359bb898e4299627769bd7e9a3bb30848b14a14814700500100001b99226d4a5bf3a1a61b2a6762a425042d6a3778c0a67dbd29970186e3e268aa3df5683b825a0258c40a69770d08709ededbe528d357cec7e6690634a120ac3e25a6458a3aaa381e8102b513)) <<< 16000) + 0x276ec7513276ec8a8993b7655d96139ee1211631230c28c20609200e000a39e84c4c00af32578fdcd23ebc52ee1cc05fe253c5522ace02a680296c1a737d4dc923c70b63464c8c05848c6cd590ed14292150152830b2d71f45e8c214cfe390a386121a6b338022131211004000051c83a10848c642442200042322420a120010003e6911f1d88a08e84703d0059ba1c4dad260075a10319e2b080c21020076af8eea14102c7463d40081429c7fe04e200a02577eadc1805a7026e610040aaa3dd4562000507a1ec16a059d926050038d2122bcce501badc327ee0544a1071080c40c4085043042041174d56c430191e0d89182b187602b260911828a23c1a11d0d07a82800068888e1ac430742362210b05085008424040008ea43c8f62344b0f50dd0c3874db516dd284011763ac4430e2065d6f5cdb2c60c11c9735abfa206c70471dd7d22406db832adbda8a00a5e3d6708f00414a6d2584713d1702f48a93d28c547302d03058afe931d6d2c040a45cf2411cc22886502b72a280406096d3840f403044116e76da7c28201e60ee1a7248100e946bf6e03802aecb7f52f00a0a8f672c70f716188242c02c6e88454db487b59952b3d9412fadea11e5045a4245799ca0375b864fdc0a98080747eebf930e0c3626267061b1314a3f75fc961220a21619018c10608082c1fced58f715610ad896691634efb6945385a6319dcbe88e52864e99bd137fb1508846597467a08ca0c5a75dd614ca2d2b82926a96b4000e7488c82846004000c14404ca622e2b1161588a8ac4504622613b15503e78e6088152974b89660b0d93f0fee2f850833edcc5c583045a11b0ebb88006d2fcb25a87023002de5eb82012c7a95b6600051855f49326412b092d57acb64181400e205590758fd761c40f779e000e14430e97d90602c345ebf5a52a10339a16e92ac14213792ca2a110287d404ee520810b42361d77040204d1a0d2c005040323fd66c2a2928280200890c8444540004c244404742744afe108711247853bc50745b2f31c2032d0636ea081d6c4e2d84a083f2adb48384098d38060c1587115d9802a50404201010f050870283500421a020d60103780800085c88612842c2421402109010003a291085180ba8c41c940020dc44181770822f5b92ace3265c208bd6e4ab38c96ed0e3c77ea79dab4bb438f1dfa9e76ad4217079924ece7304fc36e0f3249d66880d4b40476c8202544c9dbb1d44c9dbb22a264edd9576584e7b848840a286284300023a0268e3908ebe203c7f91fd2e72ecd68593dc1e6a73c6bf85a9f92d20119e1b3d3a4fcd671471eda956e555d5e19cc4ac6050106711f2876392d846c73fbfccb5aa94709c92b774df4682af016891dfb473a6c7b2bd1353095a9405bdbd27220039b750e0c7007b76addc7e23f462149721d707d8129b11143ec1e8b1dc7156204ea343887bac4f6728098cb284e100223ec83a44498508402170822f5b92ace3265c208bd6e4ab38c96ed0e3c77ea79dab4bb438f1dfa9e76ad4217079924ece7304fc36e0f3249d66880d4b40474e45363559e67bf9cd334ffc3f5d01c0fdb20808850e38a388406682061141cc77e5055b2697b2870e378c8a5684668f443c307b9f41bebb682f8b7883e149215115ad4896ba66699d5cc7d6e8c858f85dd92530d36d94b26e27d53e12cf0a170454547903a0009a8783cc9276739827e1b7079924eb34406a5a023a7229b1aacf33dfce699a7fe1fae80e07ed904044e0149f00a5a7088da0f0510b1891861060c7084889ea3b788f38579f6afd17cb5e6f568d6dd9a20f8566ea7126c0f09f5ed252bc8f2332c6d6e42c68a0dac4379452fca3a20a020003722208220fd0107e0080027d087d8ec40c27c601ce88eb62aea9acb0301ef4285e6cffb3b5e10f02bc9029fc62050de230d4405c91fd2a85f956143536eaac310af5970266ed67c2002bc247662e688a4b56e3e30004045df7be0da1e631d253b26220243c90ea25cbe0902af7fcc62e45392a56fb334b183180401c6002eb278250b017f1e25c8140a902f900e185707edba14306f66ad1818201e6291d4098308c0200002804408341d81a1010d0800483fc241fc120eb050750083a404000ac840849762993553529d3e163817652d3dc6713237902a84842ff4f0711e98b97e911785ccd5d8a19e2bb9f89dc229f93e34f4725642b22e1416080b7373e67f93871e75551fe2160a28c009befb33e010a66e502fdadf8472704d84f20436f4939eccf8239b459c13d49042aa32f212abe66028a4c7b94f6f11501042256b4fc2719d1799d80b0992b3ed86a1017c4abfea8b3941c116def9414b2005f1e3f92fa9654d4f56b2a6a7ab92fbaf980426020191028a19611410c10c0880a30f07339956b9a484e7a6b57ac085a9e505e060e0a4f67246210e87e8283f0040003f843ec9770822f5b92ace3265c208bd6e4ab38c96ed0e3c77ea79dab4bb438f1dfa9e76ad42109429028c20a18818c116082018520ceab806156c883eb17a03ec80829434bdedd1b6bb6cbacf3efe12707a5c916bb084a6043e3c045591b685a5f18f87b187fb18afa089c10280e247e73750697c7b6859e850c2d8d4fa96ded5f52cce5320206a6dd33c41607a7dc1c27dfa282047c0a9558b2755ab2b09980c102d2f8808537fd539f178d500856aa40fc9df488ab43e2b15d7bebe3f3f30c8c10ba1e000033221f41a0ec0d07c8683e0141ee0a0f60507a8283ac141d4020e90100037910303900070f10173d07a1e83ccf41e47b90c111a927ebaabff0)) <<< 16000) + 0xa083c9b3b98669cc2470a0b821f40547be902041abf21e191ab6a4800307a4cc6ab08d3470054ac23264bf86d0600006b3875934253000374ebada2341182111102f7f8703a01e0362c64ffa2480bf24623b4c2e0552c5717e1f89101c53a8f1af5da30493e938ce4824413db0d451c18339824b5c9830042f1bbf64c0c059c5c5f73800506d124850048c18c8b89f74b1b4dbf269091ae470d3ec60cb129c6ccc05dd72bf1c90522c760ec206777823cc0142720200080788080005e887806e85b8ca7c87481437d15613142014ef8614012318220080770283bc140b6020ed010430080004808760e83ac141d4020e9010002a3903045f10758049d941c229f5c36600a04019bfb8982418684c03fd09007367ccbe91c00783220b1c50011b71a35b0c0294be776780044444094221300a28604094c4986a50a1384ef87aec814010e5d9a141416ee2190d4600410c2b45dcb68480005a1f061408019ed7ab7288000a0c1e0f73cf084fc39815812285e3ffddf8102802dc6c00a105ffa286e586016e34ec2821aa3b65080085480840101dc1205b01076808218040002ca43b0741d60a0ea01074808000f008002d810e8250006f290e745073208394e41c8320032dd20e8920e33500180a0c9e3fe8b83278ffa301b029df8e3ad3207ee026dd108a9b690f6b32a567b2825f5bd423ca0898802a8993b763a8993b764544c9dbb2aecb09cf7091080c60c608604800010218004b8c846dae3b40eb02375c87e028ed6f763ca7ecda31f63bf6118f7a10cbd2f164f61e603fe03cd6450439c8358d6cf0fedb199f5fffaea69e067db84117adc95671932e1045eb72559c64b76871e3bf53ced5a5da1c78efd4f3b56a10b74422a6da43dacca959eca097d6f508f28226200b183576a62940ba3f75fc987061b13133830d898a51fbafe4b091481c80c804a0080369650e8b10e6759217d4c204ecedb82a209aad405ef3348ca11e11c4488ae3aeb4fc8c2deb00b894a5b2f62624dc90a57d7ee28b8848bc871e2ab617429a6c15d70f26c2e914ce54609da5206a0243648105bb8afc91868d916fe2c41af0fad6091133684222242e48596bacb019e8893ae09820880212405a71431248c8263cc4e92211419b49c4855dea8a540e084a11ff8c4a08440100e20100008f100027221ac230740d87086c350241c0130df05c8718428461623f29474a22cab835cd1e8ca629d3234b3350c4c0000000000000000000000000000000000000000000000000000cf8c1abb5314a05c0eaf2c791a816640e406282182500480058248f5614bbb0128421fbd8f11f6a29fe92558e225b70991cce8a5134e7be89ebe56c07260c30363cc7cb65a2bb9eba45b5d93884875f6875fd472e7258c7f1fe278c3a287b50de01d120c98ad670a14a4a1ef1992180162fde41c390ab02f046002174fb8d4900001c0e6380130a118042890539c4bde50a4e4f7e3a490c101075360e1c9a34bdd50000b6e299b8004a28460100001163e3f92fa9654d4f56b2a6a7ab92fbaf9804225884884043042046806003800185527ae59b67f267d412a52fc420e388f73d656de08186210e8000e110dd1100023410dc210004a210db2506d10800475886c90c360761ae0ba15a8573be840b8e779d7b14346bdd2e09013d1cfc0f080418f7e45a183ab36f728280b7cf96ea86008f0fa4aca0108402102fde3cf014808fe537f9c4024a381cb10c10786d55f0a059f61fb109410840200002084358260e8130d50586a02834c161a40381436cb3e278a195f8f16301c10e52a5d3e2830e1f3d9480024182300878fe4bea595353d5aca9a9eae4beebe6010a16b48f6e808877b5c424e1a382216b48f6e848448a306286382282600380300001818010068000dc10d10500016890d015dc208bd6e4ab38c9970822f5b92ace325bb438f1dfa9e76ad2ed0e3c77ea79dab508478fe4bea595353d5aca9a9eae4beebe601091018c1880860880060021625f0abf97a62511ec8639d731bd360750816336a5f0866567e32352126b9f7ae3db16ab0f6e2dc9e7dcdea7205fd3e4c16e27e4ef5627e645158178de3c80c5a72c5ed232c86d6c24bb0ef4ae5bb1158d8a37cbfa00093c433ca419c520cd250660e832c2419402000b602192030c801c8bd86d9b83278ffa32db28bcb674ee9b1c518268f8dcadd7402a35e766cf89c930e111efe07aee4040740cea590b15c3d2304000000000000000004213ce5f0136902d06085084042051412d46e820faa41db9faa0bdcf5720591d72791386c4377854f2c118debe32cba9509700d111ffbb5680cdcb80f90d833909763f71f9f0fecf19fb2cf2734ef80c6106cde12f1752aefff63b574952293604e3b5b9e24fc99d64fc56a8ce544589a734a18869db431c074401f1e2af9986305743137de14b0509663d10420fa92011feed39a9401003b34fa77532e100302d78b906051082b3af528710223c980e99fa72047c85cef0bc95bb0c685e070000235218c720c5390621c8074e40387201a1500043810c34d06122c304f6180720bf3585f16c2f417a0d167ac4fd4f4fbab2a2973ff175cb739046b0bd552ff4a61778859514b9ffbe063699c11aa1dee92787d875f6850635adf9d2e8fb36d55c0414d0d1a000000000000000008060201a1841020a20e000080194068821fbb2484faf3a9ef67daa817d6ed8d67946c36809c61c791205b3f033fcfed4af21f8ce306f051b3f9fd185346e48b4cbd73757862a2e0240ba432efc2dde4478c7b9cb94fb1d527b8640bd)) <<< 16000) + 0x20ffc07ae075663d37ea87f42c4fb12ab36b7505f4cc6bfc7a69d89a1a9320d6c77ab93727db75fcaca8a5cffc2db104e408db7e086566a80b5e9e09e918eef928b4d243067957a160b6e1cdee0f7a79b120000000000000000010950ef7493c3ec3afb42831ad6fce9747d9b6aae020a6868d000000000000000004043461852022400400000a6269699005a497c2f9469a6f50d85f61a8372af4d8b20fc26aeda9c27d1b17d51ed03723813449f5f28aebd15d483e4c1758b77f4fcae290749df7f4f1c01e67ccfbc673e03116a7b21bb0025c73b1e2326243fbec198c5c2a5ae0a8d0bc09c8244551d2d6e483682afa17f1434675485bc45bd66b58d3c173506dd58fc3750ef8934ed1275f360339532bb118b44787c12ae1b600305852ab9fc14d13ab449d8edcb76a1afd51f3767012a42c6f105eb2bd2eb922aa56906b7f8bb989d52d6ab610857e5d921734173401201a2cee2a819ce253ad7618aac411d55835f7629758dbcdd8e850b2644f03e3611470cf4402b8417bdaf546e397c335a317cb4dd8000188382dd802982880b53ac57f23fd73283b53f4ac7b1711d83bf5b7158cb00b641806a9d377a67ccdb3297f5bb31c4feafcafd1f0d1831c680137e184a0e7eae1a1b00aa8d8c61cf27913d1761a789c8c3f25f72280544d4706adafc8f28e2c4b0190a27f37c99a08d1bc5f70fcfe1d9eb0f8a94d2044c0d8ee5c4decf9a5c1dc0a85b3f758c90b8db4a9046620cedaf84484ede6cf183c00100321a360870e5f61a71c18392b80156848644727e4c10181cdda3321833cee5fb800004a4044010000117200a3a0bb1d05d0c8002dd48008e190b91985c0c82dc5616c2a0b51585a06c2cc17b77b9cf71d57899f451813c1015cd43999f07b6287ea44b39c000000000000000000886020191410e11408e09801400001ac02c98b2941bcd87ec448fe0604bbe6d43232f5e2cb54ca17224ddce6ed6394f29df37102b1c9ed4d571ed2d3f8a97687a9546e413b31e1bbe0680628a722685900f442bcacd64e5081bb6a2b6cd002341ef9e1800109df117000d46ae25f404a184601002d0905884a230708914065001c79319989f0ce25eeaa1591e34a9a7a9519dbe354897a4a5dd25d334c40498308727f8b012bdf161c801329e40dfecbe82a0106116f901a2f4da773bc9e984e22d148026a20117eed7c382867818dc76521ec2bcc9f08f000205d5d5adbc074b5c1bdf43307d4c487659f3d11ece01fd765e09c527e26ca19183608198a24846110c5db47872402ece3965400b84892b812040f804203caaa2ae4110c0b42ef6a3868535921908c208402000015a4000668c05f74968df1c2a8d946c14b1459f697407065814731b4804e134e7b804a204201000010b2000de26c603be2add1c1d3c4f2378c0c78d85e8a486499c5753301494e72a1a00222cdf7c81026182100800009d9d0989b073ab2c20604561048092f8b4d382404762e8e00202004ece010250c2200800b8082c00615e020ae018000b090051d0568482b0240016b242acc61544b0a90d05400ee1045eb72559c64cb84117adc9567192dda1c78efd4f3b56976871e3bf53ced5a8426df821959aa02d50ef7493c3ec3afb42831ad6fce9747d9b6aae020a6868d00000000000000000404ad9fda01a702d0a08508d00c0020002378151fd579b22727d874717dbfac361f68eb33612235cb92381d873eec5375f9e8b1e176a4473001adc99ae6d8b195fdaa7781c147d6bea2aef8fd69cbd18a98c2c440f63e259fd3448a560a52728e5f1cf360f883c2904607c120191ce0793c0073e54e428103c00880400802000008885384a61a924cc8c2c32ef03dc0703e57abd9d1015a393030048203e0100000d630080100405300a61c8dbeba91300a8752e3a88000340e030230c2100800005790811180008b100511441d75d0f4d1e08518ea6b51004dba599a0004638420100000b7214a0ad165b4d18c9410114258744088f6d1be780dce111e8024101f00870c274d31f46871e4b5aea70092668bde301e2b6cfe60481840010b0e9b8477dc08430800200000a64000514e0e3a4e9a00786e329aaca880eb668da0781a74d2074004828400100000db21482a0a31500b888000da88003e09a13ec5a3e51e094cc77798e0c7d9f14e0a096a3bfbd01206100042c30643b9055008b8584ea92020f2c62ebc303eae636690902088021830c8723e3202cf72951a200f01d748108c20800200001504000680851088284441402209f0d04f00c2740413802000324200a5209b2104d0a8264540021824260672242b0c80c63842360ac5b08081da159c04812ce8b1c70c016c033b08022129011004025c2412c130950904a04824c24124030910104800823c0411c020001e9211a1208c01001141106f4584596f8423ca10e68c105b6fe94d24404430add840d6a14faf128209d6de724a04e99830d030095ace32b8b00c2a33007014140a0c088021617aaa5fe94c2ef10b2a2973ff7c0c6d33823dd108a9b690f6b32a567b2825f5bd423ca089b7e086566a80bf1f14bb33058cfc578f8a5d9982c67e26c1958dd268e8d8a160cac6e934746c4f1051018e18d18e10c041b319d1a22c20162ba1e1453195a112d44e5efbfb7427624b28222bad0698f69c7067c391474bce8093875bc939489dac0721a62a38e3a5bf102af9a882470abb6789898cf26a7094e6f4ccd51d3847284482a030a4b13d20708d5efb1969a213be9f0144884559f8ba18084a353fa4801a67274ca02824c4044010000146)) <<< 16000) + 0x21144bdbf0432b35405f8f8a5d9982c67e2bc7c52eccc1633f1360cac6e934746c50b06563749a3a3627882480c58c7086885022020800324557c7398897b216dd27045a80009b1e51c10a44d91e8335670206fd5e54c58a8ca1f87a3487504333b5c72d498a1120a80c7e7b59879c22e8ea6ad0688890a6395940905b66d6a2031768c75fa00251ef81842806d17b00180a24e4044010000174202e220004d021101a000bb93a18d7ceb5ecfe3dbe203033e80be3ee991058236563a879aaee60a06024d2cc2dc371810008ee7126d28c1e11c01b5de085002c66a28005b53193240360010160f0bb6325dd8c00a8a04d4ad6182cb2ba097afbb20c0ec1a010e020002d9210c730052d82d88b848b7145640e00280933831c01e06280740408c70880214293d9e12b8e2cc4c45340c29406c4b58a232faf1ff9011b3eea85004a20400100740d04284fc5551549f92023e9204de3c06dee25a23409791510a0128284000808405000077900023920b2430830978b1fdb188a144cc8bc1cf8e10d6e339e42001a5416a600120c108043483ec23ba82030c3d92e3481b481633b630a1e6586c8203229205a38610b735d494026102100804102f4852710757103289d0b2849148a37147a30ad09ac3300c2488a7a772006804f6740009850840200002724000a808408aac657cf116b4610bbc1d4681031992f6c906041c083df430065534096c30201892b4e0009860880201000a07f010000b5907e010002a610742503e8c81f0640f62a07a1503c82800247083c0cf0501d871dcc604528a2dbc0c108a063850903b65a0e7314049b31572c20012a927d600545098c088021617aaa5fbbe0f8ae3595cbd4ffbdf2f0523048dbf0432b35405db208080221ded7085ad23dbb093868e0885ad23dba1278f8a5d9982c67e2bc7c52eccc1633f1360cac6e934746c50b06563749a3a3627882a708308580180024dc07192dcaa7596e81d3d88f1911476f2eaeeed64182f37849fa57cbba507cc9fd90f3d0dc94106284fc860ffa77ca13ae7d19286e8f299d9630594cb36bd8a9b6907eb325e4f3032afc6ee41d3d47ae0fc93f93dc2841f8cf9b60a1180b492004092e46669e2801937011800094608402147318b8ada00bb6410120c5616549340bf1f14bb33058cfc578f8a5d9982c67e26c1958dd268e8d8a160cac6e934746c4f1050c1c714c08408a0004ec8f9d625b00213c870d487a8a121cac21a378aaae554f8182bb05b72a27cd0e6d73708f4700d8709601f4b6c5f46a318c55d0003712000934405c656362957ceca773fd0d6ddda5a86fdf8d215653b34c2f49c947d8f923424318ae9c4a648c1d6893fcfff25224405d4d23ca1e063354043b5661048203b1d45b3d6d86f489e1450ecf0af3fc3250a0e12b4b80bc8b46e004005618cd263af06781cca0d5b3c92bcee1ba8d0c18c5bfb7fc1be1c00270a99fb79957159a29ea7fb5cde170876a2a65448edc9c61f3600e085bdf0748532be442641c6bad60e0e10e92c97480076088410db2f058d0981ac68244011fa19b8c22896a5ac850c5c2fe40a48026f65b9f019440840200002144124560ee0a0760503a808001b4c83a1081cc5400226041c8640e22a070150378281b8140da0a00131620d85a06b090350081a404005b026851db0af4420a2c364f95050708a6c91ce142047589ce61a0826d3c1c42d0e09b5de2707c20705f30eda0401d6b9306c51c0a9afed0f580208ee6ef4b8a94921280a2e1045eb72559c64cb84117adc9567192dda1c78efd4f3b56976871e3bf53ced5a842648d92d2ac802d6f81499b58c324769569ae4d0f5978b781134028498c2360000000000000000000000000000000000000000000000005f4ad9fda01a702d0a14408804204100054b063351eba2a1e7675b057286cc68cd4fa3930144ee73c3c74d490827db57c4ffd468b36d4e39c936c38ae4f84773c7eeef7658bc57327ca12f61807273347fab4ea9345bda4f8918dc6996d303fdeb07cd74b7f2a57d0a7ea672ac585217e5928340280019b083388ec9365f2e31a5c7036ba30c283575c1e573a0a27245a84869801db67ceac9ff8161e2161d28c0ff6e967f72080803b186d5c1090b66d5a32bbed75dcd14810e25dc4a2080124bc8e50209b36e72307c04885603f96b1b50ea004479239a29123c1a4a5d5ef39ceb6f3e5ac5cc4cda4d3f716e3926a555d2c502a4ca87cbb75e610429c871860083b5af101dfdc3d684600125fe4b2091881080400002bc833048138240ca120640503182818814000ad24184c602e6302d250300e80a8740be320281902f0a817454044120200100f80807804001e8a417017c4856aca8dbe91a51cdbd5acc5ad8c72a3d019072d71f6be8edceebc3741d6c49744e388438116538a16e3aacad723bf25c924eb3f4864443b82dc33344b8fcc4a2ab6440b736c1062c0140441c5373aee4ac085050df4b1df38c119a77e54d1704d249b329f2aeefac0b7a654aa74505debb5a56bc86bd29ff7bd574aecc89a71c28dfd8254d385e867def87f9a24088e46cfd1010010046019648e3611041e004401004010000044416c256283c98e5ba0135f206d38617aab82e51c03255fc4a1202ae541c48128610004000040c8000de1b142cbb38416048d509ab22041f00840100401000004460080200805a0100001b90590d02c0080004c882b86c1583500c0100460d4427ea7980667ce2b644083c010802008020000088d8ac7ba1b84e00e608c589a0705c4a9108c207c02000014c40005)) <<< 16000) + 0xd4c86926742543013fa0009e920a0c3ea9bcc022fa85cec38031b1f38e009440840200002144154540a8020530100018b1052210288c81402407e0a03e01000385103d3981c94e055520cace28b4a9143cc80910f81d71a040e4946d180365faaa4054307c0118571bf56da48203afa1e05803918676846084001004f01c860e277768185fca063b060066de1d6a11841000400002a48000bf104e0d8268681302609612c3516a49b48b248ed80f9909b67283a3af3295fdf85146b0b63701218604b7b597eb5bbd7f066a004e1979a476de036c3dcfd93089e12101fc05979e62c8ea3afabd2a2be48a8a3696613b5c527b10c9616015a44077effa568a0fbe0cad444f2e99a39ded506f72dbce0162116f3438b907d0d72bd5843e90e1370af30f8194f91d5f6b985c68e9801c29131f07d5395710f488b60f612d0eaa7f8410cc2ac49310528f2a3060042a0c31c0874da7c44e0036a23dbd200108042000020080000223a1e113985e0a1a3db88e3960145577de118210004000029c82504f0213ed5ad39d51f6eddbdc4b1a63706108111a8a3c36305a4707e38e43d997f9356bb209028276580ac363bdd27f4102d44a197ba460dd46ca6efd04581939953c92c397354fd5c4b09c30d90edab14d5e1574cf7f347fe4e99293382cb28029bde9ac51607a392a96002d90e0a2a75c3540299e19f0e66d4f0847ab66450b4a68eb539cba50cf9281422c22c2226f599c072220114e2ac1c89bf33c9d90a3eb92c34e9fff4bef28e381a05267725ecd46d11a25fddb7a73bf2483d6e9fcf41c07751dccd157e97e0c329953fbac40ca911b97b7a4f9e734253cb711b158b1b660564cbd461ad8a6800074620012944124550040100402400ec43fe03a12c12363b7434037f1366140962fadf24041c0084118e43d798d1ca2bd3dc0a1065fce100816e89e91a580293fa65894107c0200001f44000760d0d0aaeff78a1418447882402a293e2c280dd403da8090307c0200001a4411c2408c02000341208a020011e820883a039190218c81082408212034050190080c404002b2a7858c1c4dd0f0d923fbfb9e882c77c6e0116851e8bca36621de20e02c37482a2638484f7ffded9c3985f5b221ba5c086d9cff1c10623d1a38a79b7fec4eb197e1da7792a1fa3ebf1fdcd7d691f40a031e38dd3bb0b68b0274eb6d01fb2ee3122c98fad4fff420e7a4ea910b3b4ed1e72c89216aa698cc454c35bc1f273fd3ba501c103466485ab96b088dedb1ea7d78d46bf50435ecf184698c5408ed4c22629e7ca9bb8b87bff4baf34a60859d6c74400e00b54ad88bcd6fb56d1653e206e995b2a42d582d6c52b30ec09000000000000000001049564ebc5fdfcaf9a27d637bb053964acef2857c644500ab800000000000000004030100d4c087087044050680377738ccc513b9cb32a3a77d0c67cffa8ec1b6ca3b1ae7540dc398e37fee82dc126b45853bf7d006ae4ad66c04005f2ddc929dde9894c5b20553eba1a682d6cd9c3499be26d90ac04fa09be9e5449db053c534ee4332feae2852dea950400901f8280f804000cae40f4e607253e1479a12e6180c2257eb69207ec37f538204926a22920120a100042460995e775b9519c8d753cb7dade7adb5c9dc382090d256031e4aacc79349f8434e3414433a59bb9d21c2ac9193fcb50a5884c11ee49aec0851edc2f43dc305d3d5afdacaa74bad322795f541ed17336616a80594cc5e61eb5ab54f0f2ed72194644dd99a75a0a33594300546ca1633fd0f25bae67ca40c9a1f001e0480ec040007fa40e854072220381101b8080d80406a02034010198080c804062020005c420608a001166202e9202f4901724a02802008a055156cbfec8dc9d31cf182cb26d048d2de4d2b7ba942c8a06d329a4f1cf47b1bcaa611dfd21ea48d5d3bff90dccb700156594079b672d2404208f19aff5509a09027d08782cd6de9fff819b6311319dfa99147947f7cc32e06214b325c000178902d090160480ac24054120290901404809c1404c0a0250501202808c140440a0210501002807c1403c0a00047e203a9a01c4900d9e806864007098402c2ec806df19810976c9c5e2466ef3870e3e767961aaff46f860d14260b8e81a89f60504ce1f38dc0035ee585005c701fc6fbfa72944001ec203bbb8da55f83005450ad4dd3f6aa705045004a9cdb2fbd0391095a4976e8f5e8b672f06be12b9a2003a38ab891365a91d71c3bd08e44f4e650c1aa0cafde46e8c504d2b44ee5a5a4380671016bd80760401f346ae5c46880088009502f90002019c40c68620780001e620321ab72fd2c1cf42644959e84c892512c7bc230469533eb463520590e29020e18c18a00800602009172c8636018640b5bac31b0d9092466240d036ea52764fca07acc323923d8bf6aecd78d147caa9af5abec6eb5ed125ed69dd3cb7ed6ea600000000000000000000000000000000000000000000000178471c70c40c6084081047002000501c1200803400086080c14c05ca602c320151100a08800132880982e8b8af847b1b640a1a9dc80f5a9de5c35a050c05e3df029fbd9a9f062bd8c9e5675b58a0b0e6402565538be980d540fe911f33e510100097d9c209f8ea93eedfa3216771c0000aa08000329deb58a84e314f9fe10b227b40240ab95176b518343e256dafb1ebff5a6f6a26b9f6baaa1c0378f058a880fe2d0012090001eb90113500818803cb401c5200d290060c802c540141a0090d00406801c0400c02000ee8200a8a0042900190800874002020000100a4a41)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 39 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case17" = "QuadHeightCover12Case17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 39 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case17 private def zz2377:"s0949"="s0949":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case18 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l22 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l51 l55 l56 l58 l62 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xa8e021078, -0x585b03a48, -0x8493f74d6,0x829bcaa4], ![-0x585b03a48, -0x2646ce274d,0x52150b828,0x52c6fd51a], ![-0x8493f74d6,0x52150b828, -0x23ee45e00a,0x5888ca648], ![0x829bcaa4,0x52c6fd51a,0x5888ca648, -0x2c38f3824]] noncomputable def hinges:Hinges:=[(-0x3ed72bb8,l4),(-0x7dae63ca,l8),(0x29e4c9de,l11),(0x14f26808,l10),(0xef9749f6,l14),(0x2713f6ae5,l13),(0x6ae21f48,l17),(0xc917a0c0,l16),(0x612cab702,l15),(-0x2713f6ae5,l20),(0x1e6f839fa,l22),(-0x2c38f3824,l27),(0x2c38f3824,l29),(-0xef9749f6,l25),(0x40b4d536,l30),(0x2c38f3824,l33),(-0x14f26808,l38),(-0x2c38f3824,l35),(0x7dae63ca,l36),(0x2c38f3824,l37),(0x3ed72bb8,l34),(-0x40b4d536,l43),(-0x1e6f839fa,l42),(-0x612cab702,l41),(-0x25d7ae18,l46),(-0x357e3874,l45),(0x2c38f3824,l51),(-0x29e4c9de,l55),(-0xc917a0c0,l56),(0x357e3874,l58),(-0x6ae21f48,l62),(0x25d7ae18,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c38f3824,l27),(0x2c38f3824,l29),(0x2c38f3824,l33),(-0x2c38f3824,l35),(0x2c38f3824,l37),(0x2c38f3824,l51),(0x612cab702,l15),(-0x612cab702,l41),(0x2713f6ae5,l13),(-0x2713f6ae5,l20),(0x1e6f839fa,l22),(-0x1e6f839fa,l42),(0xef9749f6,l14),(-0xef9749f6,l25),(0xc917a0c0,l16),(-0xc917a0c0,l56),(0x6ae21f48,l17),(-0x6ae21f48,l62),(-0x7dae63ca,l8),(0x7dae63ca,l36),(0x29e4c9de,l11),(-0x29e4c9de,l55),(0x40b4d536,l30),(-0x40b4d536,l43),(-0x25d7ae18,l46),(0x25d7ae18,l64),(-0x357e3874,l45),(0x357e3874,l58),(0x14f26808,l10),(-0x14f26808,l38),(-0x3ed72bb8,l4),(0x3ed72bb8,l34)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x34180630080000010870078c030000004219036300c000000000f01880200000000b8f03300400000208c4090c0300000711440c8301000000000170188020028c92044068401000000248e4090c030000000002406200800000000a0c0cc010000e46216036400c00029108580d90030000000000503200400000148840d8c03001c4670580cc4010007118c120121004000000680f00d300c006115c3c01b10040000006229036300c00001881b0214c04000000640e01d300c00001845701b0c04000000000340620080000204610320c04000000a241024300c000000000901c802000008454340b40080000000000c0c801002047105806c4010000000000240c801000000a249036300c000000022140cc0100000000783033004000000000340c8010000000000f0320040000000019024802000000034180e3008000290d024089003000000003850330040000000d09028c0200008c321101e400c000000000540c801002246110c06440100000001705024c02000000058240630080000001309018c0200134210480324010004d08c1200c9004001582405809d401000001242100c8c040000000004c052009420a40420033500602882b822006d4014005409c1401b5004001482a04803d4010005c0a01c01750040000000026009200c000000000e0148020000000442c0630080000001109018c02000000001c009200c0000000012014802,0xb509802930100002f210c00a4c050000000b42c073008000001588c034c03000000000d4062008000000003901c802000000000c407200800003143600a4c040000000c43c07300800000198ac034c03000000000d40e200800000002a240cc010000000a84405300800000000160148020000000000b03200400420cc2201e900403182302b00f2401400000000050188020000b03215014400c0001021840930c0500000004c180e300800042118280a9003000110460a02a400c000021130602500200000884c180640080000000120c0cc010000a4421c034400c0d81421bc064100570860c508091740180000000906018c02000000000680520080000008824088c03000c42404c0cc4010007c0f02101e1004000f02106809c40100000008828030c03001d0340840784010003c0841400f1004000002105003c3010000000000b018802000050881024c30140000001505028c020000098541c0a40080004c1482c04900300000005834063008000001c8c40d8c030000c4521c012400c0000001d0f014c0200000b4743c05400800000001e1c0cc01000000000440e200800000000220148020000000001103200400000000070188020000608a1024c30140000000d07028c02628504144081240180000144310320c04000000000240e200800981604301e9004000084380e01e400c000000110d03cc02000000094540930080096158410269004,0x144410580844010000291082809100300000871c406c301014420638c07490050001248216036400c00000000130188020490718c301d2401400972041603310040000051054086301000032088300290030000004211014300c0000003912014c02000000054440a3008000000110b014c020000a44216012400c000000012140cc010000000000703200400000001a2c0cc01000000064540a3008000000250f028c02038c5088103d5401400034108300b9003000000064140a300800510d01503990040010c2405007a4010004108c1302690040000000541806300800621482302590040000000641c0a300800002e19070290020304508460246401400611442302590040000c8541301e400c000311484c079003000000c259036300f032821e100a310060001045a1100a400c00000249040d8c03000000000a805200800000208e40d8c030000708c1024c30140000001b06038c02000000000640e200800630c82202590040000e8660a02a400c0003c198280a9003000000054440f30080c60c210409190050018c31084096401000001e19050150020000003c6830340040000016084078c030000cc341201e400c00000000150188020000cc321101e400c00000001a0c0cc01000000321201e300c000000001e014802000000381501e300c00001043501b0c0400000470ec06c30100000001513028c02000000000b40720080002e010c00a4c05,0x391a014c02000000000f407200816224612c0449005b4096021c096d4018162246174077900505a89784102d24014000002c890054c03000000000b4062008000000002d038802040c6b0a3028b40140e115020405cd005000000000a40e20080e716421c0a4d0050000003211014300c0a20ca10805c10050000a8361202c400c000000110f014c020000000003c0520080000138110058c0400000480440163010000250982402d003000000001e009200c0000000006c0c80100244841cc0c840100000014884088c030000003209014300c00760941d033100403c82282d018c401400000108740d8c030000051058097301000000d42701b0c04000000003500a200c000000001b01880200000006c4406300800001a44100c8c040000000006c052008000014848004cc04000000542500b300c000001608404cc030000000584807300800000000b00248030000000036009200c0000019024030c03000000640b01c300c0001a01040098c05000006a0840163010000000190901cc02000000681100e300c00000349840d8c0300000000b8503300400000002a0c0cc0100000000013032004000000002502480200304b50d808c401016424640c074900500008082c0133301414124238c0f550050024c81048048401000881842d0239004], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((0x7940998ff5d1a55321c0128614f56882db9a10044f05c630216584c2a14008ff5bb2213041100403e4161f00b0f60587a02e2746f900d9a81d0bd03174a221c8cf7c863061483adf81c0015a855d81000820d6ab1302110042afd70e300000000280ef1cf2ea7cacb4084514514123d13d4046047001030000200da1e002cb4178002478c0064fde87489e2e8dba4177596308d811361eac5881cb0e4092a824090f2f5ce82e08814b0ad50537c180138d4a1c352df42000b80b00003f64000ca0c0cc325b4000000000997222a97790c097be0905235034f3500c509205100f0030100200d00012320440babf5c38c00000000a03bc73cba9f2b2d021138e44c3cc38c1013803401c000c08008034000468e9a268) <<< 16000) + 0x133b8ac0d302e8f941d991c591ed178c8371c216f7533917070271f4a53709900021b262acdb9a050e0e2667ae00141dd760040709c50ac0900003bc40023f08790ac184461f41bf28121d9ff634a8e0a6423cc2a17a8fe213461859d4c0cc043c44cc7f280101873a3c10032bb144927042200807c82c3e0061ee030f60187a80c3d0070330c96d000000000265c88aa5de43025ef824130c30b34a307346301340b71b00488971c1900680009d10f321079028000d88e90858e9dc0773cab92f6185ab6b00f986e5916ab64ce6e737d8717aff82de68b7e9885001e55620e3f89423d274dc2d3ccf8004e48014e0a1ac3fc6f5bf6217d20971fc0c7c4009473d1df5bcbcda4e37806241e66075e280476223fe338308331307a06a4487333c088802bb6688f0a9bfa784f45dbb6f9e9281c4fc12ff41ed24e536697add7316400c00001174e0eb0cae8b24719a91ee01ea48905e29cfb4a1e08fe68c2a05d847a8b5bdd3d06c78fbd123ac7e9b3246e2192a44b72d51a8927048a20045010ad1f1eb780fd0a7464bd79243a923807aa293638db8c65ed5e60d78386f5cf5810c9d0cecee37bc7eda1492c6c209c6992222b83d42b4e7dfb09c03bc73ff82fea256009bd34ed79db33c0300dc13eb4a610631800046b3053795482842922dd6199d551f31f3c5e2812157eb87180000000140778e79753e565a043592959b13080599631030c18c00400200222019e80284085e3f8994b75e84ebc52875a95b860ea432eb891e18b7e2847c73c762580ceb4ba3d95630ab232878868000caccd41162268000000002797bba5eb3cbddd2f6094abf5c38c00000000a03bc73cba9f2b2d02122492872472c21c218230111106e480200da75310a7ef1924368de5c127cabe094c9b780a9e4a8d0d241525de46f120bdd5810420a6f2a915d9a755f5616c0e91ebf81bf95024782302b641f02c65902781aec0b43072470c23011c0011086ffb6d7904fb011b4ba9e2e276bfc8499d5109ebcf7b7679c3552ef9309ee9b1acb194257ce74bc8edf17d8cfb63a2225238770b1c05e494298ed8434d292821cf40011c8d3a98853f78c921b46f2e093e55f04a64dbc054f254686920a92ef2378905eeac082f046056c83e058cb204f035d816658c40c282102300100222051d6bfc3b9f57d1efa6dae628db0a090e2b75d2026f31dcce8ca0b9028e86f8d496d4c9e58c79e3d38c4fe92990c518253d00036321e0520ef1507708800280487682e444d7c672cc78712abe513fef6184beac5be4b10904a20eaac47620013874d8cd8050269793e463c0801a1e074c0801457059af3e4951049b2b043e4210ca5991c20ed83a01501200009008260ac12c4604e0b9a822c44d0000000004f2f774bd6797bba5ec12a066192da0000000004cb91154bbc8604bdf048448c28618648418458040000008973001006d3a98853f78c921b46f2e093e55f04a64dbc054f254686920a92ef2378905eeac08333082cff6f005bc11815b20f816640c28648458230010000001986ae755af90b5fb85f0d58fac9604d29d9c0014791f6e12c48a2de995a8bc53f2bab403e09c5afed6b50d297698c308a5a0006cc69d4c429fbc6490da3797049f2af825326de02a792a3434905497791bc482f7560419984167fb7802e255a364c715b1443600f4f8fc992fb61cf73eb14a3d9304c81100000000000000000045782302b641f02d0a1481471440810000000352b5a5eca3a305bf3526b729d5dd5dfde4514b16a408450f66044dc379850b387de53e27145075bbfa9cd0f078c75c9f68ef209d310a2ec968dc0db72f5af61a21d117c7c1b0822f9c782b66ce594d51928a000b0243b41712ad1b2638ad8a21b007a7c7e4c97db0e7b9f58a51ec98264088000000000000000002289220e20c20c10608a00800400a20646caac0c0dab240faf258ccc86bb1e7f22e621f155c209c60d83e0218d740422131d50111811cd4b860f2b08fa0005f843b0f40c2520eb2500e0480039988371cf84ddaf8e3ab4ecca02721f6d388e72e783b440040b4b4aca5c6ad41a4833cefa7fccdc405a6980040aacb701701f5a38dd711ce853dbcdea8c0b0014446cd4f78d4665a21f0ec8eed93ba0edc83e8488800222842799a099882e066dc0b1cf95b75cd63c9a1d0070147806a48a7c47f5c472e3abb8f64c7f2ddff69c630a6f262206d100163da6af99c8814128b7d2d67d53534cc268594006b1263980004e638421ce04a31502302390ca16143bc2024f14cb43115c18247b02884a94630025e0523c7d28281ea08e640f2c8201284e50ef28988a02cf1d5aa7df2a8a00202fa12e0f3f290d418eb86007000025d21d4aa0e9310740ec39c461cc0a0e50140d6d4246688361c261f7eb85bc90c140cc9115051850863d70610cac40045d99f6b6e61c0570261cca418a009359d839d2d1540010495588e4e1d45aca3158902b8c7442d02844f393dde9bfc138e1ae815a161038d0d7dac448463cb077a3276f1b44a00091e91a6a0c112fbfdbe45e3c0b956716bad42800000000699608003b2aa28c3e2652085804889c0c1a949a271df8063c6987993e15345a8797bdce071f671653bfc101858003b7e93e04c084801000014430381601c2a2b1a69482971ea438b79e4ed6e527940039387000e2a37a3bedde9a5051a15ea6808200727063c868060d4f022308000e92d8932054841380800007cc87204fcd0af781dfd8c315a2273a2834a77fe294744d2629aed5dd73090a2aa26cd091c002625a000410072706)) <<< 16000) + 0x3c8c0138aa428861c007496c499002c881300600007b0e132038d4dd9cd2000895440018459872caae12c80c3e9aff6058467339e84083081db9752bb041009ef007a0180075e35bc5e000253d91029800c914270100000fc10e30de96212a7528428b21d7e8f848de963ca24fcccd292870aacc42574038a001406f4000a048f736016e60a0839297381e4280128e3f63f38280168e23642b0000a891c2b0200001121c28bb47e6702ac92618ffb38ca20b18895a3e24c10a1a050f81e20f49183838016afc0c1408017f1d7209057bcb0c32d30c004fd22e155987006837d0ad9981002f5240580480002303042092519c3cc850aa0eeb971c96122c37a043a1bf440a7412816fb2016202a78dcb74f24065cb247fa80a0618b1cdf1b4bc8582491ef8f784b96046470db5de9c08007ec9242e02c00012310e21d87082e8815dc535d95440adbcdac2a108813331b812de20e206669146020143000bebc200038256815d4712820095b2143d700200b6ae26573600000179e95952eb19106056040000222206a4305c0d82c82f8ec99d749f9a2102a7fcf40fc5a24881876df2b30a9024798f60e2602388303d9288f8084107fd1d3d6fb85020a622b452750a0841944fa42325003813f9f41fa000000012924f0b80b18540b17a0f1111630d3fd5ad13814326e7172c8cb0c280ef736dde4181827990704b20e182dc62b159a12100f0b7b6a1e08018374920f29000802550953ba234520a0b00918503e602feba361435f9942eadc8c12309b1cb9d0e8e982877109a919580c201c940a895c18820a426ac5b9f018000a0c23173010e01e1ff88a656b8200d47502dfe8480e6620a0c00d00004a040f42764e255e6a066e450a5fa69fd36cf122d196cd39904e5881508f907a980a1866dfa2419c01865d7d50ae2a80c01d72295453ce0008e5d48c8d848005504d23d4511ec1cc0b80b00004684218540362a000721200131a40074348701cc37cd7630cd1e183561430a3b708133962d7bccdd0a7142e5dd564e7a122337fbbde9e881477ed27315140cbb868b4878a0043ddaa472008dcfba0e5314061400c2d0c7f2232902c4e30d2cc24d20d1cc1c204700201c820080378c823b738fe9a5027f393238d21b1a6dfd5061029c64e78b3076d23930a10c01a9f94ef4898109402000029274b68be09e8b9853dfd3b61b0c24440dca59c410020e3d136307b958682469631796e8c24820026f2ff7cab3841280400005f08001e19a23511590a38a17e2a0b43e4914cd4c7555c91287093724c80d59c61e42c700414de5520200345126f6046710240080000bc9b192e0daa0fd8ca1aa4b678522ccb14fd192d59a40a152faa9796198911b6779fc8f38708e9d2b7a36bc900022464f3e70500168f1bd8cf00ce75f485b271901058048e30e3ff251b9bb602697e903927b0876ac348695593544625ba984426a82f2ca0a390d1d2b70c74270e50060f550ad0430e311024430289542e38d6a84080f3b25c6df17c020024d38467f1ea31f9c834801c82c34bba240ff15348b487479c9308afb2bc2103471434b1a0130773abf1e2224440db55ba718036a3fe9509c00900200002e270ac053f5b4944913c3079c6b0f39570ac972c757d6800ef1d4c4f30603c77a871d6b1302c62c119e9c61c564220318dd6765b63623708100425a06690f04e2400703d54780d5f1608002f926973e59e4666095e9208780c80002c22000e166884a067f1236c1861626247be40285957ee9c516724541490fc2d0328409478192cc8244965f94060ea203705a7cc77da1811d4bda08ac71c00ca08fd75b0471921858048000226204023000b94344285810913e61429f214f82497922ccfe13803311421a4873cd99812203c09033aa1101912cdf48f610c11857d81ea37880023edd29e20012c4e7af104c82020b0091a5d33d2dedfa64a614d5a8e7df3d441839ab6a2dff158060c63d2c8ae1c3716360e597819861a408035b41748fa384080890abba0442100125aa35302ec4e208003203c6971a4b60eec614d54d6c05e60fb123344d658ecc3289f5458d4b09ef52c408661944faa2809f2102f153801200400005c4e14699479fddcfc7ecb2609377828a800200e380d4840d1f235522c6844aef66f0f414a50c596ca005b12b054a148a44506de7a8ac0e1822ef1ebb5901752000342144041a42901000913635e47fddc1dd7501208760b80002b72000cf8647d78e21546d828a406ef5c5800913578e84484390248588b895322431c26c49cb604073ae9e0e1f48709989edd6f290a09386dc5d187180125de87f1008c82430ac09000043a43784603602000b1121ba3a01b05d93777169678450e2b3e256c3250b6c93a0dc0a48a6d085b1b4e488c5af0cbb20306600da227ee2000bf9f0df6018059c2029d200641a28fb138808280146974e6cb794249bb38614d64c167565416ba59010c6e2a2937c4d860e939d2538510e7d460c1157ec7af6aa1b658dcfb51816c041dc01020212cbf154f0ab43000b7ca19d7d7d89c100123768d7dbe4f294985a29003c064697f8a18292261281f215d1460fe5f011c6858e4ed5e590858d4a1a6d2c240a5b5fa580c2008ea2f6b0b3801200400005c4e5590d9016702c4c28b24b2071cb18a18a14800201c82008034000324800298191f57cdae95072c48c1a4dc9841419244fd0b1a576c3e102530ed8e8f176c80e5aede93a3b1c284136df3cd55ff1c15ab9e85e3c070c009f6f2cdd320119c410186207800021c206222b27cb3b852aa2)) <<< 16000) + 0x873e855f5964a1777596d6e524549efb11f7c9120f2821f3018346465cb25c4001fefd7a900c03bd6ac68c0042bc1b5226203098041a5bb6c89e170c29db225964a61205a1444553072eb4e2e269635efbd665282040086d38b61001175161df670425008696472c58161930a824226ba0e983a161c11ab4cb1cecaeabc6b060c06ed41170b2c6070133f7af102907c9cd82eca3821480a0000664e5590d9016702c4c28b24b2071cb18a18a1480020172100200d0000cb200082864795665cda9048c8094bc7fbc51439462fcc01221ecaabd1f92044aefeab2f848663700352a080c6250657b00a10c0ad3a8141800829bcaa402312204e0200001f6200103e4370561b60a0da0100090010d929039088360441ae220d61106a888350241a6020d20106880800c55c86828c0d4d619e6306e2d86714c33496198330cb0dd104e34cf00c28efa02062b381afdffdc4be200e3425caa08fa2210e0751c1f1c80bc757450163c8fa73e83d966100e52fb0ca322e25245555400006a4e783cec7a647505c81767657a0f982343afc91cf9bc17d7243fc13361e83820280200888a602e000b719cb586675547fa350886804899a39840be805ade9747c5e626efa4583855164c794319bb76f11405fc61badb000000000000000000885a18fe4465205a1e28e28a12001a01fd198804f506c871ec3141ee16d112b2cfaf6e97117e6c591c69bd398832370545a7a6e271ff3d07ad0ed9b8449dc0c943afb67887cb0a1a0ca783e60a84801c978a1ec6d596b33c045a4089cd66b7ee08c2cc73e5b987ae71947cfcb362390536dacc1b37c485e6cbdaec0491f851539c85621e05d0b3638f66dce6b95d6db3de2c1d895655dfd13e915abfd23006011f3dad00b14bcea4445c9814df81c03de42a3a93ff1f0a1de35aaa3f3e676c30fb1dbb79089fe3976dffca8b630dafe9dccb438d07a057ed214b069d0cc02b1276fb8ba2a8baa05a778a49f5d8f4c3f81eab093d6583f5250d5cde8fd949b5908257d420000b3243282723df9f36e207cf11c7bfb47d7c3e00178ceb5e3e746f8397dda15e8ba3a8b3c576d35adf3db4550bdd791b6d4d8f76a38f15134da04c55e5c8ece773da728515d7d9dd142d13d01c08c9ea44d189532df945a9bd8c3a9f7d59f9ddc3ce269ee288543d01d58e04307809cb2eaa85b5ff3eb5485a9ef9f73ede5db28d81bf42e2a9727eeeb0a8152be7f1ad464152bf7a7280955d9d526f7f03b0b4f2395978c84c9f099035a6be2942e41211eda957444cce09eb706971a4e15e8bb4b101df1b774ea94f9bd8d269b66a270aade40c7239984dd9c1bf961ee4da6dc785ce224f598b8773c76069ada941460ab52262796d167dbcad5ae23a4c4629700000fc840048a886488ecb8fef3d0596d7cb505b3f88cad89c0c585eba8c294ac5affed06121152385a1ea587c876eb8b90e816b1abdd8132ae04c9bddd53e2100066e02667d1dc830f504eb1b638d2f669c49731435ef7318b6603011c558ac6c846e0d87751c16297a1f361b0da936c4a0fba8ac940e00cf6eea59c296a5609e59b792d1b9984798956cec20ad7efd092ee57057805991f29727e7caafcf8215aae4170ea454aded9e00e38a881d5bfd879d8d226cee4a808396b812b77b2de88399a5780005da2190338fce5c4972c5a9bac7e72e24b962d4dd9d18b3137bac7b5ce7462cc4deeb1ed74105a2ab800c0c1661f432a290e89b53f9292ef25274779448e3b98000000000000000004454e7518727b1e9e9949b966027c07806dedd642d95790648e10000000000000000010de14032d0c7f2232902d4908804f005002859e3d3c2ae9293e5572ccb8ad89dd7d92be4cc2b693e9268f8ab0db7abf34be20cda0b58a1dca00d14b2570a5a7d4d023bc04f93b6a900339b259f4eb57d3914ef30c56286f3df080f48c8a3b783bbaac9413800859f216ee98ed29afa096f79d14803aaf318754db5c6a12d932f4001ce886392c12c8418c338860b3563fa38741fd7fec5822d664f606010b4fbede0048284001081327c749018105e9e46e3403ae5ffb6201c4e76338090307c021020c4f45db144b1683928300ac0d1af0200cb6e75b012060f804000034c8620680007588120cc31447c1d0a85790e0d3cafeae9896388616be895f22dbc5288030e5bc881f85a5ff5b944d04acb1b6fb7b8df4898f003a051e7680d263882acf66aa7a447739896cec2618039888ba2aca89e856b94e07ac9606630023612486000844327dd67788224fbf0fa1c140cf3007d9457f24610abaafddf2c909cb71e70d9f12e069d20e51908202832074c4a001b459f644d014ca88a282000404736f0024142100848a3971090848626593732307041882262025aa0cba46802e5baba00128810004344399f4a6c90e36951641839ff6c844706bd454a410126a3e6f4025101e00800007d900021b21882200032a2000ea8408836186139101a1d65645932a497fb4df4ec3fe8a715a37b488d0c14c841789d3a16f8a1af00579d22e91f312c7106066e57a4c6144a2575fdf0def5caf4839c40ed140b00d3d1ee54293edd2e00c93d2a6869dc24b6412c0012c196f0b82840fff39a9c5a1b03e25ce2f26278a0ac64b3b6f2b44711cd54cf71302723d25c912035672c62199c0931f5e9eac61d6ec8b1082707c1e2bc56afbbe4159960a33fc1dbf437473101af5f02fa4073e63676d5bd85fa525fa9b2ddc541485f576384e91e001b9b9260cda550122e94aebed78dbbaec8be92c2468099fa434284e3c3c7732d8aaa)) <<< 16000) + 0xab63c372917883f98804e86705eaaacc9e25cf878cc6bd191ca02b8360a0442312514eda83aa0556661d636f4e71b62414a621c60c210dad753c555b7c9ca182850ee240480e97e14db4300863dfef9002514210080000861e1555b38b6fe1c8ce55eaabbc93635adb97b761b6f23e2934ba638ddebbae722710755757c1e239b9d14d5797e8e5d56736f96419c057cf36d52da499ce16dbd086f836cdfdbdfbb5957fc5017c66112d490a77bfbce10a3ccd1e545a47f723dab8418e7748ce7de100b23a0b27b1d5b8acf2bdcbe5f59a7ab8677aa3c53f222d4119fcf3bfc85a2b0c046f83d349ff5e2097c612a086f9722babbf5487e62805b907bd1b1233414e8d238228885f538c243fdcbaa6bf38f7e552c744ce03b667cc7cfcc4a16d94327f983c110ccc2f00001a0885e0c8002fdc8139283080400217e42bca60036fe6020020080b80586082e05efeeb4c3041442e5fdf1c01498ffacc401545f8cf800120c1080400003808110c830066166320981105f8682f82417a020001da384f1b0fbfe1408e9b79a6d0006315e2ce5802d4682c11240c21008420ad62fde10167a1c4dac71a058cb204f035d8167462cc4deeb1ed747462cc4deeb1ed73c7e72e24b962d4dda3f397125cb16a6ea20a0e29c21612201805f18e8d15e4264978c2902565b541700d70afe59310888671899752bc6d797ec068b7aed686a0d5c349a9e70c06fbec11814af2a09b65ede2d0518da80e1114fd1a7c588230d848514453a51ba51610a372164094108402000020642f0240009bc405c378457f7ef40141838ae0f0ca08453a4aa4303bb4cfe124006695438196017b9e3190126102100871605023d82c433bb3b93a53df555e77d3594e7cccf188136fd980a1a5e892ece2ae4d59970a52d07f63133b4440195c922340e2923ba25359a57342d22b05343d11507800cc4e5fe933dbd453cdfe4b2c4b4863d35ec9e0184c00c8a8729ec3164d8be8a3747c64c80ab9d49af75d403d8ce0c0de7a39c4b9ad61de3c793a641fac9b6b72cf276347b6915ff35156af68720c2400e4a114e438e2c54fbb391620989bd3a8a238858219161893c39c608166ad8b5512821000400e00400022642f034000c244001d8c81a8cc0d0561761ba19fddd01f660525ce45150a0a9ad9c07810228f32c3b9e010582c0c650005355155802130e1100430897e38a7f3436b0a744094184cdda4f0609fcd28f861852ab7cea04002acc477e960186ed4964049c50840214195d5b0d0081882aeb188c132eed99c06166285e1704104af457a005440800101740a00011921722a0002ae212e0200042020444b808008022c41b033971104a2c754dc4408bbc7cd90230c2000840300401000004440003a0c0400401161848f3143440cede6116380f2cf384408c307c021419bd98a32187c979bb3011060f00400001ec80009f100017b206a330b80dc88984215341025714386c9e04698f642c500fa12159a00120c1080428532da61331436d047363400f1fa0bef1800fff1f4d01241420008708f2fadf734084835770482074011c590fba5c8442074010000098709941b26fa7012ce622f4380d0422e0e04618400100000aa20b00a0001b7200055a425c0400077c42cc741302a0006e8216e53022118290280064dc85196c2d8a616a13d155c006060b30fa195148744da9fc949779293a3bca2471dcc00000000000000000222ab24b1e38d87b3f95e5665a8b6bb6045e3ed56b42ecb329b40000000000000000084822dbe38c052465e3f748f29d9e578177152658306e49d1d9000000000000000002116863f9119481684022821821024800aac892c9d77dbcb5ffe121864c632845027ae7633b2c763ce9f5f022ef9712c773add7bcbb59c9cdcebf42da186b5b11981000914659319968fc0011b8d1149a53bb9a5740565f3e6e5c396b17a8b1dbb4ef101e1dc9153c980f421dda13759753d82596d083406eac85786c131ec0198144a9ad934b64291c45c96484a1c850afa5fb1c6cf08a88115626b296c5f1cdc5950a500ea9723d50759d0a3ae718e00885569a8c40d8ec712f020503db49934f8cbd13ba41da645293a48a4bee4becaa01a33b4b19d9f0630520c460da0acf86c2c4a853553590229ed987506103d965b0628887bfb96a3c04d099bbb0a02832bfe3827082100868e22f55f50461a98ee42b51e293bb9672a30516c30dd2438a43cd70270615e7fa69139302118043473b163eb51018315174df305850872d88c00afa31d3f2001d5c55ec8941088020000212400098484d04c0002616813b14614c52072838af725e5850ccc61be432802239c088c60096b132fb100543a65720002618220080000a090b3150590a82c4441301a0b0010002f010520505782c002594822a081304409622001098215c330ad15f0f31472d6ffca094d322ad96902bdbf0a5425fee359ee77e36012f28f7c47a222fd544221e87b3281dc8c762aeb73a43870c4e300cf98547043a6c01321a8b43bdfe22f087bbe4c1ef0270fe6c521cf3c5e9ffc53ae639931aad4ab656e14d7ce4aa237212bdb04e92bf9d1da14b71c67550a4ac0f06ff42d1a8f3c40c4c8278e914a5569413628f04ce3050a0a2c032e9ad5766246585bfe0c212bf3e3477e7da3a5262daeefc1f0ae34ec8d1a35389a79706cf39f8bda9e96333e0eead87076f6416a6c25a658228876457310040100448a921bafad12210040f14e48019c1e4ba8a040fa6bafa4808440100000db20b0038128d94518c40645e5ad502c08f34af5)) <<< 16000) + 0x18c008a9aa45409030840200001b642b0340ca120490100013110ab05d80a4205a903748e86640e0230a99aa41c1e7a943c2cafca555c700000000000000000011d9564364059c0b3d0e26d638d02de08c0ad907c0b7bb02617bb0260c44aa1feebee9c107546086046000000d6bf150828335f6e8bc592a5123266eb124b37c33b106470cc6cc2c5f59e1a91998c99800dfa4154dba652262671dbd2623219576de8fd8eeb7ec17b0ebd90343580bfac84a307dd0004bf21544b0a911e162d71c1fd3066bf5b9879c25575e4490b13f404d8d6282e0506fa2100437bc41f4c0042010c18f30fa0b96e8914ea7371d1614b114305e76222c61075c3231112030ff13b5ecd7b85055dd103aec2c9001dccd1979f48006ffea89d29be84001601600007a882c00ec5747a98dac8109ebfbe041c47a5c9f500a0ca4e07806082d29b96480a002d3e000818056caa96fc2708220080000b390980dd096ffc7f1b1c3a8f7c50f0c1b9d990a0840a66dde0a8083e7993aa41409baeae8f804c2042010000137212e0390d5542263a18232080b9645045546cf720c1545bf9820600db43b81c0008e162bcf8002618220080000a090451d00c8c82a0540981204b05000406109531053968244740c0320a615046028294160600a08a05000b7210353d82e0ac1642787a9e28d0312328423916f196f8b633ce59ed885d900f7b096bf331a3a9f5bbd258168bc61919e7e4a77dcb9c14a1a564aa816475113d272d1c7ad8d7c9e5fa270600950fb963c32fd4ce9183732199111073b99dec4a21bf6aa30c8ebac9c7fb17379dfce02ec29fc530974e8e88bdae87cfe98b01868d4199f0f865ae3b3307ca80802ec93b5d272f86221794b51d38e53c97443317cf7488755c4454b5da92865cd6c0a5c5185061d080ad173d071824b28132290c968c6a8ad778c965f19690351410dc76c4ffe90f975ad871771ae104e7899024b61161c43407960150e1c43ba583823c9cac5063ad757b7653b99a20a8d9d9e361c814b60adf8afa10a65199cab20168e405aac7c72586009296b7633d8ef656d70b2d9b7182026d406a97733df5d09cc8e04ef911ca24cb6c07c9200a80880dad2197c0a744224dd3ec50c87fddf10202367cb57104852cc0c5830011b66f70c00231823008516de5b76ea6863ec01b8724034502d0e024c408401165c78ca284030cd66990e7080a33fa6c925002afdd1e78c81044010c33978f496438ff9e04fa4141230717019200cce9b9b64002100840000401000004441600400024e4148340004684124040006244148440007f84114960c44b0a4258518ec28866084330a11585008c27c1407c0b03d0584f00809c070202c864197b324b3083c9e574402bd4e3e6bcbe8c83b0f3c371b423330ed38bdffad263a52778873bd73325a88774a4043beebd72b87835f3cc89024512c409aee8544440f133159715dcefc6255488a82c1846167f2914809124557bb1898a07506ddf3a37a0c0672b5d8efb71e6a1462212ae0845679dd24066c58fa5bd043763766aee0d0e90c40b410f36c8ea0021a8ef71c3a4f6c3476f3a24c0a9dc62ed22b0da11341197a2280e43b5ffce6d016ab1768ab13e39ef90a87c87704480016b564977f0ed976499fad55fc6f411d5a628b21d3775dc474aca035e1a2d0f990f145f737466f400d0437dd6073348eae60ad068beefaae31b3ad1d4568f898696bc40a204446b37113aa6854a4f1eb98152080f89a39118211db055a5fc407d0412f9957dcd0d24229d330faa11dc1a667e87a1b4e3a1db177e9fb43f895c3e03076399c01d92345725447312b4121b3391a24901f804817972bca3d930b125fb3aa7e2de000000000000000000462318ddab32d2df398b4648795ab9454d758947d43c97982e412000000000000000001119564364059c0b2d0c7f2232902cd8361bc4dec0b53851c520018004154008ad0823958e3ac1d64934a3fd04fdef5945d0fccc75e1c07475ee9e0e48b6f46e0271de2d8d1e1b6016192d0e99ea02945fc632a678c6522feac52ab11cbdbffe3c599aa85201b57dcc04a43d3b46ec31db67f990abca486640e0230a99aa41c1e50bb25208fd8e588700000000000000000011c9656d564819722809077b6f41cd80ef8573e71b5c91e44b9da3000000000000000000452d0c7f2232902de08c0ad907c0b430c1c72c52c0140001b7bd0f1355798afe87b04806c631ed76028f43b811786980a71f95e2d639dbff9d732380a290fc60a31903c11ee706fd2d0324800eca2375bff290fbefc904778dc8b44f14a07181013f611c805ce8434296a625f78eab5357fd09244abe21a03470b5e77500d0040a6dabb0240c22008402004011e7c8b03e9ecb005ad48d1412082100400003f10000bb213a130860984e04f4d42ad56a80d5fe730aca0ea2047de6e2dfb9a80abaf045a3b81eb658cfa5a43cb61ad15c23b0982768f706228c674aa1043f39227695de8a08410d741045780d16bbd87e0754a3d5128d597b299468ce54b75f48c25c8c037063c58f0b9b7e68e688c7567560b4b0dcf970dbd3b70da25597810a4d2a80da9209015201ed0dfc849b8f8a20e619fc0f961746d72730733d4b8a82df9692e215fc8c333808aa853edbd9c165ac1609ebbfce1497650189fb42e4511e5e800257bb693b15587be19e68f115379b1992405d44f33933801a6ac634056ca515f0466ee736cc6e236218182c35ff34aaae76e2b1facc1e609eedb386434e3162c42007894a33c501aa2888f43dcbc21862648c595c3)) <<< 16000) + 0x6abf2066d4899857bb7ed88dee12c4f0aa5afeb27e6d0afab75eb83457cc7863bbade800098221342a0721504d888002f4084c08ecb84fd983187151705b28e3c054717d5dca008622dc0f20020cdace6401550094d0880200002424268540025e442602400318c40c037020b77e0659aad5389343e63773c4f60355ae1a5bbcd0ab99455eac4d5a29666fafff4c72443bf26d90e11ffb9b010405da9fa5f4f7ab388e65de210626a2ca14d08a702642aeb8b115803447cee19b434e80a4c7ea3b062a692765bc381679016ddbe4bfaed9d0c12a2fc2bcd864c850a6731485a6a8961429a8bbc5b1c478a96ff05316c5b9875f32ca40053f849ec476e9779235ca432529ae8ac0530201e9a4bf22caa4e8da64f907c73d3e1ebb77e8415bdfe3552b23421310142ba7133748e586f4134d96ef4588ded279a503f319ca9e05bd5b2809bf32b05d05efef05bddc552a95a200004a042821019e8fb54db67c838a62aa3f2b117f68a60da9a0034ab25ff7b4fe14fde12fd649d74ba6283d4091834b8c23635a3136614c3b7495ebd347ddfe12b3b409316065e26bc17ba524352d7fa8853cabd9ee04db8cb14edb8d2cc1c0d6e21f3d88709ff1d76250fd7520b4c9f044d510b96e9f0a5908d7ea03585913e4deff91e28d359d46000170041306409632002f1d2132430141dc0000401165cc5df1f6041007ecab42480200913a41402a95902bd000840100001a84160074550db6f1ad0f4cb988a860fc860333e9373b51f34403d591e3606c0b56deab8c08bd2417e33fc439522fed3d34c8efbe355b9c3f975423d062b1c10b39ee330ad35d008084f2f53c994e4fbec1c4117592de9afe7b38bec6ab6625da6dde42dec26440233b0e01522faaa53cbb9efe731625ce60d64d6dabe9c4112387d88951c1bb847f0ef0160546f163263633ba00fb320cfa3c037cf14d469ddb64eb627280d277df33e66fdd0006280f80b7f6fa04ffea6083670f92e4b476d9ec539e40b4c2e4c63145a45c87c014e29e8d86f9e5401174d279f879aed0c90f5d79b341979e4f2e1c827375cb2e28766f5a7de7d8760a1253fc7e962ffa55bd2d58f316b05501a91383f3d0622fc7b37202b649a4b810959770a69a153e18aab08582d9c94dd28b6382adb64fdc67bedf791d62bfa80e5da7b490a312e4be79104bf7de5ebebc83b552ab2704c8185083e000029dc84c06e4912539c9708246acc9fd8a00585adbca280e6c5809e009040840200001ba425c0764073d298f241184cd8ef20c0113a440e8000c98e3ceb0004830440100000e5207a23e3d47fc4d10386288c7bab1605d472c5e2300097db5c388007ec8bfee020129011004000045884b1282549412842093210490e8244541202208f0d047068234241180a08b058180082280411203088010008381004f412019d6275f1b4e7dd8c3b7b6a1b9bd8550cdbca8aa553a02ecf99e45b68000000000000000002296c248e1fad9ea3167901bc67988e01113ba270b1e1a3003f5d000000000000000000884206182300280080a088132673c473317e301c4a7338bff1766e37b1f7628c2f0649a55309e436ba598b811e4074e82504000a20f03651fbf2d1a885902b148a9d0b8bb5da814a48178ce6dcc420de9ce84e9c49e1082563c002dbf2c8a2756af953974142205ae08264d2f6d5a94fc8b3f322f02ab1b562c4dee4695c4b50da000c6a4035fe48094da1e09d3514641ce1f5aae74181a4ca130cf59010d396c20224968b7293f41f76f984020e8efd7f0e7626ff600600b5e8727668e59f5844040601fc18c127caa8a3dc0aaa800413494f6d882f8b836a02e0f90c5acd65deb8cc867cfdc8baf19412c291679ec22dc22645bf5616c0e91f9f6ed9f8024059e7b08b57669d57d585b03a47b595ce4e00921056b17ef080b9f4b1282dc02aa4bbc8de2417bab0dbc054f2546869201bcb824f957c129953a98853f78c921b44152432031830801000009f0441dfaa556767d2d11d8493be6359165f866364a8e5ad600cf3f03986cf1509575ccc6a47459034c5c9c7e87c181aa5f60524d2650f5b05de3a2072a2b6e1ba8042e9ea8c024990d4bd11b114c05c7089916fd585b03a47da7c286100901679ec22d5d9a755f5616c0e91ed65739380248415ac5fbc202ea4bbc8de2417bab0dbc054f2546869201bcb824f957c129953a98853f78c921b44142841c41421000c0000002835d7b6683d076914f6fb399584d89eeda8a55555abe3771d3e60d60b3419e2160d790970f49ea86fe70cdae45ae9af1316be8c7c2fae8430044e857c05536a834b24d0c98429fdda7254c4d918b22065709855243777400e2e2842efb1aea430a2223b09e8417f2784dac280005b8ce583816fbf2923c000046730230080000c110006d5210e730862184290c06c17114c05c57669d57d585b03a47a836403100921056b17ef080bd78efc808cc02cca107105043044003005100aaea1b4af7fa5f3ec781544bf88d9f3c3e66d332ff3bfca379556dee461d48656288e1c2c021e5b9a03d8c082fd7f15fa282200d6a146080a3021acb0650000e4e03dc0e066d386d32008a0b4628260140000b210842d8258ac20c57d4f9596940778e7900000000157eb8718213086c695d6402d73cbe576cba225550dae831cd6dc470f175df5f82670eb80000000000000000004132842441c41000c0040051003626c712f459b95dc1b53ee1ffdb2341ead3b547fd29b65828ec031cdf5c755b6dd5a89c1cf4267b0022ea3fc3758b9301e58363c30aac61ce)) <<< 16000) + 0x64508211d8abe6a6277e9913025ec285d631cadcbf31fb95f2902b946b2f1c5a6f865eac502835985b6ddedaa257c1812f955509d35be6e99c1b06e5b00386c5306442881c753f8be90e773e368001abaafab43a1c77345ccb50d0a74530490a458de4d6284b2578f5d58448ca2829fc6055b8f0fc058a1188d49d5ed1737d0060067e6cdad78550231443009024933ee9092e1c78200512d65b04050fc6e60100480a80a90eaee3599802200d99f1597d8ab366af0633206254e39624050388002cb3cc0f81a416a208e57494b2000b2d05e00068ecbdbdee0d77381ae57f40db0f1608fb45befb3c4d00aae58294b2a0887d071c2d02c710eb8e56409a4447a1bb9c5900af8adfe9a393da945167027d3f5f5d90007eb9b8680801ba2d5231382110040204141000207f0103f0081f4040f8020001e320f63b07501f90c097be997222a9700000000040cc325b4092650527e0cfaf9710d0d0254f3cbb669b19001945eaf800000000000000000000000000000000000000000000005a23c93893092023c11c138000b88008037c970389e19ce269f93baaa309047d97b34808a938fc123c10a7727adc7043b4168a22400f19bfbb27002200803c8081e0040ee02076010000db907a11f90c097be997222a9700000000040cc325b4092650527e0cfaf9710d0d0254f3cbb669b19001945eaf800000000000000000000000000000000000000000000005a240a3ca34a14210224004000b880080362593d7800346a440b8c9fcda1950e70e604c680399c850db8a5176b677a011fa459431db7381025c9f17b8227805e8d5f1899c827103841781e2668ba36e905dd691a300193f7a1d206800b2d05e00060c236044d87ab182872c39024aa09834b0ad50537c160938d4a1c352c90043cbd73a0b87d08002e02c4cd206ecfd193f372469308c9e08474f8c143d4921895e61a38a07e52c0bbed79484122abaa7d2f831c20018c6812e4e613070c3172e31ce805823dfac344b024e0c001990604ad1ec55c589003504c00013e1ea7cacb4a03bc73c800000000abf5c38c10cca0a4fc19f5f2e21a1a04a9e7976cd363200328bd5f00000000000000000000000000000000000000000000000b449249188987989102061805c100401a0004f64001ca08188280024a0d14033469b5e33e904ee47932daf886d5632ecbc3071341bfe295a37488cd266120b8885efc255847a8a710016bedd9f464f2dc9050208ab47e0f44ae17038402111b57533cb9d173f0480237b050a16fd00046c439678410c4022405001e4140f0020770103b008000cf480079410751503a0a81cc440027ec4006000800d861001e0b200448041c8440e21a0350100136b1070090019cf106f4d83716c01005441c4ba1a70508be04baf2141eb4f30fd87008eb59e601405c68e9e3c009450880218530b1e4e9880e2c4d1d721831cec2d8dc60b97475e73081f2bafeb6ca00ab55e17508007820a9f06708220087187ac41f262440ed04a464710ec7355c81c3c3f2f04e430bb2b653372402eb399e8070052f0f2df9c0088021c613d6fd4b07115511505a1c39f680102430966501b9510039ab096fe50022008000083104a0100014c106d0103600800110c8358cc134660d42b0691183408c19c360980b04b0183300e863f4d8d2c840d0a7d77958e1433a734022401a81e6b2e00120c118042c60fcbd128e38a320c58f30614f8e7ea1292246beb87313400c326c6fc0800e040a56c26082300858c0a33624c1230fa03405e38a14237b0a0c2b57285db0489c9fd7a1c82082a9005a413041100400004e4e1070b4a0c70a222f66ff4f2831bcab561c406d0d6f3a2840e7ff1b17612009a5f35861002bf5120ca04e184601000016f20ca020490100022390470983182e033953b4e3c60c13bfa20510204ab9a6a8309e0ff825a20173344c5c4607b7834e161401df26a7a400009c90880200002ea4104460802381c0bbdf97214287a7f8c32205076fee272288c1c93fdb460c1a63beee8a1c4e8c40db98008c021038a49ac22050ae55bc0f6922808420662388282cd17c8a27440b6884287b5750cbc8c00e659b02f38011004000058c82500e442c9fa0fe860d56dcdabb1430d8dcb0b040f9697f2321420a638305840bfc8f8b10200670d636082708220080000b390640183180e0364d78526070c259e487714223ef2ad8030b2ad89baf10134580b4583077ec5e2631401341ae110009c50880200002da4114640c4320191900c0a8184240380a00068020c03205f150006f9905e3982e9c80d4a60b81305b0982d04816427010aae293a43051c65040d8a009236918a00118c110042c75b2b0c050e1e6fab2d289009003ff8a200fe290c0b0400a34694a824a20420108fce5c4972c5a9bac7e72e24b962d4dd9d18b3137bac7b5ce7462cc4deeb1ed741041679ec22d5d9a755f5616c0e91ed657393802471d6adc51e702ccc20810510c00a00500bf3021570fd754919e776107806ad8b788b93d5c7520348a33d1ab9f5f703657e85fdff396f12ac4d7567c96c5f16dfdea80e13fdf80ed6dbd671d608f9376e920dc68c4d922c06475b80202b0b5a9f51000337d1bf920011004349044522f80916147964b83040041014f4411313b126c1012ac7415fa50022008000083905801000108102b0d0003329057010003cf90561d8220ec154560a8230421182088c1003607c0303d0182980809c0705379548aecd3aafab0b60748f5fc0dfca81241cafa205d9016e3ad5b8a3ce0599841421220a)) <<< 16000) + 0x21400a00579e997270665ac795d87595cb9367376bc842d1b5bfcab3a4d1126467d762dd862206dba4a3f5bb15868c0b91284a962c013cc06848a00fe223d8c2b594da5ca5802fe093d00c00dbe02a5e13841100438a43fe5b0d183146103918b19c2440fb450ccc410dbd1c6e395879d1282108042c61854f22e9436124fe92071a88ccb58430a90ffae792c01d1bdfd01282108040000410800111905209002048144240007c840ec660a02304f0d81586c13817638d01bab215e1b04c7b00648712a6b64d2d90a47117258e195626b296c5f1cdc5950a206a1c850afa5fb1c6cf08a9603aa5c8f541d67428eb9c630022155a6a310363b1c4bc00503db49934f8cbd13ba4a1da645293a48a4bee4beca8068ced2c6767c18c14831000068040c0160380288a602e52c6fd51ab890ecbfeca0f847c82365590d9016702c8410808708608a00800500455fe20193343c36bd9e9c2cedff7ec000fabc5dda64a6c3f29bc6fb9e368a9400087880b888058440019804135260983304b15e0c6f93e081809834edfc00885078021c411af3f8b961f6171c870c01b742381c0c618420108147074befe6095847a8043406b6f259b9182108042008020080000222094020000fc2092020001d92090230470d82302e41fc4aa6609005a01e345c001135b42d822004648420100000ba208a5304425821928108560822b0401181f8880f80607a0302701e0dab7b35109f2e68ece8c0c8edb1ed62b2138408dc044142981d78fead0236faab4a5ef4b15ea48d7c6245552bf4e02e97ccccf7138eb0fda8e4f5f72c2296cb962b2da89414054942b1c1ff7769a798e21c96185b99cd3b2dc623f0c02d2b37c4260bad39cd99a20eb1e0ace0c231bcbc41c2325872bd05eda8d7157a4dc37f6b5efb298f20a5711e3008f5ff1f08840e002244db76534280d85084d1806d57e6f09840e002000027081e00e87107e662f1c4c4cfe3a1300bb80e724018c408002000015a4000780c0a984215341425714386c9404698f642c400fa12159a00120c10804000038481c80e07673daf70601672751604830780114185a8e809300d3489124044183e01000007d30100100400001118060080228400dce292208fb7786bc30e0495da31801ed17724028183e0080000d2301001004000011100014c206a2a02f0900016f903b1d8158ae888361a9c89c18196551bc28474f56e4f8611a065dbf27011ca2a7b302928a110042841acc35eec51047e463651832d80ad8f840e4e8f6dac0c33ec792b800251022008788b3234b2d183b96b16b9081ce3b542747044ad217926000e57c5d02404caf56e180cc204201000013720004c240e857029a363dda840e1128da926858a605b5b10194f85110040940d39c08a014a776d403806edba892004271c210080000b5103901e162a7dd9c8a104c4de9d4511c42c10c8a0c49e1ce3040b356c5aa894108002007003d78efc808cc02dc75ab71479c0bf56525859eaca4b0ae84d99d4d35bccd1bb08cc614a0c608408c00900b7c6765524dcd78eb1fda13f9b5f3b8105696524247c54f8aa5c12f747b8e8b04450db40009a881b86e895466b5a424248b96e860a0af1e502c8b01370e2800400391610db0494408402000021270b414636a03c4453f469f14208c3612145114e946e9450428dc859025042100847e72e24b962d4dd63f397125cb16a6ece8c5989bdd63dae73a316626f758f6ba083af1df90119805b8eb56e28f3816f046056c83e05a0c29e21411801205f18e8d15e4264978c2902565b541700d70afe59310888671899752bc6d797ec068b7aed686a0d5c349a9e70c06fbec11814af2a09b65ed0003ab206c13a278d87dff090474dbcd36580318af16720016a341608920610804000036880b8680017a081a8c80d05406612000b1320445200107e20644a0310d01802f0bcf78bb5c7040feed4e81053698ca40901e6662cf0300118053b80025182000840400401005e0a02e0500002610221d8168cc0b0640562302a1181486c0a00742030d67d689e052b0ecb897ff9f5b53866fa97811e48a0d0d916876229e6d5b0f7bb59092b7bdefcbb3528df8e02ffa8775f87327b3f1cf3b3631477fc36cfe1ba123c06b1212aa731f7364ed4db183ae4a7917040b066f12039dec252413d33d7423b0b7467301d84473a445a912077acf946ee58dae4ee90f224385778af478c82a4891c39d5e69d7e7bada29141928d8683590c50255c6302399c448fb6d60e9fb0f5781145fec50233c9010028605eb569b65d60e552c905741a3e153aca329c0040a4a157dd1924b35502d975ddb8ba3add1240145ca047b83950164e617c581d5d9df537ad2527851999f6e8717554db37ca1bdcefa414971dc4468daf81fc68086ba73915cbe8a39831ab36ad0d2a1b7a1fc749fa1c88813837ac5dc0883ff376d4ffb6938309d7fc2c8c19e16f7a2029c1281d1c07619bcc1a1fd3f7b992a9090c2801c1dbfffbdb78cd4e46540865aade2c5c940b02af4e21288348962234b2451cf4c7711dfe0cb698e5a204ef279f30859b415a52c0329196880aaa37f70f860b45f58fec00724b008bff93707e462c278781573848800e4b480caf53f346f58ea2ff21011640b677b24bbba58b15e1598598dbab431ca647d874a20ce2400003162000cac40945743840c7d7d6534d64dc2b8f6c95c8f10e533a7ddd18b0f13d58fa70fb0305533be6ff3ced09b3c8d0e8c4e224045db724a116e4cd6eaea372ebf00058989846264ba0013b281e2f78d31f93630e3fa)) <<< 16000) + 0xe0f9cd1bce2f107fd152d5530ca635db1071a449000063840035fc81390c0980701a659a4d70c15830f94c1422f6df17a300b271734050016aaced0015141f004710c4917d78dcbcd420267c4070b14267f871446bed2bdb845002edcadddb73789c6ea12348f00e3de2a250de2aa093e3900b00025a18692bc07c27cfa7b4202cdab6b1384f585c1dc4fcc00ee63be38d605ec54314602d3a86a77f3b1db9851603a00006244094478300f584271306dbef60199dc28ebc5048d34ec59436ad472983770f103b860678c71641ddda7ea7379a3cd9fa69e03181934f1f886a4ea1d2644fd35624029c8952e0689ed5866fb1a3cb434000175abe50a099c602839c63437748c302fe3294ae1c0bd36a51c6f1400001a91e20c56c692144b1a0090e3009e541d98200e4a027b012060f8043898eb5f6fcb083dcfb97a0021090ee3100dc5a715c048183e0100000d2204a1bc0e29713d4530a7ea4ef434a52b1807ecd171408dea30fdaa24809d294c237bbdb7c6c48a240be2380b19ae428c84dd86dc779dac9380e009d4dbe18cda2c7fa49845a4c59b9b0eee8d934fdc583edb0524e0c2a86ca314871a00001689024150118880013a8811048084140019c04080950104b0b84ce87af1c1c2cb9fde8ad8278e3f9d5da8c73b7e539fa7a39970bc21536a06b9b67b1b42c147129cc2f2ff1100c697c35c331178e6c92803dec81f260bbb3c6b1afd44d45f7f410907a62a8501c3badd74d19f451f4065d48938d0dee5fc4cf55a430cd4f4e042510bce73e6b40d2dcd8ed5bcc028781864f90440f23f145dcc409de59696ad47adede4cd68eee04b411f639126bc87fc1424a9036ea225fee839594031de96f7a1e0017bd77d36ed273ca70a486b3fd68edac8a013337ebf6b49003ff545bc85ea3b520d7eda20f3ccde7e7944134e631b50323356c7ed0ce93151525da8c94cd141041d97d0eee3820b7efde5ec0466fca595c0e561218207bb74ea23d925cec914aa3eb8d78b4d9331812d9dbc081f92efc1dd21624a0a587a71df3f90a04313f89cfafcf3e7c58679ba3775a865b95028862388d24d4fb446680bec2a6ec103f64ecf740172440926753f2ce0bc49acc096ff0a0e4a0ec3cf939286eee7b8b0da43aea00edabbeb728c33089053e14a49441e208c3c8bffc21e6377ee0570584f51557539abb64a499cc58aabe98d84ed456f7223098bb64dc120924044d8e3a991bce9a8e72f0b2668cf2d03bd49d4dce995802a81679cbc847fabc50c01d64b255c620b413ce4769d38cd85e601f32d876840bb43fdec5f0ec3153855007c384d3ffed601558add548fa017d7b89dc1d07c325611e345bc91344135605909f51cf5c3093b42b801570cd83343cb9db1e593363796b185bb1c082059adc62dd1c425ed72032348c9ddd5ddc58f861037f9923bbd61fc7a053d3208905404e61053795494b1bf546a64955565a5ad33c6208efa0408e69980b5bd2e8f8bcc4ddf48b070aa2c98f2863376ede2280bf8c375b6000000000000000001119564364059c0b71d6adc51e702d5145138604f00d36304ebd916cfca1b4b0746e4e52f11626daf95be52ef07fc18b2311358bcde334a3a6394a7733c9052769ba34f0ff60ff9ee0d68f4573fedfa919bd62bf2a0051612048a1ff628ef542a03cf52cee0889d06ae0fd03017007d1c612b6fc9094206c0200001d2601802008000022203e1a000611203c22000d86203a3200116d20385201b2580d0c80064bc801c231003a622032620182d00b8a80584400ac4c40542400b55c401c4ec8043111a1d8f7b4b570c0802eb02748a0fe7a2322f0808811efe2f86007fb0c82f8401fd20413ba000024c604801083547ecbc3186a64d95dfc29d07226375f951637443c37420000000000000000102650527e0cfaf9710d0d0254f3cbb669b19001945eaf800000000000000000000000000000000000000000000005a21841c21821421000401002f4f7929c90fd8baad25a9d2342e31724294bde08865875e31be68f5d296e31ce75e9d59dc86dd7ae698c02e953abfa02b03236a12b46fe480a5c86a4f3e8d045711a333717682623f414063c8b673f6254a4b2f15549e71e2f9018a342bd4d01c3c74404510030696452be54c50152ebf91998800514809c0510322548a3ad8f12048dbc18539bde206104aecab8500104ad8db0f5e7b12000d7fd45db761c00eccd8cffc56300101e38940500000fa0e385e058f8364150b9556b71f98dd3fcc84222a5c2a8be8dd58834e0000000000000000000000000000000000000000000000005f12492472451440821412801c00030280200db2c953f8eb9228acff61eac04a2008c6017fe2c6020a6f2a90a18ceabd65882460005b8d800104005b8d1ca100045f40f8f000038b41d13a00c881300230c2cd9cfca5cb2f435cf46d9307043dcf6e08b1cc5d6d5bca2870005b8d800208005b8d1ca24102336043781041400ace73140046300bff032104c008d348230537f31a6003d96aae130ceb62719b98694017b4e70c4d2015f80820c98417aae92a14200003fe01d6228000198ae359a0109c021852530d9b4fc4026902b2a09b3604318409c85ba9de8725900037e11d60001a303e91b1533224601239fd24c633d04005cf0905ee80c4e207043203c0000f110003b820280a0005ce2000fa6404c3400142e400301c8006aa10121d008828004c288081a803ca401c4a00d2100610802c74014320091500406801c1400c0200501000abc9004450019280086400202000010069a09)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 33 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case18" = "QuadHeightCover12Case18" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 33 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case18 private def zz2378:"s094a"="s094a":=by decide+kernel end section namespace Green24Proof.QuadHeightCover12Case19 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l17 l20 l21 l22 l23 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l45 l46 l51 l55 l58 l59 l62 l63 l64 l65 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xc0d219b4d, -0x57f0ff7c8, -0x83f4f1224,0x8a095442], ![-0x57f0ff7c8, -0x22b80c8645,0x35af795ae,0x606a1fb5c], ![-0x83f4f1224,0x35af795ae, -0x23c3342fca,0x581ec63c8], ![0x8a095442,0x606a1fb5c,0x581ec63c8, -0x2c03f16e4]] noncomputable def hinges:Hinges:=[(-0x3ed72bb8,l4),(-0x7dae63ca,l8),(0x29e4c9de,l11),(0x14f26808,l10),(0x33eb5bcec,l14),(-0x1d4382a97,l13),(0xcf94fb76,l17),(0x77ddbc37e,l15),(0xab7cea20,l21),(0x1d4382a97,l20),(-0x6fe94cd,l23),(-0x85f736f1,l22),(-0x2c03f16e4,l27),(-0xab7cea20,l28),(0x2c03f16e4,l29),(-0x33eb5bcec,l25),(0x1da696b70,l30),(0x2c03f16e4,l33),(-0x14f26808,l38),(-0x2c03f16e4,l35),(0x7dae63ca,l36),(0x2c03f16e4,l37),(0x3ed72bb8,l34),(-0x1da696b70,l43),(0x85f736f1,l42),(-0x77ddbc37e,l41),(0x33e48b0c,l46),(-0xb0c16e6a,l45),(0x2c03f16e4,l51),(-0x29e4c9de,l55),(-0x1fd162f9,l59),(0xb0c16e6a,l58),(0x6fe94cd,l63),(-0xcf94fb76,l62),(0x1fd162f9,l65),(-0x33e48b0c,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2c03f16e4,l27),(0x2c03f16e4,l29),(0x2c03f16e4,l33),(-0x2c03f16e4,l35),(0x2c03f16e4,l37),(0x2c03f16e4,l51),(0x33eb5bcec,l14),(-0x33eb5bcec,l25),(0x77ddbc37e,l15),(-0x77ddbc37e,l41),(0x1da696b70,l30),(-0x1da696b70,l43),(0xab7cea20,l21),(-0xab7cea20,l28),(-0x1d4382a97,l13),(0x1d4382a97,l20),(0xcf94fb76,l17),(-0xcf94fb76,l62),(-0xb0c16e6a,l45),(0xb0c16e6a,l58),(-0x85f736f1,l22),(0x85f736f1,l42),(-0x7dae63ca,l8),(0x7dae63ca,l36),(0x29e4c9de,l11),(-0x29e4c9de,l55),(0x33e48b0c,l46),(-0x33e48b0c,l64),(-0x1fd162f9,l59),(0x1fd162f9,l65),(0x14f26808,l10),(-0x14f26808,l38),(-0x3ed72bb8,l4),(0x3ed72bb8,l34),(-0x6fe94cd,l23),(0x6fe94cd,l63)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x74140a30080000030944090c03000000000c40e2008000000290d018c020028c912040784010000000001901c80200000b884340a4008000000210d028c020001248234026400c00049208c805900300000b484340b400800000000150188020000ec5e1502c400c000000002102c8020000004219022300c0003111024089003000000044180e30080000000121c0cc010000000000303200400000188a40d8c030000005219024300c0000130d0a02900200000000485033004000250c850099003000074220c022400c0002b10864079003000003c24180a400800000ac170218c04000000000050320040000000001c0c8010010c2804405340100000094110218c040000002a0c013300c00000c4110230c040000003209024300c0000000009024802000000028140b3008000000000440c801000007610c078301000001f150d029002001a44108c06240100000001a0d018c0200000006c24093008000001884409cc03000000661302f300d440a10440063500600000004c2406300800001341200c4c040013423048032401000001242100c8c040000000004c052008005409c1401b500400134210480324011420a404200335006001582405809d401000520a81200f5004001702807005d4010000000009802480300000004424063008000000000240c80100000000038052008000000110b018c02000000001c009200c0000000012014802,0xa43409022400c0000000d06038c02000000000680520080000008824088c03000c42404c0cc4010007c0f02101e1004000f02106809c401000740d02101e1004000f02105003c401000000841400f0c04000000000240620080000008828030c0304047082602524014000001d86408cc03000000064140a30080000290d06035002000150320a01a400c0000001a11018c0200000a834180e400800000000270148020000000b8240b300810c1c230409310050001086215012400c008c1c46101b1004000007118406c30100000000e05014c0200000007c2c0a300800001cc290088c040000000009409200800000000150388020000000009805200814124211809490050000000542c0a3008000000000a01480200000002c140b3008000000000d038802002a06814c07a40100000002919024c02002986614409a40100000001106018c02000005108807830100000000011018802000000521201c300c00ac24c3501b9004a0c90813407a04018000000001601480205d4a104702544014000000002d0388020000000382c05300800711843c01b10040000006209016300c000000001f01480200308460440b6401000000000050188020001a4a43c01a400c00a120414033100400000b112c0f8301000000000e140cc01000000000c805200800a11c84501b1004002c8a32480bc40100005d2088c04d0030000000844c0a3008000000000a034802,0x324760440684010000260d04c075003b0c908134092640180000003113014c0200000948838094008000000230e038c02000000000840e200800049218680a5003000130861a02a400c000020c2202d0c04000000821202c300c00001841201e0c04000128861a02a400c000026210d015002000000000740620080000020848030c03000000861201c300c0000018828070c03000000008870330040000000f07028c02000000024140d3008000000000d0188020000000241c0a3008000000000502480200000005448063008000000002d01c802000000361300d300c0000000035018802000000000d40e2008000000003901c802000000000c4072008000001186c034c03000000000190320040000000025038802000000004d00a200c000000002701880200208731880bc4010005210c3201e90040000007219027300c0c608c0ac03c900502844082602524015a41410f701c810060000000582c063008000000002102480200000004c180e30080000000011038802000104460a029400c00044118280a900300000844c180940080000221306019002000108460a02a400c0000000022014802000000004830330041011c2118094900580c70823407a040180000002515024c02002585610409a4011c318204d01e810067c060447c061c40180000001b0e018c020000000006409200800000000090388020000000241806300800019088300c9003,0x194be2e026400c0005b2886809900300000c112c0f8301000000349840d0c0300000000d9903300400091350d00690030000000008c05200800921181102d9004000000084140a30080000002521028c02000000c259034300c00a31f03501b9004a0880c134092640180000000f0a014c0200000710a406a30100000211e070290020000005219014300c0000001d07028c0200000002814053008000000220502cc02000007115c0c830100004915074049003000007115c0483010000000001101c80200000004c1c0a3008000010c190088c04000000000b4092008000000002e01480200000004c240b300ac324208d024990060000000b44c0a30080000000006014802a0c808134092640180000184470320c04000084320c032400c0061110150399004000000000740e200800530d02401e90040000003211022300c00510cc2302690040000000642806300800001441201e0c04000000000640620080000014828070c0300358890440684012c224304d024990060000000844c05300800041108340a900300210610780564010000010c2202d0c04000000421202c300c00001843201e0c040000000841c0a30080000010848030c03000000461201c300c0000018868070c03000000000dc052008000000002f014802000000f271034300c000000000940c8010000008209016300c0000000029024802000000000a80520080000000031024802,0x84740a3008000000003003c803000000000d01f200c000000002408c803000000000c00b200c0000000034030803000000000a40e20080000000004c0c80103145904c013a40140000000019038802000000003500a200c000000001b0188020000034094039301000000000d402c803000000000640b200800000000dc04c8030000000000d032004000000068004c8040000005827013300c0000001b11018c0200000691040323010000000001b0148020000005821013300c000014848004cc040000000584807300800000000b00248030000000036009200c000001b84402cc03000000640900c300c000001902c070c03000000064240730080001a01040098c05000000681100e300c00000249040d8c0300005186301d030140000211f0a02900200000000785033004000411e8500990030000e46a0c022400c0000010844050c0300000746c180a4008000019c5b0218c040000000000b032004006116013014d00400000611540863010000001a0b404cc03000002104408e3010000008c1302b8c0400000000054092008000000191602cc0205909190301d240140000312e0d0290020000000b4340a300800024637009f8c05000009119803a3010000612d868099003000000b251036300c0000000021018802000108260c00a400c0005a288640590030504718890133401400024638c0740c05000000b219016300c0000002d17028c02,0x4101c802000000461300d300c00000000310188020000000001b03200400018628c0740c050020c6c14c0ab40100c210a18805c10050000c8461a02c400c0000000003c0c8010000004219016300c0000000907014c020000004219014300c00610c41302ed004028c3b043028b4014000000000d0248020000000443c053008000000000f01480200000480440163010000001282402cc03000004e0440163010000250982402d003000000001e009200c0000000005c0c8010001047431024400c00b218c5303110040000006229022300c00000941d0318c0403c82282d018c401400760941d033100403345288c00d84014000000000540c8010000000007805200800000000f40288030000000007c06200800000001101608040000000054018201000000001301e0804000000005c038201000000289240d0c03000000005500a200c000000002b0188020000000002407200800000249040d0c03], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((((((((0x40b09a95ca89c5e9d1c5234d2e68005fc8690046aba771010ab1078e9600db3cfd04a0002608ac213841080405a8162d20b89d763323fe40eac567447a21a1f2430c87081a66b4f8700103f0a822504210084500304eff3a42878023c34600123ce0828ba68289869cf7c0f8744b32e6b4f6242848023c345ce1206939379cb2e40074c52463d7c880029020510000b71aff143c002dc6c0448f04bb92c09513c4645eaa7b48a0e077f9914a0c45ea5e05b4811f7087174110337393b6ee2c022d2a5322e2400980400003cc4000f44f9c211c141a5d246a77dd336a1481b1b5b949061a43eb011d85ccc805b1b5ac4a030c0fbf53ee41307009b2c0b6285120360edf5c6061f42020a80b00003bc6268009a7ec7281c6853e1de98232260005d6a9d499e601ee7f90bb80e10a559c7eac61e096054c38d8c22004a86efcb9e9c04e03e129f190001e8a15c753b0406160140000870800490903d0dc0b0a0acef91c5cf3f21aacd2e683f4c7c70c6a901aa2341758f6c188e081fccd0e8b0082e741724e084201016a058b480e05801c9c3800e2c8951a206469600726fca838677223ca81a009659ba6c00d06519091d2070035c18b67700fc4fa94654e184a0200001a622d02203d050001ba113c1189d88ee20859887b530d349d302120ce26c1b8802712612608286604700680580008260900401a000242459c47a400861b6db40164391c3cada7e142262aaa7ee9f161df7cf8afab41a11aadf7541c09410f25f29295d1a0427582b0e748e0001dcd1cbc0002821f420b0b00b00004004598c783c527d4a44c28b39450e8158dfb110dcb1f920b382190e47dbf1a24804d2bf1713ae9ceb100170ba8e5b7c4a47638055849e88144787f0803e02438c46cc3cc4022003aac28bb09353ff030a1ab9d5cd0f81f000053841d437fa844e5c4000000000fd42272e1cae93c898c25000000000000000000000000000000005c410b310f6a61a693a6042419c4d837100891cc1030c20410411e83893dbff941bbdbd487f82f7e2de7dfdd71ffcc51400a69993a9e6013874293064e43a09e604da0127fba9f69fa9ee4e447dfa437a63b8806c6ad3fe6976a21de600d23f299b940657203acbab78134312986f1877072320748fc40e28d6e65d1810ff3e396080068319d3c1c03059cbc080100065302200800008f90d52d0b28a800180c8af8ae852d7a13aa) <<< 16000) + 0xa18e2c6e5312382c7082054cba916480f63a9476d51804b7ec2a7cb0083a6cc8912e408f25ce677004442d28faa0148b536db02509759130bb6875442902000010f90634583084ee20859887b530d349d302120ce26c1b8802610490506306186180001b017fc4ac189191167b03ca34635f638401575401e3b22008f3714726d4c04a4c2a3eb7f6425896d54a051ab51ea85f8855a655af17a3103184d0fd7eaf0bee7d5e17db4006b5d5aab39d203ea1da350efc56264206bcc0acb3f3a5de0a2130e5c0d419002b8ec3571115982b60a069dff620000000000000000008abeeb6b14326d703e29c8c905f75b58a0fa1841839418c18e0663c929143cabcec26e2fb6b22bccbbaf2fa071d7c691b8315e6c2def06f3862e04a73ec9b7b0aad800000eff30f22eba94bca5490849d68b7537149ab67630bd13e4bae77d58c18b204c9303741e0ba989fa4b4001590fea1139714ae93c898c2512c72c3203242241081080008553f50dad8fe7a338004639d4d827cb9a2204f40005448af88e59f9d2ef05109872e06a0c8015c761ab888acc15b05034effb1000000000000000000455f75b58a1936b81f14e46482fbadac507c8714a0880440450030100004c174e5a6288d2118819ac3195af86972705dcd131913be673f14ae3c0029f619ba1bfd02f31b5049215abcdd0899d9b4bf5bcb2679080fd13a2886e2ed806bdb9281ab059f1648d971431e4a22b36ee205b0ce19fe58f3accca0009a24590d42c63a162150a5828003c008b086ec632cdf529491a32fd12971836b998e63c305505801470100190a088021631b01e8040e14ae6939699e4e52908b50c1345a236724687d030c1292b6da5e703ba01f8e55a29327ec9007c306d82a83bfb259ebcce6978d1873f803c988fbb8ef0470074a850acea28c1610ae9b9748f7f38bedbda168250c0294a4c04deb96956633f307624e0ad960c34c03314010753ae0a9bfcea8274ed08919576f33da41ff7a8eb00328b9451f30ea40c876942236fede40e41d4a29c8700009c0408c962c03315f11d0af256af5fb3b284084c7a257d5102f929e6fd13669815040adcc26438a855ebb653c80cefc6470e716e0c06d999f70e2c81802fa174621f81803d97b55723b0fa519ecbad6b22011f9080b3a8bdedc6a66bac8480021d31e9d68e61a9a7ab7d9e277f04f181d77b381a6f07c65c87d3183af6c7f1d363eacf8ca929215e2b931e090dd95db14e1984500008a4418ce60c20b05605cfbf7da2cd0ee45970188fd5e1f9c65e9114dc8f5fbc935f9080000000000000000086550a8b96d5a05afbadac50c9b5c0f8a7232417dd6d6283e650a40a38a284202020000138c3ab6079987a15f071e9bd1afe0506cc4929c8825351444ef8482601b28bfa11500749f7a40d587c36626abc9006f357276d2db13d7ac7a65d0276e775d863d5a6f2eaa82184737b32142ad7e5591471666a53016b510540f334ecfbf7da2cd0ee45970188fd5e1f9c65e9114dc8f5fbc935f9080000000000000000086250a40a38a28820248030018082000a456aa216a99d6571cd857f5ea7b4c0be827dcb5c3461b19b8f13437dc665abda42ecd537037c59b0815245d0002ef22bc3200082b20448215d290ae048004d6082508f84fa8660f9bb3c9ed88c67c40acbac7744351facd8e6ba040a129c4515654bf1536d404100af9054f8502109ad0e0c1727b4217c912dd6e0ec600061cf51f4a65dc231f8d1c2802b184f8206809c6e81fea488ecf33fc1ad2408bac5606dd8e5dea82af3535d6033e055c2f9cfd360530c80001c79c09d7a29e33328304a4ca275f34830037df9a77d60140d92c1bb2e3d0803272361e1c49514102671a89d05c2887f853b05a4e0188e76e07234a030a91cd776818a2ac85a05800022c22b6aa15a390ac8ec128762b03b157098ab028554050346b9bf9cd6ba384e57f863ab170c14d247f79a0ce2840df59c09f6d10082b18dd023804005bbbe7286210e032a65c2a3bae28010b4ac22c9328a808a08079ad73c0414dbe6140b80b171042cc43da9869a4e981090671360dc4013cd30b3493093c828134020030080200df3013e986589867bed1634134abbd1742f6693cfa77b308c248ca7abcc92000b1199592c084600800013c371042cc43da9869a4e981090671360dc40138b2cb3093082c82060821800c0400803400044c8aa04ee20859887b530d349d302120ce26c1b880269669459058e50e38a082280018100100680008b911d158a984ff5089cb8a5749e44c612800000000000000000000000000000002e20859887b530d349d302120ce26c1b880461450e58c50c4842044000085c700401a0003ca4548462300b15105c8d57ed0bae8872850db01b71ba4122dd6559a8c264804d88881bd6f018209f2954d8f42c005b863d76180e003e9e346cc602005961ca8770480208249e72f3f14b2482c2d02800011a11110588802e60c2014d558253a20b44431d6284a248840838828638250080200018f622467c62bc0c7224b47ef66fba5429292a160f6240f5dc10b85c9716aff2e434e212d90e46387113e80011790760d82504c1d4260e803b2437065c860246904de408e4916e22a3dd97144000b71b0008003025586b00c0181fb516e14040075bceadc819f8a32c68002b453bfc72332213006245a39dcaf9f00640a1705347853c461022fa31f9d5f86182fcce29d44014201ca70da3170204076d52f4e1d4600530e527b10aa808204c51ac57fc60006183e17d35544533a2178180000920d)) <<< 16000) + 0x11105d59ce5882441b3e1582d84902610fd345f4cc71042d45bb5ea85064447deb5a6608228f989012630a01594f0521da50041110eac86093c0010272106a82a0f79d20b40a000046c4001a588009871150418a79ec538b743e3480cf690f2c608ee466b4c850d8fe92d0fda4b163add6a27e41429c91d41cddc2444a8a30a954820658896f4d4b090817ce0c05fb0a001767d450ccdc9002b0206152eb09753a28717a278221163257a09407cb14d06a16f1650aedab69933141076baf5dd02004481fe306700250080000bc114d0589e02c4ec17a5a8b5fa7358c293f947781a59078138ccf53074347f141618311a08fcadcb1a51d17d6fa1001144af82e670425008696dafad3bd33090f28938c9164124a83cc4cc1e30056faea58cd19a2b71414019056c0ef9302128040000524dd197d9216d02eb42982ed55a14c1769bf7685bba3fd22c93dc25230a2c92c82872c6285080f8e543e04b1f7ab7a01cb8afaf1ebd4f48f75e379464a93905c11c054a2740200022720a00200053522980bb2509ff68ea7af9c4288685541310de72c0a1c061c984dcf94611860a4d7138ca5c6d0a163d0c2e561d2807245021b70efc3a01c091084f8d0223a37c81c1012ed746fc6bbe01001fb6662ca8b3006ebcf49043a058714e00312539d77ab8d148ff4f9c771a92a798dce62db6c56b5a5f00000000000000000004912881862852452842442031c030080200d0001b322960a0db050a50285240400099e45200628e03146018a280f8c327ccd6ab13471241321f0893b4d2635c62e282fe9c41fdf141577b434814d2c86877f460e3d38ea4e7c08a186e4c1f9fbb498101ac7cd86ba620001a54cedae59ef2400bc0b1e6ced40e2144e24f9d1b57ae69253802fe9a3884169f6a8f1a42bc659594880414a452654080118b634c89c00940200002f044f0162760b81d03afd232c3cd4f4abf8809e5203489e8a8e2865699d9687925cf644bf13897b2fb8c4b04003d4986e427002500840ea79c1bf813cd94d0363a03cae8bba97df38a4d96b9567389d2ab963f92c71610133e51802083c4f659c00900200002e46e8cbec90b68175a14c176aad0a60bb4dfbb42ddd1fe91649ee1291e69c61c49a49a418116008060000401a2740200016e2288020004a421ec0bad0a60bb55fbb42ddcebf7685bba0e6b880f9a1309a59249a418418392294086096064000401ba5e2f658a93fb12493e23a0bd4d1a447e624116d918436ab0dd796a9a38ea8cbc2ff6183aad1b08bb5e1620c2d764514d140825dc9318a494003c460ece47db2400b00900004404304142720a143050a1008000f08f18427db5d87561c4a52b9beec35a693fee7992a7de9c43b07075d221c69086bbcd4fb6b183ab78a012b3bc50c80965149a149810358f9b0d74c400069533b6b967bc9002e02c79b5a2bd4b2c389407291b611a4854deff16ce20f5c16340e690ee6e20e1020103b8149a3820051e566a8e700250080000bc113c0589d82e07460844d2f8f3533797e3b47948f4a51c0d3c9266ace40e1c4ca10a2a460b1c02187ea4a100113e48b109c0094021039db5908cc0f36ab0b60e48f2ba2eea5f7ce2970e1eaac8e27102753ab8b1c92c7524c4600784de84b6700240080000b91f353b2291d61eae30e324d8ef0e9358c40e26b09f9922d467d8d2466073dc664e418d212b493fca9b40b0a18082e70874aef78c08013936d740fa7cb001d7fa244a24510200051b9f6c5e7aba17141200700a813a010001569144010002f190f605d685305daafdda16ee75fbb42ddd0735c407cd0984d2cd20c20c1c914a04304b001032000200dd2ec90d5622a08924bc555308168d2296fba887bc8c2131a8a2c23d4d1c32845c05738c1db77d252ef20b1091e38291480a04044c88379a4a002cc4c8bbdbed92005804800022021820a139050a1828508040007844003784e972cb27bbd99da69133c78c9dc62c6106e3d9cfe64e460ef9a9a1f3694848a1ea424cea2fc58826fa77fc153a58408ed44823e2018441ef7f8b8c1c380046377cf26414a0900300347194249f99663483d7a8a9f498412e001be1cd1d103d509ca60eaffdc9a121c104d9a306c020046c9b9046700250080000bc113c0589d82fcd766b74573638c738e910fa93898877466ae7388149f7a8cf0348a1361d98782860094e636251010c2e897ffc080070a10c866a4001400a3cd080bc95271c64cb6746fd4e25dbc98242a6923d41ecd733486cbcb9177143051ad3bc9c404434c2891d3801280400005e0f18f713bfa3bd14f1a5eba7d712fe82b6691c3b823f4ad6db1841c2b8e92b51c4268e27ed676728248983b48d76b4da2c4c58402225ea7cad7914005873c6ffbb692100019c9e3a8cd51644329003604c09d008000a648a000800188089f82eb42982ed57eed0b773afdda16ee839ae203e684c261441060e58e60c58c40848250190001006e159582b971b444105003fab227460f2109c7ce32458ed8826411a0a60c4072398309c58ca0f681570105062b8db8a868048209399b84bf24800f4f0cf4fbf6c9002c02400011010610504f02827414138020003c2228202000e4722820be315b03905743f1a5ace8472775dc348a460bad0fc9a610c867d385d924c1e539dbb76a1c122903bcc54be072c2057a52c449082025275d06801e87000ac59a70d246544801781838ca479513c91a422272af670c205e1c6e3b468e65922f821307710475ad88e0829d357be010026dc29c053801280400005e089e02c4ec17e6bf6f)) <<< 16000) + 0x2b6bf0e30e540fc102712e4978652d3488d7c1ef4c14301e8c1216450025866d5501000c6535f439c0094021e698ee0525c9c6697a0f8c51c4eb3a818699a4d98eaa4199a44169fd2f7143169b595ba88013352afb84e00480100001713c6143e97452d95861a5d152a84695a6881a44a1159d726565b1841d0a8c75e26ae3183a1a811a91a0cd6122848550335be3cf161007a11833df33f94003b030927e97e2040000c74cd89a83742e282400e0150274020002ad2280020005e1227e0bc2b8f26c51b008203ae068aba0c1eb438b45a14b1d874b5ae3f8b18db94cb64f0810201b1d858890433f5c47abc1001380e3f4ba900050028c2a17582620688820b8258650ce8c1e8a6c4261e48b1d447fbbfb014c18054cec4a038b19de01b3c5220a094a4b93b8c0090406646e933e49002aace26037ed92005804800022020c20a09e0504e828270040008a678ccac280bd582a348bd9ba161f4793080bab77c8df113470163868e9854307cfdac95de0082450d7bfb5a4a3b2c2057a52c4490810137f7bed40eda1c002b1669c3490ca84801801a38ca3271602c9a41dff04602cc208605a9c5668e906cff3493075b814513d8e082194287c4100246beaf5f3801280400005e089e02c4ec17e6c7854d57d8e30a5c2e19c0712d878e19fa38814da918751a43fcac77dbca1803a77ef6c28013077b3c308005a1a706bd0004a010e320c76be84a71270c90a1ee3498753440c99c41bd05b3accd204c782ac1e50c33e5d7d6f1c003c684d134e004a0100001783c63f442e25edf97234bd1ae1cd7e8c3dc691c6622b49690290c20d2c3002eef3441a38c784450f23f3a307696d7afed752305840214201b60f90ca002c39cec90d083040006da3b52cd712c88649003705009d008000a8c8a000800183c89f82eb42982ed57eed0b773afdda16ee839ae203e684c261441060e58e60c58c40848250190001006e151029a2a2098208286f7591c53183c8e6a64896e8b1da9525426c5260c4910e88cb742c64f7e204da1614295484c254470904119846981b24800fbc852dad7b62400b40a000045441841413c0a09d0504e008000f30800715913e0509e8080073a881114c0118e081698ac984a27542dd2e50e71392f6680f8a15bed6c3ddde192293b0b5ef786e2443b7ebe4e53e030627731d5695cc8080d8686d4da406091586e97cc2810001a98e5a1a207d09042f02c5934fa28e20528813e114e27142a4832b7ea8914067281a1648948cfece01201092e5d51d08082171c681c1002369528f4d0084a0100001ab22780b13b05ffa45927bdfbb42ddd2b42982ed35a14c176a094b7323cc0b9c0b230a2c92c82872c628510008030080200dc292ebdc0b3e593c17548e432c80362058dc16336686e8d34a195b45e301250a3adacf1141c424491737213821280400005e8dd197d9216d02eb42982ed55a14c1769bf7685bba3fd22c93dc2522c928828728524524408094784145a2643e8bc6a79b377c1cea37e17e8fb3ee10c6ded61c11c856a2740200022b22720200054b22700ba20ce8a2af5ccf914247e580e7523707dc09190b2656251a02d9145149c82f203ea0a0912e8021ec65cdb172045f62d9d59ec371080cf72443ff727e581810520cc9abfb99a01003399d6f1386ca8baf3d1200740b891eb481427393048d58c09a3bc5c14525fe420713d10243ab7bbec9c490e7388a8bbfd04065128fdeaac01420a7e229276d0c08406f653154c60015b3f2511db904801681400008a889b8281f41426c0a1350509a0080015688998cc4c80426202130010978084b804001f3a44b4e42587212b210951084a48425032052090938484980424a0200657d2248c31235d89120c128f6242731202d83a8cc47c574416a979b9cdc040c6b5db6989a82007925480f89b8702589601598ab14033dc2409161c200c7a9d176de64007e5ee5c4309141011410148241971bfa2918241fc9f6a013d23fb6805eb1999f0b80c1014010046809a7b32cd9b6bb8369f15d5ba15b521b764eb5bc9a3d909e01775492ce0a785fbab0a2172d366c7fd74264472dc8b0e9c26126005993a30893627c6771bb4f46f55ef06dc7b677e69e7d5aa4335468f0e34d2ed00a21c5737f942af90875156b464b36590e90500295e18ffc6df2f990c326277a81a237800310d5b307a1bd6e51663b19502a57252b59282a302254ce52866ed81af0aa2cf1c6512cdd9701e392ba3cc9b31805fa1176211a106f18044e877f6b979600dfb1639afcdddb148f8aeeaf16f468096a6f2bd7f5f64541ddbdc1b29d4028c0ca8aec11526eb68b1b0a355b45622d7807f35b926a51a6143342e229edf0b8a6b733448c2641731451f91eabcc127e00721c4bb5c54ba3f067637aa215903e6c18fe7597277290e9545b5fd83213b88e8d4584cbf6d09c3f50d754bced5f9a457a4f63eb79109b9b69b9fd12185b4e5db28ba05accce9c31c9edc77ccec5147d9429452656860cc418a4383de4c72e4e927eb6c42495080000700447827cd7101f357eed0b774bf7685bb9d5a14c176a099123e91099980b40fb87a2909f1f9290e1cdc1bb921bf93dee1432205bea203d5e700000000000000000011cb7323cc0b9c0b438b2492811010bf1b55191cc2df7b510e6447be4665904bfd646441f6be903cd0525c45e49f19c190be7c5c9e4c808f660cbb45f84eea6bc34efbeea8caa922f6c597a70cd4095c6420afee2f9c6b2637b9c06d2454296f604b55066e57e9d15de0839a115c104034110b3ca8002cb10)) <<< 16000) + 0x0115b223a3311c1188d88c46807879e9c89f0300a95754154a5fb53c6d8a089b45215784922c53412f3815334775b3e9602cb7323cc0b9c0b41c724218210230000002085c5b8c8dfe3995ba6eb81f038528115fca13b80bd18ebaf4bdfdd4d9a301095c0f285e32870d14a2ac8fa0006104464762301311705f1bd8268b9bf087ef1bd8268b9bf087f55ae902e3c334451aad748171e19a22908081f70f45213e3f2521c39b83772437f27bdc286440b7d4407abce00000000000000000023bd5805d36fe4241691adf16a0b4426c90c9facc8994dba9633a240000000000000000008c5b991e605ce05a10106096008004028a00494715f4e7fc24023724e2c8f1d6b295a62b05d55cbd9e90b779aae9e9c254b1fecb246b67cc5162584001a32896c6535edbc7c964e84458d3e3901942dbc76c7d0acf00fb3565f7f984d5e0dde1fff1fc1d6e82444908a93db2bd4e5d558a000da44458e622a6b0043108a12c44c462240b1110588802c43c1621c03e37fdd330e8b10a08a06345843c0172aa2c12959d1652201a8cfab04c010262ce98130410804207b6e0370a1e2e7fdb6c5cc1419c3059240a58781c863020ce608bba0004b859390d01f2555c953801080420733b2460e9e2c3f0f098c8168e2dd43c28025d6a34f9000840200001aa4434140004c24408360741b10c0988584c428262120b10801e123c9ed2723c51313beed182aa443613cc0c468b5056385a79055d420189738686a404a8413bc40009c708402182a6eaab9d8814df61567c3857204f2d3142365ef0d7900a440fc2900025182100808388800048c87e0af06461fa4430e1202d767272c42a9b4837cd0077772fe6240045d5787810009490880200002324000fc4e052889cb6cf6353982b91d47831a41d7a18bfa7ee1cb6b6e7453aafde36bed6a6a6a5b98824d5f212108b9b3a65620bafffea21fb2aa4ae67483b4bb1b79c5297510320278079821ccc711021c2160367807420c217d4da893fbb6c0640e2b7e10377765d135f21402abed4910e9072bd6d93db3264b4d59801cb2d37d19134482ec5aac373cec0262662cd35a535932440a2ba4a1d73785bd3811bed6065c5080005bdf14575a0a9b18f7c09038f8156a71ffd9ddf1a82076e225a1f044dd90bbec99e2fe846f8b135c9b6251aaf435d0a5bef23dc5f866974abacb3c9ea0d7b576082d5bf5dd5aab22ca32d364540003be1b061e9895df7992b84c33bca4af443722ac1bf6202010bb1f934cef68f2503f316569fe437141716934301295f465bdb46d15c9e21a0cc92e13e0014eea108009a6f2a112feb271cec3cdd7523c99b9648f51c100cd6802e0af2047b548f06caffa54b94cf1a12820f6f03e8866b2d62c4b8bea4d36e9fe20ed008002a4ed2c8d53f33cf5765d10359c66fa499c5a76fce836817df31ee4f4c90d602e1f0e4309a1e000028a91062d88292c1d447008010046046eaccc90b00126cfc08c077a0576708c207c02000014c6018020080000222204231011188006c3fc361fc1310409e0488c77c3820680bced8c002430400080fb0980202c40c17c1726521668a089a5a8cf0480466f0977004023242100800005d100019720802282c3b786ec782b18e69f5302d4bd2b846003e01080000802000008881102c118170080100407e8080000dcd021242b59270140aa8c7400121d6661801310200040000561102158808ac400461fe230fe0dc07c30c606851c73c196305a636f27c96dda4614bebcfbd4c82e724029042ab00981ffa202f6ce71c6a7bd6ad2ba447103237cc9c67315c8be5a9275afcea32e207013f543a1d1ab578e46e5130d25aba95134772f01fc6eeb560470d9c62e8d720079de4e4f9e6a7ee1e1a0c7f9d0e63f61b16d46a76cf53de34e8aaa34f696035ba9e14b7bb91e72ef08ac3d4927215963e35d5361d59e6d20d58e030cf836c4068ffd4fd861351591a20834fa9138011860f004000029481104f84cfb9da31e0abd4a592102a1b7ee88206f30b8d0012080f00403f4040001ca43f0361f61b00409f8216e7636a981679f4dc20441840010805e7db8941306790919a1e0c19075cf0230c1f008000054904a0d01106c3e8270100100407c80ec0f82e5c03c949a1878119994f8783855d34984c48779eea165928926301a5e01bd6b3561f37f802a2a3d16ab1e491928b4b38d778a6b6b295fe6b1c9b269dee00e3fbb962130c5d7bea147ef36a6d69af502b5709698d25a4923c95bda82dddd453e3d8b8bf9594a9169cc2869ae4e1152d4400001cf90f80100020310d20d0002dc1000ceb20441b000fa421ee5202d117838c889a2900ec5b4244480f8d1e308080046503c010a0c508a9767182018b8873ce025afb7fb5010231c2200870fcc882e44c0882f953d84081150f4ec205f05b257120113c641b00251020008409997d2cda68604065a3c4865a94cfc818520ed6c109810630248004a184001098a55b716827065e84467848616b1417c2879093280a04818400100000d820003ec4128461ec1a00033f21ea23a0ccba3ccd9101b09e1a94e025cdb54c4008c5080021831398b3030e1c0719f3d8c09552f2e02404d19786300482040010c14261ff00140cf617d140883078021c54369fcc7813e3a33409060d80200001cc80008490001fd21e81a0f309000028000c188003a490f21982f0ac3c4461d00200086b20037a8408ce61e0530ef1987708ffd22c93defdda16ee95a14c1769ad0a60bb504ad7b23b0e1ee05d685305daab42982ed37eed0b7747fa4592)) <<< 16000) + 0x7b84a62021025003800800080001c122ac0d2f966dc238567153b3266539a289dc028c4a2b5cd025995d24b3acf571cdd56fc76f6a50ec0a1c76eee5dd274486baab5aeb0d2a568ed1012b006cda1a83af2a52a26014179ae203e6afdda16ee97eed0b773ab42982ed4133055dfebd079b19e97cc00c2297a189c8810f8274c9a919caadfbd20000000000000000000925b991e605ce05c7984829629c8c8fb14e464817dd6d628415a14c176aad0a60bb4dfbb42ddd1fe91649ee12a9c10e10a116006b58b9d5b8892f0dad58362c2b6ee7403d5bcac85417c586efd48773df76ac83c3d459f70b6426d3f0a4d49e5b88e00400009d9bc891c784933184ec22ea38dbd0d0a1e53becb91ceb32bcd81054c7f4f9db2dd2e0332ab855b18fec0b851d0d5f163a1da12ff48b24f7bf7685bba5685305da6b42982ed4128f861b921ae816beeb6b14326d703e29c8c905f75b58a0fd685305daab42982ed37eed0b7747fa45927b84a87886082025802004882304328e437f01f1e41781bcfe49546b305e648fbf735e5db279934828c001a14bdff53449a4f64b49026929930af004f632c93e00b4e46513a9483d0d7ba2ba1e76c048177b0c5fc4285570b862b20124e135fca2024099f7f860120d3eb620004c3842010ff48b24f7bf7685bba5685305da6b42982ed4128f861b921ae816beeb6b14326d703e29c8c905f75b58a0f9a439e3943941a60080050268b28c6e33c8979c08f9cc492ba052dbcbe09dc4c718c70834cb7c077d338da900320c0313d8256c1842c897b020a06072a92c89779bec7881421d9be872c402ad079389010880200d803811eff054fc205282ad0711622bc3d6b744050c22832480031c48d6b30045ba9b629201651cb0ec2708210080000b0904c090001411ff48b24f7bf7685bba5685305da6b42982ed4128f861b921ae816beeb6b14326d703e29c8c905f75b58a0fd685305daab42982ed37eed0b7747fa45927b84a870c48c4847005004401897e36041636524c5cb4ede2d54def5fa868666fd202aa6d1e2f757442c0509c0eb252b4458d0045de2fae7ba98261e91efee85ce9a86ec0e5c514f836e80021a90ec0100050c9000b71385b69f2fac8c19329cc97c586cc3e8c63183a9811b76100276b58208700641ae5d630037a6dfe214006724210080000b710eb258750ec3a4361d00200119c21ce6a0e62d000c3790634902e248184340039ba4395561c823911e239edbc302d67f25f00000622820008489ccc84e264049e3c18ea0000c448400100e3050000501f5c1223bfc91938c0d342e862e61afedee9bdd1b657955678c3eede47a44d68352e245622c8e30667203ff0f9b30cb0938c2c22eb00bb274900026874d3d142951b18ebbf9481a104c34f248ecc2644761c220851807aaaa327532b9ae77c92776ac6b5ab180f46afeeb5a2437a72039c5ab95112d5e41af5b575ab41815185ee4bbc6dc8ca62f97f6c0e4981ffb53f74c1a9022af147a95d8de86294891cb6de04360ec2765fbe68f20e3793063484e52b8fd415e48f1946042da7e67783c466739a4322d3a0379f8a6adc17e8c955c730ff60abe34d41e3d53067921e28298422a00b721a90000e66644fbb209cbb456f1fb367667f7e6dec4790b45f8bdd8c22af9b21ce2e3c5cdf8392bfa30c79b7589625395b00efa11f8200172f1612d3954929d39405793d54b3b0f7f014d858076f83cd9860adbdddd434380b82649c10152beba1a60b9e9e380000c500030e80b93fdceb535c6b91871475227e6e4383a3cdbca1aa256594547a896bae84ddf950a4000d3542e288bfbba177385ac240ef821856947011e7cc0ad99bf9bf5f2d0ffe743ba1da967e23d1113fee8d15a5554961170582257856850c4bec495c881037d50f47004ba3b31660084970ef200482840010d226959e43a607fafb368024183e008806008020000088e129cf22674c0205ca9810e055317224008c407c02000015440005f887102e843b98bdbb224a72648f2578870f595ee7562580364d3ccb96240bf679e6c00280ccb24982ad7a5d85005f13aaace55c711aa37fd48a85affa29ad34ec64525946a695becf319c1b81ac2438d09e235c81490147edb5a3ee30c1aab12d41e38aeedea3fcc49d55c3a716339628fc0378686b5bdda37cf0559a5400077a4e2d15e68a93de86a0888252eb24011ea5fc951bd5089e87b728d693cf406861e6f7034df27ab8a49d54e243aad328c21150b99ec10d95d17d58d655e5f76a529650b4437603f99d0f88c74ed1c0000cb2438434001224702d1181d995f507f18cd8d486927db8bb51ad04555fc90519bcc9987c124349ce6d4c394400827c8ad6df5f3d260e4569047d02504b5ea31bf4803b1db3d952b067301dea1dce3feb3866ada316dd8dc18f8a46966b8da492491c4c08ab3e1d2f3c7ff7fe00094f362645becda4c6ca9fdb7b57aac11cef2bfa569143f44bbfc9f7ce57e2219ac40ae4a1fb76b6cc5064a6f4f3982457246083b07c2b163080e53461f00d06e76beff11602829b46bc552ecf4058cce86c2f03db1bfc31bb5da6ddade2708e342531cb7800065621c0230015be20465303f15d0970bdf6791c24114a4a10c1365b8898c6077faf298050154f5d03d0000948084021c4014ba6aa658c15da64a40c3569d8a88850a00c2d349902e47b8a5104a0844010e220edec2b658c928d3e09205ede926a214013039f220601da2d61564a08420100001043a3e260e25d8a17498ed4c638944d6a91c10117dc2bce9800a6a7f80880)) <<< 16000) + 0x1c6b323f413041080400004cc86f82c000078379ed2fd68911a3b7331a40674caf5131838fd822529201afc72f30800925f9f5c084c28420100001393fe91649ef7eed0b774ad0a60bb4d685305da825ccc211f4a2402d7dd6d62864dae07c5391920beeb6b141ffcba5daf8c320949ec2b85b13e926f6a52308eb42982ed55a14c1769bf7685bba3fd22c93dc2552c52031c21420889bcfe6ae2172e85311e7cb3c222b8c6da41f8e0d6ca074ba97f7516c057d2287cf130a74fb4d8085f19744d39e9d1b2dc928e3381aaf73c2ef4d31a660a1a06bbd5f709af91732679b939d064e11ea000a884378660014d0418c940b8420dd1d06e0c80bc340c212000c1321b66a0da3106c8e8360641ae330d61906a848350140056de401e90883b0ac128460ea2307401d841c80f8d8e1cf5c8e6de683144ed3bd2103026b32500f0bb574f8797f639ec6b6f1ff27596807b76305c125e4320e83d1800c0636be98f471a66b976eda397ccd1d63a19ebf7b1ef227352803f9b4aaae90f0faec466af9f3814d64402ef0989c3c09bc02a801840cb21c8d7f6ffe0894c7c2eb7599390a81f96f2edf4739ea19f51da8a68cc06041f7ed953359e16fc5e12fca75060024000540137472d5644cb161b59a1f2dbe878eb52121aead410a205a50ee6a71d8ec6eef50c39950cf842c05df927281ae1e3f4456c146df556dbfd76f97459d451fd558bc9642b2c5c769ff53c0b4faf3890175a4de396556aac49fe658b5f5b3f8e81f477ff0853b38d249489e3337b5b02d4826e9cc1a9ad5535028a24398947cf417faf1f655f3b4d9519fe7666c498ce09993b20730d05e8885be91d698c5429bbc11fc2272da621e40c8220562601f09b6d101938bd176ffdb57af9e42ef40e80ffa40138c4ad034a0e0d71c51439a2bf8d408024791cdd83003d2b183b0000090a084021020010044117aa4fd1fd161f99748933131ab4bd40f543f01eedf2c4c7d27916ed9fa51228f33ffc05fdb1deb6dbb188e5eae36d131f1ca7b56e93255c0f027be55c458003d03773e4c435c463ccc059c706122c0add43312918505ed6dd69a334314009d29c8201539008224037d64145b7516ebc07a61fa0dd3eff73038bb542033c5f03da735efa7a675696df445c73aa81b3b99f4be4a70783d3c92ea1001b95607938c8b28fb06a7f719276ace0777163aafc0be205e86241cee3344935968d2341a00e509f26e440844010a2baeecb6162c7077cff3bcc0025bb48b58c00880210000100400001110000e821a6120be09069028000041a2020001eb2000fac70c4af5a4fd1c3886a589c9a033bf735fc00009921080200002e080047310922982c14c08ca61a0430cf1d8670ec334661982b0cb0d8650480d026192120c805f153a8b3a0d430397e3b2a83605ce2857f5bd99f286450e008abe5acd0a25b96f2675b927b8c68480e6445f9f050b022d79b1abe4b207682ecb1d28f311c3204407ec23738801248f5812c64a3e45a06c6d23c79a35e3c439a83852870044d81e424376c06d61949e771cc5a1ceaf5eae31d814040000617a86db6619c75e4acca53bcf031d174ec878f7fe64405fb4478e248442ee4b15b68daa6062424210f817896bf8fd83cb4db6a47ca35be74f65d299d458aa958458f208031f06d91fc7b18d0a3edd91a49260486f479cb3054e91f3db87c2debd59fb4b5682667afa4b618222cffa1a3ace515beb76bad2829e9974bedb7aec120590bb0b4937df3461b07e1a8880c7e781c302d74f2f9cc99dcb504172771a047331888bd85c5acb795a3b81eba2fa37a69275df00fb000d59005a3c81000028360504a8e81b3a6c857a66bb47a62f2adcdc4b538391076bcece6b9148b0d978e0b67c824e0dff7649618b03a705f5ef9cb58bcc9eaef4dc3c2387dc0000a9ba0883521b264e24a76686d1feff7d71cfe594bd747813c4959629720184c1c3b5e1ab222b8c0cb565e77d1291da660c12d210a3f1506fe5466c404e4aa51133b3869494808c6ea2b942d787729e9390f0c927d9bddad4d6db5dfd9595abd8488a2032a49ae3e4a95200575d634446764cf357f23a048bcee38e6b880f9abf7685bba5fbb42ddcead0a60bb504c628a4a0eea1fc40a6458fe4820b6c844efeb370246b9ae3ba657000000000000000000232b42982ed57eed0b773afdda16ee839ae203e684c679e79670c3028006800bb36489ea64a869b220d3adb1853157f71a2ccbdb98a630ec2fba795d3b5289c3e638148196597c80013b21f2be84bf217f1f13542a65ffdd040c56e4150f92965301a66de26931bf4008731e18d4d91bbcd7101f357eed0b774bf7685bb9d5a14c176a099b45215784922c53412f38155e6a02538f49b82653adde75c8cb7c22f671f85c7d74345e6298f2c000000000000000000125855cbc696f3ba338e9a9efd66a039785bbad82f54c7d2b404e3000000000000000000456612264cf943b1e066ab56ed677d3866e5e58a8ce92b8e49042c000000000000000001155a14c176abf7685bb9d7eed0b7741cd7101f342662cb3c7300009725edf15537e77c947ad7ee14bf8b7958654a6b67602402fd252d6bf143458a5014a96cef2969f4679a7d6618eaad1330403caa90b912b3017175ca12b352411832ceaf7d5fac975b4b97c2e7b2005ba8d5e7718050f97fbdbc20c4b628c39005e2f1a4021eff875f2009201a44781e030ba9170bc8abb8b34c758cf4aa3faf1ce7fb60619fbd224e5e2b01ee6eaad8eecbbf717b7a7260ce4cb9ae51b24a8cfdf0ee6ac77e35ec9c)) <<< 16000) + 0x62a3cf50e92191428be397feb3762394900aeac3e8ed047af56e892c9e4143260ac8cec534c813a5a8600cfb8d8d3674481c416f939664fc6cf989bb93a62dc31ae1cefa79d442a049ee3cb912601559b9fff41c20e13c1eea8e5c2752c4bd6e391cd98f256e11016221fa2ece4e2c4225a6790b1d915646e1c01958fac562d09a87f5fa5003d2ebed8c5782dba7c546617cf29ee6b29227e491b44b9226074038ba00d20ae8ee98219b15fbc5236cf694b74247b7a1b3f3257e82271180ab883e14ba3b5f63a7b066773683f44bf99543c489a62cac61e40f7d0daf32f4bbf235ed297e9a21380075fd746d9b71fdb38b25b51a7180b5451df193bea454fa2f09fe7058d391959d8552af2a31dbc6705145b9ccb3c3cf9ab7a51c4cb07fa48194c0c38da3650124142000840200401018e03e6b880f9abf7685bba5fbb42ddcead0a60bb504cc2ae5e34b79dd19c74d4f7eb3501cbc2ddd6c17aa63e95a027180000000000000000022b30913267ca1d8f03355ab76b3be9c3372f2c5467495c72482160000000000000000008abeeb6b1714e4648064dae075f75b58a0fab42982ed57eed0b773afdda16ee839ae203e684caaaa82089a8801714b5b513adf11f6127b91dac57dcc162eb5d7d6c0acf56282114e103295ac9f26d3af4c510e787c1c5d38a60deebdca09f572e409ceff0031c0e37bbc8b56ee27be25d8f645512a135af2fa9e877f6875062e62cb1be6bfd2e9f166a50e79d43a90cf724c377780cf33aef43ea559da7de2d87b325d34ebd5037c1d5a00104643182400111479ae203e6afdda16ee97eed0b773ab42982ed41330ab978d2de774671d353dfacd4072f0b775b05ea98fa56809c60000000000000000008acc244c99f28763c0cd56addacefa70cdcbcb1519d2571c92085800000000000000000229fdb39aa01fd3c364fb947b49aa37fff4f049cacd912bf9d4c80000000000000000086beeb6b1714e4648064dae075f75b58a0fab42982ed57eed0b773afdda16ee839ae203e684cc71c7967800c33f770874992d94c4d8cd20c58b62f8d288c5222aa366a938bab66c7061aaedce9dce171235c3d260d769d4db68c8ceab2f7bb359c3c29aee4b094aaef6e7d262d9876efbb25ce54774285f8b05b50e55c615a648f05a7f09ff7e51d15698b41bba174a07228b0216c6bd2ae4f8f77e76f3b12940055f8196a8839a13708be31541a47dc2597a3ae3fed151f2825dd32d1091d543ec7cc699a49a00143a4004ee48020cf0cd29f433c027bdb2172c09bfb62e601b9019c2bcf3c16479ee0db70e66a839c55b57d55d537b382fea8e1a0f83ba951a3585f94350c5971d0d23cf19b983566ac3bc4f1a4bf906ae796697cc71d0973765af2a1bbb83af90158f3ab91d409da75ed8bedb7f502e89f5be1864340b33872444ba6e9cfa8c1ef6e795cb80593bc5a57330c7703f6410030287ea20480be44e3697c2c81260a2e5945cb3e4bf81bde841c130ea96682ea0ef53420db76a0cb5acba45af53f1e2beb700bf712dff421ebc8a885729216a4d2eea0009fe212c6c60289560165e97e95c6f611568bc2e08c1fa15895b21e2a77e3534ef67631e89feaf092c91aebafba0069ff369c2fc4a3d697817e51cfd35c30761c4a3fa00381b5355ccb9db6279c3e148838287e22a236a2499caead7f64ae6a033c95d9e91fb59cbd2533fad18357e540bc41d76c2337adcf74aff319875ccc4042143326157d800054f90041d0013cb10c5190018f510c41df35c407cd5fbb42ddd2fdda16ee75685305da82631452507750fe205322c7f24105b642277f59b81235cd71dd32b800000000000000000118fed9cd500fe9e1b27dca3da4d51bfffa7824e566c895fcea6400000000000000000435f75b58b8a723240326d703afbadac507d0924a19200b001289c8c7abc9a3e958a2d04967738b92a6b6c0e203bf363efc063b71a0cec0b1c164019a743664a17a7e3a3abac3f2b7db31829809893b980e25e05a6394d253ae09ec64841a51d5640cd05cae76b75e49714b82377456efe21371c48092ff5f3267462b7caf983357227e6000074a2cad415305b1487bb3f9dbfe72f0dd90b4bd7c8cef47e9082138f6c80747551a3fb34103e27d08fe6c64cc829b9784f3287b52c6d0008af20740200403421860bf30c7af3c1463dda6472b4e1be35b8be00185e44f912825123b17ccd8c1e04034c18e497acda94f84d5daa3e9019434ce71f98fbf43f3d7d6820ac0b054b588e01356f5d02f4d480637c73ea4f4870ba44ff2735252699fbcd88b0489277662c0578d27014e2c2f6e61eb4714dea72b702e1a00e4e3a3e8a678118a48f15f01000001355140c5a7df87a9d51a415ff8b49c4e95c624b93ecd46ccfa799f5bc0aea9590cea7470f373a22d8549d6874116bf79bec0ed58ab90412824b57caa860b681b8ff1c7c41460ed2ee808790f5a572be0a346a8c7a28adf6226791a20001bc8f35c407cd5fbb42ddd2fdda16ee75685305da82661572f1a5bcee8ce3a6a7bf59a80e5e16eeb60bd531f4ad0138c000000000000000001157465f6485b40b1f0c372435d02d7dd6d62864dae07c5391920beeb6b141f530b3c0280200004000068029811c295cb6fd0a6cc44bd2b5e33e4793b92f8f908e5c2e5125855fd1fce389dfec7fdd7dd0b75cc0154d5e016c5f8c7a6946f3c3c8bb799a3a147e83215feb7775a49f87b2346fc14f8854b038dc8a2969650005a3200add643096418232005cf32180c30451de81d217a3f0f7fd8b1e8664a8dadea990)) <<< 16000) + 0x98dbfc7b63467d18bf36eafae0108e073aa01655e96c77a90bd40a5ce78a2843247fb59132e0d9c7a886f98a297a614111705414b48d664f4a8a9fc6a0bf41c124ab30f0410001445bcb000ba43d57c6feb54fa6010c4481be6f0a3920fb76bfb4d75a3a14cfd60eb96224eda8087e9b2da138cd2ba728c5118c3da2912e64d1cfdad349fbdf3c856c4c25bff464afe075c046dbff92d84f0156dfc4570b2de8ffeccf872b55645382028b3960b35f2ee6eddee883d19477679922f5cfe42f73a6f0e25520fb18523e70e8e09fa882c02cb11b87b3990f03c418b56a8a860afe9a106813a3deb29d0a3f7b06126a2a0c400004011c5055035e9805f75a004800700100000e0640d2997c2242083e01000004e217e130be0985e82c0000617803c32989e3e9e28017144295890019df00ab100231c2200800005c9810008020000088800148180030086679b28df0b9ccaf937981196f539cf6f99eb961571682c9245597b0e9bcf0f6893ddd5f525d176e5a8f2388ca9565aaeada8894f180b11822a7dac3196cb1c96806d1ebed0f831f9c087da491927b4e2d0aac767223d5feead93cd2e2eec9f650d854d4d5f6bafa951db1090c021cf8e5088bb098745fdceda8808d26b711aafcdaf758ac97b0dc4292aa6fc72b076f65a43983f7dfd0af9ac32123033b75d6f0093428a01a3264a3a7a43089cab81593a3a96db89802f49be9986d3afcd8ec7e5c8db3fcc6e245e09a7391b1d041a6d8f7305982afbe2cf6dc8cb9822e7196725e6b68de87830e76b45fd54e268da3bc86bc9ac68ec30e1d6f0caf7916980dcfdd94f637ab6945e7522c09804b4c3114db32e00022e885d9682e8a4172520232505c1282dc8416c320b51505a0882cc441641a0b10905804c2bc1615c020ad01000a6a1007d223c616706574bed0dc4623111893a58650dd683982812816575c00f3af74b2f3e62e29326628b388544055c73efd4a4e3e86c88f9d6941885cf449e4200952d18fc7a997adbe570153f856b74a2e72000450044cfbc2614d5ef82040698e0768e10d417ad0043196fd7ee7dcd68c3673bc6e36991c3cf316f79b7e74c6bd6dbb923c311ddba551d2d3651011e67479b0b70fe9f975ced87bb5b89d24c7300009d040235348092931bf22117b3a429fc6148cc31f609778a9a3a3aac1997dfe17f06c0000000000000000008c63f08274eb5b720a378b6585c7454a2beaecc0755aca3617cc0000000000000000021924d35421990e4cb2f59e1500bca31d02c08c7d81c8b48bee00000000000000000826202182300180aa08208ac748421d0722394bab0ba42f4ab2d2b7143b2c3004c7efd3c26c0d6834afcd321d2770a5e53756dfdd8aeb960743e9f0326b980ae2040c1053ec5ac88ad982d69e9f30779d2ab14f09ded35251d6a1d2a85082e8eb174ed7bfeff63925fb198ae177248e55a5dcf35d6aeec003077ccc464078364fd0e8f3a938e103b3d717808666fd30fc535993dfa6cc15f61dae514883b4bf3b2e6494558c77df8ee11f69587a158020008bc2026128406b29cc504aa211742407f06afe1fef8fa4162f1ef04ad559ce92800d6babeaf0bed7d5e17dc0fb4830086404384284300200228000e575fe8574a6c3a60432e5fd0232dcb0ea85f3e3ba1020baccc76c0da0d3a8a3001792c086ef1bb17e580ec978d54499147b2f3463a8c049265b1c89e08a915446590e9d5d93900a98af58703fd21f5ed183066a9ba6502777046ffeaba011720b80c292b51f05d5d943a35d34a86b189540803286beaf47b0ba0962d56f18d5d09800580080710a2870e3c9ded0ce6d2c00004ad0c9a50948625a058f6c1afef65800f341006d59472b2fcf0a462399d94b1f5f93d70bb3e9b252494ed9ecde8d47f533b5642589ccd6e21e3a8aa355673a4a0035aeafabc2fb5f5785f703f2daa49b759c05e956d0778cc816650838820630020008009ce017478dfc20620b810b3a247ab8fe52013284e9de3b6107158ef85001416288319ac89197e894b8e21966fa94a206d7331cc78612a0b0028e080092141100400003b48419682ac740fa0a0aa010001db902d3504d0c8002198816a2c2a4b615013808320c422ea55f1a32495ea5d342849321487fe5a2b99147232cf82201ee2765b4fbb73269a5d2cac920a00ab57d733057cc7b36460dbc48402c068798d814d91c4a7a73e01e08004558c5d49f32663e8e41cf9c405040044e8fc24e180a1ffa5f893163906a631228408d9d51a76dc064488e29ddb6e1c6e2d6552dcdcb91c1e7fdb972b7184fcca0ca220d20c025a4a7622429ca230b23cd92732ff7131aa3e5db9edf34767d602f000000000000000000000000000000000000000000000000000000d4448430440220008000002006110a2448e4b21b9526f8f28b209ba4492d501ff6e0dc359c6bbe7454a4b5261960b55007489d5f5112b33b164c7fd884048748acfe8bb2224283ed482c48e5444b78d80bb3ca2846985605eeaf7e41aa1a571b23d3c03625ae258548fb36ec0b16d847c5102603798058c098222f510700914531b6280b766649401000494c084021a41804803279360455362302494ae9cfbeabbdd79ffb387cfeb800000000000000000000000000000000000000000000016c8b148104086041041001426cbc4a7fe1a02f32cc85135c21864d00974522f362e30956a5e69289d8c1e45fa0005d84158c614e33a14fca194e3dcca6989bc40b0e2396a1807927fbb32c1649a18ef690af1948b96012d73a721cc3242a2fc5024d4af4fe51)) <<< 16000) + 0x901e9c981010e10a34185a309b6750400f8b7016b36824ffde00a00394c1fc6a6fe0060c20481ef0cbc841cd1242a10064f26c08aa6c46049295d39f7d577baf3ff670f9fd700000000000000000000000000000000000000000000002d896312312106116098014012000808382c01006f1000b2ceac6806906165ed4e71859000b2d05e00068d793bea30834703eed6d5d32165828bb0cd2300068058ef5674d74031478f0fac17d070c2c02c71133b4073b3489d9f65969640506e5bf0d18da75cc6a702f170331614104576dbd100106302f2c9c108402014c0a0a5010000c410a40d85180fcb0017d74a300e24236e621119387390b8ba950cf060128a46ee03010d5725f4a40e007c0228b8290047868c002721820a8081e4d149ec7c8e271151e45c61212a8db8f1c20dd09c991e094f8a983c900748e78653001080402840414002000159214413d20c0240193c9b022a9b118124a574e7df55deebcffd9c3e7f5c0000000000000000000000000000000000000000000000b64794694692284700600380170801006c4b14fe85c21240b0598063ff238b001c9c3800387001c9c37d824309b2e921f11830b2f00ad8140214204c7c52440d67487014c2002a8ffaec622890428018690601200c9e4d81154d88c09252ba73efaaef75e7fece1f3fae00000000000000000000000000000000000000000000005b248c44c3cc48b4891c1440b80008036465ead6630d132c1a477f28868858324b1c11e2f73ea1800417dbebe5002100800008190003272000a7c7c9bced3a6c9c4d3447152cc2426b62f2078a0552bedb28101af02a688086e03fbfc900791301904e08420100a105050008000620800484909f0d00062d90611104f088274441380200107b2136620012bd20941a0015ec21068207d09000d3e109a19000fe690990d00122e90984d82518c0884400602a203b970cb4284ccaa8a028a0ecedca60c00118c1100430a1605a2378c1b73098f3830551d3b4f4900414e44080300355ff30b004a2044010e305e31bd04388b681b7ba0e1d1b0fda724801fbf8a4e0e01a6c06f764a0844010e30799bf9003889c2c231f8e1e1e6a74da1843f0c9bf00801a12e68084a0844010000108212e020960100012a9095050001c99094198498cc248661222b0901184788c2383611a0b08c0184580e83504b822d450e457c1ad710378471f9c070b03ee89ff2401407884246000805dab70000098a08802163039702f9630bdf41a4b6122754f059f82885882ea351a03685af5640004a3844010d200e453525103b91fb17a72c680d0c06c27800637b90701004229a879004a2046010d200039e14d2c82f31a00b481d6bb2c2ac2c6c91023fbc104046c29fe0094408802000021e78dd07e88fe982a3c67fd4050be735684e160297e3b1e2000185f7a8200128a110040000440845008000df884482e88b31e23280a0c83495b2f901b322a40fa103cccb8254448098402cfb4000094908c02000023a40017ecc063de0eaf48308fb85fcd110091bd56cf11818a7ae32ee2800347e50580000094b08c02000024442204610e2381c00c3812110286f00cf2a14457696125630603ac4045450e673fd9b000000457fa1c26042300850ab32562d58a258308fdce3068d92684a0a1fad45a02030053fbbdc200007743d3e84c0844010000137210c0308501c880fb249ce48104892da84081c573e4420142264056f12204ec85c6a086003157e8e5804c204601000014321080b80d1e72a74a1c35be28419030ac403157f101c52b4a1f43065ba7d4f314007d751fdc002618220080000a090831d0410c8204641003207f1503f0481f414000c3641f0640f62a000f2620f4730793903c0cc1dc640ec1304a0983a84c1d007842bdb72eeb283ade8d8a484060d5168114102318230086934a7e88d22c43a1721289227528b3fc0b00574e9398400aa3994d0142514210087147b2a1471285f97e98b1180255bcecc47017b23d93c1204108043cba5513b271a35c7f4c988b1ab96ca7082026ccb3c812801e34f0b00a001119c614981084021e58afa8f24a68c69a3d3db96348e21e10a70a1850ab2b8a201dea0a4c4a084401000010920004aa41cc1400602000373200093441c865639712f736e242bae6d0f643840484b40f86041fb69ad79601893620f0000494808c02000023841c4860b643070198378ac168560b2230570d8370681b4260ac0b05501ebd91d870f702d7dd6d62e29c8c900c9b5c0ebeeb6b141f23873052851c5281300175cf8460e45907cb40bb2da3a62da0138d34c2a9337e18f78c272b2148009e0ffb86e4b0555748f00310390ab7879aaa20e29839ec79db5091f3e026ca0606fccb0627380303083f9120269f05fcc00985084021fe91649ef7eed0b774ad0a60bb4d685305da8256bd91d870f702d7dd6d62e29c8c900c9b5c0ebeeb6b141fad0a60bb55685305da6fdda16ee8ff48b24f70950d20a20d10f00a0036c8e864080ef4066e5ead1d625de76558da06f909c0c42a9f27307845cc083c8e418cd2a47d3744792389bd34a346a0d8e38d46a6a247e6c86c5070af510fe392c09791777de1c4ca67bb1c0b251515338070aa59e8a8324448821dd692821080401b007af64761c3dc0b5f75b58b8a723240326d703afbadac507eb42982ed55a14c1769bf7685bba3fd22c93dc2534093892c93853c01003149e59a81ccc5752a944e2e8acd34430f05d445f06396dff68d681020f78d72e95ee0110ee3ee57553583045b9354000c6c826)) <<< 16000) + 0x048001194800461106b05d8d0b71e7951030b65cc8c65841ce055418c0aec540e8a60030761d57800042f654700004c384401000014320017127fd22c93defdda16ee95a14c1769ad0a60bb504ad7b23b0e1ee05afbadac5c53919201936b81d7dd6d6283ead0a60bb55fbb42ddcebf7685bba0e6b880f9a1321621420c20e0080063d176326ace2ee024a445e162e45f5d94e609c778718be1b27120b88c43b8007023000205529939bde2813074ac5759f6f149dbce11ccd63523421493ccd8a00087241a8940d23a0680903380e834461180e890f3e37747520377ab756ccc03485712fc00000124342200803302c0004208329cc190a7fe91649ef7eed0b774ad0a60bb4d685305da8251f0c372435d02eb42982ed55a14c1769bf7685bba3fd22c93dc2531c20812c0180080010000138245581a5f2cdb8470ace2a7664cca734513b805189456ba812ccae9259d67ab8e6eab7e3b7b52876050e3b7772ee93a2435d55ad7586952b4768809580366d0d41d7952951300a0a00082840c52405c1a00186320c6a30624d83088e0e8828d4d9bb64cfd55bb8001a81e26921ec0d252f3de0a3a43422d6132b1134f8628a919c119495effe5666910a4745a3a99624842556ac7976bdeaacbdfbbf360c2d8a0c1039f3787f998f498d8b05f08538c5b68bcab00ea65c0f6d4d6188600a589cb7ac5e4339c752f87c507625992c37365212688f417d0f55bb8d0a7e722c0885df71a05b3398cf280b0227e9600110c0f8042205a12ae9281086100042018020080000223637d346238340e3a0c1f658026e86bbc023101f0080000551060010000b599135758df50a21d75f9aa380009be3ac4812507453c80336e8c43000328e0f8040000418800195105f0df098b874209e6d3864646afe0c6a51cdf08cf0f04e28eff45b32481cbf0cdb5d15cdfb575ffece8d521dc6040ca4d4c186e180b1e8719d8c8d8ed2510a9f4ecbddb76d206dab57c99ab916c862102e46c544074f4d9c2c4255f641fe297324c9966299000228498ffcf763460ffa11a182314ca55015566a18d91108085ff4106f39cf32da3ea51679b8290447969a8f1c5c17a51b05045680eb394607f76ad2b48be3ff5decce790e4f7dc1be1d132da320321b6d3ff818468a28be400dc3dad02445302b1000062f20bc22b0a48e4c4491c2257eb27cca055b1dec0d000048ca0880200ba0bb0b611ad412180cb13858d00004222c21008000048900018020b85b05b2982d0cc164560b02a0571582b02c154074064e61eb810860e00438523fa1a505032ea43210220c1e00800003d9b1c9cc5981860e038cf9ec704aa979700d0268cbc318024102000800006c9c0e89a8ab7860caec9c6fcf003ac39804c0341708310009050800200001b64150360a61305205f0a55b716825866f8937962878ae6d7ac1841104f11e0481840010e2665f4b36a01915c21541618a51036a061538df4fd1c0418c092001286100040000408e0fcc882e44b087b8d7d2c80813ca3c7c205f7c6fc1cd0113c641b00251020008000082104a0d02886f0336a060b20c1a8e4ae118f02765339c260009ed3310010241c210080000719050110002281a068a9731ec804332b811c80030640360040023282000800005c904f1d0018881383409a038810478b0a11c078850b7300910a1080420200200804c0500001b904b05d02d77c00d0881838039b238150454e6c0461840010885be551e6e78427df8c84703e943b15804618400100000ac20441a04a0d8248680006c482406f04cfb9da3200abd4a592102a1b7ee88206f30b8d0012080f004011c07c3eb946f68614298f1f00883074021c3bf3a4155698f015d7e95e52aa579d15d04004c5266d5d4ccbf199da8b380f6e5810545dab140a69ac43be8e423e9839efd3bba8ab28375cb7c08e2c0b667a101744705fe3e3d818f9ee3ecb51c5c40210a4818c13a412ce85028a0822060a7f809265e071f372fa8d5a7681504dd2e98a6a7355b808ad5e7a58b9a0037f53440a7f004f1bb95e9b3943eac7230e2f1867218e000127c81106800151c8228680f4340080a0006863815900a18a9e0559d19430022102100840200401008e038000080220330a3e52908293c9a1f828121da258b3804eab61569000800200001a240881408c0a0001382000314410c5407422042110208880dc24000520401035e16c05e5954d098517d9584003754eae201002324210087848d0db98c282ce4f9c04103eb34541a004628400100450901e848010140880a000103300c010045843494de8e38100257d321104100042010020080000222000174410c440741a0420d0208680dc2406c1200017520802b00037d207e5302d158007f89c061e9895df7992b84c33bca4af443722ac1bf6201c10bb1f934cef68f2503f316569fe437141716934300269bca844bfac9c73b0f375d48f266e5923d470804a57d196f6d1b4572788683324b84f80053ba84100cd6802e0af2047b548f06caffa54b94cf1a128083dbc0fa219acb58b12e2fa934dba7f883b402002a4ed2c8d53f33cf5765d10359c66fa499c5a76fce836817df31ee4f4c90d602e1f0e4309a1e068529012fa0dae837f2afc2b14e1e5e70ce9f1fa39f46040d9c0a57948084833a8f38c09671d02075f855ced32b951e368e164dfbb1ac530c9401d56b52e98ed19f2861d9f60fcd85311d2cae14412ead01bf97e7f00326866547a0753301238e7ebb3a398c0cb9024abcbff515a5b3f50800007afa2f40742d9ff41e05f69aeaf1d49c)) <<< 16000) + 0xf3ffc479ef5dc799ab789afcb9292eff34d5b5ff84f75e9a6d4b2dbcb71c832608cb35cb6122cb9d6fdb9e256b3386214277d99766060704679070401a6be6c682001292100043fd22c93defdda16ee95a14c1769ad0a60bb504a5f75b58ac53919218a72323f1e6120a4102fbadac50c9b5c0f8a7232417dd6d6283f5a14c176aad0a60bb4dfbb42ddd1fe91649ee12a1031628c1100a0006dd9551b89fb4a1541cd8140ae78e8fed082b16310aa41fb334c98c15de84b4ababe262d98022bc1a26014cbc62ae0e2a69c264600af1bc5fa4434223dbbe5bd517f9321e18c4ca3a4684dc19012b879c48c90e59e111c38b9b0e808c1b2afccda4908bbb084c8004a284201003e0de9819800ae13b751184cde4628c4c183144ff47696aa30418682450a3803872b9d5e3e5cc4908d65909bc9b1040a4cabbd8804438058a1c42f11c40013882060bc0f00004244000d3881e8a8002190c0c6ffd859b405914f5a1b102cf3bb8c58b08020a9c122802668e852940084021035b8d44c750173c83125c58a126392ec2052bb6af9f16104b7dfc64f000465b644500f95d1daa9c00840200002b840f017c5ffba661d142141140c68a087802e55450252b3a2ca3003519f560920204c59d30260821008000099103b0d01d0680e424070120370501b0080d4040008dc400385c8009ba1034310199480c8440031c640c5140605a02f1501708800c7fc816a28098840084e2782b5ee75182cc970578422353e557847afdf8207e2d250bc471323621efa319e1fb5e95bcbca25180a5838a932944bb55a87216352ee223c3605e7de6508f19e4a5faafc4d868f0b5a4300d5e0f0e8a062e82dbbcf877e35e65ddf931b265ffbe5369e26791d97e9b069ef5816d6b54b8c258563362bc4005ad2294110daee93069665e838b07d2b9d099f652dbcb3979c79477ac5856c67a9881089b2f4a28004da2e27b1f87d32544859f38e7817e71a11c4d8bfa604e85e9728e464b67fefaf28d018dd81894a351893acbe52345551b9420c9cbedf0da99f1af0089290c7e75bbe7af571539376721c98a2220979c458a6abc24b68a4015ccc211f4a2402dbc7831e5bbb2d50bc6384e939fe52b2c382af36af5d4289a504e380000000000000000000000000000000000000000000000000000006c5d197d9216d02d0410a088085087000000870a682ebf71b5273a54a109a8fd776edca19cc7cb78d94e73410d919e395c32c3d77bf6278181a6549e9f596f28642d367ae3053dda98c17162a2419ff6749d50498f3bc3f8d030a85502949c2376c884a2a10e45e11eb86ce4afa7630017d2fc6b9d790b7fbbf640c1ac494dabacd661225156cdf26f543942d3efbb4346265f06890a52d53e48e4b885a054d58eabb463fdccf2ffe8b19c50352a3f7ea66d3816f06397a702aa1043293623ca1e0b4cc84e1391282629a5bd842027384efce803df77f2ad49615a041ea9c071c6acf37f92f073cf54451e8911115c8d922315e68ff633fdc23f856ca0058bd04080ac3db430a648d10a5f94a22825510b0350fdae4c28a684b4af06364411e66108fa512016ba32fb242da05d685305daab42982ed37eed0b7747fa45927b84a869a6942825800805b830d0fb9f39ca6deccca8e4c08b0d3ca3d38586a4b3e7b58bc31b07c12998a39789ff6678dfe795ba91388f2a845f15174a80a35350259ef065b7a4a1e16759119860f9c4a20e3ac663893ad58bcf459241db3a90e65431902030eb37a0336ae3cf1dc43deb802470b3f3b7e3060429fecbc68663700ba690337c6442c3dd089e114144bff7a295b2941784cee91aa6a85c5855a9701de93adce137fcb66c900f9a54ec9272cbeba6cc89bc2c73c1b6223975b1ce10ef4fd2844b0fa0001180c0300401000004440b03400106a40ac6405422029110140080038108139080982404a120013aa20487a023390111ac084a40402a01f0900f028074140380a01b05000e039007f0d201288e6c453112656e252888ab6ada71fb3d222a117be998f9b5a000000000000000007edb0150579fb7d7753cb41b6e1d738abb98c315ea2d06a34366c0000000000000000000000000000000000000000000000000003310a18c10c08a08808602208009e92b2dc371346308ab2a233c2a1ca860eff834ca32c3456406d456141a221824464cde0b05be0ef0020415743aa7c9a8d6477e916a80ac5675439f109cfacd3b720d926b5e8c3d03ffcdfd11c13fa10f4787aa6395c4eee1335529e5dc60bee5d01a6450845bbc5210104aecaad2405005ecf3ae544004504aa210300ee9426f2c404009cb090021c528923fda7e6470eda23c1b7fa70821c6d0d5887b8304115fbfcf8e8200062c472ba4146002f718b86317140044195e823a0010fa1c70b80a10304e18917892204504aa211026d5970e8b8e2000b71b00020802dc68e506009355a8350003b23b9887005c4090011428978af8f7922e7ea30257102800b71b00041002dc68e50e0852864ed6820a9348f61988009c3122f105c2090011640155cdcebcb183fcafbd7650da9b9ea4ab0823d084fcd90c00010b3a04c94109402164025d19aad8a210b5c4725458c07ccc3dce2860f1f7c25a962810a0e18a4a0249fd98462480002dc6c002704250080000bd10002ad20340a00045120322a0180900030710171100b028054140010684050140260a0009ff20247a0113900816803ca401c4a00d210060e802c640142a0090900404801c0400c020010f2200a4a004210018c8008440020200001006b8c1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 37 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover12Case19" = "QuadHeightCover12Case19" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 37 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover12Case19 private def zz2379:"s094b"="s094b":=by decide+kernel end section namespace Green24Proof.HeightCover12Rows open FullPhaseRows (Phase) open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x102d200779ae58001fde384aa15d20003dceb9480088fea92b21cd20003dceb94800cb1e185b201d20003dceb94800cd4d1b492520003dceb948010e4a5e2a2079200050c1f9200779ae58001aca9c2ea1692002fd7c280038ac4be02920001eeb5ca8001bbe4d2ba1c920009c4da80018fbdba01920001eeb5ca8004c5e5a4be120001eeb5ca8008b292f19207c2005faf84801db8b4d4f617c20001eeb5ca8048b9aff6c21ec20001eeb5ca8020aabcb3b2420001eeb5ca8012f7e5aece07820007b9d6a80292b2878a1782002fd7c28007c0c6e4a216820003dceb948014d6f3c49202000ef3acd064abe18614] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11cb20001eeb5ca801f98a8ea01b2003bcdb2c0018ec485aa320003dceb948010e892e39207e2005faf84800ac684a5f217e20003dceb948021c9cbc6de1ee2000ef3acd03b8fd79e02e20003dceb948001fb88c0d215e2000ef3acd037b8e7ea1ce20001eeb5ca8012d9b2bade01e20009c4da80018da6ce8e620001bede880285a4aa07a20001eeb5ca801a8af5acae17a2003bcdb2c002f1fb85a602a20003dceb948002eae4d6d61ca20003dceb94801dfadbeffe01a20003dceb948037f5da9cb6220003dceb9480059cb7afbe07d20003dceb94800dfa80a0de1fd20001eeb5ca8003e4f4dbf21ed20001eeb5ca8063f5e1ea14] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x101a60003dceb948009d1d08eee260001eeb5ca8007819bbb9607d60003dceb94802ea8d092e217d60003dceb948011e4b184a21ed60003dceb948019d0aba4de560003dceb94802581f9e3ce0796001389b4800191e580961e9600779ae58004dcbff1a61600779ae5800986b7f2a207f20003dceb94800db2b8c7821ff20003dceb9480048197d7d21ef2003bcdb2c0588fe29602f20001eeb5ca8003ebb1e89215f20001eeb5ca80049be1b4c61cf20003dceb94800b8abbb6b201f20001eeb5ca8005f3f5d39e72005faf848003aeb6fa9e07b20001eeb5ca8006f5e8cea21fb20017ebe1800acde2fa02b20005faf8a005949b8214] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x176005faf848002d7cadca61fb60003dceb94800b85c5a4921eb6001389b4802df585d602b60001eeb5ca8017d889d615b60001eeb5ca80049bf497fe14b600779ae580028bcfe7f601b6003bcdb2c03bdaeac6360001eeb5ca8008968aba9a07e600779ae58003aeb6999a17e60001eeb5ca8007b0c7b2c21ee60003dceb9480099eee8a8a06e60003dceb948009a6d2838615e6005faf848076df9dc214e60017ebe18014e1c9de01e6000ef3acd041a784da660003dceb948009dbe1d78607a6005faf848001ebd0ca9e17a60001eeb5ca802be3cae606a60017ebe18014a7eac614a60003dceb948004dd95e29a14] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x101fa0003dceb94800bbecaa6c27a0003dceb948010dd84f2ea07ba00779ae580049bbb94b602ba0003dceb948003bee1bffa1cba0003dceb948029c0cabe01ba0003dceb948008d9fbf4ea3a0003dceb948010dd84f2ea07ea0003dceb94800197f4c99dd217ea0003dceb9480019afabac3e21eea0003dceb948047b3c1f9aa6a003bcdb2c004e3e7aad207aa0003e8a4800194dea58e17aa0003dceb948066dbcbade22a001de6d9a001cba5b1aa03f60001eeb5ca80328c97b21ff60001eeb5ca800dba91939e02f60001eeb5ca8052eea08e1df6005faf848001aeabfbe214f60003dceb948025b0eed29205f6003bcdb2c062debcee14] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x107c30001eeb5ca8005af92ca8a17c30003dceb948008e3b4bab616c30003dceb94800c81ef81c604c30003dceb948004b2c2b9e207830001eeb5ca800384f3aefa1783000ef3acd028f3809a048300779ae5802ecbbec207fe002fd7c2800598c8d8fe17fe0003dceb948013c195e3ba1efe000ef3acd055df9da27e005faf84800796a587de07be0003dceb94800efcdd93f61fbe0003dceb94801a86d3e3ee3e005faf848006ebadc2f607fa0003dceb94800d8c88b2f21ffa0003dceb948006ddd3abc21efa0003dceb948002bcf99fba02fa0003dceb948007c1b6a0f215fa0003dceb948006f2b797ea1cfa0003dceb948009e1e581a614] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x107a300779ae58002a8f2bede17a30009c4da8036ceb3b21ea30001eeb5ca8004be94ce9a1ca3005faf8480018ae7929a01a3005faf84803f84e1c223000ef3acd00589df9603d30003dceb948003c1cceeae17d3001389b480269aacfa16d30003dceb948002b1cfc1c606d30003dceb948007f683b4c21dd3005faf848001d082c4da14d30003dceb94800cb1eae3fe05d30003dceb948003dc9d869a530003f402179300779ae58001aca9c2ea1e93002fd7c280038ac4be06930001eeb5ca8001bbe4d2ba14930009c4da80018fbdba05930001eeb5ca8009cb8cbe130003f40214] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x116f30001eeb5ca800393ceb4c606f30017ebe1803191e4821df30001eeb5ca80049be1b4c614f30003dceb94800b8abbb6b205f30001eeb5ca8001b7dbbb9e730003dceb948001f491fa03b30001eeb5ca8002b9ceb6a217b30017ebe1800acde2fa06b30005faf8a005949b8214b30001eeb5ca801f98a8ea01b3003bcdb2c042c0d6330003f40207e30009c4da800ce281de17e30001eeb5ca8004ebffb0f616e3002fd7c2806ea1da02e3005faf84802fc3c1f21de30003dceb948006f8e9a28a1ce30003dceb948001fedfb2b601e300779ae5804fc38caa63000bf5f0c004f19ed214] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x102e70003dceb948009a6d2838a1de70001eeb5ca80038ba4e99e1ce70001eeb5ca800ae2a2b605e700779ae580029dc6c9b26700779ae58001dfd1dcbe03a7005faf848006dfda9e1fa70001eeb5ca802be3cae602a70017ebe18014a7eac61ca70003dceb948004dd95e29a05a70003dceb9480599bdeee2700779ae58055fcb4d207d700779ae58067fdc0ba17d70003dceb948004dfc4f7f616d700779ae58001fea2c19e04d700779ae568f5ee17970003dceb948004e5f1f0fa16970004e2ad8001cdbe9e04970003dceb948001cd89efb203f30001eeb5ca8002d091b7b617f30001eeb5ca80019aad948a14] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x104eb00779ae5800193a1c48607ab0001eeb5ca8001c4b1de9616ab0003dceb948004a3aa8bf22b0003f40207f70003dceb948001a39da9e217f7003bcdb2c002a5ffcffe1ef70017ebe18042b9b28602f70001eeb5ca8001d0b98ac615f7001de6d9a02f86ea1cf700779ae58001ade086d605f7005faf848001a3a0f38a770003dceb948006e9b7f6ca17b7003bcdb2c03be7f3ea1db7002fd7c2801bd9a9c21cb7005faf848037c5cce201b70001eeb5ca8077a9bc8637005faf84800fa2e7aa03e700779ae5800190a98d9a1fe70001eeb5ca8007b0c7b2c216e70003dceb9480099eee8a8a14] def rowsChunk10:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x104ff005faf848042edaebe03bf0004e2ad800383c0f617bf00779ae58047a9bdbe04bf0003dceb948077efe5c203fb0003dceb948004f39cf1ae17fb0003dceb948005bcd4c0c216fb003bcdb2c02cffe8de06fb00779ae58001e7f0caf21dfb0003dceb94800784ce988214fb0003dceb948009e8b8e2a605fb0003dceb948002c695f6c27b0003dceb948001f491fa03bb00779ae58001fdae88b606bb0003dceb948003bee1bffa14bb0003dceb948029c0cabe01bb0003dceb94801eb8bb963b0003dceb948001f491fa07eb001389b48036cac9a617eb003bcdb2c07ea7bd9a16eb00779ae58003a8a9c2f214] def rowsChunk11:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11fe00003dceb948008f2b98dfe16e0000bf5f0c01cbb83c606e00003dceb9480029ccea3c215e000779ae580021ce00003dceb948002600001fa0217d00003dceb948065e181ca1ed000779ae580138a98a6500001fa0203c00001eeb5ca800280b7a9c21fc00001eeb5ca8007e08cbdf216c00003dceb94800ed995baae06c0005faf8480429ad6ce1dc0001de6d9a00996ebfa14c0003bcdb2c00add9a8e05c00003dceb948011e1f296400001fa0207ff002fd7c28029c1e8ce17ff002fd7c2805ea2c1f616ff0003dceb948003fd8b8bf214] def rowsChunk12:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x103d40009c4da8003bcc2ca1fd4005faf8480018af4e79216d40003dceb948005b6c883e606d40001eeb5ca8056e980c215d40001eeb5ca8002540001fa0207c4003bcdb2c01617c400779ae58001cfe21ec40001eeb5ca800bc1da02c40003dceb94805b939a1dc4001de6d9a02eb0ea14c4005faf848012b2c1f605c4001de6d9a007fffae2440003dceb94802d86c6b607f0005faf84800dd0f28e17f00003dceb94800188a8f4fe1ef00003dceb94804494babe02f00003dceb948002700001fa0203e00003dceb9480029ccea3ca14] def rowsChunk13:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x106e800779ae580449fe5a21de80003dceb948001bca4a0ce14e80003dceb948077d3a4ea05e80003dceb9419a6c6680001fa0207d80003dceb948001839eaa8617d80001eeb5ca8001839ea9fa1ed80003dceb948001839ea9f602d80003dceb948002580001fa0203c8005faf8480399b91921fc8001de6d9a047c1f7e216c80001eeb5ca8004bc8fe0d606c80001eeb5ca80018f84ae8615c80003dceb948070da1cc80001eeb5ca801dd201c80003dceb94800bee480001fa02740001fa02640001fa0214] def rowsChunk14:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1058100779ae58005d3bdd9f2010003dceb948003e8a2da03fc00779ae58029f2b4821ffc002fd7c2804383eb9616fc0001eeb5ca8002cf9393de06fc00779ae58029f2b1fa7c0001fa026c0001fa025c0001fa024c0001fa0207f80003dceb94803fdb9efe17f8001389b404a5c21ef80061d48005f09a06f80003dceb948016cda3c615f80003dceb94800c8faae61cf80001eeb5ca80029bf5d6780001fa0203e8001389b480138edfca1fe80003dceb94800eb096a5ba16e80001eeb5ca8006e0ce93b614] def rowsChunk15:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1610001eeb5ca8001f491d203a100779ae58006d7898cb216a10003dceb9480079b998a9a02a10003dceb9480158e86b7d614a10001eeb5ca8014d196fa9205a1005faf848004e192f0d2210001fa0203c100779ae5800993f6fff61fc10017ebe1805aae928a1ec10017ebe18002f1f3a602c100779ae5800aeeffba9e1dc1002fd7c28026c3ecce14c10001eeb5ca80139db5dbc605c10003dceb94801b988d86f2410003dceb948003e8a3a20381005faf848008829bcbca1f81005faf848003d8d5b1ae02810003dceb948028a7dea6c615810003dceb94800aabb9e28a14810003dceb94801895e781e214] def rowsChunk16:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x103d5001de6d9a001c581a4ae1fd5002fd7c2800788e8fe02d50001eeb5ca8013b1d3fbb61dd50001eeb5ca802cf2a58e14d5002fd7c28020f8d6a201d50003dceb94800ae8e0ecea550005faf8a0068d9e03950001eeb5ca80089cfca0821695003bcdb2c0018d8bd7ae02950001eeb5ca80118ca5c0fe14950003dceb948002b2f8f8be01950003dceb94800b93feadf2150001eeb5ca8001f4919603e10003dceb948016aad8b7b617e10009c4da8014e4aafa16e1003bcdb2c041e2fcb602e10001eeb5ca8009e8b4ec9615e10001eeb5ca804aabb4e214e100779ae5800aa0e3f0f605e10003dceb948017fea7c39614] def rowsChunk17:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x10289001389b4807acbfbba1d890001eeb5ca8070c8898e14890001eeb5ca80169d9499fa05890003dceb948019e4dbf28a090001fa0203f50003dceb948001f4cc93be17f50001eeb5ca8004a292d3a616f50001eeb5ca800edc8ce3b206f50003dceb948007afbb8eca15f5001de6d9a001e9c9ee921cf50002b196c00acbe88a01f50003dceb948015beccd6a2750003dceb94800d93dfb49a03b5005faf8480549bbcae17b50003dceb948007a78685be16b5005faf848003ff9af2f602b50061d48001bbcd8e15b500779ae580048acfb8da01b50003dceb948003ac8ae3c6350004e2ad801a8c87ea14] def rowsChunk18:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11de90003dceb94800df9d2c6fe14e9005faf84800bd8c5e1ba05e90001eeb5ca8012a586f5fa690001eeb5ca8001f491da03a90003dceb94801db5ccbdb202a9001389b480018acfa19215a900779ae58044b5a1be14a90003dceb948033ade5d6f205a90003dceb948023e6b6808e2900779ae5807a88de03c90001eeb5ca800ad9d7dfc217c90001eeb5ca8007c2fceb8a1ec90001eeb5ca8002d593effe02c90017ebe180019697e2e215c90003dceb948002dec4f8d614c90003dceb948026858e909605c900779ae58005e3ce82a649002fd7c28030e9f2038900779ae58006b4d7e89a17890001eeb5ca8002f8e794d214] def rowsChunk19:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x117bd0001eeb5ca800a92cafbfe02bd0003dceb948020b28ea4d614bd0007b9d6a810e0fe8201bd0017ebe1802ae0b6aa3d0003dceb948003e8a2b217dd00779ae58003ececf9fa16dd0003dceb948016b7b2e4d606dd0001eeb5ca8001b4b69cd215dd0003dceb948013879dddee01dd000ef3acd029b7eea25d0001eeb5ca8007e0acd4c2179d0001eeb5ca80038cb1cff6169d003bcdb2c002e9d58eba029d0003dceb948007c3b3d4da159d0003dceb94800b8098b0e6019d0001eeb5ca80068edeeef21d0001eeb5ca80089aa8ac8e03e90017ebe18001bf94fea61ee90003dceb948007ace5bba602e90003dceb94802be68993c214] def rowsChunk20:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x10894007d0801010100010201000893002fd7c28042cd9a01020101010101020892001de6d9a001c6f601010100010201000892005faf848002c9d0c5b6030305faf8a00788d6088d0003dceb94800aa1bffa088b0003e8a48009d1ba08880004e2ad8042ceda08870003dceb94802784ccd5aa08840003dceb94801cdbe0f7a6088300779ae58009e3a2c4c2088000779ae580079293888603fd003bcdb2c003dab4daee1ffd005faf8480018ef2e3fe02fd0003dceb948027faa582aa1dfd0003dceb94806ff4d39a01fd0003dceb94800cfcd3f6f67d00779ae5807a88b603bd0003dceb94800485d3aab613] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 ++ rowsChunk10 ++ rowsChunk11 ++ rowsChunk12 ++ rowsChunk13 ++ rowsChunk14 ++ rowsChunk15 ++ rowsChunk16 ++ rowsChunk17 ++ rowsChunk18 ++ rowsChunk19 ++ rowsChunk20 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadHeightCover12Case0.base QuadHeightCover12Case0.hinges QuadHeightCover12Case0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case0.base QuadHeightCover12Case0.hinges QuadHeightCover12Case0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadHeightCover12Case1.base QuadHeightCover12Case1.hinges QuadHeightCover12Case1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel private def zz1670:"s0686"="s0686":=by decide+kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case1.base QuadHeightCover12Case1.hinges QuadHeightCover12Case1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r23,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadHeightCover12Case2.base QuadHeightCover12Case2.hinges QuadHeightCover12Case2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case2.base QuadHeightCover12Case2.hinges QuadHeightCover12Case2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadHeightCover12Case3.base QuadHeightCover12Case3.hinges QuadHeightCover12Case3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel private def zz1671:"s0687"="s0687":=by decide+kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case3.base QuadHeightCover12Case3.hinges QuadHeightCover12Case3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadHeightCover12Case4.base QuadHeightCover12Case4.hinges QuadHeightCover12Case4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case4.base QuadHeightCover12Case4.hinges QuadHeightCover12Case4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadHeightCover12Case5.base QuadHeightCover12Case5.hinges QuadHeightCover12Case5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel private def zz1672:"s0688"="s0688":=by decide+kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case5.base QuadHeightCover12Case5.hinges QuadHeightCover12Case5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r81,RewriteAtoms.r32,RewriteAtoms.r77,RewriteAtoms.r16,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadHeightCover12Case6.base QuadHeightCover12Case6.hinges QuadHeightCover12Case6.normalizationDenominator theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case6.base QuadHeightCover12Case6.hinges QuadHeightCover12Case6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r81,RewriteAtoms.r82,RewriteAtoms.r32,RewriteAtoms.r61,RewriteAtoms.r77,RewriteAtoms.r16,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadHeightCover12Case7.base QuadHeightCover12Case7.hinges QuadHeightCover12Case7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel private def zz1673:"s0689"="s0689":=by decide+kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case7.base QuadHeightCover12Case7.hinges QuadHeightCover12Case7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadHeightCover12Case8.base QuadHeightCover12Case8.hinges QuadHeightCover12Case8.normalizationDenominator theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case8.base QuadHeightCover12Case8.hinges QuadHeightCover12Case8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadHeightCover12Case9.base QuadHeightCover12Case9.hinges QuadHeightCover12Case9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel private def zz1674:"s068a"="s068a":=by decide+kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case9.base QuadHeightCover12Case9.hinges QuadHeightCover12Case9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r81,RewriteAtoms.r32,RewriteAtoms.r77,RewriteAtoms.r16,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadHeightCover12Case10.base QuadHeightCover12Case10.hinges QuadHeightCover12Case10.normalizationDenominator theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case10.base QuadHeightCover12Case10.hinges QuadHeightCover12Case10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r81,RewriteAtoms.r82,RewriteAtoms.r32,RewriteAtoms.r61,RewriteAtoms.r77,RewriteAtoms.r16,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadHeightCover12Case11.base QuadHeightCover12Case11.hinges QuadHeightCover12Case11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel private def zz1675:"s068b"="s068b":=by decide+kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case11.base QuadHeightCover12Case11.hinges QuadHeightCover12Case11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r68,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadHeightCover12Case12.base QuadHeightCover12Case12.hinges QuadHeightCover12Case12.normalizationDenominator theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case12.base QuadHeightCover12Case12.hinges QuadHeightCover12Case12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadHeightCover12Case13.base QuadHeightCover12Case13.hinges QuadHeightCover12Case13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel private def zz1676:"s068c"="s068c":=by decide+kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case13.base QuadHeightCover12Case13.hinges QuadHeightCover12Case13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadHeightCover12Case14.base QuadHeightCover12Case14.hinges QuadHeightCover12Case14.normalizationDenominator theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case14.base QuadHeightCover12Case14.hinges QuadHeightCover12Case14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadHeightCover12Case15.base QuadHeightCover12Case15.hinges QuadHeightCover12Case15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel private def zz1677:"s068d"="s068d":=by decide+kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case15.base QuadHeightCover12Case15.hinges QuadHeightCover12Case15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadHeightCover12Case16.base QuadHeightCover12Case16.hinges QuadHeightCover12Case16.normalizationDenominator theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case16.base QuadHeightCover12Case16.hinges QuadHeightCover12Case16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r80,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadHeightCover12Case17.base QuadHeightCover12Case17.hinges QuadHeightCover12Case17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel private def zz1678:"s068e"="s068e":=by decide+kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case17.base QuadHeightCover12Case17.hinges QuadHeightCover12Case17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadHeightCover12Case18.base QuadHeightCover12Case18.hinges QuadHeightCover12Case18.normalizationDenominator theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case18.base QuadHeightCover12Case18.hinges QuadHeightCover12Case18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r77,RewriteAtoms.r68,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadHeightCover12Case19.base QuadHeightCover12Case19.hinges QuadHeightCover12Case19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel private def zz1679:"s068f"="s068f":=by decide+kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover12Case19.base QuadHeightCover12Case19.hinges QuadHeightCover12Case19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover12Case19.nonnegative x hx def pair20:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair20Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_20_base LocalPairs.compact_height12_pair_20_hinges theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalPairs.height12_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_20_base LocalPairs.compact_height12_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalPairs.height12_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair21Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_21_base LocalPairs.compact_height12_pair_21_hinges private def zz1680:"s0690"="s0690":=by decide+kernel theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalPairs.height12_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_21_base LocalPairs.compact_height12_pair_21_hinges x theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalPairs.height12_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 0 1 false def pair22Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair22Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_22_base LocalPairs.compact_height12_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel private def zz1681:"s0691"="s0691":=by decide+kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalPairs.height12_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_22_base LocalPairs.compact_height12_pair_22_hinges x theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalPairs.height12_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair23Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_23_base LocalPairs.compact_height12_pair_23_hinges theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalPairs.height12_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_23_base LocalPairs.compact_height12_pair_23_hinges x private def zz1682:"s0692"="s0692":=by decide+kernel theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalPairs.height12_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r69,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair24Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_24_base LocalPairs.compact_height12_pair_24_hinges theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalPairs.height12_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_24_base LocalPairs.compact_height12_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalPairs.height12_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair25Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_25_base LocalPairs.compact_height12_pair_25_hinges private def zz1683:"s0693"="s0693":=by decide+kernel theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalPairs.height12_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_25_base LocalPairs.compact_height12_pair_25_hinges x theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalPairs.height12_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair26Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_26_base LocalPairs.compact_height12_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel private def zz1684:"s0694"="s0694":=by decide+kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalPairs.height12_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_26_base LocalPairs.compact_height12_pair_26_hinges x theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalPairs.height12_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair27Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_27_base LocalPairs.compact_height12_pair_27_hinges theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalPairs.height12_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_27_base LocalPairs.compact_height12_pair_27_hinges x private def zz1685:"s0695"="s0695":=by decide+kernel theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalPairs.height12_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_28_base LocalPairs.compact_height12_pair_28_hinges theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalPairs.height12_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_28_base LocalPairs.compact_height12_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalPairs.height12_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_29_base LocalPairs.compact_height12_pair_29_hinges private def zz1686:"s0696"="s0696":=by decide+kernel theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalPairs.height12_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_29_base LocalPairs.compact_height12_pair_29_hinges x theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalPairs.height12_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair30Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_30_base LocalPairs.compact_height12_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel private def zz1687:"s0697"="s0697":=by decide+kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalPairs.height12_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_30_base LocalPairs.compact_height12_pair_30_hinges x theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalPairs.height12_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair31Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_31_base LocalPairs.compact_height12_pair_31_hinges theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalPairs.height12_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_31_base LocalPairs.compact_height12_pair_31_hinges x private def zz1688:"s0698"="s0698":=by decide+kernel theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalPairs.height12_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_32_base LocalPairs.compact_height12_pair_32_hinges theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalPairs.height12_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_32_base LocalPairs.compact_height12_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalPairs.height12_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_33_base LocalPairs.compact_height12_pair_33_hinges private def zz1689:"s0699"="s0699":=by decide+kernel theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalPairs.height12_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_33_base LocalPairs.compact_height12_pair_33_hinges x theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalPairs.height12_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair34Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_34_base LocalPairs.compact_height12_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel private def zz1690:"s069a"="s069a":=by decide+kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalPairs.height12_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_34_base LocalPairs.compact_height12_pair_34_hinges x theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalPairs.height12_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair35Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_35_base LocalPairs.compact_height12_pair_35_hinges theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalPairs.height12_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_35_base LocalPairs.compact_height12_pair_35_hinges x private def zz1691:"s069b"="s069b":=by decide+kernel theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalPairs.height12_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair36Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_36_base LocalPairs.compact_height12_pair_36_hinges theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalPairs.height12_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_36_base LocalPairs.compact_height12_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalPairs.height12_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair37Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_37_base LocalPairs.compact_height12_pair_37_hinges private def zz1692:"s069c"="s069c":=by decide+kernel theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalPairs.height12_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_37_base LocalPairs.compact_height12_pair_37_hinges x theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalPairs.height12_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_38_base LocalPairs.compact_height12_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel private def zz1693:"s069d"="s069d":=by decide+kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalPairs.height12_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_38_base LocalPairs.compact_height12_pair_38_hinges x theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalPairs.height12_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height12_pair_39_base LocalPairs.compact_height12_pair_39_hinges theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalPairs.height12_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height12_pair_39_base LocalPairs.compact_height12_pair_39_hinges x private def zz1694:"s069e"="s069e":=by decide+kernel theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalPairs.height12_pair_39_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.HeightCover12Rows private def zz2380:"s094c"="s094c":=by decide+kernel end section namespace Green24Proof.HeightCover12Cyclic open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows FullPhaseSemantics open FullPhaseRows (Phase) open FullPhaseAggregation (quadPoint_nonneg pairPoint_nonneg) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ExtendedFullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack HeightCover12Rows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact HeightCover12Rows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse HeightCover12Rows.rows p q same x] exact HeightCover12Rows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) private def zz1695:"s069f"="s069f":=by decide+kernel theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) HeightCover12Rows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact HeightCover12Rows.pair_nonneg p q h same x hx · rw [← HeightFullPhaseRows.pairSlack_swap ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) HeightCover12Rows.rows p q same x] exact HeightCover12Rows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible HeightCover12Rows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials HeightCover12Rows.rows theorem remaining_rows_count:remainingRows.length = 12:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : ((0x5f0eef / 0xee6b280):ℝ) * mass g ^ 2 + (8 / 5:ℝ) * energy g ≤ weightedAggregate ((6 / 5)) h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack HeightCover12Rows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (HeightFullPhaseRows.pairSlack ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) HeightCover12Rows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [HeightFullPhaseRows.local_slacks_sum ((6 / 5)) ((0x5f0eef / 0x3b9aca00)) (2 / 5) h4 h3 g hg,stripPotentials_sound ((6 / 5)) h4 h3 h5 g HeightCover12Rows.rows rows_admissible] at hs norm_num at hs change ((0x5f0eef / 0xee6b280):ℝ) * mass g ^ 2 + (8 / 5:ℝ) * energy g ≤ weightedAggregate ((6 / 5)) h4 h3 g (stripPotentials HeightCover12Rows.rows) + 4 * deficit g linarith end Green24Proof.HeightCover12Cyclic private def zz2381:"s094d"="s094d":=by decide+kernel end section namespace Green24Proof.PhaseWeightedVectors open FullPhaseRows (Phase) open PhaseMassRows private def zz1696:"s06a0"="s06a0":=by decide+kernel theorem massWeighted_vector {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ) (a c b d:ℚ) : massWeighted h4 g (fun p => ((![a,c,b,d]:Fin 4 → ℚ) p:ℝ)) = (a:ℝ) * phaseTotal h4 g 0 + (c:ℝ) * phaseTotal h4 g 1 + (b:ℝ) * phaseTotal h4 g 2 + (d:ℝ) * phaseTotal h4 g 3:=by rw [massWeighted_phaseTotal,sum_phase] rfl theorem odd_massSquare {q:ℕ} [NeZero q] (S:ℚ) (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) : FullPhaseAggregation.rowAggregate S h4 h3 g (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p)) = -(phaseTotal h4 g 1 - phaseTotal h4 g 3) ^ 2:=by rw [rowAggregate_massSquare,massWeighted_vector] norm_num ring end Green24Proof.PhaseWeightedVectors private def zz2382:"s094e"="s094e":=by decide+kernel end section namespace Green24Proof.HeightCover12Mass open ExtendedFullPhaseRows ExtendedFullPhaseAggregation open PhaseMassRows PhaseWeightedVectors PhaseColourRows theorem remainingRows_eq:HeightCover12Cyclic.remainingRows = [ ((0x39226203 / 0xee6b280), .base (.balance 0 (1))), ((0x4e345121 / 0xee6b280), .base (.balance 1 (-1))), ((0xe5bc1dd3 / 0x3b9aca00), .base (.balance 2 (1))), ((0x138499555 / 0x3b9aca00), .base (.balance 3 (-1))), ((0x853ad / 0x989680), .base (.child 0)), ((0x1345d / 0x7a1200), .base (.grandchild 1)), ((0xa42ffd / 0x3b9aca00), .base (.grandchild 3)), ((0xe22b / 0xbebc20), .colourChild (.phase 3)), ((0x149a115b / 0xbebc200), .base (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((0x31bb / 0x3b9aca0), .base (.massSquare false (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p))), ((0x8534d / 0x5f5e100), .base (.massSquare true (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((4 / 0x7d), .base (.normalization))]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff CombinedPolicyPackedRowsEquality.extendedEq CombinedPolicyPackedRowsEquality.extendedEq_iff _ _).mp decide +kernel noncomputable def balanceMass {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := (((0x39226203 / 0xee6b280):ℝ) * phaseTotal h4 g 0 + ((-0x4e345121 / 0xee6b280):ℝ) * phaseTotal h4 g 1 + ((0xe5bc1dd3 / 0x3b9aca00):ℝ) * phaseTotal h4 g 2 + ((-0x138499555 / 0x3b9aca00):ℝ) * phaseTotal h4 g 3) * ((phaseTotal h4 g 0 + phaseTotal h4 g 2) - ((6 / 5):ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (_hg:∀ i,0 ≤ g i) (_heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hrow0:rowAggregate ((6 / 5)) h4 h3 g (.base (.child 0)) ≤ 0) (hrow1:rowAggregate ((6 / 5)) h4 h3 g (.base (.grandchild 1)) ≤ 0) (hrow2:rowAggregate ((6 / 5)) h4 h3 g (.base (.grandchild 3)) ≤ 0) (hrow3:rowAggregate ((6 / 5)) h4 h3 g (.colourChild (.phase 3)) ≤ 0) : weightedAggregate ((6 / 5)) h4 h3 g HeightCover12Cyclic.remainingRows ≤ balanceMass h4 g - ((0x149a115b / 0xbebc200):ℝ) * (phaseTotal h4 g 1 - phaseTotal h4 g 3) ^ 2 + ((4 / 0x7d):ℝ) * mass g ^ 2:=by have hs9:=rowAggregate_massSquare_nonpos ((6 / 5)) h4 h3 g (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p) have hs10:=rowAggregate_colouredMassSquare_nonpos ((6 / 5)) h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_base,rowAggregate_balance,rowAggregate_normalization,odd_massSquare] simp only [rowAggregate_base] at hrow0 hrow1 hrow2 hrow3 norm_num unfold balanceMass linarith private def zz1697:"s06a1"="s06a1":=by decide+kernel theorem aggregate_of_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hrow0:rowAggregate ((6 / 5)) h4 h3 g (.base (.child 0)) ≤ 0) (hrow1:rowAggregate ((6 / 5)) h4 h3 g (.base (.grandchild 1)) ≤ 0) (hrow2:rowAggregate ((6 / 5)) h4 h3 g (.base (.grandchild 3)) ≤ 0) (hrow3:rowAggregate ((6 / 5)) h4 h3 g (.colourChild (.phase 3)) ≤ 0) (h5:¬5 ∣ q) : height12.Aggregate (phaseTotal h4 g 0 + phaseTotal h4 g 2) (phaseTotal h4 g 1 + phaseTotal h4 g 3) (phaseTotal h4 g 0 - phaseTotal h4 g 2) (phaseTotal h4 g 1 - phaseTotal h4 g 3) (energy g) (deficit g):=by have hc:=HeightCover12Cyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g hg heven hrow0 hrow1 hrow2 hrow3 have hm:mass g = (phaseTotal h4 g 0 + phaseTotal h4 g 2) + (phaseTotal h4 g 1 + phaseTotal h4 g 3):=by have ht:=phaseTotal_sum h4 g linarith rw [hm] at hc hr unfold HeightCoefficients.Aggregate height12 unfold balanceMass at hr norm_num nlinarith only [hc,hr] theorem height_bound_of_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hrow0:rowAggregate ((6 / 5)) h4 h3 g (.base (.child 0)) ≤ 0) (hrow1:rowAggregate ((6 / 5)) h4 h3 g (.base (.grandchild 1)) ≤ 0) (hrow2:rowAggregate ((6 / 5)) h4 h3 g (.base (.grandchild 3)) ≤ 0) (hrow3:rowAggregate ((6 / 5)) h4 h3 g (.colourChild (.phase 3)) ≤ 0) (h5:¬5 ∣ q) (hAB:(phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ (phaseTotal h4 g 0 + phaseTotal h4 g 2)) : (2 / 5:ℝ) * energy g + Q12 (phaseTotal h4 g 0 + phaseTotal h4 g 2) (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ deficit g:=by apply height12_of_aggregate · exact add_nonneg (phaseTotal_nonneg h4 g hg 1) (phaseTotal_nonneg h4 g hg 3) · exact hAB · exact sub_nonneg.mpr heven · have hb:=phaseTotal_nonneg h4 g hg 2 linarith · exact aggregate_of_rows h4 h3 g hg heven hrow0 hrow1 hrow2 hrow3 h5 end Green24Proof.HeightCover12Mass private def zz2383:"s094f"="s094f":=by decide+kernel end section namespace Green24Proof.HeightCover12Profile open PhaseMassRows ChildRows HeightChildRows ProfileChildren theorem height_bound_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (heven:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hAB:mass v ≤ mass u) : (2 / 5:ℝ) * energy (interleave u v) + Q12 (mass u) (mass v) ≤ deficit (interleave u v):=by have hg:=interleave_nonneg u v hu hv have hrow0:FullPhaseAggregation.rowAggregate ((6 / 5)) h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even] have hd:=ih m (by have hp:=NeZero.pos m; omega) (dvd_mul_left m 2) u hu linarith have hrow1:=Full27ProfileInterval.grandchild_nonpos_of_induction ((6 / 5)) h4 h3 (interleave u v) hg 1 ih have hrow2:=Full27ProfileInterval.grandchild_nonpos_of_induction ((6 / 5)) h4 h3 (interleave u v) hg 3 ih have hrow3:=ColourChildRows.phase_nonpos_of_induction ((6 / 5)) 3 h4 h3 (interleave u v) hg ih have hU:phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 = mass u:=by rw [phaseTotal_interleave_zero h4 h2,phaseTotal_interleave_two h4 h2,classMass_sum] have hV:phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3 = mass v:=by rw [phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2,classMass_sum] have h:=HeightCover12Mass.height_bound_of_rows h4 h3 (interleave u v) hg heven hrow0 hrow1 hrow2 hrow3 h5 (by rwa [hU,hV]) simpa only [hU,hV] using h theorem height_bound {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hAB:mass v ≤ mass u) : (2 / 5:ℝ) * energy (interleave u v) + Q12 (mass u) (mass v) ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,hE,heven⟩ := ProfileEnergyOrientation.orient_even_child h4 u v hu hv have h:=height_bound_ordered h4 h3 h5 h2 u' v' hu' hv' ih heven (by simpa only [hU,hV] using hAB) simpa only [hU,hV,hd,hE] using h end Green24Proof.HeightCover12Profile private def zz2384:"s0950"="s0950":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case0 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l15 l17 l21 l22 l25 l27 l28 l29 l30 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l5 l51 l54 l55 l6 l60 l62 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x2286f2260, -0x540e2cab8, -0x7e20b4b6e,0x126cb93ac], ![-0x540e2cab8, -0xced2df439,0x14eb65fdc,0x3e6a95b02], ![-0x7e20b4b6e,0x14eb65fdc, -0x20df0b8210,0x543bf3580], ![0x126cb93ac,0x3e6a95b02,0x543bf3580, -0x2a1288050]] noncomputable def hinges:Hinges:=[(-0x2175f44,l6),(-0x579f12ff,l5),(0x29e08155a,l4),(-0x579f12f9,l8),(-0x298d6887,l11),(-0x1551bdd4,l10),(0x54a749fee,l14),(-0xa61c4490,l17),(0x86d0bd98a,l15),(0x1fdd957d,l21),(0xffe804d9,l22),(-0x2a1288050,l27),(-0x1fdd957d,l28),(0x2a1288050,l29),(-0x54a749fee,l25),(0x11a0f304c,l30),(0x2a1288050,l33),(0x1551bdd4,l38),(-0x2a1288050,l35),(0x579f12f9,l36),(0x2a1288050,l37),(-0x29e08155a,l34),(-0x11a0f304c,l43),(-0xffe804d9,l42),(-0x86d0bd98a,l41),(0x2a1288050,l51),(0x298d6887,l55),(0x579f12ff,l54),(0x2175f44,l60),(0xa61c4490,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2a1288050,l27),(0x2a1288050,l29),(0x2a1288050,l33),(-0x2a1288050,l35),(0x2a1288050,l37),(0x2a1288050,l51),(0x54a749fee,l14),(-0x54a749fee,l25),(0x86d0bd98a,l15),(-0x86d0bd98a,l41),(0x11a0f304c,l30),(-0x11a0f304c,l43),(0x29e08155a,l4),(-0x29e08155a,l34),(-0xa61c4490,l17),(0xa61c4490,l62),(0xffe804d9,l22),(-0xffe804d9,l42),(-0x298d6887,l11),(0x298d6887,l55),(0x1fdd957d,l21),(-0x1fdd957d,l28),(-0x579f12ff,l5),(0x579f12ff,l54),(-0x579f12f9,l8),(0x579f12f9,l36),(-0x1551bdd4,l10),(0x1551bdd4,l38),(-0x2175f44,l6),(0x2175f44,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0x821401b300c0000002119028c020000008231024300c0000204610210c0405d4a102702544014000000000e01c8020001242a0900d400c00002cc930120c0400000b1244048301000002047101b0c04000000000c8052008000000000640c801000000000440d2008000001c86c050c030000007231036300c00001c4610318c04000000000840b20080000000015018802000000048340e30080000000011038802000000004870330040000000000c0c801000000000a8052008000000151103cc020000005221036300c0000144410318c040000ac421901e400c0000000a05014c02000000000070320040000000b05028c020000003209024300c0000094110218c040000002a0c013300c000000000140c801000000000240920080000000a0502cc02000000000b40e2008000000000540c801000000000a40b20080000000022014802000000000110320040000000004c0c801000000000780520080000000003c0c80100000000074092008000000000903480200000006834063008000001984c0bcc03000000461500a300c000000001301480200000004c2c06300800001242100c8c04001502705006d4011420a40420033500600000004c240630080056090160275004001482a04803d4010005c0a01c01750040000000026009200c000000000240c80100000000038052008000000110b018c02000000001c009200c0000000012014802,0xe40b20080000000006c0c801e0ca0c908095840180000001d19028c02000000000a409200800000148240c8c0300148430c807a40100c608c0ac03c90050000000582c0630080000022084068c0300000884c180640080000002211038c0200000844c180940080000001306038c020000000048303300400056108640d10030000000641c073008000002884c050c0300000b48c740e40080096158410269004000000094540930080000001b0e018c02000000068340e3008000000001a014802000000000240e20080000000906018c02000c42404c0cc40100000008824088c03001f03c0840784010003c0841a02710040000000001406200800740d02101e1004000f02105003c40100000000009018802000000220a00c300c000001c8c4050c03000007118406c30100000001a11018c02000000064140a3008000001c8a4090c03000007114408430100000001f0b028c02000000982901a300c0000002615038c02000000000980520080000000015038802000000000b80520080000000005c0c801000000000340d20080000001509028c0200000611440c6301000a81a05301e9004002986614409a40100000001106018c020000000a46409300800001442201e0c04000000000340e20080000014848070c03000000720c01b300c00002849101b0c0400000000883033004000000000a01c802002042405803940100000001d0503cc02,0x9120406c3010000000000a014802000000098440e300800530d02401e9004001443308c09a4010000000c844088c030000000642806300800001441201e0c04000000520a01c300c00d822421011900400000d61d003b301000000108480b0c03000000461201c300c000010c2202d0c0400000610c807830100000018868070c0300000000e8303300400000288cc094c0300000a118c09a30100000002119018c020000a08c3026a301400a220c130229004050881823025440140006220824051003a0880c10c09944018000000310f01cc020000000a8540e3008000000321d038c02000000000740e200800c91e0210119004000007615003b30100004c21868069003000000821202c300c000026230e039002000000861201c300c000020c2202d0c0400000610480783010000026210d01500200000008c380e30080000000021038802000000620a01c300c0000000221c0cc01000000004850330040000002516038c02001cc510840ba401000711482201e9004000000005870330040071144320265004038450862024940140000000907028c02000000000140920080000170a07039002002c491088078401016124210807e10050000000b444063008000002c884078c0300000a10c40963010000000220603cc02000000084140f300800000208240ccc030000000544806300800000000110188020000ac4a0c034400c000000000740c801,0x8239026300c0000144330268c04000050863026a30140000010864050c03000000000140d200800610c41302ed004028c3b043028b4014000000000d0248020000000443c053008000000000f0148020000004a0900b300c0000138110058c04000094260900b400c0000000078024803000000000cc0620080000000031018802000006a0440143010000001b024030c03000000640b01c300c000000190901cc02000068041002630140000019024030c03000000681100e300c0000001d1903cc020000004211014300c0000001916014c020000000645c0a3008000008c1302b8c0400000611540863010000001a0b404cc030000000000b0320040000000015024802000000064580b3008000003086c050c03000007110c09a30100001c220c09a8c05038c618540158401400000000210188020001c42a0900d400c000002c944050c0300000b128406c30100000002521028c0200000d130406c301000000001a140cc0100344340580394010000003487006cc030000000c4240f300814320410c0951005a0c80820c09944018000003085006cc03000000a211032300c008418c5301ed0040000005219014300c00000001a0c0cc010410618a302564016041831430285900600000004c1c0a30080000002e19038c02000000000640e2008000003086c098c030000000b4440a300800018218c09a8c05000000074140a30080000024904050c03,0x2c328220302971006000000000d40e2008000000002d0248020000008211032300c0000000037018802000000000d406200800033128300d1003048c710c3028b4014000000320603cc020000000c4140f300800000308240ccc030000000f444063008000003c884078c03000006c281c0e40080002461240d70c05000090843025c301400831b05302ad0040000000006406200800032118680b1003030842862017040140000003516038c0200000000589033006071c718302591006], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0x8104f7b82e2320c99d80be4a5901000703654c912e9bf1c6e5b301040764eb8a93129223b022a50221de767d078478e42179f40805a8fd9b0949ae8346b3cb75160641d0844cac5d92530f3c0c0182c2797d5643e3ff4c5ff0000022858159c8a28004d56eabd958652705bce6c38b61d891489fa8b2e6841d3e2f5024282345d0b8e102ca0d5bc3053f51f5e840000cd8c6800984084021860796e50889143a24588a4864d9384873420b7d41ed921415f4e348504142008e458006c2d37e009c40840200002c840a4540341a0002e0206a3b03411d92535ca1b0b0f441d083960e35fca70040b805aad0b2040f804045817a593ae19cd103821c12aa9a24a5656859c1e5ca1d47201029d342b1a133e5be020400ca7ca3a13821000438e29f406ea21e6831d908b30514088a10204708055cbbb2938381e67fa0002089932f4561000005b8d7a0700183194cc70c006243dbe41482128040000770e89fdd170aa50600e93216804170d8434684b1b40be0082abd36b681002dfff7a13001000438e796463d0e1450445081023840eb56d542383de61643d8301000b71ac11c11261478eb04131d732408400002dc6bd03801b3841ff8a400900200003a24454140006544001a4c82884c140262280311301e8843053c08b0eef3546d1a11c6a73f13817ae254ee100353da2ed94107c021c76c85649fe14507d2f52c470814140b468c0c00b71ac10e1845000d4d14340e51c912082739bc6569000016e35e81c024ff8fda22904230080000e511120588882e4d9727580016e358254199e62fd2c012967c129f1afe3c03e35fc77d5c338c22941ce49704576de107270c0599a21619a1160820840428d96b223a1f2789199fc421fb9060a9a4198155866088d04e7c90a87d7dac9e962474cfd02695b3b60cad252f1c34c877481450fa5ea589c22f3f0579470426caa72c282816eabc204188627a9a200005b8d7a0e01237493ee680016e358203218420080001bb20009da60180200811001c0300401163a4803ebb20708e40dea28abf206bc9003934b7d6a12060f804000034c800088100016220523201a0d0004dc110f090008e8105e0dfc6bf8f00f8d7f1df570ce308a5073925c1145786528c209ce5aa93d402aa95084aba900589d3b418febaea787132582a840618660418430158d62a5c043db5d670d21b329c2d664ae2d73874724cc9a4853a3d6d678cd695009ba81bae10dd17641750cb2266e1420569f7df64060b1819bee30c3152482c35e18123ca42c98003087ea3cbda3a1053265e8ac000413378151e1e1c003f9c0e12b8b0000b71ac10024090c2901c0001041c2800a03768e058e01ce92983c2c1445157cb1b0408d4bf586c381061832572d003800b4cb232920801e97440d9b000115563e29400088d8c989ddc4081480c00007f888706c434362180b03301d0a058f86918a2c84fb59885885a9bb75ea0184ad02d3c502013f69830600011d93b24c084401081c20497494842850a29455ae20514064c0c2fe1204005ad645bf040848b818775a082a43e77fac3450459906750e3041395a476509500054d79399dc7fa410a808000041e442c162140b910700c31ca082676e3a39d1c30112a821878491be81ee8104d42b761e8c04ac77976d040384abfac800199276fced003c3fb3ab68102300c0000e29c20043f99de4c0d953204928608016e358205092b163564020b9cde32b60e04016e35e80c054365c7c34c0109ac0906830119c5191b0009228480180001dc30000100440e3237c1828a2c5df6197c50205ea6bfb2000cb5b42f65000014c51fca004401000010722120b1080588382e0180200881c4d72846c38512401f5dc5161ae5fe144001c9a5beb509030880200001be4000470e146436f4fb003bae74fa0cf47e2332b42305f61c91e695a67e953ba798ab1e6300e2169e7d93f980509139aa9ef57bdb4865a90137678997424fa4a8f11279e00024f4e7d2834452e70553b6f27ed1b269e9a85f770fe72fffbec78a213ade2c0025300ae5510a55f68a0c5d962fee69cbcabeaadbaa075cf3c194a9092223d8c841a93c6be83ec4b1ea8dcabd5ea9f7e445b7495cf95318a2fd618a7b1aa00013e48003e710531d00b088003dd488306841404002efc43f0574171c8bbb096df48892c27f37fbe7c5000ec144867a602d4c916f595016c890325385ef83088dbe13f84a92f06208001dae48ea35381a86a81738847f60c0bee781d8ecbd3b3e7067aef195aea0a03b1a6f0dfeb2bd52b9bdbf0fc2e11124fb5cc2aa471aaed1f0413da15449cbfbd6f07713f813725386f13c0001e7105311d962cc0ca82a2880016e35821638005b8d7a09141be487fd0485674e19e4608207c7496e41202119f3a840201380d6d64a00050384) <<< 16000) + 0xa010c20167072f5260b55a9d9ff01452a55eb12e0c1844105e998a08000f423f01041c5baebb420001673169d8a0049b2e4eb000034311d84014841280430c2e3b24e2d7c30801d6d0be2c3305aab4c1ac1c528200cfb2fa6900820e3820307d830107a68b2be972c10011e19cd9014104cc503ca200000d6c706455c0c89082c0200001119806008020000088e100b3566199305b8f4883cb1c2000b71af4060c21ed0edcc2840e15db94f08203d0e0d3210000b30807ec5002507393280001a1ad17600a42094021c6826f18ef3b01861401645c2eb184009d85412eb982d8992cbfb2284103531b1488718083ed3bf541d9608008f0ce6c80a08266281e51000006b638322ae06448416010000088cd143bd5d825858972af1402a0441848010000087200097c40605402e1a00095c21f81bc1015c88835900dce3ae540120077b4525486016dae7c53008a12121200400003c887d9280b0642082a014110818280541400199c6885a8260694816a813e06914353d556e68308e424424f2c133c59906420449040715098208802020403a215fada9b04e40b263a0a02b01430524d6f4da06118359cc95e0d044b1fe11f4228202dc16031108106be5271760e0069a59cd1200c880c290200000ea9d203f2d27e92059e4c4875450cdaf997de0c239e93ad748049ef3560094008802020203d208670b8da205a65d3fc4430a8116cfc120123989ee0c70046886f320002c96be88898108802000026e4400241fe1200029821fc230fd09e0e448dab9c12387b66f94038954c1e79b88132fcba77c48214ae0b1518001f57435c13041100400ac178393f658aee38980d1fe7308107a9bdcc43001892f75e0120611004000037c80c08805c3409e02000287203c3b0fc0dddb7841c9c301757ef931330b5302b3da14caf8000000001091429028e18a10c00a006001aca93cf6d47785a8392b28b8d5cebc089458880291beb0adab906367287616680011010fb2982984e8553e35edfc51e1778394011d42bd05d1058a543107d9a196203b96b2a8354b25961bc6200dd068e411ba457d1656a5a14f1a24b6253d4b1d9511f28a15e7e0c97e32ea28d7b6e511b54eea38aacd4d681648f371bd4e4e2e72f72e2669d83ad9bbf45cbc03d727efca577da98c4ebb31bc42f5c9e710d38405071dc60771ff1d716bf54ce29a8af65486c2c5cbcfe560e5eadea0b599e5c25114f084f523b5732ecad1be1ff91cabd7ab1ff873b4e1749e09fd0808a47764e991c663cc102137e876b690ae9721200937e6163231e70f8b08c86579053899819d8e679fefeb567d37dc9cb2364c8f2e4f68d012cc7c9a480b00f0ca832497bc3aa358f4dac60e469bfb6db144eed22b448eff82ced415be8df44f1d0cd0f194b4aad7804b1a68cbff6e2ee10a35194eab6a2afdf2626616a60567b42995f0000000002112852051421012401801400c000e80c2543add7737a123eeaf2c2846dbea492319042794143088940007308160c83e8440016e243e474046120f809000b8b906111c0c5caa2f2c7d8e1437ac855f0614235261acca2c20452c127a333c2044731c42fba2808904a2c2e5900f0cb0968bd18a56618f189213d687ca3102811a2a6158140000834e103344adb561c181300a5b51e71620267325ec0725c30424a4a43955d0c013980a520bb6140d0ad54f895bc2005dc4fea009091550394295705bcca1bc8ba7c96521501fd27502f03000012610f74907b228184f61ea7b0f4098798283c80503389711003d9c3841bac61e99290c1404934b6ef542843a286327a4f10002494a9a970c380cd03501caa28a00a7231168e0e8882a2f78ccb20bbd402e768cd7f1e5549d00b80b1c60c740975f8ce2c650aeb71fc6126e33bf75082c8266e9b419294300066fedf006180f7b7a2e00484414d7acd9b0411f5907e74418066e15e6e818da410a4061c61593be32a161c5aae98a0576a924a0fa90d037f1842c5d2d63f38164568ecdc1d76820b558a5bf7e7100425bdc37f230801324d01b70a1f42010b00b00003d878c18b87f4f111c58cae3d4a1f8d28009a7e4e806126e5233c3212c826607d7e878c301ef6f45c009088295fdfe8a082522bb58718300cdca9482426d20052030e30dba5663d8716dc04adafa24954ef3201c18438d6482454b237516fd8d008384c59f02e200a9d9e4c4f080188e3b210290004a0280001ac20360a0003de20521301a0583d80c04807e6a1ca08b7b9a51fb218f8c184976754e2a1238007a11a00c3025f86d0e1818d078ac278e18eafa36ac14082811e60f1a073b1f31fdd20048010f3484986ed393e844f310e40d40d3c99e4a2ae659ca756f0520d25a21fb7886c7204c26ef20761e75a2c4c0ea6d6e83e06c79c70cb210e723423df09023cfb6f4255c1dc5010ff73df349d3d63edfba400e018000053643c4161e00381c65888c08f7ce2cb926a858489a513a2ff62c79288000bebb8a0038e076a854cc70d1071e59ce8f69020b7937ab68c2c10a880912632701616e79591bb22400ac08103891c61c6500054681a3e8af689197de12cb7bb063a3666eec1c51ac1ec43288a63cd2a2d7bc816d26dca6890de6edfb90425f20426c2fb59dce61a1402fd76d66595cf04600b4e85be2c449077f3fd1200720c00002a520fc0bd2b8669d6489d4d26b1af4a4ac0cc249b34fb9454091c00405f4b600c0c06c25634a7880806ee57739a040812b88677dc070097f472c8ce0100258f64af17861c9082c028000112900072c384ca538af4aeacd205)) <<< 16000) + 0x6034e782b86114b54718a3002c828cc4bf010d0c2027c0c5859d851029391e6499c7022a9de0540dc04124a0f6db9f41201024082c05bc48b92185a058c25b03da3dd4acd200b199be6d38c220ab763ba474b203d5532359184103748fc64ba0e040aa5bd2bf38104574792f9700600082ee6b3e4840059175f7cc504a248616012000089880023910531500b0480042bc87384ec943bdb79e96c61236c394fc84e6cca149c8888c7103448b548cd710a19b1440308977c0c59860944febbdfa9d0700c0101ed1ec6620001db042f126f0801ab894437c30820293882490c40f00004ca4390570259be9190a5360e2093bdca263970a1818f8419f3d588108aeaae4f72e8e0995c96e97fff1401ea63bb5c38c02000fe8ab4a543020885d0661c04f6439f1a2b3502e5c6872c3003400012310611982f04c1740723b0062229c4871113af9d046e4065eb22e227a1c3e4065642e58c18cdeb71c7881047cf6125f004800aa21c2d581000a66247493020366893ed8a0044091078520380002152004138788017b88cbf20509bfa69345258c08015fe6cf40141fa9e0b1a08220245565f2de00602be754f88ac0a03416c5cf5c05541515d2284e582102fb3a21581000007d0877a2c184e61dc6b0ed2987612c3ac861d43b05e198748ae4bf9d7a992fe75ea9e4cafcfa50cc7f7ec2212041441032001c01405005004504bff457ee85e4a18b19fa6142603d076d3d8be469522709296d0e8dea009675052ea5f15f4d7f6d350b967589d63537a23d9a6d6cb6646f136c03004011c15b62605d9c6cda306ebda8e2024343c58c845b789734c8e5e0b91cd3b9f748220204e9792d106007739d97a997ef40dd3668d6a178deb7d572e081e3bf42d83a94c4ec709c221252a492001ce01023a7c492882169776a446eb6b506e112d01bdafd9f4d82ac587c3f8fc75a8b4342f9f044b4b89fb6576f4268685d02c021871eee9772fa99ec80b1498110512572bf7a3e616bd461bda9d7edaba47df1b023cf4e0325aa15befd74d971c9615de29d0b25d931acbfc172af81ac5d0c34b5100000c1843a0360621b0300580900ec80831353383060ce6af591c0016e5a698008c50880210140100400001110531900b06800047087384f081211683c16061e851a742005f6f543184020fd60612808292141100400003b087314c010941ca330e41987186c388261c20b0e00586f80f0be58baa5428116015b560c0dda05db84204c89c89c8800036f3a3e2c0433268c0000082967fb0009c5084021859f32e35d14182e6ee96060c66a99cf858478d8556c2811d66994c8c0e8486fa542066cfff46601388108040378060002f070b4d9051ef1832ba079320810edb0e3bc306296b9f688002d53e2082c027feedd2800198c60c90009c50840218534cf0b6c8c1b9fee9c210080dbb3efc205471ec7570c168832a3c804a20420100de0180008f100029e21ba2b0dc09d11237f4f261434182858d8c08cad169df1422c54f86b8c0640d33b3c3c0040fa82bca00a410d1dd00271422008511fd4b64e6604b07fbd7514287611bec84004e0167c4024102100806d82c0003c48288c814034066020002b720bc130da01e1712517132688227b08d53434e5ee08e18113d2f02545089eaf589e9005b473e1a00261421008408059238010e32c4117b64e146a14fea270904911aa234316ae2c548c1a6895a91c26082100871b4235e4c8e14387900f4e12112a72b0d0cc7c739d460e842f0f00700bc1ae69026082000800009610d80906b848000a94e0a5b5d75804430e4671ca9817a07a5688c04700fd630582325056e91c10f12c2150a009a9657e8002718210080000b41c2b99026378c1e67ee9f2840ccd5a4e5a4014ff054f1a006a2be57000259a6c9d00130a1000438c65e403f070a17f1a2b670845b07a8c406102a6a201850115c88a08003932f453001000400e805c49d5785a3861321376225300451c8aac4000b855c44140019d7328128210804000040c86c848360241ae1200029a3848df038b018107a0798290116f60a94d00393888b2048203e0108020080200e80500a7caa1c82825ce2810240574c43ac700973ad268a07fd6eeaa4a083c010d14481164ac8177e7907a08046cc6fc508c108002000014e40006dc86b84800087886b088000c8c80039290d01986786ec80493689a8a2400c275b4e099d6ad10060233b359a244011eb01ed1800c9a312ac0261021008718ea4fd098e147f45737500c90f3558860d98ab1a5440e49e5eeac400022835d660020008694055393ae1c60fa68862a021c866d82900e16197f183823c8ce4f420042d6b2b8cc004201000012f21aa0b91a0af168289a38bbdd0d0230a1a6a2a78a420ac11e4426885e6ec90d1e044faf0dfa18080b04b5c8ce104401000016820881200041f36248c60594908b890e924045efab2e0023141d00800005310351906a0c80d04419a0200068631303e0f9df85123830be2880cf3e8a8b0c0ba0ba140cb04a41d8128406b58cebd926082000806900f05001100cb1817a7cb2da0f067a52b65e6021f368c7114059c274d781286108040000420e0cf16c437c80ef6e26b28c0818e8b9538041d0e5d6081a6fbd5725001f008069808348070000100402100b4742cd1af9629096e098e13f698220608cc20eed1c24ad96409a051d466966001d0086180b836a4384cd15ab81019984e4ac708bace5c2000996b72c9400740200001dc400088080013910d10d0001e210d01186784ec52439316870a7f9eb37)) <<< 16000) + 0x0c0fedbafe026103c0080ce05f0852663dd000b9ee7f89003b474cc403ecb85bc090307002000018c40d4440681a0cd010000eb90cc1d0648c832034001140400710480f18c32c57ab381f8e80d42f58e1ce999f6280e4cf04351e5620f54c0591421809208808409400e00000e89646e4f453099dc89af932ece1f1385aeb2d364a7ba53a0a9ca1c853b83128272eb4587d2585f4f8c187a44c38e60069e858ec8e01519ab794000ca384401080c027cb6df183a7105c52440e5a7077b70008c6088020194030000cc383178961da45873b4896810c191229dd922075544d6eb1e0026cd5a906003e849da78e0165a99f6400ce2844010e223ba9144614493e0628fa2000212c5520023102300868eb856bfae304fdb81db68e254351afdc90146bcc42a012081080400003748000d690c911064048000d7c86390800162c85e9680b0740a6120470900040710c63d86294c14447a22e1aaa2189100f6950c25054048dcce240533c4fca80120a1080430b037b349a2c37fc40ae8840172c2b56408c3084021c2d31bca3d2c033402e9c8800800210000100400001110c405f188da4d3ce3034a2552b22c0314b61af04610420100000ab2000320430c440004da64127a43d4e16946856bbbede0de0c9e31656fcac86164df59f45e23f94f5ed4313ce134ea7bdfb1622342155e62c6cc4012d8f2c890e7d6fdaea36a3554e1b68a823d213fec3d47b2fa698329729fd837a00df73ac16933cf6e4a37880bb6dc00a792d0a3b365ad97737e0a64d55f743aa145856506d2b60f0bc8b403814727d1ac074fe7bc0ba1097b3ad6ee0c3f95953275aa9448576a373aa4c9226de9220a50a5c51f2e97efcc2d2de92bb319bc4dcf494c98e0fd81b54310cb9aa800017c086104f0b12db5fd47804803b1fe1001053d054118410004200802008f1ad08c5ef22445350f3c18b0045e1339d23042200800005690000ea34468ff33e3300a2cabb2e1c050250e6e0230c200080000551c0e0478d5b043b7480cfee7b9329fc57d2b7c4ebe9dd783717c9c139e7e91ac6e9810006cb06f3a4f8197b2f498b2ee0c9429b6d2eeb5e08dc05d5d6ee091e2c6fbb018002c0bd0093eba1892552f1289652bd77186e85857e72b4bab2eb7b3a1fdce4f7c18cc0cf014e4a39d19a1f6d670c3ab45e721da3dbbca30b7853d209f02110338400021490291500d08813c14000dea4078761823bc1817cc88632c3b37d12a9460d2c2e37251011c3cdd141901088021c18ae7be5a6306e8429d8e9408f7bda7002038033ee19920109a545ac201f7cf6d4113021100400004dc86002c2fc1617c02b158e01f0da5056e7fc81b142547eb9e19401995292b86011ad6351a004a284201000010c34223ee2bc3c60968f760bc4820761d07d101f9ffcd900e02f7d821a80025182100800008710bd1d01608814c1408e0200051021784a0bb2105d0882e446170220a30505b8280059fc80222f90613182f08c1740761387e67195a2e137f602bc953c47687cad306cd79df324f94af6c1cb6f0e162182010f5f169a6a7447b87d38cd5e58c3217becb66b6936fb2be349de73346a2438138ff7042380e1a00abb4f7f9db07d8e299a1391b6c75c183c02cd25d389a883022dac0b736cdc2e12b26c93614ae8b4c60011308677ca5717cd399f70dcef608022d5dd0dbc54259e2c08f2a3c028c4625bf8d1492fc2d933f896901bfa2dad900050e056b182a34d11bf6626f67b57143ad2bc4e893ae67f242affdaa00e84c0e7011053cd1016d1f146df4ad2c0432456e2fa3384f5c8c19e93b392d88b1ee6c0a2d33a2e9f86830de3e82b96055f81066a4004938e1e98000484044010c34c0aa7e10705199bb251900198a40532000463844010e3ca71798383c30fea121f268070ea3f5b4002318230084110c56c8a10c0029e17be980110a118042018020080b60105a80c00013080007810001c4200052e4078861683b0b31505908c2c4360580b04a0585802f8520bf15d33de613d297105161b3b09aa5808b8ba691e2e6c92c15baf268a77b5dc8006b6c13ab26369b8c49fbac01de1fd00e00937de377f3773854e5ae1ba283242418030441dad08b8e295864f54aa5c1205800000105ee23ea2aea1f60e198d80c2e7623289d9af29a4e86d2f6fe1614a68f62d8d25098eb86049252e9b2b8342055f3d4a92142918e080a0378816108004a28420108080080202bc0600006e42b86615a2b0ac1105586f490825c425892492bf0c9c242ab22521bca057c1e6a1628040154eedc0000949088021020010047848c0b81c4584381802907013ea3a4da00013202000400005a10000f1200044a641a56a835fc90229e60c5000221422008404004011c504d570c8d200f2cad95468103cb5b54008c408402000016040003b48550a82a4441501b0a7090530080007e0e06349be6d678100d8b9c25016941f7f64014b200e1c0000012181000400003a480038490a5390291480a44400162a4291161466303515c03004010144030a10171cf1edb5410055db5c034022141f0080000401b1c064cfe0c781ad1baf452801a0708268004630420100000b430052f7c1ae8e01cd2c3ca000110e10004000021cfc6bf8f00f8d7f1df570ce308a5073925c111ab381f8e80d42f58e1ce999f6280e4cf04351e5620f54c05ab54ddf76dc961f98db027b3153e366827b85408dd9c4a3f6e360000000000000000008a61a0ee4631205a9448c09a00c000058f9e137106d70c3b30ec15a675aff089d638511298722583bb730)) <<< 16000) + 0xc2034f4190e9610782321f31d0e7218f6204c1c9b4b617c4bb192bb1f1d604debdefd4f8bd1800be8f1075fac691e436bf7666ec6d28429e97d00058b21404a01e1d04f8c82786413a2309c0d04d848268241320a0980504b808258040011f44006318d3a7c2a4462cf352e53000546b49a42eb922da6ed48a99504ddb431ddee2f1a80bec57096000000000000000004200000000028b6ff263952f8a66d4072bd48e91098ca1c7186085001010011a35e766888cd13b6b0f9ec9775c56fade566cc264ce45e7ffa03e8dc87b547a220d6a8001408a8d111e38a79e2136ab60bb14072690cb752b81a17bea6dc4edef5979d1e9b4cc884b8088ccccdb75de81c5d10e74239aad90b55b193021a4c43a4aa5ce59e29f510855d183e28002e410025e1200e8c469d1c4f1c0c873a9295bf1b66af58ceeb02026402a70fc240000000000000000202bedbc1b21dd013fb896e58193addc00c7096b42649a371187e40000000000000000000000000000000000000000000000000000ce4206380300280888890cc0735b86f9e71545da8e96fea2a365693efd1ff607024d0add960a86efb0b739b73f36b4e52b6d5a58b5f16a040a598351f5abb9963ff9af5976e475ac8ebb361b49656c8c9bb072f2cc7f74c4b4a0d237c2e3ba1a22ecc62d849d284348eaef8086d522faa5ac25b93ce6740ca7a54dea3a75e646b8a8ae1b780f3d845adb4037c8d896ca34f8a7860640171e4d2697fa210cb5f5fc3f4bb37f3b08847ef376cac7b6674a799bfb7a27ecd12ad195520f918f11cd88d2daa6d0008ca201005a402981cf0ad1fc1e66ac9b70d92b078bf4922843ffaad1991a3c282922090ad6d0812520fdf633080816b31187a9058c01e1ce9ae69ef661e767b08be5bc401d12e355bf84f89c156073426d0100a49e03c5c36d9d7cbbb7d4c03b4009bafeea70c3a399cc9a132fbc412a483d194ebe96675bf1c620a81509f292f2f75fd2fb97a6346912060da4ce0c2b8304e5c4d6d1e25f9e6bd59caa2681856463c9ab9d666056e34940c17aa3c30f89ce7100682a9f712d4843dd0ee9ae1221f726187ec850000e0ecb6b6c9fc8a289e155972d67d0ed8ab5d04103cdd6b9661b65363469f5e9a3423eaf7c13f8491267bf898df35b6a0c2a50774eca762193dc8f207859adf266f4582bc6b6e30aaa428951d058a2249b11f10291faf26ba28979a82a008818d06085e05820a21f9e88c009edad46a04c1844010b143db37ca02052246d5ce0512a983cf3710365f974ef8b04295c162a20003eae86b826082200804a82800053881488c0682609e03918b1a842101859e2088ed0409b21fd50018131d41ff8c700ba550e5725042200848c0be667ad8c2d36333eee2881ac2727e0815786d3b903024d8e95b1ca00440100940100008e10930984902f067a6ec3324616e52c35cd144073f6f1444099c6755762c1232a51474204122cf0a71c019d435fb409c3088021832d413034a30b5409f0348a229eaab7342047212212796099e2cc8321022482038a84c1044010091050000a710002d221202208f090002c09012210340480022a48151281e444001a844238860541b08d09ca0e724baae19c6111f1afe3bcf8d7f1e00883a6c320f9ca524ca55b0575568f54dcb952055fa48692600000000000000003e3cb77b289940630b6528e54cb49925a60b9efcd5ef0cc13680000000000000000000000000000000000000000000000000018d8be08382dc0a414220118014010050501598a42c70e98fe01d8672c80cab22a96eff902c30f56f8ed7e153edd015105a1442912507dbd832f26bd92e8e48710c2d497537c4880a1d5ed1e2ac0aec5dec8cb87f24c8d7d9ce3690041393ac649e9787a659e7c87d230b49cc5ae6b437d9c0cb9a9d839751541a4612e0877962053ba38298f61022fcf3e5656d29cf4346f57b819527a2a61ee1040170aef2a85ffa6b9ff9c969d4fddf72138bf14e0e73f51644052a573a4b10001c66e48e6f1380d1e6823463a391d10a30a76c1856c7f43d6065450980200d1c0cb0964c5f88b268e3af3e4b882c2a5b81fb5e8b4211953256277604040003878bb0476cda104296e041599c658cf1c3149f0c25c300be90f74d740015b6bb411ca8f7179b9dfe34991185ee6c06cd95ea5640c51e13deec90383410e043945186c0c0d42e0de74453a9963cc9316350adf08095a3075b1321cb834356007410937cf2768d3b84477d946aaee861c4871d2630c261125b6628fb50306cdba0a92ec99d512d7ee16c95fbb470f99f8b9f9929b20059f14d4d59836f53c9c4052fbe39c506712ce89736a8ce43ab31b85d4634e001820801605d26bfca186b30bd75ca70b48d8f659fb7af46a4893aebe7d64b00123e2df97bbb07386465345db01aff6f9723a69dce4f271a4065d39bffe551d3259c9ac00b6755d58af4237dba2d8f15e75f86f410f6b82d668c53ccd310316eb779dca14689affc428bae53242a0826746deaf18017f2d3fc1094308402100c010040000111818664592ae50a27075cb91452d53cd9c841407ab9dbcc00734cadb3500210044000040100000444230141160a08a050000be90002dd35f6de0d90ee809fdc4b72c0c9d6ee006384b5a1324d1b88c3f200000000000000000000000000000000000000000000000000006772ccf9834ae6cfba4c2f59aa7d6c275daa5878aa2573a8f61a000000000000000000000000000000000000000000000000001908d1c610408a048000000c23807630ceedbec37a4c90784d82c99)) <<< 16000) + 0xd0d8e8490e363d4201d9f0e52e36e7f655da9a3992216baa134818b7dab9aaa301958cef68d92614e632ac88380618e5104566ae83f101802dc6b04b08d66893cc08229127cea1409ca51e9c20584084011e640d784bd23c1f274b9b2d90eae3770331e41289b8fdcfe3f200000000000000000000000000000000000000000000000000006757db783643ba027f712dcb03275bb8018e12d684c9346e230fc800000000000000000000000000000000000000000000000000019c8a14810610408208e00c00b82008036060234ec479428363f3490517359b29044886b810a693030c0decae84118f4603699810840200002624224141100a00053d2000d1c400303c8288cc14037830b98143f140a143a0890bfc03583820217a905d630404ada48f3785e0e027ea61e54a56040d4b3b85775aa0016f7745cee0b8027103881781e24411132ee70206df3dff04020b6fd4ed239c00044aa08634017114a888580455f640a0d8108c021c51cb0c843104c78f7030343e016a54b0822616f88e640420008000069108705e8e00478673640c20fa247365804062036b9b7380618803c0ef7f818508e17cb2ce82087c2435dbd45004ab938481d0001d3a8e3cc1c86440615010000077480021b90860d042868210140660200067921062308205c8cb090cb845177f0b353180600694bf4230c1f0084030040100000446018020080810100001b9f2401452b8840c02dc6bd01850cc97e889c1cbfbe741860651683c1478001973f7c380b82cc7410138610804244c4d035827869c36ab2ce09156a3818400932016d4240c1f0080000699e281ac5645e28a1f4bd4b1244005b8d608c247ae86f7051011912522701355f310030000b71af4170421004489021101ba7862407fe4a70429237b2450210aa252a10016c5615eca08400100000ff21000a07f05000150900050c20f813e20a5d31b9c70c71a40cc44020f68703b1c180e313c98a080fa16f98d00062d42f8013081080438812ac8ff01c3137c550c0c111ae1530c3092b57d9c4402016165bc1c1914cb437940038d866dc02710210080000b190531500b068000b788288ec14047c502983d1b785145564a14287067923e23692c200262592e0c12e0fcf12e020908ac23e4470115630e31f30000e4e1b105200094051c40198e12d3c3ff1d41400825536ddcc3c158c0e0803010b96407c04016f71a59980080020000250743b17aa3711008975610f48000336b61030002bd54b324042100800006b907e05ce45801caebd93ca2bc3b7da073bda208686a68ca69a5ec3e14800000000000000000000000000000000000000000000000000019c4f2c618f1030cc04704f00d030000200da1c02e77c90f1676f6cc69012566ab80d00996588988d080aa1d35ca0440bfc7302007112520a700200080000aa98184276b644247016e35e80e303d9c36d461828afbd7078a23977dd03c41a9d134a1e069a1d34b0501890f6f914001080420513ae19cd123821c12aa9e2e5ca1d472024a565685a0133e5be021a1029d342b0400ca7ca3a4e004001000015620005f6788565f3ed88593faf9ac09fd4045c77df15f9356cd1246879e468d4d0216be5205e7b1f2b98316ed85e3309a21cd06c74cea4e2c6789855961a2de7cf0f78d472eaa7a9e0000cea387ab24daaae0d327f8b20104959adf965db2040320640268dcd0c336f9907b5a881965509f6433f494cbbb3740b04e0d6e530e230955b1d846d59012ac8d00fa0a00044a200162c41f007830bd6660dc0d554f09c520f9dc4f6eb990012d3871b1d93bb15ffed0060803f546ea9224bc37919e1848f096f7c637a14df238a488953a0c9002c19b41cfcdff8d2d16909e8cd6fc856c206e137dbb92ce8b295c1f240060198d3c5e50fc8df9b8367b5bc25761ab0ecb2380f3ee81e7f13a25c0517a2258351f331eda1a2b2013fc4cbd08efc3e8d4a81b75a37e412162900d71ae2edf5b1443c7771185fefaec26204442206eb80410de2f800b0480015fc814888068440f60a07a05000a9510610d000f78106811001d0a9079190020ea10048f320f0830613d81198800c05c41a515c6745102ac945c7142690a4e410506fae627691c09b440593c500026c8fec0098408802185227c2d4d880ebb6cb6081833bbecff1860b9931974b2803437cc2b82508220084880f8e3fa18e239571e80e3877552cca10c0076f6da2c48084401091000ebbaa31c484812bf6470e5b337a3f23042200800005690001a320ee120002dd20ec230751183a04c1cc26030030720181600c1c407c52ce320824710b90e3d74242eb39ecc7c709b40ccace1010a5e29640901d04513240982088021428183227648178de69938406dedc0a55142089bcb058e009bab35ac94108402142817042ff48173751492e2883b0627d5203b2f65bb79810ac1e3c90100035b2d524c084201000013120004a040a4260340b0700183780e4603dc2f0bfb11511c5103e51d1048766185220518e0530e412c41d21de3f804b4c2442b8db19ef7be5c143c3d316ac9500b4202094869729e83731024010f7779d010d2c02017da71292d4400983f4a440e0161a40023ce95210397450028616313eb4a2430e2d60439f538c242edb26cf9e00018ba37294000e6dc5639382120042072d740d2e52c627d0d46c41c5ae7c961a71849a705bafb04100accd99e000003904f642604240080000a1906e05e94017f5bf4c512003ac36f440c0124e028a38c57dddbaca50a50229f4a830946164aac8287315669d3)) <<< 16000) + 0x058018c5db1e605018480100001a72000950685073643c55a72ad0c209222ed5d1a1ed4510395631d762e0de5062158dd328afc86203280d0189b7aa910811b9f3cff919d3c0306278c4dda1dd5b85802976d0e1c87e921c0016d542af3ab3e003a822048a1c82c0000ab0c8e0182593589189cb8cd6f8e28088d1f771853dc7655384881a2c7166850eb8a487cc941082baebd267042300858c0d1db133c918b17a82928e28c92def891851505cd564287bb0cf6564a090c75fc7190002fafafac2704230080000b61a154215edfd2054080be0406127ca7eb3c20333dda40c080821a3c38b10245d9242a47007135db8009c20880200002ce40603402e1206d0500025a1000efa20d83306b11d0a0d54e247102acce59adc288756a47d58c1871528368287a791c1d3b28211004207328ed82c8a16dbb39069144e755c5f7860d717fb3d01437fb7539f8900849645cf100feb5690f49c10880200002ca78c6827f26e12252f0dd70838869bb00d0081a761e5ade20547300eb61001e2943dd613041100400004e083504f0a4b50cbef901ce3db41b63065dd20ca206147dabf3c420237ac5d7b060c9759ba6c28034619ef3804e204401000016a20d22a0470d03402819c040cc020005df20ca4206415000cad106331831188184860c03305f1902f04c1740763b17800c6070a68c2968c2051cf0629218179e854c98c02d37e3264002518210086106d5816dc8a1c8192e0586001efe411c0a021f53993000482844010b110601870e489ee403b651c146fa0714060d83231f2c801230e4708181c0ea536c26042100868c12cea7aa8c32c035da84489318a51c68c21fc6f690a1824b092553328211004000042482e02816c140060300029420007244130660962b0490982402c168140b20304601e92c9aa34b69a306b5414883097ff97d1a960464207b305006eda417780128a1100438a1a0b769c071c37c9b59428533624c4c4714cb1017c53841e4a60768512993874541415790d951c027102200850a1e09be620e2c83cbc6fc289074b503a8a099f0bce62700c86aad4e8e0037aa3e16013081100400004f480016190581582b86f496e42dda6c613037f072428121fe767c4b02a45399fd28016466dda0000947088021c5292d30ee071cbf4d122c60b98723b68285d670e71a0e2ab097d064513637b8236584809dc6e00009c6084021829ff96980050a65ea1e768e2cfad9cba2700dcb526c20004830440100000e520004d04000e6082b12ea54212aea4016c501c99e70e74ccfd01a85eb0d59c0fc61091639210e10810409600c00001a2591b93d14c2677226be4cbb387c9385aeb2d364a7ba53a0a9ca1c853a00042a40b4b40583a02b0900052810553982a12c14c360a413b0ab09e326c8920b8d8154c8720a3abfcb8c60dcd3de558db3d5d9193f29fe84b44700487558ed39728b3a912db2278ebd94550f3aae339122a0f97f662fc2f60c93ec00eace4f7fa0eada6572ac4dbfb89ccce13c8d8667e485b1ef1e32829ddb01008210feead769c0f237cfa09c5a3673da483edf5bcb8fa998b2e3d0e19108801be30c48845ba2143968c26f78c13330cba48d01527805d40481842010a0eb212b230a004e83c0c0280aa0631bb23042100840100401000004478e0772a68f03081625d58302094003c27b8706017a36e2660006058b98e128412004000045080010a900030a20a2230500d82780f038dae64baef770c8190b2fa7210859c4a67f362a274680411fe91aaf34be2286464b175761ba7eb5ef7d006a185786b89aec86d2dcd2bcfcf293f1e7ecdc80091abf5d3e2f5088102f75379eb2358318d7cafa8cabcc83a77f7daf84528113e021aa47d1c6696b16b196ec3c8c6eaf9fb91dd2b9317668c9a6fe03a0eea18045fadb9103109454d02de13fd558576d598ec1600e12d8c43bcce182df02143196011b3b175c881084021004010040000111e14720478fb14182db22ce0a006312ad61240097edba9424082200800006e9c207f35d4650825508b69f61218406dfe049800260ccf45820015cfc27781286120040000458800171104e11f0ace2e98ce1813921ca6dc204f9bae1b41c0398950c4460009f1540a0009460880200002244134240012524130760963b04a1d02488c1203608e0b04601d022a58b5260057258e458083ccf8a281ca5e90e0481838010810930f14c940d05c8e810c0fe8a885411840f80401141400017640f446078138154a1182d3018c17d9700088507802152a109575200ba8f2b107aa602e944b607e9dcd118b6ff373e79b9f56dd8dca97519793977380000000000000000042b02e21be27502d0610c08908f000002de7e52d3424c1e5e7c277f4c3f83788d0580387fe99b48e45d8629a504e2862890a3c1b24b576e12d2f0594ca2e8e5319144340b4ba60154e4eb88183e9a218a88a7219b60a44385865fc61010f23393d07010b5acae3300108042063a93f4262c41fd15cdd443243cd562183662ac69514392797bab140008a0d7598008002000025240dc178580d96b5fa38a8e16a462a024bc930442382536968981a00556013ac5002a826a6884c10440100001392088120003f12000f58400211881a8ec10c760682b03305e100d5e86a58bd5e40b63871fef606404563831c0006bbca852800e004308444bc35182c944817cb161409508788d6338b52024ec9d6d1805400d7e66001d00800008b98000080201080600006e64578b621be5857b7135945040c745ca9e020e872eb040d37deab92800f80)) <<< 16000) + 0x401040607e0200012220801b9180044032c487e9f2cb682811a6e1cee9209504b193c6016709d35e04a1842010c243e0f9df86123830be2890fa0ba140cb08f3e8a8b0a04a41d8128406b58cebd926082000801f808000508800132903e1181e88c0f02723493791bd8c19879b28992087fba99511821000430946acf49c307566867ac9044a4c6251a021c9c83624041f00800006798020080200e80600006e40dc27030a5549f030b2e0352b4d03a7a17d9280377e4795024101e008000069103b11c0b3aaf0b470c26426ec449c008a391558700170ab888200033ae65025042100840c648566dc58a4363dfb25881c91ee6c3860debb55a18502b7f11e0820c6cb07808001e43a6d3801000400e8060002d440e4260701303709f15cc8131bc71333f74f9420666ad272cd00a7f82a78a003515f2b80012cd364e8009850800200002644001054c8c5b5d7580243f40f4ad1181072338e54a0464a0add2482471aad2d1010789610a8c009a9657e80027182100840da11af26458b089539585881c3c807a60663e39cea307421787804005e0d734813041000422382c91c0088196208bdb258b04911aa22c41a853fa89818b57162a460d344ad48e13041080400004d081c04c0dc27c5c4945c4c942272f70470a0c44f611aa5844f4bc09514227abd6279a016d1cf868009850840200002704000fe48002be1000cc12062320300d0009c21a1cbadd3d80d0922cb05202841e56d8c6340a267701700003f2f8df000a8a108023091107bd5e706dbd058963070177cb3a13082000401900b0a83050b1b0c2246fe9e4c7066568b4ef8c1962a7c35c70520699d9e1600207d415e400520868ee813861100400005a081b04800095081a8cc0d03606603c21c394bd4c60dc7a70abc2852d8f92520c16949a15220482042010032016129b20a3de3065740f2641421db61c77860c52d73ed0b005aa7c4104004ffddba50003318c19200138a108040000594e12918975fc486114e1c351830ef17ccb1208db2e5618607650e706c102d09b40b30098408402006402c27962ea95090458056d58303768176e10813227227216000dbce8f88010cc9a30000020a59fec002714210080000b290002cb206222030050002c0902f090170280025f88169a80b094056220027f320547202519001cc8981015cc34580e0857b3eda19b0b7230e06a273434498e9abb892b081121b9290e05fde51e1cb0a76fe2ec25ea59ed075066ba7ca9972d47c4e243a75e7c1552c603be2dd59c57af4f577bd0c727a8a58b44d587edf8b296621fc2e6b25804ca0280f6d3b4955401fc799feb639a86e1dc1d5ed192842ca61e409e572abc6460d40408c8f718fbd76bc055c9eac5220c8a6602fbc6953b7a338105b7872c274c34a5782c2d6d699e074f63baf701f01e285efd8377dac4de2305d06990a3d4d510140100450a47d1eea30c1e775ef8f0c001daff644008c508402000016440a4660341bc081e447fb30fa2a1359575e9a3273ef9f3817d2068a55502830e97d921f172172c7b0b224b33bfb3b7e711445d70a9806000beed65d11a88cf79df9038853cdfe7e228a06b626150080a381401e3e7ce60e229ac05b95cc1f8036a752a7a921e20432bdfb610a2f2cd15ec8b31a75df753d7702d64646437c425edc15e6a313c16006856d00b008cece708196c4b080600802000008881406809c2404c020120100028490250900032910242d01194c08874042320201100f8680782403a0a01c0500069490056fd200ebf86fcb7826271ee3ea4f53cbe0f8c03ea443e3dec5e9088eaf6400000000000000000000000000000000000000000000000000c6228630430228220218010020229ab0100a84c3749909670d61d5c1ea64a72b0de0442cf967bd4aa4d0581b568eb138f714b58cc38a1cd45ed4f44029d2a245e58e0cf8674e59d8655c258c753b33182c7b5b417e2844a0e72230500f6c2233c880126cb93ac0c015b5f2768a08a58908c011030c898dc54c8128e3c48d2220412b16324c1800941ce44620c8204a010a2023c9dab102cb183993c2d7980a1a29b0f44441491800478653c002081b110a666d07000d00aa18870500a239063a731721c20b008184a73bdef885929cc0d2b9183d8e29c02c58e24efdaef9824b9b2b0743813cecb7048c011e411b59380110043090ed6425ef9649443e53b80c1c0e59db6f250e002dc69c018402a0c45268209ebb0d0c88b0250698d2093801280400005e080d808000c2cd90d665b5a7f288577ab7c04163616e0ed738a18da624be9a58733c31501c180c120c8a2f0a018d5c4fbda8e004a028b203b76e13ae51051ed156b22c6038f00ec0923000b71a70050c0633fd97650127574613298009402000028e406804032020003072000ff640605602e13a1d15f902b02475272a8618a172c946c252450b404a3f410607d7d126140a21c190204007caa366d9c0088021438742afa0f12393f2e0b7b94281f3acfc7102800b71a7008080b4d4df582083b9ca3809204a5e3627ddc00900100002e040581743a2ab1695e48ea51ae8d1942e5cc4833248a15fe9174020a9d30c5ac281445c25e00800f8acc42c4e0844010a1c3e952faa448e47ef02a4028502c76d503102800b71a700908132ab1fda481315558da42604250080000a490002c9202a0a0140500980804804000c76404424001f30404054002226403cc401c4a00d210060c802c54014220090d00404801c2400c0200501000af79004410018c80084400202000010073cc1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 31 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case0" = "QuadHeightCover18Case0" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 31 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case0 private def zz2385:"s0951"="s0951":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case1 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l15 l17 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l43 l46 l5 l51 l54 l55 l57 l6 l60 l62 l63 l64 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x263d210a6, -0x540e2cab8, -0x7e20b4b32,0x11a4f25c4], ![-0x540e2cab8, -0xcdeb8365d,0x143b7f844,0x3f24e161e], ![-0x7e20b4b32,0x143b7f844, -0x20df0b8210,0x543bf3580], ![0x11a4f25c4,0x3f24e161e,0x543bf3580, -0x2a1288050]] noncomputable def hinges:Hinges:=[(-0x2175f44,l6),(-0x579f12ff,l5),(0x29e08155a,l4),(-0x579f12f9,l8),(-0x298d6887,l11),(-0x1551bdd4,l10),(0x591c1777c,l14),(-0x148a6aa40,l17),(0x378e0d030,l15),(0x94f3045d,l23),(-0x2a1288050,l27),(0x2a1288050,l29),(-0x591c1777c,l25),(0xd3472125,l31),(0x1415a8f9c,l30),(0x2a1288050,l33),(0x1551bdd4,l38),(-0x2a1288050,l35),(0x579f12f9,l36),(0x2a1288050,l37),(-0x29e08155a,l34),(-0x1415a8f9c,l43),(-0x378e0d030,l41),(0x66ac1090,l46),(0x2a1288050,l51),(0x298d6887,l55),(0x579f12ff,l54),(-0xd3472125,l57),(0x2175f44,l60),(-0x94f3045d,l63),(0x148a6aa40,l62),(-0x66ac1090,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2a1288050,l27),(0x2a1288050,l29),(0x2a1288050,l33),(-0x2a1288050,l35),(0x2a1288050,l37),(0x2a1288050,l51),(0x591c1777c,l14),(-0x591c1777c,l25),(0xd3472125,l31),(-0xd3472125,l57),(-0x148a6aa40,l17),(0x148a6aa40,l62),(0x1415a8f9c,l30),(-0x1415a8f9c,l43),(0x94f3045d,l23),(-0x94f3045d,l63),(0x378e0d030,l15),(-0x378e0d030,l41),(0x29e08155a,l4),(-0x29e08155a,l34),(0x66ac1090,l46),(-0x66ac1090,l64),(-0x298d6887,l11),(0x298d6887,l55),(-0x579f12ff,l5),(0x579f12ff,l54),(-0x579f12f9,l8),(0x579f12f9,l36),(-0x1551bdd4,l10),(0x1551bdd4,l38),(-0x2175f44,l6),(0x2175f44,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x2c6508408125200a0000000000090320040000000000c816401000000001a0503cc0200000823b0500b20060000000074140730080000000004201a401800000000019018802000000322a1a03a00400000c4521a016400c0000188a43804c80180000000000d01c8020000000000900790060000000001302f200c000000a62381506020000001444501a0c040014623c140128200a0000005110406c301000000a510a04986028000014e21c0930c05000000000088069006000000630840a9301000000c3088036460280000000000901c80200000000000b8190020000000004850330040000000050280a601000000000001c0c80100000000160a05180400010c28044053401000000000000a06400800000000a0502cc020000001582e043180800000000002409200800000005418026601800000009824088c0300000000005a0710040000000000a40b20080000000001300a401000000000004c0c80100000000000a819002000000000088052008000000000022064008000000000210248020000003e2a1a0520040000000000a00f200c0000000001605e401800000011854028c03000000000026029004000000004c2c0630080000009210806460200004d08c1200c90040000000026120318040001482a04803d40100a20508220031a80300005609016027500402841480840066a00c0029828826012d40140002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0xf8190020000000000f40b2008000000005c00264020000002a031004cc0400000000006402900400000000001903200400000000003a064008000000288c40f4c0300000000423a0518040000000000b80520080000000001681240100000002786406cc0300000000000a0690040000000000640720080000000006a0264018000000000dc02c8030018c118158079200a000000000014062008000000e23180d060200000000261b014c02001c6324540128200a00000008615016300c0000000118b00a60100000430d0440910030000000230d00618060000000660a00c300c0003e0781080f080200003c0841a02710040000000000120310040000000220a00c300c0000000009e016401800000344c101b0c040000000531d00e180600000000c4140a300800000146390128602000000002f16038c02002cc4107181e9a00a00000000a418063008000648c81980ce8020000000000290388020000004c322a03a0040002586106409b4010000025868220488018000000308ac098c030000000006468198020000184642b024400c00000000c8681c60100000000291b01cc0200346608608125200a00000000000d0320040000000168f00e60100000000002503880200000004308813180600020c2704c0194010000418ee1900988020000811d4320131004000000003c1a0598040053c678a300f140140000000a442028601800000025854058c0300000004b0881318060000000a21b026300c0000000000481a40100000000151202cc02,0x20e39c5a81eda00a00000f85221036400c00760a11020324802800e3142204066d005039e28a20a042da00c003d45388703db4014000000017068166010000000002e1c0cc0100004a640203d2180c0000000058140b3008000000000b060660080008610c1301ed0040000000310d00a980600000009624011300c0000208e45c06c801801011c22b0064900503922ce0a205b5a00c0002585104c05b401000808e1146033680282051c514f0216d0060000000430981298060000000620a015300c0000001103602260180007218c420371004000000003a220598040000000001900d200c00000000090e066008000000001a140cc0100000000160a07180400000000241c0a300800000000000606400800000000005024802000003085380f9180a0000000044140f3008000000c61881526020000018619006c8c050000a22182404420080000000000640d20080000000001d00a401000000003b15038c020000002286e0141808000000410cc02830100000000001180c401000000001712038c02000000002a0c03180400000000005807200800000000b8480e601000000001d19028c02000005a270481ea0060000000ae09013300c0c788202101ae0803000c310808808e100500000001b0480a98060000003304407f30100000000148881e60100000000001102c8020000005886204b18080000000098180f30080000000128281e6010000000248240ccc0300000000322c03180400000000005406200800000046088110602000000860840860c05,0x340208013180a0000000068240630080000000108e81e6010000000208e40d8c03000000408e2063180800000000078503300400000086110178602000000104220160c0400000000322c02980400000000645c0a3008000308b00980a6802000000000002c0c80100000000322c0598040000006716c08630100000000000a81240100000001a0b404cc03000000031158111806000000630f404f3010000000c21b0074602000001861f009f8c0500000000004a0310040000000000740b200800000000f0481e6010000002444301a0c0400000000001a0690040000000054380b30081421018e18142c80300000532482805900300000000520a03980400000007611026300c0f38a4836808d68030000036108640d9003001982043080c9200a0030c40861019b40140c7882862810b6803000d510e19c0f6d005000000007a2c0398040000000074240b3008000001622980d060200000000391301cc02000146498e806520096c892429900bd7401c00b612214c027a802800000002e1502cc020001661b82201ca0080000000000c40e200800000186290128602001c62063900f4d005000000006a0a051804000358610e409b4010000001e27080d8602000000003905028c020000000631500e180600000009241022300c0000000001a81c4010000002047301a0c04002063a4540128200a0000000a611026300c0a306784780744803000000000003c0c8010000000311480a180600000004613025300c1138c4836808d68030000811181500ed004,0x690481998060000000de2101b300c000498f831815680200000003b82404cc030024440c308125200a0000000084140730080000218481602c801800000002f21014c020000000036240718040001ec6304409a401000000000e8300c60100000000001d01880200000000663207180400000008629037300c0e68c602781f7480300000000110701cc0200000000002203900400000cc4c1b027400c0c1886861805c68030000711844303710040000000391881318060000000006870330040000000058380c601000000000260c0cc0100000000004a0390040000000004d013200c000408e22981b88020000000208e4098c0303983061940430200c081063c510096a40180000208c85204e801800a30ec10c0a2d00500000000001a04900400000000443c0530080000000000780a401000000138110058c04000004a1304805a0060000000001e009200c0000000001980c40100000000003101880200000000000d8190020000000000a80520080000208e862048801800f208a0b406310050000001a04a01c9808000000001a001320100000000cc4a01460180000000001b01480200000000362603180400000069104032301000000000d8880c60100000000161201cc0200000002c138099806000000000058052008000000a4240026602000000001611014c0200000000016004900600000000036009200c000000d408802860200000001b024030c030000000320580e18060000000640900c300c0000000d02201c60180000001b84402cc03,0xd8052008007308408204d280283032c2243029710060000000000720710040000000000c40920080000001dc5203660180000000003f01880200000000007a0310040000002104c0883010000004104604306028014320438c0a2d00500000000722a0798040000000000540b200800000001b0301e60100000000350503cc02], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((0x810125624985042b52cb901c2008dae581008953b4a24a001374d02640126ea2f07410261c210080a70cc45c360420b14d05e1417c988ab1eec8eb47762d81c436136d88c116279f4a5660253d56b614b4a52b110801a0d426fc6dc5c1e8c61314d70629cafd59662082020aaab9a723be52f78c31b433c7d737c3d784fc525e3411559b14308831940a602f8c0c42cfa2384d9fa3a053c36d9713962c30a2ca1854421b7944743825d96e282080109d8ff72704200087f60ca7000000000bf1dc3f398cfcba882113cf40e3c33c20414403c00c030080200d0001133c279668fb99618cdbc5af2210e9e4b7d9c12906b6fb18085c8da50820d5e4724a04007ed1091ce0040010f3cee26c8c08de78797200f869b53c222a0a8d01b21a08104761c24a0104bfd06dda7f4880005968292403c000fe67dd10e06003fb7e68d9c3e88002d0280000f8914b050001bb100061620f61307a098a500c1040629203f1498b10109a27d18a1953010b3b498e38015ac71142004859820b2820f8042084a759c0aaf810143d079d142787080059681ee302440c73ae341478c20ff8195832a8104ddbe19759f890000b2d052480400401feaf67321f42010b40b00003ea45201628e0b81803190b694a4e21bd026b73dbb62e4d9667a4f7e5d7f30ee9626172a79029ba19e2caad1db9d190fff4538ae5b9b06967eb26e2019af5b742594944c935a968b462689ddf5364caf2a4fa02573804a330d054715567326e0b77877972896de0e55bf4040171ed48b90a394043a603aededebd22c8fdfa635f9db9e370dac0bd76c61b5d60809060f0523a87443f23d990fec10e0cec5b620e0eea63b2881eb755d4abeac14bb3675291f67b101c75c26f838c4048fd71ee9633dffe37351b572240cfe3847f60ca7000000000bf1dc3f398cfcba882114104052411810414804003c0030180200d0001172000ebe7c732cb52c42844cd3e7d3184bd9011101c2403319724012aedef996504200086185bd0b327a32028afd786bfe9184ea9516967f2884021cf5879fcb080824ea2c650a104d8d6107813010858761ce3e90022b92af337900042de55afa01684821581400008648a302c514171a4f25c4000b71adf2a0ccf317e9d6cf27ca094f8d7f1e01f1afe3bead73728d46ef56e082273300f14de7781e878e4363b14de77822878e436342443c71843421c23419dab7fb339e66071e6d107f453067a810a9accecfe06e4976f05a0464f05f29899e7bd3759d9e51cfe8c7a8658ab6aa8497f477bad2a43a50ce733ec108afb9e41142039d660a10224908149d7253a6384008f0d025218203130585690c0af436c6366c1045d78ef1000800874f91b4970c0004786854301912185204000020b2000c404002660c00897944000000003e68c45d319f9751042268a7886883066841826001000018180100680009010761d0138880057188a2068007d74d8e0602e02b1430022406b068618934111121801d85604685ca42442a8928611004212abc35034ad91ab8000000000000000014ea90ae2df82322e964ff0d07692b66e1e08a2486186684484184082780600060300401a0003527428f02dd76830a83a73b01201023af884d8c10880210955e1a81a56c8d5c00000000000000000a75485716fc119174b27f8683b495b370f04512430c33420c23c0340300aaddcaa1172098ede6ceb59a666d05c5d3b717bfa19e763d61a78e9742dae8e90082f4e3b76e094044d0002c1228612142050001d991410d8a006c4fc1627c03f140d6d646268a993e8e96381078c76ad080cafbb0e60901084021a28434ba4d24e28400818d8ff242098f67faf782880e2d4c3f3bb80e1a9ad4d25c19281186f7f5e81a2032848ad831b8e02a4143568fc8070b2d5d52b2440215816000083c84582c22817e285fcdc231a2cdbcd36e1018711cd97100b8ec78a78e08069d344a1286100043fb06538000000005f8ee1f9cc67e5d44108a029c29a29420820e084007bc7c286d32bf5f3f6e34e9a4decc516be9ac245c316c40a00034a4000b0cc00897944000000003e68c45d319f97510423fb06538000000005f8ee1f9cc67e5d441090a29c19819619010410a0803714010068000d011161900b8681cc1400100644f43426802000f3b20240b01105c84b37d31ee2c00722a33d92054e510d710023182100803c86c4f00700c0100404780e01802008f3fee0c4f49b4402d5c67630d43aa84552fa46e3195b84f948500c9845681828ffb221b257bc25bf891d9940ff15121eee330da8611bd5d0fb8cf00e8080163e6314b96536d52ce20e2d9f526e2f166de6bd2f34b2f5dce1c752560458908fbdbc760b48786e8d8f53c7432566e58c1951d4065523c136fa0885ad7d87ab3b4a5f30790e9d555948608ee6c748e853a6ad230ce732000025690004ea3e7d88988b98cca1775f942a6f5049e897c9622c6014b7) <<< 16000) + 0x4739abe050fc0f58fec795833ea7d850630244ce535260f8c4f65090f72485b744c001772455bfb635f74d656502134ef29f2690154c3ed3a488c7c924d87c11f3bcc522c6b00005c844ec140480a000865214c038d2792e2000b71adf544bcf491a8be6752d04834cd73176699ae62f0f9f45a1adf3e8b43561211419e11c11811611c01402254ec37f177cb14ee42dd79f8ab580c72035e7e279ed397f7f1b79f93abc2db6d497a1283863340714a8236e9b2209b7d2bc8ff08e415b0369637d380f8ea174a17e9fda906ab8b53600e38146523c213f8d72d708fd7e2b905aea50d61785b5da50ce5447a58144945e646f180e383591c123ccbb2b83fc9b177d9e459098bb6887ed98ab3e1e9cfb4fb94682e3bb331e2fb5cc089f10865d1d164e8eaa746af22784f641de3d74e9141c73c140a6d829cbab1b635ea80271c2eceb8d2033abda16a612a444f490171a4e1e468220593b337eb72d7eb4d83496124c34966351089e41735e2b55aec68521d329b1116abb130ce9a1482a1274800066f3229299d0574ea3f9310242d481c1d668dc9b5dea882cee7142ac3409fd54cf3912bbb7f2299f38498421321e5d1070a7f5fc1a410500b9ee2272ce84e622f1a870d1ecc60c7876e6d6655fe775cdc1141601668b6e085b10d82a64a8e4d26f16ab024ec71b1f46bc8c7caa38511843083518c9e9c4155caafd55de8a3e5814b79dfaceba45a9be80c2d7f9718705904aa1bed28a226e20c631ca600009b044e854272221380d0007529800008022c736b2e888a050310bbf400e989102e6003c00800009e226e0b08b0584502e01802008b1c1ca0150e70900032d5c0800fce604f211861080400002b88000759a145dd09b218e0e8ec746aff98d8f87861d8cb66bcf4d3bdcbe19e85a3262de725283e66dc4d7d2be9f8cb4c060ef19a94cf7d241ec86255d0d09bca4725731cccb1b8a5e7d0f36255606492c2299e588000284214c03f8d7f1e01f1afe3bead73728d46ef56e08221fd8329c000000002fc770fce633f2ea2084c80df8d5980a4ade5a7e400e00437441df8523543f4820aae27e2723117e77390000000000000000001190914510d00c0104ce7d215ea9b481114da0ebe03e84baae8853b68e3312042ec9c13bcb7d5c0a3686e2da5e847b0554b20c4701cd9461b26e39a69ba7514228673d498ef78c74444cd70bce8b4bf39005520a614ea9af7c61f7403b1e65d91b5f2c4c4cfc238ab26794d7412cfb29769b2b4311d62133e9074cd14a000c9e44d83426a1a134090005be912c310959280d04400481468502f68c86daa5db942e99e0708c3d5d5d312472e39c43701414c2e6c402b07293d4ce8e0400c666ec0904188705e12500c08ce7cb0ee336e7164a28014141c27231c48446684324cbe406cd38c58040c58743852023c0e8866b8034ea41464a81e057eeeb44b641501583600006c2449c4624c1b06105e9219bbb3d8b184000989664868c58fdf924b9230208bc3da430c48e92943c0e08c5105a7f8681ce4dc94358c00bbdb04212000150404c020fec194e0000000017e3b87e7319f9751042270e50e38e7086883881025800381001006f1ca00335a80e3cc65aab00808016e35e81c250edfe110688016e35be0a1886ebba7a2b3081100400004f483d8a81e8242660a0002b03a486c395ebc308000f423d430c71e1a6318b08001e847e1a0a23b7891a340a1e5f92323002c36fde28000b8e118023fb06538000000005f8ee1f9cc67e5d441089c50e39c21a20a19410609200180c01006f1f0c9a24e640400b71af40e12876ff08834400b71adf050c691c44370826996c94a1598308802000027441ec440f41213305000155909a1d0002291822dc31cb60682016e35e8160d0edfe110502016e35be160186144d822007e265a1522a884c504401000014820661303205e0b9866af935e5c775a453d2f9a94a184b94d743db4a7e4f04215b42dbbba9e31a89d5cc927386b0482280cd87ceeac1eabca29b0b483574c494fa21828a3b29af292b336261c6953cf498757d51779c0656caec7d6f9a8ec25137f7b67afba18becf2269a8678dfaa83e3414631c4d00519c0cb9e0863212aab476cc384bc84ca9480ef68d2fdfd45ff03572db9256bcf3a27b3db736da79c70e10c9a22c00e41782974b52f3aba54e679d7dea453572e412ad01350a027212aa02d90482095ead5a59f48989cd990b29baeec8437c97cc44e014f7ff178e1a04045e6fd3c507a2d23ec109694346a521fdfd18dccd84ca1fe86048005c40daedb84e67cf55f0717ae60c1c00bc1f2033eead1d3c41f0030994f4eec1e93b797ed8b71e5977b4ff74dad6ce2ffa454e66cc62709ba4601c76c6d9ad4377e5a0fdf14cef18b2d3eaa88a3cb1d13a03b8559c4b8ffc51d7effa9c38999cfc2e89a2c52220e6916400017ecc10fb36536a0655533282c518916a82959b367dbca87e14dfbfdf5e85df0c2395ac3401e0c927981ad5ae8d13e1fd92b112518e0ec7663763ba26211706b298a3b7dcb19c0cbb16d1c6b60543d28bc7ba8a06237bdb5111aa386593b9fabc2f8e2179949bb6f4b661253a85ce2405dc44a50a9694e30b94ca6d6b91f21f5d642ccbd7ad19de18da00a78c92ba341b60b3da357ab59222326ba803901c00897944000000003e68c45d319f9751042836c02283b41dd888276553b06ddd1c5bd4f2bfe2b444ecabad81cfdb2a80000000000000000008eab70dd1af97a99883c5c369ea958f725f99cac6c77e7568d7052e00000000000000000)) <<< 16000) + 0x023a5b0a1cb8f8816a186680480380017d7aca5843ac7f8ada9dbc1d23507511b0f318537068b8046ab19a19b2e8fc9d2265c0a86b794bb612694fd85b01a31d9abf8e94c4865799244ec4c487581dc0e76df13b48323fa3c832c5f89d4120399aba321fe1f690d30388897d34082b0ab2d000673226432039050005cc1125250920c848c5425e22001727341b299fca11e9430c2b3731cf2385032b5755d1ab3300005968292401402784350e4d009000165a07b8c0aa89f41880b40b00660303201e85523e5986584cadd07ec3841e04ef040c618400100a601d2733a08e1586210a5079989091c4ba1576ba8c7b4aa71dfe15d74000000000000000000120a2c2c0526c2ede1ad028cb10d08a08708c008000dc3859a1a7f26fe3b9b40ed0d6014e9c292b086af0c972b66c6f521737f4f1d69a3dcf1d826ad4f193e986b085d9394000d148928a84903426212130090978480012248911480cc240640a00069d31a4f25c40016e35be994006cf147e76c31809141da0eec4413b2a9d836ee8e2dea795ff15a227655d6c0e7ed954000000000000000000472ef56e241d0fb3af8927a02e679bd97f36e0bd4041218fc948c0000000000000000001152d850e5c7c40b42851c52011000c0504026f8ff74f5270f42ecc6b2f11f848db89e1ebdce1d385a9cb64575e382756dd1435fbfe76e7aa5fcdab32cbd3151a795ab805dccc7a4d7d7ffdc9e2bf8814f264def8aefeb4d994033db2c104a32c07491c9bc1e103d5e58b5ff9ac1faf84653d8659280033d10a12d0971484b4740301a002f6b3030296eec8860edd6f379e18213afbbf12400302ea06100163c8a500301008f48e88205870840100240301101f12fc66367b10207704c6b07040a428337008c408802005603c1cd4b4342de46ae17e90b3bc80f6d8903af373c878712e894c00f2e6e7f9127858ef7b62dadc9198a9d70b00b0bbab44b4488303881a9a750d372daf62027ba4800b60ec7e49a2e7ce9fb4749ab5bfa9ca6f5f1c194700cbf9707d6a0896ce87027fde2b23ecbfb7a244a00241ea807a5fffdde3594e89889484867b063a6f82940b8c7afef72883d3998997e5504bf2514a0200000252912c190958884a834000b8c44a4473409fd0d69005e29bcef03d0f1c86c7629bcef0450f1c86c6848450a40a38a284382180003abf86e78c3a71c2546da84b8f670e2e00851377a4c69de25a54d686f711611ae443792a5b7ea30498282604c518c59023050002b522505b0a12189386c498260c20bc1c63636a361c4c2e0e5da860c436721990c33b96ced40a0277684c6624078a00601501001098d0880200640be24464ea7cf246c3eff63d881421311d8624204622fc8c00024202200801c82e0db0098a6f3bc0f43c721b1d8a6f3bc1143c721b1a1211c49231028a29a014012000017d353cbb7fd78a6c455db3d0523433d4f345a110b3c5b923388f40007b0f5623dd3dd202e6813fa1ad200b41b601200c9c9dcd2ab393b62b6da504bcf2f45104ff2a17b43c3802c30000000000000000004542051432012c00000003c77ee5fcb7478ba20e8920a77900cbc4505ebb5a8a387ff556e20cd7f70505874dfc297fb6e83ad303f986882d4905d82a51a057d000397224a5a124210918c8001bd8e0e48cb8b20639eeea6c3887f79aba370645032a204575b47bd018f969b6503459c748925a909f2230206bb7963bbb18e02a480df4413344542b440620017a604780d1ab24ba820087952a8618c743c6cd029bbb731ca11023183856ba65261383dbc78e21d6031d7c0e8d17a0881078cf3e672df9c9b2940afb48f8bf8e85eaf40c0817f7ddb94f22f2b08e001d98086ec111ce27a0804d50c43fb891db2594596593f7cc50881100002792244521211d0198480c814000b646548540d394ef53fa2634f026d6690ef5106514535ab039293250000000000000000004573300c8a148147145086003000000377b991485ed6d8f74bc4d4f1fdbe9e6c17f199f9059601c8197195bef0536ff99d509512c60afa10bdb6d303b8b60d9a00b0a9a870f690439da022eb5985031902c090a00076240048388901680908423e22001cfd20dc33e13a2ebee4d81424ed9faad8e204a9e50c0f6820499aead2aa8c01513376c3d0400009dfced8a0a00777105d2249928244641002a8084e0d80d22765c270180000fc9c08ccc8de08b9c404ff956f0eb1e182190344f842a18016b58da71bb0a058609fb67ba840096a24eebd7c8aa80b881c61de491001f1f89a09114a3bf508c44148071e6602d02800011a911e5908eaa8470262360a11a0140cda53073962387084434d12423b0c141b5124e5fc61421d1cd0024bc44000b49d74d314870198e5a3c4ff88a00be082fceb214454340bbad85d250a80d057e497e92aa91d00bc0c10f77cf2093b8a68453f6acaf20884f34f30d28c2491ca08104d00c02008037cd7bbcf8ad8f31188600fe309afc7b37b4902e9f10b0824042200800006d987bbe79049dc534229fb56579044279a79869461248e50408268180001006f9af7e28bbb9e6221e92a28613584953811205dea4b94b2001100400003648690280007f883b04c09c160ea0387bbe79049dc534229fb56579044279a69461248e60438450268180001006f9b0541b2899452cd881ff8613629638849813a64d10aa384a97004d696005f69fb0648167fe9dd4ce004401000016322320b11801c0e36b377af3be7165c8a69a49a4d2880715b32769440005f5dc5003431bbc90ca88c4060aac954e09)) <<< 16000) + 0x0b04125a1f54669c05ce94c82f0ec88002b02040e79ee9d1c4b2d8ff3f4da34ac0dfa69d0d0ea1ff5bd320351e89b030c003024fdfe280ad8e0068e700220080000b2111705e95a070a6fa40cd2692cf17bde29849156dbfd370247000f052b30040601cd6d2bb9040c0759d51a460618100c7f13301c022f721d0b9800049cb2cdc2307f2420ac08000043440016a488b08805c140011164454160240301101c6a81a0f543c721b1d8a6f3bc0e1209641638e30619008c08e00200860400401a0ee0302b01d9113f1f0e460c163c828d5348e0850e25b7fd2177b8e280ac05e2a86c5061567b8f70e40a1835f17c1d42018656e4bd0655012000f995ebb1a228018428ff3a120825e89182e02c00012010f91d07c0880a02400078c61eef9e4127714d08a7ed595e41109649231229028a190096008022220382c0100680008598d50341ea878e4363b14de7781c2412041c41431021c12800404404a2e3c9fcb17ccb502efc700845a885ec4c47372f33c13d326ae60e027d0001c420c61b06201c3ddf3c824ee29a114fdab2bc82212471c42031c3183041100444405fc8773234c59393f0501a24848dcf0fc25a0002d440056fc88a14e05d83ff3043244002dc69c0204a278ffdd9243ec1098d0c2033a6c506001c2183f482441c00bc34c3d859c2090021f66f39b4474f988349192bd6532a241b12fcd09d62382075d7e880000000000000000008e228a48848640638448250048f28ed1603b292fcfd3ca724c3c6274c47755d1b056b44d211c7be2402c7b0f8e7ea7ee1cd5dd73dc22bc90a0005c0654e0b88879593081056c923aee2d482812882472442042432031411c070080200dd079d8fbd1457ccc3acb99db5800000000001209238a29221021219018e15e1a61ecae083e00d00013420481300026e2142229ddd0f3225330c5f4c8182412c2642612472062052031c31c21011805c04008036069a1294b86102a7573aca8461440b7190502081b67cc51c2034675d90a90e19fefddfb60708d416e98b028002ee583604a0209402000035a444c26224020002f8222232110110878884384421a1210c090858484282421212108090838084180400163a4415260dc7b104398819ac408a62024b100218318ec3fc661fc2ba22f4d53bab353840c7933246dfc824005c71147c888e1c0a548f2652ae18a02b2a21c62594d401403f3834e18ef900008ec037f3fd2d25226a90eafa28c007a91d9bbc852b10cad86207880600802201cec1d440103baa096d4220c1e00800003d90fd0d87e06c3ec176404804e4e870405929b1a181c567fbe30008c608402002e120000c921f40b0120180880e070cc4cc38d075eed41b20149dc13f40023181e00801580ec8e8b13e41921818eb3a1450c0a3f30d26819625539f140207100e3800128e10804000044087c9083e0540501200022a3647d92cfaa7dfb11b59e7178c5d4bcededeb68c071841a92fc4120aeae3f2591f22c8863f92957cf5ec581b80b4e8bef102367d5dc9b9524ab8819aaf8a0c401e012b6b523b1ecccfb7a85b3a65f74e946356b0403dac3fab981dbe9768f67a0403619a2b021ec6c40412f3ad5cfdaa528921dae53a85d74dbb1419b79243c937d5497a13d5c581fceb1c6a6395ca61363e000049121ee6303e2d07b10c3d4561e8230f30d87904c3c4261e00b0ef01c88da9a6ce51c8479a4d03141eee030ebc220697157bde07c93ace5875b7382e4589c6582d759412df6a37fbbf8acef48513fa21c20376f4c6e8578c4bb0527b346b56e276ea58046a4315121eb24748898bfb45b5194d0200fd2e5531b972ecfe06b63d459c2290fc80009009d12806edc9c088954b0a0c5e2cc724de0f5f376689537290afd30e400c02c12cf3eafb201286978a9101bd8b2ea30802a0064b6040a5d5f7fb400251c2000800008590ee1d8768cc3b046068130120580882e349e4b887b10b92031355ff38fecc3a3a7812348a1a4fe680167d9bce6d11d3e620d2464af594ca8906c4bf3427588e081d75fa200000000000000000023b41e763ef4515f330eb2e676d600000000000485fb9e6e35168d15c6d71f2db4a9f4bef99006e1328a21208a0840a019a9a2d2b0c54eed02392b129d2fc2676d9c94c66bf09308eca844b5c4dbf6590f28dd08fa870ba0d54951ed8ed18f188c012d9ef450b4bea36f7ead43ab944d44a36a3d547bd544889c97db48d8189d7f2ccc4b64a1b31d14810940a63f085304b250a601cbef99006f1f2db4a9f168d15c6d65fb9e6e3504cf2427bd3b4c05af2bb5709bb6b297f406a17ac356703f18425fb9e6e35168d15c6d71f2db4a9f4bef99006e1320a21209600e0080000006f8d428d1a8eacd9dbc6d5e6ecb984d4b1f3b398871de6b0cd179403decdc7ad29f67f6befb28d4adc713b3357c1f04b49874649440608c27398922a8f59f452d0a3ae80023a10eb09d88063690ac96088538ad7c0816f0640d600118a110043c7006d7c050e28d8b4424cd08e0f647981832ed14c25380027506588e003d3f6cd8026102100807502800053087484e2603975f71c30897a9299a8823019b4573016ba2fd8b0804d22c9078009450840201d0120e70100009b9c29b7d029c286b4ef20d8a12a90800610332d0acf80120a0f0040398241ca0a0240500008890e4218718ec29807a2da1bc0a916282a2365590092b09dde0a0c01e3e6b8000121210004345517af1434804054b41b940003bb9800cc023951cbe2000024242200800007590e2290368c800084c80038e100126)) <<< 16000) + 0xe21c23397df3200de3e5b6953e2d1a2b8dacbf73cdc6a0980000000043ddf3c824ee29a114fdab2bc822ba2ea0483ac02cc90c904c0050040030100c608cdd4f5f73a1b01bcfc1f9747b318d46d3904c68aeb700002cb0159179017a5fa5dd47b4a4bb2e07810ed18e1902ec9da00069e4381061be5b0de1186e86c37017018b65d068c5812c7a19161200610aea3a4004e623edb2000002121e1100400c81700c0100440100401150e50a57b39c01c0a91369000f8022000020080000222000168436c2400020c436807a058595dcd1001e0044000040100000446000020080d90100001b90d80906b8280f8140002304348474084c9302c2781a9f0ac11200110e11004000022c86b0ec354761a82b0d30d81c82e42f86f43380042303a010f2407187f8a380870f1f9741002a483c520008c608802000016e4348561a21b800008023830775805c783db66c8a4e021ab245a46003e0100000a221a003800008023c08f452e8f0800f8040000130c0109c0735d4400a149b8930097a7400f230420008000054100014c219e1b0ce05c8c1b5ecea81c20a8fd20c110f43bbf4ee202436e8c3b90008402123007be15764435c51bea38405932880853c00d0bb45c04022d62b0ba94008802000021043341712d458fed148050200c88c400078eb0499802598d7b6c24082100800006d181489930c907832804226804830800100000fe433004000764432c661941a0c905000348904b2906410831c5400107a4318d70955e1a81a56c8d5c00000000000000000a75485716fc119174b27f8683b495b370f0450000000010f77cf2093b8a68453f6acaf2089e484f7a76980b97cf7e561ab1e1354bf6e5aab3b46e2dc332156febc3ced07000000000000000001090b046049008010058b3973007cf317ea906645f8e500680f04ad228a908e5675a7025868d7081c8d8245774f2fd24eca6917a4bba3b653c0016158de54d61c486c68b208a35c75d066792f70ecb4042a5b180f544ea422f8897fbdcd6bea1946d4230a6ff67eee3f9202229647ada65354ad875499bf3527b0c34390906f1c3cf0c4df26ba7cfc831176af435b06976aa139c36cc9921ebfabf4001f1c8009ff1a259e1574a53a3667875f51c804449584009cab91fa1edecd0292930d7895eabc4605868600f613cb21ed9c0a0f1d5241000150f84404c14b9d7631940695b0e06fcfccb7d6e37a0008cac06259a97d113295869f5548171d00549c80029abda82ccc796337f10d3a481879efa9aa5bd8544540d00001d2990fb3af15a42c0a8f4ac5749001fff13ac14025e98e80d0100000164482200800007e90c5410621e830c34003478400db048318cc18807610c910d73bd2088c9b6c0fa29eefb70d80bff6abace25a31028029bf0285235152ff8701bb1eb9e1955b5288a0cb8e9929fcf400c9c098c497cd42f167232b4c23ffd9afd6a180bde4f7538af4acb4cf713ef21d4e4eea349c6abb89ef7fa231b0f3f325b2ab9ba4f0000b5f093dd44ec95a80604350b9eaeb0deeb5fd0799f445f1164f3804f0b1fa0f633c82553f04dc415aba357b9a37b413b2778406cd45d2f0314e700b93a87dd07fbe7543680024355c5306adc1c58e9b81efb451344418d796b9498c4cea0e15ddb7d7f6799aac450a11ca395be9ffedbb0923dd60d4c4e77e709753ebc6208d8c31427a8091ca3610d3b44f64284d0fc14c777b73d46d70d8345c9f002f7547f0a1813a40000000000000000011595311a2bce84435cf13271ac15fc978bcf8a0b4e851604fc600000000000000000423199160f18702cc914608b0080102c6c97e7b26f0b9acebc58d5579c664e18cebbd5a4a3bd36a19b7a6ffe1ead4840102775f41750ad01314207fbe2634fe8f625ee3f6cb63ddb58aca5ae64311724dabcbe8b560dc72988e5c4305bd046880b7a3889fd7e6b2d24e7d26936dde6c1d86d7cad640877e8da970f3c80c374f7c96e7ec90f150651f588d7952840ff02c59bb382708ad1f01394b77de290e89fef203e13d999580700728f63042d3f47ec9ca6aee8810e35859c002dc6bd03dd1f68708260000000010f77cf2093b8a68453f6acaf2089320315d6f29fa05a8b9f6dd9152836e997dd53baf7a21c3126fe000000000000000000464a5ba68adf0290b2061890cc00900002542f7fd177df020bb26fa72257892f708fb64515603c044f31d717ba5b0027d2b2d97684e407276349b526489d42f65a131c273184107a028e54f1d43e4fac0476116e2cd67aad4a49d09b6400f49f53030d8549792d181a5903844e3860d82ba0e800004850440100000ed2000c644308b607c530c11586008c2cc279733b6b0228af99875a0f3b1f78244c80c575bca7e816a2e7db76454a0dba65f754eebde8870c49bf8000000000000000001193f6acaf293b8a68450f77cf20000000000223199160f18702d0e04b00800600001001bca68604c746de479dcca8c25d073c9c19020ae3fe999b4b39155eca7c93f074fd9ac4493309360ec014e13be8b85df77b2f270db983d9f579d0ea986afb27cf41486fed0e49816f7df6692e245d8e02860986db871fdfb707a5cadb5d519211235e679af6764dc26e5caab0c07849fcfa8edc1d085a8491dc1356bb711a6119ff66a45375bea7c04f8f84790376889407ca78231a860b993ad537abc50b2b0197c96b7ecbd723225391685f70aeb7aa1fbbf145ff249c0b8058feebc96cbf135ad6e54cd254eeb3f4df5ab86079e43fd31e77d8c265c730bd3777ed3f61b6079234ba1d81c423e)) <<< 16000) + 0xacde387907ca906c5931f19d3920872253a97dc0bcbad5f2742b0a247505630f9d4a6ece9411300ca3811a27c959108cea0f35cb13278bdc3b567361fb61f24332360878312b594c16d9d0000067e7c7d7e140c0217e8bf4eb0a14e334bf5e62f7f6f5c95beb2f25399d84c8bdb56e4d8ae38e69c249800af0eef54ca16c463fd8fa76914c9535c13c258e363634d591a16d831568575323ee53085cf525c1e9da598586054d2ac841431b97e65276fec8562bb1f322d8300e359c3bb7323a32ce05c65bc8e200009ac2162620b0210568482b02417e020010a1217c8b0bd3185e0ac2ec461740b812008022038020080b91905c08800013085b92c2d88616a2bd2a447c48608537773fefffc482bf3744792a0671121cbba9fbdb5410f6c72bb5d33f72359090f5cb9c2828b165329280af1ce32d4e855a7203901fff5013da5eca08632007dad2a98a579262eaf56e85c736679402000f284f90c534510192ef7e1a9d31417ee0a59906612bd13ad98e69c149e48eea9ea67190bc51e82ce8218ee808fff618d771e710bd5f1d5bcb944b9098b76c6ac3e78f8dd82f3c39ecfcd37bb924e740560aae000008bfe1594d51b48ee7e7241e910bafd5f11d44fdbafe41505205d26594044427cc60d80e03a0cd5252a0000d5642d0c607c630b30185900ec70005a46a23ff787b80a0a4cf072a3753d2b6fc6263d73e3e0b5ff40e6215dbc35dc3a0ca64098a3cf6d93ce5b51044d504c61e14a8f86f0988ce8577565d51ba9d050f2e99969358e7d326df74241581b2633bcf97d6a9587acd0147bdfc838d8801345f0f58a085992d6d88ad9b8731859f4416315795983dd6ec5777d276785150be5bf35b1eb09c532e372a22acc10e109fd3592504c7ba8812805526e9f8ddfc2b4a84e8daf142bff74edd18580b9822c70047f206162f4dfd103e4c1670a332bd71badf836b07d399936010a869fecc4a2e2d5b9899fa5fd22149c4059f748c093dff9847548fdf5ee9c0964ff0377f79c3b03e0309cd32fb5c84c6a44043e8d1bd98d4267daa4964bdd342e6433dca18a74920cc82a06a038818835f3026dc2762c3f1521d4f1ad88b7430865322b90cb99db5811457ccc3ad079d8fbc1200000000087bbe79049dc534229fb56579044d439f2e404e0ede0628acf1af3c0bef93fcdd9b2f636a20ff40000000000000000021b41e763ef4515f330eb2e676d600000000000496fb44dd2520529231011e01000005dfa898e3b646cd0abe65b32932f1499382dfdc52de720b3e6ec46455145b4e3a1e49f804c20de2b00263beb180b52c905616c2581e20194d1dd349ace5bc00038450cd07ef6307bcd2ab8b096a19a7eb304bb9edb1da14b1a8b40017e8d0cb0dd160174a5f2ed920880bf8da55c4c5096701edd5f7277b212ecf0e01a6211fbd192ccf9c814891769da79114430088811eef72f370b101c046f4540218d2e9585a19f772162104400009548589882c09415e320ae150568882b03400254242ad0402a7a0aa09054848006bc8801d481e3036fedca6bd6d73a6d0763799937661476d6f34fc7b5d19e00501a4a81c355edcdef8e8b0fe77cbcf8f828ebed812687f053c4080abbde88b9ac904846b6ce4f6c63e77ec5da3444dccd9214f0400448e759f67cb6a0bfa6fc3951eef404fda5c19688d970399af014815e40c07b7f94b2045161bb6b7dedbbf1ce2073b93d992240009e0c79f6a6926a5b367c91aa1697e572a1051cfd34b27f0134a0483713f374fc0522621e502c6bf72ed85533bf8430d9314a50000b6e40120ac804494999018aeb794fd02d45cfb6ec8a941b74cbeea9dd7bd10e18937f0000000000000000002332a6234579d0886b9e264e3582bf92f179f14169d0a2c09f8c00000000000000000843300198818e00c00a02a22a080022d96d78f751df1e79bad20914d99eb3a529deef0126778022c11a1487807dc0fbab4a537d55868d7bed2640f637c3251d482f75e8df0b3880df2fd958e9dbd88e2be0a9d7517ca2bd472802c7abbee315c0fc02d507db1dc56f494c6a5f5a679e0fdf96f7bd16fadc86f3720c8e24c83500062820123be402d8e4de793271cf63d04c45db97b87ebfccd26ae8000000000000000012518cc2686b8b3ada08d2c0111010e10a104088000202c591b34e3e5026008335463a5edd4375454cf153173e0076f01fea0156c50686b481843427c27887ccef965f3541ab4e5fcc2899e6967d6c8d0e16a40bb951e2b719106fe4b13ffc6afdce157a8072c06fd50d4666273f4a896649d8146cd9e15b3f41429591445c683eddd0e9e4e0a440c9ca240b2d4764d6bc1410b2a045ae4578b39bc801b726ae5fa0ca8ad6718014bf3771fab34113b1040d31bf419f50b90e6a0d81d92fc13b8ced27a09de10bf093162304a2f0d30f6291be5de1800f423f0615bd6c3c11b58a00917edb16e56205d0f1c86c6e29bcef0450f1c86c7629bcef03848848c30a38650030000019e3cb418bb18a8859e57a800f50ea02ba513fa8ed8ef7f51cf4eea721c5af7c80135f75164710c2db979522a51784e5c2c7809d8253d650c4a77223eb12082ac3ba1fa250e5a3dacdcc0a8bdc2ece386171c5acc9d194f2651301cfb5cf10c3ba896e81e9a24a0b054ce442ca638c10560e562762c74075631e7818418991fd7e74a9a6371973f862347f9f2e0008de594b7530435a43851e70dd056a992fcdbcf972a68284d33630900ea50017e02b320f451896e0caf738b1e376a0a77cc9b2aafdba47ee66324ee33401c8280013b880042)) <<< 16000) + 0x990a82d85390c26c67c41f5b4f11440ef837e06514126b8723bca01a33407fc240dbb81c51c50014255dd3101001198e0880200640a00016530292afe9313fd8da62893b01d902045de20a082fcf7d2e4962a010200a0e3481105411202dcc443d051cc602806e3a68c51c145d84007b7321de02a09800f80f4e66dc1ea45f1623e7143a064512f1a0d9611030822d5b7450435befa69008c408802014c020000c7211a3308c1185286e84052ddd91081dbade6f3c308275f77e250058f229402400302ea060602011e91d1040b0e1080200cc04064020001662148520211d0518a81c8340e212070050002c310012a02144630a12585008e84ca57858c1585ec2a243a626e5f341bc74dc2eb7e630594ff0df8232c492638ef985bb89f43a8ab48c0433c06c57e92286ea24855f51fb25d6cd9bc1ca2a8b303eb1b50a948dc8c971c3e9ddb41200a08a4200a8b21c0f47d1533ee1ed3a838400c41387884b55ff15de8f116f4ca2f25bbe42127ffb5f08503e728283d20316201f479322e8c959fe2a52c65a1118c61d69c3389109675307a22a54e31c8d87a33f9c3f0347215133e638ac40f072a8f888386e22090f55d22a68f05e9a8d05a486b7675acaf29d04c8e5394939bac11bc31398ae72a6b19ac1628c7b75f825a05f03ba10e95b37a91db4df9965f8289156b31c5000291f17c15736c1bacc9a9cdfd9af04396d215dde41c0dceb96324b88e9f907569c21be9191a89f23c2c3c79d5b16ddf4987bb31af1d9977ebc4e602490e5c181fc8f5e4d77bb1d54ba8b1d4b04134b9d410a92b151de0072fec61fa569402a0769a8700f60eb22450b8355a7a299180077ca53be8a333f0b0adca87119a868c021ba7b4bad6c93c6d3d210c302ef9540b253699325132220b409f0da5107f17848350d22384e895ac25e6704ff14534bf314061eda80aeea9e2181c10f2984d698b16bc300b6d21534d1f28660b4cfd288f6bec27c80890e4bb4902ed4b5b245d7e272dc4cee4a18351fe7c4a62c69b95e7ba78a4c9b377b50f6633be04caf86f6e8d173883324aa007202000357213e2b09e0981984c0c81761bdd1291e612ecc6ffe6269a001fb80ce13ee223201031568219bc3725ad3ecc4ddd64695c70ca4de630200fac57efa3fac34cb37a8c5621f9ac88e86424a0256ff9a91879ae2091e9e4eb97c9f7baaf30f850c001705becc190989fee308be1354e6bee4e6eeef010c70a2b3895bc717ce69eeadab490c2f82781f951614407685c5f04370444a10ad3751594826c7b1619ceaf1bf3d89b39c94a2d40210d6c49c6148715f37add49f30c0d4f48a91550bf878460ece5d24c1dd610a652e31ca953c0858406792c738164c39bcf72e347adc75cae221526f2a765f2824819aa3e645f66422fa3c485ad9bcd767f43226db9ac221cc42a401c828000d3c8003f9109d2584e0ec26c560682ba0b835fe0301686716916a8f6112e9772faf19aa8b0403a26a7f39e0aaf1cc86eb2c6064c540baf650a073675be5d5d8fba20dbb9d025c6166863ddfd60a02a6021b568f8a5474384a9cd5a10a4aab8c0b348036218e44761cc9257649c995dc5bb6e1cd6da7c013623a34fb1fab983f164e88292c198e0a142429b610497485d36a1c13494c0220ea804315c25500a29a38cb042fb2b0140b29e6ea847652c981e0633f2ea2bf1dc3f38000000007f60ca701093d4687fe1764a49b4b39d6977baff43341a40cbeafb8f9580000000000000000000000000000000000000000000000000c2418660458418428258018022a8172801006f1400e120e7dc1630d05addd2d22fc78a00df844d378070ac467ca6704d4486002540bbcf00206227bc2273f7a18202f5dea2f1342ce2070c3003c633f2ea2bf1dc3f38000000007f60ca701089430c31e29c28819410609600180c0100680008c10991183c84c26007c5000bebbfda0692174812c1b09228605080345228aa0bbd036641010409508d74c184073e3da7d49a068b51db766a280734c4714a8000191038540400001e5213443c67e5d457e3b87e7000000000fec194e021294a276b5d3c1e4e369350f99fd869285c0100c9d4d167119869800000000000000000000000000000000000000000000000000001a48a18618f14e14c1440c20416e200200dc67e5d457e3b87e7000000000fec194e02113862861863c538508124004001c0800803400046884c88c1e42613003e28003b9abf42034906e5d068249891433ca90a52ba0c2041b3d86ea24704cfdd12e6f6834099b093e0545850079f9e5607670000fa0e405c0580001d02000c364002e5480072c103309019028004eb881096c25ca612c3b09509c693c9711ed4ec66962d0583786b30f0c834121e8fce1738b4a11357e77e290cf3e94eb919aa59fe34b18dc80000000000000000084b2f1c1c18e0518c18a18e09401202053303e85ca7aa9853c63ccdc6020965b2d2223a25cbe26c4c8254bdd4b038283e5623a377145c5ad05587505b85abed4cdf38586b82b1c285e268f55594ce3a6151612d76009e192a61fa08eae6b39ea6c881b20b2d92c2a39e2695e20bba136412ce111d6b064f2a4f48241b027a390cef3398c66faa120736721a78f5fef12f1bb74bc109be601f1d972c86096d0eeac3c38c1f7e9b261272f1522282591869387c3b9a6472ac45338af123039402a1ce1200065ab81001f9cc09e4230c21008403004010000044646367d6f5ca10db6a4e028133746f28c036a9a36aa000f00220000200800002221280a08b0504502800051)) <<< 16000) + 0x080012510390100027c90831184984c20827b0ef40744540b6bbbc02e13702fcc02680eae439552965100335691304c718c42533082871c42c01c010045b36392554ec416d57d61a3da880dddf30f8c479478bdb428a2bfd8706ecc79862206abc17fde6109cb8c0bd9315037a8584de75b0c4fe4d83a8a9355c1b10c50a40b1a864c6baf56b05a2feb60c293f5b18372997026745d5afd7adb80000000000000000000000000000000000000000000000000000686c3bd01d11502fcc02680eae439552965100335691304c718c42532053823022c224020044c6f509c9d74cfba20f4449239fb900f6ad5fc3d0f233ae7a679700fc47478389bf32d163b901a5eaa681d9335d21f9c34aab9f1405cf0f2bfdeea41558fe6fdb56f010ce26bfbd2afced68d4e2c01855192aa000ac840019ec8490ac2443612013b2f976b31f0c9ec206db6453953a96484eccb8406408fc4a6fc599a825586128dae7d186cd2700401b08710f1b595f587bdfdcc29181b83041b33b2c75e2db58e7292c7fdf3022148d1b450bb32dca90612d4c398a1013d14ee4a11860f004201802008000022300c010040478080000dc80009a10770981200e8307e8b6268e1309af06108001102fe80381331f3c0340090608402002e1a08e050000859039010002849000e6d211a5b08c2181a06f29ed3e0f120dd66e34dd447a9742e14f1f8440a09b219de0000000000000000000000000000000000000000000000001810839282d716c49db2c7a387f4ad2183291e4787907672360000000000000000000000000000000000000000000000005f319f97510f9a311740000000100225e51084c410d0cc0ca0c80840401b0a00803719f97515f8ee1f9c000000003fb065380844f14e14c14a1041060420025aa208b54a6cea86bfd4a0d1d6da3ee69a9ba01c316c3fbe2c0fa69249a28924b35d1019e10f958100b03ed4dd0120610004000035cc0c016e35e8186018ab005082770b5e03880f2034b530306c011cb4928131a7bde3880cabc84190e038ff00c5c500842010f1643293648d140399d79c80c45ba6d3ce04ed3a028040603499dd09410800200001fe422c141140a0002cf2000b0241ec560f41307301e4ff0d07692b66e1e53aa42b8b7e08c8ba40000000000000000084aaf0d40d2b646ae114490c30cd08908308e00b02ab772a845c8263b79b3ad66999b417174edc5efe8679d8f5869e3a5d0b6ba3a4020bd38eddb825011378801791182448614fd98ebcd0a43445d188610ade1365164042300800006f90890584400e8404b84c480412aff933901035cdf50234105360b9bcc3c000b71adf0e021628c9c83000a27b38409c108802103007fe1f5e208f40333631c1c7e229394c608440100000ad210e0bc9fe1a0ed256cdc3ca75485716fc1191748000000000000000010955e1a81a56c8d5c2289c41640e29218618611600402180c010068000d49000406210c1a0850d0420281d0140010b4420c461040be1c6a9be7c09c2807c88205305016e35c883081b66ea82440e83029a2e040002dc6b7c040032c67d1c004e284601080e21d026c4099030b19bcd1c4c3e840601ae2bae6e6a386006fc229d01018405d97631a5a430203e78ebb6c52800a3c4e2837770100006fc23038b004e2080c3003c447496989bd185b188f0b72c30308a2121c33b77d3a02c12115e1014250c200080000821d10109c2395d252fb153bced5cfb3cd94395cdf9f78133b30c0000000000000000000000000000000000000000000000000003289031028c2a02081980a001c0380401006c47655108d850b3333f5a0617fda144c0e1c435c361401a1c9e5beca083e0100000fb21020a080050001b290006b43c5088f77e7b4046a286ca7940301c9c32d83c39da0c883b1c1577e087df3c0f7052dd15009896760828c1848028a1312ef560a01a2d68c1134200d341a6100478ca709090307c0200001a67cb058f61f430a2877176a0b0711541bc7ab680601c9c32d83c0bf34374221a0007270d880a3021280a28489aca207342020f486d2c10d5f5053180055847cf08004411b8b65042000800007f907f0503f028000a4083e80800146c83b86f88098c73ce2830477725b8e1098e9cc007043c9762cc102715d4db620000a0af4b0e048fc90891009c508402002e1207c0101200800069083d90c1e857e5833d085d0f0df691ed38604007a11ea1c239453d3a8414cfa7e600f02e759d98468002dc6bd09c008402100f5147c33c20a2903faf1005b3c2d8b8d046dbc5d481006198628a5002000800007f1e0ff18798912090767fbb24083e00800007820f20bc9fe1a0ed256cdc3ca75485716fc1191748000000000000000010955e1a81a56c8d5c2298cfcba8afc770fce000000001fd8329c042d10109c2395d252fb153bced5cfb3cd94395cdf9f78133b30c000000000000000000000000000000000000000000000000000329861a011a0a001c00a058000401b015e3a90458c140d7a292511389e005891099269dbc0e086dd7e9bc2005251104e60020008000095189e547f2901011346a4ab50aa201455da20e1b400f758c77e727000478687500501deeda13e66430013810202d2ae6574182830196c4a2273812f6f221311a01911c10db4337184009ea4b7dcc004001000012a200053e7836b070f093c2b6d4f5aa3819015486f04000312c9a24042000803c0280003a080045c907701f1026e33a3e603706ef1202011160ea308e04c9686c69424102100800b8480003c483b08)) <<< 16000) + 0x809c440ea0a074050398280035ec800e8690330501902800bf808390881c4340e00a004953200dada401da10837a8c1b93600602d656f006bacade00d9ed472a90291b438bf08c440c6045044046005004014062b95be813032074e32a53bec800002cf3197f976f1f07cef0580362a17a0c6bd5535b35f1d318c44b745d409075805df4a57cd703881714fdc0d5ee296614d87f233cc48745fc0000000000000000000824488388206384480400020005fa1e6018d275f26fae59a8259ed239550ab8f8fb556310c43af0b5110d2364b5a98c96538300a77c5d4523f76d304754a31f7e0be32090fde69888b3905e0ef868c796c4b591ca65e217248d4f0e51ef1855a1435ff92223a27f8489043febff685800e44e1ce0000988084021236df0dee706157b87108a488bfa47a2d402314210080368881b0440d6220000f120d44304b1d8348ec1a057786987b0520b26156e0445107f1afd964dc123ab11ee9ee90176fb44dd2520579804d01d5c872aa52ca20066ad226098e31884a840a2882823801809d4390cadf73e0595094446c527fc32e29c24644335f40558dc800003792fb49ad3ddc224129724e645784c07dcfdb497aa2a699256d00038d20ce6200065c20cc738d2792e2262b62fc9e28d7b628f615761d982475623dd3dd202c860c308604a0090070050100000083a73d14d7c51bcffe885e905f9c9a606e32041da48ae5652bf6215d11e858a0004766882e341bf57be3850458004c5ec3047925b7034961030033a14646048013d3240f1542002e5fed33c861809a406d2a15610049c87039cc8a0800000bf42120b00b000041a4003b6c832a4c191240c62306201e5fecba55efb899446538ab03ce334d3714f5491fceb7d463280000000000000000000000000000000000000000000000000019626d22968f23533c638a2788ef48a46d0e2fc2422452422401c01800805008c328fb6b13087096b29d9bbcb558d92eebbc131bdd5b76296cb84e6d2eeaa59d7e93384cc800002ee419604043a13a1462573e59be760dbb2919ba6635af71e3396f3de21e8e48db92e984b42cb1e92874dbffd6dfea26d4e000b8a32ddb7c3b160af660d9865ea9e37ed3aca946552542283082f0808de6e67a042c54db24b6ef8fa2b1412c7ba94ba62f551524f09c48be86ca01398fa9acaf190670b7921f1a91a82409de2a1ba0c498b4c8b12a7912d6e0300020fc10262e32863721bf0d16fb45005bdf4b6987339a5d7b5559b852cc80007e2495b7f4bf8fff56ade3a3cc7020f30fd7d35156b6115dcb2a0390a2281cf2cce8253b552ea55b5a764b13aba8bf605ef521258c300bd3a80568d0112cd58c02dab039a2bdd74bf6f46ad9f41c103b85aa3fedcc31d8a921b8364a18c84474c2fce76c8027098ce9041b4e90e6e743138e52254d3adec9ffab86bc152401291a3ff67039bacce19dbac6ff259179aa152500d2a736824f0b6a7ca4181b8584325200b6d4d411e7773a3eb8f70000038942099fafa7a0f77f5cf66901542684de82b48942d03e22fe062b0a87aafd72bea63e031b3becae2b3c7088fe0db2cb7029852b626eb8897b5757e38019dc7db49afd2be2228f151b55b1637a1e19f4a06c307b0b7864075232d7455868c382748a268854c88bda28655de1f5e505691460c4048184001091c8d5f30232c39a9aced89a12d20ffe55201684fa88c5802976e6e7094208402133c52cdb0f478c0ac6e8f1304a5dff085060c131b8ac0e0070187b5f2801080426784ff4dcb8f18354ddf4660945af6ed438323ffd87cc800420100000d620c00a0002092000656417c440bc03c046f8c0ba2483cd2de712008840840200b01205d05000056905c1180d82f428bd493c92c1adc7bac5480cf8da9fc2304200087061946331cc0a24317f11c03b72df558c007c0210000100400001110000df3a124dd9f1660327a91529a0768c81d71800f00420000200800002220b6020000f120b41a0590982602e43c3609c780108a0e8040160440000d2415c740ac1a00039a20965200090320885b0432182a8ae05002008c090433124070158d45f851c0a95c2077200118e108042008020080540182980c148060a20380000802340dd0933ec4007401000009241401609e0304e01c0000401110e2d934610f00c958b6ce2002000800003d180200802000008882684e01802008000022200028c40008988260a8000b308259081284400078e4124940904a0471901c828001160800aa79c9fe1a0ed256cdc3ca75485716fc1191748000000000000000010955e1a81a56c8d5c2291a4f25c44c56c5f93c51af6c51ec2aec3b30489394d5dd1315b17e4f146bdb1479700acc8c12358a0089fb5657949dc5342287bbe7900000000001128c09600c00a051e612e0f76ad7e79dbad1fc10b70f3429272bf33c5e478ca9235f02cdb282ee57ea6f52a911f0402e34800000340a17e22c3dc7e23829dc123470740256da9e67d6c064cb2c971c072bde3db6142a14ba629fb50f53133a066120320500030c9046418121ec11427c227e3ede4e5800f4ce6f78e04860a69cc0000464844010810004ed5d881f43327b21c18d4417ea2026147d010000090907c0200001be4110a60863397df3200de3e5b6953e2d1a2b8dacbf73cdc6a0980000000019733b6b0228af99875a0f3b1f7824b7da26e92902a26d22968a605d28423da8e5520291b438bc232fdcf371a8b468ae36b8f96da54fa5f7cc8037099481040c2043029c8f33d41fa06d3f79b3d6ab243229ab88f793a2)) <<< 16000) + 0x5edf7553f431f995e54c42ee3a4c8626a9548b3001d20392c76980835a6ef5b9e54490985bda33e142a59b8920142ee01a1601a46504b9bbdce8327a9250420d82082fc50c0705270a213643c984206872f42ac58027ba75220240c2100802000c0fc0607c0380c00daf80a1851b1688498614bb453094a04e0f6479848004ea0cb118007a7ed9b004c204201003d05e880aacf82316200bbb897a1847303b531840448f33c18004828440100000e3200049640f02400072a40ec7407432039010004c0997df3200de3e5b6953e2d1a2b8dacbf73cdc6a0980000000019733b6b0228af99875a0f3b1f7824b4af50283ca02fcc02680eae439552965100335691304c718c4252fdcf371a8b468ae36b8f96da54fa5f7cc8037099450c8046003000000245b0d2a5ce27d15153a19ffd6fda55ccd2301280aabcb0249799f4b7486cac3328ca47b2ca560b9cc12982eb53f42100fd6ef64211a67b0f0e4fccfd97487ca9843977fd4a640e3ff89d7b7a65d621a16a625b686785559012010707c40a0a0cd5ddc390204cc932504802012141080400e4040001fa40e034000d86701167da6480e08a1a07d1c604bd86f7cc1802a009edd040824cfd07a00128e10804308da9a6ce51c8479a4d03141eee030ebc220497157bde07c93ace5875b7382e4589c6602d759412df6a37fbbf8acef48513fa21c20376f4c6e8578c4bb0527b346b56e276ea60046a4315121eb24748898bfb45b5194d0200fd2e5531b972ecfe06b63d459c2290fc80009009d12806edc9c088954b0a0c5e2cc724de0f5f376689537290afd30e400c0000115081b8c80d85406a1a034050198280c814000bfa40c4f40605202f1d0170880b4340580a0018f120071a270500ca972d5543340b000000000277743cc894cc317d32060904b099098c9189082047006005010104b12c5b5a7b9153bd036ecfb94730f4c21f12142463505adc274f2a1a6c60fc2fda1681c46b106e7dcd137b5e01c75bcba711cc143103673725d212c5b8ca5f1324f624caa27308232c890eb2a0dc94de87dad9446986e08187a7324dc97b65639b9a1c10f5983fea22e23b671890adc0e6ce46a71b16ee679cc5c9ee409e6bc5187fbd374633e0bf4d13819c652004ee1107e41c9099f4071cc0c8a3b29cf9478f7283ed07d0747923b4c373a1ba170303ee75ab07c6c2cd14a55e57f620508c335a2d60006338c24178f4c959ae71091b70e278514939710c158b10c39ae79ab228cd516d7e319bef0773c3b2d8f1214934a3ad7ad88aa2210ea369168b0a9d6b443b0895db49ba1ff6324ff5df7ede265ac0b4864989f9da2c916ff55424e1e7ffaac49b63e9029ba278c769d8618501378050807868b16c1415c75acac0023181e0080158080002fc81510c0a45605013a147ae5f3f23020050763c0c0dc97f95a20046304201002709e005ddf26124662a8d84d1c4c0642ea48e925a1ef9736efc0457dea4af1520f87782b4ce3bfe4fe2580a01d1cba2e044ddeac756022165d14b53b9ff640ca2cdec8f383dd78b97096f2ebad4b85e266c6eba140e2ae4fe77df8c33b6112dad4a31e67c1a72c122ca33cd7c28c51807d1b8bcbb953580fbb37c98e9d05c941fbc3175fa94bb6f7de6a1d4e1807b40bb695ac1e9eb7b1a96282d16197455731ee88874fd210000a4440981402402011010003229000fec204a6a02431811928088640422a0201100f8680782403a1201c050009939005263200c80e768e7557b32e50b8fe2e8cbc9a02f13fb412a983c57ba7912800000000000000000000000000000000000000000000000000c6228630430228220218010020092d19cdefd6b2ee60eaea04fe21d8ed18b83010e101e82e241c0ac9be4885f0ee9ed3614455e15922be0cb2e3501dfd00d59cfd7c3795b1730e9322e1320b2bd6aa28182a9abedd5cce0508cf77c7fa6e0041677360ff64505001d85499d76e100113b14ae1680300546163bd6d3504407e8396170162030599e8818d1c3ecb397cd181830598b39cc11c0347e476346140057c177b4104001cc97e3c351544a3141400a288060349bdb96308d2792e20a1add64becca48c002dc69c0140364abe708a4a104a010c2531594faf2c94e82c1f98c1eaf03d8c32c712fc8f4e8c0ebb66ed9c1c09d6564dc860098ec4bf79c008802184839930ee071d2c933a34d8e604660e0be5ec3ffc50a1c005967e8b000208582bb56338a3000415bcb20a1e5810a920213b4f7e838017816000071c80d808000d68d90a75486ba14423014000e58d2b9940f89431632c602e585248174f38c04ca27962c28054c033a0ce0044010b202209fc184944219bb102372c6058248219048c0039384300b0020259f2eb94054be1ae455a600270100000aa90170100d008000bf480c88c060176421947ee00510a4fe9d0316362bca0e5250c199677e3020c70188964301428bbba80a0109f22f27380110042c807f14278b2883375eac422c609b3afe392460016e34e0041052b4e2e828089e68eaccb0012002000050080b82ec84300907e4a214a6bb6322c6c5ed3d250a183224f4dd0415fb4b1a18602856394cb1402127fed509c10880216404b505db661442070fb448996305c9749484123000e4e10c016000889d09be14055e8d0a20294604280140000af10002de202c0a0150500a00800182c8098280480402202000e362001f8240046c48081a803ca401c4a00d210060e802c640142a0091100406801c3400c1200501002008005ad08019080084400202000010084c01)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 33 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case1" = "QuadHeightCover18Case1" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 33 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case1 private def zz2386:"s0952"="s0952":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case2 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l17 l22 l23 l25 l27 l29 l31 l33 l35 l37 l4 l5 l51 l56 l57 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x930213bc0, -0x59514ba00, -0x3123b4b28,0x16e3600], ![-0x59514ba00, -0x3075b6cf5e,0x7d5e33594,0x39c4098fc], ![-0x3123b4b28,0x7d5e33594, -0x23ace41e45,0x597f12570], ![0x16e3600,0x39c4098fc,0x597f12570, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xbc91b7,l5),(0x68fa92be,l4),(-0xf07fdc4,l9),(0x12d80f8a,l11),(-0x2a209e2c,l10),(0x11e1a3000,l14),(-0xe3bfa20e,l17),(0x8b9356cf,l23),(0x2b61501be,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x11e1a3000,l25),(0xfe5e9b78,l31),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x9ce0bbf2,l57),(-0x261f7f0fe,l56)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0xfe5e9b78,l31),(0x2b61501be,l22),(-0x261f7f0fe,l56),(0x11e1a3000,l14),(-0x11e1a3000,l25),(-0x9ce0bbf2,l57),(-0xe3bfa20e,l17),(0x8b9356cf,l23),(-0x2a209e2c,l10),(0x12d80f8a,l11),(0x68fa92be,l4),(-0xf07fdc4,l9),(-0xbc91b7,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨66, #[0xa284f01da301400028210c0468c0500000b208c0a730110608f04f00e89006000006714406c30100003e108640d900302b030841019240140000000002c0c80153c314214085b40180b50ce11c0f6d005000000940b015300c00024408c03e4c0500000a208c0a73010000000120502cc02000000861c011300c000360c8440d9003000005510402830100cc0ca1140349005000005110406c301000018609006c8c0500006182a02723014000000001e01480200007184401b230140001c612809c8c05038c5202202384015c315404a031c100600000000024072008000000008c0bc80302083184200f14014000000000e014802000000441201d300c003c0841a0271004000000220a00c300c003c0841400f100400000008c440630080000002211014c02000000084440630080000002113038c020000000045013200c000000011c02c80302043682800d04014000000110d03cc0200004287100d83016852050d401891006a0480431003244018000000320f02cc020000009609026300c0001c609006c8c0500007182a02723014000000006c0bc803000004404c085301000000c4110120c0400004182401b230140001060a809c8c0500000000014072008000000004c0bc803000000000640b20080a60a209804b500502882b822006d4014005c0a01c01750040000000026009200c000000110b018c02000000001c009200c0000000012014802,0x65013200c000000003101c802000000000d40920080000011068074c03030444061017340140c712419c0a4d005000000341201d300c0000000001c0c80150c33420c02e340180002b0f04c09d003000000000840b2008000000110f014c02000004e0440163010000250982402d003000000001e009200c000000d028074c0300000005844053008000001509402cc03000000002c009200c00000000d80248030000006c0900c300c000001a024028c03000000640900c300c000001902c070c030000006e1100b300c0001a01040098c05000000064240730080000001a09018c02000000541a01d300c0000000d09028c02], #[]⟩ def dynamicCode : Nat := ((((((((((0x249c18c53112248226083ac22875694b17a82471ea3d57c728501bb7f7ae1c00576b324b0400519799a067042400802e80c170074544b507ef30a244fd12ef005904c957b9db28819d89de5c960860175d0c02000a42916dc4c084a01005b01d15639e922c3f6f00a2468b28783f871a9641741d8dbd80abe2881a2ad9c0580ce658c0968abcf372dc0b00bd3d75f4835c600009663b6838029db1e6083705000010010003793046238a3d962073a81399a258c2adf5dda8919976e83650c01dd2cea7210007e7341dc08017418b84d42710230080000b9105a05d0c00330b168650ac71c60398aa8000bade01428bb4f3a6e5e8f934817069deb62951e6a838676517d3f87f99f0180243ba4e58bd83d80a0095ed1c6761b35c0000c9c7d75d3c224a8b6577e123479e62c4d8368e307a0d80002bf34404cc8eb90339de81047eb77e2859c16541638502ee3eb1a599996305fd38ad8194bde923178c629533453281031ca0ca1981fe7140a10768fec3c74749c0003243be16764995d7ad31c20f0191042db29de81e6ca8e3377cf41e437116d1c058c78f5b450456b4a9c9618597b86571d16e903053d4) <<< 16000) + 0x2199464e39fc6134c02048d6e5a363016acbfaee3157e2d8701067f3ae0ff058e00a7c767f317a308a39f8fc7e9247d07d05dfe1e4b4941bfcfa7b1f060ea408861940001ab105a05d0ad75a0df4c8161259d4e30e28e19d98011c334fccfd605046d41b5ff46010f805d2c8a005ce476cd059c408c0200002e44164340b01a0007ad20322301811c8e0d8e8575bf8bc071ffbc88a4c57570143007a600f7874ad285249c391ab1133640a26047d02da32d0714e2c29f33222c008107bcaf0edc82a028011d6a00f351e6005a80d4061b82838f6baee932dce2efded9629251429ff0274f529e28df03e80f4638a49e7632fd5a0d1d052673a2081065f54a48f3a4bd2e2bcd58c1043d317713987ea7d032d8ca20a01c82c769c1edba2ca9b18d4a02bd5700e73fbe62d490999657b4ecf04bae9c44c18bc1e000033a20ae0b912a545fa34a73a900bf4d638889fa1ef7ce6355d67bf91840eedf55f12d2de6875e08a01ab717b064b328c8906e44002a5db18f3a48a83c0950100356804cd125a3dad0965008e474bab819dd51ca2a48eda962f75237f6665502da443c64ebd4c28a217800032820ac2a0551502a0a814c040012a470daf867c03b15416040cc951d5ce1289b78e128102383d89fd9e1022d07cb9c19aaa1a18203d629bf6244dbc20495320496e3b58688037adff54582cdea0190ad5456301a811798b69b4061be78c2f440b161d8320000aa0e10573a7195de4605294c2a1ffac1827653b81a2eb18030879ef98b90a06fca2e136c9040349e23f7aa58220db0c73518ea43d62bc947624885f63422078704b18168160000874829128144560a00a04f0140da4123930c60e1491bd21022c30570a4b9b3800a1187228408e4400615353b6390e02e4c3f1aebe28030f7dd631ca822227ebd81520cacf6a71d5238c1501030a5cedef7ee4925d86954d892000f423e814339c9ed3b4244253321d445015e40a36c4500003d08e85c008c0118513db8a117984a2e348ec8924d4ebb020c1433d81658589230e5d1da9b0c00d01824e7020029e3c00b4e004801000017137300c0000000002102de7729c61136cafd5e2fc863ec2722c92c82082852451442c06e080200d000135209c0b840b79dca71844db2bf578bf218fb09c4a208148107104087041018b018dec4fb0f794d01adc49f1be23e4254bd0655b03770db863709f40006e880f82e30180a2e60180000000004205bcee538c226d95fabc5f90c7d84e63884063861844801008058500401a00029a4001eb0d100066ff3000306a51dcfbb7b182855607749a8e0c00563533d0604a0b00b5e082804f8a074f0410000089540a000020ceda0f6d1248082901840c5249a367560814003ef148000e2cba411b3c001c400511126b8a3849bfdda4324c60902bfe80c000c08007de290000c01a156b54290962020ac0700003c44134240980204b0102500800108482490c1208608e43046218228ec110760861b0420dee81e04755963e5e971897ff4ab9c800000000004e2288206400380280100000a19cb12d91ff9608d7ae3d240973dfa13275dcf14f95006a31e6925dc151711a8cc8ea979570dc7d3bfe2bc3baddff2e8f4fb16ef83ccc70e228dd2b32e6435b0210c22008506332253be941554ced1d638404fc459a860078d32d6210011c909c30128611004000043482082e480c24f89fe486157672d8cc0408e821f6120c59d0bb0418107656884618050049d7440498508c02000028a60100200804101d082798b24e6864b0f4faa2035ef12e1c1308200044079cd91bb06008f586a9440075dcac002610400080000a720002d44100240760a0001e620723b0381d81b88c0d84787cbd11b9ab523f56257553c848c3fc9f05444a43959200168a23e632f30c3acec976d425a380f344460bd614a6752cedc19b44c01fd1e0321bb8e12cbcc3c5b689d99684e2361eaeebb4a4612bd336136cfc05b787a6c72396561f66a3ea3a8f95f5c85fe96d2971055b7dadf039c8eddca189845737177c9bd56a31c90ab9438fff545eac39471fa611a8d231ba45c41a428188020080200cc07228385eab01204648cfe6844104001000007d200019e6020020080000223823de2ef3a020cd0a3dd88c01711e65c63801e62dbe01403301d1a208128a10804000042c81080f06b651b5fc24510df67c0184d6e63e7b1030eee48cb0402bc81fd625042000801f80c0f807a38bec71118e2cbb37ab692042000401e80f471f963f9894308393d0e47162e1eadd85006d3cbd6c09020840200001b2400060cd8b91b26836204169097481611bc9f28c43089f1618924003a5a38b20009a44f293004c20420100001373425620f53923865a8f1908140855b599b868041c27c8c100021ee14c23004741570d88130a1100400004fcc872fc2c2b59eba9ea7fbabd8c8ffdf2d605e29b023c85dcaed4608286dab7142d58a85e51cad491fe4771cfeec080ab80e74f10a00d7c24c8d6370c4a6fa262baad49409293a1a81931ed89131000e6200d77e8134f3a937d9c32f57137c838158be0676319bc52ed41d97f9e03a7eaf5b392f1fd853f5164258d518c619440000ff48004c5903c110178280b4040021d0407c378211e09d936297c2e6bff8fe4f846ed72d457b9c9344fa225754e754c3669ea78e85261d27e87200932c4c81eacbf60e739b926c238dfc905b18a3ee2571dc7e652354eea599b6153cc05b44b0910099716f82f7ee3bc84e2fb96d380fb5728831e1b663f1cb9a542cb18c38c06405860c8112f24)) <<< 16000) + 0x00a4190a5825f8c94467e01a1f52c369c4c1d027cfe2fbc91934a4a4f7e747cc0d3f862e3833202a20ba6cc05e4a746099f1f262d9e0f7346792067275a7764d844e5e31bc5383302463a58868e183c5772e830faadead066044fc5318d20203fdaf918a00b2047b7c002891433ea0361021004612326ab3ff082574cf75506864f80eea00a18168a153a2800653984d0128611004249c57fe359122a0606ed24d00a2773d98400427f1fd4180032fd63401286108040000420800118103b0501d02c000ea881c90c0e08606e2b03615d8e2b3611b0471d76cfcd871212f014acf610018a05b4de0013dcf214014065182300800b00e000020080350181a00e0000200803301e19d2916081007397615c24083e008000077200019240c83701001004000011103101e1008ba2a0c12415651ed6041167918bdd1802b5eaaeb4280028ad681a80ca3044010000113200058a40c04405e0a02e05816808001184800751100251c3943833aa43d41dfe3e7d1a08cfac4b01c28a4275e90ec6eee0000000000000000021b42a575c7cc273a6d234fc6eaa956c12f13dd982b000000000000000000000000000000000000000000a4430c206182300280080a0081122ab1d5411e6db44f5c5f04b45e64c44cb987246433eb99bf83ed595288175e299295df6e8dabfebd81f7de67d75f6fa896f09760fb4b56fec79da68d0004ad20059a4400ee64e36674bde7c8bb1b3f3fe057740f023aacb1f2f4b8c4bffa55ce400000000002721c11811011c01000c00004f0fe91b66f84be2f1aaa348e0cd0b1c76a656a90452297585fcd97e7874100c8429515040afac7c6906781fc87c92204c27b46c3260eb1098b2747eb7c7b5e4e3636596ccb7c02ac6cce97bcf9176367e7fc0aee81e04755963e5e971897ff4ab9c800000000004e860462560c0b795768c5f748b7000bee916dfe1321218808208600400005e07faa2f5c63f1c9348e8a6809dbbe766bded47ea731d8d161378d4b6792bf0b7ab99d16aa65271854121b67379e715917cd7b99a6a07b9bb5facf8cc1e4ea8e859d778c4650cd32186222f056b142b2407547c81515d58edc3065e3c30711408eb6a2f704c1042010b2d4b9e71e6287a23b1bfbc6181fc9bbac2052fc20aa7c60c7c52507c1411aa50377426082200800009c902c0d81586c0243786aa4de90ad7a3646e284a1f331745767a73ef65bc6734000000000000000000000000000000000000000000000002e89221218a10411408e09200400018140100680700800088c800281902a05d0908b4fb9c8e2051fde154202ec65966b86081deda1421802667c55f0001fc9715e0000cc3844010dd03c08eab2c7cbd2e312ffe95739000000000009d0c08c4ac1816f2aed18bee916e0017dd22dbfc2621c62c5285205142102040002bdd05a417aaa299b995003425ec1b8f356f470fd05b73aca46e30e42add811de0d5ac05a18118958302de55da317dd22dc002fba45b7f84c458a40a308284204580100004d6b34df64e97cb145d577717ec1fdea7623269cf948b0e0094b579b8c3d8bf40008d8800272981cc8560c90b1ad2d85c7091be929068890d878d3b20709f241fe20604f9617ff8603a9c53c1c270820008490074a2ae28e384e16c80458d20a9f7509231ae98783238435583a8a0c08ee7af63613041100400004e481486c0a03604a1bc35526f4856bd1b23714250f998ba2bb3d39f7b2de339a000000000000000000000000000000000000000000000001744b14a14a1030c808604404a0000c0a0080340900400044670cd2db87620b1a529f29692460c39e94c490c59ea47b11812a9bc7c74a000896bbab18010e10d0ec20049ad86390a02088021ba07811d5658f97a5c625ffd2ae72000000000013a18118958302de55da317dd22dc002fba45b7f84c461860c58c48c4866023021021808010068000e910270d81306c09437431adb3c97f28589e9b8b0258400b71b00030800b71b001608016e3600280766630650004c2846010024010000ad100053620014f64004364811808006a8c81100a06ed03060c8c0cc0a86388283888154190c060b14241a280ec26b26888027df1bb3ca029310110042dc6c01891da592b2a2973ff635215e01156e9c24ed3e8166b1fdbf6a520598e38c28e20c18610c0805119b3991a37a244237c7f60e4993eb6b6affed9f3a5b2a0d1341bed2b0a3e8cb70aa3732bd601c41fd2614d1901c9c26523a0508081814e042045173830290c26c414f86c1401caa61db9c5008880f362a20520509405000036a408407225709cf476829951958698a142476aec1622b6d1c4ae0c12623c429d3d6d39dd304baa61cd9895d8204c46290e5a608ec99ae673155335369a1dec320706a926022f75064c62de0a649ea82393c193f5021dd5ad10b840a2341dc22c11c3b18a90c06cde0269a9603a01b3a323fe4a5da8d1dbc90525c7810265c0c87ec40decf482fe48250a484331c1d456dba886088f785198b03f1ab0d48500282af8121800194ab4780140a10804000064ce12a3482a1c1830a2ff77d94016272d6be20047996c4b0600fb3c9f1c00328c11004000044480034f1000aea20402a01f0980f02adb1dd1c36f953e3ae58c4a0d7d74fa3530240bf3d2ca07eeb1ab6171150faf194659bd5b00000000000000000000000000c4a534fad2336059da94f02a35816b9c0ebf280b1d6110c6be0aa1229210c08a08e0115ffcee81c909e6e841781d8755a3b68c3a65784feac071c0dd31a7c305d95504c4aaa)) <<< 16000) + 0x38c412566a97cb0e318f60e071c97f0d5aa5da4d50286773243e2c940dde72993e8942d51126426c432f0031299c139061b8dfbfb8460a912af19e55fea6dabb00000000000000000000000000000000000000000000000000c4a534fad2336059ac7f6fda94816b9c0ebf280b1d6110c6be0a9f3a2433f9bdc384ac24828a48a4823823025380e47386dca89c0f75257dc6d2d101a4b8e679150b00363a620042337b7b4de1a6e267dec2d4f7cc1c2dec06f121bc4fec559fe93fb5e7a9cb08fe783edd29415247fd110249c691e2d1a05c4aa08a224d40015f480e8ac070560362b01a1580c88c060470302745def0185034911686282121ec7a7810687fc1bca28120a11804282076da700ef5d5bf43fe8d5b23df824c1dff36e0487628c52632c942be2cee5d93386bf969307da79f9380a4a101bb13d894cbca408377366ad4e4db56c002b89cd349fa2a6a36977c0a46f336217e2a5a4fdd00aa192044c80f0f8af315d73a94910c37ae8a90b15b94500d4585aea5b6848d7e0142c1db9439c88a8b3d0b5e69266cbb53a40fcce5d17dfb37ccc18fbfedd603213b76b648327b0f45ea9a2019bf0b4ad8af74ccae6d5a060afac9b2d716ba594b1d1f829499963c722cdf4e7f3c0a079eaa577bcf10cee7e5968fb49615a6b4056f9347afa0e32f4783c0ce0f220a0b4f7830b651011e5bfad2876f09882191ced17c86ba44dfa325b664b58183bf95a315a05fc00042590170900b00c054074545ff8bdf5a9cf3ca18b13d096f859b59544a9aaa3171ba431728fb93b2c8fb25287013af80b5cf77705d2dc81b2331a921847252a11b855749e513ef5d0c6e9db4b5630701eee1260bd714bebf541d159323e8b60022d1c418e14425a56cf1d1d43ee9e2476065423c691b59c9b8824b959ec61be3745ca821548e34d175dd821502412d6832182569bc1ec6228152a0aa10c0b4ff88f2fc9b522463673aa9d44349f2a0861a0e74880000802005006026038000080200480762892eca59c5141550f0285811a096e7923042100800005510000fc20002c6404447014010040000111e086ea896dbd1977bdd5c2a7abfdfd34db70c4f04e9b5815c67f8c7d05fd14011ff80b94c1c4785a7cd62bbf95e0fdb6f3dbb38690c029af96a1eb4ba001bbefe0fc24904768b1af35233e9aeb34b0f54c22aac859eff1f1457385633610d6ab9e68931117ec961ef9ec08014f8653a57442c14e2d37f1987255674824066dbab4a7b1e15b89ee756319b0f7b4195b65d630677891ec893323634510fda8a60016c7dd43fccedd40214ef0386f553817756a0a125ab002bce6e19da0baf09c90d4715e1701b1e079dd38f18db5bb8159e7fb1300441b478b1afe9e17af7b1d25714c0d6c34758f23b6386c50288a633df5aa897339b6ec9ba1ae91f63295436b80069050c66757d000107e60464e58e78611cd2bc7210313fbd55820376444f08014181e0044848afa28735c96ed76f7e1263106f074a46ec84083e442092868e9ae35d522ddaa07f942866018070e91354428d8f629b15446dbf4972b77bf21c052c88aab586ea2301240b075dcdb5291c75600396003292bcaf4f3b509bd007004aeede83ebac635123c5252b60d1b59166aff20c478de0000e5480024199062d9eae69b124cd027d542f0fc24e75a3bf3ce43f4c9a3bab0a7fe0570425f0842dfe72595675d0a3e834aecd6fc660e0c55920383062f410de5898aeb687f17a04397e928b92dc6b6b8122cd836e50e175e0bdcaa9bd7f02e57fbffa6754bb382c97911aa104f6089e316f5231d971a48cd5c0c509a1c8d56e7f7fb9b59e700ec161eda9ffa06f2ed3b0efa1a1512e22fd447982e9d69adc703bf1c50a4362681bc113b257a29e4c33d32becf385602ffbd0ef164d97a87dbc35293285baa60d0fc475b3d092098f5c440200401000004440403601e1b0090de19270528c102b39217f018320041222581515db070a0007a9ff20c05f4b1b301026141f008007008000504806808002118800e3b100c0100131910031562007bf268b1efc18cb9b0a18830d165f1628268c420693a8808008f0d1800200153270d91c0600001c9c3800100094a56d7dd2802147242a0145b63ba386df2a7c75cb18941afae9f46a604817e7a5940fdd6356c2e22a1f5e328cb37ab60000000000000000000000000189295ae58c883c8b3ad310b7481ebd26038c0f6a46fb67a9450000000000000000041676aac9b36a16f30d245f544dbfb7a4c135f6ad7200000000000000000000000000000000000000000148c708608508404400002ad43251038e8c5c53d5b631ea2da2d1215722fd42425610901205543b969d63622cf2ed251ac3e8d472c37dd7143487ae455ae87f64341f9237e92e15c96a8292579e5fe85795f3b101a2a2c7140f6a7b07778e9cdb267021f790221f65a3deae9cf9b6848eab43ec793a4cf69450cb6d31fb9e0fee0506d6e1df78a28ae547825e9ba152bae3e6139d3691a7e37554ab609789eecc158000000000000000000000000000000000000000005212082062041030822401c01800c040080360897fb3f34c748180489157df22440003938700081084fe50830e1c400039387000104042d377d6000000045d44f5429c20a8040000342402c360141b0090df1fdd7b02fa30e280fb9b0c5b2030016e360003866a177f029480000cdfe6000e001a962ac721400005b8d800a04e284e010008010000d21000595200e02000e17200c1a0050900200800c0400206a400874002020000100365a1)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 20 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case2" = "QuadHeightCover18Case2" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 20 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case2 private def zz2387:"s0953"="s0953":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case3 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l14 l17 l20 l21 l23 l25 l27 l29 l30 l31 l33 l35 l37 l4 l41 l42 l43 l44 l5 l51 l56 l57 l58 l59 l63 l65 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x90963589e, -0x59514ba00, -0x36948e6b8,0x2ce73dc0], ![-0x59514ba00, -0x317f9f5091,0x7d595a1ac,0x3b17aa8b8], ![-0x36948e6b8,0x7d595a1ac, -0x23ace41e45,0x597f12570], ![0x2ce73dc0,0x3b17aa8b8,0x597f12570, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0xbc91b7,l5),(0x68fa92be,l4),(-0xf07fdc4,l9),(0x12d80f8a,l11),(-0x2a209e2c,l10),(0x85f4aa44,l14),(0x133a565d8,l12),(-0x20271c034,l17),(0x38b70b06,l21),(-0x5fbe98d0,l20),(0x1602bf4c5,l23),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x11e1a2ff0,l25),(0x13635038d,l31),(0xdba01878,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x4ce92620,l43),(-0x9e191b4b,l42),(-0x560eda8a,l41),(-0x638a4d58,l44),(0x2cb417800,l51),(-0x4e8db9d7,l57),(-0x13f337d8a,l56),(0x7ffe644,l59),(0x480d1c52,l58),(-0x8c6620b9,l63),(-0x82e6184,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x1602bf4c5,l23),(-0x20271c034,l17),(0x13635038d,l31),(-0x11e1a2ff0,l25),(0xdba01878,l30),(-0x8c6620b9,l63),(-0x13f337d8a,l56),(0x85f4aa44,l14),(-0x4e8db9d7,l57),(-0x9e191b4b,l42),(0x38b70b06,l21),(0x133a565d8,l12),(-0x4ce92620,l43),(-0x5fbe98d0,l20),(-0x2a209e2c,l10),(0x480d1c52,l58),(0x12d80f8a,l11),(0x68fa92be,l4),(-0x638a4d58,l44),(-0xf07fdc4,l9),(-0x560eda8a,l41),(-0x82e6184,l65),(0x7ffe644,l59),(-0xbc91b7,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x320490040000000005830330040000208c45c04c80180000000001501c80200000842a09806200600000000543406300800000000000e0640080000491c8d8099003000000000032039004000000911c404c301000001d888120388018008c0c20840a610050000000190481218060000000058140f30080000000000900e401000000204610130c0400000000342403980400000007231014300c000000e23080d8602000000001e0903cc020000000410901b98060000000000580720080000014628805860200006a12829013d0040000000000880690060000000064440730080000188a43404c80180000000160d024c02001641b817808aa00a0000000520a017300c00000e30a602a4602800ac0ce08c0555005000000000012039004000000000054092008000000e610803260200000001d844098c03000000031108121806000000540440873010000000aa09814e602011208e04801b85006020c1020940130a00c050444c24807b6401800000a110203246028000000d4150230c040000000310900e180600000000006c062008000000b868280a801000000170e0501d0020000000001280990060000004d04803130100002905409007a80200004d0841200c90040000ac1202c04ea0080001502705006d4010005305104c025a802800a20ae08801b5005028814208800c6a00c0001702807005d40100000000004c012401800000001109018c0200000000001c02900400000000442c06300800000000038012401800000000012014802,0x7c210c81b2006003e0408610192401400760850ca01a48028000000188a4050c03000000328a2014180800000005221036300c08086904080e428030000420d81202e500400000000220a039804000108330880cb40100000108481201c8018000410d41c01b10040000000000420390040000000004700b200c0000000008801640180000000011404c803002824847200ab200a082464850c082b401800001185c1201e801800000000019018802000000002a120598040000000000f4062008000000000006064008000000001d402c8030000000003b80990060000000000e807200800000000003a0640080000000002102c802021419e1140230a00c00000c4321100d400c0000000088481660134214405ac06d550070000002886202718080818710434077e4018008108308c02608028000000250cc0acc030000000220c818980600000000004409200800000000006812401000000001a0f014c0202822241820390a00c0001303107c048401000029086190196802000000008824058c03000003213050132006052843c328046140180001e0420d013880200000000000901880200000000000a0310040001d0340840784010000000044140186018000660d82f00b50040000c41904a02ea008002844982c00d8401400000a710e01a46028000630cc2100750040000002908401c98080000052885019230140000a388c803486030000a12047201b10040000082391480aa00600000000004406200800b092120401a4802800000000015034802,0x2603c100800000000000503200400000000b0900e60100000000001601480200000002c1080998060000000058440530080000000a84a01660180000001609c04cc0300000000016004900600000000036009200c0000000d81201860180000001a024028c030000000320480618060000000640b01c300c00000000d0480c601000001a01040098c0500000003708805980600000000000f0320040000008218811c60200000001086403cc0300000000003a0490040000000000840620080004d0921a015e8020000001c4510138c04000000004a1a0398040000000742a00f300c000000ea2a80dc6020000002047101b0c04b0c48418681feb200e0002444305403a40100000000148281a6010000860e412022d00400016431874053a00800608718a7015540140000000a83401e6018000001543501b8c04002cc3244500f8200b61890830d014d6401c1610c188700ac080300000030873029cc0400000000001a0690040000000a229029300c0000001283201a60181460cf08f00e89006000003946280c9180a000071c66401a43018000001220900fe602000001c23040648c050000003282601d180800000000000d0320040e306f0538055280301c20ca08d011a50060001081c84601ea00800000000883c0530080085070082039a80281d00c30480019d006038419e08200b3a00d41880828d014d6401c0000000000680c40100000028c110244c04000000000052069004000000004838073008000420841100368020000001845101b0c04,0x624a3a07a004000304911c406f40100000000002081240100000000003a0148020000000000720710040000000000e4062008000000c228809c6020000000190a803cc03000000328aa037180800020c6c14c0ab4010000000a222805860200000000000240c801030621a1860171a00c00000cc4c1b027400c000000000026064008000000000230188020000a21b042047a0080001483608807940100a3866043805da8030000550d82501250040000000001b805900600000000035013200c0000000088780a601000000011024038c030000000250480598060000004e044016301000001284c120168018000000000780248030000005c322a0520040000004108404e301000002e0c45202c8018000002d191502d0020000000220900798060000004509406e30100000004208811c60200000000882403cc030000001283a06318080000000000740b20080000000000f00e4010000000000fc04c803000000000f0009900800000009241034300c000000124820286018000000208e40d0c030000000411c80a180600000007231034300c0000000002801e40180000000004405c8030000000000520710040000000000a4062008000000000a8030402000000000024030803], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((0x61957fc7bd78c2d313fe47a1a55b070161f30a25374120a500249001ca84000a264c6933021180403cc061e403d375cdb4eb58d30a4f43d118e2d4dfbe86b4d2caf57a84e0e044b07fb480b000d7cd9a9c50003be897049c10900201e203d36181fba82ff1d28698288e760dfde74338b293a7f09f662481a588d2851edbbeaf4e100db69ca9e300747003c74fc1298fc6c0000e8d4a5100017a1201820e415000041e4000ec887806c3bc361dc1391fb30288965fe4e3e000000000000000000d0c2bd0dd3e602f32ba019ad0050c40383c21204b28e24c24b24c1cd00b00a00155c0e0080340006f8c8fd981444b2ff271f00000000000000000068615e86e9f3017995d00cd680286201c1e1090659e4bc8aea05a693c92496f71f0976b0a82a651469059058c4804000ab88e17ef010c6f476b12709ecb6587b9c98922462864071b3c8e14c5b53223195573b69a546d9acb8b89cc8ba3b63aa46311417e303e727cec41d668d0003f721da33) <<< 16000) + 0x0ec0587582e481e8048f0460e3624f2eaca1e7945c3ac1239eafdf32a2453941cfaca4001f34852a07003338fd0c82a80ace6046010000182323f6605112cbfc9c7c000000000000000001a1857a1ba7cc05e65740335a00a1880707842409631231031021609008a00c4cb9bd3303df3fd47ee26e0e443eb954804e7d36ff4c8aaad3dcccd3fb419891d86496371545cc57c897b0e61604b50ea1500018b1e30133e7fa4250a2621ad77b102e93568708038b880f8fba090188e4a4a9303827f94039268a00ae1f4dd4e18022a7e836c8aa82aa520e09805000039e43a46723f6605112cbfc9c7c000000000000000001a1857a1ba7cc05e65740335a00a1880707842409028e29018e18410809400e0088aab82c01006c8fd981444b2ff271f00000000000000000068615e86e9f3017995d00cd680286201c1e1090e1156dfd4b805f712ba8449a444bba405b6716df4fbe4942ee4055273fd27180000000000000000085b1b5c3472d79cdb5539108845e24bac2106c6d70d1d40856b1de0c820aa2f125d61842a50a38a3862802239408c5c88be344932a66c058069ad0e35ecca0eddaa4070ed44a63750c047e0b50d3010ff72027f25c83e064155080684828d50956878605a5a383ecb26a873da3dba2302cb68db2dc6042bc5a390394b2573b1fb199d676af6c94e5a2c9379e7ac96c8e8942d9d60a80038a10e8210738e8398741ca0a00094921c803a1a15fac5a8b8e2ac183f1a652040bd57a0fa24063e01a7aa344087b3da50dc841181d34786c2800a8688faa63802ce49f93581155690504e02891fb30288965fe4e3e000000000000000000d0c2bd0dd3e602f32ba019ad0050c40383c2121c22adbfa9700bab0332ac9cc02fb895d4224d2225dd202db38b6fa7df24a177202a939fe938c0000000000000000042d8dae1a396bce6daa9c884422f125d610814a1471470c50111d933f6c57044f74c3b3f811287e1e0a009962083a141d884c8586b43fd6253bd5f78fe3353fefa35fecc94939751fb8feac52af23a7e45495fdbf51e09327a5ccc2c784370eaaf7fd58828686daca2950095a99665a5556d090d739c3e0802a9dfe8531eb9500069c3a22607ca60000000004e672175f8d2aef47ea84c250c50a38a40840620450038008aab82801006d0b3dc44f39871664a5385e0e18dc39c0fb1020f8adbe202020dba02808500ad661170022aacc504601000014f2000548438cc41c44a0e12107010837c241bc0a000bc4209e4bb2315def09fc78f2d40973b06a32ffda0acd9324754b7e7e7f12bcc9255dd7d66ec440ca487fa9e26436996792f22ba816430c20638420410208a0002021120cdee9d47cf24678bc2cc5e3bd67161c8e2ddfde525302e3ed684d3d0f6551f11e2f47e5db71a1a13a80db4539ac55983afdd91c461dd222db50a385bec2c788ec94ec109723a20c44398b55f015a25fb2eaedb447312a4002078bfc8331361b4319e016f7bd13a170e5dea9db4e294db28bf413e7ab57c2c3a48a8f428f1bafe3fe1bc68554450f3a000c7e7024df491c9ae321010909ee3ed9c7060939cf3483b0a0600659b14503588281053dbf0b9d2210075d53b218e3c0804501c52bf3a5451503abec42ca7f3205f1f58e32b74877446543103800012b90dd3506e16c36cb61b44b0d90506c00a068f19920c6e261c273ea2012fbf41828c4ad6d5dd821421b031cdf054c2002695231a753c1c04543f738619c1400ec728e7b1e655441402bc89a5e6cae0e668e42857d2eee3a01801a34b635a7c78e28905ac29f202c7668a6d72428510262630328311329ee722c0b86473b7e180000f423a09c0090021a59481183649a51ffd6d832104044330e60163c8b81cab59438324950510e00bf00c07086000bf448664e00480100001713850aad740a21ee50ef58bc252e2696301752895620050dd271531981e12107956c8bdf2a400057b3a49b000800603e7bc0d7c1800afdc1f846ebf42010b80b00003f8435c261ac130d50986a04c34c161a40b91963377d96c79e285001bf083b38009164c2821635f622020569cc5088afc804896d9ee6e4510c102c1b0b938b5c2001dffb567fabb5406da08dc1c009567103901901e000088886888c34047a22607ca7444c0f952d357015742412882442041c12801404734b279c18235a3a090500611d50b92a94c56a48dd2658b62c4209a8000d11050198278ac13437a22607ca7444c0f952d35701574241288204103082141080447f0ef7e1820d9b6ec190f036824433152c09ba27db96db48ebb02ce00b33114f1c6276ad02a31c3409369fd2287c5401d5d2d22803aba5a21309020e20a18810410608a022245a0ed463c00048e704803500013a20006d840035f0867a2ec8c577bc27f1e3cb5025cec1a8cbff682b364c91d52df9f9fc4af32495775f59bb11032921fea78990da248e48840848640648440238060100401a186030c201d105034e19c1287409cc518512290926c6aeca113fe97073e4881900d6ec724296b768e4d9409b39685d402708250085a00e72679900d1a34cc0117832d007393411ae4c5aca90c816459259050c58a50a58850608180001006d920e26e129ea0b21ec3388f0cc9240011e1a26a028636880a335ee58b029696d19d8a14023c3451f0141facfa216d611c3009348c04f0584f011668570722400ac08000042c41a40400072c40014b4c0d1cabf9a6b0b0c28c6f695149124066193e0f19ab90125c8208e4eba3849579d8a1acd8c00b59ab0e5e901800f7486d0c)) <<< 16000) + 0xdc0400105840ee2a2080a47532e45f920dac9102e02c00011e10ce0186680c3300619603b2315def09fc78f2d40973b06a32ffda0acd9324754b7e7e7f12bcc9255dd7d66ec440ca487fa9e26436898396398316310294214114018040100686500c32407df4cf72da4b448fbae139cdbe7e526211a54d0c2bd0dd3e602f32b500cd680286201c1e109248d5abc2c72ff91e7dda8ef9a0b8f17d445721291c61a59a4184183923060820060200401b6475d90250f4237e2a9798cb002b52a7268a07675b63820de90f287171056071aff44413cd38c38b3893482872c1101040c80008037cd227e20dbc14e718d71f1e5448c8e2ca28cd8afef39450072678335e038960f7840625c0691001fdd295338a1c1f5e1e91bbc960800b2d0582401017fb68667dc1df42400bc0b000047a41a4040008304001a1cd918aef784fe3c796a04b9d835197fed0566c9923aa5bf3f3f895e6492aeebeb37622065243fd4f1321b44c1cb1cc18b18814a10a08a00c020080343280619203d2e4334e212a690997399d47308424217582183b3007be248918586ce43ce1824e25df63608007a0176ef0200042fa6e24280825008591d7640943d08df8aa5e632c00ad4a9c9a281d9d6d8e0837a43ca1c5c41581c6bfd1104f34e30e2ce24d20a1cb044041032000200df34bc325b1d56fa7190bc73448078638b322a2fcc3bce945008f016403580e25e39de9054d0069141478614fb7a287084dd20bc611960800df846e2d0040680d00349f3753884801881c00009488348080010b48002fa900081336462bbde13f8f1e5a812e760d465ffb4159b2648ea96fcfcfe2579924abbafacdd88819490ff53c4c86d130a2c92c62862851c424004030080200d0c80186380f4b31197d673f30a8544dee8bf3093350d0d9123077b6f874c942c6a56ec1e81020509e3be33930809b5cae63070400094707d080a4041400a34b97a076c189a50429b38c58d219007ca1d0610a19b667113073d418f23c1230824d7912040454e109e8808003f256b19a00094021a5de8ca3449d51a5182cd16beef92480aa3bd193c1a4462876b3a131842f944f847cb983b5ec3722bfa1230c506168b679408010a1333480809ad4d92ab115d2400b009000044041a4040007f2400177084280800203cd918aef784fe3c796a04b9d835197fed0566c9923aa5bf3f3f895e6492aeebeb37622065243fd4f1321b44a20a1ca1491491060c800100c020080343180605c03efa67b96d25a247dd709ce6df3f293108d2a68615e86e9f3017995a8066b40143100e0f0849246ad5e16397fc8f3eed477cd05c78bea22b90948b24b20b18a18a1471020010030100200dc2a8e5b7094fb4de4c1eb6777f025beaa0b1ed6e4d2751f8a24b19c96dd06df88460814a8a47a95116fa8a108569ef0ffa85ec4085ed65a0b262a5010010bfc8c05f071bd0901000700a8c2453cb54ba99040124e00838307b96a992d2a58fc33b68d300b1b26a4e19b0102a2473712182847064721660204585fe4960090400e4e1b88524009c0500003de41a4040008e64001b88862808310040012546c8c577bc27f1e3cb5025cec1a8cbff682b364c91d52df9f9fc4af32495775f59bb11032921fea78990da248e48c48840840628438008060100401a186030c201d1122c019e8f287200874548942a56cd2ab80912740d862a23061a3b87c440c02bbdd01a284006a4c2e2e8270825008592f19e14d54e590b5757cfa2a50d1f45ba504258aed489e66d250a2c054d03c038831421deb3258235209fc296080057d05683f48002801459080ca2cad6238e0249c0107058d01fd39c9b650d38e34590e850a00e4e1ba6038832ebe8f25238609d1f0b9325852d268202904020039386e214900280140000fc1069010001f610005832182020c00105f808001f8085f08c00a94885e9082f044176120ba0905c8282e01416e020b601001a8590b54d85a20c2ccf61647b0501185886c2c03615e1b810f59f0823852144975cbafbff7040c7a946055bba200b323998299f070275262df1bd0140558056d416e8200357bbb277584150410501e2b0d6c3816297e6e889aaa042bd08ed783b29333b21701a289090aca4dc5080126b7784a06308106fbaa8ab19211804344bbacd92e81648d5abc2c72ff91e7dda8ef9a0b8f17d4457212ac8ebb204a1e846fc552f31960056a54e4d140eceb6c7041bd21e50e2e20ac0e35fe88865085045022822001808f08026315fe696c16d957cf03ba1aefb3d6112b2dfbc0e20b9208b022280262157d79f294de31437a630bbe335d91b7ef0d65f1120c30e6e740bc2cc5893e4dca00088242b86611c220ad1185608c2ac0765008d6b9292c308876b9d018410e937a34b0660a03a2f92080d9709a60810128d75f22a002b318118042c54f1ae4643207e57d9c6a76481c08029ab129a6602e729b5f8b60b07a30c11115d4e72319be16af040220d5f7699be310dfabd1bb482800a4f5f5040472612e1fcaef40a009ff8b44b5777ccafdf98b860033626ca49e2d2c8a679e9a2ca04614399b391508a2121ad17e015ee38d5589b4feab0630611000001e390aa25e091ed9732b400211c21008609069ef0a7df295083dae5c5501baf2c6b53637041c7369afe36ac69f0035c2c485043a267f21d5c04316025923e51913ce133d35b6edf12451aba438471cf69f3458ff09b95a3db996cd9b36ac47ef49b84f96420030d2222f4b4703f822d98efe57fb12f595e64820a39181a027edf6e6fb57cc7bf153def1de79)) <<< 16000) + 0x71c53021cba8aaa7b66b7d91c6b388a76d9e3fee947716834f590d6f58cc0bbbd7a48f78d76fe4d60fb5d6f000778127c76cf9237ccb4e864eee9f86a4e7458e5df368f644e5d59ab8ccfde932a13c4eec3863a8c93000068f2152430a81d8538ec2981614a0bc193aae32217cd71eca9d57dad811647793c43d4af32bd91c8385663f87a356943a3cc1227a021b9a4f089f8d413cf5d66dd4e52c15db37929afa8da8a52ba73ee9fa59ef4605a162a03d584b15068fefedc577af82902cbc67d3d8b486fd439aab7413757a5a40029c51972ce90dec6c3cc3dd52943f0be029007145dd8e5c5017a6992ab908405b44bbacd92e817b1b5c3472d79cdb5539108845e24bac210307d1eca8aa4d8e05a06d7c988a80caada06d7c988a80cab60fa3d951549b1bf880a60c58278040013a32f22e9837024d9a24e1b2fc5eb5fa10bb8fcfb631efeb0fd08f6c8c62eca6ba260101ba2475997197038e96408ac4f3f3b1038ce2223093a2de90c464bfe29255a16879e3400127c8480080022988008181001595211e8308e35d810c84a834800da098ac00844303e01080200802026007404c5cbe49842104001000005121461309a05c861747336c4021d4fdede9e11da1ba2f0d03663af80c50016bbe9624125142100800008610001f4212e12831cd72cd4600a742184284830800100b40b0a20584182c2840612a020000e4214043910f2ab10b9010c32740d0c270a464061032c40a38cf00cbe6dd0002128e0f804228bbb1cb8a02ee34594ba71c0b4a8634c6d9ddf628ff851057636b868e5af39b6aa7221108bc4975842060fa3d951549b1c0b40daf9311501955b40daf9311501956c1f47b2a2a93637f1014a1480c70c3082ec39a44e586ec9adb5c6ce2e5d1833ffdc7a6cf4559fae615b5abb6ed80f15a2f52f6c815ba5ad6d027193537b1ee40a41df6ce0a0831105efb0218281f7f610a62ac50345102a13e0309a0181c80f83311ca7e6103db626b1f2810a23eeca0230c2000804c00c278076303b11f02881b1b05d491409bc88b3d1602ef05bf182076f8627e00128a10004000041c8000fb900071e212e1280c05e52a79965a9b45efe61e69851cc26dd0138e72803823caee06621bf97ed1b21edc396d349c681fa6b88c00815eb24af085090987158e934a3e191433f33c97b100040720310ef0f2f42f095c547d9c2454b3c342333e01000235f9af84b5cc7954e5b541ad397886fd4232d31870029fefd4e968390059db34bb7e882ef99f8ef12645b2d3b831ce3db5fd4c68758f38d535aed301052a48c00b4130610984184c25404000a5e400367882f90c274161380bc191e97429c4884f7935640c24408f0e79e0036025dd8c02f8ba882e020329010804228bbb1cb8a02ee34594ba71c0b4a8634c6d9ddf628ff851057636b868e5af39b6aa7221108bc4975842060fa3d951549b1c0b40daf9311501955b40daf9311501956c1f47b2a2a93637f1014a14710d08401087deb5344671a7607ed828df7aa3f80b9152a1bb5853894ee85bdf5aeab89d518ad7842559ca7905f0d805c86e17c0fb39047fab322eabd5a78e756588cab9939f5cc1ddd50448503a1360309a0184c80e850402f360a707136863f8c8047befb6848808368926c64024142300804c02ec600938fa5ce0c28db81361430e610f90480442676ad910134f5ac374b0052f3df28040c0271e5ac042718220080000b790002862000f7a425c2545374af54f162a202ad210a1787ecdb9040885cf391a0048304001005a0984b04c20c2612a02000131210003a120ce6d6848e1062cb31041801221366f800008319811804000031880a808002d5884a0c81f0040f602001d6320f403e3318e3a344ac611d1d32661f42d704aadf41bf49ee18902d8401e533a4aeed52c1f8676e5484b7161aef188c5b8a961f4019024caa59033f80aaa5c3a0e0cca6a85681955a3745a40d31358268303f8fea3dd8905cd21af6e7623454f070b1b88dd434e9d8acdbee7026cea8f074f94a19db492fd2f1f87500e4080286fd886cada2e212924166ebb377c708e22c33d0dca565742bc012ca0b2dbeb5059edd4845053465cc7bfcca002be736af1bd0f42988f28b36eac9e0080a0280975088ee719f2fa662e0f2826270349743d43cf328f3455d8f33c9235a90268c292a9c0833f7ba7be3f093c4babedda39c53172f554e7477c00f097222f907382eac72ce496c7c9c926e9cb7dcffc743d0e3c3b8b2aa5858472b9c3ee3d08e91e123d1eb032e68f611c8a18e038e60dcf0d5c471d8537aa057f50ea0f1c7191be8496c52063028b17405c4df4a2260e83f59252f534d286b4daebedf51b77f7e8d069d8b1523f2776e35a8e5825851fa0d3781bf008c0a000b9c20a05304f258268ef16d9b8c48ce40e4659514b9ffb9644205b0485a00e72679900d1a34cc0117832d007393411a79a9ef8eeded2b95e5a2fbaf56fa4515bd6cf5005c5c052a80000000000000000084bda279819af689e6065d24fa90d36000000000013a0820e18a00800003bcbc8c6ebe63171827168332d3f710c2d7b28bf21da63b8e4b4fcf63f76fea5481ef29cf80176a5bc9ab6536697c80000b1c9abf0f1017092a345b658b70c20d973bef9df4601188d4f08f22857d342c7889a13c474bbdbbfb0a76ee8fdfb71c5bf07fab1b46d45584e3f0395a349da42e333483ab22ef8370f0b2b028b835846cdf6e924ddd4eeed388892e6aa5c5b66e3123390391965452e7fee5910816c121df8e65bc45d859696565ca0fd73dc)) <<< 16000) + 0xb5efb271f5dbe0454b61e000000000000000000889e6a7be3bb7b4ae57968beebd5be91456f5b3d401717014aa00000000000000000212e4c5aca90c816828a504380300280a2082182e462ef8c9e83ee9fc4597c38b6468ed46536d2bcc6db48086ffc844dc060b6a2929cd81586e077facec16e97bfff803954678244542da490a1a00e109d99a7e0d4f23bfd1499859dedb0e7bd61905724c28d2a9c6aec61321bbb15515e55cb228fcfe24c0a2ee3429a69c1aa2558670e18935144d8e00de9493b008008254e0800101260b09205da00e72679900d1a34cc0117832d0073934119026018c5c601677e3996f1176165a59597283f5cf72d7bec9c7d76f81152d878000000000000000002220e11a28989e99f59ec3ca5184cd8fa006c01ae00f752000000000000000078950c698db3bbec51ff0a20aa8e3a02982902819462cc404db436e1bf7acff87495defdb7ca671c1c40130acac79bbe8b99d5c099b14812c678b088e7598cc1360010dac8c301ca3413d7a6b624001635ce58c8ecee89054e54f60e708c9ab34991375ad2b35198578f09474862cea5d09101e18d1e5b98440b77ac720e80094193f1658081dfcc1a480472f68e40008204a68400100001173c4fe2c4fd78c2367ffdcdbec86c792a872cee062384ef9dc4916d3623c755efc4602f3a42db12ce9f2b08faa62c139cb49af641afe60cf5507dca7e624a6c4111aee501a085b9dbd9d803629d1c68b35674db63115a263b8a14816ef8af696fb6bdd4d64a44c8ed21c5fa3f41ff0e83d9513ac12a92a7162465a32010073880e26940bde438eea8cf55ee1f7f384dad7d6a484d4e58d9c4e1d8a44ea6d75a74248c24ca54b757bf954c72a037e38df9648b6247f61bef36c9fdf44f449fcbb352b1586022bc0820018e2020ecca1bc71f14d0217e204e368180b17d98a333940f2711577dc227a05c939f5d8c1d5854c58664a5dfd5203aa047afcc27eceb880224bd376632c597447ad29c9fd4cd7fd7aa8fa654f501fb9599731eece8f11b4a6f65872c60b33110f7d921404fc8683a24511eb4ab7422c4ed24fa497ee72470b5c9e35144c311d03bd2000295c8480080048a48009c310019f0211e9b08e41c0500401011a0b08c0584582c228161120b0880502482c21c1408e0b04605c517763971405bef140f1a6b9382d11c204613e9e1571c797df48b09bd23867000000000000000000869e6a7be3bb7b4ae57968beebd5be91456f5b3d401717014aa0000000000000000021328c42c2907817b1b5c3472d79cdb5539108845e24bac21029451828a29a0012eeedfcc3140bb414ec1eb6d0452aa6e32861f5704cc24eef8b2789ba7c440dc2e3eb6645b6971d856547d35802a3a0cb5d290b35e6b4ea25a030cfb35e1f6cb32220e501b896cae426f25003b8fcc39879fa597a4b4842c2a2d806008020218170080100404280e01002008b1848c9a2e4701634f293a2c01a37fbbd84610420100000ac20001d240004ec8420ac16836106130001cc21044b0810503e02c200074493b51cb14493d5bd61b412281e1b7bea680d362d251002022121a1100400003cc80a80800261483f8e81f8460fa1307c0103d808002bf483d00e46f9e7c5f0288b971811c968575f5a4d6b53d1e5cff647ae984cb76569508b5e156b7067601a2f26c5218c24080008aa1aa31c37c0bee5ea4d38c9c657c3d4586c14f5f37c54a1d66272fd4fcd4cdb483c3fcae2980a1d9888300a5709067e9269a1b5b0b7439dfc72748b44ee0ada35d17dbae9e2ab1c31312869e2a877b500f08f2056fb400000819cda2212e5069a2a15608708c2653e93fff20e06a35f32e83b41bd3ff62b1aef5282aece6cedeb61d2181041ecf840c085064ac659d4b7acb52a9e52533bb4347cde067fafcebc270689acd74bbc648237330e70c72110081c785f218bfedf9f45cbed7b242a5ca16e1f9d5631bb7bbb4ff840ffe277146e34016ec38baf14c18978bdaec06030ce361aedf6b4acfd5794fedb7551131a820042deae0be222e31c0da5c1f87f4ce0f9edc6bab29b80009be2006da2401ef50e794026f9214a11ac7e6fec1d4c3adafb664949a208c5bcb0000000000000000020b4bd9765694465160000002a1c9fc11b7b8852273a206bf35c648ee40ae5495530ac2400000000000000000000000000000000000000000000002e18818608c00a0020282020001e3183e962f68429dcc771c3572c39fc125bb1f83fa17fa9dfb42c82b6700722d1ca2c491dc537ccecc91acdf252a430022ce22b1bc8a249ca68cde4fc809fc3c0c07fbc2655e64346233d38a09cb758bef28b7172b25333ec867fae405697856e80032610084d42019572602aa1ba605079165345a2c674aa1d89bd1985c968385603489bffb69c054400edb059f0e31646a54db050891452640d8c9382b455c36acc32b84f1304f710a0048cdce860fba34f329b2e56c1e6fa1b0204b02100624a4ca7595d52ff4615e7a0b351255deac4d40a22259aadcb8e9937a4fa6ad8f2d302dba76c1d78ce0499c2afc99d8eeb98c3cbe27714395d59eb48741d2dcd290c0d3a4e7a273db2c6cdd4a29a4d8f420226e9e36f6dc7f7e4a22c2c746af1a03856e21730053aefec325923c782e8e085082cbf810dd5a82ba2f9e5e8d875b200a09da49f05c464a4d77d5a0c4ce1d21e0814a9c72115ccfb65ae2d6536722e87803d1adf5472dd34f9b2ce934561d5a000afced4823139846ea5589236c18d08803acb70ef91c731a0dee462a2fdad803565b6bc509eb43880)) <<< 16000) + 0x965c5347715800024190793983c16c1dca60ec03a1413f65bac102996a8c46328428dafee5828604cc02044604211f70a6820cc37793161401a5914cc600138c118042871fea55a3250a3d043a08c814c8d4167f942189afd45d14300e77ca523041ef1dd0c01067b7d4019280ce304601000017620ea2bb14259dc103205613e4749461025d93d7a1430c1f7ab046081ff7eae604196f8743c0500f62da8e1000271c2200850e768ea3c4942a01382eb240acf5a6bf594231f8341c4286039df2948c11004204fc08323672f392a0338e1100400005c480017e90742583990c1c8260e21307009c89f0a845f8211f49b8e2041b78317e0f32922860416471bf314360081026578807541fa2430009b4bc554f8e2c388003042317f85dd68e18033f1efd7a1f185a82001892721893e42ce00020a770966785574c907f6cdeca0c0f81d1429c756e7dc119ca122ab9b4f1aa5650264343d499ed8201868066ef26c792012e598d50250c70026cca60a280822005953adf260a0ff88e7acc5941dcfcc486208091448a7e8f9f3828228e4335a3d655f45508dd7a0b0b30eda1d5b4b3f579ad03fec91be66503af1bf890b740b2df52ba82ab98439e18d2b021fa98a6380a00e35ed20239c3c5dadff1f3fafbc310bac34e38801185a93134f7c6233d8225a2d6049096e36200804175b0648738f05f31e1a483ca7b3de31fead906baa860b04bcb34d565a952988607dd94a0f3e4a85b08ede08f6989a1f2c0fc9f6ebc51c981e05a399c830b00178e5809c0143efd42ea13200cff00000000011d766228048a7488105b6682a669058e60250258030041086c788621a1197af9d3fb5a6e7dace310c8c571603300502f1c26d9c822aa53318524075ba45191b21b0590267a34fd90304bb884164820598ddb78e016611466800ca28440100001113c588d1feb12769fc81c7135329611c3bd3cc57184804b7b5b4f20ef14471175106b963024d4ff9c011273d0da6cb194506003cfaabad25527162006e7e1b2cb873012d1c617e3d3042104401bc07e602d0fa70e79555456d449e4ccfeb3bbc51002ab901602081294cb084001f0bd34e04c104401081803953e2a205d707885788152f21fb7396481349e6ec58207c4dc131c00123623624800a849b41040005d3308740011004206044fdc0e88177a6df5e32053339ead7659213fab15c1600044f227450000d9b0b34c004401000013620d2020002f8200089841b817a8190ab307c05ea6636ab40d0178e5809c0143efd42ea13200cff00000000011cb0d81c4822405932c348100c924078c01dbb966850859469040c48638081bc1f4b8fece3a932b41e89f4aebc3b0f3de03f1d205c14c2c79f63c4bc83f94ac5e32cbb886b7b7670d1d203c0a3b7688a29a059500039920015404003a348138c8004f188368ec07c66002c3841b00400325c41acf701c3cce75762a0c182a5a77131c9010ede4c6262812080351b94c00100fa1e830861e08000d9088cf0980010abd33059222280341846a3c04137555f0bf9009291cf0b00b1424a06f7d950244746a4ebf8e3881affa9258050cc242d109b94115fb27920e1c2287f1087cc2846e5e552b3c401581b5bf4b8602f45ac03d20000410488418a906c9342701c50ad95288d80c8142dc1fa38d1424774bcc40e2c3009a7ec800507ff31c3ba108048fdb407ec0c00747a9ce8344500978c7068107136511ba8367302701858ca82d3903852460fcb1bb9ce962a40189f0ff0c1001ad274800589997601d6b62440427059b430e008d47ccf3811500cce67f484c13a7a6f85a8967282902060ea35d54be8250e0c7b02538e60c7763ca95b868a00cdfe600060b9bf4af467850a12998f0ac05060777ceae40400191cb2000e8a8212de62d9f1488242801c7126fabc4a190c2400cdfe6001c456e594bcdd3c70066ff300070ed19eeac538c04035749dc71c00fc69a4e413000f6a2f7e0000d94654a3a48082701803500fca37d5e250c8f26965a707613c87938901b088040337f98000c103592b91bd00003ac6a2953c02c4fdda3f0b000269fb200000046556dd50252104c02881832792e954816c89b024dc815086c41afe813d92de819471201c9c3800406009e66c5e182169484be6700062db3730600002dc6c01a400900310308222e678a44b0087c5a1d502d807a0913740a489b91dbf502780e23d71420300c5d85f5c90400747762c240002aa983aa90004c0280001b520d2020003b82000b7a41a0460ce130660583282f88069331f8f69a430bf5acb2e4d1cfd88b0348070c11cc674fb9346b15f00734a96300337f98000a000709a3fe26480105e5d6b2d110190820290200000ef9000a23200187c409c84001cdc40041e4832008004b6c800a8f106305001aa490622101c90800c05442d4064ea8850cd6b78dc7ae7d30303053dc15a250288874f4ea1008d096a8508f1727bbdfbb8460b9782d4e1ed848e01adaebd9dbd15b17df9d5c52e50a4180601851dc18a3f35a981227cca2490280bd2d0afd6d0516d77d893c0a77eb0110001b6e420fc71da878cf1d976c7f9adb9eb6ffaab75f2422e1d316398a438c0bed1f06ce68517c38b9581c48af8af2f98538a6ac9e41a0e194679317d8d95bb69dd03a0705942c7b556019f5d92bafd63004d3c1aa35a0ba2f7cc6340000ae5088932c9037dbeb287700ecd74e5bb0722064805a1900d2cc67d4181f3730e2c8722110fe4b1392d3a2ddc5c3dffe59bbafa822b8d1652e9c702ccb3c97915d40b60fa3d951549b)) <<< 16000) + 0x1c0b40daf9311501955b40daf9311501956c1f47b2a2a93637f101081c50c8089003002a65f845199f3470d5f3094a7e519a0aeeb47ce8137f5a4f849f9ff7b2abf280b5301f0186e24fe19dc0f37bf692d7cde5efd364ed9126ef4d0619a826b7a6ca8c849d560712585984902a0e9e29bc50df6c07d2c405319fb364100199c6657804a204201005a0d83086c0004d08002d990602182f8ef8c2cadc3e4682a4c3a06bdd02044d1961b71fb963064080fe1821c81bc0241d426014f193a4019676748e2d55442a2a5a4c100b859a04a1ecab879920a180818dea80a39663499fb0980c01e64ba3b248c65dbbc4bb90860d850cf6d248161c580dc40e0df5e7128a142553fd4d8a1939e28b001820eb4b47042841c21aaa945040de308220205ca9f62f227042300802f00c174072407c0f1bcc918df57832e3094d396a821c31c5522eb8c1afd3fdc806059ffa5cc64c084201005c01c9050e2f9062c625e7d5140c266513817470d714120f430374dbc012100fee7fe428203f75ab7c82708210080000b010002c120b62305a0d82c86c0012c482c0480540400101240044e082b98c158360aa038443f92c4e4b4e8b77170f7ff966eebea08b4d3255721080bd4cc6d5681a02d83e8f6545526c702d036be4c45406556d036be4c4540655b07d1eca8aa4d8dfc40414418214210101022859860736f65b367b38f76ca096f7dbc8099f6ddca59b4a8b1ed591929b83040248c25f73d56af3fa019639cfcbcc2bd6306b28d04f499cb46851ebda3e36a5c763e6ecaf4f41968551fd2e5480f76c3ed39cede62d796bff3c30c1cc86dbc472216859db707d1eca8aa4d8e05a06d7c988a80caada06d7c988a80cab60fa3d951549b1bf88022883843042844022021024802000202864b00401a0003624150640a632052050003be90511d0280ec13c6609c3304d15c8ab52c212409a270eb27c1f2b8d105de850f5e0c72451057eface389875ecbaa0f6a58b9679c28f2ede9a18e057ee3448d035e13d259790459e1a639f779f0846d1801b228be36991b962a81132fb344a572c5e6c034f410062aac92350dde24b9e187e4cb2345a388fc2f10100497336c5e0be67ad1346b25593c87c8367bb8305c4008201a8e977b8009f1b20b23c8bd4124733ff2a25190430b12b2513df0449893900eae66e9efd04f24f27e54e3e6b98f61a3233fefe707d7fd23153067e8ba92b4bb0b4eb88b819d83f322f6a01fa7cf4be71eecb70e9f2288a0d9c48dc341e1b4c95567d3c31fd457c579461b93df64b7fd65987987e24e556499ddc3f3d676b63aad108f0311c6a32683191e9793e8a2b69f6e492030eac5e3170340b72459b8f33981884a07e51f31c0871dd93eeaf9bc01b2f9de8507aa5bf6117f428956e2cd06b0ea1dfa6a8fe6b54085f29b5fa5b32b2cfe8430e00fd43b7c60009bb67eb11edf2750919e3d94e7c08e75f84469aa8a5d74985f1e09cdd9926f258d9827dd445d99a4bbc285c87cf4f4cf546fbaa6915ec710b8de2c79dcc222077b00260ac12c56094120490982404811c1608c0b04505ce86ee7dd3602d0708d144c4f4cfa1360938c97f3b0c82dfca6ee42eef00000000000000003c6518858520f02cce28a24718d00b0090007b6dab92f019273fc7c3fa9acdd8adb2f86c419675bdcde021ec262b394fd74fd8b5902e9b9e814f7ff036e3105c1376ca0be0c06060c9f57aa02c07338cc9060275259c9009040780200880b04305c0c31298023894fc2370402874446a04618380100420182080f421cd66c18c1260debf8e0314e54ba11840e804345122cb4e4305e8c3df5cc0393dc751046103e0100000a620801b91c1f0517900b9147bda271ff5c26470ee54f4ae1011f9003d405aa79edc0c144a3f2d850da1dbac410323ae100e5f9a621b7f56ba5879dfa3be6db2a0c00dc6464fd998fec7238fc4c32211baa684dbbe5b8b315ef863a165c5aa050278c7857b94606332d35b6f1c9b0924f559542026c1d4810291acd3518014b4867b5f020668f56b523029f4c3d030b07af715b462fef10a8729d602b2d1d51bc3678ffef7aead8284602d11a0d72f95f4f20bcaa0821d06480005a82000e72400207481f88c00252080202b643bb3ee4d016e1156dfd4b805b815142d393a5a00af726096da1f2a00be81e95cb0b0822c9300000000000000000086b9316b2a43205a0c20a11c00e008002507d9449681aefde263ac4ca259dc0ea29f41173402a7d1e59cdc76ad3ba80c6d993fc11e134e59e03772d017f2f8d9bf05e8caa29b25fdf08cc8bf72a4324527530c8d5832ef29e66f79153036cffde28e1109d758dc048516cb4343957fd8603794d317b3996c23508c7540c892d11b0c6674b4d126c7466d8b21024b6e6711f1ee0257eb41b838e9ac94d45d19d3c59436046611ddc400adec2e2dcd6232cf44d02875303ad58866d716ca4abe2fdd48babc056243d808365b0a28f15b25f88225bfa965fe924458a29ef1997709dc2b1089a22e3c2edd2f2f1c0dd1015a008840700200000f2400161881f0cc0f4460781b030010004d7902e0981680f8294d50dcb1826b4fa6612c06c3a771e2404d5542fc000241c2000801d8280e815c343ececc1285e4140924b03859ba795626d03b81dca1b5a08e8bf5d468467f01254080109c50f97d12350715cd35b36ac6fe36679e68112708833f8fb02fa5d075e92899408a42bcbab3cb4facf5089acb9de3aa1e3def9113568c6993e636756dba2f94c6f321c0e8a6a62f63e7a70012d1134fbeb4abd6d6)) <<< 16000) + 0x0636257e17fc3db5d780108597568fb2d2d21641c34f81e349bf557f98197736a2fcc1b5919df168fc9f82e6790a851d638a23399a604171a16fd24b2935712f90b253875c67119900fb864f0a7f545d7d3c307bb30f0663468d1ed3507a0df5c46d0193dc43d3f6b5f001c812a5f5ac9328e1c68576d3fc3d7e4d0725cf6466b3e844054ecce0bb1e1ed02fca3e0d21a55d802cdb0aed565ea98d6d06251ebf1bac5da23614f9495a01f6c83228660df97510402c1e301606d3010b1abb20dda99d509a096830a1eabfee5e984c621f26e00390100028f90381181b86c0d80400159840ac278236c0402f35a97af924103674f0b50fcfffaca9c26a7e4b8f97c20c91858fcc0be07375b12b19ab06c4b11033130a233f86b188e075a30fb6389ed8fda8e093806ba54fecfc0b3fc27e1dae1615b564c03a65fd5478e699cdfb612f69a50f60a3c495db204248442c09c310d6583b0aea4c190a3b8b2e83c41a6b5de73c0075c3f190cef6b773b5ff8163a7ca7bc02510e66b0afeeb1011f681be79800022e7519bfcbd1b3014ce7a414386b2570f169c1f90505c494f8500451b4a5c75d0fef97866e081986412bfbcc18aeffc9543a221eb31656cf8c141399268c6e1ffdc897b8839695965b8827cb254516579783ff61444de86cdc287292f2282304dcd992cb2ee3080ca6829e196665836614aa7c88e41428bec8c15450f45ce6ee59b84eb60f18fdcfb1395d647030cd6cb799d79ec8ddc079c74501d1fabcc912096cb8d3dd6e0f34e1d8f1ec55b0ff84ff89e0000deb9106628ef9cc76a5079f8bb904dfdf97e039f4a121d7128d669d6ee72b64188e1bc01c08c0dc3606c020003ce206a22000c21204e520018563451e75562610323fa28d70c164ff7b112c084c1d7711807632ea090c066e77d14010104098e08002000028840540400610c400e64081a24c0cc0742529da124542c21c360f8d9182cdbd8d293156feccf9a8f1b8ca80bb7c530ac694503aeec6d0d798b8758af0ed1121e2b032a412eed788cdef9b6d99548c32db46c5b0000041629fc19f130d1eda401c7497683ac038c7a0a4c5dda4e2032e9c2ac3760938f520b13a0b4437276cc132620f2873b077ed84747f411b58229acafdcec02922811ca2c516f6134190081db033741040533fa98601be7b2fea00009080840210100100401902e421bc6e5f2481e556b71c0088507c02000010240c466060020000fd205e1202e0981680e460e390b171a04f5f477bcb00816c0c6200118c108043479d7fb29100407206b0301275ee6224c30740110040100401600ec30aae7982187cd3f8b98b02218db72846103e0100000a620001f040a846052020001de2056139183af0e9cce1bf61413d004bf8a531b160827f6fc3a0a805a998fba17f5c7025b1862ea6154fe83e0549fa98a963b4c0c3fbcd79887d6ae76086084753014e7ed09ab6ed847deb3bf45287ecf7dc01711032c78c17532296d1eeb21604f817d1f6eaa27b6e02dd4ba5647b15d4635ab26afce1ed8c3e4a820170003379d94e8c97dbf4ef6a8e6bf98b6fae2f003deb35cf5586e06178930c443eca6454e326077779c55d8157e26cad324784b67bb80920e4839d2650b71afa2467207232ca8a5cffddb21dcb5824d44c7d5882802d7262d6548640b822806ef27102d83e8f6545526c702d036be4c45406556d036be4c4540655b07d1eca8aa4d8dfc4052873c2282080376860956df1919481ef2a7b902dd28254d7fac2aad91944e83a74eb5f2248bb094b19069643bfacb9e16259dcbba87fd5b0a47f6eb263fb44a6cc17d93f4e1d32dab5411153eed0eb7c37029823ae6173a288e024bf01405fdce1f8012080f00400003448150ac0a404000b7e4002e388140e809c7404c32000eaa204a2a81411d03da05176adcea1060c23d187dc6041f5dbee86007e1811e409430800200481202309011048084260401201f0980f008074040380201a0100c8080007a880b0e80540400268a6845443d1072818112de1c0a0b1109ced0114000008d1084021026018c5c6016ca310b0a41e05ae4c5aca90c816b23aec81287a11bf154bcc658015a953934503b3adb1c106f4879438b882b038d7fa2221618c19610c10200801c49309477008993bf594ec6b4bad5c28dc293ee86b1832c0e6147590242b8ff5821e4e491de0da65289bbc4c2d29cda722fba2cd2986c97f68aba3e4d7ecf32040052ed342f902c2041121043ac4157ee643a38d8f9414e93cf5405e425843b275c725d850801f4507c09a3e42270764be2e428201cf2d3a91e01cf811aa6f0200180059dfa17d03fdba861650030f6288027519361fd9fd496709572c2fa1ae96a98faa5f3468c4c48d223801b0100d008064040007ba4060b402e4a0161d00a80800205c80047d9014050010671005f8f200fa60708a1c4b3c20305406e10258284007270ddc2802f4e6ee9e2000016e35f41800fdebf9aaa0085890900118433445e9c6f182fa1b5bd4411c1063f9438bb1411613fbd04f101001c9c3770080001c9c37a0500528c485002800016d20265301201e1b22884ae46184067c6ff30c708002dc6be818272104106d4508002dc6c000000c0d7dd10941566202600861a3b255a2a4618404fe6fbfaf0708001c9c371018246597edc7d0508001c9c38001c0006b4abbe386002e807c467f5055a3901500a00006b48089080407401e0a000363201c5a00d2d0060e802c64014220091100406801c3400c02005010003a99004390018c80086400202000010062719)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 31 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case3" = "QuadHeightCover18Case3" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 31 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case3 private def zz2388:"s0954"="s0954":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case4 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l14 l15 l17 l20 l21 l22 l25 l27 l29 l30 l33 l34 l35 l36 l37 l4 l42 l43 l51 l6 l60 l61 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3b91092db, -0x540e2caa0, -0x7e20b4c3a,0xb13f5250], ![-0x540e2caa0, -0x9fad486f2,0x142e6c2d0,0x3e6a95b02], ![-0x7e20b4c3a,0x142e6c2d0, -0x20efaed99e,0x543bf358c], ![0xb13f5250,0x3e6a95b02,0x543bf358c, -0x2a1288050]] noncomputable def hinges:Hinges:=[(-0x152463f0,l6),(0x2a63d4e8c,l4),(-0x1c3ca3b7,l9),(-0xec537127,l8),(0x916319a,l10),(0x3c94bcadc,l14),(-0xa61c4490,l17),(0x86d0bd98a,l15),(0x20d54b712,l21),(-0x78b2dd318,l20),(0xffe804d9,l22),(-0x2a1288050,l27),(0x2a1288050,l29),(-0x3145bbe8c,l25),(0x11a0f304c,l30),(0x2a1288050,l33),(-0x2a1288050,l35),(0xfd58bd4c,l36),(0x2a1288050,l37),(-0x35eada578,l34),(-0x2dbff60,l43),(-0x3ca47a6a1,l42),(0x2a1288050,l51),(0x32f54a3c,l61),(0x10becf90,l60),(-0xfb65b4be,l63),(0xcfa23cb4,l62),(-0x1ccd2250,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2a1288050,l27),(0x2a1288050,l29),(0x2a1288050,l33),(-0x2a1288050,l35),(0x2a1288050,l37),(0x2a1288050,l51),(-0x78b2dd318,l20),(0x3c94bcadc,l14),(0x20d54b712,l21),(-0x3145bbe8c,l25),(-0x3ca47a6a1,l42),(0x86d0bd98a,l15),(-0xfb65b4be,l63),(0x11a0f304c,l30),(-0x35eada578,l34),(0xcfa23cb4,l62),(0x2a63d4e8c,l4),(-0xa61c4490,l17),(0xffe804d9,l22),(0xfd58bd4c,l36),(-0xec537127,l8),(0x32f54a3c,l61),(-0x1c3ca3b7,l9),(-0x1ccd2250,l64),(-0x152463f0,l6),(0x10becf90,l60),(0x916319a,l10),(-0x2dbff60,l43)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0xa8190020000000000440d200800000000016812401000000001e05014c0200000000003a0490040001885310807a40100000000005a0144018000000000160148020000e81a04203c200800000000001406200800000004414018601800000000d0903cc020000000290480e18060000000420901c300c0000000ac1204660180000000170501cc0200000000005c02900400000000b4240b3008000038904420548018000001c813029cc040000000001c2819802000070464c07a430180e08c983200f4880300000001c8c40d8c030000000290901b98060000000520b01c300c00000000001206400800000001d0d02cc0200000000002a06900400000000000703200400001d8c45203c80180000001f888070c030000072341301620060000000074480e30080000000007a01440180000000001e01480200000000005204900400000ac421901e400c00000000004812401000000000a05014c0200008614022029a00800000002a09022300c0000000541802660180000000000140c8010000001582e04318080000002504408630100000000641204860180000001984c0bcc030000ac1202c04ea0080000000461500a300c0002684609006480200000000130a014c02000000000026029004050829010800cd40180000000098480c60101440a1044006350060000a813828036a0080001702807005d40100000000004c01240180000000000e01480200000000221603180400000000442406300800000000038012401800000000012014802,0x221e02980400000000003c05200800000009412016601800000138110058c04000004a1304805a0060000000001e009200c0000000000360640080000000000640c80100000000423a0518040000006a04401430100000000d01201460180000000190901cc0200000340208013180a0000000640900c300c0000000d02201c60180000000250e034c020000000492081b1806000000000a890330040000000000160640080000001c8d4088c03000000388ca043180800000000000d0320040000000000c8124010000000003a4c0cc010000000000720590040000000000940620080000001441206460180006314c4602210040000c22889404420080000000000280720080000000c45206c6018000014219c02c0c050000000311681918060000000064580930080000000000a8124010000711842600e5004000000005c320718040000000064540f30080000000000480c4010000000208e40d8c0300000000744a0718040000000000e8052008000000010890166010000002d2a160250020000000310480e180600000005221036300c00000a30cc06b260280000000000d03480200000036140e052004000000005c180e300800000000002812401000000000000c0c8010000000000078190020000000000180d2008000000621280d8602001412020880abd005000000002e0a0698040e24a24918096340180000000001a81c401000000002a15014c0200000000006e0310040c24824718096340180000000001500a401000000022864048c03,0x1f00a40100000000003d024802071268c5920535a00da30b36089036f1401c00000000003a064008000000248240c8c03079270c6120535a00c000000000108052008000000000208124010000033118480c900300000000000a069004000000000084062008000408e23181968020000000208e4058c0300000000000981900200408628a2017040140000000001300a401000000000009034802040431a2840468200c0002045108c0bb4010000000000088124010000001442102e0c04], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((0xd343af6c6705080d69e1f728212a4535812087ccd70eca0210e0ab9e1800a398a19098208402012a0b09405c0100401012603c10d2c4e423c3d99643b0f079fa66980400be674ec901078021042245497a1913c0d7ae727101185141d1702082c74eab85200005b8d7e9000439a56ba84000d1f59f98b821200200005cc80012c980000802024807820b23ccac787120de481e0ecd26e2c300072df4e020055d4e9f2800f004208496bee0132022a196cca220181af5ce4e1c10001e84648e101a202f8e84107ac3e256a40000b71afd200086f7a4ac6000900100003424000abc848848000c588002ee108b0d83c02c24007c74e86ee938b1422b0dd525861ce8757f2c21544558d960433aa4efc4000a4d72364c084201008e0582602c234170000100478a0be34f4f9c28a2a09fea105a73128d826080015ccfa9000f19d31d4a0044010000107211e0b80c0b407454f181a7f966a2259556f2e0800d203ac12000f8042494188f2e8a4512e3ebe0e438e03cb037f1018005b8d2d9230b08837f54840aef23ce8186faba995b540000b71afd2400ecdbd912c80118020000720c8e8151eeca03561dfb7d111327bf34982ffb724908053359e1ca003a010a1d5ea800000008af4f949a5ece281d11c73830c34c1441041500480c0000803400040880010610004d8352b5add59f56b1701c95f7a15d7a7fc95a95ad6eacfab58b7eadacc4a59212a4b88438c41ea8a99226a48efbc405520d552d1b2bbb04f92048fdb460fc8ea1c2b3dd3d50cde562e0a000000000000000000461ee0eb8134b02d0b33a8c16444e0e8c0ee6f12b182641e53843810412c0c83a3a14efd2cd8ffda9a58ee8f4c4d6604ac48f783a8300b39d2c00514f818debbf4b612753a65773fb5f51e23e3d6b628797c363fdde323369c5c1865bbb5de062f72a3af595139bf17f26c5de41138ae915d0e6700188a5a9b2614057c58a84782e2218fc43dc490c0333ef28187c780425e08002f14646c80042010924b6bfdde6914480ccde232420c9002ba72431c61c34cc1873404b6424104079606fe2800016e35fa4800f3cd2e52880005b8d2db200460080001c831451b994f5508087bef1eecc6080a2e6180c20a538fd166910450b9b0b41300041f60631200003d08c910000ea844f68005161422a0109002000039040012708005a710011b536282abddfb161ab5105cc1a0f7b325fc820e21ab8a51607e78318b04a104001008e0984682e00002008d1c4557949618728e711be041a8a108aa24007ae69a264002100800006a908c05e1094a8f1de08222734ed0030074b81506c0034c4849b324810460100000df20981200023620006f840bc6407a1a00170120b21bb240044a9e222430028b0557450c18665793020104139f33e8104aa11a50023002df027b3b810052d4b28a800085a2163760026f07b869000d0404c018a1d5ea800000008af4f949a5ece281d13420c2082181041340080b15a5899f808771024022e105fc36a87342848eedd3420806a6d16c000474d8ff990241022008000070102f150458880f4340004c64228240008f6783364cd5881351dcf5a97ba3f88b9578d28460a16045d10d9c80be17bd3d57d8a0a6d7a6118f0d9848032ee769accd91b4f7bb87d89e285cc0238c2a10015e8a7479cfc2425ea4f3231f3a5b428e7f8863803da4b35dad42888987ef017a3ffa669bd6351a893da89d314aeac5dbd33da8879d2c7bcf8461703de01c12c868763b4b368fb3315424d058bdfd1b996380366be67f6f07f045aa0be12924b0ec0224141100a000526205e2ba2ae9f7ceacf348e0fd9eefaa50c08d74d830dde67626bddda281dab9c813df01fb9be4203b8c0848867143f5785d39357a5810586bebe8bde6235dbeb2c5e6001b604d09385c767f34ca864003d83ef200a45f684143cc0001e96ef6d226219de83a28804dc65364f992c38b21b8a074e8396bcd13d6581ec746de67208f65d23b4a9331f0097980ee7b47122e32c9a5e680a8a378db2d4750abe3e85e8f5502a15a92c007468ebf8fe0a4070ad42ede5d07027f95cb12465e2856ebbca6545b0af6ba95d71afbacf8bc9a667e6807e5e6360ed12206db05003b5bedff1806eb74c45a152c8c7b44a) <<< 16000) + 0x66f8fb3decbb9bf8ecbf57fc00977515ecdba0e2697e8337eb6bbc161265479cb9aee5c005011f935e7a719180855b9eaa591d37b5acdf58f0619bb3e0ccc3b11a184aee24bfb760243db9016464b0ddc4b45032a92b1e00247f9ccedecfc8538e8a1333c3361d4d53e29194cbfa9a364874eb3b14924cb9fee537bf0657f2986bb3ed64254fe6a78a5568134660da6d248ab31c30d81169e4a86a2dc15133b90a15824575056d19ff93add1a1467ed412ec3f5431c10d887a7a88c7669780001396421074106320871104306821414001b86685518d48841be559c98b160ec0a1663070c59d1d59250a318b8f4c1adc61bf7a1810fe5b04a8d25a5ea4c3e380a818c884013b8ec4ab79dfb4ad16cc71f3981540c0a51af9fd30f82e84c11e47ff9dfbb1432e8ab1d02b3733eb646912ff3ac0941487a4d532b413f8c264c0f9324218240c6eb19246b909cb51da5a09667e4d8901653f84ec33be8bc56514e1d85600008fa71bb7c0369c536538581815961b948e52e33eac155087ccf67069c40000000000000000001253864f9f720cf3a3a288123f6d183f23a870d4776414cf51b5e9dc00000000000000000047c2703e41366415b621a5445b7c174a11c892fa0f1d6bb00fc6000000000000000000000000000000000000000000000000001908688ed6cf440b21d4285a363598e8de71b0554c1c91c70c60d0e39dd570e71b06f03160ce3b05333e8af6b2de956801a3928c2a745be8e448991bfde194dc0658e1af9842ba80c3fb2238ce8c579890844771d368e452a72604acba23db40192fee69a7dcd6945774cb2267b5e4fb8d764f1f248be701d9818bb7669583bcc21e892eff06b17bb6cdd71081d48a5a6b8b3f80751894a842dc8c3c5424f7eb8684443025a95ad6eacfab58b80e4afbd0aebd3fe4ad4ad6b7567d5ac5bf56d66252c909525c421a41aaa5a36577609f24091fb68c1f91d438567ba7aa19bcac5c140000000000000000008da80b53c400039e4d1d20ebb5d746e7482e236ef6bb22a08f4dc00000000000000000022c5d319314fb278d56f87c82a860e3864003802808212374fea63eb9e2d0094b578bea4af115dbcbe1b7747875933cf989cf0e10ea2425d81452f040b231d658345c0bd61e715770c8637fc8093c3e2bdcc7a4b3ade1a18c4dc6cfb253462451d94315714eb289d68d397b84a31d530ea5f87fe783effdb8bcfa93e86c36ba0bd191f552ea8551796ea43b4dd50007b821084302f0dd4ad6b7567d5ac5c07257de8575e9ff256a56b5bab3ead62dfab6b31296484a92e210e3107aa2a6489a923bef101523071c31832810413000c00009c64421261615a41a77239fc948a90b8c1235b1ae5ac68031027c7883bed7e8f7511b99193fff77cf5901efc1866e4ae0c1c8344b5b83842c2e0448e188ae4091e8c1818635c1b940e6332c813820aeeb490db1600110ae5728e002fdad6918a004983806f80025040480100001b1210632082110002bc1a1652be290582cb81bf28ba640a838583571c8e16dc348322f9799c34cb18715148b2c8d54b95e4cff2d26fd13f391cdd8bd93252edb63cfbea0b0c1d0600a474cbf0240d0a2dc194bd7d47415243659956cde3097ac53c8a48e788302905300e54c3c7c99a38a6b7e4555232d12d0a12367c69bef6809b1d359400ff47b2e7951fa3dc952dc5c54265d5f349efcaec9b277a3fdaeb358420381415244471bdd31581c56014fd7e660d261366835b9c8702c681a1fe907206eac1a3aca3f77f60dd76f7ad03b84dc8e6d455d691ad65ca4fa676330814b52e20fc34760c2c8c49eed23530b67b0ef3aef2eb9e2187418e0001e188128a820434003cca603685e2fc511d776722b890c1b5e955b25aa657940082050c1389af7e0b491c0972ac18410e540d3fc7f9336f54a08015a3b31cff44263a07f802064130dd99548c2ee455e940721f72b970de4d53e59002220eae19a37f3ed1ec17bb8922d747e7460638510c002600c200040006ca40d917c24ecc2eebef5c255e12091f486c5d6b7e08bbc00277c0a177fd6eb3a292872c9df77260a4283c67a319abcb42584082da0e17bd259c0a8fe6a604b860a6e6fe6341e51fc81801143c7d9a29c23ef2bf300dc88b2a84ea78e13e7c245442abe7a683f1894a5000cda1057e538fb05aac2b25090382ccfa2499e92b0b746fc7f382e81e23ce7dd8c46b93965d294d599db2c5ac01846b73d1c549807fd334fe48840daf043298fcf136781c3f00832faf323bbb538627a072df658f69b6f6b65af29cf4456bfebd435fd7ffd414d460cf63e7b293c294aa40ddc4687c0d58224569180001c4ce0446637e08c02030d2cc0590618014c56ba5600a0745fb0e16d8555067e7ae0eac25076346ac9400aba8bdc120639a24fe45808a78c03b44f8898520300001eb20fe9a07e3903e86c1f0360f60a07a0140d32a5be94e2305a4231334922842d0325acf44000215cfbd9438175ed7c99282802bf9f868f6aa874f446bb2c820072eea43fc46b324a6b137d8f0a005101f9c01e7f9c902fff78cc22f1048271669671451228a68450440060100401b13c4b6174defe289c16332d40dd83cc3a72a775ccf1c58c58f4fad044d24002b73878084920633dc9f362303141072ecc0e841089cd23a5364f02ad3cb1304fd6cc8016814227a61dc366289c3a86bf491e58b36fc78e7171c3f58d484127eb022d058127b8e1260c011533af313801100400005908001d5181c25b0ba6f7f140d0b1996a06ec1c59d3953bae678d2862c7a7d6)) <<< 16000) + 0x8226100015b9c3c042080319ee4f9b11610a0839766074104570a21df36a701569e589827eb66400b40a10396334c65534ac9737aec4d05e54b1f1a201034ca648c1044b35e1b8300054d57ca8a02739fab909c00880200002c841e40400077e41e0060a00389e6e75c73b60a8f30c66f923dc451c5920e8c7327fd2c9000dadda10c04100394da95cb2090c7948dda5c7b081028a0ae00baa301104dfe3709ba78191bebe3d360b962400bc0c113c93b4f41422707fa458103cb1031035087167c28bd5f4e0e0ed64366121810f7990b2c046973d0123002b509171a800230080000cd1e2ff4a4c90de4f2800cdfdc4c0e2aad0ed2aa3cd2863b39e4d0020958ae1e2cb09041cc58fffd0304028f19bd10800aa5195f6b0200055ed0b21092410a00600003f678b6754f6c0324f2834a894a1c638a9245a9bcadcd287a149ef0ec18648d67d30198808112e9f41ce4010cfff20f3f8104a2333e52362c0311831edc18ed20854038e2f8c0e47a189e50019bfb89838ac5695505a669431d9cf26805143d98d747c06183a135e18a0411e7a5d67d840040f6fd29700015b7d2f68812904270140000f8900041a205e1203d09000534907711d91aa42a7c4e4163ea7ada1f78850e294c96df9b8e2806a884cd6c50457aea548b40611ecae24dc20480024bb25bd88a0085aa7c2ee8283876e936d109210385404000020f38542c7338fc048a1cdc579bc423a58c3318403ad902861bfdf278f549209657e6471ed0404496c12a8b186001971d710fc01401bfb32f344000147488852090424c8202d0280001171b2457f8e921a450a11bc37948324582b12d6fc68a18958d6d73808089593fafdb040243477f1e802c02ee51e4a590c00a63b65407550417b8cc6df996d048520300002083027886cd0b04983884f1c4d9a0138a18a9a54516b0820410446fc492e8e095b3125a73d850081e55124ce00c00d76fa283e06a811066641ad108126dce0f02d49320e505c06000023120b25b0360581a82e472bed97c5b480e2164c02412ca480c1c5ecb24e303870d04315063b1830b0b10c1f00020835eff36b0309000950188ee400a02261f3871c8407eec8e7bedd004d4e705a05000022e2003d9078a1657ecd7dc3881bb1e4dc80284421d14a51030200393844e02837f2070e0e43012c84116d0c2800039383f400aa811d3bef28ec00b4740280140000eb90763983a9ac0d8c60e85b0732d83916c164960e243c202ccecb958acfbb12e788aa1f68510af35ecc2f8163c0f4588546448206367ac48c0ef3a943c495b79aad200243ebb2d4f405e37e8375b40040e058ecba474ed14541dfc7b0cc8b4501009bcb23167a772c2e2d34fc748aa0f666b8ccda498cb9b461bc371804420d39800da064249864cae25ee4080184ac752e30e8d4be40771b796ea05781833b5442c30acb8d22389032e7b799fc1954347eb1c3701b52cda712a55ae39ea03dbcf6c62bfa04fbe1ee9f6631160461e27a2acb2664ca48145c4f07019357eb86e7cf32587c823966c1fc6033a796b88239fa42d6c47ca5931c010aa6aaf0abd1e452348d04f7d12a3cda02eff242acd9b53f5cb5c2367255082807c532a2930ac2be3af6da90e436819e240f0ddfac5eeb4289f6aaaa7e74367a5038159c6685e0442a6f729b0206c29efd6cb3c6d9204f80f2ef5b61ca44477c85b17b1c01a7bc7a9e49650d29a57394df17ad4725afc27d5085fbd7f664b5488a930060d35ac082212e8610cc10a129f4b45d01259f913b53ab70f02483a8bed71e182f0f1837714d45e4e8f2a8647af57eb351dc2f8d83b57ce692775ddcba490920be94096f402e8ae1cb14a3ec43e913233a2978be5990bfc894928a52f7d1635be4eece9af9b1073b4ae01c0260de0305001c020040100dc138060080200000888178880f43400013c740c0cf3ed0c9733ee2d3fe1712e860a879006f693d518c7f3708c901a21aa41156600f49b9060022c38df533b8f4c97b8b3459b161713fed328679ffb71727ddc6f8c17ae4f53608df635c14025387719cd4f81b0b6096151c117813eeb9f5c0d4b8a09ec7c120dbf6fac79a34ae6536c905ef7921e5e78e57384c590c429080aa3a8df8cc85e436e2e493387d565295bbb136febc62f3583bb6cef54d2fa1dbdffcf639d79511131a2068f8e13367b567a38d58d5f1cbc722d204b31d9ab0aac28a8234cce83c2fd98a17aad4cbdc21dee3b76b227c320c6328fe863a448180006fe3729cab493ec058a67b926efbc6dfe2cccf82a461249060e38a486600280a8262f119d16932ecac148f4af703408a13030370291d0039033091400072c8369281b0760d62306a1183484ec4fd49408d91f8bc36a4def6b7ce96ba1a68250b13f5250000b71a5b2a0ccf31decb47226560956fc2559eb7873a81b27f8153250d72214302d0924e0c90c30480148684ee212e75e9db0b11ec7be5dc7f3aaaff37e413aa87ffcaa7c0f80a8ada68e0c92727b0e47a164a5b567433ca298ce144fc7d8a39b85fd0681183384c19827008d4ce4044a0355a2d5a84000f79c784080221ed3a8000120e10804284d70e4a90483778ec18d0022181f00803280800026083210818c4400038041885704325ec1663d065b436d7268208da7dc054685bfcbb706f34147a2ee96fb86270eb1d41a008305d365ff9b46d99ff504b379c748d8481c5e533baad74cfa0c41a9cbb760c5de08919cc237093b3babed4c04ee927a3292104745e6c4b2eceba94ea663556fb853af411839d01c10768070d25fcfff862)) <<< 16000) + 0x87727413cf16bf0095ff36c0e5ebb59c85104320061050300280011fcc90617ed41befa29668f2e8c6f9dfca3541eea648555443433a3ecb3a381bef13c69b9f1eca4106012b95066218dde0764aaf59b96e097f56c5e02808db7b0d70328d7e11dd3f5bc953d4fe1b1a8180f2c077d254ecb27d72d8568f58d406f43d54a8249170f97e643bd8b9d4c2a75cfcbdeec3e903f9b5f5fbbbc3b980a1231aa03c38c56d728420446f2c7eb1f34080a5ee3689b2914e0cb0714a62d82dab24967d8d5df6bdc5d629a480e0000159480080f905f3582f0ec17427627ea4a046c8fc5e1ab98f9ca7e020de9cc412a07bd431503dea189af20436aebc810dac0444486404184382182500400801a808eb5f63f82a537f5e5b308d42649f856c68aa90111d7cd7972e1f5708633defb0b80c5b90dca29087b21b67b3dca060cda869fb840495a9d5520c209caf99b860d4cd85040100601868bea000131410804000050c82e0af0924bf3e56aaa2c695dccb20441899e46df7723617bf8a330c922940c4a90c50206150ee77c1b64cd06e070eaa768d89fce55a325408bd9b2123694c88376c6708005c3f2724441587b0042f1e91a6cc6025cafe6d48d5560da17ce3d2bae58c78300a920bdccbdbae962e31a158f164389b932de3a780f338c9671b0b9b8be0aa94068c6bbd965871a086f95f8e110a58403c44dcc8e857d50df98e35ff1549718001632640102d04eafd51c4eeb56fdef830d2a6c3f978cfb36a32fe1520cafb22f92563483a767cd8ecab4e8c0efb4e469b3216c27246722b4c9148859f06b80520900038f905b2d8178ae07086a18825e491f0c2374795eb2408122cbbfca23e6898b8bddf437f5710005718d2c083b2d5a9fc93c253d308006814ca1ccfde7faa192d35f6b70400383f6cbcc8944bc3d76b2a4090000ba36856f3827ae18e1515b5f23a5000110010b10130b020c0d14267318a9ead16f8553df77278a931c360920168140007aa4130060a402000fd520b29b0360581a82e812b575f7d659bceeb07694ac56289b7949b789093198961dcd0402e1846844042fe8d90ede590ca15a06b3ff351251049e233ce76e0564c16e2f3e2cd02080b5b7ef7bb420b4618ff37a88241b1010b0713280c368d67b5591633cac0d5503caac10203eea78d98df3a8d7aacbe52c195747e68480b42f91dd96e0ea0520040092b469e67d589c52d87439f337899de857ce58d575418282dc920110381a060b17a1c49f4b0e1553950592cc0b845f684765dc92a8780db9ad681d44a492a2260ef5fb946ca228c802231ed88973c607e803a18eaa1ea69d80e15bdfab754851931761a524e03950a42beb798a77d8fee070f1aa7719a30c7cf4ff1cfe191382d033ae276d0b9a2a5e62a52b9fa2870d2717f1fe68ed193c38b146241561e3c37e4893e2b03f5344837bf3900230e50baefa0fd3bf32a57bd3728a66895fc9e5922cef14b272f1c6bf28d3f73278adb077afc21d01195763a5a3998946aff2f6007b58aa12a9d283234206c3de45660e7d358d0f21a3ce5d810830cf1c0fceb74089c236f18b16853aeed0bc921b2d404f01df9d0001291a8c78e3de31ddcb7c952b926198a1f29b1184feca6a5a6afd3ce6526af2bbb5f25fa0a5a76ba961d460238e05202f9e8a3b543cac696a69c53e5f93c878aaaf497966d3eea5d0bb1c0598b5953f037b9a160e68799780e95fdc4bbbf436c15f089918cd2f430deb549d37e59aba84b34db8e47c757e7e90f04f3f7f32d3a21e47afac8aec60fa8adcd09abda17cb36848fd7caecfcd736a0fc37c435e98ab1facbdd9028414239db0e45fc696c8ae3f822bac223785bd75095911b2e43dccc2a37c275723946045b07ab554c66d0e4574b83b0108edcaa012bad0051e94f2d2334f3c20552a22421695c6157470db92c1b73d3d02f7eca81ec8b8ceb772ec78f31161f8b27998cbbc2711804585efc454cef7bc31fc5e5bf150ca9e03b5604731019c915e39478e39b6007f2115ac7d4f5584bb6281516a444943a31f8d69c9cf2e97828012fea91d9a17ade98f109cf8950719ce41d5afa94fd9ed75a5ca40ee9bb58165f83aec60dd38f48810a9f91f06f6da68ceb35ea66530b8afe797457b704f0cb9073e9eba27cbc8fd8f725d4ba4500e4abbad32a46916f53980160240013aa415cb60ac2bd2bb79229cf4b26e1563e6e7dc7878a9f4e090ab71d7d65c601ea3abbb2efc806908b38f3909088ccd9eb49bef7e990d2b75dac78b5c6f21439815770adae062638ac81e0137ef7602150eee483a939531409006049559b70fbfefbf32f49d040d417381ad8270d3f6ad8d2abdb59e45400da7aaa6d52546ced05677844b73ca5c9be29bb8f7bbe065982b1f7fea56a3ce524421e11bdd435cc88e419dd625625a47a2d75f730dbb225915847bc52f33e016266201ad9bfa1edd9fc1558e608fe058206d959416dbdd06c84b2bbcfc367d39aee60527912a39cbc4d08d6cd9500aa0205401000394905341c1e9ae500002dc696c8888251dfa2cd51087825538babeefea8c0f34b8c95bf8563ecd95608990e724d8c740e1dcaaef4064695e238520bc7cc37df977a11b528000000000000000000473250d72214302d0a24914d007006005438d2840e189a834dbf496e7832f8a7ce08e210daaedbb0c8700dfbe74497416f52b58a370c4bdee219e01110991702abde3651fb5fd952cc8f6638db1290efbdc5e6de602fa981744c05daf097e6c5180ac545484b28002c01c873926c63a070ee5577a03234af11c2905e3e)) <<< 16000) + 0x61befcbbd08da94000000000000000000238a4eef31ea4403bab4e7f608027d7e26cfc59922c415a93800000000000000007ed3e45daabc00357c5ee8e0a99641241020e02288185597cad5e5f61002f80ca1239f4141b1104eccc1002f1ebe2c7ad022b0bc13dd70b3ee605d28d7c40223a2a6ba18528d74f3842f13399a34a1df190ed3aa550ffa517a13ec371285b9f0384d56a468e8eb22a411f3493a058db5be1d596edb0a776a48d62d9d443bb01e4fd184958f758e734aef13c7d1e65d73211117ea70f8052d3fd4ffd3d0d74e805912152c9e8fe3723cf0cc1d7cd4c458b8024dd148db9d94494849e8004009b202da87768dd099e12dd9b274c9121a8a3612a5a7fd50439961205ec8d8081c73d0d57b0bda0f23d5d3c8fb7db35279244555dddf55dbf0b5ab35ba0030f326ecf260d1192d4fe7646042654cbe0ec2010ee29d056c244fe825d0015038cfa6df684272d54f99edf558f77a98ecfe4bc8fc670a3ac586099f4900248292cd1d11e02f988c290d88a47cf8d80dcde8a450eed437603ee2d911095ade6c892a8798fe756137b4e96aada396233fc2e114494254e07cfd20aaccb9e76fc77f96dab3ef4a33cf3d2d40c1e1b58c7fd452c034ce83200003509052090017159003602200d6367f1df249c685f10fb618f892ddfe0a96b6a56c7425fd15fd2f500000000000000000000000000000000000000000000000000000ce22862063803002800a0ab67f400986a6ff57c61499e3e5ba58e66c5072f5708345c4bc19de27e2244c94d1c08499204880f7359f3c1255b393fc3d49fefe0431d51aeec23a3af2221c852dcd54264aa8470d8924aefe7f4ab2bb6a3737a5566439510ff7241b780166503e94ce6dcab5b6693328a5ac06f35932cac6fae06c4f76f4c560f134a8002ed90075b820132846c4fd4940fc4169873540e2ca9fc7db0c9bd82520f4d72808d91f8bc368c62a27fae1e6d20a09103dea18a81ef50c4d79021b575e4086d602231830c21c01400c05159702c9dcb960f428515b2610a88c52e2df2c6aed0d2b7435e92dcc86c8014ca71de1bd3ed9456e0896910a0d144ac161b05fa617e2b804dcdd8edcef88d9eb3e1c50254dffbdaaa158f18988606ca692da66faeb1cbb2987619b607bd431503dea189af20436aebc810dac044dfad89856fd6c4c2678ccf47bad4cdbae81110e30e20818e08608a00000004a2040baf4fc7b607b401455436425005dbb525e0ba011a93622373ff52fc4237f3f19dba6e493a41db141475e7922051bd68e1945121542891c183189b9ecf430f6982cfe450094608802007c03b14c9ad0f651028e3e458b01442a03bd764306029b9550c30d132babcd0811da7a80560c03cd7f56b81011017b3621000a0708c02000034e4144040005fe4050a407422000612321aee5a64fc184cde009120c09dc2c6ddc381403479c50a03d38a587e180229acc3482059c471bbc80293901100437eb62615bf5b13099e333d1eeb5336eba0452b4d1965d1689445b22cd15042e226f65bdc123b909affec9017729cab493ec05ea02d4f10000e79347483aed75d1b9d20b88dbbdaec8a823d3700000000000000000008aa508206384183a8b9afd2675b1e25c73fa9c0bb2e06a11f504c69340001a79bb0fd46c6d28a66f23e30fe82de593c3c1bb6cdf60f0d18167d3e01e3ae8cd4c93c392ad376b93c041c323928f6cd7611d71b4dac98f206a325541400742489183d044880a6caccc881b0d33a8a650410ffaa4f060c8e48ac702801fc2028382005f1626a4813881100400005ac80a0a813c440741200075a209c4204a1501c8280e0140012784134e60981b9143017cd219218bf46aa0e1830525d6476381009bb0fa0500cd98adeb8a02892961180424200351bb2c0f0a1dd3e70d62b405e0452fcf3ed839b4291eb9137703c860871f17f5939b99adc3123b987f898d19eb47af91c57f09fdb125bb2922012db103e43d94ce96243b2bbe3ef09534a20906be0efaec216f87325e81068beda907a81ff483d0fc24d71d781c5bae7ae9e302d63b88b7d7e94904023904e3de6ead680aa100b8f8ed964dd04e87f20d1c7a4bf06878e708500e3f60b09921d7e2f45d6eea0185ca299500130636b4b16766d9dcaa033c1f902956f80110b5c2d26652b550e0d8dfe671a0eb61d80a01cb601252021bf65546b3bb6923824b730ca0b6f2f585f123192ee54a388c000742200077220966304a1d82484f064ec8a9df2171361a23e30d023e20d4030511f6bdb37610478faa2c765eb75d700e074edf51f584dc4d74c76434c5c2ad601408aeffd1d67049239fd12143f5fc38801803a943cf97965f1bb64171e4d66599401445fef982b25ca1aff9de74a29e95c54c28403c40aff76efb667496c8e76460766f3e62776bbf8f8352e464814c1ec5a1867201cf2a082fafc0424041227e5cee2c04289dd0808008a60ce9049440800210413791d4f8c043d3f35b106087e1094b3041a5ffa40700920811804000038ce1afb0d84584158507f3e2c04f638b6c4c107c011004010040000111048050238281101400023c749002e3633306180269fb20038400337f8648d104d97fce843830880bd1da8604951bc64d204193b2543bccd00626c56f54000112a880226040980410185814f86f28104edd1fd440204151f11060436dd1acc820d7634042608002fa776300930811804000050cf9e142fc57b11c508a65f4d0838e02aea5400122000e4e1714388529d52405041444ea5bd5a70054845453a180001c9c380)) <<< 16000) + 0x054021300838a03ea97891e2c9ef3ed2cf044efe4a5a7021bebd56e040055871481282108040000410c0e00de748f2034d9b74a616101726045c107b69bbfe0480842010046010000761045090220280010148003af902f1181e86f8efa572d4ad97069271596cf0000061814f46b0400014080692f8591df1812f1e02f4c6d268170d2f76b0c8cb00037e11d60000600342e99dd49727104021781e38e646a2a9e34912c2ae7d384d604d0cc382610451dc342126dd5dc38126e96fb208009c06c3a2704200080000ab904301fe3be4938d0be21f6c31f125bbfc152d6d4ad8e84bfa2bfa5ea000000000000000000000000000000000000000000000000000019c730ed9cb795b6beaf13db00db4def0f2399076ad4800000000000000000000000000000000000000000054238a1c73412c13803001002e080200de2839d751fcf17b60bd918f0d51008a40e0c5eced15830026101d349410800200001fe6bc57a8fb45dafcdec3a6a1fadcbd64136400c5a66bae4d7b5580000000000000000000000000000000000000000000000000000cee422655ede31992fc3b711027eee574705d304e2122540f18b0000000000000000000000000000000000000000000000000003291e69e59c50e39c0180080170401006f14061be67e3c58476720b9c218d1d6f68a1023430abe7865ccdd3f00c00545fb5b13021080400004c480028590009bb3840251ed137fff31ebdd6cb9dce8cb0477d9e27e430605845232263e1383223802f077c08d38e3d2a3e583a9efcc488ce2865e750bda66edefcdf17975ad8900012ab3a488fdc9d0959142cc4ee321fa1fae7c0093d01318e51dea5e1cc1afaede83f1ed92c6da313aef1da112e503cb15e88bba165af2064d8f60108240007d84104440801203f0101f008004700d0c756961f3ab960f25d8f2c6ede45e3c045490ca203bc5699c21418f044be9e8e09efd342a8f35acd082c4623f485e7468133a4c2044174ef96615f83677ededc269c14d67a80e2444579aab66de140272cc9e2e29c2e5159667482c76012071914bcae72601bbb24123769617b966fe09870047e051bb76994576dcd278b098a020ea91162598174eeeb3dc07355f680e53049d87a45904318a6007a1381418614c580ee6913480947955b71588fcd12bf0f285a72c46c400472d345642862c5fb7c1980085b816252f9db9db6aa4384175f0d8fd9fdddfd174c6da31b141d5479995543f979a02698c99de53afeb7556c2c83dc987af74955f81d190c140691197f7827d7b42ce168431de330a868fb4c3d0fd1ad9837fe14bebac1da40e3d5625a2914145227c6de5da086ed46a88abffb66af58978a9166e7ff544052bdc52b6c138dd81cd656f7ac90ba8eeb8247ef7886c4c527f16c829ea6b00005f820443201c1501e0880ec340016ac40e83400508040e4240700a002cae2006b6e40d8960440a00401772135ffd9202df8ef924e342f887db0c7c496eff054b5b52b63a12fe8afe97a800000000000000000000000000000000000000000000000000006796177cb719702cc70c3085003000726900eb9542c050a15f19f807516411d0c609f1089b006c0ba998502ff2b3a3e1169001441199c43386ede143ada9cb2ef7eb09ff41ad04c12a49e0ddd8dca8330efe650445012cfac765813a6367094a377160d0dfad05d0cedf73c10756b6d1a6df1a49cbf191dd06a906351d9f5eac149973c82373f9d6adf74805c40fcd0a3ea0ac53fdaf11e441123d281b80c0d80606a03e2897b91142484847f931512024c038d96381246062690802a3e17ad2a00221298110042831acbdccb9de363799b1993002a8bbdcd524102d04ff5f9bd6a27e200c0dda2294de770824d9db13188e2217863cf7c24447867379b24808700700fc85ac7c32cb638f21f0d4dc5b8e01aa712351bcae23e89f24530802004068ffdfdd67b5638cabe90ef76d48789d63b808ba11a2aba6524458018496e023700cb5cca95fe7528a5378f2812b5ae16a136add4bdaa5c704380cf276c0be0b74d517d7599edd153625ebbc03d2121d3f17aa3ad86ec68e11fdb47c61633bbe3e08d6baa77203858d500651ba5e8a0e7cff923d36ad791f34dc06587400ca9e1c3cd39b2267e68aa324ff828b7ec1ca9530fffd4a0c94d2f32645741b39128840677ee3db58559190a2f8ccaaf7d53ee3ed3b4271bbeaa80ab10f7072878e6d54a02688fbe9ba1c862e81c8c86941890e20413acef2fc31fb8a4bd41e502a0b2057997f4bedc9f8d8f86b7d0f360faf3f34ac750df6b45541fe6dcbef76a87be9aa83a803a41a599f1c63400885a150b281af2f70dbdddd698f5bcd1d4a77cd8991966088b5134b90503df8fe5862a0afdcc353560c3b5500ab1cc8f896bcc90a03290e2f7475ec26d44de9d9df9afd6b897fa8f2e5091e42e1415e679cd8789f1992c0ac200a014000f9e40d064001c8240ccd7010944e2347f6fe95f8728f7424102136390710a124fed945c3af783022e5f6d91a2d1d8bbda5f8c52c204513194b05fcba5f32d25984d8e015e7390bf20da52875c47040c100f305ae2f9ff277db0d32dab1283f2569c28cb164a8597d5407804d42dd21d1676e35698718c421729cab493ec05ea02d4f10000e79347483aed75d1b9d20b88dbbdaec8a823d3700000000000000000008a4404204582502282300280a045be90b11035bdcd240b98de258ede5678c33eb1a90dbe5165f6851dbc84ef54906c88b3739af88b01cf735c72e89ba00066040807403e3201e1500e828)) <<< 16000) + 0x0c8140380a0007352062720301d41c5402e6267d5aa33da4ebc227716803a0043d546c3884acb7c3a1917ace382ad5616124e2c0b750a21defdee906b7027c12047a6ec0ea6f74f64af3f567276a5e4ae1e6baabdbc4ca72072f78533f99d7979bcd6c3166dd3f6c3ad4d9f7b1ed7c6f704702c3e2420356777a862860f0b78e06e0d4dc02de988d3920eb307341a532bcb71f91f159bb7ad4c8cb1ad6836142c1694f00159134d270ae33c10995c0672a8559bb590b46527a595a71e475a8f8198ddd58d2100db70884d3ca25de7abc7b9d192ba40f5c89cdb40287a7bc46e5f515d9884183ab0ae9b3cd1647a5cd661ef74b5c1dee80e2c6fc698aa5084b880559286704e40a11bf30450dfeb5a4c57ab76f32f5d5679aaf7a3a3d32683f4f76196260860945c1fa7827173ce95c08687dff2e32d8559401786c0b83745e3d4a0c26456e19daa1ed7c774b2cf8ff56865dd26c2eb241d3043e9526042db22a6faad0ef8a51df3ebfcd704fce3c279ec8686d5e749f0b1b7e4b721f17089c248003947638175d8dfcca10baad3859b585d22cbc6d21bed26d178e208f8fa3a9ddf4474602c377fd1883d05191df239f0c712be59a30bf29c4c51c0bf5bd8d4ea5c9bbe11e130c2558b2ec4016fdad11be5d4a40778cec5f69ae56e2fda30329a38a78f5e8cdda62d03de830e9e895da8b43eeeb527c2ba49b30523ad14cfba4b5cdad3ae0e9e68a5b4ccedad5acecafa694047a1c023af1dc53c7d330c8763f6a6daaacefb6ac21223e37a697635e056d30f4d7bbbb90f0c35ef6b83cd7abf0d2531015a16d1e3ddc814b5bc7e2b1ae4ed9a7bbc8a8ae0d10331ac5104122131c06c7882530187b00a011e265402048204001002d01c8806cf09e508207bbee17848029e408fd10071af4505a804828440100000e330080100401680e086fe49ed3160bdf022a2a48050a60d9410045a3d33e804818440100000de20581202b090000ad102a1d0148c80a0140007404088b40422a000cbd204e730261dc0a322c112d160c5e6238ba481288e58de8e020e0f6f10200be4cf83c828284a5044010a1ec4d5ce1dcfea0a19f288e9ba2a95c49c23ecf493f3aabcec9491de8000e9d7284337844c4241c5ff4937d95e8122eed6b59dae334e940280d1001394deae83f0df92dd9a97945bb3bf9ea4400f5d7776c3dfadaf99d22ea830dfdbaeb38fcb2924360301541533b02afb4c5c6d5eed674a2e27ead2cbaae313c8c4e0f4a60d3c9ad4ba7cc08f667cef92e139d1e62db2126deff715560c4f2c143ece14095ccb4498a2588eb17f16b8703c235f51afa4545349da734739630d2642001180f432531c1c9070c58e76c401423dc10533c904088f754b20011820199c703b6fcb2a608007a0f0b8102710220080000b590251581204e85a56211271c16ef2cc54141caa496831023142000801180e0f4d72800016e34b65f397fbabdee15f1a1c12dca72ad24fb01642862843822826003802802040a0a6409651366691a7e79e32c74e6e74164e701d9961e46e30dc29500021620005ea4088740421a000ae820404a01f2100f0e8074240380a000c87200464470c88ff1260f50e96725960f0935f4c4dc80e1af3f9d9d3f1111c08380ed6f80c5f47b1f6a5c38f728ca0ca49834192fbb76a688d249311808ca1d5eec3dd8e15df8fb472d1ec67f11f43094a535507febf110a02305740e0058a2c2295ed646e553b8a1ea3859ff744ad15a1e0c853810ceca04db6e65439342d3bc93df93597a47871db4ac2de0ab429981224425abfc2fbfbe75e5900ad2614697758c989e4841a2580828ee265978b97bdab338877e1f3046bdd4edf4f246999fb13915a36e3449460d353a442e08579d4bacae3c928c1280101d8991c504bd9b1a58401f96841487a1b8757519ab40f6c19c468a9fb5c8bc6361464987c6c2d09e2b862c129442e42ce691c5d6ab281209ffffcf8363cfb78e756b4560d96669d4ad3025a8beefb6414e1556df7e8b5d8d1b422d14d8481b9554a3f6ebf2aa127f01f8099e9b38139a2248aa8d19c78ea764f8db76cc9eaced60c036c52041e4dcca2157355400d86e08a0ad32b0a012c7d79e100d890d5d6a0118c0f80400002b080d048001b7880c9280608402e3a0161900a828050140260a0120100880800336080239c9004e4335bfd51cbf01ba659652a64906633991e0994a1013432e7b6b77800000000000000000000000000000000000000000000000000006811821811411010c0006f88930cf47584e5627e7a1ae69a37932c922f7b5bed1e8146cd50a42e5240a44183a9f997561a1b30c86a9dee35ab1e88a7008d9f6e920bf6c642aba143c8d4e25f8a0414124b1f08821f7ff05a9336abb2edc648e6f8d44f5254e7a8bdcd37ef365bda3704ec81efe378644f06a9061315f5d70c080d2a0a49ee6a5c253a2a7de18c15d9e2888e8a110914ee08020a6d7dfca80a01809dc5e1080107a6b9400600e8bdd9f60a2938e120042410f652f16c2f2b4188017720eb4fc4c670a65221cb5c4300000000000000000104730ed9cb795b6beaf13db00db4def0f2399076ad480000000000000000000000000000000000000000005421861c41841c2182142278017a2fb3bfb73462a4ae3958b4775c198780176790a729b357e247950a9a74508573d93d9f9f53e09b2b4bbdfa1fc2ea1ff2cd4dd7187388c6a000912404004000c6e403ca401c4a00d210060e802c640141a0090d00406801c2400c02005010006871004210018a80083400202000010053499)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 29 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case4" = "QuadHeightCover18Case4" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 29 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case4 private def zz2389:"s0955"="s0955":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case5 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l12 l14 l15 l17 l20 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l4 l41 l42 l43 l46 l51 l57 l58 l6 l60 l61 l62 l63 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x424e48590, -0x540e2caa0, -0x7e20b4b8c,0xfaf8099c], ![-0x540e2caa0, -0xd26a3b375,0x139eec124,0x3f24e161e], ![-0x7e20b4b8c,0x139eec124, -0x20efaed99e,0x543bf358c], ![0xfaf8099c,0x3f24e161e,0x543bf358c, -0x2a1288050]] noncomputable def hinges:Hinges:=[(-0x152463f0,l6),(0x2a63d4e8c,l4),(-0x1c3ca3b7,l9),(-0xec537127,l8),(0x916319a,l10),(0x5707cb510,l14),(-0x2295131a0,l12),(-0x148a6aa40,l17),(0x378e0d030,l15),(0x1c0c7c7ba,l20),(0x94f3045d,l23),(-0x2a1288050,l27),(0x2a1288050,l29),(-0x6100be020,l25),(0xd3472125,l31),(0x1415a8f9c,l30),(0x2a1288050,l33),(-0x2a1288050,l35),(0xfd58bd4c,l36),(0x2a1288050,l37),(-0x35eada578,l34),(-0x37614d88,l43),(-0x2e4f166e4,l42),(-0x1ab46c910,l41),(0x840100c0,l46),(0x2a1288050,l51),(-0x48a183fc,l57),(-0x9f6ad92e,l58),(0x32f54a3c,l61),(0x10becf90,l60),(-0xa73dfa46,l63),(0xd06b2ebc,l62),(-0x96d8c12,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x6100be020,l25),(-0x2a1288050,l27),(0x2a1288050,l29),(0x2a1288050,l33),(-0x2a1288050,l35),(0x2a1288050,l37),(0x2a1288050,l51),(0x5707cb510,l14),(-0x2e4f166e4,l42),(0xd3472125,l31),(-0x148a6aa40,l17),(0x1415a8f9c,l30),(-0xa73dfa46,l63),(0x1c0c7c7ba,l20),(0x94f3045d,l23),(0x378e0d030,l15),(-0x35eada578,l34),(0xd06b2ebc,l62),(0x2a63d4e8c,l4),(0xfd58bd4c,l36),(-0x2295131a0,l12),(-0xec537127,l8),(0x840100c0,l46),(-0x48a183fc,l57),(-0x1ab46c910,l41),(-0x9f6ad92e,l58),(0x32f54a3c,l61),(-0x37614d88,l43),(-0x1c3ca3b7,l9),(-0x152463f0,l6),(0x10becf90,l60),(-0x96d8c12,l65),(0x916319a,l10)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x120c0698040002c46610c0a640100000000001680e401000000002e1b02cc02000000000006819002004282782e011540140000010411814e60200000000001d02c8020000082391600b20060750308178047740180000000000b00e401000000000064034803000038232603d2180c00000007231036300c0000000841406e601800000021834058c0300000000001a0390040023430832011040140000000fc34038601800000001d0e038c0200000000003a0310040000000000740e20080000000007a01440180000000001e0148020000000411c81b18060000000001100d200c0000000e4220486018000001c4250220c040000000000120390040000000004850330040000000078380a601000001f0883805100300000000140a02980400000000002409200800000005412044601800000000a0502cc020000000130481118060000000002900c200c0000000541802660180000000000140c8010000001582e043180800000025044086301000000118c8681480100000000002803c8030000000000581790060000000001900c200c000000ba090062602000000015874028c030000001904c04d9808000000005c380530080002e8620900648020000000e02200ecc040000001e84c04d980800000000005c052008000007e08400d660280000000170d018c02000001ec220065980a0000003509006b3010000000681600f66020000000000b8024803000000002a0a03980400000000004805200800000000048012401800000000016014802,0x520390040000000000640b2008000000e419814e60200000000001901c80200000000320e0398040001845309808840100000000ec2a02c60180007c184470321004000028222603d2180c0020c34848005040140000000a44206c601800000015850028c03000000002e140318040000f02106809c40100000000000480c4010000840d02101e10040000000110500618060000000005f00b200c0000000e44403a601824220906100a790060020629810802a200a000000000098072008009110904602bc80280000002c9440d8c0300000000362a071804000000000a830330040000000a8b06068008000000000290188020000000005458198020000000000a40e200800000001a8b01c60100000000000640c8010000000320680a98060000000003100d200c0000000088381a6010000000000110248020028630846811aa00a0000000034180d300800000010c6205e60180000000220b02cc02000000000042039004000000c328409a301000000001907816601000000321f0f02d00200000000006203900400000000c87c0b30080000000000a81240100000000000240c80100000000002a069004000000920cc0a7301000910a70c6045c80280000000002102c80200000000034181980200000009615016300c00002d0a44404680180008110c11025900400000000000a8190020000000002100d200c00000000006812401000000001d0f01cc02000000000003819002000000000074072008000001664881346020000002c4430298c04,0x1d0a80a180600000000038503300400000c310c06b260280008218c4203710040000e62104406ea0080001c4450940dd401000000000090e06600800000001b06038c0200000000000a0490040000000048180f30080000000ac4206e6018000000000740308030000a22284c066200800000000d44409300800000000002e0640080000000000440c80100000000000c0690040000003109406c301000000000c8a81460100000000001201c802002c2404310157a00a000000005c340d30080000000001500a40100000000002902480200000005404809980600000007219024300c000000e21a811060200000000019c04c8030000000330580618060000000006500b200c0001849418103e60300000000000b01480200000000007207100400000000b4580930080000000017160660080000000003601480200000000006a04900400000000b4540a30080000000000160640080000000000701480200000000008e0310040000b2490c081f30180000000001900a401000000002a11024c020000000056220518040000000000980520080000000001281240100000002682402cc030000000000018190020000000000640620080000000000c81c4010000000000d402880300000000003402900400000004419017300c0000000000280c401000000144310138c0403843120c2014f200c0038864823015e401400000000110606600800000000222c0cc010000000000420310040000000000840e20080000000118b01c601000000284530298c04,0x7a04900400000000f4640e300800000000c8881c6010000f33086102510040001461b84600ca0080000006110404e3010000000ca2280dc60200000000002a01c8020000003182e02c1808061c34014c04604018000000c2288050602000c11421a0054100500000304128078180a00000009611032300c0000000000c812401000000003a1702cc020028638856811aa00a000348870cc0a740100000000000c81a40100000024843029cc040024431c418117200a00000000847c0b300800c314418606fe802800000000004c0c80100000000621a069804000000000c87033004000408e61b0110802000000029864098c037062c2040819be200e072453010c0ebe40180a3067847807448030000000188a4050c03000007c291081b200600000000000f032004000000000f0606600800e3142204066d005039e28a20a042da00c003d45388703db401400003a0c842066801800000003919024c020000006c322a07200400618a20a3037f40140000000108380e60100000034833029cc040001a43b866053a0080000148421e013400c0000000001c80e401000000003109034c0200000000064281980200030c820980da401000000000191e0660080000000003101880200000000006207100400000000cc780e300800000014c2204c601c031a102040cdf10070000000430981298060000000881b011300c0000000e4620286018000000250c4054c030000001d84e034180800000003a11034300c0000000642202860180000000c8440d0c03,0x391880b1806000000005824053008000000000b0a06600800000015024038c030000000000140290040000005e044016301000001686c1201680180000000160a014c02002241141680c6200a00000000009015200c000000002a803040200000001d8b4028c030000002908c04d9808000000007c58053008000000b021007660200000017446026cc0400000000003e029004000005f082006b301400000000f8a80c60100000176210032cc050000002a88803598080000005413007b30100000000007c0124018000001e8110050c0400000003c0480518060000000740900c300c0000000f02201c60180000001f84402cc03000003c0208013180a0000000078240630080000014870481e8010000000249040d8c030000092150601b20060000000000c40d20080000000168a8166010000b424c8301ed004000000006a0e0398040059091903025640140000000001a80e401000000000d09034c02000000006a0a04980400000000841407300800000010c2206860180000002084c0d0c0300000000002206900400000000645c0b300800000186408134602000000001109038c0205044061b204b3a00c00510818e302564014000000000d0e066008000001c823029cc0400003022a603d2180c00000006229036300c00001b0843206c801800c3102184066d005031e20a18a042da00c003544386703db401400069944208128802000000025844088c030000096150500b2006000000e210c0a7301000000001e8380e60100000000003d01c802,0x411d81b98060000051883020e30140c48810218064480300000002784804cc0300000004d088059806071053c410096a40180c1886861805c680300000000110f014c0200000000001e0290040000000001e009200c00000150a8881480100000029151102d002001e41141680c6200a000048030c004b3018000009f0cc009660280000000161201cc02000000002c22029804000000490d802b3010000000a424002660200000012833006cc0400000002c13809980600000005821013300c00000000058012401800003c1982406d00300000000003a069004000000c488780b40080000000001100a40100000000002102480200000000342c0298040000003108404e30100000006a1280dc602000000c610c0838c050000000310880a980600001084a1f01b400c00000000b0280a601000000001506024c02000000002c0c03980400000005e0c013300c0000000000300a40100000016012004cc04000000002a0c0298040000000000380720080000000000681640100000000038004c80400000001f058099806081c71c60c09644018000408ea19019880200000000000903480200000004a0700c98060000000000840d20080000008218809c6020000001143501b8c0478e20f0688035b200e000000000078072008000308a22181968020000000188a4058c0300000000054681980200000000055013200c000000a222805860200000000015c02c8030000002888202718080000005511406e30100000000001100e40100007118453032d004,0xc2492461807e3401a4d8c30112059c280380000000c8440ccc030000000390881918060000000034140f300a0a8a383080474280383892c920601f8d0060000000000481e90060000000000e80520080000000001c81240100000003b86404cc0300000000001c0690040000000000580d2008000000c8a8481a80100000003e8c806cc03000028a226048e180c06104782080c67401800000000c8280e60100000000391103cc0200000000001a0690040000000ce1901b300c0000000188481e60100000000003d0388020000000000140690040000000ea2a01b300c000310841080ba80200000000001501880200000000004a0390040000000004d013200c0000000009e01640180000000002e01480200000000005a04900400000000b4540e30080000000001281a40100000002a82808cc03], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((0x8100e8e32ae4011aedc45f08820840201380b09b05c0100401034403d0c9be70a384112d74642341f4eef2920800425064090107c021c7626a8bc341e683f3b3b261c2598eafdd28410a13084602000016e35fa1c00fc21bb6208003dcd05c213821200400005cc80012e980000802068407a190ae13d48414b688b9d1a0b7e05a8c02000a5e047c80040010bcd5caa9cf54277400000000000000009340d74cbbb83bfbb205b25123f1990f841138e3842c21c2082381400380c0000803400064880013f10600900017290005af231e2b1a0058c702c11c1633e039141b573bce5840b79748414204cd1c2212045ca042092408210080cd02c6641633c0b19d05f0a06470d9260bc1e205641055f49399088008219ac320010004067007a31621b3533c4032706d01872b0eb12cf056fce2fa82003551f29a800f8022081d980040e79f20dfe77210401e581bf848c3f198fc02020e68b418e78800b71ab2061f0de8f36090000b71afd20018d5240bb900220040000df90002d1386117f95fea4388365b192a38612e9cef1bd11c10e83bbd73808133b4a0e66008318b31f7d610000365c1ca99e00d13c7db2434035d38c18889b4841380c00007cc8cb06c650076ec43ca11e905a62bdd6b3556edd6b355702362e6c907be9307399e74405690d0accad002ec34a6e781533c63462c32430c31c0d20da81defb34360143b7190af8fda9a750dd3ebc628c0dcff379912863b5aeb6048d1c6d765463aa000000000cf5b6ad1f150b395008c4f3cf1901090c30d000f03d08ff570417006800094119b09f14f0bf11bd43c375b9886d80808c886fb31f1425066e46ae420b6a146b71e4401d1e6be0e90000112a80b002b3414f3e0044aa158230e184c0280001d33a58016e356438a1a293ac3038843ca6491c61106188f4c020c05accb080000d827a13c0001e847fa2610230080000b310007852001b546c70c8285c9881a65711814b0a17b7bc6028009edcfb6900084021638225c8630e20fd3e8be1617dc072fba0019c18e1e040540cd7c04a00400100000fd3f5f013389bf4d5b3c444128efd1c78ed30118270062d5bd05a46ece211af7ce0a80f4ff95aaebf548c2ec0706ab9d832446844850a502482300001512cc983794770634c2aaa41ffafc56fd49512499e57984e4d1ac83222722296479d875033566f302ac166ce8ef76c8504cd2ba8001bb1045098cd04c664263300b80000802065c07002de8672c2b285798ce4652e6) <<< 16000) + 0x6ff287f8775244e763363275afcb7ff60eae7344e6006ec58b1b4cf9c0b3ea581f5ebd3b3f384c7214681bfd945d12537e05fed10d045ceeaac0364d18b3d92b0fb219718c6e944fe92c3fe2887c1ea117e26e2043313415f5e16bab91977a0b8576a83e8ddce7ab6ab15b4d27ee9846caf58607d0f712afb7455958a18232ae0504c7f90d55df2588629b4e188c3afcf568deed382e3632189ab40d77227cbe97538b97b379d760b341a1e595d17cf83d67276a37b8aea100ac6a9261989e593f256c901081695870000d6046582632a1319401f820da9a48aa7e39525bcb8c7954b6618e1975d2474469b47c7c22b4e85e6c8651a3103f9486c73fa6061f108bb3e024105e45ba2faca5922a472fc2c2c6dcac8163400c02c40c055be218b4b97ee1af239854305c5e081dddaee123e4200c067bdc8cbea7101b7db03244130ab0633bf74ff116afa63bf9f3ed67bee0d76006e4b79bfd25ca0e2655fb8ec8901416e7be285830f87843b8c06fec970279301e92ad986f5bbf546fb051276b30bb3cc678d46c188698b5409b858f0c5ac88f13cdc78acce16b343d36e45d40b1e6d511ba10bc41ec84e4a225dde0e314503fb706ca4a85fd8062adaa7000074f2001d5640052608490e82445400479e450c562842bb56f41691bb38846bdf382a1d50f05387543c1512946fe462528dfc8a1110e19808a08609600e00826b754bc5e60d00c21ee8cd2a7a1f52277f10be236776125a00090033d30a5c0a2e3da2c9add9cc5ad47497df12e320b83b461c8e1b6c0e00c06b2b7f52688088b2fab3aec403861dabe2b996d23ef35bcc0b9c0ba8060221ba072755d21f1a9045f38cd38802822ec0fcbf663437db63e92a58c3ee01821252cf7f61d2e6dfaa08768be29806001294bbeb0c20b3afddf428a8957c004c88a3eed8bbb5ecd5c15a56c153211f2735a98cdb6b3b97dbe803a932127637cd42f5249a705ace061c7414c00023411931d0c90a8644142fc02189010003ee9aeca8c7540000000019eb6d5a3e2a1672a01189c49649020820811000200000980c01006c8a0d10bc1b145baef04f20208f688b979982108022bb2a31d500000000067adb568f8a859ca8046248a28a286186082780680600e0100401a00023a4640240003ec6f3572aa73d509dd000000000000000024d035d32eee0efeec816c9448fc6643e1044d20a2070c30c704304c00a00430200200d00019a231e2b18e018c680c53807c34db6c75d1a2585759a796254706050b18210004286018b9ad38418630f2c4fa9230400269fa18c1c40a59780d9510482c03a72d918204399e14c6082196ac934c338009ad2e485a01987ab94eb7008500280001ee23181391415aea9dd828b6c3ca868c1837907bb9be9e106def3df2c5066d5eeb5361027fcd4e71e3c000c0768f01c0102d29504cc002b127fbb024a430940500003c6462807450e2c3be2040811852a2404106ca4fc061210016e3564140480329baa00173235c19840730012b4130a11804000059cd0c0a9cb60434549e7dab48a2a0f646310c0906414e9810553449346194208402031603b7621e508f482d315eeb59aab76eb59aab8119d39a675026f7889bfccc44832fd1d59b20446fbf06f8e357d4358593ab493fb58c3b121490e1f77d35393000000000000000002100f4ff95aaebf548c2ec0706ab9d832446844850c68a780600101029d2502fd9e6103e97a2f861134b5654d41f720ceaca79bd579f3ae0ab631f787f3d73b8393db2e1d8cf934d4148b0510bc13bb16ffa1a60d6446ac83206337c40636fd403662169e923ad966c582e94e14050d554ea8002e0918a01c8a29753618503e2df84a8812141f00400004010007a7212432091110007231143118a108fa734cea04def1137812d1e86c188d0966088dd6e62c112de9fc284a4c1516ade82d23767108d7be7054ca18818708608b00400513d6aed30bcd656ef05b81daf740bdb0737aa84ebbdcd90aa1da78200f7ce805c2d1dd258185c8012518a2b88ea2fc021890100019991880d000b949187098c304c6140779ab95539ea84ee800000000000000012681ae99777077f7640b64a247e3321f082261060a40a28a5026002800007a11ccae402e00dd35a7ed2c52363068d21b64835097018602ca6514c32e1a20af2b02a2bb50b0800df8471d680582006fc20b2480081ddd0fe4d7ffa9a00245ffe8f3a6009c4101862078d18daf2066fb35e2f625ece68419fedbe71ca3d3a5a73545fee449e605185eb19d0a080e7e126d16f46d6f4bdd01204fd3f7b84018b01a341b2c2b4035aeaaefb9e779487f7b500797123d095923fd1f9d0d01049389c8f092d6cc4da06bae86260fb740e9bb07d24eb5c1567917d6655f5e827c8155e60f7f2ec6a77c2e946759c278a05fcd5c91b14ccd56555b64b72f87e986b9f0a82f8a5fa2e61a484ab93ee2f811faa3c023890c828e8be1b2b22588c4a54e83d7555cd8ef485916272fb50b5a97ea29e2b5b6a90a5e01032d1c15801566cfd866e033a9c489ea571350b952aaa41298eef38f15afe81cd7255ce7e1fb6d8cde9e91c91d635df9bfdd4a04d766e96fc74c54888e1a168c03f37b641eb690dc92c41b7ccf80008d4209e22184110c1868608340016be70ceb17379b4610347b263005159a02b2fa1210007a11fe301cbdecb178601d80612e50100930709ce800000f42398a71c2300869b7526ca72e34900823525c8c30d3eff75f0a0c000f423fc6846278169ad0c10582f06919a00913c77054c00005b8d590140)) <<< 16000) + 0x412804201002008000022209e1a1840d0c18686083400047c4604640008126cbb03e762ec58e3466cddb0412a8a9b2c90c18005161540c3072006b94581b311739cc40049c08de6000000f42398a71c2300869246cba7a097e1d32cfef35d5a0f2000a46ba8f1402855e0ad6ba90c35a3a5131ac5635babbdac215c0c325417a7e7aa0eca8c06f9b40c58400f6a11864c0ebae3aafb43f06013ba9f16d1454b7aa6ebaac310004ec70334490df5958b0babc2d020d292e53f4c2ea20ee1a401563428604679746aee08c6210bcd5caa9cf54277400000000000000009340d74cbbb83bfbb205b25123f1990f84113493c81863440c314230100070080200d00019430080100400001111800d0548682a03414e1a00060f22fe32034010003f79143198a10ce4278bb8d1963b8511656b55820a3e9aee3b09090c34f4ad92abbee80dd778680bb9dfe27c918755976bb52331bc5ffe468ebcc5fe6200155127e910dbb5c8e8b1ad462c39457b603a54dca56cd52e8ee92607c3e57befc4d428863c28984ddcd8dd4265c4b454e1fb182c3003907d7279148cbfdadf011501c3e2c404abc1f29d5ba5523f51b4e36a8faa814ca64d8a85afd66d436bef346c3e69d9b59fef940817b6c9cbe24f9279253ff1c829494c8d874db3c634d9e5696a03e4a5030ed0bdce54e9574b010a0b4278964ca37def2fffb54a292701ad8ffb8a93982fa9476fef87a5792049c1c84fd4a32517fc9242c97d3391286d72cdd0209c745d2e1c77ff5052d241b7896e480654fb3d772ec69e284695a76ff92609f0c205651fdb66b5c6db6cce1f390ef35f4cdbe26cfe942df762e2159cf51833c65b3ebf017e090be848002870de6ae554e7aa13ba000000000000000049a06ba65ddc1dfdd902d92891f8cc87c2089839239418c19411400c000045279b14a54958467dfc2cb552bf0db46c02f41e9e2390c1f3ec82fd891d11e332f1deeae393a3fdbcd5caa9cf54277400000000000000009340d74cbbb83bfbb205b25123f1990f8419de346e0000000276f2bc90b15af0708b2cb10410c0c904d00b00b820080374802adfab7cb13149af3172c30a63f48dc8c108802000015a45f02412412091090bd84806024000666450c4628423c54fedd9a8c491c4104f511756857f82fde2a5635864e90280800000000000000000022a17b85ea4b45b627b8d6c279319fbae43fc30d637d0adf490d9000000000000000000886eb73160896f4fe1425260a99211609208a09400800a0e75d2cb23b3e6b5d780daa9f3d89fa1ecc14520d1f276bc13fa84a03fe6580ed81e21172d3eb894aff36f8b883e09c27d8a32caea00091e45e8940280a013050005881050310bc8c83a014005e40608599ecfadaff225c4b66344db62b98203792f82f78cdd8fd9b796f963146b80a0b4f8b078b2e5ef3fc60eaf71495388201c3b17e231133d9ee994693c5a30dc0818f6877287a18c421e47e4b7627eb255507dd50eba053e777c614d788422f2f02d9c0d497d8ecdeb5af69354244d21b9fe493c1a56d79c9b26af21ba2a5200261200e1ad53351d4b69071531d45500008fa422507652db17b0aeca8c759109606f8f199fcf18104a2d5bd05a46ece211af7ce0a90c18818e10c10610a02aaa029842e47856c760758bb5b0fe49c4b8e9300810013ae78dde88e64f03c92b943017fcfd1af3b2774f3a2ff1e404af12c9975368e7219524471a0006487c6d65742ac5f021161af0afd2b80cfbb9c3ff4c251a5318c19800000000000000000228940064302282300280200aaa552adeb6567494cf833a6ad4ebd3b3d4f92f78a4af82051001254e355744bf672ea9335b9cf054899e98db1be54b76cc53e70debd9f16b0b6cb211a8536321b7fa6558af23e8001d591785d0bb9a85d8055d9518eb442581be3ae4c302f9048271861259070e30c48610260180001006f18da9233461c58929ac376591a27e62d28408b61133b640160c1e087ca00440100001073c6162f2b7b5f1c5816cb3475a98490df40bbe51a4000e4e11381640860fd18bd84100db4629c71804f4b5faf4851c00a0051c62d1740c3e7160bda89c4184230b6351c59186d5a2aa04112736278c401331b41df4c004401000013520005c074b2c5e56f6be34a02d9668eb52c821be8177ca307001c9c227028710c1fa317b04105b1b6203e2c09e96bf5e90a3801400a34b5a2e8187cd2817b513882c74616c6a38a1f0dab45540413e616a0f8702663683be98008802000026a411c040005ea43a0062ce03e30a991aac8ece2c19c38b8e6cc247d50116d44b2034d01cf594e1c002625834061801547eaf50c028ba057f7b28e0050028e30c7b207269c58e91788972c848440a9d65870979ee02ca0026cc20b21002c2e4e45b98008c0200002766c8cb2610acc307002dc69d82c7af92e23502871f5f0133824220d8b8eb70c1021661c341401a685a2b42704240080000b9982152b2410c84143f0c8c2a33ab2c6072de9a505050dfb811c3e8349184b613ad084120c6c8419ce38201159fb7328806000de7f48b5e0289010560480001e422ca121640900034e9175158ba06c588362c21be30ba54cb99820c326e78d270ec102cee4782fddf92201f165c70ec1025e320ed14ec8e20b8bb48aeca14000ee3d0089a040064af9a7a220a2208039293b8447520a0b009000044e70a4c0895645f07124060b59b859018dc49706ad81c356b0869aafa3060ace807163060448eac684b112006db52415840800bce18d9ebc28a88004a61d95229c82c)) <<< 16000) + 0x2b02000010f908925c0c202803191a3891377b0d4dc30714801cfa8838407b20adcc83047068e98d4628420cb5d8b68180027f83ce882802ab4367612020608d36682949cd0a00500003f445cc6702819dc60a48c01c52d4874067c56306ce64db5b53fc708005967eb9e00c128dcf07548611c18326f930f32a302002cb3f16a00500101d1f577000bf42030bc0b186c907cad84b202ecdf84f896131d0e45731910046813a00000000000000003e11c51c40c31c21821c11810e65c02255c307c01a00034045c82400012171090b80285bc142dc0216d010b60085ac042d4021690100025510891dc030040102d00b10a018b380e4187eb5c0a8804ab11148308820880202cc13b0f3e53200e020e090899020e002200002008c12d27708367804416a5e19001080200001e880005b9a039292dce96cf2c7734896558f39bef14d5d62723f894ba1cc9e593c75df594584e214e1ce3eaae974d06d5ff302712a9560b2fcce5eb3b65d2f535cc5b769846cd5c5bd7d5ff1e5f344a72a248c1b213fd9046db133c00cfe8d0568f37985ce23882eef7a880d822e3627ea986726dcf5104970c4bb5bf697b4487a4e400775fbaad53ba1c7dc211b7f08b19c7d8516493b9467bd28a0ca6a650ea772cf5c6211e5d9740a55d91973270860a5e50cb735b4c99961168f8c41666c768c1811e661ed627effc469f64b0a63891c2214570600006902000fde4594442c8220008ca22c63b162118b088eca5b62f615d9518eb2212c0df1e333f9e3020949e3715460daf73e18d6230a5f6273f5b4fd6e4030b2f74eb7550000000000000000004533914f1514f02c5ab7a0b48dd9c4235ef9c1541c6280080040554b2cb562aedcfc419228a9ba1ce08a860335f47fb21203cc4d72ed0b75b8e85704a7c186ef868ea1d124deb27fb08a58a9ae47750034cf76c647838964109fda7f089761f251fd5290d5d66682d6ee20f092c628a309243411e2a21e81ab5cb826d1016be39cf5ff5190848102a2c00215f0100030f9b7621e508f482d315eeb59aab76eb59aab811b9ca8e9ba410bdb11534502a4f1b8aa306d7b9f0c6b11852fb139fada7eb72018597ba75baa800000000000000000228b56f41691bb38846bdf382a830a2043024801002d06c32b9933254a99ea970d569161515c4cbb9b4892308ec1dff8696a427e12977ba0ce76f7f7b0821130585a1a45a592e70edfca7471dca358eba86fe69d14ed99f7c73da0ec9415282b4fd4b4d917a000a664224a62bc33b296d8bd85765463ac884b037c78ccfe78c0825278dc551836bdcf863588c297d89cfd6d3f5b900c2cbdd3add54000000000000000001144a00333914f1514f02c5ab7a0b48dd9c4235ef9c15514420018008055431f3e61f0bf38424dc1a33d79040fce400168de7f11aae8ebb55b13f003f7f3776434adec081063e406e707e8c9578a9efe3794c014d557df7c8f1e0161ce8dd5717f02c601c4391f40680027a9c1854bdf92b6d2fb1bd30fd46f6c3142e25ac8d1271c7e04b2dc9c0b95db86ca2d4ef16d103a2d9407f44ebcbb04f60ca432d5a106025b844f6cd64a322a491bc803efa150e7978acec159784fb56e84c085a10f1624dd7a2b97e79fdcfb3948faba4e1e1a91b593d42800032f8c15498261b02b55705f58321db6f108b014ca19a2c4248c2ff6ad7242b831fa1994bee097d426ac0df838c5a9064e3401508040e8b3556cd42c37575e3ae53c971fba6739f958f96ef91a49031550e90a3d65b32cd6b9cd35ed9445872a371dfed5221e8408a026bc4f9fd1c15a55b45464bf9dfdebecd95aed55e19bc8d786deee5dacb1139876bcf416ee796883b411bac0b57fdf48757f9b98e87703bfdb5df0c32cc695b9835d32817202d2e4f87f18368b04e631cd003b285db7156369f219a3e8d7cd0a622a0cf6657600013a64061040048944574f62b87b08f1d8ad8ac568562b223158118ab88c00fffc8ab1ec554962a8231530d05c80fc91931b54e4c24eb9cbd8d2c9bc3a2c498b10ff5f493c1030ecb474583090b89607d20002da3e4ec2708220087923a6c93ce1849ee3ba83e59368c1f7de9622463eef58185222c138fa4a104401000010b35b4361b5acdf3b3356d0d86dab37cecca1089c41641441418610409a01201dca55387fd577e715938d462548fb4b310a978184680c5b12a8000df1e2087ed07339442bc0f35e20c289979e292482305335e4490108c0216ec43ca11e905a62bdd6b3556edd6b355702362e6c907be9307399e744056b686c36b59be7666ada1b0db566f9d9942133882880c2241201340972f23111b46655c2a1ad0d57aac5e3780ea7a4aec048f098d75e4c160f89ee86787665e94b38feba1e13509b91d41e98132cb1a0006d84548242a20a00049022a02b91da3ac1bcc12202a1ecee52420a3c57cfe5030a98f4d3490108c02029e03b7621e508f482d315eeb59aab76eb59aab811a725f0464c2324648b4631513f0f085dac044468e48e4845026005008c42d5a7d4442a67b7d4e5935cc5724cd9de01b15a6ee2b30837ab9245925d059b6970f6b4f1a34fe7d4319ebe574e1f687f189ff8ac16d0348040c114a45500036c212412091050a70080012e88a684c530262961314a09d38babef29c5d5f775f0b8d4b57c2e35304383968b7f41805d6d0d86d6b37ceccd5b4361b6acdf3b32842658a48a38a3002802484d5dcf9ed84ad9d6e51cff3585ed93d3af76911b1a4881717b5700f7533cde1089432006d45e70db3fc396dbb18f10d4557f625c22280d)) <<< 16000) + 0x2c9b9f38935ff3182e9ad2925b935452404290020003f7228e5307f058a302c5141628803b7621e508f482d315eeb59aab76eb59aab811cc7757db400000000a1225e766c8c40ba042d8c836066fe05d6d0d86d6b37ceccd5b4361b6acdf3b32842860c40c284104400201a6ad35d39de6d224bc44343336f40da2945454a912ceaef999d9fe5a1e140143566f886d0f97e9b0efe25c8db4932d71e9967871a36e606226a59dc685143198a10cc504576ec43ca11e905a62bdd6b3556edd6b3557023d3717a65cbd33c690bb00f80000000079b1906c0cdfc0b33062061c018010015210d4563511bfc3bd0a9eef237741f9f30e253a4e944800e974fb7e59943e78fbe10d360a82871d2757aa0e4daaf0fa80acfb6d936cb664142b88a0fc692aa615646d1400d09f868000f4ceb50ab0d8a4c6e82187dc1ffe984aaf8244484ed7343a0fa3c01d8e21ea0ed57017367140a22051c51c22c010010f1de4ed7044da460c1feba4614cc2a0cb162f8fe6a4f756cd0fc1096a441d07ab73eb3b80d9e499effcf4250794c2535ad69a8fbe3e80b7f4eecb4adf6d60e3d08400978d61fc279114ff7c38182af50a10c578aa795445d00042f20a06a000ca83218f923b33ff2ef1c02f155a9080578e1cf76cd39b307db38e80285f0029e8c193223b0b3ead1dad8bdb14932f1710014808da820f782c20dfa171345de0202735ef903a42585874ceda7f18e50a01a2b1b102bbd0f59ceaaa4402b54051c19317b1e2c259a64a68805d100b7796788efd2c2c0de2a1e1c86d220219d073f7f751ca6ae6fc43ba4fb445893b3b0685c32f9af00a90e02700004bd21127b8099710bd01636af7266f63cc8d7030518e9c09956355e7810ed113fc41424bffbfd4021c9c3cee71813c1a040907670ff7ec12ee82286f9f645070051e5233ed02f3b13a494a6878428a01212e7088b6771852a0e9d8786210013de78bd4585b547d8c9e7112c9084bebb2c837ce1709fb995ecaa726a40b73a961ab4de88ed3139d34ad0d33dc876afdc4aa0d224000047c3c119798950e6c450507f29d2c19210112307bda6dd07006938b8e68f6180e1e66e1b5160500daf6d440d3c15509dc861181de05404193c92a0478e085f848f2cb89f78ca85c058000239227cb213d3109e18c060b42762a13a0989c8284e00523812be3859e74914bbd23f342f44045e2fc10f1c21c294f838eec948c10c19e5b69da08019da4a7fc714300374a7f7410055450783b84b29148884e8b6f488c6b167402d02850c1608afd8842385d9be429dc7518212cdc27f36e8c085989da415c8504a225b3532b010003c03b16f775541684b54f9cd2080812bc0ce0ec0aa36402d0280000fc113729d900a3dab63fa05108c08148904c38a3da33270a2e5083dea01ac44e48990ec80634c6506c8cad86c97848648fbf854a3440448b5291ff744000cc318d2900b8c9082c0245967ae366db22510bf0ca8643628a4bdc8cd96650897fae735344893cd43698525068805446f224864060210420404401e538830052c910c4f57808280140000f8113601e120772ab31702c90d267cee431030dc1b765894b146e74ba0eaa50b04fb787b892c443c19a44ac14214710157b9890ca3210be58c4800948120d80592420a4061862ae942aa1dd2c9fa8b9d2b9c430c9752e15ce5cb165e21615b69142ebacd8d12952c45a3f41a4f50508a2e628579c890544f674dc6d021a1aed001a95c0415812000083ce120a3dab63fa05927875361e98440c44e852f35ee58a452f222f00e50b7b1d1edb186588cc2946164105084e62c894e444864e1bf9603844800cc318d2900b8c9082c0246189acf7ffac7f164bd2816fce85630c733ade9eae1162b9b3c94a3e8850b8a009e84e0d1622d3d6607babe5085dbbfd7be491219758a56644240707aed0b9417d08082e02c000116100046b200116c6478289789e70048a489f993f24071409ee3997400c2053975c011524323569bb2560406b497a4eeb208081e0f56ab400808a30630e7391c003180604800b82420ac07186c907cad84b202ecdf84f896131d0e45731910046813a00000000000000003e12472451c5243203202140356e626ad07aa5865520bde042115adba254583530bde658183fedc6a73ffe4672c957708991ee800149101a0109a8080013c089a0a84cc542642a131110980884bc2425c1212d090960284ac14254021290100098e10434d89422c49d161125b126258928ec490760e22b123158910ae9c5d5f794e2eafbbaf85c6a5abe171a98211184144103240200180155630b1d8e5edcf8f6c3ab9c38e242002024f142fa97c0ad2d815886bf726910a573a66864ba33e3ac3bb7cfa5291ebfa36bd460ee9acd8ce245c106d086bb4686c7c5c452303e0694f08181252d2497ca01cbce275aa04a284201012109d0b07648340d3abea40bab532ff54147146bf82c409ec5f0000000000000000010160b4598712e55c706c71b8518de7ba3c2022873452832823814402c02072379ef91779097f15d18dc20f41dbc30bfbdb7803851e924a1be58a043d14e48f0acd9bcd1d9c0040ed394b94008c021c3058eb8b5c60c5d662d809c28404f384858a2088a31c1618d6abf474785599bea010c01a57689ba1014d915c8e50004401000019122400a0002cd21381209b0908f00800164487a84f02ea09e3fc2728002b002e5a7f364add9324e8901f1552df6de17ef24480a255d7080816d94bb6114706616d96dbbd193ce764fe0db169f1919af42f5502ff35370ed00c0)) <<< 16000) + 0x52529c3fcd61fae4ffa8a680b9ea98fa06ad6f8730db8e2693a15c8cd0576758104f47ddfbc649c3b568c29d7edc8c8628fa6d0c310981bd45fcecfa09b2d7d76a0936ca5757feaa7118c575ebef4a690ab1e733ed946e00d8e0a260b6c079434d2e0e411e48d03d23e5cbbc06d7d3c6373f86b610e7a859c87316fb563ac18e811c2047c46000ca24214861f42b0f91587c06e812753d9e05e6a13331ab20103c702b36e76846bb271c11c21eecfc5662acec2d24022fba69dde2856d3819080102d55df56c20466a2d0400fba4a575b425126c820416fefb93f019385ffb2048474b4461b6706d0a4080a3116aee1b4c609815810a0900018f902b11d102cc4f0bec10e671d7ad781738181431c88a0b7b06c4206b0ad588286c58fe6415adaa2709f5039b8b211097d82c009c109a397882e1238b191d95213bfd4a773a3b0ee98805954b518e58bf5d28be30cbd5788a82df48539033d6c1013aa48e82fb3864c71912d5fe4e0a1c6798b073953aa0d440e768d1d7bdcaf4b546d5074561e099a46aec7c80a40841afcb8326025f70f33f7b1b32a406d9442b48e1f5f013389bf4d5b3c444128efd1c78ed3011b415e518e5f0172960273040055f0fa44f7842c72a57c3e913ee10b1ca884282882046002801012a7dca3c61f0e8530e19e281930738bcffae1d0a5f4111086808f661dfac6d2ab07e3decb0c13da7993ff084ccf1fa88629534000d7c8898ae725f0464c2324648b4631513f0f085dac044d057946397c05d6d0d86d6b37ceccd5b4361b6acdf3b32842660858620618418268047ca71cf60eff78466c0d323ddb5064978c5ab79b899412e50f2e3889a80884d34c179fbf3310014e26c21604a509b0908f008000ce088a8e8450341ea1b81fb9fba55aaf47d30cf8e4cac1ad2990a597a27f0ef9fe5abd16b6844d65cfc78409c8589f38ad63f89bada8af9f7e4d7d94c5ddec2206b5def65733a8bddf218115e4e145276504cb7295f3cf950418f6984b824c0ed171688d41ec99c8c86c30542f79768589da5fd8b1c9b3ff91ab0845efc37e31b146d6b0fa565bb2861a802bb2f97cc5d3d8b68052262fe7b068ab8a684cf0ba84e272d9048eb10c9704cbef0206b85e308a49321da6b9c96789c25d19f738f0599a4dfd72067b1b02038002ec1806146b00337c68658285e2e3022cd7a819a600499e2b44502150dac321803ff4f5864270c210080000b19f1906a5d7fc185100c8e822c1188568ff0a090877e5e83041f82bb864804116b8e74260c2100808c80c00052880c06c4743701d208d8bcc708842ad5e04066a01147408c30800201da1a0180d7d7c04ce333ec7d0db526f7b5be9d90a3410481f5f013389bf4d5b3c444128efd1c78ed3011a725f0464c2324648b4631513f0f085dac044d057946397c05a2038a18e12601602182d77059badf77463b7054b2323d48a09c6f9d0ae78da2ef70f5ec64dbafd8875db3cb5d383e84cb55cdb86d62a476177a857debd851560845d21453d4daa00085c7c6e3df56b46048fade581001406c9b426103c00811c0908d84846804232030000f62000c60444c77f5f01338979246216d49bded6f71fb4fae4122725f0464c2324648b4631513f0f085dac044e72a3a6e9042f6c454d140ab415e518e5f01686882061848023809c3b16b910983564e6d023c1aa1e8bca8ac104ba8fa9fa9254379798e0d01bf2ce4a95dd792ae43712d1e03e68335ede82b58df6090514df31284d848460140f80b1170100020f10013a021f4330f91988b08e4302f5dd960604700286ce0c1382cc4c3cc032567590d20007d9a07bc0425182200808a8c83dc54228120f50987980b85aa922121443098a798e20326362fa214389d4ee7f4240c2000802284b85959b8ef43036d93bf08143619ac2842402cae4b9f040d8a8e3b34094408002000020a444c460fc131120988880c440074e2eafbbfaa303cd2d4d3fb557dd79227022a71757de538babeeebe171a96af85c6a6085a0af28c72f80baed54c6a17902eb686c36b59be7666ada1b0db566f9d9942154091c53834c00ff4385e756c7d74a6652258da227d5132beb5e5ad21e21f5beb462233ff656e6f6b02e0a82353e1a88fad071dde32ead0108f0c9e1dde904a195466ee2d6e81a1074d9c97c119308c91922d18c544fc3c2176b0113415e518e5f0175b4361b5acdf3b3356d0d86dab37cecca109a242831031e21621c1b6075784c7283c8c7cb687f5f0ca9adf47a07bd2294d5a6feb62aef93b85174209be4bcde3ab4fbde6ad608b126ac0cc19996013c460cd427996248ebfbd6940e65024a687801bb2de92200370d416f04c104201000013320008be42c017a202ecc44a08103043fe6a308e324256b3423112e0b50c15e476a6fcd0044ddb6b248037c7f1b4012714210080000b3180e7566126e38b7acc47a2507ff8830a9180100042039dbd569dc7067144be74941947104d0098085e6ce220e0431f1c02328011004000042085800e04124c5ff9620ca4805dc4a016c2bf4ab6a5bfc662bb8c2c360f29e015c7470c255205da274a8e01d6504b1258cbee7adbe32b8a79d078fe373b151d885d90d0ada76399fc0757a2e4ef840b20972a67b6fe71c9c2ba29fc73fb064b36108480ba25d45ac029fe6f195547fdffe90be742a042dced60cb2deeea3ef36c8b173b5ee789a247166612a404f7ded8580c3d29bebd070bd70f99746394b5553bc58f531d00bc67c9be7a653929ce9b6fb33664972eb332022c811e26900005da208a1a10f0d0870280)) <<< 16000) + 0x020488868e8430640f8130012e12002ae2442ca4214120017322006ecc4424d60766b04b2588406c41c3620c0391009a00dc7102004796b233419ac07a80c402037bf46fce00f2515891120037654cc410098608c0210047c8b9e9a6831eda67f42010d1b5ea91a06db23c3c00090508402020a020000f522082b1030987a84c3d024122030f201d8e2301dde1fdc6b0a38d2b6e90d63cc8440dee380e2822ea32f5f88f1aad6e3efa55fdb24834e8da922030f3d01896813a0209b14282d39883b358cf8531a00950e8e753c1307677e9fe4bc6d6dd8edaade586004ee39ca028e0c0b932d1f64e7e51e402498aeb88057e85068d8d8409ca2ad17c9adaaa3746e2cd4467a29690bed7e35eb5b2b2ded412a2ca39343d08020080220c0098920780474659ac800780110000100400001110000ae203012e2408507e39a38121bfed4c0a22a62ec7000b9bf27cd0297a876a812860f80400003f887888c40837c483e04c44a60226d8b664aa021bcfbd2600139bdf297012061100434256b0cde404196cf64f13801486d7da098410002200802008f02ec0203a42083a01000004c20001124000530880868400060004e04001338c080bdb14c62085d8f37fc4811afdef2424c30800101fe020fe0102b80c3f4041f8020001133a0d87f121d8c00cf381be620442842010b141fb77ff00a0e6eed16a92133ac4f6eed6ad68e28f728c5b410f49c79ba791abe665c03052179f9f4000f4c7e8f0027f30284bed20ce380f91c06ce381dd9edca5d048d851f8e3006e4c3f2f11de3eb809c38087168a98e7703a10e39e92c292be40db99de25d4bdb07f09b721bff32c25bb08045b2275e0638a065149878da46bde5705648bb0ba3aa099b8a14e09f26d2026bc95bdc49fbab51df8df3ce5ab1b5743eab36a260300a6e542526c40d213ac88d8cbad42c04cf7e69002f78855f9600000c366c14e688f5b9066d5a0b7fe9a9942226ad70fa154c0825770e08e302c076b1201e580b3bf9a79f9f2bb584bbe129988b18920402c70a1127686e5809132448133eed89991bbbb1577816e56fa0b842a5b303eaa5ee34817b25df36fdafd8d95839a500992a5b43a90b4aa7333a4ccfad3b4a152f62e291e40b5f66690805f98756078e13e19d6161fa9375cb80f9de3508fe4051473fc57d91a3e2cdcdddc851a70bdea9088913409475a7eaeeed034c6e031eb80aca3f3ab005809d21741442afaaf00fc0100031590cc098658480034ac87210c3ec57211db7941bb54b0815bfbb41b4892a08f9e3b21c0804a10b093c9209b53078377729eb6f8cc59dbed5ba62e4628c2e1e4b25dfc6f575c0502405c36faef25603e5b111c19418da3812dc0306b91fb3339a3c9080637f319f99f2d5875cccdcc531cec70372273419a242b3c120383a26e20004bef03a1f0e9b73cd4253b32a50ce0b989cc97a85f0105cfb7dea7f22ab2e331395f47face5917b51f218d980fd11fb12dce3504d0b2f4835173af6ddbc8c71ca9f227d863b7a06551d72450690a2ec6dd7cb042a3b135fbcd6b71dbea9539841ac6c70c59c91b826762488c6dd980000e184007cb487d10c3e4861f03380c148eb97128131180bb986041a5a8213300b7d8c291c6007e124400104251c2200807b8883d8441ea0b0f401079808244061e403c1b97b2b4d2024de240083015aba636423081f00807882b076c855b56682b24ea34ca052e612269e045b1604c0c0cc13783c12840f80422411acc7630d202753ff5e287097a605738211875a020812f002bea5000792641ea4c08420108903883758e5849c97da5420538cfa1f860225c679f65010800100001a6400088080019b9e144ee347c8a179eb4c9c1c13bce4634500528101e090107c0201e0020ef0106880c00043882e88c130261d4130990987482e45841e04e1900fbc1eb5ec606041a31611028112413b8c00ee323d465002100848b06d667c2d00e601b3bfe102a38950d1d0006276dcd01002d0bef2c250022008000084104701dbb10f2847a41698af75acd55bb75acd55c08da0af28c72f80bed93b94f40d74c9067989ee28e65090fd084cc20f18a18f08304b0096e47c2f001c628cafe80748303bf9fcc00e841d412b2ad525fb0209bd0f909647f94c8019d8728bc523ce8ec117a50500032721a81b0ee05c44a12df11d53045c9a705d281079ad57e63002200844801cfa9a1d1128642c30a3c00623df6b63002200800005619980a36d56e2224600b20f05061fd14258a2081cdd9c5e2832fec1eec0a00708a4f4b3001100422268be4aec28825147696c9e0035a832171801100400002b08000fe90470182800edd8879423d20b4c57bad66aaddbad66aae0474e2eafbca71757ddd7c2e352d5f0b8d4c10d35b9906018f32a02a632540f4a51084c01bd1a1512ff65cf6000000000000000000089a6e2f4cb97a678d217601f000000000f76c9dca7a06ba64833cc4f7147328487e842a78c50c7845801e235384d4dc9b8b78782fb52e94366ac5fefa0edde6bc6d68209aa1b8fd0b5b1f1a38d1ed90c135c4e32266cdfb51e66dacf93317230b5b0b0acd05a5b10f737b91a8a5c5dbd13579ba58a95f81d9fbd3c3cee9382904ce6e1b197b7c179a3ae5a6db81d046717fa000d8a4002a548768c83b0541d62a05709800855981c11d096784090acca29e8808d113ff242065e4ec1fb20010804341db73d428c00d752c429000f00200001d082600c3a806132030e901f080adad04940384e24144a409e74d5b7630021008403f182326c9c007baa0)) <<< 16000) + 0x89a2002100800003e19161259a31f2c714963fb51a206380cb8041236f15cd45873a457de5940084021a20078afe968076b38a155a00849eae42a7000fba37f98800bf16fe2328011004000041c80011290e80182180e45143fbdf38c08d93f039b2c20e3580614e06af1a3bf6280006abfb84025102200800008790004d321ce320e6150728a8330261960a00071021c85bd6a1561b1498dd0430fb83ffd30955f0488909dae68741f47803b1c43d41de27b63f947235a84fa0d3cbfda2a2f8f1a0453e063d256100599c8a78a8a7816858430448040000000001d8944e777b416f9a8ecbd79082e01297a94b6f1689cc7a8b02351960224e6682b7582ff0026c5cbfc99c7cf3a5fec9ff99627d2d0bbe0ca39785c9534f936a800220900220021c6720e2110011f69a21f76d5c521135d5be2890a0c34eb00beafa7fff7cf5070863c57b58a95dfa96ca00d01517676577802850fb0a0c012732a7f1f3087573ba3c50060ecbee763dbcb58b970500014cc6ece73421a55ad287adcca97a4601a911e4d8b8006c87f5ded8b9a2919002405c325ed063242805e0000e28870a68378a41c00a004a48303180c9aac88100a66938d62b1601c8a3f2f87140459347b2f48c006220e8d510400a41885cb8a2802679f4a0407d4d5700d0000201eac0a6dcc4280b8f99d285832e1400c00008ac838a6c1bc0760bcc0af84f68ab63042759be1d2769d2891f5c50dce91d4cf191467649df2b65292a8f142bae3e95df9ffeef46498e0229726380e069f88e1555fbbdf85981da9b653f7fac9435c46b597d9fb7a3cf09cab390890ebad2fcf38870b25e0a00d2f7aa90f0d4509630e704aea80a4a5f2a729b411f4a37c2a22d3b0cbeca2d3da70a3b3fcadf918f6b213cc2ed0002575ba01b22e00d2d92e5ef4f430ea789c065fbda7dff77fdf98491d994a3b39ff045aef530fa3514b4d07770240013d00842a5c5ac8cc6f6ca55b2d343e9047ed66fcfd7230bea4ceeb8536917a20a6948a20c3e33925f1af1280dd9061e0d0c2a883a7e403028e5e4f59752cd2d6cd8ba66b5d1204f778319b11bc026721a40ea41b995835b19cb629829c5d5f77f546079a5a9a7f6aafbaf244e0443ebe026723e1df1d99fc1faf602a257269c11aa15f56e471021159355e778a2bae7c6fa10b181a7483fe7e400000000000000000855b4361b5acdf3b3356d0d86dab37cecca10a1229e10c11000e00000010aff1ee477e693f8dfdb8d7ae30f911fb692729ab7e022cbaa1a031feb1f54559ac91b02595849e3671ecd270f15e8309eae60ad8cdf3c2a1c7ae035dd763f62d1bd09d812966fcacd68aae3cc72cc542b8ae4929df3829ab4295645398964d43025e1ed163182ac03436c0400008cc0800200640a0000d22000dc2437cc61bc630dd2186e04c36c261b403e281dee570a2e87f4c55e1014e384e77840dc65b9b2c3b073ed0e30637c4122b8ba1824f1f012b828b63876813459198e1329660e5cdb1ac8c9c322a819c7fd31bd382371d15b80962241cf1bc3b754415f0e01dda25576c2307006b0ed0249e690a7a23521b5889c9d11b364b7c1b52dc8e38289d3fee5d777c0d8e37e7a8ec5df751d8baea0421cd15db1ed8b3f7336665c45e8c5098bbe994bd4a85aa29f67ac61b208715c04f2f5dfcaeba3feeb52b14804000c73cc9ed70e26b4b64b5e2c0873a4c99797528bb993e8d1b5325d0e021a753c0b6edb7267be50319ead2722010020089965d3ee3ccd02595d32791020f804200802008000022200016e6008020080d90106c00800013082c06c35c060a0030570106b00c3540700001004406412e60a7130003fa6f4fd0000bfe1443a3002400800005818000080222272e36214020535a639e08002685e05f8c00840200001524000398c020040100000444350361a61380000802201eb7aef0e3027c2f0b4278091c230ae3001f00800005190d20582800e0180200800002221a20b00015c209e3204e150268a813054000840600002008d000e2bc6e601867e7328800740200000e662169195d44a000f92d4039a0158ff93c91821000400002a080c00e0180200800002221a0220cf0d067068334341980b0cb0106500800096086496ec7d8d987b9a8a1f752861b00f80fcbc8bfadad147ac5524483bbb09b27daf55b23b6c934b3c87de01098a0d0a48b0ee152118106a70a4f1dc10fd7691ed688f9abde884b28f352c7a4805e1480aa7f6da92b3b8a98e909fb198a56b739419b001324d5df239b5f5df960cac361cd6e19d94779a93081257edf8a4d1992fc04d9c58e39f94af0e9e48d5d199a7399434fbb88019d1e1dbdef0a7e8b12ceccb7ec756bb309fc1bdcacb50f8caaaa9d07a40c160d901b8f005a55cbeb16e5ca9c78ede9522aca2d4f8100300f3fe88a7fb58d7fdb4a7a422d0cf3eb0020645fb187200230740aa3e43144dc1bd825d95c8a85e16cc53959d3b958a247db1e8711e385459369f6fa21f2b111e4a7bb9e9f058e47fb80ec5c7a1d89f9df88641a6590f688a000026c382c9adc50a8387b529d1ff84b34eb09135800bf76a032658ad6b35199418c6f9124056c738dd166cad6be025154dc984570925cd6d46aa9ec64c5a702e47f386b1ea3363b8780005b390c835000a1999142f09d56afdb5906f234cfcbf773ba34cc872e794b2564e30ff5e3b04a75564ae0670176c7234987d5307e884a0db55321cb0eba742f610b75d28229c3ba33909405a2f018006851876fbcc06fccdc412bc9711254f88e2d7ad777896de427379fcfdf726b8)) <<< 16000) + 0x51aa00019fa52dd3dec419de7895de4943c467fc6f21e53f4ea7fffd3d900136efa392d920003d6bf95348f2df4353843d725adbb328e82ac0fc9660d45f070bfbbae78d0424e80000ade431d14160420c6150628280084b8818a2c060454e2eafbbfaa303cd2d4d3fb557dd79227022682bca31cbe02c1cb76ecbbda9a68f3cb4af5c3b62f91b7efd3b0e669e080b828000000000000000004432043411c11412801000500000b6f329aafde564784b710516f260865076b71d3923bf07231a07d5cfb04e2996018568c2bb6b43d1a66773dff4e023437deaeb09dfc12ae81e8850c89f06cda20c3cf942e10203f8ee22e3419578c66ce30223b4077605040e7819da22000000ca80460100c4050000a090c3410611a8304c4180620bf1d05f06800186cc0c5e5bdcb3328d8031413aa15a922c476d74105ab8a68c0060ebf80a028250d68c98a8c080812a6dab99c3451e10282523de9f8396f9fdc080206c13700681ed0ce310f3bfa038e9aa225531683b7acf463241094dedc2b21f03c0000b64801d6f100d0bc342c1d920d034eafa902ead4cbfd5051c51afe0b1027b17c000000000000000004039c4c740dccf3d123cbc810dac00000000008d52ce2e6d44678d25259600b77b6762bbba25fa5ce69748000000000000000000000000000000000000000000000005d31432001c01800540858ed3819c5383569c9af99f089a6b054920ec117107258e4a34aa8afe8265965cae3ea102af740195b3c62e50ab30fb2290104404926c7f1a28e971ed4b15a611bf932c1d9b558f50bcc5a7b7fddb50f9da0957bdb13b87a1370b921df0416cdae91e5e99b8be40581b0cbbb8c16508cdb50a9bb5c570e662022e979507b56151b014a4747b8b2ebe2819cdac1193595dce6bbcbc4cd1c6396ea0010684036f50807a2918e736efe199f63e86d5cc7ce53e3cb5916b82440cdfd4ca066fea635e4086d5d79021b5808af87d227bc2163952be1f489f70858e5442132832431c30c21400500004cf5bc4033df2bf501ca9bef842dc4e6ec145b8add642f8ab789474c3734ae3418c502fb634b3e22cb9b57550e7d138cfe40923dc8941da20af55f81f3615eacb6bf7075aaed4c3f2b791ca21e8cdba602fbfb5d8a5513accab22ef50f044605ac168b30e25cab8e0d8e370a31bcf7478404288204282580200100020000a61e6b7b32cf9764bec79000b4cf5465c8a728a9fac2aac43939929888ec44fd0dac3a807f3de4bd9b6347815ed0c6d3a0a470c2d5f8b7dc038805cac08c92010a1225d84002c5ca7bf0c0099614c82080004c5844010a1866c3fcde30b83a607191c414f63dcc820004ca084010068020000d0217a1200024b21785b0b319d8879986ba4081e5fe00f12284163ba16e8608000e8f4e580a76493a1940142a6eae40a0000931c110040050140260a00017b2000d687ebe0267199f63e86da937bdadf4ec851a0824ada1b0dad66f9d99ab686c36d59be76650848510a0c40c308a0450100491c5accafa06cc9456895ca9ffd275d3115331a560c0049256f0613297b93058db7ab10a3930181e983ecc79e58721d56e0a988741d8dea4e62e5fccf0b8d16462cb324aea061aa74810175b4361b5acdf3b3356d0d86dab37cecca1090c28a21618819000a00602010acc624a8898e8c1a61e592adebca748167e5b6434e578d2ea5738c3c0b170a051b8b898a25a51a6cb220659f4cb6408011e75df3c804828440100260100007b90bb1585d0ac2e4475b4361b5acdf3b3356d0d86dab37cecca1088a20c18818611600a0060227c65e833a969406fe1fab24190cb77c74e2b11102e85b4470fec131bef5633a9a821ac77206512680a00804c040004a8400176485c1482bc8411c3a08d1d04608822c2400142242dce611e339c97c11965005d8fd030ce38ae8a31a1f58231f5f013391f0ef8eccfe0fd7b01512b934e08d50afab72388108ac9aaf3bc515d73e37d0858c0d3a41ff3f2000000000000000004239c4c740dccf3d123cbc810dac00000000008d0a0c70c800700500150007a9dd2b86aa778ec8f13026eb41da02a53f6f387320b1d1fba2f404ec117112c644e889e22cc8880421332a5c0df6d61150fcd0356c316b2399c6ea8c2598e1dad8e64c50a4eb2c6ddbc3448f5c9bb766ada8e5040a82be9f5a2009cd02de562e91ff23d956cabd37fe83f236e97c6829d1a5ed5814abd7e3400f8dcd548421e9909a9cdf17b2e3b480d894eea1fc713779b77f9f301b309007773c2e2265f243ac396cf8c8d0a4f9ed90e6f09e16d7315fb49d17156b18006f0b48e5a7aa94c6f2139afc303019e21f23a5799295620eac346a12b2c0315551e1a14148a7609eec044a22ad9a2bb73311d03b003bc0b1a4a10d52acfbeb2abe4dde9f181cd57428b95d8141327ef85115d0729c16843b5bc2fd482c07051569c53f4972d75a26bae9c7a490f9b4c6646f52120a7719a2880378357827f9de94e894caddfee5835f674d9210a85337432fe6f864f81b56de4c115b71fe87b15e90209e597052b8f35ef1f0baa5c3f380e865563c7555135d6f3d9c2fcda554dbf46a014bd0129468f172bc0212c117a2396c5af8f14fca4cffb19b58001197beff2474b52f686271960750ea24886a3bdc5eff97701e721d9794890062f867ef4ff169338e8ac24337ea28f1eaf51c408caa183965f1563e616b029c57689d7336707355bc1975b4fbb27d3a202a3abccf61ab6019a7154338c007917b28ccb58a9bc6f46dcbe572e6381ffb9fc9ad9531a02bc4112ad8)) <<< 16000) + 0xebbda457bf11a3f272f7955adebff6d61203a5668108a3a4c00d004000fba42d85616a2b0121185a08f0443ba3f38610d7660694176cd59f777f8e084123edbc02b0a900413f1f075e9927fd54ede1810abb02c50291019e49682650e37af8c5df8b0268d1468465bb52299a633680c2aa9477722400834c6a8fad06837f3dbc0bac1dc45f129c100679a491bcd1293f9c319d38575d451f5e2ba1872b72284800ed1a5a57a96fb3b2b408b28b48563a90bb6f2aedbdba05a5208a1a8609eb44e5dd30d534d398431d22637f2958dcdd407d831a2599465036649575dc2c04610a321bd4022e220c48d6b0284276e55620c9c554cc50326401e262ba4e4af176f26de337394ad6253d6f59a57081398f3b60ca42d9933a944460a08cdad4d99a3ab400cf9b87407f047489b237c056eea03d00771a6c85d30bdb820ff4bcc2742c64f6d00901645b801ebb1be01934b8a8a5374e0f506950d2f32c1c7acff6ed2eff73b702ddda50259d464376584517c30874d7b3940093a5aab2cc98df1812bfdda0707fa6c755c7fe572ffd2ac571bf99f91f43fea0aa4ae36237b7954d97dccbaab9ad2254015d575cf65001c4444213be453fa239f67e122903639bf33704ff18c5ae412857ec0c9dbfbc863ad2a480340100045e10b1090006c390a62185290c2cc5605e23e827a506159f21ac23b85b47a31d0f5f747aeead00272e180000000000000000000000000000000000000000000000006010c33012c10c12c0155083b972c83d7759470cb6450954434c16e86f3da1c22da8b712e7f0470fb2402522f1471ab1a7d87833a5c85477d46a4f5d1f62f7f150087f9606c9aa395ab270718861103f8baca9758aee880e1c3b83f2f0de3cc4ef4de4646ec00d039d9a2e965310af46742a65a3e14c364bbb4cbc0297ad73ac601a44cc1227fd5b6445ea4765a0000000000000000000000000000000000000000000a8268a40a28a70668610029d7276bf87daba2e24e2218c7f7bc1db7a0af5199f85c043ef142140e4c8280ef8b97b0bb7cb0f55cceb6e250bbee50dd7049bb843cb6f24f3c17a52cc61238858374897decf6618c329ec0a0e4360685445174f08c40a441a19d2cd9cea041c20021105f9d63024cb05556e302042cab2dff57100097cbd544bc14078a1e54e8a40000287053c8c0102369182b028000112109c1184d88c2c81734c6de117d8334925f8903ecb00906d7eb2e828f6fb26200000000000000000000000000000000000000000000000005f12883461c41041813001c010004000c1400803400087c85880800232c80a02804c14001cae400adb885818c2bcc615c2bfaf8099c8f877c7667f07ebd80a895c9a7046d6b7a84f23c05ac168b30e25cab8e0d8e370a31bcf74784063861824003802802a8aaa5c4f87a8d7926786866f27f38a30ee296e83db51f2a00a1b005e3c86138edf9cad9f79c5ba06c916b757fbefa2c344b8e337caae6acfa47b61d9b5054093a26b853cb5256e0e62e1c42e824650c87dd799802b8308ad4ad1b941a44817f06db471afa200cc118dcd5b8e0898896d542a3b5132b28130b01511328e180202725f04654897f3129628df616852d4d3d04425427bdb053ab066254e2f1e6fea8d6010690095973ae0e1a54754d02a7d1fcac317996ccb4704532da19d8af0113c2e54b7869bbb80000000000000000000000000000000000000000000000000031b55de41b899816a704604584580098a4f7fd869ef0a42eeade6c3f2cf528fa9539f118d69fb13b654e13adec46178089f1caa246fbb810d4c18fcffc54bc865455cd6c5966eaa41d8c290941a7b6ff1e77cc8afe3da9b71a6a56b615f383c573b92e7059c40ff09e35826724360283314b75e29583f970ce0960fdd8c46048f5714892c25812626e90018787505c702980a29fc08930c1080400004e88003f990ad0985604e0280200880b08027b00828d4c3560204d1ddbc0126203a008c0815f938de84142fc260d60488408c02000010e4000518e04101a317120bb5124fa601817fde393041e00440100401000004442ac2413c120aa0904e8080004c480c02f085209406a504537b4b4838007c296283018ab1d30e014102000405484826424150120a70900009590260100021f90a62185290c0bc37e5129e4a5aadf0e3d29205f886b2028059681ee301e2c83a5793e421a28059682f0000e1e09248cbb6a8000a3884dbe15001f41c50b00b152ce2e6d44678d25259600b77b6762bbba25fa5ce69748000000000000000000000000000000000000000000000005d14874473c72452440813000cf6e1e6eb157f25923250cf25cea58ee12ebba953b0205b55ce8896627d7ac4ec8262fd2daa8d3b632edab26d1bef385d7dccb866b9796a59c5cda88cf1a4a4b2c016ef6cec577744bf4b9cd2e9000000000000000000000000000000000000000000000000ba288e208486386882102280200060300401a0004126230125d88e465081b152509d12203d91aa81c5061e9ee432d1018a94581db01872184eabe014100006216543041affa88c002520409805000037a4001e2cc101f2e72fd0f280789b2471c23d584e30420bfb1c5b330410112a880100000b71adf3c036294ffe4001e84802b84110022c20beb944d020aee58371b2c000a94007050006ca4d211a0411002000037085204828c14144020002bf35732815508dfc89ba73d4e20183c40b6925b3065567d0dda1e8000000000000000000000000000000000000000000000000000669ad23f2531b)) <<< 16000) + 0x24703f68aee3dea94d3454027c9ba45a44034000000000000000000000000000000000000000000000000180870c50c504204f0020210040302258208004b01d3320668c604016bc6f22824faee5872304210080508280002fcc511de6e0de8d02c38ccf9b5c44500393865b0810a0f6426d40c38cb1884614208055d4a80040029a82ed920e0000e4e1c00a80026010445438b0f683440cd3bb75284047b35534414ad4d81240184c268e8040051b038298008002000025464363f7a30c20b72c4dd934002cef84e6003c0080a10100005990a0050001ee109f1104f088274140011a04270561362bc98619baa959d268c3c38c6ff59dc580000000000000009de4afa6aab3ccc1e88c31c11210411a0980980040380401006f05761eb63ccc0400ffb2090a082f9dcef7630423008000058109a0584c82c26017c791d37942050606f67de9d0040f5b31919e08acf0c86534110cbd233850039fec0bf0301ecdc9d29211c308c031130889f415595b4b41d0669b80e040e9444fb547c86e250439a910203489ddf1b6d8e658c67040f0002a59ac417ff9f31f7118005008090d28bff40f9aae25f4b3b35c1de80036cca802e0762495a0b04808898069ade5c24300a33289090650abe403a218882650541800273ec12cc0044010000136212e03c98619baa959d268c3c38c6ff59dc580000000000000009de4afa6aab3ccc1e9f47f2b0c5e65b32d1c114cb686762bc044f0b952de1a6eee000000000000000000000000000000000000000000000000000c69a636f08bec19a492fc481f65804836bf5974147b7d93100000000000000000000000000000000000000000000000002f9a469e0820a402000c058000401b31f28619ef2626b26549448499aa461028415f5458810587157ae0800572422198007c020000248667891cab1d14cdd44d722a40924691874f355528405c4fcdfd22406efedccd502b4a0dbbfbb22200008d2ae8da55412a68ce5000c01ac8d687d52d8958ef292fa62aeedc82ab05ffa802e078263e0b91aef26227d43445a421253b9e50a0892b3a9f08003be61804a00400100000fe20006fa40025788006a11f28079e167ce0a798f3e34088308002012c1a0000942001ef842546412832093050300080049e8d0c472b4bda424b02e812eb9225e419e91be7bc0d81a8bd594bdb2e2a54b00a7391cbe480176bea71437849fa99f7942fc2db291ec79a2ae78940971108821250b1b4f0673c35a40700010838777cf2a1c1361d992bc1617fb6f8fe5767af6e14b05567e6ecc942a997cb3f6391bced58049a79b44c53929afb5cf9b20ae4ea66fc4dbdc759aa49ac3eef9a3eede94085026ed445fe2e468ac0b37c83039b362049199ae6f4e8c61e2b7170cff41ec8776220938716b507efdee13b0ceebcc7b8ff43de3f31534f4bc93992aec84ffeec48cad687cf52a8004d43e11ed576e209dcc5d808973ab48d45287621100b01c613bf838b07cac6bd87345781b009ff8136f0a4b9775643d632c003c786076506bec61a4ef4840f60bdb955e6fedce03d00d6c9b45717bce476c3ae3be37fe4b0912b157ce56eff8170ce734a38ebdd539d721c471f9d47f8d0880fa1685d8bb0372472a3c8c756909dcb66a5b4359966fd78c68d214012422050090488482402411e12000b9b202802013010019e3100427b211c4208d210460a822c24008d76401e238845148224a600402ada1b0dad66f9d99ab686c36d59be7665084440c7046044046005004008e1ced23ad88e6e6a682e529da96c02a2a9d9209b7377e41e6f8a80400401924a24f4a2a0d0cd5a774c68132d8e15dfe5250e30c9ef3f8e388c34f47140818664ddf58503ac0c64498608487a6df43803c21688a000004e504401007921f18584dfc123899e974d9c281f0aa3eaf900a1199e4145007b40187a20023d8ad4f00000262c210080000a21088198438cc2182724235b13424c186b3a432c48cb41c93ef185e95f82280e1b48f21a70e02d4613b4a13041080428916dddc860b1c1e0e99d528719af6e2a871a080ebd512044519a8db89009cc8cbc526042200851255e694b92c72107dac7143f023bdfac719653da00040804b349261c40328386a8812ccba10e89c10840200002bc4000ac084284c21006106020820184080eb686c36b59be7666ada1b0db566f9d9942112ca38830820724520528310128032080200db2828f76147308131129d40b220b5b3a1d2450221586308141c8bf8ac20116cc0cf3440418ef28dd2704220080000b290800583f80b0b07335e5f091208b6271d2c30c370191c40befbd08ab181666eebb22a0044008c2c253e6142922224c5d1602c304cdbb7ca2058779f958c605d39174ba880c628f39fc2c0020c67b253801180400005a882880ab686c36b59be7666ada1b0db566f9d9942112482862462c42442c31023c02c0c80008037415e518e5f0175b4361b5acdf3b3356d0d86dab37cecca1091859a4943123122161881120e0000401a000292417016000532417034000ad241f8276485971b018b222f86b20e48614d0eb41203a98278540a1074398534c04d8ddf262583af3081c39c00840216500d969b1c486dbe602fb901c78a49e382848f6b103418094dcf5cc45838905adb614000b85e9f81812e8e1fb6d000440100001913650a103d230e2152fb2fb6591251a88bf203d0684a3c900efc4b1e26500210087c21d5ebd9002eb686c36b59be7666ada1b0db566f9d9942122ca3882832032412013400c0c00008034000524800133)) <<< 16000) + 0x104f0903e8281f0060f6020005dd20f422000e7220f24307811fe8a682147dd77d358902055f08757af6400ba6b7320c031e654054c64a81e94a21098037a342a25fecb9ec000000000000000000112b686c36b59be7666ada1b0db566f9d9942142041c4103101180000219819e9c7ca9e5b0eff2a69c9efd40647c3f40d9e61baeccbbd2f07f5777178aa44df10196c2c4cc93ba1a242c60b1bd11de6deeb49d9466b3264bdf3cf88bcd6186c3aa968c9fd400132483b9681d8540ea1a00184120e84b07319e1b653f5af49d106ca9483ab889fdf2242e4f62baa2ff9f9348aeef7b007622883842841025004802002000d3f313f133bbdb125ddf16d971d1b860a60ba190045dca612a8af96d3808a13e6046e0b94ff7cb3c12219c2a8e62757c28ac9985929b142507edd22787fa0006944007c548392881c5060e00306f01d8d7a7d470316182288631e481322b53c990012dcfdcf23002df0c8d506002673ac9e0200000804c984401006e01d38babeefea8c0f34b534fed55f75e489c089a0af28c72f80b542beadc8e20422b26abcef14575cf8df42163034e907fcfc80000000000000000109d3d58484ef40b582d1661c4b9571c1b1c6e146379ee8f0814d2050470020004002d143ea6cbb505286bf62fd3bd35ecbebe62bd812b3c1b32fa08fc1e0f3c05b9d62a065c8b3a9444e82de8f80d60a3fbe84e520b67539bb1ae2b7b8b18f679ae2815bbebc72bd9cada9b7a14fcb5a86a8494d06d158360ac1ac440d42306909c4c5a3f2e5212176f830658408351ae51088035258fe300090608402143c408c7e3650c423894508c144e62e5861016778614c8e00051667bf100a22536fb42608220084090708030ca0380b967168d1b128873c230225e454c13c0104116a59282108042a80ef1cc9e0d1b236791d8784257a1603142aecc4ce9081020fc418894108402000020a4000894fd7c04ce333ec7d0db526f7b5be9d90a341048e72a3a6e9042f6c454d140ab415e518e5f016ea572a866f104ce335b09e4c67eeb90ffaec024fa660fa1ba60000000000000000021ac168b30e25cab8e0d8e370a31bcf747840aa1e60a282701a7d1c81447adb26575293b3e148ea51232ceea7cb2d2ab722534b8a65330ab7a6627bd031e733a5d9ba678f723d236ed026cb9e2904fdf9c5dd37e085eb526118d14bc74ff46bf96ad743b2ef30ab16fb6e1c6bd0157141be4040d4b0ecf14158f54c060b8f220f0814163149d12120210804000035c80f008001b14c8d0e1074a4141f4aa639ec50c777078826044275ae6f48037bfa8e3804a204201000010b20d02a000b9531302ce288d64869d6525a22424fdb7ffd9c0c02c07e5c901084021a304ea3e900e0c296dc31668735b93dd5283265e69e7c80042010a184345b55c507f947f1a74801728580c9e006f19868e4002100800006a90001c520ce1204f09027048134240981200032120cc330650983202818c160c40ba10531d161c586074469d1203382e441d940cc50f7f700090508402153700c10413c649454930000827cab608c2078021c282c69883a000bc42f9a0404049606711821000420080200800002220001c874712cf5de8344a90cb9993c203a186873c01598297124042000868f45a40f4689cf70d9a4810700100000e44184040002ea6c56bcea4c65857c4e9ce93021c6ae4511820f8040180040be0205e01000071900043136280955f734c101d27c500183912076aa3400a975214c80042010800008020000088f080bdabd294223b3d414583049b3cc46003c01005d0100005a105c0902d828168060b20200023520b0330500982b8281581742190a4fdd1422b3b9a4c1851fe6d045205b15cad8940e33ff47094007c021421ca85db99e114a1c0e12408bb7a5e0940c04557422401d062dbbca00400100000fd20aa0b0540182980814807000010047019ca86b91001c0040000241e141026afd2183c05b8b1e50018353b9113042100400005498891401a6c0a2047001e43038a66ec34c007801111187015f44606f43dcf21400ef679c52300200080000531051058000ba905005c8a3bf3f6a7303524d70662c39d0f8c522c1dc5e690e3c04fab9fee0094408002000020c400103c8278c81385409a2a04c15025868001bdc81d988003bd882518e4123073f355103ce3eb71a110410804340ae3876a8800e00220000200800002220920a00009a30040100402380811804000098412037e2000b26582207ed0b2018482080011a04a018b6e42083c01080000802380b6ed679c2003a01000004a200010e40003bcc0000401140c74c59b98057d53634800700100000e0411c0408c020000d7208a2200028d20882b043058210281041741020f577d4d063a2a01ca8006b97f39d2002f11b991b2021080401000607e0203e0181e8080f007011534bc48cc10069d5128f0ecd5396f5102373e76b00241020008404347d3c14787c8faf7acb0f57fd402011860f80400ec3600017c60280200800002220003e040e8740722a038150001c510372d01b0e80d444068020008a62066720320d0014241a71757ddfd5181e696a69fdaabeebc9138113415e518e5f016a857d5b91c4084564d579de28aeb9f1be842c6069d20ff9f900000000000000000212c168b30e25cab8e0d8e370a31bcf74784081026003002801013b7d93cc167136ae4e481d6e32560f736886a402af7b4fe75a6a31dd53eb9af8658d81eac280000872cfb22307bbc6525e5fa47012fe4f1f6d64ce6ffcc7f1282b1d0f17f)) <<< 16000) + 0xddfb73c225412241e817868050140260a00054c200674c40c5076305ec9f1408d827ac160f8b53151858856f00a0927d82a0114b3a2c1001c8ddf3ca7c9625d0c01624f4af97414f878600e2645fd1aeabec700aca3b91ff2a60c420c0dd255095cecb1200073a521a92cf7076dc3c11813258f1001f1a0af28c72f80bd40c354e90202fb64ee53d035d32419e627b8a3994243f42132483842041012c018041b223f0e427d2caded388102862f2e245aca003386f58c394f958ec2ee33dd4d5d8a2286cb63820c5ae688112d1faea2288336409ae2c1464007790c082e9555fc4074bba88ee8200131410804000050c81812e07dee8f3ec0c159c342e8a200011161080400980400014a643013f506cab54e579469d482f963604782b396b8286c2d4729ad65779c066729bf6ed45223a506a81430b8ca9d99c0eb4742876937aa40e112e998ed36c1802c1d377a32cc034418ca1e37e2bf8624d30caf40c0b714abc985ca54a33101d3ae2e51faa1d21d0168807997a9fd5a125a3cfa681bb9fc90dac72104108032a5dd052ccc2d57428633b81a9dcd92944d8f600bc140280201301000265902e250004cf102d390161680aca4054520291501404800346cfd7c04ce6ce7b3a79a318a89ffe4a8273c11196e8e9204b81644861861024003802802a86208580aa11bde071f7150c111f1b91011f694b785d0d939d3bc3465604923d2c3775931dab3f526ed9c8a1246307e176fd7c04ce6ce7b3a79a318a89ffe4a8273c1129c5d5f77f546079a5a9a7f6aafbaf244e044a160ec90681a757d481756a65fea828e28d7f058813d8be0000000000000000020196e8e9204b8175b4361b5acdf3b3356d0d86dab37cecca10a9628a2881920006c658f8305569d6e0586abee5900522168eaf5d4127dd471ba2c378c0933c23c529400c0edd02b0ddbfc05ef2a6ab88ea42f99c0414870f915adb8c145847b62975923b6cd37126bc40cd68d978beffd6ac02254b7b3bca0ab5a9775030d53a4080b93a5856d6311af90b7760d8cceac0651d45ead97a09d7fe600000000000000000104cb74749025c0b33471c71c3081180000279252bd64d7968ea9536d80498a76026af27ea1542f9ae12b6d44853412f82c29312bbe71282ceea68acbd15ac118051de235238af0071849b5874461ab08f78b0c0192f126aa40020008400004010000044409c1400024668005eb28783a6801cdca622fb9cb01bf01786e12f7d970de2bbcc28a15a81f34d4bdc69a8d85947f7f1be90f8ca5d09c17817267cee4608ed04e9a30080d20377e46b52c7b0d150c40842cf625141e6293ff7e6c8fc20f6eec12b3b403c915c3659082ae770015f736d1c21c3eb17b854f5c483176d088cd0de9869dbeb3cf6558cf2091e69f2915b9126ec740265089bf57275819f31259c19169d458598ef3a12e494644dfd758af072498fc719bd091c66b6fa6f95331c541b6875d44372bf5d287ce9a912824fdf068257dffca56959e9d033fb50a88017d97339c4b23a9410c5d373744cc41b9ed8000075a204c02000c16204a2b0241581184e0e1ff5ef9ccb4d10723c962432bee62555d47dfeacd6fb0d0c65dc61d88f2d07ce9fbdee20c6aa67855fd6e052697294d33b4804ed7a99a4736c6504d894c690e3f9c35aad4a3def0646066c4803ed01c2bcda0373e4031b1b0554fce8fd50fda738e80cc9af000883402802013010001bb9021250100e80058c480f9680789403a4a01c2100d90806864032220181100b848058040033844017164803f209d86d5de967399e63826266d1af237fa399fb2d751fc27fa200000000000000000000000000000000000000000000000003088e10e08c08a0880040089c53f453d5dcce6ddb5026d9aab14bc27d6d7a544af9251741c673995890b9b9e77b2d3f47419cfda60e486bd5625cd4f344f836408643e102efc90b26004d935a2d6e6d9ba45ff17b01132c5c8c338b56be236af6c59d0645e2e2f59bfc98e151b5d5e628c115af837fe020924de49d80c00fdd5cb928a00732e011206007f1c28df8a8033921200423d82f19ec2d528afe7b305eb2bcb86fb037695b772dd56c00000000000000000807e19047b8f4f6a55f9ecc17acaf2e1be670a65221cb5c4300000000000000000200e004927fe8772becd28c36e603e29cebd644c395e936428c0000000000000000000000000000000000000000000000000c2640c4063863000802a8e159923e857112a0f4f12708401706077f31b26ba4830d1fb245818538b086c4c40d567c66d848ab0892e8e96436882dbbeddbc67a6a6e0584b85bbe9242b2931b73d0880a0fe104687955316f7eabe31828b31c2439b3367fd919f1d049d635500521935dafe19047b8f4f6a55f9ecc17acaf2e1be670a65221cb5c43000000000000000002028583b241a069d5f5205d5a997faa0a38a35fc16204f62f800000000000000000805eea3e3678d04bec51e386717b9ed9ab8dec9799d6f92e6c000000000000000000000000000000000000000000000000003119041031219018e181d657709c43eb2794b0c00e23f65027d5636b76869d6eea35fdc17874b8dd1179f875a5c65faac2a39dea298e27ce121497097cea66d369b27cec63ae7c123d0d164e21ff50b702cd40a8f8b3cc1e2ab181aaaf4002a2abea2d0150900a00804c04000de440038a08090a8003f68808968040b401e4a00e25006928030940164a00a190048a80205400e1a0060500280801004002b86400c840043a00101000008048dd88122059)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 34 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case5" = "QuadHeightCover18Case5" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 34 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case5 private def zz2390:"s0956"="s0956":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case6 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l17 l22 l23 l25 l27 l29 l31 l33 l35 l37 l4 l42 l43 l5 l51 l63 l67) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l67, ![-0x59514ba00, -0x3075b6cf5e,0x7da287718,0x39c4098fc], ![-0x2a9670cb0,0x7da287718, -0x23a9aee220,0x597f1256a], ![0x16e3600,0x39c4098fc,0x597f1256a, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x10f3ece4,l5),(0xe30d6c,l4),(0x1bf5866a,l11),(-0x2ce97392,l10),(0x11e1a3000,l14),(-0xe3bfa20e,l17),(0x8b9356cf,l23),(0x2b61501be,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x11e1a3000,l25),(0xfe5e9b78,l31),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x12239f36,l43),(-0xfb7b95ad,l42),(0x2cb417800,l51),(-0xfb1e197a,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0xfe5e9b78,l31),(-0xfb1e197a,l63),(0x2b61501be,l22),(0x11e1a3000,l14),(-0x11e1a3000,l25),(-0xe3bfa20e,l17),(0x8b9356cf,l23),(-0xfb7b95ad,l42),(-0x2ce97392,l10),(0x1bf5866a,l11),(-0x12239f36,l43),(-0x10f3ece4,l5),(0xe30d6c,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xd812018601800000640b01c300c00000370880598060001a01040098c050000000c8480e60100000006824063008000000221a051804000001104803cc0383047827807448030018c2305401d401000c41783802ea00800651542600b900400000ee3080d86020001185221036400c1581842080c9200b4f0c50850216d00605a86708e07b6802802f47e0b004940102e839c230024a00a000360c8440d900300000aa20805060203303284500d2401400002888203618080000000f07028c020000c30480364602800000003f00b200c00000001e0059006000000000d024802003088610813a80202083184200f14014000000001c029004000000160b014c02000000000480c401000f02106809c401000e81a04203c20080000008828030c03001e0420a00788020000000844406300800000046220318040000002113038c02000000008a026401800000004700b200c00021c338069180a0810e60b00361005000008419007260200041c36401a4301800000430481318060001c609006c8c05000000003605e40180000000044092008000022022043980800000c4110120c04000000000280e40100004182401b230140000000098179006000000001902c802002b0480b013a802001502705006d40128814208800c6a00c005c0a01c0175004000000004c0124018000000442c06300800000000e00490060000000012014802,0xe115020405cd0050738b210e0526802800000341200f300e8619a1060171a00c0002b0f04c09d003000000001081640100000000014062008000000221e0298040000138110058c040001284c12016801800000001e009200c000001a0500798060000019024030c03], #[]⟩ def dynamicCode : Nat := (((((((0x124e8ead441724827f6ab86250e9ef49dfd091cc2857e6c8e0043a20dac1a841180228aebdec3e1628928945e23e2c84b985357728835b10f9192c601c2471172c11c43020ff200004dac7142704240085153c245e34e0a245ba2376441a40005b8d8002c81ab19af1dc5102db4ba02e0b18222f63ec3962057894ab732c018b973eed2c4021380800006f48001a598229b6918c0103a467404eb2c619f6b241248cba0b69ed4600f609e2ea84009e10adbc1260c230080000a09a21e3b4cf2b62c208c9b726f569a8b1855b1a6659a724669a4de4e940c8190a593e92da22440d84cbdd8e4850440a4938db226c6dc10b80c14417ea5f87858e055bdfb9103c57dee06e58ce42895a0902059a6963c3013ab90202b3021100400004dc82604812c1400067e412827228121f16d4b6217cc1851ce6f04074aa3fb848820756df856123d507123341b91c2af7e020c10a0f8d7ee60ca9f514007196555362cd31c2000854af9aa59992282002dbc6fa7e0be4a1828b74b0395ea5803488ae112f40c1f83a0000b7c80b86c05837238caa471c40c071e6ce27788d4450a37fe6e5522c2051408de843470e2956b515ee1c040831ea9e54c7850025fa83e3f10026d70c2d02848f20d5d4941749401d7604d28579971d0cae14646cb90d20e2936547f38ddaa2b8ecadfc408289953c8ad17818c3d62a280b9fc4f83b10e1b1ebcd4a031d9cf14200ca3171668e54798fe88766fca18aa1a000029320941b9140ab49e502c17723c9136cb5c0a1821e5d447109399ef71b264a2b461063129fa026600cb46084afe0079f293077c500f6538b17d6a183bc20015e68ca276739ac8409b67d017041b178aec122969c51001e00005364124640902a047050003bb104621e1aead6ce1565becc08198241bd8d3506001c25439b982ac5cd802044e7b9fb6e05498060408b463be439eea04091d0b30eb2c226010019d33eeb99b286106f0758a2e068506077bd07a0774e45179517362c3b0640001541c206cf96485fe8604c09f24806880c1280dd8215de860085b07df178014092b3011261184023318a38265c1541272ade076c20b11a9e9bb10857c96129eeb860118c0b80c000044e4114940882b0430502100a06e9185fbb0e8e15120ff75b8060b3233a3f9562846c82c8256620036004d79b30e0338ef68cfc45006cae2c8b66a812749f733ca48c90c8e4d56dc70a407185266a33729cc924001cf7c288a1432fb51f92c8298280073dee68a12219c2003f3e1082011c951aea0120860a5a474591405ff41d1cbd179a000b009185144c3deed184a5ef70b3a14343a74a13a12304517d42a0c00cfdf5137ca00480100001113039149203742a48bbe7b2183348a211255cf142a406114a4c611a8619096ad828d04040f35d7b70e16031ebb02e80030005828db7b7b91008540400001d920820b81595c9fa126d1026a91effcb56103001ad26de883828455fef9b1c6000055d49f3604005cff9d09db040022ff56b9c4a693861581000006b880f88c07017c421fc02a8623872c39c8fe9c60c00895431f08103fa93ad6004113039845484800fd92434882000dcd9a520a804b8c13) <<< 16000) + 0x808000064c80045f1e2000b71b000a10e8c02c018c0800b71ab50a0d1642547c8c03c323df930a0000b71b002a015c4367032d880900100002e641009607e4b03e2181e8cc0f0660762303a0dee81e047559ca6803c5497ff4ab9c800000000004e2288206400380280100082210aedd38cea10c26b43fc34f5d13af9e5044fb083de6b49f89ebfe84ceb315146b6d009755f5ee2256d8e16542b61ba02b73cff78d5653f8c70ea2add2b019def8628a414ca8980d2004d47ad8206007ada938a0c6efc18dd0250c2200850665457a97901815e36402503644888788e080c07312618021f759fc01286110040000434e04efc4d1d490ac46c7498044203e01000007f20701392145ca540a2433e434179cc041e1cd10214109df5fb24304916243e1240d69ec08846003d0b49b001271422008509b9e84786686960c8c9e68435441812205a29744b610053e951d612841000434d2d31f5851424f21f3648608432d60b6204f0adf52f1803229cf7e84a104201000010620720a0330100012610003d42062330300d81786e8a03555608413f7da6979c02992411519840f802200802008c338a9431cc48a053c1e7d14528e64ac0120059c125e89010840200001ae4000450c0300401000004470dcb10f5d060990c7d3e0c02463f652c700b1b1371c501c100e8804251020008000081903809d8a26c7a4ca14382b8e2af860059e8474048c308402162d9fa5c1ca40851070be20e18061fda9a2863124436b84087e64298a38066ba6dbb013061100400004ecd091b0ea5860e18b834a00e3040c76a0d788110417e330380387d1d1d8003ede0b9e0033081100400004f4c87142f791e8a097427e5260c10197f5c7914101cd2f0a03800631b9bfc50060e77d9f88930a11804000051480025e1037110158280a4140010b2407c960381b814446f1e040c3f51f53e8060069d3596b1401352762e490108802187236e221d18103e6e18f44810880100000f840d82602a130350980982c0d0140240be1847a5cb68c048a3da8a030079d5934614018a520ab880793828d1040094708402124b7606bfab440f03cca1b0274425eab13e25cf8186119694b7e8b7d08100751d29be964500194ca8d39ac460cab10d61da59c48aaaa18b7d22092421e96f431624b17bd49fe601e2c249a1acf854f99cdcd63293b41432e5d8f756054fdff9ab5dd09c75453071b200d1c86a2ee2bcf54bf80b894e9d8736543624c8a211ef3063170b60e593ea9890128b468e833fdada7dc4c479a8db4418d9a3c2c9b4f66a9b0401300c821b25c8a1a89e28883409ce5f740401b23a24c06009e8e8728848203e0100000d42066020320180033310007902062430301181788e420e88526941054449ba4e85040257fccc8a4620460100130181700c0b407456b4d3e5a145569eb8e4292101f00440821dc34f11c30492c3371c0589f3f8b070005bc000a09208108040000374e001a22e61d986184baeca7f13971ff8a3b87ea7639dcb15df439fead88f5de16fbb2ad05d356997ea736ab2ef689b83b7a8d6bbc28dd04d49fe92a65cc2aaf014e9e269ca0bce12e3d338a6b7d185714fa450e310d8b895cbd1aaf523472f913fb0f18a43c36639bd1285b6c2fd3ffb3310cf2fdcd75618e41f9e2c0a358245fa962a0bd1c83174e70b2d41275c9dcfe993b118500580017daafadf6e79422b54c580005133c3086cd2b21c283984f37300c3630f92140a1f2147c1009060800200001b84001e6c8160880ac140540b0290500047f90012f4200457e6a0add99ea82b766772284fa04800000000046cf1503c0c495268378052ffb0a3e277fd01f6cdd5fa82400000000000000000000000000000000000000000000002e1200462061823002800802002054548e419a73a312bf16d0e907b3880d174d083c27267f418e6f962b2202488a99f4e93e18e248f1f48ff377b406738a2414297c88d90bf8acd50107164918e8fc72de9894e474fea050020004ce200554c400ded0f055d08398adfef08bc8f34d73c3031ea2befceff3c6c491cdf8a81011a7f07ef9eb946beef08d0fe8a0129ee00e94402a557c81c9bc04000875e0075481f2ccf82c54dc1808d350550df82ab49cd24f0f51409636cd00acf9c8aed2f6f8a508a198649dda74b23699cbef64897236dd8c3c45a4662c611006a5414d43f50b00f1a956055b1971001b900bb192dccaa5902cc61490c60c10430020000ad1280feb5c40eb37eb8c877a206aae9f9f413873852458b706d861d856b03c447330ec7185bcfd73240b20a9ee73141099b942a0a0432c295b825082100850fbfd544d0207e7b9e1e99029e6b58ea460cd9a7b4d828263b1f98b094208402000020c402c3604e1b9faf94c7ac517c233a2ca1fd252b1f9317137437671a5e00000000000000000000000000000000000000000000001704a28a1090c508208704900200030200200d00f0100010e9000489204c2b0250dd549caad490017ba07811d56729a00f1525ffd2ae7200000000001390c29421220e20808608063e3998aec80f13ec0b0cb49beb2082334e226f681aa5d306d4d931474df274799431cd6150333125972274135918620865b420fde3059b39225731889bbc0e2112456309b0a1848e6a2bfc88087f02590530609bd0767a471400fb66e7bad0a0025e7e6e938202d44dade790807e9182801c000103102415d978d097ccfd038c05824c34de30c22298c3bc450b842f3983be40a535b73446a282849bec81ea28060eb57398a180185dbfc02a019)) <<< 16000) + 0x102050040b2ed290210c287010e86d0ca1722fedaf52050e8fc619cb041815fcd31411d9549214026102200800009e900b158118ae4535cfceb4a4890fc57b02ca08007a1200140802dc6c001c1005b8d800480f64a0ab400026182300800780800057080026410009d720440a0010e32042028b05010d74178253ec0b93074b6ff9f9d8e3a4c1d2dbfe7e7638d0000000000000000188cfe514fd027d8d108c40c50440460050040041f4ec90c809c5e3c693b7002facf4c1c84599ed9f22bcbcd92b6416613b4ead3f67e797c5d7e10122163f3a618b9276f1c363afa25bc27c6526cb9c645e3ca4313d82b532de99ab64fe6f7f830a6fba007a58f774c73faf87cf1c755f9f5aee29cf0832282eea8a970c2bbd8e78fad60caf488aba87fe79a19e6caef32e399ad4f9f96b5c18c0f38bd10741ec6ac12e09cf1bcc8de5412b0050becf32b8197ff89340e5bb87fb1eead7224fd1d3b3f7e31ad8e9cafd520ea3173a4a6c6415d2a4986e61ebc065f9465a0cd47860effe70be58c93132086c97430a3a017abf14235a2e2728616980bc4986056a0c14c2501128b105f1402d1b9d820600091324dc42710210080000b19954e62edd3805bb02cf74db301755272ab524005a3cf224a832eff64884f282b260e96dff3f3b1c74983a5b7fcfcec71a00000000000000003119fca29fa04fb1a2128c28610808609405b0ab5d64be95a7830a186ac680d82ee8e745bc7941aa2b2a4e917d6299408b2e6d21d086d76aa6ac803f60a13674a900be9264f91fc98bfe2eef3740cfd392f0e30a410c48a10a59032b80c224b9740f2202444122e1ca00479cd09a9201db8c611310010181352424e184601000016f2040120005ec20019a4407c5603c2201d1180e04c06c2522d6a2db0d5b57fb32cb58e0ee3663bf795dcc225140a0901e5826718874882108808cd6f660605863f68d408003b1b4d7431843ce4f380001604fafaf5a83d0bdd232f61caff7bef15a79f4115dee680198c2898160a1a498e1f8cbf60ad7bdbb23e3d2a506f99f6f33c00b705e8a95c6ab0f2029cc6dce5d77e56f00737ffbf5f0e1524b7fa90e8337f5d1e75444550608f5e59aabaa62494ba4af28a7ea401e2a12c4b91c99b3fdcb3a5151208cb94ebb2c1d2430b597d35a44064a9c5e46a9a0439c69841a449154f8fd783a85d2ed99ff757c33d7c8bc647048954e62edd3805b4f06514f184c468fc60d7fe6c2ad21540fdfd17ff1d0900000000000000000000000000000000000000000000000b8d633aa742ea05a9ad2ab78d2816a50c404384184953214d8117e7d3e5a6263132f201cdb1016675e122e651ecbbe980808d01ca9b2efe8ad4974d52cae20bf95154798376d4027750f465c1d75addf2fdfa3a26e36fdf4e151a558234bd9653335d10450d24a000af040024a880d0cc064660302b0170d80b06e06eabbff30082d1d5563c424203e008818da82e1180410ce048888a0239f21bc9108c4088020000166405436028120130980900e48a631b7f8808a33ce50422101d0084081ec860e8a0e47e2ce48808af15bbd20000fdb74610121438054102972c874884c203e01000012b202223c2864ab13bfa30c34c36936b0770c8a3a2b64b5378e844ce9a81823e328ff30044da10623bbea60a689bf20bb7c8bf88d605ca8700518e7ecf1d442a3b1d0e7de15dc7ea5048a602a1cbf534ff020c7c81f2f35f7015e4119eadba1e8bf2772e3c610bfbbffc0ed15c6d71507e728dd6d62037e1c8ac50bc2640f3d0c630ca600007fe60162feba626d7ebf300a0a0040a6c1f7cc0d200c10084d73715333e4d865af2adda582c1a17502c0f21fd919514ae17eb445d92ac3b3ed1be3f01805aab3fe31d5e04c659acd1b70f35031d87f01007f07dc371133bbdb8429febf978ffe0320d7bcd4ee7677fa7859457866482da810724070000073a70ca14ff2903095b361e1c24702950f340c020b48f6b0400b8de93c094208002100801004000011100b0d80806f0c6d1f52f0815ac9c3bd0c192e50fce2c0a0b4e82a30178112ac85003cb60da084c203e01000f0100009f900e11006848000bb0800657900c0500073f9001af9200573668bf0ce608240a18c4a50e996282ab5dfc2c2880800e4e1c0020020312a4490600002dc6c001000f5ea53d208084e404c010e2768c9473e518c695a82a1318d020ca79e3e61017586bbff0ce000000000000000000465415bb33d5056eccee4509f40900000000008d7804a917f52b2cbb8a1effeeed7a9b33e068cb97a32e4800000000000000000000000000000000000000000000005c31c21821421011000023ae0075386b7b39068439af7e056c48579ede40430ce320bf92ae2a76cb92a90a08be885e53c5b28a9dbfd3f0a5a2a85958cdbeac2ae506d2167e385dfc5a6ffdf5808b4ba4c03395d835b7a232f1d34bdcbda78bc0faef86b2451076712290bd18e119f519a0602e78a81e0624a9341bc0297fd851f13bfe80fb66eafd4120000000000000000000000000000000000000000000000170482081881040c20890070060030100200d823d8962903b20601c0961e789100016e3600204356139d6287100016e3600041018bbb35140000019d8ddd0b8413002000060880586c02837c7c536019b829871405f056f0dd52030011e1a3000070ca65952eb96b20000283baec0007000bc14357d9614000047868c0004321c40b8080012020001d92000b7c402004001956401c7400c2a0050500200800c04001d7a40087400202000010027d21)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 20 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case6" = "QuadHeightCover18Case6" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 20 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case6 private def zz2391:"s0957"="s0957":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case7 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l14 l17 l21 l23 l25 l27 l28 l29 l30 l31 l33 l35 l37 l4 l41 l42 l5 l51 l57 l62 l63) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xc323f830c, -0x59514ba00, -0x3c2106ffc,0x16e3600], ![-0x59514ba00, -0x31803da713,0x7d9f714c4,0x3b17aa8b8], ![-0x3c2106ffc,0x7d9f714c4, -0x23a9aee220,0x597f1256a], ![0x16e3600,0x3b17aa8b8,0x597f1256a, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x10f3ece4,l5),(0xe30d6c,l4),(0x1bf5866a,l11),(-0x2ce97392,l10),(0xa437d108,l14),(0x10545dfa4,l12),(-0x20271c034,l17),(0x3f3dd80a,l21),(0x1602bf4c5,l23),(-0x2cb417800,l27),(-0x1cab95aa,l28),(0x2cb417800,l29),(-0x12d06ec34,l25),(0x13635038d,l31),(0xdba01878,l30),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x3b3ad6d1,l42),(-0x11ad30bc,l41),(0x2cb417800,l51),(-0xafc7a05e,l57),(-0x842e5ead,l63),(-0xcf89e6e2,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x1602bf4c5,l23),(-0x20271c034,l17),(0x13635038d,l31),(-0x12d06ec34,l25),(-0xafc7a05e,l57),(0xdba01878,l30),(-0xcf89e6e2,l62),(-0x842e5ead,l63),(0xa437d108,l14),(0x3f3dd80a,l21),(0x10545dfa4,l12),(-0x2ce97392,l10),(-0x1cab95aa,l28),(0x1bf5866a,l11),(-0x3b3ad6d1,l42),(-0x10f3ece4,l5),(-0x11ad30bc,l41),(0xe30d6c,l4)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x70500e601001c83c04406b40100007c210c81b20060f810218406490050760850ca01a48028000007813011300c00000311480a180600001945100a0c04000000a44206c6018000000441407300a021a41020390a00c00420cc22032d004000000002201a401800000000640b2008000000003203900400000000d404c803000000006e016401800000054240b300a1419e1140230a00c000310c8440350030000000000e06400d044483040721401800981883e0242008005210c32032d004000000441202c601800064260a026400e9421e1940230a00c00740d02101e1004001e0420d013880200000000014062008000001105006180600811c44401a100400000e22880986020230308210298401400000190481218060000204610130c04000000090500e6010014c4709002c401000002888a0141808000020c3100b0c04000188a43404c8018000007611026300c000028882036180800014a2140930c050000a710e04986028000004219016300c00000250e8131806000001387c058c03000006a0a8118602000000621201c300c0000000036031004000000009404c803002905409007a802001502705006d40128814208800c6a00d420a40420033500605305104c025a802801702807005d40100000000130049006000000000240c801000000000700a4010000000442c06300800000000e00490060000000012014802,0x291080b18078310d0c300b8d006000198983604e801800000000130320040000000046031005470cc08700bb5006002886c10811e80200154360940494010000000221e0298040000011024038c030000009412016601800004e04401630100004a1304805a0060000000078024803000000842202c601800002304c0ae30100000011048079806000000161201cc02000000b0420266018000005827013300c00002909000998080000001611014c0200000000580124018000000036009200c0000032048061806000001b024030c03000000c8160386018000000002406200800000034120318040001a01040098c05000000dc2201660180000430cc0ae30100000000006819002000001086403cc03000000000e812401000000001200f200c000000004a031004000000004c0bc803000000c44202c601800000000340d20080000000050079006000000002c0bc803000000000881a40151833c23c03a240180002944280c9180a00811182500ed00400000c22880d86020000004c0901d300c0000308aa014180800001941300e8c04], #[]⟩ def dynamicCode : Nat := ((((((((((0x165d59b068651650fc71d477184b006c794c9648878c50619200421164d58ca1048010faf58818ab29cb15c650db264395e484970233846d65bdba02c8d34d30e2cd2ce24e08b004030000200dd37a51001a786981f87eb59238b2467cad091a589f840e310d181376bc410706216531d27380217d6eb12ce004a01000017838659f105e2481e58000d0bcc918586f3d896061e5000379e5371a50b3f59c90018506eb4352061a402e5d9291c9a10780cb08ea9a0086ac0665839208500200001f920009ee41382609803a25299d02841a4109c0d10d2c89c31ec74a58c1fe5d4d54900324c6d7e1000e5b73528146614230080000a29926833b627d989206212660030a1cc47e5d26cc91d81f4842a40c0c168cb6e824c09b2d7a727189081eb204ee80a0400abeb7b80100908b8ddd09457691828018000102907111fd7ac40c5594e58ae3286d9321caf2424b811c0032343610016440e58c48c40c3803002002b5281574b332c990e75523678bdd6b372982f4ef718dd7b5ccc1970b917207c1868001181bcfb5b98e41aad8c946de42596906ab63221189429028e28e18e08a00600a8c0c0bea0e96f9f3785e79ae164220ee6d187172d0afe5dae8bcf935cdc6396f5491e4ed491c5c91b44da00048e6866fa2d1beb951c6088a5e4baa92053fce77e21811c5824b61ced2d0821de74edd4cc1013d1e3e0c0422808feb495f8621c0796cdd59de8455acb03058058a1557e8675cf83135f0248ca62cf69638b183eb5a3d92e952bbc9fc5c8b0511c33528bae756447c04a92513cac1100208bb3f2e7e2b32e0e67ebddd42c940500e9909695d8e0ff737e660c7d49748a4b146ae1740a754492f716ad117c9848ad121b2d711d769ba518711400001ae90701d0378881b824000b5a41b407434fa4f851be0716291c8404c04086f5e36085720337fa2ec99c881171e7393880209e563936b48500c3ffa719301c0541a938ed82ab3902852040a15a8f55d1dbf154bb75837f1614716aff4677ff754b52380afe866070cc720e1d88305ece7e9fd3fed840817be80768e2f54c8141baf82820a00a72a51cfc0eb4c9b8175b6050106c984cf2b9b0dd95b857e4f853602668771f9f1fd3ea15b33e99cf482f2f5187706cc28c82180003703430b486eaf2a50a2d21baca58e2aa8c0a27c040877184561f901849567d32220438e87ef50140530bb7f3c038067832bc382ab90284c020a7a073d7a0dca01e72806055a42dbc069b80b22851c51c3102201101140165fe96c3d4036df32e09ff6964de88df07c253bb3837146310e8000de900039520d83a06b190350a80bc340600a00097d38c736ecad28163f3f564983e1f9d191c2a0aaf3ed6e63906ab63251b790965a41aad8c8846630c206384204102080a09f5581430668ceeca82123f5c7da67ee769580e80854b7b52a2ca3c5e0a4d5de62d203152c2baa6e) <<< 16000) + 0x4b13a9cac470cea60ebc7dce5215c07ff64a9a519054000dace1035abdb0852f430251813e79b502080812f0ff9d453818245c7565b8ff90c00e2b761d3ccf028104967012e05b0803e7a180d198880a8677ffc5270870a06172b339169443c7a1ce0c80f00004bc4088a60d2520682983394c198a60ca0a0640140d150e487492848140225f8be0d70e12ef3e1bc2bfe18287c1bd94f2e62843dbcb87439008007cffd23e1f70e022f082ca56ac1400f75d46c1240a20221780a28f5dc0b7ca0c0bc0c1a58f7a03e257ca2a2262f1425c58e3594b58d9c287001312ce0c142817a2921e2ca0c793fd83b705807df1156f351800004c4b20c52000a4051a594f13cd72334a4b771489d65148cfe70ac708205e54557e6163df237df43228703d30cd7c03803adda2aa9a8e004e02800018920920b04801d0ed3e2702030cb1800bebbe56814361f7f848efd08202a5d22ccd84000017d7840004001dc23065ec060017d888572b0800d8d28bcb8aae440615810000079483186ec9da68ab3bc285002dc6ad4245a7ff36db4205002dc6c002020a0b4a2dd20138baf1a970c10740a12b41001ade295e6142814240080000d590621183086ec5088e6fc965023b53d3feacef8d940b73ace123d48a5943f12442041431021c12800405522065cf0c829a7d2ab51ad8a55901bf3ffdbc9bb561dedefd9a4e8cbbdc07ad0bd54b4c814f43905210b40009e081108c084471a00c0000000000000002c5088e6fc965023b53d3feacef8d940b73ace123d48a5943f228824620418310314108001004b940080363401800000000000000058a111cdf92ca0476a7a7fd59df1b2816e759c247a914b287e448c4085063042800202fa9cc8eaefe105b2dfb9ad1131631ed12c81314d5243b98fb14d089f5fff9d0591728ba3a430313925cf0f6a75e08be1b282a63200cdd4a2687ba00067a40013fc8007bb181a81e29868e11c589d7c585730510005e69ec001c200179a715506089b13a9e68f1c16a43aa1bd206040179a7b0001c0e0c66d373c8408502854038e3f53810c2c28e2911019778e8e2144174af9a1008007270e000e0b8f70122e38c08007270e0006006a27f16d68400d825963b18815028500200001cc20c03205f1902f028174140b80a05b0102d00800116882c9cc160d60ae630561582a86c150360a61b810bec438358bd9c34276426288d5ac6bfa238655ccf93a8103099e88c822059ccd6a3ba90038351ea9b1d5a71149d59870238c6aeeaa62dea25c99b42806d994acb4ae9c290d62be150000e8fa159dfd7d67e75bd1c134e047a6f90a27f7c6a1e41084097454866f2b91cf5f564a67877e911d64c550cc71c0ec9adc41218d6da8c28240bcff37b0e28ac638460100520d8288681403609e0bb20ce0f5f6070dd970e1991c50447e0fc9618ead96f4d1013bcd57221284108043c79a9d05e81c6224bbaae3c49aba88a13040e7ecc6318481ceab6925042000861201b8d2a63c7c2408b369821f2c365c88005cb2cf6e4808420100000d720003e268703eb54dd1a2f89bf20fca08dde1b7a63001d39b39e0240c2100800006d904e1182600f0b087491b18c1856fc5f0b2850308d59b4a102563e918301d56a73c409042dfa578d2c0200135eb9006718220080000b7904d1de099bfe27e44021181f00802600f453048ca3f301354ee57214181530c732c0014e5669000906080021a3b9a24efc202b54c9b4f9a29994e204180aeb7abd198057280a280e011b86d1e8804c3040010000135200045a4000ad48258ef453535561000b45c7e4967a5eadd90d3e10540000000000000002c5088e6fc965023b53d3feacef8d940b73ace123d48a5943f32892842821801000c00403e882b2a96bd370d04cd1e0ab51a883a6d131f7208501d4696c39730cf32ff04853b6ae971882de0e049224887187000314639654000e50800632904029c0624509faa3820760b836083a872ae6c246184001004a054062e8e40b8c02fb387250848407c0100000fc412446090039102c4a5e1880a9523b86080a1d4cd3a246183e0100470548c03accf90404cd07e590205ff92ff7108c407c02000015440cc47c284e93d0b142050e6de88a205a3506f0a06637dc770204830400100000dd200051e40545721e74ff6d816ee55b0f3e6a5b0f1d2ccfbc4e0af533cbe94f9cee3086b50c32683020c84713e4e48ce2d57b29ee813cae5f0edd14c92ee95a83f4a188f953418a40a012dac7cf57b06445391f112d23d48ed7fcdc8f771b2b8f82ae19b8b299b597c18006c8b9f0de0f26083007893f4744addfcf2ef8fbdc9a2dc3c5670872c68ae70080184ce5562dfe221ddb4a2939f125d1dd396820f541c9892836adcd40182645c65f949ddfde8f3eee6cc91e49bf05d1a4af3e4c6c7f5de184d5add1093e8d90000c384118440720a0380100055c103701fe7eac9307c3f3a32385415355424f147e2d1ecde3c10549676af5e8e5bfb5307af5a0a7e72dbd7a3f3c2532461c61c11c0100111254de9ea546175664d1782f4d47ae106a1ad65322a5a620014ccb66cddee35612f3ab0a8bbba485425729a7794f88e7d2d5f7fc7a8fea3c2d7458fae50e23ddaeefbf8eaa71744dd045050001fc10222181090e00d97235a112405586befa79383c535bc101ddefdeafbceecd4bb38540f2481deb2b3f52352528e19dbbb0259c015f149c9c43300cddb8e078d3144de3287d88e281a8d2bd01d5333941408cb623849b9fa3c66cf497a9032e302c30d31122cef4ece22734165ee9)) <<< 16000) + 0x1cde56b48eda8ceefaf12d4e6e0dd450fcbf0091f6d193254d84037528dbc229652e76e3409e346b9ead677a8f415c99ad8deca867717e55da6975d5ee3939b1db8c10ebebbf023a1043c1253185cf226e3c651d7d5cca1b21b1000000588353aba8ae11b89b4787dded7c5234b3c29c996d3e2d41cd8486b9cc2401c1f0411a32c1caa7da3d7a419e8e432bfd6f06a48225ec4b1f90624318fcd3ed6ad29228b31b57bccc0501916207c96ca33cc787464128bd1a05c06bad72672b18663a9f07921176b45b76efd391c093da2c4fdb857a89e3f40dcb6da335fb77850f6c0d34ca28aabc35bc84001143980a380dd950f32000483840010a1c6751f27628b3f46427838326c804730e183d5d1b500009070840200001c64110860863b0421902086f1b0bcc21b205ac2cb6c20f88163f3f564983e1f9d191c2a0a800000000000000058a111cdf92ca0476a7a7fd59df1b2816e759c247a914b287e848a28468040030000000516098bd3c7c4170d8e47cb9c963288b48d07d48386adb03969dc98d0e7d9545cf15c1b241412febf60925b457ea4bb8158b2f7c160293ca61d86650003fe2000c944100c70140100401f86c0543607c12c02a0d0f98bfd459d4e10e20cc375ad81c65e5d64f31da7f3c85c3d7770e18437e0c9fe2484587a06e0b3620a7481a46cdb4b748263986b8f6d0a1ea124c85011975d58823b86e44fb656a268d3477f9d70c416d1336f1e04a86af35436c66183c905c0e3744f5a607e9e15593b633b25f0e30c3173f3b45092f8e1adc06a0ceaa382b5eb08727253f638a0f5fee230905c5faf10ed7adabebcbed7266176a0cdd58ce0efe015c7e985c56668dd158e876385a049a8804291afd28028ea004cf5a0632f68e175d3d707ceeb85547d1554f2f60c9b39ce7c4bae6af4b2e22ae87b5dd79613b656189fe48d6cc2748f3e23d53542db6221e87280003e4903d0d01e04c0ec260740a0390501c00800230c81b80e1b075b5af1917cf83a232ab57e35378efd768beaad6ae2e059800000000000000000441f9fab24c1f0fce8c8e150549676af5e8e5bfb5307af5a0a7e72dbd7a3f3c2532461821011000c00100005195ecc524421827dfec998a9701801ad2ce630a7d24690a27ca4c5938d0c0f199d08941a87eec47b6d6ddcc58067e2e3ba1acd4b432d7f5f13d6a5fd1174efab54f32107c957ed166daa7513c21678bb9ada72812f87e890e0cf85a99d56157d31c9d53a14aa8a2e7bd0005be2003eda400f144cfc3fbc68f37a59f06fdbbde6920f16b68bd6d3b2c810db1baaa90000000000000000000905db7bea7fc8deaf8d53141dea4125428566aabe20947d701e49c000000000000000000230a2de3b7e5510e05e911ffff0c4d7c19c3ae1ef95844c63000000000000000000000000000000000000000000000000bc7b16d8ebf7cd1b1301c07ffac0f95db4494f8180915c63000000000000000000000000000000000000000000000002ea0818c00a00200200013d980dbf0dbf823f31fa5399a4d7e81c143807c3a24e377d1e716e9bd7a6d5d8ea161040bbe656069b9cfe3aa93ea6c14dfc0469dd4969b29d479aa8874008b1fd8295346dfca5c9be0e77dd0bb7d63aab0313f92be70d0683b34b7b4737764d0ce4cc36dfd9cf23b3a34669bbfa7a386b433889241a785cd5147a9cba0012f440126f880305e180994f170a0799605a5c895013343b8ab8d90600e1595679c490fe804bdea816a6c63a1db9184c01421a1f28d72b868bb5388412840d243aed795002021b039427fd04f5f377259d65036a3c56acf004014403905b4511bd01c72836c61b69ba60d9e00803532c0fb133b7ba746ba75ba39deb53b61808040a3262e7d172de45898170ce22c01daed03da04da8be475334f4ac205cfd0c40290498e42023c814a84981b412d96cac84c533070b9ef9952e9be050f337b2644b31f1420ca43f58d733e02dbd0fd9f9ecf85051684af5f288235742f1ec86f0d208156f9308f3f73f7c62a896a04d8a440655fb3f7bb5de194471044cd20c800ea0ade083b87ccfaeb53d46f54a18363323c509a93ce8a5206e1380001dd90362581a90c0d0072300daed2b22374f038c006bad7854858e12243ba74db5e1aab64863f324df7b1e8e1020153baf483b52f24000412874a404da9e0016ca89dc4436df4938acb66183a06458d3cbb7c2848de47bc9f4308b4ec76f638229de2870301b130aa2a04a1840010b1b18c1254599d63312316a05ea3ba2a55d2c5487055e67cd316e38649ea1386b2458681063f74b1c76548231201d4f5703886523d019907362acc0b4d57e4a3e60c3b06c00011290330de189c7289d22c6499c9791123496063260610c674caba300ce5b570900944084021635eb4d7365de77622461fdd5905a6b51ec58a90e0abccf9a62dc70c9f87a03e4813e30408bde7483728d2d32406118efbbe776db400cc839b156605a6abf251f3081d836000089c8001a610006bf20642bd38c955b83e02f06d59077d14091b8bc9ec1521852441c41021801000400f48883d80240c1ee8d3b60c64d2ab874d4ee9d8e20b21f591425f9923987c82904500f900b68e983d121566d7f522449bce232ec12bf1d881668a2d4aa26a6601d2f105498710022171676ba9dc9bb81413aaf9f3dfbabf732026b3243045385240480520389ae1b477e9730d45611aba0378408050ca8220170c9f05812fe5329b3c0ad7a9d8343100038a0662e8de5c9bea3e219bdf635d70bbe3e9c389aab682bb24a8e4c6fef8007f7d)) <<< 16000) + 0x13a67b3604a21544480004e820622203001017808001bb88170ee3d681c96664bacabbf622adf791b0dbfbd8fb53ed0ee318000000000000000000000016837a9b662461028fd365870bc240a386384284382400380086080b6e9cf10be53e586c09a00d73ad7519f487f45bf914059c6fe40a8f43323c5c1dd14ded17cbe567cf3a1abea08724499bb728d52e28001cd902d050009fd102c1d0158e800c05f5eb10315653962b8ca1b64c872bc9092e0473d2478387e205a2e3f24b3d2f56ec869f082a6288304284300280268fedf280cee852d56f375dbd5cfbfe74a6209e04e452e39320561ac05f713dccee1def92afb440eb16ab5486d56e53119416c04d12274cea028c50105688269fd8370c13e1aa4c042852b85b0c4840004fab96e00120c1100400003908150ac0a41605003b71b000a9b95daaaca8a5cffd3e74aa8d0487d7ac40c5594e58ae3286d9321caf2424b811e9c64aadc1f016c0c01a0a20c10a1080860801bb50e2e416305182e51461e4e3dc1ccfc053f052c9f1204d7a88b54de0d6c1966f22e918bbf20331cac4df9cbe2518c529afd7ac40c5594e58ae3286d9321caf2424b81188a20e10c10a10808409200800600a0e4600401a000264409c7404c2a0250500026a9024218118e8088660423391d9c2a0127880ea17fc076f19778e8041259bd187a88998bdf9e72317a380129168dce4244bf9a07693363183cd36331fc6281c74642e9b5ccdd6f80000000000000000000000000000000000000000000000b6631cdbb2b4a05836d055bbccda9626d4a828848a4803803001000800182a7466af678fb4ccbda4651a677ecc53e28061c900f1d496d6345daad03a75b4e5772550ae8cdb34803e1d128ffe5c59f58f238fa86ff343af938dcc349cbea33d609a4a1fc2dce2aef2800337ebc30265bff25c10f239cb81edccca00c5ea5b14b65c12fa0a33b76e3c52db46df594367b720cf7a7195af8845bd17979762fa0d0722221f669a9ba00262dd7809b9544f29e11064bac1778cd078658c481d230001b7a11bb553b4a7da1d59c92d354485842244309f435a158a065540d202a85ef569604acd23bf27ef3d7c1a64fa9120085b25b4147b62b0ff408b59c400000ca1db0f97f2d994a002204143d359c6050ee1dcee591124d9474f19b06db230c9ccf508ad7eaa4fdb6f80bf1797701d3336a102c0de67793ede891d0748dd0ffd29bf3ff6bc1748386c9a9d062f2029d858e6be7a2bfcf555f1dbabda0f9f80dd680de2d26c78ab2a95b6b9a2fa9aa7f1eb67eac70a043bcce5080c00802387a746a378182158fdc41240c7d26e2f0230c2000860bf34efb9208fbcbf00220c1b00800003a102005404004010038020000372000342400077880a8cc06427812757fcd7b33645374da4e9c4b152c2a415ef59d1735904091cbc44e9b0d7198316c7ab174dc1face76c8a35643a248101bc839c43dedd1f61e4ddfe6b48ea49debc8420f7eb05e9997a86c4978b20b46bfe9ee62e6616797ba89777b01163163fd66a89c9c0d4a95d30bca91b6924f18a589242440a2a791fd46900a0601e576784438b03c364fc68181265f3f66ac5e6aa0c6849dd884e7d3edaf4ea43d0708023d2ed08555cdc58ee87db38da9a60053644a202054ac16648a85dab30a8fed18f949000caede1a79c067e30dd1c677aeb67c333869b35bbeb8ae9ef28f041f560cd1aaebe7dced36039aca883228410a120c00f808001050d146ca6c78080df68dd530306209478a0900aaf093240124182000800006e10151900a00804c040012104004c1880f14c0740701801004405004011628d3c3edc18686b734b9004e0e7bb4013101e0044030040100380200003720001f040004d480a88c06c440342201909f10302ab70070883a345049037a7b7a64008c5080021c423dece8441132bd5c81c2284ccd24206d1df16f10904078020030020000e5202e12c1d2e730a3022abb238c07d59c762033181a00400b0080002c880a8e805004026020002cf3010be6875a8a06e334c7f040256cd39fb141403d9d13020001216108042c2cc22ac2c544e18d505af4b5b691d3c35bf6652a54309526a190173b00c1656fb577cc18977e0a72b69268b58d0b6d65510fad6c8e0261b9e1440b050f5f3dcc712b43ab7cdb6374bdbb8f646e331c1644579bbc9058dac04011cfab6fa31aac7bdf771521413443fa70cbdcbfa1007d65cdb24e1a0104e0fec10588aa2d9ec0b8a36c4e7b4e91e216686bb9e5939cc3151bc0a128b4e7aef6f6b28dbaa899e950eab45b7ad5894b2c54428fcf2eaaec5c9a07d62f521c86b74cffce379749e9a93600503213af8107384c2102817f053ee145646c94fa43060370b1230b0819e47cb1941526fb5f1718209fae32b0202cc384601000014920243a01101008008002020800487100f050006f710027f020063c8708ba71aa8201828faab313a0a1001c9c38005008967c0e162000016e36000c006535e72a8004c304a010c21a147041fc60ae2ea9f42a3820d790aaec18106b422a378a0882296b7d0404005b8d800100002dc6c000149c609402000030640386601a03c378ec7e80dc18400c921d516384000b71b000608e9bf010048a10002dc6c00041000e4e48f822acc384e010c370c0d60eda18401568d4612384000b71b000608e789533c58a10002dc6c001c00055d7b22630015d9c61d0c4559c709c020000326403014000646402c94014420090d00406801c3400c02005010003759004350018e8008640020200001002b5c9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 25 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case7" = "QuadHeightCover18Case7" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 25 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case7 private def zz2392:"s0958"="s0958":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case8 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l17 l27 l29 l31 l33 l34 l35 l36 l37 l4 l5 l51 l54 l55 l57 l62 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x200de8612, -0x742b8d00, -0xaef86e80,0x16e3600], ![-0x742b8d00, -0x384d15ebc,0x934b79e0,0x3758d0f6], ![-0xaef86e80,0x934b79e0, -0x2bfc2b2a1,0x7707f8d0], ![0x16e3600,0x3758d0f6,0x7707f8d0, -0x3acce180]] noncomputable def hinges:Hinges:=[(-0x14d7122f,l5),(0x80cb59de,l4),(-0x25ed3806,l8),(-0x1e07646,l11),(0x3bbb6a46,l17),(-0x3acce180,l27),(0x3acce180,l29),(0x8852ac6,l31),(0x3acce180,l33),(-0x3acce180,l35),(0x25ed3806,l36),(0x3acce180,l37),(-0x80cb59de,l34),(0x3acce180,l51),(0x1e07646,l55),(0x14d7122f,l54),(-0x8852ac6,l57),(-0x3bbb6a46,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3acce180,l27),(0x3acce180,l29),(0x3acce180,l33),(-0x3acce180,l35),(0x3acce180,l37),(0x3acce180,l51),(0x3bbb6a46,l17),(-0x3bbb6a46,l62),(0x80cb59de,l4),(-0x80cb59de,l34),(-0x25ed3806,l8),(0x25ed3806,l36),(0x8852ac6,l31),(-0x8852ac6,l57),(-0x14d7122f,l5),(0x14d7122f,l54),(-0x1e07646,l11),(0x1e07646,l55)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x620980d06020000069104032301000000036260318040000001611014c02000000000d80a40100000006c44063008000029090009980800000000b0024803000000006c012401800000640b01c300c00000360480618060000001a09018c02000000c8120186018000680410026301400004386603718080003d188300990030001d8c41402c8018000000741407300800021c238068180a00001c42301a0c04000012e2180dc60200000811c40c63010000003111812180600000208e40d8c03c20818618142c803031041863025640140000001e0e0518040000000d09034c020000000882816601000000000130320040000002a220518040000144230328c04000008e1181d06020000000008409200800000000088190030e0d508e01191006000000000280c40100000000038052008000002c098051806000000160b018c020000008c1801460180000004c180630080000031098131806000000120601cc020718c20c20494802801cc620c408a401019828c108107200a000019c3301b8c0400000c22081086020000006221024300c00002884603418080000144410318c04000000a44206c601800003705c08c30100000248420191808000000130b018c0205305104c025a8028000000004c0520080000002612031805420a404200335006002e0500e00ba8020000000026009200c00000000e00490060000000012014802,0x84240f3008000003114811180600000000250248020718a2106051680280003384700d0301400000291081318060ad0d81340555005000148682204e8018000000037013200e901921100175200c000000000f0148020001284c12016801800000001e009200c0002042181a9180a0000000001c0c801], #[]⟩ def dynamicCode : Nat := (((((((0xa1423e4de1fcc52c46fa70c1c7c11a0793346aea40840a970224dd672ad33f204450d87d84e175c887b1942400aa29ff636f5c861b0102a616c4713e82ff51d460a00d5e60f186717ed66fa983fe81b5986efa314d4a030027d5faf7f6b11b7d55befef0609780166c898230014fd51a3d1a16d2458e4defe7e4bea8b279c3fda08b86a5e563d31c8c2a4d56e585164b640e9e9a4fdb9354576564dcbee8f8686f945307c3428a5090401382609a13b2276b342816300fd0bd22c3b4419d762040c663e1810038653ea8000622ed7e26041f0086140a3157161455d779bcbc6920089544194484cd9b89c6900089543e96408869eb3c51011111d270811426c72c8580482124801c82110040000704e9235594839a41eb251665918f435ac10384889da45871c34543860f39abf084c083c010a2b7712820cc692074bca4982890bc33e20016404332d78eca202a390240020456dbffa000c100b96333f9601b7563058810009480ca326e410940500003be4000c6482606c088070458d1e496e2c600cdfe60048c47614804830c00b71b02120aff7ceebc2c0019bfcc0048052408b7048028355dd798a00044aa20000264508c0400003a8412c540010c6412847c60275fd2b93942bb781c02fa0817122ee43e7838a94d950bf031813bdc84f264060961883d31703018d16d1fcf80368b7bb25a50792d9996f45956e0326babac71c290307185677fec4ef45e14294f6bda1ca43c02058615e7983f19d438a4fa2fef43430b070c4e954821412f79208f151aa859a7e7181101f600dbb722018225fd1b129ec8bc8015214eb2095167008199c64491c3706400015010491900027b1c34f0b53912a12280c2ba76c00e206a32889878c2002367b8800e103141f28e60e08748cb211a860802367b8800208c1ce8d8230e0058e32598f0218e450a0071149611a817e1b6364c02647f817f1601d3811da287ab9cd5816448a38830818208220010076a48ee080bee5902878d84e8a53cc242625aa483f69858477bbc3dd7147917a8001131048150238881183408a0a0004983e848024e5e0a4d705f0b37a9c3f03b2f23943123805a0739250ebe5b5ba6224f5e837d2aad0b0b2e6cd4e54400000000000000007863063843042041022a0147373ae424ff3b88e71db4b65b93163bc70caf741501a1083affcc2be1c0a74013081ed23a800478c293e6a04320bf631f419ebb9c0476f697b37774f3a7191f9ddaf19cfc6ecfb81b84f614f02966b171400120cc0e724a1d7cb6b74c449ebd06fa555a16165cd9a9ca880000000000000000f0430860430450040123e6f7662b4432661da46b5c4632224dad8f989795980c63e2843cb454d2c02794f2042d9d9bf61313d7ff974a6fe9bed7270e40a221a5747713b20763bde567cdb56715a8d52c57e60dbf0a61303ed0003b72088320430502100a06aecc2aa65ec40a2e5e300ce3070af21f6ba8770c13493800e86214229526f79d1c4007c0653bd8687006f2f1142788a00a89ce4f9b75503c586ad6f256f940e158182053d53570390255360f39471016e35dc03844dfcd6b9200003174fd0a000b71ae8000092b40f70084e2842010b0f995abc5907d7302482341e12052442041c41c1040010027c54e65260d0e39dff482422a0d34714f73c060fe0ab1fae103dfa52f5851643ea00039660579846344ec9105f47e17a0204c4b258a18440c0db04acdb0822d4343dba05042d209dc7704120acc64a34a00079e5a5340004545d155cc00c12284c038b2572ad0f6b40a1cac5bf7af8ca1424103f6df49165a3eada74050c452a6f7ce030c834d15b96060887f5324b601041629436c20600c513b2084002d122050048c28ca4ae73bd0b216de38f06e4b185125bc06fca1aace13606d061406248158c870c981d680368404532614e19070088da4e6aa0300288b0ca93033121050048a1aeeefe2789812300ee6b2030030509e0dac7f5820822afb2ef36060c25a6950e56080087f7e2b591fa0c00560580410102000800067881f848000f388002f690007fa20016c270d3106a6a6460c02dc6be80a08ea9be1761c0002dc6c0030039efdd5d850000b71ae858008c01007c0203d0101e0080ec04074020390101c0080dc040003c240d88606a3b0341980d8ac0cc460641bc2006c2a483805107727fd59084009597bf3b921c095f4766c588a03eab1cc4be4200c735050e1c89d52dbebb4a459c6bcb7b1003bef9947a0a1260d19e08d6b46342902c40c31df27cd04adccd50c0caddc380008c606c021453a4c6ef04028584d831ccebde47f2a0537) <<< 16000) + 0xbdd63583dc510821f545689f77fd8dd2228485b452f87ae88d5d49f8ecdb65014ca7a0b088e70b51c8d3bca3fac0a79e887277639ed7d4502492e9e6f18023c28b4d5e70f031f5298ea00c0306264c80144e11ae2a1f6a47a8793d990054df8f06708cad2daea207456cd8ebda4c4fcdb5968c6a0d2e3baee50abec4a9735cfb6ff6a6762b5f28cb90e4e41f6af185ec5baa0c5b93400014fc81608e0080200803101c01004011871e19b6638416de08c402005016638037ed39250107001000018040003f481806c09c3405e030260101700c0006e08168afd090024e5e0a535c9787a73341000f0f66fb7f1bd81644842041845824023024000bb8b311df5d68408e55611aef0820e25d7a5b1d8f7076a0b8e3289f684088993dda9b7d75062420767c8121659008212010a210c21a9ff391bd2401b1a9930fd127d0611009516ebc09902dfab204f0d09f2ae3ca328586cca376c19d78bc2e1449e250ab1df515283cff005ba151c44098000157902c15f0c5bfb93e9843432cb63f411764037acd2ddae352286ad12f782608cbef15faf426d47e4d5506a714aa1030600f5932bd2cef77986d9626da3bfbf04fa4509209ad6dd00716a74e214de881909466314f3e2a33eee82e124d5ce937aa6af347f26743f6bb24916f69ac108877d4380fd60936023941e6ad901274810056038107cdd80d9490e70e63352ba203147951991671c676e0ce04c71b1dac05aa43b3e63d97a1edd1ff0c21f3030ab7d12401216845895af914b623a36d12705959cbd762a17478c85c750a99fd3ccd5bb1f081f365e4423964b937f9cca821bade2e19f31ce2db355b65351ba04e1cc09ce86b1893a8cb0d14ed1fe02e0803ce00f1be3b04827225a64d2a5163af783d9201dcd3555da7f244dc6b5dd93cd26262f0db313148b1a782981567e4b2897afc7633706a2aeb9039c1e39ae5a7da65bdfc9d14460a6e8d88107231374d9bfd012af0375da80b3080f1de00c221584ee2f68f412507f42a33909aa06a2ca6081fd097a9865a661f3206a065a88704dbfb1de400505af1ff0f98a0e08dee5201f112cabc9547a6ed0c43b45dc4ad83116bcd4b661bfe51450c9f1c28432421f4b712ad52cc54c8091e3a000039020013ce40a8360520b02801e90093fddce68314d357f081808689f6e6e3db9fea28810cdac9d98c53b251bbf24101b5edd4b494377f91a28237f135fb7c0b88461c0902278d61b6075ab016ca880299b875e32957c434420412654250f00816f7a445959dd1f8870e289617000d1100018c102719013028004654800b3d9e31417aa91031862711b2a05438320762076f8400632d18d7080018e421c49404506b8098eabf27194b09c0900002c67f3bf197a760db0227d23ad0e27cef560df30c444952b8780000000000000000406f97edbf0f502c7b37dbf8dec0b32051431411c008005d5fb3943c04dc67b6051e45b353f777760f1047c83f06259296399dc0078cd0e2c022d3f544457210a312db8343e8dec8003b9ecc30bd15e1e4287d75e0470065405b5c9bedaaa617e52d00040e200486c6975baa644b3bbd6452b434180084bf5e41d113ba3e72e00000000000000001f04dcecae35da0072593c823fa4b3ccd8dc30d4e60b000000000000000700de7c85e9c1004e87e47d73239ad8ae89193adcc000000000000001b18818c00a002023540831fc8ede2e091763daf1e246c5a6922942a51ed8b2583a304ae417eec951ddb400c62be2a4642f2f9cf788485046b23f2ceb801aad388f3b3d07662be331bfa97f7a4342f6577ddd8128fafc2003247391eb8c1ecc2e69ec395c2d120d09f6f092fc66001468aaefd6952b589f25e976a421a9b235409404000daa400b598801ec99e16228a99114230d58a5c2027ca174f82043709f400600a0c2fba0009790277480893100f804288551d3dda328600fd6c64d2448974fca431c41bf9fb1c11831e61723e610320cdf17052810f76563d520114e5e82a81c1673dca90f1401bf9fb22d004da860900612248451b15187103942818883063fe4301231032f72bc65f100c61e94d94c706980e459a63002344d0c991004d04a5d33812040797e1123003c20c90f0304a040000205322841d5ed96d4ded32be1275ec79839b2121ab4b61a9586256ec4c7d3684bb87475901c8b4b53e83aea1e781f0de1fa81bb8f0c19e11c9cc22e3cf5443d8f7876d726a68a11d6e6c982b10793ad46e66f138a62bb061175dc8bbccf1387ade412c19bd3aa9d0226749929e808b5771f870bbcab5327c25238b9c3096d8d3ef2bd769e6187c17c01200c00112c80044b902319d1f393485ba90cc922aa09a41127a83c27282e152083000000000000000000000000000000000000000000000b1398c67254c7a0043ba41fd30c0569c407200c7c9959000000000000000000000000000000000000000000002b91030e20e10a10600200002002dc800401b45648aded1512211d8520120e20066ff3000410016e3604140e1bb88e6d9208e07fc6ed8e08134fd9000a08066ff3001202ff7ceebc0012914240145158139adcf0122121d0cc84438801e64289b06180620b2c245037497aa60d9208fa20166fe3820464f17350c0039d01cc04200336d3342302122450980700003e440883764837e11d6000142bf3db525ac6902a8406fc6b50961812a05f20000618113866dfe7140f59ba5ad681820268166dbb5084e207082c03c60e9782eb90a1c05b8d80181c1443a0d28200b71b02682d0418f24b0405b8d8014080b71b000)) <<< 16000) + 0x41df6310946001bf3942f2003e008c2405a015898c1cc0fb79cf0d0c043690f78c0ce1e61468cd04f338709781061ae57c30020011b47cd6c00025187b2d29000480280001a43a582aea540060ec1620dde94380e4e1c006072f9f5701941007270e146002a8267a188000e4e1c014e0044020c240cd3579983cf223cea343035eda6060761acbcb020038a7f5e00002b944d698007c0200002464000a8c80031010210dd1409e86af3077a79e358fe6a9d77725c43c8912c00223e3d5c026c11b788eb6aee741f0a8e206b5026f9dc920d9794cd54260b432a4650c105b4ec013388b7c92496d5173aec4be95230032a4f30fabb7d8b3266a2390881d704f5c4015df8cb36863f3725024235aac90a0771c82f3399927bb8e41a72ae51095f182c61b891d9007aeee87f4da83a9be7bc98221c6a00400a01f01000258101e1100e8280033fc80088d101c11000a52101b1580d00a05205ec78459096f9dd7cd835378850823d89db5c5aacaec0cf151a74614121fb9ea4b3cbd7ce89a68c61bec9000ab2bdf341d7eff9c018dcedc21c006e8450fdb54ac1279c0a9b1c6840006cb48c18deb75e287b930d80e0032a1daca4126220ff6bf3ef728935865be256498a0f327718da3ba86ece2277fd35e094778ffcec9abf3d29ad2d3d8d77c92b10350962fc4c332c19c0b31088dbef8e38b7531088dbef8e38b74e4c66a4f3aaaa897d264f97e3d50eeb05104850c908708508504200024396e7ecafbd7c24544434ea31eef1dedae10c43006d4f050d1694554545dd9b4753fb497627b1ba3bef5537a963ecac529b3ebabbd670b0b4fc3999937284b0c5892b406424030120003de202e2b01611e10b7d15d79c7b4f4c9e3f4e8572eb071a79f119ce2400000000000000000000000000000000000000000000ae220628220228018010000008408932f6c42c91924fa31c7ce7b44d91d81ab0f8799625a72c2870e5be2e4105b4bf7ff660a2fb330a0da264909c6d5cc01351d2637537633bee64670167183bf5397e8bff893eec2e8ee5994575000437304773db1427010eff31a265b4538dfbcb9bc2824035204c1d5b3c951c72a5eee34293a9d0200096ee02cb1be962e00e19fa83f77b0fda60002707b958fdefa6efcf7f7025933d88f22002a19f5b25ce61b372b31a5b21abf126ae42a1084dbae43574be0099b632d30278e952ba51c9f69ce16abcfabe290927c83214440d437cbf6df87a8163d9bedfc6f605988446df7c71c5ba988446df7c71c5ba726335279d55544be9327cbf1ea877582882640a4863863822021e8b09876b374a0a85de70619af88faf2794051e21e3ba6fa110b660888b74414a699fb2aa6faa07dab425db1d48c20ef75c9cf05aea096ec2fa9d815d546f5cbd285859193551cbf296cd115310d9815f3b2101a6df99a35baba3081725a729783e000000000000000000000000000000000000000000000000181be5fb6fc3d40b21031c11011801400c004e6bc7a5adf41e3d14abda14fd3c134721c73add824733604697c9c35bdaea0f98b5cb75a2b3340f3c3c43f45f90a47b936aff2bfa9394e63767c7483a4cc254d6eaf0ce32c0bb396090c005e2a66cca08ff7be1a1026c39d868d0004e3202a2bc185d14e8e58c6342a07242352605a8e0f0c54714c017dc28372800e8043062974ca01630c390d28908b9aaf2610436851161c1e66a2bdca003a0100000ee383153856e450c3afe37a8c22559f0d8484114b1e888146ef86704801d58e4ecc003c010c188a4579b2862f7dba9c61073e9e6c102938f8f4c208fe1a7029400780200001e640008acc090f40abc288431e042207020b0a430509a2ef32000e004004004028030000eb20261b01201c105262b5b5cdd2dc7152080d35f6630f6b723430d8070d6cc894d09dfb11b5298308d16bd525231f5f6a38050644334787059f5a36fe090303fb0d020638c688400d3c1ce175a2e1400af7823887ef484768c209818800d0d000164100c1500884802c1400111e4004720c102297392c2b9d22a6e68008259d53053714412e7c98e080013229857411b6e7255fc000a6ea36c58d75d47d8e4d8000604d795de8fcb6b1e6102e22e3a2d765064ea0f615b25f5584d71b7b69f7316da54b5e5389c424520cc4bc8e50c48e01753349d76c8f1916cbda1c5532184e180c9a9cfc75c7000000000000000000000000000000000000000000002bb7cbf6df87a8166488102500400280106841e38176ffa52f9995da891dafa2bb725ad3c58983f5063b57cb2203b4001dd604dd14c57a230fc2668d6427f09b08b193417fcfbe1d1a9409412e8d5afec33f5fba4fe1dac9ce75cdadfe2da8a954569a51ace48ea0ff520f2356f1c0cffec2c486081a8c6e0838898d8d04800c2c687d200100042000020080000223c7033ffb0b1218206a31b820cd4f2405120030b1a1f48004001080000802000008880008718020080200401400006e403c3601c03b2f1a900e11040437c9020820058958c48037f377a06000d9d6a2804a203e01000d0d00008a900c15005828001034800492100a15000612100221d2005e52647ac599f99400c8950eaa87b04bf6c316735214c9de0000000000000000f1145325c65887a550d32b8eb1baa00000000002521041021411401000c055209ea276fe3f0f1be49e06d121d834ad442ff95cf25e4d25de88adeeb2f41f6496a8f64632fd1fb8c31fbc2a0c342d163ec31a059d009190040a801c4400c1a0050900202800c0400402000436200202000010029509)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case8" = "QuadHeightCover18Case8" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case8 private def zz2393:"s0959"="s0959":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case9 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l11 l14 l15 l17 l21 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l4 l41 l43 l5 l51 l54 l55 l57 l62 l8) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1683ad960, -0x742b8d00, -0xaef86eb0,0x16e3600], ![-0x742b8d00, -0x1dcb35a1a,0x4d22de3c,0x2d896f8e], ![-0xaef86eb0,0x4d22de3c, -0x2bfc2b2a1,0x7707f8d0], ![0x16e3600,0x2d896f8e,0x7707f8d0, -0x3acce180]] noncomputable def hinges:Hinges:=[(-0x14d7122f,l5),(0x80cb59de,l4),(-0x25ed3806,l8),(-0x1e07646,l11),(0x3218d44e,l14),(0x1ca60728,l17),(0xa5059892,l15),(-0x7d94e93,l21),(-0x3acce180,l27),(0x7d94e93,l28),(0x3acce180,l29),(-0x3218d44e,l25),(0x3299393,l31),(-0x107a6c6a,l30),(0x3acce180,l33),(-0x3acce180,l35),(0x25ed3806,l36),(0x3acce180,l37),(-0x80cb59de,l34),(0x107a6c6a,l43),(-0xa5059892,l41),(0x3acce180,l51),(0x1e07646,l55),(0x14d7122f,l54),(-0x3299393,l57),(-0x1ca60728,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3acce180,l27),(0x3acce180,l29),(0x3acce180,l33),(-0x3acce180,l35),(0x3acce180,l37),(0x3acce180,l51),(0x3218d44e,l14),(-0x3218d44e,l25),(0xa5059892,l15),(-0xa5059892,l41),(0x80cb59de,l4),(-0x80cb59de,l34),(0x1ca60728,l17),(-0x1ca60728,l62),(-0x25ed3806,l8),(0x25ed3806,l36),(-0x107a6c6a,l30),(0x107a6c6a,l43),(-0x7d94e93,l21),(0x7d94e93,l28),(-0x14d7122f,l5),(0x14d7122f,l54),(0x3299393,l31),(-0x3299393,l57),(-0x1e07646,l11),(0x1e07646,l55)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x2206400800000000940920080000000009819002000000001a0148020510830c404548028000000000703200400000044220718040000221306019002000000001100a40100000004c180e30080000000241819802000000190701cc02000000128a8126010000004211034300c012c2b08204d20080000000906018c0200000044120446018010c31084096401000621202606620080000000005018802000000000480c401000000220a00c300c0000004c2a0718040000000026014802000000000a81c4010000000a46409300800002884407c18080000014848070c0300530cc28813480200000004418063008000000001a0710040000000005c0c801000000000681a4010000071144084301000000391481218060000184510318c04000000c45206c601800000000440e200800000002438198020000000009034802002988218812c8020000002609022300c000000160a051804000000c824090c0300000000048124010000002a0c013300c00000000028190020000000a0502cc02000000cc2605e6018000049084032301014c144130096a00a000000130b018c02002b0480b013a8020000000004c05200a841480840066a00c0000001309018c02002905409007a802001702807005d40100000000130049006000000000240c801000000000700a4010000000442c06300800000000e00490060000000012014802,0x68124010000004a0900b300c000000001e0290040000138110058c040001284c12016801800000001e009200c00003488201918080000001611014c020000000d8980c601000000000580520080000000036029004000014848004cc040000000d8880c60100000005848073008000000016004900600000000d8024803000000c8160386018000000682406300800000360480618060001a01040098c05000000c812018601800000681100e300c00000311581118060000001917028c02000004609815c6020000000005409200800000341680998060000000002c0c8010000000c8b016601000070883026a301400003888604d1809c4143103028590060720a310604ac802800000000640e2008000000005c02900400018218c09a8c05000000a432068601800000074140a3008000001908811180600001441203e0c04000000a414038601801443308c09a4010000000003a0710040000000032014802000013118701c801000000861201c300c00000310500e180600000208480b0c03000013108680a80100000008c380e300800000000420710040000000221c0cc010000000783814601001c45208807a40101c2284310124a00a007114432026500400000004838146010000000001409200800000000018190020000000907024c02000000000b80c40100000000015032004000000001e0310040000001915028c02,0x68580c6010000000004c06200800000000520490040000000011034802000000000d80c401040c610a3028b401400064230d0162006000000001d024802000000000f00a4010308428620170401400000411c813180600014218c09a8c0500000a21981346020000004219034300c182184118165a00a0a30ec10c0a2d005], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0xa2b5f5991e08203d287901c301ea146c20646060df4705c497533940069376650098407c02011803b71b00005b8d74226e6e8bbf664039c08402dc6c00590659374eecd8aecbd6a92d021912a0a1541a02cc91c40c7045044003000304b7ea60f6fa846f185ce3b2c00da22fe764e0d0a362d8d3b407fec82dda7fde168f07aa0ce0b5852a48da0005ee423c460401b03a0dd92515fcdb30423de7aa981e43b73448084ed8f90480066f4fe25041d00861804de6284696044aa1a05977284d5c060651261f24105d38aa0000820b71b00870002dc6c0060047b16754100016e360064108001000035c423827648c1667a040626631fa08114ac14422021a759e5860c282eabc280257ba7f84c103c010b2f7bb00c242ca002e455fcb244c8b15191021c5ab715820a2d9926b010102b065198e00107a6c663001fddcf7382002364a19a09210440180001c420006004234460840308c01f0b5bc9571344f0558200e23831db90509e13d4dc5801e5e1f925041d00869b63cdaba83852cddb1321a22943fedb4c1002dc6ba0388016e36300821ea1d87c02082dc6c02100005b8d8007004366c5b42904210080000dc108b05e9a5ab030d671a37c4c91c283ed6408d3af2a519450a056908d05bd1e7d6a9a266aa9d78cbcbf061ca30401fb1d4b5dfc5424b8c080ee9bbc7d6ebb51562822a36eeec7cc8836e38068eebac776eb4c8f586d128ebedc2118271a6d07c93f10207032478c1870ad2a10005cd1403a36db91a27b34804aa30400cc015ee502053b711ed0001cd63db29c0056ec1ad80e908230100000e710004b73c2aca4efb71c203addde610510a7b5f0b000a6a6f448003e010d36a755a9d070a6250a5a434459a350bf8e1022550d0020917aebba00820b71b008400016e36001c00dfd45b50d0005b8d7414801080400006d884582f490074c40111344160343126a30400f0535080303875df484863c200620dd9f904104412997542400306d04e6b000087515dfa0013456d0292a8808280200000f990110d00026b1c2c4e4dba91a288b978ea2440432c56460640a2251460ec9f109896102d7c8db28220f12c7413840f804011007a6141b79ea34b34008ed450a05fe05a10103b81dc51a251c2f1e03031575fd202826d9951647001e6fd02050103e0108162c6c2168d2c50555a11c2e8a0213f3450094c93868952166400c0c89639ec9618299f0bc40011e67f0e14040f80400005f880018b1b71b00005b8d74226e6e8bbf664039c08644a828550680b22031422812410811400000bb7ea9cfdf8950e736f181766789551d11ab35c88ef0639cbbe16dc41dc5ba00041e4001b0881e888004e348450e800679484110e8581d2edd60e12dfab9) <<< 16000) + 0x0287041c9c380028211ace50224062766a7806064d6cf0b8080f2cbec8a180d1939058490a2343a85a62daa62c210100000e590280dc1000375090c40c4e89ff37658616ea682c44844d73e68522840690cf8ec1056aaf538e01004b312928a08099dc055ac00036bff847c024a45090051619957c5d0012187626d93d1018112a85c0141150d23d000a10112a880004178e51bda01209a329bc93000482fde05202fe34591b098814240140000e9108215d5755ed94b1febcf9e9021d5fb038f8ee5fbafd4189cd3ab40000000000000000104471470ca08708404104a00600300510c8e0080340006b48448e8220640342a08715043028001844d91b4dd24a1442013882e40ac707b498a1b13f75781027619c9e08001d2ee9813040f0042893ff1083c5903a44f4e4a203566111102a19467a914304ed7ee61036d9d6750d007884a200e005197aa20a0207c0200002fa6c8dbfe3f0a5106584613450c3c2320c8615ff4dfc82413a535b2240202f22ddc400910c0af13820f804348184bf660591bd136970a20918f20f0a1bedf657a241124dc14a4020cd14bacd001813b860e002c57ad828041f0080000bd90850500017d90841184182e894527cfe30b20783bd01a28810f26406c815bfe42eab143479330ba4d09feed480d3022775efbaca0bc2857c1a0a4041100a30a8e70dda61e289239b7f6d7928842ef156e45205650a5e5a081431bd98cb51a3021c71519af2282ff085011783401226db685c1c012d099f86600d0e11d4628d12105005800022a31f53d42286405c75a996592ecb87dc6e727fb938935fa1d6681b030d030000000000000000000000000000000000000000000000b4449050e48e20458248260016b803c45a15c1dd2e7f8f68312e6c5d14150df1d4ee6f0a3c0d7e8f4f103c34501898f8593f6914d5ea20ea0f1bd234af038da2dc3370c1a00078840fc2403e020007e6210433a141f88f64f040ba56a8fcf21c52fa9a6f890a20135bbdf7c70473481bb3c300293fcdd950c0627026f2b0872ee54413820a32344308ff458d0c8bce404a0380001fc205013a1856a4475b3f9b67eef3a9fe20fc7c87c50a146e997b0c7fba403fb9259c7d8880d6018815e7071dc012543d026c0adc5dc51ecb29c716449facdb4913bb237b6d6bb23fd3e7af45098673cf60c4c17f0de63280c3a10c073e84053b23a2723b1bafc27d8ca2ae75c31f4384150e646119d80491d1404c747d3cb490a20baca31b87f6a90f92c64d33b9cc3908338a6bc3aee6692af3c33c264d819c68c58d12997adfb490380000000000000000f84a1481471451040410460030052d01bb8a4b3cda99b2cf0e7b072f36b7fac901e7840e2e88140008c88408c806854000dde4200a40fe3203a09000bc2102c25c0c2119563e6ae5959b794fb81c23b3aad3921678f28cbc80e86086806155f10ac1bf028ebc710229841b53ad68e65f6d829fc204902b2776eab7be3c349ac7152a00ba971cc9125adf31cb2506a3230e222ffa8ed4cdd3200c043e57ea240363b0d27262120b27db45c390db2561de20931e72d7680aea45405a0f00001f01c20c600144864604679a5da34810111b658f6cd03042c0d4568191408a12240f2b84011e1a9e61c6540bebcc23c0951005722f46a548219e20e31281f3d910a80a000041640b0c60fc6307d2503e04c1ec140f40281bfcac3e98c4385a8be68696e182bef3e259df0a124a710e9368801162225c1b4380c5ddfa2b431404e28bd56dcaa21e3461fcfa2041470cfa008d5467342902c612021bbaba1143ae64d4ba1850d741c15a6c92306f3338c6230801406f16008101c31cd37810483eafb7e20e006d9ea9066001a721e17b000d49102601c50ef523c91638a1aa7e69375112300a037aa8018400a0378b00204079361fc642086b1b213c10800e0b77f1680c006d3ea7dc010013cae0dd3c02a24409c0800003f440c8472357d23e3a6ca1413ab6536048b9ba04c067201083f4792c06092ec401b00a0078c2c8cda38004ead9a000803534a7e0e0a174c32152e37818250180000ef106711d100018844e12225f28fa2a4099965ae0a881016e36000382e71849b014017ddb0d4c28043c52bf78876e685b10051f01896143901100800006e48160ac0ac5605403b2695c50bccd0050e0cc3cd7efd728500acd56f4d49228d9564347dc05104d99732b15018607f1fd14190182152a0be545406017e352f71f8005a4d9b7b0e102013bc4141681c28703936809b3ca14e6ddb43381245e9eb83eb3c070c06222ce4600c314394610c60608048184bba00c10c5ba071e40600ef699c99900406809e0be98803b8414150160000860d11113c2ff4a048c908e8192fa4884f1dcda5764087088d6f5b030402461680a01041b917dca2028200ad38df602804b2bddb51008200201505d0044220b0a009000040c4001a288007701a2009a7ec800306a8519c58d8c133c060f0f2383178423f9d0c089edbbae3c2801e0f0289f08000337f9140000a029375af01b4061300c206620a6a88042050179a7b0001c5e4df94ae701c429983b5e591c287fe6c359b1824820d4c9f01810179a77e800c03ab4555c7c0211018500480001ce20f2220781103b8881d8240ea12074090398481c8240e2020700100023a906f398371ac1b4c60564b02c218360ec1ac660d42bc2183cafe18781441f5c6ca320020408c777359208010678a1a9610e06328634d919140741273e08e61004c95d7417080557f62ff542aa20002a9e543094b203896434)) <<< 16000) + 0xd31d5a49d50ac0d10140100400c00e8753a631bf7d903bc9446494cabe35497330795c0bac5116d9721dfa89f63c86350b5f4517448e0a0a99e2524e8f833715ab4fb4d8f1cd23ad67a1080241008d4ac751ddbee4b0e450bc7e4ea986cbc91bf142339bfc876477ca827c1ee55d2ae93ec92bffd3a622aace44f37da79c14c0c589cf243fff080a12498fc3c6c656091f4bb64be2907e1d8f79721bb22d289226fc7ca2f01758a17f405231293c48e645d6b6fb22d18720ad4f85332cee007a4b8000ada5c89f29cf64fb5f7c8de0f4fd1a0c90d9a5a6981f448b6a9a443027dda4d3277ba4c3bb19978ed00eb79b323e039ce1cb0f32f3af87a4ec872f7ddb6ab961912c8995ec1030c5a85ea3fbb648d388f8a931390e8cac1d1d53a92be2225d30cea92e80095f86143a48ed2043d9c390914c6749b6000129a40c857e84800f2dcfda9ae4bc3d399a0800782b9cca3ee8fdebc51119eee7a55061ebbf7d4f810f44fa00000000000000003e1e4d1c15097cd2d9460168ea757b5099a48245b8f458a800000000000000000f8c918808704b004002011437ed03b08b438006fdabc72de0da8bb01460f6209f8f8392fb80b16aae39b8ddf3062df63aaec301d8e033eef39038c2d4e1f98813b532357bb2c7176be855455f687ca2dfa11a6e7a1a94e098858850926a000ac841a4660d02b067158330ac194260c80b06301d0a2999a50a533ddc619dd05ee1f9e398b88e3b37ed2ef94143941b04778f46b64d80324979c9e4488e29b26ccc55e769f7162d9625aee9d142d1070f945fdcba5f56cd30a8a1e524e55c9711d00c1fc37d268a26b99bea54bb12bec1c64b57490616db2dd1cdc0bfa0f1c585fba9afd8000d9484c6eb143b68af0874fc8790d71b122489acb813e4b3b7fe97e7e7f7096395b44dfe8e147fa82bd5661f65cac3b5b5dbfb1625525000723e60befd023f216d6d698259bb7006592f337c7bd69152a9b8823fc9ab75821394d1b90cb3b691e40ccb034919c8d5aa39af0542d911031f27176a9a84de130c59dd5f5efc29c8a733385e835724d0501e72836d786948f3356abe7000a63ccd87b2255a665453eed2319b56645b8d800aec096911373745d7a46e19a04202dc6c02bb025a5d38a9ffd098bd3c0f1a19b688e285b38cd3871160132503e767c392f71e0547e800000000000000007e5500d6918cc48d2a6c8982c7af0a8c648a148e34a8140000000000000001da1210a1040820880006dae0900ae7f98ecb0a785fe1bf33f5f33991975a7267ff7bc4937cfa23da7492c9e5d0c1664ad4de32251737489aef327641bd69180017f41783d2e2065c84205843eca5960835405ad8061957f12c825c5519524e68002fe10621d83084eca0bc6817ba1e12d162937ccfec59b0e5080c0e1929b91a75f64040ca801b57ae31f102300916fe0b90e7080e3f4eebb26ae75ca00229f471a7a090e301142ac4a031d5960005a4b5bb4c1e8b501d3ef015048720e00002ae300c0100448603570db7bd0c80c9e58306320887a63d94c8292638e8734aa06e3970d9ac30094090c16d3803edbfc9c44ef9197045b35fa2160bffe3654506cd96a3458b90838e201d5850e10c607e2f456cd1f13a04cd663966b2f5a123d4da78a8ff7dab1249dc8882f9aeee45bdb847ab4f4197722cc5e02b63ace9fad3d81eccc7d7674cb931006a98a540f996bd209fffd63943a674572fb23d66c0775cbce4a308872ca7045bf90d8d626331485853b88b90cff3b71763ff7a5b744100e4f62568f1867f1c4000188483108c18417f51ce5d5c6210b9460168ea757b509728944d502df3d700000000000000003d8455c5ae1bd02e4d52f62c75c0b33892c324314128018000293a48db0395a04c53d37dcee463d1d1f0cce99a56b7150ea8ec1aea53211ea5b7a1f556ed4e18a8528b0c589314000cac8300c80e8340be12000a0d20b64bf42400796e7ed4d725e1e9ccd04003d05fb79d9255cf8fabb5d2bd993fadfb9878094ead18000000000000001c9be6b75ca10816648648230228018008007692b1fcf5396e48491cdec612344300c3e8dbd4a8f45744e77595200056b7dd31cb60979228fc8543f10c82a88ca923072d64c5358c358bda00076e4178860ba1b80600802287a861993648005755ce6110410004201002008000022200017260200200800002220b82b82a50314e41c101e5a5872400e5a003f14019f325fc009040800200841a01f05000080905b1982d06e4324a183ac020c0f29ba28c0045dfd8a6580076c1d1320006549ead0a0089268bdc4026182100800d0880a0140420200017a20b24a0582102b8a8158440aa0a00048c200494c40b0a60565302a01f69c4fbe84141316146bffa8f5b8979a1712e872c6a3900000000000000003d15ce651f747ef5e74a471adbe39e0bb65b33d7c50b2e20000000000000000f08608304a003000140021484be5f935d1c1abac384a2c3cb5b8f88c2fa1322ceaf54e71c234dbba11dc22208ba10fd2ba7ddfa8e578086e90adaafafbcece8ea0106e0e58d06335a33cbda28033162feab8424fe0d0f30cf64c711110b153870546147a3e94a7e3ccca34d6c3f9a34b94ae714a45d5b938ab16001135bce5cbdad32f085c86c605fe0ef3ce8a045beaac865ac46f921c448b107667af0cb5b7a3d8de3d36fd352a3a39cf2b61449083aadb8d802f7c5a66742b8d2f54a4ea2c0f8db5e262d8e446f147dbfffc4e9f23bc233c655cf569d3400000000000000007c4fde5aefab78413d0a5c25ba916ae7fb)) <<< 16000) + 0xdbe3b2d6d0000000000000001c19641031021418a18c000689cf131903140b020fc3a24d2d47e2b0af72c429b04f6aedfc9a695bc8bb89790bc29359adbab8000028a161952e541d1753f896e316d53017253209d6214418b933996251cbd63af609497e7b1e9ba374154a60a81bb22c2c83f092418c9a4901831a31e1b428622740b006004598e08820012920f804014c540a41b0510902802813c1409c0204d010260080006c88003a01918b699eec4677fa98e384ed27a6c88cc887afe889d91e4e3883700ab03b067d75571bb48f5a133418202b7afc6729e6a91828c753b42f4b4d1077be1960c99d6faa8723e12c553ee8634982fc323911050067dcbd74728877071c9f7790ace2a506cb75f24c8eb4c88e80cd39c00048f834105d7a12dcc4c00501e7283155774dfa820dea288d81f912b20d4d519a2df17873a979a686e6261416f44ab96ccd50200d22ce6b67ca18712e8d63b6428e7dd8fd6e8d7697bca88a08eabf286409e7f75e9bc1a35b5df20053a3a70ba2cdd451934ade16fcb748f1fc08ac2065bddb8fe9bfa9a5f9c192b9163ec4da4369829a6996e49b30d88af3389a2403445b1ca834c6b796fe8b519103bc28f7bcee17db804b20a6293627091cf3f84b67823758331253a355c81e271c3ea83571e8248e8796f50862c6241b860d34d91800013f640063a48026e51db5e262d8e446f147dbfffc4e9f23bc233c655cf569d3400000000000000007c5500d6918cc48d3ac35f07f769b73d12d2fa1adc6f460000000000000001d90818c00a0020289cd74be02da8be242832336bb0f7188d642231087725fbac02a71ee8a060ff94cc428393301c43c43d511ca9f75806d83cd5a55ccbaecac9ec2b6c043172ee6a3b5bf379922c171fe89f31d9efd41066dd41fdd3f6a820d30284a434c2b935c744c5e91a56bc9000039f0fd18905f59c9db114596d0b0cf0d9043e0da35552cfc3f7fddd65b3814550c3c6825808001a78802b7a9006d4c30207906efdb2021482c73203850450a99b8508027d52a90a00644ca81c1004238d6c7e084c234a1986600c21f403fc28d14e0e628230105b8d8059065935d0ae33fdbfe5bf81e00b71b02bebe26500b71b03460f75c07a0cc295032280b8cc00f3aed2376a942e2e05267f633ca5e7cd61ce92e1f5e800000000000000000000000000000000000000000005652431830c2100000d48fddb6543e5139fecc370fa08adb4d7677bbc0e97524a0365e431a6414a6ed0c51c31adb5d7c416fd8cf117aeff126edda4e74a4b1557f448eee88b6bcba4a1fbd6ce7623bb26bcb59539232188ecd4214c4c2d8e07e9c5e38544c058a23e9603a12a5b850b1b0d2d64dd4d8030a0d715bee476e0620756864606fdf8de583e0c3008d14754a482613974a327c4d6402a155e0bb10e1ec041ea1d26866e0f6db2341018700d0c2842015693308477b622e0615179e4dd6144114b83a70c0bd47c00bc2820de2e2024908112a88002801ce43b228900459f91af1c0050c131f432820880418524d011d11c61d15f5e030a8a31eefc511f6c7b50981627966e128295cd298213040f804000049c80019a90420580f80f0830a6959258d0f33404861488340960a2203dc81a18118ed77ca18227ace6f4900838db858e00594c43b28041f0084318429e63f01719801e75da46ed5285c5c0a4cfec6794bcf9ac39d25c3ebd00000000000000000000000000000000000000000000ac640e38c30a288402303026203ca2195fc53dc40ecf1b477dd054de411f52bb9c92f92fc471ca8fdfae3c4a0b41ef4cedb589324d39e1dec1f13576123b4fe2c09c264d0003c72094039200cd0ddb481a3806db36a9030709d58fc93e38c40afd2d1f461424d0b19200610114dd75a0041cad06d1a1c580050cfe43d8a0031208492f10002c2f5577334a8109c0810385d206a88e3107175cd8c29005d7c486110a6aa619a0906b4ef5020cc38152613021000400004acc9006686eda40d1c036d9b54818384eac7e49f1c62057e968fa30a126858c90030808a6ebad0020d44fc9a2802c002867f21ec50018904249788001617aabb99a54084e040d98bfc79a7005c318429e63f01719801e75da46ed5285c5c0a4cfec6794bcf9ac39d25c3ebd00000000000000000000000000000000000000000000accc827f1e33209fc77c39648e970e5923a21129038e30c28616717a3dc6c24badadbaa00f24f893e846f93708d44b4530d83a06c378ab0f9e40416e1124553b52d14c71501166889a2599d10e1b3739810257d00b01d8862eb59529ba7dbeb221c2f9014bd18a000a264001d5480056e90491102402800425081e048005b5481d8e800724482396c1186608a1ba14dac585a0a251378e70de5d5a99ced3adc894805761a2bfc755cc7e7f6057b3c447e441ad7ea300cdeaaf697c8a06189b585e5980549ebb1f4b140082cdca7a57b3d1a88cd5b7f8fbe62bd7a00080769101d3a1cdfdfd7263248bcf92380cfa889055cf2e0195666379790a5f4a06859ca5972d1c0073a31b24c432015c5651c1e70b13d229308175c2a64590aa6030ff1cd911192ae8dbb7b945937712de6530bee2d24964dcc5e4f1064620b6e0876900e0d75ab36f9fc13ce0e534911d0484073326cd354827c42adda0ca50562696a07257c239c7712289a0202181d518add6f0f9a553d76e5e1c86a664c0b5b27021ab4444b4e0c156ccd633be4586a66195c37da4b241cd864166d2ae3768b14f170701d2cdbe1cdf6b3eb3d83d9c6897d4a824a7b88d51d)) <<< 16000) + 0xc3bf96e910020031b315217961006fae57f964c28d6d42254617136fb688c44dee040039993df65a79e980f62133e3070f627dea7499ebad4a52156000017deaff8a03197949c69d20cf70127e147045b6f0e07a38132a5e014a10eaf639d4d445921605d2e7b6892d25227ebe6156c4c59a25988330a540c8a02f3aed2376a942e2e05267f633ca5e7cd61ce92e1f5e800000000000000000000000000000000000000000005621032022411c10c11000000a36edf8c967438da7a408659c37fe8a0168d1a432d0749f7258bab32676ceb710881b2e120469f3524f16d55fa51b8c2878fbe69a384a514cd6625080aada0950b0c445ff9b712181c58a1da3000c0d288de148082301479640bb1c6cf17eb04f351828dd0affd28417ec467a58621a91e3c90c3e9d05c0808d711bb818007dc67c814040f80400005f4f186265bb1492401298d70a2613342132430af5d7745040471e4f8808992bf7404c103e0100440100009e100048f3c400b6e3141c26b9103939c180006fa81a1a448dd0a1c082648dc08a0822588bc12006cf003301e186ccd4e1040010e29062c646182112a86802093699b3b04116e36010f0016e35d0380b17546c0c0016e3600b800f00228a008f1744708c564685460829c260684149c3134224003041c412800f80400003e08218280009b881d06fcf95a9fac079a05b8d740f168931cd9182816e360038474474856202158328cce0016e6dbc18006cf00330c040f8023cf0a9d7fe62a4e90a078b177e49d8aaab6498e106fdefa9fa4e1057142005b5d319730c49e1c2007c3244cdfb48be582027695130604f788404010ce4851e4f075003d635d9e38cefc2fd9b2820e107e0f800028e39d7691bb54a171702933fb19e52f3e6b0e74970faf400000000000000000000000000000000000000000002b09e79c50c29e21c20209c0180180401006c0c1507bb71851e99fee1c25c392dac40873f9e2a4800b6c08e2a083a0080000ef20860a0003092000e924002dec8200ce0cc295032280b693b7c3bd8df4d0daf350a3f3ad3af3f9e641331dbc516a0000000000000000000000000000000000000000000000017b7de96e99cf0a28b9545877c5b4214fb8c88c442b01800000000000000000000000000000000000000000005632c51021410811400c000d6c773f0eb6a079eb728ddc9bc84daa007fee16b586d09997b4fa1841b8be329c0718f051bb2e55058237d1d4beccb35e18c39dfc1f985390c8a07e12004090002b3904211f100b3ad551048808d0da820686af9d5cf2648402c7549fa30404e85646a20402559ac86083a7e4630ba68023b19d8285800f4af5c5e6e41090051c40559e246c15fcb091008926480cc688230817de37cde9305c34301e6f9e29fc1591218175a56cca6df7c608057fed1895eac6184197b33fafef9fc04188b96f261997fe93ab814c021c834000098cf100b3ad551048808d0da820686af9d5cf2648402c7549fa30404e85646a20402559ac86083618e85ad068023b19d8285800f4af5c5e6e41090051c40ab3c48d82bf9612202249920331a208c20bef1be6f4982e1a181e6f9e29fc15912182eb4ad994dbef8c1015ffb46257ab18610cbd99fd7f7cfe020ef1aa69828db3b13ab814c021c034000096c8002261d24637eaadcd0c2b47027c2082dc6c020a0401e847c050405b8d800107d1f3b548d017c8b70ecb000b71b002800200087101970027438a057122904881662865068636e2fb5c083cf2a73c8400009283933001000400004a4f18089543406922f1d708668614f3ecb610416e3601008392eb8140680be803f2e58005b8d80020002dc6c01400100043880cb8013a1c502b891482440b3143283431b717dae041bde71586200004941c99800800200002524000b148208480016e882008ec906e5e54441012db4cc142448deed07004587b32140c91942b8094307802007e0a00401000091903e1501e82807c1400204440f03400529640ec940060c4400d9f881d1280b08600602b71b001641964dd3bb362bb2f5aa4b408402dc6c0057604b4889b9ba2ebd2370cd02166413f8f19904fe3be1cb2474b872c91d1088c40c504404500400300eb36649b64932ec11be739aa0d663f135ac4fa385e0ca057caebc2810d3cb5d1d86d2d09fa162aa0c7e3a61cad26e81c84c0e02606e030360180d00c0d4076e36002c832c9ba7766c5765eb5496810cd4abab134814cc827f1e33209fc77c39648e970e5923a21119018611008c08a0104a0c679851d47fe09b88c372ef3c5202b52078b871380842bff2487a50bc8d4368399112cef02b2e70ceaccd576ad6c3104c40950f05f593ba88d08d60ff0ba885892d40d007c403eeab762070068c4dc709f9e88ff8046203e010e00d96839a637e2a42ccfce7393b419785ef50d45e8000000000000000000000000000000000000000000156c1b5f65f3cd241a14da26ec434dcb01888ed99f9a60000000000000000000000000000000000000000000559a95756269028c71840c7083046003020f1c1ce3495cdf45e4926283196064307832fff5412e8a48ee2e80e15bcbe0b1d1bb8cc2e4faa93100ad9519ba5753df12cf610d22e280027690005b12066330321981888f84871e33d909a892b4b46a8a336e88d2a53b23ff2bc3a11c6077601ba461efd460808a6e65226c119ed8d6d866e92c1f534d69d4094c5defd3b8c615c5d11375840c04625409f8d6761fd2c85478bd53f1096f38b2bf1ec3804ca813e3706e9171003dd0e14777d)) <<< 16000) + 0xf5bd5ffe6172a036cabfe7fe59fd6f8e4cd4e672726ba0e22b81018100f82746bdbd51b5bdefd7f127d28bcca7d6690a620e19d77cdaabb90f900a7215fd72ba6cdad1797c69cefd6aaa905f0b89de1f0e197ee4bbe75e047d40042aaf4a56f4e64990b79499cdd0bb5e7cf7c40c731e6fb4e77356eca41ee6d003001000391902f250171080b45400229040b0860564302a01db8d80aef86ea9d0ae33fddd49c603c016e36057d7c4ca016e36068c1eeb80f327d95669f7bae8fb7a75786026a7721e6cdffb04203800000000000000076650c50618640238230204709065ac3404ee7bc71601b5074ddc58c32f6bfb650707e416f6a3c4c0005f92568588b4cf50849062d8a90095689ac60aa420957cb4e8462ce432edb8d802f7c5a66742b8d2f54a4ea2c0fb27d95669f7bae8fb7a75786026a7721e6cdffb0420380000000000000007708ab8b5c37a059be6b75ca10816850c402382302280057b4070295b2bc9ec4372019cc5e50737098868379fb4c824211037c271c80073f250792e47e893efd7716a4a205d9c3f1b1a88939a6c952ab88a59d869500041720523b0280981382e082ae062316048f7e9e2481117ccce8046203c0100200980f80e01802008804008023441c6e1b444860cfd00a840e5a857549800a514b1c2c00158f44208000981c2026081f0080000939000164301001004000011101c150000f990261d8128cc090360461b0220d01082edc6c017be2d333a15c697aa52751607e115716b86f40b21431810c12c02401c010000dfa7ac09d6561cbde06bf3ab180c5e80cb9338c54f53f0e40c825d0201580f82e8701d3d6fb8c900c32e354cbb68101d7c497966015f4a81de0b20090102746cc140564fe6077a0a7804452c95367a4892e30353757604430396b057a38a6b50af9e9fd22930884e26f574377b4dd5704f5b0c2203bec8b703e62ffd89b2420031c3a9c1a47a9419025d52c1008387c1b54043c688d8df631099bb4f81b209efc99b69e24619a25a880600802000008880f08c0101603a0bc72214740849873722dab722c585f233a42449131158000000000000000000000000000000000000000000015e115716b86f40b218414324218210110008000b2ee2049c649212b41cd24c86c1c62315ba7c2fe09d875fe0c875a2ffaa5a84537ec0089a3e480664738e22a0419c512d0f0b8a6a1776dc6c017be2d333a15c697aa52751607c07a12003cb73f6a6b92f0f4e6682001e792d668fe528d63b41767d28ede6d82c604429b0b9f8000000000000000eb7de96e99cf0a28b9545877c5b4214fb8c88c442b0180000000000000000000000000000000000000000000568455c5ae1bd02d4a24914404000025fd787c3262ac218d1843395d39489444f3e64e4b07e5ea9591f23769f29892b22ec042745c55fc56a0e493bff2bbb87fdd2372b5c9cec45fc3b81a9da148d37c24835445ac62fdd3fe7332bf4e92455f6efeb9c877c002397ca2a3cdd9e4424a63720a5a0acf3074001c30f144526cc6261733a8a0c19f13e804f48fc200027bfd748f8e1442000060f8093f2f46800419dd729157f444536d93ac830760f000019f200191e407074036120011922034420190d0009f790172d000bbd9f2be454fba6682c16487818e48e6baf882b905c5260000000000000007229b757456d24056c08ae68724429f179aacd422c000000000000001b422ae2d70de816640618638030028002db195f756922089e66c0f372cb1187895487c64234f1c920780e069f6cef04850b803e4f27521c4ce09d6bb0d2c87a964f13c7272debdf45229aae59ca9d0bd48c402c1175165485526e4ede06b6ede4dceb8879460d67c748f68f5f2d7548404e5b6e3600b625be39d0e577f357741881e050ea171a937783132f55b09907574761ec98c7b3958000000000000000e8111d449fc3c05d53994e4ac3d42abdb6a397f000000000000003375c10c731437132bac3e31fd85606eaa60d95c5d42029800000000000000000000000000000000000000000000016e115716b86f40b51c52440c00800030755ce4120579e427ddae56fc43dee6c2e2cd5b15abc82d8c8911a0076f7d00710b1c8313275cb06a6ca027066b5c9271cffe4a31ed8e017da8c7ee7379bcc60d477f2229798f4306e8413e8d0a4deba1581a0c4055c216a0e2539336e30ed70b770c5759f6c557c1b03ba10870a6a0ce435b6028020080180100001b90171500041710161d00a8c8050540262a0120d00884804014001c6e400b9f48022109c9f6559a7deeba3ede9d5e1809a9dc879b37fec1080e0000000000000001d8f2be454fba6682c16487818e48e6baf882b905c5260000000000000007243062863042822021802806ee0b639e6237f1acbfb618dd3fa4ff3e34acb8cacc569fdc803247a4bdb88b5292f630a19a4e1d9aa7dadd3baca658d724900a7fd13e9c6d3b7ba5b107e1bd7caf9153ee99a0b05921e0639239aebe20ae4171498000000000000001c8a6dd5d15b49015b022b9a1c910a7c5e6ab3508b0000000000000006c4308304284280200180ac554fb70d5c0bf7e7511372774402a400eea1091472ee0cd44e934cd58320c33ecbd216a39fdad8181a3ebdcbb37c6bcdeebc815df62d6335b0c769a3788044aa1d01840965ef128c16a45127dc50802dc6ba008284bb303e08000b71ae80824c304201000013a201e2200056e201c4a00d210060e802c540142a0091100406801c2400c020050100054a9004390019880084400202000010052691)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 27 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case9" = "QuadHeightCover18Case9" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 27 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case9 private def zz2394:"s095a"="s095a":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case10 open EndToEndTupleState (State qPath initial) open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l14 l16 l25 l27 l29 l31 l33 l34 l35 l36 l37 l38 l41 l42 l51 l55 l61 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x11730dcb, -0x2ca8a5d00, -0x4302b1900,0xb71b00], ![-0x2ca8a5d00, -0x11a3b01240,0x3e253d206,0x2af7c7f40], ![-0x4302b1900,0x3e253d206, -0x1229298c00,0x2cbf89300], ![0xb71b00,0x2af7c7f40,0x2cbf89300, -0x165a0bc00]] noncomputable def hinges:Hinges:=[(0x8f0d1800,l14),(0x130fbf87f,l16),(-0x165a0bc00,l27),(0x165a0bc00,l29),(-0x8f0d1800,l25),(0x4e705df9,l31),(0x165a0bc00,l33),(0x1a2874e2,l38),(-0x165a0bc00,l35),(-0x60c4515,l36),(0x165a0bc00,l37),(-0x7bbcaa41,l34),(-0x1b59b5fd8,l42),(-0x3eee6e394,l41),(0x165a0bc00,l51),(-0x3848b74,l55),(0xd13d9cf,l61),(0x7ab41094,l62)] def normalizationDenominator:ℤ:=0x2cb417800 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x165a0bc00,l27),(0x165a0bc00,l29),(0x165a0bc00,l33),(-0x165a0bc00,l35),(0x165a0bc00,l37),(0x165a0bc00,l51),(-0x3eee6e394,l41),(-0x1b59b5fd8,l42),(0x130fbf87f,l16),(0x8f0d1800,l14),(-0x8f0d1800,l25),(0x7ab41094,l62),(0x4e705df9,l31),(-0x7bbcaa41,l34),(0x1a2874e2,l38),(0xd13d9cf,l61),(-0x3848b74,l55),(-0x60c4515,l36)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xa42400266020000005821013300c0000002c2403980400000000b0024803000000006c0124018000000682406300800003504200b180800001d0130214c0400000e21181d0602000000000050320041982041a806b200a0d010a0c404590050000000c8a81e6010000688a500d8301400000190480a180600000088240c8c03004a0a21d80488020000c45216036400c000000003c029004000000a034078c0300000420a818c602000000220a01e300c000000000681900200000dc2b01b0c0400000621280d8602000000064540a300800000000420490040c815822008dd005000000000280c40103182302b00f24014000000001c029004000001a06c028c0300012044140148018000000005805200800f81e04203c20080000008828030c03003a0681080f080200170440d009f4010010c2306204d20080000002111024c0200440901980f4802000000000140e200800000190a00f1806000000c8440d8c03000000c4520446018000000543c0a300800000004c581980200001043701b0c0400360a822013e80200000000383033004000000014181980200001602400d4c04000000000980a4010000049084032301000000026140298040000001309018c02a10520210019a803001502705006d401000a41502401ea008005c0a01c0175004000000004c0124018000000442c06300800000000e00490060000000012014802,0x110480a18060000010864088c0300016884320468018000a84219026400c00002702200b1808000250982402d003000000003c012401800000000a409200800020c17017c180a000000000501c802000000000d80a4010000069104032301000000036240298040000001b11018c02], #[]⟩ def dynamicCode : Nat := (((((((0x289002dc6c00d20005b8d802c85fd018f00b1c2d1cf1072c516f1471c4104002dc6c02c0eae9af55820000b71b000004ef1265400322044008c261c6a112740b242163dbf8c0e0c0112a88000c0cd58a6a660020412d73efc6080001b659ca546003c920212840015a771e4750304041400e309bbdee4200592005b8d800c18e216f3d49c1802dc6c0030340e663cde100019bfcc001006315a4c88003c46025be090104601800019e208c0a000398324aaf20fbb4848e00501bd001426f2e3e11f41862b08d86a698122011ba060602109267923140b1579c73fa3001953c513480006665e73de0072450980500003e06c613634a18923558c1ef18914075cbf7e300587e2c5b00012ec59b80284a304201000010e36306135da4848cf1e003149030be41c37c487292cfa60860a85f2ca5a4802fb64b850a004dac0754004e2844010b182f02fb4248da2d2973c20647d40c878e08506e28746047f32a9ea182826a2f2220015a5358f00138a10804000059881b06c000c0cc10499ef665a040c0022551000487361ca2137848467a4a3829428402af389b9e1048fc8a06d005820eb82d18a058001a7d0ad1448036b522dbee00612285003091838c76092921c475ce9d524238cb2c5f840408c394ddc20977df282516084c92690620010c7c0d0a30007006e94c00a0508c02000034678a6149700faefa93d66084a2013ac0a374b092aae02cf1f08080222ccbb17e05b8e9566c1063ea04ce79bad953e65c5c280507de40af2b6bd65b46e808009a31dbd47c21f0dc44100004bcef159beedfc937519ab4feb363683249861543400005f240b424000dd44134073eb401282bcb86d5a48340a8a554d122f8816430c30a488388308282202050d67fa3fa5bf85f6658bf44474ea4c8fc52f907b8a2e081644108894910e237dd95984610c0a2bac2403ae8d7f9514168473b07880a5e40a38880046fd07a21801bf3c0a80030284200800019220982a04b15025088078340007687853518cefa405e3dfc3e71e30ab4d30205ec842d3d5793d079a854231178588102a2512ac492f0cff55940d19ec70fa281594f69b7143ebdf2837063735aea20800e8b18eef9debe5d5a4cddca79e3400179b4af89d359cdeea4738803fbe7483a06186faf8e8ff804ea894e9e41a45bfbcfda0538b1a53c48694b1d05500007e2704143c5b860586103a0c9ebb54104032a56d44e0c0857461bc0b21822c2ca8edd50c007819f3d400281c615d2ac6a0802c1b1b573100a0818b7886eea50c120c0a80900004324124560900a0470140dcda22876e0c709e4146bf07c0c1276c73c08ad1422872187c3504005093027fea07012e4d6d788a8a00c8a6f58d01041047b96d3d30d445d43865b2ae33961581230cc5c372330aa6a3b1ae27651408e02dd8d713b28a04701840134b34a2c82c72871c520004000c080080378c20b556cad86127fbb6ccbacd2000cdfe600184739e93b9d12c837f6f984903060044aa2000b04b002b8a060c0801406f40024037c379ec90124841380c309ca474f4a918) <<< 16000) + 0x476e82ec2b8b2002dc6c000704005b8d80030239d95f8fe961007a1d784460000dfad14a0805a54f6a6e08808250100000d79046050001e99d2c970920cd96408fd78a1e2c7cc679b92050e61b55e734714051371961a081d067384041271f4e0e840079a860614280823008590aa0ba039cb1e1c55222c9438007a12001c50007a120008214a58f74ca002f9c00cf8a00039387000000e9ada1f41808230040000ce104505022008000df8c8b56bca1671f4c53ad97c39036ee481446a6fcd2f9a6f1fe0bc44a91478a187fc79696a0948823ec24b25ca92c1217ad796e9e0c679ed57a530e705808cece66c22febceb770124c4ae86002b1d89a2aff6501e5d1b47c93c8000a1326feef03dae698420e9f6e2dee02e268ebfcaf0b430c358920000ea481880ec91002fa103a48cb12dfb6ce4a1400e4e1c00122d53a6a1daa1c1001c9c38001821c6c54d0ac20449c4fb8598051c409c05164b29ea0e2a32461e12c9aae450a00393870009163efb02475902800e4e1c00202179c047b102004d539788d8028e204e02800019120601a01609016848000df080e04f88a6f823f11480c01c9c38000e1cce77a01bf0c20962a3657e20012fe7f3afc200305e7763682080518a09c0500002d240047a0d10009a7ec80030751374a4221182cac534946f8e0eae67e1c7106048ef592dbf02804645cc0534100000cdfe60000026aeb68fd61364041480e2067be52144d8902800bcd3d8007168d355329e0384ec1721ca161823fb5c1b30e8e08ffa3aa9880604005e69bc0c1804ea2a446b2485010520380001d220861a0420d0208681002407e1203e0101e8080f0040760200047b20744303915c0103d4e39f3c2e00701ba6d2d31c95ec8a01d78a8d3dc9e1b080434a461382db000809e7dd5f93b06b935a8094e3e9a6509c83e3437f1bfe45cd82b545245bd78e4548686e0b0d20c6790af94026b52b941c086f2c20a0846283e0108395d6218211141a004000026903805f0de054bde9a0e44b2c2f280b3e54dfc3811df71bb00090507c0212283161ba262060577750092081d9e56c6102028a292b10001c4efeae2812030199981306110042061f275969208202206218318e9e73046103c0100370100005b9b2cb55d263082001d4bbc200868036da046183e0108040080200dc0400006e40003e880019110360d8002141820de8d3f80584e3e55613041e312956e12019d756adc6005606ef4424a184201080600802000008881a88c0d0260660a032010000cc903101d0c0ac965bc4865f18748a206598cc4941839f63581e09208100042c51771b7932848888058410297217ddf2c0553e53111000f03bd600250c2000858a1b5bfc54513c3fbfb40818d8368c1102d0641b28048183e0100000d320003e267d68025057970dab49068159a36b2020792d11da226ad1fc637da098a85cf2a03e000000000000000000000000000000000000000000015a9b4097c463c0b21c96f4e34502cd85e75e33c3400d85e75e33c33fff78296e0066f812a9ddf3acca44043952480c214000002e4491898e38f423ecb716a73d9abe7c57b3b10fcd59f5b3958a89aa24205d6dec1aee0940193e1ca4058406e83a5da0c50d66d71e26c11a9cab6bbd3480f40bdffc5138b28fc2f5956c36ad36b9a9980bbcf252b280c3aff3efdc870882afeb1500065a301218a03698b063eeb58983833d6b30860812e0c95b1880284529fd40025182100800008710301500b0880b43400158440703723037d257ea30634f42709900c63828bac28275cbac350208c54c8730180b1778306800204c504401001401c136d4bd99c10461f137700c10cc478a89401a282125c700035545a6004a28420108080080200bc2400006e608b5f046f24ead28efea003efa925b00810ce4977f1b9f9ed17681cd0608747e0c3c6c173800d763edbf36d15f94c6650600a9fed37f88d4279f72c2c18f70cee00069869179daace8ed3be98e220dde00106336ab2c75d87c220497e91abf27bea46245e38e97094fa06a58a30ec2b8000382205c0a01005cfad004a0af2e1b56920d02a34a34e5020605b46d9ee3800f04210008882a6c2f3af19e1a006c2f3af19e19fffbc14b700337c0954eef9d66522021ca0e19609601200a007a4dae4b88f990bda1b864b13426f92f6911bf4ecb54b55b92878e98dd00046a3564164969d4c515c29708341749c53e5ba34e485a32ce8f549398cda00080c40b4440012b44002b4c800e8a98daaea328358029044993ef30820cf836d2dbfd7a3bcdfa6f0000000000000000021044efec36f8698be808f38b0284b3b031a7c8636a0bfe42800000000000000007f000e09db53bdad5a3e612bffe994e96bfa41a79e4ff4404ac00000000000000000000000000000000000000000000000003118818608c00a0020028201dde81bc9ecae6b291f495ccf53ed6c3acc92233006b52f5bdde85613fe5d8aed3e590e40f4f50ddcc1512852960175a961802fff535beb8e4571f1962dda5f27fb557e245f955e963aaee7ff2550cd3057bcf7e372d31d8e8b203547485b473d218630b7097508b3eeac2b6d5168467c4619d929cecb774001ee880139e100402f36130036aa3fad000b09801b551fd67ffdac5cd346871421b3b9fd9bb0ce6092368421dac6629da402f2fc6404c000000000641f6a3ccc83ed47942332021c21420c11004345baac52123246eeca72e39a7e454b79c93e4dcf2fe79a85a8e281ae3ac18dd83a5b213ae81ce162ffd7ca86d71ab002a765749533)) <<< 16000) + 0x0982849adf9978f7beaa5f8cab03b91fcd11d78e0ff3327ed0196ace674458cbd6e4a599512867d9bb77c97b242d4c4da06f5927435720e362a4a1806413a23e88000000000000000000000000000000000000000000000005e12082021c21420c10410406b60a4aa0a39b8f77396e57fa89e339ee0651ab6bf03a23fd381f70c76162800167902c1181588c0a84605203914a0fc450f24345297b6c880eb8b1b15218343dd94d68500ab803b9c0c0021ff4d40598308802143019b2e958a10b32ed40638898187f6f0811043102088051d8f9931941084021346d64040f25a23b444d5a3f8c6fb413150b9e5407c00000000000000000000000000000000000000000002b09431421220e20e18a10408e01804010068000f510240500018f10281181386e451cfb1fe6d53a2613a2ab203ac4627c576bce866e1cb1830f3ba67e18a316490e1514015bb676088ca9f1c36f80c015fa8120945e138bcfcc08024257b5e7aeb1c6b4a8e12236b693126eb3453ec391313974b96c1833e559baa4836859d7130a2805e2885886ab190912268270ea1c41add804d8a0d8e651f3e1002a59efba8100b27095df1260c2200858ed8c6e4f414384b94fe4258a0eb7efc8142ccc86306c5880f6f0ac81020022550fa5014360fb1e8007a12014e084401002605d8ee0028c79943802343d7030c03a751c416282fa82b8050b57bec56c8a00edfcd2c84c0844010025010000a6100030320480a00046e2000f524000340018ee408c960443b0210148c267bd24c0c287dfeeb704059729b1368c106cfad5e0302bd8b2c491002c1f88c660cc1844010c20307f93d060c87c74a263049a9511fa181969cc8d00000246b51e8250821008010008000468cd1b590103c9688ed113568fe31bed04c542e79501f00000000000000000000000000000000000000000000ad97e32026000000000320fb51e6641f6a3ca1190c29010c10808609000a069d65ab96eaaa70978a35bf2192e633e196bddfe082c319fba805c1ba2a252d43f1bcf32e7b554b4042a50cb222363cfa3dbab902b9c708fc104aeca8adf7eae120c785b09801b551fd6800584c00daa8feb3ffed62e69a3438a10d9dcfecdd86730491b4212d6c2298d9e017346d64040f25a23b444d5a3f8c6fb413150b9e5407c00000000000000000000000000000000000000000002b47c21f17246816838e3063042021825161d08457a68b0d46c47d92a966c46293c17f6c25260e74b7170e11602a9dbff2f85f4065ce25349f1d62656d48a8cee1f11f8915f4a522d18bdaaa3136113bb03deb28880387e36ead6b52081415bb0591c99934a4284b229540017c880d028002a3480c8ac060576130036aa3fad000b09801b551fd67ffdac5cd346871421b3b9fd9bb0ce6092368427d175db401e02e8ede67185117b3df399576a1b50a312b6c41d0d6739fc5ba20000000000000000000000000000000000000000000000000063438b3f0737702e5d8e1f09be120c8f3bac14520414110104008d56e8789ad19e95417d715ccbd037bf277585fae44fb12d2cfcee6a1b53ac7d26b1c7400ab0399e17ad9c60c8178efa6d2a98a3f82ec31384c654c82c0e1859b865d932de572c1418f0470328bec79a62ee827e2a8beb917bd55a4ede36431d1435f0ddf9bb882b48c4d01f0500f028001c8c80e8ac070260360ba1a1e5698ad8ead300e8436f0eb8894aac43ff88204f7000f6eaaf8a93cbae21961b5293cc510242092271b57052e12cf1519815451f1cc73ec0284afc5a2e0c6ccaa47201e31a423f70c1f334850057009cb60c3d080d973a502add0e04b9e89843c1b55ec4681ea4edd1ecac3a0913d51d7a8627d2ceb9c285d241812038754ca111e378a0c023f6ba3086a79d6d5a9eb061c9812491214b008f9547034282b65834ebbcfe6470693dcba3041a8739987bf9e2b28c2927460447c064d6a691304fa7e7b4060c3225d3ea40191df26d5f5508149e2269b8c2a2551167a3400db7c70b2df2d6b7817343cbd2526e680d96217085b0e80001c49824003abbe202683d40d0700eec22ef80045185c381a040f8020068140001c6406446030230170d80b06c0541602803b1d433c206420b087b0548905522f6d807078a6923fc901293237048016733d8f80261020008611dfcc2c342073e0d72d8e05a5dd3ca0230c1f008610e363c2a880b4011940840a2a9216808c207c020026020000bb20002fc640e9fb39b71802ddc2cdb0220c2000840200401002402000037201e020000e620221b01005d0c73371dd028300ad7aee140fc41098b05044c5d25ac3008df188f70800e45b0988024c3042010b0cd6cb17b228607a3d3b62c2ba2bbcc10c1002f69ed030001a463f010035b0715b0098408402165eb3dc7284b0dba18cd300121021004000041100f050000f4900e150001aa100d0d0003bc90010dc2004b6c68b249c9b224a143074c886d958a099ef5687dd4404002aea45782000193b7d9eb0c0000393870004002a7a99c8594a3861480a38a26cfe5a578e2001c9c380030883cea72650e18539c08a22305ca635c5a10a11dd20ddb3020076d5c6c6e347042601440b0fc8dcbe0e2a4f34b53c4061a0e99d88e1ff2c9e65818065ce473c020074db887d30011004205002dc6c0038ab2991028c810b6ae14a40e1addf9dbda20102c6044e43818b44bf24c60000b71aa34e004601000016a20005744030140008da402c44014220091100406801c2400c020050100200800c04000dc240087400202000010021191)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case10" = "QuadHeightCover18Case10" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case10 private def zz2395:"s095b"="s095b":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case11 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l12 l13 l14 l15 l16 l21 l22 l23 l25 l27 l28 l29 l30 l31 l33 l34 l35 l36 l37 l38 l42 l46 l51 l55 l57 l59 l61 l62 l63 l64 l65) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![-0x2cb417812, -0x59514ba00, -0x860563200,0x16e3600], ![-0x59514ba00, -0x29083bacf9,0x7c476435c,0x6afd1b73c], ![-0x860563200,0x7c476435c, -0x2452531800,0x597f12600], ![0x16e3600,0x6afd1b73c,0x597f12600, -0x2cb417800]] noncomputable def hinges:Hinges:=[(0x11e1a3000,l14),(0x235b528,l13),(-0x13aefb840,l12),(0x13f337d8a,l16),(0x560eda8a,l15),(0x2d17f94a,l21),(0x8c6620b9,l23),(0x9e191b4b,l22),(-0x2cb417800,l27),(-0x38882e9e,l28),(0x2cb417800,l29),(-0x9fb8557c,l25),(0x4e8db9d7,l31),(0x4ce92620,l30),(0x2cb417800,l33),(0x3450e9c4,l38),(-0x2cb417800,l35),(-0xc188a2a,l36),(0x2cb417800,l37),(-0xf7795482,l34),(-0x1b2329b81,l42),(-0x24c18190,l46),(0x2cb417800,l51),(-0x70916e8,l55),(-0x11872c892,l57),(0x9d3d09a,l59),(0x1a27b39e,l61),(-0x1469fc16b,l63),(0x1f3830f64,l62),(-0x950e04,l65),(0x4c6a60,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(-0x1469fc16b,l63),(0x1f3830f64,l62),(-0x11872c892,l57),(0x11e1a3000,l14),(-0x1b2329b81,l42),(0x8c6620b9,l23),(0x13f337d8a,l16),(-0x9fb8557c,l25),(0x4e8db9d7,l31),(0x9e191b4b,l22),(-0x38882e9e,l28),(-0x13aefb840,l12),(0x4ce92620,l30),(0x2d17f94a,l21),(-0xf7795482,l34),(0x3450e9c4,l38),(0x1a27b39e,l61),(-0x24c18190,l46),(0x560eda8a,l15),(0x9d3d09a,l59),(-0x70916e8,l55),(-0xc188a2a,l36),(0x235b528,l13),(-0x950e04,l65),(0x4c6a60,l64)] def dynamicTables : DynamicPackedCheck.Tables := ⟨75, #[0x1105006180600000032845019230140000000c22080906020000cc14209c09bd0050000000002e1c0598040000000811c406c301000000000068381c601000000000001503480200000000320c81a9806000000000004409200800000010431814e602000000001d084038c03000000000001a06900400001583904808b401000a388c8580096c80303071430408035550070638298084004eaa00e00031c5304201314014000000000000a0640080012f15e20c03c500500000002086203618080000000410d402830100000000e2288118602001c7199130012d900600000000005c7819802000000ec4213034400c0000350921a015e80204071c30808035550070838398104004eaa00e00041c73082013140140000000f0b8480c801000000331282802d0030000000288620461808000000000000b03200400000000a4320486018000000014864058c03000000000220a059804000000000000703200400000000642206c60180000001b1109015002000000000002a0390040000000006c2405300800000000005801640180000000000b404c803000000003108813980600000000661302f300c00000000c82401e601800004d08c1200c90040000000268240189808000000000004c052008000000092108064602000000000130a014c02000000000261203180400001502705006d40100005305104c025a802801420a4042003350060028814208800c6a00c00001702807005d401000000000004c012401800000000000e0148020000000000004819002000000000442c0630080000000000380124018000000000012014802,0x40c4380f8980a00030c548920110401400000001041402a60180000002041201fcc040001de284148059a00a000418408610052401400000ec8c3803486030000000010844058c0300000000190880a180600000003109402c3010000000000130e06600800009215022006d004000013829042035a008000000008239014300c0000000000706066008000001c23040648c050043c20c14e0154a00c00002243408c03d401000004308c09805a8020000001ce31c0348c050041e20408200b3a00c0000000721880393010000000e518a032460280000031148580d90030001822842c00c9200a0003145284c00d240140000001424880d86020000002424040648c050000004948280c9180a000001047226036400c000004c82e8034860300000008a0b40648c050000010e09600d2180c00000000003400b200c00000000006a02640180000000d42700a0c040000000188460141808000000000007406200800000000108e81460100000020430c0d2cc05070e306101006aaa00e0e70630208009d5401c000738c610402628028000000094110068c0400000000000068190020003182302b00f2401400000188642201a80180000861183200ed0040043a23a18c0290a00c000000000844407300800000006a0a80dc602000000000000d02480200000d82882e027a0080000000006c380530081838a1820403baa8038000f818213c067d0050000000221a1605a0040000120230640a8401000048043052009080280000000841400f0c0400000f81e04203c2008000000000001406200800001e0420a007880200000740d02101e1004,0x1283a06318080003c82282d018c40140000000000a803040200000000001700e0804000000000004806100600000000004c0782010000000000002206400800000000005003c80300000000000a80f9006000000000011017200c000000000002606400800000000000d018802000000000001a0710040000000000044072008000000000002a064008000000000000c0c801000000000000781900200000000000640b200800000000000d00e40100000000000dc04c8030000000000d00099008000000000006c0520080000000d22080646020000000001b12014c020000000003622031804000000005821013300c000000000b0880a601000000014848004cc04000000002c13809980600000000002c009200c00000000006c012401800000001a044038c0300000000000120310040000000006424073008000000000d0480c60100000001a8210058c0400000000370880598060074823812006e140180000000a621815c602000000021011021cc04000000042826053980800000000078240f3008000000000d0281e601000009a12829013d0040000000002c0a079804000000000481406300800000000130900e601000000000000d02c80200000082390d01320060ed851c12102ff1401c00e20a18208147c803000000000d02803cc030000004186980aa980a0000000000064072008000000102388054602000000000160b038c0200000048c5380f8980a000000009212037300c00000000002201a40180012f0d412404d100500000000002c1819802000000730b3015530140000000e23080546020000000000019024802,0x380c40100000000000310248020000000000052031004000584a08c4025e40140000589423201148020000000002516018c0200000072310b00b2006000000000002407200800000000001081640152210541830079f1008056420907f810be200e000000000008407200800000000008e016401800000000011002c803000000000022809900600000000240a00f300c00000004a0a80dc602000000000c844058c03000000000361a0298040043433421808e1401800000000843202c60180000410c423032d00400000002402200b1808000000004a0900b300c00000000881201c6018000000138110058c040000004a1304805a00600000000001e009200c000000000a8881460100000002a1511029002], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((0x1e50022551001a550288394c1a3ca4130cdf9a33d747d71c18302d2f08a10208044aa2001a07209b122092000da1778b08000b71b004868202400c40b003c14dc0038b7c866fadc834b0ffc8b72883882823d31d62387c766e8322934709bd8843810811128f3be882800dbf7c7adb0004b78ad4201a903050038f3e12eb7a20079868320a3103cb09e13010ca240016e3) <<< 16000) + 0x6000f21cae4b820a710005b8d8000c100b71b00002080357c5d00490184a018898004d3f640079845952b52ce7931ee50f245a7907ded6f7c80710009a7ec8008820573a87fe08801752a0224078020137fdc168033d9dd4216d018500300001f42084120dd090001f490dc0500030a1c24c0656838ea3063657a782b10e141b0ef46b453058834d906d74b140134fd900038313a789a2c20e041f76d46ec020008b4ad1ddbd015093994f5a82362090a80800004266c84350967359c58abbb4535ddb0d101610109b1096258ff3b81372284006d6f2300068453b435d27907003e963fe6aba020b9f9358252434464c1ab841323941581400008508428ce87503b1d2c222848f8503ef5e30301fcf3510c283d1519a8142243008d9ee2003014955eb1e801800c7635424240400d017926c910e99117b480c6e60500380001fa363008b5d57f2891a7e3dc8affc4872348d39786242c27f871b9190103dbcc939cc508045ce58da8380048aab411f18003f7020e7688004632b406ec001400c89342902000010f10db01d0c1e83689b106902bc5c6e73a972404053bd7b6467100f349cc49a1dc38200b731e3600080017eb3e5824c10001150dd767b0000b3bf1f402d0808215e08e985bc400900283c2e0340001241c2c07f18d973ca015467d20d2af595e8bf3c800a7a4040d2040d1c2662860eb63743c7005ea785dc0019c6088021c5e84a4711a7140de9c1429c48d77600ca710045db257163812404b3a58000a33c2501306110042fe6f1f0d408d4d41f8fb4d5d2a09000abe1d41f308fd63719e4012b7311c8d78234787b69bd0202cd02ce2ce24b1d000e012d16db1c46268cf09454343cf3937dede0e5b87503aa1b5abf4acf49a3d751311b200852bb2e921c2a000c196a4d500030221b4120d9090002411f284ef3c7ef34a95dea8e8ca1802b66df73c405b0ffa60700e5777c3500651422008695bbbded7210b80373c01e31e202f19fe3c7051f431407ee50ef403a56b394b03549a382abae2f376c5957756d51df581de9d0f107c01d6120b8b4d68b7aceec7fbbfd5c1041dcec74686a9d1762e707cecf2ded6d2410f11f357f7632e3e2b9025a2e8fc6ba000887f7795690ba0f222687d3fc94505845580282f832bfe54d64194c8e241c3467c9b05ee4f9a1dac1f71f1851f45d000096c436064000bee6c8f85015b332917dae3b2b44b349ef037868a0710465df5c9d92d0445be4dd900f150b143df2e7f64a22aa3fb6decca7f4405b01a12e7b9a55a0b394a99e10cfd0b2afc15c2001dee7ac739e5e5da4cb70095554d491c3801e14bcf347c68bc94ae959b00762a8f1001553eaaf5869d125d5605391f772c8cc28212c0b48a63eb6ea12217f287b1f124b037838ed3c7014a2e4e9cd8c40fe2f80004ce210a23bf9bc7c3502353507e3ed3574a8240249fbb167cc23f58dcd821732de2c302b608c00abe1d41f308fd63719e4012b7311c8d782332873010c11c0180404166ba6d42610abc137712ab5cd590be310b217ce427245f4cab0ff9655df8821d99594779364f0179f9d0ef201d9d677b2c564a758e06764e68221f70be7a5958130acc0506c8a0f501d88b030722013eca9d528e331a80025090d71106b06b754ec0c349906bd4d8c80bbecf395490ca209413ab2671a540b22c62462062431c01800c000040cb0098cf4f731fe40d66d81f0549dd82f9c9142fabbc222b24d3aab9a3c0b740008d086a80efe6f1f0d408d4d41f8fb4d5d2a0900927eec59f308fd63736085ccb78b0c0ad8234050b8dede028cc20a1470c608104c0024a74e4810374c0515a9371f10cc64ca7db49e426175c30a47cd7223ab5964c3c87400e54bb9ca6834e8b58c396a4d5c1ed1c56afa48e32aa341d2843151598b0e18bb0089ac6081c5ac1ec38103704416000261c2100800009e9bf9bc7c3502353507e3ed3574a8240249fbb167cc23f58dcd821732de2c302b608d0142e37b780a33082851c31820413000929d392040dd301456a4dc7c43319329f6d2790985d70c291f35c88ead65930f21d003952ee729a0d3a2d630e5a935707725769ea9239afd89700a10ed852230386146c273f2810f53911f8e04769a9b4800098708402000027a400117886a12834c941a4320d10906804833c240012aa400875886702c334172203c37a1736d8d578b0389ec7f44ad3cd31a73c0c219e8d71ccb5b357b202823fc40407f680661900809795a048add3d82d100021339c9c33994ba969f009211be3cd36bee0a90412a521b60a688c1300cc01c88659a5e538c288fa0389079abb7e8df829a0308fe38b14b8c16968620234a5f898963a23d6400460510e328c87d7028055e196a0dfc8f8a41003b27d81b3c334a1402077bda1b611793b042805619435f64c64755da555c881ce1001f00005dc432cf41944a0c9210640080017dceea9d8181cea390565475276b6d77eb3501412c3021741e11016c78b24d80c9dd457684adbf6a3e5162edc8baf78dc391ca7000000000000000002098e10810408a02001579286d2a7e1fc82f36f77ce126b04f5d090cd5cf863753acb086a9224774b080a64881553463e47f4bb8e1c9785531d65b98398482235a9269b8b71ab534c8ff4054f61a976b74305ba00d45ea34ebbe0b7fe18b045e8d290ba1d760b0daa23681098d4c9e115073311d6dd3d79a98f229788ccdf1dd9791550c149e17b9143f8dfa000c646aa5d30385d48d478d34a1409977a453cc31e2aa540fa87d772c0000000000000000008a218430218230)) <<< 16000) + 0x0280200808a817ea813e682f7fbfc28c146b03265646ed951a3dc2420026344c564c405955638eae5e2d972e886dd5fdddb00cc23c7e47200a4216689e6a12fd0036ecf1ef3032a5791d4000e80863a8c318c618a5b0422d8620ac30c141840281b7abff2243888e12f9276d25bf61826769f20e097e2845e7c5c1c3dd08041ed935e0f8890013affd5de4631c0543032a3b078280392ccb3ab9e0404041141b056a8856916f9424178182c90af49ae8f848d22e84f0ed491734f541f4f9028044aa20002c00011b613e0480a773ec6e2080003450e9d00c000084f7e1004143adb304c8590404e020b2427b9ecc2f2468305bb81a0a14008954400245dcb1dc3b448140089544000026a75565205729013006000054886092c300961180b04d05d9231a31f403d9383658d048ccdf3c62ee83f85e4d1c50a00440927acb1107700048bcd15a0e128755daa17440a00440927acb110770001820834ac049a58ee60d84102087234e767e8ac943e0200404e590cea67c07a17028df1ef295d51cb13029164896019a2ac9192bece871250a002dc6c00245935df4922102800b71b000204059a683b21001be61758710000672c250080000c71019010002681044318210ec0fc37c4570320437f7c80c0165a0bc0001c38751675535543080cf18df7d4b1000352bd89b52c2000f1ac488a47101000013e86442e0280000d31000a9e217e730be39d93407b58c05f4a1ed1f737b1731630011e1a3000286c439db207f458b0ac4ddcbdbca1403e95b4fb8161cc363b2c6ee2400011e1a3000644021581039b396bdf02de77d846d732fc6d86876739d825130a2872c628628510310004082897cd2fad95113ea50965ef97c420ac1bbb008a61f50001b2344380103704c918b3b08cbfa50a9ecbb697628416ef9324792241e721cad03080f47e6fc81002579e0e0449c20940200002f864720a75fae5f6d922422cccda08bec90c4bca8349b834407031ff3ee4c491c2311ba9222bbb8c0021c5951253001005a3db5e77acc93883841881c02bc040003e242f426178030bb0185d00f0a36a0d96cff654c1cc04bb72df6dc2c7966a845ba2bb0c190a2cfa205eb02c624d692f377354a14904bfc7795152042ff6fd3ccdb70a000037e11d600027104021901e30ae9e9f251a30771afa0cb02c7cde40c3c730651b30872a2c65a949af1f20447bad83e30c009de7bdc0040001eefbbe2804240080000d19b27dbfd6f660b2034fee52c4b1b8a7f49dbca18f78d6852ca16f89ebbff070cb4645f8b420078d42fcfd2708240080000ba9a20cce83f04ac30c0f016c0d18285576b19dd83922c376e9d3c4ca10cb13dbb8c84887f199bbb2a2033129706e790c115e135bb1dc7001305312420964841480c02e40400043642e02616e030b601e15f14c9c96d28fc77633ab24a3758e5bbb19d59251bac73080269669469061060e48a20258060100401b5f49c92a35f49c92a48eb2f8277a3acbe09e025138c34b34a3483072452800c004032080200d0001313a582e31be9acc2a07e748b6460ee2f0ca19f2c74672bcde91631d3253a590810673185fa610035eff3a7149c20940200002f86c9472cc834410e383c05b03460b195561509f5250d1a4c49912d2c536021999ea1429be917befd8910a5bb483b7c386535f4b811920004c14c4908259210520300b50100010d90b40985980f4d0139d18364c01a40f0b0ea745d88c210ada3017aff249106b03ac3b8a32c70371dd716c16923bc7f7bc220de480c0359cfcffafa386879c6d3c886124000344d96600049209003103c40eae3be471b4ced7a79acda2d987466422cb2c003b56591919e21e56084d413ad39673389ea41fe6af6a280a58e3f99757243f43405080c16e0c7d0f36f8a0a5eb780a142f70d4000017f123d65aa21c994a1200760c00002b73e689647c08da038cc7a3b8a930271366eb1c1b668d259ddacc79051a42f48c900cb728625badcac70a2025d31cfd70bc1000060ad2b04191008560400001e13a5feb1fd9799a44c60dcaed98472fb502849a39fb476b839839576e9fca9229f57cc53c04004408d962a4e1048010000175385455fc28270c41016822213a4183beba301347658fb6d322d8e39832be3a66e1f858c8da0e45cb1142989db303d7440877eeb517459200390f936c60909210540400b10100011310b209c0eb61ca5f9b62e593cd69070f2d74cd9b3cc04b86201c664cf3cac8dcb50a236536389fe7da351d805cd2c7242b0e5ac2cad1342000e8d4a510000140549f306919ff9a3d0901008700a881c05c40789c54f3738faeeb61c9e556cdd38488738a751a536bf50712afed1dfa7fcb1ca725e8b9430a115a5b334ad308000182b4ac1064402158100000788e15f14c9c96d28fc77633ab24a3758e5bbb19d59251bac73080281c79a79879471258e68428060100401b0380a4cf55b689e6e731c811bb93caad782fc6e76714eaca047d53ce255f46ea1d3f96394eea0ce87a1422b38fc2e62610000305695820c88042b0200000f1100034f3a5ac72df8f821a41adfe694dd9844ea3b9cfb01a3a11e758ad81838f3e87ca0f9630c7597838612296a558c885a1470c280140000cb1c29af56567a9a2080b411109d20c1dfe45ff581b2c7d512325e09cc193c3ca8a1c02c654067837068a14f9c5b041722043e147a3b1ac9001c87c9b6304212430a80801620200022820017644005b50800ec2100258221602291f1042b5f84d64064247a8ec59f1c33c1ec2533d810110c1e6e34ce0708)) <<< 16000) + 0xb79223e0c4820216062f1d3350c0042bf9169fc04000ff3f07a310100e3940bc6e382b294881681434bb99e0af576cd28005e69e44430731e115de20cb1cb9ae8e5e1c3061dca7e05de0b18005e69bc0c20510987e76604c1291cfd98f1028300000000a5214801500e34bab66251050f2133072dc5a754e899cd2c729d8de6e7d96463061b47f7d1af0c4c2c6024a1c6b3d6a0c2050f0b9b5f0c871f304970dd664320a34340000f39ec06f5d0040000d5326f5f220f3b6a9003805000014b9c2ac70e30bb858c5e37a9af42862d7fc5af21628eae7687d4a1409159058a3881dc417ca12c39d41ea8ea82000069f37d8a010940200003566c9c71582b10b2852f5079f8e72453dce76111e28428a51934e9244184d32a829183061cd46b2b282aecac48a7a04000015a1d014a4041400a0000720d1131b265fa36488733187b5364088847222b0a48625a16527284061a2906f89028402d8f5caf04839ff90c43b830008a544e1e0948082801405780800077480052f90ae0d0298082b404158020ab0100068a90aa210549082a06414e2a0a60505280829004146020a20105080800ed6485020c27cb613c4b09d2584e10c26c874ca849a94dc05f42ff93b61aaec5234bc9d635d46b0ef64f6a0dbddf5f20340000000000000000000000000000000000000000000000000c24400380280100002280aa9c2c131cac900bd5199dd3bd45c2a27af98c8f67615c9c39d456bef4405be90307c7595307439f9ee00c099376dd94eedb804db2f4dd3d4b59e37a8c6ef048908057273fad5a6cffa5e62644f06d9e45fd440cbf1f7e24c06ce63fd398ec99484a22ad94ed09479731f1f50da641a6e913cfc9941b8d66e313af16219cd03ae9a529c5fcb68d7c802bb02c95926e29cfea07d86007b1b93c2347b1ad6e5a9ff575f2cbf50b84d23ca16717328f0aab2b48a0ecdd8280000000000000000086610019bcb1e58ca81455930e866a605a1a41041611410e108080a713161fa59f3c3275a10f5aeba2e72af3d23e1a331dff29b0ba144c1ec6fc41f40a5c17f4c17b773878f1a229a5d93f682ce6acbf6925ce3be10070aa567530835b40476382811668d11af2c7cf9c700d024ee51c85a505bae4e8100024b3d9238297886dcda44342f9cfd443f820b782859d0fe2c821a25056000094084d14c238960e003c10a85b461c906343d5424302e74f50a6004100002344210080000649823029998d080409bbd3cc7011dac06d4200500ea5c84010190b080020132030980184b80ec727b41f23405058697b47f850e93288892f41d50e228d4e92c686f60b239805101cd5f85b9a8b1ad550f11852a702960318f23be2b34411d5b98f8cc1b72d00c4ace21252ef028d8d7deb9b50a6471c61db903514614f57029051cc5516405cd68287886f84ba998207ad8be47872f7fd071418f114c1a5810fbd02c004c203c010c202fe196e304006bbdc0f0e048dbfe3032d39feac090307802012c020000e42000448422407425e7400fe80bac9bbdf8928f8fe3bcf8b2e7934600f85adc37e707b8ed3fb0000000000000000010935335bb0d1c0b06ead19e69102d0918d0480500090000a7e76bfd3fcbc0c36b86e0d16fb67057ad8200d3aa1c48eb81764e29d750828be11df1b9b3aeff47a80ad347e072f2068270d47358b8a0007607434760406a50115bf3810022101f00840300401012a02000037211203918786a9e99810049c1f120201221bdc70119fe93e4900d2eed3000054607c01000020642182400043242506610a33829ea36bba24041f9f7950088408002100c010040498080000dc8490a82040702864daab3cd02db95cda21006aa3150b000231c2100800005b10911983e8481f0040004164240a611e33000dba211c4b08d01d09517d9c1680de4cdf22b9303d1f9f3f68227fffb6cfcd790a1331ec079cc60316549416505fe2837b1882c85466932d425dec5203e13b1978bb20ac9a1000010582145bbfd3c8f2928a3e6a4a3fc4c9c67c56c2dc2bf38f4c1ef754a7732085c76f53e8d16dbbfd2bf0eea5cea3f31e691cd80282b4c5bb14489d86780003eb200265642301609a0b8232fd6d2b090d7abdece440d9efb6648a01e5b414c07018e93b39c3001309a65c001404098f08002182aa6cc2b13f92ae13f92be8c6c3ae90f2adc74580d7ecef37d250b555bccb4f3cd01b6a4d7fc36dc3946826ea5d64fd8cfd7d77b6eca5a7b84e7841e39db5580d37dac925b8f032ce47a4021e8ed6b14dc623fa8a0514aa6ea5ac3e741a433e9e39f704106e1177c50b5ceb6b35446fc925962f60a32670d60aa6df9039680002c1bbe8705be07bc8cd04c49b3f0d23fa4854c6e26ac2ab5949b9c314c955569851a3ede777f10e0aa23ecb9c9f428f005c111cb8d52d45c972fff771f3ff246ca6b7f37986acb02471d2590cd2c63a8e94808b090450282240782180f5d3a42eaf349d94b5a1214298fec8aec313ee9ed09af9ddb6c13418f324777ab00f8cff3f793c8f36dd960608abb5c7a0d3eeb64c87fb40073b64707d2c5a0b6106645b1b0f147cd4db099e819a4e09a301556b0000211adedd944512019e2cb6499b32ad0f8a64dcada05395b14f93a858af732e2b84f4bc7a1b1f0a965e057323c8638d022c8b6f6328dc2f00002411c2008b835258660873a79a1299044da305bf5ab1b80048303c01008b0504500822407c1f7eaffebd3edb2824ab629911e423baa33fab298e1a65faa1ff3d6cec5ffb596e400e1b3b92c7b473140a8c34a4c5c7d917a073c)) <<< 16000) + 0x222a01c3adba4f29d0a200d82ea0458e43bcc1cea291213724b5958a19e34614e117fe8f59ac904dcc7879b565d3c631383f0e1a6fc8f6cc81f13b8db8256ded6f8e35ca502c10c3d025c4a122ff776c2204911a80ebd1c011e2329a694599eee69bbcb77db190922a3066d708cc1400c673d2b481ed64745e1b19ba4dd23e892fee1a9f7136ae3138615fe6000781b726603aa830eda23bd45f2a840805d357c23444913782ff56b7dc6185e21f227692b37230107feb2425e8ec15b5b46d6352ffa0c6390c5000094642203610e13000825210c12000968210a3b0841dc04004011c5540a978c90913ed7a1280a8a752d0123101e0080000531c202077f87d8f6a2031ac0a64b789969f165143f8a300cad2c383f7f3e4b1aff345201f304b5e57e2c890400a0afbea06aa348b85b3dc526fc5e99b6330bcdc811fe47e3f02c394c72ddbdb0ee6ef2cd6c0f5736ad1a5062b9e5dbb3debd340f20ccb6e62b18a4f9040000d288418c82081402e0208101d8613eef3605041b5357f25809d4a115418161a0b49000320c10004206511b6651c445428762c30240db2381d77152100904070021c0c96d06220a0065ae85a60110810804000020c8198a80005f084002b470addd9e2414ca18a74e81ad5fe591361f130a7e2828725f487b9e1f9a74bd1529baf2dbc8a3801c44289a3808f603570bfc4f4a9f4d525b61bc4c92782bb65d2e240690d2b0745b356d92416abfbf9b58aa980ef22a260005ab8abb34129ae187e27de5620fcccc5ad6141ed2071d97267a286c22e4ab63c8df76acedea6f62f778dd3fffac3c434852877c8c5a0ba705cf4420a421000025d907f098003ba107e2d03e8481f0040018d4400868c83800e4884473a803003ad9f9ac50022f761f2000046503e01006f0d03d86c1b0240f41306a050348281e41400029241e007014fc8e3fc22de7a27d7728d4c77bd04e66e00810aba210eb1510c673b4ad92eadec62f4b625815307e1a6d3c2914730eef04a58802d094c0400f49bb6ae8fd0c552cc70288a9c014c1b392000068604ccb62bebe393db7ee38c096ab8b0842caead381914540858334253e7368edcf45001952b7009ee5e5c1fe64ad6f9cf220458d40068940ee420761d80022d10190100148e90445182118c0fc375f49c92a35f49c92a48eb2f8277a3acbe09e0254d4cd6ec34702d835b78ad386383892621c1532461822011411000c000010041004318b76805f1381efc5dc9526b1ff575963fff8fc7b6c40a2fea47c962c29360ee0f75b55d54cb660a8222e88073bd839385b52c55c71d8eaef00dd20e6ae65f37b1751048f9ae77a0d8c6ae098f58ef66deea72093f378afc8a04140108420ab9ccce76cccf0fd6767ba0bf107af4338db025070008b425414eadb1bb46f652b98824ee63c34b9876eead4000061373e74c66b26032b1e6f282ad3ea95d079f30e6b5780494f4143a3073d36037168af01d11f2eb3520090d1d5d044fe35c32495bd95d4487647f21d0e84daead2185a9282020020080360101c00b4a242899a045172cda7de00c3083799808c035887027e0049060880200001ca41d4740e833073058390280e80400036a41c4760e00381019584a4a506396174930c3c41b3a4c0a00456645090002420210080378281b8140da0b06c0503582c1a8140d20a000178205a6b06821833888198240560302a01e1a7471ffd8a1330afda8cc003f6acb9090028a7cf00701a51dbbcc004404094f080021e26b97b885072742dcd20191dfd9fddf121ed9f62e42725c41b2b24d5f8c1088d177361acea0d03f9071da9b626381e64cbbd5574d544e3bc9a1285092e748d2bec49f0a1fc10f82b5c5330a1818fa75d4f5ba4dfea94ef7c3010407f3e53ab6758f4ffc5f171a0ba6ccf6709d262c0bbb9eb91aee63a0003619fce39cab38e2009d1769400e0fc9fc96f2f0cc9b9776b6fd83ea8042bc509ad1f0f88a72c3e1e8e22d55f4305ab338357852239f21c70986019404000b5041900743031cfdc01c1ddf63910161d1c168a20e010c7eab8a00000824880400100630500008310620972fb4ee58e7c37f89a9cb0dffc2044b42399921641d5a16e09dd0000000000000000000471d9377010a902ce22d1ca8c940b60d6de2b4e18e0e2498870550914d08d007006000044042e19f9d3a1d3d218f95a279b1cd6c9df79243aa8485511b394473918f022c9a0095fc6903cc512e6c4f05e154e95c6a546b1d25417d37a8a6c9b7b6aa67c1b34001114e15f14c9c96d28fc77633ab24a3758e5bbb19d59251bac73080f964020ec9bb80854816c1adbc569c31c1c49310e0aa1020e00c00600000161fa8093591a9f32ef72000d999fc43088be2414cec90c30c9ae2120000085886320d9855f388a0b00e2f9fcc89f3edb9c8c2c16aaa30ad0d1db11511e049e388b18a6d1aa917f58220769d266db7cfbc544e8a1be60500047320346a00112b203202001a9f2003b7040186c0ee6cd4305e261ae02e5eebb7a4a8376f3970bc7983baedc3ab68800000000000000000024061c37cc23bfa17b11f16f171ab03e3ba4f0ae1fc5fb5cffadea0000000000000000008a932671bbf264ce3780e516766140000000001218400682061823002808020a0000003557da497fd44a89db3a85552b4518a9ec0e0777cc407772c231f8ed0fa2c79c2bea71beb99dcfdd3cb2d0122ac15b5cefcab2bb06c75d15787b7f38319f3a8c3d1baa1a9988b90f25dd41acce67d7846d484ae8002f81006ed1201702e645355df1d82ecd151bd)) <<< 16000) + 0x1890e1d7299593ef032b13e18380d65480e86cc069ed0408172a0ee77068623ced1810fb17afe4c632d7fd8c40450ff9ddfbcf4566dc80c02ed50da9a0f3190b59c05059f5d8844703eb43b25584c2e08063394250522452267ce07b622055e90dac47222040a55faeecc7243557e8080c1c183811323fd45b1022af7c31c9c9181101098c67a32401e8ea94de8a04555f560a0b00a00003fa7754ec0c71d6fb015965452e7fe8b5ba050c1281baa76061a4c835ea6c6405df679caa4865104a9b302a9370405980806848a486306104180017cda57e37f1f443daa7db8310e2aced80134c25fe736674aacc1509cb348c04046a064617fba9fed000d8eaa9a945d141645337e8c36b8a52058331556d6cb41852037147d68d3243590c83ba572710220074b946a850825edb9e265e0424001446b0035931805fe69c3920a5045558655050600780002222000b1a4184960c03305f1982f04c17417baa760638eb7d80acb2a2973ff45add02860940dd53b030d2641af5363202efb3ce55243288254d981549b8202cc040342452431830820c00055b1b4925c981f9b031252a3c23b485679d655d55b130d1ae74d0eb6537c4b4107b6df24dafdfe4205c5b97db54d4a304a1b229561fa578214205605b650b8168486d7d286f8eca080cf2d9786a5948410c7b8b2856cc101261003364786480816e9286d1d060262d6d6ca786022aad2410505e07000021920b84302d1582d8ac168172289b248a10a288042d58eb4921d884e0eaa040757e0837600c18cf4a47bc648273cef1a160a00a8b6a6d5018036ec521b1a0aa2a948342601450c26e3600324e1230374d23311805088ab1e09935e122496b55f9a44c38826c17622ab6940b223b5435aa830000d0b2c063a0a01277507c150e0aaaabde90605c060b1d42a6c9bd96299c2d26332858abdaeb6c40a41cf25630700262a7d918a007c9662fd0c0085d029ec0288ace5846010c2074056123903840c485202c68b360816e48c45955f9e0800747e4ae58c010165641a1000335c3c0a0224e3846010d266270af8d7ec3090e6c1b7ce838d1c10556ddbfde307d8fb4ea3b058d1431378615d1f300faf75ed308a8001687a49a08400165a0bc002bb830a1701a016437a4b38cdf8d930808927fe0268e09609495cc1ec50676aa1a282a4f833f1c01c15d1a72824c2846010058010000ad100037820ae220560502a828001528800372900091320a862000b1120a60200112120847b0522980d1281449400802922faae16ec05e87fe7ba74bf1e89d5d5aeb336ad6dcfbed8d052edbc37ad800000000000000000000000000000000000000000000000000c4448a40a286284382380300020a73a61c54e8a537d5fda18f38c3b05bb0d32a17f2f505310f30f8d17b6bda80f68d8cd39415bee9e91ad40617c81b5183c52c2c057fd09c44e783fe80e51fa6fd9171da97e2299d26b4e8fba58c1056f1a567d8a29c89dfb0967aca43d3893c698ff740dccb08eff5864f88a1702847daa3dc85c79cc6d949a87f921173d9bfe37970ece99658e6997143edd651b2fcb5e26590ff7b60b91a2dc01010b54f160258030e40a9c237070a955a32774fbb8f6a556e2cf6414da80b03b193968b235661d21d7346a5b200808250632dfd1e31072b08a095bdf060d6399ab1aca43f22d6a17b2862bec4d6014a9a7d1d9f99bdd15adb1f01a9b9624a5a56903c06ea042c8eba491123509d615261449f8187d818a0582bd5668343f6c95ca7a0ca5753c0000e0e41409609e4b04e1582682e045b03167f8e2201d9672870a6350799a3835b3769a7009040840200980a910b01fd002102070d536221c2168a0179e18218af58cb8b023b04c7b5040109e3360204083f493172004e284601000017420962b04a1581e06c1240742a230e962c8144ba878fc2882e3594272036a711b4b0a152953039c3089d508b1c013081080400d81542c3077a8bc406292265ed8a125486b67e1845296bbc996057bd2997a1807edabf8000130a1100400004fc8240ce85a3265e85901ceadf5060509fb797a4a38205f0b6c80024142100801b02a8585731e36880cac733fca1423839e20d070417b70ff42c0513dcc9c0301a9af15f700098608802000028240009408239080c054000aa07f4f9078a59c1f82c4a87cf7e2fd3e41e3044248a3042841024801800046aab8f92f6ac36d752103ae6148cab61622e294c1145c477d27ba1017dfed41d0859031d866dd94cbc35b26352ff90c4acaef9062c6c13e800153904631022868064040016824110e6086430421d8208c81003607e1bb96a7fd5d7cb2fd42e1348f2859c5cca3c2aacad2283b3760a0000000000000000021b8f418e44e2da74d7286ade81782ee6fcda809635bbd34c80000000000000000080f47e0a6268bc6b00c61e20a990210090006004000a2800a0fa1f723e4dbdf9372c30848e92427257cc4c90ab5f1fe5cdda7578be0e00c03abff0ab10f2b07abc99a6d4c63c5c3913225b6c2c1ab2dfd230ee7d34ce4dbaf13d145e106655fa9a3672d71ba0cf7a2e762719a831153dd9250133fba470b714135a03d980c9952fb7335236aa541f97efdd8c89ed5450121a07c0bb1f15e8f0df182104fc5f58704495640002405c50e741c600086244ed00100652c220086107e6ab76038601da65a8405765b158a1022e32f68e80120c1000400d8040700203701c93f762f18857946e10aba53be9f995a9608dfa7c83c52ce0fc162543e7bf17e9f20f18224d4cd6ec34702d835b78ad3863)) <<< 16000) + 0x83892621c15438a2452841022400b08c501d808a9732e2979effd698b4efb0ec42a56e5ee0290410e91dc9d88f2ebd5669a0a6c39ae9508adfe2fc02fd1bc46a3ce94a30a29c26459141ebe98ce508b66d967e1030eca720a9c16b52b5299024102100801a8080003c881d08f490ade3033204424e6d7c2435f0370620c240c915ce341ca023cc4340ea23a68e004261c2000800009b90331580032a103d010003d0103c1980f80e8259c01a021015ba21e5e004428400100360101c0080dc0781c482231706173554ad51204bedd52a8461040010c0c14cb11805862603f6910c282ab790691821080400d40400017e40ec340741b8103beaf61ff6d01d1a6c4e3fa9e42fb6e1e16d1b100f18b06bb61f8a2cb0b4744c299cf607ef5647b77a8056be07a75c748b6e35b2dbf83ed4114308e13deccc0e08a794fb28b288d0bc1ed38c011c2915594594550e146ca01a36cae835fe1c48e39b199caff70166059945d3e29be00a7286fa94000ea11f2e5653951897dba38ce7463ed6fc32df64260870f7d7a2a21a0ba7b828924ef4a250021d1aca897d50f91cfe85b98eaed71905380c20000af640cc460721b00076d3067efb61a9873d70f98ac4ce1ae0b0cc1b2814e3b72772471a09e2784b81d7fb5b65808ea260825e3bec2ec4ab86b3ca2aebc59546d5f55c8663805590b947a9ea1c31d00087469a06af24596c98deedac2308e349b5c519bef946567482e666be18461e3c4e711993cf45271f992ff964fa0801209ef6e0d910cb1071cc7d5c66524220a7300360101c0080dc072048dcd6b4e0b6ded54ea925840f964765abb31288fc03e4638763c3432385f39b7194c4fe38dd545f9486b7487daa6323bcbd2317b04f176dffae42c1ed7dc03706040627c102ec3d07eaf6210cd12cc40100401006c0a03501000026103411c080f6ca00c20aa1113131606be9cb69180730782902048283e0100000d720662b0004092064420008a9206252030190178280b8140022c240b4c60583b02b0181500f49bc6a4567c9044c65ad94181168ee86e4b009d39d04828031273b33800140653022008692486cc9a9344ae4a6489942119e0327490626a1bae48000032181080400003b481480f461d34e6771a2543eece68a103ee318b2300a6e863780100908084021a244e9c3123c69d9be030de27b134409c070feac234aa70050745daf753b654370151b2ca5c94de73c57ea002840dcacdb9e8308aae2c9017f2710b6ef62b0523348f49d2c2bbea190101907a5675aa9d8935a5667c7fddc0002ca9d830fc7356213120788feb31ae2b4271449c8866e16de5cb512b5df98c94ccfc114c2ac5f9b2dd41980257aec82ef9da7e2426320f783e98d2ac32148b4ad1ee0f2da4307a2c035ecdac5d96ff6b9b2b808855d380000b0840a09404a4a0241501182808814000dda409c77567440d91bcca5ad790ef1c86a86c85d358840ac62b7cfdaa000000000000000002126a66b761a381713310683f6ca98b95b77a0a99841808e0920100080002a00b35c7dc846244e1bb1c49d27515c80275bb362beeee9c1809b9a6acc20cf2117b72d5933e127ca9d3fa803f72452e5a71608b1c69973626620d07ed953172b6ef41513441c43422021c218014010001dbdf83e34990cd637a00bc0748293230488c15da241b3fa784383e0b6f728490c2d38ea592410294ef3cc600202b7736000251c2200859408ceb1e6923809bded40789a38551271420524c015c3800ea2c1998c0035ecaaee00130c110043c60dded35047141035db8e1850a2c61834f134dc5f9b90009060880200001ca40009048130a8000e18812948090640460a022050002ad90213d0004a31c2be299392da51f8eec67564946eb1cb77633ab24a3758e61015f49c92a35f49c92a48eb2f8277a3acbe09e02530800d35335bb0d1c0b06ead19e69102d4b1c80070030001563dcc1c113ae5e58b968c3664fd3ec9c05c5d9b44ed5ca5a1e4d42baead833126d56d7ce44f0743fc7b64c721a84e829b665b1ba93aca8ebe0fb7853a212801c36c2345e544c2c1d6bdda622c09656c77d01556648400080000b620405201f2500f08c00c4403a2201c1100d80800165880d14800620080c80800ce08801d2c90051f431e3a3404c2657a858668f7c97e787b2ec986d78f02e47358104000000000000000000000000000000000000000000000000000331840064286304302282202180288292cbdfb9e896e30bdaf5cb39f5f9fa7429e617cc599a02799509a9b8afc5587d17dc40079900be4be463930c783a5edd2e03e63d86954819d8b3b8cfb89fb9675ae31ef40497a6d63dfbeb1ce9c51fa276c051000000000000000000000000000000000000000000000005c30800c86106085081044003019b3bfc7951abd85314fcf037839e0d7e19b205d2c18d6b737ad2b1854fb7f60acb5d4da8437abdb3a699faf0a9ed69b946da0b9587360babc57bed03c4c387f9945727860c0e8c55a6041217fc882b1805240c562228006ea9d8184000a779a0eb7042300448d13c3def2481916e1f0aa922073e73f6f204fccfb258220064ac437ec300383a46124c00460109182295138781033bb2c303a824505b51c8636408c6cafefc8490cf48a7fd839007e0cfad4871c000393852f14700270140000c490002df2030120170900b048054140280a0004cd2026420121100888800230c80818803cc401c5a00d2d00610802c740140a0090100400801c0400c02005010006e9100435001988008a40020200001003e999)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 32 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case11" = "QuadHeightCover18Case11" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 32 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case11 private def zz2396:"s095c"="s095c":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case12 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l17 l27 l29 l31 l33 l35 l37 l4 l45 l51 l55 l61 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x270ff4d69, -0x74010ec4, -0xaef86e80,0x857907c], ![-0x74010ec4, -0x384d15ebc,0xcbd31efc,0x3758d0f6], ![-0xaef86e80,0xcbd31efc, -0x2f1ff1767,0x7707f8f4], ![0x857907c,0x3758d0f6,0x7707f8f4, -0x3acce180]] noncomputable def hinges:Hinges:=[(-0xa685bec,l4),(0x3781ea5,l11),(-0x3781eaa,l10),(0x3bbb6a46,l17),(-0x3acce180,l27),(0x3acce180,l29),(0x8852ac6,l31),(0x3acce180,l33),(-0x3acce180,l35),(0x3acce180,l37),(-0xb0ef74,l45),(0x3acce180,l51),(-0xae4d69,l55),(0x5b1557,l61),(-0x4eb7f0ac,l62),(0x2c3bdcc,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3acce180,l27),(0x3acce180,l29),(0x3acce180,l33),(-0x3acce180,l35),(0x3acce180,l37),(0x3acce180,l51),(-0x4eb7f0ac,l62),(0x3bbb6a46,l17),(0x8852ac6,l31),(0x3781ea5,l11),(-0x3781eaa,l10),(0x2c3bdcc,l64),(-0xa685bec,l4),(-0xae4d69,l55),(0x5b1557,l61),(-0xb0ef74,l45)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x14a1a80726020000000443c0530080004a1304805a0060000000078024803000290a442048801801d8250740cc4010000000362402980400001a44100c8c0400000a4240026602000000002c009200c00000001b00490060000019024030c03000000c81603860180000006824063008000340208013180a00020210c0468c0508087a0860234802e2c40414c08fa401800011c1580c9180a00009a0b801c8c05000000001280e40100000000013032006381aa08e0319200c000000000e014802000000098500a60100000490840323010009a118240192009420a404200335006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0xb2002b6dd0944000ee5032082816b66448d323be4889142937fdf0c01a898a310400043a23a804e283e010b1f6b5003d09004d37d5c7c82f26381f130a28a2c82c62c22821c20820c01c84008036cb84f5dba6c) <<< 16000) + 0xf165021a13abf04e24000000012c6120cbc64763c2c9019ebcbdbe9c38011e1a2e70c1c01c1da87e060239a2a863a6180059d3f2c9f12d20852040b2e8f4dd91a487140047868b9c2ca0047868c001c48011e1a3190c2404b5a93a9260e184ed5185d30128cd63d89b9c000beab791c0b006637f3186264482148100000818800213901f0dc922239100112400895440060e0225510014391d1547da50836e8ff5598100c95db5e484ac76b0f8940a2807a2424815aedada92069102200c0000e410007503c7d49ea31151430125fe62b8a1411154ecfc40a169bfa2a21c5003938700141002e6ae5508085609dae242000459ac9f20000259746d2800d48c12808000079ce1a0e3bd397a6122819545ee0081c400f100d90a03080046cf710007081f9e7538268e085e5db0f9991c00409a71c750180015881d6e4000029f45b079800098c91c2b0240001121ab374f4535e1a23193b4ddee76acf0613a606cbac79d53b0000000000000000000000000000000000000000000000002fd108728d740ad5ef313fea8bf8c43cfc55ea9578c00000000000000000000000000000000000000000a244084063063043802001800800001820010068001b49b71b003d2f6384ec471d9af6185c901fc7bb8dcffbaa81e5eebd2c00000000748bd7413a129278a80ed9dbc04e18dff0c20323846ab5600000000000000000000000000000000000000000000005b2d439122afea5ee61f7b3dbb09377104c33003e9418000000000000000000000000000000000000000000155040c70840820410507ea7644023f87c70defc67b1bcc933fca664d28e009cb5e625ba0a9987fcde1a753ad3c60dfdd6f7f802c4a2878a8d2580144e280ede56b7e6aaf799623600bb741fb63f28616b2ffd9e07a2e64db9525424aa8003589c2060e2b7f93382086d2c3c7f6881811dcf04d5fcd03048cc322f4dc41801fe9efa123d850346031e46ab710082a094c1b0d841041fe5bfddde0387efe5781de7e283941701e00008c880f0c8074140380281b55f07335c814d356693b870bbb41a6e90608fe7c1c3d450867ddd4b988013ad7b0c1070095154c4a450036a3998cd1451a299102bd03048028b242d3ae05ff2088a411d34109141ab9febc7205038d9e28c080c18f05b0322410c99cd4580604019bfcb280410489569988900bcc285086094841300a2c92b18392d2c8002785c1208063de7fe1861fc55a78245ad81a99f203000242561401c777ffc09c20800200002b2406c17649079380e27848a33f2bc2e880c200ffd47b76020803c7da2cd312107035c5b22440484c937b2c70a08217bf4dfa018220135ee58092073319843f68051090c2a02c59290f17a0830c4c5ca0cc48b63d621843820aeab0f62820026b43618207d5845c1023d729f222803459d376050184001000018720007706880039a667a0102b6d31d488909106742fc938c40923398421e810200dd60017f84119e1b6c3ba050423a4f53f421801141789fd100054d59c1b8d00cb122052050c281b146ec0db1640622e57ae9324606924eaa12e40a06cd0ab30bc4109931166652140f6923c9cbbc0c106e9ba30a60500211747f33209000022c4f4cc04da4841581828604f9c9b3dbc2510284ccffe99281284104a45bbbcb1c985034b3f782f648431c1038c1451039208608122dfc5aa791c80001600b8ebb6e430005382e6cbcfe50f42404041a82a0000900d0e969e506430c33deb75c48b1aaf4c1438600d804c4186032ce41c380125a91e62803bfe44100ce184001000015b2000bde40020608007bc901a1dc0d00dc7c16420513d7ad8e00e233a56f10589080c95db5e04042b88cc8cc1c2b565fbec38e0889daa6bb47010732f769a10006386b0b0712084a0288afe3ebf8a2d175396505efe75e3b1d2c4c5d74448700400000000000000007c240a386404384382400281eb65191db802a29c3e0c58ae1baeef7238511581a5a75d59793b4489e66bc4612ba11dc12587fa00051e6ca31778486d313a72ca0bdfcebc7637ca4943e05d58a900000000000000000f8471471051070460440020010070100200d00018a2032120180900b8080580402a020006972028330131180908c044474421ca35d02b57bcc4ffaa2fe310f3f157aa55e3000000000000000000000000000000000000000002889029018411000e00a004028200c31a003df095a990197506139fc67d2f3e0f652e5abd0e4704b18b79097278d579ef6428fb1b3c4561249532aa8b5d9ae843f565ec379d2abf6f3a2925586f2ab476de8f97199848396649596018020080100580782e02802008000022301801004000011100e1dc08004010000044715c61e97b1c276238ecd7c6e0d300f9146c90ae0b0b898b0681485266b9b3dbf7b20dcc3cc8cc00000000000000007cc2014dc4b6ac5d821fb1119eff68e75e3f20d09e0f8689d0000000000000000000000000000000000000000000000002f98a29018c0040020207dea96a36332423474c90c9e40b791cc2690873cee1a839ecdda388406d335b9c08e3d9e332e5ee8f323adc3bad490479a00cb4592e2603fed0cd06da06dc47514bc7241f783e6a27ceb10ff6649299c8b3993886ee25985380def1baa112304c72765406c2850ea5bb6f3317de46277d1ddc82c40fdf43568a6976dcd5a9955b1bb92f0bbbfa3c456d6db37ad751a35d6a4b0eb750007f2302801004000011100096236518bbc2436989d396505efe75e3b1be524a1f02eac54800000000000000007c41f04609)) <<< 16000) + 0xbdc03b624bca4fbeaa455dcce74b9c000000000000019b08053712dab176087ec4467bfda39d78fc8342783e1a274000000000000000000000000000000000000000000000000be620618630028008020805c20c0431f70a72cc4b6c517c35ea5c1ce6888ba6b6a41b55b2057a25488a8c26ccdb966f466c30fd95ccd4776ff24a7286c06fe96ef966db1778db82e1820d6187389ae892868a0baae57f37c94da22e9fc136228c4b8cc530cbf6e008f119addfc86a518316d18bd14c6bd94a000e30400532c8016b498213f8a1ef32040b78f2bae4fc2041b3388e0d806190810440f60709cf667c358428438f92bfc090c107da2392b9820fd3d3e8e57c40034ad2644ce1007a94e47e54041cdf43052058a210e51ae815abde627fd517f18879f8abd52af18000000000000000000000000000000000000000014448207108087085083041041001070300200d0001e0201a3300c19c112df5c51e064408114f178eb1018661a4a72497e4040c2e726c770385389f565907a2847f328b5f9ca0820e3c919248a20045593e850fa1008ccac53f13e08031b4755f05a00831e0a880b00f165f107ac84c28727e9df49850c2120b960881408d5015a1611913ccc8a10101819aee65001de49c4548000d3e5bff8c00044aa200074861180630ce7c91d9b186140269fb2000b20254b68e4796301b5cf672a145002dfc5e686067d47c0e0ac90c0269fb20016016dc63a4c5000e5e561c5b20209c071867ed06791a2c0e3874e9e55a0d1631083a5c4a4a981a602b523f381218040b91f33292100a8476859b10000527eee51d0c0023390390220400016f36691d00007370067d7ce48416018000094c80022b9b2e6f86b95ba02871936e5db160a180c4402cb5d205068bf60b8acb08668a4c393c1020078f544b186040795dc217d20001efafa38b060008e4997d7d17a921854048c33bde0a616786140269fb20002c8088018f246963042e133bb0851400b7f179a060677f98dfbb1243009a7ec80016015a041ba81c00397958705b0808290246191d2b5fa89001c70740279e89316309cfdf1f19249180157ce11a466064e86adccec024300a0eebb0000c0015276b42528500013f6df63a0200002aea54000000a32a46bb14382420b40d00004bc40011d8800352900b09d152306a04d4785102891ea6ded048c250478d3ace48a0b524ffc4403880eddfe5b2f0102189a96fd3fa38004502c2b7b6280050c0ba329208001c5b6bfcf62904b22058060c3102c956f14c614019bfcc0002c805fd4c9a4996301372f757b8514007aa0fbc060306b8c834ed24100cdfe60001600f4dafa17e4002650e5a052080829024618807fdb8ae40e384d8e4b45cc58c2cb18bb80c92300393233ff66034eca9eb89412080d1365980030007ee60d1460a0003260a5f042000037ca3a00000004ad62f69435f504150140000924e1912576c440b430610b7353a2b796302408991e39091801182f8f22060a012f3a6022d145000ae617b5c08084e606379208b002538c5874fc0800f6de4ac7740af89082d030619d28f53a9783080053af57000e3822096d82d8b18a7b0f202be48c02b4fcb81d3050053af5700020cfa3db298006000d1a139a0e280009602ffc100002027428d28d7e820a409000047c4001224800482900a010005b0100901000c531001b2f201002c5718005b8d800ebbd51cdb1f866c9022a210e51ae815abde627fd517f18879f8abd52af180000000000000000000000000000000000000000144870c60c308500400300000757d43fdca9c1d9ef9340eb7c9177733966d3728a98a40e52338285a3bfe3a9a7169e3cc4a34544a4132d6dba1d66accef66284e9a4961e033add2ca11fdcf8e1abf155c4ac87d34c50ae4c3c3ce0315a619c9ec2bcc31f0fc2336f0bf0314809cb604e6327819a279e1a6a258580e54196e49f85dce66f121e17efff519fbe3036c9d5cd57ab999996c2b9a17ba2b925bc0f98de23d3e636fd4d07193773129b55c2f4a6d97388248040bee46e7cd0afe3018e727315c0ba62cc9d771a424e43739866df09d342f4700d89686ac7ad9b6f54560ad274230eff7f3fb4e3eb6b42f13a14f36e60761c20b54659208800001ba607cd4dd31832a83f61d557b0b0aaaf9428adc0c1703f4c2c7694684e09a13ee19aacbbc8ea34fb583d09b680762c20b89fb39680d71a3fd2366dc926007ed2a29624ab90000d90c7f3deca2241c028fc2e88dcebcda83e08e1264f82b543f710be0c6815fb938cf4d7242d6bd1c196b8f61f9dd0fe23cf88ac01e5303878a56625b1adaf439587097a7fea8846cc63a1289c2f250b59ad3bc2afac1eecf1ce4db579c1ba812268771e256f517c2fb3db75507acc2a321abf876d9967aff9c8c62600154405c6170bb2bf08532e800afad882c3720f27fba12c01fd5a9997e1fb5513aa752383b91f7667130df0b8a09a5d42547bc4ac5e9318c0072d90c9366e8b30061c8ad67b10df8f48034e3d9e2d1731931541a245c5ac4e8830c093256a1c08b0b4d3850091e943308003b01e7441065201e008493542122b3061803b54f5448200058c798820c640440100000bb20003b24003ca0800a3e9a1a60d6385850685ed03e4202080c2d501001560b2bc860003d0900020023edb21800cc2842010c35280803cc4851773871de6d02860d82070f55181008f0d18000a0ab06cbccf2c404058ac7468000000f21efc6004721c50a4080000346401c5400c2a0051100200800c040040200037420020200001001c0e9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 16 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case12" = "QuadHeightCover18Case12" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 16 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case12 private def zz2397:"s095d"="s095d":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case13 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l15 l17 l20 l27 l29 l30 l31 l33 l35 l37 l4 l41 l43 l46 l51 l55 l56 l57 l59 l61 l62 l64) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xd1d739e5, -0x74010ec4, -0xaef86ec8,0x136b05c4], ![-0x74010ec4, -0x3dd6e37f5,0xe1e97240,0x2d896f8e], ![-0xaef86ec8,0xe1e97240, -0x2f1ff1767,0x7707f8f4], ![0x136b05c4,0x2d896f8e,0x7707f8f4, -0x3acce180]] noncomputable def hinges:Hinges:=[(-0xa685bec,l4),(0x3781ea5,l11),(-0x3781eaa,l10),(-0x2e9d323e,l13),(0x1ca60728,l17),(0xa5059892,l15),(0x3173fda2,l20),(-0x3acce180,l27),(0x3acce180,l29),(0x3299393,l31),(-0x107a6c6a,l30),(0x3acce180,l33),(-0x3acce180,l35),(0x3acce180,l37),(0x8db83c6,l43),(-0x8e2b5de2,l41),(-0x7c93870,l46),(0x3acce180,l51),(-0xae4d69,l55),(-0x387a028,l57),(-0x2c1ed2fa,l56),(-0x16563a,l59),(0x5b1557,l61),(-0x1d3d128,l62),(0x8d1c4f4,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3acce180,l27),(0x3acce180,l29),(0x3acce180,l33),(-0x3acce180,l35),(0x3acce180,l37),(0x3acce180,l51),(0xa5059892,l15),(-0x8e2b5de2,l41),(0x1ca60728,l17),(0x3173fda2,l20),(-0x2e9d323e,l13),(-0x2c1ed2fa,l56),(-0x107a6c6a,l30),(0x8db83c6,l43),(0x8d1c4f4,l64),(-0x7c93870,l46),(-0x387a028,l57),(0x3781ea5,l11),(0x3299393,l31),(-0x3781eaa,l10),(-0xa685bec,l4),(-0x1d3d128,l62),(-0xae4d69,l55),(0x5b1557,l61),(-0x16563a,l59)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xa220818c60200000b8641c0a400800062290980f2006000000000440c801000000001500a401031830841024640140007833050152006000000151103cc0200000078d06068008000cc321101e400c000000002a03100400000001a0c0cc01000006212818c602000000381501e300c000000003a049004000000001e014802000000001a80e401000000000cc06200800000002603c1008000000000b018802000000000b00a4010000000000b03200410418c210115200a00002113060250020002108c18014801800110460a02a400c000000024181980200029108700d100300000084220686018000000000d0320040000011048111806003c0841a0271004000000000480c401000002105003c3010000982905809200600001cc390088c04000000000881c401000000000880520080000001a0e0518040000002515024c02000108701c03c80180000410c40c63010000000221a079804000000000d018802000188a43c06c8018000000441c0a300800000001c2819802000290d02408900300000006848146010010c310840964010000000261402980400001242100c8c04a10520210019a803029828826012d4014009a118240192008005609016027500405105704400da802801482a04803d401000b81403802ea0080000000098024803000000000700a4010000000442406300800000000e00490060000000012014802,0x19c04c80300000006400264020000000003c06200800000190881a18060a20ca10805c1005000000000c8124010000a8361202c400c00000000340290040000000005018802000000088780a601000004804401630100004a1304805a006000000007802480300408e83181908020000003209034300c00001283a06318080f208a0b40631005000000000f80c4010000003215036300c000000362402980400001a44100c8c0400000a424002660200000005844053008000002a128059806000000161201cc0200000000580124018000000036009200c00000320480618060000001a09018c02000000c816038601800068041002630140000034088071806000000002501880200000014928146010000094883c0a400800082390701b20060001822840930c05000190441801480180000004c2c0a30080000218520111808000000c8440c8c0300000000d160660080144340540e64010000000003207100400430901401e9004], #[]⟩ def dynamicCode : Nat := (((((((((((((0x144805f0fa916441bbc55c94286f9c173161859210be14103f91fa390009ed6dfa824c2040010a29e9994254512044aa128348022551001646edad8644a14e06f02e068400b2836114201cc0f4c960270d7e328134081080600006488360ac1ac078380f423f4143d0364d9b14188338ed01413949483a0208fee2929180098a4b71960007a11e812023a92b6ca08b40e10004000063c83506e08a7508117c2c60ced53fed246c0d10e965206019bfc6f00c00c186bcf7080247aa3da4040046912c6e411241082388524724240180000d59b3a43b800f423d09bbc8bd7e2964f160802ce90ee0d8a8e39d3558275e24ac84d82021c62852051c5201180140416bc6ec455a60459e2a93dd820e94946cca869084592ffd77c2d2a23ddd41ad803918fb94488f14000a9883488e441509ceaf181c48073e2bc4818452d9cb801b182047cd8622618106fcd3f57b140405dfe36e8100035ab8dae8080083b4128804040d339b71425513223a418c28720c0a00a00004624050160340b92643c4f5be1841f1979053287c16cf1ad648e0393864c061087c8680e88232b7e20ba1034c176c3a66027236ba610042903046028b24e20e6cec9840033ea8d830719165533250f1b41feb38914504243a40c205bc18dc33014a02a3abc38058be010840429030460280001a8363ae5c494b9eb0f1f168a4d72457f1dd46ec2116342c67afc1314062b8b138e8f944cdec75a009728a4b848d1e9bedadea731dc8f9681bd0d5376c4f6b12a3c081bfc3d89f43e270d7bc6f351c7e7d1cee73bc549a14280d1356b30ae2101c56628c14544550356b174ac14335d8480f79fc62d0867c2d199d402353ddcdfc58020d9dc1bbf95e942a3fb34b48db8f4b1c5c5a8344eb97a9acccdc6a4839689c107751129f218727c820000aa068517d027069205a03bfc2e71c5019bfc6f02019454a7b72081250cc733710000d1489830808a80719630012ba2ce211491c809006000035241a4572227a9213cc64e1f71c441ad871440c3e32308fafdc6f4e66162840c2351556fc47c3306087150428d943c34041f12980492be4efc4009c3e3ce7edb53a02013fada20247f85400229c5fa0b069b49224c1e39304141d83a0000b0c8340e819c740cc3a065110006f0906419f092ee152759a437b311b671c1875ebe2642ea21682dafb) <<< 16000) + 0x0f1b6adf70573d8dc6155c40a73b82c0e050491d19c0053fc749f981ca0d31c0cca4a04abc1b61c2130f5a84f5830459767afe9302ee43c61975aaea6f778467c179fb37039c90893bac2a7fd6ed51102054706db469759a25982f92c3f526eee97026e6626d707d5e5ac5df07a2831b9ec0c01012f67f0b8365620983fd41b37d93a8572740942fbb500acdfac822fab89f760a7c0898a9a8a868732ad895189720071ead410990dc544fb957de3b4656903300382d6207eb8a30fa2fd2a3b49abcaf30f18024f61e8f4e498387ccecb0ba0a8e5a2b6bf7880bbd725d484969bcf6764741597e28d2afad58a16cee042591cdfbfa831c88a10758000893384120e11a013c6047267325c7606090dd61f050918012598ebb2902815309ada6c00402166daa4cf808028548092b9e2940246d2cf98441f026d3f9a487025920ac0c0000430418ce40c4330610503000a06900cd7bca4070a7855d146ba1822f0611e6380508aac91931d6200340f7484e187007cd1fb336914016746caa3dd0541688d93647fc8890a9c364eaa93981501634b612934b234a14cc8f7328a86db33e02c79cb91a0128712fda00d2c0bc15917918000f423f80670c200086965b6d54ec6944db167ca58f6019e03a50e0d8c050c380459dda200ca184001000010320be03c280ef9a5f94a1e085513f80b181deae011ca1bc2c5cd6d49185a8c7f2588001442f3e2c40036c5be4ec1006171ad34c04dc0a1200a00006b8d9288ea0b9c60b200e24470441428ee53e8a8124589999db62c2860eb4652240b009acd8d9fd0c005a28548170104ddbbbfb1150e304e0400001bf20bc1ba20063f2f674881538ec8843bc812abd7446ffc7100a449874b0408022550ee00100d4b64a44590407e424f992063f4eb69c8240c40500480001c0203e1b01e09f1142db48028e1f625a78c310204550cbc0180073be38402002011c4d020813e517c020438602365062961180800005a48004e7905d3582e10e47896172ee0e20f68f604480c05b8d7d03866b796a2f2026bfecab90e13c9b70d1c6004dac1710ace1842010a2096c0d96248f129fe9b924427d042f09024620ff7bc90d5a24951a40617542753198208402179d962ddec564d1314b64aa2b0f9bdb5cab38c781f306400000000000000007c7dc76d8f28c0e00eae493e1adf75abca20113fd320a6a80000000000000001e91239231221018c08408c00dc200401a0004f84000f2882d80e87019ce6e8810911aa72743265204a6d20aa6af890c8add85d1fa2030ee4c3d5250508f0f1fb60db1c00602823e7383003b9f0225be594901054058a2165f80da4a1cbb113d68a17813406e0915df2d63609133b3c4e6860ddc6472bc204e4d678fc1000063502ca0108002144008f5e6310143a7e128ea528c318fd5e1108142d4e245c4a992252cc304ef80c1872725ec5c040979582259c1600788001ca40e00341fcf62c148904280240000ff100039c34403d9d49942914381280f6c8b51222a0c22fa140902466057a6b9e1219a8022cc6910a11776b83695d8e00270e402caa06005f5b9672212fe0404160182888fed677b142a94848dbc915bda7eb645087f29c2ec24416c500238c195b092d7460837f5a0f64e0842010f11e4782d186b2f170184cc036da8eb387a027cb2960054f000000000000000004112882872852452842441c11c030080200d000194200061a400145c82d06c002b7082c8a8160540ae2a05611015848154240a8020530102900800444082898c140b609e5b01f1d82708c13437d1cc7d06b714e9189c01ddfece24bbf641adeec4919000000000000000000000000000000000000000000002b89028a21000e00a004028022a029c96bd6c5bf0414b13825a4502ab7db59b6f75d14b872f88f5998e8ff1b6a9521ee1258949d011d87aebeecce0a0ab4839586a211e109e939e8f1d45b1a1a5d8d08a29f67bf096080bae4090b30ea353a3a13d6ffb3da6fff898cc83ab3bf1c488bcad70ca19a57d80c0080201303609613b13a1538a080a5702144403887e8e01021dff01400024201c008000068904a25d02c5996f5835e919f1ae01d74a2baa9a132145b72752cea76a9bb5a6075d61c1270b43af3c52e94aebe664ff64c1e79d0d070abd8e63d88ca1da6d4590c06053e0cad19155799389a1043b70486bfd7d108bfa4cd9d43319e507324930100bbaaf43cb8a3c9fd12df7023c8e872c489ca0aef7b6c44ab6f086a619f0800029a29577686f927ea2cbae6d9d64c50545e7e5a9daff518ea6f9f8d72dc85b39a433a71415d46c5d6daa48099de143c9c6e2a5ea51451459d3f5a37724199c17a3a3711e0f080fbe98d37d82f31e56274efc8c802a2214769a00001b04e0de5a9703e642318cbf4848ba58b16a3523be8137ce2ed9763485ec6d2a8381b018d6e9f8266a8c1e1f11a6baef927301efa0a5ec1f2aa36479d7f624c38652eae38068bac4242b5ff8ac1d098b331c65e1be23b43d9d2983ca9480d0ca283e47e4b17a39969b9b563cff52a4557181a04d9e7bd60e9cb3efcf56a669e256246fbf010000a72c3300eee5a263da208a339ae8aa83e14cb45c5eb2a45bb79214278226c2424780a47d3b344bebfccbfea90f38298da0a3ee2748804352d5d0ef793896dc08800028efb48ba9f76d26bd5a083f1053bdc2e5682e50b497db6eee001e9f0d4da6e3ed50786af3df815588df88aa664f85f11ed0523c32229e10ce46b6cd1a7136111aabf097910b24d47b08e5265fc0ec019e1697643786ddb8e6)) <<< 16000) + 0x280927ec7b6fa330ceca9f310aaa6248c1d89c4973d5fb8641ada77dcd09d43343b39ff5193013cc0124770567fbd1698b4c07810b47ed67052139c6bf34815abb57ccc2630f46dd204062e5d750b6f4fb599454111cc86c75ee05459a31a6bd2cb423999a06270200d7fd4901d23fae6b3fe5bd8cb36d348acde18a2a7972291e3656d6e7100053fbaa9a70e2bc19d463760f0a5f7b8f2bceb46f1f33fdd98d19e6527480010278ece294767bb98cfe811cf767f6db7e202aef0c82b24fbadc8fa90a167e365e0939839406845d6d54e56964060f203602aa87c561210739963791f775f94fb4b4e1eac8caed65f319efc44522686000000000000000720c2019767d76f1a08166514488284600480a51eaa0545e0f15279936b360f875f29bccc4122d280c9acfa9f7bbda7905b39f520a19579d11437d719161c366200ad79b929602cf2b5ba4a022d951ca3226f843733add1420f400910a04209ed150008c707402000015440010f08240c800285c800a4410231182388e43284d3fca6f6a858127b02fb8c0e7053fe602ecdbe5e0fbf456adaa42b8a49f6dcd22450473e2582c93f48984f45758557c9880e60609f92da0a0ecad0a53fb1b015165de2175240f6c316b905cb518bdae7cb8d84668c2ce800b25d31c727022247d99c7149cc24e87a151f450a1fbb1fa3893eb2d9727083ed41547fd39da8f50d249a6f079a17ca5106330a10e70250218205aafce04096ca5b6f0c2779dfe1c106580d1fc240117694340001c7e7f140056e483c008b152fcb94d20412a84cd861086cb5d91c31612738450eda7a50a0c06105adb40026181e00858bc228e5fb3e5743827f2c50ff560417446f6e1958386a4b520a86468a6b2ad6167531b8939d65368cbc8380270d2bc3a4c589baff2b39474d6cf9584228a9b0280533c23eca76572f49b206a1864524955a3084f06200a7db00b54ea841cff144e332ff5821ff60a9d2dc002f14197ab6fcca82fbbba35bc05903ba4ca0fbc42ff9969229bd318339b46e6c8b187aa4e280e5651d846e9a34c9b39453b2cd8c7ae84100b946280830000a9441184408a020006b820010564110a40344a03c05000677904305e0084182b8003a52d89801243038008e183551b8a0c3b1260ee43840cdaf324018c507c020048020000c0300c7531be914840007b1f14f2c761001482b1561bbba8a631ec870c41600001d8408c47012557dede082ad42c6e16009161e602004714d208407bd2efa60024a383c0100420501e0280004ac8208c81006407e320211901c0680d42400086c407c6603c23e200dfba541820a9537481054a506d30804d1f06d98a08260fa3300004252c1f00800b06c0f83602a130140181e80ae4b17062e4645016c10d5e050e7ea99d1a5ffe7b41272f2000000000000000008084f621d37b73a4318ffb8c49866d5bafda821fa3000000000000001b1988036c195816660638660228020080026446ca211dfc709b08d55408e47070edfe6eeac97b7abb84be18e402a69415f7578b298d5f6d9c694dc28730ee84e0acf63ea9eebe8bb78a4e5999b2260ff191b6f20bd09a4614a8f76a0180e6fb3ad4e2ebc7a4e2786c9c79c9a62421d8a3301949ecdb629a891f160b24ee3aada95974a5969d68bf41912e62055a6fa3271671252a34be0cd751acf2168cddcb1702f500efaf5634822bcd430022a4aeff159771a6c2c62a72873c9768156faf9c75e4f475d76972f878e4a0c392c7f246dfece824566c3a12a37c2b7004f97225d0f91ad12e7cc838f384ccdd9468906a2e507321fddce26d455eb16baeb478a35d0054bf9d0dc600a1547d50000527c9cbcae0cfa802691ef3c1bd1fe4de6c4f82c07e54f915b4ebf030b49a20f80c67b9ad38d7a82e2adb111bd40c094485260be03ee9dff7dcd72211e6b673d5c832c951e4a7151cd06d966730dfc98645a73b878cad49ab479ba8b3710331782bef72b1c3594244a39c0369d7b71e301110cfd2fd11977240bb58f8f6a43ffe178ca8bb2d80f5d0dfae0e22d7d57c68443bba43392edd88e3b35e39e5e703e87a954c02e90d6a8db0d66ee68e3d481d76fd64262f62cd58000000000000000020988bb66811e2f82fc7f9a010d14cf3b3d418f31d62e58000000000000000760c201a1841639231a0000fc76475fc5b30e1e4e90cb71ca0c74cb63be9964ef97eae0e836dd6067dd1c18a455f30a8aa51e57a8ed0db05faeb664dd00e0921b73e53983caaa232840bbe8fe15bf096c2f2c0d697f02fdca45e4d9a0f4cac19fe3b524c8a7ae188a156f60795de865e260c3844b0c24066403010929c0151598c46a2a12a2a5974952756d69e44f1c4988a1c2efe33a48e8bf0b2f00009080740210f52a9805d21ad51b61acddcd1c7a903aedfac84c5ec59ab000000000000000004131176cd023c5f05f8ff34021a299e767a831e63ac5cb0000000000000000ec1840333493c8287440011208424d796696f1e8aff21f7e9acadf93067071c9e5173dc4477943333b76d69f6011e5acfa58f886720dc0731443e0bc91d60eff577d1c67ffb2343ae934775f8f4332e2a3bce0eed5e0f264f1d464ec364746884af30e15a5472a8ddbcc227592c65a63bfd6c3ca42faf9fe46488599e44412d026374832c3bdce72dff499347521d3b61508440f6a000d484001e50e185989ec46d6c5ef8f9df8c0ddb3f6dcc09f814dddf2723722ae6d1bc74b8d77751087df6a29fc4060c30e289211e157a2830459e597ed15f6732d8b2ba274e81bc45fad6b95ed8fe0ea81ce2)) <<< 16000) + 0x1e5df6f36edb047d95bd1799e3350fe684b2ec31ab460006e6f20d1a540b547bc8071d8ff748a3237db76e87e8c738cf446996ba0ee4e297fbd48f57eedf9e3ab4ab4592948dc110dddbe5c0f0125408d26855769a6d27533b3cfcf4d8bfbbf576ef972cd5ac2596ce3aee50e742e2c100f0182300c988482a92b9723ffbff386492731088701e93d8fc0425cee2dfa74ed3e068fc5284dc29f0761c7ca41dbab7b906a515297a389eccc3198ea87466859cc51f4e2c2a9fd17e8cd51d692bbc6e6bea5c4bd0eeb61457bc8c1182ce8205455c20d4652fcb1800092f2002f646081fe0f80b5efe59c9bdbd71183ec56e17c6948d09048a0c33633b28c71c05f13565e0ea295dcf34e5b1d5cb02327ad4e0d38aafa1ab10a64de285e33b1274abe11001fa07605704b28f6aa0b5b40f7b99b50d832bf74c00005086d005ad4877c091b4513ab048aacb1f9a9f02fb0b787dd3729de29e2f95988aa8fc82f7fc2eaa847bc2b3c05ea3e1db73b947c5dd7a21e93c4861464280004be2004b824068b407812002bbe20760be30309511460a088a234402e5be0781411e708380000212160e80400e844072120380501b8280d81606a0a034010000b69002eec200bb2e7f920797a5fe1662936a8521aa551ce85012d288a8870000000000000000787210c7ffc28be54d90688d800000000f10818608c00a004008200281f8f84493391dd4c11c8cd215f7247d0d034fa55ddcaf7739d28104268747a4fb5231e9e15238ab6fe69a1e08881609a3dcad181b00b52fe9b6c7b592f3f3f1ec48c1f0a4ae381de3f0ff566d55340b3a0008aa4019ccc80428d9a0a70907aec05c3f01ac3bddefeb6a7d7ed43b51c074cd71cbad4275800000000000000000000000000000000000000000000ae4382302202280200180a8084057811ded6f2bfbd5b363a1d57315e5e7429e485766475b6bc3f02e507f813ccc0337dd96c7b2278bc9c755cd433d16e951155173ed9f853d44536788b0a84cfaaa437b2a6bc7cbbe062bfb4a5c6050ee37b206f98966d60b8854be7da7ce8021d879b7f513e82250538483d7602e16a6645917dc985d2d7143eb9491577339d2e7000000000000003487e035877bbdfd6d4fafda876a380e99ae3975a84eb0000000000000000000000000000000000000000000015d090c80c60c4043000242ce87ce3cbec6e50be58fc9ffb8911e5c74f907eb1f06cd720659dfb13341ff0b803c3f8d27456044c345eb69bac23477b0da45d893e6b8e1f00c5f7b7f150882c88ab8f3e1296d2b5fb050dafb1ff1a50396fb0c614be58d38da92b9ab561f80d61deef7f5b53ebf6a1da8e03a66b8e5d6a13ac000000000000000000000000000000000000000000005712432031831010810412000004a7e223fd96461c778881990f992df2ad7b84a9cce097109cfee6c729085c276243d4b1e8504492f737aae45514dd724c62a28001af90332581912c0c4560601b91454372480882019cfd600203b21f48ab43061d80abe708094de22b6d8a002d2ac2020c010879cbd60803bdd01a604001290504602887e035877bbdfd6d4fafda876a380e99ae3975a84eb0000000000000000000000000000000000000000000015c4a2091891071070850030050bbf1ab74d853451040574d7e3129e1a4251087bf54e2e4f903818738b20ae5ff1393bea03e1f082e1cda9e21c9da397ee499057da1f7000ab7142b73bbb532050781ab44586d33c7968a01d356d6a900193507a610005b8d7402804e383e010b1c73f1ca316359d08be92460212c62c58a2e79446820823e13fc940007a11f000004582d280817181f00479205b8d740e27b9075229848198b43c388d44d755e60e0478a744c08872ce4c0e100a8e3e4380400a1a7a50083e01087e035877bbdfd6d4fafda876a380e99ae3975a84eb0000000000000000000000000000000000000000000015c4f34f2ca28e24c24e20c08900501c820080340007e8f9602540b95e0038b0075fd762121c4ce611730e058e21bd2952cb9a260e04ad8c1a7f0302148eef7f2a01c01294e97e877402993559a814e207042d03c43f01ac3bddefeb6a7d7ed43b51c074cd71cbad4275800000000000000000000000000000000000000000000ae279a694514712612710604480280e4100401a0003f4400100481782fcb001d506431e4802eadcbdce2496b59823a7103dda489d230700b7f179a1e0c4f1c0a61870433fb9f1ae70027434d7bc00331687858804250145140a9d8edd11e4809ea990a2712816ab98f7184814004b16a710576648cb59010037aa6e227839b953f46f0e08a17d2b3e248004affceae0a0012228a59cc8a042601c00010e187e035877bbdfd6d4fafda876a380e99ae3975a84eb0000000000000000000000000000000000000000000015c4f24e24c24f1cc14604e00200c020080361f80d61deef7f5b53ebf6a1da8e03a66b8e5d6a13ac0000000000000000000000000000000000000000000057128a3c93893093883c728124014072080200d0001fa200080640b80400107a40b45400205c4004688816048004cb8800b58902b2101502807c1400317640a4940045fa400c05030b8bf91028201a06f28404770d9410a03fd521e9100e1bff25e0024a383e0100281580d88c09c2604c1301a0181280f8c108a6a2040cf58a0be8e10c1a015a0c2e9da6a6430004eb307c300d1edc4f8024c303e010e3011210026ced517af6d82c1750d724a70531dc4040d107bcc64d1947fadc4fc8360e94af4c08c308)) <<< 16000) + 0x003844ff21efcde6238d366744e386bb7cc3203bb0400c2cfe797a171fcd60bed0f7b407552dc80c4c0de40009bbaa0a05fd2ee7fb257bc38218f53277e5c5aed1fa4f725f314462f168f01f8b9c0f208293a3f8024010001fe9b3a43b8362a38e74d5609d7892b2136082391fb9eae480b71e00e1f80d61deef7f5b53ebf6a1da8e03a66b8e5d6a13ac00000000000000000000000000000000000000000000574203201181081000002b495f0af6342bce0f6bba20ca2224eabe6d6e5c45cb3d77d40f2794b4a61be8eb71da627da201594978355845eeec3922e2546988f297d2f31c5fc5c673303f4df3686a3a307ed0004bc20303302311d10128c93f8c1118929dd0816c0177c44809f7cc8ec202cf7f3d700024a403e010010050110280004c48070c80846400177a40809403e2301e0dc8a0bfb5cb49081985c7e041008bd5661c151181ef62830c0e93680004cdd331000093120f80400582603a130150580a00f08866b5c0c50917b61650910a5798879818e2adccc280111ad6544803012a088800650153f202138e0f80430860ca79765093072d3ec8108f6fa6f1218cbdf75e10030ecf2260004a383e01000010620380bb1ecc1ff00243498718d080fb1c3a641c393384b508002cb0a8d10004f8f588010598907802000025e686a8f0d7aefe03f54b1dc3880202d5695ecb3a6a4bc23d228401c2bd943e0d11af001ed097b4018210a96aadaf8bee227e1e780280ce9c863bb1785c9ad0ffe0010400efbc990eb33e9062ada2f94afadc60f3242f100a50b81f80002d620224200f0500037b901b2980d02f0e2fd8908482ff6c5eb001221c1d00800c84e419843f22579f10e1c19203888e31c3e6b98bf42eaaccc328a3afbb9d469bbee329de1661710011e7ec13469dc930448d2ea100319fc6ca9a74fbf4232eeaae992a45eb4446d00d24cd3aa2d4aada3549e02b73be988be68caf65081349d795e310218190001a49097bd1316a60472544be6dc9ac8cc78a0a31df43dd95046cda359b17b5a9d839b3736e8f7e8aeaae65fc2dff4783f40001ab0cda242dab4652645c7081c346c645f1fafbc93a1efab11771fbda8adfbc8b6e889fc2ad15bc4ec514a0546a48c2c7c8efc0e3b1da1353bf0940a7dcd0505f79f73981092b61e7fca4028a88f757f83b01ef12559c61ff95a9b91578ef8c861d6a0000fb240607602e2a0161180a84c05017a245f5b0d4dea7c8df171fbbe8b09276f84ee55c18c6913f500750517e8d5a5a738aab418b5bcf5d162ad6ac8200a9e8d6648ea0ada9ed10b4e04ca62091f09c4247725b14fd0d36a2c949d3ac37c4e3967643c613a61e2ba68002fa1f0665673e1bb5f4c6bc14b658287fa9efb0e3414b89e68ef7c2baa86d3830d0e6611d06944d35f9306d080701653ec22adefafbaa88c8bc618f8f9bec195794ffd0ea1d4b18db791d95ef04a8842cbc5a52432b4a0081e0e50704d005ebd5be4002a8a5144008c607402000014e70ac605127f3b85c9e479f17429bcfa6fb36af0831f164d80fd46401e0eb93109f150302767032bb15539b1337fe06d1a3433e1240ca4a2028644c09f3abed080024d3118119eee6fbae47249e81388f9660ed200feccde555a36bf021f7003de07c4d9ffb029bf3ba5cf32028ba272f4436beaa08e64ebae58b2c450acc80000810efeba9bb582422283789013b58ff33e7079a7e6bf8d820427a7a544446e7e38d663506cc513dc4765642ee81714d13f1bf4485739d829bea22ef3ac100153e739396bfbde854c08c67a770f4b92f11ff595a222289ce8b8685b0890c7129da5da468778e49876d8040d92d465b54580cab1fe8d9dc95ad6edf7bfa8f1413a995c3791473bc6d420806399a51ad2e8fd44a15a5ede13db06856bde28eed0474133b3dfefed21fb49ad28122fa3157ec9497799f6e13c63bdce980009da202622b3a43b92826a0d3024a634e6682003b75801d01c248f3798adc579dce8ba29809efa2aebf3c34345340000000000000000000000000000000000000000000000b6dbae3bc429605a0c18409600c00800b9e6a53b06f4ad86b1ae316dcde853f64aee174ac0e510e376aee9785773a6cd136fc0aae1bebeee942ae8d67c39f77a3d39a3ed1edb04b9c9953930fcdd5e8d15f343b2bfeb54df027aa77aa115b8bef463801db6b9d2c435af4dcc83d5b23e7c083d63d83efd0946501a000bae604002008b3a43b92826a0d3024a634e6682003b75801c3f01ac3bddefeb6a7d7ed43b51c074cd71cbad4275800000000000000000000000000000000000000000000aedbae3bc429605a1818e10e08600406d9a9c3aed3bb182b06e31eb47226aaf7167faca561f9aed056ab60e457afebd36e0009e3fe1a1c96c5a4efa8088d9ad576b683671acb86a5584ffb0f3124542d1ea3a1279dc24c72cd10e20482801303b0c17008004c706c01000014640015588091280016a08089080403401e12001c51201c4a0025722005ca4400f01cc2d4cc8b22fb973ba5e292bb515b6207c7c8899800000000000000d4e4218fff8517ca9b20d11b000000001e21431411011000c00801138a8f3c59b0d809c5a540edf42f277026ba88179f65c12105b7615526a6a7653df50dd227eec4f7c340efa1d620b927ed0c125ceee2744f36e30203033e3c9bbd020141c00754f90751a1c8808180e3900076a980040441cc033b5855843b20d11c4203d0740000d6100d2100610802c84014220090d00406801c3400c0a0050100200800173480190800864002020000100351a9)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 25 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case13" = "QuadHeightCover18Case13" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 25 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case13 private def zz2398:"s095e"="s095e":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case14 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l17 l20 l22 l23 l25 l27 l29 l30 l33 l34 l35 l36 l37 l38 l4 l42 l43 l51 l55 l59 l6 l60 l61 l62 l63 l65 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x35b282b95, -0x48de0a050, -0x6d5880cc2,0xb53b47d6], ![-0x48de0a050, -0xd4bb23909,0xda4b2ec0,0x43d16c4f8], ![-0x6d5880cc2,0xda4b2ec0, -0x1da3807115,0x490bd0c56], ![0xb53b47d6,0x43d16c4f8,0x490bd0c56, -0x247a76b28]] noncomputable def hinges:Hinges:=[(-0xedf00aa,l6),(0x1cdab22fc,l4),(-0x10b3535b,l9),(-0x1edf64496,l8),(0x2e5fa62b,l11),(0x82f17d1c,l10),(0x3c610d6be,l14),(0x182b239bd,l13),(-0xcfa23cb4,l17),(-0x182b239bd,l20),(0xfb65b4be,l23),(0x3ca47a6a1,l22),(-0x247a76b28,l27),(0x247a76b28,l29),(-0x3c610d6be,l25),(0x2dbff60,l30),(0x247a76b28,l33),(-0x82f17d1c,l38),(-0x247a76b28,l35),(0x1edf64496,l36),(0x247a76b28,l37),(-0x1cdab22fc,l34),(-0x2dbff60,l43),(-0x3ca47a6a1,l42),(0x247a76b28,l51),(-0x2e5fa62b,l55),(0xf28f1ad,l59),(0x10b3535b,l61),(0xedf00aa,l60),(-0xfb65b4be,l63),(0xcfa23cb4,l62),(-0xf28f1ad,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x247a76b28,l27),(0x247a76b28,l29),(0x247a76b28,l33),(-0x247a76b28,l35),(0x247a76b28,l37),(0x247a76b28,l51),(0x3c610d6be,l14),(-0x3c610d6be,l25),(0x3ca47a6a1,l22),(-0x3ca47a6a1,l42),(0xfb65b4be,l23),(-0xfb65b4be,l63),(-0x1edf64496,l8),(0x1edf64496,l36),(0x182b239bd,l13),(-0x182b239bd,l20),(-0xcfa23cb4,l17),(0xcfa23cb4,l62),(0x82f17d1c,l10),(-0x82f17d1c,l38),(0x1cdab22fc,l4),(-0x1cdab22fc,l34),(0x2e5fa62b,l11),(-0x2e5fa62b,l55),(-0x10b3535b,l9),(0x10b3535b,l61),(0xf28f1ad,l59),(-0xf28f1ad,l65),(-0xedf00aa,l6),(0xedf00aa,l60),(0x2dbff60,l30),(-0x2dbff60,l43)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x1d83144281cc200a00000006221024300c0000016209814c602000000001109028c02000000001c120498040000000054280f30080000000000a81240100000000000240c8010000004a2e220720040000000078440f300800001c8441205a801800000000000c0c80100000b642118122006000000006c340730080000000000c80e40100000001c8a4090c0300000582205809a00600000c4521c016400c0000000000700e40100000012c3701a0c040000000250c81a180600000004a1d014300c00000000090e066008000621441202650040000c22a82204ca0080000000000540720080000000001d00a4010000000000390248020000000311481b1806000134350a004640100000000090500a60100000000000902480200000000140a02980400000002a09022300c00000000000a06400800000000001c0c8010000000150600998060000003104408c3010000000560b810c602000000094110218c040000000002680510060000000000980520080000000001281c4010000000000250188020000000000088190020000007c54340540080000000c42204e6018000560901602750040000000230a80518060000004d04803130100000000098500a6010000001242100c8c04000000002612031804050829010800cd40180000000000980a40101440a1044006350060000a813828036a0080001702807005d40100000000004c01240180000000000e01480200000000221203180400000000442c06300800000000038012401800000000012014802,0x1e0e029804000000831440a93010000010315404e4602800000001a07014c02c2459504481669200e0000000064480b30080000000001b00a401000000000035024802c3659804481e78a00e0000000000fc062008204984963012c6803000000002521028c020000000000078190020000000000b80520080000000001681240100000002888c0c8c030000000042140498040000000000b40e20080000000006a01440180000000001a0148020000000390c8139806003182302b00f240140000000000280c4010000580cc2900a1004028a23018a0530a00c000000004c180530080002908619019680200004c0c41701210040000000210c81b18060000064260a026400c0000000441202c6018000019090240590030000000000120310040001f03c08407840100001e0420d01388020000000841400f0c040000e81a04203c20080000f02105003c40100000000441401860180000000321702cc020000000411c81b180600000718ab019c30140000000cc4201e6018000001d45901b8c0400000000620e039804000000c104c0a630100000198a83206480180000000290b01cc02000000000032049004000000b214c0a7301000000000008812401025210e0db0088500600000000003a0390040000000064380f30080000000110a81e6010000002cc1202e8c0400010c19042041a0080000000004830330040000e08c980f486030000000148480dcc0300000000054681980200000008231024300c0000188a42804480180000001c8c40d8c03,0x3022a603d2180c0000000be3201c300c0000000168d01c601000000351d110190020000004982806f18080002d8310880834010000000000b0606600800000000002c0c801062423619c0110a00c000010c5421032400c00d50af11c022a8028000002c42303a0c0400000000720e039804000000b454280b400800000e31320236602800000002509034c02000000690a605398080000000b251036300c0001098e080f486030000961444102e500400000622b11013200600000005221016300c00000010c3201e6018000031150840590030000000290501b98060000000034240a300800000019c7403860180000000311e038c020000000003280510060000000000c80520080000014231811260200002011d301e90c0600004a640203d2180c00000009241036300c000010313202366028017428c29c01250050000000000240390040002f4ac17804940100000000c43406e6018000000188280dcc030000030c4301ac980a0000000058240f300800748a208407f8802800e31541280ef1005000000422416052004000000004c140730080000000000880e401000003b0e03804d0030000e22887001ca008000000006c280e3008000488a21a009680200000000000502480200000000120e0518040000000000c40e200800000000002a0640080000000000a034802000000238760361808000000410d406c3010000390c62901968020000000000130248020000000002e80510060000000000b406200800000000006812401000000000029024802,0x621c0498040060ca1123028b40140000000001e8124010000000000170248020028448c208125200a00000000d4440a30080000000001780c4010000000198640dcc030018e248338149a00a0030444061017340140000000843202c60180000031120f029002040e38e30604b2200c000204730c8088401000002d8702c026801800001461e4046cc050000e2308a6065a008000000009c180e30080000000000301a4010000001444300a0c040000030c4c808d980a0002047118c0cb4010000408a21981768020000821985201e5004001461d8218145a00a00000000443c0530080000009008802c60200000000000f0148020000002702200b18080000094260900b400c0000000003c012401800000000005c0c8010000000002a80510060000000000a80520080000000001481c401000000000029018802000000423c32052004000000250740c63010000000d408802860200000001a024028c030000000320580e18060000000640900c300c00000d0082004c60280000001b84402cc03000000003212039804000000731480bc301000000e315c05f0602800000001e0a014c0200010a3e85002320080000000064580530080000000c45a04460180000001a0b404cc030000001082204718080000006716c0863010000000c22a810c6020000c32dc56022100400000b2511a0132006000000830500de3010000001220981d0602000000001509028c0200000000241204980400001288813013400c00000c30f202366028010418628c0749005,0x68190020d24c18a240a6b401800000000003e0640080000003c8cc0c8c03071268c5920535a00c0d0cb481240f7e4018000000000188124010016324440c0a2d005000122408c606e2008000000004c1c0530080000249045406c801800000002207014c02], #[]⟩ def dynamicCode : Nat := ((((((((((((((((((((((((((((0x1a602ec858c0d1cd4513e3058e5701be1d104514607ee16149581f9a810575ed1c7850018a0995b09c2084021e348bf919e50564321ae90cafada9f664111070062757102223ea94d1d576e0a879e5157f47cf6d1079e5157f47cf6d0e4870f94d56fb07b64870f94d56fb07a880881658e806584285d56218e075e50cd5df06fec1e5b214512fa49ca0b585a63d338df705340b0232191fc8d1c25037c5a2dbaa758e9e82cf8241707257f8d0c711c808a847b9bf400111c80e02e0581c6928ee0f59858e1f6461948e77b8825393f465f75f505848ac09007380d114101652bea0560f66021c766ee7c6ae90e099f7b2324d8b305000ab2743edee1a9e84808043605458e486dc008208e7a90eec5857e05ccb848401b02cee682da3f7dac602372fbe524c084001000012b214412105090001db910b1581288c204460481bd2d9f600d2104c6cced20e04e4bfa9b281204ad94009030780202140bc350bc8d523c4b4ae977e28682603c90f0a17169df820968737b6094207c02113c0a67a0c1061e7014e5d699442490134fd9024030d1581891cf5d00801285c746002083903eecac148000337f980008002cfd0bd7ab03001e7f79b3ea0482420ac09000043870dd3b08380f12f1bee478e18edba20a3c2725d514a083b5e76ee0d000532bd593020f80424901e0a6e0380c3684334e431d01038cfe577e0782053601bd3a38101eeba65400208888b9be65520001406f40008003bfe3f32b00c00b4842d7b01c2410a407000040a4424140006b24001a9888404c07007c604e06e2d145a9473e90604b2ceccb4600047fc8112020f804041c060f40380b72c0ed2501390c55661a1833a4f374026086d6d8700021f022020001e74da93020f8042081e2a2cf7228a02255100438f7c63dfe091145fd93edd2021073040733c4002dc696c5085a4216bd9300016e36002200f7c049322904230080000e599245edf68a74030d926ea199ea3c31845c3cb1d121c8a8058998070818be5eefbc8023027cfdb66440086f23d79c1e006171b3b17c722020a40800003a640013e8f0641043541817761d25a44083c0101060183d00e2298eac4fb405bd65e360809d7fbcae51081d30d00a011fec7e1308003529f7e4c083e01082003cb6f73c38f0abab02dc88a4a5555ade808735fcafd8786002dc696c5063390fe5f898000b71b00088023e2e93aa48042400c0000d29c180b149fe4838c01b7eb31f1869af0bf67e1e185d5c5036890e73feb6efc8023dcd6b4d64400385924b31e00dbb54c19c0286d2f22590104a0200001d420009aa4001644851088414240017c84410140027c66455af8df141045fa6612810666e75f79a00f180e3a24098306f9815081f00404082c09017004010046923fb19898a2dedf29b470106f655f93041e0040000501c209e75b1618761206d14006a6175214005a6608028103a0080000c83042a63bd3e0c3aa6879ae3011b8ae38908c2080021841b589c1430cde193f88012b2771109840e802000027c8000b1100033d220622102118808684001404c0a0004e621fe3b01505f8d22fe467941590c86ba432beb6a7d99044260c50c606586186680600500480264300401a09a0b0fd05e081774a1584412f09d32411c081e7e8fae3410a248f) <<< 16000) + 0x78218006b99eaf8594308c021a68321a339468869c440009820016e34b638860b209bf08276d2591dc70231c7a1731c0079985546000f42401370c220040000c510fe0100016610fc0dd0c022f94d41d2c30d273a6fc7061c72cf35dd0cc045fc5a7f2fa58200ce6c71ec30014a5541547140114847fd0349000efc10070028648142901c07e82f0c00bb5bf38c0cf37441909618016e34b61831ef3e65c41878d01acce0f04413052581a01ba4f30580007a1200484e28460100fe010000d590003b33430102d49b92c3148101c92187f1a1ac628208b710a1991a00261dab413001146aac1250057984ef089001696e42a89406118040134161fa0bb0c18aa52cf8c19893862230c38b1e1b460211881180403ec0400019643f0376a768fac26d788165b650bb260ece2c8e4d4128b53b47d66c0190cd347ac659bfbe5e5edc0464186104582502680500100291cafd45563b38161552070cb9c84b5583aa6651aa28a238fccb4709c4751179b1ab60b97d9e5c628c88b874bbc15ac4c1be8f460c721c3fe5573475b5dc1fd213a581fca5c7df5399c5823a994b9b065e5635b6e523ef49d1f24a9290b78f5362bcde08de39a23d0030293d225c3b75fecc771429f11c263670f684fd23712dbebae6d634df907e07800ab4b746ba8f91366583ecdef20882346a82342cfc1087b89a5e0b1f3504207d08057246e2cfa54196b9753eb1aeddbac975bb6ee499fda2f89a3dabb04c9028fdde6377a500100923f19f8abd72ccee56a936c88a899f9053c0d101f6020005ed20011d04002f1c80b9080585402a220140d000a281b53b47d63600c8669e16b5179de97bc8e4504860c4c028c31dfdcd98f93c6a8664954dae8dfec0ccaca61db512ed4ce1000000000000000000884642a6ca76205a1630c11400e00c00a027dd74cf2571a65b562c0727aaf8c1a3f376cb010c2c50afc371ed2c69c0819c070be3ee47ceacc935723e9545002d6da4975e2e8550a86e75b1b50e530f836e8778080b4040008f6685719c1056cf1d9924ad6edd51c337f102633fa527f12dd0e701c20e4140779f79a6a532656171411839d0dfd425d21a434c0db1007b4a4cdb023250ce50f148d0c0bda470477cfcd8a5cc06c9915541a4316ddfe7918a52544e1280432d0991941073632bc6a981ae8f59eca98827d98f1703c0000742405c3602c0ba1441dff975008266124e1494101036d9757b220099210502d410020557e7db8000a49b810b60209417179013167ade680036c404e0280fa05d100039ef56cb0e200f52463b0820942aef90df416085c2cc0e4685001f54e5b4678400757f57ee6c000f3f6a2ebdf003fb3140c2400051392150100000774c8e5c241cbc204007db3fd8e081e48edd04048fac62ea581db99e9bb1400e0ea6ee280024c504201000014321f213b58a30db8000000009c49de71d7f19e34e0884d20a20410b08b042001000000000c12008036d628c36e000000002712779c75fc678d382220e00c8d20a20710410b08b040000000b920080340004d0d032294a5990c0800496fd0580573d79cc8a00f6a230f4000212141100400003b487c148000e58f1412a7e84b80c6fec3c52f65d21bba9f3411b3123d05182ba221cf41d45e50d3a0127d1279e6f342fbb8790afea000000000000000000092bb1b7dfc42dd0e4695479cfd0864f4186bdfa3a5df9e42305990000000000000000002299428e28e18c1080060282029e34e8c13a9fef24027186632580e876294690b3edb81b980765a69e90d2577a32621dbaad99b03ab4f055dc0b6b812e3c42aa95f75f6b8244429772ff255e4ad836b79d6ca3d172195e765aa1e8d172557738ce3820be4a21020d218d5ed5ca000c7c4054e41da4a0f72107b0e8003e4887a8ae475d8ea4730e26fa7f33d840d70eaaea8202660746992804e30406c08018261d04426082100807a02c2480612203b21b353a7145107b82e71e205c53e78240a22aef0a5dc9049bba1ea8101aaed294726042100804b00f093c5228d14a18132eae642465f1528ee0614a2c92896183126ba5dfc50802a26903081bc7b432049c108802184a8ffb4bccf3cc650c2d4cb99f157709232a466cb0caa75a30a21e5bc40f97a38a104456a779e2aaa103533be8bfd43551600bc6155512c2ea100145eb4384f3309e84808043605400012310003c621e61a0f2090002a890f11187802c0b4072347277434840c5d5c3c290c1abfdeb63248429da3a5c0610899c475838085d8ed2c0400013074a400093901100403bc140003106c4920f9180f6d0d33a76fd55b4e67b274fe01dbd013a2000000000000000000000000000000000000000000000005c12051c52011c12401801000c0000525bc3b15e8800c2571433982e37093bd333b261422c877c09d98dc45ded03a0679314d171a1c7356ea7cf772c7e2d8c6683e06b051b65e50003aa21dc530ed1d80b86c3b03602c0bb245cd4231f92322e37fc571459a03ea28028405b9d4df0c00351985820c004795253b500098808c021848e2541ad124642d41c1b440a03c8ad230516a7400589000005f98140500094808c0200002387484e22fbc28a210641e8d92059ccda4f94d04021ced4c1c025b86be29000094908802000023243ac2613603aead80b943602dc523dba6c580b64bc35992ab38e64738924396869a8d7b89d36adacfb0dd5232000000000000000001125615848261e4581d80b91ae35d75f73c79f2bd2aa58f44c55c000000000000000004343071c42c01c01404000627bb2a)) <<< 16000) + 0xe147c2469937dff45ac29dffc00ca86a49264b6fd6430a93f830f2093dfd9e717a1a8ec4214b1f1086fc6046d2dd76fee27df8b5fe8a168f3fa2eead9927e06cf39ba4d448ddcf5faf8e84e54b5252ba1d41200059c21d21b91cc92f3aad1c4b50a9b5c0a06d361fac91810556301b8104c35b30d610009af01b680000026302200860fdf3d27089aed07127e3bc01454f60c0a3f2e00cebdac041a0ccfe300a110400706d37e45a09c700f388755688818a000d0bea64ae7a08f73aafad8250003097623fadd02a26376d68601fe45ed7c7303304c00014e10e82100020c9a1564a0cf61e040b6efdb27ee81c51cf40201041201cff6afaba04000659b513801810f77062ad8500051b0c6048504020be6c372d89063c290200000ea9000fd021028a0e72900e128007460834aaf8507f88eb80605096c5ab4e3af0810efa1be27000811e2cc3cd46030018a33f4ed2810030e75ddddc2a0a0809a9def2aa28801fb18331231da66ced4465e2286582b02800010f9c099d692542aec1012e3a8009a878182294dc0926bf060079e18aa9bae0a05d3f69371372100136299b14e180aaa20b5687179f0c943df25345ec842050a9b7aaabae477b1970bc0c000048e4398b41ca430e41d07184c388141c202819cd2313d0fa51c20531350d805860ad6720456adb14226162d86210880043caddc49c81c073266214a51850055b70d4687c55014109a8ab88a0ba40812aba8604cbbbba2170163cd1b76d12ba01e606d73f39e68c30ca0cd143b069400f5dbfc2e3091237f43a97941098fd92e9a41040269fb26786810a4d380ef02000008954424004922052030f3033e4d4a9cc30fa4573d50d28c1fe2e50cc282e3177d04d2638ee53d58c245f85f9b409000f015a60c02710240080000bc9c2659f78c4710d20602c000074c23885286c910b20a100484e945102f5a083710905365fd8e1f0e005687d860f890008917f1afc000de077fc8c000c2450a0060000406438027e6b0dfc3fd7e69474e5d04869848cc6c05130604849e634420e1091efef7de1042ddbcfc37820809a7ec99e681e4fa1f70010000089544244c82130083cd204d8253034a43fdb7c9a34982b379c643091a69f63e91c210270b32a24002548fd582604240080000a19c26d3e2d5c489a4028a7b6bf8308dc044f892e40c022b3012906044473095ab080811fefdf34041a16dbb172c48010447eb5e000078033bab704a4209c0500003e6437c341bc1a0dd0d06e06800169c86d8ee8788a65a55a4dcb182fa297b5ed82868b9daa7ae424908164a5ba7c3c10207cd94e9f5302083a5962d82ec20005e27cc522e0400158cbdd5b10500b03a4aefc2004c790485c05800023a364c015fc1f4ed123026f432f827942899848367181228842189ca2b9008a85602d1ba060879573afca616004c75024e480800b54bd28b1c0800159f5626a3106c41416010000089c86586e04842dfe0d9f78e20248557673884082978be198c038239d027c1f9428028bf1bea505a80007af01a5e000d03a2ce47f23b9dba425fd802b44c96379cd46a605a05000021220be6b05c1182c80e4728c270201e0e21a9fa0af22880c1cef699dce3874e47b1c460183061ca1d8068a08220c571c4c1040ae503f3402000d3ec401001500400dd06a2d5950610805203000021620029e24368f783002255109040c21da1b2b01423bcf2a36b45073848398f3180a9e82863005006617a5c3415401043096bad0580c53d4d318173261300600006fc82fa6c365261b07b0d73986b1ac354a60d23b0d4198698af08beb0f483ee21446b084cf950808181ae561c0860800c28ecd7b450381ba3596854d21406ee1f0dc9d2040024d5d30c2e154150154000feb827c9a30906f36123bfe029adc4f0a845da1db0b40b1c70c452da7e300e5c9b37b1f0fc2c452314573e9435787fedbc8eb64235f15a90ea7b10cdb9a9003650b25e65c2c10764c88c418467f006548c067d8512f0188dd9ba498b191af3c3e016caee84fecf2bbbff3c4e5bfca527da755de56730a6896d1592e65294387cd0534a61b19621eda55abe46b87c077e669625c53de1d69812380f6b75bc740aa1e6f08d4c2124122f1d8c3003b5b644c8949b2c5844b10c1ae49e0693301b4cc9b82145e5972584d2c793cb3f60876c50b3f80016a025a1a627fa83268cf9f573288f5a19cfa7d67cfd4f40b0623dcc74ecea48206c671b920909721e30b07f6dc29444043834d12c12f4e223338082c8c5bf100037d8a82094208002160d57b81a9ac1ae2c6d541c49c58145d350fd968ef3519a9dd63cc68bd7205f90f582acbf37fa145f703349a322faeed669a547847330a86061b4e0b43ce0b19184aae60e4746f0fcbd01f4041ca6ae81e40eed3bc77ec38b8c4d06c88e09e1a777ba3b575ab8876acc62de31d7dc47d2d44d5ba9c184d1d00847e21c8203e4fecbf13657da2e7371f5750b2075600b1ca49664b37f1efbdc1c6da79fabef5cd8880426d1990000a60407417e669a7cbef0619da0bd141a09e0a951a9c043a7d53f120210004341a78f75122083800800004a20f212078090000b11e2f2781b9a480718023a24083a0088020080200000888690483442404c020000f0213c0b881878f21b0064334da88339b9e93508dd382488a3903ba987aefbdaf6c6a5e6bdb1a97a088eee66cef277858e546099bd07aa0264f5fb966eea54648c1ec000000000000000004327cd776b13302d0c24808204600001eebf450666cdfdfd950a541c8632621e22cd8f267)) <<< 16000) + 0x4630425c71f13db9b483aa6b7882d87eb730011c4f2616aa67f572256bc44e7e129b99351e4271f4858798b3784c9f395d33b765d98a3a5e8a50005282001c8243408619e43d2ca055a785e10295316f3e79c653081f27cd776b13302c8a1c714808408c005004010402c831fdebb8544de2125af7094ebc1cb178c6f28eb10ed8709cb1bc4fa00040e6c80ee08eabdb1fee2e1e28dd703b9a202b6dc8c2163008d79b3bc72c91453226d35720e0492880918bb9b09b172dd468de87f6a5ca82fe0296581317cc95e65b1918133723b28f85ea374a3d1007748437db685e4d0896f6776086bc6e6162aa882053ee4a4277461a9e028df02c88e855b6dcfbfdb7935316e2401040c44878f194c2346c000085a40e4d619c630cd2585c0cc0e054198230cb1186502c32407c22d7ad8f3cb0ce344c7e420747267a352012014719d880aa22782a4e02a5c99634480c8e5e54644000272c2100848845fb7dee9e39862892c4c08583f8a9c404f0c835a73415992af38900dbc6c21bcb001eaea4ba84e18420109105c6170273020d00e7101014637e18d4d0667a822dc4037272e30128000e41f0988000368394009c30840200002c66260d5f0dfca70c126f55cd96083a83a46438297ea016f100009e09f8c1011047b52721306110040070040002a243203618e1303105e90011a04a340464ec97791e18de57fe38e09fd160482485a37714f5181f08299d7840885f0dbdcd00372ebd0ad0084201092016175290291e1869a0e3a3de10335874a5d91e7057ca95a21eb490a5b98995bed8c0d3ccd61f2ee08110a58bade0a2002ec5c659ba8fa1008560580001e420920bb53b47d66c0190cd2d4419cdced788cd5e0462992690490406704484182800680990801006cc9039e70c989202e96c1f4246015bae87480c2c6ce1b8382533da4f24909916ac6c80c1dc0a8925c2708220080000b410002ac209a1b81d48bef6a838446e25c8f0c216e43bb9860e0b5818b4500622a79444a084201004901e90011eaf4c1241caed7e56406077c7c5f8812e77768a818301c1b18712821100426723d1631c8690181455f61a3005c3df085046457288c08113a7aa7ec182cc215d5ea004e64aa6fe4e0844010000166200051441cc340380a0003e8218c2a034110005541d16910df02e2850fcf7c3b1005e04c02ae1414254359c430431dc7cb7280121b07190100859ab2f90027142200860e256ab6df520c8f1a45081c1082e75b6e2820215fb86028310c335d592001bb6c41c9a007b7754b02c000f47e9e2940411804307225dde64a419185ba95470ff71ba604704016f90361c22d960e170a0a1f8788a12608210080000999d2ca055a785e10295316f3e79c653081f148d3073054831c31c208148034072080200db53b47d66c0190cd347ac659bfbe5e5edc046696502ad3c2f0814a98b79f3ce329840fcc4b6e9005f01641c01a183a418e18e1040f3788e279ac9efdd5f290da862260f0cb2ed4ad6cff7d4eb5a0878e764870558687ab3decffa8860521412c097a00061e4314140008ae431034000ee4430c460741b0380580049c90c009000c5c10c22586088c0b417c48c3948bdc814bae8a7f64065ba7dc9e10364677985140c0d856004e02e27e737a48047a694af4000409cc08402101a2a4c3c7c40e2b68b208502e86078240c122a6d117a000212161080403002400020042fcc40461a0002b93a5940ab4f0bc2052a62de7cf38ca6103e79c6530a54c5bcfa785e10234b281560f91219409208c09800a006020000a81eab08c5390d7e5d77143de9e1e8deae61558d6b905077896fd00494dd5f60aabbcac0e812e3dd0002b5217c7b0bd318418ac1c817008f487bf163205316b59fade44b87f4ff1461068bf65399e055b9165a02f59a78058c8fa82195269351f83df69fe24478aaf8daeb2f5423d35e6dbbb6abd2a680001f977476b5760c23ef37d7cbe8640a9791f815cb8365972baf6958117d919944196073dd2eaac72ba448b34a5d5833c1248092bbdf103aa6a2d849167b1b0306081aa32aa30d3d7c4035010425ce691d1800b863d3eb2c00513a31be300373b639540005412a0a32004e3046010802008023c378c668a88056652bf64d018fad10e11820f804000029085e00e008020088082099f1e0885350802f66043212bbc4700133096ec5010800100001a670f585a0b6e2c014059df5422082200800003f90001aa2176220340d00017290ba1585c8482e015c7c98c661e0b0842f1ca8230106a607e18804f8a6d0ac1c114a2780c840444e68dbf48030c05e5185006077f24100a0408802161022683cad00638428982682440cf0230230c2100800e00800030c85b86c0d0360960bf34aec8ce4681580428e09040e8022082a3679263c6eab1d9d0f6e9d155cf6f5e85d4756ab5d9f4a9e8de5717d140157b38de3f41e5cfacb154cb443f798843ee4a04a6b8588ee10003906584f07330207c6709ad56cea70956876e34aec7e78c928e8260ca0ae91170d5733ad1cf34cd1250f22030ee08b4348a7a8f6c02bb2c1c69353fc867836a3cc18fa6a81d034c0cfe0567b4ec1d91f4cfbfb32f45d60802501293e54026541d92d2adf50677f74e7c06f53185473627b8b242fd30a3063a272de76cdaea1883537a34a1506f6a5be41e53c20311110de83369d394b720ae5770d77936a99fc20108d7cd0ff6f02cc0b29a0eb6bb177ae48718ed63ba702e568bdc61310b400007ce386c2ad5af6f22df2c14cf60553af4be96bd74b96227651c74204b09a)) <<< 16000) + 0x2f2451feef08e10d957d27d3100e38b23284409b72a400fbf8006644c19da553e18fd078ae27823d20a804efd737d70fb4051b11033d59addfe1dbba8410e95df35103fdfb17d93a850ac7f0987e1a30fa4cee796010da9fd3110d95ba0ce09d625dcb77b0dcb61aeda71cad3eaf305dbc2edcadd164f78b9c982494eaa8578218fc26324cf3b4de282952901af54e0ac114cd978e9db68f37c78e2b72c50abc86c0b7d4a1c5bb1c33d54175e8f4bbecc5a97c291cb4b4a887a51b7db2a0a28c0cbf31d364e6693fd19b996aac8e3240147e7b112b0b45595322ff853283949923b55fb6cb8d2d510ddff9091b4d610cc993513ca66309b565405b00800230c82686c2d43615e13804008023440b8887b288707f60508e020666e09046103e0100000a6209e13886723dc0bf30300c32da62007a97e887c08c30840201680a0000c421662a01c05000100900139821642300167d200369a42c4361360bc1ab533b455f830b8ba0625cea064a37ce14933980bd41480c1a38225cd188b9711653a876da0278b42359ea3e7c214eddc3bf8a3c07edfa7b7bd1167518806998aed8518ce546ac4a2ad4674fa90000184e6d622d538389cbd0e395fde14d0fd3db17c4bf56a64de20c38c25eb4038a105aac10d7feaaf161475a93d06b1966294a222a9549a667fbfdd510ffa80325af9311881238a47b74d8b017198024a7f04a5805c82c3f097c17b05ca37fc482ec979150908f000000000000000000236d72b95fb9c887eb2591bbbb4aeb0f8613dfffdf7d7aec2000000000000000000000000000000000000000000000000bc84864066804802000073a813dac9a7744f1210d3d5aa6e87f364499248367d03383b3711640ebaec2ff469f20d60fc3ee12357944b15bb5dcc53ae577510f8275e6866d2b19a68e9d9527f398e01a7e8d36b6e132d8e93a3252e7fe56aa114e80ed516fca6d0e72b9a6a57962b53b129915486ad90b428912acbc22882fd1bc831e0a737c137c281372b7d9300482044010a150ff08e8878248dfcebd1815fa8592d9e0423325f88024102100800006e90b01185786e840c36e9681222b96899dcf0164c7bca4381017fb6e80009060840200380a0000f6200062842b817a3952b5db018113e387619010b5acb078e13175839610041f136d3800004a5040010000111200171a4114c40801a000fe4215a7305711c03e2ecb6ddc0a3eed95fed1c39a3c5d15a8291d087665c8ce8c6880eec821d9cda0943c69d0231247b00347ab5371095303ccf902f8b5e4012e33b45c207812e7ec74a09d47c7bfb079a21e925faf578bff1528ecb08607b0402fdc60ef36ac37f52cd2bc732f33a8d0e2a9aa2e10000262b58854526cd4dd1c99c157506902ca0db5801cf9f25fb13aec1ba413a98e8d06390f195eb4988bc0f79655b4bc3952740fcfa38b8d042fc717f9055995d890278d85a128bbf803426cb955de5bde724be92d7f59da4abb4efc34ff5a6703a89c542d74ebd896f22c45b60c90d2ca055a785e10295316f3e79c653081f25084ae1cb602f51255d9ae34836254bc120fe84759ab011b95b06dbbcbdb340000000000000000042c4100d0b28804104a00501000c01c753ab08fb5392358d16a62a9c8355203d0c4e132313db991eb62e5a0c1cdb3e724c84c5231765be5f72b43adf8cb3c6455a85fab8b5e15d4a3c4d3a0801200043021583a0ab190550a82a4241500a000ba3321d4f24d221229ea50000a031917b5726ef10ec93080106b163f869c13f63686019f024130aa6983fea000000975e00320d35b24024a8da4240b657514986400230c90bcc4e3fcbb8c706144139a4484809c00014910a74d05310800f95c802f77105f5d82e0ec1640721126b03341bc38355240ff5cd2514098704261fff099e1821e519b7b0a6be9088f5984473344c1bee72b9004ac5c18077152286dc390c2b0813ec238443f277b5f0052ae4981503f33d678c28b8b92f4b5494ff1a97483bc8f54d587d008af0d56c47e36215f6446174d8bd54cdc92a4be5129001500a925e73b4efbfe3cce2b82b9a707ba60a8e5ebe28ab0fdfc4e504a3836039aff0df839e9537cce6711eebea80097a884848612cae50635bea6e5813936d6c4fefea55121d8dee4abe4e2833c3865d3f807cfb28425e3384f8989ca552c8a9d3ce0b5d9990fb19acba60ccd82bc8e16a768facd803219a5a88339b9daf119abc08cd2ca055a785e10295316f3e79c653081f62d74d1eb8a02cf38ca614a98b79f4f0bc204696502ac1f42041042811c1181040004f77719058471847dbd4b0404280aaf7c90f47d330e8b5f806d3329128334800a9b73f048e072d5b8df75aacaa4cf3e83f147432afe16f71eb25aa4781a374b281569e17840a54c5bcf9e7194c207e625b74802f80b381177021a102cf38ca614a98b79f4f0bc204696502ac1f42811c114120018055711457d2c60f280cf03c4264bdba76045c95b7b13a5499c00a801b0c6c82ca88370b3b732daea6d8ebcff335a0dfaa45b93d4000d40852a0c290d6146330a205dd8dbefe216e87234aa3ce7e84327a0c35efd1d2efcf21182cc800000000000000000115a4023ce329852a62de7d3c2f0811a5940ab07cce2cb20d18a188000248fbbc01da9560fe59aaaaa8a092484e112fbc870985c79bd3e0e79f7901660dda1633c63e063ad6ff132799d134d077230beb621d2ec0be44674c828639b52376fb7641af69da6e2d8d79e48bc49d719e1a83f29d538e632af1e28c2382803d5613f437c77691858819f7683)) <<< 16000) + 0xd2e41a0425bf15b153267805a941e7b54727ea24afef1c580bf528551c16ba1d2d023d8178a37cddc0be79b9beb37c2a350bf37faaead820f8a917f1b6ed86fcd93001cda031c47963892f957ba57ce3516e84ede963d8eb0723b0fc93ee2b0260591e343c35e2f20f2798500103eb169b09ef386ef2dd995ae479a0a77765b2c47b10f11795e3a956dbaef1f7b0e5b0c61bd860666209d81d455a1060f2bc6d8cba4412894528442da2b94e9ea4a11df978425f91f460c3e29ca87116a4a522040020080a101e920c506a17208dd0c02cf082316b97290901d6b75e9600004848420100000e7213c0a00014e21406205709000416109f3984f06f4ad41b9c91bc4d3f16c55e36e6f80eb52af96e55a1fb7e24b87f15e7bf414307fab42aec421703fc44cd53df9da74a2fd2772bdaa3a3a5325f1f07d05169ddc1ee19a0f58475ecf22984c9627fb1e00caad9561e0d3da16fca80400a3c7e6f135dc56ba5d003559c6a12fbc36d52c1161b1f59572b102ea240007548fd9971155b3844352d935a02af1c53e4fefb07d4895c1afc0bbb102a3c7a332f5541ffc8f4d80a950ef282dd178d57704c5c8eede69a970a10dfa85116bf70003d53ad60d018ff506acd777d054372f1fe8a76f90c564ae69d5a32993b620ad6d5d4a54a8022836164f5d89507b10d394c5013a1209c0904d80826804000f8a42652607022d2ca055a785e10295316f3e79c653081f5d8dbefe216e87234aa3ce7e84327a0c35efd1d2efcf21182cc8000000000000000001171040334580e2f1bf02d0a24d0080070060050c9248971f55f045a87494173c8f120e8d3e630f5cdf30496ba20e674cc37c000a8013a9530b43ec7fcfa1c2853012cdfaf75c31d253b3201b32f524bf2a8789ad40010f884c28804c5600338c40086ecd0e01e0f1128f2be73e3e071d801ee01ec2462c756c72c36b40f316d62c1a0c47d970c1249c2ca5c798fb2ff278089abc772ac05009f39c6add8cef12106e5c1cbb095c8408003cc3fad22f25d0d052672de21f85a0055540450120dc64d82268c4dcd8d5cb5ccc57a6413c643ea748b6aaa84ee086d1ad8bdc80c856767ae9e628dced2dd61895d4f01c5faa1d25e81c5fc72abfd702b23e8b800013448016f5100aa29314dd4d24615ce01b4ff908bec7a4701d713bf721a9ff50c078000000000000000004364f31fd50d85630eb5ed148ce837cd48677e91b2ae6fa5a60000000000000000000000000000000000000000000000000184840c304600500100545400141014c285078ff7338d6adaf897bcc2d3370f98c4bbcbaa4d86a5d19c3d5174d2579008e60359d4ed14081f970504689c8907178d71150109b9b28705d3971e7f6786d2f22c1dd9c8ab8b2b1e9c6bee43a4732ad4c6c21744605ad774f2faaa046c542dbc9fe9c2f62e8780866048c8b39ba6d7efba66f0cdb5a38fb344cf6eba40ae2b69dd00072d20168024033848c043b223c1c71b22dc7b5801130501c2a7f7d3023c3295bbecd1cdda518a107ba38ca094fbf11c2ba2cb6bc4600b006f4b30c58201ba3f0f86db62009b0bf08a93a01c1143c7ed88f55500490b13faf72a764c1265313f2512003c70014dae6dd6a6b73b02405e494a7871f7269f76cec141ee1f56867c25f7e597e1269501a44716a768fac6c0190cd3475911ce39538c935e0905a9da3eb3600c86696a20ce6e76bc466af02362d74d1eb8a02cc71040c8006004010001ab4bdd2f9b12602c2a0ba94ab2f0bf2aa92a0029ba083ea343ce6a120d86893079ec9866edfce9bd282d6c31bdabce0d4a7b8e5f68d854d5d191554fda67fa6bae7d554d2e89aa10a1baead80b943602d8b5d347ae280b93c812c011de5baa69b1d2e968275b00c55ba2ee000ebea00000000000000000ff10403420514410118000000000bcc57fad12a92d8331b9d533c516c3d8d650caa998995af9b757791200d39f9b9bb2f32698d5598dc0eccc4028a966194970636ebacb109192ecb80ff18588afc26209084539b68e1004e58078404000949088021438f78c1ee838d1637e5a190203c8e49ba2099d8653f30000207ef70ca00129011004287184dbd7b471a06be6886204045ad06f8413b6c1bb783000e245e0ac600a607e0d9500098808802000028a40009dc84b848000f008478880b414000ed66c4920f9180f6d0d33a76fd55b4e67b274fe01dbd013a2000000000000000000000000000000000000000000000005c69008851040c90430460040010096eb42a9a0900ccf8260ab80b9975a85bd908c0a98d525af68a4ee58013e7ac2e97da25a4f23fc7c49a93fda67f7ff5848ae06518fce41b860d08505d7b6352f55ed8d4bcd30f5df7b11472077044d20111039230e30c20c18409a04897ad2bacba3549271615d1c6528ca296542e3822c07d70727fe89aa0a1c27f01fbb246035f32b8471978003a901843245d856c60c5c2e50f0081d319772389c10880200002ca78c1ca869580c2b8a3470b028610a5d856180a0b7e73563021018b36c860a591cae5a1014dde73ad1382110040258040002f242543612813c2870b4049c51398b3868a20499b82f2e1014d2a33089404be45a4ec6000ebc01ac2001322c3b609c20840201260a092010488080006788480a823c1405a020006eb211c520881d036868234240d80a000b362002db04231161165b03429f8d22fe5bbea52fe1cc9dd528bc27ee81025b53217fe9b4def592a613930c818c1f91d19e3762be002d40000000000000000084869086aebfab0133ab1761c6a620)) <<< 16000) + 0x60d1c561199020a10c00a00800aaa960bffa4a626a17f5e9882f1a36fb5bf71d82d3c09a45b917bce74f409887578642ab7a240a1680c3089f7856afa04794ea5aa65da6c267d4d50cf9dfd9f7daa80acf28d7827034ff74c7f2bb90bbc7d01538fb20e3838e3da4685e509b246687c64b357faa2206542245491e3fed081e769c689419289e990438659a80452820e31fd4a384010e502c202800284a6044010bf8cf1a74e24ef38e000000005ac5186dc112f1c6769e2a54e54885493ba5fdcac0153f71bf572026201631500000000000000000000000000000000000000000000000000000d0458a40a1045025003013987a56a2b5ba64750964a62798abfa0c113354e4f2ef2858c1512ec2909fb6c6533695860000087b27c27fafc6767513678ad04e315e8729f89560e5f4da955257f04f016ee280062d23422de38ced3c54a9ca910a92774bfb95802a7ee37eae404c402c62a00000000000000000000000000000000000000000000000000001a20c47e0951839bd3bd31e2bd4d46e059ba0989b2326daf9434000000000000000000000000000000000000000000000000006323061c30c32c2300040f4ea0bc8400013b121080d706022aae0ff245041743e321c3014cf08260c38030fba440c203719e2f10c019dbf1bf40800213cac4940009c80900201140a0001962112120005ab200155e404cd61104b087218430ef2798fea86c2b1875af68a46741be6a433bf48d95737d2d300000000000000000000000000000000000000000000000000c378c6023b1d941508c8173cae44d5f6c159d043445861c0d116186e1120e20809000800200a73a037d2328ddbdd040d5fa63d753ca00411b957b3a7b71a6d1c5b55a6e1faf6b229b7780e54030225d9fe25564052c390f512d5dcf229e3fb02a0bbf23098e790a9cc25f510b76b2a624a86d0850181680f0d1402c2a8e096470c09ca0458c03c785076370908c449050800200e80393c812c011de5baa69b1d2e968275b00c55ba2ee000ebea00000000000000000fdd55dfaa59c0222189d6e41520c33822c12811412402001183e194cefeb5481154bea96bb1e5879218afc740da12fa58d1fafa665b5f80ef6a75fcd99daefa67fc102e27718bc2828001a29a1b89174e026dd251e735a72f978262b9bf03b787066865313fbc159820e771d57859e3760b7f1c006418783fa6b6fc6edc652fa7f712c9864e193c1e7e065155f38ab25a9d03161e72929633f2b1119a4a6341c10e9aaa50ca68a637eb7a0cf69b0c34bb79e86d25d20d2d1ef5e946f21cd85affb941d2812755e7e9a20c9154b9800b98858cf9d1a9ccfeb3516fc90faef7649895b26a4e690973856be63996858628f4af46d67f22c27d320e1b9d056132a1b1615bdd4eb6044c40f571d6c86cbf97b6e849ac0018d8c45092100e80393c812c011de5baa69b1d2e968275b00c55ba2ee000ebea00000000000000000fdd55dfaa59c0222189d6e41522c32831430c3382240200180130180200d04d05038828000868842088002348f10016e34b6143420374aa9a10e9331830b05c6ad47d46817a499774001e848010928a1080401d007c083d7de7bcb0579e0d4da6003af74b7524038aa177b900420e94134449450840200e20a0001213e4805b8d2d8612cebb1a7e208ccdea702381314150e21c02a4277778007a12004ca1842010f24050ccd9a1e207d061b1d2c4074e58cf62096b374cb883000b5af1a18b28611804000044883a00ec332339c2194183eeeb5dc50ddbd90fa460053b51bf12402cc592b4900458b2be64498308402009a0a071050000af9084110001fd100069321063b0721183706c20827e1f6d1e8135c0b9c87fb1bb3aea2bf54c4d13cf1ad2d3555206d50aead227542d40f10ddd29eebd607a9a4bcdb911f72576d4bae29e84dc108aabe19b6ee17c3d3d160c977b9460300896267187ce1d8ed00c862cd6d238339d4f29a65242760aca21712df56bfcd78b16c97642f7261e4bc4fc1544b7d94b3f23754e61809cb3af564c2cda83b57408cf47dd86bc40013fc106e213f25c4953ddbf76fc36feb750317e2501bf1eb39806351dee15f44c4c6aaa8772368a688527a8654e207022946ed1f77105bc0fb32b9e1a1843839613fa6ae9359b062385cafc96deb851119914f1fcd86b0bda3ff326386b49b57af2559712693f602a7d3d2d8a18ea4833c208472164628d9d953ef6ebc5936da102324fbd647a4d5e020a338587866621e68f70869e7696fd4129980ca9b27957cc517a7aefa4fda1035755b69ddbf4c3a4c1224b9d2ed189c769a19a0fcf06ce1ccd2e2b40464065c98873afa9a9a410296e55af3ebe00830884190a47ee29c710ea75b7092c6966b20392c0d4b101d832137374464c82340cba91a2ae4dba946d12027195b0d7b3e309aa03b2675d9539a0adaf322a990a855c5886a17af9246026789d5d003570330c39f08457aaeacab5b698bc0e95fb09febca380e0714ae8c88066211857c8c7a2097b5700003041f0f4c9db301a00271755f300481d2a3e11840f80428bbcb23551002ee4048991020f804200802008000022200016a40005d8f113ab664c4d06d1bdce6c1078700be40900171cdd047028886747c2508200080408282001400025441fc440fc2307d0983e04c09807830185e729dbf087180c4ccfabb0cc30d7e0fc877f736204b98e7eec7ab620092dc505efcec11008001cb0b47ae78008991a29903000c56520240417530384188202c4920f9180f6d0d33a76fd55b4e67b27)) <<< 16000) + 0x4fe01dbd013a2000000000000000000000000000000000000000000000005c12491c72454842434424403c030080200d90976282ee9110885fbb324120f1908344210b5e79010006c7d00c94107c0200001f64000c60d07cb918e44c0000223aa11020f80401ec040f4020000a330400f9c005d430ce5c7ee3141024c3cadad4060409e5bf931a0089a18ff8ae8800e8a4426c1e0035fa7efd83470826014589241f2301eda1a674edfaab69ccf64e9fc03b7a0274400000000000000000000000000000000000000000000000b8289a49238e48a90888488078060100401b13479377338e3b90070184845231988e90504667ee42000adadb392820f80400003ec80018c1a2ae4abb82507a060b7c980006e70884c10780100ea0207a01000064900059d20e80ba1c9883353051412684bf8a0c4cdad8a4c0801e764a0a0b09eccc5a5002000850e378fff6414578df95e40e1997d75b10b083419d0045051b4cf7d138011ef752f1600300b148e700210080000ae1a1c827c62b851513ac73c0c08015cce88a0afb3c83b64002000850e2922406b145a0b653990e18cc93abfcb0828323a7250520876ede38008105826960058a3816e700210080000ae100024820e612072090268481c424000a5641e4560f01bb12483e4603db434ce9dbf556d399ec9d3f8076f404e8800000000000000000000000000000000000000000000001705030820618d08809000e00600c020080370cc0d14818e211f086b68873dc7a779610075fa428832656f7715041e00400007998020080201dc0400006e41d817624907c8c07b68699d3b7eaada733d93a7f00ede809d1000000000000000000000000000000000000000000000002e0a461248e3a211c0a201e00e0180401006f1e507b7511029057cfd2484b3ab74ce9050cefc2a490107c02000019c64700d280a1ceca46027cd58e39992480eaf6259b60e3ec484f955aa221003856e8ca406082a5a594432a200853141060f1e0002729064000e0074a041ee949b64821601438ec067405881488b554924251a2ec5e48291bedfd618238c73ae494107c0200001f24000ce0c0a2f37526e28acdb926c8f0eba0d3710c185a94fa7090207c0200ea0a0000e72000e8041d007921c3e5355bec1eb921c3e5355bec1ec1e79455fd1f3db421e79455fd1f3db4420620806eaaefd52ce01110c4eb720a99849231818611208a0e9d6b9df6f1131264511c2a771b7a9051689d6aeef8e344c603153626a26829d3c12be756190e221b719e8ed66c1178535c2420ee214448c09c8f7ff104806c68e80a10363e5540a042094620c4831ded670b280103c7b9504e104201000016020e61a0720d03884800142c8380880741400206e400863c8379081b81400684040121e08368681b014009c0240169648358a80181e483514c1a466008028152941ca271425a5a812685048635982b1c083bc2ffc0400110307570000094a088021440275299e90efec84fb3d2b866b871286d5b2c59af4920a15f0c1328e0c7c08a49d959ea87208f1f8feeb9f88c3a85048c7bde757fe20412fd3cbabf69696a773f6ddadb926610046c96873213bdd915f3ebee92fe5dc65fff4227167e70836d766c1a2a2f6bcec2b57a5a01eebefd5f9ec20d9400060b142116e550c72b648677b6ec525e56c079082c49100c602068010002471067298330cc194260c813e1061921dfc28496832b330808ec0688ba18238503854040881e1a0a43813c46d3a0880033a471c6000804e5844010e17ba60841050a1e4b651e202a99b6f7c0c113c472dc040985c031ac3003bb7688a1006b4e6c17000009ca0840200c61200018420c42a06111030028000d5882fa0c178660ba3205c1182d80c168040b203c90e1f29aadf60f5c90e1f29aadf60f60f3ca2afe8f9eda10f3ca2afe8f9eda210049145109087006002014003cf8409108915079dbdc79d13ba139311f3045b9b0008e65c63bf868628452f3ce031dce496336297b18f294008e1aa9e8996e841af97a9271c26acafef7e6c8940d47bf0e31d32f19c9d3010466b06ef76bd2ca94e435897b7062207f4cf58afb72fb06218fc3c0558109ab64bc0000000000000000f5923109bbb8ad183b163e7f0faf52648f9b87bd4c1ac6000000000000000000000000000000000000000000000593ce329852a62de7d3c2f0811a5940ab07ccc148045047006000000040b25f1d625ad74d57781f6209f3f71dec65af21cd10d8e93b7c9fffc412d3ea5b46d61de4a32cfd08718035b1b49eddbdd9a9da2ec10899a8bee72ba7e1e8b95794b913c3a236596690a00b7d1d128a8c729094d9090913b74e082b43ef055f55f699ad4b605ba4bce2304688ea2092b8ecd7a38d57a1217b6413dde46ce80340991c8309364245fdd6d49337e4378e07c9e020c18c038c122c354e0bdcbfe66e87b559d3c99c5b6ee9600012e03ce9ca88be925895a54a936601d37011c5ed0005a00783b70d6e26d2e1f4aba34a28353c85942410a191814da44503355e8c4344045a09c5d18002d053a24024102100800e02f462d64c6429430330e37b060c45a60bb0503623af56614086c64be2004a204201004e0900008f90580df8c0864c840ca183ec9f477040c04fb30490230c2300800e00fc61cb5c4700d185d3404be2860138352282070302d4163401140ff2bc80013b9e8b90098408802000027a4134540380a00024b3a2472e3c13050c4279ffc95f8cb955228e7873d429f04c857e44aa860dae996cd489554b10527b75f22cac1e)) <<< 16000) + 0x1008e307b0e6d69184fe06cdc2cfe2120525f2ff2937c4cf747396780b205507b0b460e3eac16c13e321fe94bd2474f04d7824b27e1cbe7325f3176b40f320c02ec47885a409243acd91750da3ea883d3abc6731bda784fb8a97f29c73e44ec896990003ec104ff1cca2dea23536c0306d61dd319426ca06cdb975f3391557089b108c6f09a03a58bf21fe7b12c480ff831d957bd97db8da2f5429633d108c8d12f15e23c842227880006a53c562f58435f37262f233bbc9616ef18313ef52013cdbc56773cec036f2ea1e3802835942b581a8f3a882f9edfd5853936af246ec5a740d6d0ed4616ee2f98baf840386e9561643a786329686b1dc6aa9d7cb98854ea7ed92d174bbadd0dd7ef8838b00001d1cd137d8e1d3d116253e1e9cd3f2a4846372b3e551de56cbbb0c974052611dbe8276749c86dc44be21d301f8b4b74ebcd832dbe4aba33b11d5654324fb37400028f10570900085a90453102006800541881f9cc0f847c16351de3e04f8ad2a98dbe2c9fa8ede71f77192f83f8b00e5888bcc46f2d04c23f40e05440ffff9ad6066d5db37062fe6c51dac2615ea5c3c9517d21bd98cc88c569fb4600033570d01e8f626f8840d5a26db944625dd4b9893f097d2b43848a9183e2d1f8a400801b750cddaaeff61fe57de062e707b75c544bf15e3a407762b52efef34ac50e4aa5acd00862813e06d751f70b00d514fba03015bcb8b07020270443c344f5022d093a802b06c154060a803c0c1afb7de238756db673b081ee012fa4020ad5ed34b8300ccd7235804a1842010e3c7e3873c0a05bf1b8c06700e65a98410230c2100800005690531182902c1441724c1dad9610419be9038e700333dcc709820f802200802008000022304aca27a381a00b86d7dbc7003280ea760016960d57409020840200001b041403607003b53b47d6406d9411560016e360033be0ee444137d4a76e1ed01760a3397603b94c388cc3130c354870a882000000000000000000000000000000000000000000000000bcd20162080760e9b13e2c205a9040820811e0cc2e47bc5c2b42c13f14e69f1f735f854cf85d22f3f4e9edb4468123458930b90295abe804a31c2c330ee7bcfbc87fe76793a4104076f245d74619afe050a8a718f902047488c4a8125286d822ddb68411000352b7004d00d345110c230820008000054904f090270480017e88268a800209cd0931da8b9960c8955e702816b337fae046183e01001c01e1a6d1e2268584016e44d11425c19a56d16099173e628a04127e0fda681b54f38490098408402000026c4130440681204b01000126104a0d71c8273817141dd43f934280c6ed1da611840f80420896ec075c0b102d3927b1482d946e1488d000dafc9b32404220084010040100000444000460f1ccd8497b01875c635c16300062ad3d21304210044010040100000444124040001f441204606813a2d23dd53ce144020810b9408233a9beb50a0017d6c2c99200693e87d11400f7fe962480130c1180400005188238c811836070130004b73411e90f7e2d4554773073fb404e489b47a4654d7e9c793a26e4886b60d9136bc50042e656b5f53c8afcc04bd91aeba0dfcee646955935a1f258a8331769a1d8d800012f9252d13f0a257f83c7e986930ef2e3f7b4d7ba05cfcfedbd8ac1e009ba6451d4a2c196c7201f1461f0f111df9b9f4c26842457b27e93c258ca22cf635c0002031045310200680057a88170a80b41400379041112608643f38ca614a98b79f4f0bc204696502ac1f12441c210220114108130028001009b81b618c0ee51dc5a8b65b01415be07b6aba24f060b61e59201dc38e1a50e2040df182035237527c0a1b285c712460a10691342184215de4da40009880840200840b9209fd8e11050e3f39036820326e8b50b0a1bbed29c44609e4545b845016be4cd1b1c0177a1778200013921080400005b88209281002400060e40fcc607c1bb18606caafa2c50298c7b18d0cda0511ba183699275250608274fe150081c6e4328ed981088021e7194c295316f3e9e178408d2ca05583e269458c58a686306304102680500e4100401a00023040f41763161efacfcd0dbc93c9e03077286b56418245b69f0a8a0c58a4890425082100858c326b3a6451a1994c0bc6d228607b1259ee121085b457e083040764e66120a0ce3ad438c0680190e9ca649400828d3eb8694808260140000dc10002d920781be12360768b6244127f398e0b05ce74b4021013d09b19c030457e36913240150e48d541006b66b21e402714220080000b6903b1101d04807025c5a6daf7ec45562ea60e1d9f581734d8d498300c1ed5d78a58da185559fa51193ade19a098825b2b94511ba202f7b9d0fdbf0b55a203e58f056e918ea618035fc3e24178b649604b3d4021d034247391fcc73470c084b07030c2bca4b37fc70498e151f01013825e3bcc941088020000212404c260700b93c812c011de5baa69b1d2e968275b00c55ba2ee000ebea00000000000000000fc4e2491c308c04b0490430510030132100200df280e8d697e28705c9537588102d5d2583103ded8b7a10c093b119e752827185703e07041f6174b527042200879c6530a54c5bcfa785e10234b281560f89e61e51020819811410e0a401a039040100680008c1000298207212000464303196b7c218609aa1246fc282bdec4a990c0d7d4af7992021080400e007238c0e86da070cddf1fe14305c83592212c199c32947920da26b7f644000e50dc0a4c0842010b12483e4603db434ce9dbf556d399ec9d3f80)) <<< 16000) + 0x76f404e880000000000000000000000000000000000000000000000170f38ca614a98b79f4f0bc204696502ac1f24471c31822c12413002c0840651f5187aac96c6fe285e31905ee4eb72e0669792238474a572eca262882826f5d18b79731ac19dc6d8cd97d2c407b1be714ec784899985c968295f18cd7dc142cf1a0008ee400170c81b8480d814000de840d45606823e2ce5ae913ca04566dc932382787d2df808081ef25a60120610804007007030dcefeff0814e2193e5258433fc37c02022740728f940cd0eb59688075987523c04c1842010b12483e4603db434ce9dbf556d399ec9d3f8076f404e880000000000000000000000000000000000000000000000170f38ca614a98b79f4f0bc204696502ac1f23484062052c22013402c08da25cc8058faa5b24abd168902a68519b14ce185c6229ebf33a85de37698c08a1e08dff5c42b9bedeeb4664681123d611eacd33d45af158a53c7ff827b3f7d02e1a1479d00047c2000b9840cc340640a0310100038a90016a120601391167921b886045291fb8b1029b1350088e0933ed29ec4056fed540a48140874f5e1807abaf34c8200013961080400005c88179480b83405a02001fec20587a02b310150a80a414004abe40172f8dfc678d3a712779c7000000002d628c36e0889a6d56bc4f40b22462450811c0180140554048f0519c62495584aacd6c19eb8f4a91f1823c3144633b9611959247374b5b48dca8fd64f792330b4ff3183b8af644a03e1963f399b47cf09ea4f96c0101232d52b793db7be3a4fba6a513403082988858080f166edfeb1199cfc04003df9cad49265a4e65957cd8c7541c02b1d039115df158af26450cda5d0600514d45186568a6488980c7b3641040638fcef7e84031a637269a32cb007fdda0899ecf8e67a80af9cb149829b9398b83a8b9cf8f418b1b44c16a768fad0f45b13e1a88339b9996213c5a08e4f204b0047796ea9a6c74ba5a09d6c03156e8bb8003afa800000000000000003f269b55af13d02cca14604104b00400001d0e1f615498457fbbb69058dc321726f41dd8c9c2c5837918b0ece5fe000aafa35e9a179384578a6b6b51a7e2e12e03bc2dd1060f9d5bcc41c463dd226cfa6a852c104335a8b080433cb86cf1c01b6f6204c901088021000010044123d0a8b9a3020690ce858f0041275e9428007b3d02d64002200800006c10001152050130270981300f89a0736490450806ed34df0c215acf3c5880046719eca240422008400004011650c6f802a2422b9c7cae801ab60c0fcb0052cb5308800332c96b94007c0200001f040004d481284c0902740c01f24c5800bc7e7797dfbd6d24039ed5734210ed80541c60c38e2ef0cd3fdc03cfe29e5c964371cd745061d1e927b1e479d948db643d101290d69b55e4a9afac4756de251a07781261c13be8fc9863ad88047485f44de11fe1f3223190152f44db94c0a3460eae84da9e06378215d87e45337c513db7552ea60fd0f5b8b2fc3397f78cc99df6316b9fe9a5d429c143b2e270aa0b647c9c5ffcbc6cd34b757744a944f104a4a5a2891a535b725025ae2624cf038de6e2b14002dcc5850c015e3bbf012840f80400003f080e0080019bc80046f9c251f87039823a6094f2f5f98288c11800116fadea9fd1ce13f9c09e3c9ac9038e80520fe6dcf537ea3b6f2ca5a09b458839c874b05f7384585f3c75d79470000e98b483eeb73110b2bdc7dab3553c3009fc5731977d216bc8834f18a095000ca7fbd1859347d2e2cf8a29901e56a67e091e6803521764da0eb3d78ba9f93bc36d0f97dc25ca9bf9a993aff2ef52772642aafb2691f2f4b46e89b9b45eb59cdf42e92b03a309cd31115f9b46cc514681c5eef49e993ec0c63c4d30000bae408c240022964088840424200158520033a24080d403e6a01e2900e8e8070660362a01a1100c84806014003a74401f9288044409c11ce813e0fca0c08eeeda734a10a0ef719f00d978809f1a8e9329006028bf1bea505a8000f5e034bc00d03a2ce47f09dcedd212fec02b44c96379cd46a605805096d4c85ffa6d37bd64a984e4c3206307e474678dd8af800b5000000000000000002108c20e18c10a10208a00802a0093eedd3940c6d719a13772086f2f10e7e35b62846d966afe4061e2923333ab4926ba2b8c67289f202f150b069de32470e6b3d741fdc60c26341fd920208887e33027060047cb3afa4850012e0d77ba01001269d786a95004a3921400a247185c03560922cc7266887c5080f75d37e040002da2eced1c007a4065ea04a104a010a20044097ab658c16a768fac286b030aa7c2923000b71b030208f4143ec5c08200b71b01614017d0f4c8313821280430cb552553f430b0b456df4b2c9237b6a352307310c50aab2c785d6d47eb203078fbba3e1c0038795f889c00900218485a9da3eb164924dbbd40861a75b5a3799604652ac5f7940000b71b035400900100002204000a7080021890170d80b06c054360281ba14152a0fbd0a245fe470379638814f1048a30651c195d1c3e43e4700efe66ffbb500321450a808165ab6533a451650385707bd96405abccbae14406661ba4c96312da5b9a71434e4303b510c001c3cafc38ace2048010b202c4bb2748a2093a15ba04208b7ff606c4b0001031f810a023161e5fbc900005b8d81802c204800800014820005b8404c1400089640487400146a4002fc4808868003b788081a803cd401c6200d2d00614802c94014320091100406801c2400c02005010008fe900465001968008440020200001008b961)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 33 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case14" = "QuadHeightCover18Case14" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 33 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case14 private def zz2399:"s095f"="s095f":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case15 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l15 l17 l22 l23 l25 l27 l29 l30 l31 l33 l34 l35 l36 l37 l38 l4 l41 l42 l43 l46 l51 l55 l57 l6 l60 l61 l62 l63 l64 l8 l9) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x3e14c82cf, -0x48de0a050, -0x6d5880c14,0x5a313812], ![-0x48de0a050, -0xbc7791798,0xc7cfab62,0x473c0dcb4], ![-0x6d5880c14,0xc7cfab62, -0x1da3807115,0x490bd0c56], ![0x5a313812,0x473c0dcb4,0x490bd0c56, -0x247a76b28]] noncomputable def hinges:Hinges:=[(-0xedf00aa,l6),(0x1cdab22fc,l4),(-0x10b3535b,l9),(-0x1edf64496,l8),(0x2e5fa62b,l11),(0x82f17d1c,l10),(0x4acf73ac2,l14),(-0xd06b2ebc,l17),(0x1ab46c910,l15),(0xa73dfa46,l23),(0x2e4f166e4,l22),(-0x247a76b28,l27),(0x247a76b28,l29),(-0x4acf73ac2,l25),(0x48a183fc,l31),(0x37614d88,l30),(0x247a76b28,l33),(-0x82f17d1c,l38),(-0x247a76b28,l35),(0x1edf64496,l36),(0x247a76b28,l37),(-0x1cdab22fc,l34),(-0x37614d88,l43),(-0x2e4f166e4,l42),(-0x1ab46c910,l41),(0x362d6716,l46),(0x247a76b28,l51),(-0x2e5fa62b,l55),(-0x48a183fc,l57),(0x10b3535b,l61),(0xedf00aa,l60),(-0xa73dfa46,l63),(0xd06b2ebc,l62),(-0x362d6716,l64)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x247a76b28,l27),(0x247a76b28,l29),(0x247a76b28,l33),(-0x247a76b28,l35),(0x247a76b28,l37),(0x247a76b28,l51),(0x4acf73ac2,l14),(-0x4acf73ac2,l25),(0x2e4f166e4,l22),(-0x2e4f166e4,l42),(-0x1edf64496,l8),(0x1edf64496,l36),(0xa73dfa46,l23),(-0xa73dfa46,l63),(-0xd06b2ebc,l17),(0xd06b2ebc,l62),(0x82f17d1c,l10),(-0x82f17d1c,l38),(0x1cdab22fc,l4),(-0x1cdab22fc,l34),(0x48a183fc,l31),(-0x48a183fc,l57),(0x1ab46c910,l15),(-0x1ab46c910,l41),(0x2e5fa62b,l11),(-0x2e5fa62b,l55),(0x37614d88,l30),(-0x37614d88,l43),(0x362d6716,l46),(-0x362d6716,l64),(-0x10b3535b,l9),(0x10b3535b,l61),(-0xedf00aa,l6),(0xedf00aa,l60)] def dynamicTables : DynamicPackedCheck.Tables := ⟨71, #[0x250c81a18060001a04d0c40a84010000000084320286018000000108640d0c030000000250e80a18060000000004870330040000000e4520486018000001c4510130c040000003a8aa046180800000005221034300c000000000aa01440180000000002a0148020000000000520710040000000000a4062008000001062081526020000020622809c8c050000000000220390040000000000d80520080000000001a8124010000000001a240cc0100000003109012980600000000000d0320040000000a44206c601800000000a05014c0200000001504811180600010c28044053401000000000004812401000000000a0502cc0200000001304811180600000000000503200400000000000e0640080000000a83004cc030000001582e04318080000002504408630100000000118880a6010000000000440308030000000000a80610060000000004500a200c0000000001100a40100000000002103880200000000004203100400010c350840c540100000000842404a60180000000000240c8010000000000078190020000000000280d200800000008c2a01460180000000130a014c0200009a1182401920080001582405809d4010000000921080646020000520a81200f50040014c144130096a00a000000004c240630080a10520210019a80301440a1044006350060000000000260290040001502705006d40100002e0500e00ba80200000000009802480300000000001c02900400000000442c06300800000000038012401800000000012014802,0x30e2b20a4061b200c00000843216016400c0e10c18a100542803000000010864058c030000000000120310040001f03c08407840100001e0420d01388020000740d02101e10040000781082801e20080000000220a00c300c0003b0c40c80d6802000000000005c0c8010000000000c8069006000000002814093008000000001b0a06600800000002e0b02cc02000000004c1e05980400000000341c0930080000014411814e60200000000002502c80200000000005a0590040000104660a036400c0000218741601e801800002423080464c050000000491900e98060000007208c03a30100000000190b00e6010000002d1f1202d00200000000220e04980400000000c41c0730080000018209814c6020000033108280d10030000066210d01920060000000000190320040000000004201a40180000000290b01cc020000005906605398080000000000a40b2008000000000016064008000051248f009900300000000003a039004000090484c07a4301812390c8290186c8030000000249040d8c030000000290901b9806000000000a8d033004000000000ba01440180000000002e01480200000000005a0710040000000000b40620080000000178701c60100000000000e034802000000041188121806000000b104c0a6301000000000f0481e601000000001109028c0200000000000181900200000000643c0730080000000000c80e401000000204610130c0400000000004a0710040000000000940620080000000c45206c60180000012c3701a0c04,0x2c0a07980400000718a6035930140000000158701c6010000031110280dd0030000e22886404ca008000000006c280e30080000000050281a60100000000000502480200000000120e05180400000000a81405300800000000e8281460100000000000440c801000000238760361808000000410d406c301000000010c56058601800000001915028c02000104398c4065a00800000000360013201000000017c32026601800002e0882c03d003000000004a420518040000000000b4092008000000015898146010000000000640308030000000000e806100600000000381c0d300800000000012812401000000000b07014c02000000398820549808000007188a0272301400000000b0380a60169230a86240b3490070001a661022065a0081124d24c18096340180000000001900a401000000000031024802c3659804481e78a00e0000000000fc062008204984963012c680300000000000b01480200000000423a0518040000000000a409200800000000f0280a601000000018868094c030000000000320310040000000000640e20080000000006a01440180000000001a0148020018c118158079200a000000000014062008000000c220809c6020000730881100ed00400000000441605980400000000885c0b30080000000011160660080000000001902c8020000003904605398080000000000840b200800000000f0980a60101c51981450298500600000000361c0298040001c8631480cb40100000000168e80e601000018115301e90c06,0x5084607418080000000054340a30080000010230809c6020000000208e40d8c0300000005f1900e180600000000b4680e300800036082138190802000002863f009f8c050000086310d01920060000000034180d3008000001a419814e602000000351f0a02d002000000004c1a07980400000000001f0320040000000005201a401800000003e1201cc0200000058846074180800000000e41c073008000000007028126010000000002a0c0cc010000006104605398080000000000d40b20080000000068381a601000000000906034c0200000000000e81900200000000d81c0b300800014992080f48603000000244710138c0400016c388c205ca00923073a31d01442401c000012114402326028000000248a8074c030000000391880b18060000007110c08930100000000178901c6010000000000120348020000000290501b98060000000034240a300800000019c7403860180000000311e038c020000000000620310040000000000c40e2008000000000ca01440180000003b94402cc030000000752900998060000000002830330040000450e8420668018000003d1915039002000000590460539808000000d208c0a730100000000001c816401000005a150840cd00300000000740e05980400000000e89c0b300800000128c8681c8010000000003a4c0cc0100005024a603d2180c0000b4ca0407a430180000001449206c601800000002f1a024c0200000040886044980800000000a85c0930080000000c43406e6018000000188280dcc03,0x1223088605da0080002487618807940101208c0881805c2803024518510f01685006000000288660449808000000008c380e300800000000006812401000a30ec10c0a2d00500000000221e02980400000000003c0520080000009c08802c60200000250982402d0030000000000f0049006000194330840c540100000000642404a60180000000000540c8010000003288a03718080000000004d00a200c0000000001300a401000f208a0b406310050000001a04a01c9808000000001a001320100000000cc4a014601800000001b12014c0200000000002c02900400000069104032301000000000b0900e601000000001611014c020000000036220318040000005212001330100000000b04e02660180000000001b01480200000002c1080998060000000002c009200c0000000006c0124018000001a8110050c040000000340480518060000000640b01c300c0000000d02201c601800000001a09018c020000000320480618060000068041002630140000000dc2201660180000000190901cc020000000411c81a1806000000000989033004000000c6210178602000001862380be0c050000000210d01298060000007114404e3010000000ea2a80dc60200000001c8c40d8c0300000000322c0298040000000622d022300c000308b00980a680200000000001502480200000000322c0598040000000622b022300c0000000d05a02660180000019c5b0218c04000000308aa043180800000009241034300c0000001248202860180000000190b01cc02,0x349306289029ad00600000000000e0290040e0cc483240f7e40181c3184821814528030014320438c0a2d005000102388a606e2008000000003c1c0530080000208e44406c801800000001e07014c02000000005c1202980400000cc461100c400c1e49c3184814d680300000003f86404cc03000006c1105807a0060060ca1123028b40140000000001f00a40100000000003d02480200000000762e0518040050891841024a4014000000c228809c6020000001945501b8c0400000003315816180600000000ac74053008000000016848146010000000000330188020000003a8ca037180800000007621037300c0000000110480a601000c712419c0a4d005001822203080b9a00a0002047118c0cb40100000190842406e801800000000a07014c02000000004e0c0718040000000000180d2008000000e230809c60200009120473032d004], #[]⟩ def dynamicCode : Nat := (((((((((((((((((((((((((((((((((((((0xf300a6bc0b730c3b99bce10a1860b90d57104cbf2d0dc8a091c1151ed0414cf70086890019ff954c09c208802143103434fc0822be0e3d714153a3309e9e094bb6bd3040c1aaa0d4840089d52a404c104001000012d20420bc30c420072662860f53b3434441233e9a229e2822bee1d79c8c041f944fe8e2c107c40ba1bce001c54b080824001e8fd011ca4021300a290e68e8cfdb2d49a976a05467832dcce440b22861042821423012c128108030080200d00011a20a0120aa0900018a902e1181686c11c360b21b80400802059017014380fb743c582281f5c613336295e4025415bb28f09b8c9fc60800266b8a898107802113c0de9954e330f3ca607ef5b4e871e2400f6f2795014016b5e5c82010405b48f82c6520000b2d05e00100052ee4315f904000d36c53c5f0fa4021601200007acf8ae16c07d4611d775902a010995bdca3c2298a646a08309d221f820008534fa4c003e0108065d28a720c5e240000000000000001071e6dfc1eb0904286b89b71aca432202009e78e3a029e09c0a4020008060000401a00031e43c8140005c4400188c8b180fc20190e83784c081a040b6553413389d789a0904085fb8acf041aa228b1ae09000b15a01ef0402b3893e6b800060ee158040074e7783240a814260100000f1902101c000040102b20388dddd13b6a02ce7a4ac28822e73aa6a00895b2130080163496d4a003c0108a2290f467c9041e1cfdfb110472b3bbeee4460d8ea834678a005b8d590a14597a1d600618112a88024c0005b8d80088049819ffa6900230080000e490002d83c79c2236c43440723734c2c10d31a50714102e991e14800034dd8e9400800202c20389a1b17ee0abdc6900ddd311bf8488c2af95eccd3c80db5a8faaaf74904039cfac46a0604304adb5f2dc982111c626bf4e682060a06a4f333882000b00f100cba514e418bc4800000000000000020e3cdbf83d6120850d7136e3594864404012084052853442834824c0440c0000803400063c8001cc90004c530101c60ec10c202006cb7d9b0708095ae59d4082bea4797b68104500ecbd5b28002d63352c83002d9e166d00402d916863b40004520cbe774272184c0280001ed3000010040b100e23487981f680c6365469a02e27eb94688283d6a42820054a5be72800f0042288408b9dfc820dbafa62c90460d1fb44688c26eccb7094205e7bd83e186044aa200a60002dc6c008803cfb0a40a00002dc6ac9900220040000df90002ce3c7a8e9d3c0d12166cfef102a4995f3cb04cf0475a480295d203a5001e0080b080e2687a09f0b446908030d678a02bd5c80b158780a8b0a195e16154302140aa5b) <<< 16000) + 0x498225b30daa7001f008411c81a7f8602231656ea502a40c1006651ce2028b14ccb05050a1142a4cfc142138841024c90405b30462a26001b16b38a88801c734d0f1e2400980500003cc4000d408002391e3cd48661230a28bf601f5b2020c52539db1c18a8da891a180803c14c268e0de65699fa020f42cb19c71400d8dadd420000b56c5155a1590c240140000ec90009a120a02a0aa110009fc116005000e6298111fc52fa8d041683aa041059ace8cf080310c1c9381008954b3e825082000801684c164170000100405300e865832e82460612c52df4f086c035441a05b65f82124041f0080000679b0a3adc7b28416fc8dd243817c036910280f6c01b3824081f008000068904709000111115f150af0ac574542b80a02f050001e8915b1988786c050360300b04c01f841a01867f88e77a435d219580bcd321011800000001b55443b6be952219c0b239f840450c58850820818460050048060100401a2aa0b1540581102c56817000010040ac80e08d63dba500d140024556c4440f000ea0d010098f2a4e04000c2fccb65002200841034702afd240800d6944533c80016e35642880a0f146572089e30f94484440b0c517aa4c0002dc6c004400e49314aaa000900200003444000b10faa028ce72c96d65633d3efced5d01c0391f7450c6a99877a540000000000000000022107099bf9a78162945560e9ae05de9d05296a01862b57a7414a6a80618ac842848e38e68258210114def9bcb4fcd0f6435a19213ecfab955463be153eda36e35c06f88e16f654b3dea9ef63a82e9c85d3ad2d8cfe546c40cd93833f6d2e7719bbfc7aa09f26ed8065d28a720c5e240000000000000001071e6dfc1eb0904286b89b71aca432202009e39238e38a21c0a0008051dd24bf8c485cc269df078cc6da97c7aa656daf5bfa284141e135bae97a889b0483b95c12647ea0005364001c04f1c23511ba1b1a287124ffdd2305001c9c2bd038a467c8d6e205167b4ff74cf1c085b679ebc028000be13b922080090a2968950a4061380a00007048ab00800308c8a986ec4096f7d60e20998fdc2e70b041ae389d39a007558697b30007e1237545005aecd0c209001238b19024e10460101540581102c560162ae0b82001845aa21047749b571450a710dc489a220a9ba2336180149dfe0f3282110042081551c029e9748100604f30d2089e4000b2d011d40411167f7d2bd482628637314a356a082010444741a5220062f606d2820001dcd650005f41c10b80b00003e26470635f5a4f3c3c71fd918c377f67e4841be98f4a6e0b900cb6eec087d8c0480031daa19d2f64e000037e105924024003c3b3ef8e694009502e921808ea607083204000010b9e30008f0cdb103cb023507fe7f88205f90cf83121869abe1ffd2f0f1440ceeefb4b4440047868c00000000d7e5771e0321c30a808000034e601974a29c831789000000000000000041c79b7f07ac2410a1ae26dc6b290c88080238e38a28a80460470250008081810010068000cb9156010004689000aae3e10680619fe239de90d74865602f34c84046250c5885082087841046005001001908010068aa84c550260260bb1004d8b82e8c210aac8404104a885e6ae86040030867ac208129c936d204a20460101520100009491530dda31381226fd356cf6ca1764c1a604892680904f08208c04b04a04404a00201a4f9e0967bc418120281b4158029a3435f834b90b99f030c022d825dddada10208c1bda24458228c26ced18119a3d59c1e0016be4ec9009450840202a402000120200060c400177c8a886c5403768c4e049fc45d9ab8eb2239c7f8f5581a0884810408208a049048047014a847837787abbe638da69856a20fefb16cd6ef3df337d1519081260f0d352e89d61e8d18cfb8e3509b453c1768c4e0487601de3274ba7da24dc5ee1371782512450c32822c128124020050010d953f6118875197772acf8fdefc237810727e5aaa1e8fc8f168aa78429a573fe4b3be5401b8e3709f6d189c090ec03bc64e974fb449b8bdc26e2f04a41c266fe69e0590619a11411211408a09c02070984f8de56658be3450bed2496dfb0ec98f08704c8176e42c0a7dc71d859a00044a400122c8a70e851804000e384068c40325a0181d00b888009b04d0a9f711498de89828e18eeb719360ef9b2384b2ff85455a9ff70a0a3d7762596b90ac200b396a9c771669d8605e350b646cab4e2aa4f6104dc564008400d5f4952b325a6965a6a85b8b3f431202187e8de3221d0340000ab482110c10c7625c1b12d09c032e94539062f120000000000000000838f36fe0f584821435c4db8d65219101004c1060c30c604304105b1c5c5c04b7d785dfe646c30000ec13ec4b9a89dc9b0ccb0f694011dddd143512658a16c42a298038065d28a720c5e240000000000000001071e6dfc1eb0904286b89b71aca432202008618c08209400c00c7f0fcfd403e187cd1084708ac8af5159e96b004800072bd3f1617e3aab693bc784b8fa0d587c8d35f8145d1679e69f5c26b2a34314365eaeedc0178f5a4dfac629266f1c452d46409ad6c276fdc052ca02068001f0910f1980a0ac534360980b8065d28a720c5e240000000000000001071e6dfc1eb0904286b89b71aca432202009440e20821410410a084096020060600401a2822314b0dd880edc02ea341d8cc388086db5bd2cbcf842098a984d6b2f912524841b2a833952effa4104550178e32e71634600277ab4d4db31a9440006f62f238f4da003000bf85066a2c041c84fdaa2f8b457cf)) <<< 16000) + 0x1087d39f93038780d01400100016c114c05c032e94539062f120000000000000000838f36fe0f584821435c4db8d6521910102ccb51e0000000014eacdcacb1ebc241e21c41040822c11c13403d08e6458305c01a2821b14b0df1412a7e84b80c6fef4cf3562553bcc8e0411a986991287df91c4960b8f10366cbd48a5dd1b5ffb83142492b540000000000000000008c82e642b38ef4352de246cc0e7496eed257161e354662859434c0000000000000000022415fe705c607fe93b8974fd54f060ec32517a62f24f5c3520a10000000000000000008841c266fe69e05a8410e09801000996d712e0b5ecc7d510115bd584dfc7828fd895446a783d8eb3db15ccda6d334fdba4f738e0913ebd48784695e9ca9573ae97a13625f76abad801f8718e830b10ac0af6de9094d4c6545feb451c527b933773ca931fa13849bed65ef389e5dcd665a8d4e131b8dc5b7c843fdcf9752c035ad49b2a75eceb80ba24e415f8766800428114a190238c82a05414e22000aff20345a019290a49480609402e2a001050300cba514e418bc4800000000000000020e3cdbf83d6120850d7136e3594864404038a0953f425c0637f7a679ab12a9de6470208c8a1471470c104a0040030150274e11275bc171f2018b7bd7ebe0f15f3e90a8bc4b5fb93afbf4d33cfc4202819186aa86a185ad9459c6e1356dbddb1587675c59e5920972dba27398d4000f9c8a11e810cd4290621471d000dd41b2230ccc7d72451c992c10881586398a9a284183b0555051061e443bd14125b66dba0b00eaf6881008015bc1ef5000a050880216418a909f2048a1d7dac5c902c7ed78df22885e2ba1a30408569171a8480011f6c3a880049ce3088004e284401000016d3240ff659af4a1f976ed3d44086d301a421c4ffcaa5a9921c44432380801040054de1801cff0116002714210080a30080005ec8a286c0503627613af6c6a5eabdb1a979c602b535e10073890088481860c40c808308b00a0080070140432400200d13a010260080005788a210e5e0157dc862ec70a16c17e40299e746ed177299cee1cf820140000000000000000000000000000000000000000000000000006512051c51422011c12401800c040226da47b6430fcbf3a7963020d9c7b0533b8a5283ecad38b2219b4d5402c9143488d11e4653c5902ea3e570741e010b7aa0a82fe1b58fb5cc97061dc66d0003f62286631422d8210ec10c6625c1b12d09f122618731416486eb2ae4e48d2a6b516b1028079229b23024e9a4eee9c014a0942ae20004c4844010f0834030cff11cef486ba432b0179a6420233f2e5b551fc45d9ab8eb2239c7c2c7f10408a01da24100000000240c102b32d47801e60a47b033c902ef4e8294b500c315abd3a0a5354030c564215389246205145b45050f387940468dd08099cfce48b6ca355ea9a38540acc9ace19a01d12e8294dbbdfb1b20006281738c3915cf1ca50e39cf85544f3e13e06284a7634265a2aca47afc8046182c1a84a46875000500228223af6c6a5eabdb1a979c602b535e1007389008b2c7af0953ab37280000000b32d47801ecb1ebc254eacdcae8fb9d68d73957907af4e8294b500c315abd3a0a5354030c5642143482053002402005008629c80ef8d9f1091ba2cb39794dd571e5375d6de48983190ef0bd652b4bf80e1e03f3c9b1b9f89d1a535c852ae91b761d67fe7ceb28f71d2aaaa51e869d1400100023a90471d89f82e01974a29c831789000000000000000041c79b7f07ac2410a1ae26dc6b290c88081963d784a9d59b95d1f73ad1ae72af20f11441029608e08208a00007607bef93d5fc6e19b8326f302aa3969b8757d2674c774bb9359bfe4c25368fd2933d4962fca0f2581f4ffc605eeb7b5aff03fca2799c2a964573a692850849dff54a9bf265f9c64c4a0038d2991c4e2c13628e030ec032e94539062f120000000000000000838f36fe0f584821435c4db8d6521910101850b5c6ee380bcb1ebc254eacdcae8fb9d68d739579078c814b04704104801002945537404d64714ea718b4755cc1b46009bfdab9de8466e97de2ee9d42146532283b487a4a5021718140417aa55f8bd2ef4e2e06e2cb300a3200e36104bbe6c4e7013855b72fb7b139a49af06d0ba69c8c56a54a947418f400133489f1084f444278220009b620283313b11c0c2ac2cce40c1e3179c606182a21c224d8408b402b8884011929c5e88e047aeab43488002024c784401013a090260280005f4d0a5a2f774f8f31351088102c9dc5072f6158c2a6b438a2e3d378e27ba3ac3d612003b074d71f51354eaa4200048fe5efc0d51d03010602c91ea5401729eee650a0008fd5f852d3067118670828b86c804bb24d466bd9019768796dd8c909414000030320033c444e4e42706a021210012a8908e49f0b127a7ccbda5e67ed6efcc72f937142843f384ee075fbb8a854e4779494408ae14d2dfc1567edef62418731960812cc27196fbfbaf75fae55916e7d0100581c41595bbfff7cf583d7e88a74402157845c58ab9d7e6cdbd049df89440001a611ff7d2255d232eaba59f8a2150719bab270c7618adc475e54ba2028e30eb2557d79b684c50f4012cc9334b4262b55246e94820ac8dc2680004b738126873c8b0f842025ef71baae4883045c9b18fbf4c0c00f56429893ac140ac4128614d2420039353d383701540285702a9e64a8800a88fabd34f8808120e74430216f23ab8cd05e06000024d226e521361509a84c4d01426602819bd071d2e9d03840f33626b7b2182ac97b8cdf960a10d6)) <<< 16000) + 0x34baa3a588004377bc2de9c380cf6856a8cd61401dda30473faaa8a0a104b2261792e4080342a42637708e885a050a99f8d32a01862b57a7414a50844e30e2cb2cc24b20908c00700030200200de300aabdb390e2c19a1dbc90c24f71bebef4c225db2c330cb20270aa48888000c4139d5802610240080000a49b217fdd7f1102163d96cf85d2162871582fa750b438a0ccdec7714440c18488903a6100a41f970db043400c897dfb4a44000cefca3cf84000af58ed6eb0001209142b02400011091321189886c084362601301201d4cfc699500c315abd3a0a52842279a69461260638618668040060100401be68681966139a522221fd349a4c96da2450184863a5153c0e1822ab21a29200151aebb3130212004000050ce1300bd38b5a611cc08d133240e02f3ded123040475cc9e010586f1d153070008800ef1e5800dcad4024000244a76110140412004000069484b86c2343625e1bdaaa21db5f4a910ce0591cfc2012c82c72871c50c10c00804fe8df818064aa24f482b40fdb640459bbc36e30a21b5000174225c3a12d1d0218c810844000c647641f73569929edcb350a7a8040259248c48a40a286402182200a80021830010068000839a99f8d32a01862b57a7414a5084491081050c408704a0010110969ea45918d49a622d2de16733601064f4c059e3837fcdb9adcd1a84ca00036641ecb60ec03d907dcd5a64a7b72cd429ea01009238e20e18c18a08802a00021cb1322a7f286220c0da8dd65b44412b66e8cfb07644da8c906d311d32f2a9be1b640600fe8000fa900107822587bb20029d7ce534a221f81f944e49180d8927fe68a1167f43cd1a450c002625a0a090779f6370ff88000885f6e025a3821400a28887b4b812d38879142a32141a71604f10a10926062553d6a1c488002ba7dfaa1b002820e305f0e508bf8120aeb05f7aac430ec60422cca5d7c30f0e03957bae8b1b00bd0900e08720a8000252323e9b3cd6ef24395ef48e7a406005b8d8184087b644b3002037206fc5b03c20d00d350823004000099191ee62cd39b0910a2af2a3ac813bf73616ec90e04ccaaddc80c43ea6bf5c7083d143a12c504a1f80f37c7000f0834031a010900219a853d434c94f6e5b20fb9a8000000002012471452442042432031c2f08340357041d00680009110210180017a9047096c83ee6ad3253db966a14f50080491c81480c70c40440020010170100200da21a3c67aaa91438043985b782470efca7015448c478700c5ec810ffb2090928a18003d090101420bdc9336124834b7c1a435870006c5ace2c312084e020a216929b33b848c5175858c91450378635f21021ee363c2a480c005b8d8184836956e3c5801e10680653021280400005b88001bc912b018950080012c48948c84a06424e22126110928884904424622122090908484802423e1211e0108e80800393888e26c46d260f67b11a3988c9ac460c622e5b1162188a8ec238662282bc22280b08e4321444b45de253b02060608e309920800987ba497ab0e04e04f2d8a331405097c7a2d161000b951a28eb954150142edc65814202a8021fc6123b51e01f21731b635571dd0ac091a0925597d5246060b98185a5849ed2ff4b08365035357fae140fe9a8e4096d63766df444538e900c4b7f45f0ae59a85ce63c77b1dbe35db6e3e5003012f9de5bbeea9c667a9e5d16a33ad6ab80e03b632c97a3e4e734112a824724ffb93146bcaac998dd0430c4fa648b46e1838ffe84d48842197d0c79b1c4949fdfe1874af7759472386f0028130fc0582600e7e96446ecb5e1628f4f0815a9c2e78abc377e00f7624b183a0000000000000000021b350a7a869929edcb641f73500000000040d3f7f04c20e058e8533cb0b48168704584502202083b3bef797c9e9960c50a41881f54255d2024c007d9bb3fd10c59fd5f61d0b42f213df03ee9fb6b1645878f8e39be3e45595e147fcf1b51dd8c16011961443f0dfa21a1388aa5526b33fdfeeafa497cfca5ae852c402334b281574f0bc2048921e8751e8a79d20819a853d434c94f6e5b20fb9a80000000020bb100d0820e08404104e00a6ebbc2e0a43086282e72f5ccf9631452eee2d29e225d2b14042b9139190b26f8e986d02649ed61d7f1224a6fd9df74e389779bb51514e03028001e490351901a0c80cc540641a00089a22263ba027c2eb1022103800880400802000008881102f0f32c161e8804c756ec9ca004252063490009faabfc90108002100401004000011109d0904e0480004e088906fc20d00c33fc473bd21ae90cac05e6990808cfcb96d547f11766ae3ac88e71f0b1fc41022222a9549accff7fbabe925f3f296ba14b1008cbecfacac97677dcf1f3d67f313ec2925a7e8b3cbb7d54d99328000000000000000004413f4b223765af0b147a7840ad4e173c55e1bbf007bb1258c1d0000000000000000010d4208f049001029279668d9f606f351ab40fa6d1abcf58d85a02a0b13bd14f7158a1d3effbc1145b72809737af6aac83e2d5bda268e7b9b6dc207b550dd82882d95c903474837a99783635d10fdbac94adaba4fc47f5fa5714edd2baa743569ab4a95aa5226ae0c57fa1aa43c7bf53cd1b677e9409be692e031f8b4a2a38207147d3211041000400001f48888684403405e0200087a221e130140987e02c1300768c4e0487601de3274ba7da24dc5ee137178253f2e5b551fc45d9ab8eb2239c7c2c7f104088d2ca055d3c2f08122487a1d47a29e748201eb23aa0de31463c4ee7e0c9e922079b9f124447b9070656000000)) <<< 16000) + 0x00000000001010d287082089024947670aebddeebb2f0214bd5408a6aa31d3d53bd84d2c42714666085eaff31f46a47bb38872bb91f1deab20442916e45145374e5310f72c2576d5a7b7805b72bbb26db1b0a0f428b2c14147eb567b656f064ce362d8eb8cd66c92dd1f6040fbd6b9eb561aae006700b61ab82749bec8d928fe7e5c28c99298f3de2be7ef3dd035713ebe10680619fe239de90d74865602f34c840462d189c093f88bb3571d644738ff1eab034110fcb96d54ec03bc64d1eb1966fdb1def270445f67d6564bb3bee78f9eb3f989f61492d3f459e5dbeaa6cc99400000000000000000220f591d506f18a31e2773f064f49103cdcf892223dc83832b0000000000000000080a5125843841050b2b42e5fbadf383891b9b48c1f57eb7701198bb108911d6b1a1624f4ba83103783e55b654e70ff0d309eb334eae538887b0c55dae3f2dfb7b5b30567c9036886987f8d1605867da55e511027b67d559080bb51290e1d927a4206dc26f37c94ccbb01233f5d4192fb05371b821731a6cf16840dd46de8003df110e0988684f4b281574f0bc2048921e8751e8a79d20806825de5c72c0b23092471842811810413803d72b63e2432670c09fb92e666c2553f93b8ea210bc97779c519c4da2180200020a206a3a0341d0198c80c8340023184007258c032e94539062f120000000000000000838f36fe0f584821435c4db8d652191010088aa5526b33fdfeeafa497cfca5ae852c402334b281574f0bc2048921e8751e8a79d20807ac8ea8378c518f13b9f8327a4881e6e7c49111ee41c195800000000000000004042c81842022c0100546566e97e3a055d38b928143f4b6c13685114edb56d137ea5a394dc625ca9399c4c6f5bb034ad093c77a1f15d4c4bfdc184c635208170dedee95cc41226818617bd41e8d165388eda41385af8e15c756a145caf1c13ecae6b12f9046618d7ff0eee714dd535955d680035c110b3588518c424b62105b107218830ec164660282a1051188206c40c07f972daa8fe22ecd5c75911ce3e163f882044278a28878468460450448028011fe19389fe643f02319a1fabf0207f4bfda7dfe024c8908246411ef8a10ac03c75e495f312201fada1a8853e0b2288ae820414dd3214c1e12042937e82dda6e2504a16c874f33fd93e960283c508bab74b7d42003760e12a7acca1b02ce96ba107b600d020116301faff8ad29a560704993921f03c0000b4482c88c37837f972daaa633564c247b1600f397de34604276a0191c21618818811c09609208c028020260c00401a0002804408862022bf0834030cff11cef486ba432b0179a6420233f2e5b551fc45d9ab8eb2239c7c2c7f104088922081c808408d0480520039dcc91fd6f5059977f19d86dd7793879489bdfaef49f605b361a3872a945f492dec910e19343edf0834030cff11cef486ba432b0179a6420233f2e5b551fc45d9ab8eb2239c7c2c7f104088922081c808408d04804a003daa16d9638b4fc6008c223926c5aa3b28f9ae7d45900aba222d71ade518a78536f86d879c326c83a00057e411c271313802f4e670cbc85f60a1c67445a0830e0bb27bd3d0306523be950400dd39fc4004087ed5fe7804e2042010014010000bd11000982282fc20d00c33fc473bd21ae90cac05e6990808c4920f0c80c908404204e00d0034ace1db7d831a693cfd3c08cd4916ee80d71d3c931fc06328917c20d00c33fc473bd21ae90cac05e6990808d9a853d434c94f6e5b20fb9a8000000002022483c320338224210108109f0ee5f5b8ff3b1200cffedb157f859a797a888f09d5195df089d1aee18f830d00027620280bb46270243b00ef193a5d3ed126e2f709b8bc128b4627024fe22ecd5c75911ce3fc7aac0d0447e5cb6aa3f88bb3571d644738f858fe208111a64924101921060a601ceb91dfef5767f06c67164be1ee73e6a21fe6a13d15d1e14e3b71dd3f670e3a33bbe24dfdf22f17e7c4b6bee05960cc329ac90a7219d1a92203bf7fb54406297624ed9c12598907ca484504b2ded860ce76b9d7204c184401000013b21fe22000504363038f2551071b2f0630b03028a405995180b24f538084026ec15ae0009450840200280a00012121fc3a000ade21fa1b9106c0c0d2a2898f537c3e1029ac3eb4c1e00ad2bb6c8b01addb6b86380154fea5e500026242100807e00800055882c88c37827963d784f47dceb5d1f73ad658f5e120f09c49239618819210811400c000028008192c0100686e808370040002a8410434002b26643488380bfeb2688b309059b42b93663dc1d9418148dfff42a3d6e7150c022f8b1f5d35e0118420003ad368b9b5038b105004339ab9a8ab8a8a80c084807664db4b3935104040a4b0d28cf29d9809940ed8a56343a0210420000b1087da0c3e8f61f27304e2982792c144460a01ba123226a53a4dbddaac74b1d5b083d6cf09ef022eba0a7cc81189b2c7e245e97872968f2eded7340a8095b074d51ac9fca4fa74a940f30fe76cc4de7706d88e402bd32b41dc1f7aadf1b281dd10000461011afe947f4c3ae4e58b6c0971b00b149c83e9d9503d15cbe4f1fd7fa1137c0b713d068110001a4d5cee5fcd6d39b297bb46d5b11fa3e0cf484ae4d173e01128411d8bec87b65667e798c720150322028347e78f576eb758fd278946407e1da8436b2fdd1ce9150d4539fe6ddfb3546a254848e101739305ca24d396caf341493655aafd05dd9ae49543152dac7b4157203da00f63999235a53d48ed000fedbe229f77a93d684e51161065b0beb6c0fd)) <<< 16000) + 0xe2b1a0841eb4added0ef5ab0316d57ddfb9d655edb3e8e34aab22fdee4f942076224067f7e73b4834b7f4c145bbc6b70d0f615e9e918670bcb28149a88b0fe1c98030229d2561579a6d2cb7b02b4e2251351c810fa1f8c82fbd648be50f27c0010e597dc5925bf91fa9e7c73aba170adfd1d6795e64fd4dd34e1241cf03446960bd1ac0cb1c00f38f51a26ecfd5111c27f77f0e880395234d54c06588dd5a080debd1b90400271c1f0080000ae10f81182b82e0700b480931c71a23e888a81e95efcb008c307c02150fae704bf403bf67d50d105733fe0c4230c1e0080000531f0417644891502717f68ac088308002150e0336e4d0f040a956e8d08830800200001004000468cc1d8f39742a352c8b29671cff1f13d5a4d97fc2ebb2750626d65d363e8f2b60468d87255009f809e247cdf4b55c98aeb027e043d3cdda0a066fbb7b611eb2a413b95752b6df89ff2c0d4463f7df0c85a08f68bb6402f4c1f91fd7b3563c7ec65e6537032c6feadc721ff71b39d3770046a1931fc3d6e8565b4591e92e250dcef2beb4eb7e985b93f56e0abbd5c50de4305bd582ce805f837dc2aa86fdd5d4946caa765e7d0e4fff05151560b974227504787341134548caa930efe550ed59cf5f95e0f48304fc47dc86628b9518eb99113d40c91277683c0bc2276a89d7f63c396e6bd06554e52a8ca145ee63eb451c95d34eed0e5ce85f436be056fa6f81299bce8e115ecf16130c6d956648148fe1a457acff24c251a7154620e3485807b8083d80600123443d4461e81b0cd09c010040101e4030f101c01004011e05d6d42cc841074020000098601002008000022200018c43cc27000010044829acc8f708d000ce6ea5b8800880200000fc43c8161e2038032e153ca4602a0d3b2265001688bffc11841000403c01600017e43bc440003a843b86408e220590d0001b81000f9e21c82b8096a162634c100b2b4431e143f6123d44161c73c64a0096251de0d003504cf913020f8042022ab3b30998200ab24051e141f5941da20a29a497c9202100040000350c0473257a0e6080307b58850d952cb181e156b9f61414059d8758e4a083e010808994e75bcb107204eeb1e1681a296823041f00800005290001bb20281306c05c453550cd711841a92cae9343832498164821eff17f840166e9a55a540697ab1b52604200084454a9f7476443f78f06025425170d4561420b20b1d81021af722b20c24d4e78a926042000800009618049d0b48ff3021728d79ea80932e2dfd91047abfab2c8018a952399094208402000020e60255ef97a65883bd98bc0a18f86994870215c1628820386769a32800f00403b407230d77bce6510f12493625107948e363cc04ad0b9b124002000848c2215a7b6a219175105e91066233cb3a68033c82b349000840200001ac400070c876028000bf0836888001b048758ac3a827e1b419f6392c314492a8e684154249b0b08576614e9c0f963a38594007c0201d203f0c3834b35c684282a33c8381214c219d98005a9932a420318d1f4384a084201000010420280b06c0587400a0223153fff1c184283b4aa01769e020a280987110a9220959beafb040998039fc93021000422586369cb60e0c7f1f33da8055f47b87f3022b89111d22097958e7f900234edfbce4c084201000013221ce1305d01e16f20e8f524249238daf1449eff878c2877792771460656b319112820f804243329c3eb43861167acae80a53c44125210d74c5851c22f80899e380825e16564c083e010000126333401c6dff280a5fcf4310484a3fd2a891a20127819a5205b82c1b141029da0da932604210084cd00cf8db9202959fd08fd212df059b6828653e8b9584817f8fba861c005243a8c898108402000026440009fcc051fe478c0242377af5258f0845ca59b62855f2e7791441150ec2dd928210804202852b05d8e90868705f260a16883a25ea9801b1b64049202110040000370ccd0a86a889c90892e22fc84f0822fe8c288a1607a92e13240423008405090d3856e908b89772e8cf08019647420a1718d45418481014fdead0980098d3c6c898108c02000027c40008e4800228100093f20017fa43986402822000ead20ac4a0211d02a00800688887298c11c9618a0bd31137a8aa41aafa4ad7dff7870f2c55f2f959e3eb7cc719430db4a68c8479c49059aa622c261147adcf4cd64b5f96ebaec4d87e509aa4f2ea178960e7e9e5fa27be99e8ca079c9f4da9fa8223cf5dbbc9d73db69080a451805a967a0eb1994270d2eac182c2b09a8436ea79bf3247313732a0a0b8901f3dddcf9a183cc40cd44be7bb974b3f594068a02371203c37e256f11da305f2d1f7e67ec886cec48134f9cd99f46e6e22c75700a9dfe395293137a42a99e9c6c25fa07097eaa9764c6b3c80e62adc79913ef6acaf43c58000010693b3c0d4cbc3347e3fb79ffbc25e29a8a2675ec5a4688c20ad47fa7b28e0c0f8e2287d0b0fc78e02dcbf56aac152961d0b907de961857d0d0b222e49d0f63561aa8ec67f05eab8d2050e95fee348911cc9d54c50882137f41b2f9270bb82b991207b8c1c01c9537ce864631e09565d46b22ae874a06024b0efeb5d2dbba9685591930c3f203903700cba514e418bc4800000000000000020e3cdbf83d6120850d7136e35948644040f77a092566cc24b3e25c0637f5c504a9fa08800000001b20fb9ab4c94f6e59a853d4020334c3472812413001c0400bdd98f295cd5e7a20dfe447981706310c5fe3e77462691edb3c11fcc0e8826128a5eb6f07c513eb97747fb72)) <<< 16000) + 0x110dfec285d2512cfab629c950ccd904de1551c7e804aa5ec4a367f50540500026910e3210710a8384441c0220df0d00080c90591d86f08ebdb1a97aaf6c6a5e7180ad4d78401ce240229335eab849491f50d4e0202e2ba3fab1007c0f66ad367dfeb0000000000000000000000000000000000000000000000000018f2c7af0953ab372ba3ee75a35ce55e41e31432423802801804401bfef611afe0b4c35d0683316d36f6d85c98bb1a460f2fc91ab849b7010f017212bb757a56224dde1d79fe2f0559f45c47ea667cd4f5e7f00dfc777499040ce946d19c9495322a741ad53f57b445aa73dc0db8072b5ea9396004d34cb475a9afffd02f69ffc07be9cb5e026f27cac6706c6ac16ed09213eb6f056fb979572899c5ba2a2aea834374241b80a0007522009326643ea65682c8454a0e33c741b74d544cb8fec172b787415fedb185e475f37485e19346d534df71fa6e714058fc435d8fab4f33376b7a1dd3d77d2a79263ad05d38ef63fa9482ceec16a622e7d1993ada06c44b10052a8f7b25e7950719d35b993cfcd7925822f21952af687bb1dbef215965fb8110d3dddb80caa085450000226320b973c8183ef698d063a56f7afe4c77366fdf163759626546fe6f079df41b2379c11f2ac23e8012e504cc3c4c155c63c470ecd0224933a8dd836496f5ce5440f55b12f420fd8d5322a4d731768f6c95afe3ec6825ef4a2b97b4527c16432cfb818a762debb2d986fdc3eeab92e7e9a30b1d8f9e42a9d4c803e719ea3c212bfd0e177fe7aac297ad2f60fd86dbaa3450372fd05e330811200becf20f31aaa023e000243086da083687400b236401e30c83da8c1d807213a95b05f2c71f8d5bdf698caea9ac7ad45c7a481b7fdd860856971d1224560b94de731286397b6dbcdb82e479e53e01809cec638e8abdb2e5af7873e35e9ca6a94e5fa555b6f525043351d8bd04eeb76422c9962622e1f6474395286491c4a0746b7eead04135e5816c450788f1683cce95974b7ba081ce1b89c917cf31bbb90fd78edc0e0af31caec8f29fc1000001223b3cb1703adb0767e8f0554f7c4f25468bec4b4f8025009b966b96eb231c263c976320d3d3f23df6a29d4a59a6158a9ed50fc61a92ef5216e8e75adabf695ab6072bbea1e2e362aeed0c31ced6d2c598ff5969c3f8914a0da2d494168c4e048ab6ab75474ba7da24dd34849b9f8250b4627024ec03bc64da88339b9dd4fa00b608d9a853d434c94f6e5b20fb9a8000000002071412a7e897018dfd9b3092cfbdde824950890d10810c04704505010001ae61abc951589f4e2918e4b7030a45a71792c0bc243ad0211817dd351a46f3752f567e0b4902781b0d4b22bbc49fcabfb05995fe5fd4c23be659ddaadb312a559127fa8e204f1f5492442ad022d8112f6ef132cfbab823503563c2613f90705f9e350129954f8ae6c3837ec93305222ac0a09810c5b791c56572c9bcacbabd09762ab3720033595efec38a3c2d6d8a4d79a3b257d7bc63011bb834a5d524797111e6631c7fe3a5150ad01f9252f451a3d6226e030d9d66e4102531d28000ddd62d1f3d289fd48477ef5e3414e4b3e28b4f40562f62d742360a2bec25c4f60deaf481b7849150931e3c2021db71903295222c6b0000a844365261b08b0d72986b12c3544613a1ba2d6ef7e6d49de15ca55343a4e18817aa8f1ae2488c1919e9e761c7ea3ba28b2dbc04c9389b80cf944b9def368f819006d7c3ddb970481c40796eddff2ea29a7fd8608a9f0e79ee696d726515db000ebfb578540ceb36d01e3fab7c0b2bcb62c3858ec89f7b959f7fa2ccc016d37a225e30075ab200847c7385bafb3bf928b35503b727bfc6f33bb5c562c7a2c1e55c8f12e3f66fc57267a480c30b5779102d203720759840c23c650cd12dfdaa751d577c0c9e37eb412e6668419fb9dab59aacd660635d5b3abd88a54046863ae70b6a5d3561ab00000224115e67954e3cdf8537de01739958b4e26a6b84f442f42b34734d82d1ae690d69a968ff8c920e1db4cec16df2d4675ebc249a260c06a02c34c061a403d281d2041583c8b8b09865c8211f2c59e62801b23547940100024302200859769d6731e3411cc99d49a8000277d458c007e96dca40481842010d37993be8e0f0c9cfcc90960088be03f89821000234d910c553e3c31383533854174468c2f2304200080000539d363ed2c260786377ea09958019dad2ed4600420108000080200000888688280003e880013e90140d86802ecbb7180921220d91696b614004dcb680280075ec1dee3002a839622012861080434da15e8a354c30ed4582a44019f2944f2608400088000080238ec3a943dd50035cf2bde9001000200001e080005a9c337ca54fc9201f447c179000825b370c230820008000054900023a219e2205a090001c390ce1986686e00002008c3328be00d1e1858468224806bc401cd3001f00400005090cc05f06a49bc365307ec704a891020f804260c8371902e9001e840fd1910211004000020080008a1a2853839ed980b8197885400b5b3147a04c307c01000014e432c44028120ca090648083200400069a431ca404242000afb218c6304725ec83ee6ad3253db966a14f50081e62df290c938e0495ba2e6e21b56107a2761da71749efe90ab80000000000000000044b8824af2bc853d7ffe3da1ebae6cbb0d687d614b725a6035d8000000000000000000000000000000000000000000000000018ea01862b37a7414a6a80618ad5e9d052942143cc3872c71c728040010296dc825274fc68bbfbcf64abd6ec0)) <<< 16000) + 0xfb2127d841ffeb83d9973a8ded54272cdbd7c5f2b43c73aeaeb48a8be4e4939dbd3b8703f4773ce5e1c080e6c4c0dc5c9b342a3db2bde4eac8980cc57bc1f2d7cdcb5ca6d3572c052f484a521a6cedadd33a412de2e3ec0d561526afe963deaf53dc66a28003ca10c50986204ec7011fb4a5f3c9de3cd507249a268ff6dace9946500b44aa5c65127f3a328454b2aedd55d02461ac498023acd0510a37310bcc8af9cdf279043d39bcc0950867f0f2dbf22367eeec1bdbddf6082358a60132e73917cbc141ca4ee8b47812ffd645216bd94eb96ed15807870d9e6b20679e7107029fe6ed50ca99ab4488aa90cc30de63ba3bb81a0a0db9e4ed16dd6ecf6130d821ee23f09e15400000235307c5f7e0c40a8e187f619a778dc2978b3e2ef3bf3590ce03ff359bf3686793e523725483265855cb4af46309175b81d885ebdb3a065a5a6665d712e7420d40dd211107bbe4492641800039b90c311061088006e18860a0e890e74c4d08914f7de2528340e25de6ccc700d383485518025fe492c15000000150095708802000026a430114004b7e400c2ccc8c688fc81713352e34db8aa71ef541c605cf2198397210a021347e8982b0c1055b816101742e0d62be75fd3ae85016b6ab59140128ca3a699705ceeca8295bde80211548dcdfe739fe18203177f76b8d735f31c0786619641080000cf0a796413e9ae5f73a392290021409d570b4bd20549e8d423c3f54a104ba6bb5e6c0f2482084d23de7fde282c26d5cfb5779bd9411b1b44c000094c400f3dc8073dd1bfef91ce614141051424451c02b738b8508a44a26a326520000000000000000000000000000000000000000000000005f11431030c1180140040551729be5dd2aced8c03872ab61eb518e63aa51a042dcf09830c7e682b693a8253efebb878cd68838ba791846cc6dc50347b9f3506bc611698a00000504005ab718b21459729af3222a50ddf92e35e9325d1a2ffbe1452678de302800254900eefc20222866022d6492062627dd11cfba305e59c1c2e504be3c2d34f0cf38181289778142057807e1a2489e35ff4dee087d408107a65245e26ab4caafc162a35f81803c96052ba0a1b98059661f4573d1005105bda395b78e8bb1b87b638fb5050040ca4e244c5608dcbd44d8ab58ba8b762f5a74ee62f1c8182720383a403fe15ca5d53f13b0adfb075e553bb66b8a1f1c84d979b264c6c12850817f3932d440d7afe6aa9861185b706a7280176ac7be840112da1eaa0600170aec622880020931e1180402f416098038155c42cd63fa1948637280727289ce2df7e9328ccf47eddd736fc67da74314cc4c0dc5122cf920416db25519606f4272b052464b52818fe8960e5142dbba8ab2b3349f365b09012f5a665f2093c6da212ab1eaaf6e4836ad7a927c8bccd745d472a34e1cf5c254678500f8461317fa34f2ec65f0947bc007f158549cfe42498321ec7d561418e4771cf8bc50740188cf038031470dabb757bcd20ac600ce3be2dc87065906f94fb87c2dfac0448001bb91128836e4dacceef1bf484d15e1a1796b0a3547ef2ac0a238e72a4f77d9a66ba0488e9e8e9d98fb274ae0a640b995adea7ec95c5b6d3e610cf00dd4d764ea4350c3b005782e465e71d9bf06161abdb2012c115910bd709041f0845d91412d53ce134204372adf251c02243908280000027302200850e24e20a818e3511ff95d24082b778317861026d3abb238011bc7b07a0001292110042871f1bb834471a48306e1820401291c8d8608b6a46ade28029032f369000094908802000023242fc6417c0a00027721502a00042220542a0bb1100060c9a10f04fa5071838ab5e701040d2fbede6828145c27c0fc3042815dd172808cd364974803ec2bc5b11c004a7ff69540428202200805e80c130078508b93ba4451255f2d4ae10233cf725cc9006973af521401d944293c200bad8b7750026142200805780f8c0777754c0c2ccacca1722867f4062b48a08dc16610660007f0fc370c000fae08b8004c284401081c047d184199c7182ecc4fbd7f46162cbe4fe183450cc70ebefd724504d618cdffe442040e4fc9b9c0c7001d34e3821842004643898677000fa1028580580001f4200069a42f0340541a0bb0900027d10ba2d0091482e4941263a0921904886824024000ee6400551485c1cc2dce608e4bfcb96d544699e0d91c005b8d8005cc4a9aae09496b23c7fe607d9a8b653e3b20de6c64b48e8cf1bb15f0016a00000000000000000422ddf986137013254831dac751991883bf14ed510800000000000000d8c8105086004015510cff2cba00cd548e5530951595b904e15d69e03fe76c453a7c5bd6cb63d5d95ba936b9cb2a3118ea04d42a2aac9293c96627facb42241480fb07ed77b5c4726bfb57d99ffd17d0d79b709a4dc5de50a0382020467b84431c7f041da6ff533b04b291b322bdd9c036fcbf2079256aefe0304e0ec3f0f5699ba3e84050092beab4db0aae6b3939f26b84dae91d8bc590c386ef7e97215cfc9e9bff6cab66d00be72d1650922b62833319b64b0ac85a2050146dee7d32ee44230408f0fed4d053a67420a9d846d48b713fdf0e083c4e610122004442401b6a18b5998048cc3800b6fd32cfb848738500058c909953d1b9d2012ffd912d5bfe3421138d9526d0487e0e80af05d8800ae9f31690800608145d71bf19d098416247ce136568722c1027f759850d45440273bef8ca15a468107f1a05c6c328aa14006c30ae87f2580080000e79309282da8021e8480820370540540a829c4400050c40d4)) <<< 16000) + 0xa6068530b62581992c0c857d9fc5384c742b997537b878dcaf988ce5a8c7f6bc02a7a8c80000000000000000000000000000000000000000000000000628064dcbd7281ad18c363707f79f9337cd424044400b42fe000000000000000000000000000000000000000000000001788a0c70c504204104100737106bcedf53bb004c15ea98b68ca6833c5bd72d00a38a8cae22db00021de9b2bc909d877f05d0a49d5655652333827b36faaf44a3630d92f684a0a80a84416a1a04c010002c110123d85a18c2ccc61643bc382fc523eefc58427ba0d9b2aca0800ae06c3a69210272f9953dd102022059dbf6668202c49fa00e0a044aef6db2b108084f552a641e2800770f98ffe0800a119f04c6219048e158123880110726c7fc2062a29829eef2187e873907f5b45843072cbdfe5250406d7a8c73d24841314761680e50240a8f322ad84002f41155ea9e38038cb9cf01e6a00cd8462aaac4c0891c2c02c00012d9d7ab8e3e440b059275ddeeffb4eb9feb1f86530f581de68c0000000000000000000000000000000000000000000000003008c18611408c08608408e02614da6c21ad89b9355e93075168c23232b2232cadcdebf2128c7de3304ecd1bfe3b76a932094028212cc64275c94f6d54d12602f8af9ee6054125629e92a33009d72413accc7820ce522bac244cc407fe1c9c7380c3a1620a0004a82160330af01c1290d468b0e0aa17ad198a042b467ca45061ebb576cc00205e4a5d009450800201560396d2ea2b88c33b63cc54af6dee37e701a32599500f09af3d3000000000000000001084410b08e04a0480440480020182d4c8a5004c0c0f8094000718d10b78058d38825132cbce238213853016e811881180402ac076038eb91badec5ef38f3615d61eb0bcb1d678b6d77cb0955000000000000000002089c21420a20821c1041120100040064200401a0a0120aa0900982800078c854888000b74f9200393857a06141c4465f538a2cd07d7202638302ffe1e488604215468e5fce041fea850ee140019b8900ec100002895ee0081481027014435c4db8d6521910838f36fe0f58482100000000000000004032e94539062f121025e0157dc862ec70a16c17e40299e746ed177299cee1cf820140000000000000000000000000000000000000000000000000006521c61863433c23001c0f423e641b060c80578f801ddc22b93840c3284ebcd90203fd375b3b0808003fc9416c082016d5e06f74400023c336c420009c1a3de490005f5e1001647042901c71e12adba681c2042c09f5734401d0c1a5c4080cff0ede4b0001f53ad60c00063c502466042300800009e10ae01000197900067f2156038245e32d6fa28108600b3f228210c5f0eb8c0023c246091200363f83c620028352b32293041180402a81415a0a02205056028000648f9200393857a0c302cddcad5660a1b3eeec4c8c28b1c87705428b7577384d59c0857d4194205000194973ec02002955c5078854061300821ae26dc6b290c8841c79b7f07ac24108000000000000000201974a29c8317890812f00abee431763850b60bf2014cf3a3768bb94ce770e7c100a00000000000000000000000000000000000000000000000000032a427a1880ea43efe1387468b899600f4adc717cc96a09b44000000000000000000000000000000000000000000000000be670e40e682800201b0bccd3f18fa4937cca56a77e29ec7726f6aed1d4117041ba38203b37911c1966f1a1b0b2fe11b110a6d1c794f899ec111624bff6064def3e4ac74ba4682021a9bb2cbab835a7af54d41d5bfbc5764b0401ea0fddf9bcde5c9116fc9b945c9cb6b060806049ee37c1b5f29de3e74668ee99d252028423d2bed1766ab92475577109bcea896635c5f36af104aa13117857794121c6500007d8626824afac502480eabe72f241116a483df521000b71ab2222013c4d9620820112a88028801aaade580f0000b71b0060008c011046e8d76c809080000da62222086a97e7c90202af22e582000577c57d28011004000041cc0000401013c02000037200061a400317085580e8408e02063a2883d5f70054413f55560090410276046b624007ba7127e4004bb32b1486001838fccc1382118040140141540a022050098280007008548880040d4800d3810a80d0538680082a481a96c0d0a6066330320de8425a9036d082ac0c34331408cdb53a784007726ec4612041080438a21f818430c3924932331610a6d98894900221564324808420108000080202980400006e40004a082384f0694ef6e866022b39092e4828aab4cd00833aa372dc3017e2859001284100040294240b20a00012a21482a0a31585108c2842605e03b0fd029c865a4e7d7519c6d970b8b8f7a5b7469e228496734c00000000000000000000000000000000000000000000000000325216b1f4c1ef94d17a7899eefbad0d862ffc097b29d7d1850000000000000000000000000000000000000000000000000c0479230c60830670430250085c300401b0d7136e3594864420e3cdbf83d612084000000000000000100cba514e418bc4840978055f7218bb1c285b05f900a679d1bb45dca673b873e08050000000000000000000000000000000000000000000000000001948d20820918911009100f02e000200d89a9e4724c1836d87a07e90a62b5f39a0100ef10147044798e0b180009638680803106041ce003c0100001483c7b70ea6662c5280ea3c1205034bb7032c30c3794703c10b2188b6a8010002027c04000220649266a5247a513)) <<< 16000) + 0x42a24c4f0e411b5cae290f24412c951aa2841015752a02920001c9c2bd088052bd062c63c0007270e00540012808242dc70d155115b3ad1749024f2b715441872a4f08200c1b7a965001d00800007798000080202800400006e4000c208004691dbc5dd93ae051584b374fb15aecc0643039264950824000000000000000000000000000000000000000000002c34ad37d43f3211266b26530cc609cc7310a7b8c727a00000000000000000000000000000000000000000000ac460840630650010008000085c300401b0d7136e3594864420e3cdbf83d612084000000000000000100cba514e418bc4840978055f7218bb1c285b05f900a679d1bb45dca673b873e08050000000000000000000000000000000000000000000000000001948820918d1090d009100f02e000200d89a2dc30090822560b0541831bed52a64857e8335248040b907240e0840ea2308200428dd959c007c02000029e78f632b12902c53382b2ff9e086462d07e3002100804f8080002f0c92441e7977c91340d8ea83462088ca3a414acc18007270af42460e344ceea030c055d4a80a44018aa5704c0f0000e4e1c00a80026010445977bf8f4d1038b8c7b4813bc40271104b319b70040084253065001e00800007a18000080202780400006e4000c548004491000bf8212e0b91875278ab4516c4cf135890d2ed4138490acf13d6f02002468d13a5002000848c3aaaa3ba8a2f2a1925543062a52573e14100b5375d64847f37a02d1a0078e0679a58005606fe5ce004401000016332307690aec851636c518484864537fe2624259e1c5e0840024dba41250021008725b94188d002e5e0157dc862ec70a16c17e40299e746ed177299cee1cf820140000000000000000000000000000000000000000000000000006522461451832822423402801c0c000080340009648001bb10340904b0480882405412000660213a3309c15d9007ba141247140cabfa4108156f7c64590824680459367020112a80b0900362d3e438402fa76e8280001f478d996808c48f6a80e0508c0212f00abee431763850b60bf2014cf3a3768bb94ce770e7c100a000000000000000000000000000000000000000000000000000328a28a060e38619c11a12001c060000401b85a14d8d150123d2b28b44199631e75004a67bb3f040026364ca5001e008000079180000802026c0400006e4268172488d4c23a2944d016bc03678822a81fa7e48104015752a029004068fb620c440149fbf60b0f0000e4e1c0020004b29040f2a00098041c69c046fb5116aa38152482969a090d1084847dde08003292a165001e0080000791924464b4bd76a480275e44c4889a00df96965104563574de8020802aea54052200a79ddd790780007270e00100025948207950004c020e34de6840688b0023d65a4149cbb2f888475d96f48400121d0c92800f00400003c880016098020080202641400006e40017bc84c0080026dc84b80e0521d240c5104204c4de62c2166df2a20c2251bb3fb201c3d92e7609420800216403860d99840a1dce2aeb0826a7a1bae81841c3649af9009ffca6c2c4800b6bb27b0c003345ef22138411004000059c81a068258240440a02a0500016b90220500075a1002e2c212a3a0940d0150680cc140980200328f2126420921d0488682402400bb8e401a75c8038f4908f2584708c00c055de351b15f405e58f5e13d1f73ad747dceb5963d78483c440830228220240000020017f7d583da2ef3f6e0a2bb169956b2841b02d4817eb10335ff5d75c5547bd0281cdb3e9d171cc9cd9b7822c98ea2a58401ce243180ad4d7af6c6a5e6bdb1a97a08bdde824959b3092cf897018dfd71412a7e822a80618acde9d0529aa01862b57a7414a5084cb2081c814808304a0000d529db994975b6aaf04bbad77af7170ee7e41153ca057dfdafe2d2d4763ccc95ca2b1ea7d4730c5e50ea836c09aad7c57eeb76dc695861ce631ad9073bdd64695a264e5340d3042c5f1902038a9849b1857e2829036c3f61e610ae6bec399e715b5de6e5c445448c1eb49ffa05b27c5e40b90a0eb6e5dbc29c15c0c1d964a8e59cf906f897f0b968d8bacc3fe9ed601548720cf9c453fca1c67afe381e4f7f9e70012de462024045742ea5fd0616fc00ce09682f73e343e97a932cd2075f139572db017c81597dc23b8f89b2390c5eaccfae854cdb963b342d0db0f2000aa99481e87e7a270abb8ce02e3490d7994eff370980e0ed92860ace5706587fb59c21b3fe01f913dce654e5554e6ac461cd61bbf4792103b6ec333f2aa76adf15e096ac4233d2a5a9fa7fc6042295dc9a66aba350afbdeb2686693b1600dab99521dbc4bd318ed2308000219484686c230270384947fbf4a142334c8a048a8b953568205f31daa5f90114c35d65425082100804582c2281611203a241adca81a58e314a45df287ee5f78c19420654c239470c4b0fa3c448223119e2126042100850fef12e2661c3099ace060818ab90464090475bfd4c848012a2c5e9250421008000082108801c9020e759e52862bcc495692377f55b5f090c3879044830446e87b2d094208402010e1200011b210c0a0003b02100320211104288810404000ac84210a608e3b0831d84102f884f61c3f86081810ddc3fc341e0a08c2a8cd332dc4040e20c7b6c92182a2c3e46ed242408532643429b0e00fbc334641e820098141469f0c03386d15a8c8000f0822c29bc4072c4141681802042703811774f58a162b59c42840b4fd308cf1025a83218c8c08c5f9b07c504bba215e)) <<< 16000) + 0x20004c3842010a1620c7924d2052ea1b6cf85080bd239cd1023c4964cf460490e3e76014117f632abcb008b0f1255180241c49f98000a0708802000033e4200840fe2a0410500019b107e1503e8881f034000c0a40886708039c4863015a9af5ed8d4bcd7b6352f4117bbd0492b3661259f12e031bfae28254fd0455de351b15f4059da806848a288304284300800020296daead458e6d8e926b6b6dfcbdee6e2404d1292b50d741a0418c9737409e4a6ec8b1d3dc9215f153cd512c095a0006704050740037e641ece60f4330791903c00c1dc040ec03915516e54c8995d46caa81a9ab26e8a203063db7c582ec762f9cb2ae49a2420c1f59fa8fcc063b286474517c2381a2ef5d621bccee44aaf34cacc84600937b7c64b0b20a9f6dae54935c0400206db6c68d02d3b8e073101a2d400453d61d2af7009b77984b4ad480800021a4d48970f7995a9175064b8e525004caff265527588eb0bb7e27116d5b989e100c28a7ee1d1981ac49168c4e0487601de3274ba7da24dc5ee1371782503c20d00c33fc473bd21ae90cac05e6990808c8b1c508704b009004004400e5600ba2e8cfb6a74bbfbf272ff0027c206fb2e93c019a1de40a38a5e6bb949bfdef37b797316cdffac2c6e013faf612ecd6b6568d1e835f81f4a8f7f7bc43225591f4134160980307501da3138128e781b96985ad45e75654c7422047963d784a9d59b9400000005996a3c00f5b79a401921016cd429ea1a64a7b72d907dcd400000000104c9596d342633e18962e542e857852df39f573132368a6c00000000000000000000000000000000000000000000000baa70e38e3824800080981eeaf09ecd5715076bad527670e76be20666c2b204f4fa5add93679f56157ca2fd1473d151ccb67b21c871e671411aa747241d1d6c51e14209a7b46858f5de82596f3c8139793bf3b37ca846f17e825e5a16f7b68dbfe19b4039f8cad84174b43c49c133642da261683304f455c7433078788121ab8e70d0805e749531e08032caf9c101e298caecca00098d113d498108c0214401a0e98941a2abffa102b3c4022e83f7668402467145cf0415099753880e9d19263f26042300800009f1d17814a06087884b55d6183427d622b69a800962fd8c4901084021440014a6a6c80a008044bf345a7141ac21e21801fe230d09b991dbcc1029a2c5dc626042100800009910002243a29a1c17c9878814ac1763880e883a25eaa001b1b6404920211004345b9fef8709e208c41503cf082982e50e78210e2b175101f01e5cd41282108040000410e8e23054326345bdb013a51e20404f6f59400715dcb1a480842010d17716f9bac40d8b4fb544709069835583082eb0817c9010800200001a640007148001ed1b1473ddd60c587097f0715342074f85402408f9d365f0f0439c166c8580c0d65c8926042100858a81df72bc587f8f6bf586840a97f77890299b2e98e782249904ba182392b7fe84c084001000012b20e81207305000150901411ccf13132ecf9825c6192d0cc0615111de698023a998f890008402133c55757aaa78c03a4c51f3049a019094180c07acb3224002100800006b1b14aa87e590b0faad7b4dc4086b78f77cd04012b43c41003d6614065002000803900800044883884ec500b40c26a4195f56107cb0db97d38fe90237b1dc5f3c1293f5f379606197668a026082100860c8d79f52c6092d69e9fe8061e7783722874c8901da984207ee5322044bf392ae980f44b653c4e0840010d1c7680a50068b2d042e7c503171459b822181c6bd8bce0845969b3d280108043479efd3d1468b070f8485111a0ba56ba818f49b93314339b5f212704bb650e2510259a5d3b4e003e01000014e20004d64000f74800295906d110360480021e48380cf031987f5070c1f8a75aa80c04396f5cd08c20800200de0b0140583700f851c65564858a9988336cc0f40c673011820f8042c5734acaf26072a184e18409713c1a31a08051024d100544464484a083e0100000fa362aad6107a0a200b1c195181c0de5f5f240a203e5f39202100042c5b9cc5d2c606dd4e7080f0878a8bd6a40ad89f7d33c05ae94e1468013b7a00098107c02000024a400084c8368681b0140008224050340d61200053e20ac4a0211d02a00800677083518c11c960960be1c913c06c0de3341032f8b1934d690e9eddb3521c38e5ccee9a512c93954d0e86472266113f35449e736a209a999711c5e28cb3f1bd7007bfc4fb7d1024186cb7eb6ee25f728f2769b5ebf09b7e95f0805920877510f61abbf9194f1b43e7350bbeb1a6b15da98aee0ae60e77d1609901ef8f39c721a91884aa0903581083b8d6071b506831c60a4bfe2bdcef51c107170c20995da91c4398a41f278208992ad252d5875940e164c7419d291ce11066995b233e5d7421c0004056fb744f4402fbfa68de0e33c9a8787421786199f79bd24acce150e53b3703ec23c8fa95c0cb116d6e714cd28a7b0c03006d2489c6c3b78f4c97715b703d6449032545d1f81f3e9dcab81e9fee5d43c12de326e22d98399ddbd0473ee1f6789ee8db5c5e3164582242d8311ece391c4fba2be1c194ef37e01a4340d01b0670d83306e411c392a72161434f3c7890006792dde84c20800100ca0a9872276331ca2003cb36a011001100420000200800002220bc0a05d0100007298830a89265b2814451c48a1c00e15a0cc48c10840200c80205a010318080003a88310ac184460c02305f11c02004011302e23a452c2003e010800008020000088f849361fea9e056acf3d844083c0)) <<< 16000) + 0x10000077200023860080200805e0502e80800013082e08c088260b213805fd7f41ba110c1e00470796152818e043e2a5bb2007e07dc4b0230c1f0080000541804fc5e5c40d0a581da84a0087b2d08730117baee26848183e0108002e8d5769c04db79948044183c01000007c20002d6416c440b40a0002c420b21a0004f33630091d8ce285ad3e2f32506562c192460de099bf91e091f129952c1d58a9d908004c383e010c181739305ca24d396caf341493655aafd05dd9ae49543152dac7b4157203d9e0f63999235a53d48ed000fedbe229f77a93d684e51161065b0beb6c0fde2b140841eb4added0ef5ab0316d57ddfb9d655edb3e8e34aab22fdee4f94207621a067f7e73b4834b7f4c145bbc6b70d0f615e9e918670bcb28149a88b0fe1c98030229d2561579a6d2cb7b02b4e2251351c810fa1f8c82fbd648be50f27c0010e597dc5925bf91fa9e7c73aba170adfd1d6795e64fd4dd34e1241cf03440002ee90580d02b808001d4c82b168154840a80a000fd22088320019e438440355722bc5185ade33e3a23470f4a5ca7d4ea8b4dc874292f9030ee2ba727e4e29db88812cec4f06240a1a1f96f6437ae799ed62d564f09501cf89bae1b0bf142e4d5ecb06e9abfe5bb2b8e205d1865768c80004ccf410153d0fc9cb1cfdfb05b73867fdf8a9056789bf9a4bc1da60798c2c353b2e7e04cb8e25d645100062fd08b9e1cc0fefd710580d10e44a71cf4383db06cf106b9f422e77f8f3868c53de40e40e4c475b500a1de0e19a183b06226f49d164f37cb183d0764d7bbb467b641b00d67d345f04c7fbd844ced9a2a1a440001a4c8098e81045400840c414cf60a43bf453ce94490f43aa785e1021a5940ab840248c48830620660420460228208200864700401a0720bc206db1e2082c910a4dfe61b3c40d8feb9c5e84c08b50612fe3c4098f761a7074c06f71285b36c505053e6c54c4900bc9bfb249860112aec86b2802825ac2b9c90384901400e00008c882892c1409609e3304e0d82682c1301701b1996417450ecfc1775c5800cd54c3628063ee8a9f920104001024600ba4491aea0004c484201004b01d8c0681ebec206ae309e078c1386a85d3420602f3624e300bdd063560c0866fcfbc01306108040050172da5d457118676c798a95edbdc6fce03464b32a01e135e7a6000000000000000002109c59c4923960920860a200601fcf80c3edba797542ca836f6efbf76d82e7334c42d15c6bf86649d98f8ee1ca4897fb21019343f5a211d9495b8285013a977588106794b9e6103a1ef72d0cc0911975c3b28242e58b3a0504420ddd1009c20880215ed8d4bd57b6352f38c056a6bc200e71201109e51441020819410a0a401e01c84cb693bedc9e6ecc80db5bbe8165d4b263606bde807010ce25d0001cd200069e400187c8250aec6005b1f151033af46c0cc60b3f70c9161829d7ca6e03004041ca0b8c03657ea26c098308402002803c1c04d4350b2474754f9e8c70ca87ad837102943302c24b05305ffd212411f485cec809830880212f00abee431763850b60bf2014cf3a3768bb94ce770e7c100a0000000000000000000000000000000000000000000000000003289239418e18811208409801600431de085a37b93ea691fbb159e542743393d84c40936b6e3ddf32f8965ac082121042a7bd97f9c9e7577be84c1a7b8f973f1969bd9306f019d265d0003dd2000a66412414000d5a41207784ad445cd88f150b6becd038b0f40c22c281250b5c960e0bb7e9304cb01b7057268080cea5fcdc009c408402004203af6c6a5eabdb1a979c602b535e1007389008a5e0157dc862ec70a16c17e40299e746ed177299cee1cf820140000000000000000000000000000000000000000000000000006523482062c2202142281201300030180200d978055f7218bb1c285b05f900a679d1bb45dca673b873e08050000000000000000000000000000000000000000000000000001944d20818b08808508a04804d00383584be4faaf229aaf7d604c26882242b38be8b14afe3cb5a59960fbba15b01d45856da4b82b09140352213137a2bd89f7dbe275c5cd80ce632a8001ec90470900036290460502280800220c822068005ca481c84e85085601e3af24af9880c0fd6d0d4429f0591435741020a6e990a60a0502149bf416ed3711c150b643a799fec9f460141e2845d5ba5bea0c01bb070953d6650d81674b5d083db00681008b180fd7fc5694d2b03824c9c90f81e17a7414a5a80618ad0a99f8d30000000001089428a19a09409008e09000a0075673e0f8b8794b1a2d2c6dc08192d371cd27c10ec9048b82050001c12086320421100026b90131902086800772c8202080fcf407c7203d2901e1280ec440741a002280200d19064611060fbe4bf55416efa8a9783e1672e837a2cf51a9579fe6d864be79a2d249151ae40a5e529b33d312446d8260b8348c766b0ab3764059887692d0b84d551c0d6e7ffed8ac0705922a9d5862bc83d8320b275a799a8b747fc91d92e6d308600ae6edb629cc82b1a1195e159d5ea45f6ef72057209e163cb81e38d326f02550a0ca615ed740735646ad11cf7e307059dabb6b4fa67a147fac707bcda1e49040ae4a266658fa1ab173737e86362f89a73782b776649fe16928f6a229d0f8a0ae1abb307139b2d44b3ef9d8c8d0e5dd80d63dd22df4ab96acc869e4688e672d4bc33c0b1e8a79d28921e8754f0bc20434b281570808b18c10c08508208900500f378a2494572d9a7c42e4c615612cd680569cb3d6f6a839c5)) <<< 16000) + 0x1984ca07203b46270251cf0372d11d6447388dca2a3ae08e5b4ba8ae230ced8f3152bdb7b8df9c068c9665403c26bcf4c000000000000000004223072073431830c3142081860d61d32bd1380b2f634bfdfe5a8e4e0201bb3d0be9643d6a69080e08c4dd1a35f0db81f8b7ea6bb94a8b2a8c7be6033853b73d7b866f1836d189c09473c0dcb4475911ce23728a8eb82396d2ea2b88c33b63cc54af6dee37e701a32599500f09af3d300000000000000000108e672d4bc33c0b1e8a79d28921e8754f0bc20434b281570810c1cd0c60c30c803e507a3c16931880d936441a66a6ff486bbe459feca99f1c0cefc3538eb63b274e254efe6de0b309224c2e5c0602dd700f17bc8e6614994abcffe857ec8c251f43180678f8ce2bca1a5085d0004fe207012037090004829e38ac974483c946c906fc33318bbebbe3c582e6a9cc7eb96b81b5582a892fbb068119a6a8ab97ddd49341d2845846c55e3133e395920907e5ace51700464c54582db2d7ec1b62bb4e433bfbcd4ea57edd7f1c1242d8613a0321ebd9b953c60d9df9c35e3c5602596615120302024b114d9d799eb295b112ab515e284517d2c539a60ca6dd61ad17ca0eefca6449d1bfa1f144bf261ab9455dff59337722239b94e1750bf5ffe046a42f7faaa30ecdd1822e1fe3d90c6f5fcb9bb7209dde7152025ce4d06fed0ceb84961d9332edaf4e9b688b236d4684dc3cd47f478079773d8799d254753ae2de679f09e3d91a2a33af6f400c0ea2ccf3e548b7bb913d37faa28ce9a62b38be0a109ec9d90f500b1de35c1692a1c06e29c996e1742a8e6a3194194b11d5674b3b970e13f3de4108f03c4087522c56b5a103e72483db1ef8f88f90530f1f2c7d5a0d8a54c50cd636aa5830dfb8d81b92301a794603c27816d1aa045b7ee31b382850e9ccf00ffaaa4dd8c5198ac6ee5f479f48e4c2ed6bac61c575146f241045094cb309ee0e675449231a9f24b5a662b8b4768de91d28cf085364351e25db34f6c2e1b9c84e09acb6c52d73c3f57221333a474701ee5273ab814701a13b43179a0320be8941cce97bbefb0dca4542426d4b83826a6b5e8b0bc233be448cb30185430bb73b45afdb05aadb9e17ae80a4447900024114148801b848001f4881b0a80040e881a90c0d0860663303211c0e0f3deb0a14200e25121140882d2590c7056d1d45c8681cff2f4d600097dec6ab04c1042010b0b49829b521041e0085854423c7b4e01ff737ed9200614401608066e2b2dc48083e0100000cf200026e40c4360601b02f01e91531facac908735493b0e0149d400a26083e008800008022835db70c4781bb7818a6004301d385019c339b32000e004000030080007e902e0981684e01002008906236710a0409b6405ed2c007b41b0448037fd964824081f008000068902101000091902c0d00019c1c3342903bc181d870cb8c400491b00751008c707c02000015e40ac340541a02909009028001cd48011909028390139a8098c404a5a0242501190808874042330201500f8880781400561240262a8805bed1ef78405c0b4126e31565ac664fc0b2c59c152a8a43e4541c67d00000000000000000000000000000000000000000000000000003388c10c08a0880860040221bed0b23acaace9a33910a474a143775fb1a954cc0591f85f3f51225c7e04b872d17efc8fb11cf2b2659a504dbffe98734f1da7c3b9b14ed1b5f97f4b534c20c1f608b5453d4710ccde221e1dd8cbd081cc167c7839088c3cc20a31a7a9b165ac8f1ff981f66a2d94f8ec8379b192d23a33c6ec57c005a800000000000000001086600321841c31821421401005422cc0e3d9d7a2ab939e7b4d19212d27cfe61ca7f8042d87813a5aaf872f59e4dbc867472116d98c27884b030d016b4ba48126aa26d2de38807b1e0c241c00f221f8140c000f083403020007f0d098a88330c1280424719ce5cc631245c807f1953f1430179ef689028018463942d3200017c671b571c002d74298a80a3041400a30c4b9689266165d7841a2f70b242232a30ca60e247bf03082c74dc9c48938e000f71fbde41000c02359d13801280430905a313812164941f0298b441101bc34188302015c3051f2c08c6d6cb15940000b71b032600250080000a39c32c11432490c2d0a0626540b240d4729248c1cd7fd5fcc0b1decece0a9c8101b443f4689043159a18a470010fe0a6ae8002400861829ba666ae59604380a6aa6120b4627024592501a55790308014792bea208aaa127d56581193c8e4c8500002dc6c0d800240040000d0100035c2000ca24074340381a01b0d000405901a1d80c8ec0606602e23aca2aa0d3b22f1bddb29f1d906f36325a99efbba1efafa03b00000000000000000212158cd6754622f934a239a372c620869e614c15a0a1400000000000000074cd429ea1a64a7b72d907dcd400000000104bc02afb90c5d8e142d82fc80533ce8dda2ee5339dc39f04028000000000000000000000000000000000000000000000000000ca84884083883023000054500401b452a14a1ce8144a4346965b9248ef5f745712387d41955d14295e2e01c5122c7d733cf90e1010e685418a0021fc14d58ad02048010a281da9c80d449227001ce4028705a31381212393f2b13314208be41df4f4481198c1ef932000016e3606004e204a010000180200068840584402a1a0140d009828048040010be400491c800a979011390081a803cc401c5a00d2d00614802c94014420091500408801c3400c1200501002008006d78801ac800844002020000100b0239)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 35 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case15" = "QuadHeightCover18Case15" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 35 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case15 private def zz2400:"s0960"="s0960":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case16 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l14 l15 l17 l22 l25 l27 l29 l33 l35 l37 l4 l42 l43 l5 l51 l63 l67) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![l67, ![-0x59514ba00, -0x2ff6c23cc0,0x7c8ab0d20,0x373acb110], ![-0x2a9670cb0,0x7c8ab0d20, -0x237cd2c555,0x599664816], ![0x16e3600,0x373acb110,0x599664816, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x1d40a3ad,l5),(0x4876f8b4,l4),(0x185b3836,l11),(-0x34e14ad8,l10),(0x11e1a3000,l14),(-0xf5682128,l17),(0x7ddcdc728,l15),(0x36b36bfb0,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x11e1a3000,l25),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x12239f36,l43),(-0xfb7b95ad,l42),(0x2cb417800,l51),(-0xfb1e197a,l63)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x7ddcdc728,l15),(0x36b36bfb0,l22),(-0xfb1e197a,l63),(0x11e1a3000,l14),(-0x11e1a3000,l25),(-0xf5682128,l17),(-0xfb7b95ad,l42),(-0x34e14ad8,l10),(0x185b3836,l11),(-0x12239f36,l43),(0x4876f8b4,l4),(-0x1d40a3ad,l5)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x9c08802c602000094260900b400c00000000f0049006000000d02803cc03000000000b00a4010000005821013300c000002c13809980600000000b0024803000000006c0124018000006c0900c300c0000032048061806000001902c070c030000d0082004c602800000064240730080000034088071806000001506803cc0300000006848146010000000068b033004000000003207100400430901401e90040000000a8300c601000000582101e300c0000338a203618080003e108640d9003000000000a81c401000000000a805200800000291081b18060003c1082404d00300000e888281680100000004414093008000000003c02900400000000fc02c80300000000780164018000000003409200800841984403d2008000000000e01480200000044120446018000000002406200800781083404e200800740d02101e10040000004414018601800f02105003c401000000044220718040000000011038802000000001100a40100004386700d230160e1b20c800d2200c00001083200e4c040008386c803486030000007212037300c00000000028190020000000011024802000008808810e60200008c321101e400c00000000340290040000001609018c02002b0480b013a802001502705006d40128814208800c6a00c005c0a01c0175004000000004c0124018000000442c06300800000000e00490060000000012014802,0x1106803cc030608880c202e6802831c4906702934014000000001a0710040a20ca10805c10050001506c240588018000000000d032004000000000a031004000000110f014c02], #[]⟩ def dynamicCode : Nat := (((((((0x2c90c8276796249ddf0b56f424824746e69a3070169dd1052874dc154f682473532bf8f61c007ca5394949c2090021a3cf0d0689adbcfab6f38157e4c1d0188a28a24b20a20b18b0cb04801c020080368aed28527439a480044aa200a246c93b03d069000112a8802c82e91bc93014414bfba1c40a1039f374e50586161f931982c0478cfcfb81c8212804000077080017f18234c1d5a58103ac6edd1af2c61f631fff048cec4748878600c06e8b028200a8ed84b74260c230080000a0904805f18a3d54ccf006e28d050a3b56a2ebaa11ab04205a986a273a7ce04ba0e19e56eef57c8ab5d1c6003f7f2b8bf7fe64ac2800043b68b4369268e0c0090fcd1ffce2866881c5e7ec2fe5230925455a35740a9f427895b61ef027144107c00017218231686682e10b1c12edabbe8c81c4de444c20c91846db097b3881896ea518274b0c75d2e234f450849787da06890414) <<< 16000) + 0x1637b090b00b700924420a4821400a288a850ae03481e7b06e67f2c6993586f6c918c2aee35118079a3c8dbd9410880200002124120172382f30a47bfb4065e69d285a7b6268b6091dcec91c40ae6c4d45c4da2c730fe070dca4f80b164ca3a0dd99414520d602880c05eb13b180371b35e87892e8568e21800570545af4def7641144e16481526b4e9de27152113014827386258540000bec82386811834000ce6404c3786b1fbf25a006140b06b2690244232fea28a0710aad449da81843671f8f6e03043d3fe8a60041aca47a61c010030a693398415d43a2709b0184c01891470cf5502600cf857135244b6bed928e909eac34b747108a323d782deffc5fc441840bd538944f5a514db6206088d129f00dfa5f53d21b14030479e19828803da474c20021c0cffb563d5720dc140dadae3f355fd0bd2522d2e642fc32e70c4e0b000018a90451102208810c440840200056120823bc35bb9cf2637564541032bdea5ccc0d9eaa3849cb8f0b21b9b800408916f3686d81d0586080178f10d076d5508120814ea93619416800d709ee3e90c540806ec3fc1c7766b91823629cdd8909a8aeaf30b141d8320000a98e10643106f304c302a2ac51f5804060a0b07e4b7c1c3006a4e9a3c6f40a07b9fd97228ac201d403938b54e22a44c181163b8412180d776907225a6163be790eae3161701800008948201080fc5607c0a03d0140deba6302c701c2b0b01870250c16c4d9554470508ebf1277294400756c630d4a1c06e49f8f6448a00ec4e9d3a9550283a0a3fa5c9ba7c152b6b138e1480e30a41463076fd84938547387b2d0a18bd3458c57d123001c4508b6a3050016be55ad4488249fa413cfc41008c1c36403920a509f483b12280a6d1cc9c62d7b20056040c28a424a0904c2512a3ef738a1a1b4c69bc89181fb645a9460067366961e500240080000889822b056b46603048b8518dff68c72051886b9c0ac290197cf3f60644850c253f73683b61860a13482ccce1810b3a62f8c901600ce4df729098600612c0dbafbeee52085a05000022c20780b814d2f174cee4091173056711c400077c34e0810007b39590704014fbf5f2102119018ed60800b11edfde82005b572a8194a0309402000035e40684602e0b8158e2d57aa184c2440971bf43cd5e88136aed162ec6e81020bea62ac53194208fffa6443c5c428115697094c03b850404b3cb16683d2800b7292afa3cc000077cd9825809410396648a1901e2792438055d3d495b02e9ea4ad7848248c50a48a2881863042041802181001006d930aec33ddc1428f2e63abbc48af2da0e70916204ce7ef978286137ea605e0619a2efe19cc40201cfec19c820808393b5483003ac846a4b0869102600c0000f6100030a2000b1640034e0d10009a7ec8001837a3b3feb19460b1586af49731c1c54e3c47530604eb20507fdc1403a2d9557f704000067f8631800063804ee68d1364041500e2063c6ded25f68814005e69ec001c5e1f64b75d4c709d67589d0b51825faf493550c70405d4b96cfd18100179a7b0003009c924f0903485010540380001da20761a03a0901c8080e00406e02000437206c4b0352581a10c0cc660641b0310dd1149e15cbfff3636c0819484a8a14b8a0c1420082dcbb39f4bd759c38069f068fdf91fe164500fdd2d864d315ac9840158b0f4b21b1e8720414092186696f6b8ce6443f30694377e0c320ce2d44825610bbc5fd42d086343f07469475ba78d91457f217ca4859016001b63141df90cb7a60481844010a0ca2c2b1fc2030619b5250a0bab8c7d671c200374ec5030029b85b9408011856b1f8098308802000027640c0172421fc37fb248680cf4ae9120f035961c430219173e700a006037dbf818046f3b3c08400243c4d64024e284401000016d30080100401800e841069f231080c30ab0cb4304b83cea220800909dbc60902084021420292eccbc7084ae2050e203438b912f340064da9e78c01efd072d425082100800008310001fa205e120290500013b10271d81706ec776ed997b8e2047e09d985069bce074ab1841080420712d89d8dc0a0851a67889c10601a0331f820000a472cec0800598d41160ca104a01000011a205a1201b090160480ac260540a0250100012f901a2180b86eceef0b05ec26511f3033733a35031fa43a8e1cc6dae18e6ead4f8e1cc6dae18e6ead5011d2f97919cc9f23628c311b2e3aac1b810821004e12e3be602c836398fc41c0b6a59c54217902d460880050030082fba41d1ae3f2a9721ac12fb02d0b39944263820c85eafa74df7b72e9a081f41ba2ee4001e03191133ba4999a745c5d4630c033d605301ef26cb178dff65d590c8fa1016a84232805e189fa10dd2187f564c3b40a0061152da620c62844010808008022498d7ca7ea08105f021c3934043d8bccc8023102200800005990000f020520a028058000f490272581308e0b332ba9824a64175451565d0bf6c929905d5104f65637305177137c1ce331ea7af86c200000000000149c960a123e344d186f4bd82a648c30c304082380200084af53e9c8984a511931486e2486edb937e7e64c3160470a3c30f2cee409a12a837f660f9344959f81d192818dc6c490ccc4794b70b146e97b4094040007c24002bf0800a241ab8a4818d18c079032aad27e4d2c5f4215d1e06ce52635a8a6800000000000000000008cd6200210c30c18818608c00a0200211fc299c8465323fbdd6e6913702ce4d8b64a1d81328d4c70c823500026c200337c400b7d4c048cc4c89e95a0c659778709b)) <<< 16000) + 0x6da1976bfdfe9aa218a10dc9898964f15007279181fc4c7a9df40b50e38f82833d5f0ae85532ad690802061090194be64ef2439f0c0116afbc3d18584599d810018a475b857360604d8882853e445e3201b2b20a085fbcbfeee20512c2a1042f1cc640ae6896f8924c8a14404832b0a7aa2f5db33ab536578e1433a16e9e0fcdd98bc5d1f462842e804a499e604ca62d76a040a0d66fc8eb3bee2d241cb8d5bc10336bb2cb3d5e0b99c01f6b40a0671bb6d7fd62d7bb1999ebf0551b5d7051d5882445f8325129c5612f498ce066145e0f40001cf1024198118cc088560421bdc2b499eb8a324be253ec0ad958dcc145dc4df0738cc7a9ebe1b0800000000000536e41acc90e0519218c1880820860040007d44c3259f50dc9554d5c7120d7a02eb46c55377b15a874024bbbff81cc77fbb32029074b44173d852ac8cbe2c901825ebcefc9eb2a1e4e205966eeba1bf05785202b20000000000000000000000000000000000000000000000005f5577217dd26931309e2f37faa279dffbe0380ffc74b0820000000000000000000000000000000000000000000000170880840420410490080060100b8a008034000e0c81008c07c278501df9d348913062293561c41107d699450c30a6503210126b4e9ee8305171b183b1001472e6bfc0271022008508a35406418e20e698b8c2486db2757720a182bd5e7d4202a17ebf470609fdbedf90481766ba1560e0009e2f28c0140811004000066480f06c03425228ccda900a489570a53838e2093ce6c4a4864545a8e2880129070d1880128c11004245262f73a809125e0c6238282001e84800204007a1200280005b8d800901dc0acf70400b0c11002000050080013710005d1203a02000cb4203802818eef79872283030ad196080d52a40d362808045b75688006243f45e8128811004004c17c75daecf25101a2c2805d460c9ff2262c184b03a7e02181b165dbc884a1042010e3a02ef13145ab45038810b659aa604658901d834815084f7b1228548a1060de72ffb06171002e3f7b92bba302b4d9ad2418d3170a018ec719f881345a23ea8fab1eac134677bc24e10740d0000260301b9a29157070d50ecc9922844f2129b70c2c299f6f28808f8120e98307572dee241304108042033f6a62ddc70dff36dde614273e786ff830ac3a9a4690c14978338b89001ba240d51401ba8aed142708220080000b390002b52036120006652034230190d00c06c05c2602c0ab3bbc2c17b099447cc0cdcce8d40c7e90ea38731b6b8639bab53e38731b6b8639bab5404738e4c8363a029a96715085e40b6f983d6821102d0914604504700603967136501a31ce1096320b98ebf14ec2b2eb71ea092d67236eb12003ba069e3f67e1cd91048975642c81428df0bd252cdb7e2d46350b8b431d9d8268430dfd111b7c3051f9c1ebd081075eab278a00b2e356a90494508402184048cdd2d6604f09fcdcbdb2b1bc628811592c64b904dee6019cd7fd38439f5204f0ac819bd9cb5de0a89b226e92338e204112ddfef39473576beda6ebf8d85c205a61dabec3b2e26011d54a6dfc5a82fe7febe665c01f5286fd7f9ce0281002c3a1e4defe59a3641cc5e05d9d379a848bfa79f0f949756a0a9f9d5ab1d30c41d4a3f81b5bbc3c64d7dd176010aa6c597d9cc591ecb06eae9a53bc619ee6c0c20b510b7d240830b6c243103231413d68815e5e33210c01e846e71a04a184201000010836387f11fadc80cb929d3905840e0207900c2392f086c060d71c16bc40251021008000085100074520010d84054760283b0130dc0300401186886edfc0041dd0499bf1403461c0ac0500cd257e4284818420100000d92024130110500802c03c070cd022908860d802003817c013c44aae101d094a06810062b5f482046203e0100000a9362266a7e808c19637675b900e58464011604e9f57300c0537bf0dba0128a10004000041c80684a85a2fcfb645151d93fe6000728f70c1023101e00840a6d4dd388306031c4cba580bedd48943011f8d2e448120810004000036480606802c1400038a40010cc8050080017348009349001a903458145ccaaee2197847fe13fb0e53a60260a08fe098d8c6a11feb3f9c019648ecee6c0404001a5db31992bb22184c3414ebda500028006f95c995a241f79495be6ae4829a50b0c000034bb663325764430986829d7b4a000400264520f803d8f0c87713cccb8d91d86100058b54a84fcb170b2999a76e9b27291f526e61cb809018f853cf51f9862045b001213ad081f4e37227ca59884a849c0effe2293ebf61f6df147cdfe780000000000000000022ae47cf0432b91f3c10c744eb966a1800000000004eaaee42fba4d262613c5e6ff544f3bff7c0701ff8e9610400000000000000000000000000000000000000000000002e18e10c10a1080880005a96590604303f3f2fb922dbba15f29568d9a1132d1affd0350a1db8bf2c0cd49783100e3089827a1cf1bc75ff4565dbd4fb10dd1ca56f962c727c7a7ad540997bd68a1b13b61db9f3821fc8044551edd400beb67be814ef205532687fd817311b7da561ad6eaa2b4ec4de3ca26b524c101c5004080b01ce4060007270e00070c88d285231c8c18001c9c38000410011e1a30000000354abb7a89028e2056028e3e9b486408b8038a00ee00af2fd10180023c3460003865536d43f0a30c180023c34600040000861c468000e00232f98e271a8190e205c0400001c42000716402004001526401c6400c220050900200800c04001f004008740020200001001f661)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case16" = "QuadHeightCover18Case16" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case16 private def zz2401:"s0961"="s0961":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case17 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l12 l13 l17 l20 l22 l23 l25 l27 l29 l31 l33 l35 l37 l4 l41 l42 l5 l51 l57 l58 l62 l63 l65) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0xc305dd564, -0x59514ba00, -0x3c2106ffc,0x1ef13bc], ![-0x59514ba00, -0x2f39196658,0x7c8dc6f80,0x363f512c4], ![-0x3c2106ffc,0x7c8dc6f80, -0x237cd2c555,0x599664816], ![0x1ef13bc,0x363f512c4,0x599664816, -0x2cb417800]] noncomputable def hinges:Hinges:=[(-0x1d40a3ad,l5),(0x4876f8b4,l4),(0x185b3836,l11),(-0x34e14ad8,l10),(0x20e2a2e76,l13),(-0x54cb8ac4,l12),(-0x1f3830f64,l17),(-0x1ae3cfbc,l20),(0x1469fc16b,l23),(0x1b2329b81,l22),(-0x2cb417800,l27),(0x2cb417800,l29),(-0x122180f18,l25),(0x11872c892,l31),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(-0x3b3ad6d1,l42),(-0x11ad30bc,l41),(0x2cb417800,l51),(-0xafc7a05e,l57),(0x1ded27a,l58),(-0x842e5ead,l63),(-0xcf89e6e2,l62),(-0x9f4a40,l65)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x2cb417800,l27),(0x2cb417800,l29),(0x2cb417800,l33),(-0x2cb417800,l35),(0x2cb417800,l37),(0x2cb417800,l51),(0x1469fc16b,l23),(-0x1f3830f64,l17),(0x11872c892,l31),(0x20e2a2e76,l13),(-0x122180f18,l25),(-0xafc7a05e,l57),(0x1b2329b81,l22),(-0xcf89e6e2,l62),(-0x842e5ead,l63),(-0x34e14ad8,l10),(0x185b3836,l11),(-0x3b3ad6d1,l42),(-0x54cb8ac4,l12),(0x4876f8b4,l4),(-0x1d40a3ad,l5),(-0x1ae3cfbc,l20),(-0x11ad30bc,l41),(0x1ded27a,l58),(-0x9f4a40,l65)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0xa306784780744803000052885019230140000388c2036180800001941300e8c04000000070500e601000005110406c30100007c210c81b2006000001e04c044c0300000ca288050602001d8410c4039401000000291081b18060a210618803c50058086904080e4280300000004414073008008419844065a008000000150902cc0284066044003c280342833c22804614018000621908806a006000000000e014802a088906080e42803001303107c048401000a421864065a0080000008824058c030000c84c1404c801d2843c3280461401800e81a04203c2008003c0841a0271004001e0420a0078802000002105003c3010000000000a0710040000104210120c0404606104205308028000003209024300c00c62d8700762008006315c3402b100400000c22880d86020000628a5024c301400031c538126180a0a11021300c4900505288508c0324802800006105c04a301000003182201518080000114310208c0400000009068126010000000341407300800001a82a04618080000018848070c03000000000d80c401000000002400b200c000000012809900600001341200c4c040026842090064802001482a04803d401000a813828036a009440a104400635006a10520210019a803029828826012d401400b81403802ea0080000000098024803000000088480c6010000000442c06300800000000e00490060000000012014802,0xa44202c601800005111402c30130621a1860171a00c000331306c09d00300000000128164010000000008c06200800a21b042047a009470cc08700bb5006002a86c128092802000000003400b200c00000001a80990060000011024038c03000000088780a601000004804401630100004a1304805a0060000000078024803000218f0620488018001087631026400c00000210880b18060000084110238c04000000441201e601800000000901d200c000000005006900600000000050188020000000000e064008000000006406200800001a84e036180800000000d40288030000000b0900e6010000005821013300c000002c138099806000014848004cc040000000b0880a601000000002c009200c00000001b0049006000001b024030c03000000c812018601800000640b01c300c00000032120398040000001a09018c020000d0082004c6028000006e1100b300c00002086204718080000000003c0c801000000843201e6018000000000d0320040000003a0a05980400a514c4302a90040000001488816601000000001200f200c00000000981790060000001915028c02000000c44202c601800000b43301f300c0000000050079006000000002c0bc803000001887603e601800000001100d200c00000591980e98060000000031034802], #[]⟩ def dynamicCode : Nat := ((((((((((0x165d771ed6471650dc2f26b5984adf56de7216486e4580019400056a5dad12004526472aa24c2048010c3300f6bb0686161edb3c52e34a2673019489850e08ce9ab4d041c245a30e5000467b944114000e139ea9a33861280430c8d44c9f26830b0edbd0ac5334a1f464435a230a0f32411fc734801d2fe3146340212daeaa6a400094c5f00b5830a00400003124000c8882506c12407449493916f8690cc59d6c61646c51dbcde58cae75a5c8920183084eda40077532c09028330e11004000050ce103e9c2a64b609207035f3724c983825bd9ea6e02879919a43522c48f299e4de40bcc0918a08a70df14080f6574eb281802f42172d37408ab324101581400007c483d88e073bbd9875058c500a65d2c91a0eee41db1033452c64291c006896d8dc30007e7a647c40051f5a60c0288a4e504601000017e39714d316df9003fa401001512852051c52031c31c11400c05b5a9ea002873ead1dfd2228d165f34139ede0b12c31a0002e841e89743331006a9c618e3043727f922d902a1603a049ce8e2bf153c63f6d8e180a17056c2204111c05d4e6278809de954204cb1404d95a7b8aff0e03f0f1508f2e028ab596490b00b1118c0d0f7b805b5c54f82540017e1f8e66c29670214c6b396aab1be723a605b9681a776d80000000000000001e99428e28e18808208a00a8b53525cd74614924bf5c91adc67bd1225cf66ea76a5e0154c69a0318fe69be3c159150fca2aff5a1c2d85d7344e3589314a6a0006a841e4540f022077090002f1107601d0d54c0dcd90e2b87de7b08408202d6b3d141976d4945c406563516050811ab8477fc104ade50d3b0e022faaf9f82aab820220046b8a9f04a8002ec307ea7a6c80bf0fc733614b3810a6359cb5558df391d302dcb40d3bb6c0000000000000000f4ca1471470c4082085001568fd621df9fcb1bc24be92c7ae0abd38c5efb8b070e5f6d106983c871e16d73066602228a68d9d9047aa2de86fdc6c418c53d0003533430afbb3594050a2c66451380e2aa5e6dc46040870c86336c90185b704118e20438bb8d398140539dc9952038068f00ede80aaae4101300828572cb13f392afdea26f6f0838b895a2c0c45) <<< 16000) + 0xd83973bb7b3c70cf242778e0851d919b2195100d23701e3e79dbe29aca78d1010b63cd21361d2a243ed5602808c78f83449f3586ba451980551f0c07553fe5c3453bdd84db0fa4ab048694c40ae1b000030e20009d841d4640e832073150390681c4140014fc784ac7437b0636d4c94c49102916404bd94d108a74c80608610bda84c65f19715482053bde4b09526dc2d5b1c00801053691344229621a4295f8798810626ed7eb1e42a7e1f2d0872b4b5f56226ec816a02d450e98d37146e31002e068809a16000030238412f2566aca48605611297ba45c060a16c422e9b1218039c64b161880281eefc2daa0e7840395060075c7608228c2e12b958bf8544ede66619920abdfe4427cc21d5c3221781a00008ec83818c1bca40dc2b06d0503600a06dc3a3721ea420502e49641bac1c2a343e4e736a182c49b3b71950142330bc8e757e2003641013975a1c0650a616a829140199088254bf545510498d3940682aca8342c028696a537660a094546e7f47d9251200d08dcef163ba05e171be68c00455042114299f074dd9a28a06ac029559607070a78c8130004c020d2c65a2127f0d29165a98da4a29110c621708201788e38f8b1e14d251660700632574d90300195a67902700240080000b8906b0583502c1141608803a1de363db5d72286c4ba0f9e5d0614008f12f9e5242269060a518040820ffff693c200001d53f119c40025a4f32c0a0c006be7bb917115d9028540380001e020d21bb277f0647dbb1873d94280591ac61051a002458aa6c13f5a3ea0a402a35b6bdcdadf14830484fb7ca6536657160000ee23039f56401001890df2104fced482a06c449729987a82f646e071c3b0600001389068158338ae44282d53b741ef204cbc7a506f27328302eb17cf0f7010203291937cb301c157669101373c28028d07ddc2efa140113ccfb7617540142fedccf2854a18041ca0c00e000042a40880764ca94097d0a4841067d87a76c4d1428069177546f048ad9ecbf1b7b00a203484eccdd861861de6187f0430c1035fb223872618060b536f97a92002014d857369af58320a0b80b142855f18caacfc916fca8bb8240a308078008cc5bf14303efe18e9af86193c629f291f08041c81490cbd4300430cd15f289401400a01a2445e9630e505a0500001f934478c810255db1222cbce6b76f910277468e38aae941854e609c124081057c10ce4bc041321cad3e65c0a0266bfffac0ea00a000f9234a2f917a3961601400007cc80032f1001117344348c62bf1ca1c021ff3e1040e0002082842842b236f49692215cd8c9cb080cafe378ee05046d3ea3f3e241bc9771fb8080000ef693d1a410940214424ef0bf381c81c00398cbd5850a004d2501682841d7d4f64a69220efd50abb9080c76ad4940a85044c2903b2442418174c3b2c90e00001b36df08b4821480a000080cf1800f0ce9f2802435153f94e8cb880efd454789c791c2be7002d393e4400dfe0ed8daa6040042a4cdc9e147e830417016000062483302c1941764a18802ee1d2480002492d4858c90d49136b8a1b3f1c926b11629ee9c0c6eb285ca46479cbc4899417d8f9c870d200940e111200021aacc94652084e028b26214dbf10fe0b20171f8c3e01471c0056531c040b1928d66d4f8c4a18fbf3f509bd8a15b0ba62a2a6070c669c4cf9ce8800003f92b5480200d76f443b7b084482160120000888d9260123c210cc9200006493c8616318aec155efa286901b96e736c58a55e0a994d54a162787396af912244dcd7da6ce1c3311607e7bec480005c95b2971c69042b02059311e98d454f05900ad02ef6e5238e002b298e02058c941de7b289a50c7fddff2016c50ad71a839483038632e2973df74400001fc95aa401006b164b3f558422410b00900004444001154d9000021869820511142e4ab0d6050e08cba33899e50a946a806d00248a825f6770ac0488d4963373b4030432a3560bea0400003db921ba00806a337f3eda0c22410b0091444711c754538287177fd4e783a30c004165bfe40a16000c1504ae922bee8864867024472841119d9830449f28b41b78700006052a6100601c73f476b06322410ac0800004304190040008d4418c06001a70647a2283d8be1848c0002ebb9dc08185832954d10102a430329934d2039246030dbf63853c61f79cee0404764d8805fc040001582747b00404f5e144c278dc4821581024717bb59abff881ab2319c3718104000fb20518080d386d0c4ec21c34e56887e4c480813c00c2bc81c2005684c22004049b8431aa31140000b8f09b00c2410a806000041a403c040c4020610183000800125082f8a8178340ba1205c0902d848168040b20200185d20b05b0572d82b12c154660a81b0530d82906e88ba68a4c092725e82065e4c8457ca75e464010dac08cfde67a903806b8dc74b7218f4c28086161b4ff5ba978100510005d0e100688280202a3bb9929a6506702f01b9fec89093720216f5113bb9157445019c659940f01b104009ac9c9428213e261e465031853cd9d0a0035e891beaa8b20e11804208639164230a1219b21b9f28230e3f911ca058d5ad4d118010454ed4440074d5d9ec0c00aba26ce04449c70880200002e24144560a02b04f1582706813417030245532e4e8d9df13e32a612e49169c4e333b6d37802a9dc840e180f2b516bb1f0b97d967ce5496c44d9dc3abee5934b2773ebdfb3ec304cd49d5823411e5d620bbefd123b551036c32d0a356612ff6a744881f8106afe18913264fc0d956c484cfdeaf0c30af485b7ec57)) <<< 16000) + 0xfc2a0c183beb9a7c4e25644ea660ec3743c96908f18d49447190689620124076300707a27cd1748aeee4e6847728f8c128218bf38690c086d9b63bc504ff13f31408013101080434c803e4aaf9a2e48937b00d091688884e504371683823000dff79560e01ff84dd70600393d278a08013901080400005b08001631905957485d0013bdd2b060226928e009860e00220180200800002220982304b1182508c124070148f51cc60c046e86c21c6043f9cc0a0506331bebd9100907080021a3a58af8b020297f977be9a2e14d485198045732a950e031000e6c820128e10004000042c8001031048090001b2904715d097a047242deca5acaefc439c1c59cd010a0bd12f2bc1e815484c03c4d03963231c80c0108a07099d2364334cf41cfb18940984100320be0dc8ecd5e201a740bc5b1d59d1e18007d273bc2be0331f5f2664349c112aec001015287dcfd0cdddcb8e31c3a42e0023b903c137d2e50682dfb0c40760cd1cd53d2a88780e04dbf07b35107eb6ca60fe2f800044b2001e7040f0a701a05ac0a70e08a29b25e820f05543691c045fa56e3808483040010806008020118074297f88eca0c34814e460481f223b94d023101f008000055191026663a76404128ed1b5082659f0e581a07b58fea5d049050840200001be40007d88228ac110072200b4590410182dd501658040303fd4500d3c83b90200372452601094607c02143059013883882a05d458c1f1dc5718846183c01004301d0c571153f471037b4990881944fab432c0fcfef7c2012080f8040000354c8a101b1a5c50a0ca86d092004ce87720801647b4ba048183e0100410182000c0003f4800161104215e0c83fef442303879a0baa28034c704be008463840010e18601453b981092024e20e15438d4391a01c6ab113002483040010d1e21fce9310c00bb0f0fc3ee7d9e6ad8a9bb1d4c6228508ca07a28312543a0dc5f902f223f440f34e2e4e4c091e2ee78a5f097c4f194414c840f07004043516321c2e3729d3433e97938e34a9e9d8b50c8e0ffb5bc8f80c58682c4fc9140c78fec2e7e43e9a0515048fa2a8c415876e0af0972d2f4e0718ede52fed6410a221002080c1000600085e40014988002fa1000a0520741b90e566e3b2868a4c3ece992d892b8ecf084f5e48c0826fac6b84c8b92f2f3e76924114585d12527140197587d4ce83130ba57d8f8cbfd119964954018048eea5df5e0dba03d61ef73bc1420a6c414bc00040493e4b118dbed0bba54ec0fe800a667c83911b8e12ab06d0b287ddc12c7bbc33d216498e40000ed881f86806c1406e0200115d206a03a52a2c8ae780b5c8ed87ee5723b61fb8e7e5d6fb03000000000009cb4980e16efa268143faf41531c61861821c11c01001001405262617364564be41ba70a0e42b8a2f612099337041f6e520b28b132921192f5df4b57802674101902a489a07c0a00030c20441ba464188909ad1b9dc5c3dff3b9aca000224bee17001a9d7be137869e689aa3755c06df636317d49273716400000000000000000115723b61fb95c8ed87ee39f975bec0c0000000000275a1b95c5c1d9f470a24cd0543b3cf34b6fa8a9d2a2a741551452c4240140000000b0a211c2f5c9c3c530eb8fb04390a3dec1f0f130b345951b04be5e8cd44b262d34c229166d0961f4d371718967b4d65bac4d0f483c0f30663d821250ed44d87edd618ed78d9151ec5d4e7c786ee5709c550d843c164db6a4356b53ee94178c6f6e0a2ded467338586f6503ee510182e1b0b4638608a3d6df0c18e0dd7f00000004c584401003d15e5c55cbde76eab032cedd5606265c55cbe0234bee17001a9d7be137869e689aa3755c06df636317d49273716400000000000000000115686e57170767d1c289334150ecf3cd2dbea2a74a8a9d055080c60ce0090070000100d04aebaae680bdc45c4211990bdc0e3e22ace84427ee39ed7662cfdf1cb6004554d94c6d9acb3f5a1f218d8fcfbe1450f53eeb5310c151f6e1a298b140797925a317dfd3e7e2b7b526c10a626e8d50005372000d646c883f9f4e60c9028e4df219185cb2c46f2aa516bce06842eca074757f2a1e54086ec41d88089a2fa1ee3a74d38efc0de617a8ecc07955ec48185fc00f94a52aeb9b7a9dd47cdba3470163c57afe3a0e698e1d5b8d72c5c44baf5600ec9bbc953efee6bdbde7adfb43d60f4e8000002737f0561d70c6a02b9b0b33c235b2772fcbdcaab33a12280dc7010ef7b3377394e60615c2600cdd5731c7d3379189ecff0c2e87081e32c557253dae2d35380a9d957de68a34445d45b4fc97047ed3e667d18148009c97ba4b9b0b062f1809cd6d8034e318ce454f50000d7a40f0b70200100401d88c0e827045ad7eecd25d5876066248f8b1e05d675627024af7cc38fe9ffa7a7604e64c4ebacca28911eb350b65d9f301b8aecec26f949b180120fa05b79fdbe7a82ec5b02bbc87065448a8cb70fb7d063c3daedea6ff2d4cedce907eedca8a4a89e3d9f4ceffe3b0cbd4a70a004c6c1ae7653884bf10a78627add44b3abcc8d1a0cbb81ca87b3e1782f36b57cbae64808dc177daf25e4e3bc8bafa0d0cfd9c80001538b9db4ee619e3c65b4a43d5b628d2d31dffe138c6eb4fa2a95b2719bd31adb0a9a783c1d9bc89e095840c606e8279a068b06f594073b1c1ba11b5dd92bd2388f744f55cc0c727b44c9ae3e8ebc190ccde5a57e92ed36b00a44ad6bfd7d81405a329945cc00040d10390901c02806c1406e0203601800475103501e5c55cbde76eab032cedd5606265c55cbe023405621)) <<< 16000) + 0xf8da207a4f36e8b79647ed31e866e57797c8eea68d77e400000000000000000115d05ef55c95c0b2d260385bbe89a050febd055091871840440030000040100b5dadf20d88450f7e9002af44df1664447e2947ea438af575781e08bd27e12210a20e34f0dc3a8c6b331f387f6e6739ebbcf9ad3f89e29823202a3c37031a931b3c2fb20d865492541680027a100221420092806161135afd0cd2ace88bc2f4313c356d073109987ead73a571800000000000000000110e4d44cb1065d97630639697c8f48f09dd08fea15a4f4ba000000000000000000000000000000000000000000000005d3670983703d8b9292e26957af1bbb8a1d3acf0935ccd020000000000000000000000000000000000000000000000170c40c30c60050010041002380160f0bb9d6497da3894df17b1a55784520514c4cc7dbe672516c56d33687761aee5b5253815450ba28c8008bd1f18bcfa1a816552dbccee8c09493eae5e291da2a8e5f5b0187592af706030ff27761e37a166712aaaba7d4001cc08029b59007ff23012d1de1629af677d8e16a0400829265dda8a10bdae3085550acd84089aacbf1eccaef38c0033cda265c1cfe80a004ab052f987cb280802fa6ffb76172a7008803abab71431de68042c13f9f576195f11a6b2f01cb0f01b144049471182a8443b485d4a24314d1ad00c24bad5f940a7203e43dee14f6d483c6a852618304f3f4d4438a19a5f179d18225d1e47a8615fc6e013c50c235dfc3ca2d37b89e23e7b0402f0238437b963d7f9896711000365f48da2fc951648e50b4c47adba6d483922a0662493aac75488510042cf86124337088339880e197d446518310641ac1830818f775400807a648b85040009c90880200002ea40d0240009f840cc960644b03101d100adf5ae46a41a60080f7189b384050e881c60c0ae4beb00a9d8d946081e3325c62c23898030440bebdce69e41ab0500ce6bab35d8ed5790404a58e7d3db09596e0a7c32943f44dc858038800180b142003e20401b33123901f8ac56fe460c03721aac404095568ce0c101fc865d8802054a08401000022a40c08701f271842cc3060435c88e10175267f3164820c0806a00c08f9e1409a2023b25334b0a00ef9f77621800686aa4004019ae363fe2200052584401081072956a70640681e5686c11830022551001010094b5de109040112a88004035fff5d9000015223a44009139ddc8400871300e040662c2500c0000e690003bd205e1a02e050003f0102d2d01600b5880085b9bbbecb3e05be2f6168a6a52556678d74a2479989fb084262883843042843002800810537babb4e56e630aa2ad9e2022e638be7aea296d3d15c3349da48c40f22dda2082e13afe304c98ae9c20a14f4645bc800011901100400002e88158cc0a81605203a202fa4ba97182a4096ffdc28454361905440410e766b38000c84046010a21128cdfb018233491c2b5fb0f785e6d2e583053698d370d525bf404042c16a267efeca7804084a8f14dba46542c1001bdd831f30d75b2e1803ee42a0db07355d8005746699200abbad21125b563c1375a56199fce581c80fc1e00005ae40a05404e220260500020e90251d8120c808c440441bf6ec537bf14bc22ca631d1679e2ad617f1adbb238095eb0c000000000000000000000000000000000000000000000000302d6cd2bb8e68165b9bebf8b2205864ae2babdb304524c11382a848a480380280100002006e8fab5f97bdf797b7822519ffaa2263a40bc01947ec14f439d323649a80b7c4f90c1d554415dc3b5e9579e40ec83005de8455c4cf0e57bf398a2a931fa7bbe6aaa0c18152a9a902096025b3577000676789000024403400801b0dc06096ad218300140fab061818495b4d60804d61cd3e20004848400100000e320421a821b3a9d490e133bdb5099400387416b0a01b2bbfcf0406c1ce70d080001296100040000448810048000b9080f96c07807218c4502820c38f63216c0019a23c5dc44026403e00801b09f100e01a0392109e47be2100ac09db6c0806d585e15090307c021c401789902242962ed7fb1c020a37aeb42618400080000a9203a2201c1100d88806804032020001ff20301a0170d71228bb69a2844ff4c371402be74f0880046403a0100161580a888050140260a0000ff341804f60ec04c8e3378ffbed292e98e98b8504ca810cf7e4104c65f3a334d17c038f3b0a114688e97b2c7e74e87deecf8126bfbaa0282a1faa986361cfaebe08826402e86c14a0e04e985a6baa22474a63ea8492180d34298204792c903ab34f0dd3765f7b4aaea5b230000688a4539c3f32cf38207f9728a6104310a288ed99a8071057dbf76e208e57e9ad0142086ed3181408e94363205062b3c8fc4202c3f8072e1100409cc0840200002e640015bc809068044140013b04004838800cfb9c23fdeb6163f8c1542f7f1ea48a1002b33b4380c002778795e68a0178baf48430800009a1dd6806005c69b7f7e80851c60a005186c9ca0ce15a0c209626fdaefc60a052555fc12382053fe51c2a14107b0aa9af60808008a3f0d80200004127d48002b4718290140000d110101d80780f0d99743aad28c2004d55eb76384000f696240c11d4f1b1f1e284000b71b0000002a47d503880b6182600461a02ce99383861001b8dc5484708000f69624060874b8e7d5cc508000b71b00070000b39c91a46001786b76299016718280080000cc100e09006828000cd080614802ca4014520091d0040a801c5400c2200501002008001e38801a280087400202000010019251)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 26 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case17" = "QuadHeightCover18Case17" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 26 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case17 private def zz2402:"s0962"="s0962":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case18 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l17 l27 l29 l33 l34 l35 l37 l38 l4 l5 l51 l54 l55 l6 l60 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x289aa86d8, -0x742b8d00, -0xaef86e80,0x16e3600], ![-0x742b8d00, -0x34b1f642c,0x78b5206c,0x3d2f6384], ![-0xaef86e80,0x78b5206c, -0x2a8cda35c,0x7707f8b8], ![0x16e3600,0x3d2f6384,0x7707f8b8, -0x3acce180]] noncomputable def hinges:Hinges:=[(-0x54a4c10,l6),(-0x13417e3,l5),(0x4c8f3414,l4),(-0x25a6ac5,l11),(-0xeb88a98,l10),(0x4eb7f0ac,l17),(-0x3acce180,l27),(0x3acce180,l29),(0x3acce180,l33),(0xeb88a98,l38),(-0x3acce180,l35),(0x3acce180,l37),(-0x4c8f3414,l34),(0x3acce180,l51),(0x25a6ac5,l55),(0x13417e3,l54),(0x54a4c10,l60),(-0x4eb7f0ac,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3acce180,l27),(0x3acce180,l29),(0x3acce180,l33),(-0x3acce180,l35),(0x3acce180,l37),(0x3acce180,l51),(0x4eb7f0ac,l17),(-0x4eb7f0ac,l62),(0x4c8f3414,l4),(-0x4c8f3414,l34),(-0xeb88a98,l10),(0xeb88a98,l38),(-0x54a4c10,l6),(0x54a4c10,l60),(-0x25a6ac5,l11),(0x25a6ac5,l55),(-0x13417e3,l5),(0x13417e3,l54)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x718a210605168028000a43411027400c15a1b02680aaa00b440cf084025a9006a4064844005d48030000000443c0530080004a1304805a00600000000780248030000000012812401000000000110320040000188260341808000000c82c050c030000000d8980c6010000069104032301000000331280518060000001b11018c0200000a4240026602000000002c009200c00000001b0049006000001b024030c03000000c816038601800006a044014301000000320480618060001a01040098c05000000e4260286018000f4620c026400f08206186050b200c00001e190501d00200320861980f68020000000741407300800000000098190020000000026014802000000000480c401000000054440a30080000000042049004000000002201480206304605601e48028000000003805200800f81e04203c2008003c0841a02710040000e11820324602800006110408430100000003222051804000001484c050c0300000a220818c602000000054440f3008000000000e0310040000000003c0c801000000000f00a401000000000640920080000000034029004000000130b018c020000092108064602000000461500a300c0000002612031805420a404200335006002e0500e00ba8020000000026009200c00000000e00490060000000012014802], #[]⟩ def dynamicCode : Nat := (((((((0x5b8d80005b8d803a7153ffb11dda16082c1bfa7205c80b22852051441c21801400003eb48afa97bb014b69e5b2fb9188bb882432f10967c9bf3c02e07fa2f36d5cc248a475f6c5d16206e142db8d800016e36003f0318fd6f8e4747408ac1bfa7205c80b22ca309304143103242280240c000080370969b0c09c6097ff4bb9050c02b79030c1033d83a63003cf58cb2180061cfe0a6001f008000091901b05db8d800016e36003f0318fd6f8e4747408ac1bfa7205c80b230930414310324228128024030080200dc25a6443ce9825fce0a53143013bc3be3040cf5a238c00f55714b860016f668b26041f0080000929000287324caee63d08308002253c724900a74a9000c1c008959639438275bf85624704b1004005040ae38f8543044d3555001400556e88830390c230080000e710330980e00e088031741b82c60066ff300246062c6f8d40c30016e284c241385b018242c000cdfe60024018a8d0b0a20071e53ec561400044aa2000009918240100000ef903b110004ae1818a13d42866f889128749b41617c0712ee99af3227008017295b411ef28500a20f728ec57c400591bf56e130c20162bbf809653400aba38c945de842bb120f006f92d96c8e4860098000248386ecf71399848a009b1813c91004b06e988e2064aadf2c1840044aa20038210015c6c03040112a8800208edb3776c1c0134b35fd80072284601091569255c2a50958921c4341bb30aa3a446e0610a9038454360957c103029caefdd6aff3bc304032f47153de9f44041b90026fc086d96505007795bf9a98ec1b708026a93ef01a1bf8e4022df681810fcaa08adcd5f64a050f82000005ae40e854072220380d01b82800145cdb8d803d2f6384e78db3862aaabd407941f183544b46a7ed5aae2e1ece75b9d082f2a95d4e46000000000000000003d03a92bdc56dce00b73750d209ced8b5bbc36f87f8e0ce0000000000000000f0c70c7084082050905125b7beb1775b83426986712bdac39015ca8801136aa4507e4c434be79483b710ddb44a004048f8c9d150c92d8ed90dd885dfb239f3a461f8a0ca776bf2cd2e9f987ff80df0a1690a114001424d07c60d512d1a9fb56ab8b87b39d6e7420bcaa575391800000000000000000f44308604504304500401506f03e201410cef20649e262984f67bbbe886632a1553acf464af3edd9c501db22be368045862fb3a18098912c8e283a545f6bb8316ba0f7e2c61363fd000337206c320350501a00a06ab384542f0814e0555102c1c2f02ff829f0608f009bf790142198b345a008013d1ee00ac1c013789a21a050034a6f375455411892a0ed8b4c101300e30a10a369d9a3090a455b0c4249948362ff42860a169f78a2050044aa12810404de0f94408128daf4050280612e547140400932b299c09908240106120145f4c838e7af811fc50d34d1a16240a026abf1a1041cb63738400092e47ce30051c8cb76138410004000056481984c07017850cc9c377df4c240405f7ad6049332537311a02860f56f5e02890280202fb8ac041010985ee4f810407759bdf5c24154fff321ba14029ef7143c2821d21052048c240728f42b75892670823081e1071c46074b9ce10a18af85cef120881403da174b7582081b96d4379a090543983c7f4784041f4282b4930800068f6bcde446002d799a404c42502820b00c00004be40c834030120004ad3648fbaca6008918478e7037e48b6643a12ff1441b559116e0618399f36840b053c3591e4830186ec246621400b693ac170006671f2e21850284a038c2a1e74e167250cd60e17b652460337f9578182800f1d655081402bf0db3848648d36f43410139f10288b06094f2141818a0272b3b38b41b4841280c30addb5d33eb718382cfc0bbecc71c54e38dcf1c50df65fdbc26124621f13f31a010100c2816cd004056f1a56ebf0182fed231f5e818025f86fd62d020112368234002f45041481600009008188680c0240008ce400197cc0aff6cbcbfb9221927b5d5e04097338974bc8411a7bb2845028223a1b1c0202084e3dffade5000a79fbb56060021abd9716000cde2354f38025e9182601c593052ceb8ec850e4e1a94986a50a46bb4854a648b60f566ddb8286292d17c3b018658387752f0304591c8fc9c00820d2aa024403007d4231b57000f0a450a0091848335953ff1a50e07922a205f92302157a2640228a342881ab8e082012de00f108583434a98b79a08082f54538be040000cb7264b102001fb44db69869120854050c2411331c6b9402c8008d6451c320d181aa298c103024602f2a1dbddf4514458ed42d6ea2c18968b61b43904042ab9e7817ad1400a955a35078401717b70023b0188042e0380001169b213d4df7f8e3c7dc153e2c6cb8568de50dc) <<< 16000) + 0x0c271a0614330d1df9020701e990200656307d013840f80400005488188680c024000be0400204480051010018f23233b472ed30102bffbcfbc08c2807b7edf8101cc13a0c7f9212969be746081049a688960e0f2d7bf0060400a59c172e02067c3d8c045b2004803091c67dede5209180337f98007180337f8de081402fb8348c71001d4b3cd080c003c75954705acddffea080216919209260009004000034668863d2ab43f01866bb11662e8384d8c946e2dc3040aee498b7c38254cb0219f83032eec0f7a0028054053b4d98200479d4a7aec0800c59619a58cd6410a00900003fa40bc2405c1202d090160080ac04054020290100031f10282581390c0987604a230240dc0a7e1cac622008023f9e9d34df0e02e5176cc44d140423ec9c4dc2100ac8f8c484f911077e009e6010ea071e38e48072accd3de951382b1ebd809d5a07c692d5e605342b03441108eb08b7befa12df123de70a65634aae70cf34663445ff561f061848000600866ea3aae5497966fa0eafeb3eba4c5ae496c7b833c51be478700362fa248b6afbb66ce4b58075bfa42dd16866a1c5d35d86c887c0f04000bce128102e49509ae02a16e6996d196b9e47c3c0b8cb8ec979d5b00034b72dd214530d69b340e94d57895c3cb051cb95af90934aabf5d340007ca54934f79cb48f2e5fdfec46ac957eb7668878a3275b66b897f54a16ab1ce879b1077cdbf544ff23e7dbc3dfbfdcd7f168c8a520db2f801186e01802008a2b01b099010434d0e7b008234fec760282161abf104045486cf78c003bd1ab40400015698404e183e0100001542044130210901000c07c0403c030001fa38666261080a296f3f07f9a83918c2f23991da8e98b90cb6db41f80376416ea7eceb82d5e4261f79c628aec12535b13bd0880800101e1e7d497b5a7f412e1726430f3c4cc89e2e884726d47ed68e93b6f32e7b2f093f2d1fbe5f6f76c633f601b62cb6720201c7b887305afe4092000bcbdf9dab3684c422d805b24f7cad70aea03ac45086cd241eb2d2077b5527c60b7d43b6967803008000954fe1dcdf56a917e1850dcfe9c320d9da946f53204427f920ea0e59f0d5b0dbed9299412db2e98ff07cf57444defc40010d7964d4989c68e3c0e180491110b49ea20e1bdb8e333917eaf4db92adfd766927bb9e552ec15c9b97d373c355a005164ec5efb925bde1182fc7fe574ae20e40d3f9f77ae71cace43ed904be9878c18d96cdd1b3f82078d14ad5d6c3f1c44214c2ad0000258cdb8d803d2f6385d0ae33fbaccd3cc0f283e306a8968d4fdab55c5c3d9ceb73a105e552ba9c8c000000000000000007be4799d91ec5432d62a9fd48291a3fdb424af846fb0000000000000000000000000000000000000000002998a28e08e008000020205661c8a7f647974884d6a7e720281c5b8c6263072c440a1958cbdb3fd84aaf346b66fa371403f9b37eb65cac47c494ac1dd704ff41c3142bf87e541236c787896811cd824929149c33d417ce1d75b130992fcc492f813097f30445bde1fe0ecb4d82db46e05b3599006a232fe6bfad40f0acc71781f6636fd13e8cf4815963ce5e2846c1abfa96b629d4001db4d044208c9a46dfa8341ed3a3a108cdc87c6d7931322ca3fe995ff15976005bc7ec553a651826a66f9b07536fb683d997cb68750449b0502c9d124216269cd994d14083c0b83d480e113f691f920d4565e8e706a18d7b7d8ec1d12edb160ccdfdabe577a894b13994cde1b7f831423c37841fd779e5c249ac63f18e0229c771833030e20040b27fea8d9e5cca58ed5b736ff8d87fb4636bcf0df6f364d712c3640ce721c4edec9127bcd175581ab5b50793c4c2c30aa5963e2e72f54b4f8d0707a977d0c644a49fa9ae2206a623ba231cc54bdb3e48f12327c0d812315fee608a083af9c8c6106349be16b77f0a95409ac94df0c3b1296dcd343a5bf82a035c12dd1d11bde80019eb07c6310d4742f42702019c85dfe4ac5706d97e0b27fc6ec2fab531b6ed806d09c056b468f11cc00f583aec6cf5b8528807474e67b14e2e4c5dfaf589d5285b13a3c1ff0f45f5833da6ec17ba865eec8717376981fc8efd34896c08d109aab4d3d15d0f78ba0b4fb379c96f5286cddd6ef8cd4eadf51422c68ff9472320179400061c10025cb3d67bf65976e326d528297138cf93dd18dc7335beff9e0000000000000000f016111ce23c66017756159bcb3e5562e6d02f0ce1170000000000000003944ebc6d6cfb0b7491c94589e8af4c8e0f75aa4f7ba000000000000000000000000000000000000000000150c40c60050010111ecb8bc629cae3aa25ebd2fe272d16196e6f42a95887142cdcef49c7059b90db45d592e73e10c3ce76729b99521bd747f3aead448a81fbeba290f4e204d6e14e7fc95959233d2e036aee218ed90c87ea6fa1820d6a514e9e1cd33661ae846a21977b219237ba94820dbc85c0dc81237bd72a1abbceb499948b8d95b42834b6a743c9f85ebd46a3b1fdb7123c6ccaf040c0881652a1e71320b1abe1fa87342c3d00087920061544014a00f81b8a22ccfd229d79bfdd41834f14963b0003f3400000000000000000000000000000000000000000a25c9c83fab060590410c08808a0080060203d0be85bc356a635eff162d23b6918d0d1aa5903d121ab1c1fcb8434af23e1cb389e27e9e72a2df68126c42bffab8e2895b08f1533841c4c0984f6a139e275ae24861ba23573b094a5fe1d95abb146996d7c8f33b23d8a865ac553fa9052347fb68495f08df60000000000000000000000000)) <<< 16000) + 0x000000000000000005312082062051c41c21420c0000040170480200da2a3317b2bcc4880c58df1a81c40066ff300041000b714260a05e8540f0da4822c53368891c10134fd9000a080337f9800900e16c06090004a45094051455b008b670b192fa091038fdd5dbf495f4e3880535eb737dadf1d281628f4a777d7bf320e0810e18ad2e8247c04002e25ef41463323c080011d9d2f20d20700013f8f3de90c5ef004728d62bb9f58e88e02cc938a1e83a0000afc80e8ac07027631d404b20048c0337f980082002dc509858511388fdb18082aecd21050202dc6c00020dcb8a487058024ab440b0600089544001321044020d20860cd3923445e0485338c0c02dc6c0018202c0c5970e0648e9310d2c10112a8800304b979d48b3400f82e7618900034aea3c00004a487dc350011006348311e47c1a52a618600f71e84deae03444a18627faad81144092f73a676243381a738cb2b8cc0d2c10508b4fbcd2230c140d6d0ea4508e20005192d5974066180040d9814e40a9f42404801a02a00009d0e9057a9fedb4688adf3d5c88706080c676306060269fb2001871629ed9503040631bc93c6802e5b5214848001da23c1c2800269fb2000000a7231af1ba0024014791e67647b150cb58aa7f520a468ff6d092be11bec000000000000000000000000000000000000000000a65c9c83fab060591a40c31a20a20c18619000c060000401a00042440010c48004649c30304a6c520c280cdfe6000b18b066b1cb091804d3f640041001129e390b0991288f2d01060dfbf4000b003998ae9603000337f9800dc821200a34d1576690834b066ff3003074e5230563039523f9c0082e9c5500014105818b2e3002bbfcb5020001a5751e1000225510000009490fb8e8008002183f829732c68a21c41f40a280c65cdc606f93b7580819e24496638048b2f438a00721fe6f3800f004000051c80019d901b050002a0901a09f91e67647b150cb58aa7f520a468ff6d092be11bec000000000000000000000000000000000000000000a65c9c83fab060591451220e214108088004001498e674d1086ff061c6074bce2760a769163db05a5a5223abb27b97f1576b8a420d54000bf480c868060140026b84006188800d3590171580b00adc6c0000b71b001f818c7eb7c723a3a045e06e288b33f48a75e6ff75060d3c5258ec000fcd0000000000000000000000000000000000000000028976720feac1816630c40a286284282000aa296be772e61e48d36a84ff82a64a7d57c2ce2694dc49ad0f38b2a3a936daab42977e931ee1f3fa55a5e854eb9235fcc7d3358fef40a7b9c314847aad85df29ab9168546f0d9d7d71728dc972bf908f8c457106c50596bc18164711abd0e648e16a421878591d0bf2098b907101ca4c78ca86084c75eebc1450840282295f470485acd0369c5069553548f9c300b51254dc602023692c2c1380003e8410140160000768db8d801e97b1c2840a712ed4d300b81ff23ccec8f62a196b154fea4148d1feda1257c237d80000000000000000000000000000000000000000014c882040c504404500000002cb891ec6188431f1772cc0d8370debf2bf1d685e6c692388b5707a862c82ecaadac85f7241ae2cadf8c37bd6a0a2f82a424c1a86152cefd2cb6431ee7a52b1257123400110480a88c05045803c998ca840299696cd40400222c1e008492b13fac911fe84afa201447a83148e8fea741392b0361705cafc8accfd9660bf7bcd514208197abe33aab2ca20d54e3aa240866f6ac7874414b72f3065e83ca4db0e26264a74283020000ee7912d880b578cfb868ad2d129692b201ae1479e5c7aec65ecaf5d33ed4b0f8f2a000ffd741ce535ed6f0181f2b12ede1560b5a056c689ba8c78f0861f00391113ee2b06fba000061d7284c9b843406f3a184ed7979246ef4265ad0a54447161740a4999345199e75b1d2bb3f2d77f5ef84eaf6c3e1bbcc021abf5337f1370e138de02162e95bd46c8bbb15888970aa5dbe1c9c131b91d25f5692efeaba9859d6e07241e6ed0e7bf873574c2f50a45cf91456e88f0e384104df84169001090d788a02013242000469bf093c896181001a093916002da08e1c900023c67584000047169c0942084021008010040000111d37a5af6cdc38600af78fe2c00501633a120006c8eec480000ada6644a084201080200802000008880982800055880904c04407014010040080480000dc807888038140006b440010ac8006161000cd120031da683de087b9c08100b71ae50a02f1ffde284002c1fded6180016e35ee080143468f22a84c30420109264ee99218c48c00862064420602654dacb10206fd49114c90a4daeed2f22800b56f20bf10012278802c02003140290c690004a028926e8b31b2a78918047868c000818ae89717dd0718047867df0081008b2b2946c90ad86389d4688022f38b4fa4721c00a008000032640341724d27d418104082d690cab9212c3f04b783840104408f0a0022caf31c2001ee173e5040023e99f504e084401092604c57ef73c48c011e1a3000206127b7a43900e30047867df008102c5dc85c2e484889089256a2003f3baec6f4990e085204000019c200063840303601613814388a6748e29b7d9e871c37bb47a3e18254ea23b840071cef09060482f8673098207c0210408201ee6881405b8d80038a5da4bc07185016e35b80e18eefd044c702839025dc13041080400004cc8050480240400053e40026288040e801c6400c2a0050900202800c0400402000b72200202000010021e81)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 19 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case18" = "QuadHeightCover18Case18" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 19 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case18 private def zz2403:"s0963"="s0963":=by decide+kernel end section namespace Green24Proof.QuadHeightCover18Case19 open EndToEndTupleState (State qPath initial) open BranchWitnessAtoms open ExistentialState (V S P M root) open IndexedNatTreeCheck (K) open NumericLinearAtoms (l10 l11 l13 l14 l15 l16 l17 l20 l25 l27 l29 l30 l31 l33 l34 l35 l37 l38 l4 l41 l43 l5 l51 l54 l55 l56 l57 l6 l60 l62) noncomputable section open IntegerQuadraticCertificates hiding Certificate check check_sound open OrthantQuadraticCertificates open StateCompactData (qs) open DictionaryOrthantPackedData (LinearWitness) open FiveBitDenseData (decodeTable) abbrev constraints:=ScalarRowDefaults.constraints noncomputable def base:Quadratic:=![![0x1198f11d8, -0x742b8d00, -0xaef86ec8,0x16e3600], ![-0x742b8d00, -0x12842b080,0x2a3e0e50,0x37873e24], ![-0xaef86ec8,0x2a3e0e50, -0x2a8cda35c,0x7707f8b8], ![0x16e3600,0x37873e24,0x7707f8b8, -0x3acce180]] noncomputable def hinges:Hinges:=[(-0x54a4c10,l6),(-0x13417e3,l5),(0x4c8f3414,l4),(-0x25a6ac5,l11),(-0xeb88a98,l10),(0x6bc67bec,l14),(-0x54a15e4e,l13),(0x1d3d128,l17),(0x2c1ed2fa,l16),(0x8e2b5de2,l15),(0x54a15e4e,l20),(-0x3acce180,l27),(0x3acce180,l29),(-0x6bc67bec,l25),(0x387a028,l31),(-0x8db83c6,l30),(0x3acce180,l33),(0xeb88a98,l38),(-0x3acce180,l35),(0x3acce180,l37),(-0x4c8f3414,l34),(0x8db83c6,l43),(-0x8e2b5de2,l41),(0x3acce180,l51),(0x25a6ac5,l55),(0x13417e3,l54),(-0x387a028,l57),(-0x2c1ed2fa,l56),(0x54a4c10,l60),(-0x1d3d128,l62)] def normalizationDenominator:ℤ:=0x59682f000 noncomputable def slack (x:Point):ℝ := (quadraticEval base x + hingeEval hinges x) / normalizationDenominator abbrev constraintsNat:=ScalarRowDefaults.constraintsNat noncomputable def reordered : Hinges := [(-0x3acce180,l27),(0x3acce180,l29),(0x3acce180,l33),(-0x3acce180,l35),(0x3acce180,l37),(0x3acce180,l51),(0x6bc67bec,l14),(-0x6bc67bec,l25),(-0x54a15e4e,l13),(0x54a15e4e,l20),(0x8e2b5de2,l15),(-0x8e2b5de2,l41),(0x2c1ed2fa,l16),(-0x2c1ed2fa,l56),(0x4c8f3414,l4),(-0x4c8f3414,l34),(-0xeb88a98,l10),(0xeb88a98,l38),(-0x8db83c6,l30),(0x8db83c6,l43),(0x387a028,l31),(-0x387a028,l57),(-0x54a4c10,l6),(0x54a4c10,l60),(-0x25a6ac5,l11),(0x25a6ac5,l55),(0x1d3d128,l17),(-0x1d3d128,l62),(-0x13417e3,l5),(0x13417e3,l54)] def dynamicTables : DynamicPackedCheck.Tables := ⟨65, #[0x480c401001f03c084078401000781083404e200800000841400f0c0400000044140186018000808e1024c30140000002a0a0518040000002d1d024c0200000c21901f0602000000621a01c300c01703c0c603d2008000000001103880200000e22881906020420708a1039040140000000004819002000000000d018802000000000a81c401000000088540e300800c62888204b2008000000000e03480200000007048126010000003a11032300c000001b088111806000000000d024802002988218812c80200000002c140a300800000150600998060000000a05014c020000004c12044601800000000240920080000000003819002000000b834098c030000000502816601000003104408c30100000000001819002000011021036cc0400000000022064008000000000503200400000311101e180600001042301acc04000000000380c40100000000013032004000000004c029004000000000d034802000000001081240100000000088052008000000341a071804000001884409cc03000000098580c60150829010800cd401800002484201918080000011854028c0305305104c025a802801582405809d401000000026120318040a20ae08801b5005002905409007a802001702807005d40100000000130049006000000000e014802000000088480c6010000000442c06300800000000e00490060000000012014802,0xc8b814601000000682d013300c000000322c02980400000188ac088c03000000000a8124010000006a2f026300c000000322c0598040000084110238c04000000a432068601800000000680d20080000005c320498040000002d1a034c02000000168c812601000000000640920082424046181eaa00a00000188a40d0c03000000000e81c4010000000088f033004000000423c071804000000211d028c0200000144320286018000000b4340a30082824847181eaa00a000001c8c40d0c030918e118207aa8028000006221034300c00000210c811180600001842203e0c04000000c4240386018018c440d007a401000000000420710040000000f07028c02000000000501a401000000028140d3008000000003c0290040000000003c0c8010610a310404548028000000241c0a3008000000000a049004000000000b018802000000000b80c40100000000017032004000000005c02900400000000130188020000000e8c8146010000000543c063008000000000581900200000000110348020000000014812401000000000a80520080000000034029004000000000340c8010510830c404548028000007219027300c18c118158079200a0000000120c0cc01000000a442068601f0860c5080917401b8231a282052ba00c0a110818c0661005000000128a8126010000004211034300c000001104811180600430c4210259004,0x32014802000000088780c601000000000540d200800000000360310041231c430c0a2d00500000084320686018000c8461a02c400c000000000a069004000000001d0248020610850c402e08028000004219016300c00000000120690040e110210c0b2d005000000000901a401000000048140d300800000000220490040a30ec10c0a2d005000000000280c4010000000443c05300800002402200b18080000138110058c040001284c12016801800000001e009200c000000005a049004000000000540c80100008408603e2602800050881024c301400021c208168980a0001021140444c05000000d8120186018000680410026301400000320580e180600001a8110050c040000000d0480c601000000640900c300c00003504200b1808000001a044038c03], #[]⟩ def dynamicCode : Nat := ((((((((((((((((0x14534b98cd82da3a1b761c330613e20491e8d96438102952c17a559f6f5c6002a610d669ffd79fa04010c1edd22425024c8105431b0fabbaff6510010594ac39094810c270148130a30981884f8c18f9ac260660b6262685afe01ec484280ea422801912f220543070011a6ce90452a1c600f423dc186354b51ac1a187e699de04174e2a800020844a9b261e000b71b001a00cfb644a040003d09000190c200040000d9105701f1440cb1ae70c3b4800c689dd08e345068be957a50401874022041b7922604c1838010d35dbc548a2c2070df7ffef98d100db2aa76414301f8bc0eb030f6b648307c28204e09975902080ecd8fdaa400021dbb4918e002c0395206020c861300e00007b8e190ce9bf0446920588458e66063b1d03ee4204375bb6eb41059318c415c48004535fc6a1001b1bc910808019bc163ec00279cbb3555810240140000e8100050b21442308d1182a80e030d2e6da70954782d1a2209ac7030072ad55092060d00434d8195931038412a99f5034343975de930300b71adc1c300b71b24082230322150410895364c400016e36003801902a4b813218400080001b2214203e305b518834cc0b6e521f53c504029d6fb0a08217c491411920801034a03090023106540600040955aed51016d3146251938a1280c00006a8f140ef9f5a2c3143f5e586108863b3020b7b2ab04300182959f1942074021a6f05a297638430c4ecf0687454e65207082dc6b9404130e84a9d041112a6c9880005b8d800e008edcbec1a0016e35b81c840f802000069c85080f49047ab2db06059004f31a8a0804a62e960413664d28910410ea54ce764800cc8da380000bcd21c7d08395652e08d710230100000cb90170d000248108c1d0270880024f08500c8004680fa1200362a38e6b3438146b1c09c603eb4c823c0c54059a90f48d84d7feb44ca003830574ca15ab9c14c62f8a3a00000000000000007a648a3045003803002204d25d2341b75ec492613feb31cfa85d7fb918585335f30f8ce1a4402014a6f8f2b6e6311bc827de7466fc0b40a7959bc4984f3db7aad4cf3351b82ec66fe67d41db317f61c1173e435174a19fdc1045a1fa986f18540012a484f8cfd09004a09a834d725e2d399a0800ea0f6395c36efecfc5e8216d6361aaf14a28fa7d080e59e00000000000000007a4386282102300280180a02a00721c977c30f046ae8fd998c05192b05515ceb38e4de504b698955dd662d7ec3d72bb9449b56890accdb8f1714ec63b4b8d5e18565a8f6a8925580fb3dd759fbf153e51249b320ac21a58e330afa00088a4054c602c0ba2942587c78492e58c9528244016e35b8141cba42ffb080429a4c8723820d654ad92800974953e0602180941204028182100861017c9eaba507e37912800826bc06de040022ded2643801f3c73b620128c10004000042482b0af0a1d80fa658a28339a8cca349008954400b1c0455a0d62c487cdcd820208f1dc8a341000112a880010071b9486e000744f4713840391822008692016e360016386b6fcce25896a24ceb016181b12b99a104a13db1781a0005b8d920500da33d4a7120005b8d6e00003a4d206a08049182200c0000e61c202f93d574a0fc6f225001063877739080045bda4c87003e78e76c400947080020000216400136084f88fd09004a09a834d725e2d399a0800ec2128628b03165b231a4dd112a85c03ab236aca5915ea2f1f1b6d2002b7e63d5329d9490ba41b80000000000000001e98e28e18808c00a0060202869fb44f034b5abad01cab43323c28991d32b8ff644ec2a322e8ccfd2ced0a25f8e283208f70504617074472f4121a045e36ad2f5b852584e75c1c501624f58a414e8a0008c240d0a413c3a09d1904e0a8174541361a000cd0213403a1ec10c387204289d16e871397c54df101291d1f2c100907078021648d00ff3f2878635425c50a55d2fbb071184877839001f1d55c31c00899d8640804c383e010000131208e1b02109e82d52cef07ef55d14214d8b98d8aa6207ad9cd6f740000000000000000000000000000000000000000000aa248c40c40830658238020080a17f3cfdcd28007ec0133ee1ce23746bf3e0a263db87c301a9090446ec5d4400289d5a303f667e7d6c266202737f56e30c505e2f5bbf80f381c0e18d59821d561f3d8ce3b7fd45b4cb8fb946615d40010c482710c264661180bf4240001e847a1d3f87fae968992007e10943145818b2d918d26e889542e01d899bb6ee26028c81860cb085041043000010bdb180d3100eb9ca11d263c3b687bd243ce09ffee47b533320c47d402f96481989c904ba6f5fb16529117416a967783f7aae8a10a6c5cc6c553103d6ce6b7ba000000000000000000000000000000000000000000055c6800c8b1c91881860c1047004010110e506c1871b960f805400089081796826054000a8e68543cc0a98dbe3aa5ba5053937d5e07f18e44f67a93c8167eb1773cbb6bbf79d374ba3842de8e8a75ce3c36c1c5af8d079c9974697689d0cc45641e6cbffdbc36e3cc508f06dafff43b0d1842de87b30fdc1be66f8d1761fe0406948e5967a540a1382ea65720c9fed397c39a2b9c800108e1bb30004554174d0edd811e8af7091c6af1f03a231dce07bd86b4a09b846e55d668db87ed54a594c44884250c516062cb646349ba22550b8076cd290395d0f8a0e2a99f2b34bd2b47c11ffb612a1470f0000000000) <<< 16000) + 0x0000003d22862852051c51441800c000442aa1a4d739856f5e6f8230171a411e56c3b0788ea9352766c5bbebfac8eb2e9f513b96490eb4000c4884b9682585412a0200084a21285a0281d0108a800537884994f860281f5ee10818cd840f708384757a77adf08126928dbe441026fc3213cf00000fe8dc8fc0c35a2318482023da9ea0a84081c324e5113ee6e3ae3c632aa130100000820e103363cb55c8c08b6a4927fa0608b178d56218c008a99628c50a049b844a8890802bb1a3831a20220a9d40c45122225d8d59a0f4033b4e6bbad08c61960a00900004044248a41221b09009847828238050360cfb19c238506fd80950c17959aae2e2845bf477f31001561213cc38175886a838a019903aff68aa20a70415c07207e568e7152e8044020e2daab27825c596872b94ce220600baeb6b40c30061931f886100f9ec7584104d4f8190462416936c6c4b0208d71d4f7f0c03ed8d4c73c18c841280c2493ffac848104198d0cc8a0026fae8b9004b01a315090207c0200001a240502611a1305505f1848499895b0c2539c526e0a964017d782d4038700bebbfa8028a17410825f87080f6b267f3960e13c5160631811a355837de601eca048507c0c890c2702071602100ec649254557acc590004e9bc810432ee0be0583accd5a965000a85fa5a4008f34e23604e184001000015b21182204e090001cc1d2d29194cf289640c29ccb7ca28700f05387a038a00f05340c0a0c4e17bdc718a18ae136b3c92811204114a5e2821d4959dcfcb020a9246b7e9fa4109c071a09a9f0b9d04105520b38480236231247023704ad812020f804000033c845848228240341208909044008000d1882108e46c5c4fa863c916724825bb514402367b50508049cafcd62e0c120174a3108a02d868efa321c0046cf6d8502006610f5b8b4105318e6f5a10c70484c0380001ee20f003911179d50128204eba26f3bc070863247002910202d0fa5000705b378d9e1b28045a1b208a0500179e5ca700c00b405107800100f299c34488fd0504c03803111800102903f1d81e02c0ec0764e5ccff56e1237ade71c7294289a7ec0681228d84bd81b8a225175265416127814d85410005b4d13be0603aa80df0c0013f66b0a900801b41a1200c245e46dda7be710282e0c3324c86101bb4094ac0286064bc5342e0c3054ee9e4cb0810807a5ba83460070f921f7940008e25cbe5200ddfdeac6408016239a148140000820d115decdf1bbc919a5230396d922023f4dac8220499d06982a4304013fc4235040806714939604114efaf4048140261541cfbe8200c5d7f55884003220e09c080000404400188c800a789e2007c1d1fe02846c4c91bff8c08205a3d300283e8f7c6c74880801024ffc0301fdc681a18040005e5878608aaa021b9c07cc400b49d1098070000396421d1610c830853d8421cc20cd607e630822584090c2007784999680ce8b051136766d53cc20089120aa4ec8703f2dd6f297d14097180bb5fbc2010710ca43e6400434319d337490b01c39148240007b4625155a1140fee73542aaa34ccc85406880e00802287be45eb45d5e97fd971ba2f42c18fa736ac581006f9d209ab31e64b89503bb5b3b58fccd9a13e95d39432fe6bc146fa5b2b625b68c0123770f1e08516e2c9efc0328333c13a3ad46243d8570f594d93198feac3ca54bafef4593f687c6881ed9b8077c81117ca5393070014f9c0d47cccb556f45349ef2b890095fe6bfb00ade5b34f0b7da6b2d14c8c22a200e5181f0702fe6374514403e03c2b2c6fdeb608ad5a0405cb843ee1b7860a529eaae0760d37b30ef516e5691c5b37c383af00718c1e8f87891310fd9a5c09a90ea2c6310ecf3020001a8082106fd09004a09a834d725e2d399a0800ea0f6395c36efecfc5e8216d6361aaf14a28fa7d080e59e00000000000000007a0f4f3b156349e2e3d7054d3c2794f1c4043b29e6c200f80000000000000001ee82d52cef07ef55d14214d8b98d8aa6207ad9cd6f740000000000000000000000000000000000000000000ab062c8b4a31605a8c21010e0040222849ce32ef0d981b7d7c9526adb38b01136b7f7adcbb35512333e191838d7fcc23d455e01ad3bfcb6127b9b61981b7c9a5c12a9e8356de32ce19c0ae816c4fc6b73189025ffa2d15a13b1f6250bb916e28b6794f8b2d337542f3e57d62b7c48d4f96f907e314a96779f9979dd70fc1c37d165abf993f9d19b29457009097e9dda00108a41fc960fc4307d1583e08c1ec460621a0510983d02c1e4060f0038220252622686424f87c2822f41f1d0e10e40001c30b902fa1c000015281d0047100ee76bc9ec8542a83334518c4f30d1f91c2274fcdf470998c23588b353cfeaf399d1a4bf8923c378c4f4d1aac9021b90a2fc7951c4a368c70410e9b384ce6da9e6753085003841bfff791497227da82b075cd9c67a5cbbf155718001aabbaba14fd43e15fec25c858ef496c2c2ee54a3f684dcd88fc60e039222e68055a1b7cf9e134cb4483dde021f8c1b90b38962470fe2a153fa96959636390a2b09000009f441dc660342395e77916579de4659dc62bd67718b007b416a967783f7aae8a10a6c5cc6c553103d6ce6b7ba00000000000000000000000000000000000000000005522411813002001400c04054e3a9a87314ddf42243170563c98959111af8512e996f92bd2a6fa6335b511de240144bc512e747627eb3c00f86589b093b15ef9aa34645e35348aa15d0170834042ece218f71c69b0d38c1d3688fb7ed8c7ce84f841f062336a2528)) <<< 16000) + 0xf13bcb18d40ce6a000aa641d8d60ea630742583982c1c8074523c95b50a10314399a60060116c1280a63cfb1120039aa784403fc491b40004c383a01080e0080200000888188cc0c017e8480003d08f43a7f0ff5d2d132400f80b71b00290ce4bb4339507ab32f2e1104003d09004a09a834d725e2d399a0800e98c69364a0b8168606782780500480045d53f951ece3b32be63a71b3b5d0bfcd6f349338d95ae665e83dc04deed0929f01f1f1f39962af9a7966896a52f0aa85248a551cd42eef863ece69b981d587b070782e88c1f31808586501e00048383c0100000d720e23a0701500026b10661981088fd09004a09a834d725e2d399a0800eb6448ad4e1fe652c6722b02566261f43b3ddaba40074800000000000000076631a4d9282e0599421408e08c0080020203c1320c4f6a384c9d2c1a9072cf848fbee7e6e7fb683a754a42781f200178502ae04b2efac40c7c623fe307cb90e6c03591a85a381d8d360bfa00078241bcd60dc6306d2583602e4302966e4a18707ce6cd4001207c539000cc607c0100d603824c92ee4e6f8fc1f52c2e3dcb8462bdf6688aacd446f7388e85c9f0c40d39d6cca3451ea56cac9a8d8f8e195d727aa8aabab20d04105521218a2ab749bbcc01278032abc3ded9ba9619ddd4f99fe5bc9397bcddb39c6a7aa2c070b98edebbc16b862831b5cd5a4020b3310073dd7cc20bfab7103cfb5409affca311c46b66e37cea037b37b35365721a411804da657a8536a2baf38159c8a93e000379adb47a205e821b878b55018c43972b4bc36f0f4eaa1cb95542180b8b282015203039500ed6ad3c7fc9e0fb9f39f6f7a45d970772c2754c46e60493ae5d3a59b5cd9abdd370bb45938dd16e7c21f66e527ba4ac41d013abe766c5e11962bef186c8ae42844f9dae88413ded6478c02d35f292401547c16c0240c1d008000065906a110348681a024001246419c570240100400001110660d81086e848236df7b1ef8dd7314ca651ac13d1d82370a4a19fd613f4a45cb68f2a68905865bf30e08f1468ef7d3286b8effecc60dd279d35b0adbfbde5189f36c7831fb5bd1fa123b4e94107afec408a14ce8145e9363e624f264e7908f2b1cec5b45405fc3d4458061c820d7060300b58e5a8f4ce4485ab65aed5aa2c4d49c20f27681120902d4e88386fa568a6a02f72010017c41921ce9753e530473e4d0a91320bb89f3083284bfd35eff125288ef733548f972008012137bae0cdd61c6817c3a98efac81f413c66935b7fed851e7ae6a280e65d88b69280245a5e91f2bfe35feb0582f090d557286dec114db1a9b76785e765cc82e6194c444f40000f9a4194840c82a063150310881843400259a40076fc8014f8903f2d81e02c0ec07e84802504d41a6b92f169ccd040075b22456a70ff329633915812b3130fa1d9eed5d2003a40000000000000003b0bea0323fb41b03884f262a4dc8b7776c460df6ae78000000000000000e4c618b08508700301001500002e888ef9236c92b935444c94b88c4b7b2631ba88d3c8d66f6adcfd9e03d66ccaa66e0f9821a660bedc063a1ecea878d40832b911ae458bbe47041a6a2dcb405392bc0b0255824c7ad029bc99b071d240642ea347dc37437bf7ba7fc222072b1e932b20c807d4b00ab2347ed91405271893fc1685d5d3ad6688eeb1821916046002cd7c0a000c02b0100fc80bd2e966b84112e83f8d1ce700260d6314b5c72f850031fbae39212f359da5579f0d94bcb2727c5c4ee6bf5adf768001403d2ade51f39b9d119031a32ad3445cb26839f1848447b13682a4bafe3bbfe1d265f98dbd1e4720f907197cda6998f7a40a047a21d845a03e01bd2a143f34b2363c50321b801ed8d2c4e8000f44abc1bfa68101a584527221a6e77837f5ce69cd0734485a5345bbf1151c6f6fc480110ddafcf4a3ffecefe4b29af65aca2d758e0b79b74eb9ee007bc13a1a2c7c89967748b350c42985b8d80290ce4bb742b8d4763e2bb740f93629df1647c495806587bad3ee1bd177d61decd27fc00000000000000074847500548565db47de54433301b96b75cb01d3cb3300000000000000001d23b54b19cf29789bc4c087b846bac3904cd8997278000000000000006e861248a588388308a00b6d9779b552ef656703925ee86ea4914f1d769290278092653d4b0e84f423f0a0edea9a635b24035b1aa27ebd278bddac3b5424000027e4a4ae7b2ff4f94e949c8b55a9191f4c38e5926522abe9c871ee72cedf4c2f31701e9507d571101949e37d4b6a7d1551935ea8003701b71b003cec08869003dafec55d4f081f548631488c8da3579789261a8de7d6a22331e989750000000000000000e60c59169462c0b32482063001c018010055000063aa796094f249d7599499560ef4c43a4ce47b4ab7a1e239f1a2205d34b95ee7d8c051bd0002b97b836fbc07f01ce1dc73a1cf23bb18fc9f315f1a1a61cfe50225930b0f666437308910caa99c58d00047c200258678c19b137c3d4ae72b938b349b52f60a5bfba028fd162c18304ef7bf42eb7a8090924f463461a61d0eddeb0c456204143375f577b4b8ae466e5552d48bb5fd105c09ddb5a40101120fb206eb30b5889c4514be514a5364e038dd777f88008883c2b69de39afabfe01e0ad7f4565a9a311f43fed6140af7f85129be065632b3fe1ef05d21c92d578083554700061bf1326a89153dc264821a3b55b099f68f7eb68f309aa7cf59dc4c9dcb79cacf27d3b17c3c7d448d4207e907ce739c11fadd03b2afd253a47178c905b0045cad23c000339900)) <<< 16000) + 0x1f85200b41e7d3cec558d278ba6c63d868b578854f06a112b8db090000000000000000e8bea0323fb41b05e0d4342479acd5f45205c2fa238000000000000003721030c118014004050450cf09d22835176751a63c48510e3b9d8a15a30779765e5bd40e510002752a8192f1d5e31fe048e59588417a20ff97c96cebe345b409806f2d36598528ee7965344eab6c8864a85b9698ff44d8ac99456d0600100025f900614d200f5c06450ccaec08fb289f89fcfd0a73d8890da78778ac6a4e3134519291240e203ac8489cb8b73f0a137b8f9a788460f07a65e41bad680f1c6d606abc5140963caf81975e4b018d9fb4a5680300a5d246c527cf97769d986bd38e046c82bafd6e0dcafe5f9d66e76005031e9aaa5385be3e359bd34dee04a8ccb04593643d03493cc58d4268f424070fdfcd4d725dfff2451a072266edbb8980a14e00f416a967783f7aae8a10a6c5cc6c553103d6ce6b7ba00000000000000000000000000000000000000000005542431830c204000014b14ddc1b14c860e1a1ae7327d6d09d9bd79ec0dfe494bdbe613dca2433c21dd623e02cfbed78b3caf8557abbf83c4ca3c502b6f6087d6e4f42df03fba028b9d343916b7bfbb5180e56883a0031122467dea89be0e3fb20b545795cb9df39b904fef02f085a247ad00059c20be6305e1981102e03f9b55d92f008180083d144c090447f780ab8230006b49d20001403ebe4495f682039f9712344c0002522c96204109a28691681320d2cd01202ad3fc2f33225831c148163d0901c3f7f3535c977ffc914681c899bb6ee2602a304607c0b9dcd4211713557601c1ddce776500638000000000000000000000000000000000000000005232841031c20c114004000000c1079695c69d22ab6813f97024464e0a172ccd4029ad6965dc2b0a494171c8e410ba4ad8f87e16bed31875bcb38e412daabd31928d93f739612cd03f79992b16841d778c1d72dd60c2949083bc289fc80a158813414c37c380a068f830a00546b20e0805a6d594820138e0f00438c048200318526db7910e21876c28c513db7df16204559f17b0002a383a0080000fa20ba320141102e028000aa082d88806844000eb2400267082d18c1647603a33f4240133f19fe89a0741e8cfef4903c7a79d8ab1a4f174d8c7b0d16af10a9e0d422571b6120000000000000001d17d40647f68360bc1a86848f359abe8a40b85f4470000000000000006e7c59c7286ef310b8a32a31368ba28db956a6ed488c0000000000000000000000000000000000000000002a20a10c00a008028028831e06de51b362e5cd1c552b1dc67a39b5a0000a0d6a6c7da386a2a4dee1d96d44901eb848ccb9b5bcaac91f567f1c208f2c57da831437f4c3917c1fba4908d65b210ad1aab0db5c7ac62c76079d5e3f1747281a17db777d71a85db84199739767bee115d476fe9345416cedb1d7b546bd3a0e3cad4adfa12a4392600657893e44e2224143d8166189e332d45f98171feca53847c5fec72e688b36bf5800ea71a5700be18e3c3bf6a6b6c2abb647e00814a8000000000000000000000000000000000000000000154490860880480040010000004080f947b0752bbb1b008f0c629d7867032353b53baf055e47a4020e66a20eb8a01a0653d45641e4b18df16db4db449c13b9e629596dc6c0179336c247385717a6c11b1607e4763f0864580b800ea71a5700be18e3c3bf6a6b6c2abb647e00814a8000000000000000000000000000000000000000000154c914404a008004001010040235b6028af3fa143ff83c01dfdd1872c50e2cdb3412aa69adf09416866d0660cb09c2890ac38a3b0e9aa4fe92c11cbb24398a11b8d8406cdbb64828c45b4159f202d8c448f6bc57b7b1ac31f64e5a4f9f8f56a0f6b63bca0269225d6a6c7044c38219f755d02d6719799588c3be50707309e893b43e5be98502003423ea79ecc1e46725b382dddf60f3f1dc66b48f1b263f38b858e141965699a4be03f8100fe1808e91e74af3239e2768455291d17024089eed9bcc0c1b23eb9b0592a19bdafbb736ec3acc4ab8a6c7513b735135d3f42bfd72a5664221e60c33b28ab77c1a2bf9718a89136b4531279e385918c93bedefd5ed5003ffd910e02886415a38a4e07e180c116e35ca010512a6c9878016e35b8380b5e0af818005b8d8006c103a008e2b73389d6c28410739a60abe5a2d8aa0e99155184e79e320d999bd9db9b0056fe22ba6e30e35cc609175adc30a332b4f4e92687b4ee6ab6ec85aa32e4109f6776f87efed6901b4fac045c9630279518ecc753766b3c7e2b1557bf4608c224878000060e415c040008a2416037c50c39ac501c1c289b7d5480c044aa128286066ff2942400cf4adba00004262560840547000c46c2842010e28954cfa809100e4e19306102aea5130104aba83df0e023edb5ba0c001c9c38004ac18400189103d4ff3c5183b06b0ad3276412a8ee2aa87e5e365cbf060cddfaa140bd9979b952f4afcd3d4ef44c48c27b818ff77cd7149016e49b76e463021695977af21719dd399ff37373a7cd78261e3c1266af6ea3be62c00733bda7a8aa4a1961b36f6fee5f5b13acc28a98bb231f2ed311c79ce86337ae8277b0f042ae306f2480228811f45faf3eb9404ca49b0fbf004a0b6b74186fe1b1c0b06d4a4868b7f9b9699ec8ef05a0da84ccfcd0a5ace9916267020f524a980a7ee1eee0e206eac1de8839ea147bc00415a15811268104d0b0849cde3eb44c123d3d39aab8830dbd3e301274af6f9adcb2f7790f9014a2b9525c06ddd)) <<< 16000) + 0x6476ce40d434a40003e69057010004969000aa120a62bc281f3102bbe8504439b8431ba183062e54289c1c00650e49dce8c028243fc4c710102400176d3510dca405206000016c20ac4305511e109e5c458c89a17d9c120479d2568ce6e4f62fa12c76244480e682356a73759e3d71b871efa62457dbcd4b071bdf9c7cec878402005aa8b521f355b60f69830209396c222a7a16d2437491d13ed0401ab53c5af00cc9c43d082aff37682aec776f031ed00f6921001017b151e9397a6468a5e66a930a1965092009039b43bd206ef2001fac533bc334a30d75b30dee64323ca3fa00e24cebdcaf4e1c057bc4a803e627dace267b0f21829af5136074b0814128b331412ab94d5cd8e55c98db218bac914ff241792444109c30a6295438a324406c8041202f8b9d0d041312cd30701b2f514283000aba950008001c9c38003d82084041e1c2530dc463cde619656383589c69be3d69781208678d10de6dcac8f53fbb5ab7804a7ffbb00120107ce83e4883b1260a9faf24f745b8a6ab7025dfca8adc75856d575a2f4fe85cb30d025fc557d03d44d649c02ab5927658adfd0308901dc00017f1f3426259a60e287e699de0208aba83df0e02467c7a80c001c9c380040009896800ac084001881825a7a93cf1792e9d7f750a4a77fdca9bb1031e1cef3af96bd2954c51ae65255c393448f1021d24016fd6182860768b46c357d6cd72c8168b27985d5fab99c4d150db68f88fe9af7dab777fde2f239135b009742656c79b58fdf1033182498f20000c2881802800119882a00800239082988f063288f748c04ac000c420027095bea046203c01001505029008144040001ca41406409e2a04e0500086810027ad209a5a04c05001649904b1d001814904a01001c9890492580200adc6c017c9d3c95ecdd83f84b5d0240fcaf3bc8b2bcef232cee315eb3b8c5803c01e848009378c537b1bffafe22140e18c69364a0b8168206202300280200001156e9b062ea8f4ed6fb4982a3da7adcc56235391ed90af43904a004c14191c59a4ba1ebb678daf138ec305dac46b11e34ad4e328b1a09003e22b63970a20644e86c80e12dbf3ccc382601172a860229076f0001e86834f0004c303c010e22e8555f220696944a80e125c861083820070e8202044e16312004a283c0100470900008890461182286f416a967783f7aae8a10a6c5cc6c553103d6ce6b7ba0000000000000000000000000000000000000000000559bca754f4dd02c870c60c3086045001000000030d24d8abe00c5833603c97b459306aaa5e2aa4ef8b50dbffa1474a8a9611373475f42b2747b28a4127aa57045b3ef86f7062a2f720da302822028000f308218cc10847c2071b57908a4aaf84eab669f0edb72646393c9543ab63fc730aa3048db269d44fe5445c6084befb648caf08b0097d70f507aa50768207605526eb30ea1994fe08394b1614d8e566f547dc4553b614ad10051a25792948306898d8f546fb7215a78c6ffe70f86ba3c3b0440c0399c5dc0c4dbf16a824194ee0abd3af908a632eab502c2239501018d8c9486f5001a6b40f5d47253b457e0923418196decaceb6540040d4e807a3395e9837330fec0ea660103513064dbcc8369d1171005b7779d1c71e172b74a879747a7b02547fe9b46875ccc61965700006b9208242040150006c6903f1981f0cc0f4640780303b01db8d80290ce4bb742b8d4763e2bb740f816e3600de1cf894801ed7eb0515ba03c7a79d8ab1a4f174d8c7b0d16af10a9e0d422571b6120000000000000001d418b22d28c5816850c5062864003018d4e6167d5d753c7bbce2775a2cd66dc06ae8226d1842165aeff475466900540000bd2a75d9a0d9a8a17339db9291e765e2be4a52c06f0d546547a4aa4749a3602802008e384e02748e093528066700ee6d846300eafb536812060e804243e16d6af8393afa49a72ac694e995f6b8b613d5564700141ed19d365289e2cb97500282e151df9cd3a60e9762a1b36b0200b765a1dadd5ce53a010096c60cf9bcd4d94ab016a93bae5c469e8d3a7348ae99ab851626342a8f308868ef510b1e451b5268bb087a5d6fb691bd5d55304d677719a4276dab4ac25249f92a96d0a961da422df73cc1c4fc67aaf2df9f0a45fbf7299b095f5139e08934bfabc0ba85ae0c470f4c870d21bb6a8c9a96e44374dba0000b2240e834000d1640e4560662303209f0418520291304af59736a62d151bc35edc63e6b526bbeaf07a918d7f1ac031cdd7e28c9c4e19d38649aa6910d38680b942886123a3e7f807cefd88c41ccf3a520ebbc3f6b20827e48bbf2d66297405aea3f6bee035d6f7ec32a6bcef36343c3360a6e07859e8903917215e7baae24b9abf905ba3dc5070e2619be92bc7b568f57e07adaa435fc91f82024000d66de43732c7990df371f45b2dd35d4e3799a3556cb0b973a4b97975d4893b5931ef12d867567d3512d4185d23d4965af533148aa9bfa42e1a9dc44b163bac3b691ed9770002e28a5aec6c4cc21079c9c96ae556f500543c8f60298530526701695e208b839411c09b5bb1ad33ed317bd61efc3d8387958fb04f10f97c307dddfdd87a351b089cbb30082a4c0b13631db6d93fd3a26f13b188b22b40f782563375638b7b3404980162f70a980ed0de21698e3ed77751bd08553bf4eab947c4a07731f85416bf691cff4228c88860400600a000aef2070330370d81b06c0d4360681bd0906327805029c2075b0817c35d241a065f45f10b036cbe7d430044320cc010261c1d008685471650090108c7f3aa502ad10)) <<< 16000) + 0xdac0408ea1130a3800d03fa6800128e0f00400004048198ec0c85701c010047140f8e98b6fe3033df60f939a75f32ed9bd0f238dd2e8add9d0a0b9c3769986f9210d5f159502f2d08e5d0608380809d86ccad1b5ce1fc402a3d6a80baa495bc15a36f010c2073504b44377ff42badb1ed343a39a17409a340dfae7f7c6f6b57af8c97396fa2838cbe734280f633b2fc85ed49602bf4cf4bbcb50be4bc264a53b3e85f08803a27f8024c2e112f1e0e2801ed45fc275edbe686741344927f9bd3b2407f0d87f844fee520b13e62dc29000017c434f06ae9f4768333155788d1c1b2c51e1f1b8d1a108ec26ebdebbdc94a4b48e71086dcd761fcfd18c440da8907478feff82f9888338f52aefabe8b7844fd03cf51711b76e793e77594b4c4eb8f306a1490755539000107c40c454060020008a5205e5a012290170e806c140016fe40b4740342a001e3e3e8480003d08f43a7f0ff5d2d132400f98c69364a0b816b3b8c582cee315f2bcef234af3bc8a0f19408a09000e00c0202a9793c2ce533755aa4f3387af04db21208763c046b90070dcb66baa934e3ac26e7b706fcde330ca99941f6dd1b8ab60f306099598bd4b76de8fbf0ab0b4a6950465e3017398c83d300184d47098ded65a6d3e2c22b06d2414531d28a03a1479cdaa1a34109f2f88185b80db96580341ae7fc4c852c228bc0c6300264f5c1de1101161249d3fb50052b8bc0c70c140291b551a0006bde0a6bababe15ed36e1c4fb5a0c1af6d964bffc8807031ccec7ae76ca8805d6f63eb44883bdb7b7d0f0dbd92e2df26d06e63d6e8e68d4653057c3c63a8984e54810d800840ac6b9a975f04ce1e8b4193c18e0939e89137ee399a71b378816648ef8527537b7032a405cfdcc523a1733bcb3d975b560e6a9d6c037e0f7d4bbfc08be5ea6b08e56872f5214902082c504d2a7a0514968e9122032e185b2cb0935bcf6318219dce27c30b3a143890000098a07802000026240b4540341a00087c20587202b350151480a4240500a000c8d36e3600bc99b612436377d55c8bd5103e14273a22b76d7c3aff3ff604503bea4192768d218b420000000000000001d97d40647f68360bc1a86848f359abe8a40b85f4470000000000000006e56810edbb9f59f3809b725e3849dfebc68b510a36032900000000000000000000000000000000000000000000002d98c69364a0b816a40630028010082a17b5aee96b2090ae69b7eaa035d8814d9bbf64881f7b2a768fd35caa5c524f03233255d66be9debfa18cea21b6a2a0e2dc7b5b26e94998e8980efd46eb88db88263de2854596b0446d575107159aa112e67d1a9ec6ec7a9a472ff60ac05a0fe76f80aa8f7ce57d8b58dbdc898094fb3db2d04dfc08a0ffef669097c5d4b2244a94f8b48ca3186f5a405cd91a1c0f9a1727be086c309c052265d87acf072f816abd763a4f4e2215b9840246ab219dd26e13ddf3a7ee1aa96e499fa6b8479674f05a838068f2c3d8cc3099167174166d4b5c1654b0c1b65b7a04f3a3a59835ba5e035a8e06194c1757833b97a8de1735e20daac0bb7d655bef8a0134686a236c355afb89e6d3e8805027aafac480d397fcabb530362cc7f2eb5eba855af8efff79d7527467508efe62954916d001145b1783cc4f3e878d56898f2d5a7230115bea26ba36e9235b7d02ca90657b1d4576bb25eeede326d6a7a56944219013954a688691e230f2c21e2f2c227aa76e1ae9ab102253304d02673a60e854e79970465f04d87c72eb99eaad0d10f0b3f0203802008000022204e1a0008d1204c52025250120c808c54044220211180d0680802403e0a01e010008f91004177200a6c26a4318a44646d1abcbc4930d46f3eb511198f4c4ba8000000000000000731b45cb42038139912ba1fbb7675551a48e3c328290000000000000000000000000000000000000000002990a18c10c08a088086000204ccc38e0a82535dc31ea1d9947d0f4f2d2407919f168906f6e1ecc3628a3df31684a71c7aab5e4460bb1edd56a1d32241029f4a06c15627262d6c65e10ac5a862b9a23cce97c7d687582c52688b501d156112baefc483053a04472414202dc6bb80a02c980262840005b8d8001803c0fbafd415026242100848e3a50cdb8a14610debd8e1155f79dc18007f7888028100d3b3c65001f00848e9c4416e61850027292b8e101470cb0860424dbff92481343453100c00386d396cc004201000012f3428269cd2e384d5b42268c002f98fec281ecfe4db88031d16fef2800f0042471a46472610281e963e9c6140dd9eff238419900c221c114ab5a259204b494283660021008000097900023d20381301b0980d04c0642603003b18845ee900a285f172720c30c97837438023ede0fc6020b959d288000da39ae26041f00859002dc6c0028841a9311392300b71adc05145fdca87818623b95786280a644b19093021080400004c480b82ec600f75e530c317de603a2c2b76885e21c0010318b61803cbe8115140153b611209820800216400b71b000a20fb2f33fe48c02dc6b7014512da292d06189bea15d8a02a488569213041080400004cc80013d90161180a84e851fa6f00c10471d138b060035e04648a04566294a100015bc5de12840f804287016e36002473b983841205016e35b81040ddae7f20821787aac7240ac55aa630b041000200004b080a04804c24024020002822000fc6404444001a2c404004001d0c403cc401c5a00d2900612802c840143a0091500408801c3400c0200501000a559004350018a8008440020200001005b139)) theorem certificate_valid : DynamicPackedCheck.check dynamicTables 31 dynamicCode (fun i => EndToEndTupleCheck.ofVec (constraintsNat i)) (EndToEndTupleCheck.ofMat base) reordered = true := by decide +kernel private def dynamicSync : "QuadHeightCover18Case19" = "QuadHeightCover18Case19" := by decide +kernel theorem reordered_perm : reordered.Perm hinges := by decide +kernel theorem expression_eq (x : Point) : hingeEval reordered x = hingeEval hinges x := by exact (reordered_perm.map (fun t => (t.1 : ℝ) * (max (linearEval t.2 x) 0)^2)).sum_eq theorem nonnegative (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ slack x:=by have h := DynamicPackedCheck.scalar_nonnegative dynamicTables 31 dynamicCode base reordered normalizationDenominator certificate_valid (by decide +kernel) x hx simpa only [slack, expression_eq] using h end end Green24Proof.QuadHeightCover18Case19 private def zz2404:"s0964"="s0964":=by decide+kernel end section namespace Green24Proof.HeightCover18Rows open FullPhaseRows (Phase) open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows def rowsChunk0:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x162005faf848053dbc8ce07a20003dceb94801ea597caee1ea2005faf848006c8c3e2ea14a200779ae5800a87b9f8c201a20003dceb948018d1b7bec62200779ae5806bd1909e07d2001389b48015b7b4f21ed20003dceb948003c5dc968606d20001eeb5ca8001cd8cbbd214d2000bf5f0c006b182c601d200779ae580029e8d8bfe520003dceb948014f28eb5f2079200050c019200050c120003dceb948014f2c291ee07c20001eeb5ca802cc782f7be42002fd7c28004e5bbbef207820003dceb948054d3d2bfee1e820003dceb948003fdecd5fa020003dceb94802fe783eaee14] def rowsChunk1:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x107a600050c01a600050c260003dceb948014dbc58c8207d60003dceb94800390e3a8ce16d60003dceb94807dcabaa6560003dceb948001f0b9819e16003bcdb2c018c6a58a07f20001eeb5ca8002c8b7e8c21ef2005faf84806597f08206f20003dceb948002dcaecac615f20003dceb948001e5aeabaa01f2001389b480309584aa720003dceb948014f7fa86f607b200050c01b200050c320001eeb5ca800abc8dbec207e200779ae5800af0beada202e2003bcdb2c05c9c8cde1ce20003dceb948009acdfdabe01e2003bcdb2c0068882fc8214] def rowsChunk2:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x17a000ef3acd05384cbea07ba00050c01ba00050c3a003bcdb2c002cc8ea0c607ea005faf84800efb92cada6a002fd7c28003f9b6e0f607aa0003dceb94803cb0c3adbe1faa005faf8480039cbcf5e62a0003dceb948028c2c1b7be17f6001389b48004fcb7fa1cf60003dceb94800183effeb676001de6d9a012e9dd86360003dceb9480028fe28aaa07e600050c1fe600779ae58001bcc8ee1ee60003dceb948002e8dff2ca02e6001de6d9a01a9fa99615e60003dceb948003c4a0dd9e01e60003dceb948004fef0d5be66001389b4806a86c8ca14] def rowsChunk3:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11ee30003dceb94804bb6989201e30005faf8a006cce9ce63005faf84803db6f7ce07a300779ae5801ce6c8ca23001de6d9a015fca3ee17d3005faf84807fd7e61ed3000ef3acd013f4d2530001eeb5ca8001a4b286130003f40207c3003bcdb2c066d68492430003dceb948006938cf2be030003dceb9480038987dbf207fe0001eeb5ca8003af8cfbf617fe0001eeb5ca8001e1d7949a7e0001eeb5ca800182efcbca3e0003dceb948001a0f8e0921ffa0003dceb94800afb8dc9d202fa0003dceb94807187d8f614fa0001eeb5ca8023ed9aca01fa0001eeb5ca8004c49887c614] def rowsChunk4:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11eab0003dceb948001f2c7c6da2b0003dceb948002eaf5fba603f70003dceb948023a3c4fa1df70003dceb948059acba05f700779ae58007e4ce8e77001389b48072fc9e03b7005faf8480029b8cae1cb70001eeb5ca8075fabe370003f402670003f402270003f402570003f402170003f40203f300779ae58024e0e0b21ef30003dceb94804ecfa19a15f30001eeb5ca8002aa8e8205f3003bcdb2c0138da6730003f402330003f4021fe30003dceb948003a98ebbba14] def rowsChunk5:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x102d00003dceb94800593f78dd61dd00001eeb5ca8001d19ee79e500001fa0207c00001eeb5ca8055a3bdea1fc00003dceb948003d3a899a61ec00003dceb94800598eba28e02c00003dceb94800dfae08e9e1cc00003dceb948003d3a899aa05c00001eeb5ca8008aedfa24000779ae5807a88fe7f0003f4023f0003f40217fb005faf848026b6d98e1efb0001eeb5ca8020dce1c206fb0001eeb5ca8042ae8cf215fb002fd7c28006b394ba7b0003dceb948001f491fe3b0003f40207eb0003dceb948003b1b5ce966b005faf848043b2a9b614] def rowsChunk6:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11fd40001eeb5ca806591d0821ed40001eeb5ca800f81ecc602d40003dceb948002d7b9e6ca1cd4005faf8480169dafc2540001fa02440001fa0207f000779ae58069e1a5b616f00009c4da8007e5d1a602f00001eeb5ca8060cfa89e1cf00003dceb9480019c81da9e700001fa0203e00003dceb948048d8e39a1fe00003dceb948009ecb3ec9a02e00001eeb5ca800788a8efc21de00003dceb948003c3e58eee05e0003bcdb2c0159298fe600003dceb948003e8a3fe07d00001eeb5ca8001d1a1e9e217d00001eeb5ca8020a0dc8e16d00002b196c04885ca14] def rowsChunk7:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x102e80001eeb5ca8004e7c7b6aa1de80003dceb9480028b9acdb605e80003dceb948076fc81aa680001fa0207d80001eeb5ca8001a8c19e9616d80001eeb5ca800196e09f8a02d8005faf848037fec6e21dd800779ae5803c8ffde21cd80003dceb948003f6ecfa580001fa021fc800779ae58002d1e5e9e202c80017ebe180738385c21dc800779ae58001cbeaca9e05c8003bcdb2c010dfb3f2480001fa0207f40003dceb94801be0bdaa16f40003dceb948037c0faca06f40001eeb5ca800df09ed2740001fa02640001fa0214] def rowsChunk8:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1010003dceb948003e8a3d607fc00779ae5801db8c5a61efc005faf848007c3ef8202fc0001eeb5ca80668a91ae1cfc0003dceb948006b5cac205fc003bcdb2c005a593827c0001fa026c0001fa0216dc0003dceb94800af2b5d21ddc0003dceb948005d8d5ae5c0001eeb5ca800290bc8a4c0001fa0207f80003dceb948002e7a5e79216f80001eeb5ca8001dfd68cea02f80001eeb5ca800197af921cf800779ae58016cda4a6780001fa0203e80001eeb5ca80048be2fd8e1fe80001eeb5ca800aa59dd8b216e8005faf84800194b2d1de14] def rowsChunk9:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x1150001fa0217e10003dceb9480128bdca4d616e1002fd7c28003c0dbe9ea15e1005faf84800895999ade05e1002fd7c280038fce838a610001fa0217a1001de6d9a002a3debad202a100779ae5800abec4cbee05a100779ae58003eae890ca210001fa0203c1002fd7c28002818acff616c10003dceb94801ab4b984ca02c1003bcdb2c002a8a5bc8215c10003dceb948012cf9891ba05c1000ef3acd05294ead2410003dceb948003e8a3ea03810001eeb5ca8008e89eb0a617810003dceb94800ad4eadbe602810003dceb94802cf88fe6ae0581003bcdb2c001a68e919214] def rowsChunk10:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x115890003dceb948011b99adb9e05890003dceb94800e9dfec48e090001fa0217f5001389b4800cd1afa616f50001eeb5ca800afe9ec0de02f50001eeb5ca8017c8e5ca15f5005faf848003a6fdb29201f50061d48002d48482750001eeb5ca800caaa2d2d603b50003dceb948001918ebeb617b50003dceb94800abd9ef29e15b50001eeb5ca800fd8f8b2fa35003bcdb2c003e88fc7ce07d50003dceb94800183e9d8ea16d50003dceb948032cccea602d50003dceb948003b887bb8601d500779ae58039a683ca55003bcdb2c03d84be16950001eeb5ca804494d5c601950003dceb948003ddedd4c614] def rowsChunk11:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x11d0017ebe18001b5a2deea03e90017ebe1801693bafa17e900779ae58007dbf6a2a616e900779ae58002a2c383fe02e9003bcdb2c0018eb6bbb615e90001eeb5ca800ab9f7f4c605e90001eeb5ca8006c1d6aede690001eeb5ca8001f491e603a9001de6d9a001b6fff617a90003dceb948028b6e9de9615a90001eeb5ca800fdb96e9be05a90001eeb5ca8006bec4bcda29005faf848061d3ea03c900779ae58003b7a08c9e16c90003dceb948026e3a88e9a15c90003dceb94802c82dfd38a05c90001eeb5ca801089e3c09a490001fa0217890001eeb5ca800ebaf1abea1689003bcdb2c003fcdecdde14] def rowsChunk12:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x108840003dceb948013e9cf82aa08830003dceb94801ec0a0a99608800001eeb5ca8009e7f9b3ae07fd0003dceb948046ee87c616fd003bcdb2c00787d08a02fd0003dceb948002fb8f93f614fd0001eeb5ca8075d3e1fe01fd00779ae58003d3e8ca7d00779ae5807a88fa01bd0001eeb5ca8002baeff0d63d0001fa0203dd001de6d9a026baa4e217dd005faf848001a8d1d48a16dd0003dceb948009e8ede7ae02dd0003dceb948001e5bebcae15dd0003dceb948011c6b182f214dd0001eeb5ca8006d399feae5d00779ae58006d0a995c6169d0001eeb5ca8009e782f7f2149d002fd7c28002c5a8c2a214] def rowsChunk13:List (ℚ × Label):=PackedPhaseRowsData.decodeExtended [0x10894007d08010201010101010208930003dceb948020f68e0101010001020100089300779ae5801deeaaaa01010100010201000892000bf5f0c0398ceefa08900001eeb5ca802299998a088c0001eeb5ca803bd5d8ee088f004ca5d0018c85ce088800779ae5800e8494d208870003dceb94801eb59ac5d209] def rows:List (ℚ × Label) := rowsChunk0 ++ rowsChunk1 ++ rowsChunk2 ++ rowsChunk3 ++ rowsChunk4 ++ rowsChunk5 ++ rowsChunk6 ++ rowsChunk7 ++ rowsChunk8 ++ rowsChunk9 ++ rowsChunk10 ++ rowsChunk11 ++ rowsChunk12 ++ rowsChunk13 def quad0:Expression:=quadSlack rows 0 0 false def quad0Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad0Target:NormalForm:=rationalNormal QuadHeightCover18Case0.base QuadHeightCover18Case0.hinges QuadHeightCover18Case0.normalizationDenominator theorem quad0_identity:identityCheck quad0 quad0Rewrites quad0Target = true:=by decide +kernel private def zz1772:"s06ec"="s06ec":=by decide+kernel theorem quad0_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad0 x:=by rw [identityCheck_sound _ _ _ x quad0_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case0.base QuadHeightCover18Case0.hinges QuadHeightCover18Case0.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case0.nonnegative x hx def quad1:Expression:=quadSlack rows 0 0 true def quad1Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad1Target:NormalForm:=rationalNormal QuadHeightCover18Case1.base QuadHeightCover18Case1.hinges QuadHeightCover18Case1.normalizationDenominator theorem quad1_identity:identityCheck quad1 quad1Rewrites quad1Target = true:=by decide +kernel theorem quad1_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad1 x:=by rw [identityCheck_sound _ _ _ x quad1_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case1.base QuadHeightCover18Case1.hinges QuadHeightCover18Case1.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case1.nonnegative x hx def quad2:Expression:=quadSlack rows 0 1 false def quad2Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r55,RewriteAtoms.r63,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad2Target:NormalForm:=rationalNormal QuadHeightCover18Case2.base QuadHeightCover18Case2.hinges QuadHeightCover18Case2.normalizationDenominator theorem quad2_identity:identityCheck quad2 quad2Rewrites quad2Target = true:=by decide +kernel private def zz1773:"s06ed"="s06ed":=by decide+kernel theorem quad2_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad2 x:=by rw [identityCheck_sound _ _ _ x quad2_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case2.base QuadHeightCover18Case2.hinges QuadHeightCover18Case2.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case2.nonnegative x hx def quad3:Expression:=quadSlack rows 0 1 true def quad3Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r20,RewriteAtoms.r67,RewriteAtoms.r23,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r48,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r55,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad3Target:NormalForm:=rationalNormal QuadHeightCover18Case3.base QuadHeightCover18Case3.hinges QuadHeightCover18Case3.normalizationDenominator theorem quad3_identity:identityCheck quad3 quad3Rewrites quad3Target = true:=by decide +kernel theorem quad3_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad3 x:=by rw [identityCheck_sound _ _ _ x quad3_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case3.base QuadHeightCover18Case3.hinges QuadHeightCover18Case3.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case3.nonnegative x hx def quad4:Expression:=quadSlack rows 0 2 false def quad4Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r59,RewriteAtoms.r20,RewriteAtoms.r17,RewriteAtoms.r19,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad4Target:NormalForm:=rationalNormal QuadHeightCover18Case4.base QuadHeightCover18Case4.hinges QuadHeightCover18Case4.normalizationDenominator theorem quad4_identity:identityCheck quad4 quad4Rewrites quad4Target = true:=by decide +kernel private def zz1774:"s06ee"="s06ee":=by decide+kernel theorem quad4_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad4 x:=by rw [identityCheck_sound _ _ _ x quad4_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case4.base QuadHeightCover18Case4.hinges QuadHeightCover18Case4.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case4.nonnegative x hx def quad5:Expression:=quadSlack rows 0 2 true def quad5Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r20,RewriteAtoms.r25,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r19,RewriteAtoms.r50,RewriteAtoms.r1,RewriteAtoms.r54,RewriteAtoms.r3,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad5Target:NormalForm:=rationalNormal QuadHeightCover18Case5.base QuadHeightCover18Case5.hinges QuadHeightCover18Case5.normalizationDenominator theorem quad5_identity:identityCheck quad5 quad5Rewrites quad5Target = true:=by decide +kernel theorem quad5_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad5 x:=by rw [identityCheck_sound _ _ _ x quad5_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case5.base QuadHeightCover18Case5.hinges QuadHeightCover18Case5.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case5.nonnegative x hx def quad6:Expression:=quadSlack rows 0 3 false def quad6Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r78,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad6Target:NormalForm:=rationalNormal QuadHeightCover18Case6.base QuadHeightCover18Case6.hinges QuadHeightCover18Case6.normalizationDenominator theorem quad6_identity:identityCheck quad6 quad6Rewrites quad6Target = true:=by decide +kernel private def zz1775:"s06ef"="s06ef":=by decide+kernel theorem quad6_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad6 x:=by rw [identityCheck_sound _ _ _ x quad6_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case6.base QuadHeightCover18Case6.hinges QuadHeightCover18Case6.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case6.nonnegative x hx def quad7:Expression:=quadSlack rows 0 3 true def quad7Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r20,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad7Target:NormalForm:=rationalNormal QuadHeightCover18Case7.base QuadHeightCover18Case7.hinges QuadHeightCover18Case7.normalizationDenominator theorem quad7_identity:identityCheck quad7 quad7Rewrites quad7Target = true:=by decide +kernel theorem quad7_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad7 x:=by rw [identityCheck_sound _ _ _ x quad7_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case7.base QuadHeightCover18Case7.hinges QuadHeightCover18Case7.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case7.nonnegative x hx def quad8:Expression:=quadSlack rows 1 1 false def quad8Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad8Target:NormalForm:=rationalNormal QuadHeightCover18Case8.base QuadHeightCover18Case8.hinges QuadHeightCover18Case8.normalizationDenominator theorem quad8_identity:identityCheck quad8 quad8Rewrites quad8Target = true:=by decide +kernel private def zz1776:"s06f0"="s06f0":=by decide+kernel theorem quad8_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad8 x:=by rw [identityCheck_sound _ _ _ x quad8_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case8.base QuadHeightCover18Case8.hinges QuadHeightCover18Case8.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case8.nonnegative x hx def quad9:Expression:=quadSlack rows 1 1 true def quad9Rewrites:Rewrites:=[RewriteAtoms.r59,RewriteAtoms.r60,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad9Target:NormalForm:=rationalNormal QuadHeightCover18Case9.base QuadHeightCover18Case9.hinges QuadHeightCover18Case9.normalizationDenominator theorem quad9_identity:identityCheck quad9 quad9Rewrites quad9Target = true:=by decide +kernel theorem quad9_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad9 x:=by rw [identityCheck_sound _ _ _ x quad9_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case9.base QuadHeightCover18Case9.hinges QuadHeightCover18Case9.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case9.nonnegative x hx def quad10:Expression:=quadSlack rows 1 2 false def quad10Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r4,RewriteAtoms.r6,RewriteAtoms.r57,RewriteAtoms.r56,RewriteAtoms.r64,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad10Target:NormalForm:=rationalNormal QuadHeightCover18Case10.base QuadHeightCover18Case10.hinges QuadHeightCover18Case10.normalizationDenominator theorem quad10_identity:identityCheck quad10 quad10Rewrites quad10Target = true:=by decide +kernel private def zz1777:"s06f1"="s06f1":=by decide+kernel theorem quad10_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad10 x:=by rw [identityCheck_sound _ _ _ x quad10_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case10.base QuadHeightCover18Case10.hinges QuadHeightCover18Case10.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case10.nonnegative x hx def quad11:Expression:=quadSlack rows 1 2 true def quad11Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r66,RewriteAtoms.r24,RewriteAtoms.r59,RewriteAtoms.r45,RewriteAtoms.r20,RewriteAtoms.r30,RewriteAtoms.r82,RewriteAtoms.r61,RewriteAtoms.r16,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r56,RewriteAtoms.r79,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad11Target:NormalForm:=rationalNormal QuadHeightCover18Case11.base QuadHeightCover18Case11.hinges QuadHeightCover18Case11.normalizationDenominator theorem quad11_identity:identityCheck quad11 quad11Rewrites quad11Target = true:=by decide +kernel theorem quad11_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad11 x:=by rw [identityCheck_sound _ _ _ x quad11_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case11.base QuadHeightCover18Case11.hinges QuadHeightCover18Case11.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case11.nonnegative x hx def quad12:Expression:=quadSlack rows 1 3 false def quad12Rewrites:Rewrites:=[RewriteAtoms.r80,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r5,RewriteAtoms.r64,RewriteAtoms.r4,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad12Target:NormalForm:=rationalNormal QuadHeightCover18Case12.base QuadHeightCover18Case12.hinges QuadHeightCover18Case12.normalizationDenominator theorem quad12_identity:identityCheck quad12 quad12Rewrites quad12Target = true:=by decide +kernel private def zz1778:"s06f2"="s06f2":=by decide+kernel theorem quad12_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad12 x:=by rw [identityCheck_sound _ _ _ x quad12_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case12.base QuadHeightCover18Case12.hinges QuadHeightCover18Case12.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case12.nonnegative x hx def quad13:Expression:=quadSlack rows 1 3 true def quad13Rewrites:Rewrites:=[RewriteAtoms.r65,RewriteAtoms.r45,RewriteAtoms.r25,RewriteAtoms.r67,RewriteAtoms.r17,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r64,RewriteAtoms.r9,RewriteAtoms.r4,RewriteAtoms.r55,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad13Target:NormalForm:=rationalNormal QuadHeightCover18Case13.base QuadHeightCover18Case13.hinges QuadHeightCover18Case13.normalizationDenominator theorem quad13_identity:identityCheck quad13 quad13Rewrites quad13Target = true:=by decide +kernel theorem quad13_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad13 x:=by rw [identityCheck_sound _ _ _ x quad13_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case13.base QuadHeightCover18Case13.hinges QuadHeightCover18Case13.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case13.nonnegative x hx def quad14:Expression:=quadSlack rows 2 2 false def quad14Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r61,RewriteAtoms.r62,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad14Target:NormalForm:=rationalNormal QuadHeightCover18Case14.base QuadHeightCover18Case14.hinges QuadHeightCover18Case14.normalizationDenominator theorem quad14_identity:identityCheck quad14 quad14Rewrites quad14Target = true:=by decide +kernel private def zz1779:"s06f3"="s06f3":=by decide+kernel theorem quad14_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad14 x:=by rw [identityCheck_sound _ _ _ x quad14_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case14.base QuadHeightCover18Case14.hinges QuadHeightCover18Case14.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case14.nonnegative x hx def quad15:Expression:=quadSlack rows 2 2 true def quad15Rewrites:Rewrites:=[RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r16,RewriteAtoms.r17,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r49,RewriteAtoms.r50,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r53,RewriteAtoms.r54,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r78,RewriteAtoms.r79,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r57,RewriteAtoms.r58,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad15Target:NormalForm:=rationalNormal QuadHeightCover18Case15.base QuadHeightCover18Case15.hinges QuadHeightCover18Case15.normalizationDenominator theorem quad15_identity:identityCheck quad15 quad15Rewrites quad15Target = true:=by decide +kernel theorem quad15_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad15 x:=by rw [identityCheck_sound _ _ _ x quad15_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case15.base QuadHeightCover18Case15.hinges QuadHeightCover18Case15.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case15.nonnegative x hx def quad16:Expression:=quadSlack rows 2 3 false def quad16Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r20,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r7,RewriteAtoms.r58,RewriteAtoms.r78,RewriteAtoms.r57,RewriteAtoms.r8,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad16Target:NormalForm:=rationalNormal QuadHeightCover18Case16.base QuadHeightCover18Case16.hinges QuadHeightCover18Case16.normalizationDenominator theorem quad16_identity:identityCheck quad16 quad16Rewrites quad16Target = true:=by decide +kernel private def zz1780:"s06f4"="s06f4":=by decide+kernel theorem quad16_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad16 x:=by rw [identityCheck_sound _ _ _ x quad16_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case16.base QuadHeightCover18Case16.hinges QuadHeightCover18Case16.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case16.nonnegative x hx def quad17:Expression:=quadSlack rows 2 3 true def quad17Rewrites:Rewrites:=[RewriteAtoms.r22,RewriteAtoms.r65,RewriteAtoms.r24,RewriteAtoms.r45,RewriteAtoms.r62,RewriteAtoms.r68,RewriteAtoms.r48,RewriteAtoms.r1,RewriteAtoms.r52,RewriteAtoms.r3,RewriteAtoms.r5,RewriteAtoms.r79,RewriteAtoms.r64,RewriteAtoms.r58,RewriteAtoms.r4,RewriteAtoms.r78,RewriteAtoms.r6,RewriteAtoms.r63,RewriteAtoms.r57,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad17Target:NormalForm:=rationalNormal QuadHeightCover18Case17.base QuadHeightCover18Case17.hinges QuadHeightCover18Case17.normalizationDenominator theorem quad17_identity:identityCheck quad17 quad17Rewrites quad17Target = true:=by decide +kernel theorem quad17_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad17 x:=by rw [identityCheck_sound _ _ _ x quad17_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case17.base QuadHeightCover18Case17.hinges QuadHeightCover18Case17.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case17.nonnegative x hx def quad18:Expression:=quadSlack rows 3 3 false def quad18Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad18Target:NormalForm:=rationalNormal QuadHeightCover18Case18.base QuadHeightCover18Case18.hinges QuadHeightCover18Case18.normalizationDenominator theorem quad18_identity:identityCheck quad18 quad18Rewrites quad18Target = true:=by decide +kernel private def zz1781:"s06f5"="s06f5":=by decide+kernel theorem quad18_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad18 x:=by rw [identityCheck_sound _ _ _ x quad18_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case18.base QuadHeightCover18Case18.hinges QuadHeightCover18Case18.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case18.nonnegative x hx def quad19:Expression:=quadSlack rows 3 3 true def quad19Rewrites:Rewrites:=[RewriteAtoms.r45,RewriteAtoms.r46,RewriteAtoms.r20,RewriteAtoms.r21,RewriteAtoms.r18,RewriteAtoms.r19,RewriteAtoms.r47,RewriteAtoms.r48,RewriteAtoms.r0,RewriteAtoms.r1,RewriteAtoms.r51,RewriteAtoms.r52,RewriteAtoms.r2,RewriteAtoms.r3,RewriteAtoms.r4,RewriteAtoms.r5,RewriteAtoms.r55,RewriteAtoms.r56,RewriteAtoms.r6,RewriteAtoms.r7,RewriteAtoms.r63,RewriteAtoms.r64,RewriteAtoms.r8,RewriteAtoms.r9,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15,RewriteAtoms.r10,RewriteAtoms.r11,RewriteAtoms.r12,RewriteAtoms.r13,RewriteAtoms.r14,RewriteAtoms.r15] def quad19Target:NormalForm:=rationalNormal QuadHeightCover18Case19.base QuadHeightCover18Case19.hinges QuadHeightCover18Case19.normalizationDenominator theorem quad19_identity:identityCheck quad19 quad19Rewrites quad19Target = true:=by decide +kernel theorem quad19_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval quad19 x:=by rw [identityCheck_sound _ _ _ x quad19_identity] change 0 ≤ normalEval (rationalNormal QuadHeightCover18Case19.base QuadHeightCover18Case19.hinges QuadHeightCover18Case19.normalizationDenominator) x rw [rationalNormal_eval] exact QuadHeightCover18Case19.nonnegative x hx def pair20:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 0 0 false def pair20Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair20Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_20_base LocalPairs.compact_height18_pair_20_hinges theorem pair20_identity:identityCheck pair20 pair20Rewrites pair20Target = true:=by decide +kernel private def zz1782:"s06f6"="s06f6":=by decide+kernel theorem pair20_target_eval (x:Point):normalEval pair20Target x = LocalPairs.height18_pair_20 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_20_base LocalPairs.compact_height18_pair_20_hinges x theorem pair20_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair20 x:=by rw [identityCheck_sound _ _ _ x pair20_identity,pair20_target_eval] exact LocalPairs.height18_pair_20_nonneg (hx 0) (hx 1) def pair21:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 0 0 true def pair21Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair21Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_21_base LocalPairs.compact_height18_pair_21_hinges theorem pair21_identity:identityCheck pair21 pair21Rewrites pair21Target = true:=by decide +kernel theorem pair21_target_eval (x:Point):normalEval pair21Target x = LocalPairs.height18_pair_21 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_21_base LocalPairs.compact_height18_pair_21_hinges x private def zz1783:"s06f7"="s06f7":=by decide+kernel theorem pair21_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair21 x:=by rw [identityCheck_sound _ _ _ x pair21_identity,pair21_target_eval] exact LocalPairs.height18_pair_21_nonneg (hx 0) (hx 1) def pair22:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 0 1 false def pair22Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair22Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_22_base LocalPairs.compact_height18_pair_22_hinges theorem pair22_identity:identityCheck pair22 pair22Rewrites pair22Target = true:=by decide +kernel theorem pair22_target_eval (x:Point):normalEval pair22Target x = LocalPairs.height18_pair_22 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_22_base LocalPairs.compact_height18_pair_22_hinges x theorem pair22_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair22 x:=by rw [identityCheck_sound _ _ _ x pair22_identity,pair22_target_eval] exact LocalPairs.height18_pair_22_nonneg (hx 0) (hx 1) def pair23:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 0 1 true def pair23Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair23Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_23_base LocalPairs.compact_height18_pair_23_hinges private def zz1784:"s06f8"="s06f8":=by decide+kernel theorem pair23_identity:identityCheck pair23 pair23Rewrites pair23Target = true:=by decide +kernel theorem pair23_target_eval (x:Point):normalEval pair23Target x = LocalPairs.height18_pair_23 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_23_base LocalPairs.compact_height18_pair_23_hinges x theorem pair23_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair23 x:=by rw [identityCheck_sound _ _ _ x pair23_identity,pair23_target_eval] exact LocalPairs.height18_pair_23_nonneg (hx 0) (hx 1) def pair24:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 0 2 false def pair24Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair24Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_24_base LocalPairs.compact_height18_pair_24_hinges theorem pair24_identity:identityCheck pair24 pair24Rewrites pair24Target = true:=by decide +kernel private def zz1785:"s06f9"="s06f9":=by decide+kernel theorem pair24_target_eval (x:Point):normalEval pair24Target x = LocalPairs.height18_pair_24 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_24_base LocalPairs.compact_height18_pair_24_hinges x theorem pair24_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair24 x:=by rw [identityCheck_sound _ _ _ x pair24_identity,pair24_target_eval] exact LocalPairs.height18_pair_24_nonneg (hx 0) (hx 1) def pair25:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 0 2 true def pair25Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r26,RewriteAtoms.r72,RewriteAtoms.r71,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair25Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_25_base LocalPairs.compact_height18_pair_25_hinges theorem pair25_identity:identityCheck pair25 pair25Rewrites pair25Target = true:=by decide +kernel theorem pair25_target_eval (x:Point):normalEval pair25Target x = LocalPairs.height18_pair_25 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_25_base LocalPairs.compact_height18_pair_25_hinges x private def zz1786:"s06fa"="s06fa":=by decide+kernel theorem pair25_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair25 x:=by rw [identityCheck_sound _ _ _ x pair25_identity,pair25_target_eval] exact LocalPairs.height18_pair_25_nonneg (hx 0) (hx 1) def pair26:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 0 3 false def pair26Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair26Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_26_base LocalPairs.compact_height18_pair_26_hinges theorem pair26_identity:identityCheck pair26 pair26Rewrites pair26Target = true:=by decide +kernel theorem pair26_target_eval (x:Point):normalEval pair26Target x = LocalPairs.height18_pair_26 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_26_base LocalPairs.compact_height18_pair_26_hinges x theorem pair26_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair26 x:=by rw [identityCheck_sound _ _ _ x pair26_identity,pair26_target_eval] exact LocalPairs.height18_pair_26_nonneg (hx 0) (hx 1) def pair27:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 0 3 true def pair27Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair27Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_27_base LocalPairs.compact_height18_pair_27_hinges private def zz1787:"s06fb"="s06fb":=by decide+kernel theorem pair27_identity:identityCheck pair27 pair27Rewrites pair27Target = true:=by decide +kernel theorem pair27_target_eval (x:Point):normalEval pair27Target x = LocalPairs.height18_pair_27 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_27_base LocalPairs.compact_height18_pair_27_hinges x theorem pair27_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair27 x:=by rw [identityCheck_sound _ _ _ x pair27_identity,pair27_target_eval] exact LocalPairs.height18_pair_27_nonneg (hx 0) (hx 1) def pair28:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 1 1 false def pair28Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair28Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_28_base LocalPairs.compact_height18_pair_28_hinges theorem pair28_identity:identityCheck pair28 pair28Rewrites pair28Target = true:=by decide +kernel private def zz1788:"s06fc"="s06fc":=by decide+kernel theorem pair28_target_eval (x:Point):normalEval pair28Target x = LocalPairs.height18_pair_28 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_28_base LocalPairs.compact_height18_pair_28_hinges x theorem pair28_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair28 x:=by rw [identityCheck_sound _ _ _ x pair28_identity,pair28_target_eval] exact LocalPairs.height18_pair_28_nonneg (hx 0) (hx 1) def pair29:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 1 1 true def pair29Rewrites:Rewrites:=[RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair29Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_29_base LocalPairs.compact_height18_pair_29_hinges theorem pair29_identity:identityCheck pair29 pair29Rewrites pair29Target = true:=by decide +kernel theorem pair29_target_eval (x:Point):normalEval pair29Target x = LocalPairs.height18_pair_29 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_29_base LocalPairs.compact_height18_pair_29_hinges x private def zz1789:"s06fd"="s06fd":=by decide+kernel theorem pair29_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair29 x:=by rw [identityCheck_sound _ _ _ x pair29_identity,pair29_target_eval] exact LocalPairs.height18_pair_29_nonneg (hx 0) (hx 1) def pair30:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 1 2 false def pair30Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair30Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_30_base LocalPairs.compact_height18_pair_30_hinges theorem pair30_identity:identityCheck pair30 pair30Rewrites pair30Target = true:=by decide +kernel theorem pair30_target_eval (x:Point):normalEval pair30Target x = LocalPairs.height18_pair_30 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_30_base LocalPairs.compact_height18_pair_30_hinges x theorem pair30_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair30 x:=by rw [identityCheck_sound _ _ _ x pair30_identity,pair30_target_eval] exact LocalPairs.height18_pair_30_nonneg (hx 0) (hx 1) def pair31:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 1 2 true def pair31Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair31Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_31_base LocalPairs.compact_height18_pair_31_hinges private def zz1790:"s06fe"="s06fe":=by decide+kernel theorem pair31_identity:identityCheck pair31 pair31Rewrites pair31Target = true:=by decide +kernel theorem pair31_target_eval (x:Point):normalEval pair31Target x = LocalPairs.height18_pair_31 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_31_base LocalPairs.compact_height18_pair_31_hinges x theorem pair31_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair31 x:=by rw [identityCheck_sound _ _ _ x pair31_identity,pair31_target_eval] exact LocalPairs.height18_pair_31_nonneg (hx 0) (hx 1) def pair32:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 1 3 false def pair32Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r2,RewriteAtoms.r49,RewriteAtoms.r53,RewriteAtoms.r2,RewriteAtoms.r70,RewriteAtoms.r71,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair32Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_32_base LocalPairs.compact_height18_pair_32_hinges theorem pair32_identity:identityCheck pair32 pair32Rewrites pair32Target = true:=by decide +kernel private def zz1791:"s06ff"="s06ff":=by decide+kernel theorem pair32_target_eval (x:Point):normalEval pair32Target x = LocalPairs.height18_pair_32 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_32_base LocalPairs.compact_height18_pair_32_hinges x theorem pair32_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair32 x:=by rw [identityCheck_sound _ _ _ x pair32_identity,pair32_target_eval] exact LocalPairs.height18_pair_32_nonneg (hx 0) (hx 1) def pair33:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 1 3 true def pair33Rewrites:Rewrites:=[RewriteAtoms.r47,RewriteAtoms.r53,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r2,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r72,RewriteAtoms.r71,RewriteAtoms.r18,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r70,RewriteAtoms.r72,RewriteAtoms.r27,RewriteAtoms.r71,RewriteAtoms.r69,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair33Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_33_base LocalPairs.compact_height18_pair_33_hinges theorem pair33_identity:identityCheck pair33 pair33Rewrites pair33Target = true:=by decide +kernel theorem pair33_target_eval (x:Point):normalEval pair33Target x = LocalPairs.height18_pair_33 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_33_base LocalPairs.compact_height18_pair_33_hinges x private def zz1792:"s0700"="s0700":=by decide+kernel theorem pair33_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair33 x:=by rw [identityCheck_sound _ _ _ x pair33_identity,pair33_target_eval] exact LocalPairs.height18_pair_33_nonneg (hx 0) (hx 1) def pair34:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 2 2 false def pair34Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair34Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_34_base LocalPairs.compact_height18_pair_34_hinges theorem pair34_identity:identityCheck pair34 pair34Rewrites pair34Target = true:=by decide +kernel theorem pair34_target_eval (x:Point):normalEval pair34Target x = LocalPairs.height18_pair_34 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_34_base LocalPairs.compact_height18_pair_34_hinges x theorem pair34_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair34 x:=by rw [identityCheck_sound _ _ _ x pair34_identity,pair34_target_eval] exact LocalPairs.height18_pair_34_nonneg (hx 0) (hx 1) def pair35:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 2 2 true def pair35Rewrites:Rewrites:=[RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r49,RewriteAtoms.r72,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair35Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_35_base LocalPairs.compact_height18_pair_35_hinges private def zz1793:"s0701"="s0701":=by decide+kernel theorem pair35_identity:identityCheck pair35 pair35Rewrites pair35Target = true:=by decide +kernel theorem pair35_target_eval (x:Point):normalEval pair35Target x = LocalPairs.height18_pair_35 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_35_base LocalPairs.compact_height18_pair_35_hinges x theorem pair35_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair35 x:=by rw [identityCheck_sound _ _ _ x pair35_identity,pair35_target_eval] exact LocalPairs.height18_pair_35_nonneg (hx 0) (hx 1) def pair36:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 2 3 false def pair36Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair36Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_36_base LocalPairs.compact_height18_pair_36_hinges theorem pair36_identity:identityCheck pair36 pair36Rewrites pair36Target = true:=by decide +kernel private def zz1794:"s0702"="s0702":=by decide+kernel theorem pair36_target_eval (x:Point):normalEval pair36Target x = LocalPairs.height18_pair_36 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_36_base LocalPairs.compact_height18_pair_36_hinges x theorem pair36_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair36 x:=by rw [identityCheck_sound _ _ _ x pair36_identity,pair36_target_eval] exact LocalPairs.height18_pair_36_nonneg (hx 0) (hx 1) def pair37:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 2 3 true def pair37Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r53,RewriteAtoms.r49,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r53,RewriteAtoms.r47,RewriteAtoms.r0,RewriteAtoms.r51,RewriteAtoms.r2,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair37Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_37_base LocalPairs.compact_height18_pair_37_hinges theorem pair37_identity:identityCheck pair37 pair37Rewrites pair37Target = true:=by decide +kernel theorem pair37_target_eval (x:Point):normalEval pair37Target x = LocalPairs.height18_pair_37 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_37_base LocalPairs.compact_height18_pair_37_hinges x private def zz1795:"s0703"="s0703":=by decide+kernel theorem pair37_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair37 x:=by rw [identityCheck_sound _ _ _ x pair37_identity,pair37_target_eval] exact LocalPairs.height18_pair_37_nonneg (hx 0) (hx 1) def pair38:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 3 3 false def pair38Rewrites:Rewrites:=[RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair38Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_38_base LocalPairs.compact_height18_pair_38_hinges theorem pair38_identity:identityCheck pair38 pair38Rewrites pair38Target = true:=by decide +kernel theorem pair38_target_eval (x:Point):normalEval pair38Target x = LocalPairs.height18_pair_38 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_38_base LocalPairs.compact_height18_pair_38_hinges x theorem pair38_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair38 x:=by rw [identityCheck_sound _ _ _ x pair38_identity,pair38_target_eval] exact LocalPairs.height18_pair_38_nonneg (hx 0) (hx 1) def pair39:Expression:=HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows 3 3 true def pair39Rewrites:Rewrites:=[RewriteAtoms.r53,RewriteAtoms.r69,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r18,RewriteAtoms.r26,RewriteAtoms.r47,RewriteAtoms.r70,RewriteAtoms.r0,RewriteAtoms.r27,RewriteAtoms.r51,RewriteAtoms.r71,RewriteAtoms.r2,RewriteAtoms.r28,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76,RewriteAtoms.r73,RewriteAtoms.r2,RewriteAtoms.r74,RewriteAtoms.r75,RewriteAtoms.r28,RewriteAtoms.r76] def pair39Target:NormalForm:=CompactPair.toNormal LocalPairs.compact_height18_pair_39_base LocalPairs.compact_height18_pair_39_hinges private def zz1796:"s0704"="s0704":=by decide+kernel theorem pair39_identity:identityCheck pair39 pair39Rewrites pair39Target = true:=by decide +kernel theorem pair39_target_eval (x:Point):normalEval pair39Target x = LocalPairs.height18_pair_39 (x 0) (x 1):=by exact CompactPair.toNormal_eval LocalPairs.compact_height18_pair_39_base LocalPairs.compact_height18_pair_39_hinges x theorem pair39_nonneg (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval pair39 x:=by rw [identityCheck_sound _ _ _ x pair39_identity,pair39_target_eval] exact LocalPairs.height18_pair_39_nonneg (hx 0) (hx 1) theorem quad_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (quadSlack rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact quad0_nonneg x hx · exact quad1_nonneg x hx · exact quad2_nonneg x hx · exact quad3_nonneg x hx · exact quad4_nonneg x hx · exact quad5_nonneg x hx · exact quad6_nonneg x hx · exact quad7_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact quad8_nonneg x hx · exact quad9_nonneg x hx · exact quad10_nonneg x hx · exact quad11_nonneg x hx · exact quad12_nonneg x hx · exact quad13_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact quad14_nonneg x hx · exact quad15_nonneg x hx · exact quad16_nonneg x hx · exact quad17_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact quad18_nonneg x hx · exact quad19_nonneg x hx private def zz1797:"s0705"="s0705":=by decide+kernel theorem pair_nonneg (p q:Phase) (hpq:p.val ≤ q.val) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i):0 ≤ expressionEval (HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) rows p q same) x:=by fin_cases p <;> fin_cases q <;> cases same · exact pair20_nonneg x hx · exact pair21_nonneg x hx · exact pair22_nonneg x hx · exact pair23_nonneg x hx · exact pair24_nonneg x hx · exact pair25_nonneg x hx · exact pair26_nonneg x hx · exact pair27_nonneg x hx · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (1:ℕ) ≤ 0) hpq) · exact pair28_nonneg x hx · exact pair29_nonneg x hx · exact pair30_nonneg x hx · exact pair31_nonneg x hx · exact pair32_nonneg x hx · exact pair33_nonneg x hx · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (2:ℕ) ≤ 1) hpq) · exact pair34_nonneg x hx · exact pair35_nonneg x hx · exact pair36_nonneg x hx · exact pair37_nonneg x hx · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 0) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 1) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact False.elim ((by decide:¬ (3:ℕ) ≤ 2) hpq) · exact pair38_nonneg x hx · exact pair39_nonneg x hx end Green24Proof.HeightCover18Rows private def zz2405:"s0965"="s0965":=by decide+kernel end section namespace Green24Proof.HeightCover18Cyclic open QuadraticCertificates ExpressionCertificates ExtendedFullPhaseRows FullPhaseSemantics open FullPhaseRows (Phase) open FullPhaseAggregation (quadPoint_nonneg pairPoint_nonneg) open FullPhaseSymmetry (reversePoint swapPair reversePoint_nonneg swapPair_nonneg) open ExtendedFullPhaseAggregation theorem quad_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (quadSlack HeightCover18Rows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact HeightCover18Rows.quad_nonneg p q h same x hx · rw [← quadSlack_reverse HeightCover18Rows.rows p q same x] exact HeightCover18Rows.quad_nonneg q p h same (reversePoint x) (reversePoint_nonneg x hx) theorem pair_nonneg (p q:Phase) (same:Bool) (x:Point) (hx:∀ i,0 ≤ x i) : 0 ≤ expressionEval (HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) HeightCover18Rows.rows p q same) x:=by rcases le_total p.val q.val with h | h · exact HeightCover18Rows.pair_nonneg p q h same x hx · rw [← HeightFullPhaseRows.pairSlack_swap ((9 / 5)) ((-1 / 0xc8)) (2 / 5) HeightCover18Rows.rows p q same x] exact HeightCover18Rows.pair_nonneg q p h same (swapPair x) (swapPair_nonneg x hx) theorem rows_admissible:rowsAdmissible HeightCover18Rows.rows = true:=by decide +kernel def remainingRows:List (ℚ × Label):=stripPotentials HeightCover18Rows.rows private def zz1798:"s0706"="s0706":=by decide+kernel theorem remaining_rows_count:remainingRows.length = 12:=by decide +kernel theorem certificate_sum {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : ((-1 / 50):ℝ) * mass g ^ 2 + (8 / 5:ℝ) * energy g ≤ weightedAggregate ((9 / 5)) h4 h3 g remainingRows + 4 * deficit g:=by have hl (j k:ZMod q):0 ≤ expressionEval (quadSlack HeightCover18Rows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (quadPoint g j k) + expressionEval (HeightFullPhaseRows.pairSlack ((9 / 5)) ((-1 / 0xc8)) (2 / 5) HeightCover18Rows.rows (ZMod.castHom h4 (ZMod 4) j) (ZMod.castHom h4 (ZMod 4) k) (sameColour h3 j k)) (pairPoint g j k) := add_nonneg (quad_nonneg _ _ _ _ (quadPoint_nonneg g hg j k)) (pair_nonneg _ _ _ _ (pairPoint_nonneg g hg j k)) have hs:=Finset.sum_nonneg (s:=Finset.univ) fun j _ => Finset.sum_nonneg (s:=Finset.univ) fun k _ => hl j k rw [HeightFullPhaseRows.local_slacks_sum ((9 / 5)) ((-1 / 0xc8)) (2 / 5) h4 h3 g hg,stripPotentials_sound ((9 / 5)) h4 h3 h5 g HeightCover18Rows.rows rows_admissible] at hs norm_num at hs change ((-1 / 50):ℝ) * mass g ^ 2 + (8 / 5:ℝ) * energy g ≤ weightedAggregate ((9 / 5)) h4 h3 g (stripPotentials HeightCover18Rows.rows) + 4 * deficit g linarith end Green24Proof.HeightCover18Cyclic private def zz2406:"s0966"="s0966":=by decide+kernel end section namespace Green24Proof.HeightCover18Mass open ExtendedFullPhaseRows ExtendedFullPhaseAggregation open PhaseMassRows PhaseWeightedVectors PhaseColourRows theorem remainingRows_eq:HeightCover18Cyclic.remainingRows = [ ((0x4e7f2cd7 / 0x1dcd6500), .base (.balance 0 (1))), ((0xf4040a4b / 0x3b9aca00), .base (.balance 1 (-1))), ((0x9e99e095 / 0x3b9aca00), .base (.balance 2 (1))), ((0xf3535169 / 0x3b9aca00), .base (.balance 3 (-1))), ((0xe08529 / 0xee6b280), .base (.child 0)), ((0x118167 / 0x1312d0), .base (.heightChild 1)), ((0x3bab637 / 0x1dcd6500), .base (.grandchild 2)), ((0x2232645 / 0x1dcd6500), .base (.ordered 0)), ((0x3919bbd / 0x17d7840), .base (.massSquare false (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((0x1ddca95 / 0xee6b280), .base (.massSquare true (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p))), ((0x41d87 / 0x3b9aca00), .base (.massSquare true (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p))), ((4 / 0x7d), .base (.normalization))]:=by apply (CombinedPolicyPackedRowsEquality.rowsEqWith_iff CombinedPolicyPackedRowsEquality.extendedEq CombinedPolicyPackedRowsEquality.extendedEq_iff _ _).mp decide +kernel noncomputable def balanceMass {q:ℕ} [NeZero q] (h4:4 ∣ q) (g:ZMod q → ℝ):ℝ := (((0x4e7f2cd7 / 0x1dcd6500):ℝ) * phaseTotal h4 g 0 + ((-0xf4040a4b / 0x3b9aca00):ℝ) * phaseTotal h4 g 1 + ((0x9e99e095 / 0x3b9aca00):ℝ) * phaseTotal h4 g 2 + ((-0xf3535169 / 0x3b9aca00):ℝ) * phaseTotal h4 g 3) * ((phaseTotal h4 g 0 + phaseTotal h4 g 2) - ((9 / 5):ℝ) * (phaseTotal h4 g 1 + phaseTotal h4 g 3)) theorem weighted_remaining_le {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hrow0:rowAggregate ((9 / 5)) h4 h3 g (.base (.child 0)) ≤ 0) (hrow1:rowAggregate ((9 / 5)) h4 h3 g (.base (.heightChild 1)) ≤ 0) (hrow2:rowAggregate ((9 / 5)) h4 h3 g (.base (.grandchild 2)) ≤ 0) : weightedAggregate ((9 / 5)) h4 h3 g HeightCover18Cyclic.remainingRows ≤ balanceMass h4 g - ((0x3919bbd / 0x17d7840):ℝ) * (phaseTotal h4 g 1 - phaseTotal h4 g 3) ^ 2 + ((4 / 0x7d):ℝ) * mass g ^ 2:=by have ho:=rowAggregate_ordered_nonpos ((9 / 5)) h4 h3 g hg 0 (by simpa using heven) have hs9:=rowAggregate_colouredMassSquare_nonpos ((9 / 5)) h4 h3 g (fun p => (![0,1,0, -1]:Fin 4 → ℚ) p) have hs10:=rowAggregate_colouredMassSquare_nonpos ((9 / 5)) h4 h3 g (fun p => (![1, -1, -1,1]:Fin 4 → ℚ) p) rw [remainingRows_eq] simp only [weightedAggregate,List.map_cons,List.map_nil,List.sum_cons,List.sum_nil, rowAggregate_base,rowAggregate_balance,rowAggregate_normalization,odd_massSquare] simp only [rowAggregate_base] at hrow0 hrow1 hrow2 norm_num unfold balanceMass linarith private def zz1799:"s0707"="s0707":=by decide+kernel theorem aggregate_of_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hrow0:rowAggregate ((9 / 5)) h4 h3 g (.base (.child 0)) ≤ 0) (hrow1:rowAggregate ((9 / 5)) h4 h3 g (.base (.heightChild 1)) ≤ 0) (hrow2:rowAggregate ((9 / 5)) h4 h3 g (.base (.grandchild 2)) ≤ 0) (h5:¬5 ∣ q) : height18.Aggregate (phaseTotal h4 g 0 + phaseTotal h4 g 2) (phaseTotal h4 g 1 + phaseTotal h4 g 3) (phaseTotal h4 g 0 - phaseTotal h4 g 2) (phaseTotal h4 g 1 - phaseTotal h4 g 3) (energy g) (deficit g):=by have hc:=HeightCover18Cyclic.certificate_sum h4 h3 h5 g hg have hr:=weighted_remaining_le h4 h3 g hg heven hrow0 hrow1 hrow2 have hm:mass g = (phaseTotal h4 g 0 + phaseTotal h4 g 2) + (phaseTotal h4 g 1 + phaseTotal h4 g 3):=by have ht:=phaseTotal_sum h4 g linarith rw [hm] at hc hr unfold HeightCoefficients.Aggregate height18 unfold balanceMass at hr norm_num nlinarith only [hc,hr] theorem height_bound_of_rows {q:ℕ} [NeZero q] (h4:4 ∣ q) (h3:3 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) (heven:phaseTotal h4 g 2 ≤ phaseTotal h4 g 0) (hrow0:rowAggregate ((9 / 5)) h4 h3 g (.base (.child 0)) ≤ 0) (hrow1:rowAggregate ((9 / 5)) h4 h3 g (.base (.heightChild 1)) ≤ 0) (hrow2:rowAggregate ((9 / 5)) h4 h3 g (.base (.grandchild 2)) ≤ 0) (h5:¬5 ∣ q) (hAB:(phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ (phaseTotal h4 g 0 + phaseTotal h4 g 2)) : (2 / 5:ℝ) * energy g + Q18 (phaseTotal h4 g 0 + phaseTotal h4 g 2) (phaseTotal h4 g 1 + phaseTotal h4 g 3) ≤ deficit g:=by apply height18_of_aggregate · exact add_nonneg (phaseTotal_nonneg h4 g hg 1) (phaseTotal_nonneg h4 g hg 3) · exact hAB · exact sub_nonneg.mpr heven · have hb:=phaseTotal_nonneg h4 g hg 2 linarith · exact aggregate_of_rows h4 h3 g hg heven hrow0 hrow1 hrow2 h5 end Green24Proof.HeightCover18Mass private def zz2407:"s0967"="s0967":=by decide+kernel end section namespace Green24Proof.HeightCover18Profile open PhaseMassRows ChildRows HeightChildRows ProfileChildren theorem height_bound_ordered {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (heven:phaseTotal h4 (interleave u v) 2 ≤ phaseTotal h4 (interleave u v) 0) (hAB:mass v ≤ mass u) : (2 / 5:ℝ) * energy (interleave u v) + Q18 (mass u) (mass v) ≤ deficit (interleave u v):=by have hg:=interleave_nonneg u v hu hv have hrow0:FullPhaseAggregation.rowAggregate ((9 / 5)) h4 h3 (interleave u v) (.child 0) ≤ 0:=by rw [rowAggregate_child_even] have hd:=ih m (by have hp:=NeZero.pos m; omega) (dvd_mul_left m 2) u hu linarith have h3m:3 ∣ m:=((Nat.prime_three.dvd_mul).mp h3).resolve_left (by decide) have h5m:¬5 ∣ m:=fun h => h5 (dvd_mul_of_dvd_right h 2) have hrow1:=rowAggregate_height_odd_nonpos ((9 / 5)) h4 h3 h2 u v hu hv (HeightStrong.strong_height_bound h2 h3m h5m v hv) have hrow2:=Full27ProfileInterval.grandchild_nonpos_of_induction ((9 / 5)) h4 h3 (interleave u v) hg 2 ih have hU:phaseTotal h4 (interleave u v) 0 + phaseTotal h4 (interleave u v) 2 = mass u:=by rw [phaseTotal_interleave_zero h4 h2,phaseTotal_interleave_two h4 h2,classMass_sum] have hV:phaseTotal h4 (interleave u v) 1 + phaseTotal h4 (interleave u v) 3 = mass v:=by rw [phaseTotal_interleave_one h4 h2,phaseTotal_interleave_three h4 h2,classMass_sum] have h:=HeightCover18Mass.height_bound_of_rows h4 h3 (interleave u v) hg heven hrow0 hrow1 hrow2 h5 (by rwa [hU,hV]) simpa only [hU,hV] using h theorem height_bound {m:ℕ} [NeZero m] (h4:4 ∣ 2 * m) (h3:3 ∣ 2 * m) (h5:¬5 ∣ 2 * m) (h2:2 ∣ m) (u v:ZMod m → ℝ) (hu:∀ i,0 ≤ u i) (hv:∀ i,0 ≤ v i) (ih:∀ (n:ℕ) [NeZero n],n < 2 * m → n ∣ 2 * m → ∀ w:ZMod n → ℝ,(∀ i,0 ≤ w i) → 0 ≤ deficit w) (hAB:mass v ≤ mass u) : (2 / 5:ℝ) * energy (interleave u v) + Q18 (mass u) (mass v) ≤ deficit (interleave u v):=by obtain ⟨u',v',hu',hv',hU,hV,hd,hE,heven⟩ := ProfileEnergyOrientation.orient_even_child h4 u v hu hv have h:=height_bound_ordered h4 h3 h5 h2 u' v' hu' hv' ih heven (by simpa only [hU,hV] using hAB) simpa only [hU,hV,hd,hE] using h end Green24Proof.HeightCover18Profile private def zz2408:"s0968"="s0968":=by decide+kernel end section namespace Green24Proof.VerifiedProfileEndpoint open BoundaryFromHeightCertificates private def zz1800:"s0708"="s0708":=by decide+kernel private theorem height_certificate_12 (m:ℕ) [NeZero m]:HeightCertificate m Q12 := HeightCover12Profile.height_bound private theorem height_certificate_18 (m:ℕ) [NeZero m]:HeightCertificate m Q18 := HeightCover18Profile.height_bound theorem deficit_nonneg (q:ℕ) [NeZero q] (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):0 ≤ deficit g := RatioCoverSixteen.deficit_nonneg_of_remaining height_certificate_12 height_certificate_18 q h5 g hg theorem profileFunctional_le (q:ℕ) [NeZero q] (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : profileFunctional g ≤ 2 * mass g ^ 2 := sub_nonneg.mp (deficit_nonneg q h5 g hg) private def zz1801:"s0709"="s0709":=by decide+kernel theorem deficit_nonneg_of_pos (q:ℕ) (hq:0 < q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : letI:NeZero q:=⟨Nat.ne_of_gt hq⟩ 0 ≤ deficit g:=by let:NeZero q:=⟨Nat.ne_of_gt hq⟩ exact deficit_nonneg q h5 g hg theorem profileFunctional_le_of_pos (q:ℕ) (hq:0 < q) (h5:¬5 ∣ q) (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : letI:NeZero q:=⟨Nat.ne_of_gt hq⟩ profileFunctional g ≤ 2 * mass g ^ 2:=by let:NeZero q:=⟨Nat.ne_of_gt hq⟩ exact profileFunctional_le q h5 g hg end Green24Proof.VerifiedProfileEndpoint private def zz2409:"s0969"="s0969":=by decide+kernel end section namespace Green24Proof.AllModuliProfileEndpoint theorem profileFunctional_le (q:ℕ) [NeZero q] (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i):profileFunctional g ≤ 2 * mass g ^ 2:=by obtain ⟨a,m,hm,hq⟩:=Nat.exists_eq_pow_mul_and_not_dvd (NeZero.ne q) 5 (by norm_num) have hm0:m ≠ 0:=by intro hz apply NeZero.ne q rw [hq,hz,mul_zero] let:NeZero m:=⟨hm0⟩ let:NeZero (5 ^ a):=⟨pow_ne_zero _ (by norm_num)⟩ have hmn:Nat.Coprime m (5 ^ a):=Nat.prime_five.coprime_pow_of_not_dvd hm have hq':q = m * 5 ^ a:=hq.trans (Nat.mul_comm _ _) let e:ZMod q ≃+* ZMod m × ZMod (5 ^ a) := (ZMod.ringEquivCongr hq').trans (ZMod.chineseRemainder hmn) exact ProfileCoprimeCollapse.bound_of_equiv e ((by norm_num:Nat.Coprime 2 5).pow_right a) ((by norm_num:Nat.Coprime 3 5).pow_right a) (fun f hf => VerifiedProfileEndpoint.profileFunctional_le m hm f hf) g hg theorem deficit_nonneg (q:ℕ) [NeZero q] (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : 0 ≤ deficit g:=sub_nonneg.mpr (profileFunctional_le q g hg) end Green24Proof.AllModuliProfileEndpoint private def zz2410:"s096a"="s096a":=by decide+kernel end section namespace Green24Proof.FinitePartitionAverage open Finset open scoped BigOperators variable {α β:Type*} [Fintype α] [DecidableEq β] def fiber (π:α → β) (b:β):Finset α := Finset.univ.filter (fun x => π x = b) private def zz1802:"s070a"="s070a":=by decide+kernel theorem mem_fiber (π:α → β) (b:β) (x:α) : x ∈ fiber π b ↔ π x = b:=by simp [fiber] noncomputable def fiberMean (π:α → β) (f:α → ℝ) (b:β):ℝ := (∑ x ∈ fiber π b,f x) / (fiber π b).card noncomputable def average (π:α → β) (f:α → ℝ) (x:α):ℝ := fiberMean π f (π x) theorem average_eq_on_fiber (π:α → β) (f:α → ℝ) {b:β} {x:α} (hx:x ∈ fiber π b):average π f x = fiberMean π f b:=by simp only [average,(mem_fiber π b x).mp hx] theorem sum_fibers [Fintype β] (π:α → β) (f:α → ℝ) : (∑ b, ∑ x ∈ fiber π b,f x) = ∑ x,f x:=by simp only [fiber,Finset.sum_filter] rw [Finset.sum_comm] simp theorem fiberMean_nonneg (π:α → β) (f:α → ℝ) (hf:∀ x,0 ≤ f x) (b:β) : 0 ≤ fiberMean π f b := div_nonneg (Finset.sum_nonneg (fun x _ => hf x)) (Nat.cast_nonneg _) private def zz1803:"s070b"="s070b":=by decide+kernel theorem fiberMean_le_one (π:α → β) (f:α → ℝ) (hf:∀ x,f x ≤ 1) (b:β) : fiberMean π f b ≤ 1:=by by_cases hempty:fiber π b = ∅ · simp [fiberMean,hempty] · have hcard:(0:ℝ) < (fiber π b).card := Nat.cast_pos.mpr (Finset.card_pos.mpr (Finset.nonempty_iff_ne_empty.mpr hempty)) rw [fiberMean,div_le_one hcard] calc (∑ x ∈ fiber π b,f x) ≤ ∑ _x ∈ fiber π b,(1:ℝ) := Finset.sum_le_sum (fun x _ => hf x) _ = _:=by simp theorem average_mem_Icc (π:α → β) (f:α → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) (x:α):average π f x ∈ Set.Icc 0 1 := ⟨fiberMean_nonneg π f (fun x => (hf x).1) (π x), fiberMean_le_one π f (fun x => (hf x).2) (π x)⟩ theorem residual_mem_Icc (π:α → β) (f:α → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) (x:α):f x - average π f x ∈ Set.Icc (-1) 1:=by have hx:=hf x have ha:=average_mem_Icc π f hf x constructor <;> linarith [hx.1,hx.2,ha.1,ha.2] theorem sum_fiber_average (π:α → β) (f:α → ℝ) (b:β) : (∑ x ∈ fiber π b,average π f x) = ∑ x ∈ fiber π b,f x:=by calc (∑ x ∈ fiber π b,average π f x) = ∑ _x ∈ fiber π b,fiberMean π f b:=by apply Finset.sum_congr rfl intro x hx exact average_eq_on_fiber π f hx _ = _:=by by_cases hempty:fiber π b = ∅ · simp [fiberMean,hempty] · have hcard:((fiber π b).card:ℝ) ≠ 0:=by exact_mod_cast (Finset.card_ne_zero.mpr (Finset.nonempty_iff_ne_empty.mpr hempty)) simp only [Finset.sum_const,nsmul_eq_mul,fiberMean] exact mul_div_cancel₀ _ hcard private def zz1804:"s070c"="s070c":=by decide+kernel theorem sum_average [Fintype β] (π:α → β) (f:α → ℝ) : (∑ x,average π f x) = ∑ x,f x:=by rw [← sum_fibers π (average π f)] simp_rw [sum_fiber_average] exact sum_fibers π f theorem mean_average [Fintype β] (π:α → β) (f:α → ℝ) : (∑ x,average π f x) / Fintype.card α = (∑ x,f x) / Fintype.card α:=by rw [sum_average] theorem average_idempotent (π:α → β) (f:α → ℝ) : average π (average π f) = average π f:=by funext x change fiberMean π (average π f) (π x) = fiberMean π f (π x) unfold fiberMean rw [sum_fiber_average] theorem sum_fiber_residual (π:α → β) (f:α → ℝ) (b:β) : (∑ x ∈ fiber π b,(f x - average π f x)) = 0:=by rw [Finset.sum_sub_distrib,sum_fiber_average,sub_self] private def zz1805:"s070d"="s070d":=by decide+kernel theorem residual_orthogonal [Fintype β] (π:α → β) (f:α → ℝ) (g:β → ℝ) : (∑ x,(f x - average π f x) * g (π x)) = 0:=by rw [← sum_fibers π] apply Finset.sum_eq_zero intro b _ calc (∑ x ∈ fiber π b,(f x - average π f x) * g (π x)) = ∑ x ∈ fiber π b,(f x - average π f x) * g b:=by apply Finset.sum_congr rfl intro x hx rw [(mem_fiber π b x).mp hx] _ = (∑ x ∈ fiber π b,(f x - average π f x)) * g b := (Finset.sum_mul _ _ _).symm _ = 0:=by rw [sum_fiber_residual,zero_mul] theorem residual_orthogonal_average [Fintype β] (π:α → β) (f:α → ℝ) : (∑ x,(f x - average π f x) * average π f x) = 0 := residual_orthogonal π f (fiberMean π f) theorem energy_split [Fintype β] (π:α → β) (f:α → ℝ) : (∑ x,f x ^ 2) = (∑ x,average π f x ^ 2) + ∑ x,(f x - average π f x) ^ 2:=by calc (∑ x,f x ^ 2) = ∑ x,(average π f x ^ 2 + (f x - average π f x) ^ 2 + 2 * ((f x - average π f x) * average π f x)):=by apply Finset.sum_congr rfl intro x _ ring _ = _:=by rw [Finset.sum_add_distrib,Finset.sum_add_distrib, ← Finset.mul_sum, residual_orthogonal_average,mul_zero,add_zero] theorem average_energy_le [Fintype β] (π:α → β) (f:α → ℝ) : (∑ x,average π f x ^ 2) ≤ ∑ x,f x ^ 2:=by have he:=energy_split π f have hn:0 ≤ ∑ x,(f x - average π f x) ^ 2 := Finset.sum_nonneg (fun _ _ => sq_nonneg _) linarith private def zz1806:"s070e"="s070e":=by decide+kernel theorem average_energy_le_card [Fintype β] (π:α → β) (f:α → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) : (∑ x,average π f x ^ 2) ≤ (Fintype.card α:ℝ):=by calc (∑ x,average π f x ^ 2) ≤ ∑ x,f x ^ 2:=average_energy_le π f _ ≤ ∑ _x:α,(1:ℝ):=by apply Finset.sum_le_sum intro x _ have hx:=hf x nlinarith [hx.1,hx.2] _ = _:=by simp end Green24Proof.FinitePartitionAverage private def zz2411:"s096b"="s096b":=by decide+kernel end section namespace Green24Proof.FinitePartitionRefinement open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage variable {α β γ:Type*} [Fintype α] [Fintype β] [Fintype γ] [DecidableEq β] [DecidableEq γ] noncomputable def energy (π:α → β) (f:α → ℝ):ℝ := ∑ x,average π f x ^ 2 omit [Fintype γ] in theorem refined_residual_orthogonal_coarse (π:α → β) (ρ:α → γ) (φ:β → γ) (href:∀ x,ρ x = φ (π x)) (f:α → ℝ) : (∑ x,(f x - average π f x) * average ρ f x) = 0:=by have h:=residual_orthogonal π f (fun b => fiberMean ρ f (φ b)) simpa only [average,href] using h theorem average_difference_orthogonal_coarse (π:α → β) (ρ:α → γ) (φ:β → γ) (href:∀ x,ρ x = φ (π x)) (f:α → ℝ) : (∑ x,(average π f x - average ρ f x) * average ρ f x) = 0:=by calc (∑ x,(average π f x - average ρ f x) * average ρ f x) = (∑ x,(f x - average ρ f x) * average ρ f x) - ∑ x,(f x - average π f x) * average ρ f x:=by rw [← Finset.sum_sub_distrib] apply Finset.sum_congr rfl intro x _ ring _ = 0:=by rw [residual_orthogonal_average, refined_residual_orthogonal_coarse π ρ φ href f,sub_self] theorem refinement_energy_identity (π:α → β) (ρ:α → γ) (φ:β → γ) (href:∀ x,ρ x = φ (π x)) (f:α → ℝ) : energy π f = energy ρ f + ∑ x,(average π f x - average ρ f x) ^ 2:=by unfold energy calc (∑ x,average π f x ^ 2) = ∑ x,(average ρ f x ^ 2 + (average π f x - average ρ f x) ^ 2 + 2 * ((average π f x - average ρ f x) * average ρ f x)):=by apply Finset.sum_congr rfl intro x _ ring _ = _:=by rw [Finset.sum_add_distrib,Finset.sum_add_distrib, ← Finset.mul_sum, average_difference_orthogonal_coarse π ρ φ href f,mul_zero,add_zero] private def zz1807:"s070f"="s070f":=by decide+kernel theorem refinement_energy_mono (π:α → β) (ρ:α → γ) (φ:β → γ) (href:∀ x,ρ x = φ (π x)) (f:α → ℝ) : energy ρ f ≤ energy π f:=by have he:=refinement_energy_identity π ρ φ href f have hn:0 ≤ ∑ x,(average π f x - average ρ f x) ^ 2 := Finset.sum_nonneg (fun _ _ => sq_nonneg _) linarith omit [Fintype γ] in theorem correlation_eq_average_difference (π:α → β) (ρ:α → γ) (f:α → ℝ) (g:β → ℝ) : (∑ x,(f x - average ρ f x) * g (π x)) = ∑ x,(average π f x - average ρ f x) * g (π x):=by calc (∑ x,(f x - average ρ f x) * g (π x)) = (∑ x,(average π f x - average ρ f x) * g (π x)) + ∑ x,(f x - average π f x) * g (π x):=by rw [← Finset.sum_add_distrib] apply Finset.sum_congr rfl intro x _ ring _ = _:=by rw [residual_orthogonal,add_zero] theorem correlation_sq_le_energy_difference (π:α → β) (ρ:α → γ) (φ:β → γ) (href:∀ x,ρ x = φ (π x)) (f:α → ℝ) (g:β → ℝ) : (∑ x,(f x - average ρ f x) * g (π x)) ^ 2 ≤ (energy π f - energy ρ f) * ∑ x,g (π x) ^ 2:=by rw [correlation_eq_average_difference] have hcs:=Finset.sum_mul_sq_le_sq_mul_sq Finset.univ (fun x => average π f x - average ρ f x) (fun x => g (π x)) have he:(∑ x,(average π f x - average ρ f x) ^ 2) = energy π f - energy ρ f:=by have h:=refinement_energy_identity π ρ φ href f linarith rw [he] at hcs exact hcs theorem energy_increment_of_correlation (π:α → β) (ρ:α → γ) (φ:β → γ) (href:∀ x,ρ x = φ (π x)) (f:α → ℝ) (g:β → ℝ) {B t:ℝ} (hB:0 < B) (ht:0 ≤ t) (hg:(∑ x,g (π x) ^ 2) ≤ B) (hc:t ≤ |∑ x,(f x - average ρ f x) * g (π x)|) : energy ρ f + t ^ 2 / B ≤ energy π f:=by have hΔ:0 ≤ energy π f - energy ρ f := sub_nonneg.mpr (refinement_energy_mono π ρ φ href f) have hsq:t ^ 2 ≤ (∑ x,(f x - average ρ f x) * g (π x)) ^ 2:=by nlinarith [sq_abs (∑ x,(f x - average ρ f x) * g (π x)), abs_nonneg (∑ x,(f x - average ρ f x) * g (π x))] have hbound:t ^ 2 ≤ (energy π f - energy ρ f) * B := hsq.trans ((correlation_sq_le_energy_difference π ρ φ href f g).trans (mul_le_mul_of_nonneg_left hg hΔ)) have hd:t ^ 2 / B ≤ energy π f - energy ρ f := (div_le_iff₀ hB).mpr hbound linarith private def zz1808:"s0710"="s0710":=by decide+kernel theorem energy_increment_of_bounded_correlation [Nonempty α] (π:α → β) (ρ:α → γ) (φ:β → γ) (href:∀ x,ρ x = φ (π x)) (f:α → ℝ) (g:β → ℝ) {η:ℝ} (hη:0 ≤ η) (hg:∀ x, |g (π x)| ≤ 1) (hc:η * Fintype.card α ≤ |∑ x,(f x - average ρ f x) * g (π x)|) : energy ρ f + η ^ 2 * Fintype.card α ≤ energy π f:=by have hn:(0:ℝ) < Fintype.card α:=Nat.cast_pos.mpr Fintype.card_pos have hge:(∑ x,g (π x) ^ 2) ≤ (Fintype.card α:ℝ):=by calc (∑ x,g (π x) ^ 2) ≤ ∑ _x:α,(1:ℝ):=by apply Finset.sum_le_sum intro x _ have hx:=hg x nlinarith [sq_abs (g (π x)),abs_nonneg (g (π x))] _ = _:=by simp have h:=energy_increment_of_correlation π ρ φ href f g hn (mul_nonneg hη hn.le) hge hc have hscale:(η * Fintype.card α) ^ 2 / Fintype.card α = η ^ 2 * Fintype.card α:=by apply (div_eq_iff hn.ne').mpr ring rwa [hscale] at h theorem normalized_energy_increment [Nonempty α] (π:α → β) (ρ:α → γ) (φ:β → γ) (href:∀ x,ρ x = φ (π x)) (f:α → ℝ) (g:β → ℝ) {η:ℝ} (hη:0 ≤ η) (hg:∀ x, |g (π x)| ≤ 1) (hc:η * Fintype.card α ≤ |∑ x,(f x - average ρ f x) * g (π x)|) : energy ρ f / Fintype.card α + η ^ 2 ≤ energy π f / Fintype.card α:=by have hn:(0:ℝ) < Fintype.card α:=Nat.cast_pos.mpr Fintype.card_pos apply (le_div_iff₀ hn).mpr calc (energy ρ f / Fintype.card α + η ^ 2) * Fintype.card α = energy ρ f + η ^ 2 * Fintype.card α:=by rw [add_mul,div_mul_cancel₀ _ hn.ne'] _ ≤ _:=energy_increment_of_bounded_correlation π ρ φ href f g hη hg hc end Green24Proof.FinitePartitionRefinement private def zz2412:"s096c"="s096c":=by decide+kernel end section namespace Green24Proof.FiniteScalarQuantization open Finset open scoped BigOperators noncomputable def quantize (m:ℕ) (t:ℝ):Fin (2 * m + 1) := ⟨min ⌊(m:ℝ) * (t + 1)⌋₊ (2 * m),Nat.lt_succ_of_le (min_le_right _ _)⟩ noncomputable def gridValue (m:ℕ) (k:Fin (2 * m + 1)):ℝ := (k.val:ℝ) / m - 1 theorem gridValue_mem_Icc {m:ℕ} (hm:0 < m) (k:Fin (2 * m + 1)) : gridValue m k ∈ Set.Icc (-1) 1:=by have hmR:(0:ℝ) < m:=Nat.cast_pos.mpr hm have hk:(k.val:ℝ) ≤ 2 * (m:ℝ):=by exact_mod_cast (Nat.le_of_lt_succ k.isLt) have h0:0 ≤ (k.val:ℝ) / m:=div_nonneg (Nat.cast_nonneg _) hmR.le have h2:(k.val:ℝ) / m ≤ 2:=(div_le_iff₀ hmR).mpr (by linarith) unfold gridValue constructor <;> linarith theorem quantize_val {m:ℕ} {t:ℝ} (ht:t ∈ Set.Icc (-1) 1) : (quantize m t).val = ⌊(m:ℝ) * (t + 1)⌋₊:=by have hbound:(m:ℝ) * (t + 1) ≤ (2 * m:ℕ):=by push_cast nlinarith [(Nat.cast_nonneg m:(0:ℝ) ≤ m),ht.2] have hfloor:⌊(m:ℝ) * (t + 1)⌋₊ ≤ 2 * m:=by exact (Nat.floor_le_floor hbound).trans_eq (Nat.floor_natCast _) exact min_eq_left hfloor private def zz1809:"s0711"="s0711":=by decide+kernel theorem quantization_error {m:ℕ} (hm:0 < m) {t:ℝ} (ht:t ∈ Set.Icc (-1) 1) : 0 ≤ t - gridValue m (quantize m t) ∧ t - gridValue m (quantize m t) < 1 / m:=by have hmR:(0:ℝ) < m:=Nat.cast_pos.mpr hm have hnonneg:0 ≤ (m:ℝ) * (t + 1) := mul_nonneg hmR.le (by linarith [ht.1]) have hlo:=Nat.floor_le hnonneg have hhi:=Nat.lt_floor_add_one ((m:ℝ) * (t + 1)) unfold gridValue rw [quantize_val ht] have hdiv:(⌊(m:ℝ) * (t + 1)⌋₊:ℝ) / m ≤ t + 1 := (div_le_iff₀ hmR).mpr (by nlinarith) have hdiv':t + 1 < (⌊(m:ℝ) * (t + 1)⌋₊:ℝ) / m + 1 / m:=by have h:t + 1 < ((⌊(m:ℝ) * (t + 1)⌋₊:ℝ) + 1) / m := (lt_div_iff₀ hmR).mpr (by nlinarith) simpa only [add_div] using h constructor <;> linarith theorem quantization_abs_error {m:ℕ} (hm:0 < m) {t:ℝ} (ht:t ∈ Set.Icc (-1) 1):|t - gridValue m (quantize m t)| ≤ 1 / m:=by have h:=quantization_error hm ht rw [abs_of_nonneg h.1] exact h.2.le variable {α:Type*} [Fintype α] theorem correlation_error {m:ℕ} (hm:0 < m) (r g:α → ℝ) (hr:∀ x, |r x| ≤ 1) (hg:∀ x,g x ∈ Set.Icc (-1) 1) : |(∑ x,r x * g x) - ∑ x,r x * gridValue m (quantize m (g x))| ≤ (Fintype.card α:ℝ) / m:=by rw [← Finset.sum_sub_distrib] calc |∑ x,(r x * g x - r x * gridValue m (quantize m (g x)))| ≤ ∑ x, |r x * g x - r x * gridValue m (quantize m (g x))| := Finset.abs_sum_le_sum_abs _ _ _ ≤ ∑ _x:α,(1:ℝ) / m:=by apply Finset.sum_le_sum intro x _ rw [← mul_sub,abs_mul] calc |r x| * |g x - gridValue m (quantize m (g x))| ≤ 1 * (1 / m) := mul_le_mul (hr x) (quantization_abs_error hm (hg x)) (abs_nonneg _) (by norm_num) _ = _:=one_mul _ _ = _:=by simp [div_eq_mul_inv] theorem correlation_transfer {m:ℕ} (hm:0 < m) (r g:α → ℝ) (hr:∀ x, |r x| ≤ 1) (hg:∀ x,g x ∈ Set.Icc (-1) 1) : |∑ x,r x * g x| - (Fintype.card α:ℝ) / m ≤ |∑ x,r x * gridValue m (quantize m (g x))|:=by have he:=correlation_error hm r g hr hg have ht:=abs_add_le ((∑ x,r x * g x) - ∑ x,r x * gridValue m (quantize m (g x))) (∑ x,r x * gridValue m (quantize m (g x))) rw [sub_add_cancel] at ht linarith noncomputable def resolution (η:ℝ):ℕ:=⌈4 / η⌉₊ + 1 private def zz1810:"s0712"="s0712":=by decide+kernel theorem resolution_pos (η:ℝ):0 < resolution η:=Nat.succ_pos _ theorem resolution_precision {η:ℝ} (hη:0 < η) : 1 / (resolution η:ℝ) ≤ η / 4:=by have hm:(0:ℝ) < resolution η:=Nat.cast_pos.mpr (resolution_pos η) have hceil:=Nat.le_ceil (4 / η) have hres:(4 / η) ≤ (resolution η:ℝ):=by unfold resolution push_cast linarith have hmul:=(div_le_iff₀ hη).mp hres apply (div_le_iff₀ hm).mpr nlinarith end Green24Proof.FiniteScalarQuantization private def zz2413:"s096d"="s096d":=by decide+kernel end section namespace Green24Proof.CyclicFourierCounting open Finset open scoped BigOperators variable {q:ℕ} [NeZero q] noncomputable def trilinear (f g h:ZMod q → ℂ):ℂ := ∑ y, ∑ z,f (3 * z - 2 * y) * g y * h z theorem inversion_sum (f:ZMod q → ℂ) (x:ZMod q) : (∑ r,ZMod.stdAddChar (r * x) * ZMod.dft f r) = (q:ℂ) * f x:=by have h:=congrFun (ZMod.dft_dft f) (-x) simpa only [ZMod.dft_apply,mul_neg,neg_neg,smul_eq_mul] using h theorem character_factor (r y z:ZMod q) : ZMod.stdAddChar (r * (3 * z - 2 * y)) = ZMod.stdAddChar (-(y * (2 * r))) * ZMod.stdAddChar (-(z * (-3 * r))):=by rw [← AddChar.map_add_eq_mul] congr 1 ring private def zz1811:"s0713"="s0713":=by decide+kernel theorem trilinear_fourier (f g h:ZMod q → ℂ) : (q:ℂ) * trilinear f g h = ∑ r,ZMod.dft f r * ZMod.dft g (2 * r) * ZMod.dft h (-3 * r):=by symm calc (∑ r,ZMod.dft f r * ZMod.dft g (2 * r) * ZMod.dft h (-3 * r)) = ∑ r, ∑ y, ∑ z,ZMod.dft f r * (ZMod.stdAddChar (-(y * (2 * r))) * g y) * (ZMod.stdAddChar (-(z * (-3 * r))) * h z):=by simp only [ZMod.dft_apply g,ZMod.dft_apply h,smul_eq_mul, Finset.mul_sum,Finset.sum_mul] apply Finset.sum_congr rfl intro r _ exact Finset.sum_comm _ = ∑ y, ∑ z,(∑ r,ZMod.stdAddChar (r * (3 * z - 2 * y)) * ZMod.dft f r) * g y * h z:=by rw [Finset.sum_comm] apply Finset.sum_congr rfl intro y _ rw [Finset.sum_comm] apply Finset.sum_congr rfl intro z _ simp only [Finset.sum_mul] apply Finset.sum_congr rfl intro r _ rw [character_factor] ring _ = (q:ℂ) * trilinear f g h:=by simp_rw [inversion_sum] simp only [trilinear,Finset.mul_sum] apply Finset.sum_congr rfl intro y _ apply Finset.sum_congr rfl intro z _ ring theorem sum_dft_mul_neg (f g:ZMod q → ℂ) : (∑ r,ZMod.dft f r * ZMod.dft g (-r)) = (q:ℂ) * ∑ x,f x * g x:=by calc (∑ r,ZMod.dft f r * ZMod.dft g (-r)) = ∑ r, ∑ x,ZMod.dft f r * (ZMod.stdAddChar (x * r) * g x):=by simp only [ZMod.dft_apply g,smul_eq_mul,mul_neg,neg_neg,Finset.mul_sum] _ = ∑ x,(∑ r,ZMod.stdAddChar (r * x) * ZMod.dft f r) * g x:=by rw [Finset.sum_comm] apply Finset.sum_congr rfl intro x _ rw [Finset.sum_mul] apply Finset.sum_congr rfl intro r _ rw [mul_comm r x] ring _ = (q:ℂ) * ∑ x,f x * g x:=by simp_rw [inversion_sum] rw [Finset.mul_sum] apply Finset.sum_congr rfl intro x _ ring theorem conj_stdAddChar (x:ZMod q) : (starRingEnd ℂ) (ZMod.stdAddChar x) = ZMod.stdAddChar (-x):=by rw [AddChar.map_neg_eq_inv] exact (Complex.inv_eq_conj (by simp only [ZMod.stdAddChar_apply,Circle.norm_coe])).symm theorem dft_conj_neg (f:ZMod q → ℂ) (r:ZMod q) : ZMod.dft (fun x => (starRingEnd ℂ) (f x)) (-r) = (starRingEnd ℂ) (ZMod.dft f r):=by simp only [ZMod.dft_apply,smul_eq_mul,map_sum,map_mul, conj_stdAddChar,mul_neg,neg_neg] private def zz1812:"s0714"="s0714":=by decide+kernel theorem parseval (f:ZMod q → ℂ) : (∑ r, ‖ZMod.dft f r‖ ^ 2) = (q:ℝ) * ∑ x, ‖f x‖ ^ 2:=by have h:=sum_dft_mul_neg f (fun x => (starRingEnd ℂ) (f x)) simp only [dft_conj_neg,Complex.mul_conj'] at h exact_mod_cast h theorem trilinear_norm_le (f g h:ZMod q → ℂ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {M:ℝ} (hM:∀ r, ‖ZMod.dft f r‖ ≤ M) : ‖trilinear f g h‖ ≤ M * Real.sqrt (∑ x, ‖g x‖ ^ 2) * Real.sqrt (∑ x, ‖h x‖ ^ 2):=by have hM0:0 ≤ M:=(norm_nonneg (ZMod.dft f 0)).trans (hM 0) have hq0:(0:ℝ) < q:=Nat.cast_pos.mpr (NeZero.pos q) have hb2:=IsUnit.isUnit_iff_mulLeft_bijective.mp h2 have hb3:=IsUnit.isUnit_iff_mulLeft_bijective.mp h3.neg have hg:(∑ r:ZMod q, ‖ZMod.dft g (2 * r)‖ ^ 2) = (q:ℝ) * ∑ x, ‖g x‖ ^ 2 := (hb2.sum_comp (fun r:ZMod q => ‖ZMod.dft g r‖ ^ 2)).trans (parseval g) have hh:(∑ r:ZMod q, ‖ZMod.dft h (-3 * r)‖ ^ 2) = (q:ℝ) * ∑ x, ‖h x‖ ^ 2 := (hb3.sum_comp (fun r:ZMod q => ‖ZMod.dft h r‖ ^ 2)).trans (parseval h) have hcs:=Real.sum_mul_le_sqrt_mul_sqrt Finset.univ (fun r:ZMod q => ‖ZMod.dft g (2 * r)‖) (fun r:ZMod q => ‖ZMod.dft h (-3 * r)‖) rw [hg,hh] at hcs have hnorm:(q:ℝ) * ‖trilinear f g h‖ = ‖∑ r,ZMod.dft f r * ZMod.dft g (2 * r) * ZMod.dft h (-3 * r)‖:=by have hn:=congrArg (fun z:ℂ => ‖z‖) (trilinear_fourier f g h) simpa only [norm_mul,Complex.norm_natCast] using hn refine le_of_mul_le_mul_left (a:=(q:ℝ)) ?_ hq0 calc (q:ℝ) * ‖trilinear f g h‖ = ‖∑ r,ZMod.dft f r * ZMod.dft g (2 * r) * ZMod.dft h (-3 * r)‖:=hnorm _ ≤ ∑ r, ‖ZMod.dft f r * ZMod.dft g (2 * r) * ZMod.dft h (-3 * r)‖ := norm_sum_le _ _ _ ≤ ∑ r,M * (‖ZMod.dft g (2 * r)‖ * ‖ZMod.dft h (-3 * r)‖):=by apply Finset.sum_le_sum intro r _ simpa only [norm_mul,mul_assoc] using mul_le_mul_of_nonneg_right (hM r) (mul_nonneg (norm_nonneg _) (norm_nonneg _)) _ = M * ∑ r, ‖ZMod.dft g (2 * r)‖ * ‖ZMod.dft h (-3 * r)‖ := (Finset.mul_sum _ _ _).symm _ ≤ M * (Real.sqrt ((q:ℝ) * ∑ x, ‖g x‖ ^ 2) * Real.sqrt ((q:ℝ) * ∑ x, ‖h x‖ ^ 2)):=mul_le_mul_of_nonneg_left hcs hM0 _ = (q:ℝ) * (M * Real.sqrt (∑ x, ‖g x‖ ^ 2) * Real.sqrt (∑ x, ‖h x‖ ^ 2)):=by rw [Real.sqrt_mul hq0.le,Real.sqrt_mul hq0.le] calc M * (Real.sqrt q * Real.sqrt (∑ x, ‖g x‖ ^ 2) * (Real.sqrt q * Real.sqrt (∑ x, ‖h x‖ ^ 2))) = (Real.sqrt q * Real.sqrt q) * (M * Real.sqrt (∑ x, ‖g x‖ ^ 2) * Real.sqrt (∑ x, ‖h x‖ ^ 2)):=by ring _ = _:=by rw [Real.mul_self_sqrt hq0.le] theorem trilinear_norm_le_of_prime (f g h:ZMod q → ℂ) (hq:q.Prime) (hq3:3 < q) {M:ℝ} (hM:∀ r, ‖ZMod.dft f r‖ ≤ M) : ‖trilinear f g h‖ ≤ M * Real.sqrt (∑ x, ‖g x‖ ^ 2) * Real.sqrt (∑ x, ‖h x‖ ^ 2):=by apply trilinear_norm_le f g h ?_ ?_ hM · apply ZMod.isUnit_prime_of_not_dvd Nat.prime_two intro hd have he:=(Nat.dvd_prime hq).mp hd omega · apply ZMod.isUnit_prime_of_not_dvd Nat.prime_three intro hd have he:=(Nat.dvd_prime hq).mp hd omega noncomputable def indicator (A:Finset (ZMod q)) (x:ZMod q):ℂ := if x ∈ A then 1 else 0 theorem trilinear_indicators (A B C:Finset (ZMod q)) : trilinear (indicator A) (indicator B) (indicator C) = (((B ×ˢ C).filter (fun p => 3 * p.2 - 2 * p.1 ∈ A)).card:ℂ):=by calc trilinear (indicator A) (indicator B) (indicator C) = ∑ y,if y ∈ B then ∑ z,if z ∈ C then (if 3 * z - 2 * y ∈ A then (1:ℂ) else 0) else 0 else 0:=by unfold trilinear indicator apply Finset.sum_congr rfl intro y _ by_cases hy:y ∈ B · simp only [hy,if_true,mul_one] apply Finset.sum_congr rfl intro z _ by_cases hz:z ∈ C <;> simp [hz] · simp [hy] _ = _:=by simp only [Finset.sum_ite_mem_eq,Finset.natCast_card_filter,Finset.sum_product] private def zz1813:"s0715"="s0715":=by decide+kernel theorem trilinear_sub_left (f₁ f₂ g h:ZMod q → ℂ) : trilinear (fun x => f₁ x - f₂ x) g h = trilinear f₁ g h - trilinear f₂ g h:=by simp only [trilinear,sub_mul,Finset.sum_sub_distrib] theorem trilinear_difference_norm_le (f₁ f₂ g h:ZMod q → ℂ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {M:ℝ} (hM:∀ r, ‖ZMod.dft (fun x => f₁ x - f₂ x) r‖ ≤ M) : ‖trilinear f₁ g h - trilinear f₂ g h‖ ≤ M * Real.sqrt (∑ x, ‖g x‖ ^ 2) * Real.sqrt (∑ x, ‖h x‖ ^ 2):=by rw [← trilinear_sub_left] exact trilinear_norm_le _ g h h2 h3 hM theorem trilinear_norm_le_fourier_max (f g h:ZMod q → ℂ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) : ‖trilinear f g h‖ ≤ ‖ZMod.dft f‖ * Real.sqrt (∑ x, ‖g x‖ ^ 2) * Real.sqrt (∑ x, ‖h x‖ ^ 2) := trilinear_norm_le f g h h2 h3 (fun r => norm_le_pi_norm (ZMod.dft f) r) theorem trilinear_norm_le_of_bounded (f g h:ZMod q → ℂ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {η:ℝ} (hη:0 ≤ η) (hf:∀ r, ‖ZMod.dft f r‖ ≤ η * q) (hg:∀ x, ‖g x‖ ≤ 1) (hh:∀ x, ‖h x‖ ≤ 1) : ‖trilinear f g h‖ ≤ η * (q:ℝ) ^ 2:=by have hgsum:(∑ x, ‖g x‖ ^ 2) ≤ (q:ℝ):=by calc (∑ x, ‖g x‖ ^ 2) ≤ ∑ _x:ZMod q,(1:ℝ):=by apply Finset.sum_le_sum intro x _ nlinarith [norm_nonneg (g x),hg x] _ = _:=by simp have hhsum:(∑ x, ‖h x‖ ^ 2) ≤ (q:ℝ):=by calc (∑ x, ‖h x‖ ^ 2) ≤ ∑ _x:ZMod q,(1:ℝ):=by apply Finset.sum_le_sum intro x _ nlinarith [norm_nonneg (h x),hh x] _ = _:=by simp calc ‖trilinear f g h‖ ≤ (η * q) * Real.sqrt (∑ x, ‖g x‖ ^ 2) * Real.sqrt (∑ x, ‖h x‖ ^ 2):=trilinear_norm_le f g h h2 h3 hf _ ≤ (η * q) * Real.sqrt q * Real.sqrt q:=by gcongr _ = η * (q:ℝ) ^ 2:=by rw [mul_assoc,Real.mul_self_sqrt (Nat.cast_nonneg q)] ring end Green24Proof.CyclicFourierCounting private def zz2414:"s096e"="s096e":=by decide+kernel end section namespace Green24Proof.FourierPartitionIncrement open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage open Green24Proof.FinitePartitionRefinement open Green24Proof.FiniteScalarQuantization variable {q:ℕ} [NeZero q] private def zz1814:"s0716"="s0716":=by decide+kernel theorem dft_real_re (r:ZMod q → ℝ) (k:ZMod q) : (ZMod.dft (fun x => (r x:ℂ)) k).re = ∑ x,r x * (ZMod.stdAddChar (-(x * k))).re:=by rw [ZMod.dft_apply] change Complex.reAddGroupHom (∑ x,ZMod.stdAddChar (-(x * k)) * (r x:ℂ)) = _ rw [map_sum] simp [Complex.coe_reAddGroupHom,Complex.mul_re,mul_comm] theorem dft_real_im (r:ZMod q → ℝ) (k:ZMod q) : (ZMod.dft (fun x => (r x:ℂ)) k).im = ∑ x,r x * (ZMod.stdAddChar (-(x * k))).im:=by rw [ZMod.dft_apply] change Complex.imAddGroupHom (∑ x,ZMod.stdAddChar (-(x * k)) * (r x:ℂ)) = _ rw [map_sum] simp [Complex.coe_imAddGroupHom,Complex.mul_im,mul_comm] theorem exists_real_character_test (r:ZMod q → ℝ) (k:ZMod q) {η:ℝ} (hlarge:η * q ≤ ‖ZMod.dft (fun x => (r x:ℂ)) k‖) : ∃ g:ZMod q → ℝ,(∀ x,g x ∈ Set.Icc (-1) 1) ∧ η * q / 2 ≤ |∑ x,r x * g x|:=by have hn (x:ZMod q):‖ZMod.stdAddChar (-(x * k))‖ = 1:=by simp only [ZMod.stdAddChar_apply,Circle.norm_coe] by_cases hre:η * q / 2 ≤ |(ZMod.dft (fun x => (r x:ℂ)) k).re| · refine ⟨fun x => (ZMod.stdAddChar (-(x * k))).re, ?_, ?_⟩ · intro x exact abs_le.mp ((Complex.abs_re_le_norm _).trans_eq (hn x)) · rwa [dft_real_re] at hre · refine ⟨fun x => (ZMod.stdAddChar (-(x * k))).im, ?_, ?_⟩ · intro x exact abs_le.mp ((Complex.abs_im_le_norm _).trans_eq (hn x)) · have hab:=Complex.norm_le_abs_re_add_abs_im (ZMod.dft (fun x => (r x:ℂ)) k) have hi:η * q / 2 ≤ |(ZMod.dft (fun x => (r x:ℂ)) k).im|:=by linarith rwa [dft_real_im] at hi theorem exists_quantized_correlating_test (r:ZMod q → ℝ) (k:ZMod q) (hr:∀ x, |r x| ≤ 1) {η:ℝ} (hlarge:η * q ≤ ‖ZMod.dft (fun x => (r x:ℂ)) k‖) {m:ℕ} (hm:0 < m) (hprecision:1 / (m:ℝ) ≤ η / 4) : ∃ s:ZMod q → Fin (2 * m + 1), (η / 4) * q ≤ |∑ x,r x * gridValue m (s x)|:=by obtain ⟨g,hg,hc⟩:=exists_real_character_test r k hlarge refine ⟨fun x => quantize m (g x), ?_⟩ have he:=correlation_transfer hm r g hr hg simp only [ZMod.card] at he have hp:=mul_le_mul_of_nonneg_left hprecision (Nat.cast_nonneg q) rw [mul_one_div] at hp nlinarith variable {β:Type*} [Fintype β] [DecidableEq β] private def zz1815:"s0717"="s0717":=by decide+kernel theorem exists_refinement_of_large_dft (ρ:ZMod q → β) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) (k:ZMod q) {η:ℝ} (hη:0 < η) (hlarge:η * q ≤ ‖ZMod.dft (fun x => ((f x - average ρ f x:ℝ):ℂ)) k‖) {m:ℕ} (hm:0 < m) (hprecision:1 / (m:ℝ) ≤ η / 4) : ∃ π:ZMod q → β × Fin (2 * m + 1), (∀ x,ρ x = (π x).1) ∧ Green24Proof.FinitePartitionRefinement.energy ρ f / q + η ^ 2 / 16 ≤ Green24Proof.FinitePartitionRefinement.energy π f / q:=by have hr:∀ x, |f x - average ρ f x| ≤ 1 := fun x => abs_le.mpr (residual_mem_Icc ρ f hf x) obtain ⟨s,hs⟩:=exists_quantized_correlating_test (fun x => f x - average ρ f x) k hr hlarge hm hprecision let π:ZMod q → β × Fin (2 * m + 1):=fun x => (ρ x,s x) let g:β × Fin (2 * m + 1) → ℝ:=fun b => gridValue m b.2 have hg:∀ x, |g (π x)| ≤ 1 := fun x => abs_le.mpr (gridValue_mem_Icc hm (s x)) have hc:(η / 4) * Fintype.card (ZMod q) ≤ |∑ x,(f x - average ρ f x) * g (π x)|:=by simpa only [ZMod.card] using hs have hi:=normalized_energy_increment π ρ Prod.fst (fun _ => rfl) f g (show 0 ≤ η / 4 by positivity) hg hc refine ⟨π,fun _ => rfl, ?_⟩ norm_num only [ZMod.card,div_pow] at hi exact hi theorem exists_bounded_refinement_of_large_dft (ρ:ZMod q → β) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) (k:ZMod q) {η:ℝ} (hη:0 < η) (hlarge:η * q ≤ ‖ZMod.dft (fun x => ((f x - average ρ f x:ℝ):ℂ)) k‖) : ∃ π:ZMod q → β × Fin (2 * resolution η + 1), (∀ x,ρ x = (π x).1) ∧ Green24Proof.FinitePartitionRefinement.energy ρ f / q + η ^ 2 / 16 ≤ Green24Proof.FinitePartitionRefinement.energy π f / q := exists_refinement_of_large_dft ρ f hf k hη hlarge (resolution_pos η) (resolution_precision hη) omit [DecidableEq β] in theorem refinement_alphabet_card (m:ℕ) : Fintype.card (β × Fin (2 * m + 1)) = Fintype.card β * (2 * m + 1):=by simp end Green24Proof.FourierPartitionIncrement private def zz2415:"s096f"="s096f":=by decide+kernel end section namespace Green24Proof.CyclicWeakRegularity open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage open Green24Proof.FinitePartitionRefinement open Green24Proof.FiniteScalarQuantization open Green24Proof.FourierPartitionIncrement section Relabel variable {α β γ:Type*} [Fintype α] [DecidableEq β] [DecidableEq γ] theorem average_comp_injective (π:α → β) (e:β → γ) (he:Function.Injective e) (f:α → ℝ):average (fun x => e (π x)) f = average π f:=by funext x have hfiber:fiber (fun y => e (π y)) (e (π x)) = fiber π (π x):=by ext y simp only [mem_fiber,he.eq_iff] simp only [average,fiberMean] rw [hfiber] private def zz1816:"s0718"="s0718":=by decide+kernel theorem energy_comp_injective (π:α → β) (e:β → γ) (he:Function.Injective e) (f:α → ℝ):Green24Proof.FinitePartitionRefinement.energy (fun x => e (π x)) f = Green24Proof.FinitePartitionRefinement.energy π f:=by simp only [Green24Proof.FinitePartitionRefinement.energy,average_comp_injective π e he f] end Relabel variable {q:ℕ} [NeZero q] abbrev Alphabet (η:ℝ) (n:ℕ):=Fin n → Fin (2 * resolution η + 1) def successorEquiv (η:ℝ) (n:ℕ) : Alphabet η n × Fin (2 * resolution η + 1) ≃ Alphabet η (n + 1) := (Equiv.prodComm _ _).trans (Fin.consEquiv (fun _ => Fin (2 * resolution η + 1))) theorem alphabet_card (η:ℝ) (n:ℕ) : Fintype.card (Alphabet η n) = (2 * resolution η + 1) ^ n:=by simp [Alphabet] def FourierUniform {β:Type*} [DecidableEq β] (π:ZMod q → β) (f:ZMod q → ℝ) (η:ℝ):Prop := ∀ k, ‖ZMod.dft (fun x => ((f x - average π f x:ℝ):ℂ)) k‖ ≤ η * q theorem normalized_energy_nonneg {β:Type*} [DecidableEq β] (π:ZMod q → β) (f:ZMod q → ℝ):0 ≤ Green24Proof.FinitePartitionRefinement.energy π f / q := div_nonneg (Finset.sum_nonneg (fun _ _ => sq_nonneg _)) (Nat.cast_nonneg q) theorem normalized_energy_le_one {β:Type*} [Fintype β] [DecidableEq β] (π:ZMod q → β) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) : Green24Proof.FinitePartitionRefinement.energy π f / q ≤ 1:=by apply (div_le_one (Nat.cast_pos.mpr (NeZero.pos q))).mpr simpa only [Green24Proof.FinitePartitionRefinement.energy,ZMod.card] using average_energy_le_card π f hf private def zz1817:"s0719"="s0719":=by decide+kernel theorem exists_uniform_or_large_energy (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (n:ℕ) : (∃ j ≤ n, ∃ π:ZMod q → Alphabet η j,FourierUniform π f η) ∨ ∃ π:ZMod q → Alphabet η n,(n:ℝ) * (η ^ 2 / 16) ≤ Green24Proof.FinitePartitionRefinement.energy π f / q:=by classical induction n with | zero => right let ρ:ZMod q → Alphabet η 0:=fun _ i => Fin.elim0 i refine ⟨ρ, ?_⟩ simpa only [Nat.cast_zero,zero_mul] using normalized_energy_nonneg ρ f | succ n ih => rcases ih with ⟨j,hj,π,hπ⟩ | ⟨ρ,hρ⟩ · exact Or.inl ⟨j,hj.trans (Nat.le_succ n),π,hπ⟩ · by_cases hu:FourierUniform ρ f η · exact Or.inl ⟨n,Nat.le_succ n,ρ,hu⟩ · change ¬ ∀ k, ‖ZMod.dft (fun x => ((f x - average ρ f x:ℝ):ℂ)) k‖ ≤ η * q at hu obtain ⟨k,hk⟩:=not_forall.mp hu obtain ⟨σ,_hσ,hinc⟩:=exists_bounded_refinement_of_large_dft ρ f hf k hη (lt_of_not_ge hk).le let π:ZMod q → Alphabet η (n + 1):=fun x => successorEquiv η n (σ x) have he:Green24Proof.FinitePartitionRefinement.energy π f = Green24Proof.FinitePartitionRefinement.energy σ f := energy_comp_injective σ (successorEquiv η n) (successorEquiv η n).injective f right refine ⟨π, ?_⟩ rw [he,Nat.cast_add,Nat.cast_one] nlinarith noncomputable def stepBound (η:ℝ):ℕ:=⌈16 / η ^ 2⌉₊ + 1 theorem stepBound_exceeds_energy {η:ℝ} (hη:0 < η) : 1 < (stepBound η:ℝ) * (η ^ 2 / 16):=by have hc:=Nat.le_ceil (16 / η ^ 2) have hb:16 / η ^ 2 < (stepBound η:ℝ):=by unfold stepBound push_cast linarith have hp:=(div_lt_iff₀ (sq_pos_of_pos hη)).mp hb nlinarith theorem exists_fourier_uniform_partition (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) : ∃ n ≤ stepBound η, ∃ π:ZMod q → Alphabet η n,FourierUniform π f η:=by rcases exists_uniform_or_large_energy f hf hη (stepBound η) with h | ⟨π,hπ⟩ · exact h · have hu:=normalized_energy_le_one π f hf have hl:=stepBound_exceeds_energy hη exfalso linarith theorem alphabet_card_le_bound {η:ℝ} {n:ℕ} (hn:n ≤ stepBound η) : Fintype.card (Alphabet η n) ≤ (2 * resolution η + 1) ^ stepBound η:=by rw [alphabet_card] exact Nat.pow_le_pow_right (Nat.succ_pos _) hn private def zz1818:"s071a"="s071a":=by decide+kernel theorem exists_range_preserving_fourier_approximation (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) : ∃ n ≤ stepBound η, ∃ π:ZMod q → Alphabet η n, Fintype.card (Alphabet η n) ≤ (2 * resolution η + 1) ^ stepBound η ∧ (∀ x,average π f x ∈ Set.Icc 0 1) ∧ (∑ x,average π f x) = (∑ x,f x) ∧ (∀ x,f x - average π f x ∈ Set.Icc (-1) 1) ∧ FourierUniform π f η:=by obtain ⟨n,hn,π,hπ⟩:=exists_fourier_uniform_partition f hf hη exact ⟨n,hn,π,alphabet_card_le_bound hn,average_mem_Icc π f hf, sum_average π f,residual_mem_Icc π f hf,hπ⟩ end Green24Proof.CyclicWeakRegularity private def zz2416:"s0970"="s0970":=by decide+kernel end section namespace Green24Proof.CyclicCharacterFactor open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage open Green24Proof.FinitePartitionRefinement open Green24Proof.FiniteScalarQuantization open Green24Proof.FourierPartitionIncrement open Green24Proof.CyclicWeakRegularity variable {q:ℕ} [NeZero q] noncomputable def characterTest (k:ZMod q) (imaginary:Bool) (x:ZMod q):ℝ := if imaginary then (ZMod.stdAddChar (-(x * k))).im else (ZMod.stdAddChar (-(x * k))).re theorem characterTest_mem_Icc (k:ZMod q) (b:Bool) (x:ZMod q) : characterTest k b x ∈ Set.Icc (-1) 1:=by have hn:‖ZMod.stdAddChar (-(x * k))‖ = 1:=by simp only [ZMod.stdAddChar_apply,Circle.norm_coe] cases b · exact abs_le.mp ((Complex.abs_re_le_norm _).trans_eq hn) · exact abs_le.mp ((Complex.abs_im_le_norm _).trans_eq hn) theorem exists_correlating_component (r:ZMod q → ℝ) (k:ZMod q) {η:ℝ} (hlarge:η * q ≤ ‖ZMod.dft (fun x => (r x:ℂ)) k‖) : ∃ b:Bool,η * q / 2 ≤ |∑ x,r x * characterTest k b x|:=by by_cases hre:η * q / 2 ≤ |(ZMod.dft (fun x => (r x:ℂ)) k).re| · refine ⟨false, ?_⟩ change η * q / 2 ≤ |∑ x,r x * (ZMod.stdAddChar (-(x * k))).re| rwa [dft_real_re] at hre · refine ⟨true, ?_⟩ have hab:=Complex.norm_le_abs_re_add_abs_im (ZMod.dft (fun x => (r x:ℂ)) k) have hi:η * q / 2 ≤ |(ZMod.dft (fun x => (r x:ℂ)) k).im|:=by linarith change η * q / 2 ≤ |∑ x,r x * (ZMod.stdAddChar (-(x * k))).im| rwa [dft_real_im] at hi noncomputable def quantizedCharacter (η:ℝ) (k:ZMod q) (b:Bool) (x:ZMod q) : Fin (2 * resolution η + 1) := quantize (resolution η) (characterTest k b x) theorem exists_quantized_correlating_component (r:ZMod q → ℝ) (k:ZMod q) (hr:∀ x, |r x| ≤ 1) {η:ℝ} (hη:0 < η) (hlarge:η * q ≤ ‖ZMod.dft (fun x => (r x:ℂ)) k‖) : ∃ b:Bool,(η / 4) * q ≤ |∑ x,r x * gridValue (resolution η) (quantizedCharacter η k b x)|:=by obtain ⟨b,hb⟩:=exists_correlating_component r k hlarge refine ⟨b, ?_⟩ have he:=correlation_transfer (resolution_pos η) r (characterTest k b) hr (characterTest_mem_Icc k b) simp only [ZMod.card] at he have hp:=mul_le_mul_of_nonneg_left (resolution_precision hη) (Nat.cast_nonneg q) rw [mul_one_div] at hp change (η / 4) * q ≤ |∑ x,r x * gridValue (resolution η) (quantize (resolution η) (characterTest k b x))| nlinarith noncomputable def phaseFactor {n:ℕ} (η:ℝ) (frequencies:Fin n → ZMod q) (components:Fin n → Bool) (x:ZMod q):Alphabet η n := fun i => quantizedCharacter η (frequencies i) (components i) x private def zz1819:"s071b"="s071b":=by decide+kernel theorem phaseFactor_cons {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (k:ZMod q) (b:Bool) (x:ZMod q) : phaseFactor η (Fin.cons k ks) (Fin.cons b bs) x = Fin.cons (quantizedCharacter η k b x) (phaseFactor η ks bs x):=by funext i refine Fin.cases ?_ (fun j => ?_) i <;> simp [phaseFactor] theorem phaseFactor_cons_tail {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (k:ZMod q) (b:Bool) (x:ZMod q) : phaseFactor η ks bs x = Fin.tail (phaseFactor η (Fin.cons k ks) (Fin.cons b bs) x):=by rw [phaseFactor_cons,Fin.tail_cons] theorem exists_phase_extension {n:ℕ} (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (k:ZMod q) (hlarge:η * q ≤ ‖ZMod.dft (fun x => ((f x - average (phaseFactor η ks bs) f x:ℝ):ℂ)) k‖) : ∃ b:Bool,Green24Proof.FinitePartitionRefinement.energy (phaseFactor η ks bs) f / q + η ^ 2 / 16 ≤ Green24Proof.FinitePartitionRefinement.energy (phaseFactor η (Fin.cons k ks) (Fin.cons b bs)) f / q:=by let ρ:=phaseFactor η ks bs have hr:∀ x, |f x - average ρ f x| ≤ 1 := fun x => abs_le.mpr (residual_mem_Icc ρ f hf x) obtain ⟨b,hc⟩:=exists_quantized_correlating_component (fun x => f x - average ρ f x) k hr hη hlarge let π:=phaseFactor η (Fin.cons k ks) (Fin.cons b bs) let g:Alphabet η (n + 1) → ℝ:=fun v => gridValue (resolution η) (v 0) have hg:∀ x, |g (π x)| ≤ 1 := fun x => abs_le.mpr (gridValue_mem_Icc (resolution_pos η) (π x 0)) have href:∀ x,ρ x = Fin.tail (π x):=phaseFactor_cons_tail η ks bs k b have hcorr:(η / 4) * Fintype.card (ZMod q) ≤ |∑ x,(f x - average ρ f x) * g (π x)|:=by simpa only [ZMod.card,g,π,phaseFactor_cons,Fin.cons_zero] using hc have hi:=normalized_energy_increment π ρ Fin.tail href f g (show 0 ≤ η / 4 by positivity) hg hcorr refine ⟨b, ?_⟩ norm_num only [ZMod.card,div_pow] at hi exact hi theorem exists_uniform_character_factor_or_large_energy (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (n:ℕ) : (∃ j ≤ n, ∃ (ks:Fin j → ZMod q) (bs:Fin j → Bool), FourierUniform (phaseFactor η ks bs) f η) ∨ ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool), (n:ℝ) * (η ^ 2 / 16) ≤ Green24Proof.FinitePartitionRefinement.energy (phaseFactor η ks bs) f / q:=by classical induction n with | zero => right let ks:Fin 0 → ZMod q:=Fin.elim0 let bs:Fin 0 → Bool:=Fin.elim0 refine ⟨ks,bs, ?_⟩ simpa only [Nat.cast_zero,zero_mul] using normalized_energy_nonneg (phaseFactor η ks bs) f | succ n ih => rcases ih with ⟨j,hj,ks,bs,hu⟩ | ⟨ks,bs,he⟩ · exact Or.inl ⟨j,hj.trans (Nat.le_succ n),ks,bs,hu⟩ · by_cases hu:FourierUniform (phaseFactor η ks bs) f η · exact Or.inl ⟨n,Nat.le_succ n,ks,bs,hu⟩ · change ¬ ∀ k, ‖ZMod.dft (fun x => ((f x - average (phaseFactor η ks bs) f x:ℝ):ℂ)) k‖ ≤ η * q at hu obtain ⟨k,hk⟩:=not_forall.mp hu obtain ⟨b,hb⟩:=exists_phase_extension f hf hη ks bs k (lt_of_not_ge hk).le right refine ⟨Fin.cons k ks,Fin.cons b bs, ?_⟩ rw [Nat.cast_add,Nat.cast_one] nlinarith private def zz1820:"s071c"="s071c":=by decide+kernel theorem exists_uniform_character_factor (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool), FourierUniform (phaseFactor η ks bs) f η:=by rcases exists_uniform_character_factor_or_large_energy f hf hη (stepBound η) with h | ⟨ks,bs,he⟩ · exact h · have hu:=normalized_energy_le_one (phaseFactor η ks bs) f hf have hl:=stepBound_exceeds_energy hη exfalso linarith theorem exists_character_factor_approximation (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (F:Alphabet η n → ℝ), Fintype.card (Alphabet η n) ≤ (2 * resolution η + 1) ^ stepBound η ∧ (∀ a,F a ∈ Set.Icc 0 1) ∧ (∀ x,average (phaseFactor η ks bs) f x = F (phaseFactor η ks bs x)) ∧ (∑ x,F (phaseFactor η ks bs x)) = (∑ x,f x) ∧ (∀ k, ‖ZMod.dft (fun x => ((f x - F (phaseFactor η ks bs x):ℝ):ℂ)) k‖ ≤ η * q):=by obtain ⟨n,hn,ks,bs,hu⟩:=exists_uniform_character_factor f hf hη refine ⟨n,hn,ks,bs,fiberMean (phaseFactor η ks bs) f, alphabet_card_le_bound hn, ?_,fun _ => rfl, ?_,hu⟩ · intro a exact ⟨fiberMean_nonneg _ f (fun x => (hf x).1) a, fiberMean_le_one _ f (fun x => (hf x).2) a⟩ · exact sum_average (phaseFactor η ks bs) f end Green24Proof.CyclicCharacterFactor private def zz2417:"s0971"="s0971":=by decide+kernel end section namespace Green24Proof.GridLipschitzSmoothing open scoped NNReal section SeparatedLabels variable {X B:Type*} [PseudoMetricSpace X] theorem exists_bounded_extension (label:X → B) (F:B → ℝ) (hF:∀ b,F b ∈ Set.Icc 0 1) (good:Set X) (K:ℝ≥0) (hsep:∀ x ∈ good, ∀ y ∈ good,label x ≠ label y → 1 ≤ (K:ℝ) * dist x y) : ∃ G:X → ℝ,LipschitzWith K G ∧ (∀ x,G x ∈ Set.Icc 0 1) ∧ ∀ x ∈ good,G x = F (label x):=by have hl:LipschitzOnWith K (fun x => F (label x)) good:=by apply LipschitzOnWith.of_dist_le_mul intro x hx y hy by_cases he:label x = label y · rw [he,dist_self] exact mul_nonneg K.coe_nonneg dist_nonneg · rw [Real.dist_eq] have hFx:=hF (label x) have hFy:=hF (label y) have hv:|F (label x) - F (label y)| ≤ 1:=by apply abs_le.mpr constructor <;> linarith [hFx.1,hFx.2,hFy.1,hFy.2] exact hv.trans (hsep x hx y hy he) obtain ⟨g,hg,heq⟩:=hl.extend_real refine ⟨fun x => max 0 (min 1 (g x)),(hg.const_min 1).const_max 0, ?_, ?_⟩ · intro x exact ⟨le_max_left _ _,max_le (by norm_num) (min_le_left _ _)⟩ · intro x hx change max 0 (min 1 (g x)) = F (label x) rw [← heq hx,min_eq_right (hF (label x)).2,max_eq_right (hF (label x)).1] end SeparatedLabels noncomputable def cellIndex (h o x:ℝ):ℤ:=⌊(x - o) / h⌋ def GridGood (h δ o:ℝ):Set ℝ := {x | ∀ j:ℤ,δ ≤ |x - (o + (j:ℝ) * h)|} theorem gap_of_cellIndex_lt {h δ o x y:ℝ} (hh:0 < h) (hx:x ∈ GridGood h δ o) (hy:y ∈ GridGood h δ o) (hxy:cellIndex h o x < cellIndex h o y):2 * δ ≤ y - x:=by let i:=cellIndex h o x let j:=cellIndex h o y have hxi:(x - o) / h < (i:ℝ) + 1:=Int.lt_floor_add_one _ have hyj:(j:ℝ) ≤ (y - o) / h:=Int.floor_le _ have hij:(i:ℝ) + 1 ≤ (j:ℝ):=by have hijZ:i + 1 ≤ j:=by omega exact_mod_cast hijZ have hxb:x < o + ((i:ℝ) + 1) * h:=by have ht:=(div_lt_iff₀ hh).mp hxi linarith have hby:o + ((i:ℝ) + 1) * h ≤ y:=by have ht:=(le_div_iff₀ hh).mp hyj have hm:=mul_le_mul_of_nonneg_right hij hh.le linarith have hxg:=hx (i + 1) have hyg:=hy (i + 1) push_cast at hxg hyg rw [abs_of_nonpos (by linarith)] at hxg rw [abs_of_nonneg (by linarith)] at hyg linarith private def zz1821:"s071d"="s071d":=by decide+kernel theorem grid_core_separation {h δ o x y:ℝ} (hh:0 < h) (hx:x ∈ GridGood h δ o) (hy:y ∈ GridGood h δ o) (hne:cellIndex h o x ≠ cellIndex h o y):2 * δ ≤ dist x y:=by rcases lt_or_gt_of_ne hne with hxy | hyx · have hg:=gap_of_cellIndex_lt hh hx hy hxy exact hg.trans (by rw [Real.dist_eq,abs_sub_comm]; exact le_abs_self _) · have hg:=gap_of_cellIndex_lt hh hy hx hyx exact hg.trans (by rw [Real.dist_eq]; exact le_abs_self _) theorem exists_scalar_grid_smoothing (h δ o:ℝ) (hh:0 < h) (hδ:0 < δ) (F:ℤ → ℝ) (hF:∀ j,F j ∈ Set.Icc 0 1) : ∃ G:ℝ → ℝ, LipschitzWith ⟨1 / (2 * δ),by positivity⟩ G ∧ (∀ x,G x ∈ Set.Icc 0 1) ∧ ∀ x ∈ GridGood h δ o,G x = F (cellIndex h o x):=by apply exists_bounded_extension (cellIndex h o) F hF (GridGood h δ o) _ intro x hx y hy hne change (1:ℝ) ≤ (1 / (2 * δ)) * dist x y have hs:=grid_core_separation hh hx hy hne have hd:(0:ℝ) < 2 * δ:=by positivity have hb:(1:ℝ) ≤ dist x y / (2 * δ):=(le_div_iff₀ hd).mpr (by simpa using hs) simpa only [div_eq_mul_inv,one_mul,mul_comm] using hb section VectorGrid variable {ι:Type*} [Fintype ι] noncomputable def vectorCellIndex (h:ℝ) (o x:ι → ℝ):ι → ℤ := fun i => cellIndex h (o i) (x i) def VectorGridGood (h δ:ℝ) (o:ι → ℝ):Set (ι → ℝ) := {x | ∀ i,x i ∈ GridGood h δ (o i)} theorem vector_grid_core_separation {h δ:ℝ} {o x y:ι → ℝ} (hh:0 < h) (hx:x ∈ VectorGridGood h δ o) (hy:y ∈ VectorGridGood h δ o) (hne:vectorCellIndex h o x ≠ vectorCellIndex h o y):2 * δ ≤ dist x y:=by obtain ⟨i,hi⟩:=Function.ne_iff.mp hne exact (grid_core_separation hh (hx i) (hy i) hi).trans (dist_le_pi_dist x y i) theorem exists_vector_grid_smoothing (h δ:ℝ) (o:ι → ℝ) (hh:0 < h) (hδ:0 < δ) (F:(ι → ℤ) → ℝ) (hF:∀ j,F j ∈ Set.Icc 0 1) : ∃ G:(ι → ℝ) → ℝ, LipschitzWith ⟨1 / (2 * δ),by positivity⟩ G ∧ (∀ x,G x ∈ Set.Icc 0 1) ∧ ∀ x ∈ VectorGridGood h δ o,G x = F (vectorCellIndex h o x):=by apply exists_bounded_extension (vectorCellIndex h o) F hF (VectorGridGood h δ o) _ intro x hx y hy hne change (1:ℝ) ≤ (1 / (2 * δ)) * dist x y have hs:=vector_grid_core_separation hh hx hy hne have hd:(0:ℝ) < 2 * δ:=by positivity have hb:(1:ℝ) ≤ dist x y / (2 * δ):=(le_div_iff₀ hd).mpr (by simpa using hs) simpa only [div_eq_mul_inv,one_mul,mul_comm] using hb end VectorGrid end Green24Proof.GridLipschitzSmoothing private def zz2418:"s0972"="s0972":=by decide+kernel end section namespace Green24Proof.ShiftedScalarQuantization open Finset open scoped BigOperators noncomputable def coordinate (m:ℕ) (t:ℝ):ℝ:=(m:ℝ) * (t + 1) + 1 noncomputable def quantize (m:ℕ) (o t:ℝ):Fin (2 * m + 2) := ⟨min ⌊coordinate m t - o⌋₊ (2 * m + 1),by omega⟩ noncomputable def rawValue (m:ℕ) (o:ℝ) (k:Fin (2 * m + 2)):ℝ := ((k.val:ℝ) + o - 1) / m - 1 noncomputable def gridValue (m:ℕ) (o:ℝ) (k:Fin (2 * m + 2)):ℝ := max (-1) (min 1 (rawValue m o k)) private def zz1822:"s071e"="s071e":=by decide+kernel theorem gridValue_mem_Icc (m:ℕ) (o:ℝ) (k:Fin (2 * m + 2)) : gridValue m o k ∈ Set.Icc (-1) 1:=by exact ⟨le_max_left _ _,max_le (by norm_num) (min_le_left _ _)⟩ theorem coordinate_bounds {m:ℕ} {t:ℝ} (ht:t ∈ Set.Icc (-1) 1) : 1 ≤ coordinate m t ∧ coordinate m t ≤ 2 * m + 1:=by unfold coordinate constructor <;> nlinarith [ht.1,ht.2,(Nat.cast_nonneg m:(0:ℝ) ≤ m)] theorem quantize_val {m:ℕ} {o t:ℝ} (ho:o ∈ Set.Icc 0 1) (ht:t ∈ Set.Icc (-1) 1) : (quantize m o t).val = ⌊coordinate m t - o⌋₊:=by have hb:coordinate m t - o ≤ (2 * m + 1:ℕ):=by push_cast linarith [(coordinate_bounds (m:=m) ht).2,ho.1] have hf:⌊coordinate m t - o⌋₊ ≤ 2 * m + 1 := (Nat.floor_le_floor hb).trans_eq (Nat.floor_natCast _) exact min_eq_left hf theorem raw_quantization_error {m:ℕ} (hm:0 < m) {o t:ℝ} (ho:o ∈ Set.Icc 0 1) (ht:t ∈ Set.Icc (-1) 1) : 0 ≤ t - rawValue m o (quantize m o t) ∧ t - rawValue m o (quantize m o t) < 1 / m:=by have hmR:(0:ℝ) < m:=Nat.cast_pos.mpr hm have hnonneg:0 ≤ coordinate m t - o:=by linarith [(coordinate_bounds (m:=m) ht).1,ho.2] have hlo:=Nat.floor_le hnonneg have hhi:=Nat.lt_floor_add_one (coordinate m t - o) unfold rawValue rw [quantize_val ho ht] have hdiv:((⌊coordinate m t - o⌋₊:ℝ) + o - 1) / m ≤ t + 1:=by apply (div_le_iff₀ hmR).mpr dsimp [coordinate] at hlo ⊢ nlinarith have hdiv':t + 1 < ((⌊coordinate m t - o⌋₊:ℝ) + o - 1) / m + 1 / m:=by rw [← add_div] apply (lt_div_iff₀ hmR).mpr dsimp [coordinate] at hhi ⊢ nlinarith constructor <;> linarith private def zz1823:"s071f"="s071f":=by decide+kernel theorem quantization_error {m:ℕ} (hm:0 < m) {o t:ℝ} (ho:o ∈ Set.Icc 0 1) (ht:t ∈ Set.Icc (-1) 1) : 0 ≤ t - gridValue m o (quantize m o t) ∧ t - gridValue m o (quantize m o t) < 1 / m:=by have he:=raw_quantization_error hm ho ht have hr:rawValue m o (quantize m o t) ≤ 1:=by linarith [ht.2] unfold gridValue rw [min_eq_right hr] have hmax:max (-1) (rawValue m o (quantize m o t)) ≤ t := max_le ht.1 (by linarith) have hraw:=le_max_right (-1) (rawValue m o (quantize m o t)) constructor <;> linarith theorem quantization_abs_error {m:ℕ} (hm:0 < m) {o t:ℝ} (ho:o ∈ Set.Icc 0 1) (ht:t ∈ Set.Icc (-1) 1) : |t - gridValue m o (quantize m o t)| ≤ 1 / m:=by have he:=quantization_error hm ho ht rw [abs_of_nonneg he.1] exact he.2.le noncomputable def encodeCell (m:ℕ) (j:ℤ):Fin (2 * m + 2) := ⟨min j.toNat (2 * m + 1),by omega⟩ theorem quantize_eq_encodeCell (m:ℕ) (o t:ℝ) : quantize m o t = encodeCell m (Green24Proof.GridLipschitzSmoothing.cellIndex 1 o (coordinate m t)):=by apply Fin.ext simp only [quantize,encodeCell,Green24Proof.GridLipschitzSmoothing.cellIndex, div_one,Int.floor_toNat] variable {α:Type*} [Fintype α] theorem correlation_error {m:ℕ} (hm:0 < m) {o:ℝ} (ho:o ∈ Set.Icc 0 1) (r g:α → ℝ) (hr:∀ x, |r x| ≤ 1) (hg:∀ x,g x ∈ Set.Icc (-1) 1) : |(∑ x,r x * g x) - ∑ x,r x * gridValue m o (quantize m o (g x))| ≤ (Fintype.card α:ℝ) / m:=by rw [← Finset.sum_sub_distrib] calc |∑ x,(r x * g x - r x * gridValue m o (quantize m o (g x)))| ≤ ∑ x, |r x * g x - r x * gridValue m o (quantize m o (g x))| := Finset.abs_sum_le_sum_abs _ _ _ ≤ ∑ _x:α,(1:ℝ) / m:=by apply Finset.sum_le_sum intro x _ rw [← mul_sub,abs_mul] exact (mul_le_mul (hr x) (quantization_abs_error hm ho (hg x)) (abs_nonneg _) (by norm_num)).trans_eq (one_mul _) _ = _:=by simp [div_eq_mul_inv] private def zz1824:"s0720"="s0720":=by decide+kernel theorem correlation_transfer {m:ℕ} (hm:0 < m) {o:ℝ} (ho:o ∈ Set.Icc 0 1) (r g:α → ℝ) (hr:∀ x, |r x| ≤ 1) (hg:∀ x,g x ∈ Set.Icc (-1) 1) : |∑ x,r x * g x| - (Fintype.card α:ℝ) / m ≤ |∑ x,r x * gridValue m o (quantize m o (g x))|:=by have he:=correlation_error hm ho r g hr hg have ht:=abs_add_le ((∑ x,r x * g x) - ∑ x,r x * gridValue m o (quantize m o (g x))) (∑ x,r x * gridValue m o (quantize m o (g x))) rw [sub_add_cancel] at ht linarith end Green24Proof.ShiftedScalarQuantization private def zz2419:"s0973"="s0973":=by decide+kernel end section namespace Green24Proof.FiniteGridBoundaryAvoidance open Finset open scoped BigOperators def BoundaryBad {M:ℕ} (a:Fin M) (t:ℝ):Prop := ∃ j:ℤ, |(M:ℝ) * t - (((M:ℤ) * j + (a.val:ℤ):ℤ):ℝ)| < 1 / 2 theorem boundaryBad_unique {M:ℕ} {a b:Fin M} {t:ℝ} (ha:BoundaryBad a t) (hb:BoundaryBad b t):a = b:=by obtain ⟨j,hj⟩:=ha obtain ⟨k,hk⟩:=hb let u:ℤ:=(M:ℤ) * j + a.val let v:ℤ:=(M:ℤ) * k + b.val have huvR:|((u - v:ℤ):ℝ)| < 1:=by rw [Int.cast_sub,abs_lt] have hj':=abs_lt.mp hj have hk':=abs_lt.mp hk change -(1:ℝ) < (u:ℝ) - v ∧ (u:ℝ) - v < 1 constructor <;> dsimp [u,v] at * <;> linarith [hj'.1,hj'.2,hk'.1,hk'.2] have huvZ:|u - v| < 1:=by exact_mod_cast huvR have huv:u = v:=sub_eq_zero.mp (Int.abs_lt_one_iff.mp huvZ) have hmod:=congrArg (fun z:ℤ => z % (M:ℤ)) huv dsimp [u,v] at hmod have haM:(a.val:ℤ) % M = a.val := Int.emod_eq_of_lt (Int.natCast_nonneg _) (by exact_mod_cast a.isLt) have hbM:(b.val:ℤ) % M = b.val := Int.emod_eq_of_lt (Int.natCast_nonneg _) (by exact_mod_cast b.isLt) rw [add_comm ((M:ℤ) * j),add_comm ((M:ℤ) * k), Int.add_mul_emod_self_left,Int.add_mul_emod_self_left,haM,hbM] at hmod apply Fin.ext exact_mod_cast hmod theorem boundaryBad_iff_near_grid {M:ℕ} (hM:0 < M) (a:Fin M) (t:ℝ) : BoundaryBad a t ↔ ∃ j:ℤ, |t - ((j:ℝ) + (a.val:ℝ) / M)| < 1 / (2 * M):=by have hMR:(0:ℝ) < M:=Nat.cast_pos.mpr hM unfold BoundaryBad apply exists_congr intro j have he:(M:ℝ) * (t - ((j:ℝ) + (a.val:ℝ) / M)) = (M:ℝ) * t - (((M:ℤ) * j + (a.val:ℤ):ℤ):ℝ):=by push_cast rw [mul_sub,mul_add,mul_div_cancel₀ _ hMR.ne'] rw [← he,abs_mul,abs_of_pos hMR, ← div_div,lt_div_iff₀ hMR,mul_comm] theorem boundaryBad_iff_near_scaled_grid {M:ℕ} (hM:0 < M) {s:ℝ} (hs:0 < s) (a:Fin M) (t:ℝ) : BoundaryBad a (s * t) ↔ ∃ j:ℤ, |t - ((j:ℝ) + (a.val:ℝ) / M) / s| < 1 / (2 * M * s):=by rw [boundaryBad_iff_near_grid hM] apply exists_congr intro j have he:s * (t - ((j:ℝ) + (a.val:ℝ) / M) / s) = s * t - ((j:ℝ) + (a.val:ℝ) / M):=by rw [mul_sub,mul_div_cancel₀ _ hs.ne'] rw [← he,abs_mul,abs_of_pos hs, ← div_div (1:ℝ) (2 * M) s, lt_div_iff₀ hs,mul_comm] noncomputable def badOffsets (M:ℕ) (t:ℝ):Finset (Fin M):=by classical exact Finset.univ.filter (fun a => BoundaryBad a t) private def zz1825:"s0721"="s0721":=by decide+kernel theorem badOffsets_card_le_one (M:ℕ) (t:ℝ):(badOffsets M t).card ≤ 1:=by classical apply Finset.card_le_one.mpr intro a ha b hb exact boundaryBad_unique (Finset.mem_filter.mp ha).2 (Finset.mem_filter.mp hb).2 variable {α:Type*} [Fintype α] noncomputable def badSamples {M:ℕ} (a:Fin M) (samples:α → ℝ):Finset α:=by classical exact Finset.univ.filter (fun x => BoundaryBad a (samples x)) theorem sum_badSamples_card (M:ℕ) (samples:α → ℝ) : (∑ a:Fin M,(badSamples a samples).card) = ∑ x,(badOffsets M (samples x)).card:=by classical simp only [badSamples,badOffsets,Finset.card_eq_sum_ones,Finset.sum_filter] exact Finset.sum_comm theorem sum_badSamples_card_le (M:ℕ) (samples:α → ℝ) : (∑ a:Fin M,(badSamples a samples).card) ≤ Fintype.card α:=by rw [sum_badSamples_card] calc (∑ x,(badOffsets M (samples x)).card) ≤ ∑ _x:α,1 := Finset.sum_le_sum (fun x _ => badOffsets_card_le_one M (samples x)) _ = _:=by simp theorem exists_offset_card_bound {M:ℕ} (hM:0 < M) (samples:α → ℝ) : ∃ a:Fin M,M * (badSamples a samples).card ≤ Fintype.card α:=by have hs:(Finset.univ:Finset (Fin M)).Nonempty:=⟨⟨0,hM⟩,Finset.mem_univ _⟩ have hsum:(∑ a:Fin M,M * (badSamples a samples).card) ≤ ∑ _a:Fin M,Fintype.card α:=by calc (∑ a:Fin M,M * (badSamples a samples).card) = M * ∑ a:Fin M,(badSamples a samples).card:=(Finset.mul_sum _ _ _).symm _ ≤ M * Fintype.card α:=Nat.mul_le_mul_left M (sum_badSamples_card_le M samples) _ = _:=by simp obtain ⟨a,_,ha⟩:=Finset.exists_le_of_sum_le hs hsum exact ⟨a,ha⟩ private def zz1826:"s0722"="s0722":=by decide+kernel theorem exists_offset_fraction_bound {M:ℕ} (hM:0 < M) (samples:α → ℝ) : ∃ a:Fin M,((badSamples a samples).card:ℝ) ≤ (Fintype.card α:ℝ) / M:=by obtain ⟨a,ha⟩:=exists_offset_card_bound hM samples refine ⟨a,(le_div_iff₀ (Nat.cast_pos.mpr hM)).mpr ?_⟩ have h:(M:ℝ) * (badSamples a samples).card ≤ Fintype.card α:=by exact_mod_cast ha simpa only [mul_comm] using h variable {ι:Type*} [Fintype ι] noncomputable def badCoordinateSamples {M:ℕ} (offsets:ι → Fin M) (samples:α → ι → ℝ):Finset α:=by classical exact Finset.univ.filter (fun x => ∃ i,BoundaryBad (offsets i) (samples x i)) theorem exists_coordinate_offsets_card_bound {M:ℕ} (hM:0 < M) (samples:α → ι → ℝ) : ∃ offsets:ι → Fin M, M * (badCoordinateSamples offsets samples).card ≤ Fintype.card ι * Fintype.card α:=by classical choose offsets hoff using fun i => exists_offset_card_bound hM (fun x => samples x i) refine ⟨offsets, ?_⟩ have hsets:badCoordinateSamples offsets samples = Finset.univ.biUnion (fun i => badSamples (offsets i) (fun x => samples x i)):=by ext x simp [badCoordinateSamples,badSamples] rw [hsets] calc M * (Finset.univ.biUnion (fun i => badSamples (offsets i) (fun x => samples x i))).card ≤ M * ∑ i,(badSamples (offsets i) (fun x => samples x i)).card := Nat.mul_le_mul_left M Finset.card_biUnion_le _ = ∑ i,M * (badSamples (offsets i) (fun x => samples x i)).card := Finset.mul_sum _ _ _ _ ≤ ∑ _i:ι,Fintype.card α:=Finset.sum_le_sum (fun i _ => hoff i) _ = _:=by simp theorem exists_coordinate_offsets_fraction_bound {M:ℕ} (hM:0 < M) (samples:α → ι → ℝ) : ∃ offsets:ι → Fin M, ((badCoordinateSamples offsets samples).card:ℝ) ≤ (Fintype.card ι:ℝ) * Fintype.card α / M:=by obtain ⟨offsets,ho⟩:=exists_coordinate_offsets_card_bound hM samples refine ⟨offsets,(le_div_iff₀ (Nat.cast_pos.mpr hM)).mpr ?_⟩ have h:(M:ℝ) * (badCoordinateSamples offsets samples).card ≤ (Fintype.card ι:ℝ) * Fintype.card α:=by exact_mod_cast ho simpa only [mul_comm] using h end Green24Proof.FiniteGridBoundaryAvoidance private def zz2420:"s0974"="s0974":=by decide+kernel end section namespace Green24Proof.CyclicShiftedCharacterFactor open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage open Green24Proof.FinitePartitionRefinement open Green24Proof.FiniteScalarQuantization (resolution resolution_pos resolution_precision) open Green24Proof.CyclicWeakRegularity (FourierUniform stepBound stepBound_exceeds_energy normalized_energy_nonneg normalized_energy_le_one) open Green24Proof.CyclicCharacterFactor (characterTest characterTest_mem_Icc exists_correlating_component) open Green24Proof.ShiftedScalarQuantization open Green24Proof.FiniteGridBoundaryAvoidance variable {q M:ℕ} [NeZero q] noncomputable def offset (a:Fin M):ℝ:=(a.val:ℝ) / M theorem offset_mem_Icc (hM:0 < M) (a:Fin M):offset a ∈ Set.Icc 0 1:=by have hMR:(0:ℝ) < M:=Nat.cast_pos.mpr hM refine ⟨div_nonneg (Nat.cast_nonneg _) hMR.le, ?_⟩ exact (div_le_one hMR).mpr (by exact_mod_cast a.isLt.le) noncomputable def characterCoordinate (η:ℝ) (k:ZMod q) (b:Bool) (x:ZMod q):ℝ:=coordinate (resolution η) (characterTest k b x) noncomputable def quantizedCharacter (η:ℝ) (a:Fin M) (k:ZMod q) (b:Bool) (x:ZMod q):Fin (2 * resolution η + 2) := quantize (resolution η) (offset a) (characterTest k b x) abbrev Alphabet (η:ℝ) (n:ℕ):=Fin n → Fin (2 * resolution η + 2) noncomputable def phaseFactor {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (x:ZMod q):Alphabet η n := fun i => quantizedCharacter η (as i) (ks i) (bs i) x def BoundaryControlled {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M):Prop := ∀ i,M * (badSamples (as i) (characterCoordinate η (ks i) (bs i))).card ≤ q private def zz1827:"s0723"="s0723":=by decide+kernel theorem phaseFactor_cons {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (k:ZMod q) (b:Bool) (a:Fin M) (x:ZMod q) : phaseFactor η (Fin.cons k ks) (Fin.cons b bs) (Fin.cons a as) x = Fin.cons (quantizedCharacter η a k b x) (phaseFactor η ks bs as x):=by funext i refine Fin.cases ?_ (fun j => ?_) i <;> simp [phaseFactor] theorem phaseFactor_cons_tail {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (k:ZMod q) (b:Bool) (a:Fin M) (x:ZMod q) : phaseFactor η ks bs as x = Fin.tail (phaseFactor η (Fin.cons k ks) (Fin.cons b bs) (Fin.cons a as) x):=by rw [phaseFactor_cons,Fin.tail_cons] theorem boundaryControlled_cons {n:ℕ} {η:ℝ} {ks:Fin n → ZMod q} {bs:Fin n → Bool} {as:Fin n → Fin M} {k:ZMod q} {b:Bool} {a:Fin M} (hold:BoundaryControlled η ks bs as) (hnew:M * (badSamples a (characterCoordinate η k b)).card ≤ q) : BoundaryControlled η (Fin.cons k ks) (Fin.cons b bs) (Fin.cons a as):=by intro i refine Fin.cases ?_ (fun j => ?_) i · simpa only [Fin.cons_zero] using hnew · simpa only [Fin.cons_succ] using hold j theorem exists_shifted_correlating_component (r:ZMod q → ℝ) (k:ZMod q) (hr:∀ x, |r x| ≤ 1) {η:ℝ} (hη:0 < η) (hM:0 < M) (hlarge:η * q ≤ ‖ZMod.dft (fun x => (r x:ℂ)) k‖) : ∃ (b:Bool) (a:Fin M), M * (badSamples a (characterCoordinate η k b)).card ≤ q ∧ (η / 4) * q ≤ |∑ x,r x * gridValue (resolution η) (offset a) (quantizedCharacter η a k b x)|:=by obtain ⟨b,hb⟩:=exists_correlating_component r k hlarge obtain ⟨a,ha⟩:=exists_offset_card_bound hM (characterCoordinate η k b) refine ⟨b,a,by simpa only [ZMod.card] using ha, ?_⟩ have he:=correlation_transfer (resolution_pos η) (offset_mem_Icc hM a) r (characterTest k b) hr (characterTest_mem_Icc k b) simp only [ZMod.card] at he have hp:=mul_le_mul_of_nonneg_left (resolution_precision hη) (Nat.cast_nonneg q) rw [mul_one_div] at hp change (η / 4) * q ≤ |∑ x,r x * gridValue (resolution η) (offset a) (quantize (resolution η) (offset a) (characterTest k b x))| nlinarith private def zz1828:"s0724"="s0724":=by decide+kernel theorem exists_phase_extension {n:ℕ} (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (k:ZMod q) (hlarge:η * q ≤ ‖ZMod.dft (fun x => ((f x - average (phaseFactor η ks bs as) f x:ℝ):ℂ)) k‖) : ∃ (b:Bool) (a:Fin M), M * (badSamples a (characterCoordinate η k b)).card ≤ q ∧ Green24Proof.FinitePartitionRefinement.energy (phaseFactor η ks bs as) f / q + η ^ 2 / 16 ≤ Green24Proof.FinitePartitionRefinement.energy (phaseFactor η (Fin.cons k ks) (Fin.cons b bs) (Fin.cons a as)) f / q:=by let ρ:=phaseFactor η ks bs as have hr:∀ x, |f x - average ρ f x| ≤ 1 := fun x => abs_le.mpr (residual_mem_Icc ρ f hf x) obtain ⟨b,a,ha,hc⟩:=exists_shifted_correlating_component (fun x => f x - average ρ f x) k hr hη hM hlarge let π:=phaseFactor η (Fin.cons k ks) (Fin.cons b bs) (Fin.cons a as) let g:Alphabet η (n + 1) → ℝ:=fun v => gridValue (resolution η) (offset a) (v 0) have hg:∀ x, |g (π x)| ≤ 1 := fun x => abs_le.mpr (gridValue_mem_Icc (resolution η) (offset a) (π x 0)) have href:∀ x,ρ x = Fin.tail (π x):=phaseFactor_cons_tail η ks bs as k b a have hcorr:(η / 4) * Fintype.card (ZMod q) ≤ |∑ x,(f x - average ρ f x) * g (π x)|:=by simpa only [ZMod.card,g,π,phaseFactor_cons,Fin.cons_zero] using hc have hi:=normalized_energy_increment π ρ Fin.tail href f g (show 0 ≤ η / 4 by positivity) hg hcorr refine ⟨b,a,ha, ?_⟩ norm_num only [ZMod.card,div_pow] at hi exact hi theorem exists_uniform_or_large_energy (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) (n:ℕ) : (∃ j ≤ n, ∃ (ks:Fin j → ZMod q) (bs:Fin j → Bool) (as:Fin j → Fin M), BoundaryControlled η ks bs as ∧ FourierUniform (phaseFactor η ks bs as) f η) ∨ ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M), BoundaryControlled η ks bs as ∧ (n:ℝ) * (η ^ 2 / 16) ≤ Green24Proof.FinitePartitionRefinement.energy (phaseFactor η ks bs as) f / q:=by classical induction n with | zero => right let ks:Fin 0 → ZMod q:=Fin.elim0 let bs:Fin 0 → Bool:=Fin.elim0 let as:Fin 0 → Fin M:=Fin.elim0 refine ⟨ks,bs,as,fun i => Fin.elim0 i, ?_⟩ simpa only [Nat.cast_zero,zero_mul] using normalized_energy_nonneg (phaseFactor η ks bs as) f | succ n ih => rcases ih with ⟨j,hj,ks,bs,as,hc,hu⟩ | ⟨ks,bs,as,hc,he⟩ · exact Or.inl ⟨j,hj.trans (Nat.le_succ n),ks,bs,as,hc,hu⟩ · by_cases hu:FourierUniform (phaseFactor η ks bs as) f η · exact Or.inl ⟨n,Nat.le_succ n,ks,bs,as,hc,hu⟩ · change ¬ ∀ k, ‖ZMod.dft (fun x => ((f x - average (phaseFactor η ks bs as) f x:ℝ):ℂ)) k‖ ≤ η * q at hu obtain ⟨k,hk⟩:=not_forall.mp hu obtain ⟨b,a,ha,hi⟩:=exists_phase_extension f hf hη hM ks bs as k (lt_of_not_ge hk).le right refine ⟨Fin.cons k ks,Fin.cons b bs,Fin.cons a as, boundaryControlled_cons hc ha, ?_⟩ rw [Nat.cast_add,Nat.cast_one] nlinarith theorem exists_uniform_character_factor (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M), BoundaryControlled η ks bs as ∧ FourierUniform (phaseFactor η ks bs as) f η:=by rcases exists_uniform_or_large_energy f hf hη hM (stepBound η) with h | ⟨ks,bs,as,_hc,he⟩ · exact h · have hu:=normalized_energy_le_one (phaseFactor η ks bs as) f hf have hl:=stepBound_exceeds_energy hη exfalso linarith theorem boundary_union_card_bound {n:ℕ} {η:ℝ} {ks:Fin n → ZMod q} {bs:Fin n → Bool} {as:Fin n → Fin M} (hc:BoundaryControlled η ks bs as) : M * (badCoordinateSamples as (fun x i => characterCoordinate η (ks i) (bs i) x)).card ≤ n * q:=by classical have hsets:badCoordinateSamples as (fun x i => characterCoordinate η (ks i) (bs i) x) = Finset.univ.biUnion (fun i => badSamples (as i) (characterCoordinate η (ks i) (bs i))):=by ext x simp [badCoordinateSamples,badSamples] rw [hsets] calc M * (Finset.univ.biUnion (fun i => badSamples (as i) (characterCoordinate η (ks i) (bs i)))).card ≤ M * ∑ i,(badSamples (as i) (characterCoordinate η (ks i) (bs i))).card := Nat.mul_le_mul_left M Finset.card_biUnion_le _ = ∑ i,M * (badSamples (as i) (characterCoordinate η (ks i) (bs i))).card:=Finset.mul_sum _ _ _ _ ≤ ∑ _i:Fin n,q:=Finset.sum_le_sum (fun i _ => hc i) _ = _:=by simp private def zz1829:"s0725"="s0725":=by decide+kernel theorem exists_character_factor_approximation (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (F:Alphabet η n → ℝ), Fintype.card (Alphabet η n) ≤ (2 * resolution η + 2) ^ stepBound η ∧ BoundaryControlled η ks bs as ∧ M * (badCoordinateSamples as (fun x i => characterCoordinate η (ks i) (bs i) x)).card ≤ n * q ∧ (∀ a,F a ∈ Set.Icc 0 1) ∧ (∀ x,average (phaseFactor η ks bs as) f x = F (phaseFactor η ks bs as x)) ∧ (∑ x,F (phaseFactor η ks bs as x)) = (∑ x,f x) ∧ (∀ k, ‖ZMod.dft (fun x => ((f x - F (phaseFactor η ks bs as x):ℝ):ℂ)) k‖ ≤ η * q):=by obtain ⟨n,hn,ks,bs,as,hc,hu⟩:=exists_uniform_character_factor f hf hη hM refine ⟨n,hn,ks,bs,as,fiberMean (phaseFactor η ks bs as) f, ?_,hc,boundary_union_card_bound hc, ?_,fun _ => rfl, ?_,hu⟩ · simp only [Alphabet,Fintype.card_fun,Fintype.card_fin] exact Nat.pow_le_pow_right (by omega) hn · intro a exact ⟨fiberMean_nonneg _ f (fun x => (hf x).1) a, fiberMean_le_one _ f (fun x => (hf x).2) a⟩ · exact sum_average (phaseFactor η ks bs as) f end Green24Proof.CyclicShiftedCharacterFactor private def zz2421:"s0975"="s0975":=by decide+kernel end section namespace Green24Proof.FiniteGridSmoothingSamples open Finset open scoped BigOperators NNReal open Green24Proof.GridLipschitzSmoothing open Green24Proof.FiniteGridBoundaryAvoidance theorem not_boundaryBad_iff_gridGood {M:ℕ} (hM:0 < M) (a:Fin M) (t:ℝ) : ¬ BoundaryBad a t ↔ t ∈ GridGood 1 (1 / (2 * M)) ((a.val:ℝ) / M):=by rw [boundaryBad_iff_near_grid hM] simp only [not_exists,not_lt,GridGood,Set.mem_ofPred_eq,mul_one,add_comm] variable {α ι:Type*} [Fintype α] [Fintype ι] theorem sq_error_sum_le_bad (bad:Finset α) (u v:α → ℝ) (hu:∀ x,u x ∈ Set.Icc 0 1) (hv:∀ x,v x ∈ Set.Icc 0 1) (heq:∀ x,x ∉ bad → u x = v x) : (∑ x,(u x - v x) ^ 2) ≤ (bad.card:ℝ):=by classical calc (∑ x,(u x - v x) ^ 2) ≤ ∑ x,if x ∈ bad then (1:ℝ) else 0:=by apply Finset.sum_le_sum intro x _ by_cases hx:x ∈ bad · rw [if_pos hx] have hux:=hu x have hvx:=hv x nlinarith [hux.1,hux.2,hvx.1,hvx.2] · rw [if_neg hx,heq x hx,sub_self,zero_pow (by decide:2 ≠ 0)] _ = _:=by simp only [Finset.sum_ite_mem_eq,Finset.sum_const,nsmul_eq_mul,mul_one] theorem sample_good_of_not_bad {M:ℕ} (hM:0 < M) (offsets:ι → Fin M) (samples:α → ι → ℝ) (x:α) (hx:x ∉ badCoordinateSamples offsets samples) : samples x ∈ VectorGridGood 1 (1 / (2 * M)) (fun i => (offsets i).val / (M:ℝ)):=by classical have hn:¬ ∃ i,BoundaryBad (offsets i) (samples x i):=by simpa only [badCoordinateSamples,Finset.mem_filter,Finset.mem_univ,true_and] using hx intro i apply (not_boundaryBad_iff_gridGood hM (offsets i) (samples x i)).mp exact fun hi => hn ⟨i,hi⟩ private def zz1830:"s0726"="s0726":=by decide+kernel theorem exists_grid_smoothing_with_sample_error {M:ℕ} (hM:0 < M) (samples:α → ι → ℝ) : ∃ offsets:ι → Fin M, ∀ F:(ι → ℤ) → ℝ, (∀ j,F j ∈ Set.Icc 0 1) → ∃ G:(ι → ℝ) → ℝ,LipschitzWith (M:ℝ≥0) G ∧ (∀ z,G z ∈ Set.Icc 0 1) ∧ (∀ z ∈ VectorGridGood 1 (1 / (2 * M)) (fun i => (offsets i).val / (M:ℝ)), G z = F (vectorCellIndex 1 (fun i => (offsets i).val / (M:ℝ)) z)) ∧ (∑ x,(G (samples x) - F (vectorCellIndex 1 (fun i => (offsets i).val / (M:ℝ)) (samples x))) ^ 2) ≤ (Fintype.card ι:ℝ) * Fintype.card α / M:=by classical obtain ⟨offsets,hoff⟩:=exists_coordinate_offsets_fraction_bound hM samples refine ⟨offsets, ?_⟩ intro F hF have hMR:(0:ℝ) < M:=Nat.cast_pos.mpr hM have hδ:(0:ℝ) < 1 / (2 * M):=by positivity obtain ⟨G,hG,hGrange,hGeq⟩:=exists_vector_grid_smoothing 1 (1 / (2 * M)) (fun i => (offsets i).val / (M:ℝ)) (by norm_num) hδ F hF have hK:(⟨1 / (2 * (1 / (2 * M))),by positivity⟩:ℝ≥0) = (M:ℝ≥0):=by apply NNReal.eq change (1:ℝ) / (2 * (1 / (2 * M))) = M field_simp rw [hK] at hG refine ⟨G,hG,hGrange,hGeq, ?_⟩ apply le_trans ?_ hoff apply sq_error_sum_le_bad (badCoordinateSamples offsets samples) · exact fun x => hGrange (samples x) · exact fun x => hF _ · intro x hx exact hGeq (samples x) (sample_good_of_not_bad hM offsets samples x hx) end Green24Proof.FiniteGridSmoothingSamples private def zz2422:"s0976"="s0976":=by decide+kernel end section namespace Green24Proof.CyclicSmoothedCharacterFactor open Finset open scoped BigOperators NNReal open Green24Proof.FinitePartitionAverage open Green24Proof.FiniteScalarQuantization (resolution) open Green24Proof.CyclicWeakRegularity (stepBound FourierUniform) open Green24Proof.CyclicShiftedCharacterFactor open Green24Proof.GridLipschitzSmoothing open Green24Proof.FiniteGridBoundaryAvoidance open Green24Proof.FiniteGridSmoothingSamples variable {q M:ℕ} [NeZero q] noncomputable def characterSamples {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (x:ZMod q):Fin n → ℝ := fun i => characterCoordinate η (ks i) (bs i) x noncomputable def encodedCell {n:ℕ} (η:ℝ) (j:Fin n → ℤ):Alphabet η n := fun i => Green24Proof.ShiftedScalarQuantization.encodeCell (resolution η) (j i) theorem phaseFactor_eq_encoded_grid {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (x:ZMod q) : phaseFactor η ks bs as x = encodedCell η (vectorCellIndex 1 (fun i => offset (as i)) (characterSamples η ks bs x)):=by funext i exact Green24Proof.ShiftedScalarQuantization.quantize_eq_encodeCell (resolution η) (offset (as i)) (Green24Proof.CyclicCharacterFactor.characterTest (ks i) (bs i) x) theorem exists_smoothing_of_boundaryControlled {n:ℕ} {η:ℝ} (hM:0 < M) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (hc:BoundaryControlled η ks bs as) (F:Alphabet η n → ℝ) (hF:∀ a,F a ∈ Set.Icc 0 1) : ∃ G:(Fin n → ℝ) → ℝ,LipschitzWith (M:ℝ≥0) G ∧ (∀ z,G z ∈ Set.Icc 0 1) ∧ (∀ z ∈ VectorGridGood 1 (1 / (2 * M)) (fun i => offset (as i)), G z = F (encodedCell η (vectorCellIndex 1 (fun i => offset (as i)) z))) ∧ (∑ x,(G (characterSamples η ks bs x) - F (phaseFactor η ks bs as x)) ^ 2) ≤ (n:ℝ) * q / M:=by classical have hMR:(0:ℝ) < M:=Nat.cast_pos.mpr hM have hδ:(0:ℝ) < 1 / (2 * M):=by positivity obtain ⟨G,hG,hGrange,hGeq⟩:=exists_vector_grid_smoothing 1 (1 / (2 * M)) (fun i => offset (as i)) (by norm_num) hδ (fun j => F (encodedCell η j)) (fun j => hF _) have hK:(⟨1 / (2 * (1 / (2 * M))),by positivity⟩:ℝ≥0) = (M:ℝ≥0):=by apply NNReal.eq change (1:ℝ) / (2 * (1 / (2 * M))) = M field_simp rw [hK] at hG refine ⟨G,hG,hGrange,hGeq, ?_⟩ have hbad:((badCoordinateSamples as (characterSamples η ks bs)).card:ℝ) ≤ (n:ℝ) * q / M:=by apply (le_div_iff₀ hMR).mpr have hb:=boundary_union_card_bound hc have hbR:(M:ℝ) * (badCoordinateSamples as (characterSamples η ks bs)).card ≤ (n:ℝ) * q:=by exact_mod_cast hb simpa only [mul_comm] using hbR apply le_trans ?_ hbad apply sq_error_sum_le_bad (badCoordinateSamples as (characterSamples η ks bs)) · exact fun x => hGrange _ · exact fun x => hF _ · intro x hx rw [phaseFactor_eq_encoded_grid] exact hGeq _ (sample_good_of_not_bad hM as (characterSamples η ks bs) x hx) theorem exists_smoothed_character_factor (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (F:Alphabet η n → ℝ) (G:(Fin n → ℝ) → ℝ), Fintype.card (Alphabet η n) ≤ (2 * resolution η + 2) ^ stepBound η ∧ BoundaryControlled η ks bs as ∧ (∀ a,F a ∈ Set.Icc 0 1) ∧ LipschitzWith (M:ℝ≥0) G ∧ (∀ z,G z ∈ Set.Icc 0 1) ∧ (∀ x,average (phaseFactor η ks bs as) f x = F (phaseFactor η ks bs as x)) ∧ (∑ x,F (phaseFactor η ks bs as x)) = (∑ x,f x) ∧ (∀ k, ‖ZMod.dft (fun x => ((f x - F (phaseFactor η ks bs as x):ℝ):ℂ)) k‖ ≤ η * q) ∧ (∑ x,(G (characterSamples η ks bs x) - F (phaseFactor η ks bs as x)) ^ 2) ≤ (n:ℝ) * q / M:=by obtain ⟨n,hn,ks,bs,as,F,hcard,hc,_hb,hF,havg,hmass,hu⟩ := exists_character_factor_approximation f hf hη hM obtain ⟨G,hG,hGrange,_hGeq,herr⟩:=exists_smoothing_of_boundaryControlled hM ks bs as hc F hF exact ⟨n,hn,ks,bs,as,F,G,hcard,hc,hF,hG,hGrange,havg,hmass,hu,herr⟩ end Green24Proof.CyclicSmoothedCharacterFactor private def zz2423:"s0977"="s0977":=by decide+kernel end section namespace Green24Proof.CyclicTorusSmoothing open Finset open scoped BigOperators NNReal open Green24Proof.FiniteScalarQuantization (resolution) open Green24Proof.CyclicWeakRegularity (stepBound) open Green24Proof.CyclicShiftedCharacterFactor open Green24Proof.CyclicSmoothedCharacterFactor open Green24Proof.FinitePartitionAverage noncomputable def component (b:Bool) (z:Circle):ℝ := if b then (z:ℂ).im else (z:ℂ).re private def zz1831:"s0727"="s0727":=by decide+kernel theorem component_dist_le (b:Bool) (z w:Circle) : dist (component b z) (component b w) ≤ dist z w:=by cases b · change dist (z:ℂ).re (w:ℂ).re ≤ dist (z:ℂ) (w:ℂ) simpa only [Real.dist_eq,Complex.dist_eq,Complex.sub_re] using Complex.abs_re_le_norm ((z:ℂ) - (w:ℂ)) · change dist (z:ℂ).im (w:ℂ).im ≤ dist (z:ℂ) (w:ℂ) simpa only [Real.dist_eq,Complex.dist_eq,Complex.sub_im] using Complex.abs_im_le_norm ((z:ℂ) - (w:ℂ)) noncomputable def torusCoordinates {n:ℕ} (η:ℝ) (bs:Fin n → Bool) (z:Fin n → Circle):Fin n → ℝ := fun i => Green24Proof.ShiftedScalarQuantization.coordinate (resolution η) (component (bs i) (z i)) theorem torusCoordinates_lipschitz {n:ℕ} (η:ℝ) (bs:Fin n → Bool) : LipschitzWith (resolution η:ℝ≥0) (torusCoordinates η bs):=by apply LipschitzWith.of_dist_le_mul intro z w apply (dist_pi_le_iff (mul_nonneg (by positivity) dist_nonneg)).mpr intro i have hc:=(component_dist_le (bs i) (z i) (w i)).trans (dist_le_pi_dist z w i) change |(resolution η:ℝ) * (component (bs i) (z i) + 1) + 1 - ((resolution η:ℝ) * (component (bs i) (w i) + 1) + 1)| ≤ _ rw [show (resolution η:ℝ) * (component (bs i) (z i) + 1) + 1 - ((resolution η:ℝ) * (component (bs i) (w i) + 1) + 1) = (resolution η:ℝ) * (component (bs i) (z i) - component (bs i) (w i)) by ring, abs_mul,abs_of_nonneg (Nat.cast_nonneg _)] exact mul_le_mul_of_nonneg_left hc (Nat.cast_nonneg _) variable {q M:ℕ} [NeZero q] noncomputable def characterOrbit {n:ℕ} (ks:Fin n → ZMod q) (x:ZMod q):Fin n → Circle:=fun i => ZMod.toCircle (-(x * ks i)) theorem characterOrbit_add {n:ℕ} (ks:Fin n → ZMod q) (x y:ZMod q) : characterOrbit ks (x + y) = characterOrbit ks x * characterOrbit ks y:=by funext i change ZMod.toCircle (-((x + y) * ks i)) = ZMod.toCircle (-(x * ks i)) * ZMod.toCircle (-(y * ks i)) rw [add_mul,neg_add_rev,AddChar.map_add_eq_mul,mul_comm] theorem characterOrbit_zero {n:ℕ} (ks:Fin n → ZMod q) : characterOrbit ks 0 = 1:=by funext i simp [characterOrbit] private def zz1832:"s0728"="s0728":=by decide+kernel theorem characterOrbit_intCast {n:ℕ} (ks:Fin n → ZMod q) (a:ℤ) : characterOrbit ks (a:ZMod q) = characterOrbit ks 1 ^ a:=by funext i change ZMod.toCircle (-((a:ZMod q) * ks i)) = ZMod.toCircle (-(1 * ks i)) ^ a rw [one_mul, ← mul_neg, ← zsmul_eq_mul,AddChar.map_zsmul_eq_zpow] theorem torusCoordinates_characterOrbit {n:ℕ} (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (x:ZMod q) : torusCoordinates η bs (characterOrbit ks x) = characterSamples η ks bs x:=by funext i rfl theorem exists_torus_smoothed_character_factor (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (F:Alphabet η n → ℝ) (H:(Fin n → Circle) → ℝ), Fintype.card (Alphabet η n) ≤ (2 * resolution η + 2) ^ stepBound η ∧ BoundaryControlled η ks bs as ∧ (∀ a,F a ∈ Set.Icc 0 1) ∧ LipschitzWith ((M:ℝ≥0) * resolution η) H ∧ (∀ z,H z ∈ Set.Icc 0 1) ∧ (∀ x,average (phaseFactor η ks bs as) f x = F (phaseFactor η ks bs as x)) ∧ (∑ x,F (phaseFactor η ks bs as x)) = (∑ x,f x) ∧ (∀ k, ‖ZMod.dft (fun x => ((f x - F (phaseFactor η ks bs as x):ℝ):ℂ)) k‖ ≤ η * q) ∧ (∑ x,(H (characterOrbit ks x) - F (phaseFactor η ks bs as x)) ^ 2) ≤ (n:ℝ) * q / M:=by obtain ⟨n,hn,ks,bs,as,F,G,hcard,hc,hF,hG,hGrange,havg,hmass,hu,herr⟩ := exists_smoothed_character_factor f hf hη hM refine ⟨n,hn,ks,bs,as,F,G ∘ torusCoordinates η bs,hcard,hc,hF, hG.comp (torusCoordinates_lipschitz η bs),fun z => hGrange _,havg,hmass,hu, ?_⟩ simpa only [Function.comp_apply,torusCoordinates_characterOrbit] using herr end Green24Proof.CyclicTorusSmoothing private def zz2424:"s0978"="s0978":=by decide+kernel end section namespace Green24Proof.ModularRectification open scoped Pointwise theorem exists_common_good_difference {G:Type*} [AddCommGroup G] [DecidableEq G] (A S:Finset G) (hsmall:2 * ((A - A) \ S).card < A.card) {a b:G} (ha:a ∈ A) (hb:b ∈ A) : ∃ c ∈ A,c - a ∈ S ∧ c - b ∈ S:=by classical have hbad (x:G) (hx:x ∈ A) : (A.filter (fun c => c - x ∉ S)).card ≤ ((A - A) \ S).card:=by calc _ = ((A.filter (fun c => c - x ∉ S)).image (fun c => c - x)).card := (Finset.card_image_of_injective _ (fun _ _ he => sub_left_inj.mp he)).symm _ ≤ _:=Finset.card_le_card (by intro y hy obtain ⟨c,hc,rfl⟩:=Finset.mem_image.mp hy obtain ⟨hcA,hcS⟩:=Finset.mem_filter.mp hc exact Finset.mem_sdiff.mpr ⟨Finset.sub_mem_sub hcA hx,hcS⟩) by_contra h have hcover:A ⊆ A.filter (fun c => c - a ∉ S) ∪ A.filter (fun c => c - b ∉ S):=by intro c hc by_cases hca:c - a ∈ S · have hcb:c - b ∉ S:=fun hcb => h ⟨c,hc,hca,hcb⟩ exact Finset.mem_union_right _ (Finset.mem_filter.mpr ⟨hc,hcb⟩) · exact Finset.mem_union_left _ (Finset.mem_filter.mpr ⟨hc,hca⟩) have hcard:=(Finset.card_le_card hcover).trans (Finset.card_union_le _ _) have hba:=hbad a ha have hbb:=hbad b hb omega private def zz1833:"s0729"="s0729":=by decide+kernel theorem sub_subset_sub_of_few_exceptions {G:Type*} [AddCommGroup G] [DecidableEq G] (A S:Finset G) (hsmall:2 * ((A - A) \ S).card < A.card) : A - A ⊆ S - S:=by intro x hx obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_sub.mp hx obtain ⟨c,_,hca,hcb⟩:=exists_common_good_difference A S hsmall ha hb convert Finset.sub_mem_sub hcb hca using 1 abel noncomputable def arc (q:ℕ) (b:ZMod q) (L:ℤ):Finset (ZMod q) := (Finset.Icc 0 L).image (fun t:ℤ => b + (t:ZMod q)) theorem difference_has_small_representative {q:ℕ} (A:Finset (ZMod q)) (b:ZMod q) (L:ℤ) (hsmall:2 * ((A - A) \ arc q b L).card < A.card) {x y:ZMod q} (hx:x ∈ A) (hy:y ∈ A) : ∃ t:ℤ, -L ≤ t ∧ t ≤ L ∧ (t:ZMod q) = x - y:=by have h:=sub_subset_sub_of_few_exceptions A (arc q b L) hsmall (Finset.sub_mem_sub hx hy) obtain ⟨u,hu,v,hv,he⟩:=Finset.mem_sub.mp h obtain ⟨i,hi,rfl⟩:=Finset.mem_image.mp hu obtain ⟨j,hj,rfl⟩:=Finset.mem_image.mp hv obtain ⟨hi0,hiL⟩:=Finset.mem_Icc.mp hi obtain ⟨hj0,hjL⟩:=Finset.mem_Icc.mp hj refine ⟨i - j,by omega,by omega, ?_⟩ push_cast linear_combination he theorem int_eq_of_cast_eq_of_abs_sub_lt {q:ℕ} {a b:ℤ} (hcast:(a:ZMod q) = (b:ZMod q)) (hbound:|a - b| < (q:ℤ)):a = b:=by have hd:(q:ℤ) ∣ a - b := (ZMod.intCast_zmod_eq_zero_iff_dvd (a - b) q).mp (by simpa using sub_eq_zero.mpr hcast) exact sub_eq_zero.mp (Int.eq_zero_of_abs_lt_dvd hd hbound) theorem freiman_three_of_short_lift {q:ℕ} (A:Finset (ZMod q)) (f:ZMod q → ℤ) (a:ZMod q) (L:ℤ) (hL:3 * L < (q:ℤ)) (hf:∀ x ∈ A,0 ≤ f x ∧ f x ≤ L ∧ (f x:ZMod q) = x - a) : IsAddFreimanIso 3 (A:Set (ZMod q)) (A.image f:Set ℤ) f:=by classical have hinj:Set.InjOn f (A:Set (ZMod q)):=by intro x hx y hy he have hc:=congrArg (fun z:ℤ => (z:ZMod q)) he rw [(hf x hx).2.2,(hf y hy).2.2] at hc exact sub_left_inj.mp hc refine ⟨by simpa only [Finset.coe_image] using hinj.bijOn_image, ?_⟩ intro s t hsA htA hs ht have hsum (u:Multiset (ZMod q)) (huA:∀ x ∈ u,x ∈ A) (hu:u.card = 3) : (((u.map f).sum:ℤ):ZMod q) = u.sum - 3 • a:=by rw [Int.cast_multiset_sum,Multiset.map_map] calc _ = (u.map (fun x => x - a)).sum:=by congr 1 exact Multiset.map_congr rfl (fun x hx => (hf x (huA x hx)).2.2) _ = _:=by simp [Multiset.sum_map_sub,hu,nsmul_eq_mul] ring have hbound (u:Multiset (ZMod q)) (huA:∀ x ∈ u,x ∈ A) (hu:u.card = 3) : 0 ≤ (u.map f).sum ∧ (u.map f).sum ≤ 3 * L:=by constructor · exact Multiset.sum_nonneg (by intro z hz obtain ⟨x,hx,rfl⟩:=Multiset.mem_map.mp hz exact (hf x (huA x hx)).1) · have h:=Multiset.sum_le_card_nsmul (u.map f) L (by intro z hz obtain ⟨x,hx,rfl⟩:=Multiset.mem_map.mp hz exact (hf x (huA x hx)).2.1) simpa [hu] using h constructor · intro he have hc:=congrArg (fun z:ℤ => (z:ZMod q)) he rw [hsum s (fun _ hx => hsA hx) hs,hsum t (fun _ hx => htA hx) ht] at hc exact sub_left_inj.mp hc · intro he apply int_eq_of_cast_eq_of_abs_sub_lt · rw [hsum s (fun _ hx => hsA hx) hs,hsum t (fun _ hx => htA hx) ht,he] · have hb1:=hbound s (fun _ hx => hsA hx) hs have hb2:=hbound t (fun _ hx => htA hx) ht exact abs_lt.mpr (by omega) private def zz1834:"s072a"="s072a":=by decide+kernel theorem exists_freiman_three_model_of_few_arc_exceptions {q:ℕ} (A:Finset (ZMod q)) (b:ZMod q) (L:ℤ) (hLq:3 * L < (q:ℤ)) (hsmall:2 * ((A - A) \ arc q b L).card < A.card) : ∃ (B:Finset ℤ) (f:ZMod q → ℤ), B ⊆ Finset.Icc 0 L ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set (ZMod q)) (B:Set ℤ) f ∧ ∃ a:ZMod q, ∀ x ∈ A,(f x:ZMod q) = x - a:=by classical have hA:A.Nonempty:=Finset.card_pos.mp (by omega) obtain ⟨a₀,ha₀⟩:=hA have hex:∀ x:ZMod q, ∃ t:ℤ, x ∈ A → -L ≤ t ∧ t ≤ L ∧ (t:ZMod q) = x - a₀:=by intro x by_cases hx:x ∈ A · obtain ⟨t,ht⟩:=difference_has_small_representative A b L hsmall hx ha₀ exact ⟨t,fun _ => ht⟩ · exact ⟨0,fun hx' => False.elim (hx hx')⟩ choose f hf using hex have hspan (x:ZMod q) (hx:x ∈ A) (y:ZMod q) (hy:y ∈ A) : -L ≤ f x - f y ∧ f x - f y ≤ L:=by obtain ⟨t,ht0,htL,htc⟩:=difference_has_small_representative A b L hsmall hx hy have he:f x - f y = t:=by apply int_eq_of_cast_eq_of_abs_sub_lt · push_cast rw [(hf x hx).2.2,(hf y hy).2.2,htc] abel · have hfx:=hf x hx have hfy:=hf y hy exact abs_lt.mpr (by omega) simpa [he] using And.intro ht0 htL obtain ⟨a,ha,hmin⟩:=A.exists_min_image f ⟨a₀,ha₀⟩ let g:ZMod q → ℤ:=fun x => f x - f a have hg:∀ x ∈ A,0 ≤ g x ∧ g x ≤ L ∧ (g x:ZMod q) = x - a:=by intro x hx refine ⟨sub_nonneg.mpr (hmin x hx),(hspan x hx a ha).2, ?_⟩ change ((f x - f a:ℤ):ZMod q) = x - a push_cast rw [(hf x hx).2.2,(hf a ha).2.2] abel have hiso:=freiman_three_of_short_lift A g a L hLq hg refine ⟨A.image g,g, ?_, ?_,hiso,a,fun x hx => (hg x hx).2.2⟩ · intro z hz obtain ⟨x,hx,rfl⟩:=Finset.mem_image.mp hz exact Finset.mem_Icc.mpr ⟨(hg x hx).1,(hg x hx).2.1⟩ · exact Finset.card_image_of_injOn hiso.bijOn.injOn theorem exists_arc_cover_of_few_arc_exceptions {q:ℕ} (A:Finset (ZMod q)) (b:ZMod q) (L:ℤ) (hLq:3 * L < (q:ℤ)) (hsmall:2 * ((A - A) \ arc q b L).card < A.card) : ∃ a:ZMod q,A ⊆ arc q a L:=by obtain ⟨B,f,hB,_,hiso,a,hcast⟩ := exists_freiman_three_model_of_few_arc_exceptions A b L hLq hsmall refine ⟨a,fun x hx => ?_⟩ apply Finset.mem_image.mpr refine ⟨f x,hB (hiso.bijOn.mapsTo hx), ?_⟩ rw [hcast x hx] abel end Green24Proof.ModularRectification private def zz2425:"s0979"="s0979":=by decide+kernel end section namespace Green24Proof.FourierArcConcentration open scoped BigOperators Pointwise open Green24Proof.ModularRectification open Green24Proof.CyclicFourierCounting variable {q:ℕ} [NeZero q] theorem re_stdAddChar (x:ZMod q) : (ZMod.stdAddChar x).re = Real.cos (2 * Real.pi * (x.val:ℝ) / q):=by rw [ZMod.stdAddChar_apply,ZMod.toCircle_apply] have he:2 * (Real.pi:ℂ) * Complex.I * (x.val:ℂ) / q = ((2 * Real.pi * (x.val:ℝ) / q:ℝ):ℂ) * Complex.I:=by push_cast ring rw [he,Complex.exp_ofReal_mul_I_re] theorem character_defect_nonneg (x:ZMod q) : 0 ≤ 1 - (ZMod.stdAddChar x).re:=by rw [re_stdAddChar] exact sub_nonneg.mpr (Real.cos_le_one _) private def zz1835:"s072b"="s072b":=by decide+kernel theorem sum_character_defect (B:Finset (ZMod q)) : (∑ b ∈ B, ∑ x ∈ B,(1 - (ZMod.stdAddChar (x - b)).re)) = (B.card:ℝ) ^ 2 - ‖∑ x ∈ B,ZMod.stdAddChar x‖ ^ 2:=by have hchar (x b:ZMod q) : ZMod.stdAddChar (x - b) = ZMod.stdAddChar x * (starRingEnd ℂ) (ZMod.stdAddChar b):=by rw [sub_eq_add_neg,AddChar.map_add_eq_mul,conj_stdAddChar] simp_rw [hchar,Finset.sum_sub_distrib] simp only [Finset.sum_const,nsmul_eq_mul] simp_rw [← Complex.re_sum] congr 1 · ring calc (∑ b ∈ B, ∑ x ∈ B, ZMod.stdAddChar x * (starRingEnd ℂ) (ZMod.stdAddChar b)).re = ((∑ x ∈ B,ZMod.stdAddChar x) * (starRingEnd ℂ) (∑ x ∈ B,ZMod.stdAddChar x)).re:=by congr 1 simp only [map_sum,Finset.sum_mul,Finset.mul_sum] _ = _:=by rw [Complex.mul_conj,Complex.ofReal_re,Complex.normSq_eq_norm_sq] theorem mem_centered_arc_of_val {b x:ZMod q} {R:ℤ} (hR:0 ≤ R) (hval:((x - b).val:ℤ) ≤ R ∨ (q:ℤ) - R ≤ ((x - b).val:ℤ)) : x ∈ arc q (b - (R:ZMod q)) (2 * R):=by have hv0:0 ≤ ((x - b).val:ℤ):=by positivity have hvq:((x - b).val:ℤ) < q:=by exact_mod_cast (ZMod.val_lt (x - b)) rcases hval with hval | hval · apply Finset.mem_image.mpr refine ⟨((x - b).val:ℤ) + R,Finset.mem_Icc.mpr ⟨by omega,by omega⟩, ?_⟩ push_cast rw [ZMod.natCast_zmod_val] abel · apply Finset.mem_image.mpr refine ⟨((x - b).val:ℤ) - q + R, Finset.mem_Icc.mpr ⟨by omega,by omega⟩, ?_⟩ push_cast rw [ZMod.natCast_zmod_val] simp theorem cos_le_cos_of_circular_separation {θ t:ℝ} (hθ:0 ≤ θ) (hlo:θ ≤ t) (hhi:t ≤ 2 * Real.pi - θ) : Real.cos t ≤ Real.cos θ:=by by_cases ht:t ≤ Real.pi · exact Real.cos_le_cos_of_nonneg_of_le_pi hθ ht hlo · rw [← Real.cos_two_pi_sub t] exact Real.cos_le_cos_of_nonneg_of_le_pi hθ (by linarith) (by linarith) theorem character_defect_ge_of_not_mem_arc {b x:ZMod q} {R:ℤ} (hR:0 ≤ R) (hx:x ∉ arc q (b - (R:ZMod q)) (2 * R)) : 1 - Real.cos (2 * Real.pi * (R:ℝ) / q) ≤ 1 - (ZMod.stdAddChar (x - b)).re:=by have hq:(0:ℝ) < q:=by exact_mod_cast (NeZero.pos q) have hv:R < ((x - b).val:ℤ) ∧ ((x - b).val:ℤ) < (q:ℤ) - R:=by by_contra hv push Not at hv apply hx apply mem_centered_arc_of_val hR omega have hRr:(0:ℝ) ≤ R:=by exact_mod_cast hR have hlo:(R:ℝ) ≤ (x - b).val:=by exact_mod_cast hv.1.le have hhi:((x - b).val:ℝ) ≤ (q:ℝ) - R:=by exact_mod_cast hv.2.le rw [re_stdAddChar] apply sub_le_sub_left apply cos_le_cos_of_circular_separation (by positivity) · gcongr · calc 2 * Real.pi * ((x - b).val:ℝ) / q ≤ 2 * Real.pi * ((q:ℝ) - R) / q:=by gcongr _ = 2 * Real.pi - 2 * Real.pi * (R:ℝ) / q:=by field_simp private def zz1836:"s072c"="s072c":=by decide+kernel theorem boundary_defect_pos {R:ℤ} (hR:0 < R) (hRq:2 * R ≤ (q:ℤ)) : 0 < 1 - Real.cos (2 * Real.pi * (R:ℝ) / q):=by have hq:(0:ℝ) < q:=by exact_mod_cast (NeZero.pos q) have hRr:(0:ℝ) < R:=by exact_mod_cast hR have hRqr:2 * (R:ℝ) ≤ q:=by exact_mod_cast hRq have hθ0:0 < 2 * Real.pi * (R:ℝ) / q:=by positivity have hθπ:2 * Real.pi * (R:ℝ) / q ≤ Real.pi:=by apply (div_le_iff₀ hq).mpr nlinarith [Real.pi_pos] have hc:=Real.cos_lt_cos_of_nonneg_of_le_pi (show (0:ℝ) ≤ 0 by rfl) hθπ hθ0 simpa using sub_pos.mpr hc theorem arc_exception_bound (B:Finset (ZMod q)) (b:ZMod q) {R:ℤ} (hR:0 ≤ R) : ((B \ arc q (b - (R:ZMod q)) (2 * R)).card:ℝ) * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q)) ≤ ∑ x ∈ B,(1 - (ZMod.stdAddChar (x - b)).re):=by calc _ = ∑ x ∈ B \ arc q (b - (R:ZMod q)) (2 * R), (1 - Real.cos (2 * Real.pi * (R:ℝ) / q)):=by simp ring _ ≤ ∑ x ∈ B \ arc q (b - (R:ZMod q)) (2 * R), (1 - (ZMod.stdAddChar (x - b)).re):=by apply Finset.sum_le_sum intro x hx exact character_defect_ge_of_not_mem_arc hR (Finset.mem_sdiff.mp hx).2 _ ≤ _:=Finset.sum_le_sum_of_subset_of_nonneg Finset.sdiff_subset (fun x _ _ => character_defect_nonneg (x - b)) theorem exists_arc_few_exceptions (B:Finset (ZMod q)) {R:ℤ} (hR:0 < R) (hRq:2 * R ≤ (q:ℤ)) (δ:ℝ) (hlarge:(B.card:ℝ) ^ 2 - ‖∑ x ∈ B,ZMod.stdAddChar x‖ ^ 2 < δ * B.card * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q))) : ∃ b ∈ B,((B \ arc q (b - (R:ZMod q)) (2 * R)).card:ℝ) < δ:=by have hc:=boundary_defect_pos hR hRq have hsum:(∑ b ∈ B, ∑ x ∈ B,(1 - (ZMod.stdAddChar (x - b)).re)) < ∑ _b ∈ B,δ * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q)):=by rw [sum_character_defect] simpa [mul_assoc,mul_comm,mul_left_comm] using hlarge obtain ⟨b,hb,hdefect⟩:=Finset.exists_lt_of_sum_lt hsum refine ⟨b,hb, ?_⟩ have hbound:=arc_exception_bound B b hR.le nlinarith theorem exists_freiman_three_model_of_large_difference_character (A:Finset (ZMod q)) {R:ℤ} (hR:0 < R) (hRq:6 * R < (q:ℤ)) (hlarge:((A - A).card:ℝ) ^ 2 - ‖∑ x ∈ A - A,ZMod.stdAddChar x‖ ^ 2 < (A.card:ℝ) / 2 * (A - A).card * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q))) : ∃ (B:Finset ℤ) (f:ZMod q → ℤ), B ⊆ Finset.Icc 0 (2 * R) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set (ZMod q)) (B:Set ℤ) f ∧ ∃ a:ZMod q, ∀ x ∈ A,(f x:ZMod q) = x - a:=by obtain ⟨b,_,hb⟩:=exists_arc_few_exceptions (A - A) hR (by omega) ((A.card:ℝ) / 2) hlarge have hn:(2:ℝ) * (((A - A) \ arc q (b - (R:ZMod q)) (2 * R)).card:ℝ) < (A.card:ℝ):=by linarith have hsmall:2 * ((A - A) \ arc q (b - (R:ZMod q)) (2 * R)).card < A.card:=by exact_mod_cast hn exact exists_freiman_three_model_of_few_arc_exceptions A (b - (R:ZMod q)) (2 * R) (by omega) hsmall private def zz1837:"s072d"="s072d":=by decide+kernel omit [NeZero q] in theorem freimanIso_dilate (A:Finset (ZMod q)) (r:ZMod q) (hr:IsUnit r) (k:ℕ) : IsAddFreimanIso k (A:Set (ZMod q)) (A.image (fun x => r * x):Set (ZMod q)) (fun x => r * x) where bijOn:=by simpa only [Finset.coe_image] using hr.mul_right_injective.bijOn_image (s:=(A:Set (ZMod q))) map_sum_eq_map_sum s t _ _ _ _:=by have hsum (u:Multiset (ZMod q)):(u.map (fun x => r * x)).sum = r * u.sum:=by simpa using (Multiset.sum_map_mul_left (s:=u) (a:=r) (f:=id)) rw [hsum,hsum] exact hr.mul_right_inj omit [NeZero q] in theorem image_dilate_sub (A:Finset (ZMod q)) (r:ZMod q) : A.image (fun x => r * x) - A.image (fun x => r * x) = (A - A).image (fun x => r * x):=by ext x constructor · intro hx obtain ⟨y,hy,z,hz,rfl⟩:=Finset.mem_sub.mp hx obtain ⟨a,ha,rfl⟩:=Finset.mem_image.mp hy obtain ⟨b,hb,rfl⟩:=Finset.mem_image.mp hz exact Finset.mem_image.mpr ⟨a - b,Finset.sub_mem_sub ha hb,mul_sub r a b⟩ · intro hx obtain ⟨y,hy,rfl⟩:=Finset.mem_image.mp hx obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_sub.mp hy exact Finset.mem_sub.mpr ⟨r * a,Finset.mem_image.mpr ⟨a,ha,rfl⟩, r * b,Finset.mem_image.mpr ⟨b,hb,rfl⟩,(mul_sub r a b).symm⟩ theorem exists_freiman_three_model_of_large_character (A:Finset (ZMod q)) (r:ZMod q) (hr:IsUnit r) {R:ℤ} (hR:0 < R) (hRq:6 * R < (q:ℤ)) (hlarge:((A - A).card:ℝ) ^ 2 - ‖∑ x ∈ A - A,ZMod.stdAddChar (r * x)‖ ^ 2 < (A.card:ℝ) / 2 * (A - A).card * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q))) : ∃ (B:Finset ℤ) (f:ZMod q → ℤ), B ⊆ Finset.Icc 0 (2 * R) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set (ZMod q)) (B:Set ℤ) f ∧ ∃ a:ZMod q, ∀ x ∈ A,(f x:ZMod q) = r * x - a:=by let A':=A.image (fun x => r * x) have hcard:A'.card = A.card:=Finset.card_image_of_injective _ hr.mul_right_injective have hdiff:A' - A' = (A - A).image (fun x => r * x):=image_dilate_sub A r have hdiffcard:(A' - A').card = (A - A).card:=by rw [hdiff] exact Finset.card_image_of_injective _ hr.mul_right_injective have hsum:(∑ x ∈ A' - A',ZMod.stdAddChar x) = ∑ x ∈ A - A,ZMod.stdAddChar (r * x):=by rw [hdiff] exact Finset.sum_image (fun _ _ _ _ he => hr.mul_right_injective he) have hlarge':((A' - A').card:ℝ) ^ 2 - ‖∑ x ∈ A' - A',ZMod.stdAddChar x‖ ^ 2 < (A'.card:ℝ) / 2 * (A' - A').card * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q)):=by simpa only [hcard,hdiffcard,hsum] using hlarge obtain ⟨B,f,hB,hBA',hf,a,hcast⟩ := exists_freiman_three_model_of_large_difference_character A' hR hRq hlarge' refine ⟨B,fun x => f (r * x),hB,hBA'.trans hcard, hf.comp (freimanIso_dilate A r hr 3),a, ?_⟩ intro x hx exact hcast (r * x) (Finset.mem_image.mpr ⟨x,hx,rfl⟩) theorem exists_freiman_three_model_of_large_nonzero_character [Fact q.Prime] (A:Finset (ZMod q)) (r:ZMod q) (hr:r ≠ 0) {R:ℤ} (hR:0 < R) (hRq:6 * R < (q:ℤ)) (hlarge:((A - A).card:ℝ) ^ 2 - ‖∑ x ∈ A - A,ZMod.stdAddChar (r * x)‖ ^ 2 < (A.card:ℝ) / 2 * (A - A).card * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q))) : ∃ (B:Finset ℤ) (f:ZMod q → ℤ), B ⊆ Finset.Icc 0 (2 * R) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set (ZMod q)) (B:Set ℤ) f ∧ ∃ a:ZMod q, ∀ x ∈ A,(f x:ZMod q) = r * x - a := exists_freiman_three_model_of_large_character A r (isUnit_iff_ne_zero.mpr hr) hR hRq hlarge end Green24Proof.FourierArcConcentration private def zz2426:"s097a"="s097a":=by decide+kernel end section namespace Green24Proof.CyclicFourierMoments open scoped BigOperators Pointwise open Green24Proof.CyclicFourierCounting variable {q:ℕ} [NeZero q] noncomputable def coefficient (B:Finset (ZMod q)) (r:ZMod q):ℂ := ∑ x ∈ B,ZMod.stdAddChar (-(x * r)) def tupleSum (B:Finset (ZMod q)) (k:ℕ) (v:Fin k → B):ZMod q := ∑ i,(v i:ZMod q) def iteratedSumset (B:Finset (ZMod q)) (k:ℕ):Finset (ZMod q) := Finset.univ.image (tupleSum B k) def representations (B:Finset (ZMod q)) (k:ℕ) (x:ZMod q):ℕ := (Finset.univ.filter (fun v:Fin k → B => tupleSum B k v = x)).card private def zz1838:"s072e"="s072e":=by decide+kernel omit [NeZero q] in theorem iteratedSumset_eq_nsmul (B:Finset (ZMod q)) (k:ℕ) : iteratedSumset B k = k • B:=by ext x simp [iteratedSumset,tupleSum,Finset.mem_nsmul,List.sum_ofFn] omit [NeZero q] in theorem representations_cast (B:Finset (ZMod q)) (k:ℕ) (x:ZMod q) : (representations B k x:ℂ) = ∑ v:Fin k → B,if tupleSum B k v = x then (1:ℂ) else 0:=by simp [representations] omit [NeZero q] in theorem representations_zero_off_sumset (B:Finset (ZMod q)) (k:ℕ) {x:ZMod q} (hx:x ∉ iteratedSumset B k):representations B k x = 0:=by apply Finset.card_eq_zero.mpr apply Finset.filter_eq_empty_iff.mpr intro v _ hv exact hx (Finset.mem_image.mpr ⟨v,Finset.mem_univ _,hv⟩) omit [NeZero q] in theorem sum_representations (B:Finset (ZMod q)) (k:ℕ) : (∑ x ∈ iteratedSumset B k,representations B k x) = B.card ^ k:=by have h:=Finset.card_eq_sum_card_fiberwise (s:=(Finset.univ:Finset (Fin k → B))) (t:=iteratedSumset B k) (f:=tupleSum B k) (fun v hv => Finset.mem_image.mpr ⟨v,hv,rfl⟩) simpa [representations] using h.symm private def zz1839:"s072f"="s072f":=by decide+kernel theorem stdAddChar_sum {ι:Type*} (s:Finset ι) (f:ι → ZMod q) : ZMod.stdAddChar (∑ i ∈ s,f i) = ∏ i ∈ s,ZMod.stdAddChar (f i):=by classical induction s using Finset.induction_on with | empty => simp | @insert i s hi ih => simp [Finset.sum_insert,Finset.prod_insert,hi, AddChar.map_add_eq_mul,ih] theorem dft_representations (B:Finset (ZMod q)) (k:ℕ) (r:ZMod q) : ZMod.dft (fun x => (representations B k x:ℂ)) r = coefficient B r ^ k:=by rw [ZMod.dft_apply] simp only [representations_cast,smul_eq_mul,Finset.mul_sum,mul_ite,mul_one,mul_zero] rw [Finset.sum_comm] simp only [Finset.sum_ite_eq,Finset.mem_univ,if_true] have hchar (v:Fin k → B) : ZMod.stdAddChar (-(tupleSum B k v * r)) = ∏ i,ZMod.stdAddChar (-((v i:ZMod q) * r)):=by rw [tupleSum,Finset.sum_mul, ← Finset.sum_neg_distrib,stdAddChar_sum] simp_rw [hchar] rw [← Fintype.sum_pow (fun x:B => ZMod.stdAddChar (-((x:ZMod q) * r))) k] congr 1 exact Finset.sum_coe_sort B (fun x => ZMod.stdAddChar (-(x * r))) theorem coefficient_zero (B:Finset (ZMod q)):coefficient B 0 = B.card:=by simp [coefficient] theorem moment_identity (B:Finset (ZMod q)) (k:ℕ) : (∑ r:ZMod q, ‖coefficient B r‖ ^ (2 * k)) = (q:ℝ) * ∑ x:ZMod q,(representations B k x:ℝ) ^ 2:=by have h:=parseval (fun x => (representations B k x:ℂ)) simp only [dft_representations,norm_pow,Complex.norm_natCast, ← pow_mul] at h simpa only [Nat.mul_comm k 2] using h private def zz1840:"s0730"="s0730":=by decide+kernel theorem sumset_moment_lower_bound (B:Finset (ZMod q)) (k:ℕ) : (q:ℝ) * (B.card:ℝ) ^ (2 * k) ≤ ((iteratedSumset B k).card:ℝ) * ∑ r:ZMod q, ‖coefficient B r‖ ^ (2 * k):=by have hcs:=Finset.sum_mul_sq_le_sq_mul_sq (iteratedSumset B k) (fun _:ZMod q => (1:ℝ)) (fun x => (representations B k x:ℝ)) have hmass:(∑ x ∈ iteratedSumset B k,(representations B k x:ℝ)) = (B.card:ℝ) ^ k:=by exact_mod_cast sum_representations B k simp only [one_mul,one_pow,Finset.sum_const,nsmul_eq_mul,mul_one,hmass] at hcs have henergy:(∑ x ∈ iteratedSumset B k,(representations B k x:ℝ) ^ 2) = ∑ x:ZMod q,(representations B k x:ℝ) ^ 2:=by apply Finset.sum_subset (Finset.subset_univ _) intro x _ hx simp [representations_zero_off_sumset B k hx] rw [henergy] at hcs rw [moment_identity] have h:=mul_le_mul_of_nonneg_left hcs (show (0:ℝ) ≤ q by positivity) simpa [← pow_mul,mul_assoc,mul_left_comm,mul_comm] using h theorem dft_indicator (B:Finset (ZMod q)) (r:ZMod q) : ZMod.dft (fun x => if x ∈ B then (1:ℂ) else 0) r = coefficient B r:=by simp [ZMod.dft_apply,smul_eq_mul,coefficient] theorem second_moment (B:Finset (ZMod q)) : (∑ r:ZMod q, ‖coefficient B r‖ ^ 2) = (q:ℝ) * B.card:=by have h:=parseval (fun x:ZMod q => if x ∈ B then (1:ℂ) else 0) simp only [dft_indicator] at h simp_rw [apply_ite (fun z:ℂ => ‖z‖ ^ 2)] at h simpa using h theorem second_moment_nonzero (B:Finset (ZMod q)) : (∑ r ∈ Finset.univ.erase (0:ZMod q), ‖coefficient B r‖ ^ 2) = (q:ℝ) * B.card - (B.card:ℝ) ^ 2:=by have h:=Finset.sum_erase_add (s:=Finset.univ) (f:=fun r:ZMod q => ‖coefficient B r‖ ^ 2) (Finset.mem_univ (0:ZMod q)) rw [coefficient_zero,Complex.norm_natCast,second_moment] at h linarith private def zz1841:"s0731"="s0731":=by decide+kernel theorem moment_upper_of_nonzero_bound (B:Finset (ZMod q)) (m:ℕ) {M:ℝ} (hcoeff:∀ r:ZMod q,r ≠ 0 → ‖coefficient B r‖ ≤ M) : (∑ r:ZMod q, ‖coefficient B r‖ ^ (2 * (m + 1))) ≤ (B.card:ℝ) ^ (2 * (m + 1)) + M ^ (2 * m) * ((q:ℝ) * B.card - (B.card:ℝ) ^ 2):=by have hsplit:=Finset.sum_erase_add (s:=Finset.univ) (f:=fun r:ZMod q => ‖coefficient B r‖ ^ (2 * (m + 1))) (Finset.mem_univ (0:ZMod q)) rw [coefficient_zero,Complex.norm_natCast] at hsplit rw [← hsplit,add_comm] apply add_le_add_right rw [← second_moment_nonzero,Finset.mul_sum] apply Finset.sum_le_sum intro r hr rw [show 2 * (m + 1) = 2 * m + 2 by omega,pow_add] have hb:=hcoeff r (Finset.ne_of_mem_erase hr) gcongr theorem exists_large_nonzero_coefficient (B:Finset (ZMod q)) (m:ℕ) {M:ℝ} (hgrowth:((iteratedSumset B (m + 1)).card:ℝ) * ((B.card:ℝ) ^ (2 * (m + 1)) + M ^ (2 * m) * ((q:ℝ) * B.card - (B.card:ℝ) ^ 2)) < (q:ℝ) * (B.card:ℝ) ^ (2 * (m + 1))) : ∃ r:ZMod q,r ≠ 0 ∧ M < ‖coefficient B r‖:=by by_contra h have hcoeff:∀ r:ZMod q,r ≠ 0 → ‖coefficient B r‖ ≤ M:=by intro r hr exact le_of_not_gt (fun hc => h ⟨r,hr,hc⟩) have hlower:=sumset_moment_lower_bound B (m + 1) have hupper:=mul_le_mul_of_nonneg_left (moment_upper_of_nonzero_bound B m hcoeff) (show (0:ℝ) ≤ (iteratedSumset B (m + 1)).card by positivity) linarith theorem coefficient_eq_positive (B:Finset (ZMod q)) (r:ZMod q) : coefficient B r = ∑ x ∈ B,ZMod.stdAddChar ((-r) * x):=by apply Finset.sum_congr rfl intro x _ congr 1 ring theorem exists_freiman_three_model_of_moment_growth [Fact q.Prime] (A:Finset (ZMod q)) (m:ℕ) {M:ℝ} (hM:0 ≤ M) {R:ℤ} (hR:0 < R) (hRq:6 * R < (q:ℤ)) (hgrowth:((iteratedSumset (A - A) (m + 1)).card:ℝ) * (((A - A).card:ℝ) ^ (2 * (m + 1)) + M ^ (2 * m) * ((q:ℝ) * (A - A).card - ((A - A).card:ℝ) ^ 2)) < (q:ℝ) * ((A - A).card:ℝ) ^ (2 * (m + 1))) (hbudget:((A - A).card:ℝ) ^ 2 - M ^ 2 ≤ (A.card:ℝ) / 2 * (A - A).card * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q))) : ∃ (B:Finset ℤ) (f:ZMod q → ℤ), B ⊆ Finset.Icc 0 (2 * R) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set (ZMod q)) (B:Set ℤ) f:=by obtain ⟨r,hr,hcoeff⟩:=exists_large_nonzero_coefficient (A - A) m hgrowth have hlarge:((A - A).card:ℝ) ^ 2 - ‖∑ x ∈ A - A,ZMod.stdAddChar ((-r) * x)‖ ^ 2 < (A.card:ℝ) / 2 * (A - A).card * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q)):=by rw [coefficient_eq_positive] at hcoeff nlinarith [norm_nonneg (∑ x ∈ A - A,ZMod.stdAddChar ((-r) * x))] obtain ⟨B,f,hB,hcard,hf,_⟩ := Green24Proof.FourierArcConcentration.exists_freiman_three_model_of_large_nonzero_character A (-r) (neg_ne_zero.mpr hr) hR hRq hlarge exact ⟨B,f,hB,hcard,hf⟩ end Green24Proof.CyclicFourierMoments private def zz2427:"s097b"="s097b":=by decide+kernel end section namespace Green24Proof.CyclicTorusLaurent open Finset open scoped BigOperators variable {ι:Type*} [Fintype ι] noncomputable def monomial (m:ι → ℤ) (z:ι → Circle):ℂ := ∏ i,(z i:ℂ) ^ m i private def zz1842:"s0732"="s0732":=by decide+kernel theorem monomial_zero (z:ι → Circle):monomial (0:ι → ℤ) z = 1:=by simp [monomial] theorem monomial_mul (m:ι → ℤ) (z w:ι → Circle) : monomial m (z * w) = monomial m z * monomial m w:=by simp only [monomial,Pi.mul_apply,Circle.coe_mul,mul_zpow,Finset.prod_mul_distrib] variable {q:ℕ} [NeZero q] noncomputable def weightedFrequency (ks:ι → ZMod q) (m:ι → ℤ):ZMod q := ∑ i,(m i:ZMod q) * ks i omit [NeZero q] in theorem weightedFrequency_zero (ks:ι → ZMod q):weightedFrequency ks 0 = 0:=by simp [weightedFrequency] theorem monomial_character_values (ks:ι → ZMod q) (m:ι → ℤ) (x:ZMod q) : monomial m (fun i => ZMod.toCircle (-(x * ks i))) = ZMod.stdAddChar (-(x * weightedFrequency ks m)):=by change (∏ i,ZMod.stdAddChar (-(x * ks i)) ^ m i) = _ rw [weightedFrequency,Finset.mul_sum, ← Finset.sum_neg_distrib, Green24Proof.CyclicFourierMoments.stdAddChar_sum] apply Finset.prod_congr rfl intro i _ rw [← AddChar.map_zsmul_eq_zpow,zsmul_eq_mul] congr 1 ring private def zz1843:"s0733"="s0733":=by decide+kernel theorem monomial_characterOrbit {n:ℕ} (ks:Fin n → ZMod q) (m:Fin n → ℤ) (x:ZMod q) : monomial m (Green24Proof.CyclicTorusSmoothing.characterOrbit ks x) = ZMod.stdAddChar (-(x * weightedFrequency ks m)) := monomial_character_values ks m x theorem sum_monomial_character_values (ks:ι → ZMod q) (m:ι → ℤ) : (∑ x:ZMod q,monomial m (fun i => ZMod.toCircle (-(x * ks i)))) = if weightedFrequency ks m = 0 then (q:ℂ) else 0:=by classical simp_rw [monomial_character_values] by_cases hw:weightedFrequency ks m = 0 · simp [hw,ZMod.card] · rw [if_neg hw] have h:(∑ x:ZMod q,ZMod.stdAddChar ((-weightedFrequency ks m) * x)) = 0 := AddChar.sum_eq_zero_of_ne_one (ZMod.isPrimitive_stdAddChar q (neg_ne_zero.mpr hw)) simpa only [neg_mul,mul_neg,mul_comm] using h noncomputable def polynomial (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (z:ι → Circle):ℂ:=∑ m ∈ S,c m * monomial m z noncomputable def resonantCoefficient (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ):ℂ:=∑ m ∈ S,if weightedFrequency ks m = 0 then c m else 0 noncomputable def constantCoefficient (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ):ℂ := ∑ m ∈ S,if m = 0 then c m else 0 def Nonresonant (ks:ι → ZMod q) (S:Finset (ι → ℤ)):Prop := ∀ m ∈ S,m ≠ 0 → weightedFrequency ks m ≠ 0 theorem sum_polynomial_character_values (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) : (∑ x:ZMod q,polynomial S c (fun i => ZMod.toCircle (-(x * ks i)))) = (q:ℂ) * resonantCoefficient ks S c:=by classical simp only [polynomial] rw [Finset.sum_comm] simp only [← Finset.mul_sum,sum_monomial_character_values] unfold resonantCoefficient rw [Finset.mul_sum] apply Finset.sum_congr rfl intro m _ split_ifs <;> ring omit [NeZero q] in theorem resonantCoefficient_eq_constant (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (hn:Nonresonant ks S) : resonantCoefficient ks S c = constantCoefficient S c:=by classical apply Finset.sum_congr rfl intro m hm by_cases hzero:m = 0 · simp [hzero,weightedFrequency_zero] · simp [hzero,hn m hm hzero] noncomputable def orbitMean (ks:ι → ZMod q) (F:(ι → Circle) → ℂ):ℂ := (q:ℂ)⁻¹ * ∑ x:ZMod q,F (fun i => ZMod.toCircle (-(x * ks i))) private def zz1844:"s0734"="s0734":=by decide+kernel theorem orbitMean_polynomial (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) : orbitMean ks (polynomial S c) = resonantCoefficient ks S c:=by rw [orbitMean,sum_polynomial_character_values, ← mul_assoc, inv_mul_cancel₀ (by exact_mod_cast NeZero.ne q),one_mul] theorem orbitMean_polynomial_of_nonresonant (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (hn:Nonresonant ks S) : orbitMean ks (polynomial S c) = constantCoefficient S c:=by rw [orbitMean_polynomial,resonantCoefficient_eq_constant ks S c hn] omit [Fintype ι] in theorem orbitMean_error_le (ks:ι → ZMod q) (F P:(ι → Circle) → ℂ) {ε:ℝ} (herr:∀ z, ‖F z - P z‖ ≤ ε) : ‖orbitMean ks F - orbitMean ks P‖ ≤ ε:=by have hq:(0:ℝ) < q:=Nat.cast_pos.mpr (NeZero.pos q) have hs:‖∑ x:ZMod q,(F (fun i => ZMod.toCircle (-(x * ks i))) - P (fun i => ZMod.toCircle (-(x * ks i))))‖ ≤ (q:ℝ) * ε:=by calc _ ≤ ∑ x:ZMod q, ‖F (fun i => ZMod.toCircle (-(x * ks i))) - P (fun i => ZMod.toCircle (-(x * ks i)))‖:=norm_sum_le _ _ _ ≤ ∑ _x:ZMod q,ε:=Finset.sum_le_sum (fun _ _ => herr _) _ = _:=by simp [ZMod.card] rw [orbitMean,orbitMean, ← mul_sub, ← Finset.sum_sub_distrib,norm_mul, norm_inv,Complex.norm_natCast] calc (q:ℝ)⁻¹ * _ ≤ (q:ℝ)⁻¹ * ((q:ℝ) * ε) := mul_le_mul_of_nonneg_left hs (inv_nonneg.mpr hq.le) _ = ε:=by field_simp theorem orbitMean_discrepancy_from_constant (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (F:(ι → Circle) → ℂ) (hn:Nonresonant ks S) {ε:ℝ} (herr:∀ z, ‖F z - polynomial S c z‖ ≤ ε) : ‖orbitMean ks F - constantCoefficient S c‖ ≤ ε:=by rw [← orbitMean_polynomial_of_nonresonant ks S c hn] exact orbitMean_error_le ks F (polynomial S c) herr end Green24Proof.CyclicTorusLaurent private def zz2428:"s097c"="s097c":=by decide+kernel end section namespace Green24Proof.CyclicTorusHaarDiscrepancy open Finset MeasureTheory TopologicalSpace open scoped BigOperators open Green24Proof.CyclicTorusLaurent noncomputable def circleMeasurableSpace:MeasurableSpace Circle:=borel Circle def circleBorelSpace:@BorelSpace Circle inferInstance circleMeasurableSpace:=by letI:=circleMeasurableSpace exact ⟨rfl⟩ variable [MeasurableSpace Circle] [BorelSpace Circle] variable (ι:Type*) [Fintype ι] noncomputable def torusHaar:Measure (ι → Circle) := Measure.haarMeasure (⟨⟨Set.univ,isCompact_univ⟩,by simp⟩:PositiveCompacts (ι → Circle)) private def zz1845:"s0735"="s0735":=by decide+kernel theorem torusHaar_isProbabilityMeasure:IsProbabilityMeasure (torusHaar ι):=by constructor exact Measure.haarMeasure_self theorem torusHaar_isHaarMeasure:Measure.IsHaarMeasure (torusHaar ι):=by unfold torusHaar infer_instance variable {ι} theorem monomial_continuous (m:ι → ℤ):Continuous (monomial m):=by change Continuous (fun z:ι → Circle => ∏ i,((z i ^ m i:Circle):ℂ)) fun_prop (disch:=simp) theorem monomial_integrable (m:ι → ℤ):Integrable (monomial m) (torusHaar ι):=by letI:=torusHaar_isHaarMeasure ι exact (monomial_continuous m).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) private def zz1846:"s0736"="s0736":=by decide+kernel theorem monomial_single [DecidableEq ι] (m:ι → ℤ) (i:ι) (w:Circle) : monomial m (fun j => if j = i then w else 1) = (w:ℂ) ^ m i:=by unfold monomial rw [Finset.prod_eq_single i] · simp · intro j _ hji simp [hji] · simp theorem exists_monomial_ne_one {m:ι → ℤ} (hm:m ≠ 0) : ∃ z:ι → Circle,monomial m z ≠ 1:=by classical obtain ⟨i,hi⟩:=Function.ne_iff.mp hm change m i ≠ 0 at hi have hiR:(m i:ℝ) ≠ 0:=by exact_mod_cast hi let w:Circle:=Circle.exp (Real.pi / m i) have hw:w ^ m i = Circle.exp Real.pi:=by dsimp [w] rw [← Circle.exp_intCast_mul] congr 1 field_simp refine ⟨fun j => if j = i then w else 1, ?_⟩ rw [monomial_single, ← Circle.coe_zpow,hw] norm_num [Circle.coe_exp,Complex.exp_pi_mul_I] theorem integral_monomial (m:ι → ℤ) : (∫ z,monomial m z ∂torusHaar ι) = if m = 0 then 1 else 0:=by letI:=torusHaar_isProbabilityMeasure ι letI:=torusHaar_isHaarMeasure ι classical by_cases hm:m = 0 · simp [hm,monomial_zero] · rw [if_neg hm] obtain ⟨w,hw⟩:=exists_monomial_ne_one hm have htrans:=integral_mul_left_eq_self (μ:=torusHaar ι) (monomial m) w simp_rw [monomial_mul] at htrans rw [integral_const_mul] at htrans have hz:(monomial m w - 1) * (∫ z,monomial m z ∂torusHaar ι) = 0:=by linear_combination htrans exact (mul_eq_zero.mp hz).resolve_left (sub_ne_zero.mpr hw) theorem polynomial_integrable (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) : Integrable (polynomial S c) (torusHaar ι):=by apply integrable_finsetSum intro m _ exact (monomial_integrable m).const_mul (c m) private def zz1847:"s0737"="s0737":=by decide+kernel theorem integral_polynomial (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) : (∫ z,polynomial S c z ∂torusHaar ι) = constantCoefficient S c:=by classical change (∫ z, ∑ m ∈ S,c m * monomial m z ∂torusHaar ι) = _ rw [integral_finsetSum] · simp only [integral_const_mul,integral_monomial,mul_ite,mul_one,mul_zero, constantCoefficient] · intro m _ exact (monomial_integrable m).const_mul (c m) variable {q:ℕ} [NeZero q] theorem orbitMean_polynomial_eq_haar_integral (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (hn:Nonresonant ks S) : orbitMean ks (polynomial S c) = ∫ z,polynomial S c z ∂torusHaar ι:=by rw [orbitMean_polynomial_of_nonresonant ks S c hn,integral_polynomial] theorem orbitMean_haar_discrepancy_le (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (F:(ι → Circle) → ℂ) (hF:Integrable F (torusHaar ι)) (hn:Nonresonant ks S) {ε:ℝ} (herr:∀ z, ‖F z - polynomial S c z‖ ≤ ε) : ‖orbitMean ks F - ∫ z,F z ∂torusHaar ι‖ ≤ 2 * ε:=by letI:=torusHaar_isProbabilityMeasure ι have ho:=orbitMean_error_le ks F (polynomial S c) herr have hi:‖(∫ z,F z ∂torusHaar ι) - ∫ z,polynomial S c z ∂torusHaar ι‖ ≤ ε:=by rw [← integral_sub hF (polynomial_integrable S c)] simpa only [probReal_univ,mul_one] using norm_integral_le_of_norm_le_const (μ:=torusHaar ι) (Filter.Eventually.of_forall herr) have he:=orbitMean_polynomial_eq_haar_integral ks S c hn calc ‖orbitMean ks F - ∫ z,F z ∂torusHaar ι‖ = ‖(orbitMean ks F - orbitMean ks (polynomial S c)) + ((∫ z,polynomial S c z ∂torusHaar ι) - ∫ z,F z ∂torusHaar ι)‖:=by rw [← he,sub_add_sub_cancel] _ ≤ ‖orbitMean ks F - orbitMean ks (polynomial S c)‖ + ‖(∫ z,polynomial S c z ∂torusHaar ι) - ∫ z,F z ∂torusHaar ι‖:=norm_add_le _ _ _ ≤ ε + ε:=add_le_add ho (by simpa only [norm_sub_rev] using hi) _ = 2 * ε:=by ring theorem orbitMean_haar_discrepancy_of_continuous (ks:ι → ZMod q) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (F:(ι → Circle) → ℂ) (hF:Continuous F) (hn:Nonresonant ks S) {ε:ℝ} (herr:∀ z, ‖F z - polynomial S c z‖ ≤ ε) : ‖orbitMean ks F - ∫ z,F z ∂torusHaar ι‖ ≤ 2 * ε:=by letI:=torusHaar_isHaarMeasure ι exact orbitMean_haar_discrepancy_le ks S c F (hF.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _)) hn herr end Green24Proof.CyclicTorusHaarDiscrepancy private def zz2429:"s097d"="s097d":=by decide+kernel end section namespace Green24Proof.RealTorusDilation open MeasureTheory Set open Green24Proof.CyclicTorusHaarDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] abbrev Space (ι:Type*):=ℝ × (ι → Circle) noncomputable def measure (ι:Type*) [Fintype ι]:Measure (Space ι) := volume.prod (torusHaar ι) private def zz1848:"s0738"="s0738":=by decide+kernel theorem measure_sigmaFinite:SigmaFinite (measure ι):=by letI:=torusHaar_isProbabilityMeasure ι unfold measure infer_instance theorem measure_isLocallyFinite:IsLocallyFiniteMeasure (measure ι):=by letI:=torusHaar_isHaarMeasure ι unfold measure infer_instance omit [Fintype ι] in theorem power_surjective {n:ℕ} (hn:n ≠ 0) : Function.Surjective (fun z:ι → Circle => z ^ n):=by intro z have hn':(n:ℤ) ≠ 0:=by exact_mod_cast hn have hz:Function.Surjective (fun u:Circle => u ^ (n:ℤ)):=by intro y obtain ⟨t,rfl⟩:=Circle.exp_surjective y refine ⟨Circle.exp (t / n), ?_⟩ change Circle.exp (t / n) ^ (n:ℤ) = Circle.exp t rw [← Circle.exp_intCast_mul] congr 1 have hnR:(n:ℝ) ≠ 0:=by exact_mod_cast hn push_cast field_simp choose u hu using fun i => hz (z i) refine ⟨u, ?_⟩ funext i simpa only [Pi.pow_apply,zpow_natCast] using hu i theorem power_measurePreserving {n:ℕ} (hn:n ≠ 0) : MeasurePreserving (fun z:ι → Circle => z ^ n) (torusHaar ι) (torusHaar ι):=by letI:=torusHaar_isProbabilityMeasure ι letI:=torusHaar_isHaarMeasure ι exact MonoidHom.measurePreserving (f:=powMonoidHom (α:=ι → Circle) n) (show Continuous (fun z:ι → Circle => z ^ n) by fun_prop) (power_surjective hn) (by simp) noncomputable def dilationMap (a:ℝ) (n:ℕ) (v:Space ι):Space ι:=(v.1 / a,v.2 ^ n) private def zz1849:"s0739"="s0739":=by decide+kernel omit [Fintype ι] in theorem dilationMap_continuous (a:ℝ) (n:ℕ) : Continuous (dilationMap (ι:=ι) a n):=by unfold dilationMap fun_prop omit [Fintype ι] in theorem dilationMap_isProper {a:ℝ} (ha:a ≠ 0) (n:ℕ) : IsProperMap (dilationMap (ι:=ι) a n):=by have hreal:IsProperMap (fun t:ℝ => t / a):=by simpa only [Homeomorph.coe_mulRight₀,div_eq_mul_inv] using (Homeomorph.mulRight₀ a⁻¹ (inv_ne_zero ha)).isProperMap have htorus:IsProperMap (fun z:ι → Circle => z ^ n) := (by fun_prop:Continuous (fun z:ι → Circle => z ^ n)).isProperMap exact hreal.prodMap htorus theorem map_dilationMap {a:ℝ} (ha:a ≠ 0) {n:ℕ} (hn:n ≠ 0) : Measure.map (dilationMap (ι:=ι) a n) (measure ι) = ENNReal.ofReal |a| • measure ι:=by letI:=torusHaar_isProbabilityMeasure ι have hreal:Measure.map (fun t:ℝ => t / a) volume = ENNReal.ofReal |a| • volume:=by simpa only [div_eq_mul_inv,inv_inv] using Real.map_volume_mul_right (inv_ne_zero ha) change Measure.map (Prod.map (fun t:ℝ => t / a) (fun z:ι → Circle => z ^ n)) (volume.prod (torusHaar ι)) = _ rw [← Measure.map_prod_map _ _ (by fun_prop) (by fun_prop),hreal, (power_measurePreserving (ι:=ι) hn).map_eq,Measure.prod_smul_left] rfl noncomputable def pullback (a:ℝ) (n:ℕ) (F:Space ι → ℝ):Space ι → ℝ := F ∘ dilationMap a n omit [Fintype ι] in theorem pullback_continuous (a:ℝ) (n:ℕ) (F:Space ι → ℝ) (hF:Continuous F) : Continuous (pullback a n F):=hF.comp (dilationMap_continuous a n) private def zz1850:"s073a"="s073a":=by decide+kernel omit [Fintype ι] in theorem pullback_range (a:ℝ) (n:ℕ) (F:Space ι → ℝ) (hF:∀ z,F z ∈ Icc 0 1) (z:Space ι):pullback a n F z ∈ Icc 0 1:=hF _ omit [Fintype ι] in theorem pullback_compactSupport {a:ℝ} (ha:a ≠ 0) (n:ℕ) (F:Space ι → ℝ) (hF:HasCompactSupport F):HasCompactSupport (pullback a n F):=by apply HasCompactSupport.intro ((dilationMap_isProper (ι:=ι) ha n).isCompact_preimage hF) intro v hv change F (dilationMap a n v) = 0 exact image_eq_zero_of_notMem_tsupport hv theorem integral_pullback {a:ℝ} (ha:a ≠ 0) {n:ℕ} (hn:n ≠ 0) (F:Space ι → ℝ) (hF:Continuous F) : (∫ v,pullback a n F v ∂measure ι) = |a| * ∫ v,F v ∂measure ι:=by have h:=integral_map (μ:=measure ι) (dilationMap_continuous (ι:=ι) a n).measurable.aemeasurable hF.aestronglyMeasurable rw [map_dilationMap ha hn,integral_smul_measure,ENNReal.toReal_ofReal (abs_nonneg a), smul_eq_mul] at h exact h.symm theorem map_pair_dilation {a b:ℝ} (ha:a ≠ 0) (hb:b ≠ 0) {n m:ℕ} (hn:n ≠ 0) (hm:m ≠ 0) : Measure.map (Prod.map (dilationMap (ι:=ι) a n) (dilationMap b m)) ((measure ι).prod (measure ι)) = ENNReal.ofReal (|a| * |b|) • ((measure ι).prod (measure ι)):=by letI:=measure_sigmaFinite (ι:=ι) rw [← Measure.map_prod_map _ _ (dilationMap_continuous a n).measurable (dilationMap_continuous b m).measurable,map_dilationMap ha hn,map_dilationMap hb hm, Measure.prod_smul_left,Measure.prod_smul_right,smul_smul, ← ENNReal.ofReal_mul (abs_nonneg a)] private def zz1851:"s073b"="s073b":=by decide+kernel theorem integral_pair_dilation {a b:ℝ} (ha:a ≠ 0) (hb:b ≠ 0) {n m:ℕ} (hn:n ≠ 0) (hm:m ≠ 0) (K:Space ι × Space ι → ℝ) (hK:Continuous K) : (∫ yz,K (dilationMap a n yz.1,dilationMap b m yz.2) ∂(measure ι).prod (measure ι)) = (|a| * |b|) * ∫ yz,K yz ∂(measure ι).prod (measure ι):=by have h:=integral_map (μ:=(measure ι).prod (measure ι)) ((dilationMap_continuous a n).prodMap (dilationMap_continuous b m)).measurable.aemeasurable hK.aestronglyMeasurable rw [map_pair_dilation ha hb hn hm,integral_smul_measure, ENNReal.toReal_ofReal (mul_nonneg (abs_nonneg a) (abs_nonneg b)),smul_eq_mul] at h exact h.symm end Green24Proof.RealTorusDilation private def zz2430:"s097e"="s097e":=by decide+kernel end section namespace Green24Proof.CircleProbabilityHaar open MeasureTheory Set TopologicalSpace open Green24Proof.CyclicTorusHaarDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] noncomputable def circleHaar:Measure Circle := Measure.haarMeasure (⟨⟨Set.univ,isCompact_univ⟩,by simp⟩:PositiveCompacts Circle) theorem circleHaar_isProbabilityMeasure:IsProbabilityMeasure circleHaar := ⟨Measure.haarMeasure_self⟩ theorem circleHaar_isHaarMeasure:Measure.IsHaarMeasure circleHaar:=by unfold circleHaar infer_instance def one_pos:Fact (0 < (1:ℝ)):=⟨by norm_num⟩ section UnitCircle variable [Fact (0 < (1:ℝ))] theorem addCircleOne_probability:IsProbabilityMeasure (volume:Measure (AddCircle (1:ℝ))) := ⟨by simp⟩ private def zz1852:"s073c"="s073c":=by decide+kernel theorem map_toCircle_volume : Measure.map (@AddCircle.toCircle 1) (volume:Measure (AddCircle (1:ℝ))) = circleHaar:=by letI:=addCircleOne_probability letI:=circleHaar_isProbabilityMeasure letI:=circleHaar_isHaarMeasure let f:=@AddCircle.toCircle 1 have hf:Continuous f:=AddCircle.continuous_toCircle have hs:Function.Surjective f:=by intro z obtain ⟨x,hx⟩:=(AddCircle.homeomorphCircle (T:=1) one_ne_zero).surjective z exact ⟨x,by simpa only [f,AddCircle.homeomorphCircle_apply] using hx⟩ let μ:=Measure.map f (volume:Measure (AddCircle (1:ℝ))) have:IsProbabilityMeasure μ:=Measure.isProbabilityMeasure_map hf.measurable.aemeasurable have:Measure.IsMulLeftInvariant μ:=by constructor intro z obtain ⟨a,rfl⟩:=hs z change Measure.map (f a * ·) (Measure.map f volume) = Measure.map f volume rw [Measure.map_map (measurable_const_mul _) hf.measurable] have heq:(fun z => f a * z) ∘ f = f ∘ (a + ·):=by funext b exact (AddCircle.toCircle_add a b).symm rw [heq, ← Measure.map_map hf.measurable (measurable_const_add _), Measure.IsAddLeftInvariant.map_add_left_eq_self] have:Measure.IsHaarMeasure μ := Measure.isHaarMeasure_of_isCompact_nonempty_interior μ univ isCompact_univ (by simp) (by simp) (by simp) exact Measure.isHaarMeasure_eq_of_isProbabilityMeasure μ circleHaar end UnitCircle theorem measurePreserving_unit_exp (a:ℝ) : MeasurePreserving (fun x:ℝ => Circle.exp (2 * Real.pi * x)) (volume.restrict (Ioc a (a + 1))) circleHaar:=by letI:=one_pos letI:=addCircleOne_probability have hp:MeasurePreserving (@AddCircle.toCircle 1) (volume:Measure (AddCircle (1:ℝ))) circleHaar := ⟨AddCircle.continuous_toCircle.measurable,map_toCircle_volume⟩ have h:=hp.comp (AddCircle.measurePreserving_mk 1 a) simpa only [Function.comp_def,AddCircle.toCircle_apply_mk,div_one] using h theorem integral_unit_exp (F:Circle → ℝ) (hF:Continuous F) (a:ℝ) : (∫ z,F z ∂circleHaar) = ∫ x in a..a + 1,F (Circle.exp (2 * Real.pi * x)):=by have hp:=measurePreserving_unit_exp a have h:=integral_map (μ:=volume.restrict (Ioc a (a + 1))) hp.measurable.aemeasurable hF.aestronglyMeasurable rw [hp.map_eq] at h rw [intervalIntegral.integral_of_le (by linarith)] exact h theorem integral_exp (F:Circle → ℝ) (hF:Continuous F) (a:ℝ) : (∫ z,F z ∂circleHaar) = (2 * Real.pi)⁻¹ * ∫ t in a..a + 2 * Real.pi,F (Circle.exp t):=by have hpi:(2:ℝ) * Real.pi ≠ 0:=by positivity rw [integral_unit_exp F hF (a / (2 * Real.pi)), intervalIntegral.integral_comp_mul_left (fun t => F (Circle.exp t)) hpi] have h0:2 * Real.pi * (a / (2 * Real.pi)) = a:=by field_simp have h1:2 * Real.pi * (a / (2 * Real.pi) + 1) = a + 2 * Real.pi:=by rw [mul_add,h0,mul_one] rw [h0,h1,smul_eq_mul] end Green24Proof.CircleProbabilityHaar private def zz2431:"s097f"="s097f":=by decide+kernel end section namespace Green24Proof.PolicyHaarTorusMarginal open MeasureTheory Set open Green24Proof.CyclicTorusHaarDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] variable {X:Type*} [TopologicalSpace X] [FirstCountableTopology X] [LocallyCompactSpace X] private def zz1853:"s073d"="s073d":=by decide+kernel theorem torus_marginal_continuous {ι:Type*} [Fintype ι] (K:X × (ι → Circle) → ℝ) (hK:Continuous K) : Continuous (fun x => ∫ u,K (x,u) ∂torusHaar ι):=by letI:=torusHaar_isProbabilityMeasure ι have h:=continuous_parametric_integral_of_continuous (μ:=torusHaar ι) (f:=fun x u => K (x,u)) hK (s:=Set.univ) isCompact_univ simpa only [Measure.restrict_univ] using h end Green24Proof.PolicyHaarTorusMarginal private def zz2432:"s0980"="s0980":=by decide+kernel end section namespace Green24Proof.CompactCircleLift open MeasureTheory Set open Green24Proof.RealTorusDilation Green24Proof.CircleProbabilityHaar open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.PolicyHaarTorusMarginal variable {ι:Type*} theorem two_pi_pos:Fact (0 < 2 * Real.pi):=⟨by positivity⟩ def SmallSupport (F:Space ι → ℝ):Prop := ∀ (t:ℝ) (u:ι → Circle),Real.pi / 4 ≤ |t| → F (t,u) = 0 noncomputable def circleLift (F:Space ι → ℝ) (zu:Circle × (ι → Circle)):ℝ := letI:=two_pi_pos AddCircle.liftIoc (2 * Real.pi) (-Real.pi) (fun t => F (t,zu.2)) (AddCircle.homeomorphCircle'.symm zu.1) theorem circleLift_exp (F:Space ι → ℝ) {t:ℝ} (ht:t ∈ Ioc (-Real.pi) Real.pi) (u:ι → Circle) : circleLift F (Circle.exp t,u) = F (t,u):=by letI:=two_pi_pos unfold circleLift rw [← AddCircle.homeomorphCircle'_apply_mk, AddCircle.homeomorphCircle'.symm_apply_apply] apply AddCircle.liftIoc_coe_apply constructor · exact ht.1 · linarith [ht.2] theorem circleLift_eq_arg (F:Space ι → ℝ) (z:Circle) (u:ι → Circle) : circleLift F (z,u) = F (Complex.arg (z:ℂ),u):=by have h:=circleLift_exp F (t:=Complex.arg (z:ℂ)) ⟨Complex.neg_pi_lt_arg _,Complex.arg_le_pi _⟩ u simpa only [Circle.exp_arg] using h private def zz1854:"s073e"="s073e":=by decide+kernel theorem circleLift_range (F:Space ι → ℝ) (hF:∀ v,F v ∈ Icc 0 1) (zu:Circle × (ι → Circle)):circleLift F zu ∈ Icc 0 1:=by rw [show zu = (zu.1,zu.2) from rfl,circleLift_eq_arg] exact hF _ theorem circleLift_zero_outside (F:Space ι → ℝ) (hs:SmallSupport F) (z:Circle) (u:ι → Circle) (hz:Real.pi / 4 ≤ |Complex.arg (z:ℂ)|) : circleLift F (z,u) = 0:=by rw [circleLift_eq_arg] exact hs _ _ hz theorem smallSupport_compactSupport (F:Space ι → ℝ) (hs:SmallSupport F) : HasCompactSupport F:=by apply HasCompactSupport.intro (isCompact_Icc.prod (isCompact_univ:IsCompact (univ:Set (ι → Circle)))) intro v hv apply hs have hv':v.1 ∉ Icc (-Real.pi / 4) (Real.pi / 4):=by simpa using hv by_contra h have ha:|v.1| < Real.pi / 4:=lt_of_not_ge h exact hv' ⟨by linarith [(abs_lt.mp ha).1],(abs_lt.mp ha).2.le⟩ theorem circleLift_continuous (F:Space ι → ℝ) (hF:Continuous F) (hs:SmallSupport F):Continuous (circleLift F):=by letI:=two_pi_pos let Fc:C(ℝ × (ι → Circle),ℝ):=⟨F,hF⟩ let fc:C(ℝ,C(ι → Circle,ℝ)):=Fc.curry have he:fc (-Real.pi) = fc (-Real.pi + 2 * Real.pi):=by ext u change F (-Real.pi,u) = F (-Real.pi + 2 * Real.pi,u) rw [hs _ _ (by rw [abs_neg,abs_of_pos Real.pi_pos]; linarith [Real.pi_pos]), hs _ _ (by rw [show -Real.pi + 2 * Real.pi = Real.pi by ring, abs_of_pos Real.pi_pos]; linarith [Real.pi_pos])] let L:C(AddCircle (2 * Real.pi),C(ι → Circle,ℝ)) := ⟨AddCircle.liftIoc (2 * Real.pi) (-Real.pi) fc, AddCircle.liftIoc_continuous he fc.continuous.continuousOn⟩ let LC:C(Circle,C(ι → Circle,ℝ)) := L.comp ⟨AddCircle.homeomorphCircle'.symm, AddCircle.homeomorphCircle'.symm.continuous⟩ exact LC.uncurry.continuous private def zz1855:"s073f"="s073f":=by decide+kernel theorem difference_product_exp (F G H:Space ι → ℝ) (hsG:SmallSupport G) (hsH:SmallSupport H) {s t:ℝ} (hs:s ∈ Ioc (-Real.pi) Real.pi) (ht:t ∈ Ioc (-Real.pi) Real.pi) (u v:ι → Circle) : circleLift F (Circle.exp t / Circle.exp s,v / u) * circleLift G (Circle.exp s,u) * circleLift H (Circle.exp t,v) = F (t - s,v / u) * G (s,u) * H (t,v):=by rw [circleLift_exp G hs,circleLift_exp H ht] by_cases hG:G (s,u) = 0 · simp only [hG,mul_zero,zero_mul] by_cases hH:H (t,v) = 0 · simp only [hH,mul_zero] have hs':|s| < Real.pi / 4:=lt_of_not_ge (fun h => hG (hsG s u h)) have ht':|t| < Real.pi / 4:=lt_of_not_ge (fun h => hH (hsH t v h)) have hts:t - s ∈ Ioc (-Real.pi) Real.pi:=by obtain ⟨hs1,hs2⟩:=abs_lt.mp hs' obtain ⟨ht1,ht2⟩:=abs_lt.mp ht' exact ⟨by linarith [Real.pi_pos],by linarith [Real.pi_pos]⟩ rw [← Circle.exp_sub,circleLift_exp F hts] variable [Fintype ι] [MeasurableSpace Circle] [BorelSpace Circle] theorem integral_eq_principal (F:Space ι → ℝ) (hF:Continuous F) (hs:SmallSupport F) : (∫ v,F v ∂measure ι) = ∫ t in -Real.pi..Real.pi, ∫ u,F (t,u) ∂torusHaar ι:=by letI:=torusHaar_isProbabilityMeasure ι letI:=circleHaar_isProbabilityMeasure unfold RealTorusDilation.measure rw [integral_prod _ (hF.integrable_of_hasCompactSupport (smallSupport_compactSupport F hs))] symm apply intervalIntegral.integral_eq_integral_of_support_subset intro t ht by_contra hn have ha:Real.pi / 4 ≤ |t|:=by by_contra h obtain ⟨h1,h2⟩:=abs_lt.mp (lt_of_not_ge h) exact hn ⟨by linarith [Real.pi_pos],by linarith [Real.pi_pos]⟩ apply ht simp_rw [hs t _ ha] exact integral_zero _ _ theorem integral_circleLift (F:Space ι → ℝ) (hF:Continuous F) (hs:SmallSupport F) : (∫ zu,circleLift F zu ∂circleHaar.prod (torusHaar ι)) = (2 * Real.pi)⁻¹ * ∫ v,F v ∂measure ι:=by letI:=torusHaar_isProbabilityMeasure ι letI:=circleHaar_isProbabilityMeasure have hc:=circleLift_continuous F hF hs rw [integral_prod _ (hc.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _)), integral_exp _ (torus_marginal_continuous _ hc) (-Real.pi), show -Real.pi + 2 * Real.pi = Real.pi by ring,integral_eq_principal F hF hs] congr 1 apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro t ht apply integral_congr_ae filter_upwards [] with u exact circleLift_exp F ⟨ht.1,ht.2.le⟩ u end Green24Proof.CompactCircleLift private def zz2433:"s0981"="s0981":=by decide+kernel end section namespace Green24Proof.RealTorusCoefficientNormalization open MeasureTheory Set open Green24Proof.RealTorusDilation variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] noncomputable def coefficientIntegrand (F G H:Space ι → ℝ) (yz:Space ι × Space ι):ℝ := F (3 * yz.2.1 - 2 * yz.1.1,yz.2.2 ^ 3 * yz.1.2 ^ (-2:ℤ)) * G yz.1 * H yz.2 noncomputable def differenceIntegrand (F G H:Space ι → ℝ) (yz:Space ι × Space ι):ℝ := F (yz.2.1 - yz.1.1,yz.2.2 / yz.1.2) * G yz.1 * H yz.2 noncomputable def coefficientCount (F G H:Space ι → ℝ):ℝ := ∫ yz,coefficientIntegrand F G H yz ∂(measure ι).prod (measure ι) noncomputable def differenceCount (F G H:Space ι → ℝ):ℝ := ∫ yz,differenceIntegrand F G H yz ∂(measure ι).prod (measure ι) omit [Fintype ι] in theorem coefficientIntegrand_continuous (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) : Continuous (coefficientIntegrand F G H):=by unfold coefficientIntegrand fun_prop private def zz1856:"s0740"="s0740":=by decide+kernel omit [Fintype ι] in theorem differenceIntegrand_continuous (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) : Continuous (differenceIntegrand F G H):=by unfold differenceIntegrand fun_prop omit [Fintype ι] in theorem product_weight_compactSupport (L:Space ι × Space ι → ℝ) (G H:Space ι → ℝ) (hG:HasCompactSupport G) (hH:HasCompactSupport H) : HasCompactSupport (fun yz:Space ι × Space ι => L yz * G yz.1 * H yz.2):=by apply HasCompactSupport.intro (hG.prod hH) intro yz hyz by_cases hy:yz.1 ∈ tsupport G · have hz:yz.2 ∉ tsupport H:=fun hz => hyz ⟨hy,hz⟩ rw [image_eq_zero_of_notMem_tsupport hz,mul_zero] · rw [image_eq_zero_of_notMem_tsupport hy,mul_zero,zero_mul] theorem coefficientIntegrand_integrable (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsG:HasCompactSupport G) (hsH:HasCompactSupport H) : Integrable (coefficientIntegrand F G H) ((measure ι).prod (measure ι)):=by letI:=measure_isLocallyFinite (ι:=ι) exact (coefficientIntegrand_continuous F G H hF hG hH).integrable_of_hasCompactSupport (product_weight_compactSupport _ G H hsG hsH) theorem differenceIntegrand_integrable (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsG:HasCompactSupport G) (hsH:HasCompactSupport H) : Integrable (differenceIntegrand F G H) ((measure ι).prod (measure ι)):=by letI:=measure_isLocallyFinite (ι:=ι) exact (differenceIntegrand_continuous F G H hF hG hH).integrable_of_hasCompactSupport (product_weight_compactSupport _ G H hsG hsH) private def zz1857:"s0741"="s0741":=by decide+kernel omit [Fintype ι] in theorem coefficient_pullback_identity (F G H:Space ι → ℝ) (yz:Space ι × Space ι) : coefficientIntegrand F G H (dilationMap 2 3 yz.1,dilationMap 3 2 yz.2) = differenceIntegrand (pullback 1 6 F) (pullback 2 3 G) (pullback 3 2 H) yz:=by have hpow:(yz.2.2 ^ 2) ^ 3 * (yz.1.2 ^ 3) ^ (-2:ℤ) = (yz.2.2 / yz.1.2) ^ 6:=by simp [zpow_neg, ← pow_mul,div_eq_mul_inv,mul_pow] unfold coefficientIntegrand differenceIntegrand pullback dilationMap simp only [Function.comp_apply,div_one,hpow] rw [show 3 * (yz.2.1 / 3) - 2 * (yz.1.1 / 2) = yz.2.1 - yz.1.1 by ring] theorem count_normalization (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) : differenceCount (pullback 1 6 F) (pullback 2 3 G) (pullback 3 2 H) = 6 * coefficientCount F G H:=by have h:=integral_pair_dilation (ι:=ι) (by norm_num:(2:ℝ) ≠ 0) (by norm_num:(3:ℝ) ≠ 0) (by norm_num:(3:ℕ) ≠ 0) (by norm_num:(2:ℕ) ≠ 0) (coefficientIntegrand F G H) (coefficientIntegrand_continuous F G H hF hG hH) simp_rw [coefficient_pullback_identity] at h norm_num only [abs_of_pos (by norm_num:(0:ℝ) < 2), abs_of_pos (by norm_num:(0:ℝ) < 3),show (2:ℝ) * 3 = 6 by norm_num] at h exact h def RearrangementBound (ι:Type*) [Fintype ι]:Prop := ∀ F G H:Space ι → ℝ, Continuous F → Continuous G → Continuous H → HasCompactSupport F → HasCompactSupport G → HasCompactSupport H → (∀ z,F z ∈ Icc 0 1) → (∀ z,G z ∈ Icc 0 1) → (∀ z,H z ∈ Icc 0 1) → differenceCount F G H ≤ kernel (∫ z,F z ∂measure ι) (∫ z,G z ∂measure ι) (∫ z,H z ∂measure ι) theorem coefficient_bound_of_rearrangement (hR:RearrangementBound ι) (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsF:HasCompactSupport F) (hsG:HasCompactSupport G) (hsH:HasCompactSupport H) (hrF:∀ z,F z ∈ Icc 0 1) (hrG:∀ z,G z ∈ Icc 0 1) (hrH:∀ z,H z ∈ Icc 0 1) : coefficientCount F G H ≤ kernel (∫ z,F z ∂measure ι) (2 * ∫ z,G z ∂measure ι) (3 * ∫ z,H z ∂measure ι) / 6:=by have h:=hR (pullback 1 6 F) (pullback 2 3 G) (pullback 3 2 H) (pullback_continuous 1 6 F hF) (pullback_continuous 2 3 G hG) (pullback_continuous 3 2 H hH) (pullback_compactSupport (by norm_num) 6 F hsF) (pullback_compactSupport (by norm_num) 3 G hsG) (pullback_compactSupport (by norm_num) 2 H hsH) (pullback_range 1 6 F hrF) (pullback_range 2 3 G hrG) (pullback_range 3 2 H hrH) rw [count_normalization F G H hF hG hH, integral_pullback (by norm_num:(1:ℝ) ≠ 0) (by norm_num:(6:ℕ) ≠ 0) F hF, integral_pullback (by norm_num:(2:ℝ) ≠ 0) (by norm_num:(3:ℕ) ≠ 0) G hG, integral_pullback (by norm_num:(3:ℝ) ≠ 0) (by norm_num:(2:ℕ) ≠ 0) H hH] at h norm_num only [abs_one,one_mul,abs_of_pos (by norm_num:(0:ℝ) < 2), abs_of_pos (by norm_num:(0:ℝ) < 3)] at h linarith end Green24Proof.RealTorusCoefficientNormalization private def zz2434:"s0982"="s0982":=by decide+kernel end section namespace Green24Proof.CircleLiftCounting open MeasureTheory Set open Green24Proof.CompactCircleLift Green24Proof.RealTorusDilation open Green24Proof.RealTorusCoefficientNormalization Green24Proof.CircleProbabilityHaar open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.PolicyHaarTorusMarginal variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] abbrev CircleSpace (ι:Type*):=Circle × (ι → Circle) noncomputable def circleMeasure (ι:Type*) [Fintype ι]:Measure (CircleSpace ι) := circleHaar.prod (torusHaar ι) theorem circleMeasure_probability:IsProbabilityMeasure (circleMeasure ι):=by letI:=circleHaar_isProbabilityMeasure letI:=torusHaar_isProbabilityMeasure ι unfold circleMeasure infer_instance private def zz1858:"s0742"="s0742":=by decide+kernel theorem integral_angular (L:CircleSpace ι → ℝ) (hL:Continuous L) : (∫ z,L z ∂circleMeasure ι) = (2 * Real.pi)⁻¹ * ∫ t in -Real.pi..Real.pi, ∫ u, L (Circle.exp t,u) ∂torusHaar ι:=by letI:=circleHaar_isProbabilityMeasure letI:=torusHaar_isProbabilityMeasure ι unfold circleMeasure rw [integral_prod _ (hL.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _)), integral_exp _ (torus_marginal_continuous L hL) (-Real.pi), show -Real.pi + 2 * Real.pi = Real.pi by ring] theorem circle_marginal_continuous {X:Type*} [TopologicalSpace X] [FirstCountableTopology X] [LocallyCompactSpace X] (K:X × CircleSpace ι → ℝ) (hK:Continuous K) : Continuous (fun x => ∫ z,K (x,z) ∂circleMeasure ι):=by letI:=circleMeasure_probability (ι:=ι) have h:=continuous_parametric_integral_of_continuous (μ:=circleMeasure ι) (f:=fun x z => K (x,z)) hK (s:=Set.univ) isCompact_univ simpa only [Measure.restrict_univ] using h theorem integral_pair_angular (K:CircleSpace ι × CircleSpace ι → ℝ) (hK:Continuous K) : (∫ yz,K yz ∂(circleMeasure ι).prod (circleMeasure ι)) = ((2 * Real.pi)⁻¹) ^ 2 * ∫ s in -Real.pi..Real.pi, ∫ u, (∫ t in -Real.pi..Real.pi, ∫ v, K ((Circle.exp s,u),(Circle.exp t,v)) ∂torusHaar ι) ∂torusHaar ι:=by letI:=circleMeasure_probability (ι:=ι) have hinner (y:CircleSpace ι):=integral_angular (fun z => K (y,z)) (hK.comp (continuous_const.prodMk continuous_id)) rw [integral_prod _ (hK.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _)), integral_angular _ (circle_marginal_continuous K hK)] simp_rw [hinner,integral_const_mul,intervalIntegral.integral_const_mul] ring theorem integral_real_principal (f:ℝ → ℝ) (hf:∀ t,Real.pi / 4 ≤ |t| → f t = 0) : (∫ t,f t) = ∫ t in -Real.pi..Real.pi,f t:=by symm apply intervalIntegral.integral_eq_integral_of_support_subset intro t ht by_contra hn apply ht apply hf by_contra ha obtain ⟨h1,h2⟩:=abs_lt.mp (lt_of_not_ge ha) exact hn ⟨by linarith [Real.pi_pos],by linarith [Real.pi_pos]⟩ private def zz1859:"s0743"="s0743":=by decide+kernel theorem differenceCount_eq_principal (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsG:SmallSupport G) (hsH:SmallSupport H) : differenceCount F G H = ∫ s in -Real.pi..Real.pi, ∫ u, (∫ t in -Real.pi..Real.pi, ∫ v, F (t - s,v / u) * G (s,u) * H (t,v) ∂torusHaar ι) ∂torusHaar ι:=by letI:=measure_sigmaFinite (ι:=ι) letI:=torusHaar_isProbabilityMeasure ι let K:=differenceIntegrand F G H have hc:=differenceIntegrand_continuous F G H hF hG hH have hi:=differenceIntegrand_integrable F G H hF hG hH (smallSupport_compactSupport G hsG) (smallSupport_compactSupport H hsH) have hinner (y:Space ι) : (∫ z,K (y,z) ∂measure ι) = ∫ t in -Real.pi..Real.pi, ∫ v,K (y,(t,v)) ∂torusHaar ι:=by apply integral_eq_principal (fun z => K (y,z)) (hc.comp (continuous_const.prodMk continuous_id)) intro t v ht change F (t - y.1,v / y.2) * G y * H (t,v) = 0 rw [hsH t v ht,mul_zero] unfold differenceCount rw [integral_prod _ hi] change (∫ y,(∫ z,K (y,z) ∂measure ι) ∂volume.prod (torusHaar ι)) = _ rw [integral_prod _ hi.integral_prod_left] change (∫ s, ∫ u, ∫ z,K ((s,u),z) ∂measure ι ∂torusHaar ι) = _ simp_rw [hinner] change (∫ s, ∫ u,(∫ t in -Real.pi..Real.pi, ∫ v, F (t - s,v / u) * G (s,u) * H (t,v) ∂torusHaar ι) ∂torusHaar ι) = _ apply integral_real_principal intro s hs simp_rw [hsG s _ hs,mul_zero,zero_mul] simp noncomputable def liftedDifferenceIntegrand (F G H:Space ι → ℝ) (yz:CircleSpace ι × CircleSpace ι):ℝ := circleLift F (yz.2 / yz.1) * circleLift G yz.1 * circleLift H yz.2 omit [Fintype ι] in theorem liftedDifferenceIntegrand_continuous (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsF:SmallSupport F) (hsG:SmallSupport G) (hsH:SmallSupport H) : Continuous (liftedDifferenceIntegrand F G H):=by unfold liftedDifferenceIntegrand exact (((circleLift_continuous F hF hsF).comp (by fun_prop)).mul ((circleLift_continuous G hG hsG).comp continuous_fst)).mul ((circleLift_continuous H hH hsH).comp continuous_snd) theorem integrated_count_identity (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsF:SmallSupport F) (hsG:SmallSupport G) (hsH:SmallSupport H) : (∫ yz,liftedDifferenceIntegrand F G H yz ∂(circleMeasure ι).prod (circleMeasure ι)) = ((2 * Real.pi)⁻¹) ^ 2 * differenceCount F G H:=by rw [integral_pair_angular _ (liftedDifferenceIntegrand_continuous F G H hF hG hH hsF hsG hsH), differenceCount_eq_principal F G H hF hG hH hsG hsH] congr 1 apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro s hs apply integral_congr_ae filter_upwards [] with u apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro t ht apply integral_congr_ae filter_upwards [] with v exact difference_product_exp F G H hsG hsH ⟨hs.1,hs.2.le⟩ ⟨ht.1,ht.2.le⟩ u v end Green24Proof.CircleLiftCounting private def zz2435:"s0983"="s0983":=by decide+kernel end section namespace Green24Proof.CircleLaurentApproximation open Set Algebra Submodule Finset open scoped BigOperators ComplexConjugate open Green24Proof.CyclicTorusLaurent open Green24Proof.CyclicTorusHaarDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] noncomputable def monomialMap (m:ι → ℤ):C(ι → Circle,ℂ) := ⟨monomial m,monomial_continuous m⟩ theorem monomialMap_zero:monomialMap (0:ι → ℤ) = 1:=by ext z exact monomial_zero z private def zz1860:"s0744"="s0744":=by decide+kernel theorem monomialMap_add (m n:ι → ℤ) : monomialMap (m + n) = monomialMap m * monomialMap n:=by ext z change (∏ i,(z i:ℂ) ^ (m i + n i)) = (∏ i,(z i:ℂ) ^ m i) * ∏ i,(z i:ℂ) ^ n i simp only [zpow_add₀ (Circle.coe_ne_zero _),Finset.prod_mul_distrib] theorem monomialMap_neg (m:ι → ℤ):monomialMap (-m) = star (monomialMap m):=by ext z change (∏ i,(z i:ℂ) ^ (-m i)) = (starRingEnd ℂ) (∏ i,(z i:ℂ) ^ m i) rw [map_prod] apply Finset.prod_congr rfl intro i _ rw [← Circle.coe_zpow, ← Circle.coe_zpow,zpow_neg,Circle.coe_inv_eq_conj] theorem monomialMap_single [DecidableEq ι] (i:ι) (z:ι → Circle) : monomialMap (Pi.single i (1:ℤ)) z = (z i:ℂ):=by change (∏ j,(z j:ℂ) ^ ((Pi.single i (1:ℤ):ι → ℤ) j)) = _ rw [Finset.prod_eq_single i] · simp · intro j _ hji simp [Pi.single_eq_of_ne hji] · simp noncomputable def laurentAlgebra (ι:Type*) [Fintype ι]:StarSubalgebra ℂ C(ι → Circle,ℂ) where toSubalgebra:=Algebra.adjoin ℂ (Set.range monomialMap) star_mem':=by change Algebra.adjoin ℂ (Set.range monomialMap) ≤ star (Algebra.adjoin ℂ (Set.range monomialMap)) refine adjoin_le ?_ rintro _ ⟨m,rfl⟩ refine subset_adjoin ⟨-m, ?_⟩ exact monomialMap_neg m theorem laurentAlgebra_eq_span : (laurentAlgebra ι).toSubalgebra.toSubmodule = Submodule.span ℂ (Set.range monomialMap):=by apply adjoin_eq_span_of_subset refine .trans (fun x => Submonoid.closure_induction (fun _ => id) ⟨0, ?_⟩ ?_) subset_span · exact monomialMap_zero · rintro _ _ _ _ ⟨m,rfl⟩ ⟨n,rfl⟩ exact ⟨m + n,monomialMap_add m n⟩ private def zz1861:"s0745"="s0745":=by decide+kernel theorem laurentAlgebra_separatesPoints:(laurentAlgebra ι).SeparatesPoints:=by classical change (Algebra.adjoin ℂ (Set.range (monomialMap (ι:=ι)))).SeparatesPoints intro x y hxy obtain ⟨i,hi⟩:=Function.ne_iff.mp hxy refine ⟨(monomialMap (Pi.single i (1:ℤ)):(ι → Circle) → ℂ), ?_, ?_⟩ · refine ⟨monomialMap (Pi.single i (1:ℤ)), ?_,rfl⟩ change monomialMap (Pi.single i (1:ℤ)) ∈ Algebra.adjoin ℂ (Set.range (monomialMap (ι:=ι))) exact Algebra.subset_adjoin ⟨Pi.single i (1:ℤ),rfl⟩ · change monomialMap (Pi.single i (1:ℤ)) x ≠ monomialMap (Pi.single i (1:ℤ)) y rw [monomialMap_single,monomialMap_single] exact fun h => hi (Subtype.ext h) theorem laurent_span_closure_eq_top : (Submodule.span ℂ (Set.range (monomialMap (ι:=ι)))).topologicalClosure = ⊤:=by rw [← laurentAlgebra_eq_span] exact congrArg (Subalgebra.toSubmodule ∘ StarSubalgebra.toSubalgebra) (ContinuousMap.starSubalgebra_topologicalClosure_eq_top_of_separatesPoints (laurentAlgebra ι) laurentAlgebra_separatesPoints) theorem exists_finite_laurent_approximation (F:C(ι → Circle,ℂ)) {ε:ℝ} (hε:0 < ε) : ∃ (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ), ∀ z, ‖F z - polynomial S c z‖ < ε:=by classical have hcl:F ∈ closure (Submodule.span ℂ (Set.range (monomialMap (ι:=ι))):Set C(ι → Circle,ℂ)):=by change F ∈ (Submodule.span ℂ (Set.range (monomialMap (ι:=ι)))).topologicalClosure rw [laurent_span_closure_eq_top] trivial obtain ⟨P,hP,hdist⟩:=Metric.mem_closure_iff.mp hcl ε hε obtain ⟨c,hc⟩:=Finsupp.mem_span_range_iff_exists_finsupp.mp hP refine ⟨c.support,c, ?_⟩ intro z have heval:P z = polynomial c.support c z:=by rw [← hc] simp only [Finsupp.sum,ContinuousMap.sum_apply,ContinuousMap.smul_apply, smul_eq_mul,monomialMap,ContinuousMap.coe_mk,polynomial] rw [← heval, ← dist_eq_norm] exact (ContinuousMap.dist_apply_le_dist (f:=F) (g:=P) z).trans_lt hdist end Green24Proof.CircleLaurentApproximation private def zz2436:"s0984"="s0984":=by decide+kernel end section namespace Green24Proof.IntegerMomentCurve open scoped BigOperators def frequency {d:ℕ} (w m:Fin d → ℤ):ℤ:=∑ i,m i * w i def weights (d:ℕ) (a:ℤ) (i:Fin d):ℤ:=a ^ i.val theorem weights_zero (d:ℕ) (a:ℤ):weights (d + 1) a 0 = 1:=by simp [weights] private def zz1862:"s0746"="s0746":=by decide+kernel theorem frequency_eq_eval {d:ℕ} (m:Fin d → ℤ) (a:ℤ) : frequency (weights d a) m = (Polynomial.ofFn d m).eval a:=by rw [Polynomial.ofFn_eq_sum_monomial] simp only [Polynomial.eval_finsetSum,Polynomial.eval_monomial,frequency,weights] theorem exists_avoiding_weights {d:ℕ} (S:Finset (Fin d → ℤ)) : ∃ a:ℤ, ∀ m ∈ S,m ≠ 0 → frequency (weights d a) m ≠ 0:=by classical let P:Polynomial ℤ:=∏ m ∈ S.erase 0,Polynomial.ofFn d m have hP:P ≠ 0:=by apply Finset.prod_ne_zero_iff.mpr intro m hm hzero apply (Finset.mem_erase.mp hm).1 apply Polynomial.injective_ofFn d simpa only [map_zero] using hzero obtain ⟨a,ha⟩:∃ a:ℤ,P.eval a ≠ 0:=by by_contra h push Not at h exact hP (Polynomial.zero_of_eval_zero P h) refine ⟨a, ?_⟩ intro m hm hm0 rw [frequency_eq_eval] have heval:(∏ v ∈ S.erase 0,(Polynomial.ofFn d v).eval a) ≠ 0:=by simpa only [P,Polynomial.eval_prod] using ha exact Finset.prod_ne_zero_iff.mp heval m (Finset.mem_erase.mpr ⟨hm0,hm⟩) theorem exists_weights_first_one (d:ℕ) (S:Finset (Fin (d + 1) → ℤ)) : ∃ w:Fin (d + 1) → ℤ,w 0 = 1 ∧ ∀ m ∈ S,m ≠ 0 → frequency w m ≠ 0:=by obtain ⟨a,ha⟩:=exists_avoiding_weights S exact ⟨weights (d + 1) a,weights_zero d a,ha⟩ end Green24Proof.IntegerMomentCurve private def zz2437:"s0985"="s0985":=by decide+kernel end section namespace Green24Proof.CircleTorusOrbit open MeasureTheory Finset open scoped BigOperators open Green24Proof.CircleProbabilityHaar Green24Proof.CyclicTorusLaurent open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.CircleLaurentApproximation variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] noncomputable def orbit (w:ι → ℤ) (z:Circle):ι → Circle:=fun i => z ^ w i omit [Fintype ι] in theorem orbit_continuous (w:ι → ℤ):Continuous (orbit w):=by unfold orbit fun_prop private def zz1863:"s0747"="s0747":=by decide+kernel omit [Fintype ι] in theorem orbit_div (w:ι → ℤ) (y z:Circle):orbit w (z / y) = orbit w z / orbit w y:=by funext i exact div_zpow _ _ _ def Nonresonant (w:ι → ℤ) (S:Finset (ι → ℤ)):Prop := ∀ m ∈ S,m ≠ 0 → ∑ i,m i * w i ≠ 0 theorem integral_circle_zpow (n:ℤ) : (∫ z:Circle,(z:ℂ) ^ n ∂circleHaar) = if n = 0 then 1 else 0:=by letI:=circleHaar_isProbabilityMeasure letI:=circleHaar_isHaarMeasure classical by_cases hn:n = 0 · simp [hn] · rw [if_neg hn] have hm:(fun _:Fin 1 => n) ≠ 0:=fun h => hn (congrFun h 0) obtain ⟨w,hw⟩:=exists_monomial_ne_one hm have hw':(w 0:ℂ) ^ n ≠ 1:=by simpa only [monomial,Fin.prod_univ_one] using hw have htrans:=integral_mul_left_eq_self (μ:=circleHaar) (fun z:Circle => (z:ℂ) ^ n) (w 0) simp only [Circle.coe_mul,mul_zpow] at htrans rw [integral_const_mul] at htrans have hzero:((w 0:ℂ) ^ n - 1) * (∫ z:Circle,(z:ℂ) ^ n ∂circleHaar) = 0:=by linear_combination htrans exact (mul_eq_zero.mp hzero).resolve_left (sub_ne_zero.mpr hw') theorem monomial_orbit (w m:ι → ℤ) (z:Circle) : monomial m (orbit w z) = (z:ℂ) ^ (∑ i,m i * w i):=by classical have hp (S:Finset ι) : (∏ i ∈ S,(z:ℂ) ^ (w i * m i)) = (z:ℂ) ^ (∑ i ∈ S,w i * m i):=by induction S using Finset.induction_on with | empty => simp | @insert a S ha ih => rw [Finset.prod_insert ha,Finset.sum_insert ha,ih,zpow_add₀ (Circle.coe_ne_zero z)] simp only [monomial,orbit,Circle.coe_zpow, ← zpow_mul] rw [hp] congr 1 apply Finset.sum_congr rfl intro i _ exact mul_comm _ _ theorem integral_monomial_orbit (w m:ι → ℤ) : (∫ z,monomial m (orbit w z) ∂circleHaar) = if (∑ i,m i * w i) = 0 then 1 else 0:=by simp_rw [monomial_orbit] exact integral_circle_zpow _ private def zz1864:"s0748"="s0748":=by decide+kernel theorem polynomial_continuous (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) : Continuous (polynomial S c):=by unfold polynomial exact continuous_finsetSum _ (fun m _ => continuous_const.mul (monomial_continuous m)) theorem integral_polynomial_orbit (w:ι → ℤ) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (hw:Nonresonant w S) : (∫ z,polynomial S c (orbit w z) ∂circleHaar) = ∫ z,polynomial S c z ∂torusHaar ι:=by letI:=circleHaar_isProbabilityMeasure classical rw [integral_polynomial] change (∫ z, ∑ m ∈ S,c m * monomial m (orbit w z) ∂circleHaar) = _ rw [integral_finsetSum] · unfold constantCoefficient apply Finset.sum_congr rfl intro m hm rw [integral_const_mul,integral_monomial_orbit] by_cases hm0:m = 0 · subst m simp · simp only [if_neg hm0,if_neg (hw m hm hm0),mul_zero] · intro m _ exact (continuous_const.mul ((monomial_continuous m).comp (orbit_continuous w))).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) omit [Fintype ι] in theorem integral_orbit_error (w:ι → ℤ) (F P:(ι → Circle) → ℂ) (hF:Continuous F) (hP:Continuous P) {ε:ℝ} (herr:∀ z, ‖F z - P z‖ ≤ ε) : ‖(∫ z,F (orbit w z) ∂circleHaar) - ∫ z,P (orbit w z) ∂circleHaar‖ ≤ ε:=by letI:=circleHaar_isProbabilityMeasure have hFi:Integrable (fun z => F (orbit w z)) circleHaar := (hF.comp (orbit_continuous w)).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) have hPi:Integrable (fun z => P (orbit w z)) circleHaar := (hP.comp (orbit_continuous w)).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) rw [← integral_sub hFi hPi] simpa only [probReal_univ,mul_one] using norm_integral_le_of_norm_le_const (μ:=circleHaar) (Filter.Eventually.of_forall (fun z => herr _)) theorem integral_orbit_discrepancy (w:ι → ℤ) (S:Finset (ι → ℤ)) (c:(ι → ℤ) → ℂ) (F:(ι → Circle) → ℂ) (hF:Continuous F) (hw:Nonresonant w S) {ε:ℝ} (herr:∀ z, ‖F z - polynomial S c z‖ ≤ ε) : ‖(∫ z,F (orbit w z) ∂circleHaar) - ∫ z,F z ∂torusHaar ι‖ ≤ 2 * ε:=by letI:=torusHaar_isProbabilityMeasure ι have ho:=integral_orbit_error w F (polynomial S c) hF (polynomial_continuous S c) herr have hi:‖(∫ z,polynomial S c z ∂torusHaar ι) - ∫ z,F z ∂torusHaar ι‖ ≤ ε:=by rw [norm_sub_rev, ← integral_sub (hF.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _)) (polynomial_integrable S c)] simpa only [probReal_univ,mul_one] using norm_integral_le_of_norm_le_const (μ:=torusHaar ι) (Filter.Eventually.of_forall herr) have hp:=integral_polynomial_orbit w S c hw calc _ = ‖((∫ z,F (orbit w z) ∂circleHaar) - ∫ z,polynomial S c (orbit w z) ∂circleHaar) + ((∫ z,polynomial S c z ∂torusHaar ι) - ∫ z,F z ∂torusHaar ι)‖:=by rw [hp,sub_add_sub_cancel] _ ≤ _ + _:=norm_add_le _ _ _ ≤ ε + ε:=add_le_add ho hi _ = 2 * ε:=by ring private def zz1865:"s0749"="s0749":=by decide+kernel theorem exists_approximation_support (F:(ι → Circle) → ℂ) (hF:Continuous F) {ε:ℝ} (hε:0 < ε) : ∃ S:Finset (ι → ℤ), ∀ w:ι → ℤ,Nonresonant w S → ‖(∫ z,F (orbit w z) ∂circleHaar) - ∫ z,F z ∂torusHaar ι‖ ≤ 2 * ε:=by obtain ⟨S,c,hc⟩:=exists_finite_laurent_approximation ⟨F,hF⟩ hε exact ⟨S,fun w hw => integral_orbit_discrepancy w S c F hF hw (fun z => (hc z).le)⟩ theorem exists_approximation_first_one (d:ℕ) (F:(Fin (d + 1) → Circle) → ℂ) (hF:Continuous F) {ε:ℝ} (hε:0 < ε) : ∃ w:Fin (d + 1) → ℤ,w 0 = 1 ∧ ‖(∫ z,F (orbit w z) ∂circleHaar) - ∫ z,F z ∂torusHaar (Fin (d + 1))‖ ≤ 2 * ε:=by obtain ⟨S,hS⟩:=exists_approximation_support F hF hε obtain ⟨w,hw,hnon⟩:=IntegerMomentCurve.exists_weights_first_one d S exact ⟨w,hw,hS w hnon⟩ end Green24Proof.CircleTorusOrbit private def zz2438:"s0986"="s0986":=by decide+kernel end section namespace Green24Proof.CyclicTorusPairDiscrepancy open Finset MeasureTheory open scoped BigOperators open Green24Proof.CyclicTorusLaurent open Green24Proof.CyclicTorusHaarDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι κ:Type*} [Fintype ι] [Fintype κ] abbrev PairTorus (ι κ:Type*):=(ι → Circle) × (κ → Circle) abbrev PairExponent (ι κ:Type*):=(ι → ℤ) × (κ → ℤ) noncomputable def pairMonomial (m:PairExponent ι κ) (z:PairTorus ι κ):ℂ := monomial m.1 z.1 * monomial m.2 z.2 noncomputable def pairPolynomial (S:Finset (PairExponent ι κ)) (c:PairExponent ι κ → ℂ) (z:PairTorus ι κ):ℂ := ∑ m ∈ S,c m * pairMonomial m z noncomputable def pairHaar:Measure (PairTorus ι κ):=(torusHaar ι).prod (torusHaar κ) theorem pairHaar_isProbabilityMeasure:IsProbabilityMeasure (pairHaar (ι:=ι) (κ:=κ)):=by letI:=torusHaar_isProbabilityMeasure ι letI:=torusHaar_isProbabilityMeasure κ unfold pairHaar infer_instance theorem pairMonomial_continuous (m:PairExponent ι κ):Continuous (pairMonomial m) := ((monomial_continuous m.1).comp continuous_fst).mul ((monomial_continuous m.2).comp continuous_snd) private def zz1866:"s074a"="s074a":=by decide+kernel theorem pairMonomial_integrable (m:PairExponent ι κ) : Integrable (pairMonomial m) pairHaar:=by letI:=pairHaar_isProbabilityMeasure (ι:=ι) (κ:=κ) exact (pairMonomial_continuous m).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) theorem integral_pairMonomial (m:PairExponent ι κ) : (∫ z,pairMonomial m z ∂pairHaar) = (if m.1 = 0 then 1 else 0) * (if m.2 = 0 then 1 else 0):=by letI:=torusHaar_isProbabilityMeasure ι letI:=torusHaar_isProbabilityMeasure κ classical change (∫ z,monomial m.1 z.1 * monomial m.2 z.2 ∂(torusHaar ι).prod (torusHaar κ)) = _ rw [integral_prod_mul,integral_monomial,integral_monomial] theorem pairPolynomial_integrable (S:Finset (PairExponent ι κ)) (c:PairExponent ι κ → ℂ):Integrable (pairPolynomial S c) pairHaar:=by apply integrable_finsetSum intro m _ exact (pairMonomial_integrable m).const_mul (c m) theorem integral_pairPolynomial (S:Finset (PairExponent ι κ)) (c:PairExponent ι κ → ℂ) : (∫ z,pairPolynomial S c z ∂pairHaar) = ∑ m ∈ S,c m * ∫ z,pairMonomial m z ∂pairHaar:=by unfold pairPolynomial rw [integral_finsetSum] · simp only [integral_const_mul] · intro m _ exact (pairMonomial_integrable m).const_mul (c m) variable {q:ℕ} [NeZero q] noncomputable def pairOrbitMean (ks:ι → ZMod q) (ls:κ → ZMod q) (F:PairTorus ι κ → ℂ):ℂ := ((q:ℂ) ^ 2)⁻¹ * ∑ p:ZMod q × ZMod q, F (fun i => ZMod.toCircle (-(p.1 * ks i)),fun j => ZMod.toCircle (-(p.2 * ls j))) private def zz1867:"s074b"="s074b":=by decide+kernel theorem pairOrbitMean_monomial (ks:ι → ZMod q) (ls:κ → ZMod q) (m:PairExponent ι κ) : pairOrbitMean ks ls (pairMonomial m) = (if weightedFrequency ks m.1 = 0 then 1 else 0) * (if weightedFrequency ls m.2 = 0 then 1 else 0):=by classical unfold pairOrbitMean pairMonomial rw [Fintype.sum_prod_type] have hfactor:(∑ x:ZMod q, ∑ y:ZMod q, monomial m.1 (fun i => ZMod.toCircle (-(x * ks i))) * monomial m.2 (fun j => ZMod.toCircle (-(y * ls j)))) = (∑ x:ZMod q,monomial m.1 (fun i => ZMod.toCircle (-(x * ks i)))) * (∑ y:ZMod q,monomial m.2 (fun j => ZMod.toCircle (-(y * ls j)))):=by rw [Finset.sum_mul] apply Finset.sum_congr rfl intro x _ rw [Finset.mul_sum] rw [hfactor,sum_monomial_character_values,sum_monomial_character_values] have hq:(q:ℂ) ≠ 0:=by exact_mod_cast NeZero.ne q split_ifs <;> simp [pow_two] field_simp theorem pairOrbitMean_polynomial (ks:ι → ZMod q) (ls:κ → ZMod q) (S:Finset (PairExponent ι κ)) (c:PairExponent ι κ → ℂ) : pairOrbitMean ks ls (pairPolynomial S c) = ∑ m ∈ S,c m * pairOrbitMean ks ls (pairMonomial m):=by unfold pairOrbitMean pairPolynomial rw [Finset.sum_comm,Finset.mul_sum] apply Finset.sum_congr rfl intro m _ rw [← Finset.mul_sum] ring theorem pairOrbitMean_polynomial_eq_haar_integral [DecidableEq (ι → ℤ)] [DecidableEq (κ → ℤ)] (ks:ι → ZMod q) (ls:κ → ZMod q) (S:Finset (PairExponent ι κ)) (c:PairExponent ι κ → ℂ) (hk:Nonresonant ks (S.image Prod.fst)) (hl:Nonresonant ls (S.image Prod.snd)) : pairOrbitMean ks ls (pairPolynomial S c) = ∫ z,pairPolynomial S c z ∂pairHaar:=by classical rw [pairOrbitMean_polynomial,integral_pairPolynomial] apply Finset.sum_congr rfl intro m hm have hk':weightedFrequency ks m.1 = 0 ↔ m.1 = 0:=by constructor · intro h by_contra hn exact hk m.1 (Finset.mem_image.mpr ⟨m,hm,rfl⟩) hn h · rintro h rw [h,weightedFrequency_zero] have hl':weightedFrequency ls m.2 = 0 ↔ m.2 = 0:=by constructor · intro h by_contra hn exact hl m.2 (Finset.mem_image.mpr ⟨m,hm,rfl⟩) hn h · rintro h rw [h,weightedFrequency_zero] simp only [pairOrbitMean_monomial,integral_pairMonomial,hk',hl'] split_ifs <;> rfl omit [Fintype ι] [Fintype κ] in theorem pairOrbitMean_error_le (ks:ι → ZMod q) (ls:κ → ZMod q) (F P:PairTorus ι κ → ℂ) {ε:ℝ} (herr:∀ z, ‖F z - P z‖ ≤ ε) : ‖pairOrbitMean ks ls F - pairOrbitMean ks ls P‖ ≤ ε:=by have hq:(0:ℝ) < q:=Nat.cast_pos.mpr (NeZero.pos q) have hs:‖∑ p:ZMod q × ZMod q, (F (fun i => ZMod.toCircle (-(p.1 * ks i)),fun j => ZMod.toCircle (-(p.2 * ls j))) - P (fun i => ZMod.toCircle (-(p.1 * ks i)),fun j => ZMod.toCircle (-(p.2 * ls j))))‖ ≤ (q:ℝ) ^ 2 * ε:=by calc _ ≤ ∑ p:ZMod q × ZMod q, ‖F (fun i => ZMod.toCircle (-(p.1 * ks i)),fun j => ZMod.toCircle (-(p.2 * ls j))) - P (fun i => ZMod.toCircle (-(p.1 * ks i)),fun j => ZMod.toCircle (-(p.2 * ls j)))‖:=norm_sum_le _ _ _ ≤ ∑ _p:ZMod q × ZMod q,ε:=Finset.sum_le_sum (fun _ _ => herr _) _ = _:=by simp [Fintype.card_prod,ZMod.card,pow_two] rw [pairOrbitMean,pairOrbitMean, ← mul_sub, ← Finset.sum_sub_distrib,norm_mul, norm_inv,norm_pow,Complex.norm_natCast] calc ((q:ℝ) ^ 2)⁻¹ * _ ≤ ((q:ℝ) ^ 2)⁻¹ * ((q:ℝ) ^ 2 * ε) := mul_le_mul_of_nonneg_left hs (inv_nonneg.mpr (sq_nonneg _)) _ = ε:=by field_simp private def zz1868:"s074c"="s074c":=by decide+kernel theorem pairOrbitMean_haar_discrepancy_of_continuous [DecidableEq (ι → ℤ)] [DecidableEq (κ → ℤ)] (ks:ι → ZMod q) (ls:κ → ZMod q) (S:Finset (PairExponent ι κ)) (c:PairExponent ι κ → ℂ) (F:PairTorus ι κ → ℂ) (hF:Continuous F) (hk:Nonresonant ks (S.image Prod.fst)) (hl:Nonresonant ls (S.image Prod.snd)) {ε:ℝ} (herr:∀ z, ‖F z - pairPolynomial S c z‖ ≤ ε) : ‖pairOrbitMean ks ls F - ∫ z,F z ∂pairHaar‖ ≤ 2 * ε:=by letI:=pairHaar_isProbabilityMeasure (ι:=ι) (κ:=κ) have hFi:Integrable F pairHaar := hF.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) have ho:=pairOrbitMean_error_le ks ls F (pairPolynomial S c) herr have hi:‖(∫ z,F z ∂pairHaar) - ∫ z,pairPolynomial S c z ∂pairHaar‖ ≤ ε:=by rw [← integral_sub hFi (pairPolynomial_integrable S c)] simpa only [probReal_univ,mul_one] using norm_integral_le_of_norm_le_const (μ:=pairHaar) (Filter.Eventually.of_forall herr) have hp:=pairOrbitMean_polynomial_eq_haar_integral ks ls S c hk hl calc ‖pairOrbitMean ks ls F - ∫ z,F z ∂pairHaar‖ = ‖(pairOrbitMean ks ls F - pairOrbitMean ks ls (pairPolynomial S c)) + ((∫ z,pairPolynomial S c z ∂pairHaar) - ∫ z,F z ∂pairHaar)‖:=by rw [← hp,sub_add_sub_cancel] _ ≤ ‖pairOrbitMean ks ls F - pairOrbitMean ks ls (pairPolynomial S c)‖ + ‖(∫ z,pairPolynomial S c z ∂pairHaar) - ∫ z,F z ∂pairHaar‖:=norm_add_le _ _ _ ≤ ε + ε:=add_le_add ho (by simpa only [norm_sub_rev] using hi) _ = 2 * ε:=by ring end Green24Proof.CyclicTorusPairDiscrepancy private def zz2439:"s0987"="s0987":=by decide+kernel end section namespace Green24Proof.CyclicTorusPairApproximation open Finset MeasureTheory open scoped BigOperators open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusPairDiscrepancy open Green24Proof.CircleLaurentApproximation variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι κ:Type*} [Fintype ι] [Fintype κ] def joinTorus (p:PairTorus ι κ):(ι ⊕ κ) → Circle:=Sum.elim p.1 p.2 def splitTorus (z:(ι ⊕ κ) → Circle):PairTorus ι κ := (fun i => z (Sum.inl i),fun j => z (Sum.inr j)) def exponentEquiv:((ι ⊕ κ) → ℤ) ≃ PairExponent ι κ where toFun m:=(fun i => m (Sum.inl i),fun j => m (Sum.inr j)) invFun m:=Sum.elim m.1 m.2 left_inv m:=by funext i; cases i <;> rfl right_inv m:=by rcases m with ⟨m,n⟩; rfl omit [Fintype ι] [Fintype κ] in theorem splitTorus_joinTorus (p:PairTorus ι κ):splitTorus (joinTorus p) = p:=by rcases p with ⟨z,w⟩ rfl omit [Fintype ι] [Fintype κ] in theorem splitTorus_continuous:Continuous (splitTorus (ι:=ι) (κ:=κ)):=by unfold splitTorus fun_prop theorem monomial_joinTorus (m:(ι ⊕ κ) → ℤ) (p:PairTorus ι κ) : monomial m (joinTorus p) = pairMonomial (exponentEquiv m) p:=by simp only [monomial,Fintype.prod_sum_type,joinTorus,Sum.elim_inl,Sum.elim_inr, pairMonomial,exponentEquiv,Equiv.coe_fn_mk] private def zz1869:"s074d"="s074d":=by decide+kernel theorem pairPolynomial_map (S:Finset ((ι ⊕ κ) → ℤ)) (c:((ι ⊕ κ) → ℤ) → ℂ) (p:PairTorus ι κ) : pairPolynomial (S.map exponentEquiv.toEmbedding) (fun m => c (exponentEquiv.symm m)) p = polynomial S c (joinTorus p):=by simp only [pairPolynomial,Finset.sum_map,Equiv.coe_toEmbedding,Equiv.symm_apply_apply, polynomial,monomial_joinTorus] theorem exists_finite_pair_laurent_approximation (F:PairTorus ι κ → ℂ) (hF:Continuous F) {ε:ℝ} (hε:0 < ε) : ∃ (S:Finset (PairExponent ι κ)) (c:PairExponent ι κ → ℂ), ∀ z, ‖F z - pairPolynomial S c z‖ < ε:=by let F':C((ι ⊕ κ) → Circle,ℂ):=⟨fun z => F (splitTorus z),hF.comp splitTorus_continuous⟩ obtain ⟨S,c,herr⟩:=exists_finite_laurent_approximation F' hε refine ⟨S.map exponentEquiv.toEmbedding,fun m => c (exponentEquiv.symm m), ?_⟩ intro p rw [pairPolynomial_map] simpa only [F',ContinuousMap.coe_mk,splitTorus_joinTorus] using herr (joinTorus p) variable {q:ℕ} [NeZero q] theorem exists_pair_discrepancy_support (F:PairTorus ι κ → ℂ) (hF:Continuous F) {ε:ℝ} (hε:0 < ε) : ∃ (S:Finset (PairExponent ι κ)) (c:PairExponent ι κ → ℂ), (∀ z, ‖F z - pairPolynomial S c z‖ < ε) ∧ ∀ (ks:ι → ZMod q) (ls:κ → ZMod q), Nonresonant ks (S.image Prod.fst) → Nonresonant ls (S.image Prod.snd) → ‖pairOrbitMean ks ls F - ∫ z,F z ∂pairHaar‖ ≤ 2 * ε:=by classical obtain ⟨S,c,herr⟩:=exists_finite_pair_laurent_approximation F hF hε exact ⟨S,c,herr,fun ks ls hk hl => pairOrbitMean_haar_discrepancy_of_continuous ks ls S c F hF hk hl (fun z => (herr z).le)⟩ end Green24Proof.CyclicTorusPairApproximation private def zz2440:"s0988"="s0988":=by decide+kernel end section namespace Green24Proof.CircleTorusPairOrbit open MeasureTheory Finset open scoped BigOperators open Green24Proof.CircleProbabilityHaar Green24Proof.CircleTorusOrbit open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.CyclicTorusPairDiscrepancy open Green24Proof.CyclicTorusPairApproximation variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] noncomputable def pairOrbit (w:ι → ℤ) (yz:Circle × Circle):PairTorus ι ι := (orbit w yz.1,orbit w yz.2) omit [Fintype ι] in theorem pairOrbit_continuous (w:ι → ℤ):Continuous (pairOrbit w) := ((orbit_continuous w).comp continuous_fst).prodMk ((orbit_continuous w).comp continuous_snd) private def zz1870:"s074e"="s074e":=by decide+kernel theorem integral_pairMonomial_orbit (w:ι → ℤ) (m:PairExponent ι ι) : (∫ yz,pairMonomial m (pairOrbit w yz) ∂circleHaar.prod circleHaar) = (if (∑ i,m.1 i * w i) = 0 then 1 else 0) * (if (∑ i,m.2 i * w i) = 0 then 1 else 0):=by letI:=circleHaar_isProbabilityMeasure change (∫ yz,CyclicTorusLaurent.monomial m.1 (orbit w yz.1) * CyclicTorusLaurent.monomial m.2 (orbit w yz.2) ∂circleHaar.prod circleHaar) = _ rw [integral_prod_mul (fun z:Circle => CyclicTorusLaurent.monomial m.1 (orbit w z)) (fun z:Circle => CyclicTorusLaurent.monomial m.2 (orbit w z)), integral_monomial_orbit,integral_monomial_orbit] theorem pairPolynomial_continuous (S:Finset (PairExponent ι ι)) (c:PairExponent ι ι → ℂ) : Continuous (pairPolynomial S c):=by unfold pairPolynomial exact continuous_finsetSum _ (fun m _ => continuous_const.mul (pairMonomial_continuous m)) theorem integral_pairPolynomial_orbit (w:ι → ℤ) (S:Finset (PairExponent ι ι)) (c:PairExponent ι ι → ℂ) (h1:CircleTorusOrbit.Nonresonant w (S.image Prod.fst)) (h2:CircleTorusOrbit.Nonresonant w (S.image Prod.snd)) : (∫ yz,pairPolynomial S c (pairOrbit w yz) ∂circleHaar.prod circleHaar) = ∫ yz,pairPolynomial S c yz ∂pairHaar:=by letI:=circleHaar_isProbabilityMeasure classical rw [integral_pairPolynomial] change (∫ yz, ∑ m ∈ S,c m * pairMonomial m (pairOrbit w yz) ∂circleHaar.prod circleHaar) = _ rw [integral_finsetSum] · apply Finset.sum_congr rfl intro m hm rw [integral_const_mul,integral_pairMonomial_orbit,integral_pairMonomial] have hf:((∑ i,m.1 i * w i) = 0) ↔ m.1 = 0:=by constructor · intro hz by_contra hn exact h1 _ (Finset.mem_image.mpr ⟨m,hm,rfl⟩) hn hz · intro hz simp [hz] have hs:((∑ i,m.2 i * w i) = 0) ↔ m.2 = 0:=by constructor · intro hz by_contra hn exact h2 _ (Finset.mem_image.mpr ⟨m,hm,rfl⟩) hn hz · intro hz simp [hz] simp only [hf,hs] · intro m _ exact (continuous_const.mul ((pairMonomial_continuous m).comp (pairOrbit_continuous w))).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) omit [Fintype ι] in theorem integral_pairOrbit_error (w:ι → ℤ) (F P:PairTorus ι ι → ℂ) (hF:Continuous F) (hP:Continuous P) {ε:ℝ} (herr:∀ z, ‖F z - P z‖ ≤ ε) : ‖(∫ yz,F (pairOrbit w yz) ∂circleHaar.prod circleHaar) - ∫ yz,P (pairOrbit w yz) ∂circleHaar.prod circleHaar‖ ≤ ε:=by letI:=circleHaar_isProbabilityMeasure have hFi:Integrable (fun z => F (pairOrbit w z)) (circleHaar.prod circleHaar) := (hF.comp (pairOrbit_continuous w)).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) have hPi:Integrable (fun z => P (pairOrbit w z)) (circleHaar.prod circleHaar) := (hP.comp (pairOrbit_continuous w)).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) rw [← integral_sub hFi hPi] simpa only [probReal_univ,mul_one] using norm_integral_le_of_norm_le_const (μ:=circleHaar.prod circleHaar) (Filter.Eventually.of_forall (fun z => herr _)) private def zz1871:"s074f"="s074f":=by decide+kernel theorem integral_pairOrbit_discrepancy (w:ι → ℤ) (S:Finset (PairExponent ι ι)) (c:PairExponent ι ι → ℂ) (F:PairTorus ι ι → ℂ) (hF:Continuous F) (h1:CircleTorusOrbit.Nonresonant w (S.image Prod.fst)) (h2:CircleTorusOrbit.Nonresonant w (S.image Prod.snd)) {ε:ℝ} (herr:∀ z, ‖F z - pairPolynomial S c z‖ ≤ ε) : ‖(∫ yz,F (pairOrbit w yz) ∂circleHaar.prod circleHaar) - ∫ yz,F yz ∂pairHaar‖ ≤ 2 * ε:=by letI:=pairHaar_isProbabilityMeasure (ι:=ι) (κ:=ι) have ho:=integral_pairOrbit_error w F (pairPolynomial S c) hF (pairPolynomial_continuous S c) herr have hi:‖(∫ z,pairPolynomial S c z ∂pairHaar) - ∫ z,F z ∂pairHaar‖ ≤ ε:=by rw [norm_sub_rev, ← integral_sub (hF.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _)) (pairPolynomial_integrable S c)] simpa only [probReal_univ,mul_one] using norm_integral_le_of_norm_le_const (μ:=pairHaar) (Filter.Eventually.of_forall herr) have hp:=integral_pairPolynomial_orbit w S c h1 h2 calc _ = ‖((∫ z,F (pairOrbit w z) ∂circleHaar.prod circleHaar) - ∫ z,pairPolynomial S c (pairOrbit w z) ∂circleHaar.prod circleHaar) + ((∫ z,pairPolynomial S c z ∂pairHaar) - ∫ z,F z ∂pairHaar)‖:=by rw [hp,sub_add_sub_cancel] _ ≤ _ + _:=norm_add_le _ _ _ ≤ ε + ε:=add_le_add ho hi _ = 2 * ε:=by ring theorem exists_pair_approximation_support (F:PairTorus ι ι → ℂ) (hF:Continuous F) {ε:ℝ} (hε:0 < ε) : ∃ S:Finset (PairExponent ι ι), ∀ w:ι → ℤ, CircleTorusOrbit.Nonresonant w (S.image Prod.fst) → CircleTorusOrbit.Nonresonant w (S.image Prod.snd) → ‖(∫ yz,F (pairOrbit w yz) ∂circleHaar.prod circleHaar) - ∫ yz,F yz ∂pairHaar‖ ≤ 2 * ε:=by obtain ⟨S,c,hc⟩:=exists_finite_pair_laurent_approximation F hF hε exact ⟨S,fun w h1 h2 => integral_pairOrbit_discrepancy w S c F hF h1 h2 (fun z => (hc z).le)⟩ theorem exists_joint_approximation_first_one (d r:ℕ) (F:Fin r → (Fin (d + 1) → Circle) → ℂ) (hF:∀ i,Continuous (F i)) (K:PairTorus (Fin (d + 1)) (Fin (d + 1)) → ℂ) (hK:Continuous K) {ε:ℝ} (hε:0 < ε) : ∃ w:Fin (d + 1) → ℤ,w 0 = 1 ∧ (∀ i, ‖(∫ z,F i (orbit w z) ∂circleHaar) - ∫ z,F i z ∂torusHaar (Fin (d + 1))‖ ≤ 2 * ε) ∧ ‖(∫ yz,K (pairOrbit w yz) ∂circleHaar.prod circleHaar) - ∫ yz,K yz ∂pairHaar‖ ≤ 2 * ε:=by classical choose S hS using fun i => exists_approximation_support (F i) (hF i) hε obtain ⟨T,hT⟩:=exists_pair_approximation_support K hK hε let U:=(Finset.univ.biUnion S) ∪ (T.image Prod.fst ∪ T.image Prod.snd) obtain ⟨w,hw,hn⟩:=IntegerMomentCurve.exists_weights_first_one d U have hrestrict (V:Finset (Fin (d + 1) → ℤ)) (hV:V ⊆ U) : CircleTorusOrbit.Nonresonant w V:=fun m hm hm0 => hn m (hV hm) hm0 refine ⟨w,hw, ?_, ?_⟩ · intro i apply hS i w apply hrestrict exact (Finset.subset_biUnion_of_mem S (Finset.mem_univ i)).trans Finset.subset_union_left · apply hT w · apply hrestrict exact Finset.subset_union_left.trans Finset.subset_union_right · apply hrestrict exact Finset.subset_union_right.trans Finset.subset_union_right end Green24Proof.CircleTorusPairOrbit private def zz2441:"s0989"="s0989":=by decide+kernel end section namespace Green24Proof.CircleProductOrbit open MeasureTheory Set open scoped BigOperators open Green24Proof.CircleLiftCounting Green24Proof.CircleTorusOrbit open Green24Proof.CircleTorusPairOrbit Green24Proof.CircleProbabilityHaar open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.CyclicTorusPairDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] theorem exists_weights_pivot_one {κ:Type*} [Fintype κ] (p:κ) (S:Finset (κ → ℤ)) : ∃ w:κ → ℤ,w p = 1 ∧ ∀ m ∈ S,m ≠ 0 → (∑ i,m i * w i) ≠ 0:=by classical have hcard:0 < Fintype.card κ:=Fintype.card_pos_iff.mpr ⟨p⟩ let d:=Fintype.card κ - 1 have hd:Fintype.card κ = d + 1:=by omega let e₀:κ ≃ Fin (d + 1):=Fintype.equivFinOfCardEq hd let e:κ ≃ Fin (d + 1):=e₀.trans (Equiv.swap (e₀ p) 0) have hep:e p = 0:=by simp [e] let U:Finset (Fin (d + 1) → ℤ):=S.image (fun m => m ∘ e.symm) obtain ⟨w,hw,hn⟩:=IntegerMomentCurve.exists_weights_first_one d U refine ⟨fun i => w (e i),by change w (e p) = 1; rw [hep,hw], ?_⟩ intro m hm hm0 have hm':m ∘ e.symm ≠ 0:=by intro hz apply hm0 funext i have h:=congrFun hz (e i) simpa only [Function.comp_apply,Equiv.symm_apply_apply,Pi.zero_apply] using h have h:=hn (m ∘ e.symm) (Finset.mem_image.mpr ⟨m,hm,rfl⟩) hm' have heq:(∑ i,m i * w (e i)) = ∑ j,m (e.symm j) * w j:=by simpa only [Equiv.symm_apply_apply] using e.sum_comp (fun j => m (e.symm j) * w j) rwa [heq] private def zz1872:"s0750"="s0750":=by decide+kernel theorem exists_joint_approximation_pivot_one {κ:Type*} [Fintype κ] (p:κ) (r:ℕ) (F:Fin r → (κ → Circle) → ℂ) (hF:∀ i,Continuous (F i)) (K:PairTorus κ κ → ℂ) (hK:Continuous K) {ε:ℝ} (hε:0 < ε) : ∃ w:κ → ℤ,w p = 1 ∧ (∀ i, ‖(∫ z,F i (orbit w z) ∂circleHaar) - ∫ z,F i z ∂torusHaar κ‖ ≤ 2 * ε) ∧ ‖(∫ yz,K (pairOrbit w yz) ∂circleHaar.prod circleHaar) - ∫ yz,K yz ∂pairHaar‖ ≤ 2 * ε:=by classical choose S hS using fun i => exists_approximation_support (F i) (hF i) hε obtain ⟨T,hT⟩:=exists_pair_approximation_support K hK hε let U:=(Finset.univ.biUnion S) ∪ (T.image Prod.fst ∪ T.image Prod.snd) obtain ⟨w,hw,hn⟩:=exists_weights_pivot_one p U have hrestrict (V:Finset (κ → ℤ)) (hV:V ⊆ U) : CircleTorusOrbit.Nonresonant w V:=fun m hm hm0 => hn m (hV hm) hm0 refine ⟨w,hw, ?_, ?_⟩ · intro i apply hS i w apply hrestrict exact (Finset.subset_biUnion_of_mem S (Finset.mem_univ i)).trans Finset.subset_union_left · apply hT w · apply hrestrict exact Finset.subset_union_left.trans Finset.subset_union_right · apply hrestrict exact Finset.subset_union_right.trans Finset.subset_union_right variable {ι:Type*} [Fintype ι] def splitOption:(Option ι → Circle) →* CircleSpace ι where toFun z:=(z none,fun i => z (some i)) map_one':=rfl map_mul' _ _:=rfl omit [Fintype ι] in theorem splitOption_continuous:Continuous (splitOption (ι:=ι)):=by change Continuous (fun z:Option ι → Circle => (z none,fun i => z (some i))) fun_prop omit [Fintype ι] in theorem splitOption_surjective:Function.Surjective (splitOption (ι:=ι)):=by intro v exact ⟨fun o => o.elim v.1 v.2,rfl⟩ theorem circleMeasure_haar:Measure.IsHaarMeasure (circleMeasure ι):=by letI:=circleHaar_isHaarMeasure letI:=torusHaar_isHaarMeasure ι unfold circleMeasure infer_instance private def zz1873:"s0751"="s0751":=by decide+kernel theorem splitOption_measurePreserving : MeasurePreserving (splitOption (ι:=ι)) (torusHaar (Option ι)) (circleMeasure ι):=by letI:=torusHaar_isHaarMeasure (Option ι) letI:=torusHaar_isProbabilityMeasure (Option ι) letI:=circleMeasure_haar (ι:=ι) letI:=circleMeasure_probability (ι:=ι) exact MonoidHom.measurePreserving splitOption_continuous splitOption_surjective (by simp) theorem integral_splitOption (L:CircleSpace ι → ℂ) (hL:Continuous L) : (∫ z,L (splitOption z) ∂torusHaar (Option ι)) = ∫ z,L z ∂circleMeasure ι:=by have h:=integral_map (μ:=torusHaar (Option ι)) splitOption_continuous.measurable.aemeasurable hL.aestronglyMeasurable rw [splitOption_measurePreserving.map_eq] at h exact h.symm theorem integral_pair_splitOption (K:CircleSpace ι × CircleSpace ι → ℂ) (hK:Continuous K) : (∫ yz,K (splitOption yz.1,splitOption yz.2) ∂pairHaar) = ∫ yz,K yz ∂(circleMeasure ι).prod (circleMeasure ι):=by letI:=torusHaar_isProbabilityMeasure (Option ι) letI:=circleMeasure_probability (ι:=ι) have hp:=(splitOption_measurePreserving (ι:=ι)).prod (splitOption_measurePreserving (ι:=ι)) have h:=integral_map (μ:=(torusHaar (Option ι)).prod (torusHaar (Option ι))) hp.measurable.aemeasurable hK.aestronglyMeasurable rw [hp.map_eq] at h exact h.symm noncomputable def productOrbit (w:ι → ℤ) (z:Circle):CircleSpace ι:=(z,orbit w z) omit [Fintype ι] in theorem productOrbit_continuous (w:ι → ℤ):Continuous (productOrbit w) := continuous_id.prodMk (orbit_continuous w) private def zz1874:"s0752"="s0752":=by decide+kernel omit [Fintype ι] in theorem productOrbit_div (w:ι → ℤ) (z y:Circle) : productOrbit w (z / y) = productOrbit w z / productOrbit w y:=by change (z / y,orbit w (z / y)) = (z / y,orbit w z / orbit w y) rw [orbit_div] theorem exists_joint_approximation_complex (r:ℕ) (F:Fin r → CircleSpace ι → ℂ) (hF:∀ i,Continuous (F i)) (K:CircleSpace ι × CircleSpace ι → ℂ) (hK:Continuous K) {ε:ℝ} (hε:0 < ε) : ∃ w:ι → ℤ, (∀ i, ‖(∫ z,F i (productOrbit w z) ∂circleHaar) - ∫ z,F i z ∂circleMeasure ι‖ ≤ 2 * ε) ∧ ‖(∫ yz,K (productOrbit w yz.1,productOrbit w yz.2) ∂circleHaar.prod circleHaar) - ∫ yz,K yz ∂(circleMeasure ι).prod (circleMeasure ι)‖ ≤ 2 * ε:=by obtain ⟨w,hw,hmass,hcount⟩:=exists_joint_approximation_pivot_one (none:Option ι) r (fun i z => F i (splitOption z)) (fun i => (hF i).comp splitOption_continuous) (fun yz => K (splitOption yz.1,splitOption yz.2)) (hK.comp (splitOption_continuous.prodMap splitOption_continuous)) hε have ho (z:Circle):splitOption (orbit w z) = productOrbit (fun i => w (some i)) z:=by apply Prod.ext · change z ^ w none = z rw [hw,zpow_one] · rfl refine ⟨fun i => w (some i), ?_, ?_⟩ · intro i simpa only [ho,integral_splitOption (F i) (hF i)] using hmass i · simpa only [pairOrbit,ho,integral_pair_splitOption K hK] using hcount theorem exists_joint_approximation (r:ℕ) (F:Fin r → CircleSpace ι → ℝ) (hF:∀ i,Continuous (F i)) (K:CircleSpace ι × CircleSpace ι → ℝ) (hK:Continuous K) {ε:ℝ} (hε:0 < ε) : ∃ w:ι → ℤ, (∀ i, |(∫ z,F i (productOrbit w z) ∂circleHaar) - ∫ z,F i z ∂circleMeasure ι| ≤ 2 * ε) ∧ |(∫ yz,K (productOrbit w yz.1,productOrbit w yz.2) ∂circleHaar.prod circleHaar) - ∫ yz,K yz ∂(circleMeasure ι).prod (circleMeasure ι)| ≤ 2 * ε:=by obtain ⟨w,hm,hc⟩:=exists_joint_approximation_complex r (fun i z => (F i z:ℂ)) (fun i => Complex.continuous_ofReal.comp (hF i)) (fun yz => (K yz:ℂ)) (Complex.continuous_ofReal.comp hK) hε refine ⟨w, ?_, ?_⟩ · intro i simpa only [integral_complex_ofReal, ← Complex.ofReal_sub,Complex.norm_real,Real.norm_eq_abs] using hm i · simpa only [integral_complex_ofReal, ← Complex.ofReal_sub,Complex.norm_real,Real.norm_eq_abs] using hc end Green24Proof.CircleProductOrbit private def zz2442:"s098a"="s098a":=by decide+kernel end section namespace Green24Proof.RealLatticeRiemannSums open MeasureTheory Set Filter open scoped BigOperators Topology Pointwise noncomputable def lineGrid (n M:ℕ):Finset ℝ:=by classical exact (Finset.Icc (-(M * n:ℤ)) (M * n)).image (fun k:ℤ => (k:ℝ) / n) theorem mem_lineGrid {n M:ℕ} (hn:0 < n) {x:ℝ} : x ∈ lineGrid n M ↔ x ∈ Icc (-(M:ℝ)) M ∧ (n:ℝ) * x ∈ Set.range (algebraMap ℤ ℝ):=by classical have hn':(0:ℝ) < n:=by exact_mod_cast hn constructor · intro hx obtain ⟨k,hk,rfl⟩:=Finset.mem_image.mp hx have hlo':-((M:ℝ) * n) ≤ k:=by exact_mod_cast (Finset.mem_Icc.mp hk).1 have hlo:-(M:ℝ) * n ≤ k:=by simpa only [neg_mul] using hlo' have hhi:(k:ℝ) ≤ M * n:=by exact_mod_cast (Finset.mem_Icc.mp hk).2 refine ⟨⟨(le_div_iff₀ hn').mpr hlo,(div_le_iff₀ hn').mpr hhi⟩,k, ?_⟩ simp only [eq_intCast] field_simp · rintro ⟨hx,k,hk⟩ have hk':(k:ℝ) = n * x:=by simpa only [eq_intCast] using hk apply Finset.mem_image.mpr refine ⟨k,Finset.mem_Icc.mpr ⟨?_, ?_⟩, ?_⟩ · have h:-((M:ℝ) * n) ≤ k:=by rw [hk']; nlinarith [hx.1] exact_mod_cast h · have h:(k:ℝ) ≤ M * n:=by rw [hk']; nlinarith [hx.2] exact_mod_cast h · rw [hk'] field_simp private def zz1875:"s0753"="s0753":=by decide+kernel theorem sub_mem_lineGrid {n M:ℕ} (hn:0 < n) {y z:ℝ} (hy:y ∈ lineGrid n M) (hz:z ∈ lineGrid n M):z - y ∈ lineGrid n (2 * M):=by obtain ⟨hyb,a,ha⟩:=(mem_lineGrid hn).mp hy obtain ⟨hzb,b,hb⟩:=(mem_lineGrid hn).mp hz apply (mem_lineGrid hn).mpr refine ⟨⟨?_, ?_⟩,b - a, ?_⟩ · push_cast linarith [hyb.2,hzb.1] · push_cast linarith [hyb.1,hzb.2] · simp only [map_sub,ha,hb] ring variable {ι:Type*} [Fintype ι] [DecidableEq ι] noncomputable def piGrid (n M:ℕ):Finset (ι → ℝ) := Fintype.piFinset (fun _ => lineGrid n M) def cube (M:ℕ):Set (ι → ℝ):=Icc (fun _ => -(M:ℝ)) (fun _ => (M:ℝ)) theorem piGrid_eq_lattice {n:ℕ} (hn:0 < n) (M:ℕ) : (piGrid (ι:=ι) n M:Set (ι → ℝ)) = cube M ∩ (n:ℝ)⁻¹ • (Submodule.span ℤ (Set.range (Pi.basisFun ℝ ι)):Set (ι → ℝ)):=by let:NeZero n:=⟨Nat.ne_of_gt hn⟩ ext v have hlat:v ∈ (n:ℝ)⁻¹ • (Submodule.span ℤ (Set.range (Pi.basisFun ℝ ι)):Set (ι → ℝ)) ↔ ∀ i,(n:ℝ) * v i ∈ Set.range (algebraMap ℤ ℝ):=by rw [← Submodule.coe_pointwise_smul] exact BoxIntegral.unitPartition.mem_smul_span_iff rw [Finset.mem_coe,piGrid,Fintype.mem_piFinset,mem_inter_iff,hlat] simp only [mem_lineGrid hn,cube,mem_Icc,Pi.le_def] aesop theorem lattice_sum_eq_piGrid {n:ℕ} (hn:0 < n) (M:ℕ) (F:(ι → ℝ) → ℝ) : (∑' v:↑(cube (ι:=ι) M ∩ (n:ℝ)⁻¹ • (Submodule.span ℤ (Set.range (Pi.basisFun ℝ ι)):Set (ι → ℝ))),F v) = ∑ v ∈ piGrid n M,F v:=by classical rw [← piGrid_eq_lattice hn M] rw [tsum_fintype,Finset.sum_set_coe] congr 1 ext v simp theorem tendsto_piGrid_sum (M:ℕ) (F:(ι → ℝ) → ℝ) (hF:Continuous F) : Tendsto (fun n:ℕ => (∑ v ∈ piGrid n M,F v) / (n:ℝ) ^ Fintype.card ι) atTop (𝓝 (∫ v in cube M,F v)):=by have h:=tendsto_tsum_div_pow_atTop_integral (cube (ι:=ι) M) F hF (isCompact_Icc.isBounded) measurableSet_Icc ((convex_Icc _ _).addHaar_frontier volume) apply h.congr' filter_upwards [eventually_gt_atTop (0:ℕ)] with n hn rw [lattice_sum_eq_piGrid hn M] end Green24Proof.RealLatticeRiemannSums private def zz2443:"s098b"="s098b":=by decide+kernel end section namespace Green24Proof.RealGridIntegralLimits open MeasureTheory Set Filter open scoped BigOperators Topology open Green24Proof.RealLatticeRiemannSums private def zz1876:"s0754"="s0754":=by decide+kernel theorem mem_cube_one (M:ℕ) (v:Fin 1 → ℝ) : v ∈ cube M ↔ v 0 ∈ Icc (-(M:ℝ)) M:=by simp only [cube,mem_Icc,Pi.le_def,Fin.forall_fin_one] theorem mem_cube_two (M:ℕ) (v:Fin 2 → ℝ) : v ∈ cube M ↔ (v 0,v 1) ∈ Icc (-(M:ℝ)) M ×ˢ Icc (-(M:ℝ)) M:=by simp only [cube,mem_Icc,Pi.le_def,Fin.forall_fin_two,mem_prod] tauto theorem piGrid_sum_one (n M:ℕ) (f:ℝ → ℝ) : (∑ v ∈ piGrid (ι:=Fin 1) n M,f (v 0)) = ∑ x ∈ lineGrid n M,f x:=by classical refine Finset.sum_bij (fun v _ => v 0) ?_ ?_ ?_ ?_ · intro v hv exact Fintype.mem_piFinset.mp hv 0 · intro v _ w _ hvw funext i have hi:i = 0:=Subsingleton.elim _ _ simpa only [hi] using hvw · intro x hx refine ⟨fun _ => x,Fintype.mem_piFinset.mpr (fun _ => hx),rfl⟩ · intro v _ rfl theorem piGrid_sum_two (n M:ℕ) (K:ℝ × ℝ → ℝ) : (∑ v ∈ piGrid (ι:=Fin 2) n M,K (v 0,v 1)) = ∑ y ∈ lineGrid n M, ∑ z ∈ lineGrid n M,K (y,z):=by classical rw [← Finset.sum_product] refine Finset.sum_bij (fun v _ => (v 0,v 1)) ?_ ?_ ?_ ?_ · intro v hv exact Finset.mem_product.mpr ⟨Fintype.mem_piFinset.mp hv 0,Fintype.mem_piFinset.mp hv 1⟩ · intro v _ w _ hvw funext i fin_cases i · exact congrArg Prod.fst hvw · exact congrArg Prod.snd hvw · intro yz hyz refine ⟨![yz.1,yz.2], ?_,rfl⟩ apply Fintype.mem_piFinset.mpr intro i fin_cases i · exact (Finset.mem_product.mp hyz).1 · exact (Finset.mem_product.mp hyz).2 · intro v _ rfl private def zz1877:"s0755"="s0755":=by decide+kernel theorem integral_pi_one (f:ℝ → ℝ):(∫ v:Fin 1 → ℝ,f (v 0)) = ∫ x,f x:=by exact (volume_preserving_piUnique (fun _:Fin 1 => ℝ)).integral_comp (MeasurableEquiv.piUnique (fun _:Fin 1 => ℝ)).measurableEmbedding f theorem integral_pi_two (K:ℝ × ℝ → ℝ) : (∫ v:Fin 2 → ℝ,K (v 0,v 1)) = ∫ yz,K yz:=by exact (volume_preserving_piFinTwo (fun _ => ℝ)).integral_comp (MeasurableEquiv.piFinTwo (fun _ => ℝ)).measurableEmbedding K theorem tendsto_piGrid_sum_full {ι:Type*} [Fintype ι] [DecidableEq ι] (M:ℕ) (F:(ι → ℝ) → ℝ) (hF:Continuous F) (hs:∀ v,v ∉ cube M → F v = 0) : Tendsto (fun n:ℕ => (∑ v ∈ piGrid n M,F v) / (n:ℝ) ^ Fintype.card ι) atTop (𝓝 (∫ v,F v)):=by have h:=tendsto_piGrid_sum M F hF rwa [setIntegral_eq_integral_of_forall_compl_eq_zero hs] at h theorem tendsto_lineGrid_sum (M:ℕ) (f:ℝ → ℝ) (hf:Continuous f) (hs:∀ x,x ∉ Icc (-(M:ℝ)) M → f x = 0) : Tendsto (fun n:ℕ => (∑ x ∈ lineGrid n M,f x) / (n:ℝ)) atTop (𝓝 (∫ x,f x)):=by have h:=tendsto_piGrid_sum_full M (fun v:Fin 1 → ℝ => f (v 0)) (hf.comp (continuous_apply 0)) (fun v hv => hs (v 0) (by simpa only [mem_cube_one] using hv)) simpa only [piGrid_sum_one,Fintype.card_fin,pow_one,integral_pi_one] using h private def zz1878:"s0756"="s0756":=by decide+kernel theorem tendsto_pairGrid_sum (M:ℕ) (K:ℝ × ℝ → ℝ) (hK:Continuous K) (hs:∀ yz,yz ∉ Icc (-(M:ℝ)) M ×ˢ Icc (-(M:ℝ)) M → K yz = 0) : Tendsto (fun n:ℕ => (∑ y ∈ lineGrid n M, ∑ z ∈ lineGrid n M,K (y,z)) / (n:ℝ) ^ 2) atTop (𝓝 (∫ yz,K yz)):=by have h:=tendsto_piGrid_sum_full M (fun v:Fin 2 → ℝ => K (v 0,v 1)) (hK.comp ((continuous_apply 0).prodMk (continuous_apply 1))) (fun v hv => hs (v 0,v 1) (by simpa only [mem_cube_two] using hv)) simpa only [piGrid_sum_two,Fintype.card_fin,integral_pi_two] using h end Green24Proof.RealGridIntegralLimits private def zz2444:"s098c"="s098c":=by decide+kernel end section namespace Green24Proof.FiniteThreeSetChains open Finset open scoped BigOperators def chainIndex {a b:ℕ} (p:Fin a × Fin b):ℕ := min p.1.val (b - 1 - p.2.val) theorem chainIndex_lt {a b:ℕ} (p:Fin a × Fin b) : chainIndex p < min a b:=by dsimp [chainIndex] have:=p.1.isLt have:=p.2.isLt omega theorem chain_comparable {a b:ℕ} {p q:Fin a × Fin b} (h:chainIndex p = chainIndex q) (hpq:p.1 < q.1):p.2 ≤ q.2:=by have hp:=p.2.isLt have hq:=q.2.isLt change p.1.val < q.1.val at hpq change p.2.val ≤ q.2.val dsimp [chainIndex] at h omega theorem addition_injective_on_chain {a b:ℕ} (f:Fin a ↪o ℝ) (g:Fin b ↪o ℝ) (i:ℕ) : Set.InjOn (fun p:Fin a × Fin b => f p.1 + g p.2) {p | chainIndex p = i}:=by intro p hp q hq heq have hidx:chainIndex p = chainIndex q:=hp.trans hq.symm rcases lt_trichotomy p.1 q.1 with h | h | h · have h1:=f.strictMono h have h2:=g.monotone (chain_comparable hidx h) linarith · have h2:p.2 = q.2:=g.injective (by simpa [h] using heq) exact Prod.ext h h2 · have h1:=f.strictMono h have h2:=g.monotone (chain_comparable hidx.symm h) linarith private def zz1879:"s0757"="s0757":=by decide+kernel theorem chain_card_le {a b:ℕ} (i:ℕ) : (univ.filter (fun p:Fin a × Fin b => chainIndex p = i)).card ≤ a + b - 2 * i - 1:=by classical let S:=univ.filter (fun p:Fin a × Fin b => chainIndex p = i) have h:=card_le_card_of_injOn (s:=S) (t:=range (a + b - 2 * i - 1)) (fun p => p.1.val + p.2.val - i) ?_ ?_ · simpa using h · intro p hp have hpi:chainIndex p = i:=(mem_filter.mp hp).2 have hp1:=p.1.isLt have hp2:=p.2.isLt change p.1.val + p.2.val - i ∈ range (a + b - 2 * i - 1) apply mem_range.mpr dsimp [chainIndex] at hpi omega · intro p hp q hq heq have hpi:chainIndex p = i:=(mem_filter.mp hp).2 have hqi:chainIndex q = i:=(mem_filter.mp hq).2 have hp1:=p.1.isLt have hp2:=p.2.isLt have hq1:=q.1.isLt have hq2:=q.2.isLt dsimp [chainIndex] at hpi hqi apply Prod.ext <;> apply Fin.ext <;> dsimp at * <;> omega theorem ordered_three_set_bound {a b:ℕ} (f:Fin a ↪o ℝ) (g:Fin b ↪o ℝ) (C:Finset ℝ) : (univ.filter (fun p:Fin a × Fin b => f p.1 + g p.2 ∈ C)).card ≤ ∑ i ∈ range (min a b),min C.card (a + b - 2 * i - 1):=by classical let S:=univ.filter (fun p:Fin a × Fin b => f p.1 + g p.2 ∈ C) have hpartition:S.card = ∑ i ∈ range (min a b), (S.filter (fun p => chainIndex p = i)).card:=by exact card_eq_sum_card_fiberwise (fun p _ => mem_range.mpr (chainIndex_lt p)) rw [show (univ.filter (fun p:Fin a × Fin b => f p.1 + g p.2 ∈ C)).card = S.card from rfl,hpartition] apply sum_le_sum intro i _hi apply le_min · apply card_le_card_of_injOn (fun p => f p.1 + g p.2) · intro p hp exact (mem_filter.mp (mem_filter.mp hp).1).2 · intro p hp q hq heq exact addition_injective_on_chain f g i (mem_filter.mp hp).2 (mem_filter.mp hq).2 heq · exact (card_le_card (show S.filter (fun p => chainIndex p = i) ⊆ univ.filter (fun p => chainIndex p = i) from fun p hp => mem_filter.mpr ⟨mem_univ _,(mem_filter.mp hp).2⟩)).trans (chain_card_le i) theorem three_set_chain_bound (A B C:Finset ℝ) : ((A ×ˢ B).filter (fun p => p.1 + p.2 ∈ C)).card ≤ ∑ i ∈ range (min A.card B.card),min C.card (A.card + B.card - 2 * i - 1):=by classical let f:=A.orderEmbOfFin rfl let g:=B.orderEmbOfFin rfl have heq:(univ.filter (fun p:Fin A.card × Fin B.card => f p.1 + g p.2 ∈ C)).card = ((A ×ˢ B).filter (fun p => p.1 + p.2 ∈ C)).card:=by apply card_bij (fun p _ => (f p.1,g p.2)) · intro p hp exact mem_filter.mpr ⟨mem_product.mpr ⟨A.orderEmbOfFin_mem rfl _, B.orderEmbOfFin_mem rfl _⟩,(mem_filter.mp hp).2⟩ · intro p _ q _ hpq exact Prod.ext (f.injective (congrArg Prod.fst hpq)) (g.injective (congrArg Prod.snd hpq)) · intro p hp obtain ⟨hpAB,hpC⟩:=mem_filter.mp hp obtain ⟨hpA,hpB⟩:=mem_product.mp hpAB obtain ⟨i,hi⟩:∃ i,f i = p.1:=by have h:=A.range_orderEmbOfFin rfl change p.1 ∈ (A:Set ℝ) at hpA rw [← h] at hpA exact hpA obtain ⟨j,hj⟩:∃ j,g j = p.2:=by have h:=B.range_orderEmbOfFin rfl change p.2 ∈ (B:Set ℝ) at hpB rw [← h] at hpB exact hpB exact ⟨(i,j),mem_filter.mpr ⟨mem_univ _,by simpa [hi,hj] using hpC⟩, by simp [hi,hj]⟩ rw [← heq] exact ordered_three_set_bound f g C end Green24Proof.FiniteThreeSetChains private def zz2445:"s098d"="s098d":=by decide+kernel end section namespace Green24Proof.ThreeSetChainArithmetic open Finset open scoped BigOperators theorem sum_linear (n:ℕ) (x:ℝ) : (∑ i ∈ range n,(x - 2 * i - 1)) = n * (x - n):=by induction n with | zero => simp | succ n ih => rw [sum_range_succ,ih] push_cast ring private def zz1880:"s0758"="s0758":=by decide+kernel theorem capped_sum_le_quadratic (n k:ℕ) (hk:k ≤ n) (x c:ℝ) : (∑ i ∈ range n,min c (x - 2 * i - 1)) ≤ n * (x - n) - k * (x - c - k):=by have hsplit:=sum_range_add (fun i:ℕ => min c (x - 2 * i - 1)) k (n - k) rw [Nat.add_sub_of_le hk] at hsplit rw [hsplit] calc _ ≤ (∑ _i ∈ range k,c) + ∑ i ∈ range (n - k),(x - 2 * (k + i:ℕ) - 1):=by exact add_le_add (sum_le_sum (fun _ _ => min_le_left _ _)) (sum_le_sum (fun _ _ => min_le_right _ _)) _ = (k:ℝ) * c + (n - k:ℕ) * (x - 2 * k - (n - k:ℕ)):=by simp only [sum_const,card_range,nsmul_eq_mul] congr 1 convert sum_linear (n - k) (x - 2 * k) using 1 apply sum_congr rfl intro i _ push_cast ring _ = _:=by rw [Nat.cast_sub hk]; ring theorem chain_sum_le_kernel (a b c:ℕ) : (∑ i ∈ range (min a b),(min c (a + b - 2 * i - 1):ℕ):ℝ) ≤ kernel a b c + 1 / 4:=by have hcast : (∑ i ∈ range (min a b),(min c (a + b - 2 * i - 1):ℕ):ℝ) = ∑ i ∈ range (min a b),min (c:ℝ) ((a:ℝ) + b - 2 * i - 1):=by apply sum_congr rfl intro i hi have hi':=mem_range.mp hi rw [Nat.cast_min,Nat.cast_sub (by omega),Nat.cast_sub (by omega)] push_cast rfl rw [hcast] have hbase:((min a b:ℕ):ℝ) * ((a:ℝ) + b - (min a b:ℕ)) = (a:ℝ) * b:=by rcases le_total a b with h | h · rw [min_eq_left h] ring · rw [min_eq_right h] ring have hquad (k:ℕ) (hk:k ≤ min a b) : (∑ i ∈ range (min a b),min (c:ℝ) ((a:ℝ) + b - 2 * i - 1)) ≤ (a:ℝ) * b - k * ((a:ℝ) + b - c - k):=by simpa only [hbase] using capped_sum_le_quadratic (min a b) k hk ((a:ℝ) + b) c by_cases hc:a + b ≤ c · have hc':(a:ℝ) + b ≤ c:=by exact_mod_cast hc rw [kernel_eq_product (Nat.cast_nonneg _) (Nat.cast_nonneg _) hc'] have h:=hquad 0 (Nat.zero_le _) norm_num at h linarith by_cases ha:b + c ≤ a · have hab:b ≤ a:=by omega have ha':(b:ℝ) + c ≤ a:=by exact_mod_cast ha rw [kernel_cycle,kernel_eq_product (Nat.cast_nonneg _) (Nat.cast_nonneg _) ha'] have h:=hquad b (by omega) nlinarith by_cases hb:a + c ≤ b · have hab:a ≤ b:=by omega have hb':(a:ℝ) + c ≤ b:=by exact_mod_cast hb rw [kernel_swap23,kernel_eq_product (Nat.cast_nonneg _) (Nat.cast_nonneg _) hb'] have h:=hquad a (by omega) nlinarith have hat:(a:ℝ) ≤ b + c:=by exact_mod_cast (show a ≤ b + c by omega) have hbt:(b:ℝ) ≤ a + c:=by exact_mod_cast (show b ≤ a + c by omega) have hct:(c:ℝ) ≤ a + b:=by exact_mod_cast (show c ≤ a + b by omega) rw [kernel_eq_triangle hat hbt hct] let k:=(a + b - c) / 2 have hk:k ≤ min a b:=by dsimp [k]; omega have h:=hquad k hk have hklo:2 * k ≤ a + b - c:=by dsimp [k]; omega have hkhi:a + b - c ≤ 2 * k + 1:=by dsimp [k]; omega have hlo:0 ≤ (a:ℝ) + b - c - 2 * k:=by have h':2 * k + c ≤ a + b:=by omega exact_mod_cast (show (0:ℤ) ≤ (a:ℤ) + b - c - 2 * k by omega) have hhi:(a:ℝ) + b - c - 2 * k ≤ 1:=by have h':a + b ≤ 2 * k + 1 + c:=by omega exact_mod_cast (show (a:ℤ) + b - c - 2 * k ≤ 1 by omega) nlinarith [mul_nonneg hlo (sub_nonneg.mpr hhi)] end Green24Proof.ThreeSetChainArithmetic private def zz2446:"s098e"="s098e":=by decide+kernel end section namespace Green24Proof.FiniteThreeSetRearrangement open Finset open scoped BigOperators theorem three_set_bound (A B C:Finset ℝ) : (((A ×ˢ B).filter (fun p => p.1 + p.2 ∈ C)).card:ℝ) ≤ kernel A.card B.card C.card + 1 / 4:=by have h:=FiniteThreeSetChains.three_set_chain_bound A B C have h':(((A ×ˢ B).filter (fun p => p.1 + p.2 ∈ C)).card:ℝ) ≤ ∑ i ∈ range (min A.card B.card), ((min C.card (A.card + B.card - 2 * i - 1):ℕ):ℝ):=by exact_mod_cast h exact h'.trans (ThreeSetChainArithmetic.chain_sum_le_kernel A.card B.card C.card) theorem three_set_sum_bound (A B C:Finset ℝ) : (∑ x ∈ A, ∑ y ∈ B, ∑ z ∈ C,if x + y = z then (1:ℝ) else 0) ≤ kernel A.card B.card C.card + 1 / 4:=by classical have h:(∑ x ∈ A, ∑ y ∈ B, ∑ z ∈ C,if x + y = z then (1:ℝ) else 0) = (((A ×ˢ B).filter (fun p => p.1 + p.2 ∈ C)).card:ℝ):=by simp only [sum_ite_eq] rw [← sum_product A B (fun p:ℝ × ℝ => if p.1 + p.2 ∈ C then (1:ℝ) else 0)] simp only [← sum_filter,sum_const,nsmul_eq_mul,mul_one] rw [h] exact three_set_bound A B C end Green24Proof.FiniteThreeSetRearrangement private def zz2447:"s098f"="s098f":=by decide+kernel end section namespace Green24Proof.FiniteWeightRounding open Finset open scoped BigOperators private def zz1881:"s0759"="s0759":=by decide+kernel theorem exists_top_subset {ι:Type*} [DecidableEq ι] (S:Finset ι) (v:ι → ℝ) (k:ℕ) (hk:k ≤ S.card) : ∃ T ⊆ S,T.card = k ∧ ∀ i ∈ T, ∀ j ∈ S \ T,v j ≤ v i:=by induction k generalizing S with | zero => exact ⟨∅,empty_subset _,rfl,by simp⟩ | succ k ih => have hS:S.Nonempty:=card_pos.mp (by omega) obtain ⟨x,hx,hmax⟩:=S.exists_max_image v hS obtain ⟨T,hT,hcard,htop⟩:=ih (S.erase x) (by rw [card_erase_of_mem hx]; omega) have hxT:x ∉ T:=fun h => (mem_erase.mp (hT h)).1 rfl refine ⟨insert x T,insert_subset hx (hT.trans (erase_subset _ _)), by rw [card_insert_of_notMem hxT,hcard], ?_⟩ intro i hi j hj obtain ⟨hjS,hjout⟩:=mem_sdiff.mp hj rcases mem_insert.mp hi with rfl | hiT · exact hmax j hjS · apply htop i hiT j exact mem_sdiff.mpr ⟨mem_erase.mpr ⟨by intro heq subst j exact hjout (mem_insert_self _ _),hjS⟩, fun hjT => hjout (mem_insert_of_mem hjT)⟩ theorem exists_rounding_of_mass_le {ι:Type*} [DecidableEq ι] (S:Finset ι) (w v:ι → ℝ) (k:ℕ) (hw:∀ i ∈ S,w i ∈ Set.Icc 0 1) (hv:∀ i ∈ S,0 ≤ v i) (hmass:∑ i ∈ S,w i ≤ k) : ∃ T ⊆ S,T.card ≤ k ∧ (∑ i ∈ S,w i * v i) ≤ ∑ i ∈ T,v i:=by by_cases hSk:S.card ≤ k · refine ⟨S,Subset.refl _,hSk,sum_le_sum ?_⟩ intro i hi exact mul_le_of_le_one_left (hv i hi) (hw i hi).2 have hkS:k ≤ S.card:=by omega by_cases hk0:k = 0 · have hw0 (i:ι) (hi:i ∈ S):w i = 0:=by have h:=single_le_sum (fun j hj => (hw j hj).1) hi simp only [hk0,Nat.cast_zero] at hmass linarith [(hw i hi).1] refine ⟨∅,empty_subset _,by simp, ?_⟩ simp only [sum_empty] apply sum_nonpos intro i hi rw [hw0 i hi,zero_mul] obtain ⟨T,hTS,hcard,htop⟩:=exists_top_subset S v k hkS obtain ⟨i₀,hi₀,hmin⟩:=T.exists_min_image v (card_pos.mp (by omega)) have hm0:0 ≤ v i₀:=hv i₀ (hTS hi₀) have hin:(∑ i ∈ T,w i * v i) ≤ (∑ i ∈ T,v i) + v i₀ * ((∑ i ∈ T,w i) - k):=by calc _ ≤ ∑ i ∈ T,(v i + v i₀ * (w i - 1)):=by apply sum_le_sum intro i hi have hwi:=hw i (hTS hi) have hvi:=hmin i hi nlinarith [mul_nonneg (sub_nonneg.mpr hwi.2) (sub_nonneg.mpr hvi)] _ = _:=by simp [sum_add_distrib, ← mul_sum,sum_sub_distrib,hcard] have hout:(∑ i ∈ S \ T,w i * v i) ≤ v i₀ * ∑ i ∈ S \ T,w i:=by calc _ ≤ ∑ i ∈ S \ T,w i * v i₀:=by apply sum_le_sum intro i hi exact mul_le_mul_of_nonneg_left (htop i₀ hi₀ i hi) (hw i (mem_sdiff.mp hi).1).1 _ = _:=by rw [← sum_mul]; ring refine ⟨T,hTS,hcard.le, ?_⟩ have hsumw:=sum_sdiff hTS (f:=w) have hsumwv:=sum_sdiff hTS (f:=fun i => w i * v i) nlinarith [mul_nonneg hm0 (sub_nonneg.mpr hmass)] theorem exists_rounding {ι:Type*} [DecidableEq ι] (S:Finset ι) (w v:ι → ℝ) (hw:∀ i ∈ S,w i ∈ Set.Icc 0 1) (hv:∀ i ∈ S,0 ≤ v i) : ∃ T ⊆ S,(T.card:ℝ) ≤ (∑ i ∈ S,w i) + 1 ∧ (∑ i ∈ S,w i * v i) ≤ ∑ i ∈ T,v i:=by obtain ⟨T,hTS,hcard,hval⟩:=exists_rounding_of_mass_le S w v ⌈∑ i ∈ S,w i⌉₊ hw hv (Nat.le_ceil _) refine ⟨T,hTS, ?_,hval⟩ have h:=Nat.ceil_lt_add_one (sum_nonneg (fun i hi => (hw i hi).1)) exact (Nat.cast_le.mpr hcard).trans h.le end Green24Proof.FiniteWeightRounding private def zz2448:"s0990"="s0990":=by decide+kernel end section namespace Green24Proof.TrilinearWeightRounding open Finset open scoped BigOperators open Green24Proof.FiniteWeightRounding theorem exists_trilinear_rounding {α β γ:Type*} [DecidableEq α] [DecidableEq β] [DecidableEq γ] (A:Finset α) (B:Finset β) (C:Finset γ) (f:α → ℝ) (g:β → ℝ) (h:γ → ℝ) (K:α → β → γ → ℝ) (hf:∀ x ∈ A,f x ∈ Set.Icc 0 1) (hg:∀ y ∈ B,g y ∈ Set.Icc 0 1) (hh:∀ z ∈ C,h z ∈ Set.Icc 0 1) (hK:∀ x ∈ A, ∀ y ∈ B, ∀ z ∈ C,0 ≤ K x y z) : ∃ A' ⊆ A, ∃ B' ⊆ B, ∃ C' ⊆ C, (A'.card:ℝ) ≤ (∑ x ∈ A,f x) + 1 ∧ (B'.card:ℝ) ≤ (∑ y ∈ B,g y) + 1 ∧ (C'.card:ℝ) ≤ (∑ z ∈ C,h z) + 1 ∧ (∑ x ∈ A, ∑ y ∈ B, ∑ z ∈ C,f x * g y * h z * K x y z) ≤ ∑ x ∈ A', ∑ y ∈ B', ∑ z ∈ C',K x y z:=by obtain ⟨A',hA',hAm,hAv⟩:=exists_rounding A f (fun x => ∑ y ∈ B, ∑ z ∈ C,g y * h z * K x y z) hf (by intro x hx exact sum_nonneg (fun y hy => sum_nonneg (fun z hz => mul_nonneg (mul_nonneg (hg y hy).1 (hh z hz).1) (hK x hx y hy z hz)))) obtain ⟨B',hB',hBm,hBv⟩:=exists_rounding B g (fun y => ∑ x ∈ A', ∑ z ∈ C,h z * K x y z) hg (by intro y hy exact sum_nonneg (fun x hx => sum_nonneg (fun z hz => mul_nonneg (hh z hz).1 (hK x (hA' hx) y hy z hz)))) obtain ⟨C',hC',hCm,hCv⟩:=exists_rounding C h (fun z => ∑ x ∈ A', ∑ y ∈ B',K x y z) hh (by intro z hz exact sum_nonneg (fun x hx => sum_nonneg (fun y hy => hK x (hA' hx) y (hB' hy) z hz))) refine ⟨A',hA',B',hB',C',hC',hAm,hBm,hCm, ?_⟩ calc _ = ∑ x ∈ A,f x * (∑ y ∈ B, ∑ z ∈ C,g y * h z * K x y z):=by simp only [mul_sum,mul_assoc] _ ≤ ∑ x ∈ A', ∑ y ∈ B, ∑ z ∈ C,g y * h z * K x y z:=hAv _ = ∑ y ∈ B,g y * (∑ x ∈ A', ∑ z ∈ C,h z * K x y z):=by rw [sum_comm] simp only [mul_sum,mul_assoc] _ ≤ ∑ y ∈ B', ∑ x ∈ A', ∑ z ∈ C,h z * K x y z:=hBv _ = ∑ z ∈ C,h z * (∑ x ∈ A', ∑ y ∈ B',K x y z):=by rw [sum_comm] simp_rw [sum_comm (s:=B') (t:=C)] rw [sum_comm] simp only [mul_sum] _ ≤ ∑ z ∈ C', ∑ x ∈ A', ∑ y ∈ B',K x y z:=hCv _ = _:=by rw [sum_comm] apply sum_congr rfl intro x _ rw [sum_comm] end Green24Proof.TrilinearWeightRounding private def zz2449:"s0991"="s0991":=by decide+kernel end section namespace Green24Proof.KernelMonotonicity private def zz1882:"s075a"="s075a":=by decide+kernel theorem mono_first {a a' b c:ℝ} (ha:0 ≤ a) (haa:a ≤ a') (hb:0 ≤ b) (hc:0 ≤ c):kernel a b c ≤ kernel a' b c:=by have h:0 ≤ ∫ t in a..a',kernelSlope t b c:=by apply intervalIntegral.integral_nonneg_of_forall haa intro t exact le_min hb (le_min hc (le_max_right _ _)) rw [kernel_integral_slope ha haa hb hc] at h linarith theorem mono_second {a b b' c:ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hbb:b ≤ b') (hc:0 ≤ c):kernel a b c ≤ kernel a b' c:=by rw [kernel_swap12 a b c,kernel_swap12 a b' c] exact mono_first hb hbb ha hc theorem mono_third {a b c c':ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) (hcc:c ≤ c'):kernel a b c ≤ kernel a b c':=by rw [kernel_swap23 a b c,kernel_swap23 a b c'] exact mono_second ha hc hcc hb theorem mono {a b c a' b' c':ℝ} (ha:0 ≤ a) (hb:0 ≤ b) (hc:0 ≤ c) (haa:a ≤ a') (hbb:b ≤ b') (hcc:c ≤ c') : kernel a b c ≤ kernel a' b' c' := (mono_first ha haa hb hc).trans ((mono_second (ha.trans haa) hb hbb hc).trans (mono_third (ha.trans haa) (hb.trans hbb) hc hcc)) end Green24Proof.KernelMonotonicity private def zz2450:"s0992"="s0992":=by decide+kernel end section namespace Green24Proof.WeightedThreeSetRearrangement open Finset Filter open scoped BigOperators Topology private def zz1883:"s075b"="s075b":=by decide+kernel theorem weighted_three_set_bound (A B C:Finset ℝ) (f g h:ℝ → ℝ) (hf:∀ x ∈ A,f x ∈ Set.Icc 0 1) (hg:∀ y ∈ B,g y ∈ Set.Icc 0 1) (hh:∀ z ∈ C,h z ∈ Set.Icc 0 1) : (∑ x ∈ A, ∑ y ∈ B, ∑ z ∈ C,if x + y = z then f x * g y * h z else 0) ≤ kernel ((∑ x ∈ A,f x) + 1) ((∑ y ∈ B,g y) + 1) ((∑ z ∈ C,h z) + 1) + 1 / 4:=by classical obtain ⟨A',hA',B',hB',C',hC',hAm,hBm,hCm,hval⟩ := TrilinearWeightRounding.exists_trilinear_rounding A B C f g h (fun x y z => if x + y = z then 1 else 0) hf hg hh (by intro x _ y _ z _ split_ifs <;> norm_num) simp only [mul_ite,mul_one,mul_zero] at hval exact hval.trans ((FiniteThreeSetRearrangement.three_set_sum_bound A' B' C').trans (add_le_add (KernelMonotonicity.mono (Nat.cast_nonneg _) (Nat.cast_nonneg _) (Nat.cast_nonneg _) hAm hBm hCm) le_rfl)) theorem normalized_weighted_three_set_bound (A B C:Finset ℝ) (f g h:ℝ → ℝ) (hf:∀ x ∈ A,f x ∈ Set.Icc 0 1) (hg:∀ y ∈ B,g y ∈ Set.Icc 0 1) (hh:∀ z ∈ C,h z ∈ Set.Icc 0 1) {η:ℝ} (hη:0 ≤ η) : η ^ 2 * (∑ x ∈ A, ∑ y ∈ B, ∑ z ∈ C, if x + y = z then f x * g y * h z else 0) ≤ kernel (η * (∑ x ∈ A,f x) + η) (η * (∑ y ∈ B,g y) + η) (η * (∑ z ∈ C,h z) + η) + η ^ 2 / 4:=by have hv:=mul_le_mul_of_nonneg_left (weighted_three_set_bound A B C f g h hf hg hh) (sq_nonneg η) calc _ ≤ η ^ 2 * (kernel ((∑ x ∈ A,f x) + 1) ((∑ y ∈ B,g y) + 1) ((∑ z ∈ C,h z) + 1) + 1 / 4):=hv _ = _:=by rw [mul_add, ← kernel_scale _ _ _ hη]; simp only [mul_add,mul_one]; ring theorem bound_of_limits {a b c t η:ℕ → ℝ} {A B C T:ℝ} (ha:Tendsto a atTop (𝓝 A)) (hb:Tendsto b atTop (𝓝 B)) (hc:Tendsto c atTop (𝓝 C)) (ht:Tendsto t atTop (𝓝 T)) (hη:Tendsto η atTop (𝓝 0)) (hbound:∀ n,t n ≤ kernel (a n + η n) (b n + η n) (c n + η n) + η n ^ 2 / 4) : T ≤ kernel A B C:=by have harg:Tendsto (fun n => (a n + η n,b n + η n,c n + η n)) atTop (𝓝 (A,B,C)):=by simpa only [add_zero] using (ha.add hη).prodMk_nhds ((hb.add hη).prodMk_nhds (hc.add hη)) have hkernel:=kernel_continuous.continuousAt.tendsto.comp harg have hlim:Tendsto (fun n => kernel (a n + η n) (b n + η n) (c n + η n) + η n ^ 2 / 4) atTop (𝓝 (kernel A B C)):=by simpa only [Function.comp_apply,zero_pow (by norm_num:2 ≠ 0),zero_div,add_zero] using hkernel.add ((hη.pow 2).div_const 4) exact le_of_tendsto_of_tendsto ht hlim (Eventually.of_forall hbound) end Green24Proof.WeightedThreeSetRearrangement private def zz2451:"s0993"="s0993":=by decide+kernel end section namespace Green24Proof.RealContinuousRearrangement open MeasureTheory Set Filter open scoped BigOperators Topology open Green24Proof.RealLatticeRiemannSums Green24Proof.RealGridIntegralLimits open Green24Proof.WeightedThreeSetRearrangement theorem finite_difference_sum (A B C:Finset ℝ) (f g h:ℝ → ℝ) (hA:∀ y ∈ B, ∀ z ∈ C,z - y ∈ A) : (∑ x ∈ A, ∑ y ∈ B, ∑ z ∈ C,if x + y = z then f x * g y * h z else 0) = ∑ y ∈ B, ∑ z ∈ C,f (z - y) * g y * h z:=by classical rw [Finset.sum_comm] apply Finset.sum_congr rfl intro y hy rw [Finset.sum_comm] apply Finset.sum_congr rfl intro z hz rw [Finset.sum_eq_single (z - y)] · simp only [sub_add_cancel,if_true] · intro x _ hxy apply if_neg intro heq exact hxy (by linarith) · intro hnot exact False.elim (hnot (hA y hy z hz)) private def zz1884:"s075c"="s075c":=by decide+kernel theorem normalized_grid_bound {n:ℕ} (hn:0 < n) (M:ℕ) (f g h:ℝ → ℝ) (hf:∀ x,f x ∈ Icc 0 1) (hg:∀ x,g x ∈ Icc 0 1) (hh:∀ x,h x ∈ Icc 0 1) : ((n:ℝ)⁻¹) ^ 2 * (∑ y ∈ lineGrid n M, ∑ z ∈ lineGrid n M,f (z - y) * g y * h z) ≤ kernel ((n:ℝ)⁻¹ * (∑ x ∈ lineGrid n (2 * M),f x) + (n:ℝ)⁻¹) ((n:ℝ)⁻¹ * (∑ y ∈ lineGrid n M,g y) + (n:ℝ)⁻¹) ((n:ℝ)⁻¹ * (∑ z ∈ lineGrid n M,h z) + (n:ℝ)⁻¹) + ((n:ℝ)⁻¹) ^ 2 / 4:=by have hb:=normalized_weighted_three_set_bound (lineGrid n (2 * M)) (lineGrid n M) (lineGrid n M) f g h (fun x _ => hf x) (fun y _ => hg y) (fun z _ => hh z) (η:=(n:ℝ)⁻¹) (by positivity) rwa [finite_difference_sum _ _ _ f g h (fun _ hy _ hz => sub_mem_lineGrid hn hy hz)] at hb theorem bound_of_support (M:ℕ) (f g h:ℝ → ℝ) (hf:Continuous f) (hg:Continuous g) (hh:Continuous h) (hsf:∀ x,x ∉ Icc (-(2 * M:ℕ):ℝ) (2 * M:ℕ) → f x = 0) (hsg:∀ x,x ∉ Icc (-(M:ℝ)) M → g x = 0) (hsh:∀ x,x ∉ Icc (-(M:ℝ)) M → h x = 0) (hrf:∀ x,f x ∈ Icc 0 1) (hrg:∀ x,g x ∈ Icc 0 1) (hrh:∀ x,h x ∈ Icc 0 1) : (∫ yz:ℝ × ℝ,f (yz.2 - yz.1) * g yz.1 * h yz.2) ≤ kernel (∫ x,f x) (∫ y,g y) (∫ z,h z):=by have hf':=tendsto_lineGrid_sum (2 * M) f hf hsf have hg':=tendsto_lineGrid_sum M g hg hsg have hh':=tendsto_lineGrid_sum M h hh hsh have ht:=tendsto_pairGrid_sum M (fun yz:ℝ × ℝ => f (yz.2 - yz.1) * g yz.1 * h yz.2) (by fun_prop) (by intro yz hyz by_cases hy:yz.1 ∈ Icc (-(M:ℝ)) M · have hz:yz.2 ∉ Icc (-(M:ℝ)) M:=fun hz => hyz ⟨hy,hz⟩ rw [hsh _ hz,mul_zero] · rw [hsg _ hy,mul_zero,zero_mul]) have hη:Tendsto (fun n:ℕ => (n:ℝ)⁻¹) atTop (𝓝 0):=by simpa only [one_div] using ((tendsto_const_nhds (x:=(1:ℝ))).div_atTop tendsto_natCast_atTop_atTop) simp only [div_eq_inv_mul, ← inv_pow] at hf' hg' hh' ht apply bound_of_limits hf' hg' hh' ht hη intro n by_cases hn:n = 0 · subst n simp [kernel] · exact normalized_grid_bound (Nat.pos_of_ne_zero hn) M f g h hrf hrg hrh theorem exists_common_support_interval (f g h:ℝ → ℝ) (hf:HasCompactSupport f) (hg:HasCompactSupport g) (hh:HasCompactSupport h) : ∃ M:ℕ, (∀ x,x ∉ Icc (-(M:ℝ)) M → f x = 0) ∧ (∀ x,x ∉ Icc (-(M:ℝ)) M → g x = 0) ∧ (∀ x,x ∉ Icc (-(M:ℝ)) M → h x = 0):=by let S:=(tsupport f ∪ tsupport g) ∪ tsupport h have hS:IsCompact S:=(hf.union hg).union hh obtain ⟨R,hR⟩:=hS.exists_bound_of_continuousOn (continuous_id.continuousOn) let M:ℕ:=⌈R⌉₊ have hM:R ≤ (M:ℝ):=Nat.le_ceil R have hzero (F:ℝ → ℝ) (hF:tsupport F ⊆ S) : ∀ x,x ∉ Icc (-(M:ℝ)) M → F x = 0:=by intro x hx apply image_eq_zero_of_notMem_tsupport intro hxs apply hx apply abs_le.mp exact (hR x (hF hxs)).trans hM exact ⟨M,hzero f (fun _ hx => Or.inl (Or.inl hx)), hzero g (fun _ hx => Or.inl (Or.inr hx)),hzero h (fun _ hx => Or.inr hx)⟩ theorem three_function_bound (f g h:ℝ → ℝ) (hf:Continuous f) (hg:Continuous g) (hh:Continuous h) (hsf:HasCompactSupport f) (hsg:HasCompactSupport g) (hsh:HasCompactSupport h) (hrf:∀ x,f x ∈ Icc 0 1) (hrg:∀ x,g x ∈ Icc 0 1) (hrh:∀ x,h x ∈ Icc 0 1) : (∫ yz:ℝ × ℝ,f (yz.2 - yz.1) * g yz.1 * h yz.2) ≤ kernel (∫ x,f x) (∫ y,g y) (∫ z,h z):=by obtain ⟨M,hMf,hMg,hMh⟩:=exists_common_support_interval f g h hsf hsg hsh apply bound_of_support M f g h hf hg hh _ hMg hMh hrf hrg hrh intro x hx apply hMf x intro hsmall apply hx constructor <;> push_cast <;> linarith [hsmall.1,hsmall.2,Nat.cast_nonneg (α:=ℝ) M] end Green24Proof.RealContinuousRearrangement private def zz2452:"s0994"="s0994":=by decide+kernel end section namespace Green24Proof.RealLineOrbitIntegrals open MeasureTheory Set open Green24Proof.CompactCircleLift Green24Proof.RealTorusDilation open Green24Proof.CircleLiftCounting Green24Proof.CircleProductOrbit open Green24Proof.CircleTorusOrbit Green24Proof.CircleProbabilityHaar variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} noncomputable def lineFunction (w:ι → ℤ) (F:Space ι → ℝ) (t:ℝ):ℝ := F (t,orbit w (Circle.exp t)) private def zz1885:"s075d"="s075d":=by decide+kernel theorem lineFunction_continuous (w:ι → ℤ) (F:Space ι → ℝ) (hF:Continuous F) : Continuous (lineFunction w F) := hF.comp (continuous_id.prodMk ((orbit_continuous w).comp Circle.exp.continuous)) theorem lineFunction_zero (w:ι → ℤ) (F:Space ι → ℝ) (hs:SmallSupport F) {t:ℝ} (ht:Real.pi / 4 ≤ |t|):lineFunction w F t = 0:=hs t _ ht theorem lineFunction_compactSupport (w:ι → ℤ) (F:Space ι → ℝ) (hs:SmallSupport F):HasCompactSupport (lineFunction w F):=by apply HasCompactSupport.intro (isCompact_Icc:IsCompact (Icc (-Real.pi / 4) (Real.pi / 4))) intro t ht apply lineFunction_zero w F hs by_contra hn obtain ⟨h1,h2⟩:=abs_lt.mp (lt_of_not_ge hn) exact ht ⟨by linarith,h2.le⟩ theorem lineFunction_range (w:ι → ℤ) (F:Space ι → ℝ) (hr:∀ z,F z ∈ Icc 0 1) (t:ℝ):lineFunction w F t ∈ Icc 0 1:=hr _ private def zz1886:"s075e"="s075e":=by decide+kernel theorem integral_orbit_mass (w:ι → ℤ) (F:Space ι → ℝ) (hF:Continuous F) (hs:SmallSupport F) : (∫ z,circleLift F (productOrbit w z) ∂circleHaar) = (2 * Real.pi)⁻¹ * ∫ t,lineFunction w F t:=by rw [integral_exp (fun z => circleLift F (productOrbit w z)) ((circleLift_continuous F hF hs).comp (productOrbit_continuous w)) (-Real.pi),show -Real.pi + 2 * Real.pi = Real.pi by ring, integral_real_principal (lineFunction w F) (fun _ ht => lineFunction_zero w F hs ht)] congr 1 apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro t ht exact circleLift_exp F ⟨ht.1,ht.2.le⟩ _ theorem integral_circle_pair_exp (K:Circle × Circle → ℝ) (hK:Continuous K) : (∫ yz,K yz ∂circleHaar.prod circleHaar) = ((2 * Real.pi)⁻¹) ^ 2 * ∫ s in -Real.pi..Real.pi, ∫ t in -Real.pi..Real.pi,K (Circle.exp s,Circle.exp t):=by letI:=circleHaar_isProbabilityMeasure have hcont:Continuous (fun y => ∫ z,K (y,z) ∂circleHaar):=by have h:=continuous_parametric_integral_of_continuous (μ:=circleHaar) (f:=fun y z => K (y,z)) hK (s:=Set.univ) isCompact_univ simpa only [Measure.restrict_univ] using h have hinner (y:Circle):(∫ z,K (y,z) ∂circleHaar) = (2 * Real.pi)⁻¹ * ∫ t in -Real.pi..Real.pi,K (y,Circle.exp t):=by rw [integral_exp (fun z => K (y,z)) (hK.comp (continuous_const.prodMk continuous_id)) (-Real.pi), show -Real.pi + 2 * Real.pi = Real.pi by ring] rw [integral_prod _ (hK.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _)), integral_exp _ hcont (-Real.pi),show -Real.pi + 2 * Real.pi = Real.pi by ring] simp_rw [hinner,intervalIntegral.integral_const_mul] ring theorem real_count_eq_principal (f g h:ℝ → ℝ) (hf:Continuous f) (hg:Continuous g) (hh:Continuous h) (hsg:∀ t,Real.pi / 4 ≤ |t| → g t = 0) (hsh:∀ t,Real.pi / 4 ≤ |t| → h t = 0) : (∫ yz:ℝ × ℝ,f (yz.2 - yz.1) * g yz.1 * h yz.2) = ∫ s in -Real.pi..Real.pi, ∫ t in -Real.pi..Real.pi,f (t - s) * g s * h t:=by let K:=fun yz:ℝ × ℝ => f (yz.2 - yz.1) * g yz.1 * h yz.2 have hzero (F:ℝ → ℝ) (hF:∀ t,Real.pi / 4 ≤ |t| → F t = 0) (t:ℝ) (ht:t ∉ Icc (-Real.pi / 4) (Real.pi / 4)):F t = 0:=by apply hF by_contra hn obtain ⟨h1,h2⟩:=abs_lt.mp (lt_of_not_ge hn) exact ht ⟨by linarith,h2.le⟩ have hsK:HasCompactSupport K:=by apply HasCompactSupport.intro (isCompact_Icc.prod isCompact_Icc) intro yz hyz by_cases hy:yz.1 ∈ Icc (-Real.pi / 4) (Real.pi / 4) · have hz:yz.2 ∉ Icc (-Real.pi / 4) (Real.pi / 4):=fun hz => hyz ⟨hy,hz⟩ simp only [K,hzero h hsh _ hz,mul_zero] · simp only [K,hzero g hsg _ hy,mul_zero,zero_mul] have hi:Integrable K:=(by fun_prop:Continuous K).integrable_of_hasCompactSupport hsK have hinner (s:ℝ):(∫ t,f (t - s) * g s * h t) = ∫ t in -Real.pi..Real.pi,f (t - s) * g s * h t:=by apply integral_real_principal intro t ht rw [hsh t ht,mul_zero] change (∫ yz,K yz ∂volume.prod volume) = _ rw [integral_prod K hi] change (∫ s, ∫ t,f (t - s) * g s * h t) = _ simp_rw [hinner] apply integral_real_principal intro s hs simp_rw [hsg s hs,mul_zero,zero_mul] simp theorem orbit_count_pointwise (w:ι → ℤ) (F G H:Space ι → ℝ) (hsG:SmallSupport G) (hsH:SmallSupport H) {s t:ℝ} (hs:s ∈ Ioc (-Real.pi) Real.pi) (ht:t ∈ Ioc (-Real.pi) Real.pi) : liftedDifferenceIntegrand F G H (productOrbit w (Circle.exp s),productOrbit w (Circle.exp t)) = lineFunction w F (t - s) * lineFunction w G s * lineFunction w H t:=by change circleLift F (Circle.exp t / Circle.exp s,orbit w (Circle.exp t) / orbit w (Circle.exp s)) * circleLift G (Circle.exp s,orbit w (Circle.exp s)) * circleLift H (Circle.exp t,orbit w (Circle.exp t)) = _ rw [difference_product_exp F G H hsG hsH hs ht, ← orbit_div, ← Circle.exp_sub] rfl private def zz1887:"s075f"="s075f":=by decide+kernel theorem integral_orbit_count (w:ι → ℤ) (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsF:SmallSupport F) (hsG:SmallSupport G) (hsH:SmallSupport H) : (∫ yz,liftedDifferenceIntegrand F G H (productOrbit w yz.1,productOrbit w yz.2) ∂circleHaar.prod circleHaar) = ((2 * Real.pi)⁻¹) ^ 2 * ∫ yz:ℝ × ℝ,lineFunction w F (yz.2 - yz.1) * lineFunction w G yz.1 * lineFunction w H yz.2:=by rw [integral_circle_pair_exp (fun yz => liftedDifferenceIntegrand F G H (productOrbit w yz.1,productOrbit w yz.2)) ((liftedDifferenceIntegrand_continuous F G H hF hG hH hsF hsG hsH).comp ((productOrbit_continuous w).prodMap (productOrbit_continuous w))), real_count_eq_principal _ _ _ (lineFunction_continuous w F hF) (lineFunction_continuous w G hG) (lineFunction_continuous w H hH) (fun _ ht => lineFunction_zero w G hsG ht) (fun _ ht => lineFunction_zero w H hsH ht)] congr 1 apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro s hs apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro t ht exact orbit_count_pointwise w F G H hsG hsH ⟨hs.1,hs.2.le⟩ ⟨ht.1,ht.2.le⟩ theorem orbit_rearrangement_bound (w:ι → ℤ) (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsF:SmallSupport F) (hsG:SmallSupport G) (hsH:SmallSupport H) (hrF:∀ z,F z ∈ Icc 0 1) (hrG:∀ z,G z ∈ Icc 0 1) (hrH:∀ z,H z ∈ Icc 0 1) : (∫ yz,liftedDifferenceIntegrand F G H (productOrbit w yz.1,productOrbit w yz.2) ∂circleHaar.prod circleHaar) ≤ kernel (∫ z,circleLift F (productOrbit w z) ∂circleHaar) (∫ z,circleLift G (productOrbit w z) ∂circleHaar) (∫ z,circleLift H (productOrbit w z) ∂circleHaar):=by rw [integral_orbit_count w F G H hF hG hH hsF hsG hsH, integral_orbit_mass w F hF hsF,integral_orbit_mass w G hG hsG, integral_orbit_mass w H hH hsH,kernel_scale _ _ _ (by positivity:0 ≤ (2 * Real.pi)⁻¹)] apply mul_le_mul_of_nonneg_left _ (sq_nonneg _) exact RealContinuousRearrangement.three_function_bound _ _ _ (lineFunction_continuous w F hF) (lineFunction_continuous w G hG) (lineFunction_continuous w H hH) (lineFunction_compactSupport w F hsF) (lineFunction_compactSupport w G hsG) (lineFunction_compactSupport w H hsH) (lineFunction_range w F hrF) (lineFunction_range w G hrG) (lineFunction_range w H hrH) end Green24Proof.RealLineOrbitIntegrals private def zz2453:"s0995"="s0995":=by decide+kernel end section namespace Green24Proof.SmallSupportRearrangement open MeasureTheory Set Filter open scoped Topology open Green24Proof.CompactCircleLift Green24Proof.RealTorusDilation open Green24Proof.RealTorusCoefficientNormalization Green24Proof.CircleLiftCounting open Green24Proof.CircleProductOrbit Green24Proof.RealLineOrbitIntegrals open Green24Proof.CircleProbabilityHaar variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] theorem tendsto_of_absolute_error {f e:ℕ → ℝ} {a:ℝ} (he:Tendsto e atTop (𝓝 0)) (hf:∀ n, |f n - a| ≤ e n) : Tendsto f atTop (𝓝 a):=by apply tendsto_iff_dist_tendsto_zero.mpr simp only [Real.dist_eq] exact squeeze_zero (fun n => abs_nonneg (f n - a)) hf he theorem lifted_rearrangement_bound (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsF:SmallSupport F) (hsG:SmallSupport G) (hsH:SmallSupport H) (hrF:∀ z,F z ∈ Icc 0 1) (hrG:∀ z,G z ∈ Icc 0 1) (hrH:∀ z,H z ∈ Icc 0 1) : (∫ yz,liftedDifferenceIntegrand F G H yz ∂(circleMeasure ι).prod (circleMeasure ι)) ≤ kernel (∫ z,circleLift F z ∂circleMeasure ι) (∫ z,circleLift G z ∂circleMeasure ι) (∫ z,circleLift H z ∂circleMeasure ι):=by let L:Fin 3 → CircleSpace ι → ℝ:=![circleLift F,circleLift G,circleLift H] have hL (i:Fin 3):Continuous (L i):=by fin_cases i · exact circleLift_continuous F hF hsF · exact circleLift_continuous G hG hsG · exact circleLift_continuous H hH hsH let K:=liftedDifferenceIntegrand F G H have hK:Continuous K:=liftedDifferenceIntegrand_continuous F G H hF hG hH hsF hsG hsH let ε:ℕ → ℝ:=fun n => 1 / ((n:ℝ) + 1) have hε (n:ℕ):0 < ε n:=by dsimp [ε]; positivity choose w hm hc using fun n => exists_joint_approximation 3 L hL K hK (hε n) have he:Tendsto (fun n => 2 * ε n) atTop (𝓝 0):=by have h:=tendsto_one_div_add_atTop_nhds_zero_nat (𝕜:=ℝ) simpa only [mul_zero] using h.const_mul 2 have hmass (i:Fin 3) : Tendsto (fun n => ∫ z,L i (productOrbit (w n) z) ∂circleHaar) atTop (𝓝 (∫ z,L i z ∂circleMeasure ι)) := tendsto_of_absolute_error he (fun n => hm n i) have hcount:=tendsto_of_absolute_error he hc have hargs:=(hmass 0).prodMk_nhds ((hmass 1).prodMk_nhds (hmass 2)) have hk:=kernel_continuous.continuousAt.tendsto.comp hargs exact le_of_tendsto_of_tendsto hcount hk (Eventually.of_forall (fun n => orbit_rearrangement_bound (w n) F G H hF hG hH hsF hsG hsH hrF hrG hrH)) private def zz1888:"s0760"="s0760":=by decide+kernel theorem three_function_bound (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsF:SmallSupport F) (hsG:SmallSupport G) (hsH:SmallSupport H) (hrF:∀ z,F z ∈ Icc 0 1) (hrG:∀ z,G z ∈ Icc 0 1) (hrH:∀ z,H z ∈ Icc 0 1) : differenceCount F G H ≤ kernel (∫ z,F z ∂measure ι) (∫ z,G z ∂measure ι) (∫ z,H z ∂measure ι):=by have h:=lifted_rearrangement_bound F G H hF hG hH hsF hsG hsH hrF hrG hrH rw [integrated_count_identity F G H hF hG hH hsF hsG hsH] at h change ((2 * Real.pi)⁻¹) ^ 2 * differenceCount F G H ≤ kernel (∫ z,circleLift F z ∂circleHaar.prod _) (∫ z,circleLift G z ∂circleHaar.prod _) (∫ z,circleLift H z ∂circleHaar.prod _) at h rw [integral_circleLift F hF hsF,integral_circleLift G hG hsG, integral_circleLift H hH hsH,kernel_scale _ _ _ (by positivity:0 ≤ (2 * Real.pi)⁻¹)] at h exact le_of_mul_le_mul_left h (by positivity:0 < ((2 * Real.pi)⁻¹) ^ 2) end Green24Proof.SmallSupportRearrangement private def zz2454:"s0996"="s0996":=by decide+kernel end section namespace Green24Proof.RealTorusRearrangement open MeasureTheory Set open Green24Proof.RealTorusDilation Green24Proof.RealTorusCoefficientNormalization open Green24Proof.CompactCircleLift variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] omit [Fintype ι] in theorem common_small_dilation (F G H:Space ι → ℝ) (hsF:HasCompactSupport F) (hsG:HasCompactSupport G) (hsH:HasCompactSupport H) : ∃ a:ℝ,0 < a ∧ SmallSupport (pullback a 1 F) ∧ SmallSupport (pullback a 1 G) ∧ SmallSupport (pullback a 1 H):=by let S:=(tsupport F ∪ tsupport G) ∪ tsupport H have hS:IsCompact S:=(hsF.union hsG).union hsH obtain ⟨R,hR⟩:=hS.exists_bound_of_continuousOn (f:=fun v:Space ι => v.1) continuous_fst.continuousOn let a:=Real.pi / (4 * (|R| + 1)) have ha:0 < a:=by dsimp [a]; positivity have haR:a * (|R| + 1) = Real.pi / 4:=by dsimp [a] have hn:|R| + 1 ≠ 0:=by positivity field_simp have hsmall (J:Space ι → ℝ) (hJ:tsupport J ⊆ S):SmallSupport (pullback a 1 J):=by intro t u ht change J (t / a,u ^ 1) = 0 rw [pow_one] by_contra hj have hm:(t / a,u) ∈ tsupport J:=subset_tsupport _ hj have hb:=hR (t / a,u) (hJ hm) change |t / a| ≤ R at hb rw [abs_div,abs_of_pos ha] at hb have htR:|t| ≤ a * R:=by have hb':=(div_le_iff₀ ha).mp hb linarith have hRa:a * R < a * (|R| + 1) := mul_lt_mul_of_pos_left (by linarith [le_abs_self R]) ha linarith exact ⟨a,ha,hsmall F (fun _ h => Or.inl (Or.inl h)), hsmall G (fun _ h => Or.inl (Or.inr h)),hsmall H (fun _ h => Or.inr h)⟩ omit [Fintype ι] in theorem difference_dilation_identity (a:ℝ) (F G H:Space ι → ℝ) (yz:Space ι × Space ι) : differenceIntegrand F G H (dilationMap a 1 yz.1,dilationMap a 1 yz.2) = differenceIntegrand (pullback a 1 F) (pullback a 1 G) (pullback a 1 H) yz:=by simp only [differenceIntegrand,dilationMap,pullback,Function.comp_apply,pow_one,sub_div] theorem differenceCount_dilation {a:ℝ} (ha:a ≠ 0) (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) : differenceCount (pullback a 1 F) (pullback a 1 G) (pullback a 1 H) = a ^ 2 * differenceCount F G H:=by have h:=integral_pair_dilation (ι:=ι) ha ha (n:=1) (m:=1) one_ne_zero one_ne_zero (differenceIntegrand F G H) (differenceIntegrand_continuous F G H hF hG hH) simp_rw [difference_dilation_identity] at h simpa only [differenceCount, ← pow_two,sq_abs] using h private def zz1889:"s0761"="s0761":=by decide+kernel theorem three_function_bound (F G H:Space ι → ℝ) (hF:Continuous F) (hG:Continuous G) (hH:Continuous H) (hsF:HasCompactSupport F) (hsG:HasCompactSupport G) (hsH:HasCompactSupport H) (hrF:∀ z,F z ∈ Icc 0 1) (hrG:∀ z,G z ∈ Icc 0 1) (hrH:∀ z,H z ∈ Icc 0 1) : differenceCount F G H ≤ kernel (∫ z,F z ∂measure ι) (∫ z,G z ∂measure ι) (∫ z,H z ∂measure ι):=by obtain ⟨a,ha,hsF',hsG',hsH'⟩:=common_small_dilation F G H hsF hsG hsH have h:=SmallSupportRearrangement.three_function_bound (pullback a 1 F) (pullback a 1 G) (pullback a 1 H) (pullback_continuous a 1 F hF) (pullback_continuous a 1 G hG) (pullback_continuous a 1 H hH) hsF' hsG' hsH' (pullback_range a 1 F hrF) (pullback_range a 1 G hrG) (pullback_range a 1 H hrH) rw [differenceCount_dilation ha.ne' F G H hF hG hH, integral_pullback ha.ne' (n:=1) one_ne_zero F hF, integral_pullback ha.ne' (n:=1) one_ne_zero G hG, integral_pullback ha.ne' (n:=1) one_ne_zero H hH, abs_of_pos ha,kernel_scale _ _ _ ha.le] at h exact le_of_mul_le_mul_left h (sq_pos_of_pos ha) theorem rearrangementBound (ι:Type*) [Fintype ι]:RearrangementBound ι := three_function_bound end Green24Proof.RealTorusRearrangement private def zz2455:"s0997"="s0997":=by decide+kernel end section namespace Green24Proof.TorusCoordinateHaar open MeasureTheory open Green24Proof.CircleProbabilityHaar Green24Proof.CyclicTorusHaarDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] [DecidableEq ι] noncomputable def splitEquiv (p:ι):(ι → Circle) ≃* Circle × ({j:ι // j ≠ p} → Circle) where toEquiv:=(Homeomorph.funSplitAt Circle p).toEquiv map_mul':=by intro z w; rfl noncomputable def join (p:ι):Circle × ({j:ι // j ≠ p} → Circle) → (ι → Circle) := (splitEquiv p).symm omit [Fintype ι] in theorem join_continuous (p:ι):Continuous (join p) := (Homeomorph.funSplitAt Circle p).continuous_invFun theorem split_measurePreserving (p:ι) : MeasurePreserving (splitEquiv p) (torusHaar ι) (circleHaar.prod (torusHaar {j:ι // j ≠ p})):=by letI:=circleHaar_isProbabilityMeasure letI:=circleHaar_isHaarMeasure letI:=torusHaar_isProbabilityMeasure ι letI:=torusHaar_isHaarMeasure ι letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} letI:=torusHaar_isHaarMeasure {j:ι // j ≠ p} apply MonoidHom.measurePreserving (f:=(splitEquiv p).toMonoidHom) · exact (Homeomorph.funSplitAt Circle p).continuous · exact (splitEquiv p).surjective · simp private def zz1890:"s0762"="s0762":=by decide+kernel theorem integral_split (p:ι) (F:(ι → Circle) → ℝ) : (∫ z,F z ∂torusHaar ι) = ∫ v,F (join p v) ∂circleHaar.prod (torusHaar {j:ι // j ≠ p}):=by have h:=(split_measurePreserving p).integral_comp (Homeomorph.funSplitAt Circle p).measurableEmbedding (fun v => F (join p v)) simpa only [join,MulEquiv.symm_apply_apply] using h theorem integral_split_iterated (p:ι) (F:(ι → Circle) → ℝ) (hF:Continuous F) : (∫ z,F z ∂torusHaar ι) = ∫ s, ∫ u,F (join p (s,u)) ∂torusHaar {j:ι // j ≠ p} ∂circleHaar:=by letI:=circleHaar_isProbabilityMeasure letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} rw [integral_split p F] apply integral_prod exact (hF.comp (join_continuous p)).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) omit [Fintype ι] in theorem join_equation (p:ι) (y z:Circle × ({j:ι // j ≠ p} → Circle)) : join p (z ^ 3 * y ^ (-2:ℤ)) = (join p z) ^ 3 * (join p y) ^ (-2:ℤ):=by exact map_mul ((splitEquiv p).symm) _ _ |>.trans (by rw [map_pow,map_zpow]; rfl) omit [Fintype ι] in theorem join_pivot (p:ι) (v:Circle × ({j:ι // j ≠ p} → Circle)) : join p v p = v.1:=by have h:=(splitEquiv p).apply_symm_apply v exact congrArg Prod.fst h end Green24Proof.TorusCoordinateHaar private def zz2456:"s0998"="s0998":=by decide+kernel end section namespace Green24Proof.SpatialCircleCutoff open scoped NNReal open Green24Proof.CyclicTorusSmoothing noncomputable def cutoff (z:Circle):ℝ:=max 0 (min 1 (10 * (z:ℂ).re - 8)) def window:Set Circle:={z | (4 / 5:ℝ) < (z:ℂ).re} private def zz1891:"s0763"="s0763":=by decide+kernel theorem cutoff_range (z:Circle):cutoff z ∈ Set.Icc 0 1:=by exact ⟨le_max_left _ _,max_le (by norm_num) (min_le_left _ _)⟩ theorem cutoff_eq_one {z:Circle} (hz:(9 / 10:ℝ) ≤ (z:ℂ).re):cutoff z = 1:=by unfold cutoff rw [min_eq_left (by linarith)] norm_num theorem cutoff_zero_outside (z:Circle) (hz:z ∉ window):cutoff z = 0:=by have hr:(z:ℂ).re ≤ (4 / 5:ℝ):=le_of_not_gt hz apply max_eq_left exact (min_le_right _ _).trans (by linarith) theorem cutoff_lipschitz:LipschitzWith 10 cutoff:=by have hlin:LipschitzWith 10 (fun z:Circle => 10 * (z:ℂ).re - 8):=by apply LipschitzWith.of_dist_le_mul intro z w have h:=component_dist_le false z w simp only [component,Bool.false_eq_true,if_false,Real.dist_eq] at h change |10 * (z:ℂ).re - 8 - (10 * (w:ℂ).re - 8)| ≤ (10:ℝ) * dist z w rw [show 10 * (z:ℂ).re - 8 - (10 * (w:ℂ).re - 8) = 10 * ((z:ℂ).re - (w:ℂ).re) by ring,abs_mul,abs_of_pos (by norm_num:(0:ℝ) < 10)] exact mul_le_mul_of_nonneg_left h (by norm_num) exact (hlin.const_min 1).const_max 0 private def zz1892:"s0764"="s0764":=by decide+kernel theorem cutoff_exp_eq_one {θ:ℝ} (hθ:|θ| ≤ 1 / 4):cutoff (Circle.exp θ) = 1:=by apply cutoff_eq_one rw [Circle.coe_exp,Complex.exp_ofReal_mul_I_re] have hs:θ ^ 2 ≤ (1 / 4:ℝ)^2:=by simpa only [sq_abs] using (sq_le_sq₀ (abs_nonneg θ) (by norm_num:(0:ℝ) ≤ 1 / 4)).mpr hθ nlinarith [Real.one_sub_sq_div_two_le_cos (x:=θ)] theorem toCircle_neg_intCast {q:ℕ} [NeZero q] (x:ℤ) : ZMod.toCircle (-(x:ZMod q)) = Circle.exp (-2 * Real.pi * (x:ℝ) / q):=by apply Circle.coe_injective rw [← Int.cast_neg,ZMod.toCircle_intCast,Circle.coe_exp] push_cast congr 1 ring theorem cutoff_integer_plateau {q:ℕ} [NeZero q] (x:ℤ) (hx:(32:ℝ) * |(x:ℝ)| ≤ q):cutoff (ZMod.toCircle (-(x:ZMod q))) = 1:=by rw [toCircle_neg_intCast] apply cutoff_exp_eq_one have hq:(0:ℝ) < q:=Nat.cast_pos.mpr (NeZero.pos q) rw [abs_div,abs_mul,abs_mul,abs_of_pos hq,abs_of_pos Real.pi_pos] norm_num only [abs_neg,abs_of_nonneg (by norm_num:(0:ℝ) ≤ 2)] apply (div_le_iff₀ hq).mpr nlinarith [Real.pi_lt_four,abs_nonneg (x:ℝ)] end Green24Proof.SpatialCircleCutoff private def zz2457:"s0999"="s0999":=by decide+kernel end section namespace Green24Proof.WindowArcGeometry open Green24Proof.SpatialCircleCutoff theorem window_inv_iff (z:Circle):z⁻¹ ∈ window ↔ z ∈ window:=by simp only [window,Set.mem_ofPred_eq,Circle.coe_inv_eq_conj,Complex.conj_re] private def zz1893:"s0765"="s0765":=by decide+kernel theorem window_zpow_natAbs_iff (z:Circle) (n:ℤ) : z ^ n ∈ window ↔ z ^ n.natAbs ∈ window:=by cases n with | ofNat n => simp | negSucc n => simpa only [Int.negSucc_eq, ← Int.natCast_add_one,zpow_neg,zpow_natCast, Int.natAbs_neg,Int.natAbs_natCast] using window_inv_iff (z ^ (n + 1)) theorem window_arg_bound {z:Circle} (hz:z ∈ window) : |Complex.arg (z:ℂ)| < Real.pi / 4:=by have hcos:Real.cos (Complex.arg (z:ℂ)) = (z:ℂ).re:=by simpa only [z.norm_coe,div_one] using Complex.cos_arg (Circle.coe_ne_zero z) have hconst:Real.cos (Real.pi / 4) < (4 / 5:ℝ):=by rw [Real.cos_pi_div_four] have hsq:=Real.sq_sqrt (by norm_num:(0:ℝ) ≤ 2) have hpos:=Real.sqrt_nonneg (2:ℝ) nlinarith by_contra h have hle:=Real.cos_le_cos_of_nonneg_of_le_pi (by positivity:0 ≤ Real.pi / 4) (Complex.abs_arg_le_pi (z:ℂ)) (le_of_not_gt h) rw [Real.cos_abs,hcos] at hle change (4 / 5:ℝ) < (z:ℂ).re at hz linarith theorem exp_eq_one_no_wrap {t:ℝ} (ht:|t| < 2 * Real.pi) (hexp:Circle.exp t = 1):t = 0:=by obtain ⟨k,hk⟩:=Circle.exp_eq_one.mp hexp have hkp:(0:ℝ) < 2 * Real.pi:=by positivity have hkr:|(k:ℝ)| < 1:=by rw [hk,abs_mul,abs_of_pos hkp] at ht nlinarith have hki:|k| < 1:=by exact_mod_cast hkr have hk0:k = 0:=by have:=neg_abs_le k; have:=le_abs_self k; omega simp [hk,hk0] theorem linear_form_no_wrap {x y z:ℝ} (hx:|x| < Real.pi / 4) (hy:|y| < Real.pi / 4) (hz:|z| < Real.pi / 4) : |x + 2 * y - 3 * z| < 2 * Real.pi:=by have h1:|x + 2 * y - 3 * z| ≤ |x + 2 * y| + 3 * |z|:=by calc _ = |(x + 2 * y) + -(3 * z)|:=by rw [sub_eq_add_neg] _ ≤ |x + 2 * y| + |-(3 * z)|:=abs_add_le _ _ _ = _:=by rw [abs_neg,abs_mul]; norm_num have h2:=abs_add_le x (2 * y) rw [abs_mul,abs_of_pos (by norm_num:(0:ℝ) < 2)] at h2 nlinarith [Real.pi_pos] private def zz1894:"s0766"="s0766":=by decide+kernel theorem exp_equation_iff {x y z:ℝ} (hx:|x| < Real.pi / 4) (hy:|y| < Real.pi / 4) (hz:|z| < Real.pi / 4) : Circle.exp x * Circle.exp y ^ 2 = Circle.exp z ^ 3 ↔ x + 2 * y = 3 * z:=by have heq:Circle.exp (x + 2 * y - 3 * z) = Circle.exp x * Circle.exp y ^ 2 / Circle.exp z ^ 3:=by rw [Circle.exp_sub,Circle.exp_add] congr 2 · simpa using Circle.exp_natCast_mul y 2 · simpa using Circle.exp_natCast_mul z 3 constructor · intro h have h0:=exp_eq_one_no_wrap (linear_form_no_wrap hx hy hz) (by rw [heq,h]; simp) linarith · intro h have h0:Circle.exp (x + 2 * y - 3 * z) = 1:=by rw [h,sub_self,Circle.exp_zero] rw [heq,div_eq_one] at h0 exact h0 end Green24Proof.WindowArcGeometry private def zz2458:"s099a"="s099a":=by decide+kernel end section namespace Green24Proof.CircleArcResidues open Green24Proof.WindowArcGeometry Green24Proof.SpatialCircleCutoff noncomputable def arcLift (n r:ℤ) (t:ℝ):Circle := Circle.exp ((t + 2 * Real.pi * r) / n) theorem arcLift_zpow {n:ℤ} (hn:n ≠ 0) (r:ℤ) (t:ℝ) : arcLift n r t ^ n = Circle.exp t:=by have hnR:(n:ℝ) ≠ 0:=by exact_mod_cast hn unfold arcLift rw [← Circle.exp_intCast_mul] have h:(n:ℝ) * ((t + 2 * Real.pi * r) / n) = t + 2 * Real.pi * r:=by field_simp rw [h,Circle.exp_add,Circle.exp_two_pi_mul_int,mul_one] theorem exists_arcLift {n:ℤ} (hn:n ≠ 0) (z:Circle) (hz:z ^ n ∈ window) : ∃ (r:ℤ) (t:ℝ), |t| < Real.pi / 4 ∧ z = arcLift n r t:=by have heq:Circle.exp ((n:ℝ) * Complex.arg (z:ℂ)) = Circle.exp (Complex.arg (z ^ n:Circle)):=by rw [Circle.exp_intCast_mul,Circle.exp_arg,Circle.exp_arg] obtain ⟨r,hr⟩:=Circle.exp_eq_exp.mp heq refine ⟨r,Complex.arg (z ^ n:Circle),window_arg_bound hz, ?_⟩ have hnR:(n:ℝ) ≠ 0:=by exact_mod_cast hn calc z = Circle.exp (Complex.arg (z:ℂ)):=(Circle.exp_arg z).symm _ = arcLift n r (Complex.arg (z ^ n:Circle)):=by unfold arcLift congr 1 apply (eq_div_iff hnR).mpr linarith theorem arcLift_equation_expression (n r s t:ℤ) (x y z:ℝ) : arcLift n r x * arcLift n s y ^ 2 / arcLift n t z ^ 3 = Circle.exp ((x + 2 * y - 3 * z + 2 * Real.pi * (r + 2 * s - 3 * t:ℤ)) / n):=by unfold arcLift rw [← Circle.exp_natCast_mul, ← Circle.exp_natCast_mul, ← Circle.exp_add, ← Circle.exp_sub] congr 1 push_cast ring private def zz1895:"s0767"="s0767":=by decide+kernel theorem arcLift_equation_iff {n:ℤ} (hn:n ≠ 0) (r s t:ℤ) {x y z:ℝ} (hx:|x| < Real.pi / 4) (hy:|y| < Real.pi / 4) (hz:|z| < Real.pi / 4) : arcLift n r x * arcLift n s y ^ 2 = arcLift n t z ^ 3 ↔ x + 2 * y = 3 * z ∧ n ∣ r + 2 * s - 3 * t:=by have hnR:(n:ℝ) ≠ 0:=by exact_mod_cast hn have hpi:(2:ℝ) * Real.pi ≠ 0:=by positivity constructor · intro h have hpower:=congrArg (zpowGroupHom n) h simp only [map_mul,map_pow,zpowGroupHom_apply,arcLift_zpow hn] at hpower have hreal:=(exp_equation_iff hx hy hz).mp hpower refine ⟨hreal, ?_⟩ have he:Circle.exp ((2 * Real.pi * (r + 2 * s - 3 * t:ℤ)) / n) = 1:=by have h':=arcLift_equation_expression n r s t x y z rw [h,div_self',hreal,sub_self,zero_add] at h' exact h'.symm obtain ⟨k,hk⟩:=Circle.exp_eq_one.mp he have hfrac:((r + 2 * s - 3 * t:ℤ):ℝ) / n = (k:ℝ):=by apply mul_left_cancel₀ hpi simpa only [mul_div_assoc,mul_comm (k:ℝ) (2 * Real.pi)] using hk refine ⟨k, ?_⟩ have hR:=(div_eq_iff hnR).mp hfrac have:((r + 2 * s - 3 * t:ℤ):ℝ) = ((n * k:ℤ):ℝ):=by push_cast simpa only [Int.cast_add,Int.cast_sub,Int.cast_mul,Int.cast_ofNat,mul_comm] using hR exact_mod_cast this · rintro ⟨hreal,k,hk⟩ apply div_eq_one.mp rw [arcLift_equation_expression,hreal,sub_self,zero_add,hk] have he:(2 * Real.pi * ((n * k:ℤ):ℝ)) / n = (k:ℝ) * (2 * Real.pi):=by push_cast field_simp rw [he,Circle.exp_int_mul_two_pi] theorem phase_divisibility {n:ℤ} (hn:n ≠ 0) (r:ℤ) : Circle.exp ((2 * Real.pi * r) / n) = 1 ↔ n ∣ r:=by have hnR:(n:ℝ) ≠ 0:=by exact_mod_cast hn have hpi:(2:ℝ) * Real.pi ≠ 0:=by positivity rw [Circle.exp_eq_one] constructor · rintro ⟨k,hk⟩ have hfrac:(r:ℝ) / n = (k:ℝ):=by apply mul_left_cancel₀ hpi simpa only [mul_div_assoc,mul_comm (k:ℝ) (2 * Real.pi)] using hk refine ⟨k, ?_⟩ have hR:=(div_eq_iff hnR).mp hfrac have h':(r:ℝ) = ((n * k:ℤ):ℝ):=by push_cast simpa only [mul_comm] using hR exact_mod_cast h' · rintro ⟨k,rfl⟩ refine ⟨k, ?_⟩ push_cast field_simp theorem arcLift_eq_iff {n:ℤ} (hn:n ≠ 0) (r s:ℤ) {x y:ℝ} (hx:|x| < Real.pi / 4) (hy:|y| < Real.pi / 4) : arcLift n r x = arcLift n s y ↔ x = y ∧ n ∣ r - s:=by have hdiv:arcLift n r x / arcLift n s y = Circle.exp ((x - y + 2 * Real.pi * (r - s:ℤ)) / n):=by unfold arcLift rw [← Circle.exp_sub] congr 1 push_cast ring constructor · intro h have hpower:=congrArg (fun u:Circle => u ^ n) h change arcLift n r x ^ n = arcLift n s y ^ n at hpower rw [arcLift_zpow hn,arcLift_zpow hn] at hpower have hxy:x = y:=Circle.exp_injOn_Icc (a:=-(Real.pi / 4)) (b:=Real.pi / 4) (by linarith [Real.pi_pos]) (by obtain ⟨h1,h2⟩:=abs_lt.mp hx; exact ⟨h1.le,h2.le⟩) (by obtain ⟨h1,h2⟩:=abs_lt.mp hy; exact ⟨h1.le,h2.le⟩) hpower refine ⟨hxy,(phase_divisibility hn _).mp ?_⟩ rw [h,div_self',hxy,sub_self,zero_add] at hdiv exact hdiv.symm · rintro ⟨hxy,hrs⟩ apply div_eq_one.mp rw [hdiv,hxy,sub_self,zero_add] exact (phase_divisibility hn _).mpr hrs theorem arcLift_eq_iff_zmod {q:ℕ} [NeZero q] (r s:ZMod q) {x y:ℝ} (hx:|x| < Real.pi / 4) (hy:|y| < Real.pi / 4) : arcLift q r.val x = arcLift q s.val y ↔ x = y ∧ r = s:=by have hq:(q:ℤ) ≠ 0:=by exact_mod_cast (NeZero.ne q) rw [arcLift_eq_iff hq _ _ hx hy] have hres:(q:ℤ) ∣ (r.val:ℤ) - (s.val:ℤ) ↔ r = s:=by rw [← ZMod.intCast_zmod_eq_zero_iff_dvd ((r.val:ℤ) - (s.val:ℤ)) q] simp only [Int.cast_sub,ZMod.natCast_val,ZMod.intCast_cast,ZMod.cast_id,sub_eq_zero] rw [hres] private def zz1896:"s0768"="s0768":=by decide+kernel theorem exists_residue_arcLift {q:ℕ} [NeZero q] (z:Circle) (hz:z ^ (q:ℤ) ∈ window) : ∃ (r:ZMod q) (t:ℝ), |t| < Real.pi / 4 ∧ z = arcLift q r.val t:=by have hq:(q:ℤ) ≠ 0:=by exact_mod_cast (NeZero.ne q) obtain ⟨r,t,ht,hr⟩:=exists_arcLift hq z hz refine ⟨(r:ZMod q),t,ht,hr.trans ?_⟩ apply (arcLift_eq_iff hq _ _ ht ht).mpr refine ⟨rfl, ?_⟩ rw [← ZMod.intCast_zmod_eq_zero_iff_dvd] simp theorem arcLift_equation_iff_zmod {q:ℕ} [NeZero q] (r s t:ZMod q) {x y z:ℝ} (hx:|x| < Real.pi / 4) (hy:|y| < Real.pi / 4) (hz:|z| < Real.pi / 4) : arcLift q r.val x * arcLift q s.val y ^ 2 = arcLift q t.val z ^ 3 ↔ x + 2 * y = 3 * z ∧ r + 2 * s = 3 * t:=by have hq:(q:ℤ) ≠ 0:=by exact_mod_cast (NeZero.ne q) rw [arcLift_equation_iff hq _ _ _ hx hy hz] have hres:(q:ℤ) ∣ (r.val:ℤ) + 2 * s.val - 3 * t.val ↔ r + 2 * s = 3 * t:=by rw [← ZMod.intCast_zmod_eq_zero_iff_dvd ((r.val:ℤ) + 2 * s.val - 3 * t.val) q] simp only [Int.cast_sub,Int.cast_add,Int.cast_mul,Int.cast_ofNat, ZMod.natCast_val,ZMod.intCast_cast,ZMod.cast_id,sub_eq_zero] rw [hres] end Green24Proof.CircleArcResidues private def zz2459:"s099b"="s099b":=by decide+kernel end section namespace Green24Proof.CircleArcHaar open MeasureTheory Finset open scoped BigOperators open Green24Proof.CircleProbabilityHaar Green24Proof.CircleArcResidues variable [MeasurableSpace Circle] [BorelSpace Circle] theorem integral_arcLift (F:Circle → ℝ) {q:ℕ} (hq:0 < q) (r:ℕ) : (∫ t in -Real.pi..Real.pi,F (arcLift q r t)) = (q:ℝ) * ∫ t in (-Real.pi + 2 * Real.pi * r) / q.. (Real.pi + 2 * Real.pi * r) / q,F (Circle.exp t):=by have hqR:(q:ℝ) ≠ 0:=by exact_mod_cast (Nat.ne_zero_of_lt hq) simp only [arcLift,Int.cast_natCast] rw [intervalIntegral.integral_comp_add_right (fun t => F (Circle.exp (t / q))), intervalIntegral.integral_comp_div (fun t => F (Circle.exp t)) hqR,smul_eq_mul] theorem integral_sum_arcs_range (F:Circle → ℝ) (hF:Continuous F) {q:ℕ} (hq:0 < q) : (∫ z,F z ∂circleHaar) = (2 * Real.pi * q)⁻¹ * ∑ r ∈ range q, ∫ t in -Real.pi..Real.pi,F (arcLift q r t):=by have hqR:(q:ℝ) ≠ 0:=by exact_mod_cast (Nat.ne_zero_of_lt hq) have hpi:(2:ℝ) * Real.pi ≠ 0:=by positivity let a:ℕ → ℝ:=fun r => (-Real.pi + 2 * Real.pi * r) / q have ha0:a 0 = -Real.pi / q:=by simp [a] have haq:a q = -Real.pi / q + 2 * Real.pi:=by dsimp [a]; field_simp have hstep (r:ℕ):(Real.pi + 2 * Real.pi * r) / (q:ℝ) = a (r + 1):=by dsimp [a] push_cast ring have hs:(∑ r ∈ range q, ∫ t in -Real.pi..Real.pi,F (arcLift q r t)) = (q:ℝ) * ∫ t in a 0..a q,F (Circle.exp t):=by simp_rw [integral_arcLift F hq,hstep] rw [← mul_sum] congr 1 exact intervalIntegral.sum_integral_adjacent_intervals (fun _ _ => (hF.comp Circle.exp.continuous).intervalIntegrable _ _) rw [hs,ha0,haq,integral_exp F hF (-Real.pi / q)] field_simp private def zz1897:"s0769"="s0769":=by decide+kernel theorem sum_residue_vals {q:ℕ} [NeZero q] (f:ℕ → ℝ) : (∑ r ∈ range q,f r) = ∑ r:ZMod q,f r.val:=by apply sum_bij (fun (r:ℕ) _ => (r:ZMod q)) · intro r _ exact mem_univ _ · intro r hr s hs hrs have h:=congrArg ZMod.val hrs simpa only [ZMod.val_natCast_of_lt (mem_range.mp hr), ZMod.val_natCast_of_lt (mem_range.mp hs)] using h · intro r _ exact ⟨r.val,mem_range.mpr (ZMod.val_lt r),by simp⟩ · intro r hr rw [ZMod.val_natCast_of_lt (mem_range.mp hr)] theorem integral_sum_arcs (F:Circle → ℝ) (hF:Continuous F) {q:ℕ} [NeZero q] : (∫ z,F z ∂circleHaar) = (2 * Real.pi * q)⁻¹ * ∑ r:ZMod q, ∫ t in -Real.pi..Real.pi,F (arcLift q r.val t):=by rw [integral_sum_arcs_range F hF (NeZero.pos q),sum_residue_vals] end Green24Proof.CircleArcHaar private def zz2460:"s099c"="s099c":=by decide+kernel end section namespace Green24Proof.TorusArcMass open MeasureTheory open scoped BigOperators open Green24Proof.CircleProbabilityHaar Green24Proof.CircleArcResidues open Green24Proof.CircleArcHaar Green24Proof.TorusCoordinateHaar open Green24Proof.CyclicTorusHaarDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] [DecidableEq ι] noncomputable def sliceMass (p:ι) (F:(ι → Circle) → ℝ) (s:Circle):ℝ := ∫ u,F (join p (s,u)) ∂torusHaar {j:ι // j ≠ p} theorem sliceMass_continuous (p:ι) (F:(ι → Circle) → ℝ) (hF:Continuous F) : Continuous (sliceMass p F):=by letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} have h:=continuous_parametric_integral_of_continuous (μ:=torusHaar {j:ι // j ≠ p}) (f:=fun s u => F (join p (s,u))) (hF.comp (join_continuous p)) (s:=Set.univ) isCompact_univ unfold sliceMass simpa only [Measure.restrict_univ] using h noncomputable def angularPullback (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (r:ZMod q) (v:ℝ × ({j:ι // j ≠ p} → Circle)):ℝ := F (join p (arcLift q r.val v.1,v.2)) omit [Fintype ι] in theorem angularPullback_continuous (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:Continuous F) (r:ZMod q):Continuous (angularPullback p q F r):=by unfold angularPullback arcLift apply hF.comp apply (join_continuous p).comp fun_prop private def zz1898:"s076a"="s076a":=by decide+kernel omit [Fintype ι] in theorem angularPullback_range (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:∀ z,F z ∈ Set.Icc 0 1) (r:ZMod q) (v:ℝ × ({j:ι // j ≠ p} → Circle)) : angularPullback p q F r v ∈ Set.Icc 0 1:=hF _ theorem integral_sum_residue_arcs (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hF:Continuous F) : (∫ z,F z ∂torusHaar ι) = (2 * Real.pi * q)⁻¹ * ∑ r:ZMod q, ∫ t in -Real.pi..Real.pi, ∫ u, angularPullback p q F r (t,u) ∂torusHaar {j:ι // j ≠ p}:=by rw [integral_split_iterated p F hF] exact integral_sum_arcs (sliceMass p F) (sliceMass_continuous p F hF) end Green24Proof.TorusArcMass private def zz2461:"s099d"="s099d":=by decide+kernel end section namespace Green24Proof.TorusArcPairIntegral open MeasureTheory Set open scoped BigOperators open Green24Proof.TorusArcMass Green24Proof.TorusCoordinateHaar open Green24Proof.CircleArcResidues Green24Proof.CyclicTorusHaarDiscrepancy variable [MeasurableSpace Circle] [BorelSpace Circle] variable {X:Type*} [TopologicalSpace X] [FirstCountableTopology X] [LocallyCompactSpace X] theorem torus_marginal_continuous {ι:Type*} [Fintype ι] (K:X × (ι → Circle) → ℝ) (hK:Continuous K) : Continuous (fun x => ∫ u,K (x,u) ∂torusHaar ι):=by letI:=torusHaar_isProbabilityMeasure ι have h:=continuous_parametric_integral_of_continuous (μ:=torusHaar ι) (f:=fun x u => K (x,u)) hK (s:=Set.univ) isCompact_univ simpa only [Measure.restrict_univ] using h theorem interval_marginal_continuous (K:X × ℝ → ℝ) (hK:Continuous K) {a b:ℝ} (hab:a ≤ b) : Continuous (fun x => ∫ t in a..b,K (x,t)):=by have h:=continuous_parametric_integral_of_continuous (μ:=volume) (f:=fun x t => K (x,t)) hK (s:=Icc a b) isCompact_Icc simpa only [integral_Icc_eq_integral_Ioc,intervalIntegral.integral_of_le hab] using h variable {ι:Type*} [Fintype ι] [DecidableEq ι] noncomputable def arcMarginal (p:ι) (q:ℕ) (k:ZMod q) (K:X × (ι → Circle) → ℝ) (x:X):ℝ := ∫ t in -Real.pi..Real.pi, ∫ v, K (x,join p (arcLift q k.val t,v)) ∂torusHaar {j:ι // j ≠ p} private def zz1899:"s076b"="s076b":=by decide+kernel theorem arcMarginal_continuous (p:ι) (q:ℕ) (k:ZMod q) (K:X × (ι → Circle) → ℝ) (hK:Continuous K) : Continuous (arcMarginal p q k K):=by unfold arcMarginal apply interval_marginal_continuous (fun xt:X × ℝ => ∫ v,K (xt.1,join p (arcLift q k.val xt.2,v)) ∂torusHaar {j:ι // j ≠ p}) · apply torus_marginal_continuous (fun xtv:(X × ℝ) × ({j:ι // j ≠ p} → Circle) => K (xtv.1.1,join p (arcLift q k.val xtv.1.2,xtv.2))) apply hK.comp apply Continuous.prodMk continuous_fst.fst apply (join_continuous p).comp unfold arcLift fun_prop · linarith [Real.pi_pos] theorem integral_pair_sum_residue_arcs (p:ι) {q:ℕ} [NeZero q] (K:(ι → Circle) × (ι → Circle) → ℝ) (hK:Continuous K) : (∫ yz,K yz ∂(torusHaar ι).prod (torusHaar ι)) = ((2 * Real.pi * q)⁻¹) ^ 2 * ∑ j:ZMod q, ∑ k:ZMod q, ∫ s in -Real.pi..Real.pi, ∫ u, (∫ t in -Real.pi..Real.pi, ∫ v, K (join p (arcLift q j.val s,u),join p (arcLift q k.val t,v)) ∂torusHaar {i:ι // i ≠ p}) ∂torusHaar {i:ι // i ≠ p}:=by letI:=torusHaar_isProbabilityMeasure ι letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} classical have hinner (y:ι → Circle) : (∫ z,K (y,z) ∂torusHaar ι) = (2 * Real.pi * q)⁻¹ * ∑ k:ZMod q,arcMarginal p q k K y:=by exact integral_sum_residue_arcs p (q:=q) (fun z => K (y,z)) (hK.comp (continuous_const.prodMk continuous_id)) have hcont (k:ZMod q):=arcMarginal_continuous p q k K hK rw [integral_prod _ (hK.integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _))] simp_rw [hinner] rw [integral_const_mul,integral_finsetSum] · simp_rw [integral_sum_residue_arcs p (q:=q) _ (hcont _)] rw [← Finset.mul_sum,Finset.sum_comm] simp only [angularPullback,arcMarginal] ring · intro k _ exact (hcont k).integrable_of_hasCompactSupport (HasCompactSupport.of_compactSpace _) end Green24Proof.TorusArcPairIntegral private def zz2462:"s099e"="s099e":=by decide+kernel end section namespace Green24Proof.CompactTorusArcModel open MeasureTheory Set open scoped BigOperators open Green24Proof.TorusArcMass Green24Proof.TorusCoordinateHaar open Green24Proof.CircleArcResidues Green24Proof.WindowArcGeometry open Green24Proof.SpatialCircleCutoff Green24Proof.CyclicTorusHaarDiscrepancy noncomputable def realCutoff (t:ℝ):ℝ:=max 0 (min 1 (2 - 4 * |t| / Real.pi)) theorem realCutoff_continuous:Continuous realCutoff:=by unfold realCutoff; fun_prop theorem realCutoff_range (t:ℝ):realCutoff t ∈ Icc 0 1 := ⟨le_max_left _ _,max_le (by norm_num) (min_le_left _ _)⟩ private def zz1900:"s076c"="s076c":=by decide+kernel theorem realCutoff_one {t:ℝ} (ht:|t| ≤ Real.pi / 4):realCutoff t = 1:=by have h:4 * |t| / Real.pi ≤ 1:=(div_le_iff₀ Real.pi_pos).mpr (by linarith) unfold realCutoff rw [min_eq_left (by linarith)] norm_num theorem realCutoff_zero {t:ℝ} (ht:Real.pi / 2 ≤ |t|):realCutoff t = 0:=by have h:2 ≤ 4 * |t| / Real.pi:=(le_div_iff₀ Real.pi_pos).mpr (by linarith) unfold realCutoff apply max_eq_left exact (min_le_right _ _).trans (by linarith) variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] [DecidableEq ι] noncomputable def model (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (r:ZMod q) (v:ℝ × ({j:ι // j ≠ p} → Circle)):ℝ := realCutoff v.1 * angularPullback p q F r v omit [Fintype ι] in theorem model_continuous (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:Continuous F) (r:ZMod q):Continuous (model p q F r) := (realCutoff_continuous.comp continuous_fst).mul (angularPullback_continuous p q F hF r) omit [Fintype ι] in theorem model_range (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:∀ z,F z ∈ Icc 0 1) (r:ZMod q) (v:ℝ × ({j:ι // j ≠ p} → Circle)):model p q F r v ∈ Icc 0 1:=by have h1:=realCutoff_range v.1 have h2:=angularPullback_range p q F hF r v exact ⟨mul_nonneg h1.1 h2.1,mul_le_one₀ h1.2 h2.1 h2.2⟩ private def zz1901:"s076d"="s076d":=by decide+kernel omit [Fintype ι] in theorem model_zero_outside (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (r:ZMod q) (v:ℝ × ({j:ι // j ≠ p} → Circle)) (hv:Real.pi / 2 ≤ |v.1|):model p q F r v = 0:=by rw [model,realCutoff_zero hv,zero_mul] omit [Fintype ι] in theorem model_compactSupport (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (r:ZMod q) : HasCompactSupport (model p q F r):=by apply HasCompactSupport.intro (isCompact_Icc.prod (isCompact_univ:IsCompact (univ:Set ({j:ι // j ≠ p} → Circle)))) intro v hv apply model_zero_outside have h:v.1 ∉ Icc (-(Real.pi / 2)) (Real.pi / 2):=fun h => hv ⟨h,trivial⟩ have hn:¬ |v.1| ≤ Real.pi / 2:=fun h' => h (abs_le.mp h') exact (lt_of_not_ge hn).le omit [Fintype ι] in theorem angular_nonzero_small (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hs:∀ z,z p ^ q ∉ window → F z = 0) (r:ZMod q) {t:ℝ} (ht:t ∈ Ioo (-Real.pi) Real.pi) (u:{j:ι // j ≠ p} → Circle) (hval:angularPullback p q F r (t,u) ≠ 0):|t| < Real.pi / 4:=by have hq:(q:ℤ) ≠ 0:=by exact_mod_cast (NeZero.ne q) have hpow:arcLift q r.val t ^ q = Circle.exp t:=by simpa only [zpow_natCast] using arcLift_zpow hq r.val t have hw:Circle.exp t ∈ window:=by by_contra h apply hval apply hs simpa only [join_pivot,hpow] using h have h:=window_arg_bound hw rwa [Circle.arg_exp ht.1 ht.2.le] at h omit [Fintype ι] in theorem model_agrees_on_principal (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hs:∀ z,z p ^ q ∉ window → F z = 0) (r:ZMod q) {t:ℝ} (ht:t ∈ Ioo (-Real.pi) Real.pi) (u:{j:ι // j ≠ p} → Circle) : model p q F r (t,u) = angularPullback p q F r (t,u):=by by_cases h:angularPullback p q F r (t,u) = 0 · simp only [model,h,mul_zero] · rw [model,realCutoff_one (angular_nonzero_small p F hs r ht u h).le,one_mul] private def zz1902:"s076e"="s076e":=by decide+kernel omit [Fintype ι] in theorem model_nonzero_small (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hs:∀ z,z p ^ q ∉ window → F z = 0) (r:ZMod q) (v:ℝ × ({j:ι // j ≠ p} → Circle)) (hv:model p q F r v ≠ 0) : |v.1| < Real.pi / 4:=by have hsmall:|v.1| < Real.pi / 2:=by by_contra h exact hv (model_zero_outside p q F r v (le_of_not_gt h)) have hprincipal:v.1 ∈ Ioo (-Real.pi) Real.pi:=by obtain ⟨h1,h2⟩:=abs_lt.mp hsmall exact ⟨by linarith [Real.pi_pos],by linarith [Real.pi_pos]⟩ have hval:angularPullback p q F r (v.1,v.2) ≠ 0:=by intro h apply hv rw [model,h,mul_zero] exact angular_nonzero_small p F hs r hprincipal v.2 hval theorem model_integrable (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:Continuous F) (r:ZMod q):Integrable (model p q F r) (volume.prod (torusHaar {j:ι // j ≠ p})):=by letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} exact (model_continuous p q F hF r).integrable_of_hasCompactSupport (model_compactSupport p q F r) theorem integral_model_eq_arc (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hF:Continuous F) (hs:∀ z,z p ^ q ∉ window → F z = 0) (r:ZMod q) : (∫ v,model p q F r v ∂volume.prod (torusHaar {j:ι // j ≠ p})) = ∫ t in -Real.pi..Real.pi, ∫ u,angularPullback p q F r (t,u) ∂torusHaar {j:ι // j ≠ p}:=by letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} rw [integral_prod _ (model_integrable p q F hF r)] have hsupport:Function.support (fun t => ∫ u,model p q F r (t,u) ∂torusHaar {j:ι // j ≠ p}) ⊆ Ioc (-Real.pi) Real.pi:=by intro t ht by_contra h have habs:Real.pi / 2 ≤ |t|:=by by_contra h' have ha:=abs_lt.mp (lt_of_not_ge h') exact h ⟨by linarith [Real.pi_pos],by linarith [Real.pi_pos]⟩ have hzero:(∫ u,model p q F r (t,u) ∂torusHaar {j:ι // j ≠ p}) = 0:=by simp_rw [show ∀ u,model p q F r (t,u) = 0 from fun u => model_zero_outside p q F r (t,u) habs] exact integral_zero _ _ exact ht hzero rw [← intervalIntegral.integral_eq_integral_of_support_subset hsupport] apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro t ht apply integral_congr_ae filter_upwards [] with u exact model_agrees_on_principal p F hs r ht u theorem mass_identity (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hF:Continuous F) (hs:∀ z,z p ^ q ∉ window → F z = 0) : (∫ z,F z ∂torusHaar ι) = (2 * Real.pi * q)⁻¹ * ∑ r:ZMod q, ∫ v,model p q F r v ∂volume.prod (torusHaar {j:ι // j ≠ p}):=by rw [integral_sum_residue_arcs p (q:=q) F hF] congr 1 apply Finset.sum_congr rfl intro r _ exact (integral_model_eq_arc p F hF hs r).symm end Green24Proof.CompactTorusArcModel private def zz2463:"s099f"="s099f":=by decide+kernel end section namespace Green24Proof.ArcLiftAlgebra open Green24Proof.CircleArcResidues private def zz1903:"s076f"="s076f":=by decide+kernel theorem arcLift_mul (n r s:ℤ) (x y:ℝ) : arcLift n (r + s) (x + y) = arcLift n r x * arcLift n s y:=by unfold arcLift rw [← Circle.exp_add] congr 1 push_cast ring theorem arcLift_zpow_linear (n r k:ℤ) (x:ℝ) : arcLift n (k * r) ((k:ℝ) * x) = arcLift n r x ^ k:=by unfold arcLift rw [← Circle.exp_intCast_mul] congr 1 push_cast ring theorem arcLift_change_label {n:ℤ} (hn:n ≠ 0) (r s:ℤ) (t:ℝ) (h:n ∣ r - s):arcLift n r t = arcLift n s t:=by apply div_eq_one.mp have heq:arcLift n r t / arcLift n s t = Circle.exp ((2 * Real.pi * (r - s:ℤ)) / n):=by unfold arcLift rw [← Circle.exp_sub] congr 1 push_cast ring rw [heq] exact (phase_divisibility hn _).mpr h theorem arcLift_affine {q:ℕ} [NeZero q] (j k:ZMod q) (s t:ℝ) : arcLift q k.val t ^ 3 * arcLift q j.val s ^ (-2:ℤ) = arcLift q (3 * k - 2 * j).val (3 * t - 2 * s):=by have hq:(q:ℤ) ≠ 0:=by exact_mod_cast (NeZero.ne q) let R:ℤ:=3 * k.val - 2 * j.val have halg:arcLift q k.val t ^ 3 * arcLift q j.val s ^ (-2:ℤ) = arcLift q R (3 * t - 2 * s):=by change arcLift q k.val t ^ (3:ℤ) * arcLift q j.val s ^ (-2:ℤ) = _ rw [← arcLift_zpow_linear, ← arcLift_zpow_linear, ← arcLift_mul] congr 1 simp ring rw [halg] apply arcLift_change_label hq rw [← ZMod.intCast_zmod_eq_zero_iff_dvd (R - ((3 * k - 2 * j).val:ℤ)) q] simp [R] end Green24Proof.ArcLiftAlgebra private def zz2464:"s09a0"="s09a0":=by decide+kernel end section namespace Green24Proof.WindowExpUnwrapping open Green24Proof.WindowArcGeometry Green24Proof.SpatialCircleCutoff private def zz1904:"s0770"="s0770":=by decide+kernel theorem small_of_exp_mem_window {t:ℝ} (ht:|t| < 7 * Real.pi / 4) (hw:Circle.exp t ∈ window):|t| < Real.pi / 4:=by let a:=Complex.arg (Circle.exp t:ℂ) have ha:|a| < Real.pi / 4:=window_arg_bound hw have he:Circle.exp (t - a) = 1:=by rw [Circle.exp_sub] have h:Circle.exp a = Circle.exp t:=Circle.exp_arg _ rw [h] simp have hdiff:|t - a| < 2 * Real.pi:=by have h:=abs_add_le t (-a) rw [abs_neg, ← sub_eq_add_neg] at h linarith have hzero:=exp_eq_one_no_wrap hdiff he have hta:t = a:=sub_eq_zero.mp hzero rwa [hta] end Green24Proof.WindowExpUnwrapping private def zz2465:"s09a1"="s09a1":=by decide+kernel end section namespace Green24Proof.CompactTorusArcCounting open Set open Green24Proof.CompactTorusArcModel Green24Proof.TorusArcMass open Green24Proof.TorusCoordinateHaar Green24Proof.CircleArcResidues open Green24Proof.SpatialCircleCutoff Green24Proof.WindowExpUnwrapping open Green24Proof.ArcLiftAlgebra variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [DecidableEq ι] theorem model_agrees_on_wide (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hs:∀ z,z p ^ q ∉ window → F z = 0) (r:ZMod q) {t:ℝ} (ht:|t| < 7 * Real.pi / 4) (u:{j:ι // j ≠ p} → Circle) : model p q F r (t,u) = angularPullback p q F r (t,u):=by by_cases hval:angularPullback p q F r (t,u) = 0 · simp only [model,hval,mul_zero] have hq:(q:ℤ) ≠ 0:=by exact_mod_cast (NeZero.ne q) have hpow:arcLift q r.val t ^ q = Circle.exp t:=by simpa only [zpow_natCast] using arcLift_zpow hq r.val t have hw:Circle.exp t ∈ window:=by by_contra h apply hval apply hs simpa only [join_pivot,hpow] using h rw [model,realCutoff_one (small_of_exp_mem_window ht hw).le,one_mul] theorem counting_integrand_identity (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hs:∀ z,z p ^ q ∉ window → F z = 0) (j k:ZMod q) {s t:ℝ} (hs':s ∈ Ioo (-Real.pi) Real.pi) (ht':t ∈ Ioo (-Real.pi) Real.pi) (u v:{j:ι // j ≠ p} → Circle) : F ((join p (arcLift q k.val t,v)) ^ 3 * (join p (arcLift q j.val s,u)) ^ (-2:ℤ)) * F (join p (arcLift q j.val s,u)) * F (join p (arcLift q k.val t,v)) = model p q F (3 * k - 2 * j) (3 * t - 2 * s,v ^ 3 * u ^ (-2:ℤ)) * model p q F j (s,u) * model p q F k (t,v):=by have hpoint:(join p (arcLift q k.val t,v)) ^ 3 * (join p (arcLift q j.val s,u)) ^ (-2:ℤ) = join p (arcLift q (3 * k - 2 * j).val (3 * t - 2 * s),v ^ 3 * u ^ (-2:ℤ)):=by rw [← join_equation] congr 1 apply Prod.ext · exact arcLift_affine j k s t · rfl rw [hpoint] change angularPullback p q F (3 * k - 2 * j) (3 * t - 2 * s,v ^ 3 * u ^ (-2:ℤ)) * angularPullback p q F j (s,u) * angularPullback p q F k (t,v) = _ rw [← model_agrees_on_principal p F hs j hs' u, ← model_agrees_on_principal p F hs k ht' v] by_cases hj:model p q F j (s,u) = 0 · simp only [hj,mul_zero,zero_mul] by_cases hk:model p q F k (t,v) = 0 · simp only [hk,mul_zero] have hs0:=model_nonzero_small p F hs j (s,u) hj have ht0:=model_nonzero_small p F hs k (t,v) hk have hwide:|3 * t - 2 * s| < 7 * Real.pi / 4:=by have h:=abs_add_le (3 * t) (-(2 * s)) rw [← sub_eq_add_neg,abs_neg,abs_mul,abs_mul] at h norm_num at h change |s| < Real.pi / 4 at hs0 change |t| < Real.pi / 4 at ht0 nlinarith [Real.pi_pos] rw [model_agrees_on_wide p F hs (3 * k - 2 * j) hwide] end Green24Proof.CompactTorusArcCounting private def zz2466:"s09a2"="s09a2":=by decide+kernel end section namespace Green24Proof.CyclicCharacterRefinement open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage open Green24Proof.FinitePartitionRefinement open Green24Proof.FiniteScalarQuantization (resolution) open Green24Proof.CyclicWeakRegularity (FourierUniform stepBound stepBound_exceeds_energy normalized_energy_nonneg normalized_energy_le_one energy_comp_injective) open Green24Proof.CyclicShiftedCharacterFactor open Green24Proof.ShiftedScalarQuantization (gridValue gridValue_mem_Icc) open Green24Proof.FiniteGridBoundaryAvoidance variable {q M:ℕ} [NeZero q] variable {β:Type*} [Fintype β] [DecidableEq β] noncomputable def combinedFactor {n:ℕ} (ρ:ZMod q → β) (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (x:ZMod q):β × Alphabet η n:=(ρ x,phaseFactor η ks bs as x) omit [Fintype β] [DecidableEq β] in theorem combinedFactor_refines {n:ℕ} (ρ:ZMod q → β) (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (x:ZMod q) : ρ x = (combinedFactor ρ η ks bs as x).1:=rfl private def zz1905:"s0771"="s0771":=by decide+kernel omit [Fintype β] in theorem combinedFactor_zero_energy (ρ:ZMod q → β) (f:ZMod q → ℝ) (η:ℝ) (ks:Fin 0 → ZMod q) (bs:Fin 0 → Bool) (as:Fin 0 → Fin M) : Green24Proof.FinitePartitionRefinement.energy (combinedFactor ρ η ks bs as) f = Green24Proof.FinitePartitionRefinement.energy ρ f:=by let e:β → β × Alphabet η 0:=fun b => (b,Fin.elim0) have he:Function.Injective e:=fun _ _ h => congrArg Prod.fst h have hp:combinedFactor ρ η ks bs as = fun x => e (ρ x):=by funext x apply Prod.ext · rfl · exact Subsingleton.elim _ _ rw [hp,energy_comp_injective ρ e he f] theorem exists_combined_extension {n:ℕ} (ρ:ZMod q → β) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) (k:ZMod q) (hlarge:η * q ≤ ‖ZMod.dft (fun x => ((f x - average (combinedFactor ρ η ks bs as) f x:ℝ):ℂ)) k‖) : ∃ (b:Bool) (a:Fin M), M * (badSamples a (characterCoordinate η k b)).card ≤ q ∧ Green24Proof.FinitePartitionRefinement.energy (combinedFactor ρ η ks bs as) f / q + η ^ 2 / 16 ≤ Green24Proof.FinitePartitionRefinement.energy (combinedFactor ρ η (Fin.cons k ks) (Fin.cons b bs) (Fin.cons a as)) f / q:=by let σ:=combinedFactor ρ η ks bs as have hr:∀ x, |f x - average σ f x| ≤ 1 := fun x => abs_le.mpr (residual_mem_Icc σ f hf x) obtain ⟨b,a,ha,hc⟩:=exists_shifted_correlating_component (fun x => f x - average σ f x) k hr hη hM hlarge let π:=combinedFactor ρ η (Fin.cons k ks) (Fin.cons b bs) (Fin.cons a as) let φ:β × Alphabet η (n + 1) → β × Alphabet η n:=fun v => (v.1,Fin.tail v.2) let g:β × Alphabet η (n + 1) → ℝ:=fun v => gridValue (resolution η) (offset a) (v.2 0) have hg:∀ x, |g (π x)| ≤ 1 := fun x => abs_le.mpr (gridValue_mem_Icc (resolution η) (offset a) ((π x).2 0)) have href:∀ x,σ x = φ (π x):=by intro x apply Prod.ext rfl exact phaseFactor_cons_tail η ks bs as k b a x have hcorr:(η / 4) * Fintype.card (ZMod q) ≤ |∑ x,(f x - average σ f x) * g (π x)|:=by simpa only [ZMod.card,g,π,combinedFactor,phaseFactor_cons,Fin.cons_zero] using hc have hi:=normalized_energy_increment π σ φ href f g (show 0 ≤ η / 4 by positivity) hg hcorr refine ⟨b,a,ha, ?_⟩ norm_num only [ZMod.card,div_pow] at hi exact hi theorem exists_uniform_refinement_or_large_energy (ρ:ZMod q → β) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) (n:ℕ) : (∃ j ≤ n, ∃ (ks:Fin j → ZMod q) (bs:Fin j → Bool) (as:Fin j → Fin M), BoundaryControlled η ks bs as ∧ FourierUniform (combinedFactor ρ η ks bs as) f η) ∨ ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M), BoundaryControlled η ks bs as ∧ Green24Proof.FinitePartitionRefinement.energy ρ f / q + (n:ℝ) * (η ^ 2 / 16) ≤ Green24Proof.FinitePartitionRefinement.energy (combinedFactor ρ η ks bs as) f / q:=by classical induction n with | zero => right let ks:Fin 0 → ZMod q:=Fin.elim0 let bs:Fin 0 → Bool:=Fin.elim0 let as:Fin 0 → Fin M:=Fin.elim0 refine ⟨ks,bs,as,fun i => Fin.elim0 i, ?_⟩ simp only [Nat.cast_zero,zero_mul,add_zero,combinedFactor_zero_energy,le_refl] | succ n ih => rcases ih with ⟨j,hj,ks,bs,as,hc,hu⟩ | ⟨ks,bs,as,hc,he⟩ · exact Or.inl ⟨j,hj.trans (Nat.le_succ n),ks,bs,as,hc,hu⟩ · by_cases hu:FourierUniform (combinedFactor ρ η ks bs as) f η · exact Or.inl ⟨n,Nat.le_succ n,ks,bs,as,hc,hu⟩ · change ¬ ∀ k, ‖ZMod.dft (fun x => ((f x - average (combinedFactor ρ η ks bs as) f x:ℝ):ℂ)) k‖ ≤ η * q at hu obtain ⟨k,hk⟩:=not_forall.mp hu obtain ⟨b,a,ha,hi⟩:=exists_combined_extension ρ f hf hη hM ks bs as k (lt_of_not_ge hk).le right refine ⟨Fin.cons k ks,Fin.cons b bs,Fin.cons a as, boundaryControlled_cons hc ha, ?_⟩ rw [Nat.cast_add,Nat.cast_one] nlinarith theorem exists_uniform_character_refinement (ρ:ZMod q → β) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M), BoundaryControlled η ks bs as ∧ FourierUniform (combinedFactor ρ η ks bs as) f η:=by rcases exists_uniform_refinement_or_large_energy ρ f hf hη hM (stepBound η) with h | ⟨ks,bs,as,_hc,he⟩ · exact h · have hu:=normalized_energy_le_one (combinedFactor ρ η ks bs as) f hf have hl:=stepBound_exceeds_energy hη have h0:=normalized_energy_nonneg ρ f exfalso linarith private def zz1906:"s0772"="s0772":=by decide+kernel theorem combinedFactor_energy_identity {n:ℕ} (ρ:ZMod q → β) (f:ZMod q → ℝ) (η:ℝ) (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M) : Green24Proof.FinitePartitionRefinement.energy (combinedFactor ρ η ks bs as) f = Green24Proof.FinitePartitionRefinement.energy ρ f + ∑ x,(average (combinedFactor ρ η ks bs as) f x - average ρ f x) ^ 2 := refinement_energy_identity _ ρ Prod.fst (fun _ => rfl) f theorem exists_bounded_character_refinement (ρ:ZMod q → β) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) (hM:0 < M) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (as:Fin n → Fin M), Fintype.card (β × Alphabet η n) ≤ Fintype.card β * (2 * resolution η + 2) ^ stepBound η ∧ BoundaryControlled η ks bs as ∧ (∀ x,ρ x = (combinedFactor ρ η ks bs as x).1) ∧ FourierUniform (combinedFactor ρ η ks bs as) f η ∧ Green24Proof.FinitePartitionRefinement.energy (combinedFactor ρ η ks bs as) f = Green24Proof.FinitePartitionRefinement.energy ρ f + ∑ x,(average (combinedFactor ρ η ks bs as) f x - average ρ f x) ^ 2:=by obtain ⟨n,hn,ks,bs,as,hc,hu⟩:=exists_uniform_character_refinement ρ f hf hη hM refine ⟨n,hn,ks,bs,as, ?_,hc,fun _ => rfl,hu, combinedFactor_energy_identity ρ f η ks bs as⟩ simp only [Fintype.card_prod,Alphabet,Fintype.card_fun,Fintype.card_fin] exact Nat.mul_le_mul_left _ (Nat.pow_le_pow_right (by omega) hn) end Green24Proof.CyclicCharacterRefinement private def zz2467:"s09a3"="s09a3":=by decide+kernel end section namespace Green24Proof.FinitePartitionEnergyPigeonhole open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage open Green24Proof.FinitePartitionRefinement open Green24Proof.CyclicWeakRegularity theorem exists_small_step (E:ℕ → ℝ) {N:ℕ} {ε:ℝ} (h0:0 ≤ E 0) (hN:E N ≤ 1) (hsteps:1 < (N:ℝ) * ε) : ∃ i < N,E (i + 1) - E i ≤ ε:=by by_contra hn push Not at hn have hs:(N:ℝ) * ε ≤ ∑ i ∈ Finset.range N,(E (i + 1) - E i):=by calc (N:ℝ) * ε = ∑ _i ∈ Finset.range N,ε:=by simp _ ≤ _:=Finset.sum_le_sum (fun i hi => (hn i (Finset.mem_range.mp hi)).le) rw [Finset.sum_range_sub] at hs linarith noncomputable def outerSteps (ε:ℝ):ℕ:=⌈1 / ε⌉₊ + 1 theorem outerSteps_exceeds {ε:ℝ} (hε:0 < ε) : 1 < (outerSteps ε:ℝ) * ε:=by have hc:=Nat.le_ceil (1 / ε) have hb:1 / ε < (outerSteps ε:ℝ):=by unfold outerSteps push_cast linarith exact (div_lt_iff₀ hε).mp hb variable {q:ℕ} [NeZero q] variable {β:ℕ → Type*} [∀ i,Fintype (β i)] [∀ i,DecidableEq (β i)] private def zz1907:"s0773"="s0773":=by decide+kernel theorem exists_small_average_gap (ρ:(i:ℕ) → ZMod q → β i) (φ:(i:ℕ) → β (i + 1) → β i) (href:∀ i x,ρ i x = φ i (ρ (i + 1) x)) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {N:ℕ} {ε:ℝ} (hsteps:1 < (N:ℝ) * ε) : ∃ i < N,(∑ x,(average (ρ (i + 1)) f x - average (ρ i) f x) ^ 2) ≤ ε * q:=by have hq:(0:ℝ) < q:=Nat.cast_pos.mpr (NeZero.pos q) obtain ⟨i,hi,he⟩:=exists_small_step (fun i => Green24Proof.FinitePartitionRefinement.energy (ρ i) f / q) (normalized_energy_nonneg (ρ 0) f) (normalized_energy_le_one (ρ N) f hf) hsteps refine ⟨i,hi, ?_⟩ have hident:=refinement_energy_identity (ρ (i + 1)) (ρ i) (φ i) (href i) f have hd:(∑ x,(average (ρ (i + 1)) f x - average (ρ i) f x) ^ 2) / q ≤ ε:=by rw [hident,add_div] at he linarith exact (div_le_iff₀ hq).mp hd theorem exists_small_gap_with_uniform_fine (ρ:(i:ℕ) → ZMod q → β i) (φ:(i:ℕ) → β (i + 1) → β i) (href:∀ i x,ρ i x = φ i (ρ (i + 1) x)) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) (τ:ℕ → ℝ) (hU:∀ i,FourierUniform (ρ (i + 1)) f (τ i)) {ε:ℝ} (hε:0 < ε) : ∃ i < outerSteps ε, (∑ x,(average (ρ (i + 1)) f x - average (ρ i) f x) ^ 2) ≤ ε * q ∧ FourierUniform (ρ (i + 1)) f (τ i):=by obtain ⟨i,hi,hg⟩:=exists_small_average_gap ρ φ href f hf (outerSteps_exceeds hε) exact ⟨i,hi,hg,hU i⟩ end Green24Proof.FinitePartitionEnergyPigeonhole private def zz2468:"s09a4"="s09a4":=by decide+kernel end section namespace Green24Proof.CyclicCharacterBlockChain open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage open Green24Proof.FinitePartitionRefinement open Green24Proof.FiniteScalarQuantization (resolution) open Green24Proof.CyclicWeakRegularity (FourierUniform stepBound normalized_energy_nonneg normalized_energy_le_one) open Green24Proof.CyclicShiftedCharacterFactor (Alphabet phaseFactor BoundaryControlled) open Green24Proof.CyclicCharacterRefinement open Green24Proof.FinitePartitionEnergyPigeonhole variable (q:ℕ) [NeZero q] structure Block where tolerance:ℝ denominator:ℕ length:ℕ frequencies:Fin length → ZMod q components:Fin length → Bool offsets:Fin length → Fin denominator variable {q} def Labels:List (Block q) → Type | [] => Unit | b :: bs => Labels bs × Alphabet b.tolerance b.length noncomputable def labelsFintype:(bs:List (Block q)) → Fintype (Labels bs) | [] => inferInstanceAs (Fintype Unit) | b :: bs => by letI:=labelsFintype bs exact inferInstanceAs (Fintype (Labels bs × Alphabet b.tolerance b.length)) noncomputable def labelsDecidableEq:(bs:List (Block q)) → DecidableEq (Labels bs) | [] => inferInstanceAs (DecidableEq Unit) | b :: bs => by letI:=labelsDecidableEq bs exact inferInstanceAs (DecidableEq (Labels bs × Alphabet b.tolerance b.length)) noncomputable def factor:(bs:List (Block q)) → ZMod q → Labels bs | [] => fun _ => () | b :: bs => fun x => (factor bs x, phaseFactor b.tolerance b.frequencies b.components b.offsets x) noncomputable def blockCost (b:Block q):ℕ := b.length + resolution b.tolerance * b.denominator noncomputable def complexity:List (Block q) → ℕ | [] => 1 | b :: bs => complexity bs + blockCost b def coordinateCount:List (Block q) → ℕ | [] => 0 | b :: bs => coordinateCount bs + b.length omit [NeZero q] in theorem coordinateCount_le_complexity (bs:List (Block q)) : coordinateCount bs ≤ complexity bs:=by induction bs with | nil => simp [coordinateCount,complexity] | cons b bs ih => simp only [coordinateCount,complexity,blockCost]; omega omit [NeZero q] in theorem block_scale_le_complexity {b:Block q} {bs:List (Block q)} (hb:b ∈ bs) : resolution b.tolerance * b.denominator ≤ complexity bs:=by induction bs with | nil => simp at hb | cons c bs ih => simp only [List.mem_cons] at hb rcases hb with rfl | hb · simp only [complexity,blockCost]; omega · have hi:=ih hb simp only [complexity]; omega private def zz1908:"s0774"="s0774":=by decide+kernel theorem exists_extension_block (bs:List (Block q)) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) {M:ℕ} (hM:0 < M) : letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq; ∃ b:Block q,b.tolerance = η ∧ b.denominator = M ∧ b.length ≤ stepBound η ∧ BoundaryControlled b.tolerance b.frequencies b.components b.offsets ∧ FourierUniform (factor (b :: bs)) f η:=by letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq letI:(bs:List (Block q)) → Fintype (Labels bs):=labelsFintype obtain ⟨n,hn,ks,cs,offsets,hc,hu⟩ := exists_uniform_character_refinement (factor bs) f hf hη hM exact ⟨⟨η,M,n,ks,cs,offsets⟩,rfl,rfl,hn,hc,hu⟩ noncomputable def extensionBlock (bs:List (Block q)) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) {M:ℕ} (hM:0 < M):Block q := Classical.choose (exists_extension_block bs f hf hη hM) theorem extensionBlock_spec (bs:List (Block q)) (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) {M:ℕ} (hM:0 < M) : letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq; let b:=extensionBlock bs f hf hη hM b.tolerance = η ∧ b.denominator = M ∧ b.length ≤ stepBound η ∧ BoundaryControlled b.tolerance b.frequencies b.components b.offsets ∧ FourierUniform (factor (b :: bs)) f η := Classical.choose_spec (exists_extension_block bs f hf hη hM) noncomputable def budget (τ:ℕ → ℝ) (D:ℕ → ℕ):ℕ → ℕ | 0 => 1 | i + 1 => budget τ D i + stepBound (τ (budget τ D i)) + resolution (τ (budget τ D i)) * D (budget τ D i) theorem budget_mono (τ:ℕ → ℝ) (D:ℕ → ℕ):Monotone (budget τ D):=by apply monotone_nat_of_le_succ intro i simp only [budget] omega variable (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) (τ:ℕ → ℝ) (hτ:∀ C,0 < τ C) (D:ℕ → ℕ) (hD:∀ C,0 < D C) noncomputable def chain:ℕ → List (Block q) | 0 => [] | i + 1 => extensionBlock (chain i) f hf (hτ (budget τ D i)) (hD (budget τ D i)) :: chain i theorem chain_complexity_le (i:ℕ) : complexity (chain f hf τ hτ D hD i) ≤ budget τ D i:=by induction i with | zero => rfl | succ i ih => have hs:=extensionBlock_spec (chain f hf τ hτ D hD i) f hf (hτ (budget τ D i)) (hD (budget τ D i)) simp only [chain,complexity,blockCost] rw [hs.1,hs.2.1] have hn:=hs.2.2.1 simp only [budget] omega private def zz1909:"s0775"="s0775":=by decide+kernel theorem chain_blocks_controlled (i:ℕ) (b:Block q) (hb:b ∈ chain f hf τ hτ D hD i) : 0 < b.tolerance ∧ 0 < b.denominator ∧ BoundaryControlled b.tolerance b.frequencies b.components b.offsets:=by induction i with | zero => simp [chain] at hb | succ i ih => simp only [chain,List.mem_cons] at hb rcases hb with rfl | hb · have hs:=extensionBlock_spec (chain f hf τ hτ D hD i) f hf (hτ (budget τ D i)) (hD (budget τ D i)) refine ⟨?_, ?_,hs.2.2.2.1⟩ · rw [hs.1] exact hτ _ · rw [hs.2.1] exact hD _ · exact ih hb theorem chain_uniform (i:ℕ) : letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq; FourierUniform (factor (chain f hf τ hτ D hD (i + 1))) f (τ (budget τ D i)):=by letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq letI:(bs:List (Block q)) → Fintype (Labels bs):=labelsFintype exact (extensionBlock_spec (chain f hf τ hτ D hD i) f hf (hτ (budget τ D i)) (hD (budget τ D i))).2.2.2.2 noncomputable def chainProjection (i:ℕ) : Labels (chain f hf τ hτ D hD (i + 1)) → Labels (chain f hf τ hτ D hD i):=Prod.fst theorem chain_refines (i:ℕ) (x:ZMod q) : factor (chain f hf τ hτ D hD i) x = chainProjection f hf τ hτ D hD i (factor (chain f hf τ hτ D hD (i + 1)) x):=rfl theorem exists_small_gap_with_complexity_tolerance {ε:ℝ} (hε:0 < ε) : letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq; ∃ i < outerSteps ε, complexity (chain f hf τ hτ D hD i) ≤ budget τ D i ∧ complexity (chain f hf τ hτ D hD (i + 1)) ≤ budget τ D (outerSteps ε) ∧ (∑ x,(average (factor (chain f hf τ hτ D hD (i + 1))) f x - average (factor (chain f hf τ hτ D hD i)) f x) ^ 2) ≤ ε * q ∧ FourierUniform (factor (chain f hf τ hτ D hD (i + 1))) f (τ (budget τ D i)):=by letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq letI:(bs:List (Block q)) → Fintype (Labels bs):=labelsFintype obtain ⟨i,hi,hg,hu⟩:=exists_small_gap_with_uniform_fine (fun i => factor (chain f hf τ hτ D hD i)) (chainProjection f hf τ hτ D hD) (chain_refines f hf τ hτ D hD) f hf (fun i => τ (budget τ D i)) (chain_uniform f hf τ hτ D hD) hε exact ⟨i,hi,chain_complexity_le f hf τ hτ D hD i, (chain_complexity_le f hf τ hτ D hD (i + 1)).trans (budget_mono τ D (by omega)),hg,hu⟩ end Green24Proof.CyclicCharacterBlockChain private def zz2469:"s09a5"="s09a5":=by decide+kernel end section namespace Green24Proof.CyclicCharacterChainBoundary open Finset open scoped BigOperators open Green24Proof.FinitePartitionAverage open Green24Proof.FiniteScalarQuantization (resolution) open Green24Proof.CyclicWeakRegularity (FourierUniform stepBound) open Green24Proof.CyclicShiftedCharacterFactor open Green24Proof.CyclicCharacterBlockChain open Green24Proof.FiniteGridBoundaryAvoidance open Green24Proof.FinitePartitionEnergyPigeonhole variable {q:ℕ} [NeZero q] noncomputable def blockBad (b:Block q):Finset (ZMod q) := badCoordinateSamples b.offsets (fun x i => characterCoordinate b.tolerance (b.frequencies i) (b.components i) x) noncomputable def allBad:List (Block q) → Finset (ZMod q) | [] => ∅ | b :: bs => blockBad b ∪ allBad bs noncomputable def boundaryMass:List (Block q) → ℝ | [] => 0 | b :: bs => boundaryMass bs + (b.length:ℝ) / b.denominator private def zz1910:"s0776"="s0776":=by decide+kernel theorem blockBad_card_le (b:Block q) (hM:0 < b.denominator) (hc:BoundaryControlled b.tolerance b.frequencies b.components b.offsets) : ((blockBad b).card:ℝ) ≤ (b.length:ℝ) / b.denominator * q:=by have hb:=boundary_union_card_bound hc have hMR:(0:ℝ) < b.denominator:=Nat.cast_pos.mpr hM calc ((blockBad b).card:ℝ) ≤ (b.length:ℝ) * q / b.denominator:=by apply (le_div_iff₀ hMR).mpr have h:(b.denominator:ℝ) * (blockBad b).card ≤ (b.length:ℝ) * q:=by exact_mod_cast hb simpa only [mul_comm] using h _ = _:=by ring theorem allBad_card_le (bs:List (Block q)) (hc:∀ b ∈ bs,0 < b.denominator ∧ BoundaryControlled b.tolerance b.frequencies b.components b.offsets) : ((allBad bs).card:ℝ) ≤ boundaryMass bs * q:=by induction bs with | nil => simp [allBad,boundaryMass] | cons b bs ih => have hb:=hc b (List.mem_cons_self ..) have ht:=ih (fun c h => hc c (List.mem_cons_of_mem _ h)) have hblock:=blockBad_card_le b hb.1 hb.2 have hu:(((blockBad b ∪ allBad bs).card:ℕ):ℝ) ≤ (blockBad b).card + (allBad bs).card:=by exact_mod_cast Finset.card_union_le (blockBad b) (allBad bs) change ((blockBad b ∪ allBad bs).card:ℝ) ≤ (boundaryMass bs + (b.length:ℝ) / b.denominator) * q nlinarith noncomputable def denominator (τ:ℕ → ℝ) (δ:ℝ) (C:ℕ):ℕ := ⌈(stepBound (τ C):ℝ) / δ⌉₊ + 1 theorem denominator_pos (τ:ℕ → ℝ) (δ:ℝ) (C:ℕ):0 < denominator τ δ C := Nat.succ_pos _ theorem denominator_precision (τ:ℕ → ℝ) {δ:ℝ} (hδ:0 < δ) (C:ℕ) : (stepBound (τ C):ℝ) / denominator τ δ C ≤ δ:=by have hD:(0:ℝ) < denominator τ δ C:=Nat.cast_pos.mpr (denominator_pos τ δ C) have hc:=Nat.le_ceil ((stepBound (τ C):ℝ) / δ) have hb:(stepBound (τ C):ℝ) / δ ≤ denominator τ δ C:=by unfold denominator push_cast linarith have hm:=(div_le_iff₀ hδ).mp hb apply (div_le_iff₀ hD).mpr nlinarith variable (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) (τ:ℕ → ℝ) (hτ:∀ C,0 < τ C) (D:ℕ → ℕ) (hD:∀ C,0 < D C) private def zz1911:"s0777"="s0777":=by decide+kernel theorem chain_boundaryMass_le {δ:ℝ} (hprecision:∀ C,(stepBound (τ C):ℝ) / D C ≤ δ) (i:ℕ) : boundaryMass (chain f hf τ hτ D hD i) ≤ (i:ℝ) * δ:=by induction i with | zero => simp [chain,boundaryMass] | succ i ih => have hs:=extensionBlock_spec (chain f hf τ hτ D hD i) f hf (hτ (budget τ D i)) (hD (budget τ D i)) have hl:((extensionBlock (chain f hf τ hτ D hD i) f hf (hτ (budget τ D i)) (hD (budget τ D i))).length:ℝ) ≤ stepBound (τ (budget τ D i)):=by exact_mod_cast hs.2.2.1 have hp:=(div_le_div_of_nonneg_right hl (Nat.cast_nonneg (D (budget τ D i)))).trans (hprecision (budget τ D i)) simp only [chain,boundaryMass,Nat.cast_add,Nat.cast_one] rw [hs.2.1] linarith theorem chain_allBad_card_le {δ:ℝ} (hprecision:∀ C,(stepBound (τ C):ℝ) / D C ≤ δ) (i:ℕ) : ((allBad (chain f hf τ hτ D hD i)).card:ℝ) ≤ (i:ℝ) * δ * q:=by have hc:=allBad_card_le (chain f hf τ hτ D hD i) (fun b hb => (chain_blocks_controlled f hf τ hτ D hD i b hb).2) exact hc.trans (mul_le_mul_of_nonneg_right (chain_boundaryMass_le f hf τ hτ D hD hprecision i) (Nat.cast_nonneg q)) omit D hD in theorem exists_small_gap_and_small_boundaries {ε κ:ℝ} (hε:0 < ε) (hκ:0 < κ) : letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq; let N:=outerSteps ε let δ:=κ / N let Ds:=denominator τ δ let hDs:=denominator_pos τ δ ∃ i < N, complexity (chain f hf τ hτ Ds hDs i) ≤ budget τ Ds i ∧ complexity (chain f hf τ hτ Ds hDs (i + 1)) ≤ budget τ Ds N ∧ (∑ x,(average (factor (chain f hf τ hτ Ds hDs (i + 1))) f x - average (factor (chain f hf τ hτ Ds hDs i)) f x) ^ 2) ≤ ε * q ∧ FourierUniform (factor (chain f hf τ hτ Ds hDs (i + 1))) f (τ (budget τ Ds i)) ∧ ((allBad (chain f hf τ hτ Ds hDs i)).card:ℝ) ≤ κ * q ∧ ((allBad (chain f hf τ hτ Ds hDs (i + 1))).card:ℝ) ≤ κ * q:=by letI:(bs:List (Block q)) → DecidableEq (Labels bs):=labelsDecidableEq letI:(bs:List (Block q)) → Fintype (Labels bs):=labelsFintype let N:=outerSteps ε have hN:(0:ℝ) < N:=by exact Nat.cast_pos.mpr (Nat.succ_pos _) let δ:=κ / N have hδ:0 < δ:=div_pos hκ hN let Ds:=denominator τ δ let hDs:=denominator_pos τ δ obtain ⟨i,hi,hcoarse,hfine,hgap,hunif⟩ := exists_small_gap_with_complexity_tolerance f hf τ hτ Ds hDs hε have hbound (j:ℕ) (hj:j ≤ N) : ((allBad (chain f hf τ hτ Ds hDs j)).card:ℝ) ≤ κ * q:=by have hb:=chain_allBad_card_le f hf τ hτ Ds hDs (denominator_precision τ hδ) j have hjR:(j:ℝ) ≤ N:=by exact_mod_cast hj have hmul:(j:ℝ) * δ ≤ κ:=by calc (j:ℝ) * δ ≤ (N:ℝ) * δ:=mul_le_mul_of_nonneg_right hjR hδ.le _ = κ:=by dsimp [δ]; field_simp exact hb.trans (mul_le_mul_of_nonneg_right hmul (Nat.cast_nonneg q)) refine ⟨i,hi,hcoarse,hfine,hgap,hunif, ?_, ?_⟩ · exact hbound i (Nat.le_of_lt hi) · exact hbound (i + 1) (by omega) end Green24Proof.CyclicCharacterChainBoundary private def zz2470:"s09a6"="s09a6":=by decide+kernel end section namespace Green24Proof.CyclicBlockTorusSmoothing open Finset open scoped BigOperators NNReal open Green24Proof.CyclicCharacterBlockChain open Green24Proof.CyclicCharacterChainBoundary open Green24Proof.CyclicTorusSmoothing open Green24Proof.CyclicSmoothedCharacterFactor open Green24Proof.CyclicShiftedCharacterFactor open Green24Proof.FiniteScalarQuantization (resolution) open Green24Proof.GridLipschitzSmoothing open Green24Proof.FiniteGridSmoothingSamples variable {q:ℕ} [NeZero q] def Coordinates:List (Block q) → Type | [] => Empty | b :: bs => Coordinates bs ⊕ Fin b.length def coordinatesFintype:(bs:List (Block q)) → Fintype (Coordinates bs) | [] => inferInstanceAs (Fintype Empty) | b :: bs => by letI:=coordinatesFintype bs exact inferInstanceAs (Fintype (Coordinates bs ⊕ Fin b.length)) def coordinatesDecidableEq:(bs:List (Block q)) → DecidableEq (Coordinates bs) | [] => inferInstanceAs (DecidableEq Empty) | b :: bs => by letI:=coordinatesDecidableEq bs exact inferInstanceAs (DecidableEq (Coordinates bs ⊕ Fin b.length)) omit [NeZero q] in theorem coordinates_card (bs:List (Block q)) : letI:(bs:List (Block q)) → Fintype (Coordinates bs):=coordinatesFintype; Fintype.card (Coordinates bs) = coordinateCount bs:=by letI:(bs:List (Block q)) → Fintype (Coordinates bs):=coordinatesFintype induction bs with | nil => rfl | cons b bs ih => change Fintype.card (Coordinates bs ⊕ Fin b.length) = _ simp [Fintype.card_sum,ih,coordinateCount] abbrev Torus (bs:List (Block q)):=Coordinates bs → Circle noncomputable def frequencies:(bs:List (Block q)) → Coordinates bs → ZMod q | [] => Empty.elim | b :: bs => Sum.elim (frequencies bs) b.frequencies noncomputable def orbit (bs:List (Block q)) (x:ZMod q):Torus bs := fun i => ZMod.toCircle (-(x * frequencies bs i)) noncomputable def torusLabel:(bs:List (Block q)) → Torus bs → Labels bs | [] => fun _ => () | b :: bs => fun z => (torusLabel bs (z ∘ Sum.inl),encodedCell b.tolerance (vectorCellIndex 1 (fun i => offset (b.offsets i)) (torusCoordinates b.tolerance b.components (z ∘ Sum.inr)))) noncomputable def Good:(bs:List (Block q)) → Set (Torus bs) | [] => Set.univ | b :: bs => {z | z ∘ Sum.inl ∈ Good bs ∧ torusCoordinates b.tolerance b.components (z ∘ Sum.inr) ∈ VectorGridGood 1 (1 / (2 * b.denominator)) (fun i => offset (b.offsets i))} private def zz1912:"s0778"="s0778":=by decide+kernel private theorem dist_reindex_le {ι κ:Type*} [Fintype ι] [Fintype κ] (r:ι → κ) (z w:κ → Circle):dist (z ∘ r) (w ∘ r) ≤ dist z w:=by exact (dist_pi_le_iff dist_nonneg).mpr (fun i => dist_le_pi_dist z w (r i)) omit [NeZero q] in theorem label_separation (bs:List (Block q)) (hM:∀ b ∈ bs,0 < b.denominator) (z w:Torus bs) (hz:z ∈ Good bs) (hw:w ∈ Good bs) (hne:torusLabel bs z ≠ torusLabel bs w) : letI:(bs:List (Block q)) → Fintype (Coordinates bs):=coordinatesFintype; 1 ≤ (complexity bs:ℝ) * dist z w:=by letI:(bs:List (Block q)) → Fintype (Coordinates bs):=coordinatesFintype induction bs with | nil => exact False.elim (hne rfl) | cons b bs ih => have hMt:=fun c hc => hM c (List.mem_cons_of_mem _ hc) have hMb:=hM b (List.mem_cons_self ..) have hz':z ∘ Sum.inl ∈ Good bs ∧ _:=hz have hw':w ∘ Sum.inl ∈ Good bs ∧ _:=hw by_cases ht:torusLabel bs (z ∘ Sum.inl) = torusLabel bs (w ∘ Sum.inl) · have hb:vectorCellIndex 1 (fun i => offset (b.offsets i)) (torusCoordinates b.tolerance b.components (z ∘ Sum.inr)) ≠ vectorCellIndex 1 (fun i => offset (b.offsets i)) (torusCoordinates b.tolerance b.components (w ∘ Sum.inr)):=by intro he apply hne simp only [torusLabel,ht,he] rfl have hsep:=vector_grid_core_separation (by norm_num:(0:ℝ) < 1) hz'.2 hw'.2 hb have hscale:=(torusCoordinates_lipschitz b.tolerance b.components).dist_le_mul (z ∘ Sum.inr) (w ∘ Sum.inr) have hd:=dist_reindex_le Sum.inr z w have hres:(0:ℝ) ≤ resolution b.tolerance:=Nat.cast_nonneg _ have hMR:(0:ℝ) < b.denominator:=Nat.cast_pos.mpr hMb have hs:(1:ℝ) / b.denominator ≤ (resolution b.tolerance:ℝ) * dist z w:=by have he:(2:ℝ) * (1 / (2 * b.denominator)) = 1 / b.denominator:=by field_simp rw [he] at hsep exact hsep.trans (hscale.trans (mul_le_mul_of_nonneg_left hd hres)) have hs':(1:ℝ) ≤ (resolution b.tolerance * b.denominator:ℕ) * dist z w:=by have hm:=(div_le_iff₀ hMR).mp hs push_cast nlinarith have hc:((resolution b.tolerance * b.denominator:ℕ):ℝ) ≤ complexity (b :: bs):=by exact_mod_cast block_scale_le_complexity (show b ∈ b :: bs from List.mem_cons_self) exact hs'.trans (mul_le_mul_of_nonneg_right hc dist_nonneg) · have hs:=ih hMt (z ∘ Sum.inl) (w ∘ Sum.inl) hz'.1 hw'.1 ht have hd:=dist_reindex_le Sum.inl z w have hc:(complexity bs:ℝ) ≤ complexity (b :: bs):=by simp only [complexity,Nat.cast_add] exact le_add_of_nonneg_right (Nat.cast_nonneg _) exact hs.trans ((mul_le_mul_of_nonneg_left hd (Nat.cast_nonneg _)).trans (mul_le_mul_of_nonneg_right hc dist_nonneg)) theorem torusLabel_orbit (bs:List (Block q)) (x:ZMod q) : torusLabel bs (orbit bs x) = factor bs x:=by induction bs with | nil => rfl | cons b bs ih => change (torusLabel bs (orbit bs x),_) = (factor bs x,_) rw [ih] congr 1 exact (phaseFactor_eq_encoded_grid b.tolerance b.frequencies b.components b.offsets x).symm theorem orbit_good_of_not_bad (bs:List (Block q)) (hM:∀ b ∈ bs,0 < b.denominator) (x:ZMod q) (hx:x ∉ allBad bs) : orbit bs x ∈ Good bs:=by induction bs with | nil => trivial | cons b bs ih => have hx':x ∉ blockBad b ∧ x ∉ allBad bs:=by simpa only [allBad,Finset.mem_union,not_or] using hx constructor · exact ih (fun c hc => hM c (List.mem_cons_of_mem _ hc)) hx'.2 · exact sample_good_of_not_bad (hM b (List.mem_cons_self ..)) b.offsets (characterSamples b.tolerance b.frequencies b.components) x hx'.1 private def zz1913:"s0779"="s0779":=by decide+kernel theorem exists_torus_realization (bs:List (Block q)) (hM:∀ b ∈ bs,0 < b.denominator) (F:Labels bs → ℝ) (hF:∀ a,F a ∈ Set.Icc 0 1) : letI:(bs:List (Block q)) → Fintype (Coordinates bs):=coordinatesFintype; ∃ H:Torus bs → ℝ,LipschitzWith (complexity bs:ℝ≥0) H ∧ (∀ z,H z ∈ Set.Icc 0 1) ∧ (∀ x,x ∉ allBad bs → H (orbit bs x) = F (factor bs x)) ∧ (∑ x,(H (orbit bs x) - F (factor bs x)) ^ 2) ≤ ((allBad bs).card:ℝ):=by letI:(bs:List (Block q)) → Fintype (Coordinates bs):=coordinatesFintype obtain ⟨H,hH,hHr,hHe⟩:=exists_bounded_extension (torusLabel bs) F hF (Good bs) (complexity bs:ℝ≥0) (fun z hz w hw => label_separation bs hM z w hz hw) have he:∀ x,x ∉ allBad bs → H (orbit bs x) = F (factor bs x):=by intro x hx rw [hHe _ (orbit_good_of_not_bad bs hM x hx),torusLabel_orbit] exact ⟨H,hH,hHr,he,sq_error_sum_le_bad (allBad bs) (fun x => H (orbit bs x)) (fun x => F (factor bs x)) (fun x => hHr _) (fun x => hF _) he⟩ theorem exists_fin_torus_realization (bs:List (Block q)) (hM:∀ b ∈ bs,0 < b.denominator) (F:Labels bs → ℝ) (hF:∀ a,F a ∈ Set.Icc 0 1) : ∃ n ≤ complexity bs, ∃ (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ), LipschitzWith (complexity bs:ℝ≥0) H ∧ (∀ z,H z ∈ Set.Icc 0 1) ∧ (∀ x,x ∉ allBad bs → H (characterOrbit ks x) = F (factor bs x)) ∧ (∑ x,(H (characterOrbit ks x) - F (factor bs x)) ^ 2) ≤ ((allBad bs).card:ℝ):=by letI:(bs:List (Block q)) → Fintype (Coordinates bs):=coordinatesFintype classical obtain ⟨H,hH,hHr,hHe,hHerr⟩:=exists_torus_realization bs hM F hF let e:=Fintype.equivFin (Coordinates bs) let ks:Fin (Fintype.card (Coordinates bs)) → ZMod q:=fun i => frequencies bs (e.symm i) let H':(Fin (Fintype.card (Coordinates bs)) → Circle) → ℝ:=fun z => H (z ∘ e) have ho (x:ZMod q):characterOrbit ks x ∘ e = orbit bs x:=by funext i simp [characterOrbit,orbit,ks] have hl:LipschitzWith (complexity bs:ℝ≥0) H':=by apply LipschitzWith.of_dist_le_mul intro z w exact (hH.dist_le_mul (z ∘ e) (w ∘ e)).trans (mul_le_mul_of_nonneg_left (dist_reindex_le e z w) (Nat.cast_nonneg _)) refine ⟨_, ?_,ks,H',hl,(fun z => hHr _), ?_, ?_⟩ · rw [coordinates_card] exact coordinateCount_le_complexity bs · intro x hx simpa only [H',ho] using hHe x hx · simpa only [H',ho] using hHerr end Green24Proof.CyclicBlockTorusSmoothing private def zz2471:"s09a7"="s09a7":=by decide+kernel end section namespace Green24Proof.CyclicGrowthDecomposition open Finset open scoped BigOperators NNReal open Green24Proof.CyclicCharacterBlockChain open Green24Proof.CyclicCharacterChainBoundary open Green24Proof.CyclicBlockTorusSmoothing open Green24Proof.CyclicTorusSmoothing open Green24Proof.FinitePartitionAverage open Green24Proof.FinitePartitionEnergyPigeonhole noncomputable def complexityBound (τ:ℕ → ℝ) (ε:ℝ):ℕ := let η:=ε ^ 2 / 4 let N:=outerSteps η budget τ (denominator τ (η / N)) N variable {q:ℕ} [NeZero q] theorem exists_growth_decomposition (f:ZMod q → ℝ) (hf:∀ x,f x ∈ Set.Icc 0 1) (τ:ℕ → ℝ) (hτ:∀ C,0 < τ C) {ε:ℝ} (hε:0 < ε) : ∃ M ≤ complexityBound τ ε, ∃ n ≤ M, ∃ (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ) (small uniform:ZMod q → ℝ), LipschitzWith (M:ℝ≥0) H ∧ (∀ z,H z ∈ Set.Icc 0 1) ∧ (∀ x,f x = H (characterOrbit ks x) + small x + uniform x) ∧ (∀ x,H (characterOrbit ks x) + small x ∈ Set.Icc 0 1) ∧ (∀ x,small x ∈ Set.Icc (-1) 1) ∧ (∀ x,uniform x ∈ Set.Icc (-1) 1) ∧ (∑ x,small x ^ 2) ≤ ε ^ 2 * q ∧ (∑ x,uniform x) = 0 ∧ (∀ k, ‖ZMod.dft (fun x => (uniform x:ℂ)) k‖ ≤ τ M * q):=by letI:=(labelsFintype:(bs:List (Block q)) → Fintype (Labels bs)) letI:=(labelsDecidableEq:(bs:List (Block q)) → DecidableEq (Labels bs)) classical let η:=ε ^ 2 / 4 have hη:0 < η:=by dsimp [η]; positivity let N:=outerSteps η let Ds:=denominator τ (η / N) let hDs:=denominator_pos τ (η / N) obtain ⟨i,hi,hc,_hfin,hgap,hu,hb,_hbf⟩ := exists_small_gap_and_small_boundaries f hf τ hτ hη hη let coarse:=chain f hf τ hτ Ds hDs i let fine:=chain f hf τ hτ Ds hDs (i + 1) let M:=budget τ Ds i have hc':complexity coarse ≤ M:=hc have hM:M ≤ complexityBound τ ε:=budget_mono τ Ds (Nat.le_of_lt hi) let F:=fiberMean (factor coarse) f have hF:∀ a,F a ∈ Set.Icc 0 1:=fun a => ⟨fiberMean_nonneg _ f (fun x => (hf x).1) a, fiberMean_le_one _ f (fun x => (hf x).2) a⟩ obtain ⟨n,hn,ks,H,hH,hHr,_hHe,hHerr⟩ := exists_fin_torus_realization coarse (fun b hb => (chain_blocks_controlled f hf τ hτ Ds hDs i b hb).2.1) F hF let A:=average (factor fine) f let B:=average (factor coarse) f let small:=fun x => A x - H (characterOrbit ks x) let uniform:=fun x => f x - A x have hA:∀ x,A x ∈ Set.Icc 0 1:=average_mem_Icc _ f hf have hL:LipschitzWith (M:ℝ≥0) H:=hH.weaken (by exact_mod_cast hc') have he:(∑ x,(H (characterOrbit ks x) - B x) ^ 2) ≤ η * q := hHerr.trans hb have hg:(∑ x,(A x - B x) ^ 2) ≤ η * q:=hgap have hs:(∑ x,small x ^ 2) ≤ ε ^ 2 * q:=by calc (∑ x,small x ^ 2) ≤ ∑ x,(2 * (A x - B x) ^ 2 + 2 * (H (characterOrbit ks x) - B x) ^ 2):=by apply Finset.sum_le_sum intro x _ dsimp only [small] nlinarith [sq_nonneg (A x + H (characterOrbit ks x) - 2 * B x)] _ = 2 * (∑ x,(A x - B x) ^ 2) + 2 * (∑ x,(H (characterOrbit ks x) - B x) ^ 2):=by rw [Finset.sum_add_distrib, ← Finset.mul_sum, ← Finset.mul_sum] _ ≤ ε ^ 2 * q:=by dsimp [η] at hg he; linarith refine ⟨M,hM,n,hn.trans hc',ks,H,small,uniform,hL,hHr, ?_, ?_, ?_, ?_,hs, ?_,hu⟩ · intro x dsimp [small,uniform] ring · intro x simpa only [small,add_sub_cancel] using hA x · intro x have ha:=hA x have hh:=hHr (characterOrbit ks x) change A x - H (characterOrbit ks x) ∈ Set.Icc (-1) 1 constructor <;> linarith [ha.1,ha.2,hh.1,hh.2] · exact residual_mem_Icc _ f hf · change (∑ x,(f x - average (factor fine) f x)) = 0 rw [Finset.sum_sub_distrib,sum_average,sub_self] end Green24Proof.CyclicGrowthDecomposition private def zz2472:"s09a8"="s09a8":=by decide+kernel end section namespace Green24Proof.CyclicFourierReplacement open Finset CyclicFourierCounting open scoped BigOperators variable {q:ℕ} [NeZero q] theorem norm_le_of_fourier_sum (a b c:ZMod q → ℂ) (t:ℂ) (F G M:ℝ) (hid:(q:ℂ) * t = ∑ r,a r * b r * c r) (ha:∀ r, ‖a r‖ ≤ M) (hb:(∑ r, ‖b r‖ ^ 2) = (q:ℝ) * F) (hc:(∑ r, ‖c r‖ ^ 2) = (q:ℝ) * G) : ‖t‖ ≤ M * Real.sqrt F * Real.sqrt G:=by have hM:0 ≤ M:=(norm_nonneg (a 0)).trans (ha 0) have hq:(0:ℝ) < q:=Nat.cast_pos.mpr (NeZero.pos q) have hcs:=Real.sum_mul_le_sqrt_mul_sqrt Finset.univ (fun r => ‖b r‖) (fun r => ‖c r‖) rw [hb,hc] at hcs have hn:=congrArg (fun z:ℂ => ‖z‖) hid simp only [norm_mul,Complex.norm_natCast] at hn refine le_of_mul_le_mul_left (a:=(q:ℝ)) ?_ hq calc (q:ℝ) * ‖t‖ = ‖∑ r,a r * b r * c r‖:=hn _ ≤ ∑ r, ‖a r * b r * c r‖:=norm_sum_le _ _ _ ≤ ∑ r,M * (‖b r‖ * ‖c r‖):=by apply Finset.sum_le_sum intro r _ simpa only [norm_mul,mul_assoc] using mul_le_mul_of_nonneg_right (ha r) (mul_nonneg (norm_nonneg _) (norm_nonneg _)) _ = M * ∑ r, ‖b r‖ * ‖c r‖:=(Finset.mul_sum _ _ _).symm _ ≤ M * (Real.sqrt ((q:ℝ) * F) * Real.sqrt ((q:ℝ) * G)) := mul_le_mul_of_nonneg_left hcs hM _ = (q:ℝ) * (M * Real.sqrt F * Real.sqrt G):=by rw [Real.sqrt_mul hq.le,Real.sqrt_mul hq.le] calc M * (Real.sqrt q * Real.sqrt F * (Real.sqrt q * Real.sqrt G)) = (Real.sqrt q * Real.sqrt q) * (M * Real.sqrt F * Real.sqrt G):=by ring _ = _:=by rw [Real.mul_self_sqrt hq.le] private def zz1914:"s077a"="s077a":=by decide+kernel theorem trilinear_norm_le_middle (f g h:ZMod q → ℂ) (h3:IsUnit (3:ZMod q)) {M:ℝ} (hg:∀ r, ‖ZMod.dft g r‖ ≤ M) : ‖trilinear f g h‖ ≤ M * Real.sqrt (∑ x, ‖f x‖ ^ 2) * Real.sqrt (∑ x, ‖h x‖ ^ 2):=by apply norm_le_of_fourier_sum (fun r => ZMod.dft g (2 * r)) (ZMod.dft f) (fun r => ZMod.dft h (-3 * r)) · rw [trilinear_fourier] apply Finset.sum_congr rfl intro r _ ring · exact fun r => hg (2 * r) · exact parseval f · exact ((IsUnit.isUnit_iff_mulLeft_bijective.mp h3.neg).sum_comp (fun r:ZMod q => ‖ZMod.dft h r‖ ^ 2)).trans (parseval h) theorem trilinear_norm_le_right (f g h:ZMod q → ℂ) (h2:IsUnit (2:ZMod q)) {M:ℝ} (hh:∀ r, ‖ZMod.dft h r‖ ≤ M) : ‖trilinear f g h‖ ≤ M * Real.sqrt (∑ x, ‖f x‖ ^ 2) * Real.sqrt (∑ x, ‖g x‖ ^ 2):=by apply norm_le_of_fourier_sum (fun r => ZMod.dft h (-3 * r)) (ZMod.dft f) (fun r => ZMod.dft g (2 * r)) · rw [trilinear_fourier] apply Finset.sum_congr rfl intro r _ ring · exact fun r => hh (-3 * r) · exact parseval f · exact ((IsUnit.isUnit_iff_mulLeft_bijective.mp h2).sum_comp (fun r:ZMod q => ‖ZMod.dft g r‖ ^ 2)).trans (parseval g) theorem l2_sq_le_card (f:ZMod q → ℂ) (hf:∀ x, ‖f x‖ ≤ 1) : (∑ x, ‖f x‖ ^ 2) ≤ (q:ℝ):=by calc (∑ x, ‖f x‖ ^ 2) ≤ ∑ _x:ZMod q,(1:ℝ):=by apply Finset.sum_le_sum intro x _ nlinarith [norm_nonneg (f x),hf x] _ = _:=by simp theorem sqrt_product_le_card (f g:ZMod q → ℂ) (hf:∀ x, ‖f x‖ ≤ 1) (hg:∀ x, ‖g x‖ ≤ 1) : Real.sqrt (∑ x, ‖f x‖ ^ 2) * Real.sqrt (∑ x, ‖g x‖ ^ 2) ≤ (q:ℝ):=by calc _ ≤ Real.sqrt q * Real.sqrt q:=by gcongr · exact l2_sq_le_card f hf · exact l2_sq_le_card g hg _ = _:=Real.mul_self_sqrt (Nat.cast_nonneg q) private def zz1915:"s077b"="s077b":=by decide+kernel theorem trilinear_norm_le_middle_of_bounded (f g h:ZMod q → ℂ) (h3:IsUnit (3:ZMod q)) {η:ℝ} (hη:0 ≤ η) (hg:∀ r, ‖ZMod.dft g r‖ ≤ η * q) (hf:∀ x, ‖f x‖ ≤ 1) (hh:∀ x, ‖h x‖ ≤ 1) : ‖trilinear f g h‖ ≤ η * (q:ℝ) ^ 2:=by have hp:=mul_le_mul_of_nonneg_left (sqrt_product_le_card f h hf hh) (mul_nonneg hη (Nat.cast_nonneg q)) have he:=trilinear_norm_le_middle f g h h3 hg nlinarith theorem trilinear_norm_le_right_of_bounded (f g h:ZMod q → ℂ) (h2:IsUnit (2:ZMod q)) {η:ℝ} (hη:0 ≤ η) (hh:∀ r, ‖ZMod.dft h r‖ ≤ η * q) (hf:∀ x, ‖f x‖ ≤ 1) (hg:∀ x, ‖g x‖ ≤ 1) : ‖trilinear f g h‖ ≤ η * (q:ℝ) ^ 2:=by have hp:=mul_le_mul_of_nonneg_left (sqrt_product_le_card f g hf hg) (mul_nonneg hη (Nat.cast_nonneg q)) have he:=trilinear_norm_le_right f g h h2 hh nlinarith theorem trilinear_sub_middle (f g₁ g₂ h:ZMod q → ℂ) : trilinear f (fun x => g₁ x - g₂ x) h = trilinear f g₁ h - trilinear f g₂ h:=by simp only [trilinear,mul_sub,sub_mul,Finset.sum_sub_distrib] theorem trilinear_sub_right (f g h₁ h₂:ZMod q → ℂ) : trilinear f g (fun x => h₁ x - h₂ x) = trilinear f g h₁ - trilinear f g h₂:=by simp only [trilinear,mul_sub,Finset.sum_sub_distrib] private def zz1916:"s077c"="s077c":=by decide+kernel theorem sqrt_product_le_card_of_energy (f g:ZMod q → ℂ) (hf:(∑ x, ‖f x‖ ^ 2) ≤ (q:ℝ)) (hg:(∑ x, ‖g x‖ ^ 2) ≤ (q:ℝ)) : Real.sqrt (∑ x, ‖f x‖ ^ 2) * Real.sqrt (∑ x, ‖g x‖ ^ 2) ≤ (q:ℝ):=by calc _ ≤ Real.sqrt q * Real.sqrt q:=by gcongr _ = _:=Real.mul_self_sqrt (Nat.cast_nonneg q) theorem count_bound_of_energy (t:ℂ) (f g:ZMod q → ℂ) {η:ℝ} (hη:0 ≤ η) (hf:(∑ x, ‖f x‖ ^ 2) ≤ (q:ℝ)) (hg:(∑ x, ‖g x‖ ^ 2) ≤ (q:ℝ)) (ht:‖t‖ ≤ (η * q) * Real.sqrt (∑ x, ‖f x‖ ^ 2) * Real.sqrt (∑ x, ‖g x‖ ^ 2)):‖t‖ ≤ η * (q:ℝ) ^ 2:=by have hp:=mul_le_mul_of_nonneg_left (sqrt_product_le_card_of_energy f g hf hg) (mul_nonneg hη (Nat.cast_nonneg q)) nlinarith theorem trilinear_replacement_bound_of_energy (f f' g g' h h':ZMod q → ℂ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {η:ℝ} (hη:0 ≤ η) (hF:∀ r, ‖ZMod.dft (fun x => f x - f' x) r‖ ≤ η * q) (hG:∀ r, ‖ZMod.dft (fun x => g x - g' x) r‖ ≤ η * q) (hH:∀ r, ‖ZMod.dft (fun x => h x - h' x) r‖ ≤ η * q) (hf':(∑ x, ‖f' x‖ ^ 2) ≤ (q:ℝ)) (hg:(∑ x, ‖g x‖ ^ 2) ≤ (q:ℝ)) (hg':(∑ x, ‖g' x‖ ^ 2) ≤ (q:ℝ)) (hh:(∑ x, ‖h x‖ ^ 2) ≤ (q:ℝ)) : ‖trilinear f g h - trilinear f' g' h'‖ ≤ 3 * η * (q:ℝ) ^ 2:=by have h₁:=count_bound_of_energy _ g h hη hg hh (trilinear_norm_le (fun x => f x - f' x) g h h2 h3 hF) have h₂:=count_bound_of_energy _ f' h hη hf' hh (trilinear_norm_le_middle f' (fun x => g x - g' x) h h3 hG) have h₃:=count_bound_of_energy _ f' g' hη hf' hg' (trilinear_norm_le_right f' g' (fun x => h x - h' x) h2 hH) rw [trilinear_sub_left] at h₁ rw [trilinear_sub_middle] at h₂ rw [trilinear_sub_right] at h₃ have hid:trilinear f g h - trilinear f' g' h' = (trilinear f g h - trilinear f' g h) + (trilinear f' g h - trilinear f' g' h) + (trilinear f' g' h - trilinear f' g' h'):=by ring rw [hid] calc _ ≤ ‖(trilinear f g h - trilinear f' g h) + (trilinear f' g h - trilinear f' g' h)‖ + ‖trilinear f' g' h - trilinear f' g' h'‖:=norm_add_le _ _ _ ≤ (‖trilinear f g h - trilinear f' g h‖ + ‖trilinear f' g h - trilinear f' g' h‖) + ‖trilinear f' g' h - trilinear f' g' h'‖ := add_le_add (norm_add_le _ _) le_rfl _ ≤ 3 * η * (q:ℝ) ^ 2:=by linarith theorem trilinear_replacement_bound (f f' g g' h h':ZMod q → ℂ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {η:ℝ} (hη:0 ≤ η) (hF:∀ r, ‖ZMod.dft (fun x => f x - f' x) r‖ ≤ η * q) (hG:∀ r, ‖ZMod.dft (fun x => g x - g' x) r‖ ≤ η * q) (hH:∀ r, ‖ZMod.dft (fun x => h x - h' x) r‖ ≤ η * q) (hf':∀ x, ‖f' x‖ ≤ 1) (hg:∀ x, ‖g x‖ ≤ 1) (hg':∀ x, ‖g' x‖ ≤ 1) (hh:∀ x, ‖h x‖ ≤ 1) : ‖trilinear f g h - trilinear f' g' h'‖ ≤ 3 * η * (q:ℝ) ^ 2 := trilinear_replacement_bound_of_energy f f' g g' h h' h2 h3 hη hF hG hH (l2_sq_le_card f' hf') (l2_sq_le_card g hg) (l2_sq_le_card g' hg') (l2_sq_le_card h hh) end Green24Proof.CyclicFourierReplacement private def zz2473:"s09a9"="s09a9":=by decide+kernel end section namespace Green24Proof.CyclicCharacterCounting open scoped BigOperators open CyclicFourierCounting CyclicFourierReplacement CyclicCharacterFactor open CyclicWeakRegularity FourierPartitionIncrement FiniteScalarQuantization variable {q:ℕ} [NeZero q] private def zz1917:"s077d"="s077d":=by decide+kernel theorem self_count_replacement (f g:ZMod q → ℝ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {η:ℝ} (hη:0 ≤ η) (hf:∀ x,f x ∈ Set.Icc 0 1) (hg:∀ x,g x ∈ Set.Icc 0 1) (hu:∀ k, ‖ZMod.dft (fun x => ((f x - g x:ℝ):ℂ)) k‖ ≤ η * q) : ‖trilinear (fun x => (f x:ℂ)) (fun x => (f x:ℂ)) (fun x => (f x:ℂ)) - trilinear (fun x => (g x:ℂ)) (fun x => (g x:ℂ)) (fun x => (g x:ℂ))‖ ≤ 3 * η * (q:ℝ) ^ 2:=by have hf':∀ x, ‖(f x:ℂ)‖ ≤ 1:=by intro x simpa only [Complex.norm_real,Real.norm_eq_abs,abs_of_nonneg (hf x).1] using (hf x).2 have hg':∀ x, ‖(g x:ℂ)‖ ≤ 1:=by intro x simpa only [Complex.norm_real,Real.norm_eq_abs,abs_of_nonneg (hg x).1] using (hg x).2 have hu':∀ k, ‖ZMod.dft (fun x => (f x:ℂ) - (g x:ℂ)) k‖ ≤ η * q:=by simpa only [Complex.ofReal_sub] using hu exact trilinear_replacement_bound _ _ _ _ _ _ h2 h3 hη hu' hu' hu' hg' hf' hg' hf' theorem exists_character_factor_count_approximation (f:ZMod q → ℝ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) (hf:∀ x,f x ∈ Set.Icc 0 1) {η:ℝ} (hη:0 < η) : ∃ n ≤ stepBound η, ∃ (ks:Fin n → ZMod q) (bs:Fin n → Bool) (F:Alphabet η n → ℝ), Fintype.card (Alphabet η n) ≤ (2 * resolution η + 1) ^ stepBound η ∧ (∀ a,F a ∈ Set.Icc 0 1) ∧ (∑ x,F (phaseFactor η ks bs x)) = (∑ x,f x) ∧ (∀ k, ‖ZMod.dft (fun x => ((f x - F (phaseFactor η ks bs x):ℝ):ℂ)) k‖ ≤ η * q) ∧ ‖trilinear (fun x => (f x:ℂ)) (fun x => (f x:ℂ)) (fun x => (f x:ℂ)) - trilinear (fun x => (F (phaseFactor η ks bs x):ℂ)) (fun x => (F (phaseFactor η ks bs x):ℂ)) (fun x => (F (phaseFactor η ks bs x):ℂ))‖ ≤ 3 * η * (q:ℝ) ^ 2:=by obtain ⟨n,hn,ks,bs,F,hc,hF,_,hm,hu⟩ := exists_character_factor_approximation f hf hη exact ⟨n,hn,ks,bs,F,hc,hF,hm,hu, self_count_replacement f (fun x => F (phaseFactor η ks bs x)) h2 h3 hη.le hf (fun x => hF _) hu⟩ end Green24Proof.CyclicCharacterCounting private def zz2474:"s09aa"="s09aa":=by decide+kernel end section namespace Green24Proof.CyclicL2Replacement open Finset open scoped BigOperators open Green24Proof.CyclicFourierCounting open Green24Proof.CyclicCharacterCounting theorem sum_abs_le_of_sum_sq_le {α:Type*} [Fintype α] (u:α → ℝ) {ε:ℝ} (hε:0 ≤ ε) (hu:(∑ x,u x ^ 2) ≤ ε ^ 2 * Fintype.card α) : (∑ x, |u x|) ≤ ε * Fintype.card α:=by have hcs:=Real.sum_mul_le_sqrt_mul_sqrt Finset.univ (fun x => |u x|) (fun _ => (1:ℝ)) simp only [mul_one,sq_abs,one_pow,Finset.sum_const,Finset.card_univ, nsmul_eq_mul,mul_one] at hcs calc (∑ x, |u x|) ≤ Real.sqrt (∑ x,u x ^ 2) * Real.sqrt (Fintype.card α):=hcs _ ≤ Real.sqrt (ε ^ 2 * Fintype.card α) * Real.sqrt (Fintype.card α):=by gcongr _ = ε * Fintype.card α:=by rw [Real.sqrt_mul (sq_nonneg ε),Real.sqrt_sq_eq_abs,abs_of_nonneg hε, mul_assoc,Real.mul_self_sqrt (Nat.cast_nonneg _)] theorem abs_sum_le_of_sum_sq_le {α:Type*} [Fintype α] (u:α → ℝ) {ε:ℝ} (hε:0 ≤ ε) (hu:(∑ x,u x ^ 2) ≤ ε ^ 2 * Fintype.card α) : |∑ x,u x| ≤ ε * Fintype.card α := (Finset.abs_sum_le_sum_abs _ _).trans (sum_abs_le_of_sum_sq_le u hε hu) variable {q:ℕ} [NeZero q] private def zz1918:"s077e"="s077e":=by decide+kernel theorem dft_norm_le_sum_abs (u:ZMod q → ℝ) (k:ZMod q) : ‖ZMod.dft (fun x => (u x:ℂ)) k‖ ≤ ∑ x, |u x|:=by calc ‖ZMod.dft (fun x => (u x:ℂ)) k‖ ≤ ∑ x, ‖ZMod.stdAddChar (-(x * k)) * (u x:ℂ)‖:=norm_sum_le _ _ _ = _:=by simp only [norm_mul,ZMod.stdAddChar_apply,Circle.norm_coe,one_mul, Complex.norm_real,Real.norm_eq_abs] theorem dft_norm_le_of_sum_sq_le (u:ZMod q → ℝ) {ε:ℝ} (hε:0 ≤ ε) (hu:(∑ x,u x ^ 2) ≤ ε ^ 2 * q) (k:ZMod q) : ‖ZMod.dft (fun x => (u x:ℂ)) k‖ ≤ ε * q:=by have h:=sum_abs_le_of_sum_sq_le u hε (by simpa only [ZMod.card] using hu) simpa only [ZMod.card] using (dft_norm_le_sum_abs u k).trans h theorem self_count_l2_replacement (f g:ZMod q → ℝ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {ε:ℝ} (hε:0 ≤ ε) (hf:∀ x,f x ∈ Set.Icc 0 1) (hg:∀ x,g x ∈ Set.Icc 0 1) (he:(∑ x,(f x - g x) ^ 2) ≤ ε ^ 2 * q) : ‖trilinear (fun x => (f x:ℂ)) (fun x => (f x:ℂ)) (fun x => (f x:ℂ)) - trilinear (fun x => (g x:ℂ)) (fun x => (g x:ℂ)) (fun x => (g x:ℂ))‖ ≤ 3 * ε * (q:ℝ) ^ 2 := self_count_replacement f g h2 h3 hε hf hg (dft_norm_le_of_sum_sq_le (fun x => f x - g x) hε he) end Green24Proof.CyclicL2Replacement private def zz2475:"s09ab"="s09ab":=by decide+kernel end section namespace Green24Proof.CyclicGrowthCounting open Finset open scoped BigOperators NNReal open Green24Proof.CyclicFourierCounting open Green24Proof.CyclicCharacterCounting open Green24Proof.CyclicL2Replacement open Green24Proof.CyclicGrowthDecomposition open Green24Proof.CyclicTorusSmoothing variable {q:ℕ} [NeZero q] noncomputable def weightedCount (f:ZMod q → ℝ):ℝ := ∑ y, ∑ z,f (3 * z - 2 * y) * f y * f z theorem weightedCount_ofReal (f:ZMod q → ℝ) : (weightedCount f:ℂ) = trilinear (fun x => (f x:ℂ)) (fun x => (f x:ℂ)) (fun x => (f x:ℂ)):=by simp only [weightedCount,trilinear,Complex.ofReal_sum,Complex.ofReal_mul] private def zz1919:"s077f"="s077f":=by decide+kernel theorem mass_count_of_decomposition (f structured small uniform:ZMod q → ℝ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {ε η:ℝ} (hε:0 ≤ ε) (hη:0 ≤ η) (hf:∀ x,f x ∈ Set.Icc 0 1) (hs:∀ x,structured x ∈ Set.Icc 0 1) (hd:∀ x,f x = structured x + small x + uniform x) (hb:∀ x,structured x + small x ∈ Set.Icc 0 1) (he:(∑ x,small x ^ 2) ≤ ε ^ 2 * q) (hm:(∑ x,uniform x) = 0) (hu:∀ k, ‖ZMod.dft (fun x => (uniform x:ℂ)) k‖ ≤ η * q) : |(∑ x,f x) - ∑ x,structured x| ≤ ε * q ∧ |weightedCount f - weightedCount structured| ≤ 3 * (ε + η) * (q:ℝ) ^ 2:=by have hmass:(∑ x,f x) - ∑ x,structured x = ∑ x,small x:=by simp_rw [hd] rw [Finset.sum_add_distrib,Finset.sum_add_distrib,hm] ring have hsmall:|∑ x,small x| ≤ ε * q:=by simpa only [ZMod.card] using abs_sum_le_of_sum_sq_le small hε (by simpa only [ZMod.card] using he) let fine:=fun x => structured x + small x have hdiff:(fun x => f x - fine x) = uniform:=by funext x rw [hd] dsimp only [fine] ring have hUF:=self_count_replacement f fine h2 h3 hη hf hb (by simpa only [congrFun hdiff] using hu) have hLS:=self_count_l2_replacement fine structured h2 h3 hε hb hs (by simpa only [fine,add_sub_cancel_left] using he) rw [← weightedCount_ofReal, ← weightedCount_ofReal, ← Complex.ofReal_sub, Complex.norm_real,Real.norm_eq_abs] at hUF hLS have htri:=abs_add_le (weightedCount f - weightedCount fine) (weightedCount fine - weightedCount structured) have hid:weightedCount f - weightedCount fine + (weightedCount fine - weightedCount structured) = weightedCount f - weightedCount structured:=by ring rw [hid] at htri refine ⟨by rwa [hmass], ?_⟩ nlinarith theorem exists_growth_count_approximation (f:ZMod q → ℝ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) (hf:∀ x,f x ∈ Set.Icc 0 1) (τ:ℕ → ℝ) (hτ:∀ C,0 < τ C) {ε:ℝ} (hε:0 < ε) : ∃ M ≤ complexityBound τ ε, ∃ n ≤ M, ∃ (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ), LipschitzWith (M:ℝ≥0) H ∧ (∀ z,H z ∈ Set.Icc 0 1) ∧ |(∑ x,f x) - ∑ x,H (characterOrbit ks x)| ≤ ε * q ∧ |weightedCount f - weightedCount (fun x => H (characterOrbit ks x))| ≤ 3 * (ε + τ M) * (q:ℝ) ^ 2:=by obtain ⟨M,hM,n,hn,ks,H,small,uniform,hL,hH,hd,hb,_hs,_hu, he,hm,hU⟩:=exists_growth_decomposition f hf τ hτ hε obtain ⟨hmass,hcount⟩:=mass_count_of_decomposition f (fun x => H (characterOrbit ks x)) small uniform h2 h3 hε.le (hτ M).le hf (fun x => hH _) hd hb he hm hU exact ⟨M,hM,n,hn,ks,H,hL,hH,hmass,hcount⟩ end Green24Proof.CyclicGrowthCounting private def zz2476:"s09ac"="s09ac":=by decide+kernel end section namespace Green24Proof.CyclicTorusPairCounting open Finset MeasureTheory open scoped BigOperators open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusPairDiscrepancy open Green24Proof.CyclicTorusPairApproximation Green24Proof.CyclicTorusSmoothing open Green24Proof.CyclicGrowthCounting variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] noncomputable def realCountingIntegrand (H:(ι → Circle) → ℝ) (p:PairTorus ι ι):ℝ := H (p.2 ^ 3 * p.1 ^ (-2:ℤ)) * H p.1 * H p.2 noncomputable def countingIntegrand (H:(ι → Circle) → ℝ) (p:PairTorus ι ι):ℂ := (realCountingIntegrand H p:ℂ) noncomputable def haarWeightedCount (H:(ι → Circle) → ℝ):ℝ := ∫ p,realCountingIntegrand H p ∂pairHaar omit [Fintype ι] in theorem countingIntegrand_continuous (H:(ι → Circle) → ℝ) (hH:Continuous H) : Continuous (countingIntegrand H):=by unfold countingIntegrand realCountingIntegrand fun_prop theorem integral_countingIntegrand (H:(ι → Circle) → ℝ) : (∫ p,countingIntegrand H p ∂pairHaar) = (haarWeightedCount H:ℂ):=by exact integral_ofReal variable {q n:ℕ} [NeZero q] private def zz1920:"s0780"="s0780":=by decide+kernel theorem characterOrbit_equation (ks:Fin n → ZMod q) (y z:ZMod q) : characterOrbit ks (3 * z - 2 * y) = characterOrbit ks z ^ 3 * characterOrbit ks y ^ (-2:ℤ):=by funext i change ZMod.toCircle (-((3 * z - 2 * y) * ks i)) = ZMod.toCircle (-(z * ks i)) ^ 3 * ZMod.toCircle (-(y * ks i)) ^ (-2:ℤ) rw [← AddChar.map_nsmul_eq_pow, ← AddChar.map_zsmul_eq_zpow, ← AddChar.map_add_eq_mul] congr 1 simp only [nsmul_eq_mul,zsmul_eq_mul] ring theorem pairOrbitMean_countingIntegrand (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ) : pairOrbitMean ks ks (countingIntegrand H) = ((weightedCount (fun x => H (characterOrbit ks x)) / (q:ℝ) ^ 2:ℝ):ℂ):=by have heval (y z:ZMod q) : countingIntegrand H (characterOrbit ks y,characterOrbit ks z) = ((H (characterOrbit ks (3 * z - 2 * y)) * H (characterOrbit ks y) * H (characterOrbit ks z):ℝ):ℂ):=by unfold countingIntegrand realCountingIntegrand rw [characterOrbit_equation] rw [pairOrbitMean,Fintype.sum_prod_type] change ((q:ℂ) ^ 2)⁻¹ * (∑ y:ZMod q, ∑ z:ZMod q, countingIntegrand H (characterOrbit ks y,characterOrbit ks z)) = _ simp_rw [heval] simp only [weightedCount,Complex.ofReal_div,Complex.ofReal_pow,Complex.ofReal_natCast, Complex.ofReal_sum] ring theorem weightedCount_haar_discrepancy_of_approximation (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ) (hH:Continuous H) (S:Finset (PairExponent (Fin n) (Fin n))) (c:PairExponent (Fin n) (Fin n) → ℂ) (hk:Nonresonant ks (S.image Prod.fst)) (hl:Nonresonant ks (S.image Prod.snd)) {ε:ℝ} (herr:∀ z, ‖countingIntegrand H z - pairPolynomial S c z‖ ≤ ε) : |weightedCount (fun x => H (characterOrbit ks x)) / (q:ℝ) ^ 2 - haarWeightedCount H| ≤ 2 * ε:=by have h:=pairOrbitMean_haar_discrepancy_of_continuous ks ks S c (countingIntegrand H) (countingIntegrand_continuous H hH) hk hl herr rw [pairOrbitMean_countingIntegrand,integral_countingIntegrand, ← Complex.ofReal_sub, Complex.norm_real,Real.norm_eq_abs] at h exact h theorem exists_weightedCount_discrepancy_support (H:(Fin n → Circle) → ℝ) (hH:Continuous H) {ε:ℝ} (hε:0 < ε) : ∃ (S:Finset (PairExponent (Fin n) (Fin n))) (c:PairExponent (Fin n) (Fin n) → ℂ), (∀ z, ‖countingIntegrand H z - pairPolynomial S c z‖ < ε) ∧ ∀ ks:Fin n → ZMod q, Nonresonant ks (S.image Prod.fst) → Nonresonant ks (S.image Prod.snd) → |weightedCount (fun x => H (characterOrbit ks x)) / (q:ℝ) ^ 2 - haarWeightedCount H| ≤ 2 * ε:=by obtain ⟨S,c,herr⟩:=exists_finite_pair_laurent_approximation (countingIntegrand H) (countingIntegrand_continuous H hH) hε exact ⟨S,c,herr,fun ks hk hl => weightedCount_haar_discrepancy_of_approximation ks H hH S c hk hl (fun z => (herr z).le)⟩ end Green24Proof.CyclicTorusPairCounting private def zz2477:"s09ad"="s09ad":=by decide+kernel end section namespace Green24Proof.CompactTorusIntegratedCounting open MeasureTheory Set open scoped BigOperators open Green24Proof.CompactTorusArcModel Green24Proof.CompactTorusArcCounting open Green24Proof.TorusArcPairIntegral Green24Proof.TorusCoordinateHaar open Green24Proof.CircleArcResidues Green24Proof.CyclicTorusHaarDiscrepancy open Green24Proof.CyclicTorusPairCounting Green24Proof.CyclicTorusPairDiscrepancy open Green24Proof.SpatialCircleCutoff variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] [DecidableEq ι] abbrev ArcSpace (p:ι):=ℝ × ({j:ι // j ≠ p} → Circle) noncomputable def arcMeasure (p:ι):Measure (ArcSpace p) := volume.prod (torusHaar {j:ι // j ≠ p}) private def zz1921:"s0781"="s0781":=by decide+kernel theorem arcMeasure_sigmaFinite (p:ι):SigmaFinite (arcMeasure p):=by letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} unfold arcMeasure infer_instance noncomputable def compactCountingIntegrand (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (j k:ZMod q) (yz:ArcSpace p × ArcSpace p):ℝ := model p q F (3 * k - 2 * j) (3 * yz.2.1 - 2 * yz.1.1,yz.2.2 ^ 3 * yz.1.2 ^ (-2:ℤ)) * model p q F j yz.1 * model p q F k yz.2 omit [Fintype ι] in theorem compactCountingIntegrand_continuous (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:Continuous F) (j k:ZMod q) : Continuous (compactCountingIntegrand p q F j k):=by unfold compactCountingIntegrand exact (((model_continuous p q F hF _).comp (by fun_prop)).mul ((model_continuous p q F hF j).comp continuous_fst)).mul ((model_continuous p q F hF k).comp continuous_snd) omit [Fintype ι] in theorem compactCountingIntegrand_zero_left (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (j k:ZMod q) (yz:ArcSpace p × ArcSpace p) (hy:Real.pi / 2 ≤ |yz.1.1|):compactCountingIntegrand p q F j k yz = 0:=by simp only [compactCountingIntegrand,model_zero_outside p q F j yz.1 hy, mul_zero,zero_mul] omit [Fintype ι] in theorem compactCountingIntegrand_zero_right (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (j k:ZMod q) (yz:ArcSpace p × ArcSpace p) (hz:Real.pi / 2 ≤ |yz.2.1|):compactCountingIntegrand p q F j k yz = 0:=by simp only [compactCountingIntegrand,model_zero_outside p q F k yz.2 hz,mul_zero] private def zz1922:"s0782"="s0782":=by decide+kernel omit [Fintype ι] in theorem compactCountingIntegrand_compactSupport (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (j k:ZMod q) : HasCompactSupport (compactCountingIntegrand p q F j k):=by let S:Set (ArcSpace p):=Icc (-(Real.pi / 2)) (Real.pi / 2) ×ˢ univ have hS:IsCompact S:=isCompact_Icc.prod isCompact_univ apply HasCompactSupport.intro (hS.prod hS) intro yz hyz by_cases hy:yz.1 ∈ S · apply compactCountingIntegrand_zero_right have hz:yz.2 ∉ S:=fun hz => hyz ⟨hy,hz⟩ have hn:¬ |yz.2.1| ≤ Real.pi / 2:=fun ha => hz ⟨abs_le.mp ha,trivial⟩ exact (lt_of_not_ge hn).le · apply compactCountingIntegrand_zero_left have hn:¬ |yz.1.1| ≤ Real.pi / 2:=fun ha => hy ⟨abs_le.mp ha,trivial⟩ exact (lt_of_not_ge hn).le theorem compactCountingIntegrand_integrable (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:Continuous F) (j k:ZMod q) : Integrable (compactCountingIntegrand p q F j k) ((arcMeasure p).prod (arcMeasure p)):=by letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} unfold arcMeasure exact (compactCountingIntegrand_continuous p q F hF j k).integrable_of_hasCompactSupport (compactCountingIntegrand_compactSupport p q F j k) theorem compactCountingIntegrand_slice_integrable (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:Continuous F) (j k:ZMod q) (y:ArcSpace p) : Integrable (fun z => compactCountingIntegrand p q F j k (y,z)) (arcMeasure p):=by letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} unfold arcMeasure apply ((compactCountingIntegrand_continuous p q F hF j k).comp (continuous_const.prodMk continuous_id)).integrable_of_hasCompactSupport exact (model_compactSupport p q F k).mul_left theorem integral_eq_principal_of_zero_outside (f:ℝ → ℝ) (hf:∀ t,Real.pi / 2 ≤ |t| → f t = 0) : (∫ t,f t) = ∫ t in -Real.pi..Real.pi,f t:=by symm apply intervalIntegral.integral_eq_integral_of_support_subset intro t ht by_contra h apply ht apply hf by_contra h' have ha:=abs_lt.mp (lt_of_not_ge h') exact h ⟨by linarith [Real.pi_pos],by linarith [Real.pi_pos]⟩ private def zz1923:"s0783"="s0783":=by decide+kernel theorem integral_compact_count_eq_arc (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hF:Continuous F) (j k:ZMod q) : (∫ yz,compactCountingIntegrand p q F j k yz ∂(arcMeasure p).prod (arcMeasure p)) = ∫ s in -Real.pi..Real.pi, ∫ u, (∫ t in -Real.pi..Real.pi, ∫ v, compactCountingIntegrand p q F j k ((s,u),(t,v)) ∂torusHaar {i:ι // i ≠ p}) ∂torusHaar {i:ι // i ≠ p}:=by letI:=arcMeasure_sigmaFinite p letI:=torusHaar_isProbabilityMeasure {j:ι // j ≠ p} let L:=compactCountingIntegrand p q F j k have hint:=compactCountingIntegrand_integrable p q F hF j k have hinner (y:ArcSpace p) : (∫ z,L (y,z) ∂arcMeasure p) = ∫ t in -Real.pi..Real.pi, ∫ v,L (y,(t,v)) ∂torusHaar {i:ι // i ≠ p}:=by rw [show arcMeasure p = volume.prod (torusHaar {i:ι // i ≠ p}) from rfl, integral_prod _ (compactCountingIntegrand_slice_integrable p q F hF j k y)] apply integral_eq_principal_of_zero_outside intro t ht change (∫ v,L (y,(t,v)) ∂torusHaar {i:ι // i ≠ p}) = 0 have hz (v:{i:ι // i ≠ p} → Circle):L (y,(t,v)) = 0 := compactCountingIntegrand_zero_right p q F j k _ ht simp_rw [hz] exact integral_zero _ _ rw [integral_prod _ hint] change (∫ y,(∫ z,L (y,z) ∂arcMeasure p) ∂volume.prod (torusHaar {i:ι // i ≠ p})) = _ rw [integral_prod _ hint.integral_prod_left] change (∫ s, ∫ u, ∫ z,L ((s,u),z) ∂arcMeasure p ∂torusHaar {i:ι // i ≠ p}) = _ simp_rw [hinner] apply integral_eq_principal_of_zero_outside intro s hs have hz (u:{i:ι // i ≠ p} → Circle) (t:ℝ) (v:{i:ι // i ≠ p} → Circle):L ((s,u),(t,v)) = 0 := compactCountingIntegrand_zero_left p q F j k _ hs simp_rw [hz] simp theorem integrated_count_identity (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hF:Continuous F) (hs:∀ z,z p ^ q ∉ window → F z = 0) : haarWeightedCount F = ((2 * Real.pi * q)⁻¹) ^ 2 * ∑ j:ZMod q, ∑ k:ZMod q, ∫ yz,compactCountingIntegrand p q F j k yz ∂(arcMeasure p).prod (arcMeasure p):=by have hcont:Continuous (realCountingIntegrand F):=by unfold realCountingIntegrand fun_prop unfold haarWeightedCount pairHaar rw [integral_pair_sum_residue_arcs p (q:=q) _ hcont] congr 1 apply Finset.sum_congr rfl intro j _ apply Finset.sum_congr rfl intro k _ rw [integral_compact_count_eq_arc p q F hF j k] apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro s hs' apply integral_congr_ae filter_upwards [] with u apply intervalIntegral.integral_congr_Ioo_of_le (by linarith [Real.pi_pos]) intro t ht' apply integral_congr_ae filter_upwards [] with v exact counting_integrand_identity p F hs j k hs' ht' u v end Green24Proof.CompactTorusIntegratedCounting private def zz2478:"s09ae"="s09ae":=by decide+kernel end section namespace Green24Proof.CompactTorusProfileComparison open MeasureTheory Set open scoped BigOperators open Green24Proof.CompactTorusArcModel Green24Proof.CompactTorusIntegratedCounting open Green24Proof.RealTorusDilation Green24Proof.RealTorusCoefficientNormalization open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.CyclicTorusPairCounting open Green24Proof.SpatialCircleCutoff variable [MeasurableSpace Circle] [BorelSpace Circle] variable {ι:Type*} [Fintype ι] [DecidableEq ι] noncomputable def profileMass (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (r:ZMod q):ℝ := ∫ z,model p q F r z ∂arcMeasure p theorem profileMass_nonneg (p:ι) (q:ℕ) (F:(ι → Circle) → ℝ) (hr:∀ z,F z ∈ Icc 0 1) (r:ZMod q):0 ≤ profileMass p q F r := integral_nonneg (fun z => (model_range p q F hr r z).1) theorem integral_eq_profile_mass (p:ι) {q:ℕ} [NeZero q] (F:(ι → Circle) → ℝ) (hF:Continuous F) (hs:∀ z,z p ^ q ∉ window → F z = 0) : (∫ z,F z ∂torusHaar ι) = (2 * Real.pi * q)⁻¹ * mass (profileMass p q F) := mass_identity p F hF hs private def zz1924:"s0784"="s0784":=by decide+kernel theorem model_count_le_kernel (p:ι) {q:ℕ} [NeZero q] (hR:RearrangementBound {i:ι // i ≠ p}) (F:(ι → Circle) → ℝ) (hF:Continuous F) (hr:∀ z,F z ∈ Icc 0 1) (j k:ZMod q) : (∫ yz,compactCountingIntegrand p q F j k yz ∂(arcMeasure p).prod (arcMeasure p)) ≤ kernel (profileMass p q F (3 * k - 2 * j)) (2 * profileMass p q F j) (3 * profileMass p q F k) / 6:=by exact coefficient_bound_of_rearrangement hR (model p q F (3 * k - 2 * j)) (model p q F j) (model p q F k) (model_continuous p q F hF _) (model_continuous p q F hF _) (model_continuous p q F hF _) (model_compactSupport p q F _) (model_compactSupport p q F _) (model_compactSupport p q F _) (model_range p q F hr _) (model_range p q F hr _) (model_range p q F hr _) theorem count_le_profile (p:ι) {q:ℕ} [NeZero q] (hR:RearrangementBound {i:ι // i ≠ p}) (F:(ι → Circle) → ℝ) (hF:Continuous F) (hr:∀ z,F z ∈ Icc 0 1) (hs:∀ z,z p ^ q ∉ window → F z = 0) : haarWeightedCount F ≤ ((2 * Real.pi * q)⁻¹) ^ 2 * (profileFunctional (profileMass p q F) / 6):=by rw [integrated_count_identity p F hF hs] apply mul_le_mul_of_nonneg_left _ (sq_nonneg _) unfold profileFunctional rw [Finset.sum_div] apply Finset.sum_le_sum intro j _ rw [Finset.sum_div] apply Finset.sum_le_sum intro k _ exact model_count_le_kernel p hR F hF hr j k theorem upper_bound_of_profile (p:ι) {q:ℕ} [NeZero q] (hR:RearrangementBound {i:ι // i ≠ p}) (F:(ι → Circle) → ℝ) (hF:Continuous F) (hr:∀ z,F z ∈ Icc 0 1) (hs:∀ z,z p ^ q ∉ window → F z = 0) (hP:profileFunctional (profileMass p q F) ≤ 2 * mass (profileMass p q F) ^ 2) : haarWeightedCount F ≤ (1 / 3:ℝ) * (∫ z,F z ∂torusHaar ι) ^ 2:=by rw [integral_eq_profile_mass p F hF hs] calc _ ≤ ((2 * Real.pi * q)⁻¹) ^ 2 * (profileFunctional (profileMass p q F) / 6):=count_le_profile p hR F hF hr hs _ ≤ ((2 * Real.pi * q)⁻¹) ^ 2 * (2 * mass (profileMass p q F) ^ 2 / 6) := mul_le_mul_of_nonneg_left (div_le_div_of_nonneg_right hP (by norm_num)) (sq_nonneg _) _ = _:=by ring theorem upper_bound_not_five (p:ι) {q:ℕ} [NeZero q] (h5:¬5 ∣ q) (hR:RearrangementBound {i:ι // i ≠ p}) (F:(ι → Circle) → ℝ) (hF:Continuous F) (hr:∀ z,F z ∈ Icc 0 1) (hs:∀ z,z p ^ q ∉ window → F z = 0) : haarWeightedCount F ≤ (1 / 3:ℝ) * (∫ z,F z ∂torusHaar ι) ^ 2 := upper_bound_of_profile p hR F hF hr hs (VerifiedProfileEndpoint.profileFunctional_le q h5 _ (profileMass_nonneg p q F hr)) end Green24Proof.CompactTorusProfileComparison private def zz2479:"s09af"="s09af":=by decide+kernel end section namespace Green24Proof.UniformCircleLaurentApproximation variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset Set Metric BoundedContinuousFunction open scoped BigOperators NNReal open Green24Proof.CyclicTorusLaurent open Green24Proof.CircleLaurentApproximation variable {ι:Type*} [Fintype ι] private def zz1925:"s0785"="s0785":=by decide+kernel theorem polynomial_extend_support (S T:Finset (ι → ℤ)) (hST:S ⊆ T) (c:(ι → ℤ) → ℂ) (z:ι → Circle) : polynomial T (fun m => if m ∈ S then c m else 0) z = polynomial S c z:=by classical unfold polynomial calc (∑ m ∈ T,(if m ∈ S then c m else 0) * monomial m z) = ∑ m ∈ S,(if m ∈ S then c m else 0) * monomial m z:=by symm apply Finset.sum_subset hST intro m _ hm simp [hm] _ = _:=Finset.sum_congr rfl (fun m hm => by rw [if_pos hm]) theorem exists_common_support_of_isCompact (A:Set ((ι → Circle) →ᵇ ℂ)) (hA:IsCompact A) {ε:ℝ} (hε:0 < ε) : ∃ S:Finset (ι → ℤ), ∀ F ∈ A, ∃ c:(ι → ℤ) → ℂ, ∀ z, ‖F z - polynomial S c z‖ < ε:=by classical have hhalf:0 < ε / 2:=half_pos hε choose supports coeffs happrox using fun F:(ι → Circle) →ᵇ ℂ => exists_finite_laurent_approximation F.toContinuousMap hhalf obtain ⟨t,_htA,htfinite,hcover⟩:=finite_cover_balls_of_compact hA hhalf let S:=htfinite.toFinset.biUnion supports refine ⟨S, ?_⟩ intro F hF obtain ⟨G,hGt,hFG⟩:=Set.mem_iUnion₂.mp (hcover hF) have hsub:supports G ⊆ S := Finset.subset_biUnion_of_mem supports (htfinite.mem_toFinset.mpr hGt) refine ⟨fun m => if m ∈ supports G then coeffs G m else 0, ?_⟩ intro z rw [polynomial_extend_support (supports G) S hsub] have hpoint:‖F z - G z‖ < ε / 2:=by rw [← dist_eq_norm] exact (BoundedContinuousFunction.dist_coe_le_dist z).trans_lt hFG have happ:=happrox G z change ‖G z - polynomial (supports G) (coeffs G) z‖ < ε / 2 at happ have ht:=norm_add_le (F z - G z) (G z - polynomial (supports G) (coeffs G) z) rw [sub_add_sub_cancel] at ht linarith def boundedLipschitzClass (K:ℝ≥0):Set ((ι → Circle) →ᵇ ℂ) := {F | LipschitzWith K F ∧ ∀ z, ‖F z‖ ≤ 1} theorem isCompact_closure_boundedLipschitzClass (K:ℝ≥0) : IsCompact (closure (boundedLipschitzClass (ι:=ι) K)):=by apply BoundedContinuousFunction.arzela_ascoli (Metric.closedBall (0:ℂ) 1) (isCompact_closedBall _ _) · intro F z hF simpa only [Metric.mem_closedBall,dist_zero_right] using hF.2 z · exact (LipschitzWith.uniformEquicontinuous (fun F:boundedLipschitzClass (ι:=ι) K => (F.val:(ι → Circle) → ℂ)) K (fun F => F.property.1)).equicontinuous theorem exists_uniform_support_boundedLipschitz (K:ℝ≥0) {ε:ℝ} (hε:0 < ε) : ∃ S:Finset (ι → ℤ), ∀ F:(ι → Circle) → ℂ, LipschitzWith K F → (∀ z, ‖F z‖ ≤ 1) → ∃ c:(ι → ℤ) → ℂ, ∀ z, ‖F z - polynomial S c z‖ < ε:=by obtain ⟨S,hS⟩:=exists_common_support_of_isCompact (closure (boundedLipschitzClass (ι:=ι) K)) (isCompact_closure_boundedLipschitzClass K) hε refine ⟨S, ?_⟩ intro F hF hnorm let Fb:(ι → Circle) →ᵇ ℂ:=BoundedContinuousFunction.mkOfCompact ⟨F,hF.continuous⟩ exact hS Fb (subset_closure (show Fb ∈ boundedLipschitzClass K from ⟨hF,hnorm⟩)) private def zz1926:"s0786"="s0786":=by decide+kernel theorem exists_uniform_support_unit_interval (K:ℝ≥0) {ε:ℝ} (hε:0 < ε) : ∃ S:Finset (ι → ℤ), ∀ F:(ι → Circle) → ℝ, LipschitzWith K F → (∀ z,F z ∈ Set.Icc 0 1) → ∃ c:(ι → ℤ) → ℂ, ∀ z, ‖(F z:ℂ) - polynomial S c z‖ < ε:=by obtain ⟨S,hS⟩:=exists_uniform_support_boundedLipschitz (ι:=ι) K hε refine ⟨S, ?_⟩ intro F hF hrange have hcomplex:LipschitzWith K (fun z => (F z:ℂ)):=by simpa only [one_mul,Function.comp_def] using Complex.isometry_ofReal.lipschitz.comp hF apply hS _ hcomplex intro z simpa only [Complex.norm_real,Real.norm_eq_abs,abs_of_nonneg (hrange z).1] using (hrange z).2 end Green24Proof.UniformCircleLaurentApproximation private def zz2480:"s09b0"="s09b0":=by decide+kernel end section namespace Green24Proof.UniformTorusCountingApproximation variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped NNReal BigOperators open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusPairDiscrepancy open Green24Proof.CyclicTorusPairApproximation Green24Proof.CyclicTorusPairCounting open Green24Proof.UniformCircleLaurentApproximation open Green24Proof.CyclicTorusSmoothing Green24Proof.CyclicGrowthCounting theorem circle_dist_mul_le (a b c d:Circle) : dist (a * b) (c * d) ≤ dist a c + dist b d:=by change dist ((a:ℂ) * b) ((c:ℂ) * d) ≤ dist (a:ℂ) c + dist (b:ℂ) d simp only [dist_eq_norm] calc _ = ‖((a:ℂ) - c) * b + (c:ℂ) * ((b:ℂ) - d)‖:=by congr 1; ring _ ≤ ‖((a:ℂ) - c) * b‖ + ‖(c:ℂ) * ((b:ℂ) - d)‖:=norm_add_le _ _ _ = _:=by rw [norm_mul,norm_mul,Circle.norm_coe,Circle.norm_coe,mul_one,one_mul] theorem circle_dist_inv (a b:Circle):dist a⁻¹ b⁻¹ = dist a b:=by change dist ((a⁻¹:Circle):ℂ) ((b⁻¹:Circle):ℂ) = dist (a:ℂ) b simp only [dist_eq_norm] rw [Circle.coe_inv_eq_conj,Circle.coe_inv_eq_conj, ← map_sub] exact Complex.norm_conj _ theorem circle_dist_pow_le (a b:Circle) (m:ℕ) : dist (a ^ m) (b ^ m) ≤ m * dist a b:=by induction m with | zero => simp | succ m ih => rw [pow_succ,pow_succ] have h:=(circle_dist_mul_le (a ^ m) a (b ^ m) b).trans (add_le_add ih le_rfl) simpa [Nat.cast_add,Nat.cast_one,add_mul] using h variable {ι κ:Type*} [Fintype ι] [Fintype κ] private def zz1927:"s0787"="s0787":=by decide+kernel theorem splitTorus_lipschitz : LipschitzWith 1 (splitTorus (ι:=ι) (κ:=κ)):=by apply LipschitzWith.of_dist_le_mul intro z w rw [NNReal.coe_one,one_mul,Prod.dist_eq] apply max_le · exact (dist_pi_le_iff dist_nonneg).mpr (fun i => dist_le_pi_dist z w (Sum.inl i)) · exact (dist_pi_le_iff dist_nonneg).mpr (fun i => dist_le_pi_dist z w (Sum.inr i)) theorem equationMap_lipschitz : LipschitzWith 5 (fun p:PairTorus ι ι => p.2 ^ 3 * p.1 ^ (-2:ℤ)):=by apply LipschitzWith.of_dist_le_mul intro p r apply (dist_pi_le_iff (mul_nonneg (by norm_num) dist_nonneg)).mpr intro i change dist (p.2 i ^ 3 * p.1 i ^ (-2:ℤ)) (r.2 i ^ 3 * r.1 i ^ (-2:ℤ)) ≤ _ have hfst:=(dist_le_pi_dist p.1 r.1 i).trans (show dist p.1 r.1 ≤ dist p r from le_max_left _ _) have hsnd:=(dist_le_pi_dist p.2 r.2 i).trans (show dist p.2 r.2 ≤ dist p r from le_max_right _ _) have hthree:=circle_dist_pow_le (p.2 i) (r.2 i) 3 have htwo:=circle_dist_pow_le (p.1 i) (r.1 i) 2 have hmul:=circle_dist_mul_le (p.2 i ^ 3) (p.1 i ^ (-2:ℤ)) (r.2 i ^ 3) (r.1 i ^ (-2:ℤ)) simp only [zpow_neg,zpow_ofNat,circle_dist_inv] at hmul ⊢ norm_num only [Nat.cast_ofNat,NNReal.coe_ofNat] at * linarith theorem real_mul_dist_le {a b c d:ℝ} (hb:b ∈ Set.Icc 0 1) (hc:c ∈ Set.Icc 0 1) : dist (a * b) (c * d) ≤ dist a c + dist b d:=by simp only [Real.dist_eq] calc |a * b - c * d| = |(a - c) * b + c * (b - d)|:=by congr 1; ring _ ≤ |(a - c) * b| + |c * (b - d)|:=abs_add_le _ _ _ = |a - c| * b + c * |b - d|:=by rw [abs_mul,abs_mul,abs_of_nonneg hb.1,abs_of_nonneg hc.1] _ ≤ |a - c| + |b - d|:=by nlinarith [hb.2,hc.2,abs_nonneg (a-c),abs_nonneg (b-d)] theorem countingIntegrand_lipschitz (H:(ι → Circle) → ℝ) {K:ℝ≥0} (hH:LipschitzWith K H) (hr:∀ z,H z ∈ Set.Icc 0 1) : LipschitzWith (7 * K) (countingIntegrand H):=by apply LipschitzWith.of_dist_le_mul intro p r have h1:=hH.dist_le_mul_of_le (equationMap_lipschitz.dist_le_mul p r) have h2:=hH.dist_le_mul_of_le (show dist p.1 r.1 ≤ dist p r from le_max_left _ _) have h3:=hH.dist_le_mul_of_le (show dist p.2 r.2 ≤ dist p r from le_max_right _ _) have hmul:=real_mul_dist_le (hr p.1) (hr (r.2 ^ 3 * r.1 ^ (-2:ℤ))) (a:=H (p.2 ^ 3 * p.1 ^ (-2:ℤ))) (d:=H r.1) have hrprod:H (r.2 ^ 3 * r.1 ^ (-2:ℤ)) * H r.1 ∈ Set.Icc 0 1 := ⟨mul_nonneg (hr _).1 (hr _).1, (mul_le_mul (hr _).2 (hr _).2 (hr _).1 (by norm_num)).trans (by norm_num)⟩ have hmul':=real_mul_dist_le (hr p.2) hrprod (a:=H (p.2 ^ 3 * p.1 ^ (-2:ℤ)) * H p.1) (d:=H r.2) change dist ((realCountingIntegrand H p:ℝ):ℂ) ((realCountingIntegrand H r:ℝ):ℂ) ≤ _ rw [Complex.isometry_ofReal.dist_eq] unfold realCountingIntegrand norm_num only [NNReal.coe_mul,NNReal.coe_ofNat] at * nlinarith private def zz1928:"s0788"="s0788":=by decide+kernel omit [Fintype ι] in theorem countingIntegrand_norm_le (H:(ι → Circle) → ℝ) (hr:∀ z,H z ∈ Set.Icc 0 1) (p:PairTorus ι ι) : ‖countingIntegrand H p‖ ≤ 1:=by unfold countingIntegrand realCountingIntegrand rw [Complex.norm_real,Real.norm_eq_abs, abs_of_nonneg (mul_nonneg (mul_nonneg (hr _).1 (hr _).1) (hr _).1)] calc _ ≤ 1 * 1 * 1:=mul_le_mul (mul_le_mul (hr _).2 (hr _).2 (hr _).1 (by norm_num)) (hr _).2 (hr _).1 (by norm_num) _ = 1:=by norm_num theorem exists_uniform_counting_support (K:ℝ≥0) {ε:ℝ} (hε:0 < ε) : ∃ S:Finset (PairExponent ι ι), ∀ H:(ι → Circle) → ℝ, LipschitzWith K H → (∀ z,H z ∈ Set.Icc 0 1) → ∃ c:PairExponent ι ι → ℂ, ∀ p, ‖countingIntegrand H p - pairPolynomial S c p‖ < ε:=by obtain ⟨S,hS⟩:=exists_uniform_support_boundedLipschitz (ι:=ι ⊕ ι) (7 * K) hε refine ⟨S.map exponentEquiv.toEmbedding, ?_⟩ intro H hH hr have hlip:LipschitzWith (7 * K) (countingIntegrand H ∘ splitTorus):=by simpa only [mul_one] using (countingIntegrand_lipschitz H hH hr).comp splitTorus_lipschitz obtain ⟨c,hc⟩:=hS _ hlip (fun z => countingIntegrand_norm_le H hr _) refine ⟨fun m => c (exponentEquiv.symm m), ?_⟩ intro p rw [pairPolynomial_map] simpa only [Function.comp_apply,splitTorus_joinTorus] using hc (joinTorus p) theorem nonresonant_of_subset {q:ℕ} [NeZero q] (ks:ι → ZMod q) {S T:Finset (ι → ℤ)} (hST:S ⊆ T) (hk:Nonresonant ks T) : Nonresonant ks S:=fun m hm hne => hk m (hST hm) hne theorem orbitMean_ofReal {q n:ℕ} [NeZero q] (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ) : orbitMean ks (fun z => (H z:ℂ)) = (((∑ x:ZMod q,H (characterOrbit ks x)) / q:ℝ):ℂ):=by simp only [orbitMean,Complex.ofReal_div,Complex.ofReal_sum,Complex.ofReal_natCast] unfold characterOrbit ring private def zz1929:"s0789"="s0789":=by decide+kernel theorem exists_uniform_mass_count_discrepancy_support (n:ℕ) (K:ℝ≥0) {ε:ℝ} (hε:0 < ε) : ∃ T:Finset (Fin n → ℤ), ∀ (q:ℕ) [NeZero q] (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ), LipschitzWith K H → (∀ z,H z ∈ Set.Icc 0 1) → Nonresonant ks T → |(∑ x:ZMod q,H (characterOrbit ks x)) / q - ∫ z,H z ∂Green24Proof.CyclicTorusHaarDiscrepancy.torusHaar (Fin n)| ≤ 2 * ε ∧ |weightedCount (fun x => H (characterOrbit ks x)) / (q:ℝ) ^ 2 - haarWeightedCount H| ≤ 2 * ε:=by classical obtain ⟨S,hS⟩:=exists_uniform_support_unit_interval (ι:=Fin n) K hε obtain ⟨U,hU⟩:=exists_uniform_counting_support (ι:=Fin n) K hε refine ⟨S ∪ (U.image Prod.fst ∪ U.image Prod.snd), ?_⟩ intro q _ ks H hH hr hk have hs:Nonresonant ks S:=nonresonant_of_subset ks Finset.subset_union_left hk have hu:Nonresonant ks (U.image Prod.fst ∪ U.image Prod.snd) := nonresonant_of_subset ks Finset.subset_union_right hk obtain ⟨c,hc⟩:=hS H hH hr obtain ⟨d,hd⟩:=hU H hH hr constructor · have hcont:Continuous (fun z => (H z:ℂ)):=Complex.continuous_ofReal.comp hH.continuous have h:=Green24Proof.CyclicTorusHaarDiscrepancy.orbitMean_haar_discrepancy_of_continuous ks S c _ hcont hs (fun z => (hc z).le) have hint:(∫ z,(H z:ℂ) ∂Green24Proof.CyclicTorusHaarDiscrepancy.torusHaar (Fin n)) = Complex.ofReal (∫ z,H z ∂Green24Proof.CyclicTorusHaarDiscrepancy.torusHaar (Fin n)):=by exact integral_ofReal (𝕜:=ℂ) rw [orbitMean_ofReal,hint, ← Complex.ofReal_sub, Complex.norm_real,Real.norm_eq_abs] at h exact h · exact weightedCount_haar_discrepancy_of_approximation ks H hH.continuous U d (nonresonant_of_subset ks Finset.subset_union_left hu) (nonresonant_of_subset ks Finset.subset_union_right hu) (fun z => (hd z).le) end Green24Proof.UniformTorusCountingApproximation private def zz2481:"s09b1"="s09b1":=by decide+kernel end section namespace Green24Proof.CyclicFrequencyElimination variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusSmoothing open Green24Proof.UniformTorusCountingApproximation variable {q n:ℕ} [NeZero q] def reducedFrequencies (u:(ZMod q)ˣ) (ks:Fin (n + 1) → ZMod q):Fin n → ZMod q := fun i => (u⁻¹:(ZMod q)ˣ) * ks i.succ noncomputable def monomialLift (m:Fin (n + 1) → ℤ) (z:Fin n → Circle):Fin (n + 1) → Circle := Fin.cases (∏ i,z i ^ (-m i.succ)) (fun i => z i ^ m 0) omit [NeZero q] in theorem reduced_relation (u:(ZMod q)ˣ) (ks:Fin (n + 1) → ZMod q) (m:Fin (n + 1) → ℤ) (hu:(u:ZMod q) = m 0) (hm:weightedFrequency ks m = 0) : weightedFrequency (reducedFrequencies u ks) (fun i => -m i.succ) = ks 0:=by have hs:(∑ i:Fin n,(m i.succ:ZMod q) * ks i.succ) = -(u:ZMod q) * ks 0:=by unfold weightedFrequency at hm rw [Fin.sum_univ_succ, ← hu] at hm linear_combination hm unfold weightedFrequency reducedFrequencies calc (∑ i:Fin n,((-m i.succ:ℤ):ZMod q) * ((u⁻¹:(ZMod q)ˣ) * ks i.succ)) = -(u⁻¹:(ZMod q)ˣ) * ∑ i:Fin n,(m i.succ:ZMod q) * ks i.succ:=by rw [Finset.mul_sum] apply Finset.sum_congr rfl intro i _ simp only [Int.cast_neg] ring _ = ks 0:=by rw [hs]; simp [← mul_assoc] theorem monomialLift_characterOrbit (u:(ZMod q)ˣ) (ks:Fin (n + 1) → ZMod q) (m:Fin (n + 1) → ℤ) (hu:(u:ZMod q) = m 0) (hm:weightedFrequency ks m = 0) (x:ZMod q) : monomialLift m (characterOrbit (reducedFrequencies u ks) x) = characterOrbit ks x:=by funext i refine Fin.cases ?_ (fun j => ?_) i · apply Circle.coe_injective change Circle.coeHom (∏ j:Fin n,characterOrbit (reducedFrequencies u ks) x j ^ (-m j.succ)) = _ rw [map_prod] have h:=monomial_characterOrbit (reducedFrequencies u ks) (fun j => -m j.succ) x rw [reduced_relation u ks m hu hm] at h simp only [map_zpow] exact h · change ZMod.toCircle (-(x * reducedFrequencies u ks j)) ^ m 0 = ZMod.toCircle (-(x * ks j.succ)) rw [← AddChar.map_zsmul_eq_zpow] congr 1 rw [zsmul_eq_mul, ← hu] unfold reducedFrequencies calc (u:ZMod q) * -(x * ((u⁻¹:(ZMod q)ˣ) * ks j.succ)) = -(x * (((u:ZMod q) * (u⁻¹:(ZMod q)ˣ)) * ks j.succ)):=by ring _ = _:=by simp omit [NeZero q] in theorem monomialLift_continuous (m:Fin (n + 1) → ℤ):Continuous (monomialLift m):=by apply continuous_pi intro i refine Fin.cases ?_ (fun j => ?_) i · change Continuous (fun z:Fin n → Circle => ∏ j,z j ^ (-m j.succ)) fun_prop · change Continuous (fun z:Fin n → Circle => z j ^ m 0) fun_prop private def zz1930:"s078a"="s078a":=by decide+kernel theorem circle_dist_zpow_le (a b:Circle) (m:ℤ) : dist (a ^ m) (b ^ m) ≤ m.natAbs * dist a b:=by cases m with | ofNat m => change dist (a ^ (m:ℤ)) (b ^ (m:ℤ)) ≤ (m:ℝ) * dist a b simpa only [zpow_natCast] using circle_dist_pow_le a b m | negSucc m => simpa only [zpow_negSucc,circle_dist_inv,Int.natAbs_negSucc] using circle_dist_pow_le a b (m + 1) theorem circle_dist_prod_le {α:Type*} (s:Finset α) (a b:α → Circle) : dist (∏ i ∈ s,a i) (∏ i ∈ s,b i) ≤ ∑ i ∈ s,dist (a i) (b i):=by classical induction s using Finset.induction_on with | empty => simp | @insert i s hi ih => simp only [Finset.prod_insert hi,Finset.sum_insert hi] exact (circle_dist_mul_le _ _ _ _).trans (add_le_add le_rfl ih) theorem monomialLift_lipschitz (m:Fin (n + 1) → ℤ) : LipschitzWith ((m 0).natAbs + ∑ i:Fin n,(m i.succ).natAbs:ℝ≥0) (monomialLift m):=by apply LipschitzWith.of_dist_le_mul intro z w apply (dist_pi_le_iff (mul_nonneg (by positivity) dist_nonneg)).mpr intro i refine Fin.cases ?_ (fun j => ?_) i · change dist (∏ j:Fin n,z j ^ (-m j.succ)) (∏ j:Fin n,w j ^ (-m j.succ)) ≤ _ have hp:=circle_dist_prod_le Finset.univ (fun j:Fin n => z j ^ (-m j.succ)) (fun j => w j ^ (-m j.succ)) have hb:(∑ j:Fin n,dist (z j ^ (-m j.succ)) (w j ^ (-m j.succ))) ≤ (∑ j:Fin n,((m j.succ).natAbs:ℝ)) * dist z w:=by rw [Finset.sum_mul] apply Finset.sum_le_sum intro j _ have h:=circle_dist_zpow_le (z j) (w j) (-m j.succ) simp only [Int.natAbs_neg] at h exact h.trans (mul_le_mul_of_nonneg_left (dist_le_pi_dist z w j) (by positivity)) have htotal:=hp.trans hb simp only [NNReal.coe_add,NNReal.coe_natCast,Nat.cast_sum,NNReal.coe_sum] nlinarith [mul_nonneg (Nat.cast_nonneg (m 0).natAbs) (dist_nonneg (x:=z) (y:=w))] · change dist (z j ^ m 0) (w j ^ m 0) ≤ _ have h:=(circle_dist_zpow_le (z j) (w j) (m 0)).trans (mul_le_mul_of_nonneg_left (dist_le_pi_dist z w j) (by positivity)) simp only [NNReal.coe_add,NNReal.coe_natCast,Nat.cast_sum,NNReal.coe_sum] have hs:0 ≤ ∑ i:Fin n,((m i.succ).natAbs:ℝ):=Finset.sum_nonneg (fun i _ => by positivity) nlinarith [mul_nonneg hs (dist_nonneg (x:=z) (y:=w))] theorem model_factorization (u:(ZMod q)ˣ) (ks:Fin (n + 1) → ZMod q) (m:Fin (n + 1) → ℤ) (hu:(u:ZMod q) = m 0) (hm:weightedFrequency ks m = 0) (H:(Fin (n + 1) → Circle) → ℝ) : ∀ x,(H ∘ monomialLift m) (characterOrbit (reducedFrequencies u ks) x) = H (characterOrbit ks x):=by intro x rw [Function.comp_apply,monomialLift_characterOrbit u ks m hu hm] end Green24Proof.CyclicFrequencyElimination private def zz2482:"s09b2"="s09b2":=by decide+kernel end section namespace Green24Proof.TorusIntegerMatrix variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.CyclicFrequencyElimination Green24Proof.CyclicTorusLaurent variable {ι κ ν:Type*} [Fintype ι] [Fintype κ] [Fintype ν] noncomputable def torusMap (A:ι → κ → ℤ) (z:κ → Circle):ι → Circle := fun i => ∏ j,z j ^ A i j def matrixComp (A:ι → κ → ℤ) (B:κ → ν → ℤ):ι → ν → ℤ := fun i k => ∑ j,A i j * B j k noncomputable def matrixId:ι → ι → ℤ:=by classical exact fun i j => if i = j then 1 else 0 def rowSize (A:ι → κ → ℤ) (i:ι):ℕ:=∑ j,(A i j).natAbs private def zz1931:"s078b"="s078b":=by decide+kernel theorem torusMap_id (z:ι → Circle):torusMap matrixId z = z:=by classical funext i simp [torusMap,matrixId] theorem circle_zpow_sum {α:Type*} (a:Circle) (s:Finset α) (f:α → ℤ) : a ^ (∑ j ∈ s,f j) = ∏ j ∈ s,a ^ f j:=by classical induction s using Finset.induction_on with | empty => simp | @insert i s hi ih => simp [hi,zpow_add,ih] omit [Fintype ι] in theorem torusMap_comp (A:ι → κ → ℤ) (B:κ → ν → ℤ) (z:ν → Circle) : torusMap (matrixComp A B) z = torusMap A (torusMap B z):=by funext i simp only [torusMap,matrixComp,circle_zpow_sum, ← Finset.prod_zpow, ← zpow_mul] rw [Finset.prod_comm] apply Finset.prod_congr rfl intro j _ apply Finset.prod_congr rfl intro k _ rw [mul_comm] omit [Fintype ι] in theorem torusMap_continuous (A:ι → κ → ℤ):Continuous (torusMap A):=by unfold torusMap fun_prop private def zz1932:"s078c"="s078c":=by decide+kernel theorem rowSize_id (i:ι):rowSize (matrixId:ι → ι → ℤ) i = 1:=by classical simp [rowSize,matrixId,apply_ite] omit [Fintype ι] in theorem rowSize_comp_le (A:ι → κ → ℤ) (B:κ → ν → ℤ) (i:ι) {D:ℕ} (hB:∀ j,rowSize B j ≤ D) : rowSize (matrixComp A B) i ≤ rowSize A i * D:=by unfold rowSize matrixComp calc (∑ k,(∑ j,A i j * B j k).natAbs) ≤ ∑ k, ∑ j,(A i j * B j k).natAbs := Finset.sum_le_sum (fun k _ => Int.natAbs_sum_le _ _) _ = ∑ j,(A i j).natAbs * ∑ k,(B j k).natAbs:=by simp only [Int.natAbs_mul,Finset.mul_sum] rw [Finset.sum_comm] _ ≤ ∑ j,(A i j).natAbs * D:=by apply Finset.sum_le_sum intro j _ exact Nat.mul_le_mul_left _ (hB j) _ = _:=by rw [Finset.sum_mul] theorem torusMap_lipschitz (A:ι → κ → ℤ) {D:ℕ} (hA:∀ i,rowSize A i ≤ D):LipschitzWith (D:ℝ≥0) (torusMap A):=by apply LipschitzWith.of_dist_le_mul intro z w apply (dist_pi_le_iff (mul_nonneg (by positivity) dist_nonneg)).mpr intro i change dist (∏ j,z j ^ A i j) (∏ j,w j ^ A i j) ≤ _ calc _ ≤ ∑ j,dist (z j ^ A i j) (w j ^ A i j):=circle_dist_prod_le _ _ _ _ ≤ ∑ j,((A i j).natAbs:ℝ) * dist z w:=by apply Finset.sum_le_sum intro j _ exact (circle_dist_zpow_le _ _ _).trans (mul_le_mul_of_nonneg_left (dist_le_pi_dist z w j) (by positivity)) _ = (rowSize A i:ℝ) * dist z w:=by simp [rowSize,Finset.sum_mul] _ ≤ _:=mul_le_mul_of_nonneg_right (by exact_mod_cast hA i) dist_nonneg noncomputable def frequencyMap {q:ℕ} (A:ι → κ → ℤ) (ks:κ → ZMod q):ι → ZMod q := fun i => weightedFrequency ks (A i) theorem frequencyMap_id {q:ℕ} (ks:ι → ZMod q):frequencyMap matrixId ks = ks:=by classical funext i simp [frequencyMap,weightedFrequency,matrixId] private def zz1933:"s078d"="s078d":=by decide+kernel omit [Fintype ι] in theorem frequencyMap_comp {q:ℕ} (A:ι → κ → ℤ) (B:κ → ν → ℤ) (ks:ν → ZMod q) : frequencyMap (matrixComp A B) ks = frequencyMap A (frequencyMap B ks):=by funext i simp only [frequencyMap,weightedFrequency,matrixComp,Int.cast_sum,Int.cast_mul, Finset.sum_mul,Finset.mul_sum] rw [Finset.sum_comm] apply Finset.sum_congr rfl intro j _ apply Finset.sum_congr rfl intro k _ ring omit [Fintype ι] in theorem torusMap_character_values {q:ℕ} [NeZero q] (A:ι → κ → ℤ) (ks:κ → ZMod q) (x:ZMod q) : torusMap A (fun j => ZMod.toCircle (-(x * ks j))) = fun i => ZMod.toCircle (-(x * frequencyMap A ks i)):=by funext i apply Circle.coe_injective change Circle.coeHom (∏ j,ZMod.toCircle (-(x * ks j)) ^ A i j) = _ rw [map_prod] simp only [map_zpow] exact monomial_character_values ks (A i) x omit [Fintype ι] in theorem row_ne_zero_of_frequency_ne_zero {q:ℕ} (A:ι → κ → ℤ) (ks:κ → ZMod q) (i:ι) (hi:frequencyMap A ks i ≠ 0):A i ≠ 0:=by intro hz apply hi simp [frequencyMap,hz,weightedFrequency_zero] end Green24Proof.TorusIntegerMatrix private def zz2483:"s09b3"="s09b3":=by decide+kernel end section namespace Green24Proof.TorusMatrixHaarInvariance variable [MeasurableSpace Circle] [BorelSpace Circle] open MeasureTheory open scoped BigOperators open Green24Proof.TorusIntegerMatrix Green24Proof.CyclicTorusHaarDiscrepancy open Green24Proof.CyclicTorusPairDiscrepancy Green24Proof.CyclicTorusPairCounting variable {ι κ:Type*} [Fintype ι] [Fintype κ] noncomputable def torusHom (A:ι → κ → ℤ):(κ → Circle) →* (ι → Circle) where toFun:=Green24Proof.TorusIntegerMatrix.torusMap A map_one':=by funext i; simp [Green24Proof.TorusIntegerMatrix.torusMap] map_mul':=by intro z w funext i simp [Green24Proof.TorusIntegerMatrix.torusMap,mul_zpow,Finset.prod_mul_distrib] theorem torusMap_surjective_of_right_inverse (A:ι → κ → ℤ) (B:κ → ι → ℤ) (hAB:matrixComp A B = matrixId):Function.Surjective (Green24Proof.TorusIntegerMatrix.torusMap A):=by intro z refine ⟨torusMap B z, ?_⟩ rw [← torusMap_comp,hAB,torusMap_id] private def zz1934:"s078e"="s078e":=by decide+kernel theorem torusMap_measurePreserving (A:ι → κ → ℤ) (hA:Function.Surjective (Green24Proof.TorusIntegerMatrix.torusMap A)) : MeasurePreserving (Green24Proof.TorusIntegerMatrix.torusMap A) (torusHaar κ) (torusHaar ι):=by letI:=torusHaar_isProbabilityMeasure ι letI:=torusHaar_isHaarMeasure ι letI:=torusHaar_isProbabilityMeasure κ letI:=torusHaar_isHaarMeasure κ exact MonoidHom.measurePreserving (f:=torusHom A) (torusMap_continuous A) hA (by simp) theorem integral_comp_torusMap (A:ι → κ → ℤ) (hA:Function.Surjective (Green24Proof.TorusIntegerMatrix.torusMap A)) (F:(ι → Circle) → ℝ) (hF:Continuous F) : (∫ z,F (Green24Proof.TorusIntegerMatrix.torusMap A z) ∂torusHaar κ) = ∫ z,F z ∂torusHaar ι:=by have hp:=torusMap_measurePreserving A hA have hi:=integral_map (μ:=torusHaar κ) hp.measurable.aemeasurable hF.aestronglyMeasurable rw [hp.map_eq] at hi exact hi.symm omit [Fintype ι] in theorem torusMap_equation (A:ι → κ → ℤ) (y z:κ → Circle) : Green24Proof.TorusIntegerMatrix.torusMap A (z ^ 3 * y ^ (-2:ℤ)) = (Green24Proof.TorusIntegerMatrix.torusMap A z) ^ 3 * (Green24Proof.TorusIntegerMatrix.torusMap A y) ^ (-2:ℤ):=by change torusHom A (z ^ 3 * y ^ (-2:ℤ)) = (torusHom A z) ^ 3 * (torusHom A y) ^ (-2:ℤ) rw [map_mul,map_pow,map_zpow] theorem haarWeightedCount_comp_torusMap (A:ι → κ → ℤ) (hA:Function.Surjective (Green24Proof.TorusIntegerMatrix.torusMap A)) (F:(ι → Circle) → ℝ) (hF:Continuous F) : haarWeightedCount (F ∘ Green24Proof.TorusIntegerMatrix.torusMap A) = haarWeightedCount F:=by letI:=torusHaar_isProbabilityMeasure ι letI:=torusHaar_isProbabilityMeasure κ have hp:MeasurePreserving (Prod.map (Green24Proof.TorusIntegerMatrix.torusMap A) (Green24Proof.TorusIntegerMatrix.torusMap A)) (pairHaar (ι:=κ) (κ:=κ)) (pairHaar (ι:=ι) (κ:=ι)) := (torusMap_measurePreserving A hA).prod (torusMap_measurePreserving A hA) have hcont:Continuous (realCountingIntegrand F):=by unfold realCountingIntegrand fun_prop have hi:=integral_map (μ:=pairHaar (ι:=κ) (κ:=κ)) hp.measurable.aemeasurable hcont.aestronglyMeasurable rw [hp.map_eq] at hi change (∫ p,realCountingIntegrand (F ∘ Green24Proof.TorusIntegerMatrix.torusMap A) p ∂pairHaar) = ∫ p,realCountingIntegrand F p ∂pairHaar rw [hi] apply integral_congr_ae filter_upwards [] with p change F (Green24Proof.TorusIntegerMatrix.torusMap A (p.2 ^ 3 * p.1 ^ (-2:ℤ))) * F (Green24Proof.TorusIntegerMatrix.torusMap A p.1) * F (Green24Proof.TorusIntegerMatrix.torusMap A p.2) = F ((Green24Proof.TorusIntegerMatrix.torusMap A p.2) ^ 3 * (Green24Proof.TorusIntegerMatrix.torusMap A p.1) ^ (-2:ℤ)) * F (Green24Proof.TorusIntegerMatrix.torusMap A p.1) * F (Green24Proof.TorusIntegerMatrix.torusMap A p.2) rw [torusMap_equation] end Green24Proof.TorusMatrixHaarInvariance private def zz2484:"s09b4"="s09b4":=by decide+kernel end section namespace Green24Proof.TorusCharacterCover variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset MeasureTheory open scoped BigOperators open Green24Proof.TorusIntegerMatrix Green24Proof.TorusMatrixHaarInvariance open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.CyclicTorusPairCounting variable {ι:Type*} [Fintype ι] [DecidableEq ι] def coverMatrix (w:ι → ℤ) (p:ι):ι → ι → ℤ := fun i j => if i = p then (if j = p then 1 else -w j) else (if i = j then w p else 0) private def zz1935:"s078f"="s078f":=by decide+kernel theorem cover_apply_pivot (w:ι → ℤ) (p:ι) (z:ι → Circle) : Green24Proof.TorusIntegerMatrix.torusMap (coverMatrix w p) z p = z p * ∏ j ∈ univ.erase p,z j ^ (-w j):=by unfold Green24Proof.TorusIntegerMatrix.torusMap rw [← prod_erase_mul _ _ (mem_univ p)] simp only [coverMatrix,ite_true,zpow_one] have h:(∏ j ∈ univ.erase p,z j ^ (if j = p then (1:ℤ) else -w j)) = ∏ j ∈ univ.erase p,z j ^ (-w j):=by apply prod_congr rfl intro j hj rw [if_neg (mem_erase.mp hj).1] rw [h,mul_comm] theorem cover_apply_other (w:ι → ℤ) (p:ι) (z:ι → Circle) {i:ι} (hi:i ≠ p) : Green24Proof.TorusIntegerMatrix.torusMap (coverMatrix w p) z i = z i ^ w p:=by simp [Green24Proof.TorusIntegerMatrix.torusMap,coverMatrix,hi] theorem circle_zpow_surjective {n:ℤ} (hn:n ≠ 0) : Function.Surjective (fun z:Circle => z ^ n):=by intro z obtain ⟨t,rfl⟩:=Circle.exp_surjective z refine ⟨Circle.exp (t / n), ?_⟩ change Circle.exp (t / n) ^ n = Circle.exp t rw [← Circle.exp_intCast_mul] congr 1 have hn':(n:ℝ) ≠ 0:=by exact_mod_cast hn field_simp theorem cover_surjective (w:ι → ℤ) (p:ι) (hp:w p ≠ 0) : Function.Surjective (Green24Proof.TorusIntegerMatrix.torusMap (coverMatrix w p)):=by intro y choose r hr using fun i => circle_zpow_surjective hp (y i) let P:=∏ j ∈ univ.erase p,r j ^ (-w j) let z:=Function.update r p (y p * P⁻¹) refine ⟨z, ?_⟩ funext i by_cases hi:i = p · subst i rw [cover_apply_pivot] have heq:(∏ j ∈ univ.erase p,z j ^ (-w j)) = P:=by apply prod_congr rfl intro j hj simp only [z,Function.update_of_ne (mem_erase.mp hj).1] rw [heq] simp [z] · rw [cover_apply_other w p z hi] simpa only [z,Function.update_of_ne hi] using hr i private def zz1936:"s0790"="s0790":=by decide+kernel theorem cover_character (w:ι → ℤ) (p:ι) (z:ι → Circle) : (∏ i,(Green24Proof.TorusIntegerMatrix.torusMap (coverMatrix w p) z i) ^ w i) = z p ^ w p:=by rw [← prod_erase_mul _ _ (mem_univ p),cover_apply_pivot] have hother:(∏ i ∈ univ.erase p,(Green24Proof.TorusIntegerMatrix.torusMap (coverMatrix w p) z i) ^ w i) = ∏ i ∈ univ.erase p,(z i ^ w p) ^ w i:=by apply prod_congr rfl intro i hi rw [cover_apply_other w p z (mem_erase.mp hi).1] rw [hother,mul_zpow,mul_left_comm, ← Finset.prod_zpow, ← Finset.prod_mul_distrib] have hcancel:(∏ i ∈ univ.erase p,(z i ^ w p) ^ w i * (z i ^ (-w i)) ^ w p) = 1:=by apply prod_eq_one intro i _ rw [← zpow_mul, ← zpow_mul, ← zpow_add] have:w p * w i + -w i * w p = 0:=by ring rw [this,zpow_zero] rw [hcancel,mul_one] theorem exists_single_coordinate_model (G:(ι → Circle) → ℝ) (w:ι → ℤ) (hG:Continuous G) (hGr:∀ z,G z ∈ Set.Icc 0 1) (hw:w ≠ 0) (W:Set Circle) (hGs:∀ z,(∏ j,z j ^ w j) ∉ W → G z = 0) : ∃ (p:ι) (n:ℤ) (H:(ι → Circle) → ℝ), n ≠ 0 ∧ Continuous H ∧ (∀ z,H z ∈ Set.Icc 0 1) ∧ (∀ z,z p ^ n ∉ W → H z = 0) ∧ (∫ z,H z ∂torusHaar ι) = (∫ z,G z ∂torusHaar ι) ∧ haarWeightedCount H = haarWeightedCount G:=by obtain ⟨p,hp⟩:=Function.ne_iff.mp hw change w p ≠ 0 at hp let A:=coverMatrix w p refine ⟨p,w p,G ∘ Green24Proof.TorusIntegerMatrix.torusMap A,hp,hG.comp (torusMap_continuous A), fun z => hGr _, ?_, ?_, ?_⟩ · intro z hz apply hGs (Green24Proof.TorusIntegerMatrix.torusMap A z) simpa only [A,cover_character] using hz · exact integral_comp_torusMap A (cover_surjective w p hp) G hG · exact haarWeightedCount_comp_torusMap A (cover_surjective w p hp) G hG end Green24Proof.TorusCharacterCover private def zz2485:"s09b5"="s09b5":=by decide+kernel end section namespace Green24Proof.CyclicFourierCutoff variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusSmoothing open Green24Proof.CircleLaurentApproximation variable {q n:ℕ} [NeZero q] theorem dft_norm_le_sum_norm (u:ZMod q → ℂ) (r:ZMod q) : ‖ZMod.dft u r‖ ≤ ∑ x, ‖u x‖:=by calc _ ≤ ∑ x, ‖ZMod.stdAddChar (-(x * r)) * u x‖:=norm_sum_le _ _ _ = _:=by simp only [norm_mul,ZMod.stdAddChar_apply,Circle.norm_coe,one_mul] theorem dft_norm_le_of_pointwise (u:ZMod q → ℂ) {ε:ℝ} (hu:∀ x, ‖u x‖ ≤ ε) (r:ZMod q):‖ZMod.dft u r‖ ≤ ε * q:=by calc _ ≤ ∑ x, ‖u x‖:=dft_norm_le_sum_norm u r _ ≤ ∑ _x:ZMod q,ε:=Finset.sum_le_sum (fun x _ => hu x) _ = _:=by simp [ZMod.card,mul_comm] private def zz1937:"s0791"="s0791":=by decide+kernel theorem dft_character_mul (t:ZMod q) (u:ZMod q → ℂ) (r:ZMod q) : ZMod.dft (fun x => ZMod.stdAddChar (-(x * t)) * u x) r = ZMod.dft u (r + t):=by simp only [ZMod.dft_apply,smul_eq_mul] apply Finset.sum_congr rfl intro x _ rw [← mul_assoc, ← AddChar.map_add_eq_mul] congr 2 ring theorem dft_polynomial_mul (ks:Fin n → ZMod q) (S:Finset (Fin n → ℤ)) (c:(Fin n → ℤ) → ℂ) (u:ZMod q → ℂ) (r:ZMod q) : ZMod.dft (fun x => polynomial S c (characterOrbit ks x) * u x) r = ∑ m ∈ S,c m * ZMod.dft u (r + weightedFrequency ks m):=by have hfun:(fun x => polynomial S c (characterOrbit ks x) * u x) = ∑ m ∈ S,(fun x => c m * (ZMod.stdAddChar (-(x * weightedFrequency ks m)) * u x)):=by funext x simp only [polynomial,Finset.sum_apply,Finset.sum_mul,monomial_characterOrbit] apply Finset.sum_congr rfl intro m _ ring rw [hfun,map_sum] simp only [Finset.sum_apply,ZMod.dft_const_mul,dft_character_mul] theorem dft_polynomial_mul_norm_le (ks:Fin n → ZMod q) (S:Finset (Fin n → ℤ)) (c:(Fin n → ℤ) → ℂ) (u:ZMod q → ℂ) {η:ℝ} (hu:∀ r, ‖ZMod.dft u r‖ ≤ η * q) (r:ZMod q) : ‖ZMod.dft (fun x => polynomial S c (characterOrbit ks x) * u x) r‖ ≤ ((∑ m ∈ S, ‖c m‖) * η) * q:=by rw [dft_polynomial_mul] calc _ ≤ ∑ m ∈ S, ‖c m * ZMod.dft u (r + weightedFrequency ks m)‖:=norm_sum_le _ _ _ ≤ ∑ m ∈ S, ‖c m‖ * (η * q):=by apply Finset.sum_le_sum intro m _ rw [norm_mul] exact mul_le_mul_of_nonneg_left (hu _) (norm_nonneg _) _ = _:=by rw [← Finset.sum_mul]; ring theorem dft_cutoff_mul_norm_le (ks:Fin n → ZMod q) (F:(Fin n → Circle) → ℂ) (S:Finset (Fin n → ℤ)) (c:(Fin n → ℤ) → ℂ) (u:ZMod q → ℂ) {η δ:ℝ} (hδ:0 ≤ δ) (hu:∀ x, ‖u x‖ ≤ 1) (hdf:∀ r, ‖ZMod.dft u r‖ ≤ η * q) (herr:∀ z, ‖F z - polynomial S c z‖ ≤ δ) (r:ZMod q) : ‖ZMod.dft (fun x => F (characterOrbit ks x) * u x) r‖ ≤ ((∑ m ∈ S, ‖c m‖) * η + δ) * q:=by let a:=fun x => F (characterOrbit ks x) * u x let b:=fun x => polynomial S c (characterOrbit ks x) * u x have he:‖ZMod.dft (a - b) r‖ ≤ δ * q:=dft_norm_le_of_pointwise _ (fun x => by change ‖F (characterOrbit ks x) * u x - polynomial S c (characterOrbit ks x) * u x‖ ≤ δ rw [← sub_mul,norm_mul] exact (mul_le_mul (herr _) (hu x) (norm_nonneg _) hδ).trans (by rw [mul_one])) r rw [map_sub,Pi.sub_apply] at he have hb:=dft_polynomial_mul_norm_le ks S c u hdf r change ‖ZMod.dft a r‖ ≤ _ have ht:=norm_add_le (ZMod.dft a r - ZMod.dft b r) (ZMod.dft b r) rw [sub_add_cancel] at ht change ‖ZMod.dft b r‖ ≤ _ at hb nlinarith private def zz1938:"s0792"="s0792":=by decide+kernel theorem exists_uniform_cutoff_multiplier (F:(Fin n → Circle) → ℂ) (hF:Continuous F) {δ:ℝ} (hδ:0 < δ) : ∃ C:ℝ,0 ≤ C ∧ ∀ (q:ℕ) [NeZero q] (ks:Fin n → ZMod q) (u:ZMod q → ℂ) (η:ℝ), (∀ x, ‖u x‖ ≤ 1) → (∀ r, ‖ZMod.dft u r‖ ≤ η * q) → ∀ r, ‖ZMod.dft (fun x => F (characterOrbit ks x) * u x) r‖ ≤ (C * η + δ) * q:=by obtain ⟨S,c,herr⟩:=exists_finite_laurent_approximation ⟨F,hF⟩ hδ refine ⟨∑ m ∈ S, ‖c m‖,Finset.sum_nonneg (fun m _ => norm_nonneg _), ?_⟩ intro q _ ks u η hu hdf r exact dft_cutoff_mul_norm_le ks F S c u hδ.le hu hdf (fun z => (herr z).le) r end Green24Proof.CyclicFourierCutoff private def zz2486:"s09b6"="s09b6":=by decide+kernel end section namespace Green24Proof.CyclicMaskedRegularity variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.CyclicFourierCutoff Green24Proof.CyclicGrowthDecomposition open Green24Proof.CyclicTorusSmoothing Green24Proof.CyclicL2Replacement open Green24Proof.UniformTorusCountingApproximation theorem exists_uniform_orbit_fourier_approximation {η:ℝ} (hη:0 < η) : ∃ C:ℕ, ∀ (q:ℕ) [NeZero q] (f:ZMod q → ℝ), (∀ x,f x ∈ Set.Icc 0 1) → ∃ n ≤ C, ∃ (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ), LipschitzWith (C:ℝ≥0) H ∧ (∀ z,H z ∈ Set.Icc 0 1) ∧ ∀ r, ‖ZMod.dft (fun x => ((f x - H (characterOrbit ks x):ℝ):ℂ)) r‖ ≤ η * q:=by refine ⟨complexityBound (fun _ => η / 2) (η / 2), ?_⟩ intro q _ f hf obtain ⟨M,hM,n,hn,ks,H,small,uniform,hL,hH,hd,_,_,_,hs,_,hu⟩ := exists_growth_decomposition f hf (fun _ => η / 2) (fun _ => half_pos hη) (half_pos hη) refine ⟨n,hn.trans hM,ks,H,hL.weaken (by exact_mod_cast hM),hH, ?_⟩ intro r have he:(fun x => ((f x - H (characterOrbit ks x):ℝ):ℂ)) = (fun x => (small x:ℂ)) + (fun x => (uniform x:ℂ)):=by funext x simp only [Pi.add_apply,hd,Complex.ofReal_sub,Complex.ofReal_add] ring rw [he,map_add,Pi.add_apply] have hsmall:=dft_norm_le_of_sum_sq_le small (half_pos hη).le hs r have htri:=norm_add_le (ZMod.dft (fun x => (small x:ℂ)) r) (ZMod.dft (fun x => (uniform x:ℂ)) r) have hunif:=hu r linarith noncomputable def maskedModel {n:ℕ} (χ:Circle → ℝ) (H:(Fin n → Circle) → ℝ) (z:Fin (n + 1) → Circle):ℝ:=χ (z 0) * H (fun i => z i.succ) theorem maskedModel_lipschitz {n:ℕ} (χ:Circle → ℝ) (H:(Fin n → Circle) → ℝ) {L K:ℝ≥0} (hχ:LipschitzWith L χ) (hH:LipschitzWith K H) (hχr:∀ z,χ z ∈ Set.Icc 0 1) (hHr:∀ z,H z ∈ Set.Icc 0 1) : LipschitzWith (L + K) (maskedModel χ H):=by apply LipschitzWith.of_dist_le_mul intro z w have hd:dist (fun i:Fin n => z i.succ) (fun i => w i.succ) ≤ dist z w := (dist_pi_le_iff dist_nonneg).mpr (fun i => dist_le_pi_dist z w i.succ) have h1:=hχ.dist_le_mul_of_le (dist_le_pi_dist z w 0) have h2:=hH.dist_le_mul_of_le hd have h:=real_mul_dist_le (hHr (fun i => z i.succ)) (hχr (w 0)) (a:=χ (z 0)) (d:=H (fun i => w i.succ)) change dist (χ (z 0) * H (fun i => z i.succ)) (χ (w 0) * H (fun i => w i.succ)) ≤ _ simp only [NNReal.coe_add] nlinarith theorem maskedModel_range {n:ℕ} (χ:Circle → ℝ) (H:(Fin n → Circle) → ℝ) (hχr:∀ z,χ z ∈ Set.Icc 0 1) (hHr:∀ z,H z ∈ Set.Icc 0 1) (z:Fin (n + 1) → Circle):maskedModel χ H z ∈ Set.Icc 0 1:=by exact ⟨mul_nonneg (hχr _).1 (hHr _).1, (mul_le_mul (hχr _).2 (hHr _).2 (hHr _).1 (by norm_num)).trans (by norm_num)⟩ private def zz1939:"s0793"="s0793":=by decide+kernel theorem exists_masked_approximation (χ:Circle → ℝ) {L:ℝ≥0} (hχ:LipschitzWith L χ) (hχr:∀ z,χ z ∈ Set.Icc 0 1) {δ:ℝ} (hδ:0 < δ) : ∃ C:ℕ, ∀ (q:ℕ) [NeZero q] (f:ZMod q → ℝ), (∀ x,f x ∈ Set.Icc 0 1) → (∀ x,χ (ZMod.toCircle (-x)) * f x = f x) → ∃ n,n + 1 ≤ C ∧ ∃ (ks:Fin (n + 1) → ZMod q) (G:(Fin (n + 1) → Circle) → ℝ), ks 0 = 1 ∧ LipschitzWith (C:ℝ≥0) G ∧ (∀ z,G z ∈ Set.Icc 0 1) ∧ (∀ z,χ (z 0) = 0 → G z = 0) ∧ ∀ r, ‖ZMod.dft (fun x => ((f x - G (characterOrbit ks x):ℝ):ℂ)) r‖ ≤ δ * q:=by let F:(Fin 1 → Circle) → ℂ:=fun z => (χ (z 0):ℂ) have hF:Continuous F:=Complex.continuous_ofReal.comp (hχ.continuous.comp (continuous_apply 0)) obtain ⟨D,hD,hmult⟩:=exists_uniform_cutoff_multiplier F hF (half_pos hδ) let η:=δ / (2 * (D + 1)) have hη:0 < η:=by dsimp [η]; positivity obtain ⟨B,hB⟩:=exists_uniform_orbit_fourier_approximation hη let C:=B + ⌈L⌉₊ + 1 refine ⟨C, ?_⟩ intro q _ f hf hmask obtain ⟨n,hn,ks,H,hH,hHr,hdf⟩:=hB q f hf let ls:Fin (n + 1) → ZMod q:=Fin.cases 1 ks let G:=maskedModel χ H have hLip:LipschitzWith (C:ℝ≥0) G:=(maskedModel_lipschitz χ H hχ hH hχr hHr).weaken (by dsimp [C] have hceil:L ≤ (⌈L⌉₊:ℝ≥0):=Nat.le_ceil L push_cast linarith) refine ⟨n,by dsimp [C]; omega,ls,G,rfl,hLip,maskedModel_range χ H hχr hHr, ?_, ?_⟩ · intro z hz change χ (z 0) * H (fun i => z i.succ) = 0 rw [hz,zero_mul] · intro r let u:=fun x => ((f x - H (characterOrbit ks x):ℝ):ℂ) have hu:∀ x, ‖u x‖ ≤ 1:=by intro x change ‖((f x - H (characterOrbit ks x):ℝ):ℂ)‖ ≤ 1 rw [Complex.norm_real,Real.norm_eq_abs] exact abs_le.mpr ⟨by linarith [(hf x).1,(hHr (characterOrbit ks x)).2], by linarith [(hf x).2,(hHr (characterOrbit ks x)).1]⟩ have hm:=hmult q (fun _:Fin 1 => 1) u η hu hdf r have hdif:(fun x => ((f x - G (characterOrbit ls x):ℝ):ℂ)) = fun x => F (characterOrbit (fun _:Fin 1 => (1:ZMod q)) x) * u x:=by funext x have he:f x - G (characterOrbit ls x) = χ (ZMod.toCircle (-x)) * (f x - H (characterOrbit ks x)):=by simp only [G,maskedModel,characterOrbit,ls,Fin.cases_zero,Fin.cases_succ,mul_one] change f x - χ (ZMod.toCircle (-x)) * H (characterOrbit ks x) = χ (ZMod.toCircle (-x)) * (f x - H (characterOrbit ks x)) linear_combination -(hmask x) simpa only [F,characterOrbit,mul_one,u,Complex.ofReal_mul] using congrArg Complex.ofReal he rw [hdif] apply hm.trans apply mul_le_mul_of_nonneg_right _ (Nat.cast_nonneg q) have hid:η * (D + 1) = δ / 2:=by dsimp [η]; field_simp nlinarith [hη.le] end Green24Proof.CyclicMaskedRegularity private def zz2487:"s09b7"="s09b7":=by decide+kernel end section namespace Green24Proof.CyclicFrequencyPivot variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusSmoothing open Green24Proof.CyclicFrequencyElimination variable {ι:Type*} [Fintype ι] theorem permute_lipschitz (e:ι ≃ ι) : LipschitzWith 1 (fun z:ι → Circle => z ∘ e):=by apply LipschitzWith.of_dist_le_mul intro z w simp only [NNReal.coe_one,one_mul] exact (dist_pi_le_iff dist_nonneg).mpr (fun i => dist_le_pi_dist z w (e i)) theorem weightedFrequency_permute {q:ℕ} (e:ι ≃ ι) (ks:ι → ZMod q) (m:ι → ℤ) : weightedFrequency (ks ∘ e) (m ∘ e) = weightedFrequency ks m:=by exact e.sum_comp (fun i => (m i:ZMod q) * ks i) theorem natAbs_sum_permute (e:ι ≃ ι) (m:ι → ℤ) : (∑ i,(m (e i)).natAbs) = ∑ i,(m i).natAbs := e.sum_comp (fun i => (m i).natAbs) private def zz1940:"s0794"="s0794":=by decide+kernel theorem intCast_ne_zero_of_natAbs_lt {q:ℕ} {m:ℤ} (hm:m ≠ 0) (hsize:m.natAbs < q):(m:ZMod q) ≠ 0:=by intro hz have hd:=Int.natCast_dvd.mp ((ZMod.intCast_zmod_eq_zero_iff_dvd m q).mp hz) have hp:0 < m.natAbs:=Int.natAbs_pos.mpr hm exact (not_le_of_gt hsize) (Nat.le_of_dvd hp hd) variable {q n:ℕ} [NeZero q] theorem characterOrbit_permute (e:Fin n ≃ Fin n) (ks:Fin n → ZMod q) (x:ZMod q) : characterOrbit (ks ∘ e) x = characterOrbit ks x ∘ e:=rfl theorem exists_dimension_reduction [Fact q.Prime] (ks:Fin (n + 1) → ZMod q) (m:Fin (n + 1) → ℤ) (hm:m ≠ 0) (hrel:weightedFrequency ks m = 0) (hsize:(∑ i,(m i).natAbs) < q) : ∃ (ls:Fin n → ZMod q) (Φ:(Fin n → Circle) → (Fin (n + 1) → Circle)), LipschitzWith (∑ i,((m i).natAbs:ℝ≥0)) Φ ∧ ∀ x,Φ (characterOrbit ls x) = characterOrbit ks x:=by classical obtain ⟨j,hj⟩:∃ j,m j ≠ 0:=by by_contra h push Not at h exact hm (funext h) have hjbound:(m j).natAbs < q := lt_of_le_of_lt (Finset.single_le_sum (fun i _ => Nat.zero_le (m i).natAbs) (Finset.mem_univ j)) hsize have hjunit:IsUnit (m j:ZMod q) := isUnit_iff_ne_zero.mpr (intCast_ne_zero_of_natAbs_lt hj hjbound) obtain ⟨u,hu⟩:=hjunit let e:Fin (n + 1) ≃ Fin (n + 1):=Equiv.swap 0 j have he0:e 0 = j:=Equiv.swap_apply_left _ _ have hu':(u:ZMod q) = (m ∘ e) 0:=by simpa only [Function.comp_apply,he0] using hu have hrel':weightedFrequency (ks ∘ e) (m ∘ e) = 0 := (weightedFrequency_permute e ks m).trans hrel let Φ:=fun z:Fin n → Circle => monomialLift (m ∘ e) z ∘ e.symm refine ⟨reducedFrequencies u (ks ∘ e),Φ, ?_, ?_⟩ · have hb:=(permute_lipschitz e.symm).comp (monomialLift_lipschitz (m ∘ e)) have hsum:((m (e 0)).natAbs + ∑ i:Fin n,(m (e i.succ)).natAbs:ℝ≥0) = ∑ i:Fin (n + 1),((m i).natAbs:ℝ≥0):=by have hnat:(m (e 0)).natAbs + (∑ i:Fin n,(m (e i.succ)).natAbs) = ∑ i:Fin (n + 1),(m i).natAbs:=by exact (Fin.sum_univ_succ (fun i => (m (e i)).natAbs)).symm.trans (natAbs_sum_permute e m) exact_mod_cast hnat simpa only [one_mul,Function.comp_def,hsum,Φ] using hb · intro x change monomialLift (m ∘ e) (characterOrbit (reducedFrequencies u (ks ∘ e)) x) ∘ e.symm = _ rw [monomialLift_characterOrbit u (ks ∘ e) (m ∘ e) hu' hrel',characterOrbit_permute] funext i simp only [Function.comp_apply,Equiv.apply_symm_apply] end Green24Proof.CyclicFrequencyPivot private def zz2488:"s09b8"="s09b8":=by decide+kernel end section namespace Green24Proof.CyclicFrequencyMatrix variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.TorusIntegerMatrix Green24Proof.CyclicFrequencyElimination open Green24Proof.CyclicFrequencyPivot Green24Proof.CyclicTorusLaurent variable {n:ℕ} def stepMatrix (m:Fin (n + 1) → ℤ):Fin (n + 1) → Fin n → ℤ := Fin.cases (fun j => -m j.succ) (fun i j => if j = i then m 0 else 0) theorem torusMap_stepMatrix (m:Fin (n + 1) → ℤ):torusMap (stepMatrix m) = monomialLift m:=by classical funext z i refine Fin.cases (by rfl) (fun k => ?_) i change (∏ j:Fin n,z j ^ (if j = k then m 0 else 0)) = z k ^ m 0 simp only [apply_ite,zpow_zero] simp private def zz1941:"s0795"="s0795":=by decide+kernel theorem rowSize_stepMatrix_le (m:Fin (n + 1) → ℤ) (i:Fin (n + 1)) : rowSize (stepMatrix m) i ≤ ∑ j,(m j).natAbs:=by classical refine Fin.cases ?_ (fun k => ?_) i · simp only [rowSize,stepMatrix,Fin.cases_zero,Int.natAbs_neg,Fin.sum_univ_succ] omega · simp only [rowSize,stepMatrix,Fin.cases_succ,apply_ite,Int.natAbs_zero] simp only [Finset.sum_ite_eq',Finset.mem_univ,if_true] exact Finset.single_le_sum (fun j _ => Nat.zero_le (m j).natAbs) (Finset.mem_univ (0:Fin (n + 1))) theorem frequencyMap_stepMatrix {q:ℕ} (u:(ZMod q)ˣ) (ks:Fin (n + 1) → ZMod q) (m:Fin (n + 1) → ℤ) (hu:(u:ZMod q) = m 0) (hm:weightedFrequency ks m = 0) : frequencyMap (stepMatrix m) (reducedFrequencies u ks) = ks:=by classical funext i refine Fin.cases (reduced_relation u ks m hu hm) (fun k => ?_) i change (∑ j:Fin n,((if j = k then m 0 else 0:ℤ):ZMod q) * reducedFrequencies u ks j) = _ simp only [ite_mul,Int.cast_ite,Int.cast_zero,zero_mul] simp only [Finset.sum_ite_eq',Finset.mem_univ,if_true] rw [← hu] simp [reducedFrequencies, ← mul_assoc] theorem exists_matrix_reduction {q:ℕ} [NeZero q] [Fact q.Prime] (ks:Fin (n + 1) → ZMod q) (m:Fin (n + 1) → ℤ) (hm:m ≠ 0) (hrel:weightedFrequency ks m = 0) (hsize:(∑ i,(m i).natAbs) < q) : ∃ (ls:Fin n → ZMod q) (A:Fin (n + 1) → Fin n → ℤ), (∀ i,rowSize A i ≤ ∑ j,(m j).natAbs) ∧ frequencyMap A ls = ks:=by classical obtain ⟨j,hj⟩:∃ j,m j ≠ 0:=by by_contra h push Not at h exact hm (funext h) have hjbound:(m j).natAbs < q := lt_of_le_of_lt (Finset.single_le_sum (fun i _ => Nat.zero_le (m i).natAbs) (Finset.mem_univ j)) hsize obtain ⟨u,hu⟩:=isUnit_iff_ne_zero.mpr (intCast_ne_zero_of_natAbs_lt hj hjbound) let e:Fin (n + 1) ≃ Fin (n + 1):=Equiv.swap 0 j have he0:e 0 = j:=Equiv.swap_apply_left _ _ have hu':(u:ZMod q) = (m ∘ e) 0:=by simpa only [Function.comp_apply,he0] using hu have hrel':weightedFrequency (ks ∘ e) (m ∘ e) = 0 := (weightedFrequency_permute e ks m).trans hrel let A:=fun i k => stepMatrix (m ∘ e) (e.symm i) k refine ⟨reducedFrequencies u (ks ∘ e),A, ?_, ?_⟩ · intro i have h:=rowSize_stepMatrix_le (m ∘ e) (e.symm i) rw [show (∑ j,((m ∘ e) j).natAbs) = ∑ j,(m j).natAbs from natAbs_sum_permute e m] at h exact h · funext i have h:=congrFun (frequencyMap_stepMatrix u (ks ∘ e) (m ∘ e) hu' hrel') (e.symm i) simpa only [frequencyMap,A,Function.comp_apply,Equiv.apply_symm_apply] using h end Green24Proof.CyclicFrequencyMatrix private def zz2489:"s09b9"="s09b9":=by decide+kernel end section namespace Green24Proof.CyclicNonresonantFactorization variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusSmoothing open Green24Proof.CyclicFrequencyPivot variable (S:∀ n:ℕ,ℕ → Finset (Fin n → ℤ)) def relationRadius (n M:ℕ):ℕ:=max 1 ((S n M).sup (fun m => ∑ i,(m i).natAbs)) def primeThreshold:ℕ → ℕ → ℕ | 0,_ => 0 | n + 1,M => max (relationRadius S (n + 1) M) (primeThreshold n (M * relationRadius S (n + 1) M)) def finalBudget:ℕ → ℕ → ℕ | 0,M => M | n + 1,M => max M (finalBudget n (M * relationRadius S (n + 1) M)) theorem le_finalBudget (n M:ℕ):M ≤ finalBudget S n M:=by cases n with | zero => exact le_rfl | succ n => exact le_max_left _ _ private def zz1942:"s0796"="s0796":=by decide+kernel theorem relationSize_le {n M:ℕ} {m:Fin n → ℤ} (hm:m ∈ S n M) : (∑ i,(m i).natAbs) ≤ relationRadius S n M := (Finset.le_sup (f:=fun v:Fin n → ℤ => ∑ i,(v i).natAbs) hm).trans (le_max_right _ _) theorem exists_factorization (n M:ℕ) {q:ℕ} [NeZero q] [Fact q.Prime] (hq:primeThreshold S n M < q) (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ) (hH:LipschitzWith (M:ℝ≥0) H) (hr:∀ z,H z ∈ Set.Icc 0 1) : ∃ d ≤ n, ∃ B ≤ finalBudget S n M, ∃ (ls:Fin d → ZMod q) (G:(Fin d → Circle) → ℝ), LipschitzWith (B:ℝ≥0) G ∧ (∀ z,G z ∈ Set.Icc 0 1) ∧ Nonresonant ls (S d B) ∧ ∀ x,G (characterOrbit ls x) = H (characterOrbit ks x):=by classical induction n generalizing M with | zero => refine ⟨0,le_rfl,M,le_rfl,ks,H,hH,hr, ?_,fun _ => rfl⟩ intro m _ hm exact False.elim (hm (Subsingleton.elim _ _)) | succ n ih => by_cases hn:Nonresonant ks (S (n + 1) M) · exact ⟨n + 1,le_rfl,M,le_finalBudget S _ _,ks,H,hH,hr,hn,fun _ => rfl⟩ · unfold Nonresonant at hn push Not at hn obtain ⟨m,hmS,hm,hrel⟩:=hn have hrad:relationRadius S (n + 1) M < q := lt_of_le_of_lt (le_max_left _ _) hq have hsize:=(relationSize_le S hmS).trans_lt hrad obtain ⟨ls,Φ,hΦ,hsample⟩:=exists_dimension_reduction ks m hm hrel hsize have hΦ':LipschitzWith (relationRadius S (n + 1) M:ℝ≥0) Φ := hΦ.weaken (by exact_mod_cast relationSize_le S hmS) have hG:LipschitzWith ((M * relationRadius S (n + 1) M:ℕ):ℝ≥0) (H ∘ Φ):=by simpa only [Nat.cast_mul] using hH.comp hΦ' have hnext:primeThreshold S n (M * relationRadius S (n + 1) M) < q := lt_of_le_of_lt (le_max_right _ _) hq obtain ⟨d,hd,B,hB,ls',G,hGl,hGr,hGn,hGe⟩ := ih (M * relationRadius S (n + 1) M) hnext ls (H ∘ Φ) hG (fun z => hr _) refine ⟨d,hd.trans (Nat.le_succ n),B,hB.trans (le_max_right _ _),ls',G, hGl,hGr,hGn, ?_⟩ intro x rw [hGe,Function.comp_apply,hsample] end Green24Proof.CyclicNonresonantFactorization private def zz2490:"s09ba"="s09ba":=by decide+kernel end section namespace Green24Proof.CyclicMatrixFactorization variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.TorusIntegerMatrix Green24Proof.CyclicFrequencyMatrix open Green24Proof.CyclicNonresonantFactorization open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusSmoothing variable (S:∀ n:ℕ,ℕ → Finset (Fin n → ℤ)) def matrixBudget:ℕ → ℕ → ℕ | 0,_ => 1 | n + 1,M => max 1 (relationRadius S (n + 1) M * matrixBudget n (M * relationRadius S (n + 1) M)) theorem one_le_matrixBudget (n M:ℕ):1 ≤ matrixBudget S n M:=by cases n with | zero => exact le_rfl | succ n => exact le_max_left _ _ theorem exists_matrix_factorization (n M:ℕ) {q:ℕ} [NeZero q] [Fact q.Prime] (hq:primeThreshold S n M < q) (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ) (hH:LipschitzWith (M:ℝ≥0) H) : ∃ d ≤ n, ∃ B ≤ finalBudget S n M, ∃ (ls:Fin d → ZMod q) (A:Fin n → Fin d → ℤ), (∀ i,rowSize A i ≤ matrixBudget S n M) ∧ frequencyMap A ls = ks ∧ LipschitzWith (B:ℝ≥0) (H ∘ torusMap A) ∧ Nonresonant ls (S d B):=by classical induction n generalizing M with | zero => refine ⟨0,le_rfl,M,le_rfl,ks,matrixId, ?_,frequencyMap_id ks, ?_, ?_⟩ · intro i exact (rowSize_id i).le · simpa only [Function.comp_def,torusMap_id] using hH · intro m _ hm exact False.elim (hm (Subsingleton.elim _ _)) | succ n ih => by_cases hn:Nonresonant ks (S (n + 1) M) · refine ⟨n + 1,le_rfl,M,le_finalBudget S _ _,ks,matrixId, ?_,frequencyMap_id ks, ?_,hn⟩ · intro i rw [rowSize_id] exact one_le_matrixBudget S _ _ · simpa only [Function.comp_def,torusMap_id] using hH · unfold Nonresonant at hn push Not at hn obtain ⟨m,hmS,hm,hrel⟩:=hn have hrad:relationRadius S (n + 1) M < q := lt_of_le_of_lt (le_max_left _ _) hq obtain ⟨ls,A,hA,hfreq⟩:=exists_matrix_reduction ks m hm hrel ((relationSize_le S hmS).trans_lt hrad) have hAr:∀ i,rowSize A i ≤ relationRadius S (n + 1) M := fun i => (hA i).trans (relationSize_le S hmS) have hG:LipschitzWith ((M * relationRadius S (n + 1) M:ℕ):ℝ≥0) (H ∘ torusMap A):=by simpa only [Nat.cast_mul] using hH.comp (torusMap_lipschitz A hAr) have hnext:primeThreshold S n (M * relationRadius S (n + 1) M) < q := lt_of_le_of_lt (le_max_right _ _) hq obtain ⟨d,hd,B,hB,ls',D,hD,hDfreq,hGl,hGn⟩ := ih (M * relationRadius S (n + 1) M) hnext ls (H ∘ torusMap A) hG refine ⟨d,hd.trans (Nat.le_succ n),B,hB.trans (le_max_right _ _),ls',matrixComp A D, ?_, ?_, ?_,hGn⟩ · intro i exact ((rowSize_comp_le A D i hD).trans (Nat.mul_le_mul_right _ (hAr i))).trans (le_max_right _ _) · rw [frequencyMap_comp,hDfreq,hfreq] · simpa only [Function.comp_def,torusMap_comp] using hGl private def zz1943:"s0797"="s0797":=by decide+kernel theorem orbit_identity {q n d:ℕ} [NeZero q] (A:Fin n → Fin d → ℤ) (ls:Fin d → ZMod q) (ks:Fin n → ZMod q) (hfreq:frequencyMap A ls = ks) (x:ZMod q) : torusMap A (characterOrbit ls x) = characterOrbit ks x:=by have h:=torusMap_character_values A ls x rw [hfreq] at h exact h theorem support_pullback {n d:ℕ} (A:Fin n → Fin d → ℤ) (H:(Fin n → Circle) → ℝ) (i:Fin n) (W:Set Circle) (hH:∀ z,z i ∉ W → H z = 0) : ∀ z,(∏ j,z j ^ A i j) ∉ W → (H ∘ torusMap A) z = 0 := fun z hz => hH (torusMap A z) hz end Green24Proof.CyclicMatrixFactorization private def zz2491:"s09bb"="s09bb":=by decide+kernel end section namespace Green24Proof.CyclicSpatialHaarModel variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.TorusIntegerMatrix Green24Proof.CyclicMatrixFactorization open Green24Proof.CyclicNonresonantFactorization open Green24Proof.UniformTorusCountingApproximation open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusSmoothing open Green24Proof.CyclicGrowthCounting Green24Proof.CyclicTorusPairCounting open Green24Proof.CyclicTorusHaarDiscrepancy theorem exists_uniform_spatial_haar_model (n M:ℕ) {ε:ℝ} (hε:0 < ε) : ∃ C Q R:ℕ, ∀ (q:ℕ) [NeZero q] [Fact q.Prime],Q < q → ∀ (ks:Fin n → ZMod q) (H:(Fin n → Circle) → ℝ) (i:Fin n) (W:Set Circle), LipschitzWith (M:ℝ≥0) H → (∀ z,H z ∈ Set.Icc 0 1) → ks i = 1 → (∀ z,z i ∉ W → H z = 0) → ∃ d ≤ n, ∃ B ≤ C, ∃ (ls:Fin d → ZMod q) (G:(Fin d → Circle) → ℝ) (w:Fin d → ℤ), w ≠ 0 ∧ (∑ j,(w j).natAbs) ≤ R ∧ weightedFrequency ls w = 1 ∧ LipschitzWith (B:ℝ≥0) G ∧ (∀ z,G z ∈ Set.Icc 0 1) ∧ (∀ z,(∏ j,z j ^ w j) ∉ W → G z = 0) ∧ (∀ x,G (characterOrbit ls x) = H (characterOrbit ks x)) ∧ |(∑ x:ZMod q,H (characterOrbit ks x)) / q - ∫ z,G z ∂torusHaar (Fin d)| ≤ 2 * ε ∧ |weightedCount (fun x => H (characterOrbit ks x)) / (q:ℝ) ^ 2 - haarWeightedCount G| ≤ 2 * ε:=by classical choose S hS using fun d B:ℕ => exists_uniform_mass_count_discrepancy_support d (B:ℝ≥0) hε refine ⟨finalBudget S n M,primeThreshold S n M,matrixBudget S n M, ?_⟩ intro q _ _ hq ks H i W hH hr hi hsupp obtain ⟨d,hd,B,hB,ls,A,hA,hfreq,hGl,hGn⟩ := exists_matrix_factorization S n M hq ks H hH let G:=H ∘ torusMap A have hGr:∀ z,G z ∈ Set.Icc 0 1:=fun z => hr _ have he:∀ x,G (characterOrbit ls x) = H (characterOrbit ks x):=by intro x rw [show G (characterOrbit ls x) = H (torusMap A (characterOrbit ls x)) from rfl, orbit_identity A ls ks hfreq] have hwi:weightedFrequency ls (A i) = 1:=by change frequencyMap A ls i = 1 rw [hfreq,hi] have hw:A i ≠ 0:=row_ne_zero_of_frequency_ne_zero A ls i (by change weightedFrequency ls (A i) ≠ 0 rw [hwi] exact one_ne_zero) have hc:=hS d B q ls G hGl hGr hGn simp_rw [he] at hc exact ⟨d,hd,B,hB,ls,G,A i,hw,hA i,hwi,hGl,hGr, support_pullback A H i W hsupp,he,hc⟩ end Green24Proof.CyclicSpatialHaarModel private def zz2492:"s09bc"="s09bc":=by decide+kernel end section namespace Green24Proof.CyclicLocalizedHaarApproximation variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.CyclicMaskedRegularity Green24Proof.CyclicSpatialHaarModel open Green24Proof.CyclicFrequencyPivot Green24Proof.CyclicTorusSmoothing open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicGrowthCounting open Green24Proof.CyclicTorusPairCounting Green24Proof.CyclicTorusHaarDiscrepancy open Green24Proof.CyclicCharacterCounting theorem normalized_mass_count_error {q:ℕ} [NeZero q] (f g:ZMod q → ℝ) (h2:IsUnit (2:ZMod q)) (h3:IsUnit (3:ZMod q)) {δ:ℝ} (hδ:0 ≤ δ) (hf:∀ x,f x ∈ Set.Icc 0 1) (hg:∀ x,g x ∈ Set.Icc 0 1) (he:∀ r, ‖ZMod.dft (fun x => ((f x - g x:ℝ):ℂ)) r‖ ≤ δ * q) : |(∑ x,f x) / q - (∑ x,g x) / q| ≤ δ ∧ |weightedCount f / (q:ℝ)^2 - weightedCount g / (q:ℝ)^2| ≤ 3 * δ:=by have hq:(0:ℝ) < q:=Nat.cast_pos.mpr (NeZero.pos q) have hm:=he 0 rw [ZMod.dft_apply_zero, ← Complex.ofReal_sum,Complex.norm_real,Real.norm_eq_abs, Finset.sum_sub_distrib] at hm have hc:=self_count_replacement f g h2 h3 hδ hf hg he rw [← weightedCount_ofReal, ← weightedCount_ofReal, ← Complex.ofReal_sub, Complex.norm_real,Real.norm_eq_abs] at hc constructor · rw [← sub_div,abs_div,abs_of_pos hq] exact (div_le_iff₀ hq).mpr hm · rw [← sub_div,abs_div,abs_of_pos (sq_pos_of_pos hq)] exact (div_le_iff₀ (sq_pos_of_pos hq)).mpr hc private def zz1944:"s0798"="s0798":=by decide+kernel theorem exists_localized_haar_approximation (χ:Circle → ℝ) {L:ℝ≥0} (hχ:LipschitzWith L χ) (hχr:∀ z,χ z ∈ Set.Icc 0 1) (W:Set Circle) (hχW:∀ z,z ∉ W → χ z = 0) {ε:ℝ} (hε:0 < ε) : ∃ C Q R:ℕ, ∀ (q:ℕ) [NeZero q] [Fact q.Prime],Q < q → ∀ f:ZMod q → ℝ,(∀ x,f x ∈ Set.Icc 0 1) → (∀ x,χ (ZMod.toCircle (-x)) * f x = f x) → ∃ d ≤ C, ∃ (ls:Fin d → ZMod q) (G:(Fin d → Circle) → ℝ) (w:Fin d → ℤ), w ≠ 0 ∧ (∑ j,(w j).natAbs) ≤ R ∧ weightedFrequency ls w = 1 ∧ LipschitzWith (C:ℝ≥0) G ∧ (∀ z,G z ∈ Set.Icc 0 1) ∧ (∀ z,(∏ j,z j ^ w j) ∉ W → G z = 0) ∧ |(∑ x,f x) / q - ∫ z,G z ∂torusHaar (Fin d)| ≤ 3 * ε ∧ |weightedCount f / (q:ℝ)^2 - haarWeightedCount G| ≤ 5 * ε:=by classical obtain ⟨M,hM⟩:=exists_masked_approximation χ hχ hχr hε choose Cs Qs Rs hmodel using fun n:ℕ => exists_uniform_spatial_haar_model n M hε let I:=Finset.range (M + 1) let C:=max M (I.sup Cs) let Q:=max 3 (I.sup Qs) let R:=I.sup Rs refine ⟨C,Q,R, ?_⟩ intro q _ _ hq f hf hmask have h3q:3 < q:=lt_of_le_of_lt (le_max_left _ _) hq have h2:IsUnit (2:ZMod q):=isUnit_iff_ne_zero.mpr (by have h:=intCast_ne_zero_of_natAbs_lt (q:=q) (m:=2) (by norm_num) (by norm_num; omega) simpa using h) have h3:IsUnit (3:ZMod q):=isUnit_iff_ne_zero.mpr (by have h:=intCast_ne_zero_of_natAbs_lt (q:=q) (m:=3) (by norm_num) (by simpa using h3q) simpa using h) obtain ⟨n,hn,ks,H,hk,hH,hHr,hHz,hdf⟩:=hM q f hf hmask have hnI:n + 1 ∈ I:=Finset.mem_range.mpr (Nat.lt_succ_of_le hn) have hQn:Qs (n + 1) < q := lt_of_le_of_lt ((Finset.le_sup (f:=Qs) hnI).trans (le_max_right _ _)) hq obtain ⟨d,hd,B,hB,ls,G,w,hw,hwsize,hwfreq,hGl,hGr,hGs,hGe,hGm,hGc⟩ := hmodel (n + 1) q hQn ks H 0 W hH hHr hk (fun z hz => hHz z (hχW _ hz)) have hBC:B ≤ C:=hB.trans ((Finset.le_sup (f:=Cs) hnI).trans (le_max_right _ _)) have he:=normalized_mass_count_error f (fun x => H (characterOrbit ks x)) h2 h3 hε.le hf (fun x => hHr _) hdf refine ⟨d,(hd.trans hn).trans (le_max_left _ _),ls,G,w,hw, hwsize.trans (Finset.le_sup (f:=Rs) hnI),hwfreq, hGl.weaken (by exact_mod_cast hBC),hGr,hGs, ?_, ?_⟩ · have ht:=abs_sub_le ((∑ x,f x) / q) ((∑ x,H (characterOrbit ks x)) / q) (∫ z,G z ∂torusHaar (Fin d)) linarith [he.1] · have ht:=abs_sub_le (weightedCount f / (q:ℝ)^2) (weightedCount (fun x => H (characterOrbit ks x)) / (q:ℝ)^2) (haarWeightedCount G) linarith [he.2] end Green24Proof.CyclicLocalizedHaarApproximation private def zz2493:"s09bd"="s09bd":=by decide+kernel end section namespace Contribution.Green24VariantsConjecture open Finset def pairCount (A:Finset ℤ):ℕ := ((A ×ˢ A).filter (fun (x,y) ↦ x ≠ y ∧ x + 3 * (y - x) ∈ A)).card lemma bddAbove_pairCounts (n:ℕ) : BddAbove { k | ∃ A:Finset ℤ,A.card = n ∧ k = ((A ×ˢ A).filter (fun (x,y) ↦ x ≠ y ∧ x + 3 * (y - x) ∈ A)).card }:=by refine ⟨n ^ 2, ?_⟩ rintro k ⟨A,hA,rfl⟩ calc ((A ×ˢ A).filter (fun (x,y) ↦ x ≠ y ∧ x + 3 * (y - x) ∈ A)).card ≤ (A ×ˢ A).card:=Finset.card_filter_le _ _ _ = n ^ 2:=by rw [Finset.card_product,hA,sq] lemma pairCount_le_max {A:Finset ℤ} {n:ℕ} (hA:A.card = n) : pairCount A ≤ Green24.max013AffineTranslates n:=by unfold Green24.max013AffineTranslates pairCount exact le_csSup (bddAbove_pairCounts n) ⟨A,hA,rfl⟩ def interval (n:ℕ):Finset ℤ:=(Finset.range n).image (Nat.cast:ℕ → ℤ) lemma card_interval (n:ℕ):(interval n).card = n:=by rw [interval,Finset.card_image_of_injective _ Nat.cast_injective,Finset.card_range] private def zz1945:"s0799"="s0799":=by decide+kernel lemma mem_interval {n:ℕ} {z:ℤ}:z ∈ interval n ↔ 0 ≤ z ∧ z < n:=by unfold interval constructor · rintro hz obtain ⟨m,hm,rfl⟩:=Finset.mem_image.1 hz exact ⟨Int.natCast_nonneg m,by exact_mod_cast Finset.mem_range.1 hm⟩ · rintro ⟨h0,hn⟩ refine Finset.mem_image.2 ⟨z.toNat,Finset.mem_range.2 ?_,Int.toNat_of_nonneg h0⟩ have:(z.toNat:ℤ) < n:=by rw [Int.toNat_of_nonneg h0]; exact hn exact_mod_cast this lemma natCast_mem_interval {n m:ℕ} (h:m < n):(m:ℤ) ∈ interval n := Finset.mem_image.2 ⟨m,Finset.mem_range.2 h,rfl⟩ def intervalPairs (n:ℕ):Finset (ℤ × ℤ) := (interval n ×ˢ interval n).filter (fun (x,y) ↦ x ≠ y ∧ x + 3 * (y - x) ∈ interval n) lemma pairCount_interval_eq (n:ℕ):pairCount (interval n) = (intervalPairs n).card:=rfl def copyIndex (n:ℕ):Finset ((_:ℕ) × ℕ) := (Finset.range ((n - 1) / 3)).sigma fun i => Finset.range (n - 3 * (i + 1)) lemma mem_copyIndex {n:ℕ} {p:(_:ℕ) × ℕ} : p ∈ copyIndex n ↔ p.1 < (n - 1) / 3 ∧ p.2 + 3 * (p.1 + 1) < n:=by rcases p with ⟨i,x⟩ simp only [copyIndex,Finset.mem_sigma,Finset.mem_range] omega private def zz1946:"s079a"="s079a":=by decide+kernel lemma card_copyIndex (n:ℕ) : (copyIndex n).card = ∑ i ∈ Finset.range ((n - 1) / 3),(n - 3 * (i + 1)):=by simp [copyIndex,Finset.card_sigma,Finset.card_range] lemma two_mul_sum_copies (n:ℕ):∀ m:ℕ,3 * m ≤ n → 2 * (∑ i ∈ Finset.range m,(n - 3 * (i + 1))) + 3 * m * (m + 1) = 2 * m * n:=by intro m induction m with | zero => intro _; simp | succ m ih => intro h3 have ih':=ih (by omega) rw [Finset.sum_range_succ] generalize hS:∑ i ∈ Finset.range m,(n - 3 * (i + 1)) = S at ih' ⊢ zify [h3] at ih' ⊢ linear_combination ih' def upPair (p:(_:ℕ) × ℕ):ℤ × ℤ:=((p.2:ℤ),((p.2 + (p.1 + 1):ℕ):ℤ)) def downPair (p:(_:ℕ) × ℕ):ℤ × ℤ := (((p.2 + 3 * (p.1 + 1):ℕ):ℤ),((p.2 + 2 * (p.1 + 1):ℕ):ℤ)) lemma upPair_mem {n:ℕ} {p:(_:ℕ) × ℕ} (hp:p ∈ copyIndex n) : upPair p ∈ intervalPairs n:=by obtain ⟨hi,hx⟩:=mem_copyIndex.1 hp refine Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨mem_interval.2 ⟨?_, ?_⟩, mem_interval.2 ⟨?_, ?_⟩⟩, ?_,mem_interval.2 ⟨?_, ?_⟩⟩ <;> (try simp only [upPair]) <;> (try push_cast) <;> omega lemma downPair_mem {n:ℕ} {p:(_:ℕ) × ℕ} (hp:p ∈ copyIndex n) : downPair p ∈ intervalPairs n:=by obtain ⟨hi,hx⟩:=mem_copyIndex.1 hp refine Finset.mem_filter.2 ⟨Finset.mem_product.2 ⟨mem_interval.2 ⟨?_, ?_⟩, mem_interval.2 ⟨?_, ?_⟩⟩, ?_,mem_interval.2 ⟨?_, ?_⟩⟩ <;> (try simp only [downPair]) <;> (try push_cast) <;> omega private def zz1947:"s079b"="s079b":=by decide+kernel lemma upPair_injOn (n:ℕ):Set.InjOn upPair (copyIndex n:Set ((_:ℕ) × ℕ)):=by rintro ⟨i,x⟩ - ⟨j,y⟩ - h simp only [upPair,Prod.mk.injEq,Nat.cast_inj] at h obtain ⟨rfl,h2⟩:=h obtain rfl:i = j:=by omega rfl lemma downPair_injOn (n:ℕ):Set.InjOn downPair (copyIndex n:Set ((_:ℕ) × ℕ)):=by rintro ⟨i,x⟩ - ⟨j,y⟩ - h simp only [downPair,Prod.mk.injEq,Nat.cast_inj] at h obtain ⟨h1,h2⟩:=h obtain rfl:i = j:=by omega obtain rfl:x = y:=by omega rfl lemma disjoint_upPair_downPair (n:ℕ) : Disjoint ((copyIndex n).image upPair) ((copyIndex n).image downPair):=by rw [Finset.disjoint_left] rintro a ha hb obtain ⟨p, -,rfl⟩:=Finset.mem_image.1 ha obtain ⟨q, -,hq⟩:=Finset.mem_image.1 hb simp only [upPair,downPair,Prod.mk.injEq] at hq push_cast at hq omega lemma two_mul_card_copyIndex_le (n:ℕ):2 * (copyIndex n).card ≤ pairCount (interval n):=by have hsub:(copyIndex n).image upPair ∪ (copyIndex n).image downPair ⊆ intervalPairs n:=by intro a ha rcases Finset.mem_union.1 ha with h | h · obtain ⟨p,hp,rfl⟩:=Finset.mem_image.1 h exact upPair_mem hp · obtain ⟨p,hp,rfl⟩:=Finset.mem_image.1 h exact downPair_mem hp calc 2 * (copyIndex n).card = ((copyIndex n).image upPair).card + ((copyIndex n).image downPair).card:=by rw [Finset.card_image_of_injOn (upPair_injOn n), Finset.card_image_of_injOn (downPair_injOn n)] ring _ = ((copyIndex n).image upPair ∪ (copyIndex n).image downPair).card := (Finset.card_union_of_disjoint (disjoint_upPair_downPair n)).symm _ ≤ (intervalPairs n).card:=Finset.card_le_card hsub _ = pairCount (interval n):=(pairCount_interval_eq n).symm private def zz1948:"s079c"="s079c":=by decide+kernel lemma pairCount_interval_ge (n:ℕ) : n ^ 2 ≤ 3 * pairCount (interval n) + 5 * n:=by have hcard:=two_mul_card_copyIndex_le n rw [card_copyIndex] at hcard set m:=(n - 1) / 3 with hm have hmn:3 * m ≤ n:=by omega have hsum:=two_mul_sum_copies n m hmn generalize hS:∑ i ∈ Finset.range m,(n - 3 * (i + 1)) = S at hcard hsum rcases Nat.eq_zero_or_pos n with rfl | hn · positivity · have h1:3 * m + 1 ≤ n:=by omega have h2:n ≤ 3 * m + 3:=by omega zify at hcard hsum h1 h2 ⊢ nlinarith [hcard,hsum, mul_nonneg (by linarith:(0:ℤ) ≤ (n:ℤ) - 3 * m - 1) (by linarith:(0:ℤ) ≤ 3 * m + 3 - (n:ℤ))] lemma max_ge (n:ℕ) : n ^ 2 ≤ 3 * Green24.max013AffineTranslates n + 5 * n:=by have h1:=pairCount_interval_ge n have h2:=pairCount_le_max (card_interval n) omega open Filter Topology lemma ratio_le_one (n:ℕ):(Green24.max013AffineTranslates n:ℝ) / (n:ℝ) ^ 2 ≤ 1:=by rcases Nat.eq_zero_or_pos n with rfl | hn · simp · have hp:(0:ℝ) < (n:ℝ) ^ 2:=by positivity rw [div_le_one hp] exact_mod_cast Green24.variants.upper_trivial (n:=n) lemma ratio_isBoundedUnder : IsBoundedUnder (· ≤ ·) atTop (fun n:ℕ => (Green24.max013AffineTranslates n:ℝ) / (n:ℝ) ^ 2) := isBoundedUnder_of ⟨1,fun n => ratio_le_one n⟩ private def zz1949:"s079d"="s079d":=by decide+kernel theorem gamma_ge_of_eventually {c C:ℝ} (h:∀ᶠ n:ℕ in atTop, c * (n:ℝ) ^ 2 - C * n ≤ Green24.max013AffineTranslates n) : c ≤ Green24.variants.gamma:=by unfold Green24.variants.gamma have hlim:Tendsto (fun n:ℕ => c - C / (n:ℝ)) atTop (𝓝 c):=by have h0:=(tendsto_const_nhds (x:=c)).sub ((tendsto_const_nhds (x:=C)).div_atTop tendsto_natCast_atTop_atTop) simpa using h0 have hle:(fun n:ℕ => c - C / (n:ℝ)) ≤ᶠ[atTop] fun n:ℕ => (Green24.max013AffineTranslates n:ℝ) / (n:ℝ) ^ 2:=by filter_upwards [h,eventually_gt_atTop 0] with n hn hn0 have hnr:(0:ℝ) < n:=by exact_mod_cast hn0 rw [le_div_iff₀ (by positivity)] have hexp:(c - C / (n:ℝ)) * (n:ℝ) ^ 2 = c * (n:ℝ) ^ 2 - C * n:=by field_simp linarith [hexp] have hcob:IsCoboundedUnder (· ≤ ·) atTop (fun n:ℕ => c - C / (n:ℝ)):=by refine isCoboundedUnder_le_of_eventually_le atTop (x:=c - |C|) ?_ filter_upwards [eventually_ge_atTop 1] with n hn have hn1:(1:ℝ) ≤ n:=by exact_mod_cast hn have hCn:C / (n:ℝ) ≤ |C|:=by calc C / (n:ℝ) ≤ |C| / (n:ℝ):=by gcongr; exact le_abs_self C _ ≤ |C|:=div_le_self (abs_nonneg C) hn1 linarith calc c = limsup (fun n:ℕ => c - C / (n:ℝ)) atTop:=hlim.limsup_eq.symm _ ≤ limsup (fun n:ℕ => (Green24.max013AffineTranslates n:ℝ) / (n:ℝ) ^ 2) atTop := limsup_le_limsup hle hcob ratio_isBoundedUnder theorem gamma_ge_one_third : Green24.variants.gamma ≥ 1 / 3:=by rw [ge_iff_le] refine gamma_ge_of_eventually (C:=(5 / 3:ℝ)) (Filter.Eventually.of_forall fun n => ?_) have h:(n:ℝ) ^ 2 ≤ 3 * (Green24.max013AffineTranslates n:ℝ) + 5 * (n:ℝ):=by exact_mod_cast max_ge n linarith lemma ratio_nonneg (n:ℕ):0 ≤ (Green24.max013AffineTranslates n:ℝ) / (n:ℝ) ^ 2:=by positivity theorem gamma_le_of_eventually {c C:ℝ} (h:∀ᶠ n:ℕ in atTop, (Green24.max013AffineTranslates n:ℝ) ≤ c * (n:ℝ) ^ 2 + C * n) : Green24.variants.gamma ≤ c:=by unfold Green24.variants.gamma have hlim:Tendsto (fun n:ℕ => c + C / (n:ℝ)) atTop (𝓝 c):=by have h0:=(tendsto_const_nhds (x:=c)).add ((tendsto_const_nhds (x:=C)).div_atTop tendsto_natCast_atTop_atTop) simpa using h0 have hle:(fun n:ℕ => (Green24.max013AffineTranslates n:ℝ) / (n:ℝ) ^ 2) ≤ᶠ[atTop] fun n:ℕ => c + C / (n:ℝ):=by filter_upwards [h,eventually_gt_atTop 0] with n hn hn0 have hnr:(0:ℝ) < n:=by exact_mod_cast hn0 rw [div_le_iff₀ (by positivity)] have hexp:(c + C / (n:ℝ)) * (n:ℝ) ^ 2 = c * (n:ℝ) ^ 2 + C * n:=by field_simp linarith [hexp] have hcob:IsCoboundedUnder (· ≤ ·) atTop (fun n:ℕ => (Green24.max013AffineTranslates n:ℝ) / (n:ℝ) ^ 2) := isCoboundedUnder_le_of_le atTop fun n => ratio_nonneg n have hbdd:IsBoundedUnder (· ≤ ·) atTop (fun n:ℕ => c + C / (n:ℝ)):=by refine ⟨c + |C|, ?_⟩ rw [eventually_map] filter_upwards [eventually_ge_atTop 1] with n hn have hn1:(1:ℝ) ≤ n:=by exact_mod_cast hn have hCn:C / (n:ℝ) ≤ |C|:=by calc C / (n:ℝ) ≤ |C| / (n:ℝ):=by gcongr; exact le_abs_self C _ ≤ |C|:=div_le_self (abs_nonneg C) hn1 linarith calc limsup (fun n:ℕ => (Green24.max013AffineTranslates n:ℝ) / (n:ℝ) ^ 2) atTop ≤ limsup (fun n:ℕ => c + C / (n:ℝ)) atTop:=limsup_le_limsup hle hcob hbdd _ = c:=hlim.limsup_eq private def zz1950:"s079e"="s079e":=by decide+kernel theorem conjecture_of_upper_bound {C:ℝ} (h:∀ᶠ n:ℕ in atTop, (Green24.max013AffineTranslates n:ℝ) ≤ (n:ℝ) ^ 2 / 3 + C * n) : Green24.variants.gamma = 1 / 3:=by refine le_antisymm (gamma_le_of_eventually (C:=C) ?_) gamma_ge_one_third filter_upwards [h] with n hn linarith [hn] end Contribution.Green24VariantsConjecture end section namespace Green24Proof open Contribution.Green24VariantsConjecture Filter def integerSolutionPairs (A:Finset ℤ):Finset (ℤ × ℤ) := (A ×ˢ A).filter (fun p => 3 * p.2 - 2 * p.1 ∈ A) def integerSolutionTriples (A:Finset ℤ):Finset (ℤ × ℤ × ℤ) := (A ×ˢ (A ×ˢ A)).filter (fun p => p.1 + 2 * p.2.1 = 3 * p.2.2) def integerSolutionCount (A:Finset ℤ):ℕ:=(integerSolutionPairs A).card theorem integerSolutionTriples_eq_image (A:Finset ℤ) : integerSolutionTriples A = (integerSolutionPairs A).image (fun p => (3 * p.2 - 2 * p.1,p.1,p.2)):=by ext ⟨x,y,z⟩ simp only [integerSolutionTriples,integerSolutionPairs,Finset.mem_filter, Finset.mem_product,Finset.mem_image,Prod.exists,Prod.mk.injEq] constructor · rintro ⟨⟨hx,hy,hz⟩,heq⟩ refine ⟨y,z,⟨⟨hy,hz⟩, ?_⟩, ?_,rfl,rfl⟩ · have h:3 * z - 2 * y = x:=by omega simpa only [h] using hx · omega · rintro ⟨a,b,⟨⟨ha,hb⟩,hc⟩,hx,rfl,rfl⟩ refine ⟨⟨?_,ha,hb⟩, ?_⟩ · simpa only [hx] using hc · omega theorem integerSolutionTriples_card (A:Finset ℤ) : (integerSolutionTriples A).card = integerSolutionCount A:=by rw [integerSolutionTriples_eq_image,Finset.card_image_of_injective] · rfl · intro p q h exact congrArg Prod.snd h theorem integerSolutionCount_eq_pairCount_add_card (A:Finset ℤ) : integerSolutionCount A = pairCount A + A.card:=by have hdiag:(integerSolutionPairs A).filter (fun p => p.1 = p.2) = A.diag:=by ext ⟨y,z⟩ simp only [integerSolutionPairs,Finset.mem_filter,Finset.mem_product,Finset.mem_diag] constructor · exact fun h => ⟨h.1.1.1,h.2⟩ · rintro ⟨hy,rfl⟩ refine ⟨⟨⟨hy,hy⟩, ?_⟩,rfl⟩ simpa only [show 3 * y - 2 * y = y by ring] using hy have hoff:((integerSolutionPairs A).filter (fun p => ¬p.1 = p.2)).card = pairCount A:=by unfold pairCount congr 1 ext ⟨y,z⟩ simp only [integerSolutionPairs,Finset.mem_filter,Finset.mem_product] rw [show y + 3 * (z - y) = 3 * z - 2 * y by ring] tauto have h:=(integerSolutionPairs A).card_filter_add_card_filter_not (fun p => p.1 = p.2) rw [hdiag,Finset.diag_card,hoff] at h unfold integerSolutionCount omega private def zz1951:"s079f"="s079f":=by decide+kernel theorem max013_attained (n:ℕ) : ∃ A:Finset ℤ,A.card = n ∧ pairCount A = Green24.max013AffineTranslates n:=by let S:Set ℕ:={k | ∃ A:Finset ℤ,A.card = n ∧ k = pairCount A} have hne:S.Nonempty:=⟨pairCount (interval n),interval n,card_interval n,rfl⟩ have hbd:BddAbove S:=bddAbove_pairCounts n have hfin:S.Finite:=Set.finite_iff_bddAbove.mpr hbd obtain ⟨A,hA,heq⟩:=hne.csSup_mem hfin exact ⟨A,hA,heq.symm⟩ theorem max013_le_of_solution_bound {n:ℕ} {B:ℝ} (h:∀ A:Finset ℤ,A.card = n → (integerSolutionCount A:ℝ) ≤ B) : (Green24.max013AffineTranslates n:ℝ) + n ≤ B:=by obtain ⟨A,hA,hmax⟩:=max013_attained n have hb:=h A hA rw [integerSolutionCount_eq_pairCount_add_card,Nat.cast_add,hmax,hA] at hb exact hb theorem gamma_le_of_solution_asymptotic {c:ℝ} (h:∀ ε:ℝ,0 < ε → ∀ᶠ n:ℕ in atTop, ∀ A:Finset ℤ,A.card = n → (integerSolutionCount A:ℝ) ≤ (c + ε) * (n:ℝ) ^ 2) : Green24.variants.gamma ≤ c:=by apply le_of_forall_pos_le_add intro ε hε apply gamma_le_of_eventually (C:=0) filter_upwards [h ε hε] with n hn have hmax:=max013_le_of_solution_bound hn have hn0:(0:ℝ) ≤ n:=Nat.cast_nonneg n linarith theorem conjecture_of_solution_asymptotic (h:∀ ε:ℝ,0 < ε → ∀ᶠ n:ℕ in atTop, ∀ A:Finset ℤ,A.card = n → (integerSolutionCount A:ℝ) ≤ (1 / 3 + ε) * (n:ℝ) ^ 2) : Green24.variants.gamma = 1 / 3 := le_antisymm (gamma_le_of_solution_asymptotic h) gamma_ge_one_third end Green24Proof end section namespace Green24Proof.IntegerCyclicEmbedding private def zz1952:"s07a0"="s07a0":=by decide+kernel theorem intCast_injOn_interval {L q:ℕ} (hq:L < q) : Set.InjOn (fun x:ℤ => (x:ZMod q)) (Set.Icc 0 (L:ℤ)):=by apply (CharP.intCast_injOn_Ico (ZMod q) q).mono intro x hx exact ⟨hx.1,lt_of_le_of_lt hx.2 (by exact_mod_cast hq)⟩ theorem equation_iff {L q:ℕ} (hq:3 * L < q) {x y z:ℤ} (hx:0 ≤ x ∧ x ≤ L) (hy:0 ≤ y ∧ y ≤ L) (hz:0 ≤ z ∧ z ≤ L) : (x:ZMod q) + 2 * (y:ZMod q) = 3 * (z:ZMod q) ↔ x + 2 * y = 3 * z:=by constructor · intro h have hcast:((x + 2 * y:ℤ):ZMod q) = ((3 * z:ℤ):ZMod q):=by push_cast exact h apply intCast_injOn_interval hq ?_ ?_ hcast · constructor <;> push_cast <;> omega · constructor <;> push_cast <;> omega · intro h have hc:=congrArg (fun t:ℤ => (t:ZMod q)) h push_cast at hc exact hc def cyclicImage (q:ℕ) (A:Finset ℤ):Finset (ZMod q) := A.image (fun x:ℤ => (x:ZMod q)) theorem intCast_injOn_set {L q:ℕ} (hq:L < q) (A:Finset ℤ) (hA:∀ x ∈ A,0 ≤ x ∧ x ≤ (L:ℤ)) : Set.InjOn (fun x:ℤ => (x:ZMod q)) (A:Set ℤ) := (intCast_injOn_interval hq).mono (fun x hx => hA x hx) theorem cyclicImage_card {L q:ℕ} (hq:L < q) (A:Finset ℤ) (hA:∀ x ∈ A,0 ≤ x ∧ x ≤ (L:ℤ)) : (cyclicImage q A).card = A.card := Finset.card_image_of_injOn (intCast_injOn_set hq A hA) def cyclicSolutionTriples {q:ℕ} (B:Finset (ZMod q)) : Finset (ZMod q × ZMod q × ZMod q) := (B ×ˢ (B ×ˢ B)).filter (fun p => p.1 + 2 * p.2.1 = 3 * p.2.2) def cyclicSolutionCount {q:ℕ} (B:Finset (ZMod q)):ℕ := (cyclicSolutionTriples B).card private def zz1953:"s07a1"="s07a1":=by decide+kernel theorem cyclicSolutionCount_eq_integerSolutionCount {L q:ℕ} (hq:3 * L < q) (A:Finset ℤ) (hA:∀ x ∈ A,0 ≤ x ∧ x ≤ (L:ℤ)) : cyclicSolutionCount (cyclicImage q A) = integerSolutionCount A:=by rw [← integerSolutionTriples_card A] symm unfold cyclicSolutionCount have hinj:=intCast_injOn_set (show L < q by omega) A hA refine Finset.card_bij (fun p _ => ((p.1:ZMod q),(p.2.1:ZMod q),(p.2.2:ZMod q))) ?_ ?_ ?_ · rintro ⟨x,y,z⟩ hp simp only [integerSolutionTriples,cyclicSolutionTriples,Finset.mem_filter, Finset.mem_product] at hp ⊢ refine ⟨⟨?_, ?_, ?_⟩, ?_⟩ · exact Finset.mem_image.mpr ⟨x,hp.1.1,rfl⟩ · exact Finset.mem_image.mpr ⟨y,hp.1.2.1,rfl⟩ · exact Finset.mem_image.mpr ⟨z,hp.1.2.2,rfl⟩ · exact (equation_iff hq (hA x hp.1.1) (hA y hp.1.2.1) (hA z hp.1.2.2)).mpr hp.2 · rintro ⟨x,y,z⟩ hp ⟨x',y',z'⟩ hp' he simp only [integerSolutionTriples,Finset.mem_filter,Finset.mem_product] at hp hp' have hx:=hinj hp.1.1 hp'.1.1 (congrArg Prod.fst he) have hy:=hinj hp.1.2.1 hp'.1.2.1 (congrArg (fun p => p.2.1) he) have hz:=hinj hp.1.2.2 hp'.1.2.2 (congrArg (fun p => p.2.2) he) exact Prod.ext hx (Prod.ext hy hz) · rintro ⟨x,y,z⟩ hp simp only [cyclicSolutionTriples,Finset.mem_filter,Finset.mem_product] at hp obtain ⟨a,ha,rfl⟩:=Finset.mem_image.mp hp.1.1 obtain ⟨b,hb,rfl⟩:=Finset.mem_image.mp hp.1.2.1 obtain ⟨c,hc,rfl⟩:=Finset.mem_image.mp hp.1.2.2 refine ⟨(a,b,c), ?_,rfl⟩ simp only [integerSolutionTriples,Finset.mem_filter,Finset.mem_product] exact ⟨⟨ha,hb,hc⟩,(equation_iff hq (hA a ha) (hA b hb) (hA c hc)).mp hp.2⟩ end Green24Proof.IntegerCyclicEmbedding private def zz2494:"s09be"="s09be":=by decide+kernel end section namespace Green24Proof.IntegerLocalizedHaarTransfer variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset open scoped BigOperators NNReal open Green24Proof.IntegerCyclicEmbedding Green24Proof.CyclicGrowthCounting open Green24Proof.CyclicTorusLaurent Green24Proof.CyclicTorusPairCounting open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.SpatialCircleCutoff open Green24Proof.CyclicLocalizedHaarApproximation variable {q:ℕ} [NeZero q] noncomputable def weight (B:Finset (ZMod q)) (x:ZMod q):ℝ:=if x ∈ B then 1 else 0 omit [NeZero q] in theorem weight_range (B:Finset (ZMod q)) (x:ZMod q):weight B x ∈ Set.Icc 0 1:=by unfold weight split_ifs <;> norm_num theorem sum_weight (B:Finset (ZMod q)):(∑ x,weight B x) = B.card:=by classical simp [weight] theorem weightedCount_weight (B:Finset (ZMod q)) : weightedCount (weight B) = cyclicSolutionCount B:=by classical have he (x y z:ZMod q):x + 2 * y = 3 * z ↔ x = 3 * z - 2 * y:=by constructor <;> intro h <;> linear_combination h have hc:(cyclicSolutionCount B:ℝ) = ∑ x ∈ B, ∑ y ∈ B, ∑ z ∈ B,if x = 3 * z - 2 * y then (1:ℝ) else 0:=by simp only [cyclicSolutionCount,cyclicSolutionTriples,Finset.card_filter, Nat.cast_sum,Nat.cast_ite,Nat.cast_one,Nat.cast_zero,Finset.sum_product,he] rw [hc,weightedCount] simp only [weight,mul_ite,mul_zero,mul_one,Finset.sum_ite_mem_eq] symm calc (∑ x ∈ B, ∑ y ∈ B, ∑ z ∈ B,if x = 3 * z - 2 * y then (1:ℝ) else 0) = ∑ y ∈ B, ∑ z ∈ B, ∑ x ∈ B,if x = 3 * z - 2 * y then (1:ℝ) else 0:=by rw [Finset.sum_comm] apply Finset.sum_congr rfl intro y _ rw [Finset.sum_comm] _ = _:=by simp private def zz1954:"s07a2"="s07a2":=by decide+kernel theorem weight_cutoff_interval {L:ℕ} (hq:32 * L ≤ q) (A:Finset ℤ) (hA:∀ x ∈ A,0 ≤ x ∧ x ≤ (L:ℤ)) : ∀ x:ZMod q,cutoff (ZMod.toCircle (-x)) * weight (cyclicImage q A) x = weight (cyclicImage q A) x:=by classical intro x by_cases hx:x ∈ cyclicImage q A · obtain ⟨a,ha,rfl⟩:=Finset.mem_image.mp hx have hb:(32:ℝ) * |(a:ℝ)| ≤ q:=by rw [abs_of_nonneg (by exact_mod_cast (hA a ha).1)] have hL:(a:ℝ) ≤ L:=by exact_mod_cast (hA a ha).2 have hp:(32:ℝ) * L ≤ q:=by exact_mod_cast hq linarith rw [cutoff_integer_plateau a hb,one_mul] · simp [weight,hx] theorem exists_integer_haar_model {ε:ℝ} (hε:0 < ε) : ∃ C Q R:ℕ, ∀ (q:ℕ) [NeZero q] [Fact q.Prime],Q < q → ∀ (L:ℕ),32 * L < q → ∀ A:Finset ℤ, (∀ x ∈ A,0 ≤ x ∧ x ≤ (L:ℤ)) → ∃ d ≤ C, ∃ (ls:Fin d → ZMod q) (G:(Fin d → Circle) → ℝ) (w:Fin d → ℤ), w ≠ 0 ∧ (∑ j,(w j).natAbs) ≤ R ∧ weightedFrequency ls w = 1 ∧ LipschitzWith (C:ℝ≥0) G ∧ (∀ z,G z ∈ Set.Icc 0 1) ∧ (∀ z,(∏ j,z j ^ w j) ∉ window → G z = 0) ∧ |(A.card:ℝ) / q - ∫ z,G z ∂torusHaar (Fin d)| ≤ 3 * ε ∧ |(Green24Proof.integerSolutionCount A:ℝ) / (q:ℝ)^2 - haarWeightedCount G| ≤ 5 * ε:=by obtain ⟨C,Q,R,hmodel⟩:=exists_localized_haar_approximation cutoff cutoff_lipschitz cutoff_range window cutoff_zero_outside hε refine ⟨C,Q,R, ?_⟩ intro q _ _ hq L hL A hA have h:=hmodel q hq (weight (cyclicImage q A)) (weight_range _) (weight_cutoff_interval hL.le A hA) rw [sum_weight,cyclicImage_card (by omega:L < q) A hA,weightedCount_weight, cyclicSolutionCount_eq_integerSolutionCount (by omega:3 * L < q) A hA] at h exact h end Green24Proof.IntegerLocalizedHaarTransfer private def zz2495:"s09bf"="s09bf":=by decide+kernel end section namespace Green24Proof.PopularSums open scoped BigOperators Pointwise theorem weighted_threshold_energy_bound {ι:Type*} (T:Finset ι) (w:ι → ℝ) (M t:ℝ) (ht:0 ≤ t) (hw:∀ i ∈ T,0 ≤ w i ∧ w i ≤ M) : (∑ i ∈ T,w i ^ 2) ≤ t * (∑ i ∈ T,w i) + M * (∑ i ∈ T.filter (fun i => t ≤ w i),w i):=by classical rw [Finset.sum_filter] calc (∑ i ∈ T,w i ^ 2) ≤ ∑ i ∈ T,(t * w i + M * (if t ≤ w i then w i else 0)):=by apply Finset.sum_le_sum intro i hi rcases hw i hi with ⟨h0,hM⟩ by_cases h:t ≤ w i · simp only [if_pos h] nlinarith [mul_nonneg (sub_nonneg.mpr hM) h0,mul_nonneg ht h0] · simp only [if_neg h,mul_zero,add_zero] have hi':w i ≤ t:=le_of_lt (lt_of_not_ge h) nlinarith [mul_nonneg (sub_nonneg.mpr hi') h0] _ = _:=by rw [Finset.sum_add_distrib,Finset.mul_sum,Finset.mul_sum] variable {G:Type*} [AddCommGroup G] [DecidableEq G] theorem sum_addConvolution (A:Finset G) : (∑ s ∈ A + A,A.addConvolution A s) = A.card ^ 2:=by change (∑ s ∈ A + A,((A ×ˢ A).filter (fun p => p.1 + p.2 = s)).card) = _ rw [Finset.sum_card_fiberwise_eq_card_filter] rw [Finset.filter_eq_self.mpr (by intro p hp exact Finset.add_mem_add (Finset.mem_product.mp hp).1 (Finset.mem_product.mp hp).2)] simp [pow_two] noncomputable def sums (A:Finset G) (η:ℝ):Finset G:=by classical exact (A + A).filter (fun s => η * (A.card:ℝ) / 2 ≤ (A.addConvolution A s:ℝ)) private def zz1955:"s07a3"="s07a3":=by decide+kernel theorem popular_sum_selection (A:Finset G) (hA:A.Nonempty) (η:ℝ) (hη:0 < η) (hE:η * (A.card:ℝ) ^ 3 ≤ (A.addEnergy A:ℝ)) : sums A η ⊆ A + A ∧ ((sums A η).card:ℝ) ≤ 2 * (A.card:ℝ) / η ∧ η * (A.card:ℝ) ^ 2 / 2 ≤ (((A ×ˢ A).filter (fun p => p.1 + p.2 ∈ sums A η)).card:ℝ) ∧ ∀ s ∈ sums A η,η * (A.card:ℝ) / 2 ≤ (A.addConvolution A s:ℝ):=by classical let N:ℝ:=A.card let r:G → ℝ:=fun s => A.addConvolution A s let S:=sums A η have hN:0 < N:=by dsimp [N] exact_mod_cast hA.card_pos have ht:0 ≤ η * N / 2:=by positivity have hS:S ⊆ A + A:=Finset.filter_subset _ _ have hpopular (s:G) (hs:s ∈ S):η * N / 2 ≤ r s := (Finset.mem_filter.mp hs).2 have hweights (s:G) (_hs:s ∈ A + A):0 ≤ r s ∧ r s ≤ N:=by constructor · positivity · dsimp [N,r] exact_mod_cast (Finset.addConvolution_le_card_left (A:=A) (B:=A) (x:=s)) have htotal:(∑ s ∈ A + A,r s) = N ^ 2:=by dsimp [N,r] exact_mod_cast sum_addConvolution A have henergy:(A.addEnergy A:ℝ) = ∑ s ∈ A + A,r s ^ 2:=by dsimp [r,Finset.addConvolution] exact_mod_cast Finset.addEnergy_eq_sum_sq' A A have hpair:(∑ s ∈ S,r s) = (((A ×ˢ A).filter (fun p => p.1 + p.2 ∈ S)).card:ℝ):=by dsimp [r,Finset.addConvolution] exact_mod_cast Finset.sum_card_fiberwise_eq_card_filter (A ×ˢ A) S (fun p:G × G => p.1 + p.2) have hmass_upper:(∑ s ∈ S,r s) ≤ N ^ 2:=by rw [← htotal] exact Finset.sum_le_sum_of_subset_of_nonneg hS (fun _ _ _ => by positivity) have hcard_mass:η * N / 2 * (S.card:ℝ) ≤ ∑ s ∈ S,r s:=by calc _ = ∑ _s ∈ S,η * N / 2:=by simp [mul_comm] _ ≤ _:=Finset.sum_le_sum hpopular have hcard:(S.card:ℝ) ≤ 2 * N / η:=by apply (le_div_iff₀ hη).2 apply (mul_le_mul_iff_right₀ hN).mp nlinarith [hcard_mass.trans hmass_upper] have hbound:(A.addEnergy A:ℝ) ≤ η * N / 2 * N ^ 2 + N * (∑ s ∈ S,r s):=by rw [henergy] simpa only [htotal,S,sums,N,r] using weighted_threshold_energy_bound (A + A) r N (η * N / 2) ht hweights have hmass_lower:η * N ^ 2 / 2 ≤ ∑ s ∈ S,r s:=by apply (mul_le_mul_iff_right₀ hN).mp have hE':η * N ^ 3 ≤ (A.addEnergy A:ℝ):=hE nlinarith [hE'.trans hbound] exact ⟨hS,hcard,by simpa only [hpair] using hmass_lower,hpopular⟩ theorem exists_popular_sums (A:Finset G) (hA:A.Nonempty) (η:ℝ) (hη:0 < η) (hE:η * (A.card:ℝ) ^ 3 ≤ (A.addEnergy A:ℝ)) : ∃ S:Finset G,S ⊆ A + A ∧ (S.card:ℝ) ≤ 2 * (A.card:ℝ) / η ∧ η * (A.card:ℝ) ^ 2 / 2 ≤ (((A ×ˢ A).filter (fun p => p.1 + p.2 ∈ S)).card:ℝ) ∧ ∀ s ∈ S,η * (A.card:ℝ) / 2 ≤ (A.addConvolution A s:ℝ) := ⟨sums A η,popular_sum_selection A hA η hη hE⟩ end Green24Proof.PopularSums private def zz2496:"s09c0"="s09c0":=by decide+kernel end section namespace Green24Proof.DenseGraphCommonNeighbors open scoped BigOperators variable {α β:Type*} def leftNeighbors (U:Finset α) (R:α → β → Prop) [DecidableRel R] (b:β):Finset α := U.filter (fun a => R a b) def commonNeighbors (V:Finset β) (R:α → β → Prop) [DecidableRel R] (a a':α):Finset β:=V.filter (fun b => R a b ∧ R a' b) noncomputable def badPairs (U:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] (t:ℝ):Finset (α × α):=by classical exact (U ×ˢ U).filter (fun p => ((commonNeighbors V R p.1 p.2).card:ℝ) < t) theorem edge_count_eq_sum_degrees (U:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] : ((U ×ˢ V).filter (fun p => R p.1 p.2)).card = ∑ b ∈ V,(leftNeighbors U R b).card:=by simp only [Finset.card_filter,Finset.sum_product,leftNeighbors] rw [Finset.sum_comm] theorem sum_badPairs_neighborhoods (U:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] (t:ℝ) : (∑ b ∈ V,(badPairs (leftNeighbors U R b) V R t).card) = ∑ p ∈ badPairs U V R t,(commonNeighbors V R p.1 p.2).card:=by classical have hfilter (b:β):badPairs (leftNeighbors U R b) V R t = (badPairs U V R t).filter (fun p => R p.1 b ∧ R p.2 b):=by ext p simp only [badPairs,leftNeighbors,Finset.mem_filter,Finset.mem_product] tauto simp_rw [hfilter,Finset.card_filter] rw [Finset.sum_comm] apply Finset.sum_congr rfl intro p hp simp only [commonNeighbors,Finset.card_filter] private def zz1956:"s07a4"="s07a4":=by decide+kernel theorem sum_badPairs_neighborhoods_le (U:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] {t:ℝ} (ht:0 ≤ t) : (∑ b ∈ V,((badPairs (leftNeighbors U R b) V R t).card:ℝ)) ≤ t * (U.card:ℝ) ^ 2:=by classical have hcount:(∑ b ∈ V,((badPairs (leftNeighbors U R b) V R t).card:ℝ)) = ∑ p ∈ badPairs U V R t,((commonNeighbors V R p.1 p.2).card:ℝ):=by exact_mod_cast sum_badPairs_neighborhoods U V R t rw [hcount] calc _ ≤ ∑ _p ∈ badPairs U V R t,t:=by apply Finset.sum_le_sum intro p hp exact (Finset.mem_filter.mp hp).2.le _ = ((badPairs U V R t).card:ℝ) * t:=by simp _ ≤ ((U ×ˢ U).card:ℝ) * t:=by gcongr exact (show badPairs U V R t ⊆ U ×ˢ U from Finset.filter_subset _ _) _ = _:=by simp [pow_two]; ring theorem exists_good_neighborhood (U:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] (hU:U.Nonempty) (hV:V.Nonempty) {a ε:ℝ} (ha:0 < a) (hε:0 < ε) (hdense:a * U.card * V.card ≤ (((U ×ˢ V).filter (fun p => R p.1 p.2)).card:ℝ)) : ∃ b ∈ V,a * U.card / 2 ≤ ((leftNeighbors U R b).card:ℝ) ∧ ((badPairs (leftNeighbors U R b) V R (ε * a ^ 2 * V.card / 4)).card:ℝ) ≤ ε * ((leftNeighbors U R b).card:ℝ) ^ 2:=by classical let N:ℝ:=U.card let M:ℝ:=V.card let c:ℝ:=ε * a * N / 2 let t:ℝ:=ε * a ^ 2 * M / 4 let d:β → ℝ:=fun b => (leftNeighbors U R b).card let bad:β → ℝ:=fun b => (badPairs (leftNeighbors U R b) V R t).card let score:β → ℝ:=fun b => c * d b - bad b have hN:0 < N:=by dsimp [N]; exact_mod_cast hU.card_pos have hM:0 < M:=by dsimp [M]; exact_mod_cast hV.card_pos have hc:0 < c:=by dsimp [c]; positivity have ht:0 ≤ t:=by dsimp [t]; positivity have hd:a * N * M ≤ ∑ b ∈ V,d b:=by rw [edge_count_eq_sum_degrees] at hdense simpa only [Nat.cast_sum] using hdense have hbad:(∑ b ∈ V,bad b) ≤ t * N ^ 2 := sum_badPairs_neighborhoods_le U V R ht have hscore:M * (c * (a * N / 2)) ≤ ∑ b ∈ V,score b:=by have hmul:=mul_le_mul_of_nonneg_left hd hc.le simp only [score,Finset.sum_sub_distrib, ← Finset.mul_sum] dsimp [c,t] at hmul hbad ⊢ nlinarith obtain ⟨b,hb,hmax⟩:=V.exists_max_image score hV have hmaxsum:(∑ w ∈ V,score w) ≤ M * score b:=by calc _ ≤ ∑ _w ∈ V,score b:=Finset.sum_le_sum (fun w hw => hmax w hw) _ = _:=by simp [M] have hscoreb:c * (a * N / 2) ≤ score b := le_of_mul_le_mul_left (hscore.trans hmaxsum) hM have hbad0:0 ≤ bad b:=Nat.cast_nonneg _ have hd0:0 ≤ d b:=Nat.cast_nonneg _ have hsize:a * N / 2 ≤ d b:=by apply le_of_mul_le_mul_left (a:=c) _ hc dsimp [score] at hscoreb linarith have hnonneg:0 ≤ c * (a * N / 2):=by positivity have hbadb:bad b ≤ c * d b:=by dsimp [score] at hscoreb; linarith have hcle:c ≤ ε * d b:=by have h:=mul_le_mul_of_nonneg_left hsize hε.le dsimp [c] nlinarith refine ⟨b,hb,hsize, ?_⟩ change bad b ≤ ε * d b ^ 2 calc _ ≤ c * d b:=hbadb _ ≤ (ε * d b) * d b:=mul_le_mul_of_nonneg_right hcle hd0 _ = _:=by ring end Green24Proof.DenseGraphCommonNeighbors private def zz2497:"s09c1"="s09c1":=by decide+kernel end section namespace Green24Proof.DenseGraphFourWalks open scoped BigOperators open Green24Proof.DenseGraphCommonNeighbors variable {α β:Type*} theorem exists_pruned_subset (S:Finset α) (Bad:α → α → Prop) [DecidableRel Bad] (hS:S.Nonempty) (hbad:(((S ×ˢ S).filter (fun p => Bad p.1 p.2)).card:ℝ) ≤ (S.card:ℝ) ^ 2 / 8) : ∃ T ⊆ S,(S.card:ℝ) / 2 ≤ (T.card:ℝ) ∧ ∀ x ∈ T,((S.filter (Bad x)).card:ℝ) ≤ (S.card:ℝ) / 4:=by classical let d:α → ℝ:=fun x => (S.filter (Bad x)).card let T:=S.filter (fun x => d x ≤ (S.card:ℝ) / 4) have hTS:T ⊆ S:=Finset.filter_subset _ _ have hsum:(∑ x ∈ S,d x) ≤ (S.card:ℝ) ^ 2 / 8:=by convert hbad using 1 simp only [d,Finset.card_filter,Finset.sum_product,Nat.cast_sum,Nat.cast_ite, Nat.cast_one,Nat.cast_zero] have hremoved:(S.card:ℝ) / 4 * ((S \ T).card:ℝ) ≤ ∑ x ∈ S,d x:=by calc _ = ∑ _x ∈ S \ T,(S.card:ℝ) / 4:=by simp [mul_comm] _ ≤ ∑ x ∈ S \ T,d x:=by apply Finset.sum_le_sum intro x hx have hxS:=(Finset.mem_sdiff.mp hx).1 have hxT:=(Finset.mem_sdiff.mp hx).2 have hd:¬ d x ≤ (S.card:ℝ) / 4:=by intro hd exact hxT (Finset.mem_filter.mpr ⟨hxS,hd⟩) exact (lt_of_not_ge hd).le _ ≤ _:=Finset.sum_le_sum_of_subset_of_nonneg Finset.sdiff_subset (fun x _ _ => Nat.cast_nonneg _) have hpos:(0:ℝ) < S.card:=by exact_mod_cast hS.card_pos have hr:((S \ T).card:ℝ) ≤ (S.card:ℝ) / 2:=by apply le_of_mul_le_mul_left (a:=(S.card:ℝ)) _ hpos nlinarith [hremoved.trans hsum] have hcards:((S \ T).card:ℝ) + (T.card:ℝ) = S.card:=by exact_mod_cast Finset.card_sdiff_add_card_eq_card hTS refine ⟨T,hTS,by linarith, ?_⟩ intro x hx exact (Finset.mem_filter.mp hx).2 def walksFour (U:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] (x y:α):Finset (α × β × β) := (U ×ˢ (V ×ˢ V)).filter (fun p => R x p.2.1 ∧ R p.1 p.2.1 ∧ R y p.2.2 ∧ R p.1 p.2.2) theorem walksFour_card (U:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] (x y:α) : (walksFour U V R x y).card = ∑ z ∈ U,(commonNeighbors V R x z).card * (commonNeighbors V R y z).card:=by simp only [walksFour,Finset.card_filter,Finset.sum_product,commonNeighbors] apply Finset.sum_congr rfl intro z hz rw [Finset.sum_mul_sum] apply Finset.sum_congr rfl intro b hb apply Finset.sum_congr rfl intro c hc by_cases h₁:R x b <;> by_cases h₂:R z b <;> by_cases h₃:R y c <;> by_cases h₄:R z c <;> simp [h₁,h₂,h₃,h₄] private def zz1957:"s07a5"="s07a5":=by decide+kernel theorem many_good_middle_vertices (S:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] (t:ℝ) (x y:α) (hx:((S.filter (fun z => ((commonNeighbors V R x z).card:ℝ) < t)).card:ℝ) ≤ (S.card:ℝ) / 4) (hy:((S.filter (fun z => ((commonNeighbors V R y z).card:ℝ) < t)).card:ℝ) ≤ (S.card:ℝ) / 4) : (S.card:ℝ) / 2 ≤ ((S.filter (fun z => t ≤ ((commonNeighbors V R x z).card:ℝ) ∧ t ≤ ((commonNeighbors V R y z).card:ℝ))).card:ℝ):=by classical let X:=S.filter (fun z => ((commonNeighbors V R x z).card:ℝ) < t) let Y:=S.filter (fun z => ((commonNeighbors V R y z).card:ℝ) < t) have hsub:X ∪ Y ⊆ S:=Finset.union_subset (Finset.filter_subset _ _) (Finset.filter_subset _ _) have heq:S.filter (fun z => t ≤ ((commonNeighbors V R x z).card:ℝ) ∧ t ≤ ((commonNeighbors V R y z).card:ℝ)) = S \ (X ∪ Y):=by ext z simp only [X,Y,Finset.mem_filter,Finset.mem_sdiff,Finset.mem_union, ← not_lt] tauto rw [heq] have hcard:((S \ (X ∪ Y)).card:ℝ) + ((X ∪ Y).card:ℝ) = S.card:=by exact_mod_cast Finset.card_sdiff_add_card_eq_card hsub have hu:((X ∪ Y).card:ℝ) ≤ (X.card:ℝ) + Y.card:=by exact_mod_cast Finset.card_union_le X Y change (X.card:ℝ) ≤ (S.card:ℝ) / 4 at hx change (Y.card:ℝ) ≤ (S.card:ℝ) / 4 at hy linarith theorem walksFour_card_lower (U S:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] (hSU:S ⊆ U) {t:ℝ} (ht:0 ≤ t) (x y:α) (hx:((S.filter (fun z => ((commonNeighbors V R x z).card:ℝ) < t)).card:ℝ) ≤ (S.card:ℝ) / 4) (hy:((S.filter (fun z => ((commonNeighbors V R y z).card:ℝ) < t)).card:ℝ) ≤ (S.card:ℝ) / 4) : (S.card:ℝ) / 2 * t ^ 2 ≤ (walksFour U V R x y).card:=by classical let Z:=S.filter (fun z => t ≤ ((commonNeighbors V R x z).card:ℝ) ∧ t ≤ ((commonNeighbors V R y z).card:ℝ)) have hZ:=many_good_middle_vertices S V R t x y hx hy have hZU:Z ⊆ U:=(Finset.filter_subset _ _).trans hSU calc _ ≤ (Z.card:ℝ) * t ^ 2:=mul_le_mul_of_nonneg_right hZ (sq_nonneg _) _ = ∑ _z ∈ Z,t ^ 2:=by simp _ ≤ ∑ z ∈ Z,((commonNeighbors V R x z).card:ℝ) * (commonNeighbors V R y z).card:=by apply Finset.sum_le_sum intro z hz have hgood:=(Finset.mem_filter.mp hz).2 simpa only [pow_two] using mul_le_mul hgood.1 hgood.2 ht (Nat.cast_nonneg _) _ ≤ ∑ z ∈ U,((commonNeighbors V R x z).card:ℝ) * (commonNeighbors V R y z).card := Finset.sum_le_sum_of_subset_of_nonneg hZU (fun z _ _ => by positivity) _ = _:=by rw [walksFour_card]; push_cast; rfl theorem exists_many_four_walks (U:Finset α) (V:Finset β) (R:α → β → Prop) [DecidableRel R] (hU:U.Nonempty) (hV:V.Nonempty) {a:ℝ} (ha:0 < a) (hdense:a * U.card * V.card ≤ (((U ×ˢ V).filter (fun p => R p.1 p.2)).card:ℝ)) : ∃ T ⊆ U,a * U.card / 4 ≤ (T.card:ℝ) ∧ ∀ x ∈ T, ∀ y ∈ T, a ^ 5 * U.card * (V.card:ℝ) ^ 2 / 0x1000 ≤ (walksFour U V R x y).card:=by classical obtain ⟨b,_,hsize,hbad⟩:=exists_good_neighborhood U V R hU hV ha (by norm_num:(0:ℝ) < 1 / 8) hdense let S:=leftNeighbors U R b let t:ℝ:=(1 / 8) * a ^ 2 * V.card / 4 have hS:S.Nonempty:=by apply Finset.card_pos.mp have hUpos:(0:ℝ) < U.card:=by exact_mod_cast hU.card_pos have hpos:(0:ℝ) < S.card:=lt_of_lt_of_le (by positivity) hsize exact_mod_cast hpos obtain ⟨T,hTS,hTsize,hTgood⟩:=exists_pruned_subset S (fun x z => ((commonNeighbors V R x z).card:ℝ) < t) hS (by simpa only [badPairs,S,t,one_div_mul_eq_div] using hbad) refine ⟨T,hTS.trans (Finset.filter_subset _ _),by linarith, ?_⟩ intro x hx y hy have hpaths:=walksFour_card_lower U S V R (Finset.filter_subset _ _) (by dsimp [t]; positivity) x y (hTgood x hx) (hTgood y hy) calc _ = (a * U.card / 2) / 2 * t ^ 2:=by dsimp [t]; ring _ ≤ (S.card:ℝ) / 2 * t ^ 2:=by gcongr _ ≤ _:=hpaths end Green24Proof.DenseGraphFourWalks private def zz2498:"s09c2"="s09c2":=by decide+kernel end section namespace Green24Proof.RestrictedSumDifferenceBound open scoped BigOperators Pointwise open Green24Proof.DenseGraphFourWalks variable {G:Type*} [AddCommGroup G] [DecidableEq G] def quadruples (S:Finset G):Finset (G × G × G × G):=S ×ˢ (S ×ˢ (S ×ˢ S)) def alternatingSum (p:G × G × G × G):G:=p.1 - p.2.1 + p.2.2.1 - p.2.2.2 def representations (S:Finset G) (d:G):Finset (G × G × G × G) := (quadruples S).filter (fun p => alternatingSum p = d) theorem walks_card_le_representations (U V S:Finset G) (x y:G) : (walksFour U V (fun a b => a + b ∈ S) x y).card ≤ (representations S (x - y)).card:=by refine Finset.card_le_card_of_injOn (fun p:G × G × G => (x + p.2.1,p.1 + p.2.1,p.1 + p.2.2,y + p.2.2)) ?_ ?_ · rintro ⟨z,b,c⟩ hp change (z,b,c) ∈ walksFour U V (fun a b => a + b ∈ S) x y at hp change (x + b,z + b,z + c,y + c) ∈ representations S (x - y) simp only [walksFour,Finset.mem_filter,Finset.mem_product] at hp apply Finset.mem_filter.mpr constructor · exact Finset.mem_product.mpr ⟨hp.2.1,Finset.mem_product.mpr ⟨hp.2.2.1,Finset.mem_product.mpr ⟨hp.2.2.2.2,hp.2.2.2.1⟩⟩⟩ · change (x + b) - (z + b) + (z + c) - (y + c) = x - y abel · rintro ⟨z,b,c⟩ _ ⟨z',b',c'⟩ _ heq simp only [Prod.mk.injEq] at heq have hb:b = b':=add_left_cancel heq.1 have hz:z = z':=add_right_cancel (hb ▸ heq.2.1) have hc:c = c':=add_left_cancel (hz ▸ heq.2.2.1) exact Prod.ext hz (Prod.ext hb hc) private def zz1958:"s07a6"="s07a6":=by decide+kernel theorem sum_representations_le (S D:Finset G) : (∑ d ∈ D,(representations S d).card) ≤ S.card ^ 4:=by unfold representations rw [Finset.sum_card_fiberwise_eq_card_filter] calc _ ≤ (quadruples S).card:=Finset.card_filter_le _ _ _ = _:=by simp [quadruples]; ring theorem difference_card_mul_le (U V S T:Finset G) (P:ℝ) (hwalks:∀ x ∈ T, ∀ y ∈ T, P ≤ ((walksFour U V (fun a b => a + b ∈ S) x y).card:ℝ)) : ((T - T).card:ℝ) * P ≤ (S.card:ℝ) ^ 4:=by have hfiber:∀ d ∈ T - T,P ≤ ((representations S d).card:ℝ):=by intro d hd obtain ⟨x,hx,y,hy,rfl⟩:=Finset.mem_sub.mp hd exact (hwalks x hx y hy).trans (by exact_mod_cast walks_card_le_representations U V S x y) calc _ = ∑ _d ∈ T - T,P:=by simp _ ≤ ∑ d ∈ T - T,((representations S d).card:ℝ):=Finset.sum_le_sum hfiber _ ≤ _:=by exact_mod_cast sum_representations_le S (T - T) theorem exists_subset_small_difference (U V S:Finset G) (hU:U.Nonempty) (hV:V.Nonempty) {a:ℝ} (ha:0 < a) (hdense:a * U.card * V.card ≤ (((U ×ˢ V).filter (fun p => p.1 + p.2 ∈ S)).card:ℝ)) : ∃ T ⊆ U,a * U.card / 4 ≤ (T.card:ℝ) ∧ ((T - T).card:ℝ) * (a ^ 5 * U.card * (V.card:ℝ) ^ 2 / 0x1000) ≤ (S.card:ℝ) ^ 4:=by obtain ⟨T,hTU,hTcard,hwalks⟩ := exists_many_four_walks U V (fun a b => a + b ∈ S) hU hV ha hdense exact ⟨T,hTU,hTcard,difference_card_mul_le U V S T _ hwalks⟩ end Green24Proof.RestrictedSumDifferenceBound private def zz2499:"s09c3"="s09c3":=by decide+kernel end section namespace Green24Proof.SelfEnergyBSG open scoped Pointwise variable {G:Type*} [AddCommGroup G] [DecidableEq G] theorem exists_large_subset_difference_bound (A:Finset G) (hA:A.Nonempty) {η:ℝ} (hη:0 < η) (hE:η * (A.card:ℝ) ^ 3 ≤ (A.addEnergy A:ℝ)) : ∃ T ⊆ A,η * A.card / 8 ≤ (T.card:ℝ) ∧ ((T - T).card:ℝ) ≤ 0x200000 * A.card / η ^ 9:=by obtain ⟨S,_hSA,hScard,hdense,_hpopular⟩ := Green24Proof.PopularSums.exists_popular_sums A hA η hη hE have hdense':(η / 2) * A.card * A.card ≤ (((A ×ˢ A).filter (fun p => p.1 + p.2 ∈ S)).card:ℝ):=by convert hdense using 1 ring obtain ⟨T,hTA,hTcard,hTdiff⟩ := Green24Proof.RestrictedSumDifferenceBound.exists_subset_small_difference A A S hA hA (by positivity:0 < η / 2) hdense' have hN:(0:ℝ) < A.card:=by exact_mod_cast hA.card_pos have hp:0 < (η / 2) ^ 5 * A.card * (A.card:ℝ) ^ 2 / 0x1000:=by positivity have hS4:(S.card:ℝ) ^ 4 ≤ (2 * A.card / η) ^ 4:=by gcongr refine ⟨T,hTA, ?_, ?_⟩ · convert hTcard using 1 ring · calc ((T - T).card:ℝ) ≤ (2 * A.card / η) ^ 4 / ((η / 2) ^ 5 * A.card * (A.card:ℝ) ^ 2 / 0x1000) := (le_div_iff₀ hp).2 (hTdiff.trans hS4) _ = 0x200000 * A.card / η ^ 9:=by field_simp ring private def zz1959:"s07a7"="s07a7":=by decide+kernel theorem exists_large_subset_small_difference (A:Finset G) (hA:A.Nonempty) {η:ℝ} (hη:0 < η) (hE:η * (A.card:ℝ) ^ 3 ≤ (A.addEnergy A:ℝ)) : ∃ T ⊆ A,T.Nonempty ∧ η * A.card / 8 ≤ (T.card:ℝ) ∧ ((T - T).card:ℝ) ≤ (0x1000000 / η ^ 10) * T.card:=by obtain ⟨T,hTA,hTcard,hTdiff⟩ := exists_large_subset_difference_bound A hA hη hE have hN:(0:ℝ) < A.card:=by exact_mod_cast hA.card_pos have hTpos:(0:ℝ) < T.card:=lt_of_lt_of_le (by positivity) hTcard have hT:T.Nonempty:=Finset.card_pos.mp (by exact_mod_cast hTpos) have hNbound:(A.card:ℝ) ≤ 8 * T.card / η:=by apply (le_div_iff₀ hη).2 linarith refine ⟨T,hTA,hT,hTcard,hTdiff.trans ?_⟩ calc 0x200000 * A.card / η ^ 9 ≤ 0x200000 * (8 * T.card / η) / η ^ 9:=by gcongr _ = (0x1000000 / η ^ 10) * T.card:=by field_simp ring theorem exists_uniform_constants {η:ℝ} (hη:0 < η) : ∃ c K:ℝ,0 < c ∧ 0 < K ∧ ∀ A:Finset G,A.Nonempty → η * (A.card:ℝ) ^ 3 ≤ (A.addEnergy A:ℝ) → ∃ T ⊆ A,T.Nonempty ∧ c * A.card ≤ (T.card:ℝ) ∧ ((T - T).card:ℝ) ≤ K * T.card:=by refine ⟨η / 8,0x1000000 / η ^ 10,by positivity,by positivity, ?_⟩ intro A hA hE obtain ⟨T,hTA,hT,hTcard,hTdiff⟩ := exists_large_subset_small_difference A hA hη hE refine ⟨T,hTA,hT, ?_,hTdiff⟩ convert hTcard using 1 ring end Green24Proof.SelfEnergyBSG private def zz2500:"s09c4"="s09c4":=by decide+kernel end section namespace Green24Proof.FiniteEnergyPeeling open scoped BigOperators Pointwise section Finite variable {α:Type*} [DecidableEq α] theorem exists_disjoint_peeling (A:Finset α) (Bad Good:Finset α → Prop) (μ:ℝ) (hextract:∀ Q ⊆ A,Bad Q → ∃ B ⊆ Q,B.Nonempty ∧ μ ≤ (B.card:ℝ) ∧ Good B) : ∃ (P:List (Finset α)) (R:Finset α), R ⊆ A ∧ ¬ Bad R ∧ (∀ B ∈ P,B ⊆ A ∧ B.Nonempty ∧ μ ≤ (B.card:ℝ) ∧ Good B) ∧ P.Pairwise Disjoint ∧ (∀ B ∈ P,Disjoint B R) ∧ P.foldr (fun B C => B ∪ C) R = A ∧ (P.map Finset.card).sum + R.card = A.card:=by classical have aux (Q:Finset α):Q ⊆ A → ∃ (P:List (Finset α)) (R:Finset α), R ⊆ Q ∧ ¬ Bad R ∧ (∀ B ∈ P,B ⊆ Q ∧ B.Nonempty ∧ μ ≤ (B.card:ℝ) ∧ Good B) ∧ P.Pairwise Disjoint ∧ (∀ B ∈ P,Disjoint B R) ∧ P.foldr (fun B C => B ∪ C) R = Q ∧ (P.map Finset.card).sum + R.card = Q.card:=by refine Finset.strongInductionOn Q ?_ intro Q ih hQA by_cases hbad:Bad Q · obtain ⟨B,hBQ,hB,hμB,hgoodB⟩:=hextract Q hQA hbad have hproper:Q \ B ⊂ Q:=by refine Finset.ssubset_iff_subset_ne.mpr ⟨Finset.sdiff_subset, ?_⟩ intro heq obtain ⟨b,hb⟩:=hB have hmem:b ∈ Q \ B:=heq.symm ▸ hBQ hb exact (Finset.mem_sdiff.mp hmem).2 hb obtain ⟨P,R,hRQ,hnot,hpieces,hpair,hdisj,hcover,hmass⟩ := ih (Q \ B) hproper (Finset.sdiff_subset.trans hQA) have hBdisj (C:Finset α) (hC:C ⊆ Q \ B):Disjoint B C:=by apply Finset.disjoint_left.mpr intro x hxB hxC exact (Finset.mem_sdiff.mp (hC hxC)).2 hxB refine ⟨B :: P,R,hRQ.trans Finset.sdiff_subset,hnot, ?_, ?_, ?_, ?_, ?_⟩ · intro C hC rcases List.mem_cons.mp hC with rfl | hC · exact ⟨hBQ,hB,hμB,hgoodB⟩ · obtain ⟨hCQ,hCne,hμC,hgoodC⟩:=hpieces C hC exact ⟨hCQ.trans Finset.sdiff_subset,hCne,hμC,hgoodC⟩ · exact List.pairwise_cons.mpr ⟨fun C hC => hBdisj C (hpieces C hC).1,hpair⟩ · intro C hC rcases List.mem_cons.mp hC with rfl | hC · exact hBdisj R hRQ · exact hdisj C hC · change B ∪ P.foldr (fun B C => B ∪ C) R = Q rw [hcover] exact Finset.union_sdiff_of_subset hBQ · simp only [List.map_cons,List.sum_cons] have hcard:=Finset.card_sdiff_add_card_eq_card hBQ omega · exact ⟨[],Q,Finset.Subset.refl Q,hbad,by simp,by simp, by simp,rfl,by simp⟩ exact aux A (Finset.Subset.refl A) omit [DecidableEq α] in theorem length_mul_le_card_sum (P:List (Finset α)) (μ:ℝ) (hμ:∀ B ∈ P,μ ≤ (B.card:ℝ)) : (P.length:ℝ) * μ ≤ ((P.map Finset.card).sum:ℝ):=by induction P with | nil => simp | cons B P ih => have hB:=hμ B (by simp) have hP:=ih (fun C hC => hμ C (by simp [hC])) simp only [List.length_cons,Nat.cast_add,Nat.cast_one,List.map_cons,List.sum_cons] nlinarith end Finite variable {G:Type*} [AddCommGroup G] [DecidableEq G] private def zz1960:"s07a8"="s07a8":=by decide+kernel theorem self_energy_le_card_cube (A:Finset G) : (A.addEnergy A:ℝ) ≤ (A.card:ℝ) ^ 3:=by have henergy:(A.addEnergy A:ℝ) = ∑ s ∈ A + A,(A.addConvolution A s:ℝ) ^ 2:=by dsimp [Finset.addConvolution] exact_mod_cast Finset.addEnergy_eq_sum_sq' A A rw [henergy] calc _ ≤ ∑ s ∈ A + A,(A.card:ℝ) * A.addConvolution A s:=by apply Finset.sum_le_sum intro s _hs have h:(A.addConvolution A s:ℝ) ≤ A.card:=by exact_mod_cast (Finset.addConvolution_le_card_left (A:=A) (B:=A) (x:=s)) nlinarith [mul_nonneg (sub_nonneg.mpr h) (show (0:ℝ) ≤ A.addConvolution A s by positivity)] _ = (A.card:ℝ) ^ 3:=by rw [← Finset.mul_sum] have hsum:(∑ s ∈ A + A,(A.addConvolution A s:ℝ)) = (A.card:ℝ) ^ 2:=by exact_mod_cast Green24Proof.PopularSums.sum_addConvolution A rw [hsum] ring theorem exists_energy_partition (A:Finset G) (hA:A.Nonempty) {δ:ℝ} (hδ:0 < δ) : ∃ (P:List (Finset G)) (R:Finset G), R ⊆ A ∧ (R.addEnergy R:ℝ) < δ * (A.card:ℝ) ^ 3 ∧ (∀ B ∈ P,B ⊆ A ∧ B.Nonempty ∧ δ ^ 2 * A.card / 8 ≤ (B.card:ℝ) ∧ ((B - B).card:ℝ) ≤ (0x1000000 / δ ^ 10) * B.card) ∧ P.Pairwise Disjoint ∧ (∀ B ∈ P,Disjoint B R) ∧ P.foldr (fun B C => B ∪ C) R = A ∧ (P.length:ℝ) ≤ 8 / δ ^ 2:=by have hN:(0:ℝ) < A.card:=by exact_mod_cast hA.card_pos let Bad:Finset G → Prop:=fun Q => δ * (A.card:ℝ) ^ 3 ≤ (Q.addEnergy Q:ℝ) let Good:Finset G → Prop:=fun B => ((B - B).card:ℝ) ≤ (0x1000000 / δ ^ 10) * B.card let μ:ℝ:=δ ^ 2 * A.card / 8 have hextract:∀ Q ⊆ A,Bad Q → ∃ B ⊆ Q,B.Nonempty ∧ μ ≤ (B.card:ℝ) ∧ Good B:=by intro Q hQA hbad have hQcard:(Q.card:ℝ) ≤ A.card:=by exact_mod_cast Finset.card_le_card hQA have hQupper:(Q.addEnergy Q:ℝ) ≤ (Q.card:ℝ) * (A.card:ℝ) ^ 2:=by calc _ ≤ (Q.card:ℝ) ^ 3:=self_energy_le_card_cube Q _ = (Q.card:ℝ) * (Q.card:ℝ) ^ 2:=by ring _ ≤ _:=by gcongr have hQlower:δ * A.card ≤ (Q.card:ℝ):=by apply (mul_le_mul_iff_right₀ (sq_pos_of_pos hN)).mp calc (A.card:ℝ) ^ 2 * (δ * A.card) = δ * (A.card:ℝ) ^ 3:=by ring _ ≤ (Q.card:ℝ) * (A.card:ℝ) ^ 2:=hbad.trans hQupper _ = (A.card:ℝ) ^ 2 * Q.card:=by ring have hQpos:(0:ℝ) < Q.card:=lt_of_lt_of_le (by positivity) hQlower have hQ:Q.Nonempty:=Finset.card_pos.mp (by exact_mod_cast hQpos) have hrelative:δ * (Q.card:ℝ) ^ 3 ≤ (Q.addEnergy Q:ℝ):=by calc _ ≤ δ * (A.card:ℝ) ^ 3:=by gcongr _ ≤ _:=hbad obtain ⟨B,hBQ,hB,hBsize,hBdiff⟩ := Green24Proof.SelfEnergyBSG.exists_large_subset_small_difference Q hQ hδ hrelative refine ⟨B,hBQ,hB, ?_,hBdiff⟩ calc μ = δ * (δ * A.card) / 8:=by dsimp [μ]; ring _ ≤ δ * Q.card / 8:=by gcongr _ ≤ _:=hBsize obtain ⟨P,R,hRA,hnot,hpieces,hpair,hdisj,hcover,hmass⟩ := exists_disjoint_peeling A Bad Good μ hextract refine ⟨P,R,hRA,lt_of_not_ge hnot,hpieces,hpair,hdisj,hcover, ?_⟩ have hmass_bound:((P.map Finset.card).sum:ℝ) ≤ A.card:=by exact_mod_cast (show (P.map Finset.card).sum ≤ A.card by omega) have hlength:=(length_mul_le_card_sum P μ (fun B hB => (hpieces B hB).2.2.1)).trans hmass_bound apply (le_div_iff₀ (sq_pos_of_pos hδ)).2 apply (mul_le_mul_iff_right₀ hN).mp dsimp [μ] at hlength nlinarith end Green24Proof.FiniteEnergyPeeling private def zz2501:"s09c5"="s09c5":=by decide+kernel end section namespace Green24Proof.EnergyOverlapMerge open scoped BigOperators Pointwise variable {G:Type*} [AddCommGroup G] [DecidableEq G] def differenceFiber (A B:Finset G) (x:G):Finset (G × G) := (A ×ˢ B).filter (fun p => p.1 - p.2 = x) theorem energy_eq_difference_count (A B:Finset G) : Finset.addEnergy A B = (((A ×ˢ B) ×ˢ (A ×ˢ B)).filter (fun p => p.1.1 - p.1.2 = p.2.1 - p.2.2)).card:=by unfold Finset.addEnergy refine Finset.card_bij (fun p _ => ((p.1.1,p.2.2),(p.1.2,p.2.1))) ?_ ?_ ?_ · rintro ⟨⟨a,c⟩,b,d⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp ⊢ exact ⟨⟨⟨hp.1.1.1,hp.1.2.2⟩,hp.1.1.2,hp.1.2.1⟩, sub_eq_sub_iff_add_eq_add.mpr hp.2⟩ · rintro ⟨⟨a,c⟩,b,d⟩ _ ⟨⟨a',c'⟩,b',d'⟩ _ heq simp only [Prod.mk.injEq] at heq ⊢ exact ⟨⟨heq.1.1,heq.2.1⟩,heq.2.2,heq.1.2⟩ · rintro ⟨⟨a,d⟩,c,b⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp refine ⟨((a,c),b,d), ?_,rfl⟩ simp only [Finset.mem_filter,Finset.mem_product] exact ⟨⟨⟨hp.1.1.1,hp.1.2.1⟩,hp.1.2.2,hp.1.1.2⟩, sub_eq_sub_iff_add_eq_add.mp hp.2⟩ theorem energy_eq_sum_differenceFiber (A B:Finset G) : Finset.addEnergy A B = ∑ p ∈ A ×ˢ B,(differenceFiber A B (p.1 - p.2)).card:=by rw [energy_eq_difference_count] simp only [Finset.card_filter,Finset.sum_product,differenceFiber] simp only [eq_comm] private def zz1961:"s07a9"="s07a9":=by decide+kernel theorem differenceFiber_card (A B:Finset G) (x:G) : (differenceFiber A B x).card = (A ∩ (B + {x})).card:=by refine Finset.card_bij (fun p _ => p.1) ?_ ?_ ?_ · rintro ⟨a,b⟩ hp simp only [differenceFiber,Finset.mem_filter,Finset.mem_product] at hp obtain ⟨⟨ha,hb⟩,hab⟩:=hp refine Finset.mem_inter.mpr ⟨ha,Finset.mem_add.mpr ⟨b,hb,x,by simp, ?_⟩⟩ dsimp at hab ⊢ rw [← hab] abel · rintro ⟨a,b⟩ hp ⟨a',b'⟩ hp' heq obtain ⟨_,hab⟩:=Finset.mem_filter.mp hp obtain ⟨_,hab'⟩:=Finset.mem_filter.mp hp' dsimp at hab hab' heq have hb:b = b':=sub_right_inj.mp (heq ▸ hab.trans hab'.symm) exact Prod.ext heq hb · intro a ha obtain ⟨haA,haB⟩:=Finset.mem_inter.mp ha obtain ⟨b,hb,y,hy,hby⟩:=Finset.mem_add.mp haB have hyx:y = x:=Finset.mem_singleton.mp hy subst y refine ⟨(a,b),Finset.mem_filter.mpr ⟨Finset.mem_product.mpr ⟨haA,hb⟩, ?_⟩,rfl⟩ dsimp rw [← hby] abel theorem exists_large_overlap (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) : ∃ x:G,Finset.addEnergy A B ≤ A.card * B.card * (A ∩ (B + {x})).card:=by obtain ⟨x,hx,hmax⟩:=(A - B).exists_max_image (fun y => (differenceFiber A B y).card) (hA.sub hB) refine ⟨x, ?_⟩ rw [energy_eq_sum_differenceFiber, ← differenceFiber_card] calc _ ≤ ∑ _p ∈ A ×ˢ B,(differenceFiber A B x).card:=by apply Finset.sum_le_sum intro p hp exact hmax _ (Finset.sub_mem_sub (Finset.mem_product.mp hp).1 (Finset.mem_product.mp hp).2) _ = _:=by simp theorem sub_translate_right (A B:Finset G) (x:G) : A - (B + {x}) = (A - B).image (fun y => y - x):=by ext y constructor · intro hy obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_sub.mp hy obtain ⟨c,hc,z,hz,rfl⟩:=Finset.mem_add.mp hb have hzx:z = x:=Finset.mem_singleton.mp hz subst z exact Finset.mem_image.mpr ⟨a - c,Finset.sub_mem_sub ha hc,by abel⟩ · intro hy obtain ⟨z,hz,rfl⟩:=Finset.mem_image.mp hy obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_sub.mp hz exact Finset.mem_sub.mpr ⟨a,ha,b + x,Finset.add_mem_add hb (by simp),by abel⟩ theorem cross_difference_mul_energy_le (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) : (A - B).card * Finset.addEnergy A B ≤ (A - A).card * (B - B).card * (A.card * B.card):=by obtain ⟨x,hx⟩:=exists_large_overlap A B hA hB let S:=A ∩ (B + {x}) have htriangle:=Finset.ruzsa_triangle_inequality_sub_sub_sub A S B have hAS:(A - S).card ≤ (A - A).card := Finset.card_le_card (Finset.sub_subset_sub (fun _ h => h) Finset.inter_subset_left) have hBS:(B - S).card ≤ (B - B).card:=by have hsub:(B - S).card ≤ (B - (B + {x})).card := Finset.card_le_card (Finset.sub_subset_sub (fun _ h => h) Finset.inter_subset_right) rw [sub_translate_right,Finset.card_image_of_injective _ (fun a b h => sub_left_inj.mp h)] at hsub exact hsub have htriangle':(A - B).card * S.card ≤ (A - A).card * (B - B).card := htriangle.trans (Nat.mul_le_mul hAS hBS) calc _ ≤ (A - B).card * (A.card * B.card * S.card):=Nat.mul_le_mul_left _ hx _ = ((A - B).card * S.card) * (A.card * B.card):=by ac_rfl _ ≤ _:=Nat.mul_le_mul_right _ htriangle' private def zz1962:"s07aa"="s07aa":=by decide+kernel theorem card_sub_comm (A B:Finset G):(A - B).card = (B - A).card:=by refine Finset.card_bij (fun x _ => -x) ?_ ?_ ?_ · intro x hx obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_sub.mp hx exact Finset.mem_sub.mpr ⟨b,hb,a,ha,by abel⟩ · exact fun _ _ _ _ h => neg_injective h · intro x hx obtain ⟨b,hb,a,ha,rfl⟩:=Finset.mem_sub.mp hx exact ⟨a - b,Finset.sub_mem_sub ha hb,by abel⟩ theorem union_difference_card_le (A B:Finset G) : ((A ∪ B) - (A ∪ B)).card ≤ (A - A).card + (B - B).card + 2 * (A - B).card:=by rw [Finset.union_sub,Finset.sub_union,Finset.sub_union] have h₁:=Finset.card_union_le (A - A ∪ (A - B)) (B - A ∪ (B - B)) have h₂:=Finset.card_union_le (A - A) (A - B) have h₃:=Finset.card_union_le (B - A) (B - B) rw [← card_sub_comm A B] at h₃ omega theorem union_difference_mul_energy_le (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) : ((A ∪ B) - (A ∪ B)).card * Finset.addEnergy A B ≤ ((A - A).card + (B - B).card) * Finset.addEnergy A B + 2 * ((A - A).card * (B - B).card * (A.card * B.card)):=by have h₁:=Nat.mul_le_mul_right (Finset.addEnergy A B) (union_difference_card_le A B) have h₂:=Nat.mul_le_mul_left 2 (cross_difference_mul_energy_le A B hA hB) calc _ ≤ ((A - A).card + (B - B).card + 2 * (A - B).card) * Finset.addEnergy A B:=h₁ _ = ((A - A).card + (B - B).card) * Finset.addEnergy A B + 2 * ((A - B).card * Finset.addEnergy A B):=by simp only [add_mul,mul_assoc] _ ≤ _:=Nat.add_le_add_left h₂ _ theorem union_small_difference_of_high_energy (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) {K η:ℝ} (hK:0 ≤ K) (hη:0 < η) (hDA:((A - A).card:ℝ) ≤ K * A.card) (hDB:((B - B).card:ℝ) ≤ K * B.card) (hE:η * ((A ∪ B).card:ℝ) ^ 3 ≤ Finset.addEnergy A B) : (((A ∪ B) - (A ∪ B)).card:ℝ) ≤ (2 * K + 2 * K ^ 2 / η) * (A ∪ B).card:=by let N:ℝ:=(A ∪ B).card have hN:0 < N:=by dsimp [N] exact_mod_cast (hA.mono (Finset.subset_union_left:A ⊆ A ∪ B)).card_pos have ha:(A.card:ℝ) ≤ N:=by dsimp [N] exact_mod_cast Finset.card_le_card (Finset.subset_union_left:A ⊆ A ∪ B) have hb:(B.card:ℝ) ≤ N:=by dsimp [N] exact_mod_cast Finset.card_le_card (Finset.subset_union_right:B ⊆ A ∪ B) have hDA':((A - A).card:ℝ) ≤ K * N:=hDA.trans (mul_le_mul_of_nonneg_left ha hK) have hDB':((B - B).card:ℝ) ≤ K * N:=hDB.trans (mul_le_mul_of_nonneg_left hb hK) have hcross:((A - B).card:ℝ) * Finset.addEnergy A B ≤ ((A - A).card:ℝ) * (B - B).card * (A.card * (B.card:ℝ)):=by exact_mod_cast cross_difference_mul_energy_le A B hA hB have hprod:((A - A).card:ℝ) * (B - B).card * (A.card * (B.card:ℝ)) ≤ (K * N) * (K * N) * (N * N):=by gcongr have hcross':((A - B).card:ℝ) * η ≤ K ^ 2 * N:=by apply le_of_mul_le_mul_right (a:=N ^ 3) _ (pow_pos hN 3) calc _ = ((A - B).card:ℝ) * (η * N ^ 3):=by ring _ ≤ ((A - B).card:ℝ) * Finset.addEnergy A B := mul_le_mul_of_nonneg_left hE (Nat.cast_nonneg _) _ ≤ (K * N) * (K * N) * (N * N):=hcross.trans hprod _ = _:=by ring have hcross'':((A - B).card:ℝ) ≤ K ^ 2 * N / η := (le_div_iff₀ hη).mpr hcross' have hu:(((A ∪ B) - (A ∪ B)).card:ℝ) ≤ ((A - A).card:ℝ) + (B - B).card + 2 * (A - B).card:=by exact_mod_cast union_difference_card_le A B calc _ ≤ K * N + K * N + 2 * (K ^ 2 * N / η):=by linarith _ = _:=by ring end Green24Proof.EnergyOverlapMerge private def zz2502:"s09c6"="s09c6":=by decide+kernel end section namespace Green24Proof.EnergyAgglomeration open scoped Pointwise noncomputable def growthStep (θ K:ℝ):ℝ:=2 * K + 2 * K ^ 2 / θ noncomputable def growthBound (θ:ℝ):ℕ → ℝ → ℝ | 0,K => K | n + 1,K => growthBound θ n (growthStep θ K) private def zz1963:"s07ab"="s07ab":=by decide+kernel theorem growthStep_ge {θ K:ℝ} (hθ:0 < θ) (hK:0 ≤ K):K ≤ growthStep θ K:=by dsimp [growthStep] have h:0 ≤ 2 * K ^ 2 / θ:=by positivity linarith theorem growthBound_ge {θ K:ℝ} (hθ:0 < θ) (hK:0 ≤ K) (n:ℕ) : K ≤ growthBound θ n K:=by induction n generalizing K with | zero => exact le_rfl | succ n ih => exact (growthStep_ge hθ hK).trans (ih (hK.trans (growthStep_ge hθ hK))) variable {G:Type*} [AddCommGroup G] [DecidableEq G] def ControlledFamily (A R:Finset G) (μ K:ℝ) (P:Finset (Finset G)):Prop := (∀ B ∈ P,B ⊆ A ∧ B.Nonempty ∧ μ ≤ (B.card:ℝ) ∧ ((B - B).card:ℝ) ≤ K * B.card ∧ Disjoint B R) ∧ (P:Set (Finset G)).Pairwise Disjoint ∧ P.biUnion id ∪ R = A def mergeFamily (P:Finset (Finset G)) (B C:Finset G):Finset (Finset G) := insert (B ∪ C) ((P.erase B).erase C) theorem controlledFamily_mono {A R:Finset G} {μ K L:ℝ} {P:Finset (Finset G)} (h:ControlledFamily A R μ K P) (hKL:K ≤ L):ControlledFamily A R μ L P:=by refine ⟨?_,h.2⟩ intro B hB obtain ⟨hBA,hBne,hμB,hDB,hBR⟩:=h.1 B hB exact ⟨hBA,hBne,hμB,hDB.trans (mul_le_mul_of_nonneg_right hKL (Nat.cast_nonneg _)),hBR⟩ omit [AddCommGroup G] in theorem mergeFamily_union (P:Finset (Finset G)) (B C:Finset G) (hB:B ∈ P) (hC:C ∈ P) : (mergeFamily P B C).biUnion id = P.biUnion id:=by ext x simp only [mergeFamily,Finset.biUnion_insert,id_eq,Finset.mem_union, Finset.mem_biUnion,Finset.mem_erase] constructor · rintro ((hxB | hxC) | ⟨D,⟨_hDC,_hDB,hD⟩,hxD⟩) · exact ⟨B,hB,hxB⟩ · exact ⟨C,hC,hxC⟩ · exact ⟨D,hD,hxD⟩ · rintro ⟨D,hD,hxD⟩ by_cases hDB:D = B · exact Or.inl (Or.inl (hDB ▸ hxD)) by_cases hDC:D = C · exact Or.inl (Or.inr (hDC ▸ hxD)) · exact Or.inr ⟨D,⟨hDC,hDB,hD⟩,hxD⟩ private def zz1964:"s07ac"="s07ac":=by decide+kernel omit [AddCommGroup G] in theorem mergeFamily_card_lt (P:Finset (Finset G)) (B C:Finset G) (hB:B ∈ P) (hC:C ∈ P) (hBC:B ≠ C) (hBne:B.Nonempty) (hpair:(P:Set (Finset G)).Pairwise Disjoint) : (mergeFamily P B C).card < P.card:=by have hC':C ∈ P.erase B:=Finset.mem_erase.mpr ⟨hBC.symm,hC⟩ have hnew:B ∪ C ∉ (P.erase B).erase C:=by intro hmem obtain ⟨_,hmem⟩:=Finset.mem_erase.mp hmem obtain ⟨hne,hmem⟩:=Finset.mem_erase.mp hmem have hd:=hpair hB hmem hne.symm obtain ⟨b,hb⟩:=hBne exact Finset.disjoint_left.mp hd hb (Finset.mem_union_left C hb) dsimp [mergeFamily] rw [Finset.card_insert_of_notMem hnew] have hcardB:=Finset.card_erase_add_one hB have hcardC:=Finset.card_erase_add_one hC' omega theorem merge_controlledFamily {A R:Finset G} {μ K θ:ℝ} {P:Finset (Finset G)} (h:ControlledFamily A R μ K P) (hK:0 ≤ K) (hθ:0 < θ) (B C:Finset G) (hB:B ∈ P) (hC:C ∈ P) (_hBC:B ≠ C) (hE:θ * (A.card:ℝ) ^ 3 ≤ (B.addEnergy C:ℝ)) : ControlledFamily A R μ (growthStep θ K) (mergeFamily P B C):=by obtain ⟨hBA,hBne,hμB,hDB,hBR⟩:=h.1 B hB obtain ⟨hCA,hCne,_hμC,hDC,hCR⟩:=h.1 C hC have hUA:B ∪ C ⊆ A:=Finset.union_subset hBA hCA have hUcard:((B ∪ C).card:ℝ) ≤ A.card:=by exact_mod_cast Finset.card_le_card hUA have hEU:θ * ((B ∪ C).card:ℝ) ^ 3 ≤ (B.addEnergy C:ℝ):=by calc _ ≤ θ * (A.card:ℝ) ^ 3:=by gcongr _ ≤ _:=hE have hDU:=Green24Proof.EnergyOverlapMerge.union_small_difference_of_high_energy B C hBne hCne hK hθ hDB hDC hEU have hrest (D:Finset G) (hD:D ∈ (P.erase B).erase C):D ∈ P ∧ D ≠ B ∧ D ≠ C:=by obtain ⟨hDC,hDB,hDP⟩:=by simpa only [Finset.mem_erase] using hD exact ⟨hDP,hDB,hDC⟩ have hUd (D:Finset G) (hD:D ∈ (P.erase B).erase C):Disjoint (B ∪ C) D:=by obtain ⟨hDP,hDB,hDC⟩:=hrest D hD exact Finset.disjoint_union_left.mpr ⟨h.2.1 hB hDP hDB.symm,h.2.1 hC hDP hDC.symm⟩ refine ⟨?_, ?_, ?_⟩ · intro D hD rcases Finset.mem_insert.mp hD with rfl | hD · refine ⟨hUA,hBne.mono Finset.subset_union_left, ?_,hDU, ?_⟩ · exact hμB.trans (by exact_mod_cast Finset.card_le_card (Finset.subset_union_left:B ⊆ B ∪ C)) · exact Finset.disjoint_union_left.mpr ⟨hBR,hCR⟩ · exact (controlledFamily_mono h (growthStep_ge hθ hK)).1 D (hrest D hD).1 · intro D hD E hE hDE rcases Finset.mem_insert.mp hD with rfl | hD · rcases Finset.mem_insert.mp hE with rfl | hE · exact (hDE rfl).elim · exact hUd E hE · rcases Finset.mem_insert.mp hE with rfl | hE · exact (hUd D hD).symm · exact h.2.1 (hrest D hD).1 (hrest E hE).1 hDE · rw [mergeFamily_union P B C hB hC] exact h.2.2 theorem exists_separated_family (n:ℕ) (A R:Finset G) (μ K θ:ℝ) (hK:0 ≤ K) (hθ:0 < θ) (P:Finset (Finset G)) (hn:P.card ≤ n) (h:ControlledFamily A R μ K P) : ∃ Q:Finset (Finset G),Q.card ≤ P.card ∧ ControlledFamily A R μ (growthBound θ n K) Q ∧ (Q:Set (Finset G)).Pairwise (fun B C => (B.addEnergy C:ℝ) < θ * (A.card:ℝ) ^ 3):=by induction n generalizing P K with | zero => have hP:P = ∅:=Finset.card_eq_zero.mp (by omega) refine ⟨P,le_rfl,h, ?_⟩ simp [hP] | succ n ih => by_cases hsep:(P:Set (Finset G)).Pairwise (fun B C => (B.addEnergy C:ℝ) < θ * (A.card:ℝ) ^ 3) · exact ⟨P,le_rfl,controlledFamily_mono h (growthBound_ge hθ hK (n + 1)),hsep⟩ · simp only [Set.Pairwise] at hsep push Not at hsep obtain ⟨B,hB,C,hC,hBC,hE⟩:=hsep have hlt:=mergeFamily_card_lt P B C hB hC hBC (h.1 B hB).2.1 h.2.1 have hmerge:=merge_controlledFamily h hK hθ B C hB hC hBC hE obtain ⟨Q,hQcard,hQ,hsepQ⟩ := ih (growthStep θ K) (hK.trans (growthStep_ge hθ hK)) (mergeFamily P B C) (by omega) hmerge exact ⟨Q,hQcard.trans hlt.le,hQ,hsepQ⟩ end Green24Proof.EnergyAgglomeration private def zz2503:"s09c7"="s09c7":=by decide+kernel end section namespace Green24Proof.AdaptiveEnergyPartition open scoped Pointwise open Green24Proof.EnergyAgglomeration noncomputable def adaptiveBound (ψ:ℝ → ℝ):ℕ → ℝ → ℝ | 0,K => K | n + 1,K => adaptiveBound ψ n (growthStep (ψ K) K) theorem adaptiveBound_ge (ψ:ℝ → ℝ) (hψ:∀ K,0 ≤ K → 0 < ψ K) {K:ℝ} (hK:0 ≤ K) (n:ℕ):K ≤ adaptiveBound ψ n K:=by induction n generalizing K with | zero => exact le_rfl | succ n ih => have hstep:=growthStep_ge (hψ K hK) hK exact hstep.trans (ih (hK.trans hstep)) variable {G:Type*} [AddCommGroup G] [DecidableEq G] private def zz1965:"s07ad"="s07ad":=by decide+kernel theorem exists_adaptively_separated_family (n:ℕ) (A R:Finset G) (μ K:ℝ) (hK:0 ≤ K) (ψ:ℝ → ℝ) (hψ:∀ L,0 ≤ L → 0 < ψ L) (P:Finset (Finset G)) (hn:P.card ≤ n) (h:ControlledFamily A R μ K P) : ∃ (L:ℝ) (Q:Finset (Finset G)),K ≤ L ∧ L ≤ adaptiveBound ψ n K ∧ Q.card ≤ P.card ∧ ControlledFamily A R μ L Q ∧ (Q:Set (Finset G)).Pairwise (fun B C => (B.addEnergy C:ℝ) < ψ L * (A.card:ℝ) ^ 3):=by induction n generalizing P K with | zero => have hP:P = ∅:=Finset.card_eq_zero.mp (by omega) refine ⟨K,P,le_rfl,le_rfl,le_rfl,h, ?_⟩ simp [hP] | succ n ih => by_cases hsep:(P:Set (Finset G)).Pairwise (fun B C => (B.addEnergy C:ℝ) < ψ K * (A.card:ℝ) ^ 3) · exact ⟨K,P,le_rfl,adaptiveBound_ge ψ hψ hK (n + 1),le_rfl,h,hsep⟩ · simp only [Set.Pairwise] at hsep push Not at hsep obtain ⟨B,hB,C,hC,hBC,hE⟩:=hsep have hlt:=mergeFamily_card_lt P B C hB hC hBC (h.1 B hB).2.1 h.2.1 have hstep:=growthStep_ge (hψ K hK) hK have hmerge:=merge_controlledFamily h hK (hψ K hK) B C hB hC hBC hE obtain ⟨L,Q,hKL,hLbound,hQcard,hQ,hsepQ⟩ := ih (growthStep (ψ K) K) (hK.trans hstep) (mergeFamily P B C) (by omega) hmerge exact ⟨L,Q,hstep.trans hKL,hLbound,hQcard.trans hlt.le,hQ,hsepQ⟩ omit [AddCommGroup G] in theorem list_toFinset_union (P:List (Finset G)) (R:Finset G) : P.toFinset.biUnion id ∪ R = P.foldr (fun B C => B ∪ C) R:=by induction P with | nil => simp | cons B P ih => simp only [List.toFinset_cons,Finset.biUnion_insert, id_eq,List.foldr_cons,Finset.union_assoc,ih] theorem exists_adaptive_energy_partition (A:Finset G) (hA:A.Nonempty) {δ:ℝ} (hδ:0 < δ) (ψ:ℝ → ℝ) (hψ:∀ K,0 ≤ K → 0 < ψ K) : ∃ (L:ℝ) (P:Finset (Finset G)) (R:Finset G), 0x1000000 / δ ^ 10 ≤ L ∧ L ≤ adaptiveBound ψ ⌈8 / δ ^ 2⌉₊ (0x1000000 / δ ^ 10) ∧ P.card ≤ ⌈8 / δ ^ 2⌉₊ ∧ R ⊆ A ∧ (R.addEnergy R:ℝ) < δ * (A.card:ℝ) ^ 3 ∧ ControlledFamily A R (δ ^ 2 * A.card / 8) L P ∧ (P:Set (Finset G)).Pairwise (fun B C => (B.addEnergy C:ℝ) < ψ L * (A.card:ℝ) ^ 3):=by obtain ⟨P,R,hRA,hRE,hpieces,hpair,hdisj,hcover,hcount⟩ := Green24Proof.FiniteEnergyPeeling.exists_energy_partition A hA hδ have hcontrolled:ControlledFamily A R (δ ^ 2 * A.card / 8) (0x1000000 / δ ^ 10) P.toFinset:=by refine ⟨?_, ?_, ?_⟩ · intro B hB have hBP:B ∈ P:=List.mem_toFinset.mp hB obtain ⟨hBA,hBne,hBsize,hBdiff⟩:=hpieces B hBP exact ⟨hBA,hBne,hBsize,hBdiff,hdisj B hBP⟩ · intro B hB C hC hBC exact hpair.forall (List.mem_toFinset.mp hB) (List.mem_toFinset.mp hC) hBC · exact (list_toFinset_union P R).trans hcover have hn:P.toFinset.card ≤ ⌈8 / δ ^ 2⌉₊:=by have hp:(P.toFinset.card:ℝ) ≤ P.length:=by exact_mod_cast P.toFinset_card_le have hb:=hp.trans (hcount.trans (Nat.le_ceil (8 / δ ^ 2))) exact_mod_cast hb obtain ⟨L,Q,hKL,hLbound,hQcard,hQ,hsepQ⟩ := exists_adaptively_separated_family ⌈8 / δ ^ 2⌉₊ A R (δ ^ 2 * A.card / 8) (0x1000000 / δ ^ 10) (by positivity) ψ hψ P.toFinset hn hcontrolled exact ⟨L,Q,R,hKL,hLbound,hQcard.trans hn,hRA,hRE,hQ,hsepQ⟩ end Green24Proof.AdaptiveEnergyPartition private def zz2504:"s09c8"="s09c8":=by decide+kernel end section namespace Green24Proof.DilationEnergyTransfer open scoped BigOperators Pointwise open Green24Proof.EnergyOverlapMerge variable {G:Type*} [AddCommGroup G] [DecidableEq G] def dilate (ℓ:ℕ) (A:Finset G):Finset G:=A.image (fun x => ℓ • x) theorem exists_overlap_preimage (ℓ:ℕ) (hℓ:Function.Injective (fun x:G => ℓ • x)) (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) : ∃ (S:Finset G) (x:G),S ⊆ A ∧ dilate ℓ S ⊆ B + {x} ∧ Finset.addEnergy (dilate ℓ A) B ≤ A.card * B.card * S.card:=by obtain ⟨x,hx⟩:=exists_large_overlap (dilate ℓ A) B (hA.image _) hB let S:=A.filter (fun a => ℓ • a ∈ B + {x}) have himage:dilate ℓ S = dilate ℓ A ∩ (B + {x}):=by ext y simp only [dilate,S,Finset.mem_image,Finset.mem_filter,Finset.mem_inter] constructor · rintro ⟨a,⟨ha,hax⟩,rfl⟩ exact ⟨⟨a,ha,rfl⟩,hax⟩ · rintro ⟨⟨a,ha,rfl⟩,hax⟩ exact ⟨a,⟨ha,hax⟩,rfl⟩ refine ⟨S,x,Finset.filter_subset _ _, ?_, ?_⟩ · rw [himage] exact Finset.inter_subset_right · have hcardS:(dilate ℓ S).card = S.card:=Finset.card_image_of_injective _ hℓ have hcardA:(dilate ℓ A).card = A.card:=Finset.card_image_of_injective _ hℓ rw [← himage,hcardS,hcardA] at hx exact hx private def zz1966:"s07ae"="s07ae":=by decide+kernel theorem card_add_le_higher_sumset_of_dilate_subset (ℓ:ℕ) (hℓ:Function.Injective (fun x:G => ℓ • x)) (S B:Finset G) (x:G) (hS:dilate ℓ S ⊆ B + {x}) : (S + B).card ≤ ((ℓ + 1) • B).card:=by have hsub:dilate ℓ (S + B) ⊆ ((ℓ + 1) • B) + {x}:=by intro y hy obtain ⟨z,hz,rfl⟩:=Finset.mem_image.mp hy obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_add.mp hz have hax:=hS (Finset.mem_image.mpr ⟨a,ha,rfl⟩) obtain ⟨c,hc,d,hd,hcd⟩:=Finset.mem_add.mp hax have hdx:d = x:=Finset.mem_singleton.mp hd subst d refine Finset.mem_add.mpr ⟨ℓ • b + c, ?_,x,by simp, ?_⟩ · rw [add_nsmul,one_nsmul] exact Finset.add_mem_add (Finset.nsmul_mem_nsmul hb) hc · rw [nsmul_add, ← hcd] abel have hcard:=Finset.card_le_card hsub rw [Finset.card_add_singleton] at hcard rw [dilate,Finset.card_image_of_injective _ hℓ] at hcard exact hcard theorem dilated_energy_sq_le (ℓ:ℕ) (hℓ:Function.Injective (fun x:G => ℓ • x)) (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) : Finset.addEnergy (dilate ℓ A) B ^ 2 ≤ A.card ^ 2 * ((ℓ + 1) • B).card * Finset.addEnergy A B:=by obtain ⟨S,x,hSA,hS,henergy⟩:=exists_overlap_preimage ℓ hℓ A B hA hB have hcard:=card_add_le_higher_sumset_of_dilate_subset ℓ hℓ S B x hS have hCS:=Finset.le_card_add_mul_addEnergy S B have hmono:Finset.addEnergy S B ≤ Finset.addEnergy A B := Finset.addEnergy_mono_left hSA have hbound:S.card ^ 2 * B.card ^ 2 ≤ ((ℓ + 1) • B).card * Finset.addEnergy A B := hCS.trans (Nat.mul_le_mul hcard hmono) calc _ ≤ (A.card * B.card * S.card) ^ 2:=Nat.pow_le_pow_left henergy 2 _ = A.card ^ 2 * (S.card ^ 2 * B.card ^ 2):=by ring _ ≤ A.card ^ 2 * (((ℓ + 1) • B).card * Finset.addEnergy A B) := Nat.mul_le_mul_left _ hbound _ = _:=by ring theorem higher_sumset_card_le {K:ℝ} (B:Finset G) (hB:B.Nonempty) (_hK:0 ≤ K) (hdoubling:((B + B).card:ℝ) ≤ K * B.card) (m:ℕ) : ((m • B).card:ℝ) ≤ K ^ m * B.card:=by have hp:=Finset.pluennecke_ruzsa_inequality_nsmul_add hB B m have hp':((m • B).card:ℝ) ≤ (((B + B).card:ℝ) / B.card) ^ m * B.card:=by have hc:=NNRat.cast_mono (K:=ℝ) hp change (NNRat.castHom ℝ) ((m • B).card:ℚ≥0) ≤ (NNRat.castHom ℝ) ((((B + B).card:ℚ≥0) / B.card) ^ m * B.card) at hc rw [map_mul,map_pow] at hc simpa only [NNRat.coe_castHom,NNRat.cast_div,NNRat.cast_natCast] using hc have hbpos:(0:ℝ) < B.card:=by exact_mod_cast hB.card_pos apply hp'.trans gcongr exact (div_le_iff₀ hbpos).mpr hdoubling theorem dilated_energy_sq_le_of_small_doubling (ℓ:ℕ) (hℓ:Function.Injective (fun x:G => ℓ • x)) (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) {K:ℝ} (hK:0 ≤ K) (hdoubling:((B + B).card:ℝ) ≤ K * B.card) : (Finset.addEnergy (dilate ℓ A) B:ℝ) ^ 2 ≤ K ^ (ℓ + 1) * (A.card:ℝ) ^ 2 * B.card * Finset.addEnergy A B:=by have hcore:(Finset.addEnergy (dilate ℓ A) B:ℝ) ^ 2 ≤ (A.card:ℝ) ^ 2 * ((ℓ + 1) • B).card * Finset.addEnergy A B:=by exact_mod_cast dilated_energy_sq_le ℓ hℓ A B hA hB calc _ ≤ (A.card:ℝ) ^ 2 * (K ^ (ℓ + 1) * B.card) * Finset.addEnergy A B:=by apply hcore.trans gcongr exact higher_sumset_card_le B hB hK hdoubling (ℓ + 1) _ = _:=by ring private def zz1967:"s07af"="s07af":=by decide+kernel theorem dilated_energy_le_of_budget (ℓ:ℕ) (hℓ:Function.Injective (fun x:G => ℓ • x)) (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) {K η N:ℝ} (hK:0 ≤ K) (hη:0 ≤ η) (hN:0 ≤ N) (hdoubling:((B + B).card:ℝ) ≤ K * B.card) (hAN:(A.card:ℝ) ≤ N) (hBN:(B.card:ℝ) ≤ N) (hbudget:K ^ (ℓ + 1) * Finset.addEnergy A B ≤ η ^ 2 * N ^ 3) : (Finset.addEnergy (dilate ℓ A) B:ℝ) ≤ η * N ^ 3:=by have hcore:=dilated_energy_sq_le_of_small_doubling ℓ hℓ A B hA hB hK hdoubling have hsize:(A.card:ℝ) ^ 2 * B.card ≤ N ^ 3:=by calc _ ≤ N ^ 2 * N:=by gcongr _ = _:=by ring have hsquare:(Finset.addEnergy (dilate ℓ A) B:ℝ) ^ 2 ≤ (η * N ^ 3) ^ 2:=by calc _ ≤ ((A.card:ℝ) ^ 2 * B.card) * (K ^ (ℓ + 1) * Finset.addEnergy A B):=by convert hcore using 1 ring _ ≤ (N ^ 3) * (η ^ 2 * N ^ 3):=by gcongr _ = _:=by ring exact (sq_le_sq₀ (Nat.cast_nonneg _) (by positivity)).mp hsquare theorem energy_neg_left (A B:Finset G) : Finset.addEnergy (A.image (fun a => -a)) B = Finset.addEnergy A B:=by symm unfold Finset.addEnergy refine Finset.card_bij (fun p _ => ((-p.1.1, -p.1.2),p.2.2,p.2.1)) ?_ ?_ ?_ · rintro ⟨⟨a,c⟩,b,d⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp ⊢ refine ⟨⟨⟨Finset.mem_image.mpr ⟨a,hp.1.1.1,rfl⟩, Finset.mem_image.mpr ⟨c,hp.1.1.2,rfl⟩⟩,hp.1.2.2,hp.1.2.1⟩, ?_⟩ rw [neg_add_eq_sub,neg_add_eq_sub] apply sub_eq_sub_iff_add_eq_add.mpr simpa only [add_comm] using hp.2.symm · rintro ⟨⟨a,c⟩,b,d⟩ _ ⟨⟨a',c'⟩,b',d'⟩ _ heq simp only [Prod.mk.injEq,neg_inj] at heq ⊢ exact ⟨heq.1,heq.2.2,heq.2.1⟩ · rintro ⟨⟨a,c⟩,d,b⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp obtain ⟨a',ha',rfl⟩:=Finset.mem_image.mp hp.1.1.1 obtain ⟨c',hc',rfl⟩:=Finset.mem_image.mp hp.1.1.2 refine ⟨((a',c'),b,d), ?_,rfl⟩ simp only [Finset.mem_filter,Finset.mem_product] refine ⟨⟨⟨ha',hc'⟩,hp.1.2.2,hp.1.2.1⟩, ?_⟩ have heq:=hp.2 rw [neg_add_eq_sub,neg_add_eq_sub] at heq have heq':=sub_eq_sub_iff_add_eq_add.mp heq simpa only [add_comm] using heq'.symm theorem energy_neg_right (A B:Finset G) : Finset.addEnergy A (B.image (fun b => -b)) = Finset.addEnergy A B:=by rw [Finset.addEnergy_comm,energy_neg_left,Finset.addEnergy_comm] theorem dilate_add (ℓ:ℕ) (A B:Finset G) : dilate ℓ (A + B) = dilate ℓ A + dilate ℓ B:=by ext x constructor · intro hx obtain ⟨y,hy,rfl⟩:=Finset.mem_image.mp hx obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_add.mp hy exact Finset.mem_add.mpr ⟨ℓ • a,Finset.mem_image.mpr ⟨a,ha,rfl⟩, ℓ • b,Finset.mem_image.mpr ⟨b,hb,rfl⟩,(nsmul_add _ _ _).symm⟩ · intro hx obtain ⟨y,hy,z,hz,rfl⟩:=Finset.mem_add.mp hx obtain ⟨a,ha,rfl⟩:=Finset.mem_image.mp hy obtain ⟨b,hb,rfl⟩:=Finset.mem_image.mp hz exact Finset.mem_image.mpr ⟨a + b,Finset.add_mem_add ha hb,nsmul_add _ _ _⟩ private def zz1968:"s07b0"="s07b0":=by decide+kernel theorem both_dilated_energy_le_of_budget (ℓ m:ℕ) (hℓ:Function.Injective (fun x:G => ℓ • x)) (hm:Function.Injective (fun x:G => m • x)) (A B:Finset G) (hA:A.Nonempty) (hB:B.Nonempty) {KA KB δ η N:ℝ} (hKA:0 ≤ KA) (hKB:0 ≤ KB) (hδ:0 ≤ δ) (hη:0 ≤ η) (hN:0 ≤ N) (hdoubleA:((A + A).card:ℝ) ≤ KA * A.card) (hdoubleB:((B + B).card:ℝ) ≤ KB * B.card) (hAN:(A.card:ℝ) ≤ N) (hBN:(B.card:ℝ) ≤ N) (hfirst:KB ^ (ℓ + 1) * Finset.addEnergy A B ≤ δ ^ 2 * N ^ 3) (hsecond:KA ^ (m + 1) * δ ≤ η ^ 2) : (Finset.addEnergy (dilate ℓ A) (dilate m B):ℝ) ≤ η * N ^ 3:=by have hfirst':=dilated_energy_le_of_budget ℓ hℓ A B hA hB hKB hδ hN hdoubleB hAN hBN hfirst have hcard:(dilate ℓ A).card = A.card:=Finset.card_image_of_injective _ hℓ have hdoubling:((dilate ℓ A + dilate ℓ A).card:ℝ) ≤ KA * (dilate ℓ A).card:=by rw [← dilate_add,hcard] have hc:(dilate ℓ (A + A)).card = (A + A).card:=Finset.card_image_of_injective _ hℓ rw [hc] exact hdoubleA have hbudget:KA ^ (m + 1) * Finset.addEnergy B (dilate ℓ A) ≤ η ^ 2 * N ^ 3:=by rw [Finset.addEnergy_comm] calc _ ≤ KA ^ (m + 1) * (δ * N ^ 3):=by gcongr _ = (KA ^ (m + 1) * δ) * N ^ 3:=by ring _ ≤ _:=mul_le_mul_of_nonneg_right hsecond (by positivity) have h:=dilated_energy_le_of_budget m hm B (dilate ℓ A) hB (hA.image _) hKA hη hN hdoubling hBN (by simpa only [hcard] using hAN) hbudget rwa [Finset.addEnergy_comm] at h theorem integer_dilated_energy_sq_le (ℓ:ℕ) (hℓ:ℓ ≠ 0) (A B:Finset ℤ) (hA:A.Nonempty) (hB:B.Nonempty) : Finset.addEnergy (A.image (fun a => (ℓ:ℤ) * a)) B ^ 2 ≤ A.card ^ 2 * ((ℓ + 1) • B).card * Finset.addEnergy A B:=by have hinj:Function.Injective (fun a:ℤ => ℓ • a):=by intro a b heq simp only [nsmul_eq_mul] at heq exact mul_left_cancel₀ (by exact_mod_cast hℓ:(ℓ:ℤ) ≠ 0) heq simpa only [dilate,nsmul_eq_mul] using dilated_energy_sq_le ℓ hinj A B hA hB theorem integer_signed_energy_sq_le (k:ℤ) (hk:k ≠ 0) (A B:Finset ℤ) (hA:A.Nonempty) (hB:B.Nonempty) : Finset.addEnergy (A.image (fun a => k * a)) B ^ 2 ≤ A.card ^ 2 * ((k.natAbs + 1) • B).card * Finset.addEnergy A B:=by cases k with | ofNat ℓ => have hℓ:ℓ ≠ 0:=by intro hzero subst ℓ exact hk rfl simpa using integer_dilated_energy_sq_le ℓ hℓ A B hA hB | negSucc ℓ => have h:=integer_dilated_energy_sq_le (ℓ + 1) (by omega) A B hA hB have he:A.image (fun a => Int.negSucc ℓ * a) = (A.image (fun a => ((ℓ + 1:ℕ):ℤ) * a)).image (fun a => -a):=by rw [Finset.image_image] congr 1 funext a simp only [Int.negSucc_eq,Nat.cast_add,Nat.cast_one] dsimp only [Function.comp_apply] ring rw [he,energy_neg_left] simpa using h theorem integer_energy_abs_left (k:ℤ) (A B:Finset ℤ) : Finset.addEnergy (A.image (fun a => k * a)) B = Finset.addEnergy (dilate k.natAbs A) B:=by cases k with | ofNat ℓ => simp only [dilate,nsmul_eq_mul] rfl | negSucc ℓ => have he:A.image (fun a => Int.negSucc ℓ * a) = (dilate (ℓ + 1) A).image (fun a => -a):=by rw [dilate,Finset.image_image] congr 1 funext a simp only [Int.negSucc_eq,nsmul_eq_mul,Nat.cast_add,Nat.cast_one] dsimp only [Function.comp_apply] ring rw [he,energy_neg_left] rfl private def zz1969:"s07b1"="s07b1":=by decide+kernel theorem integer_energy_abs_coefficients (k l:ℤ) (A B:Finset ℤ) : Finset.addEnergy (A.image (fun a => k * a)) (B.image (fun b => l * b)) = Finset.addEnergy (dilate k.natAbs A) (dilate l.natAbs B):=by rw [integer_energy_abs_left,Finset.addEnergy_comm,integer_energy_abs_left, Finset.addEnergy_comm] theorem integer_signed_energy_le_of_budget (k l:ℤ) (hk:k ≠ 0) (hl:l ≠ 0) (A B:Finset ℤ) (hA:A.Nonempty) (hB:B.Nonempty) {KA KB δ η N:ℝ} (hKA:0 ≤ KA) (hKB:0 ≤ KB) (hδ:0 ≤ δ) (hη:0 ≤ η) (hN:0 ≤ N) (hdoubleA:((A + A).card:ℝ) ≤ KA * A.card) (hdoubleB:((B + B).card:ℝ) ≤ KB * B.card) (hAN:(A.card:ℝ) ≤ N) (hBN:(B.card:ℝ) ≤ N) (hfirst:KB ^ (k.natAbs + 1) * Finset.addEnergy A B ≤ δ ^ 2 * N ^ 3) (hsecond:KA ^ (l.natAbs + 1) * δ ≤ η ^ 2) : (Finset.addEnergy (A.image (fun a => k * a)) (B.image (fun b => l * b)):ℝ) ≤ η * N ^ 3:=by rw [integer_energy_abs_coefficients] have hinj (n:ℤ) (hn:n ≠ 0):Function.Injective (fun a:ℤ => n.natAbs • a):=by intro a b heq simp only [nsmul_eq_mul] at heq apply mul_left_cancel₀ _ heq exact_mod_cast (Int.natAbs_ne_zero.mpr hn) exact both_dilated_energy_le_of_budget k.natAbs l.natAbs (hinj k hk) (hinj l hl) A B hA hB hKA hKB hδ hη hN hdoubleA hdoubleB hAN hBN hfirst hsecond end Green24Proof.DilationEnergyTransfer private def zz2505:"s09c9"="s09c9":=by decide+kernel end section namespace Green24Proof.IteratedCoveringGrowth open scoped BigOperators Pointwise variable {G:Type*} [AddCommGroup G] [DecidableEq G] theorem bounded_coefficients_of_mem_nsmul_sub (T:Finset G) (m:ℕ) {x:G} (hx:x ∈ m • (T - T)) : ∃ z:T → ℤ,(∀ t, -(m:ℤ) ≤ z t ∧ z t ≤ m) ∧ x = ∑ t:T,z t • (t:G):=by induction m generalizing x with | zero => have hx0:x = 0:=by simpa using hx exact ⟨fun _ => 0,by simp,by simp [hx0]⟩ | succ m ih => rw [succ_nsmul] at hx obtain ⟨y,hy,a,ha,rfl⟩:=Finset.mem_add.mp hx obtain ⟨u,hu,v,hv,rfl⟩:=Finset.mem_sub.mp ha obtain ⟨z,hz,hyz⟩:=ih hy let u':T:=⟨u,hu⟩ let v':T:=⟨v,hv⟩ let w:T → ℤ:=fun t => z t + (if t = u' then 1 else 0) - (if t = v' then 1 else 0) refine ⟨w, ?_, ?_⟩ · intro t have ht:=hz t dsimp [w] split_ifs <;> omega · simp only [w,sub_smul,add_smul,Finset.sum_sub_distrib,Finset.sum_add_distrib, ite_smul,one_smul,zero_smul] simp only [Finset.sum_ite_eq',Finset.mem_univ,if_true] change y + (u - v) = (∑ t:T,z t • (t:G)) + u - v rw [hyz] abel def coefficientBoxImage (T:Finset G) (m:ℕ):Finset G := Finset.univ.image (fun c:T → Fin (2 * m + 1) => ∑ t:T,(((c t:ℕ):ℤ) - (m:ℤ)) • (t:G)) theorem nsmul_sub_subset_coefficientBoxImage (T:Finset G) (m:ℕ) : m • (T - T) ⊆ coefficientBoxImage T m:=by intro x hx obtain ⟨z,hz,hrepr⟩:=bounded_coefficients_of_mem_nsmul_sub T m hx let c:T → Fin (2 * m + 1):=fun t => ⟨(z t + (m:ℤ)).toNat,by have ht:=hz t; omega⟩ have hc (t:T):(((c t:ℕ):ℤ) - (m:ℤ)) = z t:=by have ht:=hz t dsimp [c] omega apply Finset.mem_image.mpr refine ⟨c,Finset.mem_univ _, ?_⟩ simpa only [hc] using hrepr.symm private def zz1970:"s07b2"="s07b2":=by decide+kernel theorem card_nsmul_sub_le (T:Finset G) (m:ℕ) : (m • (T - T)).card ≤ (2 * m + 1) ^ T.card:=by calc (m • (T - T)).card ≤ (coefficientBoxImage T m).card := Finset.card_le_card (nsmul_sub_subset_coefficientBoxImage T m) _ ≤ (Finset.univ:Finset (T → Fin (2 * m + 1))).card:=Finset.card_image_le _ = _:=by simp theorem iterated_cover (B T:Finset G) (hcover:B + B ⊆ B + (T - T)) (m:ℕ) : (m + 1) • B ⊆ B + m • (T - T):=by induction m with | zero => simp | succ m ih => calc (m + 1 + 1) • B = (m + 1) • B + B:=by rw [add_nsmul,one_nsmul] _ ⊆ (B + m • (T - T)) + B:=Finset.add_subset_add ih (fun _ hx => hx) _ = (B + B) + m • (T - T):=by ac_rfl _ ⊆ (B + (T - T)) + m • (T - T):=Finset.add_subset_add hcover (fun _ hx => hx) _ = B + (m + 1) • (T - T):=by rw [add_nsmul,one_nsmul]; ac_rfl theorem polynomial_growth_of_cover (B T:Finset G) (hcover:B + B ⊆ B + (T - T)) (m:ℕ) : ((m + 1) • B).card ≤ B.card * (2 * m + 1) ^ T.card:=by calc ((m + 1) • B).card ≤ (B + m • (T - T)).card := Finset.card_le_card (iterated_cover B T hcover m) _ ≤ B.card * (m • (T - T)).card:=Finset.card_add_le _ ≤ _:=Nat.mul_le_mul_left _ (card_nsmul_sub_le T m) open Green24Proof.CyclicFourierMoments variable {q:ℕ} [NeZero q] theorem moment_bracket_nonneg (B:Finset (ZMod q)) (m:ℕ) (M:ℝ) : 0 ≤ (B.card:ℝ) ^ (2 * (m + 1)) + M ^ (2 * m) * ((q:ℝ) * B.card - (B.card:ℝ) ^ 2):=by have henergy:0 ≤ (q:ℝ) * B.card - (B.card:ℝ) ^ 2:=by rw [← second_moment_nonzero] exact Finset.sum_nonneg (fun _ _ => sq_nonneg _) have hpow:0 ≤ M ^ (2 * m):=by rw [pow_mul] exact pow_nonneg (sq_nonneg M) m positivity private def zz1971:"s07b3"="s07b3":=by decide+kernel theorem moment_criterion_of_cover (B T:Finset (ZMod q)) (hcover:B + B ⊆ B + (T - T)) (m:ℕ) (M:ℝ) (hnum:(B.card:ℝ) * (2 * (m:ℝ) + 1) ^ T.card * ((B.card:ℝ) ^ (2 * (m + 1)) + M ^ (2 * m) * ((q:ℝ) * B.card - (B.card:ℝ) ^ 2)) < (q:ℝ) * (B.card:ℝ) ^ (2 * (m + 1))) : ((iteratedSumset B (m + 1)).card:ℝ) * ((B.card:ℝ) ^ (2 * (m + 1)) + M ^ (2 * m) * ((q:ℝ) * B.card - (B.card:ℝ) ^ 2)) < (q:ℝ) * (B.card:ℝ) ^ (2 * (m + 1)):=by have hgrowth:((iteratedSumset B (m + 1)).card:ℝ) ≤ (B.card:ℝ) * (2 * (m:ℝ) + 1) ^ T.card:=by rw [iteratedSumset_eq_nsmul] exact_mod_cast polynomial_growth_of_cover B T hcover m exact lt_of_le_of_lt (mul_le_mul_of_nonneg_right hgrowth (moment_bracket_nonneg B m M)) hnum theorem exists_large_nonzero_coefficient_of_cover (B T:Finset (ZMod q)) (hcover:B + B ⊆ B + (T - T)) (m:ℕ) (M:ℝ) (hnum:(B.card:ℝ) * (2 * (m:ℝ) + 1) ^ T.card * ((B.card:ℝ) ^ (2 * (m + 1)) + M ^ (2 * m) * ((q:ℝ) * B.card - (B.card:ℝ) ^ 2)) < (q:ℝ) * (B.card:ℝ) ^ (2 * (m + 1))) : ∃ r:ZMod q,r ≠ 0 ∧ M < ‖coefficient B r‖ := exists_large_nonzero_coefficient B m (moment_criterion_of_cover B T hcover m M hnum) theorem exists_freiman_three_model_of_cover [Fact q.Prime] (A T:Finset (ZMod q)) (hcover:(A - A) + (A - A) ⊆ (A - A) + (T - T)) (m:ℕ) {M:ℝ} (hM:0 ≤ M) {R:ℤ} (hR:0 < R) (hRq:6 * R < (q:ℤ)) (hnum:((A - A).card:ℝ) * (2 * (m:ℝ) + 1) ^ T.card * (((A - A).card:ℝ) ^ (2 * (m + 1)) + M ^ (2 * m) * ((q:ℝ) * (A - A).card - ((A - A).card:ℝ) ^ 2)) < (q:ℝ) * ((A - A).card:ℝ) ^ (2 * (m + 1))) (hbudget:((A - A).card:ℝ) ^ 2 - M ^ 2 ≤ (A.card:ℝ) / 2 * (A - A).card * (1 - Real.cos (2 * Real.pi * (R:ℝ) / q))) : ∃ (B:Finset ℤ) (f:ZMod q → ℤ), B ⊆ Finset.Icc 0 (2 * R) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set (ZMod q)) (B:Set ℤ) f := exists_freiman_three_model_of_moment_growth A m hM hR hRq (moment_criterion_of_cover (A - A) T hcover m M hnum) hbudget end Green24Proof.IteratedCoveringGrowth private def zz2506:"s09ca"="s09ca":=by decide+kernel end section namespace Green24Proof.SmallDoublingCover open scoped BigOperators Pointwise variable {G:Type*} [AddCommGroup G] [DecidableEq G] omit [AddCommGroup G] [DecidableEq G] in theorem exists_max_potential_max_card (U:Finset G) (F:Finset G → ℤ) : ∃ T ⊆ U,(∀ S ⊆ U,F S ≤ F T) ∧ (∀ S ⊆ U,F S = F T → S.card ≤ T.card):=by classical obtain ⟨T₀,hT₀,hmax⟩:=U.powerset.exists_max_image F ⟨∅,by simp⟩ let C:=U.powerset.filter (fun S => F S = F T₀) have hC:C.Nonempty:=⟨T₀,Finset.mem_filter.mpr ⟨hT₀,rfl⟩⟩ obtain ⟨T,hT,hcard⟩:=C.exists_max_image Finset.card hC obtain ⟨hTU,hFT⟩:=Finset.mem_filter.mp hT refine ⟨T,Finset.mem_powerset.mp hTU, ?_, ?_⟩ · intro S hS rw [hFT] exact hmax S (Finset.mem_powerset.mpr hS) · intro S hS hFS exact hcard S (Finset.mem_filter.mpr ⟨Finset.mem_powerset.mpr hS,hFS.trans hFT⟩) private def zz1972:"s07b4"="s07b4":=by decide+kernel theorem exists_half_cover (X U:Finset G) (hX:X.Nonempty) (hU:U.Nonempty) : ∃ T ⊆ U, (T.card + 1) * X.card ≤ 2 * (X + U).card ∧ ∀ u ∈ U,2 * ((X + {u}) \ (X + T)).card < X.card:=by classical let F:Finset G → ℤ:=fun T => 2 * ((X + T).card:ℤ) - (X.card:ℤ) * T.card obtain ⟨T,hTU,hmax,hmaxcard⟩:=exists_max_potential_max_card U F refine ⟨T,hTU, ?_, ?_⟩ · obtain ⟨u,hu⟩:=hU have h:=hmax {u} (Finset.singleton_subset_iff.mpr hu) have hsub:(X + T).card ≤ (X + U).card := Finset.card_le_card (Finset.add_subset_add (fun _ hx => hx) hTU) have hF:F {u} = X.card:=by simp [F]; ring rw [hF] at h dsimp [F] at h have hsubi:((X + T).card:ℤ) ≤ (X + U).card:=by exact_mod_cast hsub have hi:((T.card:ℤ) + 1) * X.card ≤ 2 * (X + U).card:=by nlinarith exact_mod_cast hi · intro u hu by_cases hut:u ∈ T · have hsub:X + {u} ⊆ X + T := Finset.add_subset_add (fun _ hx => hx) (Finset.singleton_subset_iff.mpr hut) rw [Finset.sdiff_eq_empty_iff_subset.mpr hsub] simpa using hX.card_pos · have hinsert:insert u T ⊆ U:=Finset.insert_subset hu hTU have hle:=hmax (insert u T) hinsert have hlt:F (insert u T) < F T:=by apply lt_of_le_of_ne hle intro he have hc:=hmaxcard (insert u T) hinsert he rw [Finset.card_insert_of_notMem hut] at hc omega have hset:X + insert u T = (X + {u}) ∪ (X + T):=by rw [Finset.insert_eq,Finset.add_union] have hc:=Finset.card_sdiff_add_card (X + {u}) (X + T) rw [← hset] at hc dsimp [F] at hlt rw [Finset.card_insert_of_notMem hut] at hlt push_cast at hlt have hlt':(2:ℤ) * ((X + {u}) \ (X + T)).card < X.card:=by have hci:(((X + {u}) \ (X + T)).card:ℤ) + (X + T).card = (X + insert u T).card:=by exact_mod_cast hc nlinarith exact_mod_cast hlt' theorem card_bad_translate (X T:Finset G) (u:G) : (X.filter (fun x => x + u ∉ X + T)).card = ((X + {u}) \ (X + T)).card:=by classical symm apply Finset.card_bij (fun x _ => x - u) · intro x hx obtain ⟨hxu,hxT⟩:=Finset.mem_sdiff.mp hx obtain ⟨y,hy,z,hz,hxyz⟩:=Finset.mem_add.mp hxu have hz':z = u:=Finset.mem_singleton.mp hz subst z subst x simpa using And.intro hy hxT · intro x _ y _ he exact sub_left_inj.mp he · intro x hx obtain ⟨hxX,hxT⟩:=Finset.mem_filter.mp hx refine ⟨x + u,Finset.mem_sdiff.mpr ⟨Finset.add_mem_add hxX (by simp),hxT⟩,by simp⟩ theorem difference_cover_of_half_cover (X U T:Finset G) (hhalf:∀ u ∈ U,2 * ((X + {u}) \ (X + T)).card < X.card) : U - U ⊆ (X - X) + (T - T):=by classical intro z hz obtain ⟨u,hu,v,hv,rfl⟩:=Finset.mem_sub.mp hz have hgood:∃ x ∈ X,x + u ∈ X + T ∧ x + v ∈ X + T:=by by_contra hn have hsub:X ⊆ (X.filter (fun x => x + u ∉ X + T)) ∪ (X.filter (fun x => x + v ∉ X + T)):=by intro x hx by_cases hxu:x + u ∈ X + T · exact Finset.mem_union_right _ (Finset.mem_filter.mpr ⟨hx,fun hxv => hn ⟨x,hx,hxu,hxv⟩⟩) · exact Finset.mem_union_left _ (Finset.mem_filter.mpr ⟨hx,hxu⟩) have hcard:=(Finset.card_le_card hsub).trans (Finset.card_union_le _ _) rw [card_bad_translate,card_bad_translate] at hcard have hu':=hhalf u hu have hv':=hhalf v hv omega obtain ⟨x,_,hxu,hxv⟩:=hgood obtain ⟨a,ha,t,ht,hat⟩:=Finset.mem_add.mp hxu obtain ⟨b,hb,s,hs,hbs⟩:=Finset.mem_add.mp hxv refine Finset.mem_add.mpr ⟨a - b,Finset.sub_mem_sub ha hb, t - s,Finset.sub_mem_sub ht hs, ?_⟩ have he:=congrArg₂ (fun i j:G => i - j) hat hbs abel_nf at he ⊢ exact he theorem exists_difference_cover (X U:Finset G) (hX:X.Nonempty) (hU:U.Nonempty) : ∃ T ⊆ U,(T.card + 1) * X.card ≤ 2 * (X + U).card ∧ U - U ⊆ (X - X) + (T - T):=by obtain ⟨T,hTU,hcard,hhalf⟩:=exists_half_cover X U hX hU exact ⟨T,hTU,hcard,difference_cover_of_half_cover X U T hhalf⟩ private def zz1973:"s07b5"="s07b5":=by decide+kernel theorem exists_subset_second_sum_bound (A:Finset G) (hA:A.Nonempty) {K:ℝ} (hK:0 ≤ K) (hdoubling:((A + A).card:ℝ) ≤ K * A.card) : ∃ C ⊆ A,C.Nonempty ∧ ((C + (A + A)).card:ℝ) ≤ K ^ 2 * C.card:=by classical let F:Finset G → ℝ:=fun C => ((C + A).card:ℝ) / C.card have hmem:A ∈ A.powerset.erase ∅ := Finset.mem_erase.mpr ⟨hA.ne_empty,Finset.mem_powerset_self _⟩ obtain ⟨C,hC,hmin⟩:=(A.powerset.erase ∅).exists_min_image F ⟨A,hmem⟩ obtain ⟨hC0,hCA⟩:=Finset.mem_erase.mp hC have hCne:C.Nonempty:=Finset.nonempty_iff_ne_empty.mpr hC0 have hCA':C ⊆ A:=Finset.mem_powerset.mp hCA have hcpos:(0:ℝ) < C.card:=by exact_mod_cast hCne.card_pos have hapos:(0:ℝ) < A.card:=by exact_mod_cast hA.card_pos have hminimal:∀ D ⊆ C,(C + A).card * D.card ≤ (D + A).card * C.card:=by intro D hDC obtain rfl | hD:=D.eq_empty_or_nonempty · simp have hdpos:(0:ℝ) < D.card:=by exact_mod_cast hD.card_pos have hDm:D ∈ A.powerset.erase ∅:=Finset.mem_erase.mpr ⟨hD.ne_empty,Finset.mem_powerset.mpr (hDC.trans hCA')⟩ have hrat:=hmin D hDm dsimp [F] at hrat exact_mod_cast (div_le_div_iff₀ hcpos hdpos).mp hrat have hP:=Finset.pluennecke_petridis_inequality_add (A:=C) (B:=A) A hminimal have hP':((C + (A + A)).card:ℝ) * C.card ≤ ((C + A).card:ℝ) ^ 2:=by have he₁:A + C + A = C + (A + A):=by ac_rfl have he₂:A + C = C + A:=add_comm _ _ rw [he₁,he₂] at hP have hPnat:(C + (A + A)).card * C.card ≤ (C + A).card ^ 2:=by simpa only [pow_two] using hP exact_mod_cast hPnat have hratio:F C ≤ K:=by apply (hmin A hmem).trans exact (div_le_iff₀ hapos).mpr hdoubling have hfirst:((C + A).card:ℝ) ≤ K * C.card := (div_le_iff₀ hcpos).mp hratio have hsquare:((C + A).card:ℝ) ^ 2 ≤ (K * C.card) ^ 2 := (sq_le_sq₀ (Nat.cast_nonneg _) (mul_nonneg hK hcpos.le)).mpr hfirst refine ⟨C,hCA',hCne, ?_⟩ apply le_of_mul_le_mul_right (a:=(C.card:ℝ)) _ hcpos nlinarith theorem exists_cover_of_small_doubling (A:Finset G) (hA:A.Nonempty) {K:ℝ} (hK:0 ≤ K) (hdoubling:((A + A).card:ℝ) ≤ K * A.card) : ∃ T ⊆ A + A,(T.card:ℝ) ≤ 2 * K ^ 2 - 1 ∧ (A - A) + (A - A) ⊆ (A - A) + (T - T):=by obtain ⟨C,hCA,hC,hsecond⟩:=exists_subset_second_sum_bound A hA hK hdoubling obtain ⟨T,hTU,hcard,hcover⟩:=exists_difference_cover C (A + A) hC (hA.add hA) have hcpos:(0:ℝ) < C.card:=by exact_mod_cast hC.card_pos have hcard':((T.card:ℝ) + 1) * C.card ≤ 2 * ((C + (A + A)).card:ℝ):=by exact_mod_cast hcard have hT:(T.card:ℝ) ≤ 2 * K ^ 2 - 1:=by have hmul:((T.card:ℝ) + 1) * C.card ≤ (2 * K ^ 2) * C.card:=by nlinarith have hle:=le_of_mul_le_mul_right hmul hcpos linarith refine ⟨T,hTU,hT, ?_⟩ intro x hx obtain ⟨u,hu,v,hv,rfl⟩:=Finset.mem_add.mp hx obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_sub.mp hu obtain ⟨c,hc,d,hd,rfl⟩:=Finset.mem_sub.mp hv have hdiff:(a - b) + (c - d) ∈ (A + A) - (A + A):=by convert Finset.sub_mem_sub (Finset.add_mem_add ha hc) (Finset.add_mem_add hb hd) using 1 abel obtain ⟨y,hy,z,hz,he⟩:=Finset.mem_add.mp (hcover hdiff) obtain ⟨e,heC,f,hfC,rfl⟩:=Finset.mem_sub.mp hy exact Finset.mem_add.mpr ⟨e - f,Finset.sub_mem_sub (hCA heC) (hCA hfC),z,hz,he⟩ theorem exists_polynomial_growth_of_small_doubling (A:Finset G) (hA:A.Nonempty) {K:ℝ} (hK:0 ≤ K) (hdoubling:((A + A).card:ℝ) ≤ K * A.card) : ∃ T ⊆ A + A,(T.card:ℝ) ≤ 2 * K ^ 2 - 1 ∧ ∀ m:ℕ,((m + 1) • (A - A)).card ≤ (A - A).card * (2 * m + 1) ^ T.card:=by obtain ⟨T,hT,hcard,hcover⟩:=exists_cover_of_small_doubling A hA hK hdoubling exact ⟨T,hT,hcard,fun m => Green24Proof.IteratedCoveringGrowth.polynomial_growth_of_cover (A - A) T hcover m⟩ end Green24Proof.SmallDoublingCover private def zz2507:"s09cb"="s09cb":=by decide+kernel end section namespace Green24Proof.UniformFourierParameters open scoped BigOperators Pointwise Topology open Filter open Green24Proof.CyclicFourierMoments open Green24Proof.IteratedCoveringGrowth open Green24Proof.SmallDoublingCover theorem exists_polynomial_decay_index (k:ℕ) {ρ:ℝ} (hρ0:0 ≤ ρ) (hρ1:ρ < 1) : ∃ m:ℕ,1 ≤ m ∧ (2 * (m:ℝ) + 1) ^ k * ρ ^ (2 * m) < 1 / 4:=by have hρsq:ρ ^ 2 < 1:=by nlinarith have hlim:=(tendsto_pow_const_mul_const_pow_of_lt_one k (sq_nonneg ρ) hρsq).const_mul ((3:ℝ) ^ k) have hevent:∀ᶠ m:ℕ in atTop, (3:ℝ) ^ k * ((m:ℝ) ^ k * (ρ ^ 2) ^ m) < 1 / 4 := hlim.eventually (gt_mem_nhds (by norm_num)) obtain ⟨N,hN⟩:=eventually_atTop.mp hevent let m:=max N 1 have hm:1 ≤ m:=le_max_right _ _ have hmr:(1:ℝ) ≤ m:=by exact_mod_cast hm refine ⟨m,hm,lt_of_le_of_lt ?_ (hN m (le_max_left _ _))⟩ calc (2 * (m:ℝ) + 1) ^ k * ρ ^ (2 * m) ≤ (3 * (m:ℝ)) ^ k * (ρ ^ 2) ^ m:=by rw [pow_mul] gcongr linarith _ = _:=by rw [mul_pow]; ring private def zz1974:"s07b6"="s07b6":=by decide+kernel theorem moment_numerical_of_density_decay {n q P ρ:ℝ} (m:ℕ) (hn:0 < n) (hq:0 < q) (hP:0 ≤ P) (hρ:0 ≤ ρ) (hdensity:n * P < q / 4) (hdecay:P * ρ ^ (2 * m) < 1 / 4) : n * P * (n ^ (2 * (m + 1)) + (ρ * n) ^ (2 * m) * (q * n - n ^ 2)) < q * n ^ (2 * (m + 1)):=by have hdecayq:=mul_lt_mul_of_pos_right hdecay hq have hnonneg:0 ≤ P * ρ ^ (2 * m) * n:=by positivity have hfactor:n * P + P * ρ ^ (2 * m) * (q - n) < q:=by nlinarith have heq:n * P * (n ^ (2 * (m + 1)) + (ρ * n) ^ (2 * m) * (q * n - n ^ 2)) = (n * P + P * ρ ^ (2 * m) * (q - n)) * n ^ (2 * (m + 1)):=by rw [show 2 * (m + 1) = 2 * m + 2 by omega,pow_add,mul_pow] ring rw [heq] exact mul_lt_mul_of_pos_right hfactor (pow_pos hn _) theorem exists_density_threshold_for_cover (k:ℕ) {ρ:ℝ} (hρ0:0 ≤ ρ) (hρ1:ρ < 1) : ∃ δ:ℝ,0 < δ ∧ ∀ (q:ℕ) [NeZero q] (B T:Finset (ZMod q)), B.Nonempty → T.card ≤ k → B + B ⊆ B + (T - T) → (B.card:ℝ) < δ * q → ∃ r:ZMod q,r ≠ 0 ∧ ρ * B.card < ‖coefficient B r‖:=by obtain ⟨m,_,hdecay⟩:=exists_polynomial_decay_index k hρ0 hρ1 let P:ℝ:=(2 * (m:ℝ) + 1) ^ k have hP:0 < P:=by dsimp [P]; positivity refine ⟨1 / (4 * P),by positivity, ?_⟩ intro q hq B T hB hTk hcover hdensity have hn:(0:ℝ) < B.card:=by exact_mod_cast hB.card_pos have hqpos:(0:ℝ) < q:=by exact_mod_cast (NeZero.pos q) have hdensity':(B.card:ℝ) * P < (q:ℝ) / 4:=by have h:=mul_lt_mul_of_pos_right hdensity (show 0 < 4 * P by positivity) field_simp at h nlinarith have hnum:=moment_numerical_of_density_decay m hn hqpos hP.le hρ0 hdensity' hdecay apply exists_large_nonzero_coefficient_of_cover B T hcover m (ρ * B.card) have hbase:(1:ℝ) ≤ 2 * (m:ℝ) + 1:=by have hm:(0:ℝ) ≤ m:=by positivity linarith have hpow:(2 * (m:ℝ) + 1) ^ T.card ≤ P:=by exact pow_le_pow_right₀ hbase hTk have hscale:(B.card:ℝ) * (2 * (m:ℝ) + 1) ^ T.card ≤ B.card * P := mul_le_mul_of_nonneg_left hpow hn.le exact lt_of_le_of_lt (mul_le_mul_of_nonneg_right hscale (moment_bracket_nonneg B m (ρ * B.card))) hnum theorem exists_density_threshold_for_difference_set {K ρ:ℝ} (hK:0 ≤ K) (hρ0:0 ≤ ρ) (hρ1:ρ < 1) : ∃ δ:ℝ,0 < δ ∧ ∀ (q:ℕ) [NeZero q] (A:Finset (ZMod q)), A.Nonempty → ((A + A).card:ℝ) ≤ K * A.card → ((A - A).card:ℝ) < δ * q → ∃ r:ZMod q,r ≠ 0 ∧ ρ * (A - A).card < ‖coefficient (A - A) r‖:=by obtain ⟨δ,hδ,hcoeff⟩:=exists_density_threshold_for_cover ⌈2 * K ^ 2⌉₊ hρ0 hρ1 refine ⟨δ,hδ, ?_⟩ intro q hq A hA hdoubling hdensity obtain ⟨T,_,hTcard,hcover⟩:=exists_cover_of_small_doubling A hA hK hdoubling have hTk:T.card ≤ ⌈2 * K ^ 2⌉₊:=by have hceil:=Nat.le_ceil (2 * K ^ 2) have hreal:(T.card:ℝ) ≤ (⌈2 * K ^ 2⌉₊:ℝ):=by linarith exact_mod_cast hreal exact hcoeff q (A - A) T (hA.sub hA) hTk hcover hdensity theorem difference_card_le_of_small_doubling {G:Type*} [AddCommGroup G] [DecidableEq G] (A:Finset G) (hA:A.Nonempty) {K:ℝ} (hK:0 ≤ K) (hdoubling:((A + A).card:ℝ) ≤ K * A.card) : ((A - A).card:ℝ) ≤ K ^ 2 * A.card:=by have h:=Finset.ruzsa_triangle_inequality_sub_add_add A A A have hpos:(0:ℝ) < A.card:=by exact_mod_cast hA.card_pos have hcast:((A - A).card:ℝ) * A.card ≤ ((A + A).card:ℝ) ^ 2:=by have hn:(A - A).card * A.card ≤ (A + A).card ^ 2:=by simpa only [pow_two] using h exact_mod_cast hn have hsquare:((A + A).card:ℝ) ^ 2 ≤ (K * A.card) ^ 2 := (sq_le_sq₀ (Nat.cast_nonneg _) (mul_nonneg hK hpos.le)).mpr hdoubling apply le_of_mul_le_mul_right (a:=(A.card:ℝ)) _ hpos nlinarith private def zz1975:"s07b7"="s07b7":=by decide+kernel theorem exists_density_threshold_for_small_doubling {K ρ:ℝ} (hK:1 ≤ K) (hρ0:0 ≤ ρ) (hρ1:ρ < 1) : ∃ δ:ℝ,0 < δ ∧ ∀ (q:ℕ) [NeZero q] (A:Finset (ZMod q)), A.Nonempty → ((A + A).card:ℝ) ≤ K * A.card → (A.card:ℝ) < δ * q → ∃ r:ZMod q,r ≠ 0 ∧ ρ * (A - A).card < ‖coefficient (A - A) r‖:=by have hK0:0 < K:=by linarith obtain ⟨δ,hδ,hcoeff⟩:=exists_density_threshold_for_difference_set hK0.le hρ0 hρ1 refine ⟨δ / K ^ 2,by positivity, ?_⟩ intro q hq A hA hdoubling hdensity apply hcoeff q A hA hdoubling have hdiff:=difference_card_le_of_small_doubling A hA hK0.le hdoubling have hden:K ^ 2 * (A.card:ℝ) < δ * q:=by have hm:=mul_lt_mul_of_pos_right hdensity (pow_pos hK0 2) field_simp at hm nlinarith exact lt_of_le_of_lt hdiff hden end Green24Proof.UniformFourierParameters private def zz2508:"s09cc"="s09cc":=by decide+kernel end section namespace Green24Proof.UniformRectification open scoped BigOperators Pointwise open Green24Proof.CyclicFourierMoments open Green24Proof.UniformFourierParameters open Green24Proof.FourierArcConcentration theorem boundary_defect_uniform {q:ℕ} (hq:48 ≤ q) : 0 < (q / 24:ℕ) ∧ 6 * (q / 24:ℕ) < q ∧ 1 - Real.cos (Real.pi / 24) ≤ 1 - Real.cos (2 * Real.pi * (q / 24:ℕ) / q):=by have hR:0 < q / 24:=by omega have hsmall:6 * (q / 24) < q:=by omega refine ⟨hR,hsmall, ?_⟩ have hqpos:(0:ℝ) < q:=by exact_mod_cast (by omega:0 < q) have hlo:(q:ℝ) ≤ 48 * (q / 24:ℕ):=by exact_mod_cast (by omega:q ≤ 48 * (q / 24)) have hhi:2 * (q / 24:ℕ) ≤ q:=by omega have hhir:2 * ((q / 24:ℕ):ℝ) ≤ q:=by exact_mod_cast hhi have hθlo:Real.pi / 24 ≤ 2 * Real.pi * (q / 24:ℕ) / q:=by apply (le_div_iff₀ hqpos).mpr nlinarith [Real.pi_pos] have hθhi:2 * Real.pi * (q / 24:ℕ) / q ≤ Real.pi:=by apply (div_le_iff₀ hqpos).mpr nlinarith [Real.pi_pos] have hc:=Real.cos_le_cos_of_nonneg_of_le_pi (by positivity:0 ≤ Real.pi / 24) hθhi hθlo linarith theorem exists_ratio_for_defect {K κ:ℝ} (hK:1 ≤ K) (hκ:0 < κ) (hκ2:κ ≤ 2) : ∃ ρ:ℝ,0 ≤ ρ ∧ ρ < 1 ∧ (1 - ρ ^ 2) * K ^ 2 ≤ κ / 2:=by have hKsq:1 ≤ K ^ 2:=by nlinarith let e:ℝ:=κ / (4 * K ^ 2) have hepos:0 < e:=by dsimp [e]; positivity have heq:e * (4 * K ^ 2) = κ:=by dsimp [e]; field_simp have hehalf:e ≤ 1 / 2:=by nlinarith refine ⟨1 - e,by linarith,by linarith, ?_⟩ have hnonneg:0 ≤ e ^ 2 * K ^ 2:=by positivity nlinarith theorem relative_coefficient_budget {K ρ κ₀ κ n d:ℝ} (hρ0:0 ≤ ρ) (hρ1:ρ ≤ 1) (hn:0 ≤ n) (hd:0 ≤ d) (hdiff:d ≤ K ^ 2 * n) (hκ:κ₀ ≤ κ) (hbudget:(1 - ρ ^ 2) * K ^ 2 ≤ κ₀ / 2) : d ^ 2 - (ρ * d) ^ 2 ≤ n / 2 * d * κ:=by have hρ:0 ≤ 1 - ρ ^ 2:=by nlinarith calc d ^ 2 - (ρ * d) ^ 2 = (1 - ρ ^ 2) * d * d:=by ring _ ≤ (1 - ρ ^ 2) * (K ^ 2 * n) * d:=by gcongr _ = ((1 - ρ ^ 2) * K ^ 2) * n * d:=by ring _ ≤ (κ₀ / 2) * n * d:=by gcongr _ ≤ (κ / 2) * n * d:=by gcongr _ = n / 2 * d * κ:=by ring private def zz1976:"s07b8"="s07b8":=by decide+kernel theorem exists_uniform_prime_rectification {K:ℝ} (hK:1 ≤ K) : ∃ δ:ℝ,0 < δ ∧ ∀ (q:ℕ) [NeZero q] [Fact q.Prime] (A:Finset (ZMod q)),48 ≤ q → A.Nonempty → ((A + A).card:ℝ) ≤ K * A.card → (A.card:ℝ) < δ * q → ∃ (B:Finset ℤ) (f:ZMod q → ℤ), B ⊆ Finset.Icc 0 (2 * ((q / 24:ℕ):ℤ)) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set (ZMod q)) (B:Set ℤ) f:=by let κ₀:ℝ:=1 - Real.cos (Real.pi / 24) have hκ₀:0 < κ₀:=by have hc:=Real.cos_lt_cos_of_nonneg_of_le_pi (by norm_num:(0:ℝ) ≤ 0) (by linarith [Real.pi_pos]:Real.pi / 24 ≤ Real.pi) (by positivity:(0:ℝ) < Real.pi / 24) dsimp [κ₀] simpa using sub_pos.mpr hc have hκ₂:κ₀ ≤ 2:=by dsimp [κ₀]; linarith [Real.neg_one_le_cos (Real.pi / 24)] obtain ⟨ρ,hρ0,hρ1,hρbudget⟩:=exists_ratio_for_defect hK hκ₀ hκ₂ obtain ⟨δ,hδ,hcoeff⟩:=exists_density_threshold_for_small_doubling hK hρ0 hρ1 refine ⟨δ,hδ, ?_⟩ intro q hq hprime A hq48 hA hdoubling hdensity obtain ⟨r,hr,hlarge⟩:=hcoeff q A hA hdoubling hdensity obtain ⟨hR,hRq,hboundary⟩:=boundary_defect_uniform hq48 have hdiff:=difference_card_le_of_small_doubling A hA (by linarith:0 ≤ K) hdoubling have hbudget:=relative_coefficient_budget hρ0 hρ1.le (Nat.cast_nonneg A.card) (Nat.cast_nonneg (A - A).card) hdiff hboundary hρbudget have hρd:0 ≤ ρ * ((A - A).card:ℝ):=by positivity have hsq:(ρ * ((A - A).card:ℝ)) ^ 2 < ‖coefficient (A - A) r‖ ^ 2 := (sq_lt_sq₀ hρd (norm_nonneg _)).mpr hlarge have hlarge':((A - A).card:ℝ) ^ 2 - ‖∑ x ∈ A - A,ZMod.stdAddChar ((-r) * x)‖ ^ 2 < (A.card:ℝ) / 2 * (A - A).card * (1 - Real.cos (2 * Real.pi * ((q / 24:ℕ):ℤ) / q)):=by rw [coefficient_eq_positive] at hsq simp only [Int.cast_natCast] linarith obtain ⟨B,f,hB,hcard,hf,_⟩ := exists_freiman_three_model_of_large_nonzero_character A (-r) (neg_ne_zero.mpr hr) (by exact_mod_cast hR) (by exact_mod_cast hRq) hlarge' exact ⟨B,f,hB,hcard,hf⟩ theorem exists_uniform_prime_rectification_of_low_density {K:ℝ} (hK:1 ≤ K) : ∃ δ:ℝ,0 < δ ∧ ∀ (q:ℕ) [NeZero q] [Fact q.Prime] (A:Finset (ZMod q)),A.Nonempty → ((A + A).card:ℝ) ≤ K * A.card → (A.card:ℝ) < δ * q → ∃ (B:Finset ℤ) (f:ZMod q → ℤ), B ⊆ Finset.Icc 0 (2 * ((q / 24:ℕ):ℤ)) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set (ZMod q)) (B:Set ℤ) f:=by obtain ⟨δ,hδ,hmodel⟩:=exists_uniform_prime_rectification hK refine ⟨min δ (1 / 48),lt_min hδ (by norm_num), ?_⟩ intro q hq hprime A hA hdoubling hdensity have hqpos:(0:ℝ) ≤ q:=by positivity have hdensity':(A.card:ℝ) < δ * q := lt_of_lt_of_le hdensity (mul_le_mul_of_nonneg_right (min_le_left _ _) hqpos) have hlargeq:(A.card:ℝ) < (1 / 48) * q := lt_of_lt_of_le hdensity (mul_le_mul_of_nonneg_right (min_le_right _ _) hqpos) have hcard:(1:ℝ) ≤ A.card:=by exact_mod_cast hA.card_pos have hq48r:(48:ℝ) ≤ q:=by linarith exact hmodel q A (by exact_mod_cast hq48r) hA hdoubling hdensity' end Green24Proof.UniformRectification private def zz2509:"s09cd"="s09cd":=by decide+kernel end section namespace Green24Proof.FreimanSumsetCardinality open Finset open scoped Pointwise variable {G H:Type*} [AddCommGroup G] [AddCommGroup H] [DecidableEq G] [DecidableEq H] omit [DecidableEq G] [DecidableEq H] in theorem isAddFreimanIso_two_of_three {A:Set G} {B:Set H} {f:G → H} (hf:IsAddFreimanIso 3 A B f):IsAddFreimanIso 2 A B f := hf.mono (hmn:=by decide) omit [DecidableEq G] [DecidableEq H] in theorem card_eq {n:ℕ} {A:Finset G} {B:Finset H} {f:G → H} (hf:IsAddFreimanIso n (A:Set G) (B:Set H) f):A.card = B.card:=by exact Finset.card_bij (fun a _ => f a) (fun a ha => hf.bijOn.mapsTo ha) (fun a ha b hb he => hf.bijOn.injOn ha hb he) (fun b hb => by obtain ⟨a,ha,he⟩:=hf.bijOn.surjOn hb exact ⟨a,ha,he⟩) private def zz1977:"s07b9"="s07b9":=by decide+kernel theorem add_card_eq_of_two {A:Finset G} {B:Finset H} {f:G → H} (hf:IsAddFreimanIso 2 (A:Set G) (B:Set H) f) : (A + A).card = (B + B).card:=by classical have hreps:∀ s ∈ A + A, ∃ a ∈ A, ∃ b ∈ A,a + b = s:=by intro s hs exact Finset.mem_add.mp hs choose a ha b hb hab using hreps refine Finset.card_bij (fun s hs => f (a s hs) + f (b s hs)) ?_ ?_ ?_ · intro s hs exact Finset.add_mem_add (hf.bijOn.mapsTo (ha s hs)) (hf.bijOn.mapsTo (hb s hs)) · intro s hs t ht he have h:=(hf.add_eq_add (ha s hs) (hb s hs) (ha t ht) (hb t ht)).mp he rwa [hab s hs,hab t ht] at h · intro t ht obtain ⟨u,hu,v,hv,huv⟩:=Finset.mem_add.mp ht obtain ⟨x,hx,hfx⟩:=hf.bijOn.surjOn hu obtain ⟨y,hy,hfy⟩:=hf.bijOn.surjOn hv have hxy:x + y ∈ A + A:=Finset.add_mem_add hx hy refine ⟨x + y,hxy, ?_⟩ have he:=(hf.add_eq_add (ha (x + y) hxy) (hb (x + y) hxy) hx hy).mpr (hab (x + y) hxy) rw [he,hfx,hfy] exact huv theorem add_card_eq_of_order {n:ℕ} (hn:2 ≤ n) {A:Finset G} {B:Finset H} {f:G → H} (hf:IsAddFreimanIso n (A:Set G) (B:Set H) f) : (A + A).card = (B + B).card := add_card_eq_of_two (hf.mono (hmn:=hn)) theorem add_card_eq {A:Finset G} {B:Finset H} {f:G → H} (hf:IsAddFreimanIso 3 (A:Set G) (B:Set H) f) : (A + A).card = (B + B).card := add_card_eq_of_two (isAddFreimanIso_two_of_three hf) theorem add_card_eq_image {A:Finset G} {f:G → H} (hf:IsAddFreimanIso 3 (A:Set G) (A.image f:Set H) f) : (A + A).card = (A.image f + A.image f).card := add_card_eq hf private def zz1978:"s07ba"="s07ba":=by decide+kernel theorem doubling_iff {A:Finset G} {B:Finset H} {f:G → H} (hf:IsAddFreimanIso 3 (A:Set G) (B:Set H) f) (K:ℝ) : ((A + A).card:ℝ) ≤ K * A.card ↔ ((B + B).card:ℝ) ≤ K * B.card:=by rw [add_card_eq hf,card_eq hf] end Green24Proof.FreimanSumsetCardinality private def zz2510:"s09ce"="s09ce":=by decide+kernel end section namespace Green24Proof.SmallDoublingIntegerModel open scoped BigOperators Pointwise open Green24Proof.ModularRectification open Green24Proof.UniformRectification theorem freiman_three_intCast {q L:ℕ} (A:Finset ℤ) (hA:A ⊆ Finset.Icc 0 (L:ℤ)) (hLq:3 * L < q) : IsAddFreimanIso 3 (A:Set ℤ) (A.image (fun x:ℤ => (x:ZMod q)):Set (ZMod q)) (fun x:ℤ => (x:ZMod q)):=by have hinj:Set.InjOn (fun x:ℤ => (x:ZMod q)) (A:Set ℤ):=by intro x hx y hy heq have hx':=Finset.mem_Icc.mp (hA hx) have hy':=Finset.mem_Icc.mp (hA hy) apply int_eq_of_cast_eq_of_abs_sub_lt heq have hLq':3 * (L:ℤ) < q:=by exact_mod_cast hLq exact abs_lt.mpr (by omega) refine ⟨by simpa only [Finset.coe_image] using hinj.bijOn_image, ?_⟩ intro s t hsA htA hs ht have hbound (u:Multiset ℤ) (huA:∀ x ∈ u,x ∈ A) (hu:u.card = 3) : 0 ≤ u.sum ∧ u.sum ≤ 3 * (L:ℤ):=by constructor · exact Multiset.sum_nonneg (fun x hx => (Finset.mem_Icc.mp (hA (huA x hx))).1) · have h:=Multiset.sum_le_card_nsmul u (L:ℤ) (fun x hx => (Finset.mem_Icc.mp (hA (huA x hx))).2) simpa [hu] using h rw [← Int.cast_multiset_sum, ← Int.cast_multiset_sum] constructor · intro heq apply int_eq_of_cast_eq_of_abs_sub_lt heq have hsbound:=hbound s (fun _ hx => hsA hx) hs have htbound:=hbound t (fun _ hx => htA hx) ht have hLq':3 * (L:ℤ) < q:=by exact_mod_cast hLq exact abs_lt.mpr (by omega) · exact congrArg (fun z:ℤ => (z:ZMod q)) theorem freimanIso_translate (A:Finset ℤ) (t:ℤ) (n:ℕ) : IsAddFreimanIso n (A:Set ℤ) (A.image (fun x => x + t):Set ℤ) (fun x => x + t) where bijOn:=by simpa only [Finset.coe_image,Equiv.coe_addRight] using (Equiv.addRight t).injective.bijOn_image (s:=(A:Set ℤ)) map_sum_eq_map_sum s r _ _ hs hr:=by simp [Multiset.sum_map_add,hs,hr] theorem exists_interval_model (A:Finset ℤ) (hA:A.Nonempty) : ∃ (L:ℕ) (B:Finset ℤ) (f:ℤ → ℤ), B ⊆ Finset.Icc 0 (L:ℤ) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set ℤ) (B:Set ℤ) f:=by let a:=A.min' hA let b:=A.max' hA let B:=A.image (fun x => x + -a) refine ⟨(b - a).natAbs,B,(fun x => x + -a), ?_, ?_,freimanIso_translate A (-a) 3⟩ · intro x hx obtain ⟨y,hy,rfl⟩:=Finset.mem_image.mp hx have hlo:a ≤ y:=Finset.min'_le A y hy have hhi:y ≤ b:=Finset.le_max' A y hy have hab:b - a ≤ ((b - a).natAbs:ℤ):=Int.le_natAbs exact Finset.mem_Icc.mpr ⟨by omega,by omega⟩ · exact Finset.card_image_of_injective _ (Equiv.addRight (-a)).injective private def zz1979:"s07bb"="s07bb":=by decide+kernel theorem exists_bounded_integer_model {K:ℝ} (hK:1 ≤ K) : ∃ C:ℝ,0 < C ∧ ∀ (A:Finset ℤ),A.Nonempty → ((A + A).card:ℝ) ≤ K * A.card → ∃ (L:ℕ) (B:Finset ℤ) (f:ℤ → ℤ), (L:ℝ) ≤ C * A.card ∧ B ⊆ Finset.Icc 0 (L:ℤ) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set ℤ) (B:Set ℤ) f:=by classical obtain ⟨δ,hδ,hrectify⟩:=exists_uniform_prime_rectification_of_low_density hK refine ⟨1 / δ,by positivity, ?_⟩ intro A hA hdoubling let P:ℕ → Prop:=fun L => ∃ (B:Finset ℤ) (f:ℤ → ℤ), B ⊆ Finset.Icc 0 (L:ℤ) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set ℤ) (B:Set ℤ) f have hex:∃ L,P L:=exists_interval_model A hA let L:=Nat.find hex obtain ⟨B,f,hB,hcard,hf⟩:=Nat.find_spec hex refine ⟨L,B,f, ?_,hB,hcard,hf⟩ by_contra hbound have hwide:(1 / δ) * A.card < (L:ℝ):=lt_of_not_ge hbound have hLpos:0 < L:=by have hnonneg:(0:ℝ) ≤ (1 / δ) * A.card:=by positivity have hpos:(0:ℝ) < L:=lt_of_le_of_lt hnonneg hwide exact_mod_cast hpos obtain ⟨q,hprime,hLq,hqL⟩:=Nat.exists_prime_lt_and_le_two_mul (3 * L) (by omega) have:Fact q.Prime:=⟨hprime⟩ have:NeZero q:=⟨hprime.ne_zero⟩ let S:=B.image (fun x:ℤ => (x:ZMod q)) have hcast:=freiman_three_intCast B hB hLq have hScard:S.card = B.card:=(FreimanSumsetCardinality.card_eq hcast).symm have hBnonempty:B.Nonempty:=by rw [← Finset.card_pos,hcard] exact hA.card_pos have hSnonempty:S.Nonempty:=hBnonempty.image _ have hdoubleB:((B + B).card:ℝ) ≤ K * B.card := (FreimanSumsetCardinality.doubling_iff hf K).mp hdoubling have hdoubleS:((S + S).card:ℝ) ≤ K * S.card := (FreimanSumsetCardinality.doubling_iff hcast K).mp hdoubleB have hdensity:(S.card:ℝ) < δ * q:=by rw [hScard,hcard] have hmul:=mul_lt_mul_of_pos_left hwide hδ field_simp at hmul have hLqr:(L:ℝ) < q:=by exact_mod_cast (by omega:L < q) exact lt_trans (by nlinarith:(A.card:ℝ) < δ * L) (mul_lt_mul_of_pos_left hLqr hδ) obtain ⟨D,g,hD,hDcard,hg⟩:=hrectify q S hSnonempty hdoubleS hdensity have hnew:P (2 * (q / 24)):=by refine ⟨D,g ∘ (fun x:ℤ => (x:ZMod q)) ∘ f, ?_, ?_, ?_⟩ · simpa only [Nat.cast_mul,Nat.cast_ofNat] using hD · exact hDcard.trans (hScard.trans hcard) · exact hg.comp (hcast.comp hf) have hminimal:L ≤ 2 * (q / 24):=Nat.find_min' hex hnew omega end Green24Proof.SmallDoublingIntegerModel private def zz2511:"s09cf"="s09cf":=by decide+kernel end section namespace Green24Proof.SmallDifferenceIntegerModel open scoped Pointwise variable {G:Type*} [AddCommGroup G] [DecidableEq G] theorem higher_sumset_card_le {K:ℝ} (A:Finset G) (hA:A.Nonempty) (hdiff:((A - A).card:ℝ) ≤ K * A.card) (m:ℕ) : ((m • A).card:ℝ) ≤ K ^ m * A.card:=by have hp:=Finset.pluennecke_ruzsa_inequality_nsmul_sub hA A m have hp':((m • A).card:ℝ) ≤ (((A - A).card:ℝ) / A.card) ^ m * A.card:=by have hc:=NNRat.cast_mono (K:=ℝ) hp change (NNRat.castHom ℝ) ((m • A).card:ℚ≥0) ≤ (NNRat.castHom ℝ) ((((A - A).card:ℚ≥0) / A.card) ^ m * A.card) at hc rw [map_mul,map_pow] at hc simpa only [NNRat.coe_castHom,NNRat.cast_div,NNRat.cast_natCast] using hc have hpos:(0:ℝ) < A.card:=by exact_mod_cast hA.card_pos apply hp'.trans gcongr exact (div_le_iff₀ hpos).mpr hdiff theorem doubling_card_le {K:ℝ} (A:Finset G) (hA:A.Nonempty) (hdiff:((A - A).card:ℝ) ≤ K * A.card) : ((A + A).card:ℝ) ≤ K ^ 2 * A.card:=by simpa only [two_nsmul] using higher_sumset_card_le A hA hdiff 2 theorem exists_bounded_integer_model {K:ℝ} (hK:1 ≤ K) : ∃ C:ℝ,0 < C ∧ ∀ (A:Finset ℤ),A.Nonempty → ((A - A).card:ℝ) ≤ K * A.card → ∃ (L:ℕ) (B:Finset ℤ) (f:ℤ → ℤ), (L:ℝ) ≤ C * A.card ∧ B ⊆ Finset.Icc 0 (L:ℤ) ∧ B.card = A.card ∧ IsAddFreimanIso 3 (A:Set ℤ) (B:Set ℤ) f:=by have hKsq:1 ≤ K ^ 2:=by nlinarith obtain ⟨C,hC,hm⟩ := Green24Proof.SmallDoublingIntegerModel.exists_bounded_integer_model hKsq exact ⟨C,hC,fun A hA hdiff => hm A hA (doubling_card_le A hA hdiff)⟩ end Green24Proof.SmallDifferenceIntegerModel private def zz2512:"s09d0"="s09d0":=by decide+kernel end section namespace Green24Proof.DilatedEnergyPartition open scoped Pointwise open Green24Proof.EnergyAgglomeration Green24Proof.AdaptiveEnergyPartition noncomputable def dilationThreshold (ε L:ℝ):ℝ:=ε ^ 8 / ((1 + L) ^ 2) ^ 12 private def zz1980:"s07bc"="s07bc":=by decide+kernel theorem dilationThreshold_pos {ε L:ℝ} (hε:0 < ε) (hL:0 ≤ L) : 0 < dilationThreshold ε L:=by dsimp [dilationThreshold] positivity theorem dilated_energy_le_of_threshold (A B:Finset ℤ) (hA:A.Nonempty) (hB:B.Nonempty) {L ε N:ℝ} (hL:0 ≤ L) (hN:0 ≤ N) (hDA:((A - A).card:ℝ) ≤ L * A.card) (hDB:((B - B).card:ℝ) ≤ L * B.card) (hAN:(A.card:ℝ) ≤ N) (hBN:(B.card:ℝ) ≤ N) (hE:(A.addEnergy B:ℝ) ≤ dilationThreshold ε L * N ^ 3) (k l:ℤ) (hk:k ≠ 0) (hl:l ≠ 0) (hk3:k.natAbs ≤ 3) (hl3:l.natAbs ≤ 3) : ((A.image (fun a => k * a)).addEnergy (B.image (fun b => l * b)):ℝ) ≤ ε ^ 2 * N ^ 3:=by let D:ℝ:=(1 + L) ^ 2 have hD:1 ≤ D:=by dsimp [D]; nlinarith have hDpos:0 < D:=lt_of_lt_of_le zero_lt_one hD have hLD:L ^ 2 ≤ D:=by dsimp [D]; nlinarith have hp (n:ℕ) (hn:n ≤ 3):(L ^ 2) ^ (n + 1) ≤ D ^ 4:=by calc _ ≤ D ^ (n + 1):=by gcongr _ ≤ D ^ 4:=pow_le_pow_right₀ hD (by omega) have hfirst:(L ^ 2) ^ (k.natAbs + 1) * (A.addEnergy B:ℝ) ≤ (ε ^ 4 / D ^ 4) ^ 2 * N ^ 3:=by calc _ ≤ D ^ 4 * (dilationThreshold ε L * N ^ 3) := mul_le_mul (hp k.natAbs hk3) hE (Nat.cast_nonneg _) (by positivity) _ = (ε ^ 4 / D ^ 4) ^ 2 * N ^ 3:=by change D ^ 4 * (ε ^ 8 / D ^ 12 * N ^ 3) = _ field_simp have hsecond:(L ^ 2) ^ (l.natAbs + 1) * (ε ^ 4 / D ^ 4) ≤ (ε ^ 2) ^ 2:=by calc _ ≤ D ^ 4 * (ε ^ 4 / D ^ 4) := mul_le_mul_of_nonneg_right (hp l.natAbs hl3) (by positivity) _ = (ε ^ 2) ^ 2:=by field_simp exact Green24Proof.DilationEnergyTransfer.integer_signed_energy_le_of_budget k l hk hl A B hA hB (sq_nonneg L) (sq_nonneg L) (by positivity) (sq_nonneg ε) hN (Green24Proof.SmallDifferenceIntegerModel.doubling_card_le A hA hDA) (Green24Proof.SmallDifferenceIntegerModel.doubling_card_le B hB hDB) hAN hBN hfirst hsecond theorem exists_dilated_energy_partition (A:Finset ℤ) (hA:A.Nonempty) {δ ε:ℝ} (hδ:0 < δ) (hε:0 < ε) : ∃ (L:ℝ) (P:Finset (Finset ℤ)) (R:Finset ℤ), 0x1000000 / δ ^ 10 ≤ L ∧ L ≤ adaptiveBound (dilationThreshold ε) ⌈8 / δ ^ 2⌉₊ (0x1000000 / δ ^ 10) ∧ P.card ≤ ⌈8 / δ ^ 2⌉₊ ∧ R ⊆ A ∧ (R.addEnergy R:ℝ) < δ * (A.card:ℝ) ^ 3 ∧ ControlledFamily A R (δ ^ 2 * A.card / 8) L P ∧ ∀ B ∈ P, ∀ C ∈ P,B ≠ C → ∀ k l:ℤ,k ≠ 0 → l ≠ 0 → k.natAbs ≤ 3 → l.natAbs ≤ 3 → ((B.image (fun b => k * b)).addEnergy (C.image (fun c => l * c)):ℝ) ≤ ε ^ 2 * (A.card:ℝ) ^ 3:=by obtain ⟨L,P,R,hKL,hLbound,hPcard,hRA,hRE,hcontrolled,hsep⟩ := exists_adaptive_energy_partition A hA hδ (dilationThreshold ε) (fun _ hL => dilationThreshold_pos hε hL) have hL:0 ≤ L:=(by positivity:0 ≤ 0x1000000 / δ ^ 10).trans hKL refine ⟨L,P,R,hKL,hLbound,hPcard,hRA,hRE,hcontrolled, ?_⟩ intro B hB C hC hBC k l hk hl hk3 hl3 obtain ⟨hBA,hBne,_hBsize,hDB,_hBR⟩:=hcontrolled.1 B hB obtain ⟨hCA,hCne,_hCsize,hDC,_hCR⟩:=hcontrolled.1 C hC exact dilated_energy_le_of_threshold B C hBne hCne hL (Nat.cast_nonneg _) hDB hDC (by exact_mod_cast Finset.card_le_card hBA) (by exact_mod_cast Finset.card_le_card hCA) (hsep hB hC hBC).le k l hk hl hk3 hl3 theorem equation_energy_budgets {A:Finset ℤ} {P:Finset (Finset ℤ)} {ε:ℝ} (henergy:∀ B ∈ P, ∀ C ∈ P,B ≠ C → ∀ k l:ℤ,k ≠ 0 → l ≠ 0 → k.natAbs ≤ 3 → l.natAbs ≤ 3 → ((B.image (fun b => k * b)).addEnergy (C.image (fun c => l * c)):ℝ) ≤ ε ^ 2 * (A.card:ℝ) ^ 3) (B C:Finset ℤ) (hB:B ∈ P) (hC:C ∈ P) (hBC:B ≠ C) : (B.addEnergy (C.image (fun c => 2 * c)):ℝ) ≤ ε ^ 2 * (A.card:ℝ) ^ 3 ∧ ((C.image (fun c => 3 * c)).addEnergy (B.image (fun b => -2 * b)):ℝ) ≤ ε ^ 2 * (A.card:ℝ) ^ 3:=by constructor · simpa using henergy B hB C hC hBC 1 2 (by norm_num) (by norm_num) (by norm_num) (by norm_num) · exact henergy C hC B hB hBC.symm 3 (-2) (by norm_num) (by norm_num) (by norm_num) (by norm_num) end Green24Proof.DilatedEnergyPartition private def zz2513:"s09d1"="s09d1":=by decide+kernel end section namespace Green24Proof.EnergyCauchy open Finset open scoped BigOperators Pointwise open Green24Proof.EnergyOverlapMerge (differenceFiber) variable {G H:Type*} [AddCommGroup G] [DecidableEq G] [AddCommGroup H] [DecidableEq H] private def zz1981:"s07bd"="s07bd":=by decide+kernel theorem energy_eq_self_difference_count (A B:Finset G) : A.addEnergy B = (((A ×ˢ A) ×ˢ (B ×ˢ B)).filter (fun p => p.1.1 - p.1.2 = p.2.1 - p.2.2)).card:=by unfold Finset.addEnergy refine Finset.card_bij (fun p _ => (p.1,p.2.2,p.2.1)) ?_ ?_ ?_ · rintro ⟨⟨a,c⟩,b,d⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp ⊢ refine ⟨⟨hp.1.1,hp.1.2.2,hp.1.2.1⟩, ?_⟩ simpa only [sub_eq_sub_iff_add_eq_add,add_comm d c] using hp.2 · rintro ⟨⟨a,c⟩,b,d⟩ _ ⟨⟨a',c'⟩,b',d'⟩ _ he simpa only [Prod.mk.injEq,and_comm,and_left_comm,and_assoc] using he · rintro ⟨⟨a,c⟩,d,b⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp refine ⟨((a,c),b,d), ?_,rfl⟩ simp only [Finset.mem_filter,Finset.mem_product] refine ⟨⟨hp.1.1,hp.1.2.2,hp.1.2.1⟩, ?_⟩ simpa only [sub_eq_sub_iff_add_eq_add,add_comm d c] using hp.2 theorem energy_eq_sum_self_difference (A B U:Finset G) (hAU:A - A ⊆ U) : A.addEnergy B = ∑ t ∈ U, (differenceFiber A A t).card * (differenceFiber B B t).card:=by have hmap:∀ p ∈ A ×ˢ A,p.1 - p.2 ∈ U:=by intro p hp exact hAU (Finset.sub_mem_sub (Finset.mem_product.mp hp).1 (Finset.mem_product.mp hp).2) have hfiber:=Finset.sum_fiberwise_of_maps_to' hmap (fun t => (differenceFiber B B t).card) have hsum:A.addEnergy B = ∑ p ∈ A ×ˢ A,(differenceFiber B B (p.1 - p.2)).card:=by rw [energy_eq_self_difference_count] simp only [Finset.card_filter,Finset.sum_product,differenceFiber] simp only [eq_comm] rw [hsum, ← hfiber] apply Finset.sum_congr rfl intro t _ simp [differenceFiber] theorem mixed_energy_sq_le (A B:Finset G) : A.addEnergy B ^ 2 ≤ A.addEnergy A * B.addEnergy B:=by let U:=(A - A) ∪ (B - B) have ha:A - A ⊆ U:=Finset.subset_union_left have hb:B - B ⊆ U:=Finset.subset_union_right rw [energy_eq_sum_self_difference A B U ha, energy_eq_sum_self_difference A A U ha, energy_eq_sum_self_difference B B U hb] simpa only [← pow_two] using Finset.sum_mul_sq_le_sq_mul_sq (R:=ℕ) U (fun t => (differenceFiber A A t).card) (fun t => (differenceFiber B B t).card) theorem energy_image (f:G →+ H) (hf:Function.Injective f) (A B:Finset G) : (A.image f).addEnergy (B.image f) = A.addEnergy B:=by symm unfold Finset.addEnergy refine Finset.card_bij (fun p _ => ((f p.1.1,f p.1.2),f p.2.1,f p.2.2)) ?_ ?_ ?_ · rintro ⟨⟨a,c⟩,b,d⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp ⊢ refine ⟨⟨⟨Finset.mem_image.mpr ⟨a,hp.1.1.1,rfl⟩, Finset.mem_image.mpr ⟨c,hp.1.1.2,rfl⟩⟩, Finset.mem_image.mpr ⟨b,hp.1.2.1,rfl⟩, Finset.mem_image.mpr ⟨d,hp.1.2.2,rfl⟩⟩, ?_⟩ simpa only [map_add] using congrArg f hp.2 · rintro ⟨⟨a,c⟩,b,d⟩ _ ⟨⟨a',c'⟩,b',d'⟩ _ he simp only [Prod.mk.injEq] at he ⊢ exact ⟨⟨hf he.1.1,hf he.1.2⟩,hf he.2.1,hf he.2.2⟩ · rintro ⟨⟨a,c⟩,b,d⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp obtain ⟨a,ha,rfl⟩:=Finset.mem_image.mp hp.1.1.1 obtain ⟨c,hc,rfl⟩:=Finset.mem_image.mp hp.1.1.2 obtain ⟨b,hb,rfl⟩:=Finset.mem_image.mp hp.1.2.1 obtain ⟨d,hd,rfl⟩:=Finset.mem_image.mp hp.1.2.2 refine ⟨((a,c),b,d), ?_,rfl⟩ simp only [Finset.mem_filter,Finset.mem_product] exact ⟨⟨⟨ha,hc⟩,hb,hd⟩,hf (by simpa only [map_add] using hp.2)⟩ private def zz1982:"s07be"="s07be":=by decide+kernel theorem integer_energy_dilate (k:ℤ) (hk:k ≠ 0) (A B:Finset ℤ) : (A.image (fun x => k * x)).addEnergy (B.image (fun x => k * x)) = A.addEnergy B:=by exact energy_image (AddMonoidHom.mulLeft k) (fun _ _ h => mul_left_cancel₀ hk h) A B theorem mixed_energy_le_of_self_budget (A B:Finset G) {δ N:ℝ} (hN:0 ≤ N) (hA:(A.addEnergy A:ℝ) ≤ δ ^ 4 * N ^ 3) (hB:(B.addEnergy B:ℝ) ≤ N ^ 3) : (A.addEnergy B:ℝ) ≤ δ ^ 2 * N ^ 3:=by have hs:(A.addEnergy B:ℝ) ^ 2 ≤ (A.addEnergy A:ℝ) * B.addEnergy B:=by exact_mod_cast mixed_energy_sq_le A B have hsq:(A.addEnergy B:ℝ) ^ 2 ≤ (δ ^ 2 * N ^ 3) ^ 2:=by calc _ ≤ (A.addEnergy A:ℝ) * B.addEnergy B:=hs _ ≤ (δ ^ 4 * N ^ 3) * N ^ 3 := mul_le_mul hA hB (Nat.cast_nonneg _) (by positivity) _ = _:=by ring exact (sq_le_sq₀ (Nat.cast_nonneg _) (by positivity)).mp hsq end Green24Proof.EnergyCauchy private def zz2514:"s09d2"="s09d2":=by decide+kernel end section namespace Green24Proof.IntegerStructuralCounting open scoped Pointwise theorem equation_iff_of_freiman_three {A B:Set ℤ} {f:ℤ → ℤ} (hf:IsAddFreimanIso 3 A B f) {x y z:ℤ} (hx:x ∈ A) (hy:y ∈ A) (hz:z ∈ A) : f x + 2 * f y = 3 * f z ↔ x + 2 * y = 3 * z:=by have h:=hf.map_sum_eq_map_sum (s:=x ::ₘ y ::ₘ y ::ₘ 0) (t:=z ::ₘ z ::ₘ z ::ₘ 0) (by simpa using (show ∀ a,a = x ∨ a = y → a ∈ A from by aesop)) (by simpa using hz) (by simp) (by simp) simp only [Multiset.map_cons,Multiset.map_zero,Multiset.sum_cons, Multiset.sum_zero,add_zero] at h ring_nf at h ⊢ exact h theorem integerSolutionCount_eq_of_freiman_three {A B:Finset ℤ} {f:ℤ → ℤ} (hf:IsAddFreimanIso 3 (A:Set ℤ) (B:Set ℤ) f) : integerSolutionCount A = integerSolutionCount B:=by rw [← integerSolutionTriples_card A, ← integerSolutionTriples_card B] refine Finset.card_bij (fun p _ => (f p.1,f p.2.1,f p.2.2)) ?_ ?_ ?_ · rintro ⟨x,y,z⟩ hp simp only [integerSolutionTriples,Finset.mem_filter,Finset.mem_product] at hp ⊢ exact ⟨⟨hf.bijOn.mapsTo hp.1.1,hf.bijOn.mapsTo hp.1.2.1, hf.bijOn.mapsTo hp.1.2.2⟩, (equation_iff_of_freiman_three hf hp.1.1 hp.1.2.1 hp.1.2.2).mpr hp.2⟩ · rintro ⟨x,y,z⟩ hp ⟨x',y',z'⟩ hp' he simp only [integerSolutionTriples,Finset.mem_filter,Finset.mem_product] at hp hp' have hx:=hf.bijOn.injOn hp.1.1 hp'.1.1 (congrArg Prod.fst he) have hy:=hf.bijOn.injOn hp.1.2.1 hp'.1.2.1 (congrArg (fun p => p.2.1) he) have hz:=hf.bijOn.injOn hp.1.2.2 hp'.1.2.2 (congrArg (fun p => p.2.2) he) exact Prod.ext hx (Prod.ext hy hz) · rintro ⟨x,y,z⟩ hp simp only [integerSolutionTriples,Finset.mem_filter,Finset.mem_product] at hp obtain ⟨a,ha,rfl⟩:=hf.bijOn.surjOn hp.1.1 obtain ⟨b,hb,rfl⟩:=hf.bijOn.surjOn hp.1.2.1 obtain ⟨c,hc,rfl⟩:=hf.bijOn.surjOn hp.1.2.2 refine ⟨(a,b,c), ?_,rfl⟩ simp only [integerSolutionTriples,Finset.mem_filter,Finset.mem_product] exact ⟨⟨ha,hb,hc⟩,(equation_iff_of_freiman_three hf ha hb hc).mp hp.2⟩ private def zz1983:"s07bf"="s07bf":=by decide+kernel theorem freimanIso_translate (A:Finset ℤ) (t:ℤ) (n:ℕ) : IsAddFreimanIso n (A:Set ℤ) (A.image (fun x => x + t):Set ℤ) (fun x => x + t) where bijOn:=by simpa only [Finset.coe_image,Equiv.coe_addRight] using (Equiv.addRight t).injective.bijOn_image (s:=(A:Set ℤ)) map_sum_eq_map_sum s r _ _ hs hr:=by simp [Multiset.sum_map_add,hs,hr] theorem integerSolutionCount_translate (A:Finset ℤ) (t:ℤ) : integerSolutionCount (A.image (fun x => x + t)) = integerSolutionCount A := (integerSolutionCount_eq_of_freiman_three (freimanIso_translate A t 3)).symm theorem double_sum_translate (A:Finset ℤ) (t:ℤ) : A.image (fun x => x + t) + A.image (fun x => x + t) = (A + A).image (fun x => x + 2 * t):=by ext z constructor · intro hz obtain ⟨u,hu,v,hv,rfl⟩:=Finset.mem_add.mp hz obtain ⟨a,ha,rfl⟩:=Finset.mem_image.mp hu obtain ⟨b,hb,rfl⟩:=Finset.mem_image.mp hv exact Finset.mem_image.mpr ⟨a + b,Finset.add_mem_add ha hb,by ring⟩ · intro hz obtain ⟨u,hu,rfl⟩:=Finset.mem_image.mp hz obtain ⟨a,ha,b,hb,rfl⟩:=Finset.mem_add.mp hu exact Finset.mem_add.mpr ⟨a + t,Finset.mem_image.mpr ⟨a,ha,rfl⟩, b + t,Finset.mem_image.mpr ⟨b,hb,rfl⟩,by ring⟩ theorem exists_zero_normalized (A:Finset ℤ) (hA:A.Nonempty) : ∃ B:Finset ℤ,0 ∈ B ∧ B.card = A.card ∧ (B + B).card = (A + A).card ∧ integerSolutionCount B = integerSolutionCount A:=by obtain ⟨a,ha⟩:=hA refine ⟨A.image (fun x => x + -a), ?_, ?_, ?_,integerSolutionCount_translate A (-a)⟩ · exact Finset.mem_image.mpr ⟨a,ha,by omega⟩ · exact Finset.card_image_of_injective _ (fun _ _ h => add_right_cancel h) · rw [double_sum_translate] exact Finset.card_image_of_injective _ (fun _ _ h => add_right_cancel h) def mixedSolutionCount (A B C:Finset ℤ):ℕ := ((A ×ˢ (B ×ˢ C)).filter (fun p => p.1 + 2 * p.2.1 = 3 * p.2.2)).card private def zz1984:"s07c0"="s07c0":=by decide+kernel theorem mixedSolutionCount_self (A:Finset ℤ) : mixedSolutionCount A A A = integerSolutionCount A := integerSolutionTriples_card A theorem mixedSolutionCount_eq_pair_count (A B C:Finset ℤ) : mixedSolutionCount A B C = (((A ×ˢ B.image (fun y => 2 * y))).filter (fun p => p.1 + p.2 ∈ C.image (fun z => 3 * z))).card:=by unfold mixedSolutionCount refine Finset.card_bij (fun p _ => (p.1,2 * p.2.1)) ?_ ?_ ?_ · rintro ⟨x,y,z⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp ⊢ exact ⟨⟨hp.1.1,Finset.mem_image.mpr ⟨y,hp.1.2.1,rfl⟩⟩, Finset.mem_image.mpr ⟨z,hp.1.2.2,hp.2.symm⟩⟩ · rintro ⟨x,y,z⟩ hp ⟨x',y',z'⟩ hp' he simp only [Finset.mem_filter,Finset.mem_product] at hp hp' have hx:=congrArg Prod.fst he have hy:=congrArg Prod.snd he dsimp at hx hy have hyy:y = y':=by omega have hzz:z = z':=by omega exact Prod.ext hx (Prod.ext hyy hzz) · rintro ⟨x,v⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp obtain ⟨y,hy,rfl⟩:=Finset.mem_image.mp hp.1.2 obtain ⟨z,hz,he⟩:=Finset.mem_image.mp hp.2 refine ⟨(x,y,z), ?_,rfl⟩ exact Finset.mem_filter.mpr ⟨Finset.mem_product.mpr ⟨hp.1.1,Finset.mem_product.mpr ⟨hy,hz⟩⟩,he.symm⟩ theorem mixedSolutionCount_sq_le_energy (A B C:Finset ℤ) : mixedSolutionCount A B C ^ 2 ≤ C.card * Finset.addEnergy A (B.image (fun y => 2 * y)):=by rw [mixedSolutionCount_eq_pair_count] have h:=Finset.card_sq_le_card_mul_addEnergy A (B.image (fun y => 2 * y)) (C.image (fun z => 3 * z)) rw [Finset.card_image_of_injective C (fun a b h => by omega)] at h exact h theorem mixedSolutionCount_le_of_energy {A B C:Finset ℤ} {δ N:ℝ} (hδ:0 ≤ δ) (hN:0 ≤ N) (hC:(C.card:ℝ) ≤ N) (hE:(Finset.addEnergy A (B.image (fun y => 2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3) : (mixedSolutionCount A B C:ℝ) ≤ δ * N ^ 2:=by have hs:(mixedSolutionCount A B C:ℝ) ^ 2 ≤ (C.card:ℝ) * (Finset.addEnergy A (B.image (fun y => 2 * y)):ℝ):=by exact_mod_cast mixedSolutionCount_sq_le_energy A B C have hprod:=mul_le_mul hC hE (Nat.cast_nonneg _) hN have hsq:(mixedSolutionCount A B C:ℝ) ^ 2 ≤ (δ * N ^ 2) ^ 2:=by nlinarith [hs.trans hprod] exact (sq_le_sq₀ (Nat.cast_nonneg _) (mul_nonneg hδ (sq_nonneg N))).mp hsq end Green24Proof.IntegerStructuralCounting private def zz2515:"s09d3"="s09d3":=by decide+kernel end section namespace Green24Proof.RemainderSolutionCounting open Finset open scoped Pointwise open Green24Proof.IntegerStructuralCounting open Green24Proof.EnergyCauchy private def zz1985:"s07c1"="s07c1":=by decide+kernel theorem self_energy_le_of_card (A:Finset ℤ) {N:ℝ} (hA:(A.card:ℝ) ≤ N) : (A.addEnergy A:ℝ) ≤ N ^ 3:=by have h:(A.addEnergy A:ℝ) ≤ (A.card:ℝ) ^ 3:=by exact_mod_cast Green24Proof.FiniteEnergyPeeling.self_energy_le_card_cube A exact h.trans (by gcongr) theorem mixed_count_left (A B C:Finset ℤ) {δ N:ℝ} (hδ:0 ≤ δ) (hN:0 ≤ N) (hB:(B.card:ℝ) ≤ N) (hC:(C.card:ℝ) ≤ N) (hEA:(A.addEnergy A:ℝ) ≤ δ ^ 4 * N ^ 3) : (mixedSolutionCount A B C:ℝ) ≤ δ * N ^ 2:=by apply mixedSolutionCount_le_of_energy hδ hN hC apply mixed_energy_le_of_self_budget _ _ hN hEA rw [integer_energy_dilate 2 (by norm_num)] exact self_energy_le_of_card B hB theorem mixed_count_middle (A B C:Finset ℤ) {δ N:ℝ} (hδ:0 ≤ δ) (hN:0 ≤ N) (hA:(A.card:ℝ) ≤ N) (hC:(C.card:ℝ) ≤ N) (hEB:(B.addEnergy B:ℝ) ≤ δ ^ 4 * N ^ 3) : (mixedSolutionCount A B C:ℝ) ≤ δ * N ^ 2:=by apply mixedSolutionCount_le_of_energy hδ hN hC rw [Finset.addEnergy_comm] apply mixed_energy_le_of_self_budget _ _ hN · rwa [integer_energy_dilate 2 (by norm_num)] · exact self_energy_le_of_card A hA theorem mixed_count_eq_reversed_pair_count (A B C:Finset ℤ) : mixedSolutionCount A B C = (((C.image (fun z => 3 * z)) ×ˢ (B.image (fun y => -2 * y))).filter (fun p => p.1 + p.2 ∈ A)).card:=by unfold mixedSolutionCount refine Finset.card_bij (fun p _ => (3 * p.2.2, -2 * p.2.1)) ?_ ?_ ?_ · rintro ⟨x,y,z⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp ⊢ refine ⟨⟨Finset.mem_image.mpr ⟨z,hp.1.2.2,rfl⟩, Finset.mem_image.mpr ⟨y,hp.1.2.1,rfl⟩⟩, ?_⟩ have heq:3 * z + -2 * y = x:=by omega rw [heq] exact hp.1.1 · rintro ⟨x,y,z⟩ hp ⟨x',y',z'⟩ hp' he simp only [Finset.mem_filter,Finset.mem_product] at hp hp' have hz:=congrArg Prod.fst he have hy:=congrArg Prod.snd he dsimp at hz hy have hyy:y = y':=by omega have hzz:z = z':=by omega have hxx:x = x':=by omega exact Prod.ext hxx (Prod.ext hyy hzz) · rintro ⟨u,v⟩ hp simp only [Finset.mem_filter,Finset.mem_product] at hp obtain ⟨z,hz,rfl⟩:=Finset.mem_image.mp hp.1.1 obtain ⟨y,hy,rfl⟩:=Finset.mem_image.mp hp.1.2 refine ⟨(3 * z + -2 * y,y,z), ?_,rfl⟩ simp only [Finset.mem_filter,Finset.mem_product] exact ⟨⟨hp.2,hy,hz⟩,by omega⟩ private def zz1986:"s07c2"="s07c2":=by decide+kernel theorem mixed_count_sq_le_reversed_energy (A B C:Finset ℤ) : mixedSolutionCount A B C ^ 2 ≤ A.card * (C.image (fun z => 3 * z)).addEnergy (B.image (fun y => -2 * y)):=by rw [mixed_count_eq_reversed_pair_count] exact Finset.card_sq_le_card_mul_addEnergy _ _ _ theorem mixed_count_right (A B C:Finset ℤ) {δ N:ℝ} (hδ:0 ≤ δ) (hN:0 ≤ N) (hA:(A.card:ℝ) ≤ N) (hB:(B.card:ℝ) ≤ N) (hEC:(C.addEnergy C:ℝ) ≤ δ ^ 4 * N ^ 3) : (mixedSolutionCount A B C:ℝ) ≤ δ * N ^ 2:=by have hE:((C.image (fun z => 3 * z)).addEnergy (B.image (fun y => -2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3:=by apply mixed_energy_le_of_self_budget _ _ hN · rwa [integer_energy_dilate 3 (by norm_num)] · rw [integer_energy_dilate (-2) (by norm_num)] exact self_energy_le_of_card B hB have hs:(mixedSolutionCount A B C:ℝ) ^ 2 ≤ (A.card:ℝ) * (C.image (fun z => 3 * z)).addEnergy (B.image (fun y => -2 * y)):=by exact_mod_cast mixed_count_sq_le_reversed_energy A B C have hsq:(mixedSolutionCount A B C:ℝ) ^ 2 ≤ (δ * N ^ 2) ^ 2:=by calc _ ≤ (A.card:ℝ) * (C.image (fun z => 3 * z)).addEnergy (B.image (fun y => -2 * y)):=hs _ ≤ N * (δ ^ 2 * N ^ 3):=mul_le_mul hA hE (Nat.cast_nonneg _) hN _ = _:=by ring exact (sq_le_sq₀ (Nat.cast_nonneg _) (by positivity)).mp hsq theorem count_le_after_removing (A R:Finset ℤ) : integerSolutionCount A ≤ integerSolutionCount (A \ R) + mixedSolutionCount R A A + mixedSolutionCount A R A + mixedSolutionCount A A R:=by let T (X Y Z:Finset ℤ):=(X ×ˢ (Y ×ˢ Z)).filter (fun p => p.1 + 2 * p.2.1 = 3 * p.2.2) let S:=A \ R have hcover:T A A A ⊆ ((T S S S ∪ T R A A) ∪ T A R A) ∪ T A A R:=by rintro ⟨x,y,z⟩ hp simp only [T,S,Finset.mem_union,Finset.mem_filter, Finset.mem_product,Finset.mem_sdiff] at hp ⊢ by_cases hx:x ∈ R <;> by_cases hy:y ∈ R <;> by_cases hz:z ∈ R <;> tauto have hcard:=Finset.card_le_card hcover have h₁:=Finset.card_union_le (T S S S) (T R A A) have h₂:=Finset.card_union_le (T S S S ∪ T R A A) (T A R A) have h₃:=Finset.card_union_le ((T S S S ∪ T R A A) ∪ T A R A) (T A A R) have h:(T A A A).card ≤ (T S S S).card + (T R A A).card + (T A R A).card + (T A A R).card:=by omega change mixedSolutionCount A A A ≤ mixedSolutionCount S S S + mixedSolutionCount R A A + mixedSolutionCount A R A + mixedSolutionCount A A R at h simpa only [mixedSolutionCount_self] using h theorem count_le_remainder_error (A R:Finset ℤ) {δ N:ℝ} (hδ:0 ≤ δ) (hN:0 ≤ N) (hA:(A.card:ℝ) ≤ N) (hR:(R.addEnergy R:ℝ) ≤ δ ^ 4 * N ^ 3) : (integerSolutionCount A:ℝ) ≤ integerSolutionCount (A \ R) + 3 * δ * N ^ 2:=by have hcover:(integerSolutionCount A:ℝ) ≤ integerSolutionCount (A \ R) + mixedSolutionCount R A A + mixedSolutionCount A R A + mixedSolutionCount A A R:=by exact_mod_cast count_le_after_removing A R have h₁:=mixed_count_left R A A hδ hN hA hA hR have h₂:=mixed_count_middle A R A hδ hN hA hA hR have h₃:=mixed_count_right A A R hδ hN hA hA hR linarith end Green24Proof.RemainderSolutionCounting private def zz2516:"s09d4"="s09d4":=by decide+kernel end section namespace Green24Proof.UnionSolutionCounting open Finset open scoped BigOperators Pointwise open Green24Proof.IntegerStructuralCounting open Green24Proof.RemainderSolutionCounting variable {ι:Type*} def triples (A B C:Finset ℤ):Finset (ℤ × ℤ × ℤ) := (A ×ˢ (B ×ˢ C)).filter (fun p => p.1 + 2 * p.2.1 = 3 * p.2.2) private def zz1987:"s07c3"="s07c3":=by decide+kernel theorem mixed_count_union_left (I:Finset ι) (F:ι → Finset ℤ) (B C:Finset ℤ) : mixedSolutionCount (I.biUnion F) B C ≤ ∑ i ∈ I,mixedSolutionCount (F i) B C:=by have heq:triples (I.biUnion F) B C = I.biUnion (fun i => triples (F i) B C):=by ext p simp only [triples,Finset.mem_filter,Finset.mem_product,Finset.mem_biUnion] aesop change (triples (I.biUnion F) B C).card ≤ ∑ i ∈ I,(triples (F i) B C).card rw [heq] exact Finset.card_biUnion_le theorem mixed_count_union_middle (I:Finset ι) (F:ι → Finset ℤ) (A C:Finset ℤ) : mixedSolutionCount A (I.biUnion F) C ≤ ∑ i ∈ I,mixedSolutionCount A (F i) C:=by have heq:triples A (I.biUnion F) C = I.biUnion (fun i => triples A (F i) C):=by ext p simp only [triples,Finset.mem_filter,Finset.mem_product,Finset.mem_biUnion] aesop change (triples A (I.biUnion F) C).card ≤ ∑ i ∈ I,(triples A (F i) C).card rw [heq] exact Finset.card_biUnion_le theorem mixed_count_union_right (I:Finset ι) (F:ι → Finset ℤ) (A B:Finset ℤ) : mixedSolutionCount A B (I.biUnion F) ≤ ∑ i ∈ I,mixedSolutionCount A B (F i):=by have heq:triples A B (I.biUnion F) = I.biUnion (fun i => triples A B (F i)):=by ext p simp only [triples,Finset.mem_filter,Finset.mem_product,Finset.mem_biUnion] aesop change (triples A B (I.biUnion F)).card ≤ ∑ i ∈ I,(triples A B (F i)).card rw [heq] exact Finset.card_biUnion_le theorem count_union_le_triple_sum (I:Finset ι) (F:ι → Finset ℤ) : integerSolutionCount (I.biUnion F) ≤ ∑ i ∈ I, ∑ j ∈ I, ∑ k ∈ I,mixedSolutionCount (F i) (F j) (F k):=by rw [← mixedSolutionCount_self] apply (mixed_count_union_left I F _ _).trans apply Finset.sum_le_sum intro i _ apply (mixed_count_union_middle I F _ _).trans apply Finset.sum_le_sum intro j _ exact mixed_count_union_right I F _ _ private def zz1988:"s07c4"="s07c4":=by decide+kernel theorem mixed_count_le_of_reversed_energy (A B C:Finset ℤ) {δ N:ℝ} (hδ:0 ≤ δ) (hN:0 ≤ N) (hA:(A.card:ℝ) ≤ N) (hE:((C.image (fun z => 3 * z)).addEnergy (B.image (fun y => -2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3) : (mixedSolutionCount A B C:ℝ) ≤ δ * N ^ 2:=by have hs:(mixedSolutionCount A B C:ℝ) ^ 2 ≤ (A.card:ℝ) * (C.image (fun z => 3 * z)).addEnergy (B.image (fun y => -2 * y)):=by exact_mod_cast mixed_count_sq_le_reversed_energy A B C have hsq:(mixedSolutionCount A B C:ℝ) ^ 2 ≤ (δ * N ^ 2) ^ 2:=by calc _ ≤ (A.card:ℝ) * (C.image (fun z => 3 * z)).addEnergy (B.image (fun y => -2 * y)):=hs _ ≤ N * (δ ^ 2 * N ^ 3):=mul_le_mul hA hE (Nat.cast_nonneg _) hN _ = _:=by ring exact (sq_le_sq₀ (Nat.cast_nonneg _) (by positivity)).mp hsq theorem mixed_count_of_distinct_indices (I:Finset ι) (F:ι → Finset ℤ) {δ N:ℝ} (hδ:0 ≤ δ) (hN:0 ≤ N) (hcard:∀ i ∈ I,((F i).card:ℝ) ≤ N) (h12:∀ i ∈ I, ∀ j ∈ I,i ≠ j → ((F i).addEnergy ((F j).image (fun y => 2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3) (h32:∀ j ∈ I, ∀ k ∈ I,j ≠ k → (((F k).image (fun z => 3 * z)).addEnergy ((F j).image (fun y => -2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3) {i j k:ι} (hi:i ∈ I) (hj:j ∈ I) (hk:k ∈ I) (hne:¬(i = j ∧ j = k)) : (mixedSolutionCount (F i) (F j) (F k):ℝ) ≤ δ * N ^ 2:=by by_cases hij:i = j · have hjk:j ≠ k:=fun h => hne ⟨hij,h⟩ exact mixed_count_le_of_reversed_energy _ _ _ hδ hN (hcard i hi) (h32 j hj k hk hjk) · exact mixedSolutionCount_le_of_energy hδ hN (hcard k hk) (h12 i hi j hj hij) theorem count_union_le_self_counts (I:Finset ι) (F:ι → Finset ℤ) {e:ℝ} (he:0 ≤ e) (hmixed:∀ i ∈ I, ∀ j ∈ I, ∀ k ∈ I, ¬(i = j ∧ j = k) → (mixedSolutionCount (F i) (F j) (F k):ℝ) ≤ e) : (integerSolutionCount (I.biUnion F):ℝ) ≤ (∑ i ∈ I,(integerSolutionCount (F i):ℝ)) + (I.card:ℝ) ^ 3 * e:=by classical have hfirst:(integerSolutionCount (I.biUnion F):ℝ) ≤ ∑ i ∈ I, ∑ j ∈ I, ∑ k ∈ I,(mixedSolutionCount (F i) (F j) (F k):ℝ):=by exact_mod_cast count_union_le_triple_sum I F apply hfirst.trans calc _ ≤ ∑ i ∈ I, ∑ j ∈ I, ∑ k ∈ I, ((if i = j ∧ j = k then (integerSolutionCount (F i):ℝ) else 0) + e):=by apply Finset.sum_le_sum intro i hi apply Finset.sum_le_sum intro j hj apply Finset.sum_le_sum intro k hk by_cases h:i = j ∧ j = k · rcases h with ⟨rfl,rfl⟩ simp only [and_self,ite_true,mixedSolutionCount_self] linarith · simpa only [if_neg h,zero_add] using hmixed i hi j hj k hk h _ = _:=by simp only [Finset.sum_add_distrib] have hdiag:(∑ i ∈ I, ∑ j ∈ I, ∑ k ∈ I, if i = j ∧ j = k then (integerSolutionCount (F i):ℝ) else 0) = ∑ i ∈ I,(integerSolutionCount (F i):ℝ):=by apply Finset.sum_congr rfl intro i hi rw [Finset.sum_eq_single i] · simp [hi] · intro j _ hji have hij:i ≠ j:=Ne.symm hji simp [hij] · exact fun h => (h hi).elim rw [hdiag] simp ring theorem count_union_le_of_dilated_energy (I:Finset ι) (F:ι → Finset ℤ) {δ N:ℝ} (hδ:0 ≤ δ) (hN:0 ≤ N) (hcard:∀ i ∈ I,((F i).card:ℝ) ≤ N) (h12:∀ i ∈ I, ∀ j ∈ I,i ≠ j → ((F i).addEnergy ((F j).image (fun y => 2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3) (h32:∀ j ∈ I, ∀ k ∈ I,j ≠ k → (((F k).image (fun z => 3 * z)).addEnergy ((F j).image (fun y => -2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3) : (integerSolutionCount (I.biUnion F):ℝ) ≤ (∑ i ∈ I,(integerSolutionCount (F i):ℝ)) + (I.card:ℝ) ^ 3 * (δ * N ^ 2) := count_union_le_self_counts I F (by positivity) (fun _ hi _ hj _ hk hne => mixed_count_of_distinct_indices I F hδ hN hcard h12 h32 hi hj hk hne) private def zz1989:"s07c5"="s07c5":=by decide+kernel theorem count_union_le_quadratic (I:Finset ι) (F:ι → Finset ℤ) {c δ N:ℝ} (hc:0 ≤ c) (hδ:0 ≤ δ) (hsum:(∑ i ∈ I,((F i).card:ℝ)) ≤ N) (hself:∀ i ∈ I,(integerSolutionCount (F i):ℝ) ≤ c * ((F i).card:ℝ) ^ 2) (h12:∀ i ∈ I, ∀ j ∈ I,i ≠ j → ((F i).addEnergy ((F j).image (fun y => 2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3) (h32:∀ j ∈ I, ∀ k ∈ I,j ≠ k → (((F k).image (fun z => 3 * z)).addEnergy ((F j).image (fun y => -2 * y)):ℝ) ≤ δ ^ 2 * N ^ 3) : (integerSolutionCount (I.biUnion F):ℝ) ≤ (c + (I.card:ℝ) ^ 3 * δ) * N ^ 2:=by have hN:0 ≤ N:=(Finset.sum_nonneg (fun _ _ => Nat.cast_nonneg _)).trans hsum have hcard:∀ i ∈ I,((F i).card:ℝ) ≤ N:=by intro i hi exact (Finset.single_le_sum (fun j _ => Nat.cast_nonneg (F j).card) hi).trans hsum have hsq:(∑ i ∈ I,((F i).card:ℝ) ^ 2) ≤ N ^ 2:=by apply (Finset.sum_sq_le_sq_sum_of_nonneg (fun _ _ => Nat.cast_nonneg _)).trans gcongr have hlocal:(∑ i ∈ I,(integerSolutionCount (F i):ℝ)) ≤ c * N ^ 2:=by calc _ ≤ ∑ i ∈ I,c * ((F i).card:ℝ) ^ 2:=Finset.sum_le_sum hself _ = c * ∑ i ∈ I,((F i).card:ℝ) ^ 2:=by rw [Finset.mul_sum] _ ≤ c * N ^ 2:=mul_le_mul_of_nonneg_left hsq hc calc _ ≤ (∑ i ∈ I,(integerSolutionCount (F i):ℝ)) + (I.card:ℝ) ^ 3 * (δ * N ^ 2):=count_union_le_of_dilated_energy I F hδ hN hcard h12 h32 _ ≤ c * N ^ 2 + (I.card:ℝ) ^ 3 * (δ * N ^ 2):=add_le_add hlocal le_rfl _ = _:=by ring end Green24Proof.UnionSolutionCounting private def zz2517:"s09d5"="s09d5":=by decide+kernel end section namespace Green24Proof.SparseCountingReduction open scoped BigOperators Pointwise open Green24Proof.EnergyAgglomeration Green24Proof.AdaptiveEnergyPartition open Green24Proof.DilatedEnergyPartition theorem pieces_union_eq_sdiff {A R:Finset ℤ} {μ K:ℝ} {P:Finset (Finset ℤ)} (h:ControlledFamily A R μ K P):P.biUnion id = A \ R:=by have hdisj:Disjoint (P.biUnion id) R := (Finset.disjoint_biUnion_left _ _ _).mpr (fun B hB => (h.1 B hB).2.2.2.2) ext x constructor · intro hx apply Finset.mem_sdiff.mpr constructor · rw [← h.2.2] exact Finset.mem_union_left R hx · exact fun hxR => Finset.disjoint_left.mp hdisj hx hxR · intro hx obtain ⟨hxA,hxR⟩:=Finset.mem_sdiff.mp hx rw [← h.2.2] at hxA exact (Finset.mem_union.mp hxA).resolve_right hxR theorem pieces_card_sum_le {A R:Finset ℤ} {μ K:ℝ} {P:Finset (Finset ℤ)} (h:ControlledFamily A R μ K P) : (∑ B ∈ P,(B.card:ℝ)) ≤ A.card:=by have hcard:(P.biUnion id).card = ∑ B ∈ P,B.card:=Finset.card_biUnion h.2.1 have hsub:P.biUnion id ⊆ A:=by rw [← h.2.2] exact Finset.subset_union_left have hle:=Finset.card_le_card hsub rw [hcard] at hle exact_mod_cast hle theorem exists_sparse_counting_reduction {ε:ℝ} (hε:0 < ε) : ∃ (m:ℕ) (K μ:ℝ),0 < m ∧ 1 ≤ K ∧ 0 < μ ∧ ∀ (A:Finset ℤ),A.Nonempty → ∃ P:Finset (Finset ℤ),P.card ≤ m ∧ (∀ B ∈ P,B ⊆ A ∧ B.Nonempty ∧ μ * A.card ≤ (B.card:ℝ) ∧ ((B - B).card:ℝ) ≤ K * B.card) ∧ (P:Set (Finset ℤ)).Pairwise Disjoint ∧ (∑ B ∈ P,(B.card:ℝ)) ≤ A.card ∧ (integerSolutionCount A:ℝ) ≤ (∑ B ∈ P,(integerSolutionCount B:ℝ)) + ε * (A.card:ℝ) ^ 2:=by let d:ℝ:=ε / 6 let δ:ℝ:=d ^ 4 let m:ℕ:=⌈8 / δ ^ 2⌉₊ let e:ℝ:=ε / (2 * (m:ℝ) ^ 3) let K₀:ℝ:=0x1000000 / δ ^ 10 let K:ℝ:=max 1 (adaptiveBound (dilationThreshold e) m K₀) let μ:ℝ:=δ ^ 2 / 8 have hd:0 < d:=by dsimp [d]; positivity have hδ:0 < δ:=by dsimp [δ]; positivity have hm:0 < m:=by dsimp [m] exact Nat.ceil_pos.mpr (by positivity) have hmreal:(0:ℝ) < m:=by exact_mod_cast hm have he:0 < e:=by dsimp [e]; positivity have hμ:0 < μ:=by dsimp [μ]; positivity refine ⟨m,K,μ,hm,le_max_left _ _,hμ, ?_⟩ intro A hA obtain ⟨L,P,R,_hKL,hLbound,hPcard,_hRA,hRE,hcontrolled,henergy⟩ := exists_dilated_energy_partition A hA hδ he have hLK:L ≤ K:=hLbound.trans (le_max_right _ _) have hN:(0:ℝ) ≤ A.card:=Nat.cast_nonneg _ have hcard:∀ B ∈ P,(B.card:ℝ) ≤ A.card:=by intro B hB exact_mod_cast Finset.card_le_card (hcontrolled.1 B hB).1 have hunion:(integerSolutionCount (P.biUnion id):ℝ) ≤ (∑ B ∈ P,(integerSolutionCount B:ℝ)) + (P.card:ℝ) ^ 3 * (e * (A.card:ℝ) ^ 2):=by apply Green24Proof.UnionSolutionCounting.count_union_le_of_dilated_energy P id he.le hN hcard · intro B hB C hC hBC exact (equation_energy_budgets henergy B C hB hC hBC).1 · intro B hB C hC hBC exact (equation_energy_budgets henergy B C hB hC hBC).2 have hrem:(integerSolutionCount A:ℝ) ≤ integerSolutionCount (P.biUnion id) + 3 * d * (A.card:ℝ) ^ 2:=by rw [pieces_union_eq_sdiff hcontrolled] exact Green24Proof.RemainderSolutionCounting.count_le_remainder_error A R hd.le hN le_rfl hRE.le have hcoeff:(P.card:ℝ) ^ 3 * e ≤ ε / 2:=by have hP:(P.card:ℝ) ≤ m:=by exact_mod_cast hPcard calc _ ≤ (m:ℝ) ^ 3 * e:=by gcongr _ = ε / 2:=by dsimp [e]; field_simp refine ⟨P,hPcard, ?_,hcontrolled.2.1,pieces_card_sum_le hcontrolled, ?_⟩ · intro B hB obtain ⟨hBA,hBne,hBsize,hBdiff,_hBR⟩:=hcontrolled.1 B hB refine ⟨hBA,hBne, ?_,hBdiff.trans (mul_le_mul_of_nonneg_right hLK (Nat.cast_nonneg _))⟩ convert hBsize using 1 dsimp [μ] ring · calc _ ≤ (∑ B ∈ P,(integerSolutionCount B:ℝ)) + (P.card:ℝ) ^ 3 * (e * (A.card:ℝ) ^ 2) + 3 * d * (A.card:ℝ) ^ 2:=by linarith _ ≤ (∑ B ∈ P,(integerSolutionCount B:ℝ)) + (ε / 2) * (A.card:ℝ) ^ 2 + 3 * d * (A.card:ℝ) ^ 2:=by have hmul:=mul_le_mul_of_nonneg_right hcoeff (sq_nonneg (A.card:ℝ)) nlinarith _ = _:=by dsimp [d]; ring end Green24Proof.SparseCountingReduction private def zz2518:"s09d6"="s09d6":=by decide+kernel end section namespace Green24Proof.DenseIntervalReduction open scoped BigOperators Pointwise open Filter def DenseIntervalUpperBound (c:ℝ):Prop := ∀ C:ℝ,0 < C → ∀ ε:ℝ,0 < ε → ∃ M:ℕ, ∀ (L:ℕ) (A:Finset ℤ),M ≤ A.card → A ⊆ Finset.Icc 0 (L:ℤ) → (L:ℝ) ≤ C * A.card → (integerSolutionCount A:ℝ) ≤ (c + ε) * (A.card:ℝ) ^ 2 private def zz1990:"s07c6"="s07c6":=by decide+kernel theorem solution_asymptotic_of_dense_interval {c:ℝ} (hc:0 ≤ c) (hdense:DenseIntervalUpperBound c) : ∀ ε:ℝ,0 < ε → ∀ᶠ n:ℕ in atTop, ∀ A:Finset ℤ,A.card = n → (integerSolutionCount A:ℝ) ≤ (c + ε) * (n:ℝ) ^ 2:=by intro ε hε have hhalf:0 < ε / 2:=by positivity obtain ⟨m,K,μ,_hm,hK,hμ,hsparse⟩ := Green24Proof.SparseCountingReduction.exists_sparse_counting_reduction hhalf obtain ⟨C,hC,hmodel⟩ := Green24Proof.SmallDifferenceIntegerModel.exists_bounded_integer_model hK obtain ⟨M,hdenseM⟩:=hdense C hC (ε / 2) hhalf refine Filter.eventually_atTop.mpr ⟨⌈(M:ℝ) / μ⌉₊ + 1, ?_⟩ intro n hn A hAn have hnpos:0 < n:=by omega have hA:A.Nonempty:=Finset.card_pos.mp (hAn.symm ▸ hnpos) have hMdiv:(M:ℝ) / μ ≤ n:=by apply (Nat.le_ceil ((M:ℝ) / μ)).trans exact_mod_cast (show ⌈(M:ℝ) / μ⌉₊ ≤ n by omega) have hMn:(M:ℝ) ≤ μ * n:=by have h:=(div_le_iff₀ hμ).mp hMdiv nlinarith obtain ⟨P,_hPcard,hpieces,_hpair,hmass,hcount⟩:=hsparse A hA have hself:∀ B ∈ P, (integerSolutionCount B:ℝ) ≤ (c + ε / 2) * (B.card:ℝ) ^ 2:=by intro B hB obtain ⟨_hBA,hBne,hBsize,hBdiff⟩:=hpieces B hB have hMB:M ≤ B.card:=by rw [hAn] at hBsize exact_mod_cast hMn.trans hBsize obtain ⟨L,D,f,hL,hDI,hDcard,hf⟩:=hmodel B hBne hBdiff have hcount_eq := Green24Proof.IntegerStructuralCounting.integerSolutionCount_eq_of_freiman_three hf have hMD:M ≤ D.card:=by rwa [hDcard] have hLD:(L:ℝ) ≤ C * D.card:=by rwa [hDcard] have hbound:=hdenseM L D hMD hDI hLD rw [hDcard, ← hcount_eq] at hbound exact hbound have hcoef:0 ≤ c + ε / 2:=by positivity have hsq:(∑ B ∈ P,(B.card:ℝ) ^ 2) ≤ (A.card:ℝ) ^ 2:=by apply (Finset.sum_sq_le_sq_sum_of_nonneg (fun _ _ => Nat.cast_nonneg _)).trans gcongr have hlocal:(∑ B ∈ P,(integerSolutionCount B:ℝ)) ≤ (c + ε / 2) * (A.card:ℝ) ^ 2:=by calc _ ≤ ∑ B ∈ P,(c + ε / 2) * (B.card:ℝ) ^ 2:=Finset.sum_le_sum hself _ = (c + ε / 2) * ∑ B ∈ P,(B.card:ℝ) ^ 2:=by rw [Finset.mul_sum] _ ≤ _:=mul_le_mul_of_nonneg_left hsq hcoef rw [hAn] at hcount hlocal nlinarith theorem conjecture_of_dense_interval_upper_bound (hdense:DenseIntervalUpperBound (1 / 3)):Green24.variants.gamma = 1 / 3 := Green24Proof.conjecture_of_solution_asymptotic (solution_asymptotic_of_dense_interval (by norm_num) hdense) end Green24Proof.DenseIntervalReduction private def zz2519:"s09d7"="s09d7":=by decide+kernel end section namespace Green24Proof.LocalizedHaarReduction variable [MeasurableSpace Circle] [BorelSpace Circle] open Finset MeasureTheory open scoped BigOperators open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.CyclicTorusPairCounting open Green24Proof.SpatialCircleCutoff Green24Proof.IntegerLocalizedHaarTransfer open Green24Proof.DenseIntervalReduction def LocalizedHaarUpperBound:Prop := ∀ (d:ℕ) (G:(Fin d → Circle) → ℝ) (w:Fin d → ℤ), Continuous G → (∀ z,G z ∈ Set.Icc 0 1) → w ≠ 0 → (∀ z,(∏ j,z j ^ w j) ∉ window → G z = 0) → haarWeightedCount G ≤ (1 / 3:ℝ) * (∫ z,G z ∂torusHaar (Fin d)) ^ 2 theorem dense_interval_of_localized_haar (hgeo:LocalizedHaarUpperBound) : DenseIntervalUpperBound (1 / 3):=by intro C hC ε hε let D:=10 * (64 * C) ^ 2 have hD:0 < D:=by dsimp [D]; positivity let δ:=min 1 (ε / D) have hδ:0 < δ:=lt_min (by norm_num) (div_pos hε hD) have hδ1:δ ≤ 1:=min_le_left _ _ have hδD:δ * D ≤ ε:=(le_div_iff₀ hD).mp (min_le_right _ _) obtain ⟨C0,Q,R,hmodel⟩:=exists_integer_haar_model hδ refine ⟨Q + 2, ?_⟩ intro L A hsize hA hLC have hcard:A.card ≤ L + 1:=by have h:=Finset.card_le_card hA have hc:(Finset.Icc (0:ℤ) L).card = L + 1:=by rw [Int.card_Icc]; omega rwa [hc] at h have hL:0 < L:=by omega obtain ⟨q,hprime,hqL,hqhi⟩:=Nat.exists_prime_lt_and_le_two_mul (32 * L) (by omega) let:Fact q.Prime:=⟨hprime⟩ let:NeZero q:=⟨hprime.ne_zero⟩ have hqQ:Q < q:=by omega have hq:(0:ℝ) < q:=Nat.cast_pos.mpr hprime.pos obtain ⟨d,_,ls,G,w,hw,_,_,hGl,hGr,hGs,hm,hc⟩ := hmodel q hqQ L hqL A (fun x hx => Finset.mem_Icc.mp (hA hx)) let a:ℝ:=A.card let mass:ℝ:=∫ z,G z ∂torusHaar (Fin d) have hm0:0 ≤ mass:=integral_nonneg (fun z => (hGr z).1) have ha0:0 ≤ a / q:=div_nonneg (Nat.cast_nonneg _) hq.le have ha1:a / q ≤ 1:=by apply (div_le_iff₀ hq).mpr have hNq:A.card ≤ q:=by omega simpa only [one_mul] using (show a ≤ (q:ℝ) by dsimp [a]; exact_mod_cast hNq) have hmub:mass ≤ a / q + 3 * δ:=by change |a / q - mass| ≤ 3 * δ at hm have h:=(abs_le.mp hm).1 linarith have hsharp:=hgeo d G w hGl.continuous hGr hw hGs have hmasssq:mass ^ 2 ≤ (a / q + 3 * δ) ^ 2:=by exact sq_le_sq₀ hm0 (by positivity) |>.mpr hmub have hcount:(integerSolutionCount A:ℝ) / (q:ℝ)^2 ≤ (1 / 3:ℝ) * (a / q)^2 + 10 * δ:=by have hu:=(abs_le.mp hc).2 change haarWeightedCount G ≤ (1 / 3:ℝ) * mass ^ 2 at hsharp nlinarith [sq_nonneg δ,mul_nonneg hδ.le (sub_nonneg.mpr ha1), mul_nonneg hδ.le (sub_nonneg.mpr hδ1)] have hcount':(integerSolutionCount A:ℝ) ≤ (1 / 3:ℝ) * a^2 + 10 * δ * (q:ℝ)^2:=by have h:=(div_le_iff₀ (sq_pos_of_pos hq)).mp hcount calc _ ≤ ((1 / 3:ℝ) * (a / q)^2 + 10 * δ) * (q:ℝ)^2:=h _ = _:=by field_simp have hqbound:(q:ℝ) ≤ (64 * C) * a:=by have hqL':(q:ℝ) ≤ 64 * (L:ℝ):=by exact_mod_cast (show q ≤ 64 * L by omega) change (L:ℝ) ≤ C * a at hLC linarith have hqsq:(q:ℝ)^2 ≤ (64 * C)^2 * a^2:=by have h:=(sq_le_sq₀ hq.le (by positivity:0 ≤ (64 * C) * a)).mpr hqbound nlinarith have herr:10 * δ * (q:ℝ)^2 ≤ ε * a^2:=by calc _ ≤ 10 * δ * ((64 * C)^2 * a^2):=mul_le_mul_of_nonneg_left hqsq (by positivity) _ = (δ * D) * a^2:=by dsimp [D]; ring _ ≤ ε * a^2:=mul_le_mul_of_nonneg_right hδD (sq_nonneg a) change (integerSolutionCount A:ℝ) ≤ (1 / 3 + ε) * a^2 nlinarith theorem conjecture_of_localized_haar (hgeo:LocalizedHaarUpperBound) : Green24.variants.gamma = 1 / 3 := conjecture_of_dense_interval_upper_bound (dense_interval_of_localized_haar hgeo) end Green24Proof.LocalizedHaarReduction private def zz2520:"s09d8"="s09d8":=by decide+kernel end section namespace Green24Proof.SingleCoordinateHaarReduction variable [MeasurableSpace Circle] [BorelSpace Circle] open MeasureTheory open Green24Proof.CyclicTorusHaarDiscrepancy Green24Proof.CyclicTorusPairCounting open Green24Proof.SpatialCircleCutoff Green24Proof.LocalizedHaarReduction def SingleCoordinateHaarUpperBound:Prop := ∀ (d:ℕ) (p:Fin d) (q:ℕ) (H:(Fin d → Circle) → ℝ), 0 < q → Continuous H → (∀ z,H z ∈ Set.Icc 0 1) → (∀ z,z p ^ q ∉ window → H z = 0) → haarWeightedCount H ≤ (1 / 3:ℝ) * (∫ z,H z ∂torusHaar (Fin d)) ^ 2 private def zz1991:"s07c7"="s07c7":=by decide+kernel theorem localized_of_single_coordinate (hgeo:SingleCoordinateHaarUpperBound) : LocalizedHaarUpperBound:=by intro d G w hG hGr hw hGs obtain ⟨p,n,H,hn,hH,hHr,hHs,hm,hc⟩ := TorusCharacterCover.exists_single_coordinate_model G w hG hGr hw window hGs have hpos:0 < n.natAbs:=Int.natAbs_pos.mpr hn have hs:∀ z,z p ^ n.natAbs ∉ window → H z = 0:=by intro z hz apply hHs z exact fun h => hz ((WindowArcGeometry.window_zpow_natAbs_iff (z p) n).mp h) have h:=hgeo d p n.natAbs H hpos hH hHr hs rwa [hm,hc] at h theorem conjecture_of_single_coordinate (hgeo:SingleCoordinateHaarUpperBound) : Green24.variants.gamma = 1 / 3 := conjecture_of_localized_haar (localized_of_single_coordinate hgeo) end Green24Proof.SingleCoordinateHaarReduction private def zz2521:"s09d9"="s09d9":=by decide+kernel end section namespace Green24Proof.GeometricEndpointReduction variable [MeasurableSpace Circle] [BorelSpace Circle] open Green24Proof.RealTorusCoefficientNormalization Green24Proof.CompactTorusProfileComparison open Green24Proof.SingleCoordinateHaarReduction def ContinuousRearrangementInput:Prop := ∀ (d:ℕ) (p:Fin d),RearrangementBound {i:Fin d // i ≠ p} def FiveDivisibleProfileInput:Prop := ∀ (q:ℕ) [NeZero q],5 ∣ q → ∀ g:ZMod q → ℝ, (∀ i,0 ≤ g i) → profileFunctional g ≤ 2 * mass g ^ 2 theorem profile_bound_all_moduli (h5:FiveDivisibleProfileInput) (q:ℕ) [NeZero q] (g:ZMod q → ℝ) (hg:∀ i,0 ≤ g i) : profileFunctional g ≤ 2 * mass g ^ 2:=by by_cases hq:5 ∣ q · exact h5 q hq g hg · exact VerifiedProfileEndpoint.profileFunctional_le q hq g hg theorem single_coordinate_of_rearrangement_and_five (hR:ContinuousRearrangementInput) (h5:FiveDivisibleProfileInput) : SingleCoordinateHaarUpperBound:=by intro d p q F hq hF hr hs let:NeZero q:=⟨Nat.ne_of_gt hq⟩ exact upper_bound_of_profile p (hR d p) F hF hr hs (profile_bound_all_moduli h5 q _ (profileMass_nonneg p q F hr)) private def zz1992:"s07c8"="s07c8":=by decide+kernel theorem conjecture_of_rearrangement_and_five (hR:ContinuousRearrangementInput) (h5:FiveDivisibleProfileInput) : Green24.variants.gamma = 1 / 3 := conjecture_of_single_coordinate (single_coordinate_of_rearrangement_and_five hR h5) end Green24Proof.GeometricEndpointReduction private def zz2522:"s09da"="s09da":=by decide+kernel end section namespace Green24Proof.GeometricEndpointFromProfile variable [MeasurableSpace Circle] [BorelSpace Circle] open Green24Proof.GeometricEndpointReduction Green24Proof.SingleCoordinateHaarReduction theorem continuous_rearrangement_input:ContinuousRearrangementInput := fun _ _ => RealTorusRearrangement.rearrangementBound _ theorem single_coordinate_of_five (h5:FiveDivisibleProfileInput) : SingleCoordinateHaarUpperBound := single_coordinate_of_rearrangement_and_five continuous_rearrangement_input h5 theorem conjecture_of_five (h5:FiveDivisibleProfileInput):Green24.variants.gamma = 1 / 3 := conjecture_of_rearrangement_and_five continuous_rearrangement_input h5 end Green24Proof.GeometricEndpointFromProfile private def zz2523:"s09db"="s09db":=by decide+kernel end section namespace Green24Proof.CompleteEndpoint private def zz1993:"s07c9"="s07c9":=by decide+kernel theorem five_divisible_profile_input:GeometricEndpointReduction.FiveDivisibleProfileInput:=by intro q _ _ g hg exact AllModuliProfileEndpoint.profileFunctional_le q g hg theorem gamma_eq_one_third:Green24.variants.gamma = 1 / 3:=by letI:=CyclicTorusHaarDiscrepancy.circleMeasurableSpace letI:=CyclicTorusHaarDiscrepancy.circleBorelSpace exact GeometricEndpointFromProfile.conjecture_of_five five_divisible_profile_input end Green24Proof.CompleteEndpoint private def zz2524:"s09dc"="s09dc":=by decide+kernel end section namespace Bounty theorem target:fcTypeOfName% "Green24.variants.conjecture":=by exact Green24Proof.CompleteEndpoint.gamma_eq_one_third end Bounty end end namespace Bounty